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