Statistics
| Branch: | Tag: | Revision:

root / lib / opcodes.py @ cfdf561d

History | View | Annotate | Download (58.2 kB)

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

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

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

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

226 ff0d18e6 Iustin Pop
  @type name: string
227 ff0d18e6 Iustin Pop
  @param name: the class name, as OpXxxYyy
228 ff0d18e6 Iustin Pop
  @rtype: string
229 ff0d18e6 Iustin Pop
  @return: the name in the OP_XXXX_YYYY format
230 ff0d18e6 Iustin Pop

231 ff0d18e6 Iustin Pop
  """
232 ff0d18e6 Iustin Pop
  if not name.startswith("Op"):
233 ff0d18e6 Iustin Pop
    return None
234 ff0d18e6 Iustin Pop
  # Note: (?<=[a-z])(?=[A-Z]) would be ideal, since it wouldn't
235 ff0d18e6 Iustin Pop
  # consume any input, and hence we would just have all the elements
236 ff0d18e6 Iustin Pop
  # in the list, one by one; but it seems that split doesn't work on
237 ff0d18e6 Iustin Pop
  # non-consuming input, hence we have to process the input string a
238 ff0d18e6 Iustin Pop
  # bit
239 ff0d18e6 Iustin Pop
  name = _OPID_RE.sub(r"\1,\2", name)
240 ff0d18e6 Iustin Pop
  elems = name.split(",")
241 ff0d18e6 Iustin Pop
  return "_".join(n.upper() for n in elems)
242 ff0d18e6 Iustin Pop
243 65e183af Michael Hanselmann
244 415feb2e René Nussbaumer
def _GenerateObjectTypeCheck(obj, fields_types):
245 415feb2e René Nussbaumer
  """Helper to generate type checks for objects.
246 415feb2e René Nussbaumer

247 415feb2e René Nussbaumer
  @param obj: The object to generate type checks
248 415feb2e René Nussbaumer
  @param fields_types: The fields and their types as a dict
249 415feb2e René Nussbaumer
  @return: A ht type check function
250 415feb2e René Nussbaumer

251 415feb2e René Nussbaumer
  """
252 415feb2e René Nussbaumer
  assert set(obj.GetAllSlots()) == set(fields_types.keys()), \
253 415feb2e René Nussbaumer
    "%s != %s" % (set(obj.GetAllSlots()), set(fields_types.keys()))
254 415feb2e René Nussbaumer
  return ht.TStrictDict(True, True, fields_types)
255 415feb2e René Nussbaumer
256 415feb2e René Nussbaumer
257 b02c6bdf Michael Hanselmann
_TQueryFieldDef = \
258 b02c6bdf Michael Hanselmann
  _GenerateObjectTypeCheck(objects.QueryFieldDefinition, {
259 b02c6bdf Michael Hanselmann
    "name": ht.TNonEmptyString,
260 b02c6bdf Michael Hanselmann
    "title": ht.TNonEmptyString,
261 b02c6bdf Michael Hanselmann
    "kind": ht.TElemOf(constants.QFT_ALL),
262 b02c6bdf Michael Hanselmann
    "doc": ht.TNonEmptyString,
263 b02c6bdf Michael Hanselmann
    })
264 415feb2e René Nussbaumer
265 415feb2e René Nussbaumer
266 65e183af Michael Hanselmann
def RequireFileStorage():
267 65e183af Michael Hanselmann
  """Checks that file storage is enabled.
268 65e183af Michael Hanselmann

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

272 65e183af Michael Hanselmann
  @raise errors.OpPrereqError: when file storage is disabled
273 65e183af Michael Hanselmann

274 65e183af Michael Hanselmann
  """
275 65e183af Michael Hanselmann
  if not constants.ENABLE_FILE_STORAGE:
276 65e183af Michael Hanselmann
    raise errors.OpPrereqError("File storage disabled at configure time",
277 65e183af Michael Hanselmann
                               errors.ECODE_INVAL)
278 65e183af Michael Hanselmann
279 65e183af Michael Hanselmann
280 4b97f902 Apollon Oikonomopoulos
def RequireSharedFileStorage():
281 4b97f902 Apollon Oikonomopoulos
  """Checks that shared file storage is enabled.
282 4b97f902 Apollon Oikonomopoulos

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

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

288 4b97f902 Apollon Oikonomopoulos
  """
289 4b97f902 Apollon Oikonomopoulos
  if not constants.ENABLE_SHARED_FILE_STORAGE:
290 4b97f902 Apollon Oikonomopoulos
    raise errors.OpPrereqError("Shared file storage disabled at"
291 4b97f902 Apollon Oikonomopoulos
                               " configure time", errors.ECODE_INVAL)
292 4b97f902 Apollon Oikonomopoulos
293 4b97f902 Apollon Oikonomopoulos
294 8c9ee749 Michael Hanselmann
@ht.WithDesc("CheckFileStorage")
295 8c9ee749 Michael Hanselmann
def _CheckFileStorage(value):
296 8c9ee749 Michael Hanselmann
  """Ensures file storage is enabled if used.
297 65e183af Michael Hanselmann

298 65e183af Michael Hanselmann
  """
299 8c9ee749 Michael Hanselmann
  if value == constants.DT_FILE:
300 65e183af Michael Hanselmann
    RequireFileStorage()
301 4b97f902 Apollon Oikonomopoulos
  elif value == constants.DT_SHARED_FILE:
302 4b97f902 Apollon Oikonomopoulos
    RequireSharedFileStorage()
303 65e183af Michael Hanselmann
  return True
304 65e183af Michael Hanselmann
305 65e183af Michael Hanselmann
306 45fe090b Michael Hanselmann
def _BuildDiskTemplateCheck(accept_none):
307 45fe090b Michael Hanselmann
  """Builds check for disk template.
308 45fe090b Michael Hanselmann

309 45fe090b Michael Hanselmann
  @type accept_none: bool
310 45fe090b Michael Hanselmann
  @param accept_none: whether to accept None as a correct value
311 45fe090b Michael Hanselmann
  @rtype: callable
312 45fe090b Michael Hanselmann

313 45fe090b Michael Hanselmann
  """
314 45fe090b Michael Hanselmann
  template_check = ht.TElemOf(constants.DISK_TEMPLATES)
315 45fe090b Michael Hanselmann
316 45fe090b Michael Hanselmann
  if accept_none:
317 45fe090b Michael Hanselmann
    template_check = ht.TOr(template_check, ht.TNone)
318 45fe090b Michael Hanselmann
319 45fe090b Michael Hanselmann
  return ht.TAnd(template_check, _CheckFileStorage)
320 8c9ee749 Michael Hanselmann
321 8c9ee749 Michael Hanselmann
322 65e183af Michael Hanselmann
def _CheckStorageType(storage_type):
323 65e183af Michael Hanselmann
  """Ensure a given storage type is valid.
324 65e183af Michael Hanselmann

325 65e183af Michael Hanselmann
  """
326 65e183af Michael Hanselmann
  if storage_type not in constants.VALID_STORAGE_TYPES:
327 65e183af Michael Hanselmann
    raise errors.OpPrereqError("Unknown storage type: %s" % storage_type,
328 65e183af Michael Hanselmann
                               errors.ECODE_INVAL)
329 65e183af Michael Hanselmann
  if storage_type == constants.ST_FILE:
330 65e183af Michael Hanselmann
    RequireFileStorage()
331 65e183af Michael Hanselmann
  return True
332 65e183af Michael Hanselmann
333 65e183af Michael Hanselmann
334 65e183af Michael Hanselmann
#: Storage type parameter
335 45d4c81c Michael Hanselmann
_PStorageType = ("storage_type", ht.NoDefault, _CheckStorageType,
336 45d4c81c Michael Hanselmann
                 "Storage type")
337 65e183af Michael Hanselmann
338 65e183af Michael Hanselmann
339 65e183af Michael Hanselmann
class _AutoOpParamSlots(type):
340 65e183af Michael Hanselmann
  """Meta class for opcode definitions.
341 65e183af Michael Hanselmann

342 65e183af Michael Hanselmann
  """
343 65e183af Michael Hanselmann
  def __new__(mcs, name, bases, attrs):
344 65e183af Michael Hanselmann
    """Called when a class should be created.
345 65e183af Michael Hanselmann

346 65e183af Michael Hanselmann
    @param mcs: The meta class
347 65e183af Michael Hanselmann
    @param name: Name of created class
348 65e183af Michael Hanselmann
    @param bases: Base classes
349 65e183af Michael Hanselmann
    @type attrs: dict
350 65e183af Michael Hanselmann
    @param attrs: Class attributes
351 65e183af Michael Hanselmann

352 65e183af Michael Hanselmann
    """
353 65e183af Michael Hanselmann
    assert "__slots__" not in attrs, \
354 65e183af Michael Hanselmann
      "Class '%s' defines __slots__ when it should use OP_PARAMS" % name
355 e89a9021 Iustin Pop
    assert "OP_ID" not in attrs, "Class '%s' defining OP_ID" % name
356 ff0d18e6 Iustin Pop
357 e89a9021 Iustin Pop
    attrs["OP_ID"] = _NameToId(name)
358 65e183af Michael Hanselmann
359 65e183af Michael Hanselmann
    # Always set OP_PARAMS to avoid duplicates in BaseOpCode.GetAllParams
360 65e183af Michael Hanselmann
    params = attrs.setdefault("OP_PARAMS", [])
361 65e183af Michael Hanselmann
362 65e183af Michael Hanselmann
    # Use parameter names as slots
363 197b323b Michael Hanselmann
    slots = [pname for (pname, _, _, _) in params]
364 65e183af Michael Hanselmann
365 65e183af Michael Hanselmann
    assert "OP_DSC_FIELD" not in attrs or attrs["OP_DSC_FIELD"] in slots, \
366 65e183af Michael Hanselmann
      "Class '%s' uses unknown field in OP_DSC_FIELD" % name
367 65e183af Michael Hanselmann
368 65e183af Michael Hanselmann
    attrs["__slots__"] = slots
369 65e183af Michael Hanselmann
370 65e183af Michael Hanselmann
    return type.__new__(mcs, name, bases, attrs)
371 65e183af Michael Hanselmann
372 df458e0b Iustin Pop
373 0e46916d Iustin Pop
class BaseOpCode(object):
374 df458e0b Iustin Pop
  """A simple serializable object.
375 df458e0b Iustin Pop

376 0e46916d Iustin Pop
  This object serves as a parent class for OpCode without any custom
377 0e46916d Iustin Pop
  field handling.
378 0e46916d Iustin Pop

379 df458e0b Iustin Pop
  """
380 b459a848 Andrea Spadaccini
  # pylint: disable=E1101
381 e89a9021 Iustin Pop
  # as OP_ID is dynamically defined
382 65e183af Michael Hanselmann
  __metaclass__ = _AutoOpParamSlots
383 65e183af Michael Hanselmann
384 a8083063 Iustin Pop
  def __init__(self, **kwargs):
385 a7399f66 Iustin Pop
    """Constructor for BaseOpCode.
386 a7399f66 Iustin Pop

387 a7399f66 Iustin Pop
    The constructor takes only keyword arguments and will set
388 a7399f66 Iustin Pop
    attributes on this object based on the passed arguments. As such,
389 a7399f66 Iustin Pop
    it means that you should not pass arguments which are not in the
390 a7399f66 Iustin Pop
    __slots__ attribute for this class.
391 a7399f66 Iustin Pop

392 a7399f66 Iustin Pop
    """
393 adf385c7 Iustin Pop
    slots = self._all_slots()
394 a8083063 Iustin Pop
    for key in kwargs:
395 adf385c7 Iustin Pop
      if key not in slots:
396 df458e0b Iustin Pop
        raise TypeError("Object %s doesn't support the parameter '%s'" %
397 3ecf6786 Iustin Pop
                        (self.__class__.__name__, key))
398 a8083063 Iustin Pop
      setattr(self, key, kwargs[key])
399 a8083063 Iustin Pop
400 df458e0b Iustin Pop
  def __getstate__(self):
401 a7399f66 Iustin Pop
    """Generic serializer.
