X-Git-Url: https://code.grnet.gr/git/ganeti-local/blobdiff_plain/4ab7559954a082d3294ca3c0017f4e3db59b9c85..397b7844524ffe0c512f44d37c0c5a059cc485c8:/lib/constants.py diff --git a/lib/constants.py b/lib/constants.py index c036ba4..192b724 100644 --- a/lib/constants.py +++ b/lib/constants.py @@ -1,7 +1,7 @@ # # -# 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 @@ -106,6 +106,8 @@ CONFD_USER = _autoconf.CONFD_USER 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 @@ -144,35 +146,84 @@ ADOPTABLE_BLOCKDEV_ROOT = "/dev/disk/" 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" @@ -180,6 +231,10 @@ 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 @@ -195,8 +250,12 @@ XEN_KERNEL = _autoconf.XEN_KERNEL 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 @@ -313,9 +372,23 @@ HKR_FAIL = 1 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 @@ -341,12 +414,6 @@ VALID_STORAGE_FIELDS = compat.UniqueFrozenset([ SF_ALLOCATABLE, ]) -VALID_STORAGE_TYPES = compat.UniqueFrozenset([ - ST_FILE, - ST_LVM_PV, - ST_LVM_VG, - ]) - MODIFIABLE_STORAGE_FIELDS = { ST_LVM_PV: frozenset([SF_ALLOCATABLE]), } @@ -361,21 +428,72 @@ VALID_STORAGE_OPERATIONS = { 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, @@ -420,8 +538,16 @@ DTS_FILEBASED = compat.UniqueFrozenset([ 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 = frozenset([DT_PLAIN]) +DTS_EXCL_STORAGE = compat.UniqueFrozenset([DT_PLAIN]) # templates for which we don't perform checks on free space DTS_NO_FREE_SPACE_CHECK = compat.UniqueFrozenset([ @@ -545,17 +671,6 @@ RIE_CONNECT_RETRIES = 10 #: 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 @@ -708,10 +823,6 @@ ES_SCRIPTS = frozenset([ ES_PARAMETERS_FILE = "parameters.list" -# ssh constants -SSH = "ssh" -SCP = "scp" - # reboot types INSTANCE_REBOOT_SOFT = "soft" INSTANCE_REBOOT_HARD = "hard" @@ -835,9 +946,14 @@ HV_USB_DEVICES = "usb_devices" HV_VGA = "vga" 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_KVM_PATH: VTYPE_STRING, HV_BOOT_ORDER: VTYPE_STRING, HV_KVM_FLOPPY_IMAGE_PATH: VTYPE_STRING, HV_CDROM_IMAGE_PATH: VTYPE_STRING, @@ -903,6 +1019,9 @@ 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()) @@ -1041,6 +1160,7 @@ ISPECS_PARAMETER_TYPES = { ISPECS_PARAMETERS = frozenset(ISPECS_PARAMETER_TYPES.keys()) +ISPECS_MINMAX = "minmax" ISPECS_MIN = "min" ISPECS_MAX = "max" ISPECS_STD = "std" @@ -1048,10 +1168,9 @@ IPOLICY_DTS = "disk-templates" 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([ @@ -1059,9 +1178,8 @@ 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" @@ -1207,16 +1325,6 @@ NIC_VALID_MODES = compat.UniqueFrozenset([ 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, @@ -1226,18 +1334,22 @@ NICS_PARAMETERS = frozenset(NICS_PARAMETER_TYPES.keys()) # 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()) @@ -1247,12 +1359,14 @@ INIC_IP = "ip" 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()) @@ -1306,6 +1420,15 @@ HT_KVM_VALID_NIC_TYPES = compat.UniqueFrozenset([ 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" @@ -1430,6 +1553,7 @@ VERIFY_OPTIONAL_CHECKS = compat.UniqueFrozenset([VERIFY_NPLUSONE_MEM]) # Cluster Verify error classes CV_TCLUSTER = "cluster" +CV_TGROUP = "group" CV_TNODE = "node" CV_TINSTANCE = "instance" @@ -1448,6 +1572,8 @@ CV_ECLUSTERDANGLINGNODES = \ CV_ECLUSTERDANGLINGINST = \ (CV_TNODE, "ECLUSTERDANGLINGINST", "Some instances have a non-existing primary node") +CV_EGROUPDIFFERENTPVSIZE = \ + (CV_TGROUP, "EGROUPDIFFERENTPVSIZE", "PVs in the group have different sizes") CV_EINSTANCEBADNODE = \ (CV_TINSTANCE, "EINSTANCEBADNODE", "Instance marked as running lives on an offline node") @@ -1468,8 +1594,16 @@ CV_EINSTANCESPLITGROUPS = \ 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 = \ @@ -1549,28 +1683,30 @@ CV_ALL_ECODES_STRINGS = \ compat.UniqueFrozenset(estr for (_, estr, _) in CV_ALL_ECODES) # 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" -NV_HYPERVISOR = "hypervisor" NV_HVPARAMS = "hvparms" +NV_HYPERVISOR = "hypervisor" NV_INSTANCELIST = "instancelist" NV_LVLIST = "lvlist" NV_MASTERIP = "master-ip" NV_NODELIST = "nodelist" NV_NODENETTEST = "node-net-test" NV_NODESETUP = "nodesetup" +NV_OOB_PATHS = "oob-paths" NV_OSLIST = "oslist" NV_PVLIST = "pvlist" NV_TIME = "time" +NV_USERSCRIPTS = "user-scripts" NV_VERSION = "version" NV_VGLIST = "vglist" NV_VMNODES = "vmnodes" -NV_OOB_PATHS = "oob-paths" -NV_BRIDGES = "bridges" -NV_USERSCRIPTS = "user-scripts" -NV_FILE_STORAGE_PATHS = "file-storage-paths" # Instance status INSTST_RUNNING = "running" @@ -1665,6 +1801,7 @@ NODE_EVAC_MODES = compat.UniqueFrozenset([ # 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) @@ -1876,6 +2013,26 @@ SS_UID_POOL = "uid_pool" 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 @@ -1888,7 +2045,7 @@ HVC_DEFAULTS = { 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, @@ -1897,6 +2054,8 @@ HVC_DEFAULTS = { 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", @@ -1918,8 +2077,12 @@ HVC_DEFAULTS = { 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_KERNEL_PATH: KVM_KERNEL, HV_INITRD_PATH: "", HV_KERNEL_ARGS: "ro", @@ -1976,7 +2139,9 @@ HVC_DEFAULTS = { HV_KVM_EXTRA: "", HV_KVM_MACHINE_VERSION: "", }, - HT_FAKE: {}, + HT_FAKE: { + HV_MIGRATION_MODE: HT_MIGRATION_LIVE, + }, HT_CHROOT: { HV_INIT_SCRIPT: "/ganeti-chroot", }, @@ -1989,6 +2154,7 @@ HVC_GLOBALS = compat.UniqueFrozenset([ HV_MIGRATION_PORT, HV_MIGRATION_BANDWIDTH, HV_MIGRATION_MODE, + HV_XEN_CMD, ]) BEC_DEFAULTS = { @@ -2006,6 +2172,10 @@ NDC_DEFAULTS = { ND_EXCLUSIVE_STORAGE: False, } +NDC_GLOBALS = compat.UniqueFrozenset([ + ND_EXCLUSIVE_STORAGE, + ]) + DISK_LD_DEFAULTS = { LD_DRBD8: { LDP_RESYNC_RATE: CLASSIC_DRBD_SYNC_SPEED, @@ -2016,11 +2186,11 @@ DISK_LD_DEFAULTS = { 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 @@ -2082,7 +2252,7 @@ NICC_DEFAULTS = { # 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, @@ -2099,6 +2269,9 @@ IPOLICY_DEFAULTS = { 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, @@ -2107,7 +2280,7 @@ IPOLICY_DEFAULTS = { 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, } @@ -2130,6 +2303,7 @@ 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 request query fields. These are used to narrow down queries. # These must be strings rather than integers, because json-encoding @@ -2181,14 +2355,16 @@ CONFD_ERROR_ARGUMENT = 3 # 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 @@ -2312,5 +2488,28 @@ AUTO_REPAIR_ALL_RESULTS = frozenset([ AUTO_REPAIR_ENOPERM, ]) +# 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