Statistics
| Branch: | Tag: | Revision:

root / lib / opcodes.py @ 1322c697

History | View | Annotate | Download (8.8 kB)

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

24 a8083063 Iustin Pop
This module implements the data structures which define the cluster
25 a8083063 Iustin Pop
operations - the so-called opcodes.
26 a8083063 Iustin Pop

27 a8083063 Iustin Pop

28 a8083063 Iustin Pop
This module implements the logic for doing operations in the cluster. There
29 a8083063 Iustin Pop
are two kinds of classes defined:
30 a8083063 Iustin Pop
  - opcodes, which are small classes only holding data for the task at hand
31 a8083063 Iustin Pop
  - logical units, which know how to deal with their specific opcode only
32 a8083063 Iustin Pop

33 a8083063 Iustin Pop
"""
34 a8083063 Iustin Pop
35 a8083063 Iustin Pop
# this are practically structures, so disable the message about too
36 a8083063 Iustin Pop
# few public methods:
37 a8083063 Iustin Pop
# pylint: disable-msg=R0903
38 a8083063 Iustin Pop
39 a8083063 Iustin Pop
class OpCode(object):
40 a8083063 Iustin Pop
  """Abstract OpCode"""
41 a8083063 Iustin Pop
  OP_ID = "OP_ABSTRACT"
42 a8083063 Iustin Pop
  __slots__ = []
43 a8083063 Iustin Pop
44 a8083063 Iustin Pop
  def __init__(self, **kwargs):
45 a8083063 Iustin Pop
    for key in kwargs:
46 a8083063 Iustin Pop
      if key not in self.__slots__:
47 3ecf6786 Iustin Pop
        raise TypeError("OpCode %s doesn't support the parameter '%s'" %
48 3ecf6786 Iustin Pop
                        (self.__class__.__name__, key))
49 a8083063 Iustin Pop
      setattr(self, key, kwargs[key])
50 a8083063 Iustin Pop
51 a8083063 Iustin Pop
52 a8083063 Iustin Pop
class OpInitCluster(OpCode):
53 a8083063 Iustin Pop
  """Initialise the cluster."""
54 a8083063 Iustin Pop
  OP_ID = "OP_CLUSTER_INIT"
55 a8083063 Iustin Pop
  __slots__ = ["cluster_name", "secondary_ip", "hypervisor_type",
56 1322c697 Manuel Franceschini
               "vg_name", "mac_prefix", "def_bridge", "master_netdev",
57 1322c697 Manuel Franceschini
               "file_storage_dir"]
58 a8083063 Iustin Pop
59 a8083063 Iustin Pop
60 a8083063 Iustin Pop
class OpDestroyCluster(OpCode):
61 a8083063 Iustin Pop
  """Destroy the cluster."""
62 a8083063 Iustin Pop
  OP_ID = "OP_CLUSTER_DESTROY"
63 a8083063 Iustin Pop
  __slots__ = []
64 a8083063 Iustin Pop
65 a8083063 Iustin Pop
66 a8083063 Iustin Pop
class OpQueryClusterInfo(OpCode):
67 fdc267f4 Iustin Pop
  """Query cluster information."""
68 a8083063 Iustin Pop
  OP_ID = "OP_CLUSTER_QUERY"
69 a8083063 Iustin Pop
  __slots__ = []
70 a8083063 Iustin Pop
71 a8083063 Iustin Pop
72 a8083063 Iustin Pop
class OpClusterCopyFile(OpCode):
73 fdc267f4 Iustin Pop
  """Copy a file to multiple nodes."""
74 a8083063 Iustin Pop
  OP_ID = "OP_CLUSTER_COPYFILE"
75 a8083063 Iustin Pop
  __slots__ = ["nodes", "filename"]
76 a8083063 Iustin Pop
77 a8083063 Iustin Pop
78 a8083063 Iustin Pop
class OpRunClusterCommand(OpCode):
79 fdc267f4 Iustin Pop
  """Run a command on multiple nodes."""
80 a8083063 Iustin Pop
  OP_ID = "OP_CLUSTER_RUNCOMMAND"
81 a8083063 Iustin Pop
  __slots__ = ["nodes", "command"]
82 a8083063 Iustin Pop
83 a8083063 Iustin Pop
84 a8083063 Iustin Pop
class OpVerifyCluster(OpCode):
85 fdc267f4 Iustin Pop
  """Verify the cluster state."""
86 a8083063 Iustin Pop
  OP_ID = "OP_CLUSTER_VERIFY"
87 a8083063 Iustin Pop
  __slots__ = []
88 a8083063 Iustin Pop
89 a8083063 Iustin Pop
90 150e978f Iustin Pop
class OpVerifyDisks(OpCode):
91 150e978f Iustin Pop
  """Verify the cluster disks.
