Statistics
| Branch: | Tag: | Revision:

root / lib / opcodes.py @ 06c2fb4a

History | View | Annotate | Download (68.1 kB)

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

251 ff0d18e6 Iustin Pop
  @type name: string
252 ff0d18e6 Iustin Pop
  @param name: the class name, as OpXxxYyy
253 d634b4e0 Michele Tartara
  @rtype: array of strings
254 d634b4e0 Michele Tartara
  @return: the components of the name
255 ff0d18e6 Iustin Pop

256 ff0d18e6 Iustin Pop
  """
257 d634b4e0 Michele Tartara
  assert name.startswith("Op")
258 ff0d18e6 Iustin Pop
  # Note: (?<=[a-z])(?=[A-Z]) would be ideal, since it wouldn't
259 ff0d18e6 Iustin Pop
  # consume any input, and hence we would just have all the elements
260 ff0d18e6 Iustin Pop
  # in the list, one by one; but it seems that split doesn't work on
261 ff0d18e6 Iustin Pop
  # non-consuming input, hence we have to process the input string a
262 ff0d18e6 Iustin Pop
  # bit
263 ff0d18e6 Iustin Pop
  name = _OPID_RE.sub(r"\1,\2", name)
264 ff0d18e6 Iustin Pop
  elems = name.split(",")
265 d634b4e0 Michele Tartara
  return elems
266 d634b4e0 Michele Tartara
267 d634b4e0 Michele Tartara
268 d634b4e0 Michele Tartara
def _NameToId(name):
269 d634b4e0 Michele Tartara
  """Convert an opcode class name to an OP_ID.
270 d634b4e0 Michele Tartara

271 d634b4e0 Michele Tartara
  @type name: string
272 d634b4e0 Michele Tartara
  @param name: the class name, as OpXxxYyy
273 d634b4e0 Michele Tartara
  @rtype: string
274 d634b4e0 Michele Tartara
  @return: the name in the OP_XXXX_YYYY format
275 d634b4e0 Michele Tartara

276 d634b4e0 Michele Tartara
  """
277 d634b4e0 Michele Tartara
  if not name.startswith("Op"):
278 d634b4e0 Michele Tartara
    return None
279 d634b4e0 Michele Tartara
  return "_".join(n.upper() for n in _NameComponents(name))
280 d634b4e0 Michele Tartara
281 d634b4e0 Michele Tartara
282 d634b4e0 Michele Tartara
def NameToReasonSrc(name):
283 d634b4e0 Michele Tartara
  """Convert an opcode class name to a source string for the reason trail
284 d634b4e0 Michele Tartara

285 d634b4e0 Michele Tartara
  @type name: string
286 d634b4e0 Michele Tartara
  @param name: the class name, as OpXxxYyy
287 d634b4e0 Michele Tartara
  @rtype: string
288 d634b4e0 Michele Tartara
  @return: the name in the OP_XXXX_YYYY format
289 d634b4e0 Michele Tartara

290 d634b4e0 Michele Tartara
  """
291 d634b4e0 Michele Tartara
  if not name.startswith("Op"):
292 d634b4e0 Michele Tartara
    return None
293 d634b4e0 Michele Tartara
  return "%s:%s" % (constants.OPCODE_REASON_SRC_OPCODE,
294 d634b4e0 Michele Tartara
                    "_".join(n.lower() for n in _NameComponents(name)))
295 ff0d18e6 Iustin Pop
296 65e183af Michael Hanselmann
297 415feb2e René Nussbaumer
def _GenerateObjectTypeCheck(obj, fields_types):
298 415feb2e René Nussbaumer
  """Helper to generate type checks for objects.
299 415feb2e René Nussbaumer

300 415feb2e René Nussbaumer
  @param obj: The object to generate type checks
301 415feb2e René Nussbaumer
  @param fields_types: The fields and their types as a dict
302 415feb2e René Nussbaumer
  @return: A ht type check function
303 415feb2e René Nussbaumer

304 415feb2e René Nussbaumer
  """
305 415feb2e René Nussbaumer
  assert set(obj.GetAllSlots()) == set(fields_types.keys()), \
306 415feb2e René Nussbaumer
    "%s != %s" % (set(obj.GetAllSlots()), set(fields_types.keys()))
307 415feb2e René Nussbaumer
  return ht.TStrictDict(True, True, fields_types)
308 415feb2e René Nussbaumer
309 415feb2e René Nussbaumer
310 b02c6bdf Michael Hanselmann
_TQueryFieldDef = \
311 b02c6bdf Michael Hanselmann
  _GenerateObjectTypeCheck(objects.QueryFieldDefinition, {
312 b02c6bdf Michael Hanselmann
    "name": ht.TNonEmptyString,
313 b02c6bdf Michael Hanselmann
    "title": ht.TNonEmptyString,
314 b02c6bdf Michael Hanselmann
    "kind": ht.TElemOf(constants.QFT_ALL),
315 b02c6bdf Michael Hanselmann
    "doc": ht.TNonEmptyString,
316 b02c6bdf Michael Hanselmann
    })
317 415feb2e René Nussbaumer
318 415feb2e René Nussbaumer
319 65e183af Michael Hanselmann
def RequireFileStorage():
320 65e183af Michael Hanselmann
  """Checks that file storage is enabled.
321 65e183af Michael Hanselmann

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

325 65e183af Michael Hanselmann
  @raise errors.OpPrereqError: when file storage is disabled
326 65e183af Michael Hanselmann

327 65e183af Michael Hanselmann
  """
328 65e183af Michael Hanselmann
  if not constants.ENABLE_FILE_STORAGE:
329 65e183af Michael Hanselmann
    raise errors.OpPrereqError("File storage disabled at configure time",
330 65e183af Michael Hanselmann
                               errors.ECODE_INVAL)
331 65e183af Michael Hanselmann
332 65e183af Michael Hanselmann
333 4b97f902 Apollon Oikonomopoulos
def RequireSharedFileStorage():
334 4b97f902 Apollon Oikonomopoulos
  """Checks that shared file storage is enabled.
335 4b97f902 Apollon Oikonomopoulos

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

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

341 4b97f902 Apollon Oikonomopoulos
  """
342 4b97f902 Apollon Oikonomopoulos
  if not constants.ENABLE_SHARED_FILE_STORAGE:
343 4b97f902 Apollon Oikonomopoulos
    raise errors.OpPrereqError("Shared file storage disabled at"
344 4b97f902 Apollon Oikonomopoulos
                               " configure time", errors.ECODE_INVAL)
345 4b97f902 Apollon Oikonomopoulos
346 4b97f902 Apollon Oikonomopoulos
347 8c9ee749 Michael Hanselmann
@ht.WithDesc("CheckFileStorage")
348 8c9ee749 Michael Hanselmann
def _CheckFileStorage(value):
349 8c9ee749 Michael Hanselmann
  """Ensures file storage is enabled if used.
350 65e183af Michael Hanselmann

351 65e183af Michael Hanselmann
  """
352 8c9ee749 Michael Hanselmann
  if value == constants.DT_FILE:
353 65e183af Michael Hanselmann
    RequireFileStorage()
354 4b97f902 Apollon Oikonomopoulos
  elif value == constants.DT_SHARED_FILE:
355 4b97f902 Apollon Oikonomopoulos
    RequireSharedFileStorage()
356 65e183af Michael Hanselmann
  return True
357 65e183af Michael Hanselmann
358 65e183af Michael Hanselmann
359 45fe090b Michael Hanselmann
def _BuildDiskTemplateCheck(accept_none):
360 45fe090b Michael Hanselmann
  """Builds check for disk template.
361 45fe090b Michael Hanselmann

362 45fe090b Michael Hanselmann
  @type accept_none: bool
363 45fe090b Michael Hanselmann
  @param accept_none: whether to accept None as a correct value
364 45fe090b Michael Hanselmann
  @rtype: callable
365 45fe090b Michael Hanselmann

366 45fe090b Michael Hanselmann
  """
367 45fe090b Michael Hanselmann
  template_check = ht.TElemOf(constants.DISK_TEMPLATES)
368 45fe090b Michael Hanselmann
369 45fe090b Michael Hanselmann
  if accept_none:
370 fd9f58fd Iustin Pop
    template_check = ht.TMaybe(template_check)
371 45fe090b Michael Hanselmann
372 45fe090b Michael Hanselmann
  return ht.TAnd(template_check, _CheckFileStorage)
373 8c9ee749 Michael Hanselmann
374 8c9ee749 Michael Hanselmann
375 65e183af Michael Hanselmann
def _CheckStorageType(storage_type):
376 65e183af Michael Hanselmann
  """Ensure a given storage type is valid.
377 65e183af Michael Hanselmann

378 65e183af Michael Hanselmann
  """
379 65e183af Michael Hanselmann
  if storage_type not in constants.VALID_STORAGE_TYPES:
380 65e183af Michael Hanselmann
    raise errors.OpPrereqError("Unknown storage type: %s" % storage_type,
381 65e183af Michael Hanselmann
                               errors.ECODE_INVAL)
382 65e183af Michael Hanselmann
  if storage_type == constants.ST_FILE:
383 63a3d8f7 Michael Hanselmann
    # TODO: What about shared file storage?
384 65e183af Michael Hanselmann
    RequireFileStorage()
385 65e183af Michael Hanselmann
  return True
386 65e183af Michael Hanselmann
387 65e183af Michael Hanselmann
388 65e183af Michael Hanselmann
#: Storage type parameter
389 45d4c81c Michael Hanselmann
_PStorageType = ("storage_type", ht.NoDefault, _CheckStorageType,
390 45d4c81c Michael Hanselmann
                 "Storage type")
391 65e183af Michael Hanselmann
392 3c286190 Dimitris Aragiorgis
393 16091a6e Michael Hanselmann
@ht.WithDesc("IPv4 network")
394 eaa4c57c Dimitris Aragiorgis
def _CheckCIDRNetNotation(value):
395 16091a6e Michael Hanselmann
  """Ensure a given CIDR notation type is valid.
396 eaa4c57c Dimitris Aragiorgis

397 eaa4c57c Dimitris Aragiorgis
  """
398 eaa4c57c Dimitris Aragiorgis
  try:
399 eaa4c57c Dimitris Aragiorgis
    ipaddr.IPv4Network(value)
400 eaa4c57c Dimitris Aragiorgis
  except ipaddr.AddressValueError:
401 eaa4c57c Dimitris Aragiorgis
    return False
402 eaa4c57c Dimitris Aragiorgis
  return True
403 eaa4c57c Dimitris Aragiorgis
404 3c286190 Dimitris Aragiorgis
405 16091a6e Michael Hanselmann
@ht.WithDesc("IPv4 address")
406 eaa4c57c Dimitris Aragiorgis
def _CheckCIDRAddrNotation(value):
407 16091a6e Michael Hanselmann
  """Ensure a given CIDR notation type is valid.
408 eaa4c57c Dimitris Aragiorgis

409 eaa4c57c Dimitris Aragiorgis
  """
410 eaa4c57c Dimitris Aragiorgis
  try:
411 eaa4c57c Dimitris Aragiorgis
    ipaddr.IPv4Address(value)
412 eaa4c57c Dimitris Aragiorgis
  except ipaddr.AddressValueError:
413 eaa4c57c Dimitris Aragiorgis
    return False
414 eaa4c57c Dimitris Aragiorgis
  return True
415 eaa4c57c Dimitris Aragiorgis
416 3c286190 Dimitris Aragiorgis
417 16091a6e Michael Hanselmann
@ht.WithDesc("IPv6 address")
418 eaa4c57c Dimitris Aragiorgis
def _CheckCIDR6AddrNotation(value):
419 16091a6e Michael Hanselmann
  """Ensure a given CIDR notation type is valid.
420 eaa4c57c Dimitris Aragiorgis

421 eaa4c57c Dimitris Aragiorgis
  """
422 eaa4c57c Dimitris Aragiorgis
  try:
423 eaa4c57c Dimitris Aragiorgis
    ipaddr.IPv6Address(value)
424 eaa4c57c Dimitris Aragiorgis
  except ipaddr.AddressValueError:
425 eaa4c57c Dimitris Aragiorgis
    return False
426 eaa4c57c Dimitris Aragiorgis
  return True
427 eaa4c57c Dimitris Aragiorgis
428 3c286190 Dimitris Aragiorgis
429 16091a6e Michael Hanselmann
@ht.WithDesc("IPv6 network")
430 eaa4c57c Dimitris Aragiorgis
def _CheckCIDR6NetNotation(value):
431 16091a6e Michael Hanselmann
  """Ensure a given CIDR notation type is valid.
432 eaa4c57c Dimitris Aragiorgis

433 eaa4c57c Dimitris Aragiorgis
  """
434 eaa4c57c Dimitris Aragiorgis
  try:
435 eaa4c57c Dimitris Aragiorgis
    ipaddr.IPv6Network(value)
436 eaa4c57c Dimitris Aragiorgis
  except ipaddr.AddressValueError:
437 eaa4c57c Dimitris Aragiorgis
    return False
438 eaa4c57c Dimitris Aragiorgis
  return True
439 65e183af Michael Hanselmann
440 3c286190 Dimitris Aragiorgis
441 e1494c96 Iustin Pop
_TIpAddress4 = ht.TAnd(ht.TString, _CheckCIDRAddrNotation)
442 e1494c96 Iustin Pop
_TIpAddress6 = ht.TAnd(ht.TString, _CheckCIDR6AddrNotation)
443 e1494c96 Iustin Pop
_TIpNetwork4 = ht.TAnd(ht.TString, _CheckCIDRNetNotation)
444 e1494c96 Iustin Pop
_TIpNetwork6 = ht.TAnd(ht.TString, _CheckCIDR6NetNotation)
445 e1494c96 Iustin Pop
_TMaybeAddr4List = ht.TMaybe(ht.TListOf(_TIpAddress4))
446 32e3d8b1 Michael Hanselmann
447 32e3d8b1 Michael Hanselmann
448 473d87a3 Iustin Pop
class _AutoOpParamSlots(outils.AutoSlots):
449 65e183af Michael Hanselmann
  """Meta class for opcode definitions.
450 65e183af Michael Hanselmann

451 65e183af Michael Hanselmann
  """
452 65e183af Michael Hanselmann
  def __new__(mcs, name, bases, attrs):
453 65e183af Michael Hanselmann
    """Called when a class should be created.
454 65e183af Michael Hanselmann

455 65e183af Michael Hanselmann
    @param mcs: The meta class
456 65e183af Michael Hanselmann
    @param name: Name of created class
457 65e183af Michael Hanselmann
    @param bases: Base classes
458 65e183af Michael Hanselmann
    @type attrs: dict
459 65e183af Michael Hanselmann
    @param attrs: Class attributes
460 65e183af Michael Hanselmann

461 65e183af Michael Hanselmann
    """
462 e89a9021 Iustin Pop
    assert "OP_ID" not in attrs, "Class '%s' defining OP_ID" % name
463 ff0d18e6 Iustin Pop
464 32683096 René Nussbaumer
    slots = mcs._GetSlots(attrs)
465 32683096 René Nussbaumer
    assert "OP_DSC_FIELD" not in attrs or attrs["OP_DSC_FIELD"] in slots, \
466 32683096 René Nussbaumer
      "Class '%s' uses unknown field in OP_DSC_FIELD" % name
467 8bc17ebb Iustin Pop
    assert ("OP_DSC_FORMATTER" not in attrs or
468 8bc17ebb Iustin Pop
            callable(attrs["OP_DSC_FORMATTER"])), \
469 8bc17ebb Iustin Pop
      ("Class '%s' uses non-callable in OP_DSC_FORMATTER (%s)" %
470 8bc17ebb Iustin Pop
       (name, type(attrs["OP_DSC_FORMATTER"])))
471 32683096 René Nussbaumer
472 e89a9021 Iustin Pop
    attrs["OP_ID"] = _NameToId(name)
473 65e183af Michael Hanselmann
474 473d87a3 Iustin Pop
    return outils.AutoSlots.__new__(mcs, name, bases, attrs)
475 32683096 René Nussbaumer
476 32683096 René Nussbaumer
  @classmethod
477 32683096 René Nussbaumer
  def _GetSlots(mcs, attrs):
478 32683096 René Nussbaumer
    """Build the slots out of OP_PARAMS.
479 32683096 René Nussbaumer

480 32683096 René Nussbaumer
    """
481 65e183af Michael Hanselmann
    # Always set OP_PARAMS to avoid duplicates in BaseOpCode.GetAllParams
482 65e183af Michael Hanselmann
    params = attrs.setdefault("OP_PARAMS", [])
483 65e183af Michael Hanselmann
484 65e183af Michael Hanselmann
    # Use parameter names as slots
485 32683096 René Nussbaumer
    return [pname for (pname, _, _, _) in params]
486 65e183af Michael Hanselmann
487 df458e0b Iustin Pop
488 473d87a3 Iustin Pop
class BaseOpCode(outils.ValidatedSlots):
489 df458e0b Iustin Pop
  """A simple serializable object.
490 df458e0b Iustin Pop

491 0e46916d Iustin Pop
  This object serves as a parent class for OpCode without any custom
492 0e46916d Iustin Pop
  field handling.
493 0e46916d Iustin Pop

494 df458e0b Iustin Pop
  """
495 b459a848 Andrea Spadaccini
  # pylint: disable=E1101
496 e89a9021 Iustin Pop
  # as OP_ID is dynamically defined
497 65e183af Michael Hanselmann
  __metaclass__ = _AutoOpParamSlots
498 65e183af Michael Hanselmann
499 df458e0b Iustin Pop
  def __getstate__(self):
500 a7399f66 Iustin Pop
    """Generic serializer.
501 a7399f66 Iustin Pop

502 a7399f66 Iustin Pop
    This method just returns the contents of the instance as a
503 a7399f66 Iustin Pop
    dictionary.
504 a7399f66 Iustin Pop

505 a7399f66 Iustin Pop
    @rtype:  C{dict}
506 a7399f66 Iustin Pop
    @return: the instance attributes and their values
507 a7399f66 Iustin Pop

508 a7399f66 Iustin Pop
    """
509 df458e0b Iustin Pop
    state = {}
510 32683096 René Nussbaumer
    for name in self.GetAllSlots():
511 df458e0b Iustin Pop
      if hasattr(self, name):
512 df458e0b Iustin Pop
        state[name] = getattr(self, name)
513 df458e0b Iustin Pop
    return state
514 df458e0b Iustin Pop
515 df458e0b Iustin Pop
  def __setstate__(self, state):
516 a7399f66 Iustin Pop
    """Generic unserializer.
517 a7399f66 Iustin Pop

518 a7399f66 Iustin Pop
    This method just restores from the serialized state the attributes
519 a7399f66 Iustin Pop
    of the current instance.
520 a7399f66 Iustin Pop

521 a7399f66 Iustin Pop
    @param state: the serialized opcode data
522 a7399f66 Iustin Pop
    @type state:  C{dict}
523 a7399f66 Iustin Pop

