Dre4m Shell
Server IP : 85.214.239.14  /  Your IP : 3.23.92.50
Web Server : Apache/2.4.62 (Debian)
System : Linux h2886529.stratoserver.net 4.9.0 #1 SMP Tue Jan 9 19:45:01 MSK 2024 x86_64
User : www-data ( 33)
PHP Version : 7.4.18
Disable Function : pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare,
MySQL : OFF  |  cURL : OFF  |  WGET : ON  |  Perl : ON  |  Python : ON  |  Sudo : ON  |  Pkexec : OFF
Directory :  /lib/python3/dist-packages/ansible_collections/openstack/cloud/plugins/modules/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ HOME SHELL ]     

Current File : /lib/python3/dist-packages/ansible_collections/openstack/cloud/plugins/modules/baremetal_port.py
#!/usr/bin/python
# coding: utf-8 -*-
# Copyright (c) 2021 by Red Hat, Inc.
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)

DOCUMENTATION = '''
module: baremetal_port
short_description: Create/Delete Bare Metal port Resources from OpenStack
author: OpenStack Ansible SIG
description:
    - Create, Update and Remove ironic ports from OpenStack.
options:
    state:
      description:
        - Indicates desired state of the resource
      choices: ['present', 'absent']
      default: present
      type: str
    uuid:
      description:
        - globally unique identifier (UUID) to be given to the resource. Will
          be auto-generated if not specified.
      type: str
    node:
      description:
        - UUID or Name of the Node this resource belongs to.
      type: str
    address:
      description:
        - Physical hardware address of this network Port, typically the
          hardware MAC address.
      type: str
    portgroup:
      description:
        - UUID or Name of the Portgroup this resource belongs to.
      type: str
    local_link_connection:
      description:
        - The Port binding profile.
      type: dict
      suboptions:
        switch_id:
          description:
            - A MAC address or an OpenFlow based datapath_id of the switch.
          type: str
        port_id:
          description:
            - Identifier of the physical port on the switch to which node's
              port is connected to.
          type: str
        switch_info:
          description:
            - An optional string field to be used to store any vendor-specific
              information.
          type: str
    is_pxe_enabled:
      description:
        - Whether PXE should be enabled or disabled on the Port.
      type: bool
    physical_network:
      description:
        - The name of the physical network to which a port is connected.
      type: str
    extra:
      description:
        - A set of one or more arbitrary metadata key and value pairs.
      type: dict
    ironic_url:
      description:
        - If noauth mode is utilized, this is required to be set to the
          endpoint URL for the Ironic API.  Use with "auth" and "auth_type"
          settings set to None.
      type: str

requirements:
    - "python >= 3.6"
    - "openstacksdk"
extends_documentation_fragment:
- openstack.cloud.openstack
'''

EXAMPLES = '''
# Create Bare Metal port
- name: Create Bare Metal port
  openstack.cloud.baremetal_port:
    cloud: devstack
    state: present
    node: bm-0
    address: fa:16:3e:aa:aa:aa
    pxe_enabled: True
    local_link_connection:
      switch_id: 0a:1b:2c:3d:4e:5f
      port_id: Ethernet3/1
      switch_info: switch1
    extra:
      something: extra
    physical_network: datacenter
  register: result
# Delete Bare Metal port
- name: Delete Bare Metal port
  openstack.cloud.baremetal_port:
    cloud: devstack
    state: absent
    address: fa:16:3e:aa:aa:aa
  register: result
# Update Bare Metal port
- name: Update Bare Metal port
  openstack.cloud.baremetal_port:
    cloud: devstack
    state: present
    uuid: 1a85ebca-22bf-42eb-ad9e-f640789b8098
    pxe_enabled: False
    local_link_connection:
      switch_id: a0:b1:c2:d3:e4:f5
      port_id: Ethernet4/12
      switch_info: switch2
'''

RETURN = '''
id:
    description: Unique UUID of the port.
    returned: always, but can be null
    type: str
result:
    description: A short text describing the result.
    returned: success
    type: str
changes:
    description: Map showing from -> to values for properties that was changed
                 after port update.
    returned: success
    type: dict
port:
    description: A port dictionary, subset of the dictionary keys listed below
                 may be returned, depending on your cloud provider.
    returned: success
    type: complex
    contains:
        address:
            description: Physical hardware address of this network Port,
                         typically the hardware MAC address.
            returned: success
            type: str
        created_at:
            description: Bare Metal port created at timestamp.
            returned: success
            type: str
        extra:
            description: A set of one or more arbitrary metadata key and value
                         pairs.
            returned: success
            type: dict
        id:
            description: The UUID for the Baremetal Port resource.
            returned: success
            type: str
        internal_info:
            description: Internal metadata set and stored by the Port. This
                         field is read-only.
            returned: success
            type: dict
        is_pxe_enabled:
            description: Whether PXE is enabled or disabled on the Port.
            returned: success
            type: bool
        local_link_connection:
            description: The Port binding profile. If specified, must contain
                         switch_id (only a MAC address or an OpenFlow based
                         datapath_id of the switch are accepted in this field
                         and port_id (identifier of the physical port on the
                         switch to which node's port is connected to) fields.
                         switch_info is an optional string field to be used to
                         store any vendor-specific information.
            returned: success
            type: dict
        location:
            description: Cloud location of this resource (cloud, project,
                         region, zone)
            returned: success
            type: dict
        name:
            description: Bare Metal port name.
            returned: success
            type: str
        node_id:
            description: UUID of the Bare Metal Node this resource belongs to.
            returned: success
            type: str
        physical_network:
            description: The name of the physical network to which a port is
                         connected.
            returned: success
            type: str
        port_group_id:
            description: UUID  of the Portgroup this resource belongs to.
            returned: success
            type: str
        updated_at:
            description: Bare Metal port updated at timestamp.
            returned: success
            type: str
'''

