Coverage for nova/api/openstack/compute/routes.py: 100%

151 statements  

« prev     ^ index     » next       coverage.py v7.6.12, created at 2025-04-24 11:16 +0000

1# Copyright 2010 United States Government as represented by the 

2# Administrator of the National Aeronautics and Space Administration. 

3# All Rights Reserved. 

4# 

5# Licensed under the Apache License, Version 2.0 (the "License"); you may 

6# not use this file except in compliance with the License. You may obtain 

7# a copy of the License at 

8# 

9# http://www.apache.org/licenses/LICENSE-2.0 

10# 

11# Unless required by applicable law or agreed to in writing, software 

12# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 

13# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 

14# License for the specific language governing permissions and limitations 

15# under the License. 

16 

17import functools 

18 

19import nova.api.openstack 

20from nova.api.openstack.compute import admin_actions 

21from nova.api.openstack.compute import admin_password 

22from nova.api.openstack.compute import agents 

23from nova.api.openstack.compute import aggregates 

24from nova.api.openstack.compute import assisted_volume_snapshots 

25from nova.api.openstack.compute import attach_interfaces 

26from nova.api.openstack.compute import availability_zone 

27from nova.api.openstack.compute import baremetal_nodes 

28from nova.api.openstack.compute import cells 

29from nova.api.openstack.compute import certificates 

30from nova.api.openstack.compute import cloudpipe 

31from nova.api.openstack.compute import console_auth_tokens 

32from nova.api.openstack.compute import console_output 

33from nova.api.openstack.compute import consoles 

34from nova.api.openstack.compute import create_backup 

35from nova.api.openstack.compute import deferred_delete 

36from nova.api.openstack.compute import evacuate 

37from nova.api.openstack.compute import extension_info 

38from nova.api.openstack.compute import fixed_ips 

39from nova.api.openstack.compute import flavor_access 

40from nova.api.openstack.compute import flavors 

41from nova.api.openstack.compute import flavors_extraspecs 

42from nova.api.openstack.compute import floating_ip_dns 

43from nova.api.openstack.compute import floating_ip_pools 

44from nova.api.openstack.compute import floating_ips 

45from nova.api.openstack.compute import floating_ips_bulk 

46from nova.api.openstack.compute import fping 

47from nova.api.openstack.compute import hosts 

48from nova.api.openstack.compute import hypervisors 

49from nova.api.openstack.compute import image_metadata 

50from nova.api.openstack.compute import images 

51from nova.api.openstack.compute import instance_actions 

52from nova.api.openstack.compute import instance_usage_audit_log 

53from nova.api.openstack.compute import ips 

54from nova.api.openstack.compute import keypairs 

55from nova.api.openstack.compute import limits 

56from nova.api.openstack.compute import lock_server 

57from nova.api.openstack.compute import migrate_server 

58from nova.api.openstack.compute import migrations 

59from nova.api.openstack.compute import multinic 

60from nova.api.openstack.compute import networks 

61from nova.api.openstack.compute import networks_associate 

62from nova.api.openstack.compute import pause_server 

63from nova.api.openstack.compute import quota_classes 

64from nova.api.openstack.compute import quota_sets 

65from nova.api.openstack.compute import remote_consoles 

66from nova.api.openstack.compute import rescue 

67from nova.api.openstack.compute import security_group_default_rules 

68from nova.api.openstack.compute import security_groups 

69from nova.api.openstack.compute import server_diagnostics 

70from nova.api.openstack.compute import server_external_events 

71from nova.api.openstack.compute import server_groups 

72from nova.api.openstack.compute import server_metadata 

73from nova.api.openstack.compute import server_migrations 

74from nova.api.openstack.compute import server_password 

75from nova.api.openstack.compute import server_shares 

76from nova.api.openstack.compute import server_tags 

77from nova.api.openstack.compute import server_topology 

78from nova.api.openstack.compute import servers 

79from nova.api.openstack.compute import services 

80from nova.api.openstack.compute import shelve 

81from nova.api.openstack.compute import simple_tenant_usage 

82from nova.api.openstack.compute import suspend_server 

83from nova.api.openstack.compute import tenant_networks 

84from nova.api.openstack.compute import versionsV21 

85from nova.api.openstack.compute import virtual_interfaces 

86from nova.api.openstack.compute import volumes 

87from nova.api.openstack import wsgi 

88from nova.api import wsgi as base_wsgi 

89 

90 

91def _create_controller(main_controller, action_controller_list): 

92 """This is a helper method to create controller with a 

93 list of action controller. 

94 """ 

95 

