constants.py 54.7 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

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

40

41
42
43
44
45
46
47
48
# 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.
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
80
81
82

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


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

88
89
90
#: RPC protocol version
PROTOCOL_VERSION = BuildVersion(CONFIG_MAJOR, CONFIG_MINOR, 0)

91
92
# user separation
DAEMONS_GROUP = _autoconf.DAEMONS_GROUP
93
ADMIN_GROUP = _autoconf.ADMIN_GROUP
94
MASTERD_USER = _autoconf.MASTERD_USER
95
MASTERD_GROUP = _autoconf.MASTERD_GROUP
96
RAPI_USER = _autoconf.RAPI_USER
97
98
99
100
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
101
NODED_GROUP = _autoconf.NODED_GROUP
102

Tsachy Shacham's avatar
Tsachy Shacham committed
103
104
105
106
107
# cpu pinning separators and constants
CPU_PINNING_SEP = ":"
CPU_PINNING_ALL = "all"
# internal representation of "all"
CPU_PINNING_ALL_VAL = -1
108
109
# 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
110
111
112
113
114
115
116
117
118

# 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"
119

120
121
122
123
124
# A KVM-specific implementation detail - the following value is used
# to set CPU affinity to all processors (#0 through #31), per taskset
# man page.
CPU_PINNING_ALL_KVM = 0xFFFFFFFF

125
# Wipe
126
DD_CMD = "dd"
Michael Hanselmann's avatar
Michael Hanselmann committed
127
WIPE_BLOCK_SIZE = 1024 ** 2
128
129
130
MAX_WIPE_CHUNK = 1024 # 1GB
MIN_WIPE_CHUNK_PERCENT = 10

131

Iustin Pop's avatar
Iustin Pop committed
132
# file paths
133
DATA_DIR = _autoconf.LOCALSTATEDIR + "/lib/ganeti"
134
RUN_DIR = _autoconf.LOCALSTATEDIR + "/run"
135
RUN_GANETI_DIR = RUN_DIR + "/ganeti"
136
BDEV_CACHE_DIR = RUN_GANETI_DIR + "/bdev-cache"
137
DISK_LINKS_DIR = RUN_GANETI_DIR + "/instance-disks"
138
RUN_DIRS_MODE = 0775
Guido Trotter's avatar
Guido Trotter committed
139
SOCKET_DIR = RUN_GANETI_DIR + "/socket"
140
SECURE_DIR_MODE = 0700
141
SECURE_FILE_MODE = 0600
142
CRYPTO_KEYS_DIR = RUN_GANETI_DIR + "/crypto"
143
IMPORT_EXPORT_DIR = RUN_GANETI_DIR + "/import-export"
144
ADOPTABLE_BLOCKDEV_ROOT = "/dev/disk/"
Iustin Pop's avatar
Iustin Pop committed
145
LOCK_DIR = _autoconf.LOCALSTATEDIR + "/lock"
146
SSCONF_LOCK_FILE = LOCK_DIR + "/ganeti-ssconf.lock"
147
148
149
# User-id pool lock directory
# The user-ids that are in use have a corresponding lock file in this directory
UIDPOOL_LOCKDIR = RUN_GANETI_DIR + "/uid-pool"
Iustin Pop's avatar
Iustin Pop committed
150
CLUSTER_CONF_FILE = DATA_DIR + "/config.data"
151
NODED_CERT_FILE = DATA_DIR + "/server.pem"
152
RAPI_CERT_FILE = DATA_DIR + "/rapi.pem"
153
CONFD_HMAC_KEY = DATA_DIR + "/hmac.key"
154
155
SPICE_CERT_FILE = DATA_DIR + "/spice.pem"
SPICE_CACERT_FILE = DATA_DIR + "/spice-ca.pem"
Michael Hanselmann's avatar
Michael Hanselmann committed
156
CLUSTER_DOMAIN_SECRET_FILE = DATA_DIR + "/cluster-domain-secret"
157
INSTANCE_STATUS_FILE = RUN_GANETI_DIR + "/instance-status"
Iustin Pop's avatar
Iustin Pop committed
158
SSH_KNOWN_HOSTS_FILE = DATA_DIR + "/known_hosts"
159
RAPI_USERS_FILE = DATA_DIR + "/rapi/users"
160
QUEUE_DIR = DATA_DIR + "/queue"
161
DAEMON_UTIL = _autoconf.PKGLIBDIR + "/daemon-util"
162
SETUP_SSH = _autoconf.TOOLSDIR + "/setup-ssh"
163
KVM_IFUP = _autoconf.PKGLIBDIR + "/kvm-ifup"
164
KVM_CONSOLE_WRAPPER = _autoconf.PKGLIBDIR + "/tools/kvm-console-wrapper"
165
XM_CONSOLE_WRAPPER = _autoconf.PKGLIBDIR + "/tools/xm-console-wrapper"
166
ETC_HOSTS = "/etc/hosts"
167
DEFAULT_FILE_STORAGE_DIR = _autoconf.FILE_STORAGE_DIR
168
DEFAULT_SHARED_FILE_STORAGE_DIR = _autoconf.SHARED_FILE_STORAGE_DIR
169
ENABLE_FILE_STORAGE = _autoconf.ENABLE_FILE_STORAGE
170
ENABLE_SHARED_FILE_STORAGE = _autoconf.ENABLE_SHARED_FILE_STORAGE
171
SYSCONFDIR = _autoconf.SYSCONFDIR
172
TOOLSDIR = _autoconf.TOOLSDIR
173
CONF_DIR = SYSCONFDIR + "/ganeti"
174
USER_SCRIPTS_DIR = CONF_DIR + "/scripts"
175
ENABLE_CONFD = _autoconf.ENABLE_CONFD
176

