constants.py 65.9 KB
Newer Older
Iustin Pop's avatar
Iustin Pop committed
1
#
Iustin Pop's avatar
Iustin Pop committed
2 3
#

Iustin Pop's avatar
Iustin Pop committed
4
# Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 Google Inc.
Iustin Pop's avatar
Iustin Pop committed
5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
# 02110-1301, USA.


"""Module holding different constants."""

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

Iustin Pop's avatar
Iustin Pop committed
33
# various versions
34
RELEASE_VERSION = _autoconf.PACKAGE_VERSION
Guido Trotter's avatar
Guido Trotter committed
35 36
OS_API_V10 = 10
OS_API_V15 = 15
37
OS_API_V20 = 20
38 39 40 41 42
OS_API_VERSIONS = compat.UniqueFrozenset([
  OS_API_V10,
  OS_API_V15,
  OS_API_V20,
  ])
43
VCS_VERSION = _vcsversion.VCS_VERSION
Iustin Pop's avatar
Iustin Pop committed
44
EXPORT_VERSION = 0
45
RAPI_VERSION = 2
Iustin Pop's avatar
Iustin Pop committed
46

47

48 49 50 51 52 53 54
# Format for CONFIG_VERSION:
#   01 03 0123 = 01030123
#   ^^ ^^ ^^^^
#   |  |  + Configuration version/revision
#   |  + Minor version
#   + Major version
#
55
# It is stored as an integer. Make sure not to write an octal number.
56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89

# BuildVersion and SplitVersion must be in here because we can't import other
# modules. The cfgupgrade tool must be able to read and write version numbers
# and thus requires these functions. To avoid code duplication, they're kept in
# here.

def BuildVersion(major, minor, revision):
  """Calculates int version number from major, minor and revision numbers.

  Returns: int representing version number

  """
  assert isinstance(major, int)
  assert isinstance(minor, int)
  assert isinstance(revision, int)
  return (1000000 * major +
            10000 * minor +
                1 * revision)


def SplitVersion(version):
  """Splits version number stored in an int.

  Returns: tuple; (major, minor, revision)

  """
  assert isinstance(version, int)

  (major, remainder) = divmod(version, 1000000)
  (minor, revision) = divmod(remainder, 10000)

  return (major, minor, revision)


90 91 92
CONFIG_MAJOR = int(_autoconf.VERSION_MAJOR)
CONFIG_MINOR = int(_autoconf.VERSION_MINOR)
CONFIG_REVISION = 0
93
CONFIG_VERSION = BuildVersion(CONFIG_MAJOR, CONFIG_MINOR, CONFIG_REVISION)
Iustin Pop's avatar
Iustin Pop committed
94

95 96 97
#: RPC protocol version
PROTOCOL_VERSION = BuildVersion(CONFIG_MAJOR, CONFIG_MINOR, 0)

98 99
# user separation
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 105 106
RAPI_GROUP = _autoconf.RAPI_GROUP
CONFD_USER = _autoconf.CONFD_USER
CONFD_GROUP = _autoconf.CONFD_GROUP
Thomas Thrainer's avatar
Thomas Thrainer committed
107 108
LUXID_USER = _autoconf.LUXID_USER
LUXID_GROUP = _autoconf.LUXID_GROUP
109
NODED_USER = _autoconf.NODED_USER
René Nussbaumer's avatar
René Nussbaumer committed
110
NODED_GROUP = _autoconf.NODED_GROUP
111 112
MOND_USER = _autoconf.MOND_USER
MOND_GROUP = _autoconf.MOND_GROUP
Michael Hanselmann's avatar
Michael Hanselmann committed
113 114
SSH_LOGIN_USER = _autoconf.SSH_LOGIN_USER
SSH_CONSOLE_USER = _autoconf.SSH_CONSOLE_USER
115

Tsachy Shacham's avatar
Tsachy Shacham committed
116 117 118 119 120
# cpu pinning separators and constants
CPU_PINNING_SEP = ":"
CPU_PINNING_ALL = "all"
# internal representation of "all"
CPU_PINNING_ALL_VAL = -1
121 122
# one "all" entry in a CPU list means CPU pinning is off
CPU_PINNING_OFF = [CPU_PINNING_ALL_VAL]
Tsachy Shacham's avatar
Tsachy Shacham committed
123 124 125 126 127 128 129 130 131

# A Xen-specific implementation detail - there is no way to actually say
# "use any cpu for pinning" in a Xen configuration file, as opposed to the
# command line, where you can say "xm vcpu-pin <domain> <vcpu> all".
# The workaround used in Xen is "0-63" (see source code function
# xm_vcpu_pin in <xen-source>/tools/python/xen/xm/main.py).
# To support future changes, the following constant is treated as a
# blackbox string that simply means use-any-cpu-for-pinning-under-xen.
CPU_PINNING_ALL_XEN = "0-63"
132

133 134 135
# A KVM-specific implementation detail - the following value is used
# to set CPU affinity to all processors (#0 through #31), per taskset
# man page.
136
# FIXME: This only works for machines with up to 32 CPU cores
137 138
CPU_PINNING_ALL_KVM = 0xFFFFFFFF

139
# Wipe
140
DD_CMD = "dd"
141 142 143
MAX_WIPE_CHUNK = 1024 # 1GB
MIN_WIPE_CHUNK_PERCENT = 10