402 a7399f66 Iustin Pop

403 a7399f66 Iustin Pop
    This method just returns the contents of the instance as a
404 a7399f66 Iustin Pop
    dictionary.
405 a7399f66 Iustin Pop

406 a7399f66 Iustin Pop
    @rtype:  C{dict}
407 a7399f66 Iustin Pop
    @return: the instance attributes and their values
408 a7399f66 Iustin Pop

409 a7399f66 Iustin Pop
    """
410 df458e0b Iustin Pop
    state = {}
411 adf385c7 Iustin Pop
    for name in self._all_slots():
412 df458e0b Iustin Pop
      if hasattr(self, name):
413 df458e0b Iustin Pop
        state[name] = getattr(self, name)
414 df458e0b Iustin Pop
    return state
415 df458e0b Iustin Pop
416 df458e0b Iustin Pop
  def __setstate__(self, state):
417 a7399f66 Iustin Pop
    """Generic unserializer.
418 a7399f66 Iustin Pop

419 a7399f66 Iustin Pop
    This method just restores from the serialized state the attributes
420 a7399f66 Iustin Pop
    of the current instance.
421 a7399f66 Iustin Pop

422 a7399f66 Iustin Pop
    @param state: the serialized opcode data
423 a7399f66 Iustin Pop
    @type state:  C{dict}
424 a7399f66 Iustin Pop

425 a7399f66 Iustin Pop
    """
426 df458e0b Iustin Pop
    if not isinstance(state, dict):
427 df458e0b Iustin Pop
      raise ValueError("Invalid data to __setstate__: expected dict, got %s" %
428 df458e0b Iustin Pop
                       type(state))
429 df458e0b Iustin Pop
430 adf385c7 Iustin Pop
    for name in self._all_slots():
431 44db3a6f Iustin Pop
      if name not in state and hasattr(self, name):
432 df458e0b Iustin Pop
        delattr(self, name)
433 df458e0b Iustin Pop
434 df458e0b Iustin Pop
    for name in state:
435 df458e0b Iustin Pop
      setattr(self, name, state[name])
436 df458e0b Iustin Pop
437 adf385c7 Iustin Pop
  @classmethod
438 adf385c7 Iustin Pop
  def _all_slots(cls):
439 adf385c7 Iustin Pop
    """Compute the list of all declared slots for a class.
440 adf385c7 Iustin Pop

441 adf385c7 Iustin Pop
    """
442 adf385c7 Iustin Pop
    slots = []
443 adf385c7 Iustin Pop
    for parent in cls.__mro__:
444 adf385c7 Iustin Pop
      slots.extend(getattr(parent, "__slots__", []))
445 adf385c7 Iustin Pop
    return slots
446 adf385c7 Iustin Pop
447 65e183af Michael Hanselmann
  @classmethod
448 65e183af Michael Hanselmann
  def GetAllParams(cls):
449 65e183af Michael Hanselmann
    """Compute list of all parameters for an opcode.
450 65e183af Michael Hanselmann

451 65e183af Michael Hanselmann
    """
452 65e183af Michael Hanselmann
    slots = []
453 65e183af Michael Hanselmann
    for parent in cls.__mro__:
454 65e183af Michael Hanselmann
      slots.extend(getattr(parent, "OP_PARAMS", []))
455 65e183af Michael Hanselmann
    return slots
456 65e183af Michael Hanselmann
457 1cbef6d8 Michael Hanselmann
  def Validate(self, set_defaults):
458 1cbef6d8 Michael Hanselmann
    """Validate opcode parameters, optionally setting default values.
459 1cbef6d8 Michael Hanselmann

460 1cbef6d8 Michael Hanselmann
    @type set_defaults: bool
461 1cbef6d8 Michael Hanselmann
    @param set_defaults: Whether to set default values
462 1cbef6d8 Michael Hanselmann
    @raise errors.OpPrereqError: When a parameter value doesn't match
463 1cbef6d8 Michael Hanselmann
                                 requirements
464 1cbef6d8 Michael Hanselmann

465 1cbef6d8 Michael Hanselmann
    """
466 197b323b Michael Hanselmann
    for (attr_name, default, test, _) in self.GetAllParams():
467 1cbef6d8 Michael Hanselmann
      assert test == ht.NoType or callable(test)
468 1cbef6d8 Michael Hanselmann
469 1cbef6d8 Michael Hanselmann
      if not hasattr(self, attr_name):
470 1cbef6d8 Michael Hanselmann
        if default == ht.NoDefault:
471 1cbef6d8 Michael Hanselmann
          raise errors.OpPrereqError("Required parameter '%s.%s' missing" %
472 1cbef6d8 Michael Hanselmann
                                     (self.OP_ID, attr_name),
473 1cbef6d8 Michael Hanselmann
                                     errors.ECODE_INVAL)
474 1cbef6d8 Michael Hanselmann
        elif set_defaults:
475 1cbef6d8 Michael Hanselmann
          if callable(default):
476 1cbef6d8 Michael Hanselmann
            dval = default()
477 1cbef6d8 Michael Hanselmann
          else:
478 1cbef6d8 Michael Hanselmann
            dval = default
479 1cbef6d8 Michael Hanselmann
          setattr(self, attr_name, dval)
480 1cbef6d8 Michael Hanselmann
481 1cbef6d8 Michael Hanselmann
      if test == ht.NoType:
482 1cbef6d8 Michael Hanselmann
        # no tests here
483 1cbef6d8 Michael Hanselmann
        continue
484 1cbef6d8 Michael Hanselmann
485 1cbef6d8 Michael Hanselmann
      if set_defaults or hasattr(self, attr_name):
486 1cbef6d8 Michael Hanselmann
        attr_val = getattr(self, attr_name)
487 1cbef6d8 Michael Hanselmann
        if not test(attr_val):
488 1cbef6d8 Michael Hanselmann
          logging.error("OpCode %s, parameter %s, has invalid type %s/value %s",
489 1cbef6d8 Michael Hanselmann
                        self.OP_ID, attr_name, type(attr_val), attr_val)
490 1cbef6d8 Michael Hanselmann
          raise errors.OpPrereqError("Parameter '%s.%s' fails validation" %
491 1cbef6d8 Michael Hanselmann
                                     (self.OP_ID, attr_name),
492 1cbef6d8 Michael Hanselmann
                                     errors.ECODE_INVAL)
493 1cbef6d8 Michael Hanselmann
494 df458e0b Iustin Pop
495 b247c6fc Michael Hanselmann
def _BuildJobDepCheck(relative):
496 b247c6fc Michael Hanselmann
  """Builds check for job dependencies (L{DEPEND_ATTR}).
497 b247c6fc Michael Hanselmann

498 b247c6fc Michael Hanselmann
  @type relative: bool
499 b247c6fc Michael Hanselmann
  @param relative: Whether to accept relative job IDs (negative)
500 b247c6fc Michael Hanselmann
  @rtype: callable
501 b247c6fc Michael Hanselmann

502 b247c6fc Michael Hanselmann
  """
503 b247c6fc Michael Hanselmann
  if relative:
504 b247c6fc Michael Hanselmann
    job_id = ht.TOr(ht.TJobId, ht.TRelativeJobId)
505 b247c6fc Michael Hanselmann
  else:
506 b247c6fc Michael Hanselmann
    job_id = ht.TJobId
507 b247c6fc Michael Hanselmann
508 b247c6fc Michael Hanselmann
  job_dep = \
509 b247c6fc Michael Hanselmann
    ht.TAnd(ht.TIsLength(2),
510 b247c6fc Michael Hanselmann
            ht.TItems([job_id,
511 b247c6fc Michael Hanselmann
                       ht.TListOf(ht.TElemOf(constants.JOBS_FINALIZED))]))
512 b247c6fc Michael Hanselmann
513 ff8067cf Michael Hanselmann
  return ht.TMaybeListOf(job_dep)
514 b247c6fc Michael Hanselmann
515 b247c6fc Michael Hanselmann
516 b247c6fc Michael Hanselmann
TNoRelativeJobDependencies = _BuildJobDepCheck(False)
517 b247c6fc Michael Hanselmann
518 1ce03fb1 Michael Hanselmann
#: List of submission status and job ID as returned by C{SubmitManyJobs}
519 1456df62 Michael Hanselmann
_TJobIdListItem = \
520 1456df62 Michael Hanselmann
  ht.TAnd(ht.TIsLength(2),
521 1456df62 Michael Hanselmann
          ht.TItems([ht.Comment("success")(ht.TBool),
522 1456df62 Michael Hanselmann
                     ht.Comment("Job ID if successful, error message"
523 1456df62 Michael Hanselmann
                                " otherwise")(ht.TOr(ht.TString,
524 1456df62 Michael Hanselmann
                                                     ht.TJobId))]))
525 1456df62 Michael Hanselmann
TJobIdList = ht.TListOf(_TJobIdListItem)
526 1ce03fb1 Michael Hanselmann
527 f7686867 Michael Hanselmann
#: Result containing only list of submitted jobs
528 f7686867 Michael Hanselmann
TJobIdListOnly = ht.TStrictDict(True, True, {
529 1456df62 Michael Hanselmann
  constants.JOB_IDS_KEY: ht.Comment("List of submitted jobs")(TJobIdList),
530 f7686867 Michael Hanselmann
  })
531 f7686867 Michael Hanselmann
532 b247c6fc Michael Hanselmann
533 0e46916d Iustin Pop
class OpCode(BaseOpCode):
534 a7399f66 Iustin Pop
  """Abstract OpCode.
535 a7399f66 Iustin Pop

536 a7399f66 Iustin Pop
  This is the root of the actual OpCode hierarchy. All clases derived
537 a7399f66 Iustin Pop
  from this class should override OP_ID.
538 a7399f66 Iustin Pop

539 a7399f66 Iustin Pop
  @cvar OP_ID: The ID of this opcode. This should be unique amongst all
540 20777413 Iustin Pop
               children of this class.
541 bde8f481 Adeodato Simo
  @cvar OP_DSC_FIELD: The name of a field whose value will be included in the
542 bde8f481 Adeodato Simo
                      string returned by Summary(); see the docstring of that
543 bde8f481 Adeodato Simo
                      method for details).
544 65e183af Michael Hanselmann
  @cvar OP_PARAMS: List of opcode attributes, the default values they should
545 65e183af Michael Hanselmann
                   get if not already defined, and types they must match.
546 1ce03fb1 Michael Hanselmann
  @cvar OP_RESULT: Callable to verify opcode result
547 687c10d9 Iustin Pop
  @cvar WITH_LU: Boolean that specifies whether this should be included in
548 687c10d9 Iustin Pop
      mcpu's dispatch table
549 20777413 Iustin Pop
  @ivar dry_run: Whether the LU should be run in dry-run mode, i.e. just
550 20777413 Iustin Pop
                 the check steps
551 8f5c488d Michael Hanselmann
  @ivar priority: Opcode priority for queue
552 a7399f66 Iustin Pop

