root / lib / rapi / rlib1.py @ bf75f132
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]] |