diff options
| author | Dean Troyer <dtroyer@gmail.com> | 2014-09-18 00:56:38 -0500 |
|---|---|---|
| committer | Dean Troyer <dtroyer@gmail.com> | 2015-01-20 17:01:23 -0600 |
| commit | 1ecf1bee2d5c1566533cdd8fad99733ea8336aa8 (patch) | |
| tree | aaf60bd664d98b17dbb703f7b14fb681ccf24aaf /openstackclient/api | |
| parent | 95fe3fda3d041a4fa761040c80214d4ca5f29aaa (diff) | |
| download | python-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.py | 2 | ||||
| -rw-r--r-- | openstackclient/api/image_v1.py | 68 | ||||
| -rw-r--r-- | openstackclient/api/image_v2.py | 69 |
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'] |
