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

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


"""Module holding different constants."""

24
import re
25
import socket
26

27
from ganeti import _autoconf
28
from ganeti import _vcsversion
29
from ganeti import pathutils
30

31

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

42

43
44
45
46
47
48
49
# Format for CONFIG_VERSION:
#   01 03 0123 = 01030123
#   ^^ ^^ ^^^^
#   |  |  + Configuration version/revision
#   |  + Minor version
#   + Major version
#
50
# It is stored as an integer. Make sure not to write an octal number.
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
80
81
82
83
84

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


85
86
87
CONFIG_MAJOR = int(_autoconf.VERSION_MAJOR)
CONFIG_MINOR = int(_autoconf.VERSION_MINOR)
CONFIG_REVISION = 0
88
CONFIG_VERSION = BuildVersion(CONFIG_MAJOR, CONFIG_MINOR, CONFIG_REVISION)
Iustin Pop's avatar
Iustin Pop committed
89

90
91
92
#: RPC protocol version
PROTOCOL_VERSION = BuildVersion(CONFIG_MAJOR, CONFIG_MINOR, 0)

93
94
# user separation
DAEMONS_GROUP = _autoconf.DAEMONS_GROUP
95
ADMIN_GROUP = _autoconf.ADMIN_GROUP
96
MASTERD_USER = _autoconf.MASTERD_USER
97
MASTERD_GROUP = _autoconf.MASTERD_GROUP
98
RAPI_USER = _autoconf.RAPI_USER
99
100
101
102
RAPI_GROUP = _autoconf.RAPI_GROUP
CONFD_USER = _autoconf.CONFD_USER
CONFD_GROUP = _autoconf.CONFD_GROUP
NODED_USER = _autoconf.NODED_USER
René Nussbaumer's avatar
René Nussbaumer committed
103
NODED_GROUP = _autoconf.NODED_GROUP
Michael Hanselmann's avatar
Michael Hanselmann committed
104
105
SSH_LOGIN_USER = _autoconf.SSH_LOGIN_USER
SSH_CONSOLE_USER = _autoconf.SSH_CONSOLE_USER
106

Tsachy Shacham's avatar
Tsachy Shacham committed
107
108
109
110
111
# cpu pinning separators and constants
CPU_PINNING_SEP = ":"
CPU_PINNING_ALL = "all"
# internal representation of "all"
CPU_PINNING_ALL_VAL = -1
112
113
# one "all" entry in a CPU list means CPU pinning is off
CPU_PINNING_OFF = [CPU_PINNING_ALL_VAL]
Tsachy Shacham's avatar
Tsachy Shacham committed
114
115
116
117
118
119
120
121
122

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

124
125
126
# A KVM-specific implementation detail - the following value is used
# to set CPU affinity to all processors (#0 through #31), per taskset
# man page.
127
# FIXME: This only works for machines with up to 32 CPU cores
128
129
CPU_PINNING_ALL_KVM = 0xFFFFFFFF

130
# Wipe
131
DD_CMD = "dd"
132
133
134
MAX_WIPE_CHUNK = 1024 # 1GB
MIN_WIPE_CHUNK_PERCENT = 10

135
RUN_DIRS_MODE = 0775
136
SECURE_DIR_MODE = 0700
137
SECURE_FILE_MODE = 0600
138
ADOPTABLE_BLOCKDEV_ROOT = "/dev/disk/"
139
ENABLE_FILE_STORAGE = _autoconf.ENABLE_FILE_STORAGE
140
ENABLE_SHARED_FILE_STORAGE = _autoconf.ENABLE_SHARED_FILE_STORAGE
141
ENABLE_CONFD = _autoconf.ENABLE_CONFD
142
ENABLE_SPLIT_QUERY = _autoconf.ENABLE_SPLIT_QUERY
143

144
NODED = "ganeti-noded"
Guido Trotter's avatar
Guido Trotter committed
145
CONFD = "ganeti-confd"
Guido Trotter's avatar
Guido Trotter committed
146
RAPI = "ganeti-rapi"
147
MASTERD = "ganeti-masterd"
Guido Trotter's avatar
Guido Trotter committed
148
149
# used in the ganeti-nbma project
NLD = "ganeti-nld"
150
151
152
153

DAEMONS_PORTS = {
  # daemon-name: ("proto", "default-port")
  NODED: ("tcp", 1811),
Guido Trotter's avatar
Guido Trotter committed
154
  CONFD: ("udp", 1814),
Guido Trotter's avatar
Guido Trotter committed
155
  RAPI: ("tcp", 5080),
156
  "ssh": ("tcp", 22),
Guido Trotter's avatar
Guido Trotter committed
157
158
  # used in the ganeti-nbma project
  NLD: ("udp", 1816),
159
160
}
DEFAULT_NODED_PORT = DAEMONS_PORTS[NODED][1]
Guido Trotter's avatar
Guido Trotter committed
161
DEFAULT_CONFD_PORT = DAEMONS_PORTS[CONFD][1]
Guido Trotter's avatar
Guido Trotter committed
162
DEFAULT_RAPI_PORT = DAEMONS_PORTS[RAPI][1]
Guido Trotter's avatar
Guido Trotter committed
163
164
# used in the ganeti-nbma project
DEFAULT_NLD_PORT = DAEMONS_PORTS[NLD][1]
165

Iustin Pop's avatar
Iustin Pop committed
166
167
168
FIRST_DRBD_PORT = 11000
LAST_DRBD_PORT = 14999

169
170
171
172
173
174
175
DAEMONS_LOGFILES = {
  NODED: pathutils.GetLogFilename("node-daemon"),
  CONFD: pathutils.GetLogFilename("conf-daemon"),
  RAPI: pathutils.GetLogFilename("rapi-daemon"),
  MASTERD: pathutils.GetLogFilename("master-daemon"),
  }

