Statistics
| Branch: | Tag: | Revision:

root / lib / opcodes.py @ 84a12e40

History | View | Annotate | Download (20.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 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 adf385c7 Iustin Pop
    slots = self._all_slots()
56 a8083063 Iustin Pop
    for key in kwargs:
57 adf385c7 Iustin Pop
      if key not in slots:
58 df458e0b Iustin Pop
        raise TypeError("Object %s doesn't support the parameter '%s'" %
59 3ecf6786 Iustin Pop
                        (self.__class__.__name__, key))
60 a8083063 Iustin Pop
      setattr(self, key, kwargs[key])
61 a8083063 Iustin Pop
62 df458e0b Iustin Pop
  def __getstate__(self):
63 a7399f66 Iustin Pop
    """Generic serializer.
64 a7399f66 Iustin Pop

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

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

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

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

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

87 a7399f66 Iustin Pop
    """
88 df458e0b Iustin Pop
    if not isinstance(state, dict):
89 df458e0b Iustin Pop
      raise ValueError("Invalid data to __setstate__: expected dict, got %s" %
90 df458e0b Iustin Pop
                       type(state))
91 df458e0b Iustin Pop
92 adf385c7 Iustin Pop
    for name in self._all_slots():
93 44db3a6f Iustin Pop
      if name not in state and hasattr(self, name):
94 df458e0b Iustin Pop
        delattr(self, name)
95 df458e0b Iustin Pop
96 df458e0b Iustin Pop
    for name in state:
97 df458e0b Iustin Pop
      setattr(self, name, state[name])
98 df458e0b Iustin Pop
99 adf385c7 Iustin Pop
  @classmethod
100 adf385c7 Iustin Pop
  def _all_slots(cls):
101 adf385c7 Iustin Pop
    """Compute the list of all declared slots for a class.
102 adf385c7 Iustin Pop

103 adf385c7 Iustin Pop
    """
104 adf385c7 Iustin Pop
    slots = []
105 adf385c7 Iustin Pop
    for parent in cls.__mro__:
106 adf385c7 Iustin Pop
      slots.extend(getattr(parent, "__slots__", []))
107 adf385c7 Iustin Pop
    return slots
108 adf385c7 Iustin Pop
109 df458e0b Iustin Pop
110 0e46916d Iustin Pop
class OpCode(BaseOpCode):
111 a7399f66 Iustin Pop
  """Abstract OpCode.
112 a7399f66 Iustin Pop

113 a7399f66 Iustin Pop
  This is the root of the actual OpCode hierarchy. All clases derived
114 a7399f66 Iustin Pop
  from this class should override OP_ID.
115 a7399f66 Iustin Pop

116 a7399f66 Iustin Pop
  @cvar OP_ID: The ID of this opcode. This should be unique amongst all
117 20777413 Iustin Pop
               children of this class.
118 20777413 Iustin Pop
  @ivar dry_run: Whether the LU should be run in dry-run mode, i.e. just
119 20777413 Iustin Pop
                 the check steps
120 a7399f66 Iustin Pop

121 a7399f66 Iustin Pop
  """
122 df458e0b Iustin Pop
  OP_ID = "OP_ABSTRACT"
123 ee844e20 Iustin Pop
  __slots__ = ["dry_run", "debug_level"]
124 df458e0b Iustin Pop
125 df458e0b Iustin Pop
  def __getstate__(self):
126 df458e0b Iustin Pop
    """Specialized getstate for opcodes.
127 df458e0b Iustin Pop

128 a7399f66 Iustin Pop
    This method adds to the state dictionary the OP_ID of the class,
129 a7399f66 Iustin Pop
    so that on unload we can identify the correct class for
130 a7399f66 Iustin Pop
    instantiating the opcode.
131 a7399f66 Iustin Pop

132 a7399f66 Iustin Pop
    @rtype:   C{dict}
133 a7399f66 Iustin Pop
    @return:  the state as a dictionary
134 a7399f66 Iustin Pop

135 df458e0b Iustin Pop
    """
136 0e46916d Iustin Pop
    data = BaseOpCode.__getstate__(self)
137 df458e0b Iustin Pop
    data["OP_ID"] = self.OP_ID
138 df458e0b Iustin Pop
    return data
139 df458e0b Iustin Pop
140 df458e0b Iustin Pop
  @classmethod
141 00abdc96 Iustin Pop
  def LoadOpCode(cls, data):
142 df458e0b Iustin Pop
    """Generic load opcode method.
143 df458e0b Iustin Pop

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

148 a7399f66 Iustin Pop
    @type data:  C{dict}
149 a7399f66 Iustin Pop
    @param data: the serialized opcode
150 a7399f66 Iustin Pop

151 df458e0b Iustin Pop
    """
152 df458e0b Iustin Pop
    if not isinstance(data, dict):
153 df458e0b Iustin Pop
      raise ValueError("Invalid data to LoadOpCode (%s)" % type(data))
154 df458e0b Iustin Pop
    if "OP_ID" not in data:
155 df458e0b Iustin Pop
      raise ValueError("Invalid data to LoadOpcode, missing OP_ID")
156 df458e0b Iustin Pop
    op_id = data["OP_ID"]
157 df458e0b Iustin Pop
    op_class = None
158 363acb1e Iustin Pop
    if op_id in OP_MAPPING:
159 363acb1e Iustin Pop
      op_class = OP_MAPPING[op_id]
160 363acb1e Iustin Pop
    else:
161 df458e0b Iustin Pop
      raise ValueError("Invalid data to LoadOpCode: OP_ID %s unsupported" %
162 df458e0b Iustin Pop
                       op_id)
163 df458e0b Iustin Pop
    op = op_class()
164 df458e0b Iustin Pop
    new_data = data.copy()
165 df458e0b Iustin Pop
    del new_data["OP_ID"]
166 df458e0b Iustin Pop
    op.__setstate__(new_data)
167 df458e0b Iustin Pop
    return op
168 df458e0b Iustin Pop
169 60dd1473 Iustin Pop
  def Summary(self):
170 60dd1473 Iustin Pop
    """Generates a summary description of this opcode.
171 60dd1473 Iustin Pop

172 60dd1473 Iustin Pop
    """
173 60dd1473 Iustin Pop
    # all OP_ID start with OP_, we remove that
174 60dd1473 Iustin Pop
    txt = self.OP_ID[3:]
175 60dd1473 Iustin Pop
    field_name = getattr(self, "OP_DSC_FIELD", None)
176 60dd1473 Iustin Pop
    if field_name:
177 60dd1473 Iustin Pop
      field_value = getattr(self, field_name, None)
178 60dd1473 Iustin Pop
      txt = "%s(%s)" % (txt, field_value)
179 60dd1473 Iustin Pop
    return txt
180 60dd1473 Iustin Pop
181 a8083063 Iustin Pop
182 afee0879 Iustin Pop
# cluster opcodes
183 afee0879 Iustin Pop
184 b5f5fae9 Luca Bigliardi
class OpPostInitCluster(OpCode):
185 b5f5fae9 Luca Bigliardi
  """Post cluster initialization.
186 b5f5fae9 Luca Bigliardi

187 b5f5fae9 Luca Bigliardi
  This opcode does not touch the cluster at all. Its purpose is to run hooks
188 b5f5fae9 Luca Bigliardi
  after the cluster has been initialized.
189 b5f5fae9 Luca Bigliardi

190 b5f5fae9 Luca Bigliardi
  """
191 b5f5fae9 Luca Bigliardi
  OP_ID = "OP_CLUSTER_POST_INIT"
192 154b9580 Balazs Lecz
  __slots__ = []
193 b5f5fae9 Luca Bigliardi
194 b5f5fae9 Luca Bigliardi
195 a8083063 Iustin Pop
class OpDestroyCluster(OpCode):
196 a7399f66 Iustin Pop
  """Destroy the cluster.
197 a7399f66 Iustin Pop

198 a7399f66 Iustin Pop
  This opcode has no other parameters. All the state is irreversibly
199 a7399f66 Iustin Pop
  lost after the execution of this opcode.
200 a7399f66 Iustin Pop

201 a7399f66 Iustin Pop
  """
202 a8083063 Iustin Pop
  OP_ID = "OP_CLUSTER_DESTROY"
203 154b9580 Balazs Lecz
  __slots__ = []
204 a8083063 Iustin Pop
205 a8083063 Iustin Pop
206 a8083063 Iustin Pop
class OpQueryClusterInfo(OpCode):
207 fdc267f4 Iustin Pop
  """Query cluster information."""
208 a8083063 Iustin Pop
  OP_ID = "OP_CLUSTER_QUERY"
209 154b9580 Balazs Lecz
  __slots__ = []
210 a8083063 Iustin Pop
211 a8083063 Iustin Pop
212 a8083063 Iustin Pop
class OpVerifyCluster(OpCode):
213 a7399f66 Iustin Pop
  """Verify the cluster state.
214 a7399f66 Iustin Pop

215 a7399f66 Iustin Pop
  @type skip_checks: C{list}
216 a7399f66 Iustin Pop
  @ivar skip_checks: steps to be skipped from the verify process; this
217 a7399f66 Iustin Pop
                     needs to be a subset of
218 a7399f66 Iustin Pop
                     L{constants.VERIFY_OPTIONAL_CHECKS}; currently
219 a7399f66 Iustin Pop
                     only L{constants.VERIFY_NPLUSONE_MEM} can be passed
220 a7399f66 Iustin Pop

221 a7399f66 Iustin Pop
  """
222 a8083063 Iustin Pop
  OP_ID = "OP_CLUSTER_VERIFY"
223 154b9580 Balazs Lecz
  __slots__ = ["skip_checks", "verbose", "error_codes",
224 154b9580 Balazs Lecz
               "debug_simulate_errors"]
225 a8083063 Iustin Pop
226 a8083063 Iustin Pop
227 150e978f Iustin Pop
class OpVerifyDisks(OpCode):
228 150e978f Iustin Pop
  """Verify the cluster disks.
229 150e978f Iustin Pop

230 150e978f Iustin Pop
  Parameters: none
231 150e978f Iustin Pop

232 5188ab37 Iustin Pop
  Result: a tuple of four elements:
233 150e978f Iustin Pop
    - list of node names with bad data returned (unreachable, etc.)
234 a7399f66 Iustin Pop
    - dict of node names with broken volume groups (values: error msg)
235 150e978f Iustin Pop
    - list of instances with degraded disks (that should be activated)
236 b63ed789 Iustin Pop
    - dict of instances with missing logical volumes (values: (node, vol)
237 b63ed789 Iustin Pop
      pairs with details about the missing volumes)
238 150e978f Iustin Pop

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

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

247 150e978f Iustin Pop
  """
248 150e978f Iustin Pop
  OP_ID = "OP_CLUSTER_VERIFY_DISKS"
249 154b9580 Balazs Lecz
  __slots__ = []
250 150e978f Iustin Pop
251 150e978f Iustin Pop
252 60975797 Iustin Pop
class OpRepairDiskSizes(OpCode):
253 60975797 Iustin Pop
  """Verify the disk sizes of the instances and fixes configuration
254 60975797 Iustin Pop
  mimatches.
255 60975797 Iustin Pop

256 60975797 Iustin Pop
  Parameters: optional instances list, in case we want to restrict the
257 60975797 Iustin Pop
  checks to only a subset of the instances.
258 60975797 Iustin Pop

259 60975797 Iustin Pop
  Result: a list of tuples, (instance, disk, new-size) for changed
260 60975797 Iustin Pop
  configurations.
261 60975797 Iustin Pop

262 60975797 Iustin Pop
  In normal operation, the list should be empty.
263 60975797 Iustin Pop

264 60975797 Iustin Pop
  @type instances: list
265 60975797 Iustin Pop
  @ivar instances: the list of instances to check, or empty for all instances
266 60975797 Iustin Pop

267 60975797 Iustin Pop
  """
268 60975797 Iustin Pop
  OP_ID = "OP_CLUSTER_REPAIR_DISK_SIZES"
269 60975797 Iustin Pop
  __slots__ = ["instances"]
270 60975797 Iustin Pop
271 60975797 Iustin Pop
272 ae5849b5 Michael Hanselmann
class OpQueryConfigValues(OpCode):
273 ae5849b5 Michael Hanselmann
  """Query cluster configuration values."""
274 ae5849b5 Michael Hanselmann
  OP_ID = "OP_CLUSTER_CONFIG_QUERY"
275 154b9580 Balazs Lecz
  __slots__ = ["output_fields"]
276 a8083063 Iustin Pop
277 a8083063 Iustin Pop
278 07bd8a51 Iustin Pop
class OpRenameCluster(OpCode):
279 a7399f66 Iustin Pop
  """Rename the cluster.
280 a7399f66 Iustin Pop

281 a7399f66 Iustin Pop
  @type name: C{str}
282 a7399f66 Iustin Pop
  @ivar name: The new name of the cluster. The name and/or the master IP
283 a7399f66 Iustin Pop
              address will be changed to match the new name and its IP
284 a7399f66 Iustin Pop
              address.
285 a7399f66 Iustin Pop

286 a7399f66 Iustin Pop
  """
287 07bd8a51 Iustin Pop
  OP_ID = "OP_CLUSTER_RENAME"
288 60dd1473 Iustin Pop
  OP_DSC_FIELD = "name"
289 154b9580 Balazs Lecz
  __slots__ = ["name"]
290 07bd8a51 Iustin Pop
291 07bd8a51 Iustin Pop
292 12515db7 Manuel Franceschini
class OpSetClusterParams(OpCode):
293 a7399f66 Iustin Pop
  """Change the parameters of the cluster.
294 a7399f66 Iustin Pop

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

298 a7399f66 Iustin Pop
  """
299 12515db7 Manuel Franceschini
  OP_ID = "OP_CLUSTER_SET_PARAMS"
300 154b9580 Balazs Lecz
  __slots__ = [
301 4b7735f9 Iustin Pop
    "vg_name",
302 7b2cd2b4 Luca Bigliardi
    "drbd_helper",
303 4b7735f9 Iustin Pop
    "enabled_hypervisors",
304 4b7735f9 Iustin Pop
    "hvparams",
305 17463d22 René Nussbaumer
    "os_hvp",
306 4b7735f9 Iustin Pop
    "beparams",
307 625ac113 Iustin Pop
    "osparams",
308 5af3da74 Guido Trotter
    "nicparams",
309 4b7735f9 Iustin Pop
    "candidate_pool_size",
310 3953242f Iustin Pop
    "maintain_node_health",
311 1338f2b4 Balazs Lecz
    "uid_pool",
312 fdad8c4d Balazs Lecz
    "add_uids",
313 fdad8c4d Balazs Lecz
    "remove_uids",
314 bf4af505 Apollon Oikonomopoulos
    "default_iallocator",
315 4b7735f9 Iustin Pop
    ]
316 12515db7 Manuel Franceschini
317 12515db7 Manuel Franceschini
318 afee0879 Iustin Pop
class OpRedistributeConfig(OpCode):
319 afee0879 Iustin Pop
  """Force a full push of the cluster configuration.
320 afee0879 Iustin Pop

321 afee0879 Iustin Pop
  """
322 afee0879 Iustin Pop
  OP_ID = "OP_CLUSTER_REDIST_CONF"
323 154b9580 Balazs Lecz
  __slots__ = []
324 afee0879 Iustin Pop
325 07bd8a51 Iustin Pop
# node opcodes
326 07bd8a51 Iustin Pop
327 a8083063 Iustin Pop
class OpRemoveNode(OpCode):
328 a7399f66 Iustin Pop
  """Remove a node.
329 a7399f66 Iustin Pop

330 a7399f66 Iustin Pop
  @type node_name: C{str}
331 a7399f66 Iustin Pop
  @ivar node_name: The name of the node to remove. If the node still has
332 a7399f66 Iustin Pop
                   instances on it, the operation will fail.
333 a7399f66 Iustin Pop

334 a7399f66 Iustin Pop
  """
335 a8083063 Iustin Pop
  OP_ID = "OP_NODE_REMOVE"
336 60dd1473 Iustin Pop
  OP_DSC_FIELD = "node_name"
337 154b9580 Balazs Lecz
  __slots__ = ["node_name"]
338 a8083063 Iustin Pop
339 a8083063 Iustin Pop
340 a8083063 Iustin Pop
class OpAddNode(OpCode):
341 a7399f66 Iustin Pop
  """Add a node to the cluster.
342 a7399f66 Iustin Pop

343 a7399f66 Iustin Pop
  @type node_name: C{str}
344 a7399f66 Iustin Pop
  @ivar node_name: The name of the node to add. This can be a short name,
345 a7399f66 Iustin Pop
                   but it will be expanded to the FQDN.
346 a7399f66 Iustin Pop
  @type primary_ip: IP address
347 a7399f66 Iustin Pop
  @ivar primary_ip: The primary IP of the node. This will be ignored when the
348 a7399f66 Iustin Pop
                    opcode is submitted, but will be filled during the node
349 a7399f66 Iustin Pop
                    add (so it will be visible in the job query).
350 a7399f66 Iustin Pop
  @type secondary_ip: IP address
351 a7399f66 Iustin Pop
  @ivar secondary_ip: The secondary IP of the node. This needs to be passed
352 a7399f66 Iustin Pop
                      if the cluster has been initialized in 'dual-network'
353 a7399f66 Iustin Pop
                      mode, otherwise it must not be given.
354 a7399f66 Iustin Pop
  @type readd: C{bool}
355 a7399f66 Iustin Pop
  @ivar readd: Whether to re-add an existing node to the cluster. If
356 a7399f66 Iustin Pop
               this is not passed, then the operation will abort if the node
357 a7399f66 Iustin Pop
               name is already in the cluster; use this parameter to 'repair'
358 a7399f66 Iustin Pop
               a node that had its configuration broken, or was reinstalled
359 a7399f66 Iustin Pop
               without removal from the cluster.
360 a7399f66 Iustin Pop

361 a7399f66 Iustin Pop
  """
362 a8083063 Iustin Pop
  OP_ID = "OP_NODE_ADD"
363 60dd1473 Iustin Pop
  OP_DSC_FIELD = "node_name"
364 154b9580 Balazs Lecz
  __slots__ = ["node_name", "primary_ip", "secondary_ip", "readd"]
365 a8083063 Iustin Pop
366 a8083063 Iustin Pop
367 a8083063 Iustin Pop
class OpQueryNodes(OpCode):
368 a8083063 Iustin Pop
  """Compute the list of nodes."""
369 a8083063 Iustin Pop
  OP_ID = "OP_NODE_QUERY"
370 154b9580 Balazs Lecz
  __slots__ = ["output_fields", "names", "use_locking"]
371 a8083063 Iustin Pop
372 a8083063 Iustin Pop
373 dcb93971 Michael Hanselmann
class OpQueryNodeVolumes(OpCode):
374 dcb93971 Michael Hanselmann
  """Get list of volumes on node."""
375 dcb93971 Michael Hanselmann
  OP_ID = "OP_NODE_QUERYVOLS"
376 154b9580 Balazs Lecz
  __slots__ = ["nodes", "output_fields"]
377 dcb93971 Michael Hanselmann
378 dcb93971 Michael Hanselmann
379 9e5442ce Michael Hanselmann
class OpQueryNodeStorage(OpCode):
380 9e5442ce Michael Hanselmann
  """Get information on storage for node(s)."""
381 9e5442ce Michael Hanselmann
  OP_ID = "OP_NODE_QUERY_STORAGE"
382 154b9580 Balazs Lecz
  __slots__ = [
383 9e5442ce Michael Hanselmann
    "nodes",
384 9e5442ce Michael Hanselmann
    "storage_type",
385 9e5442ce Michael Hanselmann
    "name",
386 9e5442ce Michael Hanselmann
    "output_fields",
387 9e5442ce Michael Hanselmann
    ]
388 9e5442ce Michael Hanselmann
389 9e5442ce Michael Hanselmann
390 efb8da02 Michael Hanselmann
class OpModifyNodeStorage(OpCode):
391 099c52ad Iustin Pop
  """Modifies the properies of a storage unit"""
392 efb8da02 Michael Hanselmann
  OP_ID = "OP_NODE_MODIFY_STORAGE"
393 154b9580 Balazs Lecz
  __slots__ = [
394 efb8da02 Michael Hanselmann
    "node_name",
395 efb8da02 Michael Hanselmann
    "storage_type",
396 efb8da02 Michael Hanselmann
    "name",
397 efb8da02 Michael Hanselmann
    "changes",
398 efb8da02 Michael Hanselmann
    ]
399 efb8da02 Michael Hanselmann
400 efb8da02 Michael Hanselmann
401 76aef8fc Michael Hanselmann
class OpRepairNodeStorage(OpCode):
402 76aef8fc Michael Hanselmann
  """Repairs the volume group on a node."""
403 76aef8fc Michael Hanselmann
  OP_ID = "OP_REPAIR_NODE_STORAGE"
404 76aef8fc Michael Hanselmann
  OP_DSC_FIELD = "node_name"
405 154b9580 Balazs Lecz
  __slots__ = [
406 76aef8fc Michael Hanselmann
    "node_name",
407 76aef8fc Michael Hanselmann
    "storage_type",
408 76aef8fc Michael Hanselmann
    "name",
409 7e9c6a78 Iustin Pop
    "ignore_consistency",
410 76aef8fc Michael Hanselmann
    ]
411 76aef8fc Michael Hanselmann
412 76aef8fc Michael Hanselmann
413 b31c8676 Iustin Pop
class OpSetNodeParams(OpCode):
414 b31c8676 Iustin Pop
  """Change the parameters of a node."""
415 b31c8676 Iustin Pop
  OP_ID = "OP_NODE_SET_PARAMS"
416 b31c8676 Iustin Pop
  OP_DSC_FIELD = "node_name"
417 154b9580 Balazs Lecz
  __slots__ = [
418 b31c8676 Iustin Pop
    "node_name",
419 b31c8676 Iustin Pop
    "force",
420 b31c8676 Iustin Pop
    "master_candidate",
421 3a5ba66a Iustin Pop
    "offline",
422 c9d443ea Iustin Pop
    "drained",
423 601908d0 Iustin Pop
    "auto_promote",
424 b31c8676 Iustin Pop
    ]
425 b31c8676 Iustin Pop
426 f5118ade Iustin Pop
427 f5118ade Iustin Pop
class OpPowercycleNode(OpCode):
428 f5118ade Iustin Pop
  """Tries to powercycle a node."""
429 f5118ade Iustin Pop
  OP_ID = "OP_NODE_POWERCYCLE"
430 f5118ade Iustin Pop
  OP_DSC_FIELD = "node_name"
431 154b9580 Balazs Lecz
  __slots__ = [
432 f5118ade Iustin Pop
    "node_name",
433 f5118ade Iustin Pop
    "force",
434 f5118ade Iustin Pop
    ]
435 f5118ade Iustin Pop
436 7ffc5a86 Michael Hanselmann
437 80cb875c Michael Hanselmann
class OpMigrateNode(OpCode):
438 80cb875c Michael Hanselmann
  """Migrate all instances from a node."""
439 80cb875c Michael Hanselmann
  OP_ID = "OP_NODE_MIGRATE"
440 80cb875c Michael Hanselmann
  OP_DSC_FIELD = "node_name"
441 154b9580 Balazs Lecz
  __slots__ = [
442 80cb875c Michael Hanselmann
    "node_name",
443 80cb875c Michael Hanselmann
    "live",
444 80cb875c Michael Hanselmann
    ]
445 80cb875c Michael Hanselmann
446 80cb875c Michael Hanselmann
447 d6aaa598 Iustin Pop
class OpNodeEvacuationStrategy(OpCode):
448 d6aaa598 Iustin Pop
  """Compute the evacuation strategy for a list of nodes."""
449 d6aaa598 Iustin Pop
  OP_ID = "OP_NODE_EVAC_STRATEGY"
450 d6aaa598 Iustin Pop
  OP_DSC_FIELD = "nodes"
451 d6aaa598 Iustin Pop
  __slots__ = ["nodes", "iallocator", "remote_node"]
452 d6aaa598 Iustin Pop
453 d6aaa598 Iustin Pop
454 a8083063 Iustin Pop
# instance opcodes
455 a8083063 Iustin Pop
456 a8083063 Iustin Pop
class OpCreateInstance(OpCode):
457 9bf56d77 Michael Hanselmann
  """Create an instance.
458 9bf56d77 Michael Hanselmann

459 9bf56d77 Michael Hanselmann
  @ivar instance_name: Instance name
460 9bf56d77 Michael Hanselmann
  @ivar mode: Instance creation mode (one of L{constants.INSTANCE_CREATE_MODES})
461 9bf56d77 Michael Hanselmann
  @ivar source_handshake: Signed handshake from source (remote import only)
462 9bf56d77 Michael Hanselmann
  @ivar source_x509_ca: Source X509 CA in PEM format (remote import only)
463 9bf56d77 Michael Hanselmann
  @ivar source_instance_name: Previous name of instance (remote import only)
464 9bf56d77 Michael Hanselmann

465 9bf56d77 Michael Hanselmann
  """
466 a8083063 Iustin Pop
  OP_ID = "OP_INSTANCE_CREATE"
467 60dd1473 Iustin Pop
  OP_DSC_FIELD = "instance_name"
468 154b9580 Balazs Lecz
  __slots__ = [
469 25a8792c Iustin Pop
    "instance_name",
470 25a8792c Iustin Pop
    "os_type", "force_variant", "no_install",
471 47804ec9 Guido Trotter
    "pnode", "disk_template", "snode", "mode",
472 08db7c5c Iustin Pop
    "disks", "nics",
473 e588764d Iustin Pop
    "src_node", "src_path", "start", "identify_defaults",
474 5f23e043 Iustin Pop
    "wait_for_sync", "ip_check", "name_check",
475 dc936b49 Manuel Franceschini
    "file_storage_dir", "file_driver",
476 6785674e Iustin Pop
    "iallocator",
477 062a7100 Iustin Pop
    "hypervisor", "hvparams", "beparams", "osparams",
478 9bf56d77 Michael Hanselmann
    "source_handshake",
479 9bf56d77 Michael Hanselmann
    "source_x509_ca",
480 9bf56d77 Michael Hanselmann
    "source_instance_name",
481 4f05fd3b Iustin Pop
    "dry_run",
482 3b6d8c9b Iustin Pop
    ]
483 a8083063 Iustin Pop
484 a8083063 Iustin Pop
485 fe7b0351 Michael Hanselmann
class OpReinstallInstance(OpCode):
486 fdc267f4 Iustin Pop
  """Reinstall an instance's OS."""
487 fe7b0351 Michael Hanselmann
  OP_ID = "OP_INSTANCE_REINSTALL"
488 60dd1473 Iustin Pop
  OP_DSC_FIELD = "instance_name"
489 154b9580 Balazs Lecz
  __slots__ = ["instance_name", "os_type", "force_variant"]
490 fe7b0351 Michael Hanselmann
491 fe7b0351 Michael Hanselmann
492 a8083063 Iustin Pop
class OpRemoveInstance(OpCode):
493 a8083063 Iustin Pop
  """Remove an instance."""
494 a8083063 Iustin Pop
  OP_ID = "OP_INSTANCE_REMOVE"
495 60dd1473 Iustin Pop
  OP_DSC_FIELD = "instance_name"
496 154b9580 Balazs Lecz
  __slots__ = [
497 fc1baca9 Michael Hanselmann
    "instance_name",
498 fc1baca9 Michael Hanselmann
    "ignore_failures",
499 fc1baca9 Michael Hanselmann
    "shutdown_timeout",
500 fc1baca9 Michael Hanselmann
    ]
501 a8083063 Iustin Pop
502 a8083063 Iustin Pop
503 decd5f45 Iustin Pop
class OpRenameInstance(OpCode):
504 decd5f45 Iustin Pop
  """Rename an instance."""
505 decd5f45 Iustin Pop
  OP_ID = "OP_INSTANCE_RENAME"
506 154b9580 Balazs Lecz
  __slots__ = [
507 9c5885e2 René Nussbaumer
    "instance_name", "ignore_ip", "new_name", "check_name",
508 4f05fd3b Iustin Pop
    ]
509 decd5f45 Iustin Pop
510 decd5f45 Iustin Pop
511 a8083063 Iustin Pop
class OpStartupInstance(OpCode):
512 fdc267f4 Iustin Pop
  """Startup an instance."""
513 a8083063 Iustin Pop
  OP_ID = "OP_INSTANCE_STARTUP"
514 60dd1473 Iustin Pop
  OP_DSC_FIELD = "instance_name"
515 154b9580 Balazs Lecz
  __slots__ = [
516 4f05fd3b Iustin Pop
    "instance_name", "force", "hvparams", "beparams",
517 4f05fd3b Iustin Pop
    ]
518 a8083063 Iustin Pop
519 a8083063 Iustin Pop
520 a8083063 Iustin Pop
class OpShutdownInstance(OpCode):
521 fdc267f4 Iustin Pop
  """Shutdown an instance."""
522 a8083063 Iustin Pop
  OP_ID = "OP_INSTANCE_SHUTDOWN"
523 60dd1473 Iustin Pop
  OP_DSC_FIELD = "instance_name"
524 154b9580 Balazs Lecz
  __slots__ = ["instance_name", "timeout"]
525 a8083063 Iustin Pop
526 a8083063 Iustin Pop
527 bf6929a2 Alexander Schreiber
class OpRebootInstance(OpCode):
528 bf6929a2 Alexander Schreiber
  """Reboot an instance."""
529 eeb3a5f9 Iustin Pop
  OP_ID = "OP_INSTANCE_REBOOT"
530 60dd1473 Iustin Pop
  OP_DSC_FIELD = "instance_name"
531 154b9580 Balazs Lecz
  __slots__ = [
532 17c3f802 Guido Trotter
    "instance_name", "reboot_type", "ignore_secondaries", "shutdown_timeout",
533 4f05fd3b Iustin Pop
    ]
534 bf6929a2 Alexander Schreiber
535 bf6929a2 Alexander Schreiber
536 a8083063 Iustin Pop
class OpReplaceDisks(OpCode):
537 fdc267f4 Iustin Pop
  """Replace the disks of an instance."""
538 a8083063 Iustin Pop
  OP_ID = "OP_INSTANCE_REPLACE_DISKS"
539 60dd1473 Iustin Pop
  OP_DSC_FIELD = "instance_name"
540 154b9580 Balazs Lecz
  __slots__ = [
541 4f05fd3b Iustin Pop
    "instance_name", "remote_node", "mode", "disks", "iallocator",
542 7ea7bcf6 Iustin Pop
    "early_release",
543 4f05fd3b Iustin Pop
    ]
544 a8083063 Iustin Pop
545 a8083063 Iustin Pop
546 a8083063 Iustin Pop
class OpFailoverInstance(OpCode):
547 a8083063 Iustin Pop
  """Failover an instance."""
548 a8083063 Iustin Pop
  OP_ID = "OP_INSTANCE_FAILOVER"
549 60dd1473 Iustin Pop
  OP_DSC_FIELD = "instance_name"
550 154b9580 Balazs Lecz
  __slots__ = [
551 17c3f802 Guido Trotter
    "instance_name", "ignore_consistency", "shutdown_timeout",
552 17c3f802 Guido Trotter
    ]
553 a8083063 Iustin Pop
554 a8083063 Iustin Pop
555 53c776b5 Iustin Pop
class OpMigrateInstance(OpCode):
556 53c776b5 Iustin Pop
  """Migrate an instance.
557 53c776b5 Iustin Pop

558 53c776b5 Iustin Pop
  This migrates (without shutting down an instance) to its secondary
559 53c776b5 Iustin Pop
  node.
560 53c776b5 Iustin Pop

561 2f907a8c Iustin Pop
  @ivar instance_name: the name of the instance
562 53c776b5 Iustin Pop

563 53c776b5 Iustin Pop
  """
564 53c776b5 Iustin Pop
  OP_ID = "OP_INSTANCE_MIGRATE"
565 ee69c97f Iustin Pop
  OP_DSC_FIELD = "instance_name"
566 154b9580 Balazs Lecz
  __slots__ = ["instance_name", "live", "cleanup"]
567 53c776b5 Iustin Pop
568 53c776b5 Iustin Pop
569 313bcead Iustin Pop
class OpMoveInstance(OpCode):
570 313bcead Iustin Pop
  """Move an instance.
571 313bcead Iustin Pop

572 313bcead Iustin Pop
  This move (with shutting down an instance and data copying) to an
573 313bcead Iustin Pop
  arbitrary node.
574 313bcead Iustin Pop

575 313bcead Iustin Pop
  @ivar instance_name: the name of the instance
576 313bcead Iustin Pop
  @ivar target_node: the destination node
577 313bcead Iustin Pop

578 313bcead Iustin Pop
  """
579 313bcead Iustin Pop
  OP_ID = "OP_INSTANCE_MOVE"
580 313bcead Iustin Pop
  OP_DSC_FIELD = "instance_name"
581 154b9580 Balazs Lecz
  __slots__ = [
582 17c3f802 Guido Trotter
    "instance_name", "target_node", "shutdown_timeout",
583 154b9580 Balazs Lecz
    ]
584 313bcead Iustin Pop
585 313bcead Iustin Pop
586 a8083063 Iustin Pop
class OpConnectConsole(OpCode):
587 fdc267f4 Iustin Pop
  """Connect to an instance's console."""
588 a8083063 Iustin Pop
  OP_ID = "OP_INSTANCE_CONSOLE"
589 60dd1473 Iustin Pop
  OP_DSC_FIELD = "instance_name"
590 154b9580 Balazs Lecz
  __slots__ = ["instance_name"]
591 a8083063 Iustin Pop
592 a8083063 Iustin Pop
593 a8083063 Iustin Pop
class OpActivateInstanceDisks(OpCode):
594 fdc267f4 Iustin Pop
  """Activate an instance's disks."""
595 a8083063 Iustin Pop
  OP_ID = "OP_INSTANCE_ACTIVATE_DISKS"
596 60dd1473 Iustin Pop
  OP_DSC_FIELD = "instance_name"
597 154b9580 Balazs Lecz
  __slots__ = ["instance_name", "ignore_size"]
598 a8083063 Iustin Pop
599 a8083063 Iustin Pop
600 a8083063 Iustin Pop
class OpDeactivateInstanceDisks(OpCode):
601 fdc267f4 Iustin Pop
  """Deactivate an instance's disks."""
602 a8083063 Iustin Pop
  OP_ID = "OP_INSTANCE_DEACTIVATE_DISKS"
603 60dd1473 Iustin Pop
  OP_DSC_FIELD = "instance_name"
604 154b9580 Balazs Lecz
  __slots__ = ["instance_name"]
605 a8083063 Iustin Pop
606 a8083063 Iustin Pop
607 bd315bfa Iustin Pop
class OpRecreateInstanceDisks(OpCode):
608 bd315bfa Iustin Pop
  """Deactivate an instance's disks."""
609 bd315bfa Iustin Pop
  OP_ID = "OP_INSTANCE_RECREATE_DISKS"
610 bd315bfa Iustin Pop
  OP_DSC_FIELD = "instance_name"
611 154b9580 Balazs Lecz
  __slots__ = ["instance_name", "disks"]
612 bd315bfa Iustin Pop
613 bd315bfa Iustin Pop
614 a8083063 Iustin Pop
class OpQueryInstances(OpCode):
615 a8083063 Iustin Pop
  """Compute the list of instances."""
616 a8083063 Iustin Pop
  OP_ID = "OP_INSTANCE_QUERY"
617 154b9580 Balazs Lecz
  __slots__ = ["output_fields", "names", "use_locking"]
618 a8083063 Iustin Pop
619 a8083063 Iustin Pop
620 a8083063 Iustin Pop
class OpQueryInstanceData(OpCode):
621 a8083063 Iustin Pop
  """Compute the run-time status of instances."""
622 a8083063 Iustin Pop
  OP_ID = "OP_INSTANCE_QUERY_DATA"
623 154b9580 Balazs Lecz
  __slots__ = ["instances", "static"]
624 a8083063 Iustin Pop
625 a8083063 Iustin Pop
626 7767bbf5 Manuel Franceschini
class OpSetInstanceParams(OpCode):
627 a8083063 Iustin Pop
  """Change the parameters of an instance."""
628 7767bbf5 Manuel Franceschini
  OP_ID = "OP_INSTANCE_SET_PARAMS"
629 60dd1473 Iustin Pop
  OP_DSC_FIELD = "instance_name"
630 154b9580 Balazs Lecz
  __slots__ = [
631 24991749 Iustin Pop
    "instance_name",
632 1052d622 Iustin Pop
    "hvparams", "beparams", "osparams", "force",
633 e29e9550 Iustin Pop
    "nics", "disks", "disk_template",
634 96b39bcc Iustin Pop
    "remote_node", "os_name", "force_variant",
635 973d7867 Iustin Pop
    ]
636 a8083063 Iustin Pop
637 a8083063 Iustin Pop
638 8729e0d7 Iustin Pop
class OpGrowDisk(OpCode):
639 8729e0d7 Iustin Pop
  """Grow a disk of an instance."""
640 8729e0d7 Iustin Pop
  OP_ID = "OP_INSTANCE_GROW_DISK"
641 60dd1473 Iustin Pop
  OP_DSC_FIELD = "instance_name"
642 154b9580 Balazs Lecz
  __slots__ = [
643 4f05fd3b Iustin Pop
    "instance_name", "disk", "amount", "wait_for_sync",
644 4f05fd3b Iustin Pop
    ]
645 8729e0d7 Iustin Pop
646 8729e0d7 Iustin Pop
647 a8083063 Iustin Pop
# OS opcodes
648 a8083063 Iustin Pop
class OpDiagnoseOS(OpCode):
649 a8083063 Iustin Pop
  """Compute the list of guest operating systems."""
650 a8083063 Iustin Pop
  OP_ID = "OP_OS_DIAGNOSE"
651 154b9580 Balazs Lecz
  __slots__ = ["output_fields", "names"]
652 a8083063 Iustin Pop
653 7c0d6283 Michael Hanselmann
654 a8083063 Iustin Pop
# Exports opcodes
655 a8083063 Iustin Pop
class OpQueryExports(OpCode):
656 a8083063 Iustin Pop
  """Compute the list of exported images."""
657 a8083063 Iustin Pop
  OP_ID = "OP_BACKUP_QUERY"
658 154b9580 Balazs Lecz
  __slots__ = ["nodes", "use_locking"]
659 a8083063 Iustin Pop
660 7c0d6283 Michael Hanselmann
661 1410fa8d Michael Hanselmann
class OpPrepareExport(OpCode):
662 1410fa8d Michael Hanselmann
  """Prepares an instance export.
663 1410fa8d Michael Hanselmann

664 1410fa8d Michael Hanselmann
  @ivar instance_name: Instance name
665 1410fa8d Michael Hanselmann
  @ivar mode: Export mode (one of L{constants.EXPORT_MODES})
666 1410fa8d Michael Hanselmann

667 1410fa8d Michael Hanselmann
  """
668 1410fa8d Michael Hanselmann
  OP_ID = "OP_BACKUP_PREPARE"
669 1410fa8d Michael Hanselmann
  OP_DSC_FIELD = "instance_name"
670 1410fa8d Michael Hanselmann
  __slots__ = [
671 1410fa8d Michael Hanselmann
    "instance_name", "mode",
672 1410fa8d Michael Hanselmann
    ]
673 1410fa8d Michael Hanselmann
674 1410fa8d Michael Hanselmann
675 a8083063 Iustin Pop
class OpExportInstance(OpCode):
676 4a96f1d1 Michael Hanselmann
  """Export an instance.
677 4a96f1d1 Michael Hanselmann

678 4a96f1d1 Michael Hanselmann
  For local exports, the export destination is the node name. For remote
679 4a96f1d1 Michael Hanselmann
  exports, the export destination is a list of tuples, each consisting of
680 4a96f1d1 Michael Hanselmann
  hostname/IP address, port, HMAC and HMAC salt. The HMAC is calculated using
681 4a96f1d1 Michael Hanselmann
  the cluster domain secret over the value "${index}:${hostname}:${port}". The
682 4a96f1d1 Michael Hanselmann
  destination X509 CA must be a signed certificate.
683 4a96f1d1 Michael Hanselmann

684 4a96f1d1 Michael Hanselmann
  @ivar mode: Export mode (one of L{constants.EXPORT_MODES})
685 4a96f1d1 Michael Hanselmann
  @ivar target_node: Export destination
686 4a96f1d1 Michael Hanselmann
  @ivar x509_key_name: X509 key to use (remote export only)
687 4a96f1d1 Michael Hanselmann
  @ivar destination_x509_ca: Destination X509 CA in PEM format (remote export
688 4a96f1d1 Michael Hanselmann
                             only)
689 4a96f1d1 Michael Hanselmann

690 4a96f1d1 Michael Hanselmann
  """
691 a8083063 Iustin Pop
  OP_ID = "OP_BACKUP_EXPORT"
692 60dd1473 Iustin Pop
  OP_DSC_FIELD = "instance_name"
693 154b9580 Balazs Lecz
  __slots__ = [
694 4a96f1d1 Michael Hanselmann
    # TODO: Rename target_node as it changes meaning for different export modes
695 4a96f1d1 Michael Hanselmann
    # (e.g. "destination")
696 17c3f802 Guido Trotter
    "instance_name", "target_node", "shutdown", "shutdown_timeout",
697 faba00cb Michael Hanselmann
    "remove_instance",
698 faba00cb Michael Hanselmann
    "ignore_remove_failures",
699 4a96f1d1 Michael Hanselmann
    "mode",
700 4a96f1d1 Michael Hanselmann
    "x509_key_name",
701 4a96f1d1 Michael Hanselmann
    "destination_x509_ca",
702 17c3f802 Guido Trotter
    ]
703 5c947f38 Iustin Pop
704 0a7bed64 Michael Hanselmann
705 9ac99fda Guido Trotter
class OpRemoveExport(OpCode):
706 9ac99fda Guido Trotter
  """Remove an instance's export."""
707 9ac99fda Guido Trotter
  OP_ID = "OP_BACKUP_REMOVE"
708 60dd1473 Iustin Pop
  OP_DSC_FIELD = "instance_name"
709 154b9580 Balazs Lecz
  __slots__ = ["instance_name"]
710 5c947f38 Iustin Pop
711 0a7bed64 Michael Hanselmann
712 5c947f38 Iustin Pop
# Tags opcodes
713 5c947f38 Iustin Pop
class OpGetTags(OpCode):
714 5c947f38 Iustin Pop
  """Returns the tags of the given object."""
715 5c947f38 Iustin Pop
  OP_ID = "OP_TAGS_GET"
716 60dd1473 Iustin Pop
  OP_DSC_FIELD = "name"
717 154b9580 Balazs Lecz
  __slots__ = ["kind", "name"]
718 5c947f38 Iustin Pop
719 5c947f38 Iustin Pop
720 73415719 Iustin Pop
class OpSearchTags(OpCode):
721 73415719 Iustin Pop
  """Searches the tags in the cluster for a given pattern."""
722 73415719 Iustin Pop
  OP_ID = "OP_TAGS_SEARCH"
723 60dd1473 Iustin Pop
  OP_DSC_FIELD = "pattern"
724 154b9580 Balazs Lecz
  __slots__ = ["pattern"]
725 73415719 Iustin Pop
726 73415719 Iustin Pop
727 f27302fa Iustin Pop
class OpAddTags(OpCode):
728 f27302fa Iustin Pop
  """Add a list of tags on a given object."""
729 5c947f38 Iustin Pop
  OP_ID = "OP_TAGS_SET"
730 154b9580 Balazs Lecz
  __slots__ = ["kind", "name", "tags"]
731 5c947f38 Iustin Pop
732 5c947f38 Iustin Pop
733 f27302fa Iustin Pop
class OpDelTags(OpCode):
734 f27302fa Iustin Pop
  """Remove a list of tags from a given object."""
735 5c947f38 Iustin Pop
  OP_ID = "OP_TAGS_DEL"
736 154b9580 Balazs Lecz
  __slots__ = ["kind", "name", "tags"]
737 06009e27 Iustin Pop
738 06009e27 Iustin Pop
739 06009e27 Iustin Pop
# Test opcodes
740 06009e27 Iustin Pop
class OpTestDelay(OpCode):
741 06009e27 Iustin Pop
  """Sleeps for a configured amount of time.
742 06009e27 Iustin Pop

743 06009e27 Iustin Pop
  This is used just for debugging and testing.
744 06009e27 Iustin Pop

745 06009e27 Iustin Pop
  Parameters:
746 06009e27 Iustin Pop
    - duration: the time to sleep
747 06009e27 Iustin Pop
    - on_master: if true, sleep on the master
748 06009e27 Iustin Pop
    - on_nodes: list of nodes in which to sleep
749 06009e27 Iustin Pop

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

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

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

760 06009e27 Iustin Pop
  """
761 06009e27 Iustin Pop
  OP_ID = "OP_TEST_DELAY"
762 60dd1473 Iustin Pop
  OP_DSC_FIELD = "duration"
763 85a87e21 Guido Trotter
  __slots__ = ["duration", "on_master", "on_nodes", "repeat"]
764 d61df03e Iustin Pop
765 d61df03e Iustin Pop
766 d61df03e Iustin Pop
class OpTestAllocator(OpCode):
767 d61df03e Iustin Pop
  """Allocator framework testing.
768 d61df03e Iustin Pop

769 d61df03e Iustin Pop
  This opcode has two modes:
770 d61df03e Iustin Pop
    - gather and return allocator input for a given mode (allocate new
771 d61df03e Iustin Pop
      or replace secondary) and a given instance definition (direction
772 d61df03e Iustin Pop
      'in')
773 d61df03e Iustin Pop
    - run a selected allocator for a given operation (as above) and
774 d61df03e Iustin Pop
      return the allocator output (direction 'out')
775 d61df03e Iustin Pop

776 d61df03e Iustin Pop
  """
777 d61df03e Iustin Pop
  OP_ID = "OP_TEST_ALLOCATOR"
778 60dd1473 Iustin Pop
  OP_DSC_FIELD = "allocator"
779 154b9580 Balazs Lecz
  __slots__ = [
780 d61df03e Iustin Pop
    "direction", "mode", "allocator", "name",
781 d61df03e Iustin Pop
    "mem_size", "disks", "disk_template",
782 8cc7e742 Guido Trotter
    "os", "tags", "nics", "vcpus", "hypervisor",
783 823a72bc Iustin Pop
    "evac_nodes",
784 d61df03e Iustin Pop
    ]
785 363acb1e Iustin Pop
786 76aef8fc Michael Hanselmann
787 e58f87a9 Michael Hanselmann
class OpTestJobqueue(OpCode):
788 e58f87a9 Michael Hanselmann
  """Utility opcode to test some aspects of the job queue.
789 e58f87a9 Michael Hanselmann

790 e58f87a9 Michael Hanselmann
  """
791 e58f87a9 Michael Hanselmann
  OP_ID = "OP_TEST_JQUEUE"
792 e58f87a9 Michael Hanselmann
  __slots__ = [
793 e58f87a9 Michael Hanselmann
    "notify_waitlock",
794 e58f87a9 Michael Hanselmann
    "notify_exec",
795 e58f87a9 Michael Hanselmann
    "log_messages",
796 e58f87a9 Michael Hanselmann
    "fail",
797 e58f87a9 Michael Hanselmann
    ]
798 e58f87a9 Michael Hanselmann
799 e58f87a9 Michael Hanselmann
800 363acb1e Iustin Pop
OP_MAPPING = dict([(v.OP_ID, v) for v in globals().values()
801 363acb1e Iustin Pop
                   if (isinstance(v, type) and issubclass(v, OpCode) and
802 363acb1e Iustin Pop
                       hasattr(v, "OP_ID"))])