Statistics
| Branch: | Tag: | Revision:

root / lib / opcodes.py @ e5395072

History | View | Annotate | Download (44.5 kB)

1 2f31098c Iustin Pop
#
2 a8083063 Iustin Pop
#
3 a8083063 Iustin Pop
4 687c10d9 Iustin Pop
# Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011 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 1cbef6d8 Michael Hanselmann
import logging
37 ff0d18e6 Iustin Pop
import re
38 8c9ee749 Michael Hanselmann
import operator
39 1cbef6d8 Michael Hanselmann
40 65e183af Michael Hanselmann
from ganeti import constants
41 65e183af Michael Hanselmann
from ganeti import errors
42 65e183af Michael Hanselmann
from ganeti import ht
43 65e183af Michael Hanselmann
44 65e183af Michael Hanselmann
45 65e183af Michael Hanselmann
# Common opcode attributes
46 65e183af Michael Hanselmann
47 65e183af Michael Hanselmann
#: output fields for a query operation
48 197b323b Michael Hanselmann
_POutputFields = ("output_fields", ht.NoDefault, ht.TListOf(ht.TNonEmptyString),
49 45d4c81c Michael Hanselmann
                  "Selected output fields")
50 65e183af Michael Hanselmann
51 65e183af Michael Hanselmann
#: the shutdown timeout
52 45d4c81c Michael Hanselmann
_PShutdownTimeout = \
53 45d4c81c Michael Hanselmann
  ("shutdown_timeout", constants.DEFAULT_SHUTDOWN_TIMEOUT, ht.TPositiveInt,
54 45d4c81c Michael Hanselmann
   "How long to wait for instance to shut down")
55 65e183af Michael Hanselmann
56 65e183af Michael Hanselmann
#: the force parameter
57 45d4c81c Michael Hanselmann
_PForce = ("force", False, ht.TBool, "Whether to force the operation")
58 65e183af Michael Hanselmann
59 65e183af Michael Hanselmann
#: a required instance name (for single-instance LUs)
60 45d4c81c Michael Hanselmann
_PInstanceName = ("instance_name", ht.NoDefault, ht.TNonEmptyString,
61 45d4c81c Michael Hanselmann
                  "Instance name")
62 65e183af Michael Hanselmann
63 65e183af Michael Hanselmann
#: Whether to ignore offline nodes
64 45d4c81c Michael Hanselmann
_PIgnoreOfflineNodes = ("ignore_offline_nodes", False, ht.TBool,
65 45d4c81c Michael Hanselmann
                        "Whether to ignore offline nodes")
66 65e183af Michael Hanselmann
67 65e183af Michael Hanselmann
#: a required node name (for single-node LUs)
68 45d4c81c Michael Hanselmann
_PNodeName = ("node_name", ht.NoDefault, ht.TNonEmptyString, "Node name")
69 65e183af Michael Hanselmann
70 65e183af Michael Hanselmann
#: a required node group name (for single-group LUs)
71 45d4c81c Michael Hanselmann
_PGroupName = ("group_name", ht.NoDefault, ht.TNonEmptyString, "Group name")
72 65e183af Michael Hanselmann
73 65e183af Michael Hanselmann
#: Migration type (live/non-live)
74 65e183af Michael Hanselmann
_PMigrationMode = ("mode", None,
75 197b323b Michael Hanselmann
                   ht.TOr(ht.TNone, ht.TElemOf(constants.HT_MIGRATION_MODES)),
76 45d4c81c Michael Hanselmann
                   "Migration mode")
77 65e183af Michael Hanselmann
78 65e183af Michael Hanselmann
#: Obsolete 'live' migration mode (boolean)
79 45d4c81c Michael Hanselmann
_PMigrationLive = ("live", None, ht.TMaybeBool,
80 45d4c81c Michael Hanselmann
                   "Legacy setting for live migration, do not use")
81 65e183af Michael Hanselmann
82 65e183af Michael Hanselmann
#: Tag type
83 197b323b Michael Hanselmann
_PTagKind = ("kind", ht.NoDefault, ht.TElemOf(constants.VALID_TAG_TYPES), None)
84 65e183af Michael Hanselmann
85 65e183af Michael Hanselmann
#: List of tag strings
86 197b323b Michael Hanselmann
_PTags = ("tags", ht.NoDefault, ht.TListOf(ht.TNonEmptyString), None)
87 65e183af Michael Hanselmann
88 45d4c81c Michael Hanselmann
_PForceVariant = ("force_variant", False, ht.TBool,
89 45d4c81c Michael Hanselmann
                  "Whether to force an unknown OS variant")
90 45d4c81c Michael Hanselmann
91 45d4c81c Michael Hanselmann
_PWaitForSync = ("wait_for_sync", True, ht.TBool,
92 45d4c81c Michael Hanselmann
                 "Whether to wait for the disk to synchronize")
93 45d4c81c Michael Hanselmann
94 45d4c81c Michael Hanselmann
_PIgnoreConsistency = ("ignore_consistency", False, ht.TBool,
95 45d4c81c Michael Hanselmann
                       "Whether to ignore disk consistency")
96 45d4c81c Michael Hanselmann
97 45d4c81c Michael Hanselmann
_PStorageName = ("name", ht.NoDefault, ht.TMaybeString, "Storage name")
98 45d4c81c Michael Hanselmann
99 45d4c81c Michael Hanselmann
_PUseLocking = ("use_locking", False, ht.TBool,
100 45d4c81c Michael Hanselmann
                "Whether to use synchronization")
101 45d4c81c Michael Hanselmann
102 45d4c81c Michael Hanselmann
_PNameCheck = ("name_check", True, ht.TBool, "Whether to check name")
103 45d4c81c Michael Hanselmann
104 45d4c81c Michael Hanselmann
_PNodeGroupAllocPolicy = \
105 45d4c81c Michael Hanselmann
  ("alloc_policy", None,
106 45d4c81c Michael Hanselmann
   ht.TOr(ht.TNone, ht.TElemOf(constants.VALID_ALLOC_POLICIES)),
107 45d4c81c Michael Hanselmann
   "Instance allocation policy")
108 45d4c81c Michael Hanselmann
109 45d4c81c Michael Hanselmann
_PGroupNodeParams = ("ndparams", None, ht.TMaybeDict,
110 45d4c81c Michael Hanselmann
                     "Default node parameters for group")
111 45d4c81c Michael Hanselmann
112 abd66bf8 Michael Hanselmann
_PQueryWhat = ("what", ht.NoDefault, ht.TElemOf(constants.QR_VIA_OP),
113 8e7078e0 Michael Hanselmann
               "Resource(s) to query for")
114 8e7078e0 Michael Hanselmann
115 45d4c81c Michael Hanselmann
_PIpCheckDoc = "Whether to ensure instance's IP address is inactive"
116 45d4c81c Michael Hanselmann
117 ff0d18e6 Iustin Pop
#: OP_ID conversion regular expression
118 ff0d18e6 Iustin Pop
_OPID_RE = re.compile("([a-z])([A-Z])")
119 ff0d18e6 Iustin Pop
120 8c9ee749 Michael Hanselmann
#: Utility function for L{OpClusterSetParams}
121 8c9ee749 Michael Hanselmann
_TestClusterOsList = ht.TOr(ht.TNone,
122 8c9ee749 Michael Hanselmann
  ht.TListOf(ht.TAnd(ht.TList, ht.TIsLength(2),
123 8c9ee749 Michael Hanselmann
    ht.TMap(ht.WithDesc("GetFirstItem")(operator.itemgetter(0)),
124 8c9ee749 Michael Hanselmann
            ht.TElemOf(constants.DDMS_VALUES)))))
125 8c9ee749 Michael Hanselmann
126 ff0d18e6 Iustin Pop
127 526a662a Michael Hanselmann
# TODO: Generate check from constants.INIC_PARAMS_TYPES
128 526a662a Michael Hanselmann
#: Utility function for testing NIC definitions
129 526a662a Michael Hanselmann
_TestNicDef = ht.TDictOf(ht.TElemOf(constants.INIC_PARAMS),
130 526a662a Michael Hanselmann
                         ht.TOr(ht.TNone, ht.TNonEmptyString))
131 526a662a Michael Hanselmann
132 526a662a Michael Hanselmann
133 ff0d18e6 Iustin Pop
def _NameToId(name):
134 ff0d18e6 Iustin Pop
  """Convert an opcode class name to an OP_ID.
135 ff0d18e6 Iustin Pop

136 ff0d18e6 Iustin Pop
  @type name: string
137 ff0d18e6 Iustin Pop
  @param name: the class name, as OpXxxYyy
138 ff0d18e6 Iustin Pop
  @rtype: string
139 ff0d18e6 Iustin Pop
  @return: the name in the OP_XXXX_YYYY format
140 ff0d18e6 Iustin Pop

141 ff0d18e6 Iustin Pop
  """
142 ff0d18e6 Iustin Pop
  if not name.startswith("Op"):
143 ff0d18e6 Iustin Pop
    return None
144 ff0d18e6 Iustin Pop
  # Note: (?<=[a-z])(?=[A-Z]) would be ideal, since it wouldn't
145 ff0d18e6 Iustin Pop
  # consume any input, and hence we would just have all the elements
146 ff0d18e6 Iustin Pop
  # in the list, one by one; but it seems that split doesn't work on
147 ff0d18e6 Iustin Pop
  # non-consuming input, hence we have to process the input string a
148 ff0d18e6 Iustin Pop
  # bit
149 ff0d18e6 Iustin Pop
  name = _OPID_RE.sub(r"\1,\2", name)
150 ff0d18e6 Iustin Pop
  elems = name.split(",")
151 ff0d18e6 Iustin Pop
  return "_".join(n.upper() for n in elems)
152 ff0d18e6 Iustin Pop
153 65e183af Michael Hanselmann
154 65e183af Michael Hanselmann
def RequireFileStorage():
155 65e183af Michael Hanselmann
  """Checks that file storage is enabled.
156 65e183af Michael Hanselmann

157 65e183af Michael Hanselmann
  While it doesn't really fit into this module, L{utils} was deemed too large
158 65e183af Michael Hanselmann
  of a dependency to be imported for just one or two functions.
159 65e183af Michael Hanselmann

160 65e183af Michael Hanselmann
  @raise errors.OpPrereqError: when file storage is disabled
161 65e183af Michael Hanselmann

162 65e183af Michael Hanselmann
  """
163 65e183af Michael Hanselmann
  if not constants.ENABLE_FILE_STORAGE:
164 65e183af Michael Hanselmann
    raise errors.OpPrereqError("File storage disabled at configure time",
165 65e183af Michael Hanselmann
                               errors.ECODE_INVAL)
166 65e183af Michael Hanselmann
167 65e183af Michael Hanselmann
168 4b97f902 Apollon Oikonomopoulos
def RequireSharedFileStorage():
169 4b97f902 Apollon Oikonomopoulos
  """Checks that shared file storage is enabled.
170 4b97f902 Apollon Oikonomopoulos

171 4b97f902 Apollon Oikonomopoulos
  While it doesn't really fit into this module, L{utils} was deemed too large
172 4b97f902 Apollon Oikonomopoulos
  of a dependency to be imported for just one or two functions.
173 4b97f902 Apollon Oikonomopoulos

174 4b97f902 Apollon Oikonomopoulos
  @raise errors.OpPrereqError: when shared file storage is disabled
175 4b97f902 Apollon Oikonomopoulos

176 4b97f902 Apollon Oikonomopoulos
  """
177 4b97f902 Apollon Oikonomopoulos
  if not constants.ENABLE_SHARED_FILE_STORAGE:
178 4b97f902 Apollon Oikonomopoulos
    raise errors.OpPrereqError("Shared file storage disabled at"
179 4b97f902 Apollon Oikonomopoulos
                               " configure time", errors.ECODE_INVAL)
180 4b97f902 Apollon Oikonomopoulos
181 4b97f902 Apollon Oikonomopoulos
182 8c9ee749 Michael Hanselmann
@ht.WithDesc("CheckFileStorage")
183 8c9ee749 Michael Hanselmann
def _CheckFileStorage(value):
184 8c9ee749 Michael Hanselmann
  """Ensures file storage is enabled if used.
185 65e183af Michael Hanselmann

186 65e183af Michael Hanselmann
  """
187 8c9ee749 Michael Hanselmann
  if value == constants.DT_FILE:
188 65e183af Michael Hanselmann
    RequireFileStorage()
189 4b97f902 Apollon Oikonomopoulos
  elif value == constants.DT_SHARED_FILE:
190 4b97f902 Apollon Oikonomopoulos
    RequireSharedFileStorage()
191 65e183af Michael Hanselmann
  return True
192 65e183af Michael Hanselmann
193 65e183af Michael Hanselmann
194 8c9ee749 Michael Hanselmann
_CheckDiskTemplate = ht.TAnd(ht.TElemOf(constants.DISK_TEMPLATES),
195 8c9ee749 Michael Hanselmann
                             _CheckFileStorage)
196 8c9ee749 Michael Hanselmann
197 8c9ee749 Michael Hanselmann
198 65e183af Michael Hanselmann
def _CheckStorageType(storage_type):
199 65e183af Michael Hanselmann
  """Ensure a given storage type is valid.
200 65e183af Michael Hanselmann

201 65e183af Michael Hanselmann
  """