Luca Bigliardi's avatar
Luca Bigliardi committed
176
177
DEV_CONSOLE = "/dev/console"

Balazs Lecz's avatar
Balazs Lecz committed
178
179
PROC_MOUNTS = "/proc/mounts"

180
# Local UniX Interface related constants
181
LUXI_EOM = "\3"
182
LUXI_VERSION = CONFIG_VERSION
183

Iustin Pop's avatar
Iustin Pop committed
184
# one of "no", "yes", "only"
185
186
187
188
189
190
SYSLOG_USAGE = _autoconf.SYSLOG_USAGE
SYSLOG_NO = "no"
SYSLOG_YES = "yes"
SYSLOG_ONLY = "only"
SYSLOG_SOCKET = "/dev/log"

Iustin Pop's avatar
Iustin Pop committed
191
192
EXPORT_CONF_FILE = "config.ini"

193
XEN_BOOTLOADER = _autoconf.XEN_BOOTLOADER
194
195
XEN_KERNEL = _autoconf.XEN_KERNEL
XEN_INITRD = _autoconf.XEN_INITRD
196
197
198
199
XEN_CMD_XM = "xm"
XEN_CMD_XL = "xl"
# FIXME: This will be made configurable using hvparams in Ganeti 2.7
XEN_CMD = _autoconf.XEN_CMD
Guido Trotter's avatar
Guido Trotter committed
200
201
202
203
204
205
206
207
# When the Xen toolstack used is "xl", live migration requires the source host
# to connect to the target host via ssh (xl runs this command). We need to pass
# the command xl runs some extra info so that it can use Ganeti's key
# verification and not fail. Note that this string is incomplete: it must be
# filled with the cluster name before being used.
XL_SSH_CMD = ("ssh -l root -oGlobalKnownHostsFile=%s"
              " -oUserKnownHostsFile=/dev/null"
              " -oCheckHostIp=no -oStrictHostKeyChecking=yes"
208
              " -oHostKeyAlias=%%s") % pathutils.SSH_KNOWN_HOSTS_FILE
209

210
KVM_PATH = _autoconf.KVM_PATH
211
KVM_KERNEL = _autoconf.KVM_KERNEL
Guido Trotter's avatar
Guido Trotter committed
212
SOCAT_PATH = _autoconf.SOCAT_PATH
213
SOCAT_USE_ESCAPE = _autoconf.SOCAT_USE_ESCAPE
214
SOCAT_USE_COMPRESS = _autoconf.SOCAT_USE_COMPRESS
215
SOCAT_ESCAPE_CODE = "0x1d"
216

217
218
219
220
221
222
#: Console as SSH command
CONS_SSH = "ssh"

#: Console as VNC server
CONS_VNC = "vnc"

223
224
225
#: Console as SPICE server
CONS_SPICE = "spice"

226
227
228
229
#: Display a message for console access
CONS_MESSAGE = "msg"

#: All console types
230
CONS_ALL = frozenset([CONS_SSH, CONS_VNC, CONS_SPICE, CONS_MESSAGE])
231

232
233
234
235
236
# 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

237
238
239
# Ciphers allowed for SSL connections. For the format, see ciphers(1). A better
# way to disable ciphers would be to use the exclamation mark (!), but socat
# versions below 1.5 can't parse exclamation marks in options properly. When
240
# modifying the ciphers, ensure not to accidentially add something after it's
241
242
243
244
# been removed. Use the "openssl" utility to check the allowed ciphers, e.g.
# "openssl ciphers -v HIGH:-DES".
OPENSSL_CIPHERS = "HIGH:-DES:-3DES:-EXPORT:-ADH"

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

248
249
250
251
252
253
# Default validity of certificates in days
X509_CERT_DEFAULT_VALIDITY = 365 * 5

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

254
255
X509_CERT_SIGNATURE_HEADER = "X-Ganeti-Signature"

256
257
258
259
# Import/export daemon mode
IEM_IMPORT = "import"
IEM_EXPORT = "export"

260
261
262
263
264
265
266
267
# Import/export transport compression
IEC_NONE = "none"
IEC_GZIP = "gzip"
IEC_ALL = frozenset([
  IEC_NONE,
  IEC_GZIP,
  ])

268
269
IE_CUSTOM_SIZE = "fd"

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

272
273
274
275
276
277
278
279
# Import/export I/O
# Direct file I/O, equivalent to a shell's I/O redirection using '<' or '>'
IEIO_FILE = "file"
# Raw block device I/O using "dd"
IEIO_RAW_DISK = "raw"
# OS definition import/export script
IEIO_SCRIPT = "script"

280
VALUE_DEFAULT = "default"
281
282
VALUE_AUTO = "auto"
VALUE_GENERATE = "generate"
283
VALUE_NONE = "none"
284
285
VALUE_TRUE = "true"
VALUE_FALSE = "false"
286

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

Iustin Pop's avatar
Iustin Pop committed
290
291
292
# hooks-related constants
HOOKS_PHASE_PRE = "pre"
HOOKS_PHASE_POST = "post"
293
HOOKS_NAME_CFGUPDATE = "config-update"
Guido Trotter's avatar
Guido Trotter committed
294
HOOKS_NAME_WATCHER = "watcher"
295
HOOKS_VERSION = 2
296
HOOKS_PATH = "/sbin:/bin:/usr/sbin:/usr/bin"
Iustin Pop's avatar
Iustin Pop committed
297
298
299
300

# hooks subject type (what object type does the LU deal with)
HTYPE_CLUSTER = "CLUSTER"
HTYPE_NODE = "NODE"
301
HTYPE_GROUP = "GROUP"
Iustin Pop's avatar
Iustin Pop committed
302
303
304
305
306
307
HTYPE_INSTANCE = "INSTANCE"

HKR_SKIP = 0
HKR_FAIL = 1
HKR_SUCCESS = 2

