Skip to content

Commit

Permalink
Everflow testbed test implementation.
Browse files Browse the repository at this point in the history
Add implementation of testcase sonic-net#2-8.
  • Loading branch information
oleksandrivantsiv committed Mar 1, 2017
1 parent 0e13a9c commit 2afc19e
Show file tree
Hide file tree
Showing 16 changed files with 459 additions and 26 deletions.
11 changes: 8 additions & 3 deletions ansible/roles/test/files/acstests/everflow_tb_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ def wrapper(*args, **kwargs):

class EverflowTest(BaseTest):
'''
@summary: Everflow tests on testbed topo: t1
@summary: Everflow tests on testbed topo: t1 or t1-lag
'''

GRE_PROTOCOL_NUMBER = 47
Expand Down Expand Up @@ -73,6 +73,7 @@ def setUp(self):
self.session_dscp = int(self.test_params['session_dscp'])
self.src_port = int(float(self.test_params['src_port']))
self.dst_ports = [int(float(p)) for p in self.test_params['dst_ports'].split(",")]
self.expected_dst_mac = self.test_params.get('expected_dst_mac', None)

testutils.add_filter(self.gre_type_filter)

Expand Down Expand Up @@ -121,6 +122,9 @@ def runSendReceiveTest(self, pkt2send, src_port, destination_ports):
if scapy.IP not in scapy_pkt:
return False

if self.expected_dst_mac and scapy_pkt.dst != self.expected_dst_mac:
return False

if scapy_pkt[scapy.IP].src != self.session_src_ip:
return False

Expand All @@ -130,8 +134,9 @@ def runSendReceiveTest(self, pkt2send, src_port, destination_ports):
if scapy_pkt[scapy.IP].ttl != self.session_ttl:
return False

if (scapy_pkt[scapy.IP].tos >> 2) != self.session_dscp:
return False
# TODO: Fanout modifies DSCP. TOS value is olways 0.
#if (scapy_pkt[scapy.IP].tos >> 2) != self.session_dscp:
# return False

payload = str(scapy_pkt[scapy.GRE].payload)[22:]
inner_pkt = scapy.Ether(payload)
Expand Down
11 changes: 11 additions & 0 deletions ansible/roles/test/tasks/everflow_testbed/apply_config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,14 @@
- acl_table.json
- acl_rule_persistent.json

- name: Read port reverse alias mapping.
set_fact:
alias_reverse_map: "{{ lookup('file', 'roles/sonicv2/files/ssw/{{ sonic_hwsku }}/alias_reverse_map.json') | from_json }}"

- name: Generate json files with ACL configuration for tests
template: src={{ tests_location }}/{{ testname }}/acl_table.j2 dest={{ tests_location }}/{{ testname }}/acl_table.json
connection: local

- name: Initialize config test
include: roles/test/tasks/init_config_test.yml

Expand Down Expand Up @@ -41,3 +49,6 @@
- name: Remove all the temporary files created by the test.
include: roles/test/tasks/deinit_config_test.yml

- name: Remove temporary files.
file: path={{ tests_location }}/{{ testname }}/acl_table.json state=absent

Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
[
{
"ACL_TABLE:acl_table_mirror": {
"policy_desc" : "Everflow_ACL_table",
"type" : "MIRROR",
"ports" : "{% for ifname, v in minigraph_neighbors.iteritems() %}{% if "T0" in v.name %}{{"%s" % alias_reverse_map[ifname]}},{% endif %}{% endfor %}"
},
"OP": "SET"
}
]

This file was deleted.

38 changes: 38 additions & 0 deletions ansible/roles/test/tasks/everflow_testbed/get_neighbor_info.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,14 @@
with_items: "{{ minigraph_bgp }}"
when: item['name'] == minigraph_neighbors[dst_port_1]['name']

- name: Get neighbor 1 MAC address.
shell: ip neigh show {{ neighbor_info_1['addr'] }} | awk -F' ' '{print $5}'
register: neighbor_mac_info_1

