X-Git-Url: https://code.grnet.gr/git/ganeti-local/blobdiff_plain/b528a12d6082951245e9850f18b36a25e74c9d13..297b0cd3faa9e114c40079e3490eb95cf0ec9701:/lib/constants.py diff --git a/lib/constants.py b/lib/constants.py index a402427..a33186b 100644 --- a/lib/constants.py +++ b/lib/constants.py @@ -1,7 +1,7 @@ # # -# Copyright (C) 2006, 2007, 2008, 2009, 2010 Google Inc. +# Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011 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 @@ -26,7 +26,6 @@ import re from ganeti import _autoconf # various versions -PROTOCOL_VERSION = 40 RELEASE_VERSION = _autoconf.PACKAGE_VERSION OS_API_V10 = 10 OS_API_V15 = 15 @@ -84,6 +83,9 @@ CONFIG_MINOR = int(_autoconf.VERSION_MINOR) CONFIG_REVISION = 0 CONFIG_VERSION = BuildVersion(CONFIG_MAJOR, CONFIG_MINOR, CONFIG_REVISION) +#: RPC protocol version +PROTOCOL_VERSION = BuildVersion(CONFIG_MAJOR, CONFIG_MINOR, 0) + # user separation DAEMONS_GROUP = _autoconf.DAEMONS_GROUP ADMIN_GROUP = _autoconf.ADMIN_GROUP @@ -94,6 +96,7 @@ RAPI_GROUP = _autoconf.RAPI_GROUP CONFD_USER = _autoconf.CONFD_USER CONFD_GROUP = _autoconf.CONFD_GROUP NODED_USER = _autoconf.NODED_USER +NODED_GROUP = _autoconf.NODED_GROUP # Wipe @@ -118,6 +121,7 @@ CRYPTO_KEYS_DIR = RUN_GANETI_DIR + "/crypto" CRYPTO_KEYS_DIR_MODE = SECURE_DIR_MODE IMPORT_EXPORT_DIR = RUN_GANETI_DIR + "/import-export" IMPORT_EXPORT_DIR_MODE = 0755 +ADOPTABLE_BLOCKDEV_ROOT = "/dev/disk/" # 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 ] @@ -139,9 +143,12 @@ RAPI_USERS_FILE = DATA_DIR + "/rapi/users" QUEUE_DIR = DATA_DIR + "/queue" DAEMON_UTIL = _autoconf.PKGLIBDIR + "/daemon-util" SETUP_SSH = _autoconf.TOOLSDIR + "/setup-ssh" +KVM_IFUP = _autoconf.PKGLIBDIR + "/kvm-ifup" ETC_HOSTS = "/etc/hosts" DEFAULT_FILE_STORAGE_DIR = _autoconf.FILE_STORAGE_DIR +DEFAULT_SHARED_FILE_STORAGE_DIR = _autoconf.SHARED_FILE_STORAGE_DIR ENABLE_FILE_STORAGE = _autoconf.ENABLE_FILE_STORAGE +ENABLE_SHARED_FILE_STORAGE = _autoconf.ENABLE_SHARED_FILE_STORAGE SYSCONFDIR = _autoconf.SYSCONFDIR TOOLSDIR = _autoconf.TOOLSDIR CONF_DIR = SYSCONFDIR + "/ganeti" @@ -197,7 +204,7 @@ DEV_CONSOLE = "/dev/console" PROC_MOUNTS = "/proc/mounts" -# luxi related constants +# Local UniX Interface related constants LUXI_EOM = "\3" LUXI_VERSION = CONFIG_VERSION @@ -223,6 +230,18 @@ SOCAT_USE_ESCAPE = _autoconf.SOCAT_USE_ESCAPE SOCAT_USE_COMPRESS = _autoconf.SOCAT_USE_COMPRESS SOCAT_ESCAPE_CODE = "0x1d" +#: Console as SSH command +CONS_SSH = "ssh" + +#: Console as VNC server +CONS_VNC = "vnc" + +#: Display a message for console access +CONS_MESSAGE = "msg" + +#: All console types +CONS_ALL = frozenset([CONS_SSH, CONS_VNC, CONS_MESSAGE]) + # 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. @@ -345,24 +364,37 @@ DT_DISKLESS = "diskless" DT_PLAIN = "plain" DT_DRBD8 = "drbd" DT_FILE = "file" +DT_SHARED_FILE = "sharedfile" +DT_BLOCK = "blockdev" # the set of network-mirrored disk templates -DTS_NET_MIRROR = frozenset([DT_DRBD8]) +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]) # the set of non-lvm-based disk templates -DTS_NOT_LVM = frozenset([DT_DISKLESS, DT_FILE]) +DTS_NOT_LVM = frozenset([DT_DISKLESS, DT_FILE, DT_SHARED_FILE, DT_BLOCK]) # the set of disk templates which can be grown -DTS_GROWABLE = frozenset([DT_PLAIN, DT_DRBD8, DT_FILE]) +DTS_GROWABLE = frozenset([DT_PLAIN, DT_DRBD8, DT_FILE, DT_SHARED_FILE]) # the set of disk templates that allow adoption -DTS_MAY_ADOPT = frozenset([DT_PLAIN]) +DTS_MAY_ADOPT = frozenset([DT_PLAIN, DT_BLOCK]) + +# the set of disk templates that *must* use adoption +DTS_MUST_ADOPT = frozenset([DT_BLOCK]) + +# the set of disk templates that allow migrations +DTS_MIRRORED = frozenset.union(DTS_INT_MIRROR, DTS_EXT_MIRROR) + # logical disk types LD_LV = "lvm" LD_DRBD8 = "drbd8" LD_FILE = "file" -LDS_BLOCK = frozenset([LD_LV, LD_DRBD8]) +LD_BLOCKDEV = "blockdev" +LDS_BLOCK = frozenset([LD_LV, LD_DRBD8, LD_BLOCKDEV]) # drbd constants DRBD_HMAC_ALG = "md5" @@ -401,10 +433,18 @@ EXPORT_MODES = frozenset([ EXPORT_MODE_REMOTE, ]) -# lock recalculate mode +# Lock recalculate mode LOCKS_REPLACE = 'replace' LOCKS_APPEND = 'append' +# Lock timeout (sum) before we should go into blocking acquire (still +# can be reset by priority change); computed as max time (10 hours) +# before we should actually go into blocking acquire given that we +# start from default priority level; in seconds +LOCK_ATTEMPTS_TIMEOUT = 10 * 3600 / 20.0 +LOCK_ATTEMPTS_MAXWAIT = 15.0 +LOCK_ATTEMPTS_MINWAIT = 1.0 + # instance creation modes INSTANCE_CREATE = "create" INSTANCE_IMPORT = "import" @@ -422,13 +462,20 @@ RIE_HANDSHAKE = "Hi, I'm Ganeti" # Remote import/export certificate validity in seconds RIE_CERT_VALIDITY = 24 * 60 * 60 -# Remote import/export connect timeout for socat -RIE_CONNECT_TIMEOUT = 60 +# Overall timeout for establishing connection +RIE_CONNECT_TIMEOUT = 180 + +# Export only: how long to wait per connection attempt (seconds) +RIE_CONNECT_ATTEMPT_TIMEOUT = 20 + +# Export only: number of attempts to connect +RIE_CONNECT_RETRIES = 10 + #: Give child process up to 5 seconds to exit after sending a signal CHILD_LINGER_TIMEOUT = 5.0 -DISK_TEMPLATES = frozenset([DT_DISKLESS, DT_PLAIN, - DT_DRBD8, DT_FILE]) +DISK_TEMPLATES = frozenset([DT_DISKLESS, DT_PLAIN, DT_DRBD8, + DT_FILE, DT_SHARED_FILE, DT_BLOCK]) FILE_DRIVER = frozenset([FD_LOOP, FD_BLKTAP]) @@ -452,12 +499,17 @@ EXIT_NOTMASTER = 11 EXIT_NODESETUP_ERROR = 12 EXIT_CONFIRMATION = 13 # need user confirmation +#: Exit code for query operations with unknown fields +EXIT_UNKNOWN_FIELD = 14 + # tags TAG_CLUSTER = "cluster" +TAG_NODEGROUP = "nodegroup" TAG_NODE = "node" TAG_INSTANCE = "instance" VALID_TAG_TYPES = frozenset([ TAG_CLUSTER, + TAG_NODEGROUP, TAG_NODE, TAG_INSTANCE, ]) @@ -484,7 +536,12 @@ LVM_STRIPECOUNT = _autoconf.LVM_STRIPECOUNT DEFAULT_SHUTDOWN_TIMEOUT = 120 NODE_MAX_CLOCK_SKEW = 150 # Time for an intra-cluster disk transfer to wait for a connection -DISK_TRANSFER_CONNECT_TIMEOUT = 30 +DISK_TRANSFER_CONNECT_TIMEOUT = 60 +# Disk index separator +DISK_SEPARATOR = _autoconf.DISK_SEPARATOR + +#: Key for job IDs in opcode result +JOB_IDS_KEY = "jobs" # runparts results (RUNPARTS_SKIP, @@ -548,8 +605,11 @@ ENFORCEABLE_TYPES = frozenset([ # HV parameter names (global namespace) HV_BOOT_ORDER = "boot_order" HV_CDROM_IMAGE_PATH = "cdrom_image_path" +HV_KVM_CDROM2_IMAGE_PATH = "cdrom2_image_path" +HV_KVM_FLOPPY_IMAGE_PATH = "floppy_image_path" HV_NIC_TYPE = "nic_type" HV_DISK_TYPE = "disk_type" +HV_KVM_CDROM_DISK_TYPE = "cdrom_disk_type" HV_VNC_BIND_ADDRESS = "vnc_bind_address" HV_VNC_PASSWORD_FILE = "vnc_password_file" HV_VNC_TLS = "vnc_tls" @@ -585,9 +645,12 @@ HV_BLOCKDEV_PREFIX = "blockdev_prefix" HVS_PARAMETER_TYPES = { HV_BOOT_ORDER: VTYPE_STRING, + HV_KVM_FLOPPY_IMAGE_PATH: VTYPE_STRING, HV_CDROM_IMAGE_PATH: VTYPE_STRING, + HV_KVM_CDROM2_IMAGE_PATH: VTYPE_STRING, HV_NIC_TYPE: VTYPE_STRING, HV_DISK_TYPE: VTYPE_STRING, + HV_KVM_CDROM_DISK_TYPE: VTYPE_STRING, HV_VNC_PASSWORD_FILE: VTYPE_STRING, HV_VNC_BIND_ADDRESS: VTYPE_STRING, HV_VNC_TLS: VTYPE_BOOL, @@ -601,7 +664,7 @@ HVS_PARAMETER_TYPES = { HV_KERNEL_PATH: VTYPE_STRING, HV_KERNEL_ARGS: VTYPE_STRING, HV_INITRD_PATH: VTYPE_STRING, - HV_ROOT_PATH: VTYPE_STRING, + HV_ROOT_PATH: VTYPE_MAYBE_STRING, HV_SERIAL_CONSOLE: VTYPE_BOOL, HV_USB_MOUSE: VTYPE_STRING, HV_DEVICE_MODEL: VTYPE_STRING, @@ -624,7 +687,7 @@ HVS_PARAMETER_TYPES = { HVS_PARAMETERS = frozenset(HVS_PARAMETER_TYPES.keys()) -# BE parameter names +# Backend parameter names BE_MEMORY = "memory" BE_VCPUS = "vcpus" BE_AUTO_BALANCE = "auto_balance" @@ -659,6 +722,7 @@ OOB_COMMANDS = frozenset([OOB_POWER_ON, OOB_POWER_OFF, OOB_POWER_CYCLE, OOB_POWER_STATUS_POWERED = "powered" OOB_TIMEOUT = 60 # 60 seconds +OOB_POWER_DELAY = 2.0 # 2 seconds OOB_STATUS_OK = "OK" OOB_STATUS_WARNING = "WARNING" @@ -675,6 +739,7 @@ OOB_STATUSES = frozenset([ # Instance Parameters Profile PP_DEFAULT = "default" +# NIC_* constants are used inside the ganeti config NIC_MODE = "mode" NIC_LINK = "link" @@ -690,25 +755,27 @@ NICS_PARAMETER_TYPES = { NICS_PARAMETERS = frozenset(NICS_PARAMETER_TYPES.keys()) +# IDISK_* constants are used in opcodes, to create/change disks IDISK_SIZE = "size" IDISK_MODE = "mode" IDISK_ADOPT = "adopt" IDISK_VG = "vg" +IDISK_METAVG = "metavg" IDISK_PARAMS_TYPES = { IDISK_SIZE: VTYPE_SIZE, IDISK_MODE: VTYPE_STRING, IDISK_ADOPT: VTYPE_STRING, IDISK_VG: VTYPE_STRING, + IDISK_METAVG: VTYPE_STRING, } IDISK_PARAMS = frozenset(IDISK_PARAMS_TYPES.keys()) +# INIC_* constants are used in opcodes, to create/change nics INIC_MAC = "mac" INIC_IP = "ip" INIC_MODE = "mode" INIC_LINK = "link" -INIC_BRIDGE = "bridge" INIC_PARAMS_TYPES = { - INIC_BRIDGE: VTYPE_STRING, INIC_IP: VTYPE_MAYBE_STRING, INIC_LINK: VTYPE_STRING, INIC_MAC: VTYPE_STRING, @@ -749,7 +816,8 @@ HT_NIC_E1000 = "e1000" HT_NIC_PARAVIRTUAL = HT_DISK_PARAVIRTUAL = "paravirtual" HT_HVM_VALID_NIC_TYPES = frozenset([HT_NIC_RTL8139, HT_NIC_NE2K_PCI, - HT_NIC_NE2K_ISA, HT_NIC_PARAVIRTUAL]) + HT_NIC_E1000, HT_NIC_NE2K_ISA, + HT_NIC_PARAVIRTUAL]) 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, @@ -784,11 +852,13 @@ HT_MOUSE_TABLET = "tablet" HT_KVM_VALID_MOUSE_TYPES = frozenset([HT_MOUSE_MOUSE, HT_MOUSE_TABLET]) # Boot order +HT_BO_FLOPPY = "floppy" 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]) +HT_KVM_VALID_BO_TYPES = frozenset([HT_BO_FLOPPY, HT_BO_CDROM, + HT_BO_DISK, HT_BO_NETWORK]) # Security models HT_SM_NONE = "none" @@ -818,6 +888,7 @@ NV_DRBDLIST = "drbd-list" NV_FILELIST = "filelist" NV_HVINFO = "hvinfo" NV_HYPERVISOR = "hypervisor" +NV_HVPARAMS = "hvparms" NV_INSTANCELIST = "instancelist" NV_LVLIST = "lvlist" NV_MASTERIP = "master-ip" @@ -830,6 +901,40 @@ NV_TIME = "time" NV_VERSION = "version" NV_VGLIST = "vglist" NV_VMNODES = "vmnodes" +NV_OOB_PATHS = "oob-paths" +NV_BRIDGES = "bridges" + +# Instance status +INSTST_RUNNING = "running" +INSTST_ADMINDOWN = "ADMIN_down" +INSTST_NODEOFFLINE = "ERROR_nodeoffline" +INSTST_NODEDOWN = "ERROR_nodedown" +INSTST_WRONGNODE = "ERROR_wrongnode" +INSTST_ERRORUP = "ERROR_up" +INSTST_ERRORDOWN = "ERROR_down" +INSTST_ALL = frozenset([ + INSTST_RUNNING, + INSTST_ADMINDOWN, + INSTST_NODEOFFLINE, + INSTST_NODEDOWN, + INSTST_WRONGNODE, + INSTST_ERRORUP, + INSTST_ERRORDOWN, + ]) + +# Node roles +NR_REGULAR = "R" +NR_MASTER = "M" +NR_MCANDIDATE = "C" +NR_DRAINED = "D" +NR_OFFLINE = "O" +NR_ALL = frozenset([ + NR_REGULAR, + NR_MASTER, + NR_MCANDIDATE, + NR_DRAINED, + NR_OFFLINE, + ]) # SSL certificate check constants (in days) SSL_CERT_EXPIRATION_WARN = 30 @@ -846,13 +951,24 @@ VALID_IALLOCATOR_DIRECTIONS = frozenset([ IALLOCATOR_MODE_ALLOC = "allocate" IALLOCATOR_MODE_RELOC = "relocate" IALLOCATOR_MODE_MEVAC = "multi-evacuate" +IALLOCATOR_MODE_MRELOC = "multi-relocate" VALID_IALLOCATOR_MODES = frozenset([ IALLOCATOR_MODE_ALLOC, IALLOCATOR_MODE_RELOC, IALLOCATOR_MODE_MEVAC, + IALLOCATOR_MODE_MRELOC, ]) IALLOCATOR_SEARCH_PATH = _autoconf.IALLOCATOR_SEARCH_PATH +IALLOCATOR_MRELOC_ANY = "any_group" +IALLOCATOR_MRELOC_CHANGE = "change_group" +IALLOCATOR_MRELOC_KEEP = "keep_group" +IALLOCATOR_MRELOC_MODES = frozenset([ + IALLOCATOR_MRELOC_ANY, + IALLOCATOR_MRELOC_CHANGE, + IALLOCATOR_MRELOC_KEEP, + ]) + # Job queue JOB_QUEUE_VERSION = 1 JOB_QUEUE_LOCK_FILE = QUEUE_DIR + "/lock" @@ -945,14 +1061,21 @@ JQT_ALL = frozenset([ # Query resources QR_INSTANCE = "instance" QR_NODE = "node" +QR_LOCK = "lock" +QR_GROUP = "group" +QR_OS = "os" #: List of resources which can be queried using L{opcodes.OpQuery} -QR_OP_QUERY = frozenset([QR_INSTANCE, QR_NODE]) +QR_VIA_OP = frozenset([QR_INSTANCE, QR_NODE, QR_GROUP, QR_OS]) -#: List of resources which can be queried using LUXI -QR_OP_LUXI = QR_OP_QUERY.union([ +#: List of resources which can be queried using Local UniX Interface +QR_VIA_LUXI = QR_VIA_OP.union([ + QR_LOCK, ]) +#: List of resources which can be queried using RAPI +QR_VIA_RAPI = QR_VIA_LUXI + # Query field types QFT_UNKNOWN = "unknown" QFT_TEXT = "text" @@ -973,15 +1096,36 @@ QFT_ALL = frozenset([ QFT_OTHER, ]) -# Query result field status (don't change values as they're used by clients) +# Query result field status (don't change or reuse values as they're used by +# clients) #: Normal field status -QRFS_NORMAL = 0 +RS_NORMAL = 0 #: Unknown field -QRFS_UNKNOWN = 1 -#: No data (e.g. node offline) -QRFS_NODATA = 2 -#: Value unavailable for item -QRFS_UNAVAIL = 3 +RS_UNKNOWN = 1 +#: No data (e.g. RPC error), can be used instead of L{RS_OFFLINE} +RS_NODATA = 2 +#: Value unavailable/unsupported for item; if this field is supported +#: but we cannot get the data for the moment, RS_NODATA or +#: RS_OFFLINE should be used +RS_UNAVAIL = 3 +#: Resource marked offline +RS_OFFLINE = 4 + +RS_ALL = frozenset([ + RS_NORMAL, + RS_UNKNOWN, + RS_NODATA, + RS_UNAVAIL, + RS_OFFLINE, + ]) + +#: Dictionary with special field cases and their verbose/terse formatting +RSS_DESCRIPTION = { + RS_UNKNOWN: ("(unknown)", "??"), + RS_NODATA: ("(nodata)", "?"), + RS_OFFLINE: ("(offline)", "*"), + RS_UNAVAIL: ("(unavail)", "-"), + } # max dynamic devices MAX_NICS = 8 @@ -991,6 +1135,7 @@ MAX_DISKS = 16 SS_CLUSTER_NAME = "cluster_name" SS_CLUSTER_TAGS = "cluster_tags" SS_FILE_STORAGE_DIR = "file_storage_dir" +SS_SHARED_FILE_STORAGE_DIR = "shared_file_storage_dir" SS_MASTER_CANDIDATES = "master_candidates" SS_MASTER_CANDIDATES_IPS = "master_candidates_ips" SS_MASTER_IP = "master_ip" @@ -1053,10 +1198,13 @@ HVC_DEFAULTS = { HV_VNC_X509: '', HV_VNC_X509_VERIFY: False, HV_VNC_PASSWORD_FILE: '', + HV_KVM_FLOPPY_IMAGE_PATH: '', HV_CDROM_IMAGE_PATH: '', + HV_KVM_CDROM2_IMAGE_PATH: '', HV_BOOT_ORDER: HT_BO_DISK, HV_NIC_TYPE: HT_NIC_PARAVIRTUAL, HV_DISK_TYPE: HT_DISK_PARAVIRTUAL, + HV_KVM_CDROM_DISK_TYPE: '', HV_USB_MOUSE: '', HV_MIGRATION_PORT: 8102, HV_MIGRATION_BANDWIDTH: 32, # MiB/s @@ -1214,3 +1362,11 @@ VALID_ALLOC_POLICIES = [ ALLOC_POLICY_LAST_RESORT, ALLOC_POLICY_UNALLOCABLE, ] + +# Temporary external/shared storage parameters +BLOCKDEV_DRIVER_MANUAL = "manual" + +# Whether htools was enabled at compilation time +HTOOLS = _autoconf.HTOOLS +# The hail iallocator +IALLOC_HAIL = "hail"