diff options
-rw-r--r-- | docs/functest.rst | 20 | ||||
-rw-r--r-- | testcases/config_functest.py | 57 | ||||
-rw-r--r-- | testcases/functest.yaml | 10 | ||||
-rw-r--r-- | testcases/vPing/CI/libraries/vPing.py | 154 |
4 files changed, 75 insertions, 166 deletions
diff --git a/docs/functest.rst b/docs/functest.rst index 7db6f250d..5dd3c53eb 100644 --- a/docs/functest.rst +++ b/docs/functest.rst @@ -180,10 +180,11 @@ The goal of this test can be described as follow:: | +------------------>| Test | | | VM2 pings VM1 | | | | | | - | | If ping: | | - | | shutdown VM2, OK | | - | | else (timeout) | | - | | test KO | | + | | Check console log | | + | | If ping: | | + | | exit OK | | + | | else (timeout) | | + | | exit KO | | | | | | | | | | +-------------+ +-------------+ @@ -227,18 +228,19 @@ This script will: * Install Tempest * Retrieve test scenarios * Setup ODL environment - * Create temporary neutron external network * Create temporary neutron private network * Create router to connect both * Create Glance images Useful links: + .. _`OpenRC`: http://docs.openstack.org/user-guide/common/cli_set_environment_variables_using_openstack_rc.html .. _`Rally installation procedure`: https://rally.readthedocs.org/en/latest/tutorial/step_0_installation.html .. _`config_test.py` : https://git.opnfv.org/cgit/functest/tree/testcases/config_functest.py + .. _`config_test.py` : https://git.opnfv.org/cgit/functest/tree/testcases/functest.yaml @@ -276,12 +278,6 @@ Do not change the directories structure * image_url: URL of the image to be downloaded * image_disk_format: glance image disk format (raw, qcow2, ...) - * neutron_public_net_name: name of the OpenStack external network. If not existing, it will be created - * neutron_public_subnet_name: external network subnet to be created if not existing - * neutron_public_subnet_cidr: range of the external subnet. IMPORTANT: this subnet range must be reachable from the jumpstart server - * neutron_public_subnet_start: start IP - * neutron_public_subnet_end: end IP - * neutron_private_net_name: name of an OpenStack private network. If not existing, it will be created * neutron_private_subnet_name: private subnet network to be created if not existing * neutron_private_subnet_cidr: range of the private subnet. @@ -448,7 +444,7 @@ vPing ===== The test can be executed with command:: - #python ~./.functest/vPing.py + #python ~./.functest/vPing.py -d .. _automatictest: diff --git a/testcases/config_functest.py b/testcases/config_functest.py index 76020046e..4ff3f7d48 100644 --- a/testcases/config_functest.py +++ b/testcases/config_functest.py @@ -72,12 +72,6 @@ BENCH_TESTS_DIR = HOME + functest_yaml.get("general").get("directories").get("di VPING_DIR = HOME + functest_yaml.get("general").get("directories").get("dir_vping") ODL_DIR = HOME + functest_yaml.get("general").get("directories").get("dir_odl") -# NEUTRON Public Network parameters -NEUTRON_PUBLIC_NET_NAME = functest_yaml.get("general").get("openstack").get("neutron_public_net_name") -NEUTRON_PUBLIC_SUBNET_NAME = functest_yaml.get("general").get("openstack").get("neutron_public_subnet_name") -NEUTRON_PUBLIC_SUBNET_CIDR = functest_yaml.get("general").get("openstack").get("neutron_public_subnet_cidr") -NEUTRON_PUBLIC_SUBNET_START = functest_yaml.get("general").get("openstack").get("neutron_public_subnet_start") -NEUTRON_PUBLIC_SUBNET_END = functest_yaml.get("general").get("openstack").get("neutron_public_subnet_end") # NEUTRON Private Network parameters NEUTRON_PRIVATE_NET_NAME = functest_yaml.get("general").get("openstack").get("neutron_private_net_name") @@ -145,18 +139,6 @@ def config_functest_start(): neutron_client = client.Client(**credentials) logger.info("Configuring Neutron...") - logger.info("Checking if public network '%s' exists..." % NEUTRON_PUBLIC_NET_NAME) - #Now: if exists we don't create it again (the clean command does not clean the neutron networks yet) - if check_neutron_net(neutron_client, NEUTRON_PUBLIC_NET_NAME): - logger.info("Public network '%s' found. No need to create another one." % NEUTRON_PUBLIC_NET_NAME) - else: - logger.info("Public network '%s' not found. Creating..." % NEUTRON_PUBLIC_NET_NAME) - if not create_public_neutron_net(neutron_client): - logger.error("There has been a problem while creating the Neutron network.") - #config_functest_clean() - exit(-1) - - logger.info("Checking if private network '%s' exists..." % NEUTRON_PRIVATE_NET_NAME) #Now: if exists we don't create it again (the clean command does not clean the neutron networks yet) if check_neutron_net(neutron_client, NEUTRON_PRIVATE_NET_NAME): @@ -213,7 +195,7 @@ def config_functest_check(): logger.debug("Checking Rally deployment...") if not check_rally(): - logger.debug("Rally deployment NOT found.") + logger.debug(" Rally deployment NOT found.") errors_all = True logger.debug("...FAIL") else: @@ -221,25 +203,13 @@ def config_functest_check(): logger.debug("Checking Neutron...") - errors = False if not check_neutron_net(neutron_client, NEUTRON_PRIVATE_NET_NAME): logger.debug(" Private network '%s' NOT found." % NEUTRON_PRIVATE_NET_NAME) - errors = True + logger.debug("...FAIL") errors_all = True else: logger.debug(" Private network '%s' found." % NEUTRON_PRIVATE_NET_NAME) - - if not check_neutron_net(neutron_client, NEUTRON_PUBLIC_NET_NAME): - logger.debug(" Public network '%s' NOT found." % NEUTRON_PUBLIC_NET_NAME) - errors = True - errors_all = True - else: - logger.debug(" Public network '%s' found." % NEUTRON_PUBLIC_NET_NAME) - - if not errors: logger.debug("...OK") - else: - logger.debug("...FAIL") logger.debug("Checking Image...") @@ -464,27 +434,7 @@ def download_tests(): return True -def create_public_neutron_net(neutron): - try: - neutron.format = 'json' - logger.debug('Creating Neutron network %s...' % NEUTRON_PUBLIC_NET_NAME) - json_body = {'network': {'name': NEUTRON_PUBLIC_NET_NAME, 'admin_state_up': True, 'router:external': True}} - netw = neutron.create_network(body=json_body) - net_dict = netw['network'] - network_id = net_dict['id'] - logger.debug("Network '%s' created successfully" % network_id) - - logger.debug('Creating Subnet....') - json_body = {'subnets': [{'cidr': NEUTRON_PUBLIC_SUBNET_CIDR, - 'ip_version': 4, 'network_id': network_id}]} - subnet = neutron.create_subnet(body=json_body) - logger.debug("Subnet '%s' created successfully" % subnet) - except: - print "Error:", sys.exc_info()[0] - return False - logger.info("Public Neutron network created successfully.") - return True def create_private_neutron_net(neutron): try: @@ -519,11 +469,14 @@ def create_private_neutron_net(neutron): response = neutron.create_port(body=json_body) logger.debug("Port created successfully.") + """ + #No need to set up a gateway if there is no public network logger.debug('Setting up gateway...') public_network_id = get_network_id(neutron,NEUTRON_PUBLIC_NET_NAME) json_body = {'network_id': public_network_id, 'enable_snat' : True} gateway = neutron.add_gateway_router(router_id,body=json_body) logger.debug("Gateway '%s' added successfully" % gateway) + """ except: print "Error:", sys.exc_info()[0] return False diff --git a/testcases/functest.yaml b/testcases/functest.yaml index cee07fcad..6175e6fcb 100644 --- a/testcases/functest.yaml +++ b/testcases/functest.yaml @@ -10,12 +10,10 @@ general: dir_odl: .functest/ODL/ dir_rally_inst: .rally/ openstack: - image_name: Ubuntu14.04 - image_url: https://cloud-images.ubuntu.com/trusty/current/trusty-server-cloudimg-amd64-disk1.img - image_disk_format: raw - #Public network. Will be created by config_functest.py - #It must be reachable from where the tests are ran - #For Fuel deployment, it exists already and its called net04_ext + image_name: functest-img + image_url: http://download.cirros-cloud.net/0.3.4/cirros-0.3.4-x86_64-disk.img + image_disk_format: qcow2 + #Public network. Optional neutron_public_net_name: net04_ext neutron_public_subnet_name: net04_ext__subnet neutron_public_subnet_cidr: 172.16.9.0/24 diff --git a/testcases/vPing/CI/libraries/vPing.py b/testcases/vPing/CI/libraries/vPing.py index b579830e7..3836a1a4c 100644 --- a/testcases/vPing/CI/libraries/vPing.py +++ b/testcases/vPing/CI/libraries/vPing.py @@ -16,9 +16,6 @@ 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 @@ -114,42 +111,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) + 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_PRIVATE_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_PRIVATE_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 +158,67 @@ 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_PRIVATE_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) #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_PRIVATE_NET_NAME)[0] - logger.debug("Instance '%s' got %s" %(m,test_ip)) - test_cmd = '/tmp/vping.sh %s'%test_ip - + 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_PRIVATE_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 - - """ - # 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 +227,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=%d" % EXIT_CODE) exit(EXIT_CODE) |