- name: Initialize neighbor_mac_1 variable.
set_fact:
neighbor_mac_1: "{{ neighbor_mac_info_1.stdout }}"

- name: neighbor 1 info.
debug: msg="{{neighbor_info_1}}"

Expand All @@ -13,5 +21,35 @@
with_items: "{{ minigraph_bgp }}"
when: item['name'] == minigraph_neighbors[dst_port_2]['name']

- name: Get neighbor 2 MAC address.
shell: ip neigh show {{ neighbor_info_2['addr'] }} | awk -F' ' '{print $5}'
register: neighbor_mac_info_2

- name: Initialize neighbor_mac_2 variable.
set_fact:
neighbor_mac_2: "{{ neighbor_mac_info_2.stdout }}"

- name: neighbor 2 info.
debug: msg="{{neighbor_info_2}}"

- name: Get DST port 3 info.
set_fact:
neighbor_info_3: "{{ item }}"
with_items: "{{ minigraph_bgp }}"
when: item['name'] == minigraph_neighbors[dst_port_3]['name']

- name: Get neighbor 3 MAC address.
shell: ip neigh show {{ neighbor_info_3['addr'] }} | awk -F' ' '{print $5}'
register: neighbor_mac_info_3

- name: Initialize neighbor_mac_3 variable.
set_fact:
neighbor_mac_3: "{{ neighbor_mac_info_3.stdout }}"

- name: neighbor 3 info.
debug: msg="{{neighbor_info_3}}"

- name: Define unresolved_nexthop variable
set_fact:
unresolved_nexthop: "20.20.20.100"
unresolved_nexthop_prefix: "20.20.20.0/24"
68 changes: 68 additions & 0 deletions ansible/roles/test/tasks/everflow_testbed/get_port_info.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
- name: Init list with tor ports.
set_fact:
tor_ports: []

- name: Get tor ports
set_fact:
tor_ports: "{{ tor_ports + [item.key] }}"
with_dict: "{{ minigraph_neighbors }}"
when: "'T0' in item.value.name"

- name: Sort tor ports by name.
set_fact:
tor_port: "{{ tor_ports|sort }}"

- name: Print top ports
debug: msg="{{ tor_ports }}"

# src_port: Ethernet84
# dst_port_1: Ethernet92
# dst_port_2: Ethernet96
# dst_port_3: Ethernet100
#- set_fact:
# src_port_ptf_id: "{{ alias_reverse_map[src_port]|replace(\"Ethernet\", \"\")|int / 4 }}"
# dst_port_1_ptf_id: "{{ alias_reverse_map[dst_port_1]|replace(\"Ethernet\", \"\")|int / 4 }}"
# dst_port_2_ptf_id: "{{ alias_reverse_map[dst_port_2]|replace(\"Ethernet\", \"\")|int / 4 }}"
# dst_port_3_ptf_id: "{{ alias_reverse_map[dst_port_3]|replace(\"Ethernet\", \"\")|int / 4 }}"

- name: Define port variables.
set_fact:
src_port: "{{ tor_ports[0] }}"
dst_port_1: "{{ tor_ports[1] }}"
dst_port_2: "{{ tor_ports[2] }}"
dst_port_3: "{{ tor_ports[3] }}"

- name: Print port variables.
debug:
var: src_port

- name: Print port variables.
debug:
var: dst_port_1

- name: Print port variables.
debug:
var: dst_port_2

- name: Print port variables.
debug:
var: dst_port_3

- name: Define PTF port IDs
set_fact:
src_port_ptf_id: "{{ alias_reverse_map[src_port]|replace(\"Ethernet\", \"\")|int / 4 }}"
dst_port_1_ptf_id: "{{ alias_reverse_map[dst_port_1]|replace(\"Ethernet\", \"\")|int / 4 }}"
dst_port_2_ptf_id: "{{ alias_reverse_map[dst_port_2]|replace(\"Ethernet\", \"\")|int / 4 }}"
dst_port_3_ptf_id: "{{ alias_reverse_map[dst_port_3]|replace(\"Ethernet\", \"\")|int / 4 }}"

