diff options
Diffstat (limited to 'sdnvpn/lib')
-rw-r--r-- | sdnvpn/lib/results.py | 20 | ||||
-rw-r--r-- | sdnvpn/lib/utils.py | 118 |
2 files changed, 129 insertions, 9 deletions
diff --git a/sdnvpn/lib/results.py b/sdnvpn/lib/results.py index 679284e..790a916 100644 --- a/sdnvpn/lib/results.py +++ b/sdnvpn/lib/results.py @@ -29,11 +29,17 @@ class Results(object): vm_source, vm_target, expected="PASS", timeout=30): + ip_target = vm_target.networks.itervalues().next()[0] + self.get_ping_status_target_ip(vm_source, vm_target.name, + ip_target, expected, timeout) + + def get_ping_status_target_ip(self, + vm_source, + target_name, + ip_target, + expected="PASS", timeout=30): console_log = vm_source.get_console_output() - ip_source = vm_source.networks.itervalues().next()[0] - ip_target = vm_target.networks.itervalues().next()[0] - if "request failed" in console_log: # Normally, cirros displays this message when userdata fails logger.debug("It seems userdata is not supported in " @@ -46,11 +52,11 @@ class Results(object): test_case_name = ("'%s' %s '%s'" % (vm_source.name, expected_result, - vm_target.name)) + target_name)) logger.debug("%sPing\n%sfrom '%s' (%s)\n%sto '%s' (%s).\n" "%s-->Expected result: %s.\n" % (tab, tab, vm_source.name, ip_source, - tab, vm_target.name, ip_target, + tab, target_name, ip_target, tab, expected_result)) while True: console_log = vm_source.get_console_output() @@ -60,7 +66,7 @@ class Results(object): last_n_lines = lines[-5:] if ("ping %s OK" % ip_target) in last_n_lines: msg = ("'%s' can ping '%s'" - % (vm_source.name, vm_target.name)) + % (vm_source.name, target_name)) if expected == "PASS": logger.debug("[PASS] %s" % msg) self.add_success(test_case_name) @@ -71,7 +77,7 @@ class Results(object): break elif ("ping %s KO" % ip_target) in last_n_lines: msg = ("'%s' cannot ping '%s'" % - (vm_source.name, vm_target.name)) + (vm_source.name, target_name)) if expected == "FAIL": logger.debug("[PASS] %s" % msg) self.add_success(test_case_name) diff --git a/sdnvpn/lib/utils.py b/sdnvpn/lib/utils.py index 78493be..0ab8b84 100644 --- a/sdnvpn/lib/utils.py +++ b/sdnvpn/lib/utils.py @@ -14,6 +14,7 @@ import time import requests import re import subprocess +from concurrent.futures import ThreadPoolExecutor import functest.utils.openstack_utils as os_utils from opnfv.deployment.factory import Factory as DeploymentFactory @@ -27,6 +28,26 @@ common_config = sdnvpn_config.CommonConfig() ODL_USER = 'admin' ODL_PASS = 'admin' +executor = ThreadPoolExecutor(5) + + +class ExtraRoute(object): + """ + Class to represent extra route for a router + """ + def __init__(self, destination, nexthop): + self.destination = destination + self.nexthop = nexthop + + +class AllowedAddressPair(object): + """ + Class to represent allowed address pair for a neutron port + """ + def __init__(self, ipaddress, macaddress): + self.ipaddress = ipaddress + self.macaddress = macaddress + def create_custom_flavor(): return os_utils.get_or_create_flavor(common_config.custom_flavor_name, @@ -89,6 +110,37 @@ def create_network(neutron_client, net, subnet1, cidr1, return net_id, subnet_id, router_id +def get_port(neutron_client, instance_id): + ports = os_utils.get_port_list(neutron_client) + if ports is not None: + for port in ports: + if port['device_id'] == instance_id: + return port + return None + + +def update_port_allowed_address_pairs(neutron_client, port_id, address_pairs): + if len(address_pairs) <= 0: + return + allowed_address_pairs = [] + for address_pair in address_pairs: + address_pair_dict = {'ip_address': address_pair.ipaddress, + 'mac_address': address_pair.macaddress} + allowed_address_pairs.append(address_pair_dict) + json_body = {'port': { + "allowed_address_pairs": allowed_address_pairs + }} + + try: + port = neutron_client.update_port(port=port_id, + body=json_body) + return port['port']['id'] + except Exception as e: + logger.error("Error [update_neutron_port(neutron_client, '%s', '%s')]:" + " %s" % (port_id, address_pairs, e)) + return None + + def create_instance(nova_client, name, image_id, @@ -208,6 +260,19 @@ def generate_userdata_with_ssh(ips_array): return (u1 + u2) +def generate_userdata_interface_create(interface_name, interface_number, + ip_Address, net_mask): + return ("#!/bin/sh\n" + "set -xe\n" + "sudo useradd -m sdnvpn\n" + "sudo adduser sdnvpn sudo\n" + "sudo echo sdnvpn:opnfv | chpasswd\n" + "sleep 20\n" + "sudo ifconfig %s:%s %s netmask %s up\n" + % (interface_name, interface_number, + ip_Address, net_mask)) + + def get_installerHandler(): installer_type = str(os.environ['INSTALLER_TYPE'].lower()) installer_ip = get_installer_ip() @@ -247,9 +312,8 @@ def get_instance_ip(instance): return instance_ip -def wait_for_instance(instance, pattern=".* login:"): +def wait_for_instance(instance, pattern=".* login:", tries=40): logger.info("Waiting for instance %s to boot up" % instance.id) - tries = 40 sleep_time = 2 expected_regex = re.compile(pattern) console_log = "" @@ -276,6 +340,23 @@ def wait_for_instances_get_dhcp(*instances): return all(check) +def async_Wait_for_instances(instances, tries=40): + if len(instances) <= 0: + return + futures = [] + for instance in instances: + future = executor.submit(wait_for_instance, + instance, + ".* login:", + tries) + futures.append(future) + results = [] + for future in futures: + results.append(future.result()) + if False in results: + logger.error("one or more instances is not yet booted up") + + def wait_for_bgp_net_assoc(neutron_client, bgpvpn_id, net_id): tries = 30 sleep_time = 1 @@ -741,6 +822,39 @@ def get_nova_instances_quota(nova_client): raise +def update_router_extra_route(neutron_client, router_id, extra_routes): + if len(extra_routes) <= 0: + return + routes_list = [] + for extra_route in extra_routes: + route_dict = {'destination': extra_route.destination, + 'nexthop': extra_route.nexthop} + routes_list.append(route_dict) + json_body = {'router': { + "routes": routes_list + }} + + try: + neutron_client.update_router(router_id, body=json_body) + return True + except Exception as e: + logger.error("Error in updating router with extra route: %s" % e) + raise + + +def update_router_no_extra_route(neutron_client, router_ids): + json_body = {'router': { + "routes": [ + ]}} + + for router_id in router_ids: + try: + neutron_client.update_router(router_id, body=json_body) + return True + except Exception as e: + logger.error("Error in clearing extra route: %s" % e) + + def get_ovs_groups(compute_node_list, ovs_br_list, of_protocol="OpenFlow13"): """ Gets, as input, a list of compute nodes and a list of OVS bridges |