Statistics
| Branch: | Tag: | Revision:

root / lib / opcodes.py @ 91c17910

History | View | Annotate | Download (66.1 kB)

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

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

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

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

251 ff0d18e6 Iustin Pop
  @type name: string
252 ff0d18e6 Iustin Pop
  @param name: the class name, as OpXxxYyy
253 ff0d18e6 Iustin Pop
  @rtype: string
254 ff0d18e6 Iustin Pop
  @return: the name in the OP_XXXX_YYYY format
255 ff0d18e6 Iustin Pop

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

272 415feb2e René Nussbaumer
  @param obj: The object to generate type checks
273 415feb2e René Nussbaumer
  @param fields_types: The fields and their types as a dict
274 415feb2e René Nussbaumer
  @return: A ht type check function
275 415feb2e René Nussbaumer

276 415feb2e René Nussbaumer
  """
277 415feb2e René Nussbaumer
  assert set(obj.GetAllSlots()) == set(fields_types.keys()), \
278 415feb2e René Nussbaumer
    "%s != %s" % (set(obj.GetAllSlots()), set(fields_types.keys()))
279 415feb2e René Nussbaumer
  return ht.TStrictDict(True, True, fields_types)
280 415feb2e René Nussbaumer
281 415feb2e René Nussbaumer
282 b02c6bdf Michael Hanselmann
_TQueryFieldDef = \
283 b02c6bdf Michael Hanselmann
  _GenerateObjectTypeCheck(objects.QueryFieldDefinition, {
284 b02c6bdf Michael Hanselmann
    "name": ht.TNonEmptyString,
285 b02c6bdf Michael Hanselmann
    "title": ht.TNonEmptyString,
286 b02c6bdf Michael Hanselmann
    "kind": ht.TElemOf(constants.QFT_ALL),
287 b02c6bdf Michael Hanselmann
    "doc": ht.TNonEmptyString,
288 b02c6bdf Michael Hanselmann
    })
289 415feb2e René Nussbaumer
290 415feb2e René Nussbaumer
291 65e183af Michael Hanselmann
def RequireFileStorage():
292 65e183af Michael Hanselmann
  """Checks that file storage is enabled.
293 65e183af Michael Hanselmann

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

297 65e183af Michael Hanselmann
  @raise errors.OpPrereqError: when file storage is disabled
298 65e183af Michael Hanselmann

299 65e183af Michael Hanselmann
  """
300 65e183af Michael Hanselmann
  if not constants.ENABLE_FILE_STORAGE:
301 65e183af Michael Hanselmann
    raise errors.OpPrereqError("File storage disabled at configure time",
302 65e183af Michael Hanselmann
                               errors.ECODE_INVAL)
303 65e183af Michael Hanselmann
304 65e183af Michael Hanselmann
305 4b97f902 Apollon Oikonomopoulos
def RequireSharedFileStorage():
306 4b97f902 Apollon Oikonomopoulos
  """Checks that shared file storage is enabled.
307 4b97f902 Apollon Oikonomopoulos

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

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

313 4b97f902 Apollon Oikonomopoulos
  """
314 4b97f902 Apollon Oikonomopoulos
  if not constants.ENABLE_SHARED_FILE_STORAGE:
315 4b97f902 Apollon Oikonomopoulos
    raise errors.OpPrereqError("Shared file storage disabled at"
316 4b97f902 Apollon Oikonomopoulos
                               " configure time", errors.ECODE_INVAL)
317 4b97f902 Apollon Oikonomopoulos
318 4b97f902 Apollon Oikonomopoulos
319 8c9ee749 Michael Hanselmann
@ht.WithDesc("CheckFileStorage")
320 8c9ee749 Michael Hanselmann
def _CheckFileStorage(value):
321 8c9ee749 Michael Hanselmann
  """Ensures file storage is enabled if used.
322 65e183af Michael Hanselmann

323 65e183af Michael Hanselmann
  """
324 8c9ee749 Michael Hanselmann
  if value == constants.DT_FILE:
325 65e183af Michael Hanselmann
    RequireFileStorage()
326 4b97f902 Apollon Oikonomopoulos
  elif value == constants.DT_SHARED_FILE:
327 4b97f902 Apollon Oikonomopoulos
    RequireSharedFileStorage()
328 65e183af Michael Hanselmann
  return True
329 65e183af Michael Hanselmann
330 65e183af Michael Hanselmann
331 45fe090b Michael Hanselmann
def _BuildDiskTemplateCheck(accept_none):
332 45fe090b Michael Hanselmann
  """Builds check for disk template.
333 45fe090b Michael Hanselmann

334 45fe090b Michael Hanselmann
  @type accept_none: bool
335 45fe090b Michael Hanselmann
  @param accept_none: whether to accept None as a correct value
336 45fe090b Michael Hanselmann
  @rtype: callable
337 45fe090b Michael Hanselmann

338 45fe090b Michael Hanselmann
  """
339 45fe090b Michael Hanselmann
  template_check = ht.TElemOf(constants.DISK_TEMPLATES)
340 45fe090b Michael Hanselmann
341 45fe090b Michael Hanselmann
  if accept_none:
342 fd9f58fd Iustin Pop
    template_check = ht.TMaybe(template_check)
343 45fe090b Michael Hanselmann
344 45fe090b Michael Hanselmann
  return ht.TAnd(template_check, _CheckFileStorage)
345 8c9ee749 Michael Hanselmann
346 8c9ee749 Michael Hanselmann
347 65e183af Michael Hanselmann
def _CheckStorageType(storage_type):
348 65e183af Michael Hanselmann
  """Ensure a given storage type is valid.
349 65e183af Michael Hanselmann

350 65e183af Michael Hanselmann
  """
351 65e183af Michael Hanselmann
  if storage_type not in constants.VALID_STORAGE_TYPES:
352 65e183af Michael Hanselmann
    raise errors.OpPrereqError("Unknown storage type: %s" % storage_type,
353 65e183af Michael Hanselmann
                               errors.ECODE_INVAL)
354 65e183af Michael Hanselmann
  if storage_type == constants.ST_FILE:
355 63a3d8f7 Michael Hanselmann
    # TODO: What about shared file storage?
356 65e183af Michael Hanselmann
    RequireFileStorage()
357 65e183af Michael Hanselmann
  return True
358 65e183af Michael Hanselmann
359 65e183af Michael Hanselmann
360 65e183af Michael Hanselmann
#: Storage type parameter
361 45d4c81c Michael Hanselmann
_PStorageType = ("storage_type", ht.NoDefault, _CheckStorageType,
362 45d4c81c Michael Hanselmann
                 "Storage type")
363 65e183af Michael Hanselmann
364 3c286190 Dimitris Aragiorgis
365 16091a6e Michael Hanselmann
@ht.WithDesc("IPv4 network")
366 eaa4c57c Dimitris Aragiorgis
def _CheckCIDRNetNotation(value):
367 16091a6e Michael Hanselmann
  """Ensure a given CIDR notation type is valid.
368 eaa4c57c Dimitris Aragiorgis

369 eaa4c57c Dimitris Aragiorgis
  """
370 eaa4c57c Dimitris Aragiorgis
  try:
371 eaa4c57c Dimitris Aragiorgis
    ipaddr.IPv4Network(value)
372 eaa4c57c Dimitris Aragiorgis
  except ipaddr.AddressValueError:
373 eaa4c57c Dimitris Aragiorgis
    return False
374 eaa4c57c Dimitris Aragiorgis
  return True
375 eaa4c57c Dimitris Aragiorgis
376 3c286190 Dimitris Aragiorgis
377 16091a6e Michael Hanselmann
@ht.WithDesc("IPv4 address")
378 eaa4c57c Dimitris Aragiorgis
def _CheckCIDRAddrNotation(value):
379 16091a6e Michael Hanselmann
  """Ensure a given CIDR notation type is valid.
380 eaa4c57c Dimitris Aragiorgis

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

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

