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