92 150e978f Iustin Pop

93 150e978f Iustin Pop
  Parameters: none
94 150e978f Iustin Pop

95 150e978f Iustin Pop
  Result: two lists:
96 150e978f Iustin Pop
    - list of node names with bad data returned (unreachable, etc.)
97 b63ed789 Iustin Pop
    - dist of node names with broken volume groups (values: error msg)
98 150e978f Iustin Pop
    - list of instances with degraded disks (that should be activated)
99 b63ed789 Iustin Pop
    - dict of instances with missing logical volumes (values: (node, vol)
100 b63ed789 Iustin Pop
      pairs with details about the missing volumes)
101 150e978f Iustin Pop

102 b63ed789 Iustin Pop
  In normal operation, all lists should be empty. A non-empty instance
103 b63ed789 Iustin Pop
  list (3rd element of the result) is still ok (errors were fixed) but
104 b63ed789 Iustin Pop
  non-empty node list means some node is down, and probably there are
105 b63ed789 Iustin Pop
  unfixable drbd errors.
106 150e978f Iustin Pop

107 150e978f Iustin Pop
  Note that only instances that are drbd-based are taken into
108 150e978f Iustin Pop
  consideration. This might need to be revisited in the future.
109 150e978f Iustin Pop

110 150e978f Iustin Pop
  """
111 150e978f Iustin Pop
  OP_ID = "OP_CLUSTER_VERIFY_DISKS"
112 150e978f Iustin Pop
  __slots__ = []
113 150e978f Iustin Pop
114 150e978f Iustin Pop
115 a8083063 Iustin Pop
class OpMasterFailover(OpCode):
116 fdc267f4 Iustin Pop
  """Do a master failover."""
117 a8083063 Iustin Pop
  OP_ID = "OP_CLUSTER_MASTERFAILOVER"
118 a8083063 Iustin Pop
  __slots__ = []
119 a8083063 Iustin Pop
120 a8083063 Iustin Pop
121 a8083063 Iustin Pop
class OpDumpClusterConfig(OpCode):
122 fdc267f4 Iustin Pop
  """Dump the cluster configuration."""
123 a8083063 Iustin Pop
  OP_ID = "OP_CLUSTER_DUMPCONFIG"
124 a8083063 Iustin Pop
  __slots__ = []
125 a8083063 Iustin Pop
126 a8083063 Iustin Pop
127 07bd8a51 Iustin Pop
class OpRenameCluster(OpCode):
128 07bd8a51 Iustin Pop
  """Rename the cluster."""
129 07bd8a51 Iustin Pop
  OP_ID = "OP_CLUSTER_RENAME"
130 07bd8a51 Iustin Pop
  __slots__ = ["name"]
131 07bd8a51 Iustin Pop
132 07bd8a51 Iustin Pop
133 07bd8a51 Iustin Pop
# node opcodes
134 07bd8a51 Iustin Pop
135 a8083063 Iustin Pop
class OpRemoveNode(OpCode):
136 a8083063 Iustin Pop
  """Remove a node."""
137 a8083063 Iustin Pop
  OP_ID = "OP_NODE_REMOVE"
138 a8083063 Iustin Pop
  __slots__ = ["node_name"]
139 a8083063 Iustin Pop
140 a8083063 Iustin Pop
141 a8083063 Iustin Pop
class OpAddNode(OpCode):
142 a8083063 Iustin Pop
  """Add a node."""
143 a8083063 Iustin Pop
  OP_ID = "OP_NODE_ADD"
144 a8083063 Iustin Pop
  __slots__ = ["node_name", "primary_ip", "secondary_ip"]
145 a8083063 Iustin Pop
146 a8083063 Iustin Pop
147 a8083063 Iustin Pop
class OpQueryNodes(OpCode):
148 a8083063 Iustin Pop
  """Compute the list of nodes."""
149 a8083063 Iustin Pop
  OP_ID = "OP_NODE_QUERY"
150 246e180a Iustin Pop
  __slots__ = ["output_fields", "names"]
151 a8083063 Iustin Pop
152 a8083063 Iustin Pop
153 dcb93971 Michael Hanselmann
class OpQueryNodeVolumes(OpCode):
154 dcb93971 Michael Hanselmann
  """Get list of volumes on node."""
155 dcb93971 Michael Hanselmann
  OP_ID = "OP_NODE_QUERYVOLS"
156 dcb93971 Michael Hanselmann
  __slots__ = ["nodes", "output_fields"]
157 dcb93971 Michael Hanselmann
158 dcb93971 Michael Hanselmann
159 a8083063 Iustin Pop
# instance opcodes
160 a8083063 Iustin Pop
161 a8083063 Iustin Pop
class OpCreateInstance(OpCode):
162 fdc267f4 Iustin Pop
  """Create an instance."""
163 a8083063 Iustin Pop
  OP_ID = "OP_INSTANCE_CREATE"
164 3b6d8c9b Iustin Pop
  __slots__ = [
165 3b6d8c9b Iustin Pop
    "instance_name", "mem_size", "disk_size", "os_type", "pnode",
166 3b6d8c9b Iustin Pop
    "disk_template", "snode", "swap_size", "mode",
167 3b6d8c9b Iustin Pop
    "vcpus", "ip", "bridge", "src_node", "src_path", "start",
168 3b6d8c9b Iustin Pop
    "wait_for_sync", "ip_check", "mac",
169 25c5878d Alexander Schreiber
    "kernel_path", "initrd_path", "hvm_boot_order",
170 3b6d8c9b Iustin Pop
    ]
171 a8083063 Iustin Pop
172 a8083063 Iustin Pop
173 fe7b0351 Michael Hanselmann
class OpReinstallInstance(OpCode):
174 fdc267f4 Iustin Pop
  """Reinstall an instance's OS."""