144
RUN_DIRS_MODE = 0775
145
SECURE_DIR_MODE = 0700
146
SECURE_FILE_MODE = 0600
147
ADOPTABLE_BLOCKDEV_ROOT = "/dev/disk/"
148
ENABLE_SHARED_FILE_STORAGE = _autoconf.ENABLE_SHARED_FILE_STORAGE
149
ENABLE_CONFD = _autoconf.ENABLE_CONFD
150
ENABLE_MOND = _autoconf.ENABLE_MOND
151
ENABLE_SPLIT_QUERY = _autoconf.ENABLE_SPLIT_QUERY
152
ENABLE_RESTRICTED_COMMANDS = _autoconf.ENABLE_RESTRICTED_COMMANDS
153

154 155 156 157
# SSH constants
SSH = "ssh"
SCP = "scp"

158
NODED = "ganeti-noded"
Guido Trotter's avatar
Guido Trotter committed
159
CONFD = "ganeti-confd"
Thomas Thrainer's avatar
Thomas Thrainer committed
160
LUXID = "ganeti-luxid"
Guido Trotter's avatar
Guido Trotter committed
161
RAPI = "ganeti-rapi"
162
MASTERD = "ganeti-masterd"
163
MOND = "ganeti-mond"
164

165 166 167
DAEMONS = compat.UniqueFrozenset([
  NODED,
  CONFD,
Thomas Thrainer's avatar
Thomas Thrainer committed
168
  LUXID,
169 170
  RAPI,
  MASTERD,
171
  MOND,
172 173
  ])

174 175 176
DAEMONS_PORTS = {
  # daemon-name: ("proto", "default-port")
  NODED: ("tcp", 1811),
Guido Trotter's avatar
Guido Trotter committed
177
  CONFD: ("udp", 1814),
178
  MOND: ("tcp", 1815),
Guido Trotter's avatar
Guido Trotter committed
179
  RAPI: ("tcp", 5080),
180
  SSH: ("tcp", 22),
181
}
182

183
DEFAULT_NODED_PORT = DAEMONS_PORTS[NODED][1]
Guido Trotter's avatar
Guido Trotter committed
184
DEFAULT_CONFD_PORT = DAEMONS_PORTS[CONFD][1]
185
DEFAULT_MOND_PORT = DAEMONS_PORTS[MOND][1]
Guido Trotter's avatar
Guido Trotter committed
186
DEFAULT_RAPI_PORT = DAEMONS_PORTS[RAPI][1]
187

Iustin Pop's avatar
Iustin Pop committed
188 189 190
FIRST_DRBD_PORT = 11000
LAST_DRBD_PORT = 14999

191 192 193
DAEMONS_LOGBASE = {
  NODED: "node-daemon",
  CONFD: "conf-daemon",
194
  LUXID: "luxi-daemon",
195 196
  RAPI: "rapi-daemon",
  MASTERD: "master-daemon",
197
  MOND: "monitoring-daemon",
198 199
  }

200 201 202 203
DAEMONS_LOGFILES = \
    dict((daemon, pathutils.GetLogFilename(DAEMONS_LOGBASE[daemon]))
         for daemon in DAEMONS_LOGBASE)

204
# Some daemons might require more than one logfile.
205 206
# Specifically, right now only the Haskell http library "snap", used by the
# monitoring daemon, requires multiple log files.
207 208 209 210 211 212 213 214 215 216 217

# These are the only valid reasons for having an extra logfile
EXTRA_LOGREASON_ACCESS = "access"
EXTRA_LOGREASON_ERROR = "error"

VALID_EXTRA_LOGREASONS = compat.UniqueFrozenset([
  EXTRA_LOGREASON_ACCESS,
  EXTRA_LOGREASON_ERROR,
  ])

# These are the extra logfiles, grouped by daemon
218 219 220 221 222 223
DAEMONS_EXTRA_LOGBASE = {
  MOND: {
    EXTRA_LOGREASON_ACCESS: "monitoring-daemon-access",
    EXTRA_LOGREASON_ERROR: "monitoring-daemon-error",
    }
  }
224 225 226 227 228 229 230

DAEMONS_EXTRA_LOGFILES = \
  dict((daemon, dict((extra,
       pathutils.GetLogFilename(DAEMONS_EXTRA_LOGBASE[daemon][extra]))
       for extra in DAEMONS_EXTRA_LOGBASE[daemon]))
         for daemon in DAEMONS_EXTRA_LOGBASE)

Luca Bigliardi's avatar
Luca Bigliardi committed
231 232
DEV_CONSOLE = "/dev/console"

Balazs Lecz's avatar
Balazs Lecz committed
233 234
PROC_MOUNTS = "/proc/mounts"

235
# Local UniX Interface related constants
236
LUXI_EOM = "\3"
237
LUXI_VERSION = CONFIG_VERSION
238 239 240 241
#: Environment variable for the luxi override socket
LUXI_OVERRIDE = "FORCE_LUXI_SOCKET"
LUXI_OVERRIDE_MASTER = "master"
LUXI_OVERRIDE_QUERY = "query"
242

Iustin Pop's avatar
Iustin Pop committed
243
# one of "no", "yes", "only"
244 245 246 247 248 249
SYSLOG_USAGE = _autoconf.SYSLOG_USAGE
SYSLOG_NO = "no"
SYSLOG_YES = "yes"
SYSLOG_ONLY = "only"
SYSLOG_SOCKET = "/dev/log"