Michael Hanselmann's avatar
Michael Hanselmann committed
177
178
179
180
181
182
183
#: Lock file for watcher, locked in shared mode by watcher; lock in exclusive
# mode to block watcher (see L{cli._RunWhileClusterStoppedHelper.Call}
WATCHER_LOCK_FILE = LOCK_DIR + "/ganeti-watcher.lock"

#: Status file for per-group watcher, locked in exclusive mode by watcher
WATCHER_GROUP_STATE_FILE = DATA_DIR + "/watcher.%s.data"

184
185
186
187
#: File for per-group instance status, merged into L{INSTANCE_STATUS_FILE} by
#: per-group processes
WATCHER_GROUP_INSTANCE_STATUS_FILE = DATA_DIR + "/watcher.%s.instance-status"

Michael Hanselmann's avatar
Michael Hanselmann committed
188
189
190
#: File containing Unix timestamp until which watcher should be paused
WATCHER_PAUSEFILE = DATA_DIR + "/watcher.pause"

191
192
193
194
# Master IP address setup scripts paths (default and user-provided)
DEFAULT_MASTER_SETUP_SCRIPT = TOOLSDIR + "/master-ip-setup"
EXTERNAL_MASTER_SETUP_SCRIPT = USER_SCRIPTS_DIR + "/master-ip-setup"

195
196
197
198
199
200
ALL_CERT_FILES = frozenset([
  NODED_CERT_FILE,
  RAPI_CERT_FILE,
  SPICE_CERT_FILE,
  SPICE_CACERT_FILE,
  ])
201

202
MASTER_SOCKET = SOCKET_DIR + "/ganeti-master"
Iustin Pop's avatar
Iustin Pop committed
203

204
NODED = "ganeti-noded"
Guido Trotter's avatar
Guido Trotter committed
205
CONFD = "ganeti-confd"
Guido Trotter's avatar
Guido Trotter committed
206
RAPI = "ganeti-rapi"
207
MASTERD = "ganeti-masterd"
Guido Trotter's avatar
Guido Trotter committed
208
209
# used in the ganeti-nbma project
NLD = "ganeti-nld"
210
211
212
213

DAEMONS_PORTS = {
  # daemon-name: ("proto", "default-port")
  NODED: ("tcp", 1811),
Guido Trotter's avatar
Guido Trotter committed
214
  CONFD: ("udp", 1814),
Guido Trotter's avatar
Guido Trotter committed
215
  RAPI: ("tcp", 5080),
216
  "ssh": ("tcp", 22),
Guido Trotter's avatar
Guido Trotter committed
217
218
  # used in the ganeti-nbma project
  NLD: ("udp", 1816),
219
220
}
DEFAULT_NODED_PORT = DAEMONS_PORTS[NODED][1]
Guido Trotter's avatar
Guido Trotter committed
221
DEFAULT_CONFD_PORT = DAEMONS_PORTS[CONFD][1]
Guido Trotter's avatar
Guido Trotter committed
222
DEFAULT_RAPI_PORT = DAEMONS_PORTS[RAPI][1]
Guido Trotter's avatar
Guido Trotter committed
223
224
# used in the ganeti-nbma project
DEFAULT_NLD_PORT = DAEMONS_PORTS[NLD][1]
225

Iustin Pop's avatar
Iustin Pop committed
226
227
228
FIRST_DRBD_PORT = 11000
LAST_DRBD_PORT = 14999

