Statistics
| Branch: | Tag: | Revision:

root / lib / opcodes.py @ 735e1318

History | View | Annotate | Download (53.2 kB)

1 2f31098c Iustin Pop
#
2 a8083063 Iustin Pop
#
3 a8083063 Iustin Pop
4 687c10d9 Iustin Pop
# Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011 Google Inc.
5 a8083063 Iustin Pop
#
6 a8083063 Iustin Pop
# This program is free software; you can redistribute it and/or modify
7 a8083063 Iustin Pop
# it under the terms of the GNU General Public License as published by
8 a8083063 Iustin Pop
# the Free Software Foundation; either version 2 of the License, or
9 a8083063 Iustin Pop
# (at your option) any later version.
10 a8083063 Iustin Pop
#
11 a8083063 Iustin Pop
# This program is distributed in the hope that it will be useful, but
12 a8083063 Iustin Pop
# WITHOUT ANY WARRANTY; without even the implied warranty of
13 a8083063 Iustin Pop
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 a8083063 Iustin Pop
# General Public License for more details.
15 a8083063 Iustin Pop
#
16 a8083063 Iustin Pop
# You should have received a copy of the GNU General Public License
17 a8083063 Iustin Pop
# along with this program; if not, write to the Free Software
18 a8083063 Iustin Pop
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19 a8083063 Iustin Pop
# 02110-1301, USA.
20 a8083063 Iustin Pop
21 a8083063 Iustin Pop
22 a8083063 Iustin Pop
"""OpCodes module
23 a8083063 Iustin Pop

24 a8083063 Iustin Pop
This module implements the data structures which define the cluster
25 a8083063 Iustin Pop
operations - the so-called opcodes.
26 a8083063 Iustin Pop

27 0e46916d Iustin Pop
Every operation which modifies the cluster state is expressed via
28 0e46916d Iustin Pop
opcodes.
29 a8083063 Iustin Pop

30 a8083063 Iustin Pop
"""
31 a8083063 Iustin Pop
32 a8083063 Iustin Pop
# this are practically structures, so disable the message about too
33 a8083063 Iustin Pop
# few public methods:
34 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 0ec2ce46 Renรฉ Nussbaumer
# Parameters for node resource model
152 0ec2ce46 Renรฉ Nussbaumer
_PHvState = ("hv_state", None, ht.TMaybeDict, "Set hypervisor states")
153 0ec2ce46 Renรฉ Nussbaumer
_PDiskState = ("disk_state", None, ht.TMaybeDict, "Set disk states")
154 0ec2ce46 Renรฉ Nussbaumer
155 b6aaf437 Renรฉ Nussbaumer
156 b6aaf437 Renรฉ Nussbaumer
_PIgnoreIpolicy = ("ignore_ipolicy", False, ht.TBool,
157 b6aaf437 Renรฉ Nussbaumer
                   "Whether to ignore ipolicy violations")
158 b6aaf437 Renรฉ Nussbaumer
159 ff0d18e6 Iustin Pop
#: OP_ID conversion regular expression
160 ff0d18e6 Iustin Pop
_OPID_RE = re.compile("([a-z])([A-Z])")
161 ff0d18e6 Iustin Pop
162 8c9ee749 Michael Hanselmann
#: Utility function for L{OpClusterSetParams}
163 8c9ee749 Michael Hanselmann
_TestClusterOsList = ht.TOr(ht.TNone,
164 8c9ee749 Michael Hanselmann
  ht.TListOf(ht.TAnd(ht.TList, ht.TIsLength(2),
165 eb62069e Iustin Pop
    ht.TMap(ht.WithDesc("GetFirstItem")(compat.fst),
166 8c9ee749 Michael Hanselmann
            ht.TElemOf(constants.DDMS_VALUES)))))
167 8c9ee749 Michael Hanselmann
168 ff0d18e6 Iustin Pop
169 526a662a Michael Hanselmann
# TODO: Generate check from constants.INIC_PARAMS_TYPES
170 526a662a Michael Hanselmann
#: Utility function for testing NIC definitions
171 526a662a Michael Hanselmann
_TestNicDef = ht.TDictOf(ht.TElemOf(constants.INIC_PARAMS),
172 526a662a Michael Hanselmann
                         ht.TOr(ht.TNone, ht.TNonEmptyString))
173 526a662a Michael Hanselmann
174 1456df62 Michael Hanselmann
_TSetParamsResultItemItems = [
175 1456df62 Michael Hanselmann
  ht.Comment("name of changed parameter")(ht.TNonEmptyString),
176 b3d2ee31 Michael Hanselmann
  ht.Comment("new value")(ht.TAny),
177 1456df62 Michael Hanselmann
  ]
178 1456df62 Michael Hanselmann
179 1456df62 Michael Hanselmann
_TSetParamsResult = \
180 1456df62 Michael Hanselmann
  ht.TListOf(ht.TAnd(ht.TIsLength(len(_TSetParamsResultItemItems)),
181 1456df62 Michael Hanselmann
                     ht.TItems(_TSetParamsResultItemItems)))
182 1456df62 Michael Hanselmann
183 735e1318 Michael Hanselmann
# TODO: Generate check from constants.IDISK_PARAMS_TYPES (however, not all users
184 735e1318 Michael Hanselmann
# of this check support all parameters)
185 735e1318 Michael Hanselmann
_TDiskParams = ht.TDictOf(ht.TElemOf(constants.IDISK_PARAMS),
186 735e1318 Michael Hanselmann
                          ht.TOr(ht.TNonEmptyString, ht.TInt))
187 735e1318 Michael Hanselmann
188 3ce9a5e7 Michael Hanselmann
_SUMMARY_PREFIX = {
189 3ce9a5e7 Michael Hanselmann
  "CLUSTER_": "C_",
190 3ce9a5e7 Michael Hanselmann
  "GROUP_": "G_",
191 3ce9a5e7 Michael Hanselmann
  "NODE_": "N_",
192 3ce9a5e7 Michael Hanselmann
  "INSTANCE_": "I_",
193 3ce9a5e7 Michael Hanselmann
  }
194 3ce9a5e7 Michael Hanselmann
195 b95479a5 Michael Hanselmann
#: Attribute name for dependencies
196 b95479a5 Michael Hanselmann
DEPEND_ATTR = "depends"
197 b95479a5 Michael Hanselmann
198 018ae30b Michael Hanselmann
#: Attribute name for comment
199 018ae30b Michael Hanselmann
COMMENT_ATTR = "comment"
200 018ae30b Michael Hanselmann
201 526a662a Michael Hanselmann
202 ff0d18e6 Iustin Pop
def _NameToId(name):
203 ff0d18e6 Iustin Pop
  """Convert an opcode class name to an OP_ID.
204 ff0d18e6 Iustin Pop

205 ff0d18e6 Iustin Pop
  @type name: string
206 ff0d18e6 Iustin Pop
  @param name: the class name, as OpXxxYyy
207 ff0d18e6 Iustin Pop
  @rtype: string
208 ff0d18e6 Iustin Pop
  @return: the name in the OP_XXXX_YYYY format
209 ff0d18e6 Iustin Pop

210 ff0d18e6 Iustin Pop
  """
211 ff0d18e6 Iustin Pop
  if not name.startswith("Op"):
212 ff0d18e6 Iustin Pop
    return None
213 ff0d18e6 Iustin Pop
  # Note: (?<=[a-z])(?=[A-Z]) would be ideal, since it wouldn't
214 ff0d18e6 Iustin Pop
  # consume any input, and hence we would just have all the elements
215 ff0d18e6 Iustin Pop
  # in the list, one by one; but it seems that split doesn't work on
216 ff0d18e6 Iustin Pop
  # non-consuming input, hence we have to process the input string a
217 ff0d18e6 Iustin Pop
  # bit
218 ff0d18e6 Iustin Pop
  name = _OPID_RE.sub(r"\1,\2", name)
219 ff0d18e6 Iustin Pop
  elems = name.split(",")
220 ff0d18e6 Iustin Pop
  return "_".join(n.upper() for n in elems)
221 ff0d18e6 Iustin Pop
222 65e183af Michael Hanselmann
223 65e183af Michael Hanselmann
def RequireFileStorage():
224 65e183af Michael Hanselmann
  """Checks that file storage is enabled.
225 65e183af Michael Hanselmann

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

229 65e183af Michael Hanselmann
  @raise errors.OpPrereqError: when file storage is disabled
230 65e183af Michael Hanselmann

231 65e183af Michael Hanselmann
  """
