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