Statistics
| Branch: | Tag: | Revision:

root / lib / rapi / rlib2.py @ 4e5a68f8

History | View | Annotate | Download (12.3 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 4e5a68f8 Oleksiy Mishchenko
33 4e5a68f8 Oleksiy Mishchenko
I_FIELDS = ["name", "os", "pnode", "snodes", "admin_state", "disk_template",
34 4e5a68f8 Oleksiy Mishchenko
            "ip", "mac", "bridge", "sda_size", "sdb_size", "beparams",
35 4e5a68f8 Oleksiy Mishchenko
            "oper_state", "status", "tags"]
36 4e5a68f8 Oleksiy Mishchenko
37 4e5a68f8 Oleksiy Mishchenko
N_FIELDS = ["name", "dtotal", "dfree",
38 4e5a68f8 Oleksiy Mishchenko
            "mtotal", "mnode", "mfree",
39 4e5a68f8 Oleksiy Mishchenko
            "pinst_cnt", "sinst_cnt", "tags"]
40 4e5a68f8 Oleksiy Mishchenko
41 4e5a68f8 Oleksiy Mishchenko
42 4e5a68f8 Oleksiy Mishchenko
class R_version(baserlib.R_Generic):
43 4e5a68f8 Oleksiy Mishchenko
  """/version resource.
44 4e5a68f8 Oleksiy Mishchenko

45 4e5a68f8 Oleksiy Mishchenko
  This resource should be used to determine the remote API version and
46 4e5a68f8 Oleksiy Mishchenko
  to adapt clients accordingly.
47 4e5a68f8 Oleksiy Mishchenko

48 4e5a68f8 Oleksiy Mishchenko
  """
49 4e5a68f8 Oleksiy Mishchenko
  DOC_URI = "/version"
50 4e5a68f8 Oleksiy Mishchenko
51 4e5a68f8 Oleksiy Mishchenko
  def GET(self):
52 4e5a68f8 Oleksiy Mishchenko
    """Returns the remote API version.
53 4e5a68f8 Oleksiy Mishchenko

54 4e5a68f8 Oleksiy Mishchenko
    """
55 4e5a68f8 Oleksiy Mishchenko
    return constants.RAPI_VERSION
56 4e5a68f8 Oleksiy Mishchenko
57 4e5a68f8 Oleksiy Mishchenko
58 4e5a68f8 Oleksiy Mishchenko
class R_2_info(baserlib.R_Generic):
59 4e5a68f8 Oleksiy Mishchenko
  """Cluster info.
60 4e5a68f8 Oleksiy Mishchenko

61 4e5a68f8 Oleksiy Mishchenko
  """
62 4e5a68f8 Oleksiy Mishchenko
  DOC_URI = "/2/info"
63 4e5a68f8 Oleksiy Mishchenko
64 4e5a68f8 Oleksiy Mishchenko
  def GET(self):
65 4e5a68f8 Oleksiy Mishchenko
    """Returns cluster information.
66 4e5a68f8 Oleksiy Mishchenko

67 4e5a68f8 Oleksiy Mishchenko
    Example::
68 4e5a68f8 Oleksiy Mishchenko

69 4e5a68f8 Oleksiy Mishchenko
      {
70 4e5a68f8 Oleksiy Mishchenko
        "config_version": 3,
71 4e5a68f8 Oleksiy Mishchenko
        "name": "cluster1.example.com",
72 4e5a68f8 Oleksiy Mishchenko
        "software_version": "1.2.4",
73 4e5a68f8 Oleksiy Mishchenko
        "os_api_version": 5,
74 4e5a68f8 Oleksiy Mishchenko
        "export_version": 0,
75 4e5a68f8 Oleksiy Mishchenko
        "master": "node1.example.com",
76 4e5a68f8 Oleksiy Mishchenko
        "architecture": [
77 4e5a68f8 Oleksiy Mishchenko
          "64bit",
78 4e5a68f8 Oleksiy Mishchenko
          "x86_64"
79 4e5a68f8 Oleksiy Mishchenko
        ],
80 4e5a68f8 Oleksiy Mishchenko
        "hypervisor_type": "xen-pvm",
81 4e5a68f8 Oleksiy Mishchenko
        "protocol_version": 12
82 4e5a68f8 Oleksiy Mishchenko
      }
83 4e5a68f8 Oleksiy Mishchenko

84 4e5a68f8 Oleksiy Mishchenko
    """
85 4e5a68f8 Oleksiy Mishchenko
    op = ganeti.opcodes.OpQueryClusterInfo()
86 4e5a68f8 Oleksiy Mishchenko
    return ganeti.cli.SubmitOpCode(op)
87 4e5a68f8 Oleksiy Mishchenko
88 4e5a68f8 Oleksiy Mishchenko
89 4e5a68f8 Oleksiy Mishchenko
class R_2_tags(baserlib.R_Generic):
90 4e5a68f8 Oleksiy Mishchenko
  """/2/tags resource.
91 4e5a68f8 Oleksiy Mishchenko

92 4e5a68f8 Oleksiy Mishchenko
  Manages cluster tags.
93 4e5a68f8 Oleksiy Mishchenko

94 4e5a68f8 Oleksiy Mishchenko
  """
95 4e5a68f8 Oleksiy Mishchenko
  DOC_URI = "/2/tags"
96 4e5a68f8 Oleksiy Mishchenko
97 4e5a68f8 Oleksiy Mishchenko
  def GET(self):
98 4e5a68f8 Oleksiy Mishchenko
    """Returns a list of all cluster tags.
99 4e5a68f8 Oleksiy Mishchenko

100 4e5a68f8 Oleksiy Mishchenko
    Example: ["tag1", "tag2", "tag3"]
101 4e5a68f8 Oleksiy Mishchenko

102 4e5a68f8 Oleksiy Mishchenko
    """
103 4e5a68f8 Oleksiy Mishchenko
    return baserlib._Tags_GET(constants.TAG_CLUSTER)
104 4e5a68f8 Oleksiy Mishchenko
105 4e5a68f8 Oleksiy Mishchenko
106 4e5a68f8 Oleksiy Mishchenko
class R_2_os(baserlib.R_Generic):
107 4e5a68f8 Oleksiy Mishchenko
  """/2/os resource.
108 4e5a68f8 Oleksiy Mishchenko

109 4e5a68f8 Oleksiy Mishchenko
  """
110 4e5a68f8 Oleksiy Mishchenko
  DOC_URI = "/2/os"
111 4e5a68f8 Oleksiy Mishchenko
112 4e5a68f8 Oleksiy Mishchenko
  def GET(self):
113 4e5a68f8 Oleksiy Mishchenko
    """Return a list of all OSes.
114 4e5a68f8 Oleksiy Mishchenko

115 4e5a68f8 Oleksiy Mishchenko
    Can return error 500 in case of a problem.
116 4e5a68f8 Oleksiy Mishchenko

117 4e5a68f8 Oleksiy Mishchenko
    Example: ["debian-etch"]
118 4e5a68f8 Oleksiy Mishchenko

119 4e5a68f8 Oleksiy Mishchenko
    """
120 4e5a68f8 Oleksiy Mishchenko
    op = ganeti.opcodes.OpDiagnoseOS(output_fields=["name", "valid"],
121 4e5a68f8 Oleksiy Mishchenko
                                     names=[])
122 4e5a68f8 Oleksiy Mishchenko
    diagnose_data = ganeti.cli.SubmitOpCode(op)
123 4e5a68f8 Oleksiy Mishchenko
124 4e5a68f8 Oleksiy Mishchenko
    if not isinstance(diagnose_data, list):
125 4e5a68f8 Oleksiy Mishchenko
      raise http.HttpInternalServerError(message="Can't get OS list")
126 4e5a68f8 Oleksiy Mishchenko
127 4e5a68f8 Oleksiy Mishchenko
    return [row[0] for row in diagnose_data if row[1]]
128 51ee2f49 Oleksiy Mishchenko
129 10b207d4 Oleksiy Mishchenko
130 10b207d4 Oleksiy Mishchenko
class R_2_jobs(baserlib.R_Generic):
131 10b207d4 Oleksiy Mishchenko
  """/2/jobs resource.
132 10b207d4 Oleksiy Mishchenko

133 10b207d4 Oleksiy Mishchenko
  """
134 10b207d4 Oleksiy Mishchenko
  DOC_URI = "/2/jobs"
135 10b207d4 Oleksiy Mishchenko
136 10b207d4 Oleksiy Mishchenko
  def GET(self):
137 10b207d4 Oleksiy Mishchenko
    """Returns a dictionary of jobs.
138 10b207d4 Oleksiy Mishchenko

139 c41eea6e Iustin Pop
    @return: a dictionary with jobs id and uri.
140 38206f3c Iustin Pop

141 10b207d4 Oleksiy Mishchenko
    """
142 10b207d4 Oleksiy Mishchenko
    fields = ["id"]
143 10b207d4 Oleksiy Mishchenko
    # Convert the list of lists to the list of ids
144 10b207d4 Oleksiy Mishchenko
    result = [job_id for [job_id] in luxi.Client().QueryJobs(None, fields)]
145 10b207d4 Oleksiy Mishchenko
    return baserlib.BuildUriList(result, "/2/jobs/%s", uri_fields=("id", "uri"))
146 10b207d4 Oleksiy Mishchenko
147 10b207d4 Oleksiy Mishchenko
148 10b207d4 Oleksiy Mishchenko
class R_2_jobs_id(baserlib.R_Generic):
149 10b207d4 Oleksiy Mishchenko
  """/2/jobs/[job_id] resource.
150 10b207d4 Oleksiy Mishchenko

151 10b207d4 Oleksiy Mishchenko
  """
152 10b207d4 Oleksiy Mishchenko
  DOC_URI = "/2/jobs/[job_id]"
153 10b207d4 Oleksiy Mishchenko
154 10b207d4 Oleksiy Mishchenko
  def GET(self):
155 10b207d4 Oleksiy Mishchenko
    """Returns a job status.
156 10b207d4 Oleksiy Mishchenko

157 c41eea6e Iustin Pop
    @return: a dictionary with job parameters.
158 c41eea6e Iustin Pop
        The result includes:
159 c41eea6e Iustin Pop
            - id: job ID as a number
160 c41eea6e Iustin Pop
            - status: current job status as a string
161 c41eea6e Iustin Pop
            - ops: involved OpCodes as a list of dictionaries for each
162 c41eea6e Iustin Pop
              opcodes in the job
163 c41eea6e Iustin Pop
            - opstatus: OpCodes status as a list
164 c41eea6e Iustin Pop
            - opresult: OpCodes results as a list of lists
165 38206f3c Iustin Pop

166 10b207d4 Oleksiy Mishchenko
    """
167 10b207d4 Oleksiy Mishchenko
    fields = ["id", "ops", "status", "opstatus", "opresult"]
168 10b207d4 Oleksiy Mishchenko
    job_id = self.items[0]
169 38206f3c Iustin Pop
    result = luxi.Client().QueryJobs([job_id, ], fields)[0]
170 10b207d4 Oleksiy Mishchenko
    return baserlib.MapFields(fields, result)
171 10b207d4 Oleksiy Mishchenko
172 c7f5f338 Oleksiy Mishchenko
  def DELETE(self):
173 c7f5f338 Oleksiy Mishchenko
    """Cancel not-yet-started job.
174 c7f5f338 Oleksiy Mishchenko

175 c7f5f338 Oleksiy Mishchenko
    """
176 c7f5f338 Oleksiy Mishchenko
    job_id = self.items[0]
177 c7f5f338 Oleksiy Mishchenko
    result = luxi.Client().CancelJob(job_id)
178 c7f5f338 Oleksiy Mishchenko
    return result
179 c7f5f338 Oleksiy Mishchenko
180 10b207d4 Oleksiy Mishchenko
181 10b207d4 Oleksiy Mishchenko
class R_2_nodes(baserlib.R_Generic):
182 10b207d4 Oleksiy Mishchenko
  """/2/nodes resource.
183 10b207d4 Oleksiy Mishchenko

184 10b207d4 Oleksiy Mishchenko
  """
185 10b207d4 Oleksiy Mishchenko
  DOC_URI = "/2/nodes"
186 38206f3c Iustin Pop
187 10b207d4 Oleksiy Mishchenko
  def GET(self):
188 10b207d4 Oleksiy Mishchenko
    """Returns a list of all nodes.
189 38206f3c Iustin Pop

190 c41eea6e Iustin Pop
    Example::
191 10b207d4 Oleksiy Mishchenko

192 c41eea6e Iustin Pop
      [
193 10b207d4 Oleksiy Mishchenko
        {
194 10b207d4 Oleksiy Mishchenko
          "id": "node1.example.com",
195 10b207d4 Oleksiy Mishchenko
          "uri": "\/instances\/node1.example.com"
196 10b207d4 Oleksiy Mishchenko
        },
197 10b207d4 Oleksiy Mishchenko
        {
198 10b207d4 Oleksiy Mishchenko
          "id": "node2.example.com",
199 10b207d4 Oleksiy Mishchenko
          "uri": "\/instances\/node2.example.com"
200 c41eea6e Iustin Pop
        }
201 c41eea6e Iustin Pop
      ]
202 10b207d4 Oleksiy Mishchenko

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

207 c41eea6e Iustin Pop
    Example::
208 c41eea6e Iustin Pop

209 c41eea6e Iustin Pop
      [
210 10b207d4 Oleksiy Mishchenko
        {
211 10b207d4 Oleksiy Mishchenko
          "pinst_cnt": 1,
212 10b207d4 Oleksiy Mishchenko
          "mfree": 31280,
213 10b207d4 Oleksiy Mishchenko
          "mtotal": 32763,
214 10b207d4 Oleksiy Mishchenko
          "name": "www.example.com",
215 10b207d4 Oleksiy Mishchenko
          "tags": [],
216 10b207d4 Oleksiy Mishchenko
          "mnode": 512,
217 10b207d4 Oleksiy Mishchenko
          "dtotal": 5246208,
218 10b207d4 Oleksiy Mishchenko
          "sinst_cnt": 2,
219 10b207d4 Oleksiy Mishchenko
          "dfree": 5171712
220 10b207d4 Oleksiy Mishchenko
        },
221 10b207d4 Oleksiy Mishchenko
        ...
222 c41eea6e Iustin Pop
      ]
223 c41eea6e Iustin Pop

224 c41eea6e Iustin Pop
    @return: a dictionary with 'name' and 'uri' keys for each of them
225 10b207d4 Oleksiy Mishchenko

226 10b207d4 Oleksiy Mishchenko
    """
227 a0dcf7c2 Oleksiy Mishchenko
    client = luxi.Client()
228 a0dcf7c2 Oleksiy Mishchenko
    nodesdata = client.QueryNodes([], ["name"])
229 a0dcf7c2 Oleksiy Mishchenko
    nodeslist = [row[0] for row in nodesdata]
230 38206f3c Iustin Pop
231 10b207d4 Oleksiy Mishchenko
    if 'bulk' in self.queryargs:
232 a0dcf7c2 Oleksiy Mishchenko
      bulkdata = client.QueryNodes(nodeslist, N_FIELDS)
233 a0dcf7c2 Oleksiy Mishchenko
      return baserlib.MapBulkFields(bulkdata, N_FIELDS)
234 10b207d4 Oleksiy Mishchenko
235 441e7cfd Oleksiy Mishchenko
    return baserlib.BuildUriList(nodeslist, "/2/nodes/%s",
236 38206f3c Iustin Pop
                                 uri_fields=("id", "uri"))
237 441e7cfd Oleksiy Mishchenko
238 441e7cfd Oleksiy Mishchenko
239 4e5a68f8 Oleksiy Mishchenko
class R_2_nodes_name(baserlib.R_Generic):
240 4e5a68f8 Oleksiy Mishchenko
  """/2/nodes/[node_name] resources.
241 028c6b76 Oleksiy Mishchenko

242 028c6b76 Oleksiy Mishchenko
  """
243 4e5a68f8 Oleksiy Mishchenko
  DOC_URI = "/nodes/[node_name]"
244 4e5a68f8 Oleksiy Mishchenko
245 4e5a68f8 Oleksiy Mishchenko
  def GET(self):
246 4e5a68f8 Oleksiy Mishchenko
    """Send information about a node.
247 4e5a68f8 Oleksiy Mishchenko

248 4e5a68f8 Oleksiy Mishchenko
    """
249 4e5a68f8 Oleksiy Mishchenko
    node_name = self.items[0]
250 4e5a68f8 Oleksiy Mishchenko
    op = ganeti.opcodes.OpQueryNodes(output_fields=N_FIELDS,
251 4e5a68f8 Oleksiy Mishchenko
                                     names=[node_name])
252 4e5a68f8 Oleksiy Mishchenko
    result = ganeti.cli.SubmitOpCode(op)
253 4e5a68f8 Oleksiy Mishchenko
254 4e5a68f8 Oleksiy Mishchenko
    return baserlib.MapFields(N_FIELDS, result[0])
255 028c6b76 Oleksiy Mishchenko
256 028c6b76 Oleksiy Mishchenko
257 441e7cfd Oleksiy Mishchenko
class R_2_instances(baserlib.R_Generic):
258 441e7cfd Oleksiy Mishchenko
  """/2/instances resource.
259 441e7cfd Oleksiy Mishchenko

260 441e7cfd Oleksiy Mishchenko
  """
261 441e7cfd Oleksiy Mishchenko
  DOC_URI = "/2/instances"
262 441e7cfd Oleksiy Mishchenko
263 441e7cfd Oleksiy Mishchenko
  def GET(self):
264 441e7cfd Oleksiy Mishchenko
    """Returns a list of all available instances.
265 441e7cfd Oleksiy Mishchenko

266 441e7cfd Oleksiy Mishchenko

267 c41eea6e Iustin Pop
    Example::
268 c41eea6e Iustin Pop

269 c41eea6e Iustin Pop
      [
270 441e7cfd Oleksiy Mishchenko
        {
271 441e7cfd Oleksiy Mishchenko
          "name": "web.example.com",
272 441e7cfd Oleksiy Mishchenko
          "uri": "\/instances\/web.example.com"
273 441e7cfd Oleksiy Mishchenko
        },
274 441e7cfd Oleksiy Mishchenko
        {
275 441e7cfd Oleksiy Mishchenko
          "name": "mail.example.com",
276 441e7cfd Oleksiy Mishchenko
          "uri": "\/instances\/mail.example.com"
277 c41eea6e Iustin Pop
        }
278 c41eea6e Iustin Pop
      ]
279 441e7cfd Oleksiy Mishchenko

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

284 c41eea6e Iustin Pop
    Example::
285 c41eea6e Iustin Pop

286 c41eea6e Iustin Pop
      [
287 441e7cfd Oleksiy Mishchenko
        {
288 441e7cfd Oleksiy Mishchenko
           "status": "running",
289 441e7cfd Oleksiy Mishchenko
           "bridge": "xen-br0",
290 441e7cfd Oleksiy Mishchenko
           "name": "web.example.com",
291 441e7cfd Oleksiy Mishchenko
           "tags": ["tag1", "tag2"],
292 441e7cfd Oleksiy Mishchenko
           "admin_ram": 512,
293 441e7cfd Oleksiy Mishchenko
           "sda_size": 20480,
294 441e7cfd Oleksiy Mishchenko
           "pnode": "node1.example.com",
295 441e7cfd Oleksiy Mishchenko
           "mac": "01:23:45:67:89:01",
296 441e7cfd Oleksiy Mishchenko
           "sdb_size": 4096,
297 441e7cfd Oleksiy Mishchenko
           "snodes": ["node2.example.com"],
298 441e7cfd Oleksiy Mishchenko
           "disk_template": "drbd",
299 441e7cfd Oleksiy Mishchenko
           "ip": null,
300 441e7cfd Oleksiy Mishchenko
           "admin_state": true,
301 441e7cfd Oleksiy Mishchenko
           "os": "debian-etch",
302 441e7cfd Oleksiy Mishchenko
           "vcpus": 2,
303 441e7cfd Oleksiy Mishchenko
           "oper_state": true
304 441e7cfd Oleksiy Mishchenko
        },
305 441e7cfd Oleksiy Mishchenko
        ...
306 c41eea6e Iustin Pop
      ]
307 c41eea6e Iustin Pop

308 c41eea6e Iustin Pop
    @returns: a dictionary with 'name' and 'uri' keys for each of them.
309 441e7cfd Oleksiy Mishchenko

310 441e7cfd Oleksiy Mishchenko
    """
311 a0dcf7c2 Oleksiy Mishchenko
    client = luxi.Client()
312 a0dcf7c2 Oleksiy Mishchenko
    instancesdata = client.QueryInstances([], ["name"])
313 a0dcf7c2 Oleksiy Mishchenko
    instanceslist = [row[0] for row in instancesdata]
314 441e7cfd Oleksiy Mishchenko
315 441e7cfd Oleksiy Mishchenko
316 a0dcf7c2 Oleksiy Mishchenko
    if 'bulk' in self.queryargs:
317 a0dcf7c2 Oleksiy Mishchenko
      bulkdata = client.QueryInstances(instanceslist, I_FIELDS)
318 a0dcf7c2 Oleksiy Mishchenko
      return baserlib.MapBulkFields(bulkdata, I_FIELDS)
319 441e7cfd Oleksiy Mishchenko
320 441e7cfd Oleksiy Mishchenko
    else:
321 441e7cfd Oleksiy Mishchenko
      return baserlib.BuildUriList(instanceslist, "/2/instances/%s",
322 441e7cfd Oleksiy Mishchenko
                                   uri_fields=("id", "uri"))
323 441e7cfd Oleksiy Mishchenko
324 21f04e5e Oleksiy Mishchenko
  def POST(self):
325 2f7635f4 Oleksiy Mishchenko
    """Create an instance.
326 2f7635f4 Oleksiy Mishchenko

327 c41eea6e Iustin Pop
    @returns: a job id
328 2f7635f4 Oleksiy Mishchenko

329 2f7635f4 Oleksiy Mishchenko
    """
330 212fa3a7 Oleksiy Mishchenko
    opts = self.req.request_post_data
331 2f7635f4 Oleksiy Mishchenko
332 d50b3059 Oleksiy Mishchenko
    beparams = baserlib.MakeParamsDict(opts, constants.BES_PARAMETERS)
333 d50b3059 Oleksiy Mishchenko
    hvparams = baserlib.MakeParamsDict(opts, constants.HVS_PARAMETERS)
334 2f7635f4 Oleksiy Mishchenko
335 2f7635f4 Oleksiy Mishchenko
    op = ganeti.opcodes.OpCreateInstance(
336 2f7635f4 Oleksiy Mishchenko
        instance_name=opts.get('name'),
337 2f7635f4 Oleksiy Mishchenko
        disk_size=opts.get('size', 20 * 1024),
338 2f7635f4 Oleksiy Mishchenko
        swap_size=opts.get('swap', 4 * 1024),
339 2f7635f4 Oleksiy Mishchenko
        disk_template=opts.get('disk_template', None),
340 2f7635f4 Oleksiy Mishchenko
        mode=constants.INSTANCE_CREATE,
341 2f7635f4 Oleksiy Mishchenko
        os_type=opts.get('os'),
342 2f7635f4 Oleksiy Mishchenko
        pnode=opts.get('pnode'),
343 2f7635f4 Oleksiy Mishchenko
        snode=opts.get('snode'),
344 2f7635f4 Oleksiy Mishchenko
        ip=opts.get('ip', 'none'),
345 2f7635f4 Oleksiy Mishchenko
        bridge=opts.get('bridge', None),
346 2f7635f4 Oleksiy Mishchenko
        start=opts.get('start', True),
347 2f7635f4 Oleksiy Mishchenko
        ip_check=opts.get('ip_check', True),
348 2f7635f4 Oleksiy Mishchenko
        wait_for_sync=opts.get('wait_for_sync', True),
349 2f7635f4 Oleksiy Mishchenko
        mac=opts.get('mac', 'auto'),
350 2f7635f4 Oleksiy Mishchenko
        hypervisor=opts.get('hypervisor', None),
351 d50b3059 Oleksiy Mishchenko
        hvparams=hvparams,
352 2f7635f4 Oleksiy Mishchenko
        beparams=beparams,
353 2f7635f4 Oleksiy Mishchenko
        iallocator=opts.get('iallocator', None),
354 2f7635f4 Oleksiy Mishchenko
        file_storage_dir=opts.get('file_storage_dir', None),
355 2f7635f4 Oleksiy Mishchenko
        file_driver=opts.get('file_driver', 'loop'),
356 2f7635f4 Oleksiy Mishchenko
        )
357 2f7635f4 Oleksiy Mishchenko
358 2f7635f4 Oleksiy Mishchenko
    job_id = ganeti.cli.SendJob([op])
359 2f7635f4 Oleksiy Mishchenko
    return job_id
360 2f7635f4 Oleksiy Mishchenko
361 441e7cfd Oleksiy Mishchenko
362 4e5a68f8 Oleksiy Mishchenko
class R_2_instances_name(baserlib.R_Generic):
363 4e5a68f8 Oleksiy Mishchenko
  """/2/instances/[instance_name] resources.
364 028c6b76 Oleksiy Mishchenko

365 028c6b76 Oleksiy Mishchenko
  """
366 4e5a68f8 Oleksiy Mishchenko
  DOC_URI = "/2/instances/[instance_name]"
367 4e5a68f8 Oleksiy Mishchenko
368 4e5a68f8 Oleksiy Mishchenko
  def GET(self):
369 4e5a68f8 Oleksiy Mishchenko
    """Send information about an instance.
370 4e5a68f8 Oleksiy Mishchenko

371 4e5a68f8 Oleksiy Mishchenko
    """
372 4e5a68f8 Oleksiy Mishchenko
    instance_name = self.items[0]
373 4e5a68f8 Oleksiy Mishchenko
    op = ganeti.opcodes.OpQueryInstances(output_fields=I_FIELDS,
374 4e5a68f8 Oleksiy Mishchenko
                                         names=[instance_name])
375 4e5a68f8 Oleksiy Mishchenko
    result = ganeti.cli.SubmitOpCode(op)
376 4e5a68f8 Oleksiy Mishchenko
377 4e5a68f8 Oleksiy Mishchenko
    return baserlib.MapFields(I_FIELDS, result[0])
378 028c6b76 Oleksiy Mishchenko
379 028c6b76 Oleksiy Mishchenko
380 2276aa29 Oleksiy Mishchenko
class R_2_instances_name_reboot(baserlib.R_Generic):
381 2276aa29 Oleksiy Mishchenko
  """/2/instances/[instance_name]/reboot resource.
382 2276aa29 Oleksiy Mishchenko

383 2276aa29 Oleksiy Mishchenko
  Implements an instance reboot.
384 2276aa29 Oleksiy Mishchenko

385 2276aa29 Oleksiy Mishchenko
  """
386 2276aa29 Oleksiy Mishchenko
387 2276aa29 Oleksiy Mishchenko
  DOC_URI = "/2/instances/[instance_name]/reboot"
388 2276aa29 Oleksiy Mishchenko
389 21f04e5e Oleksiy Mishchenko
  def POST(self):
390 2276aa29 Oleksiy Mishchenko
    """Reboot an instance.
391 2276aa29 Oleksiy Mishchenko

392 0c55c24b Oleksiy Mishchenko
    The URI takes type=[hard|soft|full] and
393 0c55c24b Oleksiy Mishchenko
    ignore_secondaries=[False|True] parameters.
394 0c55c24b Oleksiy Mishchenko

395 2276aa29 Oleksiy Mishchenko
    """
396 2276aa29 Oleksiy Mishchenko
    instance_name = self.items[0]
397 0c55c24b Oleksiy Mishchenko
    reboot_type = self.queryargs.get('type',
398 0c55c24b Oleksiy Mishchenko
                                     [constants.INSTANCE_REBOOT_HARD])[0]
399 0c55c24b Oleksiy Mishchenko
    ignore_secondaries = bool(self.queryargs.get('ignore_secondaries',
400 0c55c24b Oleksiy Mishchenko
                                                 [False])[0])
401 2276aa29 Oleksiy Mishchenko
    op = ganeti.opcodes.OpRebootInstance(
402 2276aa29 Oleksiy Mishchenko
        instance_name=instance_name,
403 2276aa29 Oleksiy Mishchenko
        reboot_type=reboot_type,
404 2276aa29 Oleksiy Mishchenko
        ignore_secondaries=ignore_secondaries)
405 2276aa29 Oleksiy Mishchenko
406 2276aa29 Oleksiy Mishchenko
    job_id = ganeti.cli.SendJob([op])
407 2276aa29 Oleksiy Mishchenko
408 2276aa29 Oleksiy Mishchenko
    return job_id
409 2276aa29 Oleksiy Mishchenko
410 2276aa29 Oleksiy Mishchenko
411 0c55c24b Oleksiy Mishchenko
class R_2_instances_name_startup(baserlib.R_Generic):
412 0c55c24b Oleksiy Mishchenko
  """/2/instances/[instance_name]/startup resource.
413 0c55c24b Oleksiy Mishchenko

414 0c55c24b Oleksiy Mishchenko
  Implements an instance startup.
415 0c55c24b Oleksiy Mishchenko

416 0c55c24b Oleksiy Mishchenko
  """
417 0c55c24b Oleksiy Mishchenko
418 0c55c24b Oleksiy Mishchenko
  DOC_URI = "/2/instances/[instance_name]/startup"
419 0c55c24b Oleksiy Mishchenko
420 21f04e5e Oleksiy Mishchenko
  def PUT(self):
421 0c55c24b Oleksiy Mishchenko
    """Startup an instance.
422 0c55c24b Oleksiy Mishchenko

423 c41eea6e Iustin Pop
    The URI takes force=[False|True] parameter to start the instance
424 c41eea6e Iustin Pop
    if even if secondary disks are failing.
425 0c55c24b Oleksiy Mishchenko

426 0c55c24b Oleksiy Mishchenko
    """
427 0c55c24b Oleksiy Mishchenko
    instance_name = self.items[0]
428 0c55c24b Oleksiy Mishchenko
    force_startup = bool(self.queryargs.get('force', [False])[0])
429 0c55c24b Oleksiy Mishchenko
    op = ganeti.opcodes.OpStartupInstance(instance_name=instance_name,
430 0c55c24b Oleksiy Mishchenko
                                          force=force_startup)
431 0c55c24b Oleksiy Mishchenko
432 0c55c24b Oleksiy Mishchenko
    job_id = ganeti.cli.SendJob([op])
433 0c55c24b Oleksiy Mishchenko
434 0c55c24b Oleksiy Mishchenko
    return job_id
435 0c55c24b Oleksiy Mishchenko
436 0c55c24b Oleksiy Mishchenko
437 0c55c24b Oleksiy Mishchenko
class R_2_instances_name_shutdown(baserlib.R_Generic):
438 0c55c24b Oleksiy Mishchenko
  """/2/instances/[instance_name]/shutdown resource.
439 0c55c24b Oleksiy Mishchenko

440 0c55c24b Oleksiy Mishchenko
  Implements an instance shutdown.
441 0c55c24b Oleksiy Mishchenko

442 0c55c24b Oleksiy Mishchenko
  """
443 0c55c24b Oleksiy Mishchenko
444 0c55c24b Oleksiy Mishchenko
  DOC_URI = "/2/instances/[instance_name]/shutdown"
445 0c55c24b Oleksiy Mishchenko
446 21f04e5e Oleksiy Mishchenko
  def PUT(self):
447 0c55c24b Oleksiy Mishchenko
    """Shutdown an instance.
448 0c55c24b Oleksiy Mishchenko

449 0c55c24b Oleksiy Mishchenko
    """
450 0c55c24b Oleksiy Mishchenko
    instance_name = self.items[0]
451 0c55c24b Oleksiy Mishchenko
    op = ganeti.opcodes.OpShutdownInstance(instance_name=instance_name)
452 0c55c24b Oleksiy Mishchenko
453 0c55c24b Oleksiy Mishchenko
    job_id = ganeti.cli.SendJob([op])
454 0c55c24b Oleksiy Mishchenko
455 0c55c24b Oleksiy Mishchenko
    return job_id
456 0c55c24b Oleksiy Mishchenko
457 0c55c24b Oleksiy Mishchenko
458 441e7cfd Oleksiy Mishchenko
class R_2_instances_name_tags(baserlib.R_Generic):
459 441e7cfd Oleksiy Mishchenko
  """/2/instances/[instance_name]/tags resource.
460 441e7cfd Oleksiy Mishchenko

461 441e7cfd Oleksiy Mishchenko
  Manages per-instance tags.
462 441e7cfd Oleksiy Mishchenko

463 441e7cfd Oleksiy Mishchenko
  """
464 441e7cfd Oleksiy Mishchenko
  DOC_URI = "/2/instances/[instance_name]/tags"
465 441e7cfd Oleksiy Mishchenko
466 441e7cfd Oleksiy Mishchenko
  def GET(self):
467 441e7cfd Oleksiy Mishchenko
    """Returns a list of instance tags.
468 441e7cfd Oleksiy Mishchenko

469 441e7cfd Oleksiy Mishchenko
    Example: ["tag1", "tag2", "tag3"]
470 441e7cfd Oleksiy Mishchenko

471 441e7cfd Oleksiy Mishchenko
    """
472 441e7cfd Oleksiy Mishchenko
    return baserlib._Tags_GET(constants.TAG_INSTANCE, name=self.items[0])
473 441e7cfd Oleksiy Mishchenko
474 21f04e5e Oleksiy Mishchenko
  def PUT(self):
475 441e7cfd Oleksiy Mishchenko
    """Add a set of tags to the instance.
476 441e7cfd Oleksiy Mishchenko

477 c41eea6e Iustin Pop
    The request as a list of strings should be PUT to this URI. And
478 c41eea6e Iustin Pop
    you'll have back a job id.
479 441e7cfd Oleksiy Mishchenko

480 441e7cfd Oleksiy Mishchenko
    """
481 21f04e5e Oleksiy Mishchenko
    return baserlib._Tags_PUT(constants.TAG_INSTANCE,
482 f6f91001 Iustin Pop
                              self.req.request_post_data, name=self.items[0])
483 15fd9fd5 Oleksiy Mishchenko
484 15fd9fd5 Oleksiy Mishchenko
  def DELETE(self):
485 15fd9fd5 Oleksiy Mishchenko
    """Delete a tag.
486 15fd9fd5 Oleksiy Mishchenko

487 c41eea6e Iustin Pop
    In order to delete a set of tags from a instance, the DELETE
488 c41eea6e Iustin Pop
    request should be addressed to URI like:
489 c41eea6e Iustin Pop
    /2/instances/[instance_name]/tags?tag=[tag]&tag=[tag]
490 15fd9fd5 Oleksiy Mishchenko

491 15fd9fd5 Oleksiy Mishchenko
    """
492 15fd9fd5 Oleksiy Mishchenko
    if 'tag' not in self.queryargs:
493 15fd9fd5 Oleksiy Mishchenko
      # no we not gonna delete all tags from an instance
494 84f2756e Michael Hanselmann
      raise http.HttpNotImplemented()
495 15fd9fd5 Oleksiy Mishchenko
    return baserlib._Tags_DELETE(constants.TAG_INSTANCE,
496 15fd9fd5 Oleksiy Mishchenko
                                 self.queryargs['tag'],
497 15fd9fd5 Oleksiy Mishchenko
                                 name=self.items[0])