defmodule ArcadiaCloud.Sync.FirewallsWorker do @moduledoc "Full sync of DO cloud firewalls." use Oban.Worker, queue: :cloud_sync_full, max_attempts: 3 alias ArcadiaCloud.Cloud alias ArcadiaCloud.DigitalOcean.Client @kind "firewall" @provider "digitalocean" @impl Oban.Worker def perform(_job) do now = DateTime.utc_now() |> DateTime.truncate(:second) with {:ok, firewalls} <- Client.list_firewalls() do Enum.each(firewalls, fn f -> Cloud.upsert_resource(normalize(f, now)) end) Cloud.mark_stale(@kind, now) :ok end end defp normalize(f, now) do %{ provider: @provider, provider_id: f["id"], kind: @kind, name: f["name"], region: nil, status: f["status"] || "succeeded", tags: f["tags"] || [], attrs: %{ inbound_rules: f["inbound_rules"], outbound_rules: f["outbound_rules"], droplet_ids: f["droplet_ids"], pending_changes: f["pending_changes"], do_created_at: f["created_at"] }, first_seen_at: now, last_seen_at: now } end end