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.
15 from snaps.config.volume_type import (
16 VolumeTypeConfig, VolumeTypeEncryptionConfig, VolumeTypeConfigError,
18 from snaps.config.qos import QoSConfig, Consumer
19 from snaps.openstack.create_qos import OpenStackQoS
22 from urllib.request import URLError
24 from urllib2 import URLError
30 from snaps.openstack import create_volume_type
31 from snaps.openstack.create_volume_type import (
32 VolumeTypeSettings, VolumeTypeEncryptionSettings, OpenStackVolumeType)
33 from snaps.openstack.tests.os_source_file_test import OSIntegrationTestCase
34 from snaps.openstack.utils import cinder_utils
36 __author__ = 'spisarski'
38 logger = logging.getLogger('create_volume_type_tests')
41 class VolumeTypeSettingsUnitTests(unittest.TestCase):
43 Tests the construction of the VolumeTypeSettings class
46 def test_no_params(self):
47 with self.assertRaises(VolumeTypeConfigError):
50 def test_empty_config(self):
51 with self.assertRaises(VolumeTypeConfigError):
52 VolumeTypeSettings(**dict())
54 def test_name_only(self):
55 settings = VolumeTypeSettings(name='foo')
56 self.assertEqual('foo', settings.name)
57 self.assertIsNone(settings.description)
58 self.assertIsNone(settings.qos_spec_name)
59 self.assertIsNone(settings.encryption)
60 self.assertFalse(settings.public)
62 def test_config_with_name_only(self):
63 settings = VolumeTypeSettings(**{'name': 'foo'})
64 self.assertEqual('foo', settings.name)
65 self.assertIsNone(settings.description)
66 self.assertIsNone(settings.qos_spec_name)
67 self.assertIsNone(settings.encryption)
68 self.assertFalse(settings.public)
71 encryption_settings = VolumeTypeEncryptionSettings(
72 name='foo', provider_class='bar',
73 control_location=ControlLocation.back_end)
74 settings = VolumeTypeSettings(
75 name='foo', description='desc', encryption=encryption_settings,
76 qos_spec_name='spec_name', public=True)
77 self.assertEqual('foo', settings.name)
78 self.assertEqual('desc', settings.description)
79 self.assertEqual('spec_name', settings.qos_spec_name)
80 self.assertEqual(encryption_settings, settings.encryption)
81 self.assertTrue(True, settings.public)
83 def test_all_string(self):
84 encryption_settings = {
85 'name': 'foo', 'provider_class': 'bar',
86 'control_location': 'back-end'}
87 settings = VolumeTypeSettings(
88 name='foo', description='desc', encryption=encryption_settings,
89 qos_spec_name='spec_name', public='true')
90 self.assertEqual('foo', settings.name)
91 self.assertEqual('desc', settings.description)
92 self.assertEqual('spec_name', settings.qos_spec_name)
93 self.assertEqual(VolumeTypeEncryptionSettings(**encryption_settings),
95 self.assertTrue(settings.public)
97 def test_config_all(self):
98 encryption_settings = {
99 'name': 'foo', 'provider_class': 'bar',
100 'control_location': 'back-end'}
101 settings = VolumeTypeSettings(
102 **{'name': 'foo', 'description': 'desc',
103 'encryption': encryption_settings,
104 'qos_spec_name': 'spec_name', 'public': 'false'})
105 self.assertEqual('foo', settings.name)
106 self.assertEqual('desc', settings.description)
107 self.assertEqual('spec_name', settings.qos_spec_name)
108 self.assertEqual(VolumeTypeEncryptionSettings(**encryption_settings),
110 self.assertFalse(settings.public)
113 class CreateSimpleVolumeTypeSuccessTests(OSIntegrationTestCase):
115 Test for the OpenStackVolumeType class defined in py
116 without any QoS Specs or Encryption
121 Instantiates the CreateVolumeType object that is responsible for
122 downloading and creating an OS volume type file within OpenStack
124 super(self.__class__, self).__start__()
127 self.volume_type_settings = VolumeTypeConfig(
128 name=self.__class__.__name__ + '-' + str(guid))
130 self.cinder = cinder_utils.cinder_client(self.admin_os_creds)
131 self.volume_type_creator = OpenStackVolumeType(
132 self.admin_os_creds, self.volume_type_settings)
136 Cleans the volume type
138 if self.volume_type_creator:
139 self.volume_type_creator.clean()
141 super(self.__class__, self).__clean__()
143 def test_create_volume_type(self):
145 Tests the creation of an OpenStack volume.
148 created_volume_type = self.volume_type_creator.create()
149 self.assertIsNotNone(created_volume_type)
150 self.assertEqual(self.volume_type_settings.name,
151 created_volume_type.name)
153 retrieved_volume_type1 = cinder_utils.get_volume_type(
154 self.cinder, volume_type_settings=self.volume_type_settings)
155 self.assertIsNotNone(retrieved_volume_type1)
156 self.assertEqual(created_volume_type, retrieved_volume_type1)
158 retrieved_volume_type2 = cinder_utils.get_volume_type_by_id(
159 self.cinder, created_volume_type.id)
160 self.assertEqual(created_volume_type, retrieved_volume_type2)
162 def test_create_delete_volume_type(self):
164 Tests the creation then deletion of an OpenStack volume type to ensure
165 clean() does not raise an Exception.
168 created_volume_type = self.volume_type_creator.create()
169 self.assertIsNotNone(created_volume_type)
171 retrieved_volume_type = cinder_utils.get_volume_type(
172 self.cinder, volume_type_settings=self.volume_type_settings)
173 self.assertIsNotNone(retrieved_volume_type)
174 self.assertEqual(created_volume_type, retrieved_volume_type)
176 # Delete VolumeType manually
177 cinder_utils.delete_volume_type(self.cinder, created_volume_type)
179 self.assertIsNone(cinder_utils.get_volume_type(
180 self.cinder, volume_type_settings=self.volume_type_settings))
182 # Must not throw an exception when attempting to cleanup non-existent
184 self.volume_type_creator.clean()
185 self.assertIsNone(self.volume_type_creator.get_volume_type())
187 def test_create_same_volume_type(self):
189 Tests the creation of an OpenStack volume_type when one already exists.
192 volume_type1 = self.volume_type_creator.create()
194 retrieved_volume_type = cinder_utils.get_volume_type(
195 self.cinder, volume_type_settings=self.volume_type_settings)
196 self.assertEqual(volume_type1, retrieved_volume_type)
198 # Should be retrieving the instance data
199 os_volume_type_2 = create_volume_type.OpenStackVolumeType(
200 self.admin_os_creds, self.volume_type_settings)
201 volume_type2 = os_volume_type_2.create()
202 self.assertEqual(volume_type2, volume_type2)
205 class CreateVolumeTypeComplexTests(OSIntegrationTestCase):
207 Test cases for the CreateVolumeType class that include QoS Specs and/or
212 super(self.__class__, self).__start__()
214 self.cinder = cinder_utils.cinder_client(self.admin_os_creds)
216 guid = self.__class__.__name__ + '-' + str(uuid.uuid4())
218 self.volume_type_name = guid + '-vol_type'
219 self.volume_type_creator = None
221 qos_settings = QoSConfig(
222 name=guid + '-qos-spec', consumer=Consumer.both)
223 self.qos_creator = OpenStackQoS(self.admin_os_creds, qos_settings)
224 self.qos_creator.create()
227 if self.volume_type_creator:
228 self.volume_type_creator.clean()
231 self.qos_creator.clean()
233 super(self.__class__, self).__clean__()
235 def test_volume_type_with_qos(self):
237 Creates a Volume Type object with an associated QoS Spec
239 self.volume_type_creator = OpenStackVolumeType(
242 name=self.volume_type_name,
243 qos_spec_name=self.qos_creator.qos_settings.name))
245 vol_type = self.volume_type_creator.create()
246 self.assertEqual(self.volume_type_creator.volume_type_settings.name,
248 self.assertEqual(self.volume_type_creator.volume_type_settings.name,
250 self.assertIsNotNone(vol_type.qos_spec)
252 self.volume_type_creator.volume_type_settings.qos_spec_name,
253 vol_type.qos_spec.name)
254 self.assertIsNone(vol_type.encryption)
256 vol_type_query = cinder_utils.get_volume_type_by_id(
257 self.cinder, vol_type.id)
258 self.assertIsNotNone(vol_type_query)
259 self.assertEqual(vol_type, vol_type_query)
261 def test_volume_type_with_encryption(self):
263 Creates a Volume Type object with encryption
265 encryption_settings = VolumeTypeEncryptionConfig(
266 name='foo', provider_class='bar',
267 control_location=ControlLocation.back_end)
268 self.volume_type_creator = OpenStackVolumeType(
271 name=self.volume_type_name,
272 encryption=encryption_settings))
274 vol_type = self.volume_type_creator.create()
275 self.assertEqual(self.volume_type_creator.volume_type_settings.name,
277 self.assertEqual(self.volume_type_creator.volume_type_settings.name,
279 self.assertIsNone(vol_type.qos_spec)
280 self.assertIsNotNone(vol_type.encryption)
282 self.assertEqual(encryption_settings.control_location.value,
283 vol_type.encryption.control_location)
285 vol_type_query = cinder_utils.get_volume_type_by_id(
286 self.cinder, vol_type.id)
287 self.assertIsNotNone(vol_type_query)
288 self.assertEqual(vol_type, vol_type_query)
290 def test_volume_type_with_qos_and_encryption(self):
292 Creates a Volume Type object with encryption and an associated QoS Spec
294 encryption_settings = VolumeTypeEncryptionConfig(
295 name='foo', provider_class='bar',
296 control_location=ControlLocation.back_end)
297 self.volume_type_creator = OpenStackVolumeType(
300 name=self.volume_type_name,
301 encryption=encryption_settings,
302 qos_spec_name=self.qos_creator.qos_settings.name))
304 vol_type = self.volume_type_creator.create()
305 self.assertEqual(self.volume_type_creator.volume_type_settings.name,
307 self.assertEqual(self.volume_type_creator.volume_type_settings.name,
309 self.assertIsNotNone(vol_type.qos_spec)
311 self.volume_type_creator.volume_type_settings.qos_spec_name,
312 vol_type.qos_spec.name)
313 self.assertIsNotNone(vol_type.encryption)
315 self.assertEqual(encryption_settings.control_location.value,
316 vol_type.encryption.control_location)
318 vol_type_query = cinder_utils.get_volume_type_by_id(
319 self.cinder, vol_type.id)
320 self.assertIsNotNone(vol_type_query)
321 self.assertEqual(vol_type, vol_type_query)