Iustin Pop's avatar
Iustin Pop committed
250 251
EXPORT_CONF_FILE = "config.ini"

252
XEN_BOOTLOADER = _autoconf.XEN_BOOTLOADER
253 254
XEN_KERNEL = _autoconf.XEN_KERNEL
XEN_INITRD = _autoconf.XEN_INITRD
255 256
XEN_CMD_XM = "xm"
XEN_CMD_XL = "xl"
257 258 259 260 261 262

KNOWN_XEN_COMMANDS = compat.UniqueFrozenset([
  XEN_CMD_XM,
  XEN_CMD_XL,
  ])

Guido Trotter's avatar
Guido Trotter committed
263 264 265 266 267
# When the Xen toolstack used is "xl", live migration requires the source host
# to connect to the target host via ssh (xl runs this command). We need to pass
# the command xl runs some extra info so that it can use Ganeti's key
# verification and not fail. Note that this string is incomplete: it must be
# filled with the cluster name before being used.
268
XL_SSH_CMD = ("ssh -l %s -oGlobalKnownHostsFile=%s"
Guido Trotter's avatar
Guido Trotter committed
269 270
              " -oUserKnownHostsFile=/dev/null"
              " -oCheckHostIp=no -oStrictHostKeyChecking=yes"
271 272
              " -oHostKeyAlias=%%s") % (SSH_LOGIN_USER,
                                        pathutils.SSH_KNOWN_HOSTS_FILE)
273

274
KVM_PATH = _autoconf.KVM_PATH
275
KVM_KERNEL = _autoconf.KVM_KERNEL
Guido Trotter's avatar
Guido Trotter committed
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 282 283 284 285 286
#: Console as SSH command
CONS_SSH = "ssh"

#: Console as VNC server
CONS_VNC = "vnc"

287 288 289
#: Console as SPICE server
CONS_SPICE = "spice"

290 291 292 293
#: Display a message for console access
CONS_MESSAGE = "msg"

#: All console types
294 295 296 297 298 299
CONS_ALL = compat.UniqueFrozenset([
  CONS_SSH,
  CONS_VNC,
  CONS_SPICE,
  CONS_MESSAGE,
  ])
300

301 302 303 304 305
# For RSA keys more bits are better, but they also make operations more
# expensive. NIST SP 800-131 recommends a minimum of 2048 bits from the year
# 2010 on.
RSA_KEY_BITS = 2048

306 307 308
# Ciphers allowed for SSL connections. For the format, see ciphers(1). A better
# way to disable ciphers would be to use the exclamation mark (!), but socat
# 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 311 312 313
# been removed. Use the "openssl" utility to check the allowed ciphers, e.g.
# "openssl ciphers -v HIGH:-DES".
OPENSSL_CIPHERS = "HIGH:-DES:-3DES:-EXPORT:-ADH"

314 315 316
# Digest used to sign certificates ("openssl x509" uses SHA1 by default)
X509_CERT_SIGN_DIGEST = "SHA1"

317 318 319 320 321 322
# Default validity of certificates in days
X509_CERT_DEFAULT_VALIDITY = 365 * 5

# commonName (CN) used in certificates
X509_CERT_CN = "ganeti.example.com"

323 324
X509_CERT_SIGNATURE_HEADER = "X-Ganeti-Signature"

325 326 327 328
# Import/export daemon mode
IEM_IMPORT = "import"
IEM_EXPORT = "export"

329 330 331
# Import/export transport compression
IEC_NONE = "none"
IEC_GZIP = "gzip"
332
IEC_ALL = compat.UniqueFrozenset([
333 334 335 336
  IEC_NONE,
  IEC_GZIP,
  ])

337 338
IE_CUSTOM_SIZE = "fd"

339 340
IE_MAGIC_RE = re.compile(r"^[-_.a-zA-Z0-9]{5,100}$")

341 342 343 344 345 346 347 348
# Import/export I/O
# Direct file I/O, equivalent to a shell's I/O redirection using '<' or '>'
IEIO_FILE = "file"
# Raw block device I/O using "dd"
IEIO_RAW_DISK = "raw"
# OS definition import/export script
IEIO_SCRIPT = "script"

349
VALUE_DEFAULT = "default"
350 351
VALUE_AUTO = "auto"
VALUE_GENERATE = "generate"
352
VALUE_NONE = "none"
353 354
VALUE_TRUE = "true"
VALUE_FALSE = "false"
355 356
VALUE_HS_NOTHING = {"Nothing": None}

357

358 359 360
# External script validation mask
EXT_PLUGIN_MASK = re.compile("^[a-zA-Z0-9_-]+$")

Iustin Pop's avatar
Iustin Pop committed
361 362 363
# hooks-related constants
HOOKS_PHASE_PRE = "pre"
HOOKS_PHASE_POST = "post"
364
HOOKS_NAME_CFGUPDATE = "config-update"
Guido Trotter's avatar
Guido Trotter committed
365
HOOKS_NAME_WATCHER = "watcher"
366
HOOKS_VERSION = 2
367
HOOKS_PATH = "/sbin:/bin:/usr/sbin:/usr/bin"
Iustin Pop's avatar
Iustin Pop committed
368 369 370 371

