参考:

https://docs.openstack.org/ironic/latest/contributor/states.html

https://docs.openstack.org/ironic/latest/contributor/states.html

enroll-manageable

ironic/api/controllers/v1/node.py
class NodeStatesController(rest.RestController):
def provision(self, node_ident, target, configdrive=None,
clean_steps=None, rescue_password=None):
......
elif target in PROVISION_ACTION_STATES:
pecan.request.rpcapi.do_provisioning_action(
pecan.request.context, rpc_node.uuid, target, topic) ironic/conductor/manager.py
class ConductorManager(base_manager.BaseConductorManager):
......
#RPC方法启动某些供应状态转换。通过状态机启动配置状态更改.
def do_provisioning_action(self, context, node_id, action):
......
#如果action等于manager且provision状态为enroll,则执行验证节点
if (action == states.VERBS['manage'] and
node.provision_state == states.ENROLL):
task.process_event(
'manage',
callback=self._spawn_worker,
call_args=(self._do_node_verify, task),
err_handler=utils.provisioning_error_handler)
return #执行电源凭证验证的内部方法
def _do_node_verify(self, task):
......
else:
try:
power_state = task.driver.power.get_power_state(task) ironic/drivers/modules/ipmitool.py
class IPMIPower(base.PowerInterface):
##获取任务节点的当前电源状态
def get_power_state(self, task):
driver_info = _parse_driver_info(task.node)#获取ipmitool访问节点所需的参数
return _power_status(driver_info) def _parse_driver_info(node):
......#返回IPMI参数,当节点有了关于driver和相关认证等信息后,就可以通过manage请求,将状态转变为manageable状态
return {
'address': address,
'dest_port': dest_port,
'username': username,
'password': password,
'port': port,
'uuid': node.uuid,
'priv_level': priv_level,
'local_address': local_address,
'transit_channel': transit_channel,
'transit_address': transit_address,
'target_channel': target_channel,
'target_address': target_address,
'protocol_version': protocol_version,
'force_boot_device': force_boot_device,
}

manageable-adopt

ironic/conductor/manager.py
class ConductorManager(base_manager.BaseConductorManager):
def do_provisioning_action(self, context, node_id, action):
#如果action等于adopt且provision状态为MANAGEABLE,则执行验证节点
if (action == states.VERBS['adopt'] and
node.provision_state in (states.MANAGEABLE,
states.ADOPTFAIL)):
task.process_event(
'adopt',
callback=self._spawn_worker,
call_args=(self._do_adoption, task),
err_handler=utils.provisioning_error_handler)
return
#采用执行驱动程序引导验证,然后触发节点接管,这个方法的目标是为节点设置条件在没有执行的情况下,作为一个活动节点来管理部署操作
这种转换允许这些节点直接从可管理节点移动到活动节点
def _do_adoption(self, task):
try:
iwdi = images.is_whole_disk_image(task.context,
task.node.instance_info)
driver_internal_info = node.driver_internal_info
driver_internal_info['is_whole_disk_image'] = iwdi
node.driver_internal_info = driver_internal_info
task.driver.boot.validate(task)
self._do_takeover(task)
LOG.info("Successfully adopted node %(node)s",
{'node': node.uuid})
task.process_event('done')

manageable-clean

ironic/conductor/manager.py
class ConductorManager(base_manager.BaseConductorManager):
def do_provisioning_action(self, context, node_id, action):
......
##如果action等于provide且provision状态为MANAGEABLE,则执行节点清理操作
if (action == states.VERBS['provide'] and
node.provision_state == states.MANAGEABLE):
task.process_event(
'provide',
callback=self._spawn_worker,
call_args=(self._do_node_clean, task),
err_handler=utils.provisioning_error_handler)
return
#内部RPC方法来执行节点的清理
def _do_node_clean(self, task, clean_steps=None):
#判断是否自动清理还是自定义清理
clean_type = 'manual' if manual_clean else 'automated'
#如果是自动清理关闭则直接不清理变为AVAILABLE状态
if not manual_clean and not CONF.conductor.automated_clean:
# Skip cleaning, move to AVAILABLE.
node.clean_step = None
node.save()
task.process_event('done') try:
#否则需要有效的电源和网络值来执行清理
task.driver.power.validate(task)
task.driver.network.validate(task)
try:
#允许部署驱动程序再次设置ramdisk执行带内清理
prepare_result = task.driver.deploy.prepare_cleaning(task)
if prepare_result == states.CLEANWAIT:
target_state = states.MANAGEABLE if manual_clean else None
task.process_event('wait', target_state=target_state)
return
try:
#
utils.set_node_cleaning_steps(task)
except (exception.InvalidParameterValue,
exception.NodeCleaningFailure) as e:
msg = (_('Cannot clean node %(node)s. Error: %(msg)s')
% {'node': node.uuid, 'msg': e})
#判断states的状态返回对应的结果
return utils.cleaning_error_handler(task, msg)
steps = node.driver_internal_info.get('clean_steps', [])
step_index = 0 if steps else None
self._do_next_clean_step(task, step_index)