308
309
310
311
# Storage types
ST_FILE = "file"
ST_LVM_PV = "lvm-pv"
ST_LVM_VG = "lvm-vg"
312
313

# Storage fields
314
315
316
317
# 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
318
319
320
321
322
323
SF_NAME = "name"
SF_SIZE = "size"
SF_FREE = "free"
SF_USED = "used"
SF_ALLOCATABLE = "allocatable"

324
325
326
# Storage operations
SO_FIX_CONSISTENCY = "fix-consistency"

327
# Available fields per storage type
Stephen Shirley's avatar
Stephen Shirley committed
328
329
330
331
332
333
334
335
VALID_STORAGE_FIELDS = frozenset([
  SF_NAME,
  SF_TYPE,
  SF_SIZE,
  SF_USED,
  SF_FREE,
  SF_ALLOCATABLE
  ])
336
337

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

339
340
341
342
MODIFIABLE_STORAGE_FIELDS = {
  ST_LVM_PV: frozenset([SF_ALLOCATABLE]),
  }

343
VALID_STORAGE_OPERATIONS = {
344
  ST_LVM_VG: frozenset([SO_FIX_CONSISTENCY]),
345
346
  }

347
348
349
350
351
352
# 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
353
354
355
# disk template types
DT_DISKLESS = "diskless"
DT_PLAIN = "plain"
356
DT_DRBD8 = "drbd"
357
DT_FILE = "file"
358
DT_SHARED_FILE = "sharedfile"
359
DT_BLOCK = "blockdev"
360
DT_RBD = "rbd"
361
362

# the set of network-mirrored disk templates
363
DTS_INT_MIRROR = frozenset([DT_DRBD8])
Iustin Pop's avatar
Iustin Pop committed
364

365
# the set of externally-mirrored disk templates (e.g. SAN, NAS)
366
DTS_EXT_MIRROR = frozenset([DT_SHARED_FILE, DT_BLOCK, DT_RBD])
367

368
# the set of non-lvm-based disk templates
369
370
DTS_NOT_LVM = frozenset([DT_DISKLESS, DT_FILE, DT_SHARED_FILE,
                         DT_BLOCK, DT_RBD])
371

372
# the set of disk templates which can be grown
373
DTS_GROWABLE = frozenset([DT_PLAIN, DT_DRBD8, DT_FILE, DT_SHARED_FILE, DT_RBD])
374

375
# the set of disk templates that allow adoption
376
377
378
379
DTS_MAY_ADOPT = frozenset([DT_PLAIN, DT_BLOCK])

# the set of disk templates that *must* use adoption
DTS_MUST_ADOPT = frozenset([DT_BLOCK])
380

381
# the set of disk templates that allow migrations
382
DTS_MIRRORED = frozenset.union(DTS_INT_MIRROR, DTS_EXT_MIRROR)
383

Guido Trotter's avatar
Guido Trotter committed
384
385
# the set of file based disk templates
DTS_FILEBASED = frozenset([DT_FILE, DT_SHARED_FILE])
386

387
388
# logical disk types
LD_LV = "lvm"
389
LD_DRBD8 = "drbd8"
390
LD_FILE = "file"
391
LD_BLOCKDEV = "blockdev"
392
LD_RBD = "rbd"
393
394
395
396
397
LOGICAL_DISK_TYPES = frozenset([
  LD_LV,
  LD_DRBD8,
  LD_FILE,
  LD_BLOCKDEV,
398
  LD_RBD,
399
400
  ])

401
LDS_BLOCK = frozenset([LD_LV, LD_DRBD8, LD_BLOCKDEV, LD_RBD])
402

Iustin Pop's avatar
Iustin Pop committed
403
404
# drbd constants
DRBD_HMAC_ALG = "md5"
405
DRBD_NET_PROTOCOL = "C"
406

407
408
409
#: Size of DRBD meta block device
DRBD_META_SIZE = 128

410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
# drbd barrier types
DRBD_B_NONE = "n"
DRBD_B_DISK_BARRIERS = "b"
DRBD_B_DISK_DRAIN = "d"
DRBD_B_DISK_FLUSH = "f"

# Valid barrier combinations: "n" or any non-null subset of "bfd"
DRBD_VALID_BARRIER_OPT = frozenset([
  frozenset([DRBD_B_NONE]),
  frozenset([DRBD_B_DISK_BARRIERS]),
  frozenset([DRBD_B_DISK_DRAIN]),
  frozenset([DRBD_B_DISK_FLUSH]),
  frozenset([DRBD_B_DISK_DRAIN, DRBD_B_DISK_FLUSH]),
  frozenset([DRBD_B_DISK_DRAIN, DRBD_B_DISK_FLUSH]),
  frozenset([DRBD_B_DISK_BARRIERS, DRBD_B_DISK_DRAIN]),
  frozenset([DRBD_B_DISK_BARRIERS, DRBD_B_DISK_FLUSH]),
  frozenset([DRBD_B_DISK_BARRIERS, DRBD_B_DISK_FLUSH, DRBD_B_DISK_DRAIN]),
  ])
Iustin Pop's avatar
Iustin Pop committed
428

429
430
431
# rbd tool command
RBD_CMD = "rbd"

432
433
434
# file backend driver
FD_LOOP = "loop"
FD_BLKTAP = "blktap"
435
436

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

439
# disk access mode
440
441
DISK_RDONLY = "ro"
DISK_RDWR = "rw"
442
443
DISK_ACCESS_SET = frozenset([DISK_RDONLY, DISK_RDWR])

444
# disk replacement mode
445
446
447
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
448
REPLACE_DISK_AUTO = "replace_auto"
449
450
451
452
453
454
REPLACE_MODES = frozenset([
  REPLACE_DISK_PRI,
  REPLACE_DISK_SEC,
  REPLACE_DISK_CHG,
  REPLACE_DISK_AUTO,
  ])
455

