Package ganeti :: Module constants
[hide private]
[frames] | no frames]

Source Code for Module ganeti.constants

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