Added server details tests. Also re-added several files that somehow missed the initial commit
Change-Id: I23eb08d2589b5c513b38de2476e44d53f21a79a1
diff --git a/storm/services/nova/json/images_client.py b/storm/services/nova/json/images_client.py
new file mode 100644
index 0000000..87b205a
--- /dev/null
+++ b/storm/services/nova/json/images_client.py
@@ -0,0 +1,85 @@
+from storm.common import rest_client
+import json
+import time
+
+
+class ImagesClient(object):
+
+ def __init__(self, username, key, auth_url, tenant_name=None):
+ self.client = rest_client.RestClient(username, key,
+ auth_url, tenant_name)
+ self.headers = {'Content-Type': 'application/json',
+ 'Accept': 'application/json'}
+
+ def create_image(self, server_id, name, meta=None):
+ """Creates an image of the original server"""
+
+ post_body = {
+ 'createImage': {
+ 'name': name,
+ }
+ }
+
+ if meta != None:
+ post_body['metadata'] = meta
+
+ post_body = json.dumps(post_body)
+ resp, body = self.client.post('servers/%s/action' %
+ str(server_id), post_body, self.headers)
+ body = json.loads(body)
+ return resp, body
+
+ def list_images(self, params=None):
+ """Returns a list of all images filtered by any parameters"""
+ url = 'images'
+ if params != None:
+ param_list = []
+ for param, value in params.iteritems():
+ param_list.append("%s=%s&" % (param, value))
+
+ url = "images?" + "".join(param_list)
+
+ resp, body = self.client.get(url)
+ body = json.loads(body)
+ return resp, body
+
+ def list_images_with_detail(self, params=None):
+ """Returns a detailed list of images filtered by any parameters"""
+ url = 'images/detail'
+ if params != None:
+ param_list = []
+ for param, value in params.iteritems():
+ param_list.append("%s=%s&" % (param, value))
+
+ url = "images/detail?" + "".join(param_list)
+
+ resp, body = self.client.get(url)
+ body = json.loads(body)
+ return resp, body
+
+ def get_image(self, image_id):
+ """Returns the details of a single image"""
+ resp, body = self.client.get("images/%s" % str(image_id))
+ body = json.loads(body)
+ return resp, body['image']
+
+ def delete_image(self, image_id):
+ """Deletes the provided image"""
+ return self.client.delete("images/%s" % str(image_id))
+
+ def wait_for_image_status(self, image_id, status):
+ """Waits for an image to reach a given status"""
+ resp, body = self.get_image(image_id)
+ image_status = body['image']['status']
+ start = int(time.time())
+
+ while image_status != status:
+ time.sleep(self.build_interval)
+ resp, body = self.get_image(image_id)
+ image_status = body['image']['status']
+
+ if image_status == 'ERROR':
+ raise exceptions.TimeoutException
+
+ if int(time.time()) - start >= self.build_timeout:
+ raise exceptions.BuildErrorException