405 eaa4c57c Dimitris Aragiorgis
  """
406 eaa4c57c Dimitris Aragiorgis
  try:
407 eaa4c57c Dimitris Aragiorgis
    ipaddr.IPv6Network(value)
408 eaa4c57c Dimitris Aragiorgis
  except ipaddr.AddressValueError:
409 eaa4c57c Dimitris Aragiorgis
    return False
410 eaa4c57c Dimitris Aragiorgis
  return True
411 65e183af Michael Hanselmann
412 3c286190 Dimitris Aragiorgis
413 e1494c96 Iustin Pop
_TIpAddress4 = ht.TAnd(ht.TString, _CheckCIDRAddrNotation)
414 e1494c96 Iustin Pop
_TIpAddress6 = ht.TAnd(ht.TString, _CheckCIDR6AddrNotation)
415 e1494c96 Iustin Pop
_TIpNetwork4 = ht.TAnd(ht.TString, _CheckCIDRNetNotation)
416 e1494c96 Iustin Pop
_TIpNetwork6 = ht.TAnd(ht.TString, _CheckCIDR6NetNotation)
417 e1494c96 Iustin Pop
_TMaybeAddr4List = ht.TMaybe(ht.TListOf(_TIpAddress4))
418 32e3d8b1 Michael Hanselmann
419 32e3d8b1 Michael Hanselmann
420 473d87a3 Iustin Pop
class _AutoOpParamSlots(outils.AutoSlots):
421 65e183af Michael Hanselmann
  """Meta class for opcode definitions.
422 65e183af Michael Hanselmann

423 65e183af Michael Hanselmann
  """
424 65e183af Michael Hanselmann
  def __new__(mcs, name, bases, attrs):
425 65e183af Michael Hanselmann
    """Called when a class should be created.
426 65e183af Michael Hanselmann

427 65e183af Michael Hanselmann
    @param mcs: The meta class
428 65e183af Michael Hanselmann
    @param name: Name of created class
429 65e183af Michael Hanselmann
    @param bases: Base classes
430 65e183af Michael Hanselmann
    @type attrs: dict
431 65e183af Michael Hanselmann
    @param attrs: Class attributes
432 65e183af Michael Hanselmann

433 65e183af Michael Hanselmann
    """
434 e89a9021 Iustin Pop
    assert "OP_ID" not in attrs, "Class '%s' defining OP_ID" % name
435 ff0d18e6 Iustin Pop
436 32683096 René Nussbaumer
    slots = mcs._GetSlots(attrs)
437 32683096 René Nussbaumer
    assert "OP_DSC_FIELD" not in attrs or attrs["OP_DSC_FIELD"] in slots, \
438 32683096 René Nussbaumer
      "Class '%s' uses unknown field in OP_DSC_FIELD" % name
439 8bc17ebb Iustin Pop
    assert ("OP_DSC_FORMATTER" not in attrs or
440 8bc17ebb Iustin Pop
            callable(attrs["OP_DSC_FORMATTER"])), \
441 8bc17ebb Iustin Pop
      ("Class '%s' uses non-callable in OP_DSC_FORMATTER (%s)" %
442 8bc17ebb Iustin Pop
       (name, type(attrs["OP_DSC_FORMATTER"])))
443 32683096 René Nussbaumer
444 e89a9021 Iustin Pop
    attrs["OP_ID"] = _NameToId(name)
445 65e183af Michael Hanselmann
446 473d87a3 Iustin Pop
    return outils.AutoSlots.__new__(mcs, name, bases, attrs)
447 32683096 René Nussbaumer
448 32683096 René Nussbaumer
  @classmethod
449 32683096 René Nussbaumer
  def _GetSlots(mcs, attrs):
450 32683096 René Nussbaumer
    """Build the slots out of OP_PARAMS.
451 32683096 René Nussbaumer

452 32683096 René Nussbaumer
    """
453 65e183af Michael Hanselmann
    # Always set OP_PARAMS to avoid duplicates in BaseOpCode.GetAllParams
454 65e183af Michael Hanselmann
    params = attrs.setdefault("OP_PARAMS", [])
455 65e183af Michael Hanselmann
456 65e183af Michael Hanselmann
    # Use parameter names as slots
457 32683096 René Nussbaumer
    return [pname for (pname, _, _, _) in params]
458 65e183af Michael Hanselmann
459 df458e0b Iustin Pop
460 473d87a3 Iustin Pop
class BaseOpCode(outils.ValidatedSlots):
461 df458e0b Iustin Pop
  """A simple serializable object.
462 df458e0b Iustin Pop

463 0e46916d Iustin Pop
  This object serves as a parent class for OpCode without any custom
464 0e46916d Iustin Pop
  field handling.
465 0e46916d Iustin Pop

466 df458e0b Iustin Pop
  """
467 b459a848 Andrea Spadaccini
  # pylint: disable=E1101
468 e89a9021 Iustin Pop
  # as OP_ID is dynamically defined
469 65e183af Michael Hanselmann
  __metaclass__ = _AutoOpParamSlots
470 65e183af Michael Hanselmann
471 df458e0b Iustin Pop
  def __getstate__(self):
472 a7399f66 Iustin Pop
    """Generic serializer.
473 a7399f66 Iustin Pop

474 a7399f66 Iustin Pop
    This method just returns the contents of the instance as a
475 a7399f66 Iustin Pop
    dictionary.
476 a7399f66 Iustin Pop

477 a7399f66 Iustin Pop
    @rtype:  C{dict}
478 a7399f66 Iustin Pop
    @return: the instance attributes and their values
479 a7399f66 Iustin Pop

480 a7399f66 Iustin Pop
    """
481 df458e0b Iustin Pop
    state = {}
482 32683096 René Nussbaumer
    for name in self.GetAllSlots():
483 df458e0b Iustin Pop
      if hasattr(self, name):
484 df458e0b Iustin Pop
        state[name] = getattr(self, name)
485 df458e0b Iustin Pop
    return state
486 df458e0b Iustin Pop
487 df458e0b Iustin Pop
  def __setstate__(self, state):
488 a7399f66 Iustin Pop
    """Generic unserializer.
489 a7399f66 Iustin Pop

490 a7399f66 Iustin Pop
    This method just restores from the serialized state the attributes
491 a7399f66 Iustin Pop
    of the current instance.
492 a7399f66 Iustin Pop

493 a7399f66 Iustin Pop
    @param state: the serialized opcode data
494 a7399f66 Iustin Pop
    @type state:  C{dict}
495 a7399f66 Iustin Pop

496 a7399f66 Iustin Pop
    """
497 df458e0b Iustin Pop
    if not isinstance(state, dict):
498 df458e0b Iustin Pop
      raise ValueError("Invalid data to __setstate__: expected dict, got %s" %
499 df458e0b Iustin Pop
                       type(state))
500 df458e0b Iustin Pop
501 32683096 René Nussbaumer
    for name in self.GetAllSlots():
502 44db3a6f Iustin Pop
      if name not in state and hasattr(self, name):
503 df458e0b Iustin Pop
        delattr(self, name)
504 df458e0b Iustin Pop
505 df458e0b Iustin Pop
    for name in state:
506 df458e0b Iustin Pop
      setattr(self, name, state[name])
507 df458e0b Iustin Pop
508 adf385c7 Iustin Pop
  @classmethod
509 65e183af Michael Hanselmann
  def GetAllParams(cls):
510 65e183af Michael Hanselmann
    """Compute list of all parameters for an opcode.
511 65e183af Michael Hanselmann

512 65e183af Michael Hanselmann
    """
513 65e183af Michael Hanselmann
    slots = []
514 65e183af Michael Hanselmann
    for parent in cls.__mro__:
515 65e183af Michael Hanselmann
      slots.extend(getattr(parent, "OP_PARAMS", []))
516 65e183af Michael Hanselmann
    return slots
517 65e183af Michael Hanselmann
518 32683096 René Nussbaumer
  def Validate(self, set_defaults): # pylint: disable=W0221
519 1cbef6d8 Michael Hanselmann
    """Validate opcode parameters, optionally setting default values.
