defmodule ArcadiaCloud.Sync.FloatingIpsWorker do @moduledoc "Full sync of DO floating IPs." use Oban.Worker, queue: :cloud_sync_full, max_attempts: 3 alias ArcadiaCloud.Cloud alias ArcadiaCloud.DigitalOcean.Client @kind "floating_ip" @provider "digitalocean" @impl Oban.Worker def perform(_job) do now = DateTime.utc_now() |> DateTime.truncate(:second) with {:ok, ips} <- Client.list_floating_ips() do Enum.each(ips, fn ip -> Cloud.upsert_resource(normalize(ip, now)) end) Cloud.mark_stale(@kind, now) :ok end end defp normalize(ip, now) do %{ provider: @provider, provider_id: ip["ip"], kind: @kind, name: ip["ip"], region: get_in(ip, ["region", "slug"]), status: if(ip["droplet"], do: "assigned", else: "unassigned"), tags: [], attrs: %{ ip: ip["ip"], droplet_id: get_in(ip, ["droplet", "id"]), droplet_name: get_in(ip, ["droplet", "name"]), locked: ip["locked"] }, first_seen_at: now, last_seen_at: now } end end