From ff77aeea56872be38914c851926af1fb504dba5f Mon Sep 17 00:00:00 2001 From: Eoghan Glynn Date: Fri, 21 Jun 2013 11:33:33 +0000 Subject: [PATCH] Make authenticated client easier to consume. Encapsulate keystone logic in an convenience method. Change-Id: I0a048e02f57d657b8b414a76d759ceb9e0e025df --- ceilometerclient/client.py | 77 +++++++++++++++++++++++++++++++++ ceilometerclient/common/http.py | 3 +- ceilometerclient/shell.py | 55 +---------------------- 3 files changed, 81 insertions(+), 54 deletions(-) diff --git a/ceilometerclient/client.py b/ceilometerclient/client.py index b1a6d27d..171e94cf 100644 --- a/ceilometerclient/client.py +++ b/ceilometerclient/client.py @@ -11,6 +11,83 @@ # under the License. from ceilometerclient.common import utils +from keystoneclient.v2_0 import client as ksclient + + +def _get_ksclient(**kwargs): + """Get an endpoint and auth token from Keystone. + + :param kwargs: keyword args containing credentials: + * username: name of user + * password: user's password + * auth_url: endpoint to authenticate against + * insecure: allow insecure SSL (no cert verification) + * tenant_{name|id}: name or ID of tenant + """ + return ksclient.Client(username=kwargs.get('username'), + password=kwargs.get('password'), + tenant_id=kwargs.get('tenant_id'), + tenant_name=kwargs.get('tenant_name'), + auth_url=kwargs.get('auth_url'), + insecure=kwargs.get('insecure')) + + +def _get_endpoint(client, **kwargs): + """Get an endpoint using the provided keystone client.""" + return client.service_catalog.url_for( + service_type=kwargs.get('service_type') or 'metering', + endpoint_type=kwargs.get('endpoint_type') or 'publicURL') + + +def get_client(api_version, **kwargs): + """Get an authtenticated client, based on the credentials + in the keyword args. + + :param api_version: the API version to use ('1' or '2') + :param kwargs: keyword args containing credentials, either: + * os_auth_token: pre-existing token to re-use + * ceilometer_url: ceilometer API endpoint + or: + * os_username: name of user + * os_password: user's password + * os_auth_url: endpoint to authenticate against + * insecure: allow insecure SSL (no cert verification) + * os_tenant_{name|id}: name or ID of tenant + """ + if kwargs.get('os_auth_token') and kwargs.get('ceilometer_url'): + token = kwargs.get('os_auth_token') + endpoint = kwargs.get('ceilometer_url') + elif (kwargs.get('os_username') and + kwargs.get('os_password') and + kwargs.get('os_auth_url') and + (kwargs.get('os_tenant_id') or kwargs.get('os_tenant_name'))): + + ks_kwargs = { + 'username': kwargs.get('os_username'), + 'password': kwargs.get('os_password'), + 'tenant_id': kwargs.get('os_tenant_id'), + 'tenant_name': kwargs.get('os_tenant_name'), + 'auth_url': kwargs.get('os_auth_url'), + 'service_type': kwargs.get('os_service_type'), + 'endpoint_type': kwargs.get('os_endpoint_type'), + 'insecure': kwargs.get('insecure'), + } + _ksclient = _get_ksclient(**ks_kwargs) + token = kwargs.get('os_auth_token') or _ksclient.auth_token + + endpoint = kwargs.get('ceilometer_url') or \ + _get_endpoint(_ksclient, **ks_kwargs) + + cli_kwargs = { + 'token': token, + 'insecure': kwargs.get('insecure'), + 'timeout': kwargs.get('timeout'), + 'ca_file': kwargs.get('ca_file'), + 'cert_file': kwargs.get('cert_file'), + 'key_file': kwargs.get('key_file'), + } + + return Client(api_version, endpoint, **cli_kwargs) def Client(version, *args, **kwargs): diff --git a/ceilometerclient/common/http.py b/ceilometerclient/common/http.py index 2a813d22..e0ad393d 100644 --- a/ceilometerclient/common/http.py +++ b/ceilometerclient/common/http.py @@ -58,7 +58,8 @@ class HTTPClient(object): parts = urlparse.urlparse(endpoint) _args = (parts.hostname, parts.port, parts.path) - _kwargs = {'timeout': float(kwargs.get('timeout', 600))} + _kwargs = {'timeout': (float(kwargs.get('timeout')) + if kwargs.get('timeout') else 600)} if parts.scheme == 'https': _class = VerifiedHTTPSConnection diff --git a/ceilometerclient/shell.py b/ceilometerclient/shell.py index c5e4937a..3ea531a2 100644 --- a/ceilometerclient/shell.py +++ b/ceilometerclient/shell.py @@ -19,8 +19,6 @@ import httplib2 import logging import sys -from keystoneclient.v2_0 import client as ksclient - import ceilometerclient from ceilometerclient import client as ceiloclient from ceilometerclient.common import utils @@ -200,28 +198,6 @@ class CeilometerShell(object): subparser.add_argument(*args, **kwargs) subparser.set_defaults(func=callback) - def _get_ksclient(self, **kwargs): - """Get an endpoint and auth token from Keystone. - - :param username: name of user - :param password: user's password - :param tenant_id: unique identifier of tenant - :param tenant_name: name of tenant - :param auth_url: endpoint to authenticate against - """ - return ksclient.Client(username=kwargs.get('username'), - password=kwargs.get('password'), - tenant_id=kwargs.get('tenant_id'), - tenant_name=kwargs.get('tenant_name'), - auth_url=kwargs.get('auth_url'), - insecure=kwargs.get('insecure')) - - def _get_endpoint(self, client, **kwargs): - """Get an endpoint using the provided keystone client.""" - return client.service_catalog.url_for( - service_type=kwargs.get('service_type') or 'metering', - endpoint_type=kwargs.get('endpoint_type') or 'publicURL') - def _setup_debugging(self, debug): if debug: logging.basicConfig( @@ -255,10 +231,7 @@ class CeilometerShell(object): self.do_help(args) return 0 - if args.os_auth_token and args.ceilometer_url: - token = args.os_auth_token - endpoint = args.ceilometer_url - else: + if not (args.os_auth_token and args.ceilometer_url): if not args.os_username: raise exc.CommandError("You must provide a username via " "either --os-username or via " @@ -278,32 +251,8 @@ class CeilometerShell(object): raise exc.CommandError("You must provide an auth url via " "either --os-auth-url or via " "env[OS_AUTH_URL]") - kwargs = { - 'username': args.os_username, - 'password': args.os_password, - 'tenant_id': args.os_tenant_id, - 'tenant_name': args.os_tenant_name, - 'auth_url': args.os_auth_url, - 'service_type': args.os_service_type, - 'endpoint_type': args.os_endpoint_type, - 'insecure': args.insecure - } - _ksclient = self._get_ksclient(**kwargs) - token = args.os_auth_token or _ksclient.auth_token - endpoint = args.ceilometer_url or \ - self._get_endpoint(_ksclient, **kwargs) - - kwargs = { - 'token': token, - 'insecure': args.insecure, - 'timeout': args.timeout, - 'ca_file': args.ca_file, - 'cert_file': args.cert_file, - 'key_file': args.key_file, - } - - client = ceiloclient.Client(api_version, endpoint, **kwargs) + client = ceiloclient.get_client(api_version, **(args.__dict__)) try: args.func(client, args)