4 # Copyright (C) 2006, 2007 Google Inc.
6 # This program is free software; you can redistribute it and/or modify
7 # it under the terms of the GNU General Public License as published by
8 # the Free Software Foundation; either version 2 of the License, or
9 # (at your option) any later version.
11 # This program is distributed in the hope that it will be useful, but
12 # WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 # General Public License for more details.
16 # You should have received a copy of the GNU General Public License
17 # along with this program; if not, write to the Free Software
18 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
24 This module implements the data structures which define the cluster
25 operations - the so-called opcodes.
28 This module implements the logic for doing operations in the cluster. There
29 are two kinds of classes defined:
30 - opcodes, which are small classes only holding data for the task at hand
31 - logical units, which know how to deal with their specific opcode only
35 # this are practically structures, so disable the message about too
37 # pylint: disable-msg=R0903
44 def __init__(self, **kwargs):
46 if key not in self.__slots__:
47 raise TypeError("OpCode %s doesn't support the parameter '%s'" %
48 (self.__class__.__name__, key))
49 setattr(self, key, kwargs[key])
52 class OpInitCluster(OpCode):
53 """Initialise the cluster."""
54 OP_ID = "OP_CLUSTER_INIT"
55 __slots__ = ["cluster_name", "secondary_ip", "hypervisor_type",
56 "vg_name", "mac_prefix", "def_bridge", "master_netdev",
60 class OpDestroyCluster(OpCode):
61 """Destroy the cluster."""
62 OP_ID = "OP_CLUSTER_DESTROY"
66 class OpQueryClusterInfo(OpCode):
67 """Query cluster information."""
68 OP_ID = "OP_CLUSTER_QUERY"
72 class OpClusterCopyFile(OpCode):
73 """Copy a file to multiple nodes."""
74 OP_ID = "OP_CLUSTER_COPYFILE"
75 __slots__ = ["nodes", "filename"]
78 class OpRunClusterCommand(OpCode):
79 """Run a command on multiple nodes."""
80 OP_ID = "OP_CLUSTER_RUNCOMMAND"
81 __slots__ = ["nodes", "command"]
84 class OpVerifyCluster(OpCode):
85 """Verify the cluster state."""
86 OP_ID = "OP_CLUSTER_VERIFY"
90 class OpVerifyDisks(OpCode):
91 """Verify the cluster disks.
96 - list of node names with bad data returned (unreachable, etc.)
97 - dist of node names with broken volume groups (values: error msg)
98 - list of instances with degraded disks (that should be activated)
99 - dict of instances with missing logical volumes (values: (node, vol)
100 pairs with details about the missing volumes)
102 In normal operation, all lists should be empty. A non-empty instance
103 list (3rd element of the result) is still ok (errors were fixed) but
104 non-empty node list means some node is down, and probably there are
105 unfixable drbd errors.
107 Note that only instances that are drbd-based are taken into
108 consideration. This might need to be revisited in the future.
111 OP_ID = "OP_CLUSTER_VERIFY_DISKS"
115 class OpMasterFailover(OpCode):
116 """Do a master failover."""
117 OP_ID = "OP_CLUSTER_MASTERFAILOVER"
121 class OpDumpClusterConfig(OpCode):
122 """Dump the cluster configuration."""
123 OP_ID = "OP_CLUSTER_DUMPCONFIG"
127 class OpRenameCluster(OpCode):
128 """Rename the cluster."""
129 OP_ID = "OP_CLUSTER_RENAME"
135 class OpRemoveNode(OpCode):
137 OP_ID = "OP_NODE_REMOVE"
138 __slots__ = ["node_name"]
141 class OpAddNode(OpCode):
143 OP_ID = "OP_NODE_ADD"
144 __slots__ = ["node_name", "primary_ip", "secondary_ip"]
147 class OpQueryNodes(OpCode):
148 """Compute the list of nodes."""
149 OP_ID = "OP_NODE_QUERY"
150 __slots__ = ["output_fields", "names"]
153 class OpQueryNodeVolumes(OpCode):
154 """Get list of volumes on node."""
155 OP_ID = "OP_NODE_QUERYVOLS"
156 __slots__ = ["nodes", "output_fields"]
161 class OpCreateInstance(OpCode):
162 """Create an instance."""
163 OP_ID = "OP_INSTANCE_CREATE"
165 "instance_name", "mem_size", "disk_size", "os_type", "pnode",
166 "disk_template", "snode", "swap_size", "mode",
167 "vcpus", "ip", "bridge", "src_node", "src_path", "start",
168 "wait_for_sync", "ip_check", "mac",
169 "kernel_path", "initrd_path", "hvm_boot_order",
173 class OpReinstallInstance(OpCode):
174 """Reinstall an instance's OS."""
175 OP_ID = "OP_INSTANCE_REINSTALL"
176 __slots__ = ["instance_name", "os_type"]
179 class OpRemoveInstance(OpCode):
180 """Remove an instance."""
181 OP_ID = "OP_INSTANCE_REMOVE"
182 __slots__ = ["instance_name", "ignore_failures"]
185 class OpRenameInstance(OpCode):
186 """Rename an instance."""
187 OP_ID = "OP_INSTANCE_RENAME"
188 __slots__ = ["instance_name", "ignore_ip", "new_name"]
191 class OpStartupInstance(OpCode):
192 """Startup an instance."""
193 OP_ID = "OP_INSTANCE_STARTUP"
194 __slots__ = ["instance_name", "force", "extra_args"]
197 class OpShutdownInstance(OpCode):
198 """Shutdown an instance."""
199 OP_ID = "OP_INSTANCE_SHUTDOWN"
200 __slots__ = ["instance_name"]
203 class OpRebootInstance(OpCode):
204 """Reboot an instance."""
205 OP_ID = "OP_INSTANCE_REBOOT"
206 __slots__ = ["instance_name", "reboot_type", "extra_args",
207 "ignore_secondaries" ]
210 class OpAddMDDRBDComponent(OpCode):
211 """Add a MD-DRBD component."""
212 OP_ID = "OP_INSTANCE_ADD_MDDRBD"
213 __slots__ = ["instance_name", "remote_node", "disk_name"]
216 class OpRemoveMDDRBDComponent(OpCode):
217 """Remove a MD-DRBD component."""
218 OP_ID = "OP_INSTANCE_REMOVE_MDDRBD"
219 __slots__ = ["instance_name", "disk_name", "disk_id"]
222 class OpReplaceDisks(OpCode):
223 """Replace the disks of an instance."""
224 OP_ID = "OP_INSTANCE_REPLACE_DISKS"
225 __slots__ = ["instance_name", "remote_node", "mode", "disks"]
228 class OpFailoverInstance(OpCode):
229 """Failover an instance."""
230 OP_ID = "OP_INSTANCE_FAILOVER"
231 __slots__ = ["instance_name", "ignore_consistency"]
234 class OpConnectConsole(OpCode):
235 """Connect to an instance's console."""
236 OP_ID = "OP_INSTANCE_CONSOLE"
237 __slots__ = ["instance_name"]
240 class OpActivateInstanceDisks(OpCode):
241 """Activate an instance's disks."""
242 OP_ID = "OP_INSTANCE_ACTIVATE_DISKS"
243 __slots__ = ["instance_name"]
246 class OpDeactivateInstanceDisks(OpCode):
247 """Deactivate an instance's disks."""
248 OP_ID = "OP_INSTANCE_DEACTIVATE_DISKS"
249 __slots__ = ["instance_name"]
252 class OpQueryInstances(OpCode):
253 """Compute the list of instances."""
254 OP_ID = "OP_INSTANCE_QUERY"
255 __slots__ = ["output_fields", "names"]
258 class OpQueryInstanceData(OpCode):
259 """Compute the run-time status of instances."""
260 OP_ID = "OP_INSTANCE_QUERY_DATA"
261 __slots__ = ["instances"]
264 class OpSetInstanceParms(OpCode):
265 """Change the parameters of an instance."""
266 OP_ID = "OP_INSTANCE_SET_PARMS"
268 "instance_name", "mem", "vcpus", "ip", "bridge", "mac",
269 "kernel_path", "initrd_path", "hvm_boot_order",
274 class OpDiagnoseOS(OpCode):
275 """Compute the list of guest operating systems."""
276 OP_ID = "OP_OS_DIAGNOSE"
281 class OpQueryExports(OpCode):
282 """Compute the list of exported images."""
283 OP_ID = "OP_BACKUP_QUERY"
284 __slots__ = ["nodes"]
287 class OpExportInstance(OpCode):
288 """Export an instance."""
289 OP_ID = "OP_BACKUP_EXPORT"
290 __slots__ = ["instance_name", "target_node", "shutdown"]
294 class OpGetTags(OpCode):
295 """Returns the tags of the given object."""
296 OP_ID = "OP_TAGS_GET"
297 __slots__ = ["kind", "name"]
300 class OpSearchTags(OpCode):
301 """Searches the tags in the cluster for a given pattern."""
302 OP_ID = "OP_TAGS_SEARCH"
303 __slots__ = ["pattern"]
306 class OpAddTags(OpCode):
307 """Add a list of tags on a given object."""
308 OP_ID = "OP_TAGS_SET"
309 __slots__ = ["kind", "name", "tags"]
312 class OpDelTags(OpCode):
313 """Remove a list of tags from a given object."""
314 OP_ID = "OP_TAGS_DEL"
315 __slots__ = ["kind", "name", "tags"]
319 class OpTestDelay(OpCode):
320 """Sleeps for a configured amount of time.
322 This is used just for debugging and testing.
325 - duration: the time to sleep
326 - on_master: if true, sleep on the master
327 - on_nodes: list of nodes in which to sleep
329 If the on_master parameter is true, it will execute a sleep on the
330 master (before any node sleep).
332 If the on_nodes list is not empty, it will sleep on those nodes
333 (after the sleep on the master, if that is enabled).
335 As an additional feature, the case of duration < 0 will be reported
336 as an execution error, so this opcode can be used as a failure
337 generator. The case of duration == 0 will not be treated specially.
340 OP_ID = "OP_TEST_DELAY"
341 __slots__ = ["duration", "on_master", "on_nodes"]