232 65e183af Michael Hanselmann
  if not constants.ENABLE_FILE_STORAGE:
233 65e183af Michael Hanselmann
    raise errors.OpPrereqError("File storage disabled at configure time",
234 65e183af Michael Hanselmann
                               errors.ECODE_INVAL)
235 65e183af Michael Hanselmann
236 65e183af Michael Hanselmann
237 4b97f902 Apollon Oikonomopoulos
def RequireSharedFileStorage():
238 4b97f902 Apollon Oikonomopoulos
  """Checks that shared file storage is enabled.
239 4b97f902 Apollon Oikonomopoulos

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

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

245 4b97f902 Apollon Oikonomopoulos
  """
246 4b97f902 Apollon Oikonomopoulos
  if not constants.ENABLE_SHARED_FILE_STORAGE:
247 4b97f902 Apollon Oikonomopoulos
    raise errors.OpPrereqError("Shared file storage disabled at"
248 4b97f902 Apollon Oikonomopoulos
                               " configure time", errors.ECODE_INVAL)
249 4b97f902 Apollon Oikonomopoulos
250 4b97f902 Apollon Oikonomopoulos
251 8c9ee749 Michael Hanselmann
@ht.WithDesc("CheckFileStorage")
252 8c9ee749 Michael Hanselmann
def _CheckFileStorage(value):
253 8c9ee749 Michael Hanselmann
  """Ensures file storage is enabled if used.
254 65e183af Michael Hanselmann

255 65e183af Michael Hanselmann
  """
256 8c9ee749 Michael Hanselmann
  if value == constants.DT_FILE:
257 65e183af Michael Hanselmann
    RequireFileStorage()
258 4b97f902 Apollon Oikonomopoulos
  elif value == constants.DT_SHARED_FILE:
259 4b97f902 Apollon Oikonomopoulos
    RequireSharedFileStorage()
260 65e183af Michael Hanselmann
  return True
261 65e183af Michael Hanselmann
262 65e183af Michael Hanselmann
263 45fe090b Michael Hanselmann
def _BuildDiskTemplateCheck(accept_none):
264 45fe090b Michael Hanselmann
  """Builds check for disk template.
265 45fe090b Michael Hanselmann

266 45fe090b Michael Hanselmann
  @type accept_none: bool
267 45fe090b Michael Hanselmann
  @param accept_none: whether to accept None as a correct value
268 45fe090b Michael Hanselmann
  @rtype: callable
269 45fe090b Michael Hanselmann

270 45fe090b Michael Hanselmann
  """
271 45fe090b Michael Hanselmann
  template_check = ht.TElemOf(constants.DISK_TEMPLATES)
272 45fe090b Michael Hanselmann
273 45fe090b Michael Hanselmann
  if accept_none:
274 45fe090b Michael Hanselmann
    template_check = ht.TOr(template_check, ht.TNone)
275 45fe090b Michael Hanselmann
276 45fe090b Michael Hanselmann
  return ht.TAnd(template_check, _CheckFileStorage)
277 8c9ee749 Michael Hanselmann
278 8c9ee749 Michael Hanselmann
279 65e183af Michael Hanselmann
def _CheckStorageType(storage_type):
280 65e183af Michael Hanselmann
  """Ensure a given storage type is valid.
281 65e183af Michael Hanselmann

282 65e183af Michael Hanselmann
  """
283 65e183af Michael Hanselmann
  if storage_type not in constants.VALID_STORAGE_TYPES:
284 65e183af Michael Hanselmann
    raise errors.OpPrereqError("Unknown storage type: %s" % storage_type,
285 65e183af Michael Hanselmann
                               errors.ECODE_INVAL)
286 65e183af Michael Hanselmann
  if storage_type == constants.ST_FILE:
287 65e183af Michael Hanselmann
    RequireFileStorage()
288 65e183af Michael Hanselmann
  return True
289 65e183af Michael Hanselmann
290 65e183af Michael Hanselmann
291 65e183af Michael Hanselmann
#: Storage type parameter
292 45d4c81c Michael Hanselmann
_PStorageType = ("storage_type", ht.NoDefault, _CheckStorageType,
293 45d4c81c Michael Hanselmann
                 "Storage type")
294 65e183af Michael Hanselmann
295 65e183af Michael Hanselmann
296 65e183af Michael Hanselmann
class _AutoOpParamSlots(type):
297 65e183af Michael Hanselmann
  """Meta class for opcode definitions.
298 65e183af Michael Hanselmann

299 65e183af Michael Hanselmann
  """
300 65e183af Michael Hanselmann
  def __new__(mcs, name, bases, attrs):
301 65e183af Michael Hanselmann
    """Called when a class should be created.
302 65e183af Michael Hanselmann

303 65e183af Michael Hanselmann
    @param mcs: The meta class
304 65e183af Michael Hanselmann
    @param name: Name of created class
305 65e183af Michael Hanselmann
    @param bases: Base classes
306 65e183af Michael Hanselmann
    @type attrs: dict
307 65e183af Michael Hanselmann
    @param attrs: Class attributes
308 65e183af Michael Hanselmann

309 65e183af Michael Hanselmann
    """
310 65e183af Michael Hanselmann
    assert "__slots__" not in attrs, \
311 65e183af Michael Hanselmann
      "Class '%s' defines __slots__ when it should use OP_PARAMS" % name
312 e89a9021 Iustin Pop
    assert "OP_ID" not in attrs, "Class '%s' defining OP_ID" % name
313 ff0d18e6 Iustin Pop
314 e89a9021 Iustin Pop
    attrs["OP_ID"] = _NameToId(name)
315 65e183af Michael Hanselmann
316 65e183af Michael Hanselmann
    # Always set OP_PARAMS to avoid duplicates in BaseOpCode.GetAllParams
317 65e183af Michael Hanselmann
    params = attrs.setdefault("OP_PARAMS", [])
318 65e183af Michael Hanselmann
319 65e183af Michael Hanselmann
    # Use parameter names as slots
320 197b323b Michael Hanselmann
    slots = [pname for (pname, _, _, _) in params]
321 65e183af Michael Hanselmann
322 65e183af Michael Hanselmann
    assert "OP_DSC_FIELD" not in attrs or attrs["OP_DSC_FIELD"] in slots, \
323 65e183af Michael Hanselmann
      "Class '%s' uses unknown field in OP_DSC_FIELD" % name
324 65e183af Michael Hanselmann
325 65e183af Michael Hanselmann
    attrs["__slots__"] = slots
326 65e183af Michael Hanselmann
327 65e183af Michael Hanselmann
    return type.__new__(mcs, name, bases, attrs)
328 65e183af Michael Hanselmann
329 df458e0b Iustin Pop
330 0e46916d Iustin Pop
class BaseOpCode(object):
331 df458e0b Iustin Pop
  """A simple serializable object.
332 df458e0b Iustin Pop

333 0e46916d Iustin Pop
  This object serves as a parent class for OpCode without any custom
334 0e46916d Iustin Pop
  field handling.
335 0e46916d Iustin Pop

336 df458e0b Iustin Pop
  """
337 b459a848 Andrea Spadaccini
  # pylint: disable=E1101
338 e89a9021 Iustin Pop
  # as OP_ID is dynamically defined
339 65e183af Michael Hanselmann
  __metaclass__ = _AutoOpParamSlots
340 65e183af Michael Hanselmann
341 a8083063 Iustin Pop
  def __init__(self, **kwargs):
342 a7399f66 Iustin Pop
    """Constructor for BaseOpCode.
343 a7399f66 Iustin Pop

344 a7399f66 Iustin Pop
    The constructor takes only keyword arguments and will set
345 a7399f66 Iustin Pop
    attributes on this object based on the passed arguments. As such,
346 a7399f66 Iustin Pop
    it means that you should not pass arguments which are not in the
347 a7399f66 Iustin Pop
    __slots__ attribute for this class.
348 a7399f66 Iustin Pop

349 a7399f66 Iustin Pop
    """
350 adf385c7 Iustin Pop
    slots = self._all_slots()
351 a8083063 Iustin Pop
    for key in kwargs:
