Statistics
| Branch: | Tag: | Revision:

root / lib / opcodes.py @ 13718ded

History | View | Annotate | Download (58.2 kB)

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

233 ff0d18e6 Iustin Pop
  @type name: string
234 ff0d18e6 Iustin Pop
  @param name: the class name, as OpXxxYyy
235 ff0d18e6 Iustin Pop
  @rtype: string
236 ff0d18e6 Iustin Pop
  @return: the name in the OP_XXXX_YYYY format
237 ff0d18e6 Iustin Pop

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

254 415feb2e René Nussbaumer
  @param obj: The object to generate type checks
255 415feb2e René Nussbaumer
  @param fields_types: The fields and their types as a dict
256 415feb2e René Nussbaumer
  @return: A ht type check function
257 415feb2e René Nussbaumer

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

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

279 65e183af Michael Hanselmann
  @raise errors.OpPrereqError: when file storage is disabled
280 65e183af Michael Hanselmann

281 65e183af Michael Hanselmann
  """
282 65e183af Michael Hanselmann
  if not constants.ENABLE_FILE_STORAGE:
283 65e183af Michael Hanselmann
    raise errors.OpPrereqError("File storage disabled at configure time",
284 65e183af Michael Hanselmann
                               errors.ECODE_INVAL)
285 65e183af Michael Hanselmann
286 65e183af Michael Hanselmann
287 4b97f902 Apollon Oikonomopoulos
def RequireSharedFileStorage():
288 4b97f902 Apollon Oikonomopoulos
  """Checks that shared file storage is enabled.
289 4b97f902 Apollon Oikonomopoulos

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

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

295 4b97f902 Apollon Oikonomopoulos
  """
296 4b97f902 Apollon Oikonomopoulos
  if not constants.ENABLE_SHARED_FILE_STORAGE:
297 4b97f902 Apollon Oikonomopoulos
    raise errors.OpPrereqError("Shared file storage disabled at"
298 4b97f902 Apollon Oikonomopoulos
                               " configure time", errors.ECODE_INVAL)
299 4b97f902 Apollon Oikonomopoulos
300 4b97f902 Apollon Oikonomopoulos
301 8c9ee749 Michael Hanselmann
@ht.WithDesc("CheckFileStorage")
302 8c9ee749 Michael Hanselmann
def _CheckFileStorage(value):
303 8c9ee749 Michael Hanselmann
  """Ensures file storage is enabled if used.
304 65e183af Michael Hanselmann

305 65e183af Michael Hanselmann
  """
306 8c9ee749 Michael Hanselmann
  if value == constants.DT_FILE:
307 65e183af Michael Hanselmann
    RequireFileStorage()
308 4b97f902 Apollon Oikonomopoulos
  elif value == constants.DT_SHARED_FILE:
309 4b97f902 Apollon Oikonomopoulos
    RequireSharedFileStorage()
310 65e183af Michael Hanselmann
  return True
311 65e183af Michael Hanselmann
312 65e183af Michael Hanselmann
313 45fe090b Michael Hanselmann
def _BuildDiskTemplateCheck(accept_none):
314 45fe090b Michael Hanselmann
  """Builds check for disk template.
315 45fe090b Michael Hanselmann

316 45fe090b Michael Hanselmann
  @type accept_none: bool
317 45fe090b Michael Hanselmann
  @param accept_none: whether to accept None as a correct value
318 45fe090b Michael Hanselmann
  @rtype: callable
319 45fe090b Michael Hanselmann

320 45fe090b Michael Hanselmann
  """
321 45fe090b Michael Hanselmann
  template_check = ht.TElemOf(constants.DISK_TEMPLATES)
322 45fe090b Michael Hanselmann
323 45fe090b Michael Hanselmann
  if accept_none:
324 45fe090b Michael Hanselmann
    template_check = ht.TOr(template_check, ht.TNone)
325 45fe090b Michael Hanselmann
326 45fe090b Michael Hanselmann
  return ht.TAnd(template_check, _CheckFileStorage)
327 8c9ee749 Michael Hanselmann
328 8c9ee749 Michael Hanselmann
329 65e183af Michael Hanselmann
def _CheckStorageType(storage_type):
330 65e183af Michael Hanselmann
  """Ensure a given storage type is valid.
331 65e183af Michael Hanselmann

332 65e183af Michael Hanselmann
  """
333 65e183af Michael Hanselmann
  if storage_type not in constants.VALID_STORAGE_TYPES:
334 65e183af Michael Hanselmann
    raise errors.OpPrereqError("Unknown storage type: %s" % storage_type,
335 65e183af Michael Hanselmann
                               errors.ECODE_INVAL)
336 65e183af Michael Hanselmann
  if storage_type == constants.ST_FILE:
337 65e183af Michael Hanselmann
    RequireFileStorage()
338 65e183af Michael Hanselmann
  return True
339 65e183af Michael Hanselmann
340 65e183af Michael Hanselmann
341 65e183af Michael Hanselmann
#: Storage type parameter
342 45d4c81c Michael Hanselmann
_PStorageType = ("storage_type", ht.NoDefault, _CheckStorageType,
343 45d4c81c Michael Hanselmann
                 "Storage type")
344 65e183af Michael Hanselmann
345 65e183af Michael Hanselmann
346 32683096 René Nussbaumer
class _AutoOpParamSlots(objectutils.AutoSlots):
347 65e183af Michael Hanselmann
  """Meta class for opcode definitions.
348 65e183af Michael Hanselmann

349 65e183af Michael Hanselmann
  """
350 65e183af Michael Hanselmann
  def __new__(mcs, name, bases, attrs):
351 65e183af Michael Hanselmann
    """Called when a class should be created.
352 65e183af Michael Hanselmann

353 65e183af Michael Hanselmann
    @param mcs: The meta class
354 65e183af Michael Hanselmann
    @param name: Name of created class
355 65e183af Michael Hanselmann
    @param bases: Base classes
356 65e183af Michael Hanselmann
    @type attrs: dict
357 65e183af Michael Hanselmann
    @param attrs: Class attributes
358 65e183af Michael Hanselmann

