From 4b3bfb238b4a79eb767c798e3db4e5b27e238708 Mon Sep 17 00:00:00 2001
From: Bernard Kerckenaere <bernieke@bernieke.com>
Date: Tue, 16 Jul 2013 17:23:54 +0200
Subject: [PATCH] Issue LIBCLOUD-358: Add compute driver for CloudFounders
 CloudFrames.

---
 docs/compute/_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 ++
 docs/examples/compute/cloudframes/auth_kwargs.py   |   6 +
 docs/examples/compute/cloudframes/auth_url.py      |   5 +
 docs/examples/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 +
 .../cloudframes/_machine_find_virtualdesktop.xml   |  17 +
 .../cloudframes/_machine_find_virtualserver.xml    |  24 ++
 .../cloudframes/_machine_listSnapshots.xml         |  82 ++++
 ...neguid_01dedf71-0c37-441e-9687-085f8bb116ea.xml | 104 +++++
 ...neguid_0c4da918-9f88-4049-a09c-8ab69142736a.xml | 105 +++++
 ...neguid_1dd57d0d-0e23-471d-9f34-b673c7c18bc3.xml | 104 +++++
 ...neguid_2aea45ee-3ea5-4b4f-88f0-7d4d48bed643.xml | 104 +++++
 ...neguid_64f325ef-28ac-4907-bd37-572a13178edd.xml | 104 +++++
 ...neguid_96b2af78-88a0-48a6-a5bd-258e1d00c0b9.xml | 104 +++++
 ...neguid_9a6b3101-b4ac-4ecb-b114-67d89994ac9b.xml | 104 +++++
 ...neguid_c52e4a42-72fe-4f34-bb80-c57d237fcbf9.xml | 103 +++++
 ...neguid_d3c98151-f064-45fc-a90a-23c481723895.xml | 104 +++++
 ...neguid_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 +
 .../compute/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(-)
 create mode 100644 docs/compute/drivers/cloudframes.rst
 create mode 100644 docs/examples/compute/cloudframes/auth_kwargs.py
 create mode 100644 docs/examples/compute/cloudframes/auth_url.py
 create mode 100644 docs/examples/compute/cloudframes/functionality.py
 create mode 100644 libcloud/compute/drivers/cloudframes.py
 create mode 100644 libcloud/test/compute/fixtures/cloudframes/_cloudspace_find.xml
 create mode 100644 libcloud/test/compute/fixtures/cloudframes/_lan_find.xml
 create mode 100644 libcloud/test/compute/fixtures/cloudframes/_machine_createFromTemplate.xml
 create mode 100644 libcloud/test/compute/fixtures/cloudframes/_machine_delete.xml
 create mode 100644 libcloud/test/compute/fixtures/cloudframes/_machine_find_physical.xml
 create mode 100644 libcloud/test/compute/fixtures/cloudframes/_machine_find_templates.xml
 create mode 100644 libcloud/test/compute/fixtures/cloudframes/_machine_find_virtualdesktop.xml
 create mode 100644 libcloud/test/compute/fixtures/cloudframes/_machine_find_virtualserver.xml
 create mode 100644 libcloud/test/compute/fixtures/cloudframes/_machine_listSnapshots.xml
 create mode 100644 libcloud/test/compute/fixtures/cloudframes/_machine_list_machineguid_01dedf71-0c37-441e-9687-085f8bb116ea.xml
 create mode 100644 libcloud/test/compute/fixtures/cloudframes/_machine_list_machineguid_0c4da918-9f88-4049-a09c-8ab69142736a.xml
 create mode 100644 libcloud/test/compute/fixtures/cloudframes/_machine_list_machineguid_1dd57d0d-0e23-471d-9f34-b673c7c18bc3.xml
 create mode 100644 libcloud/test/compute/fixtures/cloudframes/_machine_list_machineguid_2aea45ee-3ea5-4b4f-88f0-7d4d48bed643.xml
 create mode 100644 libcloud/test/compute/fixtures/cloudframes/_machine_list_machineguid_64f325ef-28ac-4907-bd37-572a13178edd.xml
 create mode 100644 libcloud/test/compute/fixtures/cloudframes/_machine_list_machineguid_96b2af78-88a0-48a6-a5bd-258e1d00c0b9.xml
 create mode 100644 libcloud/test/compute/fixtures/cloudframes/_machine_list_machineguid_9a6b3101-b4ac-4ecb-b114-67d89994ac9b.xml
 create mode 100644 libcloud/test/compute/fixtures/cloudframes/_machine_list_machineguid_c52e4a42-72fe-4f34-bb80-c57d237fcbf9.xml
 create mode 100644 libcloud/test/compute/fixtures/cloudframes/_machine_list_machineguid_d3c98151-f064-45fc-a90a-23c481723895.xml
 create mode 100644 libcloud/test/compute/fixtures/cloudframes/_machine_list_machineguid_dea11e50-1b53-4046-8589-cf52eb7b0d25.xml
 create mode 100644 libcloud/test/compute/fixtures/cloudframes/_machine_reboot.xml
 create mode 100644 libcloud/test/compute/fixtures/cloudframes/_machine_rollback.xml
 create mode 100644 libcloud/test/compute/fixtures/cloudframes/_machine_snapshot.xml
 create mode 100644 libcloud/test/compute/fixtures/cloudframes/_machine_start.xml
 create mode 100644 libcloud/test/compute/fixtures/cloudframes/_machine_stop.xml
 create mode 100644 libcloud/test/compute/test_cloudframes.py

diff --git a/docs/compute/_supported_methods_block_storage.rst b/docs/compute/_supported_methods_block_storage.rst
index 80f63de..edca534 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/
diff --git a/docs/compute/_supported_methods_main.rst b/docs/compute/_supported_methods_main.rst
index f92b57a..0654f40 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/
diff --git a/docs/compute/_supported_providers.rst b/docs/compute/_supported_providers.rst
index adff3e5..a110fab 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/
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
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)
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')
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)
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()
diff --git a/libcloud/compute/providers.py b/libcloud/compute/providers.py
index 26bc284..9e28b6e 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'),
 }
 
 
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'
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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())
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')
-- 
1.8.4.1