524 a7399f66 Iustin Pop
    """
525 df458e0b Iustin Pop
    if not isinstance(state, dict):
526 df458e0b Iustin Pop
      raise ValueError("Invalid data to __setstate__: expected dict, got %s" %
527 df458e0b Iustin Pop
                       type(state))
528 df458e0b Iustin Pop
529 32683096 René Nussbaumer
    for name in self.GetAllSlots():
530 44db3a6f Iustin Pop
      if name not in state and hasattr(self, name):
531 df458e0b Iustin Pop
        delattr(self, name)
532 df458e0b Iustin Pop
533 df458e0b Iustin Pop
    for name in state:
534 df458e0b Iustin Pop
      setattr(self, name, state[name])
535 df458e0b Iustin Pop
536 adf385c7 Iustin Pop
  @classmethod
537 65e183af Michael Hanselmann
  def GetAllParams(cls):
538 65e183af Michael Hanselmann
    """Compute list of all parameters for an opcode.
539 65e183af Michael Hanselmann

540 65e183af Michael Hanselmann
    """
541 65e183af Michael Hanselmann
    slots = []
542 65e183af Michael Hanselmann
    for parent in cls.__mro__:
543 65e183af Michael Hanselmann
      slots.extend(getattr(parent, "OP_PARAMS", []))
544 65e183af Michael Hanselmann
    return slots
545 65e183af Michael Hanselmann
546 32683096 René Nussbaumer
  def Validate(self, set_defaults): # pylint: disable=W0221
547 1cbef6d8 Michael Hanselmann
    """Validate opcode parameters, optionally setting default values.
548 1cbef6d8 Michael Hanselmann

549 1cbef6d8 Michael Hanselmann
    @type set_defaults: bool
550 1cbef6d8 Michael Hanselmann
    @param set_defaults: Whether to set default values
551 1cbef6d8 Michael Hanselmann
    @raise errors.OpPrereqError: When a parameter value doesn't match
552 1cbef6d8 Michael Hanselmann
                                 requirements
553 1cbef6d8 Michael Hanselmann

554 1cbef6d8 Michael Hanselmann
    """
555 197b323b Michael Hanselmann
    for (attr_name, default, test, _) in self.GetAllParams():
556 1cbef6d8 Michael Hanselmann
      assert test == ht.NoType or callable(test)
557 1cbef6d8 Michael Hanselmann
558 1cbef6d8 Michael Hanselmann
      if not hasattr(self, attr_name):
559 1cbef6d8 Michael Hanselmann
        if default == ht.NoDefault:
560 1cbef6d8 Michael Hanselmann
          raise errors.OpPrereqError("Required parameter '%s.%s' missing" %
561 1cbef6d8 Michael Hanselmann
                                     (self.OP_ID, attr_name),
562 1cbef6d8 Michael Hanselmann
                                     errors.ECODE_INVAL)
563 1cbef6d8 Michael Hanselmann
        elif set_defaults:
564 1cbef6d8 Michael Hanselmann
          if callable(default):
565 1cbef6d8 Michael Hanselmann
            dval = default()
566 1cbef6d8 Michael Hanselmann
          else:
567 1cbef6d8 Michael Hanselmann
            dval = default
568 1cbef6d8 Michael Hanselmann
          setattr(self, attr_name, dval)
569 1cbef6d8 Michael Hanselmann
570 1cbef6d8 Michael Hanselmann
      if test == ht.NoType:
571 1cbef6d8 Michael Hanselmann
        # no tests here
572 1cbef6d8 Michael Hanselmann
        continue
573 1cbef6d8 Michael Hanselmann
574 1cbef6d8 Michael Hanselmann
      if set_defaults or hasattr(self, attr_name):
575 1cbef6d8 Michael Hanselmann
        attr_val = getattr(self, attr_name)
576 1cbef6d8 Michael Hanselmann
        if not test(attr_val):
577 e1ebbfcf Iustin Pop
          logging.error("OpCode %s, parameter %s, has invalid type %s/value"
578 e1ebbfcf Iustin Pop
                        " '%s' expecting type %s",
579 68b2e985 René Nussbaumer
                        self.OP_ID, attr_name, type(attr_val), attr_val, test)
580 1cbef6d8 Michael Hanselmann
          raise errors.OpPrereqError("Parameter '%s.%s' fails validation" %
581 1cbef6d8 Michael Hanselmann
                                     (self.OP_ID, attr_name),
582 1cbef6d8 Michael Hanselmann
                                     errors.ECODE_INVAL)
583 1cbef6d8 Michael Hanselmann
584 df458e0b Iustin Pop
585 b247c6fc Michael Hanselmann
def _BuildJobDepCheck(relative):
586 b247c6fc Michael Hanselmann
  """Builds check for job dependencies (L{DEPEND_ATTR}).
587 b247c6fc Michael Hanselmann

588 b247c6fc Michael Hanselmann
  @type relative: bool
589 b247c6fc Michael Hanselmann
  @param relative: Whether to accept relative job IDs (negative)
590 b247c6fc Michael Hanselmann
  @rtype: callable
591 b247c6fc Michael Hanselmann

592 b247c6fc Michael Hanselmann
  """
593 b247c6fc Michael Hanselmann
  if relative:
594 b247c6fc Michael Hanselmann
    job_id = ht.TOr(ht.TJobId, ht.TRelativeJobId)
595 b247c6fc Michael Hanselmann
  else:
596 b247c6fc Michael Hanselmann
    job_id = ht.TJobId
597 b247c6fc Michael Hanselmann
598 b247c6fc Michael Hanselmann
  job_dep = \
599 dd076c21 Iustin Pop
    ht.TAnd(ht.TOr(ht.TList, ht.TTuple),
600 dd076c21 Iustin Pop
            ht.TIsLength(2),
601 b247c6fc Michael Hanselmann
            ht.TItems([job_id,
602 b247c6fc Michael Hanselmann
                       ht.TListOf(ht.TElemOf(constants.JOBS_FINALIZED))]))
603 b247c6fc Michael Hanselmann
604 ff8067cf Michael Hanselmann
  return ht.TMaybeListOf(job_dep)
605 b247c6fc Michael Hanselmann
606 b247c6fc Michael Hanselmann
607 b247c6fc Michael Hanselmann
TNoRelativeJobDependencies = _BuildJobDepCheck(False)
608 b247c6fc Michael Hanselmann
609 1ce03fb1 Michael Hanselmann
#: List of submission status and job ID as returned by C{SubmitManyJobs}
610 1456df62 Michael Hanselmann
_TJobIdListItem = \
611 1456df62 Michael Hanselmann
  ht.TAnd(ht.TIsLength(2),
612 1456df62 Michael Hanselmann
          ht.TItems([ht.Comment("success")(ht.TBool),
613 1456df62 Michael Hanselmann
                     ht.Comment("Job ID if successful, error message"
614 1456df62 Michael Hanselmann
                                " otherwise")(ht.TOr(ht.TString,
615 1456df62 Michael Hanselmann
                                                     ht.TJobId))]))
616 1456df62 Michael Hanselmann
TJobIdList = ht.TListOf(_TJobIdListItem)
617 1ce03fb1 Michael Hanselmann
618 f7686867 Michael Hanselmann
#: Result containing only list of submitted jobs
619 f7686867 Michael Hanselmann
TJobIdListOnly = ht.TStrictDict(True, True, {
620 1456df62 Michael Hanselmann
  constants.JOB_IDS_KEY: ht.Comment("List of submitted jobs")(TJobIdList),
621 f7686867 Michael Hanselmann
  })
622 f7686867 Michael Hanselmann
623 b247c6fc Michael Hanselmann
624 0e46916d Iustin Pop
class OpCode(BaseOpCode):
625 a7399f66 Iustin Pop
  """Abstract OpCode.
626 a7399f66 Iustin Pop

627 a7399f66 Iustin Pop
  This is the root of the actual OpCode hierarchy. All clases derived
628 a7399f66 Iustin Pop
  from this class should override OP_ID.
629 a7399f66 Iustin Pop

630 a7399f66 Iustin Pop
  @cvar OP_ID: The ID of this opcode. This should be unique amongst all
631 20777413 Iustin Pop
               children of this class.
632 bde8f481 Adeodato Simo
  @cvar OP_DSC_FIELD: The name of a field whose value will be included in the
633 bde8f481 Adeodato Simo
                      string returned by Summary(); see the docstring of that
634 bde8f481 Adeodato Simo
                      method for details).
635 8bc17ebb Iustin Pop
  @cvar OP_DSC_FORMATTER: A callable that should format the OP_DSC_FIELD; if
636 8bc17ebb Iustin Pop
                          not present, then the field will be simply converted
637 8bc17ebb Iustin Pop
                          to string
638 65e183af Michael Hanselmann
  @cvar OP_PARAMS: List of opcode attributes, the default values they should
639 65e183af Michael Hanselmann
                   get if not already defined, and types they must match.
640 1ce03fb1 Michael Hanselmann
  @cvar OP_RESULT: Callable to verify opcode result
641 687c10d9 Iustin Pop
  @cvar WITH_LU: Boolean that specifies whether this should be included in
642 687c10d9 Iustin Pop
      mcpu's dispatch table
643 20777413 Iustin Pop
  @ivar dry_run: Whether the LU should be run in dry-run mode, i.e. just
644 20777413 Iustin Pop
                 the check steps
645 8f5c488d Michael Hanselmann
  @ivar priority: Opcode priority for queue
646 a7399f66 Iustin Pop

647 a7399f66 Iustin Pop
  """
648 b459a848 Andrea Spadaccini
  # pylint: disable=E1101
649 e89a9021 Iustin Pop
  # as OP_ID is dynamically defined
650 687c10d9 Iustin Pop
  WITH_LU = True
651 65e183af Michael Hanselmann
  OP_PARAMS = [
652 45d4c81c Michael Hanselmann
    ("dry_run", None, ht.TMaybeBool, "Run checks only, don't execute"),
653 fd9f58fd Iustin Pop
    ("debug_level", None, ht.TMaybe(ht.TNonNegativeInt), "Debug level"),
654 65e183af Michael Hanselmann
    ("priority", constants.OP_PRIO_DEFAULT,
655 45d4c81c Michael Hanselmann
     ht.TElemOf(constants.OP_PRIO_SUBMIT_VALID), "Opcode priority"),
656 b247c6fc Michael Hanselmann
    (DEPEND_ATTR, None, _BuildJobDepCheck(True),
657 b247c6fc Michael Hanselmann
     "Job dependencies; if used through ``SubmitManyJobs`` relative (negative)"
658 822a50c4 Michael Hanselmann
     " job IDs can be used; see :doc:`design document <design-chained-jobs>`"
659 822a50c4 Michael Hanselmann
     " for details"),
660 018ae30b Michael Hanselmann
    (COMMENT_ATTR, None, ht.TMaybeString,
661 018ae30b Michael Hanselmann
     "Comment describing the purpose of the opcode"),
662 33b52bdc Thomas Thrainer
    (constants.OPCODE_REASON, ht.EmptyList, ht.TMaybeList,
663 dbae804a Michele Tartara
     "The reason trail, describing why the OpCode is executed"),
664 65e183af Michael Hanselmann
    ]
665 1ce03fb1 Michael Hanselmann
  OP_RESULT = None
666 df458e0b Iustin Pop
667 df458e0b Iustin Pop
  def __getstate__(self):
668 df458e0b Iustin Pop
    """Specialized getstate for opcodes.
669 df458e0b Iustin Pop

670 a7399f66 Iustin Pop
    This method adds to the state dictionary the OP_ID of the class,
671 a7399f66 Iustin Pop
    so that on unload we can identify the correct class for
672 a7399f66 Iustin Pop
    instantiating the opcode.
673 a7399f66 Iustin Pop

674 a7399f66 Iustin Pop
    @rtype:   C{dict}
675 a7399f66 Iustin Pop
    @return:  the state as a dictionary
676 a7399f66 Iustin Pop

677 df458e0b Iustin Pop
    """
678 0e46916d Iustin Pop
    data = BaseOpCode.__getstate__(self)
679 df458e0b Iustin Pop
    data["OP_ID"] = self.OP_ID
680 df458e0b Iustin Pop
    return data
681 df458e0b Iustin Pop
682 df458e0b Iustin Pop
  @classmethod
683 00abdc96 Iustin Pop
  def LoadOpCode(cls, data):
684 df458e0b Iustin Pop
    """Generic load opcode method.
685 df458e0b Iustin Pop

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

690 a7399f66 Iustin Pop
    @type data:  C{dict}
691 a7399f66 Iustin Pop
    @param data: the serialized opcode
692 a7399f66 Iustin Pop

693 df458e0b Iustin Pop
    """
694 df458e0b Iustin Pop
    if not isinstance(data, dict):
695 df458e0b Iustin Pop
      raise ValueError("Invalid data to LoadOpCode (%s)" % type(data))
696 df458e0b Iustin Pop
    if "OP_ID" not in data:
697 df458e0b Iustin Pop
      raise ValueError("Invalid data to LoadOpcode, missing OP_ID")
698 df458e0b Iustin Pop
    op_id = data["OP_ID"]
699 df458e0b Iustin Pop
    op_class = None
700 363acb1e Iustin Pop
    if op_id in OP_MAPPING:
701 363acb1e Iustin Pop
      op_class = OP_MAPPING[op_id]
702 363acb1e Iustin Pop
    else:
703 df458e0b Iustin Pop
      raise ValueError("Invalid data to LoadOpCode: OP_ID %s unsupported" %
704 df458e0b Iustin Pop
                       op_id)
705 df458e0b Iustin Pop
    op = op_class()
706 df458e0b Iustin Pop
    new_data = data.copy()
707 df458e0b Iustin Pop
    del new_data["OP_ID"]
708 df458e0b Iustin Pop
    op.__setstate__(new_data)
709 df458e0b Iustin Pop
    return op
710 df458e0b Iustin Pop
711 60dd1473 Iustin Pop
  def Summary(self):
712 60dd1473 Iustin Pop
    """Generates a summary description of this opcode.
713 60dd1473 Iustin Pop

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

720 60dd1473 Iustin Pop
    """
721 ff0d18e6 Iustin Pop
    assert self.OP_ID is not None and len(self.OP_ID) > 3
722 60dd1473 Iustin Pop
    # all OP_ID start with OP_, we remove that
723 60dd1473 Iustin Pop
    txt = self.OP_ID[3:]
724 60dd1473 Iustin Pop
    field_name = getattr(self, "OP_DSC_FIELD", None)
725 60dd1473 Iustin Pop
    if field_name:
726 60dd1473 Iustin Pop
      field_value = getattr(self, field_name, None)
727 8bc17ebb Iustin Pop
      field_formatter = getattr(self, "OP_DSC_FORMATTER", None)
728 8bc17ebb Iustin Pop
      if callable(field_formatter):
729 8bc17ebb Iustin Pop
        field_value = field_formatter(field_value)
730 8bc17ebb Iustin Pop
      elif isinstance(field_value, (list, tuple)):
731 bc8bbda1 Iustin Pop
        field_value = ",".join(str(i) for i in field_value)
732 60dd1473 Iustin Pop
      txt = "%s(%s)" % (txt, field_value)
733 60dd1473 Iustin Pop
    return txt
734 60dd1473 Iustin Pop
735 3ce9a5e7 Michael Hanselmann
  def TinySummary(self):
736 3ce9a5e7 Michael Hanselmann
    """Generates a compact summary description of the opcode.
737 3ce9a5e7 Michael Hanselmann

738 3ce9a5e7 Michael Hanselmann
    """
739 3ce9a5e7 Michael Hanselmann
    assert self.OP_ID.startswith("OP_")
740 3ce9a5e7 Michael Hanselmann
741 3ce9a5e7 Michael Hanselmann
    text = self.OP_ID[3:]
742 3ce9a5e7 Michael Hanselmann
743 3ce9a5e7 Michael Hanselmann
    for (prefix, supplement) in _SUMMARY_PREFIX.items():
744 3ce9a5e7 Michael Hanselmann
      if text.startswith(prefix):
745 3ce9a5e7 Michael Hanselmann
        return supplement + text[len(prefix):]
746 3ce9a5e7 Michael Hanselmann
747 3ce9a5e7 Michael Hanselmann
    return text
748 3ce9a5e7 Michael Hanselmann
749 a8083063 Iustin Pop
750 afee0879 Iustin Pop
# cluster opcodes
751 afee0879 Iustin Pop
752 bc84ffa7 Iustin Pop
class OpClusterPostInit(OpCode):
753 b5f5fae9 Luca Bigliardi
  """Post cluster initialization.
754 b5f5fae9 Luca Bigliardi

755 b5f5fae9 Luca Bigliardi
  This opcode does not touch the cluster at all. Its purpose is to run hooks
756 b5f5fae9 Luca Bigliardi
  after the cluster has been initialized.
757 b5f5fae9 Luca Bigliardi

758 b5f5fae9 Luca Bigliardi
  """
759 c363310d René Nussbaumer
  OP_RESULT = ht.TBool
760 b5f5fae9 Luca Bigliardi
761 b5f5fae9 Luca Bigliardi
762 c6d43e9e Iustin Pop
class OpClusterDestroy(OpCode):
763 a7399f66 Iustin Pop
  """Destroy the cluster.
764 a7399f66 Iustin Pop

765 a7399f66 Iustin Pop
  This opcode has no other parameters. All the state is irreversibly
766 a7399f66 Iustin Pop
  lost after the execution of this opcode.
767 a7399f66 Iustin Pop

768 a7399f66 Iustin Pop
  """
769 c363310d René Nussbaumer
  OP_RESULT = ht.TNonEmptyString
770 a8083063 Iustin Pop
771 a8083063 Iustin Pop
772 a2f7ab92 Iustin Pop
class OpClusterQuery(OpCode):
773 fdc267f4 Iustin Pop
  """Query cluster information."""
774 415feb2e René Nussbaumer
  OP_RESULT = ht.TDictOf(ht.TNonEmptyString, ht.TAny)
775 a8083063 Iustin Pop
776 a8083063 Iustin Pop
777 fcad7225 Michael Hanselmann
class OpClusterVerify(OpCode):
778 fcad7225 Michael Hanselmann
  """Submits all jobs necessary to verify the cluster.
779 fcad7225 Michael Hanselmann

780 fcad7225 Michael Hanselmann
  """
781 fcad7225 Michael Hanselmann
  OP_PARAMS = [
782 fcad7225 Michael Hanselmann
    _PDebugSimulateErrors,
783 fcad7225 Michael Hanselmann
    _PErrorCodes,
784 fcad7225 Michael Hanselmann
    _PSkipChecks,
785 93f2399e Andrea Spadaccini
    _PIgnoreErrors,
786 fcad7225 Michael Hanselmann
    _PVerbose,
787 3c286190 Dimitris Aragiorgis
    ("group_name", None, ht.TMaybeString, "Group to verify"),
788 fcad7225 Michael Hanselmann
    ]
789 f7686867 Michael Hanselmann
  OP_RESULT = TJobIdListOnly
790 fcad7225 Michael Hanselmann
791 fcad7225 Michael Hanselmann
792 bf93ae69 Adeodato Simo
class OpClusterVerifyConfig(OpCode):
793 bf93ae69 Adeodato Simo
  """Verify the cluster config.