175 fe7b0351 Michael Hanselmann
  OP_ID = "OP_INSTANCE_REINSTALL"
176 d0834de3 Michael Hanselmann
  __slots__ = ["instance_name", "os_type"]
177 fe7b0351 Michael Hanselmann
178 fe7b0351 Michael Hanselmann
179 a8083063 Iustin Pop
class OpRemoveInstance(OpCode):
180 a8083063 Iustin Pop
  """Remove an instance."""
181 a8083063 Iustin Pop
  OP_ID = "OP_INSTANCE_REMOVE"
182 1d67656e Iustin Pop
  __slots__ = ["instance_name", "ignore_failures"]
183 a8083063 Iustin Pop
184 a8083063 Iustin Pop
185 decd5f45 Iustin Pop
class OpRenameInstance(OpCode):
186 decd5f45 Iustin Pop
  """Rename an instance."""
187 decd5f45 Iustin Pop
  OP_ID = "OP_INSTANCE_RENAME"
188 decd5f45 Iustin Pop
  __slots__ = ["instance_name", "ignore_ip", "new_name"]
189 decd5f45 Iustin Pop
190 decd5f45 Iustin Pop
191 a8083063 Iustin Pop
class OpStartupInstance(OpCode):
192 fdc267f4 Iustin Pop
  """Startup an instance."""
193 a8083063 Iustin Pop
  OP_ID = "OP_INSTANCE_STARTUP"
194 a8083063 Iustin Pop
  __slots__ = ["instance_name", "force", "extra_args"]
195 a8083063 Iustin Pop
196 a8083063 Iustin Pop
197 a8083063 Iustin Pop
class OpShutdownInstance(OpCode):
198 fdc267f4 Iustin Pop
  """Shutdown an instance."""
199 a8083063 Iustin Pop
  OP_ID = "OP_INSTANCE_SHUTDOWN"
200 a8083063 Iustin Pop
  __slots__ = ["instance_name"]
201 a8083063 Iustin Pop
202 a8083063 Iustin Pop
203 bf6929a2 Alexander Schreiber
class OpRebootInstance(OpCode):
204 bf6929a2 Alexander Schreiber
  """Reboot an instance."""
205 eeb3a5f9 Iustin Pop
  OP_ID = "OP_INSTANCE_REBOOT"
206 bf6929a2 Alexander Schreiber
  __slots__ = ["instance_name", "reboot_type", "extra_args",
207 bf6929a2 Alexander Schreiber
               "ignore_secondaries" ]
208 bf6929a2 Alexander Schreiber
209 bf6929a2 Alexander Schreiber
210 a8083063 Iustin Pop
class OpAddMDDRBDComponent(OpCode):
211 a8083063 Iustin Pop
  """Add a MD-DRBD component."""
212 a8083063 Iustin Pop
  OP_ID = "OP_INSTANCE_ADD_MDDRBD"
