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