two ways to hold the states of a job in ironic

本文详细介绍了在Horizon中通过模板语言实现链接跳转至新页面的技术,并探讨了如何利用Ironic的异步特性处理耗时任务,特别关注于vendor_passthru方法的异步返回实现及场景应用。

具体说之前,先说一下如何在horizon中做点击link跳转至别的页面,

对于Django来说这是一个很简单的问题,有用shortcuts.redirct的,也可以在url配置之后使用一个function,在function中return HttpResponseRedirect的,总之是可以办到的,

但是在horion中,要是表格中的某一项是一个link,点击后跳转到新的页面怎么办呢。

我用上面的两种方法尝试都不能得出结论,最后发现点击创建好的instance中flavor属性(最新的horizon版本)时,会弹出一个小的template页面,里面记录flavor的信息,

既然有template网页也就可以做个href的mark,于是:

模仿instance页面即可,

{% load i18n %}
<a href="{{link}}" target="_blank"  id="datum_{{ id }}" class="link-popover" rel="popover" tabindex="0" data-trigger="focus" data-content="
Clink to Jump
" data-original-title="{% blocktrans %}Jump: {{ ipaddress }}">{{ ipaddress }}{% endblocktrans %}</a>
<script type="text/javascript" charset="utf-8">
$(function () {
  var $page= $("#datum_{{ id }}");
  if ( $page.popover ) {
    $page.popover({html:true});
  }
});
</script>


有一个ironic的使用场景,horizon上点击后发送一个vendor_passthru的任务,但是这个任务十分耗时,可能需要几十分钟才能完成,然而界面上又需要立即返回,

很显然我们需要使用thread,如果是自己写一个thread,在请求返回之后主进程没了,thread也没了,不可,可以依赖ironic自己的thread pool。

J版的ironic中vendor_passthru方法不支持异步,直接根据driver或者node解析出要执行的vendor方法,然后调用返回,

K版的ironicvendor_passthru方法支持异步(async),可以定义一个异步的方法,这样界面可以做出相应,同时后台会在thread pool中添加一个线程继续运行。

对driver_vendor_passthru:

        if is_async:
            self._spawn_worker(vendor_func, context, **info)

        if self._worker_pool.free():
            return self._worker_pool.spawn(func, *args, **kwargs)


如果一个任务和conductor有关,甚至不和特定的driver相关,比如ironic的power state 是period task,这个时候,J版的ironic就没有办法了,虽然它有一部分poriod的

code,不过应该是个过渡状态,比起K版差很多,K版的使用可以做到:

1. 在conductor manager中实现自己的period_task(J版可以做到这一点)

2.在自己的driver中实现driver自己的driver_period_task

用起来方便很多。


现在我希望实现vendor_passthru的异步返回,在J版中,除了update之外,使用conductor manager的period_task外,貌似没有更好的方法。

