opcodes.py 7.7 KB
Newer Older
Iustin Pop's avatar
Iustin Pop committed
1
#
Iustin Pop's avatar
Iustin Pop committed
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#

# Copyright (C) 2006, 2007 Google Inc.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
# 02110-1301, USA.


"""OpCodes module

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


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

"""

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

class OpCode(object):
  """Abstract OpCode"""
  OP_ID = "OP_ABSTRACT"
  __slots__ = []

  def __init__(self, **kwargs):
    for key in kwargs:
      if key not in self.__slots__:
47
48
        raise TypeError("OpCode %s doesn't support the parameter '%s'" %
                        (self.__class__.__name__, key))
Iustin Pop's avatar
Iustin Pop committed
49
50
51
52
53
54
55
      setattr(self, key, kwargs[key])


class OpInitCluster(OpCode):
  """Initialise the cluster."""
  OP_ID = "OP_CLUSTER_INIT"
  __slots__ = ["cluster_name", "secondary_ip", "hypervisor_type",
56
               "vg_name", "mac_prefix", "def_bridge", "master_netdev"]
Iustin Pop's avatar
Iustin Pop committed
57
58
59
60
61
62
63
64
65


class OpDestroyCluster(OpCode):
  """Destroy the cluster."""
  OP_ID = "OP_CLUSTER_DESTROY"
  __slots__ = []


class OpQueryClusterInfo(OpCode):
Iustin Pop's avatar
Iustin Pop committed
66
  """Query cluster information."""
Iustin Pop's avatar
Iustin Pop committed
67
68
69
70
71
  OP_ID = "OP_CLUSTER_QUERY"
  __slots__ = []


class OpClusterCopyFile(OpCode):
Iustin Pop's avatar
Iustin Pop committed
72
  """Copy a file to multiple nodes."""
Iustin Pop's avatar
Iustin Pop committed
73
74
75
76
77
  OP_ID = "OP_CLUSTER_COPYFILE"
  __slots__ = ["nodes", "filename"]


class OpRunClusterCommand(OpCode):
Iustin Pop's avatar
Iustin Pop committed
78
  """Run a command on multiple nodes."""
Iustin Pop's avatar
Iustin Pop committed
79
80
81
82
83
  OP_ID = "OP_CLUSTER_RUNCOMMAND"
  __slots__ = ["nodes", "command"]


class OpVerifyCluster(OpCode):
Iustin Pop's avatar
Iustin Pop committed
84
  """Verify the cluster state."""
Iustin Pop's avatar
Iustin Pop committed
85
86
87
88
  OP_ID = "OP_CLUSTER_VERIFY"
  __slots__ = []


Iustin Pop's avatar
Iustin Pop committed
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
class OpVerifyDisks(OpCode):
  """Verify the cluster disks.

  Parameters: none

  Result: two lists:
    - list of node names with bad data returned (unreachable, etc.)
    - list of instances with degraded disks (that should be activated)

  In normal operation, both lists should be empty. A non-empty
  instance list is still ok (errors were fixed) but non-empty node
  list means some node is down, and probably there are unfixable drbd
  errors.

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

  """
  OP_ID = "OP_CLUSTER_VERIFY_DISKS"
  __slots__ = []


Iustin Pop's avatar
Iustin Pop committed
111
class OpMasterFailover(OpCode):
Iustin Pop's avatar
Iustin Pop committed
112
  """Do a master failover."""
Iustin Pop's avatar
Iustin Pop committed
113
114
115
116
117
  OP_ID = "OP_CLUSTER_MASTERFAILOVER"
  __slots__ = []


class OpDumpClusterConfig(OpCode):
Iustin Pop's avatar
Iustin Pop committed
118
  """Dump the cluster configuration."""
Iustin Pop's avatar
Iustin Pop committed
119
120
121
122
  OP_ID = "OP_CLUSTER_DUMPCONFIG"
  __slots__ = []


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


# node opcodes

Iustin Pop's avatar
Iustin Pop committed
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
class OpRemoveNode(OpCode):
  """Remove a node."""
  OP_ID = "OP_NODE_REMOVE"
  __slots__ = ["node_name"]


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


class OpQueryNodes(OpCode):
  """Compute the list of nodes."""
  OP_ID = "OP_NODE_QUERY"
146
  __slots__ = ["output_fields", "names"]
Iustin Pop's avatar
Iustin Pop committed
147
148


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


Iustin Pop's avatar
Iustin Pop committed
155
156
157
# instance opcodes

class OpCreateInstance(OpCode):
Iustin Pop's avatar
Iustin Pop committed
158
  """Create an instance."""
Iustin Pop's avatar
Iustin Pop committed
159
160
161
162
  OP_ID = "OP_INSTANCE_CREATE"
  __slots__ = ["instance_name", "mem_size", "disk_size", "os_type", "pnode",
               "disk_template", "snode", "swap_size", "mode",
               "vcpus", "ip", "bridge", "src_node", "src_path", "start",
163
               "wait_for_sync", "ip_check", "mac"]
Iustin Pop's avatar
Iustin Pop committed
164
165


