libcloud-notifications mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From to...@apache.org
Subject git commit: Add support for the Outscale SAS cloud.
Date Wed, 07 May 2014 15:44:07 GMT
Repository: libcloud
Updated Branches:
  refs/heads/trunk 940e10da2 -> 0a049c43f


Add support for the Outscale SAS cloud.

This commit introduce the Outscale SAS cloud an european cloud provider
featuring an EC2 compatible API.

Special care have been taken to leave room for Outscale INC an US based cloud
using the same infrastructure but governed by US laws.

Closes #285

Signed-off-by: Tomaz Muraus <tomaz@apache.org>


Project: http://git-wip-us.apache.org/repos/asf/libcloud/repo
Commit: http://git-wip-us.apache.org/repos/asf/libcloud/commit/0a049c43
Tree: http://git-wip-us.apache.org/repos/asf/libcloud/tree/0a049c43
Diff: http://git-wip-us.apache.org/repos/asf/libcloud/diff/0a049c43

Branch: refs/heads/trunk
Commit: 0a049c43fe565021879401c5b59333a387f9a240
Parents: 940e10d
Author: Benoît Canet <benoit.canet@irqsave.net>
Authored: Tue Apr 15 15:50:54 2014 +0200
Committer: Tomaz Muraus <tomaz@apache.org>
Committed: Wed May 7 16:51:54 2014 +0200

----------------------------------------------------------------------
 CHANGES.rst                                     |   4 +
 docs/_static/images/provider_logos/outscale.png | Bin 0 -> 8437 bytes
 .../_supported_methods_block_storage.rst        |   2 +
 .../_supported_methods_image_management.rst     |   2 +
 .../_supported_methods_key_pair_management.rst  |   2 +
 docs/compute/_supported_methods_main.rst        |   2 +
 docs/compute/_supported_providers.rst           | 124 ++--
 docs/compute/drivers/outscale_sas.rst           |  31 +
 libcloud/compute/drivers/ec2.py                 | 596 ++++++++++++++++++-
 libcloud/compute/providers.py                   |   2 +
 libcloud/compute/types.py                       |   2 +
 libcloud/data/pricing.json                      |  69 +++
 libcloud/test/compute/test_ec2.py               |  93 +++
 13 files changed, 867 insertions(+), 62 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/libcloud/blob/0a049c43/CHANGES.rst
----------------------------------------------------------------------
diff --git a/CHANGES.rst b/CHANGES.rst
index 8a64df2..0e4ba16 100644
--- a/CHANGES.rst
+++ b/CHANGES.rst
@@ -123,6 +123,10 @@ Compute
   (GITHUB-287)
   [earthgecko]
 
