3 # Copyright (c) 2017 Cable Television Laboratories, Inc. and others.
5 # This program and the accompanying materials
6 # are made available under the terms of the Apache License, Version 2.0
7 # which accompanies this distribution, and is available at
9 # http://www.apache.org/licenses/LICENSE-2.0
11 """Define the parent class of vping_ssh and vping_userdata testcases."""
13 from datetime import datetime
18 from functest.core import testcase
19 from functest.opnfv_tests.openstack.snaps import snaps_utils
20 from functest.utils.constants import CONST
21 from functest.utils import env
23 from snaps.config.flavor import FlavorConfig
24 from snaps.config.network import NetworkConfig, SubnetConfig
25 from snaps.config.router import RouterConfig
26 from snaps.openstack import create_flavor
27 from snaps.openstack.create_flavor import OpenStackFlavor
28 from snaps.openstack.tests import openstack_tests
29 from snaps.openstack.utils import deploy_utils
32 class VPingBase(testcase.TestCase):
35 Base class for vPing tests that check connectivity between two VMs shared
37 This class is responsible for creating the image, internal network.
39 # pylint: disable=too-many-instance-attributes
41 def __init__(self, **kwargs):
42 super(VPingBase, self).__init__(**kwargs)
43 self.logger = logging.getLogger(__name__)
44 self.os_creds = kwargs.get('os_creds') or snaps_utils.get_credentials()
45 self.creators = list()
46 self.image_creator = None
47 self.network_creator = None
48 self.vm1_creator = None
49 self.vm2_creator = None
50 self.router_creator = None
53 self.guid = '-' + str(uuid.uuid4())
55 self.router_name = getattr(CONST, 'vping_router_name') + self.guid
56 self.vm1_name = getattr(CONST, 'vping_vm_name_1') + self.guid
57 self.vm2_name = getattr(CONST, 'vping_vm_name_2') + self.guid
59 self.vm_boot_timeout = getattr(CONST, 'vping_vm_boot_timeout')
60 self.vm_delete_timeout = getattr(CONST, 'vping_vm_delete_timeout')
61 self.vm_ssh_connect_timeout = getattr(
62 CONST, 'vping_vm_ssh_connect_timeout')
63 self.ping_timeout = getattr(CONST, 'vping_ping_timeout')
64 self.flavor_name = 'vping-flavor' + self.guid
66 # Move this configuration option up for all tests to leverage
67 if hasattr(CONST, 'snaps_images_cirros'):
68 self.cirros_image_config = getattr(CONST, 'snaps_images_cirros')
70 self.cirros_image_config = None
72 def run(self, **kwargs): # pylint: disable=too-many-locals
74 Begins the test execution which should originate from the subclass
76 self.logger.info('Begin virtual environment setup')
78 self.start_time = time.time()
80 "vPing Start Time:'%s'",
81 datetime.fromtimestamp(self.start_time).strftime(
84 image_base_name = '{}-{}'.format(
85 getattr(CONST, 'vping_image_name'),
87 os_image_settings = openstack_tests.cirros_image_settings(
88 image_base_name, image_metadata=self.cirros_image_config)
89 self.logger.info("Creating image with name: '%s'", image_base_name)
91 self.image_creator = deploy_utils.create_image(
92 self.os_creds, os_image_settings)
93 self.creators.append(self.image_creator)
95 private_net_name = getattr(CONST, 'vping_private_net_name') + self.guid
96 private_subnet_name = getattr(
97 CONST, 'vping_private_subnet_name') + self.guid
98 private_subnet_cidr = getattr(CONST, 'vping_private_subnet_cidr')
100 vping_network_type = None
101 vping_physical_network = None
102 vping_segmentation_id = None
104 if hasattr(CONST, 'vping_network_type'):
105 vping_network_type = getattr(CONST, 'vping_network_type')
106 if hasattr(CONST, 'vping_physical_network'):
107 vping_physical_network = getattr(CONST, 'vping_physical_network')
108 if hasattr(CONST, 'vping_segmentation_id'):
109 vping_segmentation_id = getattr(CONST, 'vping_segmentation_id')
112 "Creating network with name: '%s'", private_net_name)
113 self.network_creator = deploy_utils.create_network(
116 name=private_net_name,
117 network_type=vping_network_type,
118 physical_network=vping_physical_network,
119 segmentation_id=vping_segmentation_id,
120 subnet_settings=[SubnetConfig(
121 name=private_subnet_name,
122 cidr=private_subnet_cidr)]))
123 self.creators.append(self.network_creator)
125 # Creating router to external network
126 log = "Creating router with name: '%s'" % self.router_name
127 self.logger.info(log)
128 ext_net_name = snaps_utils.get_ext_net_name(self.os_creds)
129 self.router_creator = deploy_utils.create_router(
132 name=self.router_name,
133 external_gateway=ext_net_name,
134 internal_subnets=[private_subnet_name]))
135 self.creators.append(self.router_creator)
138 "Creating flavor with name: '%s'", self.flavor_name)
139 scenario = env.get('DEPLOY_SCENARIO')
140 flavor_metadata = None
142 if 'ovs' in scenario or 'fdio' in scenario:
143 flavor_metadata = create_flavor.MEM_PAGE_SIZE_LARGE
145 flavor_creator = OpenStackFlavor(
147 FlavorConfig(name=self.flavor_name, ram=flavor_ram, disk=1,
148 vcpus=1, metadata=flavor_metadata))
149 flavor_creator.create()
150 self.creators.append(flavor_creator)
154 Method called by subclasses after environment has been setup
155 :return: the exit code
157 self.logger.info('Begin test execution')
159 test_ip = self.vm1_creator.get_port_ip(
160 self.vm1_creator.instance_settings.port_settings[0].name)
162 if self.vm1_creator.vm_active(
163 block=True) and self.vm2_creator.vm_active(block=True):
164 result = self._do_vping(self.vm2_creator, test_ip)
166 raise Exception('VMs never became active')
168 self.stop_time = time.time()
170 if result != testcase.TestCase.EX_OK:
172 return testcase.TestCase.EX_RUN_ERROR
175 return testcase.TestCase.EX_OK
179 Cleanup all OpenStack objects. Should be called on completion
182 if getattr(CONST, 'vping_cleanup_objects') == 'True':
183 for creator in reversed(self.creators):
186 except Exception as error: # pylint: disable=broad-except
187 self.logger.error('Unexpected error cleaning - %s', error)
189 def _do_vping(self, vm_creator, test_ip):
191 Method to be implemented by subclasses
192 Begins the real test after the OpenStack environment has been setup
193 :param vm_creator: the SNAPS VM instance creator object
194 :param test_ip: the IP to which the VM needs to issue the ping
197 raise NotImplementedError('vping execution is not implemented')