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