You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@libcloud.apache.org by to...@apache.org on 2013/11/16 18:30:55 UTC

[1/2] git commit: Remove Slicehost driver.

Updated Branches:
  refs/heads/trunk 5ef0707b2 -> a8aff7e19


Remove Slicehost driver.

Slicehost API has been shut down in 2012 so it makes no sense to keep
this driver.


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

Branch: refs/heads/trunk
Commit: 6ebe04b9bda6587bf2d0cf4f4474cfb8f66974d8
Parents: 5ef0707
Author: Tomaz Muraus <to...@apache.org>
Authored: Sat Nov 16 17:49:15 2013 +0100
Committer: Tomaz Muraus <to...@apache.org>
Committed: Sat Nov 16 17:55:09 2013 +0100

----------------------------------------------------------------------
 CHANGES                                         |  10 +
 .../_supported_methods_block_storage.rst        |   2 -
 docs/compute/_supported_methods_main.rst        |   2 -
 docs/compute/_supported_providers.rst           |   2 -
 libcloud/compute/drivers/__init__.py            |   1 -
 libcloud/compute/drivers/slicehost.py           | 235 -------------------
 libcloud/compute/providers.py                   |   2 -
 libcloud/compute/types.py                       |   5 +-
 .../test/compute/fixtures/slicehost/flavors.xml |  45 ----
 .../test/compute/fixtures/slicehost/images.xml  |  47 ----
 .../fixtures/slicehost/slices_1_reboot.xml      |  15 --
 .../slicehost/slices_1_reboot_forbidden.xml     |   3 -
 .../fixtures/slicehost/slices_errors.xml        |   4 -
 .../compute/fixtures/slicehost/slices_get.xml   |  17 --
 .../compute/fixtures/slicehost/slices_post.xml  |  16 --
 libcloud/test/compute/test_slicehost.py         | 163 -------------
 16 files changed, 13 insertions(+), 556 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/libcloud/blob/6ebe04b9/CHANGES
----------------------------------------------------------------------
diff --git a/CHANGES b/CHANGES
index 1a8d9e2..d18f50f 100644
--- a/CHANGES
+++ b/CHANGES
@@ -1,5 +1,15 @@
                                    -*- coding: utf-8 -*-
 
+Changes with Apache Libcloud in development
+
+  *) Compute
+
+    - Remove Slicehost driver.
+
+      SliceHost API has been shut down in 2012 so it makes no sense to keep
+      this driver.
+      [Tomaz Muraus]
+
 Changes with Apache Libcloud 0.14.0-beta3
 
   *) General

http://git-wip-us.apache.org/repos/asf/libcloud/blob/6ebe04b9/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 edca534..ab1c8b1 100644
--- a/docs/compute/_supported_methods_block_storage.rst
+++ b/docs/compute/_supported_methods_block_storage.rst
@@ -51,7 +51,6 @@ Provider                              list volumes create volume destroy volume
 `RimuHosting`_                        no           no            no             no            no            no             no             
 `ServerLove`_                         no           no            no             no            no            no             no             
 `skalicloud`_                         no           no            no             no            no            no             no             
-`Slicehost`_                          no           no            no             no            no            no             no             
 `SoftLayer`_                          no           no            no             no            no            no             no             
 `vCloud`_                             no           no            no             no            no            no             no             
 `VCL`_                                no           no            no             no            no            no             no             
@@ -111,7 +110,6 @@ Provider                              list volumes create volume destroy volume
 .. _`RimuHosting`: http://rimuhosting.com/
 .. _`ServerLove`: http://www.serverlove.com/
 .. _`skalicloud`: http://www.skalicloud.com/
-.. _`Slicehost`: http://slicehost.com/
 .. _`SoftLayer`: http://www.softlayer.com/
 .. _`vCloud`: http://www.vmware.com/products/vcloud/
 .. _`VCL`: http://incubator.apache.org/vcl/

http://git-wip-us.apache.org/repos/asf/libcloud/blob/6ebe04b9/docs/compute/_supported_methods_main.rst
----------------------------------------------------------------------
diff --git a/docs/compute/_supported_methods_main.rst b/docs/compute/_supported_methods_main.rst
index 0654f40..8d7a2e9 100644
--- a/docs/compute/_supported_methods_main.rst
+++ b/docs/compute/_supported_methods_main.rst
@@ -51,7 +51,6 @@ Provider                              list nodes create node reboot node destroy
 `RimuHosting`_                        yes        yes         yes         yes          yes         yes        yes        
 `ServerLove`_                         yes        yes         yes         yes          yes         yes        yes        
 `skalicloud`_                         yes        yes         yes         yes          yes         yes        yes        
-`Slicehost`_                          yes        yes         yes         yes          yes         yes        yes        
 `SoftLayer`_                          yes        yes         yes         yes          yes         yes        yes        
 `vCloud`_                             yes        yes         yes         yes          yes         yes        yes        
 `VCL`_                                yes        yes         yes         yes          yes         no         no         
