blob: 031435621e625148e9ec3768b5d3eb4a7a7a02b9 [file] [log] [blame]
Matthew Treinish9e26ca82016-02-23 11:43:20 -05001# Copyright 2012 OpenStack Foundation
2# Copyright 2013 Hewlett-Packard Development Company, L.P.
Felipe Monteiro7c95bef2017-02-17 18:49:02 -05003# Copyright 2017 AT&T Corp.
Matthew Treinish9e26ca82016-02-23 11:43:20 -05004# All Rights Reserved.
5#
6# Licensed under the Apache License, Version 2.0 (the "License"); you may
7# not use this file except in compliance with the License. You may obtain
8# a copy of the License at
9#
10# http://www.apache.org/licenses/LICENSE-2.0
11#
12# Unless required by applicable law or agreed to in writing, software
13# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
14# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
15# License for the specific language governing permissions and limitations
16# under the License.
17
18import copy
19
20from oslo_serialization import jsonutils as json
21from six.moves.urllib import parse as urllib
22
zwhe3beb6cf2017-02-09 16:59:41 +080023from tempest.lib.api_schema.response.compute.v2_1 import \
24 security_groups as security_groups_schema
Matthew Treinish9e26ca82016-02-23 11:43:20 -050025from tempest.lib.api_schema.response.compute.v2_1 import servers as schema
Eli Qiaoe07eacc2016-03-03 13:49:37 +080026from tempest.lib.api_schema.response.compute.v2_16 import servers as schemav216
lanoux2746ba02016-03-16 17:41:01 +090027from tempest.lib.api_schema.response.compute.v2_19 import servers as schemav219
Matt Riedemann3e4a46a2016-07-27 14:41:32 -040028from tempest.lib.api_schema.response.compute.v2_26 import servers as schemav226
Eli Qiaoe07eacc2016-03-03 13:49:37 +080029from tempest.lib.api_schema.response.compute.v2_3 import servers as schemav23
Sergey Nikitin8654e5b2017-06-04 22:09:56 +040030from tempest.lib.api_schema.response.compute.v2_47 import servers as schemav247
Sergey Nikitin0cb4f222017-02-03 13:16:33 +040031from tempest.lib.api_schema.response.compute.v2_48 import servers as schemav248
ghanshyam85a4b0a2018-04-24 11:09:25 +030032from tempest.lib.api_schema.response.compute.v2_54 import servers as schemav254
Ghanshyamd5394652018-04-26 07:59:32 +000033from tempest.lib.api_schema.response.compute.v2_57 import servers as schemav257
Markus Zoeller69d58b82017-02-17 10:09:22 +010034from tempest.lib.api_schema.response.compute.v2_6 import servers as schemav26
Jackie Truong1fa44642017-10-25 16:42:08 -040035from tempest.lib.api_schema.response.compute.v2_63 import servers as schemav263
lanoux2746ba02016-03-16 17:41:01 +090036from tempest.lib.api_schema.response.compute.v2_9 import servers as schemav29
Matthew Treinish9e26ca82016-02-23 11:43:20 -050037from tempest.lib.common import rest_client
Ghanshyamee9af302016-02-25 06:12:43 +090038from tempest.lib.services.compute import base_compute_client
Matthew Treinish9e26ca82016-02-23 11:43:20 -050039
40
Ghanshyamee9af302016-02-25 06:12:43 +090041class ServersClient(base_compute_client.BaseComputeClient):
Ken'ichi Ohmichiaca816d2017-01-27 15:12:17 -080042 """Service client for the resource /servers"""
43
lanoux2746ba02016-03-16 17:41:01 +090044 schema_versions_info = [
Eli Qiaoe07eacc2016-03-03 13:49:37 +080045 {'min': None, 'max': '2.2', 'schema': schema},
Markus Zoeller69d58b82017-02-17 10:09:22 +010046 {'min': '2.3', 'max': '2.5', 'schema': schemav23},
47 {'min': '2.6', 'max': '2.8', 'schema': schemav26},
Eli Qiaoe07eacc2016-03-03 13:49:37 +080048 {'min': '2.9', 'max': '2.15', 'schema': schemav29},
49 {'min': '2.16', 'max': '2.18', 'schema': schemav216},
Matt Riedemann3e4a46a2016-07-27 14:41:32 -040050 {'min': '2.19', 'max': '2.25', 'schema': schemav219},
Sergey Nikitin8654e5b2017-06-04 22:09:56 +040051 {'min': '2.26', 'max': '2.46', 'schema': schemav226},
Sergey Nikitin0cb4f222017-02-03 13:16:33 +040052 {'min': '2.47', 'max': '2.47', 'schema': schemav247},
ghanshyam85a4b0a2018-04-24 11:09:25 +030053 {'min': '2.48', 'max': '2.53', 'schema': schemav248},
Ghanshyamd5394652018-04-26 07:59:32 +000054 {'min': '2.54', 'max': '2.56', 'schema': schemav254},
Jackie Truong1fa44642017-10-25 16:42:08 -040055 {'min': '2.57', 'max': '2.62', 'schema': schemav257},
56 {'min': '2.63', 'max': None, 'schema': schemav263}]
Matthew Treinish9e26ca82016-02-23 11:43:20 -050057
58 def __init__(self, auth_provider, service, region,
59 enable_instance_password=True, **kwargs):
60 super(ServersClient, self).__init__(
61 auth_provider, service, region, **kwargs)
62 self.enable_instance_password = enable_instance_password
63
64 def create_server(self, **kwargs):
65 """Create server.
66
Ken'ichi Ohmichid9bafc02016-09-09 09:35:21 -070067 For a full list of available parameters, please refer to the official
68 API reference:
69 http://developer.openstack.org/api-ref/compute/#create-server
70
71 :param name: Server name
72 :param imageRef: Image reference (UUID)
73 :param flavorRef: Flavor reference (UUID or full URL)
Matthew Treinish9e26ca82016-02-23 11:43:20 -050074
75 Most parameters except the following are passed to the API without
76 any changes.
77 :param disk_config: The name is changed to OS-DCF:diskConfig
78 :param scheduler_hints: The name is changed to os:scheduler_hints and
79 the parameter is set in the same level as the parameter 'server'.
80 """
81 body = copy.deepcopy(kwargs)
82 if body.get('disk_config'):
83 body['OS-DCF:diskConfig'] = body.pop('disk_config')
84
85 hints = None
86 if body.get('scheduler_hints'):
87 hints = {'os:scheduler_hints': body.pop('scheduler_hints')}
88
89 post_body = {'server': body}
90
91 if hints:
Jordan Pittier81c427d2016-04-25 17:02:58 +020092 post_body.update(hints)
Matthew Treinish9e26ca82016-02-23 11:43:20 -050093
94 post_body = json.dumps(post_body)
95 resp, body = self.post('servers', post_body)
96
97 body = json.loads(body)
98 # NOTE(maurosr): this deals with the case of multiple server create
99 # with return reservation id set True
100 if 'reservation_id' in body:
101 return rest_client.ResponseBody(resp, body)
102 if self.enable_instance_password:
103 create_schema = schema.create_server_with_admin_pass
104 else:
105 create_schema = schema.create_server
106 self.validate_response(create_schema, resp, body)
107 return rest_client.ResponseBody(resp, body)
108
109 def update_server(self, server_id, **kwargs):
110 """Update server.
111
Dong Mad12c2332016-10-19 01:36:27 -0700112 For a full list of available parameters, please refer to the official
113 API reference:
zhufl01ae8db2017-03-08 10:50:51 +0800114 https://developer.openstack.org/api-ref/compute/#update-server
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500115
116 Most parameters except the following are passed to the API without
117 any changes.
118 :param disk_config: The name is changed to OS-DCF:diskConfig
119 """
ghanshyam910022e2016-12-21 13:32:57 +0900120 if 'disk_config' in kwargs:
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500121 kwargs['OS-DCF:diskConfig'] = kwargs.pop('disk_config')
122
123 post_body = json.dumps({'server': kwargs})
124 resp, body = self.put("servers/%s" % server_id, post_body)
125 body = json.loads(body)
lanoux2746ba02016-03-16 17:41:01 +0900126 schema = self.get_schema(self.schema_versions_info)
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500127 self.validate_response(schema.update_server, resp, body)
128 return rest_client.ResponseBody(resp, body)
129
130 def show_server(self, server_id):
Lv Fumei7e326332016-07-08 15:18:03 +0800131 """Get server details.
132
Dong Mad12c2332016-10-19 01:36:27 -0700133 For a full list of available parameters, please refer to the official
134 API reference:
zhufl94337052018-01-22 17:10:29 +0800135 https://developer.openstack.org/api-ref/compute/#show-server-details
Lv Fumei7e326332016-07-08 15:18:03 +0800136 """
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500137 resp, body = self.get("servers/%s" % server_id)
138 body = json.loads(body)
lanoux2746ba02016-03-16 17:41:01 +0900139 schema = self.get_schema(self.schema_versions_info)
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500140 self.validate_response(schema.get_server, resp, body)
141 return rest_client.ResponseBody(resp, body)
142
143 def delete_server(self, server_id):
Lv Fumei7e326332016-07-08 15:18:03 +0800144 """Delete server.
145
Dong Mad12c2332016-10-19 01:36:27 -0700146 For a full list of available parameters, please refer to the official
147 API reference:
zhufl01ae8db2017-03-08 10:50:51 +0800148 https://developer.openstack.org/api-ref/compute/#delete-server
Lv Fumei7e326332016-07-08 15:18:03 +0800149 """
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500150 resp, body = self.delete("servers/%s" % server_id)
151 self.validate_response(schema.delete_server, resp, body)
152 return rest_client.ResponseBody(resp, body)
153
154 def list_servers(self, detail=False, **params):
155 """List servers.
156
Dong Mad12c2332016-10-19 01:36:27 -0700157 For a full list of available parameters, please refer to the official
158 API reference:
zhufl01ae8db2017-03-08 10:50:51 +0800159 https://developer.openstack.org/api-ref/compute/#list-servers
160 https://developer.openstack.org/api-ref/compute/#list-servers-detailed
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500161 """
162
163 url = 'servers'
lanoux2746ba02016-03-16 17:41:01 +0900164 schema = self.get_schema(self.schema_versions_info)
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500165 if detail:
166 url += '/detail'
167 _schema = schema.list_servers_detail
ghanshyama8ace722018-04-20 08:45:10 +0000168 else:
169 _schema = schema.list_servers
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500170 if params:
171 url += '?%s' % urllib.urlencode(params)
172
173 resp, body = self.get(url)
174 body = json.loads(body)
175 self.validate_response(_schema, resp, body)
176 return rest_client.ResponseBody(resp, body)
177
178 def list_addresses(self, server_id):
Lv Fumei7e326332016-07-08 15:18:03 +0800179 """Lists all addresses for a server.
180
Dong Mad12c2332016-10-19 01:36:27 -0700181 For a full list of available parameters, please refer to the official
182 API reference:
zhufl01ae8db2017-03-08 10:50:51 +0800183 https://developer.openstack.org/api-ref/compute/#list-ips
Lv Fumei7e326332016-07-08 15:18:03 +0800184 """
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500185 resp, body = self.get("servers/%s/ips" % server_id)
186 body = json.loads(body)
187 self.validate_response(schema.list_addresses, resp, body)
188 return rest_client.ResponseBody(resp, body)
189
190 def list_addresses_by_network(self, server_id, network_id):
191 """Lists all addresses of a specific network type for a server."""
192 resp, body = self.get("servers/%s/ips/%s" %
193 (server_id, network_id))
194 body = json.loads(body)
195 self.validate_response(schema.list_addresses_by_network, resp, body)
196 return rest_client.ResponseBody(resp, body)
197
198 def action(self, server_id, action_name,
199 schema=schema.server_actions_common_schema,
200 **kwargs):
201 post_body = json.dumps({action_name: kwargs})
202 resp, body = self.post('servers/%s/action' % server_id,
203 post_body)
204 if body:
205 body = json.loads(body)
206 self.validate_response(schema, resp, body)
207 return rest_client.ResponseBody(resp, body)
208
209 def create_backup(self, server_id, **kwargs):
210 """Backup a server instance.
211
Dong Mad12c2332016-10-19 01:36:27 -0700212 For a full list of available parameters, please refer to the official
213 API reference:
zhufl01ae8db2017-03-08 10:50:51 +0800214 https://developer.openstack.org/api-ref/compute/#create-server-back-up-createbackup-action
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500215 """
216 return self.action(server_id, "createBackup", **kwargs)
217
218 def change_password(self, server_id, **kwargs):
219 """Change the root password for the server.
220
Dong Mad12c2332016-10-19 01:36:27 -0700221 For a full list of available parameters, please refer to the official
222 API reference:
zhufl01ae8db2017-03-08 10:50:51 +0800223 https://developer.openstack.org/api-ref/compute/#change-administrative-password-changepassword-action
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500224 """
225 return self.action(server_id, 'changePassword', **kwargs)
226
227 def show_password(self, server_id):
228 resp, body = self.get("servers/%s/os-server-password" %
229 server_id)
230 body = json.loads(body)
231 self.validate_response(schema.show_password, resp, body)
232 return rest_client.ResponseBody(resp, body)
233
234 def delete_password(self, server_id):
235 """Removes the encrypted server password from the metadata server
236
237 Note that this does not actually change the instance server
238 password.
239 """
240 resp, body = self.delete("servers/%s/os-server-password" %
241 server_id)
242 self.validate_response(schema.server_actions_delete_password,
243 resp, body)
244 return rest_client.ResponseBody(resp, body)
245
246 def reboot_server(self, server_id, **kwargs):
247 """Reboot a server.
248
Dong Mad12c2332016-10-19 01:36:27 -0700249 For a full list of available parameters, please refer to the official
250 API reference:
zhufl01ae8db2017-03-08 10:50:51 +0800251 https://developer.openstack.org/api-ref/compute/#reboot-server-reboot-action
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500252 """
253 return self.action(server_id, 'reboot', **kwargs)
254
255 def rebuild_server(self, server_id, image_ref, **kwargs):
256 """Rebuild a server with a new image.
257
Dong Mad12c2332016-10-19 01:36:27 -0700258 For a full list of available parameters, please refer to the official
259 API reference:
zhufl01ae8db2017-03-08 10:50:51 +0800260 https://developer.openstack.org/api-ref/compute/#rebuild-server-rebuild-action
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500261
262 Most parameters except the following are passed to the API without
263 any changes.
264 :param disk_config: The name is changed to OS-DCF:diskConfig
265 """
266 kwargs['imageRef'] = image_ref
267 if 'disk_config' in kwargs:
268 kwargs['OS-DCF:diskConfig'] = kwargs.pop('disk_config')
lanoux2746ba02016-03-16 17:41:01 +0900269 schema = self.get_schema(self.schema_versions_info)
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500270 if self.enable_instance_password:
271 rebuild_schema = schema.rebuild_server_with_admin_pass
272 else:
273 rebuild_schema = schema.rebuild_server
274 return self.action(server_id, 'rebuild',
275 rebuild_schema, **kwargs)
276
277 def resize_server(self, server_id, flavor_ref, **kwargs):
278 """Change the flavor of a server.
279
Dong Mad12c2332016-10-19 01:36:27 -0700280 For a full list of available parameters, please refer to the official
281 API reference:
zhufl01ae8db2017-03-08 10:50:51 +0800282 https://developer.openstack.org/api-ref/compute/#resize-server-resize-action
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500283
284 Most parameters except the following are passed to the API without
285 any changes.
286 :param disk_config: The name is changed to OS-DCF:diskConfig
287 """
288 kwargs['flavorRef'] = flavor_ref
289 if 'disk_config' in kwargs:
290 kwargs['OS-DCF:diskConfig'] = kwargs.pop('disk_config')
291 return self.action(server_id, 'resize', **kwargs)
292
293 def confirm_resize_server(self, server_id, **kwargs):
294 """Confirm the flavor change for a server.
295
Dong Mad12c2332016-10-19 01:36:27 -0700296 For a full list of available parameters, please refer to the official
297 API reference:
zhufl01ae8db2017-03-08 10:50:51 +0800298 https://developer.openstack.org/api-ref/compute/#confirm-resized-server-confirmresize-action
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500299 """
300 return self.action(server_id, 'confirmResize',
301 schema.server_actions_confirm_resize,
302 **kwargs)
303
304 def revert_resize_server(self, server_id, **kwargs):
305 """Revert a server back to its original flavor.
306
Dong Mad12c2332016-10-19 01:36:27 -0700307 For a full list of available parameters, please refer to the official
308 API reference:
zhufl01ae8db2017-03-08 10:50:51 +0800309 https://developer.openstack.org/api-ref/compute/#revert-resized-server-revertresize-action
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500310 """
311 return self.action(server_id, 'revertResize', **kwargs)
312
313 def list_server_metadata(self, server_id):
Lv Fumei7e326332016-07-08 15:18:03 +0800314 """Lists all metadata for a server.
315
Dong Mad12c2332016-10-19 01:36:27 -0700316 For a full list of available parameters, please refer to the official
317 API reference:
zhufl01ae8db2017-03-08 10:50:51 +0800318 https://developer.openstack.org/api-ref/compute/#list-all-metadata
Lv Fumei7e326332016-07-08 15:18:03 +0800319 """
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500320 resp, body = self.get("servers/%s/metadata" % server_id)
321 body = json.loads(body)
322 self.validate_response(schema.list_server_metadata, resp, body)
323 return rest_client.ResponseBody(resp, body)
324
325 def set_server_metadata(self, server_id, meta, no_metadata_field=False):
Lv Fumei7e326332016-07-08 15:18:03 +0800326 """Sets one or more metadata items for a server.
327
Dong Mad12c2332016-10-19 01:36:27 -0700328 For a full list of available parameters, please refer to the official
329 API reference:
zhufl94337052018-01-22 17:10:29 +0800330 https://developer.openstack.org/api-ref/compute/#replace-metadata-items
Lv Fumei7e326332016-07-08 15:18:03 +0800331 """
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500332 if no_metadata_field:
333 post_body = ""
334 else:
335 post_body = json.dumps({'metadata': meta})
336 resp, body = self.put('servers/%s/metadata' % server_id,
337 post_body)
338 body = json.loads(body)
339 self.validate_response(schema.set_server_metadata, resp, body)
340 return rest_client.ResponseBody(resp, body)
341
342 def update_server_metadata(self, server_id, meta):
Lv Fumei7e326332016-07-08 15:18:03 +0800343 """Updates one or more metadata items for a server.
344
Dong Mad12c2332016-10-19 01:36:27 -0700345 For a full list of available parameters, please refer to the official
346 API reference:
zhufl94337052018-01-22 17:10:29 +0800347 https://developer.openstack.org/api-ref/compute/#create-or-update-metadata-items
Lv Fumei7e326332016-07-08 15:18:03 +0800348 """
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500349 post_body = json.dumps({'metadata': meta})
350 resp, body = self.post('servers/%s/metadata' % server_id,
351 post_body)
352 body = json.loads(body)
353 self.validate_response(schema.update_server_metadata,
354 resp, body)
355 return rest_client.ResponseBody(resp, body)
356
357 def show_server_metadata_item(self, server_id, key):
Lv Fumei7e326332016-07-08 15:18:03 +0800358 """Shows details for a metadata item, by key, for a server.
359
Dong Mad12c2332016-10-19 01:36:27 -0700360 For a full list of available parameters, please refer to the official
361 API reference:
zhufl01ae8db2017-03-08 10:50:51 +0800362 https://developer.openstack.org/api-ref/compute/#show-metadata-item-details
Lv Fumei7e326332016-07-08 15:18:03 +0800363 """
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500364 resp, body = self.get("servers/%s/metadata/%s" % (server_id, key))
365 body = json.loads(body)
366 self.validate_response(schema.set_show_server_metadata_item,
367 resp, body)
368 return rest_client.ResponseBody(resp, body)
369
370 def set_server_metadata_item(self, server_id, key, meta):
Lv Fumei7e326332016-07-08 15:18:03 +0800371 """Sets a metadata item, by key, for a server.
372
Dong Mad12c2332016-10-19 01:36:27 -0700373 For a full list of available parameters, please refer to the official
374 API reference:
zhufl01ae8db2017-03-08 10:50:51 +0800375 https://developer.openstack.org/api-ref/compute/#create-or-update-metadata-item
Lv Fumei7e326332016-07-08 15:18:03 +0800376 """
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500377 post_body = json.dumps({'meta': meta})
378 resp, body = self.put('servers/%s/metadata/%s' % (server_id, key),
379 post_body)
380 body = json.loads(body)
381 self.validate_response(schema.set_show_server_metadata_item,
382 resp, body)
383 return rest_client.ResponseBody(resp, body)
384
385 def delete_server_metadata_item(self, server_id, key):
Lv Fumei7e326332016-07-08 15:18:03 +0800386 """Deletes a metadata item, by key, from a server.
387
Dong Mad12c2332016-10-19 01:36:27 -0700388 For a full list of available parameters, please refer to the official
389 API reference:
zhufl01ae8db2017-03-08 10:50:51 +0800390 https://developer.openstack.org/api-ref/compute/#delete-metadata-item
Lv Fumei7e326332016-07-08 15:18:03 +0800391 """
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500392 resp, body = self.delete("servers/%s/metadata/%s" %
393 (server_id, key))
394 self.validate_response(schema.delete_server_metadata_item,
395 resp, body)
396 return rest_client.ResponseBody(resp, body)
397
398 def stop_server(self, server_id, **kwargs):
Lv Fumei7e326332016-07-08 15:18:03 +0800399 """Stops a running server and changes its status to SHUTOFF.
400
Dong Mad12c2332016-10-19 01:36:27 -0700401 For a full list of available parameters, please refer to the official
402 API reference:
zhufl01ae8db2017-03-08 10:50:51 +0800403 https://developer.openstack.org/api-ref/compute/#stop-server-os-stop-action
Lv Fumei7e326332016-07-08 15:18:03 +0800404 """
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500405 return self.action(server_id, 'os-stop', **kwargs)
406
407 def start_server(self, server_id, **kwargs):
Lv Fumei7e326332016-07-08 15:18:03 +0800408 """Starts a stopped server and changes its status to ACTIVE.
409
Dong Mad12c2332016-10-19 01:36:27 -0700410 For a full list of available parameters, please refer to the official
411 API reference:
zhufl01ae8db2017-03-08 10:50:51 +0800412 https://developer.openstack.org/api-ref/compute/#start-server-os-start-action
Lv Fumei7e326332016-07-08 15:18:03 +0800413 """
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500414 return self.action(server_id, 'os-start', **kwargs)
415
416 def attach_volume(self, server_id, **kwargs):
zhuflff6d0da2016-06-12 17:27:12 +0800417 """Attaches a volume to a server instance.
418
Dong Mad12c2332016-10-19 01:36:27 -0700419 For a full list of available parameters, please refer to the official
420 API reference:
zhufl01ae8db2017-03-08 10:50:51 +0800421 https://developer.openstack.org/api-ref/compute/#attach-a-volume-to-an-instance
zhuflff6d0da2016-06-12 17:27:12 +0800422 """
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500423 post_body = json.dumps({'volumeAttachment': kwargs})
424 resp, body = self.post('servers/%s/os-volume_attachments' % server_id,
425 post_body)
426 body = json.loads(body)
427 self.validate_response(schema.attach_volume, resp, body)
428 return rest_client.ResponseBody(resp, body)
429
430 def update_attached_volume(self, server_id, attachment_id, **kwargs):
431 """Swaps a volume attached to an instance for another volume"""
432 post_body = json.dumps({'volumeAttachment': kwargs})
433 resp, body = self.put('servers/%s/os-volume_attachments/%s' %
434 (server_id, attachment_id),
435 post_body)
436 self.validate_response(schema.update_attached_volume, resp, body)
437 return rest_client.ResponseBody(resp, body)
438
439 def detach_volume(self, server_id, volume_id): # noqa
Lv Fumei7e326332016-07-08 15:18:03 +0800440 """Detaches a volume from a server instance.
441
Dong Mad12c2332016-10-19 01:36:27 -0700442 For a full list of available parameters, please refer to the official
443 API reference:
zhufl01ae8db2017-03-08 10:50:51 +0800444 https://developer.openstack.org/api-ref/compute/#detach-a-volume-from-an-instance
Lv Fumei7e326332016-07-08 15:18:03 +0800445 """
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500446 resp, body = self.delete('servers/%s/os-volume_attachments/%s' %
447 (server_id, volume_id))
448 self.validate_response(schema.detach_volume, resp, body)
449 return rest_client.ResponseBody(resp, body)
450
451 def show_volume_attachment(self, server_id, volume_id):
Lv Fumei7e326332016-07-08 15:18:03 +0800452 """Return details about the given volume attachment.
453
Dong Mad12c2332016-10-19 01:36:27 -0700454 For a full list of available parameters, please refer to the official
455 API reference:
zhufl01ae8db2017-03-08 10:50:51 +0800456 https://developer.openstack.org/api-ref/compute/#show-a-detail-of-a-volume-attachment
Lv Fumei7e326332016-07-08 15:18:03 +0800457 """
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500458 resp, body = self.get('servers/%s/os-volume_attachments/%s' % (
459 server_id, volume_id))
460 body = json.loads(body)
461 self.validate_response(schema.show_volume_attachment, resp, body)
462 return rest_client.ResponseBody(resp, body)
463
464 def list_volume_attachments(self, server_id):
Lv Fumei7e326332016-07-08 15:18:03 +0800465 """Returns the list of volume attachments for a given instance.
466
Dong Mad12c2332016-10-19 01:36:27 -0700467 For a full list of available parameters, please refer to the official
468 API reference:
zhufl01ae8db2017-03-08 10:50:51 +0800469 https://developer.openstack.org/api-ref/compute/#list-volume-attachments-for-an-instance
Lv Fumei7e326332016-07-08 15:18:03 +0800470 """
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500471 resp, body = self.get('servers/%s/os-volume_attachments' % (
472 server_id))
473 body = json.loads(body)
474 self.validate_response(schema.list_volume_attachments, resp, body)
475 return rest_client.ResponseBody(resp, body)
476
477 def add_security_group(self, server_id, **kwargs):
478 """Add a security group to the server.
479
Dong Mad12c2332016-10-19 01:36:27 -0700480 For a full list of available parameters, please refer to the official
481 API reference:
zhufl01ae8db2017-03-08 10:50:51 +0800482 https://developer.openstack.org/api-ref/compute/#add-security-group-to-a-server-addsecuritygroup-action
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500483 """
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500484 return self.action(server_id, 'addSecurityGroup', **kwargs)
485
486 def remove_security_group(self, server_id, **kwargs):
487 """Remove a security group from the server.
488
Dong Mad12c2332016-10-19 01:36:27 -0700489 For a full list of available parameters, please refer to the official
490 API reference:
zhufl01ae8db2017-03-08 10:50:51 +0800491 https://developer.openstack.org/api-ref/compute/#remove-security-group-from-a-server-removesecuritygroup-action
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500492 """
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500493 return self.action(server_id, 'removeSecurityGroup', **kwargs)
494
495 def live_migrate_server(self, server_id, **kwargs):
496 """This should be called with administrator privileges.
497
Dong Mad12c2332016-10-19 01:36:27 -0700498 For a full list of available parameters, please refer to the official
499 API reference:
zhufl01ae8db2017-03-08 10:50:51 +0800500 https://developer.openstack.org/api-ref/compute/#live-migrate-server-os-migratelive-action
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500501 """
502 return self.action(server_id, 'os-migrateLive', **kwargs)
503
504 def migrate_server(self, server_id, **kwargs):
505 """Migrate a server to a new host.
506
Dong Mad12c2332016-10-19 01:36:27 -0700507 For a full list of available parameters, please refer to the official
508 API reference:
zhufl01ae8db2017-03-08 10:50:51 +0800509 https://developer.openstack.org/api-ref/compute/#migrate-server-migrate-action
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500510 """
511 return self.action(server_id, 'migrate', **kwargs)
512
513 def lock_server(self, server_id, **kwargs):
514 """Lock the given server.
515
Dong Mad12c2332016-10-19 01:36:27 -0700516 For a full list of available parameters, please refer to the official
517 API reference:
zhufl01ae8db2017-03-08 10:50:51 +0800518 https://developer.openstack.org/api-ref/compute/#lock-server-lock-action
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500519 """
520 return self.action(server_id, 'lock', **kwargs)
521
522 def unlock_server(self, server_id, **kwargs):
523 """UNlock the given server.
524
Dong Mad12c2332016-10-19 01:36:27 -0700525 For a full list of available parameters, please refer to the official
526 API reference:
zhufl01ae8db2017-03-08 10:50:51 +0800527 https://developer.openstack.org/api-ref/compute/#unlock-server-unlock-action
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500528 """
529 return self.action(server_id, 'unlock', **kwargs)
530
531 def suspend_server(self, server_id, **kwargs):
532 """Suspend the provided server.
533
Dong Mad12c2332016-10-19 01:36:27 -0700534 For a full list of available parameters, please refer to the official
535 API reference:
zhufl01ae8db2017-03-08 10:50:51 +0800536 https://developer.openstack.org/api-ref/compute/#suspend-server-suspend-action
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500537 """
538 return self.action(server_id, 'suspend', **kwargs)
539
540 def resume_server(self, server_id, **kwargs):
541 """Un-suspend the provided server.
542
Dong Mad12c2332016-10-19 01:36:27 -0700543 For a full list of available parameters, please refer to the official
544 API reference:
zhufl01ae8db2017-03-08 10:50:51 +0800545 https://developer.openstack.org/api-ref/compute/#resume-suspended-server-resume-action
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500546 """
547 return self.action(server_id, 'resume', **kwargs)
548
549 def pause_server(self, server_id, **kwargs):
550 """Pause the provided server.
551
Dong Mad12c2332016-10-19 01:36:27 -0700552 For a full list of available parameters, please refer to the official
553 API reference:
zhufl01ae8db2017-03-08 10:50:51 +0800554 https://developer.openstack.org/api-ref/compute/#pause-server-pause-action
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500555 """
556 return self.action(server_id, 'pause', **kwargs)
557
558 def unpause_server(self, server_id, **kwargs):
559 """Un-pause the provided server.
560
Dong Mad12c2332016-10-19 01:36:27 -0700561 For a full list of available parameters, please refer to the official
562 API reference:
zhufl01ae8db2017-03-08 10:50:51 +0800563 https://developer.openstack.org/api-ref/compute/#unpause-server-unpause-action
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500564 """
565 return self.action(server_id, 'unpause', **kwargs)
566
567 def reset_state(self, server_id, **kwargs):
568 """Reset the state of a server to active/error.
569
Dong Mad12c2332016-10-19 01:36:27 -0700570 For a full list of available parameters, please refer to the official
571 API reference:
zhufl01ae8db2017-03-08 10:50:51 +0800572 https://developer.openstack.org/api-ref/compute/#reset-server-state-os-resetstate-action
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500573 """
574 return self.action(server_id, 'os-resetState', **kwargs)
575
576 def shelve_server(self, server_id, **kwargs):
577 """Shelve the provided server.
578
Dong Mad12c2332016-10-19 01:36:27 -0700579 For a full list of available parameters, please refer to the official
580 API reference:
zhufl01ae8db2017-03-08 10:50:51 +0800581 https://developer.openstack.org/api-ref/compute/#shelve-server-shelve-action
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500582 """
583 return self.action(server_id, 'shelve', **kwargs)
584
585 def unshelve_server(self, server_id, **kwargs):
586 """Un-shelve the provided server.
587
Dong Mad12c2332016-10-19 01:36:27 -0700588 For a full list of available parameters, please refer to the official
589 API reference:
zhufl01ae8db2017-03-08 10:50:51 +0800590 https://developer.openstack.org/api-ref/compute/#unshelve-restore-shelved-server-unshelve-action
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500591 """
592 return self.action(server_id, 'unshelve', **kwargs)
593
594 def shelve_offload_server(self, server_id, **kwargs):
595 """Shelve-offload the provided server.
596
Dong Mad12c2332016-10-19 01:36:27 -0700597 For a full list of available parameters, please refer to the official
598 API reference:
zhufl01ae8db2017-03-08 10:50:51 +0800599 https://developer.openstack.org/api-ref/compute/#shelf-offload-remove-server-shelveoffload-action
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500600 """
601 return self.action(server_id, 'shelveOffload', **kwargs)
602
603 def get_console_output(self, server_id, **kwargs):
604 """Get console output.
605
Dong Mad12c2332016-10-19 01:36:27 -0700606 For a full list of available parameters, please refer to the official
607 API reference:
zhufl01ae8db2017-03-08 10:50:51 +0800608 https://developer.openstack.org/api-ref/compute/#show-console-output-os-getconsoleoutput-action
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500609 """
610 return self.action(server_id, 'os-getConsoleOutput',
611 schema.get_console_output, **kwargs)
612
Markus Zoeller69d58b82017-02-17 10:09:22 +0100613 def get_remote_console(self, server_id, console_type, protocol, **kwargs):
614 """Get a remote console.
615
616 For a full list of available parameters, please refer to the official
617 API reference:
zhufl94337052018-01-22 17:10:29 +0800618 https://developer.openstack.org/api-ref/compute/#create-remote-console
Markus Zoeller69d58b82017-02-17 10:09:22 +0100619 """
620 param = {
621 'remote_console': {
622 'type': console_type,
623 'protocol': protocol,
624 }
625 }
626 post_body = json.dumps(param)
627 resp, body = self.post("servers/%s/remote-consoles" % server_id,
628 post_body)
629 body = json.loads(body)
630 schema = self.get_schema(self.schema_versions_info)
631 self.validate_response(schema.get_remote_consoles, resp, body)
632 return rest_client.ResponseBody(resp, body)
633
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500634 def list_virtual_interfaces(self, server_id):
635 """List the virtual interfaces used in an instance."""
636 resp, body = self.get('/'.join(['servers', server_id,
637 'os-virtual-interfaces']))
638 body = json.loads(body)
639 self.validate_response(schema.list_virtual_interfaces, resp, body)
640 return rest_client.ResponseBody(resp, body)
641
642 def rescue_server(self, server_id, **kwargs):
643 """Rescue the provided server.
644
Dong Mad12c2332016-10-19 01:36:27 -0700645 For a full list of available parameters, please refer to the official
646 API reference:
zhufl01ae8db2017-03-08 10:50:51 +0800647 https://developer.openstack.org/api-ref/compute/#rescue-server-rescue-action
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500648 """
Nolwenn Cauchois1eef2602017-01-18 10:04:24 +0100649 if self.enable_instance_password:
650 rescue_schema = schema.rescue_server_with_admin_pass
651 else:
652 rescue_schema = schema.rescue_server
653 return self.action(server_id, 'rescue', rescue_schema, **kwargs)
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500654
655 def unrescue_server(self, server_id):
Lv Fumei7e326332016-07-08 15:18:03 +0800656 """Unrescue the provided server.
657
Dong Mad12c2332016-10-19 01:36:27 -0700658 For a full list of available parameters, please refer to the official
659 API reference:
zhufl01ae8db2017-03-08 10:50:51 +0800660 https://developer.openstack.org/api-ref/compute/#unrescue-server-unrescue-action
Lv Fumei7e326332016-07-08 15:18:03 +0800661 """
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500662 return self.action(server_id, 'unrescue')
663
664 def show_server_diagnostics(self, server_id):
665 """Get the usage data for a server."""
666 resp, body = self.get("servers/%s/diagnostics" % server_id)
Sergey Nikitin0cb4f222017-02-03 13:16:33 +0400667 body = json.loads(body)
668 schema = self.get_schema(self.schema_versions_info)
669 self.validate_response(schema.show_server_diagnostics, resp, body)
670 return rest_client.ResponseBody(resp, body)
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500671
672 def list_instance_actions(self, server_id):
673 """List the provided server action."""
674 resp, body = self.get("servers/%s/os-instance-actions" %
675 server_id)
676 body = json.loads(body)
677 self.validate_response(schema.list_instance_actions, resp, body)
678 return rest_client.ResponseBody(resp, body)
679
680 def show_instance_action(self, server_id, request_id):
681 """Returns the action details of the provided server."""
682 resp, body = self.get("servers/%s/os-instance-actions/%s" %
683 (server_id, request_id))
684 body = json.loads(body)
685 self.validate_response(schema.show_instance_action, resp, body)
686 return rest_client.ResponseBody(resp, body)
687
688 def force_delete_server(self, server_id, **kwargs):
689 """Force delete a server.
690
Dong Mad12c2332016-10-19 01:36:27 -0700691 For a full list of available parameters, please refer to the official
692 API reference:
zhufl01ae8db2017-03-08 10:50:51 +0800693 https://developer.openstack.org/api-ref/compute/#force-delete-server-forcedelete-action
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500694 """
695 return self.action(server_id, 'forceDelete', **kwargs)
696
697 def restore_soft_deleted_server(self, server_id, **kwargs):
698 """Restore a soft-deleted server.
699
Dong Mad12c2332016-10-19 01:36:27 -0700700 For a full list of available parameters, please refer to the official
701 API reference:
zhufl01ae8db2017-03-08 10:50:51 +0800702 https://developer.openstack.org/api-ref/compute/#restore-soft-deleted-instance-restore-action
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500703 """
704 return self.action(server_id, 'restore', **kwargs)
705
706 def reset_network(self, server_id, **kwargs):
707 """Reset the Network of a server.
708
Dong Mad12c2332016-10-19 01:36:27 -0700709 For a full list of available parameters, please refer to the official
710 API reference:
zhufl01ae8db2017-03-08 10:50:51 +0800711 https://developer.openstack.org/api-ref/compute/#reset-networking-on-a-server-resetnetwork-action
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500712 """
713 return self.action(server_id, 'resetNetwork', **kwargs)
714
715 def inject_network_info(self, server_id, **kwargs):
716 """Inject the Network Info into server.
717
Dong Mad12c2332016-10-19 01:36:27 -0700718 For a full list of available parameters, please refer to the official
719 API reference:
zhufl01ae8db2017-03-08 10:50:51 +0800720 https://developer.openstack.org/api-ref/compute/#inject-network-information-injectnetworkinfo-action
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500721 """
722 return self.action(server_id, 'injectNetworkInfo', **kwargs)
723
724 def get_vnc_console(self, server_id, **kwargs):
725 """Get URL of VNC console.
726
Dong Mad12c2332016-10-19 01:36:27 -0700727 For a full list of available parameters, please refer to the official
728 API reference:
zhufl94337052018-01-22 17:10:29 +0800729 https://developer.openstack.org/api-ref/compute/#get-vnc-console-os-getvncconsole-action-deprecated
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500730 """
731 return self.action(server_id, "os-getVNCConsole",
732 schema.get_vnc_console, **kwargs)
733
734 def add_fixed_ip(self, server_id, **kwargs):
735 """Add a fixed IP to server instance.
736
Dong Mad12c2332016-10-19 01:36:27 -0700737 For a full list of available parameters, please refer to the official
738 API reference:
zhufl94337052018-01-22 17:10:29 +0800739 https://developer.openstack.org/api-ref/compute/#add-associate-fixed-ip-addfixedip-action-deprecated
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500740 """
741 return self.action(server_id, 'addFixedIp', **kwargs)
742
743 def remove_fixed_ip(self, server_id, **kwargs):
744 """Remove input fixed IP from input server instance.
745
Dong Mad12c2332016-10-19 01:36:27 -0700746 For a full list of available parameters, please refer to the official
747 API reference:
zhufl94337052018-01-22 17:10:29 +0800748 https://developer.openstack.org/api-ref/compute/#remove-disassociate-fixed-ip-removefixedip-action-deprecated
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500749 """
750 return self.action(server_id, 'removeFixedIp', **kwargs)
zwhe3beb6cf2017-02-09 16:59:41 +0800751
752 def list_security_groups_by_server(self, server_id):
753 """Lists security groups for a server.
754
755 For a full list of available parameters, please refer to the official
756 API reference:
zhufl01ae8db2017-03-08 10:50:51 +0800757 https://developer.openstack.org/api-ref/compute/#list-security-groups-by-server
zwhe3beb6cf2017-02-09 16:59:41 +0800758 """
759 resp, body = self.get("servers/%s/os-security-groups" % server_id)
760 body = json.loads(body)
761 self.validate_response(security_groups_schema.list_security_groups,
762 resp, body)
763 return rest_client.ResponseBody(resp, body)
Felipe Monteiro7c95bef2017-02-17 18:49:02 -0500764
765 def list_tags(self, server_id):
766 """Lists all tags for a server.
767
768 For a full list of available parameters, please refer to the official
769 API reference:
770 https://developer.openstack.org/api-ref/compute/#list-tags
771 """
772 url = 'servers/%s/tags' % server_id
773 resp, body = self.get(url)
774 body = json.loads(body)
775 schema = self.get_schema(self.schema_versions_info)
776 self.validate_response(schema.list_tags, resp, body)
777 return rest_client.ResponseBody(resp, body)
778
779 def update_all_tags(self, server_id, tags):
780 """Replaces all tags on specified server with the new set of tags.
781
782 For a full list of available parameters, please refer to the official
783 API reference:
784 https://developer.openstack.org/api-ref/compute/#replace-tags
785
786 :param tags: List of tags to replace current server tags with.
787 """
788 url = 'servers/%s/tags' % server_id
789 put_body = {'tags': tags}
790 resp, body = self.put(url, json.dumps(put_body))
791 body = json.loads(body)
792 schema = self.get_schema(self.schema_versions_info)
793 self.validate_response(schema.update_all_tags, resp, body)
794 return rest_client.ResponseBody(resp, body)
795
796 def delete_all_tags(self, server_id):
797 """Deletes all tags from the specified server.
798
799 For a full list of available parameters, please refer to the official
800 API reference:
801 https://developer.openstack.org/api-ref/compute/#delete-all-tags
802 """
803 url = 'servers/%s/tags' % server_id
804 resp, body = self.delete(url)
805 schema = self.get_schema(self.schema_versions_info)
806 self.validate_response(schema.delete_all_tags, resp, body)
807 return rest_client.ResponseBody(resp, body)
808
809 def check_tag_existence(self, server_id, tag):
810 """Checks tag existence on the server.
811
812 For a full list of available parameters, please refer to the official
813 API reference:
814 https://developer.openstack.org/api-ref/compute/#check-tag-existence
815
816 :param tag: Check for existence of tag on specified server.
817 """
818 url = 'servers/%s/tags/%s' % (server_id, tag)
819 resp, body = self.get(url)
820 schema = self.get_schema(self.schema_versions_info)
821 self.validate_response(schema.check_tag_existence, resp, body)
822 return rest_client.ResponseBody(resp, body)
823
824 def update_tag(self, server_id, tag):
825 """Adds a single tag to the server if server has no specified tag.
826
827 For a full list of available parameters, please refer to the official
828 API reference:
829 https://developer.openstack.org/api-ref/compute/#add-a-single-tag
830
831 :param tag: Tag to be added to the specified server.
832 """
833 url = 'servers/%s/tags/%s' % (server_id, tag)
834 resp, body = self.put(url, None)
835 schema = self.get_schema(self.schema_versions_info)
836 self.validate_response(schema.update_tag, resp, body)
837 return rest_client.ResponseBody(resp, body)
838
839 def delete_tag(self, server_id, tag):
840 """Deletes a single tag from the specified server.
841
842 For a full list of available parameters, please refer to the official
843 API reference:
844 https://developer.openstack.org/api-ref/compute/#delete-a-single-tag
845
846 :param tag: Tag to be removed from the specified server.
847 """
848 url = 'servers/%s/tags/%s' % (server_id, tag)
849 resp, body = self.delete(url)
850 schema = self.get_schema(self.schema_versions_info)
851 self.validate_response(schema.delete_tag, resp, body)
852 return rest_client.ResponseBody(resp, body)
raiesmh0814158c92017-03-21 14:23:15 +0530853
854 def evacuate_server(self, server_id, **kwargs):
855 """Evacuate the given server.
856
857 For a full list of available parameters, please refer to the official
858 API reference:
859 https://developer.openstack.org/api-ref/compute/#evacuate-server-evacuate-action
860 """
861 if self.enable_instance_password:
862 evacuate_schema = schema.evacuate_server_with_admin_pass
863 else:
864 evacuate_schema = schema.evacuate_server
865
866 return self.action(server_id, 'evacuate',
867 evacuate_schema,
868 **kwargs)