96 controller = wsgi.Resource(main_controller()) 

97 for ctl in action_controller_list: 

98 controller.register_subcontroller_actions(ctl()) 

99 return controller 

100 

101 

102agents_controller = functools.partial( 

103 _create_controller, agents.AgentController, []) 

104 

105 

106aggregates_controller = functools.partial( 

107 _create_controller, aggregates.AggregateController, []) 

108 

109 

110assisted_volume_snapshots_controller = functools.partial( 

111 _create_controller, 

112 assisted_volume_snapshots.AssistedVolumeSnapshotsController, []) 

113 

114 

115availability_zone_controller = functools.partial( 

116 _create_controller, availability_zone.AvailabilityZoneController, []) 

117 

118 

119baremetal_nodes_controller = functools.partial( 

120 _create_controller, baremetal_nodes.BareMetalNodeController, []) 

121 

122 

123cells_controller = functools.partial( 

124 _create_controller, cells.CellsController, []) 

125 

126 

127certificates_controller = functools.partial( 

128 _create_controller, certificates.CertificatesController, []) 

129 

130 

131cloudpipe_controller = functools.partial( 

132 _create_controller, cloudpipe.CloudpipeController, []) 

133 

134 

135extensions_controller = functools.partial( 

136 _create_controller, extension_info.ExtensionInfoController, []) 

137 

138 

139fixed_ips_controller = functools.partial(_create_controller, 

140 fixed_ips.FixedIPController, []) 

141 

142 

143flavor_controller = functools.partial(_create_controller, 

144 flavors.FlavorsController, 

145 [ 

146 flavor_access.FlavorActionController 

147 ] 

148) 

149 

150 

151flavor_access_controller = functools.partial(_create_controller, 

152 flavor_access.FlavorAccessController, []) 

153 

154 

155flavor_extraspec_controller = functools.partial(_create_controller, 

156 flavors_extraspecs.FlavorExtraSpecsController, []) 

157 

158 

159floating_ip_dns_controller = functools.partial(_create_controller, 

160 floating_ip_dns.FloatingIPDNSDomainController, []) 

161 

162 

163floating_ip_dnsentry_controller = functools.partial(_create_controller, 

164 floating_ip_dns.FloatingIPDNSEntryController, []) 

165 

166 

167floating_ip_pools_controller = functools.partial(_create_controller, 

168 floating_ip_pools.FloatingIPPoolsController, []) 

169 

170 

171floating_ips_controller = functools.partial(_create_controller, 

172 floating_ips.FloatingIPController, []) 

173 

174 

175floating_ips_bulk_controller = functools.partial(_create_controller, 

176 floating_ips_bulk.FloatingIPBulkController, []) 

177 

178 

179fping_controller = functools.partial(_create_controller, 

180 fping.FpingController, []) 

181 

182 

183hosts_controller = functools.partial( 

184 _create_controller, hosts.HostController, []) 

185 

186 

187hypervisors_controller = functools.partial( 

188 _create_controller, hypervisors.HypervisorsController, []) 

189 

190 

191images_controller = functools.partial( 

192 _create_controller, images.ImagesController, []) 

193 

194 

195image_metadata_controller = functools.partial( 

196 _create_controller, image_metadata.ImageMetadataController, []) 

197 

198 

199instance_actions_controller = functools.partial(_create_controller, 

200 instance_actions.InstanceActionsController, []) 

201 

202 

203instance_usage_audit_log_controller = functools.partial(_create_controller, 

204 instance_usage_audit_log.InstanceUsageAuditLogController, []) 

205 

206 

207ips_controller = functools.partial(_create_controller, 

208 ips.IPsController, []) 

209 

210 

211keypairs_controller = functools.partial( 

212 _create_controller, keypairs.KeypairController, []) 

213 

214 

215limits_controller = functools.partial( 

216 _create_controller, limits.LimitsController, []) 

217 

218 

219migrations_controller = functools.partial(_create_controller, 

220 migrations.MigrationsController, []) 

221 

222 

223networks_controller = functools.partial(_create_controller, 

224 networks.NetworkController, 

225 [networks_associate.NetworkAssociateActionController]) 

226 

227 

228quota_classes_controller = functools.partial(_create_controller, 

229 quota_classes.QuotaClassSetsController, []) 

230 

231 

232quota_set_controller = functools.partial(_create_controller, 

233 quota_sets.QuotaSetsController, []) 

234 

235 

236security_group_controller = functools.partial(_create_controller, 

237 security_groups.SecurityGroupController, []) 

238 

239 