229
LOG_DIR = _autoconf.LOCALSTATEDIR + "/log/ganeti/"
230
DAEMONS_LOGFILES = {
Michael Hanselmann's avatar
Michael Hanselmann committed
231
232
233
234
235
  # "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
236
237
  # used in the ganeti-nbma project
  NLD: LOG_DIR + "nl-daemon.log",
Michael Hanselmann's avatar
Michael Hanselmann committed
238
  }
Michael Hanselmann's avatar
Michael Hanselmann committed
239

240
241
242
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
243
LOG_BURNIN = LOG_DIR + "burnin.log"
244
LOG_SETUP_SSH = LOG_DIR + "setup-ssh.log"
Iustin Pop's avatar
Iustin Pop committed
245

Luca Bigliardi's avatar
Luca Bigliardi committed
246
247
DEV_CONSOLE = "/dev/console"

Balazs Lecz's avatar
Balazs Lecz committed
248
249
PROC_MOUNTS = "/proc/mounts"

250
# Local UniX Interface related constants
251
LUXI_EOM = "\3"
252
LUXI_VERSION = CONFIG_VERSION
253

Iustin Pop's avatar
Iustin Pop committed
254
# one of "no", "yes", "only"
255
256
257
258
259
260
SYSLOG_USAGE = _autoconf.SYSLOG_USAGE
SYSLOG_NO = "no"
SYSLOG_YES = "yes"
SYSLOG_ONLY = "only"
SYSLOG_SOCKET = "/dev/log"

261
OS_SEARCH_PATH = _autoconf.OS_SEARCH_PATH
262
EXPORT_DIR = _autoconf.EXPORT_DIR
Iustin Pop's avatar
Iustin Pop committed
263
264
265

EXPORT_CONF_FILE = "config.ini"

266
XEN_BOOTLOADER = _autoconf.XEN_BOOTLOADER
267
268
XEN_KERNEL = _autoconf.XEN_KERNEL
XEN_INITRD = _autoconf.XEN_INITRD
269
XEN_CMD = "xm"
270

271
KVM_PATH = _autoconf.KVM_PATH
272
KVM_KERNEL = _autoconf.KVM_KERNEL
Guido Trotter's avatar
Guido Trotter committed
273
SOCAT_PATH = _autoconf.SOCAT_PATH
274
SOCAT_USE_ESCAPE = _autoconf.SOCAT_USE_ESCAPE
275
SOCAT_USE_COMPRESS = _autoconf.SOCAT_USE_COMPRESS
276
SOCAT_ESCAPE_CODE = "0x1d"
277

278
279
280
281
282
283
#: Console as SSH command
CONS_SSH = "ssh"

#: Console as VNC server
CONS_VNC = "vnc"

284
285
286
#: Console as SPICE server
CONS_SPICE = "spice"

287
288
289
290
#: Display a message for console access
CONS_MESSAGE = "msg"

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

293
294
295
296
297
# 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

298
299
300
# 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
301
# modifying the ciphers, ensure not to accidentially add something after it's
302
303
304
305
# 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"

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

309
310
311
312
313
314
# Default validity of certificates in days
X509_CERT_DEFAULT_VALIDITY = 365 * 5

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

315
316
X509_CERT_SIGNATURE_HEADER = "X-Ganeti-Signature"

317
318
319
320
321
322
IMPORT_EXPORT_DAEMON = _autoconf.PKGLIBDIR + "/import-export"

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

323
324
325
326
327
328
329
330
# Import/export transport compression
IEC_NONE = "none"
IEC_GZIP = "gzip"
IEC_ALL = frozenset([
  IEC_NONE,
  IEC_GZIP,
  ])

331
332
IE_CUSTOM_SIZE = "fd"

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

335
336
337
338
339
340
341
342
# 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"

343
VALUE_DEFAULT = "default"
344
345
VALUE_AUTO = "auto"
VALUE_GENERATE = "generate"
346
VALUE_NONE = "none"
347
348
VALUE_TRUE = "true"
VALUE_FALSE = "false"
349

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

Iustin Pop's avatar
Iustin Pop committed
353
# hooks-related constants
354
HOOKS_BASE_DIR = CONF_DIR + "/hooks"
Iustin Pop's avatar
Iustin Pop committed
355
356
HOOKS_PHASE_PRE = "pre"
HOOKS_PHASE_POST = "post"
357
HOOKS_NAME_CFGUPDATE = "config-update"
Guido Trotter's avatar
Guido Trotter committed
358
HOOKS_NAME_WATCHER = "watcher"
359
HOOKS_VERSION = 2
360
HOOKS_PATH = "/sbin:/bin:/usr/sbin:/usr/bin"
Iustin Pop's avatar
Iustin Pop committed
361
362
363
364

