diff --git a/neutron_lib/objects/utils.py b/neutron_lib/objects/utils.py index 11c4599e5..92dd31dfc 100644 --- a/neutron_lib/objects/utils.py +++ b/neutron_lib/objects/utils.py @@ -98,3 +98,11 @@ class NotEqual(FilterObj): def filter(self, column): return column != self.value + + +def get_updatable_fields(cls, fields): + fields = fields.copy() + for field in cls.fields_no_update: + if field in fields: + del fields[field] + return fields diff --git a/neutron_lib/tests/unit/objects/test_utils.py b/neutron_lib/tests/unit/objects/test_utils.py index 7464dd1bd..ef15fa51c 100644 --- a/neutron_lib/tests/unit/objects/test_utils.py +++ b/neutron_lib/tests/unit/objects/test_utils.py @@ -10,6 +10,8 @@ # License for the specific language governing permissions and limitations # under the License. +import mock + from neutron_lib.objects import utils as obj_utils from neutron_lib.tests import _base as base @@ -31,13 +33,15 @@ class TestUtils(base.BaseTestCase): filter_obj = obj_utils.NotIn([1, 2, 3]) fake_column = FakeColumn([1, 2, 4, 5]) - self.assertEqual([4, 5], filter_obj.filter(fake_column)) + self.assertEqual([4, 5], + sorted(filter_obj.filter(fake_column))) fake_column = FakeColumn([1, 2]) self.assertEqual([], filter_obj.filter(fake_column)) fake_column = FakeColumn([4, 5]) - self.assertEqual([4, 5], filter_obj.filter(fake_column)) + self.assertEqual([4, 5], + sorted(filter_obj.filter(fake_column))) def test_get_objects_with_filters_not_equal(self): @@ -50,10 +54,23 @@ class TestUtils(base.BaseTestCase): filter_obj = obj_utils.NotEqual(1) fake_column = FakeColumn([1, 2, 4, 5]) - self.assertEqual([2, 4, 5], filter_obj.filter(fake_column)) + self.assertEqual([2, 4, 5], + sorted(filter_obj.filter(fake_column))) fake_column = FakeColumn([1]) self.assertEqual([], filter_obj.filter(fake_column)) fake_column = FakeColumn([4, 5]) - self.assertEqual([4, 5], filter_obj.filter(fake_column)) + self.assertEqual([4, 5], + sorted(filter_obj.filter(fake_column))) + + def test_get_updatable_fields(self): + mock_class = mock.Mock() + mock_class.fields_no_update = [0, 2, 6] + + mock_fields = mock.Mock() + mock_fields.copy.return_value = {k: k for k in range(7)} + + updatable = obj_utils.get_updatable_fields(mock_class, mock_fields) + self.assertEqual([1, 3, 4, 5], + sorted(list(updatable.keys()))) diff --git a/releasenotes/notes/rehome-get-updatable-fields-82fd87d402d63ca2.yaml b/releasenotes/notes/rehome-get-updatable-fields-82fd87d402d63ca2.yaml new file mode 100644 index 000000000..25e863621 --- /dev/null +++ b/releasenotes/notes/rehome-get-updatable-fields-82fd87d402d63ca2.yaml @@ -0,0 +1,4 @@ +--- +features: + - The ``get_updatable_fields`` function from ``neutron.objects.base`` is now + available in ``neutron_lib.object.utils``.