From 15974244f6212905540e1daf9ca596c83f510bdd Mon Sep 17 00:00:00 2001 From: Sarath Kumar Date: Thu, 21 Jul 2016 11:14:39 -0700 Subject: Enable os-net-config to support and configure NFVSwitch These changes are to generate /etc/sysconf/network-scripts/ifcfg-* and /etc/sysconfig/nfvswitch configuration files for nfvswitch and its interfaces. NFVSwitch is a virtual switch implementation based on DPDK for datacenter workloads with very high throughput needs. Change-Id: If02edb9c4c54c014f67290fe0c34e2fc73cb95bd --- os_net_config/tests/test_cli.py | 18 ++++++++ os_net_config/tests/test_impl_ifcfg.py | 47 ++++++++++++++++++++ os_net_config/tests/test_objects.py | 81 ++++++++++++++++++++++++++++++++++ 3 files changed, 146 insertions(+) (limited to 'os_net_config/tests') diff --git a/os_net_config/tests/test_cli.py b/os_net_config/tests/test_cli.py index 98477fc..e598dcb 100644 --- a/os_net_config/tests/test_cli.py +++ b/os_net_config/tests/test_cli.py @@ -146,3 +146,21 @@ class TestCli(base.TestCase): stdout_yaml, stderr = self.run_cli('ARG0 --provider=ifcfg --noop ' '-c %s --detailed-exit-codes' % interface_yaml, exitcodes=(0,)) + + def test_nfvswitch_noop_output(self): + nfvswitch_yaml = os.path.join(SAMPLE_BASE, 'nfvswitch.yaml') + nfvswitch_json = os.path.join(SAMPLE_BASE, 'nfvswitch.json') + stdout_yaml, stderr = self.run_cli('ARG0 --provider=ifcfg --noop ' + '-c %s' % nfvswitch_yaml) + self.assertEqual('', stderr) + stdout_json, stderr = self.run_cli('ARG0 --provider=ifcfg --noop ' + '-c %s' % nfvswitch_json) + self.assertEqual('', stderr) + sanity_devices = ['DEVICE=nic2', + 'DEVICE=nic3', + 'DEVICE=api201', + 'DEVICE=storage202', + 'DEVICETYPE=nfvswitch'] + for dev in sanity_devices: + self.assertIn(dev, stdout_yaml) + self.assertEqual(stdout_yaml, stdout_json) diff --git a/os_net_config/tests/test_impl_ifcfg.py b/os_net_config/tests/test_impl_ifcfg.py index b8a8402..467db65 100644 --- a/os_net_config/tests/test_impl_ifcfg.py +++ b/os_net_config/tests/test_impl_ifcfg.py @@ -292,6 +292,34 @@ NETMASK=255.255.255.0 _IVS_CONFIG = ('DAEMON_ARGS=\"--hitless --certificate /etc/ivs ' '--inband-vlan 4092 -u em1 --internal-port=storage5\"') +_NFVSWITCH_INTERFACE = """# This file is autogenerated by os-net-config +DEVICE=em1 +ONBOOT=yes +HOTPLUG=no +NM_CONTROLLED=no +PEERDNS=no +DEVICETYPE=nfvswitch +NFVSWITCH_BRIDGE=nfvswitch +BOOTPROTO=none +""" + +_NFVSWITCH_INTERNAL = """# This file is autogenerated by os-net-config +DEVICE=storage5 +ONBOOT=yes +HOTPLUG=no +NM_CONTROLLED=no +PEERDNS=no +TYPE=NFVSWITCHIntPort +DEVICETYPE=nfvswitch +NFVSWITCH_BRIDGE=nfvswitch +MTU=1500 +BOOTPROTO=static +IPADDR=172.16.2.7 +NETMASK=255.255.255.0 +""" + +_NFVSWITCH_CONFIG = ('SETUP_ARGS=\" -c 2,3,4,5 -u em1 -m storage5\"') + _OVS_IFCFG_PATCH_PORT = """# This file is autogenerated by os-net-config DEVICE=br-pub-patch ONBOOT=yes @@ -553,6 +581,25 @@ class TestIfcfgNetConfig(base.TestCase): data = self.provider.generate_ivs_config(['em1'], ['storage5']) self.assertEqual(_IVS_CONFIG, data) + def test_network_nfvswitch_with_interfaces_and_internal_interfaces(self): + interface = objects.Interface('em1') + v4_addr = objects.Address('172.16.2.7/24') + nfvswitch_internal = objects.NfvswitchInternal(vlan_id=5, + name='storage', + addresses=[v4_addr]) + iface_name = nfvswitch_internal.name + bridge = objects.NfvswitchBridge(members=[interface, + nfvswitch_internal], + cpus="2,3,4,5") + self.provider.add_interface(interface) + self.provider.add_nfvswitch_internal(nfvswitch_internal) + self.provider.add_nfvswitch_bridge(bridge) + self.assertEqual(_NFVSWITCH_INTERFACE, self.get_interface_config()) + self.assertEqual(_NFVSWITCH_INTERNAL, + self.provider.nfvswitch_intiface_data[iface_name]) + data = self.provider.generate_nfvswitch_config(['em1'], ['storage5']) + self.assertEqual(_NFVSWITCH_CONFIG, data) + def test_add_ib_interface_with_v4_multiple(self): addresses = [objects.Address('192.168.1.2/24'), objects.Address('192.168.1.3/32'), diff --git a/os_net_config/tests/test_objects.py b/os_net_config/tests/test_objects.py index 17b6927..bbff1f3 100644 --- a/os_net_config/tests/test_objects.py +++ b/os_net_config/tests/test_objects.py @@ -398,6 +398,87 @@ class TestIvsBridge(base.TestCase): self.assertIn(expected, err) +class TestNfvswitchBridge(base.TestCase): + + def test_from_json(self): + data = """{ +"type": "nfvswitch_bridge", +"cpus": "2,3,4,5", +"members": [ + {"type": "interface", "name": "nic2"} + ] +} +""" + bridge = objects.object_from_json(json.loads(data)) + self.assertEqual("nfvswitch", bridge.name) + self.assertEqual("2,3,4,5", bridge.cpus) + interface1 = bridge.members[0] + self.assertEqual("nic2", interface1.name) + self.assertEqual(False, interface1.ovs_port) + self.assertEqual("nfvswitch", interface1.nfvswitch_bridge_name) + + +class TestNfvswitchInterface(base.TestCase): + + def test_interface_from_json(self): + data = """{ +"type": "nfvswitch_bridge", +"cpus": "2,3,4,5", +"members": [ + {"type": "interface","name": "nic1"}, + {"type": "interface","name": "nic2"} + ] +} +""" + bridge = objects.object_from_json(json.loads(data)) + self.assertEqual("nfvswitch", bridge.name) + self.assertEqual("2,3,4,5", bridge.cpus) + interface1 = bridge.members[0] + self.assertEqual("nic1", interface1.name) + interface2 = bridge.members[1] + self.assertEqual("nic2", interface2.name) + self.assertEqual(False, interface2.ovs_port) + self.assertEqual("nfvswitch", interface1.nfvswitch_bridge_name) + + def test_nfvswitch_internal_from_json(self): + data = """{ +"type": "nfvswitch_bridge", +"cpus": "2,3,4,5", +"members": [ + {"type": "nfvswitch_internal", "name": "storage", "vlan_id": 202}, + {"type": "nfvswitch_internal", "name": "api", "vlan_id": 201} + ] +} +""" + bridge = objects.object_from_json(json.loads(data)) + self.assertEqual("nfvswitch", bridge.name) + self.assertEqual("2,3,4,5", bridge.cpus) + interface1 = bridge.members[0] + self.assertEqual("storage202", interface1.name) + interface2 = bridge.members[1] + self.assertEqual("api201", interface2.name) + self.assertEqual(False, interface1.ovs_port) + self.assertEqual("nfvswitch", interface1.nfvswitch_bridge_name) + + def test_bond_interface_from_json(self): + data = """{ +"type": "nfvswitch_bridge", +"cpus": "2,3,4,5", +"members": [{ + "type": "linux_bond", "name": "bond1", "members": + [{"type": "interface", "name": "nic2"}, + {"type": "interface", "name": "nic3"}] + } + ] +} +""" + err = self.assertRaises(objects.InvalidConfigException, + objects.NfvswitchBridge.from_json, + json.loads(data)) + expected = 'NFVSwitch does not support bond interfaces.' + self.assertIn(expected, err) + + class TestBond(base.TestCase): def test_from_json_dhcp(self): -- cgit 1.2.3-korg