diff options
Diffstat (limited to 'testcases/vPing')
-rw-r--r-- | testcases/vPing/CI/libraries/vPing.py | 213 |
1 files changed, 96 insertions, 117 deletions
diff --git a/testcases/vPing/CI/libraries/vPing.py b/testcases/vPing/CI/libraries/vPing.py index b81ebb881..e14155357 100644 --- a/testcases/vPing/CI/libraries/vPing.py +++ b/testcases/vPing/CI/libraries/vPing.py @@ -16,26 +16,11 @@ import os, time, subprocess, logging, argparse, yaml import pprint import novaclient.v2.client as novaclient -import neutronclient.client as neutronclient -#import novaclient.v1_1.client as novaclient -import cinderclient.v1.client as cinderclient pp = pprint.PrettyPrinter(indent=4) -EXIT_CODE = -1 -HOME = os.environ['HOME']+"/" -with open(HOME+'.functest/functest.yaml') as f: - functest_yaml = yaml.safe_load(f) -f.close() - -PING_TIMEOUT = functest_yaml.get("vping").get("ping_timeout") -NAME_VM_1 = functest_yaml.get("vping").get("vm_name_1") -NAME_VM_2 = functest_yaml.get("vping").get("vm_name_2") -GLANCE_IMAGE_NAME = functest_yaml.get("general").get("openstack").get("image_name") -NEUTRON_NET_NAME = functest_yaml.get("general").get("openstack").get("neutron_net_name") -FLAVOR = functest_yaml.get("vping").get("vm_flavor") - parser = argparse.ArgumentParser() +parser.add_argument("repo_path", help="Path to the repository") parser.add_argument("-d", "--debug", help="Debug mode", action="store_true") args = parser.parse_args() @@ -53,6 +38,19 @@ ch.setFormatter(formatter) logger.addHandler(ch) +HOME = os.environ['HOME']+"/" +with open(args.repo_path+"testcases/config_functest.yaml") as f: + functest_yaml = yaml.safe_load(f) +f.close() + +VM_BOOT_TIMEOUT = 180 +PING_TIMEOUT = functest_yaml.get("vping").get("ping_timeout") +NAME_VM_1 = functest_yaml.get("vping").get("vm_name_1") +NAME_VM_2 = functest_yaml.get("vping").get("vm_name_2") +GLANCE_IMAGE_NAME = functest_yaml.get("general").get("openstack").get("image_name") +NEUTRON_PRIVATE_NET_NAME = functest_yaml.get("general").get("openstack").get("neutron_private_net_name") +FLAVOR = functest_yaml.get("vping").get("vm_flavor") + def pMsg(value): """pretty printing""" @@ -101,10 +99,18 @@ def get_server(creds, servername): def waitVmActive(nova,vm): # sleep and wait for VM status change - while get_status(nova,vm) != "ACTIVE": - time.sleep(3) - logger.debug("Status: %s" % vm.status) - logger.debug("Status: %s" % vm.status) + sleep_time = 3 + count = VM_BOOT_TIMEOUT / sleep_time + while True: + status = get_status(nova,vm) + logger.debug("Status: %s" % status) + if status == "ACTIVE": + return True + if status == "ERROR" or count == 0: + return False + count-=1 + time.sleep(sleep_time) + return False def get_status(nova,vm): vm = nova.servers.get(vm.id) @@ -114,42 +120,43 @@ def get_status(nova,vm): def main(): creds = get_credentials("nova") nova = novaclient.Client(**creds) - cinder = cinderclient.Client(**creds) - - """ - # print images and server resources - # print nova_images - print_title("images list") - pMsg(nova.images.list()) - print_title("servers list") - pMsg(nova.servers.list()) - """ - # Check if the given image is created - images=nova.images.list() - image_found = False - for image in images: - if image.name == GLANCE_IMAGE_NAME: - logger.info("Glance image found '%s'" %image.name) - image_found = True - if not image_found: - logger.error("ERROR: Glance image %s not found." % GLANCE_IMAGE_NAME) + EXIT_CODE = -1 + image = None + network = None + flavor = None + + # Check if the given image exists + try: + image = nova.images.find(name = GLANCE_IMAGE_NAME) + logger.info("Glance image found '%s'" % GLANCE_IMAGE_NAME) + except: + logger.error("ERROR: Glance image '%s' not found." % GLANCE_IMAGE_NAME) logger.info("Available images are: ") pMsg(nova.images.list()) exit(-1) - # Check if the given neutron network is created - networks=nova.networks.list() - network_found = False - for net in networks: - if net.human_id == NEUTRON_NET_NAME: - logger.info("Network found '%s'" %net.human_id) - network_found = True - if not network_found: - logger.error("Neutron network %s not found." % NEUTRON_NET_NAME) + # Check if the given neutron network exists + try: + network = nova.networks.find(label = NEUTRON_PRIVATE_NET_NAME) + logger.info("Network found '%s'" % NEUTRON_PRIVATE_NET_NAME) + except: + logger.error("Neutron network '%s' not found." % NEUTRON_PRIVATE_NET_NAME) logger.info("Available networks are: ") pMsg(nova.networks.list()) exit(-1) + # Check if the given flavor exists + try: + flavor = nova.flavors.find(name = FLAVOR) + logger.info("Flavor found '%s'" % FLAVOR) + except: + logger.error("Flavor '%s' not found." % FLAVOR) + logger.info("Available flavors are: ") + pMsg(nova.flavor.list()) + exit(-1) + + + # Deleting instances if they exist servers=nova.servers.list() for server in servers: if server.name == NAME_VM_1 or server.name == NAME_VM_2: @@ -160,106 +167,75 @@ def main(): # boot VM 1 # basic boot - # tune (e.g. flavor, images, network) to your specific openstack configuration here - m = NAME_VM_1 - f = nova.flavors.find(name = FLAVOR) - i = nova.images.find(name = GLANCE_IMAGE_NAME) - n = nova.networks.find(label = NEUTRON_NET_NAME) - u = "#cloud-config\npassword: opnfv\nchpasswd: { expire: False }\nssh_pwauth: True" - #k = "demo-key" + # tune (e.g. flavor, images, network) to your specific openstack configuration here # create VM - logger.info("Creating instance '%s'..." %m) - logger.debug("Configuration:\n name=%s \n flavor=%s \n image=%s \n network=%s \n userdata= \n%s" %(m,f,i,n,u)) + logger.info("Creating instance '%s'..." % NAME_VM_1) + logger.debug("Configuration:\n name=%s \n flavor=%s \n image=%s \n network=%s \n" %(NAME_VM_1,flavor,image,network)) vm1 = nova.servers.create( - name = m, - flavor = f, - image = i, - nics = [{"net-id": n.id}], - #key_name = k, - userdata = u, + name = NAME_VM_1, + flavor = flavor, + image = image, + nics = [{"net-id": network.id}] ) - #pMsg(vm1) - #wait until VM status is active - waitVmActive(nova,vm1) + if not waitVmActive(nova,vm1): + logger.error("Instance '%s' cannot be booted. Status is '%s'" % (NAME_VM_1,get_status(nova,vm1))) + return (EXIT_CODE) + else: + logger.info("Instance '%s' is ACTIVE." % NAME_VM_1) #retrieve IP of first VM logger.debug("Fetching IP...") - server = get_server(creds, m) - #pMsg(server.networks) + server = get_server(creds, NAME_VM_1) # theoretically there is only one IP address so we take the first element of the table # Dangerous! To be improved! - test_ip = server.networks.get(NEUTRON_NET_NAME)[0] - logger.debug("Instance '%s' got %s" %(m,test_ip)) - test_cmd = '/tmp/vping.sh %s'%test_ip - + test_ip = server.networks.get(NEUTRON_PRIVATE_NET_NAME)[0] + logger.debug("Instance '%s' got %s" %(NAME_VM_1,test_ip)) # boot VM 2 # we will boot then execute a ping script with cloud-init # the long chain corresponds to the ping procedure converted with base 64 - # tune (e.g. flavor, images, network) to your specific openstack configuration here - m = NAME_VM_2 - f = nova.flavors.find(name = FLAVOR) - i = nova.images.find(name = GLANCE_IMAGE_NAME) - n = nova.networks.find(label = NEUTRON_NET_NAME) - # use base 64 format becaus bad surprises with sh script with cloud-init but script is just pinging - #k = "demo-key" - u = "#cloud-config\npassword: opnfv\nchpasswd: { expire: False }\nssh_pwauth: True\nwrite_files:\n- encoding: b64\n path: /tmp/vping.sh\n permissions: '0777'\n owner: root:root\n content: IyEvYmluL2Jhc2gKCndoaWxlIHRydWU7IGRvCiBwaW5nIC1jIDEgJDEgMj4mMSA+L2Rldi9udWxsCiBSRVM9JD8KIGlmIFsgIlokUkVTIiA9ICJaMCIgXSA7IHRoZW4KICBlY2hvICJ2UGluZyBPSyIKICBzbGVlcCAxMAogIHN1ZG8gc2h1dGRvd24gLWggbm93CiAgYnJlYWsKIGVsc2UKICBlY2hvICJ2UGluZyBLTyIKIGZpCiBzbGVlcCAxCmRvbmUK\nruncmd:\n - [ sh, -c, %s]"%test_cmd + # tune (e.g. flavor, images, network) to your specific openstack configuration here + u = "#!/bin/sh\n\nwhile true; do\n ping -c 1 %s 2>&1 >/dev/null\n RES=$?\n if [ \"Z$RES\" = \"Z0\" ] ; then\n echo 'vPing OK'\n break\n else\n echo 'vPing KO'\n fi\n sleep 1\ndone\n"%test_ip + # create VM - logger.info("Creating instance '%s'..." %m) - logger.debug("Configuration:\n name=%s \n flavor=%s \n image=%s \n network=%s \n userdata= \n%s" %(m,f,i,n,u)) + logger.info("Creating instance '%s'..." % NAME_VM_2) + logger.debug("Configuration:\n name=%s \n flavor=%s \n image=%s \n network=%s \n userdata= \n%s" %(NAME_VM_2,flavor,image,network,u)) vm2 = nova.servers.create( - name = m, - flavor = f, - image = i, - nics = [{"net-id": n.id}], - #key_name = k, + name = NAME_VM_2, + flavor = flavor, + image = image, + nics = [{"net-id": network.id}], userdata = u, - #security_groups = s, - #config_drive = v.id ) - # The injected script will shutdown the VM2 when the ping works - # The console-log method is more consistent but doesn't work yet - - waitVmActive(nova,vm2) - logger.info("Waiting for ping, timeout is %d sec..." % PING_TIMEOUT) - sec = 0 - while True: - status = get_status(nova, vm2) - #print status - if status == "SHUTOFF" : - EXIT_CODE = 0 - logger.info("vPing SUCCESSFUL after %d sec" % sec) - break - if sec == PING_TIMEOUT: - logger.info("Timeout. vPing UNSUCCESSFUL.") - break - time.sleep(1) - sec+=1 + if not waitVmActive(nova,vm2): + logger.error("Instance '%s' cannot be booted. Status is '%s'" % (NAME_VM_2,get_status(nova,vm2))) + return (EXIT_CODE) + else: + logger.info("Instance '%s' is ACTIVE." % NAME_VM_2) - """ - # I leave this here until we fix the console-log output sec = 0 console_log = vm2.get_console_output() - while not ("vPing" in console_log): + while True: time.sleep(1) console_log = vm2.get_console_output() - print "--"+console_log - + #print "--"+console_log # report if the test is failed - if "vPing" in console_log: - pMsg("vPing is OK") + if "vPing OK" in console_log: + logger.info("vPing is OK") + EXIT_CODE = 0 break else: - pMsg("no vPing detected....") + logger.info("No vPing detected...") sec+=1 if sec == PING_TIMEOUT: + logger.info("Timeout reached.") break - """ + # delete both VMs logger.debug("Deleting Instances...") @@ -268,8 +244,11 @@ def main(): nova.servers.delete(vm2) logger.debug("Instance %s terminated." % NAME_VM_2) + if EXIT_CODE == 0: + logger.info("vPing OK") + else: + logger.error("vPing FAILED") - logger.debug("EXIT_CODE=%s" % EXIT_CODE) exit(EXIT_CODE) |