constants.py 29.4 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 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
25
import re

26
from ganeti import _autoconf
27

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

39

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

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


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

87
88
# user separation
DAEMONS_GROUP = _autoconf.DAEMONS_GROUP
89
ADMIN_GROUP = _autoconf.ADMIN_GROUP
90
MASTERD_USER = _autoconf.MASTERD_USER
91
MASTERD_GROUP = _autoconf.MASTERD_GROUP
92
RAPI_USER = _autoconf.RAPI_USER
93
94
95
96
RAPI_GROUP = _autoconf.RAPI_GROUP
CONFD_USER = _autoconf.CONFD_USER
CONFD_GROUP = _autoconf.CONFD_GROUP
NODED_USER = _autoconf.NODED_USER
97

98
99
100
# Wipe
WIPE_CMD = _autoconf.WIPE_CMD

Iustin Pop's avatar
Iustin Pop committed
101
# file paths
102
DATA_DIR = _autoconf.LOCALSTATEDIR + "/lib/ganeti"
103
RUN_DIR = _autoconf.LOCALSTATEDIR + "/run"
104
RUN_GANETI_DIR = RUN_DIR + "/ganeti"
105
BDEV_CACHE_DIR = RUN_GANETI_DIR + "/bdev-cache"
106
DISK_LINKS_DIR = RUN_GANETI_DIR + "/instance-disks"
107
RUN_DIRS_MODE = 0775
Guido Trotter's avatar
Guido Trotter committed
108
SOCKET_DIR = RUN_GANETI_DIR + "/socket"
109
SECURE_DIR_MODE = 0700
110
SECURE_FILE_MODE = 0600
111
SOCKET_DIR_MODE = 0750
112
CRYPTO_KEYS_DIR = RUN_GANETI_DIR + "/crypto"
Guido Trotter's avatar
Guido Trotter committed
113
CRYPTO_KEYS_DIR_MODE = SECURE_DIR_MODE
114
115
IMPORT_EXPORT_DIR = RUN_GANETI_DIR + "/import-export"
IMPORT_EXPORT_DIR_MODE = 0755
116
117
118
# 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
119
LOCK_DIR = _autoconf.LOCALSTATEDIR + "/lock"
120
SSCONF_LOCK_FILE = LOCK_DIR + "/ganeti-ssconf.lock"
121
122
123
# 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
124
CLUSTER_CONF_FILE = DATA_DIR + "/config.data"
125
NODED_CERT_FILE = DATA_DIR + "/server.pem"
126
RAPI_CERT_FILE = DATA_DIR + "/rapi.pem"
127
CONFD_HMAC_KEY = DATA_DIR + "/hmac.key"
Michael Hanselmann's avatar
Michael Hanselmann committed
128
CLUSTER_DOMAIN_SECRET_FILE = DATA_DIR + "/cluster-domain-secret"
129
WATCHER_STATEFILE = DATA_DIR + "/watcher.data"
130
WATCHER_PAUSEFILE = DATA_DIR + "/watcher.pause"
131
INSTANCE_UPFILE = RUN_GANETI_DIR + "/instance-status"
Iustin Pop's avatar
Iustin Pop committed
132
SSH_KNOWN_HOSTS_FILE = DATA_DIR + "/known_hosts"
133
RAPI_USERS_FILE = DATA_DIR + "/rapi_users"
134
QUEUE_DIR = DATA_DIR + "/queue"
135
DAEMON_UTIL = _autoconf.PKGLIBDIR + "/daemon-util"
136
SETUP_SSH = _autoconf.TOOLSDIR + "/setup-ssh"
137
ETC_HOSTS = "/etc/hosts"
138
DEFAULT_FILE_STORAGE_DIR = _autoconf.FILE_STORAGE_DIR
139
ENABLE_FILE_STORAGE = _autoconf.ENABLE_FILE_STORAGE
140
SYSCONFDIR = _autoconf.SYSCONFDIR
141
TOOLSDIR = _autoconf.TOOLSDIR
142
CONF_DIR = SYSCONFDIR + "/ganeti"
143

144
ALL_CERT_FILES = frozenset([NODED_CERT_FILE, RAPI_CERT_FILE])
145

146
MASTER_SOCKET = SOCKET_DIR + "/ganeti-master"
Iustin Pop's avatar
Iustin Pop committed
147

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

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

Iustin Pop's avatar
Iustin Pop committed
170
171
FIRST_DRBD_PORT = 11000
LAST_DRBD_PORT = 14999
172
MASTER_SCRIPT = "ganeti-master"
Iustin Pop's avatar
Iustin Pop committed
173