794 bf93ae69 Adeodato Simo

795 bf93ae69 Adeodato Simo
  """
796 bf93ae69 Adeodato Simo
  OP_PARAMS = [
797 57106b74 Michael Hanselmann
    _PDebugSimulateErrors,
798 57106b74 Michael Hanselmann
    _PErrorCodes,
799 93f2399e Andrea Spadaccini
    _PIgnoreErrors,
800 57106b74 Michael Hanselmann
    _PVerbose,
801 bf93ae69 Adeodato Simo
    ]
802 f7686867 Michael Hanselmann
  OP_RESULT = ht.TBool
803 bf93ae69 Adeodato Simo
804 bf93ae69 Adeodato Simo
805 bf93ae69 Adeodato Simo
class OpClusterVerifyGroup(OpCode):
806 bf93ae69 Adeodato Simo
  """Run verify on a node group from the cluster.
807 a7399f66 Iustin Pop

808 a7399f66 Iustin Pop
  @type skip_checks: C{list}
809 a7399f66 Iustin Pop
  @ivar skip_checks: steps to be skipped from the verify process; this
810 a7399f66 Iustin Pop
                     needs to be a subset of
811 a7399f66 Iustin Pop
                     L{constants.VERIFY_OPTIONAL_CHECKS}; currently
812 a7399f66 Iustin Pop
                     only L{constants.VERIFY_NPLUSONE_MEM} can be passed
813 a7399f66 Iustin Pop

814 a7399f66 Iustin Pop
  """
815 bf93ae69 Adeodato Simo
  OP_DSC_FIELD = "group_name"
816 65e183af Michael Hanselmann
  OP_PARAMS = [
817 57106b74 Michael Hanselmann
    _PGroupName,
818 57106b74 Michael Hanselmann
    _PDebugSimulateErrors,
819 57106b74 Michael Hanselmann
    _PErrorCodes,
820 57106b74 Michael Hanselmann
    _PSkipChecks,
821 93f2399e Andrea Spadaccini
    _PIgnoreErrors,
822 57106b74 Michael Hanselmann
    _PVerbose,
823 65e183af Michael Hanselmann
    ]
824 f7686867 Michael Hanselmann
  OP_RESULT = ht.TBool
825 a8083063 Iustin Pop
826 a8083063 Iustin Pop
827 bd8210a7 Iustin Pop
class OpClusterVerifyDisks(OpCode):
828 150e978f Iustin Pop
  """Verify the cluster disks.
829 150e978f Iustin Pop

830 ae1a845c Michael Hanselmann
  """
831 f7686867 Michael Hanselmann
  OP_RESULT = TJobIdListOnly
832 ae1a845c Michael Hanselmann
833 ae1a845c Michael Hanselmann
834 ae1a845c Michael Hanselmann
class OpGroupVerifyDisks(OpCode):
835 ae1a845c Michael Hanselmann
  """Verifies the status of all disks in a node group.
836 150e978f Iustin Pop

837 ae1a845c Michael Hanselmann
  Result: a tuple of three elements:
838 ae1a845c Michael Hanselmann
    - dict of node names with issues (values: error msg)
839 150e978f Iustin Pop
    - list of instances with degraded disks (that should be activated)
840 b63ed789 Iustin Pop
    - dict of instances with missing logical volumes (values: (node, vol)
841 b63ed789 Iustin Pop
      pairs with details about the missing volumes)
842 150e978f Iustin Pop

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

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

851 150e978f Iustin Pop
  """
852 ae1a845c Michael Hanselmann
  OP_DSC_FIELD = "group_name"
853 ae1a845c Michael Hanselmann
  OP_PARAMS = [
854 ae1a845c Michael Hanselmann
    _PGroupName,
855 ae1a845c Michael Hanselmann
    ]
856 1ce03fb1 Michael Hanselmann
  OP_RESULT = \
857 1ce03fb1 Michael Hanselmann
    ht.TAnd(ht.TIsLength(3),
858 1ce03fb1 Michael Hanselmann
            ht.TItems([ht.TDictOf(ht.TString, ht.TString),
859 1ce03fb1 Michael Hanselmann
                       ht.TListOf(ht.TString),
860 6973587f Michael Hanselmann
                       ht.TDictOf(ht.TString,
861 6973587f Michael Hanselmann
                                  ht.TListOf(ht.TListOf(ht.TString)))]))
862 150e978f Iustin Pop
863 150e978f Iustin Pop
864 5d01aca3 Iustin Pop
class OpClusterRepairDiskSizes(OpCode):
865 60975797 Iustin Pop
  """Verify the disk sizes of the instances and fixes configuration
866 60975797 Iustin Pop
  mimatches.
867 60975797 Iustin Pop

868 60975797 Iustin Pop
  Parameters: optional instances list, in case we want to restrict the
869 60975797 Iustin Pop
  checks to only a subset of the instances.
870 60975797 Iustin Pop

871 60975797 Iustin Pop
  Result: a list of tuples, (instance, disk, new-size) for changed
872 60975797 Iustin Pop
  configurations.
873 60975797 Iustin Pop

874 60975797 Iustin Pop
  In normal operation, the list should be empty.
875 60975797 Iustin Pop

876 60975797 Iustin Pop
  @type instances: list
877 60975797 Iustin Pop
  @ivar instances: the list of instances to check, or empty for all instances
878 60975797 Iustin Pop

879 60975797 Iustin Pop
  """
880 65e183af Michael Hanselmann
  OP_PARAMS = [
881 197b323b Michael Hanselmann
    ("instances", ht.EmptyList, ht.TListOf(ht.TNonEmptyString), None),
882 65e183af Michael Hanselmann
    ]
883 c363310d René Nussbaumer
  OP_RESULT = ht.TListOf(ht.TAnd(ht.TIsLength(3),
884 c363310d René Nussbaumer
                                 ht.TItems([ht.TNonEmptyString,
885 2c9fa1ff Iustin Pop
                                            ht.TNonNegativeInt,
886 2c9fa1ff Iustin Pop
                                            ht.TNonNegativeInt])))
887 60975797 Iustin Pop
888 60975797 Iustin Pop
889 2f093ea0 Iustin Pop
class OpClusterConfigQuery(OpCode):
890 ae5849b5 Michael Hanselmann
  """Query cluster configuration values."""
891 65e183af Michael Hanselmann
  OP_PARAMS = [
892 3c286190 Dimitris Aragiorgis
    _POutputFields,
893 65e183af Michael Hanselmann
    ]
894 c363310d René Nussbaumer
  OP_RESULT = ht.TListOf(ht.TAny)
895 a8083063 Iustin Pop
896 a8083063 Iustin Pop
897 e126df25 Iustin Pop
class OpClusterRename(OpCode):
898 a7399f66 Iustin Pop
  """Rename the cluster.
899 a7399f66 Iustin Pop

900 a7399f66 Iustin Pop
  @type name: C{str}
901 a7399f66 Iustin Pop
  @ivar name: The new name of the cluster. The name and/or the master IP
902 a7399f66 Iustin Pop
              address will be changed to match the new name and its IP
903 a7399f66 Iustin Pop
              address.
904 a7399f66 Iustin Pop

905 a7399f66 Iustin Pop
  """
906 60dd1473 Iustin Pop
  OP_DSC_FIELD = "name"
907 65e183af Michael Hanselmann
  OP_PARAMS = [
908 197b323b Michael Hanselmann
    ("name", ht.NoDefault, ht.TNonEmptyString, None),
909 65e183af Michael Hanselmann
    ]
910 c363310d René Nussbaumer
  OP_RESULT = ht.TNonEmptyString
911 07bd8a51 Iustin Pop
912 07bd8a51 Iustin Pop
913 a6682fdc Iustin Pop
class OpClusterSetParams(OpCode):
914 a7399f66 Iustin Pop
  """Change the parameters of the cluster.
915 a7399f66 Iustin Pop

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

919 a7399f66 Iustin Pop
  """
920 65e183af Michael Hanselmann
  OP_PARAMS = [
921 e5c92cfb Klaus Aehlig
    _PForce,
922 2da9f556 René Nussbaumer
    _PHvState,
923 2da9f556 René Nussbaumer
    _PDiskState,
924 fd9f58fd Iustin Pop
    ("vg_name", None, ht.TMaybe(ht.TString), "Volume group name"),
925 65e183af Michael Hanselmann
    ("enabled_hypervisors", None,
926 fd9f58fd Iustin Pop
     ht.TMaybe(ht.TAnd(ht.TListOf(ht.TElemOf(constants.HYPER_TYPES)),
927 fd9f58fd Iustin Pop
                       ht.TTrue)),
928 45d4c81c Michael Hanselmann
     "List of enabled hypervisors"),
929 a138ead7 Michael Hanselmann
    ("hvparams", None,
930 fd9f58fd Iustin Pop
     ht.TMaybe(ht.TDictOf(ht.TNonEmptyString, ht.TDict)),
931 45d4c81c Michael Hanselmann
     "Cluster-wide hypervisor parameter defaults, hypervisor-dependent"),
932 fd9f58fd Iustin Pop
    ("beparams", None, ht.TMaybeDict,
933 45d4c81c Michael Hanselmann
     "Cluster-wide backend parameter defaults"),
934 fd9f58fd Iustin Pop
    ("os_hvp", None, ht.TMaybe(ht.TDictOf(ht.TNonEmptyString, ht.TDict)),
935 45d4c81c Michael Hanselmann
     "Cluster-wide per-OS hypervisor parameter defaults"),
936 a138ead7 Michael Hanselmann
    ("osparams", None,
937 fd9f58fd Iustin Pop
     ht.TMaybe(ht.TDictOf(ht.TNonEmptyString, ht.TDict)),
938 45d4c81c Michael Hanselmann
     "Cluster-wide OS parameter defaults"),
939 bc5d0215 Andrea Spadaccini
    _PDiskParams,
940 fd9f58fd Iustin Pop
    ("candidate_pool_size", None, ht.TMaybe(ht.TPositiveInt),
941 45d4c81c Michael Hanselmann
     "Master candidate pool size"),
942 45d4c81c Michael Hanselmann
    ("uid_pool", None, ht.NoType,
943 45d4c81c Michael Hanselmann
     "Set UID pool, must be list of lists describing UID ranges (two items,"
944 45d4c81c Michael Hanselmann
     " start and end inclusive)"),
945 45d4c81c Michael Hanselmann
    ("add_uids", None, ht.NoType,
946 45d4c81c Michael Hanselmann
     "Extend UID pool, must be list of lists describing UID ranges (two"
947 45d4c81c Michael Hanselmann
     " items, start and end inclusive) to be added"),
948 45d4c81c Michael Hanselmann
    ("remove_uids", None, ht.NoType,
949 45d4c81c Michael Hanselmann
     "Shrink UID pool, must be list of lists describing UID ranges (two"
950 45d4c81c Michael Hanselmann
     " items, start and end inclusive) to be removed"),
951 45d4c81c Michael Hanselmann
    ("maintain_node_health", None, ht.TMaybeBool,
952 45d4c81c Michael Hanselmann
     "Whether to automatically maintain node health"),
953 45d4c81c Michael Hanselmann
    ("prealloc_wipe_disks", None, ht.TMaybeBool,
954 45d4c81c Michael Hanselmann
     "Whether to wipe disks before allocating them to instances"),
955 45d4c81c Michael Hanselmann
    ("nicparams", None, ht.TMaybeDict, "Cluster-wide NIC parameter defaults"),
956 45d4c81c Michael Hanselmann
    ("ndparams", None, ht.TMaybeDict, "Cluster-wide node parameter defaults"),
957 1b01390b René Nussbaumer
    ("ipolicy", None, ht.TMaybeDict,
958 1b01390b René Nussbaumer
     "Cluster-wide :ref:`instance policy <rapi-ipolicy>` specs"),
959 fd9f58fd Iustin Pop
    ("drbd_helper", None, ht.TMaybe(ht.TString), "DRBD helper program"),
960 fd9f58fd Iustin Pop
    ("default_iallocator", None, ht.TMaybe(ht.TString),
961 45d4c81c Michael Hanselmann
     "Default iallocator for cluster"),
962 fd9f58fd Iustin Pop
    ("master_netdev", None, ht.TMaybe(ht.TString),
963 45d4c81c Michael Hanselmann
     "Master network device"),
964 fd9f58fd Iustin Pop
    ("master_netmask", None, ht.TMaybe(ht.TNonNegativeInt),
965 5a8648eb Andrea Spadaccini
     "Netmask of the master IP"),
966 ff8067cf Michael Hanselmann
    ("reserved_lvs", None, ht.TMaybeListOf(ht.TNonEmptyString),
967 45d4c81c Michael Hanselmann
     "List of reserved LVs"),
968 45d4c81c Michael Hanselmann
    ("hidden_os", None, _TestClusterOsList,
969 0fb66bb1 Iustin Pop
     "Modify list of hidden operating systems: each modification must have"
970 0fb66bb1 Iustin Pop
     " two items, the operation and the OS name; the operation can be"
971 0fb66bb1 Iustin Pop
     " ``%s`` or ``%s``" % (constants.DDM_ADD, constants.DDM_REMOVE)),
972 45d4c81c Michael Hanselmann
    ("blacklisted_os", None, _TestClusterOsList,
973 0fb66bb1 Iustin Pop
     "Modify list of blacklisted operating systems: each modification must"
974 0fb66bb1 Iustin Pop
     " have two items, the operation and the OS name; the operation can be"
975 0fb66bb1 Iustin Pop
     " ``%s`` or ``%s``" % (constants.DDM_ADD, constants.DDM_REMOVE)),
976 bf689b7a Andrea Spadaccini
    ("use_external_mip_script", None, ht.TMaybeBool,
977 bf689b7a Andrea Spadaccini
     "Whether to use an external master IP address setup script"),
978 66af5ec5 Helga Velroyen
    ("enabled_disk_templates", None,
979 66af5ec5 Helga Velroyen
     ht.TMaybe(ht.TAnd(ht.TListOf(ht.TElemOf(constants.DISK_TEMPLATES)),
980 66af5ec5 Helga Velroyen
                       ht.TTrue)),
981 66af5ec5 Helga Velroyen
     "List of enabled disk templates"),
982 75f2ff7d Michele Tartara
    ("modify_etc_hosts", None, ht.TMaybeBool,
983 75f2ff7d Michele Tartara
     "Whether the cluster can modify and keep in sync the /etc/hosts files"),
984 4b7735f9 Iustin Pop
    ]
985 c363310d René Nussbaumer
  OP_RESULT = ht.TNone
986 12515db7 Manuel Franceschini
987 12515db7 Manuel Franceschini
988 d1240007 Iustin Pop
class OpClusterRedistConf(OpCode):
989 afee0879 Iustin Pop
  """Force a full push of the cluster configuration.
990 afee0879 Iustin Pop

991 afee0879 Iustin Pop
  """
992 c363310d René Nussbaumer
  OP_RESULT = ht.TNone
993 afee0879 Iustin Pop
994 83f72637 Michael Hanselmann
995 fb926117 Andrea Spadaccini
class OpClusterActivateMasterIp(OpCode):
996 fb926117 Andrea Spadaccini
  """Activate the master IP on the master node.
997 fb926117 Andrea Spadaccini

998 fb926117 Andrea Spadaccini
  """
999 c363310d René Nussbaumer
  OP_RESULT = ht.TNone
1000 fb926117 Andrea Spadaccini
1001 fb926117 Andrea Spadaccini
1002 fb926117 Andrea Spadaccini
class OpClusterDeactivateMasterIp(OpCode):
1003 fb926117 Andrea Spadaccini
  """Deactivate the master IP on the master node.
1004 fb926117 Andrea Spadaccini

1005 fb926117 Andrea Spadaccini
  """
1006 c363310d René Nussbaumer
  OP_RESULT = ht.TNone
1007 fb926117 Andrea Spadaccini
1008 fb926117 Andrea Spadaccini
1009 83f72637 Michael Hanselmann
class OpQuery(OpCode):
1010 83f72637 Michael Hanselmann
  """Query for resources/items.
1011 83f72637 Michael Hanselmann

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

1016 83f72637 Michael Hanselmann
  """
1017 e50d8412 Michael Hanselmann
  OP_DSC_FIELD = "what"
1018 65e183af Michael Hanselmann
  OP_PARAMS = [
1019 8e7078e0 Michael Hanselmann
    _PQueryWhat,
1020 ee13764f Michael Hanselmann
    _PUseLocking,
1021 45d4c81c Michael Hanselmann
    ("fields", ht.NoDefault, ht.TListOf(ht.TNonEmptyString),
1022 45d4c81c Michael Hanselmann
     "Requested fields"),
1023 fd9f58fd Iustin Pop
    ("qfilter", None, ht.TMaybe(ht.TList),
1024 45d4c81c Michael Hanselmann
     "Query filter"),
1025 83f72637 Michael Hanselmann
    ]
1026 415feb2e René Nussbaumer
  OP_RESULT = \
1027 b02c6bdf Michael Hanselmann
    _GenerateObjectTypeCheck(objects.QueryResponse, {
1028 b02c6bdf Michael Hanselmann
      "fields": ht.TListOf(_TQueryFieldDef),
1029 b02c6bdf Michael Hanselmann
      "data": _TQueryResult,
1030 b02c6bdf Michael Hanselmann
      })
1031 83f72637 Michael Hanselmann
1032 83f72637 Michael Hanselmann
1033 83f72637 Michael Hanselmann
class OpQueryFields(OpCode):
1034 83f72637 Michael Hanselmann
  """Query for available resource/item fields.
1035 83f72637 Michael Hanselmann

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