- name: Print PTF port ID.
debug: msg="{{ src_port }} = {{ src_port_ptf_id }}"

- name: Print PTF port ID
debug: msg="{{ dst_port_1 }} = {{ dst_port_1_ptf_id }}"

- name: Print PTF port ID
debug: msg="{{ dst_port_2 }} = {{ dst_port_2_ptf_id }}"

- name: Print PTF port ID
debug: msg="{{ dst_port_3 }} = {{ dst_port_3_ptf_id }}"
Original file line number Diff line number Diff line change
Expand Up @@ -39,3 +39,12 @@
- name: Initialize session_dscp variable.
set_fact:
session_dscp: "{{ session_dscp_info.stdout }}"

- set_fact:
addr_1: "{{ session_dst_ip }}/24"
addr_2: "{{ session_dst_ip }}/30"

- name: Initialize session prefixes.
set_fact:
session_prefix_1: "{{ addr_1|ipaddr('network') }}/{{ addr_1|ipaddr('prefix') }}"
session_prefix_2: "{{ addr_2|ipaddr('network') }}/{{ addr_2|ipaddr('prefix') }}"
35 changes: 30 additions & 5 deletions ansible/roles/test/tasks/everflow_testbed/run_test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@
- name: Print neighbors in minigraph
debug: msg="{{ minigraph_neighbors }}"

# TODO: is it needed
- name: Read port reverse alias mapping.
set_fact:
alias_reverse_map: "{{ lookup('file', 'roles/sonicv2/files/ssw/{{ sonic_hwsku }}/alias_reverse_map.json') | from_json }}"
Expand All @@ -28,9 +27,9 @@
match_file: loganalyzer_common_match.txt
ignore_file: loganalyzer_common_ignore.txt
tests_location: "{{ 'roles/test/tasks' }}"
src_port: Ethernet84
dst_port_1: Ethernet92
dst_port_2: Ethernet96

- name: Get port info.
include: roles/test/tasks/everflow_testbed/get_port_info.yml

- name: Get session info.
include: roles/test/tasks/everflow_testbed/get_session_info.yml
Expand All @@ -50,15 +49,41 @@
- include: roles/test/files/tools/loganalyzer/loganalyzer_init.yml

- block:

- name: Copy the test to ptf container.
copy: src=roles/test/files/acstests dest=/root
delegate_to: "{{ ptf_host }}"

- name: Add route to unresolved next hop.
shell: ip route add {{ unresolved_nexthop_prefix }} dev {{ dst_port_2 }}

- name: Run testcase 1 - Resolved route
include: roles/test/tasks/everflow_testbed/testcase_1.yml

- name: Run testcase 2 - Longer prefix route with resolved next hop.
include: roles/test/tasks/everflow_testbed/testcase_2.yml

- name: Run testcase 3 - Remove longer prefix route.
include: roles/test/tasks/everflow_testbed/testcase_3.yml

- name: Run testcase 4 - Change neighbor MAC address.
include: roles/test/tasks/everflow_testbed/testcase_4.yml

- name: Run testcase 5 - Resolved ECMP route.
include: roles/test/tasks/everflow_testbed/testcase_5.yml

- name: Run testcase 6 - ECMP route change (add next hop).
include: roles/test/tasks/everflow_testbed/testcase_6.yml

- name: Run testcase 7 - ECMP route change (remove next hop used by session).
include: roles/test/tasks/everflow_testbed/testcase_7.yml

- name: Run testcase 8 - ECMP route change (remove next hop not used by session).
include: roles/test/tasks/everflow_testbed/testcase_8.yml

always:
- name: Remove route to unresolved next hop.
shell: ip route del {{ unresolved_nexthop_prefix }}

- include: roles/test/files/tools/loganalyzer/loganalyzer_analyze.yml