<think>嗯,用户遇到了一个问题,说无法从聚合体5中移除主机control02-ironic。我需要先弄清楚这个错误的具体原因,然后给出解决方案。首先,我应该回忆一下OpenStack中聚合体(aggregate)和主机(host)的关系。聚合体是用来将一组计算节点分组,方便管理资源或者设置特定的调度策略。用户可能是在尝试使用命令比如`openstack aggregate remove host`时遇到了错误,比如提示主机不存在或者权限问题。 接下来,我应该考虑可能的错误原因。首先,用户可能输入的主机名有误,或者该主机确实不在指定的聚合体中。这时候需要检查聚合体的当前主机列表,确认control02-ironic是否真的存在于聚合体5中。如果存在,可能是其他问题,比如主机名拼写错误,或者主机已经被删除但聚合体中仍有残留信息。 另外,权限问题也可能导致无法移除主机。用户可能没有足够的权限执行该操作,需要检查用户的角色和权限,确保他们有权限修改聚合体。此外,OpenStack的API或服务可能出现问题,比如Nova服务异常,导致无法正确处理请求。 然后,我需要思考如何解决这个问题。首先,用户应该确认聚合体5的主机列表,使用`openstack aggregate show 5`来查看当前包含的主机。如果主机确实存在,尝试用正确的命令移除。如果主机名有误,需要修正。如果主机已经被删除,可能需要手动从数据库中清理,但这需要谨慎操作,避免影响其他数据。 如果权限不足,用户需要以管理员身份执行命令,或者联系管理员调整权限。如果是服务问题,比如Nova服务异常,需要检查Nova服务的状态和日志,确认是否有错误信息,然后重启服务或处理相关问题。 另外,如果常规方法无效,可能需要直接操作数据库,删除聚合体中的主机记录。比如连接到Nova数据库,执行SQL语句删除对应的记录。但这一步需要非常小心,确保备份数据,并且了解数据库结构,避免误操作。 用户可能需要逐步排查,从确认主机是否存在,到检查权限,再到服务状态和日志,最后考虑数据库操作。同时,提醒用户在进行数据库操作前备份,避免数据丢失。 总结下来,解决步骤可能是:检查聚合体中的主机列表,确认主机存在;使用正确命令移除;检查权限;处理服务异常;必要时手动清理数据库。需要一步步引导用户进行故障排除,并给出具体的命令示例,方便用户操作。</think>遇到无法从聚合体(Aggregate)中移除主机的问题,通常是由于主机不存在于该聚合体、权限不足或残留数据导致。以下是解决方案: --- ### **1. 确认主机是否在聚合体中** 首先检查聚合体 `5` 的成员列表,确认 `control02-ironic` 是否已加入该聚合体: ```bash # 查看聚合体详细信息(ID=5) openstack aggregate show 5 ``` 输出中会列出当前聚合体的所有主机(`hosts` 字段)。如果 `control02-ironic` 不在列表中,说明问题可能是命令输入错误或数据残留。 --- ### **2. 正确移除主机的命令** 若主机确实存在于聚合体,使用以下命令移除: ```bash # 语法:openstack aggregate remove host <aggregate-id> <hostname> openstack aggregate remove host 5 control02-ironic ``` --- ### **3. 常见错误原因及解决** #### **情况 1:主机名输入错误** - **现象**:主机名拼写错误(如 `control02-ironic` vs `control02_ironic`)。 - **解决**:核对主机名,确保与计算节点注册的名称一致: ```bash openstack host list ``` #### **情况 2:权限不足** - **现象**:用户角色无权操作聚合体。 - **解决**:使用管理员账户执行命令,或联系管理员授权: ```bash # 使用管理员环境变量(需提前加载) source admin-openrc.sh openstack aggregate remove host 5 control02-ironic ``` #### **情况 3:残留数据** - **现象**:主机已从数据库删除,但聚合体中仍有记录。 - **解决**:直接操作数据库清理(**谨慎!需备份**): ```bash # 连接到 Nova 数据库 mysql -u root -p -D nova # 查询聚合体中的主机记录 SELECT * FROM aggregate_hosts WHERE aggregate_id=5 AND host='control02-ironic'; # 删除残留记录 DELETE FROM aggregate_hosts WHERE aggregate_id=5 AND host='control02-ironic'; ``` --- ### **4. 验证操作结果** 移除后再次检查聚合体状态: ```bash openstack aggregate show 5 ``` 若 `hosts` 字段中已无目标主机,则操作成功。 --- ### **关键检查点** 1. **主机状态** 确保 `control02-ironic` 仍是一个有效的计算节点(未被删除): ```bash openstack compute service list --host control02-ironic ``` 2. **日志排查** 查看 Nova API 日志,定位具体错误: ```bash tail -f /var/log/nova/nova-api.log ``` 3. **网络连通性** 确保执行命令的节点能正常访问 OpenStack API 和数据库服务。 --- ### **补充说明** - **聚合体(Aggregate)的作用** 聚合体用于将多个计算节点分组,通常配合主机组(Host Aggregate)或可用区(Availability Zone)实现资源隔离或调度策略。 - **预防措施** 操作前使用 `--dry-run` 参数(若支持)验证命令,避免直接修改生产环境数据。 根据上述步骤排查,通常可解决因数据不一致或权限导致的移除失败问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值