174
LOG_DIR = _autoconf.LOCALSTATEDIR + "/log/ganeti/"
175
DAEMONS_LOGFILES = {
Michael Hanselmann's avatar
Michael Hanselmann committed
176
177
178
179
180
  # "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
181
182
  # used in the ganeti-nbma project
  NLD: LOG_DIR + "nl-daemon.log",
Michael Hanselmann's avatar
Michael Hanselmann committed
183
  }
Michael Hanselmann's avatar
Michael Hanselmann committed
184

185
186
187
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
188
LOG_BURNIN = LOG_DIR + "burnin.log"
189
LOG_SETUP_SSH = LOG_DIR + "setup-ssh.log"
Iustin Pop's avatar
Iustin Pop committed
190

Luca Bigliardi's avatar
Luca Bigliardi committed
191
192
DEV_CONSOLE = "/dev/console"

Balazs Lecz's avatar
Balazs Lecz committed
193
194
PROC_MOUNTS = "/proc/mounts"

195
196
197
# luxi related constants
LUXI_EOM = "\3"

198
199
200
201
202
203
204
# one of 'no', 'yes', 'only'
SYSLOG_USAGE = _autoconf.SYSLOG_USAGE
SYSLOG_NO = "no"
SYSLOG_YES = "yes"
SYSLOG_ONLY = "only"
SYSLOG_SOCKET = "/dev/log"

205
OS_SEARCH_PATH = _autoconf.OS_SEARCH_PATH
206
EXPORT_DIR = _autoconf.EXPORT_DIR
Iustin Pop's avatar
Iustin Pop committed
207
208
209

EXPORT_CONF_FILE = "config.ini"

210
XEN_BOOTLOADER = _autoconf.XEN_BOOTLOADER
211
212
213
XEN_KERNEL = _autoconf.XEN_KERNEL
XEN_INITRD = _autoconf.XEN_INITRD

214
KVM_PATH = _autoconf.KVM_PATH
Guido Trotter's avatar
Guido Trotter committed
215
SOCAT_PATH = _autoconf.SOCAT_PATH
216
SOCAT_USE_ESCAPE = _autoconf.SOCAT_USE_ESCAPE
217
SOCAT_ESCAPE_CODE = "0x1d"
218

219
220
221
222
223
# 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

224
225
226
227
228
229
230
231
# 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
# modifying the ciphers, ensure to not accidentially add something after it's
# 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"

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

235
236
237
238
239
240
# Default validity of certificates in days
X509_CERT_DEFAULT_VALIDITY = 365 * 5

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

241
242
X509_CERT_SIGNATURE_HEADER = "X-Ganeti-Signature"

243
244
245
246
247
248
IMPORT_EXPORT_DAEMON = _autoconf.PKGLIBDIR + "/import-export"

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

249
250
251
252
253
254
255
256
# Import/export transport compression
IEC_NONE = "none"
IEC_GZIP = "gzip"
IEC_ALL = frozenset([
  IEC_NONE,
  IEC_GZIP,
  ])

257
258
IE_CUSTOM_SIZE = "fd"

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

261
262
263
264
265
266
267
268
# 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"

269
VALUE_DEFAULT = "default"
270
271
VALUE_AUTO = "auto"
VALUE_GENERATE = "generate"
272
VALUE_NONE = "none"
273
274
VALUE_TRUE = "true"
VALUE_FALSE = "false"
275

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

Iustin Pop's avatar
Iustin Pop committed
279
# hooks-related constants
280
HOOKS_BASE_DIR = CONF_DIR + "/hooks"
Iustin Pop's avatar
Iustin Pop committed
281
282
HOOKS_PHASE_PRE = "pre"
HOOKS_PHASE_POST = "post"
283
HOOKS_NAME_CFGUPDATE = "config-update"
Guido Trotter's avatar
Guido Trotter committed
284
HOOKS_NAME_WATCHER = "watcher"
285
HOOKS_VERSION = 2
Iustin Pop's avatar
Iustin Pop committed
286
287
288
289
290
291
292
293
294
295

# 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

296
297
298
299
# Storage types
ST_FILE = "file"
ST_LVM_PV = "lvm-pv"
ST_LVM_VG = "lvm-vg"
300
301

# Storage fields
302
303
304
305
# 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
306
307
308
309
310
311
SF_NAME = "name"
SF_SIZE = "size"
SF_FREE = "free"
SF_USED = "used"
SF_ALLOCATABLE = "allocatable"

312
313
314
# Storage operations
SO_FIX_CONSISTENCY = "fix-consistency"

315
# Available fields per storage type
316
317
318
319
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
320

321
322
323
324
MODIFIABLE_STORAGE_FIELDS = {
  ST_LVM_PV: frozenset([SF_ALLOCATABLE]),
  }

325
VALID_STORAGE_OPERATIONS = {
326
  ST_LVM_VG: frozenset([SO_FIX_CONSISTENCY]),
327
328
  }

