Exemple #1
0
    def add_bootstrap_to_no_proxy(self):
        """Finds bootstrap node IP and adds it to the current setting of
        no-proxy in the juju env.
        """
        out = utils.get_command_output(
            "{0} juju status".format(
                self.config.juju_home()),
            timeout=None,
            user_sudo=True)
        if out['status'] != 0:
            log.debug("error from status: {}".format(out))
            raise Exception("Problem with juju status.")
        try:
            status = yaml.load(out['output'])
            bootstrap_dns_name = status['machines']['0']['dns-name']
        except:
            utils.pollinate(self.session_id, 'EJ')
            log.exception("Error parsing yaml from juju status")
            raise Exception("Problem getting bootstrap machine DNS name")

        # first attempt to get directly, then use juju run:
        try:
            bootstrap_ip = socket.gethostbyname(bootstrap_dns_name)

        except socket.gaierror as e:
            log.error("Failed to get ip directly: {}".format(e))

            out = utils.get_command_output(
                "{} juju run --machine 0 "
                "'ip -o -4 address show dev juju-br0'".format(
                    self.config.juju_home()))
            if out['status'] != 0:
                log.error("Failed to get ip: {}".format(out))
                raise Exception("Failed to get IP of bootstrap node")
            regex = re.compile("inet\s+(\d+\.\d+\.\d+\.\d+)\/")
            match = re.search(regex, out['output'].rstrip())
            if match:
                bootstrap_ip = match.group(1)
                bootstrap_ip = get_ip_set("{}/24".format(bootstrap_ip))
            else:
                log.error("Failed to get ip: {}".format(out))
                raise Exception("Failed to get IP of bootstrap node")

        out = utils.get_command_output(
            "{} juju get-env no-proxy".format(self.config.juju_home()),
            timeout=None, user_sudo=True)
        if out['status'] != 0:
            log.debug("error from get-env: {}".format(out))
            raise Exception("Problem getting existing no-proxy setting")

        no_proxy = "{},{}".format(
            out['output'].rstrip(), bootstrap_ip)

        out = utils.get_command_output(
            "{} juju set-env no-proxy={}".format(self.config.juju_home(),
                                                 no_proxy),
            timeout=None, user_sudo=True)
        if out['status'] != 0:
            log.debug("error from set-env: {}".format(out))
            raise Exception("Problem setting no-proxy environment")
Exemple #2
0
    def run_configure_script(self):
        "runs configure-landscape, returns output (LDS hostname)"

        ldscreds = self.config.getopt('landscapecreds')
        args = {"bin": self.lscape_configure_bin,
                "admin_email": shlex.quote(ldscreds['admin_email']),
                "admin_name": shlex.quote(ldscreds['admin_name']),
                "sys_email": shlex.quote(ldscreds['system_email']),
                "maas_host": shlex.quote(
                    self.config.getopt('maascreds')['api_host'])}

        cmd = ("{bin} --admin-email {admin_email} "
               "--admin-name {admin_name} "
               "--system-email {sys_email} "
               "--maas-host {maas_host}".format(**args))

        log.debug("Running landscape configure: {}".format(cmd))

        out = utils.get_command_output(cmd, timeout=None)

        if out['status']:
            utils.pollinate(self.session_id, 'ET')
            log.error("Problem with configuring Landscape: {}.".format(out))
            raise Exception("Error configuring Landscape.")

        utils.pollinate(self.session_id, 'DL')

        return out['output'].strip()
    def post_proc(self):
        """ performs additional network configuration for charm """
        svc = self.juju_state.service(self.charm_name)
        unit = svc.unit(self.charm_name)

        if unit.machine_id == '-1':
            return True

        self.ui.status_info_message("Validating network parameters "
                                    "for Neutron")
        utils.remote_cp(
            unit.machine_id,
            src=os.path.join(self.config.tmpl_path, "neutron-network.sh"),
            dst="/tmp/neutron-network.sh",
            juju_home=self.config.juju_home(use_expansion=True))
        utils.remote_run(
            unit.machine_id,
            cmds="sudo chmod +x /tmp/neutron-network.sh",
            juju_home=self.config.juju_home(use_expansion=True))
        utils.remote_run(
            unit.machine_id,
            cmds="sudo /tmp/neutron-network.sh {}".format(
                self.config.getopt('install_type')),
            juju_home=self.config.juju_home(use_expansion=True))

        session_id = self.config.getopt('session_id')
        if self.config.is_single():
            utils.pollinate(session_id, 'DS')
        elif self.config.is_multi():
            utils.pollinate(session_id, 'DM')

        self.ui.status_info_message("Done.")
        return False
