Statistics
| Branch: | Tag: | Revision:

root / lib / constants.py @ f79be8ec

History | View | Annotate | Download (65.4 kB)

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_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
# SSH constants
155
SSH = "ssh"
156
SCP = "scp"
157

    
158
NODED = "ganeti-noded"
159
CONFD = "ganeti-confd"
160
LUXID = "ganeti-luxid"
161
RAPI = "ganeti-rapi"
162
MASTERD = "ganeti-masterd"
163
MOND = "ganeti-mond"
164

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

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

    
183
DEFAULT_NODED_PORT = DAEMONS_PORTS[NODED][1]
184
DEFAULT_CONFD_PORT = DAEMONS_PORTS[CONFD][1]
185
DEFAULT_MOND_PORT = DAEMONS_PORTS[MOND][1]
186
DEFAULT_RAPI_PORT = DAEMONS_PORTS[RAPI][1]
187

    
188
FIRST_DRBD_PORT = 11000
189
LAST_DRBD_PORT = 14999
190

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

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

    
204
# Some daemons might require more than one logfile.
205
# Specifically, right now only the Haskell http library "snap", used by the
206
# monitoring daemon, requires multiple log files.
207

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

    
212
VALID_EXTRA_LOGREASONS = compat.UniqueFrozenset([
213
  EXTRA_LOGREASON_ACCESS,
214
  EXTRA_LOGREASON_ERROR,
215
  ])
216

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

    
225
DAEMONS_EXTRA_LOGFILES = \
226
  dict((daemon, dict((extra,
227
       pathutils.GetLogFilename(DAEMONS_EXTRA_LOGBASE[daemon][extra]))
228
       for extra in DAEMONS_EXTRA_LOGBASE[daemon]))
229
         for daemon in DAEMONS_EXTRA_LOGBASE)
230

    
231
DEV_CONSOLE = "/dev/console"
232

    
233
PROC_MOUNTS = "/proc/mounts"
234

    
235
# Local UniX Interface related constants
236
LUXI_EOM = "\3"
237
LUXI_VERSION = CONFIG_VERSION
238
#: Environment variable for the luxi override socket
239
LUXI_OVERRIDE = "FORCE_LUXI_SOCKET"
240
LUXI_OVERRIDE_MASTER = "master"
241
LUXI_OVERRIDE_QUERY = "query"
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
VALID_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_DRBD8,
461
  DT_PLAIN,
462
  DT_FILE,
463
  DT_SHARED_FILE,
464
  DT_RBD,
465
  DT_BLOCK,
466
  DT_DISKLESS,
467
  DT_EXT
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
DISK_TEMPLATES_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
# logical disk types
569
LD_LV = "lvm"
570
LD_DRBD8 = "drbd8"
571
LD_FILE = "file"
572
LD_BLOCKDEV = "blockdev"
573
LD_RBD = "rbd"
574
LD_EXT = "ext"
575
LOGICAL_DISK_TYPES = compat.UniqueFrozenset([
576
  LD_LV,
577
  LD_DRBD8,
578
  LD_FILE,
579
  LD_BLOCKDEV,
580
  LD_RBD,
581
  LD_EXT,
582
  ])
583

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

    
592
# drbd constants
593
DRBD_HMAC_ALG = "md5"
594
DRBD_DEFAULT_NET_PROTOCOL = "C"
595
DRBD_MIGRATION_NET_PROTOCOL = "C"
596
DRBD_STATUS_FILE = "/proc/drbd"
597

    
598
#: Size of DRBD meta block device
599
DRBD_META_SIZE = 128
600

    
601
# drbd barrier types
602
DRBD_B_NONE = "n"
603
DRBD_B_DISK_BARRIERS = "b"
604
DRBD_B_DISK_DRAIN = "d"
605
DRBD_B_DISK_FLUSH = "f"
606

    
607
# Valid barrier combinations: "n" or any non-null subset of "bfd"
608
DRBD_VALID_BARRIER_OPT = compat.UniqueFrozenset([
609
  frozenset([DRBD_B_NONE]),
610
  frozenset([DRBD_B_DISK_BARRIERS]),
611
  frozenset([DRBD_B_DISK_DRAIN]),
612
  frozenset([DRBD_B_DISK_FLUSH]),
613
  frozenset([DRBD_B_DISK_DRAIN, DRBD_B_DISK_FLUSH]),
614
  frozenset([DRBD_B_DISK_BARRIERS, DRBD_B_DISK_DRAIN]),
615
  frozenset([DRBD_B_DISK_BARRIERS, DRBD_B_DISK_FLUSH]),
616
  frozenset([DRBD_B_DISK_BARRIERS, DRBD_B_DISK_FLUSH, DRBD_B_DISK_DRAIN]),
617
  ])
618

    
619
# rbd tool command
620
RBD_CMD = "rbd"
621

    
622
# file backend driver
623
FD_LOOP = "loop"
624
FD_BLKTAP = "blktap"
625

    
626
# the set of drbd-like disk types
627
LDS_DRBD = compat.UniqueFrozenset([LD_DRBD8])
628

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

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

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

    
654
# instance creation modes
655
INSTANCE_CREATE = "create"
656
INSTANCE_IMPORT = "import"
657
INSTANCE_REMOTE_IMPORT = "remote-import"
658
INSTANCE_CREATE_MODES = compat.UniqueFrozenset([
659
  INSTANCE_CREATE,
660
  INSTANCE_IMPORT,
661
  INSTANCE_REMOTE_IMPORT,
662
  ])
663

    
664
# Remote import/export handshake message and version
665
RIE_VERSION = 0
666
RIE_HANDSHAKE = "Hi, I'm Ganeti"
667

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

    
671
# Overall timeout for establishing connection
672
RIE_CONNECT_TIMEOUT = 180
673

    
674
# Export only: how long to wait per connection attempt (seconds)
675
RIE_CONNECT_ATTEMPT_TIMEOUT = 20
676

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

    
680
#: Give child process up to 5 seconds to exit after sending a signal
681
CHILD_LINGER_TIMEOUT = 5.0
682

    
683
FILE_DRIVER = compat.UniqueFrozenset([FD_LOOP, FD_BLKTAP])
684

    
685
# import/export config options
686
INISECT_EXP = "export"
687
INISECT_INS = "instance"
688
INISECT_HYP = "hypervisor"
689
INISECT_BEP = "backend"
690
INISECT_OSP = "os"
691

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

    
702
# common exit codes
703
EXIT_SUCCESS = 0
704
EXIT_FAILURE = 1
705
EXIT_NOTCLUSTER = 5
706
EXIT_NOTMASTER = 11
707
EXIT_NODESETUP_ERROR = 12
708
EXIT_CONFIRMATION = 13 # need user confirmation
709

    
710
#: Exit code for query operations with unknown fields
711
EXIT_UNKNOWN_FIELD = 14
712

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

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

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

    
757
#: Key for job IDs in opcode result
758
JOB_IDS_KEY = "jobs"
759

    
760
# runparts results
761
(RUNPARTS_SKIP,
762
 RUNPARTS_RUN,
763
 RUNPARTS_ERR) = range(3)
764

    
765
RUNPARTS_STATUS = compat.UniqueFrozenset([
766
  RUNPARTS_SKIP,
767
  RUNPARTS_RUN,
768
  RUNPARTS_ERR,
769
  ])
770

    
771
# RPC constants
772
(RPC_ENCODING_NONE,
773
 RPC_ENCODING_ZLIB_BASE64) = range(2)
774

    
775
# Various time constants for the timeout table
776
RPC_TMO_URGENT = 60 # one minute
777
RPC_TMO_FAST = 5 * 60 # five minutes
778
RPC_TMO_NORMAL = 15 * 60 # 15 minutes
779
RPC_TMO_SLOW = 3600 # one hour
780
RPC_TMO_4HRS = 4 * 3600
781
RPC_TMO_1DAY = 86400
782

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

    
786
# os related constants
787
OS_SCRIPT_CREATE = "create"
788
OS_SCRIPT_IMPORT = "import"
789
OS_SCRIPT_EXPORT = "export"
790
OS_SCRIPT_RENAME = "rename"
791
OS_SCRIPT_VERIFY = "verify"
792
OS_SCRIPTS = compat.UniqueFrozenset([
793
  OS_SCRIPT_CREATE,
794
  OS_SCRIPT_IMPORT,
795
  OS_SCRIPT_EXPORT,
796
  OS_SCRIPT_RENAME,
797
  OS_SCRIPT_VERIFY,
798
  ])
799

    
800
OS_API_FILE = "ganeti_api_version"
801
OS_VARIANTS_FILE = "variants.list"
802
OS_PARAMETERS_FILE = "parameters.list"
803

    
804
OS_VALIDATE_PARAMETERS = "parameters"
805
OS_VALIDATE_CALLS = compat.UniqueFrozenset([OS_VALIDATE_PARAMETERS])
806

    
807
# External Storage (ES) related constants
808
ES_ACTION_CREATE = "create"
809
ES_ACTION_REMOVE = "remove"
810
ES_ACTION_GROW = "grow"
811
ES_ACTION_ATTACH = "attach"
812
ES_ACTION_DETACH = "detach"
813
ES_ACTION_SETINFO = "setinfo"
814
ES_ACTION_VERIFY = "verify"
815

    
816
ES_SCRIPT_CREATE = ES_ACTION_CREATE
817
ES_SCRIPT_REMOVE = ES_ACTION_REMOVE
818
ES_SCRIPT_GROW = ES_ACTION_GROW
819
ES_SCRIPT_ATTACH = ES_ACTION_ATTACH
820
ES_SCRIPT_DETACH = ES_ACTION_DETACH
821
ES_SCRIPT_SETINFO = ES_ACTION_SETINFO
822
ES_SCRIPT_VERIFY = ES_ACTION_VERIFY
823
ES_SCRIPTS = frozenset([
824
  ES_SCRIPT_CREATE,
825
  ES_SCRIPT_REMOVE,
826
  ES_SCRIPT_GROW,
827
  ES_SCRIPT_ATTACH,
828
  ES_SCRIPT_DETACH,
829
  ES_SCRIPT_SETINFO,
830
  ES_SCRIPT_VERIFY
831
  ])