# hooks subject type (what object type does the LU deal with)
HTYPE_CLUSTER = "CLUSTER"
HTYPE_NODE = "NODE"
365
HTYPE_GROUP = "GROUP"
Iustin Pop's avatar
Iustin Pop committed
366
367
368
369
370
371
HTYPE_INSTANCE = "INSTANCE"

HKR_SKIP = 0
HKR_FAIL = 1
HKR_SUCCESS = 2

372
373
374
375
# Storage types
ST_FILE = "file"
ST_LVM_PV = "lvm-pv"
ST_LVM_VG = "lvm-vg"
376
377

# Storage fields
378
379
380
381
# 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
382
383
384
385
386
387
SF_NAME = "name"
SF_SIZE = "size"
SF_FREE = "free"
SF_USED = "used"
SF_ALLOCATABLE = "allocatable"

388
389
390
# Storage operations
SO_FIX_CONSISTENCY = "fix-consistency"

391
# Available fields per storage type
Stephen Shirley's avatar
Stephen Shirley committed
392
393
394
395
396
397
398
399
VALID_STORAGE_FIELDS = frozenset([
  SF_NAME,
  SF_TYPE,
  SF_SIZE,
  SF_USED,
  SF_FREE,
  SF_ALLOCATABLE
  ])
400
401

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

403
404
405
406
MODIFIABLE_STORAGE_FIELDS = {
  ST_LVM_PV: frozenset([SF_ALLOCATABLE]),
  }

407
VALID_STORAGE_OPERATIONS = {
408
  ST_LVM_VG: frozenset([SO_FIX_CONSISTENCY]),
409
410
  }

411
412
413
414
415
416
# 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
417
418
419
# disk template types
DT_DISKLESS = "diskless"
DT_PLAIN = "plain"
420
DT_DRBD8 = "drbd"
421
DT_FILE = "file"
422
DT_SHARED_FILE = "sharedfile"
423
DT_BLOCK = "blockdev"
424
DT_RBD = "rbd"
425
426

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

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

432
# the set of non-lvm-based disk templates
433
434
DTS_NOT_LVM = frozenset([DT_DISKLESS, DT_FILE, DT_SHARED_FILE,
                         DT_BLOCK, DT_RBD])
435

436
# the set of disk templates which can be grown
437
DTS_GROWABLE = frozenset([DT_PLAIN, DT_DRBD8, DT_FILE, DT_SHARED_FILE, DT_RBD])
438

439
# the set of disk templates that allow adoption
440
441
442
443
DTS_MAY_ADOPT = frozenset([DT_PLAIN, DT_BLOCK])

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

445
# the set of disk templates that allow migrations
446
DTS_MIRRORED = frozenset.union(DTS_INT_MIRROR, DTS_EXT_MIRROR)
447

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

451
452
# logical disk types
LD_LV = "lvm"
453
LD_DRBD8 = "drbd8"
454
LD_FILE = "file"
455
LD_BLOCKDEV = "blockdev"
456
LD_RBD = "rbd"
457
458
459
460
461
LOGICAL_DISK_TYPES = frozenset([
  LD_LV,
  LD_DRBD8,
  LD_FILE,
  LD_BLOCKDEV,
462
  LD_RBD,
463
464
  ])

465
LDS_BLOCK = frozenset([LD_LV, LD_DRBD8, LD_BLOCKDEV, LD_RBD])
466

Iustin Pop's avatar
Iustin Pop committed
467
468
# drbd constants
DRBD_HMAC_ALG = "md5"
469
DRBD_NET_PROTOCOL = "C"
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488

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

490
491
492
# rbd tool command
RBD_CMD = "rbd"

493
494
495
# file backend driver
FD_LOOP = "loop"
FD_BLKTAP = "blktap"
496
497

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

500
# disk access mode
501
502
DISK_RDONLY = "ro"
DISK_RDWR = "rw"
503
504
DISK_ACCESS_SET = frozenset([DISK_RDONLY, DISK_RDWR])

505
# disk replacement mode
506
507
508
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
509
REPLACE_DISK_AUTO = "replace_auto"
510
511
512
513
514
515
REPLACE_MODES = frozenset([
  REPLACE_DISK_PRI,
  REPLACE_DISK_SEC,
  REPLACE_DISK_CHG,
  REPLACE_DISK_AUTO,
  ])
516

517
518
519
520
521
522
523
524
# Instance export mode
EXPORT_MODE_LOCAL = "local"
EXPORT_MODE_REMOTE = "remote"
EXPORT_MODES = frozenset([
  EXPORT_MODE_LOCAL,
  EXPORT_MODE_REMOTE,
  ])

