#
#
-# Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011, 2012 Google Inc.
+# Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 Google Inc.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
CONFD_GROUP = _autoconf.CONFD_GROUP
NODED_USER = _autoconf.NODED_USER
NODED_GROUP = _autoconf.NODED_GROUP
+MOND_USER = _autoconf.MOND_USER
+MOND_GROUP = _autoconf.MOND_GROUP
SSH_LOGIN_USER = _autoconf.SSH_LOGIN_USER
SSH_CONSOLE_USER = _autoconf.SSH_CONSOLE_USER
ENABLE_FILE_STORAGE = _autoconf.ENABLE_FILE_STORAGE
ENABLE_SHARED_FILE_STORAGE = _autoconf.ENABLE_SHARED_FILE_STORAGE
ENABLE_CONFD = _autoconf.ENABLE_CONFD
+ENABLE_MOND = _autoconf.ENABLE_MOND
ENABLE_SPLIT_QUERY = _autoconf.ENABLE_SPLIT_QUERY
ENABLE_RESTRICTED_COMMANDS = _autoconf.ENABLE_RESTRICTED_COMMANDS
+# SSH constants
+SSH = "ssh"
+SCP = "scp"
+
NODED = "ganeti-noded"
CONFD = "ganeti-confd"
RAPI = "ganeti-rapi"
MASTERD = "ganeti-masterd"
+MOND = "ganeti-mond"
+
+DAEMONS = compat.UniqueFrozenset([
+ NODED,
+ CONFD,
+ RAPI,
+ MASTERD,
+ MOND,
+ ])
DAEMONS_PORTS = {
# daemon-name: ("proto", "default-port")
NODED: ("tcp", 1811),
CONFD: ("udp", 1814),
+ MOND: ("tcp", 1815),
RAPI: ("tcp", 5080),
- "ssh": ("tcp", 22),
+ SSH: ("tcp", 22),
}
+
DEFAULT_NODED_PORT = DAEMONS_PORTS[NODED][1]
DEFAULT_CONFD_PORT = DAEMONS_PORTS[CONFD][1]
+DEFAULT_MOND_PORT = DAEMONS_PORTS[MOND][1]
DEFAULT_RAPI_PORT = DAEMONS_PORTS[RAPI][1]
FIRST_DRBD_PORT = 11000
LAST_DRBD_PORT = 14999
-DAEMONS_LOGFILES = {
- NODED: pathutils.GetLogFilename("node-daemon"),
- CONFD: pathutils.GetLogFilename("conf-daemon"),
- RAPI: pathutils.GetLogFilename("rapi-daemon"),
- MASTERD: pathutils.GetLogFilename("master-daemon"),
+DAEMONS_LOGBASE = {
+ NODED: "node-daemon",
+ CONFD: "conf-daemon",
+ RAPI: "rapi-daemon",
+ MASTERD: "master-daemon",
+ MOND: "monitoring-daemon",
+ }
+
+DAEMONS_LOGFILES = \
+ dict((daemon, pathutils.GetLogFilename(DAEMONS_LOGBASE[daemon]))
+ for daemon in DAEMONS_LOGBASE)
+
+# Some daemons might require more than one logfile.
+# Specifically, right now only the Haskell http library "snap", used by the
+# monitoring daemon, requires multiple log files.
+
+# These are the only valid reasons for having an extra logfile
+EXTRA_LOGREASON_ACCESS = "access"
+EXTRA_LOGREASON_ERROR = "error"
+
+VALID_EXTRA_LOGREASONS = compat.UniqueFrozenset([
+ EXTRA_LOGREASON_ACCESS,
+ EXTRA_LOGREASON_ERROR,
+ ])
+
+# These are the extra logfiles, grouped by daemon
+DAEMONS_EXTRA_LOGBASE = {
+ MOND: {
+ EXTRA_LOGREASON_ACCESS: "monitoring-daemon-access",
+ EXTRA_LOGREASON_ERROR: "monitoring-daemon-error",
+ }
}
+DAEMONS_EXTRA_LOGFILES = \
+ dict((daemon, dict((extra,
+ pathutils.GetLogFilename(DAEMONS_EXTRA_LOGBASE[daemon][extra]))
+ for extra in DAEMONS_EXTRA_LOGBASE[daemon]))
+ for daemon in DAEMONS_EXTRA_LOGBASE)
+
DEV_CONSOLE = "/dev/console"
PROC_MOUNTS = "/proc/mounts"
# Local UniX Interface related constants
LUXI_EOM = "\3"
LUXI_VERSION = CONFIG_VERSION
+#: Environment variable for the luxi override socket
+LUXI_OVERRIDE = "FORCE_LUXI_SOCKET"
+LUXI_OVERRIDE_MASTER = "master"
+LUXI_OVERRIDE_QUERY = "query"
# one of "no", "yes", "only"
SYSLOG_USAGE = _autoconf.SYSLOG_USAGE
XEN_INITRD = _autoconf.XEN_INITRD
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
+
+KNOWN_XEN_COMMANDS = compat.UniqueFrozenset([
+ XEN_CMD_XM,
+ XEN_CMD_XL,
+ ])
+
# 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
HKR_SUCCESS = 2
# Storage types
+ST_BLOCK = "blockdev"
+ST_DISKLESS = "diskless"
+ST_EXT = "ext"
ST_FILE = "file"
ST_LVM_PV = "lvm-pv"
ST_LVM_VG = "lvm-vg"
+ST_RADOS = "rados"
+
+VALID_STORAGE_TYPES = compat.UniqueFrozenset([
+ ST_BLOCK,
+ ST_DISKLESS,
+ ST_EXT,
+ ST_FILE,
+ ST_LVM_PV,
+ ST_LVM_VG,
+ ST_RADOS,
+ ])
# Storage fields
# first two are valid in LU context only, not passed to backend
SF_ALLOCATABLE,
])
-VALID_STORAGE_TYPES = compat.UniqueFrozenset([
- ST_FILE,
- ST_LVM_PV,
- ST_LVM_VG,
- ])
-
MODIFIABLE_STORAGE_FIELDS = {
ST_LVM_PV: frozenset([SF_ALLOCATABLE]),
}
LDS_UNKNOWN,
LDS_FAULTY) = range(1, 4)
+LDS_NAMES = {
+ LDS_OKAY: "ok",
+ LDS_UNKNOWN: "unknown",
+ LDS_FAULTY: "faulty",
+}
+
# disk template types
+DT_BLOCK = "blockdev"
DT_DISKLESS = "diskless"
-DT_PLAIN = "plain"
DT_DRBD8 = "drbd"
+DT_EXT = "ext"
DT_FILE = "file"
-DT_SHARED_FILE = "sharedfile"
-DT_BLOCK = "blockdev"
+DT_PLAIN = "plain"
DT_RBD = "rbd"
-DT_EXT = "ext"
+DT_SHARED_FILE = "sharedfile"
+
+# This is used to order determine the default disk template when the list
+# of enabled disk templates is inferred from the current state of the cluster.
+# This only happens on an upgrade from a version of Ganeti that did not
+# support the 'enabled_disk_templates' so far.
+DISK_TEMPLATE_PREFERENCE = [
+ DT_DRBD8,
+ DT_PLAIN,
+ DT_FILE,
+ DT_SHARED_FILE,
+ DT_RBD,
+ DT_BLOCK,
+ DT_DISKLESS,
+ DT_EXT
+ ]
+
+DISK_TEMPLATES = compat.UniqueFrozenset([
+ DT_DISKLESS,
+ DT_PLAIN,
+ DT_DRBD8,
+ DT_FILE,
+ DT_SHARED_FILE,
+ DT_BLOCK,
+ DT_RBD,
+ DT_EXT
+ ])
+
+# disk templates that are enabled by default
+DEFAULT_ENABLED_DISK_TEMPLATES = [
+ DT_DRBD8,
+ DT_PLAIN,
+ ]
+
+# mapping of disk templates to storage types
+DISK_TEMPLATES_STORAGE_TYPE = {
+ DT_BLOCK: ST_BLOCK,
+ DT_DISKLESS: ST_DISKLESS,
+ DT_DRBD8: ST_LVM_VG,
+ DT_EXT: ST_EXT,
+ DT_FILE: ST_FILE,
+ DT_PLAIN: ST_LVM_VG,
+ DT_RBD: ST_RADOS,
+ DT_SHARED_FILE: ST_FILE,
+ }
# the set of network-mirrored disk templates
DTS_INT_MIRROR = compat.UniqueFrozenset([DT_DRBD8])
# the set of externally-mirrored disk templates (e.g. SAN, NAS)
DTS_EXT_MIRROR = compat.UniqueFrozenset([
+ DT_DISKLESS, # 'trivially' externally mirrored
DT_SHARED_FILE,
DT_BLOCK,
DT_RBD,
DT_SHARED_FILE,
])
+# the set of disk templates that can be moved by copying
+# Note: a requirement is that they're not accessed externally or shared between
+# nodes; in particular, sharedfile is not suitable.
+DTS_COPYABLE = compat.UniqueFrozenset([
+ DT_FILE,
+ DT_PLAIN,
+ ])
+
# the set of disk templates that are supported by exclusive_storage
DTS_EXCL_STORAGE = compat.UniqueFrozenset([DT_PLAIN])
#: Give child process up to 5 seconds to exit after sending a signal
CHILD_LINGER_TIMEOUT = 5.0
-DISK_TEMPLATES = compat.UniqueFrozenset([
- DT_DISKLESS,
- DT_PLAIN,
- DT_DRBD8,
- DT_FILE,
- DT_SHARED_FILE,
- DT_BLOCK,
- DT_RBD,
- DT_EXT
- ])
-
FILE_DRIVER = compat.UniqueFrozenset([FD_LOOP, FD_BLKTAP])
# import/export config options
ES_PARAMETERS_FILE = "parameters.list"
-# ssh constants
-SSH = "ssh"
-SCP = "scp"
-
# reboot types
INSTANCE_REBOOT_SOFT = "soft"
INSTANCE_REBOOT_HARD = "hard"
HV_KVM_EXTRA = "kvm_extra"
HV_KVM_MACHINE_VERSION = "machine_version"
HV_KVM_PATH = "kvm_path"
+HV_VIF_TYPE = "vif_type"
+HV_VIF_SCRIPT = "vif_script"
+HV_XEN_CMD = "xen_cmd"
HVS_PARAMETER_TYPES = {
HV_VGA: VTYPE_STRING,
HV_KVM_EXTRA: VTYPE_STRING,
HV_KVM_MACHINE_VERSION: VTYPE_STRING,
+ HV_VIF_TYPE: VTYPE_STRING,
+ HV_VIF_SCRIPT: VTYPE_STRING,
+ HV_XEN_CMD: VTYPE_STRING,
}
HVS_PARAMETERS = frozenset(HVS_PARAMETER_TYPES.keys())
ISPECS_PARAMETERS = frozenset(ISPECS_PARAMETER_TYPES.keys())
+ISPECS_MINMAX = "minmax"
ISPECS_MIN = "min"
ISPECS_MAX = "max"
ISPECS_STD = "std"
IPOLICY_VCPU_RATIO = "vcpu-ratio"
IPOLICY_SPINDLE_RATIO = "spindle-ratio"
-IPOLICY_ISPECS = compat.UniqueFrozenset([
+ISPECS_MINMAX_KEYS = compat.UniqueFrozenset([
ISPECS_MIN,
ISPECS_MAX,
- ISPECS_STD,
])
IPOLICY_PARAMETERS = compat.UniqueFrozenset([
IPOLICY_SPINDLE_RATIO,
])
-IPOLICY_ALL_KEYS = (IPOLICY_ISPECS |
- IPOLICY_PARAMETERS |
- frozenset([IPOLICY_DTS]))
+IPOLICY_ALL_KEYS = (IPOLICY_PARAMETERS |
+ frozenset([ISPECS_MINMAX, ISPECS_STD, IPOLICY_DTS]))
# Node parameter names
ND_OOB_PROGRAM = "oob_program"
RESERVE_ACTION = "reserve"
RELEASE_ACTION = "release"
-# An extra description of the network.
-# Can be used by hooks/kvm-vif-bridge to apply different rules
-NETWORK_TYPE_PRIVATE = "private"
-NETWORK_TYPE_PUBLIC = "public"
-
-NETWORK_VALID_TYPES = compat.UniqueFrozenset([
- NETWORK_TYPE_PRIVATE,
- NETWORK_TYPE_PUBLIC,
- ])
-
NICS_PARAMETER_TYPES = {
NIC_MODE: VTYPE_STRING,
NIC_LINK: VTYPE_STRING,
# IDISK_* constants are used in opcodes, to create/change disks
IDISK_SIZE = "size"
+IDISK_SPINDLES = "spindles"
IDISK_MODE = "mode"
IDISK_ADOPT = "adopt"
IDISK_VG = "vg"
IDISK_METAVG = "metavg"
IDISK_PROVIDER = "provider"
+IDISK_NAME = "name"
IDISK_PARAMS_TYPES = {
IDISK_SIZE: VTYPE_SIZE,
+ IDISK_SPINDLES: VTYPE_INT,
IDISK_MODE: VTYPE_STRING,
IDISK_ADOPT: VTYPE_STRING,
IDISK_VG: VTYPE_STRING,
IDISK_METAVG: VTYPE_STRING,
IDISK_PROVIDER: VTYPE_STRING,
+ IDISK_NAME: VTYPE_MAYBE_STRING,
}
IDISK_PARAMS = frozenset(IDISK_PARAMS_TYPES.keys())
INIC_MODE = "mode"
INIC_LINK = "link"
INIC_NETWORK = "network"
+INIC_NAME = "name"
INIC_PARAMS_TYPES = {
INIC_IP: VTYPE_MAYBE_STRING,
INIC_LINK: VTYPE_STRING,
INIC_MAC: VTYPE_STRING,
INIC_MODE: VTYPE_STRING,
INIC_NETWORK: VTYPE_MAYBE_STRING,
+ INIC_NAME: VTYPE_MAYBE_STRING,
}
INIC_PARAMS = frozenset(INIC_PARAMS_TYPES.keys())
HT_NIC_PARAVIRTUAL,
])
+# Vif types
+# default vif type in xen-hvm
+HT_HVM_VIF_IOEMU = "ioemu"
+HT_HVM_VIF_VIF = "vif"
+HT_HVM_VALID_VIF_TYPES = compat.UniqueFrozenset([
+ HT_HVM_VIF_IOEMU,
+ HT_HVM_VIF_VIF,
+ ])
+
# Disk types
HT_DISK_IOEMU = "ioemu"
HT_DISK_IDE = "ide"
CV_ECLUSTERDANGLINGINST = \
(CV_TNODE, "ECLUSTERDANGLINGINST",
"Some instances have a non-existing primary node")
-CV_EGROUPMIXEDESFLAG = \
- (CV_TGROUP, "EGROUPMIXEDESFLAG",
- "exclusive_storage flag is not uniform within the group")
CV_EGROUPDIFFERENTPVSIZE = \
(CV_TGROUP, "EGROUPDIFFERENTPVSIZE", "PVs in the group have different sizes")
CV_EINSTANCEBADNODE = \
CV_EINSTANCEPOLICY = \
(CV_TINSTANCE, "EINSTANCEPOLICY",
"Instance does not meet policy")
+CV_EINSTANCEUNSUITABLENODE = \
+ (CV_TINSTANCE, "EINSTANCEUNSUITABLENODE",
+ "Instance running on nodes that are not suitable for it")
+CV_EINSTANCEMISSINGCFGPARAMETER = \
+ (CV_TINSTANCE, "EINSTANCEMISSINGCFGPARAMETER",
+ "A configuration parameter for an instance is missing")
CV_ENODEDRBD = \
(CV_TNODE, "ENODEDRBD", "Error parsing the DRBD status file")
+CV_ENODEDRBDVERSION = \
+ (CV_TNODE, "ENODEDRBDVERSION", "DRBD version mismatch within a node group")
CV_ENODEDRBDHELPER = \
(CV_TNODE, "ENODEDRBDHELPER", "Error caused by the DRBD helper")
CV_ENODEFILECHECK = \
# Node verify constants
NV_BRIDGES = "bridges"
NV_DRBDHELPER = "drbd-helper"
+NV_DRBDVERSION = "drbd-version"
NV_DRBDLIST = "drbd-list"
+NV_EXCLUSIVEPVS = "exclusive-pvs"
NV_FILELIST = "filelist"
NV_FILE_STORAGE_PATHS = "file-storage-paths"
NV_HVINFO = "hvinfo"
# Job queue
JOB_QUEUE_VERSION = 1
JOB_QUEUE_SIZE_HARD_LIMIT = 5000
+JOB_QUEUE_FILES_PERMS = 0640
JOB_ID_TEMPLATE = r"\d+"
JOB_FILE_RE = re.compile(r"^job-(%s)$" % JOB_ID_TEMPLATE)
SS_NODEGROUPS = "nodegroups"
SS_NETWORKS = "networks"
+# This is not a complete SSCONF key, but the prefix for the hypervisor keys
+SS_HVPARAMS_PREF = "hvparams_"
+
+# Hvparams keys:
+SS_HVPARAMS_XEN_PVM = SS_HVPARAMS_PREF + HT_XEN_PVM
+SS_HVPARAMS_XEN_FAKE = SS_HVPARAMS_PREF + HT_FAKE
+SS_HVPARAMS_XEN_HVM = SS_HVPARAMS_PREF + HT_XEN_HVM
+SS_HVPARAMS_XEN_KVM = SS_HVPARAMS_PREF + HT_KVM
+SS_HVPARAMS_XEN_CHROOT = SS_HVPARAMS_PREF + HT_CHROOT
+SS_HVPARAMS_XEN_LXC = SS_HVPARAMS_PREF + HT_LXC
+
+VALID_SS_HVPARAMS_KEYS = compat.UniqueFrozenset([
+ SS_HVPARAMS_XEN_PVM,
+ SS_HVPARAMS_XEN_FAKE,
+ SS_HVPARAMS_XEN_HVM,
+ SS_HVPARAMS_XEN_KVM,
+ SS_HVPARAMS_XEN_CHROOT,
+ SS_HVPARAMS_XEN_LXC,
+ ])
+
SS_FILE_PERMS = 0444
# cluster wide default parameters
HV_BOOTLOADER_ARGS: "",
HV_KERNEL_PATH: XEN_KERNEL,
HV_INITRD_PATH: "",
- HV_ROOT_PATH: "/dev/sda1",
+ HV_ROOT_PATH: "/dev/xvda1",
HV_KERNEL_ARGS: "ro",
HV_MIGRATION_PORT: 8002,
HV_MIGRATION_MODE: HT_MIGRATION_LIVE,
HV_CPU_MASK: CPU_PINNING_ALL,
HV_CPU_CAP: 0,
HV_CPU_WEIGHT: 256,
+ HV_VIF_SCRIPT: "",
+ HV_XEN_CMD: XEN_CMD_XM,
},
HT_XEN_HVM: {
HV_BOOT_ORDER: "cd",
HV_CPU_MASK: CPU_PINNING_ALL,
HV_CPU_CAP: 0,
HV_CPU_WEIGHT: 256,
+ HV_VIF_TYPE: HT_HVM_VIF_IOEMU,
+ HV_VIF_SCRIPT: "",
+ HV_XEN_CMD: XEN_CMD_XM,
},
HT_KVM: {
HV_KVM_PATH: KVM_PATH,
HV_KVM_EXTRA: "",
HV_KVM_MACHINE_VERSION: "",
},
- HT_FAKE: {},
+ HT_FAKE: {
+ HV_MIGRATION_MODE: HT_MIGRATION_LIVE,
+ },
HT_CHROOT: {
HV_INIT_SCRIPT: "/ganeti-chroot",
},
HV_MIGRATION_PORT,
HV_MIGRATION_BANDWIDTH,
HV_MIGRATION_MODE,
+ HV_XEN_CMD,
])
BEC_DEFAULTS = {
ND_EXCLUSIVE_STORAGE: False,
}
+NDC_GLOBALS = compat.UniqueFrozenset([
+ ND_EXCLUSIVE_STORAGE,
+ ])
+
DISK_LD_DEFAULTS = {
LD_DRBD8: {
LDP_RESYNC_RATE: CLASSIC_DRBD_SYNC_SPEED,
LDP_NET_CUSTOM: "",
LDP_DYNAMIC_RESYNC: False,
- # The default values for the DRBD dynamic resync speed algorithm are taken
- # from the drbsetup 8.3.11 man page, except for c-plan-ahead (that we
- # don't need to set to 0, because we have a separate option to enable it)
- # and for c-max-rate, that we cap to the default value for the static resync
- # rate.
+ # The default values for the DRBD dynamic resync speed algorithm
+ # are taken from the drbsetup 8.3.11 man page, except for
+ # c-plan-ahead (that we don't need to set to 0, because we have a
+ # separate option to enable it) and for c-max-rate, that we cap to
+ # the default value for the static resync rate.
LDP_PLAN_AHEAD: 20, # ds
LDP_FILL_TARGET: 0, # sectors
LDP_DELAY_TARGET: 1, # ds
# All of the following values are quite arbitrarily - there are no
# "good" defaults, these must be customised per-site
-IPOLICY_DEFAULTS = {
+ISPECS_MINMAX_DEFAULTS = {
ISPECS_MIN: {
ISPEC_MEM_SIZE: 128,
ISPEC_CPU_COUNT: 1,
ISPEC_NIC_COUNT: MAX_NICS,
ISPEC_SPINDLE_USE: 12,
},
+ }
+IPOLICY_DEFAULTS = {
+ ISPECS_MINMAX: [ISPECS_MINMAX_DEFAULTS],
ISPECS_STD: {
ISPEC_MEM_SIZE: 128,
ISPEC_CPU_COUNT: 1,
ISPEC_NIC_COUNT: 1,
ISPEC_SPINDLE_USE: 1,
},
- IPOLICY_DTS: DISK_TEMPLATES,
+ IPOLICY_DTS: list(DISK_TEMPLATES),
IPOLICY_VCPU_RATIO: 4.0,
IPOLICY_SPINDLE_RATIO: 32.0,
}
CONFD_REQ_MC_PIP_LIST = 5
CONFD_REQ_INSTANCES_IPS_LIST = 6
CONFD_REQ_NODE_DRBD = 7
+CONFD_REQ_NODE_INSTANCES = 8
# Confd request query fields. These are used to narrow down queries.
# These must be strings rather than integers, because json-encoding
# TODO: make this a default and allow the value to be more configurable
CONFD_MAX_CLOCK_SKEW = 2 * NODE_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.
-CONFD_CONFIG_RELOAD_TIMEOUT = 60
+# 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
-# If we receive more than one update in this amount of seconds, we move to
-# polling every RATELIMIT seconds, rather than relying on inotify, to be able
-# to serve more requests.
-CONFD_CONFIG_RELOAD_RATELIMIT = 2
+# 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
# Magic number prepended to all confd queries.
# This allows us to distinguish different types of confd protocols and handle
# The version identifier for builtin data collectors
BUILTIN_DATA_COLLECTOR_VERSION = "B"
+# The reason trail opcode parameter name
+OPCODE_REASON = "reason"
+
+# The source reasons for the execution of an OpCode
+OPCODE_REASON_SRC_CLIENT = "gnt:client"
+OPCODE_REASON_SRC_NODED = "gnt:daemon:noded"
+OPCODE_REASON_SRC_OPCODE = "gnt:opcode"
+OPCODE_REASON_SRC_RLIB2 = "gnt:library:rlib2"
+OPCODE_REASON_SRC_USER = "gnt:user"
+
+OPCODE_REASON_SOURCES = compat.UniqueFrozenset([
+ OPCODE_REASON_SRC_CLIENT,
+ OPCODE_REASON_SRC_NODED,
+ OPCODE_REASON_SRC_OPCODE,
+ OPCODE_REASON_SRC_RLIB2,
+ OPCODE_REASON_SRC_USER,
+ ])
+
+DISKSTATS_FILE = "/proc/diskstats"
+
# Do not re-export imported modules
del re, _vcsversion, _autoconf, socket, pathutils, compat