コード例 #1
0
 def wait_for_ovfenv(self, max_retry=1800, sleep_time=1):
     """
     Wait for cloud-init to copy ovf-env.xml file from provision ISO
     """
     ovf_file_path = os.path.join(conf.get_lib_dir(), OVF_FILE_NAME)
     for retry in range(0, max_retry):
         if os.path.isfile(ovf_file_path):
             try:
                 ovf_env = OvfEnv(fileutil.read_file(ovf_file_path))
                 self.handle_provision_guest_agent(ovf_env.provision_guest_agent)
                 return
             except ProtocolError as pe:
                 raise ProvisionError("OVF xml could not be parsed "
                                      "[{0}]: {1}".format(ovf_file_path,
                                                          ustr(pe)))
         else:
             if retry < max_retry - 1:
                 logger.info(
                     "Waiting for cloud-init to copy ovf-env.xml to {0} "
                     "[{1} retries remaining, "
                     "sleeping {2}s]".format(ovf_file_path,
                                             max_retry - retry,
                                             sleep_time))
                 if not self.validate_cloud_init():
                     logger.warn("cloud-init does not appear to be running")
                 time.sleep(sleep_time)
     raise ProvisionError("Giving up, ovf-env.xml was not copied to {0} "
                          "after {1}s".format(ovf_file_path,
                                              max_retry * sleep_time))
コード例 #2
0
    def test_provision_telemetry_fail(self, mock_util, distro_name,
                                         distro_version,
                                         distro_full_name):
        """
        Assert that the agent issues one telemetry message as part of a
        failed provisioning.

         1. Provision
        """
        ph = get_provision_handler(distro_name, distro_version,
                                   distro_full_name)
        ph.report_event = MagicMock()
        ph.reg_ssh_host_key = MagicMock(side_effect=ProvisionError(
            "--unit-test--"))

        mock_osutil = MagicMock()
        mock_osutil.decode_customdata = Mock(return_value="")

        ph.osutil = mock_osutil
        ph.protocol_util.osutil = mock_osutil
        ph.protocol_util.get_protocol_by_file = MagicMock()
        ph.protocol_util.get_protocol = MagicMock()

        conf.get_dvd_mount_point = Mock(return_value=self.tmp_dir)
        ovfenv_file = os.path.join(self.tmp_dir, OVF_FILE_NAME)
        ovfenv_data = load_data("ovf-env.xml")
        fileutil.write_file(ovfenv_file, ovfenv_data)

        ph.run()
        ph.report_event.assert_called_once_with(
            "[ProvisionError] --unit-test--")
コード例 #3
0
    def test_provision_telemetry_fail(self,
                                      mock_util,
                                      distro_name,
                                      distro_version,
                                      distro_full_name, _):
        """
        Assert that the agent issues one telemetry message as part of a
        failed provisioning.

         1. Provision
        """
        ph = get_provision_handler(distro_name, distro_version,
                                   distro_full_name)
        ph.report_event = MagicMock()
        ph.reg_ssh_host_key = MagicMock(side_effect=ProvisionError(
            "--unit-test--"))

        mock_osutil = MagicMock()
        mock_osutil.decode_customdata = Mock(return_value="")

        ph.osutil = mock_osutil
        ph.protocol_util.osutil = mock_osutil
        ph.protocol_util.get_protocol = MagicMock()

        conf.get_dvd_mount_point = Mock(return_value=self.tmp_dir)
        ovfenv_file = os.path.join(self.tmp_dir, OVF_FILE_NAME)
        ovfenv_data = load_data("ovf-env.xml")
        fileutil.write_file(ovfenv_file, ovfenv_data)

        ph.run()
        positional_args, kw_args = ph.report_event.call_args_list[0]
        self.assertTrue(re.match(r'Provisioning failed: \[ProvisionError\] --unit-test-- \(\d+\.\d+s\)', positional_args[0]) is not None)