202 65e183af Michael Hanselmann
  if storage_type not in constants.VALID_STORAGE_TYPES:
203 65e183af Michael Hanselmann
    raise errors.OpPrereqError("Unknown storage type: %s" % storage_type,
204 65e183af Michael Hanselmann
                               errors.ECODE_INVAL)
205 65e183af Michael Hanselmann
  if storage_type == constants.ST_FILE:
206 65e183af Michael Hanselmann
    RequireFileStorage()
207 65e183af Michael Hanselmann
  return True
208 65e183af Michael Hanselmann
209 65e183af Michael Hanselmann
210 65e183af Michael Hanselmann
#: Storage type parameter
211 45d4c81c Michael Hanselmann
_PStorageType = ("storage_type", ht.NoDefault, _CheckStorageType,
212 45d4c81c Michael Hanselmann
                 "Storage type")
213 65e183af Michael Hanselmann
214 65e183af Michael Hanselmann
215 65e183af Michael Hanselmann
class _AutoOpParamSlots(type):
216 65e183af Michael Hanselmann
  """Meta class for opcode definitions.
217 65e183af Michael Hanselmann

218 65e183af Michael Hanselmann
  """
219 65e183af Michael Hanselmann
  def __new__(mcs, name, bases, attrs):
220 65e183af Michael Hanselmann
    """Called when a class should be created.
221 65e183af Michael Hanselmann

222 65e183af Michael Hanselmann
    @param mcs: The meta class
223 65e183af Michael Hanselmann
    @param name: Name of created class
224 65e183af Michael Hanselmann
    @param bases: Base classes
225 65e183af Michael Hanselmann
    @type attrs: dict
226 65e183af Michael Hanselmann
    @param attrs: Class attributes
227 65e183af Michael Hanselmann

228 65e183af Michael Hanselmann
    """
229 65e183af Michael Hanselmann
    assert "__slots__" not in attrs, \
230 65e183af Michael Hanselmann
      "Class '%s' defines __slots__ when it should use OP_PARAMS" % name
231 e89a9021 Iustin Pop
    assert "OP_ID" not in attrs, "Class '%s' defining OP_ID" % name
232 ff0d18e6 Iustin Pop
233 e89a9021 Iustin Pop
    attrs["OP_ID"] = _NameToId(name)
234 65e183af Michael Hanselmann
235 65e183af Michael Hanselmann
    # Always set OP_PARAMS to avoid duplicates in BaseOpCode.GetAllParams
236 65e183af Michael Hanselmann
    params = attrs.setdefault("OP_PARAMS", [])
237 65e183af Michael Hanselmann
238 65e183af Michael Hanselmann
    # Use parameter names as slots
239 197b323b Michael Hanselmann
    slots = [pname for (pname, _, _, _) in params]
240 65e183af Michael Hanselmann
241 65e183af Michael Hanselmann
    assert "OP_DSC_FIELD" not in attrs or attrs["OP_DSC_FIELD"] in slots, \
242 65e183af Michael Hanselmann
      "Class '%s' uses unknown field in OP_DSC_FIELD" % name
243 65e183af Michael Hanselmann
244 65e183af Michael Hanselmann
    attrs["__slots__"] = slots
245 65e183af Michael Hanselmann
246 65e183af Michael Hanselmann
    return type.__new__(mcs, name, bases, attrs)
247 65e183af Michael Hanselmann
248 df458e0b Iustin Pop
249 0e46916d Iustin Pop
class BaseOpCode(object):
250 df458e0b Iustin Pop
  """A simple serializable object.
251 df458e0b Iustin Pop

252 0e46916d Iustin Pop
  This object serves as a parent class for OpCode without any custom
253 0e46916d Iustin Pop
  field handling.
254 0e46916d Iustin Pop

255 df458e0b Iustin Pop
  """
256 e89a9021 Iustin Pop
  # pylint: disable-msg=E1101
257 e89a9021 Iustin Pop
  # as OP_ID is dynamically defined
258 65e183af Michael Hanselmann
  __metaclass__ = _AutoOpParamSlots
259 65e183af Michael Hanselmann
260 a8083063 Iustin Pop
  def __init__(self, **kwargs):
261 a7399f66 Iustin Pop
    """Constructor for BaseOpCode.
262 a7399f66 Iustin Pop

263 a7399f66 Iustin Pop
    The constructor takes only keyword arguments and will set
264 a7399f66 Iustin Pop
    attributes on this object based on the passed arguments. As such,
265 a7399f66 Iustin Pop
    it means that you should not pass arguments which are not in the
266 a7399f66 Iustin Pop
    __slots__ attribute for this class.
267 a7399f66 Iustin Pop

268 a7399f66 Iustin Pop
    """
269 adf385c7 Iustin Pop
    slots = self._all_slots()
270 a8083063 Iustin Pop
    for key in kwargs:
271 adf385c7 Iustin Pop
      if key not in slots:
272 df458e0b Iustin Pop
        raise TypeError("Object %s doesn't support the parameter '%s'" %
273 3ecf6786 Iustin Pop
                        (self.__class__.__name__, key))
274 a8083063 Iustin Pop
      setattr(self, key, kwargs[key])
275 a8083063 Iustin Pop
276 df458e0b Iustin Pop
  def __getstate__(self):
277 a7399f66 Iustin Pop
    """Generic serializer.
278 a7399f66 Iustin Pop

279 a7399f66 Iustin Pop
    This method just returns the contents of the instance as a
280 a7399f66 Iustin Pop
    dictionary.
281 a7399f66 Iustin Pop

282 a7399f66 Iustin Pop
    @rtype:  C{dict}
283 a7399f66 Iustin Pop
    @return: the instance attributes and their values
284 a7399f66 Iustin Pop

285 a7399f66 Iustin Pop
    """
286 df458e0b Iustin Pop
    state = {}
287 adf385c7 Iustin Pop
    for name in self._all_slots():
288 df458e0b Iustin Pop
      if hasattr(self, name):
289 df458e0b Iustin Pop
        state[name] = getattr(self, name)
290 df458e0b Iustin Pop
    return state
291 df458e0b Iustin Pop
292 df458e0b Iustin Pop
  def __setstate__(self, state):
293 a7399f66 Iustin Pop
    """Generic unserializer.
294 a7399f66 Iustin Pop

295 a7399f66 Iustin Pop
    This method just restores from the serialized state the attributes
296 a7399f66 Iustin Pop
    of the current instance.
297 a7399f66 Iustin Pop

298 a7399f66 Iustin Pop
    @param state: the serialized opcode data
299 a7399f66 Iustin Pop
    @type state:  C{dict}
300 a7399f66 Iustin Pop

301 a7399f66 Iustin Pop
    """
302 df458e0b Iustin Pop
    if not isinstance(state, dict):
303 df458e0b Iustin Pop
      raise ValueError("Invalid data to __setstate__: expected dict, got %s" %
304 df458e0b Iustin Pop
                       type(state))
305 df458e0b Iustin Pop
306 adf385c7 Iustin Pop
    for name in self._all_slots():
307 44db3a6f Iustin Pop
      if name not in state and hasattr(self, name):
308 df458e0b Iustin Pop
        delattr(self, name)
309 df458e0b Iustin Pop
310 df458e0b Iustin Pop
    for name in state:
311 df458e0b Iustin Pop
      setattr(self, name, state[name])
312 df458e0b Iustin Pop
313 adf385c7 Iustin Pop
  @classmethod
314 adf385c7 Iustin Pop
  def _all_slots(cls):
315 adf385c7 Iustin Pop
    """Compute the list of all declared slots for a class.
316 adf385c7 Iustin Pop

317 adf385c7 Iustin Pop
    """
318 adf385c7 Iustin Pop
    slots = []
319 adf385c7 Iustin Pop
    for parent in cls.__mro__:
320 adf385c7 Iustin Pop
      slots.extend(getattr(parent, "__slots__", []))
321 adf385c7 Iustin Pop
    return slots
322 adf385c7 Iustin Pop
323 65e183af Michael Hanselmann
  @classmethod
324 65e183af Michael Hanselmann
  def GetAllParams(cls):
325 65e183af Michael Hanselmann
    """Compute list of all parameters for an opcode.
326 65e183af Michael Hanselmann

327 65e183af Michael Hanselmann
    """
328 65e183af Michael Hanselmann
    slots = []
329 65e183af Michael Hanselmann
    for parent in cls.__mro__:
330 65e183af Michael Hanselmann
      slots.extend(getattr(parent, "OP_PARAMS", []))
331 65e183af Michael Hanselmann
    return slots
332 65e183af Michael Hanselmann
333 1cbef6d8 Michael Hanselmann
  def Validate(self, set_defaults):
334 1cbef6d8 Michael Hanselmann
    """Validate opcode parameters, optionally setting default values.
335 1cbef6d8 Michael Hanselmann

336 1cbef6d8 Michael Hanselmann
    @type set_defaults: bool
337 1cbef6d8 Michael Hanselmann
    @param set_defaults: Whether to set default values
338 1cbef6d8 Michael Hanselmann
    @raise errors.OpPrereqError: When a parameter value doesn't match
339 1cbef6d8 Michael Hanselmann
                                 requirements
340 1cbef6d8 Michael Hanselmann

341 1cbef6d8 Michael Hanselmann
    """
342 197b323b Michael Hanselmann
    for (attr_name, default, test, _) in self.GetAllParams():
343 1cbef6d8 Michael Hanselmann
      assert test == ht.NoType or callable(test)
344 1cbef6d8 Michael Hanselmann
345 1cbef6d8 Michael Hanselmann
      if not hasattr(self, attr_name):
346 1cbef6d8 Michael Hanselmann
        if default == ht.NoDefault:
347 1cbef6d8 Michael Hanselmann
          raise errors.OpPrereqError("Required parameter '%s.%s' missing" %
348 1cbef6d8 Michael Hanselmann
                                     (self.OP_ID, attr_name),
349 1cbef6d8 Michael Hanselmann
                                     errors.ECODE_INVAL)
350 1cbef6d8 Michael Hanselmann
        elif set_defaults:
351 1cbef6d8 Michael Hanselmann
          if callable(default):
352 1cbef6d8 Michael Hanselmann
            dval = default()
353 1cbef6d8 Michael Hanselmann
          else:
354 1cbef6d8 Michael Hanselmann
            dval = default
355 1cbef6d8 Michael Hanselmann
          setattr(self, attr_name, dval)
356 1cbef6d8 Michael Hanselmann
357 1cbef6d8 Michael Hanselmann
      if test == ht.NoType:
358 1cbef6d8 Michael Hanselmann
        # no tests here
359 1cbef6d8 Michael Hanselmann
        continue
360 1cbef6d8 Michael Hanselmann
361 1cbef6d8 Michael Hanselmann
      if set_defaults or hasattr(self, attr_name):
362 1cbef6d8 Michael Hanselmann
        attr_val = getattr(self, attr_name)
363 1cbef6d8 Michael Hanselmann
        if not test(attr_val):
364 1cbef6d8 Michael Hanselmann
          logging.error("OpCode %s, parameter %s, has invalid type %s/value %s",
365 1cbef6d8 Michael Hanselmann
                        self.OP_ID, attr_name, type(attr_val), attr_val)
366 1cbef6d8 Michael Hanselmann
          raise errors.OpPrereqError("Parameter '%s.%s' fails validation" %
367 1cbef6d8 Michael Hanselmann
                                     (self.OP_ID, attr_name),
368 1cbef6d8 Michael Hanselmann
                                     errors.ECODE_INVAL)
369 1cbef6d8 Michael Hanselmann
370 df458e0b Iustin Pop
371 0e46916d Iustin Pop
class OpCode(BaseOpCode):
372 a7399f66 Iustin Pop
  """Abstract OpCode.
373 a7399f66 Iustin Pop

374 a7399f66 Iustin Pop
  This is the root of the actual OpCode hierarchy. All clases derived
375 a7399f66 Iustin Pop
  from this class should override OP_ID.
376 a7399f66 Iustin Pop

377 a7399f66 Iustin Pop
  @cvar OP_ID: The ID of this opcode. This should be unique amongst all
378 20777413 Iustin Pop
               children of this class.
379 bde8f481 Adeodato Simo
  @cvar OP_DSC_FIELD: The name of a field whose value will be included in the
380 bde8f481 Adeodato Simo
                      string returned by Summary(); see the docstring of that
381 bde8f481 Adeodato Simo
                      method for details).
382 65e183af Michael Hanselmann
  @cvar OP_PARAMS: List of opcode attributes, the default values they should
383 65e183af Michael Hanselmann
                   get if not already defined, and types they must match.
384 687c10d9 Iustin Pop
  @cvar WITH_LU: Boolean that specifies whether this should be included in
385 687c10d9 Iustin Pop
      mcpu's dispatch table
386 20777413 Iustin Pop
  @ivar dry_run: Whether the LU should be run in dry-run mode, i.e. just
387 20777413 Iustin Pop
                 the check steps
388 8f5c488d Michael Hanselmann
  @ivar priority: Opcode priority for queue
389 a7399f66 Iustin Pop

390 a7399f66 Iustin Pop
  """
