Added server metadata and image tests. Also added a README for storm.conf

Change-Id: Ic67e7bfccf0e9b45dba24584e9326a27537f3cae
diff --git a/storm/tests/test_images.py b/storm/tests/test_images.py
new file mode 100644
index 0000000..e11dc47
--- /dev/null
+++ b/storm/tests/test_images.py
@@ -0,0 +1,67 @@
+from nose.plugins.attrib import attr
+from storm import openstack
+from storm.common.utils.data_utils import rand_name
+import unittest2 as unittest
+import storm.config
+
+
+class ImagesTest(unittest.TestCase):
+    create_image_enabled = storm.config.StormConfig().env.create_image_enabled
+
+    @classmethod
+    def setUpClass(cls):
+        cls.os = openstack.Manager()
+        cls.client = cls.os.images_client
+        cls.servers_client = cls.os.servers_client
+        cls.config = storm.config.StormConfig()
+        cls.image_ref = cls.config.env.image_ref
+        cls.flavor_ref = cls.config.env.flavor_ref
+
+    def _parse_image_id(self, image_ref):
+        temp = image_ref.rsplit('/')
+        return temp[6]
+
+    @unittest.skipIf(not create_image_enabled,
+                    'Environment unable to create images.')
+    def test_create_delete_image(self):
+        """An image for the provided server should be created"""
+        server_name = rand_name('server')
+        resp, server = self.servers_client.create_server(server_name,
+                                                         self.image_ref,
+                                                         self.flavor_ref)
+        self.servers_client.wait_for_server_status(server['id'], 'ACTIVE')
+
+        #Create a new image
+        name = rand_name('image')
+        resp, body = self.client.create_image(server['id'], name)
+        image_id = self._parse_image_id(resp['location'])
+        self.client.wait_for_image_exists(image_id)
+        self.client.wait_for_image_status(image_id, 'ACTIVE')
+
+        #Verify the image was created correctly
+        resp, image = self.client.get_image(image_id)
+        self.assertEqual(name, image['name'])
+
+        #Teardown
+        self.client.delete_image(image['id'])
+        self.servers_client.delete_server(server['id'])
+
+    @attr(type='smoke')
+    def test_get_image(self):
+        """Returns the correct details for a single image"""
+        resp, image = self.client.get_image(self.image_ref)
+        self.assertEqual(self.image_ref, image['id'])
+
+    @attr(type='smoke')
+    def test_list_images(self):
+        """The list of all images should contain the image flavor"""
+        resp, images = self.client.list_images()
+        found = any([i for i in images if i['id'] == self.image_ref])
+        self.assertTrue(found)
+
+    @attr(type='smoke')
+    def test_list_images_with_detail(self):
+        """Detailed list of all images should contain the expected image"""
+        resp, images = self.client.list_images_with_detail()
+        found = any([i for i in images if i['id'] == self.image_ref])
+        self.assertTrue(found)
diff --git a/storm/tests/test_server_metadata.py b/storm/tests/test_server_metadata.py
new file mode 100644
index 0000000..3b569f6
--- /dev/null
+++ b/storm/tests/test_server_metadata.py
@@ -0,0 +1,132 @@
+from nose.plugins.attrib import attr
+from storm import openstack
+from storm.common.utils.data_utils import rand_name
+import unittest2 as unittest
+import storm.config
+
+
+class ServerMetadataTest(unittest.TestCase):
+
+    @classmethod
+    def setUpClass(cls):
+        cls.os = openstack.Manager()
+        cls.client = cls.os.servers_client
+        cls.config = storm.config.StormConfig()
+        cls.image_ref = cls.config.env.image_ref
+        cls.flavor_ref = cls.config.env.flavor_ref
+
+        #Create a server to be used for all read only tests
+        cls.meta = {'test1': 'value1', 'test2': 'value2'}
+        name = rand_name('server')
+        resp, cls.server = cls.client.create_server(name, cls.image_ref,
+                                                cls.flavor_ref, meta=cls.meta)
+
+        #Wait for the server to become active
+        cls.client.wait_for_server_status(cls.server['id'], 'ACTIVE')
+
+    @classmethod
+    def tearDownClass(cls):
+        cls.client.delete_server(cls.server['id'])
+
+    def test_list_server_metadata(self):
+        """All metadata key/value pairs for a server should be returned"""
+        resp, metadata = self.client.list_server_metadata(self.server['id'])
+
+        #Verify the expected metadata items are in the list
+        self.assertEqual(200, resp.status)
+        self.assertEqual('value1', metadata['test1'])
+        self.assertEqual('value2', metadata['test2'])
+
+    def test_set_server_metadata(self):
+        """The server's metadata should be replaced with the provided values"""
+        meta = {'meta1': 'data1'}
+        name = rand_name('server')
+        resp, server = self.client.create_server(name, self.image_ref,
+                                                self.flavor_ref, meta=meta)
+        self.client.wait_for_server_status(server['id'], 'ACTIVE')
+
+        #Create a new set of metadata for the server
+        meta = {'meta2': 'data2', 'meta3': 'data3'}
+        resp, metadata = self.client.set_server_metadata(server['id'], meta)
+        self.assertEqual(200, resp.status)
+
+        #Verify the expected values are correct, and that the
+        #previous values have been removed
+        resp, body = self.client.list_server_metadata(server['id'])
+        self.assertEqual('data2', metadata['meta2'])
+        self.assertEqual('data3', metadata['meta3'])
+        self.assertTrue('meta1' not in metadata)
+
+        #Teardown
+        self.client.delete_server(server['id'])
+
+    def test_update_server_metadata(self):
+        """
+        The server's metadata values should be updated to the
+        provided values
+        """
+        meta = {'key1': 'value1', 'key2': 'value2'}
+        name = rand_name('server')
+        resp, server = self.client.create_server(name, self.image_ref,
+                                                self.flavor_ref, meta=meta)
+        self.client.wait_for_server_status(server['id'], 'ACTIVE')
+
+        #Update all metadata items for the server
+        meta = {'key1': 'alt1', 'key2': 'alt2'}
+        resp, metadata = self.client.update_server_metadata(server['id'], meta)
+        self.assertEqual(200, resp.status)
+
+        #Verify the values have been updated to the proper values
+        resp, body = self.client.list_server_metadata(server['id'])
+        self.assertEqual('alt1', metadata['key1'])
+        self.assertEqual('alt2', metadata['key2'])
+
+        #Teardown
+        self.client.delete_server(server['id'])
+
+    def test_get_server_metadata_item(self):
+        """ The value for a specic metadata key should be returned """
+        resp, meta = self.client.get_server_metadata_item(self.server['id'],
+                                                          'test2')
+        self.assertTrue('value2', meta['test2'])
+
+    def test_set_server_metadata_item(self):
+        """The item's value should be updated to the provided value"""
+        meta = {'nova': 'server'}
+        name = rand_name('server')
+        resp, server = self.client.create_server(name, self.image_ref,
+                                                self.flavor_ref, meta=meta)
+        self.client.wait_for_server_status(server['id'], 'ACTIVE')
+
+        #Update the metadata value
+        meta = {'nova': 'alt'}
+        resp, body = self.client.set_server_metadata_item(server['id'],
+                                                          'nova', meta)
+        self.assertEqual(200, resp.status)
+
+        #Verify the meta item's value has been updated
+        resp, body = self.client.list_server_metadata(server['id'])
+        self.assertEqual('alt', metadata['nova'])
+
+        #Teardown
+        self.client.delete_server(server.id)
+
+    def test_delete_server_metadata_item(self):
+        """The metadata value/key pair should be deleted from the server"""
+        meta = {'delkey': 'delvalue'}
+        name = rand_name('server')
+        resp, server = self.client.create_server(name, self.image_ref,
+                                                self.flavor_ref, meta=meta)
+        self.client.wait_for_server_status(server['id'], 'ACTIVE')
+
+        #Delete the metadata item
+        resp, metadata = self.client.delete_server_metadata_item(server['id'],
+                                                                 'delkey')
+        self.assertEqual(204, resp.status)
+
+        #Verify the metadata item has been removed
+        resp, metadata = self.client.list_server_metadata(server['id'])
+        self.assertTrue('delkey' not in metadata)
+
+        #Teardown
+        self.client.delete_server(server['id'])