constants.py 23.1 KB
Newer Older
Iustin Pop's avatar
Iustin Pop committed
1
#
Iustin Pop's avatar
Iustin Pop committed
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#

# Copyright (C) 2006, 2007 Google Inc.
#
# 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
25
import re

26
from ganeti import _autoconf
27

Iustin Pop's avatar
Iustin Pop committed
28
# various versions
29
PROTOCOL_VERSION = 30
30
RELEASE_VERSION = _autoconf.PACKAGE_VERSION
Guido Trotter's avatar
Guido Trotter committed
31
32
33
OS_API_V10 = 10
OS_API_V15 = 15
OS_API_VERSIONS = frozenset([OS_API_V10, OS_API_V15])
Iustin Pop's avatar
Iustin Pop committed
34
EXPORT_VERSION = 0
35
RAPI_VERSION = 2
Iustin Pop's avatar
Iustin Pop committed
36

37

38
39
40
41
42
43
44
45
# Format for CONFIG_VERSION:
#   01 03 0123 = 01030123
#   ^^ ^^ ^^^^
#   |  |  + Configuration version/revision
#   |  + Minor version
#   + Major version
#
# It stored as an integer. Make sure not to write an octal number.
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79

# 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)


80
81
82
CONFIG_MAJOR = int(_autoconf.VERSION_MAJOR)
CONFIG_MINOR = int(_autoconf.VERSION_MINOR)
CONFIG_REVISION = 0
83
CONFIG_VERSION = BuildVersion(CONFIG_MAJOR, CONFIG_MINOR, CONFIG_REVISION)
Iustin Pop's avatar
Iustin Pop committed
84
85

# file paths
86
DATA_DIR = _autoconf.LOCALSTATEDIR + "/lib/ganeti"
87
RUN_DIR = _autoconf.LOCALSTATEDIR + "/run"
88
RUN_GANETI_DIR = RUN_DIR + "/ganeti"
89
BDEV_CACHE_DIR = RUN_GANETI_DIR + "/bdev-cache"
90
DISK_LINKS_DIR = RUN_GANETI_DIR + "/instance-disks"
91
RUN_DIRS_MODE = 0755
Guido Trotter's avatar
Guido Trotter committed
92
SOCKET_DIR = RUN_GANETI_DIR + "/socket"
Guido Trotter's avatar
Guido Trotter committed
93
SOCKET_DIR_MODE = 0700
94
95
CRYPTO_KEYS_DIR = RUN_GANETI_DIR + "/crypto"
CRYPTO_KEYS_DIR_MODE = 0700
96
97
98
# keep RUN_GANETI_DIR first here, to make sure all get created when the node
# daemon is started (this takes care of RUN_DIR being tmpfs)
SUB_RUN_DIRS = [ RUN_GANETI_DIR, BDEV_CACHE_DIR, DISK_LINKS_DIR ]
Iustin Pop's avatar
Iustin Pop committed
99
LOCK_DIR = _autoconf.LOCALSTATEDIR + "/lock"
100
SSCONF_LOCK_FILE = LOCK_DIR + "/ganeti-ssconf.lock"
Iustin Pop's avatar
Iustin Pop committed
101
CLUSTER_CONF_FILE = DATA_DIR + "/config.data"
102
NODED_CERT_FILE = DATA_DIR + "/server.pem"
103
RAPI_CERT_FILE = DATA_DIR + "/rapi.pem"
104
CONFD_HMAC_KEY = DATA_DIR + "/hmac.key"
Michael Hanselmann's avatar
Michael Hanselmann committed
105
CLUSTER_DOMAIN_SECRET_FILE = DATA_DIR + "/cluster-domain-secret"
106
WATCHER_STATEFILE = DATA_DIR + "/watcher.data"
107
WATCHER_PAUSEFILE = DATA_DIR + "/watcher.pause"
108
INSTANCE_UPFILE = RUN_GANETI_DIR + "/instance-status"
Iustin Pop's avatar
Iustin Pop committed
109
SSH_KNOWN_HOSTS_FILE = DATA_DIR + "/known_hosts"
110
RAPI_USERS_FILE = DATA_DIR + "/rapi_users"
111
QUEUE_DIR = DATA_DIR + "/queue"
112
DAEMON_UTIL = _autoconf.PKGLIBDIR + "/daemon-util"
113
ETC_HOSTS = "/etc/hosts"
114
DEFAULT_FILE_STORAGE_DIR = _autoconf.FILE_STORAGE_DIR
115
ENABLE_FILE_STORAGE = _autoconf.ENABLE_FILE_STORAGE
116
SYSCONFDIR = _autoconf.SYSCONFDIR
117
TOOLSDIR = _autoconf.TOOLSDIR
118
CONF_DIR = SYSCONFDIR + "/ganeti"
119

120
ALL_CERT_FILES = frozenset([NODED_CERT_FILE, RAPI_CERT_FILE])
121

122
MASTER_SOCKET = SOCKET_DIR + "/ganeti-master"
Iustin Pop's avatar
Iustin Pop committed
123

124
NODED = "ganeti-noded"
Guido Trotter's avatar
Guido Trotter committed
125
CONFD = "ganeti-confd"
Guido Trotter's avatar
Guido Trotter committed
126
RAPI = "ganeti-rapi"
127
MASTERD = "ganeti-masterd"
Guido Trotter's avatar
Guido Trotter committed
128
129
# used in the ganeti-nbma project
NLD = "ganeti-nld"
130
131
132
133

