+ @classmethod
+ async def connect_current(cls, loop=None):
+ """Connect to the currently active model.
+
+ """
+ jujudata = JujuData()
+
+ controller_name = jujudata.current_controller()
+ if not controller_name:
+ raise JujuConnectionError('No current controller')
+
+ model_name = jujudata.current_model()
+
+ return await cls.connect_model(
+ '{}:{}'.format(controller_name, model_name), loop)
+
+ @classmethod
+ async def connect_current_controller(cls, loop=None):
+ """Connect to the currently active controller.
+
+ """
+ jujudata = JujuData()
+ controller_name = jujudata.current_controller()
+ if not controller_name:
+ raise JujuConnectionError('No current controller')
+
+ return await cls.connect_controller(controller_name, loop)
+
+ @classmethod
+ async def connect_controller(cls, controller_name, loop=None):
+ """Connect to a controller by name.
+
+ """
+ jujudata = JujuData()
+ controller = jujudata.controllers()[controller_name]
+ endpoint = controller['api-endpoints'][0]
+ cacert = controller.get('ca-cert')
+ accounts = jujudata.accounts()[controller_name]
+ username = accounts['user']
+ password = accounts.get('password')
+ macaroons = get_macaroons(controller_name) if not password else None
+
+ return await cls.connect(
+ endpoint, None, username, password, cacert, macaroons, loop)
+
+ @classmethod
+ async def connect_model(cls, model, loop=None):
+ """Connect to a model by name.
+
+ :param str model: [<controller>:]<model>
+
+ """
+ jujudata = JujuData()
+
+ if ':' in model:
+ # explicit controller given
+ controller_name, model_name = model.split(':')
+ else:
+ # use the current controller if one isn't explicitly given
+ controller_name = jujudata.current_controller()
+ model_name = model
+
+ accounts = jujudata.accounts()[controller_name]
+ username = accounts['user']
+ # model name must include a user prefix, so add it if it doesn't
+ if '/' not in model_name:
+ model_name = '{}/{}'.format(username, model_name)
+
+ controller = jujudata.controllers()[controller_name]
+ endpoint = controller['api-endpoints'][0]
+ cacert = controller.get('ca-cert')
+ password = accounts.get('password')
+ models = jujudata.models()[controller_name]
+ model_uuid = models['models'][model_name]['uuid']
+ macaroons = get_macaroons(controller_name) if not password else None
+
+ return await cls.connect(
+ endpoint, model_uuid, username, password, cacert, macaroons, loop)
+
+ def build_facades(self, facades):