summaryrefslogtreecommitdiff
path: root/openstackclient/api
diff options
context:
space:
mode:
authorDean Troyer <dtroyer@gmail.com>2014-09-18 00:56:38 -0500
committerDean Troyer <dtroyer@gmail.com>2015-01-20 17:01:23 -0600
commit1ecf1bee2d5c1566533cdd8fad99733ea8336aa8 (patch)
treeaaf60bd664d98b17dbb703f7b14fb681ccf24aaf /openstackclient/api
parent95fe3fda3d041a4fa761040c80214d4ca5f29aaa (diff)
downloadpython-openstackclient-1ecf1bee2d5c1566533cdd8fad99733ea8336aa8.tar.gz
Begin low-level API for Image v1 and v2
image list for v1 and v2: * Add --public|--private to command parsers * Implement local public/private filtering for v1 image_list() * Pass public/private filter to server for v2 image_list() Change-Id: Ie7c24ea2d1bf2b3b1b7fa342eb45fee45894634d
Diffstat (limited to 'openstackclient/api')
-rw-r--r--openstackclient/api/api.py2
-rw-r--r--openstackclient/api/image_v1.py68
-rw-r--r--openstackclient/api/image_v2.py69
3 files changed, 138 insertions, 1 deletions
diff --git a/openstackclient/api/api.py b/openstackclient/api/api.py
index 90b4e9c3..ba83ce4d 100644
--- a/openstackclient/api/api.py
+++ b/openstackclient/api/api.py
@@ -161,7 +161,7 @@ class BaseAPI(KeystoneSession):
):
"""Return a list of resources
- GET ${ENDPOINT}/${PATH}
+ GET ${ENDPOINT}/${PATH}?${PARAMS}
path is often the object's plural resource type
diff --git a/openstackclient/api/image_v1.py b/openstackclient/api/image_v1.py
new file mode 100644
index 00000000..f9c780a4
--- /dev/null
+++ b/openstackclient/api/image_v1.py
@@ -0,0 +1,68 @@
+# 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.
+#
+
+"""Image v1 API Library"""
+
+from openstackclient.api import api
+
+
+class APIv1(api.BaseAPI):
+ """Image v1 API"""
+
+ def __init__(self, endpoint=None, **kwargs):
+ super(APIv1, self).__init__(endpoint=endpoint, **kwargs)
+
+ # Hack this until discovery is up
+ self.endpoint = '/'.join([self.endpoint.rstrip('/'), 'v1'])
+
+ def image_list(
+ self,
+ detailed=False,
+ public=False,
+ private=False,
+ **filter
+ ):
+ """Get available images
+
+ :param detailed:
+ Retrieve detailed response from server if True
+ :param public:
+ Return public images if True
+ :param private:
+ Return private images if True
+
+ If public and private are both True or both False then all images are
+ returned. Both arguments False is equivalent to no filter and all
+ images are returned. Both arguments True is a filter that includes
+ both public and private images which is the same set as all images.
+
+ http://docs.openstack.org/api/openstack-image-service/1.1/content/requesting-a-list-of-public-vm-images.html
+ http://docs.openstack.org/api/openstack-image-service/1.1/content/requesting-detailed-metadata-on-public-vm-images.html
+ http://docs.openstack.org/api/openstack-image-service/1.1/content/filtering-images-returned-via-get-images-and-get-imagesdetail.html
+
+ TODO(dtroyer): Implement filtering
+ """
+
+ url = "/images"
+ if detailed or public or private:
+ # Because we can't all use /details
+ url += "/detail"
+
+ image_list = self.list(url, **filter)['images']
+
+ if public != private:
+ # One is True and one is False, so public represents the filter
+ # state in either case
+ image_list = [i for i in image_list if i['is_public'] == public]
+
+ return image_list
diff --git a/openstackclient/api/image_v2.py b/openstackclient/api/image_v2.py
new file mode 100644
index 00000000..c5c78431
--- /dev/null
+++ b/openstackclient/api/image_v2.py
@@ -0,0 +1,69 @@
+# 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.
+#
+
+"""Image v2 API Library"""
+
+from openstackclient.api import image_v1
+
+
+class APIv2(image_v1.APIv1):
+ """Image v2 API"""
+
+ def __init__(self, endpoint=None, **kwargs):
+ super(APIv2, self).__init__(endpoint=endpoint, **kwargs)
+
+ # Hack this until discovery is up, and ignore parent endpoint setting
+ self.endpoint = '/'.join([endpoint.rstrip('/'), 'v2'])
+
+ def image_list(
+ self,
+ detailed=False,
+ public=False,
+ private=False,
+ **filter
+ ):
+ """Get available images
+
+ can add limit/marker
+
+ :param detailed:
+ For v1 compatibility only, ignored as v2 is always 'detailed'
+ :param public:
+ Return public images if True
+ :param private:
+ Return private images if True
+
+ If public and private are both True or both False then all images are
+ returned. Both arguments False is equivalent to no filter and all
+ images are returned. Both arguments True is a filter that includes
+ both public and private images which is the same set as all images.
+
+ http://docs.openstack.org/api/openstack-image-service/2.0/content/list-images.html
+
+ TODO(dtroyer): Implement filtering
+ """
+
+ if public == private:
+ # No filtering for both False and both True cases
+ filter.pop('visibility', None)
+ elif public:
+ filter['visibility'] = 'public'
+ elif private:
+ filter['visibility'] = 'private'
+
+ url = "/images"
+ if detailed:
+ # Because we can't all use /details
+ url += "/detail"
+
+ return self.list(url, **filter)['images']