# hooks subject type (what object type does the LU deal with)
HTYPE_CLUSTER = "CLUSTER"
HTYPE_NODE = "NODE"
372
HTYPE_GROUP = "GROUP"
Iustin Pop's avatar
Iustin Pop committed
373
HTYPE_INSTANCE = "INSTANCE"
374
HTYPE_NETWORK = "NETWORK"
Iustin Pop's avatar
Iustin Pop committed
375 376 377 378 379

HKR_SKIP = 0
HKR_FAIL = 1
HKR_SUCCESS = 2

380
# Storage types
381 382 383
ST_BLOCK = "blockdev"
ST_DISKLESS = "diskless"
ST_EXT = "ext"
384 385 386
ST_FILE = "file"
ST_LVM_PV = "lvm-pv"
ST_LVM_VG = "lvm-vg"
387 388
ST_RADOS = "rados"

389
STORAGE_TYPES = compat.UniqueFrozenset([
390 391 392
  ST_BLOCK,
  ST_DISKLESS,
  ST_EXT,
393 394 395 396 397 398
  ST_FILE,
  ST_LVM_PV,
  ST_LVM_VG,
  ST_RADOS,
  ])

399 400 401 402
# the set of storage types for which storage reporting is available
# FIXME: Remove this, once storage reporting is available for all types.
STS_REPORT = compat.UniqueFrozenset([ST_FILE, ST_LVM_PV, ST_LVM_VG])

403
# Storage fields
404 405 406 407
# first two are valid in LU context only, not passed to backend
SF_NODE = "node"
SF_TYPE = "type"
# and the rest are valid in backend
408 409 410 411 412 413
SF_NAME = "name"
SF_SIZE = "size"
SF_FREE = "free"
SF_USED = "used"
SF_ALLOCATABLE = "allocatable"

414 415 416
# Storage operations
SO_FIX_CONSISTENCY = "fix-consistency"

417
# Available fields per storage type
418
VALID_STORAGE_FIELDS = compat.UniqueFrozenset([
Stephen Shirley's avatar
Stephen Shirley committed
419 420 421 422 423
  SF_NAME,
  SF_TYPE,
  SF_SIZE,
  SF_USED,
  SF_FREE,
424
  SF_ALLOCATABLE,
Stephen Shirley's avatar
Stephen Shirley committed
425
  ])
426

427 428 429 430
MODIFIABLE_STORAGE_FIELDS = {
  ST_LVM_PV: frozenset([SF_ALLOCATABLE]),
  }

431
VALID_STORAGE_OPERATIONS = {
432
  ST_LVM_VG: frozenset([SO_FIX_CONSISTENCY]),
433 434
  }

435 436 437 438 439 440
# Local disk status
# Note: Code depends on LDS_OKAY < LDS_UNKNOWN < LDS_FAULTY
(LDS_OKAY,
 LDS_UNKNOWN,
 LDS_FAULTY) = range(1, 4)

441 442 443 444 445 446
LDS_NAMES = {
  LDS_OKAY: "ok",
  LDS_UNKNOWN: "unknown",
  LDS_FAULTY: "faulty",
}

Iustin Pop's avatar
Iustin Pop committed
447
# disk template types
448
DT_BLOCK = "blockdev"
Iustin Pop's avatar
Iustin Pop committed
449
DT_DISKLESS = "diskless"
450
DT_DRBD8 = "drbd"
451
DT_EXT = "ext"
452
DT_FILE = "file"
453
DT_PLAIN = "plain"
454
DT_RBD = "rbd"
455 456
DT_SHARED_FILE = "sharedfile"

457 458 459 460 461
# This is used to order determine the default disk template when the list
# of enabled disk templates is inferred from the current state of the cluster.
# This only happens on an upgrade from a version of Ganeti that did not
# support the 'enabled_disk_templates' so far.
DISK_TEMPLATE_PREFERENCE = [
462 463
  DT_BLOCK,
  DT_DISKLESS,
464
  DT_DRBD8,
465
  DT_EXT,
466
  DT_FILE,
467
  DT_PLAIN,
468
  DT_RBD,
469
  DT_SHARED_FILE,
470 471 472 473 474 475 476 477 478 479 480 481 482 483
  ]

DISK_TEMPLATES = compat.UniqueFrozenset([
  DT_DISKLESS,
  DT_PLAIN,
  DT_DRBD8,
  DT_FILE,
  DT_SHARED_FILE,
  DT_BLOCK,
  DT_RBD,
  DT_EXT
  ])

# disk templates that are enabled by default
484
DEFAULT_ENABLED_DISK_TEMPLATES = [
485 486
  DT_DRBD8,
  DT_PLAIN,
487
  ]
488

489
# mapping of disk templates to storage types
490
MAP_DISK_TEMPLATE_STORAGE_TYPE = {
491 492 493 494 495 496 497
  DT_BLOCK: ST_BLOCK,
  DT_DISKLESS: ST_DISKLESS,
  DT_DRBD8: ST_LVM_VG,
  DT_EXT: ST_EXT,
  DT_FILE: ST_FILE,
  DT_PLAIN: ST_LVM_VG,
  DT_RBD: ST_RADOS,
498
  DT_SHARED_FILE: ST_FILE,
499
  }
500 501

# the set of network-mirrored disk templates
502
DTS_INT_MIRROR = compat.UniqueFrozenset([DT_DRBD8])
Iustin Pop's avatar
Iustin Pop committed
503

