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