391 e89a9021 Iustin Pop
  # pylint: disable-msg=E1101
392 e89a9021 Iustin Pop
  # as OP_ID is dynamically defined
393 687c10d9 Iustin Pop
  WITH_LU = True
394 65e183af Michael Hanselmann
  OP_PARAMS = [
395 45d4c81c Michael Hanselmann
    ("dry_run", None, ht.TMaybeBool, "Run checks only, don't execute"),
396 45d4c81c Michael Hanselmann
    ("debug_level", None, ht.TOr(ht.TNone, ht.TPositiveInt), "Debug level"),
397 65e183af Michael Hanselmann
    ("priority", constants.OP_PRIO_DEFAULT,
398 45d4c81c Michael Hanselmann
     ht.TElemOf(constants.OP_PRIO_SUBMIT_VALID), "Opcode priority"),
399 65e183af Michael Hanselmann
    ]
400 df458e0b Iustin Pop
401 df458e0b Iustin Pop
  def __getstate__(self):
402 df458e0b Iustin Pop
    """Specialized getstate for opcodes.
403 df458e0b Iustin Pop

404 a7399f66 Iustin Pop
    This method adds to the state dictionary the OP_ID of the class,
405 a7399f66 Iustin Pop
    so that on unload we can identify the correct class for
406 a7399f66 Iustin Pop
    instantiating the opcode.
407 a7399f66 Iustin Pop

408 a7399f66 Iustin Pop
    @rtype:   C{dict}
409 a7399f66 Iustin Pop
    @return:  the state as a dictionary
410 a7399f66 Iustin Pop

411 df458e0b Iustin Pop
    """
412 0e46916d Iustin Pop
    data = BaseOpCode.__getstate__(self)
413 df458e0b Iustin Pop
    data["OP_ID"] = self.OP_ID
414 df458e0b Iustin Pop
    return data
415 df458e0b Iustin Pop
416 df458e0b Iustin Pop
  @classmethod
417 00abdc96 Iustin Pop
  def LoadOpCode(cls, data):
418 df458e0b Iustin Pop
    """Generic load opcode method.
419 df458e0b Iustin Pop

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

424 a7399f66 Iustin Pop
    @type data:  C{dict}
425 a7399f66 Iustin Pop
    @param data: the serialized opcode
426 a7399f66 Iustin Pop

427 df458e0b Iustin Pop
    """
428 df458e0b Iustin Pop
    if not isinstance(data, dict):
429 df458e0b Iustin Pop
      raise ValueError("Invalid data to LoadOpCode (%s)" % type(data))
430 df458e0b Iustin Pop
    if "OP_ID" not in data:
431 df458e0b Iustin Pop
      raise ValueError("Invalid data to LoadOpcode, missing OP_ID")
432 df458e0b Iustin Pop
    op_id = data["OP_ID"]
433 df458e0b Iustin Pop
    op_class = None
434 363acb1e Iustin Pop
    if op_id in OP_MAPPING:
435 363acb1e Iustin Pop
      op_class = OP_MAPPING[op_id]
436 363acb1e Iustin Pop
    else:
437 df458e0b Iustin Pop
      raise ValueError("Invalid data to LoadOpCode: OP_ID %s unsupported" %
438 df458e0b Iustin Pop
                       op_id)
439 df458e0b Iustin Pop
    op = op_class()
440 df458e0b Iustin Pop
    new_data = data.copy()
441 df458e0b Iustin Pop
    del new_data["OP_ID"]
442 df458e0b Iustin Pop
    op.__setstate__(new_data)
443 df458e0b Iustin Pop
    return op
444 df458e0b Iustin Pop
445 60dd1473 Iustin Pop
  def Summary(self):
446 60dd1473 Iustin Pop
    """Generates a summary description of this opcode.
447 60dd1473 Iustin Pop

448 ff0d18e6 Iustin Pop
    The summary is the value of the OP_ID attribute (without the "OP_"
449 ff0d18e6 Iustin Pop
    prefix), plus the value of the OP_DSC_FIELD attribute, if one was
450 ff0d18e6 Iustin Pop
    defined; this field should allow to easily identify the operation
451 ff0d18e6 Iustin Pop
    (for an instance creation job, e.g., it would be the instance
452 ff0d18e6 Iustin Pop
    name).
453 bde8f481 Adeodato Simo

454 60dd1473 Iustin Pop
    """
455 ff0d18e6 Iustin Pop
    assert self.OP_ID is not None and len(self.OP_ID) > 3
456 60dd1473 Iustin Pop
    # all OP_ID start with OP_, we remove that
457 60dd1473 Iustin Pop
    txt = self.OP_ID[3:]
458 60dd1473 Iustin Pop
    field_name = getattr(self, "OP_DSC_FIELD", None)
459 60dd1473 Iustin Pop
    if field_name:
460 60dd1473 Iustin Pop
      field_value = getattr(self, field_name, None)
461 bc8bbda1 Iustin Pop
      if isinstance(field_value, (list, tuple)):
462 bc8bbda1 Iustin Pop
        field_value = ",".join(str(i) for i in field_value)
463 60dd1473 Iustin Pop
      txt = "%s(%s)" % (txt, field_value)
464 60dd1473 Iustin Pop
    return txt
465 60dd1473 Iustin Pop
466 a8083063 Iustin Pop
467 afee0879 Iustin Pop
# cluster opcodes
468 afee0879 Iustin Pop
469 bc84ffa7 Iustin Pop
class OpClusterPostInit(OpCode):
470 b5f5fae9 Luca Bigliardi
  """Post cluster initialization.
471 b5f5fae9 Luca Bigliardi

472 b5f5fae9 Luca Bigliardi
  This opcode does not touch the cluster at all. Its purpose is to run hooks
473 b5f5fae9 Luca Bigliardi
  after the cluster has been initialized.
474 b5f5fae9 Luca Bigliardi

475 b5f5fae9 Luca Bigliardi
  """
476 b5f5fae9 Luca Bigliardi
477 b5f5fae9 Luca Bigliardi
478 c6d43e9e Iustin Pop
class OpClusterDestroy(OpCode):
479 a7399f66 Iustin Pop
  """Destroy the cluster.
480 a7399f66 Iustin Pop

481 a7399f66 Iustin Pop
  This opcode has no other parameters. All the state is irreversibly
482 a7399f66 Iustin Pop
  lost after the execution of this opcode.
483 a7399f66 Iustin Pop

484 a7399f66 Iustin Pop
  """
485 a8083063 Iustin Pop
486 a8083063 Iustin Pop
487 a2f7ab92 Iustin Pop
class OpClusterQuery(OpCode):
488 fdc267f4 Iustin Pop
  """Query cluster information."""
489 a8083063 Iustin Pop
490 a8083063 Iustin Pop
491 a3d32770 Iustin Pop
class OpClusterVerify(OpCode):
492 a7399f66 Iustin Pop
  """Verify the cluster state.
493 a7399f66 Iustin Pop

494 a7399f66 Iustin Pop
  @type skip_checks: C{list}
495 a7399f66 Iustin Pop
  @ivar skip_checks: steps to be skipped from the verify process; this
496 a7399f66 Iustin Pop
                     needs to be a subset of
497 a7399f66 Iustin Pop
                     L{constants.VERIFY_OPTIONAL_CHECKS}; currently
498 a7399f66 Iustin Pop
                     only L{constants.VERIFY_NPLUSONE_MEM} can be passed
499 a7399f66 Iustin Pop

500 a7399f66 Iustin Pop
  """
501 65e183af Michael Hanselmann
  OP_PARAMS = [
502 65e183af Michael Hanselmann
    ("skip_checks", ht.EmptyList,
503 197b323b Michael Hanselmann
     ht.TListOf(ht.TElemOf(constants.VERIFY_OPTIONAL_CHECKS)), None),
504 197b323b Michael Hanselmann
    ("verbose", False, ht.TBool, None),
505 197b323b Michael Hanselmann
    ("error_codes", False, ht.TBool, None),
506 197b323b Michael Hanselmann
    ("debug_simulate_errors", False, ht.TBool, None),
507 65e183af Michael Hanselmann
    ]
508 a8083063 Iustin Pop
509 a8083063 Iustin Pop
510 bd8210a7 Iustin Pop
class OpClusterVerifyDisks(OpCode):
511 150e978f Iustin Pop
  """Verify the cluster disks.
512 150e978f Iustin Pop

513 150e978f Iustin Pop
  Parameters: none
514 150e978f Iustin Pop

515 5188ab37 Iustin Pop
  Result: a tuple of four elements:
516 150e978f Iustin Pop
    - list of node names with bad data returned (unreachable, etc.)
517 a7399f66 Iustin Pop
    - dict of node names with broken volume groups (values: error msg)
518 150e978f Iustin Pop
    - list of instances with degraded disks (that should be activated)
519 b63ed789 Iustin Pop
    - dict of instances with missing logical volumes (values: (node, vol)
520 b63ed789 Iustin Pop
      pairs with details about the missing volumes)
521 150e978f Iustin Pop

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

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

530 150e978f Iustin Pop
  """
531 150e978f Iustin Pop
532 150e978f Iustin Pop
533 5d01aca3 Iustin Pop
class OpClusterRepairDiskSizes(OpCode):
534 60975797 Iustin Pop
  """Verify the disk sizes of the instances and fixes configuration
535 60975797 Iustin Pop
  mimatches.
536 60975797 Iustin Pop

537 60975797 Iustin Pop
  Parameters: optional instances list, in case we want to restrict the
538 60975797 Iustin Pop
  checks to only a subset of the instances.
539 60975797 Iustin Pop

540 60975797 Iustin Pop
  Result: a list of tuples, (instance, disk, new-size) for changed
541 60975797 Iustin Pop
  configurations.
542 60975797 Iustin Pop

543 60975797 Iustin Pop
  In normal operation, the list should be empty.
544 60975797 Iustin Pop

545 60975797 Iustin Pop
  @type instances: list
546 60975797 Iustin Pop
  @ivar instances: the list of instances to check, or empty for all instances
547 60975797 Iustin Pop

548 60975797 Iustin Pop
  """
549 65e183af Michael Hanselmann
  OP_PARAMS = [
550 197b323b Michael Hanselmann
    ("instances", ht.EmptyList, ht.TListOf(ht.TNonEmptyString), None),
551 65e183af Michael Hanselmann
    ]
552 60975797 Iustin Pop
553 60975797 Iustin Pop
554 2f093ea0 Iustin Pop
class OpClusterConfigQuery(OpCode):
555 ae5849b5 Michael Hanselmann
  """Query cluster configuration values."""
556 65e183af Michael Hanselmann
  OP_PARAMS = [
557 65e183af Michael Hanselmann
    _POutputFields
558 65e183af Michael Hanselmann
    ]
559 a8083063 Iustin Pop
560 a8083063 Iustin Pop
561 e126df25 Iustin Pop
class OpClusterRename(OpCode):
562 a7399f66 Iustin Pop
  """Rename the cluster.
563 a7399f66 Iustin Pop

564 a7399f66 Iustin Pop
  @type name: C{str}
565 a7399f66 Iustin Pop
  @ivar name: The new name of the cluster. The name and/or the master IP
566 a7399f66 Iustin Pop
              address will be changed to match the new name and its IP
567 a7399f66 Iustin Pop
              address.
568 a7399f66 Iustin Pop

569 a7399f66 Iustin Pop
  """
570 60dd1473 Iustin Pop
  OP_DSC_FIELD = "name"
571 65e183af Michael Hanselmann
  OP_PARAMS = [
572 197b323b Michael Hanselmann
    ("name", ht.NoDefault, ht.TNonEmptyString, None),
573 65e183af Michael Hanselmann
    ]
574 07bd8a51 Iustin Pop
575 07bd8a51 Iustin Pop
576 a6682fdc Iustin Pop
class OpClusterSetParams(OpCode):
577 a7399f66 Iustin Pop
  """Change the parameters of the cluster.
578 a7399f66 Iustin Pop

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

582 a7399f66 Iustin Pop
  """