Exemple #4
0
    def add_bootstrap_to_no_proxy(self):
        """Finds bootstrap node IP and adds it to the current setting of
        no-proxy in the juju env.
        """
        out = utils.get_command_output(
            "{0} juju status".format(
                self.config.juju_home()),
            timeout=None,
            user_sudo=True)
        if out['status'] != 0:
            log.debug("error from status: {}".format(out))
            raise Exception("Problem with juju status.")
        try:
            status = yaml.load(out['output'])
            bootstrap_dns_name = status['machines']['0']['dns-name']
        except:
            utils.pollinate(self.session_id, 'EJ')
            log.exception("Error parsing yaml from juju status")
            raise Exception("Problem getting bootstrap machine DNS name")

        # first attempt to get directly, then use juju run:
        try:
            bootstrap_ip = socket.gethostbyname(bootstrap_dns_name)

        except socket.gaierror as e:
            log.error("Failed to get ip directly: {}".format(e))

            out = utils.get_command_output(
                "{} juju run --machine 0 "
                "'ip -o -4 address show dev juju-br0'".format(
                    self.config.juju_home()))
            if out['status'] != 0:
                log.error("Failed to get ip: {}".format(out))
                raise Exception("Failed to get IP of bootstrap node")
            regex = re.compile("inet\s+(\d+\.\d+\.\d+\.\d+)\/")
            match = re.search(regex, out['output'].rstrip())
            if match:
                bootstrap_ip = match.group(1)
                bootstrap_ip = get_ip_set("{}/24".format(bootstrap_ip))
            else:
                log.error("Failed to get ip: {}".format(out))
                raise Exception("Failed to get IP of bootstrap node")

        out = utils.get_command_output(
            "{} juju get-env no-proxy".format(self.config.juju_home()),
            timeout=None, user_sudo=True)
        if out['status'] != 0:
            log.debug("error from get-env: {}".format(out))
            raise Exception("Problem getting existing no-proxy setting")

        no_proxy = "{},{}".format(
            out['output'].rstrip(), bootstrap_ip)

        out = utils.get_command_output(
            "{} juju set-env no-proxy={}".format(self.config.juju_home(),
                                                 no_proxy),
            timeout=None, user_sudo=True)
        if out['status'] != 0:
            log.debug("error from set-env: {}".format(out))
            raise Exception("Problem setting no-proxy environment")
    def post_proc(self):
        """ performs additional network configuration for charm """
        svc = self.juju_state.service(self.charm_name)
        unit = svc.unit(self.charm_name)

        if unit.machine_id == '-1':
            return True

        self.ui.status_info_message("Validating network parameters "
                                    "for Neutron")
        utils.remote_cp(unit.machine_id,
                        src=os.path.join(self.config.tmpl_path,
                                         "neutron-network.sh"),
                        dst="/tmp/neutron-network.sh",
                        juju_home=self.config.juju_home(use_expansion=True))
        utils.remote_run(unit.machine_id,
                         cmds="sudo chmod +x /tmp/neutron-network.sh",
                         juju_home=self.config.juju_home(use_expansion=True))
        utils.remote_run(unit.machine_id,
                         cmds="sudo /tmp/neutron-network.sh {}".format(
                             self.config.getopt('install_type')),
                         juju_home=self.config.juju_home(use_expansion=True))

        session_id = self.config.getopt('session_id')
        if self.config.is_single():
            utils.pollinate(session_id, 'DS')
        elif self.config.is_multi():
            utils.pollinate(session_id, 'DM')

        self.ui.status_info_message("Done.")
        return False
