blob: 87cb403d8a057b24d9e781f3bfcc25d5a81524cf [file] [log] [blame]
chris fattarsi5098fa22012-04-17 13:27:00 -07001from tempest.common.rest_client import RestClient
Daryl Wallecked8bef32011-12-05 23:02:08 -06002from tempest import exceptions
Daryl Wallecke5b83d42011-11-10 14:39:02 -06003import json
4import time
5
6
chris fattarsi5098fa22012-04-17 13:27:00 -07007class ImagesClient(RestClient):
Daryl Wallecke5b83d42011-11-10 14:39:02 -06008
Daryl Walleck587385b2012-03-03 13:00:26 -06009 def __init__(self, config, username, password, auth_url, tenant_name=None):
chris fattarsi5098fa22012-04-17 13:27:00 -070010 super(ImagesClient, self).__init__(config, username, password,
11 auth_url, tenant_name)
12 self.service = self.config.compute.catalog_type
Daryl Walleck587385b2012-03-03 13:00:26 -060013 self.build_interval = self.config.compute.build_interval
14 self.build_timeout = self.config.compute.build_timeout
Daryl Wallecke5b83d42011-11-10 14:39:02 -060015
16 def create_image(self, server_id, name, meta=None):
17 """Creates an image of the original server"""
18
19 post_body = {
20 'createImage': {
21 'name': name,
22 }
23 }
24
25 if meta != None:
Daryl Walleck73a9e7a2011-11-15 17:43:31 -060026 post_body['createImage']['metadata'] = meta
Daryl Wallecke5b83d42011-11-10 14:39:02 -060027
28 post_body = json.dumps(post_body)
chris fattarsi5098fa22012-04-17 13:27:00 -070029 resp, body = self.post('servers/%s/action' %
Daryl Wallecke5b83d42011-11-10 14:39:02 -060030 str(server_id), post_body, self.headers)
Daryl Wallecke5b83d42011-11-10 14:39:02 -060031 return resp, body
32
33 def list_images(self, params=None):
34 """Returns a list of all images filtered by any parameters"""
35 url = 'images'
36 if params != None:
37 param_list = []
38 for param, value in params.iteritems():
39 param_list.append("%s=%s&" % (param, value))
40
41 url = "images?" + "".join(param_list)
42
chris fattarsi5098fa22012-04-17 13:27:00 -070043 resp, body = self.get(url)
Daryl Wallecke5b83d42011-11-10 14:39:02 -060044 body = json.loads(body)
Daryl Walleck73a9e7a2011-11-15 17:43:31 -060045 return resp, body['images']
Daryl Wallecke5b83d42011-11-10 14:39:02 -060046
47 def list_images_with_detail(self, params=None):
48 """Returns a detailed list of images filtered by any parameters"""
49 url = 'images/detail'
50 if params != None:
51 param_list = []
52 for param, value in params.iteritems():
53 param_list.append("%s=%s&" % (param, value))
54
55 url = "images/detail?" + "".join(param_list)
56
chris fattarsi5098fa22012-04-17 13:27:00 -070057 resp, body = self.get(url)
Daryl Wallecke5b83d42011-11-10 14:39:02 -060058 body = json.loads(body)
Daryl Walleck73a9e7a2011-11-15 17:43:31 -060059 return resp, body['images']
Daryl Wallecke5b83d42011-11-10 14:39:02 -060060
61 def get_image(self, image_id):
62 """Returns the details of a single image"""
chris fattarsi5098fa22012-04-17 13:27:00 -070063 resp, body = self.get("images/%s" % str(image_id))
Daryl Wallecke5b83d42011-11-10 14:39:02 -060064 body = json.loads(body)
65 return resp, body['image']
66
67 def delete_image(self, image_id):
68 """Deletes the provided image"""
chris fattarsi5098fa22012-04-17 13:27:00 -070069 return self.delete("images/%s" % str(image_id))
Daryl Wallecke5b83d42011-11-10 14:39:02 -060070
Daryl Walleck416af922011-11-22 22:28:33 -060071 def wait_for_image_resp_code(self, image_id, code):
72 """
73 Waits until the HTTP response code for the request matches the
74 expected value
75 """
chris fattarsi5098fa22012-04-17 13:27:00 -070076 resp, body = self.get("images/%s" % str(image_id))
Daryl Wallecke5b83d42011-11-10 14:39:02 -060077 start = int(time.time())
78
Daryl Walleck416af922011-11-22 22:28:33 -060079 while resp.status != code:
Daryl Wallecke5b83d42011-11-10 14:39:02 -060080 time.sleep(self.build_interval)
chris fattarsi5098fa22012-04-17 13:27:00 -070081 resp, body = self.get("images/%s" % str(image_id))
Daryl Wallecke5b83d42011-11-10 14:39:02 -060082
Daryl Walleck73a9e7a2011-11-15 17:43:31 -060083 if int(time.time()) - start >= self.build_timeout:
Katherine Elliott74f68512012-05-18 10:19:22 -060084 raise exceptions.TimeoutException
Daryl Walleck73a9e7a2011-11-15 17:43:31 -060085
86 def wait_for_image_status(self, image_id, status):
87 """Waits for an image to reach a given status."""
88 resp, image = self.get_image(image_id)
89 start = int(time.time())
90
91 while image['status'] != status:
92 time.sleep(self.build_interval)
93 resp, image = self.get_image(image_id)
94
95 if image['status'] == 'ERROR':
Katherine Elliott74f68512012-05-18 10:19:22 -060096 raise exceptions.AddImageException(image_id=image_id)
Daryl Wallecke5b83d42011-11-10 14:39:02 -060097
98 if int(time.time()) - start >= self.build_timeout:
Katherine Elliott74f68512012-05-18 10:19:22 -060099 raise exceptions.TimeoutException
Daryl Walleck73a9e7a2011-11-15 17:43:31 -0600100
101 def list_image_metadata(self, image_id):
Daryl Walleck416af922011-11-22 22:28:33 -0600102 """Lists all metadata items for an image"""
chris fattarsi5098fa22012-04-17 13:27:00 -0700103 resp, body = self.get("images/%s/metadata" % str(image_id))
Daryl Walleck73a9e7a2011-11-15 17:43:31 -0600104 body = json.loads(body)
Daryl Walleck416af922011-11-22 22:28:33 -0600105 return resp, body['metadata']
Daryl Walleck73a9e7a2011-11-15 17:43:31 -0600106
107 def set_image_metadata(self, image_id, meta):
Daryl Walleck416af922011-11-22 22:28:33 -0600108 """Sets the metadata for an image"""
Daryl Walleck73a9e7a2011-11-15 17:43:31 -0600109 post_body = json.dumps({'metadata': meta})
chris fattarsi5098fa22012-04-17 13:27:00 -0700110 resp, body = self.put('images/%s/metadata' %
Daryl Walleck73a9e7a2011-11-15 17:43:31 -0600111 str(image_id), post_body, self.headers)
112 body = json.loads(body)
Daryl Walleck416af922011-11-22 22:28:33 -0600113 return resp, body['metadata']
Daryl Walleck73a9e7a2011-11-15 17:43:31 -0600114
115 def update_image_metadata(self, image_id, meta):
Daryl Walleck416af922011-11-22 22:28:33 -0600116 """Updates the metadata for an image"""
Daryl Walleck73a9e7a2011-11-15 17:43:31 -0600117 post_body = json.dumps({'metadata': meta})
chris fattarsi5098fa22012-04-17 13:27:00 -0700118 resp, body = self.post('images/%s/metadata' %
Daryl Walleck73a9e7a2011-11-15 17:43:31 -0600119 str(image_id), post_body, self.headers)
120 body = json.loads(body)
Daryl Walleck416af922011-11-22 22:28:33 -0600121 return resp, body['metadata']
Daryl Walleck73a9e7a2011-11-15 17:43:31 -0600122
123 def get_image_metadata_item(self, image_id, key):
Daryl Walleck416af922011-11-22 22:28:33 -0600124 """Returns the value for a specific image metadata key"""
chris fattarsi5098fa22012-04-17 13:27:00 -0700125 resp, body = self.get("images/%s/metadata/%s" %
Daryl Walleck73a9e7a2011-11-15 17:43:31 -0600126 (str(image_id), key))
127 body = json.loads(body)
Daryl Walleck416af922011-11-22 22:28:33 -0600128 return resp, body['meta']
Daryl Walleck73a9e7a2011-11-15 17:43:31 -0600129
130 def set_image_metadata_item(self, image_id, key, meta):
Daryl Walleck416af922011-11-22 22:28:33 -0600131 """Sets the value for a specific image metadata key"""
Daryl Walleck73a9e7a2011-11-15 17:43:31 -0600132 post_body = json.dumps({'meta': meta})
chris fattarsi5098fa22012-04-17 13:27:00 -0700133 resp, body = self.put('images/%s/metadata/%s' %
Daryl Walleck416af922011-11-22 22:28:33 -0600134 (str(image_id), key), post_body,
135 self.headers)
Daryl Walleck73a9e7a2011-11-15 17:43:31 -0600136 body = json.loads(body)
Daryl Walleck416af922011-11-22 22:28:33 -0600137 return resp, body['meta']
Daryl Walleck73a9e7a2011-11-15 17:43:31 -0600138
139 def delete_image_metadata_item(self, image_id, key):
Daryl Walleck416af922011-11-22 22:28:33 -0600140 """Deletes a single image metadata key/value pair"""
chris fattarsi5098fa22012-04-17 13:27:00 -0700141 resp, body = self.delete("images/%s/metadata/%s" %
Daryl Walleck73a9e7a2011-11-15 17:43:31 -0600142 (str(image_id), key))
143 return resp, body