Exemple #1
0
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)
Exemple #2
0
 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()
Exemple #3
0
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))
Exemple #4
0
    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()
Exemple #5
0
 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()
Exemple #6
0
    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()
Exemple #7
0
    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())
Exemple #8
0
    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))
Exemple #9
0
    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()
Exemple #10
0
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.')
Exemple #11
0
 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())