From: Stefan Kobza Date: Wed, 10 Feb 2016 18:41:09 +0000 (+0100) Subject: Test VIRL connection. X-Git-Url: https://gerrit.fd.io/r/gitweb?p=csit.git;a=commitdiff_plain;h=8f285166faf13156a4f7c70adac9a7e20549268f;hp=da15035461569ea175aabbac1df735cd5598b0b3 Test VIRL connection. Change-Id: I812ff9c8c9669b63907469c643c839e8bd3b419a Signed-off-by: Stefan Kobza --- diff --git a/README b/README index f3d9397aea..f8c478e989 100644 --- a/README +++ b/README @@ -7,7 +7,7 @@ - install python requirements for this project by executing: # pip install -r requirements.txt - make sure user mentioned in topology.py has NOPASSWD sudo access to - vpe_api_test + vpp_api_test Done. diff --git a/bootstrap.sh b/bootstrap.sh index 4a91121f50..01b7968cd0 100755 --- a/bootstrap.sh +++ b/bootstrap.sh @@ -1,5 +1,42 @@ #!/bin/bash -set -euf -o pipefail +#set -xeuf -o pipefail +set -x + +#sudo apt-get -y install libpython2.7-dev + +rm -f priv_key +cat > priv_key <>> ssh = SSH() >>> ssh.connect(node) >>> #Execute command without input (sudo -S cmd) - >>> ssh.exex_command_sudo("ifconfig eth0 down") + >>> ssh.exec_command_sudo("ifconfig eth0 down") >>> #Execute command with input (sudo -S cmd <<< "input") - >>> ssh.exex_command_sudo("vpp_api_test", "dump_interface_table") + >>> ssh.exec_command_sudo("vpp_api_test", "dump_interface_table") """ if cmd_input is None: command = 'sudo -S {c}'.format(c=cmd) @@ -182,7 +198,7 @@ class SSH(object): connect() method has to be called first! """ logger.trace('SCP {0} to {1}:{2}'.format( - local_path, self._hostname, remote_path)) + local_path, self._ssh.get_transport().getpeername(), remote_path)) # SCPCLient takes a paramiko transport as its only argument scp = SCPClient(self._ssh.get_transport()) start = time() @@ -229,7 +245,7 @@ def exec_cmd_no_error(node, cmd, timeout=None, sudo=False): Returns (stdout, stderr). """ - (rc, stdout, stderr) = exec_cmd(node,cmd, timeout=timeout, sudo=sudo) + (rc, stdout, stderr) = exec_cmd(node, cmd, timeout=timeout, sudo=sudo) assert_equal(rc, 0, 'Command execution failed: "{}"\n{}'. format(cmd, stderr)) return (stdout, stderr) diff --git a/resources/libraries/python/topology.py b/resources/libraries/python/topology.py index 8b6905d7e1..103416078a 100644 --- a/resources/libraries/python/topology.py +++ b/resources/libraries/python/topology.py @@ -195,7 +195,7 @@ class Topology(object): interface_dict = {} list_mac_address = self.convert_mac_to_number_list(mac_address) - logger.trace(list_mac_address.__str__()) + logger.trace(str(list_mac_address)) for interface in interfaces_list: # TODO: create vat json integrity checking and move there if "l2_address" not in interface: @@ -254,6 +254,9 @@ class Topology(object): if_mac = ifc['mac_address'] interface_dict = self._extract_vpp_interface_by_mac(interface_list, if_mac) + if not interface_dict: + raise Exception('Interface {0} not found by MAC {1}'. + format(ifc, if_mac)) ifc['name'] = interface_dict["interface_name"] ifc['vpp_sw_index'] = interface_dict["sw_if_index"] diff --git a/resources/libraries/robot/ipv4.robot b/resources/libraries/robot/ipv4.robot index a5745a8ce0..c271de5693 100644 --- a/resources/libraries/robot/ipv4.robot +++ b/resources/libraries/robot/ipv4.robot @@ -45,6 +45,7 @@ | | Setup IPv4 adresses on all DUT nodes in topology | ${nodes} | ${nodes_ipv4_addr} | | Setup ARP on all DUTs | ${nodes} | ${nodes_ipv4_addr} | | Routes are set up for IPv4 testing +| | Sleep | 10 | TG interface "${tg_port}" can route to node "${node}" interface "${port}" "${hops}" hops away using IPv4 | | Node "${nodes['TG']}" interface "${tg_port}" can route to node "${node}" interface "${port}" "${hops}" hops away using IPv4 @@ -74,7 +75,7 @@ | # TODO: end_size is currently minimum MTU size for Ethernet minus IPv4 and | # ICMP echo header size (1500 - 20 - 8), | # MTU info is not in VAT sw_interface_dump output -| | ${args}= | Set Variable | ${args} --start_size 0 --end_size 1472 --step 1 +| | ${args}= | Set Variable | ${args} --start_size 1 --end_size 1472 --step 1 | | Run Traffic Script On Node | ipv4_sweep_ping.py | ${src_node} | ${args} | Send ARP request and validate response diff --git a/resources/libraries/robot/ipv6.robot b/resources/libraries/robot/ipv6.robot index 3d8a2ea82d..6cd6640b0a 100644 --- a/resources/libraries/robot/ipv6.robot +++ b/resources/libraries/robot/ipv6.robot @@ -152,6 +152,7 @@ | | [Arguments] | ${nodes} | ${nodes_addr} | | Setup all DUTs before test | | Nodes Setup Ipv6 Addresses | ${nodes} | ${nodes_addr} +| | Sleep | 10 | Clear ipv6 on all dut in topology | | [Documentation] | Remove IPv6 address on all DUTs diff --git a/resources/traffic_scripts/ipv4_ping_ttl_check.py b/resources/traffic_scripts/ipv4_ping_ttl_check.py index 2fd9d552ea..54b6aa1ef5 100755 --- a/resources/traffic_scripts/ipv4_ping_ttl_check.py +++ b/resources/traffic_scripts/ipv4_ping_ttl_check.py @@ -30,8 +30,8 @@ def check_ttl(ttl_begin, ttl_end, ttl_diff): def ckeck_packets_equal(pkt_send, pkt_recv): - pkt_send_raw = str(pkt_send) - pkt_recv_raw = str(pkt_recv) + pkt_send_raw = auto_pad(pkt_send) + pkt_recv_raw = auto_pad(pkt_recv) if pkt_send_raw != pkt_recv_raw: print "Sent: {}".format(pkt_send_raw.encode('hex')) print "Received: {}".format(pkt_recv_raw.encode('hex')) @@ -63,20 +63,21 @@ if dst_if_defined and (src_if_name == dst_if_name): raise Exception("Source interface name equals destination interface name") src_if = Interface(src_if_name) -src_if.send_pkt(create_gratuitous_arp_request(src_mac, src_ip)) +src_if.send_pkt(str(create_gratuitous_arp_request(src_mac, src_ip))) if dst_if_defined: dst_if = Interface(dst_if_name) - dst_if.send_pkt(create_gratuitous_arp_request(dst_mac, dst_ip)) + dst_if.send_pkt(str(create_gratuitous_arp_request(dst_mac, dst_ip))) -pkt_req_send = auto_pad(Ether(src=src_mac, dst=first_hop_mac) / - IP(src=src_ip, dst=dst_ip) / - ICMP()) -pkt_req_send = Ether(pkt_req_send) +pkt_req_send = (Ether(src=src_mac, dst=first_hop_mac) / + IP(src=src_ip, dst=dst_ip) / + ICMP()) src_if.send_pkt(pkt_req_send) if dst_if_defined: try: pkt_req_recv = dst_if.recv_pkt() + if pkt_req_recv is None: + raise Exception('Timeout waiting for packet') except: src_if.close() if dst_if_defined: @@ -89,14 +90,15 @@ if dst_if_defined: del pkt_req_send_mod[IP].chksum # update checksum ckeck_packets_equal(pkt_req_send_mod[IP], pkt_req_recv[IP]) - pkt_resp_send = auto_pad(Ether(src=dst_mac, dst=pkt_req_recv.src) / - IP(src=dst_ip, dst=src_ip) / - ICMP(type=0)) # echo-reply - pkt_resp_send = Ether(pkt_resp_send) + pkt_resp_send = (Ether(src=dst_mac, dst=pkt_req_recv.src) / + IP(src=dst_ip, dst=src_ip) / + ICMP(type=0)) # echo-reply dst_if.send_pkt(pkt_resp_send) try: pkt_resp_recv = src_if.recv_pkt() + if pkt_resp_recv is None: + raise Exception('Timeout waiting for packet') except: src_if.close() if dst_if_defined: diff --git a/tests/suites/__init__.robot b/tests/suites/__init__.robot index fc3c810e39..64f4a99de8 100644 --- a/tests/suites/__init__.robot +++ b/tests/suites/__init__.robot @@ -16,5 +16,6 @@ | Library | resources/libraries/python/SetupFramework.py | Library | resources.libraries.python.topology.Topology | Suite Setup | Run Keywords | Setup Framework | ${nodes} +| ... | AND | Start VPP Service On All DUTs | ${nodes} | ... | AND | Update All Interface Data On All Nodes | ${nodes} diff --git a/tests/suites/bridge_domain/test.robot b/tests/suites/bridge_domain/test.robot index 108e2aa4dd..4c88cae7b8 100644 --- a/tests/suites/bridge_domain/test.robot +++ b/tests/suites/bridge_domain/test.robot @@ -17,7 +17,6 @@ | Test Setup | Setup all DUTs before test | Library | resources.libraries.python.topology.Topology | Variables | resources/libraries/python/topology.py -| Force Tags | 3_NODE_DOUBLE_LINK_TOPO | Suite Setup | Setup all TGs before traffic script *** Test Cases *** @@ -37,7 +36,7 @@ | | ${dut1}= | Set Variable | ${nodes['DUT1']} | | ${dut2}= | Set Variable | ${nodes['DUT2']} | | ${tg_links}= | Setup TG "${tg}" DUT1 "${dut1}" and DUT2 "${dut2}" for 3 node l2 bridge domain test -| | Sleep | 5 | Workaround for interface still in down state after vpp restart +| | Sleep | 10 | Workaround for interface still in down state after vpp restart | | Send traffic on node "${nodes['TG']}" from link "${tg_links[0]}" to link "${tg_links[1]}" | Vpp forwards packets via L2 bridge domain in circular topology with static L2FIB entries @@ -46,5 +45,5 @@ | | ${dut1}= | Set Variable | ${nodes['DUT1']} | | ${dut2}= | Set Variable | ${nodes['DUT2']} | | ${tg_links}= | Setup TG "${tg}" DUT1 "${dut1}" and DUT2 "${dut2}" for 3 node static l2fib test -| | Sleep | 5 | Workaround for interface still in down state after vpp restart +| | Sleep | 10 | Workaround for interface still in down state after vpp restart | | Send traffic on node "${nodes['TG']}" from link "${tg_links[0]}" to link "${tg_links[1]}" diff --git a/tests/suites/ipv6/ipv6_untagged.robot b/tests/suites/ipv6/ipv6_untagged.robot index 6f8b9c093e..e804addaf9 100644 --- a/tests/suites/ipv6/ipv6_untagged.robot +++ b/tests/suites/ipv6/ipv6_untagged.robot @@ -23,7 +23,6 @@ | ... | AND | Vpp nodes ra supress link layer | ${nodes} | ... | AND | Vpp nodes setup ipv6 routing | ${nodes} | ${nodes_ipv6_addr} | ... | AND | Setup all TGs before traffic script -| Suite Teardown | Clear ipv6 on all dut in topology | ${nodes} | ${nodes_ipv6_addr} | Test Setup | Clear interface counters on all vpp nodes in topology | ${nodes} *** Test Cases *** diff --git a/tests/suites/l2_xconnect/l2_xconnect_untagged.robot b/tests/suites/l2_xconnect/l2_xconnect_untagged.robot index 36f49b30d8..286a63e9f4 100644 --- a/tests/suites/l2_xconnect/l2_xconnect_untagged.robot +++ b/tests/suites/l2_xconnect/l2_xconnect_untagged.robot @@ -28,5 +28,6 @@ | | ${dut1}= | Set Variable | ${nodes['DUT1']} | | ${dut2}= | Set Variable | ${nodes['DUT2']} | | ${tg_links}= | Get traffic links between TG "${tg}" and DUT1 "${dut1}" and DUT2 "${dut2}" +| | Sleep | 10 | Work around VPP interface up taking too long. | | Send traffic on node "${nodes['TG']}" from link "${tg_links[0]}" to link "${tg_links[1]}" diff --git a/tests/suites/performance/short.robot b/tests/suites/performance/short.robot index 3d29485d7d..15143778ab 100644 --- a/tests/suites/performance/short.robot +++ b/tests/suites/performance/short.robot @@ -17,7 +17,7 @@ | Resource | resources/libraries/robot/ipv4.robot | Library | resources/libraries/python/TrafficGenerator.py | Library | resources/libraries/python/CrossConnectSetup.py -| Force Tags | topo-3node +| Force Tags | topo-3node | PERFTEST | Test Setup | Setup all DUTs before test | Suite Setup | Initialize traffic generator | ${nodes['TG']} | ... | ${nodes['TG']['interfaces']['port3']['pci_address']} diff --git a/topologies/available/virl.yaml b/topologies/available/virl.yaml new file mode 100644 index 0000000000..36d45fe754 --- /dev/null +++ b/topologies/available/virl.yaml @@ -0,0 +1,137 @@ +--- +metadata: + version: 0.1 + schema: + - resources/topology_schemas/3_node_topology.sch.yaml + - resources/topology_schemas/topology.sch.yaml + tags: [hw, 3-node] + +nodes: + TG: + type: TG + host: "10.30.51.73" + port: 22 + username: cisco + priv_key: | + -----BEGIN RSA PRIVATE KEY----- + MIIEpgIBAAKCAQEAwUDlTpzSHpwLQotZOFS4AgcPNEWCnP1AB2hWFmvI+8Kah/gb + v8ruZU9RqhPs56tyKzxbhvNkY4VbH5F1GilHZu3mLqzM4KfghMmaeMEjO1T7BYYd + vuBfTvIluljfQ2vAlnYrDwn+ClxJk81m0pDgvrLEX4qVVh2sGh7UEkYy5r82DNa2 + 4VjzPB1J/c8a9zP8FoZUhYIzF4FLvRMjUADpbMXgJMsGpaZLmz95ap0Eot7vb1Cc + 1LvF97iyBCrtIOSKRKA50ZhLGjMKmOwnYU+cP5718tbproDVi6VJOo7zeuXyetMs + 8YBl9kWblWG9BqP9jctFvsmi5G7hXgq1Y8u+DwIDAQABAoIBAQC/W4E0DHjLMny7 + 0bvw2YKzD0Zw3fttdB94tkm4PdZv5MybooPnsAvLaXVV0hEdfVi5kzSWNl/LY/tN + EP1BgGphc2QgB59/PPxGwFIjDCvUzlsZpynBHe+B/qh5ExNQcVvsIOqWI7DXlXaN + 0i/khOzmJ6HncRRah1spKimYRsaUUDskyg7q3QqMWVaqBbbMvLs/w7ZWd/zoDqCU + MY/pCI6hkB3QbRo0OdiZLohphBl2ShABTwjvVyyKL5UA4jAEneJrhH5gWVLXnfgD + p62W5CollKEYblC8mUkPxpP7Qo277zw3xaq+oktIZhc5SUEUd7nJZtNqVAHqkItW + 79VmpKyxAoGBAPfU+kqNPaTSvp+x1n5sn2SgipzDtgi9QqNmC4cjtrQQaaqI57SG + OHw1jX8i7L2G1WvVtkHg060nlEVo5n65ffFOqeVBezLVJ7ghWI8U+oBiJJyQ4boD + GJVNsoOSUQ0rtuGd9eVwfDk3ol9aCN0KK53oPfIYli29pyu4l095kg11AoGBAMef + bPEMBI/2XmCPshLSwhGFl+dW8d+Klluj3CUQ/0vUlvma3dfBOYNsIwAgTP0iIUTg + 8DYE6KBCdPtxAUEI0YAEAKB9ry1tKR2NQEIPfslYytKErtwjAiqSi0heM6+zwEzu + f54Z4oBhsMSL0jXoOMnu+NZzEc6EUdQeY4O+jhjzAoGBAIogC3dtjMPGKTP7+93u + UE/XIioI8fWg9fj3sMka4IMu+pVvRCRbAjRH7JrFLkjbUyuMqs3Arnk9K+gbdQt/ + +m95Njtt6WoFXuPCwgbM3GidSmZwYT4454SfDzVBYScEDCNm1FuR+8ov9bFLDtGT + D4gsngnGJj1MDFXTxZEn4nzZAoGBAKCg4WmpUPaCuXibyB+rZavxwsTNSn2lJ83/ + sYJGBhf/raiV/FLDUcM1vYg5dZnu37RsB/5/vqxOLZGyYd7x+Jo5HkQGPnKgNwhn + g8BkdZIRF8uEJqxOo0ycdOU7n/2O93swIpKWo5LIiRPuqqzj+uZKnAL7vuVdxfaY + qVz2daMPAoGBALgaaKa3voU/HO1PYLWIhFrBThyJ+BQSQ8OqrEzC8AnegWFxRAM8 + EqrzZXl7ACUuo1dH0Eipm41j2+BZWlQjiUgq5uj8+yzy+EU1ZRRyJcOKzbDACeuD + BpWWSXGBI5G4CppeYLjMUHZpJYeX1USULJQd2c4crLJKb76E8gz3Z9kN + -----END RSA PRIVATE KEY----- + interfaces: + port3: + mac_address: "fa:16:3e:c6:df:f2" + pci_address: "0000:00:04.0" + link: link1 + driver: virtio-pci + port5: + mac_address: "fa:16:3e:ab:ef:db" + pci_address: "0000:00:05.0" + link: link2 + driver: virtio-pci + DUT1: + type: DUT + host: "10.30.51.72" + port: 22 + username: cisco + priv_key: | + -----BEGIN RSA PRIVATE KEY----- + MIIEpgIBAAKCAQEAwUDlTpzSHpwLQotZOFS4AgcPNEWCnP1AB2hWFmvI+8Kah/gb + v8ruZU9RqhPs56tyKzxbhvNkY4VbH5F1GilHZu3mLqzM4KfghMmaeMEjO1T7BYYd + vuBfTvIluljfQ2vAlnYrDwn+ClxJk81m0pDgvrLEX4qVVh2sGh7UEkYy5r82DNa2 + 4VjzPB1J/c8a9zP8FoZUhYIzF4FLvRMjUADpbMXgJMsGpaZLmz95ap0Eot7vb1Cc + 1LvF97iyBCrtIOSKRKA50ZhLGjMKmOwnYU+cP5718tbproDVi6VJOo7zeuXyetMs + 8YBl9kWblWG9BqP9jctFvsmi5G7hXgq1Y8u+DwIDAQABAoIBAQC/W4E0DHjLMny7 + 0bvw2YKzD0Zw3fttdB94tkm4PdZv5MybooPnsAvLaXVV0hEdfVi5kzSWNl/LY/tN + EP1BgGphc2QgB59/PPxGwFIjDCvUzlsZpynBHe+B/qh5ExNQcVvsIOqWI7DXlXaN + 0i/khOzmJ6HncRRah1spKimYRsaUUDskyg7q3QqMWVaqBbbMvLs/w7ZWd/zoDqCU + MY/pCI6hkB3QbRo0OdiZLohphBl2ShABTwjvVyyKL5UA4jAEneJrhH5gWVLXnfgD + p62W5CollKEYblC8mUkPxpP7Qo277zw3xaq+oktIZhc5SUEUd7nJZtNqVAHqkItW + 79VmpKyxAoGBAPfU+kqNPaTSvp+x1n5sn2SgipzDtgi9QqNmC4cjtrQQaaqI57SG + OHw1jX8i7L2G1WvVtkHg060nlEVo5n65ffFOqeVBezLVJ7ghWI8U+oBiJJyQ4boD + GJVNsoOSUQ0rtuGd9eVwfDk3ol9aCN0KK53oPfIYli29pyu4l095kg11AoGBAMef + bPEMBI/2XmCPshLSwhGFl+dW8d+Klluj3CUQ/0vUlvma3dfBOYNsIwAgTP0iIUTg + 8DYE6KBCdPtxAUEI0YAEAKB9ry1tKR2NQEIPfslYytKErtwjAiqSi0heM6+zwEzu + f54Z4oBhsMSL0jXoOMnu+NZzEc6EUdQeY4O+jhjzAoGBAIogC3dtjMPGKTP7+93u + UE/XIioI8fWg9fj3sMka4IMu+pVvRCRbAjRH7JrFLkjbUyuMqs3Arnk9K+gbdQt/ + +m95Njtt6WoFXuPCwgbM3GidSmZwYT4454SfDzVBYScEDCNm1FuR+8ov9bFLDtGT + D4gsngnGJj1MDFXTxZEn4nzZAoGBAKCg4WmpUPaCuXibyB+rZavxwsTNSn2lJ83/ + sYJGBhf/raiV/FLDUcM1vYg5dZnu37RsB/5/vqxOLZGyYd7x+Jo5HkQGPnKgNwhn + g8BkdZIRF8uEJqxOo0ycdOU7n/2O93swIpKWo5LIiRPuqqzj+uZKnAL7vuVdxfaY + qVz2daMPAoGBALgaaKa3voU/HO1PYLWIhFrBThyJ+BQSQ8OqrEzC8AnegWFxRAM8 + EqrzZXl7ACUuo1dH0Eipm41j2+BZWlQjiUgq5uj8+yzy+EU1ZRRyJcOKzbDACeuD + BpWWSXGBI5G4CppeYLjMUHZpJYeX1USULJQd2c4crLJKb76E8gz3Z9kN + -----END RSA PRIVATE KEY----- + interfaces: + port1: + mac_address: "fa:16:3e:f1:61:90" + pci_address: "0000:00:05.0" + link: link1 + port3: + mac_address: "fa:16:3e:2b:eb:53" + pci_address: "0000:00:04.0" + link: link3 + DUT2: + type: DUT + host: "10.30.51.71" + port: 22 + username: cisco + priv_key: | + -----BEGIN RSA PRIVATE KEY----- + MIIEpgIBAAKCAQEAwUDlTpzSHpwLQotZOFS4AgcPNEWCnP1AB2hWFmvI+8Kah/gb + v8ruZU9RqhPs56tyKzxbhvNkY4VbH5F1GilHZu3mLqzM4KfghMmaeMEjO1T7BYYd + vuBfTvIluljfQ2vAlnYrDwn+ClxJk81m0pDgvrLEX4qVVh2sGh7UEkYy5r82DNa2 + 4VjzPB1J/c8a9zP8FoZUhYIzF4FLvRMjUADpbMXgJMsGpaZLmz95ap0Eot7vb1Cc + 1LvF97iyBCrtIOSKRKA50ZhLGjMKmOwnYU+cP5718tbproDVi6VJOo7zeuXyetMs + 8YBl9kWblWG9BqP9jctFvsmi5G7hXgq1Y8u+DwIDAQABAoIBAQC/W4E0DHjLMny7 + 0bvw2YKzD0Zw3fttdB94tkm4PdZv5MybooPnsAvLaXVV0hEdfVi5kzSWNl/LY/tN + EP1BgGphc2QgB59/PPxGwFIjDCvUzlsZpynBHe+B/qh5ExNQcVvsIOqWI7DXlXaN + 0i/khOzmJ6HncRRah1spKimYRsaUUDskyg7q3QqMWVaqBbbMvLs/w7ZWd/zoDqCU + MY/pCI6hkB3QbRo0OdiZLohphBl2ShABTwjvVyyKL5UA4jAEneJrhH5gWVLXnfgD + p62W5CollKEYblC8mUkPxpP7Qo277zw3xaq+oktIZhc5SUEUd7nJZtNqVAHqkItW + 79VmpKyxAoGBAPfU+kqNPaTSvp+x1n5sn2SgipzDtgi9QqNmC4cjtrQQaaqI57SG + OHw1jX8i7L2G1WvVtkHg060nlEVo5n65ffFOqeVBezLVJ7ghWI8U+oBiJJyQ4boD + GJVNsoOSUQ0rtuGd9eVwfDk3ol9aCN0KK53oPfIYli29pyu4l095kg11AoGBAMef + bPEMBI/2XmCPshLSwhGFl+dW8d+Klluj3CUQ/0vUlvma3dfBOYNsIwAgTP0iIUTg + 8DYE6KBCdPtxAUEI0YAEAKB9ry1tKR2NQEIPfslYytKErtwjAiqSi0heM6+zwEzu + f54Z4oBhsMSL0jXoOMnu+NZzEc6EUdQeY4O+jhjzAoGBAIogC3dtjMPGKTP7+93u + UE/XIioI8fWg9fj3sMka4IMu+pVvRCRbAjRH7JrFLkjbUyuMqs3Arnk9K+gbdQt/ + +m95Njtt6WoFXuPCwgbM3GidSmZwYT4454SfDzVBYScEDCNm1FuR+8ov9bFLDtGT + D4gsngnGJj1MDFXTxZEn4nzZAoGBAKCg4WmpUPaCuXibyB+rZavxwsTNSn2lJ83/ + sYJGBhf/raiV/FLDUcM1vYg5dZnu37RsB/5/vqxOLZGyYd7x+Jo5HkQGPnKgNwhn + g8BkdZIRF8uEJqxOo0ycdOU7n/2O93swIpKWo5LIiRPuqqzj+uZKnAL7vuVdxfaY + qVz2daMPAoGBALgaaKa3voU/HO1PYLWIhFrBThyJ+BQSQ8OqrEzC8AnegWFxRAM8 + EqrzZXl7ACUuo1dH0Eipm41j2+BZWlQjiUgq5uj8+yzy+EU1ZRRyJcOKzbDACeuD + BpWWSXGBI5G4CppeYLjMUHZpJYeX1USULJQd2c4crLJKb76E8gz3Z9kN + -----END RSA PRIVATE KEY----- + interfaces: + port1: + mac_address: "fa:16:3e:5c:b8:f6" + pci_address: "0000:00:04.0" + link: link2 + port3: + mac_address: "fa:16:3e:b3:d2:6f" + pci_address: "0000:00:05.0" + link: link3