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