def execute_script_in_nodes(vapp, node_names, script, check_tools=True, wait=True): all_results = [] sys_admin_client = None try: sys_admin_client = vcd_utils.get_sys_admin_client() for node_name in node_names: LOGGER.debug(f"will try to execute script on {node_name}:\n" f"{script}") vs = vs_utils.get_vsphere(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) password = vapp.get_admin_password(node_name) if check_tools: LOGGER.debug(f"waiting for tools on {node_name}") vs.wait_until_tools_ready( vm, sleep=5, callback=_wait_for_tools_ready_callback) _wait_until_ready_to_exec(vs, vm, password) LOGGER.debug(f"about to execute script on {node_name} " f"(vm={vm}), wait={wait}") if wait: result = \ vs.execute_script_in_guest( vm, 'root', password, script, target_file=None, wait_for_completion=True, wait_time=10, get_output=True, delete_script=True, callback=_wait_for_guest_execution_callback) result_stdout = result[1].content.decode() result_stderr = result[2].content.decode() else: result = [ vs.execute_program_in_guest(vm, 'root', password, script, wait_for_completion=False, get_output=False) ] result_stdout = '' result_stderr = '' LOGGER.debug(result[0]) LOGGER.debug(result_stderr) LOGGER.debug(result_stdout) all_results.append(result) finally: if sys_admin_client: sys_admin_client.logout() return all_results
def get_file_from_nodes(config, vapp, password, file_name, nodes, check_tools=True): all_results = [] sys_admin_client = None try: sys_admin_client = get_sys_admin_client() for node in nodes: LOGGER.debug(f"getting file from node {node.get('name')}") vs = get_vsphere(sys_admin_client, vapp, vm_name=node.get('name'), logger=LOGGER) vs.connect() moid = vapp.get_vm_moid(node.get('name')) vm = vs.get_vm_by_moid(moid) if check_tools: vs.wait_until_tools_ready( vm, sleep=5, callback=wait_for_tools_ready_callback) wait_until_ready_to_exec(vs, vm, password) result = vs.download_file_from_guest(vm, 'root', password, file_name) all_results.append(result) finally: if sys_admin_client: sys_admin_client.logout() return all_results
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 _customize_vm(self, vapp, vm_name): """Customize a vm in a VApp using customization script. :param pyvcloud.vcd.vapp.VApp vapp: :param str vm_name: :raises Exception: if unable to execute the customization script in the vm. """ msg = f"Customizing vApp '{self.temp_vapp_name}', vm '{vm_name}'" if self.msg_update_callback: self.msg_update_callback.general(msg) if self.logger: self.logger.info(msg) cust_sctipt_filepath = get_local_script_filepath( self.template_name, self.template_revision, ScriptFile.CUST) cust_script = read_data_file( cust_sctipt_filepath, logger=self.logger, msg_update_callback=self.msg_update_callback) vs = get_vsphere(self.sys_admin_client, vapp, vm_name, logger=self.logger) callback = vgr_callback( prepend_msg='Waiting for guest tools, status: "', logger=self.logger, msg_update_callback=self.msg_update_callback) wait_until_tools_ready(vapp, vm_name, vs, callback=callback) password_auto = vapp.get_admin_password(vm_name) try: result = vs.execute_script_in_guest( vs.get_vm_by_moid(vapp.get_vm_moid(vm_name)), 'root', password_auto, cust_script, target_file=None, wait_for_completion=True, wait_time=10, get_output=True, delete_script=True, callback=vgr_callback( logger=self.logger, msg_update_callback=self.msg_update_callback)) except Exception as err: # TODO() replace raw exception with specific exception # unsure all errors execute_script_in_guest can result in # Docker TLS handshake timeout can occur when internet is slow if self.msg_update_callback: self.msg_update_callback.error( "Failed VM customization. Check CSE install log") if self.logger: self.logger.error(f"Failed VM customization with error: {err}", exc_info=True) raise if len(result) > 0: msg = f'Result: {result}' if self.msg_update_callback: self.msg_update_callback.general_no_color(msg) if self.logger: self.logger.debug(msg) result_stdout = result[1].content.decode() result_stderr = result[2].content.decode() msg = 'stderr:' if self.msg_update_callback: self.msg_update_callback.general_no_color(msg) if self.logger: self.logger.debug(msg) if len(result_stderr) > 0: if self.msg_update_callback: self.msg_update_callback.general_no_color(result_stderr) if self.logger: self.logger.debug(result_stderr) msg = 'stdout:' if self.msg_update_callback: self.msg_update_callback.general_no_color(msg) if self.logger: self.logger.debug(msg) if len(result_stdout) > 0: if self.msg_update_callback: self.msg_update_callback.general_no_color(result_stdout) if self.logger: self.logger.debug(result_stdout) if len(result) == 0 or result[0] != 0: msg = "Failed VM customization" if self.msg_update_callback: self.msg_update_callback.error(f"{msg}. Please check logs.") if self.logger: self.logger.error( f"{msg}\nResult start===\n{result}\n===Result end", exc_info=True) # TODO: replace raw exception with specific exception raise Exception(f"{msg}; Result: {result}") # Do not reboot VM after customization. Reboot will generate a new # machine-id, and once we capture the VM, all VMs deployed from the # template will have the same machine-id, which can lead to # unpredictable behavior msg = f"Customized vApp '{self.temp_vapp_name}', vm '{vm_name}'" if self.msg_update_callback: self.msg_update_callback.general(msg) if self.logger: self.logger.info(msg)
def execute_script_in_nodes(config, vapp, password, script, nodes, check_tools=True, wait=True): all_results = [] sys_admin_client = None try: sys_admin_client = get_sys_admin_client() for node in nodes: if 'chpasswd' in script: p = re.compile(':.*\"') debug_script = p.sub(':***\"', script) else: debug_script = script LOGGER.debug(f"will try to execute script on {node.get('name')}:\n" f"{debug_script}") vs = get_vsphere(sys_admin_client, vapp, vm_name=node.get('name'), logger=LOGGER) vs.connect() moid = vapp.get_vm_moid(node.get('name')) vm = vs.get_vm_by_moid(moid) if check_tools: LOGGER.debug(f"waiting for tools on {node.get('name')}") vs.wait_until_tools_ready( vm, sleep=5, callback=wait_for_tools_ready_callback) wait_until_ready_to_exec(vs, vm, password) LOGGER.debug(f"about to execute script on {node.get('name')} " f"(vm={vm}), wait={wait}") if wait: result = vs.execute_script_in_guest( vm, 'root', password, script, target_file=None, wait_for_completion=True, wait_time=10, get_output=True, delete_script=True, callback=wait_for_guest_execution_callback) result_stdout = result[1].content.decode() result_stderr = result[2].content.decode() else: result = [ vs.execute_program_in_guest(vm, 'root', password, script, wait_for_completion=False, get_output=False) ] result_stdout = '' result_stderr = '' LOGGER.debug(result[0]) LOGGER.debug(result_stderr) LOGGER.debug(result_stdout) all_results.append(result) finally: if sys_admin_client: sys_admin_client.logout() return all_results