Statistics
| Branch: | Tag: | Revision:

root / lib / opcodes.py @ 0fb66bb1

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

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

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

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

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

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

274 65e183af Michael Hanselmann
  @raise errors.OpPrereqError: when file storage is disabled
275 65e183af Michael Hanselmann

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

777 60975797 Iustin Pop
  In normal operation, the list should be empty.
778 60975797 Iustin Pop

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

1673 1410fa8d Michael Hanselmann
  @ivar instance_name: Instance name
1674 1410fa8d Michael Hanselmann
  @ivar mode: Export mode (one of L{constants.EXPORT_MODES})
1675 1410fa8d Michael Hanselmann

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

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

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

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

1794 06009e27 Iustin Pop
  This is used just for debugging and testing.
1795 06009e27 Iustin Pop

1796 06009e27 Iustin Pop
  Parameters:
1797 06009e27 Iustin Pop
    - duration: the time to sleep
1798 06009e27 Iustin Pop
    - on_master: if true, sleep on the master
1799 06009e27 Iustin Pop
    - on_nodes: list of nodes in which to sleep
1800 06009e27 Iustin Pop

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

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

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

1811 06009e27 Iustin Pop
  """
1812 60dd1473 Iustin Pop
  OP_DSC_FIELD = "duration"
1813 65e183af Michael Hanselmann
  OP_PARAMS = [
1814 b795a775 Michael Hanselmann
    ("duration", ht.NoDefault, ht.TNumber, None),
1815 197b323b Michael Hanselmann
    ("on_master", True, ht.TBool, None),
1816 197b323b Michael Hanselmann
    ("on_nodes", ht.EmptyList, ht.TListOf(ht.TNonEmptyString), None),
1817 197b323b Michael Hanselmann
    ("repeat", 0, ht.TPositiveInt, None),
1818 65e183af Michael Hanselmann
    ]
1819 d61df03e Iustin Pop
1820 d61df03e Iustin Pop
1821 d61df03e Iustin Pop
class OpTestAllocator(OpCode):
1822 d61df03e Iustin Pop
  """Allocator framework testing.
1823 d61df03e Iustin Pop

1824 d61df03e Iustin Pop
  This opcode has two modes:
1825 d61df03e Iustin Pop
    - gather and return allocator input for a given mode (allocate new
1826 d61df03e Iustin Pop
      or replace secondary) and a given instance definition (direction
1827 d61df03e Iustin Pop
      'in')
1828 d61df03e Iustin Pop
    - run a selected allocator for a given operation (as above) and
1829 d61df03e Iustin Pop
      return the allocator output (direction 'out')
1830 d61df03e Iustin Pop

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

1862 e58f87a9 Michael Hanselmann
  """
1863 65e183af Michael Hanselmann
  OP_PARAMS = [
1864 197b323b Michael Hanselmann
    ("notify_waitlock", False, ht.TBool, None),
1865 197b323b Michael Hanselmann
    ("notify_exec", False, ht.TBool, None),
1866 197b323b Michael Hanselmann
    ("log_messages", ht.EmptyList, ht.TListOf(ht.TString), None),
1867 197b323b Michael Hanselmann
    ("fail", False, ht.TBool, None),
1868 e58f87a9 Michael Hanselmann
    ]
1869 e58f87a9 Michael Hanselmann
1870 e58f87a9 Michael Hanselmann
1871 be760ba8 Michael Hanselmann
class OpTestDummy(OpCode):
1872 be760ba8 Michael Hanselmann
  """Utility opcode used by unittests.
1873 be760ba8 Michael Hanselmann

1874 be760ba8 Michael Hanselmann
  """
1875 65e183af Michael Hanselmann
  OP_PARAMS = [
1876 197b323b Michael Hanselmann
    ("result", ht.NoDefault, ht.NoType, None),
1877 197b323b Michael Hanselmann
    ("messages", ht.NoDefault, ht.NoType, None),
1878 197b323b Michael Hanselmann
    ("fail", ht.NoDefault, ht.NoType, None),
1879 6a373640 Michael Hanselmann
    ("submit_jobs", None, ht.NoType, None),
1880 be760ba8 Michael Hanselmann
    ]
1881 687c10d9 Iustin Pop
  WITH_LU = False
1882 be760ba8 Michael Hanselmann
1883 be760ba8 Michael Hanselmann
1884 dbc96028 Michael Hanselmann
def _GetOpList():
1885 dbc96028 Michael Hanselmann
  """Returns list of all defined opcodes.
1886 dbc96028 Michael Hanselmann

1887 dbc96028 Michael Hanselmann
  Does not eliminate duplicates by C{OP_ID}.
1888 dbc96028 Michael Hanselmann

1889 dbc96028 Michael Hanselmann
  """
1890 dbc96028 Michael Hanselmann
  return [v for v in globals().values()
1891 dbc96028 Michael Hanselmann
          if (isinstance(v, type) and issubclass(v, OpCode) and
1892 687c10d9 Iustin Pop
              hasattr(v, "OP_ID") and v is not OpCode)]
1893 dbc96028 Michael Hanselmann
1894 dbc96028 Michael Hanselmann
1895 dbc96028 Michael Hanselmann
OP_MAPPING = dict((v.OP_ID, v) for v in _GetOpList())