2 # Copyright (c) 2014 GigaSpaces Technologies Ltd. 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.
20 from novaclient import exceptions as nova_exceptions
22 import nova_plugin.server as server
23 from cloudify.exceptions import NonRecoverableError
24 from cloudify.mocks import MockCloudifyContext
27 class TestServerImageAndFlavor(unittest.TestCase):
29 def test_no_image_and_no_flavor(self):
34 with mock.patch('nova_plugin.server.ctx',
35 self._get_mock_ctx_with_node_properties(node_props)):
36 nova_client = self._get_mocked_nova_client()
39 self.assertRaises(NonRecoverableError,
40 server._handle_image_or_flavor,
41 serv, nova_client, 'image')
42 self.assertRaises(NonRecoverableError,
43 server._handle_image_or_flavor,
44 serv, nova_client, 'flavor')
46 def test_image_and_flavor_properties_as_names(self):
48 'image': 'some-image-name',
49 'flavor': 'some-flavor-name'
51 with mock.patch('nova_plugin.server.ctx',
52 self._get_mock_ctx_with_node_properties(node_props)):
53 nova_client = self._get_mocked_nova_client()
56 server._handle_image_or_flavor(serv, nova_client, 'image')
57 server._handle_image_or_flavor(serv, nova_client, 'flavor')
59 self.assertEquals('some-image-id', serv.get('image'))
60 self.assertEquals('some-flavor-id', serv.get('flavor'))
62 def test_image_and_flavor_properties_as_ids(self):
64 'image': 'some-image-id',
65 'flavor': 'some-flavor-id'
67 with mock.patch('nova_plugin.server.ctx',
68 self._get_mock_ctx_with_node_properties(node_props)):
69 nova_client = self._get_mocked_nova_client()
72 server._handle_image_or_flavor(serv, nova_client, 'image')
73 server._handle_image_or_flavor(serv, nova_client, 'flavor')
75 self.assertEquals('some-image-id', serv.get('image'))
76 self.assertEquals('some-flavor-id', serv.get('flavor'))
78 def test_image_id_and_flavor_id(self):
83 with mock.patch('nova_plugin.server.ctx',
84 self._get_mock_ctx_with_node_properties(node_props)):
85 nova_client = self._get_mocked_nova_client()
88 serv['image'] = 'some-image-id'
89 serv['flavor'] = 'some-flavor-id'
90 server._handle_image_or_flavor(serv, nova_client, 'image')
91 server._handle_image_or_flavor(serv, nova_client, 'flavor')
93 self.assertEquals('some-image-id', serv.get('image'))
94 self.assertEquals('some-flavor-id', serv.get('flavor'))
96 def test_image_name_and_flavor_name(self):
101 with mock.patch('nova_plugin.server.ctx',
102 self._get_mock_ctx_with_node_properties(node_props)):
103 nova_client = self._get_mocked_nova_client()
106 serv['image_name'] = 'some-image-name'
107 serv['flavor_name'] = 'some-flavor-name'
108 server._handle_image_or_flavor(serv, nova_client, 'image')
109 server._handle_image_or_flavor(serv, nova_client, 'flavor')
111 self.assertEquals('some-image-id', serv.get('image'))
112 self.assertNotIn('image_name', serv)
113 self.assertEquals('some-flavor-id', serv.get('flavor'))
114 self.assertNotIn('flavor_name', serv)
116 def test_unknown_image_name_and_flavor_name(self):
121 with mock.patch('nova_plugin.server.ctx',
122 self._get_mock_ctx_with_node_properties(node_props)):
123 nova_client = self._get_mocked_nova_client()
126 serv['image_name'] = 'some-unknown-image-name'
127 serv['flavor_name'] = 'some-unknown-flavor-name'
129 self.assertRaises(nova_exceptions.NotFound,
130 server._handle_image_or_flavor,
131 serv, nova_client, 'image')
132 self.assertRaises(nova_exceptions.NotFound,
133 server._handle_image_or_flavor,
134 serv, nova_client, 'flavor')
136 def test_image_id_and_flavor_id_override_on_properties(self):
138 'image': 'properties-image-id',
139 'flavor': 'properties-flavor-id'
141 with mock.patch('nova_plugin.server.ctx',
142 self._get_mock_ctx_with_node_properties(node_props)):
143 nova_client = self._get_mocked_nova_client()
146 serv['image'] = 'some-image-id'
147 serv['flavor'] = 'some-flavor-id'
148 server._handle_image_or_flavor(serv, nova_client, 'image')
149 server._handle_image_or_flavor(serv, nova_client, 'flavor')
151 self.assertEquals('some-image-id', serv.get('image'))
152 self.assertEquals('some-flavor-id', serv.get('flavor'))
154 def test_image_name_and_flavor_name_override_on_properties(self):
156 'image': 'properties-image-id',
157 'flavor': 'properties-flavor-id'
159 with mock.patch('nova_plugin.server.ctx',
160 self._get_mock_ctx_with_node_properties(node_props)):
161 nova_client = self._get_mocked_nova_client()
164 serv['image_name'] = 'some-image-name'
165 serv['flavor_name'] = 'some-flavor-name'
166 server._handle_image_or_flavor(serv, nova_client, 'image')
167 server._handle_image_or_flavor(serv, nova_client, 'flavor')
169 self.assertEquals('some-image-id', serv.get('image'))
170 self.assertNotIn('image_name', serv)
171 self.assertEquals('some-flavor-id', serv.get('flavor'))
172 self.assertNotIn('flavor_name', serv)
174 def test_image_name_and_flavor_name_override_on_image_and_flavor_ids(self):
179 with mock.patch('nova_plugin.server.ctx',
180 self._get_mock_ctx_with_node_properties(node_props)):
181 nova_client = self._get_mocked_nova_client()
184 serv['image'] = 'some-bad-image-id'
185 serv['image_name'] = 'some-image-name'
186 serv['flavor'] = 'some-bad-flavor-id'
187 serv['flavor_name'] = 'some-flavor-name'
188 server._handle_image_or_flavor(serv, nova_client, 'image')
189 server._handle_image_or_flavor(serv, nova_client, 'flavor')
191 self.assertEquals('some-image-id', serv.get('image'))
192 self.assertNotIn('image_name', serv)
193 self.assertEquals('some-flavor-id', serv.get('flavor'))
194 self.assertNotIn('flavor_name', serv)
197 def _get_mocked_nova_client():
198 nova_client = mock.MagicMock()
200 def mock_get_if_exists(prop_name, **kwargs):
201 is_image = prop_name == 'image'
202 searched_name = kwargs.get('name')
203 if (is_image and searched_name == 'some-image-name') or \
204 (not is_image and searched_name == 'some-flavor-name'):
205 result = mock.MagicMock()
206 result.id = 'some-image-id' if \
207 is_image else 'some-flavor-id'
211 def mock_find_generator(prop_name):
212 def mock_find(**kwargs):
213 result = mock_get_if_exists(prop_name, **kwargs)
215 raise nova_exceptions.NotFound(404)
219 nova_client.cosmo_plural = lambda x: '{0}s'.format(x)
220 nova_client.cosmo_get_if_exists = mock_get_if_exists
221 nova_client.images.find = mock_find_generator('image')
222 nova_client.flavors.find = mock_find_generator('flavor')
226 def _get_mock_ctx_with_node_properties(properties):
227 return MockCloudifyContext(node_id='test_node_id',
228 properties=properties)