Exemple #6
0
    def run_configure_script(self):
        "runs configure-landscape, returns output (LDS hostname)"

        ldscreds = self.config.getopt('landscapecreds')
        args = {
            "bin": self.lscape_configure_bin,
            "admin_email": shlex.quote(ldscreds['admin_email']),
            "admin_name": shlex.quote(ldscreds['admin_name']),
            "sys_email": shlex.quote(ldscreds['system_email']),
            "maas_host":
            shlex.quote(self.config.getopt('maascreds')['api_host'])
        }

        cmd = ("{bin} --admin-email {admin_email} "
               "--admin-name {admin_name} "
               "--system-email {sys_email} "
               "--maas-host {maas_host}".format(**args))

        log.debug("Running landscape configure: {}".format(cmd))

        out = utils.get_command_output(cmd, timeout=None)

        if out['status']:
            utils.pollinate(self.session_id, 'ET')
            log.error("Problem with configuring Landscape: {}.".format(out))
            raise Exception("Error configuring Landscape.")

        utils.pollinate(self.session_id, 'DL')

        return out['output'].strip()
    def __init__(self, loop, display_controller, config):
        self.config = config
        self.display_controller = display_controller
        self.loop = loop
        self.config.setopt('install_type', 'OpenStack Autopilot')

        session_id = self.config.getopt('session_id')
        pollinate(session_id, 'IL')

        self.landscape_tasks = ["Preparing Landscape",
                                "Deploying Landscape",
                                "Registering against Landscape"]
    def __init__(self, loop, display_controller, config):
        self.config = config
        self.display_controller = display_controller
        self.loop = loop
        self.config.setopt('install_type', INSTALL_TYPE_LANDSCAPE[0])

        session_id = self.config.getopt('session_id')
        pollinate(session_id, 'IL')

        self.landscape_tasks = ["Preparing Landscape",
                                "Deploying Landscape",
                                "Registering against Landscape"]
    def __init__(self, loop, display_controller, config):
        self.config = config
        self.display_controller = display_controller
        self.loop = loop
        self.config.setopt('install_type', INSTALL_TYPE_LANDSCAPE[0])

        session_id = self.config.getopt('session_id')
        pollinate(session_id, 'IL')

        self.landscape_tasks = [
            "Preparing Landscape", "Deploying Landscape",
            "Registering against Landscape"
        ]
    def __init__(self, loop, display_controller, config):
        self.config = config
        self.display_controller = display_controller
        self.loop = loop
        self.config.setopt('install_type', 'OpenStack Autopilot')

        session_id = self.config.getopt('session_id')
        pollinate(session_id, 'IL')

        self.landscape_tasks = [
            "Preparing Landscape", "Deploying Landscape",
            "Registering against Landscape"
        ]
Exemple #11
0
 def set_perms(self):
     # Set permissions
     dirs = [self.config.cfg_path,
             os.path.join(utils.install_home(), '.juju')]
     for d in dirs:
         try:
             utils.chown(d,
                         utils.install_user(),
                         utils.install_user(),
                         recursive=True)
         except:
             utils.pollinate(self.session_id, 'EO')
             raise MaasInstallError(
                 "Unable to set ownership for {}".format(d))
Exemple #12
0
 def set_perms(self):
     # Set permissions
     dirs = [self.config.cfg_path,
             os.path.join(utils.install_home(), '.juju')]
     for d in dirs:
         try:
             utils.chown(d,
                         utils.install_user(),
                         utils.install_user(),
                         recursive=True)
         except:
             utils.pollinate(self.session_id, 'EO')
             raise MaasInstallError(
                 "Unable to set ownership for {}".format(d))
