Statistics
| Branch: | Tag: | Revision:

root / lib / opcodes.py @ eeb3a5f9

History | View | Annotate | Download (8.8 kB)

1
#
2
#
3

    
4
# Copyright (C) 2006, 2007 Google Inc.
5
#
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.
10
#
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.
15
#
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
19
# 02110-1301, USA.
20

    
21

    
22
"""OpCodes module
23

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

27

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
32

33
"""
34

    
35
# this are practically structures, so disable the message about too
36
# few public methods:
37
# pylint: disable-msg=R0903
38

    
39
class OpCode(object):
40
  """Abstract OpCode"""
41
  OP_ID = "OP_ABSTRACT"
42
  __slots__ = []
43

    
44
  def __init__(self, **kwargs):
45
    for key in 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])
50

    
51

    
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"]
57

    
58

    
59
class OpDestroyCluster(OpCode):
60
  """Destroy the cluster."""
61
  OP_ID = "OP_CLUSTER_DESTROY"
62
  __slots__ = []
63

    
64

    
65
class OpQueryClusterInfo(OpCode):
66
  """Query cluster information."""
67
  OP_ID = "OP_CLUSTER_QUERY"
68
  __slots__ = []
69

    
70

    
71
class OpClusterCopyFile(OpCode):
72
  """Copy a file to multiple nodes."""
73
  OP_ID = "OP_CLUSTER_COPYFILE"
74
  __slots__ = ["nodes", "filename"]
75

    
76

    
77
class OpRunClusterCommand(OpCode):
78
  """Run a command on multiple nodes."""
79
  OP_ID = "OP_CLUSTER_RUNCOMMAND"
80
  __slots__ = ["nodes", "command"]
81

    
82

    
83
class OpVerifyCluster(OpCode):
84
  """Verify the cluster state."""
85
  OP_ID = "OP_CLUSTER_VERIFY"
86
  __slots__ = []
87

    
88

    
89
class OpVerifyDisks(OpCode):
90
  """Verify the cluster disks.
91

92
  Parameters: none
93

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

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

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

109
  """
110
  OP_ID = "OP_CLUSTER_VERIFY_DISKS"
111
  __slots__ = []
112

    
113

    
114
class OpMasterFailover(OpCode):
115
  """Do a master failover."""
116
  OP_ID = "OP_CLUSTER_MASTERFAILOVER"
117
  __slots__ = []
118

    
119

    
120
class OpDumpClusterConfig(OpCode):
121
  """Dump the cluster configuration."""
122
  OP_ID = "OP_CLUSTER_DUMPCONFIG"
123
  __slots__ = []
124

    
125

    
126
class OpRenameCluster(OpCode):
127
  """Rename the cluster."""
128
  OP_ID = "OP_CLUSTER_RENAME"
129
  __slots__ = ["name"]
130

    
131

    
132
# node opcodes
133

    
134
class OpRemoveNode(OpCode):
135
  """Remove a node."""
136
  OP_ID = "OP_NODE_REMOVE"
137
  __slots__ = ["node_name"]
138

    
139

    
140
class OpAddNode(OpCode):
141
  """Add a node."""
142
  OP_ID = "OP_NODE_ADD"
143
  __slots__ = ["node_name", "primary_ip", "secondary_ip"]
144

    
145

    
146
class OpQueryNodes(OpCode):
147
  """Compute the list of nodes."""
148
  OP_ID = "OP_NODE_QUERY"
149
  __slots__ = ["output_fields", "names"]
150

    
151

    
152
class OpQueryNodeVolumes(OpCode):
153
  """Get list of volumes on node."""
154
  OP_ID = "OP_NODE_QUERYVOLS"
155
  __slots__ = ["nodes", "output_fields"]
156

    
157

    
158
# instance opcodes
159

    
160
class OpCreateInstance(OpCode):
161
  """Create an instance."""
162
  OP_ID = "OP_INSTANCE_CREATE"
163
  __slots__ = [
164
    "instance_name", "mem_size", "disk_size", "os_type", "pnode",
165
    "disk_template", "snode", "swap_size", "mode",
166
    "vcpus", "ip", "bridge", "src_node", "src_path", "start",
167
    "wait_for_sync", "ip_check", "mac",
168
    "kernel_path", "initrd_path", "hvm_boot_order",
169
    ]
170

    
171

    
172
class OpReinstallInstance(OpCode):
173
  """Reinstall an instance's OS."""
174
  OP_ID = "OP_INSTANCE_REINSTALL"
175
  __slots__ = ["instance_name", "os_type"]
176

    
177

    
178
class OpRemoveInstance(OpCode):
179
  """Remove an instance."""
180
  OP_ID = "OP_INSTANCE_REMOVE"
181
  __slots__ = ["instance_name", "ignore_failures"]
182

    
183

    
184
class OpRenameInstance(OpCode):
185
  """Rename an instance."""
186
  OP_ID = "OP_INSTANCE_RENAME"
187
  __slots__ = ["instance_name", "ignore_ip", "new_name"]
188

    
189

    
190
class OpStartupInstance(OpCode):
191
  """Startup an instance."""
192
  OP_ID = "OP_INSTANCE_STARTUP"
193
  __slots__ = ["instance_name", "force", "extra_args"]
194

    
195

    
196
class OpShutdownInstance(OpCode):
197
  """Shutdown an instance."""
198
  OP_ID = "OP_INSTANCE_SHUTDOWN"
