From 9f486a2f33b0194995940e2663b235b9e670396b Mon Sep 17 00:00:00 2001 From: Van Hung Pham Date: Wed, 1 Nov 2017 18:28:40 +0700 Subject: [PATCH] Router to OVO This patch introduces the Router model class to Oslo-Versioned Object Partially-Implements: blueprint adopt-oslo-versioned-objects-for-db Change-Id: I5e0bef20aed884db7694286a398e10faff3b057e --- neutron/common/constants.py | 8 ++++++++ neutron/objects/common_types.py | 4 ++++ neutron/objects/router.py | 19 +++++++++++++++++++ neutron/tests/tools.py | 4 ++++ neutron/tests/unit/objects/test_base.py | 9 +++++---- neutron/tests/unit/objects/test_objects.py | 1 + neutron/tests/unit/objects/test_router.py | 17 +++++++++++++++++ 7 files changed, 58 insertions(+), 4 deletions(-) diff --git a/neutron/common/constants.py b/neutron/common/constants.py index f1db9043d66..49d7dad5c2c 100644 --- a/neutron/common/constants.py +++ b/neutron/common/constants.py @@ -19,6 +19,14 @@ from neutron_lib import constants as lib_constants ROUTER_PORT_OWNERS = lib_constants.ROUTER_INTERFACE_OWNERS_SNAT + \ (lib_constants.DEVICE_OWNER_ROUTER_GW,) +ROUTER_STATUS_ACTIVE = 'ACTIVE' +ROUTER_STATUS_ALLOCATING = 'ALLOCATING' +ROUTER_STATUS_ERROR = 'ERROR' + +VALID_ROUTER_STATUS = (ROUTER_STATUS_ACTIVE, + ROUTER_STATUS_ALLOCATING, + ROUTER_STATUS_ERROR) + HA_ROUTER_STATE_KEY = '_ha_state' METERING_LABEL_KEY = '_metering_labels' FLOATINGIP_AGENT_INTF_KEY = '_floatingip_agent_interfaces' diff --git a/neutron/objects/common_types.py b/neutron/objects/common_types.py index 36f28b582b4..b96cb80e420 100644 --- a/neutron/objects/common_types.py +++ b/neutron/objects/common_types.py @@ -309,3 +309,7 @@ class UUIDField(obj_fields.AutoTypedField): class FloatingIPStatusEnumField(obj_fields.AutoTypedField): AUTO_TYPE = obj_fields.Enum(valid_values=constants.VALID_FLOATINGIP_STATUS) + + +class RouterStatusEnumField(obj_fields.AutoTypedField): + AUTO_TYPE = obj_fields.Enum(valid_values=constants.VALID_ROUTER_STATUS) diff --git a/neutron/objects/router.py b/neutron/objects/router.py index 41d9dc4edae..2c87e3f4f2c 100644 --- a/neutron/objects/router.py +++ b/neutron/objects/router.py @@ -185,6 +185,25 @@ class DVRMacAddress(base.NeutronDbObject): return result +@base.NeutronObjectRegistry.register +class Router(base.NeutronDbObject): + # Version 1.0: Initial version + VERSION = '1.0' + + db_model = l3.Router + + fields = { + 'id': common_types.UUIDField(), + 'project_id': obj_fields.StringField(nullable=True), + 'name': obj_fields.StringField(nullable=True), + 'status': common_types.RouterStatusEnumField(nullable=True), + 'admin_state_up': obj_fields.BooleanField(nullable=True), + 'gw_port_id': common_types.UUIDField(nullable=True), + 'enable_snat': obj_fields.BooleanField(default=True), + 'flavor_id': common_types.UUIDField(nullable=True), + } + + @base.NeutronObjectRegistry.register class FloatingIP(base.NeutronDbObject): # Version 1.0: Initial version diff --git a/neutron/tests/tools.py b/neutron/tests/tools.py index 440590d6c1c..df54634a2ee 100644 --- a/neutron/tests/tools.py +++ b/neutron/tests/tools.py @@ -234,6 +234,10 @@ def get_random_ip_address(version=4): return ip +def get_random_router_status(): + return random.choice(n_const.VALID_ROUTER_STATUS) + + def get_random_floatingip_status(): return random.choice(n_const.VALID_FLOATINGIP_STATUS) diff --git a/neutron/tests/unit/objects/test_base.py b/neutron/tests/unit/objects/test_base.py index 6c9ca83b898..4b5d50b1f0e 100644 --- a/neutron/tests/unit/objects/test_base.py +++ b/neutron/tests/unit/objects/test_base.py @@ -45,6 +45,7 @@ from neutron.objects import network as net_obj from neutron.objects import ports from neutron.objects.qos import policy as qos_policy from neutron.objects import rbac_db +from neutron.objects import router from neutron.objects import securitygroup from neutron.objects import subnet from neutron.objects import utils as obj_utils @@ -488,6 +489,7 @@ FIELD_TYPE_VALUE_GENERATOR_MAP = { tools.get_random_port_binding_statuses, common_types.PortRangeField: tools.get_random_port, common_types.PortRangeWith0Field: lambda: tools.get_random_port(0), + common_types.RouterStatusEnumField: tools.get_random_router_status, common_types.SetOfUUIDsField: get_set_of_random_uuids, common_types.UUIDField: uuidutils.generate_uuid, common_types.VlanIdRangeField: tools.get_random_vlan, @@ -1517,10 +1519,9 @@ class BaseDbObjectTestCase(_BaseObjectTestCase, attrs = { 'name': 'test_router', } - # TODO(sindhu): Replace with the router object once its ready - router = obj_db_api.create_object( - self.context, l3_model.Router, attrs) - return router['id'] + self._router = router.Router(self.context, **attrs) + self._router.create() + return self._router['id'] def _create_test_security_group_id(self): sg_fields = self.get_random_object_fields(securitygroup.SecurityGroup) diff --git a/neutron/tests/unit/objects/test_objects.py b/neutron/tests/unit/objects/test_objects.py index e918b944b4d..f163f9b1173 100644 --- a/neutron/tests/unit/objects/test_objects.py +++ b/neutron/tests/unit/objects/test_objects.py @@ -83,6 +83,7 @@ object_data = { 'Reservation': '1.0-49929fef8e82051660342eed51b48f2a', 'ResourceDelta': '1.0-a980b37e0a52618b5af8db29af18be76', 'Route': '1.0-a9883a63b416126f9e345523ec09483b', + 'Router': '1.0-b8d482cf3164541da4edaec99a644507', 'RouterExtraAttributes': '1.0-ef8d61ae2864f0ec9af0ab7939cab318', 'RouterL3AgentBinding': '1.0-c5ba6c95e3a4c1236a55f490cd67da82', 'RouterPort': '1.0-c8c8f499bcdd59186fcd83f323106908', diff --git a/neutron/tests/unit/objects/test_router.py b/neutron/tests/unit/objects/test_router.py index ff99258e241..fc3b36a5ba8 100644 --- a/neutron/tests/unit/objects/test_router.py +++ b/neutron/tests/unit/objects/test_router.py @@ -50,6 +50,23 @@ class RouterExtraAttrsDbObjTestCase(obj_test_base.BaseDbObjectTestCase, {'router_id': lambda: self._create_test_router_id()}) +class RouterIfaceObjectTestCase(obj_test_base.BaseObjectIfaceTestCase): + + _test_class = router.Router + + +class RouterDbObjectTestCase(obj_test_base.BaseDbObjectTestCase, + testlib_api.SqlTestCase): + + _test_class = router.Router + + def setUp(self): + super(RouterDbObjectTestCase, self).setUp() + self.update_obj_fields( + {'gw_port_id': lambda: self._create_test_port_id(), + 'flavor_id': lambda: self._create_test_flavor_id()}) + + class RouterPortIfaceObjectTestCase(obj_test_base.BaseObjectIfaceTestCase): _test_class = router.RouterPort