【Nova】nova-compute代码学习2-状态机

2019-07-14 01:34发布

通过前一篇的学习加上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', }