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