329
330
331
332
333
334
# 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
335
336
337
# disk template types
DT_DISKLESS = "diskless"
DT_PLAIN = "plain"
338
DT_DRBD8 = "drbd"
339
DT_FILE = "file"
340
341

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

344
345
346
# the set of non-lvm-based disk templates
DTS_NOT_LVM = frozenset([DT_DISKLESS, DT_FILE])

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

350
351
352
# the set of disk templates that allow adoption
DTS_MAY_ADOPT = frozenset([DT_PLAIN])

353
354
# logical disk types
LD_LV = "lvm"
355
LD_DRBD8 = "drbd8"
356
LD_FILE = "file"
357
LDS_BLOCK = frozenset([LD_LV, LD_DRBD8])
358

Iustin Pop's avatar
Iustin Pop committed
359
360
# drbd constants
DRBD_HMAC_ALG = "md5"
361
DRBD_NET_PROTOCOL = "C"
362
DRBD_BARRIERS = _autoconf.DRBD_BARRIERS
Iustin Pop's avatar
Iustin Pop committed
363

364
365
366
# file backend driver
FD_LOOP = "loop"
FD_BLKTAP = "blktap"
367
368

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

371
# disk access mode
372
373
DISK_RDONLY = "ro"
DISK_RDWR = "rw"
374
375
DISK_ACCESS_SET = frozenset([DISK_RDONLY, DISK_RDWR])

376
# disk replacement mode
377
378
379
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
380
REPLACE_DISK_AUTO = "replace_auto"
381
382
383
384
385
386
REPLACE_MODES = frozenset([
  REPLACE_DISK_PRI,
  REPLACE_DISK_SEC,
  REPLACE_DISK_CHG,
  REPLACE_DISK_AUTO,
  ])
387

388
389
390
391
392
393
394
395
# Instance export mode
EXPORT_MODE_LOCAL = "local"
EXPORT_MODE_REMOTE = "remote"
EXPORT_MODES = frozenset([
  EXPORT_MODE_LOCAL,
  EXPORT_MODE_REMOTE,
  ])

396
397
# lock recalculate mode
LOCKS_REPLACE = 'replace'
398
LOCKS_APPEND = 'append'
399

400
# instance creation modes
Iustin Pop's avatar
Iustin Pop committed
401
402
INSTANCE_CREATE = "create"
INSTANCE_IMPORT = "import"
403
404
405
406
407
408
INSTANCE_REMOTE_IMPORT = "remote-import"
INSTANCE_CREATE_MODES = frozenset([
  INSTANCE_CREATE,
  INSTANCE_IMPORT,
  INSTANCE_REMOTE_IMPORT,
  ])
Iustin Pop's avatar
Iustin Pop committed
409

410
411
412
413
414
415
416
# 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

417
418
419
# Remote import/export connect timeout for socat
RIE_CONNECT_TIMEOUT = 60

Iustin Pop's avatar
Iustin Pop committed
420
DISK_TEMPLATES = frozenset([DT_DISKLESS, DT_PLAIN,
421
422
423
                            DT_DRBD8, DT_FILE])

FILE_DRIVER = frozenset([FD_LOOP, FD_BLKTAP])
Iustin Pop's avatar
Iustin Pop committed
424
425
426
427

# import/export config options
INISECT_EXP = "export"
INISECT_INS = "instance"
428
429
INISECT_HYP = "hypervisor"
INISECT_BEP = "backend"
430
INISECT_OSP = "os"
431

432
# dynamic device modification
433
434
435
DDM_ADD = "add"
DDM_REMOVE = "remove"
DDMS_VALUES = frozenset([DDM_ADD, DDM_REMOVE])
436

437
# common exit codes
Iustin Pop's avatar
Iustin Pop committed
438
EXIT_SUCCESS = 0
439
EXIT_FAILURE = 1
440
EXIT_NOTCLUSTER = 5
441
EXIT_NOTMASTER = 11
442
EXIT_NODESETUP_ERROR = 12
Iustin Pop's avatar
Iustin Pop committed
443
EXIT_CONFIRMATION = 13 # need user confirmation
444

445
446
447
448
# tags
TAG_CLUSTER = "cluster"
TAG_NODE = "node"
TAG_INSTANCE = "instance"
449
450
451
452
453
VALID_TAG_TYPES = frozenset([
  TAG_CLUSTER,
  TAG_NODE,
  TAG_INSTANCE,
  ])
454
455
456
MAX_TAG_LEN = 128
MAX_TAGS_PER_OBJ = 4096