359 65e183af Michael Hanselmann
    """
360 e89a9021 Iustin Pop
    assert "OP_ID" not in attrs, "Class '%s' defining OP_ID" % name
361 ff0d18e6 Iustin Pop
362 32683096 René Nussbaumer
    slots = mcs._GetSlots(attrs)
363 32683096 René Nussbaumer
    assert "OP_DSC_FIELD" not in attrs or attrs["OP_DSC_FIELD"] in slots, \
364 32683096 René Nussbaumer
      "Class '%s' uses unknown field in OP_DSC_FIELD" % name
365 32683096 René Nussbaumer
366 e89a9021 Iustin Pop
    attrs["OP_ID"] = _NameToId(name)
367 65e183af Michael Hanselmann
368 32683096 René Nussbaumer
    return objectutils.AutoSlots.__new__(mcs, name, bases, attrs)
369 32683096 René Nussbaumer
370 32683096 René Nussbaumer
  @classmethod
371 32683096 René Nussbaumer
  def _GetSlots(mcs, attrs):
372 32683096 René Nussbaumer
    """Build the slots out of OP_PARAMS.
373 32683096 René Nussbaumer

374 32683096 René Nussbaumer
    """
375 65e183af Michael Hanselmann
    # Always set OP_PARAMS to avoid duplicates in BaseOpCode.GetAllParams
376 65e183af Michael Hanselmann
    params = attrs.setdefault("OP_PARAMS", [])
377 65e183af Michael Hanselmann
378 65e183af Michael Hanselmann
    # Use parameter names as slots
379 32683096 René Nussbaumer
    return [pname for (pname, _, _, _) in params]
380 65e183af Michael Hanselmann
381 df458e0b Iustin Pop
382 32683096 René Nussbaumer
class BaseOpCode(objectutils.ValidatedSlots):
383 df458e0b Iustin Pop
  """A simple serializable object.
384 df458e0b Iustin Pop

385 0e46916d Iustin Pop
  This object serves as a parent class for OpCode without any custom
386 0e46916d Iustin Pop
  field handling.
387 0e46916d Iustin Pop

388 df458e0b Iustin Pop
  """
389 b459a848 Andrea Spadaccini
  # pylint: disable=E1101
390 e89a9021 Iustin Pop
  # as OP_ID is dynamically defined
391 65e183af Michael Hanselmann
  __metaclass__ = _AutoOpParamSlots
392 65e183af Michael Hanselmann
393 df458e0b Iustin Pop
  def __getstate__(self):
394 a7399f66 Iustin Pop
    """Generic serializer.
395 a7399f66 Iustin Pop

396 a7399f66 Iustin Pop
    This method just returns the contents of the instance as a
397 a7399f66 Iustin Pop
    dictionary.
398 a7399f66 Iustin Pop

399 a7399f66 Iustin Pop
    @rtype:  C{dict}
400 a7399f66 Iustin Pop
    @return: the instance attributes and their values
401 a7399f66 Iustin Pop

402 a7399f66 Iustin Pop
    """
403 df458e0b Iustin Pop
    state = {}
404 32683096 René Nussbaumer
    for name in self.GetAllSlots():
405 df458e0b Iustin Pop
      if hasattr(self, name):
406 df458e0b Iustin Pop
        state[name] = getattr(self, name)
407 df458e0b Iustin Pop
    return state
408 df458e0b Iustin Pop
409 df458e0b Iustin Pop
  def __setstate__(self, state):
410 a7399f66 Iustin Pop
    """Generic unserializer.
411 a7399f66 Iustin Pop

412 a7399f66 Iustin Pop
    This method just restores from the serialized state the attributes
413 a7399f66 Iustin Pop
    of the current instance.
414 a7399f66 Iustin Pop

415 a7399f66 Iustin Pop
    @param state: the serialized opcode data
416 a7399f66 Iustin Pop
    @type state:  C{dict}
417 a7399f66 Iustin Pop

418 a7399f66 Iustin Pop
    """
419 df458e0b Iustin Pop
    if not isinstance(state, dict):
420 df458e0b Iustin Pop
      raise ValueError("Invalid data to __setstate__: expected dict, got %s" %
421 df458e0b Iustin Pop
                       type(state))
422 df458e0b Iustin Pop
423 32683096 René Nussbaumer
    for name in self.GetAllSlots():
424 44db3a6f Iustin Pop
      if name not in state and hasattr(self, name):
425 df458e0b Iustin Pop
        delattr(self, name)
426 df458e0b Iustin Pop
427 df458e0b Iustin Pop
    for name in state:
428 df458e0b Iustin Pop
      setattr(self, name, state[name])
429 df458e0b Iustin Pop
430 adf385c7 Iustin Pop
  @classmethod
431 65e183af Michael Hanselmann
  def GetAllParams(cls):
432 65e183af Michael Hanselmann
    """Compute list of all parameters for an opcode.
433 65e183af Michael Hanselmann

434 65e183af Michael Hanselmann
    """
435 65e183af Michael Hanselmann
    slots = []
436 65e183af Michael Hanselmann
    for parent in cls.__mro__:
437 65e183af Michael Hanselmann
      slots.extend(getattr(parent, "OP_PARAMS", []))
438 65e183af Michael Hanselmann
    return slots
439 65e183af Michael Hanselmann
440 32683096 René Nussbaumer
  def Validate(self, set_defaults): # pylint: disable=W0221
441 1cbef6d8 Michael Hanselmann
    """Validate opcode parameters, optionally setting default values.
442 1cbef6d8 Michael Hanselmann

443 1cbef6d8 Michael Hanselmann
    @type set_defaults: bool
444 1cbef6d8 Michael Hanselmann
    @param set_defaults: Whether to set default values
445 1cbef6d8 Michael Hanselmann
    @raise errors.OpPrereqError: When a parameter value doesn't match
446 1cbef6d8 Michael Hanselmann
                                 requirements
447 1cbef6d8 Michael Hanselmann