832

    
833
ES_PARAMETERS_FILE = "parameters.list"
834

    
835
# reboot types
836
INSTANCE_REBOOT_SOFT = "soft"
837
INSTANCE_REBOOT_HARD = "hard"
838
INSTANCE_REBOOT_FULL = "full"
839

    
840
REBOOT_TYPES = compat.UniqueFrozenset([
841
  INSTANCE_REBOOT_SOFT,
842
  INSTANCE_REBOOT_HARD,
843
  INSTANCE_REBOOT_FULL,
844
  ])
845

    
846
# instance reboot behaviors
847
INSTANCE_REBOOT_ALLOWED = "reboot"
848
INSTANCE_REBOOT_EXIT = "exit"
849

    
850
REBOOT_BEHAVIORS = compat.UniqueFrozenset([
851
  INSTANCE_REBOOT_ALLOWED,
852
  INSTANCE_REBOOT_EXIT,
853
  ])
854

    
855
VTYPE_STRING = "string"
856
VTYPE_MAYBE_STRING = "maybe-string"
857
VTYPE_BOOL = "bool"
858
VTYPE_SIZE = "size" # size, in MiBs
859
VTYPE_INT = "int"
860
ENFORCEABLE_TYPES = compat.UniqueFrozenset([
861
  VTYPE_STRING,
862
  VTYPE_MAYBE_STRING,
863
  VTYPE_BOOL,
864
  VTYPE_SIZE,
865
  VTYPE_INT,
866
  ])
867

    
868
# Constant representing that the user does not specify any IP version
869
IFACE_NO_IP_VERSION_SPECIFIED = 0
870

    
871
VALID_SERIAL_SPEEDS = compat.UniqueFrozenset([
872
  75,
873
  110,
874
  300,
875
  600,
876
  1200,
877
  1800,
878
  2400,
879
  4800,
880
  9600,
881
  14400,
882
  19200,
883
  28800,
884
  38400,
885
  57600,
886
  115200,
887
  230400,
888
  345600,
889
  460800,
890
  ])
891

    
892
# HV parameter names (global namespace)
893
HV_BOOT_ORDER = "boot_order"
894
HV_CDROM_IMAGE_PATH = "cdrom_image_path"
895
HV_KVM_CDROM2_IMAGE_PATH = "cdrom2_image_path"
896
HV_KVM_FLOPPY_IMAGE_PATH = "floppy_image_path"
897
HV_NIC_TYPE = "nic_type"
898
HV_DISK_TYPE = "disk_type"
899
HV_KVM_CDROM_DISK_TYPE = "cdrom_disk_type"
900
HV_VNC_BIND_ADDRESS = "vnc_bind_address"
901
HV_VNC_PASSWORD_FILE = "vnc_password_file"
902
HV_VNC_TLS = "vnc_tls"
903
HV_VNC_X509 = "vnc_x509_path"
904
HV_VNC_X509_VERIFY = "vnc_x509_verify"
905
HV_KVM_SPICE_BIND = "spice_bind"
906
HV_KVM_SPICE_IP_VERSION = "spice_ip_version"
907
HV_KVM_SPICE_PASSWORD_FILE = "spice_password_file"
908
HV_KVM_SPICE_LOSSLESS_IMG_COMPR = "spice_image_compression"
909
HV_KVM_SPICE_JPEG_IMG_COMPR = "spice_jpeg_wan_compression"
910
HV_KVM_SPICE_ZLIB_GLZ_IMG_COMPR = "spice_zlib_glz_wan_compression"
911
HV_KVM_SPICE_STREAMING_VIDEO_DETECTION = "spice_streaming_video"
912
HV_KVM_SPICE_AUDIO_COMPR = "spice_playback_compression"
913
HV_KVM_SPICE_USE_TLS = "spice_use_tls"
914
HV_KVM_SPICE_TLS_CIPHERS = "spice_tls_ciphers"
915
HV_KVM_SPICE_USE_VDAGENT = "spice_use_vdagent"
916
HV_ACPI = "acpi"
917
HV_PAE = "pae"
918
HV_USE_BOOTLOADER = "use_bootloader"
919
HV_BOOTLOADER_ARGS = "bootloader_args"
920
HV_BOOTLOADER_PATH = "bootloader_path"
921
HV_KERNEL_ARGS = "kernel_args"
922
HV_KERNEL_PATH = "kernel_path"
923
HV_INITRD_PATH = "initrd_path"
924
HV_ROOT_PATH = "root_path"
925
HV_SERIAL_CONSOLE = "serial_console"
926
HV_SERIAL_SPEED = "serial_speed"
927
HV_USB_MOUSE = "usb_mouse"
928
HV_KEYMAP = "keymap"
929
HV_DEVICE_MODEL = "device_model"
930
HV_INIT_SCRIPT = "init_script"
931
HV_MIGRATION_PORT = "migration_port"
932
HV_MIGRATION_BANDWIDTH = "migration_bandwidth"
933
HV_MIGRATION_DOWNTIME = "migration_downtime"
934
HV_MIGRATION_MODE = "migration_mode"
935
HV_USE_LOCALTIME = "use_localtime"
936
HV_DISK_CACHE = "disk_cache"
937
HV_SECURITY_MODEL = "security_model"
938
HV_SECURITY_DOMAIN = "security_domain"
939
HV_KVM_FLAG = "kvm_flag"
940
HV_VHOST_NET = "vhost_net"
941
HV_KVM_USE_CHROOT = "use_chroot"
942
HV_CPU_MASK = "cpu_mask"
943
HV_MEM_PATH = "mem_path"
944
HV_PASSTHROUGH = "pci_pass"
945
HV_BLOCKDEV_PREFIX = "blockdev_prefix"
946
HV_REBOOT_BEHAVIOR = "reboot_behavior"
947
HV_CPU_TYPE = "cpu_type"
948
HV_CPU_CAP = "cpu_cap"
949
HV_CPU_WEIGHT = "cpu_weight"
950
HV_CPU_CORES = "cpu_cores"
951
HV_CPU_THREADS = "cpu_threads"
952
HV_CPU_SOCKETS = "cpu_sockets"
953
HV_SOUNDHW = "soundhw"
954
HV_USB_DEVICES = "usb_devices"
955
HV_VGA = "vga"
956
HV_KVM_EXTRA = "kvm_extra"
957
HV_KVM_MACHINE_VERSION = "machine_version"
958
HV_KVM_PATH = "kvm_path"
959
HV_VIF_TYPE = "vif_type"
960
HV_VIF_SCRIPT = "vif_script"
961
HV_XEN_CMD = "xen_cmd"
962

    
963

    
964
HVS_PARAMETER_TYPES = {
965
  HV_KVM_PATH: VTYPE_STRING,
966
  HV_BOOT_ORDER: VTYPE_STRING,
967
  HV_KVM_FLOPPY_IMAGE_PATH: VTYPE_STRING,
968
  HV_CDROM_IMAGE_PATH: VTYPE_STRING,
969
  HV_KVM_CDROM2_IMAGE_PATH: VTYPE_STRING,
970
  HV_NIC_TYPE: VTYPE_STRING,
971
  HV_DISK_TYPE: VTYPE_STRING,
972
  HV_KVM_CDROM_DISK_TYPE: VTYPE_STRING,
973
  HV_VNC_PASSWORD_FILE: VTYPE_STRING,
974
  HV_VNC_BIND_ADDRESS: VTYPE_STRING,
975
  HV_VNC_TLS: VTYPE_BOOL,
976
  HV_VNC_X509: VTYPE_STRING,
977
  HV_VNC_X509_VERIFY: VTYPE_BOOL,
978
  HV_KVM_SPICE_BIND: VTYPE_STRING,
979
  HV_KVM_SPICE_IP_VERSION: VTYPE_INT,
980
  HV_KVM_SPICE_PASSWORD_FILE: VTYPE_STRING,
981
  HV_KVM_SPICE_LOSSLESS_IMG_COMPR: VTYPE_STRING,
982
  HV_KVM_SPICE_JPEG_IMG_COMPR: VTYPE_STRING,
983
  HV_KVM_SPICE_ZLIB_GLZ_IMG_COMPR: VTYPE_STRING,
984
  HV_KVM_SPICE_STREAMING_VIDEO_DETECTION: VTYPE_STRING,
985
  HV_KVM_SPICE_AUDIO_COMPR: VTYPE_BOOL,
986
  HV_KVM_SPICE_USE_TLS: VTYPE_BOOL,
987
  HV_KVM_SPICE_TLS_CIPHERS: VTYPE_STRING,
988
  HV_KVM_SPICE_USE_VDAGENT: VTYPE_BOOL,
989
  HV_ACPI: VTYPE_BOOL,
990
  HV_PAE: VTYPE_BOOL,
991
  HV_USE_BOOTLOADER: VTYPE_BOOL,
992
  HV_BOOTLOADER_PATH: VTYPE_STRING,
993
  HV_BOOTLOADER_ARGS: VTYPE_STRING,
994
  HV_KERNEL_PATH: VTYPE_STRING,
995
  HV_KERNEL_ARGS: VTYPE_STRING,
996
  HV_INITRD_PATH: VTYPE_STRING,
997
  HV_ROOT_PATH: VTYPE_MAYBE_STRING,
998
  HV_SERIAL_CONSOLE: VTYPE_BOOL,
999
  HV_SERIAL_SPEED: VTYPE_INT,
1000
  HV_USB_MOUSE: VTYPE_STRING,
1001
  HV_KEYMAP: VTYPE_STRING,
1002
  HV_DEVICE_MODEL: VTYPE_STRING,
1003
  HV_INIT_SCRIPT: VTYPE_STRING,
1004
  HV_MIGRATION_PORT: VTYPE_INT,
1005
  HV_MIGRATION_BANDWIDTH: VTYPE_INT,
1006
  HV_MIGRATION_DOWNTIME: VTYPE_INT,
1007
  HV_MIGRATION_MODE: VTYPE_STRING,
1008
  HV_USE_LOCALTIME: VTYPE_BOOL,
1009
  HV_DISK_CACHE: VTYPE_STRING,
1010
  HV_SECURITY_MODEL: VTYPE_STRING,
1011
  HV_SECURITY_DOMAIN: VTYPE_STRING,
1012
  HV_KVM_FLAG: VTYPE_STRING,
1013
  HV_VHOST_NET: VTYPE_BOOL,
1014
  HV_KVM_USE_CHROOT: VTYPE_BOOL,
1015
  HV_CPU_MASK: VTYPE_STRING,
1016
  HV_MEM_PATH: VTYPE_STRING,
1017
  HV_PASSTHROUGH: VTYPE_STRING,
1018
  HV_BLOCKDEV_PREFIX: VTYPE_STRING,
1019
  HV_REBOOT_BEHAVIOR: VTYPE_STRING,
1020
  HV_CPU_TYPE: VTYPE_STRING,
1021
  HV_CPU_CAP: VTYPE_INT,
1022
  HV_CPU_WEIGHT: VTYPE_INT,
1023
  HV_CPU_CORES: VTYPE_INT,
1024
  HV_CPU_THREADS: VTYPE_INT,
1025
  HV_CPU_SOCKETS: VTYPE_INT,
1026
  HV_SOUNDHW: VTYPE_STRING,
1027
  HV_USB_DEVICES: VTYPE_STRING,
1028
  HV_VGA: VTYPE_STRING,
1029
  HV_KVM_EXTRA: VTYPE_STRING,
1030
  HV_KVM_MACHINE_VERSION: VTYPE_STRING,
1031
  HV_VIF_TYPE: VTYPE_STRING,
1032
  HV_VIF_SCRIPT: VTYPE_STRING,
1033
  HV_XEN_CMD: VTYPE_STRING,
1034
  }
