Statistics
| Branch: | Tag: | Revision:

root / lib / opcodes.py @ 8f5c488d

History | View | Annotate | Download (21 kB)

1 2f31098c Iustin Pop
#
2 a8083063 Iustin Pop
#
3 a8083063 Iustin Pop
4 8c35561f Iustin Pop
# Copyright (C) 2006, 2007, 2008, 2009, 2010 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 8f5c488d Michael Hanselmann
  @ivar priority: Opcode priority for queue
121 a7399f66 Iustin Pop

122 a7399f66 Iustin Pop
  """
123 df458e0b Iustin Pop
  OP_ID = "OP_ABSTRACT"
124 8f5c488d Michael Hanselmann
  __slots__ = ["dry_run", "debug_level", "priority"]
125 df458e0b Iustin Pop
126 df458e0b Iustin Pop
  def __getstate__(self):
127 df458e0b Iustin Pop
    """Specialized getstate for opcodes.
128 df458e0b Iustin Pop

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

563 2f907a8c Iustin Pop
  @ivar instance_name: the name of the instance
564 8c35561f Iustin Pop
  @ivar mode: the migration mode (live, non-live or None for auto)
565 53c776b5 Iustin Pop

566 53c776b5 Iustin Pop
  """
567 53c776b5 Iustin Pop
  OP_ID = "OP_INSTANCE_MIGRATE"
568 ee69c97f Iustin Pop
  OP_DSC_FIELD = "instance_name"
569 46d2d8a2 Iustin Pop
  __slots__ = ["instance_name", "mode", "cleanup", "live"]
570 53c776b5 Iustin Pop
571 53c776b5 Iustin Pop
572 313bcead Iustin Pop
class OpMoveInstance(OpCode):
573 313bcead Iustin Pop
  """Move an instance.
574 313bcead Iustin Pop

575 313bcead Iustin Pop
  This move (with shutting down an instance and data copying) to an
576 313bcead Iustin Pop
  arbitrary node.
577 313bcead Iustin Pop

578 313bcead Iustin Pop
  @ivar instance_name: the name of the instance
579 313bcead Iustin Pop
  @ivar target_node: the destination node
580 313bcead Iustin Pop

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

667 1410fa8d Michael Hanselmann
  @ivar instance_name: Instance name
668 1410fa8d Michael Hanselmann
  @ivar mode: Export mode (one of L{constants.EXPORT_MODES})
669 1410fa8d Michael Hanselmann

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

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

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

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

746 06009e27 Iustin Pop
  This is used just for debugging and testing.
747 06009e27 Iustin Pop

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

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

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

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

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

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

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

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