Testcase 3 Apex compatibility fixes
[sdnvpn.git] / sdnvpn / test / functest / testcase_3.py
index aedf0ce..416af39 100644 (file)
 #   - Set up a Quagga instance in the functest container
 #   - Start a BGP router with OpenDaylight
 #   - Add the functest Quagga as a neighbor
-#   - Verify that the OpenDaylight and functest Quaggas peer
-# - Exchange routing information with Quagga:
-#   - Create a network, instance and BGPVPN in OpenStack
-#   - Verify the route to the instance is present in the OpenDaylight FIB
-#   - Verify that the functest Quagga also learns these routes
+#   - Verify that the OpenDaylight and gateway Quagga peer
 import os
 import argparse
 
@@ -51,8 +47,12 @@ def main():
 
     openstack_nodes = test_utils.get_nodes()
 
+    # node.is_odl() doesn't work in Apex
+    # https://jira.opnfv.org/browse/RELENG-192
     controllers = [node for node in openstack_nodes
-                   if node.is_odl()]
+                   if "running" in
+                   node.run_cmd("sudo systemctl status opendaylight")]
+    computes = [node for node in openstack_nodes if node.is_compute()]
     msg = ("Verify that OpenDaylight can start/communicate with zrpcd/Quagga")
     results.record_action(msg)
     results.add_to_summary(0, "-")
@@ -66,70 +66,74 @@ def main():
         logger.info(msg)
         results.add_success(msg)
 
-    for controller in controllers:
-        logger.info("Starting bgp speaker of controller at IP %s "
-                    % controller.ip)
-        logger.info("Checking if zrpcd is "
-                    "running on the controller node")
-
-        cmd = "systemctl status zrpcd"
-        output = controller.run_cmd(cmd)
-        msg = ("zrpcd is running")
-
-        if not output:
-            logger.info("zrpcd is not running on the controller node")
-            results.add_failure(msg)
-        else:
-            logger.info("zrpcd is running on the controller node")
-            results.add_success(msg)
-
-        results.add_to_summary(0, "-")
-
-        # TODO here we need the external ip of the controller
-        start_quagga = "odl:configure-bgp -op start-bgp-server " \
-                       "--as-num 100 --router-id {0}".format(controller.ip)
-        test_utils.run_odl_cmd(controller, start_quagga)
-
-        logger.info("Checking if bgpd is running"
-                    " on the controller node")
-
-        # Check if there is a non-zombie bgpd process
-        output_bgpd = controller.run_cmd("ps --no-headers -C "
-                                         "bgpd -o state")
-        states = output_bgpd.split()
-        running = any([s != 'Z' for s in states])
-
-        msg = ("bgpd is running")
-        if not running:
-            logger.info("bgpd is not running on the controller node")
-            results.add_failure(msg)
-        else:
-            logger.info("bgpd is running on the controller node")
-            results.add_success(msg)
-
-        results.add_to_summary(0, "-")
-
-        stop_quagga = 'odl:configure-bgp -op stop-bgp-server'
-
-        test_utils.run_odl_cmd(controller, stop_quagga)
-
-        # disabled because of buggy upstream
-        # https://github.com/6WIND/zrpcd/issues/15
-        # logger.info("Checking if bgpd is still running"
-        #             " on the controller node")
-
-        # output_bgpd = controller.run_cmd("ps --no-headers -C " \
-        #                                  "bgpd -o state")
-        # states = output_bgpd.split()
-        # running = any([s != 'Z' for s in states])
-
-        # msg = ("bgpd is stopped")
-        # if not running:
-        #     logger.info("bgpd is not running on the controller node")
-        #     results.add_success(msg)
-        # else:
-        #     logger.info("bgpd is still running on the controller node")
-        #     results.add_failure(msg)
+    controller = controllers[0]  # We don't handle HA well
+    get_ext_ip_cmd = "sudo ip a | grep br-ex | grep inet | awk '{print $2}'"
+    ext_net_cidr = controller.run_cmd(get_ext_ip_cmd).split("/")
+    ext_net_mask = ext_net_cidr[1].split('\n')[0]
+    controller_ext_ip = ext_net_cidr[0]
+
+    logger.info("Starting bgp speaker of controller at IP %s "
+                % controller_ext_ip)
+    logger.info("Checking if zrpcd is "
+                "running on the controller node")
+
+    cmd = "systemctl status zrpcd"
+    output = controller.run_cmd(cmd)
+    msg = ("zrpcd is running")
+
+    if not output:
+        logger.info("zrpcd is not running on the controller node")
+        results.add_failure(msg)
+    else:
+        logger.info("zrpcd is running on the controller node")
+        results.add_success(msg)
+
+    results.add_to_summary(0, "-")
+
+    start_quagga = "odl:configure-bgp -op start-bgp-server " \
+                   "--as-num 100 --router-id {0}".format(controller_ext_ip)
+    test_utils.run_odl_cmd(controller, start_quagga)
+
+    logger.info("Checking if bgpd is running"
+                " on the controller node")
+
+    # Check if there is a non-zombie bgpd process
+    output_bgpd = controller.run_cmd("ps --no-headers -C "
+                                     "bgpd -o state")
+    states = output_bgpd.split()
+    running = any([s != 'Z' for s in states])
+
+    msg = ("bgpd is running")
+    if not running:
+        logger.info("bgpd is not running on the controller node")
+        results.add_failure(msg)
+    else:
+        logger.info("bgpd is running on the controller node")
+        results.add_success(msg)
+
+    results.add_to_summary(0, "-")
+
+    # We should be able to restart the speaker
+    # but the test is disabled because of buggy upstream
+    # https://github.com/6WIND/zrpcd/issues/15
+    # stop_quagga = 'odl:configure-bgp -op stop-bgp-server'
+    # test_utils.run_odl_cmd(controller, stop_quagga)
+
+    # logger.info("Checking if bgpd is still running"
+    #             " on the controller node")
+
+    # output_bgpd = controller.run_cmd("ps --no-headers -C " \
+    #                                  "bgpd -o state")
+    # states = output_bgpd.split()
+    # running = any([s != 'Z' for s in states])
+
+    # msg = ("bgpd is stopped")
+    # if not running:
+    #     logger.info("bgpd is not running on the controller node")
+    #     results.add_success(msg)
+    # else:
+    #     logger.info("bgpd is still running on the controller node")
+    #     results.add_failure(msg)
 
     # Taken from the sfc tests
     if not os.path.isfile(COMMON_CONFIG.ubuntu_image_path):
