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