1035

    
1036
HVS_PARAMETERS = frozenset(HVS_PARAMETER_TYPES.keys())
1037

    
1038
HVS_PARAMETER_TITLES = {
1039
  HV_ACPI: "ACPI",
1040
  HV_BOOT_ORDER: "Boot_order",
1041
  HV_CDROM_IMAGE_PATH: "CDROM_image_path",
1042
  HV_DISK_TYPE: "Disk_type",
1043
  HV_INITRD_PATH: "Initrd_path",
1044
  HV_KERNEL_PATH: "Kernel_path",
1045
  HV_NIC_TYPE: "NIC_type",
1046
  HV_PAE: "PAE",
1047
  HV_VNC_BIND_ADDRESS: "VNC_bind_address",
1048
  HV_PASSTHROUGH: "pci_pass",
1049
  HV_CPU_TYPE: "cpu_type",
1050
  }
1051

    
1052
# Migration statuses
1053
HV_MIGRATION_COMPLETED = "completed"
1054
HV_MIGRATION_ACTIVE = "active"
1055
HV_MIGRATION_FAILED = "failed"
1056
HV_MIGRATION_CANCELLED = "cancelled"
1057

    
1058
HV_MIGRATION_VALID_STATUSES = compat.UniqueFrozenset([
1059
  HV_MIGRATION_COMPLETED,
1060
  HV_MIGRATION_ACTIVE,
1061
  HV_MIGRATION_FAILED,
1062
  HV_MIGRATION_CANCELLED,
1063
  ])
1064

    
1065
HV_MIGRATION_FAILED_STATUSES = compat.UniqueFrozenset([
1066
  HV_MIGRATION_FAILED,
1067
  HV_MIGRATION_CANCELLED,
1068
  ])
1069

    
1070
# KVM-specific statuses
1071
HV_KVM_MIGRATION_VALID_STATUSES = HV_MIGRATION_VALID_STATUSES
1072

    
1073
# Node info keys
1074
HV_NODEINFO_KEY_VERSION = "hv_version"
1075

    
1076
# Hypervisor state
1077
HVST_MEMORY_TOTAL = "mem_total"
1078
HVST_MEMORY_NODE = "mem_node"
1079
HVST_MEMORY_HV = "mem_hv"
1080
HVST_CPU_TOTAL = "cpu_total"
1081
HVST_CPU_NODE = "cpu_node"
1082

    
1083
HVST_DEFAULTS = {
1084
  HVST_MEMORY_TOTAL: 0,
1085
  HVST_MEMORY_NODE: 0,
1086
  HVST_MEMORY_HV: 0,
1087
  HVST_CPU_TOTAL: 1,
1088
  HVST_CPU_NODE: 1,
1089
  }
1090

    
1091
HVSTS_PARAMETER_TYPES = {
1092
  HVST_MEMORY_TOTAL: VTYPE_INT,
1093
  HVST_MEMORY_NODE: VTYPE_INT,
1094
  HVST_MEMORY_HV: VTYPE_INT,
1095
  HVST_CPU_TOTAL: VTYPE_INT,
1096
  HVST_CPU_NODE: VTYPE_INT,
1097
  }
1098

    
1099
HVSTS_PARAMETERS = frozenset(HVSTS_PARAMETER_TYPES.keys())
1100

    
1101
# Disk state
1102
DS_DISK_TOTAL = "disk_total"
1103
DS_DISK_RESERVED = "disk_reserved"
1104
DS_DISK_OVERHEAD = "disk_overhead"
1105

    
1106
DS_DEFAULTS = {
1107
  DS_DISK_TOTAL: 0,
1108
  DS_DISK_RESERVED: 0,
1109
  DS_DISK_OVERHEAD: 0,
1110
  }
1111

    
1112
DSS_PARAMETER_TYPES = {
1113
  DS_DISK_TOTAL: VTYPE_INT,
1114
  DS_DISK_RESERVED: VTYPE_INT,
1115
  DS_DISK_OVERHEAD: VTYPE_INT,
1116
  }
1117

    
1118
DSS_PARAMETERS = frozenset(DSS_PARAMETER_TYPES.keys())
1119
DS_VALID_TYPES = compat.UniqueFrozenset([LD_LV])
1120

    
1121
# Backend parameter names
1122
BE_MEMORY = "memory" # deprecated and replaced by max and min mem
1123
BE_MAXMEM = "maxmem"
1124
BE_MINMEM = "minmem"
1125
BE_VCPUS = "vcpus"
1126
BE_AUTO_BALANCE = "auto_balance"
1127
BE_ALWAYS_FAILOVER = "always_failover"
1128
BE_SPINDLE_USE = "spindle_use"
1129

    
1130
BES_PARAMETER_TYPES = {
1131
  BE_MAXMEM: VTYPE_SIZE,
1132
  BE_MINMEM: VTYPE_SIZE,
1133
  BE_VCPUS: VTYPE_INT,
1134
  BE_AUTO_BALANCE: VTYPE_BOOL,
1135
  BE_ALWAYS_FAILOVER: VTYPE_BOOL,
1136
  BE_SPINDLE_USE: VTYPE_INT,
1137
  }
1138

    
1139
BES_PARAMETER_TITLES = {
1140
  BE_AUTO_BALANCE: "Auto_balance",
1141
  BE_MAXMEM: "ConfigMaxMem",
1142
  BE_MINMEM: "ConfigMinMem",
1143
  BE_VCPUS: "ConfigVCPUs",
1144
  }
1145

    
1146
BES_PARAMETER_COMPAT = {
1147
  BE_MEMORY: VTYPE_SIZE,
1148
  }
1149
BES_PARAMETER_COMPAT.update(BES_PARAMETER_TYPES)
1150

    
1151
BES_PARAMETERS = frozenset(BES_PARAMETER_TYPES.keys())
1152

    
1153
# instance specs
1154
ISPEC_MEM_SIZE = "memory-size"
1155
ISPEC_CPU_COUNT = "cpu-count"
1156
ISPEC_DISK_COUNT = "disk-count"
1157
ISPEC_DISK_SIZE = "disk-size"
1158
ISPEC_NIC_COUNT = "nic-count"
1159
ISPEC_SPINDLE_USE = "spindle-use"
1160

    
1161
ISPECS_PARAMETER_TYPES = {
1162
  ISPEC_MEM_SIZE: VTYPE_INT,
1163
  ISPEC_CPU_COUNT: VTYPE_INT,
1164
  ISPEC_DISK_COUNT: VTYPE_INT,
1165
  ISPEC_DISK_SIZE: VTYPE_INT,
1166
  ISPEC_NIC_COUNT: VTYPE_INT,
1167
  ISPEC_SPINDLE_USE: VTYPE_INT,
1168
  }
1169

    
1170
ISPECS_PARAMETERS = frozenset(ISPECS_PARAMETER_TYPES.keys())
1171

    
1172
ISPECS_MINMAX = "minmax"
1173
ISPECS_MIN = "min"
1174
ISPECS_MAX = "max"
1175
ISPECS_STD = "std"
1176
IPOLICY_DTS = "disk-templates"
1177
IPOLICY_VCPU_RATIO = "vcpu-ratio"
1178
IPOLICY_SPINDLE_RATIO = "spindle-ratio"
1179

    
1180
ISPECS_MINMAX_KEYS = compat.UniqueFrozenset([
1181
  ISPECS_MIN,
1182
  ISPECS_MAX,
1183
  ])
1184

    
1185
IPOLICY_PARAMETERS = compat.UniqueFrozenset([
1186
  IPOLICY_VCPU_RATIO,
1187
  IPOLICY_SPINDLE_RATIO,
1188
  ])
1189

    
1190
IPOLICY_ALL_KEYS = (IPOLICY_PARAMETERS |
1191
                    frozenset([ISPECS_MINMAX, ISPECS_STD, IPOLICY_DTS]))
1192

    
1193
# Node parameter names
1194
ND_OOB_PROGRAM = "oob_program"
1195
ND_SPINDLE_COUNT = "spindle_count"
1196
ND_EXCLUSIVE_STORAGE = "exclusive_storage"
1197

    
1198
NDS_PARAMETER_TYPES = {
1199
  ND_OOB_PROGRAM: VTYPE_STRING,
1200
  ND_SPINDLE_COUNT: VTYPE_INT,
1201
  ND_EXCLUSIVE_STORAGE: VTYPE_BOOL,
1202
  }
