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