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: AsyncPool.submit(charm_q.watch_relations) AsyncPool.submit(charm_q.watch_post_proc) 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) self.ui.status_info_message( "Services deployed, relationships still pending." " Please wait for all relations to be set before" " deploying additional services.") self.ui.render_services_view(self.nodes, self.juju_state, self.maas_state, self.config) self.loop.redraw_screen()
def commit_placement(self): self.config.setopt('current_state', ControllerState.SERVICES.value) self.ui.render_services_view(self.nodes, self.juju_state, self.maas_state, self.config) self.loop.redraw_screen() if self.config.getopt('headless'): self.begin_deployment() else: AsyncPool.submit(self.begin_deployment)
def run(self): self.tasker.register_tasks([ "Initializing Environment", "Creating Container", "Initializing Container", "Installing Dependencies", "Bootstrapping Juju"]) self.tasker.start_task("Initializing Environment") self.ensure_nested_kvm() if self.config.getopt('headless'): self.do_install() else: AsyncPool.submit(self.do_install)
def update(self, *args, **kwargs): """Render UI according to current state and reset timer PegasusGUI only. """ interval = 1 current_state = self.config.getopt('current_state') if current_state == ControllerState.PLACEMENT: self.ui.render_placement_view(self.loop, self.config, self.commit_placement) elif current_state == ControllerState.INSTALL_WAIT: self.ui.render_node_install_wait(message="Waiting...") interval = self.config.node_install_wait_interval elif current_state == ControllerState.ADD_SERVICES: self.ui.render_add_services_dialog( AsyncPool.submit(self.deploy_new_services), self.cancel_add_services) elif current_state == ControllerState.SERVICES: self.update_node_states() else: raise Exception("Internal error, unexpected display " "state '{}'".format(current_state)) self.loop.redraw_screen() AlarmMonitor.add_alarm(self.loop.set_alarm_in(interval, self.update), "core-controller-update")
def run(self): self.tl = ['a', 'b', 'c'] self.tasker.register_tasks(self.tl) self.update_progress() AsyncPool.submit(self.async_go)
def initialize(self): """Authenticates against juju/maas and sets up placement controller.""" if getenv("FAKE_API_DATA"): self.juju_state = FakeJujuState() self.maas_state = FakeMaasState() else: self.authenticate_juju() if self.config.is_multi(): creds = self.config.getopt('maascreds') self.maas, self.maas_state = connect_to_maas(creds) self.placement_controller = PlacementController( self.maas_state, self.config) if path.exists(self.config.placements_filename): try: with open(self.config.placements_filename, 'r') as pf: self.placement_controller.load(pf) except Exception: log.exception("Exception loading placement") raise Exception("Could not load " "{}.".format(self.config.placements_filename)) self.ui.status_info_message("Loaded placements from file") log.info("Loaded placements from " "'{}'".format(self.config.placements_filename)) # If we have no machines (so we are a fresh install) but # are reading a placements.yaml from a previous install, # so it has no assignments, only deployments, tell the # controller to use the deployments in the file as # assignments: if len(self.placement_controller.machines_pending()) == 0 and \ len(self.juju_state.machines()) == 0: self.placement_controller.set_assignments_from_deployments() log.info("Using deployments saved from previous install" " as new assignments.") else: if self.config.is_multi(): def_assignments = self.placement_controller.gen_defaults() else: def_assignments = self.placement_controller.gen_single() self.placement_controller.set_all_assignments(def_assignments) pfn = self.config.placements_filename self.placement_controller.set_autosave_filename(pfn) self.placement_controller.do_autosave() if self.config.is_single(): if self.config.getopt('headless'): self.begin_deployment() else: AsyncPool.submit(self.begin_deployment) return if self.config.getopt('edit_placement') or \ not self.placement_controller.can_deploy(): self.config.setopt( 'current_state', ControllerState.PLACEMENT.value) else: if self.config.getopt('headless'): self.begin_deployment() else: AsyncPool.submit(self.begin_deployment)