1203

    
1204
NDS_PARAMETERS = frozenset(NDS_PARAMETER_TYPES.keys())
1205

    
1206
NDS_PARAMETER_TITLES = {
1207
  ND_OOB_PROGRAM: "OutOfBandProgram",
1208
  ND_SPINDLE_COUNT: "SpindleCount",
1209
  ND_EXCLUSIVE_STORAGE: "ExclusiveStorage",
1210
  }
1211

    
1212
# Logical Disks parameters
1213
LDP_RESYNC_RATE = "resync-rate"
1214
LDP_STRIPES = "stripes"
1215
LDP_BARRIERS = "disabled-barriers"
1216
LDP_NO_META_FLUSH = "disable-meta-flush"
1217
LDP_DEFAULT_METAVG = "default-metavg"
1218
LDP_DISK_CUSTOM = "disk-custom"
1219
LDP_NET_CUSTOM = "net-custom"
1220
LDP_PROTOCOL = "protocol"
1221
LDP_DYNAMIC_RESYNC = "dynamic-resync"
1222
LDP_PLAN_AHEAD = "c-plan-ahead"
1223
LDP_FILL_TARGET = "c-fill-target"
1224
LDP_DELAY_TARGET = "c-delay-target"
1225
LDP_MAX_RATE = "c-max-rate"
1226
LDP_MIN_RATE = "c-min-rate"
1227
LDP_POOL = "pool"
1228
DISK_LD_TYPES = {
1229
  LDP_RESYNC_RATE: VTYPE_INT,
1230
  LDP_STRIPES: VTYPE_INT,
1231
  LDP_BARRIERS: VTYPE_STRING,
1232
  LDP_NO_META_FLUSH: VTYPE_BOOL,
1233
  LDP_DEFAULT_METAVG: VTYPE_STRING,
1234
  LDP_DISK_CUSTOM: VTYPE_STRING,
1235
  LDP_NET_CUSTOM: VTYPE_STRING,
1236
  LDP_PROTOCOL: VTYPE_STRING,
1237
  LDP_DYNAMIC_RESYNC: VTYPE_BOOL,
1238
  LDP_PLAN_AHEAD: VTYPE_INT,
1239
  LDP_FILL_TARGET: VTYPE_INT,
1240
  LDP_DELAY_TARGET: VTYPE_INT,
1241
  LDP_MAX_RATE: VTYPE_INT,
1242
  LDP_MIN_RATE: VTYPE_INT,
1243
  LDP_POOL: VTYPE_STRING,
1244
  }
1245
DISK_LD_PARAMETERS = frozenset(DISK_LD_TYPES.keys())
1246

    
1247
# Disk template parameters (can be set/changed by the user via gnt-cluster and
1248
# gnt-group)
1249
DRBD_RESYNC_RATE = "resync-rate"
1250
DRBD_DATA_STRIPES = "data-stripes"
1251
DRBD_META_STRIPES = "meta-stripes"
1252
DRBD_DISK_BARRIERS = "disk-barriers"
1253
DRBD_META_BARRIERS = "meta-barriers"
1254
DRBD_DEFAULT_METAVG = "metavg"
1255
DRBD_DISK_CUSTOM = "disk-custom"
1256
DRBD_NET_CUSTOM = "net-custom"
1257
DRBD_PROTOCOL = "protocol"
1258
DRBD_DYNAMIC_RESYNC = "dynamic-resync"
1259
DRBD_PLAN_AHEAD = "c-plan-ahead"
1260
DRBD_FILL_TARGET = "c-fill-target"
1261
DRBD_DELAY_TARGET = "c-delay-target"
1262
DRBD_MAX_RATE = "c-max-rate"
1263
DRBD_MIN_RATE = "c-min-rate"
1264
LV_STRIPES = "stripes"
1265
RBD_POOL = "pool"
1266
DISK_DT_TYPES = {
1267
  DRBD_RESYNC_RATE: VTYPE_INT,
1268
  DRBD_DATA_STRIPES: VTYPE_INT,
1269
  DRBD_META_STRIPES: VTYPE_INT,
1270
  DRBD_DISK_BARRIERS: VTYPE_STRING,
1271
  DRBD_META_BARRIERS: VTYPE_BOOL,
1272
  DRBD_DEFAULT_METAVG: VTYPE_STRING,
1273
  DRBD_DISK_CUSTOM: VTYPE_STRING,
1274
  DRBD_NET_CUSTOM: VTYPE_STRING,
1275
  DRBD_PROTOCOL: VTYPE_STRING,
1276
  DRBD_DYNAMIC_RESYNC: VTYPE_BOOL,
1277
  DRBD_PLAN_AHEAD: VTYPE_INT,
1278
  DRBD_FILL_TARGET: VTYPE_INT,
1279
  DRBD_DELAY_TARGET: VTYPE_INT,
1280
  DRBD_MAX_RATE: VTYPE_INT,
1281
  DRBD_MIN_RATE: VTYPE_INT,
1282
  LV_STRIPES: VTYPE_INT,
1283
  RBD_POOL: VTYPE_STRING,
1284
  }
1285

    
1286
DISK_DT_PARAMETERS = frozenset(DISK_DT_TYPES.keys())
1287

    
1288
# OOB supported commands
1289
OOB_POWER_ON = "power-on"
1290
OOB_POWER_OFF = "power-off"
1291
OOB_POWER_CYCLE = "power-cycle"
1292
OOB_POWER_STATUS = "power-status"
1293
OOB_HEALTH = "health"
1294

    
1295
OOB_COMMANDS = compat.UniqueFrozenset([
1296
  OOB_POWER_ON,
1297
  OOB_POWER_OFF,
1298
  OOB_POWER_CYCLE,
1299
  OOB_POWER_STATUS,
1300
  OOB_HEALTH,
1301
  ])
1302

    
1303
OOB_POWER_STATUS_POWERED = "powered"
1304

    
1305
OOB_TIMEOUT = 60 # 60 seconds
1306
OOB_POWER_DELAY = 2.0 # 2 seconds
1307

    
1308
OOB_STATUS_OK = "OK"
1309
OOB_STATUS_WARNING = "WARNING"
1310
OOB_STATUS_CRITICAL = "CRITICAL"
1311
OOB_STATUS_UNKNOWN = "UNKNOWN"
1312

    
1313
OOB_STATUSES = compat.UniqueFrozenset([
1314
  OOB_STATUS_OK,
1315
  OOB_STATUS_WARNING,
1316
  OOB_STATUS_CRITICAL,
1317
  OOB_STATUS_UNKNOWN,
1318
  ])
1319

    
1320
# Instance Parameters Profile
1321
PP_DEFAULT = "default"
1322

    
1323
# NIC_* constants are used inside the ganeti config
1324
NIC_MODE = "mode"
1325
NIC_LINK = "link"
1326

    
1327
NIC_MODE_BRIDGED = "bridged"
1328
NIC_MODE_ROUTED = "routed"
1329
NIC_MODE_OVS = "openvswitch"
1330
NIC_IP_POOL = "pool"
1331

    
1332
NIC_VALID_MODES = compat.UniqueFrozenset([
1333
  NIC_MODE_BRIDGED,
1334
  NIC_MODE_ROUTED,
1335
  NIC_MODE_OVS,
1336
  ])
1337

    
1338
RESERVE_ACTION = "reserve"
1339
RELEASE_ACTION = "release"
1340

    
1341
NICS_PARAMETER_TYPES = {
1342
  NIC_MODE: VTYPE_STRING,
1343
  NIC_LINK: VTYPE_STRING,
1344
  }
1345

    
1346
NICS_PARAMETERS = frozenset(NICS_PARAMETER_TYPES.keys())
1347

    
1348
# IDISK_* constants are used in opcodes, to create/change disks
1349
IDISK_SIZE = "size"
1350
IDISK_SPINDLES = "spindles"
1351
IDISK_MODE = "mode"
1352
IDISK_ADOPT = "adopt"
1353
IDISK_VG = "vg"
1354
IDISK_METAVG = "metavg"
1355
IDISK_PROVIDER = "provider"
1356
IDISK_NAME = "name"
1357
IDISK_PARAMS_TYPES = {
1358
  IDISK_SIZE: VTYPE_SIZE,
1359
  IDISK_SPINDLES: VTYPE_INT,
1360
  IDISK_MODE: VTYPE_STRING,
1361
  IDISK_ADOPT: VTYPE_STRING,
1362
  IDISK_VG: VTYPE_STRING,
1363
  IDISK_METAVG: VTYPE_STRING,
1364
  IDISK_PROVIDER: VTYPE_STRING,
1365
  IDISK_NAME: VTYPE_MAYBE_STRING,
1366
  }
1367
IDISK_PARAMS = frozenset(IDISK_PARAMS_TYPES.keys())
1368

    
1369
# INIC_* constants are used in opcodes, to create/change nics
1370
INIC_MAC = "mac"
1371
INIC_IP = "ip"
1372
INIC_MODE = "mode"
1373
INIC_LINK = "link"
1374
INIC_NETWORK = "network"
1375
INIC_NAME = "name"
1376
INIC_PARAMS_TYPES = {
1377
  INIC_IP: VTYPE_MAYBE_STRING,
1378
  INIC_LINK: VTYPE_STRING,
1379
  INIC_MAC: VTYPE_STRING,
1380
  INIC_MODE: VTYPE_STRING,
1381
  INIC_NETWORK: VTYPE_MAYBE_STRING,
1382
  INIC_NAME: VTYPE_MAYBE_STRING,
1383
  }
