def teardown_minikube(args): """Delete the VM used for minikube.""" credentials = GoogleCredentials.get_application_default() gce = discovery.build("compute", "v1", credentials=credentials) instances = gce.instances() request = instances.delete( project=args.project, zone=args.zone, instance=args.vm_name) response = request.execute() op_id = response.get("name") final_op = vm_util.wait_for_operation(gce, args.project, args.zone, op_id) logging.info("Final result for delete operation: %s", final_op) if final_op.get("status") != "DONE": raise ValueError("Delete operation has status %s", final_op.get("status")) if final_op.get("error"): message = "Delete operation resulted in error %s".format( final_op.get("error")) logging.error(message) raise ValueError(message) # Ensure the disk is deleted. The disk should be auto-deleted with # the VM but just in case we issue a delete request anyway. disks = gce.disks() request = disks.delete( project=args.project, zone=args.zone, disk=args.vm_name) response = None try: response = request.execute() except errors.HttpError as e: if not e.content: raise content = json.loads(e.content) if content.get("error", {}).get("code") == requests.codes.NOT_FOUND: logging.info("Disk %s in zone %s in project %s already deleted.", args.vm_name, args.zone, args.project) else: raise if response: logging.info("Waiting for disk to be deleted.") op_id = response.get("name") final_op = vm_util.wait_for_operation(gce, args.project, args.zone, op_id) logging.info("Final result for disk delete operation: %s", final_op) if final_op.get("status") != "DONE": raise ValueError("Disk delete operation has status %s", final_op.get("status")) if final_op.get("error"): message = "Delete disk operation resulted in error %s".format( final_op.get("error")) logging.error(message) raise ValueError(message)
def deploy_minikube(args): """Create a VM and setup minikube.""" credentials = GoogleCredentials.get_application_default() gce = discovery.build("compute", "v1", credentials=credentials) instances = gce.instances() body = { "name": args.vm_name, "machineType": "zones/{0}/machineTypes/n1-standard-16".format(args.zone), "disks": [ { "boot": True, "initializeParams": { "sourceImage": "projects/ubuntu-os-cloud/global/images/family/ubuntu-1604-lts", "diskSizeGb": 100, "autoDelete": True, }, }, ], "networkInterfaces": [ { "accessConfigs": [ { "name": "external-nat", "type": "ONE_TO_ONE_NAT", }, ], "network": "global/networks/default", }, ], } request = instances.insert(project=args.project, zone=args.zone, body=body) response = None try: response = request.execute() print("done") except errors.HttpError as e: if not e.content: raise content = json.loads(e.content) if content.get("error", {}).get("code") == requests.codes.CONFLICT: # We don't want to keep going so we reraise the error after logging # a helpful error message. logging.error( "Either the VM or the disk %s already exists in zone " "%s in project %s ", args.vm_name, args.zone, args.project) raise else: raise op_id = response.get("name") final_op = vm_util.wait_for_operation(gce, args.project, args.zone, op_id) logging.info("Final result for insert operation: %s", final_op) if final_op.get("status") != "DONE": raise ValueError("Insert operation has status %s", final_op.get("status")) if final_op.get("error"): message = "Insert operation resulted in error %s".format( final_op.get("error")) logging.error(message) raise ValueError(message) # Locate the install minikube script. install_script = os.path.join(os.path.dirname(__file__), "install_minikube.sh") if not os.path.exists(install_script): logging.error("Could not find minikube install script: %s", install_script) vm_util.wait_for_vm(args.project, args.zone, args.vm_name) vm_util.execute_script(args.project, args.zone, args.vm_name, install_script) # Copy the .kube and .minikube files to test_dir target = "~/.kube" full_target = "{0}:{1}".format(args.vm_name, target) logging.info("Copying %s to %s", target, args.test_dir) util.run([ "gcloud", "compute", "--project=" + args.project, "scp", "--recurse", full_target, args.test_dir, "--zone=" + args.zone ]) # The .minikube directory contains some really large ISO and other files that we don't need; so we # only copy the files we need. minikube_dir = os.path.join(args.test_dir, ".minikube") if not os.path.exists(minikube_dir): os.makedirs(minikube_dir) for target in ["~/.minikube/*.crt", "~/.minikube/client.key"]: full_target = "{0}:{1}".format(args.vm_name, target) logging.info("Copying %s to %s", target, minikube_dir) util.run([ "gcloud", "compute", "--project=" + args.project, "scp", "--recurse", full_target, minikube_dir, "--zone=" + args.zone ]) config_path = os.path.join(args.test_dir, ".kube", "config") modify_minikube_config(config_path, minikube_dir)