def create_new_deployment( runner: Runner, deployment_arg: str, image_name: str, expose: PortMapping, add_custom_nameserver: bool ) -> Tuple[str, str]: """ Create a new Deployment, return its name and Kubernetes label. """ span = runner.span() run_id = runner.session_id runner.show( "Starting network proxy to cluster using " "new Deployment {}".format(deployment_arg) ) def remove_existing_deployment(quiet=False): if not quiet: runner.show("Cleaning up Deployment {}".format(deployment_arg)) runner.check_call( runner.kubectl( "delete", "--ignore-not-found", "svc,deploy", "--selector=telepresence=" + run_id, ) ) runner.add_cleanup("Delete new deployment", remove_existing_deployment) remove_existing_deployment(quiet=True) command = [ "run", # This will result in using Deployment: "--restart=Always", "--limits=cpu=100m,memory=256Mi", "--requests=cpu=25m,memory=64Mi", deployment_arg, "--image=" + image_name, "--labels=telepresence=" + run_id, ] # Provide a stable argument ordering. Reverse it because that happens to # make some current tests happy but in the long run that's totally # arbitrary and doesn't need to be maintained. See issue 494. for port in sorted(expose.remote(), reverse=True): command.append("--port={}".format(port)) if expose.remote(): command.append("--expose") # If we're on local VM we need to use different nameserver to prevent # infinite loops caused by sshuttle: if add_custom_nameserver: command.append( "--env=TELEPRESENCE_NAMESERVER=" + get_alternate_nameserver() ) try: runner.check_call(runner.kubectl(command)) except CalledProcessError as exc: raise runner.fail( "Failed to create deployment {}:\n{}".format( deployment_arg, exc.stderr ) ) span.end() return deployment_arg, run_id
def create_new_deployment( runner: Runner, deployment_arg: str, expose: PortMapping, custom_nameserver: Optional[str], service_account: str, ) -> Tuple[str, str]: """ Create a new Deployment, return its name and Kubernetes label. """ span = runner.span() run_id = runner.session_id runner.show( "Starting network proxy to cluster using " "new Deployment {}".format(deployment_arg) ) def remove_existing_deployment(quiet=False): if not quiet: runner.show("Cleaning up Deployment {}".format(deployment_arg)) runner.check_call( runner.kubectl( "delete", "--ignore-not-found", "svc,deploy", "--selector=telepresence=" + run_id, ) ) runner.add_cleanup("Delete new deployment", remove_existing_deployment) remove_existing_deployment(quiet=True) # Define the deployment as yaml env = {} if custom_nameserver: # If we're on local VM we need to use different nameserver to prevent # infinite loops caused by sshuttle: env["TELEPRESENCE_NAMESERVER"] = custom_nameserver # Create the deployment via yaml deployment_yaml = _get_deployment_yaml( deployment_arg, run_id, get_image_name(runner, expose), service_account, env, ) try: runner.check_call( runner.kubectl("create", "-f", "-"), input=deployment_yaml.encode("utf-8") ) except CalledProcessError as exc: raise runner.fail( "Failed to create deployment {}:\n{}".format( deployment_arg, exc.stderr ) ) # Expose the deployment with a service if expose.remote(): command = [ "expose", "deployment", deployment_arg, ] # Provide a stable argument ordering. Reverse it because that # happens to make some current tests happy but in the long run # that's totally arbitrary and doesn't need to be maintained. # See issue 494. for port in sorted(expose.remote(), reverse=True): command.append("--port={}".format(port)) try: runner.check_call(runner.kubectl(*command)) except CalledProcessError as exc: raise runner.fail( "Failed to expose deployment {}:\n{}".format( deployment_arg, exc.stderr ) ) span.end() return deployment_arg, run_id