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