aboutsummaryrefslogtreecommitdiffstats
path: root/os_net_config/tests/test_objects.py
diff options
context:
space:
mode:
authorSteven Hardy <shardy@redhat.com>2015-01-15 18:30:48 +0000
committerSteven Hardy <shardy@redhat.com>2015-02-24 09:20:41 +0000
commit6945fe5afdc12574fe00ad440319b7873f818e84 (patch)
tree69a85a7e8e933cda10afae4435ea2ebb6af8f918 /os_net_config/tests/test_objects.py
parente9791d7db9bae2a19367ec69c8b0083c6aa089a4 (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.py75
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))