+- Add a new driver for Outscale cloud (http://www.outscale.com).
+  (GITHUB-285)
+  [Benoit Canet]
+
 Load Balancer
 ~~~~~~~~~~~~~
 

http://git-wip-us.apache.org/repos/asf/libcloud/blob/0a049c43/docs/_static/images/provider_logos/outscale.png
----------------------------------------------------------------------
diff --git a/docs/_static/images/provider_logos/outscale.png b/docs/_static/images/provider_logos/outscale.png
new file mode 100644
index 0000000..c11c92a
Binary files /dev/null and b/docs/_static/images/provider_logos/outscale.png differ

http://git-wip-us.apache.org/repos/asf/libcloud/blob/0a049c43/docs/compute/_supported_methods_block_storage.rst
----------------------------------------------------------------------
diff --git a/docs/compute/_supported_methods_block_storage.rst b/docs/compute/_supported_methods_block_storage.rst
index 23860db..ffbd0bc 100644
--- a/docs/compute/_supported_methods_block_storage.rst
+++ b/docs/compute/_supported_methods_block_storage.rst
@@ -47,6 +47,7 @@ Provider                              list volumes create volume destroy volume
 `OpenNebula (v3.8)`_                  yes          yes           yes            yes           yes           no             no             
 `OpenStack`_                          yes          yes           yes            yes           yes           no             no             
 `Opsource`_                           no           no            no             no            no            no             no             
+`Outscale SAS`_                       yes          yes           yes            yes           yes           yes            yes            
 `Rackspace Cloud (Next Gen)`_         yes          yes           yes            yes           yes           no             no             
 `Rackspace Cloud (First Gen)`_        yes          yes           yes            yes           yes           no             no             
 `RimuHosting`_                        no           no            no             no            no            no             no             
@@ -106,6 +107,7 @@ Provider                              list volumes create volume destroy volume
 .. _`OpenNebula (v3.8)`: http://opennebula.org/
 .. _`OpenStack`: http://openstack.org/
 .. _`Opsource`: http://www.opsource.net/
+.. _`Outscale SAS`: http://www.outscale.com
 .. _`Rackspace Cloud (Next Gen)`: http://www.rackspace.com
 .. _`Rackspace Cloud (First Gen)`: http://www.rackspace.com
 .. _`RimuHosting`: http://rimuhosting.com/

http://git-wip-us.apache.org/repos/asf/libcloud/blob/0a049c43/docs/compute/_supported_methods_image_management.rst
----------------------------------------------------------------------
diff --git a/docs/compute/_supported_methods_image_management.rst b/docs/compute/_supported_methods_image_management.rst
index 787d858..9dcb206 100644
--- a/docs/compute/_supported_methods_image_management.rst
+++ b/docs/compute/_supported_methods_image_management.rst
@@ -47,6 +47,7 @@ Provider                              list images get image create image delete
 `OpenNebula (v3.8)`_                  yes         no        no           no           no        
 `OpenStack`_                          yes         yes       no           no           no        
 `Opsource`_                           yes         no        no           no           no        
+`Outscale SAS`_                       yes         yes       yes          yes          yes       
 `Rackspace Cloud (Next Gen)`_         yes         yes       yes          yes          no        
 `Rackspace Cloud (First Gen)`_        yes         yes       yes          yes          no        
 `RimuHosting`_                        yes         no        no           no           no        
@@ -106,6 +107,7 @@ Provider                              list images get image create image delete
 .. _`OpenNebula (v3.8)`: http://opennebula.org/
 .. _`OpenStack`: http://openstack.org/
 .. _`Opsource`: http://www.opsource.net/
+.. _`Outscale SAS`: http://www.outscale.com
 .. _`Rackspace Cloud (Next Gen)`: http://www.rackspace.com
 .. _`Rackspace Cloud (First Gen)`: http://www.rackspace.com
 .. _`RimuHosting`: http://rimuhosting.com/

http://git-wip-us.apache.org/repos/asf/libcloud/blob/0a049c43/docs/compute/_supported_methods_key_pair_management.rst
----------------------------------------------------------------------
diff --git a/docs/compute/_supported_methods_key_pair_management.rst b/docs/compute/_supported_methods_key_pair_management.rst
index 2bc8fed..d37d987 100644
--- a/docs/compute/_supported_methods_key_pair_management.rst
+++ b/docs/compute/_supported_methods_key_pair_management.rst
@@ -47,6 +47,7 @@ Provider                              list key pairs get key pair create key pai
 `OpenNebula (v3.8)`_                  no             no           no              no                            no                          no             
 `OpenStack`_                          no             no           no              no                            no                          no             
 `Opsource`_                           no             no           no              no                            no                          no             
+`Outscale SAS`_                       yes            yes          yes             yes                           no                          yes            
 `Rackspace Cloud (Next Gen)`_         yes            yes          yes             yes                           no                          yes            
 `Rackspace Cloud (First Gen)`_        no             no           no              no                            no                          no             
 `RimuHosting`_                        no             no           no              no                            no                          no             
@@ -106,6 +107,7 @@ Provider                              list key pairs get key pair create key pai
 .. _`OpenNebula (v3.8)`: http://opennebula.org/
 .. _`OpenStack`: http://openstack.org/
 .. _`Opsource`: http://www.opsource.net/
+.. _`Outscale SAS`: http://www.outscale.com
 .. _`Rackspace Cloud (Next Gen)`: http://www.rackspace.com
 .. _`Rackspace Cloud (First Gen)`: http://www.rackspace.com
 .. _`RimuHosting`: http://rimuhosting.com/

http://git-wip-us.apache.org/repos/asf/libcloud/blob/0a049c43/docs/compute/_supported_methods_main.rst
----------------------------------------------------------------------
diff --git a/docs/compute/_supported_methods_main.rst b/docs/compute/_supported_methods_main.rst
index 84ffffd..c2f728e 100644
--- a/docs/compute/_supported_methods_main.rst
+++ b/docs/compute/_supported_methods_main.rst
@@ -47,6 +47,7 @@ Provider                              list nodes create node reboot node destroy
 `OpenNebula (v3.8)`_                  yes        yes         yes         yes          yes         yes        no         
 `OpenStack`_                          yes        no          yes         yes          yes         yes        no         
 `Opsource`_                           yes        yes         yes         yes          yes         yes        yes        
+`Outscale SAS`_                       yes        yes         yes         yes          yes         yes        yes        
 `Rackspace Cloud (Next Gen)`_         yes        yes         yes         yes          yes         yes        yes        
 `Rackspace Cloud (First Gen)`_        yes        yes         yes         yes          yes         yes        yes        
 `RimuHosting`_                        yes        yes         yes         yes          yes         yes        yes        
@@ -106,6 +107,7 @@ Provider                              list nodes create node reboot node destroy
 .. _`OpenNebula (v3.8)`: http://opennebula.org/
 .. _`OpenStack`: http://openstack.org/
 .. _`Opsource`: http://www.opsource.net/
+.. _`Outscale SAS`: http://www.outscale.com
 .. _`Rackspace Cloud (Next Gen)`: http://www.rackspace.com
 .. _`Rackspace Cloud (First Gen)`: http://www.rackspace.com
 .. _`RimuHosting`: http://rimuhosting.com/

http://git-wip-us.apache.org/repos/asf/libcloud/blob/0a049c43/docs/compute/_supported_providers.rst
----------------------------------------------------------------------
diff --git a/docs/compute/_supported_providers.rst b/docs/compute/_supported_providers.rst
index 0a2c888..5960b8c 100644
--- a/docs/compute/_supported_providers.rst
+++ b/docs/compute/_supported_providers.rst
@@ -1,64 +1,65 @@
-===================================== =========================================== =================== ============================================== ====================================
-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 (API v2.0)`_              :doc:`Click </compute/drivers/cloudsigma>`  CLOUDSIGMA          :mod:`libcloud.compute.drivers.cloudsigma`     :class:`CloudSigmaNodeDriver`       
-`CloudStack`_                         :doc:`Click </compute/drivers/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`              
-`Exoscale`_                           :doc:`Click </compute/drivers/exoscale>`    EXOSCALE            :mod:`libcloud.compute.drivers.exoscale`       :class:`ExoscaleNodeDriver`         
-`Gandi`_                                                                          GANDI               :mod:`libcloud.compute.drivers.gandi`          :class:`GandiNodeDriver`            
-`Google Compute Engine`_              :doc:`Click </compute/drivers/gce>`         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`              
-`Ikoula`_                             :doc:`Click </compute/drivers/ikoula>`      IKOULA              :mod:`libcloud.compute.drivers.ikoula`         :class:`IkoulaNodeDriver`           
-`Joyent`_                                                                         JOYENT              :mod:`libcloud.compute.drivers.joyent`         :class:`JoyentNodeDriver`           
-`KTUCloud`_                                                                       KTUCLOUD            :mod:`libcloud.compute.drivers.ktucloud`       :class:`KTUCloudNodeDriver`         
-`Libvirt`_                            :doc:`Click </compute/drivers/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 (v3.8)`_                                                              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)`_         :doc:`Click </compute/drivers/rackspace>`   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`       
-`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 (API v2.0)`_              :doc:`Click </compute/drivers/cloudsigma>`   CLOUDSIGMA          :mod:`libcloud.compute.drivers.cloudsigma`     :class:`CloudSigmaNodeDriver`       
+`CloudStack`_                         :doc:`Click </compute/drivers/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`              
+`Exoscale`_                           :doc:`Click </compute/drivers/exoscale>`     EXOSCALE            :mod:`libcloud.compute.drivers.exoscale`       :class:`ExoscaleNodeDriver`         
+`Gandi`_                                                                           GANDI               :mod:`libcloud.compute.drivers.gandi`          :class:`GandiNodeDriver`            
+`Google Compute Engine`_              :doc:`Click </compute/drivers/gce>`          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`              
+`Ikoula`_                             :doc:`Click </compute/drivers/ikoula>`       IKOULA              :mod:`libcloud.compute.drivers.ikoula`         :class:`IkoulaNodeDriver`           
+`Joyent`_                                                                          JOYENT              :mod:`libcloud.compute.drivers.joyent`         :class:`JoyentNodeDriver`           
+`KTUCloud`_                                                                        KTUCLOUD            :mod:`libcloud.compute.drivers.ktucloud`       :class:`KTUCloudNodeDriver`         
+`Libvirt`_                            :doc:`Click </compute/drivers/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 (v3.8)`_                                                               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`         
+`Outscale SAS`_                       :doc:`Click </compute/drivers/outscale_sas>` OUTSCALE_SAS        :mod:`libcloud.compute.drivers.ec2`            :class:`OutscaleSASNodeDriver`      
+`Rackspace Cloud (Next Gen)`_         :doc:`Click </compute/drivers/rackspace>`    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`       
+`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
@@ -106,6 +107,7 @@ Provider                              Documentation
 .. _`OpenNebula (v3.8)`: http://opennebula.org/
 .. _`OpenStack`: http://openstack.org/
 .. _`Opsource`: http://www.opsource.net/