553 a7399f66 Iustin Pop
  """
554 b459a848 Andrea Spadaccini
  # pylint: disable=E1101
555 e89a9021 Iustin Pop
  # as OP_ID is dynamically defined
556 687c10d9 Iustin Pop
  WITH_LU = True
557 65e183af Michael Hanselmann
  OP_PARAMS = [
558 45d4c81c Michael Hanselmann
    ("dry_run", None, ht.TMaybeBool, "Run checks only, don't execute"),
559 45d4c81c Michael Hanselmann
    ("debug_level", None, ht.TOr(ht.TNone, ht.TPositiveInt), "Debug level"),
560 65e183af Michael Hanselmann
    ("priority", constants.OP_PRIO_DEFAULT,
561 45d4c81c Michael Hanselmann
     ht.TElemOf(constants.OP_PRIO_SUBMIT_VALID), "Opcode priority"),
562 b247c6fc Michael Hanselmann
    (DEPEND_ATTR, None, _BuildJobDepCheck(True),
563 b247c6fc Michael Hanselmann
     "Job dependencies; if used through ``SubmitManyJobs`` relative (negative)"
564 822a50c4 Michael Hanselmann
     " job IDs can be used; see :doc:`design document <design-chained-jobs>`"
565 822a50c4 Michael Hanselmann
     " for details"),
566 018ae30b Michael Hanselmann
    (COMMENT_ATTR, None, ht.TMaybeString,
567 018ae30b Michael Hanselmann
     "Comment describing the purpose of the opcode"),
568 65e183af Michael Hanselmann
    ]
569 1ce03fb1 Michael Hanselmann
  OP_RESULT = None
570 df458e0b Iustin Pop
571 df458e0b Iustin Pop
  def __getstate__(self):
572 df458e0b Iustin Pop
    """Specialized getstate for opcodes.
573 df458e0b Iustin Pop

574 a7399f66 Iustin Pop
    This method adds to the state dictionary the OP_ID of the class,
575 a7399f66 Iustin Pop
    so that on unload we can identify the correct class for
576 a7399f66 Iustin Pop
    instantiating the opcode.
577 a7399f66 Iustin Pop

578 a7399f66 Iustin Pop
    @rtype:   C{dict}
579 a7399f66 Iustin Pop
    @return:  the state as a dictionary
580 a7399f66 Iustin Pop

581 df458e0b Iustin Pop
    """
582 0e46916d Iustin Pop
    data = BaseOpCode.__getstate__(self)
583 df458e0b Iustin Pop
    data["OP_ID"] = self.OP_ID
584 df458e0b Iustin Pop
    return data
585 df458e0b Iustin Pop
586 df458e0b Iustin Pop
  @classmethod
587 00abdc96 Iustin Pop
  def LoadOpCode(cls, data):
588 df458e0b Iustin Pop
    """Generic load opcode method.
589 df458e0b Iustin Pop

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

594 a7399f66 Iustin Pop
    @type data:  C{dict}
595 a7399f66 Iustin Pop
    @param data: the serialized opcode
596 a7399f66 Iustin Pop

597 df458e0b Iustin Pop
    """
598 df458e0b Iustin Pop
    if not isinstance(data, dict):
599 df458e0b Iustin Pop
      raise ValueError("Invalid data to LoadOpCode (%s)" % type(data))
600 df458e0b Iustin Pop
    if "OP_ID" not in data:
601 df458e0b Iustin Pop
      raise ValueError("Invalid data to LoadOpcode, missing OP_ID")
602 df458e0b Iustin Pop
    op_id = data["OP_ID"]
603 df458e0b Iustin Pop
    op_class = None
604 363acb1e Iustin Pop
    if op_id in OP_MAPPING:
605 363acb1e Iustin Pop
      op_class = OP_MAPPING[op_id]
606 363acb1e Iustin Pop
    else:
607 df458e0b Iustin Pop
      raise ValueError("Invalid data to LoadOpCode: OP_ID %s unsupported" %
608 df458e0b Iustin Pop
                       op_id)
609 df458e0b Iustin Pop
    op = op_class()
610 df458e0b Iustin Pop
    new_data = data.copy()
611 df458e0b Iustin Pop
    del new_data["OP_ID"]
612 df458e0b Iustin Pop
    op.__setstate__(new_data)
613 df458e0b Iustin Pop
    return op
614 df458e0b Iustin Pop
615 60dd1473 Iustin Pop
  def Summary(self):
616 60dd1473 Iustin Pop
    """Generates a summary description of this opcode.
617 60dd1473 Iustin Pop

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

624 60dd1473 Iustin Pop
    """
625 ff0d18e6 Iustin Pop
    assert self.OP_ID is not None and len(self.OP_ID) > 3
626 60dd1473 Iustin Pop
    # all OP_ID start with OP_, we remove that
627 60dd1473 Iustin Pop
    txt = self.OP_ID[3:]
628 60dd1473 Iustin Pop
    field_name = getattr(self, "OP_DSC_FIELD", None)
629 60dd1473 Iustin Pop
    if field_name:
630 60dd1473 Iustin Pop
      field_value = getattr(self, field_name, None)
631 bc8bbda1 Iustin Pop
      if isinstance(field_value, (list, tuple)):
632 bc8bbda1 Iustin Pop
        field_value = ",".join(str(i) for i in field_value)
633 60dd1473 Iustin Pop
      txt = "%s(%s)" % (txt, field_value)
634 60dd1473 Iustin Pop
    return txt
635 60dd1473 Iustin Pop
636 3ce9a5e7 Michael Hanselmann
  def TinySummary(self):
637 3ce9a5e7 Michael Hanselmann
    """Generates a compact summary description of the opcode.
638 3ce9a5e7 Michael Hanselmann

639 3ce9a5e7 Michael Hanselmann
    """
640 3ce9a5e7 Michael Hanselmann
    assert self.OP_ID.startswith("OP_")
641 3ce9a5e7 Michael Hanselmann
642 3ce9a5e7 Michael Hanselmann
    text = self.OP_ID[3:]
643 3ce9a5e7 Michael Hanselmann
644 3ce9a5e7 Michael Hanselmann
    for (prefix, supplement) in _SUMMARY_PREFIX.items():
645 3ce9a5e7 Michael Hanselmann
      if text.startswith(prefix):
646 3ce9a5e7 Michael Hanselmann
        return supplement + text[len(prefix):]
647 3ce9a5e7 Michael Hanselmann
648 3ce9a5e7 Michael Hanselmann
    return text
649 3ce9a5e7 Michael Hanselmann
650 a8083063 Iustin Pop
651 afee0879 Iustin Pop
# cluster opcodes
652 afee0879 Iustin Pop
653 bc84ffa7 Iustin Pop
class OpClusterPostInit(OpCode):
654 b5f5fae9 Luca Bigliardi
  """Post cluster initialization.
655 b5f5fae9 Luca Bigliardi

656 b5f5fae9 Luca Bigliardi
  This opcode does not touch the cluster at all. Its purpose is to run hooks
657 b5f5fae9 Luca Bigliardi
  after the cluster has been initialized.
658 b5f5fae9 Luca Bigliardi

659 b5f5fae9 Luca Bigliardi
  """
660 c363310d René Nussbaumer
  OP_RESULT = ht.TBool
661 b5f5fae9 Luca Bigliardi
662 b5f5fae9 Luca Bigliardi
663 c6d43e9e Iustin Pop
class OpClusterDestroy(OpCode):
664 a7399f66 Iustin Pop
  """Destroy the cluster.
665 a7399f66 Iustin Pop

666 a7399f66 Iustin Pop
  This opcode has no other parameters. All the state is irreversibly
667 a7399f66 Iustin Pop
  lost after the execution of this opcode.
668 a7399f66 Iustin Pop

669 a7399f66 Iustin Pop
  """
670 c363310d René Nussbaumer
  OP_RESULT = ht.TNonEmptyString
671 a8083063 Iustin Pop
672 a8083063 Iustin Pop
673 a2f7ab92 Iustin Pop
class OpClusterQuery(OpCode):
674 fdc267f4 Iustin Pop
  """Query cluster information."""
675 415feb2e René Nussbaumer
  OP_RESULT = ht.TDictOf(ht.TNonEmptyString, ht.TAny)
676 a8083063 Iustin Pop
677 a8083063 Iustin Pop
678 fcad7225 Michael Hanselmann
class OpClusterVerify(OpCode):
679 fcad7225 Michael Hanselmann
  """Submits all jobs necessary to verify the cluster.
680 fcad7225 Michael Hanselmann

681 fcad7225 Michael Hanselmann
  """
682 fcad7225 Michael Hanselmann
  OP_PARAMS = [
683 fcad7225 Michael Hanselmann
    _PDebugSimulateErrors,
684 fcad7225 Michael Hanselmann
    _PErrorCodes,
685 fcad7225 Michael Hanselmann
    _PSkipChecks,
686 93f2399e Andrea Spadaccini
    _PIgnoreErrors,
687 fcad7225 Michael Hanselmann
    _PVerbose,
688 fcad7225 Michael Hanselmann
    ("group_name", None, ht.TMaybeString, "Group to verify")
689 fcad7225 Michael Hanselmann
    ]
690 f7686867 Michael Hanselmann
  OP_RESULT = TJobIdListOnly
691 fcad7225 Michael Hanselmann
692 fcad7225 Michael Hanselmann
693 bf93ae69 Adeodato Simo
class OpClusterVerifyConfig(OpCode):
694 bf93ae69 Adeodato Simo
  """Verify the cluster config.
695 bf93ae69 Adeodato Simo

696 bf93ae69 Adeodato Simo
  """
697 bf93ae69 Adeodato Simo
  OP_PARAMS = [
698 57106b74 Michael Hanselmann
    _PDebugSimulateErrors,
699 57106b74 Michael Hanselmann
    _PErrorCodes,
700 93f2399e Andrea Spadaccini
    _PIgnoreErrors,
701 57106b74 Michael Hanselmann
    _PVerbose,
702 bf93ae69 Adeodato Simo
    ]
703 f7686867 Michael Hanselmann
  OP_RESULT = ht.TBool
704 bf93ae69 Adeodato Simo
705 bf93ae69 Adeodato Simo
706 bf93ae69 Adeodato Simo
class OpClusterVerifyGroup(OpCode):
707 bf93ae69 Adeodato Simo
  """Run verify on a node group from the cluster.
708 a7399f66 Iustin Pop

709 a7399f66 Iustin Pop
  @type skip_checks: C{list}
710 a7399f66 Iustin Pop
  @ivar skip_checks: steps to be skipped from the verify process; this
711 a7399f66 Iustin Pop
                     needs to be a subset of
712 a7399f66 Iustin Pop
                     L{constants.VERIFY_OPTIONAL_CHECKS}; currently
713 a7399f66 Iustin Pop
                     only L{constants.VERIFY_NPLUSONE_MEM} can be passed
714 a7399f66 Iustin Pop

715 a7399f66 Iustin Pop
  """
716 bf93ae69 Adeodato Simo
  OP_DSC_FIELD = "group_name"
717 65e183af Michael Hanselmann
  OP_PARAMS = [
718 57106b74 Michael Hanselmann
    _PGroupName,
719 57106b74 Michael Hanselmann
    _PDebugSimulateErrors,
720 57106b74 Michael Hanselmann
    _PErrorCodes,
721 57106b74 Michael Hanselmann
    _PSkipChecks,
722 93f2399e Andrea Spadaccini
    _PIgnoreErrors,
723 57106b74 Michael Hanselmann
    _PVerbose,
724 65e183af Michael Hanselmann
    ]
725 f7686867 Michael Hanselmann
  OP_RESULT = ht.TBool
726 a8083063 Iustin Pop
727 a8083063 Iustin Pop
728 bd8210a7 Iustin Pop
class OpClusterVerifyDisks(OpCode):
729 150e978f Iustin Pop
  """Verify the cluster disks.
730 150e978f Iustin Pop

731 ae1a845c Michael Hanselmann
  """
732 f7686867 Michael Hanselmann
  OP_RESULT = TJobIdListOnly
733 ae1a845c Michael Hanselmann
734 ae1a845c Michael Hanselmann
735 ae1a845c Michael Hanselmann
class OpGroupVerifyDisks(OpCode):
736 ae1a845c Michael Hanselmann
  """Verifies the status of all disks in a node group.
737 150e978f Iustin Pop

738 ae1a845c Michael Hanselmann
  Result: a tuple of three elements:
739 ae1a845c Michael Hanselmann
    - dict of node names with issues (values: error msg)
740 150e978f Iustin Pop
    - list of instances with degraded disks (that should be activated)
741 b63ed789 Iustin Pop
    - dict of instances with missing logical volumes (values: (node, vol)
742 b63ed789 Iustin Pop
      pairs with details about the missing volumes)