1039 83f72637 Michael Hanselmann
  """
1040 e50d8412 Michael Hanselmann
  OP_DSC_FIELD = "what"
1041 65e183af Michael Hanselmann
  OP_PARAMS = [
1042 8e7078e0 Michael Hanselmann
    _PQueryWhat,
1043 ff8067cf Michael Hanselmann
    ("fields", None, ht.TMaybeListOf(ht.TNonEmptyString),
1044 8e7078e0 Michael Hanselmann
     "Requested fields; if not given, all are returned"),
1045 83f72637 Michael Hanselmann
    ]
1046 415feb2e René Nussbaumer
  OP_RESULT = \
1047 b02c6bdf Michael Hanselmann
    _GenerateObjectTypeCheck(objects.QueryFieldsResponse, {
1048 b02c6bdf Michael Hanselmann
      "fields": ht.TListOf(_TQueryFieldDef),
1049 b02c6bdf Michael Hanselmann
      })
1050 83f72637 Michael Hanselmann
1051 83f72637 Michael Hanselmann
1052 792af3ad René Nussbaumer
class OpOobCommand(OpCode):
1053 eb64da59 René Nussbaumer
  """Interact with OOB."""
1054 65e183af Michael Hanselmann
  OP_PARAMS = [
1055 c4ec0755 René Nussbaumer
    ("node_names", ht.EmptyList, ht.TListOf(ht.TNonEmptyString),
1056 c4ec0755 René Nussbaumer
     "List of nodes to run the OOB command against"),
1057 70296981 Iustin Pop
    ("command", ht.NoDefault, ht.TElemOf(constants.OOB_COMMANDS),
1058 c4ec0755 René Nussbaumer
     "OOB command to be run"),
1059 c4ec0755 René Nussbaumer
    ("timeout", constants.OOB_TIMEOUT, ht.TInt,
1060 c4ec0755 René Nussbaumer
     "Timeout before the OOB helper will be terminated"),
1061 c4ec0755 René Nussbaumer
    ("ignore_status", False, ht.TBool,
1062 c4ec0755 René Nussbaumer
     "Ignores the node offline status for power off"),
1063 2c9fa1ff Iustin Pop
    ("power_delay", constants.OOB_POWER_DELAY, ht.TNonNegativeFloat,
1064 beff3779 René Nussbaumer
     "Time in seconds to wait between powering on nodes"),
1065 eb64da59 René Nussbaumer
    ]
1066 c363310d René Nussbaumer
  # Fixme: Make it more specific with all the special cases in LUOobCommand
1067 415feb2e René Nussbaumer
  OP_RESULT = _TQueryResult
1068 eb64da59 René Nussbaumer
1069 eb64da59 René Nussbaumer
1070 e4d745a7 Michael Hanselmann
class OpRestrictedCommand(OpCode):
1071 e4d745a7 Michael Hanselmann
  """Runs a restricted command on node(s).
1072 e4d745a7 Michael Hanselmann

1073 e4d745a7 Michael Hanselmann
  """
1074 e4d745a7 Michael Hanselmann
  OP_PARAMS = [
1075 e4d745a7 Michael Hanselmann
    _PUseLocking,
1076 e4d745a7 Michael Hanselmann
    ("nodes", ht.NoDefault, ht.TListOf(ht.TNonEmptyString),
1077 e4d745a7 Michael Hanselmann
     "Nodes on which the command should be run (at least one)"),
1078 e4d745a7 Michael Hanselmann
    ("command", ht.NoDefault, ht.TNonEmptyString,
1079 e4d745a7 Michael Hanselmann
     "Command name (no parameters)"),
1080 e4d745a7 Michael Hanselmann
    ]
1081 e4d745a7 Michael Hanselmann
1082 e4d745a7 Michael Hanselmann
  _RESULT_ITEMS = [
1083 e4d745a7 Michael Hanselmann
    ht.Comment("success")(ht.TBool),
1084 e4d745a7 Michael Hanselmann
    ht.Comment("output or error message")(ht.TString),
1085 e4d745a7 Michael Hanselmann
    ]
1086 e4d745a7 Michael Hanselmann
1087 e4d745a7 Michael Hanselmann
  OP_RESULT = \
1088 e4d745a7 Michael Hanselmann
    ht.TListOf(ht.TAnd(ht.TIsLength(len(_RESULT_ITEMS)),
1089 e4d745a7 Michael Hanselmann
                       ht.TItems(_RESULT_ITEMS)))
1090 e4d745a7 Michael Hanselmann
1091 e4d745a7 Michael Hanselmann
1092 07bd8a51 Iustin Pop
# node opcodes
1093 07bd8a51 Iustin Pop
1094 73d565a3 Iustin Pop
class OpNodeRemove(OpCode):
1095 a7399f66 Iustin Pop
  """Remove a node.
1096 a7399f66 Iustin Pop

1097 a7399f66 Iustin Pop
  @type node_name: C{str}
1098 a7399f66 Iustin Pop
  @ivar node_name: The name of the node to remove. If the node still has
1099 a7399f66 Iustin Pop
                   instances on it, the operation will fail.
1100 a7399f66 Iustin Pop

1101 a7399f66 Iustin Pop
  """
1102 60dd1473 Iustin Pop
  OP_DSC_FIELD = "node_name"
1103 65e183af Michael Hanselmann
  OP_PARAMS = [
1104 65e183af Michael Hanselmann
    _PNodeName,
1105 65e183af Michael Hanselmann
    ]
1106 c363310d René Nussbaumer
  OP_RESULT = ht.TNone
1107 a8083063 Iustin Pop
1108 a8083063 Iustin Pop
1109 d817d49f Iustin Pop
class OpNodeAdd(OpCode):
1110 a7399f66 Iustin Pop
  """Add a node to the cluster.
1111 a7399f66 Iustin Pop

1112 a7399f66 Iustin Pop
  @type node_name: C{str}
1113 a7399f66 Iustin Pop
  @ivar node_name: The name of the node to add. This can be a short name,
1114 a7399f66 Iustin Pop
                   but it will be expanded to the FQDN.
1115 a7399f66 Iustin Pop
  @type primary_ip: IP address
1116 a7399f66 Iustin Pop
  @ivar primary_ip: The primary IP of the node. This will be ignored when the
1117 a7399f66 Iustin Pop
                    opcode is submitted, but will be filled during the node
1118 a7399f66 Iustin Pop
                    add (so it will be visible in the job query).
1119 a7399f66 Iustin Pop
  @type secondary_ip: IP address
1120 a7399f66 Iustin Pop
  @ivar secondary_ip: The secondary IP of the node. This needs to be passed
1121 a7399f66 Iustin Pop
                      if the cluster has been initialized in 'dual-network'
1122 a7399f66 Iustin Pop
                      mode, otherwise it must not be given.
1123 a7399f66 Iustin Pop
  @type readd: C{bool}
1124 a7399f66 Iustin Pop
  @ivar readd: Whether to re-add an existing node to the cluster. If
1125 a7399f66 Iustin Pop
               this is not passed, then the operation will abort if the node
1126 a7399f66 Iustin Pop
               name is already in the cluster; use this parameter to 'repair'
1127 a7399f66 Iustin Pop
               a node that had its configuration broken, or was reinstalled
1128 a7399f66 Iustin Pop
               without removal from the cluster.
1129 f936c153 Iustin Pop
  @type group: C{str}
1130 f936c153 Iustin Pop
  @ivar group: The node group to which this node will belong.
1131 fd3d37b6 Iustin Pop
  @type vm_capable: C{bool}
1132 fd3d37b6 Iustin Pop
  @ivar vm_capable: The vm_capable node attribute
1133 fd3d37b6 Iustin Pop
  @type master_capable: C{bool}
1134 fd3d37b6 Iustin Pop
  @ivar master_capable: The master_capable node attribute
1135 a7399f66 Iustin Pop

1136 a7399f66 Iustin Pop
  """
1137 60dd1473 Iustin Pop
  OP_DSC_FIELD = "node_name"
1138 65e183af Michael Hanselmann
  OP_PARAMS = [
1139 65e183af Michael Hanselmann
    _PNodeName,
1140 085e0d9f René Nussbaumer
    _PHvState,
1141 085e0d9f René Nussbaumer
    _PDiskState,
1142 45d4c81c Michael Hanselmann
    ("primary_ip", None, ht.NoType, "Primary IP address"),
1143 45d4c81c Michael Hanselmann
    ("secondary_ip", None, ht.TMaybeString, "Secondary IP address"),
1144 45d4c81c Michael Hanselmann
    ("readd", False, ht.TBool, "Whether node is re-added to cluster"),
1145 45d4c81c Michael Hanselmann
    ("group", None, ht.TMaybeString, "Initial node group"),
1146 45d4c81c Michael Hanselmann
    ("master_capable", None, ht.TMaybeBool,
1147 45d4c81c Michael Hanselmann
     "Whether node can become master or master candidate"),
1148 45d4c81c Michael Hanselmann
    ("vm_capable", None, ht.TMaybeBool,
1149 45d4c81c Michael Hanselmann
     "Whether node can host instances"),
1150 45d4c81c Michael Hanselmann
    ("ndparams", None, ht.TMaybeDict, "Node parameters"),
1151 65e183af Michael Hanselmann
    ]
1152 c363310d René Nussbaumer
  OP_RESULT = ht.TNone
1153 a8083063 Iustin Pop
1154 a8083063 Iustin Pop
1155 2237687b Iustin Pop
class OpNodeQuery(OpCode):
1156 a8083063 Iustin Pop
  """Compute the list of nodes."""
1157 65e183af Michael Hanselmann
  OP_PARAMS = [
1158 65e183af Michael Hanselmann
    _POutputFields,
1159 45d4c81c Michael Hanselmann
    _PUseLocking,
1160 45d4c81c Michael Hanselmann
    ("names", ht.EmptyList, ht.TListOf(ht.TNonEmptyString),
1161 45d4c81c Michael Hanselmann
     "Empty list to query all nodes, node names otherwise"),
1162 65e183af Michael Hanselmann
    ]
1163 415feb2e René Nussbaumer
  OP_RESULT = _TOldQueryResult
1164 a8083063 Iustin Pop
1165 a8083063 Iustin Pop
1166 8ed55bfd Iustin Pop
class OpNodeQueryvols(OpCode):
1167 dcb93971 Michael Hanselmann
  """Get list of volumes on node."""
1168 65e183af Michael Hanselmann
  OP_PARAMS = [
1169 65e183af Michael Hanselmann
    _POutputFields,
1170 45d4c81c Michael Hanselmann
    ("nodes", ht.EmptyList, ht.TListOf(ht.TNonEmptyString),
1171 45d4c81c Michael Hanselmann
     "Empty list to query all nodes, node names otherwise"),
1172 65e183af Michael Hanselmann
    ]
1173 c363310d René Nussbaumer
  OP_RESULT = ht.TListOf(ht.TAny)
1174 dcb93971 Michael Hanselmann
1175 dcb93971 Michael Hanselmann
1176 ad8d0595 Iustin Pop
class OpNodeQueryStorage(OpCode):
1177 9e5442ce Michael Hanselmann
  """Get information on storage for node(s)."""
1178 65e183af Michael Hanselmann
  OP_PARAMS = [
1179 65e183af Michael Hanselmann
    _POutputFields,
1180 65e183af Michael Hanselmann
    _PStorageType,
1181 45d4c81c Michael Hanselmann
    ("nodes", ht.EmptyList, ht.TListOf(ht.TNonEmptyString), "List of nodes"),
1182 45d4c81c Michael Hanselmann
    ("name", None, ht.TMaybeString, "Storage name"),
1183 9e5442ce Michael Hanselmann
    ]
1184 415feb2e René Nussbaumer
  OP_RESULT = _TOldQueryResult
1185 9e5442ce Michael Hanselmann
1186 9e5442ce Michael Hanselmann
1187 2cee4077 Iustin Pop
class OpNodeModifyStorage(OpCode):
1188 099c52ad Iustin Pop
  """Modifies the properies of a storage unit"""
1189 32708d0a Iustin Pop
  OP_DSC_FIELD = "node_name"
1190 65e183af Michael Hanselmann
  OP_PARAMS = [
1191 65e183af Michael Hanselmann
    _PNodeName,
1192 65e183af Michael Hanselmann
    _PStorageType,
1193 45d4c81c Michael Hanselmann
    _PStorageName,
1194 45d4c81c Michael Hanselmann
    ("changes", ht.NoDefault, ht.TDict, "Requested changes"),
1195 efb8da02 Michael Hanselmann
    ]
1196 c363310d René Nussbaumer
  OP_RESULT = ht.TNone
1197 efb8da02 Michael Hanselmann
1198 efb8da02 Michael Hanselmann
1199 76aef8fc Michael Hanselmann
class OpRepairNodeStorage(OpCode):
1200 76aef8fc Michael Hanselmann
  """Repairs the volume group on a node."""
1201 76aef8fc Michael Hanselmann
  OP_DSC_FIELD = "node_name"
1202 65e183af Michael Hanselmann
  OP_PARAMS = [
1203 65e183af Michael Hanselmann
    _PNodeName,
1204 65e183af Michael Hanselmann
    _PStorageType,
1205 45d4c81c Michael Hanselmann
    _PStorageName,
1206 45d4c81c Michael Hanselmann
    _PIgnoreConsistency,
1207 76aef8fc Michael Hanselmann
    ]
1208 c363310d René Nussbaumer
  OP_RESULT = ht.TNone
1209 76aef8fc Michael Hanselmann
1210 76aef8fc Michael Hanselmann
1211 f13973c4 Iustin Pop
class OpNodeSetParams(OpCode):
1212 b31c8676 Iustin Pop
  """Change the parameters of a node."""
1213 b31c8676 Iustin Pop
  OP_DSC_FIELD = "node_name"
1214 65e183af Michael Hanselmann
  OP_PARAMS = [
1215 65e183af Michael Hanselmann
    _PNodeName,
1216 65e183af Michael Hanselmann
    _PForce,
1217 0ec2ce46 René Nussbaumer
    _PHvState,
1218 0ec2ce46 René Nussbaumer
    _PDiskState,
1219 45d4c81c Michael Hanselmann
    ("master_candidate", None, ht.TMaybeBool,
1220 45d4c81c Michael Hanselmann
     "Whether the node should become a master candidate"),
1221 45d4c81c Michael Hanselmann
    ("offline", None, ht.TMaybeBool,
1222 45d4c81c Michael Hanselmann
     "Whether the node should be marked as offline"),
1223 45d4c81c Michael Hanselmann
    ("drained", None, ht.TMaybeBool,
1224 45d4c81c Michael Hanselmann
     "Whether the node should be marked as drained"),
1225 45d4c81c Michael Hanselmann
    ("auto_promote", False, ht.TBool,
1226 45d4c81c Michael Hanselmann
     "Whether node(s) should be promoted to master candidate if necessary"),
1227 45d4c81c Michael Hanselmann
    ("master_capable", None, ht.TMaybeBool,
1228 45d4c81c Michael Hanselmann
     "Denote whether node can become master or master candidate"),
1229 45d4c81c Michael Hanselmann
    ("vm_capable", None, ht.TMaybeBool,
1230 45d4c81c Michael Hanselmann
     "Denote whether node can host instances"),
1231 45d4c81c Michael Hanselmann
    ("secondary_ip", None, ht.TMaybeString,
1232 45d4c81c Michael Hanselmann
     "Change node's secondary IP address"),
1233 45d4c81c Michael Hanselmann
    ("ndparams", None, ht.TMaybeDict, "Set node parameters"),
1234 45d4c81c Michael Hanselmann
    ("powered", None, ht.TMaybeBool,
1235 45d4c81c Michael Hanselmann
     "Whether the node should be marked as powered"),
1236 b31c8676 Iustin Pop
    ]
1237 1456df62 Michael Hanselmann
  OP_RESULT = _TSetParamsResult
1238 b31c8676 Iustin Pop
1239 f5118ade Iustin Pop
1240 e0d4735f Iustin Pop
class OpNodePowercycle(OpCode):
1241 f5118ade Iustin Pop
  """Tries to powercycle a node."""
1242 f5118ade Iustin Pop
  OP_DSC_FIELD = "node_name"
1243 65e183af Michael Hanselmann
  OP_PARAMS = [
1244 65e183af Michael Hanselmann
    _PNodeName,
1245 65e183af Michael Hanselmann
    _PForce,
1246 f5118ade Iustin Pop
    ]
1247 c363310d René Nussbaumer
  OP_RESULT = ht.TMaybeString
1248 f5118ade Iustin Pop
1249 7ffc5a86 Michael Hanselmann
1250 5b14a488 Iustin Pop
class OpNodeMigrate(OpCode):
1251 80cb875c Michael Hanselmann
  """Migrate all instances from a node."""
1252 80cb875c Michael Hanselmann
  OP_DSC_FIELD = "node_name"
1253 65e183af Michael Hanselmann
  OP_PARAMS = [
1254 65e183af Michael Hanselmann
    _PNodeName,
1255 65e183af Michael Hanselmann
    _PMigrationMode,
1256 65e183af Michael Hanselmann
    _PMigrationLive,
1257 f8fa4175 Michael Hanselmann
    _PMigrationTargetNode,
1258 8c0b16f6 Guido Trotter
    _PAllowRuntimeChgs,
1259 9fa567b3 René Nussbaumer
    _PIgnoreIpolicy,
1260 89514061 Iustin Pop
    _PIAllocFromDesc("Iallocator for deciding the target node"
1261 89514061 Iustin Pop
                     " for shared-storage instances"),
1262 80cb875c Michael Hanselmann
    ]
1263 65c9591c Michael Hanselmann
  OP_RESULT = TJobIdListOnly
1264 80cb875c Michael Hanselmann
1265 80cb875c Michael Hanselmann
1266 e1f23243 Michael Hanselmann
class OpNodeEvacuate(OpCode):
1267 e1f23243 Michael Hanselmann
  """Evacuate instances off a number of nodes."""
1268 e1f23243 Michael Hanselmann
  OP_DSC_FIELD = "node_name"
1269 e1f23243 Michael Hanselmann
  OP_PARAMS = [
1270 e1f23243 Michael Hanselmann
    _PEarlyRelease,
1271 e1f23243 Michael Hanselmann
    _PNodeName,
1272 e1f23243 Michael Hanselmann
    ("remote_node", None, ht.TMaybeString, "New secondary node"),
1273 89514061 Iustin Pop
    _PIAllocFromDesc("Iallocator for computing solution"),
1274 cb92e7a1 Michael Hanselmann
    ("mode", ht.NoDefault, ht.TElemOf(constants.NODE_EVAC_MODES),
1275 e1f23243 Michael Hanselmann
     "Node evacuation mode"),
1276 e1f23243 Michael Hanselmann
    ]
1277 1456df62 Michael Hanselmann
  OP_RESULT = TJobIdListOnly
1278 e1f23243 Michael Hanselmann
1279 e1f23243 Michael Hanselmann
1280 a8083063 Iustin Pop
# instance opcodes
1281 a8083063 Iustin Pop
1282 e1530b10 Iustin Pop
class OpInstanceCreate(OpCode):
1283 9bf56d77 Michael Hanselmann
  """Create an instance.
1284 9bf56d77 Michael Hanselmann

1285 9bf56d77 Michael Hanselmann
  @ivar instance_name: Instance name
1286 9bf56d77 Michael Hanselmann
  @ivar mode: Instance creation mode (one of L{constants.INSTANCE_CREATE_MODES})
1287 9bf56d77 Michael Hanselmann
  @ivar source_handshake: Signed handshake from source (remote import only)
1288 9bf56d77 Michael Hanselmann
  @ivar source_x509_ca: Source X509 CA in PEM format (remote import only)
1289 9bf56d77 Michael Hanselmann
  @ivar source_instance_name: Previous name of instance (remote import only)
1290 dae91d02 Michael Hanselmann
  @ivar source_shutdown_timeout: Shutdown timeout used for source instance
1291 dae91d02 Michael Hanselmann
    (remote import only)
1292 9bf56d77 Michael Hanselmann