583 65e183af Michael Hanselmann
  OP_PARAMS = [
584 45d4c81c Michael Hanselmann
    ("vg_name", None, ht.TMaybeString, "Volume group name"),
585 65e183af Michael Hanselmann
    ("enabled_hypervisors", None,
586 65e183af Michael Hanselmann
     ht.TOr(ht.TAnd(ht.TListOf(ht.TElemOf(constants.HYPER_TYPES)), ht.TTrue),
587 45d4c81c Michael Hanselmann
            ht.TNone),
588 45d4c81c Michael Hanselmann
     "List of enabled hypervisors"),
589 65e183af Michael Hanselmann
    ("hvparams", None, ht.TOr(ht.TDictOf(ht.TNonEmptyString, ht.TDict),
590 45d4c81c Michael Hanselmann
                              ht.TNone),
591 45d4c81c Michael Hanselmann
     "Cluster-wide hypervisor parameter defaults, hypervisor-dependent"),
592 45d4c81c Michael Hanselmann
    ("beparams", None, ht.TOr(ht.TDict, ht.TNone),
593 45d4c81c Michael Hanselmann
     "Cluster-wide backend parameter defaults"),
594 65e183af Michael Hanselmann
    ("os_hvp", None, ht.TOr(ht.TDictOf(ht.TNonEmptyString, ht.TDict),
595 45d4c81c Michael Hanselmann
                            ht.TNone),
596 45d4c81c Michael Hanselmann
     "Cluster-wide per-OS hypervisor parameter defaults"),
597 65e183af Michael Hanselmann
    ("osparams", None, ht.TOr(ht.TDictOf(ht.TNonEmptyString, ht.TDict),
598 45d4c81c Michael Hanselmann
                              ht.TNone),
599 45d4c81c Michael Hanselmann
     "Cluster-wide OS parameter defaults"),
600 197b323b Michael Hanselmann
    ("candidate_pool_size", None, ht.TOr(ht.TStrictPositiveInt, ht.TNone),
601 45d4c81c Michael Hanselmann
     "Master candidate pool size"),
602 45d4c81c Michael Hanselmann
    ("uid_pool", None, ht.NoType,
603 45d4c81c Michael Hanselmann
     "Set UID pool, must be list of lists describing UID ranges (two items,"
604 45d4c81c Michael Hanselmann
     " start and end inclusive)"),
605 45d4c81c Michael Hanselmann
    ("add_uids", None, ht.NoType,
606 45d4c81c Michael Hanselmann
     "Extend UID pool, must be list of lists describing UID ranges (two"
607 45d4c81c Michael Hanselmann
     " items, start and end inclusive) to be added"),
608 45d4c81c Michael Hanselmann
    ("remove_uids", None, ht.NoType,
609 45d4c81c Michael Hanselmann
     "Shrink UID pool, must be list of lists describing UID ranges (two"
610 45d4c81c Michael Hanselmann
     " items, start and end inclusive) to be removed"),
611 45d4c81c Michael Hanselmann
    ("maintain_node_health", None, ht.TMaybeBool,
612 45d4c81c Michael Hanselmann
     "Whether to automatically maintain node health"),
613 45d4c81c Michael Hanselmann
    ("prealloc_wipe_disks", None, ht.TMaybeBool,
614 45d4c81c Michael Hanselmann
     "Whether to wipe disks before allocating them to instances"),
615 45d4c81c Michael Hanselmann
    ("nicparams", None, ht.TMaybeDict, "Cluster-wide NIC parameter defaults"),
616 45d4c81c Michael Hanselmann
    ("ndparams", None, ht.TMaybeDict, "Cluster-wide node parameter defaults"),
617 45d4c81c Michael Hanselmann
    ("drbd_helper", None, ht.TOr(ht.TString, ht.TNone), "DRBD helper program"),
618 45d4c81c Michael Hanselmann
    ("default_iallocator", None, ht.TOr(ht.TString, ht.TNone),
619 45d4c81c Michael Hanselmann
     "Default iallocator for cluster"),
620 45d4c81c Michael Hanselmann
    ("master_netdev", None, ht.TOr(ht.TString, ht.TNone),
621 45d4c81c Michael Hanselmann
     "Master network device"),
622 45d4c81c Michael Hanselmann
    ("reserved_lvs", None, ht.TOr(ht.TListOf(ht.TNonEmptyString), ht.TNone),
623 45d4c81c Michael Hanselmann
     "List of reserved LVs"),
624 45d4c81c Michael Hanselmann
    ("hidden_os", None, _TestClusterOsList,
625 45d4c81c Michael Hanselmann
     "Modify list of hidden operating systems. Each modification must have"
626 45d4c81c Michael Hanselmann
     " two items, the operation and the OS name. The operation can be"
627 45d4c81c Michael Hanselmann
     " ``%s`` or ``%s``." % (constants.DDM_ADD, constants.DDM_REMOVE)),
628 45d4c81c Michael Hanselmann
    ("blacklisted_os", None, _TestClusterOsList,
629 45d4c81c Michael Hanselmann
     "Modify list of blacklisted operating systems. Each modification must have"
630 45d4c81c Michael Hanselmann
     " two items, the operation and the OS name. The operation can be"
631 45d4c81c Michael Hanselmann
     " ``%s`` or ``%s``." % (constants.DDM_ADD, constants.DDM_REMOVE)),
632 4b7735f9 Iustin Pop
    ]
633 12515db7 Manuel Franceschini
634 12515db7 Manuel Franceschini
635 d1240007 Iustin Pop
class OpClusterRedistConf(OpCode):
636 afee0879 Iustin Pop
  """Force a full push of the cluster configuration.
637 afee0879 Iustin Pop

638 afee0879 Iustin Pop
  """
639 afee0879 Iustin Pop
640 83f72637 Michael Hanselmann
641 83f72637 Michael Hanselmann
class OpQuery(OpCode):
642 83f72637 Michael Hanselmann
  """Query for resources/items.
643 83f72637 Michael Hanselmann

644 abd66bf8 Michael Hanselmann
  @ivar what: Resources to query for, must be one of L{constants.QR_VIA_OP}
645 83f72637 Michael Hanselmann
  @ivar fields: List of fields to retrieve
646 83f72637 Michael Hanselmann
  @ivar filter: Query filter
647 83f72637 Michael Hanselmann

648 83f72637 Michael Hanselmann
  """
649 65e183af Michael Hanselmann
  OP_PARAMS = [
650 8e7078e0 Michael Hanselmann
    _PQueryWhat,
651 45d4c81c Michael Hanselmann
    ("fields", ht.NoDefault, ht.TListOf(ht.TNonEmptyString),
652 45d4c81c Michael Hanselmann
     "Requested fields"),
653 65e183af Michael Hanselmann
    ("filter", None, ht.TOr(ht.TNone,
654 45d4c81c Michael Hanselmann
                            ht.TListOf(ht.TOr(ht.TNonEmptyString, ht.TList))),
655 45d4c81c Michael Hanselmann
     "Query filter"),
656 83f72637 Michael Hanselmann
    ]
657 83f72637 Michael Hanselmann
658 83f72637 Michael Hanselmann
659 83f72637 Michael Hanselmann
class OpQueryFields(OpCode):
660 83f72637 Michael Hanselmann
  """Query for available resource/item fields.
661 83f72637 Michael Hanselmann

662 abd66bf8 Michael Hanselmann
  @ivar what: Resources to query for, must be one of L{constants.QR_VIA_OP}
663 83f72637 Michael Hanselmann
  @ivar fields: List of fields to retrieve
664 83f72637 Michael Hanselmann

665 83f72637 Michael Hanselmann
  """
666 65e183af Michael Hanselmann
  OP_PARAMS = [
667 8e7078e0 Michael Hanselmann
    _PQueryWhat,
668 8e7078e0 Michael Hanselmann
    ("fields", None, ht.TOr(ht.TNone, ht.TListOf(ht.TNonEmptyString)),
669 8e7078e0 Michael Hanselmann
     "Requested fields; if not given, all are returned"),
670 83f72637 Michael Hanselmann
    ]
671 83f72637 Michael Hanselmann
672 83f72637 Michael Hanselmann
673 792af3ad Renรฉ Nussbaumer
class OpOobCommand(OpCode):
674 eb64da59 Renรฉ Nussbaumer
  """Interact with OOB."""
675 65e183af Michael Hanselmann
  OP_PARAMS = [
676 c4ec0755 Renรฉ Nussbaumer
    ("node_names", ht.EmptyList, ht.TListOf(ht.TNonEmptyString),
677 c4ec0755 Renรฉ Nussbaumer
     "List of nodes to run the OOB command against"),
678 c4ec0755 Renรฉ Nussbaumer
    ("command", None, ht.TElemOf(constants.OOB_COMMANDS),
679 c4ec0755 Renรฉ Nussbaumer
     "OOB command to be run"),
680 c4ec0755 Renรฉ Nussbaumer
    ("timeout", constants.OOB_TIMEOUT, ht.TInt,
681 c4ec0755 Renรฉ Nussbaumer
     "Timeout before the OOB helper will be terminated"),
682 c4ec0755 Renรฉ Nussbaumer
    ("ignore_status", False, ht.TBool,
683 c4ec0755 Renรฉ Nussbaumer
     "Ignores the node offline status for power off"),
684 beff3779 Renรฉ Nussbaumer
    ("power_delay", constants.OOB_POWER_DELAY, ht.TPositiveFloat,
685 beff3779 Renรฉ Nussbaumer
     "Time in seconds to wait between powering on nodes"),
686 eb64da59 Renรฉ Nussbaumer
    ]
687 eb64da59 Renรฉ Nussbaumer
688 eb64da59 Renรฉ Nussbaumer
689 07bd8a51 Iustin Pop
# node opcodes
690 07bd8a51 Iustin Pop
691 73d565a3 Iustin Pop
class OpNodeRemove(OpCode):
692 a7399f66 Iustin Pop
  """Remove a node.
693 a7399f66 Iustin Pop

694 a7399f66 Iustin Pop
  @type node_name: C{str}
695 a7399f66 Iustin Pop
  @ivar node_name: The name of the node to remove. If the node still has
696 a7399f66 Iustin Pop
                   instances on it, the operation will fail.
697 a7399f66 Iustin Pop

698 a7399f66 Iustin Pop
  """
699 60dd1473 Iustin Pop
  OP_DSC_FIELD = "node_name"
700 65e183af Michael Hanselmann
  OP_PARAMS = [
701 65e183af Michael Hanselmann
    _PNodeName,
702 65e183af Michael Hanselmann
    ]
703 a8083063 Iustin Pop
704 a8083063 Iustin Pop
705 d817d49f Iustin Pop
class OpNodeAdd(OpCode):
706 a7399f66 Iustin Pop
  """Add a node to the cluster.
707 a7399f66 Iustin Pop

708 a7399f66 Iustin Pop
  @type node_name: C{str}
709 a7399f66 Iustin Pop
  @ivar node_name: The name of the node to add. This can be a short name,
710 a7399f66 Iustin Pop
                   but it will be expanded to the FQDN.
711 a7399f66 Iustin Pop
  @type primary_ip: IP address
712 a7399f66 Iustin Pop
  @ivar primary_ip: The primary IP of the node. This will be ignored when the
713 a7399f66 Iustin Pop
                    opcode is submitted, but will be filled during the node
714 a7399f66 Iustin Pop
                    add (so it will be visible in the job query).
715 a7399f66 Iustin Pop
  @type secondary_ip: IP address
716 a7399f66 Iustin Pop
  @ivar secondary_ip: The secondary IP of the node. This needs to be passed
717 a7399f66 Iustin Pop
                      if the cluster has been initialized in 'dual-network'
718 a7399f66 Iustin Pop
                      mode, otherwise it must not be given.
719 a7399f66 Iustin Pop
  @type readd: C{bool}
720 a7399f66 Iustin Pop
  @ivar readd: Whether to re-add an existing node to the cluster. If
721 a7399f66 Iustin Pop
               this is not passed, then the operation will abort if the node
722 a7399f66 Iustin Pop
               name is already in the cluster; use this parameter to 'repair'
723 a7399f66 Iustin Pop
               a node that had its configuration broken, or was reinstalled
724 a7399f66 Iustin Pop
               without removal from the cluster.
725 f936c153 Iustin Pop
  @type group: C{str}
726 f936c153 Iustin Pop
  @ivar group: The node group to which this node will belong.
727 fd3d37b6 Iustin Pop
  @type vm_capable: C{bool}
728 fd3d37b6 Iustin Pop
  @ivar vm_capable: The vm_capable node attribute
729 fd3d37b6 Iustin Pop
  @type master_capable: C{bool}
730 fd3d37b6 Iustin Pop
  @ivar master_capable: The master_capable node attribute
731 a7399f66 Iustin Pop

732 a7399f66 Iustin Pop
  """
733 60dd1473 Iustin Pop
  OP_DSC_FIELD = "node_name"
734 65e183af Michael Hanselmann
  OP_PARAMS = [
735 65e183af Michael Hanselmann
    _PNodeName,
736 45d4c81c Michael Hanselmann
    ("primary_ip", None, ht.NoType, "Primary IP address"),
737 45d4c81c Michael Hanselmann
    ("secondary_ip", None, ht.TMaybeString, "Secondary IP address"),
738 45d4c81c Michael Hanselmann
    ("readd", False, ht.TBool, "Whether node is re-added to cluster"),
739 45d4c81c Michael Hanselmann
    ("group", None, ht.TMaybeString, "Initial node group"),
740 45d4c81c Michael Hanselmann
    ("master_capable", None, ht.TMaybeBool,
741 45d4c81c Michael Hanselmann
     "Whether node can become master or master candidate"),
742 45d4c81c Michael Hanselmann
    ("vm_capable", None, ht.TMaybeBool,
743 45d4c81c Michael Hanselmann
     "Whether node can host instances"),
744 45d4c81c Michael Hanselmann
    ("ndparams", None, ht.TMaybeDict, "Node parameters"),
745 65e183af Michael Hanselmann
    ]
746 a8083063 Iustin Pop
747 a8083063 Iustin Pop
748 2237687b Iustin Pop
class OpNodeQuery(OpCode):
749 a8083063 Iustin Pop
  """Compute the list of nodes."""