743 150e978f Iustin Pop

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

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

752 150e978f Iustin Pop
  """
753 ae1a845c Michael Hanselmann
  OP_DSC_FIELD = "group_name"
754 ae1a845c Michael Hanselmann
  OP_PARAMS = [
755 ae1a845c Michael Hanselmann
    _PGroupName,
756 ae1a845c Michael Hanselmann
    ]
757 1ce03fb1 Michael Hanselmann
  OP_RESULT = \
758 1ce03fb1 Michael Hanselmann
    ht.TAnd(ht.TIsLength(3),
759 1ce03fb1 Michael Hanselmann
            ht.TItems([ht.TDictOf(ht.TString, ht.TString),
760 1ce03fb1 Michael Hanselmann
                       ht.TListOf(ht.TString),
761 6973587f Michael Hanselmann
                       ht.TDictOf(ht.TString,
762 6973587f Michael Hanselmann
                                  ht.TListOf(ht.TListOf(ht.TString)))]))
763 150e978f Iustin Pop
764 150e978f Iustin Pop
765 5d01aca3 Iustin Pop
class OpClusterRepairDiskSizes(OpCode):
766 60975797 Iustin Pop
  """Verify the disk sizes of the instances and fixes configuration
767 60975797 Iustin Pop
  mimatches.
768 60975797 Iustin Pop

769 60975797 Iustin Pop
  Parameters: optional instances list, in case we want to restrict the
770 60975797 Iustin Pop
  checks to only a subset of the instances.
771 60975797 Iustin Pop

772 60975797 Iustin Pop
  Result: a list of tuples, (instance, disk, new-size) for changed
773 60975797 Iustin Pop
  configurations.
774 60975797 Iustin Pop

775 60975797 Iustin Pop
  In normal operation, the list should be empty.
776 60975797 Iustin Pop

777 60975797 Iustin Pop
  @type instances: list
778 60975797 Iustin Pop
  @ivar instances: the list of instances to check, or empty for all instances
779 60975797 Iustin Pop

780 60975797 Iustin Pop
  """
781 65e183af Michael Hanselmann
  OP_PARAMS = [
782 197b323b Michael Hanselmann
    ("instances", ht.EmptyList, ht.TListOf(ht.TNonEmptyString), None),
783 65e183af Michael Hanselmann
    ]
784 c363310d René Nussbaumer
  OP_RESULT = ht.TListOf(ht.TAnd(ht.TIsLength(3),
785 c363310d René Nussbaumer
                                 ht.TItems([ht.TNonEmptyString,
786 c363310d René Nussbaumer
                                            ht.TPositiveInt,
787 c363310d René Nussbaumer
                                            ht.TPositiveInt])))
788 60975797 Iustin Pop
789 60975797 Iustin Pop
790 2f093ea0 Iustin Pop
class OpClusterConfigQuery(OpCode):
791 ae5849b5 Michael Hanselmann
  """Query cluster configuration values."""
792 65e183af Michael Hanselmann
  OP_PARAMS = [
793 65e183af Michael Hanselmann
    _POutputFields
794 65e183af Michael Hanselmann
    ]
795 c363310d René Nussbaumer
  OP_RESULT = ht.TListOf(ht.TAny)
796 a8083063 Iustin Pop
797 a8083063 Iustin Pop
798 e126df25 Iustin Pop
class OpClusterRename(OpCode):
799 a7399f66 Iustin Pop
  """Rename the cluster.
800 a7399f66 Iustin Pop

801 a7399f66 Iustin Pop
  @type name: C{str}
802 a7399f66 Iustin Pop
  @ivar name: The new name of the cluster. The name and/or the master IP
803 a7399f66 Iustin Pop
              address will be changed to match the new name and its IP
804 a7399f66 Iustin Pop
              address.
805 a7399f66 Iustin Pop

806 a7399f66 Iustin Pop
  """
807 60dd1473 Iustin Pop
  OP_DSC_FIELD = "name"
808 65e183af Michael Hanselmann
  OP_PARAMS = [
809 197b323b Michael Hanselmann
    ("name", ht.NoDefault, ht.TNonEmptyString, None),
810 65e183af Michael Hanselmann
    ]
811 c363310d René Nussbaumer
  OP_RESULT = ht.TNonEmptyString
812 07bd8a51 Iustin Pop
813 07bd8a51 Iustin Pop
814 a6682fdc Iustin Pop
class OpClusterSetParams(OpCode):
815 a7399f66 Iustin Pop
  """Change the parameters of the cluster.
816 a7399f66 Iustin Pop

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

820 a7399f66 Iustin Pop
  """
821 65e183af Michael Hanselmann
  OP_PARAMS = [
822 2da9f556 René Nussbaumer
    _PHvState,
823 2da9f556 René Nussbaumer
    _PDiskState,
824 45d4c81c Michael Hanselmann
    ("vg_name", None, ht.TMaybeString, "Volume group name"),
825 65e183af Michael Hanselmann
    ("enabled_hypervisors", None,
826 65e183af Michael Hanselmann
     ht.TOr(ht.TAnd(ht.TListOf(ht.TElemOf(constants.HYPER_TYPES)), ht.TTrue),
827 45d4c81c Michael Hanselmann
            ht.TNone),
828 45d4c81c Michael Hanselmann
     "List of enabled hypervisors"),
829 65e183af Michael Hanselmann
    ("hvparams", None, ht.TOr(ht.TDictOf(ht.TNonEmptyString, ht.TDict),
830 45d4c81c Michael Hanselmann
                              ht.TNone),
831 45d4c81c Michael Hanselmann
     "Cluster-wide hypervisor parameter defaults, hypervisor-dependent"),
832 45d4c81c Michael Hanselmann
    ("beparams", None, ht.TOr(ht.TDict, ht.TNone),
833 45d4c81c Michael Hanselmann
     "Cluster-wide backend parameter defaults"),
834 65e183af Michael Hanselmann
    ("os_hvp", None, ht.TOr(ht.TDictOf(ht.TNonEmptyString, ht.TDict),
835 45d4c81c Michael Hanselmann
                            ht.TNone),
836 45d4c81c Michael Hanselmann
     "Cluster-wide per-OS hypervisor parameter defaults"),
837 65e183af Michael Hanselmann
    ("osparams", None, ht.TOr(ht.TDictOf(ht.TNonEmptyString, ht.TDict),
838 45d4c81c Michael Hanselmann
                              ht.TNone),
839 45d4c81c Michael Hanselmann
     "Cluster-wide OS parameter defaults"),
840 bc5d0215 Andrea Spadaccini
    _PDiskParams,
841 197b323b Michael Hanselmann
    ("candidate_pool_size", None, ht.TOr(ht.TStrictPositiveInt, ht.TNone),
842 45d4c81c Michael Hanselmann
     "Master candidate pool size"),
843 45d4c81c Michael Hanselmann
    ("uid_pool", None, ht.NoType,
844 45d4c81c Michael Hanselmann
     "Set UID pool, must be list of lists describing UID ranges (two items,"
845 45d4c81c Michael Hanselmann
     " start and end inclusive)"),
846 45d4c81c Michael Hanselmann
    ("add_uids", None, ht.NoType,
847 45d4c81c Michael Hanselmann
     "Extend UID pool, must be list of lists describing UID ranges (two"
848 45d4c81c Michael Hanselmann
     " items, start and end inclusive) to be added"),
849 45d4c81c Michael Hanselmann
    ("remove_uids", None, ht.NoType,
850 45d4c81c Michael Hanselmann
     "Shrink UID pool, must be list of lists describing UID ranges (two"
851 45d4c81c Michael Hanselmann
     " items, start and end inclusive) to be removed"),
852 45d4c81c Michael Hanselmann
    ("maintain_node_health", None, ht.TMaybeBool,
853 45d4c81c Michael Hanselmann
     "Whether to automatically maintain node health"),
854 45d4c81c Michael Hanselmann
    ("prealloc_wipe_disks", None, ht.TMaybeBool,
855 45d4c81c Michael Hanselmann
     "Whether to wipe disks before allocating them to instances"),
856 45d4c81c Michael Hanselmann
    ("nicparams", None, ht.TMaybeDict, "Cluster-wide NIC parameter defaults"),
857 45d4c81c Michael Hanselmann
    ("ndparams", None, ht.TMaybeDict, "Cluster-wide node parameter defaults"),
858 1b01390b René Nussbaumer
    ("ipolicy", None, ht.TMaybeDict,
859 1b01390b René Nussbaumer
     "Cluster-wide :ref:`instance policy <rapi-ipolicy>` specs"),
860 45d4c81c Michael Hanselmann
    ("drbd_helper", None, ht.TOr(ht.TString, ht.TNone), "DRBD helper program"),
861 45d4c81c Michael Hanselmann
    ("default_iallocator", None, ht.TOr(ht.TString, ht.TNone),
862 45d4c81c Michael Hanselmann
     "Default iallocator for cluster"),
863 45d4c81c Michael Hanselmann
    ("master_netdev", None, ht.TOr(ht.TString, ht.TNone),
864 45d4c81c Michael Hanselmann
     "Master network device"),
865 5a8648eb Andrea Spadaccini
    ("master_netmask", None, ht.TOr(ht.TInt, ht.TNone),
866 5a8648eb Andrea Spadaccini
     "Netmask of the master IP"),
867 ff8067cf Michael Hanselmann
    ("reserved_lvs", None, ht.TMaybeListOf(ht.TNonEmptyString),
868 45d4c81c Michael Hanselmann
     "List of reserved LVs"),
869 45d4c81c Michael Hanselmann
    ("hidden_os", None, _TestClusterOsList,
870 45d4c81c Michael Hanselmann
     "Modify list of hidden operating systems. Each modification must have"
871 45d4c81c Michael Hanselmann
     " two items, the operation and the OS name. The operation can be"
872 45d4c81c Michael Hanselmann
     " ``%s`` or ``%s``." % (constants.DDM_ADD, constants.DDM_REMOVE)),
873 45d4c81c Michael Hanselmann
    ("blacklisted_os", None, _TestClusterOsList,
874 45d4c81c Michael Hanselmann
     "Modify list of blacklisted operating systems. Each modification must have"
875 45d4c81c Michael Hanselmann
     " two items, the operation and the OS name. The operation can be"
876 45d4c81c Michael Hanselmann
     " ``%s`` or ``%s``." % (constants.DDM_ADD, constants.DDM_REMOVE)),
877 bf689b7a Andrea Spadaccini
    ("use_external_mip_script", None, ht.TMaybeBool,
878 bf689b7a Andrea Spadaccini
     "Whether to use an external master IP address setup script"),
879 4b7735f9 Iustin Pop
    ]
880 c363310d René Nussbaumer
  OP_RESULT = ht.TNone
881 12515db7 Manuel Franceschini
882 12515db7 Manuel Franceschini
883 d1240007 Iustin Pop
class OpClusterRedistConf(OpCode):
884 afee0879 Iustin Pop
  """Force a full push of the cluster configuration.
885 afee0879 Iustin Pop

886 afee0879 Iustin Pop
  """
887 c363310d René Nussbaumer
  OP_RESULT = ht.TNone
888 afee0879 Iustin Pop
889 83f72637 Michael Hanselmann
890 fb926117 Andrea Spadaccini
class OpClusterActivateMasterIp(OpCode):
891 fb926117 Andrea Spadaccini
  """Activate the master IP on the master node.
892 fb926117 Andrea Spadaccini

893 fb926117 Andrea Spadaccini
  """
894 c363310d René Nussbaumer
  OP_RESULT = ht.TNone
895 fb926117 Andrea Spadaccini
896 fb926117 Andrea Spadaccini
897 fb926117 Andrea Spadaccini
class OpClusterDeactivateMasterIp(OpCode):
898 fb926117 Andrea Spadaccini
  """Deactivate the master IP on the master node.
899 fb926117 Andrea Spadaccini