1293 9bf56d77 Michael Hanselmann
  """
1294 60dd1473 Iustin Pop
  OP_DSC_FIELD = "instance_name"
1295 65e183af Michael Hanselmann
  OP_PARAMS = [
1296 65e183af Michael Hanselmann
    _PInstanceName,
1297 45d4c81c Michael Hanselmann
    _PForceVariant,
1298 45d4c81c Michael Hanselmann
    _PWaitForSync,
1299 45d4c81c Michael Hanselmann
    _PNameCheck,
1300 10889e0c René Nussbaumer
    _PIgnoreIpolicy,
1301 1f1188c3 Michael Hanselmann
    _POpportunisticLocking,
1302 45d4c81c Michael Hanselmann
    ("beparams", ht.EmptyDict, ht.TDict, "Backend parameters for instance"),
1303 735e1318 Michael Hanselmann
    ("disks", ht.NoDefault, ht.TListOf(_TDiskParams),
1304 526a662a Michael Hanselmann
     "Disk descriptions, for example ``[{\"%s\": 100}, {\"%s\": 5}]``;"
1305 526a662a Michael Hanselmann
     " each disk definition must contain a ``%s`` value and"
1306 526a662a Michael Hanselmann
     " can contain an optional ``%s`` value denoting the disk access mode"
1307 526a662a Michael Hanselmann
     " (%s)" %
1308 526a662a Michael Hanselmann
     (constants.IDISK_SIZE, constants.IDISK_SIZE, constants.IDISK_SIZE,
1309 526a662a Michael Hanselmann
      constants.IDISK_MODE,
1310 526a662a Michael Hanselmann
      " or ".join("``%s``" % i for i in sorted(constants.DISK_ACCESS_SET)))),
1311 45fe090b Michael Hanselmann
    ("disk_template", ht.NoDefault, _BuildDiskTemplateCheck(True),
1312 45fe090b Michael Hanselmann
     "Disk template"),
1313 fd9f58fd Iustin Pop
    ("file_driver", None, ht.TMaybe(ht.TElemOf(constants.FILE_DRIVER)),
1314 45d4c81c Michael Hanselmann
     "Driver for file-backed disks"),
1315 45d4c81c Michael Hanselmann
    ("file_storage_dir", None, ht.TMaybeString,
1316 45d4c81c Michael Hanselmann
     "Directory for storing file-backed disks"),
1317 45d4c81c Michael Hanselmann
    ("hvparams", ht.EmptyDict, ht.TDict,
1318 45d4c81c Michael Hanselmann
     "Hypervisor parameters for instance, hypervisor-dependent"),
1319 45d4c81c Michael Hanselmann
    ("hypervisor", None, ht.TMaybeString, "Hypervisor"),
1320 89514061 Iustin Pop
    _PIAllocFromDesc("Iallocator for deciding which node(s) to use"),
1321 45d4c81c Michael Hanselmann
    ("identify_defaults", False, ht.TBool,
1322 45d4c81c Michael Hanselmann
     "Reset instance parameters to default if equal"),
1323 45d4c81c Michael Hanselmann
    ("ip_check", True, ht.TBool, _PIpCheckDoc),
1324 eaa4c57c Dimitris Aragiorgis
    ("conflicts_check", True, ht.TBool, "Check for conflicting IPs"),
1325 45d4c81c Michael Hanselmann
    ("mode", ht.NoDefault, ht.TElemOf(constants.INSTANCE_CREATE_MODES),
1326 45d4c81c Michael Hanselmann
     "Instance creation mode"),
1327 526a662a Michael Hanselmann
    ("nics", ht.NoDefault, ht.TListOf(_TestNicDef),
1328 526a662a Michael Hanselmann
     "List of NIC (network interface) definitions, for example"
1329 526a662a Michael Hanselmann
     " ``[{}, {}, {\"%s\": \"198.51.100.4\"}]``; each NIC definition can"
1330 526a662a Michael Hanselmann
     " contain the optional values %s" %
1331 526a662a Michael Hanselmann
     (constants.INIC_IP,
1332 526a662a Michael Hanselmann
      ", ".join("``%s``" % i for i in sorted(constants.INIC_PARAMS)))),
1333 45d4c81c Michael Hanselmann
    ("no_install", None, ht.TMaybeBool,
1334 45d4c81c Michael Hanselmann
     "Do not install the OS (will disable automatic start)"),
1335 45d4c81c Michael Hanselmann
    ("osparams", ht.EmptyDict, ht.TDict, "OS parameters for instance"),
1336 45d4c81c Michael Hanselmann
    ("os_type", None, ht.TMaybeString, "Operating system"),
1337 45d4c81c Michael Hanselmann
    ("pnode", None, ht.TMaybeString, "Primary node"),
1338 45d4c81c Michael Hanselmann
    ("snode", None, ht.TMaybeString, "Secondary node"),
1339 fd9f58fd Iustin Pop
    ("source_handshake", None, ht.TMaybe(ht.TList),
1340 45d4c81c Michael Hanselmann
     "Signed handshake from source (remote import only)"),
1341 45d4c81c Michael Hanselmann
    ("source_instance_name", None, ht.TMaybeString,
1342 45d4c81c Michael Hanselmann
     "Source instance name (remote import only)"),
1343 65e183af Michael Hanselmann
    ("source_shutdown_timeout", constants.DEFAULT_SHUTDOWN_TIMEOUT,
1344 2c9fa1ff Iustin Pop
     ht.TNonNegativeInt,
1345 526a662a Michael Hanselmann
     "How long source instance was given to shut down (remote import only)"),
1346 45d4c81c Michael Hanselmann
    ("source_x509_ca", None, ht.TMaybeString,
1347 45d4c81c Michael Hanselmann
     "Source X509 CA in PEM format (remote import only)"),
1348 45d4c81c Michael Hanselmann
    ("src_node", None, ht.TMaybeString, "Source node for import"),
1349 45d4c81c Michael Hanselmann
    ("src_path", None, ht.TMaybeString, "Source directory for import"),
1350 45d4c81c Michael Hanselmann
    ("start", True, ht.TBool, "Whether to start instance after creation"),
1351 720f56c8 Apollon Oikonomopoulos
    ("tags", ht.EmptyList, ht.TListOf(ht.TNonEmptyString), "Instance tags"),
1352 3b6d8c9b Iustin Pop
    ]
1353 1456df62 Michael Hanselmann
  OP_RESULT = ht.Comment("instance nodes")(ht.TListOf(ht.TNonEmptyString))
1354 a8083063 Iustin Pop
1355 a8083063 Iustin Pop
1356 12e62af5 René Nussbaumer
class OpInstanceMultiAlloc(OpCode):
1357 12e62af5 René Nussbaumer
  """Allocates multiple instances.
1358 12e62af5 René Nussbaumer

1359 12e62af5 René Nussbaumer
  """
1360 12e62af5 René Nussbaumer
  OP_PARAMS = [
1361 1f1188c3 Michael Hanselmann
    _POpportunisticLocking,
1362 89514061 Iustin Pop
    _PIAllocFromDesc("Iallocator used to allocate all the instances"),
1363 4c405df7 Iustin Pop
    ("instances", ht.EmptyList, ht.TListOf(ht.TInstanceOf(OpInstanceCreate)),
1364 12e62af5 René Nussbaumer
     "List of instance create opcodes describing the instances to allocate"),
1365 12e62af5 René Nussbaumer
    ]
1366 12e62af5 René Nussbaumer
  _JOB_LIST = ht.Comment("List of submitted jobs")(TJobIdList)
1367 12e62af5 René Nussbaumer
  ALLOCATABLE_KEY = "allocatable"
1368 12e62af5 René Nussbaumer
  FAILED_KEY = "allocatable"
1369 12e62af5 René Nussbaumer
  OP_RESULT = ht.TStrictDict(True, True, {
1370 12e62af5 René Nussbaumer
    constants.JOB_IDS_KEY: _JOB_LIST,
1371 12e62af5 René Nussbaumer
    ALLOCATABLE_KEY: ht.TListOf(ht.TNonEmptyString),
1372 3c286190 Dimitris Aragiorgis
    FAILED_KEY: ht.TListOf(ht.TNonEmptyString),
1373 12e62af5 René Nussbaumer
    })
1374 12e62af5 René Nussbaumer
1375 12e62af5 René Nussbaumer
  def __getstate__(self):
1376 12e62af5 René Nussbaumer
    """Generic serializer.
1377 12e62af5 René Nussbaumer

1378 12e62af5 René Nussbaumer
    """
1379 12e62af5 René Nussbaumer
    state = OpCode.__getstate__(self)
1380 12e62af5 René Nussbaumer
    if hasattr(self, "instances"):
1381 12e62af5 René Nussbaumer
      # pylint: disable=E1101
1382 12e62af5 René Nussbaumer
      state["instances"] = [inst.__getstate__() for inst in self.instances]
1383 12e62af5 René Nussbaumer
    return state
1384 12e62af5 René Nussbaumer
1385 12e62af5 René Nussbaumer
  def __setstate__(self, state):
1386 12e62af5 René Nussbaumer
    """Generic unserializer.
1387 12e62af5 René Nussbaumer

1388 12e62af5 René Nussbaumer
    This method just restores from the serialized state the attributes
1389 12e62af5 René Nussbaumer
    of the current instance.
1390 12e62af5 René Nussbaumer

1391 12e62af5 René Nussbaumer
    @param state: the serialized opcode data
1392 12e62af5 René Nussbaumer
    @type state: C{dict}
1393 12e62af5 René Nussbaumer

1394 12e62af5 René Nussbaumer
    """
1395 12e62af5 René Nussbaumer
    if not isinstance(state, dict):
1396 12e62af5 René Nussbaumer
      raise ValueError("Invalid data to __setstate__: expected dict, got %s" %
1397 12e62af5 René Nussbaumer
                       type(state))
1398 12e62af5 René Nussbaumer
1399 12e62af5 René Nussbaumer
    if "instances" in state:
1400 5dff65da Michael Hanselmann
      state["instances"] = map(OpCode.LoadOpCode, state["instances"])
1401 5dff65da Michael Hanselmann
1402 12e62af5 René Nussbaumer
    return OpCode.__setstate__(self, state)
1403 12e62af5 René Nussbaumer
1404 9bc5ac44 René Nussbaumer
  def Validate(self, set_defaults):
1405 9bc5ac44 René Nussbaumer
    """Validates this opcode.
1406 9bc5ac44 René Nussbaumer

1407 9bc5ac44 René Nussbaumer
    We do this recursively.
1408 9bc5ac44 René Nussbaumer

1409 9bc5ac44 René Nussbaumer
    """
1410 9bc5ac44 René Nussbaumer
    OpCode.Validate(self, set_defaults)
1411 9bc5ac44 René Nussbaumer
1412 3779121c René Nussbaumer
    for inst in self.instances: # pylint: disable=E1101
1413 9bc5ac44 René Nussbaumer
      inst.Validate(set_defaults)
1414 9bc5ac44 René Nussbaumer
1415 12e62af5 René Nussbaumer
1416 5073fd8f Iustin Pop
class OpInstanceReinstall(OpCode):
1417 fdc267f4 Iustin Pop
  """Reinstall an instance's OS."""
1418 60dd1473 Iustin Pop
  OP_DSC_FIELD = "instance_name"
1419 65e183af Michael Hanselmann
  OP_PARAMS = [
1420 65e183af Michael Hanselmann
    _PInstanceName,
1421 45d4c81c Michael Hanselmann
    _PForceVariant,
1422 45d4c81c Michael Hanselmann
    ("os_type", None, ht.TMaybeString, "Instance operating system"),
1423 45d4c81c Michael Hanselmann
    ("osparams", None, ht.TMaybeDict, "Temporary OS parameters"),
1424 65e183af Michael Hanselmann
    ]
1425 c363310d René Nussbaumer
  OP_RESULT = ht.TNone
1426 fe7b0351 Michael Hanselmann
1427 fe7b0351 Michael Hanselmann
1428 06c2fb4a Dimitris Aragiorgis
class OpInstanceSnapshot(OpCode):
1429 06c2fb4a Dimitris Aragiorgis
  """Snapshot an instance."""
1430 06c2fb4a Dimitris Aragiorgis
  OP_DSC_FIELD = "instance_name"
1431 06c2fb4a Dimitris Aragiorgis
  OP_PARAMS = [
1432 06c2fb4a Dimitris Aragiorgis
    _PInstanceName,
1433 06c2fb4a Dimitris Aragiorgis
    ("disks", ht.EmptyList,
1434 06c2fb4a Dimitris Aragiorgis
     ht.TListOf(ht.TItems([ht.TOr(ht.TInt, ht.TString),
1435 06c2fb4a Dimitris Aragiorgis
                           ht.TDictOf(ht.TElemOf([
1436 06c2fb4a Dimitris Aragiorgis
                                      constants.IDISK_SNAPSHOT_NAME]),
1437 06c2fb4a Dimitris Aragiorgis
                                      ht.TNonEmptyString)
1438 06c2fb4a Dimitris Aragiorgis
                          ])),
1439 06c2fb4a Dimitris Aragiorgis
    "Disks to snapshot"),
1440 06c2fb4a Dimitris Aragiorgis
    ]
1441 06c2fb4a Dimitris Aragiorgis
  OP_RESULT = ht.TNone
1442 06c2fb4a Dimitris Aragiorgis
1443 06c2fb4a Dimitris Aragiorgis
1444 3cd2d4b1 Iustin Pop
class OpInstanceRemove(OpCode):
1445 a8083063 Iustin Pop
  """Remove an instance."""
1446 60dd1473 Iustin Pop
  OP_DSC_FIELD = "instance_name"
1447 65e183af Michael Hanselmann
  OP_PARAMS = [
1448 65e183af Michael Hanselmann
    _PInstanceName,
1449 65e183af Michael Hanselmann
    _PShutdownTimeout,
1450 45d4c81c Michael Hanselmann
    ("ignore_failures", False, ht.TBool,
1451 45d4c81c Michael Hanselmann
     "Whether to ignore failures during removal"),
1452 fc1baca9 Michael Hanselmann
    ]
1453 c363310d René Nussbaumer
  OP_RESULT = ht.TNone
1454 a8083063 Iustin Pop
1455 a8083063 Iustin Pop
1456 5659e2e2 Iustin Pop
class OpInstanceRename(OpCode):
1457 decd5f45 Iustin Pop
  """Rename an instance."""
1458 65e183af Michael Hanselmann
  OP_PARAMS = [
1459 65e183af Michael Hanselmann
    _PInstanceName,
1460 45d4c81c Michael Hanselmann
    _PNameCheck,
1461 45d4c81c Michael Hanselmann
    ("new_name", ht.NoDefault, ht.TNonEmptyString, "New instance name"),
1462 45d4c81c Michael Hanselmann
    ("ip_check", False, ht.TBool, _PIpCheckDoc),
1463 4f05fd3b Iustin Pop
    ]
1464 1456df62 Michael Hanselmann
  OP_RESULT = ht.Comment("New instance name")(ht.TNonEmptyString)
1465 decd5f45 Iustin Pop
1466 decd5f45 Iustin Pop
1467 c873d91c Iustin Pop
class OpInstanceStartup(OpCode):
1468 fdc267f4 Iustin Pop
  """Startup an instance."""
1469 60dd1473 Iustin Pop
  OP_DSC_FIELD = "instance_name"
1470 65e183af Michael Hanselmann
  OP_PARAMS = [
1471 65e183af Michael Hanselmann
    _PInstanceName,
1472 65e183af Michael Hanselmann
    _PForce,
1473 65e183af Michael Hanselmann
    _PIgnoreOfflineNodes,
1474 45d4c81c Michael Hanselmann
    ("hvparams", ht.EmptyDict, ht.TDict,
1475 45d4c81c Michael Hanselmann
     "Temporary hypervisor parameters, hypervisor-dependent"),
1476 45d4c81c Michael Hanselmann
    ("beparams", ht.EmptyDict, ht.TDict, "Temporary backend parameters"),
1477 9b64e486 Iustin Pop
    _PNoRemember,
1478 323f9095 Stephen Shirley
    _PStartupPaused,
1479 4f05fd3b Iustin Pop
    ]
1480 c363310d René Nussbaumer
  OP_RESULT = ht.TNone
1481 a8083063 Iustin Pop
1482 a8083063 Iustin Pop
1483 ee3e37a7 Iustin Pop
class OpInstanceShutdown(OpCode):
1484 fdc267f4 Iustin Pop
  """Shutdown an instance."""
1485 60dd1473 Iustin Pop
  OP_DSC_FIELD = "instance_name"
1486 65e183af Michael Hanselmann
  OP_PARAMS = [
1487 65e183af Michael Hanselmann
    _PInstanceName,
1488 0d57ce24 Guido Trotter
    _PForce,
1489 65e183af Michael Hanselmann
    _PIgnoreOfflineNodes,
1490 2c9fa1ff Iustin Pop
    ("timeout", constants.DEFAULT_SHUTDOWN_TIMEOUT, ht.TNonNegativeInt,
1491 45d4c81c Michael Hanselmann
     "How long to wait for instance to shut down"),
1492 9b64e486 Iustin Pop
    _PNoRemember,
1493 b44bd844 Michael Hanselmann
    ]
1494 c363310d René Nussbaumer
  OP_RESULT = ht.TNone
1495 a8083063 Iustin Pop
1496 a8083063 Iustin Pop
1497 90ab1a95 Iustin Pop
class OpInstanceReboot(OpCode):
1498 bf6929a2 Alexander Schreiber
  """Reboot an instance."""
1499 60dd1473 Iustin Pop
  OP_DSC_FIELD = "instance_name"
1500 65e183af Michael Hanselmann
  OP_PARAMS = [
1501 65e183af Michael Hanselmann
    _PInstanceName,
1502 65e183af Michael Hanselmann
    _PShutdownTimeout,
1503 45d4c81c Michael Hanselmann
    ("ignore_secondaries", False, ht.TBool,
1504 45d4c81c Michael Hanselmann
     "Whether to start the instance even if secondary disks are failing"),
1505 45d4c81c Michael Hanselmann
    ("reboot_type", ht.NoDefault, ht.TElemOf(constants.REBOOT_TYPES),
1506 45d4c81c Michael Hanselmann
     "How to reboot instance"),
1507 4f05fd3b Iustin Pop
    ]
1508 c363310d René Nussbaumer
  OP_RESULT = ht.TNone
1509 bf6929a2 Alexander Schreiber
1510 bf6929a2 Alexander Schreiber
1511 668f755d Iustin Pop
class OpInstanceReplaceDisks(OpCode):
1512 fdc267f4 Iustin Pop
  """Replace the disks of an instance."""
1513 60dd1473 Iustin Pop
  OP_DSC_FIELD = "instance_name"