457
458
# others
DEFAULT_BRIDGE = "xen-br0"
Iustin Pop's avatar
Iustin Pop committed
459
SYNC_SPEED = 60 * 1024
460
461
IP4_ADDRESS_LOCALHOST = "127.0.0.1"
IP4_ADDRESS_ANY = "0.0.0.0"
Manuel Franceschini's avatar
Manuel Franceschini committed
462
463
IP6_ADDRESS_LOCALHOST = "::1"
IP6_ADDRESS_ANY = "::"
464
465
IP4_VERSION = 4
IP6_VERSION = 6
466
TCP_PING_TIMEOUT = 10
467
GANETI_RUNAS = "root"
468
DEFAULT_VG = "xenvg"
469
DEFAULT_DRBD_HELPER = "/bin/true"
470
MIN_VG_SIZE = 20480
471
DEFAULT_MAC_PREFIX = "aa:00:00"
472
LVM_STRIPECOUNT = _autoconf.LVM_STRIPECOUNT
473
474
# default maximum instance wait time, in seconds.
DEFAULT_SHUTDOWN_TIMEOUT = 120
475
NODE_MAX_CLOCK_SKEW = 150
476
477
# Time for an intra-cluster disk transfer to wait for a connection
DISK_TRANSFER_CONNECT_TIMEOUT = 30
478

479
480
481
482
483
484
485
# runparts results
(RUNPARTS_SKIP,
 RUNPARTS_RUN,
 RUNPARTS_ERR) = range(3)

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

486
487
488
489
# RPC constants
(RPC_ENCODING_NONE,
 RPC_ENCODING_ZLIB_BASE64) = range(2)

490
491
492
493
494
# os related constants
OS_SCRIPT_CREATE = 'create'
OS_SCRIPT_IMPORT = 'import'
OS_SCRIPT_EXPORT = 'export'
OS_SCRIPT_RENAME = 'rename'
495
OS_SCRIPT_VERIFY = 'verify'
Iustin Pop's avatar
Iustin Pop committed
496
OS_SCRIPTS = frozenset([OS_SCRIPT_CREATE, OS_SCRIPT_IMPORT,
497
498
                        OS_SCRIPT_EXPORT, OS_SCRIPT_RENAME,
                        OS_SCRIPT_VERIFY])
499

500
OS_API_FILE = 'ganeti_api_version'
501
OS_VARIANTS_FILE = 'variants.list'
502
503
504
OS_PARAMETERS_FILE = 'parameters.list'

OS_VALIDATE_PARAMETERS = 'parameters'
505
OS_VALIDATE_CALLS = frozenset([OS_VALIDATE_PARAMETERS])
506

507
# ssh constants
508
509
SSH_CONFIG_DIR = _autoconf.SSH_CONFIG_DIR
SSH_HOST_DSA_PRIV = SSH_CONFIG_DIR + "/ssh_host_dsa_key"
510
SSH_HOST_DSA_PUB = SSH_HOST_DSA_PRIV + ".pub"
511
SSH_HOST_RSA_PRIV = SSH_CONFIG_DIR + "/ssh_host_rsa_key"
512
SSH_HOST_RSA_PUB = SSH_HOST_RSA_PRIV + ".pub"
513
514
SSH = "ssh"
SCP = "scp"
515
516
517
518
519

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

521
522
523
524
REBOOT_TYPES = frozenset([INSTANCE_REBOOT_SOFT,
                          INSTANCE_REBOOT_HARD,
                          INSTANCE_REBOOT_FULL])

525
VTYPE_STRING = 'string'
526
VTYPE_MAYBE_STRING = "maybe-string"
527
528
529
530
531
VTYPE_BOOL = 'bool'
VTYPE_SIZE = 'size' # size, in MiBs
VTYPE_INT = 'int'
ENFORCEABLE_TYPES = frozenset([
                      VTYPE_STRING,
532
                      VTYPE_MAYBE_STRING,
533
534
535
536
537
                      VTYPE_BOOL,
                      VTYPE_SIZE,
                      VTYPE_INT,
                      ])