525
# instance creation modes
Iustin Pop's avatar
Iustin Pop committed
526
527
INSTANCE_CREATE = "create"
INSTANCE_IMPORT = "import"
528
529
530
531
532
533
INSTANCE_REMOTE_IMPORT = "remote-import"
INSTANCE_CREATE_MODES = frozenset([
  INSTANCE_CREATE,
  INSTANCE_IMPORT,
  INSTANCE_REMOTE_IMPORT,
  ])
Iustin Pop's avatar
Iustin Pop committed
534

535
536
537
538
539
540
541
# 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

542
# Overall timeout for establishing connection
543
RIE_CONNECT_TIMEOUT = 180
544

545
546
547
548
549
550
# 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
551
552
#: Give child process up to 5 seconds to exit after sending a signal
CHILD_LINGER_TIMEOUT = 5.0
553

Stephen Shirley's avatar
Stephen Shirley committed
554
555
556
557
558
559
DISK_TEMPLATES = frozenset([
  DT_DISKLESS,
  DT_PLAIN,
  DT_DRBD8,
  DT_FILE,
  DT_SHARED_FILE,
560
561
  DT_BLOCK,
  DT_RBD
Stephen Shirley's avatar
Stephen Shirley committed
562
  ])
563
564

FILE_DRIVER = frozenset([FD_LOOP, FD_BLKTAP])
Iustin Pop's avatar
Iustin Pop committed
565
566
567
568

# import/export config options
INISECT_EXP = "export"
INISECT_INS = "instance"
569
570
INISECT_HYP = "hypervisor"
INISECT_BEP = "backend"
571
INISECT_OSP = "os"
572

573
# dynamic device modification
574
DDM_ADD = "add"
575
DDM_MODIFY = "modify"
576
577
DDM_REMOVE = "remove"
DDMS_VALUES = frozenset([DDM_ADD, DDM_REMOVE])
578
579
580
581
DDMS_VALUES_WITH_MODIFY = (DDMS_VALUES | frozenset([
  DDM_MODIFY,
  ]))
# TODO: DDM_SWAP, DDM_MOVE?
582

583
# common exit codes
Iustin Pop's avatar
Iustin Pop committed
584
EXIT_SUCCESS = 0
585
EXIT_FAILURE = 1
586
EXIT_NOTCLUSTER = 5
587
EXIT_NOTMASTER = 11
588
EXIT_NODESETUP_ERROR = 12
Iustin Pop's avatar
Iustin Pop committed
589
EXIT_CONFIRMATION = 13 # need user confirmation
590

591
592
593
#: Exit code for query operations with unknown fields
EXIT_UNKNOWN_FIELD = 14

594
595
# tags
TAG_CLUSTER = "cluster"
596
TAG_NODEGROUP = "nodegroup"
597
598
TAG_NODE = "node"
TAG_INSTANCE = "instance"
599
600
VALID_TAG_TYPES = frozenset([
  TAG_CLUSTER,
601
  TAG_NODEGROUP,
602
603
604
  TAG_NODE,
  TAG_INSTANCE,
  ])
605
606
607
MAX_TAG_LEN = 128
MAX_TAGS_PER_OBJ = 4096

608
609
# others
DEFAULT_BRIDGE = "xen-br0"
610
CLASSIC_DRBD_SYNC_SPEED = 60 * 1024  # 60 MiB, expressed in KiB
611
612
IP4_ADDRESS_LOCALHOST = "127.0.0.1"
IP4_ADDRESS_ANY = "0.0.0.0"
Manuel Franceschini's avatar
Manuel Franceschini committed
613
614
IP6_ADDRESS_LOCALHOST = "::1"
IP6_ADDRESS_ANY = "::"
615
616
IP4_VERSION = 4
IP6_VERSION = 6
617
VALID_IP_VERSIONS = frozenset([IP4_VERSION, IP6_VERSION])
618
619
620
621
# for export to htools
IP4_FAMILY = socket.AF_INET
IP6_FAMILY = socket.AF_INET6

622
TCP_PING_TIMEOUT = 10
623
GANETI_RUNAS = "root"
624
DEFAULT_VG = "xenvg"
625
DEFAULT_DRBD_HELPER = "/bin/true"
626
MIN_VG_SIZE = 20480
627
DEFAULT_MAC_PREFIX = "aa:00:00"
628
629
# default maximum instance wait time, in seconds.
DEFAULT_SHUTDOWN_TIMEOUT = 120
630
NODE_MAX_CLOCK_SKEW = 150
631
# Time for an intra-cluster disk transfer to wait for a connection
632
DISK_TRANSFER_CONNECT_TIMEOUT = 60
633
634
# Disk index separator
DISK_SEPARATOR = _autoconf.DISK_SEPARATOR
635
IP_COMMAND_PATH = _autoconf.IP_PATH
636