456
457
458
459
460
461
462
463
# Instance export mode
EXPORT_MODE_LOCAL = "local"
EXPORT_MODE_REMOTE = "remote"
EXPORT_MODES = frozenset([
  EXPORT_MODE_LOCAL,
  EXPORT_MODE_REMOTE,
  ])

464
# instance creation modes
Iustin Pop's avatar
Iustin Pop committed
465
466
INSTANCE_CREATE = "create"
INSTANCE_IMPORT = "import"
467
468
469
470
471
472
INSTANCE_REMOTE_IMPORT = "remote-import"
INSTANCE_CREATE_MODES = frozenset([
  INSTANCE_CREATE,
  INSTANCE_IMPORT,
  INSTANCE_REMOTE_IMPORT,
  ])
Iustin Pop's avatar
Iustin Pop committed
473

474
475
476
477
478
479
480
# Remote import/export handshake message and version
RIE_VERSION = 0
RIE_HANDSHAKE = "Hi, I'm Ganeti"

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

481
# Overall timeout for establishing connection
482
RIE_CONNECT_TIMEOUT = 180
483

484
485
486
487
488
489
# Export only: how long to wait per connection attempt (seconds)
RIE_CONNECT_ATTEMPT_TIMEOUT = 20

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

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

Stephen Shirley's avatar
Stephen Shirley committed
493
494
495
496
497
498
DISK_TEMPLATES = frozenset([
  DT_DISKLESS,
  DT_PLAIN,
  DT_DRBD8,
  DT_FILE,
  DT_SHARED_FILE,
499
500
  DT_BLOCK,
  DT_RBD
Stephen Shirley's avatar
Stephen Shirley committed
501
  ])
502
503

FILE_DRIVER = frozenset([FD_LOOP, FD_BLKTAP])
Iustin Pop's avatar
Iustin Pop committed
504
505
506
507

# import/export config options
INISECT_EXP = "export"
INISECT_INS = "instance"
508
509
INISECT_HYP = "hypervisor"
INISECT_BEP = "backend"
510
INISECT_OSP = "os"
511

512
# dynamic device modification
513
DDM_ADD = "add"
514
DDM_MODIFY = "modify"
515
516
DDM_REMOVE = "remove"
DDMS_VALUES = frozenset([DDM_ADD, DDM_REMOVE])
517
518
519
520
DDMS_VALUES_WITH_MODIFY = (DDMS_VALUES | frozenset([
  DDM_MODIFY,
  ]))
# TODO: DDM_SWAP, DDM_MOVE?
521

522
# common exit codes
Iustin Pop's avatar
Iustin Pop committed
523
EXIT_SUCCESS = 0
524
EXIT_FAILURE = 1
525
EXIT_NOTCLUSTER = 5
526
EXIT_NOTMASTER = 11
527
EXIT_NODESETUP_ERROR = 12
Iustin Pop's avatar
Iustin Pop committed
528
EXIT_CONFIRMATION = 13 # need user confirmation
529

530
531
532
#: Exit code for query operations with unknown fields
EXIT_UNKNOWN_FIELD = 14

533
534
# tags
TAG_CLUSTER = "cluster"
535
TAG_NODEGROUP = "nodegroup"
536
537
TAG_NODE = "node"
TAG_INSTANCE = "instance"
538
539
VALID_TAG_TYPES = frozenset([
  TAG_CLUSTER,
540
  TAG_NODEGROUP,
541
542
543
  TAG_NODE,
  TAG_INSTANCE,
  ])
544
545
546
MAX_TAG_LEN = 128
MAX_TAGS_PER_OBJ = 4096

547
548
# others
DEFAULT_BRIDGE = "xen-br0"
549
CLASSIC_DRBD_SYNC_SPEED = 60 * 1024  # 60 MiB, expressed in KiB
550
551
IP4_ADDRESS_LOCALHOST = "127.0.0.1"
IP4_ADDRESS_ANY = "0.0.0.0"
Manuel Franceschini's avatar
Manuel Franceschini committed
552
553
IP6_ADDRESS_LOCALHOST = "::1"
IP6_ADDRESS_ANY = "::"
554
555
IP4_VERSION = 4
IP6_VERSION = 6
556
VALID_IP_VERSIONS = frozenset([IP4_VERSION, IP6_VERSION])
557
558
559
560
# for export to htools
IP4_FAMILY = socket.AF_INET
IP6_FAMILY = socket.AF_INET6

561
TCP_PING_TIMEOUT = 10
562
DEFAULT_VG = "xenvg"
563
DEFAULT_DRBD_HELPER = "/bin/true"
564
MIN_VG_SIZE = 20480
565
DEFAULT_MAC_PREFIX = "aa:00:00"
566
567
# default maximum instance wait time, in seconds.
DEFAULT_SHUTDOWN_TIMEOUT = 120
568
NODE_MAX_CLOCK_SKEW = 150
569
# Time for an intra-cluster disk transfer to wait for a connection
570
DISK_TRANSFER_CONNECT_TIMEOUT = 60
571
572
# Disk index separator
DISK_SEPARATOR = _autoconf.DISK_SEPARATOR
573
IP_COMMAND_PATH = _autoconf.IP_PATH
574

575
576
577
#: Key for job IDs in opcode result
JOB_IDS_KEY = "jobs"

578
579
580
581
582
583
584
# runparts results
(RUNPARTS_SKIP,
 RUNPARTS_RUN,
 RUNPARTS_ERR) = range(3)

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

585
586
587
588
# RPC constants
(RPC_ENCODING_NONE,
 RPC_ENCODING_ZLIB_BASE64) = range(2)

589
590
591
592
593
594
595
596
597
598
599
# Various time constants for the timeout table
RPC_TMO_URGENT = 60 # one minute
RPC_TMO_FAST = 5 * 60 # five minutes
RPC_TMO_NORMAL = 15 * 60 # 15 minutes
RPC_TMO_SLOW = 3600 # one hour
RPC_TMO_4HRS = 4 * 3600
RPC_TMO_1DAY = 86400

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