448 1cbef6d8 Michael Hanselmann
    """
449 197b323b Michael Hanselmann
    for (attr_name, default, test, _) in self.GetAllParams():
450 1cbef6d8 Michael Hanselmann
      assert test == ht.NoType or callable(test)
451 1cbef6d8 Michael Hanselmann
452 1cbef6d8 Michael Hanselmann
      if not hasattr(self, attr_name):
453 1cbef6d8 Michael Hanselmann
        if default == ht.NoDefault:
454 1cbef6d8 Michael Hanselmann
          raise errors.OpPrereqError("Required parameter '%s.%s' missing" %
455 1cbef6d8 Michael Hanselmann
                                     (self.OP_ID, attr_name),
456 1cbef6d8 Michael Hanselmann
                                     errors.ECODE_INVAL)
457 1cbef6d8 Michael Hanselmann
        elif set_defaults:
458 1cbef6d8 Michael Hanselmann
          if callable(default):
459 1cbef6d8 Michael Hanselmann
            dval = default()
460 1cbef6d8 Michael Hanselmann
          else:
461 1cbef6d8 Michael Hanselmann
            dval = default
462 1cbef6d8 Michael Hanselmann
          setattr(self, attr_name, dval)
463 1cbef6d8 Michael Hanselmann
464 1cbef6d8 Michael Hanselmann
      if test == ht.NoType:
465 1cbef6d8 Michael Hanselmann
        # no tests here
466 1cbef6d8 Michael Hanselmann
        continue
467 1cbef6d8 Michael Hanselmann
468 1cbef6d8 Michael Hanselmann
      if set_defaults or hasattr(self, attr_name):
469 1cbef6d8 Michael Hanselmann
        attr_val = getattr(self, attr_name)
470 1cbef6d8 Michael Hanselmann
        if not test(attr_val):
471 1cbef6d8 Michael Hanselmann
          logging.error("OpCode %s, parameter %s, has invalid type %s/value %s",
472 1cbef6d8 Michael Hanselmann
                        self.OP_ID, attr_name, type(attr_val), attr_val)
473 1cbef6d8 Michael Hanselmann
          raise errors.OpPrereqError("Parameter '%s.%s' fails validation" %
474 1cbef6d8 Michael Hanselmann
                                     (self.OP_ID, attr_name),
475 1cbef6d8 Michael Hanselmann
                                     errors.ECODE_INVAL)
476 1cbef6d8 Michael Hanselmann
477 df458e0b Iustin Pop
478 b247c6fc Michael Hanselmann
def _BuildJobDepCheck(relative):
479 b247c6fc Michael Hanselmann
  """Builds check for job dependencies (L{DEPEND_ATTR}).
480 b247c6fc Michael Hanselmann

481 b247c6fc Michael Hanselmann
  @type relative: bool
482 b247c6fc Michael Hanselmann
  @param relative: Whether to accept relative job IDs (negative)
483 b247c6fc Michael Hanselmann
  @rtype: callable
484 b247c6fc Michael Hanselmann

485 b247c6fc Michael Hanselmann
  """
486 b247c6fc Michael Hanselmann
  if relative:
487 b247c6fc Michael Hanselmann
    job_id = ht.TOr(ht.TJobId, ht.TRelativeJobId)
488 b247c6fc Michael Hanselmann
  else:
489 b247c6fc Michael Hanselmann
    job_id = ht.TJobId
490 b247c6fc Michael Hanselmann
491 b247c6fc Michael Hanselmann
  job_dep = \
492 b247c6fc Michael Hanselmann
    ht.TAnd(ht.TIsLength(2),
493 b247c6fc Michael Hanselmann
            ht.TItems([job_id,
494 b247c6fc Michael Hanselmann
                       ht.TListOf(ht.TElemOf(constants.JOBS_FINALIZED))]))
495 b247c6fc Michael Hanselmann
496 ff8067cf Michael Hanselmann
  return ht.TMaybeListOf(job_dep)
497 b247c6fc Michael Hanselmann
498 b247c6fc Michael Hanselmann
499 b247c6fc Michael Hanselmann
TNoRelativeJobDependencies = _BuildJobDepCheck(False)
500 b247c6fc Michael Hanselmann
501 1ce03fb1 Michael Hanselmann
#: List of submission status and job ID as returned by C{SubmitManyJobs}
502 1456df62 Michael Hanselmann
_TJobIdListItem = \
503 1456df62 Michael Hanselmann
  ht.TAnd(ht.TIsLength(2),
504 1456df62 Michael Hanselmann
          ht.TItems([ht.Comment("success")(ht.TBool),
505 1456df62 Michael Hanselmann
                     ht.Comment("Job ID if successful, error message"
506 1456df62 Michael Hanselmann
                                " otherwise")(ht.TOr(ht.TString,
507 1456df62 Michael Hanselmann
                                                     ht.TJobId))]))
508 1456df62 Michael Hanselmann
TJobIdList = ht.TListOf(_TJobIdListItem)
509 1ce03fb1 Michael Hanselmann
510 f7686867 Michael Hanselmann
#: Result containing only list of submitted jobs
511 f7686867 Michael Hanselmann
TJobIdListOnly = ht.TStrictDict(True, True, {
512 1456df62 Michael Hanselmann
  constants.JOB_IDS_KEY: ht.Comment("List of submitted jobs")(TJobIdList),
513 f7686867 Michael Hanselmann
  })
514 f7686867 Michael Hanselmann
515 b247c6fc Michael Hanselmann
516 0e46916d Iustin Pop
class OpCode(BaseOpCode):
517 a7399f66 Iustin Pop
  """Abstract OpCode.
518 a7399f66 Iustin Pop

519 a7399f66 Iustin Pop
  This is the root of the actual OpCode hierarchy. All clases derived
520 a7399f66 Iustin Pop
  from this class should override OP_ID.
521 a7399f66 Iustin Pop

522 a7399f66 Iustin Pop
  @cvar OP_ID: The ID of this opcode. This should be unique amongst all
523 20777413 Iustin Pop
               children of this class.
524 bde8f481 Adeodato Simo
  @cvar OP_DSC_FIELD: The name of a field whose value will be included in the
525 bde8f481 Adeodato Simo
                      string returned by Summary(); see the docstring of that
526 bde8f481 Adeodato Simo
                      method for details).
527 65e183af Michael Hanselmann
  @cvar OP_PARAMS: List of opcode attributes, the default values they should
528 65e183af Michael Hanselmann
                   get if not already defined, and types they must match.
529 1ce03fb1 Michael Hanselmann
  @cvar OP_RESULT: Callable to verify opcode result
530 687c10d9 Iustin Pop
  @cvar WITH_LU: Boolean that specifies whether this should be included in
531 687c10d9 Iustin Pop
      mcpu's dispatch table
532 20777413 Iustin Pop
  @ivar dry_run: Whether the LU should be run in dry-run mode, i.e. just
533 20777413 Iustin Pop
                 the check steps
534 8f5c488d Michael Hanselmann
  @ivar priority: Opcode priority for queue
535 a7399f66 Iustin Pop