750 65e183af Michael Hanselmann
  OP_PARAMS = [
751 65e183af Michael Hanselmann
    _POutputFields,
752 45d4c81c Michael Hanselmann
    _PUseLocking,
753 45d4c81c Michael Hanselmann
    ("names", ht.EmptyList, ht.TListOf(ht.TNonEmptyString),
754 45d4c81c Michael Hanselmann
     "Empty list to query all nodes, node names otherwise"),
755 65e183af Michael Hanselmann
    ]
756 a8083063 Iustin Pop
757 a8083063 Iustin Pop
758 8ed55bfd Iustin Pop
class OpNodeQueryvols(OpCode):
759 dcb93971 Michael Hanselmann
  """Get list of volumes on node."""
760 65e183af Michael Hanselmann
  OP_PARAMS = [
761 65e183af Michael Hanselmann
    _POutputFields,
762 45d4c81c Michael Hanselmann
    ("nodes", ht.EmptyList, ht.TListOf(ht.TNonEmptyString),
763 45d4c81c Michael Hanselmann
     "Empty list to query all nodes, node names otherwise"),
764 65e183af Michael Hanselmann
    ]
765 dcb93971 Michael Hanselmann
766 dcb93971 Michael Hanselmann
767 ad8d0595 Iustin Pop
class OpNodeQueryStorage(OpCode):
768 9e5442ce Michael Hanselmann
  """Get information on storage for node(s)."""
769 65e183af Michael Hanselmann
  OP_PARAMS = [
770 65e183af Michael Hanselmann
    _POutputFields,
771 65e183af Michael Hanselmann
    _PStorageType,
772 45d4c81c Michael Hanselmann
    ("nodes", ht.EmptyList, ht.TListOf(ht.TNonEmptyString), "List of nodes"),
773 45d4c81c Michael Hanselmann
    ("name", None, ht.TMaybeString, "Storage name"),
774 9e5442ce Michael Hanselmann
    ]
775 9e5442ce Michael Hanselmann
776 9e5442ce Michael Hanselmann
777 2cee4077 Iustin Pop
class OpNodeModifyStorage(OpCode):
778 099c52ad Iustin Pop
  """Modifies the properies of a storage unit"""
779 65e183af Michael Hanselmann
  OP_PARAMS = [
780 65e183af Michael Hanselmann
    _PNodeName,
781 65e183af Michael Hanselmann
    _PStorageType,
782 45d4c81c Michael Hanselmann
    _PStorageName,
783 45d4c81c Michael Hanselmann
    ("changes", ht.NoDefault, ht.TDict, "Requested changes"),
784 efb8da02 Michael Hanselmann
    ]
785 efb8da02 Michael Hanselmann
786 efb8da02 Michael Hanselmann
787 76aef8fc Michael Hanselmann
class OpRepairNodeStorage(OpCode):
788 76aef8fc Michael Hanselmann
  """Repairs the volume group on a node."""
789 76aef8fc Michael Hanselmann
  OP_DSC_FIELD = "node_name"
790 65e183af Michael Hanselmann
  OP_PARAMS = [
791 65e183af Michael Hanselmann
    _PNodeName,
792 65e183af Michael Hanselmann
    _PStorageType,
793 45d4c81c Michael Hanselmann
    _PStorageName,
794 45d4c81c Michael Hanselmann
    _PIgnoreConsistency,
795 76aef8fc Michael Hanselmann
    ]
796 76aef8fc Michael Hanselmann
797 76aef8fc Michael Hanselmann
798 f13973c4 Iustin Pop
class OpNodeSetParams(OpCode):
799 b31c8676 Iustin Pop
  """Change the parameters of a node."""
800 b31c8676 Iustin Pop
  OP_DSC_FIELD = "node_name"
801 65e183af Michael Hanselmann
  OP_PARAMS = [
802 65e183af Michael Hanselmann
    _PNodeName,
803 65e183af Michael Hanselmann
    _PForce,
804 45d4c81c Michael Hanselmann
    ("master_candidate", None, ht.TMaybeBool,
805 45d4c81c Michael Hanselmann
     "Whether the node should become a master candidate"),
806 45d4c81c Michael Hanselmann
    ("offline", None, ht.TMaybeBool,
807 45d4c81c Michael Hanselmann
     "Whether the node should be marked as offline"),
808 45d4c81c Michael Hanselmann
    ("drained", None, ht.TMaybeBool,
809 45d4c81c Michael Hanselmann
     "Whether the node should be marked as drained"),
810 45d4c81c Michael Hanselmann
    ("auto_promote", False, ht.TBool,
811 45d4c81c Michael Hanselmann
     "Whether node(s) should be promoted to master candidate if necessary"),
812 45d4c81c Michael Hanselmann
    ("master_capable", None, ht.TMaybeBool,
813 45d4c81c Michael Hanselmann
     "Denote whether node can become master or master candidate"),
814 45d4c81c Michael Hanselmann
    ("vm_capable", None, ht.TMaybeBool,
815 45d4c81c Michael Hanselmann
     "Denote whether node can host instances"),
816 45d4c81c Michael Hanselmann
    ("secondary_ip", None, ht.TMaybeString,
817 45d4c81c Michael Hanselmann
     "Change node's secondary IP address"),
818 45d4c81c Michael Hanselmann
    ("ndparams", None, ht.TMaybeDict, "Set node parameters"),
819 45d4c81c Michael Hanselmann
    ("powered", None, ht.TMaybeBool,
820 45d4c81c Michael Hanselmann
     "Whether the node should be marked as powered"),
821 b31c8676 Iustin Pop
    ]
822 b31c8676 Iustin Pop
823 f5118ade Iustin Pop
824 e0d4735f Iustin Pop
class OpNodePowercycle(OpCode):
825 f5118ade Iustin Pop
  """Tries to powercycle a node."""
826 f5118ade Iustin Pop
  OP_DSC_FIELD = "node_name"
827 65e183af Michael Hanselmann
  OP_PARAMS = [
828 65e183af Michael Hanselmann
    _PNodeName,
829 65e183af Michael Hanselmann
    _PForce,
830 f5118ade Iustin Pop
    ]
831 f5118ade Iustin Pop
832 7ffc5a86 Michael Hanselmann
833 5b14a488 Iustin Pop
class OpNodeMigrate(OpCode):
834 80cb875c Michael Hanselmann
  """Migrate all instances from a node."""
835 80cb875c Michael Hanselmann
  OP_DSC_FIELD = "node_name"
836 65e183af Michael Hanselmann
  OP_PARAMS = [
837 65e183af Michael Hanselmann
    _PNodeName,
838 65e183af Michael Hanselmann
    _PMigrationMode,
839 65e183af Michael Hanselmann
    _PMigrationLive,
840 8eb34306 Apollon Oikonomopoulos
    ("iallocator", None, ht.TMaybeString,
841 8eb34306 Apollon Oikonomopoulos
     "Iallocator for deciding the target node for shared-storage instances"),
842 80cb875c Michael Hanselmann
    ]
843 80cb875c Michael Hanselmann
844 80cb875c Michael Hanselmann
845 0ae89533 Iustin Pop
class OpNodeEvacStrategy(OpCode):
846 d6aaa598 Iustin Pop
  """Compute the evacuation strategy for a list of nodes."""
847 d6aaa598 Iustin Pop
  OP_DSC_FIELD = "nodes"
848 65e183af Michael Hanselmann
  OP_PARAMS = [
849 197b323b Michael Hanselmann
    ("nodes", ht.NoDefault, ht.TListOf(ht.TNonEmptyString), None),
850 197b323b Michael Hanselmann
    ("remote_node", None, ht.TMaybeString, None),
851 197b323b Michael Hanselmann
    ("iallocator", None, ht.TMaybeString, None),
852 65e183af Michael Hanselmann
    ]
853 d6aaa598 Iustin Pop
854 d6aaa598 Iustin Pop
855 a8083063 Iustin Pop
# instance opcodes
856 a8083063 Iustin Pop
857 e1530b10 Iustin Pop
class OpInstanceCreate(OpCode):
858 9bf56d77 Michael Hanselmann
  """Create an instance.
859 9bf56d77 Michael Hanselmann

860 9bf56d77 Michael Hanselmann
  @ivar instance_name: Instance name
861 9bf56d77 Michael Hanselmann
  @ivar mode: Instance creation mode (one of L{constants.INSTANCE_CREATE_MODES})
862 9bf56d77 Michael Hanselmann
  @ivar source_handshake: Signed handshake from source (remote import only)
863 9bf56d77 Michael Hanselmann
  @ivar source_x509_ca: Source X509 CA in PEM format (remote import only)
864 9bf56d77 Michael Hanselmann
  @ivar source_instance_name: Previous name of instance (remote import only)
865 dae91d02 Michael Hanselmann
  @ivar source_shutdown_timeout: Shutdown timeout used for source instance
866 dae91d02 Michael Hanselmann
    (remote import only)
867 9bf56d77 Michael Hanselmann

868 9bf56d77 Michael Hanselmann
  """
869 60dd1473 Iustin Pop
  OP_DSC_FIELD = "instance_name"
870 65e183af Michael Hanselmann
  OP_PARAMS = [
871 65e183af Michael Hanselmann
    _PInstanceName,
872 45d4c81c Michael Hanselmann
    _PForceVariant,
873 45d4c81c Michael Hanselmann
    _PWaitForSync,
874 45d4c81c Michael Hanselmann
    _PNameCheck,
875 45d4c81c Michael Hanselmann
    ("beparams", ht.EmptyDict, ht.TDict, "Backend parameters for instance"),
876 526a662a Michael Hanselmann
    ("disks", ht.NoDefault,
877 526a662a Michael Hanselmann
     # TODO: Generate check from constants.IDISK_PARAMS_TYPES
878 526a662a Michael Hanselmann
     ht.TListOf(ht.TDictOf(ht.TElemOf(constants.IDISK_PARAMS),
879 526a662a Michael Hanselmann
                           ht.TOr(ht.TNonEmptyString, ht.TInt))),
880 526a662a Michael Hanselmann
     "Disk descriptions, for example ``[{\"%s\": 100}, {\"%s\": 5}]``;"
881 526a662a Michael Hanselmann
     " each disk definition must contain a ``%s`` value and"
882 526a662a Michael Hanselmann
     " can contain an optional ``%s`` value denoting the disk access mode"
883 526a662a Michael Hanselmann
     " (%s)" %
884 526a662a Michael Hanselmann
     (constants.IDISK_SIZE, constants.IDISK_SIZE, constants.IDISK_SIZE,
885 526a662a Michael Hanselmann
      constants.IDISK_MODE,
886 526a662a Michael Hanselmann
      " or ".join("``%s``" % i for i in sorted(constants.DISK_ACCESS_SET)))),
887 45d4c81c Michael Hanselmann
    ("disk_template", ht.NoDefault, _CheckDiskTemplate, "Disk template"),
888 45d4c81c Michael Hanselmann
    ("file_driver", None, ht.TOr(ht.TNone, ht.TElemOf(constants.FILE_DRIVER)),
889 45d4c81c Michael Hanselmann
     "Driver for file-backed disks"),
890 45d4c81c Michael Hanselmann
    ("file_storage_dir", None, ht.TMaybeString,
891 45d4c81c Michael Hanselmann
     "Directory for storing file-backed disks"),
892 45d4c81c Michael Hanselmann
    ("hvparams", ht.EmptyDict, ht.TDict,
893 45d4c81c Michael Hanselmann
     "Hypervisor parameters for instance, hypervisor-dependent"),
894 45d4c81c Michael Hanselmann
    ("hypervisor", None, ht.TMaybeString, "Hypervisor"),
895 45d4c81c Michael Hanselmann
    ("iallocator", None, ht.TMaybeString,
896 45d4c81c Michael Hanselmann
     "Iallocator for deciding which node(s) to use"),
897 45d4c81c Michael Hanselmann
    ("identify_defaults", False, ht.TBool,
898 45d4c81c Michael Hanselmann
     "Reset instance parameters to default if equal"),
899 45d4c81c Michael Hanselmann
    ("ip_check", True, ht.TBool, _PIpCheckDoc),
900 45d4c81c Michael Hanselmann
    ("mode", ht.NoDefault, ht.TElemOf(constants.INSTANCE_CREATE_MODES),
901 45d4c81c Michael Hanselmann
     "Instance creation mode"),
902 526a662a Michael Hanselmann
    ("nics", ht.NoDefault, ht.TListOf(_TestNicDef),
903 526a662a Michael Hanselmann
     "List of NIC (network interface) definitions, for example"
904 526a662a Michael Hanselmann
     " ``[{}, {}, {\"%s\": \"198.51.100.4\"}]``; each NIC definition can"
905 526a662a Michael Hanselmann
     " contain the optional values %s" %
906 526a662a Michael Hanselmann
     (constants.INIC_IP,
907 526a662a Michael Hanselmann
      ", ".join("``%s``" % i for i in sorted(constants.INIC_PARAMS)))),
908 45d4c81c Michael Hanselmann
    ("no_install", None, ht.TMaybeBool,
909 45d4c81c Michael Hanselmann
     "Do not install the OS (will disable automatic start)"),
910 45d4c81c Michael Hanselmann
    ("osparams", ht.EmptyDict, ht.TDict, "OS parameters for instance"),
911 45d4c81c Michael Hanselmann
    ("os_type", None, ht.TMaybeString, "Operating system"),
912 45d4c81c Michael Hanselmann
    ("pnode", None, ht.TMaybeString, "Primary node"),
913 45d4c81c Michael Hanselmann
    ("snode", None, ht.TMaybeString, "Secondary node"),
914 45d4c81c Michael Hanselmann
    ("source_handshake", None, ht.TOr(ht.TList, ht.TNone),
915 45d4c81c Michael Hanselmann
     "Signed handshake from source (remote import only)"),
916 45d4c81c Michael Hanselmann
    ("source_instance_name", None, ht.TMaybeString,
917 45d4c81c Michael Hanselmann
     "Source instance name (remote import only)"),
918 65e183af Michael Hanselmann
    ("source_shutdown_timeout", constants.DEFAULT_SHUTDOWN_TIMEOUT,
919 526a662a Michael Hanselmann
     ht.TPositiveInt,
920 526a662a Michael Hanselmann
     "How long source instance was given to shut down (remote import only)"),
921 45d4c81c Michael Hanselmann
    ("source_x509_ca", None, ht.TMaybeString,
922 45d4c81c Michael Hanselmann
     "Source X509 CA in PEM format (remote import only)"),
923 45d4c81c Michael Hanselmann
    ("src_node", None, ht.TMaybeString, "Source node for import"),
924 45d4c81c Michael Hanselmann
    ("src_path", None, ht.TMaybeString, "Source directory for import"),
925 45d4c81c Michael Hanselmann
    ("start", True, ht.TBool, "Whether to start instance after creation"),
926 3b6d8c9b Iustin Pop
    ]
