Statistics
| Branch: | Tag: | Revision:

root / lib / opcodes.py @ 09444532

History | View | Annotate | Download (17.7 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 b5f5fae9 Luca Bigliardi
class OpPostInitCluster(OpCode):
174 b5f5fae9 Luca Bigliardi
  """Post cluster initialization.
175 b5f5fae9 Luca Bigliardi

176 b5f5fae9 Luca Bigliardi
  This opcode does not touch the cluster at all. Its purpose is to run hooks
177 b5f5fae9 Luca Bigliardi
  after the cluster has been initialized.
178 b5f5fae9 Luca Bigliardi

179 b5f5fae9 Luca Bigliardi
  """
180 b5f5fae9 Luca Bigliardi
  OP_ID = "OP_CLUSTER_POST_INIT"
181 b5f5fae9 Luca Bigliardi
  __slots__ = OpCode.__slots__ + []
182 b5f5fae9 Luca Bigliardi
183 b5f5fae9 Luca Bigliardi
184 a8083063 Iustin Pop
class OpDestroyCluster(OpCode):
185 a7399f66 Iustin Pop
  """Destroy the cluster.
186 a7399f66 Iustin Pop

187 a7399f66 Iustin Pop
  This opcode has no other parameters. All the state is irreversibly
188 a7399f66 Iustin Pop
  lost after the execution of this opcode.
189 a7399f66 Iustin Pop

190 a7399f66 Iustin Pop
  """
191 a8083063 Iustin Pop
  OP_ID = "OP_CLUSTER_DESTROY"
192 4f05fd3b Iustin Pop
  __slots__ = OpCode.__slots__ + []
193 a8083063 Iustin Pop
194 a8083063 Iustin Pop
195 a8083063 Iustin Pop
class OpQueryClusterInfo(OpCode):
196 fdc267f4 Iustin Pop
  """Query cluster information."""
197 a8083063 Iustin Pop
  OP_ID = "OP_CLUSTER_QUERY"
198 4f05fd3b Iustin Pop
  __slots__ = OpCode.__slots__ + []
199 a8083063 Iustin Pop
200 a8083063 Iustin Pop
201 a8083063 Iustin Pop
class OpVerifyCluster(OpCode):
202 a7399f66 Iustin Pop
  """Verify the cluster state.
203 a7399f66 Iustin Pop

204 a7399f66 Iustin Pop
  @type skip_checks: C{list}
205 a7399f66 Iustin Pop
  @ivar skip_checks: steps to be skipped from the verify process; this
206 a7399f66 Iustin Pop
                     needs to be a subset of
207 a7399f66 Iustin Pop
                     L{constants.VERIFY_OPTIONAL_CHECKS}; currently
208 a7399f66 Iustin Pop
                     only L{constants.VERIFY_NPLUSONE_MEM} can be passed
209 a7399f66 Iustin Pop

210 a7399f66 Iustin Pop
  """
211 a8083063 Iustin Pop
  OP_ID = "OP_CLUSTER_VERIFY"
212 4f05fd3b Iustin Pop
  __slots__ = OpCode.__slots__ + ["skip_checks"]
213 a8083063 Iustin Pop
214 a8083063 Iustin Pop
215 150e978f Iustin Pop
class OpVerifyDisks(OpCode):
216 150e978f Iustin Pop
  """Verify the cluster disks.
217 150e978f Iustin Pop

218 150e978f Iustin Pop
  Parameters: none
219 150e978f Iustin Pop

220 5188ab37 Iustin Pop
  Result: a tuple of four elements:
221 150e978f Iustin Pop
    - list of node names with bad data returned (unreachable, etc.)
222 a7399f66 Iustin Pop
    - dict of node names with broken volume groups (values: error msg)
223 150e978f Iustin Pop
    - list of instances with degraded disks (that should be activated)
224 b63ed789 Iustin Pop
    - dict of instances with missing logical volumes (values: (node, vol)
225 b63ed789 Iustin Pop
      pairs with details about the missing volumes)
226 150e978f Iustin Pop

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

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

235 150e978f Iustin Pop
  """
236 150e978f Iustin Pop
  OP_ID = "OP_CLUSTER_VERIFY_DISKS"
237 4f05fd3b Iustin Pop
  __slots__ = OpCode.__slots__ + []
238 150e978f Iustin Pop
239 150e978f Iustin Pop
240 ae5849b5 Michael Hanselmann
class OpQueryConfigValues(OpCode):
241 ae5849b5 Michael Hanselmann
  """Query cluster configuration values."""
242 ae5849b5 Michael Hanselmann
  OP_ID = "OP_CLUSTER_CONFIG_QUERY"
243 4f05fd3b Iustin Pop
  __slots__ = OpCode.__slots__ + ["output_fields"]
244 a8083063 Iustin Pop
245 a8083063 Iustin Pop
246 07bd8a51 Iustin Pop
class OpRenameCluster(OpCode):
247 a7399f66 Iustin Pop
  """Rename the cluster.
248 a7399f66 Iustin Pop

249 a7399f66 Iustin Pop
  @type name: C{str}
250 a7399f66 Iustin Pop
  @ivar name: The new name of the cluster. The name and/or the master IP
251 a7399f66 Iustin Pop
              address will be changed to match the new name and its IP
252 a7399f66 Iustin Pop
              address.
253 a7399f66 Iustin Pop

254 a7399f66 Iustin Pop
  """
255 07bd8a51 Iustin Pop
  OP_ID = "OP_CLUSTER_RENAME"
256 60dd1473 Iustin Pop
  OP_DSC_FIELD = "name"
257 4f05fd3b Iustin Pop
  __slots__ = OpCode.__slots__ + ["name"]
258 07bd8a51 Iustin Pop
259 07bd8a51 Iustin Pop
260 12515db7 Manuel Franceschini
class OpSetClusterParams(OpCode):
261 a7399f66 Iustin Pop
  """Change the parameters of the cluster.
262 a7399f66 Iustin Pop

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

266 a7399f66 Iustin Pop
  """
267 12515db7 Manuel Franceschini
  OP_ID = "OP_CLUSTER_SET_PARAMS"
268 4f05fd3b Iustin Pop
  __slots__ = OpCode.__slots__ + [
269 4b7735f9 Iustin Pop
    "vg_name",
270 4b7735f9 Iustin Pop
    "enabled_hypervisors",
271 4b7735f9 Iustin Pop
    "hvparams",
272 4b7735f9 Iustin Pop
    "beparams",
273 5af3da74 Guido Trotter
    "nicparams",
274 4b7735f9 Iustin Pop
    "candidate_pool_size",
275 4b7735f9 Iustin Pop
    ]
276 12515db7 Manuel Franceschini
277 12515db7 Manuel Franceschini
278 afee0879 Iustin Pop
class OpRedistributeConfig(OpCode):
279 afee0879 Iustin Pop
  """Force a full push of the cluster configuration.
280 afee0879 Iustin Pop

281 afee0879 Iustin Pop
  """
282 afee0879 Iustin Pop
  OP_ID = "OP_CLUSTER_REDIST_CONF"
283 4f05fd3b Iustin Pop
  __slots__ = OpCode.__slots__ + [
284 afee0879 Iustin Pop
    ]
285 afee0879 Iustin Pop
286 07bd8a51 Iustin Pop
# node opcodes
287 07bd8a51 Iustin Pop
288 a8083063 Iustin Pop
class OpRemoveNode(OpCode):
289 a7399f66 Iustin Pop
  """Remove a node.
290 a7399f66 Iustin Pop

291 a7399f66 Iustin Pop
  @type node_name: C{str}
292 a7399f66 Iustin Pop
  @ivar node_name: The name of the node to remove. If the node still has
293 a7399f66 Iustin Pop
                   instances on it, the operation will fail.
294 a7399f66 Iustin Pop

295 a7399f66 Iustin Pop
  """
296 a8083063 Iustin Pop
  OP_ID = "OP_NODE_REMOVE"
297 60dd1473 Iustin Pop
  OP_DSC_FIELD = "node_name"
298 4f05fd3b Iustin Pop
  __slots__ = OpCode.__slots__ + ["node_name"]
299 a8083063 Iustin Pop
300 a8083063 Iustin Pop
301 a8083063 Iustin Pop
class OpAddNode(OpCode):
302 a7399f66 Iustin Pop
  """Add a node to the cluster.
303 a7399f66 Iustin Pop

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

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

491 53c776b5 Iustin Pop
  This migrates (without shutting down an instance) to its secondary
492 53c776b5 Iustin Pop
  node.
493 53c776b5 Iustin Pop

494 2f907a8c Iustin Pop
  @ivar instance_name: the name of the instance
495 53c776b5 Iustin Pop

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

614 06009e27 Iustin Pop
  This is used just for debugging and testing.
615 06009e27 Iustin Pop

616 06009e27 Iustin Pop
  Parameters:
617 06009e27 Iustin Pop
    - duration: the time to sleep
618 06009e27 Iustin Pop
    - on_master: if true, sleep on the master
619 06009e27 Iustin Pop
    - on_nodes: list of nodes in which to sleep
620 06009e27 Iustin Pop

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

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

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

631 06009e27 Iustin Pop
  """
632 06009e27 Iustin Pop
  OP_ID = "OP_TEST_DELAY"
633 60dd1473 Iustin Pop
  OP_DSC_FIELD = "duration"
634 4f05fd3b Iustin Pop
  __slots__ = OpCode.__slots__ + ["duration", "on_master", "on_nodes"]
635 d61df03e Iustin Pop
636 d61df03e Iustin Pop
637 d61df03e Iustin Pop
class OpTestAllocator(OpCode):
638 d61df03e Iustin Pop
  """Allocator framework testing.
639 d61df03e Iustin Pop

640 d61df03e Iustin Pop
  This opcode has two modes:
641 d61df03e Iustin Pop
    - gather and return allocator input for a given mode (allocate new
642 d61df03e Iustin Pop
      or replace secondary) and a given instance definition (direction
643 d61df03e Iustin Pop
      'in')
644 d61df03e Iustin Pop
    - run a selected allocator for a given operation (as above) and
645 d61df03e Iustin Pop
      return the allocator output (direction 'out')
646 d61df03e Iustin Pop

647 d61df03e Iustin Pop
  """
648 d61df03e Iustin Pop
  OP_ID = "OP_TEST_ALLOCATOR"
649 60dd1473 Iustin Pop
  OP_DSC_FIELD = "allocator"
650 4f05fd3b Iustin Pop
  __slots__ = OpCode.__slots__ + [
651 d61df03e Iustin Pop
    "direction", "mode", "allocator", "name",
652 d61df03e Iustin Pop
    "mem_size", "disks", "disk_template",
653 8cc7e742 Guido Trotter
    "os", "tags", "nics", "vcpus", "hypervisor",
654 d61df03e Iustin Pop
    ]
655 363acb1e Iustin Pop
656 363acb1e Iustin Pop
OP_MAPPING = dict([(v.OP_ID, v) for v in globals().values()
657 363acb1e Iustin Pop
                   if (isinstance(v, type) and issubclass(v, OpCode) and
658 363acb1e Iustin Pop
                       hasattr(v, "OP_ID"))])