504
# the set of externally-mirrored disk templates (e.g. SAN, NAS)
505
DTS_EXT_MIRROR = compat.UniqueFrozenset([
506
  DT_DISKLESS, # 'trivially' externally mirrored
507 508 509
  DT_SHARED_FILE,
  DT_BLOCK,
  DT_RBD,
510
  DT_EXT,
511
  ])
512

513
# the set of non-lvm-based disk templates
514 515 516 517 518 519
DTS_NOT_LVM = compat.UniqueFrozenset([
  DT_DISKLESS,
  DT_FILE,
  DT_SHARED_FILE,
  DT_BLOCK,
  DT_RBD,
520
  DT_EXT,
521
  ])
522

523
# the set of disk templates which can be grown
524 525 526 527 528 529
DTS_GROWABLE = compat.UniqueFrozenset([
  DT_PLAIN,
  DT_DRBD8,
  DT_FILE,
  DT_SHARED_FILE,
  DT_RBD,
530
  DT_EXT,
531
  ])
532

533
# the set of disk templates that allow adoption
534 535 536 537
DTS_MAY_ADOPT = compat.UniqueFrozenset([
  DT_PLAIN,
  DT_BLOCK,
  ])
538 539

# the set of disk templates that *must* use adoption
540
DTS_MUST_ADOPT = compat.UniqueFrozenset([DT_BLOCK])
541

542
# the set of disk templates that allow migrations
543
DTS_MIRRORED = frozenset.union(DTS_INT_MIRROR, DTS_EXT_MIRROR)
544

Guido Trotter's avatar
Guido Trotter committed
545
# the set of file based disk templates
546 547 548 549
DTS_FILEBASED = compat.UniqueFrozenset([
  DT_FILE,
  DT_SHARED_FILE,
  ])
550

551 552 553 554 555 556 557 558
# the set of disk templates that can be moved by copying
# Note: a requirement is that they're not accessed externally or shared between
# nodes; in particular, sharedfile is not suitable.
DTS_COPYABLE = compat.UniqueFrozenset([
  DT_FILE,
  DT_PLAIN,
  ])

559
# the set of disk templates that are supported by exclusive_storage
560
DTS_EXCL_STORAGE = compat.UniqueFrozenset([DT_PLAIN])
561 562

# templates for which we don't perform checks on free space
563 564 565 566 567 568
DTS_NO_FREE_SPACE_CHECK = compat.UniqueFrozenset([
  DT_FILE,
  DT_SHARED_FILE,
  DT_RBD,
  DT_EXT,
  ])
569

570 571
# logical disk types
LD_LV = "lvm"
572
LD_DRBD8 = "drbd8"
573
LD_FILE = "file"
574
LD_BLOCKDEV = "blockdev"
575
LD_RBD = "rbd"
576
LD_EXT = "ext"
577
LOGICAL_DISK_TYPES = compat.UniqueFrozenset([
578 579 580 581
  LD_LV,
  LD_DRBD8,
  LD_FILE,
  LD_BLOCKDEV,
582
  LD_RBD,
583
  LD_EXT,
584 585
  ])

586 587 588 589 590
LDS_BLOCK = compat.UniqueFrozenset([
  LD_LV,
  LD_DRBD8,
  LD_BLOCKDEV,
  LD_RBD,
591
  LD_EXT,
592
  ])
593

Iustin Pop's avatar
Iustin Pop committed
594 595
# drbd constants
DRBD_HMAC_ALG = "md5"
596 597
DRBD_DEFAULT_NET_PROTOCOL = "C"
DRBD_MIGRATION_NET_PROTOCOL = "C"
598
DRBD_STATUS_FILE = "/proc/drbd"
599

600 601 602
#: Size of DRBD meta block device
DRBD_META_SIZE = 128

603 604 605 606 607 608 609
# drbd barrier types
DRBD_B_NONE = "n"
DRBD_B_DISK_BARRIERS = "b"
DRBD_B_DISK_DRAIN = "d"
DRBD_B_DISK_FLUSH = "f"

# Valid barrier combinations: "n" or any non-null subset of "bfd"
610
DRBD_VALID_BARRIER_OPT = compat.UniqueFrozenset([
611 612 613 614 615 616 617 618 619
  frozenset([DRBD_B_NONE]),
  frozenset([DRBD_B_DISK_BARRIERS]),
  frozenset([DRBD_B_DISK_DRAIN]),
  frozenset([DRBD_B_DISK_FLUSH]),
  frozenset([DRBD_B_DISK_DRAIN, DRBD_B_DISK_FLUSH]),
  frozenset([DRBD_B_DISK_BARRIERS, DRBD_B_DISK_DRAIN]),
  frozenset([DRBD_B_DISK_BARRIERS, DRBD_B_DISK_FLUSH]),
  frozenset([DRBD_B_DISK_BARRIERS, DRBD_B_DISK_FLUSH, DRBD_B_DISK_DRAIN]),
  ])
Iustin Pop's avatar
Iustin Pop committed
620

621 622 623
# rbd tool command
RBD_CMD = "rbd"

624 625 626
# file backend driver
FD_LOOP = "loop"
FD_BLKTAP = "blktap"
627 628

# the set of drbd-like disk types
629
LDS_DRBD = compat.UniqueFrozenset([LD_DRBD8])
630

631
# disk access mode
632 633
DISK_RDONLY = "ro"
DISK_RDWR = "rw"
634
DISK_ACCESS_SET = compat.UniqueFrozenset([DISK_RDONLY, DISK_RDWR])
635