1384
INIC_PARAMS = frozenset(INIC_PARAMS_TYPES.keys())
1385

    
1386
# Hypervisor constants
1387
HT_XEN_PVM = "xen-pvm"
1388
HT_FAKE = "fake"
1389
HT_XEN_HVM = "xen-hvm"
1390
HT_KVM = "kvm"
1391
HT_CHROOT = "chroot"
1392
HT_LXC = "lxc"
1393
HYPER_TYPES = compat.UniqueFrozenset([
1394
  HT_XEN_PVM,
1395
  HT_FAKE,
1396
  HT_XEN_HVM,
1397
  HT_KVM,
1398
  HT_CHROOT,
1399
  HT_LXC,
1400
  ])
1401
HTS_REQ_PORT = compat.UniqueFrozenset([HT_XEN_HVM, HT_KVM])
1402

    
1403
VNC_BASE_PORT = 5900
1404
VNC_DEFAULT_BIND_ADDRESS = IP4_ADDRESS_ANY
1405

    
1406
# NIC types
1407
HT_NIC_RTL8139 = "rtl8139"
1408
HT_NIC_NE2K_PCI = "ne2k_pci"
1409
HT_NIC_NE2K_ISA = "ne2k_isa"
1410
HT_NIC_I82551 = "i82551"
1411
HT_NIC_I85557B = "i82557b"
1412
HT_NIC_I8259ER = "i82559er"
1413
HT_NIC_PCNET = "pcnet"
1414
HT_NIC_E1000 = "e1000"
1415
HT_NIC_PARAVIRTUAL = HT_DISK_PARAVIRTUAL = "paravirtual"
1416

    
1417
HT_HVM_VALID_NIC_TYPES = compat.UniqueFrozenset([
1418
  HT_NIC_RTL8139,
1419
  HT_NIC_NE2K_PCI,
1420
  HT_NIC_E1000,
1421
  HT_NIC_NE2K_ISA,
1422
  HT_NIC_PARAVIRTUAL,
1423
  ])
1424
HT_KVM_VALID_NIC_TYPES = compat.UniqueFrozenset([
1425
  HT_NIC_RTL8139,
1426
  HT_NIC_NE2K_PCI,
1427
  HT_NIC_NE2K_ISA,
1428
  HT_NIC_I82551,
1429
  HT_NIC_I85557B,
1430
  HT_NIC_I8259ER,
1431
  HT_NIC_PCNET,
1432
  HT_NIC_E1000,
1433
  HT_NIC_PARAVIRTUAL,
1434
  ])
1435

    
1436
# Vif types
1437
# default vif type in xen-hvm
1438
HT_HVM_VIF_IOEMU = "ioemu"
1439
HT_HVM_VIF_VIF = "vif"
1440
HT_HVM_VALID_VIF_TYPES = compat.UniqueFrozenset([
1441
  HT_HVM_VIF_IOEMU,
1442
  HT_HVM_VIF_VIF,
1443
  ])
1444

    
1445
# Disk types
1446
HT_DISK_IOEMU = "ioemu"
1447
HT_DISK_IDE = "ide"
1448
HT_DISK_SCSI = "scsi"
1449
HT_DISK_SD = "sd"
1450
HT_DISK_MTD = "mtd"
1451
HT_DISK_PFLASH = "pflash"
1452

    
1453
HT_CACHE_DEFAULT = "default"
1454
HT_CACHE_NONE = "none"
1455
HT_CACHE_WTHROUGH = "writethrough"
1456
HT_CACHE_WBACK = "writeback"
1457
HT_VALID_CACHE_TYPES = compat.UniqueFrozenset([
1458
  HT_CACHE_DEFAULT,
1459
  HT_CACHE_NONE,
1460
  HT_CACHE_WTHROUGH,
1461
  HT_CACHE_WBACK,
1462
  ])
1463

    
1464
HT_HVM_VALID_DISK_TYPES = compat.UniqueFrozenset([
1465
  HT_DISK_PARAVIRTUAL,
1466
  HT_DISK_IOEMU,
1467
  ])
1468
HT_KVM_VALID_DISK_TYPES = compat.UniqueFrozenset([
1469
  HT_DISK_PARAVIRTUAL,
1470
  HT_DISK_IDE,
1471
  HT_DISK_SCSI,
1472
  HT_DISK_SD,
1473
  HT_DISK_MTD,
1474
  HT_DISK_PFLASH,
1475
  ])
1476

    
1477
# Mouse types:
1478
HT_MOUSE_MOUSE = "mouse"
1479
HT_MOUSE_TABLET = "tablet"
1480

    
1481
HT_KVM_VALID_MOUSE_TYPES = compat.UniqueFrozenset([
1482
  HT_MOUSE_MOUSE,
1483
  HT_MOUSE_TABLET,
1484
  ])
1485

    
1486
# Boot order
1487
HT_BO_FLOPPY = "floppy"
1488
HT_BO_CDROM = "cdrom"
1489
HT_BO_DISK = "disk"
1490
HT_BO_NETWORK = "network"
1491

    
1492
HT_KVM_VALID_BO_TYPES = compat.UniqueFrozenset([
1493
  HT_BO_FLOPPY,
1494
  HT_BO_CDROM,
1495
  HT_BO_DISK,
1496
  HT_BO_NETWORK,
1497
  ])
1498

    
1499
# SPICE lossless image compression options
1500
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_AUTO_GLZ = "auto_glz"
1501
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_AUTO_LZ = "auto_lz"
1502
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_QUIC = "quic"
1503
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_GLZ = "glz"
1504
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_LZ = "lz"
1505
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_OFF = "off"
1506

    
1507
HT_KVM_SPICE_VALID_LOSSLESS_IMG_COMPR_OPTIONS = compat.UniqueFrozenset([
1508
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_AUTO_GLZ,
1509
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_AUTO_LZ,
1510
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_QUIC,
1511
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_GLZ,
1512
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_LZ,
1513
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_OFF,
1514
  ])
1515

    
1516
# SPICE lossy image compression options (valid for both jpeg and zlib-glz)
1517
HT_KVM_SPICE_LOSSY_IMG_COMPR_AUTO = "auto"
1518
HT_KVM_SPICE_LOSSY_IMG_COMPR_NEVER = "never"
1519
HT_KVM_SPICE_LOSSY_IMG_COMPR_ALWAYS = "always"
1520

    
1521
HT_KVM_SPICE_VALID_LOSSY_IMG_COMPR_OPTIONS = compat.UniqueFrozenset([
1522
  HT_KVM_SPICE_LOSSY_IMG_COMPR_AUTO,
1523
  HT_KVM_SPICE_LOSSY_IMG_COMPR_NEVER,
1524
  HT_KVM_SPICE_LOSSY_IMG_COMPR_ALWAYS,
1525
  ])
1526

    
1527
# SPICE video stream detection
1528
HT_KVM_SPICE_VIDEO_STREAM_DETECTION_OFF = "off"
1529
HT_KVM_SPICE_VIDEO_STREAM_DETECTION_ALL = "all"
1530
HT_KVM_SPICE_VIDEO_STREAM_DETECTION_FILTER = "filter"
1531

    
1532
HT_KVM_SPICE_VALID_VIDEO_STREAM_DETECTION_OPTIONS = compat.UniqueFrozenset([
1533
  HT_KVM_SPICE_VIDEO_STREAM_DETECTION_OFF,
1534
  HT_KVM_SPICE_VIDEO_STREAM_DETECTION_ALL,
1535
  HT_KVM_SPICE_VIDEO_STREAM_DETECTION_FILTER,
1536
  ])
1537

    
1538
# Security models
1539
HT_SM_NONE = "none"
1540
HT_SM_USER = "user"
1541
HT_SM_POOL = "pool"
1542

    
1543
HT_KVM_VALID_SM_TYPES = compat.UniqueFrozenset([
1544
  HT_SM_NONE,
1545
  HT_SM_USER,
1546
  HT_SM_POOL,
1547
  ])
1548

    
1549
# Kvm flag values
1550
HT_KVM_ENABLED = "enabled"
1551
HT_KVM_DISABLED = "disabled"
1552

    
1553
HT_KVM_FLAG_VALUES = compat.UniqueFrozenset([HT_KVM_ENABLED, HT_KVM_DISABLED])
1554

    
1555
# Migration type
1556
HT_MIGRATION_LIVE = "live"
1557
HT_MIGRATION_NONLIVE = "non-live"
1558
HT_MIGRATION_MODES = compat.UniqueFrozenset([
1559
  HT_MIGRATION_LIVE,
1560
  HT_MIGRATION_NONLIVE,
1561
  ])
1562

    
1563
# Cluster Verify steps
1564
VERIFY_NPLUSONE_MEM = "nplusone_mem"
1565
VERIFY_OPTIONAL_CHECKS = compat.UniqueFrozenset([VERIFY_NPLUSONE_MEM])
1566

    
1567
# Cluster Verify error classes
1568
CV_TCLUSTER = "cluster"
1569
CV_TGROUP = "group"
1570
CV_TNODE = "node"
1571
CV_TINSTANCE = "instance"
1572

    
1573
# Cluster Verify error codes and documentation
1574
CV_ECLUSTERCFG = \
1575
  (CV_TCLUSTER, "ECLUSTERCFG", "Cluster configuration verification failure")
1576
CV_ECLUSTERCERT = \
1577
  (CV_TCLUSTER, "ECLUSTERCERT",
1578
   "Cluster certificate files verification failure")
1579
CV_ECLUSTERFILECHECK = \
1580
  (CV_TCLUSTER, "ECLUSTERFILECHECK",
1581
   "Cluster configuration verification failure")
1582
CV_ECLUSTERDANGLINGNODES = \
1583
  (CV_TNODE, "ECLUSTERDANGLINGNODES",
1584
   "Some nodes belong to non-existing groups")
1585
CV_ECLUSTERDANGLINGINST = \
1586
  (CV_TNODE, "ECLUSTERDANGLINGINST",
1587
   "Some instances have a non-existing primary node")
1588
CV_EGROUPDIFFERENTPVSIZE = \
1589
  (CV_TGROUP, "EGROUPDIFFERENTPVSIZE", "PVs in the group have different sizes")
1590
CV_EINSTANCEBADNODE = \
1591
  (CV_TINSTANCE, "EINSTANCEBADNODE",
1592
   "Instance marked as running lives on an offline node")