352 adf385c7 Iustin Pop
      if key not in slots:
353 df458e0b Iustin Pop
        raise TypeError("Object %s doesn't support the parameter '%s'" %
354 3ecf6786 Iustin Pop
                        (self.__class__.__name__, key))
355 a8083063 Iustin Pop
      setattr(self, key, kwargs[key])
356 a8083063 Iustin Pop
357 df458e0b Iustin Pop
  def __getstate__(self):
358 a7399f66 Iustin Pop
    """Generic serializer.
359 a7399f66 Iustin Pop

360 a7399f66 Iustin Pop
    This method just returns the contents of the instance as a
361 a7399f66 Iustin Pop
    dictionary.
362 a7399f66 Iustin Pop

363 a7399f66 Iustin Pop
    @rtype:  C{dict}
364 a7399f66 Iustin Pop
    @return: the instance attributes and their values
365 a7399f66 Iustin Pop

366 a7399f66 Iustin Pop
    """
367 df458e0b Iustin Pop
    state = {}
368 adf385c7 Iustin Pop
    for name in self._all_slots():
369 df458e0b Iustin Pop
      if hasattr(self, name):
370 df458e0b Iustin Pop
        state[name] = getattr(self, name)
371 df458e0b Iustin Pop
    return state
372 df458e0b Iustin Pop
373 df458e0b Iustin Pop
  def __setstate__(self, state):
374 a7399f66 Iustin Pop
    """Generic unserializer.
375 a7399f66 Iustin Pop

376 a7399f66 Iustin Pop
    This method just restores from the serialized state the attributes
377 a7399f66 Iustin Pop
    of the current instance.
378 a7399f66 Iustin Pop

379 a7399f66 Iustin Pop
    @param state: the serialized opcode data
380 a7399f66 Iustin Pop
    @type state:  C{dict}
381 a7399f66 Iustin Pop

382 a7399f66 Iustin Pop
    """
383 df458e0b Iustin Pop
    if not isinstance(state, dict):
384 df458e0b Iustin Pop
      raise ValueError("Invalid data to __setstate__: expected dict, got %s" %
385 df458e0b Iustin Pop
                       type(state))
386 df458e0b Iustin Pop
387 adf385c7 Iustin Pop
    for name in self._all_slots():
388 44db3a6f Iustin Pop
      if name not in state and hasattr(self, name):
389 df458e0b Iustin Pop
        delattr(self, name)
390 df458e0b Iustin Pop
391 df458e0b Iustin Pop
    for name in state:
392 df458e0b Iustin Pop
      setattr(self, name, state[name])
393 df458e0b Iustin Pop
394 adf385c7 Iustin Pop
  @classmethod
395 adf385c7 Iustin Pop
  def _all_slots(cls):
396 adf385c7 Iustin Pop
    """Compute the list of all declared slots for a class.
397 adf385c7 Iustin Pop

398 adf385c7 Iustin Pop
    """
399 adf385c7 Iustin Pop
    slots = []
400 adf385c7 Iustin Pop
    for parent in cls.__mro__:
401 adf385c7 Iustin Pop
      slots.extend(getattr(parent, "__slots__", []))
402 adf385c7 Iustin Pop
    return slots
403 adf385c7 Iustin Pop
404 65e183af Michael Hanselmann
  @classmethod
405 65e183af Michael Hanselmann
  def GetAllParams(cls):
406 65e183af Michael Hanselmann
    """Compute list of all parameters for an opcode.
407 65e183af Michael Hanselmann

408 65e183af Michael Hanselmann
    """
409 65e183af Michael Hanselmann
    slots = []
410 65e183af Michael Hanselmann
    for parent in cls.__mro__:
411 65e183af Michael Hanselmann
      slots.extend(getattr(parent, "OP_PARAMS", []))
412 65e183af Michael Hanselmann
    return slots
413 65e183af Michael Hanselmann
414 1cbef6d8 Michael Hanselmann
  def Validate(self, set_defaults):
415 1cbef6d8 Michael Hanselmann
    """Validate opcode parameters, optionally setting default values.
416 1cbef6d8 Michael Hanselmann

417 1cbef6d8 Michael Hanselmann
    @type set_defaults: bool
418 1cbef6d8 Michael Hanselmann
    @param set_defaults: Whether to set default values
419 1cbef6d8 Michael Hanselmann
    @raise errors.OpPrereqError: When a parameter value doesn't match
420 1cbef6d8 Michael Hanselmann
                                 requirements
421 1cbef6d8 Michael Hanselmann

422 1cbef6d8 Michael Hanselmann
    """
423 197b323b Michael Hanselmann
    for (attr_name, default, test, _) in self.GetAllParams():
424 1cbef6d8 Michael Hanselmann
      assert test == ht.NoType or callable(test)
425 1cbef6d8 Michael Hanselmann
426 1cbef6d8 Michael Hanselmann
      if not hasattr(self, attr_name):
427 1cbef6d8 Michael Hanselmann
        if default == ht.NoDefault:
428 1cbef6d8 Michael Hanselmann
          raise errors.OpPrereqError("Required parameter '%s.%s' missing" %
429 1cbef6d8 Michael Hanselmann
                                     (self.OP_ID, attr_name),
430 1cbef6d8 Michael Hanselmann
                                     errors.ECODE_INVAL)
431 1cbef6d8 Michael Hanselmann
        elif set_defaults:
432 1cbef6d8 Michael Hanselmann
          if callable(default):
433 1cbef6d8 Michael Hanselmann
            dval = default()
434 1cbef6d8 Michael Hanselmann
          else:
435 1cbef6d8 Michael Hanselmann
            dval = default
436 1cbef6d8 Michael Hanselmann
          setattr(self, attr_name, dval)
437 1cbef6d8 Michael Hanselmann
438 1cbef6d8 Michael Hanselmann
      if test == ht.NoType:
439 1cbef6d8 Michael Hanselmann
        # no tests here
440 1cbef6d8 Michael Hanselmann
        continue
441 1cbef6d8 Michael Hanselmann
442 1cbef6d8 Michael Hanselmann
      if set_defaults or hasattr(self, attr_name):
443 1cbef6d8 Michael Hanselmann
        attr_val = getattr(self, attr_name)
444 1cbef6d8 Michael Hanselmann
        if not test(attr_val):
445 1cbef6d8 Michael Hanselmann
          logging.error("OpCode %s, parameter %s, has invalid type %s/value %s",
446 1cbef6d8 Michael Hanselmann
                        self.OP_ID, attr_name, type(attr_val), attr_val)
447 1cbef6d8 Michael Hanselmann
          raise errors.OpPrereqError("Parameter '%s.%s' fails validation" %
448 1cbef6d8 Michael Hanselmann
                                     (self.OP_ID, attr_name),
449 1cbef6d8 Michael Hanselmann
                                     errors.ECODE_INVAL)
450 1cbef6d8 Michael Hanselmann
451 df458e0b Iustin Pop
452 b247c6fc Michael Hanselmann
def _BuildJobDepCheck(relative):
453 b247c6fc Michael Hanselmann
  """Builds check for job dependencies (L{DEPEND_ATTR}).
454 b247c6fc Michael Hanselmann

455 b247c6fc Michael Hanselmann
  @type relative: bool
456 b247c6fc Michael Hanselmann
  @param relative: Whether to accept relative job IDs (negative)
457 b247c6fc Michael Hanselmann
  @rtype: callable
458 b247c6fc Michael Hanselmann

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

493 a7399f66 Iustin Pop
  This is the root of the actual OpCode hierarchy. All clases derived
494 a7399f66 Iustin Pop
  from this class should override OP_ID.
495 a7399f66 Iustin Pop

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

510 a7399f66 Iustin Pop
  """
511 b459a848 Andrea Spadaccini
  # pylint: disable=E1101
512 e89a9021 Iustin Pop
  # as OP_ID is dynamically defined
513 687c10d9 Iustin Pop
  WITH_LU = True