コード例 #4
0
 def wait_for_ssh_host_key(self, max_retry=1800, sleep_time=1):
     """
     Wait for cloud-init to generate ssh host key
     """
     keypair_type = conf.get_ssh_host_keypair_type()
     path = conf.get_ssh_key_public_path()
     for retry in range(0, max_retry):
         if os.path.isfile(path):
             logger.info("ssh host key found at: {0}".format(path))
             try:
                 thumbprint = self.get_ssh_host_key_thumbprint(chk_err=False)
                 logger.info("Thumbprint obtained from : {0}".format(path))
                 return thumbprint
             except ProvisionError:
                 logger.warn("Could not get thumbprint from {0}".format(path))
         if retry < max_retry - 1:
             logger.info("Waiting for ssh host key be generated at {0} "
                         "[{1} attempts remaining, "
                         "sleeping {2}s]".format(path,
                                                 max_retry - retry,
                                                 sleep_time))
             if not self.validate_cloud_init():
                 logger.warn("cloud-init does not appear to be running")
             time.sleep(sleep_time)
     raise ProvisionError("Giving up, ssh host key was not found at {0} "
                          "after {1}s".format(path,
                                              max_retry * sleep_time))
コード例 #5
0
ファイル: default.py プロジェクト: jgreat/WALinuxAgent
    def run(self):
        # if provisioning is already done, return
        provisioned = os.path.join(conf.get_lib_dir(), "provisioned")
        if os.path.isfile(provisioned):
            logger.info("Provisioning already completed, skipping.")
            return

        thumbprint = None
        # If provision is not enabled, report ready and then return
        if not conf.get_provision_enabled():
            logger.info("Provisioning is disabled, skipping.")
        else:
            logger.info("Running default provisioning handler")
            try:
                if not self.validate_cloud_init(is_expected=False):
                    raise ProvisionError("cloud-init appears to be running, "
                                         "this is not expected, cannot continue")
                logger.info("Copying ovf-env.xml")
                ovf_env = self.protocol_util.copy_ovf_env()
                self.protocol_util.get_protocol_by_file()
                self.report_not_ready("Provisioning", "Starting")
                logger.info("Starting provisioning")
                self.provision(ovf_env)
                thumbprint = self.reg_ssh_host_key()
                self.osutil.restart_ssh_service()
                self.report_event("Provision succeed", is_success=True)
            except (ProtocolError, ProvisionError) as e:
                self.report_not_ready("ProvisioningFailed", ustr(e))
                self.report_event(ustr(e))
                logger.error("Provisioning failed: {0}", ustr(e))
                return
        # write out provisioned file and report Ready
        fileutil.write_file(provisioned, "")
        self.report_ready(thumbprint)
        logger.info("Provisioning complete")
コード例 #6
0
ファイル: default.py プロジェクト: catwarrior/WALinuxAgent
 def get_ssh_host_key_thumbprint(self, chk_err=True):
     cmd = "ssh-keygen -lf {0}".format(conf.get_ssh_key_public_path())
     ret = shellutil.run_get_output(cmd, chk_err=chk_err)
     if ret[0] == 0:
         return ret[1].rstrip().split()[1].replace(':', '')
     else:
         raise ProvisionError(("Failed to generate ssh host key: "
                               "ret={0}, out= {1}").format(ret[0], ret[1]))
コード例 #7
0
ファイル: default.py プロジェクト: caphrim007/WALinuxAgent
 def get_ssh_host_key_thumbprint(self, keypair_type):
     cmd = "ssh-keygen -lf /etc/ssh/ssh_host_{0}_key.pub".format(keypair_type)
     ret = shellutil.run_get_output(cmd)
     if ret[0] == 0:
         return ret[1].rstrip().split()[1].replace(':', '')
     else:
         raise ProvisionError(("Failed to generate ssh host key: "
                               "ret={0}, out= {1}").format(ret[0], ret[1]))
