root / lib / rapi / rlib2.py @ 0c55c24b
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 | 10b207d4 | Oleksiy Mishchenko | Returns:
|
45 | 10b207d4 | Oleksiy Mishchenko | A dictionary with jobs id and uri.
|
46 | 38206f3c | Iustin Pop |
|
47 | 10b207d4 | Oleksiy Mishchenko | """
|
48 | 10b207d4 | Oleksiy Mishchenko | fields = ["id"]
|
49 | 10b207d4 | Oleksiy Mishchenko | # Convert the list of lists to the list of ids
|
50 | 10b207d4 | Oleksiy Mishchenko | result = [job_id for [job_id] in luxi.Client().QueryJobs(None, fields)] |
51 | 10b207d4 | Oleksiy Mishchenko | return baserlib.BuildUriList(result, "/2/jobs/%s", uri_fields=("id", "uri")) |
52 | 10b207d4 | Oleksiy Mishchenko | |
53 | 10b207d4 | Oleksiy Mishchenko | |
54 | 10b207d4 | Oleksiy Mishchenko | class R_2_jobs_id(baserlib.R_Generic): |
55 | 10b207d4 | Oleksiy Mishchenko | """/2/jobs/[job_id] resource.
|
56 | 10b207d4 | Oleksiy Mishchenko |
|
57 | 10b207d4 | Oleksiy Mishchenko | """
|
58 | 10b207d4 | Oleksiy Mishchenko | DOC_URI = "/2/jobs/[job_id]"
|
59 | 10b207d4 | Oleksiy Mishchenko | |
60 | 10b207d4 | Oleksiy Mishchenko | def GET(self): |
61 | 10b207d4 | Oleksiy Mishchenko | """Returns a job status.
|
62 | 10b207d4 | Oleksiy Mishchenko |
|
63 | 38206f3c | Iustin Pop | Returns:
|
64 | 10b207d4 | Oleksiy Mishchenko | A dictionary with job parameters.
|
65 | 10b207d4 | Oleksiy Mishchenko |
|
66 | 10b207d4 | Oleksiy Mishchenko | The result includes:
|
67 | 10b207d4 | Oleksiy Mishchenko | id - job ID as a number
|
68 | 10b207d4 | Oleksiy Mishchenko | status - current job status as a string
|
69 | 38206f3c | Iustin Pop | ops - involved OpCodes as a list of dictionaries for each opcodes in
|
70 | 10b207d4 | Oleksiy Mishchenko | the job
|
71 | 10b207d4 | Oleksiy Mishchenko | opstatus - OpCodes status as a list
|
72 | 10b207d4 | Oleksiy Mishchenko | opresult - OpCodes results as a list of lists
|
73 | 38206f3c | Iustin Pop |
|
74 | 10b207d4 | Oleksiy Mishchenko | """
|
75 | 10b207d4 | Oleksiy Mishchenko | fields = ["id", "ops", "status", "opstatus", "opresult"] |
76 | 10b207d4 | Oleksiy Mishchenko | job_id = self.items[0] |
77 | 38206f3c | Iustin Pop | result = luxi.Client().QueryJobs([job_id, ], fields)[0]
|
78 | 10b207d4 | Oleksiy Mishchenko | return baserlib.MapFields(fields, result)
|
79 | 10b207d4 | Oleksiy Mishchenko | |
80 | 10b207d4 | Oleksiy Mishchenko | |
81 | 10b207d4 | Oleksiy Mishchenko | class R_2_nodes(baserlib.R_Generic): |
82 | 10b207d4 | Oleksiy Mishchenko | """/2/nodes resource.
|
83 | 10b207d4 | Oleksiy Mishchenko |
|
84 | 10b207d4 | Oleksiy Mishchenko | """
|
85 | 10b207d4 | Oleksiy Mishchenko | DOC_URI = "/2/nodes"
|
86 | 38206f3c | Iustin Pop | |
87 | 10b207d4 | Oleksiy Mishchenko | def GET(self): |
88 | 10b207d4 | Oleksiy Mishchenko | """Returns a list of all nodes.
|
89 | 38206f3c | Iustin Pop |
|
90 | 10b207d4 | Oleksiy Mishchenko | Returns:
|
91 | 10b207d4 | Oleksiy Mishchenko | A dictionary with 'name' and 'uri' keys for each of them.
|
92 | 10b207d4 | Oleksiy Mishchenko |
|
93 | 10b207d4 | Oleksiy Mishchenko | Example: [
|
94 | 10b207d4 | Oleksiy Mishchenko | {
|
95 | 10b207d4 | Oleksiy Mishchenko | "id": "node1.example.com",
|
96 | 10b207d4 | Oleksiy Mishchenko | "uri": "\/instances\/node1.example.com"
|
97 | 10b207d4 | Oleksiy Mishchenko | },
|
98 | 10b207d4 | Oleksiy Mishchenko | {
|
99 | 10b207d4 | Oleksiy Mishchenko | "id": "node2.example.com",
|
100 | 10b207d4 | Oleksiy Mishchenko | "uri": "\/instances\/node2.example.com"
|
101 | 10b207d4 | Oleksiy Mishchenko | }]
|
102 | 10b207d4 | Oleksiy Mishchenko |
|
103 | 38206f3c | Iustin Pop | If the optional 'bulk' argument is provided and set to 'true'
|
104 | 10b207d4 | Oleksiy Mishchenko | value (i.e '?bulk=1'), the output contains detailed
|
105 | 10b207d4 | Oleksiy Mishchenko | information about nodes as a list.
|
106 | 10b207d4 | Oleksiy Mishchenko |
|
107 | 10b207d4 | Oleksiy Mishchenko | Example: [
|
108 | 10b207d4 | Oleksiy Mishchenko | {
|
109 | 10b207d4 | Oleksiy Mishchenko | "pinst_cnt": 1,
|
110 | 10b207d4 | Oleksiy Mishchenko | "mfree": 31280,
|
111 | 10b207d4 | Oleksiy Mishchenko | "mtotal": 32763,
|
112 | 10b207d4 | Oleksiy Mishchenko | "name": "www.example.com",
|
113 | 10b207d4 | Oleksiy Mishchenko | "tags": [],
|
114 | 10b207d4 | Oleksiy Mishchenko | "mnode": 512,
|
115 | 10b207d4 | Oleksiy Mishchenko | "dtotal": 5246208,
|
116 | 10b207d4 | Oleksiy Mishchenko | "sinst_cnt": 2,
|
117 | 10b207d4 | Oleksiy Mishchenko | "dfree": 5171712
|
118 | 10b207d4 | Oleksiy Mishchenko | },
|
119 | 10b207d4 | Oleksiy Mishchenko | ...
|
120 | 10b207d4 | Oleksiy Mishchenko | ]
|
121 | 10b207d4 | Oleksiy Mishchenko |
|
122 | 10b207d4 | Oleksiy Mishchenko | """
|
123 | 10b207d4 | Oleksiy Mishchenko | op = ganeti.opcodes.OpQueryNodes(output_fields=["name"], names=[])
|
124 | 10b207d4 | Oleksiy Mishchenko | nodeslist = baserlib.ExtractField(ganeti.cli.SubmitOpCode(op), 0)
|
125 | 38206f3c | Iustin Pop | |
126 | 10b207d4 | Oleksiy Mishchenko | if 'bulk' in self.queryargs: |
127 | 51ee2f49 | Oleksiy Mishchenko | op = ganeti.opcodes.OpQueryNodes(output_fields=N_FIELDS, |
128 | 51ee2f49 | Oleksiy Mishchenko | names=nodeslist) |
129 | 51ee2f49 | Oleksiy Mishchenko | result = ganeti.cli.SubmitOpCode(op) |
130 | 51ee2f49 | Oleksiy Mishchenko | return baserlib.MapBulkFields(result, N_FIELDS)
|
131 | 10b207d4 | Oleksiy Mishchenko | |
132 | 441e7cfd | Oleksiy Mishchenko | return baserlib.BuildUriList(nodeslist, "/2/nodes/%s", |
133 | 38206f3c | Iustin Pop | uri_fields=("id", "uri")) |
134 | 441e7cfd | Oleksiy Mishchenko | |
135 | 441e7cfd | Oleksiy Mishchenko | |
136 | 441e7cfd | Oleksiy Mishchenko | class R_2_instances(baserlib.R_Generic): |
137 | 441e7cfd | Oleksiy Mishchenko | """/2/instances resource.
|
138 | 441e7cfd | Oleksiy Mishchenko |
|
139 | 441e7cfd | Oleksiy Mishchenko | """
|
140 | 441e7cfd | Oleksiy Mishchenko | DOC_URI = "/2/instances"
|
141 | 441e7cfd | Oleksiy Mishchenko | |
142 | 441e7cfd | Oleksiy Mishchenko | def GET(self): |
143 | 441e7cfd | Oleksiy Mishchenko | """Returns a list of all available instances.
|
144 | 441e7cfd | Oleksiy Mishchenko |
|
145 | 441e7cfd | Oleksiy Mishchenko | Returns:
|
146 | 441e7cfd | Oleksiy Mishchenko | A dictionary with 'name' and 'uri' keys for each of them.
|
147 | 441e7cfd | Oleksiy Mishchenko |
|
148 | 441e7cfd | Oleksiy Mishchenko | Example: [
|
149 | 441e7cfd | Oleksiy Mishchenko | {
|
150 | 441e7cfd | Oleksiy Mishchenko | "name": "web.example.com",
|
151 | 441e7cfd | Oleksiy Mishchenko | "uri": "\/instances\/web.example.com"
|
152 | 441e7cfd | Oleksiy Mishchenko | },
|
153 | 441e7cfd | Oleksiy Mishchenko | {
|
154 | 441e7cfd | Oleksiy Mishchenko | "name": "mail.example.com",
|
155 | 441e7cfd | Oleksiy Mishchenko | "uri": "\/instances\/mail.example.com"
|
156 | 441e7cfd | Oleksiy Mishchenko | }]
|
157 | 441e7cfd | Oleksiy Mishchenko |
|
158 | 441e7cfd | Oleksiy Mishchenko | If the optional 'bulk' argument is provided and set to 'true'
|
159 | 441e7cfd | Oleksiy Mishchenko | value (i.e '?bulk=1'), the output contains detailed
|
160 | 441e7cfd | Oleksiy Mishchenko | information about instances as a list.
|
161 | 441e7cfd | Oleksiy Mishchenko |
|
162 | 441e7cfd | Oleksiy Mishchenko | Example: [
|
163 | 441e7cfd | Oleksiy Mishchenko | {
|
164 | 441e7cfd | Oleksiy Mishchenko | "status": "running",
|
165 | 441e7cfd | Oleksiy Mishchenko | "bridge": "xen-br0",
|
166 | 441e7cfd | Oleksiy Mishchenko | "name": "web.example.com",
|
167 | 441e7cfd | Oleksiy Mishchenko | "tags": ["tag1", "tag2"],
|
168 | 441e7cfd | Oleksiy Mishchenko | "admin_ram": 512,
|
169 | 441e7cfd | Oleksiy Mishchenko | "sda_size": 20480,
|
170 | 441e7cfd | Oleksiy Mishchenko | "pnode": "node1.example.com",
|
171 | 441e7cfd | Oleksiy Mishchenko | "mac": "01:23:45:67:89:01",
|
172 | 441e7cfd | Oleksiy Mishchenko | "sdb_size": 4096,
|
173 | 441e7cfd | Oleksiy Mishchenko | "snodes": ["node2.example.com"],
|
174 | 441e7cfd | Oleksiy Mishchenko | "disk_template": "drbd",
|
175 | 441e7cfd | Oleksiy Mishchenko | "ip": null,
|
176 | 441e7cfd | Oleksiy Mishchenko | "admin_state": true,
|
177 | 441e7cfd | Oleksiy Mishchenko | "os": "debian-etch",
|
178 | 441e7cfd | Oleksiy Mishchenko | "vcpus": 2,
|
179 | 441e7cfd | Oleksiy Mishchenko | "oper_state": true
|
180 | 441e7cfd | Oleksiy Mishchenko | },
|
181 | 441e7cfd | Oleksiy Mishchenko | ...
|
182 | 441e7cfd | Oleksiy Mishchenko | ]
|
183 | 441e7cfd | Oleksiy Mishchenko |
|
184 | 441e7cfd | Oleksiy Mishchenko | """
|
185 | 441e7cfd | Oleksiy Mishchenko | op = ganeti.opcodes.OpQueryInstances(output_fields=["name"], names=[])
|
186 | 441e7cfd | Oleksiy Mishchenko | instanceslist = baserlib.ExtractField(ganeti.cli.SubmitOpCode(op), 0)
|
187 | 441e7cfd | Oleksiy Mishchenko | |
188 | 441e7cfd | Oleksiy Mishchenko | if 'bulk' in self.queryargs: |
189 | 441e7cfd | Oleksiy Mishchenko | op = ganeti.opcodes.OpQueryInstances(output_fields=I_FIELDS, |
190 | 441e7cfd | Oleksiy Mishchenko | names=instanceslist) |
191 | 441e7cfd | Oleksiy Mishchenko | result = ganeti.cli.SubmitOpCode(op) |
192 | 441e7cfd | Oleksiy Mishchenko | return baserlib.MapBulkFields(result, I_FIELDS)
|
193 | 441e7cfd | Oleksiy Mishchenko | |
194 | 441e7cfd | Oleksiy Mishchenko | |
195 | 441e7cfd | Oleksiy Mishchenko | else:
|
196 | 441e7cfd | Oleksiy Mishchenko | return baserlib.BuildUriList(instanceslist, "/2/instances/%s", |
197 | 441e7cfd | Oleksiy Mishchenko | uri_fields=("id", "uri")) |
198 | 441e7cfd | Oleksiy Mishchenko | |
199 | 2f7635f4 | Oleksiy Mishchenko | def PUT(self): |
200 | 2f7635f4 | Oleksiy Mishchenko | """Create an instance.
|
201 | 2f7635f4 | Oleksiy Mishchenko |
|
202 | 2f7635f4 | Oleksiy Mishchenko | Returns:
|
203 | 2f7635f4 | Oleksiy Mishchenko | A job id.
|
204 | 2f7635f4 | Oleksiy Mishchenko |
|
205 | 2f7635f4 | Oleksiy Mishchenko | """
|
206 | 212fa3a7 | Oleksiy Mishchenko | opts = self.req.request_post_data
|
207 | 2f7635f4 | Oleksiy Mishchenko | |
208 | 2f7635f4 | Oleksiy Mishchenko | # beparams
|
209 | 2f7635f4 | Oleksiy Mishchenko | mem = opts.get('mem', None) |
210 | 2f7635f4 | Oleksiy Mishchenko | vcpus = opts.get('vcpus', None) |
211 | 2f7635f4 | Oleksiy Mishchenko | auto_balance = opts.get('auto_balance', None) |
212 | 2f7635f4 | Oleksiy Mishchenko | |
213 | 2f7635f4 | Oleksiy Mishchenko | beparams = {} |
214 | 2f7635f4 | Oleksiy Mishchenko | |
215 | 2f7635f4 | Oleksiy Mishchenko | for key, const in [(mem, constants.BE_MEMORY), |
216 | 2f7635f4 | Oleksiy Mishchenko | (vcpus, constants.BE_VCPUS), |
217 | 2f7635f4 | Oleksiy Mishchenko | (auto_balance, constants.BE_AUTO_BALANCE)]: |
218 | 2f7635f4 | Oleksiy Mishchenko | if key is not None: |
219 | 2f7635f4 | Oleksiy Mishchenko | beparams[const] = key |
220 | 2f7635f4 | Oleksiy Mishchenko | |
221 | 2f7635f4 | Oleksiy Mishchenko | op = ganeti.opcodes.OpCreateInstance( |
222 | 2f7635f4 | Oleksiy Mishchenko | instance_name=opts.get('name'),
|
223 | 2f7635f4 | Oleksiy Mishchenko | disk_size=opts.get('size', 20 * 1024), |
224 | 2f7635f4 | Oleksiy Mishchenko | swap_size=opts.get('swap', 4 * 1024), |
225 | 2f7635f4 | Oleksiy Mishchenko | disk_template=opts.get('disk_template', None), |
226 | 2f7635f4 | Oleksiy Mishchenko | mode=constants.INSTANCE_CREATE, |
227 | 2f7635f4 | Oleksiy Mishchenko | os_type=opts.get('os'),
|
228 | 2f7635f4 | Oleksiy Mishchenko | pnode=opts.get('pnode'),
|
229 | 2f7635f4 | Oleksiy Mishchenko | snode=opts.get('snode'),
|
230 | 2f7635f4 | Oleksiy Mishchenko | ip=opts.get('ip', 'none'), |
231 | 2f7635f4 | Oleksiy Mishchenko | bridge=opts.get('bridge', None), |
232 | 2f7635f4 | Oleksiy Mishchenko | start=opts.get('start', True), |
233 | 2f7635f4 | Oleksiy Mishchenko | ip_check=opts.get('ip_check', True), |
234 | 2f7635f4 | Oleksiy Mishchenko | wait_for_sync=opts.get('wait_for_sync', True), |
235 | 2f7635f4 | Oleksiy Mishchenko | mac=opts.get('mac', 'auto'), |
236 | 2f7635f4 | Oleksiy Mishchenko | hypervisor=opts.get('hypervisor', None), |
237 | 2f7635f4 | Oleksiy Mishchenko | hvparams=opts.get('hvparams', {}),
|
238 | 2f7635f4 | Oleksiy Mishchenko | beparams=beparams, |
239 | 2f7635f4 | Oleksiy Mishchenko | iallocator=opts.get('iallocator', None), |
240 | 2f7635f4 | Oleksiy Mishchenko | file_storage_dir=opts.get('file_storage_dir', None), |
241 | 2f7635f4 | Oleksiy Mishchenko | file_driver=opts.get('file_driver', 'loop'), |
242 | 2f7635f4 | Oleksiy Mishchenko | ) |
243 | 2f7635f4 | Oleksiy Mishchenko | |
244 | 2f7635f4 | Oleksiy Mishchenko | job_id = ganeti.cli.SendJob([op]) |
245 | 2f7635f4 | Oleksiy Mishchenko | return job_id
|
246 | 2f7635f4 | Oleksiy Mishchenko | |
247 | 441e7cfd | Oleksiy Mishchenko | |
248 | 2276aa29 | Oleksiy Mishchenko | class R_2_instances_name_reboot(baserlib.R_Generic): |
249 | 2276aa29 | Oleksiy Mishchenko | """/2/instances/[instance_name]/reboot resource.
|
250 | 2276aa29 | Oleksiy Mishchenko |
|
251 | 2276aa29 | Oleksiy Mishchenko | Implements an instance reboot.
|
252 | 2276aa29 | Oleksiy Mishchenko |
|
253 | 2276aa29 | Oleksiy Mishchenko | """
|
254 | 2276aa29 | Oleksiy Mishchenko | |
255 | 2276aa29 | Oleksiy Mishchenko | DOC_URI = "/2/instances/[instance_name]/reboot"
|
256 | 2276aa29 | Oleksiy Mishchenko | |
257 | 2276aa29 | Oleksiy Mishchenko | def GET(self): |
258 | 2276aa29 | Oleksiy Mishchenko | """Reboot an instance.
|
259 | 2276aa29 | Oleksiy Mishchenko |
|
260 | 0c55c24b | Oleksiy Mishchenko | The URI takes type=[hard|soft|full] and
|
261 | 0c55c24b | Oleksiy Mishchenko | ignore_secondaries=[False|True] parameters.
|
262 | 0c55c24b | Oleksiy Mishchenko |
|
263 | 2276aa29 | Oleksiy Mishchenko | """
|
264 | 2276aa29 | Oleksiy Mishchenko | instance_name = self.items[0] |
265 | 0c55c24b | Oleksiy Mishchenko | reboot_type = self.queryargs.get('type', |
266 | 0c55c24b | Oleksiy Mishchenko | [constants.INSTANCE_REBOOT_HARD])[0]
|
267 | 0c55c24b | Oleksiy Mishchenko | ignore_secondaries = bool(self.queryargs.get('ignore_secondaries', |
268 | 0c55c24b | Oleksiy Mishchenko | [False])[0]) |
269 | 2276aa29 | Oleksiy Mishchenko | op = ganeti.opcodes.OpRebootInstance( |
270 | 2276aa29 | Oleksiy Mishchenko | instance_name=instance_name, |
271 | 2276aa29 | Oleksiy Mishchenko | reboot_type=reboot_type, |
272 | 2276aa29 | Oleksiy Mishchenko | ignore_secondaries=ignore_secondaries) |
273 | 2276aa29 | Oleksiy Mishchenko | |
274 | 2276aa29 | Oleksiy Mishchenko | job_id = ganeti.cli.SendJob([op]) |
275 | 2276aa29 | Oleksiy Mishchenko | |
276 | 2276aa29 | Oleksiy Mishchenko | return job_id
|
277 | 2276aa29 | Oleksiy Mishchenko | |
278 | 2276aa29 | Oleksiy Mishchenko | |
279 | 0c55c24b | Oleksiy Mishchenko | class R_2_instances_name_startup(baserlib.R_Generic): |
280 | 0c55c24b | Oleksiy Mishchenko | """/2/instances/[instance_name]/startup resource.
|
281 | 0c55c24b | Oleksiy Mishchenko |
|
282 | 0c55c24b | Oleksiy Mishchenko | Implements an instance startup.
|
283 | 0c55c24b | Oleksiy Mishchenko |
|
284 | 0c55c24b | Oleksiy Mishchenko | """
|
285 | 0c55c24b | Oleksiy Mishchenko | |
286 | 0c55c24b | Oleksiy Mishchenko | DOC_URI = "/2/instances/[instance_name]/startup"
|
287 | 0c55c24b | Oleksiy Mishchenko | |
288 | 0c55c24b | Oleksiy Mishchenko | def GET(self): |
289 | 0c55c24b | Oleksiy Mishchenko | """Startup an instance.
|
290 | 0c55c24b | Oleksiy Mishchenko |
|
291 | 0c55c24b | Oleksiy Mishchenko | The URI takes force=[False|True] parameter to start the instance if even if
|
292 | 0c55c24b | Oleksiy Mishchenko | secondary disks are failing.
|
293 | 0c55c24b | Oleksiy Mishchenko |
|
294 | 0c55c24b | Oleksiy Mishchenko | """
|
295 | 0c55c24b | Oleksiy Mishchenko | instance_name = self.items[0] |
296 | 0c55c24b | Oleksiy Mishchenko | force_startup = bool(self.queryargs.get('force', [False])[0]) |
297 | 0c55c24b | Oleksiy Mishchenko | op = ganeti.opcodes.OpStartupInstance(instance_name=instance_name, |
298 | 0c55c24b | Oleksiy Mishchenko | force=force_startup) |
299 | 0c55c24b | Oleksiy Mishchenko | |
300 | 0c55c24b | Oleksiy Mishchenko | job_id = ganeti.cli.SendJob([op]) |
301 | 0c55c24b | Oleksiy Mishchenko | |
302 | 0c55c24b | Oleksiy Mishchenko | return job_id
|
303 | 0c55c24b | Oleksiy Mishchenko | |
304 | 0c55c24b | Oleksiy Mishchenko | |
305 | 0c55c24b | Oleksiy Mishchenko | class R_2_instances_name_shutdown(baserlib.R_Generic): |
306 | 0c55c24b | Oleksiy Mishchenko | """/2/instances/[instance_name]/shutdown resource.
|
307 | 0c55c24b | Oleksiy Mishchenko |
|
308 | 0c55c24b | Oleksiy Mishchenko | Implements an instance shutdown.
|
309 | 0c55c24b | Oleksiy Mishchenko |
|
310 | 0c55c24b | Oleksiy Mishchenko | """
|
311 | 0c55c24b | Oleksiy Mishchenko | |
312 | 0c55c24b | Oleksiy Mishchenko | DOC_URI = "/2/instances/[instance_name]/shutdown"
|
313 | 0c55c24b | Oleksiy Mishchenko | |
314 | 0c55c24b | Oleksiy Mishchenko | def GET(self): |
315 | 0c55c24b | Oleksiy Mishchenko | """Shutdown an instance.
|
316 | 0c55c24b | Oleksiy Mishchenko |
|
317 | 0c55c24b | Oleksiy Mishchenko | """
|
318 | 0c55c24b | Oleksiy Mishchenko | instance_name = self.items[0] |
319 | 0c55c24b | Oleksiy Mishchenko | op = ganeti.opcodes.OpShutdownInstance(instance_name=instance_name) |
320 | 0c55c24b | Oleksiy Mishchenko | |
321 | 0c55c24b | Oleksiy Mishchenko | job_id = ganeti.cli.SendJob([op]) |
322 | 0c55c24b | Oleksiy Mishchenko | |
323 | 0c55c24b | Oleksiy Mishchenko | return job_id
|
324 | 0c55c24b | Oleksiy Mishchenko | |
325 | 0c55c24b | Oleksiy Mishchenko | |
326 | 441e7cfd | Oleksiy Mishchenko | class R_2_instances_name_tags(baserlib.R_Generic): |
327 | 441e7cfd | Oleksiy Mishchenko | """/2/instances/[instance_name]/tags resource.
|
328 | 441e7cfd | Oleksiy Mishchenko |
|
329 | 441e7cfd | Oleksiy Mishchenko | Manages per-instance tags.
|
330 | 441e7cfd | Oleksiy Mishchenko |
|
331 | 441e7cfd | Oleksiy Mishchenko | """
|
332 | 441e7cfd | Oleksiy Mishchenko | DOC_URI = "/2/instances/[instance_name]/tags"
|
333 | 441e7cfd | Oleksiy Mishchenko | |
334 | 441e7cfd | Oleksiy Mishchenko | def GET(self): |
335 | 441e7cfd | Oleksiy Mishchenko | """Returns a list of instance tags.
|
336 | 441e7cfd | Oleksiy Mishchenko |
|
337 | 441e7cfd | Oleksiy Mishchenko | Example: ["tag1", "tag2", "tag3"]
|
338 | 441e7cfd | Oleksiy Mishchenko |
|
339 | 441e7cfd | Oleksiy Mishchenko | """
|
340 | 441e7cfd | Oleksiy Mishchenko | return baserlib._Tags_GET(constants.TAG_INSTANCE, name=self.items[0]) |
341 | 441e7cfd | Oleksiy Mishchenko | |
342 | 441e7cfd | Oleksiy Mishchenko | def POST(self): |
343 | 441e7cfd | Oleksiy Mishchenko | """Add a set of tags to the instance.
|
344 | 441e7cfd | Oleksiy Mishchenko |
|
345 | 0c55c24b | Oleksiy Mishchenko | The request as a list of strings should be POST to this URI. And you'll have
|
346 | 441e7cfd | Oleksiy Mishchenko | back a job id.
|
347 | 441e7cfd | Oleksiy Mishchenko |
|
348 | 441e7cfd | Oleksiy Mishchenko | """
|
349 | 441e7cfd | Oleksiy Mishchenko | return baserlib._Tags_POST(constants.TAG_INSTANCE,
|
350 | 441e7cfd | Oleksiy Mishchenko | self.post_data, name=self.items[0]) |
351 | 15fd9fd5 | Oleksiy Mishchenko | |
352 | 15fd9fd5 | Oleksiy Mishchenko | def DELETE(self): |
353 | 15fd9fd5 | Oleksiy Mishchenko | """Delete a tag.
|
354 | 15fd9fd5 | Oleksiy Mishchenko |
|
355 | 15fd9fd5 | Oleksiy Mishchenko | In order to delete a set of tags from a instance, DELETE request should be
|
356 | 15fd9fd5 | Oleksiy Mishchenko | addressed to URI like: /2/instances/[instance_name]/tags?tag=[tag]&tag=[tag]
|
357 | 15fd9fd5 | Oleksiy Mishchenko |
|
358 | 15fd9fd5 | Oleksiy Mishchenko | """
|
359 | 15fd9fd5 | Oleksiy Mishchenko | if 'tag' not in self.queryargs: |
360 | 15fd9fd5 | Oleksiy Mishchenko | # no we not gonna delete all tags from an instance
|
361 | 966405b7 | Michael Hanselmann | raise http.HTTPNotImplemented()
|
362 | 15fd9fd5 | Oleksiy Mishchenko | return baserlib._Tags_DELETE(constants.TAG_INSTANCE,
|
363 | 15fd9fd5 | Oleksiy Mishchenko | self.queryargs['tag'], |
364 | 15fd9fd5 | Oleksiy Mishchenko | name=self.items[0]) |