514 65e183af Michael Hanselmann
  OP_PARAMS = [
515 45d4c81c Michael Hanselmann
    ("dry_run", None, ht.TMaybeBool, "Run checks only, don't execute"),
516 45d4c81c Michael Hanselmann
    ("debug_level", None, ht.TOr(ht.TNone, ht.TPositiveInt), "Debug level"),
517 65e183af Michael Hanselmann
    ("priority", constants.OP_PRIO_DEFAULT,
518 45d4c81c Michael Hanselmann
     ht.TElemOf(constants.OP_PRIO_SUBMIT_VALID), "Opcode priority"),
519 b247c6fc Michael Hanselmann
    (DEPEND_ATTR, None, _BuildJobDepCheck(True),
520 b247c6fc Michael Hanselmann
     "Job dependencies; if used through ``SubmitManyJobs`` relative (negative)"
521 822a50c4 Michael Hanselmann
     " job IDs can be used; see :doc:`design document <design-chained-jobs>`"
522 822a50c4 Michael Hanselmann
     " for details"),
523 018ae30b Michael Hanselmann
    (COMMENT_ATTR, None, ht.TMaybeString,
524 018ae30b Michael Hanselmann
     "Comment describing the purpose of the opcode"),
525 65e183af Michael Hanselmann
    ]
526 1ce03fb1 Michael Hanselmann
  OP_RESULT = None
527 df458e0b Iustin Pop
528 df458e0b Iustin Pop
  def __getstate__(self):
529 df458e0b Iustin Pop
    """Specialized getstate for opcodes.
530 df458e0b Iustin Pop

531 a7399f66 Iustin Pop
    This method adds to the state dictionary the OP_ID of the class,
532 a7399f66 Iustin Pop
    so that on unload we can identify the correct class for
533 a7399f66 Iustin Pop
    instantiating the opcode.
534 a7399f66 Iustin Pop

535 a7399f66 Iustin Pop
    @rtype:   C{dict}
536 a7399f66 Iustin Pop
    @return:  the state as a dictionary
537 a7399f66 Iustin Pop

538 df458e0b Iustin Pop
    """
539 0e46916d Iustin Pop
    data = BaseOpCode.__getstate__(self)
540 df458e0b Iustin Pop
    data["OP_ID"] = self.OP_ID
541 df458e0b Iustin Pop
    return data
542 df458e0b Iustin Pop
543 df458e0b Iustin Pop
  @classmethod
544 00abdc96 Iustin Pop
  def LoadOpCode(cls, data):
545 df458e0b Iustin Pop
    """Generic load opcode method.
546 df458e0b Iustin Pop

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

551 a7399f66 Iustin Pop
    @type data:  C{dict}
552 a7399f66 Iustin Pop
    @param data: the serialized opcode
553 a7399f66 Iustin Pop

554 df458e0b Iustin Pop
    """
555 df458e0b Iustin Pop
    if not isinstance(data, dict):
556 df458e0b Iustin Pop
      raise ValueError("Invalid data to LoadOpCode (%s)" % type(data))
557 df458e0b Iustin Pop
    if "OP_ID" not in data:
558 df458e0b Iustin Pop
      raise ValueError("Invalid data to LoadOpcode, missing OP_ID")
559 df458e0b Iustin Pop
    op_id = data["OP_ID"]
560 df458e0b Iustin Pop
    op_class = None
561 363acb1e Iustin Pop
    if op_id in OP_MAPPING:
562 363acb1e Iustin Pop
      op_class = OP_MAPPING[op_id]
563 363acb1e Iustin Pop
    else:
564 df458e0b Iustin Pop
      raise ValueError("Invalid data to LoadOpCode: OP_ID %s unsupported" %
565 df458e0b Iustin Pop
                       op_id)
566 df458e0b Iustin Pop
    op = op_class()
567 df458e0b Iustin Pop
    new_data = data.copy()
568 df458e0b Iustin Pop
    del new_data["OP_ID"]
569 df458e0b Iustin Pop
    op.__setstate__(new_data)
570 df458e0b Iustin Pop
    return op
571 df458e0b Iustin Pop
572 60dd1473 Iustin Pop
  def Summary(self):
573 60dd1473 Iustin Pop
    """Generates a summary description of this opcode.
574 60dd1473 Iustin Pop

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

581 60dd1473 Iustin Pop
    """
582 ff0d18e6 Iustin Pop
    assert self.OP_ID is not None and len(self.OP_ID) > 3
583 60dd1473 Iustin Pop
    # all OP_ID start with OP_, we remove that
584 60dd1473 Iustin Pop
    txt = self.OP_ID[3:]
585 60dd1473 Iustin Pop
    field_name = getattr(self, "OP_DSC_FIELD", None)
586 60dd1473 Iustin Pop
    if field_name:
587 60dd1473 Iustin Pop
      field_value = getattr(self, field_name, None)
588 bc8bbda1 Iustin Pop
      if isinstance(field_value, (list, tuple)):
589 bc8bbda1 Iustin Pop
        field_value = ",".join(str(i) for i in field_value)
590 60dd1473 Iustin Pop
      txt = "%s(%s)" % (txt, field_value)
591 60dd1473 Iustin Pop
    return txt
592 60dd1473 Iustin Pop
593 3ce9a5e7 Michael Hanselmann
  def TinySummary(self):
594 3ce9a5e7 Michael Hanselmann
    """Generates a compact summary description of the opcode.
595 3ce9a5e7 Michael Hanselmann

596 3ce9a5e7 Michael Hanselmann
    """
597 3ce9a5e7 Michael Hanselmann
    assert self.OP_ID.startswith("OP_")
598 3ce9a5e7 Michael Hanselmann
599 3ce9a5e7 Michael Hanselmann
    text = self.OP_ID[3:]
600 3ce9a5e7 Michael Hanselmann
601 3ce9a5e7 Michael Hanselmann
    for (prefix, supplement) in _SUMMARY_PREFIX.items():
602 3ce9a5e7 Michael Hanselmann
      if text.startswith(prefix):
603 3ce9a5e7 Michael Hanselmann
        return supplement + text[len(prefix):]
604 3ce9a5e7 Michael Hanselmann
605 3ce9a5e7 Michael Hanselmann
    return text
606 3ce9a5e7 Michael Hanselmann
607 a8083063 Iustin Pop
608 afee0879 Iustin Pop
# cluster opcodes
609 afee0879 Iustin Pop
610 bc84ffa7 Iustin Pop
class OpClusterPostInit(OpCode):
611 b5f5fae9 Luca Bigliardi
  """Post cluster initialization.
612 b5f5fae9 Luca Bigliardi

613 b5f5fae9 Luca Bigliardi
  This opcode does not touch the cluster at all. Its purpose is to run hooks
614 b5f5fae9 Luca Bigliardi
  after the cluster has been initialized.
615 b5f5fae9 Luca Bigliardi

616 b5f5fae9 Luca Bigliardi
  """
617 b5f5fae9 Luca Bigliardi
618 b5f5fae9 Luca Bigliardi
619 c6d43e9e Iustin Pop
class OpClusterDestroy(OpCode):
620 a7399f66 Iustin Pop
  """Destroy the cluster.
621 a7399f66 Iustin Pop

622 a7399f66 Iustin Pop
  This opcode has no other parameters. All the state is irreversibly
623 a7399f66 Iustin Pop
  lost after the execution of this opcode.
624 a7399f66 Iustin Pop

625 a7399f66 Iustin Pop
  """
626 a8083063 Iustin Pop
627 a8083063 Iustin Pop
628 a2f7ab92 Iustin Pop
class OpClusterQuery(OpCode):
629 fdc267f4 Iustin Pop
  """Query cluster information."""
630 a8083063 Iustin Pop
631 a8083063 Iustin Pop
632 fcad7225 Michael Hanselmann
class OpClusterVerify(OpCode):
633 fcad7225 Michael Hanselmann
  """Submits all jobs necessary to verify the cluster.
634 fcad7225 Michael Hanselmann

635 fcad7225 Michael Hanselmann
  """
636 fcad7225 Michael Hanselmann
  OP_PARAMS = [
637 fcad7225 Michael Hanselmann
    _PDebugSimulateErrors,
638 fcad7225 Michael Hanselmann
    _PErrorCodes,
639 fcad7225 Michael Hanselmann
    _PSkipChecks,
640 93f2399e Andrea Spadaccini
    _PIgnoreErrors,
641 fcad7225 Michael Hanselmann
    _PVerbose,
642 fcad7225 Michael Hanselmann
    ("group_name", None, ht.TMaybeString, "Group to verify")
643 fcad7225 Michael Hanselmann
    ]