637
638
639
#: Key for job IDs in opcode result
JOB_IDS_KEY = "jobs"

640
641
642
643
644
645
646
# runparts results
(RUNPARTS_SKIP,
 RUNPARTS_RUN,
 RUNPARTS_ERR) = range(3)

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

647
648
649
650
# RPC constants
(RPC_ENCODING_NONE,
 RPC_ENCODING_ZLIB_BASE64) = range(2)

651
# os related constants
Iustin Pop's avatar
Iustin Pop committed
652
653
654
655
656
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
657
658
659
660
661
662
663
OS_SCRIPTS = frozenset([
  OS_SCRIPT_CREATE,
  OS_SCRIPT_IMPORT,
  OS_SCRIPT_EXPORT,
  OS_SCRIPT_RENAME,
  OS_SCRIPT_VERIFY
  ])
664

Iustin Pop's avatar
Iustin Pop committed
665
666
667
OS_API_FILE = "ganeti_api_version"
OS_VARIANTS_FILE = "variants.list"
OS_PARAMETERS_FILE = "parameters.list"
668

Iustin Pop's avatar
Iustin Pop committed
669
OS_VALIDATE_PARAMETERS = "parameters"
670
OS_VALIDATE_CALLS = frozenset([OS_VALIDATE_PARAMETERS])
671

672
# ssh constants
673
674
SSH_CONFIG_DIR = _autoconf.SSH_CONFIG_DIR
SSH_HOST_DSA_PRIV = SSH_CONFIG_DIR + "/ssh_host_dsa_key"
675
SSH_HOST_DSA_PUB = SSH_HOST_DSA_PRIV + ".pub"
676
SSH_HOST_RSA_PRIV = SSH_CONFIG_DIR + "/ssh_host_rsa_key"
677
SSH_HOST_RSA_PUB = SSH_HOST_RSA_PRIV + ".pub"
678
679
SSH = "ssh"
SCP = "scp"
680
681
682
683
684

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

686
687
688
689
690
691
692
693
694
695
696
697
698
699
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
  ])
700

Iustin Pop's avatar
Iustin Pop committed
701
VTYPE_STRING = "string"
702
VTYPE_MAYBE_STRING = "maybe-string"
Iustin Pop's avatar
Iustin Pop committed
703
704
705
VTYPE_BOOL = "bool"
VTYPE_SIZE = "size" # size, in MiBs
VTYPE_INT = "int"
706
ENFORCEABLE_TYPES = frozenset([
Stephen Shirley's avatar
Stephen Shirley committed
707
708
709
710
711
712
  VTYPE_STRING,
  VTYPE_MAYBE_STRING,
  VTYPE_BOOL,
  VTYPE_SIZE,
  VTYPE_INT,
  ])
713

714
715
716
# Constant representing that the user does not specify any IP version
IFACE_NO_IP_VERSION_SPECIFIED = 0

717
718
719
# HV parameter names (global namespace)
HV_BOOT_ORDER = "boot_order"
HV_CDROM_IMAGE_PATH = "cdrom_image_path"
720
721
HV_KVM_CDROM2_IMAGE_PATH = "cdrom2_image_path"
HV_KVM_FLOPPY_IMAGE_PATH = "floppy_image_path"
722
723
HV_NIC_TYPE = "nic_type"
HV_DISK_TYPE = "disk_type"
724
HV_KVM_CDROM_DISK_TYPE = "cdrom_disk_type"
725
HV_VNC_BIND_ADDRESS = "vnc_bind_address"
726
HV_VNC_PASSWORD_FILE = "vnc_password_file"
727
728
729
HV_VNC_TLS = "vnc_tls"
HV_VNC_X509 = "vnc_x509_path"
HV_VNC_X509_VERIFY = "vnc_x509_verify"
730
731
HV_KVM_SPICE_BIND = "spice_bind"
HV_KVM_SPICE_IP_VERSION = "spice_ip_version"
732
HV_KVM_SPICE_PASSWORD_FILE = "spice_password_file"
733
734
735
736
737
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"
738
HV_KVM_SPICE_USE_TLS = "spice_use_tls"
739
740
HV_KVM_SPICE_TLS_CIPHERS = "spice_tls_ciphers"
HV_KVM_SPICE_USE_VDAGENT = "spice_use_vdagent"
741
742
HV_ACPI = "acpi"
HV_PAE = "pae"
743
744
745
HV_USE_BOOTLOADER = "use_bootloader"
HV_BOOTLOADER_ARGS = "bootloader_args"
HV_BOOTLOADER_PATH = "bootloader_path"
746
HV_KERNEL_ARGS = "kernel_args"
747
748
HV_KERNEL_PATH = "kernel_path"
HV_INITRD_PATH = "initrd_path"
749
HV_ROOT_PATH = "root_path"
750
HV_SERIAL_CONSOLE = "serial_console"
751
HV_USB_MOUSE = "usb_mouse"
752
HV_KEYMAP = "keymap"
753
HV_DEVICE_MODEL = "device_model"
754
HV_INIT_SCRIPT = "init_script"
755
HV_MIGRATION_PORT = "migration_port"
756
757
HV_MIGRATION_BANDWIDTH = "migration_bandwidth"
HV_MIGRATION_DOWNTIME = "migration_downtime"
758
HV_MIGRATION_MODE = "migration_mode"
759
HV_USE_LOCALTIME = "use_localtime"
760
HV_DISK_CACHE = "disk_cache"
761
762
HV_SECURITY_MODEL = "security_model"
HV_SECURITY_DOMAIN = "security_domain"
Guido Trotter's avatar
Guido Trotter committed
763
HV_KVM_FLAG = "kvm_flag"
764
HV_VHOST_NET = "vhost_net"
Balazs Lecz's avatar
Balazs Lecz committed
765
HV_KVM_USE_CHROOT = "use_chroot"
766
HV_CPU_MASK = "cpu_mask"
767
HV_MEM_PATH = "mem_path"
768
HV_BLOCKDEV_PREFIX = "blockdev_prefix"
769
HV_REBOOT_BEHAVIOR = "reboot_behavior"
770