コード例 #8
0
ファイル: default.py プロジェクト: andyzhangx/WALinuxAgent
    def run(self):
        if not conf.get_provision_enabled():
            logger.info("Provisioning is disabled, skipping.")
            self.write_provisioned()
            self.report_ready()
            return

        try:
            utc_start = datetime.utcnow()
            thumbprint = None

            if self.is_provisioned():
                logger.info("Provisioning already completed, skipping.")
                return

            logger.info("Running default provisioning handler")

            if not self.validate_cloud_init(is_expected=False):
                raise ProvisionError("cloud-init appears to be running, "
                                     "this is not expected, cannot continue")

            logger.info("Copying ovf-env.xml")
            ovf_env = self.protocol_util.copy_ovf_env()

            self.protocol_util.get_protocol(by_file=True)
            self.report_not_ready("Provisioning", "Starting")
            logger.info("Starting provisioning")

            self.provision(ovf_env)

            thumbprint = self.reg_ssh_host_key()
            self.osutil.restart_ssh_service()

            self.write_provisioned()

            self.report_event("Provisioning succeeded ({0}s)".format(
                self._get_uptime_seconds()),
                              is_success=True,
                              duration=elapsed_milliseconds(utc_start))

            self.report_event(message=ovf_env.provision_guest_agent,
                              is_success=True,
                              duration=0,
                              operation=WALAEventOperation.ProvisionGuestAgent)

            self.report_ready(thumbprint)
            logger.info("Provisioning complete")

        except (ProtocolError, ProvisionError) as e:
            self.report_not_ready("ProvisioningFailed", ustr(e))
            self.report_event(ustr(e))
            logger.error("Provisioning failed: {0}", ustr(e))
            return
コード例 #9
0
    def run(self):
        if not conf.get_provision_enabled():
            logger.info("Provisioning is disabled, skipping.")
            self.write_provisioned()
            self.report_ready()
            return

        try:
            utc_start = datetime.utcnow()
            thumbprint = None  # pylint: disable=W0612

            if self.check_provisioned_file():
                logger.info("Provisioning already completed, skipping.")
                return

            logger.info("Running default provisioning handler")

            if cloud_init_is_enabled():
                raise ProvisionError(
                    "cloud-init appears to be installed and enabled, "
                    "this is not expected, cannot continue")

            logger.info("Copying ovf-env.xml")
            ovf_env = self.protocol_util.copy_ovf_env()

            self.protocol_util.get_protocol()  # Trigger protocol detection
            self.report_not_ready("Provisioning", "Starting")
            logger.info("Starting provisioning")

            self.provision(ovf_env)

            thumbprint = self.reg_ssh_host_key()
            self.osutil.restart_ssh_service()

            self.write_provisioned()

            self.report_event("Provisioning succeeded ({0}s)".format(
                self._get_uptime_seconds()),
                              is_success=True,
                              duration=elapsed_milliseconds(utc_start))

            self.handle_provision_guest_agent(ovf_env.provision_guest_agent)

            self.report_ready()
            logger.info("Provisioning complete")

        except (ProtocolError, ProvisionError) as e:
            msg = "Provisioning failed: {0} ({1}s)".format(
                ustr(e), self._get_uptime_seconds())
            logger.error(msg)
            self.report_not_ready("ProvisioningFailed", ustr(e))
            self.report_event(msg, is_success=False)
            return
コード例 #10
0
ファイル: ubuntu.py プロジェクト: longlimsft/WALinuxAgent
 def wait_for_ssh_host_key(self, max_retry=60):
     """
     Wait for cloud-init to generate ssh host key
     """
     keypair_type = conf.get_ssh_host_keypair_type()
     path = '/etc/ssh/ssh_host_{0}_key.pub'.format(keypair_type)
     for retry in range(0, max_retry):
         if os.path.isfile(path):
             return self.get_ssh_host_key_thumbprint(keypair_type)
         if retry < max_retry - 1:
             logger.info("Wait for ssh host key be generated: {0}", path)
             time.sleep(5)
     raise ProvisionError("ssh host key is not generated.")
