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
Beispiel #2
0
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)
Beispiel #5
0
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