538
539
540
541
542
543
# 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"
544
HV_VNC_PASSWORD_FILE = "vnc_password_file"
545
546
547
HV_VNC_TLS = "vnc_tls"
HV_VNC_X509 = "vnc_x509_path"
HV_VNC_X509_VERIFY = "vnc_x509_verify"
548
549
HV_ACPI = "acpi"
HV_PAE = "pae"
550
551
552
HV_USE_BOOTLOADER = "use_bootloader"
HV_BOOTLOADER_ARGS = "bootloader_args"
HV_BOOTLOADER_PATH = "bootloader_path"
553
HV_KERNEL_ARGS = "kernel_args"
554
555
HV_KERNEL_PATH = "kernel_path"
HV_INITRD_PATH = "initrd_path"
556
HV_ROOT_PATH = "root_path"
557
HV_SERIAL_CONSOLE = "serial_console"
558
HV_USB_MOUSE = "usb_mouse"
559
HV_DEVICE_MODEL = "device_model"
560
HV_INIT_SCRIPT = "init_script"
561
HV_MIGRATION_PORT = "migration_port"
562
563
HV_MIGRATION_BANDWIDTH = "migration_bandwidth"
HV_MIGRATION_DOWNTIME = "migration_downtime"
564
HV_MIGRATION_MODE = "migration_mode"
565
HV_USE_LOCALTIME = "use_localtime"
566
HV_DISK_CACHE = "disk_cache"
567
568
HV_SECURITY_MODEL = "security_model"
HV_SECURITY_DOMAIN = "security_domain"
Guido Trotter's avatar
Guido Trotter committed
569
HV_KVM_FLAG = "kvm_flag"
570
HV_VHOST_NET = "vhost_net"
Balazs Lecz's avatar
Balazs Lecz committed
571
HV_KVM_USE_CHROOT = "use_chroot"
572
HV_CPU_MASK = "cpu_mask"
573
HV_MEM_PATH = "mem_path"
574

575
576
577
578
579
HVS_PARAMETER_TYPES = {
  HV_BOOT_ORDER: VTYPE_STRING,
  HV_CDROM_IMAGE_PATH: VTYPE_STRING,
  HV_NIC_TYPE: VTYPE_STRING,
  HV_DISK_TYPE: VTYPE_STRING,
580
  HV_VNC_PASSWORD_FILE: VTYPE_STRING,
581
582
583
584
585
586
  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,
587
588
589
  HV_USE_BOOTLOADER: VTYPE_BOOL,
  HV_BOOTLOADER_PATH: VTYPE_STRING,
  HV_BOOTLOADER_ARGS: VTYPE_STRING,
590
  HV_KERNEL_PATH: VTYPE_STRING,
591
  HV_KERNEL_ARGS: VTYPE_STRING,
592
593
594
595
  HV_INITRD_PATH: VTYPE_STRING,
  HV_ROOT_PATH: VTYPE_STRING,
  HV_SERIAL_CONSOLE: VTYPE_BOOL,
  HV_USB_MOUSE: VTYPE_STRING,
596
  HV_DEVICE_MODEL: VTYPE_STRING,
597
  HV_INIT_SCRIPT: VTYPE_STRING,
598
  HV_MIGRATION_PORT: VTYPE_INT,
599
600
  HV_MIGRATION_BANDWIDTH: VTYPE_INT,
  HV_MIGRATION_DOWNTIME: VTYPE_INT,
601
  HV_MIGRATION_MODE: VTYPE_STRING,
602
  HV_USE_LOCALTIME: VTYPE_BOOL,
603
  HV_DISK_CACHE: VTYPE_STRING,
604
605
  HV_SECURITY_MODEL: VTYPE_STRING,
  HV_SECURITY_DOMAIN: VTYPE_STRING,
Guido Trotter's avatar
Guido Trotter committed
606
  HV_KVM_FLAG: VTYPE_STRING,
607
  HV_VHOST_NET: VTYPE_BOOL,
Balazs Lecz's avatar
Balazs Lecz committed
608
  HV_KVM_USE_CHROOT: VTYPE_BOOL,
609
  HV_CPU_MASK: VTYPE_STRING,
610
  HV_MEM_PATH: VTYPE_STRING,
611
612
613
  }

HVS_PARAMETERS = frozenset(HVS_PARAMETER_TYPES.keys())
614

615
# BE parameter names
Iustin Pop's avatar
Iustin Pop committed
616
BE_MEMORY = "memory"
617
BE_VCPUS = "vcpus"
618
BE_AUTO_BALANCE = "auto_balance"
619

620
621
622
623
624
625
626
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
627

628
629
# Instance Parameters Profile
PP_DEFAULT = "default"
630

Guido Trotter's avatar
Guido Trotter committed
631
632
633
634
635
636
637
638
639
640
641
642
643
644
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())
645

646
647
IDISK_SIZE = "size"
IDISK_MODE = "mode"
648
649
650
651
652
653
IDISK_ADOPT = "adopt"
IDISK_PARAMS_TYPES = {
  IDISK_SIZE: VTYPE_SIZE,
  IDISK_MODE: VTYPE_STRING,
  IDISK_ADOPT: VTYPE_STRING,
  }
654
655
IDISK_PARAMS = frozenset(IDISK_PARAMS_TYPES.keys())

656
657
658
659
660
INIC_MAC = "mac"
INIC_IP = "ip"
INIC_MODE = "mode"
INIC_LINK = "link"
INIC_BRIDGE = "bridge"
661
662
663
664
665
666
667
668
INIC_PARAMS_TYPES = {
  INIC_BRIDGE: VTYPE_STRING,
  INIC_IP: VTYPE_MAYBE_STRING,
  INIC_LINK: VTYPE_STRING,
  INIC_MAC: VTYPE_STRING,
  INIC_MODE: VTYPE_STRING,
  }
