From 5f70a4afa9039b2f283828fcb0b4b5f53708a45f Mon Sep 17 00:00:00 2001 From: Ankur Gupta Date: Wed, 5 Oct 2016 14:01:53 -0500 Subject: [PATCH] Add auto-allocated-topology to SDK Added Neutron features for "Get me a network" Partially Implements: blueprint network-auto-allocated-topology Change-Id: I85bf6a1d7ae45f04b54430bbf738ea2886be6cb4 --- doc/source/users/resources/network/index.rst | 1 + .../network/v2/auto_allocated_topology.rst | 12 ++++ openstack/network/v2/_proxy.py | 57 +++++++++++++++++ .../network/v2/auto_allocated_topology.py | 46 ++++++++++++++ .../v2/test_auto_allocated_topology.py | 61 +++++++++++++++++++ .../v2/test_auto_allocated_topology.py | 37 +++++++++++ openstack/tests/unit/network/v2/test_proxy.py | 24 ++++++++ 7 files changed, 238 insertions(+) create mode 100644 doc/source/users/resources/network/v2/auto_allocated_topology.rst create mode 100644 openstack/network/v2/auto_allocated_topology.py create mode 100644 openstack/tests/functional/network/v2/test_auto_allocated_topology.py create mode 100644 openstack/tests/unit/network/v2/test_auto_allocated_topology.py diff --git a/doc/source/users/resources/network/index.rst b/doc/source/users/resources/network/index.rst index 6926f7842..21da8cf9f 100644 --- a/doc/source/users/resources/network/index.rst +++ b/doc/source/users/resources/network/index.rst @@ -6,6 +6,7 @@ Network Resources v2/address_scope v2/agent + v2/auto_allocated_topology v2/availability_zone v2/extension v2/flavor diff --git a/doc/source/users/resources/network/v2/auto_allocated_topology.rst b/doc/source/users/resources/network/v2/auto_allocated_topology.rst new file mode 100644 index 000000000..828f1a561 --- /dev/null +++ b/doc/source/users/resources/network/v2/auto_allocated_topology.rst @@ -0,0 +1,12 @@ +openstack.network.v2.auto_allocated_topology +============================================ + +.. automodule:: openstack.network.v2.auto_allocated_topology + +The Auto Allocated Topology Class +--------------------------------- + +The ``Auto Allocated Toplogy`` class inherits from :class:`~openstack.resource.Resource`. + +.. autoclass:: openstack.network.v2.auto_allocated_topology:AutoAllocatedTopology + :members: diff --git a/openstack/network/v2/_proxy.py b/openstack/network/v2/_proxy.py index 0582b94e5..98e74b713 100644 --- a/openstack/network/v2/_proxy.py +++ b/openstack/network/v2/_proxy.py @@ -12,6 +12,8 @@ from openstack.network.v2 import address_scope as _address_scope from openstack.network.v2 import agent as _agent +from openstack.network.v2 import auto_allocated_topology as \ + _auto_allocated_topology from openstack.network.v2 import availability_zone from openstack.network.v2 import extension from openstack.network.v2 import flavor as _flavor @@ -194,6 +196,61 @@ class Proxy(proxy.BaseProxy): """ return self._update(_agent.Agent, agent, **attrs) + def get_auto_allocated_topology(self, project=None): + """Get the auto-allocated topology of a given tenant + + :param project: + The value is the ID or name of a project + + :returns: The auto-allocated topology + :rtype: :class:`~openstack.network.v2.\ + auto_allocated_topology.AutoAllocatedTopology` + """ + + # If project option is not given, grab project id from session + if project is None: + project = self.session.get_project_id() + return self._get(_auto_allocated_topology.AutoAllocatedTopology, + project) + + def delete_auto_allocated_topology(self, project=None, + ignore_missing=False): + """Delete auto-allocated topology + + :param project: + The value is the ID or name of a project + :param ignore_missing: When set to ``False`` + :class:`~openstack.exceptions.ResourceNotFound` will be + raised when the topology does not exist. + When set to ``True``, no exception will be raised when + attempting to delete nonexistant topology + + :returns: ``None`` + """ + + # If project option is not given, grab project id from session + if project is None: + project = self.session.get_project_id() + self._delete(_auto_allocated_topology.AutoAllocatedTopology, + project, ignore_missing=ignore_missing) + + def validate_auto_allocated_topology(self, project=None): + """Validate the resources for auto allocation + + :param project: + The value is the ID or name of a project + + :returns: Whether all resources are correctly configured or not + :rtype: :class:`~openstack.network.v2.\ + auto_allocated_topology.ValidateTopology` + """ + + # If project option is not given, grab project id from session + if project is None: + project = self.session.get_project_id() + return self._get(_auto_allocated_topology.ValidateTopology, + path_args={'project': project}) + def availability_zones(self): """Return a generator of availability zones diff --git a/openstack/network/v2/auto_allocated_topology.py b/openstack/network/v2/auto_allocated_topology.py new file mode 100644 index 000000000..d345a66db --- /dev/null +++ b/openstack/network/v2/auto_allocated_topology.py @@ -0,0 +1,46 @@ +# Licensed 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. + +from openstack.network import network_service +from openstack import resource + + +class AutoAllocatedTopology(resource.Resource): + resource_name = 'auto_allocated_topology' + resource_key = 'auto_allocated_topology' + base_path = '/auto-allocated-topology' + service = network_service.NetworkService() + + # Capabilities + allow_create = False + allow_retrieve = True + allow_update = False + allow_delete = True + allow_list = False + + # Properties + #: Project ID + #: If project is not specified the topology will be created + #: for project user is authenticated against. + #: Will return in error if resources have not been configured correctly + #: To use this feature auto-allocated-topology, subnet_allocation, + #: external-net and router extensions must be enabled and set up. + project_id = resource.prop('tenant_id') + + +class ValidateTopology(AutoAllocatedTopology): + base_path = '/auto-allocated-topology/%(project)s?fields=dry-run' + + #: Validate requirements before running (Does not return topology) + #: Will return "Deployment error:" if the resources required have not + #: been correctly set up. + dry_run = resource.prop('dry_run') diff --git a/openstack/tests/functional/network/v2/test_auto_allocated_topology.py b/openstack/tests/functional/network/v2/test_auto_allocated_topology.py new file mode 100644 index 000000000..629957b80 --- /dev/null +++ b/openstack/tests/functional/network/v2/test_auto_allocated_topology.py @@ -0,0 +1,61 @@ +# Licensed 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. + +from openstack.tests.functional import base + + +class TestAutoAllocatedTopology(base.BaseFunctionalTest): + + NETWORK_NAME = 'auto_allocated_network' + NETWORK_ID = None + PROJECT_ID = None + + @classmethod + def setUpClass(cls): + super(TestAutoAllocatedTopology, cls).setUpClass() + projects = [o.project_id for o in cls.conn.network.networks()] + cls.PROJECT_ID = projects[0] + + @classmethod + def tearDownClass(cls): + res = cls.conn.network.delete_auto_allocated_topology(cls.PROJECT_ID) + cls.assertIs(None, res) + + def test_dry_run_option_pass(self): + # Dry run will only pass if there is a public network + networks = self.conn.network.networks() + self._set_network_external(networks) + + # Dry run option will return "dry-run=pass" in the 'id' resource + top = self.conn.network.validate_auto_allocated_topology( + self.PROJECT_ID) + self.assertEqual(self.PROJECT_ID, top.project) + self.assertEqual('dry-run=pass', top.id) + + def test_show_no_project_option(self): + top = self.conn.network.get_auto_allocated_topology() + project = self.conn.session.get_project_id() + network = self.conn.network.get_network(top.id) + self.assertEqual(top.project_id, project) + self.assertEqual(top.id, network.id) + + def test_show_project_option(self): + top = self.conn.network.get_auto_allocated_topology(self.PROJECT_ID) + network = self.conn.network.get_network(top.id) + self.assertEqual(top.project_id, network.project_id) + self.assertEqual(top.id, network.id) + self.assertEqual(network.name, 'auto_allocated_network') + + def _set_network_external(self, networks): + for network in networks: + if network.name == 'public': + self.conn.network.update_network(network, is_default=True) diff --git a/openstack/tests/unit/network/v2/test_auto_allocated_topology.py b/openstack/tests/unit/network/v2/test_auto_allocated_topology.py new file mode 100644 index 000000000..006118103 --- /dev/null +++ b/openstack/tests/unit/network/v2/test_auto_allocated_topology.py @@ -0,0 +1,37 @@ +# Licensed 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 testtools + +from openstack.network.v2 import auto_allocated_topology + +EXAMPLE = { + 'project_id': '1', + 'dry_run': False, +} + + +class TestAutoAllocatedTopology(testtools.TestCase): + + def test_basic(self): + topo = auto_allocated_topology.AutoAllocatedTopology + self.assertEqual('auto_allocated_topology', topo.resource_key) + self.assertEqual('/auto-allocated-topology', topo.base_path) + self.assertFalse(topo.allow_create) + self.assertTrue(topo.allow_retrieve) + self.assertFalse(topo.allow_update) + self.assertTrue(topo.allow_delete) + self.assertFalse(topo.allow_list) + + def test_make_it(self): + topo = auto_allocated_topology.AutoAllocatedTopology(EXAMPLE) + self.assertEqual(EXAMPLE['project_id'], topo.project_id) diff --git a/openstack/tests/unit/network/v2/test_proxy.py b/openstack/tests/unit/network/v2/test_proxy.py index 71412597b..a22ed9904 100644 --- a/openstack/tests/unit/network/v2/test_proxy.py +++ b/openstack/tests/unit/network/v2/test_proxy.py @@ -16,6 +16,7 @@ import uuid from openstack.network.v2 import _proxy from openstack.network.v2 import address_scope from openstack.network.v2 import agent +from openstack.network.v2 import auto_allocated_topology from openstack.network.v2 import availability_zone from openstack.network.v2 import extension from openstack.network.v2 import flavor @@ -873,3 +874,26 @@ class TestNetworkProxy(test_proxy_base.TestProxyBase): self.verify_list(self.proxy.service_providers, service_provider.ServiceProvider, paginated=False) + + def test_auto_allocated_topology_get(self): + self.verify_get(self.proxy.get_auto_allocated_topology, + auto_allocated_topology.AutoAllocatedTopology) + + def test_auto_allocated_topology_delete(self): + self.verify_delete(self.proxy.delete_auto_allocated_topology, + auto_allocated_topology.AutoAllocatedTopology, + False) + + def test_auto_allocated_topology_delete_ignore(self): + self.verify_delete(self.proxy.delete_auto_allocated_topology, + auto_allocated_topology.AutoAllocatedTopology, + True) + + def test_validate_topology(self): + self.verify_get(self.proxy.validate_auto_allocated_topology, + auto_allocated_topology.ValidateTopology, + value=[mock.sentinel.project_id], + expected_args=[ + auto_allocated_topology.ValidateTopology], + expected_kwargs={"path_args": { + "project": mock.sentinel.project_id}})