参考:
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, }