python 带有 rhev 4.1 的 ovirtsdk

python ovirtsdk with rhev 4.1

我正在尝试使用 RHEV 4.1 API 通过 python 获取我的管理程序的主机状态。 RHEV 3.6 正在使用我的脚本。但如果我使用以下内容。

host = api.hosts.get(host_name)
host_state = host.status      //RHEV 3.6 this was host.state.status
print(host_state)

它给出以下内容

<ovirtsdk.xml.params.Status object at 0x3ce0f10>
dev-dbe101t                <ovirtsdk.xml.params.Status object at    0x3ce0f10>
dev-be101t-data1          None                   master
dev-be101t-data2          None

我可以正确获取主机名和数据中心名称。 即使这个 Status 对象也是不可迭代的。根据 rhvm 3.6 和 rhev 4.1 api 的区别。

在 API 的第 4 版中,此 Status 类型已被删除并替换为枚举类型。 (我上面的代码适用于 rhev 3.6,它给出了主机的正确状态)

如何检索主机状态?我发现 host.status 类型是 class 然后我使用 dir(theobject) 打印出所有相关的 class 方法并发现了以下有用的方法。州,get_state, 但它给出了 none。但是我的 api 状态是 up

根据 api 指南。

status 是 HostStatus ENUM 的类型

HOSTSTATUS ENUM 包含一个名为 "up"

的名称

不确定如何从 api 中获取 host.status。 API returns 这个

<host>
<status>up</status>
</host>

您在这里混合了两个 API。正如您正确写的那样,oVirt 有两个版本 API v3 和 v4。 Python 默认情况下,SDK v3 与 v3 API 一起使用,因此您应该像以前一样将其与 oVirt 4.1/RHV 4.1 一起使用。

如果您使用 API v3 列出主机状态:

GET https://fqdn/ovirt-engine/api/v3/hosts

您将获得:

<status><state>up</state></status>

因此您应该能够获取 state Python SDK v3 作为:

host = api.hosts.get(host_name) host_state = host.status.state print(host_state)

在 APIv4 中你会得到:

GET https://ondra.local:8443/ovirt-engine/api/v4/hosts

<status>up</status>

但这不相关,因为您仍在使用 Python SDK v3,它使用 APIv3。