Statistics
| Branch: | Tag: | Revision:

root / lib / opcodes.py @ a52978c7

History | View | Annotate | Download (50.6 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 b459a848 Andrea Spadaccini
# pylint: disable=R0903
35 a8083063 Iustin Pop
36 1cbef6d8 Michael Hanselmann
import logging
37 ff0d18e6 Iustin Pop
import re
38 1cbef6d8 Michael Hanselmann
39 eb62069e Iustin Pop
from ganeti import compat
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 e1f23243 Michael Hanselmann
_PEarlyRelease = ("early_release", False, ht.TBool,
116 e1f23243 Michael Hanselmann
                  "Whether to release locks as soon as possible")
117 e1f23243 Michael Hanselmann
118 45d4c81c Michael Hanselmann
_PIpCheckDoc = "Whether to ensure instance's IP address is inactive"
119 45d4c81c Michael Hanselmann
120 9b64e486 Iustin Pop
#: Do not remember instance state changes
121 6aac5aef Iustin Pop
_PNoRemember = ("no_remember", False, ht.TBool,
122 6aac5aef Iustin Pop
                "Do not remember the state change")
123 9b64e486 Iustin Pop
124 f8fa4175 Michael Hanselmann
#: Target node for instance migration/failover
125 f8fa4175 Michael Hanselmann
_PMigrationTargetNode = ("target_node", None, ht.TMaybeString,
126 f8fa4175 Michael Hanselmann
                         "Target node for shared-storage instances")
127 f8fa4175 Michael Hanselmann
128 323f9095 Stephen Shirley
_PStartupPaused = ("startup_paused", False, ht.TBool,
129 323f9095 Stephen Shirley
                   "Pause instance at startup")
130 323f9095 Stephen Shirley
131 57106b74 Michael Hanselmann
_PVerbose = ("verbose", False, ht.TBool, "Verbose mode")
132 57106b74 Michael Hanselmann
133 57106b74 Michael Hanselmann
# Parameters for cluster verification
134 57106b74 Michael Hanselmann
_PDebugSimulateErrors = ("debug_simulate_errors", False, ht.TBool,
135 57106b74 Michael Hanselmann
                         "Whether to simulate errors (useful for debugging)")
136 57106b74 Michael Hanselmann
_PErrorCodes = ("error_codes", False, ht.TBool, "Error codes")
137 57106b74 Michael Hanselmann
_PSkipChecks = ("skip_checks", ht.EmptyList,
138 57106b74 Michael Hanselmann
                ht.TListOf(ht.TElemOf(constants.VERIFY_OPTIONAL_CHECKS)),
139 57106b74 Michael Hanselmann
                "Which checks to skip")
140 323f9095 Stephen Shirley
141 ff0d18e6 Iustin Pop
#: OP_ID conversion regular expression
142 ff0d18e6 Iustin Pop
_OPID_RE = re.compile("([a-z])([A-Z])")
143 ff0d18e6 Iustin Pop
144 8c9ee749 Michael Hanselmann
#: Utility function for L{OpClusterSetParams}
145 8c9ee749 Michael Hanselmann
_TestClusterOsList = ht.TOr(ht.TNone,
146 8c9ee749 Michael Hanselmann
  ht.TListOf(ht.TAnd(ht.TList, ht.TIsLength(2),
147 eb62069e Iustin Pop
    ht.TMap(ht.WithDesc("GetFirstItem")(compat.fst),
148 8c9ee749 Michael Hanselmann
            ht.TElemOf(constants.DDMS_VALUES)))))
149 8c9ee749 Michael Hanselmann
150 ff0d18e6 Iustin Pop
151 526a662a Michael Hanselmann
# TODO: Generate check from constants.INIC_PARAMS_TYPES
152 526a662a Michael Hanselmann
#: Utility function for testing NIC definitions
153 526a662a Michael Hanselmann
_TestNicDef = ht.TDictOf(ht.TElemOf(constants.INIC_PARAMS),
154 526a662a Michael Hanselmann
                         ht.TOr(ht.TNone, ht.TNonEmptyString))
155 526a662a Michael Hanselmann
156 1456df62 Michael Hanselmann
_TSetParamsResultItemItems = [
157 1456df62 Michael Hanselmann
  ht.Comment("name of changed parameter")(ht.TNonEmptyString),
158 1456df62 Michael Hanselmann
  ht.TAny,
159 1456df62 Michael Hanselmann
  ]
160 1456df62 Michael Hanselmann
161 1456df62 Michael Hanselmann
_TSetParamsResult = \
162 1456df62 Michael Hanselmann
  ht.TListOf(ht.TAnd(ht.TIsLength(len(_TSetParamsResultItemItems)),
163 1456df62 Michael Hanselmann
                     ht.TItems(_TSetParamsResultItemItems)))
164 1456df62 Michael Hanselmann
165 3ce9a5e7 Michael Hanselmann
_SUMMARY_PREFIX = {
166 3ce9a5e7 Michael Hanselmann
  "CLUSTER_": "C_",
167 3ce9a5e7 Michael Hanselmann
  "GROUP_": "G_",
168 3ce9a5e7 Michael Hanselmann
  "NODE_": "N_",
169 3ce9a5e7 Michael Hanselmann
  "INSTANCE_": "I_",
170 3ce9a5e7 Michael Hanselmann
  }
171 3ce9a5e7 Michael Hanselmann
172 b95479a5 Michael Hanselmann
#: Attribute name for dependencies
173 b95479a5 Michael Hanselmann
DEPEND_ATTR = "depends"
174 b95479a5 Michael Hanselmann
175 018ae30b Michael Hanselmann
#: Attribute name for comment
176 018ae30b Michael Hanselmann
COMMENT_ATTR = "comment"
177 018ae30b Michael Hanselmann
178 526a662a Michael Hanselmann
179 ff0d18e6 Iustin Pop
def _NameToId(name):
180 ff0d18e6 Iustin Pop
  """Convert an opcode class name to an OP_ID.
181 ff0d18e6 Iustin Pop

182 ff0d18e6 Iustin Pop
  @type name: string
183 ff0d18e6 Iustin Pop
  @param name: the class name, as OpXxxYyy
184 ff0d18e6 Iustin Pop
  @rtype: string
185 ff0d18e6 Iustin Pop
  @return: the name in the OP_XXXX_YYYY format
186 ff0d18e6 Iustin Pop

187 ff0d18e6 Iustin Pop
  """
188 ff0d18e6 Iustin Pop
  if not name.startswith("Op"):
189 ff0d18e6 Iustin Pop
    return None
190 ff0d18e6 Iustin Pop
  # Note: (?<=[a-z])(?=[A-Z]) would be ideal, since it wouldn't
191 ff0d18e6 Iustin Pop
  # consume any input, and hence we would just have all the elements
192 ff0d18e6 Iustin Pop
  # in the list, one by one; but it seems that split doesn't work on
193 ff0d18e6 Iustin Pop
  # non-consuming input, hence we have to process the input string a
194 ff0d18e6 Iustin Pop
  # bit
195 ff0d18e6 Iustin Pop
  name = _OPID_RE.sub(r"\1,\2", name)
196 ff0d18e6 Iustin Pop
  elems = name.split(",")
197 ff0d18e6 Iustin Pop
  return "_".join(n.upper() for n in elems)
198 ff0d18e6 Iustin Pop
199 65e183af Michael Hanselmann
200 65e183af Michael Hanselmann
def RequireFileStorage():
201 65e183af Michael Hanselmann
  """Checks that file storage is enabled.
202 65e183af Michael Hanselmann

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

206 65e183af Michael Hanselmann
  @raise errors.OpPrereqError: when file storage is disabled
207 65e183af Michael Hanselmann

208 65e183af Michael Hanselmann
  """
209 65e183af Michael Hanselmann
  if not constants.ENABLE_FILE_STORAGE:
210 65e183af Michael Hanselmann
    raise errors.OpPrereqError("File storage disabled at configure time",
211 65e183af Michael Hanselmann
                               errors.ECODE_INVAL)
212 65e183af Michael Hanselmann
213 65e183af Michael Hanselmann
214 4b97f902 Apollon Oikonomopoulos
def RequireSharedFileStorage():
215 4b97f902 Apollon Oikonomopoulos
  """Checks that shared file storage is enabled.
216 4b97f902 Apollon Oikonomopoulos

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

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

222 4b97f902 Apollon Oikonomopoulos
  """
223 4b97f902 Apollon Oikonomopoulos
  if not constants.ENABLE_SHARED_FILE_STORAGE:
224 4b97f902 Apollon Oikonomopoulos
    raise errors.OpPrereqError("Shared file storage disabled at"
225 4b97f902 Apollon Oikonomopoulos
                               " configure time", errors.ECODE_INVAL)
226 4b97f902 Apollon Oikonomopoulos
227 4b97f902 Apollon Oikonomopoulos
228 8c9ee749 Michael Hanselmann
@ht.WithDesc("CheckFileStorage")
229 8c9ee749 Michael Hanselmann
def _CheckFileStorage(value):
230 8c9ee749 Michael Hanselmann
  """Ensures file storage is enabled if used.
231 65e183af Michael Hanselmann

232 65e183af Michael Hanselmann
  """
233 8c9ee749 Michael Hanselmann
  if value == constants.DT_FILE:
234 65e183af Michael Hanselmann
    RequireFileStorage()
235 4b97f902 Apollon Oikonomopoulos
  elif value == constants.DT_SHARED_FILE:
236 4b97f902 Apollon Oikonomopoulos
    RequireSharedFileStorage()
237 65e183af Michael Hanselmann
  return True
238 65e183af Michael Hanselmann
239 65e183af Michael Hanselmann
240 45fe090b Michael Hanselmann
def _BuildDiskTemplateCheck(accept_none):
241 45fe090b Michael Hanselmann
  """Builds check for disk template.
242 45fe090b Michael Hanselmann

243 45fe090b Michael Hanselmann
  @type accept_none: bool
244 45fe090b Michael Hanselmann
  @param accept_none: whether to accept None as a correct value
245 45fe090b Michael Hanselmann
  @rtype: callable
246 45fe090b Michael Hanselmann

247 45fe090b Michael Hanselmann
  """
248 45fe090b Michael Hanselmann
  template_check = ht.TElemOf(constants.DISK_TEMPLATES)
249 45fe090b Michael Hanselmann
250 45fe090b Michael Hanselmann
  if accept_none:
251 45fe090b Michael Hanselmann
    template_check = ht.TOr(template_check, ht.TNone)
252 45fe090b Michael Hanselmann
253 45fe090b Michael Hanselmann
  return ht.TAnd(template_check, _CheckFileStorage)
254 8c9ee749 Michael Hanselmann
255 8c9ee749 Michael Hanselmann
256 65e183af Michael Hanselmann
def _CheckStorageType(storage_type):
257 65e183af Michael Hanselmann
  """Ensure a given storage type is valid.
258 65e183af Michael Hanselmann

259 65e183af Michael Hanselmann
  """
260 65e183af Michael Hanselmann
  if storage_type not in constants.VALID_STORAGE_TYPES:
261 65e183af Michael Hanselmann
    raise errors.OpPrereqError("Unknown storage type: %s" % storage_type,
262 65e183af Michael Hanselmann
                               errors.ECODE_INVAL)
263 65e183af Michael Hanselmann
  if storage_type == constants.ST_FILE:
264 65e183af Michael Hanselmann
    RequireFileStorage()
265 65e183af Michael Hanselmann
  return True
266 65e183af Michael Hanselmann
267 65e183af Michael Hanselmann
268 65e183af Michael Hanselmann
#: Storage type parameter
269 45d4c81c Michael Hanselmann
_PStorageType = ("storage_type", ht.NoDefault, _CheckStorageType,
270 45d4c81c Michael Hanselmann
                 "Storage type")
271 65e183af Michael Hanselmann
272 65e183af Michael Hanselmann
273 65e183af Michael Hanselmann
class _AutoOpParamSlots(type):
274 65e183af Michael Hanselmann
  """Meta class for opcode definitions.
275 65e183af Michael Hanselmann

276 65e183af Michael Hanselmann
  """
277 65e183af Michael Hanselmann
  def __new__(mcs, name, bases, attrs):
278 65e183af Michael Hanselmann
    """Called when a class should be created.
279 65e183af Michael Hanselmann

280 65e183af Michael Hanselmann
    @param mcs: The meta class
281 65e183af Michael Hanselmann
    @param name: Name of created class
282 65e183af Michael Hanselmann
    @param bases: Base classes
283 65e183af Michael Hanselmann
    @type attrs: dict
284 65e183af Michael Hanselmann
    @param attrs: Class attributes
285 65e183af Michael Hanselmann

286 65e183af Michael Hanselmann
    """
287 65e183af Michael Hanselmann
    assert "__slots__" not in attrs, \
288 65e183af Michael Hanselmann
      "Class '%s' defines __slots__ when it should use OP_PARAMS" % name
289 e89a9021 Iustin Pop
    assert "OP_ID" not in attrs, "Class '%s' defining OP_ID" % name
290 ff0d18e6 Iustin Pop
291 e89a9021 Iustin Pop
    attrs["OP_ID"] = _NameToId(name)
292 65e183af Michael Hanselmann
293 65e183af Michael Hanselmann
    # Always set OP_PARAMS to avoid duplicates in BaseOpCode.GetAllParams
294 65e183af Michael Hanselmann
    params = attrs.setdefault("OP_PARAMS", [])
295 65e183af Michael Hanselmann
296 65e183af Michael Hanselmann
    # Use parameter names as slots
297 197b323b Michael Hanselmann
    slots = [pname for (pname, _, _, _) in params]
298 65e183af Michael Hanselmann
299 65e183af Michael Hanselmann
    assert "OP_DSC_FIELD" not in attrs or attrs["OP_DSC_FIELD"] in slots, \
300 65e183af Michael Hanselmann
      "Class '%s' uses unknown field in OP_DSC_FIELD" % name
301 65e183af Michael Hanselmann
302 65e183af Michael Hanselmann
    attrs["__slots__"] = slots
303 65e183af Michael Hanselmann
304 65e183af Michael Hanselmann
    return type.__new__(mcs, name, bases, attrs)
305 65e183af Michael Hanselmann
306 df458e0b Iustin Pop
307 0e46916d Iustin Pop
class BaseOpCode(object):
308 df458e0b Iustin Pop
  """A simple serializable object.
309 df458e0b Iustin Pop

310 0e46916d Iustin Pop
  This object serves as a parent class for OpCode without any custom
311 0e46916d Iustin Pop
  field handling.
312 0e46916d Iustin Pop

313 df458e0b Iustin Pop
  """
314 b459a848 Andrea Spadaccini
  # pylint: disable=E1101
315 e89a9021 Iustin Pop
  # as OP_ID is dynamically defined
316 65e183af Michael Hanselmann
  __metaclass__ = _AutoOpParamSlots
317 65e183af Michael Hanselmann
318 a8083063 Iustin Pop
  def __init__(self, **kwargs):
319 a7399f66 Iustin Pop
    """Constructor for BaseOpCode.
320 a7399f66 Iustin Pop

321 a7399f66 Iustin Pop
    The constructor takes only keyword arguments and will set
322 a7399f66 Iustin Pop
    attributes on this object based on the passed arguments. As such,
323 a7399f66 Iustin Pop
    it means that you should not pass arguments which are not in the
324 a7399f66 Iustin Pop
    __slots__ attribute for this class.
325 a7399f66 Iustin Pop

326 a7399f66 Iustin Pop
    """
327 adf385c7 Iustin Pop
    slots = self._all_slots()
328 a8083063 Iustin Pop
    for key in kwargs:
329 adf385c7 Iustin Pop
      if key not in slots:
330 df458e0b Iustin Pop
        raise TypeError("Object %s doesn't support the parameter '%s'" %
331 3ecf6786 Iustin Pop
                        (self.__class__.__name__, key))
332 a8083063 Iustin Pop
      setattr(self, key, kwargs[key])
333 a8083063 Iustin Pop
334 df458e0b Iustin Pop
  def __getstate__(self):
335 a7399f66 Iustin Pop
    """Generic serializer.
336 a7399f66 Iustin Pop

337 a7399f66 Iustin Pop
    This method just returns the contents of the instance as a
338 a7399f66 Iustin Pop
    dictionary.
339 a7399f66 Iustin Pop

340 a7399f66 Iustin Pop
    @rtype:  C{dict}
341 a7399f66 Iustin Pop
    @return: the instance attributes and their values
342 a7399f66 Iustin Pop

343 a7399f66 Iustin Pop
    """
344 df458e0b Iustin Pop
    state = {}
345 adf385c7 Iustin Pop
    for name in self._all_slots():
346 df458e0b Iustin Pop
      if hasattr(self, name):
347 df458e0b Iustin Pop
        state[name] = getattr(self, name)
348 df458e0b Iustin Pop
    return state
349 df458e0b Iustin Pop
350 df458e0b Iustin Pop
  def __setstate__(self, state):
351 a7399f66 Iustin Pop
    """Generic unserializer.
352 a7399f66 Iustin Pop

353 a7399f66 Iustin Pop
    This method just restores from the serialized state the attributes
354 a7399f66 Iustin Pop
    of the current instance.
355 a7399f66 Iustin Pop

356 a7399f66 Iustin Pop
    @param state: the serialized opcode data
357 a7399f66 Iustin Pop
    @type state:  C{dict}
358 a7399f66 Iustin Pop

359 a7399f66 Iustin Pop
    """
360 df458e0b Iustin Pop
    if not isinstance(state, dict):
361 df458e0b Iustin Pop
      raise ValueError("Invalid data to __setstate__: expected dict, got %s" %
362 df458e0b Iustin Pop
                       type(state))
363 df458e0b Iustin Pop
364 adf385c7 Iustin Pop
    for name in self._all_slots():
365 44db3a6f Iustin Pop
      if name not in state and hasattr(self, name):
366 df458e0b Iustin Pop
        delattr(self, name)
367 df458e0b Iustin Pop
368 df458e0b Iustin Pop
    for name in state:
369 df458e0b Iustin Pop
      setattr(self, name, state[name])
370 df458e0b Iustin Pop
371 adf385c7 Iustin Pop
  @classmethod
372 adf385c7 Iustin Pop
  def _all_slots(cls):
373 adf385c7 Iustin Pop
    """Compute the list of all declared slots for a class.
374 adf385c7 Iustin Pop

375 adf385c7 Iustin Pop
    """
376 adf385c7 Iustin Pop
    slots = []
377 adf385c7 Iustin Pop
    for parent in cls.__mro__:
378 adf385c7 Iustin Pop
      slots.extend(getattr(parent, "__slots__", []))
379 adf385c7 Iustin Pop
    return slots
380 adf385c7 Iustin Pop
381 65e183af Michael Hanselmann
  @classmethod
382 65e183af Michael Hanselmann
  def GetAllParams(cls):
383 65e183af Michael Hanselmann
    """Compute list of all parameters for an opcode.
384 65e183af Michael Hanselmann

385 65e183af Michael Hanselmann
    """
386 65e183af Michael Hanselmann
    slots = []
387 65e183af Michael Hanselmann
    for parent in cls.__mro__:
388 65e183af Michael Hanselmann
      slots.extend(getattr(parent, "OP_PARAMS", []))
389 65e183af Michael Hanselmann
    return slots
390 65e183af Michael Hanselmann
391 1cbef6d8 Michael Hanselmann
  def Validate(self, set_defaults):
392 1cbef6d8 Michael Hanselmann
    """Validate opcode parameters, optionally setting default values.
393 1cbef6d8 Michael Hanselmann

394 1cbef6d8 Michael Hanselmann
    @type set_defaults: bool
395 1cbef6d8 Michael Hanselmann
    @param set_defaults: Whether to set default values
396 1cbef6d8 Michael Hanselmann
    @raise errors.OpPrereqError: When a parameter value doesn't match
397 1cbef6d8 Michael Hanselmann
                                 requirements
398 1cbef6d8 Michael Hanselmann

399 1cbef6d8 Michael Hanselmann
    """
400 197b323b Michael Hanselmann
    for (attr_name, default, test, _) in self.GetAllParams():
401 1cbef6d8 Michael Hanselmann
      assert test == ht.NoType or callable(test)
402 1cbef6d8 Michael Hanselmann
403 1cbef6d8 Michael Hanselmann
      if not hasattr(self, attr_name):
404 1cbef6d8 Michael Hanselmann
        if default == ht.NoDefault:
405 1cbef6d8 Michael Hanselmann
          raise errors.OpPrereqError("Required parameter '%s.%s' missing" %
406 1cbef6d8 Michael Hanselmann
                                     (self.OP_ID, attr_name),
407 1cbef6d8 Michael Hanselmann
                                     errors.ECODE_INVAL)
408 1cbef6d8 Michael Hanselmann
        elif set_defaults:
409 1cbef6d8 Michael Hanselmann
          if callable(default):
410 1cbef6d8 Michael Hanselmann
            dval = default()
411 1cbef6d8 Michael Hanselmann
          else:
412 1cbef6d8 Michael Hanselmann
            dval = default
413 1cbef6d8 Michael Hanselmann
          setattr(self, attr_name, dval)
414 1cbef6d8 Michael Hanselmann
415 1cbef6d8 Michael Hanselmann
      if test == ht.NoType:
416 1cbef6d8 Michael Hanselmann
        # no tests here
417 1cbef6d8 Michael Hanselmann
        continue
418 1cbef6d8 Michael Hanselmann
419 1cbef6d8 Michael Hanselmann
      if set_defaults or hasattr(self, attr_name):
420 1cbef6d8 Michael Hanselmann
        attr_val = getattr(self, attr_name)
421 1cbef6d8 Michael Hanselmann
        if not test(attr_val):
422 1cbef6d8 Michael Hanselmann
          logging.error("OpCode %s, parameter %s, has invalid type %s/value %s",
423 1cbef6d8 Michael Hanselmann
                        self.OP_ID, attr_name, type(attr_val), attr_val)
424 1cbef6d8 Michael Hanselmann
          raise errors.OpPrereqError("Parameter '%s.%s' fails validation" %
425 1cbef6d8 Michael Hanselmann
                                     (self.OP_ID, attr_name),
426 1cbef6d8 Michael Hanselmann
                                     errors.ECODE_INVAL)
427 1cbef6d8 Michael Hanselmann
428 df458e0b Iustin Pop
429 b247c6fc Michael Hanselmann
def _BuildJobDepCheck(relative):
430 b247c6fc Michael Hanselmann
  """Builds check for job dependencies (L{DEPEND_ATTR}).
431 b247c6fc Michael Hanselmann

432 b247c6fc Michael Hanselmann
  @type relative: bool
433 b247c6fc Michael Hanselmann
  @param relative: Whether to accept relative job IDs (negative)
434 b247c6fc Michael Hanselmann
  @rtype: callable
435 b247c6fc Michael Hanselmann

436 b247c6fc Michael Hanselmann
  """
437 b247c6fc Michael Hanselmann
  if relative:
438 b247c6fc Michael Hanselmann
    job_id = ht.TOr(ht.TJobId, ht.TRelativeJobId)
439 b247c6fc Michael Hanselmann
  else:
440 b247c6fc Michael Hanselmann
    job_id = ht.TJobId
441 b247c6fc Michael Hanselmann
442 b247c6fc Michael Hanselmann
  job_dep = \
443 b247c6fc Michael Hanselmann
    ht.TAnd(ht.TIsLength(2),
444 b247c6fc Michael Hanselmann
            ht.TItems([job_id,
445 b247c6fc Michael Hanselmann
                       ht.TListOf(ht.TElemOf(constants.JOBS_FINALIZED))]))
446 b247c6fc Michael Hanselmann
447 b247c6fc Michael Hanselmann
  return ht.TOr(ht.TNone, ht.TListOf(job_dep))
448 b247c6fc Michael Hanselmann
449 b247c6fc Michael Hanselmann
450 b247c6fc Michael Hanselmann
TNoRelativeJobDependencies = _BuildJobDepCheck(False)
451 b247c6fc Michael Hanselmann
452 1ce03fb1 Michael Hanselmann
#: List of submission status and job ID as returned by C{SubmitManyJobs}
453 1456df62 Michael Hanselmann
_TJobIdListItem = \
454 1456df62 Michael Hanselmann
  ht.TAnd(ht.TIsLength(2),
455 1456df62 Michael Hanselmann
          ht.TItems([ht.Comment("success")(ht.TBool),
456 1456df62 Michael Hanselmann
                     ht.Comment("Job ID if successful, error message"
457 1456df62 Michael Hanselmann
                                " otherwise")(ht.TOr(ht.TString,
458 1456df62 Michael Hanselmann
                                                     ht.TJobId))]))
459 1456df62 Michael Hanselmann
TJobIdList = ht.TListOf(_TJobIdListItem)
460 1ce03fb1 Michael Hanselmann
461 f7686867 Michael Hanselmann
#: Result containing only list of submitted jobs
462 f7686867 Michael Hanselmann
TJobIdListOnly = ht.TStrictDict(True, True, {
463 1456df62 Michael Hanselmann
  constants.JOB_IDS_KEY: ht.Comment("List of submitted jobs")(TJobIdList),
464 f7686867 Michael Hanselmann
  })
465 f7686867 Michael Hanselmann
466 b247c6fc Michael Hanselmann
467 0e46916d Iustin Pop
class OpCode(BaseOpCode):
468 a7399f66 Iustin Pop
  """Abstract OpCode.
469 a7399f66 Iustin Pop

470 a7399f66 Iustin Pop
  This is the root of the actual OpCode hierarchy. All clases derived
471 a7399f66 Iustin Pop
  from this class should override OP_ID.
472 a7399f66 Iustin Pop

473 a7399f66 Iustin Pop
  @cvar OP_ID: The ID of this opcode. This should be unique amongst all
474 20777413 Iustin Pop
               children of this class.
475 bde8f481 Adeodato Simo
  @cvar OP_DSC_FIELD: The name of a field whose value will be included in the
476 bde8f481 Adeodato Simo
                      string returned by Summary(); see the docstring of that
477 bde8f481 Adeodato Simo
                      method for details).
478 65e183af Michael Hanselmann
  @cvar OP_PARAMS: List of opcode attributes, the default values they should
479 65e183af Michael Hanselmann
                   get if not already defined, and types they must match.
480 1ce03fb1 Michael Hanselmann
  @cvar OP_RESULT: Callable to verify opcode result
481 687c10d9 Iustin Pop
  @cvar WITH_LU: Boolean that specifies whether this should be included in
482 687c10d9 Iustin Pop
      mcpu's dispatch table
483 20777413 Iustin Pop
  @ivar dry_run: Whether the LU should be run in dry-run mode, i.e. just
484 20777413 Iustin Pop
                 the check steps
485 8f5c488d Michael Hanselmann
  @ivar priority: Opcode priority for queue
486 a7399f66 Iustin Pop

487 a7399f66 Iustin Pop
  """
488 b459a848 Andrea Spadaccini
  # pylint: disable=E1101
489 e89a9021 Iustin Pop
  # as OP_ID is dynamically defined
490 687c10d9 Iustin Pop
  WITH_LU = True
491 65e183af Michael Hanselmann
  OP_PARAMS = [
492 45d4c81c Michael Hanselmann
    ("dry_run", None, ht.TMaybeBool, "Run checks only, don't execute"),
493 45d4c81c Michael Hanselmann
    ("debug_level", None, ht.TOr(ht.TNone, ht.TPositiveInt), "Debug level"),
494 65e183af Michael Hanselmann
    ("priority", constants.OP_PRIO_DEFAULT,
495 45d4c81c Michael Hanselmann
     ht.TElemOf(constants.OP_PRIO_SUBMIT_VALID), "Opcode priority"),
496 b247c6fc Michael Hanselmann
    (DEPEND_ATTR, None, _BuildJobDepCheck(True),
497 b247c6fc Michael Hanselmann
     "Job dependencies; if used through ``SubmitManyJobs`` relative (negative)"
498 b247c6fc Michael Hanselmann
     " job IDs can be used"),
499 018ae30b Michael Hanselmann
    (COMMENT_ATTR, None, ht.TMaybeString,
500 018ae30b Michael Hanselmann
     "Comment describing the purpose of the opcode"),
501 65e183af Michael Hanselmann
    ]
502 1ce03fb1 Michael Hanselmann
  OP_RESULT = None
503 df458e0b Iustin Pop
504 df458e0b Iustin Pop
  def __getstate__(self):
505 df458e0b Iustin Pop
    """Specialized getstate for opcodes.
506 df458e0b Iustin Pop

507 a7399f66 Iustin Pop
    This method adds to the state dictionary the OP_ID of the class,
508 a7399f66 Iustin Pop
    so that on unload we can identify the correct class for
509 a7399f66 Iustin Pop
    instantiating the opcode.
510 a7399f66 Iustin Pop

511 a7399f66 Iustin Pop
    @rtype:   C{dict}
512 a7399f66 Iustin Pop
    @return:  the state as a dictionary
513 a7399f66 Iustin Pop

514 df458e0b Iustin Pop
    """
515 0e46916d Iustin Pop
    data = BaseOpCode.__getstate__(self)
516 df458e0b Iustin Pop
    data["OP_ID"] = self.OP_ID
517 df458e0b Iustin Pop
    return data
518 df458e0b Iustin Pop
519 df458e0b Iustin Pop
  @classmethod
520 00abdc96 Iustin Pop
  def LoadOpCode(cls, data):
521 df458e0b Iustin Pop
    """Generic load opcode method.
522 df458e0b Iustin Pop

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

527 a7399f66 Iustin Pop
    @type data:  C{dict}
528 a7399f66 Iustin Pop
    @param data: the serialized opcode
529 a7399f66 Iustin Pop

530 df458e0b Iustin Pop
    """
531 df458e0b Iustin Pop
    if not isinstance(data, dict):
532 df458e0b Iustin Pop
      raise ValueError("Invalid data to LoadOpCode (%s)" % type(data))
533 df458e0b Iustin Pop
    if "OP_ID" not in data:
534 df458e0b Iustin Pop
      raise ValueError("Invalid data to LoadOpcode, missing OP_ID")
535 df458e0b Iustin Pop
    op_id = data["OP_ID"]
536 df458e0b Iustin Pop
    op_class = None
537 363acb1e Iustin Pop
    if op_id in OP_MAPPING:
538 363acb1e Iustin Pop
      op_class = OP_MAPPING[op_id]
539 363acb1e Iustin Pop
    else:
540 df458e0b Iustin Pop
      raise ValueError("Invalid data to LoadOpCode: OP_ID %s unsupported" %
541 df458e0b Iustin Pop
                       op_id)
542 df458e0b Iustin Pop
    op = op_class()
543 df458e0b Iustin Pop
    new_data = data.copy()
544 df458e0b Iustin Pop
    del new_data["OP_ID"]
545 df458e0b Iustin Pop
    op.__setstate__(new_data)
546 df458e0b Iustin Pop
    return op
547 df458e0b Iustin Pop
548 60dd1473 Iustin Pop
  def Summary(self):
549 60dd1473 Iustin Pop
    """Generates a summary description of this opcode.
550 60dd1473 Iustin Pop

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

557 60dd1473 Iustin Pop
    """
558 ff0d18e6 Iustin Pop
    assert self.OP_ID is not None and len(self.OP_ID) > 3
559 60dd1473 Iustin Pop
    # all OP_ID start with OP_, we remove that
560 60dd1473 Iustin Pop
    txt = self.OP_ID[3:]
561 60dd1473 Iustin Pop
    field_name = getattr(self, "OP_DSC_FIELD", None)
562 60dd1473 Iustin Pop
    if field_name:
563 60dd1473 Iustin Pop
      field_value = getattr(self, field_name, None)
564 bc8bbda1 Iustin Pop
      if isinstance(field_value, (list, tuple)):
565 bc8bbda1 Iustin Pop
        field_value = ",".join(str(i) for i in field_value)
566 60dd1473 Iustin Pop
      txt = "%s(%s)" % (txt, field_value)
567 60dd1473 Iustin Pop
    return txt
568 60dd1473 Iustin Pop
569 3ce9a5e7 Michael Hanselmann
  def TinySummary(self):
570 3ce9a5e7 Michael Hanselmann
    """Generates a compact summary description of the opcode.
571 3ce9a5e7 Michael Hanselmann

572 3ce9a5e7 Michael Hanselmann
    """
573 3ce9a5e7 Michael Hanselmann
    assert self.OP_ID.startswith("OP_")
574 3ce9a5e7 Michael Hanselmann
575 3ce9a5e7 Michael Hanselmann
    text = self.OP_ID[3:]
576 3ce9a5e7 Michael Hanselmann
577 3ce9a5e7 Michael Hanselmann
    for (prefix, supplement) in _SUMMARY_PREFIX.items():
578 3ce9a5e7 Michael Hanselmann
      if text.startswith(prefix):
579 3ce9a5e7 Michael Hanselmann
        return supplement + text[len(prefix):]
580 3ce9a5e7 Michael Hanselmann
581 3ce9a5e7 Michael Hanselmann
    return text
582 3ce9a5e7 Michael Hanselmann
583 a8083063 Iustin Pop
584 afee0879 Iustin Pop
# cluster opcodes
585 afee0879 Iustin Pop
586 bc84ffa7 Iustin Pop
class OpClusterPostInit(OpCode):
587 b5f5fae9 Luca Bigliardi
  """Post cluster initialization.
588 b5f5fae9 Luca Bigliardi

589 b5f5fae9 Luca Bigliardi
  This opcode does not touch the cluster at all. Its purpose is to run hooks
590 b5f5fae9 Luca Bigliardi
  after the cluster has been initialized.
591 b5f5fae9 Luca Bigliardi

592 b5f5fae9 Luca Bigliardi
  """
593 b5f5fae9 Luca Bigliardi
594 b5f5fae9 Luca Bigliardi
595 c6d43e9e Iustin Pop
class OpClusterDestroy(OpCode):
596 a7399f66 Iustin Pop
  """Destroy the cluster.
597 a7399f66 Iustin Pop

598 a7399f66 Iustin Pop
  This opcode has no other parameters. All the state is irreversibly
599 a7399f66 Iustin Pop
  lost after the execution of this opcode.
600 a7399f66 Iustin Pop

601 a7399f66 Iustin Pop
  """
602 a8083063 Iustin Pop
603 a8083063 Iustin Pop
604 a2f7ab92 Iustin Pop
class OpClusterQuery(OpCode):
605 fdc267f4 Iustin Pop
  """Query cluster information."""
606 a8083063 Iustin Pop
607 a8083063 Iustin Pop
608 fcad7225 Michael Hanselmann
class OpClusterVerify(OpCode):
609 fcad7225 Michael Hanselmann
  """Submits all jobs necessary to verify the cluster.
610 fcad7225 Michael Hanselmann

611 fcad7225 Michael Hanselmann
  """
612 fcad7225 Michael Hanselmann
  OP_PARAMS = [
613 fcad7225 Michael Hanselmann
    _PDebugSimulateErrors,
614 fcad7225 Michael Hanselmann
    _PErrorCodes,
615 fcad7225 Michael Hanselmann
    _PSkipChecks,
616 fcad7225 Michael Hanselmann
    _PVerbose,
617 fcad7225 Michael Hanselmann
    ("group_name", None, ht.TMaybeString, "Group to verify")
618 fcad7225 Michael Hanselmann
    ]
619 f7686867 Michael Hanselmann
  OP_RESULT = TJobIdListOnly
620 fcad7225 Michael Hanselmann
621 fcad7225 Michael Hanselmann
622 bf93ae69 Adeodato Simo
class OpClusterVerifyConfig(OpCode):
623 bf93ae69 Adeodato Simo
  """Verify the cluster config.
624 bf93ae69 Adeodato Simo

625 bf93ae69 Adeodato Simo
  """
626 bf93ae69 Adeodato Simo
  OP_PARAMS = [
627 57106b74 Michael Hanselmann
    _PDebugSimulateErrors,
628 57106b74 Michael Hanselmann
    _PErrorCodes,
629 57106b74 Michael Hanselmann
    _PVerbose,
630 bf93ae69 Adeodato Simo
    ]
631 f7686867 Michael Hanselmann
  OP_RESULT = ht.TBool
632 bf93ae69 Adeodato Simo
633 bf93ae69 Adeodato Simo
634 bf93ae69 Adeodato Simo
class OpClusterVerifyGroup(OpCode):
635 bf93ae69 Adeodato Simo
  """Run verify on a node group from the cluster.
636 a7399f66 Iustin Pop

637 a7399f66 Iustin Pop
  @type skip_checks: C{list}
638 a7399f66 Iustin Pop
  @ivar skip_checks: steps to be skipped from the verify process; this
639 a7399f66 Iustin Pop
                     needs to be a subset of
640 a7399f66 Iustin Pop
                     L{constants.VERIFY_OPTIONAL_CHECKS}; currently
641 a7399f66 Iustin Pop
                     only L{constants.VERIFY_NPLUSONE_MEM} can be passed
642 a7399f66 Iustin Pop

643 a7399f66 Iustin Pop
  """
644 bf93ae69 Adeodato Simo
  OP_DSC_FIELD = "group_name"
645 65e183af Michael Hanselmann
  OP_PARAMS = [
646 57106b74 Michael Hanselmann
    _PGroupName,
647 57106b74 Michael Hanselmann
    _PDebugSimulateErrors,
648 57106b74 Michael Hanselmann
    _PErrorCodes,
649 57106b74 Michael Hanselmann
    _PSkipChecks,
650 57106b74 Michael Hanselmann
    _PVerbose,
651 65e183af Michael Hanselmann
    ]
652 f7686867 Michael Hanselmann
  OP_RESULT = ht.TBool
653 a8083063 Iustin Pop
654 a8083063 Iustin Pop
655 bd8210a7 Iustin Pop
class OpClusterVerifyDisks(OpCode):
656 150e978f Iustin Pop
  """Verify the cluster disks.
657 150e978f Iustin Pop

658 ae1a845c Michael Hanselmann
  """
659 f7686867 Michael Hanselmann
  OP_RESULT = TJobIdListOnly
660 ae1a845c Michael Hanselmann
661 ae1a845c Michael Hanselmann
662 ae1a845c Michael Hanselmann
class OpGroupVerifyDisks(OpCode):
663 ae1a845c Michael Hanselmann
  """Verifies the status of all disks in a node group.
664 150e978f Iustin Pop

665 ae1a845c Michael Hanselmann
  Result: a tuple of three elements:
666 ae1a845c Michael Hanselmann
    - dict of node names with issues (values: error msg)
667 150e978f Iustin Pop
    - list of instances with degraded disks (that should be activated)
668 b63ed789 Iustin Pop
    - dict of instances with missing logical volumes (values: (node, vol)
669 b63ed789 Iustin Pop
      pairs with details about the missing volumes)
670 150e978f Iustin Pop

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

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

679 150e978f Iustin Pop
  """
680 ae1a845c Michael Hanselmann
  OP_DSC_FIELD = "group_name"
681 ae1a845c Michael Hanselmann
  OP_PARAMS = [
682 ae1a845c Michael Hanselmann
    _PGroupName,
683 ae1a845c Michael Hanselmann
    ]
684 1ce03fb1 Michael Hanselmann
  OP_RESULT = \
685 1ce03fb1 Michael Hanselmann
    ht.TAnd(ht.TIsLength(3),
686 1ce03fb1 Michael Hanselmann
            ht.TItems([ht.TDictOf(ht.TString, ht.TString),
687 1ce03fb1 Michael Hanselmann
                       ht.TListOf(ht.TString),
688 1ce03fb1 Michael Hanselmann
                       ht.TDictOf(ht.TString, ht.TListOf(ht.TString))]))
689 150e978f Iustin Pop
690 150e978f Iustin Pop
691 5d01aca3 Iustin Pop
class OpClusterRepairDiskSizes(OpCode):
692 60975797 Iustin Pop
  """Verify the disk sizes of the instances and fixes configuration
693 60975797 Iustin Pop
  mimatches.
694 60975797 Iustin Pop

695 60975797 Iustin Pop
  Parameters: optional instances list, in case we want to restrict the
696 60975797 Iustin Pop
  checks to only a subset of the instances.
697 60975797 Iustin Pop

698 60975797 Iustin Pop
  Result: a list of tuples, (instance, disk, new-size) for changed
699 60975797 Iustin Pop
  configurations.
700 60975797 Iustin Pop

701 60975797 Iustin Pop
  In normal operation, the list should be empty.
702 60975797 Iustin Pop

703 60975797 Iustin Pop
  @type instances: list
704 60975797 Iustin Pop
  @ivar instances: the list of instances to check, or empty for all instances
705 60975797 Iustin Pop

706 60975797 Iustin Pop
  """
707 65e183af Michael Hanselmann
  OP_PARAMS = [
708 197b323b Michael Hanselmann
    ("instances", ht.EmptyList, ht.TListOf(ht.TNonEmptyString), None),
709 65e183af Michael Hanselmann
    ]
710 60975797 Iustin Pop
711 60975797 Iustin Pop
712 2f093ea0 Iustin Pop
class OpClusterConfigQuery(OpCode):
713 ae5849b5 Michael Hanselmann
  """Query cluster configuration values."""
714 65e183af Michael Hanselmann
  OP_PARAMS = [
715 65e183af Michael Hanselmann
    _POutputFields
716 65e183af Michael Hanselmann
    ]
717 a8083063 Iustin Pop
718 a8083063 Iustin Pop
719 e126df25 Iustin Pop
class OpClusterRename(OpCode):
720 a7399f66 Iustin Pop
  """Rename the cluster.
721 a7399f66 Iustin Pop

722 a7399f66 Iustin Pop
  @type name: C{str}
723 a7399f66 Iustin Pop
  @ivar name: The new name of the cluster. The name and/or the master IP
724 a7399f66 Iustin Pop
              address will be changed to match the new name and its IP
725 a7399f66 Iustin Pop
              address.
726 a7399f66 Iustin Pop

727 a7399f66 Iustin Pop
  """
728 60dd1473 Iustin Pop
  OP_DSC_FIELD = "name"
729 65e183af Michael Hanselmann
  OP_PARAMS = [
730 197b323b Michael Hanselmann
    ("name", ht.NoDefault, ht.TNonEmptyString, None),
731 65e183af Michael Hanselmann
    ]
732 07bd8a51 Iustin Pop
733 07bd8a51 Iustin Pop
734 a6682fdc Iustin Pop
class OpClusterSetParams(OpCode):
735 a7399f66 Iustin Pop
  """Change the parameters of the cluster.
736 a7399f66 Iustin Pop

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

740 a7399f66 Iustin Pop
  """
741 65e183af Michael Hanselmann
  OP_PARAMS = [
742 45d4c81c Michael Hanselmann
    ("vg_name", None, ht.TMaybeString, "Volume group name"),
743 65e183af Michael Hanselmann
    ("enabled_hypervisors", None,
744 65e183af Michael Hanselmann
     ht.TOr(ht.TAnd(ht.TListOf(ht.TElemOf(constants.HYPER_TYPES)), ht.TTrue),
745 45d4c81c Michael Hanselmann
            ht.TNone),
746 45d4c81c Michael Hanselmann
     "List of enabled hypervisors"),
747 65e183af Michael Hanselmann
    ("hvparams", None, ht.TOr(ht.TDictOf(ht.TNonEmptyString, ht.TDict),
748 45d4c81c Michael Hanselmann
                              ht.TNone),
749 45d4c81c Michael Hanselmann
     "Cluster-wide hypervisor parameter defaults, hypervisor-dependent"),
750 45d4c81c Michael Hanselmann
    ("beparams", None, ht.TOr(ht.TDict, ht.TNone),
751 45d4c81c Michael Hanselmann
     "Cluster-wide backend parameter defaults"),
752 65e183af Michael Hanselmann
    ("os_hvp", None, ht.TOr(ht.TDictOf(ht.TNonEmptyString, ht.TDict),
753 45d4c81c Michael Hanselmann
                            ht.TNone),
754 45d4c81c Michael Hanselmann
     "Cluster-wide per-OS hypervisor parameter defaults"),
755 65e183af Michael Hanselmann
    ("osparams", None, ht.TOr(ht.TDictOf(ht.TNonEmptyString, ht.TDict),
756 45d4c81c Michael Hanselmann
                              ht.TNone),
757 45d4c81c Michael Hanselmann
     "Cluster-wide OS parameter defaults"),
758 197b323b Michael Hanselmann
    ("candidate_pool_size", None, ht.TOr(ht.TStrictPositiveInt, ht.TNone),
759 45d4c81c Michael Hanselmann
     "Master candidate pool size"),
760 45d4c81c Michael Hanselmann
    ("uid_pool", None, ht.NoType,
761 45d4c81c Michael Hanselmann
     "Set UID pool, must be list of lists describing UID ranges (two items,"
762 45d4c81c Michael Hanselmann
     " start and end inclusive)"),
763 45d4c81c Michael Hanselmann
    ("add_uids", None, ht.NoType,
764 45d4c81c Michael Hanselmann
     "Extend UID pool, must be list of lists describing UID ranges (two"
765 45d4c81c Michael Hanselmann
     " items, start and end inclusive) to be added"),
766 45d4c81c Michael Hanselmann
    ("remove_uids", None, ht.NoType,
767 45d4c81c Michael Hanselmann
     "Shrink UID pool, must be list of lists describing UID ranges (two"
768 45d4c81c Michael Hanselmann
     " items, start and end inclusive) to be removed"),
769 45d4c81c Michael Hanselmann
    ("maintain_node_health", None, ht.TMaybeBool,
770 45d4c81c Michael Hanselmann
     "Whether to automatically maintain node health"),
771 45d4c81c Michael Hanselmann
    ("prealloc_wipe_disks", None, ht.TMaybeBool,
772 45d4c81c Michael Hanselmann
     "Whether to wipe disks before allocating them to instances"),
773 45d4c81c Michael Hanselmann
    ("nicparams", None, ht.TMaybeDict, "Cluster-wide NIC parameter defaults"),
774 45d4c81c Michael Hanselmann
    ("ndparams", None, ht.TMaybeDict, "Cluster-wide node parameter defaults"),
775 45d4c81c Michael Hanselmann
    ("drbd_helper", None, ht.TOr(ht.TString, ht.TNone), "DRBD helper program"),
776 45d4c81c Michael Hanselmann
    ("default_iallocator", None, ht.TOr(ht.TString, ht.TNone),
777 45d4c81c Michael Hanselmann
     "Default iallocator for cluster"),
778 45d4c81c Michael Hanselmann
    ("master_netdev", None, ht.TOr(ht.TString, ht.TNone),
779 45d4c81c Michael Hanselmann
     "Master network device"),
780 45d4c81c Michael Hanselmann
    ("reserved_lvs", None, ht.TOr(ht.TListOf(ht.TNonEmptyString), ht.TNone),
781 45d4c81c Michael Hanselmann
     "List of reserved LVs"),
782 45d4c81c Michael Hanselmann
    ("hidden_os", None, _TestClusterOsList,
783 45d4c81c Michael Hanselmann
     "Modify list of hidden operating systems. Each modification must have"
784 45d4c81c Michael Hanselmann
     " two items, the operation and the OS name. The operation can be"
785 45d4c81c Michael Hanselmann
     " ``%s`` or ``%s``." % (constants.DDM_ADD, constants.DDM_REMOVE)),
786 45d4c81c Michael Hanselmann
    ("blacklisted_os", None, _TestClusterOsList,
787 45d4c81c Michael Hanselmann
     "Modify list of blacklisted operating systems. Each modification must have"
788 45d4c81c Michael Hanselmann
     " two items, the operation and the OS name. The operation can be"
789 45d4c81c Michael Hanselmann
     " ``%s`` or ``%s``." % (constants.DDM_ADD, constants.DDM_REMOVE)),
790 4b7735f9 Iustin Pop
    ]
791 12515db7 Manuel Franceschini
792 12515db7 Manuel Franceschini
793 d1240007 Iustin Pop
class OpClusterRedistConf(OpCode):
794 afee0879 Iustin Pop
  """Force a full push of the cluster configuration.
795 afee0879 Iustin Pop

796 afee0879 Iustin Pop
  """
797 afee0879 Iustin Pop
798 83f72637 Michael Hanselmann
799 83f72637 Michael Hanselmann
class OpQuery(OpCode):
800 83f72637 Michael Hanselmann
  """Query for resources/items.
801 83f72637 Michael Hanselmann

802 abd66bf8 Michael Hanselmann
  @ivar what: Resources to query for, must be one of L{constants.QR_VIA_OP}
803 83f72637 Michael Hanselmann
  @ivar fields: List of fields to retrieve
804 83f72637 Michael Hanselmann
  @ivar filter: Query filter
805 83f72637 Michael Hanselmann

806 83f72637 Michael Hanselmann
  """
807 e50d8412 Michael Hanselmann
  OP_DSC_FIELD = "what"
808 65e183af Michael Hanselmann
  OP_PARAMS = [
809 8e7078e0 Michael Hanselmann
    _PQueryWhat,
810 ee13764f Michael Hanselmann
    _PUseLocking,
811 45d4c81c Michael Hanselmann
    ("fields", ht.NoDefault, ht.TListOf(ht.TNonEmptyString),
812 45d4c81c Michael Hanselmann
     "Requested fields"),
813 b107fe05 Michael Hanselmann
    ("filter", None, ht.TOr(ht.TNone, ht.TListOf),
814 45d4c81c Michael Hanselmann
     "Query filter"),
815 83f72637 Michael Hanselmann
    ]
816 83f72637 Michael Hanselmann
817 83f72637 Michael Hanselmann
818 83f72637 Michael Hanselmann
class OpQueryFields(OpCode):
819 83f72637 Michael Hanselmann
  """Query for available resource/item fields.
820 83f72637 Michael Hanselmann

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

824 83f72637 Michael Hanselmann
  """
825 e50d8412 Michael Hanselmann
  OP_DSC_FIELD = "what"
826 65e183af Michael Hanselmann
  OP_PARAMS = [
827 8e7078e0 Michael Hanselmann
    _PQueryWhat,
828 8e7078e0 Michael Hanselmann
    ("fields", None, ht.TOr(ht.TNone, ht.TListOf(ht.TNonEmptyString)),
829 8e7078e0 Michael Hanselmann
     "Requested fields; if not given, all are returned"),
830 83f72637 Michael Hanselmann
    ]
831 83f72637 Michael Hanselmann
832 83f72637 Michael Hanselmann
833 792af3ad Renรฉ Nussbaumer
class OpOobCommand(OpCode):
834 eb64da59 Renรฉ Nussbaumer
  """Interact with OOB."""
835 65e183af Michael Hanselmann
  OP_PARAMS = [
836 c4ec0755 Renรฉ Nussbaumer
    ("node_names", ht.EmptyList, ht.TListOf(ht.TNonEmptyString),
837 c4ec0755 Renรฉ Nussbaumer
     "List of nodes to run the OOB command against"),
838 c4ec0755 Renรฉ Nussbaumer
    ("command", None, ht.TElemOf(constants.OOB_COMMANDS),
839 c4ec0755 Renรฉ Nussbaumer
     "OOB command to be run"),
840 c4ec0755 Renรฉ Nussbaumer
    ("timeout", constants.OOB_TIMEOUT, ht.TInt,
841 c4ec0755 Renรฉ Nussbaumer
     "Timeout before the OOB helper will be terminated"),
842 c4ec0755 Renรฉ Nussbaumer
    ("ignore_status", False, ht.TBool,
843 c4ec0755 Renรฉ Nussbaumer
     "Ignores the node offline status for power off"),
844 beff3779 Renรฉ Nussbaumer
    ("power_delay", constants.OOB_POWER_DELAY, ht.TPositiveFloat,
845 beff3779 Renรฉ Nussbaumer
     "Time in seconds to wait between powering on nodes"),
846 eb64da59 Renรฉ Nussbaumer
    ]
847 eb64da59 Renรฉ Nussbaumer
848 eb64da59 Renรฉ Nussbaumer
849 07bd8a51 Iustin Pop
# node opcodes
850 07bd8a51 Iustin Pop
851 73d565a3 Iustin Pop
class OpNodeRemove(OpCode):
852 a7399f66 Iustin Pop
  """Remove a node.
853 a7399f66 Iustin Pop

854 a7399f66 Iustin Pop
  @type node_name: C{str}
855 a7399f66 Iustin Pop
  @ivar node_name: The name of the node to remove. If the node still has
856 a7399f66 Iustin Pop
                   instances on it, the operation will fail.
857 a7399f66 Iustin Pop

858 a7399f66 Iustin Pop
  """
859 60dd1473 Iustin Pop
  OP_DSC_FIELD = "node_name"
860 65e183af Michael Hanselmann
  OP_PARAMS = [
861 65e183af Michael Hanselmann
    _PNodeName,
862 65e183af Michael Hanselmann
    ]
863 a8083063 Iustin Pop
864 a8083063 Iustin Pop
865 d817d49f Iustin Pop
class OpNodeAdd(OpCode):
866 a7399f66 Iustin Pop
  """Add a node to the cluster.
867 a7399f66 Iustin Pop

868 a7399f66 Iustin Pop
  @type node_name: C{str}
869 a7399f66 Iustin Pop
  @ivar node_name: The name of the node to add. This can be a short name,
870 a7399f66 Iustin Pop
                   but it will be expanded to the FQDN.
871 a7399f66 Iustin Pop
  @type primary_ip: IP address
872 a7399f66 Iustin Pop
  @ivar primary_ip: The primary IP of the node. This will be ignored when the
873 a7399f66 Iustin Pop
                    opcode is submitted, but will be filled during the node
874 a7399f66 Iustin Pop
                    add (so it will be visible in the job query).
875 a7399f66 Iustin Pop
  @type secondary_ip: IP address
876 a7399f66 Iustin Pop
  @ivar secondary_ip: The secondary IP of the node. This needs to be passed
877 a7399f66 Iustin Pop
                      if the cluster has been initialized in 'dual-network'
878 a7399f66 Iustin Pop
                      mode, otherwise it must not be given.
879 a7399f66 Iustin Pop
  @type readd: C{bool}
880 a7399f66 Iustin Pop
  @ivar readd: Whether to re-add an existing node to the cluster. If
881 a7399f66 Iustin Pop
               this is not passed, then the operation will abort if the node
882 a7399f66 Iustin Pop
               name is already in the cluster; use this parameter to 'repair'
883 a7399f66 Iustin Pop
               a node that had its configuration broken, or was reinstalled
884 a7399f66 Iustin Pop
               without removal from the cluster.
885 f936c153 Iustin Pop
  @type group: C{str}
886 f936c153 Iustin Pop
  @ivar group: The node group to which this node will belong.
887 fd3d37b6 Iustin Pop
  @type vm_capable: C{bool}
888 fd3d37b6 Iustin Pop
  @ivar vm_capable: The vm_capable node attribute
889 fd3d37b6 Iustin Pop
  @type master_capable: C{bool}
890 fd3d37b6 Iustin Pop
  @ivar master_capable: The master_capable node attribute
891 a7399f66 Iustin Pop

892 a7399f66 Iustin Pop
  """
893 60dd1473 Iustin Pop
  OP_DSC_FIELD = "node_name"
894 65e183af Michael Hanselmann
  OP_PARAMS = [
895 65e183af Michael Hanselmann
    _PNodeName,
896 45d4c81c Michael Hanselmann
    ("primary_ip", None, ht.NoType, "Primary IP address"),
897 45d4c81c Michael Hanselmann
    ("secondary_ip", None, ht.TMaybeString, "Secondary IP address"),
898 45d4c81c Michael Hanselmann
    ("readd", False, ht.TBool, "Whether node is re-added to cluster"),
899 45d4c81c Michael Hanselmann
    ("group", None, ht.TMaybeString, "Initial node group"),
900 45d4c81c Michael Hanselmann
    ("master_capable", None, ht.TMaybeBool,
901 45d4c81c Michael Hanselmann
     "Whether node can become master or master candidate"),
902 45d4c81c Michael Hanselmann
    ("vm_capable", None, ht.TMaybeBool,
903 45d4c81c Michael Hanselmann
     "Whether node can host instances"),
904 45d4c81c Michael Hanselmann
    ("ndparams", None, ht.TMaybeDict, "Node parameters"),
905 65e183af Michael Hanselmann
    ]
906 a8083063 Iustin Pop
907 a8083063 Iustin Pop
908 2237687b Iustin Pop
class OpNodeQuery(OpCode):
909 a8083063 Iustin Pop
  """Compute the list of nodes."""
910 65e183af Michael Hanselmann
  OP_PARAMS = [
911 65e183af Michael Hanselmann
    _POutputFields,
912 45d4c81c Michael Hanselmann
    _PUseLocking,
913 45d4c81c Michael Hanselmann
    ("names", ht.EmptyList, ht.TListOf(ht.TNonEmptyString),
914 45d4c81c Michael Hanselmann
     "Empty list to query all nodes, node names otherwise"),
915 65e183af Michael Hanselmann
    ]
916 a8083063 Iustin Pop
917 a8083063 Iustin Pop
918 8ed55bfd Iustin Pop
class OpNodeQueryvols(OpCode):
919 dcb93971 Michael Hanselmann
  """Get list of volumes on node."""
920 65e183af Michael Hanselmann
  OP_PARAMS = [
921 65e183af Michael Hanselmann
    _POutputFields,
922 45d4c81c Michael Hanselmann
    ("nodes", ht.EmptyList, ht.TListOf(ht.TNonEmptyString),
923 45d4c81c Michael Hanselmann
     "Empty list to query all nodes, node names otherwise"),
924 65e183af Michael Hanselmann
    ]
925 dcb93971 Michael Hanselmann
926 dcb93971 Michael Hanselmann
927 ad8d0595 Iustin Pop
class OpNodeQueryStorage(OpCode):
928 9e5442ce Michael Hanselmann
  """Get information on storage for node(s)."""
929 65e183af Michael Hanselmann
  OP_PARAMS = [
930 65e183af Michael Hanselmann
    _POutputFields,
931 65e183af Michael Hanselmann
    _PStorageType,
932 45d4c81c Michael Hanselmann
    ("nodes", ht.EmptyList, ht.TListOf(ht.TNonEmptyString), "List of nodes"),
933 45d4c81c Michael Hanselmann
    ("name", None, ht.TMaybeString, "Storage name"),
934 9e5442ce Michael Hanselmann
    ]
935 9e5442ce Michael Hanselmann
936 9e5442ce Michael Hanselmann
937 2cee4077 Iustin Pop
class OpNodeModifyStorage(OpCode):
938 099c52ad Iustin Pop
  """Modifies the properies of a storage unit"""
939 65e183af Michael Hanselmann
  OP_PARAMS = [
940 65e183af Michael Hanselmann
    _PNodeName,
941 65e183af Michael Hanselmann
    _PStorageType,
942 45d4c81c Michael Hanselmann
    _PStorageName,
943 45d4c81c Michael Hanselmann
    ("changes", ht.NoDefault, ht.TDict, "Requested changes"),
944 efb8da02 Michael Hanselmann
    ]
945 efb8da02 Michael Hanselmann
946 efb8da02 Michael Hanselmann
947 76aef8fc Michael Hanselmann
class OpRepairNodeStorage(OpCode):
948 76aef8fc Michael Hanselmann
  """Repairs the volume group on a node."""
949 76aef8fc Michael Hanselmann
  OP_DSC_FIELD = "node_name"
950 65e183af Michael Hanselmann
  OP_PARAMS = [
951 65e183af Michael Hanselmann
    _PNodeName,
952 65e183af Michael Hanselmann
    _PStorageType,
953 45d4c81c Michael Hanselmann
    _PStorageName,
954 45d4c81c Michael Hanselmann
    _PIgnoreConsistency,
955 76aef8fc Michael Hanselmann
    ]
956 76aef8fc Michael Hanselmann
957 76aef8fc Michael Hanselmann
958 f13973c4 Iustin Pop
class OpNodeSetParams(OpCode):
959 b31c8676 Iustin Pop
  """Change the parameters of a node."""
960 b31c8676 Iustin Pop
  OP_DSC_FIELD = "node_name"
961 65e183af Michael Hanselmann
  OP_PARAMS = [
962 65e183af Michael Hanselmann
    _PNodeName,
963 65e183af Michael Hanselmann
    _PForce,
964 45d4c81c Michael Hanselmann
    ("master_candidate", None, ht.TMaybeBool,
965 45d4c81c Michael Hanselmann
     "Whether the node should become a master candidate"),
966 45d4c81c Michael Hanselmann
    ("offline", None, ht.TMaybeBool,
967 45d4c81c Michael Hanselmann
     "Whether the node should be marked as offline"),
968 45d4c81c Michael Hanselmann
    ("drained", None, ht.TMaybeBool,
969 45d4c81c Michael Hanselmann
     "Whether the node should be marked as drained"),
970 45d4c81c Michael Hanselmann
    ("auto_promote", False, ht.TBool,
971 45d4c81c Michael Hanselmann
     "Whether node(s) should be promoted to master candidate if necessary"),
972 45d4c81c Michael Hanselmann
    ("master_capable", None, ht.TMaybeBool,
973 45d4c81c Michael Hanselmann
     "Denote whether node can become master or master candidate"),
974 45d4c81c Michael Hanselmann
    ("vm_capable", None, ht.TMaybeBool,
975 45d4c81c Michael Hanselmann
     "Denote whether node can host instances"),
976 45d4c81c Michael Hanselmann
    ("secondary_ip", None, ht.TMaybeString,
977 45d4c81c Michael Hanselmann
     "Change node's secondary IP address"),
978 45d4c81c Michael Hanselmann
    ("ndparams", None, ht.TMaybeDict, "Set node parameters"),
979 45d4c81c Michael Hanselmann
    ("powered", None, ht.TMaybeBool,
980 45d4c81c Michael Hanselmann
     "Whether the node should be marked as powered"),
981 b31c8676 Iustin Pop
    ]
982 1456df62 Michael Hanselmann
  OP_RESULT = _TSetParamsResult
983 b31c8676 Iustin Pop
984 f5118ade Iustin Pop
985 e0d4735f Iustin Pop
class OpNodePowercycle(OpCode):
986 f5118ade Iustin Pop
  """Tries to powercycle a node."""
987 f5118ade Iustin Pop
  OP_DSC_FIELD = "node_name"
988 65e183af Michael Hanselmann
  OP_PARAMS = [
989 65e183af Michael Hanselmann
    _PNodeName,
990 65e183af Michael Hanselmann
    _PForce,
991 f5118ade Iustin Pop
    ]
992 f5118ade Iustin Pop
993 7ffc5a86 Michael Hanselmann
994 5b14a488 Iustin Pop
class OpNodeMigrate(OpCode):
995 80cb875c Michael Hanselmann
  """Migrate all instances from a node."""
996 80cb875c Michael Hanselmann
  OP_DSC_FIELD = "node_name"
997 65e183af Michael Hanselmann
  OP_PARAMS = [
998 65e183af Michael Hanselmann
    _PNodeName,
999 65e183af Michael Hanselmann
    _PMigrationMode,
1000 65e183af Michael Hanselmann
    _PMigrationLive,
1001 f8fa4175 Michael Hanselmann
    _PMigrationTargetNode,
1002 8eb34306 Apollon Oikonomopoulos
    ("iallocator", None, ht.TMaybeString,
1003 8eb34306 Apollon Oikonomopoulos
     "Iallocator for deciding the target node for shared-storage instances"),
1004 80cb875c Michael Hanselmann
    ]
1005 80cb875c Michael Hanselmann
1006 80cb875c Michael Hanselmann
1007 e1f23243 Michael Hanselmann
class OpNodeEvacuate(OpCode):
1008 e1f23243 Michael Hanselmann
  """Evacuate instances off a number of nodes."""
1009 e1f23243 Michael Hanselmann
  OP_DSC_FIELD = "node_name"
1010 e1f23243 Michael Hanselmann
  OP_PARAMS = [
1011 e1f23243 Michael Hanselmann
    _PEarlyRelease,
1012 e1f23243 Michael Hanselmann
    _PNodeName,
1013 e1f23243 Michael Hanselmann
    ("remote_node", None, ht.TMaybeString, "New secondary node"),
1014 e1f23243 Michael Hanselmann
    ("iallocator", None, ht.TMaybeString, "Iallocator for computing solution"),
1015 e1f23243 Michael Hanselmann
    ("mode", ht.NoDefault, ht.TElemOf(constants.IALLOCATOR_NEVAC_MODES),
1016 e1f23243 Michael Hanselmann
     "Node evacuation mode"),
1017 e1f23243 Michael Hanselmann
    ]
1018 1456df62 Michael Hanselmann
  OP_RESULT = TJobIdListOnly
1019 e1f23243 Michael Hanselmann
1020 e1f23243 Michael Hanselmann
1021 a8083063 Iustin Pop
# instance opcodes
1022 a8083063 Iustin Pop
1023 e1530b10 Iustin Pop
class OpInstanceCreate(OpCode):
1024 9bf56d77 Michael Hanselmann
  """Create an instance.
1025 9bf56d77 Michael Hanselmann

1026 9bf56d77 Michael Hanselmann
  @ivar instance_name: Instance name
1027 9bf56d77 Michael Hanselmann
  @ivar mode: Instance creation mode (one of L{constants.INSTANCE_CREATE_MODES})
1028 9bf56d77 Michael Hanselmann
  @ivar source_handshake: Signed handshake from source (remote import only)
1029 9bf56d77 Michael Hanselmann
  @ivar source_x509_ca: Source X509 CA in PEM format (remote import only)
1030 9bf56d77 Michael Hanselmann
  @ivar source_instance_name: Previous name of instance (remote import only)
1031 dae91d02 Michael Hanselmann
  @ivar source_shutdown_timeout: Shutdown timeout used for source instance
1032 dae91d02 Michael Hanselmann
    (remote import only)
1033 9bf56d77 Michael Hanselmann

1034 9bf56d77 Michael Hanselmann
  """
1035 60dd1473 Iustin Pop
  OP_DSC_FIELD = "instance_name"
1036 65e183af Michael Hanselmann
  OP_PARAMS = [
1037 65e183af Michael Hanselmann
    _PInstanceName,
1038 45d4c81c Michael Hanselmann
    _PForceVariant,
1039 45d4c81c Michael Hanselmann
    _PWaitForSync,
1040 45d4c81c Michael Hanselmann
    _PNameCheck,
1041 45d4c81c Michael Hanselmann
    ("beparams", ht.EmptyDict, ht.TDict, "Backend parameters for instance"),
1042 526a662a Michael Hanselmann
    ("disks", ht.NoDefault,
1043 526a662a Michael Hanselmann
     # TODO: Generate check from constants.IDISK_PARAMS_TYPES
1044 526a662a Michael Hanselmann
     ht.TListOf(ht.TDictOf(ht.TElemOf(constants.IDISK_PARAMS),
1045 526a662a Michael Hanselmann
                           ht.TOr(ht.TNonEmptyString, ht.TInt))),
1046 526a662a Michael Hanselmann
     "Disk descriptions, for example ``[{\"%s\": 100}, {\"%s\": 5}]``;"
1047 526a662a Michael Hanselmann
     " each disk definition must contain a ``%s`` value and"
1048 526a662a Michael Hanselmann
     " can contain an optional ``%s`` value denoting the disk access mode"
1049 526a662a Michael Hanselmann
     " (%s)" %
1050 526a662a Michael Hanselmann
     (constants.IDISK_SIZE, constants.IDISK_SIZE, constants.IDISK_SIZE,
1051 526a662a Michael Hanselmann
      constants.IDISK_MODE,
1052 526a662a Michael Hanselmann
      " or ".join("``%s``" % i for i in sorted(constants.DISK_ACCESS_SET)))),
1053 45fe090b Michael Hanselmann
    ("disk_template", ht.NoDefault, _BuildDiskTemplateCheck(True),
1054 45fe090b Michael Hanselmann
     "Disk template"),
1055 45d4c81c Michael Hanselmann
    ("file_driver", None, ht.TOr(ht.TNone, ht.TElemOf(constants.FILE_DRIVER)),
1056 45d4c81c Michael Hanselmann
     "Driver for file-backed disks"),
1057 45d4c81c Michael Hanselmann
    ("file_storage_dir", None, ht.TMaybeString,
1058 45d4c81c Michael Hanselmann
     "Directory for storing file-backed disks"),
1059 45d4c81c Michael Hanselmann
    ("hvparams", ht.EmptyDict, ht.TDict,
1060 45d4c81c Michael Hanselmann
     "Hypervisor parameters for instance, hypervisor-dependent"),
1061 45d4c81c Michael Hanselmann
    ("hypervisor", None, ht.TMaybeString, "Hypervisor"),
1062 45d4c81c Michael Hanselmann
    ("iallocator", None, ht.TMaybeString,
1063 45d4c81c Michael Hanselmann
     "Iallocator for deciding which node(s) to use"),
1064 45d4c81c Michael Hanselmann
    ("identify_defaults", False, ht.TBool,
1065 45d4c81c Michael Hanselmann
     "Reset instance parameters to default if equal"),
1066 45d4c81c Michael Hanselmann
    ("ip_check", True, ht.TBool, _PIpCheckDoc),
1067 45d4c81c Michael Hanselmann
    ("mode", ht.NoDefault, ht.TElemOf(constants.INSTANCE_CREATE_MODES),
1068 45d4c81c Michael Hanselmann
     "Instance creation mode"),
1069 526a662a Michael Hanselmann
    ("nics", ht.NoDefault, ht.TListOf(_TestNicDef),
1070 526a662a Michael Hanselmann
     "List of NIC (network interface) definitions, for example"
1071 526a662a Michael Hanselmann
     " ``[{}, {}, {\"%s\": \"198.51.100.4\"}]``; each NIC definition can"
1072 526a662a Michael Hanselmann
     " contain the optional values %s" %
1073 526a662a Michael Hanselmann
     (constants.INIC_IP,
1074 526a662a Michael Hanselmann
      ", ".join("``%s``" % i for i in sorted(constants.INIC_PARAMS)))),
1075 45d4c81c Michael Hanselmann
    ("no_install", None, ht.TMaybeBool,
1076 45d4c81c Michael Hanselmann
     "Do not install the OS (will disable automatic start)"),
1077 45d4c81c Michael Hanselmann
    ("osparams", ht.EmptyDict, ht.TDict, "OS parameters for instance"),
1078 45d4c81c Michael Hanselmann
    ("os_type", None, ht.TMaybeString, "Operating system"),
1079 45d4c81c Michael Hanselmann
    ("pnode", None, ht.TMaybeString, "Primary node"),
1080 45d4c81c Michael Hanselmann
    ("snode", None, ht.TMaybeString, "Secondary node"),
1081 45d4c81c Michael Hanselmann
    ("source_handshake", None, ht.TOr(ht.TList, ht.TNone),
1082 45d4c81c Michael Hanselmann
     "Signed handshake from source (remote import only)"),
1083 45d4c81c Michael Hanselmann
    ("source_instance_name", None, ht.TMaybeString,
1084 45d4c81c Michael Hanselmann
     "Source instance name (remote import only)"),
1085 65e183af Michael Hanselmann
    ("source_shutdown_timeout", constants.DEFAULT_SHUTDOWN_TIMEOUT,
1086 526a662a Michael Hanselmann
     ht.TPositiveInt,
1087 526a662a Michael Hanselmann
     "How long source instance was given to shut down (remote import only)"),
1088 45d4c81c Michael Hanselmann
    ("source_x509_ca", None, ht.TMaybeString,
1089 45d4c81c Michael Hanselmann
     "Source X509 CA in PEM format (remote import only)"),
1090 45d4c81c Michael Hanselmann
    ("src_node", None, ht.TMaybeString, "Source node for import"),
1091 45d4c81c Michael Hanselmann
    ("src_path", None, ht.TMaybeString, "Source directory for import"),
1092 45d4c81c Michael Hanselmann
    ("start", True, ht.TBool, "Whether to start instance after creation"),
1093 720f56c8 Apollon Oikonomopoulos
    ("tags", ht.EmptyList, ht.TListOf(ht.TNonEmptyString), "Instance tags"),
1094 3b6d8c9b Iustin Pop
    ]
1095 1456df62 Michael Hanselmann
  OP_RESULT = ht.Comment("instance nodes")(ht.TListOf(ht.TNonEmptyString))
1096 a8083063 Iustin Pop
1097 a8083063 Iustin Pop
1098 5073fd8f Iustin Pop
class OpInstanceReinstall(OpCode):
1099 fdc267f4 Iustin Pop
  """Reinstall an instance's OS."""
1100 60dd1473 Iustin Pop
  OP_DSC_FIELD = "instance_name"
1101 65e183af Michael Hanselmann
  OP_PARAMS = [
1102 65e183af Michael Hanselmann
    _PInstanceName,
1103 45d4c81c Michael Hanselmann
    _PForceVariant,
1104 45d4c81c Michael Hanselmann
    ("os_type", None, ht.TMaybeString, "Instance operating system"),
1105 45d4c81c Michael Hanselmann
    ("osparams", None, ht.TMaybeDict, "Temporary OS parameters"),
1106 65e183af Michael Hanselmann
    ]
1107 fe7b0351 Michael Hanselmann
1108 fe7b0351 Michael Hanselmann
1109 3cd2d4b1 Iustin Pop
class OpInstanceRemove(OpCode):
1110 a8083063 Iustin Pop
  """Remove an instance."""
1111 60dd1473 Iustin Pop
  OP_DSC_FIELD = "instance_name"
1112 65e183af Michael Hanselmann
  OP_PARAMS = [
1113 65e183af Michael Hanselmann
    _PInstanceName,
1114 65e183af Michael Hanselmann
    _PShutdownTimeout,
1115 45d4c81c Michael Hanselmann
    ("ignore_failures", False, ht.TBool,
1116 45d4c81c Michael Hanselmann
     "Whether to ignore failures during removal"),
1117 fc1baca9 Michael Hanselmann
    ]
1118 a8083063 Iustin Pop
1119 a8083063 Iustin Pop
1120 5659e2e2 Iustin Pop
class OpInstanceRename(OpCode):
1121 decd5f45 Iustin Pop
  """Rename an instance."""
1122 65e183af Michael Hanselmann
  OP_PARAMS = [
1123 65e183af Michael Hanselmann
    _PInstanceName,
1124 45d4c81c Michael Hanselmann
    _PNameCheck,
1125 45d4c81c Michael Hanselmann
    ("new_name", ht.NoDefault, ht.TNonEmptyString, "New instance name"),
1126 45d4c81c Michael Hanselmann
    ("ip_check", False, ht.TBool, _PIpCheckDoc),
1127 4f05fd3b Iustin Pop
    ]
1128 1456df62 Michael Hanselmann
  OP_RESULT = ht.Comment("New instance name")(ht.TNonEmptyString)
1129 decd5f45 Iustin Pop
1130 decd5f45 Iustin Pop
1131 c873d91c Iustin Pop
class OpInstanceStartup(OpCode):
1132 fdc267f4 Iustin Pop
  """Startup an instance."""
1133 60dd1473 Iustin Pop
  OP_DSC_FIELD = "instance_name"
1134 65e183af Michael Hanselmann
  OP_PARAMS = [
1135 65e183af Michael Hanselmann
    _PInstanceName,
1136 65e183af Michael Hanselmann
    _PForce,
1137 65e183af Michael Hanselmann
    _PIgnoreOfflineNodes,
1138 45d4c81c Michael Hanselmann
    ("hvparams", ht.EmptyDict, ht.TDict,
1139 45d4c81c Michael Hanselmann
     "Temporary hypervisor parameters, hypervisor-dependent"),
1140 45d4c81c Michael Hanselmann
    ("beparams", ht.EmptyDict, ht.TDict, "Temporary backend parameters"),
1141 9b64e486 Iustin Pop
    _PNoRemember,
1142 323f9095 Stephen Shirley
    _PStartupPaused,
1143 4f05fd3b Iustin Pop
    ]
1144 a8083063 Iustin Pop
1145 a8083063 Iustin Pop
1146 ee3e37a7 Iustin Pop
class OpInstanceShutdown(OpCode):
1147 fdc267f4 Iustin Pop
  """Shutdown an instance."""
1148 60dd1473 Iustin Pop
  OP_DSC_FIELD = "instance_name"
1149 65e183af Michael Hanselmann
  OP_PARAMS = [
1150 65e183af Michael Hanselmann
    _PInstanceName,
1151 65e183af Michael Hanselmann
    _PIgnoreOfflineNodes,
1152 45d4c81c Michael Hanselmann
    ("timeout", constants.DEFAULT_SHUTDOWN_TIMEOUT, ht.TPositiveInt,
1153 45d4c81c Michael Hanselmann
     "How long to wait for instance to shut down"),
1154 9b64e486 Iustin Pop
    _PNoRemember,
1155 b44bd844 Michael Hanselmann
    ]
1156 a8083063 Iustin Pop
1157 a8083063 Iustin Pop
1158 90ab1a95 Iustin Pop
class OpInstanceReboot(OpCode):
1159 bf6929a2 Alexander Schreiber
  """Reboot an instance."""
1160 60dd1473 Iustin Pop
  OP_DSC_FIELD = "instance_name"
1161 65e183af Michael Hanselmann
  OP_PARAMS = [
1162 65e183af Michael Hanselmann
    _PInstanceName,
1163 65e183af Michael Hanselmann
    _PShutdownTimeout,
1164 45d4c81c Michael Hanselmann
    ("ignore_secondaries", False, ht.TBool,
1165 45d4c81c Michael Hanselmann
     "Whether to start the instance even if secondary disks are failing"),
1166 45d4c81c Michael Hanselmann
    ("reboot_type", ht.NoDefault, ht.TElemOf(constants.REBOOT_TYPES),
1167 45d4c81c Michael Hanselmann
     "How to reboot instance"),
1168 4f05fd3b Iustin Pop
    ]
1169 bf6929a2 Alexander Schreiber
1170 bf6929a2 Alexander Schreiber
1171 668f755d Iustin Pop
class OpInstanceReplaceDisks(OpCode):
1172 fdc267f4 Iustin Pop
  """Replace the disks of an instance."""
1173 60dd1473 Iustin Pop
  OP_DSC_FIELD = "instance_name"
1174 65e183af Michael Hanselmann
  OP_PARAMS = [
1175 65e183af Michael Hanselmann
    _PInstanceName,
1176 e1f23243 Michael Hanselmann
    _PEarlyRelease,
1177 45d4c81c Michael Hanselmann
    ("mode", ht.NoDefault, ht.TElemOf(constants.REPLACE_MODES),
1178 45d4c81c Michael Hanselmann
     "Replacement mode"),
1179 45d4c81c Michael Hanselmann
    ("disks", ht.EmptyList, ht.TListOf(ht.TPositiveInt),
1180 45d4c81c Michael Hanselmann
     "Disk indexes"),
1181 45d4c81c Michael Hanselmann
    ("remote_node", None, ht.TMaybeString, "New secondary node"),
1182 45d4c81c Michael Hanselmann
    ("iallocator", None, ht.TMaybeString,
1183 45d4c81c Michael Hanselmann
     "Iallocator for deciding new secondary node"),
1184 4f05fd3b Iustin Pop
    ]
1185 a8083063 Iustin Pop
1186 a8083063 Iustin Pop
1187 019dbee1 Iustin Pop
class OpInstanceFailover(OpCode):
1188 a8083063 Iustin Pop
  """Failover an instance."""
1189 60dd1473 Iustin Pop
  OP_DSC_FIELD = "instance_name"
1190 65e183af Michael Hanselmann
  OP_PARAMS = [
1191 65e183af Michael Hanselmann
    _PInstanceName,
1192 65e183af Michael Hanselmann
    _PShutdownTimeout,
1193 45d4c81c Michael Hanselmann
    _PIgnoreConsistency,
1194 f8fa4175 Michael Hanselmann
    _PMigrationTargetNode,
1195 8eb34306 Apollon Oikonomopoulos
    ("iallocator", None, ht.TMaybeString,
1196 8eb34306 Apollon Oikonomopoulos
     "Iallocator for deciding the target node for shared-storage instances"),
1197 17c3f802 Guido Trotter
    ]
1198 a8083063 Iustin Pop
1199 a8083063 Iustin Pop
1200 75c866c2 Iustin Pop
class OpInstanceMigrate(OpCode):
1201 53c776b5 Iustin Pop
  """Migrate an instance.
1202 53c776b5 Iustin Pop

1203 53c776b5 Iustin Pop
  This migrates (without shutting down an instance) to its secondary
1204 53c776b5 Iustin Pop
  node.
1205 53c776b5 Iustin Pop

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

1209 53c776b5 Iustin Pop
  """
1210 ee69c97f Iustin Pop
  OP_DSC_FIELD = "instance_name"
1211 65e183af Michael Hanselmann
  OP_PARAMS = [
1212 65e183af Michael Hanselmann
    _PInstanceName,
1213 65e183af Michael Hanselmann
    _PMigrationMode,
1214 65e183af Michael Hanselmann
    _PMigrationLive,
1215 f8fa4175 Michael Hanselmann
    _PMigrationTargetNode,
1216 45d4c81c Michael Hanselmann
    ("cleanup", False, ht.TBool,
1217 45d4c81c Michael Hanselmann
     "Whether a previously failed migration should be cleaned up"),
1218 8eb34306 Apollon Oikonomopoulos
    ("iallocator", None, ht.TMaybeString,
1219 8eb34306 Apollon Oikonomopoulos
     "Iallocator for deciding the target node for shared-storage instances"),
1220 d5cafd31 Renรฉ Nussbaumer
    ("allow_failover", False, ht.TBool,
1221 d5cafd31 Renรฉ Nussbaumer
     "Whether we can fallback to failover if migration is not possible"),
1222 65e183af Michael Hanselmann
    ]
1223 53c776b5 Iustin Pop
1224 53c776b5 Iustin Pop
1225 0091b480 Iustin Pop
class OpInstanceMove(OpCode):
1226 313bcead Iustin Pop
  """Move an instance.
1227 313bcead Iustin Pop

1228 313bcead Iustin Pop
  This move (with shutting down an instance and data copying) to an
1229 313bcead Iustin Pop
  arbitrary node.
1230 313bcead Iustin Pop

1231 313bcead Iustin Pop
  @ivar instance_name: the name of the instance
1232 313bcead Iustin Pop
  @ivar target_node: the destination node
1233 313bcead Iustin Pop

1234 313bcead Iustin Pop
  """
1235 313bcead Iustin Pop
  OP_DSC_FIELD = "instance_name"
1236 65e183af Michael Hanselmann
  OP_PARAMS = [
1237 65e183af Michael Hanselmann
    _PInstanceName,
1238 65e183af Michael Hanselmann
    _PShutdownTimeout,
1239 45d4c81c Michael Hanselmann
    ("target_node", ht.NoDefault, ht.TNonEmptyString, "Target node"),
1240 bb851c63 Iustin Pop
    _PIgnoreConsistency,
1241 154b9580 Balazs Lecz
    ]
1242 313bcead Iustin Pop
1243 313bcead Iustin Pop
1244 cc0dec7b Iustin Pop
class OpInstanceConsole(OpCode):
1245 fdc267f4 Iustin Pop
  """Connect to an instance's console."""
1246 60dd1473 Iustin Pop
  OP_DSC_FIELD = "instance_name"
1247 65e183af Michael Hanselmann
  OP_PARAMS = [
1248 65e183af Michael Hanselmann
    _PInstanceName
1249 65e183af Michael Hanselmann
    ]
1250 a8083063 Iustin Pop
1251 a8083063 Iustin Pop
1252 83f5d475 Iustin Pop
class OpInstanceActivateDisks(OpCode):
1253 fdc267f4 Iustin Pop
  """Activate an instance's disks."""
1254 60dd1473 Iustin Pop
  OP_DSC_FIELD = "instance_name"
1255 65e183af Michael Hanselmann
  OP_PARAMS = [
1256 65e183af Michael Hanselmann
    _PInstanceName,
1257 45d4c81c Michael Hanselmann
    ("ignore_size", False, ht.TBool, "Whether to ignore recorded size"),
1258 65e183af Michael Hanselmann
    ]
1259 a8083063 Iustin Pop
1260 a8083063 Iustin Pop
1261 e176281f Iustin Pop
class OpInstanceDeactivateDisks(OpCode):
1262 fdc267f4 Iustin Pop
  """Deactivate an instance's disks."""
1263 60dd1473 Iustin Pop
  OP_DSC_FIELD = "instance_name"
1264 65e183af Michael Hanselmann
  OP_PARAMS = [
1265 c9c41373 Iustin Pop
    _PInstanceName,
1266 c9c41373 Iustin Pop
    _PForce,
1267 65e183af Michael Hanselmann
    ]
1268 a8083063 Iustin Pop
1269 a8083063 Iustin Pop
1270 6b273e78 Iustin Pop
class OpInstanceRecreateDisks(OpCode):
1271 a52978c7 Michael Hanselmann
  """Recreate an instance's disks."""
1272 bd315bfa Iustin Pop
  OP_DSC_FIELD = "instance_name"
1273 65e183af Michael Hanselmann
  OP_PARAMS = [
1274 65e183af Michael Hanselmann
    _PInstanceName,
1275 45d4c81c Michael Hanselmann
    ("disks", ht.EmptyList, ht.TListOf(ht.TPositiveInt),
1276 45d4c81c Michael Hanselmann
     "List of disk indexes"),
1277 93384b8c Guido Trotter
    ("nodes", ht.EmptyList, ht.TListOf(ht.TNonEmptyString),
1278 93384b8c Guido Trotter
     "New instance nodes, if relocation is desired"),
1279 65e183af Michael Hanselmann
    ]
1280 bd315bfa Iustin Pop
1281 bd315bfa Iustin Pop
1282 f2af0bec Iustin Pop
class OpInstanceQuery(OpCode):
1283 a8083063 Iustin Pop
  """Compute the list of instances."""
1284 65e183af Michael Hanselmann
  OP_PARAMS = [
1285 65e183af Michael Hanselmann
    _POutputFields,
1286 45d4c81c Michael Hanselmann
    _PUseLocking,
1287 45d4c81c Michael Hanselmann
    ("names", ht.EmptyList, ht.TListOf(ht.TNonEmptyString),
1288 45d4c81c Michael Hanselmann
     "Empty list to query all instances, instance names otherwise"),
1289 65e183af Michael Hanselmann
    ]
1290 a8083063 Iustin Pop
1291 a8083063 Iustin Pop
1292 dc28c4e4 Iustin Pop
class OpInstanceQueryData(OpCode):
1293 a8083063 Iustin Pop
  """Compute the run-time status of instances."""
1294 65e183af Michael Hanselmann
  OP_PARAMS = [
1295 af7b6689 Michael Hanselmann
    _PUseLocking,
1296 af7b6689 Michael Hanselmann
    ("instances", ht.EmptyList, ht.TListOf(ht.TNonEmptyString),
1297 af7b6689 Michael Hanselmann
     "Instance names"),
1298 af7b6689 Michael Hanselmann
    ("static", False, ht.TBool,
1299 af7b6689 Michael Hanselmann
     "Whether to only return configuration data without querying"
1300 af7b6689 Michael Hanselmann
     " nodes"),
1301 65e183af Michael Hanselmann
    ]
1302 a8083063 Iustin Pop
1303 a8083063 Iustin Pop
1304 9a3cc7ae Iustin Pop
class OpInstanceSetParams(OpCode):
1305 a8083063 Iustin Pop
  """Change the parameters of an instance."""
1306 60dd1473 Iustin Pop
  OP_DSC_FIELD = "instance_name"
1307 65e183af Michael Hanselmann
  OP_PARAMS = [
1308 65e183af Michael Hanselmann
    _PInstanceName,
1309 65e183af Michael Hanselmann
    _PForce,
1310 45d4c81c Michael Hanselmann
    _PForceVariant,
1311 526a662a Michael Hanselmann
    # TODO: Use _TestNicDef
1312 45d4c81c Michael Hanselmann
    ("nics", ht.EmptyList, ht.TList,
1313 45d4c81c Michael Hanselmann
     "List of NIC changes. Each item is of the form ``(op, settings)``."
1314 45d4c81c Michael Hanselmann
     " ``op`` can be ``%s`` to add a new NIC with the specified settings,"
1315 45d4c81c Michael Hanselmann
     " ``%s`` to remove the last NIC or a number to modify the settings"
1316 45d4c81c Michael Hanselmann
     " of the NIC with that index." %
1317 45d4c81c Michael Hanselmann
     (constants.DDM_ADD, constants.DDM_REMOVE)),
1318 45d4c81c Michael Hanselmann
    ("disks", ht.EmptyList, ht.TList, "List of disk changes. See ``nics``."),
1319 45d4c81c Michael Hanselmann
    ("beparams", ht.EmptyDict, ht.TDict, "Per-instance backend parameters"),
1320 45d4c81c Michael Hanselmann
    ("hvparams", ht.EmptyDict, ht.TDict,
1321 45d4c81c Michael Hanselmann
     "Per-instance hypervisor parameters, hypervisor-dependent"),
1322 45fe090b Michael Hanselmann
    ("disk_template", None, ht.TOr(ht.TNone, _BuildDiskTemplateCheck(False)),
1323 45d4c81c Michael Hanselmann
     "Disk template for instance"),
1324 45d4c81c Michael Hanselmann
    ("remote_node", None, ht.TMaybeString,
1325 45d4c81c Michael Hanselmann
     "Secondary node (used when changing disk template)"),
1326 45d4c81c Michael Hanselmann
    ("os_name", None, ht.TMaybeString,
1327 45d4c81c Michael Hanselmann
     "Change instance's OS name. Does not reinstall the instance."),
1328 45d4c81c Michael Hanselmann
    ("osparams", None, ht.TMaybeDict, "Per-instance OS parameters"),
1329 93384b8c Guido Trotter
    ("wait_for_sync", True, ht.TBool,
1330 93384b8c Guido Trotter
     "Whether to wait for the disk to synchronize, when changing template"),
1331 973d7867 Iustin Pop
    ]
1332 1456df62 Michael Hanselmann
  OP_RESULT = _TSetParamsResult
1333 a8083063 Iustin Pop
1334 a8083063 Iustin Pop
1335 60472d29 Iustin Pop
class OpInstanceGrowDisk(OpCode):
1336 8729e0d7 Iustin Pop
  """Grow a disk of an instance."""
1337 60dd1473 Iustin Pop
  OP_DSC_FIELD = "instance_name"
1338 65e183af Michael Hanselmann
  OP_PARAMS = [
1339 65e183af Michael Hanselmann
    _PInstanceName,
1340 45d4c81c Michael Hanselmann
    _PWaitForSync,
1341 45d4c81c Michael Hanselmann
    ("disk", ht.NoDefault, ht.TInt, "Disk index"),
1342 45d4c81c Michael Hanselmann
    ("amount", ht.NoDefault, ht.TInt,
1343 45d4c81c Michael Hanselmann
     "Amount of disk space to add (megabytes)"),
1344 4f05fd3b Iustin Pop
    ]
1345 8729e0d7 Iustin Pop
1346 8729e0d7 Iustin Pop
1347 1aef3df8 Michael Hanselmann
class OpInstanceChangeGroup(OpCode):
1348 1aef3df8 Michael Hanselmann
  """Moves an instance to another node group."""
1349 1aef3df8 Michael Hanselmann
  OP_DSC_FIELD = "instance_name"
1350 1aef3df8 Michael Hanselmann
  OP_PARAMS = [
1351 1aef3df8 Michael Hanselmann
    _PInstanceName,
1352 1aef3df8 Michael Hanselmann
    _PEarlyRelease,
1353 1aef3df8 Michael Hanselmann
    ("iallocator", None, ht.TMaybeString, "Iallocator for computing solution"),
1354 1aef3df8 Michael Hanselmann
    ("target_groups", None, ht.TOr(ht.TNone, ht.TListOf(ht.TNonEmptyString)),
1355 1aef3df8 Michael Hanselmann
     "Destination group names or UUIDs (defaults to \"all but current group\""),
1356 1aef3df8 Michael Hanselmann
    ]
1357 1456df62 Michael Hanselmann
  OP_RESULT = TJobIdListOnly
1358 1aef3df8 Michael Hanselmann
1359 1aef3df8 Michael Hanselmann
1360 70a6a926 Adeodato Simo
# Node group opcodes
1361 70a6a926 Adeodato Simo
1362 fabf1731 Iustin Pop
class OpGroupAdd(OpCode):
1363 b1ee5610 Adeodato Simo
  """Add a node group to the cluster."""
1364 b1ee5610 Adeodato Simo
  OP_DSC_FIELD = "group_name"
1365 65e183af Michael Hanselmann
  OP_PARAMS = [
1366 65e183af Michael Hanselmann
    _PGroupName,
1367 45d4c81c Michael Hanselmann
    _PNodeGroupAllocPolicy,
1368 45d4c81c Michael Hanselmann
    _PGroupNodeParams,
1369 483be60d Adeodato Simo
    ]
1370 b1ee5610 Adeodato Simo
1371 b1ee5610 Adeodato Simo
1372 934704ae Iustin Pop
class OpGroupAssignNodes(OpCode):
1373 96276ae7 Adeodato Simo
  """Assign nodes to a node group."""
1374 96276ae7 Adeodato Simo
  OP_DSC_FIELD = "group_name"
1375 96276ae7 Adeodato Simo
  OP_PARAMS = [
1376 96276ae7 Adeodato Simo
    _PGroupName,
1377 96276ae7 Adeodato Simo
    _PForce,
1378 45d4c81c Michael Hanselmann
    ("nodes", ht.NoDefault, ht.TListOf(ht.TNonEmptyString),
1379 45d4c81c Michael Hanselmann
     "List of nodes to assign"),
1380 96276ae7 Adeodato Simo
    ]
1381 96276ae7 Adeodato Simo
1382 96276ae7 Adeodato Simo
1383 d4d654bd Iustin Pop
class OpGroupQuery(OpCode):
1384 70a6a926 Adeodato Simo
  """Compute the list of node groups."""
1385 65e183af Michael Hanselmann
  OP_PARAMS = [
1386 65e183af Michael Hanselmann
    _POutputFields,
1387 45d4c81c Michael Hanselmann
    ("names", ht.EmptyList, ht.TListOf(ht.TNonEmptyString),
1388 45d4c81c Michael Hanselmann
     "Empty list to query all groups, group names otherwise"),
1389 65e183af Michael Hanselmann
    ]
1390 70a6a926 Adeodato Simo
1391 70a6a926 Adeodato Simo
1392 7cbf74f0 Iustin Pop
class OpGroupSetParams(OpCode):
1393 4da7909a Adeodato Simo
  """Change the parameters of a node group."""
1394 4da7909a Adeodato Simo
  OP_DSC_FIELD = "group_name"
1395 65e183af Michael Hanselmann
  OP_PARAMS = [
1396 65e183af Michael Hanselmann
    _PGroupName,
1397 45d4c81c Michael Hanselmann
    _PNodeGroupAllocPolicy,
1398 45d4c81c Michael Hanselmann
    _PGroupNodeParams,
1399 4da7909a Adeodato Simo
    ]
1400 1456df62 Michael Hanselmann
  OP_RESULT = _TSetParamsResult
1401 4da7909a Adeodato Simo
1402 4da7909a Adeodato Simo
1403 4d1baa51 Iustin Pop
class OpGroupRemove(OpCode):
1404 94bd652a Adeodato Simo
  """Remove a node group from the cluster."""
1405 94bd652a Adeodato Simo
  OP_DSC_FIELD = "group_name"
1406 65e183af Michael Hanselmann
  OP_PARAMS = [
1407 65e183af Michael Hanselmann
    _PGroupName,
1408 65e183af Michael Hanselmann
    ]
1409 94bd652a Adeodato Simo
1410 94bd652a Adeodato Simo
1411 a8173e82 Iustin Pop
class OpGroupRename(OpCode):
1412 4fe5cf90 Adeodato Simo
  """Rename a node group in the cluster."""
1413 65e183af Michael Hanselmann
  OP_PARAMS = [
1414 12da663a Michael Hanselmann
    _PGroupName,
1415 12da663a Michael Hanselmann
    ("new_name", ht.NoDefault, ht.TNonEmptyString, "New group name"),
1416 65e183af Michael Hanselmann
    ]
1417 1456df62 Michael Hanselmann
  OP_RESULT = ht.Comment("New group name")(ht.TNonEmptyString)
1418 4fe5cf90 Adeodato Simo
1419 4fe5cf90 Adeodato Simo
1420 08f8c82c Michael Hanselmann
class OpGroupEvacuate(OpCode):
1421 08f8c82c Michael Hanselmann
  """Evacuate a node group in the cluster."""
1422 08f8c82c Michael Hanselmann
  OP_DSC_FIELD = "group_name"
1423 08f8c82c Michael Hanselmann
  OP_PARAMS = [
1424 08f8c82c Michael Hanselmann
    _PGroupName,
1425 08f8c82c Michael Hanselmann
    _PEarlyRelease,
1426 08f8c82c Michael Hanselmann
    ("iallocator", None, ht.TMaybeString, "Iallocator for computing solution"),
1427 08f8c82c Michael Hanselmann
    ("target_groups", None, ht.TOr(ht.TNone, ht.TListOf(ht.TNonEmptyString)),
1428 08f8c82c Michael Hanselmann
     "Destination group names or UUIDs"),
1429 08f8c82c Michael Hanselmann
    ]
1430 1456df62 Michael Hanselmann
  OP_RESULT = TJobIdListOnly
1431 08f8c82c Michael Hanselmann
1432 08f8c82c Michael Hanselmann
1433 a8083063 Iustin Pop
# OS opcodes
1434 da2d02e7 Iustin Pop
class OpOsDiagnose(OpCode):
1435 a8083063 Iustin Pop
  """Compute the list of guest operating systems."""
1436 65e183af Michael Hanselmann
  OP_PARAMS = [
1437 65e183af Michael Hanselmann
    _POutputFields,
1438 45d4c81c Michael Hanselmann
    ("names", ht.EmptyList, ht.TListOf(ht.TNonEmptyString),
1439 45d4c81c Michael Hanselmann
     "Which operating systems to diagnose"),
1440 65e183af Michael Hanselmann
    ]
1441 a8083063 Iustin Pop
1442 7c0d6283 Michael Hanselmann
1443 a8083063 Iustin Pop
# Exports opcodes
1444 7ca2d4d8 Iustin Pop
class OpBackupQuery(OpCode):
1445 a8083063 Iustin Pop
  """Compute the list of exported images."""
1446 65e183af Michael Hanselmann
  OP_PARAMS = [
1447 45d4c81c Michael Hanselmann
    _PUseLocking,
1448 45d4c81c Michael Hanselmann
    ("nodes", ht.EmptyList, ht.TListOf(ht.TNonEmptyString),
1449 45d4c81c Michael Hanselmann
     "Empty list to query all nodes, node names otherwise"),
1450 65e183af Michael Hanselmann
    ]
1451 a8083063 Iustin Pop
1452 7c0d6283 Michael Hanselmann
1453 71910715 Iustin Pop
class OpBackupPrepare(OpCode):
1454 1410fa8d Michael Hanselmann
  """Prepares an instance export.
1455 1410fa8d Michael Hanselmann

1456 1410fa8d Michael Hanselmann
  @ivar instance_name: Instance name
1457 1410fa8d Michael Hanselmann
  @ivar mode: Export mode (one of L{constants.EXPORT_MODES})
1458 1410fa8d Michael Hanselmann

1459 1410fa8d Michael Hanselmann
  """
1460 1410fa8d Michael Hanselmann
  OP_DSC_FIELD = "instance_name"
1461 65e183af Michael Hanselmann
  OP_PARAMS = [
1462 65e183af Michael Hanselmann
    _PInstanceName,
1463 45d4c81c Michael Hanselmann
    ("mode", ht.NoDefault, ht.TElemOf(constants.EXPORT_MODES),
1464 45d4c81c Michael Hanselmann
     "Export mode"),
1465 1410fa8d Michael Hanselmann
    ]
1466 1410fa8d Michael Hanselmann
1467 1410fa8d Michael Hanselmann
1468 4ff922a2 Iustin Pop
class OpBackupExport(OpCode):
1469 4a96f1d1 Michael Hanselmann
  """Export an instance.
1470 4a96f1d1 Michael Hanselmann

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

1477 4a96f1d1 Michael Hanselmann
  @ivar mode: Export mode (one of L{constants.EXPORT_MODES})
1478 4a96f1d1 Michael Hanselmann
  @ivar target_node: Export destination
1479 4a96f1d1 Michael Hanselmann
  @ivar x509_key_name: X509 key to use (remote export only)
1480 4a96f1d1 Michael Hanselmann
  @ivar destination_x509_ca: Destination X509 CA in PEM format (remote export
1481 4a96f1d1 Michael Hanselmann
                             only)
1482 4a96f1d1 Michael Hanselmann

1483 4a96f1d1 Michael Hanselmann
  """
1484 60dd1473 Iustin Pop
  OP_DSC_FIELD = "instance_name"
1485 65e183af Michael Hanselmann
  OP_PARAMS = [
1486 65e183af Michael Hanselmann
    _PInstanceName,
1487 65e183af Michael Hanselmann
    _PShutdownTimeout,
1488 4a96f1d1 Michael Hanselmann
    # TODO: Rename target_node as it changes meaning for different export modes
1489 4a96f1d1 Michael Hanselmann
    # (e.g. "destination")
1490 45d4c81c Michael Hanselmann
    ("target_node", ht.NoDefault, ht.TOr(ht.TNonEmptyString, ht.TList),
1491 45d4c81c Michael Hanselmann
     "Destination information, depends on export mode"),
1492 45d4c81c Michael Hanselmann
    ("shutdown", True, ht.TBool, "Whether to shutdown instance before export"),
1493 45d4c81c Michael Hanselmann
    ("remove_instance", False, ht.TBool,
1494 45d4c81c Michael Hanselmann
     "Whether to remove instance after export"),
1495 45d4c81c Michael Hanselmann
    ("ignore_remove_failures", False, ht.TBool,
1496 45d4c81c Michael Hanselmann
     "Whether to ignore failures while removing instances"),
1497 45d4c81c Michael Hanselmann
    ("mode", constants.EXPORT_MODE_LOCAL, ht.TElemOf(constants.EXPORT_MODES),
1498 45d4c81c Michael Hanselmann
     "Export mode"),
1499 45d4c81c Michael Hanselmann
    ("x509_key_name", None, ht.TOr(ht.TList, ht.TNone),
1500 45d4c81c Michael Hanselmann
     "Name of X509 key (remote export only)"),
1501 45d4c81c Michael Hanselmann
    ("destination_x509_ca", None, ht.TMaybeString,
1502 45d4c81c Michael Hanselmann
     "Destination X509 CA (remote export only)"),
1503 17c3f802 Guido Trotter
    ]
1504 5c947f38 Iustin Pop
1505 0a7bed64 Michael Hanselmann
1506 ca5890ad Iustin Pop
class OpBackupRemove(OpCode):
1507 9ac99fda Guido Trotter
  """Remove an instance's export."""
1508 60dd1473 Iustin Pop
  OP_DSC_FIELD = "instance_name"
1509 65e183af Michael Hanselmann
  OP_PARAMS = [
1510 65e183af Michael Hanselmann
    _PInstanceName,
1511 65e183af Michael Hanselmann
    ]
1512 5c947f38 Iustin Pop
1513 0a7bed64 Michael Hanselmann
1514 5c947f38 Iustin Pop
# Tags opcodes
1515 c6afb1ca Iustin Pop
class OpTagsGet(OpCode):
1516 5c947f38 Iustin Pop
  """Returns the tags of the given object."""
1517 60dd1473 Iustin Pop
  OP_DSC_FIELD = "name"
1518 65e183af Michael Hanselmann
  OP_PARAMS = [
1519 65e183af Michael Hanselmann
    _PTagKind,
1520 65e183af Michael Hanselmann
    # Name is only meaningful for nodes and instances
1521 197b323b Michael Hanselmann
    ("name", ht.NoDefault, ht.TMaybeString, None),
1522 65e183af Michael Hanselmann
    ]
1523 5c947f38 Iustin Pop
1524 5c947f38 Iustin Pop
1525 715462e7 Iustin Pop
class OpTagsSearch(OpCode):
1526 73415719 Iustin Pop
  """Searches the tags in the cluster for a given pattern."""
1527 60dd1473 Iustin Pop
  OP_DSC_FIELD = "pattern"
1528 65e183af Michael Hanselmann
  OP_PARAMS = [
1529 197b323b Michael Hanselmann
    ("pattern", ht.NoDefault, ht.TNonEmptyString, None),
1530 65e183af Michael Hanselmann
    ]
1531 73415719 Iustin Pop
1532 73415719 Iustin Pop
1533 d1602edc Iustin Pop
class OpTagsSet(OpCode):
1534 f27302fa Iustin Pop
  """Add a list of tags on a given object."""
1535 65e183af Michael Hanselmann
  OP_PARAMS = [
1536 65e183af Michael Hanselmann
    _PTagKind,
1537 65e183af Michael Hanselmann
    _PTags,
1538 65e183af Michael Hanselmann
    # Name is only meaningful for nodes and instances
1539 197b323b Michael Hanselmann
    ("name", ht.NoDefault, ht.TMaybeString, None),
1540 65e183af Michael Hanselmann
    ]
1541 5c947f38 Iustin Pop
1542 5c947f38 Iustin Pop
1543 3f0ab95f Iustin Pop
class OpTagsDel(OpCode):
1544 f27302fa Iustin Pop
  """Remove a list of tags from a given object."""
1545 65e183af Michael Hanselmann
  OP_PARAMS = [
1546 65e183af Michael Hanselmann
    _PTagKind,
1547 65e183af Michael Hanselmann
    _PTags,
1548 65e183af Michael Hanselmann
    # Name is only meaningful for nodes and instances
1549 197b323b Michael Hanselmann
    ("name", ht.NoDefault, ht.TMaybeString, None),
1550 65e183af Michael Hanselmann
    ]
1551 06009e27 Iustin Pop
1552 e687ec01 Michael Hanselmann
1553 06009e27 Iustin Pop
# Test opcodes
1554 06009e27 Iustin Pop
class OpTestDelay(OpCode):
1555 06009e27 Iustin Pop
  """Sleeps for a configured amount of time.
1556 06009e27 Iustin Pop

1557 06009e27 Iustin Pop
  This is used just for debugging and testing.
1558 06009e27 Iustin Pop

1559 06009e27 Iustin Pop
  Parameters:
1560 06009e27 Iustin Pop
    - duration: the time to sleep
1561 06009e27 Iustin Pop
    - on_master: if true, sleep on the master
1562 06009e27 Iustin Pop
    - on_nodes: list of nodes in which to sleep
1563 06009e27 Iustin Pop

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

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

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

1574 06009e27 Iustin Pop
  """
1575 60dd1473 Iustin Pop
  OP_DSC_FIELD = "duration"
1576 65e183af Michael Hanselmann
  OP_PARAMS = [
1577 b795a775 Michael Hanselmann
    ("duration", ht.NoDefault, ht.TNumber, None),
1578 197b323b Michael Hanselmann
    ("on_master", True, ht.TBool, None),
1579 197b323b Michael Hanselmann
    ("on_nodes", ht.EmptyList, ht.TListOf(ht.TNonEmptyString), None),
1580 197b323b Michael Hanselmann
    ("repeat", 0, ht.TPositiveInt, None),
1581 65e183af Michael Hanselmann
    ]
1582 d61df03e Iustin Pop
1583 d61df03e Iustin Pop
1584 d61df03e Iustin Pop
class OpTestAllocator(OpCode):
1585 d61df03e Iustin Pop
  """Allocator framework testing.
1586 d61df03e Iustin Pop

1587 d61df03e Iustin Pop
  This opcode has two modes:
1588 d61df03e Iustin Pop
    - gather and return allocator input for a given mode (allocate new
1589 d61df03e Iustin Pop
      or replace secondary) and a given instance definition (direction
1590 d61df03e Iustin Pop
      'in')
1591 d61df03e Iustin Pop
    - run a selected allocator for a given operation (as above) and
1592 d61df03e Iustin Pop
      return the allocator output (direction 'out')
1593 d61df03e Iustin Pop

1594 d61df03e Iustin Pop
  """
1595 60dd1473 Iustin Pop
  OP_DSC_FIELD = "allocator"
1596 65e183af Michael Hanselmann
  OP_PARAMS = [
1597 65e183af Michael Hanselmann
    ("direction", ht.NoDefault,
1598 197b323b Michael Hanselmann
     ht.TElemOf(constants.VALID_IALLOCATOR_DIRECTIONS), None),
1599 197b323b Michael Hanselmann
    ("mode", ht.NoDefault, ht.TElemOf(constants.VALID_IALLOCATOR_MODES), None),
1600 197b323b Michael Hanselmann
    ("name", ht.NoDefault, ht.TNonEmptyString, None),
1601 65e183af Michael Hanselmann
    ("nics", ht.NoDefault, ht.TOr(ht.TNone, ht.TListOf(
1602 fdbe29ee Michael Hanselmann
     ht.TDictOf(ht.TElemOf([constants.INIC_MAC, constants.INIC_IP, "bridge"]),
1603 45d4c81c Michael Hanselmann
                ht.TOr(ht.TNone, ht.TNonEmptyString)))), None),
1604 197b323b Michael Hanselmann
    ("disks", ht.NoDefault, ht.TOr(ht.TNone, ht.TList), None),
1605 197b323b Michael Hanselmann
    ("hypervisor", None, ht.TMaybeString, None),
1606 197b323b Michael Hanselmann
    ("allocator", None, ht.TMaybeString, None),
1607 197b323b Michael Hanselmann
    ("tags", ht.EmptyList, ht.TListOf(ht.TNonEmptyString), None),
1608 dd47a0f0 Iustin Pop
    ("memory", None, ht.TOr(ht.TNone, ht.TPositiveInt), None),
1609 197b323b Michael Hanselmann
    ("vcpus", None, ht.TOr(ht.TNone, ht.TPositiveInt), None),
1610 197b323b Michael Hanselmann
    ("os", None, ht.TMaybeString, None),
1611 197b323b Michael Hanselmann
    ("disk_template", None, ht.TMaybeString, None),
1612 bee581e2 Michael Hanselmann
    ("instances", None, ht.TOr(ht.TNone, ht.TListOf(ht.TNonEmptyString)),
1613 bee581e2 Michael Hanselmann
     None),
1614 60152bbe Michael Hanselmann
    ("evac_mode", None,
1615 60152bbe Michael Hanselmann
     ht.TOr(ht.TNone, ht.TElemOf(constants.IALLOCATOR_NEVAC_MODES)), None),
1616 bee581e2 Michael Hanselmann
    ("target_groups", None, ht.TOr(ht.TNone, ht.TListOf(ht.TNonEmptyString)),
1617 bee581e2 Michael Hanselmann
     None),
1618 d61df03e Iustin Pop
    ]
1619 363acb1e Iustin Pop
1620 76aef8fc Michael Hanselmann
1621 b469eb4d Iustin Pop
class OpTestJqueue(OpCode):
1622 e58f87a9 Michael Hanselmann
  """Utility opcode to test some aspects of the job queue.
1623 e58f87a9 Michael Hanselmann

1624 e58f87a9 Michael Hanselmann
  """
1625 65e183af Michael Hanselmann
  OP_PARAMS = [
1626 197b323b Michael Hanselmann
    ("notify_waitlock", False, ht.TBool, None),
1627 197b323b Michael Hanselmann
    ("notify_exec", False, ht.TBool, None),
1628 197b323b Michael Hanselmann
    ("log_messages", ht.EmptyList, ht.TListOf(ht.TString), None),
1629 197b323b Michael Hanselmann
    ("fail", False, ht.TBool, None),
1630 e58f87a9 Michael Hanselmann
    ]
1631 e58f87a9 Michael Hanselmann
1632 e58f87a9 Michael Hanselmann
1633 be760ba8 Michael Hanselmann
class OpTestDummy(OpCode):
1634 be760ba8 Michael Hanselmann
  """Utility opcode used by unittests.
1635 be760ba8 Michael Hanselmann

1636 be760ba8 Michael Hanselmann
  """
1637 65e183af Michael Hanselmann
  OP_PARAMS = [
1638 197b323b Michael Hanselmann
    ("result", ht.NoDefault, ht.NoType, None),
1639 197b323b Michael Hanselmann
    ("messages", ht.NoDefault, ht.NoType, None),
1640 197b323b Michael Hanselmann
    ("fail", ht.NoDefault, ht.NoType, None),
1641 6a373640 Michael Hanselmann
    ("submit_jobs", None, ht.NoType, None),
1642 be760ba8 Michael Hanselmann
    ]
1643 687c10d9 Iustin Pop
  WITH_LU = False
1644 be760ba8 Michael Hanselmann
1645 be760ba8 Michael Hanselmann
1646 dbc96028 Michael Hanselmann
def _GetOpList():
1647 dbc96028 Michael Hanselmann
  """Returns list of all defined opcodes.
1648 dbc96028 Michael Hanselmann

1649 dbc96028 Michael Hanselmann
  Does not eliminate duplicates by C{OP_ID}.
1650 dbc96028 Michael Hanselmann

1651 dbc96028 Michael Hanselmann
  """
1652 dbc96028 Michael Hanselmann
  return [v for v in globals().values()
1653 dbc96028 Michael Hanselmann
          if (isinstance(v, type) and issubclass(v, OpCode) and
1654 687c10d9 Iustin Pop
              hasattr(v, "OP_ID") and v is not OpCode)]
1655 dbc96028 Michael Hanselmann
1656 dbc96028 Michael Hanselmann
1657 dbc96028 Michael Hanselmann
OP_MAPPING = dict((v.OP_ID, v) for v in _GetOpList())