+ def __init__(self, loop=None):
+ """Instantiate a new Controller.
+
+ One of the connect_* methods will need to be called before this
+ object can be used for anything interesting.
+
+ :param loop: an asyncio event loop
+
+ """
+ self.loop = loop or asyncio.get_event_loop()
+ self.connection = None
+
+ async def connect(
+ self, endpoint, username, password, cacert=None, macaroons=None):
+ """Connect to an arbitrary Juju controller.
+
+ """
+ self.connection = await connection.Connection.connect(
+ endpoint, None, username, password, cacert, macaroons)
+
+ async def connect_current(self):
+ """Connect to the current Juju controller.
+
+ """
+ self.connection = (
+ await connection.Connection.connect_current_controller())
+
+ async def connect_controller(self, controller_name):
+ """Connect to a Juju controller by name.
+
+ """
+ self.connection = (
+ await connection.Connection.connect_controller(controller_name))
+
+ async def disconnect(self):
+ """Shut down the watcher task and close websockets.
+
+ """
+ if self.connection and self.connection.is_open:
+ log.debug('Closing controller connection')
+ await self.connection.close()
+ self.connection = None
+
+ async def add_model(
+ self, model_name, cloud_name=None, credential_name=None,
+ owner=None, config=None, region=None):