771
772
HVS_PARAMETER_TYPES = {
  HV_BOOT_ORDER: VTYPE_STRING,
773
  HV_KVM_FLOPPY_IMAGE_PATH: VTYPE_STRING,
774
  HV_CDROM_IMAGE_PATH: VTYPE_STRING,
775
  HV_KVM_CDROM2_IMAGE_PATH: VTYPE_STRING,
776
777
  HV_NIC_TYPE: VTYPE_STRING,
  HV_DISK_TYPE: VTYPE_STRING,
778
  HV_KVM_CDROM_DISK_TYPE: VTYPE_STRING,
779
  HV_VNC_PASSWORD_FILE: VTYPE_STRING,
780
781
782
783
  HV_VNC_BIND_ADDRESS: VTYPE_STRING,
  HV_VNC_TLS: VTYPE_BOOL,
  HV_VNC_X509: VTYPE_STRING,
  HV_VNC_X509_VERIFY: VTYPE_BOOL,
784
785
  HV_KVM_SPICE_BIND: VTYPE_STRING,
  HV_KVM_SPICE_IP_VERSION: VTYPE_INT,
786
  HV_KVM_SPICE_PASSWORD_FILE: VTYPE_STRING,
787
788
789
790
791
  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,
792
  HV_KVM_SPICE_USE_TLS: VTYPE_BOOL,
793
794
  HV_KVM_SPICE_TLS_CIPHERS: VTYPE_STRING,
  HV_KVM_SPICE_USE_VDAGENT: VTYPE_BOOL,
795
796
  HV_ACPI: VTYPE_BOOL,
  HV_PAE: VTYPE_BOOL,
797
798
799
  HV_USE_BOOTLOADER: VTYPE_BOOL,
  HV_BOOTLOADER_PATH: VTYPE_STRING,
  HV_BOOTLOADER_ARGS: VTYPE_STRING,
800
  HV_KERNEL_PATH: VTYPE_STRING,
801
  HV_KERNEL_ARGS: VTYPE_STRING,
802
  HV_INITRD_PATH: VTYPE_STRING,
803
  HV_ROOT_PATH: VTYPE_MAYBE_STRING,
804
805
  HV_SERIAL_CONSOLE: VTYPE_BOOL,
  HV_USB_MOUSE: VTYPE_STRING,
806
  HV_KEYMAP: VTYPE_STRING,
807
  HV_DEVICE_MODEL: VTYPE_STRING,
808
  HV_INIT_SCRIPT: VTYPE_STRING,
809
  HV_MIGRATION_PORT: VTYPE_INT,
810
811
  HV_MIGRATION_BANDWIDTH: VTYPE_INT,
  HV_MIGRATION_DOWNTIME: VTYPE_INT,
812
  HV_MIGRATION_MODE: VTYPE_STRING,
813
  HV_USE_LOCALTIME: VTYPE_BOOL,
814
  HV_DISK_CACHE: VTYPE_STRING,
815
816
  HV_SECURITY_MODEL: VTYPE_STRING,
  HV_SECURITY_DOMAIN: VTYPE_STRING,
Guido Trotter's avatar
Guido Trotter committed
817
  HV_KVM_FLAG: VTYPE_STRING,
818
  HV_VHOST_NET: VTYPE_BOOL,
Balazs Lecz's avatar
Balazs Lecz committed
819
  HV_KVM_USE_CHROOT: VTYPE_BOOL,
820
  HV_CPU_MASK: VTYPE_STRING,
821
  HV_MEM_PATH: VTYPE_STRING,
822
  HV_BLOCKDEV_PREFIX: VTYPE_STRING,
823
  HV_REBOOT_BEHAVIOR: VTYPE_STRING,
824
825
826
  }

