class VSphereSetupController(common.BaseVSphereSetupController): def render(self): self.render_interstitial() app.loop.create_task(self.show_vsphere_setup_screen()) async def show_vsphere_setup_screen(self): # Assign current datacenter await app.provider.login() datacenter = None for dc in await app.provider.get_datacenters(): if dc.name == app.provider.region: datacenter = dc if datacenter is None: raise common.VSphereRegionError( 'Unable to get info for region {}'.format(app.provider.region)) self.authenticating.clear() self.view = VSphereSetupView(datacenter, self.finish) self.view.show() def render_interstitial(self): self.view = BootstrapWaitView( app=app, message="Logging in to VSphere. Please wait.") app.ui.set_body(self.view) self.authenticating.set() app.loop.create_task(self._refresh()) async def _refresh(self): while self.authenticating.is_set(): self.view.redraw_kitt() await asyncio.sleep(1)
def render_interstitial(self): track_screen("JaaS Login Wait") app.ui.set_header(title="Waiting") self.view = BootstrapWaitView( app=app, message="Logging in to JaaS. Please wait.") app.ui.set_body(self.view) self.authenticating.set() app.loop.create_task(self._refresh()) self._refresh()
class DestroyConfirm: def __init__(self): self.authenticating = asyncio.Event() self.view = None async def do_destroy(self, model, controller): track_event("Destroying model", "Destroy", "") app.ui.set_footer("Destroying model {} in controller {}".format( model, controller)) await juju.destroy_model(controller, model) app.ui.set_footer("") controllers.use('destroy').render() def finish(self, controller_name=None, model_name=None): if controller_name and model_name: app.loop.create_task(self.do_destroy(model_name, controller_name)) else: return controllers.use('destroy').render() async def login(self, controller, model): await juju.login() self.authenticating.clear() track_screen("Destroy Confirm Model") view = DestroyConfirmView(app, controller, model, cb=self.finish) app.ui.set_header( title="Destroy Confirmation", excerpt="Are you sure you wish to destroy the deployment?") app.ui.set_body(view) def render_interstitial(self): track_screen("Controller Login Wait") app.ui.set_header(title="Waiting") self.view = BootstrapWaitView( app=app, message="Logging in to model. Please wait.") app.ui.set_body(self.view) self.authenticating.set() app.loop.create_task(self._refresh()) self._refresh() async def _refresh(self): while self.authenticating.is_set(): self.view.redraw_kitt() await asyncio.sleep(1) def render(self, controller, model): app.current_controller = controller app.current_model = model['name'] events.ModelAvailable.set() self.authenticating.set() self.render_interstitial() app.loop.create_task(self.login(controller, model))
def render(self): app.log.debug("Rendering bootstrap wait") self.view = BootstrapWaitView( app=app, message="Juju Controller is initializing. Please wait.") app.ui.set_header(title="Waiting") app.ui.set_body(self.view) app.bootstrap.running.add_done_callback(self.finish) self.__refresh()
async def show_vsphere_setup_screen(self): # Assign current datacenter await app.provider.login() datacenter = None for dc in await app.provider.get_datacenters(): if dc.name == app.provider.region: datacenter = dc if datacenter is None: raise common.VSphereRegionError( 'Unable to get info for region {}'.format(app.provider.region)) self.authenticating.clear() self.view = VSphereSetupView(datacenter, self.finish) self.view.show()
def render(self, relations_scheduled_future): self.relations_scheduled_future = relations_scheduled_future track_screen("Bootstrap wait") app.log.debug("Rendering bootstrap wait") self.view = BootstrapWaitView( app=app, message="Juju Controller is initializing. Please wait.") app.ui.set_header(title="Waiting") app.ui.set_body(self.view) if app.bootstrap.running: app.bootstrap.running.add_done_callback(self.finish) self.__refresh()
def render(self): track_screen("Bootstrap wait") app.log.debug("Rendering bootstrap wait") if app.is_jaas: bootstrap_stderr_path = None else: cache_dir = Path(app.config['spell-dir']) bootstrap_stderr_path = cache_dir / '{}-bootstrap.err'.format( app.current_controller) view = BootstrapWaitView( app=app, message="Juju Controller is initializing. Please wait.", watch_file=bootstrap_stderr_path) app.ui.set_header(title="Waiting") app.ui.set_body(view) app.loop.create_task(self.refresh(view)) app.loop.create_task(self.finish())
def render(self): track_screen("Bootstrap") if app.is_jaas or self.is_existing_controller(): bootstrap_stderr_path = None msg = 'Model' else: cache_dir = Path(app.config['spell-dir']) bootstrap_stderr_path = cache_dir / '{}-bootstrap.err'.format( app.current_controller) msg = 'Controller' view = BootstrapWaitView( app=app, message="Juju {} is initializing. Please wait.".format(msg), watch_file=bootstrap_stderr_path) app.ui.set_header(title="Waiting") app.ui.set_body(view) app.loop.create_task(self.run()) app.loop.create_task(self.wait(view))
def render(self, relations_scheduled_future): self.relations_scheduled_future = relations_scheduled_future track_screen("Bootstrap wait") app.log.debug("Rendering bootstrap wait") if app.is_jaas: bootstrap_stderr_path = None else: cache_dir = Path(app.config['spell-dir']) bootstrap_stderr_path = cache_dir / '{}-bootstrap.err'.format( app.current_controller) self.view = BootstrapWaitView( app=app, message="Juju Controller is initializing. Please wait.", watch_file=bootstrap_stderr_path) app.ui.set_header(title="Waiting") app.ui.set_body(self.view) if app.bootstrap.running: app.bootstrap.running.add_done_callback(self.finish) self.__refresh()
class JaaSLoginController: def __init__(self): self.authenticating = asyncio.Event() self.view = None def render(self, error=None): app.jaas_controller = 'jaas' self.render_interstitial() app.loop.create_task(self._try_token_auth(error)) async def _try_token_auth(self, error): app.log.info('Attempting to register JAAS with saved token') try: await juju.register_controller(app.jaas_controller, JAAS_DOMAIN, '', '', '') controllers.use('showsteps').render() except CalledProcessError: self.show_login_screen(error) def show_login_screen(self, error): track_screen("Login to JaaS") app.ui.set_header(title="Login to JaaS", excerpt='Enter your Ubuntu SSO credentials') app.ui.set_body(JaaSLoginView(app, error=error, cb=self.register)) def register(self, email=None, password=None, twofa=None): app.loop.create_task(self._register(email, password, twofa)) self.render_interstitial() async def _register(self, email, password, twofa): if not await juju.register_controller(app.jaas_controller, JAAS_DOMAIN, email, password, twofa, fail_cb=self.fail, timeout_cb=self.timeout): return app.current_controller = app.jaas_controller app.is_jaas = True self.authenticating.clear() app.log.info('JAAS is registered') controllers.use('showsteps').render() def render_interstitial(self): track_screen("JaaS Login Wait") app.ui.set_header(title="Waiting") self.view = BootstrapWaitView( app=app, message="Logging in to JaaS. Please wait.") app.ui.set_body(self.view) self.authenticating.set() app.loop.create_task(self._refresh()) self._refresh() async def _refresh(self): while self.authenticating.is_set(): self.view.redraw_kitt() await asyncio.sleep(1) def fail(self, stderr): self.authenticating.clear() msg = stderr if 'ERROR cannot get user details for' in msg: msg = ('USSO account not connected with JaaS. Please login via ' 'your browser at https://jujucharms.com/login to connect ' 'your account, and then try this login again.') else: prefix = 'ERROR cannot get token: ' if msg.startswith(prefix): msg = msg[len(prefix):] prefix = 'Invalid request data (email: [' if msg.startswith(prefix): msg = msg[len(prefix):][:-3] # also strip trailing ]) msg = 'Login failed, please try again: {}'.format(msg) self.render(error=msg) def timeout(self): self.authenticating.clear() controllers = juju.get_controllers() if app.jaas_controller in controllers['controllers']: # registration seems to have worked; maybe we should remove and # try again to be safe, but hopefully it's safe to just move on return self.finish() self.__remove_alarm() self.render(error='Timed out connecting to JaaS. Please try again.')
def render_interstitial(self): self.view = BootstrapWaitView( app=app, message="Logging in to VSphere. Please wait.") app.ui.set_body(self.view) self.authenticating.set() app.loop.create_task(self._refresh())