Skip to content
Snippets Groups Projects

INFRA-10659: Implement self-healing mechanism for Netbox jobs

Merged INFRA-10659: Implement self-healing mechanism for Netbox jobs
1 unresolved thread
Merged Fahrudin Halilovic requested to merge feature/INFRA-10659-self-healing-mechanism into main
1 unresolved thread
2 files
+ 280
194
Compare changes
  • Side-by-side
  • Inline
Files
2
+ 151
0
import json
from rest_framework import serializers
from dcim.models import Device, DeviceRole, DeviceType, Interface, Site
from ipam.models import Prefix, IPAddress
from virtualization.models import VirtualMachine, VMInterface
from extras.models import Tag
from dcim.choices import DeviceStatusChoices
from virtualization.choices import VirtualMachineStatusChoices
group_prefixes = {
Site: "site_",
DeviceRole: "devicerole_",
DeviceType: "devicetype_",
Prefix: "prefix_",
Tag: "tag_"
}
class TagSerializer(serializers.BaseSerializer):
def to_representation(self, instance):
return {
"name": f"{group_prefixes[Tag]}{instance.slug.replace('-', '_')}",
"variables": json.dumps({"netbox_tag_name": instance.name}),
}
class SiteSerializer(serializers.BaseSerializer):
def to_representation(self, instance):
return {
"name": f"{group_prefixes[Site]}{instance.slug.replace('-', '_')}",
"variables": json.dumps(
{
"netbox_site_status": instance.status,
}
),
}
class DeviceRoleSerializer(serializers.BaseSerializer):
def to_representation(self, instance):
return {
"name": f"{group_prefixes[DeviceRole]}{instance.slug.replace('-', '_')}",
"variables": json.dumps({})
}
class DeviceTypeSerializer(serializers.BaseSerializer):
def to_representation(self, instance):
return {
"name": f"{group_prefixes[DeviceType]}{instance.slug.replace('-', '_')}",
"description": instance.description,
"variables": json.dumps(
{
"netbox_devicetype_model": instance.model,
}
),
}
class PrefixSerializer(serializers.BaseSerializer):
def to_representation(self, instance):
prefix_str = str(instance.prefix).replace(".", "_").replace("/", "_")
return {
"name": f"{group_prefixes[Prefix]}{prefix_str}",
"variables": json.dumps({"netbox_prefix": str(instance.prefix)}),
}
class InterfaceSerializer(serializers.BaseSerializer):
def to_representation(self, instance):
ip_addresses = []
for ip in instance.ip_addresses.all():
serializer = IPAddressSerializer(ip)
ip_addresses.append(serializer.data)
return {
"name": instance.name,
"mac": instance.mac_address,
"ip_addresses": ip_addresses
}
class IPAddressSerializer(serializers.BaseSerializer):
def to_representation(self, instance):
return {
"address": str(instance.address),
"dns_name": instance.dns_name
}
class DeviceSerializer(serializers.BaseSerializer):
def to_representation(self, instance):
variables = {}
variables["netbox_interfaces"] = []
for interface in instance.interfaces.all():
serializer = InterfaceSerializer(interface)
variables["netbox_interfaces"].append(serializer.data)
return {
"name": getattr(instance.primary_ip4, 'dns_name', instance.name),
"description": instance.description,
"enabled": instance.status == DeviceStatusChoices.STATUS_ACTIVE,
"variables": json.dumps(variables),
}
class VMInterfaceSerializer(serializers.BaseSerializer):
def to_representation(self, instance):
ip_addresses = []
for ip in instance.ip_addresses.all():
serializer = IPAddressSerializer(ip)
ip_addresses.append(serializer.data)
return {
"name": instance.name,
"mac": instance.mac_address,
"ip_addresses": ip_addresses
}
class VMSerializer(serializers.BaseSerializer):
def to_representation(self, instance):
variables = {
"netbox_virtualmachine_name": instance.name,
"netbox_virtualmachine_vcpus": float(instance.vcpus) if instance.vcpus is not None else 0.0,
"netbox_virtualmachine_memory": instance.memory or 0,
"netbox_virtualmachine_disk": instance.disk or 0,
}
variables["netbox_interfaces"] = []
for interface in instance.interfaces.all():
serializer = VMInterfaceSerializer(interface)
variables["netbox_interfaces"].append(serializer.data)
return {
"name": getattr(instance.primary_ip4, 'dns_name', instance.name),
"description": instance.description,
"enabled": instance.status == VirtualMachineStatusChoices.STATUS_ACTIVE,
"variables": json.dumps(variables),
}
class AWXHostSerializer(serializers.BaseSerializer):
def to_internal_value(self, data):
return {
"name": data.get('name'),
"description": data.get('description'),
"enabled": data.get('enabled'),
"variables": data.get('variables')
}
class AWXGroupSerializer(serializers.BaseSerializer):
def to_internal_value(self, data):
return {
"name": data.get('name'),
"variables": data.get('variables')
}
serializers_dict = {
Site: SiteSerializer,
DeviceRole: DeviceRoleSerializer,
DeviceType: DeviceTypeSerializer,
Prefix: PrefixSerializer,
Device: DeviceSerializer,
VirtualMachine: VMSerializer,
Tag: TagSerializer
}
Loading