Statistics
| Branch: | Tag: | Revision:

root / lib / opcodes.py @ 1fe93c75

History | View | Annotate | Download (17.4 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 0e46916d Iustin Pop
Every operation which modifies the cluster state is expressed via
28 0e46916d Iustin Pop
opcodes.
29 a8083063 Iustin Pop

30 a8083063 Iustin Pop
"""
31 a8083063 Iustin Pop
32 a8083063 Iustin Pop
# this are practically structures, so disable the message about too
33 a8083063 Iustin Pop
# few public methods:
34 a8083063 Iustin Pop
# pylint: disable-msg=R0903
35 a8083063 Iustin Pop
36 df458e0b Iustin Pop
37 0e46916d Iustin Pop
class BaseOpCode(object):
38 df458e0b Iustin Pop
  """A simple serializable object.
39 df458e0b Iustin Pop

40 0e46916d Iustin Pop
  This object serves as a parent class for OpCode without any custom
41 0e46916d Iustin Pop
  field handling.
42 0e46916d Iustin Pop

43 df458e0b Iustin Pop
  """
44 a8083063 Iustin Pop
  __slots__ = []
45 a8083063 Iustin Pop
46 a8083063 Iustin Pop
  def __init__(self, **kwargs):
47 a7399f66 Iustin Pop
    """Constructor for BaseOpCode.
48 a7399f66 Iustin Pop

49 a7399f66 Iustin Pop
    The constructor takes only keyword arguments and will set
50 a7399f66 Iustin Pop
    attributes on this object based on the passed arguments. As such,
51 a7399f66 Iustin Pop
    it means that you should not pass arguments which are not in the
52 a7399f66 Iustin Pop
    __slots__ attribute for this class.
53 a7399f66 Iustin Pop

54 a7399f66 Iustin Pop
    """
55 a8083063 Iustin Pop
    for key in kwargs:
56 a8083063 Iustin Pop
      if key not in self.__slots__:
57 df458e0b Iustin Pop
        raise TypeError("Object %s doesn't support the parameter '%s'" %
58 3ecf6786 Iustin Pop
                        (self.__class__.__name__, key))
59 a8083063 Iustin Pop
      setattr(self, key, kwargs[key])
60 a8083063 Iustin Pop
61 df458e0b Iustin Pop
  def __getstate__(self):
62 a7399f66 Iustin Pop
    """Generic serializer.
63 a7399f66 Iustin Pop

64 a7399f66 Iustin Pop
    This method just returns the contents of the instance as a
65 a7399f66 Iustin Pop
    dictionary.
66 a7399f66 Iustin Pop

67 a7399f66 Iustin Pop
    @rtype:  C{dict}
68 a7399f66 Iustin Pop
    @return: the instance attributes and their values
69 a7399f66 Iustin Pop

70 a7399f66 Iustin Pop
    """
71 df458e0b Iustin Pop
    state = {}
72 df458e0b Iustin Pop
    for name in self.__slots__:
73 df458e0b Iustin Pop
      if hasattr(self, name):
74 df458e0b Iustin Pop
        state[name] = getattr(self, name)
75 df458e0b Iustin Pop
    return state
76 df458e0b Iustin Pop
77 df458e0b Iustin Pop
  def __setstate__(self, state):
78 a7399f66 Iustin Pop
    """Generic unserializer.
79 a7399f66 Iustin Pop

80 a7399f66 Iustin Pop
    This method just restores from the serialized state the attributes
81 a7399f66 Iustin Pop
    of the current instance.
82 a7399f66 Iustin Pop

83 a7399f66 Iustin Pop
    @param state: the serialized opcode data
84 a7399f66 Iustin Pop
    @type state:  C{dict}
85 a7399f66 Iustin Pop

86 a7399f66 Iustin Pop
    """
87 df458e0b Iustin Pop
    if not isinstance(state, dict):
88 df458e0b Iustin Pop
      raise ValueError("Invalid data to __setstate__: expected dict, got %s" %
89 df458e0b Iustin Pop
                       type(state))
90 df458e0b Iustin Pop
91 df458e0b Iustin Pop
    for name in self.__slots__:
92 df458e0b Iustin Pop
      if name not in state:
93 df458e0b Iustin Pop
        delattr(self, name)
94 df458e0b Iustin Pop
95 df458e0b Iustin Pop
    for name in state:
96 df458e0b Iustin Pop
      setattr(self, name, state[name])
97 df458e0b Iustin Pop
98 df458e0b Iustin Pop
99 0e46916d Iustin Pop
class OpCode(BaseOpCode):
100 a7399f66 Iustin Pop
  """Abstract OpCode.
101 a7399f66 Iustin Pop

102 a7399f66 Iustin Pop
  This is the root of the actual OpCode hierarchy. All clases derived
103 a7399f66 Iustin Pop
  from this class should override OP_ID.
104 a7399f66 Iustin Pop

105 a7399f66 Iustin Pop
  @cvar OP_ID: The ID of this opcode. This should be unique amongst all
106 20777413 Iustin Pop
               children of this class.
107 20777413 Iustin Pop
  @ivar dry_run: Whether the LU should be run in dry-run mode, i.e. just
108 20777413 Iustin Pop
                 the check steps
109 a7399f66 Iustin Pop

110 a7399f66 Iustin Pop
  """
111 df458e0b Iustin Pop
  OP_ID = "OP_ABSTRACT"
112 20777413 Iustin Pop
  __slots__ = BaseOpCode.__slots__ + ["dry_run"]
113 df458e0b Iustin Pop
114 df458e0b Iustin Pop
  def __getstate__(self):
115 df458e0b Iustin Pop
    """Specialized getstate for opcodes.
116 df458e0b Iustin Pop

117 a7399f66 Iustin Pop
    This method adds to the state dictionary the OP_ID of the class,
118 a7399f66 Iustin Pop
    so that on unload we can identify the correct class for
119 a7399f66 Iustin Pop
    instantiating the opcode.
120 a7399f66 Iustin Pop

121 a7399f66 Iustin Pop
    @rtype:   C{dict}
122 a7399f66 Iustin Pop
    @return:  the state as a dictionary
123 a7399f66 Iustin Pop

124 df458e0b Iustin Pop
    """
125 0e46916d Iustin Pop
    data = BaseOpCode.__getstate__(self)
126 df458e0b Iustin Pop
    data["OP_ID"] = self.OP_ID
127 df458e0b Iustin Pop
    return data
128 df458e0b Iustin Pop
129 df458e0b Iustin Pop
  @classmethod
130 00abdc96 Iustin Pop
  def LoadOpCode(cls, data):
131 df458e0b Iustin Pop
    """Generic load opcode method.
132 df458e0b Iustin Pop

133 a7399f66 Iustin Pop
    The method identifies the correct opcode class from the dict-form
134 a7399f66 Iustin Pop
    by looking for a OP_ID key, if this is not found, or its value is
135 a7399f66 Iustin Pop
    not available in this module as a child of this class, we fail.
136 a7399f66 Iustin Pop

137 a7399f66 Iustin Pop
    @type data:  C{dict}
138 a7399f66 Iustin Pop
    @param data: the serialized opcode
139 a7399f66 Iustin Pop

140 df458e0b Iustin Pop
    """
141 df458e0b Iustin Pop
    if not isinstance(data, dict):
142 df458e0b Iustin Pop
      raise ValueError("Invalid data to LoadOpCode (%s)" % type(data))
143 df458e0b Iustin Pop
    if "OP_ID" not in data:
144 df458e0b Iustin Pop
      raise ValueError("Invalid data to LoadOpcode, missing OP_ID")
145 df458e0b Iustin Pop
    op_id = data["OP_ID"]
146 df458e0b Iustin Pop
    op_class = None
147 363acb1e Iustin Pop
    if op_id in OP_MAPPING:
148 363acb1e Iustin Pop
      op_class = OP_MAPPING[op_id]
149 363acb1e Iustin Pop
    else:
150 df458e0b Iustin Pop
      raise ValueError("Invalid data to LoadOpCode: OP_ID %s unsupported" %
151 df458e0b Iustin Pop
                       op_id)
152 df458e0b Iustin Pop
    op = op_class()
153 df458e0b Iustin Pop
    new_data = data.copy()
154 df458e0b Iustin Pop
    del new_data["OP_ID"]
155 df458e0b Iustin Pop
    op.__setstate__(new_data)
156 df458e0b Iustin Pop
    return op
157 df458e0b Iustin Pop
158 60dd1473 Iustin Pop
  def Summary(self):
159 60dd1473 Iustin Pop
    """Generates a summary description of this opcode.
160 60dd1473 Iustin Pop

161 60dd1473 Iustin Pop
    """
162 60dd1473 Iustin Pop
    # all OP_ID start with OP_, we remove that
163 60dd1473 Iustin Pop
    txt = self.OP_ID[3:]
164 60dd1473 Iustin Pop
    field_name = getattr(self, "OP_DSC_FIELD", None)
165 60dd1473 Iustin Pop
    if field_name:
166 60dd1473 Iustin Pop
      field_value = getattr(self, field_name, None)
167 60dd1473 Iustin Pop
      txt = "%s(%s)" % (txt, field_value)
168 60dd1473 Iustin Pop
    return txt
169 60dd1473 Iustin Pop
170 a8083063 Iustin Pop
171 afee0879 Iustin Pop
# cluster opcodes
172 afee0879 Iustin Pop
173 a8083063 Iustin Pop
class OpDestroyCluster(OpCode):
174 a7399f66 Iustin Pop
  """Destroy the cluster.
175 a7399f66 Iustin Pop

176 a7399f66 Iustin Pop
  This opcode has no other parameters. All the state is irreversibly
177 a7399f66 Iustin Pop
  lost after the execution of this opcode.
178 a7399f66 Iustin Pop

179 a7399f66 Iustin Pop
  """
180 a8083063 Iustin Pop
  OP_ID = "OP_CLUSTER_DESTROY"
181 4f05fd3b Iustin Pop
  __slots__ = OpCode.__slots__ + []
182 a8083063 Iustin Pop
183 a8083063 Iustin Pop
184 a8083063 Iustin Pop
class OpQueryClusterInfo(OpCode):
185 fdc267f4 Iustin Pop
  """Query cluster information."""
186 a8083063 Iustin Pop
  OP_ID = "OP_CLUSTER_QUERY"
187 4f05fd3b Iustin Pop
  __slots__ = OpCode.__slots__ + []
188 a8083063 Iustin Pop
189 a8083063 Iustin Pop
190 a8083063 Iustin Pop
class OpVerifyCluster(OpCode):
191 a7399f66 Iustin Pop
  """Verify the cluster state.
192 a7399f66 Iustin Pop

193 a7399f66 Iustin Pop
  @type skip_checks: C{list}
194 a7399f66 Iustin Pop
  @ivar skip_checks: steps to be skipped from the verify process; this
195 a7399f66 Iustin Pop
                     needs to be a subset of
196 a7399f66 Iustin Pop
                     L{constants.VERIFY_OPTIONAL_CHECKS}; currently
197 a7399f66 Iustin Pop
                     only L{constants.VERIFY_NPLUSONE_MEM} can be passed
198 a7399f66 Iustin Pop

199 a7399f66 Iustin Pop
  """
200 a8083063 Iustin Pop
  OP_ID = "OP_CLUSTER_VERIFY"
201 4f05fd3b Iustin Pop
  __slots__ = OpCode.__slots__ + ["skip_checks"]
202 a8083063 Iustin Pop
203 a8083063 Iustin Pop
204 150e978f Iustin Pop
class OpVerifyDisks(OpCode):
205 150e978f Iustin Pop
  """Verify the cluster disks.
206 150e978f Iustin Pop

207 150e978f Iustin Pop
  Parameters: none
208 150e978f Iustin Pop

209 5188ab37 Iustin Pop
  Result: a tuple of four elements:
210 150e978f Iustin Pop
    - list of node names with bad data returned (unreachable, etc.)
211 a7399f66 Iustin Pop
    - dict of node names with broken volume groups (values: error msg)
212 150e978f Iustin Pop
    - list of instances with degraded disks (that should be activated)
213 b63ed789 Iustin Pop
    - dict of instances with missing logical volumes (values: (node, vol)
214 b63ed789 Iustin Pop
      pairs with details about the missing volumes)
215 150e978f Iustin Pop

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

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

224 150e978f Iustin Pop
  """
225 150e978f Iustin Pop
  OP_ID = "OP_CLUSTER_VERIFY_DISKS"
226 4f05fd3b Iustin Pop
  __slots__ = OpCode.__slots__ + []
227 150e978f Iustin Pop
228 150e978f Iustin Pop
229 ae5849b5 Michael Hanselmann
class OpQueryConfigValues(OpCode):
230 ae5849b5 Michael Hanselmann
  """Query cluster configuration values."""
231 ae5849b5 Michael Hanselmann
  OP_ID = "OP_CLUSTER_CONFIG_QUERY"
232 4f05fd3b Iustin Pop
  __slots__ = OpCode.__slots__ + ["output_fields"]
233 a8083063 Iustin Pop
234 a8083063 Iustin Pop
235 07bd8a51 Iustin Pop
class OpRenameCluster(OpCode):
236 a7399f66 Iustin Pop
  """Rename the cluster.
237 a7399f66 Iustin Pop

238 a7399f66 Iustin Pop
  @type name: C{str}
239 a7399f66 Iustin Pop
  @ivar name: The new name of the cluster. The name and/or the master IP
240 a7399f66 Iustin Pop
              address will be changed to match the new name and its IP
241 a7399f66 Iustin Pop
              address.
242 a7399f66 Iustin Pop

243 a7399f66 Iustin Pop
  """
244 07bd8a51 Iustin Pop
  OP_ID = "OP_CLUSTER_RENAME"
245 60dd1473 Iustin Pop
  OP_DSC_FIELD = "name"
246 4f05fd3b Iustin Pop
  __slots__ = OpCode.__slots__ + ["name"]
247 07bd8a51 Iustin Pop
248 07bd8a51 Iustin Pop
249 12515db7 Manuel Franceschini
class OpSetClusterParams(OpCode):
250 a7399f66 Iustin Pop
  """Change the parameters of the cluster.
251 a7399f66 Iustin Pop

252 a7399f66 Iustin Pop
  @type vg_name: C{str} or C{None}
253 a7399f66 Iustin Pop
  @ivar vg_name: The new volume group name or None to disable LVM usage.
254 a7399f66 Iustin Pop

255 a7399f66 Iustin Pop
  """
256 12515db7 Manuel Franceschini
  OP_ID = "OP_CLUSTER_SET_PARAMS"
257 4f05fd3b Iustin Pop
  __slots__ = OpCode.__slots__ + [
258 4b7735f9 Iustin Pop
    "vg_name",
259 4b7735f9 Iustin Pop
    "enabled_hypervisors",
260 4b7735f9 Iustin Pop
    "hvparams",
261 4b7735f9 Iustin Pop
    "beparams",
262 5af3da74 Guido Trotter
    "nicparams",
263 4b7735f9 Iustin Pop
    "candidate_pool_size",
264 4b7735f9 Iustin Pop
    ]
265 12515db7 Manuel Franceschini
266 12515db7 Manuel Franceschini
267 afee0879 Iustin Pop
class OpRedistributeConfig(OpCode):
268 afee0879 Iustin Pop
  """Force a full push of the cluster configuration.
269 afee0879 Iustin Pop

270 afee0879 Iustin Pop
  """
271 afee0879 Iustin Pop
  OP_ID = "OP_CLUSTER_REDIST_CONF"
272 4f05fd3b Iustin Pop
  __slots__ = OpCode.__slots__ + [
273 afee0879 Iustin Pop
    ]
274 afee0879 Iustin Pop
275 07bd8a51 Iustin Pop
# node opcodes
276 07bd8a51 Iustin Pop
277 a8083063 Iustin Pop
class OpRemoveNode(OpCode):
278 a7399f66 Iustin Pop
  """Remove a node.
279 a7399f66 Iustin Pop

280 a7399f66 Iustin Pop
  @type node_name: C{str}
281 a7399f66 Iustin Pop
  @ivar node_name: The name of the node to remove. If the node still has
282 a7399f66 Iustin Pop
                   instances on it, the operation will fail.
283 a7399f66 Iustin Pop

284 a7399f66 Iustin Pop
  """
285 a8083063 Iustin Pop
  OP_ID = "OP_NODE_REMOVE"
286 60dd1473 Iustin Pop
  OP_DSC_FIELD = "node_name"
287 4f05fd3b Iustin Pop
  __slots__ = OpCode.__slots__ + ["node_name"]
288 a8083063 Iustin Pop
289 a8083063 Iustin Pop
290 a8083063 Iustin Pop
class OpAddNode(OpCode):
291 a7399f66 Iustin Pop
  """Add a node to the cluster.
292 a7399f66 Iustin Pop

293 a7399f66 Iustin Pop
  @type node_name: C{str}
294 a7399f66 Iustin Pop
  @ivar node_name: The name of the node to add. This can be a short name,
295 a7399f66 Iustin Pop
                   but it will be expanded to the FQDN.
296 a7399f66 Iustin Pop
  @type primary_ip: IP address
297 a7399f66 Iustin Pop
  @ivar primary_ip: The primary IP of the node. This will be ignored when the
298 a7399f66 Iustin Pop
                    opcode is submitted, but will be filled during the node
299 a7399f66 Iustin Pop
                    add (so it will be visible in the job query).
300 a7399f66 Iustin Pop
  @type secondary_ip: IP address
301 a7399f66 Iustin Pop
  @ivar secondary_ip: The secondary IP of the node. This needs to be passed
302 a7399f66 Iustin Pop
                      if the cluster has been initialized in 'dual-network'
303 a7399f66 Iustin Pop
                      mode, otherwise it must not be given.
304 a7399f66 Iustin Pop
  @type readd: C{bool}
305 a7399f66 Iustin Pop
  @ivar readd: Whether to re-add an existing node to the cluster. If
306 a7399f66 Iustin Pop
               this is not passed, then the operation will abort if the node
307 a7399f66 Iustin Pop
               name is already in the cluster; use this parameter to 'repair'
308 a7399f66 Iustin Pop
               a node that had its configuration broken, or was reinstalled
309 a7399f66 Iustin Pop
               without removal from the cluster.
310 a7399f66 Iustin Pop

311 a7399f66 Iustin Pop
  """
312 a8083063 Iustin Pop
  OP_ID = "OP_NODE_ADD"
313 60dd1473 Iustin Pop
  OP_DSC_FIELD = "node_name"
314 4f05fd3b Iustin Pop
  __slots__ = OpCode.__slots__ + [
315 4f05fd3b Iustin Pop
    "node_name", "primary_ip", "secondary_ip", "readd",
316 4f05fd3b Iustin Pop
    ]
317 a8083063 Iustin Pop
318 a8083063 Iustin Pop
319 a8083063 Iustin Pop
class OpQueryNodes(OpCode):
320 a8083063 Iustin Pop
  """Compute the list of nodes."""
321 a8083063 Iustin Pop
  OP_ID = "OP_NODE_QUERY"
322 4f05fd3b Iustin Pop
  __slots__ = OpCode.__slots__ + ["output_fields", "names", "use_locking"]
323 a8083063 Iustin Pop
324 a8083063 Iustin Pop
325 dcb93971 Michael Hanselmann
class OpQueryNodeVolumes(OpCode):
326 dcb93971 Michael Hanselmann
  """Get list of volumes on node."""
327 dcb93971 Michael Hanselmann
  OP_ID = "OP_NODE_QUERYVOLS"
328 4f05fd3b Iustin Pop
  __slots__ = OpCode.__slots__ + ["nodes", "output_fields"]
329 dcb93971 Michael Hanselmann
330 dcb93971 Michael Hanselmann
331 9e5442ce Michael Hanselmann
class OpQueryNodeStorage(OpCode):
332 9e5442ce Michael Hanselmann
  """Get information on storage for node(s)."""
333 9e5442ce Michael Hanselmann
  OP_ID = "OP_NODE_QUERY_STORAGE"
334 9e5442ce Michael Hanselmann
  __slots__ = OpCode.__slots__ + [
335 9e5442ce Michael Hanselmann
    "nodes",
336 9e5442ce Michael Hanselmann
    "storage_type",
337 9e5442ce Michael Hanselmann
    "name",
338 9e5442ce Michael Hanselmann
    "output_fields",
339 9e5442ce Michael Hanselmann
    ]
340 9e5442ce Michael Hanselmann
341 9e5442ce Michael Hanselmann
342 efb8da02 Michael Hanselmann
class OpModifyNodeStorage(OpCode):
343 efb8da02 Michael Hanselmann
  """"""
344 efb8da02 Michael Hanselmann
  OP_ID = "OP_NODE_MODIFY_STORAGE"
345 efb8da02 Michael Hanselmann
  __slots__ = OpCode.__slots__ + [
346 efb8da02 Michael Hanselmann
    "node_name",
347 efb8da02 Michael Hanselmann
    "storage_type",
348 efb8da02 Michael Hanselmann
    "name",
349 efb8da02 Michael Hanselmann
    "changes",
350 efb8da02 Michael Hanselmann
    ]
351 efb8da02 Michael Hanselmann
352 efb8da02 Michael Hanselmann
353 b31c8676 Iustin Pop
class OpSetNodeParams(OpCode):
354 b31c8676 Iustin Pop
  """Change the parameters of a node."""
355 b31c8676 Iustin Pop
  OP_ID = "OP_NODE_SET_PARAMS"
356 b31c8676 Iustin Pop
  OP_DSC_FIELD = "node_name"
357 4f05fd3b Iustin Pop
  __slots__ = OpCode.__slots__ + [
358 b31c8676 Iustin Pop
    "node_name",
359 b31c8676 Iustin Pop
    "force",
360 b31c8676 Iustin Pop
    "master_candidate",
361 3a5ba66a Iustin Pop
    "offline",
362 c9d443ea Iustin Pop
    "drained",
363 b31c8676 Iustin Pop
    ]
364 b31c8676 Iustin Pop
365 f5118ade Iustin Pop
366 f5118ade Iustin Pop
class OpPowercycleNode(OpCode):
367 f5118ade Iustin Pop
  """Tries to powercycle a node."""
368 f5118ade Iustin Pop
  OP_ID = "OP_NODE_POWERCYCLE"
369 f5118ade Iustin Pop
  OP_DSC_FIELD = "node_name"
370 4f05fd3b Iustin Pop
  __slots__ = OpCode.__slots__ + [
371 f5118ade Iustin Pop
    "node_name",
372 f5118ade Iustin Pop
    "force",
373 f5118ade Iustin Pop
    ]
374 f5118ade Iustin Pop
375 7ffc5a86 Michael Hanselmann
376 7ffc5a86 Michael Hanselmann
class OpEvacuateNode(OpCode):
377 7ffc5a86 Michael Hanselmann
  """Relocate secondary instances from a node."""
378 7ffc5a86 Michael Hanselmann
  OP_ID = "OP_NODE_EVACUATE"
379 7ffc5a86 Michael Hanselmann
  OP_DSC_FIELD = "node_name"
380 7ffc5a86 Michael Hanselmann
  __slots__ = OpCode.__slots__ + [
381 7ffc5a86 Michael Hanselmann
    "node_name", "remote_node", "iallocator",
382 7ffc5a86 Michael Hanselmann
    ]
383 7ffc5a86 Michael Hanselmann
384 7ffc5a86 Michael Hanselmann
385 80cb875c Michael Hanselmann
class OpMigrateNode(OpCode):
386 80cb875c Michael Hanselmann
  """Migrate all instances from a node."""
387 80cb875c Michael Hanselmann
  OP_ID = "OP_NODE_MIGRATE"
388 80cb875c Michael Hanselmann
  OP_DSC_FIELD = "node_name"
389 80cb875c Michael Hanselmann
  __slots__ = OpCode.__slots__ + [
390 80cb875c Michael Hanselmann
    "node_name",
391 80cb875c Michael Hanselmann
    "live",
392 80cb875c Michael Hanselmann
    ]
393 80cb875c Michael Hanselmann
394 80cb875c Michael Hanselmann
395 a8083063 Iustin Pop
# instance opcodes
396 a8083063 Iustin Pop
397 a8083063 Iustin Pop
class OpCreateInstance(OpCode):
398 fdc267f4 Iustin Pop
  """Create an instance."""
399 a8083063 Iustin Pop
  OP_ID = "OP_INSTANCE_CREATE"
400 60dd1473 Iustin Pop
  OP_DSC_FIELD = "instance_name"
401 4f05fd3b Iustin Pop
  __slots__ = OpCode.__slots__ + [
402 08db7c5c Iustin Pop
    "instance_name", "os_type", "pnode",
403 08db7c5c Iustin Pop
    "disk_template", "snode", "mode",
404 08db7c5c Iustin Pop
    "disks", "nics",
405 08db7c5c Iustin Pop
    "src_node", "src_path", "start",
406 08db7c5c Iustin Pop
    "wait_for_sync", "ip_check",
407 dc936b49 Manuel Franceschini
    "file_storage_dir", "file_driver",
408 6785674e Iustin Pop
    "iallocator",
409 6785674e Iustin Pop
    "hypervisor", "hvparams", "beparams",
410 4f05fd3b Iustin Pop
    "dry_run",
411 3b6d8c9b Iustin Pop
    ]
412 a8083063 Iustin Pop
413 a8083063 Iustin Pop
414 fe7b0351 Michael Hanselmann
class OpReinstallInstance(OpCode):
415 fdc267f4 Iustin Pop
  """Reinstall an instance's OS."""
416 fe7b0351 Michael Hanselmann
  OP_ID = "OP_INSTANCE_REINSTALL"
417 60dd1473 Iustin Pop
  OP_DSC_FIELD = "instance_name"
418 4f05fd3b Iustin Pop
  __slots__ = OpCode.__slots__ + ["instance_name", "os_type"]
419 fe7b0351 Michael Hanselmann
420 fe7b0351 Michael Hanselmann
421 a8083063 Iustin Pop
class OpRemoveInstance(OpCode):
422 a8083063 Iustin Pop
  """Remove an instance."""
423 a8083063 Iustin Pop
  OP_ID = "OP_INSTANCE_REMOVE"
424 60dd1473 Iustin Pop
  OP_DSC_FIELD = "instance_name"
425 4f05fd3b Iustin Pop
  __slots__ = OpCode.__slots__ + ["instance_name", "ignore_failures"]
426 a8083063 Iustin Pop
427 a8083063 Iustin Pop
428 decd5f45 Iustin Pop
class OpRenameInstance(OpCode):
429 decd5f45 Iustin Pop
  """Rename an instance."""
430 decd5f45 Iustin Pop
  OP_ID = "OP_INSTANCE_RENAME"
431 4f05fd3b Iustin Pop
  __slots__ = OpCode.__slots__ + [
432 4f05fd3b Iustin Pop
    "instance_name", "ignore_ip", "new_name",
433 4f05fd3b Iustin Pop
    ]
434 decd5f45 Iustin Pop
435 decd5f45 Iustin Pop
436 a8083063 Iustin Pop
class OpStartupInstance(OpCode):
437 fdc267f4 Iustin Pop
  """Startup an instance."""
438 a8083063 Iustin Pop
  OP_ID = "OP_INSTANCE_STARTUP"
439 60dd1473 Iustin Pop
  OP_DSC_FIELD = "instance_name"
440 4f05fd3b Iustin Pop
  __slots__ = OpCode.__slots__ + [
441 4f05fd3b Iustin Pop
    "instance_name", "force", "hvparams", "beparams",
442 4f05fd3b Iustin Pop
    ]
443 a8083063 Iustin Pop
444 a8083063 Iustin Pop
445 a8083063 Iustin Pop
class OpShutdownInstance(OpCode):
446 fdc267f4 Iustin Pop
  """Shutdown an instance."""
447 a8083063 Iustin Pop
  OP_ID = "OP_INSTANCE_SHUTDOWN"
448 60dd1473 Iustin Pop
  OP_DSC_FIELD = "instance_name"
449 4f05fd3b Iustin Pop
  __slots__ = OpCode.__slots__ + ["instance_name"]
450 a8083063 Iustin Pop
451 a8083063 Iustin Pop
452 bf6929a2 Alexander Schreiber
class OpRebootInstance(OpCode):
453 bf6929a2 Alexander Schreiber
  """Reboot an instance."""
454 eeb3a5f9 Iustin Pop
  OP_ID = "OP_INSTANCE_REBOOT"
455 60dd1473 Iustin Pop
  OP_DSC_FIELD = "instance_name"
456 4f05fd3b Iustin Pop
  __slots__ = OpCode.__slots__ + [
457 4f05fd3b Iustin Pop
    "instance_name", "reboot_type", "ignore_secondaries",
458 4f05fd3b Iustin Pop
    ]
459 bf6929a2 Alexander Schreiber
460 bf6929a2 Alexander Schreiber
461 a8083063 Iustin Pop
class OpReplaceDisks(OpCode):
462 fdc267f4 Iustin Pop
  """Replace the disks of an instance."""
463 a8083063 Iustin Pop
  OP_ID = "OP_INSTANCE_REPLACE_DISKS"
464 60dd1473 Iustin Pop
  OP_DSC_FIELD = "instance_name"
465 4f05fd3b Iustin Pop
  __slots__ = OpCode.__slots__ + [
466 4f05fd3b Iustin Pop
    "instance_name", "remote_node", "mode", "disks", "iallocator",
467 4f05fd3b Iustin Pop
    ]
468 a8083063 Iustin Pop
469 a8083063 Iustin Pop
470 a8083063 Iustin Pop
class OpFailoverInstance(OpCode):
471 a8083063 Iustin Pop
  """Failover an instance."""
472 a8083063 Iustin Pop
  OP_ID = "OP_INSTANCE_FAILOVER"
473 60dd1473 Iustin Pop
  OP_DSC_FIELD = "instance_name"
474 4f05fd3b Iustin Pop
  __slots__ = OpCode.__slots__ + ["instance_name", "ignore_consistency"]
475 a8083063 Iustin Pop
476 a8083063 Iustin Pop
477 53c776b5 Iustin Pop
class OpMigrateInstance(OpCode):
478 53c776b5 Iustin Pop
  """Migrate an instance.
479 53c776b5 Iustin Pop

480 53c776b5 Iustin Pop
  This migrates (without shutting down an instance) to its secondary
481 53c776b5 Iustin Pop
  node.
482 53c776b5 Iustin Pop

483 2f907a8c Iustin Pop
  @ivar instance_name: the name of the instance
484 53c776b5 Iustin Pop

485 53c776b5 Iustin Pop
  """
486 53c776b5 Iustin Pop
  OP_ID = "OP_INSTANCE_MIGRATE"
487 ee69c97f Iustin Pop
  OP_DSC_FIELD = "instance_name"
488 4f05fd3b Iustin Pop
  __slots__ = OpCode.__slots__ + ["instance_name", "live", "cleanup"]
489 53c776b5 Iustin Pop
490 53c776b5 Iustin Pop
491 a8083063 Iustin Pop
class OpConnectConsole(OpCode):
492 fdc267f4 Iustin Pop
  """Connect to an instance's console."""
493 a8083063 Iustin Pop
  OP_ID = "OP_INSTANCE_CONSOLE"
494 60dd1473 Iustin Pop
  OP_DSC_FIELD = "instance_name"
495 4f05fd3b Iustin Pop
  __slots__ = OpCode.__slots__ + ["instance_name"]
496 a8083063 Iustin Pop
497 a8083063 Iustin Pop
498 a8083063 Iustin Pop
class OpActivateInstanceDisks(OpCode):
499 fdc267f4 Iustin Pop
  """Activate an instance's disks."""
500 a8083063 Iustin Pop
  OP_ID = "OP_INSTANCE_ACTIVATE_DISKS"
501 60dd1473 Iustin Pop
  OP_DSC_FIELD = "instance_name"
502 4f05fd3b Iustin Pop
  __slots__ = OpCode.__slots__ + ["instance_name"]
503 a8083063 Iustin Pop
504 a8083063 Iustin Pop
505 a8083063 Iustin Pop
class OpDeactivateInstanceDisks(OpCode):
506 fdc267f4 Iustin Pop
  """Deactivate an instance's disks."""
507 a8083063 Iustin Pop
  OP_ID = "OP_INSTANCE_DEACTIVATE_DISKS"
508 60dd1473 Iustin Pop
  OP_DSC_FIELD = "instance_name"
509 4f05fd3b Iustin Pop
  __slots__ = OpCode.__slots__ + ["instance_name"]
510 a8083063 Iustin Pop
511 a8083063 Iustin Pop
512 a8083063 Iustin Pop
class OpQueryInstances(OpCode):
513 a8083063 Iustin Pop
  """Compute the list of instances."""
514 a8083063 Iustin Pop
  OP_ID = "OP_INSTANCE_QUERY"
515 4f05fd3b Iustin Pop
  __slots__ = OpCode.__slots__ + ["output_fields", "names", "use_locking"]
516 a8083063 Iustin Pop
517 a8083063 Iustin Pop
518 a8083063 Iustin Pop
class OpQueryInstanceData(OpCode):
519 a8083063 Iustin Pop
  """Compute the run-time status of instances."""
520 a8083063 Iustin Pop
  OP_ID = "OP_INSTANCE_QUERY_DATA"
521 4f05fd3b Iustin Pop
  __slots__ = OpCode.__slots__ + ["instances", "static"]
522 a8083063 Iustin Pop
523 a8083063 Iustin Pop
524 7767bbf5 Manuel Franceschini
class OpSetInstanceParams(OpCode):
525 a8083063 Iustin Pop
  """Change the parameters of an instance."""
526 7767bbf5 Manuel Franceschini
  OP_ID = "OP_INSTANCE_SET_PARAMS"
527 60dd1473 Iustin Pop
  OP_DSC_FIELD = "instance_name"
528 4f05fd3b Iustin Pop
  __slots__ = OpCode.__slots__ + [
529 24991749 Iustin Pop
    "instance_name",
530 338e51e8 Iustin Pop
    "hvparams", "beparams", "force",
531 24991749 Iustin Pop
    "nics", "disks",
532 973d7867 Iustin Pop
    ]
533 a8083063 Iustin Pop
534 a8083063 Iustin Pop
535 8729e0d7 Iustin Pop
class OpGrowDisk(OpCode):
536 8729e0d7 Iustin Pop
  """Grow a disk of an instance."""
537 8729e0d7 Iustin Pop
  OP_ID = "OP_INSTANCE_GROW_DISK"
538 60dd1473 Iustin Pop
  OP_DSC_FIELD = "instance_name"
539 4f05fd3b Iustin Pop
  __slots__ = OpCode.__slots__ + [
540 4f05fd3b Iustin Pop
    "instance_name", "disk", "amount", "wait_for_sync",
541 4f05fd3b Iustin Pop
    ]
542 8729e0d7 Iustin Pop
543 8729e0d7 Iustin Pop
544 a8083063 Iustin Pop
# OS opcodes
545 a8083063 Iustin Pop
class OpDiagnoseOS(OpCode):
546 a8083063 Iustin Pop
  """Compute the list of guest operating systems."""
547 a8083063 Iustin Pop
  OP_ID = "OP_OS_DIAGNOSE"
548 4f05fd3b Iustin Pop
  __slots__ = OpCode.__slots__ + ["output_fields", "names"]
549 a8083063 Iustin Pop
550 7c0d6283 Michael Hanselmann
551 a8083063 Iustin Pop
# Exports opcodes
552 a8083063 Iustin Pop
class OpQueryExports(OpCode):
553 a8083063 Iustin Pop
  """Compute the list of exported images."""
554 a8083063 Iustin Pop
  OP_ID = "OP_BACKUP_QUERY"
555 4f05fd3b Iustin Pop
  __slots__ = OpCode.__slots__ + ["nodes", "use_locking"]
556 a8083063 Iustin Pop
557 7c0d6283 Michael Hanselmann
558 a8083063 Iustin Pop
class OpExportInstance(OpCode):
559 a8083063 Iustin Pop
  """Export an instance."""
560 a8083063 Iustin Pop
  OP_ID = "OP_BACKUP_EXPORT"
561 60dd1473 Iustin Pop
  OP_DSC_FIELD = "instance_name"
562 4f05fd3b Iustin Pop
  __slots__ = OpCode.__slots__ + ["instance_name", "target_node", "shutdown"]
563 5c947f38 Iustin Pop
564 0a7bed64 Michael Hanselmann
565 9ac99fda Guido Trotter
class OpRemoveExport(OpCode):
566 9ac99fda Guido Trotter
  """Remove an instance's export."""
567 9ac99fda Guido Trotter
  OP_ID = "OP_BACKUP_REMOVE"
568 60dd1473 Iustin Pop
  OP_DSC_FIELD = "instance_name"
569 4f05fd3b Iustin Pop
  __slots__ = OpCode.__slots__ + ["instance_name"]
570 5c947f38 Iustin Pop
571 0a7bed64 Michael Hanselmann
572 5c947f38 Iustin Pop
# Tags opcodes
573 5c947f38 Iustin Pop
class OpGetTags(OpCode):
574 5c947f38 Iustin Pop
  """Returns the tags of the given object."""
575 5c947f38 Iustin Pop
  OP_ID = "OP_TAGS_GET"
576 60dd1473 Iustin Pop
  OP_DSC_FIELD = "name"
577 4f05fd3b Iustin Pop
  __slots__ = OpCode.__slots__ + ["kind", "name"]
578 5c947f38 Iustin Pop
579 5c947f38 Iustin Pop
580 73415719 Iustin Pop
class OpSearchTags(OpCode):
581 73415719 Iustin Pop
  """Searches the tags in the cluster for a given pattern."""
582 73415719 Iustin Pop
  OP_ID = "OP_TAGS_SEARCH"
583 60dd1473 Iustin Pop
  OP_DSC_FIELD = "pattern"
584 4f05fd3b Iustin Pop
  __slots__ = OpCode.__slots__ + ["pattern"]
585 73415719 Iustin Pop
586 73415719 Iustin Pop
587 f27302fa Iustin Pop
class OpAddTags(OpCode):
588 f27302fa Iustin Pop
  """Add a list of tags on a given object."""
589 5c947f38 Iustin Pop
  OP_ID = "OP_TAGS_SET"
590 4f05fd3b Iustin Pop
  __slots__ = OpCode.__slots__ + ["kind", "name", "tags"]
591 5c947f38 Iustin Pop
592 5c947f38 Iustin Pop
593 f27302fa Iustin Pop
class OpDelTags(OpCode):
594 f27302fa Iustin Pop
  """Remove a list of tags from a given object."""
595 5c947f38 Iustin Pop
  OP_ID = "OP_TAGS_DEL"
596 4f05fd3b Iustin Pop
  __slots__ = OpCode.__slots__ + ["kind", "name", "tags"]
597 06009e27 Iustin Pop
598 06009e27 Iustin Pop
599 06009e27 Iustin Pop
# Test opcodes
600 06009e27 Iustin Pop
class OpTestDelay(OpCode):
601 06009e27 Iustin Pop
  """Sleeps for a configured amount of time.
602 06009e27 Iustin Pop

603 06009e27 Iustin Pop
  This is used just for debugging and testing.
604 06009e27 Iustin Pop

605 06009e27 Iustin Pop
  Parameters:
606 06009e27 Iustin Pop
    - duration: the time to sleep
607 06009e27 Iustin Pop
    - on_master: if true, sleep on the master
608 06009e27 Iustin Pop
    - on_nodes: list of nodes in which to sleep
609 06009e27 Iustin Pop

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

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

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

620 06009e27 Iustin Pop
  """
621 06009e27 Iustin Pop
  OP_ID = "OP_TEST_DELAY"
622 60dd1473 Iustin Pop
  OP_DSC_FIELD = "duration"
623 4f05fd3b Iustin Pop
  __slots__ = OpCode.__slots__ + ["duration", "on_master", "on_nodes"]
624 d61df03e Iustin Pop
625 d61df03e Iustin Pop
626 d61df03e Iustin Pop
class OpTestAllocator(OpCode):
627 d61df03e Iustin Pop
  """Allocator framework testing.
628 d61df03e Iustin Pop

629 d61df03e Iustin Pop
  This opcode has two modes:
630 d61df03e Iustin Pop
    - gather and return allocator input for a given mode (allocate new
631 d61df03e Iustin Pop
      or replace secondary) and a given instance definition (direction
632 d61df03e Iustin Pop
      'in')
633 d61df03e Iustin Pop
    - run a selected allocator for a given operation (as above) and
634 d61df03e Iustin Pop
      return the allocator output (direction 'out')
635 d61df03e Iustin Pop

636 d61df03e Iustin Pop
  """
637 d61df03e Iustin Pop
  OP_ID = "OP_TEST_ALLOCATOR"
638 60dd1473 Iustin Pop
  OP_DSC_FIELD = "allocator"
639 4f05fd3b Iustin Pop
  __slots__ = OpCode.__slots__ + [
640 d61df03e Iustin Pop
    "direction", "mode", "allocator", "name",
641 d61df03e Iustin Pop
    "mem_size", "disks", "disk_template",
642 8cc7e742 Guido Trotter
    "os", "tags", "nics", "vcpus", "hypervisor",
643 d61df03e Iustin Pop
    ]
644 363acb1e Iustin Pop
645 363acb1e Iustin Pop
OP_MAPPING = dict([(v.OP_ID, v) for v in globals().values()
646 363acb1e Iustin Pop
                   if (isinstance(v, type) and issubclass(v, OpCode) and
647 363acb1e Iustin Pop
                       hasattr(v, "OP_ID"))])