+.. _`Outscale SAS`: http://www.outscale.com
 .. _`Rackspace Cloud (Next Gen)`: http://www.rackspace.com
 .. _`Rackspace Cloud (First Gen)`: http://www.rackspace.com
 .. _`RimuHosting`: http://rimuhosting.com/

http://git-wip-us.apache.org/repos/asf/libcloud/blob/0a049c43/docs/compute/drivers/outscale_sas.rst
----------------------------------------------------------------------
diff --git a/docs/compute/drivers/outscale_sas.rst b/docs/compute/drivers/outscale_sas.rst
new file mode 100644
index 0000000..03e7d4e
--- /dev/null
+++ b/docs/compute/drivers/outscale_sas.rst
@@ -0,0 +1,31 @@
+Outscale Driver Documentation
+=============================
+
+`Outscale SAS`_ provides an IaaS platform allowing
+developers to benefit from all the flexibility of the Cloud.
+This IaaS platform relies on TINA OS, its Cloud manager which purpose is to
+provide great performances on the Cloud.
+TINA OS is an own developed software with APIs compatible with AWS EC2 (TM).
+
+.. figure:: /_static/images/provider_logos/outscale.png
+    :align: center
+    :width: 300
+    :target: https://www.outscale.com/
+
+Outscale users can start virtual machines in the following regions:
+
+* EU West (Paris France) Region
+* US East (Boston US) Region
+* (Soon) US East (New Jersey) Region
+* (Soon) Asia (Hong Kong) Region
+
+Outscale SAS is an european company: prices are in €.
+
+API Docs
+--------
+
+.. autoclass:: libcloud.compute.drivers.ec2.OutscaleNodeDriver
+    :members:
+    :inherited-members:
+
+.. _`Outscale SAS`: https://www.outscale.com/

http://git-wip-us.apache.org/repos/asf/libcloud/blob/0a049c43/libcloud/compute/drivers/ec2.py
----------------------------------------------------------------------
diff --git a/libcloud/compute/drivers/ec2.py b/libcloud/compute/drivers/ec2.py
index 8c1b046..4943369 100644
--- a/libcloud/compute/drivers/ec2.py
+++ b/libcloud/compute/drivers/ec2.py
@@ -14,7 +14,7 @@
 # limitations under the License.
 
 """
-Amazon EC2, Eucalyptus and Nimbus drivers.
+Amazon EC2, Eucalyptus, Nimbus and Outscale drivers.
 """
 
 import re
