Coverage for manila/tests/scheduler/fakes.py: 96%

63 statements  

« prev     ^ index     » next       coverage.py v7.11.0, created at 2026-02-18 22:19 +0000

1# Copyright 2011 OpenStack LLC. 

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. 

15""" 

16Fakes For Scheduler tests. 

17""" 

18 

19from oslo_utils import timeutils 

20 

21from manila.scheduler.drivers import filter 

22from manila.scheduler import host_manager 

23from manila.scheduler.weighers import base_host as base_host_weigher 

24 

25 

26FAKE_AZ_1 = {'name': 'zone1', 'id': '24433438-c9b5-4cb5-a472-f78462aa5f31'} 

27FAKE_AZ_2 = {'name': 'zone2', 'id': 'ebef050c-d20d-4c44-b272-1a0adce11cb5'} 

28FAKE_AZ_3 = {'name': 'zone3', 'id': '18e7e6e2-39d6-466b-a706-2717bd1086e1'} 

29FAKE_AZ_4 = {'name': 'zone4', 'id': '9ca40ee4-3c2a-4635-9a18-233cf6e0ad0b'} 

30FAKE_AZ_5 = {'name': 'zone4', 'id': 'd76d921d-d6fa-41b4-a180-fb68952784bd'} 

31FAKE_AZ_6 = {'name': 'zone4', 'id': 'bc09c3d6-671c-4d55-9f43-f00757aabc50'} 

32 

33SHARE_SERVICES_NO_POOLS = [ 

34 dict(id=1, host='host1', topic='share', disabled=False, 

35 updated_at=timeutils.utcnow(), availability_zone_id=FAKE_AZ_1['id'], 

36 availability_zone=FAKE_AZ_1), 

37 dict(id=2, host='host2@back1', topic='share', disabled=False, 

38 updated_at=timeutils.utcnow(), availability_zone_id=FAKE_AZ_2['id'], 

39 availability_zone=FAKE_AZ_2), 

40 dict(id=3, host='host2@back2', topic='share', disabled=False, 

41 updated_at=timeutils.utcnow(), availability_zone_id=FAKE_AZ_3['id'], 

42 availability_zone=FAKE_AZ_3), 

43] 

44 

45SERVICE_STATES_NO_POOLS = { 

46 'host1': dict(share_backend_name='AAA', 

47 total_capacity_gb=512, free_capacity_gb=200, 

48 timestamp=None, reserved_percentage=0, 

49 reserved_snapshot_percentage=0, 

50 reserved_share_extend_percentage=0, 

51 provisioned_capacity_gb=312, 

52 max_over_subscription_ratio=1.0, 

53 thin_provisioning=False, 

54 snapshot_support=False, 

55 create_share_from_snapshot_support=False, 

56 revert_to_snapshot_support=True, 

57 mount_snapshot_support=True, 

58 driver_handles_share_servers=False, 

59 mount_point_name_support=False), 

60 'host2@back1': dict(share_backend_name='BBB', 

61 total_capacity_gb=256, free_capacity_gb=100, 

62 timestamp=None, reserved_percentage=0, 

63 reserved_snapshot_percentage=0, 

64 reserved_share_extend_percentage=0, 

65 provisioned_capacity_gb=400, 

66 max_over_subscription_ratio=2.0, 

67 thin_provisioning=True, 

68 snapshot_support=True, 

69 create_share_from_snapshot_support=True, 

70 revert_to_snapshot_support=False, 

71 mount_snapshot_support=False, 

72 driver_handles_share_servers=False, 

73 mount_point_name_support=False), 

74 'host2@back2': dict(share_backend_name='CCC', 

75 total_capacity_gb=10000, free_capacity_gb=700, 

76 timestamp=None, reserved_percentage=0, 

77 reserved_snapshot_percentage=0, 

78 reserved_share_extend_percentage=0, 

79 provisioned_capacity_gb=50000, 

80 max_over_subscription_ratio=20.0, 

81 thin_provisioning=True, 

82 snapshot_support=True, 

83 create_share_from_snapshot_support=True, 

84 revert_to_snapshot_support=False, 

85 mount_snapshot_support=False, 

86 driver_handles_share_servers=False, 

87 mount_point_name_support=False), 

88} 