Exemple #13
0
 def __init__(self, loop, display_controller, config, post_tasks=None):
     self.loop = loop
     self.config = config
     self.display_controller = display_controller
     self.tasker = self.display_controller.tasker(loop, config)
     self.tempdir = TemporaryDirectory(suffix="cloud-install")
     if post_tasks:
         self.post_tasks = post_tasks
     else:
         self.post_tasks = []
     self.installing_new_maas = False
     # Sets install type
     self.session_id = self.config.getopt('session_id')
     if not self.config.is_landscape():
         self.config.setopt('install_type', 'Multi')
         utils.pollinate(self.session_id, 'IM')
Exemple #14
0
 def __init__(self, loop, display_controller,
              config, post_tasks=None):
     self.loop = loop
     self.config = config
     self.display_controller = display_controller
     self.tasker = self.display_controller.tasker(loop, config)
     self.tempdir = TemporaryDirectory(suffix="cloud-install")
     if post_tasks:
         self.post_tasks = post_tasks
     else:
         self.post_tasks = []
     self.installing_new_maas = False
     # Sets install type
     self.session_id = self.config.getopt('session_id')
     if not self.config.is_landscape():
         self.config.setopt('install_type', 'Multi')
         utils.pollinate(self.session_id, 'IM')
Exemple #15
0
    def enqueue_deployed_charms(self):
        """Send all deployed charms to CharmQueue for relation setting and
        post-proc.
        """
        charm_q = CharmQueue(ui=self.ui, config=self.config,
                             juju=self.juju, juju_state=self.juju_state,
                             deployed_charms=self.deployed_charm_classes)

        if self.config.getopt('headless'):
            charm_q.watch_relations()
            charm_q.watch_post_proc()
        else:
            async.submit(charm_q.watch_relations,
                         self.ui.show_exception_message)
            async.submit(charm_q.watch_post_proc,
                         self.ui.show_exception_message)

        charm_q.is_running = True

        # Exit cleanly if we've finished all deploys, relations,
        # post processing, and running in headless mode.
        if self.config.getopt('headless'):
            while not self.config.getopt('postproc_complete'):
                self.ui.status_info_message(
                    "Waiting for services to be started.")
                # FIXME: Is this needed?
                # time.sleep(10)
            self.ui.status_info_message(
                "All services deployed, relations set, and started")
            self.loop.exit(0)

        session_id = self.config.getopt('session_id')
        if self.config.is_single():
            utils.pollinate(session_id, 'DS')
        elif self.config.is_multi():
            utils.pollinate(session_id, 'DM')

        if charm_q.charm_post_proc_q.empty():
            self.ui.status_info_message("Ready.")

        self.ui.render_services_view(self.nodes, self.juju_state,
                                     self.maas_state, self.config)
        self.loop.redraw_screen()
Exemple #16
0
    def run_deployer(self):
        # Prep deployer template for landscape
        lscape_password = utils.random_password()
        password_re = re.compile('(change-me)')
        lscape_env = utils.slurp(self.lscape_yaml_path)
        lscape_env_re = password_re.sub(lscape_password, str(lscape_env))
        lscape_env_modified = {
            'landscape-dense-maas': yaml.load(lscape_env_re)
        }
        utils.spew(self.lscape_yaml_path, yaml.dump(lscape_env_modified))

        out = utils.get_command_output("{0} juju-deployer -WdvL -w 180 -c {1} "
                                       "landscape-dense-maas".format(
                                           self.config.juju_home(),
                                           self.lscape_yaml_path),
                                       timeout=None,
                                       user_sudo=True)
        if out['status']:
            utils.pollinate(self.session_id, 'ET')
            log.error("Problem deploying Landscape: {}".format(out))
            raise Exception("Error deploying Landscape.")
