Statistics
| Branch: | Tag: | Revision:

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])