1514 65e183af Michael Hanselmann
  OP_PARAMS = [
1515 65e183af Michael Hanselmann
    _PInstanceName,
1516 e1f23243 Michael Hanselmann
    _PEarlyRelease,
1517 d2fe2bfb René Nussbaumer
    _PIgnoreIpolicy,
1518 45d4c81c Michael Hanselmann
    ("mode", ht.NoDefault, ht.TElemOf(constants.REPLACE_MODES),
1519 45d4c81c Michael Hanselmann
     "Replacement mode"),
1520 2c9fa1ff Iustin Pop
    ("disks", ht.EmptyList, ht.TListOf(ht.TNonNegativeInt),
1521 45d4c81c Michael Hanselmann
     "Disk indexes"),
1522 45d4c81c Michael Hanselmann
    ("remote_node", None, ht.TMaybeString, "New secondary node"),
1523 89514061 Iustin Pop
    _PIAllocFromDesc("Iallocator for deciding new secondary node"),
1524 4f05fd3b Iustin Pop
    ]
1525 c363310d René Nussbaumer
  OP_RESULT = ht.TNone
1526 a8083063 Iustin Pop
1527 a8083063 Iustin Pop
1528 019dbee1 Iustin Pop
class OpInstanceFailover(OpCode):
1529 a8083063 Iustin Pop
  """Failover an instance."""
1530 60dd1473 Iustin Pop
  OP_DSC_FIELD = "instance_name"
1531 65e183af Michael Hanselmann
  OP_PARAMS = [
1532 65e183af Michael Hanselmann
    _PInstanceName,
1533 65e183af Michael Hanselmann
    _PShutdownTimeout,
1534 45d4c81c Michael Hanselmann
    _PIgnoreConsistency,
1535 f8fa4175 Michael Hanselmann
    _PMigrationTargetNode,
1536 b6aaf437 René Nussbaumer
    _PIgnoreIpolicy,
1537 89514061 Iustin Pop
    _PIAllocFromDesc("Iallocator for deciding the target node for"
1538 89514061 Iustin Pop
                     " shared-storage instances"),
1539 aa7a5c90 Michele Tartara
    ("cleanup", False, ht.TBool,
1540 aa7a5c90 Michele Tartara
     "Whether a previously failed failover should be cleaned up"),
1541 17c3f802 Guido Trotter
    ]
1542 c363310d René Nussbaumer
  OP_RESULT = ht.TNone
1543 a8083063 Iustin Pop
1544 a8083063 Iustin Pop
1545 75c866c2 Iustin Pop
class OpInstanceMigrate(OpCode):
1546 53c776b5 Iustin Pop
  """Migrate an instance.
1547 53c776b5 Iustin Pop

1548 53c776b5 Iustin Pop
  This migrates (without shutting down an instance) to its secondary
1549 53c776b5 Iustin Pop
  node.
1550 53c776b5 Iustin Pop

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

1554 53c776b5 Iustin Pop
  """
1555 ee69c97f Iustin Pop
  OP_DSC_FIELD = "instance_name"
1556 65e183af Michael Hanselmann
  OP_PARAMS = [
1557 65e183af Michael Hanselmann
    _PInstanceName,
1558 65e183af Michael Hanselmann
    _PMigrationMode,
1559 65e183af Michael Hanselmann
    _PMigrationLive,
1560 f8fa4175 Michael Hanselmann
    _PMigrationTargetNode,
1561 8c0b16f6 Guido Trotter
    _PAllowRuntimeChgs,
1562 3ed23330 René Nussbaumer
    _PIgnoreIpolicy,
1563 45d4c81c Michael Hanselmann
    ("cleanup", False, ht.TBool,
1564 45d4c81c Michael Hanselmann
     "Whether a previously failed migration should be cleaned up"),
1565 89514061 Iustin Pop
    _PIAllocFromDesc("Iallocator for deciding the target node for"
1566 89514061 Iustin Pop
                     " shared-storage instances"),
1567 d5cafd31 René Nussbaumer
    ("allow_failover", False, ht.TBool,
1568 d5cafd31 René Nussbaumer
     "Whether we can fallback to failover if migration is not possible"),
1569 65e183af Michael Hanselmann
    ]
1570 c363310d René Nussbaumer
  OP_RESULT = ht.TNone
1571 53c776b5 Iustin Pop
1572 53c776b5 Iustin Pop
1573 0091b480 Iustin Pop
class OpInstanceMove(OpCode):
1574 313bcead Iustin Pop
  """Move an instance.
1575 313bcead Iustin Pop

1576 313bcead Iustin Pop
  This move (with shutting down an instance and data copying) to an
1577 313bcead Iustin Pop
  arbitrary node.
1578 313bcead Iustin Pop

1579 313bcead Iustin Pop
  @ivar instance_name: the name of the instance
1580 313bcead Iustin Pop
  @ivar target_node: the destination node
1581 313bcead Iustin Pop

1582 313bcead Iustin Pop
  """
1583 313bcead Iustin Pop
  OP_DSC_FIELD = "instance_name"
1584 65e183af Michael Hanselmann
  OP_PARAMS = [
1585 65e183af Michael Hanselmann
    _PInstanceName,
1586 65e183af Michael Hanselmann
    _PShutdownTimeout,
1587 92cf62e3 René Nussbaumer
    _PIgnoreIpolicy,
1588 45d4c81c Michael Hanselmann
    ("target_node", ht.NoDefault, ht.TNonEmptyString, "Target node"),
1589 bb851c63 Iustin Pop
    _PIgnoreConsistency,
1590 154b9580 Balazs Lecz
    ]
1591 c363310d René Nussbaumer
  OP_RESULT = ht.TNone
1592 313bcead Iustin Pop
1593 313bcead Iustin Pop
1594 cc0dec7b Iustin Pop
class OpInstanceConsole(OpCode):
1595 fdc267f4 Iustin Pop
  """Connect to an instance's console."""
1596 60dd1473 Iustin Pop
  OP_DSC_FIELD = "instance_name"
1597 65e183af Michael Hanselmann
  OP_PARAMS = [
1598 3c286190 Dimitris Aragiorgis
    _PInstanceName,
1599 65e183af Michael Hanselmann
    ]
1600 c363310d René Nussbaumer
  OP_RESULT = ht.TDict
1601 a8083063 Iustin Pop
1602 a8083063 Iustin Pop
1603 83f5d475 Iustin Pop
class OpInstanceActivateDisks(OpCode):
1604 fdc267f4 Iustin Pop
  """Activate an instance's disks."""
1605 60dd1473 Iustin Pop
  OP_DSC_FIELD = "instance_name"
1606 65e183af Michael Hanselmann
  OP_PARAMS = [
1607 65e183af Michael Hanselmann
    _PInstanceName,
1608 45d4c81c Michael Hanselmann
    ("ignore_size", False, ht.TBool, "Whether to ignore recorded size"),
1609 b69437c5 Iustin Pop
    _PWaitForSyncFalse,
1610 65e183af Michael Hanselmann
    ]
1611 c363310d René Nussbaumer
  OP_RESULT = ht.TListOf(ht.TAnd(ht.TIsLength(3),
1612 c363310d René Nussbaumer
                                 ht.TItems([ht.TNonEmptyString,
1613 c363310d René Nussbaumer
                                            ht.TNonEmptyString,
1614 c363310d René Nussbaumer
                                            ht.TNonEmptyString])))
1615 a8083063 Iustin Pop
1616 a8083063 Iustin Pop
1617 e176281f Iustin Pop
class OpInstanceDeactivateDisks(OpCode):
1618 fdc267f4 Iustin Pop
  """Deactivate an instance's disks."""
1619 60dd1473 Iustin Pop
  OP_DSC_FIELD = "instance_name"
1620 65e183af Michael Hanselmann
  OP_PARAMS = [
1621 c9c41373 Iustin Pop
    _PInstanceName,
1622 c9c41373 Iustin Pop
    _PForce,
1623 65e183af Michael Hanselmann
    ]
1624 c363310d René Nussbaumer
  OP_RESULT = ht.TNone
1625 a8083063 Iustin Pop
1626 a8083063 Iustin Pop
1627 6b273e78 Iustin Pop
class OpInstanceRecreateDisks(OpCode):
1628 a52978c7 Michael Hanselmann
  """Recreate an instance's disks."""
1629 735e1318 Michael Hanselmann
  _TDiskChanges = \
1630 735e1318 Michael Hanselmann
    ht.TAnd(ht.TIsLength(2),
1631 2c9fa1ff Iustin Pop
            ht.TItems([ht.Comment("Disk index")(ht.TNonNegativeInt),
1632 735e1318 Michael Hanselmann
                       ht.Comment("Parameters")(_TDiskParams)]))
1633 735e1318 Michael Hanselmann
1634 bd315bfa Iustin Pop
  OP_DSC_FIELD = "instance_name"
1635 65e183af Michael Hanselmann
  OP_PARAMS = [
1636 65e183af Michael Hanselmann
    _PInstanceName,
1637 735e1318 Michael Hanselmann
    ("disks", ht.EmptyList,
1638 2c9fa1ff Iustin Pop
     ht.TOr(ht.TListOf(ht.TNonNegativeInt), ht.TListOf(_TDiskChanges)),
1639 735e1318 Michael Hanselmann
     "List of disk indexes (deprecated) or a list of tuples containing a disk"
1640 735e1318 Michael Hanselmann
     " index and a possibly empty dictionary with disk parameter changes"),
1641 93384b8c Guido Trotter
    ("nodes", ht.EmptyList, ht.TListOf(ht.TNonEmptyString),
1642 93384b8c Guido Trotter
     "New instance nodes, if relocation is desired"),
1643 89514061 Iustin Pop
    _PIAllocFromDesc("Iallocator for deciding new nodes"),
1644 65e183af Michael Hanselmann
    ]
1645 c363310d René Nussbaumer
  OP_RESULT = ht.TNone
1646 bd315bfa Iustin Pop
1647 bd315bfa Iustin Pop
1648 f2af0bec Iustin Pop
class OpInstanceQuery(OpCode):
1649 a8083063 Iustin Pop
  """Compute the list of instances."""
1650 65e183af Michael Hanselmann
  OP_PARAMS = [
1651 65e183af Michael Hanselmann
    _POutputFields,
1652 45d4c81c Michael Hanselmann
    _PUseLocking,
1653 45d4c81c Michael Hanselmann
    ("names", ht.EmptyList, ht.TListOf(ht.TNonEmptyString),
1654 45d4c81c Michael Hanselmann
     "Empty list to query all instances, instance names otherwise"),
1655 65e183af Michael Hanselmann
    ]
1656 415feb2e René Nussbaumer
  OP_RESULT = _TOldQueryResult
1657 a8083063 Iustin Pop
1658 a8083063 Iustin Pop
1659 dc28c4e4 Iustin Pop
class OpInstanceQueryData(OpCode):
1660 a8083063 Iustin Pop
  """Compute the run-time status of instances."""
1661 65e183af Michael Hanselmann
  OP_PARAMS = [
1662 af7b6689 Michael Hanselmann
    _PUseLocking,
1663 af7b6689 Michael Hanselmann
    ("instances", ht.EmptyList, ht.TListOf(ht.TNonEmptyString),
1664 af7b6689 Michael Hanselmann
     "Instance names"),
1665 af7b6689 Michael Hanselmann
    ("static", False, ht.TBool,
1666 af7b6689 Michael Hanselmann
     "Whether to only return configuration data without querying"
1667 af7b6689 Michael Hanselmann
     " nodes"),
1668 65e183af Michael Hanselmann
    ]
1669 415feb2e René Nussbaumer
  OP_RESULT = ht.TDictOf(ht.TNonEmptyString, ht.TDict)
1670 a8083063 Iustin Pop
1671 a8083063 Iustin Pop
1672 ddc1de7c Michael Hanselmann
def _TestInstSetParamsModList(fn):
1673 ddc1de7c Michael Hanselmann
  """Generates a check for modification lists.
1674 ddc1de7c Michael Hanselmann

1675 ddc1de7c Michael Hanselmann
  """
1676 e9c3d864 Michael Hanselmann
  # Old format
1677 e9c3d864 Michael Hanselmann
  # TODO: Remove in version 2.8 including support in LUInstanceSetParams
1678 e9c3d864 Michael Hanselmann
  old_mod_item_fn = \
1679 ddc1de7c Michael Hanselmann
    ht.TAnd(ht.TIsLength(2), ht.TItems([
1680 2c9fa1ff Iustin Pop
      ht.TOr(ht.TElemOf(constants.DDMS_VALUES), ht.TNonNegativeInt),
1681 ddc1de7c Michael Hanselmann
      fn,
1682 ddc1de7c Michael Hanselmann
      ]))
1683 ddc1de7c Michael Hanselmann
1684 e9c3d864 Michael Hanselmann
  # New format, supporting adding/removing disks/NICs at arbitrary indices
1685 e9c3d864 Michael Hanselmann
  mod_item_fn = \
1686 e9c3d864 Michael Hanselmann
    ht.TAnd(ht.TIsLength(3), ht.TItems([
1687 e9c3d864 Michael Hanselmann
      ht.TElemOf(constants.DDMS_VALUES_WITH_MODIFY),
1688 b21d488b Christos Stavrakakis
      ht.Comment("Device index, can be negative, e.g. -1 for last disk")
1689 b21d488b Christos Stavrakakis
                 (ht.TOr(ht.TInt, ht.TString)),
1690 e9c3d864 Michael Hanselmann
      fn,
1691 e9c3d864 Michael Hanselmann
      ]))
1692 e9c3d864 Michael Hanselmann
1693 e9c3d864 Michael Hanselmann
  return ht.TOr(ht.Comment("Recommended")(ht.TListOf(mod_item_fn)),
1694 e9c3d864 Michael Hanselmann
                ht.Comment("Deprecated")(ht.TListOf(old_mod_item_fn)))
1695 ddc1de7c Michael Hanselmann
1696 ddc1de7c Michael Hanselmann
1697 9a3cc7ae Iustin Pop
class OpInstanceSetParams(OpCode):
1698 ddc1de7c Michael Hanselmann
  """Change the parameters of an instance.
1699 ddc1de7c Michael Hanselmann

1700 ddc1de7c Michael Hanselmann
  """
1701 a2aadb34 Michael Hanselmann
  TestNicModifications = _TestInstSetParamsModList(_TestNicDef)
1702 a2aadb34 Michael Hanselmann
  TestDiskModifications = _TestInstSetParamsModList(_TDiskParams)
1703 ddc1de7c Michael Hanselmann
1704 60dd1473 Iustin Pop
  OP_DSC_FIELD = "instance_name"
1705 65e183af Michael Hanselmann
  OP_PARAMS = [
1706 65e183af Michael Hanselmann
    _PInstanceName,
1707 65e183af Michael Hanselmann
    _PForce,
1708 45d4c81c Michael Hanselmann
    _PForceVariant,
1709 1559e1e7 René Nussbaumer
    _PIgnoreIpolicy,
1710 a2aadb34 Michael Hanselmann
    ("nics", ht.EmptyList, TestNicModifications,
1711 b21d488b Christos Stavrakakis
     "List of NIC changes: each item is of the form"
1712 b21d488b Christos Stavrakakis
     " ``(op, identifier, settings)``, ``op`` is one of ``%s``, ``%s`` or"
1713 b21d488b Christos Stavrakakis
     " ``%s``, ``identifier`` can be a zero-based index number (or -1 to refer"
1714 b21d488b Christos Stavrakakis
     " to the last position), the NIC's UUID of the NIC's name; a"
1715 0fb66bb1 Iustin Pop
     " deprecated version of this parameter used the form ``(op, settings)``,"
1716 0fb66bb1 Iustin Pop
     " where ``op`` can be ``%s`` to add a new NIC with the specified"
1717 0fb66bb1 Iustin Pop
     " settings, ``%s`` to remove the last NIC or a number to modify the"
1718 0fb66bb1 Iustin Pop
     " settings of the NIC with that index" %
1719 e9c3d864 Michael Hanselmann
     (constants.DDM_ADD, constants.DDM_MODIFY, constants.DDM_REMOVE,
1720 e9c3d864 Michael Hanselmann
      constants.DDM_ADD, constants.DDM_REMOVE)),
1721 a2aadb34 Michael Hanselmann
    ("disks", ht.EmptyList, TestDiskModifications,
1722 0fb66bb1 Iustin Pop
     "List of disk changes; see ``nics``"),
1723 45d4c81c Michael Hanselmann
    ("beparams", ht.EmptyDict, ht.TDict, "Per-instance backend parameters"),
1724 2c9fa1ff Iustin Pop
    ("runtime_mem", None, ht.TMaybePositiveInt, "New runtime memory"),
1725 45d4c81c Michael Hanselmann
    ("hvparams", ht.EmptyDict, ht.TDict,
1726 45d4c81c Michael Hanselmann
     "Per-instance hypervisor parameters, hypervisor-dependent"),
1727 fd9f58fd Iustin Pop
    ("disk_template", None, ht.TMaybe(_BuildDiskTemplateCheck(False)),
1728 45d4c81c Michael Hanselmann
     "Disk template for instance"),
1729 d2204b1a Klaus Aehlig
    ("pnode", None, ht.TMaybeString, "New primary node"),
1730 45d4c81c Michael Hanselmann
    ("remote_node", None, ht.TMaybeString,
1731 45d4c81c Michael Hanselmann
     "Secondary node (used when changing disk template)"),
1732 45d4c81c Michael Hanselmann
    ("os_name", None, ht.TMaybeString,
1733 0fb66bb1 Iustin Pop
     "Change the instance's OS without reinstalling the instance"),
1734 45d4c81c Michael Hanselmann
    ("osparams", None, ht.TMaybeDict, "Per-instance OS parameters"),
1735 93384b8c Guido Trotter
    ("wait_for_sync", True, ht.TBool,
1736 93384b8c Guido Trotter
     "Whether to wait for the disk to synchronize, when changing template"),
1737 3016bc1f Michael Hanselmann
    ("offline", None, ht.TMaybeBool, "Whether to mark instance as offline"),
1738 eaa4c57c Dimitris Aragiorgis
    ("conflicts_check", True, ht.TBool, "Check for conflicting IPs"),
1739 8e1c6109 Dimitris Aragiorgis
    ("hotplug", False, ht.TBool, "Whether to hotplug device"),
1740 8e1c6109 Dimitris Aragiorgis
    ("hotplug_if_possible", False, ht.TBool, "If possible then hotplug device"),
1741 973d7867 Iustin Pop
    ]
1742 1456df62 Michael Hanselmann
  OP_RESULT = _TSetParamsResult
1743 a8083063 Iustin Pop
1744 a8083063 Iustin Pop
1745 60472d29 Iustin Pop
class OpInstanceGrowDisk(OpCode):
1746 8729e0d7 Iustin Pop
  """Grow a disk of an instance."""
1747 60dd1473 Iustin Pop
  OP_DSC_FIELD = "instance_name"
