#!/usr/bin/python # # Copyright (c) 2015 All rights reserved # This program and the accompanying materials # are made available under the terms of the Apache License, Version 2.0 # which accompanies this distribution, and is available at # # http://www.apache.org/licenses/LICENSE-2.0 # import sys import time import os import functest.utils.functest_logger as ft_logger import functest.utils.functest_utils as ft_utils import functest.utils.openstack_utils as os_utils import re logger = ft_logger.Logger("sndvpn_test_utils").getLogger() REPO_PATH = os.environ['repos_dir'] + '/sdnvpn/' config_file = REPO_PATH + 'test/functest/config.yaml' DEFAULT_FLAVOR = ft_utils.get_parameter_from_yaml( "defaults.flavor", config_file) def create_network(neutron_client, net, subnet1, cidr1, router, subnet2=None, cidr2=None): network_dic = os_utils.create_network_full(neutron_client, net, subnet1, router, cidr1) if not network_dic: logger.error( "There has been a problem when creating the neutron network") sys.exit(-1) net_id = network_dic["net_id"] subnet_id = network_dic["subnet_id"] router_id = network_dic["router_id"] if subnet2 is not None: logger.debug("Creating and attaching a second subnet...") subnet_id = os_utils.create_neutron_subnet( neutron_client, subnet2, cidr2, net_id) if not subnet_id: logger.error( "There has been a problem when creating the second subnet") sys.exit(-1) logger.debug("Subnet '%s' created successfully" % subnet_id) return net_id, subnet_id, router_id def create_instance(nova_client, name, image_id, network_id, sg_id, secgroup_name=None, fixed_ip=None, compute_node='', userdata=None, files=None, **kwargs ): if 'flavor' not in kwargs: kwargs['flavor'] = DEFAULT_FLAVOR logger.info("Creating instance '%s'..." % name) logger.debug( "Configuration:\n name=%s \n flavor=%s \n image=%s \n" " network=%s\n secgroup=%s \n hypervisor=%s \n" " fixed_ip=%s\n files=%s\n userdata=\n%s\n" % (name, kwargs['flavor'], image_id, network_id, sg_id, compute_node, fixed_ip, files, userdata)) instance = os_utils.create_instance_and_wait_for_active( kwargs['flavor'], image_id, network_id, name, config_drive=True, userdata=userdata, av_zone=compute_node, fixed_ip=fixed_ip, files=files) if instance is None: logger.error("Error while booting instance.") sys.exit(-1) # Retrieve IP of INSTANCE # instance_ip = instance.networks.get(network_id)[0] if secgroup_name: logger.debug("Adding '%s' to security group '%s'..." % (name, secgroup_name)) else: logger.debug("Adding '%s' to security group '%s'..." % (name, sg_id)) os_utils.add_secgroup_to_instance(nova_client, instance.id, sg_id) return instance def generate_ping_userdata(ips_array): ips = "" for ip in ips_array: ips = ("%s %s" % (ips, ip)) ips = ips.replace(' ', ' ') return ("#!/bin/sh\n" "set%s\n" "while true; do\n" " for i do\n" " ip=$i\n" " ping -c 1 $ip 2>&1 >/dev/null\n" " RES=$?\n" " if [ \"Z$RES\" = \"Z0\" ] ; then\n" " echo ping $ip OK\n" " else echo ping $ip KO\n" " fi\n" " done\n" " sleep 1\n" "done\n" % ips) def generate_userdata_common(): return ("#!/bin/sh\n" "sudo mkdir -p /home/cirros/.ssh/\n" "sudo chown cirros:cirros /home/cirros/.ssh/\n" "sudo chown cirros:cirros /home/cirros/id_rsa\n" "mv /home/cirros/id_rsa /home/cirros/.ssh/\n" "sudo echo ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgnWtSS98Am516e" "stBsq0jbyOB4eLMUYDdgzsUHsnxFQCtACwwAg9/2uq3FoGUBUWeHZNsT6jcK9" "sCMEYiS479CUCzbrxcd8XaIlK38HECcDVglgBNwNzX/WDfMejXpKzZG61s98rU" "ElNvZ0YDqhaqZGqxIV4ejalqLjYrQkoly3R+2k= " "cirros@test1>/home/cirros/.ssh/authorized_keys\n" "sudo chown cirros:cirros /home/cirros/.ssh/authorized_keys\n" "chmod 700 /home/cirros/.ssh\n" "chmod 644 /home/cirros/.ssh/authorized_keys\n" "chmod 600 /home/cirros/.ssh/id_rsa\n" ) def generate_userdata_with_ssh(ips_array): u1 = generate_userdata_common() ips = "" for ip in ips_array: ips = ("%s %s" % (ips, ip)) ips = ips.replace(' ', ' ') u2 = ("#!/bin/sh\n" "set%s\n" "while true; do\n" " for i do\n" " ip=$i\n" " hostname=$(ssh -y -i /home/cirros/.ssh/id_rsa " "cirros@$ip 'hostname' /dev/null)\n" " RES=$?\n" " if [ \"Z$RES\" = \"Z0\" ]; then echo $ip $hostname;\n" " else echo $ip 'not reachable';fi;\n" " done\n" " sleep 1\n" "done\n" % ips) return (u1 + u2) def wait_for_instance(instance): logger.info("Waiting for instance %s to get a DHCP lease..." % instance.id) # The sleep this function replaced waited for 80s tries = 40 sleep_time = 2 pattern = "Lease of .* obtained, lease time" expected_regex = re.compile(pattern) console_log = "" while tries > 0 and not expected_regex.search(console_log): console_log = instance.get_console_output() time.sleep(sleep_time) tries -= 1 if not expected_regex.search(console_log): logger.error("Instance %s seems to have failed leasing an IP." % instance.id) return False return True def wait_for_instances_up(*args): check = [wait_for_instance(instance) for instance in args] return all(check) def wait_for_bgp_net_assoc(neutron_client, bgpvpn_id, net_id): tries = 30 sleep_time = 1 nets = [] logger.debug("Waiting for network %s to associate with BGPVPN %s " % (bgpvpn_id, net_id)) while tries > 0 and net_id not in nets: nets = os_utils.get_bgpvpn_networks(neutron_client, bgpvpn_id) time.sleep(sleep_time) tries -= 1 if net_id not in nets: logger.error("Association of network %s with BGPVPN %s failed" % (net_id, bgpvpn_id)) return False return True def wait_for_bgp_net_assocs(neutron_client, bgpvpn_id, *args): check = [wait_for_bgp_net_assoc(neutron_client, bgpvpn_id, id) for id in args] # Return True if all associations succeeded return all(check) def wait_for_bgp_router_assoc(neutron_client, bgpvpn_id, router_id): tries = 30 sleep_time = 1 routers = [] logger.debug("Waiting for router %s to associate with BGPVPN %s " % (bgpvpn_id, router_id)) while tries > 0 and router_id not in routers: routers = os_utils.get_bgpvpn_routers(neutron_client, bgpvpn_id) time.sleep(sleep_time) tries -= 1 if router_id not in routers: logger.error("Association of router %s with BGPVPN %s failed" % (router_id, bgpvpn_id)) return False return True def wait_for_bgp_router_assocs(neutron_client, bgpvpn_id, *args): check = [wait_for_bgp_router_assoc(neutron_client, bgpvpn_id, id) for id in args] # Return True if all associations succeeded return all(check)