@@ -111,7 +110,6 @@ Provider                              list nodes create node reboot node destroy
 .. _`RimuHosting`: http://rimuhosting.com/
 .. _`ServerLove`: http://www.serverlove.com/
 .. _`skalicloud`: http://www.skalicloud.com/
-.. _`Slicehost`: http://slicehost.com/
 .. _`SoftLayer`: http://www.softlayer.com/
 .. _`vCloud`: http://www.vmware.com/products/vcloud/
 .. _`VCL`: http://incubator.apache.org/vcl/

http://git-wip-us.apache.org/repos/asf/libcloud/blob/6ebe04b9/docs/compute/_supported_providers.rst
----------------------------------------------------------------------
diff --git a/docs/compute/_supported_providers.rst b/docs/compute/_supported_providers.rst
index f738973..c190c4b 100644
--- a/docs/compute/_supported_providers.rst
+++ b/docs/compute/_supported_providers.rst
@@ -51,7 +51,6 @@ Provider                              Documentation
 `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`              
@@ -111,7 +110,6 @@ Provider                              Documentation
 .. _`RimuHosting`: http://rimuhosting.com/
 .. _`ServerLove`: http://www.serverlove.com/
 .. _`skalicloud`: http://www.skalicloud.com/
-.. _`Slicehost`: http://slicehost.com/
 .. _`SoftLayer`: http://www.softlayer.com/
 .. _`vCloud`: http://www.vmware.com/products/vcloud/
 .. _`VCL`: http://incubator.apache.org/vcl/

