Coverage for manila/tests/api/v2/test_share_networks.py: 99%
769 statements
« prev ^ index » next coverage.py v7.11.0, created at 2026-02-18 22:19 +0000
« prev ^ index » next coverage.py v7.11.0, created at 2026-02-18 22:19 +0000
1# Copyright 2014 NetApp
2# All Rights Reserved.
3#
4# Licensed under the Apache License, Version 2.0 (the "License"); you may
5# not use this file except in compliance with the License. You may obtain
6# 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, WITHOUT
12# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13# License for the specific language governing permissions and limitations
14# under the License.
16import copy
17from unittest import mock
18from urllib import parse
20import ddt
21from oslo_db import exception as db_exception
22from oslo_utils import timeutils
23from webob import exc as webob_exc
25from manila.api import common
26from manila.api.openstack import api_version_request as api_version
27from manila.api.v2 import share_networks
28from manila.db import api as db_api
29from manila import exception
30from manila import quota
31from manila.share import api as share_api
32from manila import test
33from manila.tests.api import fakes
34from manila.tests import db_utils
37fake_share_network_subnet = {
38 'id': 'fake subnet id',
39 'neutron_net_id': 'fake net id',
40 'neutron_subnet_id': 'fake subnet id',
41 'network_type': 'vlan',
42 'segmentation_id': 1000,
43 'cidr': '10.0.0.0/24',
44 'ip_version': 4,
45 'share_network_id': 'fake network id',
46 'availability_zone_id': None,
47 'share_servers': [],
48 'availability_zone': []
49}
51fake_share_network = {
52 'id': 'fake network id',
53 'project_id': 'fake project',
54 'created_at': timeutils.parse_strtime('2002-02-02', fmt="%Y-%m-%d"),
55 'updated_at': None,
56 'name': 'fake name',
57 'description': 'fake description',
58 'security_services': [],
59 'share_network_subnets': [],
60 'security_service_update_support': True,
61 'status': 'active'
62}
65fake_share_network_shortened = {
66 'id': 'fake network id',
67 'name': 'fake name',
68}
70fake_share_network_with_ss = {
71 'id': 'sn-id',
72 'project_id': 'fake',
73 'created_at': timeutils.parse_strtime('2001-01-01', fmt="%Y-%m-%d"),
74 'updated_at': None,
75 'name': 'test-sn',
76 'description': 'fake description',
77 'share_network_subnets': [],
78 'security_services': [{'id': 'fake-ss-id'}]
79}
81fake_sn_with_ss_shortened = {
82 'id': 'sn-id',
83 'name': 'test-sn',
84}
86ADD_UPDATE_SEC_SERVICE_VERSION = '2.63'
88QUOTAS = quota.QUOTAS
91@ddt.ddt
92class ShareNetworkAPITest(test.TestCase):
94 def setUp(self):
95 super(ShareNetworkAPITest, self).setUp()
96 self.controller = share_networks.ShareNetworkController()
97 self.req = fakes.HTTPRequest.blank('/share-networks')
98 self.body = {share_networks.RESOURCE_NAME: {'name': 'fake name'}}
99 self.context = self.req.environ['manila.context']
100 self.share_api = share_api.API()
102 def _check_share_network_view_shortened(self, view, share_nw):
103 self.assertEqual(share_nw['id'], view['id'])
104 self.assertEqual(share_nw['name'], view['name'])
106 def _check_share_network_view(self, view, share_nw):
107 self.assertEqual(share_nw['id'], view['id'])
108 self.assertEqual(share_nw['project_id'], view['project_id'])
109 self.assertEqual(share_nw['created_at'], view['created_at'])
110 self.assertEqual(share_nw['updated_at'], view['updated_at'])
111 self.assertEqual(share_nw['name'], view['name'])
112 self.assertEqual(share_nw['description'], view['description'])
113 self.assertNotIn('shares', view)
114 self.assertNotIn('network_allocations', view)
115 self.assertNotIn('security_services', view)
117 def _setup_body_for_create_test(self, data):
118 data.update({'user_id': 'fake_user_id'})
119 body = {share_networks.RESOURCE_NAME: data}
120 return body
122 @ddt.data(
123 {'neutron_net_id': 'fake', 'neutron_subnet_id': 'fake'})
124 def test_create_valid_cases(self, data):
125 body = self._setup_body_for_create_test(data)
126 result = self.controller.create(self.req, body)
127 data.pop('user_id', None)
128 for k, v in data.items():
129 self.assertIn(data[k], result['share_network'][k])
131 @ddt.data(
132 {'neutron_net_id': 'fake', 'neutron_subnet_id': 'fake',
133 'availability_zone': 'fake'})
134 def test_create_valid_cases_upper_2_50(self, data):
135 req = fakes.HTTPRequest.blank('/share-networks', version="2.51")
136 context = req.environ['manila.context']
137 body = self._setup_body_for_create_test(data)
138 fake_az = {
139 'name': 'fake',
140 'id': 'fake_id'
141 }
142 self.mock_object(db_api, 'availability_zone_get',
143 mock.Mock(return_value=fake_az))
145 result = self.controller.create(req, body)
146 result_subnet = result['share_network']['share_network_subnets'][0]
147 data.pop('user_id', None)
148 data.pop('project_id', None)
149 data.pop('availability_zone_id', None)
150 data.pop('id', None)
151 data['availability_zone'] = result_subnet['availability_zone']
153 for k, v in data.items():
154 self.assertIn(k, result_subnet.keys())
156 db_api.availability_zone_get.assert_called_once_with(
157 context, fake_az['name']
158 )
160 @ddt.data(
161 {'nova_net_id': 'foo', 'neutron_net_id': 'bar'},
162 {'nova_net_id': 'foo', 'neutron_subnet_id': 'quuz'},
163 {'nova_net_id': 'foo', 'neutron_net_id': 'bar',
164 'neutron_subnet_id': 'quuz'},
165 {'nova_net_id': 'fake_nova_net_id'},
166 {'neutron_net_id': 'bar'},
167 {'neutron_subnet_id': 'quuz'})
168 def test_create_invalid_cases(self, data):
169 data.update({'user_id': 'fake_user_id'})
170 body = {share_networks.RESOURCE_NAME: data}
171 self.assertRaises(
172 webob_exc.HTTPBadRequest, self.controller.create, self.req, body)
174 @ddt.data(
175 {'name': 'new fake name'},
176 {'description': 'new fake description'},
177 {'name': 'new fake name', 'description': 'new fake description'})
178 def test_update_valid_cases(self, data):
179 body = {share_networks.RESOURCE_NAME: {'user_id': 'fake_user'}}
180 created = self.controller.create(self.req, body)
182 body = {share_networks.RESOURCE_NAME: data}
183 result = self.controller.update(
184 self.req, created['share_network']['id'], body)
186 for k, v in data.items():
187 self.assertIn(data[k], result['share_network'][k])
189 self._check_share_network_view(
190 result[share_networks.RESOURCE_NAME],
191 result['share_network'])
193 @ddt.data(
194 {'nova_net_id': 'foo', 'neutron_net_id': 'bar'},
195 {'nova_net_id': 'foo', 'neutron_subnet_id': 'quuz'},
196 {'nova_net_id': 'foo', 'neutron_net_id': 'bar',
197 'neutron_subnet_id': 'quuz'},
198 {'nova_net_id': 'fake_nova_net_id'},
199 )
200 def test_update_invalid_cases(self, data):
201 body = {share_networks.RESOURCE_NAME: {'user_id': 'fake_user'}}
202 created = self.controller.create(self.req, body)
203 body = {share_networks.RESOURCE_NAME: data}
204 self.assertRaises(
205 webob_exc.HTTPBadRequest,
206 self.controller.update,
207 self.req, created['share_network']['id'], body)
209 @ddt.data(
210 ({'share_network_subnets': [
211 {'share_network_id': fake_share_network['id']}]}, True),
212 ({'share_network_subnets': []}, False))
213 @ddt.unpack
214 def test__subnet_has_search_opt(self, network, has_search_opt):
215 search_opts = {
216 'share_network_id': fake_share_network['id']
217 }
219 result = None
221 for key, value in search_opts.items():
222 result = self.controller._subnet_has_search_opt(
223 key, value, network)
225 self.assertEqual(has_search_opt, result)
227 def test_create_nominal(self):
228 self.mock_object(db_api, 'share_network_subnet_create')
229 self.mock_object(db_api, 'share_network_get',
230 mock.Mock(return_value=fake_share_network))
231 self.mock_object(common, 'check_net_id_and_subnet_id')
232 with mock.patch.object(db_api,
233 'share_network_create',
234 mock.Mock(return_value=fake_share_network)):
236 result = self.controller.create(self.req, self.body)
238 db_api.share_network_create.assert_called_once_with(
239 self.req.environ['manila.context'],
240 self.body[share_networks.RESOURCE_NAME])
242 self._check_share_network_view(
243 result[share_networks.RESOURCE_NAME],
244 fake_share_network)
246 def test_create_db_api_exception(self):
247 with mock.patch.object(db_api,
248 'share_network_create',
249 mock.Mock(side_effect=db_exception.DBError)):
250 self.assertRaises(webob_exc.HTTPInternalServerError,
251 self.controller.create,
252 self.req,
253 self.body)
255 def test_create_wrong_body(self):
256 body = None
257 self.assertRaises(webob_exc.HTTPUnprocessableEntity,
258 self.controller.create,
259 self.req,
260 body)
262 @ddt.data(
263 {'availability_zone': 'fake-zone'})
264 def test_create_az_not_found(self, data):
265 req = fakes.HTTPRequest.blank('/share-networks', version="2.51")
267 self.mock_object(
268 db_api, 'availability_zone_get',
269 mock.Mock(
270 side_effect=exception.AvailabilityZoneNotFound(id='fake')))
272 body = {share_networks.RESOURCE_NAME: data}
274 self.assertRaises(webob_exc.HTTPBadRequest,
275 self.controller.create,
276 req,
277 body)
279 def test_create_error_on_network_creation(self):
280 self.mock_object(share_networks.QUOTAS, 'reserve',
281 mock.Mock(return_value='fake_reservation'))
282 self.mock_object(share_networks.QUOTAS, 'rollback')
283 self.mock_object(db_api, 'share_network_create',
284 mock.Mock(side_effect=db_exception.DBError()))
286 self.assertRaises(webob_exc.HTTPInternalServerError,
287 self.controller.create,
288 self.req,
289 self.body)
290 self.assertTrue(share_networks.QUOTAS.rollback.called)
292 def test_create_error_on_subnet_creation(self):
293 data = {
294 'neutron_net_id': 'fake',
295 'neutron_subnet_id': 'fake',
296 'id': fake_share_network['id']
297 }
298 subnet_data = copy.deepcopy(data)
299 self.mock_object(share_networks.QUOTAS, 'reserve',
300 mock.Mock(return_value='fake_reservation'))
301 self.mock_object(share_networks.QUOTAS, 'rollback')
302 self.mock_object(db_api, 'share_network_create',
303 mock.Mock(return_value=fake_share_network))
304 self.mock_object(db_api, 'share_network_subnet_create',
305 mock.Mock(side_effect=db_exception.DBError()))
306 self.mock_object(db_api, 'share_network_delete')
307 body = {share_networks.RESOURCE_NAME: data}
309 self.assertRaises(webob_exc.HTTPInternalServerError,
310 self.controller.create,
311 self.req,
312 body)
314 db_api.share_network_create.assert_called_once_with(self.context, data)
315 subnet_data['share_network_id'] = data['id']
316 subnet_data.pop('id')
317 db_api.share_network_subnet_create.assert_called_once_with(
318 self.context, subnet_data)
319 db_api.share_network_delete.assert_called_once_with(
320 self.context, fake_share_network['id'])
321 self.assertTrue(share_networks.QUOTAS.rollback.called)
323 def test_delete_nominal(self):
324 share_nw = fake_share_network.copy()
325 subnet = fake_share_network_subnet.copy()
326 subnet['share_servers'] = ['foo', 'bar']
327 share_nw['share_network_subnets'] = [subnet]
328 self.mock_object(db_api, 'share_network_get',
329 mock.Mock(return_value=share_nw))
330 self.mock_object(db_api, 'share_instance_get_all_by_share_network',
331 mock.Mock(return_value=[]))
332 self.mock_object(self.controller.share_rpcapi, 'delete_share_server')
333 self.mock_object(self.controller,
334 '_all_share_servers_are_auto_deletable',
335 mock.Mock(return_value=True))
336 self.mock_object(db_api, 'share_network_delete')
338 self.controller.delete(self.req, share_nw['id'])
340 db_api.share_network_get.assert_called_once_with(
341 self.req.environ['manila.context'], share_nw['id'])
342 (db_api.share_instance_get_all_by_share_network.
343 assert_called_once_with(self.req.environ['manila.context'],
344 share_nw['id']))
345 self.controller.share_rpcapi.delete_share_server.assert_has_calls([
346 mock.call(self.req.environ['manila.context'], 'foo'),
347 mock.call(self.req.environ['manila.context'], 'bar')])
348 db_api.share_network_delete.assert_called_once_with(
349 self.req.environ['manila.context'], share_nw['id'])
351 def test_delete_not_found(self):
352 share_nw = 'fake network id'
353 self.mock_object(db_api, 'share_network_get',
354 mock.Mock(side_effect=exception.ShareNetworkNotFound(
355 share_network_id=share_nw)))
357 self.assertRaises(webob_exc.HTTPNotFound,
358 self.controller.delete,
359 self.req,
360 share_nw)
362 def test_quota_delete_reservation_failed(self):
363 share_nw = fake_share_network.copy()
364 subnet = fake_share_network_subnet.copy()
365 subnet['share_servers'] = ['foo', 'bar']
366 share_nw['share_network_subnets'] = [subnet]
367 share_nw['user_id'] = 'fake_user_id'
369 self.mock_object(db_api, 'share_network_get',
370 mock.Mock(return_value=share_nw))
371 self.mock_object(db_api, 'share_instance_get_all_by_share_network',
372 mock.Mock(return_value=[]))
373 self.mock_object(self.controller,
374 '_all_share_servers_are_auto_deletable',
375 mock.Mock(return_value=True))
376 self.mock_object(self.controller.share_rpcapi, 'delete_share_server')
377 self.mock_object(db_api, 'share_network_delete')
378 self.mock_object(share_networks.QUOTAS, 'reserve',
379 mock.Mock(side_effect=Exception))
380 self.mock_object(share_networks.QUOTAS, 'commit')
382 self.controller.delete(self.req, share_nw['id'])
384 db_api.share_network_get.assert_called_once_with(
385 self.req.environ['manila.context'], share_nw['id'])
387 (db_api.share_instance_get_all_by_share_network.
388 assert_called_once_with(self.req.environ['manila.context'],
389 share_nw['id']))
391 self.controller.share_rpcapi.delete_share_server.assert_has_calls([
392 mock.call(self.req.environ['manila.context'], 'foo'),
393 mock.call(self.req.environ['manila.context'], 'bar')])
394 db_api.share_network_delete.assert_called_once_with(
395 self.req.environ['manila.context'], share_nw['id'])
396 share_networks.QUOTAS.reserve.assert_called_once_with(
397 self.req.environ['manila.context'],
398 project_id=share_nw['project_id'],
399 share_networks=-1,
400 user_id=share_nw['user_id']
401 )
402 self.assertFalse(share_networks.QUOTAS.commit.called)
404 def test_delete_in_use_by_share(self):
405 share_nw = fake_share_network.copy()
406 self.mock_object(db_api, 'share_network_get',
407 mock.Mock(return_value=share_nw))
408 self.mock_object(db_api, 'share_instance_get_all_by_share_network',
409 mock.Mock(return_value=['foo', 'bar']))
411 self.assertRaises(webob_exc.HTTPConflict,
412 self.controller.delete,
413 self.req,
414 share_nw['id'])
416 db_api.share_network_get.assert_called_once_with(
417 self.req.environ['manila.context'], share_nw['id'])
418 (db_api.share_instance_get_all_by_share_network.
419 assert_called_once_with(self.req.environ['manila.context'],
420 share_nw['id']))
422 def test_delete_in_use_by_share_group(self):
423 share_nw = fake_share_network.copy()
424 self.mock_object(db_api, 'share_network_get',
425 mock.Mock(return_value=share_nw))
426 self.mock_object(db_api, 'count_share_groups_in_share_network',
427 mock.Mock(return_value=2))
429 self.assertRaises(webob_exc.HTTPConflict,
430 self.controller.delete,
431 self.req,
432 share_nw['id'])
434 db_api.share_network_get.assert_called_once_with(
435 self.req.environ['manila.context'], share_nw['id'])
437 def test_delete_contains_is_auto_deletable_false_servers(self):
438 share_nw = fake_share_network.copy()
439 self.mock_object(db_api, 'share_network_get',
440 mock.Mock(return_value=share_nw))
441 self.mock_object(db_api, 'count_share_groups_in_share_network')
442 self.mock_object(share_networks.ShareNetworkController,
443 '_all_share_servers_are_auto_deletable',
444 mock.Mock(return_value=False))
446 self.assertRaises(webob_exc.HTTPConflict,
447 self.controller.delete,
448 self.req,
449 share_nw['id'])
451 db_api.share_network_get.assert_called_once_with(
452 self.req.environ['manila.context'], share_nw['id'])
454 def test_delete_contains_more_than_one_subnet(self):
455 share_nw = fake_share_network.copy()
456 self.mock_object(db_api, 'share_network_get',
457 mock.Mock(return_value=share_nw))
458 self.mock_object(db_api, 'share_instance_get_all_by_share_network',
459 mock.Mock(return_value=None))
460 self.mock_object(db_api, 'count_share_groups_in_share_network',
461 mock.Mock(return_value=None))
462 self.mock_object(self.controller, '_share_network_contains_subnets',
463 mock.Mock(return_value=True))
465 self.assertRaises(webob_exc.HTTPConflict,
466 self.controller.delete,
467 self.req,
468 share_nw['id'])
470 db_api.share_network_get.assert_called_once_with(
471 self.context, share_nw['id'])
472 (db_api.share_instance_get_all_by_share_network
473 .assert_called_once_with(self.context, share_nw['id']))
474 db_api.count_share_groups_in_share_network.assert_called_once_with(
475 self.context, share_nw['id']
476 )
477 (self.controller._share_network_contains_subnets
478 .assert_called_once_with(share_nw))
480 def test_delete_subnet_contains_share_server(self):
481 share_nw = fake_share_network.copy()
482 share_nw['share_network_subnets'].append({
483 'id': 'fake_sns_id',
484 'share_servers': [{'id': 'fake_share_server_id'}]
485 })
486 self.mock_object(db_api, 'share_network_get',
487 mock.Mock(return_value=share_nw))
488 self.mock_object(db_api, 'count_share_groups_in_share_network',
489 mock.Mock(return_value=0))
490 self.mock_object(self.controller, '_share_network_contains_subnets',
491 mock.Mock(return_value=False))
492 self.mock_object(
493 self.controller, '_all_share_servers_are_auto_deletable',
494 mock.Mock(return_value=False))
496 self.assertRaises(webob_exc.HTTPConflict,
497 self.controller.delete,
498 self.req,
499 share_nw['id'])
501 @ddt.data(
502 ({'share_servers': [{'is_auto_deletable': True},
503 {'is_auto_deletable': True}]}, True),
504 ({'share_servers': [{'is_auto_deletable': True},
505 {'is_auto_deletable': False}]}, False),
506 )
507 @ddt.unpack
508 def test__share_servers_are_auto_deletable(self, fake_share_network,
509 expected_result):
510 self.assertEqual(
511 expected_result,
512 self.controller._all_share_servers_are_auto_deletable(
513 fake_share_network))
515 @ddt.data(
516 ({'share_network_subnets': [{'share_servers': [{}, {}]}]}, True),
517 ({'share_network_subnets': [{'share_servers': []}]}, False),
518 )
519 @ddt.unpack
520 def test__share_network_subnets_contain_share_servers(self, share_network,
521 expected_result):
522 self.assertEqual(
523 expected_result,
524 self.controller._share_network_subnets_contain_share_servers(
525 share_network))
527 def test_show_nominal(self):
528 share_nw = 'fake network id'
529 with mock.patch.object(db_api,
530 'share_network_get',
531 mock.Mock(return_value=fake_share_network)):
532 result = self.controller.show(self.req, share_nw)
534 db_api.share_network_get.assert_called_once_with(
535 self.req.environ['manila.context'],
536 share_nw)
538 self._check_share_network_view(
539 result[share_networks.RESOURCE_NAME],
540 fake_share_network)
542 def test_show_not_found(self):
543 share_nw = 'fake network id'
544 test_exception = exception.ShareNetworkNotFound(
545 share_network_id=share_nw)
546 with mock.patch.object(db_api,
547 'share_network_get',
548 mock.Mock(side_effect=test_exception)):
549 self.assertRaises(webob_exc.HTTPNotFound,
550 self.controller.show,
551 self.req,
552 share_nw)
554 def test_index_no_filters(self):
555 networks = [fake_share_network]
556 with mock.patch.object(db_api,
557 'share_network_get_all_by_filter',
558 mock.Mock(return_value=networks)):
560 result = self.controller.index(self.req)
562 db_api.share_network_get_all_by_filter.assert_called_once_with(
563 self.context, filters={})
565 self.assertEqual(1, len(result[share_networks.RESOURCES_NAME]))
566 self._check_share_network_view_shortened(
567 result[share_networks.RESOURCES_NAME][0],
568 fake_share_network_shortened)
570 def test_index_detailed(self):
571 networks = [fake_share_network]
572 with mock.patch.object(db_api,
573 'share_network_get_all_by_filter',
574 mock.Mock(return_value=networks)):
576 result = self.controller.detail(self.req)
578 db_api.share_network_get_all_by_filter.assert_called_once_with(
579 self.context, filters={})
581 self.assertEqual(1, len(result[share_networks.RESOURCES_NAME]))
582 self._check_share_network_view(
583 result[share_networks.RESOURCES_NAME][0],
584 fake_share_network)
586 @mock.patch.object(db_api, 'share_network_get_all_by_filter',
587 mock.Mock())
588 def test_index_filter_by_security_service(self):
589 db_api.share_network_get_all_by_filter.return_value = [
590 fake_share_network_with_ss]
591 req = fakes.HTTPRequest.blank(
592 '/share_networks?security_service_id=fake-ss-id')
593 result = self.controller.index(req)
594 filters = {'security_service_id': 'fake-ss-id'}
595 (db_api.share_network_get_all_by_filter.
596 assert_called_once_with(req.environ['manila.context'],
597 filters=filters))
598 self.assertEqual(1, len(result[share_networks.RESOURCES_NAME]))
599 self._check_share_network_view_shortened(
600 result[share_networks.RESOURCES_NAME][0],
601 fake_sn_with_ss_shortened)
603 @mock.patch.object(db_api, 'share_network_get_all_by_filter', mock.Mock())
604 def test_index_all_tenants_non_admin_context(self):
605 req = fakes.HTTPRequest.blank(
606 '/share_networks?all_tenants=1')
607 fake_context = req.environ['manila.context']
608 db_api.share_network_get_all_by_filter.return_value = []
609 self.controller.index(req)
610 db_api.share_network_get_all_by_filter.assert_called_with(
611 fake_context, filters={})
613 @mock.patch.object(db_api, 'share_network_get_all_by_filter', mock.Mock())
614 def test_index_all_tenants_admin_context(self):
615 db_api.share_network_get_all_by_filter.return_value = [
616 fake_share_network]
617 req = fakes.HTTPRequest.blank(
618 '/share_networks?all_tenants=1',
619 use_admin_context=True)
620 result = self.controller.index(req)
621 db_api.share_network_get_all_by_filter.assert_called_once_with(
622 req.environ['manila.context'], filters={})
623 self.assertEqual(1, len(result[share_networks.RESOURCES_NAME]))
624 self._check_share_network_view_shortened(
625 result[share_networks.RESOURCES_NAME][0],
626 fake_share_network_shortened)
628 @mock.patch.object(db_api, 'share_network_get_all', mock.Mock())
629 def test_index_all_tenants_with_invaild_value(self):
630 req = fakes.HTTPRequest.blank(
631 '/share_networks?all_tenants=wonk',
632 use_admin_context=True)
634 self.assertRaises(exception.InvalidInput, self.controller.index, req)
636 @mock.patch.object(db_api, 'share_network_get_all_by_filter', mock.Mock())
637 def test_index_all_tenants_with_value_zero(self):
638 db_api.share_network_get_all_by_filter.return_value = [
639 fake_share_network]
640 req = fakes.HTTPRequest.blank(
641 '/share_networks?all_tenants=0',
642 use_admin_context=True)
644 result = self.controller.index(req)
646 self.assertEqual(1, len(result[share_networks.RESOURCES_NAME]))
647 self._check_share_network_view_shortened(
648 result[share_networks.RESOURCES_NAME][0],
649 fake_share_network_shortened)
650 filters = {'project_id': 'fake'}
651 db_api.share_network_get_all_by_filter.assert_called_once_with(
652 req.environ['manila.context'], filters=filters)
654 @mock.patch.object(db_api, 'share_network_get_all_by_filter', mock.Mock())
655 def test_index_filter_by_project_id_non_admin_context(self):
656 req = fakes.HTTPRequest.blank(
657 '/share_networks?project_id=fake project')
658 fake_context = req.environ['manila.context']
659 db_api.share_network_get_all_by_filter.return_value = []
660 self.controller.index(req)
661 db_api.share_network_get_all_by_filter.assert_called_with(
662 fake_context, filters={})
664 @mock.patch.object(db_api, 'share_network_get_all_by_filter', mock.Mock())
665 def test_index_filter_by_project_id_admin_context(self):
666 db_api.share_network_get_all_by_filter.return_value = [
667 fake_share_network_with_ss
668 ]
669 req = fakes.HTTPRequest.blank(
670 '/share_networks?project_id=fake',
671 use_admin_context=True)
672 result = self.controller.index(req)
673 filters = {'project_id': 'fake'}
674 db_api.share_network_get_all_by_filter.assert_called_once_with(
675 req.environ['manila.context'], filters=filters)
676 self.assertEqual(1, len(result[share_networks.RESOURCES_NAME]))
677 self._check_share_network_view_shortened(
678 result[share_networks.RESOURCES_NAME][0],
679 fake_sn_with_ss_shortened)
681 @mock.patch.object(db_api, 'share_network_get_all_by_filter',
682 mock.Mock())
683 def test_index_filter_by_ss_and_project_id_admin_context(self):
684 db_api.share_network_get_all_by_filter.return_value = [
685 fake_share_network_with_ss
686 ]
687 req = fakes.HTTPRequest.blank(
688 '/share_networks?security_service_id=fake-ss-id&project_id=fake',
689 use_admin_context=True)
690 result = self.controller.index(req)
691 filters = {'project_id': 'fake',
692 'security_service_id': 'fake-ss-id'}
693 db_api.share_network_get_all_by_filter.assert_called_once_with(
694 req.environ['manila.context'], filters=filters)
695 self.assertEqual(1, len(result[share_networks.RESOURCES_NAME]))
696 self._check_share_network_view_shortened(
697 result[share_networks.RESOURCES_NAME][0],
698 fake_sn_with_ss_shortened)
700 @ddt.data(('name=fo', 0), ('description=d', 0),
701 ('name=foo&description=d', 0),
702 ('name=foo', 1), ('description=ds', 1),
703 ('name~=foo&description~=ds', 2),
704 ('name=foo&description~=ds', 1),
705 ('name~=foo&description=ds', 1))
706 @ddt.unpack
707 @mock.patch.object(db_api, 'share_network_get_all_by_filter',
708 mock.Mock())
709 def test_index_filter_by_name_and_description(
710 self, filter, share_network_number):
711 fake_objs = [{'name': 'fo2', 'description': 'd2', 'id': 'fake1'},
712 {'name': 'foo', 'description': 'ds', 'id': 'fake2'},
713 {'name': 'foo1', 'description': 'ds1', 'id': 'fake3'}]
714 db_api.share_network_get_all_by_filter.return_value = fake_objs
715 req = fakes.HTTPRequest.blank(
716 '/share_networks?' + filter,
717 use_admin_context=True, version='2.36')
718 result = self.controller.index(req)
719 filters = {'project_id': self.context.project_id}
720 db_api.share_network_get_all_by_filter.assert_called_with(
721 req.environ['manila.context'], filters=filters)
722 self.assertEqual(share_network_number,
723 len(result[share_networks.RESOURCES_NAME]))
724 if share_network_number > 0:
725 self._check_share_network_view_shortened(
726 result[share_networks.RESOURCES_NAME][0], fake_objs[1])
727 if share_network_number > 1:
728 self._check_share_network_view_shortened(
729 result[share_networks.RESOURCES_NAME][1], fake_objs[2])
731 @mock.patch.object(db_api, 'share_network_get_all_by_filter',
732 mock.Mock())
733 def test_index_all_filter_opts(self):
734 valid_filter_opts = {
735 'created_before': '2001-02-02',
736 'created_since': '1999-01-01',
737 'name': 'test-sn'
738 }
739 db_api.share_network_get_all_by_filter.return_value = [
740 fake_share_network_with_ss]
742 query_string = '/share-networks?' + parse.urlencode(sorted(
743 [(k, v) for (k, v) in list(valid_filter_opts.items())]))
744 for use_admin_context in [True, False]:
745 req = fakes.HTTPRequest.blank(query_string,
746 use_admin_context=use_admin_context)
747 result = self.controller.index(req)
748 parsed_created_before = timeutils.parse_strtime(
749 valid_filter_opts['created_before'], fmt="%Y-%m-%d")
750 parsed_created_since = timeutils.parse_strtime(
751 valid_filter_opts['created_since'], fmt="%Y-%m-%d")
752 filters = {'created_before': parsed_created_before,
753 'created_since': parsed_created_since}
754 if use_admin_context:
755 filters['project_id'] = 'fake'
756 db_api.share_network_get_all_by_filter.assert_called_with(
757 req.environ['manila.context'], filters=filters)
758 self.assertEqual(1, len(result[share_networks.RESOURCES_NAME]))
759 self._check_share_network_view_shortened(
760 result[share_networks.RESOURCES_NAME][0],
761 fake_sn_with_ss_shortened)
763 @mock.patch.object(db_api, 'share_network_get', mock.Mock())
764 def test_update_nominal(self):
765 share_nw = 'fake network id'
766 db_api.share_network_get.return_value = fake_share_network
768 body = {share_networks.RESOURCE_NAME: {'name': 'new name'}}
770 with mock.patch.object(db_api,
771 'share_network_update',
772 mock.Mock(return_value=fake_share_network)):
773 result = self.controller.update(self.req, share_nw, body)
775 db_api.share_network_update.assert_called_once_with(
776 self.req.environ['manila.context'],
777 share_nw,
778 body[share_networks.RESOURCE_NAME])
780 self._check_share_network_view(
781 result[share_networks.RESOURCE_NAME],
782 fake_share_network)
784 @mock.patch.object(db_api, 'share_network_get', mock.Mock())
785 def test_update_not_found(self):
786 share_nw = 'fake network id'
787 db_api.share_network_get.side_effect = exception.ShareNetworkNotFound(
788 share_network_id=share_nw)
790 self.assertRaises(webob_exc.HTTPNotFound,
791 self.controller.update,
792 self.req,
793 share_nw,
794 self.body)
796 def test_update_invalid_body(self):
797 self.assertRaises(webob_exc.HTTPUnprocessableEntity,
798 self.controller.update,
799 self.req,
800 'fake_sn_id',
801 None)
803 @mock.patch.object(db_api, 'share_network_get', mock.Mock())
804 def test_update_invalid_key_in_use(self):
805 share_nw = fake_share_network.copy()
806 subnet = fake_share_network_subnet.copy()
807 subnet['share_servers'] = [{'id': 1}]
808 share_nw['share_network_subnets'] = [subnet]
810 db_api.share_network_get.return_value = share_nw
811 body = {
812 share_networks.RESOURCE_NAME: {
813 'name': 'new name',
814 'user_id': 'new id',
815 },
816 }
817 self.assertRaises(webob_exc.HTTPForbidden,
818 self.controller.update,
819 self.req,
820 share_nw['id'],
821 body)
823 @mock.patch.object(db_api, 'share_network_get', mock.Mock())
824 @mock.patch.object(db_api, 'share_network_update', mock.Mock())
825 def test_update_valid_keys_in_use(self):
826 share_nw = fake_share_network.copy()
827 subnet = fake_share_network_subnet.copy()
828 subnet['share_servers'] = [{'id': 1}]
829 share_nw['share_network_subnets'] = [subnet]
830 updated_share_nw = share_nw.copy()
831 updated_share_nw['name'] = 'new name'
832 updated_share_nw['description'] = 'new description'
834 db_api.share_network_get.return_value = share_nw
835 db_api.share_network_update.return_value = updated_share_nw
836 body = {
837 share_networks.RESOURCE_NAME: {
838 'name': updated_share_nw['name'],
839 'description': updated_share_nw['description'],
840 },
841 }
842 self.controller.update(self.req, share_nw['id'], body)
843 db_api.share_network_get.assert_called_once_with(self.context,
844 share_nw['id'])
845 db_api.share_network_update.assert_called_once_with(
846 self.context, share_nw['id'], body['share_network'])
848 @mock.patch.object(db_api, 'share_network_get', mock.Mock())
849 def test_update_db_api_exception(self):
850 share_nw = 'fake network id'
851 db_api.share_network_get.return_value = fake_share_network
853 self.mock_object(
854 self.controller, '_share_network_subnets_contain_share_servers',
855 mock.Mock(return_value=False))
856 self.mock_object(db_api, 'share_network_subnet_get_default_subnets',
857 mock.Mock(return_value=[fake_share_network_subnet]))
858 self.mock_object(db_api, 'share_network_subnet_update')
860 body = {share_networks.RESOURCE_NAME: {'neutron_subnet_id':
861 'new subnet'}}
863 with mock.patch.object(db_api,
864 'share_network_update',
865 mock.Mock(side_effect=db_exception.DBError)):
866 self.assertRaises(webob_exc.HTTPBadRequest,
867 self.controller.update,
868 self.req,
869 share_nw,
870 body)
871 (db_api.share_network_subnet_get_default_subnets.
872 assert_called_once_with(self.context, share_nw))
873 db_api.share_network_subnet_update.assert_called_once_with(
874 self.context, fake_share_network_subnet['id'],
875 body['share_network'])
877 @ddt.data((webob_exc.HTTPBadRequest, 1, None,
878 'new subnet'),
879 (webob_exc.HTTPBadRequest, 2, None,
880 'new subnet'),
881 (webob_exc.HTTPBadRequest, None, 'neutron net', None))
882 @ddt.unpack
883 def test_update_default_subnet_errors(self, exception_to_raise,
884 get_default_subnet_return_length,
885 neutron_net_id, neutron_subnet_id):
886 share_nw = 'fake network id'
887 self.mock_object(db_api, 'share_network_get',
888 mock.Mock(return_value=fake_share_network))
889 self.mock_object(
890 self.controller, '_share_network_subnets_contain_share_servers',
891 mock.Mock(return_value=False))
892 self.mock_object(db_api, 'share_network_subnet_get_default_subnets',
893 mock.Mock(return_value=None))
895 if get_default_subnet_return_length:
896 fake_subnet = copy.deepcopy(fake_share_network_subnet)
897 fake_subnet['neutron_net_id'] = None
898 fake_subnet['neutron_subnet_id'] = None
900 if get_default_subnet_return_length == 1:
901 (db_api.share_network_subnet_get_default_subnets.
902 return_value) = [fake_subnet]
903 elif get_default_subnet_return_length == 2: 903 ↛ 907line 903 didn't jump to line 907 because the condition on line 903 was always true
904 (db_api.share_network_subnet_get_default_subnets.
905 return_value) = [fake_subnet, fake_subnet]
907 body = {
908 share_networks.RESOURCE_NAME: {
909 'neutron_net_id': neutron_net_id,
910 'neutron_subnet_id': neutron_subnet_id
911 }
912 }
914 self.assertRaises(exception_to_raise,
915 self.controller.update,
916 self.req,
917 share_nw,
918 body)
920 (db_api.share_network_subnet_get_default_subnets.
921 assert_called_once_with(self.context, share_nw))
923 @ddt.data(*set(("1.0", "2.25", "2.26", api_version._MAX_API_VERSION)))
924 def test_add_security_service(self, microversion):
925 share_network_id = 'fake network id'
926 security_service_id = 'fake ss id'
927 self.mock_object(
928 self.controller, '_share_network_subnets_contain_share_servers')
930 body = {'add_security_service': {'security_service_id':
931 security_service_id}}
933 req = fakes.HTTPRequest.blank('/share-networks', version=microversion)
934 with mock.patch.object(self.controller, 'add_security_service',
935 mock.Mock()):
936 self.controller.add_security_service(req, share_network_id, body)
937 self.controller.add_security_service.assert_called_once_with(
938 req, share_network_id, body)
940 def _setup_add_sec_services_with_servers_tests(
941 self, share_network, security_service, network_is_active=True,
942 version=ADD_UPDATE_SEC_SERVICE_VERSION,
943 share_api_update_services_action=mock.Mock()):
944 self.mock_object(
945 db_api, 'share_network_get', mock.Mock(return_value=share_network))
946 self.mock_object(
947 db_api, 'security_service_get',
948 mock.Mock(return_value=security_service))
949 self.mock_object(
950 self.controller, '_share_network_subnets_contain_share_servers',
951 mock.Mock(return_value=True))
952 self.mock_object(
953 self.controller.share_api, 'update_share_network_security_service',
954 share_api_update_services_action)
955 self.mock_object(
956 common, 'check_share_network_is_active',
957 mock.Mock(return_value=network_is_active))
958 self.mock_object(db_api, 'share_network_add_security_service')
959 self.mock_object(self.controller._view_builder, 'build_share_network')
961 body = {
962 'add_security_service': {
963 'security_service_id': security_service['id']
964 }
965 }
966 req = fakes.HTTPRequest.blank(
967 '/add_security_service', version=version, use_admin_context=True)
968 context = req.environ['manila.context']
970 return req, context, body
972 def test_add_security_service_with_servers(self):
973 security_service = db_utils.create_security_service()
974 security_service_id = security_service['id']
975 share_network = db_utils.create_share_network()
976 share_network_id = share_network['id']
977 req, context, body = self._setup_add_sec_services_with_servers_tests(
978 share_network, security_service)
980 self.controller.add_security_service(req, share_network_id, body)
982 db_api.security_service_get.assert_called_once_with(
983 context, security_service_id)
984 (self.controller._share_network_subnets_contain_share_servers.
985 assert_called_once_with(share_network))
986 db_api.share_network_get.assert_called_once_with(
987 context, share_network_id)
988 (self.controller.share_api.update_share_network_security_service.
989 assert_called_once_with(context, share_network, security_service))
991 def test_add_security_service_with_server_invalid_version(self):
992 security_service = db_utils.create_security_service()
993 security_service_id = security_service['id']
994 share_network = db_utils.create_share_network()
995 share_network_id = share_network['id']
996 req, context, body = self._setup_add_sec_services_with_servers_tests(
997 share_network, security_service, version='2.59')
999 self.assertRaises(
1000 webob_exc.HTTPForbidden,
1001 self.controller.add_security_service,
1002 req, share_network_id, body
1003 )
1005 db_api.security_service_get.assert_called_once_with(
1006 context, security_service_id)
1007 (self.controller._share_network_subnets_contain_share_servers.
1008 assert_called_once_with(share_network))
1009 db_api.share_network_get.assert_called_once_with(
1010 context, share_network_id)
1012 @ddt.data(
1013 (exception.ServiceIsDown(message='fake'), webob_exc.HTTPConflict),
1014 (exception.InvalidShareNetwork(message='fake'),
1015 webob_exc.HTTPBadRequest)
1016 )
1017 @ddt.unpack
1018 def test_add_security_service_with_server_update_failed(
1019 self, side_effect, exception_to_raise):
1020 security_service = db_utils.create_security_service()
1021 security_service_id = security_service['id']
1022 share_network_id = fake_share_network['id']
1023 fake_share_network['security_service_update_support'] = True
1024 action = mock.Mock(side_effect=side_effect)
1026 req, context, body = self._setup_add_sec_services_with_servers_tests(
1027 fake_share_network, security_service,
1028 share_api_update_services_action=action)
1030 self.assertRaises(
1031 exception_to_raise,
1032 self.controller.add_security_service,
1033 req, share_network_id, body
1034 )
1036 db_api.security_service_get.assert_called_once_with(
1037 context, security_service_id)
1038 db_api.share_network_get.assert_called_once_with(
1039 context, share_network_id)
1040 (self.controller.share_api.update_share_network_security_service.
1041 assert_called_once_with(context, fake_share_network,
1042 security_service))
1044 @ddt.data(
1045 (exception.NotFound(message='fake'), webob_exc.HTTPNotFound),
1046 (exception.ShareNetworkSecurityServiceAssociationError(message='fake'),
1047 webob_exc.HTTPBadRequest))
1048 @ddt.unpack
1049 def test_action_add_security_service_conflict(self, captured_exception,
1050 expected_raised_exception):
1051 share_network = fake_share_network.copy()
1052 share_network['security_services'] = [{'id': 'security_service_1',
1053 'type': 'ldap'}]
1054 security_service = {'id': ' security_service_2',
1055 'type': 'ldap'}
1056 body = {'add_security_service': {'security_service_id':
1057 security_service['id']}}
1058 request = fakes.HTTPRequest.blank(
1059 '/share-networks', use_admin_context=True)
1060 self.mock_object(
1061 self.controller, '_share_network_subnets_contain_share_servers',
1062 mock.Mock(return_value=False))
1063 update_sec_serv_mock = self.mock_object(
1064 self.controller.share_api, 'update_share_network_security_service')
1065 self.mock_object(db_api, 'share_network_get',
1066 mock.Mock(return_value=share_network))
1067 self.mock_object(db_api, 'security_service_get',
1068 mock.Mock(return_value=security_service))
1069 self.mock_object(share_networks.policy, 'check_policy')
1070 self.mock_object(
1071 db_api, 'share_network_add_security_service',
1072 mock.Mock(side_effect=captured_exception))
1074 db_api.security_service_get.return_value = security_service
1075 db_api.share_network_get.return_value = share_network
1076 self.assertRaises(expected_raised_exception,
1077 self.controller.add_security_service,
1078 request,
1079 share_network['id'],
1080 body)
1082 db_api.share_network_get.assert_called_once_with(
1083 request.environ['manila.context'], share_network['id'])
1084 db_api.security_service_get.assert_called_once_with(
1085 request.environ['manila.context'], security_service['id'])
1086 share_networks.policy.check_policy.assert_called_once_with(
1087 request.environ['manila.context'],
1088 share_networks.RESOURCE_NAME,
1089 'add_security_service', target_obj=share_network)
1090 update_sec_serv_mock.assert_called_once_with(
1091 request.environ['manila.context'], share_network,
1092 security_service)
1094 def _setup_update_sec_services_with_servers_tests(
1095 self, share_network, security_services,
1096 version=ADD_UPDATE_SEC_SERVICE_VERSION,
1097 share_api_update_services_action=mock.Mock()):
1099 self.mock_object(
1100 db_api, 'share_network_get', mock.Mock(return_value=share_network))
1101 self.mock_object(
1102 db_api, 'security_service_get',
1103 mock.Mock(side_effect=security_services))
1104 self.mock_object(
1105 self.controller.share_api, 'update_share_network_security_service',
1106 share_api_update_services_action)
1107 self.mock_object(self.controller._view_builder, 'build_share_network')
1108 self.mock_object(db_api, 'share_network_update_security_service')
1110 body = {
1111 'update_security_service': {
1112 'current_service_id': security_services[0]['id'],
1113 'new_service_id': security_services[1]['id']
1114 }
1115 }
1116 req = fakes.HTTPRequest.blank(
1117 '/add_security_service', version=version, use_admin_context=True)
1118 context = req.environ['manila.context']
1120 return req, context, body
1122 def test_update_security_service_service_not_found(self):
1123 security_services = [
1124 db_utils.create_security_service() for i in range(2)]
1125 share_network = copy.deepcopy(fake_share_network)
1126 share_network['security_service_update_support'] = True
1128 req, context, body = (
1129 self._setup_update_sec_services_with_servers_tests(
1130 share_network, security_services))
1132 db_api.security_service_get.side_effect = exception.NotFound('fake')
1134 self.assertRaises(
1135 webob_exc.HTTPBadRequest,
1136 self.controller.update_security_service,
1137 req, share_network['id'], body)
1139 db_api.share_network_get.assert_called_once_with(
1140 context, share_network['id'])
1141 db_api.security_service_get.assert_has_calls(
1142 [mock.call(context, security_services[0]['id'])]
1143 )
1145 @ddt.data(
1146 (exception.ServiceIsDown(message='fake'), webob_exc.HTTPConflict),
1147 (exception.InvalidShareNetwork(message='fake'),
1148 webob_exc.HTTPBadRequest))
1149 @ddt.unpack
1150 def test_update_security_service_share_api_failure(self, side_effect, exc):
1151 security_services = [
1152 db_utils.create_security_service() for i in range(2)]
1153 share_network = copy.deepcopy(fake_share_network)
1154 share_network['security_service_update_support'] = True
1156 req, context, body = (
1157 self._setup_update_sec_services_with_servers_tests(
1158 share_network, security_services,
1159 share_api_update_services_action=mock.Mock(
1160 side_effect=side_effect)))
1162 self.assertRaises(
1163 exc,
1164 self.controller.update_security_service,
1165 req, share_network['id'], body)
1167 db_api.share_network_get.assert_called_once_with(
1168 context, share_network['id'])
1169 db_api.security_service_get.assert_has_calls(
1170 [mock.call(context, security_services[0]['id']),
1171 mock.call(context, security_services[1]['id'])]
1172 )
1174 def test_update_security_service(self):
1175 security_services = [
1176 db_utils.create_security_service() for i in range(2)]
1177 share_network = copy.copy(fake_share_network)
1178 share_network['security_service_update_support'] = True
1180 req, context, body = (
1181 self._setup_update_sec_services_with_servers_tests(
1182 share_network, security_services))
1184 self.controller.update_security_service(
1185 req, share_network['id'], body)
1187 db_api.share_network_get.assert_called_once_with(
1188 context, share_network['id'])
1189 db_api.security_service_get.assert_has_calls(
1190 [mock.call(context, security_services[0]['id']),
1191 mock.call(context, security_services[1]['id'])]
1192 )
1193 (self.controller.share_api.update_share_network_security_service.
1194 assert_called_once_with(
1195 context, share_network, security_services[1],
1196 current_security_service=security_services[0]))
1197 db_api.share_network_update_security_service.assert_called_once_with(
1198 context, share_network['id'], security_services[0]['id'],
1199 security_services[1]['id'])
1201 @ddt.data(*set(("1.0", "2.25", "2.26", api_version._MAX_API_VERSION)))
1202 def test_action_remove_security_service(self, microversion):
1203 share_network_id = 'fake network id'
1204 security_service_id = 'fake ss id'
1205 self.mock_object(
1206 self.controller, '_share_network_subnets_contain_share_servers')
1207 body = {'remove_security_service': {'security_service_id':
1208 security_service_id}}
1210 req = fakes.HTTPRequest.blank('/share-networks', version=microversion)
1211 with mock.patch.object(self.controller, 'remove_security_service',
1212 mock.Mock()):
1213 self.controller.remove_security_service(
1214 req, share_network_id, body)
1215 self.controller.remove_security_service.assert_called_once_with(
1216 req, share_network_id, body)
1218 @mock.patch.object(db_api, 'share_network_get', mock.Mock())
1219 @mock.patch.object(share_networks.policy, 'check_policy', mock.Mock())
1220 def test_action_remove_security_service_forbidden(self):
1221 share_network = fake_share_network.copy()
1222 subnet = fake_share_network_subnet.copy()
1223 subnet['share_servers'] = ['foo']
1224 share_network['share_network_subnets'] = [subnet]
1225 db_api.share_network_get.return_value = share_network
1226 self.mock_object(
1227 self.controller, '_share_network_subnets_contain_share_servers',
1228 mock.Mock(return_value=True))
1229 body = {
1230 'remove_security_service': {
1231 'security_service_id': 'fake id',
1232 },
1233 }
1234 self.assertRaises(webob_exc.HTTPForbidden,
1235 self.controller.remove_security_service,
1236 self.req,
1237 share_network['id'],
1238 body)
1239 db_api.share_network_get.assert_called_once_with(
1240 self.req.environ['manila.context'], share_network['id'])
1241 share_networks.policy.check_policy.assert_called_once_with(
1242 self.req.environ['manila.context'],
1243 share_networks.RESOURCE_NAME,
1244 'remove_security_service', target_obj=share_network)
1246 @mock.patch.object(share_networks.policy, 'check_policy', mock.Mock())
1247 def test_action_remove_security_service_share_no_share_servers(self):
1248 share_network = fake_share_network.copy()
1249 subnet = fake_share_network_subnet.copy()
1250 share_network['share_network_subnets'] = [subnet]
1251 mock_share_net_get = self.mock_object(
1252 db_api, 'share_network_get', mock.Mock(return_value=share_network))
1253 mock_contains_servers = self.mock_object(
1254 self.controller, '_share_network_subnets_contain_share_servers',
1255 mock.Mock(return_value=False))
1256 mock_api_remove = self.mock_object(
1257 db_api, 'share_network_remove_security_service',
1258 mock.Mock(return_value=share_network))
1259 mock_view = self.mock_object(
1260 self.controller._view_builder, 'build_share_network',
1261 mock.Mock(return_value='fake_view'))
1262 body = {
1263 'remove_security_service': {
1264 'security_service_id': 'fake_ss_id',
1265 },
1266 }
1268 view = self.controller.remove_security_service(
1269 self.req, share_network['id'], body)
1271 self.assertEqual('fake_view', view)
1272 mock_share_net_get.assert_called_once_with(
1273 self.req.environ['manila.context'], share_network['id'])
1274 share_networks.policy.check_policy.assert_called_once_with(
1275 self.req.environ['manila.context'],
1276 share_networks.RESOURCE_NAME,
1277 'remove_security_service', target_obj=share_network)
1278 mock_contains_servers.assert_called_once_with(share_network)
1279 mock_api_remove.assert_called_once_with(
1280 self.req.environ['manila.context'], share_network['id'],
1281 'fake_ss_id')
1282 mock_view.assert_called_once_with(self.req, share_network)
1284 @ddt.data(
1285 (KeyError, webob_exc.HTTPBadRequest),
1286 (exception.NotFound(message='fake'), webob_exc.HTTPNotFound),
1287 (exception.ShareNetworkSecurityServiceDissociationError(
1288 message='fake'), webob_exc.HTTPBadRequest))
1289 @ddt.unpack
1290 def test_action_remove_security_service_share_api_exception(self, api_exp,
1291 expect_exp):
1292 share_network = fake_share_network.copy()
1293 subnet = fake_share_network_subnet.copy()
1294 share_network['share_network_subnets'] = [subnet]
1295 mock_policy = self.mock_object(
1296 share_networks.policy, 'check_policy', mock.Mock())
1297 mock_share_net_get = self.mock_object(
1298 db_api, 'share_network_get',
1299 mock.Mock(return_value=share_network))
1300 mock_contains_servers = self.mock_object(
1301 self.controller, '_share_network_subnets_contain_share_servers',
1302 mock.Mock(return_value=False))
1303 mock_api_remove = self.mock_object(
1304 db_api, 'share_network_remove_security_service',
1305 mock.Mock(side_effect=api_exp))
1306 body = {
1307 'remove_security_service': {
1308 'security_service_id': 'fake_ss_id',
1309 },
1310 }
1312 self.assertRaises(expect_exp,
1313 self.controller.remove_security_service,
1314 self.req,
1315 share_network['id'],
1316 body)
1318 mock_share_net_get.assert_called_once_with(
1319 self.req.environ['manila.context'], share_network['id'])
1320 db_api.share_network_get.assert_called_once_with(
1321 self.req.environ['manila.context'], share_network['id'])
1322 mock_policy.assert_called_once_with(
1323 self.req.environ['manila.context'],
1324 share_networks.RESOURCE_NAME,
1325 'remove_security_service', target_obj=share_network)
1326 mock_contains_servers.assert_called_once_with(share_network)
1327 mock_api_remove.assert_called_once_with(
1328 self.req.environ['manila.context'], share_network['id'],
1329 'fake_ss_id')
1331 @ddt.data('add_security_service', 'remove_security_service')
1332 def test_action_security_service_contains_share_servers(self, action):
1333 share_network = fake_share_network.copy()
1334 security_service = {'id': ' security_service_2',
1335 'type': 'ldap'}
1336 method_to_call = (
1337 self.controller.add_security_service
1338 if action == 'add_security_service'
1339 else self.controller.remove_security_service)
1340 body = {
1341 action: {
1342 'security_service_id': security_service['id']
1343 }
1344 }
1345 self.mock_object(share_networks.policy, 'check_policy')
1346 self.mock_object(db_api, 'share_network_get',
1347 mock.Mock(return_value=share_network))
1348 self.mock_object(db_api, 'security_service_get',
1349 mock.Mock(return_value=security_service))
1350 self.mock_object(
1351 self.controller, '_share_network_subnets_contain_share_servers',
1352 mock.Mock(return_value=True))
1354 self.assertRaises(webob_exc.HTTPForbidden,
1355 method_to_call,
1356 self.req,
1357 share_network['id'],
1358 body)
1359 db_api.share_network_get.assert_called_once_with(
1360 self.req.environ['manila.context'], share_network['id'])
1361 share_networks.policy.check_policy.assert_called_once_with(
1362 self.req.environ['manila.context'],
1363 share_networks.RESOURCE_NAME, action, target_obj=share_network)
1365 def _setup_data_for_update_tests(self, is_check=False):
1366 security_services = [
1367 db_utils.create_security_service() for i in range(2)]
1368 share_network = db_utils.create_share_network()
1369 action = ('update_security_service_check' if is_check
1370 else 'update_security_service')
1371 body = {
1372 action: {
1373 'current_service_id': security_services[0]['id'],
1374 'new_service_id': security_services[1]['id'],
1375 }
1376 }
1377 if is_check:
1378 body[action]['reset_operation'] = False
1379 request = fakes.HTTPRequest.blank(
1380 '/v2/fake/share-networks/%s/action' % share_network['id'],
1381 use_admin_context=True, version='2.63')
1382 return security_services, share_network, body, request
1384 def test_check_update_security_service_not_found(self):
1385 security_services, share_network, body, request = (
1386 self._setup_data_for_update_tests(is_check=True))
1388 context = request.environ['manila.context']
1390 self.mock_object(share_networks.policy, 'check_policy')
1391 self.mock_object(db_api, 'share_network_get',
1392 mock.Mock(return_value=share_network))
1393 self.mock_object(db_api, 'security_service_get',
1394 mock.Mock(side_effect=exception.NotFound()))
1396 self.assertRaises(
1397 webob_exc.HTTPBadRequest,
1398 self.controller.check_update_security_service,
1399 request,
1400 share_network['id'],
1401 body)
1403 db_api.share_network_get.assert_called_once_with(
1404 context, share_network['id']
1405 )
1406 db_api.security_service_get.assert_called_once_with(
1407 context, security_services[0]['id'])
1409 def test_check_update_security_service(self):
1410 security_services, share_network, body, request = (
1411 self._setup_data_for_update_tests(is_check=True))
1412 context = request.environ['manila.context']
1413 share_api_return = {'fake_key': 'fake_value'}
1415 self.mock_object(share_networks.policy, 'check_policy')
1416 self.mock_object(db_api, 'share_network_get',
1417 mock.Mock(return_value=share_network))
1418 self.mock_object(
1419 db_api, 'security_service_get',
1420 mock.Mock(
1421 side_effect=[security_services[0], security_services[1]]))
1422 self.mock_object(
1423 self.controller.share_api,
1424 'check_share_network_security_service_update',
1425 mock.Mock(return_vale=share_api_return))
1426 self.mock_object(
1427 self.controller._view_builder,
1428 'build_security_service_update_check')
1430 self.controller.check_update_security_service(
1431 request, share_network['id'], body)
1433 db_api.share_network_get.assert_called_once_with(
1434 context, share_network['id'])
1435 db_api.security_service_get.assert_has_calls(
1436 [mock.call(context, security_services[0]['id']),
1437 mock.call(context, security_services[1]['id'])])
1438 (self.controller.share_api.check_share_network_security_service_update.
1439 assert_called_once_with(
1440 context, share_network, security_services[1],
1441 current_security_service=security_services[0],
1442 reset_operation=False))
1444 @ddt.data(
1445 (exception.ServiceIsDown(message='fake'), webob_exc.HTTPConflict),
1446 (exception.InvalidShareNetwork(message='fake'),
1447 webob_exc.HTTPBadRequest),
1448 (exception.InvalidSecurityService(message='fake'),
1449 webob_exc.HTTPConflict))
1450 @ddt.unpack
1451 def test_check_update_security_service_share_api_failed(
1452 self, captured_exception, exception_to_be_raised):
1453 security_services, share_network, body, request = (
1454 self._setup_data_for_update_tests(is_check=True))
1455 context = request.environ['manila.context']
1457 self.mock_object(share_networks.policy, 'check_policy')
1458 self.mock_object(db_api, 'share_network_get',
1459 mock.Mock(return_value=share_network))
1460 self.mock_object(
1461 db_api, 'security_service_get',
1462 mock.Mock(
1463 side_effect=[security_services[0], security_services[1]]))
1464 self.mock_object(
1465 self.controller.share_api,
1466 'check_share_network_security_service_update',
1467 mock.Mock(side_effect=captured_exception))
1469 self.assertRaises(
1470 exception_to_be_raised,
1471 self.controller.check_update_security_service,
1472 request,
1473 share_network['id'],
1474 body)
1476 db_api.share_network_get.assert_called_once_with(
1477 context, share_network['id'])
1478 db_api.security_service_get.assert_has_calls(
1479 [mock.call(context, security_services[0]['id']),
1480 mock.call(context, security_services[1]['id'])])
1481 (self.controller.share_api.check_share_network_security_service_update.
1482 assert_called_once_with(
1483 context, share_network, security_services[1],
1484 current_security_service=security_services[0],
1485 reset_operation=False))
1487 def _setup_data_for_check_add_tests(self):
1488 security_service = db_utils.create_security_service()
1489 share_network = db_utils.create_share_network()
1490 body = {
1491 'add_security_service_check': {
1492 'reset_operation': False,
1493 'security_service_id': security_service['id'],
1494 }
1495 }
1496 request = fakes.HTTPRequest.blank(
1497 '/share-networks', use_admin_context=True, version='2.63')
1498 return security_service, share_network, body, request
1500 def test_check_add_security_service_not_found(self):
1501 security_service, share_network, body, request = (
1502 self._setup_data_for_check_add_tests())
1504 context = request.environ['manila.context']
1506 self.mock_object(share_networks.policy, 'check_policy')
1507 self.mock_object(db_api, 'share_network_get',
1508 mock.Mock(return_value=share_network))
1509 self.mock_object(db_api, 'security_service_get',
1510 mock.Mock(side_effect=exception.NotFound()))
1512 self.assertRaises(
1513 webob_exc.HTTPBadRequest,
1514 self.controller.check_add_security_service,
1515 request,
1516 share_network['id'],
1517 body)
1519 db_api.share_network_get.assert_called_once_with(
1520 context, share_network['id']
1521 )
1522 db_api.security_service_get.assert_called_once_with(
1523 context, security_service['id'], project_only=True)
1525 def test_check_add_security_service(self):
1526 security_service, share_network, body, request = (
1527 self._setup_data_for_check_add_tests())
1528 context = request.environ['manila.context']
1529 share_api_return = {'fake_key': 'fake_value'}
1531 self.mock_object(share_networks.policy, 'check_policy')
1532 self.mock_object(db_api, 'share_network_get',
1533 mock.Mock(return_value=share_network))
1534 self.mock_object(
1535 db_api, 'security_service_get',
1536 mock.Mock(return_value=security_service))
1537 self.mock_object(
1538 self.controller.share_api,
1539 'check_share_network_security_service_update',
1540 mock.Mock(return_vale=share_api_return))
1541 self.mock_object(
1542 self.controller._view_builder,
1543 'build_security_service_update_check')
1545 self.controller.check_add_security_service(
1546 request, share_network['id'], body)
1548 db_api.share_network_get.assert_called_once_with(
1549 context, share_network['id'])
1550 db_api.security_service_get.assert_called_once_with(
1551 context, security_service['id'], project_only=True)
1552 (self.controller.share_api.check_share_network_security_service_update.
1553 assert_called_once_with(
1554 context, share_network, security_service,
1555 reset_operation=False))
1557 @ddt.data(
1558 (exception.ServiceIsDown(message='fake'), webob_exc.HTTPConflict),
1559 (exception.InvalidShareNetwork(message='fake'),
1560 webob_exc.HTTPBadRequest),
1561 (exception.InvalidSecurityService(message='fake'),
1562 webob_exc.HTTPConflict))
1563 @ddt.unpack
1564 def test_check_add_security_service_share_api_failed(
1565 self, captured_exception, exception_to_be_raised):
1566 security_service, share_network, body, request = (
1567 self._setup_data_for_check_add_tests())
1568 context = request.environ['manila.context']
1570 self.mock_object(share_networks.policy, 'check_policy')
1571 self.mock_object(db_api, 'share_network_get',
1572 mock.Mock(return_value=share_network))
1573 self.mock_object(
1574 db_api, 'security_service_get',
1575 mock.Mock(return_value=security_service))
1576 self.mock_object(
1577 self.controller.share_api,
1578 'check_share_network_security_service_update',
1579 mock.Mock(side_effect=captured_exception))
1581 self.assertRaises(
1582 exception_to_be_raised,
1583 self.controller.check_add_security_service,
1584 request,
1585 share_network['id'],
1586 body)
1588 db_api.share_network_get.assert_called_once_with(
1589 context, share_network['id'])
1590 db_api.security_service_get.assert_called_once_with(
1591 context, security_service['id'], project_only=True)
1592 (self.controller.share_api.check_share_network_security_service_update.
1593 assert_called_once_with(
1594 context, share_network, security_service,
1595 reset_operation=False))
1597 @ddt.data(
1598 (exception.NotFound(message='fake'),
1599 webob_exc.HTTPBadRequest))
1600 @ddt.unpack
1601 def test_check_add_security_service_failed_project_id(
1602 self, captured_exception, exception_to_be_raised):
1603 security_service, share_network, body, request = (
1604 self._setup_data_for_check_add_tests())
1605 share_network = fake_share_network
1606 context = request.environ['manila.context']
1607 share_api_return = {'fake_key': 'fake_value'}
1609 self.mock_object(share_networks.policy, 'check_policy')
1610 self.mock_object(db_api, 'share_network_get',
1611 mock.Mock(return_value=share_network))
1612 self.mock_object(
1613 db_api, 'security_service_get',
1614 mock.Mock(side_effect=captured_exception))
1615 self.mock_object(
1616 self.controller.share_api,
1617 'check_share_network_security_service_update',
1618 mock.Mock(return_vale=share_api_return))
1619 self.mock_object(
1620 self.controller._view_builder,
1621 'build_security_service_update_check')
1623 self.assertRaises(
1624 exception_to_be_raised,
1625 self.controller.check_add_security_service,
1626 request,
1627 share_network['id'],
1628 body)
1630 db_api.share_network_get.assert_called_once_with(
1631 context, share_network['id'])
1632 db_api.security_service_get.assert_called_once_with(
1633 context, security_service['id'], project_only=True)
1635 @ddt.data(
1636 (exception.ServiceIsDown(message='fake'), webob_exc.HTTPConflict),
1637 (exception.InvalidShareNetwork(message='fake'),
1638 webob_exc.HTTPBadRequest),
1639 (exception.InvalidSecurityService(message='fake'),
1640 webob_exc.HTTPConflict))
1641 @ddt.unpack
1642 def test_update_security_service_share_api_failed(
1643 self, captured_exception, exception_to_be_raised):
1644 security_services, share_network, body, request = (
1645 self._setup_data_for_update_tests())
1646 context = request.environ['manila.context']
1648 self.mock_object(share_networks.policy, 'check_policy')
1649 self.mock_object(db_api, 'share_network_get',
1650 mock.Mock(return_value=share_network))
1651 self.mock_object(
1652 db_api, 'security_service_get',
1653 mock.Mock(
1654 side_effect=[security_services[0], security_services[1]]))
1655 self.mock_object(
1656 self.controller.share_api,
1657 'update_share_network_security_service',
1658 mock.Mock(side_effect=captured_exception))
1660 self.assertRaises(exception_to_be_raised,
1661 self.controller.update_security_service,
1662 request,
1663 share_network['id'],
1664 body)
1666 db_api.share_network_get.assert_called_once_with(
1667 context, share_network['id'])
1668 db_api.security_service_get.assert_has_calls(
1669 [mock.call(context, security_services[0]['id']),
1670 mock.call(context, security_services[1]['id'])])
1671 (self.controller.share_api.update_share_network_security_service.
1672 assert_called_once_with(
1673 context, share_network, security_services[1],
1674 current_security_service=security_services[0]))
1676 def test_reset_status(self):
1677 share_network = db_utils.create_share_network()
1678 request = fakes.HTTPRequest.blank(
1679 '/v2/fake/share-networks/%s/action' % share_network['id'],
1680 use_admin_context=True, version='2.63')
1681 self.mock_object(db_api, 'share_network_update')
1683 status = {'status': 'active'}
1684 body = {'reset_status': status}
1686 response = self.controller.reset_status(request,
1687 share_network['id'], body)
1689 self.assertEqual(202, response.status_int)
1690 db_api.share_network_update.assert_called_once_with(
1691 request.environ['manila.context'],
1692 share_network['id'], {'status': 'active'})
1694 @ddt.data([], ['fake_server'])
1695 def test_share_network_subnet_create_check(self, servers):
1696 body = {
1697 'share_network_subnet_create_check': {
1698 'reset_operation': False,
1699 'availability_zone': 'fake_az',
1700 }
1701 }
1702 request = fakes.HTTPRequest.blank(
1703 '/share-networks', use_admin_context=True, version='2.70')
1704 context = request.environ['manila.context']
1706 share_net = 'fake_net'
1707 subnet = {'share_servers': servers}
1708 existing_subnets = [subnet]
1709 mock_validate_subnet = self.mock_object(
1710 common, 'validate_subnet_create',
1711 mock.Mock(return_value=(share_net, existing_subnets)))
1712 share_api_return = {
1713 'compatible': not bool(servers),
1714 'hosts_check_result': {}
1715 }
1716 mock_check_update = self.mock_object(
1717 self.controller.share_api,
1718 'check_update_share_server_network_allocations',
1719 mock.Mock(return_value=share_api_return))
1720 subnet_view = 'fake_subnet'
1721 mock_view = self.mock_object(
1722 self.controller._view_builder,
1723 'build_share_network_subnet_create_check',
1724 mock.Mock(return_value=subnet_view))
1726 net_id = 'fake_net_id'
1727 response = self.controller.share_network_subnet_create_check(
1728 request, net_id, body)
1730 self.assertEqual(subnet_view, response)
1731 data = body['share_network_subnet_create_check']
1732 mock_validate_subnet.assert_called_once_with(
1733 context, net_id, data, True)
1734 if servers:
1735 data['share_servers'] = servers
1736 mock_check_update.assert_called_once_with(
1737 context, share_net, data, False)
1738 else:
1739 mock_check_update.assert_not_called()
1740 mock_view.assert_called_once_with(request, share_api_return)
1742 @ddt.data(
1743 (exception.ServiceIsDown(message='fake'),
1744 webob_exc.HTTPInternalServerError),
1745 (exception.InvalidShareNetwork(message='fake'),
1746 webob_exc.HTTPBadRequest))
1747 @ddt.unpack
1748 def test_share_network_subnet_create_check_api_failed(
1749 self, captured_exception, exception_to_be_raised):
1750 body = {
1751 'share_network_subnet_create_check': {
1752 'reset_operation': False,
1753 'availability_zone': 'fake_az',
1754 }
1755 }
1756 request = fakes.HTTPRequest.blank(
1757 '/share-networks', use_admin_context=True, version='2.70')
1758 share_net = 'fake_net'
1759 subnet = {'share_servers': 'fake_server'}
1760 existing_subnets = [subnet]
1761 self.mock_object(
1762 common, 'validate_subnet_create',
1763 mock.Mock(return_value=(share_net, existing_subnets)))
1764 self.mock_object(
1765 self.controller.share_api,
1766 'check_update_share_server_network_allocations',
1767 mock.Mock(side_effect=captured_exception))
1769 self.assertRaises(exception_to_be_raised,
1770 self.controller.share_network_subnet_create_check,
1771 request, 'fake_net_id', body)
1773 def test_share_network_sec_service_delete(self):
1774 self.mock_object(db_api, 'share_network_get',
1775 mock.Mock(return_value=fake_share_network_with_ss))
1776 self.mock_object(db_api, 'share_network_delete')
1777 self.mock_object(db_api, 'share_network_remove_security_service')
1778 self.controller.delete(self.req, fake_share_network_with_ss['id'])
1779 db_api.share_network_get.assert_called_once_with(
1780 self.req.environ['manila.context'],
1781 fake_share_network_with_ss['id'])
1782 db_api.share_network_remove_security_service.assert_called_once_with(
1783 self.req.environ['manila.context'],
1784 fake_share_network_with_ss['id'],
1785 fake_share_network_with_ss['security_services'][0]['id'])
1786 db_api.share_network_delete.assert_called_once_with(
1787 self.req.environ['manila.context'],
1788 fake_share_network_with_ss['id'])