1593
CV_EINSTANCEDOWN = \
1594
  (CV_TINSTANCE, "EINSTANCEDOWN", "Instance not running on its primary node")
1595
CV_EINSTANCELAYOUT = \
1596
  (CV_TINSTANCE, "EINSTANCELAYOUT", "Instance has multiple secondary nodes")
1597
CV_EINSTANCEMISSINGDISK = \
1598
  (CV_TINSTANCE, "EINSTANCEMISSINGDISK", "Missing volume on an instance")
1599
CV_EINSTANCEFAULTYDISK = \
1600
  (CV_TINSTANCE, "EINSTANCEFAULTYDISK",
1601
   "Impossible to retrieve status for a disk")
1602
CV_EINSTANCEWRONGNODE = \
1603
  (CV_TINSTANCE, "EINSTANCEWRONGNODE", "Instance running on the wrong node")
1604
CV_EINSTANCESPLITGROUPS = \
1605
  (CV_TINSTANCE, "EINSTANCESPLITGROUPS",
1606
   "Instance with primary and secondary nodes in different groups")
1607
CV_EINSTANCEPOLICY = \
1608
  (CV_TINSTANCE, "EINSTANCEPOLICY",
1609
   "Instance does not meet policy")
1610
CV_EINSTANCEUNSUITABLENODE = \
1611
  (CV_TINSTANCE, "EINSTANCEUNSUITABLENODE",
1612
   "Instance running on nodes that are not suitable for it")
1613
CV_EINSTANCEMISSINGCFGPARAMETER = \
1614
  (CV_TINSTANCE, "EINSTANCEMISSINGCFGPARAMETER",
1615
   "A configuration parameter for an instance is missing")
1616
CV_ENODEDRBD = \
1617
  (CV_TNODE, "ENODEDRBD", "Error parsing the DRBD status file")
1618
CV_ENODEDRBDVERSION = \
1619
  (CV_TNODE, "ENODEDRBDVERSION", "DRBD version mismatch within a node group")
1620
CV_ENODEDRBDHELPER = \
1621
  (CV_TNODE, "ENODEDRBDHELPER", "Error caused by the DRBD helper")
1622
CV_ENODEFILECHECK = \
1623
  (CV_TNODE, "ENODEFILECHECK",
1624
   "Error retrieving the checksum of the node files")
1625
CV_ENODEHOOKS = \
1626
  (CV_TNODE, "ENODEHOOKS", "Communication failure in hooks execution")
1627
CV_ENODEHV = \
1628
  (CV_TNODE, "ENODEHV", "Hypervisor parameters verification failure")
1629
CV_ENODELVM = \
1630
  (CV_TNODE, "ENODELVM", "LVM-related node error")
1631
CV_ENODEN1 = \
1632
  (CV_TNODE, "ENODEN1", "Not enough memory to accommodate instance failovers")
1633
CV_ENODENET = \
1634
  (CV_TNODE, "ENODENET", "Network-related node error")
1635
CV_ENODEOS = \
1636
  (CV_TNODE, "ENODEOS", "OS-related node error")
1637
CV_ENODEORPHANINSTANCE = \
1638
  (CV_TNODE, "ENODEORPHANINSTANCE", "Unknown intance running on a node")
1639
CV_ENODEORPHANLV = \
1640
  (CV_TNODE, "ENODEORPHANLV", "Unknown LVM logical volume")
1641
CV_ENODERPC = \
1642
  (CV_TNODE, "ENODERPC",
1643
   "Error during connection to the primary node of an instance")
1644
CV_ENODESSH = \
1645
  (CV_TNODE, "ENODESSH", "SSH-related node error")
1646
CV_ENODEVERSION = \
1647
  (CV_TNODE, "ENODEVERSION",
1648
   "Protocol version mismatch or Ganeti version mismatch")
1649
CV_ENODESETUP = \
1650
  (CV_TNODE, "ENODESETUP", "Node setup error")
1651
CV_ENODETIME = \
1652
  (CV_TNODE, "ENODETIME", "Node returned invalid time")
1653
CV_ENODEOOBPATH = \
1654
  (CV_TNODE, "ENODEOOBPATH", "Invalid Out Of Band path")
1655
CV_ENODEUSERSCRIPTS = \
1656
  (CV_TNODE, "ENODEUSERSCRIPTS", "User scripts not present or not executable")
1657
CV_ENODEFILESTORAGEPATHS = \
1658
  (CV_TNODE, "ENODEFILESTORAGEPATHS", "Detected bad file storage paths")
1659
CV_ENODEFILESTORAGEPATHUNUSABLE = \
1660
  (CV_TNODE, "ENODEFILESTORAGEPATHUNUSABLE", "File storage path unusable")
1661

    
1662
CV_ALL_ECODES = compat.UniqueFrozenset([
1663
  CV_ECLUSTERCFG,
1664
  CV_ECLUSTERCERT,
1665
  CV_ECLUSTERFILECHECK,
1666
  CV_ECLUSTERDANGLINGNODES,
1667
  CV_ECLUSTERDANGLINGINST,
1668
  CV_EINSTANCEBADNODE,
1669
  CV_EINSTANCEDOWN,
1670
  CV_EINSTANCELAYOUT,
1671
  CV_EINSTANCEMISSINGDISK,
1672
  CV_EINSTANCEFAULTYDISK,
1673
  CV_EINSTANCEWRONGNODE,
1674
  CV_EINSTANCESPLITGROUPS,
1675
  CV_EINSTANCEPOLICY,
1676
  CV_ENODEDRBD,
1677
  CV_ENODEDRBDHELPER,
1678
  CV_ENODEFILECHECK,
1679
  CV_ENODEHOOKS,
1680
  CV_ENODEHV,
1681
  CV_ENODELVM,
1682
  CV_ENODEN1,
1683
  CV_ENODENET,
1684
  CV_ENODEOS,
1685
  CV_ENODEORPHANINSTANCE,
1686
  CV_ENODEORPHANLV,
1687
  CV_ENODERPC,
1688
  CV_ENODESSH,
1689
  CV_ENODEVERSION,
1690
  CV_ENODESETUP,
1691
  CV_ENODETIME,
1692
  CV_ENODEOOBPATH,
1693
  CV_ENODEUSERSCRIPTS,
1694
  CV_ENODEFILESTORAGEPATHS,
1695
  CV_ENODEFILESTORAGEPATHUNUSABLE,
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_XEN_CMD: XEN_CMD_XM,
2101
    },
2102
  HT_KVM: {
2103
    HV_KVM_PATH: KVM_PATH,
2104
    HV_KERNEL_PATH: KVM_KERNEL,
2105
    HV_INITRD_PATH: "",
2106
    HV_KERNEL_ARGS: "ro",
2107
    HV_ROOT_PATH: "/dev/vda1",
2108
    HV_ACPI: True,
2109
    HV_SERIAL_CONSOLE: True,
2110
    HV_SERIAL_SPEED: 38400,
2111
    HV_VNC_BIND_ADDRESS: "",
2112
    HV_VNC_TLS: False,
2113
    HV_VNC_X509: "",
2114
    HV_VNC_X509_VERIFY: False,
2115
    HV_VNC_PASSWORD_FILE: "",
2116
    HV_KVM_SPICE_BIND: "",
2117
    HV_KVM_SPICE_IP_VERSION: IFACE_NO_IP_VERSION_SPECIFIED,
2118
    HV_KVM_SPICE_PASSWORD_FILE: "",
2119
    HV_KVM_SPICE_LOSSLESS_IMG_COMPR: "",
2120
    HV_KVM_SPICE_JPEG_IMG_COMPR: "",
2121
    HV_KVM_SPICE_ZLIB_GLZ_IMG_COMPR: "",
2122
    HV_KVM_SPICE_STREAMING_VIDEO_DETECTION: "",
2123
    HV_KVM_SPICE_AUDIO_COMPR: True,
2124
    HV_KVM_SPICE_USE_TLS: False,
2125
    HV_KVM_SPICE_TLS_CIPHERS: OPENSSL_CIPHERS,
2126
    HV_KVM_SPICE_USE_VDAGENT: True,
2127
    HV_KVM_FLOPPY_IMAGE_PATH: "",
2128
    HV_CDROM_IMAGE_PATH: "",
2129
    HV_KVM_CDROM2_IMAGE_PATH: "",
2130
    HV_BOOT_ORDER: HT_BO_DISK,
2131
    HV_NIC_TYPE: HT_NIC_PARAVIRTUAL,
2132
    HV_DISK_TYPE: HT_DISK_PARAVIRTUAL,
2133
    HV_KVM_CDROM_DISK_TYPE: "",
2134
    HV_USB_MOUSE: "",
2135
    HV_KEYMAP: "",
2136
    HV_MIGRATION_PORT: 8102,
2137
    HV_MIGRATION_BANDWIDTH: 32, # MiB/s
2138
    HV_MIGRATION_DOWNTIME: 30,  # ms
2139
    HV_MIGRATION_MODE: HT_MIGRATION_LIVE,
2140
    HV_USE_LOCALTIME: False,
2141
    HV_DISK_CACHE: HT_CACHE_DEFAULT,
2142
    HV_SECURITY_MODEL: HT_SM_NONE,
2143
    HV_SECURITY_DOMAIN: "",
2144
    HV_KVM_FLAG: "",
2145
    HV_VHOST_NET: False,
2146
    HV_KVM_USE_CHROOT: False,
2147
    HV_MEM_PATH: "",
2148
    HV_REBOOT_BEHAVIOR: INSTANCE_REBOOT_ALLOWED,
2149
    HV_CPU_MASK: CPU_PINNING_ALL,
2150
    HV_CPU_TYPE: "",
2151
    HV_CPU_CORES: 0,
2152
    HV_CPU_THREADS: 0,
2153
    HV_CPU_SOCKETS: 0,
2154
    HV_SOUNDHW: "",
2155
    HV_USB_DEVICES: "",
2156
    HV_VGA: "",
2157
    HV_KVM_EXTRA: "",
2158
    HV_KVM_MACHINE_VERSION: "",
2159
    },
2160
  HT_FAKE: {
2161
    HV_MIGRATION_MODE: HT_MIGRATION_LIVE,
2162
  },
2163
  HT_CHROOT: {
2164
    HV_INIT_SCRIPT: "/ganeti-chroot",
2165
    },
2166
  HT_LXC: {
2167
    HV_CPU_MASK: "",
2168
    },
2169
  }