89 

90SHARE_SERVICES_WITH_POOLS = [ 

91 dict(id=1, host='host1@AAA', topic='share', disabled=False, 

92 updated_at=timeutils.utcnow(), availability_zone_id=FAKE_AZ_1['id'], 

93 availability_zone=FAKE_AZ_1), 

94 dict(id=2, host='host2@BBB', topic='share', disabled=False, 

95 updated_at=timeutils.utcnow(), availability_zone_id=FAKE_AZ_2['id'], 

96 availability_zone=FAKE_AZ_2), 

97 dict(id=3, host='host3@CCC', topic='share', disabled=False, 

98 updated_at=timeutils.utcnow(), availability_zone_id=FAKE_AZ_3['id'], 

99 availability_zone=FAKE_AZ_3), 

100 dict(id=4, host='host4@DDD', topic='share', disabled=False, 

101 updated_at=timeutils.utcnow(), availability_zone_id=FAKE_AZ_4['id'], 

102 availability_zone=FAKE_AZ_4), 

103 # service on host5 is disabled 

104 dict(id=5, host='host5@EEE', topic='share', disabled=True, 

105 updated_at=timeutils.utcnow(), availability_zone_id=FAKE_AZ_5['id'], 

106 availability_zone=FAKE_AZ_5), 

107 dict(id=6, host='host6@FFF', topic='share', disabled=True, 

108 updated_at=timeutils.utcnow(), availability_zone_id=FAKE_AZ_6['id'], 

109 availability_zone=FAKE_AZ_6), 

110] 

111 