636
# disk replacement mode
637 638 639
REPLACE_DISK_PRI = "replace_on_primary"    # replace disks on primary
REPLACE_DISK_SEC = "replace_on_secondary"  # replace disks on secondary
REPLACE_DISK_CHG = "replace_new_secondary" # change secondary node
640
REPLACE_DISK_AUTO = "replace_auto"
641
REPLACE_MODES = compat.UniqueFrozenset([
642 643 644 645 646
  REPLACE_DISK_PRI,
  REPLACE_DISK_SEC,
  REPLACE_DISK_CHG,
  REPLACE_DISK_AUTO,
  ])
647

648 649 650
# Instance export mode
EXPORT_MODE_LOCAL = "local"
EXPORT_MODE_REMOTE = "remote"
651
EXPORT_MODES = compat.UniqueFrozenset([
652 653 654 655
  EXPORT_MODE_LOCAL,
  EXPORT_MODE_REMOTE,
  ])

656
# instance creation modes
Iustin Pop's avatar
Iustin Pop committed
657 658
INSTANCE_CREATE = "create"
INSTANCE_IMPORT = "import"
659
INSTANCE_REMOTE_IMPORT = "remote-import"
660
INSTANCE_CREATE_MODES = compat.UniqueFrozenset([
661 662 663 664
  INSTANCE_CREATE,
  INSTANCE_IMPORT,
  INSTANCE_REMOTE_IMPORT,
  ])
Iustin Pop's avatar
Iustin Pop committed
665

666 667 668 669 670 671 672
# Remote import/export handshake message and version
RIE_VERSION = 0
RIE_HANDSHAKE = "Hi, I'm Ganeti"

# Remote import/export certificate validity in seconds
RIE_CERT_VALIDITY = 24 * 60 * 60

673
# Overall timeout for establishing connection
674
RIE_CONNECT_TIMEOUT = 180
675

676 677 678 679 680 681
# Export only: how long to wait per connection attempt (seconds)
RIE_CONNECT_ATTEMPT_TIMEOUT = 20

# Export only: number of attempts to connect
RIE_CONNECT_RETRIES = 10

René Nussbaumer's avatar
René Nussbaumer committed
682 683
#: Give child process up to 5 seconds to exit after sending a signal
CHILD_LINGER_TIMEOUT = 5.0
684

685
FILE_DRIVER = compat.UniqueFrozenset([FD_LOOP, FD_BLKTAP])
Iustin Pop's avatar
Iustin Pop committed
686 687 688 689

# import/export config options
INISECT_EXP = "export"
INISECT_INS = "instance"
690 691
INISECT_HYP = "hypervisor"
INISECT_BEP = "backend"
692
INISECT_OSP = "os"
693

694
# dynamic device modification
695
DDM_ADD = "add"
696
DDM_MODIFY = "modify"
697
DDM_REMOVE = "remove"
698
DDMS_VALUES = compat.UniqueFrozenset([DDM_ADD, DDM_REMOVE])
699 700 701 702
DDMS_VALUES_WITH_MODIFY = (DDMS_VALUES | frozenset([
  DDM_MODIFY,
  ]))
# TODO: DDM_SWAP, DDM_MOVE?
703

704
# common exit codes
Iustin Pop's avatar
Iustin Pop committed
705
EXIT_SUCCESS = 0
706
EXIT_FAILURE = 1
707
EXIT_NOTCLUSTER = 5
708
EXIT_NOTMASTER = 11
709
EXIT_NODESETUP_ERROR = 12
Iustin Pop's avatar
Iustin Pop committed
710
EXIT_CONFIRMATION = 13 # need user confirmation
711

712 713 714
#: Exit code for query operations with unknown fields
EXIT_UNKNOWN_FIELD = 14

715 716
# tags
TAG_CLUSTER = "cluster"
717
TAG_NODEGROUP = "nodegroup"
718 719
TAG_NODE = "node"
TAG_INSTANCE = "instance"
720
TAG_NETWORK = "network"
721
VALID_TAG_TYPES = compat.UniqueFrozenset([
722
  TAG_CLUSTER,
723
  TAG_NODEGROUP,
724 725
  TAG_NODE,
  TAG_INSTANCE,
726
  TAG_NETWORK,
727
  ])
728 729 730
MAX_TAG_LEN = 128
MAX_TAGS_PER_OBJ = 4096

731 732
# others
DEFAULT_BRIDGE = "xen-br0"
733
DEFAULT_OVS = "switch1"
734
CLASSIC_DRBD_SYNC_SPEED = 60 * 1024  # 60 MiB, expressed in KiB
735 736
IP4_ADDRESS_LOCALHOST = "127.0.0.1"
IP4_ADDRESS_ANY = "0.0.0.0"
Manuel Franceschini's avatar
Manuel Franceschini committed
737 738
IP6_ADDRESS_LOCALHOST = "::1"
IP6_ADDRESS_ANY = "::"
739 740
IP4_VERSION = 4
IP6_VERSION = 6
741
VALID_IP_VERSIONS = compat.UniqueFrozenset([IP4_VERSION, IP6_VERSION])
742 743 744 745
# for export to htools
IP4_FAMILY = socket.AF_INET
IP6_FAMILY = socket.AF_INET6