http://git-wip-us.apache.org/repos/asf/libcloud/blob/6ebe04b9/libcloud/compute/drivers/__init__.py
----------------------------------------------------------------------
diff --git a/libcloud/compute/drivers/__init__.py b/libcloud/compute/drivers/__init__.py
index 9c6c078..ab02a6b 100644
--- a/libcloud/compute/drivers/__init__.py
+++ b/libcloud/compute/drivers/__init__.py
@@ -35,7 +35,6 @@ __all__ = [
     'opennebula',
     'rackspace',
     'rimuhosting',
-    'slicehost',
     'softlayer',
     'vcloud',
     'voxel',

http://git-wip-us.apache.org/repos/asf/libcloud/blob/6ebe04b9/libcloud/compute/drivers/slicehost.py
----------------------------------------------------------------------
diff --git a/libcloud/compute/drivers/slicehost.py b/libcloud/compute/drivers/slicehost.py
deleted file mode 100644
index c8e717c..0000000
--- a/libcloud/compute/drivers/slicehost.py
+++ /dev/null
@@ -1,235 +0,0 @@
-# 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.
-"""
-Slicehost Driver
-"""
-import base64
-import socket
-
-from xml.etree import ElementTree as ET
-from xml.parsers.expat import ExpatError
-
-from libcloud.utils.py3 import b
-
-from libcloud.common.base import ConnectionKey, XmlResponse
-from libcloud.compute.types import NodeState, Provider, InvalidCredsError
-from libcloud.compute.base import NodeSize, NodeDriver, NodeImage, NodeLocation
-from libcloud.compute.base import Node, is_private_subnet
-
-
-class SlicehostResponse(XmlResponse):
-    def parse_error(self):
-        if self.status == 401:
-            raise InvalidCredsError(self.body)
-
-        body = super(SlicehostResponse, self).parse_body()
-        try:
-            return "; ".join([err.text
-                              for err in
-                              body.findall('error')])
-        except ExpatError:
-            return self.body
-
-
-class SlicehostConnection(ConnectionKey):
-    """
-    Connection class for the Slicehost driver
-    """
-
-    host = 'api.slicehost.com'
-    responseCls = SlicehostResponse
-
-    def add_default_headers(self, headers):
-        headers['Authorization'] = ('Basic %s' % (base64.b64encode(
-            b('%s:' % self.key))).decode('utf-8'))
-        return headers
-
-
-class SlicehostNodeDriver(NodeDriver):
-    """
-    Slicehost node driver
-    """
-
-    connectionCls = SlicehostConnection
-
-    type = Provider.SLICEHOST
-    name = 'Slicehost'
-    website = 'http://slicehost.com/'
-
-    features = {"create_node": ["generates_password"]}
-
-    NODE_STATE_MAP = {'active': NodeState.RUNNING,
-                      'build': NodeState.PENDING,
-                      'reboot': NodeState.REBOOTING,
-                      'hard_reboot': NodeState.REBOOTING,
-                      'terminated': NodeState.TERMINATED}
-
-    def list_nodes(self):
-        return self._to_nodes(self.connection.request('/slices.xml').object)
-
-    def list_sizes(self, location=None):
-        return self._to_sizes(self.connection.request('/flavors.xml').object)
-
-    def list_images(self, location=None):
-        return self._to_images(self.connection.request('/images.xml').object)
-
-    def list_locations(self):
-        return [
-            NodeLocation(0, 'Slicehost St. Louis (STL-A)', 'US', self),
-            NodeLocation(0, 'Slicehost St. Louis (STL-B)', 'US', self),
-            NodeLocation(0, 'Slicehost Dallas-Fort Worth (DFW-1)', 'US', self)
-        ]
-
-    def create_node(self, **kwargs):
-        name = kwargs['name']
-        image = kwargs['image']
-        size = kwargs['size']
-        uri = '/slices.xml'
-
-        # create a slice obj
-        root = ET.Element('slice')
-        el_name = ET.SubElement(root, 'name')
-        el_name.text = name
-        flavor_id = ET.SubElement(root, 'flavor-id')
-        flavor_id.text = str(size.id)
-        image_id = ET.SubElement(root, 'image-id')
-        image_id.text = str(image.id)
-        xml = ET.tostring(root)
-
-        node = self._to_nodes(
-            self.connection.request(
-                uri,
-                method='POST',
-                data=xml,
-                headers={'Content-Type': 'application/xml'}
-            ).object
-        )[0]
-        return node
-
-    def reboot_node(self, node):
-        # 'hard' could bubble up as kwarg depending on how reboot_node
-        # turns out. Defaulting to soft reboot.
-        #hard = False
-        #reboot = self.api.hard_reboot if hard else self.api.reboot
-        #expected_status = 'hard_reboot' if hard else 'reboot'
-
-        uri = '/slices/%s/reboot.xml' % (node.id)
-        node = self._to_nodes(
-            self.connection.request(uri, method='PUT').object
-        )[0]
-        return node.state == NodeState.REBOOTING
-
-    def destroy_node(self, node):
-        """Destroys the node
-
-        Requires 'Allow Slices to be deleted or rebuilt from the API' to be
-        ticked at https://manage.slicehost.com/api, otherwise returns::
-            <errors>
-              <error>You must enable slice deletes in the SliceManager</error>
-              <error>Permission denied</error>
-            </errors>
-
-        @inherits: :class:`NodeDriver.destroy_node`
-        """
-        uri = '/slices/%s/destroy.xml' % (node.id)
-        self.connection.request(uri, method='PUT')
-        return True
-
-    def _to_nodes(self, object):
-        if object.tag == 'slice':
-            return [self._to_node(object)]
-        node_elements = object.findall('slice')
-        return [self._to_node(el) for el in node_elements]
-
-    def _to_node(self, element):
-        attrs = ['name', 'image-id', 'progress', 'id', 'bw-out', 'bw-in',
-                 'flavor-id', 'status', 'ip-address', 'root-password']
-
-        node_attrs = {}
-        for attr in attrs:
-            node_attrs[attr] = element.findtext(attr)
-
-        # slicehost does not determine between public and private, so we
-        # have to figure it out
-        public_ip = []
-        private_ip = []
-
-        ip_address = element.findtext('ip-address')
-        if is_private_subnet(ip_address):
-            private_ip.append(ip_address)
-        else:
-            public_ip.append(ip_address)
-
-        for addr in element.findall('addresses/address'):
-            ip = addr.text
-            try:
-                socket.inet_aton(ip)
-            except socket.error:
-                # not a valid ip
-                continue
-            if is_private_subnet(ip):
-                private_ip.append(ip)
-            else:
-                public_ip.append(ip)
-
-        public_ip = list(set(public_ip))
-
-        try:
-            state = self.NODE_STATE_MAP[element.findtext('status')]
-        except:
-            state = NodeState.UNKNOWN
-
-        # for consistency with other drivers, we put this in two places.
-        node_attrs['password'] = node_attrs['root-password']
-        extra = {}
-        for k in list(node_attrs.keys()):
-            ek = k.replace("-", "_")
-            extra[ek] = node_attrs[k]
-        n = Node(id=element.findtext('id'),
-                 name=element.findtext('name'),
-                 state=state,
-                 public_ips=public_ip,
-                 private_ips=private_ip,
-                 driver=self.connection.driver,
-                 extra=extra)
-        return n
-
-    def _to_sizes(self, object):
-        if object.tag == 'flavor':
-            return [self._to_size(object)]
-        elements = object.findall('flavor')
-        return [self._to_size(el) for el in elements]
-
-    def _to_size(self, element):
-        s = NodeSize(id=int(element.findtext('id')),
-                     name=str(element.findtext('name')),
-                     ram=int(element.findtext('ram')),
-                     disk=None,  # XXX: needs hardcode
-                     bandwidth=None,  # XXX: needs hardcode
-                     price=float(element.findtext('price')) / (100 * 24 * 30),
-                     driver=self.connection.driver)
-        return s
-
-    def _to_images(self, object):
-        if object.tag == 'image':
-            return [self._to_image(object)]
-        elements = object.findall('image')
-        return [self._to_image(el) for el in elements]
-
-    def _to_image(self, element):
-        i = NodeImage(id=int(element.findtext('id')),
-                      name=str(element.findtext('name')),
-                      driver=self.connection.driver)
-        return i

http://git-wip-us.apache.org/repos/asf/libcloud/blob/6ebe04b9/libcloud/compute/providers.py
----------------------------------------------------------------------
diff --git a/libcloud/compute/providers.py b/libcloud/compute/providers.py
index b9c6808..e78fe18 100644
--- a/libcloud/compute/providers.py
+++ b/libcloud/compute/providers.py
@@ -81,8 +81,6 @@ DRIVERS = {
     ('libcloud.compute.drivers.rackspace', 'RackspaceNodeDriver'),
     Provider.RACKSPACE_FIRST_GEN:
     ('libcloud.compute.drivers.rackspace', 'RackspaceFirstGenNodeDriver'),
-    Provider.SLICEHOST:
-    ('libcloud.compute.drivers.slicehost', 'SlicehostNodeDriver'),
     Provider.VPSNET:
     ('libcloud.compute.drivers.vpsnet', 'VPSNetNodeDriver'),
     Provider.LINODE:

http://git-wip-us.apache.org/repos/asf/libcloud/blob/6ebe04b9/libcloud/compute/types.py
----------------------------------------------------------------------
diff --git a/libcloud/compute/types.py b/libcloud/compute/types.py
index c75da81..7dd7b74 100644
--- a/libcloud/compute/types.py
+++ b/libcloud/compute/types.py
@@ -45,7 +45,6 @@ class Provider(object):
     :cvar EC2_EU_WEST: Amazon AWS EU Ireland
     :cvar RACKSPACE: Rackspace next-gen OpenStack based Cloud Servers
     :cvar RACKSPACE_FIRST_GEN: Rackspace First Gen Cloud Servers
-    :cvar SLICEHOST: Slicehost.com
     :cvar GCE: Google Compute Engine
     :cvar GOGRID: GoGrid
     :cvar VPSNET: VPS.net
@@ -77,7 +76,6 @@ class Provider(object):
     DUMMY = 'dummy'
     EC2 = 'ec2_us_east'
     RACKSPACE = 'rackspace'
-    SLICEHOST = 'slicehost'
     GCE = 'gce'
     GOGRID = 'gogrid'
     VPSNET = 'vpsnet'
@@ -144,6 +142,9 @@ class Provider(object):
     RACKSPACE_NOVA_LON = 'rackspace_nova_lon'
     RACKSPACE_NOVA_ORD = 'rackspace_nova_ord'
 
+    # Removed
+    # SLICEHOST = 'slicehost'
+
 
 DEPRECATED_RACKSPACE_PROVIDERS = [Provider.RACKSPACE_UK,
                                   Provider.RACKSPACE_NOVA_BETA,

http://git-wip-us.apache.org/repos/asf/libcloud/blob/6ebe04b9/libcloud/test/compute/fixtures/slicehost/flavors.xml
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/slicehost/flavors.xml b/libcloud/test/compute/fixtures/slicehost/flavors.xml
deleted file mode 100644
index 552e524..0000000
--- a/libcloud/test/compute/fixtures/slicehost/flavors.xml
+++ /dev/null
@@ -1,45 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<flavors type="array">
-  <flavor>
-    <id type="integer">1</id>
-    <name>256 slice</name>
-    <price type="integer">2000</price>
-    <ram type="integer">256</ram>
-  </flavor>
-  <flavor>
-    <id type="integer">2</id>
-    <name>512 slice</name>
-    <price type="integer">3800</price>
-    <ram type="integer">512</ram>
-  </flavor>
-  <flavor>
-    <id type="integer">3</id>
-    <name>1GB slice</name>
-    <price type="integer">7000</price>
-    <ram type="integer">1024</ram>
-  </flavor>
-  <flavor>
-    <id type="integer">4</id>
-    <name>2GB slice</name>
-    <price type="integer">13000</price>
-    <ram type="integer">2048</ram>
-  </flavor>
-  <flavor>
-    <id type="integer">5</id>
-    <name>4GB slice</name>
-    <price type="integer">25000</price>
-    <ram type="integer">4096</ram>
-  </flavor>
-  <flavor>
-    <id type="integer">6</id>
-    <name>8GB slice</name>
-    <price type="integer">45000</price>
-    <ram type="integer">8192</ram>
-  </flavor>
-  <flavor>
-    <id type="integer">7</id>
-    <name>15.5GB slice</name>
-    <price type="integer">80000</price>
-    <ram type="integer">15872</ram>
-  </flavor>
-</flavors>

http://git-wip-us.apache.org/repos/asf/libcloud/blob/6ebe04b9/libcloud/test/compute/fixtures/slicehost/images.xml
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/slicehost/images.xml b/libcloud/test/compute/fixtures/slicehost/images.xml
deleted file mode 100644
index f87b4e7..0000000
--- a/libcloud/test/compute/fixtures/slicehost/images.xml
+++ /dev/null
@@ -1,47 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<images type="array">
-  <image>
-    <name>CentOS 5.2</name>
-    <id type="integer">2</id>
-  </image>
-  <image>
-    <name>Gentoo 2008.0</name>
-    <id type="integer">3</id>
-  </image>
-  <image>
-    <name>Debian 5.0 (lenny)</name>
-    <id type="integer">4</id>
-  </image>
-  <image>
-    <name>Fedora 10 (Cambridge)</name>
-    <id type="integer">5</id>
-  </image>
-  <image>
-    <name>CentOS 5.3</name>
-    <id type="integer">7</id>
-  </image>
-  <image>
-    <name>Ubuntu 9.04 (jaunty)</name>
-    <id type="integer">8</id>
-  </image>
-  <image>
-    <name>Arch 2009.02</name>
-    <id type="integer">9</id>
-  </image>
-  <image>
-    <name>Ubuntu 8.04.2 LTS (hardy)</name>
-    <id type="integer">10</id>
-  </image>
-  <image>
-    <name>Ubuntu 8.10 (intrepid)</name>
-    <id type="integer">11</id>
-  </image>
-  <image>
-    <name>Red Hat EL 5.3</name>
-    <id type="integer">12</id>
-  </image>
-  <image>
-    <name>Fedora 11 (Leonidas)</name>
-    <id type="integer">13</id>
-  </image>
-</images>

http://git-wip-us.apache.org/repos/asf/libcloud/blob/6ebe04b9/libcloud/test/compute/fixtures/slicehost/slices_1_reboot.xml
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/slicehost/slices_1_reboot.xml b/libcloud/test/compute/fixtures/slicehost/slices_1_reboot.xml
deleted file mode 100644
index 8dac90b..0000000
--- a/libcloud/test/compute/fixtures/slicehost/slices_1_reboot.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-<slice>
-  <name>libcloud-test</name>
-  <image-id type="integer">10</image-id>
-  <addresses type="array">
-    <address>174.143.212.229</address>
-    <address>10.176.164.199</address>
-  </addresses>
-  <progress type="integer">100</progress>
-  <id type="integer">70507</id>
-  <bw-out type="float">0.0</bw-out>
-  <bw-in type="float">0.0</bw-in>
-  <flavor-id type="integer">1</flavor-id>
-  <status>reboot</status>
-  <ip-address>174.143.212.229</ip-address>
-</slice>

http://git-wip-us.apache.org/repos/asf/libcloud/blob/6ebe04b9/libcloud/test/compute/fixtures/slicehost/slices_1_reboot_forbidden.xml
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/slicehost/slices_1_reboot_forbidden.xml b/libcloud/test/compute/fixtures/slicehost/slices_1_reboot_forbidden.xml
deleted file mode 100644
index cb8c99b..0000000
--- a/libcloud/test/compute/fixtures/slicehost/slices_1_reboot_forbidden.xml
+++ /dev/null
@@ -1,3 +0,0 @@
-<errors>
-  <error>Permission denied</error>
-</errors>

http://git-wip-us.apache.org/repos/asf/libcloud/blob/6ebe04b9/libcloud/test/compute/fixtures/slicehost/slices_errors.xml
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/slicehost/slices_errors.xml b/libcloud/test/compute/fixtures/slicehost/slices_errors.xml
deleted file mode 100644
index 6555aa1..0000000
--- a/libcloud/test/compute/fixtures/slicehost/slices_errors.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<errors>
-  <error>Slice parameters are not properly nested</error>
-</errors>

http://git-wip-us.apache.org/repos/asf/libcloud/blob/6ebe04b9/libcloud/test/compute/fixtures/slicehost/slices_get.xml
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/slicehost/slices_get.xml b/libcloud/test/compute/fixtures/slicehost/slices_get.xml
deleted file mode 100644
index 5fb51bf..0000000
--- a/libcloud/test/compute/fixtures/slicehost/slices_get.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<slices type="array">
-  <slice>
-    <name>libcloud-foo</name>
-    <image-id type="integer">10</image-id>
-    <addresses type="array">
-      <address>174.143.212.229</address>
-      <address>10.176.164.199</address>
-    </addresses>
-    <progress type="integer">0</progress>
-    <id type="integer">1</id>
-    <bw-out type="float">0.0</bw-out>
-    <bw-in type="float">0.0</bw-in>
-    <flavor-id type="integer">1</flavor-id>
-    <status>build</status>
-    <ip-address>174.143.212.229</ip-address>
-  </slice>
-</slices>

http://git-wip-us.apache.org/repos/asf/libcloud/blob/6ebe04b9/libcloud/test/compute/fixtures/slicehost/slices_post.xml
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/slicehost/slices_post.xml b/libcloud/test/compute/fixtures/slicehost/slices_post.xml
deleted file mode 100644
index 2257f26..0000000
--- a/libcloud/test/compute/fixtures/slicehost/slices_post.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<slice>
-  <name>slicetest</name>
-  <image-id type="integer">11</image-id>
-  <addresses type="array">
-    <address>10.176.168.15</address>
-    <address>67.23.20.114</address>
-  </addresses>
-  <root-password>fooadfa1231</root-password>
-  <progress type="integer">0</progress>
-  <id type="integer">71907</id>
-  <bw-out type="float">0.0</bw-out>
-  <bw-in type="float">0.0</bw-in>
-  <flavor-id type="integer">1</flavor-id>
-  <status>build</status>
-  <ip-address>10.176.168.15</ip-address>
-</slice>

http://git-wip-us.apache.org/repos/asf/libcloud/blob/6ebe04b9/libcloud/test/compute/test_slicehost.py
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/test_slicehost.py b/libcloud/test/compute/test_slicehost.py
deleted file mode 100644
index 3b3bb3d..0000000
--- a/libcloud/test/compute/test_slicehost.py
+++ /dev/null
@@ -1,163 +0,0 @@
-# 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 unittest
-from libcloud.utils.py3 import httplib
-
-from xml.etree import ElementTree as ET
-
-from libcloud.compute.drivers.slicehost import SlicehostNodeDriver as Slicehost
-from libcloud.compute.types import NodeState, InvalidCredsError
-from libcloud.compute.base import Node, NodeImage, NodeSize
-
-from libcloud.test import MockHttp
-from libcloud.test.compute import TestCaseMixin
-from libcloud.test.file_fixtures import ComputeFileFixtures
-from libcloud.test.secrets import SLICEHOST_PARAMS
-
-
-class SlicehostTest(unittest.TestCase, TestCaseMixin):
-
-    def setUp(self):
-
-        Slicehost.connectionCls.conn_classes = (None, SlicehostMockHttp)
-        SlicehostMockHttp.type = None
-        self.driver = Slicehost(*SLICEHOST_PARAMS)
-
-    def test_list_nodes(self):
-        ret = self.driver.list_nodes()
-        self.assertEqual(len(ret), 1)
-        node = ret[0]
-        self.assertTrue('174.143.212.229' in node.public_ips)
-        self.assertTrue('10.176.164.199' in node.private_ips)
-        self.assertEqual(node.state, NodeState.PENDING)
-
-        SlicehostMockHttp.type = 'UNAUTHORIZED'
-        try:
-            ret = self.driver.list_nodes()
-        except InvalidCredsError:
-            e = sys.exc_info()[1]
-            self.assertEqual(e.value, 'HTTP Basic: Access denied.')
-        else:
-            self.fail('test should have thrown')
-
-    def test_list_sizes(self):
-        ret = self.driver.list_sizes()
-        self.assertEqual(len(ret), 7)
-        size = ret[0]
-        self.assertEqual(size.name, '256 slice')
-
-    def test_list_images(self):
-        ret = self.driver.list_images()
-        self.assertEqual(len(ret), 11)
-        image = ret[0]
-        self.assertEqual(image.name, 'CentOS 5.2')
-        self.assertEqual(image.id, '2')
-
-    def test_reboot_node(self):
-        node = Node(
-            id=1, name=None, state=None, public_ips=None, private_ips=None,
-            driver=self.driver)
-
-        ret = node.reboot()
-        self.assertTrue(ret is True)
-
-        ret = self.driver.reboot_node(node)
-        self.assertTrue(ret is True)
-
-        SlicehostMockHttp.type = 'FORBIDDEN'
-        try:
-            ret = self.driver.reboot_node(node)
-        except Exception:
-            e = sys.exc_info()[1]
-            self.assertEqual(e.args[0], 'Permission denied')
-        else:
-            self.fail('test should have thrown')
-
-    def test_destroy_node(self):
-        node = Node(
-            id=1, name=None, state=None, public_ips=None, private_ips=None,
-            driver=self.driver)
-
-        ret = node.destroy()
-        self.assertTrue(ret is True)
-
-        ret = self.driver.destroy_node(node)
-        self.assertTrue(ret is True)
-
-    def test_create_node(self):
-        image = NodeImage(id=11, name='ubuntu 8.10', driver=self.driver)
-        size = NodeSize(
-            1, '256 slice', None, None, None, None, driver=self.driver)
-        node = self.driver.create_node(
-            name='slicetest', image=image, size=size)
-        self.assertEqual(node.name, 'slicetest')
-        self.assertEqual(node.extra.get('password'), 'fooadfa1231')
-
-
-class SlicehostMockHttp(MockHttp):
-
-    fixtures = ComputeFileFixtures('slicehost')
-
-    def _slices_xml(self, method, url, body, headers):
-        if method == 'POST':
-            tree = ET.XML(body)
-            name = tree.findtext('name')
-            image_id = int(tree.findtext('image-id'))
-            flavor_id = int(tree.findtext('flavor-id'))
-
-            # TODO: would be awesome to get the slicehost api developers to fill in the
-            # the correct validation logic
-            if not (name and image_id and flavor_id) \
-                or tree.tag != 'slice' \
-                or not 'Content-Type' in headers  \
-                    or headers['Content-Type'] != 'application/xml':
-
-                err_body = self.fixtures.load('slices_error.xml')
-                return (httplib.UNPROCESSABLE_ENTITY, err_body, {}, '')
-
-            body = self.fixtures.load('slices_post.xml')
-            return (httplib.CREATED, body, {}, '')
-        else:
-            body = self.fixtures.load('slices_get.xml')
-            return (httplib.OK, body, {}, httplib.responses[httplib.OK])
-
-    def _slices_xml_UNAUTHORIZED(self, method, url, body, headers):
-        err_body = 'HTTP Basic: Access denied.'
-        return (httplib.UNAUTHORIZED, err_body, {},
-                httplib.responses[httplib.UNAUTHORIZED])
-
-    def _flavors_xml(self, method, url, body, headers):
-        body = self.fixtures.load('flavors.xml')
-        return (httplib.OK, body, {}, httplib.responses[httplib.OK])
-
-    def _images_xml(self, method, url, body, headers):
-        body = self.fixtures.load('images.xml')
-        return (httplib.OK, body, {}, httplib.responses[httplib.OK])
-
-    def _slices_1_reboot_xml(self, method, url, body, headers):
-        body = self.fixtures.load('slices_1_reboot.xml')
-        return (httplib.OK, body, {}, httplib.responses[httplib.OK])
-
-    def _slices_1_reboot_xml_FORBIDDEN(self, method, url, body, headers):
-        body = self.fixtures.load('slices_1_reboot_forbidden.xml')
-        return (httplib.FORBIDDEN, body, {}, httplib.responses[httplib.FORBIDDEN])
-
-    def _slices_1_destroy_xml(self, method, url, body, headers):
-        body = ''
-        return (httplib.OK, body, {}, httplib.responses[httplib.OK])
-
-if __name__ == '__main__':
-    sys.exit(unittest.main())


[2/2] git commit: Modify drivers for public cloud providers which use HTTP Basic authentication to not allow insecure connections by default (secure kwarg being set to False).

Posted by to...@apache.org.
Modify drivers for public cloud providers which use HTTP Basic
authentication to not allow insecure connections by default (secure kwarg
being set to False).

This way credentials can't accidentaly be sent in plain text over the
write.

Affected drivers: Bluebox, Joyent, NephoScale, OpSource, VPSNet


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

Branch: refs/heads/trunk
Commit: a8aff7e1934e9cd07db7e966054b6cf2106b7160
Parents: 6ebe04b
Author: Tomaz Muraus <to...@apache.org>
Authored: Sat Nov 16 18:05:08 2013 +0100
Committer: Tomaz Muraus <to...@apache.org>
Committed: Sat Nov 16 18:30:46 2013 +0100

----------------------------------------------------------------------
 CHANGES                                | 10 ++++++++++
 libcloud/common/base.py                |  8 ++++++++
 libcloud/compute/drivers/bluebox.py    |  2 ++
 libcloud/compute/drivers/joyent.py     |  2 ++
 libcloud/compute/drivers/nephoscale.py |  2 ++
 libcloud/compute/drivers/opsource.py   |  2 ++
 libcloud/compute/drivers/vpsnet.py     |  2 ++
 libcloud/test/test_connection.py       | 13 +++++++++++++
 8 files changed, 41 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/libcloud/blob/a8aff7e1/CHANGES
----------------------------------------------------------------------
diff --git a/CHANGES b/CHANGES
index d18f50f..cbb472f 100644
--- a/CHANGES
+++ b/CHANGES
@@ -10,6 +10,16 @@ Changes with Apache Libcloud in development
       this driver.
       [Tomaz Muraus]
 
+    - Modify drivers for public cloud providers which use HTTP Basic
+      authentication to not allow insecure connections (secure constructor
+      kwarg being set to False) by default.
+
+      This way credentials can't accidentaly be sent in plain text over the
+      write.
+
+      Affected drivers: Bluebox, Joyent, NephoScale, OpSource, VPSNet
+      [Tomaz Muraus]
+
 Changes with Apache Libcloud 0.14.0-beta3
 
   *) General

http://git-wip-us.apache.org/repos/asf/libcloud/blob/a8aff7e1/libcloud/common/base.py
----------------------------------------------------------------------
diff --git a/libcloud/common/base.py b/libcloud/common/base.py
index 9dc778f..6cccc0a 100644
--- a/libcloud/common/base.py
+++ b/libcloud/common/base.py
@@ -391,12 +391,20 @@ class Connection(object):
     action = None
     cache_busting = False
 
+    allow_insecure = True
+
     def __init__(self, secure=True, host=None, port=None, url=None,
                  timeout=None):
         self.secure = secure and 1 or 0
         self.ua = []
         self.context = {}
 
+        if not self.allow_insecure and not secure:
+            # TODO: We should eventually switch to whitelist instead of
+            # blacklist approach
+            raise ValueError('Non https connections are not allowed (use '
+                             'secure=True)')
+
         self.request_path = ''
 
         if host:

http://git-wip-us.apache.org/repos/asf/libcloud/blob/a8aff7e1/libcloud/compute/drivers/bluebox.py
----------------------------------------------------------------------
diff --git a/libcloud/compute/drivers/bluebox.py b/libcloud/compute/drivers/bluebox.py
index 8dc1ba2..204e0de 100644
--- a/libcloud/compute/drivers/bluebox.py
+++ b/libcloud/compute/drivers/bluebox.py
@@ -119,6 +119,8 @@ class BlueboxConnection(ConnectionUserAndKey):
     secure = True
     responseCls = BlueboxResponse
 
+    allow_insecure = False
+
     def add_default_headers(self, headers):
         user_b64 = base64.b64encode(b('%s:%s' % (self.user_id, self.key)))
         headers['Authorization'] = 'Basic %s' % (user_b64)

http://git-wip-us.apache.org/repos/asf/libcloud/blob/a8aff7e1/libcloud/compute/drivers/joyent.py
----------------------------------------------------------------------
diff --git a/libcloud/compute/drivers/joyent.py b/libcloud/compute/drivers/joyent.py
index f3c0132..1aa1a60 100644
--- a/libcloud/compute/drivers/joyent.py
+++ b/libcloud/compute/drivers/joyent.py
@@ -75,6 +75,8 @@ class JoyentConnection(ConnectionUserAndKey):
 
     responseCls = JoyentResponse
 
+    allow_insecure = False
+
     def add_default_headers(self, headers):
         headers['Accept'] = 'application/json'
         headers['Content-Type'] = 'application/json; charset=UTF-8'

http://git-wip-us.apache.org/repos/asf/libcloud/blob/a8aff7e1/libcloud/compute/drivers/nephoscale.py
----------------------------------------------------------------------
diff --git a/libcloud/compute/drivers/nephoscale.py b/libcloud/compute/drivers/nephoscale.py
index dc100ce..c8fad3b 100644
--- a/libcloud/compute/drivers/nephoscale.py
+++ b/libcloud/compute/drivers/nephoscale.py
@@ -95,6 +95,8 @@ class NephoscaleConnection(ConnectionUserAndKey):
     host = API_HOST
     responseCls = NephoscaleResponse
 
+    allow_insecure = False
+
     def add_default_headers(self, headers):
         """
         Add parameters that are necessary for every request

http://git-wip-us.apache.org/repos/asf/libcloud/blob/a8aff7e1/libcloud/compute/drivers/opsource.py
----------------------------------------------------------------------
diff --git a/libcloud/compute/drivers/opsource.py b/libcloud/compute/drivers/opsource.py
index e16dfec..fc98be3 100644
--- a/libcloud/compute/drivers/opsource.py
+++ b/libcloud/compute/drivers/opsource.py
@@ -134,6 +134,8 @@ class OpsourceConnection(ConnectionUserAndKey):
     _orgId = None
     responseCls = OpsourceResponse
 
+    allow_insecure = False
+
     def add_default_headers(self, headers):
         headers['Authorization'] = \
             ('Basic %s' % b64encode(b('%s:%s' % (self.user_id,

http://git-wip-us.apache.org/repos/asf/libcloud/blob/a8aff7e1/libcloud/compute/drivers/vpsnet.py
----------------------------------------------------------------------
diff --git a/libcloud/compute/drivers/vpsnet.py b/libcloud/compute/drivers/vpsnet.py
index ec0dd5d..8d026a8 100644
--- a/libcloud/compute/drivers/vpsnet.py
+++ b/libcloud/compute/drivers/vpsnet.py
@@ -69,6 +69,8 @@ class VPSNetConnection(ConnectionUserAndKey):
     host = API_HOST
     responseCls = VPSNetResponse
 
+    allow_insecure = False
+
     def add_default_headers(self, headers):
         user_b64 = base64.b64encode(b('%s:%s' % (self.user_id, self.key)))
         headers['Authorization'] = 'Basic %s' % (user_b64.decode('utf-8'))

http://git-wip-us.apache.org/repos/asf/libcloud/blob/a8aff7e1/libcloud/test/test_connection.py
----------------------------------------------------------------------
diff --git a/libcloud/test/test_connection.py b/libcloud/test/test_connection.py
index 1418c3c..0525dd4 100644
--- a/libcloud/test/test_connection.py
+++ b/libcloud/test/test_connection.py
@@ -29,10 +29,23 @@ class ConnectionClassTestCase(unittest.TestCase):
 
         Connection.connect = Mock()
         Connection.responseCls = Mock()
+        Connection.allow_insecure = True
 
     def tearDown(self):
         Connection.connect = self.originalConnect
         Connection.responseCls = Connection.responseCls
+        Connection.allow_insecure = True
+
+    def test_dont_allow_insecure(self):
+        Connection.allow_insecure = True
+        Connection(secure=False)
+
+        Connection.allow_insecure = False
+
+        expected_msg = (r'Non https connections are not allowed \(use '
+                        'secure=True\)')
+        self.assertRaisesRegexp(ValueError, expected_msg, Connection,
+                                secure=False)
 
     def test_content_length(self):
         con = Connection()