DAEMONS_PORTS = {
  # daemon-name: ("proto", "default-port")
  NODED: ("tcp", 1811),
Guido Trotter's avatar
Guido Trotter committed
134
  CONFD: ("udp", 1814),
Guido Trotter's avatar
Guido Trotter committed
135
  RAPI: ("tcp", 5080),
Guido Trotter's avatar
Guido Trotter committed
136
137
  # used in the ganeti-nbma project
  NLD: ("udp", 1816),
138
139
}
DEFAULT_NODED_PORT = DAEMONS_PORTS[NODED][1]
Guido Trotter's avatar
Guido Trotter committed
140
DEFAULT_CONFD_PORT = DAEMONS_PORTS[CONFD][1]
Guido Trotter's avatar
Guido Trotter committed
141
DEFAULT_RAPI_PORT = DAEMONS_PORTS[RAPI][1]
Guido Trotter's avatar
Guido Trotter committed
142
143
# used in the ganeti-nbma project
DEFAULT_NLD_PORT = DAEMONS_PORTS[NLD][1]
144

Iustin Pop's avatar
Iustin Pop committed
145
146
FIRST_DRBD_PORT = 11000
LAST_DRBD_PORT = 14999
147
MASTER_SCRIPT = "ganeti-master"
Iustin Pop's avatar
Iustin Pop committed
148

149
LOG_DIR = _autoconf.LOCALSTATEDIR + "/log/ganeti/"
150
DAEMONS_LOGFILES = {
Michael Hanselmann's avatar
Michael Hanselmann committed
151
152
153
154
155
  # "daemon-name": "logfile"
  NODED: LOG_DIR + "node-daemon.log",
  CONFD: LOG_DIR + "conf-daemon.log",
  RAPI: LOG_DIR + "rapi-daemon.log",
  MASTERD: LOG_DIR + "master-daemon.log",
Guido Trotter's avatar
Guido Trotter committed
156
157
  # used in the ganeti-nbma project
  NLD: LOG_DIR + "nl-daemon.log",
Michael Hanselmann's avatar
Michael Hanselmann committed
158
  }
Michael Hanselmann's avatar
Michael Hanselmann committed
159

160
161
162
LOG_OS_DIR = LOG_DIR + "os"
LOG_WATCHER = LOG_DIR + "watcher.log"
LOG_COMMANDS = LOG_DIR + "commands.log"
Iustin Pop's avatar
Iustin Pop committed
163
LOG_BURNIN = LOG_DIR + "burnin.log"
Iustin Pop's avatar
Iustin Pop committed
164

165
166
167
168
169
170
171
# one of 'no', 'yes', 'only'
SYSLOG_USAGE = _autoconf.SYSLOG_USAGE
SYSLOG_NO = "no"
SYSLOG_YES = "yes"
SYSLOG_ONLY = "only"
SYSLOG_SOCKET = "/dev/log"

172
OS_SEARCH_PATH = _autoconf.OS_SEARCH_PATH
173
EXPORT_DIR = _autoconf.EXPORT_DIR
Iustin Pop's avatar
Iustin Pop committed
174
175
176

EXPORT_CONF_FILE = "config.ini"

177
XEN_BOOTLOADER = _autoconf.XEN_BOOTLOADER
178
179
180
XEN_KERNEL = _autoconf.XEN_KERNEL
XEN_INITRD = _autoconf.XEN_INITRD

181
KVM_PATH = _autoconf.KVM_PATH
Guido Trotter's avatar
Guido Trotter committed
182
SOCAT_PATH = _autoconf.SOCAT_PATH
183
SOCAT_USE_ESCAPE = _autoconf.SOCAT_USE_ESCAPE
184
SOCAT_ESCAPE_CODE = "0x1d"
185

186
187
188
189
190
191
192
193
# 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

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

194
195
X509_CERT_SIGNATURE_HEADER = "X-Ganeti-Signature"

196
197
198
199
200
201
IMPORT_EXPORT_DAEMON = _autoconf.PKGLIBDIR + "/import-export"

# Import/export daemon mode
IEM_IMPORT = "import"
IEM_EXPORT = "export"

202
VALUE_DEFAULT = "default"
203
204
VALUE_AUTO = "auto"
VALUE_GENERATE = "generate"
205
VALUE_NONE = "none"
206
207
VALUE_TRUE = "true"
VALUE_FALSE = "false"
208

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

Iustin Pop's avatar
Iustin Pop committed
212
# hooks-related constants
213
HOOKS_BASE_DIR = CONF_DIR + "/hooks"
Iustin Pop's avatar
Iustin Pop committed
214
215
HOOKS_PHASE_PRE = "pre"
HOOKS_PHASE_POST = "post"
216
HOOKS_NAME_CFGUPDATE = "config-update"
Guido Trotter's avatar
Guido Trotter committed
217
HOOKS_NAME_WATCHER = "watcher"
218
HOOKS_VERSION = 2
Iustin Pop's avatar
Iustin Pop committed
219
220
221
222
223
224
225
226
227
228

# hooks subject type (what object type does the LU deal with)
HTYPE_CLUSTER = "CLUSTER"
HTYPE_NODE = "NODE"
HTYPE_INSTANCE = "INSTANCE"

HKR_SKIP = 0
HKR_FAIL = 1
HKR_SUCCESS = 2

