Skip to content

Instantly share code, notes, and snippets.

@cidrblock
Last active June 15, 2022 13:47
Show Gist options
  • Save cidrblock/0a5902d53b161f515cc72d1e08769738 to your computer and use it in GitHub Desktop.
Save cidrblock/0a5902d53b161f515cc72d1e08769738 to your computer and use it in GitHub Desktop.
# roles/template_test/filter_plugins/eth_builder.py
# -*- coding: utf-8 -*-
# Copyright 2020 Red Hat
# GNU General Public License v3.0+
# (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
"""
sample use of dataclass in filter plugin
"""
from __future__ import absolute_import, division, print_function
from dataclasses import dataclass, asdict, field
__metaclass__ = type
from typing import List
from ansible.errors import AnsibleFilterError
@dataclass
class BaseInterface:
name: str
description: str = "default description"
type: str = "switched"
shutdown: bool = False
spanning_tree_portfast: str = "edge"
@property
def number(self):
return int(self.name.replace("Ethernet", ""))
def to_keyed_dict(self):
details = asdict(self)
details['number'] = self.number
return {details.pop("name"): details}
@dataclass
class Interface(BaseInterface):
native_vlan: int = 100
mode: str = "trunk"
trunk_groups: List = field(default_factory=lambda: ['SERVER'])
def _eth_builder(data):
result = {}
for interface in data["interfaces"]:
if interface['type'] != "25GBASE_SFP28":
continue
obj_interface = Interface(name=interface['name'])
result.update(obj_interface.to_keyed_dict())
return result
class FilterModule(object):
def filters(self):
return {"eth_builder": _eth_builder}
# roles/template_test/tasks/main.yaml
- name: Transform the data
set_fact:
result: "{{ data|eth_builder }}"
vars:
model: DCS-7050SX3-48YC8
vars_file: "./vars/model_details/{{ model }}.yml"
model_ethernet_interfaces: "{{ lookup('ansible.builtin.file', vars_file) | from_yaml }}"
data:
interfaces: "{{ model_ethernet_interfaces['ethernet_interfaces'] }}"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment