summaryrefslogtreecommitdiff
path: root/openstackclient/image/client.py
diff options
context:
space:
mode:
Diffstat (limited to 'openstackclient/image/client.py')
-rw-r--r--openstackclient/image/client.py60
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