900 fb926117 Andrea Spadaccini
  """
901 c363310d René Nussbaumer
  OP_RESULT = ht.TNone
902 fb926117 Andrea Spadaccini
903 fb926117 Andrea Spadaccini
904 83f72637 Michael Hanselmann
class OpQuery(OpCode):
905 83f72637 Michael Hanselmann
  """Query for resources/items.
906 83f72637 Michael Hanselmann

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

911 83f72637 Michael Hanselmann
  """
912 e50d8412 Michael Hanselmann
  OP_DSC_FIELD = "what"
913 65e183af Michael Hanselmann
  OP_PARAMS = [
914 8e7078e0 Michael Hanselmann
    _PQueryWhat,
915 ee13764f Michael Hanselmann
    _PUseLocking,
916 45d4c81c Michael Hanselmann
    ("fields", ht.NoDefault, ht.TListOf(ht.TNonEmptyString),
917 45d4c81c Michael Hanselmann
     "Requested fields"),
918 7bfb3367 Iustin Pop
    ("qfilter", None, ht.TOr(ht.TNone, ht.TList),
919 45d4c81c Michael Hanselmann
     "Query filter"),
920 83f72637 Michael Hanselmann
    ]
921 415feb2e René Nussbaumer
  OP_RESULT = \
922 b02c6bdf Michael Hanselmann
    _GenerateObjectTypeCheck(objects.QueryResponse, {
923 b02c6bdf Michael Hanselmann
      "fields": ht.TListOf(_TQueryFieldDef),
924 b02c6bdf Michael Hanselmann
      "data": _TQueryResult,
925 b02c6bdf Michael Hanselmann
      })
926 83f72637 Michael Hanselmann
927 83f72637 Michael Hanselmann
928 83f72637 Michael Hanselmann
class OpQueryFields(OpCode):
929 83f72637 Michael Hanselmann
  """Query for available resource/item fields.
930 83f72637 Michael Hanselmann

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

934 83f72637 Michael Hanselmann
  """
935 e50d8412 Michael Hanselmann
  OP_DSC_FIELD = "what"
936 65e183af Michael Hanselmann
  OP_PARAMS = [
937 8e7078e0 Michael Hanselmann
    _PQueryWhat,
938 ff8067cf Michael Hanselmann
    ("fields", None, ht.TMaybeListOf(ht.TNonEmptyString),
939 8e7078e0 Michael Hanselmann
     "Requested fields; if not given, all are returned"),
940 83f72637 Michael Hanselmann
    ]
941 415feb2e René Nussbaumer
  OP_RESULT = \
942 b02c6bdf Michael Hanselmann
    _GenerateObjectTypeCheck(objects.QueryFieldsResponse, {
943 b02c6bdf Michael Hanselmann
      "fields": ht.TListOf(_TQueryFieldDef),
944 b02c6bdf Michael Hanselmann
      })
945 83f72637 Michael Hanselmann
946 83f72637 Michael Hanselmann
947 792af3ad René Nussbaumer
class OpOobCommand(OpCode):
948 eb64da59 René Nussbaumer
  """Interact with OOB."""
949 65e183af Michael Hanselmann
  OP_PARAMS = [
950 c4ec0755 René Nussbaumer
    ("node_names", ht.EmptyList, ht.TListOf(ht.TNonEmptyString),
951 c4ec0755 René Nussbaumer
     "List of nodes to run the OOB command against"),
952 c4ec0755 René Nussbaumer
    ("command", None, ht.TElemOf(constants.OOB_COMMANDS),
953 c4ec0755 René Nussbaumer
     "OOB command to be run"),
954 c4ec0755 René Nussbaumer
    ("timeout", constants.OOB_TIMEOUT, ht.TInt,
955 c4ec0755 René Nussbaumer
     "Timeout before the OOB helper will be terminated"),
956 c4ec0755 René Nussbaumer
    ("ignore_status", False, ht.TBool,
957 c4ec0755 René Nussbaumer
     "Ignores the node offline status for power off"),
958 beff3779 René Nussbaumer
    ("power_delay", constants.OOB_POWER_DELAY, ht.TPositiveFloat,
959 beff3779 René Nussbaumer
     "Time in seconds to wait between powering on nodes"),
960 eb64da59 René Nussbaumer
    ]
961 c363310d René Nussbaumer
  # Fixme: Make it more specific with all the special cases in LUOobCommand
962 415feb2e René Nussbaumer
  OP_RESULT = _TQueryResult
963 eb64da59 René Nussbaumer
964 eb64da59 René Nussbaumer
965 07bd8a51 Iustin Pop
# node opcodes
966 07bd8a51 Iustin Pop
967 73d565a3 Iustin Pop
class OpNodeRemove(OpCode):
968 a7399f66 Iustin Pop
  """Remove a node.
969 a7399f66 Iustin Pop

970 a7399f66 Iustin Pop
  @type node_name: C{str}
971 a7399f66 Iustin Pop
  @ivar node_name: The name of the node to remove. If the node still has
972 a7399f66 Iustin Pop
                   instances on it, the operation will fail.
973 a7399f66 Iustin Pop

974 a7399f66 Iustin Pop
  """
975 60dd1473 Iustin Pop
  OP_DSC_FIELD = "node_name"
976 65e183af Michael Hanselmann
  OP_PARAMS = [
977 65e183af Michael Hanselmann
    _PNodeName,
978 65e183af Michael Hanselmann
    ]
979 c363310d René Nussbaumer
  OP_RESULT = ht.TNone
980 a8083063 Iustin Pop
981 a8083063 Iustin Pop
982 d817d49f Iustin Pop
class OpNodeAdd(OpCode):
983 a7399f66 Iustin Pop
  """Add a node to the cluster.
984 a7399f66 Iustin Pop

985 a7399f66 Iustin Pop
  @type node_name: C{str}
986 a7399f66 Iustin Pop
  @ivar node_name: The name of the node to add. This can be a short name,
987 a7399f66 Iustin Pop
                   but it will be expanded to the FQDN.
988 a7399f66 Iustin Pop
  @type primary_ip: IP address
989 a7399f66 Iustin Pop
  @ivar primary_ip: The primary IP of the node. This will be ignored when the
990 a7399f66 Iustin Pop
                    opcode is submitted, but will be filled during the node
991 a7399f66 Iustin Pop
                    add (so it will be visible in the job query).
992 a7399f66 Iustin Pop
  @type secondary_ip: IP address
993 a7399f66 Iustin Pop
  @ivar secondary_ip: The secondary IP of the node. This needs to be passed
994 a7399f66 Iustin Pop
                      if the cluster has been initialized in 'dual-network'
995 a7399f66 Iustin Pop
                      mode, otherwise it must not be given.
996 a7399f66 Iustin Pop
  @type readd: C{bool}
997 a7399f66 Iustin Pop
  @ivar readd: Whether to re-add an existing node to the cluster. If
998 a7399f66 Iustin Pop
               this is not passed, then the operation will abort if the node
999 a7399f66 Iustin Pop
               name is already in the cluster; use this parameter to 'repair'
1000 a7399f66 Iustin Pop
               a node that had its configuration broken, or was reinstalled
1001 a7399f66 Iustin Pop
               without removal from the cluster.
1002 f936c153 Iustin Pop
  @type group: C{str}
1003 f936c153 Iustin Pop
  @ivar group: The node group to which this node will belong.
1004 fd3d37b6 Iustin Pop
  @type vm_capable: C{bool}
1005 fd3d37b6 Iustin Pop
  @ivar vm_capable: The vm_capable node attribute
1006 fd3d37b6 Iustin Pop
  @type master_capable: C{bool}
1007 fd3d37b6 Iustin Pop
  @ivar master_capable: The master_capable node attribute
1008 a7399f66 Iustin Pop

