Changes required for running CI tests (Pike pod).
[snaps.git] / snaps / openstack / tests / os_source_file_test.py
1 # Copyright (c) 2016 Cable Television Laboratories, Inc. ("CableLabs")
2 #                    and others.  All rights reserved.
3 #
4 # Licensed under the Apache License, Version 2.0 (the "License");
5 # you may not use this file except in compliance with the License.
6 # You may obtain a copy of the License at:
7 #
8 #     http://www.apache.org/licenses/LICENSE-2.0
9 #
10 # Unless required by applicable law or agreed to in writing, software
11 # distributed under the License is distributed on an "AS IS" BASIS,
12 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 # See the License for the specific language governing permissions and
14 # limitations under the License.
15 import logging
16 import pkg_resources
17 import requests
18 from requests.packages.urllib3.exceptions import InsecureRequestWarning
19 import uuid
20 import unittest
21
22 from snaps import file_utils
23 from snaps.openstack.create_project import ProjectSettings
24 from snaps.openstack.create_user import UserSettings
25 from snaps.openstack.tests import openstack_tests
26 from snaps.openstack.utils import deploy_utils, keystone_utils
27
28
29 dev_os_env_file = pkg_resources.resource_filename(
30     'snaps.openstack.tests.conf', 'os_env.yaml')
31
32 requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
33
34 class OSComponentTestCase(unittest.TestCase):
35
36     def __init__(self, method_name='runTest', os_creds=None, ext_net_name=None,
37                  image_metadata=None, log_level=logging.DEBUG):
38         """
39         Super for test classes requiring a connection to OpenStack
40         :param method_name: default 'runTest'
41         :param os_creds: the OSCreds object, when null it searches for the file
42                          in the package snaps.openstack.tests.conf.os_env.yaml
43         :param ext_net_name: the name of the external network that is used for
44                              creating routers for floating IPs
45         :param image_metadata: ability to override images being used in the
46                                tests (see examples/image-metadata)
47         :param log_level: the logging level of your test run (default DEBUG)
48         """
49         super(OSComponentTestCase, self).__init__(method_name)
50
51         logging.basicConfig(level=log_level)
52
53         if os_creds:
54             self.os_creds = os_creds
55         else:
56             self.os_creds = openstack_tests.get_credentials(
57                 dev_os_env_file=dev_os_env_file)
58
59         self.ext_net_name = ext_net_name
60
61         if not self.ext_net_name and file_utils.file_exists(dev_os_env_file):
62             test_conf = file_utils.read_yaml(dev_os_env_file)
63             self.ext_net_name = test_conf.get('ext_net')
64
65         self.image_metadata = image_metadata
66
67     @staticmethod
68     def parameterize(testcase_klass, os_creds, ext_net_name,
69                      image_metadata=None, log_level=logging.DEBUG):
70         """ Create a suite containing all tests taken from the given
71             subclass, passing them the parameter 'param'.
72         """
73         test_loader = unittest.TestLoader()
74         test_names = test_loader.getTestCaseNames(testcase_klass)
75         suite = unittest.TestSuite()
76         for name in test_names:
77             suite.addTest(testcase_klass(name, os_creds, ext_net_name,
78                                          image_metadata, log_level))
79         return suite
80
81
82 class OSIntegrationTestCase(OSComponentTestCase):
83
84     def __init__(self, method_name='runTest', os_creds=None, ext_net_name=None,
85                  use_keystone=False, flavor_metadata=None, image_metadata=None,
86                  log_level=logging.DEBUG):
87         """
88         Super for integration tests requiring a connection to OpenStack
89         :param method_name: default 'runTest'
90         :param os_creds: the OSCreds object, when null it searches for the file
91                          in the package snaps.openstack.tests.conf.os_env.yaml
92         :param ext_net_name: the name of the external network that is used for
93                              creating routers for floating IPs
94         :param use_keystone: when true, these tests will create a new
95                              user/project under which to run the test
96         :param image_metadata: dict() containing the URLs for the disk, kernel,
97                                and ramdisk images when multi-part images are
98                                required. See below for a simple example
99         image_metadata={'disk_url': '{URI}/cirros-0.3.4-x86_64-disk.img',
100                         'kernel_url': '{URI}/cirros-0.3.4-x86_64-kernel',
101                         'ramdisk_url': '{URI}/cirros-0.3.4-x86_64-initramfs'})
102         :param flavor_metadata: dict() to be sent directly into the Nova client
103                                 generally used for page sizes
104         :param log_level: the logging level of your test run (default DEBUG)
105         """
106         super(OSIntegrationTestCase, self).__init__(
107             method_name=method_name, os_creds=os_creds,
108             ext_net_name=ext_net_name, image_metadata=image_metadata,
109             log_level=log_level)
110         self.use_keystone = use_keystone
111         self.keystone = None
112         self.flavor_metadata = flavor_metadata
113
114     @staticmethod
115     def parameterize(testcase_klass, os_creds, ext_net_name,
116                      use_keystone=False, flavor_metadata=None,
117                      image_metadata=None, log_level=logging.DEBUG):
118         """
119         Create a suite containing all tests taken from the given
120         subclass, passing them the parameter 'param'.
121         """
122         test_loader = unittest.TestLoader()
123         test_names = test_loader.getTestCaseNames(testcase_klass)
124         suite = unittest.TestSuite()
125         for name in test_names:
126             suite.addTest(testcase_klass(name, os_creds, ext_net_name,
127                                          use_keystone, flavor_metadata,
128                                          image_metadata, log_level))
129         return suite
130
131     """
132     Super for test classes that should be run within their own project/tenant
133     as they can run for quite some time
134     """
135     def __start__(self):
136         """
137         Creates a project and user to be leveraged by subclass test methods. If
138         implementing class uses this method, it must call __clean__() else you
139         will be left with unwanted users and tenants
140         """
141         self.project_creator = None
142         self.user_creator = None
143         self.admin_os_creds = self.os_creds
144         self.role = None
145
146         if self.use_keystone:
147             self.keystone = keystone_utils.keystone_client(self.os_creds)
148             guid = self.__class__.__name__ + '-' + str(uuid.uuid4())[:-19]
149             project_name = guid + '-proj'
150             self.project_creator = deploy_utils.create_project(
151                 self.admin_os_creds, ProjectSettings(name=project_name))
152
153             self.user_creator = deploy_utils.create_user(
154                 self.admin_os_creds, UserSettings(
155                     name=guid + '-user', password=guid,
156                     project_name=project_name, roles={
157                         'admin': self.project_creator.project_settings.name}))
158
159             self.os_creds = self.user_creator.get_os_creds(
160                 self.project_creator.project_settings.name)
161
162             # add user to project
163             self.project_creator.assoc_user(self.user_creator.get_user())
164
165     def __clean__(self):
166         """
167         Cleans up test user and project.
168         Must be called at the end of child classes tearDown() if __start__() is
169         called during setUp() else these objects will persist after the test is
170         run
171         """
172         if self.role:
173             keystone_utils.delete_role(self.keystone, self.role)
174
175         if self.project_creator:
176             self.project_creator.clean()
177
178         if self.user_creator:
179             self.user_creator.clean()