通过前一篇的学习加上Horizon的使用,我们可以了解到OpenStack为每个虚拟机实例维护了3个状态,一个实例状态vm_state,一个任务状态task_state,一个电源状态power_state,那么这一篇我们先学习下nova-compute的状态机,这对我们之后学习虚拟机各种操作对应的流程大有裨益。
我们需要明确以下几点:
1.电源状态power_state是实例在hypervisor上的状态,只能由nova-compute进行汇报
2.实例状态vm_state是基于API调用的稳定状态,符合用户预期;在没有API调用涉及到实例时,它的vm_state不应该发生变化,且vm_state只在任务结束时才被修改;如果任务失败或不能回滚,vm_state会被置为ERROR
3.任务状态task_state是为了流程化API调用引入的暂态,任务结束时task_state会被置为None
4.只要数据库可用,那么就能对实例进行硬删除;
5.电源状态和实例状态有可能发生冲突,譬如实例状态为ACTIVE但是电源状态却是SHUTDOWN
详细的实例状态转换关系请参见 实例状态转换
# ------------------------------------------------------------------------------------
# 实例状态 vm_state
# ------------------------------------------------------------------------------------
ACTIVE = 'active' # 实例正在运行
BUILDING = 'building' # 实例只存在数据库中
PAUSED = 'paused' # 实例被暂停
SUSPENDED = 'suspended' # 实例被挂起到磁盘中
STOPPED = 'stopped' # 实例停止运行, 类比关机
RESCUED = 'rescued' # 实例处于救援模式中
RESIZED = 'resized' # 实例被resize成功了并处于ACTIVE状态
SOFT_DELETED = 'soft-delete' # 实例被软删除了, 但是磁盘文件依旧保存着, 因此可以进行恢复
DELETED = 'deleted' # 实例被永久删除了
ERROR = 'error' # 实例处于预期之外的错误状态
SHELVED = 'shelved' # 实例被搁置, 但是资源依旧在hypervisor上
SHELVED_OFFLOADED = 'shelved_offloaded' # 实例被搁置, 并且相关资源被从hypervisor上删除
ALLOW_SOFT_REBOOT = [ACTIVE] # 允许进行软重启的状态, 只有处于ACTIVE的实例才运行进行软重启
ALLOW_HARD_REBOOT = ALLOW_SOFT_REBOOT + [STOPPED, PAUSED, SUSPENDED, ERROR]
# 允许进行硬重启的状态
# ------------------------------------------------------------------------------------
# 任务状态 task_state
# ------------------------------------------------------------------------------------
# 在创建实例的过程中可能出现的任务状态
SCHEDULING = 'scheduling' # 实例正在被调度
BLOCK_DEVICE_MAPPING = 'block_device_mapping' # 实例正在进行块设备映射
NETWORKING = 'networking' # 实例正在分配网络资源
SPAWNING = 'spawning' # 正在为创建实例缓存镜像
# 在创建快照的过程中可能出现的任务状态
IMAGE_SNAPSHOT = 'image_snapshot'
IMAGE_SNAPSHOT_PENDING = 'image_snapshot_pending'
IMAGE_PENDING_UPLOAD = 'image_pending_upload'
IMAGE_UPLOADING = 'image_uploading'
# 在镜像备份的过程中可能出现的任务状态, 为什么没有ing呢?
IMAGE_BACKUP = 'image_backup'
# 在设置管理员密码的过程中可能出现的任务状态
UPDATING_PASSWORD = 'updating_password'
# 在resize的过程中可能出现的任务状态
RESIZE_PREP = 'resize_prep'
RESIZE_MIGRATING = 'resize_migrating'
RESIZE_MIGRATED = 'resize_migrated'
RESIZE_FINISH = 'resize_finish'
# 在revert_resize的过程中可能出现的任务状态
RESIZE_REVERTING = 'resize_reverting'
# 在confirm_resize的过程中可能出现的任务状态, 我们对实例进行resize后可能需要进行确认工作,
# 当我们取消时, 就会进行revert_resize进行恢复
RESIZE_CONFIRMING = 'resize_confirming'
# 在重启实例的过程中可能出现的任务状态
REBOOTING = 'rebooting'
REBOOT_PENDING = 'reboot_pending'
REBOOT_STARTED = 'reboot_started'
REBOOTING_HARD = 'rebooting_hard'
REBOOT_PENDING_HARD = 'reboot_pending_hard'
REBOOT_STARTED_HARD = 'reboot_started_hard'
# 在暂停实例的过程中可能出现的任务状态
PAUSING = 'pausing'
# 在unpause实例的过程中可能出现的任务状态
UNPAUSING = 'unpausing'
# 在挂起实例的过程中可能出现的任务状态
SUSPENDING = 'suspending'
# 在恢复实例的过程中可能出现的任务状态
RESUMING = 'resuming'
# 在关机实例的过程中可能出现的任务状态
POWERING_OFF = 'powering-off'
# 在开机实例的过程中可能出现的任务状态
POWERING_ON = 'powering-on'
# 在rescue实例的过程中可能出现的任务状态
RESCUING = 'rescuing'
# 在unrescue实例的过程中可能出现的任务状态
UNRESCUING = 'unrescuing'
# 在重建实例的过程中可能出现的任务状态
REBUILDING = 'rebuilding'
REBUILD_BLOCK_DEVICE_MAPPING = "rebuild_block_device_mapping"
REBUILD_SPAWNING = 'rebuild_spawning'
# 在热迁移实例的过程中可能出现的任务状态
MIGRATING = "migrating"
# 在硬删除实例的过程中可能出现的任务状态
DELETING = 'deleting'
# 在软删除实例的过程中可能出现的任务状态
SOFT_DELETING = 'soft-deleting'
# 在restore实例的过程中可能出现的任务状态
RESTORING = 'restoring'
# 在shelve实例的过程中可能出现的任务状态
SHELVING = 'shelving'
SHELVING_IMAGE_PENDING_UPLOAD = 'shelving_image_pending_upload'
SHELVING_IMAGE_UPLOADING = 'shelving_image_uploading'
# 在shelve_offload实例的过程中可能出现的任务状态
SHELVING_OFFLOADING = 'shelving_offloading'
# 在unshelve实例的过程中可能出现的任务状态
UNSHELVING = 'unshelving'
# ------------------------------------------------------------------------------------
# 电源状态 power_state
# ------------------------------------------------------------------------------------
NOSTATE = 0x00
RUNNING = 0x01 # 虚拟机正在运行
PAUSED = 0x03 # 虚拟机被暂停
SHUTDOWN = 0x04 # 虚拟机被关机
CRASHED = 0x06 # 虚拟机崩溃
SUSPENDED = 0x07 # 虚拟机被挂起
# 只在bare metal虚拟化中使用
BUILDING = 0x09
# 电源状态映射关系
STATE_MAP = {
NOSTATE: 'pending',
RUNNING: 'running',
PAUSED: 'paused',
SHUTDOWN: 'shutdown',
CRASHED: 'crashed',
SUSPENDED: 'suspended',
BUILDING: 'building',
}