@@ -163,11 +167,19 @@ def main():
         TESTCASE_CONFIG.quagga_subnet_cidr,
         TESTCASE_CONFIG.quagga_router_name)
 
+    installer_type = str(os.environ['INSTALLER_TYPE'].lower())
+    if installer_type == "fuel":
+        disk = 'raw'
+    elif installer_type == "apex":
+        disk = 'qcow2'
+    else:
+        logger.error("Incompatible installer type")
+
     ubuntu_image_id = os_utils.create_glance_image(
         glance_client,
         COMMON_CONFIG.ubuntu_image_name,
         COMMON_CONFIG.ubuntu_image_path,
-        disk="qcow2",
+        disk,
         container="bare",
         public="public")
 
@@ -181,9 +193,25 @@ def main():
     # We also create the FIP first because it is used in the
     # cloud-init script.
     fip = os_utils.create_floating_ip(neutron_client)
-
+    # fake_fip is needed to bypass NAT
+    # see below for the reason why.
+    fake_fip = os_utils.create_floating_ip(neutron_client)
+    # pin quagga to some compute
+    compute_node = nova_client.hypervisors.list()[0]
+    quagga_compute_node = "nova:" + compute_node.hypervisor_hostname
+    # Map the hypervisor used above to a compute handle
+    # returned by releng's manager
+    for comp in computes:
+        if compute_node.host_ip in comp.run_cmd("sudo ip a"):
+            compute = comp
+            break
     quagga_bootstrap_script = quagga.gen_quagga_setup_script(
-        controllers[0].ip, fip['fip_addr'])
+        controller_ext_ip,
+        fake_fip['fip_addr'],
+        ext_net_mask)
+
+    test_utils.create_custom_flavor()
+
     quagga_vm = test_utils.create_instance(
         nova_client,
         TESTCASE_CONFIG.quagga_instance_name,
@@ -191,8 +219,10 @@ def main():
         quagga_net_id,
         sg_id,
         fixed_ip=TESTCASE_CONFIG.quagga_instance_ip,
-        flavor=TESTCASE_CONFIG.quagga_instance_flavor,
-        userdata=quagga_bootstrap_script)
+        flavor=COMMON_CONFIG.custom_flavor_name,
+        userdata=quagga_bootstrap_script,
+        compute_node=quagga_compute_node)
+
     fip_added = os_utils.add_floating_ip(nova_client,
                                          quagga_vm.id,
                                          fip['fip_addr'])
@@ -203,9 +233,11 @@ def main():
     else:
         results.add_failure(msg)
 
+    test_utils.attach_instance_to_ext_br(quagga_vm, compute)
+
     testcase = "Bootstrap quagga inside an OpenStack instance"
-    success = False
-    if success:
+    cloud_init_success = test_utils.wait_for_cloud_init(quagga_vm)
+    if cloud_init_success:
         results.add_success(testcase)
     else:
         results.add_failure(testcase)
@@ -215,39 +247,12 @@ def main():
     results.add_to_summary(1, "Peer Quagga with OpenDaylight")
     results.add_to_summary(0, '-')
 
-    neighbor = quagga.odl_add_neighbor(fip['fip_addr'], controller)
+    neighbor = quagga.odl_add_neighbor(fake_fip['fip_addr'],
+                                       controller_ext_ip,
+                                       controller)
     peer = quagga.check_for_peering(controller)
 
-    image_id = os_utils.create_glance_image(glance_client,
-                                            TESTCASE_CONFIG.image_name,
-                                            COMMON_CONFIG.image_path,
-                                            disk=COMMON_CONFIG.image_format,
-                                            container="bare",
-                                            public=True)
-
-    instance = test_utils.create_instance(
-        nova_client,
-        TESTCASE_CONFIG.instance_1_name,
-        image_id,
-        net_id,
-        sg_id,
-        fixed_ip=TESTCASE_CONFIG.instance_1_ip,
-        secgroup_name=TESTCASE_CONFIG.secgroup_name)
-
-    kwargs = {"import_targets": TESTCASE_CONFIG.import_targets,
-              "export_targets": TESTCASE_CONFIG.export_targets,
-              "route_targets": TESTCASE_CONFIG.export_targets,
-              "name": "bgpvpn-3-1"}
-
-    bgpvpn = os_utils.create_bgpvpn(neutron_client, **kwargs)
-    bgpvpn_id = bgpvpn['bgpvpn']['id']
-    os_utils.create_network_association(
-        neutron_client, bgpvpn_id, net_id)
-
-    test_utils.wait_for_instance(instance)
-
-    exchange = quagga.check_for_route_exchange(fip['fip_addr'])
-    if neighbor and peer and exchange:
+    if neighbor and peer:
         results.add_success("Peering with quagga")
     else:
         results.add_failure("Peering with quagga")