def get_cluster_config(self, data): """Get the cluster's kube config contents. Common broker function that validates data for 'cluster config' operation and returns the cluster's kube config file contents as a string. Required data: cluster_name Optional data and default values: org_name=None, ovdc_name=None """ required = [ RequestKey.CLUSTER_NAME ] utils.ensure_keys_in_dict(required, data, dict_name='data') defaults = { RequestKey.ORG_NAME: None, RequestKey.OVDC_NAME: None } validated_data = {**defaults, **data} cluster_name = validated_data[RequestKey.CLUSTER_NAME] cluster = get_cluster(self.tenant_client, cluster_name, org_name=validated_data[RequestKey.ORG_NAME], ovdc_name=validated_data[RequestKey.OVDC_NAME]) vapp = VApp(self.tenant_client, href=cluster['vapp_href']) node_names = get_node_names(vapp, NodeType.MASTER) all_results = [] try: for node_name in node_names: LOGGER.debug(f"getting file from node {node_name}") password = vapp.get_admin_password(node_name) vs = vs_utils.get_vsphere(self.sys_admin_client, vapp, vm_name=node_name, logger=LOGGER) vs.connect() moid = vapp.get_vm_moid(node_name) vm = vs.get_vm_by_moid(moid) filename = '/root/.kube/config' result = vs.download_file_from_guest(vm, 'root', password, filename) all_results.append(result) finally: self.logout_sys_admin_client() if len(all_results) == 0 or all_results[0].status_code != requests.codes.ok: # noqa: E501 raise ClusterOperationError("Couldn't get cluster configuration") return all_results[0].content.decode()
def run(ctx, vapp_name, vm_name, vc_host, vc_user, vc_password, guest_user, guest_password, command, args): try: client = ctx.obj['client'] vdc_href = ctx.obj['profiles'].get('vdc_href') vdc = VDC(client, href=vdc_href) vapp_resource = vdc.get_vapp(vapp_name) va = VApp(client, resource=vapp_resource) vs = VSphere(vc_host, vc_user, vc_password) moid = va.get_vm_moid(vm_name) vs.connect() vm = vs.get_vm_by_moid(moid) result = vs.execute_program_in_guest(vm, guest_user, guest_password, command, args, True) click.secho('exit_code=%s' % result) except Exception as e: stderr(e, ctx)
def upload(ctx, vapp_name, vm_name, vc_host, vc_user, vc_password, guest_user, guest_password, input, output): try: client = ctx.obj['client'] vdc_href = ctx.obj['profiles'].get('vdc_href') vdc = VDC(client, href=vdc_href) vapp_resource = vdc.get_vapp(vapp_name) va = VApp(client, resource=vapp_resource) vs = VSphere(vc_host, vc_user, vc_password) moid = va.get_vm_moid(vm_name) vs.connect() vm = vs.get_vm_by_moid(moid) data = input.read() result = vs.upload_file_to_guest(vm, guest_user, guest_password, data, output) click.secho('result=%s' % result) except Exception as e: stderr(e, ctx)
def download(ctx, vapp_name, vm_name, vc_host, vc_user, vc_password, guest_user, guest_password, source, output): try: client = ctx.obj['client'] vdc_href = ctx.obj['profiles'].get('vdc_href') vdc = VDC(client, vdc_href=vdc_href) vapp_resource = vdc.get_vapp(vapp_name) va = VApp(client, resource=vapp_resource) vs = VSphere(vc_host, vc_user, vc_password) moid = va.get_vm_moid(vm_name) vs.connect() vm = vs.get_vm_by_moid(moid) result = vs.download_file_from_guest(vm, guest_user, guest_password, source) if result.status_code == 200: if output is None: click.secho(result.content) else: output.write(result.content) else: raise Exception(result.content) except Exception as e: stderr(e, ctx)
def create_template(ctx, config, client, org, vdc_resource, catalog, no_capture, template): ctx.obj = {} ctx.obj['client'] = client try: source_ova_item = org.get_catalog_item(config['broker']['catalog'], template['source_ova_name']) except Exception: source_ova_item = upload_source_ova(config, client, org, template) click.secho('Find source ova \'%s\': %s' % (template['source_ova_name'], bool_to_msg(source_ova_item is not None))) if source_ova_item is None: return None item_id = source_ova_item.get('id') flag = False while True: q = client.get_typed_query( 'adminCatalogItem', query_result_format=QueryResultFormat.ID_RECORDS, qfilter='id==%s' % item_id) records = list(q.execute()) if records[0].get('status') == 'RESOLVED': if flag: click.secho('done', fg='blue') break else: if flag: click.secho('.', nl=False, fg='green') else: click.secho('Waiting for upload to complete...', nl=False, fg='green') flag = True time.sleep(5) vdc = VDC(client, resource=vdc_resource) try: vapp_resource = vdc.get_vapp(template['temp_vapp']) except Exception: vapp_resource = None if vapp_resource is None: click.secho('Creating vApp template \'%s\'' % template['temp_vapp'], fg='green') init_script = get_data_file('init-%s.sh' % template['name']) vapp_resource = vdc.instantiate_vapp( template['temp_vapp'], catalog.get('name'), template['source_ova_name'], network=config['broker']['network'], fence_mode='bridged', ip_allocation_mode=config['broker']['ip_allocation_mode'], deploy=True, power_on=True, memory=template['mem'], cpu=template['cpu'], password=None, cust_script=init_script, accept_all_eulas=True, vm_name=template['temp_vapp'], hostname=template['temp_vapp'], storage_profile=config['broker']['storage_profile']) stdout(vapp_resource.Tasks.Task[0], ctx) vapp = VApp(client, resource=vapp_resource) vapp.reload() vs = get_vsphere(config, vapp, template['temp_vapp']) vs.connect() moid = vapp.get_vm_moid(template['temp_vapp']) vm = vs.get_vm_by_moid(moid) vs.wait_until_tools_ready(vm, sleep=5, callback=wait_for_tools_ready_callback) click.secho('Customizing vApp template \'%s\'' % template['temp_vapp'], fg='green') vapp.reload() password_auto = vapp.get_admin_password(template['temp_vapp']) cust_script = get_data_file('cust-%s.sh' % template['name']) result = vs.execute_script_in_guest( vm, 'root', password_auto, cust_script, target_file=None, wait_for_completion=True, wait_time=10, get_output=True, delete_script=True, callback=wait_for_guest_execution_callback) click.secho('Result: %s' % result, fg='green') result_stdout = result[1].content.decode() result_stderr = result[2].content.decode() click.secho('stderr:') if len(result_stderr) > 0: click.secho(result_stderr, err=True) click.secho('stdout:') if len(result_stdout) > 0: click.secho(result_stdout, err=False) if result[0] != 0: raise Exception('Failed customizing VM') if not no_capture: capture_as_template(ctx, config, vapp_resource, org, catalog, template) if template['cleanup']: click.secho('Deleting vApp template \'%s\' ' % template['temp_vapp'], fg='green') vdc.reload() task = vdc.delete_vapp(template['temp_vapp'], force=True) stdout(task, ctx)