520 1cbef6d8 Michael Hanselmann

521 1cbef6d8 Michael Hanselmann
    @type set_defaults: bool
522 1cbef6d8 Michael Hanselmann
    @param set_defaults: Whether to set default values
523 1cbef6d8 Michael Hanselmann
    @raise errors.OpPrereqError: When a parameter value doesn't match
524 1cbef6d8 Michael Hanselmann
                                 requirements
525 1cbef6d8 Michael Hanselmann

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

560 b247c6fc Michael Hanselmann
  @type relative: bool
561 b247c6fc Michael Hanselmann
  @param relative: Whether to accept relative job IDs (negative)
562 b247c6fc Michael Hanselmann
  @rtype: callable
563 b247c6fc Michael Hanselmann

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

599 a7399f66 Iustin Pop
  This is the root of the actual OpCode hierarchy. All clases derived
600 a7399f66 Iustin Pop
  from this class should override OP_ID.
601 a7399f66 Iustin Pop

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

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

640 a7399f66 Iustin Pop
    This method adds to the state dictionary the OP_ID of the class,
641 a7399f66 Iustin Pop
    so that on unload we can identify the correct class for
642 a7399f66 Iustin Pop
    instantiating the opcode.
643 a7399f66 Iustin Pop

644 a7399f66 Iustin Pop
    @rtype:   C{dict}
645 a7399f66 Iustin Pop
    @return:  the state as a dictionary
646 a7399f66 Iustin Pop

647 df458e0b Iustin Pop
    """
648 0e46916d Iustin Pop
    data = BaseOpCode.__getstate__(self)
649 df458e0b Iustin Pop
    data["OP_ID"] = self.OP_ID
650 df458e0b Iustin Pop
    return data
651 df458e0b Iustin Pop
652 df458e0b Iustin Pop
  @classmethod
653 00abdc96 Iustin Pop
  def LoadOpCode(cls, data):
654 df458e0b Iustin Pop
    """Generic load opcode method.
655 df458e0b Iustin Pop

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

660 a7399f66 Iustin Pop
    @type data:  C{dict}
661 a7399f66 Iustin Pop
    @param data: the serialized opcode
662 a7399f66 Iustin Pop

663 df458e0b Iustin Pop
    """
664 df458e0b Iustin Pop
    if not isinstance(data, dict):
665 df458e0b Iustin Pop
      raise ValueError("Invalid data to LoadOpCode (%s)" % type(data))
666 df458e0b Iustin Pop
    if "OP_ID" not in data:
667 df458e0b Iustin Pop
      raise ValueError("Invalid data to LoadOpcode, missing OP_ID")
668 df458e0b Iustin Pop
    op_id = data["OP_ID"]
669 df458e0b Iustin Pop
    op_class = None
670 363acb1e Iustin Pop
    if op_id in OP_MAPPING:
671 363acb1e Iustin Pop
      op_class = OP_MAPPING[op_id]
672 363acb1e Iustin Pop
    else:
673 df458e0b Iustin Pop
      raise ValueError("Invalid data to LoadOpCode: OP_ID %s unsupported" %
674 df458e0b Iustin Pop
                       op_id)
675 df458e0b Iustin Pop
    op = op_class()
676 df458e0b Iustin Pop
    new_data = data.copy()
677 df458e0b Iustin Pop
    del new_data["OP_ID"]
678 df458e0b Iustin Pop
    op.__setstate__(new_data)
679 df458e0b Iustin Pop
    return op
680 df458e0b Iustin Pop
681 60dd1473 Iustin Pop
  def Summary(self):
682 60dd1473 Iustin Pop
    """Generates a summary description of this opcode.
683 60dd1473 Iustin Pop

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

690 60dd1473 Iustin Pop
    """
691 ff0d18e6 Iustin Pop
    assert self.OP_ID is not None and len(self.OP_ID) > 3
692 60dd1473 Iustin Pop
    # all OP_ID start with OP_, we remove that
693 60dd1473 Iustin Pop
    txt = self.OP_ID[3:]
694 60dd1473 Iustin Pop
    field_name = getattr(self, "OP_DSC_FIELD", None)
695 60dd1473 Iustin Pop
    if field_name:
696 60dd1473 Iustin Pop
      field_value = getattr(self, field_name, None)
697 8bc17ebb Iustin Pop
      field_formatter = getattr(self, "OP_DSC_FORMATTER", None)
698 8bc17ebb Iustin Pop
      if callable(field_formatter):
699 8bc17ebb Iustin Pop
        field_value = field_formatter(field_value)
700 8bc17ebb Iustin Pop
      elif isinstance(field_value, (list, tuple)):
701 bc8bbda1 Iustin Pop
        field_value = ",".join(str(i) for i in field_value)
702 60dd1473 Iustin Pop
      txt = "%s(%s)" % (txt, field_value)
703 60dd1473 Iustin Pop
    return txt
704 60dd1473 Iustin Pop
705 3ce9a5e7 Michael Hanselmann
  def TinySummary(self):
706 3ce9a5e7 Michael Hanselmann
    """Generates a compact summary description of the opcode.
707 3ce9a5e7 Michael Hanselmann

708 3ce9a5e7 Michael Hanselmann
    """
709 3ce9a5e7 Michael Hanselmann
    assert self.OP_ID.startswith("OP_")
710 3ce9a5e7 Michael Hanselmann
711 3ce9a5e7 Michael Hanselmann
    text = self.OP_ID[3:]
712 3ce9a5e7 Michael Hanselmann
713 3ce9a5e7 Michael Hanselmann
    for (prefix, supplement) in _SUMMARY_PREFIX.items():
714 3ce9a5e7 Michael Hanselmann
      if text.startswith(prefix):
715 3ce9a5e7 Michael Hanselmann
        return supplement + text[len(prefix):]
716 3ce9a5e7 Michael Hanselmann
717 3ce9a5e7 Michael Hanselmann
    return text
718 3ce9a5e7 Michael Hanselmann
719 a8083063 Iustin Pop
720 afee0879 Iustin Pop
# cluster opcodes
721 afee0879 Iustin Pop
722 bc84ffa7 Iustin Pop
class OpClusterPostInit(OpCode):
723 b5f5fae9 Luca Bigliardi
  """Post cluster initialization.
724 b5f5fae9 Luca Bigliardi

725 b5f5fae9 Luca Bigliardi
  This opcode does not touch the cluster at all. Its purpose is to run hooks
726 b5f5fae9 Luca Bigliardi
  after the cluster has been initialized.
727 b5f5fae9 Luca Bigliardi

728 b5f5fae9 Luca Bigliardi
  """
729 c363310d René Nussbaumer
  OP_RESULT = ht.TBool
730 b5f5fae9 Luca Bigliardi
731 b5f5fae9 Luca Bigliardi
732 c6d43e9e Iustin Pop
class OpClusterDestroy(OpCode):
733 a7399f66 Iustin Pop
  """Destroy the cluster.
734 a7399f66 Iustin Pop

735 a7399f66 Iustin Pop
  This opcode has no other parameters. All the state is irreversibly
736 a7399f66 Iustin Pop
  lost after the execution of this opcode.
737 a7399f66 Iustin Pop

738 a7399f66 Iustin Pop
  """
739 c363310d René Nussbaumer
  OP_RESULT = ht.TNonEmptyString
740 a8083063 Iustin Pop
741 a8083063 Iustin Pop
742 a2f7ab92 Iustin Pop
class OpClusterQuery(OpCode):
743 fdc267f4 Iustin Pop
  """Query cluster information."""
744 415feb2e René Nussbaumer
  OP_RESULT = ht.TDictOf(ht.TNonEmptyString, ht.TAny)
745 a8083063 Iustin Pop
746 a8083063 Iustin Pop
747 fcad7225 Michael Hanselmann
class OpClusterVerify(OpCode):
748 fcad7225 Michael Hanselmann
  """Submits all jobs necessary to verify the cluster.
749 fcad7225 Michael Hanselmann

