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