112SHARE_SERVICE_STATES_WITH_POOLS = { 

113 'host1@AAA': dict(share_backend_name='AAA', 

114 timestamp=None, reserved_percentage=0, 

115 reserved_snapshot_percentage=0, 

116 reserved_share_extend_percentage=0, 

117 driver_handles_share_servers=False, 

118 snapshot_support=True, 

119 create_share_from_snapshot_support=True, 

120 revert_to_snapshot_support=True, 

121 replication_type=None, 

122 pools=[dict(pool_name='pool1', 

123 total_capacity_gb=51, 

124 free_capacity_gb=41, 

125 reserved_percentage=0, 

126 reserved_snapshot_percentage=0, 

127 reserved_share_extend_percentage=0, 

128 provisioned_capacity_gb=10, 

129 max_over_subscription_ratio=1.0, 

130 thin_provisioning=False, 

131 mount_point_name_support=False, 

132 )]), 

133 'host2@BBB': dict(share_backend_name='BBB', 

134 timestamp=None, reserved_percentage=0, 

135 reserved_snapshot_percentage=0, 

136 reserved_share_extend_percentage=0, 

137 driver_handles_share_servers=False, 

138 snapshot_support=True, 

139 create_share_from_snapshot_support=True, 

140 revert_to_snapshot_support=False, 

141 replication_type=None, 

142 pools=[dict(pool_name='pool2', 

143 total_capacity_gb=52, 

144 free_capacity_gb=42, 

145 reserved_percentage=0, 

146 reserved_snapshot_percentage=0, 

147 reserved_share_extend_percentage=0, 

148 provisioned_capacity_gb=60, 

149 max_over_subscription_ratio=2.0, 

150 thin_provisioning=True, 

151 mount_point_name_support=False, 

152 )]), 

153 'host3@CCC': dict(share_backend_name='CCC', 

154 timestamp=None, reserved_percentage=0, 

155 reserved_snapshot_percentage=0, 

156 reserved_share_extend_percentage=0, 

157 driver_handles_share_servers=False, 

158 snapshot_support=True, 

159 create_share_from_snapshot_support=True, 

160 revert_to_snapshot_support=False, 

161 replication_type=None, 

162 pools=[dict(pool_name='pool3', 

163 total_capacity_gb=53, 

164 free_capacity_gb=43, 

165 reserved_percentage=0, 

166 reserved_snapshot_percentage=0, 

167 reserved_share_extend_percentage=0, 

168 provisioned_capacity_gb=100, 

169 max_over_subscription_ratio=20.0, 

170 thin_provisioning=True, 

171 mount_point_name_support=False, 

172 )]), 

173 'host4@DDD': dict(share_backend_name='DDD', 

174 timestamp=None, reserved_percentage=0, 

175 reserved_snapshot_percentage=0, 

176 reserved_share_extend_percentage=0, 

177 driver_handles_share_servers=False, 

178 snapshot_support=True, 

179 create_share_from_snapshot_support=True, 

180 revert_to_snapshot_support=False, 

181 replication_type=None, 

182 pools=[dict(pool_name='pool4a', 

183 total_capacity_gb=541, 

184 free_capacity_gb=441, 

185 reserved_percentage=0, 

186 reserved_snapshot_percentage=0, 

187 reserved_share_extend_percentage=0, 

188 provisioned_capacity_gb=800, 

189 max_over_subscription_ratio=2.0, 

190 thin_provisioning=True, 

191 mount_point_name_support=False, 

192 ), 

193 dict(pool_name='pool4b', 

194 total_capacity_gb=542, 

195 free_capacity_gb=442, 

196 reserved_percentage=0, 

197 reserved_snapshot_percentage=0, 

198 reserved_share_extend_percentage=0, 

199 provisioned_capacity_gb=2000, 

200 max_over_subscription_ratio=10.0, 

201 thin_provisioning=True, 

202 mount_point_name_support=False, 

203 )]), 

204 'host5@EEE': dict(share_backend_name='EEE', 

205 timestamp=None, reserved_percentage=0, 

206 reserved_snapshot_percentage=0, 

207 reserved_share_extend_percentage=0, 

208 driver_handles_share_servers=False, 

209 snapshot_support=True, 

210 create_share_from_snapshot_support=True, 

211 revert_to_snapshot_support=False, 

212 replication_type=None, 

213 pools=[dict(pool_name='pool5a', 

214 total_capacity_gb=551, 

215 free_capacity_gb=451, 

216 reserved_percentage=0, 

217 reserved_snapshot_percentage=0, 

218 reserved_share_extend_percentage=0, 

219 provisioned_capacity_gb=100, 

220 max_over_subscription_ratio=1.0, 

221 thin_provisioning=False, 

222 mount_point_name_support=False, 

223 ), 

224 dict(pool_name='pool5b', 

225 total_capacity_gb=552, 

226 free_capacity_gb=452, 

227 reserved_percentage=0, 

228 reserved_snapshot_percentage=0, 

229 reserved_share_extend_percentage=0, 

230 provisioned_capacity_gb=100, 

231 max_over_subscription_ratio=1.0, 

232 thin_provisioning=False, 

233 mount_point_name_support=False, 

234 )]), 

235 'host6@FFF': dict(share_backend_name='FFF', 

236 timestamp=None, reserved_percentage=0, 

237 reserved_snapshot_percentage=0, 

238 reserved_share_extend_percentage=0, 

239 driver_handles_share_servers=False, 

240 snapshot_support=True, 

241 create_share_from_snapshot_support=True, 

242 revert_to_snapshot_support=False, 

243 replication_type=None, 

244 pools=[dict(pool_name='pool6a', 

245 total_capacity_gb='unknown', 

246 free_capacity_gb='unknown', 

247 reserved_percentage=0, 

248 reserved_snapshot_percentage=0, 

249 reserved_share_extend_percentage=0, 

250 provisioned_capacity_gb=100, 

251 max_over_subscription_ratio=1.0, 

252 thin_provisioning=False, 

253 mount_point_name_support=False, 

254 ), 

255 dict(pool_name='pool6b', 

256 total_capacity_gb='unknown', 

257 free_capacity_gb='unknown', 

258 reserved_percentage=0, 

259 reserved_snapshot_percentage=0, 

260 reserved_share_extend_percentage=0, 

261 provisioned_capacity_gb=100, 

262 max_over_subscription_ratio=1.0, 

263 thin_provisioning=False, 

264 mount_point_name_support=False, 

265 )]), 

266} 

