Updated Branches:
  refs/heads/trunk a3749039a -> 55b41581a

Issue LIBCLOUD-402: Support OS-DCF:diskConfig

Rackspace is implementing a change to server creation where disk
partitioning will not automatically fill the entire disk, leaving the
option to the user to expand the disk or not. When creating nodes, you
have the ability to specify if you want a MANUAL disk config, or if you
want an AUTO disk config. The former results in quicker server creation,
while the latter results in the entire disk being used.

This change is exposed via an extension to the OpenStack compute APIs,
which Rackspace's Cloud Servers are built on top of.
"OS-DCF:diskConfig" is an attribute to be set in message bodies POST'ed
to /servers, and is exposed as the "ex_disk_config" parameter to
OpenStack_1_1_NodeDriver.create_node.

Signed-off-by: Tomaz Muraus <[email protected]>


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

Branch: refs/heads/trunk
Commit: de6644d1ef2d15776bf3324a9531c9d80d3a0f59
Parents: a374903
Author: Brian Curtin <[email protected]>
Authored: Fri Sep 27 15:57:45 2013 -0500
Committer: Tomaz Muraus <[email protected]>
Committed: Tue Oct 1 21:41:24 2013 +0100

----------------------------------------------------------------------
 libcloud/compute/drivers/openstack.py              | 14 ++++++++++++--
 ...rvers_26f7fbee_8ce1_4c28_887a_bfe8e4bb10fe.json |  6 ++++--
 .../fixtures/openstack_v1.1/_servers_detail.json   |  2 +-
 libcloud/test/compute/test_openstack.py            | 17 +++++++++++++++++
 4 files changed, 34 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/libcloud/blob/de6644d1/libcloud/compute/drivers/openstack.py
----------------------------------------------------------------------
diff --git a/libcloud/compute/drivers/openstack.py 
b/libcloud/compute/drivers/openstack.py
index 23ea906..866adb7 100644
--- a/libcloud/compute/drivers/openstack.py
+++ b/libcloud/compute/drivers/openstack.py
@@ -1043,7 +1043,8 @@ class OpenStackSecurityGroup(object):
         :type       description: ``str``
 
         :keyword    rules: Rules associated with this group.
-        :type       description: ``list`` of 
:class:`OpenStackSecurityGroupRule`
+        :type       description: ``list`` of
+                    :class:`OpenStackSecurityGroupRule`
 
         :keyword    extra: Extra attributes associated with this group.
         :type       extra: ``dict``
@@ -1210,7 +1211,12 @@ class OpenStack_1_1_NodeDriver(OpenStackNodeDriver):
 
         :keyword    ex_security_groups: List of security groups to assign to
                                         the node
