Coverage for manila/tests/share/test_rpcapi.py: 98%
217 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 2015 Alex Meade
2#
3# Licensed under the Apache License, Version 2.0 (the "License"); you may
4# not use this file except in compliance with the License. You may obtain
5# a copy of the License at
6#
7# http://www.apache.org/licenses/LICENSE-2.0
8#
9# Unless required by applicable law or agreed to in writing, software
10# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12# License for the specific language governing permissions and limitations
13# under the License.
15"""
16Unit Tests for manila.share.rpcapi.
17"""
19import copy
21from oslo_config import cfg
22from oslo_serialization import jsonutils
24from manila.common import constants
25from manila import context
26from manila.share import rpcapi as share_rpcapi
27from manila import test
28from manila.tests import db_utils
30CONF = cfg.CONF
33class ShareRpcAPITestCase(test.TestCase):
35 def setUp(self):
36 super(ShareRpcAPITestCase, self).setUp()
37 share = db_utils.create_share(
38 availability_zone=CONF.storage_availability_zone,
39 status=constants.STATUS_AVAILABLE
40 )
41 snapshot = db_utils.create_snapshot(share_id=share['id'])
42 share_replica = db_utils.create_share_replica(
43 id='fake_replica',
44 share_id='fake_share_id',
45 host='fake_host',
46 )
47 share_group = {'id': 'fake_share_group_id', 'host': 'fake_host'}
48 share_group_snapshot = {'id': 'fake_share_group_id'}
49 host = 'fake_host'
50 share_server = db_utils.create_share_server(host=host)
51 share_network_subnet = {
52 'id': 'fake share network subnet',
53 'availability_zone_id': 'fake_az_id',
54 'neutron_net_id': 'fake_neutron_net_id',
55 'neutron_subnet_id': 'fake_neutron_subnet_id',
56 'ip_version': 4,
57 'cidr': '127.0.0.0/28',
58 'gateway': '127.0.0.1',
59 'mtu': 1500,
60 'network_type': 'vlan',
61 'segmentation_id': 3000,
62 }
63 self.fake_share = jsonutils.to_primitive(share)
64 # mock out the getattr on the share db model object since jsonutils
65 # doesn't know about those extra attributes to pull in
66 self.fake_share['instance'] = jsonutils.to_primitive(share.instance)
67 self.fake_share_replica = jsonutils.to_primitive(share_replica)
68 self.fake_snapshot = jsonutils.to_primitive(snapshot)
69 self.fake_snapshot['share_instance'] = jsonutils.to_primitive(
70 snapshot.instance)
71 self.fake_share_server = jsonutils.to_primitive(share_server)
72 self.fake_share_group = jsonutils.to_primitive(share_group)
73 self.fake_share_group_snapshot = jsonutils.to_primitive(
74 share_group_snapshot)
75 self.fake_host = jsonutils.to_primitive(host)
76 self.fake_share_network_subnet = jsonutils.to_primitive(
77 share_network_subnet)
78 self.ctxt = context.RequestContext('fake_user', 'fake_project')
79 self.rpcapi = share_rpcapi.ShareAPI()
81 def test_serialized_share_has_id(self):
82 self.assertIn('id', self.fake_share)
84 def _test_share_api(self, method, rpc_method, **kwargs):
85 expected_retval = 'foo' if method == 'call' else None
87 target = {
88 "version": kwargs.pop('version', self.rpcapi.BASE_RPC_API_VERSION)
89 }
90 expected_msg = copy.deepcopy(kwargs)
91 if 'share' in expected_msg and method != 'get_connection_info':
92 share = expected_msg['share']
93 del expected_msg['share']
94 expected_msg['share_id'] = share['id']
95 if 'share_instance' in expected_msg:
96 share_instance = expected_msg.pop('share_instance', None)
97 expected_msg['share_instance_id'] = share_instance['id']
98 if 'share_group' in expected_msg:
99 share_group = expected_msg['share_group']
100 del expected_msg['share_group']
101 expected_msg['share_group_id'] = share_group['id']
102 if 'share_group_snapshot' in expected_msg:
103 snap = expected_msg['share_group_snapshot']
104 del expected_msg['share_group_snapshot']
105 expected_msg['share_group_snapshot_id'] = snap['id']
106 if 'host' in expected_msg:
107 del expected_msg['host']
108 if 'snapshot' in expected_msg:
109 snapshot = expected_msg['snapshot']
110 del expected_msg['snapshot']
111 expected_msg['snapshot_id'] = snapshot['id']
112 if 'dest_host' in expected_msg:
113 del expected_msg['dest_host']
114 expected_msg['dest_host'] = self.fake_host
115 if 'share_replica' in expected_msg:
116 share_replica = expected_msg.pop('share_replica', None)
117 expected_msg['share_replica_id'] = share_replica['id']
118 expected_msg['share_id'] = share_replica['share_id']
119 if 'replicated_snapshot' in expected_msg:
120 snapshot = expected_msg.pop('replicated_snapshot', None)
121 expected_msg['snapshot_id'] = snapshot['id']
122 expected_msg['share_id'] = snapshot['share_id']
123 if 'src_share_instance' in expected_msg:
124 share_instance = expected_msg.pop('src_share_instance', None)
125 expected_msg['src_instance_id'] = share_instance['id']
126 if 'update_access' in expected_msg: 126 ↛ 127line 126 didn't jump to line 127 because the condition on line 126 was never true
127 share_instance = expected_msg.pop('share_instance', None)
128 expected_msg['share_instance_id'] = share_instance['id']
129 if 'snapshot_instance' in expected_msg:
130 snapshot_instance = expected_msg.pop('snapshot_instance', None)
131 expected_msg['snapshot_instance_id'] = snapshot_instance['id']
132 share_server_id_methods = [
133 'manage_share_server', 'unmanage_share_server',
134 'share_server_migration_start', 'share_server_migration_check',
135 'update_share_network_subnet_from_metadata']
136 src_dest_share_server_methods = [
137 'share_server_migration_cancel',
138 'share_server_migration_get_progress',
139 'share_server_migration_complete']
140 if ('share_server' in expected_msg
141 and method in share_server_id_methods):
142 share_server = expected_msg.pop('share_server', None)
143 expected_msg['share_server_id'] = share_server['id']
144 if ('share_server' in expected_msg
145 and method in src_dest_share_server_methods):
146 share_server = expected_msg.pop('share_server', None)
147 expected_msg['src_share_server_id'] = share_server['id']
148 if ('dest_share_server' in expected_msg
149 and method in src_dest_share_server_methods):
150 share_server = expected_msg.pop('dest_share_server', None)
151 expected_msg['dest_share_server_id'] = share_server['id']
152 if method == 'ensure_driver_resources':
153 expected_msg['skip_backend_info_check'] = True
155 if 'host' in kwargs:
156 host = kwargs['host']
157 elif 'share_group' in kwargs:
158 host = kwargs['share_group']['host']
159 elif 'share_instance' in kwargs:
160 host = kwargs['share_instance']['host']
161 elif 'share_server' in kwargs:
162 host = kwargs['share_server']['host']
163 elif 'share_replica' in kwargs:
164 host = kwargs['share_replica']['host']
165 elif 'replicated_snapshot' in kwargs:
166 host = kwargs['share']['instance']['host']
167 elif 'share' in kwargs:
168 host = kwargs['share']['host']
169 else:
170 host = self.fake_host
171 target['server'] = host
172 target['topic'] = '%s.%s' % (CONF.share_topic, host)
174 self.fake_args = None
175 self.fake_kwargs = None
177 def _fake_prepare_method(*args, **kwds):
178 for kwd in kwds:
179 self.assertEqual(target[kwd], kwds[kwd])
180 return self.rpcapi.client
182 def _fake_rpc_method(*args, **kwargs):
183 self.fake_args = args
184 self.fake_kwargs = kwargs
185 if expected_retval: 185 ↛ 186line 185 didn't jump to line 186 because the condition on line 185 was never true
186 return expected_retval
188 self.mock_object(self.rpcapi.client, "prepare", _fake_prepare_method)
189 self.mock_object(self.rpcapi.client, rpc_method, _fake_rpc_method)
191 retval = getattr(self.rpcapi, method)(self.ctxt, **kwargs)
193 self.assertEqual(expected_retval, retval)
194 expected_args = [self.ctxt, method]
195 for arg, expected_arg in zip(self.fake_args, expected_args):
196 self.assertEqual(expected_arg, arg)
198 for kwarg, value in self.fake_kwargs.items():
199 self.assertEqual(expected_msg[kwarg], value)
201 def test_create_share_instance(self):
202 self._test_share_api('create_share_instance',
203 rpc_method='cast',
204 version='1.4',
205 share_instance=self.fake_share,
206 host='fake_host1',
207 snapshot_id='fake_snapshot_id',
208 filter_properties=None,
209 request_spec=None)
211 def test_delete_share_instance(self):
212 self._test_share_api('delete_share_instance',
213 rpc_method='cast',
214 version='1.27',
215 share_instance=self.fake_share,
216 force=False,
217 deferred_delete=False)
219 def test_update_access(self):
220 self._test_share_api('update_access',
221 rpc_method='cast',
222 version='1.14',
223 share_instance=self.fake_share)
225 def test_create_snapshot(self):
226 self._test_share_api('create_snapshot',
227 rpc_method='cast',
228 share=self.fake_share,
229 snapshot=self.fake_snapshot)
231 def test_delete_snapshot(self):
232 self._test_share_api('delete_snapshot',
233 rpc_method='cast',
234 version='1.27',
235 snapshot=self.fake_snapshot,
236 host='fake_host',
237 force=False,
238 deferred_delete=False)
240 def test_delete_share_server(self):
241 self._test_share_api('delete_share_server',
242 rpc_method='cast',
243 share_server=self.fake_share_server)
245 def test_transfer_accept(self):
246 self._test_share_api('transfer_accept',
247 rpc_method='call',
248 version='1.25',
249 share=self.fake_share,
250 new_user='new_user',
251 new_project='new_project',
252 clear_rules=False)
254 def test_extend_share(self):
255 self._test_share_api('extend_share',
256 rpc_method='cast',
257 version='1.2',
258 share=self.fake_share,
259 new_size=123,
260 reservations={'fake': 'fake'})
262 def test_shrink_share(self):
263 self._test_share_api('shrink_share',
264 rpc_method='cast',
265 version='1.3',
266 share=self.fake_share,
267 new_size=123)
269 def test_create_share_group(self):
270 self._test_share_api('create_share_group',
271 version='1.16',
272 rpc_method='cast',
273 share_group=self.fake_share_group,
274 host='fake_host1')
276 def test_delete_share_group(self):
277 self._test_share_api('delete_share_group',
278 version='1.16',
279 rpc_method='cast',
280 share_group=self.fake_share_group)
282 def test_create_share_group_snapshot(self):
283 self._test_share_api(
284 'create_share_group_snapshot',
285 version='1.16',
286 rpc_method='cast',
287 share_group_snapshot=self.fake_share_group_snapshot,
288 host='fake_host1')
290 def test_delete_share_group_snapshot(self):
291 self._test_share_api(
292 'delete_share_group_snapshot',
293 version='1.16',
294 rpc_method='cast',
295 share_group_snapshot=self.fake_share_group_snapshot,
296 host='fake_host1')
298 def test_migration_start(self):
299 self._test_share_api('migration_start',
300 rpc_method='cast',
301 version='1.15',
302 share=self.fake_share,
303 dest_host=self.fake_host,
304 force_host_assisted_migration=True,
305 preserve_metadata=True,
306 writable=True,
307 nondisruptive=False,
308 preserve_snapshots=True,
309 new_share_network_id='fake_net_id',
310 new_share_type_id='fake_type_id')
312 def test_connection_get_info(self):
313 self._test_share_api('connection_get_info',
314 rpc_method='call',
315 version='1.12',
316 share_instance=self.fake_share)
318 def test_migration_complete(self):
319 self._test_share_api('migration_complete',
320 rpc_method='cast',
321 version='1.12',
322 src_share_instance=self.fake_share['instance'],
323 dest_instance_id='new_fake_ins_id')
325 def test_migration_cancel(self):
326 self._test_share_api('migration_cancel',
327 rpc_method='cast',
328 version='1.12',
329 src_share_instance=self.fake_share['instance'],
330 dest_instance_id='ins2_id')
332 def test_migration_get_progress(self):
333 self._test_share_api('migration_get_progress',
334 rpc_method='call',
335 version='1.12',
336 src_share_instance=self.fake_share['instance'],
337 dest_instance_id='ins2_id')
339 def test_delete_share_replica(self):
340 self._test_share_api('delete_share_replica',
341 rpc_method='cast',
342 version='1.8',
343 share_replica=self.fake_share_replica,
344 force=False)
346 def test_promote_share_replica(self):
347 self._test_share_api('promote_share_replica',
348 rpc_method='cast',
349 version='1.24',
350 share_replica=self.fake_share_replica,
351 quiesce_wait_time=None)
353 def test_update_share_replica(self):
354 self._test_share_api('update_share_replica',
355 rpc_method='cast',
356 version='1.8',
357 share_replica=self.fake_share_replica)
359 def test_manage_snapshot(self):
360 self._test_share_api('manage_snapshot',
361 rpc_method='cast',
362 version='1.9',
363 snapshot=self.fake_snapshot,
364 host='fake_host',
365 driver_options={'volume_snapshot_id': 'fake'})
367 def test_unmanage_snapshot(self):
368 self._test_share_api('unmanage_snapshot',
369 rpc_method='cast',
370 version='1.9',
371 snapshot=self.fake_snapshot,
372 host='fake_host')
374 def test_manage_share_server(self):
375 self._test_share_api('manage_share_server',
376 rpc_method='cast',
377 version='1.19',
378 share_server=self.fake_share_server,
379 identifier='fake',
380 driver_opts={})
382 def test_unmanage_share_server(self):
383 self._test_share_api('unmanage_share_server',
384 rpc_method='cast',
385 version='1.19',
386 share_server=self.fake_share_server,
387 force='fake_force')
389 def test_revert_to_snapshot(self):
390 self._test_share_api('revert_to_snapshot',
391 rpc_method='cast',
392 version='1.18',
393 share=self.fake_share,
394 snapshot=self.fake_snapshot,
395 host='fake_host',
396 reservations={'fake': 'fake'})
398 def test_update_share_from_metadata(self):
399 self._test_share_api('update_share_from_metadata',
400 rpc_method='cast',
401 version='1.28',
402 share=self.fake_share,
403 metadata={'fake': 'fake'})
405 def test_update_share_network_subnet_from_metadata(self):
406 self._test_share_api(
407 'update_share_network_subnet_from_metadata',
408 rpc_method='cast',
409 version='1.30',
410 share_network_id='fake_net_id',
411 share_network_subnet_id=self.fake_share_network_subnet['id'],
412 share_server=self.fake_share_server,
413 metadata={'fake': 'fake'})
415 def test_create_replicated_snapshot(self):
416 self._test_share_api('create_replicated_snapshot',
417 rpc_method='cast',
418 version='1.11',
419 replicated_snapshot=self.fake_snapshot,
420 share=self.fake_share)
422 def test_delete_replicated_snapshot(self):
423 self._test_share_api('delete_replicated_snapshot',
424 rpc_method='cast',
425 version='1.11',
426 replicated_snapshot=self.fake_snapshot,
427 share_id=self.fake_snapshot['share_id'],
428 force=False,
429 host='fake_host')
431 def test_provide_share_server(self):
432 self._test_share_api('provide_share_server',
433 rpc_method='call',
434 version='1.12',
435 share_instance=self.fake_share['instance'],
436 share_network_id='fake_network_id',
437 snapshot_id='fake_snapshot_id')
439 def test_create_share_server(self):
440 self._test_share_api('create_share_server',
441 rpc_method='cast',
442 version='1.20',
443 share_instance=self.fake_share['instance'],
444 share_server_id='fake_server_id')
446 def test_snapshot_update_access(self):
447 self._test_share_api('snapshot_update_access',
448 rpc_method='cast',
449 version='1.17',
450 snapshot_instance=self.fake_snapshot[
451 'share_instance'])
453 def test_share_server_migration_start(self):
454 self._test_share_api('share_server_migration_start',
455 rpc_method='cast',
456 version='1.21',
457 share_server=self.fake_share_server,
458 dest_host=self.fake_host,
459 writable=True,
460 nondisruptive=False,
461 preserve_snapshots=True,
462 new_share_network_id='fake_share_network_id')
464 def test_share_server_migration_check(self):
465 self._test_share_api('share_server_migration_check',
466 rpc_method='call',
467 version='1.21',
468 share_server_id=self.fake_share_server['id'],
469 dest_host=self.fake_host,
470 writable=True,
471 nondisruptive=False,
472 preserve_snapshots=True,
473 new_share_network_id='fake_net_id')
475 def test_share_server_migration_cancel(self):
476 self._test_share_api('share_server_migration_cancel',
477 rpc_method='cast',
478 version='1.21',
479 dest_host=self.fake_host,
480 share_server=self.fake_share_server,
481 dest_share_server=self.fake_share_server)
483 def test_share_server_migration_get_progress(self):
484 self._test_share_api('share_server_migration_get_progress',
485 rpc_method='call',
486 version='1.21',
487 dest_host=self.fake_host,
488 share_server=self.fake_share_server,
489 dest_share_server=self.fake_share_server)
491 def test_share_server_migration_complete(self):
492 self._test_share_api('share_server_migration_complete',
493 rpc_method='cast',
494 version='1.21',
495 dest_host=self.fake_host,
496 share_server=self.fake_share_server,
497 dest_share_server=self.fake_share_server)
499 def test_update_access_for_share_instances(self):
500 self._test_share_api(
501 'update_access_for_instances',
502 rpc_method='cast',
503 version='1.21',
504 dest_host=self.fake_host,
505 share_instance_ids=[self.fake_share['instance']['id']],
506 share_server_id=self.fake_share_server['id'])
508 def test_update_share_network_security_service(self):
509 self._test_share_api(
510 'update_share_network_security_service',
511 rpc_method='cast',
512 version='1.22',
513 dest_host=self.fake_host,
514 share_network_id='fake_net_id',
515 new_security_service_id='fake_sec_service_id',
516 current_security_service_id='fake_sec_service_id')
518 def test_check_update_share_network_security_service(self):
519 self._test_share_api('check_update_share_network_security_service',
520 rpc_method='cast',
521 version='1.22',
522 dest_host=self.fake_host,
523 share_network_id='fake_net_id',
524 new_security_service_id='fake_sec_service_id',
525 current_security_service_id='fake_sec_service_id')
527 def test_check_update_share_server_network_allocations(self):
528 self._test_share_api(
529 'check_update_share_server_network_allocations',
530 rpc_method='cast',
531 version='1.23',
532 dest_host=self.fake_host,
533 share_network_id='fake_net_id',
534 new_share_network_subnet=self.fake_share_network_subnet)
536 def test_update_share_server_network_allocations(self):
537 self._test_share_api(
538 'update_share_server_network_allocations',
539 rpc_method='cast',
540 version='1.23',
541 dest_host=self.fake_host,
542 share_network_id='fake_net_id',
543 new_share_network_subnet_id='new_share_network_subnet_id')
545 def test_ensure_driver_resources(self):
546 self._test_share_api(
547 'ensure_driver_resources',
548 rpc_method='cast',
549 version='1.29',
550 host=self.fake_host,
551 )