Statistics
| Branch: | Tag: | Revision:

root / lib / opcodes.py @ b99b607f

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 f8fa4175 Michael Hanselmann
#: Target node for instance migration/failover
122 f8fa4175 Michael Hanselmann
_PMigrationTargetNode = ("target_node", None, ht.TMaybeString,
123 f8fa4175 Michael Hanselmann
                         "Target node for shared-storage instances")
124 f8fa4175 Michael Hanselmann
125 ff0d18e6 Iustin Pop
#: OP_ID conversion regular expression
126 ff0d18e6 Iustin Pop
_OPID_RE = re.compile("([a-z])([A-Z])")
127 ff0d18e6 Iustin Pop
128 8c9ee749 Michael Hanselmann
#: Utility function for L{OpClusterSetParams}
129 8c9ee749 Michael Hanselmann
_TestClusterOsList = ht.TOr(ht.TNone,
130 8c9ee749 Michael Hanselmann
  ht.TListOf(ht.TAnd(ht.TList, ht.TIsLength(2),
131 8c9ee749 Michael Hanselmann
    ht.TMap(ht.WithDesc("GetFirstItem")(operator.itemgetter(0)),
132 8c9ee749 Michael Hanselmann
            ht.TElemOf(constants.DDMS_VALUES)))))
133 8c9ee749 Michael Hanselmann
134 ff0d18e6 Iustin Pop
135 526a662a Michael Hanselmann
# TODO: Generate check from constants.INIC_PARAMS_TYPES
136 526a662a Michael Hanselmann
#: Utility function for testing NIC definitions
137 526a662a Michael Hanselmann
_TestNicDef = ht.TDictOf(ht.TElemOf(constants.INIC_PARAMS),
138 526a662a Michael Hanselmann
                         ht.TOr(ht.TNone, ht.TNonEmptyString))
139 526a662a Michael Hanselmann
140 3ce9a5e7 Michael Hanselmann
_SUMMARY_PREFIX = {
141 3ce9a5e7 Michael Hanselmann
  "CLUSTER_": "C_",
142 3ce9a5e7 Michael Hanselmann
  "GROUP_": "G_",
143 3ce9a5e7 Michael Hanselmann
  "NODE_": "N_",
144 3ce9a5e7 Michael Hanselmann
  "INSTANCE_": "I_",
145 3ce9a5e7 Michael Hanselmann
  }
146 3ce9a5e7 Michael Hanselmann
147 526a662a Michael Hanselmann
148 ff0d18e6 Iustin Pop
def _NameToId(name):
149 ff0d18e6 Iustin Pop
  """Convert an opcode class name to an OP_ID.
150 ff0d18e6 Iustin Pop

151 ff0d18e6 Iustin Pop
  @type name: string
152 ff0d18e6 Iustin Pop
  @param name: the class name, as OpXxxYyy
153 ff0d18e6 Iustin Pop
  @rtype: string
154 ff0d18e6 Iustin Pop
  @return: the name in the OP_XXXX_YYYY format
155 ff0d18e6 Iustin Pop

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

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

175 65e183af Michael Hanselmann
  @raise errors.OpPrereqError: when file storage is disabled
176 65e183af Michael Hanselmann

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

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

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

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

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

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

233 65e183af Michael Hanselmann
  """
234 65e183af Michael Hanselmann
  def __new__(mcs, name, bases, attrs):
235 65e183af Michael Hanselmann
    """Called when a class should be created.
236 65e183af Michael Hanselmann

237 65e183af Michael Hanselmann
    @param mcs: The meta class
238 65e183af Michael Hanselmann
    @param name: Name of created class
239 65e183af Michael Hanselmann
    @param bases: Base classes
240 65e183af Michael Hanselmann
    @type attrs: dict
241 65e183af Michael Hanselmann
    @param attrs: Class attributes
242 65e183af Michael Hanselmann

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

267 0e46916d Iustin Pop
  This object serves as a parent class for OpCode without any custom
268 0e46916d Iustin Pop
  field handling.
269 0e46916d Iustin Pop

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

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

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

294 a7399f66 Iustin Pop
    This method just returns the contents of the instance as a
295 a7399f66 Iustin Pop
    dictionary.
296 a7399f66 Iustin Pop

297 a7399f66 Iustin Pop
    @rtype:  C{dict}
298 a7399f66 Iustin Pop
    @return: the instance attributes and their values
299 a7399f66 Iustin Pop

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

310 a7399f66 Iustin Pop
    This method just restores from the serialized state the attributes
311 a7399f66 Iustin Pop
    of the current instance.
312 a7399f66 Iustin Pop

313 a7399f66 Iustin Pop
    @param state: the serialized opcode data
314 a7399f66 Iustin Pop
    @type state:  C{dict}
315 a7399f66 Iustin Pop

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

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

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

351 1cbef6d8 Michael Hanselmann
    @type set_defaults: bool
352 1cbef6d8 Michael Hanselmann
    @param set_defaults: Whether to set default values
353 1cbef6d8 Michael Hanselmann
    @raise errors.OpPrereqError: When a parameter value doesn't match
354 1cbef6d8 Michael Hanselmann
                                 requirements
355 1cbef6d8 Michael Hanselmann

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

389 a7399f66 Iustin Pop
  This is the root of the actual OpCode hierarchy. All clases derived
390 a7399f66 Iustin Pop
  from this class should override OP_ID.
391 a7399f66 Iustin Pop

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

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

419 a7399f66 Iustin Pop
    This method adds to the state dictionary the OP_ID of the class,
420 a7399f66 Iustin Pop
    so that on unload we can identify the correct class for
421 a7399f66 Iustin Pop
    instantiating the opcode.
422 a7399f66 Iustin Pop

423 a7399f66 Iustin Pop
    @rtype:   C{dict}
424 a7399f66 Iustin Pop
    @return:  the state as a dictionary
425 a7399f66 Iustin Pop

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

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

439 a7399f66 Iustin Pop
    @type data:  C{dict}
440 a7399f66 Iustin Pop
    @param data: the serialized opcode
441 a7399f66 Iustin Pop

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

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

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

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

501 b5f5fae9 Luca Bigliardi
  This opcode does not touch the cluster at all. Its purpose is to run hooks
502 b5f5fae9 Luca Bigliardi
  after the cluster has been initialized.
503 b5f5fae9 Luca Bigliardi

504 b5f5fae9 Luca Bigliardi
  """
