defmodule ArcadiaCloud.Sync.VolumesWorker do @moduledoc "Full sync of DO block-storage volumes." use Oban.Worker, queue: :cloud_sync_full, max_attempts: 3 alias ArcadiaCloud.Cloud alias ArcadiaCloud.DigitalOcean.Client @kind "volume" @provider "digitalocean" @impl Oban.Worker def perform(_job) do now = DateTime.utc_now() |> DateTime.truncate(:second) with {:ok, volumes} <- Client.list_volumes() do Enum.each(volumes, fn v -> Cloud.upsert_resource(normalize(v, now)) end) Cloud.mark_stale(@kind, now) :ok end end defp normalize(v, now) do %{ provider: @provider, provider_id: v["id"], kind: @kind, name: v["name"], region: get_in(v, ["region", "slug"]), status: if(v["status"], do: v["status"], else: "active"), tags: v["tags"] || [], attrs: %{ size_gigabytes: v["size_gigabytes"], filesystem_type: v["filesystem_type"], droplet_ids: v["droplet_ids"], description: v["description"], do_created_at: v["created_at"] }, first_seen_at: now, last_seen_at: now } end end