750 fcad7225 Michael Hanselmann
  """
751 fcad7225 Michael Hanselmann
  OP_PARAMS = [
752 fcad7225 Michael Hanselmann
    _PDebugSimulateErrors,
753 fcad7225 Michael Hanselmann
    _PErrorCodes,
754 fcad7225 Michael Hanselmann
    _PSkipChecks,
755 93f2399e Andrea Spadaccini
    _PIgnoreErrors,
756 fcad7225 Michael Hanselmann
    _PVerbose,
757 3c286190 Dimitris Aragiorgis
    ("group_name", None, ht.TMaybeString, "Group to verify"),
758 fcad7225 Michael Hanselmann
    ]
759 f7686867 Michael Hanselmann
  OP_RESULT = TJobIdListOnly
760 fcad7225 Michael Hanselmann
761 fcad7225 Michael Hanselmann
762 bf93ae69 Adeodato Simo
class OpClusterVerifyConfig(OpCode):
763 bf93ae69 Adeodato Simo
  """Verify the cluster config.
764 bf93ae69 Adeodato Simo

765 bf93ae69 Adeodato Simo
  """
766 bf93ae69 Adeodato Simo
  OP_PARAMS = [
767 57106b74 Michael Hanselmann
    _PDebugSimulateErrors,
768 57106b74 Michael Hanselmann
    _PErrorCodes,
769 93f2399e Andrea Spadaccini
    _PIgnoreErrors,
770 57106b74 Michael Hanselmann
    _PVerbose,
771 bf93ae69 Adeodato Simo
    ]
772 f7686867 Michael Hanselmann
  OP_RESULT = ht.TBool
773 bf93ae69 Adeodato Simo
774 bf93ae69 Adeodato Simo
775 bf93ae69 Adeodato Simo
class OpClusterVerifyGroup(OpCode):
776 bf93ae69 Adeodato Simo
  """Run verify on a node group from the cluster.
777 a7399f66 Iustin Pop

778 a7399f66 Iustin Pop
  @type skip_checks: C{list}
779 a7399f66 Iustin Pop
  @ivar skip_checks: steps to be skipped from the verify process; this
780 a7399f66 Iustin Pop
                     needs to be a subset of
781 a7399f66 Iustin Pop
                     L{constants.VERIFY_OPTIONAL_CHECKS}; currently
782 a7399f66 Iustin Pop
                     only L{constants.VERIFY_NPLUSONE_MEM} can be passed
783 a7399f66 Iustin Pop

784 a7399f66 Iustin Pop
  """
785 bf93ae69 Adeodato Simo
  OP_DSC_FIELD = "group_name"
786 65e183af Michael Hanselmann
  OP_PARAMS = [
787 57106b74 Michael Hanselmann
    _PGroupName,
788 57106b74 Michael Hanselmann
    _PDebugSimulateErrors,
789 57106b74 Michael Hanselmann
    _PErrorCodes,
790 57106b74 Michael Hanselmann
    _PSkipChecks,
791 93f2399e Andrea Spadaccini
    _PIgnoreErrors,
792 57106b74 Michael Hanselmann
    _PVerbose,
793 65e183af Michael Hanselmann
    ]
794 f7686867 Michael Hanselmann
  OP_RESULT = ht.TBool
795 a8083063 Iustin Pop
796 a8083063 Iustin Pop
797 bd8210a7 Iustin Pop
class OpClusterVerifyDisks(OpCode):
798 150e978f Iustin Pop
  """Verify the cluster disks.
799 150e978f Iustin Pop

800 ae1a845c Michael Hanselmann
  """
801 f7686867 Michael Hanselmann
  OP_RESULT = TJobIdListOnly
802 ae1a845c Michael Hanselmann
803 ae1a845c Michael Hanselmann
804 ae1a845c Michael Hanselmann
class OpGroupVerifyDisks(OpCode):
805 ae1a845c Michael Hanselmann
  """Verifies the status of all disks in a node group.
806 150e978f Iustin Pop

807 ae1a845c Michael Hanselmann
  Result: a tuple of three elements:
808 ae1a845c Michael Hanselmann
    - dict of node names with issues (values: error msg)
809 150e978f Iustin Pop
    - list of instances with degraded disks (that should be activated)
810 b63ed789 Iustin Pop
    - dict of instances with missing logical volumes (values: (node, vol)
811 b63ed789 Iustin Pop
      pairs with details about the missing volumes)
812 150e978f Iustin Pop

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

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

821 150e978f Iustin Pop
  """
822 ae1a845c Michael Hanselmann
  OP_DSC_FIELD = "group_name"
823 ae1a845c Michael Hanselmann
  OP_PARAMS = [
824 ae1a845c Michael Hanselmann
    _PGroupName,
825 ae1a845c Michael Hanselmann
    ]
826 1ce03fb1 Michael Hanselmann
  OP_RESULT = \
827 1ce03fb1 Michael Hanselmann
    ht.TAnd(ht.TIsLength(3),
828 1ce03fb1 Michael Hanselmann
            ht.TItems([ht.TDictOf(ht.TString, ht.TString),
829 1ce03fb1 Michael Hanselmann
                       ht.TListOf(ht.TString),
830 6973587f Michael Hanselmann
                       ht.TDictOf(ht.TString,
831 6973587f Michael Hanselmann
                                  ht.TListOf(ht.TListOf(ht.TString)))]))
832 150e978f Iustin Pop
833 150e978f Iustin Pop
834 5d01aca3 Iustin Pop
class OpClusterRepairDiskSizes(OpCode):
835 60975797 Iustin Pop
  """Verify the disk sizes of the instances and fixes configuration
836 60975797 Iustin Pop
  mimatches.
837 60975797 Iustin Pop

838 60975797 Iustin Pop
  Parameters: optional instances list, in case we want to restrict the
839 60975797 Iustin Pop
  checks to only a subset of the instances.
840 60975797 Iustin Pop

841 60975797 Iustin Pop
  Result: a list of tuples, (instance, disk, new-size) for changed
842 60975797 Iustin Pop
  configurations.
843 60975797 Iustin Pop

844 60975797 Iustin Pop
  In normal operation, the list should be empty.
845 60975797 Iustin Pop

846 60975797 Iustin Pop
  @type instances: list
847 60975797 Iustin Pop
  @ivar instances: the list of instances to check, or empty for all instances
848 60975797 Iustin Pop

849 60975797 Iustin Pop
  """
850 65e183af Michael Hanselmann
  OP_PARAMS = [
851 197b323b Michael Hanselmann
    ("instances", ht.EmptyList, ht.TListOf(ht.TNonEmptyString), None),
852 65e183af Michael Hanselmann
    ]
853 c363310d René Nussbaumer
  OP_RESULT = ht.TListOf(ht.TAnd(ht.TIsLength(3),
854 c363310d René Nussbaumer
                                 ht.TItems([ht.TNonEmptyString,
855 2c9fa1ff Iustin Pop
                                            ht.TNonNegativeInt,
856 2c9fa1ff Iustin Pop
                                            ht.TNonNegativeInt])))
857 60975797 Iustin Pop
858 60975797 Iustin Pop
859 2f093ea0 Iustin Pop
class OpClusterConfigQuery(OpCode):
860 ae5849b5 Michael Hanselmann
  """Query cluster configuration values."""
861 65e183af Michael Hanselmann
  OP_PARAMS = [
862 3c286190 Dimitris Aragiorgis
    _POutputFields,
863 65e183af Michael Hanselmann
    ]
864 c363310d René Nussbaumer
  OP_RESULT = ht.TListOf(ht.TAny)
865 a8083063 Iustin Pop
866 a8083063 Iustin Pop
867 e126df25 Iustin Pop
class OpClusterRename(OpCode):
868 a7399f66 Iustin Pop
  """Rename the cluster.
869 a7399f66 Iustin Pop

870 a7399f66 Iustin Pop
  @type name: C{str}
871 a7399f66 Iustin Pop
  @ivar name: The new name of the cluster. The name and/or the master IP