229
230
231
232
# Storage types
ST_FILE = "file"
ST_LVM_PV = "lvm-pv"
ST_LVM_VG = "lvm-vg"
233
234

# Storage fields
235
236
237
238
# 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
239
240
241
242
243
244
SF_NAME = "name"
SF_SIZE = "size"
SF_FREE = "free"
SF_USED = "used"
SF_ALLOCATABLE = "allocatable"

245
246
247
# Storage operations
SO_FIX_CONSISTENCY = "fix-consistency"

248
# Available fields per storage type
249
250
251
252
VALID_STORAGE_FIELDS = frozenset([SF_NAME, SF_TYPE, SF_SIZE,
                                  SF_USED, SF_FREE, SF_ALLOCATABLE])

VALID_STORAGE_TYPES = frozenset([ST_FILE, ST_LVM_PV, ST_LVM_VG])
Iustin Pop's avatar
Iustin Pop committed
253

254
255
256
257
MODIFIABLE_STORAGE_FIELDS = {
  ST_LVM_PV: frozenset([SF_ALLOCATABLE]),
  }

258
VALID_STORAGE_OPERATIONS = {
259
  ST_LVM_VG: frozenset([SO_FIX_CONSISTENCY]),
260
261
  }

262
263
264
265
266
267
# Local disk status
# Note: Code depends on LDS_OKAY < LDS_UNKNOWN < LDS_FAULTY
(LDS_OKAY,
 LDS_UNKNOWN,
 LDS_FAULTY) = range(1, 4)

Iustin Pop's avatar
Iustin Pop committed
268
269
270
# disk template types
DT_DISKLESS = "diskless"
DT_PLAIN = "plain"
271
DT_DRBD8 = "drbd"
272
DT_FILE = "file"
273
274

# the set of network-mirrored disk templates
275
DTS_NET_MIRROR = frozenset([DT_DRBD8])
Iustin Pop's avatar
Iustin Pop committed
276

277
278
279
# the set of non-lvm-based disk templates
DTS_NOT_LVM = frozenset([DT_DISKLESS, DT_FILE])

280
# the set of disk templates which can be grown
Guido Trotter's avatar
Guido Trotter committed
281
DTS_GROWABLE = frozenset([DT_PLAIN, DT_DRBD8, DT_FILE])
282

283
284
# logical disk types
LD_LV = "lvm"
285
LD_DRBD8 = "drbd8"
286
LD_FILE = "file"
287
LDS_BLOCK = frozenset([LD_LV, LD_DRBD8])
288

Iustin Pop's avatar
Iustin Pop committed
289
290
# drbd constants
DRBD_HMAC_ALG = "md5"
291
DRBD_NET_PROTOCOL = "C"
292
DRBD_BARRIERS = _autoconf.DRBD_BARRIERS
Iustin Pop's avatar
Iustin Pop committed
293

294
295
296
# file backend driver
FD_LOOP = "loop"
FD_BLKTAP = "blktap"
297
298

# the set of drbd-like disk types
299
LDS_DRBD = frozenset([LD_DRBD8])
300

301
# disk access mode
302
303
DISK_RDONLY = "ro"
DISK_RDWR = "rw"
304
305
DISK_ACCESS_SET = frozenset([DISK_RDONLY, DISK_RDWR])

306
# disk replacement mode
307
308
309
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
310
REPLACE_DISK_AUTO = "replace_auto"
311

312
313
# lock recalculate mode
LOCKS_REPLACE = 'replace'
314
LOCKS_APPEND = 'append'
315

316
# instance creation modes
Iustin Pop's avatar
Iustin Pop committed
317
318
319
320
INSTANCE_CREATE = "create"
INSTANCE_IMPORT = "import"

DISK_TEMPLATES = frozenset([DT_DISKLESS, DT_PLAIN,
321
322
323
                            DT_DRBD8, DT_FILE])

FILE_DRIVER = frozenset([FD_LOOP, FD_BLKTAP])
Iustin Pop's avatar
Iustin Pop committed
324
325
326
327

# import/export config options
INISECT_EXP = "export"
INISECT_INS = "instance"
328
329
INISECT_HYP = "hypervisor"
INISECT_BEP = "backend"
330

331
332
333
334
335
# dynamic device modification

DDM_ADD = 'add'
DDM_REMOVE = 'remove'

336
# common exit codes
Iustin Pop's avatar
Iustin Pop committed
337
EXIT_SUCCESS = 0
338
EXIT_FAILURE = 1
339
EXIT_NOTCLUSTER = 5
340
EXIT_NOTMASTER = 11
341
EXIT_NODESETUP_ERROR = 12
Iustin Pop's avatar
Iustin Pop committed
342
EXIT_CONFIRMATION = 13 # need user confirmation
Guido Trotter's avatar
Guido Trotter committed
343
EXIT_NOTCANDIDATE = 14
344

345
346
347
348
349
350
351
# tags
TAG_CLUSTER = "cluster"
TAG_NODE = "node"
TAG_INSTANCE = "instance"
MAX_TAG_LEN = 128
MAX_TAGS_PER_OBJ = 4096