199
  __slots__ = ["instance_name"]
200

    
201

    
202
class OpRebootInstance(OpCode):
203
  """Reboot an instance."""
204
  OP_ID = "OP_INSTANCE_REBOOT"
205
  __slots__ = ["instance_name", "reboot_type", "extra_args",
206
               "ignore_secondaries" ]
207

    
208

    
209
class OpAddMDDRBDComponent(OpCode):
210
  """Add a MD-DRBD component."""
211
  OP_ID = "OP_INSTANCE_ADD_MDDRBD"
212
  __slots__ = ["instance_name", "remote_node", "disk_name"]
213

    
214

    
215
class OpRemoveMDDRBDComponent(OpCode):
216
  """Remove a MD-DRBD component."""
217
  OP_ID = "OP_INSTANCE_REMOVE_MDDRBD"
218
  __slots__ = ["instance_name", "disk_name", "disk_id"]
219

    
220

    
221
class OpReplaceDisks(OpCode):
222
  """Replace the disks of an instance."""
223
  OP_ID = "OP_INSTANCE_REPLACE_DISKS"
224
  __slots__ = ["instance_name", "remote_node", "mode", "disks"]
225

    
226

    
227
class OpFailoverInstance(OpCode):
228
  """Failover an instance."""
229
  OP_ID = "OP_INSTANCE_FAILOVER"
230
  __slots__ = ["instance_name", "ignore_consistency"]
231

    
232

    
233
class OpConnectConsole(OpCode):
234
  """Connect to an instance's console."""
235
  OP_ID = "OP_INSTANCE_CONSOLE"
236
  __slots__ = ["instance_name"]
237

    
238

    
239
class OpActivateInstanceDisks(OpCode):
240
  """Activate an instance's disks."""
241
  OP_ID = "OP_INSTANCE_ACTIVATE_DISKS"
242
  __slots__ = ["instance_name"]
243

    
244

    
245
class OpDeactivateInstanceDisks(OpCode):
246
  """Deactivate an instance's disks."""
247
  OP_ID = "OP_INSTANCE_DEACTIVATE_DISKS"
248
  __slots__ = ["instance_name"]
249

    
250

    
251
class OpQueryInstances(OpCode):
252
  """Compute the list of instances."""
253
  OP_ID = "OP_INSTANCE_QUERY"
254
  __slots__ = ["output_fields", "names"]
255

    
256

    
257
class OpQueryInstanceData(OpCode):
258
  """Compute the run-time status of instances."""
259
  OP_ID = "OP_INSTANCE_QUERY_DATA"
260
  __slots__ = ["instances"]
261

    
262

    
263
class OpSetInstanceParms(OpCode):
264
  """Change the parameters of an instance."""
265
  OP_ID = "OP_INSTANCE_SET_PARMS"
266
  __slots__ = [
267
    "instance_name", "mem", "vcpus", "ip", "bridge", "mac",
268
    "kernel_path", "initrd_path", "hvm_boot_order",
269
    ]
270

    
271

    
272
# OS opcodes
273
class OpDiagnoseOS(OpCode):
274
  """Compute the list of guest operating systems."""
275
  OP_ID = "OP_OS_DIAGNOSE"
276
  __slots__ = []
277

    
278
# Exports opcodes
279
class OpQueryExports(OpCode):
280
  """Compute the list of exported images."""
281
  OP_ID = "OP_BACKUP_QUERY"
282
  __slots__ = ["nodes"]
283

    
284
class OpExportInstance(OpCode):
285
  """Export an instance."""
286
  OP_ID = "OP_BACKUP_EXPORT"
287
  __slots__ = ["instance_name", "target_node", "shutdown"]
288

    
289

    
290
# Tags opcodes
291
class OpGetTags(OpCode):
292
  """Returns the tags of the given object."""
293
  OP_ID = "OP_TAGS_GET"
294
  __slots__ = ["kind", "name"]
295

    
296

    
297
class OpSearchTags(OpCode):
298
  """Searches the tags in the cluster for a given pattern."""
299
  OP_ID = "OP_TAGS_SEARCH"
300
  __slots__ = ["pattern"]
301

    
302

    
303
class OpAddTags(OpCode):
304
  """Add a list of tags on a given object."""
305
  OP_ID = "OP_TAGS_SET"
306
  __slots__ = ["kind", "name", "tags"]
307

    
308

    
309
class OpDelTags(OpCode):
310
  """Remove a list of tags from a given object."""
311
  OP_ID = "OP_TAGS_DEL"
312
  __slots__ = ["kind", "name", "tags"]
313

    
314

    
315
# Test opcodes
316
class OpTestDelay(OpCode):
317
  """Sleeps for a configured amount of time.
318

319
  This is used just for debugging and testing.
320

321
  Parameters:
322
    - duration: the time to sleep
323
    - on_master: if true, sleep on the master
324
    - on_nodes: list of nodes in which to sleep
325

326
  If the on_master parameter is true, it will execute a sleep on the
327
  master (before any node sleep).
328

329
  If the on_nodes list is not empty, it will sleep on those nodes
330
  (after the sleep on the master, if that is enabled).
331

332
  As an additional feature, the case of duration < 0 will be reported
333
  as an execution error, so this opcode can be used as a failure
334
  generator. The case of duration == 0 will not be treated specially.
335

336
  """
337
  OP_ID = "OP_TEST_DELAY"
338
  __slots__ = ["duration", "on_master", "on_nodes"]