1748 65e183af Michael Hanselmann
  OP_PARAMS = [
1749 65e183af Michael Hanselmann
    _PInstanceName,
1750 45d4c81c Michael Hanselmann
    _PWaitForSync,
1751 45d4c81c Michael Hanselmann
    ("disk", ht.NoDefault, ht.TInt, "Disk index"),
1752 2c9fa1ff Iustin Pop
    ("amount", ht.NoDefault, ht.TNonNegativeInt,
1753 45d4c81c Michael Hanselmann
     "Amount of disk space to add (megabytes)"),
1754 e7f99087 Iustin Pop
    ("absolute", False, ht.TBool,
1755 e7f99087 Iustin Pop
     "Whether the amount parameter is an absolute target or a relative one"),
1756 4f05fd3b Iustin Pop
    ]
1757 c363310d René Nussbaumer
  OP_RESULT = ht.TNone
1758 8729e0d7 Iustin Pop
1759 8729e0d7 Iustin Pop
1760 1aef3df8 Michael Hanselmann
class OpInstanceChangeGroup(OpCode):
1761 1aef3df8 Michael Hanselmann
  """Moves an instance to another node group."""
1762 1aef3df8 Michael Hanselmann
  OP_DSC_FIELD = "instance_name"
1763 1aef3df8 Michael Hanselmann
  OP_PARAMS = [
1764 1aef3df8 Michael Hanselmann
    _PInstanceName,
1765 1aef3df8 Michael Hanselmann
    _PEarlyRelease,
1766 89514061 Iustin Pop
    _PIAllocFromDesc("Iallocator for computing solution"),
1767 911ee606 Michael Hanselmann
    _PTargetGroups,
1768 1aef3df8 Michael Hanselmann
    ]
1769 1456df62 Michael Hanselmann
  OP_RESULT = TJobIdListOnly
1770 1aef3df8 Michael Hanselmann
1771 1aef3df8 Michael Hanselmann
1772 70a6a926 Adeodato Simo
# Node group opcodes
1773 70a6a926 Adeodato Simo
1774 fabf1731 Iustin Pop
class OpGroupAdd(OpCode):
1775 b1ee5610 Adeodato Simo
  """Add a node group to the cluster."""
1776 b1ee5610 Adeodato Simo
  OP_DSC_FIELD = "group_name"
1777 65e183af Michael Hanselmann
  OP_PARAMS = [
1778 65e183af Michael Hanselmann
    _PGroupName,
1779 45d4c81c Michael Hanselmann
    _PNodeGroupAllocPolicy,
1780 45d4c81c Michael Hanselmann
    _PGroupNodeParams,
1781 bc5d0215 Andrea Spadaccini
    _PDiskParams,
1782 e4c03256 René Nussbaumer
    _PHvState,
1783 e4c03256 René Nussbaumer
    _PDiskState,
1784 1b01390b René Nussbaumer
    ("ipolicy", None, ht.TMaybeDict,
1785 1b01390b René Nussbaumer
     "Group-wide :ref:`instance policy <rapi-ipolicy>` specs"),
1786 483be60d Adeodato Simo
    ]
1787 c363310d René Nussbaumer
  OP_RESULT = ht.TNone
1788 b1ee5610 Adeodato Simo
1789 b1ee5610 Adeodato Simo
1790 934704ae Iustin Pop
class OpGroupAssignNodes(OpCode):
1791 96276ae7 Adeodato Simo
  """Assign nodes to a node group."""
1792 96276ae7 Adeodato Simo
  OP_DSC_FIELD = "group_name"
1793 96276ae7 Adeodato Simo
  OP_PARAMS = [
1794 96276ae7 Adeodato Simo
    _PGroupName,
1795 96276ae7 Adeodato Simo
    _PForce,
1796 45d4c81c Michael Hanselmann
    ("nodes", ht.NoDefault, ht.TListOf(ht.TNonEmptyString),
1797 45d4c81c Michael Hanselmann
     "List of nodes to assign"),
1798 96276ae7 Adeodato Simo
    ]
1799 c363310d René Nussbaumer
  OP_RESULT = ht.TNone
1800 96276ae7 Adeodato Simo
1801 96276ae7 Adeodato Simo
1802 d4d654bd Iustin Pop
class OpGroupQuery(OpCode):
1803 70a6a926 Adeodato Simo
  """Compute the list of node groups."""
1804 65e183af Michael Hanselmann
  OP_PARAMS = [
1805 65e183af Michael Hanselmann
    _POutputFields,
1806 45d4c81c Michael Hanselmann
    ("names", ht.EmptyList, ht.TListOf(ht.TNonEmptyString),
1807 45d4c81c Michael Hanselmann
     "Empty list to query all groups, group names otherwise"),
1808 65e183af Michael Hanselmann
    ]
1809 415feb2e René Nussbaumer
  OP_RESULT = _TOldQueryResult
1810 70a6a926 Adeodato Simo
1811 70a6a926 Adeodato Simo
1812 7cbf74f0 Iustin Pop
class OpGroupSetParams(OpCode):
1813 4da7909a Adeodato Simo
  """Change the parameters of a node group."""
1814 4da7909a Adeodato Simo
  OP_DSC_FIELD = "group_name"
1815 65e183af Michael Hanselmann
  OP_PARAMS = [
1816 65e183af Michael Hanselmann
    _PGroupName,
1817 45d4c81c Michael Hanselmann
    _PNodeGroupAllocPolicy,
1818 45d4c81c Michael Hanselmann
    _PGroupNodeParams,
1819 bc5d0215 Andrea Spadaccini
    _PDiskParams,
1820 a8282327 René Nussbaumer
    _PHvState,
1821 a8282327 René Nussbaumer
    _PDiskState,
1822 fb644e77 Agata Murawska
    ("ipolicy", None, ht.TMaybeDict, "Group-wide instance policy specs"),
1823 4da7909a Adeodato Simo
    ]
1824 1456df62 Michael Hanselmann
  OP_RESULT = _TSetParamsResult
1825 4da7909a Adeodato Simo
1826 4da7909a Adeodato Simo
1827 4d1baa51 Iustin Pop
class OpGroupRemove(OpCode):
1828 94bd652a Adeodato Simo
  """Remove a node group from the cluster."""
1829 94bd652a Adeodato Simo
  OP_DSC_FIELD = "group_name"
1830 65e183af Michael Hanselmann
  OP_PARAMS = [
1831 65e183af Michael Hanselmann
    _PGroupName,
1832 65e183af Michael Hanselmann
    ]
1833 c363310d René Nussbaumer
  OP_RESULT = ht.TNone
1834 94bd652a Adeodato Simo
1835 94bd652a Adeodato Simo
1836 a8173e82 Iustin Pop
class OpGroupRename(OpCode):
1837 4fe5cf90 Adeodato Simo
  """Rename a node group in the cluster."""
1838 65e183af Michael Hanselmann
  OP_PARAMS = [
1839 12da663a Michael Hanselmann
    _PGroupName,
1840 12da663a Michael Hanselmann
    ("new_name", ht.NoDefault, ht.TNonEmptyString, "New group name"),
1841 65e183af Michael Hanselmann
    ]
1842 1456df62 Michael Hanselmann
  OP_RESULT = ht.Comment("New group name")(ht.TNonEmptyString)
1843 4fe5cf90 Adeodato Simo
1844 4fe5cf90 Adeodato Simo
1845 08f8c82c Michael Hanselmann
class OpGroupEvacuate(OpCode):
1846 08f8c82c Michael Hanselmann
  """Evacuate a node group in the cluster."""
1847 08f8c82c Michael Hanselmann
  OP_DSC_FIELD = "group_name"
1848 08f8c82c Michael Hanselmann
  OP_PARAMS = [
1849 08f8c82c Michael Hanselmann
    _PGroupName,
1850 08f8c82c Michael Hanselmann
    _PEarlyRelease,
1851 89514061 Iustin Pop
    _PIAllocFromDesc("Iallocator for computing solution"),
1852 911ee606 Michael Hanselmann
    _PTargetGroups,
1853 08f8c82c Michael Hanselmann
    ]
1854 1456df62 Michael Hanselmann
  OP_RESULT = TJobIdListOnly
1855 08f8c82c Michael Hanselmann
1856 08f8c82c Michael Hanselmann
1857 a8083063 Iustin Pop
# OS opcodes
1858 da2d02e7 Iustin Pop
class OpOsDiagnose(OpCode):
1859 a8083063 Iustin Pop
  """Compute the list of guest operating systems."""
1860 65e183af Michael Hanselmann
  OP_PARAMS = [
1861 65e183af Michael Hanselmann
    _POutputFields,
1862 45d4c81c Michael Hanselmann
    ("names", ht.EmptyList, ht.TListOf(ht.TNonEmptyString),
1863 45d4c81c Michael Hanselmann
     "Which operating systems to diagnose"),
1864 65e183af Michael Hanselmann
    ]
1865 415feb2e René Nussbaumer
  OP_RESULT = _TOldQueryResult
1866 a8083063 Iustin Pop
1867 7c0d6283 Michael Hanselmann
1868 b954f097 Constantinos Venetsanopoulos
# ExtStorage opcodes
1869 b954f097 Constantinos Venetsanopoulos
class OpExtStorageDiagnose(OpCode):
1870 b954f097 Constantinos Venetsanopoulos
  """Compute the list of external storage providers."""
1871 b954f097 Constantinos Venetsanopoulos
  OP_PARAMS = [
1872 b954f097 Constantinos Venetsanopoulos
    _POutputFields,
1873 b954f097 Constantinos Venetsanopoulos
    ("names", ht.EmptyList, ht.TListOf(ht.TNonEmptyString),
1874 b954f097 Constantinos Venetsanopoulos
     "Which ExtStorage Provider to diagnose"),
1875 b954f097 Constantinos Venetsanopoulos
    ]
1876 b954f097 Constantinos Venetsanopoulos
  OP_RESULT = _TOldQueryResult
1877 b954f097 Constantinos Venetsanopoulos
1878 b954f097 Constantinos Venetsanopoulos
1879 a8083063 Iustin Pop
# Exports opcodes
1880 7ca2d4d8 Iustin Pop
class OpBackupQuery(OpCode):
1881 a8083063 Iustin Pop
  """Compute the list of exported images."""
1882 65e183af Michael Hanselmann
  OP_PARAMS = [
1883 45d4c81c Michael Hanselmann
    _PUseLocking,
1884 45d4c81c Michael Hanselmann
    ("nodes", ht.EmptyList, ht.TListOf(ht.TNonEmptyString),
1885 45d4c81c Michael Hanselmann
     "Empty list to query all nodes, node names otherwise"),
1886 65e183af Michael Hanselmann
    ]
1887 202fb4e0 Michael Hanselmann
  OP_RESULT = ht.TDictOf(ht.TNonEmptyString,
1888 202fb4e0 Michael Hanselmann
                         ht.TOr(ht.Comment("False on error")(ht.TBool),
1889 202fb4e0 Michael Hanselmann
                                ht.TListOf(ht.TNonEmptyString)))
1890 a8083063 Iustin Pop
1891 7c0d6283 Michael Hanselmann
1892 71910715 Iustin Pop
class OpBackupPrepare(OpCode):
1893 1410fa8d Michael Hanselmann
  """Prepares an instance export.
1894 1410fa8d Michael Hanselmann

1895 1410fa8d Michael Hanselmann
  @ivar instance_name: Instance name
1896 1410fa8d Michael Hanselmann
  @ivar mode: Export mode (one of L{constants.EXPORT_MODES})
1897 1410fa8d Michael Hanselmann

1898 1410fa8d Michael Hanselmann
  """
1899 1410fa8d Michael Hanselmann
  OP_DSC_FIELD = "instance_name"
1900 65e183af Michael Hanselmann
  OP_PARAMS = [
1901 65e183af Michael Hanselmann
    _PInstanceName,
1902 45d4c81c Michael Hanselmann
    ("mode", ht.NoDefault, ht.TElemOf(constants.EXPORT_MODES),
1903 45d4c81c Michael Hanselmann
     "Export mode"),
1904 1410fa8d Michael Hanselmann
    ]
1905 fd9f58fd Iustin Pop
  OP_RESULT = ht.TMaybeDict
1906 1410fa8d Michael Hanselmann
1907 1410fa8d Michael Hanselmann
1908 4ff922a2 Iustin Pop
class OpBackupExport(OpCode):
1909 4a96f1d1 Michael Hanselmann
  """Export an instance.
1910 4a96f1d1 Michael Hanselmann

1911 398e9066 Iustin Pop
  For local exports, the export destination is the node name. For
1912 398e9066 Iustin Pop
  remote exports, the export destination is a list of tuples, each
1913 398e9066 Iustin Pop
  consisting of hostname/IP address, port, magic, HMAC and HMAC
1914 398e9066 Iustin Pop
  salt. The HMAC is calculated using the cluster domain secret over
1915 398e9066 Iustin Pop
  the value "${index}:${hostname}:${port}". The destination X509 CA
1916 398e9066 Iustin Pop
  must be a signed certificate.
1917 4a96f1d1 Michael Hanselmann

1918 4a96f1d1 Michael Hanselmann
  @ivar mode: Export mode (one of L{constants.EXPORT_MODES})
1919 4a96f1d1 Michael Hanselmann
  @ivar target_node: Export destination
1920 4a96f1d1 Michael Hanselmann
  @ivar x509_key_name: X509 key to use (remote export only)
1921 4a96f1d1 Michael Hanselmann
  @ivar destination_x509_ca: Destination X509 CA in PEM format (remote export
1922 4a96f1d1 Michael Hanselmann
                             only)
1923 4a96f1d1 Michael Hanselmann

1924 4a96f1d1 Michael Hanselmann
  """
1925 60dd1473 Iustin Pop
  OP_DSC_FIELD = "instance_name"
1926 65e183af Michael Hanselmann
  OP_PARAMS = [
1927 65e183af Michael Hanselmann
    _PInstanceName,
1928 65e183af Michael Hanselmann
    _PShutdownTimeout,
1929 4a96f1d1 Michael Hanselmann
    # TODO: Rename target_node as it changes meaning for different export modes
1930 4a96f1d1 Michael Hanselmann
    # (e.g. "destination")
1931 45d4c81c Michael Hanselmann
    ("target_node", ht.NoDefault, ht.TOr(ht.TNonEmptyString, ht.TList),
1932 45d4c81c Michael Hanselmann
     "Destination information, depends on export mode"),
1933 45d4c81c Michael Hanselmann
    ("shutdown", True, ht.TBool, "Whether to shutdown instance before export"),
1934 45d4c81c Michael Hanselmann
    ("remove_instance", False, ht.TBool,
1935 45d4c81c Michael Hanselmann
     "Whether to remove instance after export"),
1936 45d4c81c Michael Hanselmann
    ("ignore_remove_failures", False, ht.TBool,
1937 45d4c81c Michael Hanselmann
     "Whether to ignore failures while removing instances"),
1938 45d4c81c Michael Hanselmann
    ("mode", constants.EXPORT_MODE_LOCAL, ht.TElemOf(constants.EXPORT_MODES),
1939 45d4c81c Michael Hanselmann
     "Export mode"),
1940 fd9f58fd Iustin Pop
    ("x509_key_name", None, ht.TMaybe(ht.TList),
1941 45d4c81c Michael Hanselmann
     "Name of X509 key (remote export only)"),
1942 45d4c81c Michael Hanselmann
    ("destination_x509_ca", None, ht.TMaybeString,
1943 45d4c81c Michael Hanselmann
     "Destination X509 CA (remote export only)"),
1944 17c3f802 Guido Trotter
    ]
1945 202fb4e0 Michael Hanselmann
  OP_RESULT = \
1946 202fb4e0 Michael Hanselmann
    ht.TAnd(ht.TIsLength(2), ht.TItems([
1947 202fb4e0 Michael Hanselmann
      ht.Comment("Finalizing status")(ht.TBool),
1948 202fb4e0 Michael Hanselmann
      ht.Comment("Status for every exported disk")(ht.TListOf(ht.TBool)),
1949 202fb4e0 Michael Hanselmann
      ]))
1950 5c947f38 Iustin Pop
1951 0a7bed64 Michael Hanselmann
1952 ca5890ad Iustin Pop
class OpBackupRemove(OpCode):
1953 9ac99fda Guido Trotter
  """Remove an instance's export."""
1954 60dd1473 Iustin Pop
  OP_DSC_FIELD = "instance_name"
1955 65e183af Michael Hanselmann
  OP_PARAMS = [
1956 65e183af Michael Hanselmann
    _PInstanceName,
1957 65e183af Michael Hanselmann
    ]
1958 202fb4e0 Michael Hanselmann
  OP_RESULT = ht.TNone
1959 5c947f38 Iustin Pop
1960 0a7bed64 Michael Hanselmann
1961 5c947f38 Iustin Pop
# Tags opcodes
1962 c6afb1ca Iustin Pop
class OpTagsGet(OpCode):
1963 5c947f38 Iustin Pop
  """Returns the tags of the given object."""
1964 60dd1473 Iustin Pop
  OP_DSC_FIELD = "name"
1965 65e183af Michael Hanselmann
  OP_PARAMS = [
1966 65e183af Michael Hanselmann
    _PTagKind,
1967 cfdf561d Michael Hanselmann
    # Not using _PUseLocking as the default is different for historical reasons
1968 cfdf561d Michael Hanselmann
    ("use_locking", True, ht.TBool, "Whether to use synchronization"),
1969 65e183af Michael Hanselmann
    # Name is only meaningful for nodes and instances
1970 971b3a98 Michael Hanselmann
    ("name", ht.NoDefault, ht.TMaybeString,
1971 971b3a98 Michael Hanselmann
     "Name of object to retrieve tags from"),
1972 65e183af Michael Hanselmann
    ]
1973 48796673 Michael Hanselmann
  OP_RESULT = ht.TListOf(ht.TNonEmptyString)
1974 5c947f38 Iustin Pop
1975 5c947f38 Iustin Pop
1976 715462e7 Iustin Pop
class OpTagsSearch(OpCode):
1977 73415719 Iustin Pop
  """Searches the tags in the cluster for a given pattern."""
1978 60dd1473 Iustin Pop
  OP_DSC_FIELD = "pattern"
1979 65e183af Michael Hanselmann
  OP_PARAMS = [
1980 971b3a98 Michael Hanselmann
    ("pattern", ht.NoDefault, ht.TNonEmptyString,
1981 971b3a98 Michael Hanselmann
     "Search pattern (regular expression)"),
1982 65e183af Michael Hanselmann
    ]
1983 48796673 Michael Hanselmann
  OP_RESULT = ht.TListOf(ht.TAnd(ht.TIsLength(2), ht.TItems([
1984 48796673 Michael Hanselmann
    ht.TNonEmptyString,
1985 48796673 Michael Hanselmann
    ht.TNonEmptyString,
1986 48796673 Michael Hanselmann
    ])))
1987 73415719 Iustin Pop
1988 73415719 Iustin Pop
1989 d1602edc Iustin Pop
class OpTagsSet(OpCode):
1990 f27302fa Iustin Pop
  """Add a list of tags on a given object."""
