X-Git-Url: https://code.grnet.gr/git/ganeti-local/blobdiff_plain/ea064d24d0eeeafa05bade63227a8b6c837c5036..81f7ea25fa942612873eb159e24c44e24ce84e69:/lib/constants.py diff --git a/lib/constants.py b/lib/constants.py index 13a1a07..2fd5432 100644 --- a/lib/constants.py +++ b/lib/constants.py @@ -1,7 +1,7 @@ # # -# Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011 Google Inc. +# Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011, 2012 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 @@ -99,6 +99,27 @@ CONFD_GROUP = _autoconf.CONFD_GROUP NODED_USER = _autoconf.NODED_USER NODED_GROUP = _autoconf.NODED_GROUP +# cpu pinning separators and constants +CPU_PINNING_SEP = ":" +CPU_PINNING_ALL = "all" +# internal representation of "all" +CPU_PINNING_ALL_VAL = -1 +# one "all" entry in a CPU list means CPU pinning is off +CPU_PINNING_OFF = [CPU_PINNING_ALL_VAL] + +# 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 all". +# The workaround used in Xen is "0-63" (see source code function +# xm_vcpu_pin in /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" + +# 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 # Wipe DD_CMD = "dd" @@ -139,6 +160,8 @@ CLUSTER_CONF_FILE = DATA_DIR + "/config.data" NODED_CERT_FILE = DATA_DIR + "/server.pem" RAPI_CERT_FILE = DATA_DIR + "/rapi.pem" CONFD_HMAC_KEY = DATA_DIR + "/hmac.key" +SPICE_CERT_FILE = DATA_DIR + "/spice.pem" +SPICE_CACERT_FILE = DATA_DIR + "/spice-ca.pem" CLUSTER_DOMAIN_SECRET_FILE = DATA_DIR + "/cluster-domain-secret" INSTANCE_STATUS_FILE = RUN_GANETI_DIR + "/instance-status" SSH_KNOWN_HOSTS_FILE = DATA_DIR + "/known_hosts" @@ -157,6 +180,8 @@ ENABLE_SHARED_FILE_STORAGE = _autoconf.ENABLE_SHARED_FILE_STORAGE SYSCONFDIR = _autoconf.SYSCONFDIR TOOLSDIR = _autoconf.TOOLSDIR CONF_DIR = SYSCONFDIR + "/ganeti" +USER_SCRIPTS_DIR = CONF_DIR + "/scripts" +ENABLE_CONFD = _autoconf.ENABLE_CONFD #: Lock file for watcher, locked in shared mode by watcher; lock in exclusive # mode to block watcher (see L{cli._RunWhileClusterStoppedHelper.Call} @@ -172,7 +197,16 @@ WATCHER_GROUP_INSTANCE_STATUS_FILE = DATA_DIR + "/watcher.%s.instance-status" #: File containing Unix timestamp until which watcher should be paused WATCHER_PAUSEFILE = DATA_DIR + "/watcher.pause" -ALL_CERT_FILES = frozenset([NODED_CERT_FILE, RAPI_CERT_FILE]) +# 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" + +ALL_CERT_FILES = frozenset([ + NODED_CERT_FILE, + RAPI_CERT_FILE, + SPICE_CERT_FILE, + SPICE_CACERT_FILE, + ]) MASTER_SOCKET = SOCKET_DIR + "/ganeti-master" @@ -242,6 +276,7 @@ EXPORT_CONF_FILE = "config.ini" XEN_BOOTLOADER = _autoconf.XEN_BOOTLOADER XEN_KERNEL = _autoconf.XEN_KERNEL XEN_INITRD = _autoconf.XEN_INITRD +XEN_CMD = "xm" KVM_PATH = _autoconf.KVM_PATH SOCAT_PATH = _autoconf.SOCAT_PATH @@ -331,6 +366,7 @@ HOOKS_PHASE_POST = "post" HOOKS_NAME_CFGUPDATE = "config-update" HOOKS_NAME_WATCHER = "watcher" HOOKS_VERSION = 2 +HOOKS_PATH = "/sbin:/bin:/usr/sbin:/usr/bin" # hooks subject type (what object type does the LU deal with) HTYPE_CLUSTER = "CLUSTER" @@ -394,18 +430,20 @@ DT_DRBD8 = "drbd" DT_FILE = "file" DT_SHARED_FILE = "sharedfile" DT_BLOCK = "blockdev" +DT_RBD = "rbd" # the set of network-mirrored disk templates DTS_INT_MIRROR = frozenset([DT_DRBD8]) # the set of externally-mirrored disk templates (e.g. SAN, NAS) -DTS_EXT_MIRROR = frozenset([DT_SHARED_FILE, DT_BLOCK]) +DTS_EXT_MIRROR = frozenset([DT_SHARED_FILE, DT_BLOCK, DT_RBD]) # the set of non-lvm-based disk templates -DTS_NOT_LVM = frozenset([DT_DISKLESS, DT_FILE, DT_SHARED_FILE, DT_BLOCK]) +DTS_NOT_LVM = frozenset([DT_DISKLESS, DT_FILE, DT_SHARED_FILE, + DT_BLOCK, DT_RBD]) # the set of disk templates which can be grown -DTS_GROWABLE = frozenset([DT_PLAIN, DT_DRBD8, DT_FILE, DT_SHARED_FILE]) +DTS_GROWABLE = frozenset([DT_PLAIN, DT_DRBD8, DT_FILE, DT_SHARED_FILE, DT_RBD]) # the set of disk templates that allow adoption DTS_MAY_ADOPT = frozenset([DT_PLAIN, DT_BLOCK]) @@ -424,12 +462,42 @@ LD_LV = "lvm" LD_DRBD8 = "drbd8" LD_FILE = "file" LD_BLOCKDEV = "blockdev" -LDS_BLOCK = frozenset([LD_LV, LD_DRBD8, LD_BLOCKDEV]) +LD_RBD = "rbd" +LOGICAL_DISK_TYPES = frozenset([ + LD_LV, + LD_DRBD8, + LD_FILE, + LD_BLOCKDEV, + LD_RBD, + ]) + +LDS_BLOCK = frozenset([LD_LV, LD_DRBD8, LD_BLOCKDEV, LD_RBD]) # drbd constants DRBD_HMAC_ALG = "md5" DRBD_NET_PROTOCOL = "C" -DRBD_BARRIERS = _autoconf.DRBD_BARRIERS + +# 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]), + ]) + +# rbd tool command +RBD_CMD = "rbd" # file backend driver FD_LOOP = "loop" @@ -510,7 +578,8 @@ DISK_TEMPLATES = frozenset([ DT_DRBD8, DT_FILE, DT_SHARED_FILE, - DT_BLOCK + DT_BLOCK, + DT_RBD ]) FILE_DRIVER = frozenset([FD_LOOP, FD_BLKTAP]) @@ -524,8 +593,13 @@ INISECT_OSP = "os" # dynamic device modification DDM_ADD = "add" +DDM_MODIFY = "modify" DDM_REMOVE = "remove" DDMS_VALUES = frozenset([DDM_ADD, DDM_REMOVE]) +DDMS_VALUES_WITH_MODIFY = (DDMS_VALUES | frozenset([ + DDM_MODIFY, + ])) +# TODO: DDM_SWAP, DDM_MOVE? # common exit codes EXIT_SUCCESS = 0 @@ -554,7 +628,7 @@ MAX_TAGS_PER_OBJ = 4096 # others DEFAULT_BRIDGE = "xen-br0" -SYNC_SPEED = 60 * 1024 +CLASSIC_DRBD_SYNC_SPEED = 60 * 1024 # 60 MiB, expressed in KiB IP4_ADDRESS_LOCALHOST = "127.0.0.1" IP4_ADDRESS_ANY = "0.0.0.0" IP6_ADDRESS_LOCALHOST = "::1" @@ -568,7 +642,6 @@ DEFAULT_VG = "xenvg" DEFAULT_DRBD_HELPER = "/bin/true" MIN_VG_SIZE = 20480 DEFAULT_MAC_PREFIX = "aa:00:00" -LVM_STRIPECOUNT = _autoconf.LVM_STRIPECOUNT # default maximum instance wait time, in seconds. DEFAULT_SHUTDOWN_TIMEOUT = 120 NODE_MAX_CLOCK_SKEW = 150 @@ -679,6 +752,9 @@ 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" +HV_KVM_SPICE_USE_TLS = "spice_use_tls" +HV_KVM_SPICE_TLS_CIPHERS = "spice_tls_ciphers" +HV_KVM_SPICE_USE_VDAGENT = "spice_use_vdagent" HV_ACPI = "acpi" HV_PAE = "pae" HV_USE_BOOTLOADER = "use_bootloader" @@ -730,6 +806,9 @@ HVS_PARAMETER_TYPES = { HV_KVM_SPICE_ZLIB_GLZ_IMG_COMPR: VTYPE_STRING, HV_KVM_SPICE_STREAMING_VIDEO_DETECTION: VTYPE_STRING, HV_KVM_SPICE_AUDIO_COMPR: VTYPE_BOOL, + HV_KVM_SPICE_USE_TLS: VTYPE_BOOL, + HV_KVM_SPICE_TLS_CIPHERS: VTYPE_STRING, + HV_KVM_SPICE_USE_VDAGENT: VTYPE_BOOL, HV_ACPI: VTYPE_BOOL, HV_PAE: VTYPE_BOOL, HV_USE_BOOTLOADER: VTYPE_BOOL, @@ -763,28 +842,220 @@ HVS_PARAMETER_TYPES = { HVS_PARAMETERS = frozenset(HVS_PARAMETER_TYPES.keys()) +# 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 + +# Node info keys +HV_NODEINFO_KEY_VERSION = "hv_version" + +# 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" + +HVST_DEFAULTS = { + HVST_MEMORY_TOTAL: 0, + HVST_MEMORY_NODE: 0, + HVST_MEMORY_HV: 0, + HVST_CPU_TOTAL: 1, + HVST_CPU_NODE: 1, + } + +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" + +DS_DEFAULTS = { + DS_DISK_TOTAL: 0, + DS_DISK_RESERVED: 0, + DS_DISK_OVERHEAD: 0, + } + +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()) +DS_VALID_TYPES = frozenset([LD_LV]) + # Backend parameter names -BE_MEMORY = "memory" +BE_MEMORY = "memory" # deprecated and replaced by max and min mem +BE_MAXMEM = "maxmem" +BE_MINMEM = "minmem" BE_VCPUS = "vcpus" BE_AUTO_BALANCE = "auto_balance" +BE_ALWAYS_FAILOVER = "always_failover" BES_PARAMETER_TYPES = { - BE_MEMORY: VTYPE_SIZE, - BE_VCPUS: VTYPE_INT, - BE_AUTO_BALANCE: VTYPE_BOOL, - } + BE_MAXMEM: VTYPE_SIZE, + BE_MINMEM: VTYPE_SIZE, + BE_VCPUS: VTYPE_INT, + BE_AUTO_BALANCE: VTYPE_BOOL, + BE_ALWAYS_FAILOVER: VTYPE_BOOL, + } + +BES_PARAMETER_COMPAT = { + BE_MEMORY: VTYPE_SIZE, + } +BES_PARAMETER_COMPAT.update(BES_PARAMETER_TYPES) BES_PARAMETERS = frozenset(BES_PARAMETER_TYPES.keys()) +# instance specs +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" + +ISPECS_PARAMETER_TYPES = { + 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, + } + +ISPECS_PARAMETERS = frozenset(ISPECS_PARAMETER_TYPES.keys()) + +ISPECS_MIN = "min" +ISPECS_MAX = "max" +ISPECS_STD = "std" +IPOLICY_DTS = "disk-templates" +IPOLICY_VCPU_RATIO = "vcpu-ratio" +IPOLICY_SPINDLE_RATIO = "spindle-ratio" + +IPOLICY_ISPECS = frozenset([ + ISPECS_MIN, + ISPECS_MAX, + ISPECS_STD, + ]) + +IPOLICY_PARAMETERS = frozenset([ + IPOLICY_VCPU_RATIO, + IPOLICY_SPINDLE_RATIO, + ]) + +IPOLICY_ALL_KEYS = (IPOLICY_ISPECS | + IPOLICY_PARAMETERS | + frozenset([IPOLICY_DTS])) + # Node parameter names ND_OOB_PROGRAM = "oob_program" +ND_SPINDLE_COUNT = "spindle_count" NDS_PARAMETER_TYPES = { - ND_OOB_PROGRAM: VTYPE_MAYBE_STRING, - } + ND_OOB_PROGRAM: VTYPE_MAYBE_STRING, + ND_SPINDLE_COUNT: VTYPE_INT, + } NDS_PARAMETERS = frozenset(NDS_PARAMETER_TYPES.keys()) +# Logical Disks parameters +LDP_RESYNC_RATE = "resync-rate" +LDP_STRIPES = "stripes" +LDP_BARRIERS = "disabled-barriers" +LDP_NO_META_FLUSH = "disable-meta-flush" +LDP_DEFAULT_METAVG = "default-metavg" +LDP_DISK_CUSTOM = "disk-custom" +LDP_NET_CUSTOM = "net-custom" +LDP_DYNAMIC_RESYNC = "dynamic-resync" +LDP_PLAN_AHEAD = "c-plan-ahead" +LDP_FILL_TARGET = "c-fill-target" +LDP_DELAY_TARGET = "c-delay-target" +LDP_MAX_RATE = "c-max-rate" +LDP_MIN_RATE = "c-min-rate" +LDP_POOL = "pool" +DISK_LD_TYPES = { + LDP_RESYNC_RATE: VTYPE_INT, + LDP_STRIPES: VTYPE_INT, + LDP_BARRIERS: VTYPE_STRING, + LDP_NO_META_FLUSH: VTYPE_BOOL, + LDP_DEFAULT_METAVG: VTYPE_STRING, + LDP_DISK_CUSTOM: VTYPE_STRING, + LDP_NET_CUSTOM: VTYPE_STRING, + LDP_DYNAMIC_RESYNC: VTYPE_BOOL, + LDP_PLAN_AHEAD: VTYPE_INT, + LDP_FILL_TARGET: VTYPE_INT, + LDP_DELAY_TARGET: VTYPE_INT, + LDP_MAX_RATE: VTYPE_INT, + LDP_MIN_RATE: VTYPE_INT, + LDP_POOL: VTYPE_STRING, + } +DISK_LD_PARAMETERS = frozenset(DISK_LD_TYPES.keys()) + +# Disk template parameters (can be set/changed by the user via gnt-cluster and +# gnt-group) +DRBD_RESYNC_RATE = "resync-rate" +DRBD_DATA_STRIPES = "data-stripes" +DRBD_META_STRIPES = "meta-stripes" +DRBD_DISK_BARRIERS = "disk-barriers" +DRBD_META_BARRIERS = "meta-barriers" +DRBD_DEFAULT_METAVG = "metavg" +DRBD_DISK_CUSTOM = "disk-custom" +DRBD_NET_CUSTOM = "net-custom" +DRBD_DYNAMIC_RESYNC = "dynamic-resync" +DRBD_PLAN_AHEAD = "c-plan-ahead" +DRBD_FILL_TARGET = "c-fill-target" +DRBD_DELAY_TARGET = "c-delay-target" +DRBD_MAX_RATE = "c-max-rate" +DRBD_MIN_RATE = "c-min-rate" +LV_STRIPES = "stripes" +RBD_POOL = "pool" +DISK_DT_TYPES = { + DRBD_RESYNC_RATE: VTYPE_INT, + DRBD_DATA_STRIPES: VTYPE_INT, + DRBD_META_STRIPES: VTYPE_INT, + DRBD_DISK_BARRIERS: VTYPE_STRING, + DRBD_META_BARRIERS: VTYPE_BOOL, + DRBD_DEFAULT_METAVG: VTYPE_STRING, + DRBD_DISK_CUSTOM: VTYPE_STRING, + DRBD_NET_CUSTOM: VTYPE_STRING, + DRBD_DYNAMIC_RESYNC: VTYPE_BOOL, + DRBD_PLAN_AHEAD: VTYPE_INT, + DRBD_FILL_TARGET: VTYPE_INT, + DRBD_DELAY_TARGET: VTYPE_INT, + DRBD_MAX_RATE: VTYPE_INT, + DRBD_MIN_RATE: VTYPE_INT, + LV_STRIPES: VTYPE_INT, + RBD_POOL: VTYPE_STRING, + } + +DISK_DT_PARAMETERS = frozenset(DISK_DT_TYPES.keys()) + # OOB supported commands OOB_POWER_ON = "power-on" OOB_POWER_OFF = "power-off" @@ -830,9 +1101,9 @@ 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, - } + NIC_MODE: VTYPE_STRING, + NIC_LINK: VTYPE_STRING, + } NICS_PARAMETERS = frozenset(NICS_PARAMETER_TYPES.keys()) @@ -1024,6 +1295,122 @@ HT_MIGRATION_MODES = frozenset([HT_MIGRATION_LIVE, HT_MIGRATION_NONLIVE]) VERIFY_NPLUSONE_MEM = "nplusone_mem" VERIFY_OPTIONAL_CHECKS = frozenset([VERIFY_NPLUSONE_MEM]) +# Cluster Verify error classes +CV_TCLUSTER = "cluster" +CV_TNODE = "node" +CV_TINSTANCE = "instance" + +# Cluster Verify error codes and documentation +CV_ECLUSTERCFG = \ + (CV_TCLUSTER, "ECLUSTERCFG", "Cluster configuration verification failure") +CV_ECLUSTERCERT = \ + (CV_TCLUSTER, "ECLUSTERCERT", + "Cluster certificate files verification failure") +CV_ECLUSTERFILECHECK = \ + (CV_TCLUSTER, "ECLUSTERFILECHECK", + "Cluster configuration verification failure") +CV_ECLUSTERDANGLINGNODES = \ + (CV_TNODE, "ECLUSTERDANGLINGNODES", + "Some nodes belong to non-existing groups") +CV_ECLUSTERDANGLINGINST = \ + (CV_TNODE, "ECLUSTERDANGLINGINST", + "Some instances have a non-existing primary node") +CV_EINSTANCEBADNODE = \ + (CV_TINSTANCE, "EINSTANCEBADNODE", + "Instance marked as running lives on an offline node") +CV_EINSTANCEDOWN = \ + (CV_TINSTANCE, "EINSTANCEDOWN", "Instance not running on its primary node") +CV_EINSTANCELAYOUT = \ + (CV_TINSTANCE, "EINSTANCELAYOUT", "Instance has multiple secondary nodes") +CV_EINSTANCEMISSINGDISK = \ + (CV_TINSTANCE, "EINSTANCEMISSINGDISK", "Missing volume on an instance") +CV_EINSTANCEFAULTYDISK = \ + (CV_TINSTANCE, "EINSTANCEFAULTYDISK", + "Impossible to retrieve status for a disk") +CV_EINSTANCEWRONGNODE = \ + (CV_TINSTANCE, "EINSTANCEWRONGNODE", "Instance running on the wrong node") +CV_EINSTANCESPLITGROUPS = \ + (CV_TINSTANCE, "EINSTANCESPLITGROUPS", + "Instance with primary and secondary nodes in different groups") +CV_EINSTANCEPOLICY = \ + (CV_TINSTANCE, "EINSTANCEPOLICY", + "Instance does not meet policy") +CV_ENODEDRBD = \ + (CV_TNODE, "ENODEDRBD", "Error parsing the DRBD status file") +CV_ENODEDRBDHELPER = \ + (CV_TNODE, "ENODEDRBDHELPER", "Error caused by the DRBD helper") +CV_ENODEFILECHECK = \ + (CV_TNODE, "ENODEFILECHECK", + "Error retrieving the checksum of the node files") +CV_ENODEHOOKS = \ + (CV_TNODE, "ENODEHOOKS", "Communication failure in hooks execution") +CV_ENODEHV = \ + (CV_TNODE, "ENODEHV", "Hypervisor parameters verification failure") +CV_ENODELVM = \ + (CV_TNODE, "ENODELVM", "LVM-related node error") +CV_ENODEN1 = \ + (CV_TNODE, "ENODEN1", "Not enough memory to accommodate instance failovers") +CV_ENODENET = \ + (CV_TNODE, "ENODENET", "Network-related node error") +CV_ENODEOS = \ + (CV_TNODE, "ENODEOS", "OS-related node error") +CV_ENODEORPHANINSTANCE = \ + (CV_TNODE, "ENODEORPHANINSTANCE", "Unknown intance running on a node") +CV_ENODEORPHANLV = \ + (CV_TNODE, "ENODEORPHANLV", "Unknown LVM logical volume") +CV_ENODERPC = \ + (CV_TNODE, "ENODERPC", + "Error during connection to the primary node of an instance") +CV_ENODESSH = \ + (CV_TNODE, "ENODESSH", "SSH-related node error") +CV_ENODEVERSION = \ + (CV_TNODE, "ENODEVERSION", + "Protocol version mismatch or Ganeti version mismatch") +CV_ENODESETUP = \ + (CV_TNODE, "ENODESETUP", "Node setup error") +CV_ENODETIME = \ + (CV_TNODE, "ENODETIME", "Node returned invalid time") +CV_ENODEOOBPATH = \ + (CV_TNODE, "ENODEOOBPATH", "Invalid Out Of Band path") +CV_ENODEUSERSCRIPTS = \ + (CV_TNODE, "ENODEUSERSCRIPTS", "User scripts not present or not executable") + +CV_ALL_ECODES = frozenset([ + CV_ECLUSTERCFG, + CV_ECLUSTERCERT, + CV_ECLUSTERFILECHECK, + CV_ECLUSTERDANGLINGNODES, + CV_ECLUSTERDANGLINGINST, + CV_EINSTANCEBADNODE, + CV_EINSTANCEDOWN, + CV_EINSTANCELAYOUT, + CV_EINSTANCEMISSINGDISK, + CV_EINSTANCEFAULTYDISK, + CV_EINSTANCEWRONGNODE, + CV_EINSTANCESPLITGROUPS, + CV_EINSTANCEPOLICY, + CV_ENODEDRBD, + CV_ENODEDRBDHELPER, + CV_ENODEFILECHECK, + CV_ENODEHOOKS, + CV_ENODEHV, + CV_ENODELVM, + CV_ENODEN1, + CV_ENODENET, + CV_ENODEOS, + CV_ENODEORPHANINSTANCE, + CV_ENODEORPHANLV, + CV_ENODERPC, + CV_ENODESSH, + CV_ENODEVERSION, + CV_ENODESETUP, + CV_ENODETIME, + CV_ENODEOOBPATH, + CV_ENODEUSERSCRIPTS, + ]) + +CV_ALL_ECODES_STRINGS = frozenset(estr for (_, estr, _) in CV_ALL_ECODES) + # Node verify constants NV_DRBDHELPER = "drbd-helper" NV_DRBDLIST = "drbd-list" @@ -1045,10 +1432,12 @@ NV_VGLIST = "vglist" NV_VMNODES = "vmnodes" NV_OOB_PATHS = "oob-paths" NV_BRIDGES = "bridges" +NV_USERSCRIPTS = "user-scripts" # Instance status INSTST_RUNNING = "running" INSTST_ADMINDOWN = "ADMIN_down" +INSTST_ADMINOFFLINE = "ADMIN_offline" INSTST_NODEOFFLINE = "ERROR_nodeoffline" INSTST_NODEDOWN = "ERROR_nodedown" INSTST_WRONGNODE = "ERROR_wrongnode" @@ -1057,6 +1446,7 @@ INSTST_ERRORDOWN = "ERROR_down" INSTST_ALL = frozenset([ INSTST_RUNNING, INSTST_ADMINDOWN, + INSTST_ADMINOFFLINE, INSTST_NODEOFFLINE, INSTST_NODEDOWN, INSTST_WRONGNODE, @@ -1064,6 +1454,16 @@ INSTST_ALL = frozenset([ INSTST_ERRORDOWN, ]) +# Admin states +ADMINST_UP = "up" +ADMINST_DOWN = "down" +ADMINST_OFFLINE = "offline" +ADMINST_ALL = frozenset([ + ADMINST_UP, + ADMINST_DOWN, + ADMINST_OFFLINE, + ]) + # Node roles NR_REGULAR = "R" NR_MASTER = "M" @@ -1111,6 +1511,16 @@ IALLOCATOR_NEVAC_MODES = frozenset([ IALLOCATOR_NEVAC_ALL, ]) +# Node evacuation +NODE_EVAC_PRI = "primary-only" +NODE_EVAC_SEC = "secondary-only" +NODE_EVAC_ALL = "all" +NODE_EVAC_MODES = frozenset([ + NODE_EVAC_PRI, + NODE_EVAC_SEC, + NODE_EVAC_ALL, + ]) + # Job queue JOB_QUEUE_VERSION = 1 JOB_QUEUE_LOCK_FILE = QUEUE_DIR + "/lock" @@ -1285,6 +1695,7 @@ SS_MASTER_CANDIDATES = "master_candidates" SS_MASTER_CANDIDATES_IPS = "master_candidates_ips" SS_MASTER_IP = "master_ip" SS_MASTER_NETDEV = "master_netdev" +SS_MASTER_NETMASK = "master_netmask" SS_MASTER_NODE = "master_node" SS_NODE_LIST = "node_list" SS_NODE_PRIMARY_IPS = "node_primary_ips" @@ -1317,6 +1728,7 @@ HVC_DEFAULTS = { HV_MIGRATION_MODE: HT_MIGRATION_LIVE, HV_BLOCKDEV_PREFIX: "sd", HV_REBOOT_BEHAVIOR: INSTANCE_REBOOT_ALLOWED, + HV_CPU_MASK: CPU_PINNING_ALL, }, HT_XEN_HVM: { HV_BOOT_ORDER: "cd", @@ -1334,6 +1746,7 @@ HVC_DEFAULTS = { HV_USE_LOCALTIME: False, HV_BLOCKDEV_PREFIX: "hd", HV_REBOOT_BEHAVIOR: INSTANCE_REBOOT_ALLOWED, + HV_CPU_MASK: CPU_PINNING_ALL, }, HT_KVM: { HV_KERNEL_PATH: "/boot/vmlinuz-2.6-kvmU", @@ -1355,6 +1768,9 @@ HVC_DEFAULTS = { HV_KVM_SPICE_ZLIB_GLZ_IMG_COMPR: "", HV_KVM_SPICE_STREAMING_VIDEO_DETECTION: "", HV_KVM_SPICE_AUDIO_COMPR: True, + HV_KVM_SPICE_USE_TLS: False, + HV_KVM_SPICE_TLS_CIPHERS: OPENSSL_CIPHERS, + HV_KVM_SPICE_USE_VDAGENT: True, HV_KVM_FLOPPY_IMAGE_PATH: "", HV_CDROM_IMAGE_PATH: "", HV_KVM_CDROM2_IMAGE_PATH: "", @@ -1377,6 +1793,7 @@ HVC_DEFAULTS = { HV_KVM_USE_CHROOT: False, HV_MEM_PATH: "", HV_REBOOT_BEHAVIOR: INSTANCE_REBOOT_ALLOWED, + HV_CPU_MASK: CPU_PINNING_ALL, }, HT_FAKE: { }, @@ -1395,20 +1812,125 @@ HVC_GLOBALS = frozenset([ ]) BEC_DEFAULTS = { - BE_MEMORY: 128, + BE_MINMEM: 128, + BE_MAXMEM: 128, BE_VCPUS: 1, BE_AUTO_BALANCE: True, + BE_ALWAYS_FAILOVER: False, } NDC_DEFAULTS = { ND_OOB_PROGRAM: None, + ND_SPINDLE_COUNT: 1, + } + +DISK_LD_DEFAULTS = { + LD_DRBD8: { + LDP_RESYNC_RATE: CLASSIC_DRBD_SYNC_SPEED, + LDP_BARRIERS: _autoconf.DRBD_BARRIERS, + LDP_NO_META_FLUSH: _autoconf.DRBD_NO_META_FLUSH, + LDP_DEFAULT_METAVG: DEFAULT_VG, + LDP_DISK_CUSTOM: "", + 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. + LDP_PLAN_AHEAD: 20, # ds + LDP_FILL_TARGET: 0, # sectors + LDP_DELAY_TARGET: 1, # ds + LDP_MAX_RATE: CLASSIC_DRBD_SYNC_SPEED, # KiB/s + LDP_MIN_RATE: 4 * 1024, # KiB/s + }, + LD_LV: { + LDP_STRIPES: _autoconf.LVM_STRIPECOUNT + }, + LD_FILE: { + }, + LD_BLOCKDEV: { + }, + LD_RBD: { + LDP_POOL: "rbd" + }, + } + +# readability shortcuts +_LV_DEFAULTS = DISK_LD_DEFAULTS[LD_LV] +_DRBD_DEFAULTS = DISK_LD_DEFAULTS[LD_DRBD8] + +DISK_DT_DEFAULTS = { + DT_PLAIN: { + LV_STRIPES: DISK_LD_DEFAULTS[LD_LV][LDP_STRIPES], + }, + DT_DRBD8: { + DRBD_RESYNC_RATE: _DRBD_DEFAULTS[LDP_RESYNC_RATE], + DRBD_DATA_STRIPES: _LV_DEFAULTS[LDP_STRIPES], + DRBD_META_STRIPES: _LV_DEFAULTS[LDP_STRIPES], + DRBD_DISK_BARRIERS: _DRBD_DEFAULTS[LDP_BARRIERS], + DRBD_META_BARRIERS: _DRBD_DEFAULTS[LDP_NO_META_FLUSH], + DRBD_DEFAULT_METAVG: _DRBD_DEFAULTS[LDP_DEFAULT_METAVG], + DRBD_DISK_CUSTOM: _DRBD_DEFAULTS[LDP_DISK_CUSTOM], + DRBD_NET_CUSTOM: _DRBD_DEFAULTS[LDP_NET_CUSTOM], + DRBD_DYNAMIC_RESYNC: _DRBD_DEFAULTS[LDP_DYNAMIC_RESYNC], + DRBD_PLAN_AHEAD: _DRBD_DEFAULTS[LDP_PLAN_AHEAD], + DRBD_FILL_TARGET: _DRBD_DEFAULTS[LDP_FILL_TARGET], + DRBD_DELAY_TARGET: _DRBD_DEFAULTS[LDP_DELAY_TARGET], + DRBD_MAX_RATE: _DRBD_DEFAULTS[LDP_MAX_RATE], + DRBD_MIN_RATE: _DRBD_DEFAULTS[LDP_MIN_RATE], + }, + DT_DISKLESS: { + }, + DT_FILE: { + }, + DT_SHARED_FILE: { + }, + DT_BLOCK: { + }, + DT_RBD: { + RBD_POOL: DISK_LD_DEFAULTS[LD_RBD][LDP_POOL] + }, } +# we don't want to export the shortcuts +del _LV_DEFAULTS, _DRBD_DEFAULTS + NICC_DEFAULTS = { NIC_MODE: NIC_MODE_BRIDGED, NIC_LINK: DEFAULT_BRIDGE, } +# All of the following values are quite arbitrarily - there are no +# "good" defaults, these must be customised per-site +IPOLICY_DEFAULTS = { + ISPECS_MIN: { + ISPEC_MEM_SIZE: 128, + ISPEC_CPU_COUNT: 1, + ISPEC_DISK_COUNT: 1, + ISPEC_DISK_SIZE: 1024, + ISPEC_NIC_COUNT: 1, + }, + ISPECS_MAX: { + ISPEC_MEM_SIZE: 32768, + ISPEC_CPU_COUNT: 8, + ISPEC_DISK_COUNT: MAX_DISKS, + ISPEC_DISK_SIZE: 1024 * 1024, + ISPEC_NIC_COUNT: MAX_NICS, + }, + ISPECS_STD: { + ISPEC_MEM_SIZE: 128, + ISPEC_CPU_COUNT: 1, + ISPEC_DISK_COUNT: 1, + ISPEC_DISK_SIZE: 1024, + ISPEC_NIC_COUNT: 1, + }, + IPOLICY_DTS: DISK_TEMPLATES, + IPOLICY_VCPU_RATIO: 4.0, + IPOLICY_SPINDLE_RATIO: 32.0, + } + MASTER_POOL_SIZE_DEFAULT = 10 CONFD_PROTOCOL_VERSION = 1 @@ -1525,7 +2047,18 @@ VALID_ALLOC_POLICIES = [ # Temporary external/shared storage parameters BLOCKDEV_DRIVER_MANUAL = "manual" +# qemu-img path, required for ovfconverter +QEMUIMG_PATH = _autoconf.QEMUIMG_PATH + # Whether htools was enabled at compilation time HTOOLS = _autoconf.HTOOLS # The hail iallocator IALLOC_HAIL = "hail" + +# Fake opcodes for functions that have hooks attached to them via +# backend.RunLocalHooks +FAKE_OP_MASTER_TURNUP = "OP_CLUSTER_IP_TURNUP" +FAKE_OP_MASTER_TURNDOWN = "OP_CLUSTER_IP_TURNDOWN" + +# Do not re-export imported modules +del re, _vcsversion, _autoconf