Statistics
| Branch: | Tag: | Revision:

root / lib / rapi / rlib1.py @ c41eea6e

History | View | Annotate | Download (5.4 kB)

1 8c229cc7 Oleksiy Mishchenko
#
2 8c229cc7 Oleksiy Mishchenko
#
3 8c229cc7 Oleksiy Mishchenko
4 8c229cc7 Oleksiy Mishchenko
# Copyright (C) 2006, 2007, 2008 Google Inc.
5 8c229cc7 Oleksiy Mishchenko
#
6 8c229cc7 Oleksiy Mishchenko
# This program is free software; you can redistribute it and/or modify
7 8c229cc7 Oleksiy Mishchenko
# it under the terms of the GNU General Public License as published by
8 8c229cc7 Oleksiy Mishchenko
# the Free Software Foundation; either version 2 of the License, or
9 8c229cc7 Oleksiy Mishchenko
# (at your option) any later version.
10 8c229cc7 Oleksiy Mishchenko
#
11 8c229cc7 Oleksiy Mishchenko
# This program is distributed in the hope that it will be useful, but
12 8c229cc7 Oleksiy Mishchenko
# WITHOUT ANY WARRANTY; without even the implied warranty of
13 8c229cc7 Oleksiy Mishchenko
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 8c229cc7 Oleksiy Mishchenko
# General Public License for more details.
15 8c229cc7 Oleksiy Mishchenko
#
16 8c229cc7 Oleksiy Mishchenko
# You should have received a copy of the GNU General Public License
17 8c229cc7 Oleksiy Mishchenko
# along with this program; if not, write to the Free Software
18 8c229cc7 Oleksiy Mishchenko
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19 8c229cc7 Oleksiy Mishchenko
# 02110-1301, USA.
20 8c229cc7 Oleksiy Mishchenko
21 8c229cc7 Oleksiy Mishchenko
22 10b207d4 Oleksiy Mishchenko
"""Remote API version 1 resources library.
23 8c229cc7 Oleksiy Mishchenko

24 8c229cc7 Oleksiy Mishchenko
"""
25 8c229cc7 Oleksiy Mishchenko
26 8c229cc7 Oleksiy Mishchenko
import ganeti.cli
27 10b207d4 Oleksiy Mishchenko
import ganeti.errors
28 10b207d4 Oleksiy Mishchenko
import ganeti.opcodes
29 8c229cc7 Oleksiy Mishchenko
30 8c229cc7 Oleksiy Mishchenko
from ganeti import constants
31 937e4814 Michael Hanselmann
from ganeti import http
32 8c229cc7 Oleksiy Mishchenko
33 38206f3c Iustin Pop
from ganeti.rapi import baserlib
34 8c229cc7 Oleksiy Mishchenko
35 8c229cc7 Oleksiy Mishchenko
36 2f7635f4 Oleksiy Mishchenko
I_FIELDS = ["name", "os", "pnode", "snodes", "admin_state", "disk_template",
37 1a05d855 Oleksiy Mishchenko
            "ip", "mac", "bridge", "sda_size", "sdb_size", "beparams",
38 51ee2f49 Oleksiy Mishchenko
            "oper_state", "status", "tags"]
39 51ee2f49 Oleksiy Mishchenko
40 38206f3c Iustin Pop
N_FIELDS = ["name", "dtotal", "dfree",
41 51ee2f49 Oleksiy Mishchenko
            "mtotal", "mnode", "mfree",
42 51ee2f49 Oleksiy Mishchenko
            "pinst_cnt", "sinst_cnt", "tags"]
43 51ee2f49 Oleksiy Mishchenko
44 51ee2f49 Oleksiy Mishchenko
45 10b207d4 Oleksiy Mishchenko
class R_version(baserlib.R_Generic):
46 8c229cc7 Oleksiy Mishchenko
  """/version resource.
47 8c229cc7 Oleksiy Mishchenko

48 c41eea6e Iustin Pop
  This resource should be used to determine the remote API version and
49 c41eea6e Iustin Pop
  to adapt clients accordingly.
50 8c229cc7 Oleksiy Mishchenko

51 8c229cc7 Oleksiy Mishchenko
  """
52 8c229cc7 Oleksiy Mishchenko
  DOC_URI = "/version"
53 8c229cc7 Oleksiy Mishchenko
54 8c229cc7 Oleksiy Mishchenko
  def GET(self):
55 8c229cc7 Oleksiy Mishchenko
    """Returns the remote API version.
56 8c229cc7 Oleksiy Mishchenko

57 8c229cc7 Oleksiy Mishchenko
    """
58 8c229cc7 Oleksiy Mishchenko
    return constants.RAPI_VERSION