1009 a7399f66 Iustin Pop
  """
1010 60dd1473 Iustin Pop
  OP_DSC_FIELD = "node_name"
1011 65e183af Michael Hanselmann
  OP_PARAMS = [
1012 65e183af Michael Hanselmann
    _PNodeName,
1013 085e0d9f René Nussbaumer
    _PHvState,
1014 085e0d9f René Nussbaumer
    _PDiskState,
1015 45d4c81c Michael Hanselmann
    ("primary_ip", None, ht.NoType, "Primary IP address"),
1016 45d4c81c Michael Hanselmann
    ("secondary_ip", None, ht.TMaybeString, "Secondary IP address"),
1017 45d4c81c Michael Hanselmann
    ("readd", False, ht.TBool, "Whether node is re-added to cluster"),
1018 45d4c81c Michael Hanselmann
    ("group", None, ht.TMaybeString, "Initial node group"),
1019 45d4c81c Michael Hanselmann
    ("master_capable", None, ht.TMaybeBool,
1020 45d4c81c Michael Hanselmann
     "Whether node can become master or master candidate"),
1021 45d4c81c Michael Hanselmann
    ("vm_capable", None, ht.TMaybeBool,
1022 45d4c81c Michael Hanselmann
     "Whether node can host instances"),
1023 45d4c81c Michael Hanselmann
    ("ndparams", None, ht.TMaybeDict, "Node parameters"),
1024 65e183af Michael Hanselmann
    ]
1025 c363310d René Nussbaumer
  OP_RESULT = ht.TNone
1026 a8083063 Iustin Pop
1027 a8083063 Iustin Pop
1028 2237687b Iustin Pop
class OpNodeQuery(OpCode):
1029 a8083063 Iustin Pop
  """Compute the list of nodes."""
1030 65e183af Michael Hanselmann
  OP_PARAMS = [
1031 65e183af Michael Hanselmann
    _POutputFields,
1032 45d4c81c Michael Hanselmann
    _PUseLocking,
1033 45d4c81c Michael Hanselmann
    ("names", ht.EmptyList, ht.TListOf(ht.TNonEmptyString),
1034 45d4c81c Michael Hanselmann
     "Empty list to query all nodes, node names otherwise"),
1035 65e183af Michael Hanselmann
    ]
1036 415feb2e René Nussbaumer
  OP_RESULT = _TOldQueryResult
1037 a8083063 Iustin Pop
1038 a8083063 Iustin Pop
1039 8ed55bfd Iustin Pop
class OpNodeQueryvols(OpCode):
1040 dcb93971 Michael Hanselmann
  """Get list of volumes on node."""
1041 65e183af Michael Hanselmann
  OP_PARAMS = [
1042 65e183af Michael Hanselmann
    _POutputFields,
1043 45d4c81c Michael Hanselmann
    ("nodes", ht.EmptyList, ht.TListOf(ht.TNonEmptyString),
1044 45d4c81c Michael Hanselmann
     "Empty list to query all nodes, node names otherwise"),
1045 65e183af Michael Hanselmann
    ]
1046 c363310d René Nussbaumer
  OP_RESULT = ht.TListOf(ht.TAny)
1047 dcb93971 Michael Hanselmann
1048 dcb93971 Michael Hanselmann
1049 ad8d0595 Iustin Pop
class OpNodeQueryStorage(OpCode):
1050 9e5442ce Michael Hanselmann
  """Get information on storage for node(s)."""
1051 65e183af Michael Hanselmann
  OP_PARAMS = [
1052 65e183af Michael Hanselmann
    _POutputFields,
1053 65e183af Michael Hanselmann
    _PStorageType,
1054 45d4c81c Michael Hanselmann
    ("nodes", ht.EmptyList, ht.TListOf(ht.TNonEmptyString), "List of nodes"),
1055 45d4c81c Michael Hanselmann
    ("name", None, ht.TMaybeString, "Storage name"),
1056 9e5442ce Michael Hanselmann
    ]
1057 415feb2e René Nussbaumer
  OP_RESULT = _TOldQueryResult
1058 9e5442ce Michael Hanselmann
1059 9e5442ce Michael Hanselmann
1060 2cee4077 Iustin Pop
class OpNodeModifyStorage(OpCode):
1061 099c52ad Iustin Pop
  """Modifies the properies of a storage unit"""
1062 65e183af Michael Hanselmann
  OP_PARAMS = [
1063 65e183af Michael Hanselmann
    _PNodeName,
1064 65e183af Michael Hanselmann
    _PStorageType,
1065 45d4c81c Michael Hanselmann
    _PStorageName,
1066 45d4c81c Michael Hanselmann
    ("changes", ht.NoDefault, ht.TDict, "Requested changes"),
1067 efb8da02 Michael Hanselmann
    ]
1068 c363310d René Nussbaumer
  OP_RESULT = ht.TNone
1069 efb8da02 Michael Hanselmann
1070 efb8da02 Michael Hanselmann
1071 76aef8fc Michael Hanselmann
class OpRepairNodeStorage(OpCode):
1072 76aef8fc Michael Hanselmann
  """Repairs the volume group on a node."""
1073 76aef8fc Michael Hanselmann
  OP_DSC_FIELD = "node_name"
1074 65e183af Michael Hanselmann
  OP_PARAMS = [
1075 65e183af Michael Hanselmann
    _PNodeName,
1076 65e183af Michael Hanselmann
    _PStorageType,
1077 45d4c81c Michael Hanselmann
    _PStorageName,
1078 45d4c81c Michael Hanselmann
    _PIgnoreConsistency,
1079 76aef8fc Michael Hanselmann
    ]
1080 c363310d René Nussbaumer
  OP_RESULT = ht.TNone
1081 76aef8fc Michael Hanselmann
1082 76aef8fc Michael Hanselmann
1083 f13973c4 Iustin Pop
class OpNodeSetParams(OpCode):
1084 b31c8676 Iustin Pop
  """Change the parameters of a node."""
1085 b31c8676 Iustin Pop
  OP_DSC_FIELD = "node_name"
1086 65e183af Michael Hanselmann
  OP_PARAMS = [
1087 65e183af Michael Hanselmann
    _PNodeName,
1088 65e183af Michael Hanselmann
    _PForce,
1089 0ec2ce46 René Nussbaumer
    _PHvState,
1090 0ec2ce46 René Nussbaumer
    _PDiskState,
1091 45d4c81c Michael Hanselmann
    ("master_candidate", None, ht.TMaybeBool,
1092 45d4c81c Michael Hanselmann
     "Whether the node should become a master candidate"),
1093 45d4c81c Michael Hanselmann
    ("offline", None, ht.TMaybeBool,
1094 45d4c81c Michael Hanselmann
     "Whether the node should be marked as offline"),
1095 45d4c81c Michael Hanselmann
    ("drained", None, ht.TMaybeBool,
1096 45d4c81c Michael Hanselmann
     "Whether the node should be marked as drained"),
1097 45d4c81c Michael Hanselmann
    ("auto_promote", False, ht.TBool,
1098 45d4c81c Michael Hanselmann
     "Whether node(s) should be promoted to master candidate if necessary"),
1099 45d4c81c Michael Hanselmann
    ("master_capable", None, ht.TMaybeBool,
1100 45d4c81c Michael Hanselmann
     "Denote whether node can become master or master candidate"),
1101 45d4c81c Michael Hanselmann
    ("vm_capable", None, ht.TMaybeBool,
1102 45d4c81c Michael Hanselmann
     "Denote whether node can host instances"),
1103 45d4c81c Michael Hanselmann
    ("secondary_ip", None, ht.TMaybeString,
1104 45d4c81c Michael Hanselmann
     "Change node's secondary IP address"),
1105 45d4c81c Michael Hanselmann
    ("ndparams", None, ht.TMaybeDict, "Set node parameters"),
1106 45d4c81c Michael Hanselmann
    ("powered", None, ht.TMaybeBool,
1107 45d4c81c Michael Hanselmann
     "Whether the node should be marked as powered"),
1108 b31c8676 Iustin Pop
    ]
1109 1456df62 Michael Hanselmann
  OP_RESULT = _TSetParamsResult
1110 b31c8676 Iustin Pop
1111 f5118ade Iustin Pop
1112 e0d4735f Iustin Pop
class OpNodePowercycle(OpCode):
1113 f5118ade Iustin Pop
  """Tries to powercycle a node."""
1114 f5118ade Iustin Pop
  OP_DSC_FIELD = "node_name"
1115 65e183af Michael Hanselmann
  OP_PARAMS = [
1116 65e183af Michael Hanselmann
    _PNodeName,
1117 65e183af Michael Hanselmann
    _PForce,
1118 f5118ade Iustin Pop
    ]
1119 c363310d René Nussbaumer
  OP_RESULT = ht.TMaybeString
1120 f5118ade Iustin Pop
1121 7ffc5a86 Michael Hanselmann
1122 5b14a488 Iustin Pop
class OpNodeMigrate(OpCode):
1123 80cb875c Michael Hanselmann
  """Migrate all instances from a node."""
1124 80cb875c Michael Hanselmann
  OP_DSC_FIELD = "node_name"
1125 65e183af Michael Hanselmann
  OP_PARAMS = [
1126 65e183af Michael Hanselmann
    _PNodeName,
1127 65e183af Michael Hanselmann
    _PMigrationMode,
1128 65e183af Michael Hanselmann
    _PMigrationLive,
1129 f8fa4175 Michael Hanselmann
    _PMigrationTargetNode,
1130 8c0b16f6 Guido Trotter
    _PAllowRuntimeChgs,
1131 9fa567b3 René Nussbaumer
    _PIgnoreIpolicy,
1132 8eb34306 Apollon Oikonomopoulos
    ("iallocator", None, ht.TMaybeString,
1133 8eb34306 Apollon Oikonomopoulos
     "Iallocator for deciding the target node for shared-storage instances"),
1134 80cb875c Michael Hanselmann
    ]
1135 65c9591c Michael Hanselmann
  OP_RESULT = TJobIdListOnly
1136 80cb875c Michael Hanselmann
1137 80cb875c Michael Hanselmann
1138 e1f23243 Michael Hanselmann
class OpNodeEvacuate(OpCode):
1139 e1f23243 Michael Hanselmann
  """Evacuate instances off a number of nodes."""
1140 e1f23243 Michael Hanselmann
  OP_DSC_FIELD = "node_name"
1141 e1f23243 Michael Hanselmann
  OP_PARAMS = [
1142 e1f23243 Michael Hanselmann
    _PEarlyRelease,
1143 e1f23243 Michael Hanselmann
    _PNodeName,
1144 e1f23243 Michael Hanselmann
    ("remote_node", None, ht.TMaybeString, "New secondary node"),
1145 e1f23243 Michael Hanselmann
    ("iallocator", None, ht.TMaybeString, "Iallocator for computing solution"),
1146 cb92e7a1 Michael Hanselmann
    ("mode", ht.NoDefault, ht.TElemOf(constants.NODE_EVAC_MODES),
1147 e1f23243 Michael Hanselmann
     "Node evacuation mode"),
1148 e1f23243 Michael Hanselmann
    ]
1149 1456df62 Michael Hanselmann
  OP_RESULT = TJobIdListOnly
1150 e1f23243 Michael Hanselmann
1151 e1f23243 Michael Hanselmann
1152 a8083063 Iustin Pop
# instance opcodes
1153 a8083063 Iustin Pop
1154 e1530b10 Iustin Pop
class OpInstanceCreate(OpCode):
1155 9bf56d77 Michael Hanselmann
  """Create an instance.
1156 9bf56d77 Michael Hanselmann

1157 9bf56d77 Michael Hanselmann
  @ivar instance_name: Instance name
1158 9bf56d77 Michael Hanselmann
  @ivar mode: Instance creation mode (one of L{constants.INSTANCE_CREATE_MODES})
1159 9bf56d77 Michael Hanselmann
  @ivar source_handshake: Signed handshake from source (remote import only)
1160 9bf56d77 Michael Hanselmann
  @ivar source_x509_ca: Source X509 CA in PEM format (remote import only)
1161 9bf56d77 Michael Hanselmann
  @ivar source_instance_name: Previous name of instance (remote import only)
1162 dae91d02 Michael Hanselmann
  @ivar source_shutdown_timeout: Shutdown timeout used for source instance
1163 dae91d02 Michael Hanselmann
    (remote import only)
1164 9bf56d77 Michael Hanselmann

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

1341 53c776b5 Iustin Pop
  This migrates (without shutting down an instance) to its secondary
1342 53c776b5 Iustin Pop
  node.
1343 53c776b5 Iustin Pop

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

1347 53c776b5 Iustin Pop
  """
1348 ee69c97f Iustin Pop
  OP_DSC_FIELD = "instance_name"
1349 65e183af Michael Hanselmann
  OP_PARAMS = [
1350 65e183af Michael Hanselmann
    _PInstanceName,
1351 65e183af Michael Hanselmann
    _PMigrationMode,
1352 65e183af Michael Hanselmann
    _PMigrationLive,
1353 f8fa4175 Michael Hanselmann
    _PMigrationTargetNode,
1354 8c0b16f6 Guido Trotter
    _PAllowRuntimeChgs,
1355 3ed23330 René Nussbaumer
    _PIgnoreIpolicy,
1356 45d4c81c Michael Hanselmann
    ("cleanup", False, ht.TBool,
1357 45d4c81c Michael Hanselmann
     "Whether a previously failed migration should be cleaned up"),
1358 8eb34306 Apollon Oikonomopoulos
    ("iallocator", None, ht.TMaybeString,
1359 8eb34306 Apollon Oikonomopoulos
     "Iallocator for deciding the target node for shared-storage instances"),
1360 d5cafd31 René Nussbaumer
    ("allow_failover", False, ht.TBool,
1361 d5cafd31 René Nussbaumer
     "Whether we can fallback to failover if migration is not possible"),
1362 65e183af Michael Hanselmann
    ]
1363 c363310d René Nussbaumer
  OP_RESULT = ht.TNone
1364 53c776b5 Iustin Pop
1365 53c776b5 Iustin Pop
1366 0091b480 Iustin Pop
class OpInstanceMove(OpCode):
1367 313bcead Iustin Pop
  """Move an instance.
1368 313bcead Iustin Pop

1369 313bcead Iustin Pop
  This move (with shutting down an instance and data copying) to an
1370 313bcead Iustin Pop
  arbitrary node.
1371 313bcead Iustin Pop

1372 313bcead Iustin Pop
  @ivar instance_name: the name of the instance
1373 313bcead Iustin Pop
  @ivar target_node: the destination node
1374 313bcead Iustin Pop

1375 313bcead Iustin Pop
  """
1376 313bcead Iustin Pop
  OP_DSC_FIELD = "instance_name"
1377 65e183af Michael Hanselmann
  OP_PARAMS = [
1378 65e183af Michael Hanselmann
    _PInstanceName,
1379 65e183af Michael Hanselmann
    _PShutdownTimeout,
1380 92cf62e3 René Nussbaumer
    _PIgnoreIpolicy,
1381 45d4c81c Michael Hanselmann
    ("target_node", ht.NoDefault, ht.TNonEmptyString, "Target node"),
1382 bb851c63 Iustin Pop
    _PIgnoreConsistency,
1383 154b9580 Balazs Lecz
    ]
1384 c363310d René Nussbaumer
  OP_RESULT = ht.TNone
1385 313bcead Iustin Pop
1386 313bcead Iustin Pop
1387 cc0dec7b Iustin Pop
class OpInstanceConsole(OpCode):
1388 fdc267f4 Iustin Pop
  """Connect to an instance's console."""
1389 60dd1473 Iustin Pop
  OP_DSC_FIELD = "instance_name"
1390 65e183af Michael Hanselmann
  OP_PARAMS = [
1391 65e183af Michael Hanselmann
    _PInstanceName
1392 65e183af Michael Hanselmann
    ]
1393 c363310d René Nussbaumer
  OP_RESULT = ht.TDict
1394 a8083063 Iustin Pop
1395 a8083063 Iustin Pop
1396 83f5d475 Iustin Pop
class OpInstanceActivateDisks(OpCode):
1397 fdc267f4 Iustin Pop
  """Activate an instance's disks."""