267 

268FAKE_ACTIVE_IQ_WEIGHER_LIST = [ 

269 "fake_aggregate_1:fake_cluster_name1", 

270 "fake_aggregate_2:fake_cluster_name2", 

271 "fake_aggregate_3:fake_cluster_name3" 

272] 

273 

274FAKE_ACTIVE_IQ_WEIGHER_AGGREGATES_RESPONSE = { 

275 "records": [ 

276 { 

277 "name": "fake_aggregate_1", 

278 "key": "fake_key_1", 

279 "cluster": { 

280 "name": "fake_cluster_name1" 

281 } 

282 }, 

283 { 

284 "name": "fake_aggregate_2", 

285 "key": "fake_key_2", 

286 "cluster": { 

287 "name": "fake_cluster_name2" 

288 } 

289 }, 

290 { 

291 "name": "fake_aggregate_3", 

292 "key": "fake_key_3", 

293 "cluster": { 

294 "name": "fake_cluster_name3" 

295 } 

296 } 

297 ] 

298} 

299 

300FAKE_ACTIVE_IQ_WEIGHER_BALANCE_RESPONSE = [ 

301 { 

302 "key": "fake_key_1", 

303 "scores": { 

304 "total_weighted_score": 10.0 

305 } 

306 }, 

307 { 

308 "key": "fake_key_2", 

309 "scores": { 

310 "total_weighted_score": 20.0 

311 } 

312 } 

313] 

314 

315 

316class FakeHostManagerNetAppOnly(host_manager.HostManager): 

317 def __init__(self): 

318 super(FakeHostManagerNetAppOnly, self).__init__() 

319 