536 a7399f66 Iustin Pop
  """
537 b459a848 Andrea Spadaccini
  # pylint: disable=E1101
538 e89a9021 Iustin Pop
  # as OP_ID is dynamically defined
539 687c10d9 Iustin Pop
  WITH_LU = True
540 65e183af Michael Hanselmann
  OP_PARAMS = [
541 45d4c81c Michael Hanselmann
    ("dry_run", None, ht.TMaybeBool, "Run checks only, don't execute"),
542 45d4c81c Michael Hanselmann
    ("debug_level", None, ht.TOr(ht.TNone, ht.TPositiveInt), "Debug level"),
543 65e183af Michael Hanselmann
    ("priority", constants.OP_PRIO_DEFAULT,
544 45d4c81c Michael Hanselmann
     ht.TElemOf(constants.OP_PRIO_SUBMIT_VALID), "Opcode priority"),
545 b247c6fc Michael Hanselmann
    (DEPEND_ATTR, None, _BuildJobDepCheck(True),
546 b247c6fc Michael Hanselmann
     "Job dependencies; if used through ``SubmitManyJobs`` relative (negative)"
547 822a50c4 Michael Hanselmann
     " job IDs can be used; see :doc:`design document <design-chained-jobs>`"
548 822a50c4 Michael Hanselmann
     " for details"),
549 018ae30b Michael Hanselmann
    (COMMENT_ATTR, None, ht.TMaybeString,
550 018ae30b Michael Hanselmann
     "Comment describing the purpose of the opcode"),
551 65e183af Michael Hanselmann
    ]
552 1ce03fb1 Michael Hanselmann
  OP_RESULT = None
553 df458e0b Iustin Pop
554 df458e0b Iustin Pop
  def __getstate__(self):
555 df458e0b Iustin Pop
    """Specialized getstate for opcodes.
556 df458e0b Iustin Pop

557 a7399f66 Iustin Pop
    This method adds to the state dictionary the OP_ID of the class,
558 a7399f66 Iustin Pop
    so that on unload we can identify the correct class for
559 a7399f66 Iustin Pop
    instantiating the opcode.
560 a7399f66 Iustin Pop

561 a7399f66 Iustin Pop
    @rtype:   C{dict}
562 a7399f66 Iustin Pop
    @return:  the state as a dictionary
563 a7399f66 Iustin Pop

564 df458e0b Iustin Pop
    """
565 0e46916d Iustin Pop
    data = BaseOpCode.__getstate__(self)
566 df458e0b Iustin Pop
    data["OP_ID"] = self.OP_ID
567 df458e0b Iustin Pop
    return data
568 df458e0b Iustin Pop
569 df458e0b Iustin Pop
  @classmethod
570 00abdc96 Iustin Pop
  def LoadOpCode(cls, data):
571 df458e0b Iustin Pop
    """Generic load opcode method.
572 df458e0b Iustin Pop

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

577 a7399f66 Iustin Pop
    @type data:  C{dict}
578 a7399f66 Iustin Pop
    @param data: the serialized opcode
579 a7399f66 Iustin Pop

580 df458e0b Iustin Pop
    """
581 df458e0b Iustin Pop
    if not isinstance(data, dict):
582 df458e0b Iustin Pop
      raise ValueError("Invalid data to LoadOpCode (%s)" % type(data))
583 df458e0b Iustin Pop
    if "OP_ID" not in data:
584 df458e0b Iustin Pop
      raise ValueError("Invalid data to LoadOpcode, missing OP_ID")
585 df458e0b Iustin Pop
    op_id = data["OP_ID"]
586 df458e0b Iustin Pop
    op_class = None
587 363acb1e Iustin Pop
    if op_id in OP_MAPPING:
588 363acb1e Iustin Pop
      op_class = OP_MAPPING[op_id]
589 363acb1e Iustin Pop
    else:
590 df458e0b Iustin Pop
      raise ValueError("Invalid data to LoadOpCode: OP_ID %s unsupported" %
591 df458e0b Iustin Pop
                       op_id)
592 df458e0b Iustin Pop
    op = op_class()
593 df458e0b Iustin Pop
    new_data = data.copy()
594 df458e0b Iustin Pop
    del new_data["OP_ID"]
595 df458e0b Iustin Pop
    op.__setstate__(new_data)
596 df458e0b Iustin Pop
    return op
597 df458e0b Iustin Pop
598 60dd1473 Iustin Pop
  def Summary(self):
599 60dd1473 Iustin Pop
    """Generates a summary description of this opcode.
600 60dd1473 Iustin Pop

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

607 60dd1473 Iustin Pop
    """
608 ff0d18e6 Iustin Pop
    assert self.OP_ID is not None and len(self.OP_ID) > 3
609 60dd1473 Iustin Pop
    # all OP_ID start with OP_, we remove that
610 60dd1473 Iustin Pop
    txt = self.OP_ID[3:]
611 60dd1473 Iustin Pop
    field_name = getattr(self, "OP_DSC_FIELD", None)
612 60dd1473 Iustin Pop
    if field_name:
613 60dd1473 Iustin Pop
      field_value = getattr(self, field_name, None)
614 bc8bbda1 Iustin Pop
      if isinstance(field_value, (list, tuple)):
615 bc8bbda1 Iustin Pop
        field_value = ",".join(str(i) for i in field_value)
616 60dd1473 Iustin Pop
      txt = "%s(%s)" % (txt, field_value)
617 60dd1473 Iustin Pop
    return txt
618 60dd1473 Iustin Pop
619 3ce9a5e7 Michael Hanselmann
  def TinySummary(self):
620 3ce9a5e7 Michael Hanselmann
    """Generates a compact summary description of the opcode.
621 3ce9a5e7 Michael Hanselmann

622 3ce9a5e7 Michael Hanselmann
    """
623 3ce9a5e7 Michael Hanselmann
    assert self.OP_ID.startswith("OP_")
624 3ce9a5e7 Michael Hanselmann
625 3ce9a5e7 Michael Hanselmann
    text = self.OP_ID[3:]
626 3ce9a5e7 Michael Hanselmann
627 3ce9a5e7 Michael Hanselmann
    for (prefix, supplement) in _SUMMARY_PREFIX.items():
628 3ce9a5e7 Michael Hanselmann
      if text.startswith(prefix):
629 3ce9a5e7 Michael Hanselmann
        return supplement + text[len(prefix):]
630 3ce9a5e7 Michael Hanselmann
631 3ce9a5e7 Michael Hanselmann
    return text
632 3ce9a5e7 Michael Hanselmann
633 a8083063 Iustin Pop
634 afee0879 Iustin Pop
# cluster opcodes
635 afee0879 Iustin Pop
636 bc84ffa7 Iustin Pop
class OpClusterPostInit(OpCode):
637 b5f5fae9 Luca Bigliardi
  """Post cluster initialization.
638 b5f5fae9 Luca Bigliardi

639 b5f5fae9 Luca Bigliardi
  This opcode does not touch the cluster at all. Its purpose is to run hooks