644 f7686867 Michael Hanselmann
  OP_RESULT = TJobIdListOnly
645 fcad7225 Michael Hanselmann
646 fcad7225 Michael Hanselmann
647 bf93ae69 Adeodato Simo
class OpClusterVerifyConfig(OpCode):
648 bf93ae69 Adeodato Simo
  """Verify the cluster config.
649 bf93ae69 Adeodato Simo

650 bf93ae69 Adeodato Simo
  """
651 bf93ae69 Adeodato Simo
  OP_PARAMS = [
652 57106b74 Michael Hanselmann
    _PDebugSimulateErrors,
653 57106b74 Michael Hanselmann
    _PErrorCodes,
654 93f2399e Andrea Spadaccini
    _PIgnoreErrors,
655 57106b74 Michael Hanselmann
    _PVerbose,
656 bf93ae69 Adeodato Simo
    ]
657 f7686867 Michael Hanselmann
  OP_RESULT = ht.TBool
658 bf93ae69 Adeodato Simo
659 bf93ae69 Adeodato Simo
660 bf93ae69 Adeodato Simo
class OpClusterVerifyGroup(OpCode):
661 bf93ae69 Adeodato Simo
  """Run verify on a node group from the cluster.
662 a7399f66 Iustin Pop

663 a7399f66 Iustin Pop
  @type skip_checks: C{list}
664 a7399f66 Iustin Pop
  @ivar skip_checks: steps to be skipped from the verify process; this
665 a7399f66 Iustin Pop
                     needs to be a subset of
666 a7399f66 Iustin Pop
                     L{constants.VERIFY_OPTIONAL_CHECKS}; currently
667 a7399f66 Iustin Pop
                     only L{constants.VERIFY_NPLUSONE_MEM} can be passed
668 a7399f66 Iustin Pop

669 a7399f66 Iustin Pop
  """
670 bf93ae69 Adeodato Simo
  OP_DSC_FIELD = "group_name"
671 65e183af Michael Hanselmann
  OP_PARAMS = [
672 57106b74 Michael Hanselmann
    _PGroupName,
673 57106b74 Michael Hanselmann
    _PDebugSimulateErrors,
674 57106b74 Michael Hanselmann
    _PErrorCodes,
675 57106b74 Michael Hanselmann
    _PSkipChecks,
676 93f2399e Andrea Spadaccini
    _PIgnoreErrors,
677 57106b74 Michael Hanselmann
    _PVerbose,
678 65e183af Michael Hanselmann
    ]
679 f7686867 Michael Hanselmann
  OP_RESULT = ht.TBool
680 a8083063 Iustin Pop
681 a8083063 Iustin Pop
682 bd8210a7 Iustin Pop
class OpClusterVerifyDisks(OpCode):
683 150e978f Iustin Pop
  """Verify the cluster disks.
684 150e978f Iustin Pop

685 ae1a845c Michael Hanselmann
  """
686 f7686867 Michael Hanselmann
  OP_RESULT = TJobIdListOnly
687 ae1a845c Michael Hanselmann
688 ae1a845c Michael Hanselmann
689 ae1a845c Michael Hanselmann
class OpGroupVerifyDisks(OpCode):
690 ae1a845c Michael Hanselmann
  """Verifies the status of all disks in a node group.
691 150e978f Iustin Pop

692 ae1a845c Michael Hanselmann
  Result: a tuple of three elements:
693 ae1a845c Michael Hanselmann
    - dict of node names with issues (values: error msg)
694 150e978f Iustin Pop
    - list of instances with degraded disks (that should be activated)
695 b63ed789 Iustin Pop
    - dict of instances with missing logical volumes (values: (node, vol)
696 b63ed789 Iustin Pop
      pairs with details about the missing volumes)
697 150e978f Iustin Pop

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

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

706 150e978f Iustin Pop
  """
707 ae1a845c Michael Hanselmann
  OP_DSC_FIELD = "group_name"
708 ae1a845c Michael Hanselmann
  OP_PARAMS = [
709 ae1a845c Michael Hanselmann
    _PGroupName,
710 ae1a845c Michael Hanselmann
    ]
711 1ce03fb1 Michael Hanselmann
  OP_RESULT = \
712 1ce03fb1 Michael Hanselmann
    ht.TAnd(ht.TIsLength(3),
713 1ce03fb1 Michael Hanselmann
            ht.TItems([ht.TDictOf(ht.TString, ht.TString),
714 1ce03fb1 Michael Hanselmann
                       ht.TListOf(ht.TString),
715 6973587f Michael Hanselmann
                       ht.TDictOf(ht.TString,
716 6973587f Michael Hanselmann
                                  ht.TListOf(ht.TListOf(ht.TString)))]))
717 150e978f Iustin Pop
718 150e978f Iustin Pop
719 5d01aca3 Iustin Pop
class OpClusterRepairDiskSizes(OpCode):
720 60975797 Iustin Pop
  """Verify the disk sizes of the instances and fixes configuration
721 60975797 Iustin Pop
  mimatches.
722 60975797 Iustin Pop

723 60975797 Iustin Pop
  Parameters: optional instances list, in case we want to restrict the
724 60975797 Iustin Pop
  checks to only a subset of the instances.
725 60975797 Iustin Pop

726 60975797 Iustin Pop
  Result: a list of tuples, (instance, disk, new-size) for changed
727 60975797 Iustin Pop
  configurations.
728 60975797 Iustin Pop

729 60975797 Iustin Pop
  In normal operation, the list should be empty.
730 60975797 Iustin Pop

731 60975797 Iustin Pop
  @type instances: list
732 60975797 Iustin Pop
  @ivar instances: the list of instances to check, or empty for all instances
733 60975797 Iustin Pop

734 60975797 Iustin Pop
  """
735 65e183af Michael Hanselmann
  OP_PARAMS = [
736 197b323b Michael Hanselmann
    ("instances", ht.EmptyList, ht.TListOf(ht.TNonEmptyString), None),
737 65e183af Michael Hanselmann
    ]
738 60975797 Iustin Pop
739 60975797 Iustin Pop
740 2f093ea0 Iustin Pop
class OpClusterConfigQuery(OpCode):
741 ae5849b5 Michael Hanselmann
  """Query cluster configuration values."""
742 65e183af Michael Hanselmann
  OP_PARAMS = [
743 65e183af Michael Hanselmann
    _POutputFields
744 65e183af Michael Hanselmann
    ]
745 a8083063 Iustin Pop
746 a8083063 Iustin Pop
747 e126df25 Iustin Pop
class OpClusterRename(OpCode):
748 a7399f66 Iustin Pop
  """Rename the cluster.
749 a7399f66 Iustin Pop

750 a7399f66 Iustin Pop
  @type name: C{str}
751 a7399f66 Iustin Pop
  @ivar name: The new name of the cluster. The name and/or the master IP
752 a7399f66 Iustin Pop
              address will be changed to match the new name and its IP
753 a7399f66 Iustin Pop
              address.
754 a7399f66 Iustin Pop

755 a7399f66 Iustin Pop
  """
756 60dd1473 Iustin Pop
  OP_DSC_FIELD = "name"
757 65e183af Michael Hanselmann
  OP_PARAMS = [
758 197b323b Michael Hanselmann
    ("name", ht.NoDefault, ht.TNonEmptyString, None),
759 65e183af Michael Hanselmann
    ]
760 07bd8a51 Iustin Pop
761 07bd8a51 Iustin Pop
762 a6682fdc Iustin Pop
class OpClusterSetParams(OpCode):
763 a7399f66 Iustin Pop
  """Change the parameters of the cluster.
764 a7399f66 Iustin Pop

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

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

832 afee0879 Iustin Pop
  """
833 afee0879 Iustin Pop
834 83f72637 Michael Hanselmann
835 fb926117 Andrea Spadaccini
class OpClusterActivateMasterIp(OpCode):
836 fb926117 Andrea Spadaccini
  """Activate the master IP on the master node.
837 fb926117 Andrea Spadaccini

838 fb926117 Andrea Spadaccini
  """
839 fb926117 Andrea Spadaccini
840 fb926117 Andrea Spadaccini
841 fb926117 Andrea Spadaccini
class OpClusterDeactivateMasterIp(OpCode):
842 fb926117 Andrea Spadaccini
  """Deactivate the master IP on the master node.
843 fb926117 Andrea Spadaccini

844 fb926117 Andrea Spadaccini
  """
