diff options
Diffstat (limited to 'openstackclient/image/client.py')
| -rw-r--r-- | openstackclient/image/client.py | 60 |
1 files changed, 57 insertions, 3 deletions
diff --git a/openstackclient/image/client.py b/openstackclient/image/client.py index 37160569..70bef1c8 100644 --- a/openstackclient/image/client.py +++ b/openstackclient/image/client.py @@ -1,4 +1,4 @@ -# Copyright 2012-2013 OpenStack, LLC. +# Copyright 2012-2013 OpenStack Foundation # # 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 @@ -15,6 +15,9 @@ import logging +from glanceclient import exc as gc_exceptions +from glanceclient.v1 import client as gc_v1_client +from glanceclient.v1 import images as gc_v1_images from openstackclient.common import utils @@ -22,8 +25,8 @@ LOG = logging.getLogger(__name__) API_NAME = "image" API_VERSIONS = { - "1": "glanceclient.v1.client.Client", - "2": "glanceclient.v2.client.Client" + "1": "openstackclient.image.client.Client_v1", + "2": "glanceclient.v2.client.Client", } @@ -38,3 +41,54 @@ def make_client(instance): instance._url = instance.get_endpoint_for_service_type(API_NAME) return image_client(instance._url, token=instance._token) + + +# NOTE(dtroyer): glanceclient.v1.image.ImageManager() doesn't have a find() +# method so add one here until the common client libs arrive +# A similar subclass will be required for v2 + +class Client_v1(gc_v1_client.Client): + """An image v1 client that uses ImageManager_v1""" + + def __init__(self, *args, **kwargs): + super(Client_v1, self).__init__(*args, **kwargs) + self.images = ImageManager_v1(self) + + +class ImageManager_v1(gc_v1_images.ImageManager): + """Add find() and findall() to the ImageManager class""" + + def find(self, **kwargs): + """Find a single item with attributes matching ``**kwargs``. + + This isn't very efficient: it loads the entire list then filters on + the Python side. + """ + rl = self.findall(**kwargs) + num = len(rl) + + if num == 0: + raise gc_exceptions.NotFound + elif num > 1: + raise gc_exceptions.NoUniqueMatch + else: + return rl[0] + + def findall(self, **kwargs): + """Find all items with attributes matching ``**kwargs``. + + This isn't very efficient: it loads the entire list then filters on + the Python side. + """ + found = [] + searches = kwargs.items() + + for obj in self.list(): + try: + if all(getattr(obj, attr) == value + for (attr, value) in searches): + found.append(obj) + except AttributeError: + continue + + return found |
