X-Git-Url: https://osm.etsi.org/gitweb/?a=blobdiff_plain;f=juju%2Fclient%2Fconnection.py;h=cdd93d98f5d65cbba57628806e288f3844a11e88;hb=01b96693ece2941d9fe28b19401aae6f909c590e;hp=3dcfabf5cf286910c26d41555e489d1c5dc28674;hpb=173b900fcd95b2436af55df2618302146f4a2f40;p=osm%2FN2VC.git diff --git a/juju/client/connection.py b/juju/client/connection.py index 3dcfabf..cdd93d9 100644 --- a/juju/client/connection.py +++ b/juju/client/connection.py @@ -1,4 +1,3 @@ -import asyncio import io import json import logging @@ -12,6 +11,8 @@ import websockets import yaml +from juju.errors import JujuAPIError + log = logging.getLogger("websocket") @@ -42,6 +43,12 @@ class Connection: self.ws = None self.facades = {} + @property + def is_open(self): + if self.ws: + return self.ws.open + return False + def _get_ssl(self, cert): return ssl.create_default_context( purpose=ssl.Purpose.CLIENT_AUTH, cadata=cert) @@ -69,13 +76,14 @@ class Connection: if'params' not in msg: msg['params'] = {} if "version" not in msg: - msg['version'] = self.facades[msg['Type']] + msg['version'] = self.facades[msg['type']] outgoing = json.dumps(msg, indent=2, cls=encoder) await self.ws.send(outgoing) result = await self.recv() - log.debug("send %s got %s", msg, result) + #log.debug("Send: %s", outgoing) + #log.debug("Recv: %s", result) if result and 'error' in result: - raise RuntimeError(result) + raise JujuAPIError(result) return result async def clone(self): @@ -91,14 +99,35 @@ class Connection: self.cacert, ) + async def controller(self): + """Return a Connection to the controller at self.endpoint + + """ + return await Connection.connect( + self.endpoint, + None, + self.username, + self.password, + self.cacert, + ) + @classmethod async def connect(cls, endpoint, uuid, username, password, cacert=None): - url = "wss://{}/model/{}/api".format(endpoint, uuid) + """Connect to the websocket. + + If uuid is None, the connection will be to the controller. Otherwise it + will be to the model. + + """ + if uuid: + url = "wss://{}/model/{}/api".format(endpoint, uuid) + else: + url = "wss://{}/api".format(endpoint) client = cls(endpoint, uuid, username, password, cacert) await client.open(url, cacert) server_info = await client.login(username, password) client.build_facades(server_info['facades']) - log.info("Driver connected to juju %s", endpoint) + log.info("Driver connected to juju %s", url) return client @@ -113,9 +142,9 @@ class Connection: endpoint = controller['api-endpoints'][0] cacert = controller.get('ca-cert') accounts = jujudata.accounts()[controller_name] - username = accounts['current-account'] - password = accounts['accounts'][username]['password'] - models = jujudata.models()[controller_name]['accounts'][username] + username = accounts['user'] + password = accounts['password'] + models = jujudata.models()[controller_name] model_name = models['current-model'] model_uuid = models['models'][model_name]['uuid'] @@ -136,9 +165,9 @@ class Connection: endpoint = controller['api-endpoints'][0] cacert = controller.get('ca-cert') accounts = jujudata.accounts()[controller_name] - username = accounts['current-account'] - password = accounts['accounts'][username]['password'] - models = jujudata.models()[controller_name]['accounts'][username] + username = accounts['user'] + password = accounts['password'] + models = jujudata.models()[controller_name] model_uuid = models['models'][model_name]['uuid'] return await cls.connect(