505 b5f5fae9 Luca Bigliardi
506 b5f5fae9 Luca Bigliardi
507 c6d43e9e Iustin Pop
class OpClusterDestroy(OpCode):
508 a7399f66 Iustin Pop
  """Destroy the cluster.
509 a7399f66 Iustin Pop

510 a7399f66 Iustin Pop
  This opcode has no other parameters. All the state is irreversibly
511 a7399f66 Iustin Pop
  lost after the execution of this opcode.
512 a7399f66 Iustin Pop

513 a7399f66 Iustin Pop
  """
514 a8083063 Iustin Pop
515 a8083063 Iustin Pop
516 a2f7ab92 Iustin Pop
class OpClusterQuery(OpCode):
517 fdc267f4 Iustin Pop
  """Query cluster information."""
518 a8083063 Iustin Pop
519 a8083063 Iustin Pop
520 bf93ae69 Adeodato Simo
class OpClusterVerifyConfig(OpCode):
521 bf93ae69 Adeodato Simo
  """Verify the cluster config.
522 bf93ae69 Adeodato Simo

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

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

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

555 150e978f Iustin Pop
  Parameters: none
556 150e978f Iustin Pop

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

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

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

572 150e978f Iustin Pop
  """
573 150e978f Iustin Pop
574 150e978f Iustin Pop
575 5d01aca3 Iustin Pop
class OpClusterRepairDiskSizes(OpCode):
576 60975797 Iustin Pop
  """Verify the disk sizes of the instances and fixes configuration
577 60975797 Iustin Pop
  mimatches.
578 60975797 Iustin Pop

579 60975797 Iustin Pop
  Parameters: optional instances list, in case we want to restrict the
580 60975797 Iustin Pop
  checks to only a subset of the instances.
581 60975797 Iustin Pop

582 60975797 Iustin Pop
  Result: a list of tuples, (instance, disk, new-size) for changed
583 60975797 Iustin Pop
  configurations.
584 60975797 Iustin Pop

585 60975797 Iustin Pop
  In normal operation, the list should be empty.
586 60975797 Iustin Pop

587 60975797 Iustin Pop
  @type instances: list
588 60975797 Iustin Pop
  @ivar instances: the list of instances to check, or empty for all instances
589 60975797 Iustin Pop

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

606 a7399f66 Iustin Pop
  @type name: C{str}
607 a7399f66 Iustin Pop
  @ivar name: The new name of the cluster. The name and/or the master IP
608 a7399f66 Iustin Pop
              address will be changed to match the new name and its IP
609 a7399f66 Iustin Pop
              address.
610 a7399f66 Iustin Pop

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

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

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

680 afee0879 Iustin Pop
  """
681 afee0879 Iustin Pop
682 83f72637 Michael Hanselmann
683 83f72637 Michael Hanselmann
class OpQuery(OpCode):
684 83f72637 Michael Hanselmann
  """Query for resources/items.
685 83f72637 Michael Hanselmann

686 abd66bf8 Michael Hanselmann
  @ivar what: Resources to query for, must be one of L{constants.QR_VIA_OP}
687 83f72637 Michael Hanselmann
  @ivar fields: List of fields to retrieve
688 83f72637 Michael Hanselmann
  @ivar filter: Query filter
689 83f72637 Michael Hanselmann

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

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

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

735 a7399f66 Iustin Pop
  @type node_name: C{str}
736 a7399f66 Iustin Pop
  @ivar node_name: The name of the node to remove. If the node still has
737 a7399f66 Iustin Pop
                   instances on it, the operation will fail.
738 a7399f66 Iustin Pop

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

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

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

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

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

1075 53c776b5 Iustin Pop
  This migrates (without shutting down an instance) to its secondary
1076 53c776b5 Iustin Pop
  node.
1077 53c776b5 Iustin Pop

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

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

1100 313bcead Iustin Pop
  This move (with shutting down an instance and data copying) to an
1101 313bcead Iustin Pop
  arbitrary node.
1102 313bcead Iustin Pop

1103 313bcead Iustin Pop
  @ivar instance_name: the name of the instance
1104 313bcead Iustin Pop
  @ivar target_node: the destination node
1105 313bcead Iustin Pop

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

1299 1410fa8d Michael Hanselmann
  @ivar instance_name: Instance name
1300 1410fa8d Michael Hanselmann
  @ivar mode: Export mode (one of L{constants.EXPORT_MODES})
1301 1410fa8d Michael Hanselmann

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

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

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

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

1399 06009e27 Iustin Pop
  This is used just for debugging and testing.
1400 06009e27 Iustin Pop

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

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

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

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

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

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

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

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

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

1493 dbc96028 Michael Hanselmann
  Does not eliminate duplicates by C{OP_ID}.
1494 dbc96028 Michael Hanselmann

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