Statistics
| Branch: | Tag: | Revision:

root / lib / rapi / rlib2.py @ 21f04e5e

History | View | Annotate | Download (9.6 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 c7f5f338 Oleksiy Mishchenko
  def DELETE(self):
81 c7f5f338 Oleksiy Mishchenko
    """Cancel not-yet-started job.
82 c7f5f338 Oleksiy Mishchenko

83 c7f5f338 Oleksiy Mishchenko
    """
84 c7f5f338 Oleksiy Mishchenko
    job_id = self.items[0]
85 c7f5f338 Oleksiy Mishchenko
    result = luxi.Client().CancelJob(job_id)
86 c7f5f338 Oleksiy Mishchenko
    return result
87 c7f5f338 Oleksiy Mishchenko
88 10b207d4 Oleksiy Mishchenko
89 10b207d4 Oleksiy Mishchenko
class R_2_nodes(baserlib.R_Generic):
90 10b207d4 Oleksiy Mishchenko
  """/2/nodes resource.
91 10b207d4 Oleksiy Mishchenko

92 10b207d4 Oleksiy Mishchenko
  """
93 10b207d4 Oleksiy Mishchenko
  DOC_URI = "/2/nodes"
94 38206f3c Iustin Pop
95 10b207d4 Oleksiy Mishchenko
  def GET(self):
96 10b207d4 Oleksiy Mishchenko
    """Returns a list of all nodes.
97 38206f3c Iustin Pop

98 10b207d4 Oleksiy Mishchenko
    Returns:
99 10b207d4 Oleksiy Mishchenko
      A dictionary with 'name' and 'uri' keys for each of them.
100 10b207d4 Oleksiy Mishchenko

101 10b207d4 Oleksiy Mishchenko
    Example: [
102 10b207d4 Oleksiy Mishchenko
        {
103 10b207d4 Oleksiy Mishchenko
          "id": "node1.example.com",
104 10b207d4 Oleksiy Mishchenko
          "uri": "\/instances\/node1.example.com"
105 10b207d4 Oleksiy Mishchenko
        },
106 10b207d4 Oleksiy Mishchenko
        {
107 10b207d4 Oleksiy Mishchenko
          "id": "node2.example.com",
108 10b207d4 Oleksiy Mishchenko
          "uri": "\/instances\/node2.example.com"
109 10b207d4 Oleksiy Mishchenko
        }]
110 10b207d4 Oleksiy Mishchenko

111 38206f3c Iustin Pop
    If the optional 'bulk' argument is provided and set to 'true'
112 10b207d4 Oleksiy Mishchenko
    value (i.e '?bulk=1'), the output contains detailed
113 10b207d4 Oleksiy Mishchenko
    information about nodes as a list.
114 10b207d4 Oleksiy Mishchenko

115 10b207d4 Oleksiy Mishchenko
    Example: [
116 10b207d4 Oleksiy Mishchenko
        {
117 10b207d4 Oleksiy Mishchenko
          "pinst_cnt": 1,
118 10b207d4 Oleksiy Mishchenko
          "mfree": 31280,
119 10b207d4 Oleksiy Mishchenko
          "mtotal": 32763,
120 10b207d4 Oleksiy Mishchenko
          "name": "www.example.com",
121 10b207d4 Oleksiy Mishchenko
          "tags": [],
122 10b207d4 Oleksiy Mishchenko
          "mnode": 512,
123 10b207d4 Oleksiy Mishchenko
          "dtotal": 5246208,
124 10b207d4 Oleksiy Mishchenko
          "sinst_cnt": 2,
125 10b207d4 Oleksiy Mishchenko
          "dfree": 5171712
126 10b207d4 Oleksiy Mishchenko
        },
127 10b207d4 Oleksiy Mishchenko
        ...
128 10b207d4 Oleksiy Mishchenko
    ]
129 10b207d4 Oleksiy Mishchenko

130 10b207d4 Oleksiy Mishchenko
    """
131 10b207d4 Oleksiy Mishchenko
    op = ganeti.opcodes.OpQueryNodes(output_fields=["name"], names=[])
132 10b207d4 Oleksiy Mishchenko
    nodeslist = baserlib.ExtractField(ganeti.cli.SubmitOpCode(op), 0)
133 38206f3c Iustin Pop
134 10b207d4 Oleksiy Mishchenko
    if 'bulk' in self.queryargs:
135 51ee2f49 Oleksiy Mishchenko
      op = ganeti.opcodes.OpQueryNodes(output_fields=N_FIELDS,
136 51ee2f49 Oleksiy Mishchenko
                                       names=nodeslist)
137 51ee2f49 Oleksiy Mishchenko
      result = ganeti.cli.SubmitOpCode(op)
138 51ee2f49 Oleksiy Mishchenko
      return baserlib.MapBulkFields(result, 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 441e7cfd Oleksiy Mishchenko
class R_2_instances(baserlib.R_Generic):
145 441e7cfd Oleksiy Mishchenko
  """/2/instances resource.
146 441e7cfd Oleksiy Mishchenko

147 441e7cfd Oleksiy Mishchenko
  """
148 441e7cfd Oleksiy Mishchenko
  DOC_URI = "/2/instances"
149 441e7cfd Oleksiy Mishchenko
150 441e7cfd Oleksiy Mishchenko
  def GET(self):
151 441e7cfd Oleksiy Mishchenko
    """Returns a list of all available instances.
152 441e7cfd Oleksiy Mishchenko

153 441e7cfd Oleksiy Mishchenko
    Returns:
154 441e7cfd Oleksiy Mishchenko
       A dictionary with 'name' and 'uri' keys for each of them.
155 441e7cfd Oleksiy Mishchenko

156 441e7cfd Oleksiy Mishchenko
    Example: [
157 441e7cfd Oleksiy Mishchenko
        {
158 441e7cfd Oleksiy Mishchenko
          "name": "web.example.com",
159 441e7cfd Oleksiy Mishchenko
          "uri": "\/instances\/web.example.com"
160 441e7cfd Oleksiy Mishchenko
        },
161 441e7cfd Oleksiy Mishchenko
        {
162 441e7cfd Oleksiy Mishchenko
          "name": "mail.example.com",
163 441e7cfd Oleksiy Mishchenko
          "uri": "\/instances\/mail.example.com"
164 441e7cfd Oleksiy Mishchenko
        }]
165 441e7cfd Oleksiy Mishchenko

166 441e7cfd Oleksiy Mishchenko
    If the optional 'bulk' argument is provided and set to 'true'
167 441e7cfd Oleksiy Mishchenko
    value (i.e '?bulk=1'), the output contains detailed
168 441e7cfd Oleksiy Mishchenko
    information about instances as a list.
169 441e7cfd Oleksiy Mishchenko

170 441e7cfd Oleksiy Mishchenko
    Example: [
171 441e7cfd Oleksiy Mishchenko
        {
172 441e7cfd Oleksiy Mishchenko
           "status": "running",
173 441e7cfd Oleksiy Mishchenko
           "bridge": "xen-br0",
174 441e7cfd Oleksiy Mishchenko
           "name": "web.example.com",
175 441e7cfd Oleksiy Mishchenko
           "tags": ["tag1", "tag2"],
176 441e7cfd Oleksiy Mishchenko
           "admin_ram": 512,
177 441e7cfd Oleksiy Mishchenko
           "sda_size": 20480,
178 441e7cfd Oleksiy Mishchenko
           "pnode": "node1.example.com",
179 441e7cfd Oleksiy Mishchenko
           "mac": "01:23:45:67:89:01",
180 441e7cfd Oleksiy Mishchenko
           "sdb_size": 4096,
181 441e7cfd Oleksiy Mishchenko
           "snodes": ["node2.example.com"],
182 441e7cfd Oleksiy Mishchenko
           "disk_template": "drbd",
183 441e7cfd Oleksiy Mishchenko
           "ip": null,
184 441e7cfd Oleksiy Mishchenko
           "admin_state": true,
185 441e7cfd Oleksiy Mishchenko
           "os": "debian-etch",
186 441e7cfd Oleksiy Mishchenko
           "vcpus": 2,
187 441e7cfd Oleksiy Mishchenko
           "oper_state": true
188 441e7cfd Oleksiy Mishchenko
        },
189 441e7cfd Oleksiy Mishchenko
        ...
190 441e7cfd Oleksiy Mishchenko
    ]
191 441e7cfd Oleksiy Mishchenko

192 441e7cfd Oleksiy Mishchenko
    """
193 441e7cfd Oleksiy Mishchenko
    op = ganeti.opcodes.OpQueryInstances(output_fields=["name"], names=[])
194 441e7cfd Oleksiy Mishchenko
    instanceslist = baserlib.ExtractField(ganeti.cli.SubmitOpCode(op), 0)
195 441e7cfd Oleksiy Mishchenko
196 441e7cfd Oleksiy Mishchenko
    if 'bulk' in self.queryargs:
197 441e7cfd Oleksiy Mishchenko
      op = ganeti.opcodes.OpQueryInstances(output_fields=I_FIELDS,
198 441e7cfd Oleksiy Mishchenko
                                           names=instanceslist)
199 441e7cfd Oleksiy Mishchenko
      result = ganeti.cli.SubmitOpCode(op)
200 441e7cfd Oleksiy Mishchenko
      return baserlib.MapBulkFields(result, I_FIELDS)
201 441e7cfd Oleksiy Mishchenko
202 441e7cfd Oleksiy Mishchenko
203 441e7cfd Oleksiy Mishchenko
    else:
204 441e7cfd Oleksiy Mishchenko
      return baserlib.BuildUriList(instanceslist, "/2/instances/%s",
205 441e7cfd Oleksiy Mishchenko
                                   uri_fields=("id", "uri"))
206 441e7cfd Oleksiy Mishchenko
207 21f04e5e Oleksiy Mishchenko
  def POST(self):
208 2f7635f4 Oleksiy Mishchenko
    """Create an instance.
209 2f7635f4 Oleksiy Mishchenko

210 2f7635f4 Oleksiy Mishchenko
    Returns:
211 2f7635f4 Oleksiy Mishchenko
      A job id.
212 2f7635f4 Oleksiy Mishchenko

213 2f7635f4 Oleksiy Mishchenko
    """
214 212fa3a7 Oleksiy Mishchenko
    opts = self.req.request_post_data
215 2f7635f4 Oleksiy Mishchenko
216 d50b3059 Oleksiy Mishchenko
    beparams = baserlib.MakeParamsDict(opts, constants.BES_PARAMETERS)
217 d50b3059 Oleksiy Mishchenko
    hvparams = baserlib.MakeParamsDict(opts, constants.HVS_PARAMETERS)
218 2f7635f4 Oleksiy Mishchenko
219 2f7635f4 Oleksiy Mishchenko
    op = ganeti.opcodes.OpCreateInstance(
220 2f7635f4 Oleksiy Mishchenko
        instance_name=opts.get('name'),
221 2f7635f4 Oleksiy Mishchenko
        disk_size=opts.get('size', 20 * 1024),
222 2f7635f4 Oleksiy Mishchenko
        swap_size=opts.get('swap', 4 * 1024),
223 2f7635f4 Oleksiy Mishchenko
        disk_template=opts.get('disk_template', None),
224 2f7635f4 Oleksiy Mishchenko
        mode=constants.INSTANCE_CREATE,
225 2f7635f4 Oleksiy Mishchenko
        os_type=opts.get('os'),
226 2f7635f4 Oleksiy Mishchenko
        pnode=opts.get('pnode'),
227 2f7635f4 Oleksiy Mishchenko
        snode=opts.get('snode'),
228 2f7635f4 Oleksiy Mishchenko
        ip=opts.get('ip', 'none'),
229 2f7635f4 Oleksiy Mishchenko
        bridge=opts.get('bridge', None),
230 2f7635f4 Oleksiy Mishchenko
        start=opts.get('start', True),
231 2f7635f4 Oleksiy Mishchenko
        ip_check=opts.get('ip_check', True),
232 2f7635f4 Oleksiy Mishchenko
        wait_for_sync=opts.get('wait_for_sync', True),
233 2f7635f4 Oleksiy Mishchenko
        mac=opts.get('mac', 'auto'),
234 2f7635f4 Oleksiy Mishchenko
        hypervisor=opts.get('hypervisor', None),
235 d50b3059 Oleksiy Mishchenko
        hvparams=hvparams,
236 2f7635f4 Oleksiy Mishchenko
        beparams=beparams,
237 2f7635f4 Oleksiy Mishchenko
        iallocator=opts.get('iallocator', None),
238 2f7635f4 Oleksiy Mishchenko
        file_storage_dir=opts.get('file_storage_dir', None),
239 2f7635f4 Oleksiy Mishchenko
        file_driver=opts.get('file_driver', 'loop'),
240 2f7635f4 Oleksiy Mishchenko
        )
241 2f7635f4 Oleksiy Mishchenko
242 2f7635f4 Oleksiy Mishchenko
    job_id = ganeti.cli.SendJob([op])
243 2f7635f4 Oleksiy Mishchenko
    return job_id
244 2f7635f4 Oleksiy Mishchenko
245 441e7cfd Oleksiy Mishchenko
246 2276aa29 Oleksiy Mishchenko
class R_2_instances_name_reboot(baserlib.R_Generic):
247 2276aa29 Oleksiy Mishchenko
  """/2/instances/[instance_name]/reboot resource.
248 2276aa29 Oleksiy Mishchenko

249 2276aa29 Oleksiy Mishchenko
  Implements an instance reboot.
250 2276aa29 Oleksiy Mishchenko

251 2276aa29 Oleksiy Mishchenko
  """
252 2276aa29 Oleksiy Mishchenko
253 2276aa29 Oleksiy Mishchenko
  DOC_URI = "/2/instances/[instance_name]/reboot"
254 2276aa29 Oleksiy Mishchenko
255 21f04e5e Oleksiy Mishchenko
  def POST(self):
256 2276aa29 Oleksiy Mishchenko
    """Reboot an instance.
257 2276aa29 Oleksiy Mishchenko

258 0c55c24b Oleksiy Mishchenko
    The URI takes type=[hard|soft|full] and
259 0c55c24b Oleksiy Mishchenko
    ignore_secondaries=[False|True] parameters.
260 0c55c24b Oleksiy Mishchenko

261 2276aa29 Oleksiy Mishchenko
    """
262 2276aa29 Oleksiy Mishchenko
    instance_name = self.items[0]
263 0c55c24b Oleksiy Mishchenko
    reboot_type = self.queryargs.get('type',
264 0c55c24b Oleksiy Mishchenko
                                     [constants.INSTANCE_REBOOT_HARD])[0]
265 0c55c24b Oleksiy Mishchenko
    ignore_secondaries = bool(self.queryargs.get('ignore_secondaries',
266 0c55c24b Oleksiy Mishchenko
                                                 [False])[0])
267 2276aa29 Oleksiy Mishchenko
    op = ganeti.opcodes.OpRebootInstance(
268 2276aa29 Oleksiy Mishchenko
        instance_name=instance_name,
269 2276aa29 Oleksiy Mishchenko
        reboot_type=reboot_type,
270 2276aa29 Oleksiy Mishchenko
        ignore_secondaries=ignore_secondaries)
271 2276aa29 Oleksiy Mishchenko
272 2276aa29 Oleksiy Mishchenko
    job_id = ganeti.cli.SendJob([op])
273 2276aa29 Oleksiy Mishchenko
274 2276aa29 Oleksiy Mishchenko
    return job_id
275 2276aa29 Oleksiy Mishchenko
276 2276aa29 Oleksiy Mishchenko
277 0c55c24b Oleksiy Mishchenko
class R_2_instances_name_startup(baserlib.R_Generic):
278 0c55c24b Oleksiy Mishchenko
  """/2/instances/[instance_name]/startup resource.
279 0c55c24b Oleksiy Mishchenko

280 0c55c24b Oleksiy Mishchenko
  Implements an instance startup.
281 0c55c24b Oleksiy Mishchenko

282 0c55c24b Oleksiy Mishchenko
  """
283 0c55c24b Oleksiy Mishchenko
284 0c55c24b Oleksiy Mishchenko
  DOC_URI = "/2/instances/[instance_name]/startup"
285 0c55c24b Oleksiy Mishchenko
286 21f04e5e Oleksiy Mishchenko
  def PUT(self):
287 0c55c24b Oleksiy Mishchenko
    """Startup an instance.
288 0c55c24b Oleksiy Mishchenko

289 0c55c24b Oleksiy Mishchenko
    The URI takes force=[False|True] parameter to start the instance if even if
290 0c55c24b Oleksiy Mishchenko
    secondary disks are failing.
291 0c55c24b Oleksiy Mishchenko

292 0c55c24b Oleksiy Mishchenko
    """
293 0c55c24b Oleksiy Mishchenko
    instance_name = self.items[0]
294 0c55c24b Oleksiy Mishchenko
    force_startup = bool(self.queryargs.get('force', [False])[0])
295 0c55c24b Oleksiy Mishchenko
    op = ganeti.opcodes.OpStartupInstance(instance_name=instance_name,
296 0c55c24b Oleksiy Mishchenko
                                          force=force_startup)
297 0c55c24b Oleksiy Mishchenko
298 0c55c24b Oleksiy Mishchenko
    job_id = ganeti.cli.SendJob([op])
299 0c55c24b Oleksiy Mishchenko
300 0c55c24b Oleksiy Mishchenko
    return job_id
301 0c55c24b Oleksiy Mishchenko
302 0c55c24b Oleksiy Mishchenko
303 0c55c24b Oleksiy Mishchenko
class R_2_instances_name_shutdown(baserlib.R_Generic):
304 0c55c24b Oleksiy Mishchenko
  """/2/instances/[instance_name]/shutdown resource.
305 0c55c24b Oleksiy Mishchenko

306 0c55c24b Oleksiy Mishchenko
  Implements an instance shutdown.
307 0c55c24b Oleksiy Mishchenko

308 0c55c24b Oleksiy Mishchenko
  """
309 0c55c24b Oleksiy Mishchenko
310 0c55c24b Oleksiy Mishchenko
  DOC_URI = "/2/instances/[instance_name]/shutdown"
311 0c55c24b Oleksiy Mishchenko
312 21f04e5e Oleksiy Mishchenko
  def PUT(self):
313 0c55c24b Oleksiy Mishchenko
    """Shutdown an instance.
314 0c55c24b Oleksiy Mishchenko

315 0c55c24b Oleksiy Mishchenko
    """
316 0c55c24b Oleksiy Mishchenko
    instance_name = self.items[0]
317 0c55c24b Oleksiy Mishchenko
    op = ganeti.opcodes.OpShutdownInstance(instance_name=instance_name)
318 0c55c24b Oleksiy Mishchenko
319 0c55c24b Oleksiy Mishchenko
    job_id = ganeti.cli.SendJob([op])
320 0c55c24b Oleksiy Mishchenko
321 0c55c24b Oleksiy Mishchenko
    return job_id
322 0c55c24b Oleksiy Mishchenko
323 0c55c24b Oleksiy Mishchenko
324 441e7cfd Oleksiy Mishchenko
class R_2_instances_name_tags(baserlib.R_Generic):
325 441e7cfd Oleksiy Mishchenko
  """/2/instances/[instance_name]/tags resource.
326 441e7cfd Oleksiy Mishchenko

327 441e7cfd Oleksiy Mishchenko
  Manages per-instance tags.
328 441e7cfd Oleksiy Mishchenko

329 441e7cfd Oleksiy Mishchenko
  """
330 441e7cfd Oleksiy Mishchenko
  DOC_URI = "/2/instances/[instance_name]/tags"
331 441e7cfd Oleksiy Mishchenko
332 441e7cfd Oleksiy Mishchenko
  def GET(self):
333 441e7cfd Oleksiy Mishchenko
    """Returns a list of instance tags.
334 441e7cfd Oleksiy Mishchenko

335 441e7cfd Oleksiy Mishchenko
    Example: ["tag1", "tag2", "tag3"]
336 441e7cfd Oleksiy Mishchenko

337 441e7cfd Oleksiy Mishchenko
    """
338 441e7cfd Oleksiy Mishchenko
    return baserlib._Tags_GET(constants.TAG_INSTANCE, name=self.items[0])
339 441e7cfd Oleksiy Mishchenko
340 21f04e5e Oleksiy Mishchenko
  def PUT(self):
341 441e7cfd Oleksiy Mishchenko
    """Add a set of tags to the instance.
342 441e7cfd Oleksiy Mishchenko

343 21f04e5e Oleksiy Mishchenko
    The request as a list of strings should be PUT to this URI. And you'll have
344 441e7cfd Oleksiy Mishchenko
    back a job id.
345 441e7cfd Oleksiy Mishchenko

346 441e7cfd Oleksiy Mishchenko
    """
347 21f04e5e Oleksiy Mishchenko
    return baserlib._Tags_PUT(constants.TAG_INSTANCE,
348 441e7cfd Oleksiy Mishchenko
                               self.post_data, name=self.items[0])
349 15fd9fd5 Oleksiy Mishchenko
350 15fd9fd5 Oleksiy Mishchenko
  def DELETE(self):
351 15fd9fd5 Oleksiy Mishchenko
    """Delete a tag.
352 15fd9fd5 Oleksiy Mishchenko

353 15fd9fd5 Oleksiy Mishchenko
    In order to delete a set of tags from a instance, DELETE request should be
354 15fd9fd5 Oleksiy Mishchenko
    addressed to URI like: /2/instances/[instance_name]/tags?tag=[tag]&tag=[tag]
355 15fd9fd5 Oleksiy Mishchenko

356 15fd9fd5 Oleksiy Mishchenko
    """
357 15fd9fd5 Oleksiy Mishchenko
    if 'tag' not in self.queryargs:
358 15fd9fd5 Oleksiy Mishchenko
      # no we not gonna delete all tags from an instance
359 966405b7 Michael Hanselmann
      raise http.HTTPNotImplemented()
360 15fd9fd5 Oleksiy Mishchenko
    return baserlib._Tags_DELETE(constants.TAG_INSTANCE,
361 15fd9fd5 Oleksiy Mishchenko
                                 self.queryargs['tag'],
362 15fd9fd5 Oleksiy Mishchenko
                                 name=self.items[0])