blob: e82b58f2f24ad26700c02a63130326ffd44b3216 [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
Matt Riedemannb9b6e372019-03-02 12:23:14 -050036from tempest.lib.api_schema.response.compute.v2_70 import servers as schemav270
Matt Riedemann0b14b1e2019-03-02 12:38:10 -050037from tempest.lib.api_schema.response.compute.v2_71 import servers as schemav271
Lee Yarwood803b4a72020-01-07 17:10:29 +000038from tempest.lib.api_schema.response.compute.v2_73 import servers as schemav273
Felipe Monteiro00b3bd52018-08-03 02:18:13 -040039from tempest.lib.api_schema.response.compute.v2_8 import servers as schemav28
lanoux2746ba02016-03-16 17:41:01 +090040from tempest.lib.api_schema.response.compute.v2_9 import servers as schemav29
Matthew Treinish9e26ca82016-02-23 11:43:20 -050041from tempest.lib.common import rest_client
Ghanshyamee9af302016-02-25 06:12:43 +090042from tempest.lib.services.compute import base_compute_client
Matthew Treinish9e26ca82016-02-23 11:43:20 -050043
44
Ghanshyamee9af302016-02-25 06:12:43 +090045class ServersClient(base_compute_client.BaseComputeClient):
Ken'ichi Ohmichiaca816d2017-01-27 15:12:17 -080046 """Service client for the resource /servers"""
47
lanoux2746ba02016-03-16 17:41:01 +090048 schema_versions_info = [
Eli Qiaoe07eacc2016-03-03 13:49:37 +080049 {'min': None, 'max': '2.2', 'schema': schema},
Markus Zoeller69d58b82017-02-17 10:09:22 +010050 {'min': '2.3', 'max': '2.5', 'schema': schemav23},
Felipe Monteiro00b3bd52018-08-03 02:18:13 -040051 {'min': '2.6', 'max': '2.7', 'schema': schemav26},
52 {'min': '2.8', 'max': '2.8', 'schema': schemav28},
Eli Qiaoe07eacc2016-03-03 13:49:37 +080053 {'min': '2.9', 'max': '2.15', 'schema': schemav29},
54 {'min': '2.16', 'max': '2.18', 'schema': schemav216},
Matt Riedemann3e4a46a2016-07-27 14:41:32 -040055 {'min': '2.19', 'max': '2.25', 'schema': schemav219},
Sergey Nikitin8654e5b2017-06-04 22:09:56 +040056 {'min': '2.26', 'max': '2.46', 'schema': schemav226},
Sergey Nikitin0cb4f222017-02-03 13:16:33 +040057 {'min': '2.47', 'max': '2.47', 'schema': schemav247},
ghanshyam85a4b0a2018-04-24 11:09:25 +030058 {'min': '2.48', 'max': '2.53', 'schema': schemav248},
Ghanshyamd5394652018-04-26 07:59:32 +000059 {'min': '2.54', 'max': '2.56', 'schema': schemav254},
Jackie Truong1fa44642017-10-25 16:42:08 -040060 {'min': '2.57', 'max': '2.62', 'schema': schemav257},
Matt Riedemannb9b6e372019-03-02 12:23:14 -050061 {'min': '2.63', 'max': '2.69', 'schema': schemav263},
Matt Riedemann0b14b1e2019-03-02 12:38:10 -050062 {'min': '2.70', 'max': '2.70', 'schema': schemav270},
Lee Yarwood803b4a72020-01-07 17:10:29 +000063 {'min': '2.71', 'max': '2.72', 'schema': schemav271},
64 {'min': '2.73', 'max': None, 'schema': schemav273}]
Matthew Treinish9e26ca82016-02-23 11:43:20 -050065
66 def __init__(self, auth_provider, service, region,
67 enable_instance_password=True, **kwargs):
68 super(ServersClient, self).__init__(
69 auth_provider, service, region, **kwargs)
70 self.enable_instance_password = enable_instance_password
71
72 def create_server(self, **kwargs):
73 """Create server.
74
Ken'ichi Ohmichid9bafc02016-09-09 09:35:21 -070075 For a full list of available parameters, please refer to the official
76 API reference:
Andreas Jaegerbf30ae72019-07-22 19:22:57 +020077 https://docs.openstack.org/api-ref/compute/#create-server
Ken'ichi Ohmichid9bafc02016-09-09 09:35:21 -070078
79 :param name: Server name
80 :param imageRef: Image reference (UUID)
81 :param flavorRef: Flavor reference (UUID or full URL)
Matthew Treinish9e26ca82016-02-23 11:43:20 -050082
83 Most parameters except the following are passed to the API without
84 any changes.
85 :param disk_config: The name is changed to OS-DCF:diskConfig
86 :param scheduler_hints: The name is changed to os:scheduler_hints and
87 the parameter is set in the same level as the parameter 'server'.
88 """
89 body = copy.deepcopy(kwargs)
90 if body.get('disk_config'):
91 body['OS-DCF:diskConfig'] = body.pop('disk_config')
92
93 hints = None
94 if body.get('scheduler_hints'):
95 hints = {'os:scheduler_hints': body.pop('scheduler_hints')}
96
97 post_body = {'server': body}
98
99 if hints:
Jordan Pittier81c427d2016-04-25 17:02:58 +0200100 post_body.update(hints)
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500101
102 post_body = json.dumps(post_body)
103 resp, body = self.post('servers', post_body)
104
105 body = json.loads(body)
106 # NOTE(maurosr): this deals with the case of multiple server create
107 # with return reservation id set True
108 if 'reservation_id' in body:
109 return rest_client.ResponseBody(resp, body)
110 if self.enable_instance_password:
111 create_schema = schema.create_server_with_admin_pass
112 else:
113 create_schema = schema.create_server
114 self.validate_response(create_schema, resp, body)
115 return rest_client.ResponseBody(resp, body)
116
117 def update_server(self, server_id, **kwargs):
118 """Update server.
119
Dong Mad12c2332016-10-19 01:36:27 -0700120 For a full list of available parameters, please refer to the official
121 API reference:
Andreas Jaegerbf30ae72019-07-22 19:22:57 +0200122 https://docs.openstack.org/api-ref/compute/#update-server
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500123
124 Most parameters except the following are passed to the API without
125 any changes.
126 :param disk_config: The name is changed to OS-DCF:diskConfig
127 """
ghanshyam910022e2016-12-21 13:32:57 +0900128 if 'disk_config' in kwargs:
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500129 kwargs['OS-DCF:diskConfig'] = kwargs.pop('disk_config')
130
131 post_body = json.dumps({'server': kwargs})
132 resp, body = self.put("servers/%s" % server_id, post_body)
133 body = json.loads(body)
lanoux2746ba02016-03-16 17:41:01 +0900134 schema = self.get_schema(self.schema_versions_info)
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500135 self.validate_response(schema.update_server, resp, body)
136 return rest_client.ResponseBody(resp, body)
137
138 def show_server(self, server_id):
Lv Fumei7e326332016-07-08 15:18:03 +0800139 """Get server details.
140
Dong Mad12c2332016-10-19 01:36:27 -0700141 For a full list of available parameters, please refer to the official
142 API reference:
Andreas Jaegerbf30ae72019-07-22 19:22:57 +0200143 https://docs.openstack.org/api-ref/compute/#show-server-details
Lv Fumei7e326332016-07-08 15:18:03 +0800144 """
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500145 resp, body = self.get("servers/%s" % server_id)
146 body = json.loads(body)
lanoux2746ba02016-03-16 17:41:01 +0900147 schema = self.get_schema(self.schema_versions_info)
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500148 self.validate_response(schema.get_server, resp, body)
149 return rest_client.ResponseBody(resp, body)
150
151 def delete_server(self, server_id):
Lv Fumei7e326332016-07-08 15:18:03 +0800152 """Delete server.
153
Dong Mad12c2332016-10-19 01:36:27 -0700154 For a full list of available parameters, please refer to the official
155 API reference:
Andreas Jaegerbf30ae72019-07-22 19:22:57 +0200156 https://docs.openstack.org/api-ref/compute/#delete-server
Lv Fumei7e326332016-07-08 15:18:03 +0800157 """
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500158 resp, body = self.delete("servers/%s" % server_id)
159 self.validate_response(schema.delete_server, resp, body)
160 return rest_client.ResponseBody(resp, body)
161
162 def list_servers(self, detail=False, **params):
163 """List servers.
164
Dong Mad12c2332016-10-19 01:36:27 -0700165 For a full list of available parameters, please refer to the official
166 API reference:
Andreas Jaegerbf30ae72019-07-22 19:22:57 +0200167 https://docs.openstack.org/api-ref/compute/#list-servers
168 https://docs.openstack.org/api-ref/compute/#list-servers-detailed
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500169 """
170
171 url = 'servers'
lanoux2746ba02016-03-16 17:41:01 +0900172 schema = self.get_schema(self.schema_versions_info)
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500173 if detail:
174 url += '/detail'
175 _schema = schema.list_servers_detail
ghanshyama8ace722018-04-20 08:45:10 +0000176 else:
177 _schema = schema.list_servers
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500178 if params:
179 url += '?%s' % urllib.urlencode(params)
180
181 resp, body = self.get(url)
182 body = json.loads(body)
183 self.validate_response(_schema, resp, body)
184 return rest_client.ResponseBody(resp, body)
185
186 def list_addresses(self, server_id):
Lv Fumei7e326332016-07-08 15:18:03 +0800187 """Lists all addresses for a server.
188
Dong Mad12c2332016-10-19 01:36:27 -0700189 For a full list of available parameters, please refer to the official
190 API reference:
Andreas Jaegerbf30ae72019-07-22 19:22:57 +0200191 https://docs.openstack.org/api-ref/compute/#list-ips
Lv Fumei7e326332016-07-08 15:18:03 +0800192 """
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500193 resp, body = self.get("servers/%s/ips" % server_id)
194 body = json.loads(body)
195 self.validate_response(schema.list_addresses, resp, body)
196 return rest_client.ResponseBody(resp, body)
197
198 def list_addresses_by_network(self, server_id, network_id):
199 """Lists all addresses of a specific network type for a server."""
200 resp, body = self.get("servers/%s/ips/%s" %
201 (server_id, network_id))
202 body = json.loads(body)
203 self.validate_response(schema.list_addresses_by_network, resp, body)
204 return rest_client.ResponseBody(resp, body)
205
206 def action(self, server_id, action_name,
207 schema=schema.server_actions_common_schema,
208 **kwargs):
Ghanshyamcbf480f2019-07-11 11:53:57 +0000209 if 'body' in kwargs:
210 post_body = json.dumps(kwargs['body'])
211 else:
212 post_body = json.dumps({action_name: kwargs})
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500213 resp, body = self.post('servers/%s/action' % server_id,
214 post_body)
215 if body:
216 body = json.loads(body)
zhuflbe86aec2020-02-25 16:56:51 +0800217 else:
218 if isinstance(body, bytes):
219 body = body.decode('utf-8')
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500220 self.validate_response(schema, resp, body)
221 return rest_client.ResponseBody(resp, body)
222
223 def create_backup(self, server_id, **kwargs):
224 """Backup a server instance.
225
Dong Mad12c2332016-10-19 01:36:27 -0700226 For a full list of available parameters, please refer to the official
227 API reference:
Andreas Jaegerbf30ae72019-07-22 19:22:57 +0200228 https://docs.openstack.org/api-ref/compute/#create-server-back-up-createbackup-action
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500229 """
230 return self.action(server_id, "createBackup", **kwargs)
231
232 def change_password(self, server_id, **kwargs):
233 """Change the root password for the server.
234
Dong Mad12c2332016-10-19 01:36:27 -0700235 For a full list of available parameters, please refer to the official
236 API reference:
Andreas Jaegerbf30ae72019-07-22 19:22:57 +0200237 https://docs.openstack.org/api-ref/compute/#change-administrative-password-changepassword-action
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500238 """
239 return self.action(server_id, 'changePassword', **kwargs)
240
241 def show_password(self, server_id):
242 resp, body = self.get("servers/%s/os-server-password" %
243 server_id)
244 body = json.loads(body)
245 self.validate_response(schema.show_password, resp, body)
246 return rest_client.ResponseBody(resp, body)
247
248 def delete_password(self, server_id):
249 """Removes the encrypted server password from the metadata server
250
251 Note that this does not actually change the instance server
252 password.
253 """
254 resp, body = self.delete("servers/%s/os-server-password" %
255 server_id)
256 self.validate_response(schema.server_actions_delete_password,
257 resp, body)
258 return rest_client.ResponseBody(resp, body)
259
260 def reboot_server(self, server_id, **kwargs):
261 """Reboot a server.
262
Dong Mad12c2332016-10-19 01:36:27 -0700263 For a full list of available parameters, please refer to the official
264 API reference:
Andreas Jaegerbf30ae72019-07-22 19:22:57 +0200265 https://docs.openstack.org/api-ref/compute/#reboot-server-reboot-action
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500266 """
267 return self.action(server_id, 'reboot', **kwargs)
268
269 def rebuild_server(self, server_id, image_ref, **kwargs):
270 """Rebuild a server with a new image.
271
Dong Mad12c2332016-10-19 01:36:27 -0700272 For a full list of available parameters, please refer to the official
273 API reference:
Andreas Jaegerbf30ae72019-07-22 19:22:57 +0200274 https://docs.openstack.org/api-ref/compute/#rebuild-server-rebuild-action
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500275
276 Most parameters except the following are passed to the API without
277 any changes.
278 :param disk_config: The name is changed to OS-DCF:diskConfig
279 """
280 kwargs['imageRef'] = image_ref
281 if 'disk_config' in kwargs:
282 kwargs['OS-DCF:diskConfig'] = kwargs.pop('disk_config')
lanoux2746ba02016-03-16 17:41:01 +0900283 schema = self.get_schema(self.schema_versions_info)
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500284 if self.enable_instance_password:
285 rebuild_schema = schema.rebuild_server_with_admin_pass
286 else:
287 rebuild_schema = schema.rebuild_server
288 return self.action(server_id, 'rebuild',
289 rebuild_schema, **kwargs)
290
291 def resize_server(self, server_id, flavor_ref, **kwargs):
292 """Change the flavor of a server.
293
Dong Mad12c2332016-10-19 01:36:27 -0700294 For a full list of available parameters, please refer to the official
295 API reference:
Andreas Jaegerbf30ae72019-07-22 19:22:57 +0200296 https://docs.openstack.org/api-ref/compute/#resize-server-resize-action
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500297
298 Most parameters except the following are passed to the API without
299 any changes.
300 :param disk_config: The name is changed to OS-DCF:diskConfig
301 """
302 kwargs['flavorRef'] = flavor_ref
303 if 'disk_config' in kwargs:
304 kwargs['OS-DCF:diskConfig'] = kwargs.pop('disk_config')
305 return self.action(server_id, 'resize', **kwargs)
306
307 def confirm_resize_server(self, server_id, **kwargs):
308 """Confirm the flavor change for a server.
309
Dong Mad12c2332016-10-19 01:36:27 -0700310 For a full list of available parameters, please refer to the official
311 API reference:
Andreas Jaegerbf30ae72019-07-22 19:22:57 +0200312 https://docs.openstack.org/api-ref/compute/#confirm-resized-server-confirmresize-action
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500313 """
314 return self.action(server_id, 'confirmResize',
315 schema.server_actions_confirm_resize,
316 **kwargs)
317
318 def revert_resize_server(self, server_id, **kwargs):
319 """Revert a server back to its original flavor.
320
Dong Mad12c2332016-10-19 01:36:27 -0700321 For a full list of available parameters, please refer to the official
322 API reference:
Andreas Jaegerbf30ae72019-07-22 19:22:57 +0200323 https://docs.openstack.org/api-ref/compute/#revert-resized-server-revertresize-action
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500324 """
325 return self.action(server_id, 'revertResize', **kwargs)
326
327 def list_server_metadata(self, server_id):
Lv Fumei7e326332016-07-08 15:18:03 +0800328 """Lists all metadata for a server.
329
Dong Mad12c2332016-10-19 01:36:27 -0700330 For a full list of available parameters, please refer to the official
331 API reference:
Andreas Jaegerbf30ae72019-07-22 19:22:57 +0200332 https://docs.openstack.org/api-ref/compute/#list-all-metadata
Lv Fumei7e326332016-07-08 15:18:03 +0800333 """
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500334 resp, body = self.get("servers/%s/metadata" % server_id)
335 body = json.loads(body)
336 self.validate_response(schema.list_server_metadata, resp, body)
337 return rest_client.ResponseBody(resp, body)
338
339 def set_server_metadata(self, server_id, meta, no_metadata_field=False):
Lv Fumei7e326332016-07-08 15:18:03 +0800340 """Sets one or more metadata items for a server.
341
Dong Mad12c2332016-10-19 01:36:27 -0700342 For a full list of available parameters, please refer to the official
343 API reference:
Andreas Jaegerbf30ae72019-07-22 19:22:57 +0200344 https://docs.openstack.org/api-ref/compute/#replace-metadata-items
Lv Fumei7e326332016-07-08 15:18:03 +0800345 """
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500346 if no_metadata_field:
347 post_body = ""
348 else:
349 post_body = json.dumps({'metadata': meta})
350 resp, body = self.put('servers/%s/metadata' % server_id,
351 post_body)
352 body = json.loads(body)
353 self.validate_response(schema.set_server_metadata, resp, body)
354 return rest_client.ResponseBody(resp, body)
355
356 def update_server_metadata(self, server_id, meta):
Lv Fumei7e326332016-07-08 15:18:03 +0800357 """Updates one or more metadata items for a server.
358
Dong Mad12c2332016-10-19 01:36:27 -0700359 For a full list of available parameters, please refer to the official
360 API reference:
Andreas Jaegerbf30ae72019-07-22 19:22:57 +0200361 https://docs.openstack.org/api-ref/compute/#create-or-update-metadata-items
Lv Fumei7e326332016-07-08 15:18:03 +0800362 """
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500363 post_body = json.dumps({'metadata': meta})
364 resp, body = self.post('servers/%s/metadata' % server_id,
365 post_body)
366 body = json.loads(body)
367 self.validate_response(schema.update_server_metadata,
368 resp, body)
369 return rest_client.ResponseBody(resp, body)
370
371 def show_server_metadata_item(self, server_id, key):
Lv Fumei7e326332016-07-08 15:18:03 +0800372 """Shows details for a metadata item, by key, for a server.
373
Dong Mad12c2332016-10-19 01:36:27 -0700374 For a full list of available parameters, please refer to the official
375 API reference:
Andreas Jaegerbf30ae72019-07-22 19:22:57 +0200376 https://docs.openstack.org/api-ref/compute/#show-metadata-item-details
Lv Fumei7e326332016-07-08 15:18:03 +0800377 """
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500378 resp, body = self.get("servers/%s/metadata/%s" % (server_id, key))
379 body = json.loads(body)
380 self.validate_response(schema.set_show_server_metadata_item,
381 resp, body)
382 return rest_client.ResponseBody(resp, body)
383
384 def set_server_metadata_item(self, server_id, key, meta):
Lv Fumei7e326332016-07-08 15:18:03 +0800385 """Sets a metadata item, by key, for a server.
386
Dong Mad12c2332016-10-19 01:36:27 -0700387 For a full list of available parameters, please refer to the official
388 API reference:
Andreas Jaegerbf30ae72019-07-22 19:22:57 +0200389 https://docs.openstack.org/api-ref/compute/#create-or-update-metadata-item
Lv Fumei7e326332016-07-08 15:18:03 +0800390 """
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500391 post_body = json.dumps({'meta': meta})
392 resp, body = self.put('servers/%s/metadata/%s' % (server_id, key),
393 post_body)
394 body = json.loads(body)
395 self.validate_response(schema.set_show_server_metadata_item,
396 resp, body)
397 return rest_client.ResponseBody(resp, body)
398
399 def delete_server_metadata_item(self, server_id, key):
Lv Fumei7e326332016-07-08 15:18:03 +0800400 """Deletes a metadata item, by key, from a server.
401
Dong Mad12c2332016-10-19 01:36:27 -0700402 For a full list of available parameters, please refer to the official
403 API reference:
Andreas Jaegerbf30ae72019-07-22 19:22:57 +0200404 https://docs.openstack.org/api-ref/compute/#delete-metadata-item
Lv Fumei7e326332016-07-08 15:18:03 +0800405 """
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500406 resp, body = self.delete("servers/%s/metadata/%s" %
407 (server_id, key))
408 self.validate_response(schema.delete_server_metadata_item,
409 resp, body)
410 return rest_client.ResponseBody(resp, body)
411
412 def stop_server(self, server_id, **kwargs):
Lv Fumei7e326332016-07-08 15:18:03 +0800413 """Stops a running server and changes its status to SHUTOFF.
414
Dong Mad12c2332016-10-19 01:36:27 -0700415 For a full list of available parameters, please refer to the official
416 API reference:
Andreas Jaegerbf30ae72019-07-22 19:22:57 +0200417 https://docs.openstack.org/api-ref/compute/#stop-server-os-stop-action
Lv Fumei7e326332016-07-08 15:18:03 +0800418 """
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500419 return self.action(server_id, 'os-stop', **kwargs)
420
421 def start_server(self, server_id, **kwargs):
Lv Fumei7e326332016-07-08 15:18:03 +0800422 """Starts a stopped server and changes its status to ACTIVE.
423
Dong Mad12c2332016-10-19 01:36:27 -0700424 For a full list of available parameters, please refer to the official
425 API reference:
Andreas Jaegerbf30ae72019-07-22 19:22:57 +0200426 https://docs.openstack.org/api-ref/compute/#start-server-os-start-action
Lv Fumei7e326332016-07-08 15:18:03 +0800427 """
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500428 return self.action(server_id, 'os-start', **kwargs)
429
430 def attach_volume(self, server_id, **kwargs):
zhuflff6d0da2016-06-12 17:27:12 +0800431 """Attaches a volume to a server instance.
432
Dong Mad12c2332016-10-19 01:36:27 -0700433 For a full list of available parameters, please refer to the official
434 API reference:
Andreas Jaegerbf30ae72019-07-22 19:22:57 +0200435 https://docs.openstack.org/api-ref/compute/#attach-a-volume-to-an-instance
zhuflff6d0da2016-06-12 17:27:12 +0800436 """
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500437 post_body = json.dumps({'volumeAttachment': kwargs})
438 resp, body = self.post('servers/%s/os-volume_attachments' % server_id,
439 post_body)
440 body = json.loads(body)
Matt Riedemannb9b6e372019-03-02 12:23:14 -0500441 schema = self.get_schema(self.schema_versions_info)
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500442 self.validate_response(schema.attach_volume, resp, body)
443 return rest_client.ResponseBody(resp, body)
444
445 def update_attached_volume(self, server_id, attachment_id, **kwargs):
zhuflaa605d52019-08-21 15:17:02 +0800446 """Swaps a volume attached to an instance for another volume
447
448 For a full list of available parameters, please refer to the official
449 API reference:
450 https://docs.openstack.org/api-ref/compute/#update-a-volume-attachment
451 """
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500452 post_body = json.dumps({'volumeAttachment': kwargs})
453 resp, body = self.put('servers/%s/os-volume_attachments/%s' %
454 (server_id, attachment_id),
455 post_body)
456 self.validate_response(schema.update_attached_volume, resp, body)
457 return rest_client.ResponseBody(resp, body)
458
459 def detach_volume(self, server_id, volume_id): # noqa
Lv Fumei7e326332016-07-08 15:18:03 +0800460 """Detaches a volume from a server instance.
461
Dong Mad12c2332016-10-19 01:36:27 -0700462 For a full list of available parameters, please refer to the official
463 API reference:
Andreas Jaegerbf30ae72019-07-22 19:22:57 +0200464 https://docs.openstack.org/api-ref/compute/#detach-a-volume-from-an-instance
Lv Fumei7e326332016-07-08 15:18:03 +0800465 """
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500466 resp, body = self.delete('servers/%s/os-volume_attachments/%s' %
467 (server_id, volume_id))
468 self.validate_response(schema.detach_volume, resp, body)
469 return rest_client.ResponseBody(resp, body)
470
471 def show_volume_attachment(self, server_id, volume_id):
Lv Fumei7e326332016-07-08 15:18:03 +0800472 """Return details about the given volume attachment.
473
Dong Mad12c2332016-10-19 01:36:27 -0700474 For a full list of available parameters, please refer to the official
475 API reference:
Andreas Jaegerbf30ae72019-07-22 19:22:57 +0200476 https://docs.openstack.org/api-ref/compute/#show-a-detail-of-a-volume-attachment
Lv Fumei7e326332016-07-08 15:18:03 +0800477 """
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500478 resp, body = self.get('servers/%s/os-volume_attachments/%s' % (
479 server_id, volume_id))
480 body = json.loads(body)
Matt Riedemannb9b6e372019-03-02 12:23:14 -0500481 schema = self.get_schema(self.schema_versions_info)
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500482 self.validate_response(schema.show_volume_attachment, resp, body)
483 return rest_client.ResponseBody(resp, body)
484
485 def list_volume_attachments(self, server_id):
Lv Fumei7e326332016-07-08 15:18:03 +0800486 """Returns the list of volume attachments for a given instance.
487
Dong Mad12c2332016-10-19 01:36:27 -0700488 For a full list of available parameters, please refer to the official
489 API reference:
Andreas Jaegerbf30ae72019-07-22 19:22:57 +0200490 https://docs.openstack.org/api-ref/compute/#list-volume-attachments-for-an-instance
Lv Fumei7e326332016-07-08 15:18:03 +0800491 """
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500492 resp, body = self.get('servers/%s/os-volume_attachments' % (
493 server_id))
494 body = json.loads(body)
Matt Riedemannb9b6e372019-03-02 12:23:14 -0500495 schema = self.get_schema(self.schema_versions_info)
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500496 self.validate_response(schema.list_volume_attachments, resp, body)
497 return rest_client.ResponseBody(resp, body)
498
499 def add_security_group(self, server_id, **kwargs):
500 """Add a security group to the server.
501
Dong Mad12c2332016-10-19 01:36:27 -0700502 For a full list of available parameters, please refer to the official
503 API reference:
Andreas Jaegerbf30ae72019-07-22 19:22:57 +0200504 https://docs.openstack.org/api-ref/compute/#add-security-group-to-a-server-addsecuritygroup-action
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500505 """
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500506 return self.action(server_id, 'addSecurityGroup', **kwargs)
507
508 def remove_security_group(self, server_id, **kwargs):
509 """Remove a security group from the server.
510
Dong Mad12c2332016-10-19 01:36:27 -0700511 For a full list of available parameters, please refer to the official
512 API reference:
Andreas Jaegerbf30ae72019-07-22 19:22:57 +0200513 https://docs.openstack.org/api-ref/compute/#remove-security-group-from-a-server-removesecuritygroup-action
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500514 """
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500515 return self.action(server_id, 'removeSecurityGroup', **kwargs)
516
517 def live_migrate_server(self, server_id, **kwargs):
518 """This should be called with administrator privileges.
519
Dong Mad12c2332016-10-19 01:36:27 -0700520 For a full list of available parameters, please refer to the official
521 API reference:
Andreas Jaegerbf30ae72019-07-22 19:22:57 +0200522 https://docs.openstack.org/api-ref/compute/#live-migrate-server-os-migratelive-action
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500523 """
524 return self.action(server_id, 'os-migrateLive', **kwargs)
525
526 def migrate_server(self, server_id, **kwargs):
527 """Migrate a server to a new host.
528
Dong Mad12c2332016-10-19 01:36:27 -0700529 For a full list of available parameters, please refer to the official
530 API reference:
Andreas Jaegerbf30ae72019-07-22 19:22:57 +0200531 https://docs.openstack.org/api-ref/compute/#migrate-server-migrate-action
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500532 """
533 return self.action(server_id, 'migrate', **kwargs)
534
535 def lock_server(self, server_id, **kwargs):
536 """Lock the given server.
537
Dong Mad12c2332016-10-19 01:36:27 -0700538 For a full list of available parameters, please refer to the official
539 API reference:
Andreas Jaegerbf30ae72019-07-22 19:22:57 +0200540 https://docs.openstack.org/api-ref/compute/#lock-server-lock-action
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500541 """
542 return self.action(server_id, 'lock', **kwargs)
543
544 def unlock_server(self, server_id, **kwargs):
545 """UNlock the given server.
546
Dong Mad12c2332016-10-19 01:36:27 -0700547 For a full list of available parameters, please refer to the official
548 API reference:
Andreas Jaegerbf30ae72019-07-22 19:22:57 +0200549 https://docs.openstack.org/api-ref/compute/#unlock-server-unlock-action
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500550 """
551 return self.action(server_id, 'unlock', **kwargs)
552
553 def suspend_server(self, server_id, **kwargs):
554 """Suspend the provided server.
555
Dong Mad12c2332016-10-19 01:36:27 -0700556 For a full list of available parameters, please refer to the official
557 API reference:
Andreas Jaegerbf30ae72019-07-22 19:22:57 +0200558 https://docs.openstack.org/api-ref/compute/#suspend-server-suspend-action
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500559 """
560 return self.action(server_id, 'suspend', **kwargs)
561
562 def resume_server(self, server_id, **kwargs):
563 """Un-suspend the provided server.
564
Dong Mad12c2332016-10-19 01:36:27 -0700565 For a full list of available parameters, please refer to the official
566 API reference:
Andreas Jaegerbf30ae72019-07-22 19:22:57 +0200567 https://docs.openstack.org/api-ref/compute/#resume-suspended-server-resume-action
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500568 """
569 return self.action(server_id, 'resume', **kwargs)
570
571 def pause_server(self, server_id, **kwargs):
572 """Pause the provided server.
573
Dong Mad12c2332016-10-19 01:36:27 -0700574 For a full list of available parameters, please refer to the official
575 API reference:
Andreas Jaegerbf30ae72019-07-22 19:22:57 +0200576 https://docs.openstack.org/api-ref/compute/#pause-server-pause-action
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500577 """
578 return self.action(server_id, 'pause', **kwargs)
579
580 def unpause_server(self, server_id, **kwargs):
581 """Un-pause the provided server.
582
Dong Mad12c2332016-10-19 01:36:27 -0700583 For a full list of available parameters, please refer to the official
584 API reference:
Andreas Jaegerbf30ae72019-07-22 19:22:57 +0200585 https://docs.openstack.org/api-ref/compute/#unpause-server-unpause-action
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500586 """
587 return self.action(server_id, 'unpause', **kwargs)
588
589 def reset_state(self, server_id, **kwargs):
590 """Reset the state of a server to active/error.
591
Dong Mad12c2332016-10-19 01:36:27 -0700592 For a full list of available parameters, please refer to the official
593 API reference:
Andreas Jaegerbf30ae72019-07-22 19:22:57 +0200594 https://docs.openstack.org/api-ref/compute/#reset-server-state-os-resetstate-action
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500595 """
596 return self.action(server_id, 'os-resetState', **kwargs)
597
598 def shelve_server(self, server_id, **kwargs):
599 """Shelve the provided server.
600
Dong Mad12c2332016-10-19 01:36:27 -0700601 For a full list of available parameters, please refer to the official
602 API reference:
Andreas Jaegerbf30ae72019-07-22 19:22:57 +0200603 https://docs.openstack.org/api-ref/compute/#shelve-server-shelve-action
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500604 """
605 return self.action(server_id, 'shelve', **kwargs)
606
607 def unshelve_server(self, server_id, **kwargs):
608 """Un-shelve the provided server.
609
Dong Mad12c2332016-10-19 01:36:27 -0700610 For a full list of available parameters, please refer to the official
611 API reference:
Andreas Jaegerbf30ae72019-07-22 19:22:57 +0200612 https://docs.openstack.org/api-ref/compute/#unshelve-restore-shelved-server-unshelve-action
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500613 """
Ghanshyamcbf480f2019-07-11 11:53:57 +0000614 # NOTE(gmann): pass None as request body if nothing is requested.
615 # Nova started the request body check since 2.77 microversion and only
616 # accept AZ or None as valid req body and reject the empty dict {}.
617 # Before 2.77 microverison anything is valid body as Nova does not
618 # check the request body but as per api-ref None is valid request
619 # body to pass so we do not need to check the requested microversion
620 # here and always default req body to None.
621 if not kwargs:
622 kwargs['body'] = {'unshelve': None}
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500623 return self.action(server_id, 'unshelve', **kwargs)
624
625 def shelve_offload_server(self, server_id, **kwargs):
626 """Shelve-offload the provided server.
627
Dong Mad12c2332016-10-19 01:36:27 -0700628 For a full list of available parameters, please refer to the official
629 API reference:
Andreas Jaegerbf30ae72019-07-22 19:22:57 +0200630 https://docs.openstack.org/api-ref/compute/#shelf-offload-remove-server-shelveoffload-action
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500631 """
632 return self.action(server_id, 'shelveOffload', **kwargs)
633
634 def get_console_output(self, server_id, **kwargs):
635 """Get console output.
636
Dong Mad12c2332016-10-19 01:36:27 -0700637 For a full list of available parameters, please refer to the official
638 API reference:
Andreas Jaegerbf30ae72019-07-22 19:22:57 +0200639 https://docs.openstack.org/api-ref/compute/#show-console-output-os-getconsoleoutput-action
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500640 """
641 return self.action(server_id, 'os-getConsoleOutput',
642 schema.get_console_output, **kwargs)
643
Markus Zoeller69d58b82017-02-17 10:09:22 +0100644 def get_remote_console(self, server_id, console_type, protocol, **kwargs):
645 """Get a remote console.
646
647 For a full list of available parameters, please refer to the official
648 API reference:
zhufl35c2c122020-10-28 17:07:16 +0800649 https://docs.openstack.org/api-ref/compute/#create-console
Markus Zoeller69d58b82017-02-17 10:09:22 +0100650 """
651 param = {
652 'remote_console': {
653 'type': console_type,
654 'protocol': protocol,
655 }
656 }
657 post_body = json.dumps(param)
658 resp, body = self.post("servers/%s/remote-consoles" % server_id,
659 post_body)
660 body = json.loads(body)
661 schema = self.get_schema(self.schema_versions_info)
662 self.validate_response(schema.get_remote_consoles, resp, body)
663 return rest_client.ResponseBody(resp, body)
664
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500665 def list_virtual_interfaces(self, server_id):
666 """List the virtual interfaces used in an instance."""
667 resp, body = self.get('/'.join(['servers', server_id,
afazekas40fcb9b2019-03-08 11:25:11 +0100668 'os-virtual-interfaces']))
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500669 body = json.loads(body)
670 self.validate_response(schema.list_virtual_interfaces, resp, body)
671 return rest_client.ResponseBody(resp, body)
672
673 def rescue_server(self, server_id, **kwargs):
674 """Rescue the provided server.
675
Dong Mad12c2332016-10-19 01:36:27 -0700676 For a full list of available parameters, please refer to the official
677 API reference:
Andreas Jaegerbf30ae72019-07-22 19:22:57 +0200678 https://docs.openstack.org/api-ref/compute/#rescue-server-rescue-action
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500679 """
Nolwenn Cauchois1eef2602017-01-18 10:04:24 +0100680 if self.enable_instance_password:
681 rescue_schema = schema.rescue_server_with_admin_pass
682 else:
683 rescue_schema = schema.rescue_server
684 return self.action(server_id, 'rescue', rescue_schema, **kwargs)
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500685
686 def unrescue_server(self, server_id):
Lv Fumei7e326332016-07-08 15:18:03 +0800687 """Unrescue the provided server.
688
Dong Mad12c2332016-10-19 01:36:27 -0700689 For a full list of available parameters, please refer to the official
690 API reference:
Andreas Jaegerbf30ae72019-07-22 19:22:57 +0200691 https://docs.openstack.org/api-ref/compute/#unrescue-server-unrescue-action
Lv Fumei7e326332016-07-08 15:18:03 +0800692 """
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500693 return self.action(server_id, 'unrescue')
694
695 def show_server_diagnostics(self, server_id):
696 """Get the usage data for a server."""
697 resp, body = self.get("servers/%s/diagnostics" % server_id)
Sergey Nikitin0cb4f222017-02-03 13:16:33 +0400698 body = json.loads(body)
699 schema = self.get_schema(self.schema_versions_info)
700 self.validate_response(schema.show_server_diagnostics, resp, body)
701 return rest_client.ResponseBody(resp, body)
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500702
703 def list_instance_actions(self, server_id):
704 """List the provided server action."""
705 resp, body = self.get("servers/%s/os-instance-actions" %
706 server_id)
707 body = json.loads(body)
708 self.validate_response(schema.list_instance_actions, resp, body)
709 return rest_client.ResponseBody(resp, body)
710
711 def show_instance_action(self, server_id, request_id):
712 """Returns the action details of the provided server."""
713 resp, body = self.get("servers/%s/os-instance-actions/%s" %
714 (server_id, request_id))
715 body = json.loads(body)
716 self.validate_response(schema.show_instance_action, resp, body)
717 return rest_client.ResponseBody(resp, body)
718
719 def force_delete_server(self, server_id, **kwargs):
720 """Force delete a server.
721
Dong Mad12c2332016-10-19 01:36:27 -0700722 For a full list of available parameters, please refer to the official
723 API reference:
Andreas Jaegerbf30ae72019-07-22 19:22:57 +0200724 https://docs.openstack.org/api-ref/compute/#force-delete-server-forcedelete-action
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500725 """
726 return self.action(server_id, 'forceDelete', **kwargs)
727
728 def restore_soft_deleted_server(self, server_id, **kwargs):
729 """Restore a soft-deleted server.
730
Dong Mad12c2332016-10-19 01:36:27 -0700731 For a full list of available parameters, please refer to the official
732 API reference:
Andreas Jaegerbf30ae72019-07-22 19:22:57 +0200733 https://docs.openstack.org/api-ref/compute/#restore-soft-deleted-instance-restore-action
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500734 """
735 return self.action(server_id, 'restore', **kwargs)
736
737 def reset_network(self, server_id, **kwargs):
738 """Reset the Network of a server.
739
Dong Mad12c2332016-10-19 01:36:27 -0700740 For a full list of available parameters, please refer to the official
741 API reference:
Andreas Jaegerbf30ae72019-07-22 19:22:57 +0200742 https://docs.openstack.org/api-ref/compute/#reset-networking-on-a-server-resetnetwork-action
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500743 """
744 return self.action(server_id, 'resetNetwork', **kwargs)
745
746 def inject_network_info(self, server_id, **kwargs):
747 """Inject the Network Info into server.
748
Dong Mad12c2332016-10-19 01:36:27 -0700749 For a full list of available parameters, please refer to the official
750 API reference:
Andreas Jaegerbf30ae72019-07-22 19:22:57 +0200751 https://docs.openstack.org/api-ref/compute/#inject-network-information-injectnetworkinfo-action
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500752 """
753 return self.action(server_id, 'injectNetworkInfo', **kwargs)
754
755 def get_vnc_console(self, server_id, **kwargs):
756 """Get URL of VNC console.
757
Dong Mad12c2332016-10-19 01:36:27 -0700758 For a full list of available parameters, please refer to the official
759 API reference:
Andreas Jaegerbf30ae72019-07-22 19:22:57 +0200760 https://docs.openstack.org/api-ref/compute/#get-vnc-console-os-getvncconsole-action-deprecated
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500761 """
762 return self.action(server_id, "os-getVNCConsole",
763 schema.get_vnc_console, **kwargs)
764
765 def add_fixed_ip(self, server_id, **kwargs):
766 """Add a fixed IP to server instance.
767
Dong Mad12c2332016-10-19 01:36:27 -0700768 For a full list of available parameters, please refer to the official
769 API reference:
Andreas Jaegerbf30ae72019-07-22 19:22:57 +0200770 https://docs.openstack.org/api-ref/compute/#add-associate-fixed-ip-addfixedip-action-deprecated
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500771 """
772 return self.action(server_id, 'addFixedIp', **kwargs)
773
774 def remove_fixed_ip(self, server_id, **kwargs):
775 """Remove input fixed IP from input server instance.
776
Dong Mad12c2332016-10-19 01:36:27 -0700777 For a full list of available parameters, please refer to the official
778 API reference:
Andreas Jaegerbf30ae72019-07-22 19:22:57 +0200779 https://docs.openstack.org/api-ref/compute/#remove-disassociate-fixed-ip-removefixedip-action-deprecated
Matthew Treinish9e26ca82016-02-23 11:43:20 -0500780 """
781 return self.action(server_id, 'removeFixedIp', **kwargs)
zwhe3beb6cf2017-02-09 16:59:41 +0800782
783 def list_security_groups_by_server(self, server_id):
784 """Lists security groups for a server.
785
786 For a full list of available parameters, please refer to the official
787 API reference:
Andreas Jaegerbf30ae72019-07-22 19:22:57 +0200788 https://docs.openstack.org/api-ref/compute/#list-security-groups-by-server
zwhe3beb6cf2017-02-09 16:59:41 +0800789 """
790 resp, body = self.get("servers/%s/os-security-groups" % server_id)
791 body = json.loads(body)
792 self.validate_response(security_groups_schema.list_security_groups,
793 resp, body)
794 return rest_client.ResponseBody(resp, body)
Felipe Monteiro7c95bef2017-02-17 18:49:02 -0500795
796 def list_tags(self, server_id):
797 """Lists all tags for a server.
798
799 For a full list of available parameters, please refer to the official
800 API reference:
Andreas Jaegerbf30ae72019-07-22 19:22:57 +0200801 https://docs.openstack.org/api-ref/compute/#list-tags
Felipe Monteiro7c95bef2017-02-17 18:49:02 -0500802 """
803 url = 'servers/%s/tags' % server_id
804 resp, body = self.get(url)
805 body = json.loads(body)
806 schema = self.get_schema(self.schema_versions_info)
807 self.validate_response(schema.list_tags, resp, body)
808 return rest_client.ResponseBody(resp, body)
809
810 def update_all_tags(self, server_id, tags):
811 """Replaces all tags on specified server with the new set of tags.
812
813 For a full list of available parameters, please refer to the official
814 API reference:
Andreas Jaegerbf30ae72019-07-22 19:22:57 +0200815 https://docs.openstack.org/api-ref/compute/#replace-tags
Felipe Monteiro7c95bef2017-02-17 18:49:02 -0500816
817 :param tags: List of tags to replace current server tags with.
818 """
819 url = 'servers/%s/tags' % server_id
820 put_body = {'tags': tags}
821 resp, body = self.put(url, json.dumps(put_body))
822 body = json.loads(body)
823 schema = self.get_schema(self.schema_versions_info)
824 self.validate_response(schema.update_all_tags, resp, body)
825 return rest_client.ResponseBody(resp, body)
826
827 def delete_all_tags(self, server_id):
828 """Deletes all tags from the specified server.
829
830 For a full list of available parameters, please refer to the official
831 API reference:
Andreas Jaegerbf30ae72019-07-22 19:22:57 +0200832 https://docs.openstack.org/api-ref/compute/#delete-all-tags
Felipe Monteiro7c95bef2017-02-17 18:49:02 -0500833 """
834 url = 'servers/%s/tags' % server_id
835 resp, body = self.delete(url)
836 schema = self.get_schema(self.schema_versions_info)
837 self.validate_response(schema.delete_all_tags, resp, body)
838 return rest_client.ResponseBody(resp, body)
839
840 def check_tag_existence(self, server_id, tag):
841 """Checks tag existence on the server.
842
843 For a full list of available parameters, please refer to the official
844 API reference:
Andreas Jaegerbf30ae72019-07-22 19:22:57 +0200845 https://docs.openstack.org/api-ref/compute/#check-tag-existence
Felipe Monteiro7c95bef2017-02-17 18:49:02 -0500846
847 :param tag: Check for existence of tag on specified server.
848 """
849 url = 'servers/%s/tags/%s' % (server_id, tag)
850 resp, body = self.get(url)
851 schema = self.get_schema(self.schema_versions_info)
852 self.validate_response(schema.check_tag_existence, resp, body)
853 return rest_client.ResponseBody(resp, body)
854
855 def update_tag(self, server_id, tag):
856 """Adds a single tag to the server if server has no specified tag.
857
858 For a full list of available parameters, please refer to the official
859 API reference:
Andreas Jaegerbf30ae72019-07-22 19:22:57 +0200860 https://docs.openstack.org/api-ref/compute/#add-a-single-tag
Felipe Monteiro7c95bef2017-02-17 18:49:02 -0500861
862 :param tag: Tag to be added to the specified server.
863 """
864 url = 'servers/%s/tags/%s' % (server_id, tag)
865 resp, body = self.put(url, None)
866 schema = self.get_schema(self.schema_versions_info)
867 self.validate_response(schema.update_tag, resp, body)
868 return rest_client.ResponseBody(resp, body)
869
870 def delete_tag(self, server_id, tag):
871 """Deletes a single tag from the specified server.
872
873 For a full list of available parameters, please refer to the official
874 API reference:
Andreas Jaegerbf30ae72019-07-22 19:22:57 +0200875 https://docs.openstack.org/api-ref/compute/#delete-a-single-tag
Felipe Monteiro7c95bef2017-02-17 18:49:02 -0500876
877 :param tag: Tag to be removed from the specified server.
878 """
879 url = 'servers/%s/tags/%s' % (server_id, tag)
880 resp, body = self.delete(url)
881 schema = self.get_schema(self.schema_versions_info)
882 self.validate_response(schema.delete_tag, resp, body)
883 return rest_client.ResponseBody(resp, body)
raiesmh0814158c92017-03-21 14:23:15 +0530884
885 def evacuate_server(self, server_id, **kwargs):
886 """Evacuate the given server.
887
888 For a full list of available parameters, please refer to the official
889 API reference:
Andreas Jaegerbf30ae72019-07-22 19:22:57 +0200890 https://docs.openstack.org/api-ref/compute/#evacuate-server-evacuate-action
raiesmh0814158c92017-03-21 14:23:15 +0530891 """
892 if self.enable_instance_password:
893 evacuate_schema = schema.evacuate_server_with_admin_pass
894 else:
895 evacuate_schema = schema.evacuate_server
896
897 return self.action(server_id, 'evacuate',
898 evacuate_schema,
899 **kwargs)