320 self.service_states = { 

321 'host1': { 

322 'total_capacity_gb': 1024, 

323 'free_capacity_gb': 1024, 

324 'allocated_capacity_gb': 0, 

325 'thin_provisioning': False, 

326 'reserved_percentage': 10, 

327 'reserved_snapshot_percentage': 5, 

328 'reserved_share_extend_percentage': 15, 

329 'timestamp': None, 

330 'snapshot_support': True, 

331 'create_share_from_snapshot_support': True, 

332 'replication_type': 'writable', 

333 'replication_domain': 'endor', 

334 'storage_protocol': 'NFS_CIFS', 

335 'vendor_name': 'NetApp', 

336 'netapp_cluster_name': 'cluster1', 

337 }, 

338 'host2': { 

339 'total_capacity_gb': 2048, 

340 'free_capacity_gb': 300, 

341 'allocated_capacity_gb': 1748, 

342 'provisioned_capacity_gb': 1748, 

343 'max_over_subscription_ratio': 2.0, 

344 'thin_provisioning': True, 

345 'reserved_percentage': 10, 

346 'reserved_snapshot_percentage': 5, 

347 'reserved_share_extend_percentage': 15, 

348 'timestamp': None, 

349 'snapshot_support': True, 

350 'create_share_from_snapshot_support': True, 

351 'replication_type': 'readable', 

352 'replication_domain': 'kashyyyk', 

353 'storage_protocol': 'NFS_CIFS', 

354 'vendor_name': 'NetApp', 

355 'netapp_cluster_name': 'cluster2', 

356 }, 

357 'host3': { 

358 'total_capacity_gb': 512, 

359 'free_capacity_gb': 256, 

360 'allocated_capacity_gb': 256, 

361 'provisioned_capacity_gb': 256, 

362 'max_over_subscription_ratio': 2.0, 

363 'thin_provisioning': [False], 

364 'reserved_percentage': 0, 

365 'reserved_snapshot_percentage': 0, 

366 'reserved_share_extend_percentage': 0, 

367 'snapshot_support': True, 

368 'create_share_from_snapshot_support': True, 

369 'timestamp': None, 

370 'storage_protocol': 'NFS_CIFS', 

371 'vendor_name': 'NetApp', 

372 'netapp_cluster_name': 'cluster3', 

373 }, 

374 'host4': { 

375 'total_capacity_gb': 2048, 

376 'free_capacity_gb': 200, 

377 'allocated_capacity_gb': 1848, 

378 'provisioned_capacity_gb': 1848, 

379 'max_over_subscription_ratio': 1.0, 

380 'thin_provisioning': [True], 

381 'reserved_percentage': 5, 

382 'reserved_snapshot_percentage': 2, 

383 'reserved_share_extend_percentage': 5, 

384 'timestamp': None, 

385 'snapshot_support': True, 

386 'create_share_from_snapshot_support': True, 

387 'replication_type': 'dr', 

388 'replication_domain': 'naboo', 

389 'storage_protocol': 'NFS_CIFS', 

390 'vendor_name': 'NetApp', 

391 'netapp_cluster_name': 'cluster4', 

392 }, 

393 'host5': { 

394 'total_capacity_gb': 2048, 

395 'free_capacity_gb': 500, 

396 'allocated_capacity_gb': 1548, 

397 'provisioned_capacity_gb': 1548, 

398 'max_over_subscription_ratio': 1.5, 

399 'thin_provisioning': [True, False], 

400 'reserved_percentage': 5, 

401 'reserved_snapshot_percentage': 2, 

402 'reserved_share_extend_percentage': 5, 

403 'timestamp': None, 

404 'snapshot_support': True, 

405 'create_share_from_snapshot_support': True, 

406 'replication_type': None, 

407 'storage_protocol': 'NFS_CIFS', 

408 'vendor_name': 'NetApp', 

409 'netapp_cluster_name': 'cluster5', 

410 }, 

411 'host6': { 

412 'total_capacity_gb': 'unknown', 

413 'free_capacity_gb': 'unknown', 

414 'allocated_capacity_gb': 1548, 

415 'thin_provisioning': False, 

416 'reserved_percentage': 5, 

417 'reserved_snapshot_percentage': 2, 

418 'reserved_share_extend_percentage': 5, 

419 'snapshot_support': True, 

420 'create_share_from_snapshot_support': True, 

421 'timestamp': None, 

422 'storage_protocol': 'GLUSTERFS', 

423 'vendor_name': 'NetApp', 

424 'netapp_cluster_name': 'cluster6', 

425 }, 

426 } 

427 

428 

429class FakeFilterScheduler(filter.FilterScheduler): 

430 def __init__(self, *args, **kwargs): 

431 super(FakeFilterScheduler, self).__init__(*args, **kwargs) 

432 self.host_manager = host_manager.HostManager() 

433 

434 

435class FakeHostManager(host_manager.HostManager): 

436 def __init__(self): 

437 super(FakeHostManager, self).__init__() 

438 

