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