X-Git-Url: https://gerrit.opnfv.org/gerrit/gitweb?a=blobdiff_plain;f=functest%2Fopnfv_tests%2Fopenstack%2Fvping%2Fvping_userdata.py;h=f9d0bdbf0060901bcaabe1999c7dc192a1595489;hb=5522ecd302ee54b494714cb2e1af0fe2381e5c37;hp=4cc8f42f5392fb405ef5b593186f7f94507409ff;hpb=71ba783c1279370af035ff7cac2de7522e95de78;p=functest.git diff --git a/functest/opnfv_tests/openstack/vping/vping_userdata.py b/functest/opnfv_tests/openstack/vping/vping_userdata.py index 4cc8f42f5..f9d0bdbf0 100644 --- a/functest/opnfv_tests/openstack/vping/vping_userdata.py +++ b/functest/opnfv_tests/openstack/vping/vping_userdata.py @@ -1,5 +1,5 @@ #!/usr/bin/env 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 @@ -7,17 +7,18 @@ # # http://www.apache.org/licenses/LICENSE-2.0 +"""vping_userdata testcase.""" + +import logging import time -from snaps.config.network import PortConfig -from snaps.config.vm_inst import VmInstanceConfig -from snaps.openstack.utils import deploy_utils +from xtesting.core import testcase -from functest.core.testcase import TestCase -from functest.opnfv_tests.openstack.vping import vping_base +from functest.core import singlevm +from functest.utils import config -class VPingUserdata(vping_base.VPingBase): +class VPingUserdata(singlevm.VmReady2): """ Class to execute the vPing test using userdata and the VM's console """ @@ -26,83 +27,63 @@ class VPingUserdata(vping_base.VPingBase): if "case_name" not in kwargs: kwargs["case_name"] = "vping_userdata" super(VPingUserdata, self).__init__(**kwargs) + self.logger = logging.getLogger(__name__) + self.vm1 = None + self.vm2 = None - def run(self): + def run(self, **kwargs): """ Sets up the OpenStack VM instance objects then executes the ping and validates. :return: the exit code from the super.execute() method """ try: - super(VPingUserdata, self).run() - - # Creating Instance 1 - port1_settings = PortConfig( - name=self.vm1_name + '-vPingPort', - network_name=self.network_creator.network_settings.name) - instance1_settings = VmInstanceConfig( - name=self.vm1_name, - flavor=self.flavor_name, - vm_boot_timeout=self.vm_boot_timeout, - port_settings=[port1_settings]) - - self.logger.info( - "Creating VM 1 instance with name: '%s'" - % instance1_settings.name) - self.vm1_creator = deploy_utils.create_vm_instance( - self.os_creds, instance1_settings, - self.image_creator.image_settings) - self.creators.append(self.vm1_creator) - - userdata = _get_userdata( - self.vm1_creator.get_port_ip(port1_settings.name)) - if userdata: - # Creating Instance 2 - port2_settings = PortConfig( - name=self.vm2_name + '-vPingPort', - network_name=self.network_creator.network_settings.name) - instance2_settings = VmInstanceConfig( - name=self.vm2_name, - flavor=self.flavor_name, - vm_boot_timeout=self.vm_boot_timeout, - port_settings=[port2_settings], - userdata=userdata) - - self.logger.info( - "Creating VM 2 instance with name: '%s'" - % instance2_settings.name) - self.vm2_creator = deploy_utils.create_vm_instance( - self.os_creds, instance2_settings, - self.image_creator.image_settings) - self.creators.append(self.vm2_creator) - else: - raise Exception('Userdata is None') - - return self._execute() - - finally: - self._cleanup() - - def _do_vping(self, vm_creator, test_ip): + assert self.cloud + assert super(VPingUserdata, self).run( + **kwargs) == testcase.TestCase.EX_OK + self.result = 0 + self.vm1 = self.boot_vm() + self.vm2 = self.boot_vm( + '{}-vm2_{}'.format(self.case_name, self.guid), + userdata=self._get_userdata()) + self.vm2 = self.cloud.wait_for_server(self.vm2, auto_ip=False) + + result = self._do_vping() + self.stop_time = time.time() + if result != testcase.TestCase.EX_OK: + return testcase.TestCase.EX_RUN_ERROR + self.result = 100 + return testcase.TestCase.EX_OK + except Exception: # pylint: disable=broad-except + self.logger.exception('Unexpected error running vping_userdata') + return testcase.TestCase.EX_RUN_ERROR + + def _do_vping(self): """ Override from super """ + if not (self.vm1.private_v4 or self.vm1.addresses[ + self.network.name][0].addr): + self.logger.error("vm1: IP addr missing") + return testcase.TestCase.EX_TESTCASE_FAILED + self.logger.info("Waiting for ping...") - exit_code = TestCase.EX_TESTCASE_FAILED + exit_code = testcase.TestCase.EX_TESTCASE_FAILED sec = 0 tries = 0 while True: time.sleep(1) - p_console = vm_creator.get_console_output() + p_console = self.cloud.get_server_console(self.vm2.id) + self.logger.debug("console: \n%s", p_console) if "vPing OK" in p_console: self.logger.info("vPing detected!") - exit_code = TestCase.EX_OK + exit_code = testcase.TestCase.EX_OK break elif "failed to read iid from metadata" in p_console or tries > 5: self.logger.info("Failed to read iid from metadata") break - elif sec == self.ping_timeout: + elif sec == getattr(config.CONF, 'vping_ping_timeout'): self.logger.info("Timeout reached.") break elif sec % 10 == 0: @@ -113,29 +94,45 @@ class VPingUserdata(vping_base.VPingBase): tries += 1 else: self.logger.debug( - "Pinging %s. Waiting for response..." % test_ip) + "Pinging %s. Waiting for response...", + self.vm1.private_v4 or self.vm1.addresses[ + self.network.name][0].addr) sec += 1 return exit_code - -def _get_userdata(test_ip): - """ - Returns the post VM creation script to be added into the VM's userdata - :param test_ip: the IP value to substitute into the script - :return: the bash script contents - """ - if test_ip: - return ("#!/bin/sh\n\n" - "while 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\n" - "done\n" % str(test_ip)) - return None + def _get_userdata(self): + """ + Returns the post VM creation script to be added into the VM's userdata + :param test_ip: the IP value to substitute into the script + :return: the bash script contents + """ + if self.vm1.private_v4 or self.vm1.addresses[ + self.network.name][0].addr: + return ("#!/bin/sh\n\n" + "while 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\n" + "done\n" % str( + self.vm1.private_v4 or self.vm1.addresses[ + self.network.name][0].addr)) + return None + + def clean(self): + assert self.cloud + if self.vm1: + self.cloud.delete_server( + self.vm1, wait=True, + timeout=getattr(config.CONF, 'vping_vm_delete_timeout')) + if self.vm2: + self.cloud.delete_server( + self.vm2, wait=True, + timeout=getattr(config.CONF, 'vping_vm_delete_timeout')) + super(VPingUserdata, self).clean()