59 8c229cc7 Oleksiy Mishchenko
60 8c229cc7 Oleksiy Mishchenko
61 10b207d4 Oleksiy Mishchenko
class R_tags(baserlib.R_Generic):
62 8c229cc7 Oleksiy Mishchenko
  """/tags resource.
63 8c229cc7 Oleksiy Mishchenko

64 8c229cc7 Oleksiy Mishchenko
  Manages cluster tags.
65 8c229cc7 Oleksiy Mishchenko

66 8c229cc7 Oleksiy Mishchenko
  """
67 8c229cc7 Oleksiy Mishchenko
  DOC_URI = "/tags"
68 8c229cc7 Oleksiy Mishchenko
69 8c229cc7 Oleksiy Mishchenko
  def GET(self):
70 8c229cc7 Oleksiy Mishchenko
    """Returns a list of all cluster tags.
71 8c229cc7 Oleksiy Mishchenko

72 8c229cc7 Oleksiy Mishchenko
    Example: ["tag1", "tag2", "tag3"]
73 8c229cc7 Oleksiy Mishchenko

74 8c229cc7 Oleksiy Mishchenko
    """
75 10b207d4 Oleksiy Mishchenko
    return baserlib._Tags_GET(constants.TAG_CLUSTER)
76 8c229cc7 Oleksiy Mishchenko
77 8c229cc7 Oleksiy Mishchenko
78 10b207d4 Oleksiy Mishchenko
class R_info(baserlib.R_Generic):
79 8c229cc7 Oleksiy Mishchenko
  """Cluster info.
80 8c229cc7 Oleksiy Mishchenko

81 8c229cc7 Oleksiy Mishchenko
  """
82 8c229cc7 Oleksiy Mishchenko
  DOC_URI = "/info"
83 8c229cc7 Oleksiy Mishchenko
84 8c229cc7 Oleksiy Mishchenko
  def GET(self):
85 8c229cc7 Oleksiy Mishchenko
    """Returns cluster information.
86 8c229cc7 Oleksiy Mishchenko

87 c41eea6e Iustin Pop
    Example::
88 c41eea6e Iustin Pop

89 c41eea6e Iustin Pop
      {
90 c41eea6e Iustin Pop
        "config_version": 3,
91 c41eea6e Iustin Pop
        "name": "cluster1.example.com",
92 c41eea6e Iustin Pop
        "software_version": "1.2.4",
93 c41eea6e Iustin Pop
        "os_api_version": 5,
94 c41eea6e Iustin Pop
        "export_version": 0,
95 c41eea6e Iustin Pop
        "master": "node1.example.com",
96 c41eea6e Iustin Pop
        "architecture": [
97 c41eea6e Iustin Pop
          "64bit",
98 c41eea6e Iustin Pop
          "x86_64"
99 c41eea6e Iustin Pop
        ],
100 c41eea6e Iustin Pop
        "hypervisor_type": "xen-pvm",
101 c41eea6e Iustin Pop
        "protocol_version": 12
102 c41eea6e Iustin Pop
      }
103 8c229cc7 Oleksiy Mishchenko

104 8c229cc7 Oleksiy Mishchenko
    """
105 8c229cc7 Oleksiy Mishchenko
    op = ganeti.opcodes.OpQueryClusterInfo()
106 8c229cc7 Oleksiy Mishchenko
    return ganeti.cli.SubmitOpCode(op)
107 8c229cc7 Oleksiy Mishchenko
108 8c229cc7 Oleksiy Mishchenko
109 10b207d4 Oleksiy Mishchenko
class R_nodes_name(baserlib.R_Generic):
110 8c229cc7 Oleksiy Mishchenko
  """/nodes/[node_name] resources.
111 8c229cc7 Oleksiy Mishchenko

112 8c229cc7 Oleksiy Mishchenko
  """
113 8c229cc7 Oleksiy Mishchenko
  DOC_URI = "/nodes/[node_name]"
114 8c229cc7 Oleksiy Mishchenko
115 8c229cc7 Oleksiy Mishchenko
  def GET(self):
116 38206f3c Iustin Pop
    """Send information about a node.
117 8c229cc7 Oleksiy Mishchenko

118 8c229cc7 Oleksiy Mishchenko
    """
119 8c229cc7 Oleksiy Mishchenko
    node_name = self.items[0]
120 51ee2f49 Oleksiy Mishchenko
    op = ganeti.opcodes.OpQueryNodes(output_fields=N_FIELDS,
121 8c229cc7 Oleksiy Mishchenko
                                     names=[node_name])
122 8c229cc7 Oleksiy Mishchenko
    result = ganeti.cli.SubmitOpCode(op)