240security_group_default_rules_controller = functools.partial(_create_controller, 

241 security_group_default_rules.SecurityGroupDefaultRulesController, []) 

242 

243 

244security_group_rules_controller = functools.partial(_create_controller, 

245 security_groups.SecurityGroupRulesController, []) 

246 

247 

248server_controller = functools.partial(_create_controller, 

249 servers.ServersController, 

250 [ 

251 admin_actions.AdminActionsController, 

252 admin_password.AdminPasswordController, 

253 console_output.ConsoleOutputController, 

254 create_backup.CreateBackupController, 

255 deferred_delete.DeferredDeleteController, 

256 evacuate.EvacuateController, 

257 floating_ips.FloatingIPActionController, 

258 lock_server.LockServerController, 

259 migrate_server.MigrateServerController, 

260 multinic.MultinicController, 

261 pause_server.PauseServerController, 

262 remote_consoles.RemoteConsolesController, 

263 rescue.RescueController, 

264 security_groups.SecurityGroupActionController, 

265 shelve.ShelveController, 

266 suspend_server.SuspendServerController 

267 ] 

268) 

269 

270 

271console_auth_tokens_controller = functools.partial(_create_controller, 

272 console_auth_tokens.ConsoleAuthTokensController, []) 

273 

274 

275consoles_controller = functools.partial(_create_controller, 

276 consoles.ConsolesController, []) 

277 

278 

279server_diagnostics_controller = functools.partial(_create_controller, 

280 server_diagnostics.ServerDiagnosticsController, []) 

281 

282 

283server_external_events_controller = functools.partial(_create_controller, 

284 server_external_events.ServerExternalEventsController, []) 

285 

286 

287server_groups_controller = functools.partial(_create_controller, 

288 server_groups.ServerGroupController, []) 

289 

290 

291server_metadata_controller = functools.partial(_create_controller, 

292 server_metadata.ServerMetadataController, []) 

293 

294 

295server_migrations_controller = functools.partial(_create_controller, 

296 server_migrations.ServerMigrationsController, []) 

297 

298 

299server_os_interface_controller = functools.partial(_create_controller, 

300 attach_interfaces.InterfaceAttachmentController, []) 

301 

302 

303server_password_controller = functools.partial(_create_controller, 

304 server_password.ServerPasswordController, []) 

305 

306 

307server_remote_consoles_controller = functools.partial(_create_controller, 

308 remote_consoles.RemoteConsolesController, []) 

309 

310 

311server_security_groups_controller = functools.partial(_create_controller, 

312 security_groups.ServerSecurityGroupController, []) 

313 

314server_shares_controller = functools.partial(_create_controller, 

315 server_shares.ServerSharesController, []) 

316 

317server_tags_controller = functools.partial(_create_controller, 

318 server_tags.ServerTagsController, []) 

319 

320server_topology_controller = functools.partial(_create_controller, 

321 server_topology.ServerTopologyController, []) 

322 

323server_volume_attachments_controller = functools.partial(_create_controller, 

324 volumes.VolumeAttachmentController, []) 

325 

326 

327services_controller = functools.partial(_create_controller, 

328 services.ServiceController, []) 

329 

330 

331simple_tenant_usage_controller = functools.partial(_create_controller, 

332 simple_tenant_usage.SimpleTenantUsageController, []) 

333 

334 

335snapshots_controller = functools.partial(_create_controller, 

336 volumes.SnapshotController, []) 

337 

338 

339tenant_networks_controller = functools.partial(_create_controller, 

340 tenant_networks.TenantNetworkController, []) 

341 

342 

343version_controller = functools.partial(_create_controller, 

344 versionsV21.VersionsController, []) 

345 

346 

347virtual_interfaces_controller = functools.partial(_create_controller, 

348 virtual_interfaces.ServerVirtualInterfaceController, []) 

349 

350 

351volumes_controller = functools.partial(_create_controller, 

352 volumes.VolumeController, []) 

353 

354 

355# NOTE(alex_xu): This is structure of this route list as below: 

356# ( 

357# ('Route path', { 

358# 'HTTP method: [ 

359# 'Controller', 

360# 'The method of controller is used to handle this route' 

361# ], 

362# ... 

363# }), 

364# ... 

365# ) 

366# 

367# Also note that this is ordered tuple. For example, the '/servers/detail' 

368# should be in the front of '/servers/{id}', otherwise the request to 

369# '/servers/detail' always matches to '/servers/{id}' as the id is 'detail'. 

