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