640 b5f5fae9 Luca Bigliardi
  after the cluster has been initialized.
641 b5f5fae9 Luca Bigliardi

642 b5f5fae9 Luca Bigliardi
  """
643 c363310d René Nussbaumer
  OP_RESULT = ht.TBool
644 b5f5fae9 Luca Bigliardi
645 b5f5fae9 Luca Bigliardi
646 c6d43e9e Iustin Pop
class OpClusterDestroy(OpCode):
647 a7399f66 Iustin Pop
  """Destroy the cluster.
648 a7399f66 Iustin Pop

649 a7399f66 Iustin Pop
  This opcode has no other parameters. All the state is irreversibly
650 a7399f66 Iustin Pop
  lost after the execution of this opcode.
651 a7399f66 Iustin Pop

652 a7399f66 Iustin Pop
  """
653 c363310d René Nussbaumer
  OP_RESULT = ht.TNonEmptyString
654 a8083063 Iustin Pop
655 a8083063 Iustin Pop
656 a2f7ab92 Iustin Pop
class OpClusterQuery(OpCode):
657 fdc267f4 Iustin Pop
  """Query cluster information."""
658 415feb2e René Nussbaumer
  OP_RESULT = ht.TDictOf(ht.TNonEmptyString, ht.TAny)
659 a8083063 Iustin Pop
660 a8083063 Iustin Pop
661 fcad7225 Michael Hanselmann
class OpClusterVerify(OpCode):
662 fcad7225 Michael Hanselmann
  """Submits all jobs necessary to verify the cluster.
663 fcad7225 Michael Hanselmann

664 fcad7225 Michael Hanselmann
  """
665 fcad7225 Michael Hanselmann
  OP_PARAMS = [
666 fcad7225 Michael Hanselmann
    _PDebugSimulateErrors,
667 fcad7225 Michael Hanselmann
    _PErrorCodes,
668 fcad7225 Michael Hanselmann
    _PSkipChecks,
669 93f2399e Andrea Spadaccini
    _PIgnoreErrors,
670 fcad7225 Michael Hanselmann
    _PVerbose,
671 fcad7225 Michael Hanselmann
    ("group_name", None, ht.TMaybeString, "Group to verify")
672 fcad7225 Michael Hanselmann
    ]
673 f7686867 Michael Hanselmann
  OP_RESULT = TJobIdListOnly
674 fcad7225 Michael Hanselmann
675 fcad7225 Michael Hanselmann
676 bf93ae69 Adeodato Simo
class OpClusterVerifyConfig(OpCode):
677 bf93ae69 Adeodato Simo
  """Verify the cluster config.
678 bf93ae69 Adeodato Simo

679 bf93ae69 Adeodato Simo
  """
680 bf93ae69 Adeodato Simo
  OP_PARAMS = [
681 57106b74 Michael Hanselmann
    _PDebugSimulateErrors,
682 57106b74 Michael Hanselmann
    _PErrorCodes,
683 93f2399e Andrea Spadaccini
    _PIgnoreErrors,
684 57106b74 Michael Hanselmann
    _PVerbose,
685 bf93ae69 Adeodato Simo
    ]
686 f7686867 Michael Hanselmann
  OP_RESULT = ht.TBool
687 bf93ae69 Adeodato Simo
688 bf93ae69 Adeodato Simo
689 bf93ae69 Adeodato Simo
class OpClusterVerifyGroup(OpCode):
690 bf93ae69 Adeodato Simo
  """Run verify on a node group from the cluster.
691 a7399f66 Iustin Pop

692 a7399f66 Iustin Pop
  @type skip_checks: C{list}
693 a7399f66 Iustin Pop
  @ivar skip_checks: steps to be skipped from the verify process; this
694 a7399f66 Iustin Pop
                     needs to be a subset of
695 a7399f66 Iustin Pop
                     L{constants.VERIFY_OPTIONAL_CHECKS}; currently
696 a7399f66 Iustin Pop
                     only L{constants.VERIFY_NPLUSONE_MEM} can be passed
697 a7399f66 Iustin Pop

698 a7399f66 Iustin Pop
  """
699 bf93ae69 Adeodato Simo
  OP_DSC_FIELD = "group_name"
700 65e183af Michael Hanselmann
  OP_PARAMS = [
701 57106b74 Michael Hanselmann
    _PGroupName,
702 57106b74 Michael Hanselmann
    _PDebugSimulateErrors,
703 57106b74 Michael Hanselmann
    _PErrorCodes,
704 57106b74 Michael Hanselmann
    _PSkipChecks,
705 93f2399e Andrea Spadaccini
    _PIgnoreErrors,
706 57106b74 Michael Hanselmann
    _PVerbose,
707 65e183af Michael Hanselmann
    ]
708 f7686867 Michael Hanselmann
  OP_RESULT = ht.TBool
709 a8083063 Iustin Pop
710 a8083063 Iustin Pop
711 bd8210a7 Iustin Pop
class OpClusterVerifyDisks(OpCode):
712 150e978f Iustin Pop
  """Verify the cluster disks.
713 150e978f Iustin Pop

714 ae1a845c Michael Hanselmann
  """
715 f7686867 Michael Hanselmann
  OP_RESULT = TJobIdListOnly
716 ae1a845c Michael Hanselmann
717 ae1a845c Michael Hanselmann
718 ae1a845c Michael Hanselmann
class OpGroupVerifyDisks(OpCode):
719 ae1a845c Michael Hanselmann
  """Verifies the status of all disks in a node group.
720 150e978f Iustin Pop

721 ae1a845c Michael Hanselmann
  Result: a tuple of three elements:
722 ae1a845c Michael Hanselmann
    - dict of node names with issues (values: error msg)
723 150e978f Iustin Pop
    - list of instances with degraded disks (that should be activated)
724 b63ed789 Iustin Pop
    - dict of instances with missing logical volumes (values: (node, vol)
725 b63ed789 Iustin Pop
      pairs with details about the missing volumes)
726 150e978f Iustin Pop

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

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