845 fb926117 Andrea Spadaccini
846 fb926117 Andrea Spadaccini
847 83f72637 Michael Hanselmann
class OpQuery(OpCode):
848 83f72637 Michael Hanselmann
  """Query for resources/items.
849 83f72637 Michael Hanselmann

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

854 83f72637 Michael Hanselmann
  """
855 e50d8412 Michael Hanselmann
  OP_DSC_FIELD = "what"
856 65e183af Michael Hanselmann
  OP_PARAMS = [
857 8e7078e0 Michael Hanselmann
    _PQueryWhat,
858 ee13764f Michael Hanselmann
    _PUseLocking,
859 45d4c81c Michael Hanselmann
    ("fields", ht.NoDefault, ht.TListOf(ht.TNonEmptyString),
860 45d4c81c Michael Hanselmann
     "Requested fields"),
861 2e5c33db Iustin Pop
    ("qfilter", None, ht.TOr(ht.TNone, ht.TListOf),
862 45d4c81c Michael Hanselmann
     "Query filter"),
863 83f72637 Michael Hanselmann
    ]
864 83f72637 Michael Hanselmann
865 83f72637 Michael Hanselmann
866 83f72637 Michael Hanselmann
class OpQueryFields(OpCode):
867 83f72637 Michael Hanselmann
  """Query for available resource/item fields.
868 83f72637 Michael Hanselmann

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

872 83f72637 Michael Hanselmann
  """
873 e50d8412 Michael Hanselmann
  OP_DSC_FIELD = "what"
874 65e183af Michael Hanselmann
  OP_PARAMS = [
875 8e7078e0 Michael Hanselmann
    _PQueryWhat,
876 8e7078e0 Michael Hanselmann
    ("fields", None, ht.TOr(ht.TNone, ht.TListOf(ht.TNonEmptyString)),
877 8e7078e0 Michael Hanselmann
     "Requested fields; if not given, all are returned"),
878 83f72637 Michael Hanselmann
    ]
879 83f72637 Michael Hanselmann
880 83f72637 Michael Hanselmann
881 792af3ad Renรฉ Nussbaumer
class OpOobCommand(OpCode):
882 eb64da59 Renรฉ Nussbaumer
  """Interact with OOB."""
883 65e183af Michael Hanselmann
  OP_PARAMS = [
884 c4ec0755 Renรฉ Nussbaumer
    ("node_names", ht.EmptyList, ht.TListOf(ht.TNonEmptyString),
885 c4ec0755 Renรฉ Nussbaumer
     "List of nodes to run the OOB command against"),
886 c4ec0755 Renรฉ Nussbaumer
    ("command", None, ht.TElemOf(constants.OOB_COMMANDS),
887 c4ec0755 Renรฉ Nussbaumer
     "OOB command to be run"),
888 c4ec0755 Renรฉ Nussbaumer
    ("timeout", constants.OOB_TIMEOUT, ht.TInt,
889 c4ec0755 Renรฉ Nussbaumer
     "Timeout before the OOB helper will be terminated"),
890 c4ec0755 Renรฉ Nussbaumer
    ("ignore_status", False, ht.TBool,
891 c4ec0755 Renรฉ Nussbaumer
     "Ignores the node offline status for power off"),
892 beff3779 Renรฉ Nussbaumer
    ("power_delay", constants.OOB_POWER_DELAY, ht.TPositiveFloat,
893 beff3779 Renรฉ Nussbaumer
     "Time in seconds to wait between powering on nodes"),
894 eb64da59 Renรฉ Nussbaumer
    ]
895 eb64da59 Renรฉ Nussbaumer
896 eb64da59 Renรฉ Nussbaumer
897 07bd8a51 Iustin Pop
# node opcodes
898 07bd8a51 Iustin Pop
899 73d565a3 Iustin Pop
class OpNodeRemove(OpCode):
900 a7399f66 Iustin Pop
  """Remove a node.
901 a7399f66 Iustin Pop

902 a7399f66 Iustin Pop
  @type node_name: C{str}
903 a7399f66 Iustin Pop
  @ivar node_name: The name of the node to remove. If the node still has
904 a7399f66 Iustin Pop
                   instances on it, the operation will fail.
905 a7399f66 Iustin Pop

906 a7399f66 Iustin Pop
  """
907 60dd1473 Iustin Pop
  OP_DSC_FIELD = "node_name"
908 65e183af Michael Hanselmann
  OP_PARAMS = [
909 65e183af Michael Hanselmann
    _PNodeName,
910 65e183af Michael Hanselmann
    ]
911 a8083063 Iustin Pop
912 a8083063 Iustin Pop
913 d817d49f Iustin Pop
class OpNodeAdd(OpCode):
914 a7399f66 Iustin Pop
  """Add a node to the cluster.
915 a7399f66 Iustin Pop

916 a7399f66 Iustin Pop
  @type node_name: C{str}
917 a7399f66 Iustin Pop
  @ivar node_name: The name of the node to add. This can be a short name,
918 a7399f66 Iustin Pop
                   but it will be expanded to the FQDN.
919 a7399f66 Iustin Pop
  @type primary_ip: IP address
920 a7399f66 Iustin Pop
  @ivar primary_ip: The primary IP of the node. This will be ignored when the
921 a7399f66 Iustin Pop
                    opcode is submitted, but will be filled during the node
922 a7399f66 Iustin Pop
                    add (so it will be visible in the job query).
923 a7399f66 Iustin Pop
  @type secondary_ip: IP address
924 a7399f66 Iustin Pop
  @ivar secondary_ip: The secondary IP of the node. This needs to be passed
925 a7399f66 Iustin Pop
                      if the cluster has been initialized in 'dual-network'
926 a7399f66 Iustin Pop
                      mode, otherwise it must not be given.
927 a7399f66 Iustin Pop
  @type readd: C{bool}
928 a7399f66 Iustin Pop
  @ivar readd: Whether to re-add an existing node to the cluster. If
929 a7399f66 Iustin Pop
               this is not passed, then the operation will abort if the node
930 a7399f66 Iustin Pop
               name is already in the cluster; use this parameter to 'repair'
931 a7399f66 Iustin Pop
               a node that had its configuration broken, or was reinstalled
932 a7399f66 Iustin Pop
               without removal from the cluster.
933 f936c153 Iustin Pop
  @type group: C{str}
934 f936c153 Iustin Pop
  @ivar group: The node group to which this node will belong.
935 fd3d37b6 Iustin Pop
  @type vm_capable: C{bool}
936 fd3d37b6 Iustin Pop
  @ivar vm_capable: The vm_capable node attribute
937 fd3d37b6 Iustin Pop
  @type master_capable: C{bool}
938 fd3d37b6 Iustin Pop
  @ivar master_capable: The master_capable node attribute
939 a7399f66 Iustin Pop

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

1080 9bf56d77 Michael Hanselmann
  @ivar instance_name: Instance name
1081 9bf56d77 Michael Hanselmann
  @ivar mode: Instance creation mode (one of L{constants.INSTANCE_CREATE_MODES})
1082 9bf56d77 Michael Hanselmann
  @ivar source_handshake: Signed handshake from source (remote import only)
1083 9bf56d77 Michael Hanselmann
  @ivar source_x509_ca: Source X509 CA in PEM format (remote import only)
1084 9bf56d77 Michael Hanselmann
  @ivar source_instance_name: Previous name of instance (remote import only)
1085 dae91d02 Michael Hanselmann
  @ivar source_shutdown_timeout: Shutdown timeout used for source instance
1086 dae91d02 Michael Hanselmann
    (remote import only)
1087 9bf56d77 Michael Hanselmann

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

1257 53c776b5 Iustin Pop
  This migrates (without shutting down an instance) to its secondary
1258 53c776b5 Iustin Pop
  node.
1259 53c776b5 Iustin Pop

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

1263 53c776b5 Iustin Pop
  """
1264 ee69c97f Iustin Pop
  OP_DSC_FIELD = "instance_name"
