Repository: libcloud Updated Branches: refs/heads/trunk 8a9ffd1df -> 370964d5b
Add ex_create_port and ex_get_port to Openstackv2 driver Signed-off-by: Rick van de Loo <[email protected]> Project: http://git-wip-us.apache.org/repos/asf/libcloud/repo Commit: http://git-wip-us.apache.org/repos/asf/libcloud/commit/6f610cab Tree: http://git-wip-us.apache.org/repos/asf/libcloud/tree/6f610cab Diff: http://git-wip-us.apache.org/repos/asf/libcloud/diff/6f610cab Branch: refs/heads/trunk Commit: 6f610cab262ccdb280fe03694eb40393876f9799 Parents: 8a9ffd1 Author: Alexander Grooff <[email protected]> Authored: Fri Jul 6 10:53:13 2018 +0200 Committer: Rick van de Loo <[email protected]> Committed: Fri Jul 6 12:01:23 2018 +0200 ---------------------------------------------------------------------- libcloud/compute/drivers/openstack.py | 50 ++++++++++++++++++ .../fixtures/openstack_v1.1/_port_v2.json | 32 ++++++++++++ libcloud/test/compute/test_openstack.py | 53 +++++++++++++++++++- 3 files changed, 134 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/libcloud/blob/6f610cab/libcloud/compute/drivers/openstack.py ---------------------------------------------------------------------- diff --git a/libcloud/compute/drivers/openstack.py b/libcloud/compute/drivers/openstack.py index e0a5ff0..2ce9f55 100644 --- a/libcloud/compute/drivers/openstack.py +++ b/libcloud/compute/drivers/openstack.py @@ -2604,6 +2604,7 @@ class OpenStack_2_NodeDriver(OpenStack_1_1_NodeDriver): created=created, driver=self, extra=dict( + admin_state_up=element['admin_state_up'], allowed_address_pairs=element['allowed_address_pairs'], binding_vnic_type=element['binding:vnic_type'], device_id=element['device_id'], @@ -2849,6 +2850,55 @@ class OpenStack_2_NodeDriver(OpenStack_1_1_NodeDriver): method='POST', data=data ).success() + def ex_create_port(self, network, description=None, + admin_state_up=True, name=None): + """ + Creates a new OpenStack_2_PortInterface + + :param network: ID of the network where the newly created + port should be attached to + :type network: :class:`OpenStackNetwork` + + :param description: Description of the port + :type description: str + + :param admin_state_up: The administrative state of the + resource, which is up or down + :type admin_state_up: bool + + :param name: Human-readable name of the resource + :type name: str + + :rtype: :class:`OpenStack_2_PortInterface` + """ + data = { + 'port': + { + 'description': description or '', + 'admin_state_up': admin_state_up, + 'name': name or '', + 'network_id': network.id, + } + } + response = self.network_connection.request( + '/v2.0/ports', method='POST', data=data + ) + return self._to_port(response.object['port']) + + def ex_get_port(self, port_interface_id): + """ + Retrieve the OpenStack_2_PortInterface with the given ID + + :param port_interface_id: ID of the requested port + :type port_interface_id: str + + :return: :class:`OpenStack_2_PortInterface` + """ + response = self.network_connection.request( + '/v2.0/ports/{}'.format(port_interface_id), method='GET' + ) + return self._to_port(response.object['port']) + class OpenStack_1_1_FloatingIpPool(object): """ http://git-wip-us.apache.org/repos/asf/libcloud/blob/6f610cab/libcloud/test/compute/fixtures/openstack_v1.1/_port_v2.json ---------------------------------------------------------------------- diff --git a/libcloud/test/compute/fixtures/openstack_v1.1/_port_v2.json b/libcloud/test/compute/fixtures/openstack_v1.1/_port_v2.json new file mode 100644 index 0000000..a86a8e6 --- /dev/null +++ b/libcloud/test/compute/fixtures/openstack_v1.1/_port_v2.json @@ -0,0 +1,32 @@ +{ + "port": { + "status": "BUILD", + "extra_dhcp_opts": [], + "description": "Some port description", + "allowed_address_pairs": [], + "tags": [], + "network_id": "123c8a8c-6427-4e8f-a805-2035365f4d43", + "tenant_id": "abcdec85bee34bb0a44ab8255eb36abc", + "created_at": "2018-07-04T14:38:18Z", + "admin_state_up": true, + "updated_at": "2018-07-05T14:40:43Z", + "binding:vnic_type": "normal", + "device_owner": "compute:nova", + "name": "Some port name", + "revision_number": 2036, + "mac_address": "ba:12:12:8a:b2:73", + "port_security_enabled": true, + "project_id": "abcdec85bee34bb0a44ab8255eb36abc", + "fixed_ips": [ + { + "subnet_id": "1231a12a-125b-4329-a3c5-312ea86a7577", + "ip_address": "12.123.12.32" + } + ], + "id": "126da55e-cfcb-41c8-ae39-a26cb8a7e723", + "security_groups": [ + "abcfb112-5b5c-4c6b-8b3f-dbaee57df440" + ], + "device_id": "95e75643-2008-123f-ad13-e20ea64e3c87" + } +} http://git-wip-us.apache.org/repos/asf/libcloud/blob/6f610cab/libcloud/test/compute/test_openstack.py ---------------------------------------------------------------------- diff --git a/libcloud/test/compute/test_openstack.py b/libcloud/test/compute/test_openstack.py index 19b75e7..4462b34 100644 --- a/libcloud/test/compute/test_openstack.py +++ b/libcloud/test/compute/test_openstack.py @@ -47,7 +47,7 @@ from libcloud.compute.drivers.openstack import ( OpenStack_1_1_FloatingIpAddress, OpenStackKeyPair, OpenStack_1_0_Connection, OpenStackNodeDriver, - OpenStack_2_NodeDriver, OpenStack_2_PortInterfaceState) + OpenStack_2_NodeDriver, OpenStack_2_PortInterfaceState, OpenStackNetwork) from libcloud.compute.base import Node, NodeImage, NodeSize from libcloud.pricing import set_pricing, clear_pricing_data @@ -1718,6 +1718,51 @@ class OpenStack_2_Tests(OpenStack_1_1_Tests): ) self.assertEqual(port.extra['name'], '') + def test_ex_create_port(self): + network = OpenStackNetwork(id='123c8a8c-6427-4e8f-a805-2035365f4d43', name='test-network', + cidr='1.2.3.4', driver=self.driver) + port = self.driver.ex_create_port(network=network, description='Some port description', name='Some port name', + admin_state_up=True) + + self.assertEqual(port.id, '126da55e-cfcb-41c8-ae39-a26cb8a7e723') + self.assertEqual(port.state, OpenStack_2_PortInterfaceState.BUILD) + self.assertEqual(port.created, '2018-07-04T14:38:18Z') + self.assertEqual( + port.extra['network_id'], + '123c8a8c-6427-4e8f-a805-2035365f4d43' + ) + self.assertEqual( + port.extra['project_id'], + 'abcdec85bee34bb0a44ab8255eb36abc' + ) + self.assertEqual( + port.extra['tenant_id'], + 'abcdec85bee34bb0a44ab8255eb36abc' + ) + self.assertEqual(port.extra['admin_state_up'], True) + self.assertEqual(port.extra['name'], 'Some port name') + self.assertEqual(port.extra['description'], 'Some port description') + + def test_ex_get_port(self): + port = self.driver.ex_get_port('126da55e-cfcb-41c8-ae39-a26cb8a7e723') + + self.assertEqual(port.id, '126da55e-cfcb-41c8-ae39-a26cb8a7e723') + self.assertEqual(port.state, OpenStack_2_PortInterfaceState.BUILD) + self.assertEqual(port.created, '2018-07-04T14:38:18Z') + self.assertEqual( + port.extra['network_id'], + '123c8a8c-6427-4e8f-a805-2035365f4d43' + ) + self.assertEqual( + port.extra['project_id'], + 'abcdec85bee34bb0a44ab8255eb36abc' + ) + self.assertEqual( + port.extra['tenant_id'], + 'abcdec85bee34bb0a44ab8255eb36abc' + ) + self.assertEqual(port.extra['name'], 'Some port name') + def test_ex_delete_port(self): ports = self.driver.ex_list_ports() port = ports[0] @@ -1965,12 +2010,18 @@ class OpenStack_1_1_MockHttp(MockHttp, unittest.TestCase): if method == "GET": body = self.fixtures.load('_ports_v2.json') return (httplib.OK, body, self.json_content_headers, httplib.responses[httplib.OK]) + elif method == "POST": + body = self.fixtures.load('_port_v2.json') + return (httplib.OK, body, self.json_content_headers, httplib.responses[httplib.OK]) else: raise NotImplementedError() def _v2_1337_v2_0_ports_126da55e_cfcb_41c8_ae39_a26cb8a7e723(self, method, url, body, headers): if method == "DELETE": return (httplib.NO_CONTENT, "", {}, httplib.responses[httplib.NO_CONTENT]) + elif method == "GET": + body = self.fixtures.load('_port_v2.json') + return (httplib.OK, body, self.json_content_headers, httplib.responses[httplib.OK]) else: raise NotImplementedError()