# Output content of result files to ansible console
Expand Down
16 changes: 8 additions & 8 deletions ansible/roles/test/tasks/everflow_testbed/testcase_1.yml
Original file line number Diff line number Diff line change
@@ -1,17 +1,17 @@
- name: test case 1 - Resolved route (Verify that session with resolved route has active state.)
shell: ip route add 2.2.2.0/24 via {{ neighbor_info_1['addr'] }}
become: yes
# Test case 1 - Resolved route.
# Verify that session with resolved route has active state.

- name: Create route with next hop {{ dst_port_1 }}.
shell: ip route add {{ session_prefix_1 }} via {{ neighbor_info_1['addr'] }}

- block:
- name: "Running test case 1"
shell: ptf --test-dir acstests everflow_tb_test.EverflowTest --platform remote -t 'router_mac="00:02:03:04:05:00";src_port="{{ alias_reverse_map[src_port]|replace("Ethernet", "")|int / 4 }}";dst_ports="{{ alias_reverse_map[dst_port_1]|replace("Ethernet","")|int / 4 }},{{ alias_reverse_map[dst_port_2]|replace("Ethernet","")|int / 4 }}";session_src_ip="{{ session_src_ip }}";session_dst_ip="{{ session_dst_ip }}";session_ttl="{{ session_ttl }}";session_dscp="{{ session_dscp }}";verbose=True'
- name: Send traffic and verify that packets with correct Everflow header are received on destination port {{ dst_port_1 }}.
shell: ptf --test-dir acstests everflow_tb_test.EverflowTest --platform remote -t 'router_mac="{{ ansible_Ethernet0['macaddress'] }}";src_port="{{ src_port_ptf_id }}";dst_ports="{{ dst_port_1_ptf_id }}";session_src_ip="{{ session_src_ip }}";session_dst_ip="{{ session_dst_ip }}";session_ttl="{{ session_ttl }}";session_dscp="{{ session_dscp }}";verbose=True'
args:
chdir: /root
delegate_to: "{{ ptf_host }}"
register: out

always:
- name: Remove route
shell: ip route del 2.2.2.0/24
become: yes

shell: ip route del {{ session_prefix_1 }}
42 changes: 42 additions & 0 deletions ansible/roles/test/tasks/everflow_testbed/testcase_2.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
# Test case 2 - Longer prefix route with resolved next hop.
# Verify that session destination port and MAC address are changed after best match route insertion.

- block:
- name: Create route with next hop on {{ dst_port_1 }}.
shell: ip route add {{ session_prefix_1 }} via {{ neighbor_info_1['addr'] }}

- name: Send traffic and verify that packets with correct Everflow header are received on destination port {{ dst_port_1 }}.
shell: ptf --test-dir acstests everflow_tb_test.EverflowTest --platform remote -t 'router_mac="{{ ansible_Ethernet0['macaddress'] }}";src_port="{{ src_port_ptf_id }}";dst_ports="{{ dst_port_1_ptf_id }}";session_src_ip="{{ session_src_ip }}";session_dst_ip="{{ session_dst_ip }}";session_ttl="{{ session_ttl }}";session_dscp="{{ session_dscp }}";verbose=True'
args:
chdir: /root
delegate_to: "{{ ptf_host }}"
register: out

- name: Create route with best match and unresolved next hop.
shell: ip route add {{ session_prefix_2 }} via {{ unresolved_nexthop }}

- name: Send traffic and verify that packets with correct Everflow header are received on destination port {{ dst_port_1 }}.
shell: ptf --test-dir acstests everflow_tb_test.EverflowTest --platform remote -t 'router_mac="{{ ansible_Ethernet0['macaddress'] }}";src_port="{{ src_port_ptf_id }}";dst_ports="{{ dst_port_1_ptf_id }}";session_src_ip="{{ session_src_ip }}";session_dst_ip="{{ session_dst_ip }}";session_ttl="{{ session_ttl }}";session_dscp="{{ session_dscp }}";verbose=True'
args:
chdir: /root
delegate_to: "{{ ptf_host }}"
register: out

