Statistics
| Branch: | Tag: | Revision:

root / lib / opcodes.py @ 406a9c91

History | View | Annotate | Download (51.8 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 93f2399e Andrea Spadaccini
_PIgnoreErrors = ("ignore_errors", ht.EmptyList,
141 93f2399e Andrea Spadaccini
                  ht.TListOf(ht.TElemOf(constants.CV_ALL_ECODES_STRINGS)),
142 93f2399e Andrea Spadaccini
                  "List of error codes that should be treated as warnings")
143 323f9095 Stephen Shirley
144 bc5d0215 Andrea Spadaccini
# Disk parameters
145 bc5d0215 Andrea Spadaccini
_PDiskParams = ("diskparams", None,
146 bc5d0215 Andrea Spadaccini
                ht.TOr(
147 bc5d0215 Andrea Spadaccini
                  ht.TDictOf(ht.TElemOf(constants.DISK_TEMPLATES), ht.TDict),
148 bc5d0215 Andrea Spadaccini
                  ht.TNone),
149 bc5d0215 Andrea Spadaccini
                "Disk templates' parameter defaults")
150 bc5d0215 Andrea Spadaccini
151 ff0d18e6 Iustin Pop
#: OP_ID conversion regular expression
152 ff0d18e6 Iustin Pop
_OPID_RE = re.compile("([a-z])([A-Z])")
153 ff0d18e6 Iustin Pop
154 8c9ee749 Michael Hanselmann
#: Utility function for L{OpClusterSetParams}
155 8c9ee749 Michael Hanselmann
_TestClusterOsList = ht.TOr(ht.TNone,
156 8c9ee749 Michael Hanselmann
  ht.TListOf(ht.TAnd(ht.TList, ht.TIsLength(2),
157 eb62069e Iustin Pop
    ht.TMap(ht.WithDesc("GetFirstItem")(compat.fst),
158 8c9ee749 Michael Hanselmann
            ht.TElemOf(constants.DDMS_VALUES)))))
159 8c9ee749 Michael Hanselmann
160 ff0d18e6 Iustin Pop
161 526a662a Michael Hanselmann
# TODO: Generate check from constants.INIC_PARAMS_TYPES
162 526a662a Michael Hanselmann
#: Utility function for testing NIC definitions
163 526a662a Michael Hanselmann
_TestNicDef = ht.TDictOf(ht.TElemOf(constants.INIC_PARAMS),
164 526a662a Michael Hanselmann
                         ht.TOr(ht.TNone, ht.TNonEmptyString))
165 526a662a Michael Hanselmann
166 1456df62 Michael Hanselmann
_TSetParamsResultItemItems = [
167 1456df62 Michael Hanselmann
  ht.Comment("name of changed parameter")(ht.TNonEmptyString),
168 b3d2ee31 Michael Hanselmann
  ht.Comment("new value")(ht.TAny),
169 1456df62 Michael Hanselmann
  ]
170 1456df62 Michael Hanselmann
171 1456df62 Michael Hanselmann
_TSetParamsResult = \
172 1456df62 Michael Hanselmann
  ht.TListOf(ht.TAnd(ht.TIsLength(len(_TSetParamsResultItemItems)),
173 1456df62 Michael Hanselmann
                     ht.TItems(_TSetParamsResultItemItems)))
174 1456df62 Michael Hanselmann
175 3ce9a5e7 Michael Hanselmann
_SUMMARY_PREFIX = {
176 3ce9a5e7 Michael Hanselmann
  "CLUSTER_": "C_",
177 3ce9a5e7 Michael Hanselmann
  "GROUP_": "G_",
178 3ce9a5e7 Michael Hanselmann
  "NODE_": "N_",
179 3ce9a5e7 Michael Hanselmann
  "INSTANCE_": "I_",
180 3ce9a5e7 Michael Hanselmann
  }
181 3ce9a5e7 Michael Hanselmann
182 b95479a5 Michael Hanselmann
#: Attribute name for dependencies
183 b95479a5 Michael Hanselmann
DEPEND_ATTR = "depends"
184 b95479a5 Michael Hanselmann
185 018ae30b Michael Hanselmann
#: Attribute name for comment
186 018ae30b Michael Hanselmann
COMMENT_ATTR = "comment"
187 018ae30b Michael Hanselmann
188 526a662a Michael Hanselmann
189 ff0d18e6 Iustin Pop
def _NameToId(name):
190 ff0d18e6 Iustin Pop
  """Convert an opcode class name to an OP_ID.
191 ff0d18e6 Iustin Pop

192 ff0d18e6 Iustin Pop
  @type name: string
193 ff0d18e6 Iustin Pop
  @param name: the class name, as OpXxxYyy
194 ff0d18e6 Iustin Pop
  @rtype: string
195 ff0d18e6 Iustin Pop
  @return: the name in the OP_XXXX_YYYY format
196 ff0d18e6 Iustin Pop

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

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

216 65e183af Michael Hanselmann
  @raise errors.OpPrereqError: when file storage is disabled
217 65e183af Michael Hanselmann

218 65e183af Michael Hanselmann
  """
219 65e183af Michael Hanselmann
  if not constants.ENABLE_FILE_STORAGE:
220 65e183af Michael Hanselmann
    raise errors.OpPrereqError("File storage disabled at configure time",
221 65e183af Michael Hanselmann
                               errors.ECODE_INVAL)
222 65e183af Michael Hanselmann
223 65e183af Michael Hanselmann
224 4b97f902 Apollon Oikonomopoulos
def RequireSharedFileStorage():
225 4b97f902 Apollon Oikonomopoulos
  """Checks that shared file storage is enabled.
226 4b97f902 Apollon Oikonomopoulos

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

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

232 4b97f902 Apollon Oikonomopoulos
  """
233 4b97f902 Apollon Oikonomopoulos
  if not constants.ENABLE_SHARED_FILE_STORAGE:
234 4b97f902 Apollon Oikonomopoulos
    raise errors.OpPrereqError("Shared file storage disabled at"
235 4b97f902 Apollon Oikonomopoulos
                               " configure time", errors.ECODE_INVAL)
236 4b97f902 Apollon Oikonomopoulos
237 4b97f902 Apollon Oikonomopoulos
238 8c9ee749 Michael Hanselmann
@ht.WithDesc("CheckFileStorage")
239 8c9ee749 Michael Hanselmann
def _CheckFileStorage(value):
240 8c9ee749 Michael Hanselmann
  """Ensures file storage is enabled if used.
241 65e183af Michael Hanselmann

242 65e183af Michael Hanselmann
  """
243 8c9ee749 Michael Hanselmann
  if value == constants.DT_FILE:
244 65e183af Michael Hanselmann
    RequireFileStorage()
245 4b97f902 Apollon Oikonomopoulos
  elif value == constants.DT_SHARED_FILE:
246 4b97f902 Apollon Oikonomopoulos
    RequireSharedFileStorage()
247 65e183af Michael Hanselmann
  return True
248 65e183af Michael Hanselmann
249 65e183af Michael Hanselmann
250 45fe090b Michael Hanselmann
def _BuildDiskTemplateCheck(accept_none):
251 45fe090b Michael Hanselmann
  """Builds check for disk template.
252 45fe090b Michael Hanselmann

253 45fe090b Michael Hanselmann
  @type accept_none: bool
254 45fe090b Michael Hanselmann
  @param accept_none: whether to accept None as a correct value
255 45fe090b Michael Hanselmann
  @rtype: callable
256 45fe090b Michael Hanselmann

257 45fe090b Michael Hanselmann
  """
258 45fe090b Michael Hanselmann
  template_check = ht.TElemOf(constants.DISK_TEMPLATES)
259 45fe090b Michael Hanselmann
260 45fe090b Michael Hanselmann
  if accept_none:
261 45fe090b Michael Hanselmann
    template_check = ht.TOr(template_check, ht.TNone)
262 45fe090b Michael Hanselmann
263 45fe090b Michael Hanselmann
  return ht.TAnd(template_check, _CheckFileStorage)
264 8c9ee749 Michael Hanselmann
265 8c9ee749 Michael Hanselmann
266 65e183af Michael Hanselmann
def _CheckStorageType(storage_type):
267 65e183af Michael Hanselmann
  """Ensure a given storage type is valid.
268 65e183af Michael Hanselmann

269 65e183af Michael Hanselmann
  """
270 65e183af Michael Hanselmann
  if storage_type not in constants.VALID_STORAGE_TYPES:
271 65e183af Michael Hanselmann
    raise errors.OpPrereqError("Unknown storage type: %s" % storage_type,
272 65e183af Michael Hanselmann
                               errors.ECODE_INVAL)
273 65e183af Michael Hanselmann
  if storage_type == constants.ST_FILE:
274 65e183af Michael Hanselmann
    RequireFileStorage()
275 65e183af Michael Hanselmann
  return True
276 65e183af Michael Hanselmann
277 65e183af Michael Hanselmann
278 65e183af Michael Hanselmann
#: Storage type parameter
279 45d4c81c Michael Hanselmann
_PStorageType = ("storage_type", ht.NoDefault, _CheckStorageType,
280 45d4c81c Michael Hanselmann
                 "Storage type")
281 65e183af Michael Hanselmann
282 65e183af Michael Hanselmann
283 65e183af Michael Hanselmann
class _AutoOpParamSlots(type):
284 65e183af Michael Hanselmann
  """Meta class for opcode definitions.
285 65e183af Michael Hanselmann

286 65e183af Michael Hanselmann
  """
287 65e183af Michael Hanselmann
  def __new__(mcs, name, bases, attrs):
288 65e183af Michael Hanselmann
    """Called when a class should be created.
289 65e183af Michael Hanselmann

290 65e183af Michael Hanselmann
    @param mcs: The meta class
291 65e183af Michael Hanselmann
    @param name: Name of created class
292 65e183af Michael Hanselmann
    @param bases: Base classes
293 65e183af Michael Hanselmann
    @type attrs: dict
294 65e183af Michael Hanselmann
    @param attrs: Class attributes
295 65e183af Michael Hanselmann

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

320 0e46916d Iustin Pop
  This object serves as a parent class for OpCode without any custom
321 0e46916d Iustin Pop
  field handling.
322 0e46916d Iustin Pop

323 df458e0b Iustin Pop
  """
324 b459a848 Andrea Spadaccini
  # pylint: disable=E1101
325 e89a9021 Iustin Pop
  # as OP_ID is dynamically defined
326 65e183af Michael Hanselmann
  __metaclass__ = _AutoOpParamSlots
327 65e183af Michael Hanselmann
328 a8083063 Iustin Pop
  def __init__(self, **kwargs):
329 a7399f66 Iustin Pop
    """Constructor for BaseOpCode.
330 a7399f66 Iustin Pop

331 a7399f66 Iustin Pop
    The constructor takes only keyword arguments and will set
332 a7399f66 Iustin Pop
    attributes on this object based on the passed arguments. As such,
333 a7399f66 Iustin Pop
    it means that you should not pass arguments which are not in the
334 a7399f66 Iustin Pop
    __slots__ attribute for this class.
335 a7399f66 Iustin Pop

336 a7399f66 Iustin Pop
    """
337 adf385c7 Iustin Pop
    slots = self._all_slots()
338 a8083063 Iustin Pop
    for key in kwargs:
339 adf385c7 Iustin Pop
      if key not in slots:
340 df458e0b Iustin Pop
        raise TypeError("Object %s doesn't support the parameter '%s'" %
341 3ecf6786 Iustin Pop
                        (self.__class__.__name__, key))
342 a8083063 Iustin Pop
      setattr(self, key, kwargs[key])
343 a8083063 Iustin Pop
344 df458e0b Iustin Pop
  def __getstate__(self):
345 a7399f66 Iustin Pop
    """Generic serializer.
346 a7399f66 Iustin Pop

347 a7399f66 Iustin Pop
    This method just returns the contents of the instance as a
348 a7399f66 Iustin Pop
    dictionary.
349 a7399f66 Iustin Pop

350 a7399f66 Iustin Pop
    @rtype:  C{dict}
351 a7399f66 Iustin Pop
    @return: the instance attributes and their values
352 a7399f66 Iustin Pop

353 a7399f66 Iustin Pop
    """
354 df458e0b Iustin Pop
    state = {}
355 adf385c7 Iustin Pop
    for name in self._all_slots():
356 df458e0b Iustin Pop
      if hasattr(self, name):
357 df458e0b Iustin Pop
        state[name] = getattr(self, name)
358 df458e0b Iustin Pop
    return state
359 df458e0b Iustin Pop
360 df458e0b Iustin Pop
  def __setstate__(self, state):
361 a7399f66 Iustin Pop
    """Generic unserializer.
362 a7399f66 Iustin Pop

363 a7399f66 Iustin Pop
    This method just restores from the serialized state the attributes
364 a7399f66 Iustin Pop
    of the current instance.
365 a7399f66 Iustin Pop

366 a7399f66 Iustin Pop
    @param state: the serialized opcode data
367 a7399f66 Iustin Pop
    @type state:  C{dict}
368 a7399f66 Iustin Pop

369 a7399f66 Iustin Pop
    """
370 df458e0b Iustin Pop
    if not isinstance(state, dict):
371 df458e0b Iustin Pop
      raise ValueError("Invalid data to __setstate__: expected dict, got %s" %
372 df458e0b Iustin Pop
                       type(state))
373 df458e0b Iustin Pop
374 adf385c7 Iustin Pop
    for name in self._all_slots():
375 44db3a6f Iustin Pop
      if name not in state and hasattr(self, name):
376 df458e0b Iustin Pop
        delattr(self, name)
377 df458e0b Iustin Pop
378 df458e0b Iustin Pop
    for name in state:
379 df458e0b Iustin Pop
      setattr(self, name, state[name])
380 df458e0b Iustin Pop
381 adf385c7 Iustin Pop
  @classmethod
382 adf385c7 Iustin Pop
  def _all_slots(cls):
383 adf385c7 Iustin Pop
    """Compute the list of all declared slots for a class.
384 adf385c7 Iustin Pop

385 adf385c7 Iustin Pop
    """
386 adf385c7 Iustin Pop
    slots = []
387 adf385c7 Iustin Pop
    for parent in cls.__mro__:
388 adf385c7 Iustin Pop
      slots.extend(getattr(parent, "__slots__", []))
389 adf385c7 Iustin Pop
    return slots
390 adf385c7 Iustin Pop
391 65e183af Michael Hanselmann
  @classmethod
392 65e183af Michael Hanselmann
  def GetAllParams(cls):
393 65e183af Michael Hanselmann
    """Compute list of all parameters for an opcode.
394 65e183af Michael Hanselmann

395 65e183af Michael Hanselmann
    """
396 65e183af Michael Hanselmann
    slots = []
397 65e183af Michael Hanselmann
    for parent in cls.__mro__:
398 65e183af Michael Hanselmann
      slots.extend(getattr(parent, "OP_PARAMS", []))
399 65e183af Michael Hanselmann
    return slots
400 65e183af Michael Hanselmann
401 1cbef6d8 Michael Hanselmann
  def Validate(self, set_defaults):
402 1cbef6d8 Michael Hanselmann
    """Validate opcode parameters, optionally setting default values.
403 1cbef6d8 Michael Hanselmann

404 1cbef6d8 Michael Hanselmann
    @type set_defaults: bool
405 1cbef6d8 Michael Hanselmann
    @param set_defaults: Whether to set default values
406 1cbef6d8 Michael Hanselmann
    @raise errors.OpPrereqError: When a parameter value doesn't match
407 1cbef6d8 Michael Hanselmann
                                 requirements
408 1cbef6d8 Michael Hanselmann

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

442 b247c6fc Michael Hanselmann
  @type relative: bool
443 b247c6fc Michael Hanselmann
  @param relative: Whether to accept relative job IDs (negative)
444 b247c6fc Michael Hanselmann
  @rtype: callable
445 b247c6fc Michael Hanselmann

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

480 a7399f66 Iustin Pop
  This is the root of the actual OpCode hierarchy. All clases derived
481 a7399f66 Iustin Pop
  from this class should override OP_ID.
482 a7399f66 Iustin Pop

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

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

517 a7399f66 Iustin Pop
    This method adds to the state dictionary the OP_ID of the class,
518 a7399f66 Iustin Pop
    so that on unload we can identify the correct class for
519 a7399f66 Iustin Pop
    instantiating the opcode.
520 a7399f66 Iustin Pop

521 a7399f66 Iustin Pop
    @rtype:   C{dict}
522 a7399f66 Iustin Pop
    @return:  the state as a dictionary
523 a7399f66 Iustin Pop

524 df458e0b Iustin Pop
    """
525 0e46916d Iustin Pop
    data = BaseOpCode.__getstate__(self)
526 df458e0b Iustin Pop
    data["OP_ID"] = self.OP_ID
527 df458e0b Iustin Pop
    return data
528 df458e0b Iustin Pop
529 df458e0b Iustin Pop
  @classmethod
530 00abdc96 Iustin Pop
  def LoadOpCode(cls, data):
531 df458e0b Iustin Pop
    """Generic load opcode method.
532 df458e0b Iustin Pop

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

537 a7399f66 Iustin Pop
    @type data:  C{dict}
538 a7399f66 Iustin Pop
    @param data: the serialized opcode
539 a7399f66 Iustin Pop

540 df458e0b Iustin Pop
    """
541 df458e0b Iustin Pop
    if not isinstance(data, dict):
542 df458e0b Iustin Pop
      raise ValueError("Invalid data to LoadOpCode (%s)" % type(data))
543 df458e0b Iustin Pop
    if "OP_ID" not in data:
544 df458e0b Iustin Pop
      raise ValueError("Invalid data to LoadOpcode, missing OP_ID")
545 df458e0b Iustin Pop
    op_id = data["OP_ID"]
546 df458e0b Iustin Pop
    op_class = None
547 363acb1e Iustin Pop
    if op_id in OP_MAPPING:
548 363acb1e Iustin Pop
      op_class = OP_MAPPING[op_id]
549 363acb1e Iustin Pop
    else:
550 df458e0b Iustin Pop
      raise ValueError("Invalid data to LoadOpCode: OP_ID %s unsupported" %
551 df458e0b Iustin Pop
                       op_id)
552 df458e0b Iustin Pop
    op = op_class()
553 df458e0b Iustin Pop
    new_data = data.copy()
554 df458e0b Iustin Pop
    del new_data["OP_ID"]
555 df458e0b Iustin Pop
    op.__setstate__(new_data)
556 df458e0b Iustin Pop
    return op
557 df458e0b Iustin Pop
558 60dd1473 Iustin Pop
  def Summary(self):
559 60dd1473 Iustin Pop
    """Generates a summary description of this opcode.
560 60dd1473 Iustin Pop

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

567 60dd1473 Iustin Pop
    """
568 ff0d18e6 Iustin Pop
    assert self.OP_ID is not None and len(self.OP_ID) > 3
569 60dd1473 Iustin Pop
    # all OP_ID start with OP_, we remove that
570 60dd1473 Iustin Pop
    txt = self.OP_ID[3:]
571 60dd1473 Iustin Pop
    field_name = getattr(self, "OP_DSC_FIELD", None)
572 60dd1473 Iustin Pop
    if field_name:
573 60dd1473 Iustin Pop
      field_value = getattr(self, field_name, None)
574 bc8bbda1 Iustin Pop
      if isinstance(field_value, (list, tuple)):
575 bc8bbda1 Iustin Pop
        field_value = ",".join(str(i) for i in field_value)
576 60dd1473 Iustin Pop
      txt = "%s(%s)" % (txt, field_value)
577 60dd1473 Iustin Pop
    return txt
578 60dd1473 Iustin Pop
579 3ce9a5e7 Michael Hanselmann
  def TinySummary(self):
580 3ce9a5e7 Michael Hanselmann
    """Generates a compact summary description of the opcode.
581 3ce9a5e7 Michael Hanselmann

582 3ce9a5e7 Michael Hanselmann
    """
583 3ce9a5e7 Michael Hanselmann
    assert self.OP_ID.startswith("OP_")
584 3ce9a5e7 Michael Hanselmann
585 3ce9a5e7 Michael Hanselmann
    text = self.OP_ID[3:]
586 3ce9a5e7 Michael Hanselmann
587 3ce9a5e7 Michael Hanselmann
    for (prefix, supplement) in _SUMMARY_PREFIX.items():
588 3ce9a5e7 Michael Hanselmann
      if text.startswith(prefix):
589 3ce9a5e7 Michael Hanselmann
        return supplement + text[len(prefix):]
590 3ce9a5e7 Michael Hanselmann
591 3ce9a5e7 Michael Hanselmann
    return text
592 3ce9a5e7 Michael Hanselmann
593 a8083063 Iustin Pop
594 afee0879 Iustin Pop
# cluster opcodes
595 afee0879 Iustin Pop
596 bc84ffa7 Iustin Pop
class OpClusterPostInit(OpCode):
597 b5f5fae9 Luca Bigliardi
  """Post cluster initialization.
598 b5f5fae9 Luca Bigliardi

599 b5f5fae9 Luca Bigliardi
  This opcode does not touch the cluster at all. Its purpose is to run hooks
600 b5f5fae9 Luca Bigliardi
  after the cluster has been initialized.
601 b5f5fae9 Luca Bigliardi

602 b5f5fae9 Luca Bigliardi
  """
603 b5f5fae9 Luca Bigliardi
604 b5f5fae9 Luca Bigliardi
605 c6d43e9e Iustin Pop
class OpClusterDestroy(OpCode):
606 a7399f66 Iustin Pop
  """Destroy the cluster.
607 a7399f66 Iustin Pop

608 a7399f66 Iustin Pop
  This opcode has no other parameters. All the state is irreversibly
609 a7399f66 Iustin Pop
  lost after the execution of this opcode.
610 a7399f66 Iustin Pop

611 a7399f66 Iustin Pop
  """
612 a8083063 Iustin Pop
613 a8083063 Iustin Pop
614 a2f7ab92 Iustin Pop
class OpClusterQuery(OpCode):
615 fdc267f4 Iustin Pop
  """Query cluster information."""
616 a8083063 Iustin Pop
617 a8083063 Iustin Pop
618 fcad7225 Michael Hanselmann
class OpClusterVerify(OpCode):
619 fcad7225 Michael Hanselmann
  """Submits all jobs necessary to verify the cluster.
620 fcad7225 Michael Hanselmann

621 fcad7225 Michael Hanselmann
  """
622 fcad7225 Michael Hanselmann
  OP_PARAMS = [
623 fcad7225 Michael Hanselmann
    _PDebugSimulateErrors,
624 fcad7225 Michael Hanselmann
    _PErrorCodes,
625 fcad7225 Michael Hanselmann
    _PSkipChecks,
626 93f2399e Andrea Spadaccini
    _PIgnoreErrors,
627 fcad7225 Michael Hanselmann
    _PVerbose,
628 fcad7225 Michael Hanselmann
    ("group_name", None, ht.TMaybeString, "Group to verify")
629 fcad7225 Michael Hanselmann
    ]
630 f7686867 Michael Hanselmann
  OP_RESULT = TJobIdListOnly
631 fcad7225 Michael Hanselmann
632 fcad7225 Michael Hanselmann
633 bf93ae69 Adeodato Simo
class OpClusterVerifyConfig(OpCode):
634 bf93ae69 Adeodato Simo
  """Verify the cluster config.
635 bf93ae69 Adeodato Simo

636 bf93ae69 Adeodato Simo
  """
637 bf93ae69 Adeodato Simo
  OP_PARAMS = [
638 57106b74 Michael Hanselmann
    _PDebugSimulateErrors,
639 57106b74 Michael Hanselmann
    _PErrorCodes,
640 93f2399e Andrea Spadaccini
    _PIgnoreErrors,
641 57106b74 Michael Hanselmann
    _PVerbose,
642 bf93ae69 Adeodato Simo
    ]
643 f7686867 Michael Hanselmann
  OP_RESULT = ht.TBool
644 bf93ae69 Adeodato Simo
645 bf93ae69 Adeodato Simo
646 bf93ae69 Adeodato Simo
class OpClusterVerifyGroup(OpCode):
647 bf93ae69 Adeodato Simo
  """Run verify on a node group from the cluster.
648 a7399f66 Iustin Pop

649 a7399f66 Iustin Pop
  @type skip_checks: C{list}
650 a7399f66 Iustin Pop
  @ivar skip_checks: steps to be skipped from the verify process; this
651 a7399f66 Iustin Pop
                     needs to be a subset of
652 a7399f66 Iustin Pop
                     L{constants.VERIFY_OPTIONAL_CHECKS}; currently
653 a7399f66 Iustin Pop
                     only L{constants.VERIFY_NPLUSONE_MEM} can be passed
654 a7399f66 Iustin Pop

655 a7399f66 Iustin Pop
  """
656 bf93ae69 Adeodato Simo
  OP_DSC_FIELD = "group_name"
657 65e183af Michael Hanselmann
  OP_PARAMS = [
658 57106b74 Michael Hanselmann
    _PGroupName,
659 57106b74 Michael Hanselmann
    _PDebugSimulateErrors,
660 57106b74 Michael Hanselmann
    _PErrorCodes,
661 57106b74 Michael Hanselmann
    _PSkipChecks,
662 93f2399e Andrea Spadaccini
    _PIgnoreErrors,
663 57106b74 Michael Hanselmann
    _PVerbose,
664 65e183af Michael Hanselmann
    ]
665 f7686867 Michael Hanselmann
  OP_RESULT = ht.TBool
666 a8083063 Iustin Pop
667 a8083063 Iustin Pop
668 bd8210a7 Iustin Pop
class OpClusterVerifyDisks(OpCode):
669 150e978f Iustin Pop
  """Verify the cluster disks.
670 150e978f Iustin Pop

671 ae1a845c Michael Hanselmann
  """
672 f7686867 Michael Hanselmann
  OP_RESULT = TJobIdListOnly
673 ae1a845c Michael Hanselmann
674 ae1a845c Michael Hanselmann
675 ae1a845c Michael Hanselmann
class OpGroupVerifyDisks(OpCode):
676 ae1a845c Michael Hanselmann
  """Verifies the status of all disks in a node group.
677 150e978f Iustin Pop

678 ae1a845c Michael Hanselmann
  Result: a tuple of three elements:
679 ae1a845c Michael Hanselmann
    - dict of node names with issues (values: error msg)
680 150e978f Iustin Pop
    - list of instances with degraded disks (that should be activated)
681 b63ed789 Iustin Pop
    - dict of instances with missing logical volumes (values: (node, vol)
682 b63ed789 Iustin Pop
      pairs with details about the missing volumes)
683 150e978f Iustin Pop

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

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

692 150e978f Iustin Pop
  """
693 ae1a845c Michael Hanselmann
  OP_DSC_FIELD = "group_name"
694 ae1a845c Michael Hanselmann
  OP_PARAMS = [
695 ae1a845c Michael Hanselmann
    _PGroupName,
696 ae1a845c Michael Hanselmann
    ]
697 1ce03fb1 Michael Hanselmann
  OP_RESULT = \
698 1ce03fb1 Michael Hanselmann
    ht.TAnd(ht.TIsLength(3),
699 1ce03fb1 Michael Hanselmann
            ht.TItems([ht.TDictOf(ht.TString, ht.TString),
700 1ce03fb1 Michael Hanselmann
                       ht.TListOf(ht.TString),
701 6973587f Michael Hanselmann
                       ht.TDictOf(ht.TString,
702 6973587f Michael Hanselmann
                                  ht.TListOf(ht.TListOf(ht.TString)))]))
703 150e978f Iustin Pop
704 150e978f Iustin Pop
705 5d01aca3 Iustin Pop
class OpClusterRepairDiskSizes(OpCode):
706 60975797 Iustin Pop
  """Verify the disk sizes of the instances and fixes configuration
707 60975797 Iustin Pop
  mimatches.
708 60975797 Iustin Pop

709 60975797 Iustin Pop
  Parameters: optional instances list, in case we want to restrict the
710 60975797 Iustin Pop
  checks to only a subset of the instances.
711 60975797 Iustin Pop

712 60975797 Iustin Pop
  Result: a list of tuples, (instance, disk, new-size) for changed
713 60975797 Iustin Pop
  configurations.
714 60975797 Iustin Pop

715 60975797 Iustin Pop
  In normal operation, the list should be empty.
716 60975797 Iustin Pop

717 60975797 Iustin Pop
  @type instances: list
718 60975797 Iustin Pop
  @ivar instances: the list of instances to check, or empty for all instances
719 60975797 Iustin Pop

720 60975797 Iustin Pop
  """
721 65e183af Michael Hanselmann
  OP_PARAMS = [
722 197b323b Michael Hanselmann
    ("instances", ht.EmptyList, ht.TListOf(ht.TNonEmptyString), None),
723 65e183af Michael Hanselmann
    ]
724 60975797 Iustin Pop
725 60975797 Iustin Pop
726 2f093ea0 Iustin Pop
class OpClusterConfigQuery(OpCode):
727 ae5849b5 Michael Hanselmann
  """Query cluster configuration values."""
728 65e183af Michael Hanselmann
  OP_PARAMS = [
729 65e183af Michael Hanselmann
    _POutputFields
730 65e183af Michael Hanselmann
    ]
731 a8083063 Iustin Pop
732 a8083063 Iustin Pop
733 e126df25 Iustin Pop
class OpClusterRename(OpCode):
734 a7399f66 Iustin Pop
  """Rename the cluster.
735 a7399f66 Iustin Pop

736 a7399f66 Iustin Pop
  @type name: C{str}
737 a7399f66 Iustin Pop
  @ivar name: The new name of the cluster. The name and/or the master IP
738 a7399f66 Iustin Pop
              address will be changed to match the new name and its IP
739 a7399f66 Iustin Pop
              address.
740 a7399f66 Iustin Pop

741 a7399f66 Iustin Pop
  """
742 60dd1473 Iustin Pop
  OP_DSC_FIELD = "name"
743 65e183af Michael Hanselmann
  OP_PARAMS = [
744 197b323b Michael Hanselmann
    ("name", ht.NoDefault, ht.TNonEmptyString, None),
745 65e183af Michael Hanselmann
    ]
746 07bd8a51 Iustin Pop
747 07bd8a51 Iustin Pop
748 a6682fdc Iustin Pop
class OpClusterSetParams(OpCode):
749 a7399f66 Iustin Pop
  """Change the parameters of the cluster.
750 a7399f66 Iustin Pop

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

754 a7399f66 Iustin Pop
  """
755 65e183af Michael Hanselmann
  OP_PARAMS = [
756 45d4c81c Michael Hanselmann
    ("vg_name", None, ht.TMaybeString, "Volume group name"),
757 65e183af Michael Hanselmann
    ("enabled_hypervisors", None,
758 65e183af Michael Hanselmann
     ht.TOr(ht.TAnd(ht.TListOf(ht.TElemOf(constants.HYPER_TYPES)), ht.TTrue),
759 45d4c81c Michael Hanselmann
            ht.TNone),
760 45d4c81c Michael Hanselmann
     "List of enabled hypervisors"),
761 65e183af Michael Hanselmann
    ("hvparams", None, ht.TOr(ht.TDictOf(ht.TNonEmptyString, ht.TDict),
762 45d4c81c Michael Hanselmann
                              ht.TNone),
763 45d4c81c Michael Hanselmann
     "Cluster-wide hypervisor parameter defaults, hypervisor-dependent"),
764 45d4c81c Michael Hanselmann
    ("beparams", None, ht.TOr(ht.TDict, ht.TNone),
765 45d4c81c Michael Hanselmann
     "Cluster-wide backend parameter defaults"),
766 65e183af Michael Hanselmann
    ("os_hvp", None, ht.TOr(ht.TDictOf(ht.TNonEmptyString, ht.TDict),
767 45d4c81c Michael Hanselmann
                            ht.TNone),
768 45d4c81c Michael Hanselmann
     "Cluster-wide per-OS hypervisor parameter defaults"),
769 65e183af Michael Hanselmann
    ("osparams", None, ht.TOr(ht.TDictOf(ht.TNonEmptyString, ht.TDict),
770 45d4c81c Michael Hanselmann
                              ht.TNone),
771 45d4c81c Michael Hanselmann
     "Cluster-wide OS parameter defaults"),
772 bc5d0215 Andrea Spadaccini
    _PDiskParams,
773 197b323b Michael Hanselmann
    ("candidate_pool_size", None, ht.TOr(ht.TStrictPositiveInt, ht.TNone),
774 45d4c81c Michael Hanselmann
     "Master candidate pool size"),
775 45d4c81c Michael Hanselmann
    ("uid_pool", None, ht.NoType,
776 45d4c81c Michael Hanselmann
     "Set UID pool, must be list of lists describing UID ranges (two items,"
777 45d4c81c Michael Hanselmann
     " start and end inclusive)"),
778 45d4c81c Michael Hanselmann
    ("add_uids", None, ht.NoType,
779 45d4c81c Michael Hanselmann
     "Extend UID pool, must be list of lists describing UID ranges (two"
780 45d4c81c Michael Hanselmann
     " items, start and end inclusive) to be added"),
781 45d4c81c Michael Hanselmann
    ("remove_uids", None, ht.NoType,
782 45d4c81c Michael Hanselmann
     "Shrink UID pool, must be list of lists describing UID ranges (two"
783 45d4c81c Michael Hanselmann
     " items, start and end inclusive) to be removed"),
784 45d4c81c Michael Hanselmann
    ("maintain_node_health", None, ht.TMaybeBool,
785 45d4c81c Michael Hanselmann
     "Whether to automatically maintain node health"),
786 45d4c81c Michael Hanselmann
    ("prealloc_wipe_disks", None, ht.TMaybeBool,
787 45d4c81c Michael Hanselmann
     "Whether to wipe disks before allocating them to instances"),
788 45d4c81c Michael Hanselmann
    ("nicparams", None, ht.TMaybeDict, "Cluster-wide NIC parameter defaults"),
789 45d4c81c Michael Hanselmann
    ("ndparams", None, ht.TMaybeDict, "Cluster-wide node parameter defaults"),
790 45d4c81c Michael Hanselmann
    ("drbd_helper", None, ht.TOr(ht.TString, ht.TNone), "DRBD helper program"),
791 45d4c81c Michael Hanselmann
    ("default_iallocator", None, ht.TOr(ht.TString, ht.TNone),
792 45d4c81c Michael Hanselmann
     "Default iallocator for cluster"),
793 45d4c81c Michael Hanselmann
    ("master_netdev", None, ht.TOr(ht.TString, ht.TNone),
794 45d4c81c Michael Hanselmann
     "Master network device"),
795 5a8648eb Andrea Spadaccini
    ("master_netmask", None, ht.TOr(ht.TInt, ht.TNone),
796 5a8648eb Andrea Spadaccini
     "Netmask of the master IP"),
797 45d4c81c Michael Hanselmann
    ("reserved_lvs", None, ht.TOr(ht.TListOf(ht.TNonEmptyString), ht.TNone),
798 45d4c81c Michael Hanselmann
     "List of reserved LVs"),
799 45d4c81c Michael Hanselmann
    ("hidden_os", None, _TestClusterOsList,
800 45d4c81c Michael Hanselmann
     "Modify list of hidden operating systems. Each modification must have"
801 45d4c81c Michael Hanselmann
     " two items, the operation and the OS name. The operation can be"
802 45d4c81c Michael Hanselmann
     " ``%s`` or ``%s``." % (constants.DDM_ADD, constants.DDM_REMOVE)),
803 45d4c81c Michael Hanselmann
    ("blacklisted_os", None, _TestClusterOsList,
804 45d4c81c Michael Hanselmann
     "Modify list of blacklisted operating systems. Each modification must have"
805 45d4c81c Michael Hanselmann
     " two items, the operation and the OS name. The operation can be"
806 45d4c81c Michael Hanselmann
     " ``%s`` or ``%s``." % (constants.DDM_ADD, constants.DDM_REMOVE)),
807 bf689b7a Andrea Spadaccini
    ("use_external_mip_script", None, ht.TMaybeBool,
808 bf689b7a Andrea Spadaccini
     "Whether to use an external master IP address setup script"),
809 4b7735f9 Iustin Pop
    ]
810 12515db7 Manuel Franceschini
811 12515db7 Manuel Franceschini
812 d1240007 Iustin Pop
class OpClusterRedistConf(OpCode):
813 afee0879 Iustin Pop
  """Force a full push of the cluster configuration.
814 afee0879 Iustin Pop

815 afee0879 Iustin Pop
  """
816 afee0879 Iustin Pop
817 83f72637 Michael Hanselmann
818 fb926117 Andrea Spadaccini
class OpClusterActivateMasterIp(OpCode):
819 fb926117 Andrea Spadaccini
  """Activate the master IP on the master node.
820 fb926117 Andrea Spadaccini

821 fb926117 Andrea Spadaccini
  """
822 fb926117 Andrea Spadaccini
823 fb926117 Andrea Spadaccini
824 fb926117 Andrea Spadaccini
class OpClusterDeactivateMasterIp(OpCode):
825 fb926117 Andrea Spadaccini
  """Deactivate the master IP on the master node.
826 fb926117 Andrea Spadaccini

827 fb926117 Andrea Spadaccini
  """
828 fb926117 Andrea Spadaccini
829 fb926117 Andrea Spadaccini
830 83f72637 Michael Hanselmann
class OpQuery(OpCode):
831 83f72637 Michael Hanselmann
  """Query for resources/items.
832 83f72637 Michael Hanselmann

833 abd66bf8 Michael Hanselmann
  @ivar what: Resources to query for, must be one of L{constants.QR_VIA_OP}
834 83f72637 Michael Hanselmann
  @ivar fields: List of fields to retrieve
835 2e5c33db Iustin Pop
  @ivar qfilter: Query filter
836 83f72637 Michael Hanselmann

837 83f72637 Michael Hanselmann
  """
838 e50d8412 Michael Hanselmann
  OP_DSC_FIELD = "what"
839 65e183af Michael Hanselmann
  OP_PARAMS = [
840 8e7078e0 Michael Hanselmann
    _PQueryWhat,
841 ee13764f Michael Hanselmann
    _PUseLocking,
842 45d4c81c Michael Hanselmann
    ("fields", ht.NoDefault, ht.TListOf(ht.TNonEmptyString),
843 45d4c81c Michael Hanselmann
     "Requested fields"),
844 2e5c33db Iustin Pop
    ("qfilter", None, ht.TOr(ht.TNone, ht.TListOf),
845 45d4c81c Michael Hanselmann
     "Query filter"),
846 83f72637 Michael Hanselmann
    ]
847 83f72637 Michael Hanselmann
848 83f72637 Michael Hanselmann
849 83f72637 Michael Hanselmann
class OpQueryFields(OpCode):
850 83f72637 Michael Hanselmann
  """Query for available resource/item fields.
851 83f72637 Michael Hanselmann

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

855 83f72637 Michael Hanselmann
  """
856 e50d8412 Michael Hanselmann
  OP_DSC_FIELD = "what"
857 65e183af Michael Hanselmann
  OP_PARAMS = [
858 8e7078e0 Michael Hanselmann
    _PQueryWhat,
859 8e7078e0 Michael Hanselmann
    ("fields", None, ht.TOr(ht.TNone, ht.TListOf(ht.TNonEmptyString)),
860 8e7078e0 Michael Hanselmann
     "Requested fields; if not given, all are returned"),
861 83f72637 Michael Hanselmann
    ]
862 83f72637 Michael Hanselmann
863 83f72637 Michael Hanselmann
864 792af3ad René Nussbaumer
class OpOobCommand(OpCode):
865 eb64da59 René Nussbaumer
  """Interact with OOB."""
866 65e183af Michael Hanselmann
  OP_PARAMS = [
867 c4ec0755 René Nussbaumer
    ("node_names", ht.EmptyList, ht.TListOf(ht.TNonEmptyString),
868 c4ec0755 René Nussbaumer
     "List of nodes to run the OOB command against"),
869 c4ec0755 René Nussbaumer
    ("command", None, ht.TElemOf(constants.OOB_COMMANDS),
870 c4ec0755 René Nussbaumer
     "OOB command to be run"),
871 c4ec0755 René Nussbaumer
    ("timeout", constants.OOB_TIMEOUT, ht.TInt,
872 c4ec0755 René Nussbaumer
     "Timeout before the OOB helper will be terminated"),
873 c4ec0755 René Nussbaumer
    ("ignore_status", False, ht.TBool,
874 c4ec0755 René Nussbaumer
     "Ignores the node offline status for power off"),
875 beff3779 René Nussbaumer
    ("power_delay", constants.OOB_POWER_DELAY, ht.TPositiveFloat,
876 beff3779 René Nussbaumer
     "Time in seconds to wait between powering on nodes"),
877 eb64da59 René Nussbaumer
    ]
878 eb64da59 René Nussbaumer
879 eb64da59 René Nussbaumer
880 07bd8a51 Iustin Pop
# node opcodes
881 07bd8a51 Iustin Pop
882 73d565a3 Iustin Pop
class OpNodeRemove(OpCode):
883 a7399f66 Iustin Pop
  """Remove a node.
884 a7399f66 Iustin Pop

885 a7399f66 Iustin Pop
  @type node_name: C{str}
886 a7399f66 Iustin Pop
  @ivar node_name: The name of the node to remove. If the node still has
887 a7399f66 Iustin Pop
                   instances on it, the operation will fail.
888 a7399f66 Iustin Pop

889 a7399f66 Iustin Pop
  """
890 60dd1473 Iustin Pop
  OP_DSC_FIELD = "node_name"
891 65e183af Michael Hanselmann
  OP_PARAMS = [
892 65e183af Michael Hanselmann
    _PNodeName,
893 65e183af Michael Hanselmann
    ]
894 a8083063 Iustin Pop
895 a8083063 Iustin Pop
896 d817d49f Iustin Pop
class OpNodeAdd(OpCode):
897 a7399f66 Iustin Pop
  """Add a node to the cluster.
898 a7399f66 Iustin Pop

899 a7399f66 Iustin Pop
  @type node_name: C{str}
900 a7399f66 Iustin Pop
  @ivar node_name: The name of the node to add. This can be a short name,
901 a7399f66 Iustin Pop
                   but it will be expanded to the FQDN.
902 a7399f66 Iustin Pop
  @type primary_ip: IP address
903 a7399f66 Iustin Pop
  @ivar primary_ip: The primary IP of the node. This will be ignored when the
904 a7399f66 Iustin Pop
                    opcode is submitted, but will be filled during the node
905 a7399f66 Iustin Pop
                    add (so it will be visible in the job query).
906 a7399f66 Iustin Pop
  @type secondary_ip: IP address
907 a7399f66 Iustin Pop
  @ivar secondary_ip: The secondary IP of the node. This needs to be passed
908 a7399f66 Iustin Pop
                      if the cluster has been initialized in 'dual-network'
909 a7399f66 Iustin Pop
                      mode, otherwise it must not be given.
910 a7399f66 Iustin Pop
  @type readd: C{bool}
911 a7399f66 Iustin Pop
  @ivar readd: Whether to re-add an existing node to the cluster. If
912 a7399f66 Iustin Pop
               this is not passed, then the operation will abort if the node
913 a7399f66 Iustin Pop
               name is already in the cluster; use this parameter to 'repair'
914 a7399f66 Iustin Pop
               a node that had its configuration broken, or was reinstalled
915 a7399f66 Iustin Pop
               without removal from the cluster.
916 f936c153 Iustin Pop
  @type group: C{str}
917 f936c153 Iustin Pop
  @ivar group: The node group to which this node will belong.
918 fd3d37b6 Iustin Pop
  @type vm_capable: C{bool}
919 fd3d37b6 Iustin Pop
  @ivar vm_capable: The vm_capable node attribute
920 fd3d37b6 Iustin Pop
  @type master_capable: C{bool}
921 fd3d37b6 Iustin Pop
  @ivar master_capable: The master_capable node attribute
922 a7399f66 Iustin Pop

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

1058 9bf56d77 Michael Hanselmann
  @ivar instance_name: Instance name
1059 9bf56d77 Michael Hanselmann
  @ivar mode: Instance creation mode (one of L{constants.INSTANCE_CREATE_MODES})
1060 9bf56d77 Michael Hanselmann
  @ivar source_handshake: Signed handshake from source (remote import only)
1061 9bf56d77 Michael Hanselmann
  @ivar source_x509_ca: Source X509 CA in PEM format (remote import only)
1062 9bf56d77 Michael Hanselmann
  @ivar source_instance_name: Previous name of instance (remote import only)
1063 dae91d02 Michael Hanselmann
  @ivar source_shutdown_timeout: Shutdown timeout used for source instance
1064 dae91d02 Michael Hanselmann
    (remote import only)
1065 9bf56d77 Michael Hanselmann

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

1235 53c776b5 Iustin Pop
  This migrates (without shutting down an instance) to its secondary
1236 53c776b5 Iustin Pop
  node.
1237 53c776b5 Iustin Pop

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

1241 53c776b5 Iustin Pop
  """
1242 ee69c97f Iustin Pop
  OP_DSC_FIELD = "instance_name"
1243 65e183af Michael Hanselmann
  OP_PARAMS = [
1244 65e183af Michael Hanselmann
    _PInstanceName,
1245 65e183af Michael Hanselmann
    _PMigrationMode,
1246 65e183af Michael Hanselmann
    _PMigrationLive,
1247 f8fa4175 Michael Hanselmann
    _PMigrationTargetNode,
1248 45d4c81c Michael Hanselmann
    ("cleanup", False, ht.TBool,
1249 45d4c81c Michael Hanselmann
     "Whether a previously failed migration should be cleaned up"),
1250 8eb34306 Apollon Oikonomopoulos
    ("iallocator", None, ht.TMaybeString,
1251 8eb34306 Apollon Oikonomopoulos
     "Iallocator for deciding the target node for shared-storage instances"),
1252 d5cafd31 René Nussbaumer
    ("allow_failover", False, ht.TBool,
1253 d5cafd31 René Nussbaumer
     "Whether we can fallback to failover if migration is not possible"),
1254 65e183af Michael Hanselmann
    ]
1255 53c776b5 Iustin Pop
1256 53c776b5 Iustin Pop
1257 0091b480 Iustin Pop
class OpInstanceMove(OpCode):
1258 313bcead Iustin Pop
  """Move an instance.
1259 313bcead Iustin Pop

1260 313bcead Iustin Pop
  This move (with shutting down an instance and data copying) to an
1261 313bcead Iustin Pop
  arbitrary node.
1262 313bcead Iustin Pop

1263 313bcead Iustin Pop
  @ivar instance_name: the name of the instance
1264 313bcead Iustin Pop
  @ivar target_node: the destination node
1265 313bcead Iustin Pop

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

1494 1410fa8d Michael Hanselmann
  @ivar instance_name: Instance name
1495 1410fa8d Michael Hanselmann
  @ivar mode: Export mode (one of L{constants.EXPORT_MODES})
1496 1410fa8d Michael Hanselmann

1497 1410fa8d Michael Hanselmann
  """
1498 1410fa8d Michael Hanselmann
  OP_DSC_FIELD = "instance_name"
1499 65e183af Michael Hanselmann
  OP_PARAMS = [
1500 65e183af Michael Hanselmann
    _PInstanceName,
1501 45d4c81c Michael Hanselmann
    ("mode", ht.NoDefault, ht.TElemOf(constants.EXPORT_MODES),
1502 45d4c81c Michael Hanselmann
     "Export mode"),
1503 1410fa8d Michael Hanselmann
    ]
1504 1410fa8d Michael Hanselmann
1505 1410fa8d Michael Hanselmann
1506 4ff922a2 Iustin Pop
class OpBackupExport(OpCode):
1507 4a96f1d1 Michael Hanselmann
  """Export an instance.
1508 4a96f1d1 Michael Hanselmann

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

1515 4a96f1d1 Michael Hanselmann
  @ivar mode: Export mode (one of L{constants.EXPORT_MODES})
1516 4a96f1d1 Michael Hanselmann
  @ivar target_node: Export destination
1517 4a96f1d1 Michael Hanselmann
  @ivar x509_key_name: X509 key to use (remote export only)
1518 4a96f1d1 Michael Hanselmann
  @ivar destination_x509_ca: Destination X509 CA in PEM format (remote export
1519 4a96f1d1 Michael Hanselmann
                             only)
1520 4a96f1d1 Michael Hanselmann

1521 4a96f1d1 Michael Hanselmann
  """
1522 60dd1473 Iustin Pop
  OP_DSC_FIELD = "instance_name"
1523 65e183af Michael Hanselmann
  OP_PARAMS = [
1524 65e183af Michael Hanselmann
    _PInstanceName,
1525 65e183af Michael Hanselmann
    _PShutdownTimeout,
1526 4a96f1d1 Michael Hanselmann
    # TODO: Rename target_node as it changes meaning for different export modes
1527 4a96f1d1 Michael Hanselmann
    # (e.g. "destination")
1528 45d4c81c Michael Hanselmann
    ("target_node", ht.NoDefault, ht.TOr(ht.TNonEmptyString, ht.TList),
1529 45d4c81c Michael Hanselmann
     "Destination information, depends on export mode"),
1530 45d4c81c Michael Hanselmann
    ("shutdown", True, ht.TBool, "Whether to shutdown instance before export"),
1531 45d4c81c Michael Hanselmann
    ("remove_instance", False, ht.TBool,
1532 45d4c81c Michael Hanselmann
     "Whether to remove instance after export"),
1533 45d4c81c Michael Hanselmann
    ("ignore_remove_failures", False, ht.TBool,
1534 45d4c81c Michael Hanselmann
     "Whether to ignore failures while removing instances"),
1535 45d4c81c Michael Hanselmann
    ("mode", constants.EXPORT_MODE_LOCAL, ht.TElemOf(constants.EXPORT_MODES),
1536 45d4c81c Michael Hanselmann
     "Export mode"),
1537 45d4c81c Michael Hanselmann
    ("x509_key_name", None, ht.TOr(ht.TList, ht.TNone),
1538 45d4c81c Michael Hanselmann
     "Name of X509 key (remote export only)"),
1539 45d4c81c Michael Hanselmann
    ("destination_x509_ca", None, ht.TMaybeString,
1540 45d4c81c Michael Hanselmann
     "Destination X509 CA (remote export only)"),
1541 17c3f802 Guido Trotter
    ]
1542 5c947f38 Iustin Pop
1543 0a7bed64 Michael Hanselmann
1544 ca5890ad Iustin Pop
class OpBackupRemove(OpCode):
1545 9ac99fda Guido Trotter
  """Remove an instance's export."""
1546 60dd1473 Iustin Pop
  OP_DSC_FIELD = "instance_name"
1547 65e183af Michael Hanselmann
  OP_PARAMS = [
1548 65e183af Michael Hanselmann
    _PInstanceName,
1549 65e183af Michael Hanselmann
    ]
1550 5c947f38 Iustin Pop
1551 0a7bed64 Michael Hanselmann
1552 5c947f38 Iustin Pop
# Tags opcodes
1553 c6afb1ca Iustin Pop
class OpTagsGet(OpCode):
1554 5c947f38 Iustin Pop
  """Returns the tags of the given object."""
1555 60dd1473 Iustin Pop
  OP_DSC_FIELD = "name"
1556 65e183af Michael Hanselmann
  OP_PARAMS = [
1557 65e183af Michael Hanselmann
    _PTagKind,
1558 65e183af Michael Hanselmann
    # Name is only meaningful for nodes and instances
1559 197b323b Michael Hanselmann
    ("name", ht.NoDefault, ht.TMaybeString, None),
1560 65e183af Michael Hanselmann
    ]
1561 5c947f38 Iustin Pop
1562 5c947f38 Iustin Pop
1563 715462e7 Iustin Pop
class OpTagsSearch(OpCode):
1564 73415719 Iustin Pop
  """Searches the tags in the cluster for a given pattern."""
1565 60dd1473 Iustin Pop
  OP_DSC_FIELD = "pattern"
1566 65e183af Michael Hanselmann
  OP_PARAMS = [
1567 197b323b Michael Hanselmann
    ("pattern", ht.NoDefault, ht.TNonEmptyString, None),
1568 65e183af Michael Hanselmann
    ]
1569 73415719 Iustin Pop
1570 73415719 Iustin Pop
1571 d1602edc Iustin Pop
class OpTagsSet(OpCode):
1572 f27302fa Iustin Pop
  """Add a list of tags on a given object."""
1573 65e183af Michael Hanselmann
  OP_PARAMS = [
1574 65e183af Michael Hanselmann
    _PTagKind,
1575 65e183af Michael Hanselmann
    _PTags,
1576 65e183af Michael Hanselmann
    # Name is only meaningful for nodes and instances
1577 197b323b Michael Hanselmann
    ("name", ht.NoDefault, ht.TMaybeString, None),
1578 65e183af Michael Hanselmann
    ]
1579 5c947f38 Iustin Pop
1580 5c947f38 Iustin Pop
1581 3f0ab95f Iustin Pop
class OpTagsDel(OpCode):
1582 f27302fa Iustin Pop
  """Remove a list of tags from a given object."""
1583 65e183af Michael Hanselmann
  OP_PARAMS = [
1584 65e183af Michael Hanselmann
    _PTagKind,
1585 65e183af Michael Hanselmann
    _PTags,
1586 65e183af Michael Hanselmann
    # Name is only meaningful for nodes and instances
1587 197b323b Michael Hanselmann
    ("name", ht.NoDefault, ht.TMaybeString, None),
1588 65e183af Michael Hanselmann
    ]
1589 06009e27 Iustin Pop
1590 e687ec01 Michael Hanselmann
1591 06009e27 Iustin Pop
# Test opcodes
1592 06009e27 Iustin Pop
class OpTestDelay(OpCode):
1593 06009e27 Iustin Pop
  """Sleeps for a configured amount of time.
1594 06009e27 Iustin Pop

1595 06009e27 Iustin Pop
  This is used just for debugging and testing.
1596 06009e27 Iustin Pop

1597 06009e27 Iustin Pop
  Parameters:
1598 06009e27 Iustin Pop
    - duration: the time to sleep
1599 06009e27 Iustin Pop
    - on_master: if true, sleep on the master
1600 06009e27 Iustin Pop
    - on_nodes: list of nodes in which to sleep
1601 06009e27 Iustin Pop

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

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

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

1612 06009e27 Iustin Pop
  """
1613 60dd1473 Iustin Pop
  OP_DSC_FIELD = "duration"
1614 65e183af Michael Hanselmann
  OP_PARAMS = [
1615 b795a775 Michael Hanselmann
    ("duration", ht.NoDefault, ht.TNumber, None),
1616 197b323b Michael Hanselmann
    ("on_master", True, ht.TBool, None),
1617 197b323b Michael Hanselmann
    ("on_nodes", ht.EmptyList, ht.TListOf(ht.TNonEmptyString), None),
1618 197b323b Michael Hanselmann
    ("repeat", 0, ht.TPositiveInt, None),
1619 65e183af Michael Hanselmann
    ]
1620 d61df03e Iustin Pop
1621 d61df03e Iustin Pop
1622 d61df03e Iustin Pop
class OpTestAllocator(OpCode):
1623 d61df03e Iustin Pop
  """Allocator framework testing.
1624 d61df03e Iustin Pop

1625 d61df03e Iustin Pop
  This opcode has two modes:
1626 d61df03e Iustin Pop
    - gather and return allocator input for a given mode (allocate new
1627 d61df03e Iustin Pop
      or replace secondary) and a given instance definition (direction
1628 d61df03e Iustin Pop
      'in')
1629 d61df03e Iustin Pop
    - run a selected allocator for a given operation (as above) and
1630 d61df03e Iustin Pop
      return the allocator output (direction 'out')
1631 d61df03e Iustin Pop

1632 d61df03e Iustin Pop
  """
1633 60dd1473 Iustin Pop
  OP_DSC_FIELD = "allocator"
1634 65e183af Michael Hanselmann
  OP_PARAMS = [
1635 65e183af Michael Hanselmann
    ("direction", ht.NoDefault,
1636 197b323b Michael Hanselmann
     ht.TElemOf(constants.VALID_IALLOCATOR_DIRECTIONS), None),
1637 197b323b Michael Hanselmann
    ("mode", ht.NoDefault, ht.TElemOf(constants.VALID_IALLOCATOR_MODES), None),
1638 197b323b Michael Hanselmann
    ("name", ht.NoDefault, ht.TNonEmptyString, None),
1639 65e183af Michael Hanselmann
    ("nics", ht.NoDefault, ht.TOr(ht.TNone, ht.TListOf(
1640 fdbe29ee Michael Hanselmann
     ht.TDictOf(ht.TElemOf([constants.INIC_MAC, constants.INIC_IP, "bridge"]),
1641 45d4c81c Michael Hanselmann
                ht.TOr(ht.TNone, ht.TNonEmptyString)))), None),
1642 197b323b Michael Hanselmann
    ("disks", ht.NoDefault, ht.TOr(ht.TNone, ht.TList), None),
1643 197b323b Michael Hanselmann
    ("hypervisor", None, ht.TMaybeString, None),
1644 197b323b Michael Hanselmann
    ("allocator", None, ht.TMaybeString, None),
1645 197b323b Michael Hanselmann
    ("tags", ht.EmptyList, ht.TListOf(ht.TNonEmptyString), None),
1646 dd47a0f0 Iustin Pop
    ("memory", None, ht.TOr(ht.TNone, ht.TPositiveInt), None),
1647 197b323b Michael Hanselmann
    ("vcpus", None, ht.TOr(ht.TNone, ht.TPositiveInt), None),
1648 197b323b Michael Hanselmann
    ("os", None, ht.TMaybeString, None),
1649 197b323b Michael Hanselmann
    ("disk_template", None, ht.TMaybeString, None),
1650 bee581e2 Michael Hanselmann
    ("instances", None, ht.TOr(ht.TNone, ht.TListOf(ht.TNonEmptyString)),
1651 bee581e2 Michael Hanselmann
     None),
1652 60152bbe Michael Hanselmann
    ("evac_mode", None,
1653 60152bbe Michael Hanselmann
     ht.TOr(ht.TNone, ht.TElemOf(constants.IALLOCATOR_NEVAC_MODES)), None),
1654 bee581e2 Michael Hanselmann
    ("target_groups", None, ht.TOr(ht.TNone, ht.TListOf(ht.TNonEmptyString)),
1655 bee581e2 Michael Hanselmann
     None),
1656 d61df03e Iustin Pop
    ]
1657 363acb1e Iustin Pop
1658 76aef8fc Michael Hanselmann
1659 b469eb4d Iustin Pop
class OpTestJqueue(OpCode):
1660 e58f87a9 Michael Hanselmann
  """Utility opcode to test some aspects of the job queue.
1661 e58f87a9 Michael Hanselmann

1662 e58f87a9 Michael Hanselmann
  """
1663 65e183af Michael Hanselmann
  OP_PARAMS = [
1664 197b323b Michael Hanselmann
    ("notify_waitlock", False, ht.TBool, None),
1665 197b323b Michael Hanselmann
    ("notify_exec", False, ht.TBool, None),
1666 197b323b Michael Hanselmann
    ("log_messages", ht.EmptyList, ht.TListOf(ht.TString), None),
1667 197b323b Michael Hanselmann
    ("fail", False, ht.TBool, None),
1668 e58f87a9 Michael Hanselmann
    ]
1669 e58f87a9 Michael Hanselmann
1670 e58f87a9 Michael Hanselmann
1671 be760ba8 Michael Hanselmann
class OpTestDummy(OpCode):
1672 be760ba8 Michael Hanselmann
  """Utility opcode used by unittests.
1673 be760ba8 Michael Hanselmann

1674 be760ba8 Michael Hanselmann
  """
1675 65e183af Michael Hanselmann
  OP_PARAMS = [
1676 197b323b Michael Hanselmann
    ("result", ht.NoDefault, ht.NoType, None),
1677 197b323b Michael Hanselmann
    ("messages", ht.NoDefault, ht.NoType, None),
1678 197b323b Michael Hanselmann
    ("fail", ht.NoDefault, ht.NoType, None),
1679 6a373640 Michael Hanselmann
    ("submit_jobs", None, ht.NoType, None),
1680 be760ba8 Michael Hanselmann
    ]
1681 687c10d9 Iustin Pop
  WITH_LU = False
1682 be760ba8 Michael Hanselmann
1683 be760ba8 Michael Hanselmann
1684 dbc96028 Michael Hanselmann
def _GetOpList():
1685 dbc96028 Michael Hanselmann
  """Returns list of all defined opcodes.
1686 dbc96028 Michael Hanselmann

1687 dbc96028 Michael Hanselmann
  Does not eliminate duplicates by C{OP_ID}.
1688 dbc96028 Michael Hanselmann

1689 dbc96028 Michael Hanselmann
  """
1690 dbc96028 Michael Hanselmann
  return [v for v in globals().values()
1691 dbc96028 Michael Hanselmann
          if (isinstance(v, type) and issubclass(v, OpCode) and
1692 687c10d9 Iustin Pop
              hasattr(v, "OP_ID") and v is not OpCode)]
1693 dbc96028 Michael Hanselmann
1694 dbc96028 Michael Hanselmann
1695 dbc96028 Michael Hanselmann
OP_MAPPING = dict((v.OP_ID, v) for v in _GetOpList())