Statistics
| Branch: | Tag: | Revision:

root / lib / opcodes.py @ 2dad1652

History | View | Annotate | Download (46.2 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 9b64e486 Iustin Pop
#: Do not remember instance state changes
118 6aac5aef Iustin Pop
_PNoRemember = ("no_remember", False, ht.TBool,
119 6aac5aef Iustin Pop
                "Do not remember the state change")
120 9b64e486 Iustin Pop
121 ff0d18e6 Iustin Pop
#: OP_ID conversion regular expression
122 ff0d18e6 Iustin Pop
_OPID_RE = re.compile("([a-z])([A-Z])")
123 ff0d18e6 Iustin Pop
124 8c9ee749 Michael Hanselmann
#: Utility function for L{OpClusterSetParams}
125 8c9ee749 Michael Hanselmann
_TestClusterOsList = ht.TOr(ht.TNone,
126 8c9ee749 Michael Hanselmann
  ht.TListOf(ht.TAnd(ht.TList, ht.TIsLength(2),
127 8c9ee749 Michael Hanselmann
    ht.TMap(ht.WithDesc("GetFirstItem")(operator.itemgetter(0)),
128 8c9ee749 Michael Hanselmann
            ht.TElemOf(constants.DDMS_VALUES)))))
129 8c9ee749 Michael Hanselmann
130 ff0d18e6 Iustin Pop
131 526a662a Michael Hanselmann
# TODO: Generate check from constants.INIC_PARAMS_TYPES
132 526a662a Michael Hanselmann
#: Utility function for testing NIC definitions
133 526a662a Michael Hanselmann
_TestNicDef = ht.TDictOf(ht.TElemOf(constants.INIC_PARAMS),
134 526a662a Michael Hanselmann
                         ht.TOr(ht.TNone, ht.TNonEmptyString))
135 526a662a Michael Hanselmann
136 3ce9a5e7 Michael Hanselmann
_SUMMARY_PREFIX = {
137 3ce9a5e7 Michael Hanselmann
  "CLUSTER_": "C_",
138 3ce9a5e7 Michael Hanselmann
  "GROUP_": "G_",
139 3ce9a5e7 Michael Hanselmann
  "NODE_": "N_",
140 3ce9a5e7 Michael Hanselmann
  "INSTANCE_": "I_",
141 3ce9a5e7 Michael Hanselmann
  }
142 3ce9a5e7 Michael Hanselmann
143 526a662a Michael Hanselmann
144 ff0d18e6 Iustin Pop
def _NameToId(name):
145 ff0d18e6 Iustin Pop
  """Convert an opcode class name to an OP_ID.
146 ff0d18e6 Iustin Pop

147 ff0d18e6 Iustin Pop
  @type name: string
148 ff0d18e6 Iustin Pop
  @param name: the class name, as OpXxxYyy
149 ff0d18e6 Iustin Pop
  @rtype: string
150 ff0d18e6 Iustin Pop
  @return: the name in the OP_XXXX_YYYY format
151 ff0d18e6 Iustin Pop

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

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

171 65e183af Michael Hanselmann
  @raise errors.OpPrereqError: when file storage is disabled
172 65e183af Michael Hanselmann

173 65e183af Michael Hanselmann
  """
174 65e183af Michael Hanselmann
  if not constants.ENABLE_FILE_STORAGE:
175 65e183af Michael Hanselmann
    raise errors.OpPrereqError("File storage disabled at configure time",
176 65e183af Michael Hanselmann
                               errors.ECODE_INVAL)
177 65e183af Michael Hanselmann
178 65e183af Michael Hanselmann
179 4b97f902 Apollon Oikonomopoulos
def RequireSharedFileStorage():
180 4b97f902 Apollon Oikonomopoulos
  """Checks that shared file storage is enabled.
181 4b97f902 Apollon Oikonomopoulos

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

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

187 4b97f902 Apollon Oikonomopoulos
  """
188 4b97f902 Apollon Oikonomopoulos
  if not constants.ENABLE_SHARED_FILE_STORAGE:
189 4b97f902 Apollon Oikonomopoulos
    raise errors.OpPrereqError("Shared file storage disabled at"
190 4b97f902 Apollon Oikonomopoulos
                               " configure time", errors.ECODE_INVAL)
191 4b97f902 Apollon Oikonomopoulos
192 4b97f902 Apollon Oikonomopoulos
193 8c9ee749 Michael Hanselmann
@ht.WithDesc("CheckFileStorage")
194 8c9ee749 Michael Hanselmann
def _CheckFileStorage(value):
195 8c9ee749 Michael Hanselmann
  """Ensures file storage is enabled if used.
196 65e183af Michael Hanselmann

197 65e183af Michael Hanselmann
  """
198 8c9ee749 Michael Hanselmann
  if value == constants.DT_FILE:
199 65e183af Michael Hanselmann
    RequireFileStorage()
200 4b97f902 Apollon Oikonomopoulos
  elif value == constants.DT_SHARED_FILE:
201 4b97f902 Apollon Oikonomopoulos
    RequireSharedFileStorage()
202 65e183af Michael Hanselmann
  return True
203 65e183af Michael Hanselmann
204 65e183af Michael Hanselmann
205 8c9ee749 Michael Hanselmann
_CheckDiskTemplate = ht.TAnd(ht.TElemOf(constants.DISK_TEMPLATES),
206 8c9ee749 Michael Hanselmann
                             _CheckFileStorage)
207 8c9ee749 Michael Hanselmann
208 8c9ee749 Michael Hanselmann
209 65e183af Michael Hanselmann
def _CheckStorageType(storage_type):
210 65e183af Michael Hanselmann
  """Ensure a given storage type is valid.
211 65e183af Michael Hanselmann

212 65e183af Michael Hanselmann
  """
213 65e183af Michael Hanselmann
  if storage_type not in constants.VALID_STORAGE_TYPES:
214 65e183af Michael Hanselmann
    raise errors.OpPrereqError("Unknown storage type: %s" % storage_type,
215 65e183af Michael Hanselmann
                               errors.ECODE_INVAL)
216 65e183af Michael Hanselmann
  if storage_type == constants.ST_FILE:
217 65e183af Michael Hanselmann
    RequireFileStorage()
218 65e183af Michael Hanselmann
  return True
219 65e183af Michael Hanselmann
220 65e183af Michael Hanselmann
221 65e183af Michael Hanselmann
#: Storage type parameter
222 45d4c81c Michael Hanselmann
_PStorageType = ("storage_type", ht.NoDefault, _CheckStorageType,
223 45d4c81c Michael Hanselmann
                 "Storage type")
224 65e183af Michael Hanselmann
225 65e183af Michael Hanselmann
226 65e183af Michael Hanselmann
class _AutoOpParamSlots(type):
227 65e183af Michael Hanselmann
  """Meta class for opcode definitions.
228 65e183af Michael Hanselmann

229 65e183af Michael Hanselmann
  """
230 65e183af Michael Hanselmann
  def __new__(mcs, name, bases, attrs):
231 65e183af Michael Hanselmann
    """Called when a class should be created.
232 65e183af Michael Hanselmann

233 65e183af Michael Hanselmann
    @param mcs: The meta class
234 65e183af Michael Hanselmann
    @param name: Name of created class
235 65e183af Michael Hanselmann
    @param bases: Base classes
236 65e183af Michael Hanselmann
    @type attrs: dict
237 65e183af Michael Hanselmann
    @param attrs: Class attributes
238 65e183af Michael Hanselmann

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

263 0e46916d Iustin Pop
  This object serves as a parent class for OpCode without any custom
264 0e46916d Iustin Pop
  field handling.
265 0e46916d Iustin Pop

266 df458e0b Iustin Pop
  """
267 e89a9021 Iustin Pop
  # pylint: disable-msg=E1101
268 e89a9021 Iustin Pop
  # as OP_ID is dynamically defined
269 65e183af Michael Hanselmann
  __metaclass__ = _AutoOpParamSlots
270 65e183af Michael Hanselmann
271 a8083063 Iustin Pop
  def __init__(self, **kwargs):
272 a7399f66 Iustin Pop
    """Constructor for BaseOpCode.
273 a7399f66 Iustin Pop

274 a7399f66 Iustin Pop
    The constructor takes only keyword arguments and will set
275 a7399f66 Iustin Pop
    attributes on this object based on the passed arguments. As such,
276 a7399f66 Iustin Pop
    it means that you should not pass arguments which are not in the
277 a7399f66 Iustin Pop
    __slots__ attribute for this class.
278 a7399f66 Iustin Pop

279 a7399f66 Iustin Pop
    """
280 adf385c7 Iustin Pop
    slots = self._all_slots()
281 a8083063 Iustin Pop
    for key in kwargs:
282 adf385c7 Iustin Pop
      if key not in slots:
283 df458e0b Iustin Pop
        raise TypeError("Object %s doesn't support the parameter '%s'" %
284 3ecf6786 Iustin Pop
                        (self.__class__.__name__, key))
285 a8083063 Iustin Pop
      setattr(self, key, kwargs[key])
286 a8083063 Iustin Pop
287 df458e0b Iustin Pop
  def __getstate__(self):
288 a7399f66 Iustin Pop
    """Generic serializer.
289 a7399f66 Iustin Pop

290 a7399f66 Iustin Pop
    This method just returns the contents of the instance as a
291 a7399f66 Iustin Pop
    dictionary.
292 a7399f66 Iustin Pop

293 a7399f66 Iustin Pop
    @rtype:  C{dict}
294 a7399f66 Iustin Pop
    @return: the instance attributes and their values
295 a7399f66 Iustin Pop

296 a7399f66 Iustin Pop
    """
297 df458e0b Iustin Pop
    state = {}
298 adf385c7 Iustin Pop
    for name in self._all_slots():
299 df458e0b Iustin Pop
      if hasattr(self, name):
300 df458e0b Iustin Pop
        state[name] = getattr(self, name)
301 df458e0b Iustin Pop
    return state
302 df458e0b Iustin Pop
303 df458e0b Iustin Pop
  def __setstate__(self, state):
304 a7399f66 Iustin Pop
    """Generic unserializer.
305 a7399f66 Iustin Pop

306 a7399f66 Iustin Pop
    This method just restores from the serialized state the attributes
307 a7399f66 Iustin Pop
    of the current instance.
308 a7399f66 Iustin Pop

309 a7399f66 Iustin Pop
    @param state: the serialized opcode data
310 a7399f66 Iustin Pop
    @type state:  C{dict}
311 a7399f66 Iustin Pop

312 a7399f66 Iustin Pop
    """
313 df458e0b Iustin Pop
    if not isinstance(state, dict):
314 df458e0b Iustin Pop
      raise ValueError("Invalid data to __setstate__: expected dict, got %s" %
315 df458e0b Iustin Pop
                       type(state))
316 df458e0b Iustin Pop
317 adf385c7 Iustin Pop
    for name in self._all_slots():
318 44db3a6f Iustin Pop
      if name not in state and hasattr(self, name):
319 df458e0b Iustin Pop
        delattr(self, name)
320 df458e0b Iustin Pop
321 df458e0b Iustin Pop
    for name in state:
322 df458e0b Iustin Pop
      setattr(self, name, state[name])
323 df458e0b Iustin Pop
324 adf385c7 Iustin Pop
  @classmethod
325 adf385c7 Iustin Pop
  def _all_slots(cls):
326 adf385c7 Iustin Pop
    """Compute the list of all declared slots for a class.
327 adf385c7 Iustin Pop

328 adf385c7 Iustin Pop
    """
329 adf385c7 Iustin Pop
    slots = []
330 adf385c7 Iustin Pop
    for parent in cls.__mro__:
331 adf385c7 Iustin Pop
      slots.extend(getattr(parent, "__slots__", []))
332 adf385c7 Iustin Pop
    return slots
333 adf385c7 Iustin Pop
334 65e183af Michael Hanselmann
  @classmethod
335 65e183af Michael Hanselmann
  def GetAllParams(cls):
336 65e183af Michael Hanselmann
    """Compute list of all parameters for an opcode.
337 65e183af Michael Hanselmann

338 65e183af Michael Hanselmann
    """
339 65e183af Michael Hanselmann
    slots = []
340 65e183af Michael Hanselmann
    for parent in cls.__mro__:
341 65e183af Michael Hanselmann
      slots.extend(getattr(parent, "OP_PARAMS", []))
342 65e183af Michael Hanselmann
    return slots
343 65e183af Michael Hanselmann
344 1cbef6d8 Michael Hanselmann
  def Validate(self, set_defaults):
345 1cbef6d8 Michael Hanselmann
    """Validate opcode parameters, optionally setting default values.
346 1cbef6d8 Michael Hanselmann

347 1cbef6d8 Michael Hanselmann
    @type set_defaults: bool
348 1cbef6d8 Michael Hanselmann
    @param set_defaults: Whether to set default values
349 1cbef6d8 Michael Hanselmann
    @raise errors.OpPrereqError: When a parameter value doesn't match
350 1cbef6d8 Michael Hanselmann
                                 requirements
351 1cbef6d8 Michael Hanselmann

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

385 a7399f66 Iustin Pop
  This is the root of the actual OpCode hierarchy. All clases derived
386 a7399f66 Iustin Pop
  from this class should override OP_ID.
387 a7399f66 Iustin Pop

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

401 a7399f66 Iustin Pop
  """
402 e89a9021 Iustin Pop
  # pylint: disable-msg=E1101
403 e89a9021 Iustin Pop
  # as OP_ID is dynamically defined
404 687c10d9 Iustin Pop
  WITH_LU = True
405 65e183af Michael Hanselmann
  OP_PARAMS = [
406 45d4c81c Michael Hanselmann
    ("dry_run", None, ht.TMaybeBool, "Run checks only, don't execute"),
407 45d4c81c Michael Hanselmann
    ("debug_level", None, ht.TOr(ht.TNone, ht.TPositiveInt), "Debug level"),
408 65e183af Michael Hanselmann
    ("priority", constants.OP_PRIO_DEFAULT,
409 45d4c81c Michael Hanselmann
     ht.TElemOf(constants.OP_PRIO_SUBMIT_VALID), "Opcode priority"),
410 65e183af Michael Hanselmann
    ]
411 df458e0b Iustin Pop
412 df458e0b Iustin Pop
  def __getstate__(self):
413 df458e0b Iustin Pop
    """Specialized getstate for opcodes.
414 df458e0b Iustin Pop

415 a7399f66 Iustin Pop
    This method adds to the state dictionary the OP_ID of the class,
416 a7399f66 Iustin Pop
    so that on unload we can identify the correct class for
417 a7399f66 Iustin Pop
    instantiating the opcode.
418 a7399f66 Iustin Pop

419 a7399f66 Iustin Pop
    @rtype:   C{dict}
420 a7399f66 Iustin Pop
    @return:  the state as a dictionary
421 a7399f66 Iustin Pop

422 df458e0b Iustin Pop
    """
423 0e46916d Iustin Pop
    data = BaseOpCode.__getstate__(self)
424 df458e0b Iustin Pop
    data["OP_ID"] = self.OP_ID
425 df458e0b Iustin Pop
    return data
426 df458e0b Iustin Pop
427 df458e0b Iustin Pop
  @classmethod
428 00abdc96 Iustin Pop
  def LoadOpCode(cls, data):
429 df458e0b Iustin Pop
    """Generic load opcode method.
430 df458e0b Iustin Pop

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

435 a7399f66 Iustin Pop
    @type data:  C{dict}
436 a7399f66 Iustin Pop
    @param data: the serialized opcode
437 a7399f66 Iustin Pop

438 df458e0b Iustin Pop
    """
439 df458e0b Iustin Pop
    if not isinstance(data, dict):
440 df458e0b Iustin Pop
      raise ValueError("Invalid data to LoadOpCode (%s)" % type(data))
441 df458e0b Iustin Pop
    if "OP_ID" not in data:
442 df458e0b Iustin Pop
      raise ValueError("Invalid data to LoadOpcode, missing OP_ID")
443 df458e0b Iustin Pop
    op_id = data["OP_ID"]
444 df458e0b Iustin Pop
    op_class = None
445 363acb1e Iustin Pop
    if op_id in OP_MAPPING:
446 363acb1e Iustin Pop
      op_class = OP_MAPPING[op_id]
447 363acb1e Iustin Pop
    else:
448 df458e0b Iustin Pop
      raise ValueError("Invalid data to LoadOpCode: OP_ID %s unsupported" %
449 df458e0b Iustin Pop
                       op_id)
450 df458e0b Iustin Pop
    op = op_class()
451 df458e0b Iustin Pop
    new_data = data.copy()
452 df458e0b Iustin Pop
    del new_data["OP_ID"]
453 df458e0b Iustin Pop
    op.__setstate__(new_data)
454 df458e0b Iustin Pop
    return op
455 df458e0b Iustin Pop
456 60dd1473 Iustin Pop
  def Summary(self):
457 60dd1473 Iustin Pop
    """Generates a summary description of this opcode.
458 60dd1473 Iustin Pop

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

465 60dd1473 Iustin Pop
    """
466 ff0d18e6 Iustin Pop
    assert self.OP_ID is not None and len(self.OP_ID) > 3
467 60dd1473 Iustin Pop
    # all OP_ID start with OP_, we remove that
468 60dd1473 Iustin Pop
    txt = self.OP_ID[3:]
469 60dd1473 Iustin Pop
    field_name = getattr(self, "OP_DSC_FIELD", None)
470 60dd1473 Iustin Pop
    if field_name:
471 60dd1473 Iustin Pop
      field_value = getattr(self, field_name, None)
472 bc8bbda1 Iustin Pop
      if isinstance(field_value, (list, tuple)):
473 bc8bbda1 Iustin Pop
        field_value = ",".join(str(i) for i in field_value)
474 60dd1473 Iustin Pop
      txt = "%s(%s)" % (txt, field_value)
475 60dd1473 Iustin Pop
    return txt
476 60dd1473 Iustin Pop
477 3ce9a5e7 Michael Hanselmann
  def TinySummary(self):
478 3ce9a5e7 Michael Hanselmann
    """Generates a compact summary description of the opcode.
479 3ce9a5e7 Michael Hanselmann

480 3ce9a5e7 Michael Hanselmann
    """
481 3ce9a5e7 Michael Hanselmann
    assert self.OP_ID.startswith("OP_")
482 3ce9a5e7 Michael Hanselmann
483 3ce9a5e7 Michael Hanselmann
    text = self.OP_ID[3:]
484 3ce9a5e7 Michael Hanselmann
485 3ce9a5e7 Michael Hanselmann
    for (prefix, supplement) in _SUMMARY_PREFIX.items():
486 3ce9a5e7 Michael Hanselmann
      if text.startswith(prefix):
487 3ce9a5e7 Michael Hanselmann
        return supplement + text[len(prefix):]
488 3ce9a5e7 Michael Hanselmann
489 3ce9a5e7 Michael Hanselmann
    return text
490 3ce9a5e7 Michael Hanselmann
491 a8083063 Iustin Pop
492 afee0879 Iustin Pop
# cluster opcodes
493 afee0879 Iustin Pop
494 bc84ffa7 Iustin Pop
class OpClusterPostInit(OpCode):
495 b5f5fae9 Luca Bigliardi
  """Post cluster initialization.
496 b5f5fae9 Luca Bigliardi

497 b5f5fae9 Luca Bigliardi
  This opcode does not touch the cluster at all. Its purpose is to run hooks
498 b5f5fae9 Luca Bigliardi
  after the cluster has been initialized.
499 b5f5fae9 Luca Bigliardi

500 b5f5fae9 Luca Bigliardi
  """
501 b5f5fae9 Luca Bigliardi
502 b5f5fae9 Luca Bigliardi
503 c6d43e9e Iustin Pop
class OpClusterDestroy(OpCode):
504 a7399f66 Iustin Pop
  """Destroy the cluster.
505 a7399f66 Iustin Pop

506 a7399f66 Iustin Pop
  This opcode has no other parameters. All the state is irreversibly
507 a7399f66 Iustin Pop
  lost after the execution of this opcode.
508 a7399f66 Iustin Pop

509 a7399f66 Iustin Pop
  """
510 a8083063 Iustin Pop
511 a8083063 Iustin Pop
512 a2f7ab92 Iustin Pop
class OpClusterQuery(OpCode):
513 fdc267f4 Iustin Pop
  """Query cluster information."""
514 a8083063 Iustin Pop
515 a8083063 Iustin Pop
516 bf93ae69 Adeodato Simo
class OpClusterVerifyConfig(OpCode):
517 bf93ae69 Adeodato Simo
  """Verify the cluster config.
518 bf93ae69 Adeodato Simo

519 bf93ae69 Adeodato Simo
  """
520 bf93ae69 Adeodato Simo
  OP_PARAMS = [
521 bf93ae69 Adeodato Simo
    ("verbose", False, ht.TBool, None),
522 bf93ae69 Adeodato Simo
    ("error_codes", False, ht.TBool, None),
523 bf93ae69 Adeodato Simo
    ("debug_simulate_errors", False, ht.TBool, None),
524 bf93ae69 Adeodato Simo
    ]
525 bf93ae69 Adeodato Simo
526 bf93ae69 Adeodato Simo
527 bf93ae69 Adeodato Simo
class OpClusterVerifyGroup(OpCode):
528 bf93ae69 Adeodato Simo
  """Run verify on a node group from the cluster.
529 a7399f66 Iustin Pop

530 a7399f66 Iustin Pop
  @type skip_checks: C{list}
531 a7399f66 Iustin Pop
  @ivar skip_checks: steps to be skipped from the verify process; this
532 a7399f66 Iustin Pop
                     needs to be a subset of
533 a7399f66 Iustin Pop
                     L{constants.VERIFY_OPTIONAL_CHECKS}; currently
534 a7399f66 Iustin Pop
                     only L{constants.VERIFY_NPLUSONE_MEM} can be passed
535 a7399f66 Iustin Pop

536 a7399f66 Iustin Pop
  """
537 bf93ae69 Adeodato Simo
  OP_DSC_FIELD = "group_name"
538 65e183af Michael Hanselmann
  OP_PARAMS = [
539 bf93ae69 Adeodato Simo
    ("group_name", ht.NoDefault, ht.TNonEmptyString, None),
540 65e183af Michael Hanselmann
    ("skip_checks", ht.EmptyList,
541 197b323b Michael Hanselmann
     ht.TListOf(ht.TElemOf(constants.VERIFY_OPTIONAL_CHECKS)), None),
542 197b323b Michael Hanselmann
    ("verbose", False, ht.TBool, None),
543 197b323b Michael Hanselmann
    ("error_codes", False, ht.TBool, None),
544 197b323b Michael Hanselmann
    ("debug_simulate_errors", False, ht.TBool, None),
545 65e183af Michael Hanselmann
    ]
546 a8083063 Iustin Pop
547 a8083063 Iustin Pop
548 bd8210a7 Iustin Pop
class OpClusterVerifyDisks(OpCode):
549 150e978f Iustin Pop
  """Verify the cluster disks.
550 150e978f Iustin Pop

551 150e978f Iustin Pop
  Parameters: none
552 150e978f Iustin Pop

553 5188ab37 Iustin Pop
  Result: a tuple of four elements:
554 150e978f Iustin Pop
    - list of node names with bad data returned (unreachable, etc.)
555 a7399f66 Iustin Pop
    - dict of node names with broken volume groups (values: error msg)
556 150e978f Iustin Pop
    - list of instances with degraded disks (that should be activated)
557 b63ed789 Iustin Pop
    - dict of instances with missing logical volumes (values: (node, vol)
558 b63ed789 Iustin Pop
      pairs with details about the missing volumes)
559 150e978f Iustin Pop

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

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

568 150e978f Iustin Pop
  """
569 150e978f Iustin Pop
570 150e978f Iustin Pop
571 5d01aca3 Iustin Pop
class OpClusterRepairDiskSizes(OpCode):
572 60975797 Iustin Pop
  """Verify the disk sizes of the instances and fixes configuration
573 60975797 Iustin Pop
  mimatches.
574 60975797 Iustin Pop

575 60975797 Iustin Pop
  Parameters: optional instances list, in case we want to restrict the
576 60975797 Iustin Pop
  checks to only a subset of the instances.
577 60975797 Iustin Pop

578 60975797 Iustin Pop
  Result: a list of tuples, (instance, disk, new-size) for changed
579 60975797 Iustin Pop
  configurations.
580 60975797 Iustin Pop

581 60975797 Iustin Pop
  In normal operation, the list should be empty.
582 60975797 Iustin Pop

583 60975797 Iustin Pop
  @type instances: list
584 60975797 Iustin Pop
  @ivar instances: the list of instances to check, or empty for all instances
585 60975797 Iustin Pop

586 60975797 Iustin Pop
  """
587 65e183af Michael Hanselmann
  OP_PARAMS = [
588 197b323b Michael Hanselmann
    ("instances", ht.EmptyList, ht.TListOf(ht.TNonEmptyString), None),
589 65e183af Michael Hanselmann
    ]
590 60975797 Iustin Pop
591 60975797 Iustin Pop
592 2f093ea0 Iustin Pop
class OpClusterConfigQuery(OpCode):
593 ae5849b5 Michael Hanselmann
  """Query cluster configuration values."""
594 65e183af Michael Hanselmann
  OP_PARAMS = [
595 65e183af Michael Hanselmann
    _POutputFields
596 65e183af Michael Hanselmann
    ]
597 a8083063 Iustin Pop
598 a8083063 Iustin Pop
599 e126df25 Iustin Pop
class OpClusterRename(OpCode):
600 a7399f66 Iustin Pop
  """Rename the cluster.
601 a7399f66 Iustin Pop

602 a7399f66 Iustin Pop
  @type name: C{str}
603 a7399f66 Iustin Pop
  @ivar name: The new name of the cluster. The name and/or the master IP
604 a7399f66 Iustin Pop
              address will be changed to match the new name and its IP
605 a7399f66 Iustin Pop
              address.
606 a7399f66 Iustin Pop

607 a7399f66 Iustin Pop
  """
608 60dd1473 Iustin Pop
  OP_DSC_FIELD = "name"
609 65e183af Michael Hanselmann
  OP_PARAMS = [
610 197b323b Michael Hanselmann
    ("name", ht.NoDefault, ht.TNonEmptyString, None),
611 65e183af Michael Hanselmann
    ]
612 07bd8a51 Iustin Pop
613 07bd8a51 Iustin Pop
614 a6682fdc Iustin Pop
class OpClusterSetParams(OpCode):
615 a7399f66 Iustin Pop
  """Change the parameters of the cluster.
616 a7399f66 Iustin Pop

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

620 a7399f66 Iustin Pop
  """
621 65e183af Michael Hanselmann
  OP_PARAMS = [
622 45d4c81c Michael Hanselmann
    ("vg_name", None, ht.TMaybeString, "Volume group name"),
623 65e183af Michael Hanselmann
    ("enabled_hypervisors", None,
624 65e183af Michael Hanselmann
     ht.TOr(ht.TAnd(ht.TListOf(ht.TElemOf(constants.HYPER_TYPES)), ht.TTrue),
625 45d4c81c Michael Hanselmann
            ht.TNone),
626 45d4c81c Michael Hanselmann
     "List of enabled hypervisors"),
627 65e183af Michael Hanselmann
    ("hvparams", None, ht.TOr(ht.TDictOf(ht.TNonEmptyString, ht.TDict),
628 45d4c81c Michael Hanselmann
                              ht.TNone),
629 45d4c81c Michael Hanselmann
     "Cluster-wide hypervisor parameter defaults, hypervisor-dependent"),
630 45d4c81c Michael Hanselmann
    ("beparams", None, ht.TOr(ht.TDict, ht.TNone),
631 45d4c81c Michael Hanselmann
     "Cluster-wide backend parameter defaults"),
632 65e183af Michael Hanselmann
    ("os_hvp", None, ht.TOr(ht.TDictOf(ht.TNonEmptyString, ht.TDict),
633 45d4c81c Michael Hanselmann
                            ht.TNone),
634 45d4c81c Michael Hanselmann
     "Cluster-wide per-OS hypervisor parameter defaults"),
635 65e183af Michael Hanselmann
    ("osparams", None, ht.TOr(ht.TDictOf(ht.TNonEmptyString, ht.TDict),
636 45d4c81c Michael Hanselmann
                              ht.TNone),
637 45d4c81c Michael Hanselmann
     "Cluster-wide OS parameter defaults"),
638 197b323b Michael Hanselmann
    ("candidate_pool_size", None, ht.TOr(ht.TStrictPositiveInt, ht.TNone),
639 45d4c81c Michael Hanselmann
     "Master candidate pool size"),
640 45d4c81c Michael Hanselmann
    ("uid_pool", None, ht.NoType,
641 45d4c81c Michael Hanselmann
     "Set UID pool, must be list of lists describing UID ranges (two items,"
642 45d4c81c Michael Hanselmann
     " start and end inclusive)"),
643 45d4c81c Michael Hanselmann
    ("add_uids", None, ht.NoType,
644 45d4c81c Michael Hanselmann
     "Extend UID pool, must be list of lists describing UID ranges (two"
645 45d4c81c Michael Hanselmann
     " items, start and end inclusive) to be added"),
646 45d4c81c Michael Hanselmann
    ("remove_uids", None, ht.NoType,
647 45d4c81c Michael Hanselmann
     "Shrink UID pool, must be list of lists describing UID ranges (two"
648 45d4c81c Michael Hanselmann
     " items, start and end inclusive) to be removed"),
649 45d4c81c Michael Hanselmann
    ("maintain_node_health", None, ht.TMaybeBool,
650 45d4c81c Michael Hanselmann
     "Whether to automatically maintain node health"),
651 45d4c81c Michael Hanselmann
    ("prealloc_wipe_disks", None, ht.TMaybeBool,
652 45d4c81c Michael Hanselmann
     "Whether to wipe disks before allocating them to instances"),
653 45d4c81c Michael Hanselmann
    ("nicparams", None, ht.TMaybeDict, "Cluster-wide NIC parameter defaults"),
654 45d4c81c Michael Hanselmann
    ("ndparams", None, ht.TMaybeDict, "Cluster-wide node parameter defaults"),
655 45d4c81c Michael Hanselmann
    ("drbd_helper", None, ht.TOr(ht.TString, ht.TNone), "DRBD helper program"),
656 45d4c81c Michael Hanselmann
    ("default_iallocator", None, ht.TOr(ht.TString, ht.TNone),
657 45d4c81c Michael Hanselmann
     "Default iallocator for cluster"),
658 45d4c81c Michael Hanselmann
    ("master_netdev", None, ht.TOr(ht.TString, ht.TNone),
659 45d4c81c Michael Hanselmann
     "Master network device"),
660 45d4c81c Michael Hanselmann
    ("reserved_lvs", None, ht.TOr(ht.TListOf(ht.TNonEmptyString), ht.TNone),
661 45d4c81c Michael Hanselmann
     "List of reserved LVs"),
662 45d4c81c Michael Hanselmann
    ("hidden_os", None, _TestClusterOsList,
663 45d4c81c Michael Hanselmann
     "Modify list of hidden operating systems. Each modification must have"
664 45d4c81c Michael Hanselmann
     " two items, the operation and the OS name. The operation can be"
665 45d4c81c Michael Hanselmann
     " ``%s`` or ``%s``." % (constants.DDM_ADD, constants.DDM_REMOVE)),
666 45d4c81c Michael Hanselmann
    ("blacklisted_os", None, _TestClusterOsList,
667 45d4c81c Michael Hanselmann
     "Modify list of blacklisted operating systems. Each modification must have"
668 45d4c81c Michael Hanselmann
     " two items, the operation and the OS name. The operation can be"
669 45d4c81c Michael Hanselmann
     " ``%s`` or ``%s``." % (constants.DDM_ADD, constants.DDM_REMOVE)),
670 4b7735f9 Iustin Pop
    ]
671 12515db7 Manuel Franceschini
672 12515db7 Manuel Franceschini
673 d1240007 Iustin Pop
class OpClusterRedistConf(OpCode):
674 afee0879 Iustin Pop
  """Force a full push of the cluster configuration.
675 afee0879 Iustin Pop

676 afee0879 Iustin Pop
  """
677 afee0879 Iustin Pop
678 83f72637 Michael Hanselmann
679 83f72637 Michael Hanselmann
class OpQuery(OpCode):
680 83f72637 Michael Hanselmann
  """Query for resources/items.
681 83f72637 Michael Hanselmann

682 abd66bf8 Michael Hanselmann
  @ivar what: Resources to query for, must be one of L{constants.QR_VIA_OP}
683 83f72637 Michael Hanselmann
  @ivar fields: List of fields to retrieve
684 83f72637 Michael Hanselmann
  @ivar filter: Query filter
685 83f72637 Michael Hanselmann

686 83f72637 Michael Hanselmann
  """
687 65e183af Michael Hanselmann
  OP_PARAMS = [
688 8e7078e0 Michael Hanselmann
    _PQueryWhat,
689 45d4c81c Michael Hanselmann
    ("fields", ht.NoDefault, ht.TListOf(ht.TNonEmptyString),
690 45d4c81c Michael Hanselmann
     "Requested fields"),
691 b107fe05 Michael Hanselmann
    ("filter", None, ht.TOr(ht.TNone, ht.TListOf),
692 45d4c81c Michael Hanselmann
     "Query filter"),
693 83f72637 Michael Hanselmann
    ]
694 83f72637 Michael Hanselmann
695 83f72637 Michael Hanselmann
696 83f72637 Michael Hanselmann
class OpQueryFields(OpCode):
697 83f72637 Michael Hanselmann
  """Query for available resource/item fields.
698 83f72637 Michael Hanselmann

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

702 83f72637 Michael Hanselmann
  """
703 65e183af Michael Hanselmann
  OP_PARAMS = [
704 8e7078e0 Michael Hanselmann
    _PQueryWhat,
705 8e7078e0 Michael Hanselmann
    ("fields", None, ht.TOr(ht.TNone, ht.TListOf(ht.TNonEmptyString)),
706 8e7078e0 Michael Hanselmann
     "Requested fields; if not given, all are returned"),
707 83f72637 Michael Hanselmann
    ]
708 83f72637 Michael Hanselmann
709 83f72637 Michael Hanselmann
710 792af3ad René Nussbaumer
class OpOobCommand(OpCode):
711 eb64da59 René Nussbaumer
  """Interact with OOB."""
712 65e183af Michael Hanselmann
  OP_PARAMS = [
713 c4ec0755 René Nussbaumer
    ("node_names", ht.EmptyList, ht.TListOf(ht.TNonEmptyString),
714 c4ec0755 René Nussbaumer
     "List of nodes to run the OOB command against"),
715 c4ec0755 René Nussbaumer
    ("command", None, ht.TElemOf(constants.OOB_COMMANDS),
716 c4ec0755 René Nussbaumer
     "OOB command to be run"),
717 c4ec0755 René Nussbaumer
    ("timeout", constants.OOB_TIMEOUT, ht.TInt,
718 c4ec0755 René Nussbaumer
     "Timeout before the OOB helper will be terminated"),
719 c4ec0755 René Nussbaumer
    ("ignore_status", False, ht.TBool,
720 c4ec0755 René Nussbaumer
     "Ignores the node offline status for power off"),
721 beff3779 René Nussbaumer
    ("power_delay", constants.OOB_POWER_DELAY, ht.TPositiveFloat,
722 beff3779 René Nussbaumer
     "Time in seconds to wait between powering on nodes"),
723 eb64da59 René Nussbaumer
    ]
724 eb64da59 René Nussbaumer
725 eb64da59 René Nussbaumer
726 07bd8a51 Iustin Pop
# node opcodes
727 07bd8a51 Iustin Pop
728 73d565a3 Iustin Pop
class OpNodeRemove(OpCode):
729 a7399f66 Iustin Pop
  """Remove a node.
730 a7399f66 Iustin Pop

731 a7399f66 Iustin Pop
  @type node_name: C{str}
732 a7399f66 Iustin Pop
  @ivar node_name: The name of the node to remove. If the node still has
733 a7399f66 Iustin Pop
                   instances on it, the operation will fail.
734 a7399f66 Iustin Pop

735 a7399f66 Iustin Pop
  """
736 60dd1473 Iustin Pop
  OP_DSC_FIELD = "node_name"
737 65e183af Michael Hanselmann
  OP_PARAMS = [
738 65e183af Michael Hanselmann
    _PNodeName,
739 65e183af Michael Hanselmann
    ]
740 a8083063 Iustin Pop
741 a8083063 Iustin Pop
742 d817d49f Iustin Pop
class OpNodeAdd(OpCode):
743 a7399f66 Iustin Pop
  """Add a node to the cluster.
744 a7399f66 Iustin Pop

745 a7399f66 Iustin Pop
  @type node_name: C{str}
746 a7399f66 Iustin Pop
  @ivar node_name: The name of the node to add. This can be a short name,
747 a7399f66 Iustin Pop
                   but it will be expanded to the FQDN.
748 a7399f66 Iustin Pop
  @type primary_ip: IP address
749 a7399f66 Iustin Pop
  @ivar primary_ip: The primary IP of the node. This will be ignored when the
750 a7399f66 Iustin Pop
                    opcode is submitted, but will be filled during the node
751 a7399f66 Iustin Pop
                    add (so it will be visible in the job query).
752 a7399f66 Iustin Pop
  @type secondary_ip: IP address
753 a7399f66 Iustin Pop
  @ivar secondary_ip: The secondary IP of the node. This needs to be passed
754 a7399f66 Iustin Pop
                      if the cluster has been initialized in 'dual-network'
755 a7399f66 Iustin Pop
                      mode, otherwise it must not be given.
756 a7399f66 Iustin Pop
  @type readd: C{bool}
757 a7399f66 Iustin Pop
  @ivar readd: Whether to re-add an existing node to the cluster. If
758 a7399f66 Iustin Pop
               this is not passed, then the operation will abort if the node
759 a7399f66 Iustin Pop
               name is already in the cluster; use this parameter to 'repair'
760 a7399f66 Iustin Pop
               a node that had its configuration broken, or was reinstalled
761 a7399f66 Iustin Pop
               without removal from the cluster.
762 f936c153 Iustin Pop
  @type group: C{str}
763 f936c153 Iustin Pop
  @ivar group: The node group to which this node will belong.
764 fd3d37b6 Iustin Pop
  @type vm_capable: C{bool}
765 fd3d37b6 Iustin Pop
  @ivar vm_capable: The vm_capable node attribute
766 fd3d37b6 Iustin Pop
  @type master_capable: C{bool}
767 fd3d37b6 Iustin Pop
  @ivar master_capable: The master_capable node attribute
768 a7399f66 Iustin Pop

769 a7399f66 Iustin Pop
  """
770 60dd1473 Iustin Pop
  OP_DSC_FIELD = "node_name"
771 65e183af Michael Hanselmann
  OP_PARAMS = [
772 65e183af Michael Hanselmann
    _PNodeName,
773 45d4c81c Michael Hanselmann
    ("primary_ip", None, ht.NoType, "Primary IP address"),
774 45d4c81c Michael Hanselmann
    ("secondary_ip", None, ht.TMaybeString, "Secondary IP address"),
775 45d4c81c Michael Hanselmann
    ("readd", False, ht.TBool, "Whether node is re-added to cluster"),
776 45d4c81c Michael Hanselmann
    ("group", None, ht.TMaybeString, "Initial node group"),
777 45d4c81c Michael Hanselmann
    ("master_capable", None, ht.TMaybeBool,
778 45d4c81c Michael Hanselmann
     "Whether node can become master or master candidate"),
779 45d4c81c Michael Hanselmann
    ("vm_capable", None, ht.TMaybeBool,
780 45d4c81c Michael Hanselmann
     "Whether node can host instances"),
781 45d4c81c Michael Hanselmann
    ("ndparams", None, ht.TMaybeDict, "Node parameters"),
782 65e183af Michael Hanselmann
    ]
783 a8083063 Iustin Pop
784 a8083063 Iustin Pop
785 2237687b Iustin Pop
class OpNodeQuery(OpCode):
786 a8083063 Iustin Pop
  """Compute the list of nodes."""
787 65e183af Michael Hanselmann
  OP_PARAMS = [
788 65e183af Michael Hanselmann
    _POutputFields,
789 45d4c81c Michael Hanselmann
    _PUseLocking,
790 45d4c81c Michael Hanselmann
    ("names", ht.EmptyList, ht.TListOf(ht.TNonEmptyString),
791 45d4c81c Michael Hanselmann
     "Empty list to query all nodes, node names otherwise"),
792 65e183af Michael Hanselmann
    ]
793 a8083063 Iustin Pop
794 a8083063 Iustin Pop
795 8ed55bfd Iustin Pop
class OpNodeQueryvols(OpCode):
796 dcb93971 Michael Hanselmann
  """Get list of volumes on node."""
797 65e183af Michael Hanselmann
  OP_PARAMS = [
798 65e183af Michael Hanselmann
    _POutputFields,
799 45d4c81c Michael Hanselmann
    ("nodes", ht.EmptyList, ht.TListOf(ht.TNonEmptyString),
800 45d4c81c Michael Hanselmann
     "Empty list to query all nodes, node names otherwise"),
801 65e183af Michael Hanselmann
    ]
802 dcb93971 Michael Hanselmann
803 dcb93971 Michael Hanselmann
804 ad8d0595 Iustin Pop
class OpNodeQueryStorage(OpCode):
805 9e5442ce Michael Hanselmann
  """Get information on storage for node(s)."""
806 65e183af Michael Hanselmann
  OP_PARAMS = [
807 65e183af Michael Hanselmann
    _POutputFields,
808 65e183af Michael Hanselmann
    _PStorageType,
809 45d4c81c Michael Hanselmann
    ("nodes", ht.EmptyList, ht.TListOf(ht.TNonEmptyString), "List of nodes"),
810 45d4c81c Michael Hanselmann
    ("name", None, ht.TMaybeString, "Storage name"),
811 9e5442ce Michael Hanselmann
    ]
812 9e5442ce Michael Hanselmann
813 9e5442ce Michael Hanselmann
814 2cee4077 Iustin Pop
class OpNodeModifyStorage(OpCode):
815 099c52ad Iustin Pop
  """Modifies the properies of a storage unit"""
816 65e183af Michael Hanselmann
  OP_PARAMS = [
817 65e183af Michael Hanselmann
    _PNodeName,
818 65e183af Michael Hanselmann
    _PStorageType,
819 45d4c81c Michael Hanselmann
    _PStorageName,
820 45d4c81c Michael Hanselmann
    ("changes", ht.NoDefault, ht.TDict, "Requested changes"),
821 efb8da02 Michael Hanselmann
    ]
822 efb8da02 Michael Hanselmann
823 efb8da02 Michael Hanselmann
824 76aef8fc Michael Hanselmann
class OpRepairNodeStorage(OpCode):
825 76aef8fc Michael Hanselmann
  """Repairs the volume group on a node."""
826 76aef8fc Michael Hanselmann
  OP_DSC_FIELD = "node_name"
827 65e183af Michael Hanselmann
  OP_PARAMS = [
828 65e183af Michael Hanselmann
    _PNodeName,
829 65e183af Michael Hanselmann
    _PStorageType,
830 45d4c81c Michael Hanselmann
    _PStorageName,
831 45d4c81c Michael Hanselmann
    _PIgnoreConsistency,
832 76aef8fc Michael Hanselmann
    ]
833 76aef8fc Michael Hanselmann
834 76aef8fc Michael Hanselmann
835 f13973c4 Iustin Pop
class OpNodeSetParams(OpCode):
836 b31c8676 Iustin Pop
  """Change the parameters of a node."""
837 b31c8676 Iustin Pop
  OP_DSC_FIELD = "node_name"
838 65e183af Michael Hanselmann
  OP_PARAMS = [
839 65e183af Michael Hanselmann
    _PNodeName,
840 65e183af Michael Hanselmann
    _PForce,
841 45d4c81c Michael Hanselmann
    ("master_candidate", None, ht.TMaybeBool,
842 45d4c81c Michael Hanselmann
     "Whether the node should become a master candidate"),
843 45d4c81c Michael Hanselmann
    ("offline", None, ht.TMaybeBool,
844 45d4c81c Michael Hanselmann
     "Whether the node should be marked as offline"),
845 45d4c81c Michael Hanselmann
    ("drained", None, ht.TMaybeBool,
846 45d4c81c Michael Hanselmann
     "Whether the node should be marked as drained"),
847 45d4c81c Michael Hanselmann
    ("auto_promote", False, ht.TBool,
848 45d4c81c Michael Hanselmann
     "Whether node(s) should be promoted to master candidate if necessary"),
849 45d4c81c Michael Hanselmann
    ("master_capable", None, ht.TMaybeBool,
850 45d4c81c Michael Hanselmann
     "Denote whether node can become master or master candidate"),
851 45d4c81c Michael Hanselmann
    ("vm_capable", None, ht.TMaybeBool,
852 45d4c81c Michael Hanselmann
     "Denote whether node can host instances"),
853 45d4c81c Michael Hanselmann
    ("secondary_ip", None, ht.TMaybeString,
854 45d4c81c Michael Hanselmann
     "Change node's secondary IP address"),
855 45d4c81c Michael Hanselmann
    ("ndparams", None, ht.TMaybeDict, "Set node parameters"),
856 45d4c81c Michael Hanselmann
    ("powered", None, ht.TMaybeBool,
857 45d4c81c Michael Hanselmann
     "Whether the node should be marked as powered"),
858 b31c8676 Iustin Pop
    ]
859 b31c8676 Iustin Pop
860 f5118ade Iustin Pop
861 e0d4735f Iustin Pop
class OpNodePowercycle(OpCode):
862 f5118ade Iustin Pop
  """Tries to powercycle a node."""
863 f5118ade Iustin Pop
  OP_DSC_FIELD = "node_name"
864 65e183af Michael Hanselmann
  OP_PARAMS = [
865 65e183af Michael Hanselmann
    _PNodeName,
866 65e183af Michael Hanselmann
    _PForce,
867 f5118ade Iustin Pop
    ]
868 f5118ade Iustin Pop
869 7ffc5a86 Michael Hanselmann
870 5b14a488 Iustin Pop
class OpNodeMigrate(OpCode):
871 80cb875c Michael Hanselmann
  """Migrate all instances from a node."""
872 80cb875c Michael Hanselmann
  OP_DSC_FIELD = "node_name"
873 65e183af Michael Hanselmann
  OP_PARAMS = [
874 65e183af Michael Hanselmann
    _PNodeName,
875 65e183af Michael Hanselmann
    _PMigrationMode,
876 65e183af Michael Hanselmann
    _PMigrationLive,
877 8eb34306 Apollon Oikonomopoulos
    ("iallocator", None, ht.TMaybeString,
878 8eb34306 Apollon Oikonomopoulos
     "Iallocator for deciding the target node for shared-storage instances"),
879 80cb875c Michael Hanselmann
    ]
880 80cb875c Michael Hanselmann
881 80cb875c Michael Hanselmann
882 0ae89533 Iustin Pop
class OpNodeEvacStrategy(OpCode):
883 d6aaa598 Iustin Pop
  """Compute the evacuation strategy for a list of nodes."""
884 d6aaa598 Iustin Pop
  OP_DSC_FIELD = "nodes"
885 65e183af Michael Hanselmann
  OP_PARAMS = [
886 197b323b Michael Hanselmann
    ("nodes", ht.NoDefault, ht.TListOf(ht.TNonEmptyString), None),
887 197b323b Michael Hanselmann
    ("remote_node", None, ht.TMaybeString, None),
888 197b323b Michael Hanselmann
    ("iallocator", None, ht.TMaybeString, None),
889 65e183af Michael Hanselmann
    ]
890 d6aaa598 Iustin Pop
891 d6aaa598 Iustin Pop
892 a8083063 Iustin Pop
# instance opcodes
893 a8083063 Iustin Pop
894 e1530b10 Iustin Pop
class OpInstanceCreate(OpCode):
895 9bf56d77 Michael Hanselmann
  """Create an instance.
896 9bf56d77 Michael Hanselmann

897 9bf56d77 Michael Hanselmann
  @ivar instance_name: Instance name
898 9bf56d77 Michael Hanselmann
  @ivar mode: Instance creation mode (one of L{constants.INSTANCE_CREATE_MODES})
899 9bf56d77 Michael Hanselmann
  @ivar source_handshake: Signed handshake from source (remote import only)
900 9bf56d77 Michael Hanselmann
  @ivar source_x509_ca: Source X509 CA in PEM format (remote import only)
901 9bf56d77 Michael Hanselmann
  @ivar source_instance_name: Previous name of instance (remote import only)
902 dae91d02 Michael Hanselmann
  @ivar source_shutdown_timeout: Shutdown timeout used for source instance
903 dae91d02 Michael Hanselmann
    (remote import only)
904 9bf56d77 Michael Hanselmann

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

1071 53c776b5 Iustin Pop
  This migrates (without shutting down an instance) to its secondary
1072 53c776b5 Iustin Pop
  node.
1073 53c776b5 Iustin Pop

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

1077 53c776b5 Iustin Pop
  """
1078 ee69c97f Iustin Pop
  OP_DSC_FIELD = "instance_name"
1079 65e183af Michael Hanselmann
  OP_PARAMS = [
1080 65e183af Michael Hanselmann
    _PInstanceName,
1081 65e183af Michael Hanselmann
    _PMigrationMode,
1082 65e183af Michael Hanselmann
    _PMigrationLive,
1083 45d4c81c Michael Hanselmann
    ("cleanup", False, ht.TBool,
1084 45d4c81c Michael Hanselmann
     "Whether a previously failed migration should be cleaned up"),
1085 8eb34306 Apollon Oikonomopoulos
    ("iallocator", None, ht.TMaybeString,
1086 8eb34306 Apollon Oikonomopoulos
     "Iallocator for deciding the target node for shared-storage instances"),
1087 8eb34306 Apollon Oikonomopoulos
    ("target_node", None, ht.TMaybeString,
1088 8eb34306 Apollon Oikonomopoulos
     "Target node for shared-storage instances"),
1089 d5cafd31 René Nussbaumer
    ("allow_failover", False, ht.TBool,
1090 d5cafd31 René Nussbaumer
     "Whether we can fallback to failover if migration is not possible"),
1091 65e183af Michael Hanselmann
    ]
1092 53c776b5 Iustin Pop
1093 53c776b5 Iustin Pop
1094 0091b480 Iustin Pop
class OpInstanceMove(OpCode):
1095 313bcead Iustin Pop
  """Move an instance.
1096 313bcead Iustin Pop

1097 313bcead Iustin Pop
  This move (with shutting down an instance and data copying) to an
1098 313bcead Iustin Pop
  arbitrary node.
1099 313bcead Iustin Pop

1100 313bcead Iustin Pop
  @ivar instance_name: the name of the instance
1101 313bcead Iustin Pop
  @ivar target_node: the destination node
1102 313bcead Iustin Pop

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

1296 1410fa8d Michael Hanselmann
  @ivar instance_name: Instance name
1297 1410fa8d Michael Hanselmann
  @ivar mode: Export mode (one of L{constants.EXPORT_MODES})
1298 1410fa8d Michael Hanselmann

1299 1410fa8d Michael Hanselmann
  """
1300 1410fa8d Michael Hanselmann
  OP_DSC_FIELD = "instance_name"
1301 65e183af Michael Hanselmann
  OP_PARAMS = [
1302 65e183af Michael Hanselmann
    _PInstanceName,
1303 45d4c81c Michael Hanselmann
    ("mode", ht.NoDefault, ht.TElemOf(constants.EXPORT_MODES),
1304 45d4c81c Michael Hanselmann
     "Export mode"),
1305 1410fa8d Michael Hanselmann
    ]
1306 1410fa8d Michael Hanselmann
1307 1410fa8d Michael Hanselmann
1308 4ff922a2 Iustin Pop
class OpBackupExport(OpCode):
1309 4a96f1d1 Michael Hanselmann
  """Export an instance.
1310 4a96f1d1 Michael Hanselmann

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

1317 4a96f1d1 Michael Hanselmann
  @ivar mode: Export mode (one of L{constants.EXPORT_MODES})
1318 4a96f1d1 Michael Hanselmann
  @ivar target_node: Export destination
1319 4a96f1d1 Michael Hanselmann
  @ivar x509_key_name: X509 key to use (remote export only)
1320 4a96f1d1 Michael Hanselmann
  @ivar destination_x509_ca: Destination X509 CA in PEM format (remote export
1321 4a96f1d1 Michael Hanselmann
                             only)
1322 4a96f1d1 Michael Hanselmann

1323 4a96f1d1 Michael Hanselmann
  """
1324 60dd1473 Iustin Pop
  OP_DSC_FIELD = "instance_name"
1325 65e183af Michael Hanselmann
  OP_PARAMS = [
1326 65e183af Michael Hanselmann
    _PInstanceName,
1327 65e183af Michael Hanselmann
    _PShutdownTimeout,
1328 4a96f1d1 Michael Hanselmann
    # TODO: Rename target_node as it changes meaning for different export modes
1329 4a96f1d1 Michael Hanselmann
    # (e.g. "destination")
1330 45d4c81c Michael Hanselmann
    ("target_node", ht.NoDefault, ht.TOr(ht.TNonEmptyString, ht.TList),
1331 45d4c81c Michael Hanselmann
     "Destination information, depends on export mode"),
1332 45d4c81c Michael Hanselmann
    ("shutdown", True, ht.TBool, "Whether to shutdown instance before export"),
1333 45d4c81c Michael Hanselmann
    ("remove_instance", False, ht.TBool,
1334 45d4c81c Michael Hanselmann
     "Whether to remove instance after export"),
1335 45d4c81c Michael Hanselmann
    ("ignore_remove_failures", False, ht.TBool,
1336 45d4c81c Michael Hanselmann
     "Whether to ignore failures while removing instances"),
1337 45d4c81c Michael Hanselmann
    ("mode", constants.EXPORT_MODE_LOCAL, ht.TElemOf(constants.EXPORT_MODES),
1338 45d4c81c Michael Hanselmann
     "Export mode"),
1339 45d4c81c Michael Hanselmann
    ("x509_key_name", None, ht.TOr(ht.TList, ht.TNone),
1340 45d4c81c Michael Hanselmann
     "Name of X509 key (remote export only)"),
1341 45d4c81c Michael Hanselmann
    ("destination_x509_ca", None, ht.TMaybeString,
1342 45d4c81c Michael Hanselmann
     "Destination X509 CA (remote export only)"),
1343 17c3f802 Guido Trotter
    ]
1344 5c947f38 Iustin Pop
1345 0a7bed64 Michael Hanselmann
1346 ca5890ad Iustin Pop
class OpBackupRemove(OpCode):
1347 9ac99fda Guido Trotter
  """Remove an instance's export."""
1348 60dd1473 Iustin Pop
  OP_DSC_FIELD = "instance_name"
1349 65e183af Michael Hanselmann
  OP_PARAMS = [
1350 65e183af Michael Hanselmann
    _PInstanceName,
1351 65e183af Michael Hanselmann
    ]
1352 5c947f38 Iustin Pop
1353 0a7bed64 Michael Hanselmann
1354 5c947f38 Iustin Pop
# Tags opcodes
1355 c6afb1ca Iustin Pop
class OpTagsGet(OpCode):
1356 5c947f38 Iustin Pop
  """Returns the tags of the given object."""
1357 60dd1473 Iustin Pop
  OP_DSC_FIELD = "name"
1358 65e183af Michael Hanselmann
  OP_PARAMS = [
1359 65e183af Michael Hanselmann
    _PTagKind,
1360 65e183af Michael Hanselmann
    # Name is only meaningful for nodes and instances
1361 197b323b Michael Hanselmann
    ("name", ht.NoDefault, ht.TMaybeString, None),
1362 65e183af Michael Hanselmann
    ]
1363 5c947f38 Iustin Pop
1364 5c947f38 Iustin Pop
1365 715462e7 Iustin Pop
class OpTagsSearch(OpCode):
1366 73415719 Iustin Pop
  """Searches the tags in the cluster for a given pattern."""
1367 60dd1473 Iustin Pop
  OP_DSC_FIELD = "pattern"
1368 65e183af Michael Hanselmann
  OP_PARAMS = [
1369 197b323b Michael Hanselmann
    ("pattern", ht.NoDefault, ht.TNonEmptyString, None),
1370 65e183af Michael Hanselmann
    ]
1371 73415719 Iustin Pop
1372 73415719 Iustin Pop
1373 d1602edc Iustin Pop
class OpTagsSet(OpCode):
1374 f27302fa Iustin Pop
  """Add a list of tags on a given object."""
1375 65e183af Michael Hanselmann
  OP_PARAMS = [
1376 65e183af Michael Hanselmann
    _PTagKind,
1377 65e183af Michael Hanselmann
    _PTags,
1378 65e183af Michael Hanselmann
    # Name is only meaningful for nodes and instances
1379 197b323b Michael Hanselmann
    ("name", ht.NoDefault, ht.TMaybeString, None),
1380 65e183af Michael Hanselmann
    ]
1381 5c947f38 Iustin Pop
1382 5c947f38 Iustin Pop
1383 3f0ab95f Iustin Pop
class OpTagsDel(OpCode):
1384 f27302fa Iustin Pop
  """Remove a list of tags from a given object."""
1385 65e183af Michael Hanselmann
  OP_PARAMS = [
1386 65e183af Michael Hanselmann
    _PTagKind,
1387 65e183af Michael Hanselmann
    _PTags,
1388 65e183af Michael Hanselmann
    # Name is only meaningful for nodes and instances
1389 197b323b Michael Hanselmann
    ("name", ht.NoDefault, ht.TMaybeString, None),
1390 65e183af Michael Hanselmann
    ]
1391 06009e27 Iustin Pop
1392 06009e27 Iustin Pop
# Test opcodes
1393 06009e27 Iustin Pop
class OpTestDelay(OpCode):
1394 06009e27 Iustin Pop
  """Sleeps for a configured amount of time.
1395 06009e27 Iustin Pop

1396 06009e27 Iustin Pop
  This is used just for debugging and testing.
1397 06009e27 Iustin Pop

1398 06009e27 Iustin Pop
  Parameters:
1399 06009e27 Iustin Pop
    - duration: the time to sleep
1400 06009e27 Iustin Pop
    - on_master: if true, sleep on the master
1401 06009e27 Iustin Pop
    - on_nodes: list of nodes in which to sleep
1402 06009e27 Iustin Pop

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

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

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

1413 06009e27 Iustin Pop
  """
1414 60dd1473 Iustin Pop
  OP_DSC_FIELD = "duration"
1415 65e183af Michael Hanselmann
  OP_PARAMS = [
1416 197b323b Michael Hanselmann
    ("duration", ht.NoDefault, ht.TFloat, None),
1417 197b323b Michael Hanselmann
    ("on_master", True, ht.TBool, None),
1418 197b323b Michael Hanselmann
    ("on_nodes", ht.EmptyList, ht.TListOf(ht.TNonEmptyString), None),
1419 197b323b Michael Hanselmann
    ("repeat", 0, ht.TPositiveInt, None),
1420 65e183af Michael Hanselmann
    ]
1421 d61df03e Iustin Pop
1422 d61df03e Iustin Pop
1423 d61df03e Iustin Pop
class OpTestAllocator(OpCode):
1424 d61df03e Iustin Pop
  """Allocator framework testing.
1425 d61df03e Iustin Pop

1426 d61df03e Iustin Pop
  This opcode has two modes:
1427 d61df03e Iustin Pop
    - gather and return allocator input for a given mode (allocate new
1428 d61df03e Iustin Pop
      or replace secondary) and a given instance definition (direction
1429 d61df03e Iustin Pop
      'in')
1430 d61df03e Iustin Pop
    - run a selected allocator for a given operation (as above) and
1431 d61df03e Iustin Pop
      return the allocator output (direction 'out')
1432 d61df03e Iustin Pop

1433 d61df03e Iustin Pop
  """
1434 60dd1473 Iustin Pop
  OP_DSC_FIELD = "allocator"
1435 65e183af Michael Hanselmann
  OP_PARAMS = [
1436 65e183af Michael Hanselmann
    ("direction", ht.NoDefault,
1437 197b323b Michael Hanselmann
     ht.TElemOf(constants.VALID_IALLOCATOR_DIRECTIONS), None),
1438 197b323b Michael Hanselmann
    ("mode", ht.NoDefault, ht.TElemOf(constants.VALID_IALLOCATOR_MODES), None),
1439 197b323b Michael Hanselmann
    ("name", ht.NoDefault, ht.TNonEmptyString, None),
1440 65e183af Michael Hanselmann
    ("nics", ht.NoDefault, ht.TOr(ht.TNone, ht.TListOf(
1441 fdbe29ee Michael Hanselmann
     ht.TDictOf(ht.TElemOf([constants.INIC_MAC, constants.INIC_IP, "bridge"]),
1442 45d4c81c Michael Hanselmann
                ht.TOr(ht.TNone, ht.TNonEmptyString)))), None),
1443 197b323b Michael Hanselmann
    ("disks", ht.NoDefault, ht.TOr(ht.TNone, ht.TList), None),
1444 197b323b Michael Hanselmann
    ("hypervisor", None, ht.TMaybeString, None),
1445 197b323b Michael Hanselmann
    ("allocator", None, ht.TMaybeString, None),
1446 197b323b Michael Hanselmann
    ("tags", ht.EmptyList, ht.TListOf(ht.TNonEmptyString), None),
1447 197b323b Michael Hanselmann
    ("mem_size", None, ht.TOr(ht.TNone, ht.TPositiveInt), None),
1448 197b323b Michael Hanselmann
    ("vcpus", None, ht.TOr(ht.TNone, ht.TPositiveInt), None),
1449 197b323b Michael Hanselmann
    ("os", None, ht.TMaybeString, None),
1450 197b323b Michael Hanselmann
    ("disk_template", None, ht.TMaybeString, None),
1451 45d4c81c Michael Hanselmann
    ("evac_nodes", None, ht.TOr(ht.TNone, ht.TListOf(ht.TNonEmptyString)),
1452 45d4c81c Michael Hanselmann
     None),
1453 bee581e2 Michael Hanselmann
    ("instances", None, ht.TOr(ht.TNone, ht.TListOf(ht.TNonEmptyString)),
1454 bee581e2 Michael Hanselmann
     None),
1455 bee581e2 Michael Hanselmann
    ("reloc_mode", None,
1456 bee581e2 Michael Hanselmann
     ht.TOr(ht.TNone, ht.TElemOf(constants.IALLOCATOR_MRELOC_MODES)), None),
1457 bee581e2 Michael Hanselmann
    ("target_groups", None, ht.TOr(ht.TNone, ht.TListOf(ht.TNonEmptyString)),
1458 bee581e2 Michael Hanselmann
     None),
1459 d61df03e Iustin Pop
    ]
1460 363acb1e Iustin Pop
1461 76aef8fc Michael Hanselmann
1462 b469eb4d Iustin Pop
class OpTestJqueue(OpCode):
1463 e58f87a9 Michael Hanselmann
  """Utility opcode to test some aspects of the job queue.
1464 e58f87a9 Michael Hanselmann

1465 e58f87a9 Michael Hanselmann
  """
1466 65e183af Michael Hanselmann
  OP_PARAMS = [
1467 197b323b Michael Hanselmann
    ("notify_waitlock", False, ht.TBool, None),
1468 197b323b Michael Hanselmann
    ("notify_exec", False, ht.TBool, None),
1469 197b323b Michael Hanselmann
    ("log_messages", ht.EmptyList, ht.TListOf(ht.TString), None),
1470 197b323b Michael Hanselmann
    ("fail", False, ht.TBool, None),
1471 e58f87a9 Michael Hanselmann
    ]
1472 e58f87a9 Michael Hanselmann
1473 e58f87a9 Michael Hanselmann
1474 be760ba8 Michael Hanselmann
class OpTestDummy(OpCode):
1475 be760ba8 Michael Hanselmann
  """Utility opcode used by unittests.
1476 be760ba8 Michael Hanselmann

1477 be760ba8 Michael Hanselmann
  """
1478 65e183af Michael Hanselmann
  OP_PARAMS = [
1479 197b323b Michael Hanselmann
    ("result", ht.NoDefault, ht.NoType, None),
1480 197b323b Michael Hanselmann
    ("messages", ht.NoDefault, ht.NoType, None),
1481 197b323b Michael Hanselmann
    ("fail", ht.NoDefault, ht.NoType, None),
1482 6a373640 Michael Hanselmann
    ("submit_jobs", None, ht.NoType, None),
1483 be760ba8 Michael Hanselmann
    ]
1484 687c10d9 Iustin Pop
  WITH_LU = False
1485 be760ba8 Michael Hanselmann
1486 be760ba8 Michael Hanselmann
1487 dbc96028 Michael Hanselmann
def _GetOpList():
1488 dbc96028 Michael Hanselmann
  """Returns list of all defined opcodes.
1489 dbc96028 Michael Hanselmann

1490 dbc96028 Michael Hanselmann
  Does not eliminate duplicates by C{OP_ID}.
1491 dbc96028 Michael Hanselmann

1492 dbc96028 Michael Hanselmann
  """
1493 dbc96028 Michael Hanselmann
  return [v for v in globals().values()
1494 dbc96028 Michael Hanselmann
          if (isinstance(v, type) and issubclass(v, OpCode) and
1495 687c10d9 Iustin Pop
              hasattr(v, "OP_ID") and v is not OpCode)]
1496 dbc96028 Michael Hanselmann
1497 dbc96028 Michael Hanselmann
1498 dbc96028 Michael Hanselmann
OP_MAPPING = dict((v.OP_ID, v) for v in _GetOpList())