2170

    
2171
HVC_GLOBALS = compat.UniqueFrozenset([
2172
  HV_MIGRATION_PORT,
2173
  HV_MIGRATION_BANDWIDTH,
2174
  HV_MIGRATION_MODE,
2175
  HV_XEN_CMD,
2176
  ])
2177

    
2178
BEC_DEFAULTS = {
2179
  BE_MINMEM: 128,
2180
  BE_MAXMEM: 128,
2181
  BE_VCPUS: 1,
2182
  BE_AUTO_BALANCE: True,
2183
  BE_ALWAYS_FAILOVER: False,
2184
  BE_SPINDLE_USE: 1,
2185
  }
2186

    
2187
NDC_DEFAULTS = {
2188
  ND_OOB_PROGRAM: "",
2189
  ND_SPINDLE_COUNT: 1,
2190
  ND_EXCLUSIVE_STORAGE: False,
2191
  }
2192

    
2193
NDC_GLOBALS = compat.UniqueFrozenset([
2194
  ND_EXCLUSIVE_STORAGE,
2195
  ])
2196

    
2197
DISK_LD_DEFAULTS = {
2198
  LD_DRBD8: {
2199
    LDP_RESYNC_RATE: CLASSIC_DRBD_SYNC_SPEED,
2200
    LDP_BARRIERS: _autoconf.DRBD_BARRIERS,
2201
    LDP_NO_META_FLUSH: _autoconf.DRBD_NO_META_FLUSH,
2202
    LDP_DEFAULT_METAVG: DEFAULT_VG,
2203
    LDP_DISK_CUSTOM: "",
2204
    LDP_NET_CUSTOM: "",
2205
    LDP_PROTOCOL: DRBD_DEFAULT_NET_PROTOCOL,
2206
    LDP_DYNAMIC_RESYNC: False,
2207

    
2208
    # The default values for the DRBD dynamic resync speed algorithm
2209
    # are taken from the drbsetup 8.3.11 man page, except for
2210
    # c-plan-ahead (that we don't need to set to 0, because we have a
2211
    # separate option to enable it) and for c-max-rate, that we cap to
2212
    # the default value for the static resync rate.
2213
    LDP_PLAN_AHEAD: 20, # ds
2214
    LDP_FILL_TARGET: 0, # sectors
2215
    LDP_DELAY_TARGET: 1, # ds
2216
    LDP_MAX_RATE: CLASSIC_DRBD_SYNC_SPEED, # KiB/s
2217
    LDP_MIN_RATE: 4 * 1024, # KiB/s
2218
    },
2219
  LD_LV: {
2220
    LDP_STRIPES: _autoconf.LVM_STRIPECOUNT
2221
    },
2222
  LD_FILE: {},
2223
  LD_BLOCKDEV: {},
2224
  LD_RBD: {
2225
    LDP_POOL: "rbd"
2226
    },
2227
  LD_EXT: {},
2228
  }
2229

    
2230
# readability shortcuts
2231
_LV_DEFAULTS = DISK_LD_DEFAULTS[LD_LV]
2232
_DRBD_DEFAULTS = DISK_LD_DEFAULTS[LD_DRBD8]
2233

    
2234
DISK_DT_DEFAULTS = {
2235
  DT_PLAIN: {
2236
    LV_STRIPES: DISK_LD_DEFAULTS[LD_LV][LDP_STRIPES],
2237
    },
2238
  DT_DRBD8: {
2239
    DRBD_RESYNC_RATE: _DRBD_DEFAULTS[LDP_RESYNC_RATE],
2240
    DRBD_DATA_STRIPES: _LV_DEFAULTS[LDP_STRIPES],
2241
    DRBD_META_STRIPES: _LV_DEFAULTS[LDP_STRIPES],
2242
    DRBD_DISK_BARRIERS: _DRBD_DEFAULTS[LDP_BARRIERS],
2243
    DRBD_META_BARRIERS: _DRBD_DEFAULTS[LDP_NO_META_FLUSH],
2244
    DRBD_DEFAULT_METAVG: _DRBD_DEFAULTS[LDP_DEFAULT_METAVG],
2245
    DRBD_DISK_CUSTOM: _DRBD_DEFAULTS[LDP_DISK_CUSTOM],
2246
    DRBD_NET_CUSTOM: _DRBD_DEFAULTS[LDP_NET_CUSTOM],
2247
    DRBD_PROTOCOL: _DRBD_DEFAULTS[LDP_PROTOCOL],
2248
    DRBD_DYNAMIC_RESYNC: _DRBD_DEFAULTS[LDP_DYNAMIC_RESYNC],
2249
    DRBD_PLAN_AHEAD: _DRBD_DEFAULTS[LDP_PLAN_AHEAD],
2250
    DRBD_FILL_TARGET: _DRBD_DEFAULTS[LDP_FILL_TARGET],
2251
    DRBD_DELAY_TARGET: _DRBD_DEFAULTS[LDP_DELAY_TARGET],
2252
    DRBD_MAX_RATE: _DRBD_DEFAULTS[LDP_MAX_RATE],
2253
    DRBD_MIN_RATE: _DRBD_DEFAULTS[LDP_MIN_RATE],
2254
    },
2255
  DT_DISKLESS: {},
2256
  DT_FILE: {},
2257
  DT_SHARED_FILE: {},
2258
  DT_BLOCK: {},
2259
  DT_RBD: {
2260
    RBD_POOL: DISK_LD_DEFAULTS[LD_RBD][LDP_POOL]
2261
    },
2262
  DT_EXT: {},
2263
  }
2264

    
2265
# we don't want to export the shortcuts
2266
del _LV_DEFAULTS, _DRBD_DEFAULTS
2267

    
2268
NICC_DEFAULTS = {
2269
  NIC_MODE: NIC_MODE_BRIDGED,
2270
  NIC_LINK: DEFAULT_BRIDGE,
2271
  }
2272

    
2273
# All of the following values are quite arbitrarily - there are no
2274
# "good" defaults, these must be customised per-site
2275
ISPECS_MINMAX_DEFAULTS = {
2276
  ISPECS_MIN: {
2277
    ISPEC_MEM_SIZE: 128,
2278
    ISPEC_CPU_COUNT: 1,
2279
    ISPEC_DISK_COUNT: 1,
2280
    ISPEC_DISK_SIZE: 1024,
2281
    ISPEC_NIC_COUNT: 1,
2282
    ISPEC_SPINDLE_USE: 1,
2283
    },
2284
  ISPECS_MAX: {
2285
    ISPEC_MEM_SIZE: 32768,
2286
    ISPEC_CPU_COUNT: 8,
2287
    ISPEC_DISK_COUNT: MAX_DISKS,
2288
    ISPEC_DISK_SIZE: 1024 * 1024,
2289
    ISPEC_NIC_COUNT: MAX_NICS,
2290
    ISPEC_SPINDLE_USE: 12,
2291
    },
2292
  }
2293
IPOLICY_DEFAULTS = {
2294
  ISPECS_MINMAX: [ISPECS_MINMAX_DEFAULTS],
2295
  ISPECS_STD: {
2296
    ISPEC_MEM_SIZE: 128,
2297
    ISPEC_CPU_COUNT: 1,
2298
    ISPEC_DISK_COUNT: 1,
2299
    ISPEC_DISK_SIZE: 1024,
2300
    ISPEC_NIC_COUNT: 1,
2301
    ISPEC_SPINDLE_USE: 1,
2302
    },
2303
  IPOLICY_DTS: list(DISK_TEMPLATES),
2304
  IPOLICY_VCPU_RATIO: 4.0,
2305
  IPOLICY_SPINDLE_RATIO: 32.0,
2306
  }
2307

    
2308
MASTER_POOL_SIZE_DEFAULT = 10
2309

    
2310
# Exclusive storage:
2311
# Error margin used to compare physical disks
2312
PART_MARGIN = .01
2313
# Space reserved when creating instance disks
2314
PART_RESERVED = .02
2315

    
2316
CONFD_PROTOCOL_VERSION = 1
2317

    
2318
CONFD_REQ_PING = 0
2319
CONFD_REQ_NODE_ROLE_BYNAME = 1
2320
CONFD_REQ_NODE_PIP_BY_INSTANCE_IP = 2
2321
CONFD_REQ_CLUSTER_MASTER = 3
2322
CONFD_REQ_NODE_PIP_LIST = 4
2323
CONFD_REQ_MC_PIP_LIST = 5
2324
CONFD_REQ_INSTANCES_IPS_LIST = 6
2325
CONFD_REQ_NODE_DRBD = 7
2326
CONFD_REQ_NODE_INSTANCES = 8
2327

    
2328
# Confd request query fields. These are used to narrow down queries.
2329
# These must be strings rather than integers, because json-encoding
2330
# converts them to strings anyway, as they're used as dict-keys.
2331
CONFD_REQQ_LINK = "0"
2332
CONFD_REQQ_IP = "1"
2333
CONFD_REQQ_IPLIST = "2"
2334
CONFD_REQQ_FIELDS = "3"
2335

    
2336
CONFD_REQFIELD_NAME = "0"
2337
CONFD_REQFIELD_IP = "1"
2338
CONFD_REQFIELD_MNODE_PIP = "2"
2339

    
2340
CONFD_REQS = compat.UniqueFrozenset([
2341
  CONFD_REQ_PING,
2342
  CONFD_REQ_NODE_ROLE_BYNAME,
2343
  CONFD_REQ_NODE_PIP_BY_INSTANCE_IP,
2344
  CONFD_REQ_CLUSTER_MASTER,
2345
  CONFD_REQ_NODE_PIP_LIST,
2346
  CONFD_REQ_MC_PIP_LIST,
2347
  CONFD_REQ_INSTANCES_IPS_LIST,
2348
  CONFD_REQ_NODE_DRBD,
2349
  ])