872 a7399f66 Iustin Pop
              address will be changed to match the new name and its IP
873 a7399f66 Iustin Pop
              address.
874 a7399f66 Iustin Pop

875 a7399f66 Iustin Pop
  """
876 60dd1473 Iustin Pop
  OP_DSC_FIELD = "name"
877 65e183af Michael Hanselmann
  OP_PARAMS = [
878 197b323b Michael Hanselmann
    ("name", ht.NoDefault, ht.TNonEmptyString, None),
879 65e183af Michael Hanselmann
    ]
880 c363310d René Nussbaumer
  OP_RESULT = ht.TNonEmptyString
881 07bd8a51 Iustin Pop
882 07bd8a51 Iustin Pop
883 a6682fdc Iustin Pop
class OpClusterSetParams(OpCode):
884 a7399f66 Iustin Pop
  """Change the parameters of the cluster.
885 a7399f66 Iustin Pop

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

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

954 afee0879 Iustin Pop
  """
955 c363310d René Nussbaumer
  OP_RESULT = ht.TNone
956 afee0879 Iustin Pop
957 83f72637 Michael Hanselmann
958 fb926117 Andrea Spadaccini
class OpClusterActivateMasterIp(OpCode):
959 fb926117 Andrea Spadaccini
  """Activate the master IP on the master node.
960 fb926117 Andrea Spadaccini

961 fb926117 Andrea Spadaccini
  """
962 c363310d René Nussbaumer
  OP_RESULT = ht.TNone
963 fb926117 Andrea Spadaccini
964 fb926117 Andrea Spadaccini
965 fb926117 Andrea Spadaccini
class OpClusterDeactivateMasterIp(OpCode):
966 fb926117 Andrea Spadaccini
  """Deactivate the master IP on the master node.
967 fb926117 Andrea Spadaccini

968 fb926117 Andrea Spadaccini
  """
969 c363310d René Nussbaumer
  OP_RESULT = ht.TNone
970 fb926117 Andrea Spadaccini
971 fb926117 Andrea Spadaccini
972 83f72637 Michael Hanselmann
class OpQuery(OpCode):
973 83f72637 Michael Hanselmann
  """Query for resources/items.
974 83f72637 Michael Hanselmann

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

979 83f72637 Michael Hanselmann
  """
980 e50d8412 Michael Hanselmann
  OP_DSC_FIELD = "what"
981 65e183af Michael Hanselmann
  OP_PARAMS = [
982 8e7078e0 Michael Hanselmann
    _PQueryWhat,
983 ee13764f Michael Hanselmann
    _PUseLocking,
984 45d4c81c Michael Hanselmann
    ("fields", ht.NoDefault, ht.TListOf(ht.TNonEmptyString),
985 45d4c81c Michael Hanselmann
     "Requested fields"),
986 fd9f58fd Iustin Pop
    ("qfilter", None, ht.TMaybe(ht.TList),
987 45d4c81c Michael Hanselmann
     "Query filter"),
988 83f72637 Michael Hanselmann
    ]
989 415feb2e René Nussbaumer
  OP_RESULT = \
990 b02c6bdf Michael Hanselmann
    _GenerateObjectTypeCheck(objects.QueryResponse, {
991 b02c6bdf Michael Hanselmann
      "fields": ht.TListOf(_TQueryFieldDef),
992 b02c6bdf Michael Hanselmann
      "data": _TQueryResult,
993 b02c6bdf Michael Hanselmann
      })
994 83f72637 Michael Hanselmann
995 83f72637 Michael Hanselmann
996 83f72637 Michael Hanselmann
class OpQueryFields(OpCode):
997 83f72637 Michael Hanselmann
  """Query for available resource/item fields.
998 83f72637 Michael Hanselmann

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

1002 83f72637 Michael Hanselmann
  """
1003 e50d8412 Michael Hanselmann
  OP_DSC_FIELD = "what"
1004 65e183af Michael Hanselmann
  OP_PARAMS = [
1005 8e7078e0 Michael Hanselmann
    _PQueryWhat,
1006 ff8067cf Michael Hanselmann
    ("fields", None, ht.TMaybeListOf(ht.TNonEmptyString),
1007 8e7078e0 Michael Hanselmann
     "Requested fields; if not given, all are returned"),
1008 83f72637 Michael Hanselmann
    ]
1009 415feb2e René Nussbaumer
  OP_RESULT = \
1010 b02c6bdf Michael Hanselmann
    _GenerateObjectTypeCheck(objects.QueryFieldsResponse, {
1011 b02c6bdf Michael Hanselmann
      "fields": ht.TListOf(_TQueryFieldDef),
1012 b02c6bdf Michael Hanselmann
      })
1013 83f72637 Michael Hanselmann
1014 83f72637 Michael Hanselmann
1015 792af3ad René Nussbaumer
class OpOobCommand(OpCode):
1016 eb64da59 René Nussbaumer
  """Interact with OOB."""
1017 65e183af Michael Hanselmann
  OP_PARAMS = [
1018 c4ec0755 René Nussbaumer
    ("node_names", ht.EmptyList, ht.TListOf(ht.TNonEmptyString),
1019 c4ec0755 René Nussbaumer
     "List of nodes to run the OOB command against"),
1020 70296981 Iustin Pop
    ("command", ht.NoDefault, ht.TElemOf(constants.OOB_COMMANDS),
1021 c4ec0755 René Nussbaumer
     "OOB command to be run"),
1022 c4ec0755 René Nussbaumer
    ("timeout", constants.OOB_TIMEOUT, ht.TInt,
1023 c4ec0755 René Nussbaumer
     "Timeout before the OOB helper will be terminated"),
1024 c4ec0755 René Nussbaumer
    ("ignore_status", False, ht.TBool,
1025 c4ec0755 René Nussbaumer
     "Ignores the node offline status for power off"),
1026 2c9fa1ff Iustin Pop
    ("power_delay", constants.OOB_POWER_DELAY, ht.TNonNegativeFloat,
1027 beff3779 René Nussbaumer
     "Time in seconds to wait between powering on nodes"),
1028 eb64da59 René Nussbaumer
    ]
1029 c363310d René Nussbaumer
  # Fixme: Make it more specific with all the special cases in LUOobCommand
1030 415feb2e René Nussbaumer
  OP_RESULT = _TQueryResult
1031 eb64da59 René Nussbaumer
1032 eb64da59 René Nussbaumer
1033 e4d745a7 Michael Hanselmann
class OpRestrictedCommand(OpCode):
1034 e4d745a7 Michael Hanselmann
  """Runs a restricted command on node(s).
1035 e4d745a7 Michael Hanselmann

1036 e4d745a7 Michael Hanselmann
  """
1037 e4d745a7 Michael Hanselmann
  OP_PARAMS = [
1038 e4d745a7 Michael Hanselmann
    _PUseLocking,
1039 e4d745a7 Michael Hanselmann
    ("nodes", ht.NoDefault, ht.TListOf(ht.TNonEmptyString),
1040 e4d745a7 Michael Hanselmann
     "Nodes on which the command should be run (at least one)"),
1041 e4d745a7 Michael Hanselmann
    ("command", ht.NoDefault, ht.TNonEmptyString,
1042 e4d745a7 Michael Hanselmann
     "Command name (no parameters)"),
1043 e4d745a7 Michael Hanselmann
    ]
1044 e4d745a7 Michael Hanselmann
1045 e4d745a7 Michael Hanselmann
  _RESULT_ITEMS = [
1046 e4d745a7 Michael Hanselmann
    ht.Comment("success")(ht.TBool),
1047 e4d745a7 Michael Hanselmann
    ht.Comment("output or error message")(ht.TString),
1048 e4d745a7 Michael Hanselmann
    ]
1049 e4d745a7 Michael Hanselmann
1050 e4d745a7 Michael Hanselmann
  OP_RESULT = \
1051 e4d745a7 Michael Hanselmann
    ht.TListOf(ht.TAnd(ht.TIsLength(len(_RESULT_ITEMS)),
1052 e4d745a7 Michael Hanselmann
                       ht.TItems(_RESULT_ITEMS)))
1053 e4d745a7 Michael Hanselmann
1054 e4d745a7 Michael Hanselmann
1055 07bd8a51 Iustin Pop
# node opcodes
1056 07bd8a51 Iustin Pop
1057 73d565a3 Iustin Pop
class OpNodeRemove(OpCode):
1058 a7399f66 Iustin Pop
  """Remove a node.
1059 a7399f66 Iustin Pop

1060 a7399f66 Iustin Pop
  @type node_name: C{str}
1061 a7399f66 Iustin Pop
  @ivar node_name: The name of the node to remove. If the node still has
1062 a7399f66 Iustin Pop
                   instances on it, the operation will fail.
1063 a7399f66 Iustin Pop

1064 a7399f66 Iustin Pop
  """
1065 60dd1473 Iustin Pop
  OP_DSC_FIELD = "node_name"
1066 65e183af Michael Hanselmann
  OP_PARAMS = [
1067 65e183af Michael Hanselmann
    _PNodeName,
1068 65e183af Michael Hanselmann
    ]
1069 c363310d René Nussbaumer
  OP_RESULT = ht.TNone
1070 a8083063 Iustin Pop
1071 a8083063 Iustin Pop
1072 d817d49f Iustin Pop
class OpNodeAdd(OpCode):
1073 a7399f66 Iustin Pop
  """Add a node to the cluster.
1074 a7399f66 Iustin Pop

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

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

1248 9bf56d77 Michael Hanselmann
  @ivar instance_name: Instance name
1249 9bf56d77 Michael Hanselmann
  @ivar mode: Instance creation mode (one of L{constants.INSTANCE_CREATE_MODES})
1250 9bf56d77 Michael Hanselmann
  @ivar source_handshake: Signed handshake from source (remote import only)
1251 9bf56d77 Michael Hanselmann
  @ivar source_x509_ca: Source X509 CA in PEM format (remote import only)
1252 9bf56d77 Michael Hanselmann
  @ivar source_instance_name: Previous name of instance (remote import only)
1253 dae91d02 Michael Hanselmann
  @ivar source_shutdown_timeout: Shutdown timeout used for source instance
1254 dae91d02 Michael Hanselmann
    (remote import only)
1255 9bf56d77 Michael Hanselmann

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

1322 12e62af5 René Nussbaumer
  """
1323 12e62af5 René Nussbaumer
  OP_PARAMS = [
1324 1f1188c3 Michael Hanselmann
    _POpportunisticLocking,
1325 89514061 Iustin Pop
    _PIAllocFromDesc("Iallocator used to allocate all the instances"),
1326 4c405df7 Iustin Pop
    ("instances", ht.EmptyList, ht.TListOf(ht.TInstanceOf(OpInstanceCreate)),
1327 12e62af5 René Nussbaumer
     "List of instance create opcodes describing the instances to allocate"),
1328 12e62af5 René Nussbaumer
    ]
1329 12e62af5 René Nussbaumer
  _JOB_LIST = ht.Comment("List of submitted jobs")(TJobIdList)
1330 12e62af5 René Nussbaumer
  ALLOCATABLE_KEY = "allocatable"
1331 12e62af5 René Nussbaumer
  FAILED_KEY = "allocatable"
1332 12e62af5 René Nussbaumer
  OP_RESULT = ht.TStrictDict(True, True, {
1333 12e62af5 René Nussbaumer
    constants.JOB_IDS_KEY: _JOB_LIST,
1334 12e62af5 René Nussbaumer
    ALLOCATABLE_KEY: ht.TListOf(ht.TNonEmptyString),
1335 3c286190 Dimitris Aragiorgis
    FAILED_KEY: ht.TListOf(ht.TNonEmptyString),
1336 12e62af5 René Nussbaumer
    })
1337 12e62af5 René Nussbaumer
1338 12e62af5 René Nussbaumer
  def __getstate__(self):
1339 12e62af5 René Nussbaumer
    """Generic serializer.
1340 12e62af5 René Nussbaumer

1341 12e62af5 René Nussbaumer
    """
1342 12e62af5 René Nussbaumer
    state = OpCode.__getstate__(self)
1343 12e62af5 René Nussbaumer
    if hasattr(self, "instances"):
1344 12e62af5 René Nussbaumer
      # pylint: disable=E1101
1345 12e62af5 René Nussbaumer
      state["instances"] = [inst.__getstate__() for inst in self.instances]
1346 12e62af5 René Nussbaumer
    return state
1347 12e62af5 René Nussbaumer
1348 12e62af5 René Nussbaumer
  def __setstate__(self, state):
1349 12e62af5 René Nussbaumer
    """Generic unserializer.
1350 12e62af5 René Nussbaumer

1351 12e62af5 René Nussbaumer
    This method just restores from the serialized state the attributes
1352 12e62af5 René Nussbaumer
    of the current instance.
1353 12e62af5 René Nussbaumer

1354 12e62af5 René Nussbaumer
    @param state: the serialized opcode data
1355 12e62af5 René Nussbaumer
    @type state: C{dict}
1356 12e62af5 René Nussbaumer

1357 12e62af5 René Nussbaumer
    """
1358 12e62af5 René Nussbaumer
    if not isinstance(state, dict):
1359 12e62af5 René Nussbaumer
      raise ValueError("Invalid data to __setstate__: expected dict, got %s" %
1360 12e62af5 René Nussbaumer
                       type(state))
1361 12e62af5 René Nussbaumer
1362 12e62af5 René Nussbaumer
    if "instances" in state:
1363 5dff65da Michael Hanselmann
      state["instances"] = map(OpCode.LoadOpCode, state["instances"])
1364 5dff65da Michael Hanselmann
1365 12e62af5 René Nussbaumer
    return OpCode.__setstate__(self, state)
1366 12e62af5 René Nussbaumer
1367 9bc5ac44 René Nussbaumer
  def Validate(self, set_defaults):
1368 9bc5ac44 René Nussbaumer
    """Validates this opcode.
1369 9bc5ac44 René Nussbaumer

1370 9bc5ac44 René Nussbaumer
    We do this recursively.
1371 9bc5ac44 René Nussbaumer

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

1493 53c776b5 Iustin Pop
  This migrates (without shutting down an instance) to its secondary
1494 53c776b5 Iustin Pop
  node.
1495 53c776b5 Iustin Pop

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

1499 53c776b5 Iustin Pop
  """
1500 ee69c97f Iustin Pop
  OP_DSC_FIELD = "instance_name"
1501 65e183af Michael Hanselmann
  OP_PARAMS = [
1502 65e183af Michael Hanselmann
    _PInstanceName,
1503 65e183af Michael Hanselmann
    _PMigrationMode,
1504 65e183af Michael Hanselmann
    _PMigrationLive,
1505 f8fa4175 Michael Hanselmann
    _PMigrationTargetNode,
1506 8c0b16f6 Guido Trotter
    _PAllowRuntimeChgs,
1507 3ed23330 René Nussbaumer
    _PIgnoreIpolicy,
1508 45d4c81c Michael Hanselmann
    ("cleanup", False, ht.TBool,
1509 45d4c81c Michael Hanselmann
     "Whether a previously failed migration should be cleaned up"),
1510 89514061 Iustin Pop
    _PIAllocFromDesc("Iallocator for deciding the target node for"
1511 89514061 Iustin Pop
                     " shared-storage instances"),
1512 d5cafd31 René Nussbaumer
    ("allow_failover", False, ht.TBool,
1513 d5cafd31 René Nussbaumer
     "Whether we can fallback to failover if migration is not possible"),
1514 65e183af Michael Hanselmann
    ]
1515 c363310d René Nussbaumer
  OP_RESULT = ht.TNone
1516 53c776b5 Iustin Pop
1517 53c776b5 Iustin Pop
1518 0091b480 Iustin Pop
class OpInstanceMove(OpCode):
1519 313bcead Iustin Pop
  """Move an instance.
1520 313bcead Iustin Pop

1521 313bcead Iustin Pop
  This move (with shutting down an instance and data copying) to an
1522 313bcead Iustin Pop
  arbitrary node.
1523 313bcead Iustin Pop

1524 313bcead Iustin Pop
  @ivar instance_name: the name of the instance
1525 313bcead Iustin Pop
  @ivar target_node: the destination node
1526 313bcead Iustin Pop

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

1620 ddc1de7c Michael Hanselmann
  """
1621 e9c3d864 Michael Hanselmann
  # Old format
1622 e9c3d864 Michael Hanselmann
  # TODO: Remove in version 2.8 including support in LUInstanceSetParams
1623 e9c3d864 Michael Hanselmann
  old_mod_item_fn = \
1624 ddc1de7c Michael Hanselmann
    ht.TAnd(ht.TIsLength(2), ht.TItems([
1625 2c9fa1ff Iustin Pop
      ht.TOr(ht.TElemOf(constants.DDMS_VALUES), ht.TNonNegativeInt),
1626 ddc1de7c Michael Hanselmann
      fn,
1627 ddc1de7c Michael Hanselmann
      ]))
1628 ddc1de7c Michael Hanselmann
1629 e9c3d864 Michael Hanselmann
  # New format, supporting adding/removing disks/NICs at arbitrary indices
1630 e9c3d864 Michael Hanselmann
  mod_item_fn = \
1631 e9c3d864 Michael Hanselmann
    ht.TAnd(ht.TIsLength(3), ht.TItems([
1632 e9c3d864 Michael Hanselmann
      ht.TElemOf(constants.DDMS_VALUES_WITH_MODIFY),
1633 e9c3d864 Michael Hanselmann
      ht.Comment("Disk index, can be negative, e.g. -1 for last disk")(ht.TInt),
1634 e9c3d864 Michael Hanselmann
      fn,
1635 e9c3d864 Michael Hanselmann
      ]))
1636 e9c3d864 Michael Hanselmann
1637 e9c3d864 Michael Hanselmann
  return ht.TOr(ht.Comment("Recommended")(ht.TListOf(mod_item_fn)),
1638 e9c3d864 Michael Hanselmann
                ht.Comment("Deprecated")(ht.TListOf(old_mod_item_fn)))
1639 ddc1de7c Michael Hanselmann
1640 ddc1de7c Michael Hanselmann
1641 9a3cc7ae Iustin Pop
class OpInstanceSetParams(OpCode):
1642 ddc1de7c Michael Hanselmann
  """Change the parameters of an instance.
1643 ddc1de7c Michael Hanselmann

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

1835 1410fa8d Michael Hanselmann
  @ivar instance_name: Instance name
1836 1410fa8d Michael Hanselmann
  @ivar mode: Export mode (one of L{constants.EXPORT_MODES})
1837 1410fa8d Michael Hanselmann

1838 1410fa8d Michael Hanselmann
  """
1839 1410fa8d Michael Hanselmann
  OP_DSC_FIELD = "instance_name"
1840 65e183af Michael Hanselmann
  OP_PARAMS = [
1841 65e183af Michael Hanselmann
    _PInstanceName,
1842 45d4c81c Michael Hanselmann
    ("mode", ht.NoDefault, ht.TElemOf(constants.EXPORT_MODES),
1843 45d4c81c Michael Hanselmann
     "Export mode"),
1844 1410fa8d Michael Hanselmann
    ]
1845 fd9f58fd Iustin Pop
  OP_RESULT = ht.TMaybeDict
1846 1410fa8d Michael Hanselmann
1847 1410fa8d Michael Hanselmann
1848 4ff922a2 Iustin Pop
class OpBackupExport(OpCode):
1849 4a96f1d1 Michael Hanselmann
  """Export an instance.
1850 4a96f1d1 Michael Hanselmann

1851 398e9066 Iustin Pop
  For local exports, the export destination is the node name. For
1852 398e9066 Iustin Pop
  remote exports, the export destination is a list of tuples, each
1853 398e9066 Iustin Pop
  consisting of hostname/IP address, port, magic, HMAC and HMAC
1854 398e9066 Iustin Pop
  salt. The HMAC is calculated using the cluster domain secret over
1855 398e9066 Iustin Pop
  the value "${index}:${hostname}:${port}". The destination X509 CA
1856 398e9066 Iustin Pop
  must be a signed certificate.
1857 4a96f1d1 Michael Hanselmann

1858 4a96f1d1 Michael Hanselmann
  @ivar mode: Export mode (one of L{constants.EXPORT_MODES})
1859 4a96f1d1 Michael Hanselmann
  @ivar target_node: Export destination
1860 4a96f1d1 Michael Hanselmann
  @ivar x509_key_name: X509 key to use (remote export only)
1861 4a96f1d1 Michael Hanselmann
  @ivar destination_x509_ca: Destination X509 CA in PEM format (remote export
1862 4a96f1d1 Michael Hanselmann
                             only)
1863 4a96f1d1 Michael Hanselmann

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

1957 06009e27 Iustin Pop
  This is used just for debugging and testing.
1958 06009e27 Iustin Pop

1959 06009e27 Iustin Pop
  Parameters:
1960 06009e27 Iustin Pop
    - duration: the time to sleep
1961 06009e27 Iustin Pop
    - on_master: if true, sleep on the master
1962 06009e27 Iustin Pop
    - on_nodes: list of nodes in which to sleep
1963 06009e27 Iustin Pop

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

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

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

1974 06009e27 Iustin Pop
  """
1975 60dd1473 Iustin Pop
  OP_DSC_FIELD = "duration"
1976 65e183af Michael Hanselmann
  OP_PARAMS = [
1977 b795a775 Michael Hanselmann
    ("duration", ht.NoDefault, ht.TNumber, None),
1978 197b323b Michael Hanselmann
    ("on_master", True, ht.TBool, None),
1979 197b323b Michael Hanselmann
    ("on_nodes", ht.EmptyList, ht.TListOf(ht.TNonEmptyString), None),
1980 2c9fa1ff Iustin Pop
    ("repeat", 0, ht.TNonNegativeInt, None),
1981 65e183af Michael Hanselmann
    ]
1982 d61df03e Iustin Pop
1983 8bc17ebb Iustin Pop
  def OP_DSC_FORMATTER(self, value): # pylint: disable=C0103,R0201
1984 8bc17ebb Iustin Pop
    """Custom formatter for duration.
1985 8bc17ebb Iustin Pop

1986 8bc17ebb Iustin Pop
    """
1987 8bc17ebb Iustin Pop
    try:
1988 8bc17ebb Iustin Pop
      v = float(value)
1989 8bc17ebb Iustin Pop
    except TypeError:
1990 8bc17ebb Iustin Pop
      v = value
1991 8bc17ebb Iustin Pop
    return str(v)
1992 8bc17ebb Iustin Pop
1993 d61df03e Iustin Pop
1994 d61df03e Iustin Pop
class OpTestAllocator(OpCode):
1995 d61df03e Iustin Pop
  """Allocator framework testing.
1996 d61df03e Iustin Pop

1997 d61df03e Iustin Pop
  This opcode has two modes:
1998 d61df03e Iustin Pop
    - gather and return allocator input for a given mode (allocate new
1999 d61df03e Iustin Pop
      or replace secondary) and a given instance definition (direction
2000 d61df03e Iustin Pop
      'in')
2001 d61df03e Iustin Pop
    - run a selected allocator for a given operation (as above) and
2002 d61df03e Iustin Pop
      return the allocator output (direction 'out')
2003 d61df03e Iustin Pop

2004 d61df03e Iustin Pop
  """
2005 55b7e783 Iustin Pop
  OP_DSC_FIELD = "iallocator"
2006 65e183af Michael Hanselmann
  OP_PARAMS = [
2007 65e183af Michael Hanselmann
    ("direction", ht.NoDefault,
2008 197b323b Michael Hanselmann
     ht.TElemOf(constants.VALID_IALLOCATOR_DIRECTIONS), None),
2009 197b323b Michael Hanselmann
    ("mode", ht.NoDefault, ht.TElemOf(constants.VALID_IALLOCATOR_MODES), None),
2010 197b323b Michael Hanselmann
    ("name", ht.NoDefault, ht.TNonEmptyString, None),
2011 ff8067cf Michael Hanselmann
    ("nics", ht.NoDefault,
2012 ff8067cf Michael Hanselmann
     ht.TMaybeListOf(ht.TDictOf(ht.TElemOf([constants.INIC_MAC,
2013 ff8067cf Michael Hanselmann
                                            constants.INIC_IP,
2014 ff8067cf Michael Hanselmann
                                            "bridge"]),
2015 fd9f58fd Iustin Pop
                                ht.TMaybeString)),
2016 ff8067cf Michael Hanselmann
     None),
2017 fd9f58fd Iustin Pop
    ("disks", ht.NoDefault, ht.TMaybe(ht.TList), None),
2018 197b323b Michael Hanselmann
    ("hypervisor", None, ht.TMaybeString, None),
2019 55b7e783 Iustin Pop
    _PIAllocFromDesc(None),
2020 197b323b Michael Hanselmann
    ("tags", ht.EmptyList, ht.TListOf(ht.TNonEmptyString), None),
2021 fd9f58fd Iustin Pop
    ("memory", None, ht.TMaybe(ht.TNonNegativeInt), None),
2022 fd9f58fd Iustin Pop
    ("vcpus", None, ht.TMaybe(ht.TNonNegativeInt), None),
2023 197b323b Michael Hanselmann
    ("os", None, ht.TMaybeString, None),
2024 197b323b Michael Hanselmann
    ("disk_template", None, ht.TMaybeString, None),
2025 ff8067cf Michael Hanselmann
    ("instances", None, ht.TMaybeListOf(ht.TNonEmptyString), None),
2026 60152bbe Michael Hanselmann
    ("evac_mode", None,
2027 fd9f58fd Iustin Pop
     ht.TMaybe(ht.TElemOf(constants.IALLOCATOR_NEVAC_MODES)), None),
2028 ff8067cf Michael Hanselmann
    ("target_groups", None, ht.TMaybeListOf(ht.TNonEmptyString), None),
2029 2c9fa1ff Iustin Pop
    ("spindle_use", 1, ht.TNonNegativeInt, None),
2030 2c9fa1ff Iustin Pop
    ("count", 1, ht.TNonNegativeInt, None),
2031 d61df03e Iustin Pop
    ]
2032 363acb1e Iustin Pop
2033 76aef8fc Michael Hanselmann
2034 b469eb4d Iustin Pop
class OpTestJqueue(OpCode):
2035 e58f87a9 Michael Hanselmann
  """Utility opcode to test some aspects of the job queue.
2036 e58f87a9 Michael Hanselmann

2037 e58f87a9 Michael Hanselmann
  """
2038 65e183af Michael Hanselmann
  OP_PARAMS = [
2039 197b323b Michael Hanselmann
    ("notify_waitlock", False, ht.TBool, None),
2040 197b323b Michael Hanselmann
    ("notify_exec", False, ht.TBool, None),
2041 197b323b Michael Hanselmann
    ("log_messages", ht.EmptyList, ht.TListOf(ht.TString), None),
2042 197b323b Michael Hanselmann
    ("fail", False, ht.TBool, None),
2043 e58f87a9 Michael Hanselmann
    ]
2044 e58f87a9 Michael Hanselmann
2045 e58f87a9 Michael Hanselmann
2046 be760ba8 Michael Hanselmann
class OpTestDummy(OpCode):
2047 be760ba8 Michael Hanselmann
  """Utility opcode used by unittests.
2048 be760ba8 Michael Hanselmann

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

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

2119 eaa4c57c Dimitris Aragiorgis
  """
2120 eaa4c57c Dimitris Aragiorgis
  OP_DSC_FIELD = "network_name"
2121 eaa4c57c Dimitris Aragiorgis
  OP_PARAMS = [
2122 eaa4c57c Dimitris Aragiorgis
    _PGroupName,
2123 eaa4c57c Dimitris Aragiorgis
    _PNetworkName,
2124 6ef37395 Michael Hanselmann
    ("network_mode", ht.NoDefault, ht.TElemOf(constants.NIC_VALID_MODES),
2125 6ef37395 Michael Hanselmann
     "Connectivity mode"),
2126 e1494c96 Iustin Pop
    ("network_link", ht.NoDefault, ht.TString, "Connectivity link"),
2127 6e8091f9 Dimitris Aragiorgis
    ("conflicts_check", True, ht.TBool, "Whether to check for conflicting IPs"),
2128 eaa4c57c Dimitris Aragiorgis
    ]
2129 6e8091f9 Dimitris Aragiorgis
  OP_RESULT = ht.TNone
2130 eaa4c57c Dimitris Aragiorgis
2131 3c286190 Dimitris Aragiorgis
2132 eaa4c57c Dimitris Aragiorgis
class OpNetworkDisconnect(OpCode):
2133 eaa4c57c Dimitris Aragiorgis
  """Disconnect a Network from a Nodegroup. Produce errors if NICs are
2134 eaa4c57c Dimitris Aragiorgis
     present in the Network unless --no-conficts-check option is passed.
2135 eaa4c57c Dimitris Aragiorgis

2136 eaa4c57c Dimitris Aragiorgis
  """
2137 eaa4c57c Dimitris Aragiorgis
  OP_DSC_FIELD = "network_name"
2138 eaa4c57c Dimitris Aragiorgis
  OP_PARAMS = [
2139 eaa4c57c Dimitris Aragiorgis
    _PGroupName,
2140 eaa4c57c Dimitris Aragiorgis
    _PNetworkName,
2141 eaa4c57c Dimitris Aragiorgis
    ]
2142 6e8091f9 Dimitris Aragiorgis
  OP_RESULT = ht.TNone
2143 eaa4c57c Dimitris Aragiorgis
2144 3c286190 Dimitris Aragiorgis
2145 eaa4c57c Dimitris Aragiorgis
class OpNetworkQuery(OpCode):
2146 eaa4c57c Dimitris Aragiorgis
  """Compute the list of networks."""
2147 eaa4c57c Dimitris Aragiorgis
  OP_PARAMS = [
2148 eaa4c57c Dimitris Aragiorgis
    _POutputFields,
2149 8d459129 Michael Hanselmann
    _PUseLocking,
2150 eaa4c57c Dimitris Aragiorgis
    ("names", ht.EmptyList, ht.TListOf(ht.TNonEmptyString),
2151 eaa4c57c Dimitris Aragiorgis
     "Empty list to query all groups, group names otherwise"),
2152 eaa4c57c Dimitris Aragiorgis
    ]
2153 829cfbc5 Dimitris Aragiorgis
  OP_RESULT = _TOldQueryResult
2154 eaa4c57c Dimitris Aragiorgis
2155 eaa4c57c Dimitris Aragiorgis
2156 dbc96028 Michael Hanselmann
def _GetOpList():
2157 dbc96028 Michael Hanselmann
  """Returns list of all defined opcodes.
2158 dbc96028 Michael Hanselmann

2159 dbc96028 Michael Hanselmann
  Does not eliminate duplicates by C{OP_ID}.
2160 dbc96028 Michael Hanselmann

2161 dbc96028 Michael Hanselmann
  """
2162 dbc96028 Michael Hanselmann
  return [v for v in globals().values()
2163 dbc96028 Michael Hanselmann
          if (isinstance(v, type) and issubclass(v, OpCode) and
2164 687c10d9 Iustin Pop
              hasattr(v, "OP_ID") and v is not OpCode)]
2165 dbc96028 Michael Hanselmann
2166 dbc96028 Michael Hanselmann
2167 dbc96028 Michael Hanselmann
OP_MAPPING = dict((v.OP_ID, v) for v in _GetOpList())