735 150e978f Iustin Pop
  """
736 ae1a845c Michael Hanselmann
  OP_DSC_FIELD = "group_name"
737 ae1a845c Michael Hanselmann
  OP_PARAMS = [
738 ae1a845c Michael Hanselmann
    _PGroupName,
739 ae1a845c Michael Hanselmann
    ]
740 1ce03fb1 Michael Hanselmann
  OP_RESULT = \
741 1ce03fb1 Michael Hanselmann
    ht.TAnd(ht.TIsLength(3),
742 1ce03fb1 Michael Hanselmann
            ht.TItems([ht.TDictOf(ht.TString, ht.TString),
743 1ce03fb1 Michael Hanselmann
                       ht.TListOf(ht.TString),
744 6973587f Michael Hanselmann
                       ht.TDictOf(ht.TString,
745 6973587f Michael Hanselmann
                                  ht.TListOf(ht.TListOf(ht.TString)))]))
746 150e978f Iustin Pop
747 150e978f Iustin Pop
748 5d01aca3 Iustin Pop
class OpClusterRepairDiskSizes(OpCode):
749 60975797 Iustin Pop
  """Verify the disk sizes of the instances and fixes configuration
750 60975797 Iustin Pop
  mimatches.
751 60975797 Iustin Pop

752 60975797 Iustin Pop
  Parameters: optional instances list, in case we want to restrict the
753 60975797 Iustin Pop
  checks to only a subset of the instances.
754 60975797 Iustin Pop

755 60975797 Iustin Pop
  Result: a list of tuples, (instance, disk, new-size) for changed
756 60975797 Iustin Pop
  configurations.
757 60975797 Iustin Pop

758 60975797 Iustin Pop
  In normal operation, the list should be empty.
759 60975797 Iustin Pop

760 60975797 Iustin Pop
  @type instances: list
761 60975797 Iustin Pop
  @ivar instances: the list of instances to check, or empty for all instances
762 60975797 Iustin Pop

763 60975797 Iustin Pop
  """
764 65e183af Michael Hanselmann
  OP_PARAMS = [
765 197b323b Michael Hanselmann
    ("instances", ht.EmptyList, ht.TListOf(ht.TNonEmptyString), None),
766 65e183af Michael Hanselmann
    ]
767 c363310d René Nussbaumer
  OP_RESULT = ht.TListOf(ht.TAnd(ht.TIsLength(3),
768 c363310d René Nussbaumer
                                 ht.TItems([ht.TNonEmptyString,
769 c363310d René Nussbaumer
                                            ht.TPositiveInt,
770 c363310d René Nussbaumer
                                            ht.TPositiveInt])))
771 60975797 Iustin Pop
772 60975797 Iustin Pop
773 2f093ea0 Iustin Pop
class OpClusterConfigQuery(OpCode):
774 ae5849b5 Michael Hanselmann
  """Query cluster configuration values."""
775 65e183af Michael Hanselmann
  OP_PARAMS = [
776 65e183af Michael Hanselmann
    _POutputFields
777 65e183af Michael Hanselmann
    ]
778 c363310d René Nussbaumer
  OP_RESULT = ht.TListOf(ht.TAny)
779 a8083063 Iustin Pop
780 a8083063 Iustin Pop
781 e126df25 Iustin Pop
class OpClusterRename(OpCode):
782 a7399f66 Iustin Pop
  """Rename the cluster.
783 a7399f66 Iustin Pop

784 a7399f66 Iustin Pop
  @type name: C{str}
785 a7399f66 Iustin Pop
  @ivar name: The new name of the cluster. The name and/or the master IP
786 a7399f66 Iustin Pop
              address will be changed to match the new name and its IP
787 a7399f66 Iustin Pop
              address.
788 a7399f66 Iustin Pop

789 a7399f66 Iustin Pop
  """
790 60dd1473 Iustin Pop
  OP_DSC_FIELD = "name"
791 65e183af Michael Hanselmann
  OP_PARAMS = [
792 197b323b Michael Hanselmann
    ("name", ht.NoDefault, ht.TNonEmptyString, None),
793 65e183af Michael Hanselmann
    ]
794 c363310d René Nussbaumer
  OP_RESULT = ht.TNonEmptyString
795 07bd8a51 Iustin Pop
796 07bd8a51 Iustin Pop
797 a6682fdc Iustin Pop
class OpClusterSetParams(OpCode):
798 a7399f66 Iustin Pop
  """Change the parameters of the cluster.
799 a7399f66 Iustin Pop

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

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

869 afee0879 Iustin Pop
  """
870 c363310d René Nussbaumer
  OP_RESULT = ht.TNone
871 afee0879 Iustin Pop
872 83f72637 Michael Hanselmann
873 fb926117 Andrea Spadaccini
class OpClusterActivateMasterIp(OpCode):
874 fb926117 Andrea Spadaccini
  """Activate the master IP on the master node.
875 fb926117 Andrea Spadaccini

876 fb926117 Andrea Spadaccini
  """
877 c363310d René Nussbaumer
  OP_RESULT = ht.TNone
878 fb926117 Andrea Spadaccini
879 fb926117 Andrea Spadaccini
880 fb926117 Andrea Spadaccini
class OpClusterDeactivateMasterIp(OpCode):
881 fb926117 Andrea Spadaccini
  """Deactivate the master IP on the master node.
882 fb926117 Andrea Spadaccini

883 fb926117 Andrea Spadaccini
  """
884 c363310d René Nussbaumer
  OP_RESULT = ht.TNone
885 fb926117 Andrea Spadaccini
886 fb926117 Andrea Spadaccini
887 83f72637 Michael Hanselmann
class OpQuery(OpCode):
888 83f72637 Michael Hanselmann
  """Query for resources/items.
889 83f72637 Michael Hanselmann

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

894 83f72637 Michael Hanselmann
  """
895 e50d8412 Michael Hanselmann
  OP_DSC_FIELD = "what"
896 65e183af Michael Hanselmann
  OP_PARAMS = [
897 8e7078e0 Michael Hanselmann
    _PQueryWhat,
898 ee13764f Michael Hanselmann
    _PUseLocking,
899 45d4c81c Michael Hanselmann
    ("fields", ht.NoDefault, ht.TListOf(ht.TNonEmptyString),
900 45d4c81c Michael Hanselmann
     "Requested fields"),
901 7bfb3367 Iustin Pop
    ("qfilter", None, ht.TOr(ht.TNone, ht.TList),
902 45d4c81c Michael Hanselmann
     "Query filter"),
903 83f72637 Michael Hanselmann
    ]
904 415feb2e René Nussbaumer
  OP_RESULT = \
905 b02c6bdf Michael Hanselmann
    _GenerateObjectTypeCheck(objects.QueryResponse, {
906 b02c6bdf Michael Hanselmann
      "fields": ht.TListOf(_TQueryFieldDef),
907 b02c6bdf Michael Hanselmann
      "data": _TQueryResult,
908 b02c6bdf Michael Hanselmann
      })
909 83f72637 Michael Hanselmann
910 83f72637 Michael Hanselmann
911 83f72637 Michael Hanselmann
class OpQueryFields(OpCode):
912 83f72637 Michael Hanselmann
  """Query for available resource/item fields.