2350

    
2351
CONFD_REPL_STATUS_OK = 0
2352
CONFD_REPL_STATUS_ERROR = 1
2353
CONFD_REPL_STATUS_NOTIMPLEMENTED = 2
2354

    
2355
CONFD_REPL_STATUSES = compat.UniqueFrozenset([
2356
  CONFD_REPL_STATUS_OK,
2357
  CONFD_REPL_STATUS_ERROR,
2358
  CONFD_REPL_STATUS_NOTIMPLEMENTED,
2359
  ])
2360

    
2361
(CONFD_NODE_ROLE_MASTER,
2362
 CONFD_NODE_ROLE_CANDIDATE,
2363
 CONFD_NODE_ROLE_OFFLINE,
2364
 CONFD_NODE_ROLE_DRAINED,
2365
 CONFD_NODE_ROLE_REGULAR,
2366
 ) = range(5)
2367

    
2368
# A few common errors for confd
2369
CONFD_ERROR_UNKNOWN_ENTRY = 1
2370
CONFD_ERROR_INTERNAL = 2
2371
CONFD_ERROR_ARGUMENT = 3
2372

    
2373
# Each request is "salted" by the current timestamp.
2374
# This constants decides how many seconds of skew to accept.
2375
# TODO: make this a default and allow the value to be more configurable
2376
CONFD_MAX_CLOCK_SKEW = 2 * NODE_MAX_CLOCK_SKEW
2377

    
2378
# When we haven't reloaded the config for more than this amount of
2379
# seconds, we force a test to see if inotify is betraying us. Using a
2380
# prime number to ensure we get less chance of 'same wakeup' with
2381
# other processes.
2382
CONFD_CONFIG_RELOAD_TIMEOUT = 17
2383

    
2384
# If we receive more than one update in this amount of microseconds,
2385
# we move to polling every RATELIMIT seconds, rather than relying on
2386
# inotify, to be able to serve more requests.
2387
CONFD_CONFIG_RELOAD_RATELIMIT = 250000
2388

    
2389
# Magic number prepended to all confd queries.
2390
# This allows us to distinguish different types of confd protocols and handle
2391
# them. For example by changing this we can move the whole payload to be
2392
# compressed, or move away from json.
2393
CONFD_MAGIC_FOURCC = "plj0"
2394

    
2395
# By default a confd request is sent to the minimum between this number and all
2396
# MCs. 6 was chosen because even in the case of a disastrous 50% response rate,
2397
# we should have enough answers to be able to compare more than one.
2398
CONFD_DEFAULT_REQ_COVERAGE = 6
2399

    
2400
# Timeout in seconds to expire pending query request in the confd client
2401
# library. We don't actually expect any answer more than 10 seconds after we
2402
# sent a request.
2403
CONFD_CLIENT_EXPIRE_TIMEOUT = 10
2404

    
2405
# Maximum UDP datagram size.
2406
# On IPv4: 64K - 20 (ip header size) - 8 (udp header size) = 65507
2407
# On IPv6: 64K - 40 (ip6 header size) - 8 (udp header size) = 65487
2408
#   (assuming we can't use jumbo frames)
2409
# We just set this to 60K, which should be enough
2410
MAX_UDP_DATA_SIZE = 61440
2411

    
2412
# User-id pool minimum/maximum acceptable user-ids.
2413
UIDPOOL_UID_MIN = 0
2414
UIDPOOL_UID_MAX = 2 ** 32 - 1 # Assuming 32 bit user-ids
2415

    
2416
# Name or path of the pgrep command
2417
PGREP = "pgrep"
2418

    
2419
# Name of the node group that gets created at cluster init or upgrade
2420
INITIAL_NODE_GROUP_NAME = "default"
2421

    
2422
# Possible values for NodeGroup.alloc_policy
2423
ALLOC_POLICY_PREFERRED = "preferred"
2424
ALLOC_POLICY_LAST_RESORT = "last_resort"
2425
ALLOC_POLICY_UNALLOCABLE = "unallocable"
2426
VALID_ALLOC_POLICIES = [
2427
  ALLOC_POLICY_PREFERRED,
2428
  ALLOC_POLICY_LAST_RESORT,
2429
  ALLOC_POLICY_UNALLOCABLE,
2430
  ]
2431

    
2432
# Temporary external/shared storage parameters
2433
BLOCKDEV_DRIVER_MANUAL = "manual"
2434

    
2435
# qemu-img path, required for ovfconverter
2436
QEMUIMG_PATH = _autoconf.QEMUIMG_PATH
2437

    
2438
# Whether htools was enabled at compilation time
2439
HTOOLS = _autoconf.HTOOLS
2440
# The hail iallocator
2441
IALLOC_HAIL = "hail"
2442

    
2443
# Fake opcodes for functions that have hooks attached to them via
2444
# backend.RunLocalHooks
2445
FAKE_OP_MASTER_TURNUP = "OP_CLUSTER_IP_TURNUP"
2446
FAKE_OP_MASTER_TURNDOWN = "OP_CLUSTER_IP_TURNDOWN"
2447

    
2448
# SSH key types
2449
SSHK_RSA = "rsa"
2450
SSHK_DSA = "dsa"
2451
SSHK_ALL = compat.UniqueFrozenset([SSHK_RSA, SSHK_DSA])
2452

    
2453
# SSH authorized key types
2454
SSHAK_RSA = "ssh-rsa"
2455
SSHAK_DSS = "ssh-dss"
2456
SSHAK_ALL = compat.UniqueFrozenset([SSHAK_RSA, SSHAK_DSS])
2457

    
2458
# SSH setup
2459
SSHS_CLUSTER_NAME = "cluster_name"
2460
SSHS_SSH_HOST_KEY = "ssh_host_key"
2461
SSHS_SSH_ROOT_KEY = "ssh_root_key"
2462
SSHS_NODE_DAEMON_CERTIFICATE = "node_daemon_certificate"
2463

    
2464
#: Key files for SSH daemon
2465
SSH_DAEMON_KEYFILES = {
2466
  SSHK_RSA: (pathutils.SSH_HOST_RSA_PRIV, pathutils.SSH_HOST_RSA_PUB),
2467
  SSHK_DSA: (pathutils.SSH_HOST_DSA_PRIV, pathutils.SSH_HOST_DSA_PUB),
2468
  }
2469

    
2470
# Node daemon setup
2471
NDS_CLUSTER_NAME = "cluster_name"
2472
NDS_NODE_DAEMON_CERTIFICATE = "node_daemon_certificate"
2473
NDS_SSCONF = "ssconf"
2474
NDS_START_NODE_DAEMON = "start_node_daemon"
2475

    
2476
# Path generating random UUID
2477
RANDOM_UUID_FILE = "/proc/sys/kernel/random/uuid"
2478

    
2479
# Regex string for verifying a UUID
2480
UUID_REGEX = "^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$"
2481

    
2482
# Auto-repair tag prefixes
2483
AUTO_REPAIR_TAG_PREFIX = "ganeti:watcher:autorepair:"
2484
AUTO_REPAIR_TAG_ENABLED = AUTO_REPAIR_TAG_PREFIX
2485
AUTO_REPAIR_TAG_SUSPENDED = AUTO_REPAIR_TAG_ENABLED + "suspend:"
2486
AUTO_REPAIR_TAG_PENDING = AUTO_REPAIR_TAG_PREFIX + "pending:"
2487
AUTO_REPAIR_TAG_RESULT = AUTO_REPAIR_TAG_PREFIX + "result:"
2488

    
2489
# Auto-repair levels
2490
AUTO_REPAIR_FIX_STORAGE = "fix-storage"
2491
AUTO_REPAIR_MIGRATE = "migrate"
2492
AUTO_REPAIR_FAILOVER = "failover"
2493
AUTO_REPAIR_REINSTALL = "reinstall"
2494
AUTO_REPAIR_ALL_TYPES = [
2495
  AUTO_REPAIR_FIX_STORAGE,
2496
  AUTO_REPAIR_MIGRATE,
2497
  AUTO_REPAIR_FAILOVER,
2498
  AUTO_REPAIR_REINSTALL,
2499
]
2500

    
2501
# Auto-repair results
2502
AUTO_REPAIR_SUCCESS = "success"
2503
AUTO_REPAIR_FAILURE = "failure"
2504
AUTO_REPAIR_ENOPERM = "enoperm"
2505
AUTO_REPAIR_ALL_RESULTS = frozenset([
2506
    AUTO_REPAIR_SUCCESS,
2507
    AUTO_REPAIR_FAILURE,
2508
    AUTO_REPAIR_ENOPERM,
2509
])
2510

    
2511
# The version identifier for builtin data collectors
2512
BUILTIN_DATA_COLLECTOR_VERSION = "B"
2513

    
2514
# The reason trail opcode parameter name
2515
OPCODE_REASON = "reason"
2516

    
2517
# The source reasons for the execution of an OpCode
2518
OPCODE_REASON_SRC_CLIENT = "gnt:client"
2519
OPCODE_REASON_SRC_NODED = "gnt:daemon:noded"
2520
OPCODE_REASON_SRC_OPCODE = "gnt:opcode"
2521
OPCODE_REASON_SRC_RLIB2 = "gnt:library:rlib2"
2522
OPCODE_REASON_SRC_USER = "gnt:user"
2523

    
2524
OPCODE_REASON_SOURCES = compat.UniqueFrozenset([
2525
  OPCODE_REASON_SRC_CLIENT,
2526
  OPCODE_REASON_SRC_NODED,
2527
  OPCODE_REASON_SRC_OPCODE,
2528
  OPCODE_REASON_SRC_RLIB2,
2529
  OPCODE_REASON_SRC_USER,
2530
  ])
2531

    
2532
DISKSTATS_FILE = "/proc/diskstats"
2533

    
2534
# Do not re-export imported modules
2535
del re, _vcsversion, _autoconf, socket, pathutils, compat