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