-        :type       ex_security_groups: ``list`` of 
:class:`OpenStackSecurityGroup`
+        :type       ex_security_groups: ``list`` of
+                                       :class:`OpenStackSecurityGroup`
+
+        :keyword    ex_disk_config: Name of the disk configuration.
+                                    Can be either ``AUTO`` or ``MANUAL``.
+        :type       ex_disk_config: ``str``
         """
 
         server_params = self._create_args_to_params(None, **kwargs)
@@ -1285,6 +1291,9 @@ class OpenStack_1_1_NodeDriver(OpenStackNodeDriver):
             server_params['user_data'] = base64.b64encode(
                 b(kwargs['ex_userdata'])).decode('ascii')
 
+        if 'ex_disk_config' in kwargs:
+            server_params['OS-DCF:diskConfig'] = kwargs['ex_disk_config']
+
         if 'networks' in kwargs:
             networks = kwargs['networks']
             networks = [{'uuid': network.id} for network in networks]
@@ -1850,6 +1859,7 @@ class OpenStack_1_1_NodeDriver(OpenStackNodeDriver):
                 created=api_node['created'],
                 updated=api_node['updated'],
                 key_name=api_node.get('key_name', None),
+                disk_config=api_node.get('OS-DCF:diskConfig', None),
             ),
         )
 

http://git-wip-us.apache.org/repos/asf/libcloud/blob/de6644d1/libcloud/test/compute/fixtures/openstack_v1.1/_servers_26f7fbee_8ce1_4c28_887a_bfe8e4bb10fe.json
----------------------------------------------------------------------
diff --git 
a/libcloud/test/compute/fixtures/openstack_v1.1/_servers_26f7fbee_8ce1_4c28_887a_bfe8e4bb10fe.json
 
b/libcloud/test/compute/fixtures/openstack_v1.1/_servers_26f7fbee_8ce1_4c28_887a_bfe8e4bb10fe.json
index 45d7782..f857f52 100644
--- 
a/libcloud/test/compute/fixtures/openstack_v1.1/_servers_26f7fbee_8ce1_4c28_887a_bfe8e4bb10fe.json
+++ 
b/libcloud/test/compute/fixtures/openstack_v1.1/_servers_26f7fbee_8ce1_4c28_887a_bfe8e4bb10fe.json
@@ -44,6 +44,8 @@
         "id": "26f7fbee-8ce1-4c28-887a-bfe8e4bb10fe",
         "metadata": {
             "My Server Name" : "Apache1"
-        }
+        },
+        "OS-DCF:diskConfig": "AUTO"
+
     }
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/libcloud/blob/de6644d1/libcloud/test/compute/fixtures/openstack_v1.1/_servers_detail.json
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/openstack_v1.1/_servers_detail.json 
b/libcloud/test/compute/fixtures/openstack_v1.1/_servers_detail.json
index 91c2f0d..35d9085 100644
--- a/libcloud/test/compute/fixtures/openstack_v1.1/_servers_detail.json
+++ b/libcloud/test/compute/fixtures/openstack_v1.1/_servers_detail.json
@@ -1 +1 @@
-{"servers": [{"status": "BUILD", "updated": "2011-10-11T00:50:04Z", "hostId": 
"912566d83a13fbb357ea3f13c629363d9f7e1ba3f925b49f3d2ab725", "user_id": 
"rs-reach", "name": "lc-test-2", "links": [{"href": 
"http://alpha.ord.servers.api.rackspacecloud.com:8774/v1.1/rs-reach-project/servers/12065";,
 "rel": "self"}, {"href": 
"http://alpha.ord.servers.api.rackspacecloud.com:8774/rs-reach-project/servers/12065";,
 "rel": "bookmark"}], "addresses": {"public": [{"version": 4, "addr": 
"50.57.94.35"}, {"version": 6, "addr": "2001:4801:7808:52:16:3eff:fe47:788a"}], 
"private": [{"version": 4, "addr": "10.182.64.34"}, {"version": 6, "addr": 
"fec0:4801:7808:52:16:3eff:fe60:187d"}], "mynetwork": [{"version": 4, "addr": 
"12.16.18.28"}]}, "tenant_id": "rs-reach-project", "image": {"id": "7", 
"links": [{"href": 
"http://alpha.ord.servers.api.rackspacecloud.com:8774/rs-reach-project/images/7";,
 "rel": "bookmark"}]}, "created": "2011-10-11T00:51:39Z", "uuid": 
"02786501-714e-40af-8342-9c17eccb166d", "accessIPv4"
 : "", "accessIPv6": "", "key_name": null, "progress": 25, "flavor": {"id": 
"2", "links": [{"href": 
"http://alpha.ord.servers.api.rackspacecloud.com:8774/rs-reach-project/flavors/2";,
 "rel": "bookmark"}]}, "config_drive": "", "id": 12065, "metadata": {}}, 
{"status": "ACTIVE", "updated": "2011-10-11T00:44:20Z", "hostId": 
"a024053a6201e6c6c12660aab3d8fd879e332e663a5e1fdbc02a0307", "user_id": 
"rs-reach", "name": "lc-test", "links": [{"href": 
"http://alpha.ord.servers.api.rackspacecloud.com:8774/v1.1/rs-reach-project/servers/12064";,
 "rel": "self"}, {"href": 
"http://alpha.ord.servers.api.rackspacecloud.com:8774/rs-reach-project/servers/12064";,
 "rel": "bookmark"}], "addresses": {"public": [{"version": 4, "addr": 
"50.57.94.30"}, {"version": 6, "addr": "2001:4801:7808:52:16:3eff:fe77:32e3"}], 
"private": [{"version": 4, "addr": "10.182.64.29"}, {"version": 6, "addr": 
"fec0:4801:7808:52:16:3eff:fe6e:b7e2"}]}, "tenant_id": "rs-reach-project", 
"image": {"id": "7", "links": [{"href": "http://alpha
 .ord.servers.api.rackspacecloud.com:8774/rs-reach-project/images/7", "rel": 
"bookmark"}]}, "created": "2011-10-11T00:45:02Z", "uuid": 
"ec53630b-e4fb-442a-a748-c376f5c4345b", "accessIPv4": "", "accessIPv6": "", 
"key_name": null, "progress": 100, "flavor": {"id": "2", "links": [{"href": 
"http://alpha.ord.servers.api.rackspacecloud.com:8774/rs-reach-project/flavors/2";,
 "rel": "bookmark"}]}, "config_drive": "", "id": 12064, "metadata": {}}]}
+{"servers": [{"status": "BUILD", "updated": "2011-10-11T00:50:04Z", "hostId": 
"912566d83a13fbb357ea3f13c629363d9f7e1ba3f925b49f3d2ab725", "user_id": 
"rs-reach", "name": "lc-test-2", "links": [{"href": 
"http://alpha.ord.servers.api.rackspacecloud.com:8774/v1.1/rs-reach-project/servers/12065";,
 "rel": "self"}, {"href": 
"http://alpha.ord.servers.api.rackspacecloud.com:8774/rs-reach-project/servers/12065";,
 "rel": "bookmark"}], "addresses": {"public": [{"version": 4, "addr": 
"50.57.94.35"}, {"version": 6, "addr": "2001:4801:7808:52:16:3eff:fe47:788a"}], 
"private": [{"version": 4, "addr": "10.182.64.34"}, {"version": 6, "addr": 
"fec0:4801:7808:52:16:3eff:fe60:187d"}], "mynetwork": [{"version": 4, "addr": 
"12.16.18.28"}]}, "tenant_id": "rs-reach-project", "image": {"id": "7", 
"links": [{"href": 
"http://alpha.ord.servers.api.rackspacecloud.com:8774/rs-reach-project/images/7";,
 "rel": "bookmark"}]}, "created": "2011-10-11T00:51:39Z", "uuid": 
"02786501-714e-40af-8342-9c17eccb166d", "accessIPv4"
 : "", "accessIPv6": "", "key_name": null, "progress": 25, "flavor": {"id": 
"2", "links": [{"href": 
"http://alpha.ord.servers.api.rackspacecloud.com:8774/rs-reach-project/flavors/2";,
 "rel": "bookmark"}]}, "config_drive": "", "id": 12065, "metadata": {}, 
"OS-DCF:diskConfig": "AUTO"}, {"status": "ACTIVE", "updated": 
"2011-10-11T00:44:20Z", "hostId": 
"a024053a6201e6c6c12660aab3d8fd879e332e663a5e1fdbc02a0307", "user_id": 
"rs-reach", "name": "lc-test", "links": [{"href": 
"http://alpha.ord.servers.api.rackspacecloud.com:8774/v1.1/rs-reach-project/servers/12064";,
 "rel": "self"}, {"href": 
"http://alpha.ord.servers.api.rackspacecloud.com:8774/rs-reach-project/servers/12064";,
 "rel": "bookmark"}], "addresses": {"public": [{"version": 4, "addr": 
"50.57.94.30"}, {"version": 6, "addr": "2001:4801:7808:52:16:3eff:fe77:32e3"}], 
"private": [{"version": 4, "addr": "10.182.64.29"}, {"version": 6, "addr": 
"fec0:4801:7808:52:16:3eff:fe6e:b7e2"}]}, "tenant_id": "rs-reach-project", 
"image": {"id": "7", "li
 nks": [{"href": 
"http://alpha.ord.servers.api.rackspacecloud.com:8774/rs-reach-project/images/7";,
 "rel": "bookmark"}]}, "created": "2011-10-11T00:45:02Z", "uuid": 
"ec53630b-e4fb-442a-a748-c376f5c4345b", "accessIPv4": "", "accessIPv6": "", 
"key_name": null, "progress": 100, "flavor": {"id": "2", "links": [{"href": 
"http://alpha.ord.servers.api.rackspacecloud.com:8774/rs-reach-project/flavors/2";,
 "rel": "bookmark"}]}, "config_drive": "", "id": 12064, "metadata": {}, 
"OS-DCF:diskConfig": "AUTO"}]}

http://git-wip-us.apache.org/repos/asf/libcloud/blob/de6644d1/libcloud/test/compute/test_openstack.py
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/test_openstack.py 
b/libcloud/test/compute/test_openstack.py
index 5de21fb..fe72c3e 100644
--- a/libcloud/test/compute/test_openstack.py
+++ b/libcloud/test/compute/test_openstack.py
@@ -911,6 +911,16 @@ class OpenStack_1_1_Tests(unittest.TestCase, 
TestCaseMixin):
         self.assertEqual(node.extra['metadata']['My Server Name'], 'Apache1')
         self.assertEqual(node.extra['key_name'], 'devstack')
 
+    def test_create_node_with_ex_disk_config(self):
+        OpenStackMockHttp.type = 'EX_DISK_CONFIG'
+        image = NodeImage(id=11, name='Ubuntu 8.10 (intrepid)', 
driver=self.driver)
+        size = NodeSize(1, '256 slice', None, None, None, None, 
driver=self.driver)
+        node = self.driver.create_node(name='racktest', image=image, size=size,
+                                       ex_disk_config='AUTO')
+        self.assertEqual(node.id, '26f7fbee-8ce1-4c28-887a-bfe8e4bb10fe')
+        self.assertEqual(node.name, 'racktest')
+        self.assertEqual(node.extra['disk_config'], 'AUTO')
+
     def test_destroy_node(self):
         self.assertTrue(self.node.destroy())
 
@@ -1383,6 +1393,13 @@ class OpenStack_1_1_MockHttp(MockHttpTestCase):
             body = self.fixtures.load('_servers_12063_metadata_two_keys.json')
             return (httplib.OK, body, self.json_content_headers, 
httplib.responses[httplib.OK])
 
+    def _v1_1_slug_servers_EX_DISK_CONFIG(self, method, url, body, headers):
+        if method == "POST":
+            body = u(body)
+            self.assertTrue(body.find('\"OS-DCF:diskConfig\": \"AUTO\"'))
+            body = self.fixtures.load('_servers_create_disk_config.json')
+            return (httplib.OK, body, self.json_content_headers, 
httplib.responses[httplib.OK])
+
     def _v1_1_slug_flavors_7(self, method, url, body, headers):
         if method == "GET":
             body = self.fixtures.load('_flavors_7.json')

Reply via email to