From 05f1e1a8c4589fef41f2e53fe59e790bd9936d88 Mon Sep 17 00:00:00 2001 From: Brian Waldon Date: Fri, 7 Sep 2012 17:38:27 -0700 Subject: [PATCH] Separate glance cache client from main client This is relocating the necessary functionality for the glance cache management tool into a new client class. Related to bp separate-client Change-Id: Ib89db1245aca5032a8d93876e07c562cb1fb5d4d --- bin/glance-cache-manage | 5 +- glance/image_cache/client.py | 126 ++++++++++++++++++ .../{v1 => }/test_bin_glance_cache_manage.py | 0 3 files changed, 129 insertions(+), 2 deletions(-) create mode 100644 glance/image_cache/client.py rename glance/tests/functional/{v1 => }/test_bin_glance_cache_manage.py (100%) diff --git a/bin/glance-cache-manage b/bin/glance-cache-manage index 2f42c21a8b..83bf0b2e96 100755 --- a/bin/glance-cache-manage +++ b/bin/glance-cache-manage @@ -37,7 +37,7 @@ if os.path.exists(os.path.join(possible_topdir, 'glance', '__init__.py')): gettext.install('glance', unicode=1) -from glance import client as glance_client +import glance.image_cache.client from glance.common import exception from glance.common import utils from glance.version import version_info as version @@ -258,7 +258,8 @@ def get_client(options): specified by the --host and --port options supplied to the CLI """ - return glance_client.get_client(host=options.host, + return glance.image_cache.client.get_client( + host=options.host, port=options.port, username=options.os_username, password=options.os_password, diff --git a/glance/image_cache/client.py b/glance/image_cache/client.py new file mode 100644 index 0000000000..9ba29617ba --- /dev/null +++ b/glance/image_cache/client.py @@ -0,0 +1,126 @@ +# Copyright 2012 OpenStack, LLC +# All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +import os + +from glance.common import client as base_client +import glance.openstack.common.jsonutils as json +from glance.common import exception + + +class CacheClient(base_client.BaseClient): + + DEFAULT_PORT = 9292 + DEFAULT_DOC_ROOT = '/v1' + + def delete_cached_image(self, image_id): + """ + Delete a specified image from the cache + """ + self.do_request("DELETE", "/cached_images/%s" % image_id) + return True + + def get_cached_images(self, **kwargs): + """ + Returns a list of images stored in the image cache. + """ + res = self.do_request("GET", "/cached_images") + data = json.loads(res.read())['cached_images'] + return data + + def get_queued_images(self, **kwargs): + """ + Returns a list of images queued for caching + """ + res = self.do_request("GET", "/queued_images") + data = json.loads(res.read())['queued_images'] + return data + + def delete_all_cached_images(self): + """ + Delete all cached images + """ + res = self.do_request("DELETE", "/cached_images") + data = json.loads(res.read()) + num_deleted = data['num_deleted'] + return num_deleted + + def queue_image_for_caching(self, image_id): + """ + Queue an image for prefetching into cache + """ + self.do_request("PUT", "/queued_images/%s" % image_id) + return True + + def delete_queued_image(self, image_id): + """ + Delete a specified image from the cache queue + """ + self.do_request("DELETE", "/queued_images/%s" % image_id) + return True + + def delete_all_queued_images(self): + """ + Delete all queued images + """ + res = self.do_request("DELETE", "/queued_images") + data = json.loads(res.read()) + num_deleted = data['num_deleted'] + return num_deleted + + +def get_client(host, port=None, timeout=None, use_ssl=False, username=None, + password=None, tenant=None, + auth_url=None, auth_strategy=None, + auth_token=None, region=None, + is_silent_upload=False, insecure=False): + """ + Returns a new client Glance client object based on common kwargs. + If an option isn't specified falls back to common environment variable + defaults. + """ + + if auth_url or os.getenv('OS_AUTH_URL'): + force_strategy = 'keystone' + else: + force_strategy = None + + creds = dict(username=username or + os.getenv('OS_AUTH_USER', os.getenv('OS_USERNAME')), + password=password or + os.getenv('OS_AUTH_KEY', os.getenv('OS_PASSWORD')), + tenant=tenant or + os.getenv('OS_AUTH_TENANT', + os.getenv('OS_TENANT_NAME')), + auth_url=auth_url or os.getenv('OS_AUTH_URL'), + strategy=force_strategy or auth_strategy or + os.getenv('OS_AUTH_STRATEGY', 'noauth'), + region=region or os.getenv('OS_REGION_NAME'), + ) + + if creds['strategy'] == 'keystone' and not creds['auth_url']: + msg = ("--os_auth_url option or OS_AUTH_URL environment variable " + "required when keystone authentication strategy is enabled\n") + raise exception.ClientConfigurationError(msg) + + return CacheClient( + host=host, + port=port, + timeout=timeout, + use_ssl=use_ssl, + auth_tok=auth_token or + os.getenv('OS_TOKEN'), + creds=creds, + insecure=insecure) diff --git a/glance/tests/functional/v1/test_bin_glance_cache_manage.py b/glance/tests/functional/test_bin_glance_cache_manage.py similarity index 100% rename from glance/tests/functional/v1/test_bin_glance_cache_manage.py rename to glance/tests/functional/test_bin_glance_cache_manage.py