コード例 #11
0
ファイル: ubuntu.py プロジェクト: longlimsft/WALinuxAgent
 def wait_for_ovfenv(self, max_retry=60):
     """
     Wait for cloud-init to copy ovf-env.xml file from provision ISO
     """
     for retry in range(0, max_retry):
         try:
             self.protocol_util.get_ovf_env()
             return
         except ProtocolError:
             if retry < max_retry - 1:
                 logger.info("Wait for cloud-init to copy ovf-env.xml")
                 time.sleep(5)
     raise ProvisionError("ovf-env.xml is not copied")
コード例 #12
0
ファイル: default.py プロジェクト: catwarrior/WALinuxAgent
    def run(self):
        # If provision is not enabled, report ready and then return
        if not conf.get_provision_enabled():
            logger.info("Provisioning is disabled, skipping.")
            return

        try:
            utc_start = datetime.utcnow()
            thumbprint = None

            # if provisioning is already done, return
            if self.is_provisioned():
                logger.info("Provisioning already completed, skipping.")
                return

            logger.info("Running default provisioning handler")

            if not self.validate_cloud_init(is_expected=False):
                raise ProvisionError("cloud-init appears to be running, "
                                     "this is not expected, cannot continue")

            logger.info("Copying ovf-env.xml")
            ovf_env = self.protocol_util.copy_ovf_env()

            self.protocol_util.get_protocol_by_file()
            self.report_not_ready("Provisioning", "Starting")
            logger.info("Starting provisioning")

            self.provision(ovf_env)

            thumbprint = self.reg_ssh_host_key()
            self.osutil.restart_ssh_service()

            # write out provisioned file and report Ready
            self.write_provisioned()

            self.report_event("Provision succeed",
                              is_success=True,
                              duration=elapsed_milliseconds(utc_start))

            self.report_ready(thumbprint)
            logger.info("Provisioning complete")

        except (ProtocolError, ProvisionError) as e:
            self.report_not_ready("ProvisioningFailed", ustr(e))
            self.report_event(ustr(e))
            logger.error("Provisioning failed: {0}", ustr(e))
            return
コード例 #13
0
ファイル: default.py プロジェクト: catwarrior/WALinuxAgent
    def provision(self, ovfenv):
        logger.info("Handle ovf-env.xml.")
        try:
            logger.info("Set hostname [{0}]".format(ovfenv.hostname))
            self.osutil.set_hostname(ovfenv.hostname)

            logger.info("Publish hostname [{0}]".format(ovfenv.hostname))
            self.osutil.publish_hostname(ovfenv.hostname)

            self.config_user_account(ovfenv)

            self.save_customdata(ovfenv)

            if conf.get_delete_root_password():
                self.osutil.del_root_password()

        except OSUtilError as e:
            raise ProvisionError("Failed to provision: {0}".format(ustr(e)))
コード例 #14
0
 def wait_for_ssh_host_key(self, max_retry=60):
     """
     Wait for cloud-init to generate ssh host key
     """
     keypair_type = conf.get_ssh_host_keypair_type()
     path = '/etc/ssh/ssh_host_{0}_key.pub'.format(keypair_type)
     for retry in range(0, max_retry):
         if os.path.isfile(path):
             logger.info("ssh host key found at: {0}".format(path))
             try:
                 thumbprint = self.get_ssh_host_key_thumbprint(keypair_type)
                 logger.info("Thumbprint obtained from : {0}".format(path))
                 return thumbprint
             except ProvisionError:
                 logger.warn("Could not get thumbprint from {0}".format(path))
         if retry < max_retry - 1:
             logger.info("Wait for ssh host key be generated: {0}".format(path))
             time.sleep(5)
     raise ProvisionError("ssh host key is not generated.")