439 self.service_states = { 

440 'host1': {'total_capacity_gb': 1024, 

441 'free_capacity_gb': 1024, 

442 'allocated_capacity_gb': 0, 

443 'thin_provisioning': False, 

444 'reserved_percentage': 10, 

445 'reserved_snapshot_percentage': 5, 

446 'reserved_share_extend_percentage': 15, 

447 'timestamp': None, 

448 'snapshot_support': True, 

449 'create_share_from_snapshot_support': True, 

450 'replication_type': 'writable', 

451 'replication_domain': 'endor', 

452 'storage_protocol': 'NFS_CIFS', 

453 'vendor_name': 'Dummy', 

454 }, 

455 'host2': {'total_capacity_gb': 2048, 

456 'free_capacity_gb': 300, 

457 'allocated_capacity_gb': 1748, 

458 'provisioned_capacity_gb': 1748, 

459 'max_over_subscription_ratio': 2.0, 

460 'thin_provisioning': True, 

461 'reserved_percentage': 10, 

462 'reserved_snapshot_percentage': 5, 

463 'reserved_share_extend_percentage': 15, 

464 'timestamp': None, 

465 'snapshot_support': True, 

466 'create_share_from_snapshot_support': True, 

467 'replication_type': 'readable', 

468 'replication_domain': 'kashyyyk', 

469 'storage_protocol': 'NFS_CIFS', 

470 'vendor_name': 'Dummy', 

471 }, 

472 'host3': {'total_capacity_gb': 512, 

473 'free_capacity_gb': 256, 

474 'allocated_capacity_gb': 256, 

475 'provisioned_capacity_gb': 256, 

476 'max_over_subscription_ratio': 2.0, 

477 'thin_provisioning': [False], 

478 'reserved_percentage': 0, 

479 'reserved_snapshot_percentage': 0, 

480 'reserved_share_extend_percentage': 0, 

481 'snapshot_support': True, 

482 'create_share_from_snapshot_support': True, 

483 'timestamp': None, 

484 'storage_protocol': 'NFS_CIFS', 

485 'vendor_name': 'Dummy', 

486 }, 

487 'host4': {'total_capacity_gb': 2048, 

488 'free_capacity_gb': 200, 

489 'allocated_capacity_gb': 1848, 

490 'provisioned_capacity_gb': 1848, 

491 'max_over_subscription_ratio': 1.0, 

492 'thin_provisioning': [True], 

493 'reserved_percentage': 5, 

494 'reserved_snapshot_percentage': 2, 

495 'reserved_share_extend_percentage': 5, 

496 'timestamp': None, 

497 'snapshot_support': True, 

498 'create_share_from_snapshot_support': True, 

499 'replication_type': 'dr', 

500 'replication_domain': 'naboo', 

501 'storage_protocol': 'NFS_CIFS', 

502 'vendor_name': 'Dummy', 

503 }, 

504 'host5': {'total_capacity_gb': 2048, 

505 'free_capacity_gb': 500, 

506 'allocated_capacity_gb': 1548, 

507 'provisioned_capacity_gb': 1548, 

508 'max_over_subscription_ratio': 1.5, 

509 'thin_provisioning': [True, False], 

510 'reserved_percentage': 5, 

511 'reserved_snapshot_percentage': 2, 

512 'reserved_share_extend_percentage': 5, 

513 'timestamp': None, 

514 'snapshot_support': True, 

515 'create_share_from_snapshot_support': True, 

516 'replication_type': None, 

517 'storage_protocol': 'NFS_CIFS', 

518 'vendor_name': 'Dummy', 

519 }, 

520 'host6': {'total_capacity_gb': 'unknown', 

521 'free_capacity_gb': 'unknown', 

522 'allocated_capacity_gb': 1548, 

523 'thin_provisioning': False, 

524 'reserved_percentage': 5, 

525 'reserved_snapshot_percentage': 2, 

526 'reserved_share_extend_percentage': 5, 

527 'snapshot_support': True, 

528 'create_share_from_snapshot_support': True, 

529 'timestamp': None, 

530 'storage_protocol': 'GLUSTERFS', 

531 'vendor_name': 'Dummy', 

532 }, 

533 'host7': {'total_capacity_gb': 'unknown', 

534 'free_capacity_gb': 'unknown', 

535 'allocated_capacity_gb': 1548, 

536 'thin_provisioning': False, 

537 'reserved_percentage': 5, 

538 'reserved_snapshot_percentage': 2, 

539 'reserved_share_extend_percentage': 5, 

540 'snapshot_support': True, 

541 'create_share_from_snapshot_support': True, 

542 'timestamp': None, 

543 'storage_protocol': 'NFS_CIFS', 

544 'vendor_name': 'Dummy', 

545 }, 

546 } 

547 

548 

549class FakeHostState(host_manager.HostState): 

550 def __init__(self, host, attribute_dict): 

551 super(FakeHostState, self).__init__(host) 

552 for (key, val) in attribute_dict.items(): 

553 setattr(self, key, val) 

554 

555 

556FAKE_HOST_STRING_1 = 'openstack@BackendA#PoolX' 

557FAKE_HOST_STRING_2 = 'openstack@BackendB#PoolY' 

558FAKE_HOST_STRING_3 = 'openstack@BackendC#PoolZ' 

559 

560 

561def mock_host_manager_db_calls(mock_obj, disabled=None): 

