From ee721fd3e8b77ccfe4252a107a9af8dc41ccc389 Mon Sep 17 00:00:00 2001 From: Rodolfo Alonso Hernandez Date: Tue, 10 Apr 2018 08:39:16 +0100 Subject: Improve IXIA IxNetwork library and traffic profile (1) This patch introduces a new way to configure the TCL IxNetwork server. All the configuration is done using the TCL API, removing the need of using the pre-saved configuration file. "IxNextgen.assign_ports" creates and assigns the virtual ports for each physical port defined in the test case. "IxNextgen.create_traffic_item" creates one traffic item and two flow groups per pair of ports, in both directions. "IxNextgen.gt_statistics" retrieves only the required statistics to generate the samples blob in the traffic generator. JIRA: YARDSTICK-1116 Change-Id: I8f1c0c55e99c274b2ed8276ed9a385c502e16d93 Signed-off-by: Rodolfo Alonso Hernandez Signed-off-by: Emma Foley --- .../network_services/libs/ixia_libs/test_IxNet.py | 393 +++++++++++++-------- 1 file changed, 246 insertions(+), 147 deletions(-) (limited to 'yardstick/tests/unit/network_services/libs/ixia_libs') diff --git a/yardstick/tests/unit/network_services/libs/ixia_libs/test_IxNet.py b/yardstick/tests/unit/network_services/libs/ixia_libs/test_IxNet.py index 7ca2f0f19..deae69314 100644 --- a/yardstick/tests/unit/network_services/libs/ixia_libs/test_IxNet.py +++ b/yardstick/tests/unit/network_services/libs/ixia_libs/test_IxNet.py @@ -11,92 +11,193 @@ # 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. -# import mock import IxNetwork import unittest -from yardstick.network_services.libs.ixia_libs.IxNet.IxNet import IxNextgen -from yardstick.network_services.libs.ixia_libs.IxNet.IxNet import IP_VERSION_4 -from yardstick.network_services.libs.ixia_libs.IxNet.IxNet import IP_VERSION_6 +from yardstick.network_services.libs.ixia_libs.IxNet import IxNet + -UPLINK = "uplink" -DOWNLINK = "downlink" +UPLINK = 'uplink' +DOWNLINK = 'downlink' class TestIxNextgen(unittest.TestCase): + def setUp(self): + self.ixnet = mock.Mock() + self.ixnet.execute = mock.Mock() + def test___init__(self): - ixnet_gen = IxNextgen() + ixnet_gen = IxNet.IxNextgen() + self.assertIsNone(ixnet_gen.ixnet) + self.assertTrue(isinstance(ixnet_gen._objRefs, dict)) + self.assertIsNone(ixnet_gen._cfg) + self.assertIsNone(ixnet_gen._params) self.assertIsNone(ixnet_gen._bidir) + def test___init__ixnet(self): + ixnet_gen = IxNet.IxNextgen(self.ixnet) + self.assertIsNotNone(ixnet_gen.ixnet) + @mock.patch.object(IxNetwork, 'IxNet') def test_connect(self, mock_ixnet): - ixnet_instance = mock.Mock() - mock_ixnet.return_value = ixnet_instance - ixnet_gen = IxNextgen() + mock_ixnet.return_value = self.ixnet + ixnet_gen = IxNet.IxNextgen() with mock.patch.object(ixnet_gen, 'get_config') as mock_config: mock_config.return_value = {'machine': 'machine_fake', 'port': 'port_fake', 'version': 12345} - ixnet_gen._connect(mock.ANY) + ixnet_gen.connect(mock.ANY) - ixnet_instance.connect.assert_called_once_with( + self.ixnet.connect.assert_called_once_with( 'machine_fake', '-port', 'port_fake', '-version', '12345') mock_config.assert_called_once() - def test_clear_ixia_config(self): - ixnet = mock.MagicMock() - ixnet.execute = mock.Mock() - - ixnet_gen = IxNextgen(ixnet) - - result = ixnet_gen.clear_ixia_config() - self.assertIsNone(result) - self.assertEqual(ixnet.execute.call_count, 1) - - def test_load_ixia_profile(self): - ixnet = mock.MagicMock() - ixnet.execute = mock.Mock() + def test_connect_invalid_config_no_machine(self): + ixnet_gen = IxNet.IxNextgen(self.ixnet) + ixnet_gen.get_config = mock.Mock(return_value={ + 'port': 'port_fake', + 'version': '12345'}) + self.assertRaises(KeyError, ixnet_gen.connect, mock.ANY) + self.ixnet.connect.assert_not_called() + + def test_connect_invalid_config_no_port(self): + ixnet_gen = IxNet.IxNextgen(self.ixnet) + ixnet_gen.get_config = mock.Mock(return_value={ + 'machine': 'machine_fake', + 'version': '12345'}) + self.assertRaises(KeyError, ixnet_gen.connect, mock.ANY) + self.ixnet.connect.assert_not_called() + + def test_connect_invalid_config_no_version(self): + ixnet_gen = IxNet.IxNextgen(self.ixnet) + ixnet_gen.get_config = mock.Mock(return_value={ + 'machine': 'machine_fake', + 'port': 'port_fake'}) + self.assertRaises(KeyError, ixnet_gen.connect, mock.ANY) + self.ixnet.connect.assert_not_called() + + def test_connect_no_config(self): + ixnet_gen = IxNet.IxNextgen(self.ixnet) + ixnet_gen.get_config = mock.Mock(return_value={}) + self.assertRaises(KeyError, ixnet_gen.connect, mock.ANY) + self.ixnet.connect.assert_not_called() + + def test_clear_config(self): + ixnet_gen = IxNet.IxNextgen(self.ixnet) + ixnet_gen.clear_config() + self.ixnet.execute.assert_called_once_with('newConfig') + + def test_assign_ports_2_ports(self): + self.ixnet.getAttribute.side_effect = ['up', 'down'] - ixnet_gen = IxNextgen(ixnet) - - result = ixnet_gen.load_ixia_profile({}) - self.assertIsNone(result) - self.assertEqual(ixnet.execute.call_count, 1) + config = { + 'chassis': '1.1.1.1', + 'cards': ['1', '2'], + 'ports': ['2', '2'], + } - def test_load_ixia_config(self): - ixnet = mock.MagicMock() - ixnet.execute = mock.Mock() + ixnet_gen = IxNet.IxNextgen(self.ixnet) + ixnet_gen._cfg = config - ixnet_gen = IxNextgen(ixnet) + self.assertIsNone(ixnet_gen.assign_ports()) - result = ixnet_gen.ix_load_config({}) - self.assertIsNone(result) - self.assertEqual(ixnet.execute.call_count, 2) + self.assertEqual(self.ixnet.execute.call_count, 2) + self.assertEqual(self.ixnet.commit.call_count, 4) + self.assertEqual(self.ixnet.getAttribute.call_count, 2) - @mock.patch('yardstick.network_services.libs.ixia_libs.IxNet.IxNet.log') - def test_ix_assign_ports(self, mock_logger): - ixnet = mock.MagicMock() - ixnet.getList.return_value = [0, 1] - ixnet.getAttribute.side_effect = ['up', 'down'] + @mock.patch.object(IxNet, 'log') + def test_assign_ports_port_down(self, mock_log): + self.ixnet.getAttribute.return_value = 'down' config = { 'chassis': '1.1.1.1', 'cards': ['1', '2'], - 'ports': ['2', '2'], + 'ports': ['3', '4'], } - - ixnet_gen = IxNextgen(ixnet) + ixnet_gen = IxNet.IxNextgen(self.ixnet) ixnet_gen._cfg = config - - result = ixnet_gen.ix_assign_ports() - self.assertIsNone(result) - self.assertEqual(ixnet.execute.call_count, 1) - self.assertEqual(ixnet.commit.call_count, 1) - self.assertEqual(ixnet.getAttribute.call_count, 2) - self.assertEqual(mock_logger.error.call_count, 1) + ixnet_gen.assign_ports() + mock_log.warning.assert_called() + + def test_assign_ports_no_config(self): + ixnet_gen = IxNet.IxNextgen(self.ixnet) + ixnet_gen._cfg = {} + + self.assertRaises(KeyError, ixnet_gen.assign_ports) + + def test__create_traffic_item(self): + ixnet_gen = IxNet.IxNextgen(self.ixnet) + self.ixnet.getRoot.return_value = 'rootyrootroot' + self.ixnet.add.return_value = 'my_new_traffic_item' + self.ixnet.remapIds.return_value = ['my_traffic_item_id'] + + ixnet_gen._create_traffic_item() + + self.ixnet.add.assert_called_once_with( + 'rootyrootroot/traffic', 'trafficItem') + self.ixnet.setMultiAttribute.assert_called_once_with( + 'my_new_traffic_item', '-name', 'RFC2544', '-trafficType', 'raw') + self.assertEqual(2, self.ixnet.commit.call_count) + self.ixnet.remapIds.assert_called_once_with('my_new_traffic_item') + self.ixnet.setAttribute('my_traffic_item_id/tracking', + '-trackBy', 'trafficGroupId0') + + def test__create_flow_groups(self): + ixnet_gen = IxNet.IxNextgen(self.ixnet) + self.ixnet.getRoot.return_value = 'rootyrootroot' + ixnet_gen.ixnet.getList.side_effect = [['traffic_item'], ['1', '2']] + ixnet_gen.ixnet.add.side_effect = ['endp1', 'endp2'] + ixnet_gen._create_flow_groups() + ixnet_gen.ixnet.add.assert_has_calls([ + mock.call('traffic_item', 'endpointSet'), + mock.call('traffic_item', 'endpointSet')]) + ixnet_gen.ixnet.setMultiAttribute.asser_has_calls([ + mock.call('endp1', '-sources', ['1/protocols'], '-destinations', + ['2/protocols']), + mock.call('endp2', '-sources', ['2/protocols'], '-destinations', + ['1/protocols'])]) + + def test__append_protocol_to_stack(self): + ixnet_gen = IxNet.IxNextgen(self.ixnet) + self.ixnet.getRoot.return_value = 'my_root' + + ixnet_gen._append_procotol_to_stack('my_protocol', 'prev_element') + self.ixnet.execute.assert_called_with( + 'append', 'prev_element', + 'my_root/traffic/protocolTemplate:"my_protocol"') + + def test__setup_config_elements(self): + ixnet_gen = IxNet.IxNextgen(self.ixnet) + ixnet_gen.ixnet.getRoot.return_value = 'root_element' + ixnet_gen.ixnet.getList.side_effect = [['traffic_item'], + ['cfg_element']] + with mock.patch.object(ixnet_gen, '_append_procotol_to_stack') as \ + mock_append_proto: + ixnet_gen._setup_config_elements() + mock_append_proto.assert_has_calls([ + mock.call(IxNet.PROTO_UDP, 'cfg_element/stack:"ethernet-1"'), + mock.call(IxNet.PROTO_IPV4, 'cfg_element/stack:"ethernet-1"')]) + ixnet_gen.ixnet.setAttribute.assert_has_calls([ + mock.call('cfg_element/frameRateDistribution', '-portDistribution', + 'splitRateEvenly'), + mock.call('cfg_element/frameRateDistribution', + '-streamDistribution', 'splitRateEvenly')]) + + @mock.patch.object(IxNet.IxNextgen, '_create_traffic_item') + @mock.patch.object(IxNet.IxNextgen, '_create_flow_groups') + @mock.patch.object(IxNet.IxNextgen, '_setup_config_elements') + def test_create_traffic_model(self, mock__setup_config_elements, + mock__create_flow_groups, + mock__create_traffic_item): + ixnet_gen = IxNet.IxNextgen(self.ixnet) + + ixnet_gen.create_traffic_model() + mock__create_traffic_item.assert_called_once() + mock__create_flow_groups.assert_called_once() + mock__setup_config_elements.assert_called_once() def test_ix_update_frame(self): static_traffic_params = { @@ -185,11 +286,10 @@ class TestIxNextgen(unittest.TestCase): } } - ixnet = mock.MagicMock() - ixnet.remapIds.return_value = ["0"] - ixnet.setMultiAttribute.return_value = [1] - ixnet.commit.return_value = [1] - ixnet.getList.side_effect = [ + self.ixnet.remapIds.return_value = ["0"] + self.ixnet.setMultiAttribute.return_value = [1] + self.ixnet.commit.return_value = [1] + self.ixnet.getList.side_effect = [ [1], [1], [1], @@ -199,76 +299,77 @@ class TestIxNextgen(unittest.TestCase): ], ] - ixnet_gen = IxNextgen(ixnet) + ixnet_gen = IxNet.IxNextgen(self.ixnet) result = ixnet_gen.ix_update_frame(static_traffic_params) self.assertIsNone(result) - self.assertEqual(ixnet.setMultiAttribute.call_count, 7) - self.assertEqual(ixnet.commit.call_count, 2) + self.assertEqual(self.ixnet.setMultiAttribute.call_count, 7) + self.assertEqual(self.ixnet.commit.call_count, 2) - def test_ix_update_udp(self): - ixnet = mock.MagicMock() + # NOTE(ralonsoh): to be updated in next patchset + def test_update_ether_multi_attribute(self): + pass + + # NOTE(ralonsoh): to be updated in next patchset + def test_update_ether_multi_attributes(self): + pass + + # NOTE(ralonsoh): to be updated in next patchset + def test_update_ether(self): + pass - ixnet_gen = IxNextgen(ixnet) + # NOTE(ralonsoh): to be updated in next patchset + def test_ix_update_udp(self): + ixnet_gen = IxNet.IxNextgen(self.ixnet) result = ixnet_gen.ix_update_udp({}) self.assertIsNone(result) + # NOTE(ralonsoh): to be updated in next patchset def test_ix_update_tcp(self): - ixnet = mock.MagicMock() - ixnet_gen = IxNextgen(ixnet) + ixnet_gen = IxNet.IxNextgen(self.ixnet) result = ixnet_gen.ix_update_tcp({}) self.assertIsNone(result) + # NOTE(ralonsoh): to be updated in next patchset def test_ix_start_traffic(self): - ixnet = mock.MagicMock() - ixnet.getList.return_value = [0] - ixnet.getAttribute.return_value = 'down' + self.ixnet.getList.return_value = [0] + self.ixnet.getAttribute.return_value = 'down' - ixnet_gen = IxNextgen(ixnet) + ixnet_gen = IxNet.IxNextgen(self.ixnet) result = ixnet_gen.ix_start_traffic() self.assertIsNone(result) - self.assertEqual(ixnet.getList.call_count, 1) - self.assertEqual(ixnet.execute.call_count, 3) + self.ixnet.getList.assert_called_once() + self.assertEqual(self.ixnet.execute.call_count, 3) + # NOTE(ralonsoh): to be updated in next patchset def test_ix_stop_traffic(self): - ixnet = mock.MagicMock() - ixnet.getList.return_value = [0] + self.ixnet.getList.return_value = [0] - ixnet_gen = IxNextgen(ixnet) + ixnet_gen = IxNet.IxNextgen(self.ixnet) result = ixnet_gen.ix_stop_traffic() self.assertIsNone(result) - self.assertEqual(ixnet.getList.call_count, 1) - self.assertEqual(ixnet.execute.call_count, 1) + self.ixnet.getList.assert_called_once() + self.ixnet.execute.assert_called_once() - def test_ix_get_statistics(self): - ixnet = mock.MagicMock() - ixnet.execute.return_value = "" - ixnet.getList.side_effect = [ - [ - '::ixNet::OBJ-/statistics/view:"Traffic Item Statistics"', - '::ixNet::OBJ-/statistics/view:"Port Statistics"', - ], - [ - '::ixNet::OBJ-/statistics/view:"Flow Statistics"', - ], - ] + # NOTE(ralonsoh): to be updated in next patchset + def test_build_stats_map(self): + pass - ixnet_gen = IxNextgen(ixnet) + # NOTE(ralonsoh): to be updated in next patchset + def test_get_statistics(self): + self.ixnet.execute.return_value = "" - result = ixnet_gen.ix_get_statistics() - self.assertIsNotNone(result) - self.assertEqual(ixnet.getList.call_count, 1) - self.assertEqual(ixnet.execute.call_count, 20) + ixnet_gen = IxNet.IxNextgen(self.ixnet) - def test_find_view_obj_no_where(self): - views = ['here', 'there', 'everywhere'] - result = IxNextgen.find_view_obj('no_where', views) - self.assertEqual(result, '') + result = ixnet_gen.get_statistics() + self.assertIsNotNone(result) + self.assertEqual(self.ixnet.execute.call_count, 12) + # NOTE(ralonsoh): to be updated in next patchset def test_add_ip_header_v4(self): static_traffic_params = { "uplink_0": { @@ -354,18 +455,18 @@ class TestIxNextgen(unittest.TestCase): } } - ixnet = mock.MagicMock() - ixnet.remapIds.return_value = ["0"] - ixnet.setMultiAttribute.return_value = [1] - ixnet.commit.return_value = [1] - ixnet.getList.side_effect = [[1], [0], [0], ["srcIp", "dstIp"]] + self.ixnet.remapIds.return_value = ["0"] + self.ixnet.setMultiAttribute.return_value = [1] + self.ixnet.commit.return_value = [1] + self.ixnet.getList.side_effect = [[1], [0], [0], ["srcIp", "dstIp"]] - ixnet_gen = IxNextgen(ixnet) + ixnet_gen = IxNet.IxNextgen(self.ixnet) - result = ixnet_gen.add_ip_header(static_traffic_params, IP_VERSION_4) + result = ixnet_gen.add_ip_header(static_traffic_params, + IxNet.IP_VERSION_4) self.assertIsNone(result) - self.assertGreater(ixnet.setMultiAttribute.call_count, 0) - self.assertEqual(ixnet.commit.call_count, 1) + self.ixnet.setMultiAttribute.assert_called() + self.ixnet.commit.assert_called_once() def test_add_ip_header_v4_nothing_to_do(self): static_traffic_params = { @@ -452,18 +553,18 @@ class TestIxNextgen(unittest.TestCase): } } - ixnet = mock.MagicMock() - ixnet.remapIds.return_value = ["0"] - ixnet.setMultiAttribute.return_value = [1] - ixnet.commit.return_value = [1] - ixnet.getList.side_effect = [[1], [0, 1], [0], ["srcIp", "dstIp"]] + self.ixnet.remapIds.return_value = ["0"] + self.ixnet.setMultiAttribute.return_value = [1] + self.ixnet.commit.return_value = [1] + self.ixnet.getList.side_effect = [[1], [0, 1], [0], ["srcIp", "dstIp"]] - ixnet_gen = IxNextgen(ixnet) + ixnet_gen = IxNet.IxNextgen(self.ixnet) - result = ixnet_gen.add_ip_header(static_traffic_params, IP_VERSION_4) + result = ixnet_gen.add_ip_header(static_traffic_params, + IxNet.IP_VERSION_4) self.assertIsNone(result) - self.assertGreater(ixnet.setMultiAttribute.call_count, 0) - self.assertEqual(ixnet.commit.call_count, 1) + self.ixnet.setMultiAttribute.assert_called() + self.ixnet.commit.assert_called_once() def test_add_ip_header_v6(self): static_traffic_profile = { @@ -535,18 +636,18 @@ class TestIxNextgen(unittest.TestCase): } } - ixnet = mock.MagicMock() - ixnet.getList.side_effect = [[1], [1], [1], ["srcIp", "dstIp"]] - ixnet.remapIds.return_value = ["0"] - ixnet.setMultiAttribute.return_value = [1] - ixnet.commit.return_value = [1] + self.ixnet.getList.side_effect = [[1], [1], [1], ["srcIp", "dstIp"]] + self.ixnet.remapIds.return_value = ["0"] + self.ixnet.setMultiAttribute.return_value = [1] + self.ixnet.commit.return_value = [1] - ixnet_gen = IxNextgen(ixnet) + ixnet_gen = IxNet.IxNextgen(self.ixnet) - result = ixnet_gen.add_ip_header(static_traffic_profile, IP_VERSION_6) + result = ixnet_gen.add_ip_header(static_traffic_profile, + IxNet.IP_VERSION_6) self.assertIsNone(result) - self.assertGreater(ixnet.setMultiAttribute.call_count, 0) - self.assertEqual(ixnet.commit.call_count, 1) + self.ixnet.setMultiAttribute.assert_called() + self.ixnet.commit.assert_called_once() def test_add_ip_header_v6_nothing_to_do(self): static_traffic_params = { @@ -617,21 +718,21 @@ class TestIxNextgen(unittest.TestCase): } } - ixnet = mock.MagicMock() - ixnet.getList.side_effect = [[1], [0, 1], [1], ["srcIP", "dstIP"]] - ixnet.remapIds.return_value = ["0"] - ixnet.setMultiAttribute.return_value = [1] - ixnet.commit.return_value = [1] + self.ixnet.getList.side_effect = [[1], [0, 1], [1], ["srcIP", "dstIP"]] + self.ixnet.remapIds.return_value = ["0"] + self.ixnet.setMultiAttribute.return_value = [1] + self.ixnet.commit.return_value = [1] - ixnet_gen = IxNextgen(ixnet) + ixnet_gen = IxNet.IxNextgen(self.ixnet) - result = ixnet_gen.add_ip_header(static_traffic_params, IP_VERSION_6) + result = ixnet_gen.add_ip_header(static_traffic_params, + IxNet.IP_VERSION_6) self.assertIsNone(result) - self.assertEqual(ixnet.setMultiAttribute.call_count, 0) + self.ixnet.setMultiAttribute.assert_not_called() def test_set_random_ip_multi_attributes_bad_ip_version(self): bad_ip_version = object() - ixnet_gen = IxNextgen(mock.Mock()) + ixnet_gen = IxNet.IxNextgen(mock.Mock()) with self.assertRaises(ValueError): ixnet_gen.set_random_ip_multi_attributes( mock.Mock(), bad_ip_version, mock.Mock(), mock.Mock()) @@ -676,8 +777,8 @@ class TestIxNextgen(unittest.TestCase): 'bidir': True, } - result = IxNextgen.get_config(tg_cfg) - self.assertDictEqual(result, expected) + result = IxNet.IxNextgen.get_config(tg_cfg) + self.assertEqual(result, expected) def test_ix_update_ether(self): static_traffic_params = { @@ -763,10 +864,9 @@ class TestIxNextgen(unittest.TestCase): } } - ixnet = mock.MagicMock() - ixnet.setMultiAttribute.return_value = [1] - ixnet.commit.return_value = [1] - ixnet.getList.side_effect = [ + self.ixnet.setMultiAttribute.return_value = [1] + self.ixnet.commit.return_value = [1] + self.ixnet.getList.side_effect = [ [1], [1], [1], @@ -776,11 +876,11 @@ class TestIxNextgen(unittest.TestCase): ], ] - ixnet_gen = IxNextgen(ixnet) + ixnet_gen = IxNet.IxNextgen(self.ixnet) result = ixnet_gen.ix_update_ether(static_traffic_params) self.assertIsNone(result) - self.assertGreater(ixnet.setMultiAttribute.call_count, 0) + self.ixnet.setMultiAttribute.assert_called() def test_ix_update_ether_nothing_to_do(self): static_traffic_params = { @@ -854,10 +954,9 @@ class TestIxNextgen(unittest.TestCase): } } - ixnet = mock.MagicMock() - ixnet.setMultiAttribute.return_value = [1] - ixnet.commit.return_value = [1] - ixnet.getList.side_effect = [ + self.ixnet.setMultiAttribute.return_value = [1] + self.ixnet.commit.return_value = [1] + self.ixnet.getList.side_effect = [ [1], [1], [1], @@ -867,8 +966,8 @@ class TestIxNextgen(unittest.TestCase): ], ] - ixnet_gen = IxNextgen(ixnet) + ixnet_gen = IxNet.IxNextgen(self.ixnet) result = ixnet_gen.ix_update_ether(static_traffic_params) self.assertIsNone(result) - self.assertEqual(ixnet.setMultiAttribute.call_count, 0) + self.ixnet.setMultiAttribute.assert_not_called() -- cgit 1.2.3-korg