213 a8083063 Iustin Pop
  __slots__ = ["instance_name", "remote_node", "disk_name"]
214 a8083063 Iustin Pop
215 a8083063 Iustin Pop
216 a8083063 Iustin Pop
class OpRemoveMDDRBDComponent(OpCode):
217 a8083063 Iustin Pop
  """Remove a MD-DRBD component."""
218 a8083063 Iustin Pop
  OP_ID = "OP_INSTANCE_REMOVE_MDDRBD"
219 a8083063 Iustin Pop
  __slots__ = ["instance_name", "disk_name", "disk_id"]
220 a8083063 Iustin Pop
221 a8083063 Iustin Pop
222 a8083063 Iustin Pop
class OpReplaceDisks(OpCode):
223 fdc267f4 Iustin Pop
  """Replace the disks of an instance."""
224 a8083063 Iustin Pop
  OP_ID = "OP_INSTANCE_REPLACE_DISKS"
225 a9e0c397 Iustin Pop
  __slots__ = ["instance_name", "remote_node", "mode", "disks"]
226 a8083063 Iustin Pop
227 a8083063 Iustin Pop
228 a8083063 Iustin Pop
class OpFailoverInstance(OpCode):
229 a8083063 Iustin Pop
  """Failover an instance."""
230 a8083063 Iustin Pop
  OP_ID = "OP_INSTANCE_FAILOVER"
231 a8083063 Iustin Pop
  __slots__ = ["instance_name", "ignore_consistency"]
232 a8083063 Iustin Pop
233 a8083063 Iustin Pop
234 a8083063 Iustin Pop
class OpConnectConsole(OpCode):
235 fdc267f4 Iustin Pop
  """Connect to an instance's console."""
236 a8083063 Iustin Pop
  OP_ID = "OP_INSTANCE_CONSOLE"
237 a8083063 Iustin Pop
  __slots__ = ["instance_name"]
238 a8083063 Iustin Pop
239 a8083063 Iustin Pop
240 a8083063 Iustin Pop
class OpActivateInstanceDisks(OpCode):
241 fdc267f4 Iustin Pop
  """Activate an instance's disks."""
242 a8083063 Iustin Pop
  OP_ID = "OP_INSTANCE_ACTIVATE_DISKS"
243 a8083063 Iustin Pop
  __slots__ = ["instance_name"]
244 a8083063 Iustin Pop
245 a8083063 Iustin Pop
246 a8083063 Iustin Pop
class OpDeactivateInstanceDisks(OpCode):
247 fdc267f4 Iustin Pop
  """Deactivate an instance's disks."""
248 a8083063 Iustin Pop
  OP_ID = "OP_INSTANCE_DEACTIVATE_DISKS"
249 a8083063 Iustin Pop
  __slots__ = ["instance_name"]
250 a8083063 Iustin Pop
251 a8083063 Iustin Pop
252 a8083063 Iustin Pop
class OpQueryInstances(OpCode):
253 a8083063 Iustin Pop
  """Compute the list of instances."""
254 a8083063 Iustin Pop
  OP_ID = "OP_INSTANCE_QUERY"
255 069dcc86 Iustin Pop
  __slots__ = ["output_fields", "names"]
256 a8083063 Iustin Pop
257 a8083063 Iustin Pop
258 a8083063 Iustin Pop
class OpQueryInstanceData(OpCode):
259 a8083063 Iustin Pop
  """Compute the run-time status of instances."""
260 a8083063 Iustin Pop
  OP_ID = "OP_INSTANCE_QUERY_DATA"
261 a8083063 Iustin Pop
  __slots__ = ["instances"]
262 a8083063 Iustin Pop
263 a8083063 Iustin Pop
264 a8083063 Iustin Pop
class OpSetInstanceParms(OpCode):
265 a8083063 Iustin Pop
  """Change the parameters of an instance."""
266 a8083063 Iustin Pop
  OP_ID = "OP_INSTANCE_SET_PARMS"
267 973d7867 Iustin Pop
  __slots__ = [
268 973d7867 Iustin Pop
    "instance_name", "mem", "vcpus", "ip", "bridge", "mac",
269 25c5878d Alexander Schreiber
    "kernel_path", "initrd_path", "hvm_boot_order",
270 973d7867 Iustin Pop
    ]
271 a8083063 Iustin Pop
272 a8083063 Iustin Pop
273 a8083063 Iustin Pop
# OS opcodes
274 a8083063 Iustin Pop
class OpDiagnoseOS(OpCode):
275 a8083063 Iustin Pop
  """Compute the list of guest operating systems."""