1398 60dd1473 Iustin Pop
  OP_DSC_FIELD = "instance_name"
1399 65e183af Michael Hanselmann
  OP_PARAMS = [
1400 65e183af Michael Hanselmann
    _PInstanceName,
1401 45d4c81c Michael Hanselmann
    ("ignore_size", False, ht.TBool, "Whether to ignore recorded size"),
1402 65e183af Michael Hanselmann
    ]
1403 c363310d René Nussbaumer
  OP_RESULT = ht.TListOf(ht.TAnd(ht.TIsLength(3),
1404 c363310d René Nussbaumer
                                 ht.TItems([ht.TNonEmptyString,
1405 c363310d René Nussbaumer
                                            ht.TNonEmptyString,
1406 c363310d René Nussbaumer
                                            ht.TNonEmptyString])))
1407 a8083063 Iustin Pop
1408 a8083063 Iustin Pop
1409 e176281f Iustin Pop
class OpInstanceDeactivateDisks(OpCode):
1410 fdc267f4 Iustin Pop
  """Deactivate an instance's disks."""
1411 60dd1473 Iustin Pop
  OP_DSC_FIELD = "instance_name"
1412 65e183af Michael Hanselmann
  OP_PARAMS = [
1413 c9c41373 Iustin Pop
    _PInstanceName,
1414 c9c41373 Iustin Pop
    _PForce,
1415 65e183af Michael Hanselmann
    ]
1416 c363310d René Nussbaumer
  OP_RESULT = ht.TNone
1417 a8083063 Iustin Pop
1418 a8083063 Iustin Pop
1419 6b273e78 Iustin Pop
class OpInstanceRecreateDisks(OpCode):
1420 a52978c7 Michael Hanselmann
  """Recreate an instance's disks."""
1421 735e1318 Michael Hanselmann
  _TDiskChanges = \
1422 735e1318 Michael Hanselmann
    ht.TAnd(ht.TIsLength(2),
1423 735e1318 Michael Hanselmann
            ht.TItems([ht.Comment("Disk index")(ht.TPositiveInt),
1424 735e1318 Michael Hanselmann
                       ht.Comment("Parameters")(_TDiskParams)]))
1425 735e1318 Michael Hanselmann
1426 bd315bfa Iustin Pop
  OP_DSC_FIELD = "instance_name"
1427 65e183af Michael Hanselmann
  OP_PARAMS = [
1428 65e183af Michael Hanselmann
    _PInstanceName,
1429 735e1318 Michael Hanselmann
    ("disks", ht.EmptyList,
1430 735e1318 Michael Hanselmann
     ht.TOr(ht.TListOf(ht.TPositiveInt), ht.TListOf(_TDiskChanges)),
1431 735e1318 Michael Hanselmann
     "List of disk indexes (deprecated) or a list of tuples containing a disk"
1432 735e1318 Michael Hanselmann
     " index and a possibly empty dictionary with disk parameter changes"),
1433 93384b8c Guido Trotter
    ("nodes", ht.EmptyList, ht.TListOf(ht.TNonEmptyString),
1434 93384b8c Guido Trotter
     "New instance nodes, if relocation is desired"),
1435 65e183af Michael Hanselmann
    ]
1436 c363310d René Nussbaumer
  OP_RESULT = ht.TNone
1437 bd315bfa Iustin Pop
1438 bd315bfa Iustin Pop
1439 f2af0bec Iustin Pop
class OpInstanceQuery(OpCode):
1440 a8083063 Iustin Pop
  """Compute the list of instances."""
1441 65e183af Michael Hanselmann
  OP_PARAMS = [
1442 65e183af Michael Hanselmann
    _POutputFields,
1443 45d4c81c Michael Hanselmann
    _PUseLocking,
1444 45d4c81c Michael Hanselmann
    ("names", ht.EmptyList, ht.TListOf(ht.TNonEmptyString),
1445 45d4c81c Michael Hanselmann
     "Empty list to query all instances, instance names otherwise"),
1446 65e183af Michael Hanselmann
    ]
1447 415feb2e René Nussbaumer
  OP_RESULT = _TOldQueryResult
1448 a8083063 Iustin Pop
1449 a8083063 Iustin Pop
1450 dc28c4e4 Iustin Pop
class OpInstanceQueryData(OpCode):
1451 a8083063 Iustin Pop
  """Compute the run-time status of instances."""
1452 65e183af Michael Hanselmann
  OP_PARAMS = [
1453 af7b6689 Michael Hanselmann
    _PUseLocking,
1454 af7b6689 Michael Hanselmann
    ("instances", ht.EmptyList, ht.TListOf(ht.TNonEmptyString),
1455 af7b6689 Michael Hanselmann
     "Instance names"),
1456 af7b6689 Michael Hanselmann
    ("static", False, ht.TBool,
1457 af7b6689 Michael Hanselmann
     "Whether to only return configuration data without querying"
1458 af7b6689 Michael Hanselmann
     " nodes"),
1459 65e183af Michael Hanselmann
    ]
1460 415feb2e René Nussbaumer
  OP_RESULT = ht.TDictOf(ht.TNonEmptyString, ht.TDict)
1461 a8083063 Iustin Pop
1462 a8083063 Iustin Pop
1463 ddc1de7c Michael Hanselmann
def _TestInstSetParamsModList(fn):
1464 ddc1de7c Michael Hanselmann
  """Generates a check for modification lists.
1465 ddc1de7c Michael Hanselmann

1466 ddc1de7c Michael Hanselmann
  """
1467 e9c3d864 Michael Hanselmann
  # Old format
1468 e9c3d864 Michael Hanselmann
  # TODO: Remove in version 2.8 including support in LUInstanceSetParams
1469 e9c3d864 Michael Hanselmann
  old_mod_item_fn = \
1470 ddc1de7c Michael Hanselmann
    ht.TAnd(ht.TIsLength(2), ht.TItems([
1471 ddc1de7c Michael Hanselmann
      ht.TOr(ht.TElemOf(constants.DDMS_VALUES), ht.TPositiveInt),
1472 ddc1de7c Michael Hanselmann
      fn,
1473 ddc1de7c Michael Hanselmann
      ]))
1474 ddc1de7c Michael Hanselmann
1475 e9c3d864 Michael Hanselmann
  # New format, supporting adding/removing disks/NICs at arbitrary indices
1476 e9c3d864 Michael Hanselmann
  mod_item_fn = \
1477 e9c3d864 Michael Hanselmann
    ht.TAnd(ht.TIsLength(3), ht.TItems([
1478 e9c3d864 Michael Hanselmann
      ht.TElemOf(constants.DDMS_VALUES_WITH_MODIFY),
1479 e9c3d864 Michael Hanselmann
      ht.Comment("Disk index, can be negative, e.g. -1 for last disk")(ht.TInt),
1480 e9c3d864 Michael Hanselmann
      fn,
1481 e9c3d864 Michael Hanselmann
      ]))
1482 e9c3d864 Michael Hanselmann
1483 e9c3d864 Michael Hanselmann
  return ht.TOr(ht.Comment("Recommended")(ht.TListOf(mod_item_fn)),
1484 e9c3d864 Michael Hanselmann
                ht.Comment("Deprecated")(ht.TListOf(old_mod_item_fn)))
1485 ddc1de7c Michael Hanselmann
1486 ddc1de7c Michael Hanselmann
1487 9a3cc7ae Iustin Pop
class OpInstanceSetParams(OpCode):
1488 ddc1de7c Michael Hanselmann
  """Change the parameters of an instance.
1489 ddc1de7c Michael Hanselmann

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

1669 1410fa8d Michael Hanselmann
  @ivar instance_name: Instance name
1670 1410fa8d Michael Hanselmann
  @ivar mode: Export mode (one of L{constants.EXPORT_MODES})
1671 1410fa8d Michael Hanselmann

1672 1410fa8d Michael Hanselmann
  """
1673 1410fa8d Michael Hanselmann
  OP_DSC_FIELD = "instance_name"
1674 65e183af Michael Hanselmann
  OP_PARAMS = [
1675 65e183af Michael Hanselmann
    _PInstanceName,
1676 45d4c81c Michael Hanselmann
    ("mode", ht.NoDefault, ht.TElemOf(constants.EXPORT_MODES),
1677 45d4c81c Michael Hanselmann
     "Export mode"),
1678 1410fa8d Michael Hanselmann
    ]
1679 c363310d René Nussbaumer
  OP_RESULT = ht.TOr(ht.TNone, ht.TDict)
1680 1410fa8d Michael Hanselmann
1681 1410fa8d Michael Hanselmann
1682 4ff922a2 Iustin Pop
class OpBackupExport(OpCode):
1683 4a96f1d1 Michael Hanselmann
  """Export an instance.
1684 4a96f1d1 Michael Hanselmann

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

1691 4a96f1d1 Michael Hanselmann
  @ivar mode: Export mode (one of L{constants.EXPORT_MODES})
1692 4a96f1d1 Michael Hanselmann
  @ivar target_node: Export destination
1693 4a96f1d1 Michael Hanselmann
  @ivar x509_key_name: X509 key to use (remote export only)
1694 4a96f1d1 Michael Hanselmann
  @ivar destination_x509_ca: Destination X509 CA in PEM format (remote export
1695 4a96f1d1 Michael Hanselmann
                             only)
1696 4a96f1d1 Michael Hanselmann

1697 4a96f1d1 Michael Hanselmann
  """
1698 60dd1473 Iustin Pop
  OP_DSC_FIELD = "instance_name"
1699 65e183af Michael Hanselmann
  OP_PARAMS = [
1700 65e183af Michael Hanselmann
    _PInstanceName,
1701 65e183af Michael Hanselmann
    _PShutdownTimeout,
1702 4a96f1d1 Michael Hanselmann
    # TODO: Rename target_node as it changes meaning for different export modes
1703 4a96f1d1 Michael Hanselmann
    # (e.g. "destination")
1704 45d4c81c Michael Hanselmann
    ("target_node", ht.NoDefault, ht.TOr(ht.TNonEmptyString, ht.TList),
1705 45d4c81c Michael Hanselmann
     "Destination information, depends on export mode"),
1706 45d4c81c Michael Hanselmann
    ("shutdown", True, ht.TBool, "Whether to shutdown instance before export"),
1707 45d4c81c Michael Hanselmann
    ("remove_instance", False, ht.TBool,
1708 45d4c81c Michael Hanselmann
     "Whether to remove instance after export"),
1709 45d4c81c Michael Hanselmann
    ("ignore_remove_failures", False, ht.TBool,
1710 45d4c81c Michael Hanselmann
     "Whether to ignore failures while removing instances"),
1711 45d4c81c Michael Hanselmann
    ("mode", constants.EXPORT_MODE_LOCAL, ht.TElemOf(constants.EXPORT_MODES),
1712 45d4c81c Michael Hanselmann
     "Export mode"),
1713 45d4c81c Michael Hanselmann
    ("x509_key_name", None, ht.TOr(ht.TList, ht.TNone),
1714 45d4c81c Michael Hanselmann
     "Name of X509 key (remote export only)"),
1715 45d4c81c Michael Hanselmann
    ("destination_x509_ca", None, ht.TMaybeString,
1716 45d4c81c Michael Hanselmann
     "Destination X509 CA (remote export only)"),
1717 17c3f802 Guido Trotter
    ]
1718 202fb4e0 Michael Hanselmann
  OP_RESULT = \
1719 202fb4e0 Michael Hanselmann
    ht.TAnd(ht.TIsLength(2), ht.TItems([
1720 202fb4e0 Michael Hanselmann
      ht.Comment("Finalizing status")(ht.TBool),
1721 202fb4e0 Michael Hanselmann
      ht.Comment("Status for every exported disk")(ht.TListOf(ht.TBool)),
1722 202fb4e0 Michael Hanselmann
      ]))
1723 5c947f38 Iustin Pop
1724 0a7bed64 Michael Hanselmann
1725 ca5890ad Iustin Pop
class OpBackupRemove(OpCode):
1726 9ac99fda Guido Trotter
  """Remove an instance's export."""
