声明:
本博客欢迎转载,但请保留原作者信息!
作者:姜飞
团队:华为杭州OpenStack团队
上文说到,nova boot在nova-compute的spawn操作,设置了ironic node的provision_state为ACTIVE,ironic-api接收到了provision_state的设置请求,然后返回202的异步请求,那我们下来看下ironic在做什么.
首先,设置ironic node的provision_stat为ACTIVE相当于发了一个POST请求:PUT /v1/nodes/(node_uuid)/states/provision。那根据openstack的wsgi的框架,注册了app为ironic.api.app.VersionSelectorApplication的类为ironic的消息处理接口,那PUT /v1/nodes/(node_uuid)/states/provision的消息处理就在ironic.api.controllers.v1.node.NodeStatesController的provision方法。
@wsme_pecan.wsexpose(None, types.uuid, wtypes.text, status_code=202)
def provision(self, node_uuid, target):
rpc_node = objects.Node.get_by_uuid(pecan.request.context, node_uuid)
topic = pecan.request.rpcapi.get_topic_for(rpc_node)
#进行状态判断,如果状态相同,则返回400,表示状态已经是目标状态了。
#如果状态在ACTIVE或者REBUILD 或者状态在删除状态,返回409,表示相冲突,#要么在部署,要么在删除
if target == rpc_node.provision_state:
msg = (_("Node %(node)s is already in the '%(state)s' state.") %
{'node': rpc_node['uuid'], 'state': target})
raise wsme.exc.ClientSideError(msg, status_code=400)
if target in (ir_states.ACTIVE, ir_states.REBUILD):
processing = rpc_node.target_provision_state is not None
elif target == ir_states.DELETED:
processing = (rpc_node.target_provision_state is not None and
rpc_node.provision_state != ir_states.DEPLOYWAIT)
else:
raise exception.InvalidStateRequested(state=target, node=node_uuid)
if processing:
msg