600
# os related constants
Iustin Pop's avatar
Iustin Pop committed
601
602
603
604
605
OS_SCRIPT_CREATE = "create"
OS_SCRIPT_IMPORT = "import"
OS_SCRIPT_EXPORT = "export"
OS_SCRIPT_RENAME = "rename"
OS_SCRIPT_VERIFY = "verify"
Stephen Shirley's avatar
Stephen Shirley committed
606
607
608
609
610
611
612
OS_SCRIPTS = frozenset([
  OS_SCRIPT_CREATE,
  OS_SCRIPT_IMPORT,
  OS_SCRIPT_EXPORT,
  OS_SCRIPT_RENAME,
  OS_SCRIPT_VERIFY
  ])
613

Iustin Pop's avatar
Iustin Pop committed
614
615
616
OS_API_FILE = "ganeti_api_version"
OS_VARIANTS_FILE = "variants.list"
OS_PARAMETERS_FILE = "parameters.list"
617

Iustin Pop's avatar
Iustin Pop committed
618
OS_VALIDATE_PARAMETERS = "parameters"
619
OS_VALIDATE_CALLS = frozenset([OS_VALIDATE_PARAMETERS])
620

621
# ssh constants
622
623
SSH = "ssh"
SCP = "scp"
624
625
626
627
628

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

630
631
632
633
634
635
636
637
638
639
640
641
642
643
REBOOT_TYPES = frozenset([
  INSTANCE_REBOOT_SOFT,
  INSTANCE_REBOOT_HARD,
  INSTANCE_REBOOT_FULL
  ])

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

REBOOT_BEHAVIORS = frozenset([
  INSTANCE_REBOOT_ALLOWED,
  INSTANCE_REBOOT_EXIT
  ])
644

Iustin Pop's avatar
Iustin Pop committed
645
VTYPE_STRING = "string"
646
VTYPE_MAYBE_STRING = "maybe-string"
Iustin Pop's avatar
Iustin Pop committed
647
648
649
VTYPE_BOOL = "bool"
VTYPE_SIZE = "size" # size, in MiBs
VTYPE_INT = "int"
650
ENFORCEABLE_TYPES = frozenset([
Stephen Shirley's avatar
Stephen Shirley committed
651
652
653
654
655
656
  VTYPE_STRING,
  VTYPE_MAYBE_STRING,
  VTYPE_BOOL,
  VTYPE_SIZE,
  VTYPE_INT,
  ])
657

658
659
660
# Constant representing that the user does not specify any IP version
IFACE_NO_IP_VERSION_SPECIFIED = 0

661
662
663
# HV parameter names (global namespace)
HV_BOOT_ORDER = "boot_order"
HV_CDROM_IMAGE_PATH = "cdrom_image_path"
664
665
HV_KVM_CDROM2_IMAGE_PATH = "cdrom2_image_path"
HV_KVM_FLOPPY_IMAGE_PATH = "floppy_image_path"
666
667
HV_NIC_TYPE = "nic_type"
HV_DISK_TYPE = "disk_type"
668
HV_KVM_CDROM_DISK_TYPE = "cdrom_disk_type"
669
HV_VNC_BIND_ADDRESS = "vnc_bind_address"
670
HV_VNC_PASSWORD_FILE = "vnc_password_file"
671
672
673
HV_VNC_TLS = "vnc_tls"
HV_VNC_X509 = "vnc_x509_path"
HV_VNC_X509_VERIFY = "vnc_x509_verify"
674
675
HV_KVM_SPICE_BIND = "spice_bind"
HV_KVM_SPICE_IP_VERSION = "spice_ip_version"
676
HV_KVM_SPICE_PASSWORD_FILE = "spice_password_file"
677
678
679
680
681
HV_KVM_SPICE_LOSSLESS_IMG_COMPR = "spice_image_compression"
HV_KVM_SPICE_JPEG_IMG_COMPR = "spice_jpeg_wan_compression"
HV_KVM_SPICE_ZLIB_GLZ_IMG_COMPR = "spice_zlib_glz_wan_compression"
HV_KVM_SPICE_STREAMING_VIDEO_DETECTION = "spice_streaming_video"
HV_KVM_SPICE_AUDIO_COMPR = "spice_playback_compression"
682
HV_KVM_SPICE_USE_TLS = "spice_use_tls"
683
684
HV_KVM_SPICE_TLS_CIPHERS = "spice_tls_ciphers"
HV_KVM_SPICE_USE_VDAGENT = "spice_use_vdagent"
685
686
HV_ACPI = "acpi"
HV_PAE = "pae"
687
688
689
HV_USE_BOOTLOADER = "use_bootloader"
HV_BOOTLOADER_ARGS = "bootloader_args"
HV_BOOTLOADER_PATH = "bootloader_path"
690
HV_KERNEL_ARGS = "kernel_args"
691
692
HV_KERNEL_PATH = "kernel_path"
HV_INITRD_PATH = "initrd_path"
693
HV_ROOT_PATH = "root_path"
694
HV_SERIAL_CONSOLE = "serial_console"
695
HV_USB_MOUSE = "usb_mouse"
696
HV_KEYMAP = "keymap"
697
HV_DEVICE_MODEL = "device_model"
698
HV_INIT_SCRIPT = "init_script"
699
HV_MIGRATION_PORT = "migration_port"
700
701
HV_MIGRATION_BANDWIDTH = "migration_bandwidth"
HV_MIGRATION_DOWNTIME = "migration_downtime"
702
HV_MIGRATION_MODE = "migration_mode"
703
HV_USE_LOCALTIME = "use_localtime"
704
HV_DISK_CACHE = "disk_cache"
705
706
HV_SECURITY_MODEL = "security_model"
HV_SECURITY_DOMAIN = "security_domain"
Guido Trotter's avatar
Guido Trotter committed
707
HV_KVM_FLAG = "kvm_flag"
708
HV_VHOST_NET = "vhost_net"
Balazs Lecz's avatar
Balazs Lecz committed
709
HV_KVM_USE_CHROOT = "use_chroot"
710
HV_CPU_MASK = "cpu_mask"
711
HV_MEM_PATH = "mem_path"
Jack's avatar
Jack committed
712
HV_PASSTHROUGH = "pci_pass"
713
HV_BLOCKDEV_PREFIX = "blockdev_prefix"
714
HV_REBOOT_BEHAVIOR = "reboot_behavior"
715
HV_CPU_TYPE = "cpu_type"
716
717
718
HV_CPU_CAP = "cpu_cap"
HV_CPU_WEIGHT = "cpu_weight"

