blob: 30aa96253ea8782dc3e28e4a45586f43d25f1aa1 [file] [log] [blame]
ZhiQiang Fan39f97222013-09-20 04:49:44 +08001# Copyright 2012 OpenStack Foundation
dwallecke62b9f02012-10-10 23:34:42 -05002# All Rights Reserved.
3#
4# Licensed under the Apache License, Version 2.0 (the "License"); you may
5# not use this file except in compliance with the License. You may obtain
6# a copy of the License at
7#
8# http://www.apache.org/licenses/LICENSE-2.0
9#
10# Unless required by applicable law or agreed to in writing, software
11# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13# License for the specific language governing permissions and limitations
14# under the License.
15
Daryl Wallecke5b83d42011-11-10 14:39:02 -060016import json
Daryl Wallecke5b83d42011-11-10 14:39:02 -060017
Matthew Treinish89128142015-04-23 10:44:30 -040018from six.moves.urllib import parse as urllib
Masayuki Igawabfa07602015-01-20 18:47:17 +090019from tempest_lib import exceptions as lib_exc
20
ghanshyamaa93b4b2015-03-20 11:03:44 +090021from tempest.api_schema.response.compute.v2_1 import images as schema
David Kranza5299eb2015-01-15 17:24:05 -050022from tempest.common import service_client
Matt Riedemannc00f3262013-12-14 12:03:55 -080023from tempest.common import waiters
Matthew Treinish684d8992014-01-30 16:27:40 +000024
Daryl Wallecke5b83d42011-11-10 14:39:02 -060025
Ken'ichi Ohmichi4771cbc2015-01-19 23:45:23 +000026class ImagesClientJSON(service_client.ServiceClient):
Daryl Wallecke5b83d42011-11-10 14:39:02 -060027
28 def create_image(self, server_id, name, meta=None):
Sean Daguef237ccb2013-01-04 15:19:14 -050029 """Creates an image of the original server."""
Daryl Wallecke5b83d42011-11-10 14:39:02 -060030
31 post_body = {
32 'createImage': {
33 'name': name,
34 }
35 }
36
Zhongyue Luoe471d6e2012-09-17 17:02:43 +080037 if meta is not None:
Daryl Walleck73a9e7a2011-11-15 17:43:31 -060038 post_body['createImage']['metadata'] = meta
Daryl Wallecke5b83d42011-11-10 14:39:02 -060039
40 post_body = json.dumps(post_body)
Zhongyue Luoe0884a32012-09-25 17:24:17 +080041 resp, body = self.post('servers/%s/action' % str(server_id),
vponomaryovf4c27f92014-02-18 10:56:42 +020042 post_body)
Ghanshyamfa9d39f2014-03-28 12:38:43 +090043 self.validate_response(schema.create_image, resp, body)
David Kranza5299eb2015-01-15 17:24:05 -050044 return service_client.ResponseBody(resp, body)
Daryl Wallecke5b83d42011-11-10 14:39:02 -060045
46 def list_images(self, params=None):
Sean Daguef237ccb2013-01-04 15:19:14 -050047 """Returns a list of all images filtered by any parameters."""
Daryl Wallecke5b83d42011-11-10 14:39:02 -060048 url = 'images'
Matthew Treinish26dd0fa2012-12-04 17:14:37 -050049 if params:
50 url += '?%s' % urllib.urlencode(params)
Daryl Wallecke5b83d42011-11-10 14:39:02 -060051
chris fattarsi5098fa22012-04-17 13:27:00 -070052 resp, body = self.get(url)
Daryl Wallecke5b83d42011-11-10 14:39:02 -060053 body = json.loads(body)
Ghanshyamfb67f062014-03-24 10:20:57 +090054 self.validate_response(schema.list_images, resp, body)
David Kranza5299eb2015-01-15 17:24:05 -050055 return service_client.ResponseBodyList(resp, body['images'])
Daryl Wallecke5b83d42011-11-10 14:39:02 -060056
57 def list_images_with_detail(self, params=None):
Sean Daguef237ccb2013-01-04 15:19:14 -050058 """Returns a detailed list of images filtered by any parameters."""
Daryl Wallecke5b83d42011-11-10 14:39:02 -060059 url = 'images/detail'
Matthew Treinish26dd0fa2012-12-04 17:14:37 -050060 if params:
61 url += '?%s' % urllib.urlencode(params)
Daryl Wallecke5b83d42011-11-10 14:39:02 -060062
chris fattarsi5098fa22012-04-17 13:27:00 -070063 resp, body = self.get(url)
Daryl Wallecke5b83d42011-11-10 14:39:02 -060064 body = json.loads(body)
Ghanshyam2b14d422014-03-24 10:46:33 +090065 self.validate_response(schema.list_images_details, resp, body)
David Kranza5299eb2015-01-15 17:24:05 -050066 return service_client.ResponseBodyList(resp, body['images'])
Daryl Wallecke5b83d42011-11-10 14:39:02 -060067
Ken'ichi Ohmichi5d410762015-05-22 01:10:03 +000068 def show_image(self, image_id):
Sean Daguef237ccb2013-01-04 15:19:14 -050069 """Returns the details of a single image."""
chris fattarsi5098fa22012-04-17 13:27:00 -070070 resp, body = self.get("images/%s" % str(image_id))
TimurNurlygayanov8f798502014-08-08 15:09:32 +040071 self.expected_success(200, resp.status)
Daryl Wallecke5b83d42011-11-10 14:39:02 -060072 body = json.loads(body)
Ghanshyamd34326c2014-03-19 12:18:53 +090073 self.validate_response(schema.get_image, resp, body)
David Kranza5299eb2015-01-15 17:24:05 -050074 return service_client.ResponseBody(resp, body['image'])
Daryl Wallecke5b83d42011-11-10 14:39:02 -060075
76 def delete_image(self, image_id):
Sean Daguef237ccb2013-01-04 15:19:14 -050077 """Deletes the provided image."""
Ghanshyamfa9d39f2014-03-28 12:38:43 +090078 resp, body = self.delete("images/%s" % str(image_id))
79 self.validate_response(schema.delete, resp, body)
David Kranza5299eb2015-01-15 17:24:05 -050080 return service_client.ResponseBody(resp, body)
Daryl Wallecke5b83d42011-11-10 14:39:02 -060081
Daryl Walleck73a9e7a2011-11-15 17:43:31 -060082 def wait_for_image_status(self, image_id, status):
83 """Waits for an image to reach a given status."""
Matt Riedemannc00f3262013-12-14 12:03:55 -080084 waiters.wait_for_image_status(self, image_id, status)
Daryl Walleck73a9e7a2011-11-15 17:43:31 -060085
86 def list_image_metadata(self, image_id):
Sean Daguef237ccb2013-01-04 15:19:14 -050087 """Lists all metadata items for an image."""
chris fattarsi5098fa22012-04-17 13:27:00 -070088 resp, body = self.get("images/%s/metadata" % str(image_id))
Daryl Walleck73a9e7a2011-11-15 17:43:31 -060089 body = json.loads(body)
Ghanshyamf7873b02014-03-28 12:50:57 +090090 self.validate_response(schema.image_metadata, resp, body)
David Kranza5299eb2015-01-15 17:24:05 -050091 return service_client.ResponseBody(resp, body['metadata'])
Daryl Walleck73a9e7a2011-11-15 17:43:31 -060092
93 def set_image_metadata(self, image_id, meta):
Sean Daguef237ccb2013-01-04 15:19:14 -050094 """Sets the metadata for an image."""
Daryl Walleck73a9e7a2011-11-15 17:43:31 -060095 post_body = json.dumps({'metadata': meta})
vponomaryovf4c27f92014-02-18 10:56:42 +020096 resp, body = self.put('images/%s/metadata' % str(image_id), post_body)
Daryl Walleck73a9e7a2011-11-15 17:43:31 -060097 body = json.loads(body)
Ghanshyamf7873b02014-03-28 12:50:57 +090098 self.validate_response(schema.image_metadata, resp, body)
David Kranza5299eb2015-01-15 17:24:05 -050099 return service_client.ResponseBody(resp, body['metadata'])
Daryl Walleck73a9e7a2011-11-15 17:43:31 -0600100
101 def update_image_metadata(self, image_id, meta):
Sean Daguef237ccb2013-01-04 15:19:14 -0500102 """Updates the metadata for an image."""
Daryl Walleck73a9e7a2011-11-15 17:43:31 -0600103 post_body = json.dumps({'metadata': meta})
vponomaryovf4c27f92014-02-18 10:56:42 +0200104 resp, body = self.post('images/%s/metadata' % str(image_id), post_body)
Daryl Walleck73a9e7a2011-11-15 17:43:31 -0600105 body = json.loads(body)
Ghanshyamf7873b02014-03-28 12:50:57 +0900106 self.validate_response(schema.image_metadata, resp, body)
David Kranza5299eb2015-01-15 17:24:05 -0500107 return service_client.ResponseBody(resp, body['metadata'])
Daryl Walleck73a9e7a2011-11-15 17:43:31 -0600108
109 def get_image_metadata_item(self, image_id, key):
Sean Daguef237ccb2013-01-04 15:19:14 -0500110 """Returns the value for a specific image metadata key."""
Zhongyue Luoe0884a32012-09-25 17:24:17 +0800111 resp, body = self.get("images/%s/metadata/%s" % (str(image_id), key))
Daryl Walleck73a9e7a2011-11-15 17:43:31 -0600112 body = json.loads(body)
Ghanshyam76c00f02014-03-28 13:02:22 +0900113 self.validate_response(schema.image_meta_item, resp, body)
David Kranza5299eb2015-01-15 17:24:05 -0500114 return service_client.ResponseBody(resp, body['meta'])
Daryl Walleck73a9e7a2011-11-15 17:43:31 -0600115
116 def set_image_metadata_item(self, image_id, key, meta):
Sean Daguef237ccb2013-01-04 15:19:14 -0500117 """Sets the value for a specific image metadata key."""
Daryl Walleck73a9e7a2011-11-15 17:43:31 -0600118 post_body = json.dumps({'meta': meta})
Zhongyue Luoe0884a32012-09-25 17:24:17 +0800119 resp, body = self.put('images/%s/metadata/%s' % (str(image_id), key),
vponomaryovf4c27f92014-02-18 10:56:42 +0200120 post_body)
Daryl Walleck73a9e7a2011-11-15 17:43:31 -0600121 body = json.loads(body)
Ghanshyam76c00f02014-03-28 13:02:22 +0900122 self.validate_response(schema.image_meta_item, resp, body)
David Kranza5299eb2015-01-15 17:24:05 -0500123 return service_client.ResponseBody(resp, body['meta'])
Daryl Walleck73a9e7a2011-11-15 17:43:31 -0600124
125 def delete_image_metadata_item(self, image_id, key):
Sean Daguef237ccb2013-01-04 15:19:14 -0500126 """Deletes a single image metadata key/value pair."""
chris fattarsi5098fa22012-04-17 13:27:00 -0700127 resp, body = self.delete("images/%s/metadata/%s" %
Zhongyue Luoe0884a32012-09-25 17:24:17 +0800128 (str(image_id), key))
Ghanshyamfa9d39f2014-03-28 12:38:43 +0900129 self.validate_response(schema.delete, resp, body)
David Kranza5299eb2015-01-15 17:24:05 -0500130 return service_client.ResponseBody(resp, body)
Matthew Treinish0d660492013-06-04 17:26:09 -0400131
132 def is_resource_deleted(self, id):
133 try:
Ken'ichi Ohmichi5d410762015-05-22 01:10:03 +0000134 self.show_image(id)
Masayuki Igawabfa07602015-01-20 18:47:17 +0900135 except lib_exc.NotFound:
Matthew Treinish0d660492013-06-04 17:26:09 -0400136 return True
137 return False
Matt Riedemannd2b96512014-10-13 10:18:16 -0700138
139 @property
140 def resource_type(self):
141 """Returns the primary type of resource this client works with."""
142 return 'image'