348 lines
11 KiB
Python
348 lines
11 KiB
Python
#!/usr/bin/python
|
|
# -*- coding: utf-8 -*-
|
|
|
|
# (c) 2015-2016, Hewlett Packard Enterprise Development Company LP
|
|
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
|
|
|
|
DOCUMENTATION = '''
|
|
---
|
|
module: baremetal_inspect
|
|
short_description: Explicitly triggers baremetal node introspection in ironic.
|
|
author: OpenStack Ansible SIG
|
|
description:
|
|
- Requests Ironic to set a node into inspect state in order to collect
|
|
metadata regarding the node. This command may be out of band or in-band
|
|
depending on the ironic driver configuration. This is only possible on
|
|
nodes in 'manageable' and 'available' state.
|
|
options:
|
|
mac:
|
|
description:
|
|
- unique mac address that is used to attempt to identify the host.
|
|
type: str
|
|
name:
|
|
description:
|
|
- Name or id of the node to inspect.
|
|
- Mutually exclusive with I(mac)
|
|
type: str
|
|
aliases: [id, uuid]
|
|
|
|
requirements:
|
|
- "python >= 3.6"
|
|
- "openstacksdk"
|
|
|
|
extends_documentation_fragment:
|
|
- openstack.cloud.openstack
|
|
'''
|
|
|
|
RETURN = '''
|
|
node:
|
|
description: A dictionary describing the node after inspection
|
|
returned: changed
|
|
type: dict
|
|
contains:
|
|
allocation_id:
|
|
description: The UUID of the allocation associated with the node.
|
|
type: str
|
|
bios_interface:
|
|
description: The bios interface to be used for this node.
|
|
type: str
|
|
boot_interface:
|
|
description: The boot interface for a Node, e.g. "pxe".
|
|
type: str
|
|
boot_mode:
|
|
description: The current boot mode state (uefi/bios).
|
|
type: str
|
|
chassis_id:
|
|
description: UUID of the chassis associated with this Node.
|
|
type: str
|
|
clean_step:
|
|
description: |
|
|
The current clean step. Introduced with the cleaning feature.
|
|
type: str
|
|
conductor:
|
|
description: The conductor currently servicing a node.
|
|
type: str
|
|
conductor_group:
|
|
description: The conductor group for a node.
|
|
type: str
|
|
console_interface:
|
|
description: Console interface to use when working with serial console.
|
|
type: str
|
|
sample: no-console
|
|
created_at:
|
|
description: Timestamp at which the node was last updated.
|
|
type: str
|
|
deploy_interface:
|
|
description: The deploy interface for a node
|
|
type: str
|
|
sample: iscsi
|
|
deploy_step:
|
|
description: The current deploy step.
|
|
type: str
|
|
driver:
|
|
description: The name of the driver.
|
|
type: str
|
|
driver_info:
|
|
description: |
|
|
All the metadata required by the driver to manage this Node. List
|
|
of fields varies between drivers.
|
|
type: dict
|
|
driver_internal_info:
|
|
description: Internal metadata set and stored by the Node's driver.
|
|
type: dict
|
|
extra:
|
|
description: A set of one or more arbitrary metadata key and value pairs.
|
|
type: dict
|
|
fault:
|
|
description: |
|
|
The fault indicates the active fault detected by ironic, typically the
|
|
Node is in "maintenance mode". None means no fault has been detected by
|
|
ironic. "power failure" indicates ironic failed to retrieve power state
|
|
from this node. There are other possible types, e.g., "clean failure"
|
|
and "rescue abort failure".
|
|
type: str
|
|
id:
|
|
description: The UUID for the resource.
|
|
type: str
|
|
inspect_interface:
|
|
description: The interface used for node inspection.
|
|
type: str
|
|
sample: no-inspect
|
|
instance_id:
|
|
description: UUID of the Nova instance associated with this Node.
|
|
type: str
|
|
instance_info:
|
|
description: |
|
|
Information used to customize the deployed image. May include root
|
|
partition size, a base 64 encoded config drive, and other metadata.
|
|
Note that this field is erased automatically when the instance is
|
|
deleted (this is done by requesting the Node provision state be changed
|
|
to DELETED).
|
|
type: dict
|
|
is_automated_clean_enabled:
|
|
description: Override enabling of automated cleaning.
|
|
type: bool
|
|
is_console_enabled:
|
|
description: |
|
|
Indicates whether console access is enabled or disabled on this node.
|
|
type: bool
|
|
is_maintenance:
|
|
description: |
|
|
Whether or not this Node is currently in "maintenance mode". Setting
|
|
a Node into maintenance mode removes it from the available resource
|
|
pool and halts some internal automation. This can happen manually (eg,
|
|
via an API request) or automatically when Ironic detects a hardware
|
|
fault that prevents communication with the machine.
|
|
type: bool
|
|
is_protected:
|
|
description: |
|
|
Whether the node is protected from undeploying, rebuilding and
|
|
deletion.
|
|
type: bool
|
|
is_retired:
|
|
description: Whether the node is marked for retirement.
|
|
type: bool
|
|
is_secure_boot:
|
|
description: |
|
|
Whether the node is currently booted with secure boot turned on.
|
|
type: bool
|
|
last_error:
|
|
description: |
|
|
Any error from the most recent (last) transaction that started but
|
|
failed to finish.
|
|
type: str
|
|
links:
|
|
description: |
|
|
A list of relative links. Includes the self and bookmark links.
|
|
type: list
|
|
maintenance_reason:
|
|
description: |
|
|
User-settable description of the reason why this Node was placed into
|
|
maintenance mode.
|
|
type: str
|
|
management_interface:
|
|
description: Interface for out-of-band node management.
|
|
type: str
|
|
sample: ipmitool
|
|
name:
|
|
description: |
|
|
Human-readable identifier for the Node resource. Certain words are
|
|
reserved.
|
|
type: str
|
|
network_interface:
|
|
description: |
|
|
Which Network Interface provider to use when plumbing the network
|
|
connections for this Node.
|
|
type: str
|
|
owner:
|
|
description: A string or UUID of the tenant who owns the object.
|
|
type: str
|
|
port_groups:
|
|
description: Links to the collection of portgroups on this node.
|
|
type: list
|
|
ports:
|
|
description: Links to the collection of ports on this node
|
|
type: list
|
|
power_interface:
|
|
description: Interface used for performing power actions on the node.
|
|
type: str
|
|
sample: ipmitool
|
|
power_state:
|
|
description: |
|
|
The current power state of this Node. Usually, "power on" or "power
|
|
off", but may be "None" if Ironic is unable to determine the power
|
|
state (eg, due to hardware failure).
|
|
type: str
|
|
properties:
|
|
description: Properties of the node as found by inspection
|
|
type: dict
|
|
contains:
|
|
memory_mb:
|
|
description: Amount of node memory as updated in the node properties
|
|
type: str
|
|
sample: "1024"
|
|
cpu_arch:
|
|
description: Detected CPU architecture type
|
|
type: str
|
|
sample: "x86_64"
|
|
local_gb:
|
|
description: |
|
|
Total size of local disk storage as updated in node properties.
|
|
type: str
|
|
sample: "10"
|
|
cpus:
|
|
description: |
|
|
Count of cpu cores defined in the updated node properties.
|
|
type: str
|
|
sample: "1"
|
|
protected_reason:
|
|
description: The reason the node is marked as protected.
|
|
type: str
|
|
provision_state:
|
|
description: The current provisioning state of this Node.
|
|
type: str
|
|
raid_config:
|
|
description: |
|
|
Represents the current RAID configuration of the node. Introduced with
|
|
the cleaning feature.
|
|
type: dict
|
|
raid_interface:
|
|
description: Interface used for configuring RAID on this node.
|
|
type: str
|
|
sample: no-raid
|
|
rescue_interface:
|
|
description: The interface used for node rescue.
|
|
type: str
|
|
sample: no-rescue
|
|
reservation:
|
|
description: |
|
|
The name of an Ironic Conductor host which is holding a lock on this
|
|
node, if a lock is held. Usually "null", but this field can be useful
|
|
for debugging.
|
|
type: str
|
|
resource_class:
|
|
description: |
|
|
A string which can be used by external schedulers to identify this
|
|
Node as a unit of a specific type of resource.
|
|
type: str
|
|
retired_reason:
|
|
description: TODO
|
|
type: str
|
|
states:
|
|
description: |
|
|
Links to the collection of states. Note that this resource is also
|
|
used to request state transitions.
|
|
type: list
|
|
storage_interface:
|
|
description: |
|
|
Interface used for attaching and detaching volumes on this node, e.g.
|
|
"cinder".
|
|
type: str
|
|
target_power_state:
|
|
description: |
|
|
If a power state transition has been requested, this field represents
|
|
the requested (ie, "target") state, either "power on" or "power off".
|
|
type: str
|
|
target_provision_state:
|
|
description: |
|
|
If a provisioning action has been requested, this field represents
|
|
the requested (ie, "target") state. Note that a Node may go through
|
|
several states during its transition to this target state. For
|
|
instance, when requesting an instance be deployed to an AVAILABLE
|
|
Node, the Node may go through the following state change progression:
|
|
AVAILABLE -> DEPLOYING -> DEPLOYWAIT -> DEPLOYING -> ACTIVE.
|
|
type: str
|
|
target_raid_config:
|
|
description: |
|
|
Represents the requested RAID configuration of the node, which will
|
|
be applied when the Node next transitions through the CLEANING state.
|
|
Introduced with the cleaning feature.
|
|
type: dict
|
|
traits:
|
|
description: List of traits for this node.
|
|
type: list
|
|
updated_at:
|
|
description: TODO
|
|
type: str
|
|
vendor_interface:
|
|
description: |
|
|
Interface for vendor-specific functionality on this node, e.g.
|
|
"no-vendor".
|
|
type: str
|
|
'''
|
|
|
|
EXAMPLES = '''
|
|
# Invoke node inspection
|
|
- openstack.cloud.baremetal_inspect:
|
|
name: "testnode1"
|
|
'''
|
|
|
|
from ansible_collections.openstack.cloud.plugins.module_utils.openstack import (
|
|
OpenStackModule
|
|
)
|
|
|
|
|
|
class BaremetalInspectModule(OpenStackModule):
|
|
argument_spec = dict(
|
|
name=dict(aliases=['uuid', 'id']),
|
|
mac=dict(),
|
|
)
|
|
|
|
module_kwargs = dict(
|
|
mutually_exclusive=[
|
|
('name', 'mac'),
|
|
],
|
|
required_one_of=[
|
|
('name', 'mac'),
|
|
],
|
|
)
|
|
|
|
def run(self):
|
|
node_name_or_id = self.params['name']
|
|
node = None
|
|
if node_name_or_id is not None:
|
|
node = self.conn.baremetal.find_node(node_name_or_id)
|
|
else:
|
|
node = self.conn.get_machine_by_mac(self.params['mac'])
|
|
|
|
if node is None:
|
|
self.fail_json(msg="node not found.")
|
|
|
|
node = self.conn.inspect_machine(node['id'],
|
|
wait=self.params['wait'],
|
|
timeout=self.params['timeout'])
|
|
node = node.to_dict(computed=False)
|
|
# TODO(TheJulia): diff properties, ?and ports? and determine
|
|
# if a change occurred. In theory, the node is always changed
|
|
# if introspection is able to update the record.
|
|
self.exit_json(changed=True, node=node)
|
|
|
|
|
|
def main():
|
|
module = BaremetalInspectModule()
|
|
module()
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|