927 a8083063 Iustin Pop
928 a8083063 Iustin Pop
929 5073fd8f Iustin Pop
class OpInstanceReinstall(OpCode):
930 fdc267f4 Iustin Pop
  """Reinstall an instance's OS."""
931 60dd1473 Iustin Pop
  OP_DSC_FIELD = "instance_name"
932 65e183af Michael Hanselmann
  OP_PARAMS = [
933 65e183af Michael Hanselmann
    _PInstanceName,
934 45d4c81c Michael Hanselmann
    _PForceVariant,
935 45d4c81c Michael Hanselmann
    ("os_type", None, ht.TMaybeString, "Instance operating system"),
936 45d4c81c Michael Hanselmann
    ("osparams", None, ht.TMaybeDict, "Temporary OS parameters"),
937 65e183af Michael Hanselmann
    ]
938 fe7b0351 Michael Hanselmann
939 fe7b0351 Michael Hanselmann
940 3cd2d4b1 Iustin Pop
class OpInstanceRemove(OpCode):
941 a8083063 Iustin Pop
  """Remove an instance."""
942 60dd1473 Iustin Pop
  OP_DSC_FIELD = "instance_name"
943 65e183af Michael Hanselmann
  OP_PARAMS = [
944 65e183af Michael Hanselmann
    _PInstanceName,
945 65e183af Michael Hanselmann
    _PShutdownTimeout,
946 45d4c81c Michael Hanselmann
    ("ignore_failures", False, ht.TBool,
947 45d4c81c Michael Hanselmann
     "Whether to ignore failures during removal"),
948 fc1baca9 Michael Hanselmann
    ]
949 a8083063 Iustin Pop
950 a8083063 Iustin Pop
951 5659e2e2 Iustin Pop
class OpInstanceRename(OpCode):
952 decd5f45 Iustin Pop
  """Rename an instance."""
953 65e183af Michael Hanselmann
  OP_PARAMS = [
954 65e183af Michael Hanselmann
    _PInstanceName,
955 45d4c81c Michael Hanselmann
    _PNameCheck,
956 45d4c81c Michael Hanselmann
    ("new_name", ht.NoDefault, ht.TNonEmptyString, "New instance name"),
957 45d4c81c Michael Hanselmann
    ("ip_check", False, ht.TBool, _PIpCheckDoc),
958 4f05fd3b Iustin Pop
    ]
959 decd5f45 Iustin Pop
960 decd5f45 Iustin Pop
961 c873d91c Iustin Pop
class OpInstanceStartup(OpCode):
962 fdc267f4 Iustin Pop
  """Startup an instance."""
963 60dd1473 Iustin Pop
  OP_DSC_FIELD = "instance_name"
964 65e183af Michael Hanselmann
  OP_PARAMS = [
965 65e183af Michael Hanselmann
    _PInstanceName,
966 65e183af Michael Hanselmann
    _PForce,
967 65e183af Michael Hanselmann
    _PIgnoreOfflineNodes,
968 45d4c81c Michael Hanselmann
    ("hvparams", ht.EmptyDict, ht.TDict,
969 45d4c81c Michael Hanselmann
     "Temporary hypervisor parameters, hypervisor-dependent"),
970 45d4c81c Michael Hanselmann
    ("beparams", ht.EmptyDict, ht.TDict, "Temporary backend parameters"),
971 4f05fd3b Iustin Pop
    ]
972 a8083063 Iustin Pop
973 a8083063 Iustin Pop
974 ee3e37a7 Iustin Pop
class OpInstanceShutdown(OpCode):
975 fdc267f4 Iustin Pop
  """Shutdown an instance."""
976 60dd1473 Iustin Pop
  OP_DSC_FIELD = "instance_name"
977 65e183af Michael Hanselmann
  OP_PARAMS = [
978 65e183af Michael Hanselmann
    _PInstanceName,
979 65e183af Michael Hanselmann
    _PIgnoreOfflineNodes,
980 45d4c81c Michael Hanselmann
    ("timeout", constants.DEFAULT_SHUTDOWN_TIMEOUT, ht.TPositiveInt,
981 45d4c81c Michael Hanselmann
     "How long to wait for instance to shut down"),
982 b44bd844 Michael Hanselmann
    ]
983 a8083063 Iustin Pop
984 a8083063 Iustin Pop
985 90ab1a95 Iustin Pop
class OpInstanceReboot(OpCode):
986 bf6929a2 Alexander Schreiber
  """Reboot an instance."""
987 60dd1473 Iustin Pop
  OP_DSC_FIELD = "instance_name"
988 65e183af Michael Hanselmann
  OP_PARAMS = [
989 65e183af Michael Hanselmann
    _PInstanceName,
990 65e183af Michael Hanselmann
    _PShutdownTimeout,
991 45d4c81c Michael Hanselmann
    ("ignore_secondaries", False, ht.TBool,
992 45d4c81c Michael Hanselmann
     "Whether to start the instance even if secondary disks are failing"),
993 45d4c81c Michael Hanselmann
    ("reboot_type", ht.NoDefault, ht.TElemOf(constants.REBOOT_TYPES),
994 45d4c81c Michael Hanselmann
     "How to reboot instance"),
995 4f05fd3b Iustin Pop
    ]
996 bf6929a2 Alexander Schreiber
997 bf6929a2 Alexander Schreiber
998 668f755d Iustin Pop
class OpInstanceReplaceDisks(OpCode):
999 fdc267f4 Iustin Pop
  """Replace the disks of an instance."""
1000 60dd1473 Iustin Pop
  OP_DSC_FIELD = "instance_name"
1001 65e183af Michael Hanselmann
  OP_PARAMS = [
1002 65e183af Michael Hanselmann
    _PInstanceName,
1003 45d4c81c Michael Hanselmann
    ("mode", ht.NoDefault, ht.TElemOf(constants.REPLACE_MODES),
1004 45d4c81c Michael Hanselmann
     "Replacement mode"),
1005 45d4c81c Michael Hanselmann
    ("disks", ht.EmptyList, ht.TListOf(ht.TPositiveInt),
1006 45d4c81c Michael Hanselmann
     "Disk indexes"),
1007 45d4c81c Michael Hanselmann
    ("remote_node", None, ht.TMaybeString, "New secondary node"),
1008 45d4c81c Michael Hanselmann
    ("iallocator", None, ht.TMaybeString,
1009 45d4c81c Michael Hanselmann
     "Iallocator for deciding new secondary node"),
1010 45d4c81c Michael Hanselmann
    ("early_release", False, ht.TBool,
1011 45d4c81c Michael Hanselmann
     "Whether to release locks as soon as possible"),
1012 4f05fd3b Iustin Pop
    ]
1013 a8083063 Iustin Pop
1014 a8083063 Iustin Pop
1015 019dbee1 Iustin Pop
class OpInstanceFailover(OpCode):
1016 a8083063 Iustin Pop
  """Failover an instance."""
1017 60dd1473 Iustin Pop
  OP_DSC_FIELD = "instance_name"
1018 65e183af Michael Hanselmann
  OP_PARAMS = [
1019 65e183af Michael Hanselmann
    _PInstanceName,
1020 65e183af Michael Hanselmann
    _PShutdownTimeout,
1021 45d4c81c Michael Hanselmann
    _PIgnoreConsistency,
1022 8eb34306 Apollon Oikonomopoulos
    ("iallocator", None, ht.TMaybeString,
1023 8eb34306 Apollon Oikonomopoulos
     "Iallocator for deciding the target node for shared-storage instances"),
1024 8eb34306 Apollon Oikonomopoulos
    ("target_node", None, ht.TMaybeString,
1025 8eb34306 Apollon Oikonomopoulos
     "Target node for shared-storage instances"),
1026 17c3f802 Guido Trotter
    ]
1027 a8083063 Iustin Pop
1028 a8083063 Iustin Pop
1029 75c866c2 Iustin Pop
class OpInstanceMigrate(OpCode):
1030 53c776b5 Iustin Pop
  """Migrate an instance.
1031 53c776b5 Iustin Pop

1032 53c776b5 Iustin Pop
  This migrates (without shutting down an instance) to its secondary
1033 53c776b5 Iustin Pop
  node.
1034 53c776b5 Iustin Pop

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

1038 53c776b5 Iustin Pop
  """
1039 ee69c97f Iustin Pop
  OP_DSC_FIELD = "instance_name"
1040 65e183af Michael Hanselmann
  OP_PARAMS = [
1041 65e183af Michael Hanselmann
    _PInstanceName,
1042 65e183af Michael Hanselmann
    _PMigrationMode,
1043 65e183af Michael Hanselmann
    _PMigrationLive,
1044 45d4c81c Michael Hanselmann
    ("cleanup", False, ht.TBool,
1045 45d4c81c Michael Hanselmann
     "Whether a previously failed migration should be cleaned up"),
1046 8eb34306 Apollon Oikonomopoulos
    ("iallocator", None, ht.TMaybeString,
1047 8eb34306 Apollon Oikonomopoulos
     "Iallocator for deciding the target node for shared-storage instances"),
1048 8eb34306 Apollon Oikonomopoulos
    ("target_node", None, ht.TMaybeString,
1049 8eb34306 Apollon Oikonomopoulos
     "Target node for shared-storage instances"),
1050 65e183af Michael Hanselmann
    ]
1051 53c776b5 Iustin Pop
1052 53c776b5 Iustin Pop
1053 0091b480 Iustin Pop
class OpInstanceMove(OpCode):
1054 313bcead Iustin Pop
  """Move an instance.
1055 313bcead Iustin Pop

1056 313bcead Iustin Pop
  This move (with shutting down an instance and data copying) to an
1057 313bcead Iustin Pop
  arbitrary node.
1058 313bcead Iustin Pop

1059 313bcead Iustin Pop
  @ivar instance_name: the name of the instance
1060 313bcead Iustin Pop
  @ivar target_node: the destination node
1061 313bcead Iustin Pop

1062 313bcead Iustin Pop
  """
1063 313bcead Iustin Pop
  OP_DSC_FIELD = "instance_name"
1064 65e183af Michael Hanselmann
  OP_PARAMS = [
1065 65e183af Michael Hanselmann
    _PInstanceName,
1066 65e183af Michael Hanselmann
    _PShutdownTimeout,
1067 45d4c81c Michael Hanselmann
    ("target_node", ht.NoDefault, ht.TNonEmptyString, "Target node"),
1068 154b9580 Balazs Lecz
    ]
1069 313bcead Iustin Pop
1070 313bcead Iustin Pop
1071 cc0dec7b Iustin Pop
class OpInstanceConsole(OpCode):
1072 fdc267f4 Iustin Pop
  """Connect to an instance's console."""
1073 60dd1473 Iustin Pop
  OP_DSC_FIELD = "instance_name"
1074 65e183af Michael Hanselmann
  OP_PARAMS = [
1075 65e183af Michael Hanselmann
    _PInstanceName
1076 65e183af Michael Hanselmann
    ]
1077 a8083063 Iustin Pop
1078 a8083063 Iustin Pop
1079 83f5d475 Iustin Pop
class OpInstanceActivateDisks(OpCode):
1080 fdc267f4 Iustin Pop
  """Activate an instance's disks."""
1081 60dd1473 Iustin Pop
  OP_DSC_FIELD = "instance_name"
1082 65e183af Michael Hanselmann
  OP_PARAMS = [
1083 65e183af Michael Hanselmann
    _PInstanceName,
1084 45d4c81c Michael Hanselmann
    ("ignore_size", False, ht.TBool, "Whether to ignore recorded size"),
1085 65e183af Michael Hanselmann
    ]