352
353
# others
DEFAULT_BRIDGE = "xen-br0"
Iustin Pop's avatar
Iustin Pop committed
354
SYNC_SPEED = 60 * 1024
Iustin Pop's avatar
Iustin Pop committed
355
LOCALHOST_IP_ADDRESS = "127.0.0.1"
356
TCP_PING_TIMEOUT = 10
357
GANETI_RUNAS = "root"
358
DEFAULT_VG = "xenvg"
359
BIND_ADDRESS_GLOBAL = "0.0.0.0"
360
MIN_VG_SIZE = 20480
361
DEFAULT_MAC_PREFIX = "aa:00:00"
362
LVM_STRIPECOUNT = _autoconf.LVM_STRIPECOUNT
363
364
# default maximum instance wait time, in seconds.
DEFAULT_SHUTDOWN_TIMEOUT = 120
365
NODE_MAX_CLOCK_SKEW = 150
366

367
368
369
370
371
372
373
# runparts results
(RUNPARTS_SKIP,
 RUNPARTS_RUN,
 RUNPARTS_ERR) = range(3)

RUNPARTS_STATUS = frozenset([RUNPARTS_SKIP, RUNPARTS_RUN, RUNPARTS_ERR])

374
375
376
377
# RPC constants
(RPC_ENCODING_NONE,
 RPC_ENCODING_ZLIB_BASE64) = range(2)

378
379
380
381
382
# os related constants
OS_SCRIPT_CREATE = 'create'
OS_SCRIPT_IMPORT = 'import'
OS_SCRIPT_EXPORT = 'export'
OS_SCRIPT_RENAME = 'rename'
Iustin Pop's avatar
Iustin Pop committed
383
OS_SCRIPTS = frozenset([OS_SCRIPT_CREATE, OS_SCRIPT_IMPORT,
384
                        OS_SCRIPT_EXPORT, OS_SCRIPT_RENAME])
385

386
OS_API_FILE = 'ganeti_api_version'
387
OS_VARIANTS_FILE = 'variants.list'
388

389
# ssh constants
390
391
SSH_CONFIG_DIR = _autoconf.SSH_CONFIG_DIR
SSH_HOST_DSA_PRIV = SSH_CONFIG_DIR + "/ssh_host_dsa_key"
392
SSH_HOST_DSA_PUB = SSH_HOST_DSA_PRIV + ".pub"
393
SSH_HOST_RSA_PRIV = SSH_CONFIG_DIR + "/ssh_host_rsa_key"
394
SSH_HOST_RSA_PUB = SSH_HOST_RSA_PRIV + ".pub"
395
396
SSH = "ssh"
SCP = "scp"
397
398
399
400
401

# reboot types
INSTANCE_REBOOT_SOFT = "soft"
INSTANCE_REBOOT_HARD = "hard"
INSTANCE_REBOOT_FULL = "full"
402

403
404
405
406
REBOOT_TYPES = frozenset([INSTANCE_REBOOT_SOFT,
                          INSTANCE_REBOOT_HARD,
                          INSTANCE_REBOOT_FULL])

407
408
409
410
411
412
413
414
415
416
417
VTYPE_STRING = 'string'
VTYPE_BOOL = 'bool'
VTYPE_SIZE = 'size' # size, in MiBs
VTYPE_INT = 'int'
ENFORCEABLE_TYPES = frozenset([
                      VTYPE_STRING,
                      VTYPE_BOOL,
                      VTYPE_SIZE,
                      VTYPE_INT,
                      ])

418
419
420
421
422
423
# HV parameter names (global namespace)
HV_BOOT_ORDER = "boot_order"
HV_CDROM_IMAGE_PATH = "cdrom_image_path"
HV_NIC_TYPE = "nic_type"
HV_DISK_TYPE = "disk_type"
HV_VNC_BIND_ADDRESS = "vnc_bind_address"
424
HV_VNC_PASSWORD_FILE = "vnc_password_file"
425
426
427
HV_VNC_TLS = "vnc_tls"
HV_VNC_X509 = "vnc_x509_path"
HV_VNC_X509_VERIFY = "vnc_x509_verify"
428
429
HV_ACPI = "acpi"
HV_PAE = "pae"
430
431
432
HV_USE_BOOTLOADER = "use_bootloader"
HV_BOOTLOADER_ARGS = "bootloader_args"
HV_BOOTLOADER_PATH = "bootloader_path"
433
HV_KERNEL_ARGS = "kernel_args"
434
435
HV_KERNEL_PATH = "kernel_path"
HV_INITRD_PATH = "initrd_path"
436
HV_ROOT_PATH = "root_path"
437
HV_SERIAL_CONSOLE = "serial_console"
438
HV_USB_MOUSE = "usb_mouse"
439
HV_DEVICE_MODEL = "device_model"
440
HV_INIT_SCRIPT = "init_script"
441
HV_MIGRATION_PORT = "migration_port"
442
HV_USE_LOCALTIME = "use_localtime"
443
HV_DISK_CACHE = "disk_cache"
444
445
HV_SECURITY_MODEL = "security_model"
HV_SECURITY_DOMAIN = "security_domain"
Guido Trotter's avatar
Guido Trotter committed
446
HV_KVM_FLAG = "kvm_flag"
447

