X-Git-Url: https://osm.etsi.org/gitweb/?p=osm%2FN2VC.git;a=blobdiff_plain;f=modules%2Flibjuju%2Fjuju%2Fclient%2Fconnection.py;h=c09468c65eef6f1d265fc9107f99ebd1a05bfa8b;hp=7457391877e481c1c237e3bdc8c68a8e6cdadd65;hb=1a15d1c84fc826fa7996c1c9d221a324edd33432;hpb=fd577a36aaf408c845f3bb8b3f28ecbbf3332107 diff --git a/modules/libjuju/juju/client/connection.py b/modules/libjuju/juju/client/connection.py index 7457391..c09468c 100644 --- a/modules/libjuju/juju/client/connection.py +++ b/modules/libjuju/juju/client/connection.py @@ -413,7 +413,7 @@ class Connection: endpoints.extend(new_endpoints) else: # ran out of endpoints without a successful login - raise Exception("Couldn't authenticate to {}".format( + raise JujuConnectionError("Couldn't authenticate to {}".format( self._endpoint)) response = result['response'] @@ -584,6 +584,38 @@ class JujuData: def accounts(self): return self._load_yaml('accounts.yaml', 'controllers') + def credentials(self): + return self._load_yaml('credentials.yaml', 'credentials') + + def load_credential(self, cloud, name=None): + """Load a local credential. + + :param str cloud: Name of cloud to load credentials from. + :param str name: Name of credential. If None, the default credential + will be used, if available. + :returns: A CloudCredential instance, or None. + """ + try: + cloud = tag.untag('cloud-', cloud) + creds_data = self.credentials()[cloud] + if not name: + default_credential = creds_data.pop('default-credential', None) + default_region = creds_data.pop('default-region', None) # noqa + if default_credential: + name = creds_data['default-credential'] + elif len(creds_data) == 1: + name = list(creds_data)[0] + else: + return None, None + cred_data = creds_data[name] + auth_type = cred_data.pop('auth-type') + return name, client.CloudCredential( + auth_type=auth_type, + attrs=cred_data, + ) + except (KeyError, FileNotFoundError): + return None, None + def _load_yaml(self, filename, key): filepath = os.path.join(self.path, filename) with io.open(filepath, 'rt') as f: