Support 'viridian' parameter in Xen HVM
[ganeti-local] / lib / constants.py
1 #
2 #
3
4 # Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 Google Inc.
5 #
6 # This program is free software; you can redistribute it and/or modify
7 # it under the terms of the GNU General Public License as published by
8 # the Free Software Foundation; either version 2 of the License, or
9 # (at your option) any later version.
10 #
11 # This program is distributed in the hope that it will be useful, but
12 # WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 # General Public License for more details.
15 #
16 # You should have received a copy of the GNU General Public License
17 # along with this program; if not, write to the Free Software
18 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19 # 02110-1301, USA.
20
21
22 """Module holding different constants."""
23
24 import re
25 import socket
26
27 from ganeti import _autoconf
28 from ganeti import _vcsversion
29 from ganeti import compat
30 from ganeti import pathutils
31
32
33 # various versions
34 RELEASE_VERSION = _autoconf.PACKAGE_VERSION
35 OS_API_V10 = 10
36 OS_API_V15 = 15
37 OS_API_V20 = 20
38 OS_API_VERSIONS = compat.UniqueFrozenset([
39   OS_API_V10,
40   OS_API_V15,
41   OS_API_V20,
42   ])
43 VCS_VERSION = _vcsversion.VCS_VERSION
44 EXPORT_VERSION = 0
45 RAPI_VERSION = 2
46
47
48 # Format for CONFIG_VERSION:
49 #   01 03 0123 = 01030123
50 #   ^^ ^^ ^^^^
51 #   |  |  + Configuration version/revision
52 #   |  + Minor version
53 #   + Major version
54 #
55 # It is stored as an integer. Make sure not to write an octal number.
56
57 # BuildVersion and SplitVersion must be in here because we can't import other
58 # modules. The cfgupgrade tool must be able to read and write version numbers
59 # and thus requires these functions. To avoid code duplication, they're kept in
60 # here.
61
62 def BuildVersion(major, minor, revision):
63   """Calculates int version number from major, minor and revision numbers.
64
65   Returns: int representing version number
66
67   """
68   assert isinstance(major, int)
69   assert isinstance(minor, int)
70   assert isinstance(revision, int)
71   return (1000000 * major +
72             10000 * minor +
73                 1 * revision)
74
75
76 def SplitVersion(version):
77   """Splits version number stored in an int.
78
79   Returns: tuple; (major, minor, revision)
80
81   """
82   assert isinstance(version, int)
83
84   (major, remainder) = divmod(version, 1000000)
85   (minor, revision) = divmod(remainder, 10000)
86
87   return (major, minor, revision)
88
89
90 CONFIG_MAJOR = int(_autoconf.VERSION_MAJOR)
91 CONFIG_MINOR = int(_autoconf.VERSION_MINOR)
92 CONFIG_REVISION = 0
93 CONFIG_VERSION = BuildVersion(CONFIG_MAJOR, CONFIG_MINOR, CONFIG_REVISION)
94
95 #: RPC protocol version
96 PROTOCOL_VERSION = BuildVersion(CONFIG_MAJOR, CONFIG_MINOR, 0)
97
98 # user separation
99 DAEMONS_GROUP = _autoconf.DAEMONS_GROUP
100 ADMIN_GROUP = _autoconf.ADMIN_GROUP
101 MASTERD_USER = _autoconf.MASTERD_USER
102 MASTERD_GROUP = _autoconf.MASTERD_GROUP
103 RAPI_USER = _autoconf.RAPI_USER
104 RAPI_GROUP = _autoconf.RAPI_GROUP
105 CONFD_USER = _autoconf.CONFD_USER
106 CONFD_GROUP = _autoconf.CONFD_GROUP
107 LUXID_USER = _autoconf.LUXID_USER
108 LUXID_GROUP = _autoconf.LUXID_GROUP
109 NODED_USER = _autoconf.NODED_USER
110 NODED_GROUP = _autoconf.NODED_GROUP
111 MOND_USER = _autoconf.MOND_USER
112 MOND_GROUP = _autoconf.MOND_GROUP
113 SSH_LOGIN_USER = _autoconf.SSH_LOGIN_USER
114 SSH_CONSOLE_USER = _autoconf.SSH_CONSOLE_USER
115
116 # cpu pinning separators and constants
117 CPU_PINNING_SEP = ":"
118 CPU_PINNING_ALL = "all"
119 # internal representation of "all"
120 CPU_PINNING_ALL_VAL = -1
121 # one "all" entry in a CPU list means CPU pinning is off
122 CPU_PINNING_OFF = [CPU_PINNING_ALL_VAL]
123
124 # A Xen-specific implementation detail - there is no way to actually say
125 # "use any cpu for pinning" in a Xen configuration file, as opposed to the
126 # command line, where you can say "xm vcpu-pin <domain> <vcpu> all".
127 # The workaround used in Xen is "0-63" (see source code function
128 # xm_vcpu_pin in <xen-source>/tools/python/xen/xm/main.py).
129 # To support future changes, the following constant is treated as a
130 # blackbox string that simply means use-any-cpu-for-pinning-under-xen.
131 CPU_PINNING_ALL_XEN = "0-63"
132
133 # A KVM-specific implementation detail - the following value is used
134 # to set CPU affinity to all processors (#0 through #31), per taskset
135 # man page.
136 # FIXME: This only works for machines with up to 32 CPU cores
137 CPU_PINNING_ALL_KVM = 0xFFFFFFFF
138
139 # Wipe
140 DD_CMD = "dd"
141 MAX_WIPE_CHUNK = 1024 # 1GB
142 MIN_WIPE_CHUNK_PERCENT = 10
143
144 RUN_DIRS_MODE = 0775
145 SECURE_DIR_MODE = 0700
146 SECURE_FILE_MODE = 0600
147 ADOPTABLE_BLOCKDEV_ROOT = "/dev/disk/"
148 ENABLE_FILE_STORAGE = _autoconf.ENABLE_FILE_STORAGE
149 ENABLE_SHARED_FILE_STORAGE = _autoconf.ENABLE_SHARED_FILE_STORAGE
150 ENABLE_CONFD = _autoconf.ENABLE_CONFD
151 ENABLE_MOND = _autoconf.ENABLE_MOND
152 ENABLE_SPLIT_QUERY = _autoconf.ENABLE_SPLIT_QUERY
153 ENABLE_RESTRICTED_COMMANDS = _autoconf.ENABLE_RESTRICTED_COMMANDS
154
155 # SSH constants
156 SSH = "ssh"
157 SCP = "scp"
158
159 NODED = "ganeti-noded"
160 CONFD = "ganeti-confd"
161 LUXID = "ganeti-luxid"
162 RAPI = "ganeti-rapi"
163 MASTERD = "ganeti-masterd"
164 MOND = "ganeti-mond"
165
166 DAEMONS = compat.UniqueFrozenset([
167   NODED,
168   CONFD,
169   LUXID,
170   RAPI,
171   MASTERD,
172   MOND,
173   ])
174
175 DAEMONS_PORTS = {
176   # daemon-name: ("proto", "default-port")
177   NODED: ("tcp", 1811),
178   CONFD: ("udp", 1814),
179   MOND: ("tcp", 1815),
180   RAPI: ("tcp", 5080),
181   SSH: ("tcp", 22),
182 }
183
184 DEFAULT_NODED_PORT = DAEMONS_PORTS[NODED][1]
185 DEFAULT_CONFD_PORT = DAEMONS_PORTS[CONFD][1]
186 DEFAULT_MOND_PORT = DAEMONS_PORTS[MOND][1]
187 DEFAULT_RAPI_PORT = DAEMONS_PORTS[RAPI][1]
188
189 FIRST_DRBD_PORT = 11000
190 LAST_DRBD_PORT = 14999
191
192 DAEMONS_LOGBASE = {
193   NODED: "node-daemon",
194   CONFD: "conf-daemon",
195   LUXID: "luxi-daemon",
196   RAPI: "rapi-daemon",
197   MASTERD: "master-daemon",
198   MOND: "monitoring-daemon",
199   }
200
201 DAEMONS_LOGFILES = \
202     dict((daemon, pathutils.GetLogFilename(DAEMONS_LOGBASE[daemon]))
203          for daemon in DAEMONS_LOGBASE)
204
205 # Some daemons might require more than one logfile.
206 # Specifically, right now only the Haskell http library "snap", used by the
207 # monitoring daemon, requires multiple log files.
208
209 # These are the only valid reasons for having an extra logfile
210 EXTRA_LOGREASON_ACCESS = "access"
211 EXTRA_LOGREASON_ERROR = "error"
212
213 VALID_EXTRA_LOGREASONS = compat.UniqueFrozenset([
214   EXTRA_LOGREASON_ACCESS,
215   EXTRA_LOGREASON_ERROR,
216   ])
217
218 # These are the extra logfiles, grouped by daemon
219 DAEMONS_EXTRA_LOGBASE = {
220   MOND: {
221     EXTRA_LOGREASON_ACCESS: "monitoring-daemon-access",
222     EXTRA_LOGREASON_ERROR: "monitoring-daemon-error",
223     }
224   }
225
226 DAEMONS_EXTRA_LOGFILES = \
227   dict((daemon, dict((extra,
228        pathutils.GetLogFilename(DAEMONS_EXTRA_LOGBASE[daemon][extra]))
229        for extra in DAEMONS_EXTRA_LOGBASE[daemon]))
230          for daemon in DAEMONS_EXTRA_LOGBASE)
231
232 DEV_CONSOLE = "/dev/console"
233
234 PROC_MOUNTS = "/proc/mounts"
235
236 # Local UniX Interface related constants
237 LUXI_EOM = "\3"
238 LUXI_VERSION = CONFIG_VERSION
239 #: Environment variable for the luxi override socket
240 LUXI_OVERRIDE = "FORCE_LUXI_SOCKET"
241 LUXI_OVERRIDE_MASTER = "master"
242 LUXI_OVERRIDE_QUERY = "query"
243
244 # one of "no", "yes", "only"
245 SYSLOG_USAGE = _autoconf.SYSLOG_USAGE
246 SYSLOG_NO = "no"
247 SYSLOG_YES = "yes"
248 SYSLOG_ONLY = "only"
249 SYSLOG_SOCKET = "/dev/log"
250
251 EXPORT_CONF_FILE = "config.ini"
252
253 XEN_BOOTLOADER = _autoconf.XEN_BOOTLOADER
254 XEN_KERNEL = _autoconf.XEN_KERNEL
255 XEN_INITRD = _autoconf.XEN_INITRD
256 XEN_CMD_XM = "xm"
257 XEN_CMD_XL = "xl"
258 # FIXME: This will be made configurable using hvparams in Ganeti 2.7
259 XEN_CMD = _autoconf.XEN_CMD
260
261 KNOWN_XEN_COMMANDS = compat.UniqueFrozenset([
262   XEN_CMD_XM,
263   XEN_CMD_XL,
264   ])
265
266 # When the Xen toolstack used is "xl", live migration requires the source host
267 # to connect to the target host via ssh (xl runs this command). We need to pass
268 # the command xl runs some extra info so that it can use Ganeti's key
269 # verification and not fail. Note that this string is incomplete: it must be
270 # filled with the cluster name before being used.
271 XL_SSH_CMD = ("ssh -l %s -oGlobalKnownHostsFile=%s"
272               " -oUserKnownHostsFile=/dev/null"
273               " -oCheckHostIp=no -oStrictHostKeyChecking=yes"
274               " -oHostKeyAlias=%%s") % (SSH_LOGIN_USER,
275                                         pathutils.SSH_KNOWN_HOSTS_FILE)
276
277 KVM_PATH = _autoconf.KVM_PATH
278 KVM_KERNEL = _autoconf.KVM_KERNEL
279 SOCAT_PATH = _autoconf.SOCAT_PATH
280 SOCAT_USE_ESCAPE = _autoconf.SOCAT_USE_ESCAPE
281 SOCAT_USE_COMPRESS = _autoconf.SOCAT_USE_COMPRESS
282 SOCAT_ESCAPE_CODE = "0x1d"
283
284 #: Console as SSH command
285 CONS_SSH = "ssh"
286
287 #: Console as VNC server
288 CONS_VNC = "vnc"
289
290 #: Console as SPICE server
291 CONS_SPICE = "spice"
292
293 #: Display a message for console access
294 CONS_MESSAGE = "msg"
295
296 #: All console types
297 CONS_ALL = compat.UniqueFrozenset([
298   CONS_SSH,
299   CONS_VNC,
300   CONS_SPICE,
301   CONS_MESSAGE,
302   ])
303
304 # For RSA keys more bits are better, but they also make operations more
305 # expensive. NIST SP 800-131 recommends a minimum of 2048 bits from the year
306 # 2010 on.
307 RSA_KEY_BITS = 2048
308
309 # Ciphers allowed for SSL connections. For the format, see ciphers(1). A better
310 # way to disable ciphers would be to use the exclamation mark (!), but socat
311 # versions below 1.5 can't parse exclamation marks in options properly. When
312 # modifying the ciphers, ensure not to accidentially add something after it's
313 # been removed. Use the "openssl" utility to check the allowed ciphers, e.g.
314 # "openssl ciphers -v HIGH:-DES".
315 OPENSSL_CIPHERS = "HIGH:-DES:-3DES:-EXPORT:-ADH"
316
317 # Digest used to sign certificates ("openssl x509" uses SHA1 by default)
318 X509_CERT_SIGN_DIGEST = "SHA1"
319
320 # Default validity of certificates in days
321 X509_CERT_DEFAULT_VALIDITY = 365 * 5
322
323 # commonName (CN) used in certificates
324 X509_CERT_CN = "ganeti.example.com"
325
326 X509_CERT_SIGNATURE_HEADER = "X-Ganeti-Signature"
327
328 # Import/export daemon mode
329 IEM_IMPORT = "import"
330 IEM_EXPORT = "export"
331
332 # Import/export transport compression
333 IEC_NONE = "none"
334 IEC_GZIP = "gzip"
335 IEC_ALL = compat.UniqueFrozenset([
336   IEC_NONE,
337   IEC_GZIP,
338   ])
339
340 IE_CUSTOM_SIZE = "fd"
341
342 IE_MAGIC_RE = re.compile(r"^[-_.a-zA-Z0-9]{5,100}$")
343
344 # Import/export I/O
345 # Direct file I/O, equivalent to a shell's I/O redirection using '<' or '>'
346 IEIO_FILE = "file"
347 # Raw block device I/O using "dd"
348 IEIO_RAW_DISK = "raw"
349 # OS definition import/export script
350 IEIO_SCRIPT = "script"
351
352 VALUE_DEFAULT = "default"
353 VALUE_AUTO = "auto"
354 VALUE_GENERATE = "generate"
355 VALUE_NONE = "none"
356 VALUE_TRUE = "true"
357 VALUE_FALSE = "false"
358
359 # External script validation mask
360 EXT_PLUGIN_MASK = re.compile("^[a-zA-Z0-9_-]+$")
361
362 # hooks-related constants
363 HOOKS_PHASE_PRE = "pre"
364 HOOKS_PHASE_POST = "post"
365 HOOKS_NAME_CFGUPDATE = "config-update"
366 HOOKS_NAME_WATCHER = "watcher"
367 HOOKS_VERSION = 2
368 HOOKS_PATH = "/sbin:/bin:/usr/sbin:/usr/bin"
369
370 # hooks subject type (what object type does the LU deal with)
371 HTYPE_CLUSTER = "CLUSTER"
372 HTYPE_NODE = "NODE"
373 HTYPE_GROUP = "GROUP"
374 HTYPE_INSTANCE = "INSTANCE"
375 HTYPE_NETWORK = "NETWORK"
376
377 HKR_SKIP = 0
378 HKR_FAIL = 1
379 HKR_SUCCESS = 2
380
381 # Storage types
382 ST_BLOCK = "blockdev"
383 ST_DISKLESS = "diskless"
384 ST_EXT = "ext"
385 ST_FILE = "file"
386 ST_LVM_PV = "lvm-pv"
387 ST_LVM_VG = "lvm-vg"
388 ST_RADOS = "rados"
389
390 VALID_STORAGE_TYPES = compat.UniqueFrozenset([
391   ST_BLOCK,
392   ST_DISKLESS,
393   ST_EXT,
394   ST_FILE,
395   ST_LVM_PV,
396   ST_LVM_VG,
397   ST_RADOS,
398   ])
399
400 # Storage fields
401 # first two are valid in LU context only, not passed to backend
402 SF_NODE = "node"
403 SF_TYPE = "type"
404 # and the rest are valid in backend
405 SF_NAME = "name"
406 SF_SIZE = "size"
407 SF_FREE = "free"
408 SF_USED = "used"
409 SF_ALLOCATABLE = "allocatable"
410
411 # Storage operations
412 SO_FIX_CONSISTENCY = "fix-consistency"
413
414 # Available fields per storage type
415 VALID_STORAGE_FIELDS = compat.UniqueFrozenset([
416   SF_NAME,
417   SF_TYPE,
418   SF_SIZE,
419   SF_USED,
420   SF_FREE,
421   SF_ALLOCATABLE,
422   ])
423
424 MODIFIABLE_STORAGE_FIELDS = {
425   ST_LVM_PV: frozenset([SF_ALLOCATABLE]),
426   }
427
428 VALID_STORAGE_OPERATIONS = {
429   ST_LVM_VG: frozenset([SO_FIX_CONSISTENCY]),
430   }
431
432 # Local disk status
433 # Note: Code depends on LDS_OKAY < LDS_UNKNOWN < LDS_FAULTY
434 (LDS_OKAY,
435  LDS_UNKNOWN,
436  LDS_FAULTY) = range(1, 4)
437
438 # disk template types
439 DT_BLOCK = "blockdev"
440 DT_DISKLESS = "diskless"
441 DT_DRBD8 = "drbd"
442 DT_EXT = "ext"
443 DT_FILE = "file"
444 DT_PLAIN = "plain"
445 DT_RBD = "rbd"
446 DT_SHARED_FILE = "sharedfile"
447
448 # This is used to order determine the default disk template when the list
449 # of enabled disk templates is inferred from the current state of the cluster.
450 # This only happens on an upgrade from a version of Ganeti that did not
451 # support the 'enabled_disk_templates' so far.
452 DISK_TEMPLATE_PREFERENCE = [
453   DT_DRBD8,
454   DT_PLAIN,
455   DT_FILE,
456   DT_SHARED_FILE,
457   DT_RBD,
458   DT_BLOCK,
459   DT_DISKLESS,
460   DT_EXT
461   ]
462
463 DISK_TEMPLATES = compat.UniqueFrozenset([
464   DT_DISKLESS,
465   DT_PLAIN,
466   DT_DRBD8,
467   DT_FILE,
468   DT_SHARED_FILE,
469   DT_BLOCK,
470   DT_RBD,
471   DT_EXT
472   ])
473
474 # disk templates that are enabled by default
475 DEFAULT_ENABLED_DISK_TEMPLATES = compat.UniqueFrozenset([
476   DT_DRBD8,
477   DT_PLAIN,
478   ])
479
480 # mapping of disk templates to storage types
481 DISK_TEMPLATES_STORAGE_TYPE = {
482   DT_BLOCK: ST_BLOCK,
483   DT_DISKLESS: ST_DISKLESS,
484   DT_DRBD8: ST_LVM_VG,
485   DT_EXT: ST_EXT,
486   DT_FILE: ST_FILE,
487   DT_PLAIN: ST_LVM_VG,
488   DT_RBD: ST_RADOS,
489   DT_SHARED_FILE: ST_FILE,
490   }
491
492 # the set of network-mirrored disk templates
493 DTS_INT_MIRROR = compat.UniqueFrozenset([DT_DRBD8])
494
495 # the set of externally-mirrored disk templates (e.g. SAN, NAS)
496 DTS_EXT_MIRROR = compat.UniqueFrozenset([
497   DT_DISKLESS, # 'trivially' externally mirrored
498   DT_SHARED_FILE,
499   DT_BLOCK,
500   DT_RBD,
501   DT_EXT,
502   ])
503
504 # the set of non-lvm-based disk templates
505 DTS_NOT_LVM = compat.UniqueFrozenset([
506   DT_DISKLESS,
507   DT_FILE,
508   DT_SHARED_FILE,
509   DT_BLOCK,
510   DT_RBD,
511   DT_EXT,
512   ])
513
514 # the set of disk templates which can be grown
515 DTS_GROWABLE = compat.UniqueFrozenset([
516   DT_PLAIN,
517   DT_DRBD8,
518   DT_FILE,
519   DT_SHARED_FILE,
520   DT_RBD,
521   DT_EXT,
522   ])
523
524 # the set of disk templates that allow adoption
525 DTS_MAY_ADOPT = compat.UniqueFrozenset([
526   DT_PLAIN,
527   DT_BLOCK,
528   ])
529
530 # the set of disk templates that *must* use adoption
531 DTS_MUST_ADOPT = compat.UniqueFrozenset([DT_BLOCK])
532
533 # the set of disk templates that allow migrations
534 DTS_MIRRORED = frozenset.union(DTS_INT_MIRROR, DTS_EXT_MIRROR)
535
536 # the set of file based disk templates
537 DTS_FILEBASED = compat.UniqueFrozenset([
538   DT_FILE,
539   DT_SHARED_FILE,
540   ])
541
542 # the set of disk templates that can be moved by copying
543 # Note: a requirement is that they're not accessed externally or shared between
544 # nodes; in particular, sharedfile is not suitable.
545 DTS_COPYABLE = compat.UniqueFrozenset([
546   DT_FILE,
547   DT_PLAIN,
548   ])
549
550 # the set of disk templates that are supported by exclusive_storage
551 DTS_EXCL_STORAGE = compat.UniqueFrozenset([DT_PLAIN])
552
553 # templates for which we don't perform checks on free space
554 DTS_NO_FREE_SPACE_CHECK = compat.UniqueFrozenset([
555   DT_FILE,
556   DT_SHARED_FILE,
557   DT_RBD,
558   DT_EXT,
559   ])
560
561 # logical disk types
562 LD_LV = "lvm"
563 LD_DRBD8 = "drbd8"
564 LD_FILE = "file"
565 LD_BLOCKDEV = "blockdev"
566 LD_RBD = "rbd"
567 LD_EXT = "ext"
568 LOGICAL_DISK_TYPES = compat.UniqueFrozenset([
569   LD_LV,
570   LD_DRBD8,
571   LD_FILE,
572   LD_BLOCKDEV,
573   LD_RBD,
574   LD_EXT,
575   ])
576
577 LDS_BLOCK = compat.UniqueFrozenset([
578   LD_LV,
579   LD_DRBD8,
580   LD_BLOCKDEV,
581   LD_RBD,
582   LD_EXT,
583   ])
584
585 # drbd constants
586 DRBD_HMAC_ALG = "md5"
587 DRBD_NET_PROTOCOL = "C"
588 DRBD_STATUS_FILE = "/proc/drbd"
589
590 #: Size of DRBD meta block device
591 DRBD_META_SIZE = 128
592
593 # drbd barrier types
594 DRBD_B_NONE = "n"
595 DRBD_B_DISK_BARRIERS = "b"
596 DRBD_B_DISK_DRAIN = "d"
597 DRBD_B_DISK_FLUSH = "f"
598
599 # Valid barrier combinations: "n" or any non-null subset of "bfd"
600 DRBD_VALID_BARRIER_OPT = compat.UniqueFrozenset([
601   frozenset([DRBD_B_NONE]),
602   frozenset([DRBD_B_DISK_BARRIERS]),
603   frozenset([DRBD_B_DISK_DRAIN]),
604   frozenset([DRBD_B_DISK_FLUSH]),
605   frozenset([DRBD_B_DISK_DRAIN, DRBD_B_DISK_FLUSH]),
606   frozenset([DRBD_B_DISK_BARRIERS, DRBD_B_DISK_DRAIN]),
607   frozenset([DRBD_B_DISK_BARRIERS, DRBD_B_DISK_FLUSH]),
608   frozenset([DRBD_B_DISK_BARRIERS, DRBD_B_DISK_FLUSH, DRBD_B_DISK_DRAIN]),
609   ])
610
611 # rbd tool command
612 RBD_CMD = "rbd"
613
614 # file backend driver
615 FD_LOOP = "loop"
616 FD_BLKTAP = "blktap"
617
618 # the set of drbd-like disk types
619 LDS_DRBD = compat.UniqueFrozenset([LD_DRBD8])
620
621 # disk access mode
622 DISK_RDONLY = "ro"
623 DISK_RDWR = "rw"
624 DISK_ACCESS_SET = compat.UniqueFrozenset([DISK_RDONLY, DISK_RDWR])
625
626 # disk replacement mode
627 REPLACE_DISK_PRI = "replace_on_primary"    # replace disks on primary
628 REPLACE_DISK_SEC = "replace_on_secondary"  # replace disks on secondary
629 REPLACE_DISK_CHG = "replace_new_secondary" # change secondary node
630 REPLACE_DISK_AUTO = "replace_auto"
631 REPLACE_MODES = compat.UniqueFrozenset([
632   REPLACE_DISK_PRI,
633   REPLACE_DISK_SEC,
634   REPLACE_DISK_CHG,
635   REPLACE_DISK_AUTO,
636   ])
637
638 # Instance export mode
639 EXPORT_MODE_LOCAL = "local"
640 EXPORT_MODE_REMOTE = "remote"
641 EXPORT_MODES = compat.UniqueFrozenset([
642   EXPORT_MODE_LOCAL,
643   EXPORT_MODE_REMOTE,
644   ])
645
646 # instance creation modes
647 INSTANCE_CREATE = "create"
648 INSTANCE_IMPORT = "import"
649 INSTANCE_REMOTE_IMPORT = "remote-import"
650 INSTANCE_CREATE_MODES = compat.UniqueFrozenset([
651   INSTANCE_CREATE,
652   INSTANCE_IMPORT,
653   INSTANCE_REMOTE_IMPORT,
654   ])
655
656 # Remote import/export handshake message and version
657 RIE_VERSION = 0
658 RIE_HANDSHAKE = "Hi, I'm Ganeti"
659
660 # Remote import/export certificate validity in seconds
661 RIE_CERT_VALIDITY = 24 * 60 * 60
662
663 # Overall timeout for establishing connection
664 RIE_CONNECT_TIMEOUT = 180
665
666 # Export only: how long to wait per connection attempt (seconds)
667 RIE_CONNECT_ATTEMPT_TIMEOUT = 20
668
669 # Export only: number of attempts to connect
670 RIE_CONNECT_RETRIES = 10
671
672 #: Give child process up to 5 seconds to exit after sending a signal
673 CHILD_LINGER_TIMEOUT = 5.0
674
675 FILE_DRIVER = compat.UniqueFrozenset([FD_LOOP, FD_BLKTAP])
676
677 # import/export config options
678 INISECT_EXP = "export"
679 INISECT_INS = "instance"
680 INISECT_HYP = "hypervisor"
681 INISECT_BEP = "backend"
682 INISECT_OSP = "os"
683
684 # dynamic device modification
685 DDM_ADD = "add"
686 DDM_MODIFY = "modify"
687 DDM_REMOVE = "remove"
688 DDMS_VALUES = compat.UniqueFrozenset([DDM_ADD, DDM_REMOVE])
689 DDMS_VALUES_WITH_MODIFY = (DDMS_VALUES | frozenset([
690   DDM_MODIFY,
691   ]))
692 # TODO: DDM_SWAP, DDM_MOVE?
693
694 # common exit codes
695 EXIT_SUCCESS = 0
696 EXIT_FAILURE = 1
697 EXIT_NOTCLUSTER = 5
698 EXIT_NOTMASTER = 11
699 EXIT_NODESETUP_ERROR = 12
700 EXIT_CONFIRMATION = 13 # need user confirmation
701
702 #: Exit code for query operations with unknown fields
703 EXIT_UNKNOWN_FIELD = 14
704
705 # tags
706 TAG_CLUSTER = "cluster"
707 TAG_NODEGROUP = "nodegroup"
708 TAG_NODE = "node"
709 TAG_INSTANCE = "instance"
710 TAG_NETWORK = "network"
711 VALID_TAG_TYPES = compat.UniqueFrozenset([
712   TAG_CLUSTER,
713   TAG_NODEGROUP,
714   TAG_NODE,
715   TAG_INSTANCE,
716   TAG_NETWORK,
717   ])
718 MAX_TAG_LEN = 128
719 MAX_TAGS_PER_OBJ = 4096
720
721 # others
722 DEFAULT_BRIDGE = "xen-br0"
723 CLASSIC_DRBD_SYNC_SPEED = 60 * 1024  # 60 MiB, expressed in KiB
724 IP4_ADDRESS_LOCALHOST = "127.0.0.1"
725 IP4_ADDRESS_ANY = "0.0.0.0"
726 IP6_ADDRESS_LOCALHOST = "::1"
727 IP6_ADDRESS_ANY = "::"
728 IP4_VERSION = 4
729 IP6_VERSION = 6
730 VALID_IP_VERSIONS = compat.UniqueFrozenset([IP4_VERSION, IP6_VERSION])
731 # for export to htools
732 IP4_FAMILY = socket.AF_INET
733 IP6_FAMILY = socket.AF_INET6
734
735 TCP_PING_TIMEOUT = 10
736 DEFAULT_VG = "xenvg"
737 DEFAULT_DRBD_HELPER = "/bin/true"
738 MIN_VG_SIZE = 20480
739 DEFAULT_MAC_PREFIX = "aa:00:00"
740 # default maximum instance wait time, in seconds.
741 DEFAULT_SHUTDOWN_TIMEOUT = 120
742 NODE_MAX_CLOCK_SKEW = 150
743 # Time for an intra-cluster disk transfer to wait for a connection
744 DISK_TRANSFER_CONNECT_TIMEOUT = 60
745 # Disk index separator
746 DISK_SEPARATOR = _autoconf.DISK_SEPARATOR
747 IP_COMMAND_PATH = _autoconf.IP_PATH
748
749 #: Key for job IDs in opcode result
750 JOB_IDS_KEY = "jobs"
751
752 # runparts results
753 (RUNPARTS_SKIP,
754  RUNPARTS_RUN,
755  RUNPARTS_ERR) = range(3)
756
757 RUNPARTS_STATUS = compat.UniqueFrozenset([
758   RUNPARTS_SKIP,
759   RUNPARTS_RUN,
760   RUNPARTS_ERR,
761   ])
762
763 # RPC constants
764 (RPC_ENCODING_NONE,
765  RPC_ENCODING_ZLIB_BASE64) = range(2)
766
767 # Various time constants for the timeout table
768 RPC_TMO_URGENT = 60 # one minute
769 RPC_TMO_FAST = 5 * 60 # five minutes
770 RPC_TMO_NORMAL = 15 * 60 # 15 minutes
771 RPC_TMO_SLOW = 3600 # one hour
772 RPC_TMO_4HRS = 4 * 3600
773 RPC_TMO_1DAY = 86400
774
775 # Timeout for connecting to nodes (seconds)
776 RPC_CONNECT_TIMEOUT = 5
777
778 # os related constants
779 OS_SCRIPT_CREATE = "create"
780 OS_SCRIPT_IMPORT = "import"
781 OS_SCRIPT_EXPORT = "export"
782 OS_SCRIPT_RENAME = "rename"
783 OS_SCRIPT_VERIFY = "verify"
784 OS_SCRIPTS = compat.UniqueFrozenset([
785   OS_SCRIPT_CREATE,
786   OS_SCRIPT_IMPORT,
787   OS_SCRIPT_EXPORT,
788   OS_SCRIPT_RENAME,
789   OS_SCRIPT_VERIFY,
790   ])
791
792 OS_API_FILE = "ganeti_api_version"
793 OS_VARIANTS_FILE = "variants.list"
794 OS_PARAMETERS_FILE = "parameters.list"
795
796 OS_VALIDATE_PARAMETERS = "parameters"
797 OS_VALIDATE_CALLS = compat.UniqueFrozenset([OS_VALIDATE_PARAMETERS])
798
799 # External Storage (ES) related constants
800 ES_ACTION_CREATE = "create"
801 ES_ACTION_REMOVE = "remove"
802 ES_ACTION_GROW = "grow"
803 ES_ACTION_ATTACH = "attach"
804 ES_ACTION_DETACH = "detach"
805 ES_ACTION_SETINFO = "setinfo"
806 ES_ACTION_VERIFY = "verify"
807
808 ES_SCRIPT_CREATE = ES_ACTION_CREATE
809 ES_SCRIPT_REMOVE = ES_ACTION_REMOVE
810 ES_SCRIPT_GROW = ES_ACTION_GROW
811 ES_SCRIPT_ATTACH = ES_ACTION_ATTACH
812 ES_SCRIPT_DETACH = ES_ACTION_DETACH
813 ES_SCRIPT_SETINFO = ES_ACTION_SETINFO
814 ES_SCRIPT_VERIFY = ES_ACTION_VERIFY
815 ES_SCRIPTS = frozenset([
816   ES_SCRIPT_CREATE,
817   ES_SCRIPT_REMOVE,
818   ES_SCRIPT_GROW,
819   ES_SCRIPT_ATTACH,
820   ES_SCRIPT_DETACH,
821   ES_SCRIPT_SETINFO,
822   ES_SCRIPT_VERIFY
823   ])
824
825 ES_PARAMETERS_FILE = "parameters.list"
826
827 # reboot types
828 INSTANCE_REBOOT_SOFT = "soft"
829 INSTANCE_REBOOT_HARD = "hard"
830 INSTANCE_REBOOT_FULL = "full"
831
832 REBOOT_TYPES = compat.UniqueFrozenset([
833   INSTANCE_REBOOT_SOFT,
834   INSTANCE_REBOOT_HARD,
835   INSTANCE_REBOOT_FULL,
836   ])
837
838 # instance reboot behaviors
839 INSTANCE_REBOOT_ALLOWED = "reboot"
840 INSTANCE_REBOOT_EXIT = "exit"
841
842 REBOOT_BEHAVIORS = compat.UniqueFrozenset([
843   INSTANCE_REBOOT_ALLOWED,
844   INSTANCE_REBOOT_EXIT,
845   ])
846
847 VTYPE_STRING = "string"
848 VTYPE_MAYBE_STRING = "maybe-string"
849 VTYPE_BOOL = "bool"
850 VTYPE_SIZE = "size" # size, in MiBs
851 VTYPE_INT = "int"
852 ENFORCEABLE_TYPES = compat.UniqueFrozenset([
853   VTYPE_STRING,
854   VTYPE_MAYBE_STRING,
855   VTYPE_BOOL,
856   VTYPE_SIZE,
857   VTYPE_INT,
858   ])
859
860 # Constant representing that the user does not specify any IP version
861 IFACE_NO_IP_VERSION_SPECIFIED = 0
862
863 VALID_SERIAL_SPEEDS = compat.UniqueFrozenset([
864   75,
865   110,
866   300,
867   600,
868   1200,
869   1800,
870   2400,
871   4800,
872   9600,
873   14400,
874   19200,
875   28800,
876   38400,
877   57600,
878   115200,
879   230400,
880   345600,
881   460800,
882   ])
883
884 # HV parameter names (global namespace)
885 HV_BOOT_ORDER = "boot_order"
886 HV_CDROM_IMAGE_PATH = "cdrom_image_path"
887 HV_KVM_CDROM2_IMAGE_PATH = "cdrom2_image_path"
888 HV_KVM_FLOPPY_IMAGE_PATH = "floppy_image_path"
889 HV_NIC_TYPE = "nic_type"
890 HV_DISK_TYPE = "disk_type"
891 HV_KVM_CDROM_DISK_TYPE = "cdrom_disk_type"
892 HV_VNC_BIND_ADDRESS = "vnc_bind_address"
893 HV_VNC_PASSWORD_FILE = "vnc_password_file"
894 HV_VNC_TLS = "vnc_tls"
895 HV_VNC_X509 = "vnc_x509_path"
896 HV_VNC_X509_VERIFY = "vnc_x509_verify"
897 HV_KVM_SPICE_BIND = "spice_bind"
898 HV_KVM_SPICE_IP_VERSION = "spice_ip_version"
899 HV_KVM_SPICE_PASSWORD_FILE = "spice_password_file"
900 HV_KVM_SPICE_LOSSLESS_IMG_COMPR = "spice_image_compression"
901 HV_KVM_SPICE_JPEG_IMG_COMPR = "spice_jpeg_wan_compression"
902 HV_KVM_SPICE_ZLIB_GLZ_IMG_COMPR = "spice_zlib_glz_wan_compression"
903 HV_KVM_SPICE_STREAMING_VIDEO_DETECTION = "spice_streaming_video"
904 HV_KVM_SPICE_AUDIO_COMPR = "spice_playback_compression"
905 HV_KVM_SPICE_USE_TLS = "spice_use_tls"
906 HV_KVM_SPICE_TLS_CIPHERS = "spice_tls_ciphers"
907 HV_KVM_SPICE_USE_VDAGENT = "spice_use_vdagent"
908 HV_ACPI = "acpi"
909 HV_PAE = "pae"
910 HV_USE_BOOTLOADER = "use_bootloader"
911 HV_BOOTLOADER_ARGS = "bootloader_args"
912 HV_BOOTLOADER_PATH = "bootloader_path"
913 HV_KERNEL_ARGS = "kernel_args"
914 HV_KERNEL_PATH = "kernel_path"
915 HV_INITRD_PATH = "initrd_path"
916 HV_ROOT_PATH = "root_path"
917 HV_SERIAL_CONSOLE = "serial_console"
918 HV_SERIAL_SPEED = "serial_speed"
919 HV_USB_MOUSE = "usb_mouse"
920 HV_KEYMAP = "keymap"
921 HV_DEVICE_MODEL = "device_model"
922 HV_INIT_SCRIPT = "init_script"
923 HV_MIGRATION_PORT = "migration_port"
924 HV_MIGRATION_BANDWIDTH = "migration_bandwidth"
925 HV_MIGRATION_DOWNTIME = "migration_downtime"
926 HV_MIGRATION_MODE = "migration_mode"
927 HV_USE_LOCALTIME = "use_localtime"
928 HV_DISK_CACHE = "disk_cache"
929 HV_SECURITY_MODEL = "security_model"
930 HV_SECURITY_DOMAIN = "security_domain"
931 HV_KVM_FLAG = "kvm_flag"
932 HV_VHOST_NET = "vhost_net"
933 HV_KVM_USE_CHROOT = "use_chroot"
934 HV_CPU_MASK = "cpu_mask"
935 HV_MEM_PATH = "mem_path"
936 HV_PASSTHROUGH = "pci_pass"
937 HV_BLOCKDEV_PREFIX = "blockdev_prefix"
938 HV_REBOOT_BEHAVIOR = "reboot_behavior"
939 HV_CPU_TYPE = "cpu_type"
940 HV_CPU_CAP = "cpu_cap"
941 HV_CPU_WEIGHT = "cpu_weight"
942 HV_CPU_CORES = "cpu_cores"
943 HV_CPU_THREADS = "cpu_threads"
944 HV_CPU_SOCKETS = "cpu_sockets"
945 HV_SOUNDHW = "soundhw"
946 HV_USB_DEVICES = "usb_devices"
947 HV_VGA = "vga"
948 HV_KVM_EXTRA = "kvm_extra"
949 HV_KVM_MACHINE_VERSION = "machine_version"
950 HV_KVM_PATH = "kvm_path"
951 HV_VIF_TYPE = "vif_type"
952 HV_VNET_HDR = "vnet_hdr"
953 HV_VIRIDIAN = "viridian"
954
955
956 HVS_PARAMETER_TYPES = {
957   HV_KVM_PATH: VTYPE_STRING,
958   HV_BOOT_ORDER: VTYPE_STRING,
959   HV_KVM_FLOPPY_IMAGE_PATH: VTYPE_STRING,
960   HV_CDROM_IMAGE_PATH: VTYPE_STRING,
961   HV_KVM_CDROM2_IMAGE_PATH: VTYPE_STRING,
962   HV_NIC_TYPE: VTYPE_STRING,
963   HV_DISK_TYPE: VTYPE_STRING,
964   HV_KVM_CDROM_DISK_TYPE: VTYPE_STRING,
965   HV_VNC_PASSWORD_FILE: VTYPE_STRING,
966   HV_VNC_BIND_ADDRESS: VTYPE_STRING,
967   HV_VNC_TLS: VTYPE_BOOL,
968   HV_VNC_X509: VTYPE_STRING,
969   HV_VNC_X509_VERIFY: VTYPE_BOOL,
970   HV_KVM_SPICE_BIND: VTYPE_STRING,
971   HV_KVM_SPICE_IP_VERSION: VTYPE_INT,
972   HV_KVM_SPICE_PASSWORD_FILE: VTYPE_STRING,
973   HV_KVM_SPICE_LOSSLESS_IMG_COMPR: VTYPE_STRING,
974   HV_KVM_SPICE_JPEG_IMG_COMPR: VTYPE_STRING,
975   HV_KVM_SPICE_ZLIB_GLZ_IMG_COMPR: VTYPE_STRING,
976   HV_KVM_SPICE_STREAMING_VIDEO_DETECTION: VTYPE_STRING,
977   HV_KVM_SPICE_AUDIO_COMPR: VTYPE_BOOL,
978   HV_KVM_SPICE_USE_TLS: VTYPE_BOOL,
979   HV_KVM_SPICE_TLS_CIPHERS: VTYPE_STRING,
980   HV_KVM_SPICE_USE_VDAGENT: VTYPE_BOOL,
981   HV_ACPI: VTYPE_BOOL,
982   HV_PAE: VTYPE_BOOL,
983   HV_USE_BOOTLOADER: VTYPE_BOOL,
984   HV_BOOTLOADER_PATH: VTYPE_STRING,
985   HV_BOOTLOADER_ARGS: VTYPE_STRING,
986   HV_KERNEL_PATH: VTYPE_STRING,
987   HV_KERNEL_ARGS: VTYPE_STRING,
988   HV_INITRD_PATH: VTYPE_STRING,
989   HV_ROOT_PATH: VTYPE_MAYBE_STRING,
990   HV_SERIAL_CONSOLE: VTYPE_BOOL,
991   HV_SERIAL_SPEED: VTYPE_INT,
992   HV_USB_MOUSE: VTYPE_STRING,
993   HV_KEYMAP: VTYPE_STRING,
994   HV_DEVICE_MODEL: VTYPE_STRING,
995   HV_INIT_SCRIPT: VTYPE_STRING,
996   HV_MIGRATION_PORT: VTYPE_INT,
997   HV_MIGRATION_BANDWIDTH: VTYPE_INT,
998   HV_MIGRATION_DOWNTIME: VTYPE_INT,
999   HV_MIGRATION_MODE: VTYPE_STRING,
1000   HV_USE_LOCALTIME: VTYPE_BOOL,
1001   HV_DISK_CACHE: VTYPE_STRING,
1002   HV_SECURITY_MODEL: VTYPE_STRING,
1003   HV_SECURITY_DOMAIN: VTYPE_STRING,
1004   HV_KVM_FLAG: VTYPE_STRING,
1005   HV_VHOST_NET: VTYPE_BOOL,
1006   HV_KVM_USE_CHROOT: VTYPE_BOOL,
1007   HV_CPU_MASK: VTYPE_STRING,
1008   HV_MEM_PATH: VTYPE_STRING,
1009   HV_PASSTHROUGH: VTYPE_STRING,
1010   HV_BLOCKDEV_PREFIX: VTYPE_STRING,
1011   HV_REBOOT_BEHAVIOR: VTYPE_STRING,
1012   HV_CPU_TYPE: VTYPE_STRING,
1013   HV_CPU_CAP: VTYPE_INT,
1014   HV_CPU_WEIGHT: VTYPE_INT,
1015   HV_CPU_CORES: VTYPE_INT,
1016   HV_CPU_THREADS: VTYPE_INT,
1017   HV_CPU_SOCKETS: VTYPE_INT,
1018   HV_SOUNDHW: VTYPE_STRING,
1019   HV_USB_DEVICES: VTYPE_STRING,
1020   HV_VGA: VTYPE_STRING,
1021   HV_KVM_EXTRA: VTYPE_STRING,
1022   HV_KVM_MACHINE_VERSION: VTYPE_STRING,
1023   HV_VIF_TYPE: VTYPE_STRING,
1024   HV_VNET_HDR: VTYPE_BOOL,
1025   HV_VIRIDIAN: VTYPE_BOOL,
1026   }
1027
1028 HVS_PARAMETERS = frozenset(HVS_PARAMETER_TYPES.keys())
1029
1030 HVS_PARAMETER_TITLES = {
1031   HV_ACPI: "ACPI",
1032   HV_BOOT_ORDER: "Boot_order",
1033   HV_CDROM_IMAGE_PATH: "CDROM_image_path",
1034   HV_DISK_TYPE: "Disk_type",
1035   HV_INITRD_PATH: "Initrd_path",
1036   HV_KERNEL_PATH: "Kernel_path",
1037   HV_NIC_TYPE: "NIC_type",
1038   HV_PAE: "PAE",
1039   HV_VNC_BIND_ADDRESS: "VNC_bind_address",
1040   HV_PASSTHROUGH: "pci_pass",
1041   HV_CPU_TYPE: "cpu_type",
1042   }
1043
1044 # Migration statuses
1045 HV_MIGRATION_COMPLETED = "completed"
1046 HV_MIGRATION_ACTIVE = "active"
1047 HV_MIGRATION_FAILED = "failed"
1048 HV_MIGRATION_CANCELLED = "cancelled"
1049
1050 HV_MIGRATION_VALID_STATUSES = compat.UniqueFrozenset([
1051   HV_MIGRATION_COMPLETED,
1052   HV_MIGRATION_ACTIVE,
1053   HV_MIGRATION_FAILED,
1054   HV_MIGRATION_CANCELLED,
1055   ])
1056
1057 HV_MIGRATION_FAILED_STATUSES = compat.UniqueFrozenset([
1058   HV_MIGRATION_FAILED,
1059   HV_MIGRATION_CANCELLED,
1060   ])
1061
1062 # KVM-specific statuses
1063 HV_KVM_MIGRATION_VALID_STATUSES = HV_MIGRATION_VALID_STATUSES
1064
1065 # Node info keys
1066 HV_NODEINFO_KEY_VERSION = "hv_version"
1067
1068 # Hypervisor state
1069 HVST_MEMORY_TOTAL = "mem_total"
1070 HVST_MEMORY_NODE = "mem_node"
1071 HVST_MEMORY_HV = "mem_hv"
1072 HVST_CPU_TOTAL = "cpu_total"
1073 HVST_CPU_NODE = "cpu_node"
1074
1075 HVST_DEFAULTS = {
1076   HVST_MEMORY_TOTAL: 0,
1077   HVST_MEMORY_NODE: 0,
1078   HVST_MEMORY_HV: 0,
1079   HVST_CPU_TOTAL: 1,
1080   HVST_CPU_NODE: 1,
1081   }
1082
1083 HVSTS_PARAMETER_TYPES = {
1084   HVST_MEMORY_TOTAL: VTYPE_INT,
1085   HVST_MEMORY_NODE: VTYPE_INT,
1086   HVST_MEMORY_HV: VTYPE_INT,
1087   HVST_CPU_TOTAL: VTYPE_INT,
1088   HVST_CPU_NODE: VTYPE_INT,
1089   }
1090
1091 HVSTS_PARAMETERS = frozenset(HVSTS_PARAMETER_TYPES.keys())
1092
1093 # Disk state
1094 DS_DISK_TOTAL = "disk_total"
1095 DS_DISK_RESERVED = "disk_reserved"
1096 DS_DISK_OVERHEAD = "disk_overhead"
1097
1098 DS_DEFAULTS = {
1099   DS_DISK_TOTAL: 0,
1100   DS_DISK_RESERVED: 0,
1101   DS_DISK_OVERHEAD: 0,
1102   }
1103
1104 DSS_PARAMETER_TYPES = {
1105   DS_DISK_TOTAL: VTYPE_INT,
1106   DS_DISK_RESERVED: VTYPE_INT,
1107   DS_DISK_OVERHEAD: VTYPE_INT,
1108   }
1109
1110 DSS_PARAMETERS = frozenset(DSS_PARAMETER_TYPES.keys())
1111 DS_VALID_TYPES = compat.UniqueFrozenset([LD_LV])
1112
1113 # Backend parameter names
1114 BE_MEMORY = "memory" # deprecated and replaced by max and min mem
1115 BE_MAXMEM = "maxmem"
1116 BE_MINMEM = "minmem"
1117 BE_VCPUS = "vcpus"
1118 BE_AUTO_BALANCE = "auto_balance"
1119 BE_ALWAYS_FAILOVER = "always_failover"
1120 BE_SPINDLE_USE = "spindle_use"
1121
1122 BES_PARAMETER_TYPES = {
1123   BE_MAXMEM: VTYPE_SIZE,
1124   BE_MINMEM: VTYPE_SIZE,
1125   BE_VCPUS: VTYPE_INT,
1126   BE_AUTO_BALANCE: VTYPE_BOOL,
1127   BE_ALWAYS_FAILOVER: VTYPE_BOOL,
1128   BE_SPINDLE_USE: VTYPE_INT,
1129   }
1130
1131 BES_PARAMETER_TITLES = {
1132   BE_AUTO_BALANCE: "Auto_balance",
1133   BE_MAXMEM: "ConfigMaxMem",
1134   BE_MINMEM: "ConfigMinMem",
1135   BE_VCPUS: "ConfigVCPUs",
1136   }
1137
1138 BES_PARAMETER_COMPAT = {
1139   BE_MEMORY: VTYPE_SIZE,
1140   }
1141 BES_PARAMETER_COMPAT.update(BES_PARAMETER_TYPES)
1142
1143 BES_PARAMETERS = frozenset(BES_PARAMETER_TYPES.keys())
1144
1145 # instance specs
1146 ISPEC_MEM_SIZE = "memory-size"
1147 ISPEC_CPU_COUNT = "cpu-count"
1148 ISPEC_DISK_COUNT = "disk-count"
1149 ISPEC_DISK_SIZE = "disk-size"
1150 ISPEC_NIC_COUNT = "nic-count"
1151 ISPEC_SPINDLE_USE = "spindle-use"
1152
1153 ISPECS_PARAMETER_TYPES = {
1154   ISPEC_MEM_SIZE: VTYPE_INT,
1155   ISPEC_CPU_COUNT: VTYPE_INT,
1156   ISPEC_DISK_COUNT: VTYPE_INT,
1157   ISPEC_DISK_SIZE: VTYPE_INT,
1158   ISPEC_NIC_COUNT: VTYPE_INT,
1159   ISPEC_SPINDLE_USE: VTYPE_INT,
1160   }
1161
1162 ISPECS_PARAMETERS = frozenset(ISPECS_PARAMETER_TYPES.keys())
1163
1164 ISPECS_MINMAX = "minmax"
1165 ISPECS_MIN = "min"
1166 ISPECS_MAX = "max"
1167 ISPECS_STD = "std"
1168 IPOLICY_DTS = "disk-templates"
1169 IPOLICY_VCPU_RATIO = "vcpu-ratio"
1170 IPOLICY_SPINDLE_RATIO = "spindle-ratio"
1171
1172 ISPECS_MINMAX_KEYS = compat.UniqueFrozenset([
1173   ISPECS_MIN,
1174   ISPECS_MAX,
1175   ])
1176
1177 IPOLICY_PARAMETERS = compat.UniqueFrozenset([
1178   IPOLICY_VCPU_RATIO,
1179   IPOLICY_SPINDLE_RATIO,
1180   ])
1181
1182 IPOLICY_ALL_KEYS = (IPOLICY_PARAMETERS |
1183                     frozenset([ISPECS_MINMAX, ISPECS_STD, IPOLICY_DTS]))
1184
1185 # Node parameter names
1186 ND_OOB_PROGRAM = "oob_program"
1187 ND_SPINDLE_COUNT = "spindle_count"
1188 ND_EXCLUSIVE_STORAGE = "exclusive_storage"
1189
1190 NDS_PARAMETER_TYPES = {
1191   ND_OOB_PROGRAM: VTYPE_STRING,
1192   ND_SPINDLE_COUNT: VTYPE_INT,
1193   ND_EXCLUSIVE_STORAGE: VTYPE_BOOL,
1194   }
1195
1196 NDS_PARAMETERS = frozenset(NDS_PARAMETER_TYPES.keys())
1197
1198 NDS_PARAMETER_TITLES = {
1199   ND_OOB_PROGRAM: "OutOfBandProgram",
1200   ND_SPINDLE_COUNT: "SpindleCount",
1201   ND_EXCLUSIVE_STORAGE: "ExclusiveStorage",
1202   }
1203
1204 # Logical Disks parameters
1205 LDP_RESYNC_RATE = "resync-rate"
1206 LDP_STRIPES = "stripes"
1207 LDP_BARRIERS = "disabled-barriers"
1208 LDP_NO_META_FLUSH = "disable-meta-flush"
1209 LDP_DEFAULT_METAVG = "default-metavg"
1210 LDP_DISK_CUSTOM = "disk-custom"
1211 LDP_NET_CUSTOM = "net-custom"
1212 LDP_DYNAMIC_RESYNC = "dynamic-resync"
1213 LDP_PLAN_AHEAD = "c-plan-ahead"
1214 LDP_FILL_TARGET = "c-fill-target"
1215 LDP_DELAY_TARGET = "c-delay-target"
1216 LDP_MAX_RATE = "c-max-rate"
1217 LDP_MIN_RATE = "c-min-rate"
1218 LDP_POOL = "pool"
1219 DISK_LD_TYPES = {
1220   LDP_RESYNC_RATE: VTYPE_INT,
1221   LDP_STRIPES: VTYPE_INT,
1222   LDP_BARRIERS: VTYPE_STRING,
1223   LDP_NO_META_FLUSH: VTYPE_BOOL,
1224   LDP_DEFAULT_METAVG: VTYPE_STRING,
1225   LDP_DISK_CUSTOM: VTYPE_STRING,
1226   LDP_NET_CUSTOM: VTYPE_STRING,
1227   LDP_DYNAMIC_RESYNC: VTYPE_BOOL,
1228   LDP_PLAN_AHEAD: VTYPE_INT,
1229   LDP_FILL_TARGET: VTYPE_INT,
1230   LDP_DELAY_TARGET: VTYPE_INT,
1231   LDP_MAX_RATE: VTYPE_INT,
1232   LDP_MIN_RATE: VTYPE_INT,
1233   LDP_POOL: VTYPE_STRING,
1234   }
1235 DISK_LD_PARAMETERS = frozenset(DISK_LD_TYPES.keys())
1236
1237 # Disk template parameters (can be set/changed by the user via gnt-cluster and
1238 # gnt-group)
1239 DRBD_RESYNC_RATE = "resync-rate"
1240 DRBD_DATA_STRIPES = "data-stripes"
1241 DRBD_META_STRIPES = "meta-stripes"
1242 DRBD_DISK_BARRIERS = "disk-barriers"
1243 DRBD_META_BARRIERS = "meta-barriers"
1244 DRBD_DEFAULT_METAVG = "metavg"
1245 DRBD_DISK_CUSTOM = "disk-custom"
1246 DRBD_NET_CUSTOM = "net-custom"
1247 DRBD_DYNAMIC_RESYNC = "dynamic-resync"
1248 DRBD_PLAN_AHEAD = "c-plan-ahead"
1249 DRBD_FILL_TARGET = "c-fill-target"
1250 DRBD_DELAY_TARGET = "c-delay-target"
1251 DRBD_MAX_RATE = "c-max-rate"
1252 DRBD_MIN_RATE = "c-min-rate"
1253 LV_STRIPES = "stripes"
1254 RBD_POOL = "pool"
1255 DISK_DT_TYPES = {
1256   DRBD_RESYNC_RATE: VTYPE_INT,
1257   DRBD_DATA_STRIPES: VTYPE_INT,
1258   DRBD_META_STRIPES: VTYPE_INT,
1259   DRBD_DISK_BARRIERS: VTYPE_STRING,
1260   DRBD_META_BARRIERS: VTYPE_BOOL,
1261   DRBD_DEFAULT_METAVG: VTYPE_STRING,
1262   DRBD_DISK_CUSTOM: VTYPE_STRING,
1263   DRBD_NET_CUSTOM: VTYPE_STRING,
1264   DRBD_DYNAMIC_RESYNC: VTYPE_BOOL,
1265   DRBD_PLAN_AHEAD: VTYPE_INT,
1266   DRBD_FILL_TARGET: VTYPE_INT,
1267   DRBD_DELAY_TARGET: VTYPE_INT,
1268   DRBD_MAX_RATE: VTYPE_INT,
1269   DRBD_MIN_RATE: VTYPE_INT,
1270   LV_STRIPES: VTYPE_INT,
1271   RBD_POOL: VTYPE_STRING,
1272   }
1273
1274 DISK_DT_PARAMETERS = frozenset(DISK_DT_TYPES.keys())
1275
1276 # OOB supported commands
1277 OOB_POWER_ON = "power-on"
1278 OOB_POWER_OFF = "power-off"
1279 OOB_POWER_CYCLE = "power-cycle"
1280 OOB_POWER_STATUS = "power-status"
1281 OOB_HEALTH = "health"
1282
1283 OOB_COMMANDS = compat.UniqueFrozenset([
1284   OOB_POWER_ON,
1285   OOB_POWER_OFF,
1286   OOB_POWER_CYCLE,
1287   OOB_POWER_STATUS,
1288   OOB_HEALTH,
1289   ])
1290
1291 OOB_POWER_STATUS_POWERED = "powered"
1292
1293 OOB_TIMEOUT = 60 # 60 seconds
1294 OOB_POWER_DELAY = 2.0 # 2 seconds
1295
1296 OOB_STATUS_OK = "OK"
1297 OOB_STATUS_WARNING = "WARNING"
1298 OOB_STATUS_CRITICAL = "CRITICAL"
1299 OOB_STATUS_UNKNOWN = "UNKNOWN"
1300
1301 OOB_STATUSES = compat.UniqueFrozenset([
1302   OOB_STATUS_OK,
1303   OOB_STATUS_WARNING,
1304   OOB_STATUS_CRITICAL,
1305   OOB_STATUS_UNKNOWN,
1306   ])
1307
1308 # Instance Parameters Profile
1309 PP_DEFAULT = "default"
1310
1311 # NIC_* constants are used inside the ganeti config
1312 NIC_MODE = "mode"
1313 NIC_LINK = "link"
1314
1315 NIC_MODE_BRIDGED = "bridged"
1316 NIC_MODE_ROUTED = "routed"
1317 NIC_MODE_OVS = "openvswitch"
1318 NIC_IP_POOL = "pool"
1319
1320 NIC_VALID_MODES = compat.UniqueFrozenset([
1321   NIC_MODE_BRIDGED,
1322   NIC_MODE_ROUTED,
1323   NIC_MODE_OVS,
1324   ])
1325
1326 RESERVE_ACTION = "reserve"
1327 RELEASE_ACTION = "release"
1328
1329 NICS_PARAMETER_TYPES = {
1330   NIC_MODE: VTYPE_STRING,
1331   NIC_LINK: VTYPE_STRING,
1332   }
1333
1334 NICS_PARAMETERS = frozenset(NICS_PARAMETER_TYPES.keys())
1335
1336 # IDISK_* constants are used in opcodes, to create/change disks
1337 IDISK_SIZE = "size"
1338 IDISK_MODE = "mode"
1339 IDISK_ADOPT = "adopt"
1340 IDISK_VG = "vg"
1341 IDISK_METAVG = "metavg"
1342 IDISK_PROVIDER = "provider"
1343 IDISK_NAME = "name"
1344 IDISK_PARAMS_TYPES = {
1345   IDISK_SIZE: VTYPE_SIZE,
1346   IDISK_MODE: VTYPE_STRING,
1347   IDISK_ADOPT: VTYPE_STRING,
1348   IDISK_VG: VTYPE_STRING,
1349   IDISK_METAVG: VTYPE_STRING,
1350   IDISK_PROVIDER: VTYPE_STRING,
1351   IDISK_NAME: VTYPE_MAYBE_STRING,
1352   }
1353 IDISK_PARAMS = frozenset(IDISK_PARAMS_TYPES.keys())
1354
1355 # INIC_* constants are used in opcodes, to create/change nics
1356 INIC_MAC = "mac"
1357 INIC_IP = "ip"
1358 INIC_MODE = "mode"
1359 INIC_LINK = "link"
1360 INIC_NETWORK = "network"
1361 INIC_NAME = "name"
1362 INIC_PARAMS_TYPES = {
1363   INIC_IP: VTYPE_MAYBE_STRING,
1364   INIC_LINK: VTYPE_STRING,
1365   INIC_MAC: VTYPE_STRING,
1366   INIC_MODE: VTYPE_STRING,
1367   INIC_NETWORK: VTYPE_MAYBE_STRING,
1368   INIC_NAME: VTYPE_MAYBE_STRING,
1369   }
1370 INIC_PARAMS = frozenset(INIC_PARAMS_TYPES.keys())
1371
1372 # Hypervisor constants
1373 HT_XEN_PVM = "xen-pvm"
1374 HT_FAKE = "fake"
1375 HT_XEN_HVM = "xen-hvm"
1376 HT_KVM = "kvm"
1377 HT_CHROOT = "chroot"
1378 HT_LXC = "lxc"
1379 HYPER_TYPES = compat.UniqueFrozenset([
1380   HT_XEN_PVM,
1381   HT_FAKE,
1382   HT_XEN_HVM,
1383   HT_KVM,
1384   HT_CHROOT,
1385   HT_LXC,
1386   ])
1387 HTS_REQ_PORT = compat.UniqueFrozenset([HT_XEN_HVM, HT_KVM])
1388
1389 VNC_BASE_PORT = 5900
1390 VNC_DEFAULT_BIND_ADDRESS = IP4_ADDRESS_ANY
1391
1392 # NIC types
1393 HT_NIC_RTL8139 = "rtl8139"
1394 HT_NIC_NE2K_PCI = "ne2k_pci"
1395 HT_NIC_NE2K_ISA = "ne2k_isa"
1396 HT_NIC_I82551 = "i82551"
1397 HT_NIC_I85557B = "i82557b"
1398 HT_NIC_I8259ER = "i82559er"
1399 HT_NIC_PCNET = "pcnet"
1400 HT_NIC_E1000 = "e1000"
1401 HT_NIC_PARAVIRTUAL = HT_DISK_PARAVIRTUAL = "paravirtual"
1402
1403 HT_HVM_VALID_NIC_TYPES = compat.UniqueFrozenset([
1404   HT_NIC_RTL8139,
1405   HT_NIC_NE2K_PCI,
1406   HT_NIC_E1000,
1407   HT_NIC_NE2K_ISA,
1408   HT_NIC_PARAVIRTUAL,
1409   ])
1410 HT_KVM_VALID_NIC_TYPES = compat.UniqueFrozenset([
1411   HT_NIC_RTL8139,
1412   HT_NIC_NE2K_PCI,
1413   HT_NIC_NE2K_ISA,
1414   HT_NIC_I82551,
1415   HT_NIC_I85557B,
1416   HT_NIC_I8259ER,
1417   HT_NIC_PCNET,
1418   HT_NIC_E1000,
1419   HT_NIC_PARAVIRTUAL,
1420   ])
1421
1422 # Vif types
1423 # default vif type in xen-hvm
1424 HT_HVM_VIF_IOEMU = "ioemu"
1425 HT_HVM_VIF_VIF = "vif"
1426 HT_HVM_VALID_VIF_TYPES = compat.UniqueFrozenset([
1427   HT_HVM_VIF_IOEMU,
1428   HT_HVM_VIF_VIF,
1429   ])
1430
1431 # Disk types
1432 HT_DISK_IOEMU = "ioemu"
1433 HT_DISK_IDE = "ide"
1434 HT_DISK_SCSI = "scsi"
1435 HT_DISK_SD = "sd"
1436 HT_DISK_MTD = "mtd"
1437 HT_DISK_PFLASH = "pflash"
1438
1439 HT_CACHE_DEFAULT = "default"
1440 HT_CACHE_NONE = "none"
1441 HT_CACHE_WTHROUGH = "writethrough"
1442 HT_CACHE_WBACK = "writeback"
1443 HT_VALID_CACHE_TYPES = compat.UniqueFrozenset([
1444   HT_CACHE_DEFAULT,
1445   HT_CACHE_NONE,
1446   HT_CACHE_WTHROUGH,
1447   HT_CACHE_WBACK,
1448   ])
1449
1450 HT_HVM_VALID_DISK_TYPES = compat.UniqueFrozenset([
1451   HT_DISK_PARAVIRTUAL,
1452   HT_DISK_IOEMU,
1453   ])
1454 HT_KVM_VALID_DISK_TYPES = compat.UniqueFrozenset([
1455   HT_DISK_PARAVIRTUAL,
1456   HT_DISK_IDE,
1457   HT_DISK_SCSI,
1458   HT_DISK_SD,
1459   HT_DISK_MTD,
1460   HT_DISK_PFLASH,
1461   ])
1462
1463 # Mouse types:
1464 HT_MOUSE_MOUSE = "mouse"
1465 HT_MOUSE_TABLET = "tablet"
1466
1467 HT_KVM_VALID_MOUSE_TYPES = compat.UniqueFrozenset([
1468   HT_MOUSE_MOUSE,
1469   HT_MOUSE_TABLET,
1470   ])
1471
1472 # Boot order
1473 HT_BO_FLOPPY = "floppy"
1474 HT_BO_CDROM = "cdrom"
1475 HT_BO_DISK = "disk"
1476 HT_BO_NETWORK = "network"
1477
1478 HT_KVM_VALID_BO_TYPES = compat.UniqueFrozenset([
1479   HT_BO_FLOPPY,
1480   HT_BO_CDROM,
1481   HT_BO_DISK,
1482   HT_BO_NETWORK,
1483   ])
1484
1485 # SPICE lossless image compression options
1486 HT_KVM_SPICE_LOSSLESS_IMG_COMPR_AUTO_GLZ = "auto_glz"
1487 HT_KVM_SPICE_LOSSLESS_IMG_COMPR_AUTO_LZ = "auto_lz"
1488 HT_KVM_SPICE_LOSSLESS_IMG_COMPR_QUIC = "quic"
1489 HT_KVM_SPICE_LOSSLESS_IMG_COMPR_GLZ = "glz"
1490 HT_KVM_SPICE_LOSSLESS_IMG_COMPR_LZ = "lz"
1491 HT_KVM_SPICE_LOSSLESS_IMG_COMPR_OFF = "off"
1492
1493 HT_KVM_SPICE_VALID_LOSSLESS_IMG_COMPR_OPTIONS = compat.UniqueFrozenset([
1494   HT_KVM_SPICE_LOSSLESS_IMG_COMPR_AUTO_GLZ,
1495   HT_KVM_SPICE_LOSSLESS_IMG_COMPR_AUTO_LZ,
1496   HT_KVM_SPICE_LOSSLESS_IMG_COMPR_QUIC,
1497   HT_KVM_SPICE_LOSSLESS_IMG_COMPR_GLZ,
1498   HT_KVM_SPICE_LOSSLESS_IMG_COMPR_LZ,
1499   HT_KVM_SPICE_LOSSLESS_IMG_COMPR_OFF,
1500   ])
1501
1502 # SPICE lossy image compression options (valid for both jpeg and zlib-glz)
1503 HT_KVM_SPICE_LOSSY_IMG_COMPR_AUTO = "auto"
1504 HT_KVM_SPICE_LOSSY_IMG_COMPR_NEVER = "never"
1505 HT_KVM_SPICE_LOSSY_IMG_COMPR_ALWAYS = "always"
1506
1507 HT_KVM_SPICE_VALID_LOSSY_IMG_COMPR_OPTIONS = compat.UniqueFrozenset([
1508   HT_KVM_SPICE_LOSSY_IMG_COMPR_AUTO,
1509   HT_KVM_SPICE_LOSSY_IMG_COMPR_NEVER,
1510   HT_KVM_SPICE_LOSSY_IMG_COMPR_ALWAYS,
1511   ])
1512
1513 # SPICE video stream detection
1514 HT_KVM_SPICE_VIDEO_STREAM_DETECTION_OFF = "off"
1515 HT_KVM_SPICE_VIDEO_STREAM_DETECTION_ALL = "all"
1516 HT_KVM_SPICE_VIDEO_STREAM_DETECTION_FILTER = "filter"
1517
1518 HT_KVM_SPICE_VALID_VIDEO_STREAM_DETECTION_OPTIONS = compat.UniqueFrozenset([
1519   HT_KVM_SPICE_VIDEO_STREAM_DETECTION_OFF,
1520   HT_KVM_SPICE_VIDEO_STREAM_DETECTION_ALL,
1521   HT_KVM_SPICE_VIDEO_STREAM_DETECTION_FILTER,
1522   ])
1523
1524 # Security models
1525 HT_SM_NONE = "none"
1526 HT_SM_USER = "user"
1527 HT_SM_POOL = "pool"
1528
1529 HT_KVM_VALID_SM_TYPES = compat.UniqueFrozenset([
1530   HT_SM_NONE,
1531   HT_SM_USER,
1532   HT_SM_POOL,
1533   ])
1534
1535 # Kvm flag values
1536 HT_KVM_ENABLED = "enabled"
1537 HT_KVM_DISABLED = "disabled"
1538
1539 HT_KVM_FLAG_VALUES = compat.UniqueFrozenset([HT_KVM_ENABLED, HT_KVM_DISABLED])
1540
1541 # Migration type
1542 HT_MIGRATION_LIVE = "live"
1543 HT_MIGRATION_NONLIVE = "non-live"
1544 HT_MIGRATION_MODES = compat.UniqueFrozenset([
1545   HT_MIGRATION_LIVE,
1546   HT_MIGRATION_NONLIVE,
1547   ])
1548
1549 # Cluster Verify steps
1550 VERIFY_NPLUSONE_MEM = "nplusone_mem"
1551 VERIFY_OPTIONAL_CHECKS = compat.UniqueFrozenset([VERIFY_NPLUSONE_MEM])
1552
1553 # Cluster Verify error classes
1554 CV_TCLUSTER = "cluster"
1555 CV_TGROUP = "group"
1556 CV_TNODE = "node"
1557 CV_TINSTANCE = "instance"
1558
1559 # Cluster Verify error codes and documentation
1560 CV_ECLUSTERCFG = \
1561   (CV_TCLUSTER, "ECLUSTERCFG", "Cluster configuration verification failure")
1562 CV_ECLUSTERCERT = \
1563   (CV_TCLUSTER, "ECLUSTERCERT",
1564    "Cluster certificate files verification failure")
1565 CV_ECLUSTERFILECHECK = \
1566   (CV_TCLUSTER, "ECLUSTERFILECHECK",
1567    "Cluster configuration verification failure")
1568 CV_ECLUSTERDANGLINGNODES = \
1569   (CV_TNODE, "ECLUSTERDANGLINGNODES",
1570    "Some nodes belong to non-existing groups")
1571 CV_ECLUSTERDANGLINGINST = \
1572   (CV_TNODE, "ECLUSTERDANGLINGINST",
1573    "Some instances have a non-existing primary node")
1574 CV_EGROUPDIFFERENTPVSIZE = \
1575   (CV_TGROUP, "EGROUPDIFFERENTPVSIZE", "PVs in the group have different sizes")
1576 CV_EINSTANCEBADNODE = \
1577   (CV_TINSTANCE, "EINSTANCEBADNODE",
1578    "Instance marked as running lives on an offline node")
1579 CV_EINSTANCEDOWN = \
1580   (CV_TINSTANCE, "EINSTANCEDOWN", "Instance not running on its primary node")
1581 CV_EINSTANCELAYOUT = \
1582   (CV_TINSTANCE, "EINSTANCELAYOUT", "Instance has multiple secondary nodes")
1583 CV_EINSTANCEMISSINGDISK = \
1584   (CV_TINSTANCE, "EINSTANCEMISSINGDISK", "Missing volume on an instance")
1585 CV_EINSTANCEFAULTYDISK = \
1586   (CV_TINSTANCE, "EINSTANCEFAULTYDISK",
1587    "Impossible to retrieve status for a disk")
1588 CV_EINSTANCEWRONGNODE = \
1589   (CV_TINSTANCE, "EINSTANCEWRONGNODE", "Instance running on the wrong node")
1590 CV_EINSTANCESPLITGROUPS = \
1591   (CV_TINSTANCE, "EINSTANCESPLITGROUPS",
1592    "Instance with primary and secondary nodes in different groups")
1593 CV_EINSTANCEPOLICY = \
1594   (CV_TINSTANCE, "EINSTANCEPOLICY",
1595    "Instance does not meet policy")
1596 CV_EINSTANCEUNSUITABLENODE = \
1597   (CV_TINSTANCE, "EINSTANCEUNSUITABLENODE",
1598    "Instance running on nodes that are not suitable for it")
1599 CV_ENODEDRBD = \
1600   (CV_TNODE, "ENODEDRBD", "Error parsing the DRBD status file")
1601 CV_ENODEDRBDHELPER = \
1602   (CV_TNODE, "ENODEDRBDHELPER", "Error caused by the DRBD helper")
1603 CV_ENODEFILECHECK = \
1604   (CV_TNODE, "ENODEFILECHECK",
1605    "Error retrieving the checksum of the node files")
1606 CV_ENODEHOOKS = \
1607   (CV_TNODE, "ENODEHOOKS", "Communication failure in hooks execution")
1608 CV_ENODEHV = \
1609   (CV_TNODE, "ENODEHV", "Hypervisor parameters verification failure")
1610 CV_ENODELVM = \
1611   (CV_TNODE, "ENODELVM", "LVM-related node error")
1612 CV_ENODEN1 = \
1613   (CV_TNODE, "ENODEN1", "Not enough memory to accommodate instance failovers")
1614 CV_ENODENET = \
1615   (CV_TNODE, "ENODENET", "Network-related node error")
1616 CV_ENODEOS = \
1617   (CV_TNODE, "ENODEOS", "OS-related node error")
1618 CV_ENODEORPHANINSTANCE = \
1619   (CV_TNODE, "ENODEORPHANINSTANCE", "Unknown intance running on a node")
1620 CV_ENODEORPHANLV = \
1621   (CV_TNODE, "ENODEORPHANLV", "Unknown LVM logical volume")
1622 CV_ENODERPC = \
1623   (CV_TNODE, "ENODERPC",
1624    "Error during connection to the primary node of an instance")
1625 CV_ENODESSH = \
1626   (CV_TNODE, "ENODESSH", "SSH-related node error")
1627 CV_ENODEVERSION = \
1628   (CV_TNODE, "ENODEVERSION",
1629    "Protocol version mismatch or Ganeti version mismatch")
1630 CV_ENODESETUP = \
1631   (CV_TNODE, "ENODESETUP", "Node setup error")
1632 CV_ENODETIME = \
1633   (CV_TNODE, "ENODETIME", "Node returned invalid time")
1634 CV_ENODEOOBPATH = \
1635   (CV_TNODE, "ENODEOOBPATH", "Invalid Out Of Band path")
1636 CV_ENODEUSERSCRIPTS = \
1637   (CV_TNODE, "ENODEUSERSCRIPTS", "User scripts not present or not executable")
1638 CV_ENODEFILESTORAGEPATHS = \
1639   (CV_TNODE, "ENODEFILESTORAGEPATHS", "Detected bad file storage paths")
1640
1641 CV_ALL_ECODES = compat.UniqueFrozenset([
1642   CV_ECLUSTERCFG,
1643   CV_ECLUSTERCERT,
1644   CV_ECLUSTERFILECHECK,
1645   CV_ECLUSTERDANGLINGNODES,
1646   CV_ECLUSTERDANGLINGINST,
1647   CV_EINSTANCEBADNODE,
1648   CV_EINSTANCEDOWN,
1649   CV_EINSTANCELAYOUT,
1650   CV_EINSTANCEMISSINGDISK,
1651   CV_EINSTANCEFAULTYDISK,
1652   CV_EINSTANCEWRONGNODE,
1653   CV_EINSTANCESPLITGROUPS,
1654   CV_EINSTANCEPOLICY,
1655   CV_ENODEDRBD,
1656   CV_ENODEDRBDHELPER,
1657   CV_ENODEFILECHECK,
1658   CV_ENODEHOOKS,
1659   CV_ENODEHV,
1660   CV_ENODELVM,
1661   CV_ENODEN1,
1662   CV_ENODENET,
1663   CV_ENODEOS,
1664   CV_ENODEORPHANINSTANCE,
1665   CV_ENODEORPHANLV,
1666   CV_ENODERPC,
1667   CV_ENODESSH,
1668   CV_ENODEVERSION,
1669   CV_ENODESETUP,
1670   CV_ENODETIME,
1671   CV_ENODEOOBPATH,
1672   CV_ENODEUSERSCRIPTS,
1673   CV_ENODEFILESTORAGEPATHS,
1674   ])
1675
1676 CV_ALL_ECODES_STRINGS = \
1677   compat.UniqueFrozenset(estr for (_, estr, _) in CV_ALL_ECODES)
1678
1679 # Node verify constants
1680 NV_BRIDGES = "bridges"
1681 NV_DRBDHELPER = "drbd-helper"
1682 NV_DRBDLIST = "drbd-list"
1683 NV_EXCLUSIVEPVS = "exclusive-pvs"
1684 NV_FILELIST = "filelist"
1685 NV_FILE_STORAGE_PATHS = "file-storage-paths"
1686 NV_HVINFO = "hvinfo"
1687 NV_HVPARAMS = "hvparms"
1688 NV_HYPERVISOR = "hypervisor"
1689 NV_INSTANCELIST = "instancelist"
1690 NV_LVLIST = "lvlist"
1691 NV_MASTERIP = "master-ip"
1692 NV_NODELIST = "nodelist"
1693 NV_NODENETTEST = "node-net-test"
1694 NV_NODESETUP = "nodesetup"
1695 NV_OOB_PATHS = "oob-paths"
1696 NV_OSLIST = "oslist"
1697 NV_PVLIST = "pvlist"
1698 NV_TIME = "time"
1699 NV_USERSCRIPTS = "user-scripts"
1700 NV_VERSION = "version"
1701 NV_VGLIST = "vglist"
1702 NV_VMNODES = "vmnodes"
1703
1704 # Instance status
1705 INSTST_RUNNING = "running"
1706 INSTST_ADMINDOWN = "ADMIN_down"
1707 INSTST_ADMINOFFLINE = "ADMIN_offline"
1708 INSTST_NODEOFFLINE = "ERROR_nodeoffline"
1709 INSTST_NODEDOWN = "ERROR_nodedown"
1710 INSTST_WRONGNODE = "ERROR_wrongnode"
1711 INSTST_ERRORUP = "ERROR_up"
1712 INSTST_ERRORDOWN = "ERROR_down"
1713 INSTST_ALL = compat.UniqueFrozenset([
1714   INSTST_RUNNING,
1715   INSTST_ADMINDOWN,
1716   INSTST_ADMINOFFLINE,
1717   INSTST_NODEOFFLINE,
1718   INSTST_NODEDOWN,
1719   INSTST_WRONGNODE,
1720   INSTST_ERRORUP,
1721   INSTST_ERRORDOWN,
1722   ])
1723
1724 # Admin states
1725 ADMINST_UP = "up"
1726 ADMINST_DOWN = "down"
1727 ADMINST_OFFLINE = "offline"
1728 ADMINST_ALL = compat.UniqueFrozenset([
1729   ADMINST_UP,
1730   ADMINST_DOWN,
1731   ADMINST_OFFLINE,
1732   ])
1733
1734 # Node roles
1735 NR_REGULAR = "R"
1736 NR_MASTER = "M"
1737 NR_MCANDIDATE = "C"
1738 NR_DRAINED = "D"
1739 NR_OFFLINE = "O"
1740 NR_ALL = compat.UniqueFrozenset([
1741   NR_REGULAR,
1742   NR_MASTER,
1743   NR_MCANDIDATE,
1744   NR_DRAINED,
1745   NR_OFFLINE,
1746   ])
1747
1748 # SSL certificate check constants (in days)
1749 SSL_CERT_EXPIRATION_WARN = 30
1750 SSL_CERT_EXPIRATION_ERROR = 7
1751
1752 # Allocator framework constants
1753 IALLOCATOR_VERSION = 2
1754 IALLOCATOR_DIR_IN = "in"
1755 IALLOCATOR_DIR_OUT = "out"
1756 VALID_IALLOCATOR_DIRECTIONS = compat.UniqueFrozenset([
1757   IALLOCATOR_DIR_IN,
1758   IALLOCATOR_DIR_OUT,
1759   ])
1760 IALLOCATOR_MODE_ALLOC = "allocate"
1761 IALLOCATOR_MODE_RELOC = "relocate"
1762 IALLOCATOR_MODE_CHG_GROUP = "change-group"
1763 IALLOCATOR_MODE_NODE_EVAC = "node-evacuate"
1764 IALLOCATOR_MODE_MULTI_ALLOC = "multi-allocate"
1765 VALID_IALLOCATOR_MODES = compat.UniqueFrozenset([
1766   IALLOCATOR_MODE_ALLOC,
1767   IALLOCATOR_MODE_RELOC,
1768   IALLOCATOR_MODE_CHG_GROUP,
1769   IALLOCATOR_MODE_NODE_EVAC,
1770   IALLOCATOR_MODE_MULTI_ALLOC,
1771   ])
1772 IALLOCATOR_SEARCH_PATH = _autoconf.IALLOCATOR_SEARCH_PATH
1773 DEFAULT_IALLOCATOR_SHORTCUT = "."
1774
1775 IALLOCATOR_NEVAC_PRI = "primary-only"
1776 IALLOCATOR_NEVAC_SEC = "secondary-only"
1777 IALLOCATOR_NEVAC_ALL = "all"
1778 IALLOCATOR_NEVAC_MODES = compat.UniqueFrozenset([
1779   IALLOCATOR_NEVAC_PRI,
1780   IALLOCATOR_NEVAC_SEC,
1781   IALLOCATOR_NEVAC_ALL,
1782   ])
1783
1784 # Node evacuation
1785 NODE_EVAC_PRI = "primary-only"
1786 NODE_EVAC_SEC = "secondary-only"
1787 NODE_EVAC_ALL = "all"
1788 NODE_EVAC_MODES = compat.UniqueFrozenset([
1789   NODE_EVAC_PRI,
1790   NODE_EVAC_SEC,
1791   NODE_EVAC_ALL,
1792   ])
1793
1794 # Job queue
1795 JOB_QUEUE_VERSION = 1
1796 JOB_QUEUE_SIZE_HARD_LIMIT = 5000
1797 JOB_QUEUE_FILES_PERMS = 0640
1798
1799 JOB_ID_TEMPLATE = r"\d+"
1800 JOB_FILE_RE = re.compile(r"^job-(%s)$" % JOB_ID_TEMPLATE)
1801
1802 # unchanged job return
1803 JOB_NOTCHANGED = "nochange"
1804
1805 # Job status
1806 JOB_STATUS_QUEUED = "queued"
1807 JOB_STATUS_WAITING = "waiting"
1808 JOB_STATUS_CANCELING = "canceling"
1809 JOB_STATUS_RUNNING = "running"
1810 JOB_STATUS_CANCELED = "canceled"
1811 JOB_STATUS_SUCCESS = "success"
1812 JOB_STATUS_ERROR = "error"
1813 JOBS_PENDING = compat.UniqueFrozenset([
1814   JOB_STATUS_QUEUED,
1815   JOB_STATUS_WAITING,
1816   JOB_STATUS_CANCELING,
1817   ])
1818 JOBS_FINALIZED = compat.UniqueFrozenset([
1819   JOB_STATUS_CANCELED,
1820   JOB_STATUS_SUCCESS,
1821   JOB_STATUS_ERROR,
1822   ])
1823 JOB_STATUS_ALL = compat.UniqueFrozenset([
1824   JOB_STATUS_RUNNING,
1825   ]) | JOBS_PENDING | JOBS_FINALIZED
1826
1827 # OpCode status
1828 # not yet finalized
1829 OP_STATUS_QUEUED = "queued"
1830 OP_STATUS_WAITING = "waiting"
1831 OP_STATUS_CANCELING = "canceling"
1832 OP_STATUS_RUNNING = "running"
1833 # finalized
1834 OP_STATUS_CANCELED = "canceled"
1835 OP_STATUS_SUCCESS = "success"
1836 OP_STATUS_ERROR = "error"
1837 OPS_FINALIZED = compat.UniqueFrozenset([
1838   OP_STATUS_CANCELED,
1839   OP_STATUS_SUCCESS,
1840   OP_STATUS_ERROR,
1841   ])
1842
1843 # OpCode priority
1844 OP_PRIO_LOWEST = +19
1845 OP_PRIO_HIGHEST = -20
1846
1847 OP_PRIO_LOW = +10
1848 OP_PRIO_NORMAL = 0
1849 OP_PRIO_HIGH = -10
1850
1851 OP_PRIO_SUBMIT_VALID = compat.UniqueFrozenset([
1852   OP_PRIO_LOW,
1853   OP_PRIO_NORMAL,
1854   OP_PRIO_HIGH,
1855   ])
1856
1857 OP_PRIO_DEFAULT = OP_PRIO_NORMAL
1858
1859 # Lock recalculate mode
1860 LOCKS_REPLACE = "replace"
1861 LOCKS_APPEND = "append"
1862
1863 # Lock timeout (sum) before we should go into blocking acquire (still
1864 # can be reset by priority change); computed as max time (10 hours)
1865 # before we should actually go into blocking acquire given that we
1866 # start from default priority level; in seconds
1867 # TODO
1868 LOCK_ATTEMPTS_TIMEOUT = 10 * 3600 / (OP_PRIO_DEFAULT - OP_PRIO_HIGHEST)
1869 LOCK_ATTEMPTS_MAXWAIT = 15.0
1870 LOCK_ATTEMPTS_MINWAIT = 1.0
1871
1872 # Execution log types
1873 ELOG_MESSAGE = "message"
1874 ELOG_REMOTE_IMPORT = "remote-import"
1875 ELOG_JQUEUE_TEST = "jqueue-test"
1876
1877 # /etc/hosts modification
1878 ETC_HOSTS_ADD = "add"
1879 ETC_HOSTS_REMOVE = "remove"
1880
1881 # Job queue test
1882 JQT_MSGPREFIX = "TESTMSG="
1883 JQT_EXPANDNAMES = "expandnames"
1884 JQT_EXEC = "exec"
1885 JQT_LOGMSG = "logmsg"
1886 JQT_STARTMSG = "startmsg"
1887 JQT_ALL = compat.UniqueFrozenset([
1888   JQT_EXPANDNAMES,
1889   JQT_EXEC,
1890   JQT_LOGMSG,
1891   JQT_STARTMSG,
1892   ])
1893
1894 # Query resources
1895 QR_CLUSTER = "cluster"
1896 QR_INSTANCE = "instance"
1897 QR_NODE = "node"
1898 QR_LOCK = "lock"
1899 QR_GROUP = "group"
1900 QR_OS = "os"
1901 QR_JOB = "job"
1902 QR_EXPORT = "export"
1903 QR_NETWORK = "network"
1904 QR_EXTSTORAGE = "extstorage"
1905
1906 #: List of resources which can be queried using L{opcodes.OpQuery}
1907 QR_VIA_OP = compat.UniqueFrozenset([
1908   QR_CLUSTER,
1909   QR_INSTANCE,
1910   QR_NODE,
1911   QR_GROUP,
1912   QR_OS,
1913   QR_EXPORT,
1914   QR_NETWORK,
1915   QR_EXTSTORAGE,
1916   ])
1917
1918 #: List of resources which can be queried using Local UniX Interface
1919 QR_VIA_LUXI = QR_VIA_OP.union([
1920   QR_LOCK,
1921   QR_JOB,
1922   ])
1923
1924 #: List of resources which can be queried using RAPI
1925 QR_VIA_RAPI = QR_VIA_LUXI
1926
1927 # Query field types
1928 QFT_UNKNOWN = "unknown"
1929 QFT_TEXT = "text"
1930 QFT_BOOL = "bool"
1931 QFT_NUMBER = "number"
1932 QFT_UNIT = "unit"
1933 QFT_TIMESTAMP = "timestamp"
1934 QFT_OTHER = "other"
1935
1936 #: All query field types
1937 QFT_ALL = compat.UniqueFrozenset([
1938   QFT_UNKNOWN,
1939   QFT_TEXT,
1940   QFT_BOOL,
1941   QFT_NUMBER,
1942   QFT_UNIT,
1943   QFT_TIMESTAMP,
1944   QFT_OTHER,
1945   ])
1946
1947 # Query result field status (don't change or reuse values as they're used by
1948 # clients)
1949 #: Normal field status
1950 RS_NORMAL = 0
1951 #: Unknown field
1952 RS_UNKNOWN = 1
1953 #: No data (e.g. RPC error), can be used instead of L{RS_OFFLINE}
1954 RS_NODATA = 2
1955 #: Value unavailable/unsupported for item; if this field is supported
1956 #: but we cannot get the data for the moment, RS_NODATA or
1957 #: RS_OFFLINE should be used
1958 RS_UNAVAIL = 3
1959 #: Resource marked offline
1960 RS_OFFLINE = 4
1961
1962 RS_ALL = compat.UniqueFrozenset([
1963   RS_NORMAL,
1964   RS_UNKNOWN,
1965   RS_NODATA,
1966   RS_UNAVAIL,
1967   RS_OFFLINE,
1968   ])
1969
1970 #: Dictionary with special field cases and their verbose/terse formatting
1971 RSS_DESCRIPTION = {
1972   RS_UNKNOWN: ("(unknown)", "??"),
1973   RS_NODATA: ("(nodata)", "?"),
1974   RS_OFFLINE: ("(offline)", "*"),
1975   RS_UNAVAIL: ("(unavail)", "-"),
1976   }
1977
1978 # max dynamic devices
1979 MAX_NICS = 8
1980 MAX_DISKS = 16
1981
1982 # SSCONF file prefix
1983 SSCONF_FILEPREFIX = "ssconf_"
1984 # SSCONF keys
1985 SS_CLUSTER_NAME = "cluster_name"
1986 SS_CLUSTER_TAGS = "cluster_tags"
1987 SS_FILE_STORAGE_DIR = "file_storage_dir"
1988 SS_SHARED_FILE_STORAGE_DIR = "shared_file_storage_dir"
1989 SS_MASTER_CANDIDATES = "master_candidates"
1990 SS_MASTER_CANDIDATES_IPS = "master_candidates_ips"
1991 SS_MASTER_IP = "master_ip"
1992 SS_MASTER_NETDEV = "master_netdev"
1993 SS_MASTER_NETMASK = "master_netmask"
1994 SS_MASTER_NODE = "master_node"
1995 SS_NODE_LIST = "node_list"
1996 SS_NODE_PRIMARY_IPS = "node_primary_ips"
1997 SS_NODE_SECONDARY_IPS = "node_secondary_ips"
1998 SS_OFFLINE_NODES = "offline_nodes"
1999 SS_ONLINE_NODES = "online_nodes"
2000 SS_PRIMARY_IP_FAMILY = "primary_ip_family"
2001 SS_INSTANCE_LIST = "instance_list"
2002 SS_RELEASE_VERSION = "release_version"
2003 SS_HYPERVISOR_LIST = "hypervisor_list"
2004 SS_MAINTAIN_NODE_HEALTH = "maintain_node_health"
2005 SS_UID_POOL = "uid_pool"
2006 SS_NODEGROUPS = "nodegroups"
2007 SS_NETWORKS = "networks"
2008
2009 SS_FILE_PERMS = 0444
2010
2011 # cluster wide default parameters
2012 DEFAULT_ENABLED_HYPERVISOR = HT_XEN_PVM
2013
2014 HVC_DEFAULTS = {
2015   HT_XEN_PVM: {
2016     HV_USE_BOOTLOADER: False,
2017     HV_BOOTLOADER_PATH: XEN_BOOTLOADER,
2018     HV_BOOTLOADER_ARGS: "",
2019     HV_KERNEL_PATH: XEN_KERNEL,
2020     HV_INITRD_PATH: "",
2021     HV_ROOT_PATH: "/dev/xvda1",
2022     HV_KERNEL_ARGS: "ro",
2023     HV_MIGRATION_PORT: 8002,
2024     HV_MIGRATION_MODE: HT_MIGRATION_LIVE,
2025     HV_BLOCKDEV_PREFIX: "sd",
2026     HV_REBOOT_BEHAVIOR: INSTANCE_REBOOT_ALLOWED,
2027     HV_CPU_MASK: CPU_PINNING_ALL,
2028     HV_CPU_CAP: 0,
2029     HV_CPU_WEIGHT: 256,
2030     },
2031   HT_XEN_HVM: {
2032     HV_BOOT_ORDER: "cd",
2033     HV_CDROM_IMAGE_PATH: "",
2034     HV_NIC_TYPE: HT_NIC_RTL8139,
2035     HV_DISK_TYPE: HT_DISK_PARAVIRTUAL,
2036     HV_VNC_BIND_ADDRESS: IP4_ADDRESS_ANY,
2037     HV_VNC_PASSWORD_FILE: pathutils.VNC_PASSWORD_FILE,
2038     HV_ACPI: True,
2039     HV_PAE: True,
2040     HV_KERNEL_PATH: "/usr/lib/xen/boot/hvmloader",
2041     HV_DEVICE_MODEL: "/usr/lib/xen/bin/qemu-dm",
2042     HV_MIGRATION_PORT: 8002,
2043     HV_MIGRATION_MODE: HT_MIGRATION_NONLIVE,
2044     HV_USE_LOCALTIME: False,
2045     HV_BLOCKDEV_PREFIX: "hd",
2046     HV_PASSTHROUGH: "",
2047     HV_REBOOT_BEHAVIOR: INSTANCE_REBOOT_ALLOWED,
2048     HV_CPU_MASK: CPU_PINNING_ALL,
2049     HV_CPU_CAP: 0,
2050     HV_CPU_WEIGHT: 256,
2051     HV_VIF_TYPE: HT_HVM_VIF_IOEMU,
2052     HV_VIRIDIAN: False,
2053     },
2054   HT_KVM: {
2055     HV_KVM_PATH: KVM_PATH,
2056     HV_KERNEL_PATH: KVM_KERNEL,
2057     HV_INITRD_PATH: "",
2058     HV_KERNEL_ARGS: "ro",
2059     HV_ROOT_PATH: "/dev/vda1",
2060     HV_ACPI: True,
2061     HV_SERIAL_CONSOLE: True,
2062     HV_SERIAL_SPEED: 38400,
2063     HV_VNC_BIND_ADDRESS: "",
2064     HV_VNC_TLS: False,
2065     HV_VNC_X509: "",
2066     HV_VNC_X509_VERIFY: False,
2067     HV_VNC_PASSWORD_FILE: "",
2068     HV_KVM_SPICE_BIND: "",
2069     HV_KVM_SPICE_IP_VERSION: IFACE_NO_IP_VERSION_SPECIFIED,
2070     HV_KVM_SPICE_PASSWORD_FILE: "",
2071     HV_KVM_SPICE_LOSSLESS_IMG_COMPR: "",
2072     HV_KVM_SPICE_JPEG_IMG_COMPR: "",
2073     HV_KVM_SPICE_ZLIB_GLZ_IMG_COMPR: "",
2074     HV_KVM_SPICE_STREAMING_VIDEO_DETECTION: "",
2075     HV_KVM_SPICE_AUDIO_COMPR: True,
2076     HV_KVM_SPICE_USE_TLS: False,
2077     HV_KVM_SPICE_TLS_CIPHERS: OPENSSL_CIPHERS,
2078     HV_KVM_SPICE_USE_VDAGENT: True,
2079     HV_KVM_FLOPPY_IMAGE_PATH: "",
2080     HV_CDROM_IMAGE_PATH: "",
2081     HV_KVM_CDROM2_IMAGE_PATH: "",
2082     HV_BOOT_ORDER: HT_BO_DISK,
2083     HV_NIC_TYPE: HT_NIC_PARAVIRTUAL,
2084     HV_DISK_TYPE: HT_DISK_PARAVIRTUAL,
2085     HV_KVM_CDROM_DISK_TYPE: "",
2086     HV_USB_MOUSE: "",
2087     HV_KEYMAP: "",
2088     HV_MIGRATION_PORT: 8102,
2089     HV_MIGRATION_BANDWIDTH: 32, # MiB/s
2090     HV_MIGRATION_DOWNTIME: 30,  # ms
2091     HV_MIGRATION_MODE: HT_MIGRATION_LIVE,
2092     HV_USE_LOCALTIME: False,
2093     HV_DISK_CACHE: HT_CACHE_DEFAULT,
2094     HV_SECURITY_MODEL: HT_SM_NONE,
2095     HV_SECURITY_DOMAIN: "",
2096     HV_KVM_FLAG: "",
2097     HV_VHOST_NET: False,
2098     HV_KVM_USE_CHROOT: False,
2099     HV_MEM_PATH: "",
2100     HV_REBOOT_BEHAVIOR: INSTANCE_REBOOT_ALLOWED,
2101     HV_CPU_MASK: CPU_PINNING_ALL,
2102     HV_CPU_TYPE: "",
2103     HV_CPU_CORES: 0,
2104     HV_CPU_THREADS: 0,
2105     HV_CPU_SOCKETS: 0,
2106     HV_SOUNDHW: "",
2107     HV_USB_DEVICES: "",
2108     HV_VGA: "",
2109     HV_KVM_EXTRA: "",
2110     HV_KVM_MACHINE_VERSION: "",
2111     HV_VNET_HDR: True,
2112     },
2113   HT_FAKE: {},
2114   HT_CHROOT: {
2115     HV_INIT_SCRIPT: "/ganeti-chroot",
2116     },
2117   HT_LXC: {
2118     HV_CPU_MASK: "",
2119     },
2120   }
2121
2122 HVC_GLOBALS = compat.UniqueFrozenset([
2123   HV_MIGRATION_PORT,
2124   HV_MIGRATION_BANDWIDTH,
2125   HV_MIGRATION_MODE,
2126   ])
2127
2128 BEC_DEFAULTS = {
2129   BE_MINMEM: 128,
2130   BE_MAXMEM: 128,
2131   BE_VCPUS: 1,
2132   BE_AUTO_BALANCE: True,
2133   BE_ALWAYS_FAILOVER: False,
2134   BE_SPINDLE_USE: 1,
2135   }
2136
2137 NDC_DEFAULTS = {
2138   ND_OOB_PROGRAM: "",
2139   ND_SPINDLE_COUNT: 1,
2140   ND_EXCLUSIVE_STORAGE: False,
2141   }
2142
2143 NDC_GLOBALS = compat.UniqueFrozenset([
2144   ND_EXCLUSIVE_STORAGE,
2145   ])
2146
2147 DISK_LD_DEFAULTS = {
2148   LD_DRBD8: {
2149     LDP_RESYNC_RATE: CLASSIC_DRBD_SYNC_SPEED,
2150     LDP_BARRIERS: _autoconf.DRBD_BARRIERS,
2151     LDP_NO_META_FLUSH: _autoconf.DRBD_NO_META_FLUSH,
2152     LDP_DEFAULT_METAVG: DEFAULT_VG,
2153     LDP_DISK_CUSTOM: "",
2154     LDP_NET_CUSTOM: "",
2155     LDP_DYNAMIC_RESYNC: False,
2156
2157     # The default values for the DRBD dynamic resync speed algorithm
2158     # are taken from the drbsetup 8.3.11 man page, except for
2159     # c-plan-ahead (that we don't need to set to 0, because we have a
2160     # separate option to enable it) and for c-max-rate, that we cap to
2161     # the default value for the static resync rate.
2162     LDP_PLAN_AHEAD: 20, # ds
2163     LDP_FILL_TARGET: 0, # sectors
2164     LDP_DELAY_TARGET: 1, # ds
2165     LDP_MAX_RATE: CLASSIC_DRBD_SYNC_SPEED, # KiB/s
2166     LDP_MIN_RATE: 4 * 1024, # KiB/s
2167     },
2168   LD_LV: {
2169     LDP_STRIPES: _autoconf.LVM_STRIPECOUNT
2170     },
2171   LD_FILE: {},
2172   LD_BLOCKDEV: {},
2173   LD_RBD: {
2174     LDP_POOL: "rbd"
2175     },
2176   LD_EXT: {},
2177   }
2178
2179 # readability shortcuts
2180 _LV_DEFAULTS = DISK_LD_DEFAULTS[LD_LV]
2181 _DRBD_DEFAULTS = DISK_LD_DEFAULTS[LD_DRBD8]
2182
2183 DISK_DT_DEFAULTS = {
2184   DT_PLAIN: {
2185     LV_STRIPES: DISK_LD_DEFAULTS[LD_LV][LDP_STRIPES],
2186     },
2187   DT_DRBD8: {
2188     DRBD_RESYNC_RATE: _DRBD_DEFAULTS[LDP_RESYNC_RATE],
2189     DRBD_DATA_STRIPES: _LV_DEFAULTS[LDP_STRIPES],
2190     DRBD_META_STRIPES: _LV_DEFAULTS[LDP_STRIPES],
2191     DRBD_DISK_BARRIERS: _DRBD_DEFAULTS[LDP_BARRIERS],
2192     DRBD_META_BARRIERS: _DRBD_DEFAULTS[LDP_NO_META_FLUSH],
2193     DRBD_DEFAULT_METAVG: _DRBD_DEFAULTS[LDP_DEFAULT_METAVG],
2194     DRBD_DISK_CUSTOM: _DRBD_DEFAULTS[LDP_DISK_CUSTOM],
2195     DRBD_NET_CUSTOM: _DRBD_DEFAULTS[LDP_NET_CUSTOM],
2196     DRBD_DYNAMIC_RESYNC: _DRBD_DEFAULTS[LDP_DYNAMIC_RESYNC],
2197     DRBD_PLAN_AHEAD: _DRBD_DEFAULTS[LDP_PLAN_AHEAD],
2198     DRBD_FILL_TARGET: _DRBD_DEFAULTS[LDP_FILL_TARGET],
2199     DRBD_DELAY_TARGET: _DRBD_DEFAULTS[LDP_DELAY_TARGET],
2200     DRBD_MAX_RATE: _DRBD_DEFAULTS[LDP_MAX_RATE],
2201     DRBD_MIN_RATE: _DRBD_DEFAULTS[LDP_MIN_RATE],
2202     },
2203   DT_DISKLESS: {},
2204   DT_FILE: {},
2205   DT_SHARED_FILE: {},
2206   DT_BLOCK: {},
2207   DT_RBD: {
2208     RBD_POOL: DISK_LD_DEFAULTS[LD_RBD][LDP_POOL]
2209     },
2210   DT_EXT: {},
2211   }
2212
2213 # we don't want to export the shortcuts
2214 del _LV_DEFAULTS, _DRBD_DEFAULTS
2215
2216 NICC_DEFAULTS = {
2217   NIC_MODE: NIC_MODE_BRIDGED,
2218   NIC_LINK: DEFAULT_BRIDGE,
2219   }
2220
2221 # All of the following values are quite arbitrarily - there are no
2222 # "good" defaults, these must be customised per-site
2223 ISPECS_MINMAX_DEFAULTS = {
2224   ISPECS_MIN: {
2225     ISPEC_MEM_SIZE: 128,
2226     ISPEC_CPU_COUNT: 1,
2227     ISPEC_DISK_COUNT: 1,
2228     ISPEC_DISK_SIZE: 1024,
2229     ISPEC_NIC_COUNT: 1,
2230     ISPEC_SPINDLE_USE: 1,
2231     },
2232   ISPECS_MAX: {
2233     ISPEC_MEM_SIZE: 32768,
2234     ISPEC_CPU_COUNT: 8,
2235     ISPEC_DISK_COUNT: MAX_DISKS,
2236     ISPEC_DISK_SIZE: 1024 * 1024,
2237     ISPEC_NIC_COUNT: MAX_NICS,
2238     ISPEC_SPINDLE_USE: 12,
2239     },
2240   }
2241 IPOLICY_DEFAULTS = {
2242   ISPECS_MINMAX: [ISPECS_MINMAX_DEFAULTS],
2243   ISPECS_STD: {
2244     ISPEC_MEM_SIZE: 128,
2245     ISPEC_CPU_COUNT: 1,
2246     ISPEC_DISK_COUNT: 1,
2247     ISPEC_DISK_SIZE: 1024,
2248     ISPEC_NIC_COUNT: 1,
2249     ISPEC_SPINDLE_USE: 1,
2250     },
2251   IPOLICY_DTS: list(DISK_TEMPLATES),
2252   IPOLICY_VCPU_RATIO: 4.0,
2253   IPOLICY_SPINDLE_RATIO: 32.0,
2254   }
2255
2256 MASTER_POOL_SIZE_DEFAULT = 10
2257
2258 # Exclusive storage:
2259 # Error margin used to compare physical disks
2260 PART_MARGIN = .01
2261 # Space reserved when creating instance disks
2262 PART_RESERVED = .02
2263
2264 CONFD_PROTOCOL_VERSION = 1
2265
2266 CONFD_REQ_PING = 0
2267 CONFD_REQ_NODE_ROLE_BYNAME = 1
2268 CONFD_REQ_NODE_PIP_BY_INSTANCE_IP = 2
2269 CONFD_REQ_CLUSTER_MASTER = 3
2270 CONFD_REQ_NODE_PIP_LIST = 4
2271 CONFD_REQ_MC_PIP_LIST = 5
2272 CONFD_REQ_INSTANCES_IPS_LIST = 6
2273 CONFD_REQ_NODE_DRBD = 7
2274 CONFD_REQ_NODE_INSTANCES = 8
2275
2276 # Confd request query fields. These are used to narrow down queries.
2277 # These must be strings rather than integers, because json-encoding
2278 # converts them to strings anyway, as they're used as dict-keys.
2279 CONFD_REQQ_LINK = "0"
2280 CONFD_REQQ_IP = "1"
2281 CONFD_REQQ_IPLIST = "2"
2282 CONFD_REQQ_FIELDS = "3"
2283
2284 CONFD_REQFIELD_NAME = "0"
2285 CONFD_REQFIELD_IP = "1"
2286 CONFD_REQFIELD_MNODE_PIP = "2"
2287
2288 CONFD_REQS = compat.UniqueFrozenset([
2289   CONFD_REQ_PING,
2290   CONFD_REQ_NODE_ROLE_BYNAME,
2291   CONFD_REQ_NODE_PIP_BY_INSTANCE_IP,
2292   CONFD_REQ_CLUSTER_MASTER,
2293   CONFD_REQ_NODE_PIP_LIST,
2294   CONFD_REQ_MC_PIP_LIST,
2295   CONFD_REQ_INSTANCES_IPS_LIST,
2296   CONFD_REQ_NODE_DRBD,
2297   ])
2298
2299 CONFD_REPL_STATUS_OK = 0
2300 CONFD_REPL_STATUS_ERROR = 1
2301 CONFD_REPL_STATUS_NOTIMPLEMENTED = 2
2302
2303 CONFD_REPL_STATUSES = compat.UniqueFrozenset([
2304   CONFD_REPL_STATUS_OK,
2305   CONFD_REPL_STATUS_ERROR,
2306   CONFD_REPL_STATUS_NOTIMPLEMENTED,
2307   ])
2308
2309 (CONFD_NODE_ROLE_MASTER,
2310  CONFD_NODE_ROLE_CANDIDATE,
2311  CONFD_NODE_ROLE_OFFLINE,
2312  CONFD_NODE_ROLE_DRAINED,
2313  CONFD_NODE_ROLE_REGULAR,
2314  ) = range(5)
2315
2316 # A few common errors for confd
2317 CONFD_ERROR_UNKNOWN_ENTRY = 1
2318 CONFD_ERROR_INTERNAL = 2
2319 CONFD_ERROR_ARGUMENT = 3
2320
2321 # Each request is "salted" by the current timestamp.
2322 # This constants decides how many seconds of skew to accept.
2323 # TODO: make this a default and allow the value to be more configurable
2324 CONFD_MAX_CLOCK_SKEW = 2 * NODE_MAX_CLOCK_SKEW
2325
2326 # When we haven't reloaded the config for more than this amount of
2327 # seconds, we force a test to see if inotify is betraying us. Using a
2328 # prime number to ensure we get less chance of 'same wakeup' with
2329 # other processes.
2330 CONFD_CONFIG_RELOAD_TIMEOUT = 17
2331
2332 # If we receive more than one update in this amount of microseconds,
2333 # we move to polling every RATELIMIT seconds, rather than relying on
2334 # inotify, to be able to serve more requests.
2335 CONFD_CONFIG_RELOAD_RATELIMIT = 250000
2336
2337 # Magic number prepended to all confd queries.
2338 # This allows us to distinguish different types of confd protocols and handle
2339 # them. For example by changing this we can move the whole payload to be
2340 # compressed, or move away from json.
2341 CONFD_MAGIC_FOURCC = "plj0"
2342
2343 # By default a confd request is sent to the minimum between this number and all
2344 # MCs. 6 was chosen because even in the case of a disastrous 50% response rate,
2345 # we should have enough answers to be able to compare more than one.
2346 CONFD_DEFAULT_REQ_COVERAGE = 6
2347
2348 # Timeout in seconds to expire pending query request in the confd client
2349 # library. We don't actually expect any answer more than 10 seconds after we
2350 # sent a request.
2351 CONFD_CLIENT_EXPIRE_TIMEOUT = 10
2352
2353 # Maximum UDP datagram size.
2354 # On IPv4: 64K - 20 (ip header size) - 8 (udp header size) = 65507
2355 # On IPv6: 64K - 40 (ip6 header size) - 8 (udp header size) = 65487
2356 #   (assuming we can't use jumbo frames)
2357 # We just set this to 60K, which should be enough
2358 MAX_UDP_DATA_SIZE = 61440
2359
2360 # User-id pool minimum/maximum acceptable user-ids.
2361 UIDPOOL_UID_MIN = 0
2362 UIDPOOL_UID_MAX = 2 ** 32 - 1 # Assuming 32 bit user-ids
2363
2364 # Name or path of the pgrep command
2365 PGREP = "pgrep"
2366
2367 # Name of the node group that gets created at cluster init or upgrade
2368 INITIAL_NODE_GROUP_NAME = "default"
2369
2370 # Possible values for NodeGroup.alloc_policy
2371 ALLOC_POLICY_PREFERRED = "preferred"
2372 ALLOC_POLICY_LAST_RESORT = "last_resort"
2373 ALLOC_POLICY_UNALLOCABLE = "unallocable"
2374 VALID_ALLOC_POLICIES = [
2375   ALLOC_POLICY_PREFERRED,
2376   ALLOC_POLICY_LAST_RESORT,
2377   ALLOC_POLICY_UNALLOCABLE,
2378   ]
2379
2380 # Temporary external/shared storage parameters
2381 BLOCKDEV_DRIVER_MANUAL = "manual"
2382
2383 # qemu-img path, required for ovfconverter
2384 QEMUIMG_PATH = _autoconf.QEMUIMG_PATH
2385
2386 # Whether htools was enabled at compilation time
2387 HTOOLS = _autoconf.HTOOLS
2388 # The hail iallocator
2389 IALLOC_HAIL = "hail"
2390
2391 # Fake opcodes for functions that have hooks attached to them via
2392 # backend.RunLocalHooks
2393 FAKE_OP_MASTER_TURNUP = "OP_CLUSTER_IP_TURNUP"
2394 FAKE_OP_MASTER_TURNDOWN = "OP_CLUSTER_IP_TURNDOWN"
2395
2396 # SSH key types
2397 SSHK_RSA = "rsa"
2398 SSHK_DSA = "dsa"
2399 SSHK_ALL = compat.UniqueFrozenset([SSHK_RSA, SSHK_DSA])
2400
2401 # SSH authorized key types
2402 SSHAK_RSA = "ssh-rsa"
2403 SSHAK_DSS = "ssh-dss"
2404 SSHAK_ALL = compat.UniqueFrozenset([SSHAK_RSA, SSHAK_DSS])
2405
2406 # SSH setup
2407 SSHS_CLUSTER_NAME = "cluster_name"
2408 SSHS_SSH_HOST_KEY = "ssh_host_key"
2409 SSHS_SSH_ROOT_KEY = "ssh_root_key"
2410 SSHS_NODE_DAEMON_CERTIFICATE = "node_daemon_certificate"
2411
2412 #: Key files for SSH daemon
2413 SSH_DAEMON_KEYFILES = {
2414   SSHK_RSA: (pathutils.SSH_HOST_RSA_PRIV, pathutils.SSH_HOST_RSA_PUB),
2415   SSHK_DSA: (pathutils.SSH_HOST_DSA_PRIV, pathutils.SSH_HOST_DSA_PUB),
2416   }
2417
2418 # Node daemon setup
2419 NDS_CLUSTER_NAME = "cluster_name"
2420 NDS_NODE_DAEMON_CERTIFICATE = "node_daemon_certificate"
2421 NDS_SSCONF = "ssconf"
2422 NDS_START_NODE_DAEMON = "start_node_daemon"
2423
2424 # Path generating random UUID
2425 RANDOM_UUID_FILE = "/proc/sys/kernel/random/uuid"
2426
2427 # Regex string for verifying a UUID
2428 UUID_REGEX = "^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$"
2429
2430 # Auto-repair tag prefixes
2431 AUTO_REPAIR_TAG_PREFIX = "ganeti:watcher:autorepair:"
2432 AUTO_REPAIR_TAG_ENABLED = AUTO_REPAIR_TAG_PREFIX
2433 AUTO_REPAIR_TAG_SUSPENDED = AUTO_REPAIR_TAG_ENABLED + "suspend:"
2434 AUTO_REPAIR_TAG_PENDING = AUTO_REPAIR_TAG_PREFIX + "pending:"
2435 AUTO_REPAIR_TAG_RESULT = AUTO_REPAIR_TAG_PREFIX + "result:"
2436
2437 # Auto-repair levels
2438 AUTO_REPAIR_FIX_STORAGE = "fix-storage"
2439 AUTO_REPAIR_MIGRATE = "migrate"
2440 AUTO_REPAIR_FAILOVER = "failover"
2441 AUTO_REPAIR_REINSTALL = "reinstall"
2442 AUTO_REPAIR_ALL_TYPES = [
2443   AUTO_REPAIR_FIX_STORAGE,
2444   AUTO_REPAIR_MIGRATE,
2445   AUTO_REPAIR_FAILOVER,
2446   AUTO_REPAIR_REINSTALL,
2447 ]
2448
2449 # Auto-repair results
2450 AUTO_REPAIR_SUCCESS = "success"
2451 AUTO_REPAIR_FAILURE = "failure"
2452 AUTO_REPAIR_ENOPERM = "enoperm"
2453 AUTO_REPAIR_ALL_RESULTS = frozenset([
2454     AUTO_REPAIR_SUCCESS,
2455     AUTO_REPAIR_FAILURE,
2456     AUTO_REPAIR_ENOPERM,
2457 ])
2458
2459 # The version identifier for builtin data collectors
2460 BUILTIN_DATA_COLLECTOR_VERSION = "B"
2461
2462 # The reason trail opcode parameter name
2463 OPCODE_REASON = "reason"
2464
2465 # The source reasons for the execution of an OpCode
2466 OPCODE_REASON_SRC_CLIENT = "gnt:client"
2467 OPCODE_REASON_SRC_NODED = "gnt:daemon:noded"
2468 OPCODE_REASON_SRC_OPCODE = "gnt:opcode"
2469 OPCODE_REASON_SRC_RLIB2 = "gnt:library:rlib2"
2470 OPCODE_REASON_SRC_USER = "gnt:user"
2471
2472 OPCODE_REASON_SOURCES = compat.UniqueFrozenset([
2473   OPCODE_REASON_SRC_CLIENT,
2474   OPCODE_REASON_SRC_NODED,
2475   OPCODE_REASON_SRC_OPCODE,
2476   OPCODE_REASON_SRC_RLIB2,
2477   OPCODE_REASON_SRC_USER,
2478   ])
2479
2480 # Do not re-export imported modules
2481 del re, _vcsversion, _autoconf, socket, pathutils, compat