448
449
450
451
452
HVS_PARAMETER_TYPES = {
  HV_BOOT_ORDER: VTYPE_STRING,
  HV_CDROM_IMAGE_PATH: VTYPE_STRING,
  HV_NIC_TYPE: VTYPE_STRING,
  HV_DISK_TYPE: VTYPE_STRING,
453
  HV_VNC_PASSWORD_FILE: VTYPE_STRING,
454
455
456
457
458
459
  HV_VNC_BIND_ADDRESS: VTYPE_STRING,
  HV_VNC_TLS: VTYPE_BOOL,
  HV_VNC_X509: VTYPE_STRING,
  HV_VNC_X509_VERIFY: VTYPE_BOOL,
  HV_ACPI: VTYPE_BOOL,
  HV_PAE: VTYPE_BOOL,
460
461
462
  HV_USE_BOOTLOADER: VTYPE_BOOL,
  HV_BOOTLOADER_PATH: VTYPE_STRING,
  HV_BOOTLOADER_ARGS: VTYPE_STRING,
463
  HV_KERNEL_PATH: VTYPE_STRING,
464
  HV_KERNEL_ARGS: VTYPE_STRING,
465
466
467
468
  HV_INITRD_PATH: VTYPE_STRING,
  HV_ROOT_PATH: VTYPE_STRING,
  HV_SERIAL_CONSOLE: VTYPE_BOOL,
  HV_USB_MOUSE: VTYPE_STRING,
469
  HV_DEVICE_MODEL: VTYPE_STRING,
470
  HV_INIT_SCRIPT: VTYPE_STRING,
471
  HV_MIGRATION_PORT: VTYPE_INT,
472
  HV_USE_LOCALTIME: VTYPE_BOOL,
473
  HV_DISK_CACHE: VTYPE_STRING,
474
475
  HV_SECURITY_MODEL: VTYPE_STRING,
  HV_SECURITY_DOMAIN: VTYPE_STRING,
Guido Trotter's avatar
Guido Trotter committed
476
  HV_KVM_FLAG: VTYPE_STRING,
477
478
479
  }

HVS_PARAMETERS = frozenset(HVS_PARAMETER_TYPES.keys())
480

481
# BE parameter names
Iustin Pop's avatar
Iustin Pop committed
482
BE_MEMORY = "memory"
483
BE_VCPUS = "vcpus"
484
BE_AUTO_BALANCE = "auto_balance"
485

486
487
488
489
490
491
492
BES_PARAMETER_TYPES = {
    BE_MEMORY: VTYPE_SIZE,
    BE_VCPUS: VTYPE_INT,
    BE_AUTO_BALANCE: VTYPE_BOOL,
    }

BES_PARAMETERS = frozenset(BES_PARAMETER_TYPES.keys())
Iustin Pop's avatar
Iustin Pop committed
493

494
495
# Instance Parameters Profile
PP_DEFAULT = "default"
496

Guido Trotter's avatar
Guido Trotter committed
497
498
499
500
501
502
503
504
505
506
507
508
509
510
NIC_MODE = "mode"
NIC_LINK = "link"

NIC_MODE_BRIDGED = "bridged"
NIC_MODE_ROUTED = "routed"

NIC_VALID_MODES = frozenset([NIC_MODE_BRIDGED, NIC_MODE_ROUTED])

NICS_PARAMETER_TYPES = {
    NIC_MODE: VTYPE_STRING,
    NIC_LINK: VTYPE_STRING,
    }

NICS_PARAMETERS = frozenset(NICS_PARAMETER_TYPES.keys())
511

512
# Hypervisor constants
Iustin Pop's avatar
Iustin Pop committed
513
HT_XEN_PVM = "xen-pvm"
514
HT_FAKE = "fake"
Iustin Pop's avatar
Iustin Pop committed
515
HT_XEN_HVM = "xen-hvm"
Guido Trotter's avatar
Guido Trotter committed
516
HT_KVM = "kvm"
517
518
HT_CHROOT = "chroot"
HYPER_TYPES = frozenset([HT_XEN_PVM, HT_FAKE, HT_XEN_HVM, HT_KVM, HT_CHROOT])
Guido Trotter's avatar
Guido Trotter committed
519
HTS_REQ_PORT = frozenset([HT_XEN_HVM, HT_KVM])
520

521
VNC_BASE_PORT = 5900
522
VNC_PASSWORD_FILE = CONF_DIR + "/vnc-cluster-password"
523
VNC_DEFAULT_BIND_ADDRESS = '0.0.0.0'
524

525
# NIC types
526
527
528
HT_NIC_RTL8139 = "rtl8139"
HT_NIC_NE2K_PCI = "ne2k_pci"
HT_NIC_NE2K_ISA = "ne2k_isa"
529
530
531
532
533
HT_NIC_I82551 = "i82551"
HT_NIC_I85557B = "i82557b"
HT_NIC_I8259ER = "i82559er"
HT_NIC_PCNET = "pcnet"
HT_NIC_E1000 = "e1000"
534
HT_NIC_PARAVIRTUAL = HT_DISK_PARAVIRTUAL = "paravirtual"
535

536
537
HT_HVM_VALID_NIC_TYPES = frozenset([HT_NIC_RTL8139, HT_NIC_NE2K_PCI,
                                    HT_NIC_NE2K_ISA, HT_NIC_PARAVIRTUAL])
538
539
540
541
542
HT_KVM_VALID_NIC_TYPES = frozenset([HT_NIC_RTL8139, HT_NIC_NE2K_PCI,
                                    HT_NIC_NE2K_ISA, HT_NIC_I82551,
                                    HT_NIC_I85557B, HT_NIC_I8259ER,
                                    HT_NIC_PCNET, HT_NIC_E1000,
                                    HT_NIC_PARAVIRTUAL])
