diff --git a/neutron/objects/network_segment_range.py b/neutron/objects/network_segment_range.py index 51f37e3c36a..dc1106fb2b5 100644 --- a/neutron/objects/network_segment_range.py +++ b/neutron/objects/network_segment_range.py @@ -78,6 +78,21 @@ class NetworkSegmentRange(base.NeutronDbObject): pass return db_utils.resource_fields(_dict, fields) + def _check_shared_project_id(self, action): + if self.shared is False and not self.project_id: + raise n_exc.ObjectActionError( + action=action, + reason='if NetworkSegmentRange is not shared, it must have a ' + 'project_id') + + def create(self): + self._check_shared_project_id('create') + super(NetworkSegmentRange, self).create() + + def update(self): + self._check_shared_project_id('update') + super(NetworkSegmentRange, self).update() + def _get_allocation_model_details(self): model = models_map.get(self.network_type) if model is not None: diff --git a/neutron/tests/unit/objects/test_network_segment_range.py b/neutron/tests/unit/objects/test_network_segment_range.py index 2928b34cee0..41f23fefe64 100644 --- a/neutron/tests/unit/objects/test_network_segment_range.py +++ b/neutron/tests/unit/objects/test_network_segment_range.py @@ -16,6 +16,7 @@ import random import mock from neutron_lib import constants +from neutron_lib import exceptions as n_exc from neutron_lib.utils import helpers from oslo_utils import uuidutils @@ -136,3 +137,32 @@ class NetworkSegmentRangeDbObjectTestCase(obj_test_base.BaseDbObjectTestCase, maximum=max(list(alloc_mapping.keys()))) ret_alloc_mapping = self._test_class._get_used_allocation_mapping(obj) self.assertDictEqual(alloc_mapping, ret_alloc_mapping) + + def _define_network_segment_range(self, shared=False, + remove_project_id=False): + attrs = self.get_random_object_fields(obj_cls=self._test_class) + obj = self._test_class(self.context, **attrs) + obj.shared = shared + obj.project_id = None if remove_project_id else obj.project_id + return obj + + def test_create_not_shared_with_project_id(self): + obj = self._define_network_segment_range() + obj.create() + + def test_create_not_shared_without_project_id(self): + obj = self._define_network_segment_range(remove_project_id=True) + self.assertRaises(n_exc.ObjectActionError, obj.create) + + def test_update_not_shared_with_project_id(self): + obj = self._define_network_segment_range(shared=True) + obj.create() + obj.shared = False + obj.update() + + def test_update_not_shared_without_project_id(self): + obj = self._define_network_segment_range(shared=True, + remove_project_id=True) + obj.create() + obj.shared = False + self.assertRaises(n_exc.ObjectActionError, obj.update)