Statistics
| Branch: | Tag: | Revision:

root / lib / opcodes.py @ c270ee07

History | View | Annotate | Download (66.7 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 69c88fb1 Michele Tartara
# The reason for a state change of an instance
188 69c88fb1 Michele Tartara
_PReason = \
189 69c88fb1 Michele Tartara
  ("reason", (constants.INSTANCE_REASON_SOURCE_UNKNOWN, None),
190 69c88fb1 Michele Tartara
   ht.TAnd(ht.TIsLength(2),
191 69c88fb1 Michele Tartara
           ht.TItems([
192 69c88fb1 Michele Tartara
             ht.TElemOf(constants.INSTANCE_REASON_SOURCES),
193 69c88fb1 Michele Tartara
             ht.TMaybeString,
194 69c88fb1 Michele Tartara
           ])),
195 777e8b6f Michele Tartara
   "The reason why the state of the instance is changing")
196 69c88fb1 Michele Tartara
197 ff0d18e6 Iustin Pop
#: OP_ID conversion regular expression
198 ff0d18e6 Iustin Pop
_OPID_RE = re.compile("([a-z])([A-Z])")
199 ff0d18e6 Iustin Pop
200 8c9ee749 Michael Hanselmann
#: Utility function for L{OpClusterSetParams}
201 8f227489 Michael Hanselmann
_TestClusterOsListItem = \
202 8f227489 Michael Hanselmann
  ht.TAnd(ht.TIsLength(2), ht.TItems([
203 8f227489 Michael Hanselmann
    ht.TElemOf(constants.DDMS_VALUES),
204 8f227489 Michael Hanselmann
    ht.TNonEmptyString,
205 8f227489 Michael Hanselmann
    ]))
206 8c9ee749 Michael Hanselmann
207 ff8067cf Michael Hanselmann
_TestClusterOsList = ht.TMaybeListOf(_TestClusterOsListItem)
208 ff0d18e6 Iustin Pop
209 526a662a Michael Hanselmann
# TODO: Generate check from constants.INIC_PARAMS_TYPES
210 526a662a Michael Hanselmann
#: Utility function for testing NIC definitions
211 20a32e74 Michael Hanselmann
_TestNicDef = \
212 20a32e74 Michael Hanselmann
  ht.Comment("NIC parameters")(ht.TDictOf(ht.TElemOf(constants.INIC_PARAMS),
213 fd9f58fd Iustin Pop
                                          ht.TMaybeString))
214 526a662a Michael Hanselmann
215 1456df62 Michael Hanselmann
_TSetParamsResultItemItems = [
216 1456df62 Michael Hanselmann
  ht.Comment("name of changed parameter")(ht.TNonEmptyString),
217 b3d2ee31 Michael Hanselmann
  ht.Comment("new value")(ht.TAny),
218 1456df62 Michael Hanselmann
  ]
219 1456df62 Michael Hanselmann
220 1456df62 Michael Hanselmann
_TSetParamsResult = \
221 1456df62 Michael Hanselmann
  ht.TListOf(ht.TAnd(ht.TIsLength(len(_TSetParamsResultItemItems)),
222 1456df62 Michael Hanselmann
                     ht.TItems(_TSetParamsResultItemItems)))
223 1456df62 Michael Hanselmann
224 3e3ddbf0 Constantinos Venetsanopoulos
# In the disks option we can provide arbitrary parameters too, which
225 3e3ddbf0 Constantinos Venetsanopoulos
# we may not be able to validate at this level, so we just check the
226 3e3ddbf0 Constantinos Venetsanopoulos
# format of the dict here and the checks concerning IDISK_PARAMS will
227 3e3ddbf0 Constantinos Venetsanopoulos
# happen at the LU level
228 20a32e74 Michael Hanselmann
_TDiskParams = \
229 3e3ddbf0 Constantinos Venetsanopoulos
  ht.Comment("Disk parameters")(ht.TDictOf(ht.TNonEmptyString,
230 20a32e74 Michael Hanselmann
                                           ht.TOr(ht.TNonEmptyString, ht.TInt)))
231 735e1318 Michael Hanselmann
232 aa12a891 René Nussbaumer
_TQueryRow = \
233 aa12a891 René Nussbaumer
  ht.TListOf(ht.TAnd(ht.TIsLength(2),
234 aa12a891 René Nussbaumer
                     ht.TItems([ht.TElemOf(constants.RS_ALL),
235 aa12a891 René Nussbaumer
                                ht.TAny])))
236 aa12a891 René Nussbaumer
237 415feb2e René Nussbaumer
_TQueryResult = ht.TListOf(_TQueryRow)
238 415feb2e René Nussbaumer
239 415feb2e René Nussbaumer
_TOldQueryRow = ht.TListOf(ht.TAny)
240 415feb2e René Nussbaumer
241 415feb2e René Nussbaumer
_TOldQueryResult = ht.TListOf(_TOldQueryRow)
242 415feb2e René Nussbaumer
243 415feb2e René Nussbaumer
244 3ce9a5e7 Michael Hanselmann
_SUMMARY_PREFIX = {
245 3ce9a5e7 Michael Hanselmann
  "CLUSTER_": "C_",
246 3ce9a5e7 Michael Hanselmann
  "GROUP_": "G_",
247 3ce9a5e7 Michael Hanselmann
  "NODE_": "N_",
248 3ce9a5e7 Michael Hanselmann
  "INSTANCE_": "I_",
249 3ce9a5e7 Michael Hanselmann
  }
250 3ce9a5e7 Michael Hanselmann
251 b95479a5 Michael Hanselmann
#: Attribute name for dependencies
252 b95479a5 Michael Hanselmann
DEPEND_ATTR = "depends"
253 b95479a5 Michael Hanselmann
254 018ae30b Michael Hanselmann
#: Attribute name for comment
255 018ae30b Michael Hanselmann
COMMENT_ATTR = "comment"
256 018ae30b Michael Hanselmann
257 526a662a Michael Hanselmann
258 ff0d18e6 Iustin Pop
def _NameToId(name):
259 ff0d18e6 Iustin Pop
  """Convert an opcode class name to an OP_ID.
260 ff0d18e6 Iustin Pop

261 ff0d18e6 Iustin Pop
  @type name: string
262 ff0d18e6 Iustin Pop
  @param name: the class name, as OpXxxYyy
263 ff0d18e6 Iustin Pop
  @rtype: string
264 ff0d18e6 Iustin Pop
  @return: the name in the OP_XXXX_YYYY format
265 ff0d18e6 Iustin Pop

266 ff0d18e6 Iustin Pop
  """
267 ff0d18e6 Iustin Pop
  if not name.startswith("Op"):
268 ff0d18e6 Iustin Pop
    return None
269 ff0d18e6 Iustin Pop
  # Note: (?<=[a-z])(?=[A-Z]) would be ideal, since it wouldn't
270 ff0d18e6 Iustin Pop
  # consume any input, and hence we would just have all the elements
271 ff0d18e6 Iustin Pop
  # in the list, one by one; but it seems that split doesn't work on
272 ff0d18e6 Iustin Pop
  # non-consuming input, hence we have to process the input string a
273 ff0d18e6 Iustin Pop
  # bit
274 ff0d18e6 Iustin Pop
  name = _OPID_RE.sub(r"\1,\2", name)
275 ff0d18e6 Iustin Pop
  elems = name.split(",")
276 ff0d18e6 Iustin Pop
  return "_".join(n.upper() for n in elems)
277 ff0d18e6 Iustin Pop
278 65e183af Michael Hanselmann
279 415feb2e René Nussbaumer
def _GenerateObjectTypeCheck(obj, fields_types):
280 415feb2e René Nussbaumer
  """Helper to generate type checks for objects.
281 415feb2e René Nussbaumer

282 415feb2e René Nussbaumer
  @param obj: The object to generate type checks
283 415feb2e René Nussbaumer
  @param fields_types: The fields and their types as a dict
284 415feb2e René Nussbaumer
  @return: A ht type check function
285 415feb2e René Nussbaumer

286 415feb2e René Nussbaumer
  """
287 415feb2e René Nussbaumer
  assert set(obj.GetAllSlots()) == set(fields_types.keys()), \
288 415feb2e René Nussbaumer
    "%s != %s" % (set(obj.GetAllSlots()), set(fields_types.keys()))
289 415feb2e René Nussbaumer
  return ht.TStrictDict(True, True, fields_types)
290 415feb2e René Nussbaumer
291 415feb2e René Nussbaumer
292 b02c6bdf Michael Hanselmann
_TQueryFieldDef = \
293 b02c6bdf Michael Hanselmann
  _GenerateObjectTypeCheck(objects.QueryFieldDefinition, {
294 b02c6bdf Michael Hanselmann
    "name": ht.TNonEmptyString,
295 b02c6bdf Michael Hanselmann
    "title": ht.TNonEmptyString,
296 b02c6bdf Michael Hanselmann
    "kind": ht.TElemOf(constants.QFT_ALL),
297 b02c6bdf Michael Hanselmann
    "doc": ht.TNonEmptyString,
298 b02c6bdf Michael Hanselmann
    })
299 415feb2e René Nussbaumer
300 415feb2e René Nussbaumer
301 65e183af Michael Hanselmann
def RequireFileStorage():
302 65e183af Michael Hanselmann
  """Checks that file storage is enabled.
303 65e183af Michael Hanselmann

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

307 65e183af Michael Hanselmann
  @raise errors.OpPrereqError: when file storage is disabled
308 65e183af Michael Hanselmann

309 65e183af Michael Hanselmann
  """
310 65e183af Michael Hanselmann
  if not constants.ENABLE_FILE_STORAGE:
311 65e183af Michael Hanselmann
    raise errors.OpPrereqError("File storage disabled at configure time",
312 65e183af Michael Hanselmann
                               errors.ECODE_INVAL)
313 65e183af Michael Hanselmann
314 65e183af Michael Hanselmann
315 4b97f902 Apollon Oikonomopoulos
def RequireSharedFileStorage():
316 4b97f902 Apollon Oikonomopoulos
  """Checks that shared file storage is enabled.
317 4b97f902 Apollon Oikonomopoulos

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

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

323 4b97f902 Apollon Oikonomopoulos
  """
324 4b97f902 Apollon Oikonomopoulos
  if not constants.ENABLE_SHARED_FILE_STORAGE:
325 4b97f902 Apollon Oikonomopoulos
    raise errors.OpPrereqError("Shared file storage disabled at"
326 4b97f902 Apollon Oikonomopoulos
                               " configure time", errors.ECODE_INVAL)
327 4b97f902 Apollon Oikonomopoulos
328 4b97f902 Apollon Oikonomopoulos
329 8c9ee749 Michael Hanselmann
@ht.WithDesc("CheckFileStorage")
330 8c9ee749 Michael Hanselmann
def _CheckFileStorage(value):
331 8c9ee749 Michael Hanselmann
  """Ensures file storage is enabled if used.
332 65e183af Michael Hanselmann

333 65e183af Michael Hanselmann
  """
334 8c9ee749 Michael Hanselmann
  if value == constants.DT_FILE:
335 65e183af Michael Hanselmann
    RequireFileStorage()
336 4b97f902 Apollon Oikonomopoulos
  elif value == constants.DT_SHARED_FILE:
337 4b97f902 Apollon Oikonomopoulos
    RequireSharedFileStorage()
338 65e183af Michael Hanselmann
  return True
339 65e183af Michael Hanselmann
340 65e183af Michael Hanselmann
341 45fe090b Michael Hanselmann
def _BuildDiskTemplateCheck(accept_none):
342 45fe090b Michael Hanselmann
  """Builds check for disk template.
343 45fe090b Michael Hanselmann

344 45fe090b Michael Hanselmann
  @type accept_none: bool
345 45fe090b Michael Hanselmann
  @param accept_none: whether to accept None as a correct value
346 45fe090b Michael Hanselmann
  @rtype: callable
347 45fe090b Michael Hanselmann

348 45fe090b Michael Hanselmann
  """
349 45fe090b Michael Hanselmann
  template_check = ht.TElemOf(constants.DISK_TEMPLATES)
350 45fe090b Michael Hanselmann
351 45fe090b Michael Hanselmann
  if accept_none:
352 fd9f58fd Iustin Pop
    template_check = ht.TMaybe(template_check)
353 45fe090b Michael Hanselmann
354 45fe090b Michael Hanselmann
  return ht.TAnd(template_check, _CheckFileStorage)
355 8c9ee749 Michael Hanselmann
356 8c9ee749 Michael Hanselmann
357 65e183af Michael Hanselmann
def _CheckStorageType(storage_type):
358 65e183af Michael Hanselmann
  """Ensure a given storage type is valid.
359 65e183af Michael Hanselmann

360 65e183af Michael Hanselmann
  """
361 65e183af Michael Hanselmann
  if storage_type not in constants.VALID_STORAGE_TYPES:
362 65e183af Michael Hanselmann
    raise errors.OpPrereqError("Unknown storage type: %s" % storage_type,
363 65e183af Michael Hanselmann
                               errors.ECODE_INVAL)
364 65e183af Michael Hanselmann
  if storage_type == constants.ST_FILE:
365 63a3d8f7 Michael Hanselmann
    # TODO: What about shared file storage?
366 65e183af Michael Hanselmann
    RequireFileStorage()
367 65e183af Michael Hanselmann
  return True
368 65e183af Michael Hanselmann
369 65e183af Michael Hanselmann
370 65e183af Michael Hanselmann
#: Storage type parameter
371 45d4c81c Michael Hanselmann
_PStorageType = ("storage_type", ht.NoDefault, _CheckStorageType,
372 45d4c81c Michael Hanselmann
                 "Storage type")
373 65e183af Michael Hanselmann
374 3c286190 Dimitris Aragiorgis
375 16091a6e Michael Hanselmann
@ht.WithDesc("IPv4 network")
376 eaa4c57c Dimitris Aragiorgis
def _CheckCIDRNetNotation(value):
377 16091a6e Michael Hanselmann
  """Ensure a given CIDR notation type is valid.
378 eaa4c57c Dimitris Aragiorgis

379 eaa4c57c Dimitris Aragiorgis
  """
380 eaa4c57c Dimitris Aragiorgis
  try:
381 eaa4c57c Dimitris Aragiorgis
    ipaddr.IPv4Network(value)
382 eaa4c57c Dimitris Aragiorgis
  except ipaddr.AddressValueError:
383 eaa4c57c Dimitris Aragiorgis
    return False
384 eaa4c57c Dimitris Aragiorgis
  return True
385 eaa4c57c Dimitris Aragiorgis
386 3c286190 Dimitris Aragiorgis
387 16091a6e Michael Hanselmann
@ht.WithDesc("IPv4 address")
388 eaa4c57c Dimitris Aragiorgis
def _CheckCIDRAddrNotation(value):
389 16091a6e Michael Hanselmann
  """Ensure a given CIDR notation type is valid.
390 eaa4c57c Dimitris Aragiorgis

391 eaa4c57c Dimitris Aragiorgis
  """
392 eaa4c57c Dimitris Aragiorgis
  try:
393 eaa4c57c Dimitris Aragiorgis
    ipaddr.IPv4Address(value)
394 eaa4c57c Dimitris Aragiorgis
  except ipaddr.AddressValueError:
395 eaa4c57c Dimitris Aragiorgis
    return False
396 eaa4c57c Dimitris Aragiorgis
  return True
397 eaa4c57c Dimitris Aragiorgis
398 3c286190 Dimitris Aragiorgis
399 16091a6e Michael Hanselmann
@ht.WithDesc("IPv6 address")
400 eaa4c57c Dimitris Aragiorgis
def _CheckCIDR6AddrNotation(value):
401 16091a6e Michael Hanselmann
  """Ensure a given CIDR notation type is valid.
402 eaa4c57c Dimitris Aragiorgis

403 eaa4c57c Dimitris Aragiorgis
  """
404 eaa4c57c Dimitris Aragiorgis
  try:
405 eaa4c57c Dimitris Aragiorgis
    ipaddr.IPv6Address(value)
406 eaa4c57c Dimitris Aragiorgis
  except ipaddr.AddressValueError:
407 eaa4c57c Dimitris Aragiorgis
    return False
408 eaa4c57c Dimitris Aragiorgis
  return True
409 eaa4c57c Dimitris Aragiorgis
410 3c286190 Dimitris Aragiorgis
411 16091a6e Michael Hanselmann
@ht.WithDesc("IPv6 network")
412 eaa4c57c Dimitris Aragiorgis
def _CheckCIDR6NetNotation(value):
413 16091a6e Michael Hanselmann
  """Ensure a given CIDR notation type is valid.
414 eaa4c57c Dimitris Aragiorgis

415 eaa4c57c Dimitris Aragiorgis
  """
416 eaa4c57c Dimitris Aragiorgis
  try:
417 eaa4c57c Dimitris Aragiorgis
    ipaddr.IPv6Network(value)
418 eaa4c57c Dimitris Aragiorgis
  except ipaddr.AddressValueError:
419 eaa4c57c Dimitris Aragiorgis
    return False
420 eaa4c57c Dimitris Aragiorgis
  return True
421 65e183af Michael Hanselmann
422 3c286190 Dimitris Aragiorgis
423 e1494c96 Iustin Pop
_TIpAddress4 = ht.TAnd(ht.TString, _CheckCIDRAddrNotation)
424 e1494c96 Iustin Pop
_TIpAddress6 = ht.TAnd(ht.TString, _CheckCIDR6AddrNotation)
425 e1494c96 Iustin Pop
_TIpNetwork4 = ht.TAnd(ht.TString, _CheckCIDRNetNotation)
426 e1494c96 Iustin Pop
_TIpNetwork6 = ht.TAnd(ht.TString, _CheckCIDR6NetNotation)
427 e1494c96 Iustin Pop
_TMaybeAddr4List = ht.TMaybe(ht.TListOf(_TIpAddress4))
428 32e3d8b1 Michael Hanselmann
429 32e3d8b1 Michael Hanselmann
430 473d87a3 Iustin Pop
class _AutoOpParamSlots(outils.AutoSlots):
431 65e183af Michael Hanselmann
  """Meta class for opcode definitions.
432 65e183af Michael Hanselmann

433 65e183af Michael Hanselmann
  """
434 65e183af Michael Hanselmann
  def __new__(mcs, name, bases, attrs):
435 65e183af Michael Hanselmann
    """Called when a class should be created.
436 65e183af Michael Hanselmann

437 65e183af Michael Hanselmann
    @param mcs: The meta class
438 65e183af Michael Hanselmann
    @param name: Name of created class
439 65e183af Michael Hanselmann
    @param bases: Base classes
440 65e183af Michael Hanselmann
    @type attrs: dict
441 65e183af Michael Hanselmann
    @param attrs: Class attributes
442 65e183af Michael Hanselmann

443 65e183af Michael Hanselmann
    """
444 e89a9021 Iustin Pop
    assert "OP_ID" not in attrs, "Class '%s' defining OP_ID" % name
445 ff0d18e6 Iustin Pop
446 32683096 René Nussbaumer
    slots = mcs._GetSlots(attrs)
447 32683096 René Nussbaumer
    assert "OP_DSC_FIELD" not in attrs or attrs["OP_DSC_FIELD"] in slots, \
448 32683096 René Nussbaumer
      "Class '%s' uses unknown field in OP_DSC_FIELD" % name
449 8bc17ebb Iustin Pop
    assert ("OP_DSC_FORMATTER" not in attrs or
450 8bc17ebb Iustin Pop
            callable(attrs["OP_DSC_FORMATTER"])), \
451 8bc17ebb Iustin Pop
      ("Class '%s' uses non-callable in OP_DSC_FORMATTER (%s)" %
452 8bc17ebb Iustin Pop
       (name, type(attrs["OP_DSC_FORMATTER"])))
453 32683096 René Nussbaumer
454 e89a9021 Iustin Pop
    attrs["OP_ID"] = _NameToId(name)
455 65e183af Michael Hanselmann
456 473d87a3 Iustin Pop
    return outils.AutoSlots.__new__(mcs, name, bases, attrs)
457 32683096 René Nussbaumer
458 32683096 René Nussbaumer
  @classmethod
459 32683096 René Nussbaumer
  def _GetSlots(mcs, attrs):
460 32683096 René Nussbaumer
    """Build the slots out of OP_PARAMS.
461 32683096 René Nussbaumer

462 32683096 René Nussbaumer
    """
463 65e183af Michael Hanselmann
    # Always set OP_PARAMS to avoid duplicates in BaseOpCode.GetAllParams
464 65e183af Michael Hanselmann
    params = attrs.setdefault("OP_PARAMS", [])
465 65e183af Michael Hanselmann
466 65e183af Michael Hanselmann
    # Use parameter names as slots
467 32683096 René Nussbaumer
    return [pname for (pname, _, _, _) in params]
468 65e183af Michael Hanselmann
469 df458e0b Iustin Pop
470 473d87a3 Iustin Pop
class BaseOpCode(outils.ValidatedSlots):
471 df458e0b Iustin Pop
  """A simple serializable object.
472 df458e0b Iustin Pop

473 0e46916d Iustin Pop
  This object serves as a parent class for OpCode without any custom
474 0e46916d Iustin Pop
  field handling.
475 0e46916d Iustin Pop

476 df458e0b Iustin Pop
  """
477 b459a848 Andrea Spadaccini
  # pylint: disable=E1101
478 e89a9021 Iustin Pop
  # as OP_ID is dynamically defined
479 65e183af Michael Hanselmann
  __metaclass__ = _AutoOpParamSlots
480 65e183af Michael Hanselmann
481 df458e0b Iustin Pop
  def __getstate__(self):
482 a7399f66 Iustin Pop
    """Generic serializer.
483 a7399f66 Iustin Pop

484 a7399f66 Iustin Pop
    This method just returns the contents of the instance as a
485 a7399f66 Iustin Pop
    dictionary.
486 a7399f66 Iustin Pop

487 a7399f66 Iustin Pop
    @rtype:  C{dict}
488 a7399f66 Iustin Pop
    @return: the instance attributes and their values
489 a7399f66 Iustin Pop

490 a7399f66 Iustin Pop
    """
491 df458e0b Iustin Pop
    state = {}
492 32683096 René Nussbaumer
    for name in self.GetAllSlots():
493 df458e0b Iustin Pop
      if hasattr(self, name):
494 df458e0b Iustin Pop
        state[name] = getattr(self, name)
495 df458e0b Iustin Pop
    return state
496 df458e0b Iustin Pop
497 df458e0b Iustin Pop
  def __setstate__(self, state):
498 a7399f66 Iustin Pop
    """Generic unserializer.
499 a7399f66 Iustin Pop

500 a7399f66 Iustin Pop
    This method just restores from the serialized state the attributes
501 a7399f66 Iustin Pop
    of the current instance.
502 a7399f66 Iustin Pop

503 a7399f66 Iustin Pop
    @param state: the serialized opcode data
504 a7399f66 Iustin Pop
    @type state:  C{dict}
505 a7399f66 Iustin Pop

506 a7399f66 Iustin Pop
    """
507 df458e0b Iustin Pop
    if not isinstance(state, dict):
508 df458e0b Iustin Pop
      raise ValueError("Invalid data to __setstate__: expected dict, got %s" %
509 df458e0b Iustin Pop
                       type(state))
510 df458e0b Iustin Pop
511 32683096 René Nussbaumer
    for name in self.GetAllSlots():
512 44db3a6f Iustin Pop
      if name not in state and hasattr(self, name):
513 df458e0b Iustin Pop
        delattr(self, name)
514 df458e0b Iustin Pop
515 df458e0b Iustin Pop
    for name in state:
516 df458e0b Iustin Pop
      setattr(self, name, state[name])
517 df458e0b Iustin Pop
518 adf385c7 Iustin Pop
  @classmethod
519 65e183af Michael Hanselmann
  def GetAllParams(cls):
520 65e183af Michael Hanselmann
    """Compute list of all parameters for an opcode.
521 65e183af Michael Hanselmann

522 65e183af Michael Hanselmann
    """
523 65e183af Michael Hanselmann
    slots = []
524 65e183af Michael Hanselmann
    for parent in cls.__mro__:
525 65e183af Michael Hanselmann
      slots.extend(getattr(parent, "OP_PARAMS", []))
526 65e183af Michael Hanselmann
    return slots
527 65e183af Michael Hanselmann
528 32683096 René Nussbaumer
  def Validate(self, set_defaults): # pylint: disable=W0221
529 1cbef6d8 Michael Hanselmann
    """Validate opcode parameters, optionally setting default values.
530 1cbef6d8 Michael Hanselmann

531 1cbef6d8 Michael Hanselmann
    @type set_defaults: bool
532 1cbef6d8 Michael Hanselmann
    @param set_defaults: Whether to set default values
533 1cbef6d8 Michael Hanselmann
    @raise errors.OpPrereqError: When a parameter value doesn't match
534 1cbef6d8 Michael Hanselmann
                                 requirements
535 1cbef6d8 Michael Hanselmann

536 1cbef6d8 Michael Hanselmann
    """
537 197b323b Michael Hanselmann
    for (attr_name, default, test, _) in self.GetAllParams():
538 1cbef6d8 Michael Hanselmann
      assert test == ht.NoType or callable(test)
539 1cbef6d8 Michael Hanselmann
540 1cbef6d8 Michael Hanselmann
      if not hasattr(self, attr_name):
541 1cbef6d8 Michael Hanselmann
        if default == ht.NoDefault:
542 1cbef6d8 Michael Hanselmann
          raise errors.OpPrereqError("Required parameter '%s.%s' missing" %
543 1cbef6d8 Michael Hanselmann
                                     (self.OP_ID, attr_name),
544 1cbef6d8 Michael Hanselmann
                                     errors.ECODE_INVAL)
545 1cbef6d8 Michael Hanselmann
        elif set_defaults:
546 1cbef6d8 Michael Hanselmann
          if callable(default):
547 1cbef6d8 Michael Hanselmann
            dval = default()
548 1cbef6d8 Michael Hanselmann
          else:
549 1cbef6d8 Michael Hanselmann
            dval = default
550 1cbef6d8 Michael Hanselmann
          setattr(self, attr_name, dval)
551 1cbef6d8 Michael Hanselmann
552 1cbef6d8 Michael Hanselmann
      if test == ht.NoType:
553 1cbef6d8 Michael Hanselmann
        # no tests here
554 1cbef6d8 Michael Hanselmann
        continue
555 1cbef6d8 Michael Hanselmann
556 1cbef6d8 Michael Hanselmann
      if set_defaults or hasattr(self, attr_name):
557 1cbef6d8 Michael Hanselmann
        attr_val = getattr(self, attr_name)
558 1cbef6d8 Michael Hanselmann
        if not test(attr_val):
559 e1ebbfcf Iustin Pop
          logging.error("OpCode %s, parameter %s, has invalid type %s/value"
560 e1ebbfcf Iustin Pop
                        " '%s' expecting type %s",
561 68b2e985 René Nussbaumer
                        self.OP_ID, attr_name, type(attr_val), attr_val, test)
562 1cbef6d8 Michael Hanselmann
          raise errors.OpPrereqError("Parameter '%s.%s' fails validation" %
563 1cbef6d8 Michael Hanselmann
                                     (self.OP_ID, attr_name),
564 1cbef6d8 Michael Hanselmann
                                     errors.ECODE_INVAL)
565 1cbef6d8 Michael Hanselmann
566 df458e0b Iustin Pop
567 b247c6fc Michael Hanselmann
def _BuildJobDepCheck(relative):
568 b247c6fc Michael Hanselmann
  """Builds check for job dependencies (L{DEPEND_ATTR}).
569 b247c6fc Michael Hanselmann

570 b247c6fc Michael Hanselmann
  @type relative: bool
571 b247c6fc Michael Hanselmann
  @param relative: Whether to accept relative job IDs (negative)
572 b247c6fc Michael Hanselmann
  @rtype: callable
573 b247c6fc Michael Hanselmann

574 b247c6fc Michael Hanselmann
  """
575 b247c6fc Michael Hanselmann
  if relative:
576 b247c6fc Michael Hanselmann
    job_id = ht.TOr(ht.TJobId, ht.TRelativeJobId)
577 b247c6fc Michael Hanselmann
  else:
578 b247c6fc Michael Hanselmann
    job_id = ht.TJobId
579 b247c6fc Michael Hanselmann
580 b247c6fc Michael Hanselmann
  job_dep = \
581 dd076c21 Iustin Pop
    ht.TAnd(ht.TOr(ht.TList, ht.TTuple),
582 dd076c21 Iustin Pop
            ht.TIsLength(2),
583 b247c6fc Michael Hanselmann
            ht.TItems([job_id,
584 b247c6fc Michael Hanselmann
                       ht.TListOf(ht.TElemOf(constants.JOBS_FINALIZED))]))
585 b247c6fc Michael Hanselmann
586 ff8067cf Michael Hanselmann
  return ht.TMaybeListOf(job_dep)
587 b247c6fc Michael Hanselmann
588 b247c6fc Michael Hanselmann
589 b247c6fc Michael Hanselmann
TNoRelativeJobDependencies = _BuildJobDepCheck(False)
590 b247c6fc Michael Hanselmann
591 1ce03fb1 Michael Hanselmann
#: List of submission status and job ID as returned by C{SubmitManyJobs}
592 1456df62 Michael Hanselmann
_TJobIdListItem = \
593 1456df62 Michael Hanselmann
  ht.TAnd(ht.TIsLength(2),
594 1456df62 Michael Hanselmann
          ht.TItems([ht.Comment("success")(ht.TBool),
595 1456df62 Michael Hanselmann
                     ht.Comment("Job ID if successful, error message"
596 1456df62 Michael Hanselmann
                                " otherwise")(ht.TOr(ht.TString,
597 1456df62 Michael Hanselmann
                                                     ht.TJobId))]))
598 1456df62 Michael Hanselmann
TJobIdList = ht.TListOf(_TJobIdListItem)
599 1ce03fb1 Michael Hanselmann
600 f7686867 Michael Hanselmann
#: Result containing only list of submitted jobs
601 f7686867 Michael Hanselmann
TJobIdListOnly = ht.TStrictDict(True, True, {
602 1456df62 Michael Hanselmann
  constants.JOB_IDS_KEY: ht.Comment("List of submitted jobs")(TJobIdList),
603 f7686867 Michael Hanselmann
  })
604 f7686867 Michael Hanselmann
605 b247c6fc Michael Hanselmann
606 0e46916d Iustin Pop
class OpCode(BaseOpCode):
607 a7399f66 Iustin Pop
  """Abstract OpCode.
608 a7399f66 Iustin Pop

609 a7399f66 Iustin Pop
  This is the root of the actual OpCode hierarchy. All clases derived
610 a7399f66 Iustin Pop
  from this class should override OP_ID.
611 a7399f66 Iustin Pop

612 a7399f66 Iustin Pop
  @cvar OP_ID: The ID of this opcode. This should be unique amongst all
613 20777413 Iustin Pop
               children of this class.
614 bde8f481 Adeodato Simo
  @cvar OP_DSC_FIELD: The name of a field whose value will be included in the
615 bde8f481 Adeodato Simo
                      string returned by Summary(); see the docstring of that
616 bde8f481 Adeodato Simo
                      method for details).
617 8bc17ebb Iustin Pop
  @cvar OP_DSC_FORMATTER: A callable that should format the OP_DSC_FIELD; if
618 8bc17ebb Iustin Pop
                          not present, then the field will be simply converted
619 8bc17ebb Iustin Pop
                          to string
620 65e183af Michael Hanselmann
  @cvar OP_PARAMS: List of opcode attributes, the default values they should
621 65e183af Michael Hanselmann
                   get if not already defined, and types they must match.
622 1ce03fb1 Michael Hanselmann
  @cvar OP_RESULT: Callable to verify opcode result
623 687c10d9 Iustin Pop
  @cvar WITH_LU: Boolean that specifies whether this should be included in
624 687c10d9 Iustin Pop
      mcpu's dispatch table
625 20777413 Iustin Pop
  @ivar dry_run: Whether the LU should be run in dry-run mode, i.e. just
626 20777413 Iustin Pop
                 the check steps
627 8f5c488d Michael Hanselmann
  @ivar priority: Opcode priority for queue
628 a7399f66 Iustin Pop

629 a7399f66 Iustin Pop
  """
630 b459a848 Andrea Spadaccini
  # pylint: disable=E1101
631 e89a9021 Iustin Pop
  # as OP_ID is dynamically defined
632 687c10d9 Iustin Pop
  WITH_LU = True
633 65e183af Michael Hanselmann
  OP_PARAMS = [
634 45d4c81c Michael Hanselmann
    ("dry_run", None, ht.TMaybeBool, "Run checks only, don't execute"),
635 fd9f58fd Iustin Pop
    ("debug_level", None, ht.TMaybe(ht.TNonNegativeInt), "Debug level"),
636 65e183af Michael Hanselmann
    ("priority", constants.OP_PRIO_DEFAULT,
637 45d4c81c Michael Hanselmann
     ht.TElemOf(constants.OP_PRIO_SUBMIT_VALID), "Opcode priority"),
638 b247c6fc Michael Hanselmann
    (DEPEND_ATTR, None, _BuildJobDepCheck(True),
639 b247c6fc Michael Hanselmann
     "Job dependencies; if used through ``SubmitManyJobs`` relative (negative)"
640 822a50c4 Michael Hanselmann
     " job IDs can be used; see :doc:`design document <design-chained-jobs>`"
641 822a50c4 Michael Hanselmann
     " for details"),
642 018ae30b Michael Hanselmann
    (COMMENT_ATTR, None, ht.TMaybeString,
643 018ae30b Michael Hanselmann
     "Comment describing the purpose of the opcode"),
644 65e183af Michael Hanselmann
    ]
645 1ce03fb1 Michael Hanselmann
  OP_RESULT = None
646 df458e0b Iustin Pop
647 df458e0b Iustin Pop
  def __getstate__(self):
648 df458e0b Iustin Pop
    """Specialized getstate for opcodes.
649 df458e0b Iustin Pop

650 a7399f66 Iustin Pop
    This method adds to the state dictionary the OP_ID of the class,
651 a7399f66 Iustin Pop
    so that on unload we can identify the correct class for
652 a7399f66 Iustin Pop
    instantiating the opcode.
653 a7399f66 Iustin Pop

654 a7399f66 Iustin Pop
    @rtype:   C{dict}
655 a7399f66 Iustin Pop
    @return:  the state as a dictionary
656 a7399f66 Iustin Pop

657 df458e0b Iustin Pop
    """
658 0e46916d Iustin Pop
    data = BaseOpCode.__getstate__(self)
659 df458e0b Iustin Pop
    data["OP_ID"] = self.OP_ID
660 df458e0b Iustin Pop
    return data
661 df458e0b Iustin Pop
662 df458e0b Iustin Pop
  @classmethod
663 00abdc96 Iustin Pop
  def LoadOpCode(cls, data):
664 df458e0b Iustin Pop
    """Generic load opcode method.
665 df458e0b Iustin Pop

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

670 a7399f66 Iustin Pop
    @type data:  C{dict}
671 a7399f66 Iustin Pop
    @param data: the serialized opcode
672 a7399f66 Iustin Pop

673 df458e0b Iustin Pop
    """
674 df458e0b Iustin Pop
    if not isinstance(data, dict):
675 df458e0b Iustin Pop
      raise ValueError("Invalid data to LoadOpCode (%s)" % type(data))
676 df458e0b Iustin Pop
    if "OP_ID" not in data:
677 df458e0b Iustin Pop
      raise ValueError("Invalid data to LoadOpcode, missing OP_ID")
678 df458e0b Iustin Pop
    op_id = data["OP_ID"]
679 df458e0b Iustin Pop
    op_class = None
680 363acb1e Iustin Pop
    if op_id in OP_MAPPING:
681 363acb1e Iustin Pop
      op_class = OP_MAPPING[op_id]
682 363acb1e Iustin Pop
    else:
683 df458e0b Iustin Pop
      raise ValueError("Invalid data to LoadOpCode: OP_ID %s unsupported" %
684 df458e0b Iustin Pop
                       op_id)
685 df458e0b Iustin Pop
    op = op_class()
686 df458e0b Iustin Pop
    new_data = data.copy()
687 df458e0b Iustin Pop
    del new_data["OP_ID"]
688 df458e0b Iustin Pop
    op.__setstate__(new_data)
689 df458e0b Iustin Pop
    return op
690 df458e0b Iustin Pop
691 60dd1473 Iustin Pop
  def Summary(self):
692 60dd1473 Iustin Pop
    """Generates a summary description of this opcode.
693 60dd1473 Iustin Pop

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

700 60dd1473 Iustin Pop
    """
701 ff0d18e6 Iustin Pop
    assert self.OP_ID is not None and len(self.OP_ID) > 3
702 60dd1473 Iustin Pop
    # all OP_ID start with OP_, we remove that
703 60dd1473 Iustin Pop
    txt = self.OP_ID[3:]
704 60dd1473 Iustin Pop
    field_name = getattr(self, "OP_DSC_FIELD", None)
705 60dd1473 Iustin Pop
    if field_name:
706 60dd1473 Iustin Pop
      field_value = getattr(self, field_name, None)
707 8bc17ebb Iustin Pop
      field_formatter = getattr(self, "OP_DSC_FORMATTER", None)
708 8bc17ebb Iustin Pop
      if callable(field_formatter):
709 8bc17ebb Iustin Pop
        field_value = field_formatter(field_value)
710 8bc17ebb Iustin Pop
      elif isinstance(field_value, (list, tuple)):
711 bc8bbda1 Iustin Pop
        field_value = ",".join(str(i) for i in field_value)
712 60dd1473 Iustin Pop
      txt = "%s(%s)" % (txt, field_value)
713 60dd1473 Iustin Pop
    return txt
714 60dd1473 Iustin Pop
715 3ce9a5e7 Michael Hanselmann
  def TinySummary(self):
716 3ce9a5e7 Michael Hanselmann
    """Generates a compact summary description of the opcode.
717 3ce9a5e7 Michael Hanselmann

718 3ce9a5e7 Michael Hanselmann
    """
719 3ce9a5e7 Michael Hanselmann
    assert self.OP_ID.startswith("OP_")
720 3ce9a5e7 Michael Hanselmann
721 3ce9a5e7 Michael Hanselmann
    text = self.OP_ID[3:]
722 3ce9a5e7 Michael Hanselmann
723 3ce9a5e7 Michael Hanselmann
    for (prefix, supplement) in _SUMMARY_PREFIX.items():
724 3ce9a5e7 Michael Hanselmann
      if text.startswith(prefix):
725 3ce9a5e7 Michael Hanselmann
        return supplement + text[len(prefix):]
726 3ce9a5e7 Michael Hanselmann
727 3ce9a5e7 Michael Hanselmann
    return text
728 3ce9a5e7 Michael Hanselmann
729 a8083063 Iustin Pop
730 afee0879 Iustin Pop
# cluster opcodes
731 afee0879 Iustin Pop
732 bc84ffa7 Iustin Pop
class OpClusterPostInit(OpCode):
733 b5f5fae9 Luca Bigliardi
  """Post cluster initialization.
734 b5f5fae9 Luca Bigliardi

735 b5f5fae9 Luca Bigliardi
  This opcode does not touch the cluster at all. Its purpose is to run hooks
736 b5f5fae9 Luca Bigliardi
  after the cluster has been initialized.
737 b5f5fae9 Luca Bigliardi

738 b5f5fae9 Luca Bigliardi
  """
739 c363310d René Nussbaumer
  OP_RESULT = ht.TBool
740 b5f5fae9 Luca Bigliardi
741 b5f5fae9 Luca Bigliardi
742 c6d43e9e Iustin Pop
class OpClusterDestroy(OpCode):
743 a7399f66 Iustin Pop
  """Destroy the cluster.
744 a7399f66 Iustin Pop

745 a7399f66 Iustin Pop
  This opcode has no other parameters. All the state is irreversibly
746 a7399f66 Iustin Pop
  lost after the execution of this opcode.
747 a7399f66 Iustin Pop

748 a7399f66 Iustin Pop
  """
749 c363310d René Nussbaumer
  OP_RESULT = ht.TNonEmptyString
750 a8083063 Iustin Pop
751 a8083063 Iustin Pop
752 a2f7ab92 Iustin Pop
class OpClusterQuery(OpCode):
753 fdc267f4 Iustin Pop
  """Query cluster information."""
754 415feb2e René Nussbaumer
  OP_RESULT = ht.TDictOf(ht.TNonEmptyString, ht.TAny)
755 a8083063 Iustin Pop
756 a8083063 Iustin Pop
757 fcad7225 Michael Hanselmann
class OpClusterVerify(OpCode):
758 fcad7225 Michael Hanselmann
  """Submits all jobs necessary to verify the cluster.
759 fcad7225 Michael Hanselmann

760 fcad7225 Michael Hanselmann
  """
761 fcad7225 Michael Hanselmann
  OP_PARAMS = [
762 fcad7225 Michael Hanselmann
    _PDebugSimulateErrors,
763 fcad7225 Michael Hanselmann
    _PErrorCodes,
764 fcad7225 Michael Hanselmann
    _PSkipChecks,
765 93f2399e Andrea Spadaccini
    _PIgnoreErrors,
766 fcad7225 Michael Hanselmann
    _PVerbose,
767 3c286190 Dimitris Aragiorgis
    ("group_name", None, ht.TMaybeString, "Group to verify"),
768 fcad7225 Michael Hanselmann
    ]
769 f7686867 Michael Hanselmann
  OP_RESULT = TJobIdListOnly
770 fcad7225 Michael Hanselmann
771 fcad7225 Michael Hanselmann
772 bf93ae69 Adeodato Simo
class OpClusterVerifyConfig(OpCode):
773 bf93ae69 Adeodato Simo
  """Verify the cluster config.
774 bf93ae69 Adeodato Simo

775 bf93ae69 Adeodato Simo
  """
776 bf93ae69 Adeodato Simo
  OP_PARAMS = [
777 57106b74 Michael Hanselmann
    _PDebugSimulateErrors,
778 57106b74 Michael Hanselmann
    _PErrorCodes,
779 93f2399e Andrea Spadaccini
    _PIgnoreErrors,
780 57106b74 Michael Hanselmann
    _PVerbose,
781 bf93ae69 Adeodato Simo
    ]
782 f7686867 Michael Hanselmann
  OP_RESULT = ht.TBool
783 bf93ae69 Adeodato Simo
784 bf93ae69 Adeodato Simo
785 bf93ae69 Adeodato Simo
class OpClusterVerifyGroup(OpCode):
786 bf93ae69 Adeodato Simo
  """Run verify on a node group from the cluster.
787 a7399f66 Iustin Pop

788 a7399f66 Iustin Pop
  @type skip_checks: C{list}
789 a7399f66 Iustin Pop
  @ivar skip_checks: steps to be skipped from the verify process; this
790 a7399f66 Iustin Pop
                     needs to be a subset of
791 a7399f66 Iustin Pop
                     L{constants.VERIFY_OPTIONAL_CHECKS}; currently
792 a7399f66 Iustin Pop
                     only L{constants.VERIFY_NPLUSONE_MEM} can be passed
793 a7399f66 Iustin Pop

794 a7399f66 Iustin Pop
  """
795 bf93ae69 Adeodato Simo
  OP_DSC_FIELD = "group_name"
796 65e183af Michael Hanselmann
  OP_PARAMS = [
797 57106b74 Michael Hanselmann
    _PGroupName,
798 57106b74 Michael Hanselmann
    _PDebugSimulateErrors,
799 57106b74 Michael Hanselmann
    _PErrorCodes,
800 57106b74 Michael Hanselmann
    _PSkipChecks,
801 93f2399e Andrea Spadaccini
    _PIgnoreErrors,
802 57106b74 Michael Hanselmann
    _PVerbose,
803 65e183af Michael Hanselmann
    ]
804 f7686867 Michael Hanselmann
  OP_RESULT = ht.TBool
805 a8083063 Iustin Pop
806 a8083063 Iustin Pop
807 bd8210a7 Iustin Pop
class OpClusterVerifyDisks(OpCode):
808 150e978f Iustin Pop
  """Verify the cluster disks.
809 150e978f Iustin Pop

810 ae1a845c Michael Hanselmann
  """
811 f7686867 Michael Hanselmann
  OP_RESULT = TJobIdListOnly
812 ae1a845c Michael Hanselmann
813 ae1a845c Michael Hanselmann
814 ae1a845c Michael Hanselmann
class OpGroupVerifyDisks(OpCode):
815 ae1a845c Michael Hanselmann
  """Verifies the status of all disks in a node group.
816 150e978f Iustin Pop

817 ae1a845c Michael Hanselmann
  Result: a tuple of three elements:
818 ae1a845c Michael Hanselmann
    - dict of node names with issues (values: error msg)
819 150e978f Iustin Pop
    - list of instances with degraded disks (that should be activated)
820 b63ed789 Iustin Pop
    - dict of instances with missing logical volumes (values: (node, vol)
821 b63ed789 Iustin Pop
      pairs with details about the missing volumes)
822 150e978f Iustin Pop

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

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

831 150e978f Iustin Pop
  """
832 ae1a845c Michael Hanselmann
  OP_DSC_FIELD = "group_name"
833 ae1a845c Michael Hanselmann
  OP_PARAMS = [
834 ae1a845c Michael Hanselmann
    _PGroupName,
835 ae1a845c Michael Hanselmann
    ]
836 1ce03fb1 Michael Hanselmann
  OP_RESULT = \
837 1ce03fb1 Michael Hanselmann
    ht.TAnd(ht.TIsLength(3),
838 1ce03fb1 Michael Hanselmann
            ht.TItems([ht.TDictOf(ht.TString, ht.TString),
839 1ce03fb1 Michael Hanselmann
                       ht.TListOf(ht.TString),
840 6973587f Michael Hanselmann
                       ht.TDictOf(ht.TString,
841 6973587f Michael Hanselmann
                                  ht.TListOf(ht.TListOf(ht.TString)))]))
842 150e978f Iustin Pop
843 150e978f Iustin Pop
844 5d01aca3 Iustin Pop
class OpClusterRepairDiskSizes(OpCode):
845 60975797 Iustin Pop
  """Verify the disk sizes of the instances and fixes configuration
846 60975797 Iustin Pop
  mimatches.
847 60975797 Iustin Pop

848 60975797 Iustin Pop
  Parameters: optional instances list, in case we want to restrict the
849 60975797 Iustin Pop
  checks to only a subset of the instances.
850 60975797 Iustin Pop

851 60975797 Iustin Pop
  Result: a list of tuples, (instance, disk, new-size) for changed
852 60975797 Iustin Pop
  configurations.
853 60975797 Iustin Pop

854 60975797 Iustin Pop
  In normal operation, the list should be empty.
855 60975797 Iustin Pop

856 60975797 Iustin Pop
  @type instances: list
857 60975797 Iustin Pop
  @ivar instances: the list of instances to check, or empty for all instances
858 60975797 Iustin Pop

859 60975797 Iustin Pop
  """
860 65e183af Michael Hanselmann
  OP_PARAMS = [
861 197b323b Michael Hanselmann
    ("instances", ht.EmptyList, ht.TListOf(ht.TNonEmptyString), None),
862 65e183af Michael Hanselmann
    ]
863 c363310d René Nussbaumer
  OP_RESULT = ht.TListOf(ht.TAnd(ht.TIsLength(3),
864 c363310d René Nussbaumer
                                 ht.TItems([ht.TNonEmptyString,
865 2c9fa1ff Iustin Pop
                                            ht.TNonNegativeInt,
866 2c9fa1ff Iustin Pop
                                            ht.TNonNegativeInt])))
867 60975797 Iustin Pop
868 60975797 Iustin Pop
869 2f093ea0 Iustin Pop
class OpClusterConfigQuery(OpCode):
870 ae5849b5 Michael Hanselmann
  """Query cluster configuration values."""
871 65e183af Michael Hanselmann
  OP_PARAMS = [
872 3c286190 Dimitris Aragiorgis
    _POutputFields,
873 65e183af Michael Hanselmann
    ]
874 c363310d René Nussbaumer
  OP_RESULT = ht.TListOf(ht.TAny)
875 a8083063 Iustin Pop
876 a8083063 Iustin Pop
877 e126df25 Iustin Pop
class OpClusterRename(OpCode):
878 a7399f66 Iustin Pop
  """Rename the cluster.
879 a7399f66 Iustin Pop

880 a7399f66 Iustin Pop
  @type name: C{str}
881 a7399f66 Iustin Pop
  @ivar name: The new name of the cluster. The name and/or the master IP
882 a7399f66 Iustin Pop
              address will be changed to match the new name and its IP
883 a7399f66 Iustin Pop
              address.
884 a7399f66 Iustin Pop

885 a7399f66 Iustin Pop
  """
886 60dd1473 Iustin Pop
  OP_DSC_FIELD = "name"
887 65e183af Michael Hanselmann
  OP_PARAMS = [
888 197b323b Michael Hanselmann
    ("name", ht.NoDefault, ht.TNonEmptyString, None),
889 65e183af Michael Hanselmann
    ]
890 c363310d René Nussbaumer
  OP_RESULT = ht.TNonEmptyString
891 07bd8a51 Iustin Pop
892 07bd8a51 Iustin Pop
893 a6682fdc Iustin Pop
class OpClusterSetParams(OpCode):
894 a7399f66 Iustin Pop
  """Change the parameters of the cluster.
895 a7399f66 Iustin Pop

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

899 a7399f66 Iustin Pop
  """
900 65e183af Michael Hanselmann
  OP_PARAMS = [
901 2da9f556 René Nussbaumer
    _PHvState,
902 2da9f556 René Nussbaumer
    _PDiskState,
903 fd9f58fd Iustin Pop
    ("vg_name", None, ht.TMaybe(ht.TString), "Volume group name"),
904 65e183af Michael Hanselmann
    ("enabled_hypervisors", None,
905 fd9f58fd Iustin Pop
     ht.TMaybe(ht.TAnd(ht.TListOf(ht.TElemOf(constants.HYPER_TYPES)),
906 fd9f58fd Iustin Pop
                       ht.TTrue)),
907 45d4c81c Michael Hanselmann
     "List of enabled hypervisors"),
908 a138ead7 Michael Hanselmann
    ("hvparams", None,
909 fd9f58fd Iustin Pop
     ht.TMaybe(ht.TDictOf(ht.TNonEmptyString, ht.TDict)),
910 45d4c81c Michael Hanselmann
     "Cluster-wide hypervisor parameter defaults, hypervisor-dependent"),
911 fd9f58fd Iustin Pop
    ("beparams", None, ht.TMaybeDict,
912 45d4c81c Michael Hanselmann
     "Cluster-wide backend parameter defaults"),
913 fd9f58fd Iustin Pop
    ("os_hvp", None, ht.TMaybe(ht.TDictOf(ht.TNonEmptyString, ht.TDict)),
914 45d4c81c Michael Hanselmann
     "Cluster-wide per-OS hypervisor parameter defaults"),
915 a138ead7 Michael Hanselmann
    ("osparams", None,
916 fd9f58fd Iustin Pop
     ht.TMaybe(ht.TDictOf(ht.TNonEmptyString, ht.TDict)),
917 45d4c81c Michael Hanselmann
     "Cluster-wide OS parameter defaults"),
918 bc5d0215 Andrea Spadaccini
    _PDiskParams,
919 fd9f58fd Iustin Pop
    ("candidate_pool_size", None, ht.TMaybe(ht.TPositiveInt),
920 45d4c81c Michael Hanselmann
     "Master candidate pool size"),
921 45d4c81c Michael Hanselmann
    ("uid_pool", None, ht.NoType,
922 45d4c81c Michael Hanselmann
     "Set UID pool, must be list of lists describing UID ranges (two items,"
923 45d4c81c Michael Hanselmann
     " start and end inclusive)"),
924 45d4c81c Michael Hanselmann
    ("add_uids", None, ht.NoType,
925 45d4c81c Michael Hanselmann
     "Extend UID pool, must be list of lists describing UID ranges (two"
926 45d4c81c Michael Hanselmann
     " items, start and end inclusive) to be added"),
927 45d4c81c Michael Hanselmann
    ("remove_uids", None, ht.NoType,
928 45d4c81c Michael Hanselmann
     "Shrink UID pool, must be list of lists describing UID ranges (two"
929 45d4c81c Michael Hanselmann
     " items, start and end inclusive) to be removed"),
930 45d4c81c Michael Hanselmann
    ("maintain_node_health", None, ht.TMaybeBool,
931 45d4c81c Michael Hanselmann
     "Whether to automatically maintain node health"),
932 45d4c81c Michael Hanselmann
    ("prealloc_wipe_disks", None, ht.TMaybeBool,
933 45d4c81c Michael Hanselmann
     "Whether to wipe disks before allocating them to instances"),
934 45d4c81c Michael Hanselmann
    ("nicparams", None, ht.TMaybeDict, "Cluster-wide NIC parameter defaults"),
935 45d4c81c Michael Hanselmann
    ("ndparams", None, ht.TMaybeDict, "Cluster-wide node parameter defaults"),
936 1b01390b René Nussbaumer
    ("ipolicy", None, ht.TMaybeDict,
937 1b01390b René Nussbaumer
     "Cluster-wide :ref:`instance policy <rapi-ipolicy>` specs"),
938 fd9f58fd Iustin Pop
    ("drbd_helper", None, ht.TMaybe(ht.TString), "DRBD helper program"),
939 fd9f58fd Iustin Pop
    ("default_iallocator", None, ht.TMaybe(ht.TString),
940 45d4c81c Michael Hanselmann
     "Default iallocator for cluster"),
941 fd9f58fd Iustin Pop
    ("master_netdev", None, ht.TMaybe(ht.TString),
942 45d4c81c Michael Hanselmann
     "Master network device"),
943 fd9f58fd Iustin Pop
    ("master_netmask", None, ht.TMaybe(ht.TNonNegativeInt),
944 5a8648eb Andrea Spadaccini
     "Netmask of the master IP"),
945 ff8067cf Michael Hanselmann
    ("reserved_lvs", None, ht.TMaybeListOf(ht.TNonEmptyString),
946 45d4c81c Michael Hanselmann
     "List of reserved LVs"),
947 45d4c81c Michael Hanselmann
    ("hidden_os", None, _TestClusterOsList,
948 0fb66bb1 Iustin Pop
     "Modify list of hidden operating systems: each modification must have"
949 0fb66bb1 Iustin Pop
     " two items, the operation and the OS name; the operation can be"
950 0fb66bb1 Iustin Pop
     " ``%s`` or ``%s``" % (constants.DDM_ADD, constants.DDM_REMOVE)),
951 45d4c81c Michael Hanselmann
    ("blacklisted_os", None, _TestClusterOsList,
952 0fb66bb1 Iustin Pop
     "Modify list of blacklisted operating systems: each modification must"
953 0fb66bb1 Iustin Pop
     " have two items, the operation and the OS name; the operation can be"
954 0fb66bb1 Iustin Pop
     " ``%s`` or ``%s``" % (constants.DDM_ADD, constants.DDM_REMOVE)),
955 bf689b7a Andrea Spadaccini
    ("use_external_mip_script", None, ht.TMaybeBool,
956 bf689b7a Andrea Spadaccini
     "Whether to use an external master IP address setup script"),
957 c270ee07 Helga Velroyen
    ("enabled_storage_types", None,
958 c270ee07 Helga Velroyen
     ht.TMaybe(ht.TAnd(ht.TListOf(ht.TElemOf(constants.VALID_STORAGE_TYPES)),
959 c270ee07 Helga Velroyen
                       ht.TTrue)),
960 c270ee07 Helga Velroyen
     "List of enabled storage types"),
961 4b7735f9 Iustin Pop
    ]
962 c363310d René Nussbaumer
  OP_RESULT = ht.TNone
963 12515db7 Manuel Franceschini
964 12515db7 Manuel Franceschini
965 d1240007 Iustin Pop
class OpClusterRedistConf(OpCode):
966 afee0879 Iustin Pop
  """Force a full push of the cluster configuration.
967 afee0879 Iustin Pop

968 afee0879 Iustin Pop
  """
969 c363310d René Nussbaumer
  OP_RESULT = ht.TNone
970 afee0879 Iustin Pop
971 83f72637 Michael Hanselmann
972 fb926117 Andrea Spadaccini
class OpClusterActivateMasterIp(OpCode):
973 fb926117 Andrea Spadaccini
  """Activate the master IP on the master node.
974 fb926117 Andrea Spadaccini

975 fb926117 Andrea Spadaccini
  """
976 c363310d René Nussbaumer
  OP_RESULT = ht.TNone
977 fb926117 Andrea Spadaccini
978 fb926117 Andrea Spadaccini
979 fb926117 Andrea Spadaccini
class OpClusterDeactivateMasterIp(OpCode):
980 fb926117 Andrea Spadaccini
  """Deactivate the master IP on the master node.
981 fb926117 Andrea Spadaccini

982 fb926117 Andrea Spadaccini
  """
983 c363310d René Nussbaumer
  OP_RESULT = ht.TNone
984 fb926117 Andrea Spadaccini
985 fb926117 Andrea Spadaccini
986 83f72637 Michael Hanselmann
class OpQuery(OpCode):
987 83f72637 Michael Hanselmann
  """Query for resources/items.
988 83f72637 Michael Hanselmann

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

993 83f72637 Michael Hanselmann
  """
994 e50d8412 Michael Hanselmann
  OP_DSC_FIELD = "what"
995 65e183af Michael Hanselmann
  OP_PARAMS = [
996 8e7078e0 Michael Hanselmann
    _PQueryWhat,
997 ee13764f Michael Hanselmann
    _PUseLocking,
998 45d4c81c Michael Hanselmann
    ("fields", ht.NoDefault, ht.TListOf(ht.TNonEmptyString),
999 45d4c81c Michael Hanselmann
     "Requested fields"),
1000 fd9f58fd Iustin Pop
    ("qfilter", None, ht.TMaybe(ht.TList),
1001 45d4c81c Michael Hanselmann
     "Query filter"),
1002 83f72637 Michael Hanselmann
    ]
1003 415feb2e René Nussbaumer
  OP_RESULT = \
1004 b02c6bdf Michael Hanselmann
    _GenerateObjectTypeCheck(objects.QueryResponse, {
1005 b02c6bdf Michael Hanselmann
      "fields": ht.TListOf(_TQueryFieldDef),
1006 b02c6bdf Michael Hanselmann
      "data": _TQueryResult,
1007 b02c6bdf Michael Hanselmann
      })
1008 83f72637 Michael Hanselmann
1009 83f72637 Michael Hanselmann
1010 83f72637 Michael Hanselmann
class OpQueryFields(OpCode):
1011 83f72637 Michael Hanselmann
  """Query for available resource/item fields.
1012 83f72637 Michael Hanselmann

1013 abd66bf8 Michael Hanselmann
  @ivar what: Resources to query for, must be one of L{constants.QR_VIA_OP}
1014 83f72637 Michael Hanselmann
  @ivar fields: List of fields to retrieve
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 ff8067cf Michael Hanselmann
    ("fields", None, ht.TMaybeListOf(ht.TNonEmptyString),
1021 8e7078e0 Michael Hanselmann
     "Requested fields; if not given, all are returned"),
1022 83f72637 Michael Hanselmann
    ]
1023 415feb2e René Nussbaumer
  OP_RESULT = \
1024 b02c6bdf Michael Hanselmann
    _GenerateObjectTypeCheck(objects.QueryFieldsResponse, {
1025 b02c6bdf Michael Hanselmann
      "fields": ht.TListOf(_TQueryFieldDef),
1026 b02c6bdf Michael Hanselmann
      })
1027 83f72637 Michael Hanselmann
1028 83f72637 Michael Hanselmann
1029 792af3ad René Nussbaumer
class OpOobCommand(OpCode):
1030 eb64da59 René Nussbaumer
  """Interact with OOB."""
1031 65e183af Michael Hanselmann
  OP_PARAMS = [
1032 c4ec0755 René Nussbaumer
    ("node_names", ht.EmptyList, ht.TListOf(ht.TNonEmptyString),
1033 c4ec0755 René Nussbaumer
     "List of nodes to run the OOB command against"),
1034 70296981 Iustin Pop
    ("command", ht.NoDefault, ht.TElemOf(constants.OOB_COMMANDS),
1035 c4ec0755 René Nussbaumer
     "OOB command to be run"),
1036 c4ec0755 René Nussbaumer
    ("timeout", constants.OOB_TIMEOUT, ht.TInt,
1037 c4ec0755 René Nussbaumer
     "Timeout before the OOB helper will be terminated"),
1038 c4ec0755 René Nussbaumer
    ("ignore_status", False, ht.TBool,
1039 c4ec0755 René Nussbaumer
     "Ignores the node offline status for power off"),
1040 2c9fa1ff Iustin Pop
    ("power_delay", constants.OOB_POWER_DELAY, ht.TNonNegativeFloat,
1041 beff3779 René Nussbaumer
     "Time in seconds to wait between powering on nodes"),
1042 eb64da59 René Nussbaumer
    ]
1043 c363310d René Nussbaumer
  # Fixme: Make it more specific with all the special cases in LUOobCommand
1044 415feb2e René Nussbaumer
  OP_RESULT = _TQueryResult
1045 eb64da59 René Nussbaumer
1046 eb64da59 René Nussbaumer
1047 e4d745a7 Michael Hanselmann
class OpRestrictedCommand(OpCode):
1048 e4d745a7 Michael Hanselmann
  """Runs a restricted command on node(s).
1049 e4d745a7 Michael Hanselmann

1050 e4d745a7 Michael Hanselmann
  """
1051 e4d745a7 Michael Hanselmann
  OP_PARAMS = [
1052 e4d745a7 Michael Hanselmann
    _PUseLocking,
1053 e4d745a7 Michael Hanselmann
    ("nodes", ht.NoDefault, ht.TListOf(ht.TNonEmptyString),
1054 e4d745a7 Michael Hanselmann
     "Nodes on which the command should be run (at least one)"),
1055 e4d745a7 Michael Hanselmann
    ("command", ht.NoDefault, ht.TNonEmptyString,
1056 e4d745a7 Michael Hanselmann
     "Command name (no parameters)"),
1057 e4d745a7 Michael Hanselmann
    ]
1058 e4d745a7 Michael Hanselmann
1059 e4d745a7 Michael Hanselmann
  _RESULT_ITEMS = [
1060 e4d745a7 Michael Hanselmann
    ht.Comment("success")(ht.TBool),
1061 e4d745a7 Michael Hanselmann
    ht.Comment("output or error message")(ht.TString),
1062 e4d745a7 Michael Hanselmann
    ]
1063 e4d745a7 Michael Hanselmann
1064 e4d745a7 Michael Hanselmann
  OP_RESULT = \
1065 e4d745a7 Michael Hanselmann
    ht.TListOf(ht.TAnd(ht.TIsLength(len(_RESULT_ITEMS)),
1066 e4d745a7 Michael Hanselmann
                       ht.TItems(_RESULT_ITEMS)))
1067 e4d745a7 Michael Hanselmann
1068 e4d745a7 Michael Hanselmann
1069 07bd8a51 Iustin Pop
# node opcodes
1070 07bd8a51 Iustin Pop
1071 73d565a3 Iustin Pop
class OpNodeRemove(OpCode):
1072 a7399f66 Iustin Pop
  """Remove a node.
1073 a7399f66 Iustin Pop

1074 a7399f66 Iustin Pop
  @type node_name: C{str}
1075 a7399f66 Iustin Pop
  @ivar node_name: The name of the node to remove. If the node still has
1076 a7399f66 Iustin Pop
                   instances on it, the operation will fail.
1077 a7399f66 Iustin Pop

1078 a7399f66 Iustin Pop
  """
1079 60dd1473 Iustin Pop
  OP_DSC_FIELD = "node_name"
1080 65e183af Michael Hanselmann
  OP_PARAMS = [
1081 65e183af Michael Hanselmann
    _PNodeName,
1082 65e183af Michael Hanselmann
    ]
1083 c363310d René Nussbaumer
  OP_RESULT = ht.TNone
1084 a8083063 Iustin Pop
1085 a8083063 Iustin Pop
1086 d817d49f Iustin Pop
class OpNodeAdd(OpCode):
1087 a7399f66 Iustin Pop
  """Add a node to the cluster.
1088 a7399f66 Iustin Pop

1089 a7399f66 Iustin Pop
  @type node_name: C{str}
1090 a7399f66 Iustin Pop
  @ivar node_name: The name of the node to add. This can be a short name,
1091 a7399f66 Iustin Pop
                   but it will be expanded to the FQDN.
1092 a7399f66 Iustin Pop
  @type primary_ip: IP address
1093 a7399f66 Iustin Pop
  @ivar primary_ip: The primary IP of the node. This will be ignored when the
1094 a7399f66 Iustin Pop
                    opcode is submitted, but will be filled during the node
1095 a7399f66 Iustin Pop
                    add (so it will be visible in the job query).
1096 a7399f66 Iustin Pop
  @type secondary_ip: IP address
1097 a7399f66 Iustin Pop
  @ivar secondary_ip: The secondary IP of the node. This needs to be passed
1098 a7399f66 Iustin Pop
                      if the cluster has been initialized in 'dual-network'
1099 a7399f66 Iustin Pop
                      mode, otherwise it must not be given.
1100 a7399f66 Iustin Pop
  @type readd: C{bool}
1101 a7399f66 Iustin Pop
  @ivar readd: Whether to re-add an existing node to the cluster. If
1102 a7399f66 Iustin Pop
               this is not passed, then the operation will abort if the node
1103 a7399f66 Iustin Pop
               name is already in the cluster; use this parameter to 'repair'
1104 a7399f66 Iustin Pop
               a node that had its configuration broken, or was reinstalled
1105 a7399f66 Iustin Pop
               without removal from the cluster.
1106 f936c153 Iustin Pop
  @type group: C{str}
1107 f936c153 Iustin Pop
  @ivar group: The node group to which this node will belong.
1108 fd3d37b6 Iustin Pop
  @type vm_capable: C{bool}
1109 fd3d37b6 Iustin Pop
  @ivar vm_capable: The vm_capable node attribute
1110 fd3d37b6 Iustin Pop
  @type master_capable: C{bool}
1111 fd3d37b6 Iustin Pop
  @ivar master_capable: The master_capable node attribute
1112 a7399f66 Iustin Pop

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

1262 9bf56d77 Michael Hanselmann
  @ivar instance_name: Instance name
1263 9bf56d77 Michael Hanselmann
  @ivar mode: Instance creation mode (one of L{constants.INSTANCE_CREATE_MODES})
1264 9bf56d77 Michael Hanselmann
  @ivar source_handshake: Signed handshake from source (remote import only)
1265 9bf56d77 Michael Hanselmann
  @ivar source_x509_ca: Source X509 CA in PEM format (remote import only)
1266 9bf56d77 Michael Hanselmann
  @ivar source_instance_name: Previous name of instance (remote import only)
1267 dae91d02 Michael Hanselmann
  @ivar source_shutdown_timeout: Shutdown timeout used for source instance
1268 dae91d02 Michael Hanselmann
    (remote import only)
1269 9bf56d77 Michael Hanselmann

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

1336 12e62af5 René Nussbaumer
  """
1337 12e62af5 René Nussbaumer
  OP_PARAMS = [
1338 1f1188c3 Michael Hanselmann
    _POpportunisticLocking,
1339 89514061 Iustin Pop
    _PIAllocFromDesc("Iallocator used to allocate all the instances"),
1340 4c405df7 Iustin Pop
    ("instances", ht.EmptyList, ht.TListOf(ht.TInstanceOf(OpInstanceCreate)),
1341 12e62af5 René Nussbaumer
     "List of instance create opcodes describing the instances to allocate"),
1342 12e62af5 René Nussbaumer
    ]
1343 12e62af5 René Nussbaumer
  _JOB_LIST = ht.Comment("List of submitted jobs")(TJobIdList)
1344 12e62af5 René Nussbaumer
  ALLOCATABLE_KEY = "allocatable"
1345 12e62af5 René Nussbaumer
  FAILED_KEY = "allocatable"
1346 12e62af5 René Nussbaumer
  OP_RESULT = ht.TStrictDict(True, True, {
1347 12e62af5 René Nussbaumer
    constants.JOB_IDS_KEY: _JOB_LIST,
1348 12e62af5 René Nussbaumer
    ALLOCATABLE_KEY: ht.TListOf(ht.TNonEmptyString),
1349 3c286190 Dimitris Aragiorgis
    FAILED_KEY: ht.TListOf(ht.TNonEmptyString),
1350 12e62af5 René Nussbaumer
    })
1351 12e62af5 René Nussbaumer
1352 12e62af5 René Nussbaumer
  def __getstate__(self):
1353 12e62af5 René Nussbaumer
    """Generic serializer.
1354 12e62af5 René Nussbaumer

1355 12e62af5 René Nussbaumer
    """
1356 12e62af5 René Nussbaumer
    state = OpCode.__getstate__(self)
1357 12e62af5 René Nussbaumer
    if hasattr(self, "instances"):
1358 12e62af5 René Nussbaumer
      # pylint: disable=E1101
1359 12e62af5 René Nussbaumer
      state["instances"] = [inst.__getstate__() for inst in self.instances]
1360 12e62af5 René Nussbaumer
    return state
1361 12e62af5 René Nussbaumer
1362 12e62af5 René Nussbaumer
  def __setstate__(self, state):
1363 12e62af5 René Nussbaumer
    """Generic unserializer.
1364 12e62af5 René Nussbaumer

1365 12e62af5 René Nussbaumer
    This method just restores from the serialized state the attributes
1366 12e62af5 René Nussbaumer
    of the current instance.
1367 12e62af5 René Nussbaumer

1368 12e62af5 René Nussbaumer
    @param state: the serialized opcode data
1369 12e62af5 René Nussbaumer
    @type state: C{dict}
1370 12e62af5 René Nussbaumer

1371 12e62af5 René Nussbaumer
    """
1372 12e62af5 René Nussbaumer
    if not isinstance(state, dict):
1373 12e62af5 René Nussbaumer
      raise ValueError("Invalid data to __setstate__: expected dict, got %s" %
1374 12e62af5 René Nussbaumer
                       type(state))
1375 12e62af5 René Nussbaumer
1376 12e62af5 René Nussbaumer
    if "instances" in state:
1377 5dff65da Michael Hanselmann
      state["instances"] = map(OpCode.LoadOpCode, state["instances"])
1378 5dff65da Michael Hanselmann
1379 12e62af5 René Nussbaumer
    return OpCode.__setstate__(self, state)
1380 12e62af5 René Nussbaumer
1381 9bc5ac44 René Nussbaumer
  def Validate(self, set_defaults):
1382 9bc5ac44 René Nussbaumer
    """Validates this opcode.
1383 9bc5ac44 René Nussbaumer

1384 9bc5ac44 René Nussbaumer
    We do this recursively.
1385 9bc5ac44 René Nussbaumer

1386 9bc5ac44 René Nussbaumer
    """
1387 9bc5ac44 René Nussbaumer
    OpCode.Validate(self, set_defaults)
1388 9bc5ac44 René Nussbaumer
1389 3779121c René Nussbaumer
    for inst in self.instances: # pylint: disable=E1101
1390 9bc5ac44 René Nussbaumer
      inst.Validate(set_defaults)
1391 9bc5ac44 René Nussbaumer
1392 12e62af5 René Nussbaumer
1393 5073fd8f Iustin Pop
class OpInstanceReinstall(OpCode):
1394 fdc267f4 Iustin Pop
  """Reinstall an instance's OS."""
1395 60dd1473 Iustin Pop
  OP_DSC_FIELD = "instance_name"
1396 65e183af Michael Hanselmann
  OP_PARAMS = [
1397 65e183af Michael Hanselmann
    _PInstanceName,
1398 45d4c81c Michael Hanselmann
    _PForceVariant,
1399 45d4c81c Michael Hanselmann
    ("os_type", None, ht.TMaybeString, "Instance operating system"),
1400 45d4c81c Michael Hanselmann
    ("osparams", None, ht.TMaybeDict, "Temporary OS parameters"),
1401 65e183af Michael Hanselmann
    ]
1402 c363310d René Nussbaumer
  OP_RESULT = ht.TNone
1403 fe7b0351 Michael Hanselmann
1404 fe7b0351 Michael Hanselmann
1405 3cd2d4b1 Iustin Pop
class OpInstanceRemove(OpCode):
1406 a8083063 Iustin Pop
  """Remove an instance."""
1407 60dd1473 Iustin Pop
  OP_DSC_FIELD = "instance_name"
1408 65e183af Michael Hanselmann
  OP_PARAMS = [
1409 65e183af Michael Hanselmann
    _PInstanceName,
1410 65e183af Michael Hanselmann
    _PShutdownTimeout,
1411 45d4c81c Michael Hanselmann
    ("ignore_failures", False, ht.TBool,
1412 45d4c81c Michael Hanselmann
     "Whether to ignore failures during removal"),
1413 fc1baca9 Michael Hanselmann
    ]
1414 c363310d René Nussbaumer
  OP_RESULT = ht.TNone
1415 a8083063 Iustin Pop
1416 a8083063 Iustin Pop
1417 5659e2e2 Iustin Pop
class OpInstanceRename(OpCode):
1418 decd5f45 Iustin Pop
  """Rename an instance."""
1419 65e183af Michael Hanselmann
  OP_PARAMS = [
1420 65e183af Michael Hanselmann
    _PInstanceName,
1421 45d4c81c Michael Hanselmann
    _PNameCheck,
1422 45d4c81c Michael Hanselmann
    ("new_name", ht.NoDefault, ht.TNonEmptyString, "New instance name"),
1423 45d4c81c Michael Hanselmann
    ("ip_check", False, ht.TBool, _PIpCheckDoc),
1424 4f05fd3b Iustin Pop
    ]
1425 1456df62 Michael Hanselmann
  OP_RESULT = ht.Comment("New instance name")(ht.TNonEmptyString)
1426 decd5f45 Iustin Pop
1427 decd5f45 Iustin Pop
1428 c873d91c Iustin Pop
class OpInstanceStartup(OpCode):
1429 fdc267f4 Iustin Pop
  """Startup an instance."""
1430 60dd1473 Iustin Pop
  OP_DSC_FIELD = "instance_name"
1431 65e183af Michael Hanselmann
  OP_PARAMS = [
1432 65e183af Michael Hanselmann
    _PInstanceName,
1433 65e183af Michael Hanselmann
    _PForce,
1434 65e183af Michael Hanselmann
    _PIgnoreOfflineNodes,
1435 45d4c81c Michael Hanselmann
    ("hvparams", ht.EmptyDict, ht.TDict,
1436 45d4c81c Michael Hanselmann
     "Temporary hypervisor parameters, hypervisor-dependent"),
1437 45d4c81c Michael Hanselmann
    ("beparams", ht.EmptyDict, ht.TDict, "Temporary backend parameters"),
1438 9b64e486 Iustin Pop
    _PNoRemember,
1439 323f9095 Stephen Shirley
    _PStartupPaused,
1440 4f05fd3b Iustin Pop
    ]
1441 c363310d René Nussbaumer
  OP_RESULT = ht.TNone
1442 a8083063 Iustin Pop
1443 a8083063 Iustin Pop
1444 ee3e37a7 Iustin Pop
class OpInstanceShutdown(OpCode):
1445 fdc267f4 Iustin Pop
  """Shutdown an instance."""
1446 60dd1473 Iustin Pop
  OP_DSC_FIELD = "instance_name"
1447 65e183af Michael Hanselmann
  OP_PARAMS = [
1448 65e183af Michael Hanselmann
    _PInstanceName,
1449 0d57ce24 Guido Trotter
    _PForce,
1450 65e183af Michael Hanselmann
    _PIgnoreOfflineNodes,
1451 2c9fa1ff Iustin Pop
    ("timeout", constants.DEFAULT_SHUTDOWN_TIMEOUT, ht.TNonNegativeInt,
1452 45d4c81c Michael Hanselmann
     "How long to wait for instance to shut down"),
1453 9b64e486 Iustin Pop
    _PNoRemember,
1454 b44bd844 Michael Hanselmann
    ]
1455 c363310d René Nussbaumer
  OP_RESULT = ht.TNone
1456 a8083063 Iustin Pop
1457 a8083063 Iustin Pop
1458 90ab1a95 Iustin Pop
class OpInstanceReboot(OpCode):
1459 bf6929a2 Alexander Schreiber
  """Reboot an instance."""
1460 60dd1473 Iustin Pop
  OP_DSC_FIELD = "instance_name"
1461 65e183af Michael Hanselmann
  OP_PARAMS = [
1462 65e183af Michael Hanselmann
    _PInstanceName,
1463 65e183af Michael Hanselmann
    _PShutdownTimeout,
1464 45d4c81c Michael Hanselmann
    ("ignore_secondaries", False, ht.TBool,
1465 45d4c81c Michael Hanselmann
     "Whether to start the instance even if secondary disks are failing"),
1466 45d4c81c Michael Hanselmann
    ("reboot_type", ht.NoDefault, ht.TElemOf(constants.REBOOT_TYPES),
1467 45d4c81c Michael Hanselmann
     "How to reboot instance"),
1468 69c88fb1 Michele Tartara
    _PReason,
1469 4f05fd3b Iustin Pop
    ]
1470 c363310d René Nussbaumer
  OP_RESULT = ht.TNone
1471 bf6929a2 Alexander Schreiber
1472 bf6929a2 Alexander Schreiber
1473 668f755d Iustin Pop
class OpInstanceReplaceDisks(OpCode):
1474 fdc267f4 Iustin Pop
  """Replace the disks of an instance."""
1475 60dd1473 Iustin Pop
  OP_DSC_FIELD = "instance_name"
1476 65e183af Michael Hanselmann
  OP_PARAMS = [
1477 65e183af Michael Hanselmann
    _PInstanceName,
1478 e1f23243 Michael Hanselmann
    _PEarlyRelease,
1479 d2fe2bfb René Nussbaumer
    _PIgnoreIpolicy,
1480 45d4c81c Michael Hanselmann
    ("mode", ht.NoDefault, ht.TElemOf(constants.REPLACE_MODES),
1481 45d4c81c Michael Hanselmann
     "Replacement mode"),
1482 2c9fa1ff Iustin Pop
    ("disks", ht.EmptyList, ht.TListOf(ht.TNonNegativeInt),
1483 45d4c81c Michael Hanselmann
     "Disk indexes"),
1484 45d4c81c Michael Hanselmann
    ("remote_node", None, ht.TMaybeString, "New secondary node"),
1485 89514061 Iustin Pop
    _PIAllocFromDesc("Iallocator for deciding new secondary node"),
1486 4f05fd3b Iustin Pop
    ]
1487 c363310d René Nussbaumer
  OP_RESULT = ht.TNone
1488 a8083063 Iustin Pop
1489 a8083063 Iustin Pop
1490 019dbee1 Iustin Pop
class OpInstanceFailover(OpCode):
1491 a8083063 Iustin Pop
  """Failover an instance."""
1492 60dd1473 Iustin Pop
  OP_DSC_FIELD = "instance_name"
1493 65e183af Michael Hanselmann
  OP_PARAMS = [
1494 65e183af Michael Hanselmann
    _PInstanceName,
1495 65e183af Michael Hanselmann
    _PShutdownTimeout,
1496 45d4c81c Michael Hanselmann
    _PIgnoreConsistency,
1497 f8fa4175 Michael Hanselmann
    _PMigrationTargetNode,
1498 b6aaf437 René Nussbaumer
    _PIgnoreIpolicy,
1499 89514061 Iustin Pop
    _PIAllocFromDesc("Iallocator for deciding the target node for"
1500 89514061 Iustin Pop
                     " shared-storage instances"),
1501 17c3f802 Guido Trotter
    ]
1502 c363310d René Nussbaumer
  OP_RESULT = ht.TNone
1503 a8083063 Iustin Pop
1504 a8083063 Iustin Pop
1505 75c866c2 Iustin Pop
class OpInstanceMigrate(OpCode):
1506 53c776b5 Iustin Pop
  """Migrate an instance.
1507 53c776b5 Iustin Pop

1508 53c776b5 Iustin Pop
  This migrates (without shutting down an instance) to its secondary
1509 53c776b5 Iustin Pop
  node.
1510 53c776b5 Iustin Pop

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

1514 53c776b5 Iustin Pop
  """
1515 ee69c97f Iustin Pop
  OP_DSC_FIELD = "instance_name"
1516 65e183af Michael Hanselmann
  OP_PARAMS = [
1517 65e183af Michael Hanselmann
    _PInstanceName,
1518 65e183af Michael Hanselmann
    _PMigrationMode,
1519 65e183af Michael Hanselmann
    _PMigrationLive,
1520 f8fa4175 Michael Hanselmann
    _PMigrationTargetNode,
1521 8c0b16f6 Guido Trotter
    _PAllowRuntimeChgs,
1522 3ed23330 René Nussbaumer
    _PIgnoreIpolicy,
1523 45d4c81c Michael Hanselmann
    ("cleanup", False, ht.TBool,
1524 45d4c81c Michael Hanselmann
     "Whether a previously failed migration should be cleaned up"),
1525 89514061 Iustin Pop
    _PIAllocFromDesc("Iallocator for deciding the target node for"
1526 89514061 Iustin Pop
                     " shared-storage instances"),
1527 d5cafd31 René Nussbaumer
    ("allow_failover", False, ht.TBool,
1528 d5cafd31 René Nussbaumer
     "Whether we can fallback to failover if migration is not possible"),
1529 65e183af Michael Hanselmann
    ]
1530 c363310d René Nussbaumer
  OP_RESULT = ht.TNone
1531 53c776b5 Iustin Pop
1532 53c776b5 Iustin Pop
1533 0091b480 Iustin Pop
class OpInstanceMove(OpCode):
1534 313bcead Iustin Pop
  """Move an instance.
1535 313bcead Iustin Pop

1536 313bcead Iustin Pop
  This move (with shutting down an instance and data copying) to an
1537 313bcead Iustin Pop
  arbitrary node.
1538 313bcead Iustin Pop

1539 313bcead Iustin Pop
  @ivar instance_name: the name of the instance
1540 313bcead Iustin Pop
  @ivar target_node: the destination node
1541 313bcead Iustin Pop

1542 313bcead Iustin Pop
  """
1543 313bcead Iustin Pop
  OP_DSC_FIELD = "instance_name"
1544 65e183af Michael Hanselmann
  OP_PARAMS = [
1545 65e183af Michael Hanselmann
    _PInstanceName,
1546 65e183af Michael Hanselmann
    _PShutdownTimeout,
1547 92cf62e3 René Nussbaumer
    _PIgnoreIpolicy,
1548 45d4c81c Michael Hanselmann
    ("target_node", ht.NoDefault, ht.TNonEmptyString, "Target node"),
1549 bb851c63 Iustin Pop
    _PIgnoreConsistency,
1550 154b9580 Balazs Lecz
    ]
1551 c363310d René Nussbaumer
  OP_RESULT = ht.TNone
1552 313bcead Iustin Pop
1553 313bcead Iustin Pop
1554 cc0dec7b Iustin Pop
class OpInstanceConsole(OpCode):
1555 fdc267f4 Iustin Pop
  """Connect to an instance's console."""
1556 60dd1473 Iustin Pop
  OP_DSC_FIELD = "instance_name"
1557 65e183af Michael Hanselmann
  OP_PARAMS = [
1558 3c286190 Dimitris Aragiorgis
    _PInstanceName,
1559 65e183af Michael Hanselmann
    ]
1560 c363310d René Nussbaumer
  OP_RESULT = ht.TDict
1561 a8083063 Iustin Pop
1562 a8083063 Iustin Pop
1563 83f5d475 Iustin Pop
class OpInstanceActivateDisks(OpCode):
1564 fdc267f4 Iustin Pop
  """Activate an instance's disks."""
1565 60dd1473 Iustin Pop
  OP_DSC_FIELD = "instance_name"
1566 65e183af Michael Hanselmann
  OP_PARAMS = [
1567 65e183af Michael Hanselmann
    _PInstanceName,
1568 45d4c81c Michael Hanselmann
    ("ignore_size", False, ht.TBool, "Whether to ignore recorded size"),
1569 b69437c5 Iustin Pop
    _PWaitForSyncFalse,
1570 65e183af Michael Hanselmann
    ]
1571 c363310d René Nussbaumer
  OP_RESULT = ht.TListOf(ht.TAnd(ht.TIsLength(3),
1572 c363310d René Nussbaumer
                                 ht.TItems([ht.TNonEmptyString,
1573 c363310d René Nussbaumer
                                            ht.TNonEmptyString,
1574 c363310d René Nussbaumer
                                            ht.TNonEmptyString])))
1575 a8083063 Iustin Pop
1576 a8083063 Iustin Pop
1577 e176281f Iustin Pop
class OpInstanceDeactivateDisks(OpCode):
1578 fdc267f4 Iustin Pop
  """Deactivate an instance's disks."""
1579 60dd1473 Iustin Pop
  OP_DSC_FIELD = "instance_name"
1580 65e183af Michael Hanselmann
  OP_PARAMS = [
1581 c9c41373 Iustin Pop
    _PInstanceName,
1582 c9c41373 Iustin Pop
    _PForce,
1583 65e183af Michael Hanselmann
    ]
1584 c363310d René Nussbaumer
  OP_RESULT = ht.TNone
1585 a8083063 Iustin Pop
1586 a8083063 Iustin Pop
1587 6b273e78 Iustin Pop
class OpInstanceRecreateDisks(OpCode):
1588 a52978c7 Michael Hanselmann
  """Recreate an instance's disks."""
1589 735e1318 Michael Hanselmann
  _TDiskChanges = \
1590 735e1318 Michael Hanselmann
    ht.TAnd(ht.TIsLength(2),
1591 2c9fa1ff Iustin Pop
            ht.TItems([ht.Comment("Disk index")(ht.TNonNegativeInt),
1592 735e1318 Michael Hanselmann
                       ht.Comment("Parameters")(_TDiskParams)]))
1593 735e1318 Michael Hanselmann
1594 bd315bfa Iustin Pop
  OP_DSC_FIELD = "instance_name"
1595 65e183af Michael Hanselmann
  OP_PARAMS = [
1596 65e183af Michael Hanselmann
    _PInstanceName,
1597 735e1318 Michael Hanselmann
    ("disks", ht.EmptyList,
1598 2c9fa1ff Iustin Pop
     ht.TOr(ht.TListOf(ht.TNonNegativeInt), ht.TListOf(_TDiskChanges)),
1599 735e1318 Michael Hanselmann
     "List of disk indexes (deprecated) or a list of tuples containing a disk"
1600 735e1318 Michael Hanselmann
     " index and a possibly empty dictionary with disk parameter changes"),
1601 93384b8c Guido Trotter
    ("nodes", ht.EmptyList, ht.TListOf(ht.TNonEmptyString),
1602 93384b8c Guido Trotter
     "New instance nodes, if relocation is desired"),
1603 89514061 Iustin Pop
    _PIAllocFromDesc("Iallocator for deciding new nodes"),
1604 65e183af Michael Hanselmann
    ]
1605 c363310d René Nussbaumer
  OP_RESULT = ht.TNone
1606 bd315bfa Iustin Pop
1607 bd315bfa Iustin Pop
1608 f2af0bec Iustin Pop
class OpInstanceQuery(OpCode):
1609 a8083063 Iustin Pop
  """Compute the list of instances."""
1610 65e183af Michael Hanselmann
  OP_PARAMS = [
1611 65e183af Michael Hanselmann
    _POutputFields,
1612 45d4c81c Michael Hanselmann
    _PUseLocking,
1613 45d4c81c Michael Hanselmann
    ("names", ht.EmptyList, ht.TListOf(ht.TNonEmptyString),
1614 45d4c81c Michael Hanselmann
     "Empty list to query all instances, instance names otherwise"),
1615 65e183af Michael Hanselmann
    ]
1616 415feb2e René Nussbaumer
  OP_RESULT = _TOldQueryResult
1617 a8083063 Iustin Pop
1618 a8083063 Iustin Pop
1619 dc28c4e4 Iustin Pop
class OpInstanceQueryData(OpCode):
1620 a8083063 Iustin Pop
  """Compute the run-time status of instances."""
1621 65e183af Michael Hanselmann
  OP_PARAMS = [
1622 af7b6689 Michael Hanselmann
    _PUseLocking,
1623 af7b6689 Michael Hanselmann
    ("instances", ht.EmptyList, ht.TListOf(ht.TNonEmptyString),
1624 af7b6689 Michael Hanselmann
     "Instance names"),
1625 af7b6689 Michael Hanselmann
    ("static", False, ht.TBool,
1626 af7b6689 Michael Hanselmann
     "Whether to only return configuration data without querying"
1627 af7b6689 Michael Hanselmann
     " nodes"),
1628 65e183af Michael Hanselmann
    ]
1629 415feb2e René Nussbaumer
  OP_RESULT = ht.TDictOf(ht.TNonEmptyString, ht.TDict)
1630 a8083063 Iustin Pop
1631 a8083063 Iustin Pop
1632 ddc1de7c Michael Hanselmann
def _TestInstSetParamsModList(fn):
1633 ddc1de7c Michael Hanselmann
  """Generates a check for modification lists.
1634 ddc1de7c Michael Hanselmann

1635 ddc1de7c Michael Hanselmann
  """
1636 e9c3d864 Michael Hanselmann
  # Old format
1637 e9c3d864 Michael Hanselmann
  # TODO: Remove in version 2.8 including support in LUInstanceSetParams
1638 e9c3d864 Michael Hanselmann
  old_mod_item_fn = \
1639 ddc1de7c Michael Hanselmann
    ht.TAnd(ht.TIsLength(2), ht.TItems([
1640 2c9fa1ff Iustin Pop
      ht.TOr(ht.TElemOf(constants.DDMS_VALUES), ht.TNonNegativeInt),
1641 ddc1de7c Michael Hanselmann
      fn,
1642 ddc1de7c Michael Hanselmann
      ]))
1643 ddc1de7c Michael Hanselmann
1644 e9c3d864 Michael Hanselmann
  # New format, supporting adding/removing disks/NICs at arbitrary indices
1645 e9c3d864 Michael Hanselmann
  mod_item_fn = \
1646 e9c3d864 Michael Hanselmann
    ht.TAnd(ht.TIsLength(3), ht.TItems([
1647 e9c3d864 Michael Hanselmann
      ht.TElemOf(constants.DDMS_VALUES_WITH_MODIFY),
1648 e9c3d864 Michael Hanselmann
      ht.Comment("Disk index, can be negative, e.g. -1 for last disk")(ht.TInt),
1649 e9c3d864 Michael Hanselmann
      fn,
1650 e9c3d864 Michael Hanselmann
      ]))
1651 e9c3d864 Michael Hanselmann
1652 e9c3d864 Michael Hanselmann
  return ht.TOr(ht.Comment("Recommended")(ht.TListOf(mod_item_fn)),
1653 e9c3d864 Michael Hanselmann
                ht.Comment("Deprecated")(ht.TListOf(old_mod_item_fn)))
1654 ddc1de7c Michael Hanselmann
1655 ddc1de7c Michael Hanselmann
1656 9a3cc7ae Iustin Pop
class OpInstanceSetParams(OpCode):
1657 ddc1de7c Michael Hanselmann
  """Change the parameters of an instance.
1658 ddc1de7c Michael Hanselmann

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

1850 1410fa8d Michael Hanselmann
  @ivar instance_name: Instance name
1851 1410fa8d Michael Hanselmann
  @ivar mode: Export mode (one of L{constants.EXPORT_MODES})
1852 1410fa8d Michael Hanselmann

1853 1410fa8d Michael Hanselmann
  """
1854 1410fa8d Michael Hanselmann
  OP_DSC_FIELD = "instance_name"
1855 65e183af Michael Hanselmann
  OP_PARAMS = [
1856 65e183af Michael Hanselmann
    _PInstanceName,
1857 45d4c81c Michael Hanselmann
    ("mode", ht.NoDefault, ht.TElemOf(constants.EXPORT_MODES),
1858 45d4c81c Michael Hanselmann
     "Export mode"),
1859 1410fa8d Michael Hanselmann
    ]
1860 fd9f58fd Iustin Pop
  OP_RESULT = ht.TMaybeDict
1861 1410fa8d Michael Hanselmann
1862 1410fa8d Michael Hanselmann
1863 4ff922a2 Iustin Pop
class OpBackupExport(OpCode):
1864 4a96f1d1 Michael Hanselmann
  """Export an instance.
1865 4a96f1d1 Michael Hanselmann

1866 398e9066 Iustin Pop
  For local exports, the export destination is the node name. For
1867 398e9066 Iustin Pop
  remote exports, the export destination is a list of tuples, each
1868 398e9066 Iustin Pop
  consisting of hostname/IP address, port, magic, HMAC and HMAC
1869 398e9066 Iustin Pop
  salt. The HMAC is calculated using the cluster domain secret over
1870 398e9066 Iustin Pop
  the value "${index}:${hostname}:${port}". The destination X509 CA
1871 398e9066 Iustin Pop
  must be a signed certificate.
1872 4a96f1d1 Michael Hanselmann

1873 4a96f1d1 Michael Hanselmann
  @ivar mode: Export mode (one of L{constants.EXPORT_MODES})
1874 4a96f1d1 Michael Hanselmann
  @ivar target_node: Export destination
1875 4a96f1d1 Michael Hanselmann
  @ivar x509_key_name: X509 key to use (remote export only)
1876 4a96f1d1 Michael Hanselmann
  @ivar destination_x509_ca: Destination X509 CA in PEM format (remote export
1877 4a96f1d1 Michael Hanselmann
                             only)
1878 4a96f1d1 Michael Hanselmann

1879 4a96f1d1 Michael Hanselmann
  """
1880 60dd1473 Iustin Pop
  OP_DSC_FIELD = "instance_name"
1881 65e183af Michael Hanselmann
  OP_PARAMS = [
1882 65e183af Michael Hanselmann
    _PInstanceName,
1883 65e183af Michael Hanselmann
    _PShutdownTimeout,
1884 4a96f1d1 Michael Hanselmann
    # TODO: Rename target_node as it changes meaning for different export modes
1885 4a96f1d1 Michael Hanselmann
    # (e.g. "destination")
1886 45d4c81c Michael Hanselmann
    ("target_node", ht.NoDefault, ht.TOr(ht.TNonEmptyString, ht.TList),
1887 45d4c81c Michael Hanselmann
     "Destination information, depends on export mode"),
1888 45d4c81c Michael Hanselmann
    ("shutdown", True, ht.TBool, "Whether to shutdown instance before export"),
1889 45d4c81c Michael Hanselmann
    ("remove_instance", False, ht.TBool,
1890 45d4c81c Michael Hanselmann
     "Whether to remove instance after export"),
1891 45d4c81c Michael Hanselmann
    ("ignore_remove_failures", False, ht.TBool,
1892 45d4c81c Michael Hanselmann
     "Whether to ignore failures while removing instances"),
1893 45d4c81c Michael Hanselmann
    ("mode", constants.EXPORT_MODE_LOCAL, ht.TElemOf(constants.EXPORT_MODES),
1894 45d4c81c Michael Hanselmann
     "Export mode"),
1895 fd9f58fd Iustin Pop
    ("x509_key_name", None, ht.TMaybe(ht.TList),
1896 45d4c81c Michael Hanselmann
     "Name of X509 key (remote export only)"),
1897 45d4c81c Michael Hanselmann
    ("destination_x509_ca", None, ht.TMaybeString,
1898 45d4c81c Michael Hanselmann
     "Destination X509 CA (remote export only)"),
1899 17c3f802 Guido Trotter
    ]
1900 202fb4e0 Michael Hanselmann
  OP_RESULT = \
1901 202fb4e0 Michael Hanselmann
    ht.TAnd(ht.TIsLength(2), ht.TItems([
1902 202fb4e0 Michael Hanselmann
      ht.Comment("Finalizing status")(ht.TBool),
1903 202fb4e0 Michael Hanselmann
      ht.Comment("Status for every exported disk")(ht.TListOf(ht.TBool)),
1904 202fb4e0 Michael Hanselmann
      ]))
1905 5c947f38 Iustin Pop
1906 0a7bed64 Michael Hanselmann
1907 ca5890ad Iustin Pop
class OpBackupRemove(OpCode):
1908 9ac99fda Guido Trotter
  """Remove an instance's export."""
1909 60dd1473 Iustin Pop
  OP_DSC_FIELD = "instance_name"
1910 65e183af Michael Hanselmann
  OP_PARAMS = [
1911 65e183af Michael Hanselmann
    _PInstanceName,
1912 65e183af Michael Hanselmann
    ]
1913 202fb4e0 Michael Hanselmann
  OP_RESULT = ht.TNone
1914 5c947f38 Iustin Pop
1915 0a7bed64 Michael Hanselmann
1916 5c947f38 Iustin Pop
# Tags opcodes
1917 c6afb1ca Iustin Pop
class OpTagsGet(OpCode):
1918 5c947f38 Iustin Pop
  """Returns the tags of the given object."""
1919 60dd1473 Iustin Pop
  OP_DSC_FIELD = "name"
1920 65e183af Michael Hanselmann
  OP_PARAMS = [
1921 65e183af Michael Hanselmann
    _PTagKind,
1922 cfdf561d Michael Hanselmann
    # Not using _PUseLocking as the default is different for historical reasons
1923 cfdf561d Michael Hanselmann
    ("use_locking", True, ht.TBool, "Whether to use synchronization"),
1924 65e183af Michael Hanselmann
    # Name is only meaningful for nodes and instances
1925 971b3a98 Michael Hanselmann
    ("name", ht.NoDefault, ht.TMaybeString,
1926 971b3a98 Michael Hanselmann
     "Name of object to retrieve tags from"),
1927 65e183af Michael Hanselmann
    ]
1928 48796673 Michael Hanselmann
  OP_RESULT = ht.TListOf(ht.TNonEmptyString)
1929 5c947f38 Iustin Pop
1930 5c947f38 Iustin Pop
1931 715462e7 Iustin Pop
class OpTagsSearch(OpCode):
1932 73415719 Iustin Pop
  """Searches the tags in the cluster for a given pattern."""
1933 60dd1473 Iustin Pop
  OP_DSC_FIELD = "pattern"
1934 65e183af Michael Hanselmann
  OP_PARAMS = [
1935 971b3a98 Michael Hanselmann
    ("pattern", ht.NoDefault, ht.TNonEmptyString,
1936 971b3a98 Michael Hanselmann
     "Search pattern (regular expression)"),
1937 65e183af Michael Hanselmann
    ]
1938 48796673 Michael Hanselmann
  OP_RESULT = ht.TListOf(ht.TAnd(ht.TIsLength(2), ht.TItems([
1939 48796673 Michael Hanselmann
    ht.TNonEmptyString,
1940 48796673 Michael Hanselmann
    ht.TNonEmptyString,
1941 48796673 Michael Hanselmann
    ])))
1942 73415719 Iustin Pop
1943 73415719 Iustin Pop
1944 d1602edc Iustin Pop
class OpTagsSet(OpCode):
1945 f27302fa Iustin Pop
  """Add a list of tags on a given object."""
1946 65e183af Michael Hanselmann
  OP_PARAMS = [
1947 65e183af Michael Hanselmann
    _PTagKind,
1948 65e183af Michael Hanselmann
    _PTags,
1949 bcd35e09 Dato Simó
    # Name is only meaningful for groups, nodes and instances
1950 971b3a98 Michael Hanselmann
    ("name", ht.NoDefault, ht.TMaybeString,
1951 971b3a98 Michael Hanselmann
     "Name of object where tag(s) should be added"),
1952 65e183af Michael Hanselmann
    ]
1953 48796673 Michael Hanselmann
  OP_RESULT = ht.TNone
1954 5c947f38 Iustin Pop
1955 5c947f38 Iustin Pop
1956 3f0ab95f Iustin Pop
class OpTagsDel(OpCode):
1957 f27302fa Iustin Pop
  """Remove a list of tags from a given object."""
1958 65e183af Michael Hanselmann
  OP_PARAMS = [
1959 65e183af Michael Hanselmann
    _PTagKind,
1960 65e183af Michael Hanselmann
    _PTags,
1961 bcd35e09 Dato Simó
    # Name is only meaningful for groups, nodes and instances
1962 971b3a98 Michael Hanselmann
    ("name", ht.NoDefault, ht.TMaybeString,
1963 971b3a98 Michael Hanselmann
     "Name of object where tag(s) should be deleted"),
1964 65e183af Michael Hanselmann
    ]
1965 48796673 Michael Hanselmann
  OP_RESULT = ht.TNone
1966 06009e27 Iustin Pop
1967 e687ec01 Michael Hanselmann
1968 06009e27 Iustin Pop
# Test opcodes
1969 06009e27 Iustin Pop
class OpTestDelay(OpCode):
1970 06009e27 Iustin Pop
  """Sleeps for a configured amount of time.
1971 06009e27 Iustin Pop

1972 06009e27 Iustin Pop
  This is used just for debugging and testing.
1973 06009e27 Iustin Pop

1974 06009e27 Iustin Pop
  Parameters:
1975 aeb6ba44 Dato Simó
    - duration: the time to sleep, in seconds
1976 06009e27 Iustin Pop
    - on_master: if true, sleep on the master
1977 06009e27 Iustin Pop
    - on_nodes: list of nodes in which to sleep
1978 06009e27 Iustin Pop

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

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

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

1989 06009e27 Iustin Pop
  """
1990 60dd1473 Iustin Pop
  OP_DSC_FIELD = "duration"
1991 65e183af Michael Hanselmann
  OP_PARAMS = [
1992 b795a775 Michael Hanselmann
    ("duration", ht.NoDefault, ht.TNumber, None),
1993 197b323b Michael Hanselmann
    ("on_master", True, ht.TBool, None),
1994 197b323b Michael Hanselmann
    ("on_nodes", ht.EmptyList, ht.TListOf(ht.TNonEmptyString), None),
1995 2c9fa1ff Iustin Pop
    ("repeat", 0, ht.TNonNegativeInt, None),
1996 65e183af Michael Hanselmann
    ]
1997 d61df03e Iustin Pop
1998 8bc17ebb Iustin Pop
  def OP_DSC_FORMATTER(self, value): # pylint: disable=C0103,R0201
1999 8bc17ebb Iustin Pop
    """Custom formatter for duration.
2000 8bc17ebb Iustin Pop

2001 8bc17ebb Iustin Pop
    """
2002 8bc17ebb Iustin Pop
    try:
2003 8bc17ebb Iustin Pop
      v = float(value)
2004 8bc17ebb Iustin Pop
    except TypeError:
2005 8bc17ebb Iustin Pop
      v = value
2006 8bc17ebb Iustin Pop
    return str(v)
2007 8bc17ebb Iustin Pop
2008 d61df03e Iustin Pop
2009 d61df03e Iustin Pop
class OpTestAllocator(OpCode):
2010 d61df03e Iustin Pop
  """Allocator framework testing.
2011 d61df03e Iustin Pop

2012 d61df03e Iustin Pop
  This opcode has two modes:
2013 d61df03e Iustin Pop
    - gather and return allocator input for a given mode (allocate new
2014 d61df03e Iustin Pop
      or replace secondary) and a given instance definition (direction
2015 d61df03e Iustin Pop
      'in')
2016 d61df03e Iustin Pop
    - run a selected allocator for a given operation (as above) and
2017 d61df03e Iustin Pop
      return the allocator output (direction 'out')
2018 d61df03e Iustin Pop

2019 d61df03e Iustin Pop
  """
2020 55b7e783 Iustin Pop
  OP_DSC_FIELD = "iallocator"
2021 65e183af Michael Hanselmann
  OP_PARAMS = [
2022 65e183af Michael Hanselmann
    ("direction", ht.NoDefault,
2023 197b323b Michael Hanselmann
     ht.TElemOf(constants.VALID_IALLOCATOR_DIRECTIONS), None),
2024 197b323b Michael Hanselmann
    ("mode", ht.NoDefault, ht.TElemOf(constants.VALID_IALLOCATOR_MODES), None),
2025 197b323b Michael Hanselmann
    ("name", ht.NoDefault, ht.TNonEmptyString, None),
2026 ff8067cf Michael Hanselmann
    ("nics", ht.NoDefault,
2027 ff8067cf Michael Hanselmann
     ht.TMaybeListOf(ht.TDictOf(ht.TElemOf([constants.INIC_MAC,
2028 ff8067cf Michael Hanselmann
                                            constants.INIC_IP,
2029 ff8067cf Michael Hanselmann
                                            "bridge"]),
2030 fd9f58fd Iustin Pop
                                ht.TMaybeString)),
2031 ff8067cf Michael Hanselmann
     None),
2032 fd9f58fd Iustin Pop
    ("disks", ht.NoDefault, ht.TMaybe(ht.TList), None),
2033 197b323b Michael Hanselmann
    ("hypervisor", None, ht.TMaybeString, None),
2034 55b7e783 Iustin Pop
    _PIAllocFromDesc(None),
2035 197b323b Michael Hanselmann
    ("tags", ht.EmptyList, ht.TListOf(ht.TNonEmptyString), None),
2036 fd9f58fd Iustin Pop
    ("memory", None, ht.TMaybe(ht.TNonNegativeInt), None),
2037 fd9f58fd Iustin Pop
    ("vcpus", None, ht.TMaybe(ht.TNonNegativeInt), None),
2038 197b323b Michael Hanselmann
    ("os", None, ht.TMaybeString, None),
2039 197b323b Michael Hanselmann
    ("disk_template", None, ht.TMaybeString, None),
2040 ff8067cf Michael Hanselmann
    ("instances", None, ht.TMaybeListOf(ht.TNonEmptyString), None),
2041 60152bbe Michael Hanselmann
    ("evac_mode", None,
2042 fd9f58fd Iustin Pop
     ht.TMaybe(ht.TElemOf(constants.IALLOCATOR_NEVAC_MODES)), None),
2043 ff8067cf Michael Hanselmann
    ("target_groups", None, ht.TMaybeListOf(ht.TNonEmptyString), None),
2044 2c9fa1ff Iustin Pop
    ("spindle_use", 1, ht.TNonNegativeInt, None),
2045 2c9fa1ff Iustin Pop
    ("count", 1, ht.TNonNegativeInt, None),
2046 d61df03e Iustin Pop
    ]
2047 363acb1e Iustin Pop
2048 76aef8fc Michael Hanselmann
2049 b469eb4d Iustin Pop
class OpTestJqueue(OpCode):
2050 e58f87a9 Michael Hanselmann
  """Utility opcode to test some aspects of the job queue.
2051 e58f87a9 Michael Hanselmann

2052 e58f87a9 Michael Hanselmann
  """
2053 65e183af Michael Hanselmann
  OP_PARAMS = [
2054 197b323b Michael Hanselmann
    ("notify_waitlock", False, ht.TBool, None),
2055 197b323b Michael Hanselmann
    ("notify_exec", False, ht.TBool, None),
2056 197b323b Michael Hanselmann
    ("log_messages", ht.EmptyList, ht.TListOf(ht.TString), None),
2057 197b323b Michael Hanselmann
    ("fail", False, ht.TBool, None),
2058 e58f87a9 Michael Hanselmann
    ]
2059 e58f87a9 Michael Hanselmann
2060 e58f87a9 Michael Hanselmann
2061 be760ba8 Michael Hanselmann
class OpTestDummy(OpCode):
2062 be760ba8 Michael Hanselmann
  """Utility opcode used by unittests.
2063 be760ba8 Michael Hanselmann

2064 be760ba8 Michael Hanselmann
  """
2065 65e183af Michael Hanselmann
  OP_PARAMS = [
2066 197b323b Michael Hanselmann
    ("result", ht.NoDefault, ht.NoType, None),
2067 197b323b Michael Hanselmann
    ("messages", ht.NoDefault, ht.NoType, None),
2068 197b323b Michael Hanselmann
    ("fail", ht.NoDefault, ht.NoType, None),
2069 6a373640 Michael Hanselmann
    ("submit_jobs", None, ht.NoType, None),
2070 be760ba8 Michael Hanselmann
    ]
2071 687c10d9 Iustin Pop
  WITH_LU = False
2072 be760ba8 Michael Hanselmann
2073 be760ba8 Michael Hanselmann
2074 eaa4c57c Dimitris Aragiorgis
# Network opcodes
2075 eaa4c57c Dimitris Aragiorgis
# Add a new network in the cluster
2076 eaa4c57c Dimitris Aragiorgis
class OpNetworkAdd(OpCode):
2077 eaa4c57c Dimitris Aragiorgis
  """Add an IP network to the cluster."""
2078 eaa4c57c Dimitris Aragiorgis
  OP_DSC_FIELD = "network_name"
2079 eaa4c57c Dimitris Aragiorgis
  OP_PARAMS = [
2080 eaa4c57c Dimitris Aragiorgis
    _PNetworkName,
2081 e1494c96 Iustin Pop
    ("network", ht.NoDefault, _TIpNetwork4, "IPv4 subnet"),
2082 e1494c96 Iustin Pop
    ("gateway", None, ht.TMaybe(_TIpAddress4), "IPv4 gateway"),
2083 e1494c96 Iustin Pop
    ("network6", None, ht.TMaybe(_TIpNetwork6), "IPv6 subnet"),
2084 e1494c96 Iustin Pop
    ("gateway6", None, ht.TMaybe(_TIpAddress6), "IPv6 gateway"),
2085 6e8091f9 Dimitris Aragiorgis
    ("mac_prefix", None, ht.TMaybeString,
2086 32e3d8b1 Michael Hanselmann
     "MAC address prefix that overrides cluster one"),
2087 e1494c96 Iustin Pop
    ("add_reserved_ips", None, _TMaybeAddr4List,
2088 32e3d8b1 Michael Hanselmann
     "Which IP addresses to reserve"),
2089 213076fe Dimitris Aragiorgis
    ("conflicts_check", True, ht.TBool,
2090 213076fe Dimitris Aragiorgis
     "Whether to check for conflicting IP addresses"),
2091 8140e24f Dimitris Aragiorgis
    ("tags", ht.EmptyList, ht.TListOf(ht.TNonEmptyString), "Network tags"),
2092 eaa4c57c Dimitris Aragiorgis
    ]
2093 6e8091f9 Dimitris Aragiorgis
  OP_RESULT = ht.TNone
2094 eaa4c57c Dimitris Aragiorgis
2095 3c286190 Dimitris Aragiorgis
2096 eaa4c57c Dimitris Aragiorgis
class OpNetworkRemove(OpCode):
2097 eaa4c57c Dimitris Aragiorgis
  """Remove an existing network from the cluster.
2098 eaa4c57c Dimitris Aragiorgis
     Must not be connected to any nodegroup.
2099 eaa4c57c Dimitris Aragiorgis

2100 eaa4c57c Dimitris Aragiorgis
  """
2101 eaa4c57c Dimitris Aragiorgis
  OP_DSC_FIELD = "network_name"
2102 eaa4c57c Dimitris Aragiorgis
  OP_PARAMS = [
2103 eaa4c57c Dimitris Aragiorgis
    _PNetworkName,
2104 eaa4c57c Dimitris Aragiorgis
    _PForce,
2105 eaa4c57c Dimitris Aragiorgis
    ]
2106 6e8091f9 Dimitris Aragiorgis
  OP_RESULT = ht.TNone
2107 eaa4c57c Dimitris Aragiorgis
2108 3c286190 Dimitris Aragiorgis
2109 eaa4c57c Dimitris Aragiorgis
class OpNetworkSetParams(OpCode):
2110 eaa4c57c Dimitris Aragiorgis
  """Modify Network's parameters except for IPv4 subnet"""
2111 eaa4c57c Dimitris Aragiorgis
  OP_DSC_FIELD = "network_name"
2112 eaa4c57c Dimitris Aragiorgis
  OP_PARAMS = [
2113 eaa4c57c Dimitris Aragiorgis
    _PNetworkName,
2114 e055a2ab Dimitris Aragiorgis
    ("gateway", None, ht.TMaybeValueNone(_TIpAddress4), "IPv4 gateway"),
2115 e055a2ab Dimitris Aragiorgis
    ("network6", None, ht.TMaybeValueNone(_TIpNetwork6), "IPv6 subnet"),
2116 e055a2ab Dimitris Aragiorgis
    ("gateway6", None, ht.TMaybeValueNone(_TIpAddress6), "IPv6 gateway"),
2117 e055a2ab Dimitris Aragiorgis
    ("mac_prefix", None, ht.TMaybeValueNone(ht.TString),
2118 32e3d8b1 Michael Hanselmann
     "MAC address prefix that overrides cluster one"),
2119 e1494c96 Iustin Pop
    ("add_reserved_ips", None, _TMaybeAddr4List,
2120 32e3d8b1 Michael Hanselmann
     "Which external IP addresses to reserve"),
2121 e1494c96 Iustin Pop
    ("remove_reserved_ips", None, _TMaybeAddr4List,
2122 32e3d8b1 Michael Hanselmann
     "Which external IP addresses to release"),
2123 eaa4c57c Dimitris Aragiorgis
    ]
2124 6e8091f9 Dimitris Aragiorgis
  OP_RESULT = ht.TNone
2125 eaa4c57c Dimitris Aragiorgis
2126 3c286190 Dimitris Aragiorgis
2127 eaa4c57c Dimitris Aragiorgis
class OpNetworkConnect(OpCode):
2128 eaa4c57c Dimitris Aragiorgis
  """Connect a Network to a specific Nodegroup with the defined netparams
2129 eaa4c57c Dimitris Aragiorgis
     (mode, link). Nics in this Network will inherit those params.
2130 eaa4c57c Dimitris Aragiorgis
     Produce errors if a NIC (that its not already assigned to a network)
2131 eaa4c57c Dimitris Aragiorgis
     has an IP that is contained in the Network this will produce error unless
2132 eaa4c57c Dimitris Aragiorgis
     --no-conflicts-check is passed.
2133 eaa4c57c Dimitris Aragiorgis

2134 eaa4c57c Dimitris Aragiorgis
  """
2135 eaa4c57c Dimitris Aragiorgis
  OP_DSC_FIELD = "network_name"
2136 eaa4c57c Dimitris Aragiorgis
  OP_PARAMS = [
2137 eaa4c57c Dimitris Aragiorgis
    _PGroupName,
2138 eaa4c57c Dimitris Aragiorgis
    _PNetworkName,
2139 6ef37395 Michael Hanselmann
    ("network_mode", ht.NoDefault, ht.TElemOf(constants.NIC_VALID_MODES),
2140 6ef37395 Michael Hanselmann
     "Connectivity mode"),
2141 e1494c96 Iustin Pop
    ("network_link", ht.NoDefault, ht.TString, "Connectivity link"),
2142 6e8091f9 Dimitris Aragiorgis
    ("conflicts_check", True, ht.TBool, "Whether to check for conflicting IPs"),
2143 eaa4c57c Dimitris Aragiorgis
    ]
2144 6e8091f9 Dimitris Aragiorgis
  OP_RESULT = ht.TNone
2145 eaa4c57c Dimitris Aragiorgis
2146 3c286190 Dimitris Aragiorgis
2147 eaa4c57c Dimitris Aragiorgis
class OpNetworkDisconnect(OpCode):
2148 eaa4c57c Dimitris Aragiorgis
  """Disconnect a Network from a Nodegroup. Produce errors if NICs are
2149 eaa4c57c Dimitris Aragiorgis
     present in the Network unless --no-conficts-check option is passed.
2150 eaa4c57c Dimitris Aragiorgis

2151 eaa4c57c Dimitris Aragiorgis
  """
2152 eaa4c57c Dimitris Aragiorgis
  OP_DSC_FIELD = "network_name"
2153 eaa4c57c Dimitris Aragiorgis
  OP_PARAMS = [
2154 eaa4c57c Dimitris Aragiorgis
    _PGroupName,
2155 eaa4c57c Dimitris Aragiorgis
    _PNetworkName,
2156 eaa4c57c Dimitris Aragiorgis
    ]
2157 6e8091f9 Dimitris Aragiorgis
  OP_RESULT = ht.TNone
2158 eaa4c57c Dimitris Aragiorgis
2159 3c286190 Dimitris Aragiorgis
2160 eaa4c57c Dimitris Aragiorgis
class OpNetworkQuery(OpCode):
2161 eaa4c57c Dimitris Aragiorgis
  """Compute the list of networks."""
2162 eaa4c57c Dimitris Aragiorgis
  OP_PARAMS = [
2163 eaa4c57c Dimitris Aragiorgis
    _POutputFields,
2164 8d459129 Michael Hanselmann
    _PUseLocking,
2165 eaa4c57c Dimitris Aragiorgis
    ("names", ht.EmptyList, ht.TListOf(ht.TNonEmptyString),
2166 eaa4c57c Dimitris Aragiorgis
     "Empty list to query all groups, group names otherwise"),
2167 eaa4c57c Dimitris Aragiorgis
    ]
2168 829cfbc5 Dimitris Aragiorgis
  OP_RESULT = _TOldQueryResult
2169 eaa4c57c Dimitris Aragiorgis
2170 eaa4c57c Dimitris Aragiorgis
2171 dbc96028 Michael Hanselmann
def _GetOpList():
2172 dbc96028 Michael Hanselmann
  """Returns list of all defined opcodes.
2173 dbc96028 Michael Hanselmann

2174 dbc96028 Michael Hanselmann
  Does not eliminate duplicates by C{OP_ID}.
2175 dbc96028 Michael Hanselmann

2176 dbc96028 Michael Hanselmann
  """
2177 dbc96028 Michael Hanselmann
  return [v for v in globals().values()
2178 dbc96028 Michael Hanselmann
          if (isinstance(v, type) and issubclass(v, OpCode) and
2179 687c10d9 Iustin Pop
              hasattr(v, "OP_ID") and v is not OpCode)]
2180 dbc96028 Michael Hanselmann
2181 dbc96028 Michael Hanselmann
2182 dbc96028 Michael Hanselmann
OP_MAPPING = dict((v.OP_ID, v) for v in _GetOpList())