Statistics
| Branch: | Tag: | Revision:

root / lib / opcodes.py @ cfed3b9f

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 45d4c81c Michael Hanselmann
_PIpCheckDoc = "Whether to ensure instance's IP address is inactive"
113 45d4c81c Michael Hanselmann
114 ff0d18e6 Iustin Pop
#: OP_ID conversion regular expression
115 ff0d18e6 Iustin Pop
_OPID_RE = re.compile("([a-z])([A-Z])")
116 ff0d18e6 Iustin Pop
117 8c9ee749 Michael Hanselmann
#: Utility function for L{OpClusterSetParams}
118 8c9ee749 Michael Hanselmann
_TestClusterOsList = ht.TOr(ht.TNone,
119 8c9ee749 Michael Hanselmann
  ht.TListOf(ht.TAnd(ht.TList, ht.TIsLength(2),
120 8c9ee749 Michael Hanselmann
    ht.TMap(ht.WithDesc("GetFirstItem")(operator.itemgetter(0)),
121 8c9ee749 Michael Hanselmann
            ht.TElemOf(constants.DDMS_VALUES)))))
122 8c9ee749 Michael Hanselmann
123 ff0d18e6 Iustin Pop
124 526a662a Michael Hanselmann
# TODO: Generate check from constants.INIC_PARAMS_TYPES
125 526a662a Michael Hanselmann
#: Utility function for testing NIC definitions
126 526a662a Michael Hanselmann
_TestNicDef = ht.TDictOf(ht.TElemOf(constants.INIC_PARAMS),
127 526a662a Michael Hanselmann
                         ht.TOr(ht.TNone, ht.TNonEmptyString))
128 526a662a Michael Hanselmann
129 526a662a Michael Hanselmann
130 ff0d18e6 Iustin Pop
def _NameToId(name):
131 ff0d18e6 Iustin Pop
  """Convert an opcode class name to an OP_ID.
132 ff0d18e6 Iustin Pop

133 ff0d18e6 Iustin Pop
  @type name: string
134 ff0d18e6 Iustin Pop
  @param name: the class name, as OpXxxYyy
135 ff0d18e6 Iustin Pop
  @rtype: string
136 ff0d18e6 Iustin Pop
  @return: the name in the OP_XXXX_YYYY format
137 ff0d18e6 Iustin Pop

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

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

157 65e183af Michael Hanselmann
  @raise errors.OpPrereqError: when file storage is disabled
158 65e183af Michael Hanselmann

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

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

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

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

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

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

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

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

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

249 0e46916d Iustin Pop
  This object serves as a parent class for OpCode without any custom
250 0e46916d Iustin Pop
  field handling.
251 0e46916d Iustin Pop

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

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

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

276 a7399f66 Iustin Pop
    This method just returns the contents of the instance as a
277 a7399f66 Iustin Pop
    dictionary.
278 a7399f66 Iustin Pop

279 a7399f66 Iustin Pop
    @rtype:  C{dict}
280 a7399f66 Iustin Pop
    @return: the instance attributes and their values
281 a7399f66 Iustin Pop

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

292 a7399f66 Iustin Pop
    This method just restores from the serialized state the attributes
293 a7399f66 Iustin Pop
    of the current instance.
294 a7399f66 Iustin Pop

295 a7399f66 Iustin Pop
    @param state: the serialized opcode data
296 a7399f66 Iustin Pop
    @type state:  C{dict}
297 a7399f66 Iustin Pop

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

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

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

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

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

371 a7399f66 Iustin Pop
  This is the root of the actual OpCode hierarchy. All clases derived
372 a7399f66 Iustin Pop
  from this class should override OP_ID.
373 a7399f66 Iustin Pop

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

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

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

405 a7399f66 Iustin Pop
    @rtype:   C{dict}
406 a7399f66 Iustin Pop
    @return:  the state as a dictionary
407 a7399f66 Iustin Pop

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

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

421 a7399f66 Iustin Pop
    @type data:  C{dict}
422 a7399f66 Iustin Pop
    @param data: the serialized opcode
423 a7399f66 Iustin Pop

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

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

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

469 b5f5fae9 Luca Bigliardi
  This opcode does not touch the cluster at all. Its purpose is to run hooks
470 b5f5fae9 Luca Bigliardi
  after the cluster has been initialized.
471 b5f5fae9 Luca Bigliardi

472 b5f5fae9 Luca Bigliardi
  """
