diff options
author | Steven Hardy <shardy@redhat.com> | 2015-01-15 18:30:48 +0000 |
---|---|---|
committer | Steven Hardy <shardy@redhat.com> | 2015-02-24 09:20:41 +0000 |
commit | 6945fe5afdc12574fe00ad440319b7873f818e84 (patch) | |
tree | 69a85a7e8e933cda10afae4435ea2ebb6af8f918 /os_net_config/tests/test_objects.py | |
parent | e9791d7db9bae2a19367ec69c8b0083c6aa089a4 (diff) |
Add mapping option to influence nicN mapping order
Currently there's a fixed mapping between abstracted interface
names (nic1, nic2 etc) and the underlying biosdevname for the
device.
In many cases, this mapping based on system enumeration is
sufficient, but in some cases, particularly when you perform
detailed pre-deployment discovery of interfaces, you may wish
to alter the mapping independently of the config (e.g if the
config is in a heat template, and the discovery data is
provided at runtime).
So this adds a -m option to os-net-config, which enables a
mapping file to be provided, such that specific interfaces
may be mapped to their abstract names based on knowledge of
the devices or the networks they are connected to.
The mapping file has the following format, where em1 and em2 are
device names as detected by the OS (e.g biosdevname):
interface_mapping:
nic1: em2
nic2: em1
Or you can use the device MAC instead:
interface_mapping:
nic1: 12:34:56:78:9a:bc
nic2: 12:34:56:de:f0:12
Change-Id: I93e6d3ed733244834bb3c2126c91db705b4d9167
Diffstat (limited to 'os_net_config/tests/test_objects.py')
-rw-r--r-- | os_net_config/tests/test_objects.py | 75 |
1 files changed, 67 insertions, 8 deletions
diff --git a/os_net_config/tests/test_objects.py b/os_net_config/tests/test_objects.py index 2f43997..268a48b 100644 --- a/os_net_config/tests/test_objects.py +++ b/os_net_config/tests/test_objects.py @@ -15,9 +15,11 @@ # under the License. import json +import six from os_net_config import objects from os_net_config.tests import base +from os_net_config import utils class TestRoute(base.TestCase): @@ -93,9 +95,9 @@ class TestInterface(base.TestCase): self.assertEqual(True, interface.use_dhcp) def test_from_json_dhcp_nic1(self): - def test_numbered_nics(): + def dummy_numbered_nics(nic_mapping=None): return {"nic1": "em3"} - self.stubs.Set(objects, '_numbered_nics', test_numbered_nics) + self.stubs.Set(objects, '_numbered_nics', dummy_numbered_nics) data = '{"type": "interface", "name": "nic1", "use_dhcp": true}' interface = objects.object_from_json(json.loads(data)) @@ -141,9 +143,9 @@ class TestVlan(base.TestCase): self.assertEqual(True, vlan.use_dhcp) def test_from_json_dhcp_nic1(self): - def test_numbered_nics(): + def dummy_numbered_nics(nic_mapping=None): return {"nic1": "em4"} - self.stubs.Set(objects, '_numbered_nics', test_numbered_nics) + self.stubs.Set(objects, '_numbered_nics', dummy_numbered_nics) data = '{"type": "vlan", "device": "nic1", "vlan_id": 16,' \ '"use_dhcp": true}' @@ -175,9 +177,9 @@ class TestBridge(base.TestCase): self.assertEqual("br-foo", interface1.bridge_name) def test_from_json_dhcp_with_nic1(self): - def test_numbered_nics(): + def dummy_numbered_nics(nic_mapping=None): return {"nic1": "em5"} - self.stubs.Set(objects, '_numbered_nics', test_numbered_nics) + self.stubs.Set(objects, '_numbered_nics', dummy_numbered_nics) data = """{ "type": "ovs_bridge", @@ -258,9 +260,9 @@ class TestBond(base.TestCase): def test_from_json_dhcp_with_nic1_nic2(self): - def test_numbered_nics(): + def dummy_numbered_nics(nic_mapping=None): return {"nic1": "em1", "nic2": "em2"} - self.stubs.Set(objects, '_numbered_nics', test_numbered_nics) + self.stubs.Set(objects, '_numbered_nics', dummy_numbered_nics) data = """{ "type": "ovs_bond", @@ -285,3 +287,60 @@ class TestBond(base.TestCase): self.assertEqual("em1", interface1.name) interface2 = bridge.members[1] self.assertEqual("em2", interface2.name) + + +class TestNumberedNicsMapping(base.TestCase): + + # We want to test the function, not the dummy.. + stub_numbered_nics = False + + def tearDown(self): + super(TestNumberedNicsMapping, self).tearDown() + objects._NUMBERED_NICS = None + + def _stub_active_nics(self, nics): + def dummy_ordered_active_nics(): + return nics + self.stubs.Set(utils, 'ordered_active_nics', dummy_ordered_active_nics) + + def test_numbered_nics_default(self): + self._stub_active_nics(['em1', 'em2']) + expected = {'nic1': 'em1', 'nic2': 'em2'} + self.assertEqual(expected, objects._numbered_nics()) + + def test_numbered_nics_mapped(self): + self._stub_active_nics(['em1', 'em2']) + mapping = {'nic1': 'em2', 'nic2': 'em1'} + expected = {'nic1': 'em2', 'nic2': 'em1'} + self.assertEqual(expected, objects._numbered_nics(nic_mapping=mapping)) + + def test_numbered_nics_mapped_partial(self): + self._stub_active_nics(['em1', 'em2', 'em3', 'em4']) + mapping = {'nic1': 'em2', 'nic2': 'em1'} + expected = {'nic1': 'em2', 'nic2': 'em1', 'nic3': 'em3', 'nic4': 'em4'} + self.assertEqual(expected, objects._numbered_nics(nic_mapping=mapping)) + + def test_numbered_nics_map_error_notactive(self): + self._stub_active_nics(['em1', 'em2']) + mapping = {'nic1': 'em3', 'nic2': 'em1'} + expected = {'nic2': 'em1'} + self.assertEqual(expected, objects._numbered_nics(nic_mapping=mapping)) + + def test_numbered_nics_map_error_duplicate(self): + self._stub_active_nics(['em1', 'em2']) + mapping = {'nic1': 'em1', 'nic2': 'em1'} + err = self.assertRaises(objects.InvalidConfigException, + objects._numbered_nics, nic_mapping=mapping) + expected = 'em1 already mapped, check mapping file for duplicates' + self.assertIn(expected, six.text_type(err)) + + def test_numbered_nics_map_mac(self): + def dummy_interface_mac(name): + mac_map = {'em1': '12:34:56:78:9a:bc', + 'em2': '12:34:56:de:f0:12'} + return mac_map[name] + self.stubs.Set(utils, 'interface_mac', dummy_interface_mac) + self._stub_active_nics(['em1', 'em2']) + mapping = {'nic1': '12:34:56:de:f0:12', 'nic2': '12:34:56:78:9a:bc'} + expected = {'nic1': 'em2', 'nic2': 'em1'} + self.assertEqual(expected, objects._numbered_nics(nic_mapping=mapping)) |