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

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. 

14 

15""" 

16Unit Tests for manila.share.rpcapi. 

17""" 

18 

19import copy 

20 

21from oslo_config import cfg 

22from oslo_serialization import jsonutils 

23 

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 

29 

30CONF = cfg.CONF 

31 

32 

33class ShareRpcAPITestCase(test.TestCase): 

34 

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() 

80 

81 def test_serialized_share_has_id(self): 

82 self.assertIn('id', self.fake_share) 

83 

84 def _test_share_api(self, method, rpc_method, **kwargs): 

85 expected_retval = 'foo' if method == 'call' else None 

86 

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 

154 

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) 

173 

174 self.fake_args = None 

175 self.fake_kwargs = None 

176 

177 def _fake_prepare_method(*args, **kwds): 

178 for kwd in kwds: 

179 self.assertEqual(target[kwd], kwds[kwd]) 

180 return self.rpcapi.client 

181 

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 

187 

188 self.mock_object(self.rpcapi.client, "prepare", _fake_prepare_method) 

189 self.mock_object(self.rpcapi.client, rpc_method, _fake_rpc_method) 

190 

191 retval = getattr(self.rpcapi, method)(self.ctxt, **kwargs) 

192 

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) 

197 

198 for kwarg, value in self.fake_kwargs.items(): 

199 self.assertEqual(expected_msg[kwarg], value) 

200 

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) 

210 

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) 

218 

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) 

224 

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) 

230 

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) 

239 

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) 

244 

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) 

253 

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'}) 

261 

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) 

268 

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') 

275 

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) 

281 

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') 

289 

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') 

297 

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') 

311 

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) 

317 

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') 

324 

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') 

331 

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') 

338 

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) 

345 

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) 

352 

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) 

358 

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'}) 

366 

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') 

373 

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={}) 

381 

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') 

388 

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'}) 

397 

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'}) 

404 

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'}) 

414 

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) 

421 

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') 

430 

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') 

438 

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') 

445 

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']) 

452 

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') 

463 

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') 

474 

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) 

482 

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) 

490 

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) 

498 

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']) 

507 

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') 

517 

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') 

526 

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) 

535 

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') 

544 

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 )