54
54
# edf532db: Add logic to store the config drive passed by Nova
56
56
# v1.1: API at the point in time when microversioning support was added
57
MIN_VER = base.Version({base.Version.string: "1.1"})
59
59
# v1.2: Renamed NOSTATE ("None") to AVAILABLE ("available")
60
60
# v1.3: Add node.driver_internal_info
61
61
# v1.4: Add MANAGEABLE state
62
MAX_VER = base.Version({base.Version.string: "1.4"})
62
# v1.5: Add logical node names
63
# v1.6: Add INSPECT* states
67
MIN_VER = base.Version({base.Version.string: MIN_VER_STR},
68
MIN_VER_STR, MAX_VER_STR)
69
MAX_VER = base.Version({base.Version.string: MAX_VER_STR},
70
MIN_VER_STR, MAX_VER_STR)
65
73
class MediaType(base.APIBase):
108
116
'developer/ironic/dev',
109
117
'api-spec-v1.html',
110
118
bookmark=True, type='text/html')
112
120
v1.media_types = [MediaType('application/json',
113
121
'application/vnd.openstack.ironic.v1+json')]
114
122
v1.chassis = [link.Link.make_link('self', pecan.request.host_url,
117
125
pecan.request.host_url,
121
129
v1.nodes = [link.Link.make_link('self', pecan.request.host_url,
123
131
link.Link.make_link('bookmark',
124
132
pecan.request.host_url,
128
136
v1.ports = [link.Link.make_link('self', pecan.request.host_url,
130
138
link.Link.make_link('bookmark',
131
139
pecan.request.host_url,
135
143
v1.drivers = [link.Link.make_link('self', pecan.request.host_url,
137
145
link.Link.make_link('bookmark',
138
146
pecan.request.host_url,
157
165
# the request object to make the links.
158
166
return V1.convert()
160
def _check_version(self, version):
168
def _check_version(self, version, headers=None):
161
171
# ensure that major version in the URL matches the header
162
172
if version.major != BASE_VERSION:
163
173
raise exc.HTTPNotAcceptable(_(
164
174
"Mutually exclusive versions requested. Version %(ver)s "
165
"requested but not supported by this service.")
175
"requested but not supported by this service. The supported "
176
"version range is: [%(min)s, %(max)s].") % {'ver': version,
177
'min': MIN_VER_STR, 'max': MAX_VER_STR}, headers=headers)
167
178
# ensure the minor version is within the supported range
168
179
if version < MIN_VER or version > MAX_VER:
169
180
raise exc.HTTPNotAcceptable(_(
170
"Unsupported minor version requested. This API service "
171
"supports the following version range: "
172
"[%(min)s, %(max)s].") % {'min': MIN_VER,
181
"Version %(ver)s was requested but the minor version is not "
182
"supported by this service. The supported version range is: "
183
"[%(min)s, %(max)s].") % {'ver': version, 'min': MIN_VER_STR,
184
'max': MAX_VER_STR}, headers=headers)
176
187
def _route(self, args):
177
v = base.Version(pecan.request.headers)
188
v = base.Version(pecan.request.headers, MIN_VER_STR, MAX_VER_STR)
178
190
# Always set the min and max headers
179
# FIXME: these are not being sent if _check_version raises an exception
180
pecan.response.headers[base.Version.min_string] = str(MIN_VER)
181
pecan.response.headers[base.Version.max_string] = str(MAX_VER)
191
pecan.response.headers[base.Version.min_string] = MIN_VER_STR
192
pecan.response.headers[base.Version.max_string] = MAX_VER_STR
183
194
# assert that requested version is supported
184
self._check_version(v)
195
self._check_version(v, pecan.response.headers)
185
196
pecan.response.headers[base.Version.string] = str(v)
186
197
pecan.request.version = v