1086 a8083063 Iustin Pop
1087 a8083063 Iustin Pop
1088 e176281f Iustin Pop
class OpInstanceDeactivateDisks(OpCode):
1089 fdc267f4 Iustin Pop
  """Deactivate an instance's disks."""
1090 60dd1473 Iustin Pop
  OP_DSC_FIELD = "instance_name"
1091 65e183af Michael Hanselmann
  OP_PARAMS = [
1092 c9c41373 Iustin Pop
    _PInstanceName,
1093 c9c41373 Iustin Pop
    _PForce,
1094 65e183af Michael Hanselmann
    ]
1095 a8083063 Iustin Pop
1096 a8083063 Iustin Pop
1097 6b273e78 Iustin Pop
class OpInstanceRecreateDisks(OpCode):
1098 bd315bfa Iustin Pop
  """Deactivate an instance's disks."""
1099 bd315bfa Iustin Pop
  OP_DSC_FIELD = "instance_name"
1100 65e183af Michael Hanselmann
  OP_PARAMS = [
1101 65e183af Michael Hanselmann
    _PInstanceName,
1102 45d4c81c Michael Hanselmann
    ("disks", ht.EmptyList, ht.TListOf(ht.TPositiveInt),
1103 45d4c81c Michael Hanselmann
     "List of disk indexes"),
1104 65e183af Michael Hanselmann
    ]
1105 bd315bfa Iustin Pop
1106 bd315bfa Iustin Pop
1107 f2af0bec Iustin Pop
class OpInstanceQuery(OpCode):
1108 a8083063 Iustin Pop
  """Compute the list of instances."""
1109 65e183af Michael Hanselmann
  OP_PARAMS = [
1110 65e183af Michael Hanselmann
    _POutputFields,
1111 45d4c81c Michael Hanselmann
    _PUseLocking,
1112 45d4c81c Michael Hanselmann
    ("names", ht.EmptyList, ht.TListOf(ht.TNonEmptyString),
1113 45d4c81c Michael Hanselmann
     "Empty list to query all instances, instance names otherwise"),
1114 65e183af Michael Hanselmann
    ]
1115 a8083063 Iustin Pop
1116 a8083063 Iustin Pop
1117 dc28c4e4 Iustin Pop
class OpInstanceQueryData(OpCode):
1118 a8083063 Iustin Pop
  """Compute the run-time status of instances."""
1119 65e183af Michael Hanselmann
  OP_PARAMS = [
1120 197b323b Michael Hanselmann
    ("instances", ht.EmptyList, ht.TListOf(ht.TNonEmptyString), None),
1121 197b323b Michael Hanselmann
    ("static", False, ht.TBool, None),
1122 65e183af Michael Hanselmann
    ]
1123 a8083063 Iustin Pop
1124 a8083063 Iustin Pop
1125 9a3cc7ae Iustin Pop
class OpInstanceSetParams(OpCode):
1126 a8083063 Iustin Pop
  """Change the parameters of an instance."""
1127 60dd1473 Iustin Pop
  OP_DSC_FIELD = "instance_name"
1128 65e183af Michael Hanselmann
  OP_PARAMS = [
1129 65e183af Michael Hanselmann
    _PInstanceName,
1130 65e183af Michael Hanselmann
    _PForce,
1131 45d4c81c Michael Hanselmann
    _PForceVariant,
1132 526a662a Michael Hanselmann
    # TODO: Use _TestNicDef
1133 45d4c81c Michael Hanselmann
    ("nics", ht.EmptyList, ht.TList,
1134 45d4c81c Michael Hanselmann
     "List of NIC changes. Each item is of the form ``(op, settings)``."
1135 45d4c81c Michael Hanselmann
     " ``op`` can be ``%s`` to add a new NIC with the specified settings,"
1136 45d4c81c Michael Hanselmann
     " ``%s`` to remove the last NIC or a number to modify the settings"
1137 45d4c81c Michael Hanselmann
     " of the NIC with that index." %
1138 45d4c81c Michael Hanselmann
     (constants.DDM_ADD, constants.DDM_REMOVE)),
1139 45d4c81c Michael Hanselmann
    ("disks", ht.EmptyList, ht.TList, "List of disk changes. See ``nics``."),
1140 45d4c81c Michael Hanselmann
    ("beparams", ht.EmptyDict, ht.TDict, "Per-instance backend parameters"),
1141 45d4c81c Michael Hanselmann
    ("hvparams", ht.EmptyDict, ht.TDict,
1142 45d4c81c Michael Hanselmann
     "Per-instance hypervisor parameters, hypervisor-dependent"),
1143 45d4c81c Michael Hanselmann
    ("disk_template", None, ht.TOr(ht.TNone, _CheckDiskTemplate),
1144 45d4c81c Michael Hanselmann
     "Disk template for instance"),
1145 45d4c81c Michael Hanselmann
    ("remote_node", None, ht.TMaybeString,
1146 45d4c81c Michael Hanselmann
     "Secondary node (used when changing disk template)"),
1147 45d4c81c Michael Hanselmann
    ("os_name", None, ht.TMaybeString,
1148 45d4c81c Michael Hanselmann
     "Change instance's OS name. Does not reinstall the instance."),
1149 45d4c81c Michael Hanselmann
    ("osparams", None, ht.TMaybeDict, "Per-instance OS parameters"),
1150 973d7867 Iustin Pop
    ]
1151 a8083063 Iustin Pop
1152 a8083063 Iustin Pop
1153 60472d29 Iustin Pop
class OpInstanceGrowDisk(OpCode):
1154 8729e0d7 Iustin Pop
  """Grow a disk of an instance."""
1155 60dd1473 Iustin Pop
  OP_DSC_FIELD = "instance_name"
1156 65e183af Michael Hanselmann
  OP_PARAMS = [
1157 65e183af Michael Hanselmann
    _PInstanceName,
1158 45d4c81c Michael Hanselmann
    _PWaitForSync,
1159 45d4c81c Michael Hanselmann
    ("disk", ht.NoDefault, ht.TInt, "Disk index"),
1160 45d4c81c Michael Hanselmann
    ("amount", ht.NoDefault, ht.TInt,
1161 45d4c81c Michael Hanselmann
     "Amount of disk space to add (megabytes)"),
1162 4f05fd3b Iustin Pop
    ]
1163 8729e0d7 Iustin Pop
1164 8729e0d7 Iustin Pop
1165 70a6a926 Adeodato Simo
# Node group opcodes
1166 70a6a926 Adeodato Simo
1167 fabf1731 Iustin Pop
class OpGroupAdd(OpCode):
1168 b1ee5610 Adeodato Simo
  """Add a node group to the cluster."""
1169 b1ee5610 Adeodato Simo
  OP_DSC_FIELD = "group_name"
1170 65e183af Michael Hanselmann
  OP_PARAMS = [
1171 65e183af Michael Hanselmann
    _PGroupName,
1172 45d4c81c Michael Hanselmann
    _PNodeGroupAllocPolicy,
1173 45d4c81c Michael Hanselmann
    _PGroupNodeParams,
1174 483be60d Adeodato Simo
    ]
1175 b1ee5610 Adeodato Simo
1176 b1ee5610 Adeodato Simo
1177 934704ae Iustin Pop
class OpGroupAssignNodes(OpCode):
1178 96276ae7 Adeodato Simo
  """Assign nodes to a node group."""
1179 96276ae7 Adeodato Simo
  OP_DSC_FIELD = "group_name"
1180 96276ae7 Adeodato Simo
  OP_PARAMS = [
1181 96276ae7 Adeodato Simo
    _PGroupName,
1182 96276ae7 Adeodato Simo
    _PForce,
1183 45d4c81c Michael Hanselmann
    ("nodes", ht.NoDefault, ht.TListOf(ht.TNonEmptyString),
1184 45d4c81c Michael Hanselmann
     "List of nodes to assign"),
1185 96276ae7 Adeodato Simo
    ]
1186 96276ae7 Adeodato Simo
1187 96276ae7 Adeodato Simo
1188 d4d654bd Iustin Pop
class OpGroupQuery(OpCode):
1189 70a6a926 Adeodato Simo
  """Compute the list of node groups."""
1190 65e183af Michael Hanselmann
  OP_PARAMS = [
1191 65e183af Michael Hanselmann
    _POutputFields,
1192 45d4c81c Michael Hanselmann
    ("names", ht.EmptyList, ht.TListOf(ht.TNonEmptyString),
1193 45d4c81c Michael Hanselmann
     "Empty list to query all groups, group names otherwise"),
1194 65e183af Michael Hanselmann
    ]
1195 70a6a926 Adeodato Simo
1196 70a6a926 Adeodato Simo
1197 7cbf74f0 Iustin Pop
class OpGroupSetParams(OpCode):
1198 4da7909a Adeodato Simo
  """Change the parameters of a node group."""
1199 4da7909a Adeodato Simo
  OP_DSC_FIELD = "group_name"
1200 65e183af Michael Hanselmann
  OP_PARAMS = [
1201 65e183af Michael Hanselmann
    _PGroupName,
1202 45d4c81c Michael Hanselmann
    _PNodeGroupAllocPolicy,
1203 45d4c81c Michael Hanselmann
    _PGroupNodeParams,
1204 4da7909a Adeodato Simo
    ]
1205 4da7909a Adeodato Simo
1206 4da7909a Adeodato Simo
1207 4d1baa51 Iustin Pop
class OpGroupRemove(OpCode):
1208 94bd652a Adeodato Simo
  """Remove a node group from the cluster."""
1209 94bd652a Adeodato Simo
  OP_DSC_FIELD = "group_name"
1210 65e183af Michael Hanselmann
  OP_PARAMS = [
1211 65e183af Michael Hanselmann
    _PGroupName,
1212 65e183af Michael Hanselmann
    ]
1213 94bd652a Adeodato Simo
1214 94bd652a Adeodato Simo
1215 a8173e82 Iustin Pop
class OpGroupRename(OpCode):
1216 4fe5cf90 Adeodato Simo
  """Rename a node group in the cluster."""
1217 65e183af Michael Hanselmann
  OP_PARAMS = [
1218 12da663a Michael Hanselmann
    _PGroupName,
1219 12da663a Michael Hanselmann
    ("new_name", ht.NoDefault, ht.TNonEmptyString, "New group name"),
1220 65e183af Michael Hanselmann
    ]
1221 4fe5cf90 Adeodato Simo
1222 4fe5cf90 Adeodato Simo
1223 a8083063 Iustin Pop
# OS opcodes
1224 da2d02e7 Iustin Pop
class OpOsDiagnose(OpCode):
1225 a8083063 Iustin Pop
  """Compute the list of guest operating systems."""
1226 65e183af Michael Hanselmann
  OP_PARAMS = [
1227 65e183af Michael Hanselmann
    _POutputFields,
1228 45d4c81c Michael Hanselmann
    ("names", ht.EmptyList, ht.TListOf(ht.TNonEmptyString),
1229 45d4c81c Michael Hanselmann
     "Which operating systems to diagnose"),
1230 65e183af Michael Hanselmann
    ]
1231 a8083063 Iustin Pop
1232 7c0d6283 Michael Hanselmann
1233 a8083063 Iustin Pop
# Exports opcodes
1234 7ca2d4d8 Iustin Pop
class OpBackupQuery(OpCode):
1235 a8083063 Iustin Pop
  """Compute the list of exported images."""
1236 65e183af Michael Hanselmann
  OP_PARAMS = [
1237 45d4c81c Michael Hanselmann
    _PUseLocking,
1238 45d4c81c Michael Hanselmann
    ("nodes", ht.EmptyList, ht.TListOf(ht.TNonEmptyString),
1239 45d4c81c Michael Hanselmann
     "Empty list to query all nodes, node names otherwise"),
1240 65e183af Michael Hanselmann
    ]
1241 a8083063 Iustin Pop
1242 7c0d6283 Michael Hanselmann
1243 71910715 Iustin Pop
class OpBackupPrepare(OpCode):
1244 1410fa8d Michael Hanselmann
  """Prepares an instance export.
1245 1410fa8d Michael Hanselmann

1246 1410fa8d Michael Hanselmann
  @ivar instance_name: Instance name
1247 1410fa8d Michael Hanselmann
  @ivar mode: Export mode (one of L{constants.EXPORT_MODES})
1248 1410fa8d Michael Hanselmann

1249 1410fa8d Michael Hanselmann
  """
1250 1410fa8d Michael Hanselmann
  OP_DSC_FIELD = "instance_name"
1251 65e183af Michael Hanselmann
  OP_PARAMS = [
1252 65e183af Michael Hanselmann
    _PInstanceName,
1253 45d4c81c Michael Hanselmann
    ("mode", ht.NoDefault, ht.TElemOf(constants.EXPORT_MODES),
1254 45d4c81c Michael Hanselmann
     "Export mode"),
1255 1410fa8d Michael Hanselmann
    ]