123 8c229cc7 Oleksiy Mishchenko
124 51ee2f49 Oleksiy Mishchenko
    return baserlib.MapFields(N_FIELDS, result[0])
125 8c229cc7 Oleksiy Mishchenko
126 8c229cc7 Oleksiy Mishchenko
127 10b207d4 Oleksiy Mishchenko
class R_nodes_name_tags(baserlib.R_Generic):
128 8c229cc7 Oleksiy Mishchenko
  """/nodes/[node_name]/tags resource.
129 8c229cc7 Oleksiy Mishchenko

130 8c229cc7 Oleksiy Mishchenko
  Manages per-node tags.
131 8c229cc7 Oleksiy Mishchenko

132 8c229cc7 Oleksiy Mishchenko
  """
133 8c229cc7 Oleksiy Mishchenko
  DOC_URI = "/nodes/[node_name]/tags"
134 8c229cc7 Oleksiy Mishchenko
135 8c229cc7 Oleksiy Mishchenko
  def GET(self):
136 8c229cc7 Oleksiy Mishchenko
    """Returns a list of node tags.
137 8c229cc7 Oleksiy Mishchenko

138 8c229cc7 Oleksiy Mishchenko
    Example: ["tag1", "tag2", "tag3"]
139 8c229cc7 Oleksiy Mishchenko

140 8c229cc7 Oleksiy Mishchenko
    """
141 10b207d4 Oleksiy Mishchenko
    return baserlib._Tags_GET(constants.TAG_NODE, name=self.items[0])
142 8c229cc7 Oleksiy Mishchenko
143 8c229cc7 Oleksiy Mishchenko
144 10b207d4 Oleksiy Mishchenko
class R_instances_name(baserlib.R_Generic):
145 8c229cc7 Oleksiy Mishchenko
  """/instances/[instance_name] resources.
146 8c229cc7 Oleksiy Mishchenko

147 8c229cc7 Oleksiy Mishchenko
  """
148 8c229cc7 Oleksiy Mishchenko
  DOC_URI = "/instances/[instance_name]"
149 8c229cc7 Oleksiy Mishchenko
150 8c229cc7 Oleksiy Mishchenko
  def GET(self):
151 8c229cc7 Oleksiy Mishchenko
    """Send information about an instance.
152 8c229cc7 Oleksiy Mishchenko

153 8c229cc7 Oleksiy Mishchenko
    """
154 8c229cc7 Oleksiy Mishchenko
    instance_name = self.items[0]
155 51ee2f49 Oleksiy Mishchenko
    op = ganeti.opcodes.OpQueryInstances(output_fields=I_FIELDS,
156 8c229cc7 Oleksiy Mishchenko
                                         names=[instance_name])
157 8c229cc7 Oleksiy Mishchenko
    result = ganeti.cli.SubmitOpCode(op)
158 8c229cc7 Oleksiy Mishchenko
159 51ee2f49 Oleksiy Mishchenko
    return baserlib.MapFields(I_FIELDS, result[0])
160 8c229cc7 Oleksiy Mishchenko
161 2f7635f4 Oleksiy Mishchenko
  def DELETE(self):
162 2f7635f4 Oleksiy Mishchenko
    """Removes an instance.
163 2f7635f4 Oleksiy Mishchenko

164 2f7635f4 Oleksiy Mishchenko
    """
165 2f7635f4 Oleksiy Mishchenko
    instance_name = self.items[0]
166 2f7635f4 Oleksiy Mishchenko
    op = ganeti.opcodes.OpRemoveInstance(instance_name=instance_name,
167 2f7635f4 Oleksiy Mishchenko
                                         ignore_failures=True)
168 2f7635f4 Oleksiy Mishchenko
    job_id = ganeti.cli.SendJob([op])
169 2f7635f4 Oleksiy Mishchenko
170 2f7635f4 Oleksiy Mishchenko
    return job_id
171 2f7635f4 Oleksiy Mishchenko
172 21f04e5e Oleksiy Mishchenko
  def PUT(self):
173 d50b3059 Oleksiy Mishchenko
    """Modify an instance.
174 d50b3059 Oleksiy Mishchenko

175 d50b3059 Oleksiy Mishchenko
    """
176 d50b3059 Oleksiy Mishchenko
    instance_name = self.items[0]
177 d50b3059 Oleksiy Mishchenko
    opts = {}
178 d50b3059 Oleksiy Mishchenko
179 d50b3059 Oleksiy Mishchenko
    for key in self.queryargs:
180 d50b3059 Oleksiy Mishchenko
      opts[key] = self.queryargs[key][0]