HVS_PARAMETERS = frozenset(HVS_PARAMETER_TYPES.keys())
827

828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
# 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

849
850
851
# Node info keys
HV_NODEINFO_KEY_VERSION = "hv_version"

852
853
854
855
856
857
858
# 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"

859
860
861
862
863
864
865
866
HVST_DEFAULTS = {
  HVST_MEMORY_TOTAL: 0,
  HVST_MEMORY_NODE: 0,
  HVST_MEMORY_HV: 0,
  HVST_CPU_TOTAL: 1,
  HVST_CPU_NODE: 1,
  }

867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
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"

882
883
884
885
886
887
DS_DEFAULTS = {
  DS_DISK_TOTAL: 0,
  DS_DISK_RESERVED: 0,
  DS_DISK_OVERHEAD: 0,
  }

888
889
890
891
892
893
894
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())
895
DS_VALID_TYPES = frozenset([LD_LV])
896

897
# Backend parameter names
898
899
900
BE_MEMORY = "memory" # deprecated and replaced by max and min mem
BE_MAXMEM = "maxmem"
BE_MINMEM = "minmem"
901
BE_VCPUS = "vcpus"
902
BE_AUTO_BALANCE = "auto_balance"
903
BE_ALWAYS_FAILOVER = "always_failover"
904
BE_SPINDLE_USE = "spindle_use"
905

906
BES_PARAMETER_TYPES = {
907
908
909
910
  BE_MAXMEM: VTYPE_SIZE,
  BE_MINMEM: VTYPE_SIZE,
  BE_VCPUS: VTYPE_INT,
  BE_AUTO_BALANCE: VTYPE_BOOL,
911
  BE_ALWAYS_FAILOVER: VTYPE_BOOL,
912
  BE_SPINDLE_USE: VTYPE_INT,
913
  }
914

915
916
917
918
919
BES_PARAMETER_COMPAT = {
  BE_MEMORY: VTYPE_SIZE,
  }
BES_PARAMETER_COMPAT.update(BES_PARAMETER_TYPES)

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

922
# instance specs
923
924
925
926
927
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"
928
ISPEC_SPINDLE_USE = "spindle-use"
929
930

ISPECS_PARAMETER_TYPES = {
931
932
933
934
935
  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,
936
  ISPEC_SPINDLE_USE: VTYPE_INT,
937
938
939
940
  }

ISPECS_PARAMETERS = frozenset(ISPECS_PARAMETER_TYPES.keys())

941
942
943
ISPECS_MIN = "min"
ISPECS_MAX = "max"
ISPECS_STD = "std"
944
945
IPOLICY_DTS = "disk-templates"
IPOLICY_VCPU_RATIO = "vcpu-ratio"
946
IPOLICY_SPINDLE_RATIO = "spindle-ratio"
947

948
IPOLICY_ISPECS = frozenset([
949
950
951
  ISPECS_MIN,
  ISPECS_MAX,
  ISPECS_STD,
952
  ])
953
954
955

IPOLICY_PARAMETERS = frozenset([
  IPOLICY_VCPU_RATIO,
956
  IPOLICY_SPINDLE_RATIO,
957
958
959
960
961
  ])

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

963
964
# Node parameter names
ND_OOB_PROGRAM = "oob_program"
965
ND_SPINDLE_COUNT = "spindle_count"
966
967

NDS_PARAMETER_TYPES = {
968
  ND_OOB_PROGRAM: VTYPE_MAYBE_STRING,
969
  ND_SPINDLE_COUNT: VTYPE_INT,
970
  }
971
972
973

NDS_PARAMETERS = frozenset(NDS_PARAMETER_TYPES.keys())

974
# Logical Disks parameters
975
976
977
978
LDP_RESYNC_RATE = "resync-rate"
LDP_STRIPES = "stripes"
LDP_BARRIERS = "disabled-barriers"
LDP_NO_META_FLUSH = "disable-meta-flush"
979
LDP_DEFAULT_METAVG = "default-metavg"
980
981
LDP_DISK_CUSTOM = "disk-custom"
LDP_NET_CUSTOM = "net-custom"
982 <