Statistics
| Branch: | Tag: | Revision:

root / lib / opcodes.py @ 973d7867

History | View | Annotate | Download (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 880478f8 Iustin Pop
               "vg_name", "mac_prefix", "def_bridge", "master_netdev"]
57 a8083063 Iustin Pop
58 a8083063 Iustin Pop
59 a8083063 Iustin Pop
class OpDestroyCluster(OpCode):
60 a8083063 Iustin Pop
  """Destroy the cluster."""
61 a8083063 Iustin Pop
  OP_ID = "OP_CLUSTER_DESTROY"
62 a8083063 Iustin Pop
  __slots__ = []
63 a8083063 Iustin Pop
64 a8083063 Iustin Pop
65 a8083063 Iustin Pop
class OpQueryClusterInfo(OpCode):
66 fdc267f4 Iustin Pop
  """Query cluster information."""
67 a8083063 Iustin Pop
  OP_ID = "OP_CLUSTER_QUERY"
68 a8083063 Iustin Pop
  __slots__ = []
69 a8083063 Iustin Pop
70 a8083063 Iustin Pop
71 a8083063 Iustin Pop
class OpClusterCopyFile(OpCode):
72 fdc267f4 Iustin Pop
  """Copy a file to multiple nodes."""
73 a8083063 Iustin Pop
  OP_ID = "OP_CLUSTER_COPYFILE"
74 a8083063 Iustin Pop
  __slots__ = ["nodes", "filename"]
75 a8083063 Iustin Pop
76 a8083063 Iustin Pop
77 a8083063 Iustin Pop
class OpRunClusterCommand(OpCode):
78 fdc267f4 Iustin Pop
  """Run a command on multiple nodes."""
79 a8083063 Iustin Pop
  OP_ID = "OP_CLUSTER_RUNCOMMAND"
80 a8083063 Iustin Pop
  __slots__ = ["nodes", "command"]
81 a8083063 Iustin Pop
82 a8083063 Iustin Pop
83 a8083063 Iustin Pop
class OpVerifyCluster(OpCode):
84 fdc267f4 Iustin Pop
  """Verify the cluster state."""
85 a8083063 Iustin Pop
  OP_ID = "OP_CLUSTER_VERIFY"
86 a8083063 Iustin Pop
  __slots__ = []
87 a8083063 Iustin Pop
88 a8083063 Iustin Pop
89 150e978f Iustin Pop
class OpVerifyDisks(OpCode):
90 150e978f Iustin Pop
  """Verify the cluster disks.
91 150e978f Iustin Pop

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

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

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

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

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