Statistics
| Branch: | Tag: | Revision:

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