Statistics
| Branch: | Tag: | Revision:

root / lib / opcodes.py @ 4f05fd3b

History | View | Annotate | Download (16.5 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 a7399f66 Iustin Pop
               childre of this class.
107 a7399f66 Iustin Pop

108 a7399f66 Iustin Pop
  """
109 df458e0b Iustin Pop
  OP_ID = "OP_ABSTRACT"
110 4f05fd3b Iustin Pop
  __slots__ = BaseOpCode.__slots__ + []
111 df458e0b Iustin Pop
112 df458e0b Iustin Pop
  def __getstate__(self):
113 df458e0b Iustin Pop
    """Specialized getstate for opcodes.
114 df458e0b Iustin Pop

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

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

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

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

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

138 df458e0b Iustin Pop
    """
139 df458e0b Iustin Pop
    if not isinstance(data, dict):
140 df458e0b Iustin Pop
      raise ValueError("Invalid data to LoadOpCode (%s)" % type(data))
141 df458e0b Iustin Pop
    if "OP_ID" not in data:
142 df458e0b Iustin Pop
      raise ValueError("Invalid data to LoadOpcode, missing OP_ID")
143 df458e0b Iustin Pop
    op_id = data["OP_ID"]
144 df458e0b Iustin Pop
    op_class = None
145 df458e0b Iustin Pop
    for item in globals().values():
146 df458e0b Iustin Pop
      if (isinstance(item, type) and
147 df458e0b Iustin Pop
          issubclass(item, cls) and
148 df458e0b Iustin Pop
          hasattr(item, "OP_ID") and
149 df458e0b Iustin Pop
          getattr(item, "OP_ID") == op_id):
150 df458e0b Iustin Pop
        op_class = item
151 df458e0b Iustin Pop
        break
152 df458e0b Iustin Pop
    if op_class is None:
153 df458e0b Iustin Pop
      raise ValueError("Invalid data to LoadOpCode: OP_ID %s unsupported" %
154 df458e0b Iustin Pop
                       op_id)
155 df458e0b Iustin Pop
    op = op_class()
156 df458e0b Iustin Pop
    new_data = data.copy()
157 df458e0b Iustin Pop
    del new_data["OP_ID"]
158 df458e0b Iustin Pop
    op.__setstate__(new_data)
159 df458e0b Iustin Pop
    return op
160 df458e0b Iustin Pop
161 60dd1473 Iustin Pop
  def Summary(self):
162 60dd1473 Iustin Pop
    """Generates a summary description of this opcode.
163 60dd1473 Iustin Pop

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

179 a7399f66 Iustin Pop
  This opcode has no other parameters. All the state is irreversibly
180 a7399f66 Iustin Pop
  lost after the execution of this opcode.
181 a7399f66 Iustin Pop

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

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

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

210 150e978f Iustin Pop
  Parameters: none
211 150e978f Iustin Pop

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

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

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

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

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

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

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

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

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

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

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

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

314 a7399f66 Iustin Pop
  """
315 a8083063 Iustin Pop
  OP_ID = "OP_NODE_ADD"
316 60dd1473 Iustin Pop
  OP_DSC_FIELD = "node_name"
317 4f05fd3b Iustin Pop
  __slots__ = OpCode.__slots__ + [
318 4f05fd3b Iustin Pop
    "node_name", "primary_ip", "secondary_ip", "readd",
319 4f05fd3b Iustin Pop
    ]
320 a8083063 Iustin Pop
321 a8083063 Iustin Pop
322 a8083063 Iustin Pop
class OpQueryNodes(OpCode):
323 a8083063 Iustin Pop
  """Compute the list of nodes."""
324 a8083063 Iustin Pop
  OP_ID = "OP_NODE_QUERY"
325 4f05fd3b Iustin Pop
  __slots__ = OpCode.__slots__ + ["output_fields", "names", "use_locking"]
326 a8083063 Iustin Pop
327 a8083063 Iustin Pop
328 dcb93971 Michael Hanselmann
class OpQueryNodeVolumes(OpCode):
329 dcb93971 Michael Hanselmann
  """Get list of volumes on node."""
330 dcb93971 Michael Hanselmann
  OP_ID = "OP_NODE_QUERYVOLS"
331 4f05fd3b Iustin Pop
  __slots__ = OpCode.__slots__ + ["nodes", "output_fields"]
332 dcb93971 Michael Hanselmann
333 dcb93971 Michael Hanselmann
334 b31c8676 Iustin Pop
class OpSetNodeParams(OpCode):
335 b31c8676 Iustin Pop
  """Change the parameters of a node."""
336 b31c8676 Iustin Pop
  OP_ID = "OP_NODE_SET_PARAMS"
337 b31c8676 Iustin Pop
  OP_DSC_FIELD = "node_name"
338 4f05fd3b Iustin Pop
  __slots__ = OpCode.__slots__ + [
339 b31c8676 Iustin Pop
    "node_name",
340 b31c8676 Iustin Pop
    "force",
341 b31c8676 Iustin Pop
    "master_candidate",
342 3a5ba66a Iustin Pop
    "offline",
343 c9d443ea Iustin Pop
    "drained",
344 b31c8676 Iustin Pop
    ]
345 b31c8676 Iustin Pop
346 f5118ade Iustin Pop
347 f5118ade Iustin Pop
class OpPowercycleNode(OpCode):
348 f5118ade Iustin Pop
  """Tries to powercycle a node."""
349 f5118ade Iustin Pop
  OP_ID = "OP_NODE_POWERCYCLE"
350 f5118ade Iustin Pop
  OP_DSC_FIELD = "node_name"
351 4f05fd3b Iustin Pop
  __slots__ = OpCode.__slots__ + [
352 f5118ade Iustin Pop
    "node_name",
353 f5118ade Iustin Pop
    "force",
354 f5118ade Iustin Pop
    ]
355 f5118ade Iustin Pop
356 a8083063 Iustin Pop
# instance opcodes
357 a8083063 Iustin Pop
358 a8083063 Iustin Pop
class OpCreateInstance(OpCode):
359 fdc267f4 Iustin Pop
  """Create an instance."""
360 a8083063 Iustin Pop
  OP_ID = "OP_INSTANCE_CREATE"
361 60dd1473 Iustin Pop
  OP_DSC_FIELD = "instance_name"
362 4f05fd3b Iustin Pop
  __slots__ = OpCode.__slots__ + [
363 08db7c5c Iustin Pop
    "instance_name", "os_type", "pnode",
364 08db7c5c Iustin Pop
    "disk_template", "snode", "mode",
365 08db7c5c Iustin Pop
    "disks", "nics",
366 08db7c5c Iustin Pop
    "src_node", "src_path", "start",
367 08db7c5c Iustin Pop
    "wait_for_sync", "ip_check",
368 dc936b49 Manuel Franceschini
    "file_storage_dir", "file_driver",
369 6785674e Iustin Pop
    "iallocator",
370 6785674e Iustin Pop
    "hypervisor", "hvparams", "beparams",
371 4f05fd3b Iustin Pop
    "dry_run",
372 3b6d8c9b Iustin Pop
    ]
373 a8083063 Iustin Pop
374 a8083063 Iustin Pop
375 fe7b0351 Michael Hanselmann
class OpReinstallInstance(OpCode):
376 fdc267f4 Iustin Pop
  """Reinstall an instance's OS."""
377 fe7b0351 Michael Hanselmann
  OP_ID = "OP_INSTANCE_REINSTALL"
378 60dd1473 Iustin Pop
  OP_DSC_FIELD = "instance_name"
379 4f05fd3b Iustin Pop
  __slots__ = OpCode.__slots__ + ["instance_name", "os_type"]
380 fe7b0351 Michael Hanselmann
381 fe7b0351 Michael Hanselmann
382 a8083063 Iustin Pop
class OpRemoveInstance(OpCode):
383 a8083063 Iustin Pop
  """Remove an instance."""
384 a8083063 Iustin Pop
  OP_ID = "OP_INSTANCE_REMOVE"
385 60dd1473 Iustin Pop
  OP_DSC_FIELD = "instance_name"
386 4f05fd3b Iustin Pop
  __slots__ = OpCode.__slots__ + ["instance_name", "ignore_failures"]
387 a8083063 Iustin Pop
388 a8083063 Iustin Pop
389 decd5f45 Iustin Pop
class OpRenameInstance(OpCode):
390 decd5f45 Iustin Pop
  """Rename an instance."""
391 decd5f45 Iustin Pop
  OP_ID = "OP_INSTANCE_RENAME"
392 4f05fd3b Iustin Pop
  __slots__ = OpCode.__slots__ + [
393 4f05fd3b Iustin Pop
    "instance_name", "ignore_ip", "new_name",
394 4f05fd3b Iustin Pop
    ]
395 decd5f45 Iustin Pop
396 decd5f45 Iustin Pop
397 a8083063 Iustin Pop
class OpStartupInstance(OpCode):
398 fdc267f4 Iustin Pop
  """Startup an instance."""
399 a8083063 Iustin Pop
  OP_ID = "OP_INSTANCE_STARTUP"
400 60dd1473 Iustin Pop
  OP_DSC_FIELD = "instance_name"
401 4f05fd3b Iustin Pop
  __slots__ = OpCode.__slots__ + [
402 4f05fd3b Iustin Pop
    "instance_name", "force", "hvparams", "beparams",
403 4f05fd3b Iustin Pop
    ]
404 a8083063 Iustin Pop
405 a8083063 Iustin Pop
406 a8083063 Iustin Pop
class OpShutdownInstance(OpCode):
407 fdc267f4 Iustin Pop
  """Shutdown an instance."""
408 a8083063 Iustin Pop
  OP_ID = "OP_INSTANCE_SHUTDOWN"
409 60dd1473 Iustin Pop
  OP_DSC_FIELD = "instance_name"
410 4f05fd3b Iustin Pop
  __slots__ = OpCode.__slots__ + ["instance_name"]
411 a8083063 Iustin Pop
412 a8083063 Iustin Pop
413 bf6929a2 Alexander Schreiber
class OpRebootInstance(OpCode):
414 bf6929a2 Alexander Schreiber
  """Reboot an instance."""
415 eeb3a5f9 Iustin Pop
  OP_ID = "OP_INSTANCE_REBOOT"
416 60dd1473 Iustin Pop
  OP_DSC_FIELD = "instance_name"
417 4f05fd3b Iustin Pop
  __slots__ = OpCode.__slots__ + [
418 4f05fd3b Iustin Pop
    "instance_name", "reboot_type", "ignore_secondaries",
419 4f05fd3b Iustin Pop
    ]
420 bf6929a2 Alexander Schreiber
421 bf6929a2 Alexander Schreiber
422 a8083063 Iustin Pop
class OpReplaceDisks(OpCode):
423 fdc267f4 Iustin Pop
  """Replace the disks of an instance."""
424 a8083063 Iustin Pop
  OP_ID = "OP_INSTANCE_REPLACE_DISKS"
425 60dd1473 Iustin Pop
  OP_DSC_FIELD = "instance_name"
426 4f05fd3b Iustin Pop
  __slots__ = OpCode.__slots__ + [
427 4f05fd3b Iustin Pop
    "instance_name", "remote_node", "mode", "disks", "iallocator",
428 4f05fd3b Iustin Pop
    ]
429 a8083063 Iustin Pop
430 a8083063 Iustin Pop
431 a8083063 Iustin Pop
class OpFailoverInstance(OpCode):
432 a8083063 Iustin Pop
  """Failover an instance."""
433 a8083063 Iustin Pop
  OP_ID = "OP_INSTANCE_FAILOVER"
434 60dd1473 Iustin Pop
  OP_DSC_FIELD = "instance_name"
435 4f05fd3b Iustin Pop
  __slots__ = OpCode.__slots__ + ["instance_name", "ignore_consistency"]
436 a8083063 Iustin Pop
437 a8083063 Iustin Pop
438 53c776b5 Iustin Pop
class OpMigrateInstance(OpCode):
439 53c776b5 Iustin Pop
  """Migrate an instance.
440 53c776b5 Iustin Pop

441 53c776b5 Iustin Pop
  This migrates (without shutting down an instance) to its secondary
442 53c776b5 Iustin Pop
  node.
443 53c776b5 Iustin Pop

444 2f907a8c Iustin Pop
  @ivar instance_name: the name of the instance
445 53c776b5 Iustin Pop

446 53c776b5 Iustin Pop
  """
447 53c776b5 Iustin Pop
  OP_ID = "OP_INSTANCE_MIGRATE"
448 ee69c97f Iustin Pop
  OP_DSC_FIELD = "instance_name"
449 4f05fd3b Iustin Pop
  __slots__ = OpCode.__slots__ + ["instance_name", "live", "cleanup"]
450 53c776b5 Iustin Pop
451 53c776b5 Iustin Pop
452 a8083063 Iustin Pop
class OpConnectConsole(OpCode):
453 fdc267f4 Iustin Pop
  """Connect to an instance's console."""
454 a8083063 Iustin Pop
  OP_ID = "OP_INSTANCE_CONSOLE"
455 60dd1473 Iustin Pop
  OP_DSC_FIELD = "instance_name"
456 4f05fd3b Iustin Pop
  __slots__ = OpCode.__slots__ + ["instance_name"]
457 a8083063 Iustin Pop
458 a8083063 Iustin Pop
459 a8083063 Iustin Pop
class OpActivateInstanceDisks(OpCode):
460 fdc267f4 Iustin Pop
  """Activate an instance's disks."""
461 a8083063 Iustin Pop
  OP_ID = "OP_INSTANCE_ACTIVATE_DISKS"
462 60dd1473 Iustin Pop
  OP_DSC_FIELD = "instance_name"
463 4f05fd3b Iustin Pop
  __slots__ = OpCode.__slots__ + ["instance_name"]
464 a8083063 Iustin Pop
465 a8083063 Iustin Pop
466 a8083063 Iustin Pop
class OpDeactivateInstanceDisks(OpCode):
467 fdc267f4 Iustin Pop
  """Deactivate an instance's disks."""
468 a8083063 Iustin Pop
  OP_ID = "OP_INSTANCE_DEACTIVATE_DISKS"
469 60dd1473 Iustin Pop
  OP_DSC_FIELD = "instance_name"
470 4f05fd3b Iustin Pop
  __slots__ = OpCode.__slots__ + ["instance_name"]
471 a8083063 Iustin Pop
472 a8083063 Iustin Pop
473 a8083063 Iustin Pop
class OpQueryInstances(OpCode):
474 a8083063 Iustin Pop
  """Compute the list of instances."""
475 a8083063 Iustin Pop
  OP_ID = "OP_INSTANCE_QUERY"
476 4f05fd3b Iustin Pop
  __slots__ = OpCode.__slots__ + ["output_fields", "names", "use_locking"]
477 a8083063 Iustin Pop
478 a8083063 Iustin Pop
479 a8083063 Iustin Pop
class OpQueryInstanceData(OpCode):
480 a8083063 Iustin Pop
  """Compute the run-time status of instances."""
481 a8083063 Iustin Pop
  OP_ID = "OP_INSTANCE_QUERY_DATA"
482 4f05fd3b Iustin Pop
  __slots__ = OpCode.__slots__ + ["instances", "static"]
483 a8083063 Iustin Pop
484 a8083063 Iustin Pop
485 7767bbf5 Manuel Franceschini
class OpSetInstanceParams(OpCode):
486 a8083063 Iustin Pop
  """Change the parameters of an instance."""
487 7767bbf5 Manuel Franceschini
  OP_ID = "OP_INSTANCE_SET_PARAMS"
488 60dd1473 Iustin Pop
  OP_DSC_FIELD = "instance_name"
489 4f05fd3b Iustin Pop
  __slots__ = OpCode.__slots__ + [
490 24991749 Iustin Pop
    "instance_name",
491 338e51e8 Iustin Pop
    "hvparams", "beparams", "force",
492 24991749 Iustin Pop
    "nics", "disks",
493 973d7867 Iustin Pop
    ]
494 a8083063 Iustin Pop
495 a8083063 Iustin Pop
496 8729e0d7 Iustin Pop
class OpGrowDisk(OpCode):
497 8729e0d7 Iustin Pop
  """Grow a disk of an instance."""
498 8729e0d7 Iustin Pop
  OP_ID = "OP_INSTANCE_GROW_DISK"
499 60dd1473 Iustin Pop
  OP_DSC_FIELD = "instance_name"
500 4f05fd3b Iustin Pop
  __slots__ = OpCode.__slots__ + [
501 4f05fd3b Iustin Pop
    "instance_name", "disk", "amount", "wait_for_sync",
502 4f05fd3b Iustin Pop
    ]
503 8729e0d7 Iustin Pop
504 8729e0d7 Iustin Pop
505 a8083063 Iustin Pop
# OS opcodes
506 a8083063 Iustin Pop
class OpDiagnoseOS(OpCode):
507 a8083063 Iustin Pop
  """Compute the list of guest operating systems."""
508 a8083063 Iustin Pop
  OP_ID = "OP_OS_DIAGNOSE"
509 4f05fd3b Iustin Pop
  __slots__ = OpCode.__slots__ + ["output_fields", "names"]
510 a8083063 Iustin Pop
511 7c0d6283 Michael Hanselmann
512 a8083063 Iustin Pop
# Exports opcodes
513 a8083063 Iustin Pop
class OpQueryExports(OpCode):
514 a8083063 Iustin Pop
  """Compute the list of exported images."""
515 a8083063 Iustin Pop
  OP_ID = "OP_BACKUP_QUERY"
516 4f05fd3b Iustin Pop
  __slots__ = OpCode.__slots__ + ["nodes", "use_locking"]
517 a8083063 Iustin Pop
518 7c0d6283 Michael Hanselmann
519 a8083063 Iustin Pop
class OpExportInstance(OpCode):
520 a8083063 Iustin Pop
  """Export an instance."""
521 a8083063 Iustin Pop
  OP_ID = "OP_BACKUP_EXPORT"
522 60dd1473 Iustin Pop
  OP_DSC_FIELD = "instance_name"
523 4f05fd3b Iustin Pop
  __slots__ = OpCode.__slots__ + ["instance_name", "target_node", "shutdown"]
524 5c947f38 Iustin Pop
525 0a7bed64 Michael Hanselmann
526 9ac99fda Guido Trotter
class OpRemoveExport(OpCode):
527 9ac99fda Guido Trotter
  """Remove an instance's export."""
528 9ac99fda Guido Trotter
  OP_ID = "OP_BACKUP_REMOVE"
529 60dd1473 Iustin Pop
  OP_DSC_FIELD = "instance_name"
530 4f05fd3b Iustin Pop
  __slots__ = OpCode.__slots__ + ["instance_name"]
531 5c947f38 Iustin Pop
532 0a7bed64 Michael Hanselmann
533 5c947f38 Iustin Pop
# Tags opcodes
534 5c947f38 Iustin Pop
class OpGetTags(OpCode):
535 5c947f38 Iustin Pop
  """Returns the tags of the given object."""
536 5c947f38 Iustin Pop
  OP_ID = "OP_TAGS_GET"
537 60dd1473 Iustin Pop
  OP_DSC_FIELD = "name"
538 4f05fd3b Iustin Pop
  __slots__ = OpCode.__slots__ + ["kind", "name"]
539 5c947f38 Iustin Pop
540 5c947f38 Iustin Pop
541 73415719 Iustin Pop
class OpSearchTags(OpCode):
542 73415719 Iustin Pop
  """Searches the tags in the cluster for a given pattern."""
543 73415719 Iustin Pop
  OP_ID = "OP_TAGS_SEARCH"
544 60dd1473 Iustin Pop
  OP_DSC_FIELD = "pattern"
545 4f05fd3b Iustin Pop
  __slots__ = OpCode.__slots__ + ["pattern"]
546 73415719 Iustin Pop
547 73415719 Iustin Pop
548 f27302fa Iustin Pop
class OpAddTags(OpCode):
549 f27302fa Iustin Pop
  """Add a list of tags on a given object."""
550 5c947f38 Iustin Pop
  OP_ID = "OP_TAGS_SET"
551 4f05fd3b Iustin Pop
  __slots__ = OpCode.__slots__ + ["kind", "name", "tags"]
552 5c947f38 Iustin Pop
553 5c947f38 Iustin Pop
554 f27302fa Iustin Pop
class OpDelTags(OpCode):
555 f27302fa Iustin Pop
  """Remove a list of tags from a given object."""
556 5c947f38 Iustin Pop
  OP_ID = "OP_TAGS_DEL"
557 4f05fd3b Iustin Pop
  __slots__ = OpCode.__slots__ + ["kind", "name", "tags"]
558 06009e27 Iustin Pop
559 06009e27 Iustin Pop
560 06009e27 Iustin Pop
# Test opcodes
561 06009e27 Iustin Pop
class OpTestDelay(OpCode):
562 06009e27 Iustin Pop
  """Sleeps for a configured amount of time.
563 06009e27 Iustin Pop

564 06009e27 Iustin Pop
  This is used just for debugging and testing.
565 06009e27 Iustin Pop

566 06009e27 Iustin Pop
  Parameters:
567 06009e27 Iustin Pop
    - duration: the time to sleep
568 06009e27 Iustin Pop
    - on_master: if true, sleep on the master
569 06009e27 Iustin Pop
    - on_nodes: list of nodes in which to sleep
570 06009e27 Iustin Pop

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

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

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

581 06009e27 Iustin Pop
  """
582 06009e27 Iustin Pop
  OP_ID = "OP_TEST_DELAY"
583 60dd1473 Iustin Pop
  OP_DSC_FIELD = "duration"
584 4f05fd3b Iustin Pop
  __slots__ = OpCode.__slots__ + ["duration", "on_master", "on_nodes"]
585 d61df03e Iustin Pop
586 d61df03e Iustin Pop
587 d61df03e Iustin Pop
class OpTestAllocator(OpCode):
588 d61df03e Iustin Pop
  """Allocator framework testing.
589 d61df03e Iustin Pop

590 d61df03e Iustin Pop
  This opcode has two modes:
591 d61df03e Iustin Pop
    - gather and return allocator input for a given mode (allocate new
592 d61df03e Iustin Pop
      or replace secondary) and a given instance definition (direction
593 d61df03e Iustin Pop
      'in')
594 d61df03e Iustin Pop
    - run a selected allocator for a given operation (as above) and
595 d61df03e Iustin Pop
      return the allocator output (direction 'out')
596 d61df03e Iustin Pop

597 d61df03e Iustin Pop
  """
598 d61df03e Iustin Pop
  OP_ID = "OP_TEST_ALLOCATOR"
599 60dd1473 Iustin Pop
  OP_DSC_FIELD = "allocator"
600 4f05fd3b Iustin Pop
  __slots__ = OpCode.__slots__ + [
601 d61df03e Iustin Pop
    "direction", "mode", "allocator", "name",
602 d61df03e Iustin Pop
    "mem_size", "disks", "disk_template",
603 8cc7e742 Guido Trotter
    "os", "tags", "nics", "vcpus", "hypervisor",
604 d61df03e Iustin Pop
    ]