1265 65e183af Michael Hanselmann
  OP_PARAMS = [
1266 65e183af Michael Hanselmann
    _PInstanceName,
1267 65e183af Michael Hanselmann
    _PMigrationMode,
1268 65e183af Michael Hanselmann
    _PMigrationLive,
1269 f8fa4175 Michael Hanselmann
    _PMigrationTargetNode,
1270 3ed23330 Renรฉ Nussbaumer
    _PIgnoreIpolicy,
1271 45d4c81c Michael Hanselmann
    ("cleanup", False, ht.TBool,
1272 45d4c81c Michael Hanselmann
     "Whether a previously failed migration should be cleaned up"),
1273 8eb34306 Apollon Oikonomopoulos
    ("iallocator", None, ht.TMaybeString,
1274 8eb34306 Apollon Oikonomopoulos
     "Iallocator for deciding the target node for shared-storage instances"),
1275 d5cafd31 Renรฉ Nussbaumer
    ("allow_failover", False, ht.TBool,
1276 d5cafd31 Renรฉ Nussbaumer
     "Whether we can fallback to failover if migration is not possible"),
1277 65e183af Michael Hanselmann
    ]
1278 53c776b5 Iustin Pop
1279 53c776b5 Iustin Pop
1280 0091b480 Iustin Pop
class OpInstanceMove(OpCode):
1281 313bcead Iustin Pop
  """Move an instance.
1282 313bcead Iustin Pop

1283 313bcead Iustin Pop
  This move (with shutting down an instance and data copying) to an
1284 313bcead Iustin Pop
  arbitrary node.
1285 313bcead Iustin Pop

1286 313bcead Iustin Pop
  @ivar instance_name: the name of the instance
1287 313bcead Iustin Pop
  @ivar target_node: the destination node
1288 313bcead Iustin Pop

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

1533 1410fa8d Michael Hanselmann
  @ivar instance_name: Instance name
1534 1410fa8d Michael Hanselmann
  @ivar mode: Export mode (one of L{constants.EXPORT_MODES})
1535 1410fa8d Michael Hanselmann

1536 1410fa8d Michael Hanselmann
  """
1537 1410fa8d Michael Hanselmann
  OP_DSC_FIELD = "instance_name"
1538 65e183af Michael Hanselmann
  OP_PARAMS = [
1539 65e183af Michael Hanselmann
    _PInstanceName,
1540 45d4c81c Michael Hanselmann
    ("mode", ht.NoDefault, ht.TElemOf(constants.EXPORT_MODES),
1541 45d4c81c Michael Hanselmann
     "Export mode"),
1542 1410fa8d Michael Hanselmann
    ]
1543 1410fa8d Michael Hanselmann
1544 1410fa8d Michael Hanselmann
1545 4ff922a2 Iustin Pop
class OpBackupExport(OpCode):
1546 4a96f1d1 Michael Hanselmann
  """Export an instance.
1547 4a96f1d1 Michael Hanselmann

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

1554 4a96f1d1 Michael Hanselmann
  @ivar mode: Export mode (one of L{constants.EXPORT_MODES})
1555 4a96f1d1 Michael Hanselmann
  @ivar target_node: Export destination
1556 4a96f1d1 Michael Hanselmann
  @ivar x509_key_name: X509 key to use (remote export only)
1557 4a96f1d1 Michael Hanselmann
  @ivar destination_x509_ca: Destination X509 CA in PEM format (remote export
1558 4a96f1d1 Michael Hanselmann
                             only)
1559 4a96f1d1 Michael Hanselmann

1560 4a96f1d1 Michael Hanselmann
  """
1561 60dd1473 Iustin Pop
  OP_DSC_FIELD = "instance_name"
1562 65e183af Michael Hanselmann
  OP_PARAMS = [
1563 65e183af Michael Hanselmann
    _PInstanceName,
1564 65e183af Michael Hanselmann
    _PShutdownTimeout,
1565 4a96f1d1 Michael Hanselmann
    # TODO: Rename target_node as it changes meaning for different export modes
1566 4a96f1d1 Michael Hanselmann
    # (e.g. "destination")
1567 45d4c81c Michael Hanselmann
    ("target_node", ht.NoDefault, ht.TOr(ht.TNonEmptyString, ht.TList),
1568 45d4c81c Michael Hanselmann
     "Destination information, depends on export mode"),
1569 45d4c81c Michael Hanselmann
    ("shutdown", True, ht.TBool, "Whether to shutdown instance before export"),
1570 45d4c81c Michael Hanselmann
    ("remove_instance", False, ht.TBool,
1571 45d4c81c Michael Hanselmann
     "Whether to remove instance after export"),
1572 45d4c81c Michael Hanselmann
    ("ignore_remove_failures", False, ht.TBool,
1573 45d4c81c Michael Hanselmann
     "Whether to ignore failures while removing instances"),
1574 45d4c81c Michael Hanselmann
    ("mode", constants.EXPORT_MODE_LOCAL, ht.TElemOf(constants.EXPORT_MODES),
1575 45d4c81c Michael Hanselmann
     "Export mode"),
1576 45d4c81c Michael Hanselmann
    ("x509_key_name", None, ht.TOr(ht.TList, ht.TNone),
1577 45d4c81c Michael Hanselmann
     "Name of X509 key (remote export only)"),
1578 45d4c81c Michael Hanselmann
    ("destination_x509_ca", None, ht.TMaybeString,
1579 45d4c81c Michael Hanselmann
     "Destination X509 CA (remote export only)"),
1580 17c3f802 Guido Trotter
    ]
1581 5c947f38 Iustin Pop
1582 0a7bed64 Michael Hanselmann
1583 ca5890ad Iustin Pop
class OpBackupRemove(OpCode):
1584 9ac99fda Guido Trotter
  """Remove an instance's export."""
1585 60dd1473 Iustin Pop
  OP_DSC_FIELD = "instance_name"
1586 65e183af Michael Hanselmann
  OP_PARAMS = [
1587 65e183af Michael Hanselmann
    _PInstanceName,
1588 65e183af Michael Hanselmann
    ]
1589 5c947f38 Iustin Pop
1590 0a7bed64 Michael Hanselmann
1591 5c947f38 Iustin Pop
# Tags opcodes
1592 c6afb1ca Iustin Pop
class OpTagsGet(OpCode):
1593 5c947f38 Iustin Pop
  """Returns the tags of the given object."""
1594 60dd1473 Iustin Pop
  OP_DSC_FIELD = "name"
1595 65e183af Michael Hanselmann
  OP_PARAMS = [
1596 65e183af Michael Hanselmann
    _PTagKind,
1597 65e183af Michael Hanselmann
    # Name is only meaningful for nodes and instances
1598 197b323b Michael Hanselmann
    ("name", ht.NoDefault, ht.TMaybeString, None),
1599 65e183af Michael Hanselmann
    ]
1600 5c947f38 Iustin Pop
1601 5c947f38 Iustin Pop
1602 715462e7 Iustin Pop
class OpTagsSearch(OpCode):
1603 73415719 Iustin Pop
  """Searches the tags in the cluster for a given pattern."""
1604 60dd1473 Iustin Pop
  OP_DSC_FIELD = "pattern"
1605 65e183af Michael Hanselmann
  OP_PARAMS = [
1606 197b323b Michael Hanselmann
    ("pattern", ht.NoDefault, ht.TNonEmptyString, None),
1607 65e183af Michael Hanselmann
    ]
1608 73415719 Iustin Pop
1609 73415719 Iustin Pop
1610 d1602edc Iustin Pop
class OpTagsSet(OpCode):
1611 f27302fa Iustin Pop
  """Add a list of tags on a given object."""
1612 65e183af Michael Hanselmann
  OP_PARAMS = [
1613 65e183af Michael Hanselmann
    _PTagKind,
1614 65e183af Michael Hanselmann
    _PTags,
1615 65e183af Michael Hanselmann
    # Name is only meaningful for nodes and instances
1616 197b323b Michael Hanselmann
    ("name", ht.NoDefault, ht.TMaybeString, None),
1617 65e183af Michael Hanselmann
    ]
1618 5c947f38 Iustin Pop
1619 5c947f38 Iustin Pop
1620 3f0ab95f Iustin Pop
class OpTagsDel(OpCode):
1621 f27302fa Iustin Pop
  """Remove a list of tags from a given object."""