543
544
545
546
547
548
549
550
# Disk types
HT_DISK_IOEMU = "ioemu"
HT_DISK_IDE = "ide"
HT_DISK_SCSI = "scsi"
HT_DISK_SD = "sd"
HT_DISK_MTD = "mtd"
HT_DISK_PFLASH = "pflash"

551
552
553
554
555
556
557
558
559
HT_CACHE_DEFAULT = "default"
HT_CACHE_NONE = "none"
HT_CACHE_WTHROUGH = "writethrough"
HT_CACHE_WBACK = "writeback"
HT_VALID_CACHE_TYPES = frozenset([HT_CACHE_DEFAULT,
                                  HT_CACHE_NONE,
                                  HT_CACHE_WTHROUGH,
                                  HT_CACHE_WBACK])

560
HT_HVM_VALID_DISK_TYPES = frozenset([HT_DISK_PARAVIRTUAL, HT_DISK_IOEMU])
561
562
563
HT_KVM_VALID_DISK_TYPES = frozenset([HT_DISK_PARAVIRTUAL, HT_DISK_IDE,
                                     HT_DISK_SCSI, HT_DISK_SD, HT_DISK_MTD,
                                     HT_DISK_PFLASH])
564

565
566
567
568
569
570
571
572
573
574
575
576
577
# Mouse types:
HT_MOUSE_MOUSE = "mouse"
HT_MOUSE_TABLET = "tablet"

HT_KVM_VALID_MOUSE_TYPES = frozenset([HT_MOUSE_MOUSE, HT_MOUSE_TABLET])

# Boot order
HT_BO_CDROM = "cdrom"
HT_BO_DISK = "disk"
HT_BO_NETWORK = "network"

HT_KVM_VALID_BO_TYPES = frozenset([HT_BO_CDROM, HT_BO_DISK, HT_BO_NETWORK])

578
579
580
581
582
583
584
# Security models
HT_SM_NONE = "none"
HT_SM_USER = "user"
HT_SM_POOL = "pool"

HT_KVM_VALID_SM_TYPES = frozenset([HT_SM_NONE, HT_SM_USER, HT_SM_POOL])

Guido Trotter's avatar
Guido Trotter committed
585
586
587
588
589
590
# Kvm flag values
HT_KVM_ENABLED = "enabled"
HT_KVM_DISABLED = "disabled"

HT_KVM_FLAG_VALUES = frozenset([HT_KVM_ENABLED, HT_KVM_DISABLED])

591
592
593
594
# Cluster Verify steps
VERIFY_NPLUSONE_MEM = 'nplusone_mem'
VERIFY_OPTIONAL_CHECKS = frozenset([VERIFY_NPLUSONE_MEM])

595
596
597
598
599
600
601
602
603
# Node verify constants
NV_FILELIST = "filelist"
NV_HVINFO = "hvinfo"
NV_HYPERVISOR = "hypervisor"
NV_INSTANCELIST = "instancelist"
NV_NODELIST = "nodelist"
NV_NODENETTEST = "node-net-test"
NV_VERSION = "version"
NV_VGLIST = "vglist"
604
605
NV_LVLIST = "lvlist"
NV_PVLIST = "pvlist"
606
NV_DRBDLIST = "drbd-list"
607
NV_NODESETUP = "nodesetup"
608
NV_TIME = "time"
609

610
611
612
613
# SSL certificate check constants (in days)
SSL_CERT_EXPIRATION_WARN = 30
SSL_CERT_EXPIRATION_ERROR = 7

614
# Allocator framework constants
615
IALLOCATOR_VERSION = 2
616
617
618
619
IALLOCATOR_DIR_IN = "in"
IALLOCATOR_DIR_OUT = "out"
IALLOCATOR_MODE_ALLOC = "allocate"
IALLOCATOR_MODE_RELOC = "relocate"
620
IALLOCATOR_MODE_MEVAC = "multi-evacuate"
621
IALLOCATOR_SEARCH_PATH = _autoconf.IALLOCATOR_SEARCH_PATH
622

623
624
625
626
627
# Job queue
JOB_QUEUE_VERSION = 1
JOB_QUEUE_LOCK_FILE = QUEUE_DIR + "/lock"
JOB_QUEUE_VERSION_FILE = QUEUE_DIR + "/version"
JOB_QUEUE_SERIAL_FILE = QUEUE_DIR + "/serial"
628
JOB_QUEUE_ARCHIVE_DIR = QUEUE_DIR + "/archive"
629
JOB_QUEUE_DRAIN_FILE = QUEUE_DIR + "/drain"
Michael Hanselmann's avatar
Michael Hanselmann committed
630
631
JOB_QUEUE_SIZE_HARD_LIMIT = 5000
JOB_QUEUE_SIZE_SOFT_LIMIT = JOB_QUEUE_SIZE_HARD_LIMIT * 0.8
632

633
634
JOB_ID_TEMPLATE = r"\d+"

635
636
637
# unchanged job return
JOB_NOTCHANGED = "nochange"

638
639
# Job status
JOB_STATUS_QUEUED = "queued"
Iustin Pop's avatar
Iustin Pop committed
640
JOB_STATUS_WAITLOCK = "waiting"
641
JOB_STATUS_CANCELING = "canceling"
642
643
644
645
646
JOB_STATUS_RUNNING = "running"
JOB_STATUS_CANCELED = "canceled"
JOB_STATUS_SUCCESS = "success"
JOB_STATUS_ERROR = "error"

