hv_xen: Remove config after shutdown was successful
[ganeti-local] / lib / constants.py
1 #
2 #
3
4 # Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 Google Inc.
5 #
6 # This program is free software; you can redistribute it and/or modify
7 # it under the terms of the GNU General Public License as published by
8 # the Free Software Foundation; either version 2 of the License, or
9 # (at your option) any later version.
10 #
11 # This program is distributed in the hope that it will be useful, but
12 # WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 # General Public License for more details.
15 #
16 # You should have received a copy of the GNU General Public License
17 # along with this program; if not, write to the Free Software
18 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19 # 02110-1301, USA.
20
21
22 """Module holding different constants."""
23
24 import re
25 import socket
26
27 from ganeti import _autoconf
28 from ganeti import _vcsversion
29 from ganeti import compat
30 from ganeti import pathutils
31
32
33 # various versions
34 RELEASE_VERSION = _autoconf.PACKAGE_VERSION
35 OS_API_V10 = 10
36 OS_API_V15 = 15
37 OS_API_V20 = 20
38 OS_API_VERSIONS = compat.UniqueFrozenset([
39   OS_API_V10,
40   OS_API_V15,
41   OS_API_V20,
42   ])
43 VCS_VERSION = _vcsversion.VCS_VERSION
44 EXPORT_VERSION = 0
45 RAPI_VERSION = 2
46
47
48 # Format for CONFIG_VERSION:
49 #   01 03 0123 = 01030123
50 #   ^^ ^^ ^^^^
51 #   |  |  + Configuration version/revision
52 #   |  + Minor version
53 #   + Major version
54 #
55 # It is stored as an integer. Make sure not to write an octal number.
56
57 # BuildVersion and SplitVersion must be in here because we can't import other
58 # modules. The cfgupgrade tool must be able to read and write version numbers
59 # and thus requires these functions. To avoid code duplication, they're kept in
60 # here.
61
62 def BuildVersion(major, minor, revision):
63   """Calculates int version number from major, minor and revision numbers.
64
65   Returns: int representing version number
66
67   """
68   assert isinstance(major, int)
69   assert isinstance(minor, int)
70   assert isinstance(revision, int)
71   return (1000000 * major +
72             10000 * minor +
73                 1 * revision)
74
75
76 def SplitVersion(version):
77   """Splits version number stored in an int.
78
79   Returns: tuple; (major, minor, revision)
80
81   """
82   assert isinstance(version, int)
83
84   (major, remainder) = divmod(version, 1000000)
85   (minor, revision) = divmod(remainder, 10000)
86
87   return (major, minor, revision)
88
89
90 CONFIG_MAJOR = int(_autoconf.VERSION_MAJOR)
91 CONFIG_MINOR = int(_autoconf.VERSION_MINOR)
92 CONFIG_REVISION = 0
93 CONFIG_VERSION = BuildVersion(CONFIG_MAJOR, CONFIG_MINOR, CONFIG_REVISION)
94
95 #: RPC protocol version
96 PROTOCOL_VERSION = BuildVersion(CONFIG_MAJOR, CONFIG_MINOR, 0)
97
98 # user separation
99 DAEMONS_GROUP = _autoconf.DAEMONS_GROUP
100 ADMIN_GROUP = _autoconf.ADMIN_GROUP
101 MASTERD_USER = _autoconf.MASTERD_USER
102 MASTERD_GROUP = _autoconf.MASTERD_GROUP
103 RAPI_USER = _autoconf.RAPI_USER
104 RAPI_GROUP = _autoconf.RAPI_GROUP
105 CONFD_USER = _autoconf.CONFD_USER
106 CONFD_GROUP = _autoconf.CONFD_GROUP
107 NODED_USER = _autoconf.NODED_USER
108 NODED_GROUP = _autoconf.NODED_GROUP
109 SSH_LOGIN_USER = _autoconf.SSH_LOGIN_USER
110 SSH_CONSOLE_USER = _autoconf.SSH_CONSOLE_USER
111
112 # cpu pinning separators and constants
113 CPU_PINNING_SEP = ":"
114 CPU_PINNING_ALL = "all"
115 # internal representation of "all"
116 CPU_PINNING_ALL_VAL = -1
117 # one "all" entry in a CPU list means CPU pinning is off
118 CPU_PINNING_OFF = [CPU_PINNING_ALL_VAL]
119
120 # A Xen-specific implementation detail - there is no way to actually say
121 # "use any cpu for pinning" in a Xen configuration file, as opposed to the
122 # command line, where you can say "xm vcpu-pin <domain> <vcpu> all".
123 # The workaround used in Xen is "0-63" (see source code function
124 # xm_vcpu_pin in <xen-source>/tools/python/xen/xm/main.py).
125 # To support future changes, the following constant is treated as a
126 # blackbox string that simply means use-any-cpu-for-pinning-under-xen.
127 CPU_PINNING_ALL_XEN = "0-63"
128
129 # A KVM-specific implementation detail - the following value is used
130 # to set CPU affinity to all processors (#0 through #31), per taskset
131 # man page.
132 # FIXME: This only works for machines with up to 32 CPU cores
133 CPU_PINNING_ALL_KVM = 0xFFFFFFFF
134
135 # Wipe
136 DD_CMD = "dd"
137 MAX_WIPE_CHUNK = 1024 # 1GB
138 MIN_WIPE_CHUNK_PERCENT = 10
139
140 RUN_DIRS_MODE = 0775
141 SECURE_DIR_MODE = 0700
142 SECURE_FILE_MODE = 0600
143 ADOPTABLE_BLOCKDEV_ROOT = "/dev/disk/"
144 ENABLE_FILE_STORAGE = _autoconf.ENABLE_FILE_STORAGE
145 ENABLE_SHARED_FILE_STORAGE = _autoconf.ENABLE_SHARED_FILE_STORAGE
146 ENABLE_CONFD = _autoconf.ENABLE_CONFD
147 ENABLE_SPLIT_QUERY = _autoconf.ENABLE_SPLIT_QUERY
148 ENABLE_RESTRICTED_COMMANDS = _autoconf.ENABLE_RESTRICTED_COMMANDS
149
150 NODED = "ganeti-noded"
151 CONFD = "ganeti-confd"
152 RAPI = "ganeti-rapi"
153 MASTERD = "ganeti-masterd"
154
155 DAEMONS_PORTS = {
156   # daemon-name: ("proto", "default-port")
157   NODED: ("tcp", 1811),
158   CONFD: ("udp", 1814),
159   RAPI: ("tcp", 5080),
160   "ssh": ("tcp", 22),
161 }
162 DEFAULT_NODED_PORT = DAEMONS_PORTS[NODED][1]
163 DEFAULT_CONFD_PORT = DAEMONS_PORTS[CONFD][1]
164 DEFAULT_RAPI_PORT = DAEMONS_PORTS[RAPI][1]
165
166 FIRST_DRBD_PORT = 11000
167 LAST_DRBD_PORT = 14999
168
169 DAEMONS_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 = compat.UniqueFrozenset([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 HV_CPU_CORES = "cpu_cores"
831 HV_CPU_THREADS = "cpu_threads"
832 HV_CPU_SOCKETS = "cpu_sockets"
833 HV_SOUNDHW = "soundhw"
834 HV_USB_DEVICES = "usb_devices"
835 HV_VGA = "vga"
836 HV_KVM_EXTRA = "kvm_extra"
837 HV_KVM_MACHINE_VERSION = "machine_version"
838 HV_KVM_PATH = "kvm_path"
839
840
841 HVS_PARAMETER_TYPES = {
842   HV_KVM_PATH: VTYPE_STRING,
843   HV_BOOT_ORDER: VTYPE_STRING,
844   HV_KVM_FLOPPY_IMAGE_PATH: VTYPE_STRING,
845   HV_CDROM_IMAGE_PATH: VTYPE_STRING,
846   HV_KVM_CDROM2_IMAGE_PATH: VTYPE_STRING,
847   HV_NIC_TYPE: VTYPE_STRING,
848   HV_DISK_TYPE: VTYPE_STRING,
849   HV_KVM_CDROM_DISK_TYPE: VTYPE_STRING,
850   HV_VNC_PASSWORD_FILE: VTYPE_STRING,
851   HV_VNC_BIND_ADDRESS: VTYPE_STRING,
852   HV_VNC_TLS: VTYPE_BOOL,
853   HV_VNC_X509: VTYPE_STRING,
854   HV_VNC_X509_VERIFY: VTYPE_BOOL,
855   HV_KVM_SPICE_BIND: VTYPE_STRING,
856   HV_KVM_SPICE_IP_VERSION: VTYPE_INT,
857   HV_KVM_SPICE_PASSWORD_FILE: VTYPE_STRING,
858   HV_KVM_SPICE_LOSSLESS_IMG_COMPR: VTYPE_STRING,
859   HV_KVM_SPICE_JPEG_IMG_COMPR: VTYPE_STRING,
860   HV_KVM_SPICE_ZLIB_GLZ_IMG_COMPR: VTYPE_STRING,
861   HV_KVM_SPICE_STREAMING_VIDEO_DETECTION: VTYPE_STRING,
862   HV_KVM_SPICE_AUDIO_COMPR: VTYPE_BOOL,
863   HV_KVM_SPICE_USE_TLS: VTYPE_BOOL,
864   HV_KVM_SPICE_TLS_CIPHERS: VTYPE_STRING,
865   HV_KVM_SPICE_USE_VDAGENT: VTYPE_BOOL,
866   HV_ACPI: VTYPE_BOOL,
867   HV_PAE: VTYPE_BOOL,
868   HV_USE_BOOTLOADER: VTYPE_BOOL,
869   HV_BOOTLOADER_PATH: VTYPE_STRING,
870   HV_BOOTLOADER_ARGS: VTYPE_STRING,
871   HV_KERNEL_PATH: VTYPE_STRING,
872   HV_KERNEL_ARGS: VTYPE_STRING,
873   HV_INITRD_PATH: VTYPE_STRING,
874   HV_ROOT_PATH: VTYPE_MAYBE_STRING,
875   HV_SERIAL_CONSOLE: VTYPE_BOOL,
876   HV_SERIAL_SPEED: VTYPE_INT,
877   HV_USB_MOUSE: VTYPE_STRING,
878   HV_KEYMAP: VTYPE_STRING,
879   HV_DEVICE_MODEL: VTYPE_STRING,
880   HV_INIT_SCRIPT: VTYPE_STRING,
881   HV_MIGRATION_PORT: VTYPE_INT,
882   HV_MIGRATION_BANDWIDTH: VTYPE_INT,
883   HV_MIGRATION_DOWNTIME: VTYPE_INT,
884   HV_MIGRATION_MODE: VTYPE_STRING,
885   HV_USE_LOCALTIME: VTYPE_BOOL,
886   HV_DISK_CACHE: VTYPE_STRING,
887   HV_SECURITY_MODEL: VTYPE_STRING,
888   HV_SECURITY_DOMAIN: VTYPE_STRING,
889   HV_KVM_FLAG: VTYPE_STRING,
890   HV_VHOST_NET: VTYPE_BOOL,
891   HV_KVM_USE_CHROOT: VTYPE_BOOL,
892   HV_CPU_MASK: VTYPE_STRING,
893   HV_MEM_PATH: VTYPE_STRING,
894   HV_PASSTHROUGH: VTYPE_STRING,
895   HV_BLOCKDEV_PREFIX: VTYPE_STRING,
896   HV_REBOOT_BEHAVIOR: VTYPE_STRING,
897   HV_CPU_TYPE: VTYPE_STRING,
898   HV_CPU_CAP: VTYPE_INT,
899   HV_CPU_WEIGHT: VTYPE_INT,
900   HV_CPU_CORES: VTYPE_INT,
901   HV_CPU_THREADS: VTYPE_INT,
902   HV_CPU_SOCKETS: VTYPE_INT,
903   HV_SOUNDHW: VTYPE_STRING,
904   HV_USB_DEVICES: VTYPE_STRING,
905   HV_VGA: VTYPE_STRING,
906   HV_KVM_EXTRA: VTYPE_STRING,
907   HV_KVM_MACHINE_VERSION: VTYPE_STRING,
908   }
909
910 HVS_PARAMETERS = frozenset(HVS_PARAMETER_TYPES.keys())
911
912 HVS_PARAMETER_TITLES = {
913   HV_ACPI: "ACPI",
914   HV_BOOT_ORDER: "Boot_order",
915   HV_CDROM_IMAGE_PATH: "CDROM_image_path",
916   HV_DISK_TYPE: "Disk_type",
917   HV_INITRD_PATH: "Initrd_path",
918   HV_KERNEL_PATH: "Kernel_path",
919   HV_NIC_TYPE: "NIC_type",
920   HV_PAE: "PAE",
921   HV_VNC_BIND_ADDRESS: "VNC_bind_address",
922   HV_PASSTHROUGH: "pci_pass",
923   HV_CPU_TYPE: "cpu_type",
924   }
925
926 # Migration statuses
927 HV_MIGRATION_COMPLETED = "completed"
928 HV_MIGRATION_ACTIVE = "active"
929 HV_MIGRATION_FAILED = "failed"
930 HV_MIGRATION_CANCELLED = "cancelled"
931
932 HV_MIGRATION_VALID_STATUSES = compat.UniqueFrozenset([
933   HV_MIGRATION_COMPLETED,
934   HV_MIGRATION_ACTIVE,
935   HV_MIGRATION_FAILED,
936   HV_MIGRATION_CANCELLED,
937   ])
938
939 HV_MIGRATION_FAILED_STATUSES = compat.UniqueFrozenset([
940   HV_MIGRATION_FAILED,
941   HV_MIGRATION_CANCELLED,
942   ])
943
944 # KVM-specific statuses
945 HV_KVM_MIGRATION_VALID_STATUSES = HV_MIGRATION_VALID_STATUSES
946
947 # Node info keys
948 HV_NODEINFO_KEY_VERSION = "hv_version"
949
950 # Hypervisor state
951 HVST_MEMORY_TOTAL = "mem_total"
952 HVST_MEMORY_NODE = "mem_node"
953 HVST_MEMORY_HV = "mem_hv"
954 HVST_CPU_TOTAL = "cpu_total"
955 HVST_CPU_NODE = "cpu_node"
956
957 HVST_DEFAULTS = {
958   HVST_MEMORY_TOTAL: 0,
959   HVST_MEMORY_NODE: 0,
960   HVST_MEMORY_HV: 0,
961   HVST_CPU_TOTAL: 1,
962   HVST_CPU_NODE: 1,
963   }
964
965 HVSTS_PARAMETER_TYPES = {
966   HVST_MEMORY_TOTAL: VTYPE_INT,
967   HVST_MEMORY_NODE: VTYPE_INT,
968   HVST_MEMORY_HV: VTYPE_INT,
969   HVST_CPU_TOTAL: VTYPE_INT,
970   HVST_CPU_NODE: VTYPE_INT,
971   }
972
973 HVSTS_PARAMETERS = frozenset(HVSTS_PARAMETER_TYPES.keys())
974
975 # Disk state
976 DS_DISK_TOTAL = "disk_total"
977 DS_DISK_RESERVED = "disk_reserved"
978 DS_DISK_OVERHEAD = "disk_overhead"
979
980 DS_DEFAULTS = {
981   DS_DISK_TOTAL: 0,
982   DS_DISK_RESERVED: 0,
983   DS_DISK_OVERHEAD: 0,
984   }
985
986 DSS_PARAMETER_TYPES = {
987   DS_DISK_TOTAL: VTYPE_INT,
988   DS_DISK_RESERVED: VTYPE_INT,
989   DS_DISK_OVERHEAD: VTYPE_INT,
990   }
991
992 DSS_PARAMETERS = frozenset(DSS_PARAMETER_TYPES.keys())
993 DS_VALID_TYPES = compat.UniqueFrozenset([LD_LV])
994
995 # Backend parameter names
996 BE_MEMORY = "memory" # deprecated and replaced by max and min mem
997 BE_MAXMEM = "maxmem"
998 BE_MINMEM = "minmem"
999 BE_VCPUS = "vcpus"
1000 BE_AUTO_BALANCE = "auto_balance"
1001 BE_ALWAYS_FAILOVER = "always_failover"
1002 BE_SPINDLE_USE = "spindle_use"
1003
1004 BES_PARAMETER_TYPES = {
1005   BE_MAXMEM: VTYPE_SIZE,
1006   BE_MINMEM: VTYPE_SIZE,
1007   BE_VCPUS: VTYPE_INT,
1008   BE_AUTO_BALANCE: VTYPE_BOOL,
1009   BE_ALWAYS_FAILOVER: VTYPE_BOOL,
1010   BE_SPINDLE_USE: VTYPE_INT,
1011   }
1012
1013 BES_PARAMETER_TITLES = {
1014   BE_AUTO_BALANCE: "Auto_balance",
1015   BE_MAXMEM: "ConfigMaxMem",
1016   BE_MINMEM: "ConfigMinMem",
1017   BE_VCPUS: "ConfigVCPUs",
1018   }
1019
1020 BES_PARAMETER_COMPAT = {
1021   BE_MEMORY: VTYPE_SIZE,
1022   }
1023 BES_PARAMETER_COMPAT.update(BES_PARAMETER_TYPES)
1024
1025 BES_PARAMETERS = frozenset(BES_PARAMETER_TYPES.keys())
1026
1027 # instance specs
1028 ISPEC_MEM_SIZE = "memory-size"
1029 ISPEC_CPU_COUNT = "cpu-count"
1030 ISPEC_DISK_COUNT = "disk-count"
1031 ISPEC_DISK_SIZE = "disk-size"
1032 ISPEC_NIC_COUNT = "nic-count"
1033 ISPEC_SPINDLE_USE = "spindle-use"
1034
1035 ISPECS_PARAMETER_TYPES = {
1036   ISPEC_MEM_SIZE: VTYPE_INT,
1037   ISPEC_CPU_COUNT: VTYPE_INT,
1038   ISPEC_DISK_COUNT: VTYPE_INT,
1039   ISPEC_DISK_SIZE: VTYPE_INT,
1040   ISPEC_NIC_COUNT: VTYPE_INT,
1041   ISPEC_SPINDLE_USE: VTYPE_INT,
1042   }
1043
1044 ISPECS_PARAMETERS = frozenset(ISPECS_PARAMETER_TYPES.keys())
1045
1046 ISPECS_MIN = "min"
1047 ISPECS_MAX = "max"
1048 ISPECS_STD = "std"
1049 IPOLICY_DTS = "disk-templates"
1050 IPOLICY_VCPU_RATIO = "vcpu-ratio"
1051 IPOLICY_SPINDLE_RATIO = "spindle-ratio"
1052
1053 IPOLICY_ISPECS = compat.UniqueFrozenset([
1054   ISPECS_MIN,
1055   ISPECS_MAX,
1056   ISPECS_STD,
1057   ])
1058
1059 IPOLICY_PARAMETERS = compat.UniqueFrozenset([
1060   IPOLICY_VCPU_RATIO,
1061   IPOLICY_SPINDLE_RATIO,
1062   ])
1063
1064 IPOLICY_ALL_KEYS = (IPOLICY_ISPECS |
1065                     IPOLICY_PARAMETERS |
1066                     frozenset([IPOLICY_DTS]))
1067
1068 # Node parameter names
1069 ND_OOB_PROGRAM = "oob_program"
1070 ND_SPINDLE_COUNT = "spindle_count"
1071 ND_EXCLUSIVE_STORAGE = "exclusive_storage"
1072
1073 NDS_PARAMETER_TYPES = {
1074   ND_OOB_PROGRAM: VTYPE_STRING,
1075   ND_SPINDLE_COUNT: VTYPE_INT,
1076   ND_EXCLUSIVE_STORAGE: VTYPE_BOOL,
1077   }
1078
1079 NDS_PARAMETERS = frozenset(NDS_PARAMETER_TYPES.keys())
1080
1081 NDS_PARAMETER_TITLES = {
1082   ND_OOB_PROGRAM: "OutOfBandProgram",
1083   ND_SPINDLE_COUNT: "SpindleCount",
1084   ND_EXCLUSIVE_STORAGE: "ExclusiveStorage",
1085   }
1086
1087 # Logical Disks parameters
1088 LDP_RESYNC_RATE = "resync-rate"
1089 LDP_STRIPES = "stripes"
1090 LDP_BARRIERS = "disabled-barriers"
1091 LDP_NO_META_FLUSH = "disable-meta-flush"
1092 LDP_DEFAULT_METAVG = "default-metavg"
1093 LDP_DISK_CUSTOM = "disk-custom"
1094 LDP_NET_CUSTOM = "net-custom"
1095 LDP_DYNAMIC_RESYNC = "dynamic-resync"
1096 LDP_PLAN_AHEAD = "c-plan-ahead"
1097 LDP_FILL_TARGET = "c-fill-target"
1098 LDP_DELAY_TARGET = "c-delay-target"
1099 LDP_MAX_RATE = "c-max-rate"
1100 LDP_MIN_RATE = "c-min-rate"
1101 LDP_POOL = "pool"
1102 DISK_LD_TYPES = {
1103   LDP_RESYNC_RATE: VTYPE_INT,
1104   LDP_STRIPES: VTYPE_INT,
1105   LDP_BARRIERS: VTYPE_STRING,
1106   LDP_NO_META_FLUSH: VTYPE_BOOL,
1107   LDP_DEFAULT_METAVG: VTYPE_STRING,
1108   LDP_DISK_CUSTOM: VTYPE_STRING,
1109   LDP_NET_CUSTOM: VTYPE_STRING,
1110   LDP_DYNAMIC_RESYNC: VTYPE_BOOL,
1111   LDP_PLAN_AHEAD: VTYPE_INT,
1112   LDP_FILL_TARGET: VTYPE_INT,
1113   LDP_DELAY_TARGET: VTYPE_INT,
1114   LDP_MAX_RATE: VTYPE_INT,
1115   LDP_MIN_RATE: VTYPE_INT,
1116   LDP_POOL: VTYPE_STRING,
1117   }
1118 DISK_LD_PARAMETERS = frozenset(DISK_LD_TYPES.keys())
1119
1120 # Disk template parameters (can be set/changed by the user via gnt-cluster and
1121 # gnt-group)
1122 DRBD_RESYNC_RATE = "resync-rate"
1123 DRBD_DATA_STRIPES = "data-stripes"
1124 DRBD_META_STRIPES = "meta-stripes"
1125 DRBD_DISK_BARRIERS = "disk-barriers"
1126 DRBD_META_BARRIERS = "meta-barriers"
1127 DRBD_DEFAULT_METAVG = "metavg"
1128 DRBD_DISK_CUSTOM = "disk-custom"
1129 DRBD_NET_CUSTOM = "net-custom"
1130 DRBD_DYNAMIC_RESYNC = "dynamic-resync"
1131 DRBD_PLAN_AHEAD = "c-plan-ahead"
1132 DRBD_FILL_TARGET = "c-fill-target"
1133 DRBD_DELAY_TARGET = "c-delay-target"
1134 DRBD_MAX_RATE = "c-max-rate"
1135 DRBD_MIN_RATE = "c-min-rate"
1136 LV_STRIPES = "stripes"
1137 RBD_POOL = "pool"
1138 DISK_DT_TYPES = {
1139   DRBD_RESYNC_RATE: VTYPE_INT,
1140   DRBD_DATA_STRIPES: VTYPE_INT,
1141   DRBD_META_STRIPES: VTYPE_INT,
1142   DRBD_DISK_BARRIERS: VTYPE_STRING,
1143   DRBD_META_BARRIERS: VTYPE_BOOL,
1144   DRBD_DEFAULT_METAVG: VTYPE_STRING,
1145   DRBD_DISK_CUSTOM: VTYPE_STRING,
1146   DRBD_NET_CUSTOM: VTYPE_STRING,
1147   DRBD_DYNAMIC_RESYNC: VTYPE_BOOL,
1148   DRBD_PLAN_AHEAD: VTYPE_INT,
1149   DRBD_FILL_TARGET: VTYPE_INT,
1150   DRBD_DELAY_TARGET: VTYPE_INT,
1151   DRBD_MAX_RATE: VTYPE_INT,
1152   DRBD_MIN_RATE: VTYPE_INT,
1153   LV_STRIPES: VTYPE_INT,
1154   RBD_POOL: VTYPE_STRING,
1155   }
1156
1157 DISK_DT_PARAMETERS = frozenset(DISK_DT_TYPES.keys())
1158
1159 # OOB supported commands
1160 OOB_POWER_ON = "power-on"
1161 OOB_POWER_OFF = "power-off"
1162 OOB_POWER_CYCLE = "power-cycle"
1163 OOB_POWER_STATUS = "power-status"
1164 OOB_HEALTH = "health"
1165
1166 OOB_COMMANDS = compat.UniqueFrozenset([
1167   OOB_POWER_ON,
1168   OOB_POWER_OFF,
1169   OOB_POWER_CYCLE,
1170   OOB_POWER_STATUS,
1171   OOB_HEALTH,
1172   ])
1173
1174 OOB_POWER_STATUS_POWERED = "powered"
1175
1176 OOB_TIMEOUT = 60 # 60 seconds
1177 OOB_POWER_DELAY = 2.0 # 2 seconds
1178
1179 OOB_STATUS_OK = "OK"
1180 OOB_STATUS_WARNING = "WARNING"
1181 OOB_STATUS_CRITICAL = "CRITICAL"
1182 OOB_STATUS_UNKNOWN = "UNKNOWN"
1183
1184 OOB_STATUSES = compat.UniqueFrozenset([
1185   OOB_STATUS_OK,
1186   OOB_STATUS_WARNING,
1187   OOB_STATUS_CRITICAL,
1188   OOB_STATUS_UNKNOWN,
1189   ])
1190
1191 # Instance Parameters Profile
1192 PP_DEFAULT = "default"
1193
1194 # NIC_* constants are used inside the ganeti config
1195 NIC_MODE = "mode"
1196 NIC_LINK = "link"
1197
1198 NIC_MODE_BRIDGED = "bridged"
1199 NIC_MODE_ROUTED = "routed"
1200 NIC_MODE_OVS = "openvswitch"
1201 NIC_IP_POOL = "pool"
1202
1203 NIC_VALID_MODES = compat.UniqueFrozenset([
1204   NIC_MODE_BRIDGED,
1205   NIC_MODE_ROUTED,
1206   NIC_MODE_OVS,
1207   ])
1208
1209 RESERVE_ACTION = "reserve"
1210 RELEASE_ACTION = "release"
1211
1212 # An extra description of the network.
1213 # Can be used by hooks/kvm-vif-bridge to apply different rules
1214 NETWORK_TYPE_PRIVATE = "private"
1215 NETWORK_TYPE_PUBLIC = "public"
1216
1217 NETWORK_VALID_TYPES = compat.UniqueFrozenset([
1218   NETWORK_TYPE_PRIVATE,
1219   NETWORK_TYPE_PUBLIC,
1220   ])
1221
1222 NICS_PARAMETER_TYPES = {
1223   NIC_MODE: VTYPE_STRING,
1224   NIC_LINK: VTYPE_STRING,
1225   }
1226
1227 NICS_PARAMETERS = frozenset(NICS_PARAMETER_TYPES.keys())
1228
1229 # IDISK_* constants are used in opcodes, to create/change disks
1230 IDISK_SIZE = "size"
1231 IDISK_MODE = "mode"
1232 IDISK_ADOPT = "adopt"
1233 IDISK_VG = "vg"
1234 IDISK_METAVG = "metavg"
1235 IDISK_PROVIDER = "provider"
1236 IDISK_PARAMS_TYPES = {
1237   IDISK_SIZE: VTYPE_SIZE,
1238   IDISK_MODE: VTYPE_STRING,
1239   IDISK_ADOPT: VTYPE_STRING,
1240   IDISK_VG: VTYPE_STRING,
1241   IDISK_METAVG: VTYPE_STRING,
1242   IDISK_PROVIDER: VTYPE_STRING,
1243   }
1244 IDISK_PARAMS = frozenset(IDISK_PARAMS_TYPES.keys())
1245
1246 # INIC_* constants are used in opcodes, to create/change nics
1247 INIC_MAC = "mac"
1248 INIC_IP = "ip"
1249 INIC_MODE = "mode"
1250 INIC_LINK = "link"
1251 INIC_NETWORK = "network"
1252 INIC_PARAMS_TYPES = {
1253   INIC_IP: VTYPE_MAYBE_STRING,
1254   INIC_LINK: VTYPE_STRING,
1255   INIC_MAC: VTYPE_STRING,
1256   INIC_MODE: VTYPE_STRING,
1257   INIC_NETWORK: VTYPE_MAYBE_STRING,
1258   }
1259 INIC_PARAMS = frozenset(INIC_PARAMS_TYPES.keys())
1260
1261 # Hypervisor constants
1262 HT_XEN_PVM = "xen-pvm"
1263 HT_FAKE = "fake"
1264 HT_XEN_HVM = "xen-hvm"
1265 HT_KVM = "kvm"
1266 HT_CHROOT = "chroot"
1267 HT_LXC = "lxc"
1268 HYPER_TYPES = compat.UniqueFrozenset([
1269   HT_XEN_PVM,
1270   HT_FAKE,
1271   HT_XEN_HVM,
1272   HT_KVM,
1273   HT_CHROOT,
1274   HT_LXC,
1275   ])
1276 HTS_REQ_PORT = compat.UniqueFrozenset([HT_XEN_HVM, HT_KVM])
1277
1278 VNC_BASE_PORT = 5900
1279 VNC_DEFAULT_BIND_ADDRESS = IP4_ADDRESS_ANY
1280
1281 # NIC types
1282 HT_NIC_RTL8139 = "rtl8139"
1283 HT_NIC_NE2K_PCI = "ne2k_pci"
1284 HT_NIC_NE2K_ISA = "ne2k_isa"
1285 HT_NIC_I82551 = "i82551"
1286 HT_NIC_I85557B = "i82557b"
1287 HT_NIC_I8259ER = "i82559er"
1288 HT_NIC_PCNET = "pcnet"
1289 HT_NIC_E1000 = "e1000"
1290 HT_NIC_PARAVIRTUAL = HT_DISK_PARAVIRTUAL = "paravirtual"
1291
1292 HT_HVM_VALID_NIC_TYPES = compat.UniqueFrozenset([
1293   HT_NIC_RTL8139,
1294   HT_NIC_NE2K_PCI,
1295   HT_NIC_E1000,
1296   HT_NIC_NE2K_ISA,
1297   HT_NIC_PARAVIRTUAL,
1298   ])
1299 HT_KVM_VALID_NIC_TYPES = compat.UniqueFrozenset([
1300   HT_NIC_RTL8139,
1301   HT_NIC_NE2K_PCI,
1302   HT_NIC_NE2K_ISA,
1303   HT_NIC_I82551,
1304   HT_NIC_I85557B,
1305   HT_NIC_I8259ER,
1306   HT_NIC_PCNET,
1307   HT_NIC_E1000,
1308   HT_NIC_PARAVIRTUAL,
1309   ])
1310
1311 # Disk types
1312 HT_DISK_IOEMU = "ioemu"
1313 HT_DISK_IDE = "ide"
1314 HT_DISK_SCSI = "scsi"
1315 HT_DISK_SD = "sd"
1316 HT_DISK_MTD = "mtd"
1317 HT_DISK_PFLASH = "pflash"
1318
1319 HT_CACHE_DEFAULT = "default"
1320 HT_CACHE_NONE = "none"
1321 HT_CACHE_WTHROUGH = "writethrough"
1322 HT_CACHE_WBACK = "writeback"
1323 HT_VALID_CACHE_TYPES = compat.UniqueFrozenset([
1324   HT_CACHE_DEFAULT,
1325   HT_CACHE_NONE,
1326   HT_CACHE_WTHROUGH,
1327   HT_CACHE_WBACK,
1328   ])
1329
1330 HT_HVM_VALID_DISK_TYPES = compat.UniqueFrozenset([
1331   HT_DISK_PARAVIRTUAL,
1332   HT_DISK_IOEMU,
1333   ])
1334 HT_KVM_VALID_DISK_TYPES = compat.UniqueFrozenset([
1335   HT_DISK_PARAVIRTUAL,
1336   HT_DISK_IDE,
1337   HT_DISK_SCSI,
1338   HT_DISK_SD,
1339   HT_DISK_MTD,
1340   HT_DISK_PFLASH,
1341   ])
1342
1343 # Mouse types:
1344 HT_MOUSE_MOUSE = "mouse"
1345 HT_MOUSE_TABLET = "tablet"
1346
1347 HT_KVM_VALID_MOUSE_TYPES = compat.UniqueFrozenset([
1348   HT_MOUSE_MOUSE,
1349   HT_MOUSE_TABLET,
1350   ])
1351
1352 # Boot order
1353 HT_BO_FLOPPY = "floppy"
1354 HT_BO_CDROM = "cdrom"
1355 HT_BO_DISK = "disk"
1356 HT_BO_NETWORK = "network"
1357
1358 HT_KVM_VALID_BO_TYPES = compat.UniqueFrozenset([
1359   HT_BO_FLOPPY,
1360   HT_BO_CDROM,
1361   HT_BO_DISK,
1362   HT_BO_NETWORK,
1363   ])
1364
1365 # SPICE lossless image compression options
1366 HT_KVM_SPICE_LOSSLESS_IMG_COMPR_AUTO_GLZ = "auto_glz"
1367 HT_KVM_SPICE_LOSSLESS_IMG_COMPR_AUTO_LZ = "auto_lz"
1368 HT_KVM_SPICE_LOSSLESS_IMG_COMPR_QUIC = "quic"
1369 HT_KVM_SPICE_LOSSLESS_IMG_COMPR_GLZ = "glz"
1370 HT_KVM_SPICE_LOSSLESS_IMG_COMPR_LZ = "lz"
1371 HT_KVM_SPICE_LOSSLESS_IMG_COMPR_OFF = "off"
1372
1373 HT_KVM_SPICE_VALID_LOSSLESS_IMG_COMPR_OPTIONS = compat.UniqueFrozenset([
1374   HT_KVM_SPICE_LOSSLESS_IMG_COMPR_AUTO_GLZ,
1375   HT_KVM_SPICE_LOSSLESS_IMG_COMPR_AUTO_LZ,
1376   HT_KVM_SPICE_LOSSLESS_IMG_COMPR_QUIC,
1377   HT_KVM_SPICE_LOSSLESS_IMG_COMPR_GLZ,
1378   HT_KVM_SPICE_LOSSLESS_IMG_COMPR_LZ,
1379   HT_KVM_SPICE_LOSSLESS_IMG_COMPR_OFF,
1380   ])
1381
1382 # SPICE lossy image compression options (valid for both jpeg and zlib-glz)
1383 HT_KVM_SPICE_LOSSY_IMG_COMPR_AUTO = "auto"
1384 HT_KVM_SPICE_LOSSY_IMG_COMPR_NEVER = "never"
1385 HT_KVM_SPICE_LOSSY_IMG_COMPR_ALWAYS = "always"
1386
1387 HT_KVM_SPICE_VALID_LOSSY_IMG_COMPR_OPTIONS = compat.UniqueFrozenset([
1388   HT_KVM_SPICE_LOSSY_IMG_COMPR_AUTO,
1389   HT_KVM_SPICE_LOSSY_IMG_COMPR_NEVER,
1390   HT_KVM_SPICE_LOSSY_IMG_COMPR_ALWAYS,
1391   ])
1392
1393 # SPICE video stream detection
1394 HT_KVM_SPICE_VIDEO_STREAM_DETECTION_OFF = "off"
1395 HT_KVM_SPICE_VIDEO_STREAM_DETECTION_ALL = "all"
1396 HT_KVM_SPICE_VIDEO_STREAM_DETECTION_FILTER = "filter"
1397
1398 HT_KVM_SPICE_VALID_VIDEO_STREAM_DETECTION_OPTIONS = compat.UniqueFrozenset([
1399   HT_KVM_SPICE_VIDEO_STREAM_DETECTION_OFF,
1400   HT_KVM_SPICE_VIDEO_STREAM_DETECTION_ALL,
1401   HT_KVM_SPICE_VIDEO_STREAM_DETECTION_FILTER,
1402   ])
1403
1404 # Security models
1405 HT_SM_NONE = "none"
1406 HT_SM_USER = "user"
1407 HT_SM_POOL = "pool"
1408
1409 HT_KVM_VALID_SM_TYPES = compat.UniqueFrozenset([
1410   HT_SM_NONE,
1411   HT_SM_USER,
1412   HT_SM_POOL,
1413   ])
1414
1415 # Kvm flag values
1416 HT_KVM_ENABLED = "enabled"
1417 HT_KVM_DISABLED = "disabled"
1418
1419 HT_KVM_FLAG_VALUES = compat.UniqueFrozenset([HT_KVM_ENABLED, HT_KVM_DISABLED])
1420
1421 # Migration type
1422 HT_MIGRATION_LIVE = "live"
1423 HT_MIGRATION_NONLIVE = "non-live"
1424 HT_MIGRATION_MODES = compat.UniqueFrozenset([
1425   HT_MIGRATION_LIVE,
1426   HT_MIGRATION_NONLIVE,
1427   ])
1428
1429 # Cluster Verify steps
1430 VERIFY_NPLUSONE_MEM = "nplusone_mem"
1431 VERIFY_OPTIONAL_CHECKS = compat.UniqueFrozenset([VERIFY_NPLUSONE_MEM])
1432
1433 # Cluster Verify error classes
1434 CV_TCLUSTER = "cluster"
1435 CV_TGROUP = "group"
1436 CV_TNODE = "node"
1437 CV_TINSTANCE = "instance"
1438
1439 # Cluster Verify error codes and documentation
1440 CV_ECLUSTERCFG = \
1441   (CV_TCLUSTER, "ECLUSTERCFG", "Cluster configuration verification failure")
1442 CV_ECLUSTERCERT = \
1443   (CV_TCLUSTER, "ECLUSTERCERT",
1444    "Cluster certificate files verification failure")
1445 CV_ECLUSTERFILECHECK = \
1446   (CV_TCLUSTER, "ECLUSTERFILECHECK",
1447    "Cluster configuration verification failure")
1448 CV_ECLUSTERDANGLINGNODES = \
1449   (CV_TNODE, "ECLUSTERDANGLINGNODES",
1450    "Some nodes belong to non-existing groups")
1451 CV_ECLUSTERDANGLINGINST = \
1452   (CV_TNODE, "ECLUSTERDANGLINGINST",
1453    "Some instances have a non-existing primary node")
1454 CV_EGROUPMIXEDESFLAG = \
1455   (CV_TGROUP, "EGROUPMIXEDESFLAG",
1456    "exclusive_storage flag is not uniform within the group")
1457 CV_EGROUPDIFFERENTPVSIZE = \
1458   (CV_TGROUP, "EGROUPDIFFERENTPVSIZE", "PVs in the group have different sizes")
1459 CV_EINSTANCEBADNODE = \
1460   (CV_TINSTANCE, "EINSTANCEBADNODE",
1461    "Instance marked as running lives on an offline node")
1462 CV_EINSTANCEDOWN = \
1463   (CV_TINSTANCE, "EINSTANCEDOWN", "Instance not running on its primary node")
1464 CV_EINSTANCELAYOUT = \
1465   (CV_TINSTANCE, "EINSTANCELAYOUT", "Instance has multiple secondary nodes")
1466 CV_EINSTANCEMISSINGDISK = \
1467   (CV_TINSTANCE, "EINSTANCEMISSINGDISK", "Missing volume on an instance")
1468 CV_EINSTANCEFAULTYDISK = \
1469   (CV_TINSTANCE, "EINSTANCEFAULTYDISK",
1470    "Impossible to retrieve status for a disk")
1471 CV_EINSTANCEWRONGNODE = \
1472   (CV_TINSTANCE, "EINSTANCEWRONGNODE", "Instance running on the wrong node")
1473 CV_EINSTANCESPLITGROUPS = \
1474   (CV_TINSTANCE, "EINSTANCESPLITGROUPS",
1475    "Instance with primary and secondary nodes in different groups")
1476 CV_EINSTANCEPOLICY = \
1477   (CV_TINSTANCE, "EINSTANCEPOLICY",
1478    "Instance does not meet policy")
1479 CV_EINSTANCEUNSUITABLENODE = \
1480   (CV_TINSTANCE, "EINSTANCEUNSUITABLENODE",
1481    "Instance running on nodes that are not suitable for it")
1482 CV_ENODEDRBD = \
1483   (CV_TNODE, "ENODEDRBD", "Error parsing the DRBD status file")
1484 CV_ENODEDRBDHELPER = \
1485   (CV_TNODE, "ENODEDRBDHELPER", "Error caused by the DRBD helper")
1486 CV_ENODEFILECHECK = \
1487   (CV_TNODE, "ENODEFILECHECK",
1488    "Error retrieving the checksum of the node files")
1489 CV_ENODEHOOKS = \
1490   (CV_TNODE, "ENODEHOOKS", "Communication failure in hooks execution")
1491 CV_ENODEHV = \
1492   (CV_TNODE, "ENODEHV", "Hypervisor parameters verification failure")
1493 CV_ENODELVM = \
1494   (CV_TNODE, "ENODELVM", "LVM-related node error")
1495 CV_ENODEN1 = \
1496   (CV_TNODE, "ENODEN1", "Not enough memory to accommodate instance failovers")
1497 CV_ENODENET = \
1498   (CV_TNODE, "ENODENET", "Network-related node error")
1499 CV_ENODEOS = \
1500   (CV_TNODE, "ENODEOS", "OS-related node error")
1501 CV_ENODEORPHANINSTANCE = \
1502   (CV_TNODE, "ENODEORPHANINSTANCE", "Unknown intance running on a node")
1503 CV_ENODEORPHANLV = \
1504   (CV_TNODE, "ENODEORPHANLV", "Unknown LVM logical volume")
1505 CV_ENODERPC = \
1506   (CV_TNODE, "ENODERPC",
1507    "Error during connection to the primary node of an instance")
1508 CV_ENODESSH = \
1509   (CV_TNODE, "ENODESSH", "SSH-related node error")
1510 CV_ENODEVERSION = \
1511   (CV_TNODE, "ENODEVERSION",
1512    "Protocol version mismatch or Ganeti version mismatch")
1513 CV_ENODESETUP = \
1514   (CV_TNODE, "ENODESETUP", "Node setup error")
1515 CV_ENODETIME = \
1516   (CV_TNODE, "ENODETIME", "Node returned invalid time")
1517 CV_ENODEOOBPATH = \
1518   (CV_TNODE, "ENODEOOBPATH", "Invalid Out Of Band path")
1519 CV_ENODEUSERSCRIPTS = \
1520   (CV_TNODE, "ENODEUSERSCRIPTS", "User scripts not present or not executable")
1521 CV_ENODEFILESTORAGEPATHS = \
1522   (CV_TNODE, "ENODEFILESTORAGEPATHS", "Detected bad file storage paths")
1523
1524 CV_ALL_ECODES = compat.UniqueFrozenset([
1525   CV_ECLUSTERCFG,
1526   CV_ECLUSTERCERT,
1527   CV_ECLUSTERFILECHECK,
1528   CV_ECLUSTERDANGLINGNODES,
1529   CV_ECLUSTERDANGLINGINST,
1530   CV_EINSTANCEBADNODE,
1531   CV_EINSTANCEDOWN,
1532   CV_EINSTANCELAYOUT,
1533   CV_EINSTANCEMISSINGDISK,
1534   CV_EINSTANCEFAULTYDISK,
1535   CV_EINSTANCEWRONGNODE,
1536   CV_EINSTANCESPLITGROUPS,
1537   CV_EINSTANCEPOLICY,
1538   CV_ENODEDRBD,
1539   CV_ENODEDRBDHELPER,
1540   CV_ENODEFILECHECK,
1541   CV_ENODEHOOKS,
1542   CV_ENODEHV,
1543   CV_ENODELVM,
1544   CV_ENODEN1,
1545   CV_ENODENET,
1546   CV_ENODEOS,
1547   CV_ENODEORPHANINSTANCE,
1548   CV_ENODEORPHANLV,
1549   CV_ENODERPC,
1550   CV_ENODESSH,
1551   CV_ENODEVERSION,
1552   CV_ENODESETUP,
1553   CV_ENODETIME,
1554   CV_ENODEOOBPATH,
1555   CV_ENODEUSERSCRIPTS,
1556   CV_ENODEFILESTORAGEPATHS,
1557   ])
1558
1559 CV_ALL_ECODES_STRINGS = \
1560   compat.UniqueFrozenset(estr for (_, estr, _) in CV_ALL_ECODES)
1561
1562 # Node verify constants
1563 NV_BRIDGES = "bridges"
1564 NV_DRBDHELPER = "drbd-helper"
1565 NV_DRBDLIST = "drbd-list"
1566 NV_EXCLUSIVEPVS = "exclusive-pvs"
1567 NV_FILELIST = "filelist"
1568 NV_FILE_STORAGE_PATHS = "file-storage-paths"
1569 NV_HVINFO = "hvinfo"
1570 NV_HVPARAMS = "hvparms"
1571 NV_HYPERVISOR = "hypervisor"
1572 NV_INSTANCELIST = "instancelist"
1573 NV_LVLIST = "lvlist"
1574 NV_MASTERIP = "master-ip"
1575 NV_NODELIST = "nodelist"
1576 NV_NODENETTEST = "node-net-test"
1577 NV_NODESETUP = "nodesetup"
1578 NV_OOB_PATHS = "oob-paths"
1579 NV_OSLIST = "oslist"
1580 NV_PVLIST = "pvlist"
1581 NV_TIME = "time"
1582 NV_USERSCRIPTS = "user-scripts"
1583 NV_VERSION = "version"
1584 NV_VGLIST = "vglist"
1585 NV_VMNODES = "vmnodes"
1586
1587 # Instance status
1588 INSTST_RUNNING = "running"
1589 INSTST_ADMINDOWN = "ADMIN_down"
1590 INSTST_ADMINOFFLINE = "ADMIN_offline"
1591 INSTST_NODEOFFLINE = "ERROR_nodeoffline"
1592 INSTST_NODEDOWN = "ERROR_nodedown"
1593 INSTST_WRONGNODE = "ERROR_wrongnode"
1594 INSTST_ERRORUP = "ERROR_up"
1595 INSTST_ERRORDOWN = "ERROR_down"
1596 INSTST_ALL = compat.UniqueFrozenset([
1597   INSTST_RUNNING,
1598   INSTST_ADMINDOWN,
1599   INSTST_ADMINOFFLINE,
1600   INSTST_NODEOFFLINE,
1601   INSTST_NODEDOWN,
1602   INSTST_WRONGNODE,
1603   INSTST_ERRORUP,
1604   INSTST_ERRORDOWN,
1605   ])
1606
1607 # Admin states
1608 ADMINST_UP = "up"
1609 ADMINST_DOWN = "down"
1610 ADMINST_OFFLINE = "offline"
1611 ADMINST_ALL = compat.UniqueFrozenset([
1612   ADMINST_UP,
1613   ADMINST_DOWN,
1614   ADMINST_OFFLINE,
1615   ])
1616
1617 # Node roles
1618 NR_REGULAR = "R"
1619 NR_MASTER = "M"
1620 NR_MCANDIDATE = "C"
1621 NR_DRAINED = "D"
1622 NR_OFFLINE = "O"
1623 NR_ALL = compat.UniqueFrozenset([
1624   NR_REGULAR,
1625   NR_MASTER,
1626   NR_MCANDIDATE,
1627   NR_DRAINED,
1628   NR_OFFLINE,
1629   ])
1630
1631 # SSL certificate check constants (in days)
1632 SSL_CERT_EXPIRATION_WARN = 30
1633 SSL_CERT_EXPIRATION_ERROR = 7
1634
1635 # Allocator framework constants
1636 IALLOCATOR_VERSION = 2
1637 IALLOCATOR_DIR_IN = "in"
1638 IALLOCATOR_DIR_OUT = "out"
1639 VALID_IALLOCATOR_DIRECTIONS = compat.UniqueFrozenset([
1640   IALLOCATOR_DIR_IN,
1641   IALLOCATOR_DIR_OUT,
1642   ])
1643 IALLOCATOR_MODE_ALLOC = "allocate"
1644 IALLOCATOR_MODE_RELOC = "relocate"
1645 IALLOCATOR_MODE_CHG_GROUP = "change-group"
1646 IALLOCATOR_MODE_NODE_EVAC = "node-evacuate"
1647 IALLOCATOR_MODE_MULTI_ALLOC = "multi-allocate"
1648 VALID_IALLOCATOR_MODES = compat.UniqueFrozenset([
1649   IALLOCATOR_MODE_ALLOC,
1650   IALLOCATOR_MODE_RELOC,
1651   IALLOCATOR_MODE_CHG_GROUP,
1652   IALLOCATOR_MODE_NODE_EVAC,
1653   IALLOCATOR_MODE_MULTI_ALLOC,
1654   ])
1655 IALLOCATOR_SEARCH_PATH = _autoconf.IALLOCATOR_SEARCH_PATH
1656 DEFAULT_IALLOCATOR_SHORTCUT = "."
1657
1658 IALLOCATOR_NEVAC_PRI = "primary-only"
1659 IALLOCATOR_NEVAC_SEC = "secondary-only"
1660 IALLOCATOR_NEVAC_ALL = "all"
1661 IALLOCATOR_NEVAC_MODES = compat.UniqueFrozenset([
1662   IALLOCATOR_NEVAC_PRI,
1663   IALLOCATOR_NEVAC_SEC,
1664   IALLOCATOR_NEVAC_ALL,
1665   ])
1666
1667 # Node evacuation
1668 NODE_EVAC_PRI = "primary-only"
1669 NODE_EVAC_SEC = "secondary-only"
1670 NODE_EVAC_ALL = "all"
1671 NODE_EVAC_MODES = compat.UniqueFrozenset([
1672   NODE_EVAC_PRI,
1673   NODE_EVAC_SEC,
1674   NODE_EVAC_ALL,
1675   ])
1676
1677 # Job queue
1678 JOB_QUEUE_VERSION = 1
1679 JOB_QUEUE_SIZE_HARD_LIMIT = 5000
1680
1681 JOB_ID_TEMPLATE = r"\d+"
1682 JOB_FILE_RE = re.compile(r"^job-(%s)$" % JOB_ID_TEMPLATE)
1683
1684 # unchanged job return
1685 JOB_NOTCHANGED = "nochange"
1686
1687 # Job status
1688 JOB_STATUS_QUEUED = "queued"
1689 JOB_STATUS_WAITING = "waiting"
1690 JOB_STATUS_CANCELING = "canceling"
1691 JOB_STATUS_RUNNING = "running"
1692 JOB_STATUS_CANCELED = "canceled"
1693 JOB_STATUS_SUCCESS = "success"
1694 JOB_STATUS_ERROR = "error"
1695 JOBS_PENDING = compat.UniqueFrozenset([
1696   JOB_STATUS_QUEUED,
1697   JOB_STATUS_WAITING,
1698   JOB_STATUS_CANCELING,
1699   ])
1700 JOBS_FINALIZED = compat.UniqueFrozenset([
1701   JOB_STATUS_CANCELED,
1702   JOB_STATUS_SUCCESS,
1703   JOB_STATUS_ERROR,
1704   ])
1705 JOB_STATUS_ALL = compat.UniqueFrozenset([
1706   JOB_STATUS_RUNNING,
1707   ]) | JOBS_PENDING | JOBS_FINALIZED
1708
1709 # OpCode status
1710 # not yet finalized
1711 OP_STATUS_QUEUED = "queued"
1712 OP_STATUS_WAITING = "waiting"
1713 OP_STATUS_CANCELING = "canceling"
1714 OP_STATUS_RUNNING = "running"
1715 # finalized
1716 OP_STATUS_CANCELED = "canceled"
1717 OP_STATUS_SUCCESS = "success"
1718 OP_STATUS_ERROR = "error"
1719 OPS_FINALIZED = compat.UniqueFrozenset([
1720   OP_STATUS_CANCELED,
1721   OP_STATUS_SUCCESS,
1722   OP_STATUS_ERROR,
1723   ])
1724
1725 # OpCode priority
1726 OP_PRIO_LOWEST = +19
1727 OP_PRIO_HIGHEST = -20
1728
1729 OP_PRIO_LOW = +10
1730 OP_PRIO_NORMAL = 0
1731 OP_PRIO_HIGH = -10
1732
1733 OP_PRIO_SUBMIT_VALID = compat.UniqueFrozenset([
1734   OP_PRIO_LOW,
1735   OP_PRIO_NORMAL,
1736   OP_PRIO_HIGH,
1737   ])
1738
1739 OP_PRIO_DEFAULT = OP_PRIO_NORMAL
1740
1741 # Lock recalculate mode
1742 LOCKS_REPLACE = "replace"
1743 LOCKS_APPEND = "append"
1744
1745 # Lock timeout (sum) before we should go into blocking acquire (still
1746 # can be reset by priority change); computed as max time (10 hours)
1747 # before we should actually go into blocking acquire given that we
1748 # start from default priority level; in seconds
1749 # TODO
1750 LOCK_ATTEMPTS_TIMEOUT = 10 * 3600 / (OP_PRIO_DEFAULT - OP_PRIO_HIGHEST)
1751 LOCK_ATTEMPTS_MAXWAIT = 15.0
1752 LOCK_ATTEMPTS_MINWAIT = 1.0
1753
1754 # Execution log types
1755 ELOG_MESSAGE = "message"
1756 ELOG_REMOTE_IMPORT = "remote-import"
1757 ELOG_JQUEUE_TEST = "jqueue-test"
1758
1759 # /etc/hosts modification
1760 ETC_HOSTS_ADD = "add"
1761 ETC_HOSTS_REMOVE = "remove"
1762
1763 # Job queue test
1764 JQT_MSGPREFIX = "TESTMSG="
1765 JQT_EXPANDNAMES = "expandnames"
1766 JQT_EXEC = "exec"
1767 JQT_LOGMSG = "logmsg"
1768 JQT_STARTMSG = "startmsg"
1769 JQT_ALL = compat.UniqueFrozenset([
1770   JQT_EXPANDNAMES,
1771   JQT_EXEC,
1772   JQT_LOGMSG,
1773   JQT_STARTMSG,
1774   ])
1775
1776 # Query resources
1777 QR_CLUSTER = "cluster"
1778 QR_INSTANCE = "instance"
1779 QR_NODE = "node"
1780 QR_LOCK = "lock"
1781 QR_GROUP = "group"
1782 QR_OS = "os"
1783 QR_JOB = "job"
1784 QR_EXPORT = "export"
1785 QR_NETWORK = "network"
1786 QR_EXTSTORAGE = "extstorage"
1787
1788 #: List of resources which can be queried using L{opcodes.OpQuery}
1789 QR_VIA_OP = compat.UniqueFrozenset([
1790   QR_CLUSTER,
1791   QR_INSTANCE,
1792   QR_NODE,
1793   QR_GROUP,
1794   QR_OS,
1795   QR_EXPORT,
1796   QR_NETWORK,
1797   QR_EXTSTORAGE,
1798   ])
1799
1800 #: List of resources which can be queried using Local UniX Interface
1801 QR_VIA_LUXI = QR_VIA_OP.union([
1802   QR_LOCK,
1803   QR_JOB,
1804   ])
1805
1806 #: List of resources which can be queried using RAPI
1807 QR_VIA_RAPI = QR_VIA_LUXI
1808
1809 # Query field types
1810 QFT_UNKNOWN = "unknown"
1811 QFT_TEXT = "text"
1812 QFT_BOOL = "bool"
1813 QFT_NUMBER = "number"
1814 QFT_UNIT = "unit"
1815 QFT_TIMESTAMP = "timestamp"
1816 QFT_OTHER = "other"
1817
1818 #: All query field types
1819 QFT_ALL = compat.UniqueFrozenset([
1820   QFT_UNKNOWN,
1821   QFT_TEXT,
1822   QFT_BOOL,
1823   QFT_NUMBER,
1824   QFT_UNIT,
1825   QFT_TIMESTAMP,
1826   QFT_OTHER,
1827   ])
1828
1829 # Query result field status (don't change or reuse values as they're used by
1830 # clients)
1831 #: Normal field status
1832 RS_NORMAL = 0
1833 #: Unknown field
1834 RS_UNKNOWN = 1
1835 #: No data (e.g. RPC error), can be used instead of L{RS_OFFLINE}
1836 RS_NODATA = 2
1837 #: Value unavailable/unsupported for item; if this field is supported
1838 #: but we cannot get the data for the moment, RS_NODATA or
1839 #: RS_OFFLINE should be used
1840 RS_UNAVAIL = 3
1841 #: Resource marked offline
1842 RS_OFFLINE = 4
1843
1844 RS_ALL = compat.UniqueFrozenset([
1845   RS_NORMAL,
1846   RS_UNKNOWN,
1847   RS_NODATA,
1848   RS_UNAVAIL,
1849   RS_OFFLINE,
1850   ])
1851
1852 #: Dictionary with special field cases and their verbose/terse formatting
1853 RSS_DESCRIPTION = {
1854   RS_UNKNOWN: ("(unknown)", "??"),
1855   RS_NODATA: ("(nodata)", "?"),
1856   RS_OFFLINE: ("(offline)", "*"),
1857   RS_UNAVAIL: ("(unavail)", "-"),
1858   }
1859
1860 # max dynamic devices
1861 MAX_NICS = 8
1862 MAX_DISKS = 16
1863
1864 # SSCONF file prefix
1865 SSCONF_FILEPREFIX = "ssconf_"
1866 # SSCONF keys
1867 SS_CLUSTER_NAME = "cluster_name"
1868 SS_CLUSTER_TAGS = "cluster_tags"
1869 SS_FILE_STORAGE_DIR = "file_storage_dir"
1870 SS_SHARED_FILE_STORAGE_DIR = "shared_file_storage_dir"
1871 SS_MASTER_CANDIDATES = "master_candidates"
1872 SS_MASTER_CANDIDATES_IPS = "master_candidates_ips"
1873 SS_MASTER_IP = "master_ip"
1874 SS_MASTER_NETDEV = "master_netdev"
1875 SS_MASTER_NETMASK = "master_netmask"
1876 SS_MASTER_NODE = "master_node"
1877 SS_NODE_LIST = "node_list"
1878 SS_NODE_PRIMARY_IPS = "node_primary_ips"
1879 SS_NODE_SECONDARY_IPS = "node_secondary_ips"
1880 SS_OFFLINE_NODES = "offline_nodes"
1881 SS_ONLINE_NODES = "online_nodes"
1882 SS_PRIMARY_IP_FAMILY = "primary_ip_family"
1883 SS_INSTANCE_LIST = "instance_list"
1884 SS_RELEASE_VERSION = "release_version"
1885 SS_HYPERVISOR_LIST = "hypervisor_list"
1886 SS_MAINTAIN_NODE_HEALTH = "maintain_node_health"
1887 SS_UID_POOL = "uid_pool"
1888 SS_NODEGROUPS = "nodegroups"
1889 SS_NETWORKS = "networks"
1890
1891 SS_FILE_PERMS = 0444
1892
1893 # cluster wide default parameters
1894 DEFAULT_ENABLED_HYPERVISOR = HT_XEN_PVM
1895
1896 HVC_DEFAULTS = {
1897   HT_XEN_PVM: {
1898     HV_USE_BOOTLOADER: False,
1899     HV_BOOTLOADER_PATH: XEN_BOOTLOADER,
1900     HV_BOOTLOADER_ARGS: "",
1901     HV_KERNEL_PATH: XEN_KERNEL,
1902     HV_INITRD_PATH: "",
1903     HV_ROOT_PATH: "/dev/sda1",
1904     HV_KERNEL_ARGS: "ro",
1905     HV_MIGRATION_PORT: 8002,
1906     HV_MIGRATION_MODE: HT_MIGRATION_LIVE,
1907     HV_BLOCKDEV_PREFIX: "sd",
1908     HV_REBOOT_BEHAVIOR: INSTANCE_REBOOT_ALLOWED,
1909     HV_CPU_MASK: CPU_PINNING_ALL,
1910     HV_CPU_CAP: 0,
1911     HV_CPU_WEIGHT: 256,
1912     },
1913   HT_XEN_HVM: {
1914     HV_BOOT_ORDER: "cd",
1915     HV_CDROM_IMAGE_PATH: "",
1916     HV_NIC_TYPE: HT_NIC_RTL8139,
1917     HV_DISK_TYPE: HT_DISK_PARAVIRTUAL,
1918     HV_VNC_BIND_ADDRESS: IP4_ADDRESS_ANY,
1919     HV_VNC_PASSWORD_FILE: pathutils.VNC_PASSWORD_FILE,
1920     HV_ACPI: True,
1921     HV_PAE: True,
1922     HV_KERNEL_PATH: "/usr/lib/xen/boot/hvmloader",
1923     HV_DEVICE_MODEL: "/usr/lib/xen/bin/qemu-dm",
1924     HV_MIGRATION_PORT: 8002,
1925     HV_MIGRATION_MODE: HT_MIGRATION_NONLIVE,
1926     HV_USE_LOCALTIME: False,
1927     HV_BLOCKDEV_PREFIX: "hd",
1928     HV_PASSTHROUGH: "",
1929     HV_REBOOT_BEHAVIOR: INSTANCE_REBOOT_ALLOWED,
1930     HV_CPU_MASK: CPU_PINNING_ALL,
1931     HV_CPU_CAP: 0,
1932     HV_CPU_WEIGHT: 256,
1933     },
1934   HT_KVM: {
1935     HV_KVM_PATH: KVM_PATH,
1936     HV_KERNEL_PATH: KVM_KERNEL,
1937     HV_INITRD_PATH: "",
1938     HV_KERNEL_ARGS: "ro",
1939     HV_ROOT_PATH: "/dev/vda1",
1940     HV_ACPI: True,
1941     HV_SERIAL_CONSOLE: True,
1942     HV_SERIAL_SPEED: 38400,
1943     HV_VNC_BIND_ADDRESS: "",
1944     HV_VNC_TLS: False,
1945     HV_VNC_X509: "",
1946     HV_VNC_X509_VERIFY: False,
1947     HV_VNC_PASSWORD_FILE: "",
1948     HV_KVM_SPICE_BIND: "",
1949     HV_KVM_SPICE_IP_VERSION: IFACE_NO_IP_VERSION_SPECIFIED,
1950     HV_KVM_SPICE_PASSWORD_FILE: "",
1951     HV_KVM_SPICE_LOSSLESS_IMG_COMPR: "",
1952     HV_KVM_SPICE_JPEG_IMG_COMPR: "",
1953     HV_KVM_SPICE_ZLIB_GLZ_IMG_COMPR: "",
1954     HV_KVM_SPICE_STREAMING_VIDEO_DETECTION: "",
1955     HV_KVM_SPICE_AUDIO_COMPR: True,
1956     HV_KVM_SPICE_USE_TLS: False,
1957     HV_KVM_SPICE_TLS_CIPHERS: OPENSSL_CIPHERS,
1958     HV_KVM_SPICE_USE_VDAGENT: True,
1959     HV_KVM_FLOPPY_IMAGE_PATH: "",
1960     HV_CDROM_IMAGE_PATH: "",
1961     HV_KVM_CDROM2_IMAGE_PATH: "",
1962     HV_BOOT_ORDER: HT_BO_DISK,
1963     HV_NIC_TYPE: HT_NIC_PARAVIRTUAL,
1964     HV_DISK_TYPE: HT_DISK_PARAVIRTUAL,
1965     HV_KVM_CDROM_DISK_TYPE: "",
1966     HV_USB_MOUSE: "",
1967     HV_KEYMAP: "",
1968     HV_MIGRATION_PORT: 8102,
1969     HV_MIGRATION_BANDWIDTH: 32, # MiB/s
1970     HV_MIGRATION_DOWNTIME: 30,  # ms
1971     HV_MIGRATION_MODE: HT_MIGRATION_LIVE,
1972     HV_USE_LOCALTIME: False,
1973     HV_DISK_CACHE: HT_CACHE_DEFAULT,
1974     HV_SECURITY_MODEL: HT_SM_NONE,
1975     HV_SECURITY_DOMAIN: "",
1976     HV_KVM_FLAG: "",
1977     HV_VHOST_NET: False,
1978     HV_KVM_USE_CHROOT: False,
1979     HV_MEM_PATH: "",
1980     HV_REBOOT_BEHAVIOR: INSTANCE_REBOOT_ALLOWED,
1981     HV_CPU_MASK: CPU_PINNING_ALL,
1982     HV_CPU_TYPE: "",
1983     HV_CPU_CORES: 0,
1984     HV_CPU_THREADS: 0,
1985     HV_CPU_SOCKETS: 0,
1986     HV_SOUNDHW: "",
1987     HV_USB_DEVICES: "",
1988     HV_VGA: "",
1989     HV_KVM_EXTRA: "",
1990     HV_KVM_MACHINE_VERSION: "",
1991     },
1992   HT_FAKE: {},
1993   HT_CHROOT: {
1994     HV_INIT_SCRIPT: "/ganeti-chroot",
1995     },
1996   HT_LXC: {
1997     HV_CPU_MASK: "",
1998     },
1999   }
2000
2001 HVC_GLOBALS = compat.UniqueFrozenset([
2002   HV_MIGRATION_PORT,
2003   HV_MIGRATION_BANDWIDTH,
2004   HV_MIGRATION_MODE,
2005   ])
2006
2007 BEC_DEFAULTS = {
2008   BE_MINMEM: 128,
2009   BE_MAXMEM: 128,
2010   BE_VCPUS: 1,
2011   BE_AUTO_BALANCE: True,
2012   BE_ALWAYS_FAILOVER: False,
2013   BE_SPINDLE_USE: 1,
2014   }
2015
2016 NDC_DEFAULTS = {
2017   ND_OOB_PROGRAM: "",
2018   ND_SPINDLE_COUNT: 1,
2019   ND_EXCLUSIVE_STORAGE: False,
2020   }
2021
2022 DISK_LD_DEFAULTS = {
2023   LD_DRBD8: {
2024     LDP_RESYNC_RATE: CLASSIC_DRBD_SYNC_SPEED,
2025     LDP_BARRIERS: _autoconf.DRBD_BARRIERS,
2026     LDP_NO_META_FLUSH: _autoconf.DRBD_NO_META_FLUSH,
2027     LDP_DEFAULT_METAVG: DEFAULT_VG,
2028     LDP_DISK_CUSTOM: "",
2029     LDP_NET_CUSTOM: "",
2030     LDP_DYNAMIC_RESYNC: False,
2031
2032     # The default values for the DRBD dynamic resync speed algorithm are taken
2033     # from the drbsetup 8.3.11 man page, except for c-plan-ahead (that we
2034     # don't need to set to 0, because we have a separate option to enable it)
2035     # and for c-max-rate, that we cap to the default value for the static resync
2036     # rate.
2037     LDP_PLAN_AHEAD: 20, # ds
2038     LDP_FILL_TARGET: 0, # sectors
2039     LDP_DELAY_TARGET: 1, # ds
2040     LDP_MAX_RATE: CLASSIC_DRBD_SYNC_SPEED, # KiB/s
2041     LDP_MIN_RATE: 4 * 1024, # KiB/s
2042     },
2043   LD_LV: {
2044     LDP_STRIPES: _autoconf.LVM_STRIPECOUNT
2045     },
2046   LD_FILE: {},
2047   LD_BLOCKDEV: {},
2048   LD_RBD: {
2049     LDP_POOL: "rbd"
2050     },
2051   LD_EXT: {},
2052   }
2053
2054 # readability shortcuts
2055 _LV_DEFAULTS = DISK_LD_DEFAULTS[LD_LV]
2056 _DRBD_DEFAULTS = DISK_LD_DEFAULTS[LD_DRBD8]
2057
2058 DISK_DT_DEFAULTS = {
2059   DT_PLAIN: {
2060     LV_STRIPES: DISK_LD_DEFAULTS[LD_LV][LDP_STRIPES],
2061     },
2062   DT_DRBD8: {
2063     DRBD_RESYNC_RATE: _DRBD_DEFAULTS[LDP_RESYNC_RATE],
2064     DRBD_DATA_STRIPES: _LV_DEFAULTS[LDP_STRIPES],
2065     DRBD_META_STRIPES: _LV_DEFAULTS[LDP_STRIPES],
2066     DRBD_DISK_BARRIERS: _DRBD_DEFAULTS[LDP_BARRIERS],
2067     DRBD_META_BARRIERS: _DRBD_DEFAULTS[LDP_NO_META_FLUSH],
2068     DRBD_DEFAULT_METAVG: _DRBD_DEFAULTS[LDP_DEFAULT_METAVG],
2069     DRBD_DISK_CUSTOM: _DRBD_DEFAULTS[LDP_DISK_CUSTOM],
2070     DRBD_NET_CUSTOM: _DRBD_DEFAULTS[LDP_NET_CUSTOM],
2071     DRBD_DYNAMIC_RESYNC: _DRBD_DEFAULTS[LDP_DYNAMIC_RESYNC],
2072     DRBD_PLAN_AHEAD: _DRBD_DEFAULTS[LDP_PLAN_AHEAD],
2073     DRBD_FILL_TARGET: _DRBD_DEFAULTS[LDP_FILL_TARGET],
2074     DRBD_DELAY_TARGET: _DRBD_DEFAULTS[LDP_DELAY_TARGET],
2075     DRBD_MAX_RATE: _DRBD_DEFAULTS[LDP_MAX_RATE],
2076     DRBD_MIN_RATE: _DRBD_DEFAULTS[LDP_MIN_RATE],
2077     },
2078   DT_DISKLESS: {},
2079   DT_FILE: {},
2080   DT_SHARED_FILE: {},
2081   DT_BLOCK: {},
2082   DT_RBD: {
2083     RBD_POOL: DISK_LD_DEFAULTS[LD_RBD][LDP_POOL]
2084     },
2085   DT_EXT: {},
2086   }
2087
2088 # we don't want to export the shortcuts
2089 del _LV_DEFAULTS, _DRBD_DEFAULTS
2090
2091 NICC_DEFAULTS = {
2092   NIC_MODE: NIC_MODE_BRIDGED,
2093   NIC_LINK: DEFAULT_BRIDGE,
2094   }
2095
2096 # All of the following values are quite arbitrarily - there are no
2097 # "good" defaults, these must be customised per-site
2098 IPOLICY_DEFAULTS = {
2099   ISPECS_MIN: {
2100     ISPEC_MEM_SIZE: 128,
2101     ISPEC_CPU_COUNT: 1,
2102     ISPEC_DISK_COUNT: 1,
2103     ISPEC_DISK_SIZE: 1024,
2104     ISPEC_NIC_COUNT: 1,
2105     ISPEC_SPINDLE_USE: 1,
2106     },
2107   ISPECS_MAX: {
2108     ISPEC_MEM_SIZE: 32768,
2109     ISPEC_CPU_COUNT: 8,
2110     ISPEC_DISK_COUNT: MAX_DISKS,
2111     ISPEC_DISK_SIZE: 1024 * 1024,
2112     ISPEC_NIC_COUNT: MAX_NICS,
2113     ISPEC_SPINDLE_USE: 12,
2114     },
2115   ISPECS_STD: {
2116     ISPEC_MEM_SIZE: 128,
2117     ISPEC_CPU_COUNT: 1,
2118     ISPEC_DISK_COUNT: 1,
2119     ISPEC_DISK_SIZE: 1024,
2120     ISPEC_NIC_COUNT: 1,
2121     ISPEC_SPINDLE_USE: 1,
2122     },
2123   IPOLICY_DTS: DISK_TEMPLATES,
2124   IPOLICY_VCPU_RATIO: 4.0,
2125   IPOLICY_SPINDLE_RATIO: 32.0,
2126   }
2127
2128 MASTER_POOL_SIZE_DEFAULT = 10
2129
2130 # Exclusive storage:
2131 # Error margin used to compare physical disks
2132 PART_MARGIN = .01
2133 # Space reserved when creating instance disks
2134 PART_RESERVED = .02
2135
2136 CONFD_PROTOCOL_VERSION = 1
2137
2138 CONFD_REQ_PING = 0
2139 CONFD_REQ_NODE_ROLE_BYNAME = 1
2140 CONFD_REQ_NODE_PIP_BY_INSTANCE_IP = 2
2141 CONFD_REQ_CLUSTER_MASTER = 3
2142 CONFD_REQ_NODE_PIP_LIST = 4
2143 CONFD_REQ_MC_PIP_LIST = 5
2144 CONFD_REQ_INSTANCES_IPS_LIST = 6
2145 CONFD_REQ_NODE_DRBD = 7
2146
2147 # Confd request query fields. These are used to narrow down queries.
2148 # These must be strings rather than integers, because json-encoding
2149 # converts them to strings anyway, as they're used as dict-keys.
2150 CONFD_REQQ_LINK = "0"
2151 CONFD_REQQ_IP = "1"
2152 CONFD_REQQ_IPLIST = "2"
2153 CONFD_REQQ_FIELDS = "3"
2154
2155 CONFD_REQFIELD_NAME = "0"
2156 CONFD_REQFIELD_IP = "1"
2157 CONFD_REQFIELD_MNODE_PIP = "2"
2158
2159 CONFD_REQS = compat.UniqueFrozenset([
2160   CONFD_REQ_PING,
2161   CONFD_REQ_NODE_ROLE_BYNAME,
2162   CONFD_REQ_NODE_PIP_BY_INSTANCE_IP,
2163   CONFD_REQ_CLUSTER_MASTER,
2164   CONFD_REQ_NODE_PIP_LIST,
2165   CONFD_REQ_MC_PIP_LIST,
2166   CONFD_REQ_INSTANCES_IPS_LIST,
2167   CONFD_REQ_NODE_DRBD,
2168   ])
2169
2170 CONFD_REPL_STATUS_OK = 0
2171 CONFD_REPL_STATUS_ERROR = 1
2172 CONFD_REPL_STATUS_NOTIMPLEMENTED = 2
2173
2174 CONFD_REPL_STATUSES = compat.UniqueFrozenset([
2175   CONFD_REPL_STATUS_OK,
2176   CONFD_REPL_STATUS_ERROR,
2177   CONFD_REPL_STATUS_NOTIMPLEMENTED,
2178   ])
2179
2180 (CONFD_NODE_ROLE_MASTER,
2181  CONFD_NODE_ROLE_CANDIDATE,
2182  CONFD_NODE_ROLE_OFFLINE,
2183  CONFD_NODE_ROLE_DRAINED,
2184  CONFD_NODE_ROLE_REGULAR,
2185  ) = range(5)
2186
2187 # A few common errors for confd
2188 CONFD_ERROR_UNKNOWN_ENTRY = 1
2189 CONFD_ERROR_INTERNAL = 2
2190 CONFD_ERROR_ARGUMENT = 3
2191
2192 # Each request is "salted" by the current timestamp.
2193 # This constants decides how many seconds of skew to accept.
2194 # TODO: make this a default and allow the value to be more configurable
2195 CONFD_MAX_CLOCK_SKEW = 2 * NODE_MAX_CLOCK_SKEW
2196
2197 # When we haven't reloaded the config for more than this amount of
2198 # seconds, we force a test to see if inotify is betraying us. Using a
2199 # prime number to ensure we get less chance of 'same wakeup' with
2200 # other processes.
2201 CONFD_CONFIG_RELOAD_TIMEOUT = 17
2202
2203 # If we receive more than one update in this amount of microseconds,
2204 # we move to polling every RATELIMIT seconds, rather than relying on
2205 # inotify, to be able to serve more requests.
2206 CONFD_CONFIG_RELOAD_RATELIMIT = 250000
2207
2208 # Magic number prepended to all confd queries.
2209 # This allows us to distinguish different types of confd protocols and handle
2210 # them. For example by changing this we can move the whole payload to be
2211 # compressed, or move away from json.
2212 CONFD_MAGIC_FOURCC = "plj0"
2213
2214 # By default a confd request is sent to the minimum between this number and all
2215 # MCs. 6 was chosen because even in the case of a disastrous 50% response rate,
2216 # we should have enough answers to be able to compare more than one.
2217 CONFD_DEFAULT_REQ_COVERAGE = 6
2218
2219 # Timeout in seconds to expire pending query request in the confd client
2220 # library. We don't actually expect any answer more than 10 seconds after we
2221 # sent a request.
2222 CONFD_CLIENT_EXPIRE_TIMEOUT = 10
2223
2224 # Maximum UDP datagram size.
2225 # On IPv4: 64K - 20 (ip header size) - 8 (udp header size) = 65507
2226 # On IPv6: 64K - 40 (ip6 header size) - 8 (udp header size) = 65487
2227 #   (assuming we can't use jumbo frames)
2228 # We just set this to 60K, which should be enough
2229 MAX_UDP_DATA_SIZE = 61440
2230
2231 # User-id pool minimum/maximum acceptable user-ids.
2232 UIDPOOL_UID_MIN = 0
2233 UIDPOOL_UID_MAX = 2 ** 32 - 1 # Assuming 32 bit user-ids
2234
2235 # Name or path of the pgrep command
2236 PGREP = "pgrep"
2237
2238 # Name of the node group that gets created at cluster init or upgrade
2239 INITIAL_NODE_GROUP_NAME = "default"
2240
2241 # Possible values for NodeGroup.alloc_policy
2242 ALLOC_POLICY_PREFERRED = "preferred"
2243 ALLOC_POLICY_LAST_RESORT = "last_resort"
2244 ALLOC_POLICY_UNALLOCABLE = "unallocable"
2245 VALID_ALLOC_POLICIES = [
2246   ALLOC_POLICY_PREFERRED,
2247   ALLOC_POLICY_LAST_RESORT,
2248   ALLOC_POLICY_UNALLOCABLE,
2249   ]
2250
2251 # Temporary external/shared storage parameters
2252 BLOCKDEV_DRIVER_MANUAL = "manual"
2253
2254 # qemu-img path, required for ovfconverter
2255 QEMUIMG_PATH = _autoconf.QEMUIMG_PATH
2256
2257 # Whether htools was enabled at compilation time
2258 HTOOLS = _autoconf.HTOOLS
2259 # The hail iallocator
2260 IALLOC_HAIL = "hail"
2261
2262 # Fake opcodes for functions that have hooks attached to them via
2263 # backend.RunLocalHooks
2264 FAKE_OP_MASTER_TURNUP = "OP_CLUSTER_IP_TURNUP"
2265 FAKE_OP_MASTER_TURNDOWN = "OP_CLUSTER_IP_TURNDOWN"
2266
2267 # SSH key types
2268 SSHK_RSA = "rsa"
2269 SSHK_DSA = "dsa"
2270 SSHK_ALL = compat.UniqueFrozenset([SSHK_RSA, SSHK_DSA])
2271
2272 # SSH authorized key types
2273 SSHAK_RSA = "ssh-rsa"
2274 SSHAK_DSS = "ssh-dss"
2275 SSHAK_ALL = compat.UniqueFrozenset([SSHAK_RSA, SSHAK_DSS])
2276
2277 # SSH setup
2278 SSHS_CLUSTER_NAME = "cluster_name"
2279 SSHS_SSH_HOST_KEY = "ssh_host_key"
2280 SSHS_SSH_ROOT_KEY = "ssh_root_key"
2281 SSHS_NODE_DAEMON_CERTIFICATE = "node_daemon_certificate"
2282
2283 #: Key files for SSH daemon
2284 SSH_DAEMON_KEYFILES = {
2285   SSHK_RSA: (pathutils.SSH_HOST_RSA_PRIV, pathutils.SSH_HOST_RSA_PUB),
2286   SSHK_DSA: (pathutils.SSH_HOST_DSA_PRIV, pathutils.SSH_HOST_DSA_PUB),
2287   }
2288
2289 # Node daemon setup
2290 NDS_CLUSTER_NAME = "cluster_name"
2291 NDS_NODE_DAEMON_CERTIFICATE = "node_daemon_certificate"
2292 NDS_SSCONF = "ssconf"
2293 NDS_START_NODE_DAEMON = "start_node_daemon"
2294
2295 # Path generating random UUID
2296 RANDOM_UUID_FILE = "/proc/sys/kernel/random/uuid"
2297
2298 # Regex string for verifying a UUID
2299 UUID_REGEX = "^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$"
2300
2301 # Auto-repair tag prefixes
2302 AUTO_REPAIR_TAG_PREFIX = "ganeti:watcher:autorepair:"
2303 AUTO_REPAIR_TAG_ENABLED = AUTO_REPAIR_TAG_PREFIX
2304 AUTO_REPAIR_TAG_SUSPENDED = AUTO_REPAIR_TAG_ENABLED + "suspend:"
2305 AUTO_REPAIR_TAG_PENDING = AUTO_REPAIR_TAG_PREFIX + "pending:"
2306 AUTO_REPAIR_TAG_RESULT = AUTO_REPAIR_TAG_PREFIX + "result:"
2307
2308 # Auto-repair levels
2309 AUTO_REPAIR_FIX_STORAGE = "fix-storage"
2310 AUTO_REPAIR_MIGRATE = "migrate"
2311 AUTO_REPAIR_FAILOVER = "failover"
2312 AUTO_REPAIR_REINSTALL = "reinstall"
2313 AUTO_REPAIR_ALL_TYPES = [
2314   AUTO_REPAIR_FIX_STORAGE,
2315   AUTO_REPAIR_MIGRATE,
2316   AUTO_REPAIR_FAILOVER,
2317   AUTO_REPAIR_REINSTALL,
2318 ]
2319
2320 # Auto-repair results
2321 AUTO_REPAIR_SUCCESS = "success"
2322 AUTO_REPAIR_FAILURE = "failure"
2323 AUTO_REPAIR_ENOPERM = "enoperm"
2324 AUTO_REPAIR_ALL_RESULTS = frozenset([
2325     AUTO_REPAIR_SUCCESS,
2326     AUTO_REPAIR_FAILURE,
2327     AUTO_REPAIR_ENOPERM,
2328 ])
2329
2330 # The version identifier for builtin data collectors
2331 BUILTIN_DATA_COLLECTOR_VERSION = "B"
2332
2333 # Do not re-export imported modules
2334 del re, _vcsversion, _autoconf, socket, pathutils, compat