diff --git a/os_vif/objects/fields.py b/os_vif/objects/fields.py index 6c4a09f3..bfe0a92f 100644 --- a/os_vif/objects/fields.py +++ b/os_vif/objects/fields.py @@ -12,21 +12,25 @@ # License for the specific language governing permissions and limitations # under the License. +import re + from oslo_versionedobjects import fields +import six from os_vif.i18n import _LE -import re - class PCIAddress(fields.FieldType): + + _REGEX = re.compile(r'^[0-9a-f]{4}:[0-9a-f]{2}:[0-1][0-9a-f].[0-7]$') + @staticmethod def coerce(obj, attr, value): - m = "[0-9a-f]{1,4}:[0-9a-f]{1,2}:[0-9a-f]{1,2}.[0-9a-f]" - newvalue = value.lower() - if not re.match(m, newvalue): - raise ValueError(_LE("Malformed PCI address %s"), value) - return newvalue + if isinstance(value, six.string_types): + newvalue = value.lower() + if PCIAddress._REGEX.match(newvalue): + return newvalue + raise ValueError(_LE("Malformed PCI address %s"), value) class PCIAddressField(fields.AutoTypedField): diff --git a/os_vif/tests/test_fields.py b/os_vif/tests/test_fields.py new file mode 100755 index 00000000..37465088 --- /dev/null +++ b/os_vif/tests/test_fields.py @@ -0,0 +1,36 @@ +# 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 oslo_versionedobjects.tests import test_fields + +from os_vif.objects import fields + + +class TestPCIAddress(test_fields.TestField): + def setUp(self): + super(TestPCIAddress, self).setUp() + self.field = fields.PCIAddressField() + self.coerce_good_values = [ + ('0000:02:00.0', '0000:02:00.0'), + ('FFFF:FF:1F.7', 'ffff:ff:1f.7'), + ('fFfF:fF:1F.7', 'ffff:ff:1f.7'), + ] + self.coerce_bad_values = [ + '000:02:00.0', # Too short + '00000:02:00.0', # Too long + 'FFFF:FF:2F.7', # Bad slot + 'FFFF:GF:1F.7', # Bad octal + 1123123, # Number + {}, # dict + ] + self.to_primitive_values = self.coerce_good_values[0:1] + self.from_primitive_values = self.coerce_good_values[0:1] diff --git a/os_vif/tests/test_vif.py b/os_vif/tests/test_vif.py index de951d8c..4bb4ab77 100644 --- a/os_vif/tests/test_vif.py +++ b/os_vif/tests/test_vif.py @@ -79,13 +79,13 @@ class TestVIFS(base.TestCase): def test_vif_host_dev_plain(self): self._test_vif(objects.vif.VIFHostDevice, - dev_address="02:24:22.3", + dev_address="0002:24:12.3", vlan=8) def test_vif_host_dev_vepa_qbh(self): prof = objects.vif.VIFPortProfile8021Qbh( profile_id="fishfood") self._test_vif(objects.vif.VIFHostDevice, - dev_address="02:24:22.3", + dev_address="0002:24:12.3", vlan=8, port_profile=prof)