Statistics
| Branch: | Tag: | Revision:

root / lib / rapi / rlib2.py @ 212fa3a7

History | View | Annotate | Download (7.8 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 441e7cfd Oleksiy Mishchenko
class R_2_instances_name_tags(baserlib.R_Generic):
249 441e7cfd Oleksiy Mishchenko
  """/2/instances/[instance_name]/tags resource.
250 441e7cfd Oleksiy Mishchenko

251 441e7cfd Oleksiy Mishchenko
  Manages per-instance tags.
252 441e7cfd Oleksiy Mishchenko

253 441e7cfd Oleksiy Mishchenko
  """
254 441e7cfd Oleksiy Mishchenko
  DOC_URI = "/2/instances/[instance_name]/tags"
255 441e7cfd Oleksiy Mishchenko
256 441e7cfd Oleksiy Mishchenko
  def GET(self):
257 441e7cfd Oleksiy Mishchenko
    """Returns a list of instance tags.
258 441e7cfd Oleksiy Mishchenko

259 441e7cfd Oleksiy Mishchenko
    Example: ["tag1", "tag2", "tag3"]
260 441e7cfd Oleksiy Mishchenko

261 441e7cfd Oleksiy Mishchenko
    """
262 441e7cfd Oleksiy Mishchenko
    return baserlib._Tags_GET(constants.TAG_INSTANCE, name=self.items[0])
263 441e7cfd Oleksiy Mishchenko
264 441e7cfd Oleksiy Mishchenko
  def POST(self):
265 441e7cfd Oleksiy Mishchenko
    """Add a set of tags to the instance.
266 441e7cfd Oleksiy Mishchenko

267 441e7cfd Oleksiy Mishchenko
    The reqest as a list of strings should be POST to this URI. And you'll have
268 441e7cfd Oleksiy Mishchenko
    back a job id.
269 441e7cfd Oleksiy Mishchenko

270 441e7cfd Oleksiy Mishchenko
    """
271 441e7cfd Oleksiy Mishchenko
    return baserlib._Tags_POST(constants.TAG_INSTANCE,
272 441e7cfd Oleksiy Mishchenko
                               self.post_data, name=self.items[0])
273 15fd9fd5 Oleksiy Mishchenko
274 15fd9fd5 Oleksiy Mishchenko
  def DELETE(self):
275 15fd9fd5 Oleksiy Mishchenko
    """Delete a tag.
276 15fd9fd5 Oleksiy Mishchenko

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

280 15fd9fd5 Oleksiy Mishchenko
    """
281 15fd9fd5 Oleksiy Mishchenko
    if 'tag' not in self.queryargs:
282 15fd9fd5 Oleksiy Mishchenko
      # no we not gonna delete all tags from an instance
283 966405b7 Michael Hanselmann
      raise http.HTTPNotImplemented()
284 15fd9fd5 Oleksiy Mishchenko
    return baserlib._Tags_DELETE(constants.TAG_INSTANCE,
285 15fd9fd5 Oleksiy Mishchenko
                                 self.queryargs['tag'],
286 15fd9fd5 Oleksiy Mishchenko
                                 name=self.items[0])