913 83f72637 Michael Hanselmann

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

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

953 a7399f66 Iustin Pop
  @type node_name: C{str}
954 a7399f66 Iustin Pop
  @ivar node_name: The name of the node to remove. If the node still has
955 a7399f66 Iustin Pop
                   instances on it, the operation will fail.
956 a7399f66 Iustin Pop

957 a7399f66 Iustin Pop
  """
958 60dd1473 Iustin Pop
  OP_DSC_FIELD = "node_name"
959 65e183af Michael Hanselmann
  OP_PARAMS = [
960 65e183af Michael Hanselmann
    _PNodeName,
961 65e183af Michael Hanselmann
    ]
962 c363310d René Nussbaumer
  OP_RESULT = ht.TNone
963 a8083063 Iustin Pop
964 a8083063 Iustin Pop
965 d817d49f Iustin Pop
class OpNodeAdd(OpCode):
966 a7399f66 Iustin Pop
  """Add a node to the cluster.
967 a7399f66 Iustin Pop

968 a7399f66 Iustin Pop
  @type node_name: C{str}
969 a7399f66 Iustin Pop
  @ivar node_name: The name of the node to add. This can be a short name,
970 a7399f66 Iustin Pop
                   but it will be expanded to the FQDN.
971 a7399f66 Iustin Pop
  @type primary_ip: IP address
972 a7399f66 Iustin Pop
  @ivar primary_ip: The primary IP of the node. This will be ignored when the
973 a7399f66 Iustin Pop
                    opcode is submitted, but will be filled during the node
974 a7399f66 Iustin Pop
                    add (so it will be visible in the job query).
975 a7399f66 Iustin Pop
  @type secondary_ip: IP address
976 a7399f66 Iustin Pop
  @ivar secondary_ip: The secondary IP of the node. This needs to be passed
977 a7399f66 Iustin Pop
                      if the cluster has been initialized in 'dual-network'
978 a7399f66 Iustin Pop
                      mode, otherwise it must not be given.
979 a7399f66 Iustin Pop
  @type readd: C{bool}
980 a7399f66 Iustin Pop
  @ivar readd: Whether to re-add an existing node to the cluster. If
981 a7399f66 Iustin Pop
               this is not passed, then the operation will abort if the node
982 a7399f66 Iustin Pop
               name is already in the cluster; use this parameter to 'repair'
983 a7399f66 Iustin Pop
               a node that had its configuration broken, or was reinstalled
984 a7399f66 Iustin Pop
               without removal from the cluster.
985 f936c153 Iustin Pop
  @type group: C{str}
986 f936c153 Iustin Pop
  @ivar group: The node group to which this node will belong.
987 fd3d37b6 Iustin Pop
  @type vm_capable: C{bool}
988 fd3d37b6 Iustin Pop
  @ivar vm_capable: The vm_capable node attribute
989 fd3d37b6 Iustin Pop
  @type master_capable: C{bool}
990 fd3d37b6 Iustin Pop
  @ivar master_capable: The master_capable node attribute
991 a7399f66 Iustin Pop

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

1141 9bf56d77 Michael Hanselmann
  @ivar instance_name: Instance name
1142 9bf56d77 Michael Hanselmann
  @ivar mode: Instance creation mode (one of L{constants.INSTANCE_CREATE_MODES})
1143 9bf56d77 Michael Hanselmann
  @ivar source_handshake: Signed handshake from source (remote import only)
1144 9bf56d77 Michael Hanselmann
  @ivar source_x509_ca: Source X509 CA in PEM format (remote import only)
1145 9bf56d77 Michael Hanselmann
  @ivar source_instance_name: Previous name of instance (remote import only)
1146 dae91d02 Michael Hanselmann
  @ivar source_shutdown_timeout: Shutdown timeout used for source instance
1147 dae91d02 Michael Hanselmann
    (remote import only)
1148 9bf56d77 Michael Hanselmann

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

1325 53c776b5 Iustin Pop
  This migrates (without shutting down an instance) to its secondary
1326 53c776b5 Iustin Pop
  node.
1327 53c776b5 Iustin Pop

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

1331 53c776b5 Iustin Pop
  """
1332 ee69c97f Iustin Pop
  OP_DSC_FIELD = "instance_name"
1333 65e183af Michael Hanselmann
  OP_PARAMS = [
1334 65e183af Michael Hanselmann
    _PInstanceName,
1335 65e183af Michael Hanselmann
    _PMigrationMode,
1336 65e183af Michael Hanselmann
    _PMigrationLive,
1337 f8fa4175 Michael Hanselmann
    _PMigrationTargetNode,
1338 8c0b16f6 Guido Trotter
    _PAllowRuntimeChgs,
1339 3ed23330 René Nussbaumer
    _PIgnoreIpolicy,
1340 45d4c81c Michael Hanselmann
    ("cleanup", False, ht.TBool,
1341 45d4c81c Michael Hanselmann
     "Whether a previously failed migration should be cleaned up"),
1342 8eb34306 Apollon Oikonomopoulos
    ("iallocator", None, ht.TMaybeString,
1343 8eb34306 Apollon Oikonomopoulos
     "Iallocator for deciding the target node for shared-storage instances"),
1344 d5cafd31 René Nussbaumer
    ("allow_failover", False, ht.TBool,
1345 d5cafd31 René Nussbaumer
     "Whether we can fallback to failover if migration is not possible"),
1346 65e183af Michael Hanselmann
    ]
1347 c363310d René Nussbaumer
  OP_RESULT = ht.TNone
1348 53c776b5 Iustin Pop
1349 53c776b5 Iustin Pop
1350 0091b480 Iustin Pop
class OpInstanceMove(OpCode):
1351 313bcead Iustin Pop
  """Move an instance.
1352 313bcead Iustin Pop

1353 313bcead Iustin Pop
  This move (with shutting down an instance and data copying) to an
1354 313bcead Iustin Pop
  arbitrary node.
1355 313bcead Iustin Pop

1356 313bcead Iustin Pop
  @ivar instance_name: the name of the instance
1357 313bcead Iustin Pop
  @ivar target_node: the destination node
1358 313bcead Iustin Pop

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

