Statistics
| Branch: | Tag: | Revision:

root / lib / opcodes.py @ c363310d

History | View | Annotate | Download (56.1 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 65e183af Michael Hanselmann
from ganeti import constants
40 65e183af Michael Hanselmann
from ganeti import errors
41 65e183af Michael Hanselmann
from ganeti import ht
42 65e183af Michael Hanselmann
43 65e183af Michael Hanselmann
44 65e183af Michael Hanselmann
# Common opcode attributes
45 65e183af Michael Hanselmann
46 65e183af Michael Hanselmann
#: output fields for a query operation
47 197b323b Michael Hanselmann
_POutputFields = ("output_fields", ht.NoDefault, ht.TListOf(ht.TNonEmptyString),
48 45d4c81c Michael Hanselmann
                  "Selected output fields")
49 65e183af Michael Hanselmann
50 65e183af Michael Hanselmann
#: the shutdown timeout
51 45d4c81c Michael Hanselmann
_PShutdownTimeout = \
52 45d4c81c Michael Hanselmann
  ("shutdown_timeout", constants.DEFAULT_SHUTDOWN_TIMEOUT, ht.TPositiveInt,
53 45d4c81c Michael Hanselmann
   "How long to wait for instance to shut down")
54 65e183af Michael Hanselmann
55 65e183af Michael Hanselmann
#: the force parameter
56 45d4c81c Michael Hanselmann
_PForce = ("force", False, ht.TBool, "Whether to force the operation")
57 65e183af Michael Hanselmann
58 65e183af Michael Hanselmann
#: a required instance name (for single-instance LUs)
59 45d4c81c Michael Hanselmann
_PInstanceName = ("instance_name", ht.NoDefault, ht.TNonEmptyString,
60 45d4c81c Michael Hanselmann
                  "Instance name")
61 65e183af Michael Hanselmann
62 65e183af Michael Hanselmann
#: Whether to ignore offline nodes
63 45d4c81c Michael Hanselmann
_PIgnoreOfflineNodes = ("ignore_offline_nodes", False, ht.TBool,
64 45d4c81c Michael Hanselmann
                        "Whether to ignore offline nodes")
65 65e183af Michael Hanselmann
66 65e183af Michael Hanselmann
#: a required node name (for single-node LUs)
67 45d4c81c Michael Hanselmann
_PNodeName = ("node_name", ht.NoDefault, ht.TNonEmptyString, "Node name")
68 65e183af Michael Hanselmann
69 65e183af Michael Hanselmann
#: a required node group name (for single-group LUs)
70 45d4c81c Michael Hanselmann
_PGroupName = ("group_name", ht.NoDefault, ht.TNonEmptyString, "Group name")
71 65e183af Michael Hanselmann
72 65e183af Michael Hanselmann
#: Migration type (live/non-live)
73 65e183af Michael Hanselmann
_PMigrationMode = ("mode", None,
74 197b323b Michael Hanselmann
                   ht.TOr(ht.TNone, ht.TElemOf(constants.HT_MIGRATION_MODES)),
75 45d4c81c Michael Hanselmann
                   "Migration mode")
76 65e183af Michael Hanselmann
77 65e183af Michael Hanselmann
#: Obsolete 'live' migration mode (boolean)
78 45d4c81c Michael Hanselmann
_PMigrationLive = ("live", None, ht.TMaybeBool,
79 45d4c81c Michael Hanselmann
                   "Legacy setting for live migration, do not use")
80 65e183af Michael Hanselmann
81 65e183af Michael Hanselmann
#: Tag type
82 197b323b Michael Hanselmann
_PTagKind = ("kind", ht.NoDefault, ht.TElemOf(constants.VALID_TAG_TYPES), None)
83 65e183af Michael Hanselmann
84 65e183af Michael Hanselmann
#: List of tag strings
85 197b323b Michael Hanselmann
_PTags = ("tags", ht.NoDefault, ht.TListOf(ht.TNonEmptyString), None)
86 65e183af Michael Hanselmann
87 45d4c81c Michael Hanselmann
_PForceVariant = ("force_variant", False, ht.TBool,
88 45d4c81c Michael Hanselmann
                  "Whether to force an unknown OS variant")
89 45d4c81c Michael Hanselmann
90 45d4c81c Michael Hanselmann
_PWaitForSync = ("wait_for_sync", True, ht.TBool,
91 45d4c81c Michael Hanselmann
                 "Whether to wait for the disk to synchronize")
92 45d4c81c Michael Hanselmann
93 45d4c81c Michael Hanselmann
_PIgnoreConsistency = ("ignore_consistency", False, ht.TBool,
94 45d4c81c Michael Hanselmann
                       "Whether to ignore disk consistency")
95 45d4c81c Michael Hanselmann
96 45d4c81c Michael Hanselmann
_PStorageName = ("name", ht.NoDefault, ht.TMaybeString, "Storage name")
97 45d4c81c Michael Hanselmann
98 45d4c81c Michael Hanselmann
_PUseLocking = ("use_locking", False, ht.TBool,
99 45d4c81c Michael Hanselmann
                "Whether to use synchronization")
100 45d4c81c Michael Hanselmann
101 45d4c81c Michael Hanselmann
_PNameCheck = ("name_check", True, ht.TBool, "Whether to check name")
102 45d4c81c Michael Hanselmann
103 45d4c81c Michael Hanselmann
_PNodeGroupAllocPolicy = \
104 45d4c81c Michael Hanselmann
  ("alloc_policy", None,
105 45d4c81c Michael Hanselmann
   ht.TOr(ht.TNone, ht.TElemOf(constants.VALID_ALLOC_POLICIES)),
106 45d4c81c Michael Hanselmann
   "Instance allocation policy")
107 45d4c81c Michael Hanselmann
108 45d4c81c Michael Hanselmann
_PGroupNodeParams = ("ndparams", None, ht.TMaybeDict,
109 45d4c81c Michael Hanselmann
                     "Default node parameters for group")
110 45d4c81c Michael Hanselmann
111 abd66bf8 Michael Hanselmann
_PQueryWhat = ("what", ht.NoDefault, ht.TElemOf(constants.QR_VIA_OP),
112 8e7078e0 Michael Hanselmann
               "Resource(s) to query for")
113 8e7078e0 Michael Hanselmann
114 e1f23243 Michael Hanselmann
_PEarlyRelease = ("early_release", False, ht.TBool,
115 e1f23243 Michael Hanselmann
                  "Whether to release locks as soon as possible")
116 e1f23243 Michael Hanselmann
117 45d4c81c Michael Hanselmann
_PIpCheckDoc = "Whether to ensure instance's IP address is inactive"
118 45d4c81c Michael Hanselmann
119 9b64e486 Iustin Pop
#: Do not remember instance state changes
120 6aac5aef Iustin Pop
_PNoRemember = ("no_remember", False, ht.TBool,
121 6aac5aef Iustin Pop
                "Do not remember the state change")
122 9b64e486 Iustin Pop
123 f8fa4175 Michael Hanselmann
#: Target node for instance migration/failover
124 f8fa4175 Michael Hanselmann
_PMigrationTargetNode = ("target_node", None, ht.TMaybeString,
125 f8fa4175 Michael Hanselmann
                         "Target node for shared-storage instances")
126 f8fa4175 Michael Hanselmann
127 323f9095 Stephen Shirley
_PStartupPaused = ("startup_paused", False, ht.TBool,
128 323f9095 Stephen Shirley
                   "Pause instance at startup")
129 323f9095 Stephen Shirley
130 57106b74 Michael Hanselmann
_PVerbose = ("verbose", False, ht.TBool, "Verbose mode")
131 57106b74 Michael Hanselmann
132 57106b74 Michael Hanselmann
# Parameters for cluster verification
133 57106b74 Michael Hanselmann
_PDebugSimulateErrors = ("debug_simulate_errors", False, ht.TBool,
134 57106b74 Michael Hanselmann
                         "Whether to simulate errors (useful for debugging)")
135 57106b74 Michael Hanselmann
_PErrorCodes = ("error_codes", False, ht.TBool, "Error codes")
136 57106b74 Michael Hanselmann
_PSkipChecks = ("skip_checks", ht.EmptyList,
137 57106b74 Michael Hanselmann
                ht.TListOf(ht.TElemOf(constants.VERIFY_OPTIONAL_CHECKS)),
138 57106b74 Michael Hanselmann
                "Which checks to skip")
139 93f2399e Andrea Spadaccini
_PIgnoreErrors = ("ignore_errors", ht.EmptyList,
140 93f2399e Andrea Spadaccini
                  ht.TListOf(ht.TElemOf(constants.CV_ALL_ECODES_STRINGS)),
141 93f2399e Andrea Spadaccini
                  "List of error codes that should be treated as warnings")
142 323f9095 Stephen Shirley
143 bc5d0215 Andrea Spadaccini
# Disk parameters
144 bc5d0215 Andrea Spadaccini
_PDiskParams = ("diskparams", None,
145 bc5d0215 Andrea Spadaccini
                ht.TOr(
146 bc5d0215 Andrea Spadaccini
                  ht.TDictOf(ht.TElemOf(constants.DISK_TEMPLATES), ht.TDict),
147 bc5d0215 Andrea Spadaccini
                  ht.TNone),
148 bc5d0215 Andrea Spadaccini
                "Disk templates' parameter defaults")
149 bc5d0215 Andrea Spadaccini
150 0ec2ce46 René Nussbaumer
# Parameters for node resource model
151 0ec2ce46 René Nussbaumer
_PHvState = ("hv_state", None, ht.TMaybeDict, "Set hypervisor states")
152 0ec2ce46 René Nussbaumer
_PDiskState = ("disk_state", None, ht.TMaybeDict, "Set disk states")
153 0ec2ce46 René Nussbaumer
154 b6aaf437 René Nussbaumer
155 b6aaf437 René Nussbaumer
_PIgnoreIpolicy = ("ignore_ipolicy", False, ht.TBool,
156 b6aaf437 René Nussbaumer
                   "Whether to ignore ipolicy violations")
157 b6aaf437 René Nussbaumer
158 8c0b16f6 Guido Trotter
# Allow runtime changes while migrating
159 8c0b16f6 Guido Trotter
_PAllowRuntimeChgs = ("allow_runtime_changes", True, ht.TBool,
160 8c0b16f6 Guido Trotter
                      "Allow runtime changes (eg. memory ballooning)")
161 8c0b16f6 Guido Trotter
162 8c0b16f6 Guido Trotter
163 ff0d18e6 Iustin Pop
#: OP_ID conversion regular expression
164 ff0d18e6 Iustin Pop
_OPID_RE = re.compile("([a-z])([A-Z])")
165 ff0d18e6 Iustin Pop
166 8c9ee749 Michael Hanselmann
#: Utility function for L{OpClusterSetParams}
167 8f227489 Michael Hanselmann
_TestClusterOsListItem = \
168 8f227489 Michael Hanselmann
  ht.TAnd(ht.TIsLength(2), ht.TItems([
169 8f227489 Michael Hanselmann
    ht.TElemOf(constants.DDMS_VALUES),
170 8f227489 Michael Hanselmann
    ht.TNonEmptyString,
171 8f227489 Michael Hanselmann
    ]))
172 8c9ee749 Michael Hanselmann
173 ff8067cf Michael Hanselmann
_TestClusterOsList = ht.TMaybeListOf(_TestClusterOsListItem)
174 ff0d18e6 Iustin Pop
175 526a662a Michael Hanselmann
# TODO: Generate check from constants.INIC_PARAMS_TYPES
176 526a662a Michael Hanselmann
#: Utility function for testing NIC definitions
177 20a32e74 Michael Hanselmann
_TestNicDef = \
178 20a32e74 Michael Hanselmann
  ht.Comment("NIC parameters")(ht.TDictOf(ht.TElemOf(constants.INIC_PARAMS),
179 20a32e74 Michael Hanselmann
                                          ht.TOr(ht.TNone, ht.TNonEmptyString)))
180 526a662a Michael Hanselmann
181 1456df62 Michael Hanselmann
_TSetParamsResultItemItems = [
182 1456df62 Michael Hanselmann
  ht.Comment("name of changed parameter")(ht.TNonEmptyString),
183 b3d2ee31 Michael Hanselmann
  ht.Comment("new value")(ht.TAny),
184 1456df62 Michael Hanselmann
  ]
185 1456df62 Michael Hanselmann
186 1456df62 Michael Hanselmann
_TSetParamsResult = \
187 1456df62 Michael Hanselmann
  ht.TListOf(ht.TAnd(ht.TIsLength(len(_TSetParamsResultItemItems)),
188 1456df62 Michael Hanselmann
                     ht.TItems(_TSetParamsResultItemItems)))
189 1456df62 Michael Hanselmann
190 735e1318 Michael Hanselmann
# TODO: Generate check from constants.IDISK_PARAMS_TYPES (however, not all users
191 735e1318 Michael Hanselmann
# of this check support all parameters)
192 20a32e74 Michael Hanselmann
_TDiskParams = \
193 20a32e74 Michael Hanselmann
  ht.Comment("Disk parameters")(ht.TDictOf(ht.TElemOf(constants.IDISK_PARAMS),
194 20a32e74 Michael Hanselmann
                                           ht.TOr(ht.TNonEmptyString, ht.TInt)))
195 735e1318 Michael Hanselmann
196 3ce9a5e7 Michael Hanselmann
_SUMMARY_PREFIX = {
197 3ce9a5e7 Michael Hanselmann
  "CLUSTER_": "C_",
198 3ce9a5e7 Michael Hanselmann
  "GROUP_": "G_",
199 3ce9a5e7 Michael Hanselmann
  "NODE_": "N_",
200 3ce9a5e7 Michael Hanselmann
  "INSTANCE_": "I_",
201 3ce9a5e7 Michael Hanselmann
  }
202 3ce9a5e7 Michael Hanselmann
203 b95479a5 Michael Hanselmann
#: Attribute name for dependencies
204 b95479a5 Michael Hanselmann
DEPEND_ATTR = "depends"
205 b95479a5 Michael Hanselmann
206 018ae30b Michael Hanselmann
#: Attribute name for comment
207 018ae30b Michael Hanselmann
COMMENT_ATTR = "comment"
208 018ae30b Michael Hanselmann
209 526a662a Michael Hanselmann
210 ff0d18e6 Iustin Pop
def _NameToId(name):
211 ff0d18e6 Iustin Pop
  """Convert an opcode class name to an OP_ID.
212 ff0d18e6 Iustin Pop

213 ff0d18e6 Iustin Pop
  @type name: string
214 ff0d18e6 Iustin Pop
  @param name: the class name, as OpXxxYyy
215 ff0d18e6 Iustin Pop
  @rtype: string
216 ff0d18e6 Iustin Pop
  @return: the name in the OP_XXXX_YYYY format
217 ff0d18e6 Iustin Pop

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

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

237 65e183af Michael Hanselmann
  @raise errors.OpPrereqError: when file storage is disabled
238 65e183af Michael Hanselmann

239 65e183af Michael Hanselmann
  """
240 65e183af Michael Hanselmann
  if not constants.ENABLE_FILE_STORAGE:
241 65e183af Michael Hanselmann
    raise errors.OpPrereqError("File storage disabled at configure time",
242 65e183af Michael Hanselmann
                               errors.ECODE_INVAL)
243 65e183af Michael Hanselmann
244 65e183af Michael Hanselmann
245 4b97f902 Apollon Oikonomopoulos
def RequireSharedFileStorage():
246 4b97f902 Apollon Oikonomopoulos
  """Checks that shared file storage is enabled.
247 4b97f902 Apollon Oikonomopoulos

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

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

253 4b97f902 Apollon Oikonomopoulos
  """
254 4b97f902 Apollon Oikonomopoulos
  if not constants.ENABLE_SHARED_FILE_STORAGE:
255 4b97f902 Apollon Oikonomopoulos
    raise errors.OpPrereqError("Shared file storage disabled at"
256 4b97f902 Apollon Oikonomopoulos
                               " configure time", errors.ECODE_INVAL)
257 4b97f902 Apollon Oikonomopoulos
258 4b97f902 Apollon Oikonomopoulos
259 8c9ee749 Michael Hanselmann
@ht.WithDesc("CheckFileStorage")
260 8c9ee749 Michael Hanselmann
def _CheckFileStorage(value):
261 8c9ee749 Michael Hanselmann
  """Ensures file storage is enabled if used.
262 65e183af Michael Hanselmann

263 65e183af Michael Hanselmann
  """
264 8c9ee749 Michael Hanselmann
  if value == constants.DT_FILE:
265 65e183af Michael Hanselmann
    RequireFileStorage()
266 4b97f902 Apollon Oikonomopoulos
  elif value == constants.DT_SHARED_FILE:
267 4b97f902 Apollon Oikonomopoulos
    RequireSharedFileStorage()
268 65e183af Michael Hanselmann
  return True
269 65e183af Michael Hanselmann
270 65e183af Michael Hanselmann
271 45fe090b Michael Hanselmann
def _BuildDiskTemplateCheck(accept_none):
272 45fe090b Michael Hanselmann
  """Builds check for disk template.
273 45fe090b Michael Hanselmann

274 45fe090b Michael Hanselmann
  @type accept_none: bool
275 45fe090b Michael Hanselmann
  @param accept_none: whether to accept None as a correct value
276 45fe090b Michael Hanselmann
  @rtype: callable
277 45fe090b Michael Hanselmann

278 45fe090b Michael Hanselmann
  """
279 45fe090b Michael Hanselmann
  template_check = ht.TElemOf(constants.DISK_TEMPLATES)
280 45fe090b Michael Hanselmann
281 45fe090b Michael Hanselmann
  if accept_none:
282 45fe090b Michael Hanselmann
    template_check = ht.TOr(template_check, ht.TNone)
283 45fe090b Michael Hanselmann
284 45fe090b Michael Hanselmann
  return ht.TAnd(template_check, _CheckFileStorage)
285 8c9ee749 Michael Hanselmann
286 8c9ee749 Michael Hanselmann
287 65e183af Michael Hanselmann
def _CheckStorageType(storage_type):
288 65e183af Michael Hanselmann
  """Ensure a given storage type is valid.
289 65e183af Michael Hanselmann

290 65e183af Michael Hanselmann
  """
291 65e183af Michael Hanselmann
  if storage_type not in constants.VALID_STORAGE_TYPES:
292 65e183af Michael Hanselmann
    raise errors.OpPrereqError("Unknown storage type: %s" % storage_type,
293 65e183af Michael Hanselmann
                               errors.ECODE_INVAL)
294 65e183af Michael Hanselmann
  if storage_type == constants.ST_FILE:
295 65e183af Michael Hanselmann
    RequireFileStorage()
296 65e183af Michael Hanselmann
  return True
297 65e183af Michael Hanselmann
298 65e183af Michael Hanselmann
299 65e183af Michael Hanselmann
#: Storage type parameter
300 45d4c81c Michael Hanselmann
_PStorageType = ("storage_type", ht.NoDefault, _CheckStorageType,
301 45d4c81c Michael Hanselmann
                 "Storage type")
302 65e183af Michael Hanselmann
303 65e183af Michael Hanselmann
304 65e183af Michael Hanselmann
class _AutoOpParamSlots(type):
305 65e183af Michael Hanselmann
  """Meta class for opcode definitions.
306 65e183af Michael Hanselmann

307 65e183af Michael Hanselmann
  """
308 65e183af Michael Hanselmann
  def __new__(mcs, name, bases, attrs):
309 65e183af Michael Hanselmann
    """Called when a class should be created.
310 65e183af Michael Hanselmann

311 65e183af Michael Hanselmann
    @param mcs: The meta class
312 65e183af Michael Hanselmann
    @param name: Name of created class
313 65e183af Michael Hanselmann
    @param bases: Base classes
314 65e183af Michael Hanselmann
    @type attrs: dict
315 65e183af Michael Hanselmann
    @param attrs: Class attributes
316 65e183af Michael Hanselmann

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

341 0e46916d Iustin Pop
  This object serves as a parent class for OpCode without any custom
342 0e46916d Iustin Pop
  field handling.
343 0e46916d Iustin Pop

344 df458e0b Iustin Pop
  """
345 b459a848 Andrea Spadaccini
  # pylint: disable=E1101
346 e89a9021 Iustin Pop
  # as OP_ID is dynamically defined
347 65e183af Michael Hanselmann
  __metaclass__ = _AutoOpParamSlots
348 65e183af Michael Hanselmann
349 a8083063 Iustin Pop
  def __init__(self, **kwargs):
350 a7399f66 Iustin Pop
    """Constructor for BaseOpCode.
351 a7399f66 Iustin Pop

352 a7399f66 Iustin Pop
    The constructor takes only keyword arguments and will set
353 a7399f66 Iustin Pop
    attributes on this object based on the passed arguments. As such,
354 a7399f66 Iustin Pop
    it means that you should not pass arguments which are not in the
355 a7399f66 Iustin Pop
    __slots__ attribute for this class.
356 a7399f66 Iustin Pop

357 a7399f66 Iustin Pop
    """
358 adf385c7 Iustin Pop
    slots = self._all_slots()
359 a8083063 Iustin Pop
    for key in kwargs:
360 adf385c7 Iustin Pop
      if key not in slots:
361 df458e0b Iustin Pop
        raise TypeError("Object %s doesn't support the parameter '%s'" %
362 3ecf6786 Iustin Pop
                        (self.__class__.__name__, key))
363 a8083063 Iustin Pop
      setattr(self, key, kwargs[key])
364 a8083063 Iustin Pop
365 df458e0b Iustin Pop
  def __getstate__(self):
366 a7399f66 Iustin Pop
    """Generic serializer.
367 a7399f66 Iustin Pop

368 a7399f66 Iustin Pop
    This method just returns the contents of the instance as a
369 a7399f66 Iustin Pop
    dictionary.
370 a7399f66 Iustin Pop

371 a7399f66 Iustin Pop
    @rtype:  C{dict}
372 a7399f66 Iustin Pop
    @return: the instance attributes and their values
373 a7399f66 Iustin Pop

374 a7399f66 Iustin Pop
    """
375 df458e0b Iustin Pop
    state = {}
376 adf385c7 Iustin Pop
    for name in self._all_slots():
377 df458e0b Iustin Pop
      if hasattr(self, name):
378 df458e0b Iustin Pop
        state[name] = getattr(self, name)
379 df458e0b Iustin Pop
    return state
380 df458e0b Iustin Pop
381 df458e0b Iustin Pop
  def __setstate__(self, state):
382 a7399f66 Iustin Pop
    """Generic unserializer.
383 a7399f66 Iustin Pop

384 a7399f66 Iustin Pop
    This method just restores from the serialized state the attributes
385 a7399f66 Iustin Pop
    of the current instance.
386 a7399f66 Iustin Pop

387 a7399f66 Iustin Pop
    @param state: the serialized opcode data
388 a7399f66 Iustin Pop
    @type state:  C{dict}
389 a7399f66 Iustin Pop

390 a7399f66 Iustin Pop
    """
391 df458e0b Iustin Pop
    if not isinstance(state, dict):
392 df458e0b Iustin Pop
      raise ValueError("Invalid data to __setstate__: expected dict, got %s" %
393 df458e0b Iustin Pop
                       type(state))
394 df458e0b Iustin Pop
395 adf385c7 Iustin Pop
    for name in self._all_slots():
396 44db3a6f Iustin Pop
      if name not in state and hasattr(self, name):
397 df458e0b Iustin Pop
        delattr(self, name)
398 df458e0b Iustin Pop
399 df458e0b Iustin Pop
    for name in state:
400 df458e0b Iustin Pop
      setattr(self, name, state[name])
401 df458e0b Iustin Pop
402 adf385c7 Iustin Pop
  @classmethod
403 adf385c7 Iustin Pop
  def _all_slots(cls):
404 adf385c7 Iustin Pop
    """Compute the list of all declared slots for a class.
405 adf385c7 Iustin Pop

406 adf385c7 Iustin Pop
    """
407 adf385c7 Iustin Pop
    slots = []
408 adf385c7 Iustin Pop
    for parent in cls.__mro__:
409 adf385c7 Iustin Pop
      slots.extend(getattr(parent, "__slots__", []))
410 adf385c7 Iustin Pop
    return slots
411 adf385c7 Iustin Pop
412 65e183af Michael Hanselmann
  @classmethod
413 65e183af Michael Hanselmann
  def GetAllParams(cls):
414 65e183af Michael Hanselmann
    """Compute list of all parameters for an opcode.
415 65e183af Michael Hanselmann

416 65e183af Michael Hanselmann
    """
417 65e183af Michael Hanselmann
    slots = []
418 65e183af Michael Hanselmann
    for parent in cls.__mro__:
419 65e183af Michael Hanselmann
      slots.extend(getattr(parent, "OP_PARAMS", []))
420 65e183af Michael Hanselmann
    return slots
421 65e183af Michael Hanselmann
422 1cbef6d8 Michael Hanselmann
  def Validate(self, set_defaults):
423 1cbef6d8 Michael Hanselmann
    """Validate opcode parameters, optionally setting default values.
424 1cbef6d8 Michael Hanselmann

425 1cbef6d8 Michael Hanselmann
    @type set_defaults: bool
426 1cbef6d8 Michael Hanselmann
    @param set_defaults: Whether to set default values
427 1cbef6d8 Michael Hanselmann
    @raise errors.OpPrereqError: When a parameter value doesn't match
428 1cbef6d8 Michael Hanselmann
                                 requirements
429 1cbef6d8 Michael Hanselmann

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

463 b247c6fc Michael Hanselmann
  @type relative: bool
464 b247c6fc Michael Hanselmann
  @param relative: Whether to accept relative job IDs (negative)
465 b247c6fc Michael Hanselmann
  @rtype: callable
466 b247c6fc Michael Hanselmann

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

501 a7399f66 Iustin Pop
  This is the root of the actual OpCode hierarchy. All clases derived
502 a7399f66 Iustin Pop
  from this class should override OP_ID.
503 a7399f66 Iustin Pop

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

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

539 a7399f66 Iustin Pop
    This method adds to the state dictionary the OP_ID of the class,
540 a7399f66 Iustin Pop
    so that on unload we can identify the correct class for
541 a7399f66 Iustin Pop
    instantiating the opcode.
542 a7399f66 Iustin Pop

543 a7399f66 Iustin Pop
    @rtype:   C{dict}
544 a7399f66 Iustin Pop
    @return:  the state as a dictionary
545 a7399f66 Iustin Pop

546 df458e0b Iustin Pop
    """
547 0e46916d Iustin Pop
    data = BaseOpCode.__getstate__(self)
548 df458e0b Iustin Pop
    data["OP_ID"] = self.OP_ID
549 df458e0b Iustin Pop
    return data
550 df458e0b Iustin Pop
551 df458e0b Iustin Pop
  @classmethod
552 00abdc96 Iustin Pop
  def LoadOpCode(cls, data):
553 df458e0b Iustin Pop
    """Generic load opcode method.
554 df458e0b Iustin Pop

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

559 a7399f66 Iustin Pop
    @type data:  C{dict}
560 a7399f66 Iustin Pop
    @param data: the serialized opcode
561 a7399f66 Iustin Pop

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

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

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

604 3ce9a5e7 Michael Hanselmann
    """
605 3ce9a5e7 Michael Hanselmann
    assert self.OP_ID.startswith("OP_")
606 3ce9a5e7 Michael Hanselmann
607 3ce9a5e7 Michael Hanselmann
    text = self.OP_ID[3:]
608 3ce9a5e7 Michael Hanselmann
609 3ce9a5e7 Michael Hanselmann
    for (prefix, supplement) in _SUMMARY_PREFIX.items():
610 3ce9a5e7 Michael Hanselmann
      if text.startswith(prefix):
611 3ce9a5e7 Michael Hanselmann
        return supplement + text[len(prefix):]
612 3ce9a5e7 Michael Hanselmann
613 3ce9a5e7 Michael Hanselmann
    return text
614 3ce9a5e7 Michael Hanselmann
615 a8083063 Iustin Pop
616 afee0879 Iustin Pop
# cluster opcodes
617 afee0879 Iustin Pop
618 bc84ffa7 Iustin Pop
class OpClusterPostInit(OpCode):
619 b5f5fae9 Luca Bigliardi
  """Post cluster initialization.
620 b5f5fae9 Luca Bigliardi

621 b5f5fae9 Luca Bigliardi
  This opcode does not touch the cluster at all. Its purpose is to run hooks
622 b5f5fae9 Luca Bigliardi
  after the cluster has been initialized.
623 b5f5fae9 Luca Bigliardi

624 b5f5fae9 Luca Bigliardi
  """
625 c363310d René Nussbaumer
  OP_RESULT = ht.TBool
626 b5f5fae9 Luca Bigliardi
627 b5f5fae9 Luca Bigliardi
628 c6d43e9e Iustin Pop
class OpClusterDestroy(OpCode):
629 a7399f66 Iustin Pop
  """Destroy the cluster.
630 a7399f66 Iustin Pop

631 a7399f66 Iustin Pop
  This opcode has no other parameters. All the state is irreversibly
632 a7399f66 Iustin Pop
  lost after the execution of this opcode.
633 a7399f66 Iustin Pop

634 a7399f66 Iustin Pop
  """
635 c363310d René Nussbaumer
  OP_RESULT = ht.TNonEmptyString
636 a8083063 Iustin Pop
637 a8083063 Iustin Pop
638 a2f7ab92 Iustin Pop
class OpClusterQuery(OpCode):
639 fdc267f4 Iustin Pop
  """Query cluster information."""
640 a8083063 Iustin Pop
641 a8083063 Iustin Pop
642 fcad7225 Michael Hanselmann
class OpClusterVerify(OpCode):
643 fcad7225 Michael Hanselmann
  """Submits all jobs necessary to verify the cluster.
644 fcad7225 Michael Hanselmann

645 fcad7225 Michael Hanselmann
  """
646 fcad7225 Michael Hanselmann
  OP_PARAMS = [
647 fcad7225 Michael Hanselmann
    _PDebugSimulateErrors,
648 fcad7225 Michael Hanselmann
    _PErrorCodes,
649 fcad7225 Michael Hanselmann
    _PSkipChecks,
650 93f2399e Andrea Spadaccini
    _PIgnoreErrors,
651 fcad7225 Michael Hanselmann
    _PVerbose,
652 fcad7225 Michael Hanselmann
    ("group_name", None, ht.TMaybeString, "Group to verify")
653 fcad7225 Michael Hanselmann
    ]
654 f7686867 Michael Hanselmann
  OP_RESULT = TJobIdListOnly
655 fcad7225 Michael Hanselmann
656 fcad7225 Michael Hanselmann
657 bf93ae69 Adeodato Simo
class OpClusterVerifyConfig(OpCode):
658 bf93ae69 Adeodato Simo
  """Verify the cluster config.
659 bf93ae69 Adeodato Simo

660 bf93ae69 Adeodato Simo
  """
661 bf93ae69 Adeodato Simo
  OP_PARAMS = [
662 57106b74 Michael Hanselmann
    _PDebugSimulateErrors,
663 57106b74 Michael Hanselmann
    _PErrorCodes,
664 93f2399e Andrea Spadaccini
    _PIgnoreErrors,
665 57106b74 Michael Hanselmann
    _PVerbose,
666 bf93ae69 Adeodato Simo
    ]
667 f7686867 Michael Hanselmann
  OP_RESULT = ht.TBool
668 bf93ae69 Adeodato Simo
669 bf93ae69 Adeodato Simo
670 bf93ae69 Adeodato Simo
class OpClusterVerifyGroup(OpCode):
671 bf93ae69 Adeodato Simo
  """Run verify on a node group from the cluster.
672 a7399f66 Iustin Pop

673 a7399f66 Iustin Pop
  @type skip_checks: C{list}
674 a7399f66 Iustin Pop
  @ivar skip_checks: steps to be skipped from the verify process; this
675 a7399f66 Iustin Pop
                     needs to be a subset of
676 a7399f66 Iustin Pop
                     L{constants.VERIFY_OPTIONAL_CHECKS}; currently
677 a7399f66 Iustin Pop
                     only L{constants.VERIFY_NPLUSONE_MEM} can be passed
678 a7399f66 Iustin Pop

679 a7399f66 Iustin Pop
  """
680 bf93ae69 Adeodato Simo
  OP_DSC_FIELD = "group_name"
681 65e183af Michael Hanselmann
  OP_PARAMS = [
682 57106b74 Michael Hanselmann
    _PGroupName,
683 57106b74 Michael Hanselmann
    _PDebugSimulateErrors,
684 57106b74 Michael Hanselmann
    _PErrorCodes,
685 57106b74 Michael Hanselmann
    _PSkipChecks,
686 93f2399e Andrea Spadaccini
    _PIgnoreErrors,
687 57106b74 Michael Hanselmann
    _PVerbose,
688 65e183af Michael Hanselmann
    ]
689 f7686867 Michael Hanselmann
  OP_RESULT = ht.TBool
690 a8083063 Iustin Pop
691 a8083063 Iustin Pop
692 bd8210a7 Iustin Pop
class OpClusterVerifyDisks(OpCode):
693 150e978f Iustin Pop
  """Verify the cluster disks.
694 150e978f Iustin Pop

695 ae1a845c Michael Hanselmann
  """
696 f7686867 Michael Hanselmann
  OP_RESULT = TJobIdListOnly
697 ae1a845c Michael Hanselmann
698 ae1a845c Michael Hanselmann
699 ae1a845c Michael Hanselmann
class OpGroupVerifyDisks(OpCode):
700 ae1a845c Michael Hanselmann
  """Verifies the status of all disks in a node group.
701 150e978f Iustin Pop

702 ae1a845c Michael Hanselmann
  Result: a tuple of three elements:
703 ae1a845c Michael Hanselmann
    - dict of node names with issues (values: error msg)
704 150e978f Iustin Pop
    - list of instances with degraded disks (that should be activated)
705 b63ed789 Iustin Pop
    - dict of instances with missing logical volumes (values: (node, vol)
706 b63ed789 Iustin Pop
      pairs with details about the missing volumes)
707 150e978f Iustin Pop

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

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

716 150e978f Iustin Pop
  """
717 ae1a845c Michael Hanselmann
  OP_DSC_FIELD = "group_name"
718 ae1a845c Michael Hanselmann
  OP_PARAMS = [
719 ae1a845c Michael Hanselmann
    _PGroupName,
720 ae1a845c Michael Hanselmann
    ]
721 1ce03fb1 Michael Hanselmann
  OP_RESULT = \
722 1ce03fb1 Michael Hanselmann
    ht.TAnd(ht.TIsLength(3),
723 1ce03fb1 Michael Hanselmann
            ht.TItems([ht.TDictOf(ht.TString, ht.TString),
724 1ce03fb1 Michael Hanselmann
                       ht.TListOf(ht.TString),
725 6973587f Michael Hanselmann
                       ht.TDictOf(ht.TString,
726 6973587f Michael Hanselmann
                                  ht.TListOf(ht.TListOf(ht.TString)))]))
727 150e978f Iustin Pop
728 150e978f Iustin Pop
729 5d01aca3 Iustin Pop
class OpClusterRepairDiskSizes(OpCode):
730 60975797 Iustin Pop
  """Verify the disk sizes of the instances and fixes configuration
731 60975797 Iustin Pop
  mimatches.
732 60975797 Iustin Pop

733 60975797 Iustin Pop
  Parameters: optional instances list, in case we want to restrict the
734 60975797 Iustin Pop
  checks to only a subset of the instances.
735 60975797 Iustin Pop

736 60975797 Iustin Pop
  Result: a list of tuples, (instance, disk, new-size) for changed
737 60975797 Iustin Pop
  configurations.
738 60975797 Iustin Pop

739 60975797 Iustin Pop
  In normal operation, the list should be empty.
740 60975797 Iustin Pop

741 60975797 Iustin Pop
  @type instances: list
742 60975797 Iustin Pop
  @ivar instances: the list of instances to check, or empty for all instances
743 60975797 Iustin Pop

744 60975797 Iustin Pop
  """
745 65e183af Michael Hanselmann
  OP_PARAMS = [
746 197b323b Michael Hanselmann
    ("instances", ht.EmptyList, ht.TListOf(ht.TNonEmptyString), None),
747 65e183af Michael Hanselmann
    ]
748 c363310d René Nussbaumer
  OP_RESULT = ht.TListOf(ht.TAnd(ht.TIsLength(3),
749 c363310d René Nussbaumer
                                 ht.TItems([ht.TNonEmptyString,
750 c363310d René Nussbaumer
                                            ht.TPositiveInt,
751 c363310d René Nussbaumer
                                            ht.TPositiveInt])))
752 60975797 Iustin Pop
753 60975797 Iustin Pop
754 2f093ea0 Iustin Pop
class OpClusterConfigQuery(OpCode):
755 ae5849b5 Michael Hanselmann
  """Query cluster configuration values."""
756 65e183af Michael Hanselmann
  OP_PARAMS = [
757 65e183af Michael Hanselmann
    _POutputFields
758 65e183af Michael Hanselmann
    ]
759 c363310d René Nussbaumer
  OP_RESULT = ht.TListOf(ht.TAny)
760 a8083063 Iustin Pop
761 a8083063 Iustin Pop
762 e126df25 Iustin Pop
class OpClusterRename(OpCode):
763 a7399f66 Iustin Pop
  """Rename the cluster.
764 a7399f66 Iustin Pop

765 a7399f66 Iustin Pop
  @type name: C{str}
766 a7399f66 Iustin Pop
  @ivar name: The new name of the cluster. The name and/or the master IP
767 a7399f66 Iustin Pop
              address will be changed to match the new name and its IP
768 a7399f66 Iustin Pop
              address.
769 a7399f66 Iustin Pop

770 a7399f66 Iustin Pop
  """
771 60dd1473 Iustin Pop
  OP_DSC_FIELD = "name"
772 65e183af Michael Hanselmann
  OP_PARAMS = [
773 197b323b Michael Hanselmann
    ("name", ht.NoDefault, ht.TNonEmptyString, None),
774 65e183af Michael Hanselmann
    ]
775 c363310d René Nussbaumer
  OP_RESULT = ht.TNonEmptyString
776 07bd8a51 Iustin Pop
777 07bd8a51 Iustin Pop
778 a6682fdc Iustin Pop
class OpClusterSetParams(OpCode):
779 a7399f66 Iustin Pop
  """Change the parameters of the cluster.
780 a7399f66 Iustin Pop

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

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

850 afee0879 Iustin Pop
  """
851 c363310d René Nussbaumer
  OP_RESULT = ht.TNone
852 afee0879 Iustin Pop
853 83f72637 Michael Hanselmann
854 fb926117 Andrea Spadaccini
class OpClusterActivateMasterIp(OpCode):
855 fb926117 Andrea Spadaccini
  """Activate the master IP on the master node.
856 fb926117 Andrea Spadaccini

857 fb926117 Andrea Spadaccini
  """
858 c363310d René Nussbaumer
  OP_RESULT = ht.TNone
859 fb926117 Andrea Spadaccini
860 fb926117 Andrea Spadaccini
861 fb926117 Andrea Spadaccini
class OpClusterDeactivateMasterIp(OpCode):
862 fb926117 Andrea Spadaccini
  """Deactivate the master IP on the master node.
863 fb926117 Andrea Spadaccini

864 fb926117 Andrea Spadaccini
  """
865 c363310d René Nussbaumer
  OP_RESULT = ht.TNone
866 fb926117 Andrea Spadaccini
867 fb926117 Andrea Spadaccini
868 83f72637 Michael Hanselmann
class OpQuery(OpCode):
869 83f72637 Michael Hanselmann
  """Query for resources/items.
870 83f72637 Michael Hanselmann

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

875 83f72637 Michael Hanselmann
  """
876 e50d8412 Michael Hanselmann
  OP_DSC_FIELD = "what"
877 65e183af Michael Hanselmann
  OP_PARAMS = [
878 8e7078e0 Michael Hanselmann
    _PQueryWhat,
879 ee13764f Michael Hanselmann
    _PUseLocking,
880 45d4c81c Michael Hanselmann
    ("fields", ht.NoDefault, ht.TListOf(ht.TNonEmptyString),
881 45d4c81c Michael Hanselmann
     "Requested fields"),
882 2e5c33db Iustin Pop
    ("qfilter", None, ht.TOr(ht.TNone, ht.TListOf),
883 45d4c81c Michael Hanselmann
     "Query filter"),
884 83f72637 Michael Hanselmann
    ]
885 83f72637 Michael Hanselmann
886 83f72637 Michael Hanselmann
887 83f72637 Michael Hanselmann
class OpQueryFields(OpCode):
888 83f72637 Michael Hanselmann
  """Query for available resource/item fields.
889 83f72637 Michael Hanselmann

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

893 83f72637 Michael Hanselmann
  """
894 e50d8412 Michael Hanselmann
  OP_DSC_FIELD = "what"
895 65e183af Michael Hanselmann
  OP_PARAMS = [
896 8e7078e0 Michael Hanselmann
    _PQueryWhat,
897 ff8067cf Michael Hanselmann
    ("fields", None, ht.TMaybeListOf(ht.TNonEmptyString),
898 8e7078e0 Michael Hanselmann
     "Requested fields; if not given, all are returned"),
899 83f72637 Michael Hanselmann
    ]
900 83f72637 Michael Hanselmann
901 83f72637 Michael Hanselmann
902 792af3ad René Nussbaumer
class OpOobCommand(OpCode):
903 eb64da59 René Nussbaumer
  """Interact with OOB."""
904 65e183af Michael Hanselmann
  OP_PARAMS = [
905 c4ec0755 René Nussbaumer
    ("node_names", ht.EmptyList, ht.TListOf(ht.TNonEmptyString),
906 c4ec0755 René Nussbaumer
     "List of nodes to run the OOB command against"),
907 c4ec0755 René Nussbaumer
    ("command", None, ht.TElemOf(constants.OOB_COMMANDS),
908 c4ec0755 René Nussbaumer
     "OOB command to be run"),
909 c4ec0755 René Nussbaumer
    ("timeout", constants.OOB_TIMEOUT, ht.TInt,
910 c4ec0755 René Nussbaumer
     "Timeout before the OOB helper will be terminated"),
911 c4ec0755 René Nussbaumer
    ("ignore_status", False, ht.TBool,
912 c4ec0755 René Nussbaumer
     "Ignores the node offline status for power off"),
913 beff3779 René Nussbaumer
    ("power_delay", constants.OOB_POWER_DELAY, ht.TPositiveFloat,
914 beff3779 René Nussbaumer
     "Time in seconds to wait between powering on nodes"),
915 eb64da59 René Nussbaumer
    ]
916 c363310d René Nussbaumer
  # Fixme: Make it more specific with all the special cases in LUOobCommand
917 c363310d René Nussbaumer
  OP_RESULT = ht.TListOf(ht.TAnd(ht.TIsLength(2),
918 c363310d René Nussbaumer
                                 ht.TItems([ht.TElemOf(constants.RS_ALL),
919 c363310d René Nussbaumer
                                            ht.TAny])))
920 eb64da59 René Nussbaumer
921 eb64da59 René Nussbaumer
922 07bd8a51 Iustin Pop
# node opcodes
923 07bd8a51 Iustin Pop
924 73d565a3 Iustin Pop
class OpNodeRemove(OpCode):
925 a7399f66 Iustin Pop
  """Remove a node.
926 a7399f66 Iustin Pop

927 a7399f66 Iustin Pop
  @type node_name: C{str}
928 a7399f66 Iustin Pop
  @ivar node_name: The name of the node to remove. If the node still has
929 a7399f66 Iustin Pop
                   instances on it, the operation will fail.
930 a7399f66 Iustin Pop

931 a7399f66 Iustin Pop
  """
932 60dd1473 Iustin Pop
  OP_DSC_FIELD = "node_name"
933 65e183af Michael Hanselmann
  OP_PARAMS = [
934 65e183af Michael Hanselmann
    _PNodeName,
935 65e183af Michael Hanselmann
    ]
936 c363310d René Nussbaumer
  OP_RESULT = ht.TNone
937 a8083063 Iustin Pop
938 a8083063 Iustin Pop
939 d817d49f Iustin Pop
class OpNodeAdd(OpCode):
940 a7399f66 Iustin Pop
  """Add a node to the cluster.
941 a7399f66 Iustin Pop

942 a7399f66 Iustin Pop
  @type node_name: C{str}
943 a7399f66 Iustin Pop
  @ivar node_name: The name of the node to add. This can be a short name,
944 a7399f66 Iustin Pop
                   but it will be expanded to the FQDN.
945 a7399f66 Iustin Pop
  @type primary_ip: IP address
946 a7399f66 Iustin Pop
  @ivar primary_ip: The primary IP of the node. This will be ignored when the
947 a7399f66 Iustin Pop
                    opcode is submitted, but will be filled during the node
948 a7399f66 Iustin Pop
                    add (so it will be visible in the job query).
949 a7399f66 Iustin Pop
  @type secondary_ip: IP address
950 a7399f66 Iustin Pop
  @ivar secondary_ip: The secondary IP of the node. This needs to be passed
951 a7399f66 Iustin Pop
                      if the cluster has been initialized in 'dual-network'
952 a7399f66 Iustin Pop
                      mode, otherwise it must not be given.
953 a7399f66 Iustin Pop
  @type readd: C{bool}
954 a7399f66 Iustin Pop
  @ivar readd: Whether to re-add an existing node to the cluster. If
955 a7399f66 Iustin Pop
               this is not passed, then the operation will abort if the node
956 a7399f66 Iustin Pop
               name is already in the cluster; use this parameter to 'repair'
957 a7399f66 Iustin Pop
               a node that had its configuration broken, or was reinstalled
958 a7399f66 Iustin Pop
               without removal from the cluster.
959 f936c153 Iustin Pop
  @type group: C{str}
960 f936c153 Iustin Pop
  @ivar group: The node group to which this node will belong.
961 fd3d37b6 Iustin Pop
  @type vm_capable: C{bool}
962 fd3d37b6 Iustin Pop
  @ivar vm_capable: The vm_capable node attribute
963 fd3d37b6 Iustin Pop
  @type master_capable: C{bool}
964 fd3d37b6 Iustin Pop
  @ivar master_capable: The master_capable node attribute
965 a7399f66 Iustin Pop

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

1112 9bf56d77 Michael Hanselmann
  @ivar instance_name: Instance name
1113 9bf56d77 Michael Hanselmann
  @ivar mode: Instance creation mode (one of L{constants.INSTANCE_CREATE_MODES})
1114 9bf56d77 Michael Hanselmann
  @ivar source_handshake: Signed handshake from source (remote import only)
1115 9bf56d77 Michael Hanselmann
  @ivar source_x509_ca: Source X509 CA in PEM format (remote import only)
1116 9bf56d77 Michael Hanselmann
  @ivar source_instance_name: Previous name of instance (remote import only)
1117 dae91d02 Michael Hanselmann
  @ivar source_shutdown_timeout: Shutdown timeout used for source instance
1118 dae91d02 Michael Hanselmann
    (remote import only)
1119 9bf56d77 Michael Hanselmann

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

1296 53c776b5 Iustin Pop
  This migrates (without shutting down an instance) to its secondary
1297 53c776b5 Iustin Pop
  node.
1298 53c776b5 Iustin Pop

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

1302 53c776b5 Iustin Pop
  """
1303 ee69c97f Iustin Pop
  OP_DSC_FIELD = "instance_name"
1304 65e183af Michael Hanselmann
  OP_PARAMS = [
1305 65e183af Michael Hanselmann
    _PInstanceName,
1306 65e183af Michael Hanselmann
    _PMigrationMode,
1307 65e183af Michael Hanselmann
    _PMigrationLive,
1308 f8fa4175 Michael Hanselmann
    _PMigrationTargetNode,
1309 8c0b16f6 Guido Trotter
    _PAllowRuntimeChgs,
1310 3ed23330 René Nussbaumer
    _PIgnoreIpolicy,
1311 45d4c81c Michael Hanselmann
    ("cleanup", False, ht.TBool,
1312 45d4c81c Michael Hanselmann
     "Whether a previously failed migration should be cleaned up"),
1313 8eb34306 Apollon Oikonomopoulos
    ("iallocator", None, ht.TMaybeString,
1314 8eb34306 Apollon Oikonomopoulos
     "Iallocator for deciding the target node for shared-storage instances"),
1315 d5cafd31 René Nussbaumer
    ("allow_failover", False, ht.TBool,
1316 d5cafd31 René Nussbaumer
     "Whether we can fallback to failover if migration is not possible"),
1317 65e183af Michael Hanselmann
    ]
1318 c363310d René Nussbaumer
  OP_RESULT = ht.TNone
1319 53c776b5 Iustin Pop
1320 53c776b5 Iustin Pop
1321 0091b480 Iustin Pop
class OpInstanceMove(OpCode):
1322 313bcead Iustin Pop
  """Move an instance.
1323 313bcead Iustin Pop

1324 313bcead Iustin Pop
  This move (with shutting down an instance and data copying) to an
1325 313bcead Iustin Pop
  arbitrary node.
1326 313bcead Iustin Pop

1327 313bcead Iustin Pop
  @ivar instance_name: the name of the instance
1328 313bcead Iustin Pop
  @ivar target_node: the destination node
1329 313bcead Iustin Pop

1330 313bcead Iustin Pop
  """
1331 313bcead Iustin Pop
  OP_DSC_FIELD = "instance_name"
1332 65e183af Michael Hanselmann
  OP_PARAMS = [
1333 65e183af Michael Hanselmann
    _PInstanceName,
1334 65e183af Michael Hanselmann
    _PShutdownTimeout,
1335 92cf62e3 René Nussbaumer
    _PIgnoreIpolicy,
1336 45d4c81c Michael Hanselmann
    ("target_node", ht.NoDefault, ht.TNonEmptyString, "Target node"),
1337 bb851c63 Iustin Pop
    _PIgnoreConsistency,
1338 154b9580 Balazs Lecz
    ]
1339 c363310d René Nussbaumer
  OP_RESULT = ht.TNone
1340 313bcead Iustin Pop
1341 313bcead Iustin Pop
1342 cc0dec7b Iustin Pop
class OpInstanceConsole(OpCode):
1343 fdc267f4 Iustin Pop
  """Connect to an instance's console."""
1344 60dd1473 Iustin Pop
  OP_DSC_FIELD = "instance_name"
1345 65e183af Michael Hanselmann
  OP_PARAMS = [
1346 65e183af Michael Hanselmann
    _PInstanceName
1347 65e183af Michael Hanselmann
    ]
1348 c363310d René Nussbaumer
  OP_RESULT = ht.TDict
1349 a8083063 Iustin Pop
1350 a8083063 Iustin Pop
1351 83f5d475 Iustin Pop
class OpInstanceActivateDisks(OpCode):
1352 fdc267f4 Iustin Pop
  """Activate an instance's disks."""
1353 60dd1473 Iustin Pop
  OP_DSC_FIELD = "instance_name"
1354 65e183af Michael Hanselmann
  OP_PARAMS = [
1355 65e183af Michael Hanselmann
    _PInstanceName,
1356 45d4c81c Michael Hanselmann
    ("ignore_size", False, ht.TBool, "Whether to ignore recorded size"),
1357 65e183af Michael Hanselmann
    ]
1358 c363310d René Nussbaumer
  OP_RESULT = ht.TListOf(ht.TAnd(ht.TIsLength(3),
1359 c363310d René Nussbaumer
                                 ht.TItems([ht.TNonEmptyString,
1360 c363310d René Nussbaumer
                                            ht.TNonEmptyString,
1361 c363310d René Nussbaumer
                                            ht.TNonEmptyString])))
1362 a8083063 Iustin Pop
1363 a8083063 Iustin Pop
1364 e176281f Iustin Pop
class OpInstanceDeactivateDisks(OpCode):
1365 fdc267f4 Iustin Pop
  """Deactivate an instance's disks."""
1366 60dd1473 Iustin Pop
  OP_DSC_FIELD = "instance_name"
1367 65e183af Michael Hanselmann
  OP_PARAMS = [
1368 c9c41373 Iustin Pop
    _PInstanceName,
1369 c9c41373 Iustin Pop
    _PForce,
1370 65e183af Michael Hanselmann
    ]
1371 c363310d René Nussbaumer
  OP_RESULT = ht.TNone
1372 a8083063 Iustin Pop
1373 a8083063 Iustin Pop
1374 6b273e78 Iustin Pop
class OpInstanceRecreateDisks(OpCode):
1375 a52978c7 Michael Hanselmann
  """Recreate an instance's disks."""
1376 735e1318 Michael Hanselmann
  _TDiskChanges = \
1377 735e1318 Michael Hanselmann
    ht.TAnd(ht.TIsLength(2),
1378 735e1318 Michael Hanselmann
            ht.TItems([ht.Comment("Disk index")(ht.TPositiveInt),
1379 735e1318 Michael Hanselmann
                       ht.Comment("Parameters")(_TDiskParams)]))
1380 735e1318 Michael Hanselmann
1381 bd315bfa Iustin Pop
  OP_DSC_FIELD = "instance_name"
1382 65e183af Michael Hanselmann
  OP_PARAMS = [
1383 65e183af Michael Hanselmann
    _PInstanceName,
1384 735e1318 Michael Hanselmann
    ("disks", ht.EmptyList,
1385 735e1318 Michael Hanselmann
     ht.TOr(ht.TListOf(ht.TPositiveInt), ht.TListOf(_TDiskChanges)),
1386 735e1318 Michael Hanselmann
     "List of disk indexes (deprecated) or a list of tuples containing a disk"
1387 735e1318 Michael Hanselmann
     " index and a possibly empty dictionary with disk parameter changes"),
1388 93384b8c Guido Trotter
    ("nodes", ht.EmptyList, ht.TListOf(ht.TNonEmptyString),
1389 93384b8c Guido Trotter
     "New instance nodes, if relocation is desired"),
1390 65e183af Michael Hanselmann
    ]
1391 c363310d René Nussbaumer
  OP_RESULT = ht.TNone
1392 bd315bfa Iustin Pop
1393 bd315bfa Iustin Pop
1394 f2af0bec Iustin Pop
class OpInstanceQuery(OpCode):
1395 a8083063 Iustin Pop
  """Compute the list of instances."""
1396 65e183af Michael Hanselmann
  OP_PARAMS = [
1397 65e183af Michael Hanselmann
    _POutputFields,
1398 45d4c81c Michael Hanselmann
    _PUseLocking,
1399 45d4c81c Michael Hanselmann
    ("names", ht.EmptyList, ht.TListOf(ht.TNonEmptyString),
1400 45d4c81c Michael Hanselmann
     "Empty list to query all instances, instance names otherwise"),
1401 65e183af Michael Hanselmann
    ]
1402 a8083063 Iustin Pop
1403 a8083063 Iustin Pop
1404 dc28c4e4 Iustin Pop
class OpInstanceQueryData(OpCode):
1405 a8083063 Iustin Pop
  """Compute the run-time status of instances."""
1406 65e183af Michael Hanselmann
  OP_PARAMS = [
1407 af7b6689 Michael Hanselmann
    _PUseLocking,
1408 af7b6689 Michael Hanselmann
    ("instances", ht.EmptyList, ht.TListOf(ht.TNonEmptyString),
1409 af7b6689 Michael Hanselmann
     "Instance names"),
1410 af7b6689 Michael Hanselmann
    ("static", False, ht.TBool,
1411 af7b6689 Michael Hanselmann
     "Whether to only return configuration data without querying"
1412 af7b6689 Michael Hanselmann
     " nodes"),
1413 65e183af Michael Hanselmann
    ]
1414 a8083063 Iustin Pop
1415 a8083063 Iustin Pop
1416 ddc1de7c Michael Hanselmann
def _TestInstSetParamsModList(fn):
1417 ddc1de7c Michael Hanselmann
  """Generates a check for modification lists.
1418 ddc1de7c Michael Hanselmann

1419 ddc1de7c Michael Hanselmann
  """
1420 e9c3d864 Michael Hanselmann
  # Old format
1421 e9c3d864 Michael Hanselmann
  # TODO: Remove in version 2.8 including support in LUInstanceSetParams
1422 e9c3d864 Michael Hanselmann
  old_mod_item_fn = \
1423 ddc1de7c Michael Hanselmann
    ht.TAnd(ht.TIsLength(2), ht.TItems([
1424 ddc1de7c Michael Hanselmann
      ht.TOr(ht.TElemOf(constants.DDMS_VALUES), ht.TPositiveInt),
1425 ddc1de7c Michael Hanselmann
      fn,
1426 ddc1de7c Michael Hanselmann
      ]))
1427 ddc1de7c Michael Hanselmann
1428 e9c3d864 Michael Hanselmann
  # New format, supporting adding/removing disks/NICs at arbitrary indices
1429 e9c3d864 Michael Hanselmann
  mod_item_fn = \
1430 e9c3d864 Michael Hanselmann
    ht.TAnd(ht.TIsLength(3), ht.TItems([
1431 e9c3d864 Michael Hanselmann
      ht.TElemOf(constants.DDMS_VALUES_WITH_MODIFY),
1432 e9c3d864 Michael Hanselmann
      ht.Comment("Disk index, can be negative, e.g. -1 for last disk")(ht.TInt),
1433 e9c3d864 Michael Hanselmann
      fn,
1434 e9c3d864 Michael Hanselmann
      ]))
1435 e9c3d864 Michael Hanselmann
1436 e9c3d864 Michael Hanselmann
  return ht.TOr(ht.Comment("Recommended")(ht.TListOf(mod_item_fn)),
1437 e9c3d864 Michael Hanselmann
                ht.Comment("Deprecated")(ht.TListOf(old_mod_item_fn)))
1438 ddc1de7c Michael Hanselmann
1439 ddc1de7c Michael Hanselmann
1440 9a3cc7ae Iustin Pop
class OpInstanceSetParams(OpCode):
1441 ddc1de7c Michael Hanselmann
  """Change the parameters of an instance.
1442 ddc1de7c Michael Hanselmann

1443 ddc1de7c Michael Hanselmann
  """
1444 a2aadb34 Michael Hanselmann
  TestNicModifications = _TestInstSetParamsModList(_TestNicDef)
1445 a2aadb34 Michael Hanselmann
  TestDiskModifications = _TestInstSetParamsModList(_TDiskParams)
1446 ddc1de7c Michael Hanselmann
1447 60dd1473 Iustin Pop
  OP_DSC_FIELD = "instance_name"
1448 65e183af Michael Hanselmann
  OP_PARAMS = [
1449 65e183af Michael Hanselmann
    _PInstanceName,
1450 65e183af Michael Hanselmann
    _PForce,
1451 45d4c81c Michael Hanselmann
    _PForceVariant,
1452 1559e1e7 René Nussbaumer
    _PIgnoreIpolicy,
1453 a2aadb34 Michael Hanselmann
    ("nics", ht.EmptyList, TestNicModifications,
1454 e9c3d864 Michael Hanselmann
     "List of NIC changes. Each item is of the form ``(op, index, settings)``."
1455 e9c3d864 Michael Hanselmann
     " ``op`` is one of ``%s``, ``%s`` or ``%s``. ``index`` can be either -1 to"
1456 e9c3d864 Michael Hanselmann
     " refer to the last position, or a zero-based index number. A deprecated"
1457 e9c3d864 Michael Hanselmann
     " version of this parameter used the form ``(op, settings)``, where "
1458 45d4c81c Michael Hanselmann
     " ``op`` can be ``%s`` to add a new NIC with the specified settings,"
1459 45d4c81c Michael Hanselmann
     " ``%s`` to remove the last NIC or a number to modify the settings"
1460 45d4c81c Michael Hanselmann
     " of the NIC with that index." %
1461 e9c3d864 Michael Hanselmann
     (constants.DDM_ADD, constants.DDM_MODIFY, constants.DDM_REMOVE,
1462 e9c3d864 Michael Hanselmann
      constants.DDM_ADD, constants.DDM_REMOVE)),
1463 a2aadb34 Michael Hanselmann
    ("disks", ht.EmptyList, TestDiskModifications,
1464 ddc1de7c Michael Hanselmann
     "List of disk changes. See ``nics``."),
1465 45d4c81c Michael Hanselmann
    ("beparams", ht.EmptyDict, ht.TDict, "Per-instance backend parameters"),
1466 2c0af7da Guido Trotter
    ("runtime_mem", None, ht.TMaybeStrictPositiveInt, "New runtime memory"),
1467 45d4c81c Michael Hanselmann
    ("hvparams", ht.EmptyDict, ht.TDict,
1468 45d4c81c Michael Hanselmann
     "Per-instance hypervisor parameters, hypervisor-dependent"),
1469 45fe090b Michael Hanselmann
    ("disk_template", None, ht.TOr(ht.TNone, _BuildDiskTemplateCheck(False)),
1470 45d4c81c Michael Hanselmann
     "Disk template for instance"),
1471 45d4c81c Michael Hanselmann
    ("remote_node", None, ht.TMaybeString,
1472 45d4c81c Michael Hanselmann
     "Secondary node (used when changing disk template)"),
1473 45d4c81c Michael Hanselmann
    ("os_name", None, ht.TMaybeString,
1474 45d4c81c Michael Hanselmann
     "Change instance's OS name. Does not reinstall the instance."),
1475 45d4c81c Michael Hanselmann
    ("osparams", None, ht.TMaybeDict, "Per-instance OS parameters"),
1476 93384b8c Guido Trotter
    ("wait_for_sync", True, ht.TBool,
1477 93384b8c Guido Trotter
     "Whether to wait for the disk to synchronize, when changing template"),
1478 3016bc1f Michael Hanselmann
    ("offline", None, ht.TMaybeBool, "Whether to mark instance as offline"),
1479 973d7867 Iustin Pop
    ]
1480 1456df62 Michael Hanselmann
  OP_RESULT = _TSetParamsResult
1481 a8083063 Iustin Pop
1482 a8083063 Iustin Pop
1483 60472d29 Iustin Pop
class OpInstanceGrowDisk(OpCode):
1484 8729e0d7 Iustin Pop
  """Grow a disk of an instance."""
1485 60dd1473 Iustin Pop
  OP_DSC_FIELD = "instance_name"
1486 65e183af Michael Hanselmann
  OP_PARAMS = [
1487 65e183af Michael Hanselmann
    _PInstanceName,
1488 45d4c81c Michael Hanselmann
    _PWaitForSync,
1489 45d4c81c Michael Hanselmann
    ("disk", ht.NoDefault, ht.TInt, "Disk index"),
1490 45d4c81c Michael Hanselmann
    ("amount", ht.NoDefault, ht.TInt,
1491 45d4c81c Michael Hanselmann
     "Amount of disk space to add (megabytes)"),
1492 4f05fd3b Iustin Pop
    ]
1493 c363310d René Nussbaumer
  OP_RESULT = ht.TNone
1494 8729e0d7 Iustin Pop
1495 8729e0d7 Iustin Pop
1496 1aef3df8 Michael Hanselmann
class OpInstanceChangeGroup(OpCode):
1497 1aef3df8 Michael Hanselmann
  """Moves an instance to another node group."""
1498 1aef3df8 Michael Hanselmann
  OP_DSC_FIELD = "instance_name"
1499 1aef3df8 Michael Hanselmann
  OP_PARAMS = [
1500 1aef3df8 Michael Hanselmann
    _PInstanceName,
1501 1aef3df8 Michael Hanselmann
    _PEarlyRelease,
1502 1aef3df8 Michael Hanselmann
    ("iallocator", None, ht.TMaybeString, "Iallocator for computing solution"),
1503 ff8067cf Michael Hanselmann
    ("target_groups", None, ht.TMaybeListOf(ht.TNonEmptyString),
1504 1aef3df8 Michael Hanselmann
     "Destination group names or UUIDs (defaults to \"all but current group\""),
1505 1aef3df8 Michael Hanselmann
    ]
1506 1456df62 Michael Hanselmann
  OP_RESULT = TJobIdListOnly
1507 1aef3df8 Michael Hanselmann
1508 1aef3df8 Michael Hanselmann
1509 70a6a926 Adeodato Simo
# Node group opcodes
1510 70a6a926 Adeodato Simo
1511 fabf1731 Iustin Pop
class OpGroupAdd(OpCode):
1512 b1ee5610 Adeodato Simo
  """Add a node group to the cluster."""
1513 b1ee5610 Adeodato Simo
  OP_DSC_FIELD = "group_name"
1514 65e183af Michael Hanselmann
  OP_PARAMS = [
1515 65e183af Michael Hanselmann
    _PGroupName,
1516 45d4c81c Michael Hanselmann
    _PNodeGroupAllocPolicy,
1517 45d4c81c Michael Hanselmann
    _PGroupNodeParams,
1518 bc5d0215 Andrea Spadaccini
    _PDiskParams,
1519 e4c03256 René Nussbaumer
    _PHvState,
1520 e4c03256 René Nussbaumer
    _PDiskState,
1521 1b01390b René Nussbaumer
    ("ipolicy", None, ht.TMaybeDict,
1522 1b01390b René Nussbaumer
     "Group-wide :ref:`instance policy <rapi-ipolicy>` specs"),
1523 483be60d Adeodato Simo
    ]
1524 c363310d René Nussbaumer
  OP_RESULT = ht.TNone
1525 b1ee5610 Adeodato Simo
1526 b1ee5610 Adeodato Simo
1527 934704ae Iustin Pop
class OpGroupAssignNodes(OpCode):
1528 96276ae7 Adeodato Simo
  """Assign nodes to a node group."""
1529 96276ae7 Adeodato Simo
  OP_DSC_FIELD = "group_name"
1530 96276ae7 Adeodato Simo
  OP_PARAMS = [
1531 96276ae7 Adeodato Simo
    _PGroupName,
1532 96276ae7 Adeodato Simo
    _PForce,
1533 45d4c81c Michael Hanselmann
    ("nodes", ht.NoDefault, ht.TListOf(ht.TNonEmptyString),
1534 45d4c81c Michael Hanselmann
     "List of nodes to assign"),
1535 96276ae7 Adeodato Simo
    ]
1536 c363310d René Nussbaumer
  OP_RESULT = ht.TNone
1537 96276ae7 Adeodato Simo
1538 96276ae7 Adeodato Simo
1539 d4d654bd Iustin Pop
class OpGroupQuery(OpCode):
1540 70a6a926 Adeodato Simo
  """Compute the list of node groups."""
1541 65e183af Michael Hanselmann
  OP_PARAMS = [
1542 65e183af Michael Hanselmann
    _POutputFields,
1543 45d4c81c Michael Hanselmann
    ("names", ht.EmptyList, ht.TListOf(ht.TNonEmptyString),
1544 45d4c81c Michael Hanselmann
     "Empty list to query all groups, group names otherwise"),
1545 65e183af Michael Hanselmann
    ]
1546 70a6a926 Adeodato Simo
1547 70a6a926 Adeodato Simo
1548 7cbf74f0 Iustin Pop
class OpGroupSetParams(OpCode):
1549 4da7909a Adeodato Simo
  """Change the parameters of a node group."""
1550 4da7909a Adeodato Simo
  OP_DSC_FIELD = "group_name"
1551 65e183af Michael Hanselmann
  OP_PARAMS = [
1552 65e183af Michael Hanselmann
    _PGroupName,
1553 45d4c81c Michael Hanselmann
    _PNodeGroupAllocPolicy,
1554 45d4c81c Michael Hanselmann
    _PGroupNodeParams,
1555 bc5d0215 Andrea Spadaccini
    _PDiskParams,
1556 a8282327 René Nussbaumer
    _PHvState,
1557 a8282327 René Nussbaumer
    _PDiskState,
1558 fb644e77 Agata Murawska
    ("ipolicy", None, ht.TMaybeDict, "Group-wide instance policy specs"),
1559 4da7909a Adeodato Simo
    ]
1560 1456df62 Michael Hanselmann
  OP_RESULT = _TSetParamsResult
1561 4da7909a Adeodato Simo
1562 4da7909a Adeodato Simo
1563 4d1baa51 Iustin Pop
class OpGroupRemove(OpCode):
1564 94bd652a Adeodato Simo
  """Remove a node group from the cluster."""
1565 94bd652a Adeodato Simo
  OP_DSC_FIELD = "group_name"
1566 65e183af Michael Hanselmann
  OP_PARAMS = [
1567 65e183af Michael Hanselmann
    _PGroupName,
1568 65e183af Michael Hanselmann
    ]
1569 c363310d René Nussbaumer
  OP_RESULT = ht.TNone
1570 94bd652a Adeodato Simo
1571 94bd652a Adeodato Simo
1572 a8173e82 Iustin Pop
class OpGroupRename(OpCode):
1573 4fe5cf90 Adeodato Simo
  """Rename a node group in the cluster."""
1574 65e183af Michael Hanselmann
  OP_PARAMS = [
1575 12da663a Michael Hanselmann
    _PGroupName,
1576 12da663a Michael Hanselmann
    ("new_name", ht.NoDefault, ht.TNonEmptyString, "New group name"),
1577 65e183af Michael Hanselmann
    ]
1578 1456df62 Michael Hanselmann
  OP_RESULT = ht.Comment("New group name")(ht.TNonEmptyString)
1579 4fe5cf90 Adeodato Simo
1580 4fe5cf90 Adeodato Simo
1581 08f8c82c Michael Hanselmann
class OpGroupEvacuate(OpCode):
1582 08f8c82c Michael Hanselmann
  """Evacuate a node group in the cluster."""
1583 08f8c82c Michael Hanselmann
  OP_DSC_FIELD = "group_name"
1584 08f8c82c Michael Hanselmann
  OP_PARAMS = [
1585 08f8c82c Michael Hanselmann
    _PGroupName,
1586 08f8c82c Michael Hanselmann
    _PEarlyRelease,
1587 08f8c82c Michael Hanselmann
    ("iallocator", None, ht.TMaybeString, "Iallocator for computing solution"),
1588 ff8067cf Michael Hanselmann
    ("target_groups", None, ht.TMaybeListOf(ht.TNonEmptyString),
1589 08f8c82c Michael Hanselmann
     "Destination group names or UUIDs"),
1590 08f8c82c Michael Hanselmann
    ]
1591 1456df62 Michael Hanselmann
  OP_RESULT = TJobIdListOnly
1592 08f8c82c Michael Hanselmann
1593 08f8c82c Michael Hanselmann
1594 a8083063 Iustin Pop
# OS opcodes
1595 da2d02e7 Iustin Pop
class OpOsDiagnose(OpCode):
1596 a8083063 Iustin Pop
  """Compute the list of guest operating systems."""
1597 65e183af Michael Hanselmann
  OP_PARAMS = [
1598 65e183af Michael Hanselmann
    _POutputFields,
1599 45d4c81c Michael Hanselmann
    ("names", ht.EmptyList, ht.TListOf(ht.TNonEmptyString),
1600 45d4c81c Michael Hanselmann
     "Which operating systems to diagnose"),
1601 65e183af Michael Hanselmann
    ]
1602 a8083063 Iustin Pop
1603 7c0d6283 Michael Hanselmann
1604 a8083063 Iustin Pop
# Exports opcodes
1605 7ca2d4d8 Iustin Pop
class OpBackupQuery(OpCode):
1606 a8083063 Iustin Pop
  """Compute the list of exported images."""
1607 65e183af Michael Hanselmann
  OP_PARAMS = [
1608 45d4c81c Michael Hanselmann
    _PUseLocking,
1609 45d4c81c Michael Hanselmann
    ("nodes", ht.EmptyList, ht.TListOf(ht.TNonEmptyString),
1610 45d4c81c Michael Hanselmann
     "Empty list to query all nodes, node names otherwise"),
1611 65e183af Michael Hanselmann
    ]
1612 a8083063 Iustin Pop
1613 7c0d6283 Michael Hanselmann
1614 71910715 Iustin Pop
class OpBackupPrepare(OpCode):
1615 1410fa8d Michael Hanselmann
  """Prepares an instance export.
1616 1410fa8d Michael Hanselmann

1617 1410fa8d Michael Hanselmann
  @ivar instance_name: Instance name
1618 1410fa8d Michael Hanselmann
  @ivar mode: Export mode (one of L{constants.EXPORT_MODES})
1619 1410fa8d Michael Hanselmann

1620 1410fa8d Michael Hanselmann
  """
1621 1410fa8d Michael Hanselmann
  OP_DSC_FIELD = "instance_name"
1622 65e183af Michael Hanselmann
  OP_PARAMS = [
1623 65e183af Michael Hanselmann
    _PInstanceName,
1624 45d4c81c Michael Hanselmann
    ("mode", ht.NoDefault, ht.TElemOf(constants.EXPORT_MODES),
1625 45d4c81c Michael Hanselmann
     "Export mode"),
1626 1410fa8d Michael Hanselmann
    ]
1627 c363310d René Nussbaumer
  OP_RESULT = ht.TOr(ht.TNone, ht.TDict)
1628 1410fa8d Michael Hanselmann
1629 1410fa8d Michael Hanselmann
1630 4ff922a2 Iustin Pop
class OpBackupExport(OpCode):
1631 4a96f1d1 Michael Hanselmann
  """Export an instance.
1632 4a96f1d1 Michael Hanselmann

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

1639 4a96f1d1 Michael Hanselmann
  @ivar mode: Export mode (one of L{constants.EXPORT_MODES})
1640 4a96f1d1 Michael Hanselmann
  @ivar target_node: Export destination
1641 4a96f1d1 Michael Hanselmann
  @ivar x509_key_name: X509 key to use (remote export only)
1642 4a96f1d1 Michael Hanselmann
  @ivar destination_x509_ca: Destination X509 CA in PEM format (remote export
1643 4a96f1d1 Michael Hanselmann
                             only)
1644 4a96f1d1 Michael Hanselmann

1645 4a96f1d1 Michael Hanselmann
  """
1646 60dd1473 Iustin Pop
  OP_DSC_FIELD = "instance_name"
1647 65e183af Michael Hanselmann
  OP_PARAMS = [
1648 65e183af Michael Hanselmann
    _PInstanceName,
1649 65e183af Michael Hanselmann
    _PShutdownTimeout,
1650 4a96f1d1 Michael Hanselmann
    # TODO: Rename target_node as it changes meaning for different export modes
1651 4a96f1d1 Michael Hanselmann
    # (e.g. "destination")
1652 45d4c81c Michael Hanselmann
    ("target_node", ht.NoDefault, ht.TOr(ht.TNonEmptyString, ht.TList),
1653 45d4c81c Michael Hanselmann
     "Destination information, depends on export mode"),
1654 45d4c81c Michael Hanselmann
    ("shutdown", True, ht.TBool, "Whether to shutdown instance before export"),
1655 45d4c81c Michael Hanselmann
    ("remove_instance", False, ht.TBool,
1656 45d4c81c Michael Hanselmann
     "Whether to remove instance after export"),
1657 45d4c81c Michael Hanselmann
    ("ignore_remove_failures", False, ht.TBool,
1658 45d4c81c Michael Hanselmann
     "Whether to ignore failures while removing instances"),
1659 45d4c81c Michael Hanselmann
    ("mode", constants.EXPORT_MODE_LOCAL, ht.TElemOf(constants.EXPORT_MODES),
1660 45d4c81c Michael Hanselmann
     "Export mode"),
1661 45d4c81c Michael Hanselmann
    ("x509_key_name", None, ht.TOr(ht.TList, ht.TNone),
1662 45d4c81c Michael Hanselmann
     "Name of X509 key (remote export only)"),
1663 45d4c81c Michael Hanselmann
    ("destination_x509_ca", None, ht.TMaybeString,
1664 45d4c81c Michael Hanselmann
     "Destination X509 CA (remote export only)"),
1665 17c3f802 Guido Trotter
    ]
1666 5c947f38 Iustin Pop
1667 0a7bed64 Michael Hanselmann
1668 ca5890ad Iustin Pop
class OpBackupRemove(OpCode):
1669 9ac99fda Guido Trotter
  """Remove an instance's export."""
1670 60dd1473 Iustin Pop
  OP_DSC_FIELD = "instance_name"
1671 65e183af Michael Hanselmann
  OP_PARAMS = [
1672 65e183af Michael Hanselmann
    _PInstanceName,
1673 65e183af Michael Hanselmann
    ]
1674 5c947f38 Iustin Pop
1675 0a7bed64 Michael Hanselmann
1676 5c947f38 Iustin Pop
# Tags opcodes
1677 c6afb1ca Iustin Pop
class OpTagsGet(OpCode):
1678 5c947f38 Iustin Pop
  """Returns the tags of the given object."""
1679 60dd1473 Iustin Pop
  OP_DSC_FIELD = "name"
1680 65e183af Michael Hanselmann
  OP_PARAMS = [
1681 65e183af Michael Hanselmann
    _PTagKind,
1682 65e183af Michael Hanselmann
    # Name is only meaningful for nodes and instances
1683 197b323b Michael Hanselmann
    ("name", ht.NoDefault, ht.TMaybeString, None),
1684 65e183af Michael Hanselmann
    ]
1685 5c947f38 Iustin Pop
1686 5c947f38 Iustin Pop
1687 715462e7 Iustin Pop
class OpTagsSearch(OpCode):
1688 73415719 Iustin Pop
  """Searches the tags in the cluster for a given pattern."""
1689 60dd1473 Iustin Pop
  OP_DSC_FIELD = "pattern"
1690 65e183af Michael Hanselmann
  OP_PARAMS = [
1691 197b323b Michael Hanselmann
    ("pattern", ht.NoDefault, ht.TNonEmptyString, None),
1692 65e183af Michael Hanselmann
    ]
1693 73415719 Iustin Pop
1694 73415719 Iustin Pop
1695 d1602edc Iustin Pop
class OpTagsSet(OpCode):
1696 f27302fa Iustin Pop
  """Add a list of tags on a given object."""
1697 65e183af Michael Hanselmann
  OP_PARAMS = [
1698 65e183af Michael Hanselmann
    _PTagKind,
1699 65e183af Michael Hanselmann
    _PTags,
1700 65e183af Michael Hanselmann
    # Name is only meaningful for nodes and instances
1701 197b323b Michael Hanselmann
    ("name", ht.NoDefault, ht.TMaybeString, None),
1702 65e183af Michael Hanselmann
    ]
1703 5c947f38 Iustin Pop
1704 5c947f38 Iustin Pop
1705 3f0ab95f Iustin Pop
class OpTagsDel(OpCode):
1706 f27302fa Iustin Pop
  """Remove a list of tags from a given object."""
1707 65e183af Michael Hanselmann
  OP_PARAMS = [
1708 65e183af Michael Hanselmann
    _PTagKind,
1709 65e183af Michael Hanselmann
    _PTags,
1710 65e183af Michael Hanselmann
    # Name is only meaningful for nodes and instances
1711 197b323b Michael Hanselmann
    ("name", ht.NoDefault, ht.TMaybeString, None),
1712 65e183af Michael Hanselmann
    ]
1713 06009e27 Iustin Pop
1714 e687ec01 Michael Hanselmann
1715 06009e27 Iustin Pop
# Test opcodes
1716 06009e27 Iustin Pop
class OpTestDelay(OpCode):
1717 06009e27 Iustin Pop
  """Sleeps for a configured amount of time.
1718 06009e27 Iustin Pop

1719 06009e27 Iustin Pop
  This is used just for debugging and testing.
1720 06009e27 Iustin Pop

1721 06009e27 Iustin Pop
  Parameters:
1722 06009e27 Iustin Pop
    - duration: the time to sleep
1723 06009e27 Iustin Pop
    - on_master: if true, sleep on the master
1724 06009e27 Iustin Pop
    - on_nodes: list of nodes in which to sleep
1725 06009e27 Iustin Pop

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

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

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

1736 06009e27 Iustin Pop
  """
1737 60dd1473 Iustin Pop
  OP_DSC_FIELD = "duration"
1738 65e183af Michael Hanselmann
  OP_PARAMS = [
1739 b795a775 Michael Hanselmann
    ("duration", ht.NoDefault, ht.TNumber, None),
1740 197b323b Michael Hanselmann
    ("on_master", True, ht.TBool, None),
1741 197b323b Michael Hanselmann
    ("on_nodes", ht.EmptyList, ht.TListOf(ht.TNonEmptyString), None),
1742 197b323b Michael Hanselmann
    ("repeat", 0, ht.TPositiveInt, None),
1743 65e183af Michael Hanselmann
    ]
1744 d61df03e Iustin Pop
1745 d61df03e Iustin Pop
1746 d61df03e Iustin Pop
class OpTestAllocator(OpCode):
1747 d61df03e Iustin Pop
  """Allocator framework testing.
1748 d61df03e Iustin Pop

1749 d61df03e Iustin Pop
  This opcode has two modes:
1750 d61df03e Iustin Pop
    - gather and return allocator input for a given mode (allocate new
1751 d61df03e Iustin Pop
      or replace secondary) and a given instance definition (direction
1752 d61df03e Iustin Pop
      'in')
1753 d61df03e Iustin Pop
    - run a selected allocator for a given operation (as above) and
1754 d61df03e Iustin Pop
      return the allocator output (direction 'out')
1755 d61df03e Iustin Pop

1756 d61df03e Iustin Pop
  """
1757 60dd1473 Iustin Pop
  OP_DSC_FIELD = "allocator"
1758 65e183af Michael Hanselmann
  OP_PARAMS = [
1759 65e183af Michael Hanselmann
    ("direction", ht.NoDefault,
1760 197b323b Michael Hanselmann
     ht.TElemOf(constants.VALID_IALLOCATOR_DIRECTIONS), None),
1761 197b323b Michael Hanselmann
    ("mode", ht.NoDefault, ht.TElemOf(constants.VALID_IALLOCATOR_MODES), None),
1762 197b323b Michael Hanselmann
    ("name", ht.NoDefault, ht.TNonEmptyString, None),
1763 ff8067cf Michael Hanselmann
    ("nics", ht.NoDefault,
1764 ff8067cf Michael Hanselmann
     ht.TMaybeListOf(ht.TDictOf(ht.TElemOf([constants.INIC_MAC,
1765 ff8067cf Michael Hanselmann
                                            constants.INIC_IP,
1766 ff8067cf Michael Hanselmann
                                            "bridge"]),
1767 ff8067cf Michael Hanselmann
                                ht.TOr(ht.TNone, ht.TNonEmptyString))),
1768 ff8067cf Michael Hanselmann
     None),
1769 197b323b Michael Hanselmann
    ("disks", ht.NoDefault, ht.TOr(ht.TNone, ht.TList), None),
1770 197b323b Michael Hanselmann
    ("hypervisor", None, ht.TMaybeString, None),
1771 197b323b Michael Hanselmann
    ("allocator", None, ht.TMaybeString, None),
1772 197b323b Michael Hanselmann
    ("tags", ht.EmptyList, ht.TListOf(ht.TNonEmptyString), None),
1773 dd47a0f0 Iustin Pop
    ("memory", None, ht.TOr(ht.TNone, ht.TPositiveInt), None),
1774 197b323b Michael Hanselmann
    ("vcpus", None, ht.TOr(ht.TNone, ht.TPositiveInt), None),
1775 197b323b Michael Hanselmann
    ("os", None, ht.TMaybeString, None),
1776 197b323b Michael Hanselmann
    ("disk_template", None, ht.TMaybeString, None),
1777 ff8067cf Michael Hanselmann
    ("instances", None, ht.TMaybeListOf(ht.TNonEmptyString), None),
1778 60152bbe Michael Hanselmann
    ("evac_mode", None,
1779 60152bbe Michael Hanselmann
     ht.TOr(ht.TNone, ht.TElemOf(constants.IALLOCATOR_NEVAC_MODES)), None),
1780 ff8067cf Michael Hanselmann
    ("target_groups", None, ht.TMaybeListOf(ht.TNonEmptyString), None),
1781 d61df03e Iustin Pop
    ]
1782 363acb1e Iustin Pop
1783 76aef8fc Michael Hanselmann
1784 b469eb4d Iustin Pop
class OpTestJqueue(OpCode):
1785 e58f87a9 Michael Hanselmann
  """Utility opcode to test some aspects of the job queue.
1786 e58f87a9 Michael Hanselmann

1787 e58f87a9 Michael Hanselmann
  """
1788 65e183af Michael Hanselmann
  OP_PARAMS = [
1789 197b323b Michael Hanselmann
    ("notify_waitlock", False, ht.TBool, None),
1790 197b323b Michael Hanselmann
    ("notify_exec", False, ht.TBool, None),
1791 197b323b Michael Hanselmann
    ("log_messages", ht.EmptyList, ht.TListOf(ht.TString), None),
1792 197b323b Michael Hanselmann
    ("fail", False, ht.TBool, None),
1793 e58f87a9 Michael Hanselmann
    ]
1794 e58f87a9 Michael Hanselmann
1795 e58f87a9 Michael Hanselmann
1796 be760ba8 Michael Hanselmann
class OpTestDummy(OpCode):
1797 be760ba8 Michael Hanselmann
  """Utility opcode used by unittests.
1798 be760ba8 Michael Hanselmann

1799 be760ba8 Michael Hanselmann
  """
1800 65e183af Michael Hanselmann
  OP_PARAMS = [
1801 197b323b Michael Hanselmann
    ("result", ht.NoDefault, ht.NoType, None),
1802 197b323b Michael Hanselmann
    ("messages", ht.NoDefault, ht.NoType, None),
1803 197b323b Michael Hanselmann
    ("fail", ht.NoDefault, ht.NoType, None),
1804 6a373640 Michael Hanselmann
    ("submit_jobs", None, ht.NoType, None),
1805 be760ba8 Michael Hanselmann
    ]
1806 687c10d9 Iustin Pop
  WITH_LU = False
1807 be760ba8 Michael Hanselmann
1808 be760ba8 Michael Hanselmann
1809 dbc96028 Michael Hanselmann
def _GetOpList():
1810 dbc96028 Michael Hanselmann
  """Returns list of all defined opcodes.
1811 dbc96028 Michael Hanselmann

1812 dbc96028 Michael Hanselmann
  Does not eliminate duplicates by C{OP_ID}.
1813 dbc96028 Michael Hanselmann

1814 dbc96028 Michael Hanselmann
  """
1815 dbc96028 Michael Hanselmann
  return [v for v in globals().values()
1816 dbc96028 Michael Hanselmann
          if (isinstance(v, type) and issubclass(v, OpCode) and
1817 687c10d9 Iustin Pop
              hasattr(v, "OP_ID") and v is not OpCode)]
1818 dbc96028 Michael Hanselmann
1819 dbc96028 Michael Hanselmann
1820 dbc96028 Michael Hanselmann
OP_MAPPING = dict((v.OP_ID, v) for v in _GetOpList())