import re
import socket
-from ganeti import _autoconf
from ganeti import _constants
from ganeti import _vcsversion
from ganeti import compat
# various versions
-RELEASE_VERSION = _autoconf.PACKAGE_VERSION
-OS_API_V10 = 10
-OS_API_V15 = 15
-OS_API_V20 = 20
-OS_API_VERSIONS = compat.UniqueFrozenset([
- OS_API_V10,
- OS_API_V15,
- OS_API_V20,
- ])
+RELEASE_VERSION = _constants.RELEASE_VERSION
+OS_API_V10 = _constants.OS_API_V10
+OS_API_V15 = _constants.OS_API_V15
+OS_API_V20 = _constants.OS_API_V20
+OS_API_VERSIONS = _constants.OS_API_VERSIONS
VCS_VERSION = _vcsversion.VCS_VERSION
EXPORT_VERSION = 0
RAPI_VERSION = 2
+VERSION_MAJOR = _constants.VERSION_MAJOR
+VERSION_MINOR = _constants.VERSION_MINOR
+VERSION_REVISION = _constants.VERSION_REVISION
-# Format for CONFIG_VERSION:
-# 01 03 0123 = 01030123
-# ^^ ^^ ^^^^
-# | | + Configuration version/revision
-# | + Minor version
-# + Major version
-#
-# It is stored as an integer. Make sure not to write an octal number.
-
-# 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.
+DIR_VERSION = _constants.DIR_VERSION
- Returns: tuple; (major, minor, revision)
-
- """
- assert isinstance(version, int)
-
- (major, remainder) = divmod(version, 1000000)
- (minor, revision) = divmod(remainder, 10000)
-
- return (major, minor, revision)
-
-
-CONFIG_MAJOR = int(_autoconf.VERSION_MAJOR)
-CONFIG_MINOR = int(_autoconf.VERSION_MINOR)
-CONFIG_REVISION = 0
-CONFIG_VERSION = BuildVersion(CONFIG_MAJOR, CONFIG_MINOR, CONFIG_REVISION)
+CONFIG_MAJOR = _constants.CONFIG_MAJOR
+CONFIG_MINOR = _constants.CONFIG_MINOR
+CONFIG_REVISION = _constants.CONFIG_REVISION
+CONFIG_VERSION = _constants.CONFIG_VERSION
#: RPC protocol version
-PROTOCOL_VERSION = BuildVersion(CONFIG_MAJOR, CONFIG_MINOR, 0)
+PROTOCOL_VERSION = _constants.PROTOCOL_VERSION
# user separation
DAEMONS_GROUP = _constants.DAEMONS_GROUP
CPU_PINNING_ALL_KVM = 0xFFFFFFFF
# Wipe
-DD_CMD = "dd"
-MAX_WIPE_CHUNK = 1024 # 1GB
-MIN_WIPE_CHUNK_PERCENT = 10
-
-RUN_DIRS_MODE = 0775
-SECURE_DIR_MODE = 0700
-SECURE_FILE_MODE = 0600
-ADOPTABLE_BLOCKDEV_ROOT = "/dev/disk/"
-ENABLE_CONFD = _autoconf.ENABLE_CONFD
-ENABLE_MOND = _autoconf.ENABLE_MOND
-ENABLE_SPLIT_QUERY = _autoconf.ENABLE_SPLIT_QUERY
-ENABLE_RESTRICTED_COMMANDS = _autoconf.ENABLE_RESTRICTED_COMMANDS
+DD_CMD = _constants.DD_CMD
+MAX_WIPE_CHUNK = _constants.MAX_WIPE_CHUNK
+MIN_WIPE_CHUNK_PERCENT = _constants.MIN_WIPE_CHUNK_PERCENT
+
+RUN_DIRS_MODE = _constants.RUN_DIRS_MODE
+SECURE_DIR_MODE = _constants.SECURE_DIR_MODE
+SECURE_FILE_MODE = _constants.SECURE_FILE_MODE
+ADOPTABLE_BLOCKDEV_ROOT = _constants.ADOPTABLE_BLOCKDEV_ROOT
+ENABLE_CONFD = _constants.ENABLE_CONFD
+ENABLE_MOND = _constants.ENABLE_MOND
+ENABLE_SPLIT_QUERY = _constants.ENABLE_SPLIT_QUERY
+ENABLE_RESTRICTED_COMMANDS = _constants.ENABLE_RESTRICTED_COMMANDS
# SSH constants
SSH = _constants.SSH
DEFAULT_MOND_PORT = _constants.DEFAULT_MOND_PORT
DEFAULT_RAPI_PORT = _constants.DEFAULT_RAPI_PORT
-FIRST_DRBD_PORT = 11000
-LAST_DRBD_PORT = 14999
+FIRST_DRBD_PORT = _constants.FIRST_DRBD_PORT
+LAST_DRBD_PORT = _constants.LAST_DRBD_PORT
DAEMONS_LOGBASE = _constants.DAEMONS_LOGBASE
" -oHostKeyAlias=%%s") % (SSH_LOGIN_USER,
pathutils.SSH_KNOWN_HOSTS_FILE)
-KVM_PATH = _autoconf.KVM_PATH
-KVM_KERNEL = _autoconf.KVM_KERNEL
-SOCAT_PATH = _autoconf.SOCAT_PATH
-SOCAT_USE_ESCAPE = _autoconf.SOCAT_USE_ESCAPE
-SOCAT_USE_COMPRESS = _autoconf.SOCAT_USE_COMPRESS
+KVM_PATH = _constants.KVM_PATH
+KVM_KERNEL = _constants.KVM_KERNEL
+SOCAT_PATH = _constants.SOCAT_PATH
+SOCAT_USE_ESCAPE = _constants.SOCAT_USE_ESCAPE
+SOCAT_USE_COMPRESS = _constants.SOCAT_USE_COMPRESS
SOCAT_ESCAPE_CODE = "0x1d"
#: Console as SSH command
DISK_RDONLY = _constants.DISK_RDONLY
DISK_RDWR = _constants.DISK_RDWR
DISK_ACCESS_SET = _constants.DISK_ACCESS_SET
+DISK_USERSPACE = _constants.DISK_USERSPACE
+DISK_KERNELSPACE = _constants.DISK_KERNELSPACE
+DISK_VALID_ACCESS_MODES = _constants.DISK_VALID_ACCESS_MODES
-# disk replacement mode
-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
-REPLACE_DISK_AUTO = "replace_auto"
-REPLACE_MODES = compat.UniqueFrozenset([
- REPLACE_DISK_PRI,
- REPLACE_DISK_SEC,
- REPLACE_DISK_CHG,
- REPLACE_DISK_AUTO,
- ])
+REPLACE_DISK_PRI = _constants.REPLACE_DISK_PRI
+REPLACE_DISK_SEC = _constants.REPLACE_DISK_SEC
+REPLACE_DISK_CHG = _constants.REPLACE_DISK_CHG
+REPLACE_DISK_AUTO = _constants.REPLACE_DISK_AUTO
+REPLACE_MODES = _constants.REPLACE_MODES
# Instance export mode
EXPORT_MODE_LOCAL = _constants.EXPORT_MODE_LOCAL
DEFAULT_MAC_PREFIX = "aa:00:00"
# default maximum instance wait time, in seconds.
DEFAULT_SHUTDOWN_TIMEOUT = 120
-NODE_MAX_CLOCK_SKEW = 150
+NODE_MAX_CLOCK_SKEW = _constants.NODE_MAX_CLOCK_SKEW
# Time for an intra-cluster disk transfer to wait for a connection
DISK_TRANSFER_CONNECT_TIMEOUT = 60
# Disk index separator
-DISK_SEPARATOR = _autoconf.DISK_SEPARATOR
-IP_COMMAND_PATH = _autoconf.IP_PATH
+DISK_SEPARATOR = _constants.DISK_SEPARATOR
+IP_COMMAND_PATH = _constants.IP_COMMAND_PATH
+
+RPC_TMO_URGENT = _constants.RPC_TMO_URGENT
+RPC_TMO_FAST = _constants.RPC_TMO_FAST
+RPC_TMO_NORMAL = _constants.RPC_TMO_NORMAL
+RPC_TMO_SLOW = _constants.RPC_TMO_SLOW
+RPC_TMO_4HRS = _constants.RPC_TMO_4HRS
+RPC_TMO_1DAY = _constants.RPC_TMO_1DAY
+RPC_CONNECT_TIMEOUT = _constants.RPC_CONNECT_TIMEOUT
#: Key for job IDs in opcode result
JOB_IDS_KEY = "jobs"
(RPC_ENCODING_NONE,
RPC_ENCODING_ZLIB_BASE64) = range(2)
-# 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
-
# os related constants
OS_SCRIPT_CREATE = "create"
OS_SCRIPT_IMPORT = "import"
HV_VIF_TYPE = "vif_type"
HV_VIF_SCRIPT = "vif_script"
HV_XEN_CMD = "xen_cmd"
+HV_XEN_CPUID = "cpuid"
HV_VNET_HDR = "vnet_hdr"
HV_VIRIDIAN = "viridian"
HV_VIF_TYPE: VTYPE_STRING,
HV_VIF_SCRIPT: VTYPE_STRING,
HV_XEN_CMD: VTYPE_STRING,
+ HV_XEN_CPUID: VTYPE_STRING,
HV_VNET_HDR: VTYPE_BOOL,
HV_VIRIDIAN: VTYPE_BOOL,
}
LDP_MAX_RATE = "c-max-rate"
LDP_MIN_RATE = "c-min-rate"
LDP_POOL = "pool"
+LDP_ACCESS = "access"
DISK_LD_TYPES = {
LDP_RESYNC_RATE: VTYPE_INT,
LDP_STRIPES: VTYPE_INT,
LDP_MAX_RATE: VTYPE_INT,
LDP_MIN_RATE: VTYPE_INT,
LDP_POOL: VTYPE_STRING,
+ LDP_ACCESS: VTYPE_STRING,
}
DISK_LD_PARAMETERS = frozenset(DISK_LD_TYPES.keys())
DRBD_MIN_RATE = "c-min-rate"
LV_STRIPES = "stripes"
RBD_POOL = "pool"
+RBD_ACCESS = "access"
DISK_DT_TYPES = {
DRBD_RESYNC_RATE: VTYPE_INT,
DRBD_DATA_STRIPES: VTYPE_INT,
DRBD_MIN_RATE: VTYPE_INT,
LV_STRIPES: VTYPE_INT,
RBD_POOL: VTYPE_STRING,
+ RBD_ACCESS: VTYPE_STRING,
}
DISK_DT_PARAMETERS = frozenset(DISK_DT_TYPES.keys())
IALLOCATOR_SEARCH_PATH = _constants.IALLOCATOR_SEARCH_PATH
DEFAULT_IALLOCATOR_SHORTCUT = _constants.DEFAULT_IALLOCATOR_SHORTCUT
-IALLOCATOR_NEVAC_PRI = _constants.IALLOCATOR_NEVAC_PRI
-IALLOCATOR_NEVAC_SEC = _constants.IALLOCATOR_NEVAC_SEC
-IALLOCATOR_NEVAC_ALL = _constants.IALLOCATOR_NEVAC_ALL
-IALLOCATOR_NEVAC_MODES = _constants.IALLOCATOR_NEVAC_MODES
-
# Node evacuation
NODE_EVAC_PRI = _constants.NODE_EVAC_PRI
NODE_EVAC_SEC = _constants.NODE_EVAC_SEC
HV_CPU_WEIGHT: 256,
HV_VIF_SCRIPT: "",
HV_XEN_CMD: XEN_CMD_XM,
+ HV_XEN_CPUID: "",
+ HV_SOUNDHW: "",
},
HT_XEN_HVM: {
HV_BOOT_ORDER: "cd",
HV_VIF_SCRIPT: "",
HV_VIRIDIAN: False,
HV_XEN_CMD: XEN_CMD_XM,
+ HV_XEN_CPUID: "",
+ HV_SOUNDHW: "",
},
HT_KVM: {
HV_KVM_PATH: KVM_PATH,
DISK_LD_DEFAULTS = {
DT_DRBD8: {
LDP_RESYNC_RATE: CLASSIC_DRBD_SYNC_SPEED,
- LDP_BARRIERS: _autoconf.DRBD_BARRIERS,
- LDP_NO_META_FLUSH: _autoconf.DRBD_NO_META_FLUSH,
+ LDP_BARRIERS: _constants.DRBD_BARRIERS,
+ LDP_NO_META_FLUSH: _constants.DRBD_NO_META_FLUSH,
LDP_DEFAULT_METAVG: DEFAULT_VG,
LDP_DISK_CUSTOM: "",
LDP_NET_CUSTOM: "",
LDP_MIN_RATE: 4 * 1024, # KiB/s
},
DT_PLAIN: {
- LDP_STRIPES: _autoconf.LVM_STRIPECOUNT
+ LDP_STRIPES: _constants.LVM_STRIPECOUNT
},
DT_FILE: {},
DT_SHARED_FILE: {},
DT_BLOCK: {},
DT_RBD: {
- LDP_POOL: "rbd"
+ LDP_POOL: "rbd",
+ LDP_ACCESS: DISK_KERNELSPACE,
},
DT_EXT: {},
}
DT_SHARED_FILE: {},
DT_BLOCK: {},
DT_RBD: {
- RBD_POOL: DISK_LD_DEFAULTS[DT_RBD][LDP_POOL]
+ RBD_POOL: DISK_LD_DEFAULTS[DT_RBD][LDP_POOL],
+ RBD_ACCESS: DISK_LD_DEFAULTS[DT_RBD][LDP_ACCESS],
},
DT_EXT: {},
}
# Space reserved when creating instance disks
PART_RESERVED = .02
-CONFD_PROTOCOL_VERSION = 1
+CONFD_PROTOCOL_VERSION = _constants.CONFD_PROTOCOL_VERSION
-CONFD_REQ_PING = 0
-CONFD_REQ_NODE_ROLE_BYNAME = 1
-CONFD_REQ_NODE_PIP_BY_INSTANCE_IP = 2
-CONFD_REQ_CLUSTER_MASTER = 3
-CONFD_REQ_NODE_PIP_LIST = 4
-CONFD_REQ_MC_PIP_LIST = 5
-CONFD_REQ_INSTANCES_IPS_LIST = 6
-CONFD_REQ_NODE_DRBD = 7
-CONFD_REQ_NODE_INSTANCES = 8
+CONFD_REQ_PING = _constants.CONFD_REQ_PING
+CONFD_REQ_NODE_ROLE_BYNAME = _constants.CONFD_REQ_NODE_ROLE_BYNAME
+CONFD_REQ_NODE_PIP_BY_INSTANCE_IP = _constants.CONFD_REQ_NODE_PIP_BY_INSTANCE_IP
+CONFD_REQ_CLUSTER_MASTER = _constants.CONFD_REQ_CLUSTER_MASTER
+CONFD_REQ_NODE_PIP_LIST = _constants.CONFD_REQ_NODE_PIP_LIST
+CONFD_REQ_MC_PIP_LIST = _constants.CONFD_REQ_MC_PIP_LIST
+CONFD_REQ_INSTANCES_IPS_LIST = _constants.CONFD_REQ_INSTANCES_IPS_LIST
+CONFD_REQ_NODE_DRBD = _constants.CONFD_REQ_NODE_DRBD
+CONFD_REQ_NODE_INSTANCES = _constants.CONFD_REQ_NODE_INSTANCES
+CONFD_REQS = _constants.CONFD_REQS
# Confd request query fields. These are used to narrow down queries.
# These must be strings rather than integers, because json-encoding
# converts them to strings anyway, as they're used as dict-keys.
-CONFD_REQQ_LINK = "0"
-CONFD_REQQ_IP = "1"
-CONFD_REQQ_IPLIST = "2"
-CONFD_REQQ_FIELDS = "3"
-
-CONFD_REQFIELD_NAME = "0"
-CONFD_REQFIELD_IP = "1"
-CONFD_REQFIELD_MNODE_PIP = "2"
-
-CONFD_REQS = compat.UniqueFrozenset([
- CONFD_REQ_PING,
- CONFD_REQ_NODE_ROLE_BYNAME,
- CONFD_REQ_NODE_PIP_BY_INSTANCE_IP,
- CONFD_REQ_CLUSTER_MASTER,
- CONFD_REQ_NODE_PIP_LIST,
- CONFD_REQ_MC_PIP_LIST,
- CONFD_REQ_INSTANCES_IPS_LIST,
- CONFD_REQ_NODE_DRBD,
- ])
-
-CONFD_REPL_STATUS_OK = 0
-CONFD_REPL_STATUS_ERROR = 1
-CONFD_REPL_STATUS_NOTIMPLEMENTED = 2
-
-CONFD_REPL_STATUSES = compat.UniqueFrozenset([
- CONFD_REPL_STATUS_OK,
- CONFD_REPL_STATUS_ERROR,
- CONFD_REPL_STATUS_NOTIMPLEMENTED,
- ])
-
-(CONFD_NODE_ROLE_MASTER,
- CONFD_NODE_ROLE_CANDIDATE,
- CONFD_NODE_ROLE_OFFLINE,
- CONFD_NODE_ROLE_DRAINED,
- CONFD_NODE_ROLE_REGULAR,
- ) = range(5)
-
-# A few common errors for confd
-CONFD_ERROR_UNKNOWN_ENTRY = 1
-CONFD_ERROR_INTERNAL = 2
-CONFD_ERROR_ARGUMENT = 3
+CONFD_REQQ_LINK = _constants.CONFD_REQQ_LINK
+CONFD_REQQ_IP = _constants.CONFD_REQQ_IP
+CONFD_REQQ_IPLIST = _constants.CONFD_REQQ_IPLIST
+CONFD_REQQ_FIELDS = _constants.CONFD_REQQ_FIELDS
+
+# FIXME: perhaps update code that uses these constants to deal with
+# integers instead of strings
+CONFD_REQFIELD_NAME = str(_constants.CONFD_REQFIELD_NAME)
+CONFD_REQFIELD_IP = str(_constants.CONFD_REQFIELD_IP)
+CONFD_REQFIELD_MNODE_PIP = str(_constants.CONFD_REQFIELD_MNODE_PIP)
+
+CONFD_REPL_STATUS_OK = _constants.CONFD_REPL_STATUS_OK
+CONFD_REPL_STATUS_ERROR = _constants.CONFD_REPL_STATUS_ERROR
+CONFD_REPL_STATUS_NOTIMPLEMENTED = _constants.CONFD_REPL_STATUS_NOTIMPLEMENTED
+CONFD_REPL_STATUSES = _constants.CONFD_REPL_STATUSES
+
+CONFD_NODE_ROLE_MASTER = _constants.CONFD_NODE_ROLE_MASTER
+CONFD_NODE_ROLE_CANDIDATE = _constants.CONFD_NODE_ROLE_CANDIDATE
+CONFD_NODE_ROLE_OFFLINE = _constants.CONFD_NODE_ROLE_OFFLINE
+CONFD_NODE_ROLE_DRAINED = _constants.CONFD_NODE_ROLE_DRAINED
+CONFD_NODE_ROLE_REGULAR = _constants.CONFD_NODE_ROLE_REGULAR
+
+CONFD_ERROR_UNKNOWN_ENTRY = _constants.CONFD_ERROR_UNKNOWN_ENTRY
+CONFD_ERROR_INTERNAL = _constants.CONFD_ERROR_INTERNAL
+CONFD_ERROR_ARGUMENT = _constants.CONFD_ERROR_ARGUMENT
# Each request is "salted" by the current timestamp.
# This constants decides how many seconds of skew to accept.
# TODO: make this a default and allow the value to be more configurable
-CONFD_MAX_CLOCK_SKEW = 2 * NODE_MAX_CLOCK_SKEW
+CONFD_MAX_CLOCK_SKEW = _constants.CONFD_MAX_CLOCK_SKEW
# When we haven't reloaded the config for more than this amount of
# seconds, we force a test to see if inotify is betraying us. Using a
# prime number to ensure we get less chance of 'same wakeup' with
# other processes.
-CONFD_CONFIG_RELOAD_TIMEOUT = 17
+CONFD_CONFIG_RELOAD_TIMEOUT = _constants.CONFD_CONFIG_RELOAD_TIMEOUT
# If we receive more than one update in this amount of microseconds,
# we move to polling every RATELIMIT seconds, rather than relying on
# inotify, to be able to serve more requests.
-CONFD_CONFIG_RELOAD_RATELIMIT = 250000
+CONFD_CONFIG_RELOAD_RATELIMIT = _constants.CONFD_CONFIG_RELOAD_RATELIMIT
# Magic number prepended to all confd queries.
# This allows us to distinguish different types of confd protocols and handle
# them. For example by changing this we can move the whole payload to be
# compressed, or move away from json.
-CONFD_MAGIC_FOURCC = "plj0"
+CONFD_MAGIC_FOURCC = _constants.CONFD_MAGIC_FOURCC
# By default a confd request is sent to the minimum between this number and all
# MCs. 6 was chosen because even in the case of a disastrous 50% response rate,
# we should have enough answers to be able to compare more than one.
-CONFD_DEFAULT_REQ_COVERAGE = 6
+CONFD_DEFAULT_REQ_COVERAGE = _constants.CONFD_DEFAULT_REQ_COVERAGE
# Timeout in seconds to expire pending query request in the confd client
# library. We don't actually expect any answer more than 10 seconds after we
# sent a request.
-CONFD_CLIENT_EXPIRE_TIMEOUT = 10
+CONFD_CLIENT_EXPIRE_TIMEOUT = _constants.CONFD_CLIENT_EXPIRE_TIMEOUT
# Maximum UDP datagram size.
# On IPv4: 64K - 20 (ip header size) - 8 (udp header size) = 65507
BLOCKDEV_DRIVER_MANUAL = _constants.BLOCKDEV_DRIVER_MANUAL
# qemu-img path, required for ovfconverter
-QEMUIMG_PATH = _autoconf.QEMUIMG_PATH
+QEMUIMG_PATH = _constants.QEMUIMG_PATH
# Whether htools was enabled at compilation time
-HTOOLS = _autoconf.HTOOLS
+HTOOLS = _constants.HTOOLS
# The hail iallocator
IALLOC_HAIL = "hail"
# CPU load collector variables
STAT_FILE = _constants.STAT_FILE
-CPUAVGLOAD_BUFFER_SIZE = 150
-CPUAVGLOAD_WINDOW_SIZE = 600
+CPUAVGLOAD_BUFFER_SIZE = _constants.CPUAVGLOAD_BUFFER_SIZE
+CPUAVGLOAD_WINDOW_SIZE = _constants.CPUAVGLOAD_WINDOW_SIZE
# Mond's variable for periodical data collection
MOND_TIME_INTERVAL = _constants.MOND_TIME_INTERVAL
+# MonD's latest API version
+MOND_LATEST_API_VERSION = 1
+
+# Timeouts for upgrades
+
+UPGRADE_QUEUE_DRAIN_TIMEOUT = _constants.UPGRADE_QUEUE_DRAIN_TIMEOUT
+UPGRADE_QUEUE_POLL_INTERVAL = _constants.UPGRADE_QUEUE_POLL_INTERVAL
+
# Do not re-export imported modules
-del re, _vcsversion, _autoconf, _constants, socket, pathutils, compat
+del re, _vcsversion, _constants, socket, pathutils, compat
ALLOCATABLE_KEY = "allocatable"