root / lib / rapi / rlib2.py @ c41eea6e
History | View | Annotate | Download (9.7 kB)
1 | 10b207d4 | Oleksiy Mishchenko | #
|
---|---|---|---|
2 | 10b207d4 | Oleksiy Mishchenko | #
|
3 | 10b207d4 | Oleksiy Mishchenko | |
4 | 10b207d4 | Oleksiy Mishchenko | # Copyright (C) 2006, 2007, 2008 Google Inc.
|
5 | 10b207d4 | Oleksiy Mishchenko | #
|
6 | 10b207d4 | Oleksiy Mishchenko | # This program is free software; you can redistribute it and/or modify
|
7 | 10b207d4 | Oleksiy Mishchenko | # it under the terms of the GNU General Public License as published by
|
8 | 10b207d4 | Oleksiy Mishchenko | # the Free Software Foundation; either version 2 of the License, or
|
9 | 10b207d4 | Oleksiy Mishchenko | # (at your option) any later version.
|
10 | 10b207d4 | Oleksiy Mishchenko | #
|
11 | 10b207d4 | Oleksiy Mishchenko | # This program is distributed in the hope that it will be useful, but
|
12 | 10b207d4 | Oleksiy Mishchenko | # WITHOUT ANY WARRANTY; without even the implied warranty of
|
13 | 10b207d4 | Oleksiy Mishchenko | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
14 | 10b207d4 | Oleksiy Mishchenko | # General Public License for more details.
|
15 | 10b207d4 | Oleksiy Mishchenko | #
|
16 | 10b207d4 | Oleksiy Mishchenko | # You should have received a copy of the GNU General Public License
|
17 | 10b207d4 | Oleksiy Mishchenko | # along with this program; if not, write to the Free Software
|
18 | 10b207d4 | Oleksiy Mishchenko | # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
19 | 10b207d4 | Oleksiy Mishchenko | # 02110-1301, USA.
|
20 | 10b207d4 | Oleksiy Mishchenko | |
21 | 10b207d4 | Oleksiy Mishchenko | |
22 | 10b207d4 | Oleksiy Mishchenko | """Remote API version 2 baserlib.library.
|
23 | 10b207d4 | Oleksiy Mishchenko |
|
24 | 10b207d4 | Oleksiy Mishchenko | """
|
25 | 10b207d4 | Oleksiy Mishchenko | |
26 | 10b207d4 | Oleksiy Mishchenko | import ganeti.opcodes |
27 | 15fd9fd5 | Oleksiy Mishchenko | from ganeti import http |
28 | 10b207d4 | Oleksiy Mishchenko | from ganeti import luxi |
29 | 15fd9fd5 | Oleksiy Mishchenko | from ganeti import constants |
30 | 38206f3c | Iustin Pop | from ganeti.rapi import baserlib |
31 | 10b207d4 | Oleksiy Mishchenko | |
32 | 51ee2f49 | Oleksiy Mishchenko | from ganeti.rapi.rlib1 import I_FIELDS, N_FIELDS |
33 | 51ee2f49 | Oleksiy Mishchenko | |
34 | 10b207d4 | Oleksiy Mishchenko | |
35 | 10b207d4 | Oleksiy Mishchenko | class R_2_jobs(baserlib.R_Generic): |
36 | 10b207d4 | Oleksiy Mishchenko | """/2/jobs resource.
|
37 | 10b207d4 | Oleksiy Mishchenko |
|
38 | 10b207d4 | Oleksiy Mishchenko | """
|
39 | 10b207d4 | Oleksiy Mishchenko | DOC_URI = "/2/jobs"
|
40 | 10b207d4 | Oleksiy Mishchenko | |
41 | 10b207d4 | Oleksiy Mishchenko | def GET(self): |
42 | 10b207d4 | Oleksiy Mishchenko | """Returns a dictionary of jobs.
|
43 | 10b207d4 | Oleksiy Mishchenko |
|
44 | c41eea6e | Iustin Pop | @return: a dictionary with jobs id and uri.
|
45 | 38206f3c | Iustin Pop |
|
46 | 10b207d4 | Oleksiy Mishchenko | """
|
47 | 10b207d4 | Oleksiy Mishchenko | fields = ["id"]
|
48 | 10b207d4 | Oleksiy Mishchenko | # Convert the list of lists to the list of ids
|
49 | 10b207d4 | Oleksiy Mishchenko | result = [job_id for [job_id] in luxi.Client().QueryJobs(None, fields)] |
50 | 10b207d4 | Oleksiy Mishchenko | return baserlib.BuildUriList(result, "/2/jobs/%s", uri_fields=("id", "uri")) |
51 | 10b207d4 | Oleksiy Mishchenko | |
52 | 10b207d4 | Oleksiy Mishchenko | |
53 | 10b207d4 | Oleksiy Mishchenko | class R_2_jobs_id(baserlib.R_Generic): |
54 | 10b207d4 | Oleksiy Mishchenko | """/2/jobs/[job_id] resource.
|
55 | 10b207d4 | Oleksiy Mishchenko |
|
56 | 10b207d4 | Oleksiy Mishchenko | """
|
57 | 10b207d4 | Oleksiy Mishchenko | DOC_URI = "/2/jobs/[job_id]"
|
58 | 10b207d4 | Oleksiy Mishchenko | |
59 | 10b207d4 | Oleksiy Mishchenko | def GET(self): |
60 | 10b207d4 | Oleksiy Mishchenko | """Returns a job status.
|
61 | 10b207d4 | Oleksiy Mishchenko |
|
62 | c41eea6e | Iustin Pop | @return: a dictionary with job parameters.
|
63 | c41eea6e | Iustin Pop | The result includes:
|
64 | c41eea6e | Iustin Pop | - id: job ID as a number
|
65 | c41eea6e | Iustin Pop | - status: current job status as a string
|
66 | c41eea6e | Iustin Pop | - ops: involved OpCodes as a list of dictionaries for each
|
67 | c41eea6e | Iustin Pop | opcodes in the job
|
68 | c41eea6e | Iustin Pop | - opstatus: OpCodes status as a list
|
69 | c41eea6e | Iustin Pop | - opresult: OpCodes results as a list of lists
|
70 | 38206f3c | Iustin Pop |
|
71 | 10b207d4 | Oleksiy Mishchenko | """
|
72 | 10b207d4 | Oleksiy Mishchenko | fields = ["id", "ops", "status", "opstatus", "opresult"] |
73 | 10b207d4 | Oleksiy Mishchenko | job_id = self.items[0] |
74 | 38206f3c | Iustin Pop | result = luxi.Client().QueryJobs([job_id, ], fields)[0]
|
75 | 10b207d4 | Oleksiy Mishchenko | return baserlib.MapFields(fields, result)
|
76 | 10b207d4 | Oleksiy Mishchenko | |
77 | c7f5f338 | Oleksiy Mishchenko | def DELETE(self): |
78 | c7f5f338 | Oleksiy Mishchenko | """Cancel not-yet-started job.
|
79 | c7f5f338 | Oleksiy Mishchenko |
|
80 | c7f5f338 | Oleksiy Mishchenko | """
|
81 | c7f5f338 | Oleksiy Mishchenko | job_id = self.items[0] |
82 | c7f5f338 | Oleksiy Mishchenko | result = luxi.Client().CancelJob(job_id) |
83 | c7f5f338 | Oleksiy Mishchenko | return result
|
84 | c7f5f338 | Oleksiy Mishchenko | |
85 | 10b207d4 | Oleksiy Mishchenko | |
86 | 10b207d4 | Oleksiy Mishchenko | class R_2_nodes(baserlib.R_Generic): |
87 | 10b207d4 | Oleksiy Mishchenko | """/2/nodes resource.
|
88 | 10b207d4 | Oleksiy Mishchenko |
|
89 | 10b207d4 | Oleksiy Mishchenko | """
|
90 | 10b207d4 | Oleksiy Mishchenko | DOC_URI = "/2/nodes"
|
91 | 38206f3c | Iustin Pop | |
92 | 10b207d4 | Oleksiy Mishchenko | def GET(self): |
93 | 10b207d4 | Oleksiy Mishchenko | """Returns a list of all nodes.
|
94 | 38206f3c | Iustin Pop |
|
95 | c41eea6e | Iustin Pop | Example::
|
96 | 10b207d4 | Oleksiy Mishchenko |
|
97 | c41eea6e | Iustin Pop | [
|
98 | 10b207d4 | Oleksiy Mishchenko | {
|
99 | 10b207d4 | Oleksiy Mishchenko | "id": "node1.example.com",
|
100 | 10b207d4 | Oleksiy Mishchenko | "uri": "\/instances\/node1.example.com"
|
101 | 10b207d4 | Oleksiy Mishchenko | },
|
102 | 10b207d4 | Oleksiy Mishchenko | {
|
103 | 10b207d4 | Oleksiy Mishchenko | "id": "node2.example.com",
|
104 | 10b207d4 | Oleksiy Mishchenko | "uri": "\/instances\/node2.example.com"
|
105 | c41eea6e | Iustin Pop | }
|
106 | c41eea6e | Iustin Pop | ]
|
107 | 10b207d4 | Oleksiy Mishchenko |
|
108 | 38206f3c | Iustin Pop | If the optional 'bulk' argument is provided and set to 'true'
|
109 | 10b207d4 | Oleksiy Mishchenko | value (i.e '?bulk=1'), the output contains detailed
|
110 | 10b207d4 | Oleksiy Mishchenko | information about nodes as a list.
|
111 | 10b207d4 | Oleksiy Mishchenko |
|
112 | c41eea6e | Iustin Pop | Example::
|
113 | c41eea6e | Iustin Pop |
|
114 | c41eea6e | Iustin Pop | [
|
115 | 10b207d4 | Oleksiy Mishchenko | {
|
116 | 10b207d4 | Oleksiy Mishchenko | "pinst_cnt": 1,
|
117 | 10b207d4 | Oleksiy Mishchenko | "mfree": 31280,
|
118 | 10b207d4 | Oleksiy Mishchenko | "mtotal": 32763,
|
119 | 10b207d4 | Oleksiy Mishchenko | "name": "www.example.com",
|
120 | 10b207d4 | Oleksiy Mishchenko | "tags": [],
|
121 | 10b207d4 | Oleksiy Mishchenko | "mnode": 512,
|
122 | 10b207d4 | Oleksiy Mishchenko | "dtotal": 5246208,
|
123 | 10b207d4 | Oleksiy Mishchenko | "sinst_cnt": 2,
|
124 | 10b207d4 | Oleksiy Mishchenko | "dfree": 5171712
|
125 | 10b207d4 | Oleksiy Mishchenko | },
|
126 | 10b207d4 | Oleksiy Mishchenko | ...
|
127 | c41eea6e | Iustin Pop | ]
|
128 | c41eea6e | Iustin Pop |
|
129 | c41eea6e | Iustin Pop | @return: a dictionary with 'name' and 'uri' keys for each of them
|
130 | 10b207d4 | Oleksiy Mishchenko |
|
131 | 10b207d4 | Oleksiy Mishchenko | """
|
132 | a0dcf7c2 | Oleksiy Mishchenko | client = luxi.Client() |
133 | a0dcf7c2 | Oleksiy Mishchenko | nodesdata = client.QueryNodes([], ["name"])
|
134 | a0dcf7c2 | Oleksiy Mishchenko | nodeslist = [row[0] for row in nodesdata] |
135 | 38206f3c | Iustin Pop | |
136 | 10b207d4 | Oleksiy Mishchenko | if 'bulk' in self.queryargs: |
137 | a0dcf7c2 | Oleksiy Mishchenko | bulkdata = client.QueryNodes(nodeslist, N_FIELDS) |
138 | a0dcf7c2 | Oleksiy Mishchenko | return baserlib.MapBulkFields(bulkdata, N_FIELDS)
|
139 | 10b207d4 | Oleksiy Mishchenko | |
140 | 441e7cfd | Oleksiy Mishchenko | return baserlib.BuildUriList(nodeslist, "/2/nodes/%s", |
141 | 38206f3c | Iustin Pop | uri_fields=("id", "uri")) |
142 | 441e7cfd | Oleksiy Mishchenko | |
143 | 441e7cfd | Oleksiy Mishchenko | |
144 | 028c6b76 | Oleksiy Mishchenko | class R_nodes(R_2_nodes): |
145 | 028c6b76 | Oleksiy Mishchenko | """/nodes resource
|
146 | 028c6b76 | Oleksiy Mishchenko |
|
147 | 028c6b76 | Oleksiy Mishchenko | """
|
148 | 028c6b76 | Oleksiy Mishchenko | # TODO: Temporary resource will be deprecated
|
149 | 028c6b76 | Oleksiy Mishchenko | DOC_URI = "/nodes"
|
150 | 028c6b76 | Oleksiy Mishchenko | |
151 | 028c6b76 | Oleksiy Mishchenko | |
152 | 441e7cfd | Oleksiy Mishchenko | class R_2_instances(baserlib.R_Generic): |
153 | 441e7cfd | Oleksiy Mishchenko | """/2/instances resource.
|
154 | 441e7cfd | Oleksiy Mishchenko |
|
155 | 441e7cfd | Oleksiy Mishchenko | """
|
156 | 441e7cfd | Oleksiy Mishchenko | DOC_URI = "/2/instances"
|
157 | 441e7cfd | Oleksiy Mishchenko | |
158 | 441e7cfd | Oleksiy Mishchenko | def GET(self): |
159 | 441e7cfd | Oleksiy Mishchenko | """Returns a list of all available instances.
|
160 | 441e7cfd | Oleksiy Mishchenko |
|
161 | 441e7cfd | Oleksiy Mishchenko |
|
162 | c41eea6e | Iustin Pop | Example::
|
163 | c41eea6e | Iustin Pop |
|
164 | c41eea6e | Iustin Pop | [
|
165 | 441e7cfd | Oleksiy Mishchenko | {
|
166 | 441e7cfd | Oleksiy Mishchenko | "name": "web.example.com",
|
167 | 441e7cfd | Oleksiy Mishchenko | "uri": "\/instances\/web.example.com"
|
168 | 441e7cfd | Oleksiy Mishchenko | },
|
169 | 441e7cfd | Oleksiy Mishchenko | {
|
170 | 441e7cfd | Oleksiy Mishchenko | "name": "mail.example.com",
|
171 | 441e7cfd | Oleksiy Mishchenko | "uri": "\/instances\/mail.example.com"
|
172 | c41eea6e | Iustin Pop | }
|
173 | c41eea6e | Iustin Pop | ]
|
174 | 441e7cfd | Oleksiy Mishchenko |
|
175 | 441e7cfd | Oleksiy Mishchenko | If the optional 'bulk' argument is provided and set to 'true'
|
176 | 441e7cfd | Oleksiy Mishchenko | value (i.e '?bulk=1'), the output contains detailed
|
177 | 441e7cfd | Oleksiy Mishchenko | information about instances as a list.
|
178 | 441e7cfd | Oleksiy Mishchenko |
|
179 | c41eea6e | Iustin Pop | Example::
|
180 | c41eea6e | Iustin Pop |
|
181 | c41eea6e | Iustin Pop | [
|
182 | 441e7cfd | Oleksiy Mishchenko | {
|
183 | 441e7cfd | Oleksiy Mishchenko | "status": "running",
|
184 | 441e7cfd | Oleksiy Mishchenko | "bridge": "xen-br0",
|
185 | 441e7cfd | Oleksiy Mishchenko | "name": "web.example.com",
|
186 | 441e7cfd | Oleksiy Mishchenko | "tags": ["tag1", "tag2"],
|
187 | 441e7cfd | Oleksiy Mishchenko | "admin_ram": 512,
|
188 | 441e7cfd | Oleksiy Mishchenko | "sda_size": 20480,
|
189 | 441e7cfd | Oleksiy Mishchenko | "pnode": "node1.example.com",
|
190 | 441e7cfd | Oleksiy Mishchenko | "mac": "01:23:45:67:89:01",
|
191 | 441e7cfd | Oleksiy Mishchenko | "sdb_size": 4096,
|
192 | 441e7cfd | Oleksiy Mishchenko | "snodes": ["node2.example.com"],
|
193 | 441e7cfd | Oleksiy Mishchenko | "disk_template": "drbd",
|
194 | 441e7cfd | Oleksiy Mishchenko | "ip": null,
|
195 | 441e7cfd | Oleksiy Mishchenko | "admin_state": true,
|
196 | 441e7cfd | Oleksiy Mishchenko | "os": "debian-etch",
|
197 | 441e7cfd | Oleksiy Mishchenko | "vcpus": 2,
|
198 | 441e7cfd | Oleksiy Mishchenko | "oper_state": true
|
199 | 441e7cfd | Oleksiy Mishchenko | },
|
200 | 441e7cfd | Oleksiy Mishchenko | ...
|
201 | c41eea6e | Iustin Pop | ]
|
202 | c41eea6e | Iustin Pop |
|
203 | c41eea6e | Iustin Pop | @returns: a dictionary with 'name' and 'uri' keys for each of them.
|
204 | 441e7cfd | Oleksiy Mishchenko |
|
205 | 441e7cfd | Oleksiy Mishchenko | """
|
206 | a0dcf7c2 | Oleksiy Mishchenko | client = luxi.Client() |
207 | a0dcf7c2 | Oleksiy Mishchenko | instancesdata = client.QueryInstances([], ["name"])
|
208 | a0dcf7c2 | Oleksiy Mishchenko | instanceslist = [row[0] for row in instancesdata] |
209 | 441e7cfd | Oleksiy Mishchenko | |
210 | 441e7cfd | Oleksiy Mishchenko | |
211 | a0dcf7c2 | Oleksiy Mishchenko | if 'bulk' in self.queryargs: |
212 | a0dcf7c2 | Oleksiy Mishchenko | bulkdata = client.QueryInstances(instanceslist, I_FIELDS) |
213 | a0dcf7c2 | Oleksiy Mishchenko | return baserlib.MapBulkFields(bulkdata, I_FIELDS)
|
214 | 441e7cfd | Oleksiy Mishchenko | |
215 | 441e7cfd | Oleksiy Mishchenko | else:
|
216 | 441e7cfd | Oleksiy Mishchenko | return baserlib.BuildUriList(instanceslist, "/2/instances/%s", |
217 | 441e7cfd | Oleksiy Mishchenko | uri_fields=("id", "uri")) |
218 | 441e7cfd | Oleksiy Mishchenko | |
219 | 21f04e5e | Oleksiy Mishchenko | def POST(self): |
220 | 2f7635f4 | Oleksiy Mishchenko | """Create an instance.
|
221 | 2f7635f4 | Oleksiy Mishchenko |
|
222 | c41eea6e | Iustin Pop | @returns: a job id
|
223 | 2f7635f4 | Oleksiy Mishchenko |
|
224 | 2f7635f4 | Oleksiy Mishchenko | """
|
225 | 212fa3a7 | Oleksiy Mishchenko | opts = self.req.request_post_data
|
226 | 2f7635f4 | Oleksiy Mishchenko | |
227 | d50b3059 | Oleksiy Mishchenko | beparams = baserlib.MakeParamsDict(opts, constants.BES_PARAMETERS) |
228 | d50b3059 | Oleksiy Mishchenko | hvparams = baserlib.MakeParamsDict(opts, constants.HVS_PARAMETERS) |
229 | 2f7635f4 | Oleksiy Mishchenko | |
230 | 2f7635f4 | Oleksiy Mishchenko | op = ganeti.opcodes.OpCreateInstance( |
231 | 2f7635f4 | Oleksiy Mishchenko | instance_name=opts.get('name'),
|
232 | 2f7635f4 | Oleksiy Mishchenko | disk_size=opts.get('size', 20 * 1024), |
233 | 2f7635f4 | Oleksiy Mishchenko | swap_size=opts.get('swap', 4 * 1024), |
234 | 2f7635f4 | Oleksiy Mishchenko | disk_template=opts.get('disk_template', None), |
235 | 2f7635f4 | Oleksiy Mishchenko | mode=constants.INSTANCE_CREATE, |
236 | 2f7635f4 | Oleksiy Mishchenko | os_type=opts.get('os'),
|
237 | 2f7635f4 | Oleksiy Mishchenko | pnode=opts.get('pnode'),
|
238 | 2f7635f4 | Oleksiy Mishchenko | snode=opts.get('snode'),
|
239 | 2f7635f4 | Oleksiy Mishchenko | ip=opts.get('ip', 'none'), |
240 | 2f7635f4 | Oleksiy Mishchenko | bridge=opts.get('bridge', None), |
241 | 2f7635f4 | Oleksiy Mishchenko | start=opts.get('start', True), |
242 | 2f7635f4 | Oleksiy Mishchenko | ip_check=opts.get('ip_check', True), |
243 | 2f7635f4 | Oleksiy Mishchenko | wait_for_sync=opts.get('wait_for_sync', True), |
244 | 2f7635f4 | Oleksiy Mishchenko | mac=opts.get('mac', 'auto'), |
245 | 2f7635f4 | Oleksiy Mishchenko | hypervisor=opts.get('hypervisor', None), |
246 | d50b3059 | Oleksiy Mishchenko | hvparams=hvparams, |
247 | 2f7635f4 | Oleksiy Mishchenko | beparams=beparams, |
248 | 2f7635f4 | Oleksiy Mishchenko | iallocator=opts.get('iallocator', None), |
249 | 2f7635f4 | Oleksiy Mishchenko | file_storage_dir=opts.get('file_storage_dir', None), |
250 | 2f7635f4 | Oleksiy Mishchenko | file_driver=opts.get('file_driver', 'loop'), |
251 | 2f7635f4 | Oleksiy Mishchenko | ) |
252 | 2f7635f4 | Oleksiy Mishchenko | |
253 | 2f7635f4 | Oleksiy Mishchenko | job_id = ganeti.cli.SendJob([op]) |
254 | 2f7635f4 | Oleksiy Mishchenko | return job_id
|
255 | 2f7635f4 | Oleksiy Mishchenko | |
256 | 441e7cfd | Oleksiy Mishchenko | |
257 | 028c6b76 | Oleksiy Mishchenko | class R_instances(R_2_instances): |
258 | 028c6b76 | Oleksiy Mishchenko | """/instances resource.
|
259 | 028c6b76 | Oleksiy Mishchenko |
|
260 | 028c6b76 | Oleksiy Mishchenko | """
|
261 | 028c6b76 | Oleksiy Mishchenko | # TODO: Temporary resource will be deprecated
|
262 | 028c6b76 | Oleksiy Mishchenko | DOC_URI = "/instances"
|
263 | 028c6b76 | Oleksiy Mishchenko | |
264 | 028c6b76 | Oleksiy Mishchenko | |
265 | 2276aa29 | Oleksiy Mishchenko | class R_2_instances_name_reboot(baserlib.R_Generic): |
266 | 2276aa29 | Oleksiy Mishchenko | """/2/instances/[instance_name]/reboot resource.
|
267 | 2276aa29 | Oleksiy Mishchenko |
|
268 | 2276aa29 | Oleksiy Mishchenko | Implements an instance reboot.
|
269 | 2276aa29 | Oleksiy Mishchenko |
|
270 | 2276aa29 | Oleksiy Mishchenko | """
|
271 | 2276aa29 | Oleksiy Mishchenko | |
272 | 2276aa29 | Oleksiy Mishchenko | DOC_URI = "/2/instances/[instance_name]/reboot"
|
273 | 2276aa29 | Oleksiy Mishchenko | |
274 | 21f04e5e | Oleksiy Mishchenko | def POST(self): |
275 | 2276aa29 | Oleksiy Mishchenko | """Reboot an instance.
|
276 | 2276aa29 | Oleksiy Mishchenko |
|
277 | 0c55c24b | Oleksiy Mishchenko | The URI takes type=[hard|soft|full] and
|
278 | 0c55c24b | Oleksiy Mishchenko | ignore_secondaries=[False|True] parameters.
|
279 | 0c55c24b | Oleksiy Mishchenko |
|
280 | 2276aa29 | Oleksiy Mishchenko | """
|
281 | 2276aa29 | Oleksiy Mishchenko | instance_name = self.items[0] |
282 | 0c55c24b | Oleksiy Mishchenko | reboot_type = self.queryargs.get('type', |
283 | 0c55c24b | Oleksiy Mishchenko | [constants.INSTANCE_REBOOT_HARD])[0]
|
284 | 0c55c24b | Oleksiy Mishchenko | ignore_secondaries = bool(self.queryargs.get('ignore_secondaries', |
285 | 0c55c24b | Oleksiy Mishchenko | [False])[0]) |
286 | 2276aa29 | Oleksiy Mishchenko | op = ganeti.opcodes.OpRebootInstance( |
287 | 2276aa29 | Oleksiy Mishchenko | instance_name=instance_name, |
288 | 2276aa29 | Oleksiy Mishchenko | reboot_type=reboot_type, |
289 | 2276aa29 | Oleksiy Mishchenko | ignore_secondaries=ignore_secondaries) |
290 | 2276aa29 | Oleksiy Mishchenko | |
291 | 2276aa29 | Oleksiy Mishchenko | job_id = ganeti.cli.SendJob([op]) |
292 | 2276aa29 | Oleksiy Mishchenko | |
293 | 2276aa29 | Oleksiy Mishchenko | return job_id
|
294 | 2276aa29 | Oleksiy Mishchenko | |
295 | 2276aa29 | Oleksiy Mishchenko | |
296 | 0c55c24b | Oleksiy Mishchenko | class R_2_instances_name_startup(baserlib.R_Generic): |
297 | 0c55c24b | Oleksiy Mishchenko | """/2/instances/[instance_name]/startup resource.
|
298 | 0c55c24b | Oleksiy Mishchenko |
|
299 | 0c55c24b | Oleksiy Mishchenko | Implements an instance startup.
|
300 | 0c55c24b | Oleksiy Mishchenko |
|
301 | 0c55c24b | Oleksiy Mishchenko | """
|
302 | 0c55c24b | Oleksiy Mishchenko | |
303 | 0c55c24b | Oleksiy Mishchenko | DOC_URI = "/2/instances/[instance_name]/startup"
|
304 | 0c55c24b | Oleksiy Mishchenko | |
305 | 21f04e5e | Oleksiy Mishchenko | def PUT(self): |
306 | 0c55c24b | Oleksiy Mishchenko | """Startup an instance.
|
307 | 0c55c24b | Oleksiy Mishchenko |
|
308 | c41eea6e | Iustin Pop | The URI takes force=[False|True] parameter to start the instance
|
309 | c41eea6e | Iustin Pop | if even if secondary disks are failing.
|
310 | 0c55c24b | Oleksiy Mishchenko |
|
311 | 0c55c24b | Oleksiy Mishchenko | """
|
312 | 0c55c24b | Oleksiy Mishchenko | instance_name = self.items[0] |
313 | 0c55c24b | Oleksiy Mishchenko | force_startup = bool(self.queryargs.get('force', [False])[0]) |
314 | 0c55c24b | Oleksiy Mishchenko | op = ganeti.opcodes.OpStartupInstance(instance_name=instance_name, |
315 | 0c55c24b | Oleksiy Mishchenko | force=force_startup) |
316 | 0c55c24b | Oleksiy Mishchenko | |
317 | 0c55c24b | Oleksiy Mishchenko | job_id = ganeti.cli.SendJob([op]) |
318 | 0c55c24b | Oleksiy Mishchenko | |
319 | 0c55c24b | Oleksiy Mishchenko | return job_id
|
320 | 0c55c24b | Oleksiy Mishchenko | |
321 | 0c55c24b | Oleksiy Mishchenko | |
322 | 0c55c24b | Oleksiy Mishchenko | class R_2_instances_name_shutdown(baserlib.R_Generic): |
323 | 0c55c24b | Oleksiy Mishchenko | """/2/instances/[instance_name]/shutdown resource.
|
324 | 0c55c24b | Oleksiy Mishchenko |
|
325 | 0c55c24b | Oleksiy Mishchenko | Implements an instance shutdown.
|
326 | 0c55c24b | Oleksiy Mishchenko |
|
327 | 0c55c24b | Oleksiy Mishchenko | """
|
328 | 0c55c24b | Oleksiy Mishchenko | |
329 | 0c55c24b | Oleksiy Mishchenko | DOC_URI = "/2/instances/[instance_name]/shutdown"
|
330 | 0c55c24b | Oleksiy Mishchenko | |
331 | 21f04e5e | Oleksiy Mishchenko | def PUT(self): |
332 | 0c55c24b | Oleksiy Mishchenko | """Shutdown an instance.
|
333 | 0c55c24b | Oleksiy Mishchenko |
|
334 | 0c55c24b | Oleksiy Mishchenko | """
|
335 | 0c55c24b | Oleksiy Mishchenko | instance_name = self.items[0] |
336 | 0c55c24b | Oleksiy Mishchenko | op = ganeti.opcodes.OpShutdownInstance(instance_name=instance_name) |
337 | 0c55c24b | Oleksiy Mishchenko | |
338 | 0c55c24b | Oleksiy Mishchenko | job_id = ganeti.cli.SendJob([op]) |
339 | 0c55c24b | Oleksiy Mishchenko | |
340 | 0c55c24b | Oleksiy Mishchenko | return job_id
|
341 | 0c55c24b | Oleksiy Mishchenko | |
342 | 0c55c24b | Oleksiy Mishchenko | |
343 | 441e7cfd | Oleksiy Mishchenko | class R_2_instances_name_tags(baserlib.R_Generic): |
344 | 441e7cfd | Oleksiy Mishchenko | """/2/instances/[instance_name]/tags resource.
|
345 | 441e7cfd | Oleksiy Mishchenko |
|
346 | 441e7cfd | Oleksiy Mishchenko | Manages per-instance tags.
|
347 | 441e7cfd | Oleksiy Mishchenko |
|
348 | 441e7cfd | Oleksiy Mishchenko | """
|
349 | 441e7cfd | Oleksiy Mishchenko | DOC_URI = "/2/instances/[instance_name]/tags"
|
350 | 441e7cfd | Oleksiy Mishchenko | |
351 | 441e7cfd | Oleksiy Mishchenko | def GET(self): |
352 | 441e7cfd | Oleksiy Mishchenko | """Returns a list of instance tags.
|
353 | 441e7cfd | Oleksiy Mishchenko |
|
354 | 441e7cfd | Oleksiy Mishchenko | Example: ["tag1", "tag2", "tag3"]
|
355 | 441e7cfd | Oleksiy Mishchenko |
|
356 | 441e7cfd | Oleksiy Mishchenko | """
|
357 | 441e7cfd | Oleksiy Mishchenko | return baserlib._Tags_GET(constants.TAG_INSTANCE, name=self.items[0]) |
358 | 441e7cfd | Oleksiy Mishchenko | |
359 | 21f04e5e | Oleksiy Mishchenko | def PUT(self): |
360 | 441e7cfd | Oleksiy Mishchenko | """Add a set of tags to the instance.
|
361 | 441e7cfd | Oleksiy Mishchenko |
|
362 | c41eea6e | Iustin Pop | The request as a list of strings should be PUT to this URI. And
|
363 | c41eea6e | Iustin Pop | you'll have back a job id.
|
364 | 441e7cfd | Oleksiy Mishchenko |
|
365 | 441e7cfd | Oleksiy Mishchenko | """
|
366 | 21f04e5e | Oleksiy Mishchenko | return baserlib._Tags_PUT(constants.TAG_INSTANCE,
|
367 | 441e7cfd | Oleksiy Mishchenko | self.post_data, name=self.items[0]) |
368 | 15fd9fd5 | Oleksiy Mishchenko | |
369 | 15fd9fd5 | Oleksiy Mishchenko | def DELETE(self): |
370 | 15fd9fd5 | Oleksiy Mishchenko | """Delete a tag.
|
371 | 15fd9fd5 | Oleksiy Mishchenko |
|
372 | c41eea6e | Iustin Pop | In order to delete a set of tags from a instance, the DELETE
|
373 | c41eea6e | Iustin Pop | request should be addressed to URI like:
|
374 | c41eea6e | Iustin Pop | /2/instances/[instance_name]/tags?tag=[tag]&tag=[tag]
|
375 | 15fd9fd5 | Oleksiy Mishchenko |
|
376 | 15fd9fd5 | Oleksiy Mishchenko | """
|
377 | 15fd9fd5 | Oleksiy Mishchenko | if 'tag' not in self.queryargs: |
378 | 15fd9fd5 | Oleksiy Mishchenko | # no we not gonna delete all tags from an instance
|
379 | 84f2756e | Michael Hanselmann | raise http.HttpNotImplemented()
|
380 | 15fd9fd5 | Oleksiy Mishchenko | return baserlib._Tags_DELETE(constants.TAG_INSTANCE,
|
381 | 15fd9fd5 | Oleksiy Mishchenko | self.queryargs['tag'], |
382 | 15fd9fd5 | Oleksiy Mishchenko | name=self.items[0]) |