Files
nova/nova/api/openstack/compute/routes.py
T
René Ribaud 5e508a09b3 Attach Manila shares via virtiofs (API)
This patch introduce the REST API modifications to attach/detach a share
and list/show share mappings.

Manila is the OpenStack Shared Filesystems service.
These series of patches implement changes required in Nova to allow the shares
provided by Manila to be associated with and attached to instances using
virtiofs.

Implements: blueprint libvirt-virtiofs-attach-manila-shares

Change-Id: I0255a5697cd4ea148bd91c4f6fd183841d69a333
2024-11-27 14:09:42 +01:00

897 lines
30 KiB
Python

# Copyright 2010 United States Government as represented by the
# Administrator of the National Aeronautics and Space Administration.
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
import functools
import nova.api.openstack
from nova.api.openstack.compute import admin_actions
from nova.api.openstack.compute import admin_password
from nova.api.openstack.compute import agents
from nova.api.openstack.compute import aggregates
from nova.api.openstack.compute import assisted_volume_snapshots
from nova.api.openstack.compute import attach_interfaces
from nova.api.openstack.compute import availability_zone
from nova.api.openstack.compute import baremetal_nodes
from nova.api.openstack.compute import cells
from nova.api.openstack.compute import certificates
from nova.api.openstack.compute import cloudpipe
from nova.api.openstack.compute import console_auth_tokens
from nova.api.openstack.compute import console_output
from nova.api.openstack.compute import consoles
from nova.api.openstack.compute import create_backup
from nova.api.openstack.compute import deferred_delete
from nova.api.openstack.compute import evacuate
from nova.api.openstack.compute import extension_info
from nova.api.openstack.compute import fixed_ips
from nova.api.openstack.compute import flavor_access
from nova.api.openstack.compute import flavors
from nova.api.openstack.compute import flavors_extraspecs
from nova.api.openstack.compute import floating_ip_dns
from nova.api.openstack.compute import floating_ip_pools
from nova.api.openstack.compute import floating_ips
from nova.api.openstack.compute import floating_ips_bulk
from nova.api.openstack.compute import fping
from nova.api.openstack.compute import hosts
from nova.api.openstack.compute import hypervisors
from nova.api.openstack.compute import image_metadata
from nova.api.openstack.compute import images
from nova.api.openstack.compute import instance_actions
from nova.api.openstack.compute import instance_usage_audit_log
from nova.api.openstack.compute import ips
from nova.api.openstack.compute import keypairs
from nova.api.openstack.compute import limits
from nova.api.openstack.compute import lock_server
from nova.api.openstack.compute import migrate_server
from nova.api.openstack.compute import migrations
from nova.api.openstack.compute import multinic
from nova.api.openstack.compute import networks
from nova.api.openstack.compute import networks_associate
from nova.api.openstack.compute import pause_server
from nova.api.openstack.compute import quota_classes
from nova.api.openstack.compute import quota_sets
from nova.api.openstack.compute import remote_consoles
from nova.api.openstack.compute import rescue
from nova.api.openstack.compute import security_group_default_rules
from nova.api.openstack.compute import security_groups
from nova.api.openstack.compute import server_diagnostics
from nova.api.openstack.compute import server_external_events
from nova.api.openstack.compute import server_groups
from nova.api.openstack.compute import server_metadata
from nova.api.openstack.compute import server_migrations
from nova.api.openstack.compute import server_password
from nova.api.openstack.compute import server_shares
from nova.api.openstack.compute import server_tags
from nova.api.openstack.compute import server_topology
from nova.api.openstack.compute import servers
from nova.api.openstack.compute import services
from nova.api.openstack.compute import shelve
from nova.api.openstack.compute import simple_tenant_usage
from nova.api.openstack.compute import suspend_server
from nova.api.openstack.compute import tenant_networks
from nova.api.openstack.compute import versionsV21
from nova.api.openstack.compute import virtual_interfaces
from nova.api.openstack.compute import volumes
from nova.api.openstack import wsgi
from nova.api import wsgi as base_wsgi
def _create_controller(main_controller, action_controller_list):
"""This is a helper method to create controller with a
list of action controller.
"""
controller = wsgi.Resource(main_controller())
for ctl in action_controller_list:
controller.register_subcontroller_actions(ctl())
return controller
agents_controller = functools.partial(
_create_controller, agents.AgentController, [])
aggregates_controller = functools.partial(
_create_controller, aggregates.AggregateController, [])
assisted_volume_snapshots_controller = functools.partial(
_create_controller,
assisted_volume_snapshots.AssistedVolumeSnapshotsController, [])
availability_zone_controller = functools.partial(
_create_controller, availability_zone.AvailabilityZoneController, [])
baremetal_nodes_controller = functools.partial(
_create_controller, baremetal_nodes.BareMetalNodeController, [])
cells_controller = functools.partial(
_create_controller, cells.CellsController, [])
certificates_controller = functools.partial(
_create_controller, certificates.CertificatesController, [])
cloudpipe_controller = functools.partial(
_create_controller, cloudpipe.CloudpipeController, [])
extensions_controller = functools.partial(
_create_controller, extension_info.ExtensionInfoController, [])
fixed_ips_controller = functools.partial(_create_controller,
fixed_ips.FixedIPController, [])
flavor_controller = functools.partial(_create_controller,
flavors.FlavorsController,
[
flavor_access.FlavorActionController
]
)
flavor_access_controller = functools.partial(_create_controller,
flavor_access.FlavorAccessController, [])
flavor_extraspec_controller = functools.partial(_create_controller,
flavors_extraspecs.FlavorExtraSpecsController, [])
floating_ip_dns_controller = functools.partial(_create_controller,
floating_ip_dns.FloatingIPDNSDomainController, [])
floating_ip_dnsentry_controller = functools.partial(_create_controller,
floating_ip_dns.FloatingIPDNSEntryController, [])
floating_ip_pools_controller = functools.partial(_create_controller,
floating_ip_pools.FloatingIPPoolsController, [])
floating_ips_controller = functools.partial(_create_controller,
floating_ips.FloatingIPController, [])
floating_ips_bulk_controller = functools.partial(_create_controller,
floating_ips_bulk.FloatingIPBulkController, [])
fping_controller = functools.partial(_create_controller,
fping.FpingController, [])
hosts_controller = functools.partial(
_create_controller, hosts.HostController, [])
hypervisors_controller = functools.partial(
_create_controller, hypervisors.HypervisorsController, [])
images_controller = functools.partial(
_create_controller, images.ImagesController, [])
image_metadata_controller = functools.partial(
_create_controller, image_metadata.ImageMetadataController, [])
instance_actions_controller = functools.partial(_create_controller,
instance_actions.InstanceActionsController, [])
instance_usage_audit_log_controller = functools.partial(_create_controller,
instance_usage_audit_log.InstanceUsageAuditLogController, [])
ips_controller = functools.partial(_create_controller,
ips.IPsController, [])
keypairs_controller = functools.partial(
_create_controller, keypairs.KeypairController, [])
limits_controller = functools.partial(
_create_controller, limits.LimitsController, [])
migrations_controller = functools.partial(_create_controller,
migrations.MigrationsController, [])
networks_controller = functools.partial(_create_controller,
networks.NetworkController,
[networks_associate.NetworkAssociateActionController])
quota_classes_controller = functools.partial(_create_controller,
quota_classes.QuotaClassSetsController, [])
quota_set_controller = functools.partial(_create_controller,
quota_sets.QuotaSetsController, [])
security_group_controller = functools.partial(_create_controller,
security_groups.SecurityGroupController, [])
security_group_default_rules_controller = functools.partial(_create_controller,
security_group_default_rules.SecurityGroupDefaultRulesController, [])
security_group_rules_controller = functools.partial(_create_controller,
security_groups.SecurityGroupRulesController, [])
server_controller = functools.partial(_create_controller,
servers.ServersController,
[
admin_actions.AdminActionsController,
admin_password.AdminPasswordController,
console_output.ConsoleOutputController,
create_backup.CreateBackupController,
deferred_delete.DeferredDeleteController,
evacuate.EvacuateController,
floating_ips.FloatingIPActionController,
lock_server.LockServerController,
migrate_server.MigrateServerController,
multinic.MultinicController,
pause_server.PauseServerController,
remote_consoles.RemoteConsolesController,
rescue.RescueController,
security_groups.SecurityGroupActionController,
shelve.ShelveController,
suspend_server.SuspendServerController
]
)
console_auth_tokens_controller = functools.partial(_create_controller,
console_auth_tokens.ConsoleAuthTokensController, [])
consoles_controller = functools.partial(_create_controller,
consoles.ConsolesController, [])
server_diagnostics_controller = functools.partial(_create_controller,
server_diagnostics.ServerDiagnosticsController, [])
server_external_events_controller = functools.partial(_create_controller,
server_external_events.ServerExternalEventsController, [])
server_groups_controller = functools.partial(_create_controller,
server_groups.ServerGroupController, [])
server_metadata_controller = functools.partial(_create_controller,
server_metadata.ServerMetadataController, [])
server_migrations_controller = functools.partial(_create_controller,
server_migrations.ServerMigrationsController, [])
server_os_interface_controller = functools.partial(_create_controller,
attach_interfaces.InterfaceAttachmentController, [])
server_password_controller = functools.partial(_create_controller,
server_password.ServerPasswordController, [])
server_remote_consoles_controller = functools.partial(_create_controller,
remote_consoles.RemoteConsolesController, [])
server_security_groups_controller = functools.partial(_create_controller,
security_groups.ServerSecurityGroupController, [])
server_shares_controller = functools.partial(_create_controller,
server_shares.ServerSharesController, [])
server_tags_controller = functools.partial(_create_controller,
server_tags.ServerTagsController, [])
server_topology_controller = functools.partial(_create_controller,
server_topology.ServerTopologyController, [])
server_volume_attachments_controller = functools.partial(_create_controller,
volumes.VolumeAttachmentController, [])
services_controller = functools.partial(_create_controller,
services.ServiceController, [])
simple_tenant_usage_controller = functools.partial(_create_controller,
simple_tenant_usage.SimpleTenantUsageController, [])
snapshots_controller = functools.partial(_create_controller,
volumes.SnapshotController, [])
tenant_networks_controller = functools.partial(_create_controller,
tenant_networks.TenantNetworkController, [])
version_controller = functools.partial(_create_controller,
versionsV21.VersionsController, [])
virtual_interfaces_controller = functools.partial(_create_controller,
virtual_interfaces.ServerVirtualInterfaceController, [])
volumes_controller = functools.partial(_create_controller,
volumes.VolumeController, [])
# NOTE(alex_xu): This is structure of this route list as below:
# (
# ('Route path', {
# 'HTTP method: [
# 'Controller',
# 'The method of controller is used to handle this route'
# ],
# ...
# }),
# ...
# )
#
# Also note that this is ordered tuple. For example, the '/servers/detail'
# should be in the front of '/servers/{id}', otherwise the request to
# '/servers/detail' always matches to '/servers/{id}' as the id is 'detail'.
ROUTE_LIST = (
# NOTE: This is a redirection from '' to '/'. The request to the '/v2.1'
# or '/2.0' without the ending '/' will get a response with status code
# '302' returned.
('', '/'),
('/', {
'GET': [version_controller, 'show']
}),
('/versions/{id}', {
'GET': [version_controller, 'show']
}),
('/extensions', {
'GET': [extensions_controller, 'index'],
}),
('/extensions/{id}', {
'GET': [extensions_controller, 'show'],
}),
('/flavors', {
'GET': [flavor_controller, 'index'],
'POST': [flavor_controller, 'create']
}),
('/flavors/detail', {
'GET': [flavor_controller, 'detail']
}),
('/flavors/{id}', {
'GET': [flavor_controller, 'show'],
'PUT': [flavor_controller, 'update'],
'DELETE': [flavor_controller, 'delete']
}),
('/flavors/{id}/action', {
'POST': [flavor_controller, 'action']
}),
('/flavors/{flavor_id}/os-extra_specs', {
'GET': [flavor_extraspec_controller, 'index'],
'POST': [flavor_extraspec_controller, 'create']
}),
('/flavors/{flavor_id}/os-extra_specs/{id}', {
'GET': [flavor_extraspec_controller, 'show'],
'PUT': [flavor_extraspec_controller, 'update'],
'DELETE': [flavor_extraspec_controller, 'delete']
}),
('/flavors/{flavor_id}/os-flavor-access', {
'GET': [flavor_access_controller, 'index']
}),
('/images', {
'GET': [images_controller, 'index']
}),
('/images/detail', {
'GET': [images_controller, 'detail'],
}),
('/images/{id}', {
'GET': [images_controller, 'show'],
'DELETE': [images_controller, 'delete']
}),
('/images/{image_id}/metadata', {
'GET': [image_metadata_controller, 'index'],
'POST': [image_metadata_controller, 'create'],
'PUT': [image_metadata_controller, 'update_all']
}),
('/images/{image_id}/metadata/{id}', {
'GET': [image_metadata_controller, 'show'],
'PUT': [image_metadata_controller, 'update'],
'DELETE': [image_metadata_controller, 'delete']
}),
('/limits', {
'GET': [limits_controller, 'index']
}),
('/os-agents', {
'GET': [agents_controller, 'index'],
'POST': [agents_controller, 'create']
}),
('/os-agents/{id}', {
'PUT': [agents_controller, 'update'],
'DELETE': [agents_controller, 'delete']
}),
('/os-aggregates', {
'GET': [aggregates_controller, 'index'],
'POST': [aggregates_controller, 'create']
}),
('/os-aggregates/{id}', {
'GET': [aggregates_controller, 'show'],
'PUT': [aggregates_controller, 'update'],
'DELETE': [aggregates_controller, 'delete']
}),
('/os-aggregates/{id}/action', {
'POST': [aggregates_controller, 'action'],
}),
('/os-aggregates/{id}/images', {
'POST': [aggregates_controller, 'images'],
}),
('/os-assisted-volume-snapshots', {
'POST': [assisted_volume_snapshots_controller, 'create']
}),
('/os-assisted-volume-snapshots/{id}', {
'DELETE': [assisted_volume_snapshots_controller, 'delete']
}),
('/os-availability-zone', {
'GET': [availability_zone_controller, 'index']
}),
('/os-availability-zone/detail', {
'GET': [availability_zone_controller, 'detail'],
}),
('/os-baremetal-nodes', {
'GET': [baremetal_nodes_controller, 'index'],
'POST': [baremetal_nodes_controller, 'create']
}),
('/os-baremetal-nodes/{id}', {
'GET': [baremetal_nodes_controller, 'show'],
'DELETE': [baremetal_nodes_controller, 'delete']
}),
('/os-baremetal-nodes/{id}/action', {
'POST': [baremetal_nodes_controller, 'action']
}),
('/os-cells', {
'POST': [cells_controller, 'create'],
'GET': [cells_controller, 'index'],
}),
('/os-cells/capacities', {
'GET': [cells_controller, 'capacities']
}),
('/os-cells/detail', {
'GET': [cells_controller, 'detail']
}),
('/os-cells/info', {
'GET': [cells_controller, 'info']
}),
('/os-cells/sync_instances', {
'POST': [cells_controller, 'sync_instances']
}),
('/os-cells/{id}', {
'GET': [cells_controller, 'show'],
'PUT': [cells_controller, 'update'],
'DELETE': [cells_controller, 'delete']
}),
('/os-cells/{id}/capacities', {
'GET': [cells_controller, 'capacities']
}),
('/os-certificates', {
'POST': [certificates_controller, 'create']
}),
('/os-certificates/{id}', {
'GET': [certificates_controller, 'show']
}),
('/os-cloudpipe', {
'GET': [cloudpipe_controller, 'index'],
'POST': [cloudpipe_controller, 'create']
}),
('/os-cloudpipe/{id}', {
'PUT': [cloudpipe_controller, 'update']
}),
('/os-console-auth-tokens/{id}', {
'GET': [console_auth_tokens_controller, 'show']
}),
('/os-fixed-ips/{id}', {
'GET': [fixed_ips_controller, 'show']
}),
('/os-fixed-ips/{id}/action', {
'POST': [fixed_ips_controller, 'action'],
}),
('/os-floating-ip-dns', {
'GET': [floating_ip_dns_controller, 'index']
}),
('/os-floating-ip-dns/{id}', {
'PUT': [floating_ip_dns_controller, 'update'],
'DELETE': [floating_ip_dns_controller, 'delete']
}),
('/os-floating-ip-dns/{domain_id}/entries/{id}', {
'GET': [floating_ip_dnsentry_controller, 'show'],
'PUT': [floating_ip_dnsentry_controller, 'update'],
'DELETE': [floating_ip_dnsentry_controller, 'delete']
}),
('/os-floating-ip-pools', {
'GET': [floating_ip_pools_controller, 'index'],
}),
('/os-floating-ips', {
'GET': [floating_ips_controller, 'index'],
'POST': [floating_ips_controller, 'create']
}),
('/os-floating-ips/{id}', {
'GET': [floating_ips_controller, 'show'],
'DELETE': [floating_ips_controller, 'delete']
}),
('/os-floating-ips-bulk', {
'GET': [floating_ips_bulk_controller, 'index'],
'POST': [floating_ips_bulk_controller, 'create']
}),
('/os-floating-ips-bulk/{id}', {
'GET': [floating_ips_bulk_controller, 'show'],
'PUT': [floating_ips_bulk_controller, 'update']
}),
('/os-fping', {
'GET': [fping_controller, 'index']
}),
('/os-fping/{id}', {
'GET': [fping_controller, 'show']
}),
('/os-hosts', {
'GET': [hosts_controller, 'index']
}),
('/os-hosts/{id}', {
'GET': [hosts_controller, 'show'],
'PUT': [hosts_controller, 'update']
}),
('/os-hosts/{id}/reboot', {
'GET': [hosts_controller, 'reboot']
}),
('/os-hosts/{id}/shutdown', {
'GET': [hosts_controller, 'shutdown']
}),
('/os-hosts/{id}/startup', {
'GET': [hosts_controller, 'startup']
}),
('/os-hypervisors', {
'GET': [hypervisors_controller, 'index']
}),
('/os-hypervisors/detail', {
'GET': [hypervisors_controller, 'detail']
}),
('/os-hypervisors/statistics', {
'GET': [hypervisors_controller, 'statistics']
}),
('/os-hypervisors/{id}', {
'GET': [hypervisors_controller, 'show']
}),
('/os-hypervisors/{id}/search', {
'GET': [hypervisors_controller, 'search']
}),
('/os-hypervisors/{id}/servers', {
'GET': [hypervisors_controller, 'servers']
}),
('/os-hypervisors/{id}/uptime', {
'GET': [hypervisors_controller, 'uptime']
}),
('/os-instance_usage_audit_log', {
'GET': [instance_usage_audit_log_controller, 'index']
}),
('/os-instance_usage_audit_log/{id}', {
'GET': [instance_usage_audit_log_controller, 'show']
}),
('/os-keypairs', {
'GET': [keypairs_controller, 'index'],
'POST': [keypairs_controller, 'create']
}),
('/os-keypairs/{id}', {
'GET': [keypairs_controller, 'show'],
'DELETE': [keypairs_controller, 'delete']
}),
('/os-migrations', {
'GET': [migrations_controller, 'index']
}),
('/os-networks', {
'GET': [networks_controller, 'index'],
'POST': [networks_controller, 'create']
}),
('/os-networks/add', {
'POST': [networks_controller, 'add']
}),
('/os-networks/{id}', {
'GET': [networks_controller, 'show'],
'DELETE': [networks_controller, 'delete']
}),
('/os-networks/{id}/action', {
'POST': [networks_controller, 'action'],
}),
('/os-quota-class-sets/{id}', {
'GET': [quota_classes_controller, 'show'],
'PUT': [quota_classes_controller, 'update']
}),
('/os-quota-sets/{id}', {
'GET': [quota_set_controller, 'show'],
'PUT': [quota_set_controller, 'update'],
'DELETE': [quota_set_controller, 'delete']
}),
('/os-quota-sets/{id}/detail', {
'GET': [quota_set_controller, 'detail']
}),
('/os-quota-sets/{id}/defaults', {
'GET': [quota_set_controller, 'defaults']
}),
('/os-security-group-default-rules', {
'GET': [security_group_default_rules_controller, 'index'],
'POST': [security_group_default_rules_controller, 'create']
}),
('/os-security-group-default-rules/{id}', {
'GET': [security_group_default_rules_controller, 'show'],
'DELETE': [security_group_default_rules_controller, 'delete']
}),
('/os-security-group-rules', {
'POST': [security_group_rules_controller, 'create']
}),
('/os-security-group-rules/{id}', {
'DELETE': [security_group_rules_controller, 'delete']
}),
('/os-security-groups', {
'GET': [security_group_controller, 'index'],
'POST': [security_group_controller, 'create']
}),
('/os-security-groups/{id}', {
'GET': [security_group_controller, 'show'],
'PUT': [security_group_controller, 'update'],
'DELETE': [security_group_controller, 'delete']
}),
('/os-server-external-events', {
'POST': [server_external_events_controller, 'create']
}),
('/os-server-groups', {
'GET': [server_groups_controller, 'index'],
'POST': [server_groups_controller, 'create']
}),
('/os-server-groups/{id}', {
'GET': [server_groups_controller, 'show'],
'DELETE': [server_groups_controller, 'delete']
}),
('/os-services', {
'GET': [services_controller, 'index']
}),
('/os-services/{id}', {
'PUT': [services_controller, 'update'],
'DELETE': [services_controller, 'delete']
}),
('/os-simple-tenant-usage', {
'GET': [simple_tenant_usage_controller, 'index']
}),
('/os-simple-tenant-usage/{id}', {
'GET': [simple_tenant_usage_controller, 'show']
}),
('/os-snapshots', {
'GET': [snapshots_controller, 'index'],
'POST': [snapshots_controller, 'create']
}),
('/os-snapshots/detail', {
'GET': [snapshots_controller, 'detail']
}),
('/os-snapshots/{id}', {
'GET': [snapshots_controller, 'show'],
'DELETE': [snapshots_controller, 'delete']
}),
('/os-tenant-networks', {
'GET': [tenant_networks_controller, 'index'],
'POST': [tenant_networks_controller, 'create']
}),
('/os-tenant-networks/{id}', {
'GET': [tenant_networks_controller, 'show'],
'DELETE': [tenant_networks_controller, 'delete']
}),
('/os-volumes', {
'GET': [volumes_controller, 'index'],
'POST': [volumes_controller, 'create'],
}),
('/os-volumes/detail', {
'GET': [volumes_controller, 'detail'],
}),
('/os-volumes/{id}', {
'GET': [volumes_controller, 'show'],
'DELETE': [volumes_controller, 'delete']
}),
# NOTE: '/os-volumes_boot' is a clone of '/servers'. We may want to
# deprecate it in the future.
('/os-volumes_boot', {
'GET': [server_controller, 'index'],
'POST': [server_controller, 'create']
}),
('/os-volumes_boot/detail', {
'GET': [server_controller, 'detail']
}),
('/os-volumes_boot/{id}', {
'GET': [server_controller, 'show'],
'PUT': [server_controller, 'update'],
'DELETE': [server_controller, 'delete']
}),
('/os-volumes_boot/{id}/action', {
'POST': [server_controller, 'action']
}),
('/servers', {
'GET': [server_controller, 'index'],
'POST': [server_controller, 'create']
}),
('/servers/detail', {
'GET': [server_controller, 'detail']
}),
('/servers/{id}', {
'GET': [server_controller, 'show'],
'PUT': [server_controller, 'update'],
'DELETE': [server_controller, 'delete']
}),
('/servers/{id}/action', {
'POST': [server_controller, 'action']
}),
('/servers/{server_id}/consoles', {
'GET': [consoles_controller, 'index'],
'POST': [consoles_controller, 'create']
}),
('/servers/{server_id}/consoles/{id}', {
'GET': [consoles_controller, 'show'],
'DELETE': [consoles_controller, 'delete']
}),
('/servers/{server_id}/diagnostics', {
'GET': [server_diagnostics_controller, 'index']
}),
('/servers/{server_id}/ips', {
'GET': [ips_controller, 'index']
}),
('/servers/{server_id}/ips/{id}', {
'GET': [ips_controller, 'show']
}),
('/servers/{server_id}/metadata', {
'GET': [server_metadata_controller, 'index'],
'POST': [server_metadata_controller, 'create'],
'PUT': [server_metadata_controller, 'update_all'],
}),
('/servers/{server_id}/metadata/{id}', {
'GET': [server_metadata_controller, 'show'],
'PUT': [server_metadata_controller, 'update'],
'DELETE': [server_metadata_controller, 'delete'],
}),
('/servers/{server_id}/migrations', {
'GET': [server_migrations_controller, 'index']
}),
('/servers/{server_id}/migrations/{id}', {
'GET': [server_migrations_controller, 'show'],
'DELETE': [server_migrations_controller, 'delete']
}),
('/servers/{server_id}/migrations/{id}/action', {
'POST': [server_migrations_controller, 'action']
}),
('/servers/{server_id}/os-instance-actions', {
'GET': [instance_actions_controller, 'index']
}),
('/servers/{server_id}/os-instance-actions/{id}', {
'GET': [instance_actions_controller, 'show']
}),
('/servers/{server_id}/os-interface', {
'GET': [server_os_interface_controller, 'index'],
'POST': [server_os_interface_controller, 'create']
}),
('/servers/{server_id}/os-interface/{id}', {
'GET': [server_os_interface_controller, 'show'],
'DELETE': [server_os_interface_controller, 'delete']
}),
('/servers/{server_id}/os-server-password', {
'GET': [server_password_controller, 'index'],
'DELETE': [server_password_controller, 'clear']
}),
('/servers/{server_id}/os-virtual-interfaces', {
'GET': [virtual_interfaces_controller, 'index']
}),
('/servers/{server_id}/os-volume_attachments', {
'GET': [server_volume_attachments_controller, 'index'],
'POST': [server_volume_attachments_controller, 'create'],
}),
('/servers/{server_id}/os-volume_attachments/{id}', {
'GET': [server_volume_attachments_controller, 'show'],
'PUT': [server_volume_attachments_controller, 'update'],
'DELETE': [server_volume_attachments_controller, 'delete']
}),
('/servers/{server_id}/remote-consoles', {
'POST': [server_remote_consoles_controller, 'create']
}),
('/servers/{server_id}/os-security-groups', {
'GET': [server_security_groups_controller, 'index']
}),
('/servers/{server_id}/shares', {
'GET': [server_shares_controller, 'index'],
'POST': [server_shares_controller, 'create'],
}),
('/servers/{server_id}/shares/{id}', {
'GET': [server_shares_controller, 'show'],
'DELETE': [server_shares_controller, 'delete'],
}),
('/servers/{server_id}/tags', {
'GET': [server_tags_controller, 'index'],
'PUT': [server_tags_controller, 'update_all'],
'DELETE': [server_tags_controller, 'delete_all'],
}),
('/servers/{server_id}/tags/{id}', {
'GET': [server_tags_controller, 'show'],
'PUT': [server_tags_controller, 'update'],
'DELETE': [server_tags_controller, 'delete']
}),
('/servers/{server_id}/topology', {
'GET': [server_topology_controller, 'index']
}),
)
class APIRouterV21(base_wsgi.Router):
"""Routes requests on the OpenStack API to the appropriate controller
and method. The URL mapping based on the plain list `ROUTE_LIST` is built
at here.
"""
def __init__(self, custom_routes=None):
""":param custom_routes: the additional routes can be added by this
parameter. This parameter is used to test on some fake routes
primarily.
"""
super(APIRouterV21, self).__init__(nova.api.openstack.ProjectMapper())
if custom_routes is None:
custom_routes = tuple()
for path, methods in ROUTE_LIST + custom_routes:
# NOTE(alex_xu): The variable 'methods' is a dict in normal, since
# the dict includes all the methods supported in the path. But
# if the variable 'method' is a string, it means a redirection.
# For example, the request to the '' will be redirect to the '/' in
# the Nova API. To indicate that, using the target path instead of
# a dict. The route entry just writes as "('', '/)".
if isinstance(methods, str):
self.map.redirect(path, methods)
continue
for method, controller_info in methods.items():
# TODO(alex_xu): In the end, I want to create single controller
# instance instead of create controller instance for each
# route.
controller = controller_info[0]()
action = controller_info[1]
self.map.create_route(path, method, controller, action)
@classmethod
def factory(cls, global_config, **local_config):
"""Simple paste factory.
:class:`nova.api.wsgi.Router` doesn't have one.
"""
return cls()