647
648
# OpCode status
# not yet finalized
649
OP_STATUS_QUEUED = "queued"
Iustin Pop's avatar
Iustin Pop committed
650
OP_STATUS_WAITLOCK = "waiting"
651
OP_STATUS_CANCELING = "canceling"
652
OP_STATUS_RUNNING = "running"
653
# finalized
654
OP_STATUS_CANCELED = "canceled"
655
656
OP_STATUS_SUCCESS = "success"
OP_STATUS_ERROR = "error"
657
658
659
OPS_FINALIZED = frozenset([OP_STATUS_CANCELED,
                           OP_STATUS_SUCCESS,
                           OP_STATUS_ERROR])
660
661
662
663

# Execution log types
ELOG_MESSAGE = "message"
ELOG_PROGRESS = "progress"
664

665
# max dynamic devices
666
667
668
MAX_NICS = 8
MAX_DISKS = 16

Iustin Pop's avatar
Iustin Pop committed
669
670
# SSCONF keys
SS_CLUSTER_NAME = "cluster_name"
671
SS_CLUSTER_TAGS = "cluster_tags"
Iustin Pop's avatar
Iustin Pop committed
672
SS_FILE_STORAGE_DIR = "file_storage_dir"
673
SS_MASTER_CANDIDATES = "master_candidates"
674
SS_MASTER_CANDIDATES_IPS = "master_candidates_ips"
Iustin Pop's avatar
Iustin Pop committed
675
676
677
678
SS_MASTER_IP = "master_ip"
SS_MASTER_NETDEV = "master_netdev"
SS_MASTER_NODE = "master_node"
SS_NODE_LIST = "node_list"
679
680
SS_NODE_PRIMARY_IPS = "node_primary_ips"
SS_NODE_SECONDARY_IPS = "node_secondary_ips"
681
SS_OFFLINE_NODES = "offline_nodes"
682
683
SS_ONLINE_NODES = "online_nodes"
SS_INSTANCE_LIST = "instance_list"
684
SS_RELEASE_VERSION = "release_version"
685
SS_HYPERVISOR_LIST = "hypervisor_list"
686
SS_MAINTAIN_NODE_HEALTH = "maintain_node_health"
Iustin Pop's avatar
Iustin Pop committed
687

688
689
690
691
# cluster wide default parameters
DEFAULT_ENABLED_HYPERVISOR = HT_XEN_PVM

HVC_DEFAULTS = {
692
  HT_XEN_PVM: {
693
694
695
    HV_USE_BOOTLOADER: False,
    HV_BOOTLOADER_PATH: XEN_BOOTLOADER,
    HV_BOOTLOADER_ARGS: '',
696
    HV_KERNEL_PATH: "/boot/vmlinuz-2.6-xenU",
697
    HV_INITRD_PATH: '',
698
    HV_ROOT_PATH: '/dev/sda1',
699
    HV_KERNEL_ARGS: 'ro',
700
    HV_MIGRATION_PORT: 8002,
701
702
703
    },
  HT_XEN_HVM: {
    HV_BOOT_ORDER: "cd",
704
    HV_CDROM_IMAGE_PATH: '',
705
    HV_NIC_TYPE: HT_NIC_RTL8139,
706
    HV_DISK_TYPE: HT_DISK_PARAVIRTUAL,
707
    HV_VNC_BIND_ADDRESS: '0.0.0.0',
708
    HV_VNC_PASSWORD_FILE: VNC_PASSWORD_FILE,
709
710
    HV_ACPI: True,
    HV_PAE: True,
711
    HV_KERNEL_PATH: "/usr/lib/xen/boot/hvmloader",
712
    HV_DEVICE_MODEL: "/usr/lib/xen/bin/qemu-dm",
713
    HV_MIGRATION_PORT: 8002,
714
    HV_USE_LOCALTIME: False,
715
716
717
    },
  HT_KVM: {
    HV_KERNEL_PATH: "/boot/vmlinuz-2.6-kvmU",
718
    HV_INITRD_PATH: '',
719
    HV_KERNEL_ARGS: 'ro',
720
    HV_ROOT_PATH: '/dev/vda1',
721
722
    HV_ACPI: True,
    HV_SERIAL_CONSOLE: True,
723
    HV_VNC_BIND_ADDRESS: '',
724
725
726
    HV_VNC_TLS: False,
    HV_VNC_X509: '',
    HV_VNC_X509_VERIFY: False,
727
    HV_VNC_PASSWORD_FILE: '',
728
    HV_CDROM_IMAGE_PATH: '',
729
    HV_BOOT_ORDER: HT_BO_DISK,
730
731
    HV_NIC_TYPE: HT_NIC_PARAVIRTUAL,
    HV_DISK_TYPE: HT_DISK_PARAVIRTUAL,
732
    HV_USB_MOUSE: '',
733
    HV_MIGRATION_PORT: 8102,
734
    HV_USE_LOCALTIME: False,
735
    HV_DISK_CACHE: HT_CACHE_DEFAULT,
736
737
    HV_SECURITY_MODEL: HT_SM_NONE,
    HV_SECURITY_DOMAIN: '',
Guido Trotter's avatar
Guido Trotter committed
738
    HV_KVM_FLAG: "",
739
740
741
    },
  HT_FAKE: {
    },
742
743
744
  HT_CHROOT: {
    HV_INIT_SCRIPT: "/ganeti-chroot",
    },
745
  }
746

747
748
749
750
HVC_GLOBALS = frozenset([
  HV_MIGRATION_PORT,
  ])