746
TCP_PING_TIMEOUT = 10
747
DEFAULT_VG = "xenvg"
748
DEFAULT_DRBD_HELPER = "/bin/true"
749
MIN_VG_SIZE = 20480
750
DEFAULT_MAC_PREFIX = "aa:00:00"
751 752
# default maximum instance wait time, in seconds.
DEFAULT_SHUTDOWN_TIMEOUT = 120
753
NODE_MAX_CLOCK_SKEW = 150
754
# Time for an intra-cluster disk transfer to wait for a connection
755
DISK_TRANSFER_CONNECT_TIMEOUT = 60
756 757
# Disk index separator
DISK_SEPARATOR = _autoconf.DISK_SEPARATOR
758
IP_COMMAND_PATH = _autoconf.IP_PATH
759

760 761 762
#: Key for job IDs in opcode result
JOB_IDS_KEY = "jobs"

763 764 765 766 767
# runparts results
(RUNPARTS_SKIP,
 RUNPARTS_RUN,
 RUNPARTS_ERR) = range(3)

768 769 770 771 772
RUNPARTS_STATUS = compat.UniqueFrozenset([
  RUNPARTS_SKIP,
  RUNPARTS_RUN,
  RUNPARTS_ERR,
  ])
773

774 775 776 777
# RPC constants
(RPC_ENCODING_NONE,
 RPC_ENCODING_ZLIB_BASE64) = range(2)

778 779 780 781 782 783 784 785 786 787 788
# Various time constants for the timeout table
RPC_TMO_URGENT = 60 # one minute
RPC_TMO_FAST = 5 * 60 # five minutes
RPC_TMO_NORMAL = 15 * 60 # 15 minutes
RPC_TMO_SLOW = 3600 # one hour
RPC_TMO_4HRS = 4 * 3600
RPC_TMO_1DAY = 86400

# Timeout for connecting to nodes (seconds)
RPC_CONNECT_TIMEOUT = 5

789
# os related constants
Iustin Pop's avatar
Iustin Pop committed
790 791 792 793 794
OS_SCRIPT_CREATE = "create"
OS_SCRIPT_IMPORT = "import"
OS_SCRIPT_EXPORT = "export"
OS_SCRIPT_RENAME = "rename"
OS_SCRIPT_VERIFY = "verify"
795
OS_SCRIPTS = compat.UniqueFrozenset([
Stephen Shirley's avatar
Stephen Shirley committed
796 797 798 799
  OS_SCRIPT_CREATE,
  OS_SCRIPT_IMPORT,
  OS_SCRIPT_EXPORT,
  OS_SCRIPT_RENAME,
800
  OS_SCRIPT_VERIFY,
Stephen Shirley's avatar
Stephen Shirley committed
801
  ])
802

Iustin Pop's avatar
Iustin Pop committed
803 804 805
OS_API_FILE = "ganeti_api_version"
OS_VARIANTS_FILE = "variants.list"
OS_PARAMETERS_FILE = "parameters.list"
806

Iustin Pop's avatar
Iustin Pop committed
807
OS_VALIDATE_PARAMETERS = "parameters"
808
OS_VALIDATE_CALLS = compat.UniqueFrozenset([OS_VALIDATE_PARAMETERS])
809

810 811 812 813 814 815 816
# External Storage (ES) related constants
ES_ACTION_CREATE = "create"
ES_ACTION_REMOVE = "remove"
ES_ACTION_GROW = "grow"
ES_ACTION_ATTACH = "attach"
ES_ACTION_DETACH = "detach"
ES_ACTION_SETINFO = "setinfo"
817
ES_ACTION_VERIFY = "verify"
818 819 820 821 822 823 824

ES_SCRIPT_CREATE = ES_ACTION_CREATE
ES_SCRIPT_REMOVE = ES_ACTION_REMOVE
ES_SCRIPT_GROW = ES_ACTION_GROW
ES_SCRIPT_ATTACH = ES_ACTION_ATTACH
ES_SCRIPT_DETACH = ES_ACTION_DETACH
ES_SCRIPT_SETINFO = ES_ACTION_SETINFO
825
ES_SCRIPT_VERIFY = ES_ACTION_VERIFY
826 827 828 829 830 831
ES_SCRIPTS = frozenset([
  ES_SCRIPT_CREATE,
  ES_SCRIPT_REMOVE,
  ES_SCRIPT_GROW,
  ES_SCRIPT_ATTACH,
  ES_SCRIPT_DETACH,
832 833
  ES_SCRIPT_SETINFO,
  ES_SCRIPT_VERIFY
834 835
  ])

836 837
ES_PARAMETERS_FILE = "parameters.list"

838 839 840 841
# reboot types
INSTANCE_REBOOT_SOFT = "soft"
INSTANCE_REBOOT_HARD = "hard"
INSTANCE_REBOOT_FULL = "full"
842

843
REBOOT_TYPES = compat.UniqueFrozenset([
844 845
  INSTANCE_REBOOT_SOFT,
  INSTANCE_REBOOT_HARD,
846
  INSTANCE_REBOOT_FULL,
847 848 849 850 851 852
  ])

# instance reboot behaviors
INSTANCE_REBOOT_ALLOWED = "reboot"
INSTANCE_REBOOT_EXIT = "exit"

853
REBOOT_BEHAVIORS = compat.UniqueFrozenset([
854
  INSTANCE_REBOOT_ALLOWED,
855
  INSTANCE_REBOOT_EXIT,
856
  ])
