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