Statistics
| Branch: | Tag: | Revision:

root / lib / opcodes.py @ b107fe05

History | View | Annotate | Download (44.7 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 b107fe05 Michael Hanselmann
    ("filter", None, ht.TOr(ht.TNone, ht.TListOf),
654 45d4c81c Michael Hanselmann
     "Query filter"),
655 83f72637 Michael Hanselmann
    ]
656 83f72637 Michael Hanselmann
657 83f72637 Michael Hanselmann
658 83f72637 Michael Hanselmann
class OpQueryFields(OpCode):
659 83f72637 Michael Hanselmann
  """Query for available resource/item fields.
660 83f72637 Michael Hanselmann

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

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

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

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

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

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

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

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

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

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

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

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

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

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

1251 1410fa8d Michael Hanselmann
  @ivar instance_name: Instance name
1252 1410fa8d Michael Hanselmann
  @ivar mode: Export mode (one of L{constants.EXPORT_MODES})
1253 1410fa8d Michael Hanselmann

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

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

1272 4a96f1d1 Michael Hanselmann
  @ivar mode: Export mode (one of L{constants.EXPORT_MODES})
1273 4a96f1d1 Michael Hanselmann
  @ivar target_node: Export destination
1274 4a96f1d1 Michael Hanselmann
  @ivar x509_key_name: X509 key to use (remote export only)
1275 4a96f1d1 Michael Hanselmann
  @ivar destination_x509_ca: Destination X509 CA in PEM format (remote export
1276 4a96f1d1 Michael Hanselmann
                             only)
1277 4a96f1d1 Michael Hanselmann

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

1351 06009e27 Iustin Pop
  This is used just for debugging and testing.
1352 06009e27 Iustin Pop

1353 06009e27 Iustin Pop
  Parameters:
1354 06009e27 Iustin Pop
    - duration: the time to sleep
1355 06009e27 Iustin Pop
    - on_master: if true, sleep on the master
1356 06009e27 Iustin Pop
    - on_nodes: list of nodes in which to sleep
1357 06009e27 Iustin Pop

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

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

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

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

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

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

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

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

1439 dbc96028 Michael Hanselmann
  Does not eliminate duplicates by C{OP_ID}.
1440 dbc96028 Michael Hanselmann

1441 dbc96028 Michael Hanselmann
  """
1442 dbc96028 Michael Hanselmann
  return [v for v in globals().values()
1443 dbc96028 Michael Hanselmann
          if (isinstance(v, type) and issubclass(v, OpCode) and
1444 687c10d9 Iustin Pop
              hasattr(v, "OP_ID") and v is not OpCode)]
1445 dbc96028 Michael Hanselmann
1446 dbc96028 Michael Hanselmann
1447 dbc96028 Michael Hanselmann
OP_MAPPING = dict((v.OP_ID, v) for v in _GetOpList())