build baremetal data model in watcher¶
https://blueprints.launchpad.net/watcher/+spec/build-baremetal-data-model-in-watcher
For a data center with large amount of VMs and physical hosts,the total power consumption is tremendous. When workload is not heavy, Watcher can be used to reduce power consumption by triggering a request to power off some idle hosts without VMs. And when the workload increases Watcher will trigger a “power on” request to fulfill the service requirements.
This “energy saving” goal can be fulfilled by adding four features in Watcher: 1) Build a new baremetal data model within current Watcher Cluster Data Model 2) Add new actions “power on” and “power off” in Watcher 3) Implement a new strategy based on ‘baremetal’ and ‘compute’ data models, which could trigger ‘compute’ and ‘baremetal’ actions. 4) Update the bare metal data model by ironic notifications
This spec implements the first feature: Build a new baremetal (ironic) data model independent from current Watcher Cluster Data Model.
Problem description¶
In the “power on” and “power off” actions, Watcher sends request to power on/off physical machines managed by nova using ironic (ironic calling IPMI tools). So watcher should know the hypervisor_id and node_uuid of the target host(s), as well as their mapping list. In this spec, we will build a baremetal data model in watcher to describe this mapping list between hypervisor_id and node_uuid
Let’s take an example, if we need to power off host 3 and 4 as shown in the following list. But watcher doesn’t know their node_uuid.
[root@host_192_51_151_2 ~(keystone_admin)]# nova hypervisor-list +—-+———————+——-+———+ | ID | Hypervisor hostname | State | Status | +—-+———————+——-+———+ | 3 | host_192_51_151_3 | up | enabled | | 4 | host_192_51_151_5 | up | enabled | | 5 | host_192_51_151_7 | up | enabled | | 7 | host_192_51_151_8 | up | enabled | | 9 | host_192_51_151_9 | up | enabled | | 11 | host_192_51_151_10 | up | enabled | +—-+———————+——-+———+
So we establish a mapping list between hypervisor_id and node_uuid. Just like the following: +—-+———————+————————————–+———+ | ID | Hypervisor hostname | node_uuid | Extra | +—-+———————+————————————–+———+ | 3 | host_192_51_151_3 | 4f37180e-c310-4327-a286-d5ab9ffc6497 | | | 4 | host_192_51_151_5 | 4f37180e-c310-4327-a286-d5ab9ffc6498 | | | 5 | host_192_51_151_7 | 4f37180e-c310-4327-a286-d5ab9ffc6499 | | | 7 | host_192_51_151_8 | 4f37180e-c310-4327-a286-d5ab9ffc6500 | | | 9 | host_192_51_151_9 | 4f37180e-c310-4327-a286-d5ab9ffc6501 | | | 11 | host_192_51_151_10 | 4f37180e-c310-4327-a286-d5ab9ffc6502 | | +—-+———————+————————————–+———+
The “Extra” field is served as an extensible field.
Above all, from a watcher user’s perspective, the whole procedure starts from getting compute.node.id by ‘nova hypervisor-list’, then create ironic node manually using ‘ironic node create’ as described in the proposed change part. In the second step, the ironic_node_id is generated and the correlation is built. Given all these id and correlation information, now we can create a “power on and off” audit in watcher to do the optimization.
Use Cases¶
As a developer, I want to have a new baremetal data model independant from compute CDM in watcher to get the mapping list between hypervisor_id and ironic node_uuid.
Proposed change¶
Add “compute.node.id” info into Ironic node “extra” field when create nodes or update nodes info. Just like the following two ways:
If we can not get compute.node.id before creating ironic node. 1) ironic node-create 2) nova hypervisor-list 3) ironic node-update
If we can get compute.node.id before creating ironic node. 1) nova hypervisor-list 2) ironic node-create
- ironic node-create [-c <chassis>]
-d <driver> [-i <key=value>] [-p <key=value>] [-e <key=value>] [-u <uuid>] [-n <name>] [–network-interface <network_interface>] [–resource-class <resource_class>]
- ironic node-create -d your_driver agent_ipmitool
-i ipmi_address=<ipmi_ip> -i ipmi_username=<ipmi_username> -i ipmi_password=<ipmi_password> -e compute_node=compute.node.id -u ironic_node_uuid
compute.node.id is the compute node ID saved in CCDM (Compute Cluster Data Model)
2) On watcher, build the Baremetal Cluster Data Model (BCDM) by periodically requesting Ironic service. The Baremetal Cluster Data Model structure is shown as followings
- {
“uuid”: “4f37180e-c310-4327-a286-d5ab9ffc6497”, “power_state”: “power on”, “maintenance”: false, “maintenance_reason”: null, “extra”: {“compute_node_id”: 1} }
Alternatives¶
None
Data model impact¶
None
REST API impact¶
None
Security impact¶
None
Notifications impact¶
Watcher consumes some Ironic notifications. We leave this for future work, which is described in the following bp: https://blueprints.launchpad.net/watcher/+spec/update-bare-metal-data-model-by-ironic-notifications
Other end user impact¶
Watcher may report a stale representation of the Ironic resources and to reduce this staleness, they can reduce the syncing interval in the configuration.
Performance Impact¶
None
Other deployer impact¶
None
Developer impact¶
None
Implementation¶
Assignee(s)¶
- Primary assignee:
<li-canwei2>
- Other contributors:
<alexchadin>,<yumeng-bao>
Work Items¶
Add baremetal data model.
Dependencies¶
None
Testing¶
Unit test on the Watcher Decision Engine. Tempest.
Documentation Impact¶
System Architecture doc will be updated, since model drivers accesses only nova and glance as of now.
References¶
None
History¶
Release Name |
Description |
---|---|
Pike |
Introduced |