Statistics
| Branch: | Tag: | Revision:

root / lib / opcodes.py @ 98dfcaff

History | View | Annotate | Download (50.4 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 8c9ee749 Michael Hanselmann
_CheckDiskTemplate = ht.TAnd(ht.TElemOf(constants.DISK_TEMPLATES),
241 8c9ee749 Michael Hanselmann
                             _CheckFileStorage)
242 8c9ee749 Michael Hanselmann
243 8c9ee749 Michael Hanselmann
244 65e183af Michael Hanselmann
def _CheckStorageType(storage_type):
245 65e183af Michael Hanselmann
  """Ensure a given storage type is valid.
246 65e183af Michael Hanselmann

247 65e183af Michael Hanselmann
  """
248 65e183af Michael Hanselmann
  if storage_type not in constants.VALID_STORAGE_TYPES:
249 65e183af Michael Hanselmann
    raise errors.OpPrereqError("Unknown storage type: %s" % storage_type,
250 65e183af Michael Hanselmann
                               errors.ECODE_INVAL)
251 65e183af Michael Hanselmann
  if storage_type == constants.ST_FILE:
252 65e183af Michael Hanselmann
    RequireFileStorage()
253 65e183af Michael Hanselmann
  return True
254 65e183af Michael Hanselmann
255 65e183af Michael Hanselmann
256 65e183af Michael Hanselmann
#: Storage type parameter
257 45d4c81c Michael Hanselmann
_PStorageType = ("storage_type", ht.NoDefault, _CheckStorageType,
258 45d4c81c Michael Hanselmann
                 "Storage type")
259 65e183af Michael Hanselmann
260 65e183af Michael Hanselmann
261 65e183af Michael Hanselmann
class _AutoOpParamSlots(type):
262 65e183af Michael Hanselmann
  """Meta class for opcode definitions.
263 65e183af Michael Hanselmann

264 65e183af Michael Hanselmann
  """
265 65e183af Michael Hanselmann
  def __new__(mcs, name, bases, attrs):
266 65e183af Michael Hanselmann
    """Called when a class should be created.
267 65e183af Michael Hanselmann

268 65e183af Michael Hanselmann
    @param mcs: The meta class
269 65e183af Michael Hanselmann
    @param name: Name of created class
270 65e183af Michael Hanselmann
    @param bases: Base classes
271 65e183af Michael Hanselmann
    @type attrs: dict
272 65e183af Michael Hanselmann
    @param attrs: Class attributes
273 65e183af Michael Hanselmann

274 65e183af Michael Hanselmann
    """
275 65e183af Michael Hanselmann
    assert "__slots__" not in attrs, \
276 65e183af Michael Hanselmann
      "Class '%s' defines __slots__ when it should use OP_PARAMS" % name
277 e89a9021 Iustin Pop
    assert "OP_ID" not in attrs, "Class '%s' defining OP_ID" % name
278 ff0d18e6 Iustin Pop
279 e89a9021 Iustin Pop
    attrs["OP_ID"] = _NameToId(name)
280 65e183af Michael Hanselmann
281 65e183af Michael Hanselmann
    # Always set OP_PARAMS to avoid duplicates in BaseOpCode.GetAllParams
282 65e183af Michael Hanselmann
    params = attrs.setdefault("OP_PARAMS", [])
283 65e183af Michael Hanselmann
284 65e183af Michael Hanselmann
    # Use parameter names as slots
285 197b323b Michael Hanselmann
    slots = [pname for (pname, _, _, _) in params]
286 65e183af Michael Hanselmann
287 65e183af Michael Hanselmann
    assert "OP_DSC_FIELD" not in attrs or attrs["OP_DSC_FIELD"] in slots, \
288 65e183af Michael Hanselmann
      "Class '%s' uses unknown field in OP_DSC_FIELD" % name
289 65e183af Michael Hanselmann
290 65e183af Michael Hanselmann
    attrs["__slots__"] = slots
291 65e183af Michael Hanselmann
292 65e183af Michael Hanselmann
    return type.__new__(mcs, name, bases, attrs)
293 65e183af Michael Hanselmann
294 df458e0b Iustin Pop
295 0e46916d Iustin Pop
class BaseOpCode(object):
296 df458e0b Iustin Pop
  """A simple serializable object.
297 df458e0b Iustin Pop

298 0e46916d Iustin Pop
  This object serves as a parent class for OpCode without any custom
299 0e46916d Iustin Pop
  field handling.
300 0e46916d Iustin Pop

301 df458e0b Iustin Pop
  """
302 b459a848 Andrea Spadaccini
  # pylint: disable=E1101
303 e89a9021 Iustin Pop
  # as OP_ID is dynamically defined
304 65e183af Michael Hanselmann
  __metaclass__ = _AutoOpParamSlots
305 65e183af Michael Hanselmann
306 a8083063 Iustin Pop
  def __init__(self, **kwargs):
307 a7399f66 Iustin Pop
    """Constructor for BaseOpCode.
308 a7399f66 Iustin Pop

309 a7399f66 Iustin Pop
    The constructor takes only keyword arguments and will set
310 a7399f66 Iustin Pop
    attributes on this object based on the passed arguments. As such,
311 a7399f66 Iustin Pop
    it means that you should not pass arguments which are not in the
312 a7399f66 Iustin Pop
    __slots__ attribute for this class.
313 a7399f66 Iustin Pop

314 a7399f66 Iustin Pop
    """
315 adf385c7 Iustin Pop
    slots = self._all_slots()
316 a8083063 Iustin Pop
    for key in kwargs:
317 adf385c7 Iustin Pop
      if key not in slots:
318 df458e0b Iustin Pop
        raise TypeError("Object %s doesn't support the parameter '%s'" %
319 3ecf6786 Iustin Pop
                        (self.__class__.__name__, key))
320 a8083063 Iustin Pop
      setattr(self, key, kwargs[key])
321 a8083063 Iustin Pop
322 df458e0b Iustin Pop
  def __getstate__(self):
323 a7399f66 Iustin Pop
    """Generic serializer.
324 a7399f66 Iustin Pop

325 a7399f66 Iustin Pop
    This method just returns the contents of the instance as a
326 a7399f66 Iustin Pop
    dictionary.
327 a7399f66 Iustin Pop

328 a7399f66 Iustin Pop
    @rtype:  C{dict}
329 a7399f66 Iustin Pop
    @return: the instance attributes and their values
330 a7399f66 Iustin Pop

331 a7399f66 Iustin Pop
    """
332 df458e0b Iustin Pop
    state = {}
333 adf385c7 Iustin Pop
    for name in self._all_slots():
334 df458e0b Iustin Pop
      if hasattr(self, name):
335 df458e0b Iustin Pop
        state[name] = getattr(self, name)
336 df458e0b Iustin Pop
    return state
337 df458e0b Iustin Pop
338 df458e0b Iustin Pop
  def __setstate__(self, state):
339 a7399f66 Iustin Pop
    """Generic unserializer.
340 a7399f66 Iustin Pop

341 a7399f66 Iustin Pop
    This method just restores from the serialized state the attributes
342 a7399f66 Iustin Pop
    of the current instance.
343 a7399f66 Iustin Pop

344 a7399f66 Iustin Pop
    @param state: the serialized opcode data
345 a7399f66 Iustin Pop
    @type state:  C{dict}
346 a7399f66 Iustin Pop

347 a7399f66 Iustin Pop
    """
348 df458e0b Iustin Pop
    if not isinstance(state, dict):
349 df458e0b Iustin Pop
      raise ValueError("Invalid data to __setstate__: expected dict, got %s" %
350 df458e0b Iustin Pop
                       type(state))
351 df458e0b Iustin Pop
352 adf385c7 Iustin Pop
    for name in self._all_slots():
353 44db3a6f Iustin Pop
      if name not in state and hasattr(self, name):
354 df458e0b Iustin Pop
        delattr(self, name)
355 df458e0b Iustin Pop
356 df458e0b Iustin Pop
    for name in state:
357 df458e0b Iustin Pop
      setattr(self, name, state[name])
358 df458e0b Iustin Pop
359 adf385c7 Iustin Pop
  @classmethod
360 adf385c7 Iustin Pop
  def _all_slots(cls):
361 adf385c7 Iustin Pop
    """Compute the list of all declared slots for a class.
362 adf385c7 Iustin Pop

363 adf385c7 Iustin Pop
    """
364 adf385c7 Iustin Pop
    slots = []
365 adf385c7 Iustin Pop
    for parent in cls.__mro__:
366 adf385c7 Iustin Pop
      slots.extend(getattr(parent, "__slots__", []))
367 adf385c7 Iustin Pop
    return slots
368 adf385c7 Iustin Pop
369 65e183af Michael Hanselmann
  @classmethod
370 65e183af Michael Hanselmann
  def GetAllParams(cls):
371 65e183af Michael Hanselmann
    """Compute list of all parameters for an opcode.
372 65e183af Michael Hanselmann

373 65e183af Michael Hanselmann
    """
374 65e183af Michael Hanselmann
    slots = []
375 65e183af Michael Hanselmann
    for parent in cls.__mro__:
376 65e183af Michael Hanselmann
      slots.extend(getattr(parent, "OP_PARAMS", []))
377 65e183af Michael Hanselmann
    return slots
378 65e183af Michael Hanselmann
379 1cbef6d8 Michael Hanselmann
  def Validate(self, set_defaults):
380 1cbef6d8 Michael Hanselmann
    """Validate opcode parameters, optionally setting default values.
381 1cbef6d8 Michael Hanselmann

382 1cbef6d8 Michael Hanselmann
    @type set_defaults: bool
383 1cbef6d8 Michael Hanselmann
    @param set_defaults: Whether to set default values
384 1cbef6d8 Michael Hanselmann
    @raise errors.OpPrereqError: When a parameter value doesn't match
385 1cbef6d8 Michael Hanselmann
                                 requirements
386 1cbef6d8 Michael Hanselmann

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

420 b247c6fc Michael Hanselmann
  @type relative: bool
421 b247c6fc Michael Hanselmann
  @param relative: Whether to accept relative job IDs (negative)
422 b247c6fc Michael Hanselmann
  @rtype: callable
423 b247c6fc Michael Hanselmann

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

458 a7399f66 Iustin Pop
  This is the root of the actual OpCode hierarchy. All clases derived
459 a7399f66 Iustin Pop
  from this class should override OP_ID.
460 a7399f66 Iustin Pop

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

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

495 a7399f66 Iustin Pop
    This method adds to the state dictionary the OP_ID of the class,
496 a7399f66 Iustin Pop
    so that on unload we can identify the correct class for
497 a7399f66 Iustin Pop
    instantiating the opcode.
498 a7399f66 Iustin Pop

499 a7399f66 Iustin Pop
    @rtype:   C{dict}
500 a7399f66 Iustin Pop
    @return:  the state as a dictionary
501 a7399f66 Iustin Pop

502 df458e0b Iustin Pop
    """
503 0e46916d Iustin Pop
    data = BaseOpCode.__getstate__(self)
504 df458e0b Iustin Pop
    data["OP_ID"] = self.OP_ID
505 df458e0b Iustin Pop
    return data
506 df458e0b Iustin Pop
507 df458e0b Iustin Pop
  @classmethod
508 00abdc96 Iustin Pop
  def LoadOpCode(cls, data):
509 df458e0b Iustin Pop
    """Generic load opcode method.
510 df458e0b Iustin Pop

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

515 a7399f66 Iustin Pop
    @type data:  C{dict}
516 a7399f66 Iustin Pop
    @param data: the serialized opcode
517 a7399f66 Iustin Pop

518 df458e0b Iustin Pop
    """
519 df458e0b Iustin Pop
    if not isinstance(data, dict):
520 df458e0b Iustin Pop
      raise ValueError("Invalid data to LoadOpCode (%s)" % type(data))
521 df458e0b Iustin Pop
    if "OP_ID" not in data:
522 df458e0b Iustin Pop
      raise ValueError("Invalid data to LoadOpcode, missing OP_ID")
523 df458e0b Iustin Pop
    op_id = data["OP_ID"]
524 df458e0b Iustin Pop
    op_class = None
525 363acb1e Iustin Pop
    if op_id in OP_MAPPING:
526 363acb1e Iustin Pop
      op_class = OP_MAPPING[op_id]
527 363acb1e Iustin Pop
    else:
528 df458e0b Iustin Pop
      raise ValueError("Invalid data to LoadOpCode: OP_ID %s unsupported" %
529 df458e0b Iustin Pop
                       op_id)
530 df458e0b Iustin Pop
    op = op_class()
531 df458e0b Iustin Pop
    new_data = data.copy()
532 df458e0b Iustin Pop
    del new_data["OP_ID"]
533 df458e0b Iustin Pop
    op.__setstate__(new_data)
534 df458e0b Iustin Pop
    return op
535 df458e0b Iustin Pop
536 60dd1473 Iustin Pop
  def Summary(self):
537 60dd1473 Iustin Pop
    """Generates a summary description of this opcode.
538 60dd1473 Iustin Pop

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

545 60dd1473 Iustin Pop
    """
546 ff0d18e6 Iustin Pop
    assert self.OP_ID is not None and len(self.OP_ID) > 3
547 60dd1473 Iustin Pop
    # all OP_ID start with OP_, we remove that
548 60dd1473 Iustin Pop
    txt = self.OP_ID[3:]
549 60dd1473 Iustin Pop
    field_name = getattr(self, "OP_DSC_FIELD", None)
550 60dd1473 Iustin Pop
    if field_name:
551 60dd1473 Iustin Pop
      field_value = getattr(self, field_name, None)
552 bc8bbda1 Iustin Pop
      if isinstance(field_value, (list, tuple)):
553 bc8bbda1 Iustin Pop
        field_value = ",".join(str(i) for i in field_value)
554 60dd1473 Iustin Pop
      txt = "%s(%s)" % (txt, field_value)
555 60dd1473 Iustin Pop
    return txt
556 60dd1473 Iustin Pop
557 3ce9a5e7 Michael Hanselmann
  def TinySummary(self):
558 3ce9a5e7 Michael Hanselmann
    """Generates a compact summary description of the opcode.
559 3ce9a5e7 Michael Hanselmann

560 3ce9a5e7 Michael Hanselmann
    """
561 3ce9a5e7 Michael Hanselmann
    assert self.OP_ID.startswith("OP_")
562 3ce9a5e7 Michael Hanselmann
563 3ce9a5e7 Michael Hanselmann
    text = self.OP_ID[3:]
564 3ce9a5e7 Michael Hanselmann
565 3ce9a5e7 Michael Hanselmann
    for (prefix, supplement) in _SUMMARY_PREFIX.items():
566 3ce9a5e7 Michael Hanselmann
      if text.startswith(prefix):
567 3ce9a5e7 Michael Hanselmann
        return supplement + text[len(prefix):]
568 3ce9a5e7 Michael Hanselmann
569 3ce9a5e7 Michael Hanselmann
    return text
570 3ce9a5e7 Michael Hanselmann
571 a8083063 Iustin Pop
572 afee0879 Iustin Pop
# cluster opcodes
573 afee0879 Iustin Pop
574 bc84ffa7 Iustin Pop
class OpClusterPostInit(OpCode):
575 b5f5fae9 Luca Bigliardi
  """Post cluster initialization.
576 b5f5fae9 Luca Bigliardi

577 b5f5fae9 Luca Bigliardi
  This opcode does not touch the cluster at all. Its purpose is to run hooks
578 b5f5fae9 Luca Bigliardi
  after the cluster has been initialized.
579 b5f5fae9 Luca Bigliardi

580 b5f5fae9 Luca Bigliardi
  """
581 b5f5fae9 Luca Bigliardi
582 b5f5fae9 Luca Bigliardi
583 c6d43e9e Iustin Pop
class OpClusterDestroy(OpCode):
584 a7399f66 Iustin Pop
  """Destroy the cluster.
585 a7399f66 Iustin Pop

586 a7399f66 Iustin Pop
  This opcode has no other parameters. All the state is irreversibly
587 a7399f66 Iustin Pop
  lost after the execution of this opcode.
588 a7399f66 Iustin Pop

589 a7399f66 Iustin Pop
  """
590 a8083063 Iustin Pop
591 a8083063 Iustin Pop
592 a2f7ab92 Iustin Pop
class OpClusterQuery(OpCode):
593 fdc267f4 Iustin Pop
  """Query cluster information."""
594 a8083063 Iustin Pop
595 a8083063 Iustin Pop
596 fcad7225 Michael Hanselmann
class OpClusterVerify(OpCode):
597 fcad7225 Michael Hanselmann
  """Submits all jobs necessary to verify the cluster.
598 fcad7225 Michael Hanselmann

599 fcad7225 Michael Hanselmann
  """
600 fcad7225 Michael Hanselmann
  OP_PARAMS = [
601 fcad7225 Michael Hanselmann
    _PDebugSimulateErrors,
602 fcad7225 Michael Hanselmann
    _PErrorCodes,
603 fcad7225 Michael Hanselmann
    _PSkipChecks,
604 fcad7225 Michael Hanselmann
    _PVerbose,
605 fcad7225 Michael Hanselmann
    ("group_name", None, ht.TMaybeString, "Group to verify")
606 fcad7225 Michael Hanselmann
    ]
607 f7686867 Michael Hanselmann
  OP_RESULT = TJobIdListOnly
608 fcad7225 Michael Hanselmann
609 fcad7225 Michael Hanselmann
610 bf93ae69 Adeodato Simo
class OpClusterVerifyConfig(OpCode):
611 bf93ae69 Adeodato Simo
  """Verify the cluster config.
612 bf93ae69 Adeodato Simo

613 bf93ae69 Adeodato Simo
  """
614 bf93ae69 Adeodato Simo
  OP_PARAMS = [
615 57106b74 Michael Hanselmann
    _PDebugSimulateErrors,
616 57106b74 Michael Hanselmann
    _PErrorCodes,
617 57106b74 Michael Hanselmann
    _PVerbose,
618 bf93ae69 Adeodato Simo
    ]
619 f7686867 Michael Hanselmann
  OP_RESULT = ht.TBool
620 bf93ae69 Adeodato Simo
621 bf93ae69 Adeodato Simo
622 bf93ae69 Adeodato Simo
class OpClusterVerifyGroup(OpCode):
623 bf93ae69 Adeodato Simo
  """Run verify on a node group from the cluster.
624 a7399f66 Iustin Pop

625 a7399f66 Iustin Pop
  @type skip_checks: C{list}
626 a7399f66 Iustin Pop
  @ivar skip_checks: steps to be skipped from the verify process; this
627 a7399f66 Iustin Pop
                     needs to be a subset of
628 a7399f66 Iustin Pop
                     L{constants.VERIFY_OPTIONAL_CHECKS}; currently
629 a7399f66 Iustin Pop
                     only L{constants.VERIFY_NPLUSONE_MEM} can be passed
630 a7399f66 Iustin Pop

631 a7399f66 Iustin Pop
  """
632 bf93ae69 Adeodato Simo
  OP_DSC_FIELD = "group_name"
633 65e183af Michael Hanselmann
  OP_PARAMS = [
634 57106b74 Michael Hanselmann
    _PGroupName,
635 57106b74 Michael Hanselmann
    _PDebugSimulateErrors,
636 57106b74 Michael Hanselmann
    _PErrorCodes,
637 57106b74 Michael Hanselmann
    _PSkipChecks,
638 57106b74 Michael Hanselmann
    _PVerbose,
639 65e183af Michael Hanselmann
    ]
640 f7686867 Michael Hanselmann
  OP_RESULT = ht.TBool
641 a8083063 Iustin Pop
642 a8083063 Iustin Pop
643 bd8210a7 Iustin Pop
class OpClusterVerifyDisks(OpCode):
644 150e978f Iustin Pop
  """Verify the cluster disks.
645 150e978f Iustin Pop

646 ae1a845c Michael Hanselmann
  """
647 f7686867 Michael Hanselmann
  OP_RESULT = TJobIdListOnly
648 ae1a845c Michael Hanselmann
649 ae1a845c Michael Hanselmann
650 ae1a845c Michael Hanselmann
class OpGroupVerifyDisks(OpCode):
651 ae1a845c Michael Hanselmann
  """Verifies the status of all disks in a node group.
652 150e978f Iustin Pop

653 ae1a845c Michael Hanselmann
  Result: a tuple of three elements:
654 ae1a845c Michael Hanselmann
    - dict of node names with issues (values: error msg)
655 150e978f Iustin Pop
    - list of instances with degraded disks (that should be activated)
656 b63ed789 Iustin Pop
    - dict of instances with missing logical volumes (values: (node, vol)
657 b63ed789 Iustin Pop
      pairs with details about the missing volumes)
658 150e978f Iustin Pop

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

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

667 150e978f Iustin Pop
  """
668 ae1a845c Michael Hanselmann
  OP_DSC_FIELD = "group_name"
669 ae1a845c Michael Hanselmann
  OP_PARAMS = [
670 ae1a845c Michael Hanselmann
    _PGroupName,
671 ae1a845c Michael Hanselmann
    ]
672 1ce03fb1 Michael Hanselmann
  OP_RESULT = \
673 1ce03fb1 Michael Hanselmann
    ht.TAnd(ht.TIsLength(3),
674 1ce03fb1 Michael Hanselmann
            ht.TItems([ht.TDictOf(ht.TString, ht.TString),
675 1ce03fb1 Michael Hanselmann
                       ht.TListOf(ht.TString),
676 6973587f Michael Hanselmann
                       ht.TDictOf(ht.TString,
677 6973587f Michael Hanselmann
                                  ht.TListOf(ht.TListOf(ht.TString)))]))
678 150e978f Iustin Pop
679 150e978f Iustin Pop
680 5d01aca3 Iustin Pop
class OpClusterRepairDiskSizes(OpCode):
681 60975797 Iustin Pop
  """Verify the disk sizes of the instances and fixes configuration
682 60975797 Iustin Pop
  mimatches.
683 60975797 Iustin Pop

684 60975797 Iustin Pop
  Parameters: optional instances list, in case we want to restrict the
685 60975797 Iustin Pop
  checks to only a subset of the instances.
686 60975797 Iustin Pop

687 60975797 Iustin Pop
  Result: a list of tuples, (instance, disk, new-size) for changed
688 60975797 Iustin Pop
  configurations.
689 60975797 Iustin Pop

690 60975797 Iustin Pop
  In normal operation, the list should be empty.
691 60975797 Iustin Pop

692 60975797 Iustin Pop
  @type instances: list
693 60975797 Iustin Pop
  @ivar instances: the list of instances to check, or empty for all instances
694 60975797 Iustin Pop

695 60975797 Iustin Pop
  """
696 65e183af Michael Hanselmann
  OP_PARAMS = [
697 197b323b Michael Hanselmann
    ("instances", ht.EmptyList, ht.TListOf(ht.TNonEmptyString), None),
698 65e183af Michael Hanselmann
    ]
699 60975797 Iustin Pop
700 60975797 Iustin Pop
701 2f093ea0 Iustin Pop
class OpClusterConfigQuery(OpCode):
702 ae5849b5 Michael Hanselmann
  """Query cluster configuration values."""
703 65e183af Michael Hanselmann
  OP_PARAMS = [
704 65e183af Michael Hanselmann
    _POutputFields
705 65e183af Michael Hanselmann
    ]
706 a8083063 Iustin Pop
707 a8083063 Iustin Pop
708 e126df25 Iustin Pop
class OpClusterRename(OpCode):
709 a7399f66 Iustin Pop
  """Rename the cluster.
710 a7399f66 Iustin Pop

711 a7399f66 Iustin Pop
  @type name: C{str}
712 a7399f66 Iustin Pop
  @ivar name: The new name of the cluster. The name and/or the master IP
713 a7399f66 Iustin Pop
              address will be changed to match the new name and its IP
714 a7399f66 Iustin Pop
              address.
715 a7399f66 Iustin Pop

716 a7399f66 Iustin Pop
  """
717 60dd1473 Iustin Pop
  OP_DSC_FIELD = "name"
718 65e183af Michael Hanselmann
  OP_PARAMS = [
719 197b323b Michael Hanselmann
    ("name", ht.NoDefault, ht.TNonEmptyString, None),
720 65e183af Michael Hanselmann
    ]
721 07bd8a51 Iustin Pop
722 07bd8a51 Iustin Pop
723 a6682fdc Iustin Pop
class OpClusterSetParams(OpCode):
724 a7399f66 Iustin Pop
  """Change the parameters of the cluster.
725 a7399f66 Iustin Pop

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

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

785 afee0879 Iustin Pop
  """
786 afee0879 Iustin Pop
787 83f72637 Michael Hanselmann
788 83f72637 Michael Hanselmann
class OpQuery(OpCode):
789 83f72637 Michael Hanselmann
  """Query for resources/items.
790 83f72637 Michael Hanselmann

791 abd66bf8 Michael Hanselmann
  @ivar what: Resources to query for, must be one of L{constants.QR_VIA_OP}
792 83f72637 Michael Hanselmann
  @ivar fields: List of fields to retrieve
793 83f72637 Michael Hanselmann
  @ivar filter: Query filter
794 83f72637 Michael Hanselmann

795 83f72637 Michael Hanselmann
  """
796 e50d8412 Michael Hanselmann
  OP_DSC_FIELD = "what"
797 65e183af Michael Hanselmann
  OP_PARAMS = [
798 8e7078e0 Michael Hanselmann
    _PQueryWhat,
799 ee13764f Michael Hanselmann
    _PUseLocking,
800 45d4c81c Michael Hanselmann
    ("fields", ht.NoDefault, ht.TListOf(ht.TNonEmptyString),
801 45d4c81c Michael Hanselmann
     "Requested fields"),
802 545d0362 Michael Hanselmann
    ("filter", None, ht.TOr(ht.TNone, ht.TList),
803 45d4c81c Michael Hanselmann
     "Query filter"),
804 83f72637 Michael Hanselmann
    ]
805 83f72637 Michael Hanselmann
806 83f72637 Michael Hanselmann
807 83f72637 Michael Hanselmann
class OpQueryFields(OpCode):
808 83f72637 Michael Hanselmann
  """Query for available resource/item fields.
809 83f72637 Michael Hanselmann

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

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

843 a7399f66 Iustin Pop
  @type node_name: C{str}
844 a7399f66 Iustin Pop
  @ivar node_name: The name of the node to remove. If the node still has
845 a7399f66 Iustin Pop
                   instances on it, the operation will fail.
846 a7399f66 Iustin Pop

847 a7399f66 Iustin Pop
  """
848 60dd1473 Iustin Pop
  OP_DSC_FIELD = "node_name"
849 65e183af Michael Hanselmann
  OP_PARAMS = [
850 65e183af Michael Hanselmann
    _PNodeName,
851 65e183af Michael Hanselmann
    ]
852 a8083063 Iustin Pop
853 a8083063 Iustin Pop
854 d817d49f Iustin Pop
class OpNodeAdd(OpCode):
855 a7399f66 Iustin Pop
  """Add a node to the cluster.
856 a7399f66 Iustin Pop

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

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

1016 9bf56d77 Michael Hanselmann
  @ivar instance_name: Instance name
1017 9bf56d77 Michael Hanselmann
  @ivar mode: Instance creation mode (one of L{constants.INSTANCE_CREATE_MODES})
1018 9bf56d77 Michael Hanselmann
  @ivar source_handshake: Signed handshake from source (remote import only)
1019 9bf56d77 Michael Hanselmann
  @ivar source_x509_ca: Source X509 CA in PEM format (remote import only)
1020 9bf56d77 Michael Hanselmann
  @ivar source_instance_name: Previous name of instance (remote import only)
1021 dae91d02 Michael Hanselmann
  @ivar source_shutdown_timeout: Shutdown timeout used for source instance
1022 dae91d02 Michael Hanselmann
    (remote import only)
1023 9bf56d77 Michael Hanselmann

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

1192 53c776b5 Iustin Pop
  This migrates (without shutting down an instance) to its secondary
1193 53c776b5 Iustin Pop
  node.
1194 53c776b5 Iustin Pop

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

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

1217 313bcead Iustin Pop
  This move (with shutting down an instance and data copying) to an
1218 313bcead Iustin Pop
  arbitrary node.
1219 313bcead Iustin Pop

1220 313bcead Iustin Pop
  @ivar instance_name: the name of the instance
1221 313bcead Iustin Pop
  @ivar target_node: the destination node
1222 313bcead Iustin Pop

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

1445 1410fa8d Michael Hanselmann
  @ivar instance_name: Instance name
1446 1410fa8d Michael Hanselmann
  @ivar mode: Export mode (one of L{constants.EXPORT_MODES})
1447 1410fa8d Michael Hanselmann

1448 1410fa8d Michael Hanselmann
  """
1449 1410fa8d Michael Hanselmann
  OP_DSC_FIELD = "instance_name"
1450 65e183af Michael Hanselmann
  OP_PARAMS = [
1451 65e183af Michael Hanselmann
    _PInstanceName,
1452 45d4c81c Michael Hanselmann
    ("mode", ht.NoDefault, ht.TElemOf(constants.EXPORT_MODES),
1453 45d4c81c Michael Hanselmann
     "Export mode"),
1454 1410fa8d Michael Hanselmann
    ]
1455 1410fa8d Michael Hanselmann
1456 1410fa8d Michael Hanselmann
1457 4ff922a2 Iustin Pop
class OpBackupExport(OpCode):
1458 4a96f1d1 Michael Hanselmann
  """Export an instance.
1459 4a96f1d1 Michael Hanselmann

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

1466 4a96f1d1 Michael Hanselmann
  @ivar mode: Export mode (one of L{constants.EXPORT_MODES})
1467 4a96f1d1 Michael Hanselmann
  @ivar target_node: Export destination
1468 4a96f1d1 Michael Hanselmann
  @ivar x509_key_name: X509 key to use (remote export only)
1469 4a96f1d1 Michael Hanselmann
  @ivar destination_x509_ca: Destination X509 CA in PEM format (remote export
1470 4a96f1d1 Michael Hanselmann
                             only)
1471 4a96f1d1 Michael Hanselmann

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

1546 06009e27 Iustin Pop
  This is used just for debugging and testing.
1547 06009e27 Iustin Pop

1548 06009e27 Iustin Pop
  Parameters:
1549 06009e27 Iustin Pop
    - duration: the time to sleep
1550 06009e27 Iustin Pop
    - on_master: if true, sleep on the master
1551 06009e27 Iustin Pop
    - on_nodes: list of nodes in which to sleep
1552 06009e27 Iustin Pop

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

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

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

1563 06009e27 Iustin Pop
  """
1564 60dd1473 Iustin Pop
  OP_DSC_FIELD = "duration"
1565 65e183af Michael Hanselmann
  OP_PARAMS = [
1566 b795a775 Michael Hanselmann
    ("duration", ht.NoDefault, ht.TNumber, None),
1567 197b323b Michael Hanselmann
    ("on_master", True, ht.TBool, None),
1568 197b323b Michael Hanselmann
    ("on_nodes", ht.EmptyList, ht.TListOf(ht.TNonEmptyString), None),
1569 197b323b Michael Hanselmann
    ("repeat", 0, ht.TPositiveInt, None),
1570 65e183af Michael Hanselmann
    ]
1571 d61df03e Iustin Pop
1572 d61df03e Iustin Pop
1573 d61df03e Iustin Pop
class OpTestAllocator(OpCode):
1574 d61df03e Iustin Pop
  """Allocator framework testing.
1575 d61df03e Iustin Pop

1576 d61df03e Iustin Pop
  This opcode has two modes:
1577 d61df03e Iustin Pop
    - gather and return allocator input for a given mode (allocate new
1578 d61df03e Iustin Pop
      or replace secondary) and a given instance definition (direction
1579 d61df03e Iustin Pop
      'in')
1580 d61df03e Iustin Pop
    - run a selected allocator for a given operation (as above) and
1581 d61df03e Iustin Pop
      return the allocator output (direction 'out')
1582 d61df03e Iustin Pop

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

1613 e58f87a9 Michael Hanselmann
  """
1614 65e183af Michael Hanselmann
  OP_PARAMS = [
1615 197b323b Michael Hanselmann
    ("notify_waitlock", False, ht.TBool, None),
1616 197b323b Michael Hanselmann
    ("notify_exec", False, ht.TBool, None),
1617 197b323b Michael Hanselmann
    ("log_messages", ht.EmptyList, ht.TListOf(ht.TString), None),
1618 197b323b Michael Hanselmann
    ("fail", False, ht.TBool, None),
1619 e58f87a9 Michael Hanselmann
    ]
1620 e58f87a9 Michael Hanselmann
1621 e58f87a9 Michael Hanselmann
1622 be760ba8 Michael Hanselmann
class OpTestDummy(OpCode):
1623 be760ba8 Michael Hanselmann
  """Utility opcode used by unittests.
1624 be760ba8 Michael Hanselmann

1625 be760ba8 Michael Hanselmann
  """
1626 65e183af Michael Hanselmann
  OP_PARAMS = [
1627 197b323b Michael Hanselmann
    ("result", ht.NoDefault, ht.NoType, None),
1628 197b323b Michael Hanselmann
    ("messages", ht.NoDefault, ht.NoType, None),
1629 197b323b Michael Hanselmann
    ("fail", ht.NoDefault, ht.NoType, None),
1630 6a373640 Michael Hanselmann
    ("submit_jobs", None, ht.NoType, None),
1631 be760ba8 Michael Hanselmann
    ]
1632 687c10d9 Iustin Pop
  WITH_LU = False
1633 be760ba8 Michael Hanselmann
1634 be760ba8 Michael Hanselmann
1635 dbc96028 Michael Hanselmann
def _GetOpList():
1636 dbc96028 Michael Hanselmann
  """Returns list of all defined opcodes.
1637 dbc96028 Michael Hanselmann

1638 dbc96028 Michael Hanselmann
  Does not eliminate duplicates by C{OP_ID}.
1639 dbc96028 Michael Hanselmann

1640 dbc96028 Michael Hanselmann
  """
1641 dbc96028 Michael Hanselmann
  return [v for v in globals().values()
1642 dbc96028 Michael Hanselmann
          if (isinstance(v, type) and issubclass(v, OpCode) and
1643 687c10d9 Iustin Pop
              hasattr(v, "OP_ID") and v is not OpCode)]
1644 dbc96028 Michael Hanselmann
1645 dbc96028 Michael Hanselmann
1646 dbc96028 Michael Hanselmann
OP_MAPPING = dict((v.OP_ID, v) for v in _GetOpList())