857

Iustin Pop's avatar
Iustin Pop committed
858
VTYPE_STRING = "string"
859
VTYPE_MAYBE_STRING = "maybe-string"
Iustin Pop's avatar
Iustin Pop committed
860 861 862
VTYPE_BOOL = "bool"
VTYPE_SIZE = "size" # size, in MiBs
VTYPE_INT = "int"
863
ENFORCEABLE_TYPES = compat.UniqueFrozenset([
Stephen Shirley's avatar
Stephen Shirley committed
864 865 866 867 868 869
  VTYPE_STRING,
  VTYPE_MAYBE_STRING,
  VTYPE_BOOL,
  VTYPE_SIZE,
  VTYPE_INT,
  ])
870

871 872 873
# Constant representing that the user does not specify any IP version
IFACE_NO_IP_VERSION_SPECIFIED = 0

Guido Trotter's avatar
Guido Trotter committed
874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894
VALID_SERIAL_SPEEDS = compat.UniqueFrozenset([
  75,
  110,
  300,
  600,
  1200,
  1800,
  2400,
  4800,
  9600,
  14400,
  19200,
  28800,
  38400,
  57600,
  115200,
  230400,
  345600,
  460800,
  ])

895 896 897
# HV parameter names (global namespace)
HV_BOOT_ORDER = "boot_order"
HV_CDROM_IMAGE_PATH = "cdrom_image_path"
898 899
HV_KVM_CDROM2_IMAGE_PATH = "cdrom2_image_path"
HV_KVM_FLOPPY_IMAGE_PATH = "floppy_image_path"
900 901
HV_NIC_TYPE = "nic_type"
HV_DISK_TYPE = "disk_type"
902
HV_KVM_CDROM_DISK_TYPE = "cdrom_disk_type"
903
HV_VNC_BIND_ADDRESS = "vnc_bind_address"
904
HV_VNC_PASSWORD_FILE = "vnc_password_file"
905 906 907
HV_VNC_TLS = "vnc_tls"
HV_VNC_X509 = "vnc_x509_path"
HV_VNC_X509_VERIFY = "vnc_x509_verify"
908 909
HV_KVM_SPICE_BIND = "spice_bind"
HV_KVM_SPICE_IP_VERSION = "spice_ip_version"
910
HV_KVM_SPICE_PASSWORD_FILE = "spice_password_file"
911 912 913 914 915
HV_KVM_SPICE_LOSSLESS_IMG_COMPR = "spice_image_compression"
HV_KVM_SPICE_JPEG_IMG_COMPR = "spice_jpeg_wan_compression"
HV_KVM_SPICE_ZLIB_GLZ_IMG_COMPR = "spice_zlib_glz_wan_compression"
HV_KVM_SPICE_STREAMING_VIDEO_DETECTION = "spice_streaming_video"
HV_KVM_SPICE_AUDIO_COMPR = "spice_playback_compression"
916
HV_KVM_SPICE_USE_TLS = "spice_use_tls"
917 918
HV_KVM_SPICE_TLS_CIPHERS = "spice_tls_ciphers"
HV_KVM_SPICE_USE_VDAGENT = "spice_use_vdagent"
919 920
HV_ACPI = "acpi"
HV_PAE = "pae"
921 922 923
HV_USE_BOOTLOADER = "use_bootloader"
HV_BOOTLOADER_ARGS = "bootloader_args"
HV_BOOTLOADER_PATH = "bootloader_path"
924
HV_KERNEL_ARGS = "kernel_args"
925 926
HV_KERNEL_PATH = "kernel_path"
HV_INITRD_PATH = "initrd_path"
927
HV_ROOT_PATH = "root_path"
928
HV_SERIAL_CONSOLE = "serial_console"
Guido Trotter's avatar
Guido Trotter committed
929
HV_SERIAL_SPEED = "serial_speed"
930
HV_USB_MOUSE = "usb_mouse"
931
HV_KEYMAP = "keymap"
932
HV_DEVICE_MODEL = "device_model"
933
HV_INIT_SCRIPT = "init_script"
934
HV_MIGRATION_PORT = "migration_port"
935 936
HV_MIGRATION_BANDWIDTH = "migration_bandwidth"
HV_MIGRATION_DOWNTIME = "migration_downtime"
937
HV_MIGRATION_MODE = "migration_mode"
938
HV_USE_LOCALTIME = "use_localtime"
939
HV_DISK_CACHE = "disk_cache"
940 941
HV_SECURITY_MODEL = "security_model"
HV_SECURITY_DOMAIN = "security_domain"
Guido Trotter's avatar
Guido Trotter committed
942
HV_KVM_FLAG = "kvm_flag"
943
HV_VHOST_NET = "vhost_net"
Balazs Lecz's avatar
Balazs Lecz committed
944
HV_KVM_USE_CHROOT = "use_chroot"
945
HV_CPU_MASK = "cpu_mask"
946
HV_MEM_PATH = "mem_path"
Jack's avatar
Jack committed
947
HV_PASSTHROUGH = "pci_pass"
948
HV_BLOCKDEV_PREFIX = "blockdev_prefix"
949
HV_REBOOT_BEHAVIOR = "reboot_behavior"
950
HV_CPU_TYPE = "cpu_type"
951 952
HV_CPU_CAP = "cpu_cap"
HV_CPU_WEIGHT = "cpu_weight"