1991 65e183af Michael Hanselmann
  OP_PARAMS = [
1992 65e183af Michael Hanselmann
    _PTagKind,
1993 65e183af Michael Hanselmann
    _PTags,
1994 bcd35e09 Dato Simó
    # Name is only meaningful for groups, nodes and instances
1995 971b3a98 Michael Hanselmann
    ("name", ht.NoDefault, ht.TMaybeString,
1996 971b3a98 Michael Hanselmann
     "Name of object where tag(s) should be added"),
1997 65e183af Michael Hanselmann
    ]
1998 48796673 Michael Hanselmann
  OP_RESULT = ht.TNone
1999 5c947f38 Iustin Pop
2000 5c947f38 Iustin Pop
2001 3f0ab95f Iustin Pop
class OpTagsDel(OpCode):
2002 f27302fa Iustin Pop
  """Remove a list of tags from a given object."""
2003 65e183af Michael Hanselmann
  OP_PARAMS = [
2004 65e183af Michael Hanselmann
    _PTagKind,
2005 65e183af Michael Hanselmann
    _PTags,
2006 bcd35e09 Dato Simó
    # Name is only meaningful for groups, nodes and instances
2007 971b3a98 Michael Hanselmann
    ("name", ht.NoDefault, ht.TMaybeString,
2008 971b3a98 Michael Hanselmann
     "Name of object where tag(s) should be deleted"),
2009 65e183af Michael Hanselmann
    ]
2010 48796673 Michael Hanselmann
  OP_RESULT = ht.TNone
2011 06009e27 Iustin Pop
2012 e687ec01 Michael Hanselmann
2013 06009e27 Iustin Pop
# Test opcodes
2014 06009e27 Iustin Pop
class OpTestDelay(OpCode):
2015 06009e27 Iustin Pop
  """Sleeps for a configured amount of time.
2016 06009e27 Iustin Pop

2017 06009e27 Iustin Pop
  This is used just for debugging and testing.
2018 06009e27 Iustin Pop

2019 06009e27 Iustin Pop
  Parameters:
2020 aeb6ba44 Dato Simó
    - duration: the time to sleep, in seconds
2021 06009e27 Iustin Pop
    - on_master: if true, sleep on the master
2022 06009e27 Iustin Pop
    - on_nodes: list of nodes in which to sleep
2023 06009e27 Iustin Pop

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

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

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

2034 06009e27 Iustin Pop
  """
2035 60dd1473 Iustin Pop
  OP_DSC_FIELD = "duration"
2036 65e183af Michael Hanselmann
  OP_PARAMS = [
2037 b795a775 Michael Hanselmann
    ("duration", ht.NoDefault, ht.TNumber, None),
2038 197b323b Michael Hanselmann
    ("on_master", True, ht.TBool, None),
2039 197b323b Michael Hanselmann
    ("on_nodes", ht.EmptyList, ht.TListOf(ht.TNonEmptyString), None),
2040 2c9fa1ff Iustin Pop
    ("repeat", 0, ht.TNonNegativeInt, None),
2041 65e183af Michael Hanselmann
    ]
2042 d61df03e Iustin Pop
2043 8bc17ebb Iustin Pop
  def OP_DSC_FORMATTER(self, value): # pylint: disable=C0103,R0201
2044 8bc17ebb Iustin Pop
    """Custom formatter for duration.
2045 8bc17ebb Iustin Pop

2046 8bc17ebb Iustin Pop
    """
2047 8bc17ebb Iustin Pop
    try:
2048 8bc17ebb Iustin Pop
      v = float(value)
2049 8bc17ebb Iustin Pop
    except TypeError:
2050 8bc17ebb Iustin Pop
      v = value
2051 8bc17ebb Iustin Pop
    return str(v)
2052 8bc17ebb Iustin Pop
2053 d61df03e Iustin Pop
2054 d61df03e Iustin Pop
class OpTestAllocator(OpCode):
2055 d61df03e Iustin Pop
  """Allocator framework testing.
2056 d61df03e Iustin Pop

2057 d61df03e Iustin Pop
  This opcode has two modes:
2058 d61df03e Iustin Pop
    - gather and return allocator input for a given mode (allocate new
2059 d61df03e Iustin Pop
      or replace secondary) and a given instance definition (direction
2060 d61df03e Iustin Pop
      'in')
2061 d61df03e Iustin Pop
    - run a selected allocator for a given operation (as above) and
2062 d61df03e Iustin Pop
      return the allocator output (direction 'out')
2063 d61df03e Iustin Pop

2064 d61df03e Iustin Pop
  """
2065 55b7e783 Iustin Pop
  OP_DSC_FIELD = "iallocator"
2066 65e183af Michael Hanselmann
  OP_PARAMS = [
2067 65e183af Michael Hanselmann
    ("direction", ht.NoDefault,
2068 197b323b Michael Hanselmann
     ht.TElemOf(constants.VALID_IALLOCATOR_DIRECTIONS), None),
2069 197b323b Michael Hanselmann
    ("mode", ht.NoDefault, ht.TElemOf(constants.VALID_IALLOCATOR_MODES), None),
2070 197b323b Michael Hanselmann
    ("name", ht.NoDefault, ht.TNonEmptyString, None),
2071 ff8067cf Michael Hanselmann
    ("nics", ht.NoDefault,
2072 ff8067cf Michael Hanselmann
     ht.TMaybeListOf(ht.TDictOf(ht.TElemOf([constants.INIC_MAC,
2073 ff8067cf Michael Hanselmann
                                            constants.INIC_IP,
2074 ff8067cf Michael Hanselmann
                                            "bridge"]),
2075 fd9f58fd Iustin Pop
                                ht.TMaybeString)),
2076 ff8067cf Michael Hanselmann
     None),
2077 fd9f58fd Iustin Pop
    ("disks", ht.NoDefault, ht.TMaybe(ht.TList), None),
2078 197b323b Michael Hanselmann
    ("hypervisor", None, ht.TMaybeString, None),
2079 55b7e783 Iustin Pop
    _PIAllocFromDesc(None),
2080 197b323b Michael Hanselmann
    ("tags", ht.EmptyList, ht.TListOf(ht.TNonEmptyString), None),
2081 fd9f58fd Iustin Pop
    ("memory", None, ht.TMaybe(ht.TNonNegativeInt), None),
2082 fd9f58fd Iustin Pop
    ("vcpus", None, ht.TMaybe(ht.TNonNegativeInt), None),
2083 197b323b Michael Hanselmann
    ("os", None, ht.TMaybeString, None),
2084 197b323b Michael Hanselmann
    ("disk_template", None, ht.TMaybeString, None),
2085 ff8067cf Michael Hanselmann
    ("instances", None, ht.TMaybeListOf(ht.TNonEmptyString), None),
2086 60152bbe Michael Hanselmann
    ("evac_mode", None,
2087 fd9f58fd Iustin Pop
     ht.TMaybe(ht.TElemOf(constants.IALLOCATOR_NEVAC_MODES)), None),
2088 ff8067cf Michael Hanselmann
    ("target_groups", None, ht.TMaybeListOf(ht.TNonEmptyString), None),
2089 2c9fa1ff Iustin Pop
    ("spindle_use", 1, ht.TNonNegativeInt, None),
2090 2c9fa1ff Iustin Pop
    ("count", 1, ht.TNonNegativeInt, None),
2091 d61df03e Iustin Pop
    ]
2092 363acb1e Iustin Pop
2093 76aef8fc Michael Hanselmann
2094 b469eb4d Iustin Pop
class OpTestJqueue(OpCode):
2095 e58f87a9 Michael Hanselmann
  """Utility opcode to test some aspects of the job queue.
2096 e58f87a9 Michael Hanselmann

2097 e58f87a9 Michael Hanselmann
  """
2098 65e183af Michael Hanselmann
  OP_PARAMS = [
2099 197b323b Michael Hanselmann
    ("notify_waitlock", False, ht.TBool, None),
2100 197b323b Michael Hanselmann
    ("notify_exec", False, ht.TBool, None),
2101 197b323b Michael Hanselmann
    ("log_messages", ht.EmptyList, ht.TListOf(ht.TString), None),
2102 197b323b Michael Hanselmann
    ("fail", False, ht.TBool, None),
2103 e58f87a9 Michael Hanselmann
    ]
2104 e58f87a9 Michael Hanselmann
2105 e58f87a9 Michael Hanselmann
2106 be760ba8 Michael Hanselmann
class OpTestDummy(OpCode):
2107 be760ba8 Michael Hanselmann
  """Utility opcode used by unittests.
2108 be760ba8 Michael Hanselmann

2109 be760ba8 Michael Hanselmann
  """
2110 65e183af Michael Hanselmann
  OP_PARAMS = [
2111 197b323b Michael Hanselmann
    ("result", ht.NoDefault, ht.NoType, None),
2112 197b323b Michael Hanselmann
    ("messages", ht.NoDefault, ht.NoType, None),
2113 197b323b Michael Hanselmann
    ("fail", ht.NoDefault, ht.NoType, None),
2114 6a373640 Michael Hanselmann
    ("submit_jobs", None, ht.NoType, None),
2115 be760ba8 Michael Hanselmann
    ]
2116 687c10d9 Iustin Pop
  WITH_LU = False
2117 be760ba8 Michael Hanselmann
2118 be760ba8 Michael Hanselmann
2119 eaa4c57c Dimitris Aragiorgis
# Network opcodes
2120 eaa4c57c Dimitris Aragiorgis
# Add a new network in the cluster
2121 eaa4c57c Dimitris Aragiorgis
class OpNetworkAdd(OpCode):
2122 eaa4c57c Dimitris Aragiorgis
  """Add an IP network to the cluster."""
2123 eaa4c57c Dimitris Aragiorgis
  OP_DSC_FIELD = "network_name"
2124 eaa4c57c Dimitris Aragiorgis
  OP_PARAMS = [
2125 eaa4c57c Dimitris Aragiorgis
    _PNetworkName,
2126 e1494c96 Iustin Pop
    ("network", ht.NoDefault, _TIpNetwork4, "IPv4 subnet"),
2127 e1494c96 Iustin Pop
    ("gateway", None, ht.TMaybe(_TIpAddress4), "IPv4 gateway"),
2128 e1494c96 Iustin Pop
    ("network6", None, ht.TMaybe(_TIpNetwork6), "IPv6 subnet"),
2129 e1494c96 Iustin Pop
    ("gateway6", None, ht.TMaybe(_TIpAddress6), "IPv6 gateway"),
2130 6e8091f9 Dimitris Aragiorgis
    ("mac_prefix", None, ht.TMaybeString,
2131 32e3d8b1 Michael Hanselmann
     "MAC address prefix that overrides cluster one"),
2132 e1494c96 Iustin Pop
    ("add_reserved_ips", None, _TMaybeAddr4List,
2133 32e3d8b1 Michael Hanselmann
     "Which IP addresses to reserve"),
2134 213076fe Dimitris Aragiorgis
    ("conflicts_check", True, ht.TBool,
2135 213076fe Dimitris Aragiorgis
     "Whether to check for conflicting IP addresses"),
2136 8140e24f Dimitris Aragiorgis
    ("tags", ht.EmptyList, ht.TListOf(ht.TNonEmptyString), "Network tags"),
2137 eaa4c57c Dimitris Aragiorgis
    ]
2138 6e8091f9 Dimitris Aragiorgis
  OP_RESULT = ht.TNone
2139 eaa4c57c Dimitris Aragiorgis
2140 3c286190 Dimitris Aragiorgis
2141 eaa4c57c Dimitris Aragiorgis
class OpNetworkRemove(OpCode):
2142 eaa4c57c Dimitris Aragiorgis
  """Remove an existing network from the cluster.
2143 eaa4c57c Dimitris Aragiorgis
     Must not be connected to any nodegroup.
2144 eaa4c57c Dimitris Aragiorgis

2145 eaa4c57c Dimitris Aragiorgis
  """
2146 eaa4c57c Dimitris Aragiorgis
  OP_DSC_FIELD = "network_name"
2147 eaa4c57c Dimitris Aragiorgis
  OP_PARAMS = [
2148 eaa4c57c Dimitris Aragiorgis
    _PNetworkName,
2149 eaa4c57c Dimitris Aragiorgis
    _PForce,
2150 eaa4c57c Dimitris Aragiorgis
    ]
2151 6e8091f9 Dimitris Aragiorgis
  OP_RESULT = ht.TNone
2152 eaa4c57c Dimitris Aragiorgis
2153 3c286190 Dimitris Aragiorgis
2154 eaa4c57c Dimitris Aragiorgis
class OpNetworkSetParams(OpCode):
2155 eaa4c57c Dimitris Aragiorgis
  """Modify Network's parameters except for IPv4 subnet"""
2156 eaa4c57c Dimitris Aragiorgis
  OP_DSC_FIELD = "network_name"
2157 eaa4c57c Dimitris Aragiorgis
  OP_PARAMS = [
2158 eaa4c57c Dimitris Aragiorgis
    _PNetworkName,
2159 e055a2ab Dimitris Aragiorgis
    ("gateway", None, ht.TMaybeValueNone(_TIpAddress4), "IPv4 gateway"),
2160 e055a2ab Dimitris Aragiorgis
    ("network6", None, ht.TMaybeValueNone(_TIpNetwork6), "IPv6 subnet"),
2161 e055a2ab Dimitris Aragiorgis
    ("gateway6", None, ht.TMaybeValueNone(_TIpAddress6), "IPv6 gateway"),
2162 e055a2ab Dimitris Aragiorgis
    ("mac_prefix", None, ht.TMaybeValueNone(ht.TString),
2163 32e3d8b1 Michael Hanselmann
     "MAC address prefix that overrides cluster one"),
2164 e1494c96 Iustin Pop
    ("add_reserved_ips", None, _TMaybeAddr4List,
2165 32e3d8b1 Michael Hanselmann
     "Which external IP addresses to reserve"),
2166 e1494c96 Iustin Pop
    ("remove_reserved_ips", None, _TMaybeAddr4List,
2167 32e3d8b1 Michael Hanselmann
     "Which external IP addresses to release"),
2168 eaa4c57c Dimitris Aragiorgis
    ]
2169 6e8091f9 Dimitris Aragiorgis
  OP_RESULT = ht.TNone
2170 eaa4c57c Dimitris Aragiorgis
2171 3c286190 Dimitris Aragiorgis
2172 eaa4c57c Dimitris Aragiorgis
class OpNetworkConnect(OpCode):
2173 eaa4c57c Dimitris Aragiorgis
  """Connect a Network to a specific Nodegroup with the defined netparams
2174 eaa4c57c Dimitris Aragiorgis
     (mode, link). Nics in this Network will inherit those params.
2175 eaa4c57c Dimitris Aragiorgis
     Produce errors if a NIC (that its not already assigned to a network)
2176 eaa4c57c Dimitris Aragiorgis
     has an IP that is contained in the Network this will produce error unless
2177 eaa4c57c Dimitris Aragiorgis
     --no-conflicts-check is passed.
2178 eaa4c57c Dimitris Aragiorgis

2179 eaa4c57c Dimitris Aragiorgis
  """
2180 eaa4c57c Dimitris Aragiorgis
  OP_DSC_FIELD = "network_name"
2181 eaa4c57c Dimitris Aragiorgis
  OP_PARAMS = [
2182 eaa4c57c Dimitris Aragiorgis
    _PGroupName,
2183 eaa4c57c Dimitris Aragiorgis
    _PNetworkName,
2184 6ef37395 Michael Hanselmann
    ("network_mode", ht.NoDefault, ht.TElemOf(constants.NIC_VALID_MODES),
2185 6ef37395 Michael Hanselmann
     "Connectivity mode"),
2186 e1494c96 Iustin Pop
    ("network_link", ht.NoDefault, ht.TString, "Connectivity link"),
2187 6e8091f9 Dimitris Aragiorgis
    ("conflicts_check", True, ht.TBool, "Whether to check for conflicting IPs"),
2188 eaa4c57c Dimitris Aragiorgis
    ]
2189 6e8091f9 Dimitris Aragiorgis
  OP_RESULT = ht.TNone
2190 eaa4c57c Dimitris Aragiorgis
2191 3c286190 Dimitris Aragiorgis
2192 eaa4c57c Dimitris Aragiorgis
class OpNetworkDisconnect(OpCode):
2193 eaa4c57c Dimitris Aragiorgis
  """Disconnect a Network from a Nodegroup. Produce errors if NICs are
2194 eaa4c57c Dimitris Aragiorgis
     present in the Network unless --no-conficts-check option is passed.
2195 eaa4c57c Dimitris Aragiorgis

2196 eaa4c57c Dimitris Aragiorgis
  """
2197 eaa4c57c Dimitris Aragiorgis
  OP_DSC_FIELD = "network_name"
2198 eaa4c57c Dimitris Aragiorgis
  OP_PARAMS = [
2199 eaa4c57c Dimitris Aragiorgis
    _PGroupName,
2200 eaa4c57c Dimitris Aragiorgis
    _PNetworkName,
2201 eaa4c57c Dimitris Aragiorgis
    ]
2202 6e8091f9 Dimitris Aragiorgis
  OP_RESULT = ht.TNone
2203 eaa4c57c Dimitris Aragiorgis
2204 3c286190 Dimitris Aragiorgis
2205 eaa4c57c Dimitris Aragiorgis
class OpNetworkQuery(OpCode):
2206 eaa4c57c Dimitris Aragiorgis
  """Compute the list of networks."""
2207 eaa4c57c Dimitris Aragiorgis
  OP_PARAMS = [
2208 eaa4c57c Dimitris Aragiorgis
    _POutputFields,
2209 8d459129 Michael Hanselmann
    _PUseLocking,
2210 eaa4c57c Dimitris Aragiorgis
    ("names", ht.EmptyList, ht.TListOf(ht.TNonEmptyString),
2211 eaa4c57c Dimitris Aragiorgis
     "Empty list to query all groups, group names otherwise"),
2212 eaa4c57c Dimitris Aragiorgis
    ]
2213 829cfbc5 Dimitris Aragiorgis
  OP_RESULT = _TOldQueryResult
2214 eaa4c57c Dimitris Aragiorgis
2215 eaa4c57c Dimitris Aragiorgis
2216 dbc96028 Michael Hanselmann
def _GetOpList():
2217 dbc96028 Michael Hanselmann
  """Returns list of all defined opcodes.
2218 dbc96028 Michael Hanselmann

2219 dbc96028 Michael Hanselmann
  Does not eliminate duplicates by C{OP_ID}.
2220 dbc96028 Michael Hanselmann

2221 dbc96028 Michael Hanselmann
  """
2222 dbc96028 Michael Hanselmann
  return [v for v in globals().values()
2223 dbc96028 Michael Hanselmann
          if (isinstance(v, type) and issubclass(v, OpCode) and
2224 687c10d9 Iustin Pop
              hasattr(v, "OP_ID") and v is not OpCode)]
2225 dbc96028 Michael Hanselmann
2226 dbc96028 Michael Hanselmann
2227 dbc96028 Michael Hanselmann
OP_MAPPING = dict((v.OP_ID, v) for v in _GetOpList())