INIC_PARAMS = frozenset(INIC_PARAMS_TYPES.keys())
669

670
# Hypervisor constants
Iustin Pop's avatar
Iustin Pop committed
671
HT_XEN_PVM = "xen-pvm"
672
HT_FAKE = "fake"
Iustin Pop's avatar
Iustin Pop committed
673
HT_XEN_HVM = "xen-hvm"
Guido Trotter's avatar
Guido Trotter committed
674
HT_KVM = "kvm"
675
HT_CHROOT = "chroot"
Iustin Pop's avatar
Iustin Pop committed
676
677
678
679
680
681
682
683
684
HT_LXC = "lxc"
HYPER_TYPES = frozenset([
  HT_XEN_PVM,
  HT_FAKE,
  HT_XEN_HVM,
  HT_KVM,
  HT_CHROOT,
  HT_LXC,
  ])
Guido Trotter's avatar
Guido Trotter committed
685
HTS_REQ_PORT = frozenset([HT_XEN_HVM, HT_KVM])
686

687
VNC_BASE_PORT = 5900
688
VNC_PASSWORD_FILE = CONF_DIR + "/vnc-cluster-password"
Manuel Franceschini's avatar
Manuel Franceschini committed
689
VNC_DEFAULT_BIND_ADDRESS = IP4_ADDRESS_ANY
690

691
# NIC types
692
693
694
HT_NIC_RTL8139 = "rtl8139"
HT_NIC_NE2K_PCI = "ne2k_pci"
HT_NIC_NE2K_ISA = "ne2k_isa"
695
696
697
698
699
HT_NIC_I82551 = "i82551"
HT_NIC_I85557B = "i82557b"
HT_NIC_I8259ER = "i82559er"
HT_NIC_PCNET = "pcnet"
HT_NIC_E1000 = "e1000"
700
HT_NIC_PARAVIRTUAL = HT_DISK_PARAVIRTUAL = "paravirtual"
701

702
703
HT_HVM_VALID_NIC_TYPES = frozenset([HT_NIC_RTL8139, HT_NIC_NE2K_PCI,
                                    HT_NIC_NE2K_ISA, HT_NIC_PARAVIRTUAL])
704
705
706
707
708
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])
709
710
711
712
713
714
715
716
# 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"

717
718
719
720
721
722
723
724
725
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])

726
HT_HVM_VALID_DISK_TYPES = frozenset([HT_DISK_PARAVIRTUAL, HT_DISK_IOEMU])
727
728
729
HT_KVM_VALID_DISK_TYPES = frozenset([HT_DISK_PARAVIRTUAL, HT_DISK_IDE,
                                     HT_DISK_SCSI, HT_DISK_SD, HT_DISK_MTD,
                                     HT_DISK_PFLASH])
730

731
732
733
734
735
736
737
738
739
740
741
742
743
# 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])

744
745
746
747
748
749
750
# 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
751
752
753
754
755
756
# Kvm flag values
HT_KVM_ENABLED = "enabled"
HT_KVM_DISABLED = "disabled"

HT_KVM_FLAG_VALUES = frozenset([HT_KVM_ENABLED, HT_KVM_DISABLED])

757
758
759
# Migration type
HT_MIGRATION_LIVE = "live"
HT_MIGRATION_NONLIVE = "non-live"
760
HT_MIGRATION_MODES = frozenset([HT_MIGRATION_LIVE, HT_MIGRATION_NONLIVE])
761

762
763
764
765
# Cluster Verify steps
VERIFY_NPLUSONE_MEM = 'nplusone_mem'
VERIFY_OPTIONAL_CHECKS = frozenset([VERIFY_NPLUSONE_MEM])

766
# Node verify constants
767
NV_DRBDHELPER = "drbd-helper"
768
NV_DRBDLIST = "drbd-list"
769
770
771
772
NV_FILELIST = "filelist"
NV_HVINFO = "hvinfo"
NV_HYPERVISOR = "hypervisor"
NV_INSTANCELIST = "instancelist"
773
774
NV_LVLIST = "lvlist"
NV_MASTERIP = "master-ip"
775
776
NV_NODELIST = "nodelist"
NV_NODENETTEST = "node-net-test"
777
NV_NODESETUP = "nodesetup"
778
779
NV_OSLIST = "oslist"
NV_PVLIST = "pvlist"
780
NV_TIME = "time"
781
782
NV_VERSION = "version"
NV_VGLIST = "vglist"
783