- name: Create route with best match prefix and resolved next hop on destination port {{ dst_port_2 }}.
shell: ip route change {{ session_prefix_2 }} via {{ neighbor_info_2['addr'] }}

- name: Send traffic and verify that packets with correct Everflow header are received on destination port {{ dst_port_2 }}.
shell: ptf --test-dir acstests everflow_tb_test.EverflowTest --platform remote -t 'router_mac="{{ ansible_Ethernet0['macaddress'] }}";src_port="{{ src_port_ptf_id }}";dst_ports="{{ dst_port_2_ptf_id }}";session_src_ip="{{ session_src_ip }}";session_dst_ip="{{ session_dst_ip }}";session_ttl="{{ session_ttl }}";session_dscp="{{ session_dscp }}";verbose=True'
args:
chdir: /root
delegate_to: "{{ ptf_host }}"
register: out

always:
- name: Remove route.
shell: ip route del {{ session_prefix_1 }}
ignore_errors: yes

- name: Remove best match route.
shell: ip route del {{ session_prefix_2 }}
ignore_errors: yes
43 changes: 43 additions & 0 deletions ansible/roles/test/tasks/everflow_testbed/testcase_3.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
# Test case 3 - Remove longer prefix route.
# Verify that session destination port and MAC address are changed after best match route removal.

- block:
- name: Create route with next hop on {{ dst_port_1 }}.
shell: ip route add {{ session_prefix_1 }} via {{ neighbor_info_1['addr'] }}

- name: Send traffic and verify that packets with correct Everflow header are received on destination port {{ dst_port_1 }}.
shell: ptf --test-dir acstests everflow_tb_test.EverflowTest --platform remote -t 'router_mac="{{ ansible_Ethernet0['macaddress'] }}";src_port="{{ src_port_ptf_id }}";dst_ports="{{ dst_port_1_ptf_id }}";session_src_ip="{{ session_src_ip }}";session_dst_ip="{{ session_dst_ip }}";session_ttl="{{ session_ttl }}";session_dscp="{{ session_dscp }}";verbose=True'
args:
chdir: /root
delegate_to: "{{ ptf_host }}"
register: out

- name: Create route with best match prefix and resolved next hop {{ dst_port_2 }}.
shell: ip route add {{ session_prefix_2 }} via {{ neighbor_info_2['addr'] }}

- name: Send traffic and verify that packets with correct Everflow header are received on destination port {{ dst_port_2}}.
shell: ptf --test-dir acstests everflow_tb_test.EverflowTest --platform remote -t 'router_mac="{{ ansible_Ethernet0['macaddress'] }}";src_port="{{ src_port_ptf_id }}";dst_ports="{{ dst_port_2_ptf_id }}";session_src_ip="{{ session_src_ip }}";session_dst_ip="{{ session_dst_ip }}";session_ttl="{{ session_ttl }}";session_dscp="{{ session_dscp }}";verbose=True'
args:
chdir: /root
delegate_to: "{{ ptf_host }}"
register: out

- name: Remove best match route.
shell: ip route del {{ session_prefix_2 }}
ignore_errors: yes

- name: Send traffic and verify that packets with correct Everflow header are received on destination port {{ dst_port_1 }}.
shell: ptf --test-dir acstests everflow_tb_test.EverflowTest --platform remote -t 'router_mac="{{ ansible_Ethernet0['macaddress'] }}";src_port="{{ src_port_ptf_id }}";dst_ports="{{ dst_port_1_ptf_id }}";session_src_ip="{{ session_src_ip }}";session_dst_ip="{{ session_dst_ip }}";session_ttl="{{ session_ttl }}";session_dscp="{{ session_dscp }}";verbose=True'
args:
chdir: /root
delegate_to: "{{ ptf_host }}"
register: out

always:
- name: Remove route.
shell: ip route del {{ session_prefix_1 }}
ignore_errors: yes

- name: Remove best match route.
shell: ip route del {{ session_prefix_2 }}
ignore_errors: yes
Loading

0 comments on commit 2afc19e

Please sign in to comment.