719

720
721
HVS_PARAMETER_TYPES = {
  HV_BOOT_ORDER: VTYPE_STRING,
722
  HV_KVM_FLOPPY_IMAGE_PATH: VTYPE_STRING,
723
  HV_CDROM_IMAGE_PATH: VTYPE_STRING,
724
  HV_KVM_CDROM2_IMAGE_PATH: VTYPE_STRING,
725
726
  HV_NIC_TYPE: VTYPE_STRING,
  HV_DISK_TYPE: VTYPE_STRING,
727
  HV_KVM_CDROM_DISK_TYPE: VTYPE_STRING,
728
  HV_VNC_PASSWORD_FILE: VTYPE_STRING,
729
730
731
732
  HV_VNC_BIND_ADDRESS: VTYPE_STRING,
  HV_VNC_TLS: VTYPE_BOOL,
  HV_VNC_X509: VTYPE_STRING,
  HV_VNC_X509_VERIFY: VTYPE_BOOL,
733
734
  HV_KVM_SPICE_BIND: VTYPE_STRING,
  HV_KVM_SPICE_IP_VERSION: VTYPE_INT,
735
  HV_KVM_SPICE_PASSWORD_FILE: VTYPE_STRING,
736
737
738
739
740
  HV_KVM_SPICE_LOSSLESS_IMG_COMPR: VTYPE_STRING,
  HV_KVM_SPICE_JPEG_IMG_COMPR: VTYPE_STRING,
  HV_KVM_SPICE_ZLIB_GLZ_IMG_COMPR: VTYPE_STRING,
  HV_KVM_SPICE_STREAMING_VIDEO_DETECTION: VTYPE_STRING,
  HV_KVM_SPICE_AUDIO_COMPR: VTYPE_BOOL,
741
  HV_KVM_SPICE_USE_TLS: VTYPE_BOOL,
742
743
  HV_KVM_SPICE_TLS_CIPHERS: VTYPE_STRING,
  HV_KVM_SPICE_USE_VDAGENT: VTYPE_BOOL,
744
745
  HV_ACPI: VTYPE_BOOL,
  HV_PAE: VTYPE_BOOL,
746
747
748
  HV_USE_BOOTLOADER: VTYPE_BOOL,
  HV_BOOTLOADER_PATH: VTYPE_STRING,
  HV_BOOTLOADER_ARGS: VTYPE_STRING,
749
  HV_KERNEL_PATH: VTYPE_STRING,
750
  HV_KERNEL_ARGS: VTYPE_STRING,
751
  HV_INITRD_PATH: VTYPE_STRING,
752
  HV_ROOT_PATH: VTYPE_MAYBE_STRING,
753
754
  HV_SERIAL_CONSOLE: VTYPE_BOOL,
  HV_USB_MOUSE: VTYPE_STRING,
755
  HV_KEYMAP: VTYPE_STRING,
756
  HV_DEVICE_MODEL: VTYPE_STRING,
757
  HV_INIT_SCRIPT: VTYPE_STRING,
758
  HV_MIGRATION_PORT: VTYPE_INT,
759
760
  HV_MIGRATION_BANDWIDTH: VTYPE_INT,
  HV_MIGRATION_DOWNTIME: VTYPE_INT,
761
  HV_MIGRATION_MODE: VTYPE_STRING,
762
  HV_USE_LOCALTIME: VTYPE_BOOL,
763
  HV_DISK_CACHE: VTYPE_STRING,
764
765
  HV_SECURITY_MODEL: VTYPE_STRING,
  HV_SECURITY_DOMAIN: VTYPE_STRING,
Guido Trotter's avatar
Guido Trotter committed
766
  HV_KVM_FLAG: VTYPE_STRING,
767
  HV_VHOST_NET: VTYPE_BOOL,
Balazs Lecz's avatar
Balazs Lecz committed
768
  HV_KVM_USE_CHROOT: VTYPE_BOOL,
769
  HV_CPU_MASK: VTYPE_STRING,
770
  HV_MEM_PATH: VTYPE_STRING,
Jack's avatar
Jack committed
771
  HV_PASSTHROUGH: VTYPE_STRING,
772
  HV_BLOCKDEV_PREFIX: VTYPE_STRING,
773
  HV_REBOOT_BEHAVIOR: VTYPE_STRING,
774
  HV_CPU_TYPE: VTYPE_STRING,
775
776
  HV_CPU_CAP: VTYPE_INT,
  HV_CPU_WEIGHT: VTYPE_INT,
777
778
779
  }

HVS_PARAMETERS = frozenset(HVS_PARAMETER_TYPES.keys())
780

