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