166
class OpReinstallInstance(OpCode):
Iustin Pop's avatar
Iustin Pop committed
167
  """Reinstall an instance's OS."""
168
  OP_ID = "OP_INSTANCE_REINSTALL"
169
  __slots__ = ["instance_name", "os_type"]
170
171


Iustin Pop's avatar
Iustin Pop committed
172
173
174
class OpRemoveInstance(OpCode):
  """Remove an instance."""
  OP_ID = "OP_INSTANCE_REMOVE"
Iustin Pop's avatar
Iustin Pop committed
175
  __slots__ = ["instance_name", "ignore_failures"]
Iustin Pop's avatar
Iustin Pop committed
176
177


178
179
180
181
182
183
class OpRenameInstance(OpCode):
  """Rename an instance."""
  OP_ID = "OP_INSTANCE_RENAME"
  __slots__ = ["instance_name", "ignore_ip", "new_name"]


Iustin Pop's avatar
Iustin Pop committed
184
class OpStartupInstance(OpCode):
Iustin Pop's avatar
Iustin Pop committed
185
  """Startup an instance."""
Iustin Pop's avatar
Iustin Pop committed
186
187
188
189
190
  OP_ID = "OP_INSTANCE_STARTUP"
  __slots__ = ["instance_name", "force", "extra_args"]


class OpShutdownInstance(OpCode):
Iustin Pop's avatar
Iustin Pop committed
191
  """Shutdown an instance."""
Iustin Pop's avatar
Iustin Pop committed
192
193
194
195
  OP_ID = "OP_INSTANCE_SHUTDOWN"
  __slots__ = ["instance_name"]


196
197
198
199
200
201
202
class OpRebootInstance(OpCode):
  """Reboot an instance."""
  OP_ID = "OP_INSTANCE_STARTUP"
  __slots__ = ["instance_name", "reboot_type", "extra_args",
               "ignore_secondaries" ]


Iustin Pop's avatar
Iustin Pop committed
203
204
205
206
207
208
209
210
211
212
213
214
215
class OpAddMDDRBDComponent(OpCode):
  """Add a MD-DRBD component."""
  OP_ID = "OP_INSTANCE_ADD_MDDRBD"
  __slots__ = ["instance_name", "remote_node", "disk_name"]


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


class OpReplaceDisks(OpCode):
Iustin Pop's avatar
Iustin Pop committed
216
  """Replace the disks of an instance."""
Iustin Pop's avatar
Iustin Pop committed
217
  OP_ID = "OP_INSTANCE_REPLACE_DISKS"
218
  __slots__ = ["instance_name", "remote_node", "mode", "disks"]
Iustin Pop's avatar
Iustin Pop committed
219
220
221
222
223
224
225
226
227


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


class OpConnectConsole(OpCode):
Iustin Pop's avatar
Iustin Pop committed
228
  """Connect to an instance's console."""
Iustin Pop's avatar
Iustin Pop committed
229
230
231
232
233
  OP_ID = "OP_INSTANCE_CONSOLE"
  __slots__ = ["instance_name"]


class OpActivateInstanceDisks(OpCode):
Iustin Pop's avatar
Iustin Pop committed
234
  """Activate an instance's disks."""
Iustin Pop's avatar
Iustin Pop committed
235
236
237
238
239
  OP_ID = "OP_INSTANCE_ACTIVATE_DISKS"
  __slots__ = ["instance_name"]


class OpDeactivateInstanceDisks(OpCode):
Iustin Pop's avatar
Iustin Pop committed
240
  """Deactivate an instance's disks."""
Iustin Pop's avatar
Iustin Pop committed
241
242
243
244
245
246
247
  OP_ID = "OP_INSTANCE_DEACTIVATE_DISKS"
  __slots__ = ["instance_name"]


class OpQueryInstances(OpCode):
  """Compute the list of instances."""
  OP_ID = "OP_INSTANCE_QUERY"
248
  __slots__ = ["output_fields", "names"]
Iustin Pop's avatar
Iustin Pop committed
249
250
251
252
253
254
255
256
257
258
259


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


class OpSetInstanceParms(OpCode):
  """Change the parameters of an instance."""
  OP_ID = "OP_INSTANCE_SET_PARMS"
260
  __slots__ = ["instance_name", "mem", "vcpus", "ip", "bridge", "mac"]
Iustin Pop's avatar
Iustin Pop committed
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278


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

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

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


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


Iustin Pop's avatar
Iustin Pop committed
288
289
290
291
292
293
class OpSearchTags(OpCode):
  """Searches the tags in the cluster for a given pattern."""
  OP_ID = "OP_TAGS_SEARCH"
  __slots__ = ["pattern"]


294
295
class OpAddTags(OpCode):
  """Add a list of tags on a given object."""
296
  OP_ID = "OP_TAGS_SET"
297
  __slots__ = ["kind", "name", "tags"]
298
299


300
301
class OpDelTags(OpCode):
  """Remove a list of tags from a given object."""
302
  OP_ID = "OP_TAGS_DEL"
303
  __slots__ = ["kind", "name", "tags"]