Add create and delete subnets
Project: http://git-wip-us.apache.org/repos/asf/libcloud/repo Commit: http://git-wip-us.apache.org/repos/asf/libcloud/commit/ca5430d6 Tree: http://git-wip-us.apache.org/repos/asf/libcloud/tree/ca5430d6 Diff: http://git-wip-us.apache.org/repos/asf/libcloud/diff/ca5430d6 Branch: refs/heads/trunk Commit: ca5430d689e621e6f1fb6d4231352471b9a7a91e Parents: 33e694f Author: micafer <[email protected]> Authored: Tue Oct 23 12:19:50 2018 +0200 Committer: Rick van de Loo <[email protected]> Committed: Tue Dec 4 09:45:48 2018 +0100 ---------------------------------------------------------------------- libcloud/compute/drivers/openstack.py | 40 +++++++++++++++++++- .../fixtures/openstack_v1.1/_v2_0__subnet.json | 32 ++++++++++++++++ libcloud/test/compute/test_openstack.py | 27 ++++++++++++- 3 files changed, 96 insertions(+), 3 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/libcloud/blob/ca5430d6/libcloud/compute/drivers/openstack.py ---------------------------------------------------------------------- diff --git a/libcloud/compute/drivers/openstack.py b/libcloud/compute/drivers/openstack.py index 0de0ab3..ec71091 100644 --- a/libcloud/compute/drivers/openstack.py +++ b/libcloud/compute/drivers/openstack.py @@ -1681,7 +1681,7 @@ class OpenStack_1_1_NodeDriver(OpenStackNodeDriver): def ex_delete_network(self, network): """ - Get a list of NodeNetorks that are available. + Delete a Network :param network: Network which should be used :type network: :class:`OpenStackNetwork` @@ -2914,6 +2914,44 @@ class OpenStack_2_NodeDriver(OpenStack_1_1_NodeDriver): self._subnets_url_prefix).object return self._to_subnets(response) + def ex_create_subnet(self, name, network, cidr, ip_version=4): + """ + Create a new Subnet + + :param name: Name of subnet which should be used + :type name: ``str`` + + :param network: Parent network of the subnet + :type network: ``OpenStackNetwork`` + + :param cidr: cidr of network which should be used + :type cidr: ``str`` + + :param ip_version: ip_version of subnet which should be used + :type ip_version: ``int`` + + :rtype: :class:`OpenStack_2_SubNet` + """ + data = {'subnet': {'cidr': cidr, 'network_id': network.id, + 'ip_version': ip_version, 'name': name}} + response = self.connection.request(self._subnets_url_prefix, + method='POST', data=data).object + return self._to_subnet(response['subnet']) + + def ex_delete_subnet(self, subnet): + """ + Delete a Subnet + + :param subnet: Subnet which should be deleted + :type subnet: :class:`OpenStack_2_SubNet` + + :rtype: ``bool`` + """ + resp = self.connection.request('%s/%s' % (self._subnets_url_prefix, + subnet.id), + method='DELETE') + return resp.status in (httplib.NO_CONTENT, httplib.ACCEPTED) + def ex_list_ports(self): """ List all OpenStack_2_PortInterfaces http://git-wip-us.apache.org/repos/asf/libcloud/blob/ca5430d6/libcloud/test/compute/fixtures/openstack_v1.1/_v2_0__subnet.json ---------------------------------------------------------------------- diff --git a/libcloud/test/compute/fixtures/openstack_v1.1/_v2_0__subnet.json b/libcloud/test/compute/fixtures/openstack_v1.1/_v2_0__subnet.json new file mode 100644 index 0000000..dba344a --- /dev/null +++ b/libcloud/test/compute/fixtures/openstack_v1.1/_v2_0__subnet.json @@ -0,0 +1,32 @@ +{ + "subnet": + { + "name": "name", + "enable_dhcp": true, + "network_id": "db193ab3-96e3-4cb3-8fc5-05f4296d0324", + "segment_id": null, + "project_id": "26a7980765d0414dbc1fc1f88cdb7e6e", + "tenant_id": "26a7980765d0414dbc1fc1f88cdb7e6e", + "dns_nameservers": [], + "allocation_pools": [ + { + "start": "10.0.0.2", + "end": "10.0.0.254" + } + ], + "host_routes": [], + "ip_version": 4, + "gateway_ip": "10.0.0.1", + "cidr": "10.0.0.0/24", + "id": "08eae331-0402-425a-923c-34f7cfe39c1b", + "created_at": "2016-10-10T14:35:34Z", + "description": "", + "ipv6_address_mode": null, + "ipv6_ra_mode": null, + "revision_number": 2, + "service_types": [], + "subnetpool_id": null, + "tags": ["tag1,tag2"], + "updated_at": "2016-10-10T14:35:34Z" + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/libcloud/blob/ca5430d6/libcloud/test/compute/test_openstack.py ---------------------------------------------------------------------- diff --git a/libcloud/test/compute/test_openstack.py b/libcloud/test/compute/test_openstack.py index db7b357..e567f17 100644 --- a/libcloud/test/compute/test_openstack.py +++ b/libcloud/test/compute/test_openstack.py @@ -1758,6 +1758,17 @@ class OpenStack_2_Tests(OpenStack_1_1_Tests): self.assertEqual(subnet.name, 'private-subnet') self.assertEqual(subnet.cidr, '10.0.0.0/24') + def test_ex_create_subnet(self): + network = self.driver.ex_list_networks()[0] + subnet = self.driver.ex_create_subnet('name', network, '10.0.0.0/24') + + self.assertEqual(subnet.name, 'name') + self.assertEqual(subnet.cidr, '10.0.0.0/24') + + def test_ex_delete_subnet(self): + subnet = self.driver.ex_list_subnets()[0] + self.assertTrue(self.driver.ex_delete_subnet(subnet=subnet)) + def test_ex_list_network(self): networks = self.driver.ex_list_networks() network = networks[0] @@ -2440,9 +2451,21 @@ class OpenStack_1_1_MockHttp(MockHttp, unittest.TestCase): body = '' return (httplib.NO_CONTENT, body, self.json_content_headers, httplib.responses[httplib.OK]) + def _v2_1337_v2_0_subnets_08eae331_0402_425a_923c_34f7cfe39c1b(self, method, url, body, headers): + if method == 'GET': + body = self.fixtures.load('_v2_0__subnet.json') + return (httplib.OK, body, self.json_content_headers, httplib.responses[httplib.OK]) + if method == 'DELETE': + body = '' + return (httplib.NO_CONTENT, body, self.json_content_headers, httplib.responses[httplib.OK]) + def _v2_1337_v2_0_subnets(self, method, url, body, headers): - body = self.fixtures.load('_v2_0__subnets.json') - return (httplib.OK, body, self.json_content_headers, httplib.responses[httplib.OK]) + if method == 'POST': + body = self.fixtures.load('_v2_0__subnet.json') + return (httplib.CREATED, body, self.json_content_headers, httplib.responses[httplib.OK]) + else: + body = self.fixtures.load('_v2_0__subnets.json') + return (httplib.OK, body, self.json_content_headers, httplib.responses[httplib.OK]) def _v2_1337_volumes_detail(self, method, url, body, headers): body = self.fixtures.load('_v2_0__volumes.json')