370ROUTE_LIST = ( 

371 # NOTE: This is a redirection from '' to '/'. The request to the '/v2.1' 

372 # or '/2.0' without the ending '/' will get a response with status code 

373 # '302' returned. 

374 ('', '/'), 

375 ('/', { 

376 'GET': [version_controller, 'show'] 

377 }), 

378 ('/versions/{id}', { 

379 'GET': [version_controller, 'show'] 

380 }), 

381 ('/extensions', { 

382 'GET': [extensions_controller, 'index'], 

383 }), 

384 ('/extensions/{id}', { 

385 'GET': [extensions_controller, 'show'], 

386 }), 

387 ('/flavors', { 

388 'GET': [flavor_controller, 'index'], 

389 'POST': [flavor_controller, 'create'] 

390 }), 

391 ('/flavors/detail', { 

392 'GET': [flavor_controller, 'detail'] 

393 }), 

394 ('/flavors/{id}', { 

395 'GET': [flavor_controller, 'show'], 

396 'PUT': [flavor_controller, 'update'], 

397 'DELETE': [flavor_controller, 'delete'] 

398 }), 

399 ('/flavors/{id}/action', { 

400 'POST': [flavor_controller, 'action'] 

401 }), 

402 ('/flavors/{flavor_id}/os-extra_specs', { 

403 'GET': [flavor_extraspec_controller, 'index'], 

404 'POST': [flavor_extraspec_controller, 'create'] 

405 }), 

406 ('/flavors/{flavor_id}/os-extra_specs/{id}', { 

407 'GET': [flavor_extraspec_controller, 'show'], 

408 'PUT': [flavor_extraspec_controller, 'update'], 

409 'DELETE': [flavor_extraspec_controller, 'delete'] 

410 }), 

411 ('/flavors/{flavor_id}/os-flavor-access', { 

412 'GET': [flavor_access_controller, 'index'] 

413 }), 

414 ('/images', { 

415 'GET': [images_controller, 'index'] 

416 }), 

417 ('/images/detail', { 

418 'GET': [images_controller, 'detail'], 

419 }), 

420 ('/images/{id}', { 

421 'GET': [images_controller, 'show'], 

422 'DELETE': [images_controller, 'delete'] 

423 }), 

424 ('/images/{image_id}/metadata', { 

425 'GET': [image_metadata_controller, 'index'], 

426 'POST': [image_metadata_controller, 'create'], 

427 'PUT': [image_metadata_controller, 'update_all'] 

428 }), 

429 ('/images/{image_id}/metadata/{id}', { 

430 'GET': [image_metadata_controller, 'show'], 

431 'PUT': [image_metadata_controller, 'update'], 

432 'DELETE': [image_metadata_controller, 'delete'] 

433 }), 

434 ('/limits', { 

435 'GET': [limits_controller, 'index'] 

436 }), 

437 ('/os-agents', { 

438 'GET': [agents_controller, 'index'], 

439 'POST': [agents_controller, 'create'] 

440 }), 

441 ('/os-agents/{id}', { 

442 'PUT': [agents_controller, 'update'], 

443 'DELETE': [agents_controller, 'delete'] 

444 }), 

445 ('/os-aggregates', { 

446 'GET': [aggregates_controller, 'index'], 

447 'POST': [aggregates_controller, 'create'] 

448 }), 

449 ('/os-aggregates/{id}', { 

450 'GET': [aggregates_controller, 'show'], 

451 'PUT': [aggregates_controller, 'update'], 

452 'DELETE': [aggregates_controller, 'delete'] 

453 }), 

454 ('/os-aggregates/{id}/action', { 

455 'POST': [aggregates_controller, 'action'], 

456 }), 

457 ('/os-aggregates/{id}/images', { 

458 'POST': [aggregates_controller, 'images'], 

459 }), 

460 ('/os-assisted-volume-snapshots', { 

461 'POST': [assisted_volume_snapshots_controller, 'create'] 

462 }), 

463 ('/os-assisted-volume-snapshots/{id}', { 

464 'DELETE': [assisted_volume_snapshots_controller, 'delete'] 

465 }), 

466 ('/os-availability-zone', { 

467 'GET': [availability_zone_controller, 'index'] 

468 }), 

469 ('/os-availability-zone/detail', { 

470 'GET': [availability_zone_controller, 'detail'], 

471 }), 

472 ('/os-baremetal-nodes', { 

473 'GET': [baremetal_nodes_controller, 'index'], 

474 'POST': [baremetal_nodes_controller, 'create'] 

475 }), 

476 ('/os-baremetal-nodes/{id}', { 

477 'GET': [baremetal_nodes_controller, 'show'], 

478 'DELETE': [baremetal_nodes_controller, 'delete'] 

479 }), 

480 ('/os-baremetal-nodes/{id}/action', { 

481 'POST': [baremetal_nodes_controller, 'action'] 

482 }), 

483 ('/os-cells', { 

484 'POST': [cells_controller, 'create'], 

485 'GET': [cells_controller, 'index'], 

486 }), 

487 ('/os-cells/capacities', { 

488 'GET': [cells_controller, 'capacities'] 

489 }), 

490 ('/os-cells/detail', { 

491 'GET': [cells_controller, 'detail'] 

492 }), 

493 ('/os-cells/info', { 

494 'GET': [cells_controller, 'info'] 

495 }), 

496 ('/os-cells/sync_instances', { 

497 'POST': [cells_controller, 'sync_instances'] 

498 }), 

499 ('/os-cells/{id}', { 

500 'GET': [cells_controller, 'show'], 

501 'PUT': [cells_controller, 'update'], 

502 'DELETE': [cells_controller, 'delete'] 

503 }), 

504 ('/os-cells/{id}/capacities', { 

505 'GET': [cells_controller, 'capacities'] 

506 }), 

507 ('/os-certificates', { 

508 'POST': [certificates_controller, 'create'] 

509 }), 

510 ('/os-certificates/{id}', { 

511 'GET': [certificates_controller, 'show'] 

512 }), 

513 ('/os-cloudpipe', { 

514 'GET': [cloudpipe_controller, 'index'], 

515 'POST': [cloudpipe_controller, 'create'] 

516 }), 

517 ('/os-cloudpipe/{id}', { 

518 'PUT': [cloudpipe_controller, 'update'] 

519 }), 

520 ('/os-console-auth-tokens/{id}', { 

521 'GET': [console_auth_tokens_controller, 'show'] 

522 }), 

523 ('/os-fixed-ips/{id}', { 

524 'GET': [fixed_ips_controller, 'show'] 

525 }), 

526 ('/os-fixed-ips/{id}/action', { 

527 'POST': [fixed_ips_controller, 'action'], 

528 }), 

529 ('/os-floating-ip-dns', { 

530 'GET': [floating_ip_dns_controller, 'index'] 

531 }), 

532 ('/os-floating-ip-dns/{id}', { 

533 'PUT': [floating_ip_dns_controller, 'update'], 

534 'DELETE': [floating_ip_dns_controller, 'delete'] 

535 }), 

536 ('/os-floating-ip-dns/{domain_id}/entries/{id}', { 

537 'GET': [floating_ip_dnsentry_controller, 'show'], 

538 'PUT': [floating_ip_dnsentry_controller, 'update'], 

539 'DELETE': [floating_ip_dnsentry_controller, 'delete'] 

540 }), 

541 ('/os-floating-ip-pools', { 

542 'GET': [floating_ip_pools_controller, 'index'], 

543 }), 

544 ('/os-floating-ips', { 

545 'GET': [floating_ips_controller, 'index'], 

546 'POST': [floating_ips_controller, 'create'] 

547 }), 

548 ('/os-floating-ips/{id}', { 

549 'GET': [floating_ips_controller, 'show'], 

550 'DELETE': [floating_ips_controller, 'delete'] 

551 }), 

552 ('/os-floating-ips-bulk', { 

553 'GET': [floating_ips_bulk_controller, 'index'], 

554 'POST': [floating_ips_bulk_controller, 'create'] 

555 }), 

556 ('/os-floating-ips-bulk/{id}', { 

557 'GET': [floating_ips_bulk_controller, 'show'], 

558 'PUT': [floating_ips_bulk_controller, 'update'] 

559 }), 

560 ('/os-fping', { 

561 'GET': [fping_controller, 'index'] 

562 }), 

563 ('/os-fping/{id}', { 

564 'GET': [fping_controller, 'show'] 

565 }), 

566 ('/os-hosts', { 

567 'GET': [hosts_controller, 'index'] 

568 }), 

569 ('/os-hosts/{id}', { 

570 'GET': [hosts_controller, 'show'], 

571 'PUT': [hosts_controller, 'update'] 

572 }), 

573 ('/os-hosts/{id}/reboot', { 

574 'GET': [hosts_controller, 'reboot'] 

575 }), 

576 ('/os-hosts/{id}/shutdown', { 

577 'GET': [hosts_controller, 'shutdown'] 

578 }), 

579 ('/os-hosts/{id}/startup', { 

580 'GET': [hosts_controller, 'startup'] 

581 }), 

582 ('/os-hypervisors', { 

583 'GET': [hypervisors_controller, 'index'] 

584 }), 

585 ('/os-hypervisors/detail', { 

586 'GET': [hypervisors_controller, 'detail'] 

587 }), 

588 ('/os-hypervisors/statistics', { 

589 'GET': [hypervisors_controller, 'statistics'] 

590 }), 

591 ('/os-hypervisors/{id}', { 

592 'GET': [hypervisors_controller, 'show'] 

593 }), 

594 ('/os-hypervisors/{id}/search', { 

595 'GET': [hypervisors_controller, 'search'] 

596 }), 

597 ('/os-hypervisors/{id}/servers', { 

598 'GET': [hypervisors_controller, 'servers'] 

599 }), 

600 ('/os-hypervisors/{id}/uptime', { 

601 'GET': [hypervisors_controller, 'uptime'] 

602 }), 

603 ('/os-instance_usage_audit_log', { 

604 'GET': [instance_usage_audit_log_controller, 'index'] 

605 }), 

606 ('/os-instance_usage_audit_log/{id}', { 

607 'GET': [instance_usage_audit_log_controller, 'show'] 

608 }), 

609 ('/os-keypairs', { 

610 'GET': [keypairs_controller, 'index'], 

611 'POST': [keypairs_controller, 'create'] 

612 }), 

613 ('/os-keypairs/{id}', { 

614 'GET': [keypairs_controller, 'show'], 

615 'DELETE': [keypairs_controller, 'delete'] 

616 }), 

617 ('/os-migrations', { 

618 'GET': [migrations_controller, 'index'] 

619 }), 

620 ('/os-networks', { 

621 'GET': [networks_controller, 'index'], 

622 'POST': [networks_controller, 'create'] 

623 }), 

624 ('/os-networks/add', { 

625 'POST': [networks_controller, 'add'] 

626 }), 

627 ('/os-networks/{id}', { 

628 'GET': [networks_controller, 'show'], 

629 'DELETE': [networks_controller, 'delete'] 

630 }), 

631 ('/os-networks/{id}/action', { 

632 'POST': [networks_controller, 'action'], 

633 }), 

634 ('/os-quota-class-sets/{id}', { 

635 'GET': [quota_classes_controller, 'show'], 

636 'PUT': [quota_classes_controller, 'update'] 

637 }), 

638 ('/os-quota-sets/{id}', { 

639 'GET': [quota_set_controller, 'show'], 

640 'PUT': [quota_set_controller, 'update'], 

641 'DELETE': [quota_set_controller, 'delete'] 

642 }), 

643 ('/os-quota-sets/{id}/detail', { 

644 'GET': [quota_set_controller, 'detail'] 

645 }), 

646 ('/os-quota-sets/{id}/defaults', { 

647 'GET': [quota_set_controller, 'defaults'] 

648 }), 

649 ('/os-security-group-default-rules', { 

650 'GET': [security_group_default_rules_controller, 'index'], 

651 'POST': [security_group_default_rules_controller, 'create'] 

652 }), 

653 ('/os-security-group-default-rules/{id}', { 

654 'GET': [security_group_default_rules_controller, 'show'], 

655 'DELETE': [security_group_default_rules_controller, 'delete'] 

656 }), 

657 ('/os-security-group-rules', { 

658 'POST': [security_group_rules_controller, 'create'] 

659 }), 

660 ('/os-security-group-rules/{id}', { 

661 'DELETE': [security_group_rules_controller, 'delete'] 

662 }), 

663 ('/os-security-groups', { 

664 'GET': [security_group_controller, 'index'], 

665 'POST': [security_group_controller, 'create'] 

666 }), 

667 ('/os-security-groups/{id}', { 

668 'GET': [security_group_controller, 'show'], 

669 'PUT': [security_group_controller, 'update'], 

670 'DELETE': [security_group_controller, 'delete'] 

671 }), 

672 ('/os-server-external-events', { 

673 'POST': [server_external_events_controller, 'create'] 

674 }), 

675 ('/os-server-groups', { 

676 'GET': [server_groups_controller, 'index'], 

677 'POST': [server_groups_controller, 'create'] 

678 }), 

679 ('/os-server-groups/{id}', { 

680 'GET': [server_groups_controller, 'show'], 

681 'DELETE': [server_groups_controller, 'delete'] 

682 }), 

683 ('/os-services', { 

684 'GET': [services_controller, 'index'] 

685 }), 

686 ('/os-services/{id}', { 

687 'PUT': [services_controller, 'update'], 

688 'DELETE': [services_controller, 'delete'] 

689 }), 

690 ('/os-simple-tenant-usage', { 

691 'GET': [simple_tenant_usage_controller, 'index'] 

692 }), 

693 ('/os-simple-tenant-usage/{id}', { 

694 'GET': [simple_tenant_usage_controller, 'show'] 

695 }), 

696 ('/os-snapshots', { 

697 'GET': [snapshots_controller, 'index'], 

698 'POST': [snapshots_controller, 'create'] 

699 }), 

700 ('/os-snapshots/detail', { 

701 'GET': [snapshots_controller, 'detail'] 

702 }), 

703 ('/os-snapshots/{id}', { 

704 'GET': [snapshots_controller, 'show'], 

705 'DELETE': [snapshots_controller, 'delete'] 

706 }), 

707 ('/os-tenant-networks', { 

708 'GET': [tenant_networks_controller, 'index'], 

709 'POST': [tenant_networks_controller, 'create'] 

710 }), 

711 ('/os-tenant-networks/{id}', { 

712 'GET': [tenant_networks_controller, 'show'], 

713 'DELETE': [tenant_networks_controller, 'delete'] 

714 }), 

715 ('/os-volumes', { 

716 'GET': [volumes_controller, 'index'], 

717 'POST': [volumes_controller, 'create'], 

718 }), 

719 ('/os-volumes/detail', { 

720 'GET': [volumes_controller, 'detail'], 

721 }), 

722 ('/os-volumes/{id}', { 

723 'GET': [volumes_controller, 'show'], 

724 'DELETE': [volumes_controller, 'delete'] 

725 }), 

726 # NOTE: '/os-volumes_boot' is a clone of '/servers'. We may want to 

727 # deprecate it in the future. 

728 ('/os-volumes_boot', { 

729 'GET': [server_controller, 'index'], 

730 'POST': [server_controller, 'create'] 

731 }), 

732 ('/os-volumes_boot/detail', { 

733 'GET': [server_controller, 'detail'] 

734 }), 

735 ('/os-volumes_boot/{id}', { 

736 'GET': [server_controller, 'show'], 

737 'PUT': [server_controller, 'update'], 

738 'DELETE': [server_controller, 'delete'] 

739 }), 

740 ('/os-volumes_boot/{id}/action', { 

741 'POST': [server_controller, 'action'] 

742 }), 

743 ('/servers', { 

744 'GET': [server_controller, 'index'], 

745 'POST': [server_controller, 'create'] 

746 }), 

747 ('/servers/detail', { 

748 'GET': [server_controller, 'detail'] 

749 }), 

750 ('/servers/{id}', { 

751 'GET': [server_controller, 'show'], 

752 'PUT': [server_controller, 'update'], 

753 'DELETE': [server_controller, 'delete'] 

754 }), 

755 ('/servers/{id}/action', { 

756 'POST': [server_controller, 'action'] 

757 }), 

758 ('/servers/{server_id}/consoles', { 

759 'GET': [consoles_controller, 'index'], 

760 'POST': [consoles_controller, 'create'] 

761 }), 

762 ('/servers/{server_id}/consoles/{id}', { 

763 'GET': [consoles_controller, 'show'], 

764 'DELETE': [consoles_controller, 'delete'] 

765 }), 

766 ('/servers/{server_id}/diagnostics', { 

767 'GET': [server_diagnostics_controller, 'index'] 

768 }), 

769 ('/servers/{server_id}/ips', { 

770 'GET': [ips_controller, 'index'] 

771 }), 

772 ('/servers/{server_id}/ips/{id}', { 

773 'GET': [ips_controller, 'show'] 

774 }), 

775 ('/servers/{server_id}/metadata', { 

776 'GET': [server_metadata_controller, 'index'], 

777 'POST': [server_metadata_controller, 'create'], 

778 'PUT': [server_metadata_controller, 'update_all'], 

779 }), 

780 ('/servers/{server_id}/metadata/{id}', { 

781 'GET': [server_metadata_controller, 'show'], 

782 'PUT': [server_metadata_controller, 'update'], 

783 'DELETE': [server_metadata_controller, 'delete'], 

784 }), 

785 ('/servers/{server_id}/migrations', { 

786 'GET': [server_migrations_controller, 'index'] 

787 }), 

788 ('/servers/{server_id}/migrations/{id}', { 

789 'GET': [server_migrations_controller, 'show'], 

790 'DELETE': [server_migrations_controller, 'delete'] 

791 }), 

792 ('/servers/{server_id}/migrations/{id}/action', { 

793 'POST': [server_migrations_controller, 'action'] 

794 }), 

795 ('/servers/{server_id}/os-instance-actions', { 

796 'GET': [instance_actions_controller, 'index'] 

797 }), 

798 ('/servers/{server_id}/os-instance-actions/{id}', { 

799 'GET': [instance_actions_controller, 'show'] 

800 }), 

801 ('/servers/{server_id}/os-interface', { 

802 'GET': [server_os_interface_controller, 'index'], 

803 'POST': [server_os_interface_controller, 'create'] 

804 }), 

805 ('/servers/{server_id}/os-interface/{id}', { 

806 'GET': [server_os_interface_controller, 'show'], 

807 'DELETE': [server_os_interface_controller, 'delete'] 

808 }), 

809 ('/servers/{server_id}/os-server-password', { 

810 'GET': [server_password_controller, 'index'], 

811 'DELETE': [server_password_controller, 'clear'] 

812 }), 

813 ('/servers/{server_id}/os-virtual-interfaces', { 

814 'GET': [virtual_interfaces_controller, 'index'] 

815 }), 

816 ('/servers/{server_id}/os-volume_attachments', { 

817 'GET': [server_volume_attachments_controller, 'index'], 

818 'POST': [server_volume_attachments_controller, 'create'], 

819 }), 

820 ('/servers/{server_id}/os-volume_attachments/{id}', { 

821 'GET': [server_volume_attachments_controller, 'show'], 

822 'PUT': [server_volume_attachments_controller, 'update'], 

823 'DELETE': [server_volume_attachments_controller, 'delete'] 

824 }), 

825 ('/servers/{server_id}/remote-consoles', { 

826 'POST': [server_remote_consoles_controller, 'create'] 

827 }), 

828 ('/servers/{server_id}/os-security-groups', { 

829 'GET': [server_security_groups_controller, 'index'] 

830 }), 

831 ('/servers/{server_id}/shares', { 

832 'GET': [server_shares_controller, 'index'], 

833 'POST': [server_shares_controller, 'create'], 

834 }), 

835 ('/servers/{server_id}/shares/{id}', { 

836 'GET': [server_shares_controller, 'show'], 

837 'DELETE': [server_shares_controller, 'delete'], 

838 }), 

839 ('/servers/{server_id}/tags', { 

840 'GET': [server_tags_controller, 'index'], 

841 'PUT': [server_tags_controller, 'update_all'], 

842 'DELETE': [server_tags_controller, 'delete_all'], 

843 }), 

844 ('/servers/{server_id}/tags/{id}', { 

845 'GET': [server_tags_controller, 'show'], 

846 'PUT': [server_tags_controller, 'update'], 

847 'DELETE': [server_tags_controller, 'delete'] 

848 }), 

849 ('/servers/{server_id}/topology', { 

850 'GET': [server_topology_controller, 'index'] 

851 }), 

852) 