751
BEC_DEFAULTS = {
752
753
754
755
  BE_MEMORY: 128,
  BE_VCPUS: 1,
  BE_AUTO_BALANCE: True,
  }
756

Guido Trotter's avatar
Guido Trotter committed
757
758
759
760
761
NICC_DEFAULTS = {
  NIC_MODE: NIC_MODE_BRIDGED,
  NIC_LINK: DEFAULT_BRIDGE,
  }

762
MASTER_POOL_SIZE_DEFAULT = 10
Guido Trotter's avatar
Guido Trotter committed
763
764
765

CONFD_PROTOCOL_VERSION = 1

766
CONFD_REQ_PING = 0
Guido Trotter's avatar
Guido Trotter committed
767
768
CONFD_REQ_NODE_ROLE_BYNAME = 1
CONFD_REQ_NODE_PIP_BY_INSTANCE_IP = 2
769
CONFD_REQ_CLUSTER_MASTER = 3
770
771
CONFD_REQ_NODE_PIP_LIST = 4
CONFD_REQ_MC_PIP_LIST = 5
772
CONFD_REQ_INSTANCES_IPS_LIST = 6
Guido Trotter's avatar
Guido Trotter committed
773

774
775
776
777
778
779
# Confd request query fields. These are used to narrow down queries.
# These must be strings rather than integers, because json-encoding
# converts them to strings anyway, as they're used as dict-keys.
CONFD_REQQ_LINK = "0"
CONFD_REQQ_IP = "1"
CONFD_REQQ_IPLIST = "2"
780
781
782
783
CONFD_REQQ_FIELDS = "3"

CONFD_REQFIELD_NAME = "0"
CONFD_REQFIELD_IP = "1"
784
CONFD_REQFIELD_MNODE_PIP = "2"
785

Guido Trotter's avatar
Guido Trotter committed
786
CONFD_REQS = frozenset([
787
  CONFD_REQ_PING,
Guido Trotter's avatar
Guido Trotter committed
788
789
  CONFD_REQ_NODE_ROLE_BYNAME,
  CONFD_REQ_NODE_PIP_BY_INSTANCE_IP,
790
  CONFD_REQ_CLUSTER_MASTER,
791
792
  CONFD_REQ_NODE_PIP_LIST,
  CONFD_REQ_MC_PIP_LIST,
793
  CONFD_REQ_INSTANCES_IPS_LIST,
Guido Trotter's avatar
Guido Trotter committed
794
795
  ])

796
797
798
799
800
801
802
803
804
805
CONFD_REPL_STATUS_OK = 0
CONFD_REPL_STATUS_ERROR = 1
CONFD_REPL_STATUS_NOTIMPLEMENTED = 2

CONFD_REPL_STATUSES = frozenset([
  CONFD_REPL_STATUS_OK,
  CONFD_REPL_STATUS_ERROR,
  CONFD_REPL_STATUS_NOTIMPLEMENTED,
  ])

Guido Trotter's avatar
Guido Trotter committed
806
807
808
(CONFD_NODE_ROLE_MASTER,
 CONFD_NODE_ROLE_CANDIDATE,
 CONFD_NODE_ROLE_OFFLINE,
Guido Trotter's avatar
Guido Trotter committed
809
810
811
 CONFD_NODE_ROLE_DRAINED,
 CONFD_NODE_ROLE_REGULAR,
 ) = range(5)
Guido Trotter's avatar
Guido Trotter committed
812

813
814
# A few common errors for confd
CONFD_ERROR_UNKNOWN_ENTRY = 1
815
CONFD_ERROR_INTERNAL = 2
816
CONFD_ERROR_ARGUMENT = 3
817

Guido Trotter's avatar
Guido Trotter committed
818
819
820
# Each request is "salted" by the current timestamp.
# This constants decides how many seconds of skew to accept.
# TODO: make this a default and allow the value to be more configurable
821
CONFD_MAX_CLOCK_SKEW = 2 * NODE_MAX_CLOCK_SKEW
822
823
824
825
826
827
828
829
830

# When we haven't reloaded the config for more than this amount of seconds, we
# force a test to see if inotify is betraying us.
CONFD_CONFIG_RELOAD_TIMEOUT = 60

# If we receive more than one update in this amount of seconds, we move to
# polling every RATELIMIT seconds, rather than relying on inotify, to be able
# to serve more requests.
CONFD_CONFIG_RELOAD_RATELIMIT = 2
831

832
833
834
835
836
837
# Magic number prepended to all confd queries.
# This allows us to distinguish different types of confd protocols and handle
# them. For example by changing this we can move the whole payload to be
# compressed, or move away from json.
CONFD_MAGIC_FOURCC = 'plj0'

Guido Trotter's avatar
Guido Trotter committed
838
839
840
841
842
843
844
845
846
847
# By default a confd request is sent to the minimum between this number and all
# MCs. 6 was chosen because even in the case of a disastrous 50% response rate,
# we should have enough answers to be able to compare more than one.
CONFD_DEFAULT_REQ_COVERAGE = 6

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

848
849
850
851
852
853
# Maximum UDP datagram size.
# On IPv4: 64K - 20 (ip header size) - 8 (udp header size) = 65507
# On IPv6: 64K - 40 (ip6 header size) - 8 (udp header size) = 65487
#   (assuming we can't use jumbo frames)
# We just set this to 60K, which should be enough
MAX_UDP_DATA_SIZE = 61440