You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@libcloud.apache.org by to...@apache.org on 2013/10/26 00:34:40 UTC
[1/4] Issue LIBCLOUD-358: Add compute driver for CloudFounders
CloudFrames.
Updated Branches:
refs/heads/trunk 32087bf56 -> 268ff0ef9
http://git-wip-us.apache.org/repos/asf/libcloud/blob/8639c4e3/libcloud/test/compute/fixtures/cloudframes/_machine_reboot.xml
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/cloudframes/_machine_reboot.xml b/libcloud/test/compute/fixtures/cloudframes/_machine_reboot.xml
new file mode 100644
index 0000000..e8780a3
--- /dev/null
+++ b/libcloud/test/compute/fixtures/cloudframes/_machine_reboot.xml
@@ -0,0 +1,17 @@
+<?xml version='1.0'?>
+<methodResponse>
+<params>
+<param>
+<value><struct>
+<member>
+<name>jobguid</name>
+<value><string>ab93fcb6-6b5d-4248-a627-efba9f4d76c7</string></value>
+</member>
+<member>
+<name>result</name>
+<value><boolean>1</boolean></value>
+</member>
+</struct></value>
+</param>
+</params>
+</methodResponse>
http://git-wip-us.apache.org/repos/asf/libcloud/blob/8639c4e3/libcloud/test/compute/fixtures/cloudframes/_machine_rollback.xml
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/cloudframes/_machine_rollback.xml b/libcloud/test/compute/fixtures/cloudframes/_machine_rollback.xml
new file mode 100644
index 0000000..d104a0e
--- /dev/null
+++ b/libcloud/test/compute/fixtures/cloudframes/_machine_rollback.xml
@@ -0,0 +1,17 @@
+<?xml version='1.0'?>
+<methodResponse>
+<params>
+<param>
+<value><struct>
+<member>
+<name>jobguid</name>
+<value><string>ababacb6-7a5d-4248-a627-efba9f4d76c7</string></value>
+</member>
+<member>
+<name>result</name>
+<value><boolean>1</boolean></value>
+</member>
+</struct></value>
+</param>
+</params>
+</methodResponse>
http://git-wip-us.apache.org/repos/asf/libcloud/blob/8639c4e3/libcloud/test/compute/fixtures/cloudframes/_machine_snapshot.xml
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/cloudframes/_machine_snapshot.xml b/libcloud/test/compute/fixtures/cloudframes/_machine_snapshot.xml
new file mode 100644
index 0000000..e417d54
--- /dev/null
+++ b/libcloud/test/compute/fixtures/cloudframes/_machine_snapshot.xml
@@ -0,0 +1,17 @@
+<?xml version='1.0'?>
+<methodResponse>
+<params>
+<param>
+<value><struct>
+<member>
+<name>jobguid</name>
+<value><string>16556e13-a2f9-492c-b094-dc62bc7d2cc9</string></value>
+</member>
+<member>
+<name>result</name>
+<value><string>5c00bd9e-6c18-4bee-83bf-5ff14426868a</string></value>
+</member>
+</struct></value>
+</param>
+</params>
+</methodResponse>
http://git-wip-us.apache.org/repos/asf/libcloud/blob/8639c4e3/libcloud/test/compute/fixtures/cloudframes/_machine_start.xml
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/cloudframes/_machine_start.xml b/libcloud/test/compute/fixtures/cloudframes/_machine_start.xml
new file mode 100644
index 0000000..a9b50ed
--- /dev/null
+++ b/libcloud/test/compute/fixtures/cloudframes/_machine_start.xml
@@ -0,0 +1,17 @@
+<?xml version='1.0'?>
+<methodResponse>
+<params>
+<param>
+<value><struct>
+<member>
+<name>jobguid</name>
+<value><string>ab93fcb6-7a5d-4248-a627-efba9f4d76c7</string></value>
+</member>
+<member>
+<name>result</name>
+<value><boolean>1</boolean></value>
+</member>
+</struct></value>
+</param>
+</params>
+</methodResponse>
http://git-wip-us.apache.org/repos/asf/libcloud/blob/8639c4e3/libcloud/test/compute/fixtures/cloudframes/_machine_stop.xml
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/cloudframes/_machine_stop.xml b/libcloud/test/compute/fixtures/cloudframes/_machine_stop.xml
new file mode 100644
index 0000000..a9b50ed
--- /dev/null
+++ b/libcloud/test/compute/fixtures/cloudframes/_machine_stop.xml
@@ -0,0 +1,17 @@
+<?xml version='1.0'?>
+<methodResponse>
+<params>
+<param>
+<value><struct>
+<member>
+<name>jobguid</name>
+<value><string>ab93fcb6-7a5d-4248-a627-efba9f4d76c7</string></value>
+</member>
+<member>
+<name>result</name>
+<value><boolean>1</boolean></value>
+</member>
+</struct></value>
+</param>
+</params>
+</methodResponse>
http://git-wip-us.apache.org/repos/asf/libcloud/blob/8639c4e3/libcloud/test/compute/test_cloudframes.py
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/test_cloudframes.py b/libcloud/test/compute/test_cloudframes.py
new file mode 100644
index 0000000..84441db
--- /dev/null
+++ b/libcloud/test/compute/test_cloudframes.py
@@ -0,0 +1,293 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import sys
+import uuid
+import base64
+import unittest
+import datetime
+
+from libcloud.compute.base import Node, NodeImage, NodeLocation
+from libcloud.compute.types import NodeState
+from libcloud.compute.drivers.cloudframes import CloudFramesNodeDriver
+from libcloud.compute.drivers.cloudframes import CloudFramesSnapshot
+from libcloud.compute.drivers.cloudframes import CloudFramesException
+
+from libcloud.utils.py3 import httplib, xmlrpclib, b
+from libcloud.test import MockHttpTestCase
+from libcloud.test.compute import TestCaseMixin
+from libcloud.test.secrets import CLOUDFRAMES_PARAMS
+from libcloud.test.file_fixtures import ComputeFileFixtures
+
+
+# how many seconds to give the vm to boot and have VMWare tools start up
+START_TIMEOUT = 300
+
+
+class CloudFramesMockHttp(MockHttpTestCase):
+ fixtures = ComputeFileFixtures('cloudframes')
+
+ content_headers = {
+ 'Server': 'TwistedWeb/9.0.0',
+ 'Date': datetime.datetime.now().ctime(),
+ 'Content-Type': 'text/xml',
+ }
+
+ def __getattr__(self, key):
+ if key == '_appserver_xmlrpc_http:__host:8888_appserver_xmlrpc':
+ return self._xmlrpc
+ raise AttributeError(key)
+
+ def _xmlrpc(self, method, url, body, headers):
+ params, methodname = xmlrpclib.loads(body)
+ meth_name = methodname.replace('.', '_').replace('cloud_api_', '')
+ return getattr(self, meth_name)(method, url, params, headers)
+
+ def _authenticate(self, headers):
+ self.assertTrue('Authorization' in headers.keys())
+ self.assertTrue(headers['Authorization'].startswith('Basic '))
+ auth = base64.b64decode(
+ b(headers['Authorization'].split(' ', 1)[1])).decode('ascii')
+ username, password = auth.split(':', 1)
+ self.assertEqual(username, CLOUDFRAMES_PARAMS[0])
+ self.assertEqual(password, CLOUDFRAMES_PARAMS[1])
+
+ def cloudspace_find(self, method, url, params, headers):
+ self._authenticate(headers)
+ body = self.fixtures.load('_cloudspace_find.xml')
+ return (httplib.OK, body, self.content_headers,
+ httplib.responses[httplib.OK])
+
+ def machine_find(self, method, url, params, headers):
+ self._authenticate(headers)
+ if params[18]:
+ body = self.fixtures.load('_machine_find_templates.xml')
+ elif params[17] == 'PHYSICAL':
+ body = self.fixtures.load('_machine_find_physical.xml')
+ elif params[17] == 'VIRTUALSERVER':
+ body = self.fixtures.load('_machine_find_virtualserver.xml')
+ elif params[17] == 'VIRTUALDESKTOP':
+ body = self.fixtures.load('_machine_find_virtualdesktop.xml')
+ else:
+ raise Exception(
+ 'unknown machine.find query with params: %s' % params)
+ return (httplib.OK, body, self.content_headers,
+ httplib.responses[httplib.OK])
+
+ def machine_list(self, method, url, params, headers):
+ self._authenticate(headers)
+ body = None
+ if params[3]:
+ body = self.fixtures.load(
+ '_machine_list_machineguid_%s.xml' % params[3])
+ if body:
+ return (httplib.OK, body, self.content_headers,
+ httplib.responses[httplib.OK])
+ else:
+ return (httplib.INTERNAL_SERVER_ERROR, '',
+ self.content_headers, 'Could not parse request')
+
+ def machine_delete(self, method, url, params, headers):
+ self._authenticate(headers)
+ body = self.fixtures.load('_machine_delete.xml')
+ return (httplib.OK, body, self.content_headers,
+ httplib.responses[httplib.OK])
+
+ def machine_stop(self, method, url, params, headers):
+ self._authenticate(headers)
+ body = self.fixtures.load('_machine_stop.xml')
+ return (httplib.OK, body, self.content_headers,
+ httplib.responses[httplib.OK])
+
+ def machine_reboot(self, method, url, params, headers):
+ self._authenticate(headers)
+ body = self.fixtures.load('_machine_reboot.xml')
+ return (httplib.OK, body, self.content_headers,
+ httplib.responses[httplib.OK])
+
+ def machine_createFromTemplate(self, method, url, params, headers):
+ self._authenticate(headers)
+ body = self.fixtures.load('_machine_createFromTemplate.xml')
+ return (httplib.OK, body, self.content_headers,
+ httplib.responses[httplib.OK])
+
+ def machine_start(self, method, url, params, headers):
+ self._authenticate(headers)
+ body = self.fixtures.load('_machine_start.xml')
+ return (httplib.OK, body, self.content_headers,
+ httplib.responses[httplib.OK])
+
+ def machine_snapshot(self, method, url, params, headers):
+ self._authenticate(headers)
+ body = self.fixtures.load('_machine_snapshot.xml')
+ return (httplib.OK, body, self.content_headers,
+ httplib.responses[httplib.OK])
+
+ def machine_listSnapshots(self, method, url, params, headers):
+ self._authenticate(headers)
+ body = self.fixtures.load('_machine_listSnapshots.xml')
+ return (httplib.OK, body, self.content_headers,
+ httplib.responses[httplib.OK])
+
+ def machine_rollback(self, method, url, params, headers):
+ self._authenticate(headers)
+ body = self.fixtures.load('_machine_rollback.xml')
+ return (httplib.OK, body, self.content_headers,
+ httplib.responses[httplib.OK])
+
+ def lan_find(self, method, url, params, headers):
+ self._authenticate(headers)
+ body = self.fixtures.load('_lan_find.xml')
+ return (httplib.OK, body, self.content_headers,
+ httplib.responses[httplib.OK])
+
+
+class CloudFramesTests(unittest.TestCase, TestCaseMixin):
+
+ should_list_locations = True
+ should_have_pricing = False
+ should_list_volumes = False
+
+ def __init__(self, name, url=None):
+ self.url = url
+ super(CloudFramesTests, self).__init__(name)
+
+ def setUp(self):
+ if self.url:
+ args = ()
+ kwargs = {'url': self.url}
+ else:
+ CloudFramesNodeDriver.connectionCls.conn_classes = (
+ CloudFramesMockHttp, CloudFramesMockHttp)
+ args = CLOUDFRAMES_PARAMS
+ kwargs = {}
+ self.driver = CloudFramesNodeDriver(*args, **kwargs)
+
+ def _retry_until_up(self, cmd, *args, **kwargs):
+ """
+ When testing against a live system, this will cause the given command
+ to be retried until it succeeds.
+ (Calls like snapshot/reboot will fail until the vm has started fully.)
+ """
+ now = datetime.datetime.now()
+ while not (datetime.datetime.now() - now).seconds > START_TIMEOUT:
+ try:
+ return cmd(*args, **kwargs)
+ except:
+ pass
+ else:
+ raise Exception('VMWare tools did not become available in time')
+
+ def test_connection(self):
+ key, secret, secure, host, port = CLOUDFRAMES_PARAMS
+ CloudFramesNodeDriver(key, secret, secure, host)
+ CloudFramesNodeDriver(key, secret, secure, host, 80)
+ self.assertRaises(NotImplementedError, CloudFramesNodeDriver,
+ key, secret, True, host, 80)
+ CloudFramesNodeDriver(key, secret, secure, host, '80')
+ self.assertRaises(NotImplementedError, CloudFramesNodeDriver,
+ key, secure=secure, host=host)
+ self.assertRaises(NotImplementedError, CloudFramesNodeDriver,
+ secret=secret, secure=secure, host=host)
+ CloudFramesNodeDriver(
+ url='http://%s:%s@%s:80/appserver/xmlrpc' % (key, secret, host))
+ CloudFramesNodeDriver(
+ url='http://%s:%s@%s/appserver/xmlrpc' % (key, secret, host))
+ self.assertRaises(NotImplementedError, CloudFramesNodeDriver,
+ key=key, secret=secret,
+ url='https://%s/appserver/xmlrpc' % host)
+ self.assertRaises(NotImplementedError, CloudFramesNodeDriver,
+ key=key, secret=secret, secure=False,
+ url='https://%s/appserver/xmlrpc' % host)
+ self.assertRaises(NotImplementedError, CloudFramesNodeDriver,
+ url='http://%s@%s/appserver/xmlrpc' % (key, host))
+ CloudFramesNodeDriver(
+ secret=secret, url='http://%s@%s/appserver/xmlrpc' % (key, host))
+ self.assertRaises(NotImplementedError, CloudFramesNodeDriver,
+ url='http://%s/appserver/xmlrpc' % host)
+ self.assertRaises(
+ NotImplementedError, CloudFramesNodeDriver,
+ secret=secret, url='http://%s/appserver/xmlrpc' % host)
+ self.assertRaises(NotImplementedError, CloudFramesNodeDriver,
+ key=key, url='http://%s/appserver/xmlrpc' % host)
+ CloudFramesNodeDriver(
+ key=key, secret=secret, url='http://%s/appserver/xmlrpc' % host)
+
+ def test_snapshot(self):
+ nodes = [node for node in self.driver.list_nodes()
+ if node.state == NodeState.RUNNING]
+ if not nodes:
+ raise Exception('No running vm to test snapshotting')
+ self._test_snapshot(nodes[0])
+
+ def _test_snapshot(self, node):
+ if self.url:
+ self.assertEqual(len(self.driver.ex_list_snapshots(node)), 0)
+ snapshot1 = self._retry_until_up(
+ self.driver.ex_snapshot_node, node)
+ self.assertTrue(isinstance(snapshot1, CloudFramesSnapshot))
+ if self.url:
+ self.assertEqual(len(self.driver.ex_list_snapshots(node)), 1)
+ snapshot2 = self.driver.ex_snapshot_node(node)
+ self.assertTrue(isinstance(snapshot2, CloudFramesSnapshot))
+ if self.url:
+ self.assertEqual(len(self.driver.ex_list_snapshots(node)), 2)
+ self.driver.ex_destroy_snapshot(node, snapshot2)
+ if self.url:
+ self.assertEqual(len(self.driver.ex_list_snapshots(node)), 1)
+ self.driver.ex_rollback_node(node, snapshot1)
+ if self.url:
+ self.assertEqual(len(self.driver.ex_list_snapshots(node)), 1)
+ self.driver.ex_destroy_snapshot(node, snapshot1)
+
+ def test_comprehensive(self):
+ """
+ Creates a node with the first location, image and size it finds.
+
+ Then boots the node, reboots, creates two snapshots.
+ Deletes one snapshot, rolls back to the other, then destroys the node.
+
+ In between these operations it verifies the node status and lists.
+ """
+ if not self.url:
+ return
+ location = self.driver.list_locations()[0]
+ self.assertTrue(isinstance(location, NodeLocation))
+ image = self.driver.list_images()[0]
+ self.assertTrue(isinstance(image, NodeImage))
+ size = self.driver.list_sizes()[0]
+ name = 'AUTOTEST_%s' % uuid.uuid4()
+ node = self.driver.create_node(
+ image=image, name=name, size=size, location=location)
+ # give the node time to boot up and load the vmware tools
+ self.assertTrue(isinstance(node, Node))
+ self.assertTrue(node.id in [x.id for x in self.driver.list_nodes()])
+ self.assertTrue(node.state == NodeState.RUNNING)
+ self._test_snapshot(node)
+ self._retry_until_up(self.driver.reboot_node, node)
+ self.driver.destroy_node(node)
+ self.assertFalse(node.id in [x.id for x in self.driver.list_nodes()])
+
+
+if __name__ == '__main__':
+ # add a full url as first arg to this script to test against a live system
+ # fi: http://key:secret@host:port/appserver/xmlrpc
+ if len(sys.argv) > 1:
+ suite = unittest.TestSuite()
+ suite.addTest(CloudFramesTests('test_comprehensive', sys.argv[1]))
+ if not unittest.TextTestRunner().run(suite).wasSuccessful():
+ sys.exit(1)
+ del sys.argv[1]
+ sys.exit(unittest.main())
http://git-wip-us.apache.org/repos/asf/libcloud/blob/8639c4e3/libcloud/test/secrets.py-dist
----------------------------------------------------------------------
diff --git a/libcloud/test/secrets.py-dist b/libcloud/test/secrets.py-dist
index e5adce0..2195b33 100644
--- a/libcloud/test/secrets.py-dist
+++ b/libcloud/test/secrets.py-dist
@@ -43,6 +43,7 @@ VCL_PARAMS = ('user', 'pass', True, 'foo.bar.com')
GRIDSPOT_PARAMS = ('key',)
HOSTVIRTUAL_PARAMS = ('key',)
DIGITAL_OCEAN_PARAMS = ('user', 'key')
+CLOUDFRAMES_PARAMS = ('key', 'secret', False, 'host', 8888)
# Storage
STORAGE_S3_PARAMS = ('key', 'secret')
[2/4] git commit: Issue LIBCLOUD-358: Add compute driver for
CloudFounders CloudFrames.
Posted by to...@apache.org.
Issue LIBCLOUD-358: Add compute driver for CloudFounders CloudFrames.
Signed-off-by: Tomaz Muraus <to...@apache.org>
Project: http://git-wip-us.apache.org/repos/asf/libcloud/repo
Commit: http://git-wip-us.apache.org/repos/asf/libcloud/commit/8639c4e3
Tree: http://git-wip-us.apache.org/repos/asf/libcloud/tree/8639c4e3
Diff: http://git-wip-us.apache.org/repos/asf/libcloud/diff/8639c4e3
Branch: refs/heads/trunk
Commit: 8639c4e3115a19518ebf8bfa147da01f5da7360a
Parents: 32087bf
Author: Bernard Kerckenaere <be...@bernieke.com>
Authored: Tue Jul 16 17:23:54 2013 +0200
Committer: Tomaz Muraus <to...@apache.org>
Committed: Sat Oct 26 00:25:07 2013 +0200
----------------------------------------------------------------------
.../_supported_methods_block_storage.rst | 2 +
docs/compute/_supported_methods_main.rst | 2 +
docs/compute/_supported_providers.rst | 122 +++---
docs/compute/drivers/cloudframes.rst | 33 ++
.../examples/compute/cloudframes/auth_kwargs.py | 6 +
docs/examples/compute/cloudframes/auth_url.py | 5 +
.../compute/cloudframes/functionality.py | 31 ++
libcloud/compute/drivers/cloudframes.py | 431 +++++++++++++++++++
libcloud/compute/providers.py | 4 +-
libcloud/compute/types.py | 1 +
.../fixtures/cloudframes/_cloudspace_find.xml | 18 +
.../compute/fixtures/cloudframes/_lan_find.xml | 18 +
.../cloudframes/_machine_createFromTemplate.xml | 17 +
.../fixtures/cloudframes/_machine_delete.xml | 17 +
.../cloudframes/_machine_find_physical.xml | 18 +
.../cloudframes/_machine_find_templates.xml | 18 +
.../_machine_find_virtualdesktop.xml | 17 +
.../cloudframes/_machine_find_virtualserver.xml | 24 ++
.../cloudframes/_machine_listSnapshots.xml | 82 ++++
...uid_01dedf71-0c37-441e-9687-085f8bb116ea.xml | 104 +++++
...uid_0c4da918-9f88-4049-a09c-8ab69142736a.xml | 105 +++++
...uid_1dd57d0d-0e23-471d-9f34-b673c7c18bc3.xml | 104 +++++
...uid_2aea45ee-3ea5-4b4f-88f0-7d4d48bed643.xml | 104 +++++
...uid_64f325ef-28ac-4907-bd37-572a13178edd.xml | 104 +++++
...uid_96b2af78-88a0-48a6-a5bd-258e1d00c0b9.xml | 104 +++++
...uid_9a6b3101-b4ac-4ecb-b114-67d89994ac9b.xml | 104 +++++
...uid_c52e4a42-72fe-4f34-bb80-c57d237fcbf9.xml | 103 +++++
...uid_d3c98151-f064-45fc-a90a-23c481723895.xml | 104 +++++
...uid_dea11e50-1b53-4046-8589-cf52eb7b0d25.xml | 104 +++++
.../fixtures/cloudframes/_machine_reboot.xml | 17 +
.../fixtures/cloudframes/_machine_rollback.xml | 17 +
.../fixtures/cloudframes/_machine_snapshot.xml | 17 +
.../fixtures/cloudframes/_machine_start.xml | 17 +
.../fixtures/cloudframes/_machine_stop.xml | 17 +
libcloud/test/compute/test_cloudframes.py | 293 +++++++++++++
libcloud/test/secrets.py-dist | 1 +
36 files changed, 2224 insertions(+), 61 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/libcloud/blob/8639c4e3/docs/compute/_supported_methods_block_storage.rst
----------------------------------------------------------------------
diff --git a/docs/compute/_supported_methods_block_storage.rst b/docs/compute/_supported_methods_block_storage.rst
index 80f63de..5a1a5ed 100644
--- a/docs/compute/_supported_methods_block_storage.rst
+++ b/docs/compute/_supported_methods_block_storage.rst
@@ -4,6 +4,7 @@ Provider list volumes create volume destroy volume
`Abiquo`_ no no no no no no no
`Bluebox Blocks`_ no no no no no no no
`Brightbox`_ no no no no no no no
+`CloudFrames`_ no no no no no no no
`CloudSigma`_ no no no no no no no
`CloudSigma`_ no no no no no no no
`CloudStack`_ no yes yes yes yes yes no
@@ -62,6 +63,7 @@ Provider list volumes create volume destroy volume
.. _`Abiquo`: http://www.abiquo.com/
.. _`Bluebox Blocks`: http://bluebox.net
.. _`Brightbox`: http://www.brightbox.co.uk/
+.. _`CloudFrames`: http://www.cloudframes.net/
.. _`CloudSigma`: http://www.cloudsigma.com/
.. _`CloudSigma`: http://www.cloudsigma.com/
.. _`CloudStack`: http://cloudstack.org/
http://git-wip-us.apache.org/repos/asf/libcloud/blob/8639c4e3/docs/compute/_supported_methods_main.rst
----------------------------------------------------------------------
diff --git a/docs/compute/_supported_methods_main.rst b/docs/compute/_supported_methods_main.rst
index f92b57a..a0b57db 100644
--- a/docs/compute/_supported_methods_main.rst
+++ b/docs/compute/_supported_methods_main.rst
@@ -4,6 +4,7 @@ Provider list nodes create node reboot node destroy
`Abiquo`_ yes yes yes yes yes yes no
`Bluebox Blocks`_ yes yes yes yes yes yes yes
`Brightbox`_ yes yes yes yes yes no no
+`CloudFrames`_ yes yes yes yes yes yes no
`CloudSigma`_ yes yes yes yes yes yes no
`CloudSigma`_ yes yes yes yes yes yes no
`CloudStack`_ yes yes yes yes yes yes yes
@@ -62,6 +63,7 @@ Provider list nodes create node reboot node destroy
.. _`Abiquo`: http://www.abiquo.com/
.. _`Bluebox Blocks`: http://bluebox.net
.. _`Brightbox`: http://www.brightbox.co.uk/
+.. _`CloudFrames`: http://www.cloudframes.net/
.. _`CloudSigma`: http://www.cloudsigma.com/
.. _`CloudSigma`: http://www.cloudsigma.com/
.. _`CloudStack`: http://cloudstack.org/
http://git-wip-us.apache.org/repos/asf/libcloud/blob/8639c4e3/docs/compute/_supported_providers.rst
----------------------------------------------------------------------
diff --git a/docs/compute/_supported_providers.rst b/docs/compute/_supported_providers.rst
index adff3e5..eaaa748 100644
--- a/docs/compute/_supported_providers.rst
+++ b/docs/compute/_supported_providers.rst
@@ -1,67 +1,69 @@
-===================================== ========================================= =================== ============================================== ====================================
-Provider Documentation Provider constant Module Class Name
-===================================== ========================================= =================== ============================================== ====================================
-`Abiquo`_ ABIQUO :mod:`libcloud.compute.drivers.abiquo` :class:`AbiquoNodeDriver`
-`Bluebox Blocks`_ BLUEBOX :mod:`libcloud.compute.drivers.bluebox` :class:`BlueboxNodeDriver`
-`Brightbox`_ BRIGHTBOX :mod:`libcloud.compute.drivers.brightbox` :class:`BrightboxNodeDriver`
-`CloudSigma`_ CLOUDSIGMA :mod:`libcloud.compute.drivers.cloudsigma` :class:`CloudSigmaZrhNodeDriver`
-`CloudSigma`_ CLOUDSIGMA_US :mod:`libcloud.compute.drivers.cloudsigma` :class:`CloudSigmaLvsNodeDriver`
-`CloudStack`_ CLOUDSTACK :mod:`libcloud.compute.drivers.cloudstack` :class:`CloudStackNodeDriver`
-`Digital Ocean`_ DIGITAL_OCEAN :mod:`libcloud.compute.drivers.digitalocean` :class:`DigitalOceanNodeDriver`
-`Dreamhost`_ DREAMHOST :mod:`libcloud.compute.drivers.dreamhost` :class:`DreamhostNodeDriver`
-`Amazon EC2`_ :doc:`Click </compute/drivers/ec2>` EC2 :mod:`libcloud.compute.drivers.ec2` :class:`EC2NodeDriver`
-`Amazon EC2 (ap-northeast-1)`_ EC2_AP_NORTHEAST :mod:`libcloud.compute.drivers.ec2` :class:`EC2APNENodeDriver`
-`Amazon EC2 (ap-southeast-1)`_ EC2_AP_SOUTHEAST :mod:`libcloud.compute.drivers.ec2` :class:`EC2APSENodeDriver`
-`Amazon EC2 (ap-southeast-2)`_ EC2_AP_SOUTHEAST2 :mod:`libcloud.compute.drivers.ec2` :class:`EC2APSESydneyNodeDriver`
-`Amazon EC2 (eu-west-1)`_ EC2_EU :mod:`libcloud.compute.drivers.ec2` :class:`EC2EUNodeDriver`
-`Amazon EC2 (eu-west-1)`_ EC2_EU_WEST :mod:`libcloud.compute.drivers.ec2` :class:`EC2EUNodeDriver`
-`Amazon EC2 (sa-east-1)`_ EC2_SA_EAST :mod:`libcloud.compute.drivers.ec2` :class:`EC2SAEastNodeDriver`
-`Amazon EC2`_ EC2_US_EAST :mod:`libcloud.compute.drivers.ec2` :class:`EC2NodeDriver`
-`Amazon EC2 (us-west-1)`_ EC2_US_WEST :mod:`libcloud.compute.drivers.ec2` :class:`EC2USWestNodeDriver`
-`Amazon EC2 (us-west-2)`_ EC2_US_WEST_OREGON :mod:`libcloud.compute.drivers.ec2` :class:`EC2USWestOregonNodeDriver`
-`Enomaly Elastic Computing Platform`_ ECP :mod:`libcloud.compute.drivers.ecp` :class:`ECPNodeDriver`
-`ElasticHosts`_ ELASTICHOSTS :mod:`libcloud.compute.drivers.elastichosts` :class:`ElasticHostsNodeDriver`
-`ElasticHosts (syd-y)`_ ELASTICHOSTS_AU1 :mod:`libcloud.compute.drivers.elastichosts` :class:`ElasticHostsAU1NodeDriver`
-`ElasticHosts (tor-p)`_ ELASTICHOSTS_CA1 :mod:`libcloud.compute.drivers.elastichosts` :class:`ElasticHostsCA1NodeDriver`
-`ElasticHosts (cn-1)`_ ELASTICHOSTS_CN1 :mod:`libcloud.compute.drivers.elastichosts` :class:`ElasticHostsCN1NodeDriver`
-`ElasticHosts (lon-p)`_ ELASTICHOSTS_UK1 :mod:`libcloud.compute.drivers.elastichosts` :class:`ElasticHostsUK1NodeDriver`
-`ElasticHosts (lon-b)`_ ELASTICHOSTS_UK2 :mod:`libcloud.compute.drivers.elastichosts` :class:`ElasticHostsUK2NodeDriver`
-`ElasticHosts (sat-p)`_ ELASTICHOSTS_US1 :mod:`libcloud.compute.drivers.elastichosts` :class:`ElasticHostsUS1NodeDriver`
-`ElasticHosts (lax-p)`_ ELASTICHOSTS_US2 :mod:`libcloud.compute.drivers.elastichosts` :class:`ElasticHostsUS2NodeDriver`
-`ElasticHosts (sjc-c)`_ ELASTICHOSTS_US3 :mod:`libcloud.compute.drivers.elastichosts` :class:`ElasticHostsUS3NodeDriver`
-`Eucalyptus`_ EUCALYPTUS :mod:`libcloud.compute.drivers.ec2` :class:`EucNodeDriver`
-`Gandi`_ GANDI :mod:`libcloud.compute.drivers.gandi` :class:`GandiNodeDriver`
-`Google Compute Engine`_ GCE :mod:`libcloud.compute.drivers.gce` :class:`GCENodeDriver`
-`GoGrid`_ GOGRID :mod:`libcloud.compute.drivers.gogrid` :class:`GoGridNodeDriver`
-`HostVirtual`_ HOSTVIRTUAL :mod:`libcloud.compute.drivers.hostvirtual` :class:`HostVirtualNodeDriver`
-`IBM SmartCloud Enterprise`_ IBM :mod:`libcloud.compute.drivers.ibm_sce` :class:`IBMNodeDriver`
-`Joyent`_ JOYENT :mod:`libcloud.compute.drivers.joyent` :class:`JoyentNodeDriver`
-`KTUCloud`_ KTUCLOUD :mod:`libcloud.compute.drivers.ktucloud` :class:`KTUCloudNodeDriver`
-`Libvirt`_ LIBVIRT :mod:`libcloud.compute.drivers.libvirt_driver` :class:`LibvirtNodeDriver`
-`Linode`_ LINODE :mod:`libcloud.compute.drivers.linode` :class:`LinodeNodeDriver`
-`NephoScale`_ NEPHOSCALE :mod:`libcloud.compute.drivers.nephoscale` :class:`NephoscaleNodeDriver`
-`Nimbus`_ :doc:`Click </compute/drivers/nimbus>` NIMBUS :mod:`libcloud.compute.drivers.ec2` :class:`NimbusNodeDriver`
-`Ninefold`_ NINEFOLD :mod:`libcloud.compute.drivers.ninefold` :class:`NinefoldNodeDriver`
-`OpenNebula`_ OPENNEBULA :mod:`libcloud.compute.drivers.opennebula` :class:`OpenNebulaNodeDriver`
-`OpenStack`_ :doc:`Click </compute/drivers/openstack>` OPENSTACK :mod:`libcloud.compute.drivers.openstack` :class:`OpenStackNodeDriver`
-`Opsource`_ OPSOURCE :mod:`libcloud.compute.drivers.opsource` :class:`OpsourceNodeDriver`
-`Rackspace Cloud (Next Gen)`_ RACKSPACE :mod:`libcloud.compute.drivers.rackspace` :class:`RackspaceNodeDriver`
-`Rackspace Cloud (First Gen)`_ RACKSPACE_FIRST_GEN :mod:`libcloud.compute.drivers.rackspace` :class:`RackspaceFirstGenNodeDriver`
-`RimuHosting`_ RIMUHOSTING :mod:`libcloud.compute.drivers.rimuhosting` :class:`RimuHostingNodeDriver`
-`ServerLove`_ SERVERLOVE :mod:`libcloud.compute.drivers.serverlove` :class:`ServerLoveNodeDriver`
-`skalicloud`_ SKALICLOUD :mod:`libcloud.compute.drivers.skalicloud` :class:`SkaliCloudNodeDriver`
-`Slicehost`_ SLICEHOST :mod:`libcloud.compute.drivers.slicehost` :class:`SlicehostNodeDriver`
-`SoftLayer`_ SOFTLAYER :mod:`libcloud.compute.drivers.softlayer` :class:`SoftLayerNodeDriver`
-`vCloud`_ TERREMARK :mod:`libcloud.compute.drivers.vcloud` :class:`TerremarkDriver`
-`VCL`_ VCL :mod:`libcloud.compute.drivers.vcl` :class:`VCLNodeDriver`
-`vCloud`_ :doc:`Click </compute/drivers/vcloud>` VCLOUD :mod:`libcloud.compute.drivers.vcloud` :class:`VCloudNodeDriver`
-`Voxel VoxCLOUD`_ VOXEL :mod:`libcloud.compute.drivers.voxel` :class:`VoxelNodeDriver`
-`vps.net`_ VPSNET :mod:`libcloud.compute.drivers.vpsnet` :class:`VPSNetNodeDriver`
-===================================== ========================================= =================== ============================================== ====================================
+===================================== =========================================== =================== ============================================== ====================================
+Provider Documentation Provider constant Module Class Name
+===================================== =========================================== =================== ============================================== ====================================
+`Abiquo`_ ABIQUO :mod:`libcloud.compute.drivers.abiquo` :class:`AbiquoNodeDriver`
+`Bluebox Blocks`_ BLUEBOX :mod:`libcloud.compute.drivers.bluebox` :class:`BlueboxNodeDriver`
+`Brightbox`_ BRIGHTBOX :mod:`libcloud.compute.drivers.brightbox` :class:`BrightboxNodeDriver`
+`CloudFrames`_ :doc:`Click </compute/drivers/cloudframes>` CLOUDFRAMES :mod:`libcloud.compute.drivers.cloudframes` :class:`CloudFramesNodeDriver`
+`CloudSigma`_ CLOUDSIGMA :mod:`libcloud.compute.drivers.cloudsigma` :class:`CloudSigmaZrhNodeDriver`
+`CloudSigma`_ CLOUDSIGMA_US :mod:`libcloud.compute.drivers.cloudsigma` :class:`CloudSigmaLvsNodeDriver`
+`CloudStack`_ CLOUDSTACK :mod:`libcloud.compute.drivers.cloudstack` :class:`CloudStackNodeDriver`
+`Digital Ocean`_ DIGITAL_OCEAN :mod:`libcloud.compute.drivers.digitalocean` :class:`DigitalOceanNodeDriver`
+`Dreamhost`_ DREAMHOST :mod:`libcloud.compute.drivers.dreamhost` :class:`DreamhostNodeDriver`
+`Amazon EC2`_ :doc:`Click </compute/drivers/ec2>` EC2 :mod:`libcloud.compute.drivers.ec2` :class:`EC2NodeDriver`
+`Amazon EC2 (ap-northeast-1)`_ EC2_AP_NORTHEAST :mod:`libcloud.compute.drivers.ec2` :class:`EC2APNENodeDriver`
+`Amazon EC2 (ap-southeast-1)`_ EC2_AP_SOUTHEAST :mod:`libcloud.compute.drivers.ec2` :class:`EC2APSENodeDriver`
+`Amazon EC2 (ap-southeast-2)`_ EC2_AP_SOUTHEAST2 :mod:`libcloud.compute.drivers.ec2` :class:`EC2APSESydneyNodeDriver`
+`Amazon EC2 (eu-west-1)`_ EC2_EU :mod:`libcloud.compute.drivers.ec2` :class:`EC2EUNodeDriver`
+`Amazon EC2 (eu-west-1)`_ EC2_EU_WEST :mod:`libcloud.compute.drivers.ec2` :class:`EC2EUNodeDriver`
+`Amazon EC2 (sa-east-1)`_ EC2_SA_EAST :mod:`libcloud.compute.drivers.ec2` :class:`EC2SAEastNodeDriver`
+`Amazon EC2`_ EC2_US_EAST :mod:`libcloud.compute.drivers.ec2` :class:`EC2NodeDriver`
+`Amazon EC2 (us-west-1)`_ EC2_US_WEST :mod:`libcloud.compute.drivers.ec2` :class:`EC2USWestNodeDriver`
+`Amazon EC2 (us-west-2)`_ EC2_US_WEST_OREGON :mod:`libcloud.compute.drivers.ec2` :class:`EC2USWestOregonNodeDriver`
+`Enomaly Elastic Computing Platform`_ ECP :mod:`libcloud.compute.drivers.ecp` :class:`ECPNodeDriver`
+`ElasticHosts`_ ELASTICHOSTS :mod:`libcloud.compute.drivers.elastichosts` :class:`ElasticHostsNodeDriver`
+`ElasticHosts (syd-y)`_ ELASTICHOSTS_AU1 :mod:`libcloud.compute.drivers.elastichosts` :class:`ElasticHostsAU1NodeDriver`
+`ElasticHosts (tor-p)`_ ELASTICHOSTS_CA1 :mod:`libcloud.compute.drivers.elastichosts` :class:`ElasticHostsCA1NodeDriver`
+`ElasticHosts (cn-1)`_ ELASTICHOSTS_CN1 :mod:`libcloud.compute.drivers.elastichosts` :class:`ElasticHostsCN1NodeDriver`
+`ElasticHosts (lon-p)`_ ELASTICHOSTS_UK1 :mod:`libcloud.compute.drivers.elastichosts` :class:`ElasticHostsUK1NodeDriver`
+`ElasticHosts (lon-b)`_ ELASTICHOSTS_UK2 :mod:`libcloud.compute.drivers.elastichosts` :class:`ElasticHostsUK2NodeDriver`
+`ElasticHosts (sat-p)`_ ELASTICHOSTS_US1 :mod:`libcloud.compute.drivers.elastichosts` :class:`ElasticHostsUS1NodeDriver`
+`ElasticHosts (lax-p)`_ ELASTICHOSTS_US2 :mod:`libcloud.compute.drivers.elastichosts` :class:`ElasticHostsUS2NodeDriver`
+`ElasticHosts (sjc-c)`_ ELASTICHOSTS_US3 :mod:`libcloud.compute.drivers.elastichosts` :class:`ElasticHostsUS3NodeDriver`
+`Eucalyptus`_ EUCALYPTUS :mod:`libcloud.compute.drivers.ec2` :class:`EucNodeDriver`
+`Gandi`_ GANDI :mod:`libcloud.compute.drivers.gandi` :class:`GandiNodeDriver`
+`Google Compute Engine`_ GCE :mod:`libcloud.compute.drivers.gce` :class:`GCENodeDriver`
+`GoGrid`_ GOGRID :mod:`libcloud.compute.drivers.gogrid` :class:`GoGridNodeDriver`
+`HostVirtual`_ HOSTVIRTUAL :mod:`libcloud.compute.drivers.hostvirtual` :class:`HostVirtualNodeDriver`
+`IBM SmartCloud Enterprise`_ IBM :mod:`libcloud.compute.drivers.ibm_sce` :class:`IBMNodeDriver`
+`Joyent`_ JOYENT :mod:`libcloud.compute.drivers.joyent` :class:`JoyentNodeDriver`
+`KTUCloud`_ KTUCLOUD :mod:`libcloud.compute.drivers.ktucloud` :class:`KTUCloudNodeDriver`
+`Libvirt`_ LIBVIRT :mod:`libcloud.compute.drivers.libvirt_driver` :class:`LibvirtNodeDriver`
+`Linode`_ LINODE :mod:`libcloud.compute.drivers.linode` :class:`LinodeNodeDriver`
+`NephoScale`_ NEPHOSCALE :mod:`libcloud.compute.drivers.nephoscale` :class:`NephoscaleNodeDriver`
+`Nimbus`_ :doc:`Click </compute/drivers/nimbus>` NIMBUS :mod:`libcloud.compute.drivers.ec2` :class:`NimbusNodeDriver`
+`Ninefold`_ NINEFOLD :mod:`libcloud.compute.drivers.ninefold` :class:`NinefoldNodeDriver`
+`OpenNebula`_ OPENNEBULA :mod:`libcloud.compute.drivers.opennebula` :class:`OpenNebulaNodeDriver`
+`OpenStack`_ :doc:`Click </compute/drivers/openstack>` OPENSTACK :mod:`libcloud.compute.drivers.openstack` :class:`OpenStackNodeDriver`
+`Opsource`_ OPSOURCE :mod:`libcloud.compute.drivers.opsource` :class:`OpsourceNodeDriver`
+`Rackspace Cloud (Next Gen)`_ RACKSPACE :mod:`libcloud.compute.drivers.rackspace` :class:`RackspaceNodeDriver`
+`Rackspace Cloud (First Gen)`_ RACKSPACE_FIRST_GEN :mod:`libcloud.compute.drivers.rackspace` :class:`RackspaceFirstGenNodeDriver`
+`RimuHosting`_ RIMUHOSTING :mod:`libcloud.compute.drivers.rimuhosting` :class:`RimuHostingNodeDriver`
+`ServerLove`_ SERVERLOVE :mod:`libcloud.compute.drivers.serverlove` :class:`ServerLoveNodeDriver`
+`skalicloud`_ SKALICLOUD :mod:`libcloud.compute.drivers.skalicloud` :class:`SkaliCloudNodeDriver`
+`Slicehost`_ SLICEHOST :mod:`libcloud.compute.drivers.slicehost` :class:`SlicehostNodeDriver`
+`SoftLayer`_ SOFTLAYER :mod:`libcloud.compute.drivers.softlayer` :class:`SoftLayerNodeDriver`
+`vCloud`_ TERREMARK :mod:`libcloud.compute.drivers.vcloud` :class:`TerremarkDriver`
+`VCL`_ VCL :mod:`libcloud.compute.drivers.vcl` :class:`VCLNodeDriver`
+`vCloud`_ :doc:`Click </compute/drivers/vcloud>` VCLOUD :mod:`libcloud.compute.drivers.vcloud` :class:`VCloudNodeDriver`
+`Voxel VoxCLOUD`_ VOXEL :mod:`libcloud.compute.drivers.voxel` :class:`VoxelNodeDriver`
+`vps.net`_ VPSNET :mod:`libcloud.compute.drivers.vpsnet` :class:`VPSNetNodeDriver`
+===================================== =========================================== =================== ============================================== ====================================
.. _`Abiquo`: http://www.abiquo.com/
.. _`Bluebox Blocks`: http://bluebox.net
.. _`Brightbox`: http://www.brightbox.co.uk/
+.. _`CloudFrames`: http://www.cloudframes.net/
.. _`CloudSigma`: http://www.cloudsigma.com/
.. _`CloudSigma`: http://www.cloudsigma.com/
.. _`CloudStack`: http://cloudstack.org/
http://git-wip-us.apache.org/repos/asf/libcloud/blob/8639c4e3/docs/compute/drivers/cloudframes.rst
----------------------------------------------------------------------
diff --git a/docs/compute/drivers/cloudframes.rst b/docs/compute/drivers/cloudframes.rst
new file mode 100644
index 0000000..a85bd19
--- /dev/null
+++ b/docs/compute/drivers/cloudframes.rst
@@ -0,0 +1,33 @@
+CloudFrames Compute Driver Documentation
+========================================
+
+Connecting to the CloudFrames installation
+----------------------------------------
+
+This will tell you how to interpret the available arguments:
+
+* ``key`` - The username to the cloudapi
+* ``secret`` - The password to the cloudapi
+* ``secure`` - This should always be False as the cloudapi doesn't support ssl
+* ``host`` - The hostname or ip address we can reach the cloudapi on
+* ``port`` - The port the cloudapi runs on (defaults to 80 for http)
+* ``url`` - As an alternative to the above, you can pass the full cloudapi url
+ (e.g. ``http://admin:admin@cloudframes:80/appserver/xmlrpc``)
+
+Examples
+--------
+
+1. Creating the connection
+~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+You can set up the connection using either the complete url to the api.
+
+.. literalinclude:: /examples/compute/cloudframes/auth_url.py
+
+Or by specifying the individual components which would make up the url.
+
+.. literalinclude:: /examples/compute/cloudframes/auth_kwargs.py
+
+2. Implemented functionality
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+.. literalinclude:: /examples/compute/cloudframes/functionality.py
http://git-wip-us.apache.org/repos/asf/libcloud/blob/8639c4e3/docs/examples/compute/cloudframes/auth_kwargs.py
----------------------------------------------------------------------
diff --git a/docs/examples/compute/cloudframes/auth_kwargs.py b/docs/examples/compute/cloudframes/auth_kwargs.py
new file mode 100644
index 0000000..c04df68
--- /dev/null
+++ b/docs/examples/compute/cloudframes/auth_kwargs.py
@@ -0,0 +1,6 @@
+from libcloud.compute.types import Provider
+from libcloud.compute.providers import get_driver
+
+CloudFrames = get_driver(Provider.CLOUDFRAMES)
+driver = CloudFrames(key='admin', secret='admin', secure=False,
+ host='cloudframes', port=80)
http://git-wip-us.apache.org/repos/asf/libcloud/blob/8639c4e3/docs/examples/compute/cloudframes/auth_url.py
----------------------------------------------------------------------
diff --git a/docs/examples/compute/cloudframes/auth_url.py b/docs/examples/compute/cloudframes/auth_url.py
new file mode 100644
index 0000000..df1cee5
--- /dev/null
+++ b/docs/examples/compute/cloudframes/auth_url.py
@@ -0,0 +1,5 @@
+from libcloud.compute.types import Provider
+from libcloud.compute.providers import get_driver
+
+CloudFrames = get_driver(Provider.CLOUDFRAMES)
+driver = CloudFrames(url='http://admin:admin@cloudframes:80/appserver/xmlrpc')
http://git-wip-us.apache.org/repos/asf/libcloud/blob/8639c4e3/docs/examples/compute/cloudframes/functionality.py
----------------------------------------------------------------------
diff --git a/docs/examples/compute/cloudframes/functionality.py b/docs/examples/compute/cloudframes/functionality.py
new file mode 100644
index 0000000..6325e92
--- /dev/null
+++ b/docs/examples/compute/cloudframes/functionality.py
@@ -0,0 +1,31 @@
+import uuid
+
+from libcloud.compute.types import Provider, NodeState
+from libcloud.compute.providers import get_driver
+
+CloudFrames = get_driver(Provider.CLOUDFRAMES)
+driver = CloudFrames(url='http://admin:admin@cloudframes:80/appserver/xmlrpc')
+
+# get an available location
+location = driver.list_locations()[0]
+# and an image
+image = driver.list_images()[0]
+# as well as a size
+size = driver.list_sizes()[0]
+
+# use these to create a node
+node = driver.create_node(image=image, name='TEST_%s' % uuid.uuid4(),
+ size=size, location=location)
+
+# snapshot a node, rollback to the snapshot and destroy the snaphost
+snapshot = driver.ex_snapshot_node(node)
+driver.ex_rollback_node(node, snapshot)
+driver.ex_destroy_snapshot(node, snapshot)
+
+# list running nodes
+nodes = [n for n in driver.list_nodes()
+ if n.state == NodeState.RUNNING]
+# reboot node
+driver.reboot_node(node)
+# destroy the node
+driver.destroy_node(node)
http://git-wip-us.apache.org/repos/asf/libcloud/blob/8639c4e3/libcloud/compute/drivers/cloudframes.py
----------------------------------------------------------------------
diff --git a/libcloud/compute/drivers/cloudframes.py b/libcloud/compute/drivers/cloudframes.py
new file mode 100644
index 0000000..68f74cc
--- /dev/null
+++ b/libcloud/compute/drivers/cloudframes.py
@@ -0,0 +1,431 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""
+CloudFrames Driver
+
+"""
+
+# (name, ram, disk, bandwith, price, vcpus)
+SIZES = [
+ ('512mb_1core_10gb', 512, 10, 512, 0.025, 1),
+ ('1024mb_1core_20gb', 1024, 20, 512, 0.05, 1),
+ ('2048mb_2core_50gb', 2048, 50, 1024, 0.10, 2),
+ ('4096mb_2core_100gb', 4096, 100, 2048, 0.20, 2),
+ ('8192mb_4core_200gb', 8192, 200, 2048, 0.40, 4),
+ ('16384mb_4core_400gb', 16384, 400, 4096, 0.80, 4),
+]
+
+import base64
+import random
+
+from libcloud.utils.py3 import urlparse, b
+from libcloud.common.base import ConnectionKey
+from libcloud.common.xmlrpc import XMLRPCResponse, XMLRPCConnection
+from libcloud.common.types import ProviderError
+from libcloud.compute.base import NodeImage, NodeSize, Node, NodeLocation
+from libcloud.compute.base import NodeDriver
+from libcloud.compute.types import Provider, NodeState
+
+
+class CloudFramesException(ProviderError):
+ pass
+
+
+class CloudFramesComponent(object):
+ """
+ Represents a node in the cloudapi path.
+ """
+
+ def __init__(self, cloudFramesConnection, name):
+ self.cloudFramesConnection = cloudFramesConnection
+ self.name = name
+
+ def __getattr__(self, key):
+ return self.method(key)
+
+ def method(self, methodname):
+ def foo(*args, **kwargs):
+ async = kwargs.get('async', False)
+ args = list(args)
+ args.append('') # jobguid
+ args.append({'wait': False} if async else {}) # executionparams
+ response = self.cloudFramesConnection.request(
+ 'cloud_api_%s.%s' % (self.name, methodname), *args)
+ if not response.success():
+ response.parse_error()
+ if async:
+ return response.parse_body()['jobguid']
+ else:
+ return response.parse_body()['result']
+ return foo
+
+
+class CloudFramesNodeSize(NodeSize):
+
+ def __init__(self, id, name, ram, disk, bandwidth, price, driver,
+ vcpus=None):
+ super(CloudFramesNodeSize, self).__init__(
+ id, name, ram, disk, bandwidth, price, driver)
+ self.vcpus = vcpus
+
+
+class CloudFramesNode(Node):
+
+ def list_snapshots(self):
+ return self.driver.ex_list_snapshots(self)
+
+ def snapshot(self, label='', description=''):
+ return self.driver.ex_snapshot_node(self, label, description)
+
+ def rollback(self, snapshot):
+ return self.driver.ex_rollback_node(self, snapshot)
+
+
+class CloudFramesSnapshot(object):
+
+ def __init__(self, id, timestamp, label, description, driver):
+ self.id = id
+ self.timestamp = timestamp
+ self.label = label
+ self.description = description
+ self.driver = driver
+
+ def destroy(self):
+ self.driver.ex_destroy_snapshot(self)
+
+
+class CloudFramesConnection(XMLRPCConnection, ConnectionKey):
+ """
+ Cloudapi connection class
+ """
+
+ repsonseCls = XMLRPCResponse
+ base_url = None
+
+ def __init__(self, key=None, secret=None, secure=True,
+ host=None, port=None, url=None, timeout=None):
+ """
+ :param key: The username to connect with to the cloudapi
+ :type key: ``str``
+
+ :param secret: The password to connect with to the cloudapi
+ :type secret: ``str``
+
+ :param secure: Should always be false at the moment
+ :type secure: ``bool``
+
+ :param host: The hostname of the cloudapi
+ :type host: ``str``
+
+ :param port: The port on which to connect to the cloudapi
+ :type port: ``int``
+
+ :param url: Url to the cloudapi (can replace all above)
+ :type url: ``str``
+ """
+
+ super(CloudFramesConnection, self).__init__(key=key, secure=secure,
+ host=host, port=port,
+ url=url, timeout=timeout)
+ self._auth = base64.b64encode(
+ b('%s:%s' % (key, secret))).decode('utf-8')
+ self.endpoint = url
+
+ def __getattr__(self, key):
+ return CloudFramesComponent(self, key)
+
+ def add_default_headers(self, headers):
+ headers['Authorization'] = 'Basic %s' % self._auth
+ return headers
+
+
+class CloudFramesNodeDriver(NodeDriver):
+ """
+ CloudFrames node driver
+ """
+
+ connectionCls = CloudFramesConnection
+
+ name = 'CloudFrames'
+ api_name = 'cloudframes'
+ website = 'http://www.cloudframes.net/'
+ type = Provider.CLOUDFRAMES
+
+ NODE_STATE_MAP = {
+ 'CONFIGURED': NodeState.PENDING,
+ 'CREATED': NodeState.PENDING,
+ 'DELETING': NodeState.PENDING,
+ 'HALTED': NodeState.TERMINATED,
+ 'IMAGEONLY': NodeState.UNKNOWN,
+ 'ISCSIEXPOSED': NodeState.PENDING,
+ 'MOVING': NodeState.PENDING,
+ 'OVERLOADED': NodeState.UNKNOWN,
+ 'PAUSED': NodeState.TERMINATED,
+ 'RUNNING': NodeState.RUNNING,
+ 'STARTING': NodeState.PENDING,
+ 'STOPPING': NodeState.PENDING,
+ 'SYNCING': NodeState.PENDING,
+ 'TODELETE': NodeState.PENDING,
+ }
+
+ # subclassed internal methods
+ def __init__(self, key=None, secret=None, secure=True,
+ host=None, port=None, url=None, **kwargs):
+ if not port:
+ port = 443 if secure else 80
+ if url:
+ if not url.endswith('/'):
+ url += '/'
+ scheme, netloc, _, _, _, _ = urlparse.urlparse(url)
+ secure = (scheme == 'https')
+ if '@' in netloc:
+ auth, hostport = netloc.rsplit('@', 1)
+ if ':' in auth:
+ key, secret = auth.split(':', 1)
+ else:
+ key = auth
+ else:
+ hostport = netloc
+ if ':' in hostport:
+ host, port = hostport.split(':')
+ else:
+ host = hostport
+ hostport = '%s:%s' % (host, port)
+ url = url.replace(netloc, hostport)
+ else:
+ url = '%s://%s:%s/appserver/xmlrpc/' % (
+ 'https' if secure else 'http', host, port)
+
+ if secure:
+ raise NotImplementedError(
+ 'The cloudapi only supports unsecure connections')
+
+ if key is None or secret is None:
+ raise NotImplementedError(
+ 'Unauthenticated support to the cloudapi is not supported')
+
+ # connection url
+ self._url = url
+
+ # cached attributes
+ self.__cloudspaceguid = None
+ self.__languid = None
+ self.__locations = []
+
+ super(CloudFramesNodeDriver, self).__init__(
+ key, secret, secure, host, port, **kwargs)
+
+ def _ex_connection_class_kwargs(self):
+ return {'url': self._url}
+
+ # internal methods
+ @property
+ def _cloudspaceguid(self):
+ if not self.__cloudspaceguid:
+ self.__cloudspaceguid = self.connection.cloudspace.find(
+ '', '', 'cloud', '')[0]
+ return self.__cloudspaceguid
+
+ @property
+ def _languid(self):
+ if not self.__languid:
+ self.__languid = self.connection.lan.find(
+ '', '', 'public_virtual', '', '', '', '', '', '', '', '', '',
+ '', '', '', '', '')[0]
+ return self.__languid
+
+ def _get_machine_data(self, guid):
+ """
+ Looks up some basic data related to the given machine guid.
+ """
+ try:
+ d = self.connection.machine.list('', '', '', guid, '')[0]
+ except IndexError:
+ raise CloudFramesException('VM no longer exists', 404, self)
+ d['public_ips'] = []
+ d['private_ips'] = []
+ d['size'] = None
+ d['image'] = None
+ return d
+
+ def _machine_find(self, template=False, machinetype=None,
+ machinerole=None):
+ # the cloudframes xmlrpc api requires you to pass all args and kwargs
+ # as positional arguments, you can't use keywords arguments
+ if not machinetype:
+ guids = []
+ for machinetype in ['VIRTUALSERVER', 'VIRTUALDESKTOP']:
+ guids += self.connection.machine.find(
+ '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
+ '', '', machinetype, template, '', '', '', '', '', '', '',
+ '', '', '', '', '', '', '')
+ else:
+ guids = self.connection.machine.find(
+ '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
+ '', '', machinetype, '', '', '', '', '', '', '', '',
+ machinerole, '', '', '', '', '', '')
+ return guids
+
+ def _to_image(self, image_dict):
+ return NodeImage(id=image_dict['guid'],
+ name=image_dict['name'],
+ driver=self.connection.driver)
+
+ def _to_size(self, id, name, ram, disk, bandwidth, price, vcpus):
+ return CloudFramesNodeSize(
+ id, name, ram, disk, bandwidth, price, self, vcpus)
+
+ def _to_location(self, location_dict):
+ return NodeLocation(id=location_dict['guid'],
+ name=location_dict['name'],
+ country=None,
+ driver=self)
+
+ def _to_node(self, node_dict):
+ # only return nodes which can be worked with
+ # (ignore cloudframes internal autotests and deleted nodes)
+ if node_dict['status'] == 'CONFIGURED':
+ return None
+ return CloudFramesNode(id=node_dict['guid'],
+ name=node_dict['name'],
+ state=self.NODE_STATE_MAP.get(
+ node_dict['status'], NodeState.UNKNOWN),
+ public_ips=node_dict['public_ips'],
+ private_ips=node_dict['private_ips'],
+ driver=self.connection.driver,
+ size=node_dict['size'],
+ image=node_dict['image'],
+ extra={})
+
+ def _to_snapshot(self, snapshot_dict):
+ return CloudFramesSnapshot(id=snapshot_dict['guid'],
+ timestamp=snapshot_dict['timestamp'],
+ label=snapshot_dict['backuplabel'],
+ description=snapshot_dict['description'],
+ driver=self)
+
+ # subclassed public methods, and provider specific public methods
+ def list_images(self, location=None):
+ image_ids = self._machine_find(template=True)
+ image_list = []
+ for image_id in image_ids:
+ image_list.append(self._to_image(self._get_machine_data(image_id)))
+ return image_list
+
+ def list_sizes(self, location=None):
+ sizes = []
+ for id in range(len(SIZES)):
+ sizes.append(self._to_size(id, *SIZES[id]))
+ return sizes
+
+ def list_locations(self, ex_use_cached=True):
+ if not self.__locations or not ex_use_cached:
+ self.__locations = []
+ for location_id in self._machine_find(machinetype='PHYSICAL',
+ machinerole='COMPUTENODE'):
+ self.__locations.append(
+ self._to_location(self._get_machine_data(location_id)))
+ return self.__locations
+
+ def list_nodes(self):
+ node_ids = self._machine_find()
+ node_list = []
+ for node_id in node_ids:
+ node = self._to_node(self._get_machine_data(node_id))
+ if node:
+ node_list.append(node)
+ return node_list
+
+ def create_node(self, **kwargs):
+ """
+ Creates a new node, by cloning the template provided.
+
+ If no location object is passed, a random location will be used.
+
+
+ :param image: The template to be cloned (required)
+ :type image: ``list`` of :class:`NodeImage`
+
+ :param name: The name for the new node (required)
+ :type name: ``str``
+
+ :param size: The size of the new node (required)
+ :type size: ``list`` of :class:`NodeSize`
+
+ :param location: The location to create the new node
+ :type location: ``list`` of :class:`NodeLocation`
+
+ :param default_gateway: The default gateway to be used
+ :type default_gateway: ``str``
+
+ :param extra: Additional requirements (extra disks fi.)
+ :type extra: ``dict``
+
+
+ :returns: ``list`` of :class:`Node` -- The newly created Node object
+
+ :raises: CloudFramesException
+ """
+
+ additionalinfo = kwargs.get('extra', {})
+ additionalinfo.update({
+ 'memory': kwargs['size'].ram,
+ 'cpu': kwargs['size'].vcpus,
+ })
+ guid = self.connection.machine.createFromTemplate(
+ self._cloudspaceguid, kwargs['image'].id, kwargs['name'],
+ [{'languid': self._languid}], kwargs['name'],
+ kwargs.get('location', random.choice(self.list_locations())).id,
+ kwargs.get('default_gateway', ''), None, additionalinfo)
+ if not self.connection.machine.start(guid):
+ raise CloudFramesException(
+ 'failed to start machine after creation', 500, self)
+ return self._to_node(self._get_machine_data(guid))
+
+ def destroy_node(self, node):
+ return self.connection.machine.delete(node.id, False)
+
+ def reboot_node(self, node, ex_clean=True):
+ return self.connection.machine.reboot(node.id, ex_clean)
+
+ def ex_snapshot_node(self, node, label='', description=''):
+ guid = self.connection.machine.snapshot(
+ node.id, label, description, False, False, 'PAUSED')
+ for snapshot in self.ex_list_snapshots(node):
+ if snapshot.id == guid:
+ return snapshot
+ else:
+ raise CloudFramesException('Snapshot creation failed', 500, self)
+
+ def ex_rollback_node(self, node, snapshot):
+ if not node.state == NodeState.TERMINATED:
+ self.connection.machine.stop(node.id, False, 930)
+ success = self.connection.machine.rollback(node.id, snapshot.id)
+ self.connection.machine.start(node.id)
+ return success
+
+ def ex_list_snapshots(self, node):
+ return [self._to_snapshot(snapshot_dict) for snapshot_dict in
+ self.connection.machine.listSnapshots(node.id, False, '', '')]
+
+ def ex_destroy_snapshot(self, node, snapshot):
+ return self.connection.machine.delete(snapshot.id, False)
+
+
+if __name__ == "__main__":
+ import doctest
+
+ doctest.testmod()
http://git-wip-us.apache.org/repos/asf/libcloud/blob/8639c4e3/libcloud/compute/providers.py
----------------------------------------------------------------------
diff --git a/libcloud/compute/providers.py b/libcloud/compute/providers.py
index 5376081..b9c6808 100644
--- a/libcloud/compute/providers.py
+++ b/libcloud/compute/providers.py
@@ -136,7 +136,9 @@ DRIVERS = {
Provider.DIGITAL_OCEAN:
('libcloud.compute.drivers.digitalocean', 'DigitalOceanNodeDriver'),
Provider.NEPHOSCALE:
- ('libcloud.compute.drivers.nephoscale', 'NephoscaleNodeDriver')
+ ('libcloud.compute.drivers.nephoscale', 'NephoscaleNodeDriver'),
+ Provider.CLOUDFRAMES:
+ ('libcloud.compute.drivers.cloudframes', 'CloudFramesNodeDriver'),
}
http://git-wip-us.apache.org/repos/asf/libcloud/blob/8639c4e3/libcloud/compute/types.py
----------------------------------------------------------------------
diff --git a/libcloud/compute/types.py b/libcloud/compute/types.py
index 757b1b6..c75da81 100644
--- a/libcloud/compute/types.py
+++ b/libcloud/compute/types.py
@@ -115,6 +115,7 @@ class Provider(object):
ABIQUO = 'abiquo'
DIGITAL_OCEAN = 'digitalocean'
NEPHOSCALE = 'nephoscale'
+ CLOUDFRAMES = 'cloudframes'
# Deprecated constants which are still supported
EC2_US_EAST = 'ec2_us_east'
http://git-wip-us.apache.org/repos/asf/libcloud/blob/8639c4e3/libcloud/test/compute/fixtures/cloudframes/_cloudspace_find.xml
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/cloudframes/_cloudspace_find.xml b/libcloud/test/compute/fixtures/cloudframes/_cloudspace_find.xml
new file mode 100644
index 0000000..a42bd69
--- /dev/null
+++ b/libcloud/test/compute/fixtures/cloudframes/_cloudspace_find.xml
@@ -0,0 +1,18 @@
+<?xml version='1.0'?>
+<methodResponse>
+<params>
+<param>
+<value><struct>
+<member>
+<name>jobguid</name>
+<value><nil/></value></member>
+<member>
+<name>result</name>
+<value><array><data>
+<value><string>3e4f8bd5-718c-457e-86f4-024c560d7c28</string></value>
+</data></array></value>
+</member>
+</struct></value>
+</param>
+</params>
+</methodResponse>
http://git-wip-us.apache.org/repos/asf/libcloud/blob/8639c4e3/libcloud/test/compute/fixtures/cloudframes/_lan_find.xml
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/cloudframes/_lan_find.xml b/libcloud/test/compute/fixtures/cloudframes/_lan_find.xml
new file mode 100644
index 0000000..163a656
--- /dev/null
+++ b/libcloud/test/compute/fixtures/cloudframes/_lan_find.xml
@@ -0,0 +1,18 @@
+<?xml version='1.0'?>
+<methodResponse>
+<params>
+<param>
+<value><struct>
+<member>
+<name>jobguid</name>
+<value><nil/></value></member>
+<member>
+<name>result</name>
+<value><array><data>
+<value><string>8d6a8b91-22fc-4be4-863b-11dc4456b315</string></value>
+</data></array></value>
+</member>
+</struct></value>
+</param>
+</params>
+</methodResponse>
http://git-wip-us.apache.org/repos/asf/libcloud/blob/8639c4e3/libcloud/test/compute/fixtures/cloudframes/_machine_createFromTemplate.xml
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/cloudframes/_machine_createFromTemplate.xml b/libcloud/test/compute/fixtures/cloudframes/_machine_createFromTemplate.xml
new file mode 100644
index 0000000..fc4c138
--- /dev/null
+++ b/libcloud/test/compute/fixtures/cloudframes/_machine_createFromTemplate.xml
@@ -0,0 +1,17 @@
+<?xml version='1.0'?>
+<methodResponse>
+<params>
+<param>
+<value><struct>
+<member>
+<name>jobguid</name>
+<value><string>e7b75dd9-f4b0-4c11-8b3f-748306964ad7</string></value>
+</member>
+<member>
+<name>result</name>
+<value><string>96b2af78-88a0-48a6-a5bd-258e1d00c0b9</string></value>
+</member>
+</struct></value>
+</param>
+</params>
+</methodResponse>
http://git-wip-us.apache.org/repos/asf/libcloud/blob/8639c4e3/libcloud/test/compute/fixtures/cloudframes/_machine_delete.xml
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/cloudframes/_machine_delete.xml b/libcloud/test/compute/fixtures/cloudframes/_machine_delete.xml
new file mode 100644
index 0000000..17e4838
--- /dev/null
+++ b/libcloud/test/compute/fixtures/cloudframes/_machine_delete.xml
@@ -0,0 +1,17 @@
+<?xml version='1.0'?>
+<methodResponse>
+<params>
+<param>
+<value><struct>
+<member>
+<name>jobguid</name>
+<value><string>ac93fbb6-6b5d-4248-a627-efba9f4d76c7</string></value>
+</member>
+<member>
+<name>result</name>
+<value><boolean>1</boolean></value>
+</member>
+</struct></value>
+</param>
+</params>
+</methodResponse>
http://git-wip-us.apache.org/repos/asf/libcloud/blob/8639c4e3/libcloud/test/compute/fixtures/cloudframes/_machine_find_physical.xml
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/cloudframes/_machine_find_physical.xml b/libcloud/test/compute/fixtures/cloudframes/_machine_find_physical.xml
new file mode 100644
index 0000000..002804a
--- /dev/null
+++ b/libcloud/test/compute/fixtures/cloudframes/_machine_find_physical.xml
@@ -0,0 +1,18 @@
+<?xml version='1.0'?>
+<methodResponse>
+<params>
+<param>
+<value><struct>
+<member>
+<name>jobguid</name>
+<value><nil/></value></member>
+<member>
+<name>result</name>
+<value><array><data>
+<value><string>2aea45ee-3ea5-4b4f-88f0-7d4d48bed643</string></value>
+</data></array></value>
+</member>
+</struct></value>
+</param>
+</params>
+</methodResponse>
http://git-wip-us.apache.org/repos/asf/libcloud/blob/8639c4e3/libcloud/test/compute/fixtures/cloudframes/_machine_find_templates.xml
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/cloudframes/_machine_find_templates.xml b/libcloud/test/compute/fixtures/cloudframes/_machine_find_templates.xml
new file mode 100644
index 0000000..f557ca1
--- /dev/null
+++ b/libcloud/test/compute/fixtures/cloudframes/_machine_find_templates.xml
@@ -0,0 +1,18 @@
+<?xml version='1.0'?>
+<methodResponse>
+<params>
+<param>
+<value><struct>
+<member>
+<name>jobguid</name>
+<value><nil/></value></member>
+<member>
+<name>result</name>
+<value><array><data>
+<value><string>0c4da918-9f88-4049-a09c-8ab69142736a</string></value>
+</data></array></value>
+</member>
+</struct></value>
+</param>
+</params>
+</methodResponse>
http://git-wip-us.apache.org/repos/asf/libcloud/blob/8639c4e3/libcloud/test/compute/fixtures/cloudframes/_machine_find_virtualdesktop.xml
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/cloudframes/_machine_find_virtualdesktop.xml b/libcloud/test/compute/fixtures/cloudframes/_machine_find_virtualdesktop.xml
new file mode 100644
index 0000000..009a395
--- /dev/null
+++ b/libcloud/test/compute/fixtures/cloudframes/_machine_find_virtualdesktop.xml
@@ -0,0 +1,17 @@
+<?xml version='1.0'?>
+<methodResponse>
+<params>
+<param>
+<value><struct>
+<member>
+<name>jobguid</name>
+<value><nil/></value></member>
+<member>
+<name>result</name>
+<value><array><data>
+</data></array></value>
+</member>
+</struct></value>
+</param>
+</params>
+</methodResponse>
http://git-wip-us.apache.org/repos/asf/libcloud/blob/8639c4e3/libcloud/test/compute/fixtures/cloudframes/_machine_find_virtualserver.xml
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/cloudframes/_machine_find_virtualserver.xml b/libcloud/test/compute/fixtures/cloudframes/_machine_find_virtualserver.xml
new file mode 100644
index 0000000..09b6ca0
--- /dev/null
+++ b/libcloud/test/compute/fixtures/cloudframes/_machine_find_virtualserver.xml
@@ -0,0 +1,24 @@
+<?xml version='1.0'?>
+<methodResponse>
+<params>
+<param>
+<value><struct>
+<member>
+<name>jobguid</name>
+<value><nil/></value></member>
+<member>
+<name>result</name>
+<value><array><data>
+<value><string>dea11e50-1b53-4046-8589-cf52eb7b0d25</string></value>
+<value><string>c52e4a42-72fe-4f34-bb80-c57d237fcbf9</string></value>
+<value><string>64f325ef-28ac-4907-bd37-572a13178edd</string></value>
+<value><string>9a6b3101-b4ac-4ecb-b114-67d89994ac9b</string></value>
+<value><string>1dd57d0d-0e23-471d-9f34-b673c7c18bc3</string></value>
+<value><string>d3c98151-f064-45fc-a90a-23c481723895</string></value>
+<value><string>01dedf71-0c37-441e-9687-085f8bb116ea</string></value>
+</data></array></value>
+</member>
+</struct></value>
+</param>
+</params>
+</methodResponse>
http://git-wip-us.apache.org/repos/asf/libcloud/blob/8639c4e3/libcloud/test/compute/fixtures/cloudframes/_machine_listSnapshots.xml
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/cloudframes/_machine_listSnapshots.xml b/libcloud/test/compute/fixtures/cloudframes/_machine_listSnapshots.xml
new file mode 100644
index 0000000..231a4cd
--- /dev/null
+++ b/libcloud/test/compute/fixtures/cloudframes/_machine_listSnapshots.xml
@@ -0,0 +1,82 @@
+<?xml version='1.0'?>
+<methodResponse>
+<params>
+<param>
+<value><struct>
+<member>
+<name>jobguid</name>
+<value><nil/></value></member>
+<member>
+<name>result</name>
+<value><array><data>
+<value><struct>
+<member>
+<name>description</name>
+<value><nil/></value></member>
+<member>
+<name>backuplabel</name>
+<value><string>somelabel</string></value>
+</member>
+<member>
+<name>timestamp</name>
+<value><string>2013-07-25 13:20:52.093959</string></value>
+</member>
+<member>
+<name>consistent</name>
+<value><string>t</string></value>
+</member>
+<member>
+<name>name</name>
+<value><string>node-name-2013-07-25 13:20:52.093931</string></value>
+</member>
+<member>
+<name>snapshottype</name>
+<value><string>PAUSED</string></value>
+</member>
+<member>
+<name>guid</name>
+<value><string>4685d9b5-80e8-44d8-a094-f6f799f90954</string></value>
+</member>
+<member>
+<name>parentmachineguid</name>
+<value><string>26348bf8-2e2f-41e8-83c3-11fb5d14c9d2</string></value>
+</member>
+</struct></value>
+<value><struct>
+<member>
+<name>description</name>
+<value><nil/></value></member>
+<member>
+<name>backuplabel</name>
+<value><nil/></value></member>
+<member>
+<name>timestamp</name>
+<value><string>2013-07-25 13:19:39.437168</string></value>
+</member>
+<member>
+<name>consistent</name>
+<value><string>t</string></value>
+</member>
+<member>
+<name>name</name>
+<value><string>node-name-2013-07-25 13:19:39.437142</string></value>
+</member>
+<member>
+<name>snapshottype</name>
+<value><string>PAUSED</string></value>
+</member>
+<member>
+<name>guid</name>
+<value><string>5c00bd9e-6c18-4bee-83bf-5ff14426868a</string></value>
+</member>
+<member>
+<name>parentmachineguid</name>
+<value><string>96b2af78-88a0-48a6-a5bd-258e1d00c0b9</string></value>
+</member>
+</struct></value>
+</data></array></value>
+</member>
+</struct></value>
+</param>
+</params>
+</methodResponse>
http://git-wip-us.apache.org/repos/asf/libcloud/blob/8639c4e3/libcloud/test/compute/fixtures/cloudframes/_machine_list_machineguid_01dedf71-0c37-441e-9687-085f8bb116ea.xml
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/cloudframes/_machine_list_machineguid_01dedf71-0c37-441e-9687-085f8bb116ea.xml b/libcloud/test/compute/fixtures/cloudframes/_machine_list_machineguid_01dedf71-0c37-441e-9687-085f8bb116ea.xml
new file mode 100644
index 0000000..8039aaa
--- /dev/null
+++ b/libcloud/test/compute/fixtures/cloudframes/_machine_list_machineguid_01dedf71-0c37-441e-9687-085f8bb116ea.xml
@@ -0,0 +1,104 @@
+<?xml version='1.0'?>
+<methodResponse>
+<params>
+<param>
+<value><struct>
+<member>
+<name>jobguid</name>
+<value><nil/></value></member>
+<member>
+<name>result</name>
+<value><array><data>
+<value><struct>
+<member>
+<name>backup</name>
+<value><boolean>0</boolean></value>
+</member>
+<member>
+<name>replicationstatus</name>
+<value><nil/></value></member>
+<member>
+<name>machinerole</name>
+<value><nil/></value></member>
+<member>
+<name>isbackup</name>
+<value><boolean>0</boolean></value>
+</member>
+<member>
+<name>guid</name>
+<value><string>01dedf71-0c37-441e-9687-085f8bb116ea</string></value>
+</member>
+<member>
+<name>machinetype</name>
+<value><string>VIRTUALSERVER</string></value>
+</member>
+<member>
+<name>hostname</name>
+<value><nil/></value></member>
+<member>
+<name>vmachinemanagerid</name>
+<value><nil/></value></member>
+<member>
+<name>system</name>
+<value><boolean>0</boolean></value>
+</member>
+<member>
+<name>template</name>
+<value><boolean>0</boolean></value>
+</member>
+<member>
+<name>memory</name>
+<value><int>512</int></value>
+</member>
+<member>
+<name>agentguid</name>
+<value><nil/></value></member>
+<member>
+<name>status</name>
+<value><string>CONFIGURED</string></value>
+</member>
+<member>
+<name>nrcpu</name>
+<value><int>1</int></value>
+</member>
+<member>
+<name>bootstatus</name>
+<value><string>FROMDISK</string></value>
+</member>
+<member>
+<name>description</name>
+<value><string>AUTOTEST_94a50c23-715d-4fbc-8cdf-c3f436e04ec0</string></value>
+</member>
+<member>
+<name>importancefactor</name>
+<value><int>5</int></value>
+</member>
+<member>
+<name>replicationrole</name>
+<value><nil/></value></member>
+<member>
+<name>parentmachineguid</name>
+<value><string>2aea45ee-3ea5-4b4f-88f0-7d4d48bed643</string></value>
+</member>
+<member>
+<name>name</name>
+<value><string>AUTOTEST_94a50c23-715d-4fbc-8cdf-c3f436e04ec0</string></value>
+</member>
+<member>
+<name>hypervisor</name>
+<value><string>VMWARE_ESX</string></value>
+</member>
+<member>
+<name>replicationtype</name>
+<value><nil/></value></member>
+<member>
+<name>os</name>
+<value><string>ubuntu1010</string></value>
+</member>
+</struct></value>
+</data></array></value>
+</member>
+</struct></value>
+</param>
+</params>
+</methodResponse>
http://git-wip-us.apache.org/repos/asf/libcloud/blob/8639c4e3/libcloud/test/compute/fixtures/cloudframes/_machine_list_machineguid_0c4da918-9f88-4049-a09c-8ab69142736a.xml
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/cloudframes/_machine_list_machineguid_0c4da918-9f88-4049-a09c-8ab69142736a.xml b/libcloud/test/compute/fixtures/cloudframes/_machine_list_machineguid_0c4da918-9f88-4049-a09c-8ab69142736a.xml
new file mode 100644
index 0000000..6f4af84
--- /dev/null
+++ b/libcloud/test/compute/fixtures/cloudframes/_machine_list_machineguid_0c4da918-9f88-4049-a09c-8ab69142736a.xml
@@ -0,0 +1,105 @@
+<?xml version='1.0'?>
+<methodResponse>
+<params>
+<param>
+<value><struct>
+<member>
+<name>jobguid</name>
+<value><nil/></value></member>
+<member>
+<name>result</name>
+<value><array><data>
+<value><struct>
+<member>
+<name>backup</name>
+<value><boolean>0</boolean></value>
+</member>
+<member>
+<name>replicationstatus</name>
+<value><nil/></value></member>
+<member>
+<name>machinerole</name>
+<value><nil/></value></member>
+<member>
+<name>isbackup</name>
+<value><boolean>0</boolean></value>
+</member>
+<member>
+<name>guid</name>
+<value><string>0c4da918-9f88-4049-a09c-8ab69142736a</string></value>
+</member>
+<member>
+<name>machinetype</name>
+<value><string>VIRTUALSERVER</string></value>
+</member>
+<member>
+<name>hostname</name>
+<value><nil/></value></member>
+<member>
+<name>vmachinemanagerid</name>
+<value><int>2</int></value>
+</member>
+<member>
+<name>system</name>
+<value><boolean>0</boolean></value>
+</member>
+<member>
+<name>template</name>
+<value><boolean>1</boolean></value>
+</member>
+<member>
+<name>memory</name>
+<value><int>512</int></value>
+</member>
+<member>
+<name>agentguid</name>
+<value><nil/></value></member>
+<member>
+<name>status</name>
+<value><string>IMAGEONLY</string></value>
+</member>
+<member>
+<name>nrcpu</name>
+<value><int>1</int></value>
+</member>
+<member>
+<name>bootstatus</name>
+<value><string>FROMDISK</string></value>
+</member>
+<member>
+<name>description</name>
+<value><string>template_ubuntu_esx</string></value>
+</member>
+<member>
+<name>importancefactor</name>
+<value><int>5</int></value>
+</member>
+<member>
+<name>replicationrole</name>
+<value><nil/></value></member>
+<member>
+<name>parentmachineguid</name>
+<value><string>411f22e3-2e04-431b-adc7-2a952d2cadc6</string></value>
+</member>
+<member>
+<name>name</name>
+<value><string>ubuntu_esx</string></value>
+</member>
+<member>
+<name>hypervisor</name>
+<value><string>VMWARE_ESX</string></value>
+</member>
+<member>
+<name>replicationtype</name>
+<value><nil/></value></member>
+<member>
+<name>os</name>
+<value><string>ubuntu1010</string></value>
+</member>
+</struct></value>
+</data></array></value>
+</member>
+</struct></value>
+</param>
+</params>
+</methodResponse>
http://git-wip-us.apache.org/repos/asf/libcloud/blob/8639c4e3/libcloud/test/compute/fixtures/cloudframes/_machine_list_machineguid_1dd57d0d-0e23-471d-9f34-b673c7c18bc3.xml
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/cloudframes/_machine_list_machineguid_1dd57d0d-0e23-471d-9f34-b673c7c18bc3.xml b/libcloud/test/compute/fixtures/cloudframes/_machine_list_machineguid_1dd57d0d-0e23-471d-9f34-b673c7c18bc3.xml
new file mode 100644
index 0000000..1fcc91a
--- /dev/null
+++ b/libcloud/test/compute/fixtures/cloudframes/_machine_list_machineguid_1dd57d0d-0e23-471d-9f34-b673c7c18bc3.xml
@@ -0,0 +1,104 @@
+<?xml version='1.0'?>
+<methodResponse>
+<params>
+<param>
+<value><struct>
+<member>
+<name>jobguid</name>
+<value><nil/></value></member>
+<member>
+<name>result</name>
+<value><array><data>
+<value><struct>
+<member>
+<name>backup</name>
+<value><boolean>1</boolean></value>
+</member>
+<member>
+<name>replicationstatus</name>
+<value><nil/></value></member>
+<member>
+<name>machinerole</name>
+<value><nil/></value></member>
+<member>
+<name>isbackup</name>
+<value><boolean>0</boolean></value>
+</member>
+<member>
+<name>guid</name>
+<value><string>1dd57d0d-0e23-471d-9f34-b673c7c18bc3</string></value>
+</member>
+<member>
+<name>machinetype</name>
+<value><string>VIRTUALSERVER</string></value>
+</member>
+<member>
+<name>hostname</name>
+<value><nil/></value></member>
+<member>
+<name>vmachinemanagerid</name>
+<value><int>3</int></value>
+</member>
+<member>
+<name>system</name>
+<value><boolean>0</boolean></value>
+</member>
+<member>
+<name>template</name>
+<value><boolean>0</boolean></value>
+</member>
+<member>
+<name>memory</name>
+<value><int>512</int></value>
+</member>
+<member>
+<name>agentguid</name>
+<value><nil/></value></member>
+<member>
+<name>status</name>
+<value><string>RUNNING</string></value>
+</member>
+<member>
+<name>nrcpu</name>
+<value><int>1</int></value>
+</member>
+<member>
+<name>bootstatus</name>
+<value><string>FROMDISK</string></value>
+</member>
+<member>
+<name>description</name>
+<value><nil/></value></member>
+<member>
+<name>importancefactor</name>
+<value><int>5</int></value>
+</member>
+<member>
+<name>replicationrole</name>
+<value><nil/></value></member>
+<member>
+<name>parentmachineguid</name>
+<value><string>2aea45ee-3ea5-4b4f-88f0-7d4d48bed643</string></value>
+</member>
+<member>
+<name>name</name>
+<value><string>testvm_running</string></value>
+</member>
+<member>
+<name>hypervisor</name>
+<value><string>VMWARE_ESX</string></value>
+</member>
+<member>
+<name>replicationtype</name>
+<value><nil/></value></member>
+<member>
+<name>os</name>
+<value><string>ubuntu1010</string></value>
+</member>
+</struct></value>
+</data></array></value>
+</member>
+</struct></value>
+</param>
+</params>
+</methodResponse>
http://git-wip-us.apache.org/repos/asf/libcloud/blob/8639c4e3/libcloud/test/compute/fixtures/cloudframes/_machine_list_machineguid_2aea45ee-3ea5-4b4f-88f0-7d4d48bed643.xml
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/cloudframes/_machine_list_machineguid_2aea45ee-3ea5-4b4f-88f0-7d4d48bed643.xml b/libcloud/test/compute/fixtures/cloudframes/_machine_list_machineguid_2aea45ee-3ea5-4b4f-88f0-7d4d48bed643.xml
new file mode 100644
index 0000000..c5fb134
--- /dev/null
+++ b/libcloud/test/compute/fixtures/cloudframes/_machine_list_machineguid_2aea45ee-3ea5-4b4f-88f0-7d4d48bed643.xml
@@ -0,0 +1,104 @@
+<?xml version='1.0'?>
+<methodResponse>
+<params>
+<param>
+<value><struct>
+<member>
+<name>jobguid</name>
+<value><nil/></value></member>
+<member>
+<name>result</name>
+<value><array><data>
+<value><struct>
+<member>
+<name>backup</name>
+<value><boolean>0</boolean></value>
+</member>
+<member>
+<name>replicationstatus</name>
+<value><nil/></value></member>
+<member>
+<name>machinerole</name>
+<value><string>COMPUTENODE</string></value>
+</member>
+<member>
+<name>isbackup</name>
+<value><boolean>0</boolean></value>
+</member>
+<member>
+<name>guid</name>
+<value><string>2aea45ee-3ea5-4b4f-88f0-7d4d48bed643</string></value>
+</member>
+<member>
+<name>machinetype</name>
+<value><string>PHYSICAL</string></value>
+</member>
+<member>
+<name>hostname</name>
+<value><string>VMWARE-ESX-10-101-163-1</string></value>
+</member>
+<member>
+<name>vmachinemanagerid</name>
+<value><nil/></value></member>
+<member>
+<name>system</name>
+<value><boolean>0</boolean></value>
+</member>
+<member>
+<name>template</name>
+<value><boolean>0</boolean></value>
+</member>
+<member>
+<name>memory</name>
+<value><int>262111</int></value>
+</member>
+<member>
+<name>agentguid</name>
+<value><nil/></value></member>
+<member>
+<name>status</name>
+<value><string>RUNNING</string></value>
+</member>
+<member>
+<name>nrcpu</name>
+<value><int>24</int></value>
+</member>
+<member>
+<name>bootstatus</name>
+<value><string>FROMDISK</string></value>
+</member>
+<member>
+<name>description</name>
+<value><nil/></value></member>
+<member>
+<name>importancefactor</name>
+<value><int>5</int></value>
+</member>
+<member>
+<name>replicationrole</name>
+<value><nil/></value></member>
+<member>
+<name>parentmachineguid</name>
+<value><nil/></value></member>
+<member>
+<name>name</name>
+<value><string>VMWARE-ESX-10-101-163-1</string></value>
+</member>
+<member>
+<name>hypervisor</name>
+<value><string>VMWARE_ESX</string></value>
+</member>
+<member>
+<name>replicationtype</name>
+<value><nil/></value></member>
+<member>
+<name>os</name>
+<value><string>esxi5</string></value>
+</member>
+</struct></value>
+</data></array></value>
+</member>
+</struct></value>
+</param>
+</params>
+</methodResponse>
http://git-wip-us.apache.org/repos/asf/libcloud/blob/8639c4e3/libcloud/test/compute/fixtures/cloudframes/_machine_list_machineguid_64f325ef-28ac-4907-bd37-572a13178edd.xml
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/cloudframes/_machine_list_machineguid_64f325ef-28ac-4907-bd37-572a13178edd.xml b/libcloud/test/compute/fixtures/cloudframes/_machine_list_machineguid_64f325ef-28ac-4907-bd37-572a13178edd.xml
new file mode 100644
index 0000000..230ba45
--- /dev/null
+++ b/libcloud/test/compute/fixtures/cloudframes/_machine_list_machineguid_64f325ef-28ac-4907-bd37-572a13178edd.xml
@@ -0,0 +1,104 @@
+<?xml version='1.0'?>
+<methodResponse>
+<params>
+<param>
+<value><struct>
+<member>
+<name>jobguid</name>
+<value><nil/></value></member>
+<member>
+<name>result</name>
+<value><array><data>
+<value><struct>
+<member>
+<name>backup</name>
+<value><boolean>0</boolean></value>
+</member>
+<member>
+<name>replicationstatus</name>
+<value><nil/></value></member>
+<member>
+<name>machinerole</name>
+<value><nil/></value></member>
+<member>
+<name>isbackup</name>
+<value><boolean>0</boolean></value>
+</member>
+<member>
+<name>guid</name>
+<value><string>64f325ef-28ac-4907-bd37-572a13178edd</string></value>
+</member>
+<member>
+<name>machinetype</name>
+<value><string>VIRTUALSERVER</string></value>
+</member>
+<member>
+<name>hostname</name>
+<value><nil/></value></member>
+<member>
+<name>vmachinemanagerid</name>
+<value><int>9</int></value>
+</member>
+<member>
+<name>system</name>
+<value><boolean>0</boolean></value>
+</member>
+<member>
+<name>template</name>
+<value><boolean>0</boolean></value>
+</member>
+<member>
+<name>memory</name>
+<value><int>512</int></value>
+</member>
+<member>
+<name>agentguid</name>
+<value><nil/></value></member>
+<member>
+<name>status</name>
+<value><string>RUNNING</string></value>
+</member>
+<member>
+<name>nrcpu</name>
+<value><int>1</int></value>
+</member>
+<member>
+<name>bootstatus</name>
+<value><string>FROMDISK</string></value>
+</member>
+<member>
+<name>description</name>
+<value><nil/></value></member>
+<member>
+<name>importancefactor</name>
+<value><int>5</int></value>
+</member>
+<member>
+<name>replicationrole</name>
+<value><nil/></value></member>
+<member>
+<name>parentmachineguid</name>
+<value><string>2aea45ee-3ea5-4b4f-88f0-7d4d48bed643</string></value>
+</member>
+<member>
+<name>name</name>
+<value><string>testvm_clone</string></value>
+</member>
+<member>
+<name>hypervisor</name>
+<value><string>VMWARE_ESX</string></value>
+</member>
+<member>
+<name>replicationtype</name>
+<value><nil/></value></member>
+<member>
+<name>os</name>
+<value><string>ubuntu1010</string></value>
+</member>
+</struct></value>
+</data></array></value>
+</member>
+</struct></value>
+</param>
+</params>
+</methodResponse>
http://git-wip-us.apache.org/repos/asf/libcloud/blob/8639c4e3/libcloud/test/compute/fixtures/cloudframes/_machine_list_machineguid_96b2af78-88a0-48a6-a5bd-258e1d00c0b9.xml
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/cloudframes/_machine_list_machineguid_96b2af78-88a0-48a6-a5bd-258e1d00c0b9.xml b/libcloud/test/compute/fixtures/cloudframes/_machine_list_machineguid_96b2af78-88a0-48a6-a5bd-258e1d00c0b9.xml
new file mode 100644
index 0000000..ed038e6
--- /dev/null
+++ b/libcloud/test/compute/fixtures/cloudframes/_machine_list_machineguid_96b2af78-88a0-48a6-a5bd-258e1d00c0b9.xml
@@ -0,0 +1,104 @@
+<?xml version='1.0'?>
+<methodResponse>
+<params>
+<param>
+<value><struct>
+<member>
+<name>jobguid</name>
+<value><nil/></value></member>
+<member>
+<name>result</name>
+<value><array><data>
+<value><struct>
+<member>
+<name>backup</name>
+<value><boolean>0</boolean></value>
+</member>
+<member>
+<name>replicationstatus</name>
+<value><nil/></value></member>
+<member>
+<name>machinerole</name>
+<value><nil/></value></member>
+<member>
+<name>isbackup</name>
+<value><boolean>0</boolean></value>
+</member>
+<member>
+<name>guid</name>
+<value><string>96b2af78-88a0-48a6-a5bd-258e1d00c0b9</string></value>
+</member>
+<member>
+<name>machinetype</name>
+<value><string>VIRTUALSERVER</string></value>
+</member>
+<member>
+<name>hostname</name>
+<value><nil/></value></member>
+<member>
+<name>vmachinemanagerid</name>
+<value><nil/></value></member>
+<member>
+<name>system</name>
+<value><boolean>0</boolean></value>
+</member>
+<member>
+<name>template</name>
+<value><boolean>0</boolean></value>
+</member>
+<member>
+<name>memory</name>
+<value><int>512</int></value>
+</member>
+<member>
+<name>agentguid</name>
+<value><nil/></value></member>
+<member>
+<name>status</name>
+<value><string>CREATED</string></value>
+</member>
+<member>
+<name>nrcpu</name>
+<value><int>1</int></value>
+</member>
+<member>
+<name>bootstatus</name>
+<value><string>FROMDISK</string></value>
+</member>
+<member>
+<name>description</name>
+<value><string>node-name</string></value>
+</member>
+<member>
+<name>importancefactor</name>
+<value><int>5</int></value>
+</member>
+<member>
+<name>replicationrole</name>
+<value><nil/></value></member>
+<member>
+<name>parentmachineguid</name>
+<value><string>2aea45ee-3ea5-4b4f-88f0-7d4d48bed643</string></value>
+</member>
+<member>
+<name>name</name>
+<value><string>node-name</string></value>
+</member>
+<member>
+<name>hypervisor</name>
+<value><string>VMWARE_ESX</string></value>
+</member>
+<member>
+<name>replicationtype</name>
+<value><nil/></value></member>
+<member>
+<name>os</name>
+<value><string>ubuntu1010</string></value>
+</member>
+</struct></value>
+</data></array></value>
+</member>
+</struct></value>
+</param>
+</params>
+</methodResponse>
http://git-wip-us.apache.org/repos/asf/libcloud/blob/8639c4e3/libcloud/test/compute/fixtures/cloudframes/_machine_list_machineguid_9a6b3101-b4ac-4ecb-b114-67d89994ac9b.xml
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/cloudframes/_machine_list_machineguid_9a6b3101-b4ac-4ecb-b114-67d89994ac9b.xml b/libcloud/test/compute/fixtures/cloudframes/_machine_list_machineguid_9a6b3101-b4ac-4ecb-b114-67d89994ac9b.xml
new file mode 100644
index 0000000..13afbd2
--- /dev/null
+++ b/libcloud/test/compute/fixtures/cloudframes/_machine_list_machineguid_9a6b3101-b4ac-4ecb-b114-67d89994ac9b.xml
@@ -0,0 +1,104 @@
+<?xml version='1.0'?>
+<methodResponse>
+<params>
+<param>
+<value><struct>
+<member>
+<name>jobguid</name>
+<value><nil/></value></member>
+<member>
+<name>result</name>
+<value><array><data>
+<value><struct>
+<member>
+<name>backup</name>
+<value><boolean>1</boolean></value>
+</member>
+<member>
+<name>replicationstatus</name>
+<value><nil/></value></member>
+<member>
+<name>machinerole</name>
+<value><nil/></value></member>
+<member>
+<name>isbackup</name>
+<value><boolean>0</boolean></value>
+</member>
+<member>
+<name>guid</name>
+<value><string>9a6b3101-b4ac-4ecb-b114-67d89994ac9b</string></value>
+</member>
+<member>
+<name>machinetype</name>
+<value><string>VIRTUALSERVER</string></value>
+</member>
+<member>
+<name>hostname</name>
+<value><nil/></value></member>
+<member>
+<name>vmachinemanagerid</name>
+<value><int>7</int></value>
+</member>
+<member>
+<name>system</name>
+<value><boolean>0</boolean></value>
+</member>
+<member>
+<name>template</name>
+<value><boolean>0</boolean></value>
+</member>
+<member>
+<name>memory</name>
+<value><int>512</int></value>
+</member>
+<member>
+<name>agentguid</name>
+<value><nil/></value></member>
+<member>
+<name>status</name>
+<value><string>STOPPING</string></value>
+</member>
+<member>
+<name>nrcpu</name>
+<value><int>1</int></value>
+</member>
+<member>
+<name>bootstatus</name>
+<value><string>FROMDISK</string></value>
+</member>
+<member>
+<name>description</name>
+<value><nil/></value></member>
+<member>
+<name>importancefactor</name>
+<value><int>5</int></value>
+</member>
+<member>
+<name>replicationrole</name>
+<value><nil/></value></member>
+<member>
+<name>parentmachineguid</name>
+<value><string>2aea45ee-3ea5-4b4f-88f0-7d4d48bed643</string></value>
+</member>
+<member>
+<name>name</name>
+<value><string>testvm_stopped</string></value>
+</member>
+<member>
+<name>hypervisor</name>
+<value><string>VMWARE_ESX</string></value>
+</member>
+<member>
+<name>replicationtype</name>
+<value><nil/></value></member>
+<member>
+<name>os</name>
+<value><string>ubuntu1010</string></value>
+</member>
+</struct></value>
+</data></array></value>
+</member>
+</struct></value>
+</param>
+</params>
+</methodResponse>
http://git-wip-us.apache.org/repos/asf/libcloud/blob/8639c4e3/libcloud/test/compute/fixtures/cloudframes/_machine_list_machineguid_c52e4a42-72fe-4f34-bb80-c57d237fcbf9.xml
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/cloudframes/_machine_list_machineguid_c52e4a42-72fe-4f34-bb80-c57d237fcbf9.xml b/libcloud/test/compute/fixtures/cloudframes/_machine_list_machineguid_c52e4a42-72fe-4f34-bb80-c57d237fcbf9.xml
new file mode 100644
index 0000000..7db19fb
--- /dev/null
+++ b/libcloud/test/compute/fixtures/cloudframes/_machine_list_machineguid_c52e4a42-72fe-4f34-bb80-c57d237fcbf9.xml
@@ -0,0 +1,103 @@
+<?xml version='1.0'?>
+<methodResponse>
+<params>
+<param>
+<value><struct>
+<member>
+<name>jobguid</name>
+<value><nil/></value></member>
+<member>
+<name>result</name>
+<value><array><data>
+<value><struct>
+<member>
+<name>backup</name>
+<value><boolean>1</boolean></value>
+</member>
+<member>
+<name>replicationstatus</name>
+<value><nil/></value></member>
+<member>
+<name>machinerole</name>
+<value><nil/></value></member>
+<member>
+<name>isbackup</name>
+<value><boolean>0</boolean></value>
+</member>
+<member>
+<name>guid</name>
+<value><string>c52e4a42-72fe-4f34-bb80-c57d237fcbf9</string></value>
+</member>
+<member>
+<name>machinetype</name>
+<value><string>VIRTUALSERVER</string></value>
+</member>
+<member>
+<name>hostname</name>
+<value><nil/></value></member>
+<member>
+<name>vmachinemanagerid</name>
+<value><nil/></value></member>
+<member>
+<name>system</name>
+<value><boolean>0</boolean></value>
+</member>
+<member>
+<name>template</name>
+<value><boolean>0</boolean></value>
+</member>
+<member>
+<name>memory</name>
+<value><int>512</int></value>
+</member>
+<member>
+<name>agentguid</name>
+<value><nil/></value></member>
+<member>
+<name>status</name>
+<value><string>CREATED</string></value>
+</member>
+<member>
+<name>nrcpu</name>
+<value><int>1</int></value>
+</member>
+<member>
+<name>bootstatus</name>
+<value><string>FROMDISK</string></value>
+</member>
+<member>
+<name>description</name>
+<value><nil/></value></member>
+<member>
+<name>importancefactor</name>
+<value><int>5</int></value>
+</member>
+<member>
+<name>replicationrole</name>
+<value><nil/></value></member>
+<member>
+<name>parentmachineguid</name>
+<value><string>2aea45ee-3ea5-4b4f-88f0-7d4d48bed643</string></value>
+</member>
+<member>
+<name>name</name>
+<value><string>testvm_created</string></value>
+</member>
+<member>
+<name>hypervisor</name>
+<value><string>VMWARE_ESX</string></value>
+</member>
+<member>
+<name>replicationtype</name>
+<value><nil/></value></member>
+<member>
+<name>os</name>
+<value><string>ubuntu1010</string></value>
+</member>
+</struct></value>
+</data></array></value>
+</member>
+</struct></value>
+</param>
+</params>
+</methodResponse>
http://git-wip-us.apache.org/repos/asf/libcloud/blob/8639c4e3/libcloud/test/compute/fixtures/cloudframes/_machine_list_machineguid_d3c98151-f064-45fc-a90a-23c481723895.xml
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/cloudframes/_machine_list_machineguid_d3c98151-f064-45fc-a90a-23c481723895.xml b/libcloud/test/compute/fixtures/cloudframes/_machine_list_machineguid_d3c98151-f064-45fc-a90a-23c481723895.xml
new file mode 100644
index 0000000..d95bc44
--- /dev/null
+++ b/libcloud/test/compute/fixtures/cloudframes/_machine_list_machineguid_d3c98151-f064-45fc-a90a-23c481723895.xml
@@ -0,0 +1,104 @@
+<?xml version='1.0'?>
+<methodResponse>
+<params>
+<param>
+<value><struct>
+<member>
+<name>jobguid</name>
+<value><nil/></value></member>
+<member>
+<name>result</name>
+<value><array><data>
+<value><struct>
+<member>
+<name>backup</name>
+<value><boolean>0</boolean></value>
+</member>
+<member>
+<name>replicationstatus</name>
+<value><nil/></value></member>
+<member>
+<name>machinerole</name>
+<value><nil/></value></member>
+<member>
+<name>isbackup</name>
+<value><boolean>0</boolean></value>
+</member>
+<member>
+<name>guid</name>
+<value><string>d3c98151-f064-45fc-a90a-23c481723895</string></value>
+</member>
+<member>
+<name>machinetype</name>
+<value><string>VIRTUALSERVER</string></value>
+</member>
+<member>
+<name>hostname</name>
+<value><nil/></value></member>
+<member>
+<name>vmachinemanagerid</name>
+<value><nil/></value></member>
+<member>
+<name>system</name>
+<value><boolean>0</boolean></value>
+</member>
+<member>
+<name>template</name>
+<value><boolean>0</boolean></value>
+</member>
+<member>
+<name>memory</name>
+<value><int>512</int></value>
+</member>
+<member>
+<name>agentguid</name>
+<value><nil/></value></member>
+<member>
+<name>status</name>
+<value><string>CONFIGURED</string></value>
+</member>
+<member>
+<name>nrcpu</name>
+<value><int>1</int></value>
+</member>
+<member>
+<name>bootstatus</name>
+<value><string>FROMDISK</string></value>
+</member>
+<member>
+<name>description</name>
+<value><string>AUTOTEST_ec71742b-bd74-4908-8327-717c349e0d79</string></value>
+</member>
+<member>
+<name>importancefactor</name>
+<value><int>5</int></value>
+</member>
+<member>
+<name>replicationrole</name>
+<value><nil/></value></member>
+<member>
+<name>parentmachineguid</name>
+<value><string>2aea45ee-3ea5-4b4f-88f0-7d4d48bed643</string></value>
+</member>
+<member>
+<name>name</name>
+<value><string>AUTOTEST_ec71742b-bd74-4908-8327-717c349e0d79</string></value>
+</member>
+<member>
+<name>hypervisor</name>
+<value><string>VMWARE_ESX</string></value>
+</member>
+<member>
+<name>replicationtype</name>
+<value><nil/></value></member>
+<member>
+<name>os</name>
+<value><string>ubuntu1010</string></value>
+</member>
+</struct></value>
+</data></array></value>
+</member>
+</struct></value>
+</param>
+</params>
+</methodResponse>
http://git-wip-us.apache.org/repos/asf/libcloud/blob/8639c4e3/libcloud/test/compute/fixtures/cloudframes/_machine_list_machineguid_dea11e50-1b53-4046-8589-cf52eb7b0d25.xml
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/cloudframes/_machine_list_machineguid_dea11e50-1b53-4046-8589-cf52eb7b0d25.xml b/libcloud/test/compute/fixtures/cloudframes/_machine_list_machineguid_dea11e50-1b53-4046-8589-cf52eb7b0d25.xml
new file mode 100644
index 0000000..bd7575f
--- /dev/null
+++ b/libcloud/test/compute/fixtures/cloudframes/_machine_list_machineguid_dea11e50-1b53-4046-8589-cf52eb7b0d25.xml
@@ -0,0 +1,104 @@
+<?xml version='1.0'?>
+<methodResponse>
+<params>
+<param>
+<value><struct>
+<member>
+<name>jobguid</name>
+<value><nil/></value></member>
+<member>
+<name>result</name>
+<value><array><data>
+<value><struct>
+<member>
+<name>backup</name>
+<value><boolean>1</boolean></value>
+</member>
+<member>
+<name>replicationstatus</name>
+<value><nil/></value></member>
+<member>
+<name>machinerole</name>
+<value><nil/></value></member>
+<member>
+<name>isbackup</name>
+<value><boolean>0</boolean></value>
+</member>
+<member>
+<name>guid</name>
+<value><string>dea11e50-1b53-4046-8589-cf52eb7b0d25</string></value>
+</member>
+<member>
+<name>machinetype</name>
+<value><string>VIRTUALSERVER</string></value>
+</member>
+<member>
+<name>hostname</name>
+<value><nil/></value></member>
+<member>
+<name>vmachinemanagerid</name>
+<value><int>5</int></value>
+</member>
+<member>
+<name>system</name>
+<value><boolean>0</boolean></value>
+</member>
+<member>
+<name>template</name>
+<value><boolean>0</boolean></value>
+</member>
+<member>
+<name>memory</name>
+<value><int>512</int></value>
+</member>
+<member>
+<name>agentguid</name>
+<value><nil/></value></member>
+<member>
+<name>status</name>
+<value><string>PAUSED</string></value>
+</member>
+<member>
+<name>nrcpu</name>
+<value><int>1</int></value>
+</member>
+<member>
+<name>bootstatus</name>
+<value><string>FROMDISK</string></value>
+</member>
+<member>
+<name>description</name>
+<value><nil/></value></member>
+<member>
+<name>importancefactor</name>
+<value><int>5</int></value>
+</member>
+<member>
+<name>replicationrole</name>
+<value><nil/></value></member>
+<member>
+<name>parentmachineguid</name>
+<value><string>2aea45ee-3ea5-4b4f-88f0-7d4d48bed643</string></value>
+</member>
+<member>
+<name>name</name>
+<value><string>testvm_paused</string></value>
+</member>
+<member>
+<name>hypervisor</name>
+<value><string>VMWARE_ESX</string></value>
+</member>
+<member>
+<name>replicationtype</name>
+<value><nil/></value></member>
+<member>
+<name>os</name>
+<value><string>ubuntu1010</string></value>
+</member>
+</struct></value>
+</data></array></value>
+</member>
+</struct></value>
+</param>
+</params>
+</methodResponse>
[4/4] git commit: Update changes.
Posted by to...@apache.org.
Update changes.
Project: http://git-wip-us.apache.org/repos/asf/libcloud/repo
Commit: http://git-wip-us.apache.org/repos/asf/libcloud/commit/268ff0ef
Tree: http://git-wip-us.apache.org/repos/asf/libcloud/tree/268ff0ef
Diff: http://git-wip-us.apache.org/repos/asf/libcloud/diff/268ff0ef
Branch: refs/heads/trunk
Commit: 268ff0ef9598cdc0c0bf67fab65f24dc8a714cf5
Parents: 487b0bc
Author: Tomaz Muraus <to...@apache.org>
Authored: Sat Oct 26 00:29:57 2013 +0200
Committer: Tomaz Muraus <to...@apache.org>
Committed: Sat Oct 26 00:29:57 2013 +0200
----------------------------------------------------------------------
CHANGES | 4 ++++
1 file changed, 4 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/libcloud/blob/268ff0ef/CHANGES
----------------------------------------------------------------------
diff --git a/CHANGES b/CHANGES
index d47cf33..d864711 100644
--- a/CHANGES
+++ b/CHANGES
@@ -18,6 +18,10 @@ Changes with Apache Libcloud in development
Note: Old method will continue to work until the next major release.
[Tomaz Muraus]
+ - Add new driver for CloudFrames (http://www.cloudfounders.com/CloudFrames)
+ provider. (LIBCLOUD-358)
+ [Bernard Kerckenaere]
+
Changes with Apache Libcloud 0.14.0-beta2
*) Compute
[3/4] git commit: pep8 fixes.
Posted by to...@apache.org.
pep8 fixes.
Project: http://git-wip-us.apache.org/repos/asf/libcloud/repo
Commit: http://git-wip-us.apache.org/repos/asf/libcloud/commit/487b0bcc
Tree: http://git-wip-us.apache.org/repos/asf/libcloud/tree/487b0bcc
Diff: http://git-wip-us.apache.org/repos/asf/libcloud/diff/487b0bcc
Branch: refs/heads/trunk
Commit: 487b0bcc0439a93f4e7c3c63b3124a2c1aa5fd5e
Parents: 8639c4e
Author: Tomaz Muraus <to...@apache.org>
Authored: Sat Oct 26 00:28:13 2013 +0200
Committer: Tomaz Muraus <to...@apache.org>
Committed: Sat Oct 26 00:28:13 2013 +0200
----------------------------------------------------------------------
libcloud/test/compute/test_cloudframes.py | 1 -
1 file changed, 1 deletion(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/libcloud/blob/487b0bcc/libcloud/test/compute/test_cloudframes.py
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/test_cloudframes.py b/libcloud/test/compute/test_cloudframes.py
index 84441db..1698198 100644
--- a/libcloud/test/compute/test_cloudframes.py
+++ b/libcloud/test/compute/test_cloudframes.py
@@ -23,7 +23,6 @@ from libcloud.compute.base import Node, NodeImage, NodeLocation
from libcloud.compute.types import NodeState
from libcloud.compute.drivers.cloudframes import CloudFramesNodeDriver
from libcloud.compute.drivers.cloudframes import CloudFramesSnapshot
-from libcloud.compute.drivers.cloudframes import CloudFramesException
from libcloud.utils.py3 import httplib, xmlrpclib, b
from libcloud.test import MockHttpTestCase