562 services = [ 

563 dict(id=1, host='host1', topic='share', disabled=False, 

564 availability_zone=FAKE_AZ_1, availability_zone_id=FAKE_AZ_1['id'], 

565 updated_at=timeutils.utcnow()), 

566 dict(id=2, host='host2', topic='share', disabled=False, 

567 availability_zone=FAKE_AZ_1, availability_zone_id=FAKE_AZ_1['id'], 

568 updated_at=timeutils.utcnow()), 

569 dict(id=3, host='host3', topic='share', disabled=False, 

570 availability_zone=FAKE_AZ_2, availability_zone_id=FAKE_AZ_2['id'], 

571 updated_at=timeutils.utcnow()), 

572 dict(id=4, host='host4', topic='share', disabled=False, 

573 availability_zone=FAKE_AZ_3, availability_zone_id=FAKE_AZ_3['id'], 

574 updated_at=timeutils.utcnow()), 

575 dict(id=5, host='host5', topic='share', disabled=False, 

576 availability_zone=FAKE_AZ_3, availability_zone_id=FAKE_AZ_3['id'], 

577 updated_at=timeutils.utcnow()), 

578 dict(id=6, host='host6', topic='share', disabled=False, 

579 availability_zone=FAKE_AZ_4, availability_zone_id=FAKE_AZ_4['id'], 

580 updated_at=timeutils.utcnow()), 

581 dict(id=7, host='host7', topic='share', disabled=True, 

582 availability_zone=FAKE_AZ_4, availability_zone_id=FAKE_AZ_4['id'], 

583 updated_at=timeutils.utcnow()), 

584 ] 

585 if disabled is None: 

586 mock_obj.return_value = services 

587 else: 

588 mock_obj.return_value = [service for service in services 

589 if service['disabled'] == disabled] 

590 

591 

592class FakeWeigher1(base_host_weigher.BaseHostWeigher): 

593 def __init__(self): 

594 pass 

595 

596 

597class FakeWeigher2(base_host_weigher.BaseHostWeigher): 

598 def __init__(self): 

599 pass 

600 

601 

602class FakeClass(object): 

603 def __init__(self): 

604 pass 

605 

606 

607def fake_replica_request_spec(**kwargs): 

608 request_spec = { 

609 'share_properties': { 

610 'id': 'f0e4bb5e-65f0-11e5-9d70-feff819cdc9f', 

611 'name': 'fakename', 

612 'size': 1, 

613 'share_network_id': '4ccd5318-65f1-11e5-9d70-feff819cdc9f', 

614 'availability_zone': 'fake_az', 

615 'replication_type': 'dr', 

616 }, 

617 'share_instance_properties': { 

618 'id': '8d5566df-1e83-4373-84b8-6f8153a0ac41', 

619 'share_id': 'f0e4bb5e-65f0-11e5-9d70-feff819cdc9f', 

620 'host': 'openstack@BackendZ#PoolA', 

621 'status': 'available', 

622 'availability_zone_id': 'f6e146d0-65f0-11e5-9d70-feff819cdc9f', 

623 'share_network_id': '4ccd5318-65f1-11e5-9d70-feff819cdc9f', 

624 'share_server_id': '53099868-65f1-11e5-9d70-feff819cdc9f', 

625 }, 

626 'share_proto': 'nfs', 

627 'share_id': 'f0e4bb5e-65f0-11e5-9d70-feff819cdc9f', 

628 'snapshot_id': None, 

629 'share_type': 'fake_share_type', 

630 'share_group': None, 

631 } 

632 request_spec.update(kwargs) 

633 return request_spec 

634 

635 

636def get_fake_host(host_name=None): 

637 

638 class FakeHost(object): 

639 def __init__(self, host_name=None): 

640 self.host = host_name or 'openstack@BackendZ#PoolA' 

641 

642 class FakeWeightedHost(object): 

643 def __init__(self, host_name=None): 

644 self.obj = FakeHost(host_name=host_name) 

645 

646 return FakeWeightedHost(host_name=host_name)