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