X-Git-Url: https://gerrit.opnfv.org/gerrit/gitweb?a=blobdiff_plain;f=sdnvpn%2Ftest%2Ffunctest%2Ftestcase_3.py;h=416af39ab71d9848ba15ed7a0ab2751c703ae934;hb=b5b2a3abd74f84943cf3fab7ca7da591d326661c;hp=aedf0ce4371b5742e08175f8fd8c33b51b22ee25;hpb=4c9d7aa555b450c5c3cb88debed7f2f62f884346;p=sdnvpn.git diff --git a/sdnvpn/test/functest/testcase_3.py b/sdnvpn/test/functest/testcase_3.py index aedf0ce..416af39 100644 --- a/sdnvpn/test/functest/testcase_3.py +++ b/sdnvpn/test/functest/testcase_3.py @@ -11,11 +11,7 @@ # - 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")