diff --git a/lib/towerops/snmp.ex b/lib/towerops/snmp.ex index 401e0c74..c7ab33d8 100644 --- a/lib/towerops/snmp.ex +++ b/lib/towerops/snmp.ex @@ -1570,6 +1570,8 @@ defmodule Towerops.Snmp do def upsert_mac_address(attrs) do import Ecto.Query + require Logger + # Build query to find existing MAC address entry query = from m in MacAddress, @@ -1583,16 +1585,36 @@ defmodule Towerops.Snmp do vlan_id -> where(query, [m], m.vlan_id == ^vlan_id) end - case Repo.one(query) do - nil -> + # Use Repo.all to handle potential duplicates gracefully + # If duplicates exist, keep the first one and delete the rest + case Repo.all(query) do + [] -> %MacAddress{} |> MacAddress.changeset(attrs) |> Repo.insert() - mac_address -> + [mac_address] -> mac_address |> MacAddress.changeset(attrs) |> Repo.update() + + [first | duplicates] -> + # Handle duplicates: delete extras, update first + Logger.warning("Found #{length(duplicates)} duplicate MAC address entries, cleaning up", + device_id: attrs.device_id, + mac_address: attrs.mac_address, + vlan_id: attrs[:vlan_id], + duplicate_ids: Enum.map(duplicates, & &1.id) + ) + + # Delete duplicate entries + duplicate_ids = Enum.map(duplicates, & &1.id) + Repo.delete_all(from m in MacAddress, where: m.id in ^duplicate_ids) + + # Update the remaining entry + first + |> MacAddress.changeset(attrs) + |> Repo.update() end end