276 a8083063 Iustin Pop
  OP_ID = "OP_OS_DIAGNOSE"
277 a8083063 Iustin Pop
  __slots__ = []
278 a8083063 Iustin Pop
279 7c0d6283 Michael Hanselmann
280 a8083063 Iustin Pop
# Exports opcodes
281 a8083063 Iustin Pop
class OpQueryExports(OpCode):
282 a8083063 Iustin Pop
  """Compute the list of exported images."""
283 a8083063 Iustin Pop
  OP_ID = "OP_BACKUP_QUERY"
284 a8083063 Iustin Pop
  __slots__ = ["nodes"]
285 a8083063 Iustin Pop
286 7c0d6283 Michael Hanselmann
287 a8083063 Iustin Pop
class OpExportInstance(OpCode):
288 a8083063 Iustin Pop
  """Export an instance."""
289 a8083063 Iustin Pop
  OP_ID = "OP_BACKUP_EXPORT"
290 a8083063 Iustin Pop
  __slots__ = ["instance_name", "target_node", "shutdown"]
291 5c947f38 Iustin Pop
292 5c947f38 Iustin Pop
293 5c947f38 Iustin Pop
# Tags opcodes
294 5c947f38 Iustin Pop
class OpGetTags(OpCode):
295 5c947f38 Iustin Pop
  """Returns the tags of the given object."""
296 5c947f38 Iustin Pop
  OP_ID = "OP_TAGS_GET"
297 5c947f38 Iustin Pop
  __slots__ = ["kind", "name"]
298 5c947f38 Iustin Pop
299 5c947f38 Iustin Pop
300 73415719 Iustin Pop
class OpSearchTags(OpCode):
301 73415719 Iustin Pop
  """Searches the tags in the cluster for a given pattern."""
302 73415719 Iustin Pop
  OP_ID = "OP_TAGS_SEARCH"
303 73415719 Iustin Pop
  __slots__ = ["pattern"]
304 73415719 Iustin Pop
305 73415719 Iustin Pop
306 f27302fa Iustin Pop
class OpAddTags(OpCode):
307 f27302fa Iustin Pop
  """Add a list of tags on a given object."""
308 5c947f38 Iustin Pop
  OP_ID = "OP_TAGS_SET"
309 f27302fa Iustin Pop
  __slots__ = ["kind", "name", "tags"]
310 5c947f38 Iustin Pop
311 5c947f38 Iustin Pop
312 f27302fa Iustin Pop
class OpDelTags(OpCode):
313 f27302fa Iustin Pop
  """Remove a list of tags from a given object."""
314 5c947f38 Iustin Pop
  OP_ID = "OP_TAGS_DEL"
315 f27302fa Iustin Pop
  __slots__ = ["kind", "name", "tags"]
316 06009e27 Iustin Pop
317 06009e27 Iustin Pop
318 06009e27 Iustin Pop
# Test opcodes
319 06009e27 Iustin Pop
class OpTestDelay(OpCode):
320 06009e27 Iustin Pop
  """Sleeps for a configured amount of time.
321 06009e27 Iustin Pop

322 06009e27 Iustin Pop
  This is used just for debugging and testing.
323 06009e27 Iustin Pop

324 06009e27 Iustin Pop
  Parameters:
325 06009e27 Iustin Pop
    - duration: the time to sleep
326 06009e27 Iustin Pop
    - on_master: if true, sleep on the master
327 06009e27 Iustin Pop
    - on_nodes: list of nodes in which to sleep
328 06009e27 Iustin Pop

329 06009e27 Iustin Pop
  If the on_master parameter is true, it will execute a sleep on the
330 06009e27 Iustin Pop
  master (before any node sleep).
331 06009e27 Iustin Pop

332 06009e27 Iustin Pop
  If the on_nodes list is not empty, it will sleep on those nodes
333 06009e27 Iustin Pop
  (after the sleep on the master, if that is enabled).
334 06009e27 Iustin Pop

335 06009e27 Iustin Pop
  As an additional feature, the case of duration < 0 will be reported
336 06009e27 Iustin Pop
  as an execution error, so this opcode can be used as a failure
337 06009e27 Iustin Pop
  generator. The case of duration == 0 will not be treated specially.
338 06009e27 Iustin Pop

339 06009e27 Iustin Pop
  """
340 06009e27 Iustin Pop
  OP_ID = "OP_TEST_DELAY"
341 06009e27 Iustin Pop
  __slots__ = ["duration", "on_master", "on_nodes"]