473 b5f5fae9 Luca Bigliardi
474 b5f5fae9 Luca Bigliardi
475 c6d43e9e Iustin Pop
class OpClusterDestroy(OpCode):
476 a7399f66 Iustin Pop
  """Destroy the cluster.
477 a7399f66 Iustin Pop

478 a7399f66 Iustin Pop
  This opcode has no other parameters. All the state is irreversibly
479 a7399f66 Iustin Pop
  lost after the execution of this opcode.
480 a7399f66 Iustin Pop

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

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

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

510 150e978f Iustin Pop
  Parameters: none
511 150e978f Iustin Pop

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

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

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

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

534 60975797 Iustin Pop
  Parameters: optional instances list, in case we want to restrict the
535 60975797 Iustin Pop
  checks to only a subset of the instances.
536 60975797 Iustin Pop

537 60975797 Iustin Pop
  Result: a list of tuples, (instance, disk, new-size) for changed
538 60975797 Iustin Pop
  configurations.
539 60975797 Iustin Pop

540 60975797 Iustin Pop
  In normal operation, the list should be empty.
541 60975797 Iustin Pop

542 60975797 Iustin Pop
  @type instances: list
543 60975797 Iustin Pop
  @ivar instances: the list of instances to check, or empty for all instances
544 60975797 Iustin Pop

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

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

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

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

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

635 afee0879 Iustin Pop
  """
636 afee0879 Iustin Pop
637 83f72637 Michael Hanselmann
638 83f72637 Michael Hanselmann
class OpQuery(OpCode):
639 83f72637 Michael Hanselmann
  """Query for resources/items.
640 83f72637 Michael Hanselmann

641 83f72637 Michael Hanselmann
  @ivar what: Resources to query for, must be one of L{constants.QR_OP_QUERY}
642 83f72637 Michael Hanselmann
  @ivar fields: List of fields to retrieve
643 83f72637 Michael Hanselmann
  @ivar filter: Query filter
644 83f72637 Michael Hanselmann

645 83f72637 Michael Hanselmann
  """
646 65e183af Michael Hanselmann
  OP_PARAMS = [
647 45d4c81c Michael Hanselmann
    ("what", ht.NoDefault, ht.TElemOf(constants.QR_OP_QUERY),
648 45d4c81c Michael Hanselmann
     "Resource(s) to query for"),
649 45d4c81c Michael Hanselmann
    ("fields", ht.NoDefault, ht.TListOf(ht.TNonEmptyString),
650 45d4c81c Michael Hanselmann
     "Requested fields"),
651 65e183af Michael Hanselmann
    ("filter", None, ht.TOr(ht.TNone,
652 45d4c81c Michael Hanselmann
                            ht.TListOf(ht.TOr(ht.TNonEmptyString, ht.TList))),
653 45d4c81c Michael Hanselmann
     "Query filter"),
654 83f72637 Michael Hanselmann
    ]
655 83f72637 Michael Hanselmann
656 83f72637 Michael Hanselmann
657 83f72637 Michael Hanselmann
class OpQueryFields(OpCode):
658 83f72637 Michael Hanselmann
  """Query for available resource/item fields.
659 83f72637 Michael Hanselmann

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

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

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

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

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

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

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

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

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

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

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

1053 313bcead Iustin Pop
  This move (with shutting down an instance and data copying) to an
1054 313bcead Iustin Pop
  arbitrary node.
1055 313bcead Iustin Pop

1056 313bcead Iustin Pop
  @ivar instance_name: the name of the instance
1057 313bcead Iustin Pop
  @ivar target_node: the destination node
1058 313bcead Iustin Pop

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

1243 1410fa8d Michael Hanselmann
  @ivar instance_name: Instance name
1244 1410fa8d Michael Hanselmann
  @ivar mode: Export mode (one of L{constants.EXPORT_MODES})
1245 1410fa8d Michael Hanselmann

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

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

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

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

1343 06009e27 Iustin Pop
  This is used just for debugging and testing.
1344 06009e27 Iustin Pop

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

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

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

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

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

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

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

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

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

1430 dbc96028 Michael Hanselmann
  Does not eliminate duplicates by C{OP_ID}.
1431 dbc96028 Michael Hanselmann

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