aboutsummaryrefslogtreecommitdiffstats
AgeCommit message (Expand)AuthorFilesLines
2018-06-08Add DPDK IMIX tests to trendingTibor Frank1-1/+4
2018-06-07CSIT-1122: Add link bonding tests for x710 to the TrendingTibor Frank2-0/+159
2018-06-07CSIT-1121: Add "Get DPDK version" KW to DPDK testsTibor Frank3-5/+3
2018-06-06Update of VPP_STABLE_VER filesJan Gelety2-2/+2
2018-06-06HC Tests: reenable NSH plugin (CSIT-994)Marek Gradzki6-26/+16
2018-06-05CSIT-1115: Add dpdk mrr testsTibor Frank4-0/+875
2018-06-05Trending: fixTibor Frank2-2/+2
2018-06-05Trending: FixTibor Frank1-1/+1
2018-06-04CSIT-1110: Print NameError to reduce confusionVratko Polak3-9/+9
2018-06-04CSIT-1112: Add link bonding tests to the TrendingTibor Frank5-32/+196
2018-06-04Add DPDK MRR weekly into bootstrapPeter Mikus1-0/+8
2018-06-01VPP link bonding - lacp modeJan Gelety15-32/+3029
2018-06-01HC Tests: disable failing ACL ODL tests (HC2VPP-337)Marek Gradzki1-0/+18
2018-05-31CSIT-1055: Pkg download script to use package system not curlPeter Mikus2-95/+154
2018-05-31HC Tests: use ip-prefix in NAT mapping entries (HC2VPP-325)Marek Gradzki1-8/+8
2018-05-31Add s17-t33-tg1 into ansible/pxePeter Mikus3-6/+11
2018-05-31DPDK link bonding: xor modeJan Gelety14-14/+3011
2018-05-30CSIT-1068 Update testbed-setup for new server onboardingPeter Mikus3-33/+113
2018-05-30CSIT-1070 Update Ansible structurePeter Mikus83-334/+1047
2018-05-29Update of VPP_STABLE_VER filesJan Gelety2-2/+2
2018-05-29CSIT-1089: Add SRv6 MRR tests to trendingTibor Frank5-13/+165
2018-05-29CSIT-1106: Unify the anomaly detection (plots, dashboard)Tibor Frank4-150/+130
2018-05-25CSIT-1104: Trending: Speed-up plots generationTibor Frank15-787/+401
2018-05-25HC Tests: mark VRF assignment tests as failing (HC2VPP-331)Marek Gradzki2-0/+22
2018-05-25HC Tests: mark unnumbered interface tests as failing (HC2VPP-330)Marek Gradzki2-0/+16
2018-05-24FIX: Trending dashboardTibor Frank1-26/+18
2018-05-24CSIT-1101: Optimize input data processingTibor Frank5-105/+258
2018-05-24Add defaultbranch to .gitreviewVratko Polak1-1/+1
2018-05-23CSIT-1087: Add SRv6 MRR testsTibor Frank14-19/+1561
2018-05-23Add dot1q into L2-perf triggersPeter Mikus1-10/+11
2018-05-22CSIT-986: Improve formatting of MDR documentationVratko Polak1-95/+95
2018-05-19start-testcase-DMM file additionsharath1-0/+542
2018-05-18CSIT-986: MDR rst documentationVratko Polak9-0/+23639
2018-05-17HC tests: fix 'Archive Honeycomb logs' KW docsMarek Gradzki1-1/+1
2018-05-17HC tests: fix log archiveMarek Gradzki1-1/+1
2018-05-17HC Tests: fix CPU layout retrieval in the HC perf jobMarek Gradzki1-0/+1
2018-05-16HC Tests: adapt NAT tests to ietf-nat@2018-02-23.yang (CSIT-1086)Marek Gradzki5-9/+9
2018-05-16Trending: menuTibor Frank3-15/+38
2018-05-16CSIT-1082: Trending: Display date on the x-axisTibor Frank2-26/+64
2018-05-16CSIT-992: Fix intermediate phases MDR parameterVratko Polak3-14/+21
2018-05-16HC tests: archive ODL logs (CSIT-1031)Marek Gradzki5-7/+72
2018-05-16CSIT-1082: Trending: Display date on the x-axisTibor Frank2-36/+63
2018-05-15HC tests: archive JOB artifacts to logs.fd.ioMarek Gradzki5-26/+65
2018-05-15HC tests: disable NSH plugin (CSIT-994)Marek Gradzki6-16/+26
2018-05-14CSIT-1078: Optimize input data files download and processingTibor Frank13-2917/+14
2018-05-14CSIT-1036 Expose option to install DKMS in containerPeter Mikus16-9/+18
2018-05-14Update of VPP_STABLE_VER files and DPDK_STABLE_VER fileJan Gelety3-3/+3
2018-05-14CSIT-1078: Optimize input data files download and processingTibor Frank1-2/+2
2018-05-14CSIT-1078: Optimize input data files download and processingTibor Frank10-451/+256
2018-05-12CSIT-1079 Add multiple mount dirs into containerPeter Mikus2-56/+61
pan class="n">bd_id) # Set up all interfaces for i in cls.pg_interfaces: i.admin_up() except Exception: super(TestL2fib, cls).tearDownClass() raise def setUp(self): super(TestL2fib, self).setUp() self.reset_packet_infos() def tearDown(self): """ Show various debug prints after each test. """ super(TestL2fib, self).tearDown() if not self.vpp_dead: self.logger.info(self.vapi.ppcli("show l2fib verbose")) for bd_id in self.n_brs: self.logger.info(self.vapi.ppcli("show bridge-domain %s detail" % bd_id)) def create_hosts(self, n_hosts_per_if, subnet): """ Create required number of host MAC addresses and distribute them among interfaces. Create host IPv4 address for every host MAC address. :param int n_hosts_per_if: Number of per interface hosts to create MAC/IPv4 addresses for. """ hosts = dict() for pg_if in self.pg_interfaces: swif = pg_if.sw_if_index def mac(j): return "00:00:%02x:ff:%02x:%02x" % (subnet, swif, j) def ip(j): return "172.%02u.1%02x.%u" % (subnet, swif, j) def h(j): return Host(mac(j), ip(j)) hosts[swif] = [h(j) for j in range(n_hosts_per_if)] return hosts def split_hosts(self, hosts, n): splits = dict() for pg_if in self.pg_interfaces: swif = pg_if.sw_if_index splits[swif] = hosts[swif][:n] hosts[swif] = hosts[swif][n:] return splits def learn_hosts(self, bd_id, hosts): """ Create and send per interface L2 MAC broadcast packet stream to let the bridge domain learn these MAC addresses. :param int bd_id: BD to teach :param dict hosts: dict of hosts per interface """ self.vapi.bridge_flags(bd_id=bd_id, is_set=1, flags=1) ifs = [self.pg_interfaces[i] for i in self.bd_ifs(bd_id)] for pg_if in ifs: swif = pg_if.sw_if_index packets = [Ether(dst="ff:ff:ff:ff:ff:ff", src=host.mac) for host in hosts[swif]] pg_if.add_stream(packets) self.logger.info("Sending broadcast eth frames for MAC learning") self.pg_start() def config_l2_fib_entries(self, bd_id, hosts): """ Config required number of L2 FIB entries. :param int bd_id: BD's id :param int count: Number of L2 FIB entries to be created. :param int start: Starting index of the host list. (Default value = 0) """ ifs = [self.pg_interfaces[i] for i in self.bd_ifs(bd_id)] for pg_if in ifs: swif = pg_if.sw_if_index for host in hosts[swif]: self.vapi.l2fib_add_del( mac_pton(host.mac), bd_id, swif, static_mac=1) def delete_l2_fib_entry(self, bd_id, hosts): """ Delete required number of L2 FIB entries. :param int count: Number of L2 FIB entries to be created. """ ifs = [self.pg_interfaces[i] for i in self.bd_ifs(bd_id)] for pg_if in ifs: swif = pg_if.sw_if_index for host in hosts[swif]: self.vapi.l2fib_add_del( mac_pton(host.mac), bd_id, swif, is_add=0) def flush_int(self, swif, learned_hosts): """ Flush swif L2 FIB entries. :param int swif: sw if index. """ flushed = dict() self.vapi.l2fib_flush_int(swif) flushed[swif] = learned_hosts[swif] learned_hosts[swif] = [] return flushed def flush_bd(self, bd_id, learned_hosts): """ Flush bd_id L2 FIB entries. :param int bd_id: Bridge Domain id. """ self.vapi.l2fib_flush_bd(bd_id) flushed = dict() ifs = [self.pg_interfaces[i] for i in self.bd_ifs(bd_id)] for pg_if in ifs: swif = pg_if.sw_if_index flushed[swif] = learned_hosts[swif] learned_hosts[swif] = [] return flushed def flush_all(self): """ Flush All L2 FIB entries. """ self.vapi.l2fib_flush_all() def create_stream(self, src_if, packet_sizes, if_src_hosts, if_dst_hosts): """ Create input packet stream for defined interface using hosts or deleted_hosts list. :param object src_if: Interface to create packet stream for. :param list packet_sizes: List of required packet sizes. :param boolean deleted: Set to True if deleted_hosts list required. :return: Stream of packets. """ src_hosts = if_src_hosts[src_if.sw_if_index] if not src_hosts: return [] pkts = [] for dst_if in self.flows[src_if]: dst_swif = dst_if.sw_if_index if dst_swif not in if_dst_hosts: continue dst_hosts = if_dst_hosts[dst_swif] for dst_host in dst_hosts: src_host = random.choice(src_hosts) pkt_info = self.create_packet_info(src_if, dst_if) payload = self.info_to_payload(pkt_info) p = (Ether(dst=dst_host.mac, src=src_host.mac) / IP(src=src_host.ip4, dst=dst_host.ip4) / UDP(sport=1234, dport=1234) / Raw(payload)) pkt_info.data = p.copy() size = random.choice(packet_sizes) self.extend_packet(p, size) pkts.append(p) return pkts def verify_capture(self, pg_if, capture): """ Verify captured input packet stream for defined interface. :param object pg_if: Interface to verify captured packet stream for. :param list capture: Captured packet stream. """ last_info = dict() for i in self.pg_interfaces: last_info[i.sw_if_index] = None dst_sw_if_index = pg_if.sw_if_index for packet in capture: payload_info = self.payload_to_info(packet[Raw]) try: ip = packet[IP] udp = packet[UDP] packet_index = payload_info.index self.assertEqual(payload_info.dst, dst_sw_if_index) self.logger.debug("Got packet on port %s: src=%u (id=%u)" % (pg_if.name, payload_info.src, packet_index)) next_info = self.get_next_packet_info_for_interface2( payload_info.src, dst_sw_if_index, last_info[payload_info.src]) last_info[payload_info.src] = next_info self.assertTrue(next_info is not None) self.assertEqual(packet_index, next_info.index) saved_packet = next_info.data # Check standard fields self.assertEqual(ip.src, saved_packet[IP].src) self.assertEqual(ip.dst, saved_packet[IP].dst) self.assertEqual(udp.sport, saved_packet[UDP].sport) self.assertEqual(udp.dport, saved_packet[UDP].dport) except: self.logger.error(ppp("Unexpected or invalid packet:", packet)) raise for i in self.pg_interfaces: remaining_packet = self.get_next_packet_info_for_interface2( i, dst_sw_if_index, last_info[i.sw_if_index]) self.assertTrue( remaining_packet is None, "Port %u: Packet expected from source %u didn't arrive" % (dst_sw_if_index, i.sw_if_index)) def run_verify_test(self, bd_id, src_hosts, dst_hosts): # Test # Create incoming packet streams for packet-generator interfaces self.reset_packet_infos() ifs = [self.pg_interfaces[i] for i in self.bd_ifs(bd_id)] for i in ifs: pkts = self.create_stream( i, self.pg_if_packet_sizes, if_src_hosts=src_hosts, if_dst_hosts=dst_hosts) if pkts: i.add_stream(pkts) self.vapi.bridge_flags(bd_id=bd_id, is_set=0, flags=1) # Enable packet capture and start packet sending self.pg_enable_capture(ifs) self.pg_start() # Verify # Verify outgoing packet streams per packet-generator interface for i in ifs: if not dst_hosts[i.sw_if_index]: continue capture = i.get_capture() self.logger.info("Verifying capture on interface %s" % i.name) self.verify_capture(i, capture) def run_verify_negat_test(self, bd_id, src_hosts, dst_hosts): # Test # Create incoming packet streams for packet-generator interfaces for # deleted MAC addresses self.reset_packet_infos() ifs = [self.pg_interfaces[i] for i in self.bd_ifs(bd_id)] for i in ifs: pkts = self.create_stream( i, self.pg_if_packet_sizes, if_src_hosts=src_hosts, if_dst_hosts=dst_hosts) if pkts: i.add_stream(pkts) self.vapi.bridge_flags(bd_id=bd_id, is_set=0, flags=1) # Enable packet capture and start packet sending self.pg_enable_capture(ifs) self.pg_start() # Verify # Verify outgoing packet streams per packet-generator interface timeout = 1 for i in ifs: i.get_capture(0, timeout=timeout) i.assert_nothing_captured(remark="outgoing interface") timeout = 0.1 def test_l2_fib_program100(self): """ L2 FIB - program 100 MACs """ bd_id = 1 hosts = self.create_hosts(100, subnet=17) self.config_l2_fib_entries(bd_id, hosts) self.run_verify_test(bd_id, hosts, hosts) def test_l2_fib_program100_delete12(self): """ L2 FIB - program 100, delete 12 MACs """ bd_id = 1 hosts = self.create_hosts(100, subnet=17) self.config_l2_fib_entries(bd_id, hosts) del_hosts = self.split_hosts(hosts, 12) self.delete_l2_fib_entry(bd_id, del_hosts) self.run_verify_test(bd_id, hosts, hosts) self.run_verify_negat_test(bd_id, hosts, del_hosts) def test_l2_fib_program100_add100(self): """ L2 FIB - program 100, add 100 MACs """ bd_id = 1 hosts = self.create_hosts(100, subnet=17) self.config_l2_fib_entries(bd_id, hosts) hosts2 = self.create_hosts(100, subnet=22) self.config_l2_fib_entries(bd_id, hosts2) self.run_verify_test(bd_id, hosts, hosts2) def test_l2_fib_program10_learn10(self): """ L2 FIB - program 10 MACs, learn 10 """ hosts = self.create_hosts(20, subnet=35) lhosts = self.split_hosts(hosts, 10) bd1 = 1 bd2 = 2 self.learn_hosts(bd1, lhosts) self.learn_hosts(bd2, lhosts) self.config_l2_fib_entries(bd1, hosts) self.config_l2_fib_entries(bd2, hosts) self.run_verify_test(bd1, lhosts, hosts) self.run_verify_test(bd2, lhosts, hosts) def test_l2_fib_flush_int(self): """ L2 FIB - flush interface """ hosts = self.create_hosts(20, subnet=36) lhosts = self.split_hosts(hosts, 10) bd1 = 1 self.learn_hosts(bd1, lhosts) self.config_l2_fib_entries(bd1, hosts) self.run_verify_test(bd1, lhosts, hosts) flushed = self.flush_int(self.pg_interfaces[0].sw_if_index, lhosts) self.run_verify_test(bd1, hosts, lhosts) self.run_verify_negat_test(bd1, hosts, flushed) def test_l2_fib_flush_bd(self): """ L2 FIB - flush BD """ hosts = self.create_hosts(20, subnet=37) lhosts = self.split_hosts(hosts, 10) bd1 = 1 self.learn_hosts(bd1, lhosts) self.config_l2_fib_entries(bd1, hosts) self.run_verify_test(bd1, lhosts, hosts) flushed = self.flush_bd(bd1, lhosts) self.run_verify_negat_test(bd1, hosts, flushed) def test_l2_fib_flush_all(self): """ L2 FIB - flush all """ hosts = self.create_hosts(20, subnet=38) lhosts = self.split_hosts(hosts, 10) bd1 = 1 bd2 = 2 self.learn_hosts(bd1, lhosts) self.learn_hosts(bd2, lhosts) self.config_l2_fib_entries(bd1, hosts) self.config_l2_fib_entries(bd2, hosts) self.run_verify_test(bd1, hosts, lhosts) self.run_verify_test(bd2, hosts, lhosts) self.flush_all() self.run_verify_negat_test(bd1, hosts, lhosts) self.run_verify_negat_test(bd2, hosts, lhosts) def test_l2_fib_mac_learn_evs(self): """ L2 FIB - mac learning events """ bd1 = 1 hosts = self.create_hosts(10, subnet=39) self.vapi.want_l2_macs_events() self.learn_hosts(bd1, hosts) self.sleep(1) self.logger.info(self.vapi.ppcli("show l2fib")) evs = self.vapi.collect_events() learned_macs = { e.mac[i].mac_addr for e in evs for i in range(e.n_macs) if e.mac[i].action == MAC_EVENT_ACTION_ADD} macs = {h.bin_mac for swif in self.bd_ifs(bd1) for h in hosts[self.pg_interfaces[swif].sw_if_index]} self.vapi.want_l2_macs_events(enable_disable=0) self.assertEqual(len(learned_macs ^ macs), 0) def test_l2_fib_macs_learn_max(self): """ L2 FIB - mac learning max macs in event """ bd1 = 1 hosts = self.create_hosts(10, subnet=40) ev_macs = 1 self.vapi.want_l2_macs_events(max_macs_in_event=ev_macs) self.learn_hosts(bd1, hosts) self.sleep(1) self.logger.info(self.vapi.ppcli("show l2fib")) evs = self.vapi.collect_events() self.vapi.want_l2_macs_events(enable_disable=0) self.assertGreater(len(evs), 0) learned_macs = { e.mac[i].mac_addr for e in evs for i in range(e.n_macs) if e.mac[i].action == MAC_EVENT_ACTION_ADD} macs = {h.bin_mac for swif in self.bd_ifs(bd1) for h in hosts[self.pg_interfaces[swif].sw_if_index]} for e in evs: self.assertLess(len(e), ev_macs * 10) self.assertEqual(len(learned_macs ^ macs), 0) if __name__ == '__main__': unittest.main(testRunner=VppTestRunner)