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')
