Author: tomaz
Date: Fri Jun 17 19:30:47 2011
New Revision: 1136999
URL: http://svn.apache.org/viewvc?rev=1136999&view=rev
Log:
Add tests for deployment functions.
Added:
libcloud/trunk/test/compute/fixtures/rackspace/v1_slug_servers_detail_deployment_missing.xml
libcloud/trunk/test/compute/fixtures/rackspace/v1_slug_servers_detail_deployment_pending.xml
libcloud/trunk/test/compute/fixtures/rackspace/v1_slug_servers_detail_deployment_same_uuid.xml
libcloud/trunk/test/compute/fixtures/rackspace/v1_slug_servers_detail_deployment_success.xml
Modified:
libcloud/trunk/test/compute/test_deployment.py
Added:
libcloud/trunk/test/compute/fixtures/rackspace/v1_slug_servers_detail_deployment_missing.xml
URL:
http://svn.apache.org/viewvc/libcloud/trunk/test/compute/fixtures/rackspace/v1_slug_servers_detail_deployment_missing.xml?rev=1136999&view=auto
==============================================================================
---
libcloud/trunk/test/compute/fixtures/rackspace/v1_slug_servers_detail_deployment_missing.xml
(added)
+++
libcloud/trunk/test/compute/fixtures/rackspace/v1_slug_servers_detail_deployment_missing.xml
Fri Jun 17 19:30:47 2011
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<servers xmlns="http://docs.rackspacecloud.com/servers/api/v1.0">
+ <server status="ACTIVE" progress="100"
hostId="9dd380940fcbe39cb30255ed4664f1f3" flavorId="1" imageId="11" id="11111"
name="racktest">
+ <metadata/>
+ <addresses>
+ <public>
+ <ip addr="67.23.21.33"/>
+ </public>
+ <private>
+ <ip addr="10.176.168.218"/>
+ </private>
+ </addresses>
+ </server>
+</servers>
Added:
libcloud/trunk/test/compute/fixtures/rackspace/v1_slug_servers_detail_deployment_pending.xml
URL:
http://svn.apache.org/viewvc/libcloud/trunk/test/compute/fixtures/rackspace/v1_slug_servers_detail_deployment_pending.xml?rev=1136999&view=auto
==============================================================================
---
libcloud/trunk/test/compute/fixtures/rackspace/v1_slug_servers_detail_deployment_pending.xml
(added)
+++
libcloud/trunk/test/compute/fixtures/rackspace/v1_slug_servers_detail_deployment_pending.xml
Fri Jun 17 19:30:47 2011
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<servers xmlns="http://docs.rackspacecloud.com/servers/api/v1.0">
+ <server status="BUILD" progress="100"
hostId="9dd380940fcbe39cb30255ed4664f1f3" flavorId="1" imageId="11" id="12345"
name="racktest">
+ <metadata/>
+ <addresses>
+ <public>
+ <ip addr="67.23.21.33"/>
+ </public>
+ <private>
+ <ip addr="10.176.168.218"/>
+ </private>
+ </addresses>
+ </server>
+</servers>
Added:
libcloud/trunk/test/compute/fixtures/rackspace/v1_slug_servers_detail_deployment_same_uuid.xml
URL:
http://svn.apache.org/viewvc/libcloud/trunk/test/compute/fixtures/rackspace/v1_slug_servers_detail_deployment_same_uuid.xml?rev=1136999&view=auto
==============================================================================
---
libcloud/trunk/test/compute/fixtures/rackspace/v1_slug_servers_detail_deployment_same_uuid.xml
(added)
+++
libcloud/trunk/test/compute/fixtures/rackspace/v1_slug_servers_detail_deployment_same_uuid.xml
Fri Jun 17 19:30:47 2011
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<servers xmlns="http://docs.rackspacecloud.com/servers/api/v1.0">
+ <server status="ACTIVE" progress="100"
hostId="9dd380940fcbe39cb30255ed4664f1f3" flavorId="1" imageId="11" id="12345"
name="racktest">
+ <metadata/>
+ <addresses>
+ <public>
+ <ip addr="67.23.21.33"/>
+ </public>
+ <private>
+ <ip addr="10.176.168.218"/>
+ </private>
+ </addresses>
+ </server>
+ <server status="ACTIVE" progress="100"
hostId="9dd380940fcbe39cb30255ed4664f1f3" flavorId="1" imageId="11" id="12345"
name="racktest">
+ <metadata/>
+ <addresses>
+ <public>
+ <ip addr="67.23.21.33"/>
+ </public>
+ <private>
+ <ip addr="10.176.168.218"/>
+ </private>
+ </addresses>
+ </server>
+
+</servers>
Added:
libcloud/trunk/test/compute/fixtures/rackspace/v1_slug_servers_detail_deployment_success.xml
URL:
http://svn.apache.org/viewvc/libcloud/trunk/test/compute/fixtures/rackspace/v1_slug_servers_detail_deployment_success.xml?rev=1136999&view=auto
==============================================================================
---
libcloud/trunk/test/compute/fixtures/rackspace/v1_slug_servers_detail_deployment_success.xml
(added)
+++
libcloud/trunk/test/compute/fixtures/rackspace/v1_slug_servers_detail_deployment_success.xml
Fri Jun 17 19:30:47 2011
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<servers xmlns="http://docs.rackspacecloud.com/servers/api/v1.0">
+ <server status="ACTIVE" progress="100"
hostId="9dd380940fcbe39cb30255ed4664f1f3" flavorId="1" imageId="11" id="12345"
name="racktest">
+ <metadata/>
+ <addresses>
+ <public>
+ <ip addr="67.23.21.33"/>
+ </public>
+ <private>
+ <ip addr="10.176.168.218"/>
+ </private>
+ </addresses>
+ </server>
+</servers>
Modified: libcloud/trunk/test/compute/test_deployment.py
URL:
http://svn.apache.org/viewvc/libcloud/trunk/test/compute/test_deployment.py?rev=1136999&r1=1136998&r2=1136999&view=diff
==============================================================================
--- libcloud/trunk/test/compute/test_deployment.py (original)
+++ libcloud/trunk/test/compute/test_deployment.py Fri Jun 17 19:30:47 2011
@@ -15,14 +15,23 @@
# limitations under the License.
import sys
+import time
import unittest
+import httplib
from libcloud.compute.deployment import MultiStepDeployment, Deployment
from libcloud.compute.deployment import SSHKeyDeployment, ScriptDeployment
from libcloud.compute.base import Node
-from libcloud.compute.types import NodeState
+from libcloud.compute.types import NodeState, DeploymentError, LibcloudError
from libcloud.compute.ssh import BaseSSHClient
from libcloud.compute.drivers.ec2 import EC2NodeDriver
+from libcloud.compute.drivers.rackspace import RackspaceNodeDriver as Rackspace
+
+from test import MockHttp
+from test.file_fixtures import ComputeFileFixtures
+from mock import Mock
+
+from test.secrets import RACKSPACE_USER, RACKSPACE_KEY
class MockDeployment(Deployment):
def run(self, node, client):
@@ -46,9 +55,12 @@ class MockClient(BaseSSHClient):
class DeploymentTests(unittest.TestCase):
def setUp(self):
- self.node = Node(id=1, name='test', state=NodeState.RUNNING,
+ Rackspace.connectionCls.conn_classes = (None, RackspaceMockHttp)
+ RackspaceMockHttp.type = None
+ self.driver = Rackspace(RACKSPACE_USER, RACKSPACE_KEY)
+ self.node = Node(id=12345, name='test', state=NodeState.RUNNING,
public_ip=['1.2.3.4'], private_ip='1.2.3.5',
- driver=EC2NodeDriver)
+ driver=Rackspace)
def test_multi_step_deployment(self):
msd = MultiStepDeployment()
@@ -108,6 +120,133 @@ class DeploymentTests(unittest.TestCase)
else:
self.fail('TypeError was not thrown')
+ def test_wait_until_running_running_instantly(self):
+ node2 = self.driver._wait_until_running(node=self.node, wait_period=1,
+ timeout=10)
+ self.assertEqual(self.node.uuid, node2.uuid)
+
+ def test_wait_until_running_running_after_1_second(self):
+ RackspaceMockHttp.type = '1_SECOND_DELAY'
+ node2 = self.driver._wait_until_running(node=self.node, wait_period=1,
+ timeout=10)
+ self.assertEqual(self.node.uuid, node2.uuid)
+
+ def test_wait_until_running_timeout(self):
+ RackspaceMockHttp.type = 'TIMEOUT'
+
+ try:
+ self.driver._wait_until_running(node=self.node, wait_period=0.5,
+ timeout=1)
+ except LibcloudError, e:
+ self.assertTrue(e.value.find('Timed out') != -1)
+ else:
+ self.fail('Exception was not thrown')
+
+
+ def test_wait_until_running_running_node_missing_from_list_nodes(self):
+ RackspaceMockHttp.type = 'MISSING'
+
+ try:
+ self.driver._wait_until_running(node=self.node, wait_period=0.5,
+ timeout=1)
+ except LibcloudError, e:
+ self.assertTrue(e.value.find('is missing from list_nodes') != -1)
+ else:
+ self.fail('Exception was not thrown')
+
+ def test_wait_until_running_running_multiple_nodes_have_same_uuid(self):
+ RackspaceMockHttp.type = 'SAME_UUID'
+
+ try:
+ self.driver._wait_until_running(node=self.node, wait_period=0.5,
+ timeout=1)
+ except LibcloudError, e:
+ self.assertTrue(e.value.find('multiple nodes have same UUID') !=
-1)
+ else:
+ self.fail('Exception was not thrown')
+
+
+ def test_ssh_client_connect_success(self):
+ mock_ssh_client = Mock()
+ mock_ssh_client.return_value = None
+
+ ssh_client =
self.driver._ssh_client_connect(ssh_client=mock_ssh_client,
+ timeout=10)
+ self.assertEqual(mock_ssh_client, ssh_client)
+
+ def test_ssh_client_connect_timeout(self):
+ mock_ssh_client = Mock()
+ mock_ssh_client.connect = Mock()
+ mock_ssh_client.connect.side_effect = IOError('bam')
+
+ try:
+ self.driver._ssh_client_connect(ssh_client=mock_ssh_client,
+ timeout=1)
+ except LibcloudError, e:
+ self.assertTrue(e.value.find('Giving up') != -1)
+ else:
+ self.fail('Exception was not thrown')
+
+ def test_run_deployment_script_success(self):
+ task = Mock()
+ ssh_client = Mock()
+
+ ssh_client2 = self.driver._run_deployment_script(task=task,
+ node=self.node,
+ ssh_client=ssh_client,
+ max_tries=2)
+ self.assertTrue(isinstance(ssh_client2, Mock))
+
+ def test_run_deployment_script_exception(self):
+ task = Mock()
+ task.run = Mock()
+ task.run.side_effect = Exception('bar')
+ ssh_client = Mock()
+
+ try:
+ self.driver._run_deployment_script(task=task,
+ node=self.node,
+ ssh_client=ssh_client,
+ max_tries=2)
+ except LibcloudError, e:
+ self.assertTrue(e.value.find('Failed after 2 tries') != -1)
+ else:
+ self.fail('Exception was not thrown')
+
+class RackspaceMockHttp(MockHttp):
+
+ fixtures = ComputeFileFixtures('rackspace')
+
+ # fake auth token response
+ def _v1_0(self, method, url, body, headers):
+ headers = {'x-server-management-url':
'https://servers.api.rackspacecloud.com/v1.0/slug',
+ 'x-auth-token': 'FE011C19-CF86-4F87-BE5D-9229145D7A06',
+ 'x-cdn-management-url':
'https://cdn.clouddrive.com/v1/MossoCloudFS_FE011C19-CF86-4F87-BE5D-9229145D7A06',
+ 'x-storage-token': 'FE011C19-CF86-4F87-BE5D-9229145D7A06',
+ 'x-storage-url':
'https://storage4.clouddrive.com/v1/MossoCloudFS_FE011C19-CF86-4F87-BE5D-9229145D7A06'}
+ return (httplib.NO_CONTENT, "", headers,
httplib.responses[httplib.NO_CONTENT])
+
+ def _v1_0_slug_servers_detail(self, method, url, body, headers):
+ body =
self.fixtures.load('v1_slug_servers_detail_deployment_success.xml')
+ return (httplib.OK, body, {}, httplib.responses[httplib.OK])
+
+ def _v1_0_slug_servers_detail_1_SECOND_DELAY(self, method, url, body,
headers):
+ time.sleep(1)
+ body =
self.fixtures.load('v1_slug_servers_detail_deployment_success.xml')
+ return (httplib.OK, body, {}, httplib.responses[httplib.OK])
+
+ def _v1_0_slug_servers_detail_TIMEOUT(self, method, url, body, headers):
+ body =
self.fixtures.load('v1_slug_servers_detail_deployment_pending.xml')
+ return (httplib.OK, body, {}, httplib.responses[httplib.OK])
+
+ def _v1_0_slug_servers_detail_MISSING(self, method, url, body, headers):
+ body =
self.fixtures.load('v1_slug_servers_detail_deployment_missing.xml')
+ return (httplib.OK, body, {}, httplib.responses[httplib.OK])
+
+ def _v1_0_slug_servers_detail_SAME_UUID(self, method, url, body, headers):
+ body =
self.fixtures.load('v1_slug_servers_detail_deployment_same_uuid.xml')
+ return (httplib.OK, body, {}, httplib.responses[httplib.OK])
+
if __name__ == '__main__':
sys.exit(unittest.main())