1453 ddc1de7c Michael Hanselmann
  """
1454 e9c3d864 Michael Hanselmann
  # Old format
1455 e9c3d864 Michael Hanselmann
  # TODO: Remove in version 2.8 including support in LUInstanceSetParams
1456 e9c3d864 Michael Hanselmann
  old_mod_item_fn = \
1457 ddc1de7c Michael Hanselmann
    ht.TAnd(ht.TIsLength(2), ht.TItems([
1458 ddc1de7c Michael Hanselmann
      ht.TOr(ht.TElemOf(constants.DDMS_VALUES), ht.TPositiveInt),
1459 ddc1de7c Michael Hanselmann
      fn,
1460 ddc1de7c Michael Hanselmann
      ]))
1461 ddc1de7c Michael Hanselmann
1462 e9c3d864 Michael Hanselmann
  # New format, supporting adding/removing disks/NICs at arbitrary indices
1463 e9c3d864 Michael Hanselmann
  mod_item_fn = \
1464 e9c3d864 Michael Hanselmann
    ht.TAnd(ht.TIsLength(3), ht.TItems([
1465 e9c3d864 Michael Hanselmann
      ht.TElemOf(constants.DDMS_VALUES_WITH_MODIFY),
1466 e9c3d864 Michael Hanselmann
      ht.Comment("Disk index, can be negative, e.g. -1 for last disk")(ht.TInt),
1467 e9c3d864 Michael Hanselmann
      fn,
1468 e9c3d864 Michael Hanselmann
      ]))
1469 e9c3d864 Michael Hanselmann
1470 e9c3d864 Michael Hanselmann
  return ht.TOr(ht.Comment("Recommended")(ht.TListOf(mod_item_fn)),
1471 e9c3d864 Michael Hanselmann
                ht.Comment("Deprecated")(ht.TListOf(old_mod_item_fn)))
1472 ddc1de7c Michael Hanselmann
1473 ddc1de7c Michael Hanselmann
1474 9a3cc7ae Iustin Pop
class OpInstanceSetParams(OpCode):
1475 ddc1de7c Michael Hanselmann
  """Change the parameters of an instance.
1476 ddc1de7c Michael Hanselmann

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

1658 1410fa8d Michael Hanselmann
  @ivar instance_name: Instance name
1659 1410fa8d Michael Hanselmann
  @ivar mode: Export mode (one of L{constants.EXPORT_MODES})
1660 1410fa8d Michael Hanselmann

1661 1410fa8d Michael Hanselmann
  """
1662 1410fa8d Michael Hanselmann
  OP_DSC_FIELD = "instance_name"
1663 65e183af Michael Hanselmann
  OP_PARAMS = [
1664 65e183af Michael Hanselmann
    _PInstanceName,
1665 45d4c81c Michael Hanselmann
    ("mode", ht.NoDefault, ht.TElemOf(constants.EXPORT_MODES),
1666 45d4c81c Michael Hanselmann
     "Export mode"),
1667 1410fa8d Michael Hanselmann
    ]
1668 c363310d René Nussbaumer
  OP_RESULT = ht.TOr(ht.TNone, ht.TDict)
1669 1410fa8d Michael Hanselmann
1670 1410fa8d Michael Hanselmann
1671 4ff922a2 Iustin Pop
class OpBackupExport(OpCode):
1672 4a96f1d1 Michael Hanselmann
  """Export an instance.
1673 4a96f1d1 Michael Hanselmann

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

1680 4a96f1d1 Michael Hanselmann
  @ivar mode: Export mode (one of L{constants.EXPORT_MODES})
1681 4a96f1d1 Michael Hanselmann
  @ivar target_node: Export destination
1682 4a96f1d1 Michael Hanselmann
  @ivar x509_key_name: X509 key to use (remote export only)
1683 4a96f1d1 Michael Hanselmann
  @ivar destination_x509_ca: Destination X509 CA in PEM format (remote export
1684 4a96f1d1 Michael Hanselmann
                             only)
1685 4a96f1d1 Michael Hanselmann

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

1779 06009e27 Iustin Pop
  This is used just for debugging and testing.
1780 06009e27 Iustin Pop

1781 06009e27 Iustin Pop
  Parameters:
1782 06009e27 Iustin Pop
    - duration: the time to sleep
1783 06009e27 Iustin Pop
    - on_master: if true, sleep on the master
1784 06009e27 Iustin Pop
    - on_nodes: list of nodes in which to sleep
1785 06009e27 Iustin Pop

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

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

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

1796 06009e27 Iustin Pop
  """
1797 60dd1473 Iustin Pop
  OP_DSC_FIELD = "duration"
1798 65e183af Michael Hanselmann
  OP_PARAMS = [
1799 b795a775 Michael Hanselmann
    ("duration", ht.NoDefault, ht.TNumber, None),
1800 197b323b Michael Hanselmann
    ("on_master", True, ht.TBool, None),
1801 197b323b Michael Hanselmann
    ("on_nodes", ht.EmptyList, ht.TListOf(ht.TNonEmptyString), None),
1802 197b323b Michael Hanselmann
    ("repeat", 0, ht.TPositiveInt, None),
1803 65e183af Michael Hanselmann
    ]
1804 d61df03e Iustin Pop
1805 d61df03e Iustin Pop
1806 d61df03e Iustin Pop
class OpTestAllocator(OpCode):
1807 d61df03e Iustin Pop
  """Allocator framework testing.
1808 d61df03e Iustin Pop

1809 d61df03e Iustin Pop
  This opcode has two modes:
1810 d61df03e Iustin Pop
    - gather and return allocator input for a given mode (allocate new
1811 d61df03e Iustin Pop
      or replace secondary) and a given instance definition (direction
1812 d61df03e Iustin Pop
      'in')
1813 d61df03e Iustin Pop
    - run a selected allocator for a given operation (as above) and
1814 d61df03e Iustin Pop
      return the allocator output (direction 'out')
1815 d61df03e Iustin Pop

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

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

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

1874 dbc96028 Michael Hanselmann
  Does not eliminate duplicates by C{OP_ID}.
1875 dbc96028 Michael Hanselmann

1876 dbc96028 Michael Hanselmann
  """
1877 dbc96028 Michael Hanselmann
  return [v for v in globals().values()
1878 dbc96028 Michael Hanselmann
          if (isinstance(v, type) and issubclass(v, OpCode) and
1879 687c10d9 Iustin Pop
              hasattr(v, "OP_ID") and v is not OpCode)]
1880 dbc96028 Michael Hanselmann
1881 dbc96028 Michael Hanselmann
1882 dbc96028 Michael Hanselmann
OP_MAPPING = dict((v.OP_ID, v) for v in _GetOpList())