vPing.py: improved, updated and working with Ubuntu Cloud image. 94/494/3
authorjose.lausuch <jose.lausuch@ericsson.com>
Sat, 9 May 2015 18:22:12 +0000 (20:22 +0200)
committerjose.lausuch <jose.lausuch@ericsson.com>
Sat, 9 May 2015 18:30:19 +0000 (20:30 +0200)
TBD: get deployment from a functest configuration file

JIRA: FUNCTEST-3

Change-Id: I15de42b7ab4ab5144fb825cc8f48d75fe5d22a1c
Signed-off-by: jose.lausuch <jose.lausuch@ericsson.com>
testcases/vPing/CI/libraries/vPing.py

index b304f72..ed94df2 100644 (file)
@@ -3,7 +3,7 @@
 # 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
 #
 # This script boots the VM1 and allocates IP address from Nova
@@ -17,10 +17,42 @@ import os
 import pprint
 import subprocess
 import time
-import novaclient.v1_1.client as novaclient
+import argparse
+import logging
+import novaclient.v2.client as novaclient
+#import novaclient.v1_1.client as novaclient
 import cinderclient.v1.client as cinderclient
 pp = pprint.PrettyPrinter(indent=4)
 
+EXIT_CODE = -1
+
+#tODO: this parameters should be taken from a conf file
+PING_TIMEOUT = 200
+NAME_VM_1 = "opnfv-vping-1"
+NAME_VM_2 = "opnfv-vping-2"
+GLANCE_IMAGE_NAME = "trusty-server-cloudimg-amd64-disk1.img"
+NEUTRON_NET_NAME = "test"
+FLAVOR = "m1.small"
+
+parser = argparse.ArgumentParser()
+parser.add_argument("-d", "--debug", help="Debug mode",  action="store_true")
+args = parser.parse_args()
+
+""" logging configuration """
+logger = logging.getLogger('vPing')
+logger.setLevel(logging.DEBUG)
+
+ch = logging.StreamHandler()
+if args.debug:
+    ch.setLevel(logging.DEBUG)
+else:
+    ch.setLevel(logging.INFO)
+formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
+ch.setFormatter(formatter)
+logger.addHandler(ch)
+
+
+
 def pMsg(value):
     """pretty printing"""
     pp.pprint(value)
@@ -38,6 +70,7 @@ def get_credentials(service):
     :param service: a string indicating the name of the service
                     requesting the credentials.
     """
+    #TODO: get credentials from the openrc file
     creds = {}
     # Unfortunately, each of the OpenStack client will request slightly
     # different entries in their credentials dict.
@@ -52,9 +85,9 @@ def get_credentials(service):
     # environment variables.
     creds.update({
         "username": os.environ.get('OS_USERNAME', "admin"),                                                            # add your cloud username details
-        password: os.environ.get("OS_PASSWORD", "test"),                                                               # add password
+        password: os.environ.get("OS_PASSWORD", 'admin'),                                                              # add password
         "auth_url": os.environ.get("OS_AUTH_URL","http://192.168.20.71:5000/v2.0"),            # Auth URL
-        tenant: os.environ.get("OS_TENANT_NAME", "invisible_to_admin"),
+        tenant: os.environ.get("OS_TENANT_NAME", "admin"),
     })
 
     return creds
@@ -67,37 +100,65 @@ def get_server(creds, servername):
 
 def waitVmActive(nova,vm):
     # sleep and wait for VM status change
-    pMsg(vm.status)
-    while vm.status == "BUILD":
-        time.sleep(1)
-        vm = nova.servers.get(vm.id)
-        pMsg(vm.status)
+    while get_status(nova,vm) != "ACTIVE":
+        time.sleep(3)
+        logger.debug("Status: %s" % vm.status)
+    logger.debug("Status: %s" % vm.status)
+
+def get_status(nova,vm):
+    vm = nova.servers.get(vm.id)
+    return vm.status
+
 
 def main():
     creds = get_credentials("nova")
     nova = novaclient.Client(**creds)
     cinder = cinderclient.Client(**creds)
-    
-    #print images and server resources
+
+    """
+    # print images and server resources
+    # print nova_images
     print_title("images list")
     pMsg(nova.images.list())