@@ -47,6 +47,8 @@ __all__ = [
     'API_VERSION',
     'NAMESPACE',
     'INSTANCE_TYPES',
+    'OUTSCALE_INSTANCE_TYPES',
+    'OUTSCALE_SAS_REGION_DETAILS',
     'DEFAULT_EUCA_API_VERSION',
     'EUCA_NAMESPACE',
 
@@ -56,6 +58,8 @@ __all__ = [
     'NimbusNodeDriver',
     'EucNodeDriver',
 
+    'OutscaleSASNodeDriver',
+
     'EC2NodeLocation',
     'EC2ReservedNode',
     'EC2Network',
@@ -622,6 +626,340 @@ REGION_DETAILS = {
     }
 }
 
+
+"""
+Sizes must be hardcoded because Outscale doesn't provide an API to fetch them.
+Outscale cloud instances share some names with EC2 but have differents
+specifications so declare them in another constant.
+"""
+OUTSCALE_INSTANCE_TYPES = {
+    't1.micro': {
+        'id': 't1.micro',
+        'name': 'Micro Instance',
+        'ram': 615,
+        'disk': 0,
+        'bandwidth': None
+    },
+    'm1.small': {
+        'id': 'm1.small',
+        'name': 'Standard Small Instance',
+        'ram': 1740,
+        'disk': 150,
+        'bandwidth': None
+    },
+    'm1.medium': {
+        'id': 'm1.medium',
+        'name': 'Standard Medium Instance',
+        'ram': 3840,
+        'disk': 420,
+        'bandwidth': None
+    },
+    'm1.large': {
+        'id': 'm1.large',
+        'name': 'Standard Large Instance',
+        'ram': 7680,
+        'disk': 840,
+        'bandwidth': None
+    },
+    'm1.xlarge': {
+        'id': 'm1.xlarge',
+        'name': 'Standard Extra Large Instance',
+        'ram': 15360,
+        'disk': 1680,
+        'bandwidth': None
+    },
+    'c1.medium': {
+        'id': 'c1.medium',
+        'name': 'Compute Optimized Medium Instance',
+        'ram': 1740,
+        'disk': 340,
+        'bandwidth': None
+    },
+    'c1.xlarge': {
+        'id': 'c1.xlarge',
+        'name': 'Compute Optimized Extra Large Instance',
+        'ram': 7168,
+        'disk': 1680,
+        'bandwidth': None
+    },
+    'c3.large': {
+        'id': 'c3.large',
+        'name': 'Compute Optimized Large Instance',
+        'ram': 3840,
+        'disk': 32,
+        'bandwidth': None
+    },
+    'c3.xlarge': {
+        'id': 'c3.xlarge',
+        'name': 'Compute Optimized Extra Large Instance',
+        'ram': 7168,
+        'disk': 80,
+        'bandwidth': None
+    },
+    'c3.2xlarge': {
+        'id': 'c3.2xlarge',
+        'name': 'Compute Optimized Double Extra Large Instance',
+        'ram': 15359,
+        'disk': 160,
+        'bandwidth': None
+    },
+    'c3.4xlarge': {
+        'id': 'c3.4xlarge',
+        'name': 'Compute Optimized Quadruple Extra Large Instance',
+        'ram': 30720,
+        'disk': 320,
+        'bandwidth': None
+    },
+    'c3.8xlarge': {
+        'id': 'c3.8xlarge',
+        'name': 'Compute Optimized Eight Extra Large Instance',
+        'ram': 61440,
+        'disk': 640,
+        'bandwidth': None
+    },
+    'm2.xlarge': {
+        'id': 'm2.xlarge',
+        'name': 'High Memory Extra Large Instance',
+        'ram': 17510,
+        'disk': 420,
+        'bandwidth': None
+    },
+    'm2.2xlarge': {
+        'id': 'm2.2xlarge',
+        'name': 'High Memory Double Extra Large Instance',
+        'ram': 35020,
+        'disk': 840,
+        'bandwidth': None
+    },
+    'm2.4xlarge': {
+        'id': 'm2.4xlarge',
+        'name': 'High Memory Quadruple Extra Large Instance',
+        'ram': 70042,
+        'disk': 1680,
+        'bandwidth': None
+    },
+    'nv1.small': {
+        'id': 'nv1.small',
+        'name': 'GPU Small Instance',
+        'ram': 1739,
+        'disk': 150,
+        'bandwidth': None
+    },
+    'nv1.medium': {
+        'id': 'nv1.medium',
+        'name': 'GPU Medium Instance',
+        'ram': 3839,
+        'disk': 420,
+        'bandwidth': None
+    },
+    'nv1.large': {
+        'id': 'nv1.large',
+        'name': 'GPU Large Instance',
+        'ram': 7679,
+        'disk': 840,
+        'bandwidth': None
+    },
+    'nv1.xlarge': {
+        'id': 'nv1.xlarge',
+        'name': 'GPU Extra Large Instance',
+        'ram': 15358,
+        'disk': 1680,
+        'bandwidth': None
+    },
+    'g2.2xlarge': {
+        'id': 'g2.2xlarge',
+        'name': 'GPU Double Extra Large Instance',
+        'ram': 15360,
+        'disk': 60,
+        'bandwidth': None
+    },
+    'cc1.4xlarge': {
+        'id': 'cc1.4xlarge',
+        'name': 'Cluster Compute Quadruple Extra Large Instance',
+        'ram': 24576,
+        'disk': 1680,
+        'bandwidth': None
+    },
+    'cc2.8xlarge': {
+        'id': 'cc2.8xlarge',
+        'name': 'Cluster Compute Eight Extra Large Instance',
+        'ram': 65536,
+        'disk': 3360,
+        'bandwidth': None
+    },
+    'hi1.xlarge': {
+        'id': 'hi1.xlarge',
+        'name': 'High Storage Extra Large Instance',
+        'ram': 15361,
+        'disk': 1680,
+        'bandwidth': None
+    },
+    'm3.xlarge': {
+        'id': 'm3.xlarge',
+        'name': 'High Storage Optimized Extra Large Instance',
+        'ram': 15357,
+        'disk': 0,
+        'bandwidth': None
+    },
+    'm3.2xlarge': {
+        'id': 'm3.2xlarge',
+        'name': 'High Storage Optimized Double Extra Large Instance',
+        'ram': 30720,
+        'disk': 0,
+        'bandwidth': None
+    },
+    'm3s.xlarge': {
+        'id': 'm3s.xlarge',
+        'name': 'High Storage Optimized Extra Large Instance',
+        'ram': 15359,
+        'disk': 0,
+        'bandwidth': None
+    },
+    'm3s.2xlarge': {
+        'id': 'm3s.2xlarge',
+        'name': 'High Storage Optimized Double Extra Large Instance',
+        'ram': 30719,
+        'disk': 0,
+        'bandwidth': None
+    },
+    'cr1.8xlarge': {
+        'id': 'cr1.8xlarge',
+        'name': 'Memory Optimized Eight Extra Large Instance',
+        'ram': 249855,
+        'disk': 240,
+        'bandwidth': None
+    },
+    'os1.2xlarge': {
+        'id': 'os1.2xlarge',
+        'name': 'Memory Optimized, High Storage, Passthrough NIC Double Extra '
+                'Large Instance',
+        'ram': 65536,
+        'disk': 60,
+        'bandwidth': None
+    },
+    'os1.4xlarge': {
+        'id': 'os1.4xlarge',
+        'name': 'Memory Optimized, High Storage, Passthrough NIC Quadruple Ext'
+                'ra Large Instance',
+        'ram': 131072,
+        'disk': 120,
+        'bandwidth': None
+    },
+    'os1.8xlarge': {
+        'id': 'os1.8xlarge',
+        'name': 'Memory Optimized, High Storage, Passthrough NIC Eight Extra L'
+                'arge Instance',
+        'ram': 249856,
+        'disk': 500,
+        'bandwidth': None
+    },
+    'oc1.4xlarge': {
+        'id': 'oc1.4xlarge',
+        'name': 'Outscale Quadruple Extra Large Instance',
+        'ram': 24575,
+        'disk': 1680,
+        'bandwidth': None
+    },
+    'oc2.8xlarge': {
+        'id': 'oc2.8xlarge',
+        'name': 'Outscale Eight Extra Large Instance',
+        'ram': 65535,
+        'disk': 3360,
+        'bandwidth': None
+    }
+}
+
+
+"""
+The function manipulating Outscale cloud regions will be overriden because
+Outscale instances types are in a separate dict so also declare Outscale cloud
+regions in another constant.
+"""
+OUTSCALE_SAS_REGION_DETAILS = {
+    'eu-west-3': {
+        'endpoint': 'api-ppd.outscale.com',
+        'api_name': 'osc_sas_eu_west_3',
+        'country': 'FRANCE',
+        'instance_types': [
+            't1.micro',
+            'm1.small',
+            'm1.medium',
+            'm1.large',
+            'm1.xlarge',
+            'c1.medium',
+            'c1.xlarge',
+            'm2.xlarge',
+            'm2.2xlarge',
+            'm2.4xlarge',
+            'nv1.small',
+            'nv1.medium',
+            'nv1.large',
+            'nv1.xlarge',
+            'cc1.4xlarge',
+            'cc2.8xlarge',
+            'm3.xlarge',
+            'm3.2xlarge',
+            'cr1.8xlarge',
+            'os1.8xlarge'
+        ]
+    },
+    'eu-west-1': {
+        'endpoint': 'api.eu-west-1.outscale.com',
+        'api_name': 'osc_sas_eu_west_1',
+        'country': 'FRANCE',
+        'instance_types': [
+            't1.micro',
+            'm1.small',
+            'm1.medium',
+            'm1.large',
+            'm1.xlarge',
+            'c1.medium',
+            'c1.xlarge',
+            'm2.xlarge',
+            'm2.2xlarge',
+            'm2.4xlarge',
+            'nv1.small',
+            'nv1.medium',
+            'nv1.large',
+            'nv1.xlarge',
+            'cc1.4xlarge',
+            'cc2.8xlarge',
+            'm3.xlarge',
+            'm3.2xlarge',
+            'cr1.8xlarge',
+            'os1.8xlarge'
+        ]
+    },
+    'us-east-1': {
+        'endpoint': 'api.us-east-1.outscale.com',
+        'api_name': 'osc_sas_us_east_1',
+        'country': 'USA',
+        'instance_types': [
+            't1.micro',
+            'm1.small',
+            'm1.medium',
+            'm1.large',
+            'm1.xlarge',
+            'c1.medium',
+            'c1.xlarge',
+            'm2.xlarge',
+            'm2.2xlarge',
+            'm2.4xlarge',
+            'nv1.small',
+            'nv1.medium',
+            'nv1.large',
+            'nv1.xlarge',
+            'cc1.4xlarge',
+            'cc2.8xlarge',
+            'm3.xlarge',
+            'm3.2xlarge',
+            'cr1.8xlarge',
+            'os1.8xlarge'
+        ]
+    }
+}
+
+
 """
 Define the extra dictionary for specific resources
 """
@@ -4261,3 +4599,259 @@ class NimbusNodeDriver(BaseEC2NodeDriver):
         @inherits: :class:`EC2NodeDriver.ex_create_tags`
         """
         pass
+
+
+class OutscaleConnection(EC2Connection):
+    """
+    Connection class for Outscale
+    """
+
+    host = None
+
+
+class OutscaleNodeDriver(BaseEC2NodeDriver):
+    """
+    Base Outscale FCU node driver.
+
+    Outscale per provider driver classes inherit from it.
+    """
+
+    connectionCls = OutscaleConnection
+    name = 'Outscale'
+    website = 'http://www.outscale.com'
+    path = '/'
+
+    NODE_STATE_MAP = {
+        'pending': NodeState.PENDING,
+        'running': NodeState.RUNNING,
+        'shutting-down': NodeState.UNKNOWN,
+        'terminated': NodeState.TERMINATED,
+        'stopped': NodeState.STOPPED
+    }
+
+    def create_node(self, **kwargs):
+        """
+        Create a new Outscale node. The ex_iamprofile keyword is not supported.
+
+        @inherits: :class:`BaseEC2NodeDriver.create_node`
+
+        :keyword    ex_keyname: The name of the key pair
+        :type       ex_keyname: ``str``
+
+        :keyword    ex_userdata: User data
+        :type       ex_userdata: ``str``
+
+        :keyword    ex_security_groups: A list of names of security groups to
+                                        assign to the node.
+        :type       ex_security_groups:   ``list``
+
+        :keyword    ex_metadata: Key/Value metadata to associate with a node
+        :type       ex_metadata: ``dict``
+
+        :keyword    ex_mincount: Minimum number of instances to launch
+        :type       ex_mincount: ``int``
+
+        :keyword    ex_maxcount: Maximum number of instances to launch
+        :type       ex_maxcount: ``int``
+
+        :keyword    ex_clienttoken: Unique identifier to ensure idempotency
+        :type       ex_clienttoken: ``str``
+
+        :keyword    ex_blockdevicemappings: ``list`` of ``dict`` block device
+                    mappings.
+        :type       ex_blockdevicemappings: ``list`` of ``dict``
+
+        :keyword    ex_ebs_optimized: EBS-Optimized if True
+        :type       ex_ebs_optimized: ``bool``
+        """
+        if 'ex_iamprofile' in kwargs:
+            raise NotImplementedError("ex_iamprofile not implemented")
+        return super(OutscaleNodeDriver, self).create_node(**kwargs)
+
+    def ex_create_network(self, cidr_block, name=None):
+        """
+        Create a network/VPC. Outscale does not support instance_tenancy.
+
+        :param      cidr_block: The CIDR block assigned to the network
+        :type       cidr_block: ``str``
+
+        :param      name: An optional name for the network
+        :type       name: ``str``
+
+        :return:    Dictionary of network properties
+        :rtype:     ``dict``
+        """
+        return super(OutscaleNodeDriver, self).ex_create_network(cidr_block,
+                                                                 name=name)
+
+    def ex_modify_instance_attribute(self, node, disable_api_termination=None,
+                                     ebs_optimized=None, group_id=None,
+                                     source_dest_check=None, user_data=None,
+                                     instance_type=None):
+        """
+        Modify node attributes.
+        Ouscale support the following attributes:
+        'DisableApiTermination.Value', 'EbsOptimized', 'GroupId.n',
+        'SourceDestCheck.Value', 'UserData.Value',
+        'InstanceType.Value'
+
+        :param      node: Node instance
+        :type       node: :class:`Node`
+
+        :param      attributes: Dictionary with node attributes
+        :type       attributes: ``dict``
+
+        :return: True on success, False otherwise.
+        :rtype: ``bool``
+        """
+        attributes = {}
+
+        if disable_api_termination is not None:
+            attributes['DisableApiTermination.Value'] = disable_api_termination
+        if ebs_optimized is not None:
+            attributes['EbsOptimized'] = ebs_optimized
+        if group_id is not None:
+            attributes['GroupId.n'] = group_id
+        if source_dest_check is not None:
+            attributes['SourceDestCheck.Value'] = source_dest_check
+        if user_data is not None:
+            attributes['UserData.Value'] = user_data
+        if instance_type is not None:
+            attributes['InstanceType.Value'] = instance_type
+
+        return super(OutscaleNodeDriver, self).ex_modify_instance_attribute(
+            node, attributes)
+
+    def ex_register_image(self, name, description=None, architecture=None,
+                          root_device_name=None, block_device_mapping=None):
+        """
+        Registers a Machine Image based off of an EBS-backed instance.
+        Can also be used to create images from snapshots.
+
+        Outscale does not support image_location, kernel_id and ramdisk_id.
+
+        :param      name:  The name for the AMI being registered
+        :type       name: ``str``
+
+        :param      description: The description of the AMI (optional)
+        :type       description: ``str``
+
+        :param      architecture: The architecture of the AMI (i386/x86_64)
+                                  (optional)
+        :type       architecture: ``str``
+
+        :param      root_device_name: The device name for the root device
+                                      Required if registering a EBS-backed AMI
+        :type       root_device_name: ``str``
+
+        :param      block_device_mapping: A dictionary of the disk layout
+                                          (optional)
+        :type       block_device_mapping: ``dict``
+
+        :rtype:     :class:`NodeImage`
+        """
+        return super(OutscaleNodeDriver, self).ex_register_image(
+            name, description=description, architecture=architecture,
+            root_device_name=root_device_name,
+            block_device_mapping=block_device_mapping)
+
+    def ex_copy_image(self, source_region, image, name=None, description=None):
+        """
+        Outscale does not support copying images.
+
+        @inherits: :class:`EC2NodeDriver.ex_copy_image`
+        """
+        raise NotImplementedError(self._not_implemented_msg)
+
+    def ex_get_limits(self):
+        """
+        Outscale does not support getting limits.
+
+        @inherits: :class:`EC2NodeDriver.ex_get_limits`
+        """
+        raise NotImplementedError(self._not_implemented_msg)
+
+    def ex_create_network_interface(self, subnet, name=None,
+                                    description=None,
+                                    private_ip_address=None):
+        """
+        Outscale does not support creating a network interface within a VPC.
+
+        @inherits: :class:`EC2NodeDriver.ex_create_network_interface`
+        """
+        raise NotImplementedError(self._not_implemented_msg)
+
+    def ex_delete_network_interface(self, network_interface):
+        """
+        Outscale does not support deleting a network interface within a VPC.
+
+        @inherits: :class:`EC2NodeDriver.ex_delete_network_interface`
+        """
+        raise NotImplementedError(self._not_implemented_msg)
+
+    def ex_attach_network_interface_to_node(self, network_interface,
+                                            node, device_index):
+        """
+        Outscale does not support attaching a network interface.
+
+        @inherits: :class:`EC2NodeDriver.ex_attach_network_interface_to_node`
+        """
+        raise NotImplementedError(self._not_implemented_msg)
+
+    def ex_detach_network_interface(self, attachment_id, force=False):
+        """
+        Outscale does not support detaching a network interface
+
+        @inherits: :class:`EC2NodeDriver.ex_detach_network_interface`
+        """
+        raise NotImplementedError(self._not_implemented_msg)
+
+
+class OutscaleSASNodeDriver(OutscaleNodeDriver):
+    """
+    Outscale SAS node driver
+    """
+    name = 'Outscale SAS'
+    type = Provider.OUTSCALE_SAS
+
+    def __init__(self, key, secret=None, secure=True, host=None, port=None,
+                 region='us-east-1', **kwargs):
+        if hasattr(self, '_region'):
+            region = self._region
+
+        if region not in OUTSCALE_SAS_REGION_DETAILS.keys():
+            raise ValueError('Invalid region: %s' % (region))
+
+        details = OUTSCALE_SAS_REGION_DETAILS[region]
+        self.region_name = region
+        self.api_name = details['api_name']
+        self.country = details['country']
+
+        self.connectionCls.host = details['endpoint']
+
+        self._not_implemented_msg =\
+            'This method is not supported in the Outscale driver'
+
+        super(OutscaleNodeDriver, self).__init__(key=key, secret=secret,
+                                                 secure=secure, host=host,
+                                                 port=port, **kwargs)
+
+    def list_sizes(self, location=None):
+        """
+        List available instance flavors/sizes
+
+        This override the EC2 default method in order to use Outscale infos.
+
+        :rtype: ``list`` of :class:`NodeSize`
+        """
+        available_types =\
+            OUTSCALE_SAS_REGION_DETAILS[self.region_name]['instance_types']
+        sizes = []
+
+        for instance_type in available_types:
+            attributes = OUTSCALE_INSTANCE_TYPES[instance_type]
+            attributes = copy.deepcopy(attributes)
+            price = self._get_size_price(size_id=instance_type)
+            attributes.update({'price': price})
+            sizes.append(NodeSize(driver=self, **attributes))
+        return sizes

http://git-wip-us.apache.org/repos/asf/libcloud/blob/0a049c43/libcloud/compute/providers.py
----------------------------------------------------------------------
diff --git a/libcloud/compute/providers.py b/libcloud/compute/providers.py
index 8cc5a3c..87a46b7 100644
--- a/libcloud/compute/providers.py
+++ b/libcloud/compute/providers.py
@@ -139,6 +139,8 @@ DRIVERS = {
     ('libcloud.compute.drivers.exoscale', 'ExoscaleNodeDriver'),
     Provider.IKOULA:
     ('libcloud.compute.drivers.ikoula', 'IkoulaNodeDriver'),
+    Provider.OUTSCALE_SAS:
+    ('libcloud.compute.drivers.ec2', 'OutscaleSASNodeDriver'),
 
     # Deprecated
     Provider.CLOUDSIGMA_US:

http://git-wip-us.apache.org/repos/asf/libcloud/blob/0a049c43/libcloud/compute/types.py
----------------------------------------------------------------------
diff --git a/libcloud/compute/types.py b/libcloud/compute/types.py
index b736b2f..561474e 100644
--- a/libcloud/compute/types.py
+++ b/libcloud/compute/types.py
@@ -74,6 +74,7 @@ class Provider(object):
     :cvar NEPHOSCALE: NephoScale driver
     :cvar EXOSCALE: Exoscale driver.
     :cvar IKOULA: Ikoula driver.
+    :cvar OUTSCALE_SAS: Outscale SAS driver.
     """
     DUMMY = 'dummy'
     EC2 = 'ec2_us_east'
@@ -117,6 +118,7 @@ class Provider(object):
     CLOUDFRAMES = 'cloudframes'
     EXOSCALE = 'exoscale'
     IKOULA = 'ikoula'
+    OUTSCALE_SAS = 'outscale_sas'
 
     # Deprecated constants which are still supported
     EC2_US_EAST = 'ec2_us_east'

http://git-wip-us.apache.org/repos/asf/libcloud/blob/0a049c43/libcloud/data/pricing.json
----------------------------------------------------------------------
diff --git a/libcloud/data/pricing.json b/libcloud/data/pricing.json
index 9e08d30..6034ec4 100644
--- a/libcloud/data/pricing.json
+++ b/libcloud/data/pricing.json
@@ -421,6 +421,75 @@
             "minimum": 15,
             "maximum": 200,
             "low": 50
+        },
+        "osc_sas_eu_west_3": {
+            "t1.micro": "0.040",
+            "m1.small": "0.090",
+            "m1.medium": "0.130",
+            "m1.large": "0.360",
+            "m1.xlarge": "0.730",
+            "c1.medium": "0.230",
+            "c1.xlarge": "0.900",
+            "m2.xlarge": "0.460",
+            "m2.2xlarge": "0.920",
+            "m2.4xlarge": "1.840",
+            "nv1.small": "5.220",
+            "nv1.medium": "5.310",
+            "nv1.large": "5.490",
+            "nv1.xlarge": "5.860",
+            "cc1.4xlarge": "1.460",
+            "cc2.8xlarge": "2.700",
+            "m3.xlarge": "0.780",
+            "m3.2xlarge": "1.560",
+            "cr1.8xlarge": "3.750",
+            "os1.8xlarge": "6.400",
+            "os1.8xlarge": "6.400"
+        },
+        "osc_sas_eu_west_1": {
+            "t1.micro": "0.040",
+            "m1.small": "0.090",
+            "m1.medium": "0.130",
+            "m1.large": "0.360",
+            "m1.xlarge": "0.730",
+            "c1.medium": "0.230",
+            "c1.xlarge": "0.900",
+            "m2.xlarge": "0.460",
+            "m2.2xlarge": "0.920",
+            "m2.4xlarge": "1.840",
+            "nv1.small": "5.220",
+            "nv1.medium": "5.310",
+            "nv1.large": "5.490",
+            "nv1.xlarge": "5.860",
+            "cc1.4xlarge": "1.460",
+            "cc2.8xlarge": "2.700",
+            "m3.xlarge": "0.780",
+            "m3.2xlarge": "1.560",
+            "cr1.8xlarge": "3.750",
+            "os1.8xlarge": "6.400",
+            "os1.8xlarge": "6.400"
+        },
+        "osc_sas_us_east_1": {
+            "t1.micro": "0.020",
+            "m1.small": "0.070",
+            "m1.medium": "0.180",
+            "m1.large": "0.260",
+            "m1.xlarge": "0.730",
+            "c1.medium": "0.170",
+            "c1.xlarge": "0.660",
+            "m2.xlarge": "0.460",
+            "m2.2xlarge": "1.020",
+            "m2.4xlarge": "2.040",
+            "nv1.small": "5.220",
+            "nv1.medium": "5.310",
+            "nv1.large": "5.490",
+            "nv1.xlarge": "5.860",
+            "cc1.4xlarge": "1.610",
+            "cc2.8xlarge": "2.700",
+            "m3.xlarge": "0.550",
+            "m3.2xlarge": "1.560",
+            "cr1.8xlarge": "3.750",
+            "os1.8xlarge": "6.400",
+            "os1.8xlarge": "6.400"
         }
     },
     "storage": {},

