Vni Based L3 Forwarding - Ipv6 35/73635/33
authorSrinivas Rachakonda <srinivas.rachakonda@gmail.com>
Mon, 2 Jul 2018 08:57:43 +0000 (14:27 +0530)
committerSam Hague <shague@redhat.com>
Tue, 24 Jul 2018 23:44:54 +0000 (19:44 -0400)
Change-Id: I9262a9b09e43e59ac3b52fc63aede8a099451cfc
Signed-off-by: Srinivas Rachakonda <srinivas.rachakonda@gmail.com>
csit/suites/netvirt/vnibasedIpv6forwarding/vnibasedIpv6forwarding.robot [new file with mode: 0644]
csit/testplans/netvirt-1node-openstack.txt

diff --git a/csit/suites/netvirt/vnibasedIpv6forwarding/vnibasedIpv6forwarding.robot b/csit/suites/netvirt/vnibasedIpv6forwarding/vnibasedIpv6forwarding.robot
new file mode 100644 (file)
index 0000000..5e94426
--- /dev/null
@@ -0,0 +1,173 @@
+*** Settings ***
+Documentation     Test Suite for vni-based-l2-l3-nat:
+...               This feature attempts to realize the use of VxLAN VNI
+...               (Virtual Network Identifier) for VxLAN tenant traffic
+...               flowing on the cloud data-network. This is applicable
+...               to L2 switching, L3 forwarding and NATing for all VxLAN
+...               based provider networks. In doing so, it eliminates the
+...               presence of LPort tags, ELAN tags and MPLS labels on the
+...               wire and instead, replaces them with VNIs supplied by the
+...               tenant’s OpenStack.
+Suite Setup       Start Suite
+Suite Teardown    OpenStackOperations.OpenStack Suite Teardown
+Test Setup        Run Keywords    OpenStackOperations.Get DumpFlows And Ovsconfig    ${OS_CMP1_CONN_ID}
+...               AND    OpenStackOperations.Get DumpFlows And Ovsconfig    ${OS_CMP2_CONN_ID}
+Test Teardown     OpenStackOperations.Get Test Teardown Debugs
+Library           OperatingSystem
+Library           RequestsLibrary
+Library           String
+Resource          ../../../libraries/DevstackUtils.robot
+Resource          ../../../libraries/KarafKeywords.robot
+Resource          ../../../variables/netvirt/Variables.robot
+Resource          ../../../libraries/OpenStackOperations.robot
+Resource          ../../../libraries/OVSDB.robot
+Resource          ../../../libraries/SetupUtils.robot
+Resource          ../../../libraries/Utils.robot
+Resource          ../../../libraries/VpnOperations.robot
+Resource          ../../../variables/netvirt/Variables.robot
+Resource          ../../../variables/Variables.robot
+
+*** Variables ***
+${EGRESS}         Egress
+${INGRESS}        Ingress
+${IP}             ipv6
+${VNI6_SECURITY_GROUP}    vni6_sg
+@{VNI6_NETWORKS}    vni6_net_0    vni6_net_1    vni6_net_2    vni6_net_3
+@{VNI6_SUBNETS}    vni6_sub_0    vni6_sub_1    vni6_sub_2    vni6_sub_3
+@{VNI6_SUBNET_CIDRS}    2001:db8:0:4::/64    2001:db8:0:5::/64    2001:db8:0:6::/64    2001:db8:0:7::/64
+@{VNI6_NET_0_PORTS}    vni6_net_0_port_1    vni6_net_0_port_2
+@{VNI6_NET_1_PORTS}    vni6_net_1_port_1    vni6_net_1_port_2
+@{VNI6_NET_2_PORTS}    vni6_net_2_port_1    vni6_net_2_port_2
+@{VNI6_NET_3_PORTS}    vni6_net_3_port_1    vni6_net_3_port_2
+@{VNI6_NET_0_VMS}    vni6_net_0_vm_1
+@{VNI6_NET_1_VMS}    vni6_net_1_vm_1
+@{VNI6_NET_2_VMS}    vni6_net_2_vm_1
+@{VNI6_NET_3_VMS}    vni6_net_3_vm_1
+@{VNI6_ROUTER}    vni6_router1    vni6_router2    vni6_router3
+@{VNI6_RDS}       ["2600:2"]    ["2700:2"]    ["2800:2"]
+@{VNI6_VPN_NAMES}    VNI6_vpn_1    VNI6_vpn_2    VNI6_vpn_3
+@{VNI6_VPN_INSTANCE_IDS}    4ae8cd92-48ca-49b5-94e1-b2921a261551    4ae8cd92-48ca-49b5-94e1-b2921a261552    4ae8cd92-48ca-49b5-94e1-b2921a261553
+${NET0_ADDITIONAL_ARGS}    --ip-version=6 --ipv6-address-mode=slaac --ipv6-ra-mode=slaac --allocation-pool start=2001:db8:0:4::2,end=2001:db8:0:4:ffff:ffff:ffff:fffe
+${NET1_ADDITIONAL_ARGS}    --ip-version=6 --ipv6-address-mode=slaac --ipv6-ra-mode=slaac --allocation-pool start=2001:db8:0:5::2,end=2001:db8:0:5:ffff:ffff:ffff:fffe
+${NET2_ADDITIONAL_ARGS}    --ip-version=6 --ipv6-address-mode=slaac --ipv6-ra-mode=slaac --allocation-pool start=2001:db8:0:6::2,end=2001:db8:0:6:ffff:ffff:ffff:fffe
+${NET3_ADDITIONAL_ARGS}    --ip-version=6 --ipv6-address-mode=slaac --ipv6-ra-mode=slaac --allocation-pool start=2001:db8:0:7::2,end=2001:db8:0:7:ffff:ffff:ffff:fffe
+
+*** Test Cases ***
+VNI Based IPv6 Forwarding
+    [Documentation]    verify VNI id for IPv6 Unicast frames exchanged over OVS datapaths that are on different hypervisors
+    BuiltIn.Wait Until Keyword Succeeds    60s    5s    OVSDB.Verify Vni Segmentation Id and Tunnel Id    @{VNI6_NET_0_PORTS}[0]    @{VNI6_NET_1_PORTS}[0]    @{VNI6_NETWORKS}[0]
+    ...    @{VNI6_NETWORKS}[1]    @{VM_IP_NET0}[0]    @{VM_IP_NET1}[0]    ${IP}
+
+VNI Based IPv6 Forwarding With BGPVPN Router Association
+    [Documentation]    verify VNI id for IPv6 Unicast frames exchanged over OVS datapaths that are on different hypervisors
+    ...    With Router associated to a BGPVPN.
+    ${net_id} =    OpenStackOperations.Get Net Id    @{VNI6_NETWORKS}[0]
+    ${tenant_id} =    OpenStackOperations.Get Tenant ID From Network    ${net_id}
+    VpnOperations.VPN Create L3VPN    vpnid=@{VNI6_VPN_INSTANCE_IDS}[0]    name=@{VNI6_VPN_NAMES}[0]    rd=@{VNI6_RDS}[0]    exportrt=@{VNI6_RDS}[0]    importrt=@{VNI6_RDS}[0]    tenantid=${tenant_id}
+    ${resp} =    VpnOperations.VPN Get L3VPN    vpnid=@{VNI6_VPN_INSTANCE_IDS}[0]
+    BuiltIn.Should Contain    ${resp}    @{VNI6_VPN_INSTANCE_IDS}[0]
+    ${router_id} =    OpenStackOperations.Get Router Id    @{VNI6_ROUTER}[0]
+    VpnOperations.Associate VPN to Router    routerid=${router_id}    vpnid=@{VNI6_VPN_INSTANCE_IDS}[0]
+    ${resp} =    VpnOperations.VPN Get L3VPN    vpnid=@{VNI6_VPN_INSTANCE_IDS}[0]
+    BuiltIn.Should Contain    ${resp}    ${router_id}
+    BuiltIn.Wait Until Keyword Succeeds    60s    5s    OVSDB.Verify Vni Segmentation Id and Tunnel Id    @{VNI6_NET_0_PORTS}[0]    @{VNI6_NET_1_PORTS}[0]    @{VNI6_NETWORKS}[0]
+    ...    @{VNI6_NETWORKS}[1]    @{VM_IP_NET0}[0]    @{VM_IP_NET1}[0]    ${IP}
+
+VNI Based IPv6 Forwarding With Two Routers And BGPVPN With Irt Ert
+    [Documentation]    verify VNI id for IPv6 Unicast frames exchanged over OVS datapaths that are on different hypervisors
+    ...    With Two Routers each associated to a BGPVPN and The Two BGPVPN is connected with irt and ert.
+    OpenStackOperations.Create Network    @{VNI6_NETWORKS}[2]
+    OpenStackOperations.Create Network    @{VNI6_NETWORKS}[3]
+    OpenStackOperations.Create SubNet    @{VNI6_NETWORKS}[2]    @{VNI6_SUBNETS}[2]    @{VNI6_SUBNET_CIDRS}[2]    ${NET2_ADDITIONAL_ARGS}
+    OpenStackOperations.Create SubNet    @{VNI6_NETWORKS}[3]    @{VNI6_SUBNETS}[3]    @{VNI6_SUBNET_CIDRS}[3]    ${NET3_ADDITIONAL_ARGS}
+    OpenStackOperations.Create Port    @{VNI6_NETWORKS}[2]    @{VNI6_NET_2_PORTS}[0]    sg=${VNI6_SECURITY_GROUP}
+    OpenStackOperations.Create Port    @{VNI6_NETWORKS}[3]    @{VNI6_NET_3_PORTS}[0]    sg=${VNI6_SECURITY_GROUP}
+    OpenStackOperations.Create Router    @{VNI6_ROUTER}[1]
+    OpenStackOperations.Add Router Interface    @{VNI6_ROUTER}[1]    @{VNI6_SUBNETS}[2]
+    OpenStackOperations.Create Router    @{VNI6_ROUTER}[2]
+    OpenStackOperations.Add Router Interface    @{VNI6_ROUTER}[2]    @{VNI6_SUBNETS}[3]
+    ${net_id} =    OpenStackOperations.Get Net Id    @{VNI6_NETWORKS}[2]
+    ${tenant_id} =    OpenStackOperations.Get Tenant ID From Network    ${net_id}
+    VpnOperations.VPN Create L3VPN    vpnid=@{VNI6_VPN_INSTANCE_IDS}[1]    name=@{VNI6_VPN_NAMES}[1]    rd=@{VNI6_RDS}[1]    exportrt=@{VNI6_RDS}[1]    importrt=@{VNI6_RDS}[2]    tenantid=${tenant_id}
+    ${resp} =    VpnOperations.VPN Get L3VPN    vpnid=@{VNI6_VPN_INSTANCE_IDS}[1]
+    BuiltIn.Should Contain    ${resp}    @{VNI6_VPN_INSTANCE_IDS}[1]
+    ${router_id} =    OpenStackOperations.Get Router Id    @{VNI6_ROUTER}[1]
+    VpnOperations.Associate VPN to Router    routerid=${router_id}    vpnid=@{VNI6_VPN_INSTANCE_IDS}[1]
+    ${resp} =    VpnOperations.VPN Get L3VPN    vpnid=@{VNI6_VPN_INSTANCE_IDS}[1]
+    BuiltIn.Should Contain    ${resp}    ${router_id}
+    VpnOperations.VPN Create L3VPN    vpnid=@{VNI6_VPN_INSTANCE_IDS}[2]    name=@{VNI6_VPN_NAMES}[2]    rd=@{VNI6_RDS}[2]    exportrt=@{VNI6_RDS}[2]    importrt=@{VNI6_RDS}[1]    tenantid=${tenant_id}
+    ${resp} =    VpnOperations.VPN Get L3VPN    vpnid=@{VNI6_VPN_INSTANCE_IDS}[2]
+    BuiltIn.Should Contain    ${resp}    @{VNI6_VPN_INSTANCE_IDS}[2]
+    ${router_id} =    OpenStackOperations.Get Router Id    @{VNI6_ROUTER}[2]
+    VpnOperations.Associate VPN to Router    routerid=${router_id}    vpnid=@{VNI6_VPN_INSTANCE_IDS}[2]
+    ${resp} =    VpnOperations.VPN Get L3VPN    vpnid=@{VNI6_VPN_INSTANCE_IDS}[2]
+    BuiltIn.Should Contain    ${resp}    ${router_id}
+    OpenStackOperations.Create Vm Instance With Port On Compute Node    @{VNI6_NET_2_PORTS}[0]    @{VNI6_NET_2_VMS}[0]    ${OS_CMP1_HOSTNAME}    sg=${VNI6_SECURITY_GROUP}
+    OpenStackOperations.Create Vm Instance With Port On Compute Node    @{VNI6_NET_3_PORTS}[0]    @{VNI6_NET_3_VMS}[0]    ${OS_CMP2_HOSTNAME}    sg=${VNI6_SECURITY_GROUP}
+    OpenStackOperations.Poll VM Is ACTIVE    @{VNI6_NET_2_VMS}[0]
+    OpenStackOperations.Poll VM Is ACTIVE    @{VNI6_NET_3_VMS}[0]
+    @{networks} =    BuiltIn.Create List    @{VNI6_NETWORKS}[2]    @{VNI6_NETWORKS}[3]
+    @{subnet_cidrs} =    BuiltIn.Create List    @{VNI6_SUBNET_CIDRS}[2]    @{VNI6_SUBNET_CIDRS}[3]
+    BuiltIn.Wait Until Keyword Succeeds    30s    10s    OpenStackOperations.Wait For Routes To Propogate    ${networks}    ${subnet_cidrs}
+    ${prefix_net2} =    String.Replace String    @{VNI6_SUBNET_CIDRS}[2]    ::/64    (:[a-f0-9]{,4}){,4}
+    ${status}    ${message}    Run Keyword And Ignore Error    BuiltIn.Wait Until Keyword Succeeds    3x    60s    OpenStackOperations.Collect VM IPv6 SLAAC Addresses
+    ...    fail_on_none=true    vm_list=${VNI6_NET_2_VMS}    network=@{VNI6_NETWORKS}[2]    subnet=${prefix_net2}
+    ${prefix_net3} =    String.Replace String    @{VNI6_SUBNET_CIDRS}[3]    ::/64    (:[a-f0-9]{,4}){,4}
+    ${status}    ${message}    Run Keyword And Ignore Error    BuiltIn.Wait Until Keyword Succeeds    3x    60s    OpenStackOperations.Collect VM IPv6 SLAAC Addresses
+    ...    fail_on_none=true    vm_list=${VNI6_NET_3_VMS}    network=@{VNI6_NETWORKS}[3]    subnet=${prefix_net3}
+    ${VM_IP_NET2} =    OpenStackOperations.Collect VM IPv6 SLAAC Addresses    fail_on_none=false    vm_list=${VNI6_NET_2_VMS}    network=@{VNI6_NETWORKS}[2]    subnet=${prefix_net2}
+    ${VM_IP_NET3} =    OpenStackOperations.Collect VM IPv6 SLAAC Addresses    fail_on_none=false    vm_list=${VNI6_NET_3_VMS}    network=@{VNI6_NETWORKS}[3]    subnet=${prefix_net3}
+    ${status}    ${message}    Run Keyword And Ignore Error    BuiltIn.Should Not Contain    ${VM_IP_NET2}    None
+    Run Keyword If    '${status}' == 'FAIL'    OpenStack CLI    openstack console log show @{VNI6_NET_2_VMS}[0]    30s
+    ${status}    ${message}    Run Keyword And Ignore Error    BuiltIn.Should Not Contain    ${VM_IP_NET3}    None
+    Run Keyword If    '${status}' == 'FAIL'    OpenStack CLI    openstack console log show @{VNI6_NET_3_VMS}[0]    30s
+    OpenStackOperations.Copy DHCP Files From Control Node
+    BuiltIn.Should Not Contain    ${VM_IP_NET2}    None
+    BuiltIn.Should Not Contain    ${VM_IP_NET3}    None
+    BuiltIn.Wait Until Keyword Succeeds    60s    5s    OVSDB.Verify Vni Segmentation Id and Tunnel Id    @{VNI6_NET_2_PORTS}[0]    @{VNI6_NET_3_PORTS}[0]    @{VNI6_NETWORKS}[2]
+    ...    @{VNI6_NETWORKS}[3]    @{VM_IP_NET2}[0]    @{VM_IP_NET3}[0]    ${IP}
+
+*** Keywords ***
+Start Suite
+    [Documentation]    Create Basic setup for the feature. Creates single network, subnet, two ports and two VMs.
+    ...    Create Two VMs for TC1 : (VM1, N1, Compute1) and (VM2, N2, Compute2) and R1
+    VpnOperations.Basic Suite Setup
+    OpenStackOperations.Create Allow All SecurityGroup    ${VNI6_SECURITY_GROUP}    IPv6
+    OpenStackOperations.Create Network    @{VNI6_NETWORKS}[0]
+    OpenStackOperations.Create Network    @{VNI6_NETWORKS}[1]
+    OpenStackOperations.Create SubNet    @{VNI6_NETWORKS}[0]    @{VNI6_SUBNETS}[0]    @{VNI6_SUBNET_CIDRS}[0]    ${NET0_ADDITIONAL_ARGS}
+    OpenStackOperations.Create SubNet    @{VNI6_NETWORKS}[1]    @{VNI6_SUBNETS}[1]    @{VNI6_SUBNET_CIDRS}[1]    ${NET1_ADDITIONAL_ARGS}
+    OpenStackOperations.Create Port    @{VNI6_NETWORKS}[0]    @{VNI6_NET_0_PORTS}[0]    sg=${VNI6_SECURITY_GROUP}
+    OpenStackOperations.Create Port    @{VNI6_NETWORKS}[1]    @{VNI6_NET_1_PORTS}[0]    sg=${VNI6_SECURITY_GROUP}
+    OpenStackOperations.Create Router    @{VNI6_ROUTER}[0]
+    OpenStackOperations.Add Router Interface    @{VNI6_ROUTER}[0]    @{VNI6_SUBNETS}[0]
+    OpenStackOperations.Add Router Interface    @{VNI6_ROUTER}[0]    @{VNI6_SUBNETS}[1]
+    ${interface_output} =    OpenStackOperations.Show Router Interface    @{VNI6_ROUTER}[0]
+    ${GWMAC_ADDRS}    ${GWIP_ADDRS} =    VpnOperations.Get Gateway MAC And IP Address    @{VNI6_ROUTER}[0]
+    BuiltIn.Set Suite Variable    ${GWMAC_ADDRS}
+    BuiltIn.Set Suite Variable    ${GWIP_ADDRS}
+    ${router_list} =    BuiltIn.Create List    @{VNI6_ROUTER}[0]
+    OpenStackOperations.Create Vm Instance With Port On Compute Node    @{VNI6_NET_0_PORTS}[0]    @{VNI6_NET_0_VMS}[0]    ${OS_CMP1_HOSTNAME}    sg=${VNI6_SECURITY_GROUP}
+    OpenStackOperations.Create Vm Instance With Port On Compute Node    @{VNI6_NET_1_PORTS}[0]    @{VNI6_NET_1_VMS}[0]    ${OS_CMP2_HOSTNAME}    sg=${VNI6_SECURITY_GROUP}
+    OpenStackOperations.Poll VM Is ACTIVE    @{VNI6_NET_0_VMS}[0]
+    OpenStackOperations.Poll VM Is ACTIVE    @{VNI6_NET_1_VMS}[0]
+    @{networks} =    BuiltIn.Create List    @{VNI6_NETWORKS}[0]    @{VNI6_NETWORKS}[1]
+    @{subnet_cidrs} =    BuiltIn.Create List    @{VNI6_SUBNET_CIDRS}[0]    @{VNI6_SUBNET_CIDRS}[1]
+    BuiltIn.Wait Until Keyword Succeeds    30s    10s    OpenStackOperations.Wait For Routes To Propogate    ${networks}    ${subnet_cidrs}
+    ${prefix_net0} =    Replace String    @{VNI6_SUBNET_CIDRS}[0]    ::/64    (:[a-f0-9]{,4}){,4}
+    ${status}    ${message}    Run Keyword And Ignore Error    BuiltIn.Wait Until Keyword Succeeds    3x    60s    OpenStackOperations.Collect VM IPv6 SLAAC Addresses
+    ...    fail_on_none=true    vm_list=${VNI6_NET_0_VMS}    network=@{VNI6_NETWORKS}[0]    subnet=${prefix_net0}
+    ${prefix_net1} =    Replace String    @{VNI6_SUBNET_CIDRS}[1]    ::/64    (:[a-f0-9]{,4}){,4}
+    ${status}    ${message}    Run Keyword And Ignore Error    BuiltIn.Wait Until Keyword Succeeds    3x    60s    OpenStackOperations.Collect VM IPv6 SLAAC Addresses
+    ...    fail_on_none=true    vm_list=${VNI6_NET_1_VMS}    network=@{VNI6_NETWORKS}[1]    subnet=${prefix_net1}
+    ${VM_IP_NET0} =    OpenStackOperations.Collect VM IPv6 SLAAC Addresses    fail_on_none=false    vm_list=${VNI6_NET_0_VMS}    network=@{VNI6_NETWORKS}[0]    subnet=${prefix_net0}
+    ${VM_IP_NET1} =    OpenStackOperations.Collect VM IPv6 SLAAC Addresses    fail_on_none=false    vm_list=${VNI6_NET_1_VMS}    network=@{VNI6_NETWORKS}[1]    subnet=${prefix_net1}
+    ${status}    ${message}    Run Keyword And Ignore Error    BuiltIn.Should Not Contain    ${VM_IP_NET0}    None
+    Run Keyword If    '${status}' == 'FAIL'    OpenStack CLI    openstack console log show @{VNI6_NET_0_VMS}[0]    30s
+    ${status}    ${message}    Run Keyword And Ignore Error    BuiltIn.Should Not Contain    ${VM_IP_NET1}    None
+    Run Keyword If    '${status}' == 'FAIL'    OpenStack CLI    openstack console log show @{VNI6_NET_1_VMS}[0]    30s
+    OpenStackOperations.Copy DHCP Files From Control Node
+    BuiltIn.Set Suite Variable    ${VM_IP_NET0}
+    BuiltIn.Set Suite Variable    ${VM_IP_NET1}
+    BuiltIn.Should Not Contain    ${VM_IP_NET0}    None
+    BuiltIn.Should Not Contain    ${VM_IP_NET1}    None
index 35e691bfedc2bbcf3b4323fede08b62ad2c76955..0783bde9e98d67ce4862f4a7e371aeab167759a0 100644 (file)
@@ -12,4 +12,5 @@ integration/test/csit/suites/netvirt/vpnservice/arp_learning.robot
 integration/test/csit/suites/netvirt/l2l3_gatewaymac_arp.robot
 integration/test/csit/suites/netvirt/vnibasedl2switching/vnibasedl2switching.robot
 integration/test/csit/suites/netvirt/vnibasedl3forwarding/vnibasedl3forwarding.robot
+integration/test/csit/suites/netvirt/vnibasedIpv6forwarding/vnibasedIpv6forwarding.robot
 integration/test/csit/suites/integration/Create_JVM_Plots.robot