defmodule ArcadiaCloud.Sync.LoadBalancersWorker do @moduledoc "Full sync of DO load balancers." use Oban.Worker, queue: :cloud_sync_full, max_attempts: 3 alias ArcadiaCloud.Cloud alias ArcadiaCloud.DigitalOcean.Client @kind "load_balancer" @provider "digitalocean" @impl Oban.Worker def perform(_job) do now = DateTime.utc_now() |> DateTime.truncate(:second) with {:ok, lbs} <- Client.list_load_balancers() do Enum.each(lbs, fn lb -> Cloud.upsert_resource(normalize(lb, now)) end) Cloud.mark_stale(@kind, now) :ok end end defp normalize(lb, now) do %{ provider: @provider, provider_id: lb["id"], kind: @kind, name: lb["name"], region: get_in(lb, ["region", "slug"]), status: lb["status"] || "active", size_slug: lb["size"] || lb["size_unit"], tags: lb["tag"] && [lb["tag"]] || [], attrs: %{ ip: lb["ip"], algorithm: lb["algorithm"], forwarding_rules: lb["forwarding_rules"], health_check: lb["health_check"], droplet_ids: lb["droplet_ids"], vpc_uuid: lb["vpc_uuid"], do_created_at: lb["created_at"] }, first_seen_at: now, last_seen_at: now } end end