181 d50b3059 Oleksiy Mishchenko
182 d50b3059 Oleksiy Mishchenko
    beparams = baserlib.MakeParamsDict(opts, constants.BES_PARAMETERS)
183 d50b3059 Oleksiy Mishchenko
    hvparams = baserlib.MakeParamsDict(opts, constants.HVS_PARAMETERS)
184 d50b3059 Oleksiy Mishchenko
185 d50b3059 Oleksiy Mishchenko
    op = ganeti.opcodes.OpSetInstanceParams(
186 d50b3059 Oleksiy Mishchenko
        instance_name=instance_name,
187 d50b3059 Oleksiy Mishchenko
        ip=opts.get('ip', None),
188 d50b3059 Oleksiy Mishchenko
        bridge=opts.get('bridge', None),
189 d50b3059 Oleksiy Mishchenko
        mac=opts.get('mac', None),
190 d50b3059 Oleksiy Mishchenko
        hvparams=hvparams,
191 d50b3059 Oleksiy Mishchenko
        beparams=beparams,
192 d50b3059 Oleksiy Mishchenko
        force=opts.get('force', None))
193 d50b3059 Oleksiy Mishchenko
194 d50b3059 Oleksiy Mishchenko
    job_id = ganeti.cli.SendJob([op])
195 d50b3059 Oleksiy Mishchenko
196 d50b3059 Oleksiy Mishchenko
    return job_id
197 d50b3059 Oleksiy Mishchenko
198 8c229cc7 Oleksiy Mishchenko
199 10b207d4 Oleksiy Mishchenko
class R_instances_name_tags(baserlib.R_Generic):
200 8c229cc7 Oleksiy Mishchenko
  """/instances/[instance_name]/tags resource.
201 8c229cc7 Oleksiy Mishchenko

202 8c229cc7 Oleksiy Mishchenko
  Manages per-instance tags.
203 8c229cc7 Oleksiy Mishchenko

204 8c229cc7 Oleksiy Mishchenko
  """
205 8c229cc7 Oleksiy Mishchenko
  DOC_URI = "/instances/[instance_name]/tags"
206 8c229cc7 Oleksiy Mishchenko
207 8c229cc7 Oleksiy Mishchenko
  def GET(self):
208 8c229cc7 Oleksiy Mishchenko
    """Returns a list of instance tags.
209 8c229cc7 Oleksiy Mishchenko

210 8c229cc7 Oleksiy Mishchenko
    Example: ["tag1", "tag2", "tag3"]
211 8c229cc7 Oleksiy Mishchenko

212 8c229cc7 Oleksiy Mishchenko
    """
213 10b207d4 Oleksiy Mishchenko
    return baserlib._Tags_GET(constants.TAG_INSTANCE, name=self.items[0])
214 8c229cc7 Oleksiy Mishchenko
215 8c229cc7 Oleksiy Mishchenko
216 10b207d4 Oleksiy Mishchenko
class R_os(baserlib.R_Generic):
217 8c229cc7 Oleksiy Mishchenko
  """/os resource.
218 8c229cc7 Oleksiy Mishchenko

219 8c229cc7 Oleksiy Mishchenko
  """
220 8c229cc7 Oleksiy Mishchenko
  DOC_URI = "/os"
221 8c229cc7 Oleksiy Mishchenko
222 8c229cc7 Oleksiy Mishchenko
  def GET(self):
223 8c229cc7 Oleksiy Mishchenko
    """Return a list of all OSes.
224 8c229cc7 Oleksiy Mishchenko

225 8c229cc7 Oleksiy Mishchenko
    Can return error 500 in case of a problem.
226 8c229cc7 Oleksiy Mishchenko

227 8c229cc7 Oleksiy Mishchenko
    Example: ["debian-etch"]
228 8c229cc7 Oleksiy Mishchenko

229 8c229cc7 Oleksiy Mishchenko
    """
230 8c229cc7 Oleksiy Mishchenko
    op = ganeti.opcodes.OpDiagnoseOS(output_fields=["name", "valid"],
231 8c229cc7 Oleksiy Mishchenko
                                     names=[])
232 8c229cc7 Oleksiy Mishchenko
    diagnose_data = ganeti.cli.SubmitOpCode(op)
233 8c229cc7 Oleksiy Mishchenko
234 8c229cc7 Oleksiy Mishchenko
    if not isinstance(diagnose_data, list):
235 84f2756e Michael Hanselmann
      raise http.HttpInternalError(message="Can't get OS list")
236 8c229cc7 Oleksiy Mishchenko
237 8c229cc7 Oleksiy Mishchenko
    return [row[0] for row in diagnose_data if row[1]]