781
782
783
784
785
786
787
788
789
790
791
792
793
794
HVS_PARAMETER_TITLES = {
  HV_ACPI: "ACPI",
  HV_BOOT_ORDER: "Boot_order",
  HV_CDROM_IMAGE_PATH: "CDROM_image_path",
  HV_DISK_TYPE: "Disk_type",
  HV_INITRD_PATH: "Initrd_path",
  HV_KERNEL_PATH: "Kernel_path",
  HV_NIC_TYPE: "NIC_type",
  HV_PAE: "PAE",
  HV_VNC_BIND_ADDRESS: "VNC_bind_address",
  HV_PASSTHROUGH: "pci_pass",
  HV_CPU_TYPE: "cpu_type",
  }

795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
# Migration statuses
HV_MIGRATION_COMPLETED = "completed"
HV_MIGRATION_ACTIVE = "active"
HV_MIGRATION_FAILED = "failed"
HV_MIGRATION_CANCELLED = "cancelled"

HV_MIGRATION_VALID_STATUSES = frozenset([
  HV_MIGRATION_COMPLETED,
  HV_MIGRATION_ACTIVE,
  HV_MIGRATION_FAILED,
  HV_MIGRATION_CANCELLED,
  ])

HV_MIGRATION_FAILED_STATUSES = frozenset([
  HV_MIGRATION_FAILED,
  HV_MIGRATION_CANCELLED,
  ])

# KVM-specific statuses
HV_KVM_MIGRATION_VALID_STATUSES = HV_MIGRATION_VALID_STATUSES

816
817
818
# Node info keys
HV_NODEINFO_KEY_VERSION = "hv_version"

819
820
821
822
823
824
825
# Hypervisor state
HVST_MEMORY_TOTAL = "mem_total"
HVST_MEMORY_NODE = "mem_node"
HVST_MEMORY_HV = "mem_hv"
HVST_CPU_TOTAL = "cpu_total"
HVST_CPU_NODE = "cpu_node"

826
827
828
829
830
831
832
833
HVST_DEFAULTS = {
  HVST_MEMORY_TOTAL: 0,
  HVST_MEMORY_NODE: 0,
  HVST_MEMORY_HV: 0,
  HVST_CPU_TOTAL: 1,
  HVST_CPU_NODE: 1,
  }

834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
HVSTS_PARAMETER_TYPES = {
  HVST_MEMORY_TOTAL: VTYPE_INT,
  HVST_MEMORY_NODE: VTYPE_INT,
  HVST_MEMORY_HV: VTYPE_INT,
  HVST_CPU_TOTAL: VTYPE_INT,
  HVST_CPU_NODE: VTYPE_INT,
  }

HVSTS_PARAMETERS = frozenset(HVSTS_PARAMETER_TYPES.keys())

# Disk state
DS_DISK_TOTAL = "disk_total"
DS_DISK_RESERVED = "disk_reserved"
DS_DISK_OVERHEAD = "disk_overhead"

849
850
851
852
853
854
DS_DEFAULTS = {
  DS_DISK_TOTAL: 0,
  DS_DISK_RESERVED: 0,
  DS_DISK_OVERHEAD: 0,
  }

855
856
857
858
859
860
861
DSS_PARAMETER_TYPES = {
  DS_DISK_TOTAL: VTYPE_INT,
  DS_DISK_RESERVED: VTYPE_INT,
  DS_DISK_OVERHEAD: VTYPE_INT,
  }

DSS_PARAMETERS = frozenset(DSS_PARAMETER_TYPES.keys())
862
DS_VALID_TYPES = frozenset([LD_LV])
863

864
# Backend parameter names
865
866
867
BE_MEMORY = "memory" # deprecated and replaced by max and min mem
BE_MAXMEM = "maxmem"
BE_MINMEM = "minmem"
868
BE_VCPUS = "vcpus"
869
BE_AUTO_BALANCE = "auto_balance"
870
BE_ALWAYS_FAILOVER = "always_failover"
871
BE_SPINDLE_USE = "spindle_use"
872

873
BES_PARAMETER_TYPES = {
874
875
876
877
  BE_MAXMEM: VTYPE_SIZE,
  BE_MINMEM: VTYPE_SIZE,
  BE_VCPUS: VTYPE_INT,
  BE_AUTO_BALANCE: VTYPE_BOOL,
878
  BE_ALWAYS_FAILOVER: VTYPE_BOOL,
879
  BE_SPINDLE_USE: VTYPE_INT,
880
  }
881

882
883
884
885
886
887
888
BES_PARAMETER_TITLES = {
  BE_AUTO_BALANCE: "Auto_balance",
  BE_MAXMEM: "ConfigMaxMem",
  BE_MINMEM: "ConfigMinMem",
  BE_VCPUS: "ConfigVCPUs",
  }

889
890
891
892
893
BES_PARAMETER_COMPAT = {
  BE_MEMORY: VTYPE_SIZE,
  }
BES_PARAMETER_COMPAT.update(BES_PARAMETER_TYPES)

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

896
# instance specs
897
898
899
900
901
ISPEC_MEM_SIZE = "memory-size"
ISPEC_CPU_COUNT = "cpu-count"
ISPEC_DISK_COUNT = "disk-count"
ISPEC_DISK_SIZE = "disk-size"
ISPEC_NIC_COUNT = "nic-count"
902
ISPEC_SPINDLE_USE = "spindle-use"
903
904

ISPECS_PARAMETER_TYPES = {
905
906
907
908
909
  ISPEC_MEM_SIZE: VTYPE_INT,
  ISPEC_CPU_COUNT: VTYPE_INT,
  ISPEC_DISK_COUNT: VTYPE_INT,
  ISPEC_DISK_SIZE: VTYPE_INT,
  ISPEC_NIC_COUNT: VTYPE_INT,
910
  ISPEC_SPINDLE_USE: VTYPE_INT,
911
912
913
914
  }

ISPECS_PARAMETERS = frozenset(ISPECS_PARAMETER_TYPES.keys())

915
916
917
ISPECS_MIN = "min"
ISPECS_MAX = "max"
ISPECS_STD = "std"
918
919
IPOLICY_DTS = "disk-templates"
IPOLICY_VCPU_RATIO = "vcpu-ratio"
920
IPOLICY_SPINDLE_RATIO = "spindle-ratio"
921