-    
     print_title("servers list")
     pMsg(nova.servers.list())
-    
+    """
+
+    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)
+        logger.info("Available images are: ")
+        pMsg(nova.images.list())
+        exit(-1)
+
+    servers=nova.servers.list()
+    for server in servers:
+        if server.name == NAME_VM_1 or server.name == NAME_VM_2:
+            logger.info("Instance %s found. Deleting..." %server.name)
+            server.delete()
+
+
 
     # boot VM 1
     # basic boot
-       # tune (e.g. flavor, images, network) to your specific openstack configuration here
-    f = nova.flavors.find(name = 'm1.small')
-    i = nova.images.find(name = 'Ubuntu 14.04 (amd64)')
-    n = nova.networks.find(label = 'private')
+  # 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"
 
     # 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))
     vm1 = nova.servers.create(
-        name               = "opnfv-vping-1",
+        name               = m,
         flavor             = f,
         image              = i,
         nics               = [{"net-id": n.id}],
@@ -105,34 +166,39 @@ def main():
         userdata           = u,
     )
 
-    pMsg(vm1)
+    #pMsg(vm1)
 
 
     #wait until VM status is active
     waitVmActive(nova,vm1)
-    
+
     #retrieve IP of first VM
-    server = get_server(creds, "opnfv-vping-1")
-    pMsg(server.networks)
+    logger.debug("Fetching IP...")
+    server = get_server(creds, m)
+    #pMsg(server.networks)
     # theoretically there is only one IP address so we take the first element of the table
-    test_ip = server.networks.get('private')[0]
+    # 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
 
-   
-    # boot VM 2 
+
+    # 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
-    f = nova.flavors.find(name = 'm1.small')
-    i = nova.images.find(name = 'Ubuntu 14.04 (amd64)')
-    n = nova.networks.find(label = 'private')
+  # 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
-    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: IyEvYmluL2Jhc2gKCgoKcGluZyAtYyAxICQxIDI+JjEgPi9kZXYvbnVsbApSRVM9JD8KaWYgWyAiWiRSRVMiID0gIlowIiBdIDsgdGhlbgogIGVjaG8gInZQaW5nIE9LIgplbHNlCiAgZWNobyAidlBpbmcgS08iCmZpCg==\nruncmd:\n - [ sh, -c, %s]"%test_cmd
     #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
     # 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))
     vm2 = nova.servers.create(
-        name               = "opnfv-vping-2", 
+        name               = m,
         flavor             = f,
         image              = i,
         nics               = [{"net-id": n.id}],
@@ -141,28 +207,56 @@ def main():
         #security_groups    = s,
         #config_drive       = v.id
     )
-    
-    pMsg(vm2)
-   
+    # 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)
-    console_log = vm2.get_console_output()
-    
 
+    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):
         time.sleep(1)
         console_log = vm2.get_console_output()
+        print "--"+console_log
 
         # report if the test is failed
         if "vPing" in console_log:
             pMsg("vPing is OK")
+            break
         else:
             pMsg("no vPing detected....")
+        sec+=1
+        if sec == PING_TIMEOUT:
+            break
+    """
 
     # delete both VMs
+    logger.debug("Deleting Instances...")
     nova.servers.delete(vm1)
+    logger.debug("Instance %s terminated." % NAME_VM_1)
     nova.servers.delete(vm2)
-    pMsg ("VM instances have been terminated!")
+    logger.debug("Instance %s terminated." % NAME_VM_2)
+
+
+    logger.debug("EXIT_CODE=%s" % EXIT_CODE)
+    exit(EXIT_CODE)
 
 
 if __name__ == '__main__':