Coverage for nova/api/openstack/compute/routes.py: 100%
151 statements
« prev ^ index » next coverage.py v7.6.12, created at 2025-04-17 15:08 +0000
« prev ^ index » next coverage.py v7.6.12, created at 2025-04-17 15:08 +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.
17import functools
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
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 """
96 controller = wsgi.Resource(main_controller())
97 for ctl in action_controller_list:
98 controller.register_subcontroller_actions(ctl())
99 return controller
102agents_controller = functools.partial(
103 _create_controller, agents.AgentController, [])
106aggregates_controller = functools.partial(
107 _create_controller, aggregates.AggregateController, [])
110assisted_volume_snapshots_controller = functools.partial(
111 _create_controller,
112 assisted_volume_snapshots.AssistedVolumeSnapshotsController, [])
115availability_zone_controller = functools.partial(
116 _create_controller, availability_zone.AvailabilityZoneController, [])
119baremetal_nodes_controller = functools.partial(
120 _create_controller, baremetal_nodes.BareMetalNodeController, [])
123cells_controller = functools.partial(
124 _create_controller, cells.CellsController, [])
127certificates_controller = functools.partial(
128 _create_controller, certificates.CertificatesController, [])
131cloudpipe_controller = functools.partial(
132 _create_controller, cloudpipe.CloudpipeController, [])
135extensions_controller = functools.partial(
136 _create_controller, extension_info.ExtensionInfoController, [])
139fixed_ips_controller = functools.partial(_create_controller,
140 fixed_ips.FixedIPController, [])
143flavor_controller = functools.partial(_create_controller,
144 flavors.FlavorsController,
145 [
146 flavor_access.FlavorActionController
147 ]
148)
151flavor_access_controller = functools.partial(_create_controller,
152 flavor_access.FlavorAccessController, [])
155flavor_extraspec_controller = functools.partial(_create_controller,
156 flavors_extraspecs.FlavorExtraSpecsController, [])
159floating_ip_dns_controller = functools.partial(_create_controller,
160 floating_ip_dns.FloatingIPDNSDomainController, [])
163floating_ip_dnsentry_controller = functools.partial(_create_controller,
164 floating_ip_dns.FloatingIPDNSEntryController, [])
167floating_ip_pools_controller = functools.partial(_create_controller,
168 floating_ip_pools.FloatingIPPoolsController, [])
171floating_ips_controller = functools.partial(_create_controller,
172 floating_ips.FloatingIPController, [])
175floating_ips_bulk_controller = functools.partial(_create_controller,
176 floating_ips_bulk.FloatingIPBulkController, [])
179fping_controller = functools.partial(_create_controller,
180 fping.FpingController, [])
183hosts_controller = functools.partial(
184 _create_controller, hosts.HostController, [])
187hypervisors_controller = functools.partial(
188 _create_controller, hypervisors.HypervisorsController, [])
191images_controller = functools.partial(
192 _create_controller, images.ImagesController, [])
195image_metadata_controller = functools.partial(
196 _create_controller, image_metadata.ImageMetadataController, [])
199instance_actions_controller = functools.partial(_create_controller,
200 instance_actions.InstanceActionsController, [])
203instance_usage_audit_log_controller = functools.partial(_create_controller,
204 instance_usage_audit_log.InstanceUsageAuditLogController, [])
207ips_controller = functools.partial(_create_controller,
208 ips.IPsController, [])
211keypairs_controller = functools.partial(
212 _create_controller, keypairs.KeypairController, [])
215limits_controller = functools.partial(
216 _create_controller, limits.LimitsController, [])
219migrations_controller = functools.partial(_create_controller,
220 migrations.MigrationsController, [])
223networks_controller = functools.partial(_create_controller,
224 networks.NetworkController,
225 [networks_associate.NetworkAssociateActionController])
228quota_classes_controller = functools.partial(_create_controller,
229 quota_classes.QuotaClassSetsController, [])
232quota_set_controller = functools.partial(_create_controller,
233 quota_sets.QuotaSetsController, [])
236security_group_controller = functools.partial(_create_controller,
237 security_groups.SecurityGroupController, [])
240security_group_default_rules_controller = functools.partial(_create_controller,
241 security_group_default_rules.SecurityGroupDefaultRulesController, [])
244security_group_rules_controller = functools.partial(_create_controller,
245 security_groups.SecurityGroupRulesController, [])
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)
271console_auth_tokens_controller = functools.partial(_create_controller,
272 console_auth_tokens.ConsoleAuthTokensController, [])
275consoles_controller = functools.partial(_create_controller,
276 consoles.ConsolesController, [])
279server_diagnostics_controller = functools.partial(_create_controller,
280 server_diagnostics.ServerDiagnosticsController, [])
283server_external_events_controller = functools.partial(_create_controller,
284 server_external_events.ServerExternalEventsController, [])
287server_groups_controller = functools.partial(_create_controller,
288 server_groups.ServerGroupController, [])
291server_metadata_controller = functools.partial(_create_controller,
292 server_metadata.ServerMetadataController, [])
295server_migrations_controller = functools.partial(_create_controller,
296 server_migrations.ServerMigrationsController, [])
299server_os_interface_controller = functools.partial(_create_controller,
300 attach_interfaces.InterfaceAttachmentController, [])
303server_password_controller = functools.partial(_create_controller,
304 server_password.ServerPasswordController, [])
307server_remote_consoles_controller = functools.partial(_create_controller,
308 remote_consoles.RemoteConsolesController, [])
311server_security_groups_controller = functools.partial(_create_controller,
312 security_groups.ServerSecurityGroupController, [])
314server_shares_controller = functools.partial(_create_controller,
315 server_shares.ServerSharesController, [])
317server_tags_controller = functools.partial(_create_controller,
318 server_tags.ServerTagsController, [])
320server_topology_controller = functools.partial(_create_controller,
321 server_topology.ServerTopologyController, [])
323server_volume_attachments_controller = functools.partial(_create_controller,
324 volumes.VolumeAttachmentController, [])
327services_controller = functools.partial(_create_controller,
328 services.ServiceController, [])
331simple_tenant_usage_controller = functools.partial(_create_controller,
332 simple_tenant_usage.SimpleTenantUsageController, [])
335snapshots_controller = functools.partial(_create_controller,
336 volumes.SnapshotController, [])
339tenant_networks_controller = functools.partial(_create_controller,
340 tenant_networks.TenantNetworkController, [])
343version_controller = functools.partial(_create_controller,
344 versionsV21.VersionsController, [])
347virtual_interfaces_controller = functools.partial(_create_controller,
348 virtual_interfaces.ServerVirtualInterfaceController, [])
351volumes_controller = functools.partial(_create_controller,
352 volumes.VolumeController, [])
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)
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 """
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())
868 if custom_routes is None:
869 custom_routes = tuple()
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
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)
890 @classmethod
891 def factory(cls, global_config, **local_config):
892 """Simple paste factory.
894 :class:`nova.api.wsgi.Router` doesn't have one.
895 """
896 return cls()