853 

854 

855class APIRouterV21(base_wsgi.Router): 

856 """Routes requests on the OpenStack API to the appropriate controller 

857 and method. The URL mapping based on the plain list `ROUTE_LIST` is built 

858 at here. 

859 """ 

860 

861 def __init__(self, custom_routes=None): 

862 """:param custom_routes: the additional routes can be added by this 

863 parameter. This parameter is used to test on some fake routes 

864 primarily. 

865 """ 

866 super(APIRouterV21, self).__init__(nova.api.openstack.ProjectMapper()) 

867 

868 if custom_routes is None: 

869 custom_routes = tuple() 

870 

871 for path, methods in ROUTE_LIST + custom_routes: 

872 # NOTE(alex_xu): The variable 'methods' is a dict in normal, since 

873 # the dict includes all the methods supported in the path. But 

874 # if the variable 'method' is a string, it means a redirection. 

875 # For example, the request to the '' will be redirect to the '/' in 

876 # the Nova API. To indicate that, using the target path instead of 

877 # a dict. The route entry just writes as "('', '/)". 

878 if isinstance(methods, str): 

879 self.map.redirect(path, methods) 

880 continue 

881 

882 for method, controller_info in methods.items(): 

883 # TODO(alex_xu): In the end, I want to create single controller 

884 # instance instead of create controller instance for each 

885 # route. 

886 controller = controller_info[0]() 

887 action = controller_info[1] 

888 self.map.create_route(path, method, controller, action) 

889 

890 @classmethod 

891 def factory(cls, global_config, **local_config): 

892 """Simple paste factory. 

893 

894 :class:`nova.api.wsgi.Router` doesn't have one. 

895 """ 

896 return cls()