1256 1410fa8d Michael Hanselmann
1257 1410fa8d Michael Hanselmann
1258 4ff922a2 Iustin Pop
class OpBackupExport(OpCode):
1259 4a96f1d1 Michael Hanselmann
  """Export an instance.
1260 4a96f1d1 Michael Hanselmann

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

1267 4a96f1d1 Michael Hanselmann
  @ivar mode: Export mode (one of L{constants.EXPORT_MODES})
1268 4a96f1d1 Michael Hanselmann
  @ivar target_node: Export destination
1269 4a96f1d1 Michael Hanselmann
  @ivar x509_key_name: X509 key to use (remote export only)
1270 4a96f1d1 Michael Hanselmann
  @ivar destination_x509_ca: Destination X509 CA in PEM format (remote export
1271 4a96f1d1 Michael Hanselmann
                             only)
1272 4a96f1d1 Michael Hanselmann

1273 4a96f1d1 Michael Hanselmann
  """
1274 60dd1473 Iustin Pop
  OP_DSC_FIELD = "instance_name"
1275 65e183af Michael Hanselmann
  OP_PARAMS = [
1276 65e183af Michael Hanselmann
    _PInstanceName,
1277 65e183af Michael Hanselmann
    _PShutdownTimeout,
1278 4a96f1d1 Michael Hanselmann
    # TODO: Rename target_node as it changes meaning for different export modes
1279 4a96f1d1 Michael Hanselmann
    # (e.g. "destination")
1280 45d4c81c Michael Hanselmann
    ("target_node", ht.NoDefault, ht.TOr(ht.TNonEmptyString, ht.TList),
1281 45d4c81c Michael Hanselmann
     "Destination information, depends on export mode"),
1282 45d4c81c Michael Hanselmann
    ("shutdown", True, ht.TBool, "Whether to shutdown instance before export"),
1283 45d4c81c Michael Hanselmann
    ("remove_instance", False, ht.TBool,
1284 45d4c81c Michael Hanselmann
     "Whether to remove instance after export"),
1285 45d4c81c Michael Hanselmann
    ("ignore_remove_failures", False, ht.TBool,
1286 45d4c81c Michael Hanselmann
     "Whether to ignore failures while removing instances"),
1287 45d4c81c Michael Hanselmann
    ("mode", constants.EXPORT_MODE_LOCAL, ht.TElemOf(constants.EXPORT_MODES),
1288 45d4c81c Michael Hanselmann
     "Export mode"),
1289 45d4c81c Michael Hanselmann
    ("x509_key_name", None, ht.TOr(ht.TList, ht.TNone),
1290 45d4c81c Michael Hanselmann
     "Name of X509 key (remote export only)"),
1291 45d4c81c Michael Hanselmann
    ("destination_x509_ca", None, ht.TMaybeString,
1292 45d4c81c Michael Hanselmann
     "Destination X509 CA (remote export only)"),
1293 17c3f802 Guido Trotter
    ]
1294 5c947f38 Iustin Pop
1295 0a7bed64 Michael Hanselmann
1296 ca5890ad Iustin Pop
class OpBackupRemove(OpCode):
1297 9ac99fda Guido Trotter
  """Remove an instance's export."""
1298 60dd1473 Iustin Pop
  OP_DSC_FIELD = "instance_name"
1299 65e183af Michael Hanselmann
  OP_PARAMS = [
1300 65e183af Michael Hanselmann
    _PInstanceName,
1301 65e183af Michael Hanselmann
    ]
1302 5c947f38 Iustin Pop
1303 0a7bed64 Michael Hanselmann
1304 5c947f38 Iustin Pop
# Tags opcodes
1305 c6afb1ca Iustin Pop
class OpTagsGet(OpCode):
1306 5c947f38 Iustin Pop
  """Returns the tags of the given object."""
1307 60dd1473 Iustin Pop
  OP_DSC_FIELD = "name"
1308 65e183af Michael Hanselmann
  OP_PARAMS = [
1309 65e183af Michael Hanselmann
    _PTagKind,
1310 65e183af Michael Hanselmann
    # Name is only meaningful for nodes and instances
1311 197b323b Michael Hanselmann
    ("name", ht.NoDefault, ht.TMaybeString, None),
1312 65e183af Michael Hanselmann
    ]
1313 5c947f38 Iustin Pop
1314 5c947f38 Iustin Pop
1315 715462e7 Iustin Pop
class OpTagsSearch(OpCode):
1316 73415719 Iustin Pop
  """Searches the tags in the cluster for a given pattern."""
1317 60dd1473 Iustin Pop
  OP_DSC_FIELD = "pattern"
1318 65e183af Michael Hanselmann
  OP_PARAMS = [
1319 197b323b Michael Hanselmann
    ("pattern", ht.NoDefault, ht.TNonEmptyString, None),
1320 65e183af Michael Hanselmann
    ]
1321 73415719 Iustin Pop
1322 73415719 Iustin Pop
1323 d1602edc Iustin Pop
class OpTagsSet(OpCode):
1324 f27302fa Iustin Pop
  """Add a list of tags on a given object."""
1325 65e183af Michael Hanselmann
  OP_PARAMS = [
1326 65e183af Michael Hanselmann
    _PTagKind,
1327 65e183af Michael Hanselmann
    _PTags,
1328 65e183af Michael Hanselmann
    # Name is only meaningful for nodes and instances
1329 197b323b Michael Hanselmann
    ("name", ht.NoDefault, ht.TMaybeString, None),
1330 65e183af Michael Hanselmann
    ]
1331 5c947f38 Iustin Pop
1332 5c947f38 Iustin Pop
1333 3f0ab95f Iustin Pop
class OpTagsDel(OpCode):
1334 f27302fa Iustin Pop
  """Remove a list of tags from a given object."""
1335 65e183af Michael Hanselmann
  OP_PARAMS = [
1336 65e183af Michael Hanselmann
    _PTagKind,
1337 65e183af Michael Hanselmann
    _PTags,
1338 65e183af Michael Hanselmann
    # Name is only meaningful for nodes and instances
1339 197b323b Michael Hanselmann
    ("name", ht.NoDefault, ht.TMaybeString, None),
1340 65e183af Michael Hanselmann
    ]
1341 06009e27 Iustin Pop
1342 06009e27 Iustin Pop
# Test opcodes
1343 06009e27 Iustin Pop
class OpTestDelay(OpCode):
1344 06009e27 Iustin Pop
  """Sleeps for a configured amount of time.
1345 06009e27 Iustin Pop

1346 06009e27 Iustin Pop
  This is used just for debugging and testing.
1347 06009e27 Iustin Pop

1348 06009e27 Iustin Pop
  Parameters:
1349 06009e27 Iustin Pop
    - duration: the time to sleep
1350 06009e27 Iustin Pop
    - on_master: if true, sleep on the master
1351 06009e27 Iustin Pop
    - on_nodes: list of nodes in which to sleep
1352 06009e27 Iustin Pop

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

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

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

1363 06009e27 Iustin Pop
  """
1364 60dd1473 Iustin Pop
  OP_DSC_FIELD = "duration"
1365 65e183af Michael Hanselmann
  OP_PARAMS = [
1366 197b323b Michael Hanselmann
    ("duration", ht.NoDefault, ht.TFloat, None),
1367 197b323b Michael Hanselmann
    ("on_master", True, ht.TBool, None),
1368 197b323b Michael Hanselmann
    ("on_nodes", ht.EmptyList, ht.TListOf(ht.TNonEmptyString), None),
1369 197b323b Michael Hanselmann
    ("repeat", 0, ht.TPositiveInt, None),
1370 65e183af Michael Hanselmann
    ]
1371 d61df03e Iustin Pop
1372 d61df03e Iustin Pop
1373 d61df03e Iustin Pop
class OpTestAllocator(OpCode):
1374 d61df03e Iustin Pop
  """Allocator framework testing.
1375 d61df03e Iustin Pop

1376 d61df03e Iustin Pop
  This opcode has two modes:
1377 d61df03e Iustin Pop
    - gather and return allocator input for a given mode (allocate new
1378 d61df03e Iustin Pop
      or replace secondary) and a given instance definition (direction
1379 d61df03e Iustin Pop
      'in')
1380 d61df03e Iustin Pop
    - run a selected allocator for a given operation (as above) and
1381 d61df03e Iustin Pop
      return the allocator output (direction 'out')
1382 d61df03e Iustin Pop

1383 d61df03e Iustin Pop
  """
1384 60dd1473 Iustin Pop
  OP_DSC_FIELD = "allocator"
1385 65e183af Michael Hanselmann
  OP_PARAMS = [
1386 65e183af Michael Hanselmann
    ("direction", ht.NoDefault,
1387 197b323b Michael Hanselmann
     ht.TElemOf(constants.VALID_IALLOCATOR_DIRECTIONS), None),
1388 197b323b Michael Hanselmann
    ("mode", ht.NoDefault, ht.TElemOf(constants.VALID_IALLOCATOR_MODES), None),
1389 197b323b Michael Hanselmann
    ("name", ht.NoDefault, ht.TNonEmptyString, None),
1390 65e183af Michael Hanselmann
    ("nics", ht.NoDefault, ht.TOr(ht.TNone, ht.TListOf(
1391 45d4c81c Michael Hanselmann
     ht.TDictOf(ht.TElemOf(["mac", "ip", "bridge"]),
1392 45d4c81c Michael Hanselmann
                ht.TOr(ht.TNone, ht.TNonEmptyString)))), None),
1393 197b323b Michael Hanselmann
    ("disks", ht.NoDefault, ht.TOr(ht.TNone, ht.TList), None),
1394 197b323b Michael Hanselmann
    ("hypervisor", None, ht.TMaybeString, None),
1395 197b323b Michael Hanselmann
    ("allocator", None, ht.TMaybeString, None),
1396 197b323b Michael Hanselmann
    ("tags", ht.EmptyList, ht.TListOf(ht.TNonEmptyString), None),
1397 197b323b Michael Hanselmann
    ("mem_size", None, ht.TOr(ht.TNone, ht.TPositiveInt), None),
1398 197b323b Michael Hanselmann
    ("vcpus", None, ht.TOr(ht.TNone, ht.TPositiveInt), None),
1399 197b323b Michael Hanselmann
    ("os", None, ht.TMaybeString, None),
1400 197b323b Michael Hanselmann
    ("disk_template", None, ht.TMaybeString, None),
1401 45d4c81c Michael Hanselmann
    ("evac_nodes", None, ht.TOr(ht.TNone, ht.TListOf(ht.TNonEmptyString)),
1402 45d4c81c Michael Hanselmann
     None),
1403 d61df03e Iustin Pop
    ]
1404 363acb1e Iustin Pop
1405 76aef8fc Michael Hanselmann
1406 b469eb4d Iustin Pop
class OpTestJqueue(OpCode):
1407 e58f87a9 Michael Hanselmann
  """Utility opcode to test some aspects of the job queue.
1408 e58f87a9 Michael Hanselmann

1409 e58f87a9 Michael Hanselmann
  """
1410 65e183af Michael Hanselmann
  OP_PARAMS = [
1411 197b323b Michael Hanselmann
    ("notify_waitlock", False, ht.TBool, None),
1412 197b323b Michael Hanselmann
    ("notify_exec", False, ht.TBool, None),
1413 197b323b Michael Hanselmann
    ("log_messages", ht.EmptyList, ht.TListOf(ht.TString), None),
1414 197b323b Michael Hanselmann
    ("fail", False, ht.TBool, None),
1415 e58f87a9 Michael Hanselmann
    ]
1416 e58f87a9 Michael Hanselmann
1417 e58f87a9 Michael Hanselmann
1418 be760ba8 Michael Hanselmann
class OpTestDummy(OpCode):
1419 be760ba8 Michael Hanselmann
  """Utility opcode used by unittests.
1420 be760ba8 Michael Hanselmann

1421 be760ba8 Michael Hanselmann
  """
1422 65e183af Michael Hanselmann
  OP_PARAMS = [
1423 197b323b Michael Hanselmann
    ("result", ht.NoDefault, ht.NoType, None),
1424 197b323b Michael Hanselmann
    ("messages", ht.NoDefault, ht.NoType, None),
1425 197b323b Michael Hanselmann
    ("fail", ht.NoDefault, ht.NoType, None),
1426 6a373640 Michael Hanselmann
    ("submit_jobs", None, ht.NoType, None),
1427 be760ba8 Michael Hanselmann
    ]
1428 687c10d9 Iustin Pop
  WITH_LU = False
1429 be760ba8 Michael Hanselmann
1430 be760ba8 Michael Hanselmann
1431 dbc96028 Michael Hanselmann
def _GetOpList():
1432 dbc96028 Michael Hanselmann
  """Returns list of all defined opcodes.
1433 dbc96028 Michael Hanselmann

1434 dbc96028 Michael Hanselmann
  Does not eliminate duplicates by C{OP_ID}.
1435 dbc96028 Michael Hanselmann

1436 dbc96028 Michael Hanselmann
  """
1437 dbc96028 Michael Hanselmann
  return [v for v in globals().values()
1438 dbc96028 Michael Hanselmann
          if (isinstance(v, type) and issubclass(v, OpCode) and
1439 687c10d9 Iustin Pop
              hasattr(v, "OP_ID") and v is not OpCode)]
1440 dbc96028 Michael Hanselmann
1441 dbc96028 Michael Hanselmann
1442 dbc96028 Michael Hanselmann
OP_MAPPING = dict((v.OP_ID, v) for v in _GetOpList())