ironic baremetal node status的更多相关文章

  1. ironic baremetal node rescue/unrescue mode

    环境ironic-api ironic-conductor,ironicclient均升级为Queens版本 官网说明API版本为1.38才支持rescue/unrescue,所以修改下openrc文 ...

  2. ironic baremetal rescue process

    1.用户调用Nova的rescue函数 nova/virt/ironic/driver.py class IronicDriver(virt_driver.ComputeDriver): ...... ...

  3. Ironic , Openstack Baremetal Hypervisor

    Ironic , Openstack Baremetal Hypervisor,首发于UnitedStack Inc.. 转自: http://ju.outofmemory.cn/entry/4876 ...

  4. 理解裸机部署过程ironic

    部署物理机跟部署虚拟机的概念在nova来看是一样,都是nova通过创建虚拟机的方式来触发,只是底层nova-scheduler和nova-compute的驱动不一样.虚拟机的底层驱动采用的libvir ...

  5. ironic的自动化脚本

    # -*- coding:utf-8 -*- import json import subprocess import os import time import random trunk_start ...

  6. 注册 Ironic 裸金属节点并部署裸金属实例

    目录 文章目录 目录 前文列表 注册(Enrollment)裸机 创建裸金属实例的 Flavor 部署裸金属实例 日志分析 问题:Failed to create neutron ports for ...

  7. 手动集成 Ironic 裸金属管理服务(Rocky)

    目录 文章目录 目录 前文列表 横向扩展裸金属管理服务节点 配置基础设施 安装 Ironic(BareMetal) 安装 Nova Compute(BareMetal) 配置 Neutron 提供 P ...

  8. Ironic 裸金属实例的部署流程

    目录 文章目录 目录 逻辑架构 部署架构 前提条件 部署流程 iSCSI Deploy UML PXE Deploy Driver Direct Deploy UML IPA Deploy Drive ...

  9. Ironic 裸金属管理服务

    目录 文章目录 目录 Ironic 软件架构设计 资源模型设计 全生命周期的状态机设计 Inspection 裸金属上架自检阶段 Provision 裸金属部署阶段 Clean 裸金属回收阶段 快速体 ...

随机推荐

  1. node.js 练习2 (调用函数)

    1. 调用本地 函数 (1)  创建 n2-1.js ,并输入代码 (2) 运行localhhost:8000 (3)在浏览器中 查看 (4)在cmd中查看 2.调用外部 函数 (1) 创建n2-2. ...

  2. Git版本控制的原理

    Git工作区域 工作目录(Working Directory) 暂存区(Stage/Index) 资源库(Repository或Git Directory) 远程的git仓库(Remote Direc ...

  3. mac系统的几种u盘启动制作方式

    先拿一个U盘,格式化好(guid分区表之类的选项弄好) 1.通过终端制作: 1>下载好自己要安装的系统镜像,最新的在App Store上下,以前的可以去pc 苹果等地方下载 2>在终端输入 ...

  4. Java对象容器总结

    泛型容器类 容器类型: ArrayList 元素类型: 有排序 String:里面存放的是对象的管理者,而不是具体的对象,所以string类型有null值 集合容器 容器类型 Set 元素类型 唯一性 ...

  5. mysql的jdbc.url携带allowMultiQueries=true参数的作用及其原理

    如下配置 jdbc.url=jdbc:mysql://127.0.0.1:3306/chubb_2?autoReconnect=true&useUnicode=true&charact ...

  6. ethereum(以太坊)(九)--global(全局函数)

    pragma solidity ^0.4.0; contract modifierTest{ bytes32 public blockhash; address public coinbase; ui ...

  7. eclipse引入jquery文件报错解决

    以下内容是小编给大家带来的关于Eclipse引入jquery报错如何解决的全部叙述,具体内容如下所示: 第一步: 去除eclipse的JS验证: 将windows->preference-> ...

  8. Linux基本的指令操作

    绝对路径: 路径的写法,由根目录/写起,例如:/usr/share/doc这个目录. 相对路径: 路径的写法,不由/写起,例如由/usr/share/doc要到/usr/share/man底下时,可以 ...

  9. Python全栈day 04

    Python全栈day 04 一.解释器/编译器 补充:编译型语言和解释型语言? # 编译型:代码写完后,编译器将其变成成另外一个文件,然后交给计算机执行. c c++,c# ,java # 解释型: ...

  10. 牛客网暑期ACM多校训练营(第四场) F Beautiful Garden

    链接: https://www.nowcoder.com/acm/contest/142/F 题意: n x m的矩形,选个p x q的矩形去掉,两个矩形中⼼重合,去掉后的矩形上下左右对称 求(p, ...