1622 65e183af Michael Hanselmann
  OP_PARAMS = [
1623 65e183af Michael Hanselmann
    _PTagKind,
1624 65e183af Michael Hanselmann
    _PTags,
1625 65e183af Michael Hanselmann
    # Name is only meaningful for nodes and instances
1626 197b323b Michael Hanselmann
    ("name", ht.NoDefault, ht.TMaybeString, None),
1627 65e183af Michael Hanselmann
    ]
1628 06009e27 Iustin Pop
1629 e687ec01 Michael Hanselmann
1630 06009e27 Iustin Pop
# Test opcodes
1631 06009e27 Iustin Pop
class OpTestDelay(OpCode):
1632 06009e27 Iustin Pop
  """Sleeps for a configured amount of time.
1633 06009e27 Iustin Pop

1634 06009e27 Iustin Pop
  This is used just for debugging and testing.
1635 06009e27 Iustin Pop

1636 06009e27 Iustin Pop
  Parameters:
1637 06009e27 Iustin Pop
    - duration: the time to sleep
1638 06009e27 Iustin Pop
    - on_master: if true, sleep on the master
1639 06009e27 Iustin Pop
    - on_nodes: list of nodes in which to sleep
1640 06009e27 Iustin Pop

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

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

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

1651 06009e27 Iustin Pop
  """
1652 60dd1473 Iustin Pop
  OP_DSC_FIELD = "duration"
1653 65e183af Michael Hanselmann
  OP_PARAMS = [
1654 b795a775 Michael Hanselmann
    ("duration", ht.NoDefault, ht.TNumber, None),
1655 197b323b Michael Hanselmann
    ("on_master", True, ht.TBool, None),
1656 197b323b Michael Hanselmann
    ("on_nodes", ht.EmptyList, ht.TListOf(ht.TNonEmptyString), None),
1657 197b323b Michael Hanselmann
    ("repeat", 0, ht.TPositiveInt, None),
1658 65e183af Michael Hanselmann
    ]
1659 d61df03e Iustin Pop
1660 d61df03e Iustin Pop
1661 d61df03e Iustin Pop
class OpTestAllocator(OpCode):
1662 d61df03e Iustin Pop
  """Allocator framework testing.
1663 d61df03e Iustin Pop

1664 d61df03e Iustin Pop
  This opcode has two modes:
1665 d61df03e Iustin Pop
    - gather and return allocator input for a given mode (allocate new
1666 d61df03e Iustin Pop
      or replace secondary) and a given instance definition (direction
1667 d61df03e Iustin Pop
      'in')
1668 d61df03e Iustin Pop
    - run a selected allocator for a given operation (as above) and
1669 d61df03e Iustin Pop
      return the allocator output (direction 'out')
1670 d61df03e Iustin Pop

1671 d61df03e Iustin Pop
  """
1672 60dd1473 Iustin Pop
  OP_DSC_FIELD = "allocator"
1673 65e183af Michael Hanselmann
  OP_PARAMS = [
1674 65e183af Michael Hanselmann
    ("direction", ht.NoDefault,
1675 197b323b Michael Hanselmann
     ht.TElemOf(constants.VALID_IALLOCATOR_DIRECTIONS), None),
1676 197b323b Michael Hanselmann
    ("mode", ht.NoDefault, ht.TElemOf(constants.VALID_IALLOCATOR_MODES), None),
1677 197b323b Michael Hanselmann
    ("name", ht.NoDefault, ht.TNonEmptyString, None),
1678 65e183af Michael Hanselmann
    ("nics", ht.NoDefault, ht.TOr(ht.TNone, ht.TListOf(
1679 fdbe29ee Michael Hanselmann
     ht.TDictOf(ht.TElemOf([constants.INIC_MAC, constants.INIC_IP, "bridge"]),
1680 45d4c81c Michael Hanselmann
                ht.TOr(ht.TNone, ht.TNonEmptyString)))), None),
1681 197b323b Michael Hanselmann
    ("disks", ht.NoDefault, ht.TOr(ht.TNone, ht.TList), None),
1682 197b323b Michael Hanselmann
    ("hypervisor", None, ht.TMaybeString, None),
1683 197b323b Michael Hanselmann
    ("allocator", None, ht.TMaybeString, None),
1684 197b323b Michael Hanselmann
    ("tags", ht.EmptyList, ht.TListOf(ht.TNonEmptyString), None),
1685 dd47a0f0 Iustin Pop
    ("memory", None, ht.TOr(ht.TNone, ht.TPositiveInt), None),
1686 197b323b Michael Hanselmann
    ("vcpus", None, ht.TOr(ht.TNone, ht.TPositiveInt), None),
1687 197b323b Michael Hanselmann
    ("os", None, ht.TMaybeString, None),
1688 197b323b Michael Hanselmann
    ("disk_template", None, ht.TMaybeString, None),
1689 bee581e2 Michael Hanselmann
    ("instances", None, ht.TOr(ht.TNone, ht.TListOf(ht.TNonEmptyString)),
1690 bee581e2 Michael Hanselmann
     None),
1691 60152bbe Michael Hanselmann
    ("evac_mode", None,
1692 60152bbe Michael Hanselmann
     ht.TOr(ht.TNone, ht.TElemOf(constants.IALLOCATOR_NEVAC_MODES)), None),
1693 bee581e2 Michael Hanselmann
    ("target_groups", None, ht.TOr(ht.TNone, ht.TListOf(ht.TNonEmptyString)),
1694 bee581e2 Michael Hanselmann
     None),
1695 d61df03e Iustin Pop
    ]
1696 363acb1e Iustin Pop
1697 76aef8fc Michael Hanselmann
1698 b469eb4d Iustin Pop
class OpTestJqueue(OpCode):
1699 e58f87a9 Michael Hanselmann
  """Utility opcode to test some aspects of the job queue.
1700 e58f87a9 Michael Hanselmann

1701 e58f87a9 Michael Hanselmann
  """
1702 65e183af Michael Hanselmann
  OP_PARAMS = [
1703 197b323b Michael Hanselmann
    ("notify_waitlock", False, ht.TBool, None),
1704 197b323b Michael Hanselmann
    ("notify_exec", False, ht.TBool, None),
1705 197b323b Michael Hanselmann
    ("log_messages", ht.EmptyList, ht.TListOf(ht.TString), None),
1706 197b323b Michael Hanselmann
    ("fail", False, ht.TBool, None),
1707 e58f87a9 Michael Hanselmann
    ]
1708 e58f87a9 Michael Hanselmann
1709 e58f87a9 Michael Hanselmann
1710 be760ba8 Michael Hanselmann
class OpTestDummy(OpCode):
1711 be760ba8 Michael Hanselmann
  """Utility opcode used by unittests.
1712 be760ba8 Michael Hanselmann

1713 be760ba8 Michael Hanselmann
  """
1714 65e183af Michael Hanselmann
  OP_PARAMS = [
1715 197b323b Michael Hanselmann
    ("result", ht.NoDefault, ht.NoType, None),
1716 197b323b Michael Hanselmann
    ("messages", ht.NoDefault, ht.NoType, None),
1717 197b323b Michael Hanselmann
    ("fail", ht.NoDefault, ht.NoType, None),
1718 6a373640 Michael Hanselmann
    ("submit_jobs", None, ht.NoType, None),
1719 be760ba8 Michael Hanselmann
    ]
1720 687c10d9 Iustin Pop
  WITH_LU = False
1721 be760ba8 Michael Hanselmann
1722 be760ba8 Michael Hanselmann
1723 dbc96028 Michael Hanselmann
def _GetOpList():
1724 dbc96028 Michael Hanselmann
  """Returns list of all defined opcodes.
1725 dbc96028 Michael Hanselmann

1726 dbc96028 Michael Hanselmann
  Does not eliminate duplicates by C{OP_ID}.
1727 dbc96028 Michael Hanselmann

1728 dbc96028 Michael Hanselmann
  """
1729 dbc96028 Michael Hanselmann
  return [v for v in globals().values()
1730 dbc96028 Michael Hanselmann
          if (isinstance(v, type) and issubclass(v, OpCode) and
1731 687c10d9 Iustin Pop
              hasattr(v, "OP_ID") and v is not OpCode)]
1732 dbc96028 Michael Hanselmann
1733 dbc96028 Michael Hanselmann
1734 dbc96028 Michael Hanselmann
OP_MAPPING = dict((v.OP_ID, v) for v in _GetOpList())