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