http://git-wip-us.apache.org/repos/asf/libcloud/blob/0a049c43/libcloud/test/compute/test_ec2.py
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/test_ec2.py b/libcloud/test/compute/test_ec2.py
index 64010f4..0a2cf1e 100644
--- a/libcloud/test/compute/test_ec2.py
+++ b/libcloud/test/compute/test_ec2.py
@@ -30,6 +30,7 @@ from libcloud.compute.drivers.ec2 import EC2APNENodeDriver
 from libcloud.compute.drivers.ec2 import EC2APSESydneyNodeDriver
 from libcloud.compute.drivers.ec2 import EC2SAEastNodeDriver
 from libcloud.compute.drivers.ec2 import NimbusNodeDriver, EucNodeDriver
+from libcloud.compute.drivers.ec2 import OutscaleSASNodeDriver
 from libcloud.compute.drivers.ec2 import IdempotentParamError
 from libcloud.compute.drivers.ec2 import REGION_DETAILS
 from libcloud.compute.drivers.ec2 import ExEC2AvailabilityZone
@@ -1537,5 +1538,97 @@ class EucTests(LibcloudTestCase, TestCaseMixin):
         self.assertTrue('m3.xlarge' in ids)
 
 
+class OutscaleTests(EC2Tests):
+
+    def setUp(self):
+        OutscaleSASNodeDriver.connectionCls.conn_classes = (None, EC2MockHttp)
+        EC2MockHttp.use_param = 'Action'
+        EC2MockHttp.type = None
+        self.driver = OutscaleSASNodeDriver(key=EC2_PARAMS[0],
+                                            secret=EC2_PARAMS[1],
+                                            host='some.outscalecloud.com')
+
+    def test_ex_create_network(self):
+        # overridden from EC2Tests -- Outscale don't support instance_tenancy
+        vpc = self.driver.ex_create_network('192.168.55.0/24',
+                                            name='Test VPC')
+
+        self.assertEqual('vpc-ad3527cf', vpc.id)
+        self.assertEqual('192.168.55.0/24', vpc.cidr_block)
+        self.assertEqual('pending', vpc.extra['state'])
+
+    def test_ex_copy_image(self):
+        # overridden from EC2Tests -- Outscale does not support copying images
+        image = self.driver.list_images()[0]
+        try:
+            self.driver.ex_copy_image('us-east-1', image,
+                                      name='Faux Image',
+                                      description='Test Image Copy')
+        except NotImplementedError:
+            pass
+        else:
+            self.fail('Exception was not thrown')
+
+    def test_ex_get_limits(self):
+        # overridden from EC2Tests -- Outscale does not support getting limits
+        try:
+            self.driver.ex_get_limits()
+        except NotImplementedError:
+            pass
+        else:
+            self.fail('Exception was not thrown')
+
+    def test_ex_create_network_interface(self):
+        # overridden from EC2Tests -- Outscale don't allow creating interfaces
+        subnet = self.driver.ex_list_subnets()[0]
+        try:
+            self.driver.ex_create_network_interface(
+                subnet,
+                name='Test Interface',
+                description='My Test')
+        except NotImplementedError:
+            pass
+        else:
+            self.fail('Exception was not thrown')
+
+    def test_ex_delete_network_interface(self):
+        # overridden from EC2Tests -- Outscale don't allow deleting interfaces
+        interface = self.driver.ex_list_network_interfaces()[0]
+        try:
+            self.driver.ex_delete_network_interface(interface)
+        except NotImplementedError:
+            pass
+        else:
+            self.fail('Exception was not thrown')
+
+    def test_ex_attach_network_interface_to_node(self):
+        # overridden from EC2Tests -- Outscale don't allow attaching interfaces
+        node = self.driver.list_nodes()[0]
+        interface = self.driver.ex_list_network_interfaces()[0]
+        try:
+            self.driver.ex_attach_network_interface_to_node(interface, node, 1)
+        except NotImplementedError:
+            pass
+        else:
+            self.fail('Exception was not thrown')
+
+    def test_ex_detach_network_interface(self):
+        # overridden from EC2Tests -- Outscale don't allow detaching interfaces
+        try:
+            self.driver.ex_detach_network_interface('eni-attach-2b588b47')
+        except NotImplementedError:
+            pass
+        else:
+            self.fail('Exception was not thrown')
+
+    def test_list_sizes(self):
+        sizes = self.driver.list_sizes()
+
+        ids = [s.id for s in sizes]
+        self.assertTrue('m1.small' in ids)
+        self.assertTrue('m1.large' in ids)
+        self.assertTrue('m1.xlarge' in ids)
+
+
 if __name__ == '__main__':
     sys.exit(unittest.main())


Mime
View raw message