784
785
786
787
# SSL certificate check constants (in days)
SSL_CERT_EXPIRATION_WARN = 30
SSL_CERT_EXPIRATION_ERROR = 7

788
# Allocator framework constants
789
IALLOCATOR_VERSION = 2
790
791
IALLOCATOR_DIR_IN = "in"
IALLOCATOR_DIR_OUT = "out"
792
793
794
795
VALID_IALLOCATOR_DIRECTIONS = frozenset([
  IALLOCATOR_DIR_IN,
  IALLOCATOR_DIR_OUT,
  ])
796
797
IALLOCATOR_MODE_ALLOC = "allocate"
IALLOCATOR_MODE_RELOC = "relocate"
798
IALLOCATOR_MODE_MEVAC = "multi-evacuate"
799
800
801
802
803
VALID_IALLOCATOR_MODES = frozenset([
  IALLOCATOR_MODE_ALLOC,
  IALLOCATOR_MODE_RELOC,
  IALLOCATOR_MODE_MEVAC,
  ])
804
IALLOCATOR_SEARCH_PATH = _autoconf.IALLOCATOR_SEARCH_PATH
805

806
807
808
809
810
# 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"
811
JOB_QUEUE_ARCHIVE_DIR = QUEUE_DIR + "/archive"
812
JOB_QUEUE_DRAIN_FILE = QUEUE_DIR + "/drain"
Michael Hanselmann's avatar
Michael Hanselmann committed
813
JOB_QUEUE_SIZE_HARD_LIMIT = 5000
814
JOB_QUEUE_DIRS = [QUEUE_DIR, JOB_QUEUE_ARCHIVE_DIR]
815
JOB_QUEUE_DIRS_MODE = SECURE_DIR_MODE
816

817
818
JOB_ID_TEMPLATE = r"\d+"

819
820
821
# unchanged job return
JOB_NOTCHANGED = "nochange"

822
823
# Job status
JOB_STATUS_QUEUED = "queued"
Iustin Pop's avatar
Iustin Pop committed
824
JOB_STATUS_WAITLOCK = "waiting"
825
JOB_STATUS_CANCELING = "canceling"
826
827
828
829
JOB_STATUS_RUNNING = "running"
JOB_STATUS_CANCELED = "canceled"
JOB_STATUS_SUCCESS = "success"
JOB_STATUS_ERROR = "error"
830
831
832
833
834
JOBS_FINALIZED = frozenset([
  JOB_STATUS_CANCELED,
  JOB_STATUS_SUCCESS,
  JOB_STATUS_ERROR,
  ])
835
836
837
838
839
840
JOB_STATUS_ALL = frozenset([
  JOB_STATUS_QUEUED,
  JOB_STATUS_WAITLOCK,
  JOB_STATUS_CANCELING,
  JOB_STATUS_RUNNING,
  ]) | JOBS_FINALIZED
841

842
843
# OpCode status
# not yet finalized
844
OP_STATUS_QUEUED = "queued"
Iustin Pop's avatar
Iustin Pop committed
845
OP_STATUS_WAITLOCK = "waiting"
846
OP_STATUS_CANCELING = "canceling"
847
OP_STATUS_RUNNING = "running"
848
# finalized
849
OP_STATUS_CANCELED = "canceled"
850
851
OP_STATUS_SUCCESS = "success"
OP_STATUS_ERROR = "error"
852
853
854
OPS_FINALIZED = frozenset([OP_STATUS_CANCELED,
                           OP_STATUS_SUCCESS,
                           OP_STATUS_ERROR])
855

856
857
858
859
860
861
862
863
# OpCode priority
OP_PRIO_LOWEST = +19
OP_PRIO_HIGHEST = -20

OP_PRIO_LOW = +10
OP_PRIO_NORMAL = 0
OP_PRIO_HIGH = -10

864
865
866
867
868
869
OP_PRIO_SUBMIT_VALID = frozenset([
  OP_PRIO_LOW,
  OP_PRIO_NORMAL,
  OP_PRIO_HIGH,
  ])

870
871
OP_PRIO_DEFAULT = OP_PRIO_NORMAL

872
873
874
# Execution log types
ELOG_MESSAGE = "message"
ELOG_PROGRESS = "progress"
875
ELOG_REMOTE_IMPORT = "remote-import"
876
877
ELOG_JQUEUE_TEST = "jqueue-test"

878
879
880
881
# /etc/hosts modification
ETC_HOSTS_ADD = "add"
ETC_HOSTS_REMOVE = "remove"

882
883
884
885
886
# Job queue test
JQT_MSGPREFIX = "TESTMSG="
JQT_EXPANDNAMES = "expandnames"
JQT_EXEC = "exec"
JQT_LOGMSG = "logmsg"
887
JQT_STARTMSG = "startmsg"
888
889
890
891
JQT_ALL = frozenset([
  JQT_EXPANDNAMES,
  JQT_EXEC,
  JQT_LOGMSG,
892
  JQT_STARTMSG,
893
  ])
