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 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
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
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" ]
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))
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')
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()
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.")
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)
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.")