1727 60dd1473 Iustin Pop
  OP_DSC_FIELD = "instance_name"
1728 65e183af Michael Hanselmann
  OP_PARAMS = [
1729 65e183af Michael Hanselmann
    _PInstanceName,
1730 65e183af Michael Hanselmann
    ]
1731 202fb4e0 Michael Hanselmann
  OP_RESULT = ht.TNone
1732 5c947f38 Iustin Pop
1733 0a7bed64 Michael Hanselmann
1734 5c947f38 Iustin Pop
# Tags opcodes
1735 c6afb1ca Iustin Pop
class OpTagsGet(OpCode):
1736 5c947f38 Iustin Pop
  """Returns the tags of the given object."""
1737 60dd1473 Iustin Pop
  OP_DSC_FIELD = "name"
1738 65e183af Michael Hanselmann
  OP_PARAMS = [
1739 65e183af Michael Hanselmann
    _PTagKind,
1740 cfdf561d Michael Hanselmann
    # Not using _PUseLocking as the default is different for historical reasons
1741 cfdf561d Michael Hanselmann
    ("use_locking", True, ht.TBool, "Whether to use synchronization"),
1742 65e183af Michael Hanselmann
    # Name is only meaningful for nodes and instances
1743 197b323b Michael Hanselmann
    ("name", ht.NoDefault, ht.TMaybeString, None),
1744 65e183af Michael Hanselmann
    ]
1745 48796673 Michael Hanselmann
  OP_RESULT = ht.TListOf(ht.TNonEmptyString)
1746 5c947f38 Iustin Pop
1747 5c947f38 Iustin Pop
1748 715462e7 Iustin Pop
class OpTagsSearch(OpCode):
1749 73415719 Iustin Pop
  """Searches the tags in the cluster for a given pattern."""
1750 60dd1473 Iustin Pop
  OP_DSC_FIELD = "pattern"
1751 65e183af Michael Hanselmann
  OP_PARAMS = [
1752 197b323b Michael Hanselmann
    ("pattern", ht.NoDefault, ht.TNonEmptyString, None),
1753 65e183af Michael Hanselmann
    ]
1754 48796673 Michael Hanselmann
  OP_RESULT = ht.TListOf(ht.TAnd(ht.TIsLength(2), ht.TItems([
1755 48796673 Michael Hanselmann
    ht.TNonEmptyString,
1756 48796673 Michael Hanselmann
    ht.TNonEmptyString,
1757 48796673 Michael Hanselmann
    ])))
1758 73415719 Iustin Pop
1759 73415719 Iustin Pop
1760 d1602edc Iustin Pop
class OpTagsSet(OpCode):
1761 f27302fa Iustin Pop
  """Add a list of tags on a given object."""
1762 65e183af Michael Hanselmann
  OP_PARAMS = [
1763 65e183af Michael Hanselmann
    _PTagKind,
1764 65e183af Michael Hanselmann
    _PTags,
1765 65e183af Michael Hanselmann
    # Name is only meaningful for nodes and instances
1766 197b323b Michael Hanselmann
    ("name", ht.NoDefault, ht.TMaybeString, None),
1767 65e183af Michael Hanselmann
    ]
1768 48796673 Michael Hanselmann
  OP_RESULT = ht.TNone
1769 5c947f38 Iustin Pop
1770 5c947f38 Iustin Pop
1771 3f0ab95f Iustin Pop
class OpTagsDel(OpCode):
1772 f27302fa Iustin Pop
  """Remove a list of tags from a given object."""
1773 65e183af Michael Hanselmann
  OP_PARAMS = [
1774 65e183af Michael Hanselmann
    _PTagKind,
1775 65e183af Michael Hanselmann
    _PTags,
1776 65e183af Michael Hanselmann
    # Name is only meaningful for nodes and instances
1777 197b323b Michael Hanselmann
    ("name", ht.NoDefault, ht.TMaybeString, None),
1778 65e183af Michael Hanselmann
    ]
1779 48796673 Michael Hanselmann
  OP_RESULT = ht.TNone
1780 06009e27 Iustin Pop
1781 e687ec01 Michael Hanselmann
1782 06009e27 Iustin Pop
# Test opcodes
1783 06009e27 Iustin Pop
class OpTestDelay(OpCode):
1784 06009e27 Iustin Pop
  """Sleeps for a configured amount of time.
1785 06009e27 Iustin Pop

1786 06009e27 Iustin Pop
  This is used just for debugging and testing.
1787 06009e27 Iustin Pop

1788 06009e27 Iustin Pop
  Parameters:
1789 06009e27 Iustin Pop
    - duration: the time to sleep
1790 06009e27 Iustin Pop
    - on_master: if true, sleep on the master
1791 06009e27 Iustin Pop
    - on_nodes: list of nodes in which to sleep
1792 06009e27 Iustin Pop

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

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

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

1803 06009e27 Iustin Pop
  """
1804 60dd1473 Iustin Pop
  OP_DSC_FIELD = "duration"
1805 65e183af Michael Hanselmann
  OP_PARAMS = [
1806 b795a775 Michael Hanselmann
    ("duration", ht.NoDefault, ht.TNumber, None),
1807 197b323b Michael Hanselmann
    ("on_master", True, ht.TBool, None),
1808 197b323b Michael Hanselmann
    ("on_nodes", ht.EmptyList, ht.TListOf(ht.TNonEmptyString), None),
1809 197b323b Michael Hanselmann
    ("repeat", 0, ht.TPositiveInt, None),
1810 65e183af Michael Hanselmann
    ]
1811 d61df03e Iustin Pop
1812 d61df03e Iustin Pop
1813 d61df03e Iustin Pop
class OpTestAllocator(OpCode):
1814 d61df03e Iustin Pop
  """Allocator framework testing.
1815 d61df03e Iustin Pop

1816 d61df03e Iustin Pop
  This opcode has two modes:
1817 d61df03e Iustin Pop
    - gather and return allocator input for a given mode (allocate new
1818 d61df03e Iustin Pop
      or replace secondary) and a given instance definition (direction
1819 d61df03e Iustin Pop
      'in')
1820 d61df03e Iustin Pop
    - run a selected allocator for a given operation (as above) and
1821 d61df03e Iustin Pop
      return the allocator output (direction 'out')
1822 d61df03e Iustin Pop

1823 d61df03e Iustin Pop
  """
1824 60dd1473 Iustin Pop
  OP_DSC_FIELD = "allocator"
1825 65e183af Michael Hanselmann
  OP_PARAMS = [
1826 65e183af Michael Hanselmann
    ("direction", ht.NoDefault,
1827 197b323b Michael Hanselmann
     ht.TElemOf(constants.VALID_IALLOCATOR_DIRECTIONS), None),
1828 197b323b Michael Hanselmann
    ("mode", ht.NoDefault, ht.TElemOf(constants.VALID_IALLOCATOR_MODES), None),
1829 197b323b Michael Hanselmann
    ("name", ht.NoDefault, ht.TNonEmptyString, None),
1830 ff8067cf Michael Hanselmann
    ("nics", ht.NoDefault,
1831 ff8067cf Michael Hanselmann
     ht.TMaybeListOf(ht.TDictOf(ht.TElemOf([constants.INIC_MAC,
1832 ff8067cf Michael Hanselmann
                                            constants.INIC_IP,
1833 ff8067cf Michael Hanselmann
                                            "bridge"]),
1834 ff8067cf Michael Hanselmann
                                ht.TOr(ht.TNone, ht.TNonEmptyString))),
1835 ff8067cf Michael Hanselmann
     None),
1836 197b323b Michael Hanselmann
    ("disks", ht.NoDefault, ht.TOr(ht.TNone, ht.TList), None),
1837 197b323b Michael Hanselmann
    ("hypervisor", None, ht.TMaybeString, None),
1838 197b323b Michael Hanselmann
    ("allocator", None, ht.TMaybeString, None),
1839 197b323b Michael Hanselmann
    ("tags", ht.EmptyList, ht.TListOf(ht.TNonEmptyString), None),
1840 dd47a0f0 Iustin Pop
    ("memory", None, ht.TOr(ht.TNone, ht.TPositiveInt), None),
1841 197b323b Michael Hanselmann
    ("vcpus", None, ht.TOr(ht.TNone, ht.TPositiveInt), None),
1842 197b323b Michael Hanselmann
    ("os", None, ht.TMaybeString, None),
1843 197b323b Michael Hanselmann
    ("disk_template", None, ht.TMaybeString, None),
1844 ff8067cf Michael Hanselmann
    ("instances", None, ht.TMaybeListOf(ht.TNonEmptyString), None),
1845 60152bbe Michael Hanselmann
    ("evac_mode", None,
1846 60152bbe Michael Hanselmann
     ht.TOr(ht.TNone, ht.TElemOf(constants.IALLOCATOR_NEVAC_MODES)), None),
1847 ff8067cf Michael Hanselmann
    ("target_groups", None, ht.TMaybeListOf(ht.TNonEmptyString), None),
1848 d61df03e Iustin Pop
    ]
1849 363acb1e Iustin Pop
1850 76aef8fc Michael Hanselmann
1851 b469eb4d Iustin Pop
class OpTestJqueue(OpCode):
1852 e58f87a9 Michael Hanselmann
  """Utility opcode to test some aspects of the job queue.
1853 e58f87a9 Michael Hanselmann

1854 e58f87a9 Michael Hanselmann
  """
1855 65e183af Michael Hanselmann
  OP_PARAMS = [
1856 197b323b Michael Hanselmann
    ("notify_waitlock", False, ht.TBool, None),
1857 197b323b Michael Hanselmann
    ("notify_exec", False, ht.TBool, None),
1858 197b323b Michael Hanselmann
    ("log_messages", ht.EmptyList, ht.TListOf(ht.TString), None),
1859 197b323b Michael Hanselmann
    ("fail", False, ht.TBool, None),
1860 e58f87a9 Michael Hanselmann
    ]
1861 e58f87a9 Michael Hanselmann
1862 e58f87a9 Michael Hanselmann
1863 be760ba8 Michael Hanselmann
class OpTestDummy(OpCode):
1864 be760ba8 Michael Hanselmann
  """Utility opcode used by unittests.
1865 be760ba8 Michael Hanselmann

1866 be760ba8 Michael Hanselmann
  """
1867 65e183af Michael Hanselmann
  OP_PARAMS = [
1868 197b323b Michael Hanselmann
    ("result", ht.NoDefault, ht.NoType, None),
1869 197b323b Michael Hanselmann
    ("messages", ht.NoDefault, ht.NoType, None),
1870 197b323b Michael Hanselmann
    ("fail", ht.NoDefault, ht.NoType, None),
1871 6a373640 Michael Hanselmann
    ("submit_jobs", None, ht.NoType, None),
1872 be760ba8 Michael Hanselmann
    ]
1873 687c10d9 Iustin Pop
  WITH_LU = False
1874 be760ba8 Michael Hanselmann
1875 be760ba8 Michael Hanselmann
1876 dbc96028 Michael Hanselmann
def _GetOpList():
1877 dbc96028 Michael Hanselmann
  """Returns list of all defined opcodes.
1878 dbc96028 Michael Hanselmann

1879 dbc96028 Michael Hanselmann
  Does not eliminate duplicates by C{OP_ID}.
1880 dbc96028 Michael Hanselmann

1881 dbc96028 Michael Hanselmann
  """
1882 dbc96028 Michael Hanselmann
  return [v for v in globals().values()
1883 dbc96028 Michael Hanselmann
          if (isinstance(v, type) and issubclass(v, OpCode) and
1884 687c10d9 Iustin Pop
              hasattr(v, "OP_ID") and v is not OpCode)]
1885 dbc96028 Michael Hanselmann
1886 dbc96028 Michael Hanselmann
1887 dbc96028 Michael Hanselmann
OP_MAPPING = dict((v.OP_ID, v) for v in _GetOpList())