1 # Copyright (c) 2017 Cable Television Laboratories, Inc. ("CableLabs")
2 # and others. All rights reserved.
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:
8 # http://www.apache.org/licenses/LICENSE-2.0
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.
21 from snaps import file_utils
22 from snaps.openstack import create_instance
23 from snaps.openstack.create_flavor import FlavorSettings, OpenStackFlavor
24 from snaps.openstack.create_image import OpenStackImage
25 from snaps.openstack.create_instance import VmInstanceSettings
26 from snaps.openstack.create_network import OpenStackNetwork, PortSettings
27 from snaps.openstack.tests import openstack_tests
28 from snaps.openstack.tests.os_source_file_test import OSComponentTestCase
29 from snaps.openstack.utils import nova_utils, neutron_utils, glance_utils
31 __author__ = 'spisarski'
33 logger = logging.getLogger('nova_utils_tests')
36 class NovaSmokeTests(OSComponentTestCase):
38 Tests to ensure that the nova client can communicate with the cloud
41 def test_nova_connect_success(self):
43 Tests to ensure that the proper credentials can connect.
45 nova = nova_utils.nova_client(self.os_creds)
47 # This should not throw an exception
50 def test_nova_connect_fail(self):
52 Tests to ensure that the improper credentials cannot connect.
54 from snaps.openstack.os_credentials import OSCreds
56 nova = nova_utils.nova_client(
57 OSCreds(username='user', password='pass',
58 auth_url=self.os_creds.auth_url,
59 project_name=self.os_creds.project_name,
60 proxy_settings=self.os_creds.proxy_settings))
62 # This should throw an exception
63 with self.assertRaises(Exception):
67 class NovaUtilsKeypairTests(OSComponentTestCase):
69 Test basic nova keypair functionality
74 Instantiates the CreateImage object that is responsible for downloading
75 and creating an OS image file within OpenStack
77 guid = self.__class__.__name__ + '-' + str(uuid.uuid4())
78 self.priv_key_file_path = 'tmp/' + guid
79 self.pub_key_file_path = self.priv_key_file_path + '.pub'
81 self.nova = nova_utils.nova_client(self.os_creds)
82 self.keys = nova_utils.create_keys()
83 self.public_key = nova_utils.public_key_openssh(self.keys)
84 self.keypair_name = guid
89 Cleans the image and downloaded image file
93 nova_utils.delete_keypair(self.nova, self.keypair)
98 os.chmod(self.priv_key_file_path, 0o777)
99 os.remove(self.priv_key_file_path)
104 os.chmod(self.pub_key_file_path, 0o777)
105 os.remove(self.pub_key_file_path)
109 def test_create_keypair(self):
111 Tests the creation of an OpenStack keypair that does not exist.
113 self.keypair = nova_utils.upload_keypair(self.nova, self.keypair_name,
115 result = nova_utils.keypair_exists(self.nova, self.keypair)
116 self.assertEqual(self.keypair, result)
117 keypair = nova_utils.get_keypair_by_name(self.nova, self.keypair_name)
118 self.assertEqual(self.keypair, keypair)
120 def test_create_delete_keypair(self):
122 Tests the creation of an OpenStack keypair that does not exist.
124 self.keypair = nova_utils.upload_keypair(self.nova, self.keypair_name,
126 result = nova_utils.keypair_exists(self.nova, self.keypair)
127 self.assertEqual(self.keypair, result)
128 nova_utils.delete_keypair(self.nova, self.keypair)
129 result2 = nova_utils.keypair_exists(self.nova, self.keypair)
130 self.assertIsNone(result2)
132 def test_create_key_from_file(self):
134 Tests that the generated RSA keys are properly saved to files
137 file_utils.save_keys_to_files(self.keys, self.pub_key_file_path,
138 self.priv_key_file_path)
139 self.keypair = nova_utils.upload_keypair_file(self.nova,
141 self.pub_key_file_path)
142 pub_key_file = open(os.path.expanduser(self.pub_key_file_path))
143 pub_key = pub_key_file.read()
145 self.assertEqual(self.keypair.public_key, pub_key)
148 class NovaUtilsFlavorTests(OSComponentTestCase):
150 Test basic nova flavor functionality
155 Instantiates the CreateImage object that is responsible for downloading
156 and creating an OS image file within OpenStack
158 guid = self.__class__.__name__ + '-' + str(uuid.uuid4())
159 self.flavor_settings = FlavorSettings(name=guid + '-name',
160 flavor_id=guid + '-id', ram=1,
163 rxtx_factor=3.0, is_public=False)
164 self.nova = nova_utils.nova_client(self.os_creds)
169 Cleans the image and downloaded image file
173 nova_utils.delete_flavor(self.nova, self.flavor)
177 def test_create_flavor(self):
179 Tests the creation of an OpenStack keypair that does not exist.
181 self.flavor = nova_utils.create_flavor(self.nova, self.flavor_settings)
182 self.validate_flavor()
184 def test_create_delete_flavor(self):
186 Tests the creation of an OpenStack keypair that does not exist.
188 self.flavor = nova_utils.create_flavor(self.nova, self.flavor_settings)
189 self.validate_flavor()
190 nova_utils.delete_flavor(self.nova, self.flavor)
191 flavor = nova_utils.get_flavor_by_name(self.nova,
192 self.flavor_settings.name)
193 self.assertIsNone(flavor)
195 def validate_flavor(self):
197 Validates the flavor_settings against the OpenStack flavor object
199 self.assertIsNotNone(self.flavor)
200 self.assertEqual(self.flavor_settings.name, self.flavor.name)
201 self.assertEqual(self.flavor_settings.flavor_id, self.flavor.id)
202 self.assertEqual(self.flavor_settings.ram, self.flavor.ram)
203 self.assertEqual(self.flavor_settings.disk, self.flavor.disk)
204 self.assertEqual(self.flavor_settings.vcpus, self.flavor.vcpus)
205 self.assertEqual(self.flavor_settings.ephemeral, self.flavor.ephemeral)
207 if self.flavor_settings.swap == 0:
208 self.assertEqual('', self.flavor.swap)
210 self.assertEqual(self.flavor_settings.swap, self.flavor.swap)
212 self.assertEqual(self.flavor_settings.rxtx_factor,
213 self.flavor.rxtx_factor)
214 self.assertEqual(self.flavor_settings.is_public, self.flavor.is_public)
217 class NovaUtilsInstanceTests(OSComponentTestCase):
219 Tests the creation of VM instances via nova_utils.py
224 Setup objects required by VM instances
228 guid = self.__class__.__name__ + '-' + str(uuid.uuid4())
230 self.nova = nova_utils.nova_client(self.os_creds)
231 self.neutron = neutron_utils.neutron_client(self.os_creds)
232 self.glance = glance_utils.glance_client(self.os_creds)
234 self.image_creator = None
235 self.network_creator = None
236 self.flavor_creator = None
241 image_settings = openstack_tests.cirros_image_settings(
242 name=guid + '-image', image_metadata=self.image_metadata)
243 self.image_creator = OpenStackImage(
244 self.os_creds, image_settings=image_settings)
245 self.image_creator.create()
247 network_settings = openstack_tests.get_priv_net_config(
248 guid + '-net', guid + '-subnet').network_settings
249 self.network_creator = OpenStackNetwork(
250 self.os_creds, network_settings)
251 self.network_creator.create()
253 self.flavor_creator = OpenStackFlavor(
256 name=guid + '-flavor-name', ram=256, disk=10, vcpus=1))
257 self.flavor_creator.create()
259 port_settings = PortSettings(name=guid + '-port',
260 network_name=network_settings.name)
261 self.port = neutron_utils.create_port(
262 self.neutron, self.os_creds, port_settings)
264 self.instance_settings = VmInstanceSettings(
265 name=guid + '-vm_inst',
266 flavor=self.flavor_creator.flavor_settings.name,
267 port_settings=[port_settings])
274 Cleanup deployed resources
279 nova_utils.delete_vm_instance(self.nova, self.vm_inst)
284 neutron_utils.delete_port(self.neutron, self.port)
287 if self.flavor_creator:
289 self.flavor_creator.clean()
292 if self.network_creator:
294 self.network_creator.clean()
297 if self.image_creator:
299 self.image_creator.clean()
303 def test_create_instance(self):
305 Tests the nova_utils.create_server() method
309 self.vm_inst = nova_utils.create_server(
310 self.nova, self.neutron, self.glance, self.instance_settings,
311 self.image_creator.image_settings)
313 self.assertIsNotNone(self.vm_inst)
315 # Wait until instance is ACTIVE
319 if create_instance.STATUS_ACTIVE == nova_utils.get_server_status(
320 self.nova, self.vm_inst):
327 self.assertTrue(active)
328 vm_inst = nova_utils.get_latest_server_object(self.nova, self.vm_inst)
330 self.assertEqual(self.vm_inst.name, vm_inst.name)
331 self.assertEqual(self.vm_inst.id, vm_inst.id)