Initial import of tests from the Zodiac project. On suggestion from Westmaas, imported tests under the nova directory
(final naming TBD) to more quickly get them imported. To run these tests, execute 'nosetests nova/tests'.
I've also only submitted the most stable of the tests. More to come.

Change-Id: I2abd961992c02b27c4deaa9f11a49ba91c5b765d

Fixed config defaults

Change-Id: I90d5ea20167caddbec6b4cf51a0df9bb333514cb
diff --git a/storm/tests/test_servers.py b/storm/tests/test_servers.py
new file mode 100644
index 0000000..958da69
--- /dev/null
+++ b/storm/tests/test_servers.py
@@ -0,0 +1,118 @@
+from storm.common import ssh
+from nose.plugins.attrib import attr
+from storm import openstack
+from storm.common.utils.data_utils import rand_name
+import base64
+import storm.config
+import unittest2 as unittest
+
+
+class ServersTest(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
+        cls.ssh_timeout = cls.config.nova.ssh_timeout
+
+    @attr(type='smoke')
+    def test_create_delete_server(self):
+        meta = {'hello': 'world'}
+        accessIPv4 = '1.1.1.1'
+        accessIPv6 = '::babe:220.12.22.2'
+        name = rand_name('server')
+        file_contents = 'This is a test file.'
+        personality = [{'path': '/etc/test.txt',
+                       'contents': base64.b64encode(file_contents)}]
+        resp, server = self.client.create_server(name,
+                                                 self.image_ref,
+                                                 self.flavor_ref,
+                                                 meta=meta,
+                                                 accessIPv4=accessIPv4,
+                                                 accessIPv6=accessIPv6,
+                                                 personality=personality)
+
+        #Wait for the server to become active
+        self.client.wait_for_server_status(server['id'], 'ACTIVE')
+
+        #Verify the specified attributes are set correctly
+        resp, server = self.client.get_server(server['id'])
+        self.assertEqual('1.1.1.1', server['accessIPv4'])
+        self.assertEqual('::babe:220.12.22.2', server['accessIPv6'])
+        self.assertEqual(name, server['name'])
+        self.assertEqual(self.image_ref, server['image']['id'])
+        self.assertEqual(str(self.flavor_ref), server['flavor']['id'])
+
+        #Teardown
+        self.client.delete_server(self.id)
+
+    @attr(type='smoke')
+    def test_create_server_with_admin_password(self):
+        """
+        If an admin password is provided on server creation, the server's root
+        password should be set to that password.
+        """
+
+        name = rand_name('server')
+        resp, server = self.client.create_server(name, self.image_ref,
+                                                 self.flavor_ref,
+                                                 adminPass='testpassword')
+
+        #Verify the password is set correctly in the response
+        self.assertEqual('testpassword', server['adminPass'])
+
+        #SSH into the server using the set password
+        self.client.wait_for_server_status(server['id'], 'ACTIVE')
+        resp, addresses = self.client.list_addresses(server['id'])
+        ip = addresses['public'][0]['addr']
+
+        client = ssh.Client(ip, 'root', 'testpassword', self.ssh_timeout)
+        self.assertTrue(client.test_connection_auth())
+
+        #Teardown
+        self.client.delete_server(server['id'])
+
+    @attr(type='smoke')
+    def test_update_server_name(self):
+        """ The server name should be changed to the the provided value """
+        name = rand_name('server')
+        resp, server = self.client.create_server(name, self.image_ref,
+                                                 self.flavor_ref)
+        self.client.wait_for_server_status(server['id'], 'ACTIVE')
+
+        #Update the server with a new name
+        self.client.update_server(server['id'], name='newname')
+        self.client.wait_for_server_status(server['id'], 'ACTIVE')
+
+        #Verify the name of the server has changed
+        resp, server = self.client.get_server(server['id'])
+        self.assertEqual('newname', server['name'])
+
+        #Teardown
+        self.client.delete_server(server['id'])
+
+    @attr(type='smoke')
+    def test_update_access_server_address(self):
+        """
+        The server's access addresses should reflect the provided values
+        """
+        name = rand_name('server')
+        resp, server = self.client.create_server(name, self.image_ref,
+                                                 self.flavor_ref)
+        self.client.wait_for_server_status(server['id'], 'ACTIVE')
+
+        #Update the IPv4 and IPv6 access addresses
+        self.client.update_server(server['id'], accessIPv4='1.1.1.1',
+                                  accessIPv6='::babe:2.2.2.2')
+        self.client.wait_for_server_status(server['id'], 'ACTIVE')
+
+        #Verify the access addresses have been updated
+        resp, server = self.client.get_server(server['id'])
+        self.assertEqual('1.1.1.1', server['accessIPv4'])
+        self.assertEqual('::babe:2.2.2.2', server['accessIPv6'])
+
+        #Teardown
+        self.client.delete_server(server['id'])