894

895
# max dynamic devices
896
897
898
MAX_NICS = 8
MAX_DISKS = 16

Iustin Pop's avatar
Iustin Pop committed
899
900
# SSCONF keys
SS_CLUSTER_NAME = "cluster_name"
901
SS_CLUSTER_TAGS = "cluster_tags"
Iustin Pop's avatar
Iustin Pop committed
902
SS_FILE_STORAGE_DIR = "file_storage_dir"
903
SS_MASTER_CANDIDATES = "master_candidates"
904
SS_MASTER_CANDIDATES_IPS = "master_candidates_ips"
Iustin Pop's avatar
Iustin Pop committed
905
906
907
908
SS_MASTER_IP = "master_ip"
SS_MASTER_NETDEV = "master_netdev"
SS_MASTER_NODE = "master_node"
SS_NODE_LIST = "node_list"
909
910
SS_NODE_PRIMARY_IPS = "node_primary_ips"
SS_NODE_SECONDARY_IPS = "node_secondary_ips"
911
SS_OFFLINE_NODES = "offline_nodes"
912
SS_ONLINE_NODES = "online_nodes"
913
SS_PRIMARY_IP_FAMILY = "primary_ip_family"
914
SS_INSTANCE_LIST = "instance_list"
915
SS_RELEASE_VERSION = "release_version"
916
SS_HYPERVISOR_LIST = "hypervisor_list"
917
SS_MAINTAIN_NODE_HEALTH = "maintain_node_health"
Balazs Lecz's avatar
Balazs Lecz committed
918
SS_UID_POOL = "uid_pool"
919
SS_NODEGROUPS = "nodegroups"
Iustin Pop's avatar
Iustin Pop committed
920

921
922
923
924
# cluster wide default parameters
DEFAULT_ENABLED_HYPERVISOR = HT_XEN_PVM

HVC_DEFAULTS = {
925
  HT_XEN_PVM: {
926
927
928
    HV_USE_BOOTLOADER: False,
    HV_BOOTLOADER_PATH: XEN_BOOTLOADER,
    HV_BOOTLOADER_ARGS: '',
929
    HV_KERNEL_PATH: "/boot/vmlinuz-2.6-xenU",
930
    HV_INITRD_PATH: '',
931
    HV_ROOT_PATH: '/dev/sda1',
932
    HV_KERNEL_ARGS: 'ro',
933
    HV_MIGRATION_PORT: 8002,
934
    HV_MIGRATION_MODE: HT_MIGRATION_LIVE,
935
936
937
    },
  HT_XEN_HVM: {
    HV_BOOT_ORDER: "cd",
938
    HV_CDROM_IMAGE_PATH: '',
939
    HV_NIC_TYPE: HT_NIC_RTL8139,
940
    HV_DISK_TYPE: HT_DISK_PARAVIRTUAL,
941
    HV_VNC_BIND_ADDRESS: IP4_ADDRESS_ANY,
942
    HV_VNC_PASSWORD_FILE: VNC_PASSWORD_FILE,
943
944
    HV_ACPI: True,
    HV_PAE: True,
945
    HV_KERNEL_PATH: "/usr/lib/xen/boot/hvmloader",
946
    HV_DEVICE_MODEL: "/usr/lib/xen/bin/qemu-dm",
947
    HV_MIGRATION_PORT: 8002,
948
    HV_MIGRATION_MODE: HT_MIGRATION_NONLIVE,
949
    HV_USE_LOCALTIME: False,
950
951
952
    },
  HT_KVM: {
    HV_KERNEL_PATH: "/boot/vmlinuz-2.6-kvmU",
953
    HV_INITRD_PATH: '',
954
    HV_KERNEL_ARGS: 'ro',
955
    HV_ROOT_PATH: '/dev/vda1',
956
957
    HV_ACPI: True,
    HV_SERIAL_CONSOLE: True,
958
    HV_VNC_BIND_ADDRESS: '',
959
960
961
    HV_VNC_TLS: False,
    HV_VNC_X509: '',
    HV_VNC_X509_VERIFY: False,
962
    HV_VNC_PASSWORD_FILE: '',
963
    HV_CDROM_IMAGE_PATH: '',
964
    HV_BOOT_ORDER: HT_BO_DISK,
965
966
    HV_NIC_TYPE: HT_NIC_PARAVIRTUAL,
    HV_DISK_TYPE: HT_DISK_PARAVIRTUAL,
967
    HV_USB_MOUSE: '',
968
    HV_MIGRATION_PORT: 8102,
969