Merge "Create new project/user for snaps tests"
[functest.git] / functest / opnfv_tests / openstack / snaps / snaps_test_runner.py
1 #!/usr/bin/env python
2
3 # Copyright (c) 2017 Cable Television Laboratories, Inc. and others.
4 #
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
8 #
9 # http://www.apache.org/licenses/LICENSE-2.0
10
11 """configuration params to run snaps tests"""
12
13 import logging
14 import uuid
15
16 import os_client_config
17 import shade
18 from xtesting.core import unit
19
20 from functest.core import tenantnetwork
21 from functest.opnfv_tests.openstack.snaps import snaps_utils
22 from functest.utils import config
23 from functest.utils import functest_utils
24
25
26 class SnapsTestRunner(unit.Suite):
27     # pylint: disable=too-many-instance-attributes
28     """
29     This test executes the SNAPS Python Tests
30     """
31
32     def __init__(self, **kwargs):
33         super(SnapsTestRunner, self).__init__(**kwargs)
34         self.logger = logging.getLogger(__name__)
35
36         try:
37             cloud_config = os_client_config.get_config()
38             self.orig_cloud = shade.OpenStackCloud(cloud_config=cloud_config)
39             guid = str(uuid.uuid4())
40             self.project = tenantnetwork.NewProject(
41                 self.orig_cloud, self.case_name, guid)
42             self.project.create()
43         except Exception:  # pylint: disable=broad-except
44             raise Exception("Cannot create user or project")
45
46         if self.orig_cloud.get_role("admin"):
47             role_name = "admin"
48         elif self.orig_cloud.get_role("Admin"):
49             role_name = "Admin"
50         else:
51             raise Exception("Cannot detect neither admin nor Admin")
52         self.orig_cloud.grant_role(
53             role_name, user=self.project.user.id,
54             project=self.project.project.id,
55             domain=self.project.domain.id)
56         self.role = None
57         if not self.orig_cloud.get_role("heat_stack_owner"):
58             self.role = self.orig_cloud.create_role("heat_stack_owner")
59         self.orig_cloud.grant_role(
60             "heat_stack_owner", user=self.project.user.id,
61             project=self.project.project.id,
62             domain=self.project.domain.id)
63         creds_overrides = dict(
64             username=self.project.user.name,
65             project_name=self.project.project.name,
66             project_id=self.project.project.id,
67             password=self.project.password)
68         self.os_creds = kwargs.get('os_creds') or snaps_utils.get_credentials(
69             overrides=creds_overrides)
70         if 'ext_net_name' in kwargs:
71             self.ext_net_name = kwargs['ext_net_name']
72         else:
73             self.ext_net_name = snaps_utils.get_ext_net_name(self.os_creds)
74
75         self.netconf_override = None
76         if hasattr(config.CONF, 'snaps_network_config'):
77             self.netconf_override = getattr(
78                 config.CONF, 'snaps_network_config')
79
80         self.use_fip = (
81             getattr(config.CONF, 'snaps_use_floating_ips') == 'True')
82         self.use_keystone = (
83             getattr(config.CONF, 'snaps_use_keystone') == 'True')
84
85         self.flavor_metadata = getattr(config.CONF, 'snaps_flavor_extra_specs',
86                                        None)
87         self.logger.info("Using flavor metadata '%s'", self.flavor_metadata)
88
89         self.image_metadata = None
90         if hasattr(config.CONF, 'snaps_images'):
91             self.image_metadata = getattr(config.CONF, 'snaps_images')
92
93     def clean(self):
94         """Cleanup of OpenStack resources. Should be called on completion."""
95         try:
96             super(SnapsTestRunner, self).clean()
97             assert self.orig_cloud
98             assert self.project
99             if self.role:
100                 self.orig_cloud.delete_role(self.role.id)
101             self.project.clean()
102         except Exception:  # pylint: disable=broad-except
103             self.__logger.exception("Cannot clean all resources")
104
105     def check_requirements(self):
106         """Skip if OpenStack Rocky or newer."""
107         try:
108             cloud_config = os_client_config.get_config()
109             cloud = shade.OpenStackCloud(cloud_config=cloud_config)
110             if functest_utils.get_nova_version(cloud) > (2, 60):
111                 self.is_skipped = True
112         except Exception:  # pylint: disable=broad-except
113             pass