Exemple #17
0
    def deploy_landscape(self):
        self.multi_installer.tasker.start_task("Preparing Landscape")
        utils.apt_install('openstack-landscape')
        self.display_controller.status_info_message(
            "Running")
        # FIXME: not sure if deployer is failing to access the juju
        # environment but I get random connection refused when
        # running juju-deployer (adam.stokes)
        time.sleep(10)

        # Set remaining permissions
        self.set_perms()

        try:
            self.display_controller.status_info_message(
                "Downloading latest Landscape Autopilot bundle")
            utils.download_url(self.BUNDLE_URL, self.lscape_yaml_path)
        except Exception as e:
            utils.pollinate(self.session_id, 'EL')
            log.exception(e)
            raise e

        self.multi_installer.tasker.start_task("Deploying Landscape")
        self.run_deployer()

        self.multi_installer.tasker.start_task("Registering against Landscape")
        hostname = self.run_configure_script()

        self.multi_installer.tasker.stop_current_task()
        self.display_controller.clear_status()

        msg = []
        msg.append("To continue with OpenStack installation visit:\n\n")
        msg.append("http://{0}/account/standalone/openstack ".format(hostname))
        msg.append("\n\nLandscape Login Credentials:\n")
        msg.append(" Email: {}\n".format(
            self.config.getopt('landscapecreds')['admin_email']))
        msg.append(
            " Password: {}".format(self.config.getopt('openstack_password')))
        self.display_controller.show_step_info(msg)
Exemple #18
0
    def deploy_landscape(self):
        self.multi_installer.tasker.start_task("Preparing Landscape")
        utils.apt_install('openstack-landscape')
        self.display_controller.status_info_message(
            "Running")
        # FIXME: not sure if deployer is failing to access the juju
        # environment but I get random connection refused when
        # running juju-deployer (adam.stokes)
        time.sleep(10)

        # Set remaining permissions
        self.set_perms()

        try:
            self.display_controller.status_info_message(
                "Downloading latest Landscape Autopilot bundle")
            utils.download_url(self.BUNDLE_URL, self.lscape_yaml_path)
        except Exception as e:
            utils.pollinate(self.session_id, 'EL')
            log.exception(e)
            raise e

        self.multi_installer.tasker.start_task("Deploying Landscape")
        self.run_deployer()

        self.multi_installer.tasker.start_task("Registering against Landscape")
        hostname = self.run_configure_script()

        self.multi_installer.tasker.stop_current_task()
        self.display_controller.clear_status()

        msg = []
        msg.append("To continue with OpenStack installation visit:\n\n")
        msg.append("http://{0}/account/standalone/openstack ".format(hostname))
        msg.append("\n\nLandscape Login Credentials:\n")
        msg.append(" Email: {}\n".format(
            self.config.getopt('landscapecreds')['admin_email']))
        msg.append(
            " Password: {}".format(self.config.getopt('openstack_password')))
        self.display_controller.show_step_info(msg)
Exemple #19
0
    def run_deployer(self):
        # Prep deployer template for landscape
        lscape_password = utils.random_password()
        password_re = re.compile(
            '(change-me)')
        lscape_env = utils.slurp(self.lscape_yaml_path)
        lscape_env_re = password_re.sub(
            lscape_password, str(lscape_env))
        lscape_env_modified = {'landscape-dense-maas': yaml.load(
            lscape_env_re)}
        utils.spew(self.lscape_yaml_path,
                   yaml.dump(lscape_env_modified))

        out = utils.get_command_output(
            "{0} juju-deployer -WdvL -w 180 -c {1} "
            "landscape-dense-maas".format(
                self.config.juju_home(),
                self.lscape_yaml_path),
            timeout=None,
            user_sudo=True)
        if out['status']:
            utils.pollinate(self.session_id, 'ET')
            log.error("Problem deploying Landscape: {}".format(out))
            raise Exception("Error deploying Landscape.")