from ansible_collections.openstack.cloud.plugins.module_utils.ironic import (
    IronicModule,
    ironic_argument_spec,
)
from ansible_collections.openstack.cloud.plugins.module_utils.openstack import (
    openstack_module_kwargs,
    openstack_cloud_from_module
)

_PROP_TO_ATTR_MAP = {
    'pxe_enabled': 'is_pxe_enabled',
    'address': 'address',
    'extra': 'extra',
    'local_link_connection': 'local_link_connection',
    'physical_network': 'physical_network',
    'node_uuid': 'node_id',
    'portgroup_uuid': 'port_group_id',
    'uuid': 'id',
}


def find_port(module, cloud):
    port = None
    if module.params['uuid']:
        port = cloud.baremetal.find_port(module.params['uuid'])
    elif module.params['address']:
        ports = list(cloud.baremetal.ports(address=module.params['address'],
                                           details=True))
        if ports and len(ports) == 1:
            port = ports[0]
        elif len(ports) > 1:
            module.fail_json(
                msg="Multiple ports with address {address} found. A uuid must "
                    "be defined in order to identify the correct port"
                    .format(address=module.params['address']))

    return port


def add_port(module, cloud):
    port = find_port(module, cloud)
    if port:
        update_port(module, cloud, port=port)

    if not module.params['node'] or not module.params['address']:
        module.fail_json(
            msg="A Bare Metal node (name or uuid) and an address is required "
                "to create a port")

    machine = cloud.get_machine(module.params['node'])
    if not machine:
        module.fail_json(
            msg="Bare Metal node {node} could not be found".format(
                node=module.params['node']))

    module.params['node_uuid'] = machine.id
    props = {k: module.params[k] for k in _PROP_TO_ATTR_MAP.keys()
             if k in module.params}
    port = cloud.baremetal.create_port(**props)
    port_dict = port.to_dict()
    port_dict.pop('links', None)
    module.exit_json(
        changed=True,
        result="Port successfully created",
        changes=None,
        port=port_dict,
        id=port_dict['id'])


def update_port(module, cloud, port=None):
    if not port:
        port = find_port(module, cloud)

    if module.params['node']:
        machine = cloud.get_machine(module.params['node'])
        if machine:
            module.params['node_uuid'] = machine.id

    old_props = {k: port[v] for k, v in _PROP_TO_ATTR_MAP.items()}
    new_props = {k: module.params[k] for k in _PROP_TO_ATTR_MAP.keys()
                 if k in module.params and module.params[k] is not None}
    prop_diff = {k: new_props[k] for k in _PROP_TO_ATTR_MAP.keys()
                 if k in new_props and old_props[k] != new_props[k]}

    if not prop_diff:
        port_dict = port.to_dict()
        port_dict.pop('links', None)
        module.exit_json(
            changed=False,
            result="No port update required",
            changes=None,
            port=port_dict,
            id=port_dict['id'])

    port = cloud.baremetal.update_port(port.id, **prop_diff)
    port_dict = port.to_dict()
    port_dict.pop('links', None)
    module.exit_json(
        changed=True,
        result="Port successfully updated",
        changes={k: {'to': new_props[k], 'from': old_props[k]}
                 for k in prop_diff},
        port=port_dict,
        id=port_dict['id'])


def remove_port(module, cloud):
    if not module.params['uuid'] and not module.params['address']:
        module.fail_json(
            msg="A uuid or an address value must be defined in order to "
                "remove a port.")
    if module.params['uuid']:
        port = cloud.baremetal.delete_port(module.params['uuid'])
        if not port:
            module.exit_json(
                changed=False,
                result="Port not found",
                changes=None,
                id=module.params['uuid'])
    else:
        port = find_port(module, cloud)
        if not port:
            module.exit_json(
                changed=False,
                result="Port not found",
                changes=None,
                id=None)
        port = cloud.baremetal.delete_port(port.id)

    module.exit_json(
        changed=True,
        result="Port successfully removed",
        changes=None,
        id=port.id)


def main():
    argument_spec = ironic_argument_spec(
        uuid=dict(required=False),
        node=dict(required=False),
        address=dict(required=False),
        portgroup=dict(required=False),
        local_link_connection=dict(required=False, type='dict'),
        is_pxe_enabled=dict(required=False, type='bool'),
        physical_network=dict(required=False),
        extra=dict(required=False, type='dict'),
        state=dict(required=False,
                   default='present',
                   choices=['present', 'absent'])
    )

    module_kwargs = openstack_module_kwargs()
    module = IronicModule(argument_spec, **module_kwargs)

    module.params['pxe_enabled'] = module.params.pop('is_pxe_enabled', None)

    sdk, cloud = openstack_cloud_from_module(module)
    try:
        if module.params['state'] == 'present':
            add_port(module, cloud)

        if module.params['state'] == 'absent':
            remove_port(module, cloud)

    except sdk.exceptions.OpenStackCloudException as e:
        module.fail_json(msg=str(e))


if __name__ == "__main__":
    main()

Anon7 - 2022
AnonSec Team