40
40
from nova.api.openstack import server_metadata
41
41
from nova.api.openstack import shared_ip_groups
42
42
from nova.api.openstack import users
43
from nova.api.openstack import versions
43
44
from nova.api.openstack import wsgi
44
45
from nova.api.openstack import zones
49
50
flags.DEFINE_bool('allow_admin_api',
51
52
'When True, this API service will accept admin operations.')
53
flags.DEFINE_bool('allow_instance_snapshots',
55
'When True, this API service will permit instance snapshot operations.')
54
58
class FaultWrapper(base_wsgi.Middleware):
64
68
return faults.Fault(exc)
71
class ProjectMapper(routes.Mapper):
73
def resource(self, member_name, collection_name, **kwargs):
74
if not ('parent_resource' in kwargs):
75
kwargs['path_prefix'] = '{project_id}/'
77
parent_resource = kwargs['parent_resource']
78
p_collection = parent_resource['collection_name']
79
p_member = parent_resource['member_name']
80
kwargs['path_prefix'] = '{project_id}/%s/:%s_id' % (p_collection,
82
routes.Mapper.resource(self, member_name,
67
87
class APIRouter(base_wsgi.Router):
69
89
Routes requests on the OpenStack API to the appropriate controller
78
98
def __init__(self, ext_mgr=None):
79
99
self.server_members = {}
80
mapper = routes.Mapper()
100
mapper = self._mapper()
81
101
self._setup_routes(mapper)
82
102
super(APIRouter, self).__init__(mapper)
84
def _setup_routes(self, mapper, version):
105
return routes.Mapper()
107
def _setup_routes(self, mapper):
108
raise NotImplementedError(_("You must implement _setup_routes."))
110
def _setup_base_routes(self, mapper, version):
85
111
"""Routes common to all versions."""
87
113
server_members = self.server_members
96
122
server_members['suspend'] = 'POST'
97
123
server_members['resume'] = 'POST'
98
124
server_members['rescue'] = 'POST'
125
server_members['migrate'] = 'POST'
99
126
server_members['unrescue'] = 'POST'
100
127
server_members['reset_network'] = 'POST'
101
128
server_members['inject_network_info'] = 'POST'
115
142
'select': 'POST',
145
mapper.connect("versions", "/",
146
controller=versions.create_resource(version),
118
149
mapper.resource("console", "consoles",
119
150
controller=consoles.create_resource(),
120
151
parent_resource=dict(member_name='server',
147
178
"""Define routes specific to OpenStack API V1.0."""
149
180
def _setup_routes(self, mapper):
150
super(APIRouterV10, self)._setup_routes(mapper, '1.0')
181
self._setup_base_routes(mapper, '1.0')
152
183
mapper.resource("shared_ip_group", "shared_ip_groups",
153
184
collection={'detail': 'GET'},
162
193
class APIRouterV11(APIRouter):
163
194
"""Define routes specific to OpenStack API V1.1."""
197
return ProjectMapper()
165
199
def _setup_routes(self, mapper):
166
super(APIRouterV11, self)._setup_routes(mapper, '1.1')
200
self._setup_base_routes(mapper, '1.1')
167
202
image_metadata_controller = image_metadata.create_resource()
168
204
mapper.resource("image_meta", "metadata",
169
205
controller=image_metadata_controller,
170
206
parent_resource=dict(member_name='image',
171
207
collection_name='images'))
173
mapper.connect("metadata", "/images/{image_id}/metadata",
209
mapper.connect("metadata", "/{project_id}/images/{image_id}/metadata",
174
210
controller=image_metadata_controller,
175
211
action='update_all',
176
212
conditions={"method": ['PUT']})
178
mapper.resource("server_meta", "meta",
179
controller=server_metadata.create_resource(),
214
server_metadata_controller = server_metadata.create_resource()
216
mapper.resource("server_meta", "metadata",
217
controller=server_metadata_controller,
180
218
parent_resource=dict(member_name='server',
181
219
collection_name='servers'))
221
mapper.connect("metadata",
222
"/{project_id}/servers/{server_id}/metadata",
223
controller=server_metadata_controller,
225
conditions={"method": ['PUT']})