922
IPOLICY_ISPECS = frozenset([
923
924
925
  ISPECS_MIN,
  ISPECS_MAX,
  ISPECS_STD,
926
  ])
927
928
929

IPOLICY_PARAMETERS = frozenset([
  IPOLICY_VCPU_RATIO,
930
  IPOLICY_SPINDLE_RATIO,
931
932
933
934
935
  ])

IPOLICY_ALL_KEYS = (IPOLICY_ISPECS |
                    IPOLICY_PARAMETERS |
                    frozenset([IPOLICY_DTS]))
936

937
938
# Node parameter names
ND_OOB_PROGRAM = "oob_program"
939
ND_SPINDLE_COUNT = "spindle_count"
940
941

NDS_PARAMETER_TYPES = {
942
  ND_OOB_PROGRAM: VTYPE_STRING,
943
  ND_SPINDLE_COUNT: VTYPE_INT,
944
  }
945
946
947

NDS_PARAMETERS = frozenset(NDS_PARAMETER_TYPES.keys())

948
949
950
951
952
NDS_PARAMETER_TITLES = {
  ND_OOB_PROGRAM: "OutOfBandProgram",
  ND_SPINDLE_COUNT: "SpindleCount",
  }

953
# Logical Disks parameters
954
955
956
957
LDP_RESYNC_RATE = "resync-rate"
LDP_STRIPES = "stripes"
LDP_BARRIERS = "disabled-barriers"
LDP_NO_META_FLUSH = "disable-meta-flush"
958
LDP_DEFAULT_METAVG = "default-metavg"
959
960
LDP_DISK_CUSTOM = "disk-custom"
LDP_NET_CUSTOM = "net-custom"
961
LDP_DYNAMIC_RESYNC = "dynamic-resync"
962
963
964
965
966
LDP_PLAN_AHEAD = "c-plan-ahead"
LDP_FILL_TARGET = "c-fill-target"
LDP_DELAY_TARGET = "c-delay-target"
LDP_MAX_RATE = "c-max-rate"
LDP_MIN_RATE = "c-min-rate"
967
LDP_POOL = "pool"
968
DISK_LD_TYPES = {
969
970
971
972
  LDP_RESYNC_RATE: VTYPE_INT,
  LDP_STRIPES: VTYPE_INT,
  LDP_BARRIERS: VTYPE_STRING,
  LDP_NO_META_FLUSH: VTYPE_BOOL,
973
  LDP_DEFAULT_METAVG: VTYPE_STRING,
974
975
  LDP_DISK_CUSTOM: VTYPE_STRING,
  LDP_NET_CUSTOM: VTYPE_STRING,
976
  LDP_DYNAMIC_RESYNC: VTYPE_BOOL,
977
978
979
980
981
  LDP_PLAN_AHEAD: VTYPE_INT,
  LDP_FILL_TARGET: VTYPE_INT,
  LDP_DELAY_TARGET: VTYPE_INT,
  LDP_MAX_RATE: VTYPE_INT,
  LDP_MIN_RATE: VTYPE_INT,
982
  LDP_POOL: VTYPE_STRING,
983
984
985
  }
DISK_LD_PARAMETERS = frozenset(DISK_LD_TYPES.keys())

986
987
# Disk template parameters (can be set/changed by the user via gnt-cluster and
# gnt-group)
988
DRBD_RESYNC_RATE = "resync-rate"
989
990
DRBD_DATA_STRIPES = "data-stripes"
DRBD_META_STRIPES = "meta-stripes"
991
992
DRBD_DISK_BARRIERS = "disk-barriers"
DRBD_META_BARRIERS = "meta-barriers"
993
DRBD_DEFAULT_METAVG = "metavg"
994
995
DRBD_DISK_CUSTOM = "disk-custom"
DRBD_NET_CUSTOM = "net-custom"
996
DRBD_DYNAMIC_RESYNC = "dynamic-resync"
997
998
999
1000
1001
DRBD_PLAN_AHEAD = "c-plan-ahead"
DRBD_FILL_TARGET = "c-fill-target"
DRBD_DELAY_TARGET = "c-delay-target"
DRBD_MAX_RATE = "c-max-rate"
DRBD_MIN_RATE = "c-min-rate"
1002
LV_STRIPES = "stripes"
1003
RBD_POOL = "pool"
1004
DISK_DT_TYPES = {
1005
  DRBD_RESYNC_RATE: VTYPE_INT,
1006
1007
  DRBD_DATA_STRIPES: VTYPE_INT,
  DRBD_META_STRIPES: VTYPE_INT,
1008
1009
  DRBD_DISK_BARRIERS: VTYPE_STRING,
  DRBD_META_BARRIERS: VTYPE_BOOL,
1010
  DRBD_DEFAULT_METAVG: VTYPE_STRING,
1011
1012
  DRBD_DISK_CUSTOM: VTYPE_STRING,
  DRBD_NET_CUSTOM: VTYPE_STRING,
1013
  DRBD_DYNAMIC_RESYNC: VTYPE_BOOL,
1014
1015
1016
1017
1018
  DRBD_PLAN_AHEAD: VTYPE_INT,
  DRBD_FILL_TARGET: VTYPE_INT,
  DRBD_DELAY_TARGET: VTYPE_INT,
  DRBD_MAX_RATE: VTYPE_INT,
  DRBD_MIN_RATE: VTYPE_INT,
1019
  LV_STRIPES: VTYPE_INT,
1020
  RBD_POOL: VTYPE_STRING,
1021
1022
1023
1024
  }

DISK_DT_PARAMETERS = frozenset(DISK_DT_TYPES.keys())

1025
1026
1027
1028
1029
1030
1031
# OOB supported commands
OOB_POWER_ON =