From 564cb68071b65e175debe1c94a97d345bc54549a Mon Sep 17 00:00:00 2001 From: Daniel Spofford <868014+danielspofford@users.noreply.github.com> Date: Sun, 1 Sep 2024 11:53:35 -0600 Subject: [PATCH] handle nil release version data --- lib/peridiod/release.ex | 75 +++++++++++++++++++++++++++------- lib/peridiod/release/server.ex | 28 +++++++++++-- mix.lock | 2 +- 3 files changed, 86 insertions(+), 19 deletions(-) diff --git a/lib/peridiod/release.ex b/lib/peridiod/release.ex index aa73086..6ff1374 100644 --- a/lib/peridiod/release.ex +++ b/lib/peridiod/release.ex @@ -26,10 +26,22 @@ defmodule Peridiod.Release do defimpl Jason.Encoder, for: Release do def encode(%Release{} = release_metadata, opts) do + version = + case release_metadata.version do + nil -> nil + version -> Version.to_string(version) + end + + version_requirement = + case release_metadata.version_requirement do + nil -> nil + version_requirement -> version_requirement.source + end + release_metadata |> Map.take([:prn, :name, :version_requirement, :bundle_prn]) - |> Map.put(:version, Version.to_string(release_metadata.version)) - |> Map.put(:version_requirement, release_metadata.version_requirement.source) + |> Map.put(:version, version) + |> Map.put(:version_requirement, version_requirement) |> Jason.Encode.map(opts) end end @@ -69,16 +81,22 @@ defmodule Peridiod.Release do end def metadata_from_map(release_metadata) do + version = + case release_metadata["version"] do + nil -> nil + version -> Version.parse!(version) + end + version_requirement = - case Version.parse_requirement(release_metadata["version_requirement"]) do - {:ok, version_requirement} -> version_requirement - _ -> "" + case release_metadata["version_requirement"] do + nil -> nil + version_requirement -> Version.parse_requirement!(version_requirement) end %__MODULE__{ prn: release_metadata["prn"], name: release_metadata["name"], - version: Version.parse!(release_metadata["version"]), + version: version, version_requirement: version_requirement, bundle_prn: release_metadata["bundle_prn"] } @@ -93,12 +111,24 @@ defmodule Peridiod.Release do "manifest" => binaries, "bundle" => bundle }) do + version = + case release_metadata["version"] do + nil -> nil + version -> Version.parse!(version) + end + + version_requirement = + case release_metadata["version_requirement"] do + nil -> nil + version_requirement -> Version.parse_requirement!(version_requirement) + end + {:ok, %__MODULE__{ prn: release_metadata["prn"], name: release_metadata["name"], - version: Version.parse!(release_metadata["version"]), - version_requirement: Version.parse_requirement!(release_metadata["version_requirement"]), + version: version, + version_requirement: version_requirement, bundle_prn: bundle["prn"], binaries: Enum.map(binaries, &Binary.metadata_from_manifest/1) }} @@ -160,27 +190,44 @@ defmodule Peridiod.Release do Enum.filter(binaries, &(&1.target in [nil, "" | targets])) end - def kv_progress(kv_pid \\ KV, %__MODULE__{} = release_metadata) do + def kv_progress(kv_pid \\ KV, %__MODULE__{prn: prn} = release_metadata) when not is_nil(prn) do + version = + case release_metadata.version do + nil -> "" + version -> Version.to_string(version) + end + KV.put_map(kv_pid, %{ "peridio_rel_progress" => release_metadata.prn, - "peridio_vsn_progress" => Version.to_string(release_metadata.version) + "peridio_vsn_progress" => version }) end def kv_advance(kv_pid \\ KV) do KV.get_all_and_update(kv_pid, fn kv -> rel_progress = Map.get(kv, "peridio_rel_progress") - vsn_progress = Map.get(kv, "peridio_vsn_progress") + + vsn_progress = + case Map.get(kv, "peridio_vsn_progress") do + "" -> nil + vsn_progress -> vsn_progress + end + rel_current = Map.get(kv, "peridio_rel_current") - vsn_current = Map.get(kv, "peridio_vsn_current") + + vsn_current = + case Map.get(kv, "peridio_vsn_current") do + "" -> nil + vsn_current -> vsn_current + end kv |> Map.put("peridio_rel_previous", rel_current) |> Map.put("peridio_vsn_previous", vsn_current) |> Map.put("peridio_rel_current", rel_progress) |> Map.put("peridio_vsn_current", vsn_progress) - |> Map.put("peridio_rel_progress", "") - |> Map.put("peridio_vsn_progress", "") + |> Map.put("peridio_rel_progress", nil) + |> Map.put("peridio_vsn_progress", nil) end) end end diff --git a/lib/peridiod/release/server.ex b/lib/peridiod/release/server.ex index 8d29791..61d5f8e 100644 --- a/lib/peridiod/release/server.ex +++ b/lib/peridiod/release/server.ex @@ -80,9 +80,23 @@ defmodule Peridiod.Release.Server do poll_interval = config.release_poll_interval || @update_poll_interval progress_message_interval = @progress_message_interval - current_release_prn = KV.get("peridio_rel_current") || "" - current_release_version = KV.get("peridio_vsn_current") || "" - progress_release_prn = KV.get("peridio_rel_progress") + current_release_prn = + case KV.get("peridio_rel_current") do + "" -> nil + peridio_rel_current -> peridio_rel_current + end + + current_release_version = + case KV.get("peridio_vsn_current") do + "" -> nil + peridio_vsn_current -> peridio_vsn_current + end + + progress_release_prn = + case KV.get("peridio_rel_progress") do + "" -> nil + peridio_rel_progress -> peridio_rel_progress + end current_release = load_release_metadata_from_cache(current_release_prn, cache_pid) progress_release = load_release_metadata_from_cache(progress_release_prn, cache_pid) @@ -546,10 +560,16 @@ defmodule Peridiod.Release.Server do Release.stamp_installed(state.cache_pid, release_metadata) Release.kv_advance(state.kv_pid) + version = + case release_metadata.version do + nil -> nil + version -> Version.to_string(version) + end + sdk_client = state.sdk_client |> Map.put(:release_prn, release_metadata.prn) - |> Map.put(:release_version, Version.to_string(release_metadata.version)) + |> Map.put(:release_version, version) try_send(callback, {__MODULE__, :install, release_metadata.prn, :complete}) diff --git a/mix.lock b/mix.lock index 9942a13..2c6b057 100644 --- a/mix.lock +++ b/mix.lock @@ -21,7 +21,7 @@ "nimble_options": {:hex, :nimble_options, "1.1.1", "e3a492d54d85fc3fd7c5baf411d9d2852922f66e69476317787a7b2bb000a61b", [:mix], [], "hexpm", "821b2470ca9442c4b6984882fe9bb0389371b8ddec4d45a9504f00a66f650b44"}, "parse_trans": {:hex, :parse_trans, "3.4.1", "6e6aa8167cb44cc8f39441d05193be6e6f4e7c2946cb2759f015f8c56b76e5ff", [:rebar3], [], "hexpm", "620a406ce75dada827b82e453c19cf06776be266f5a67cff34e1ef2cbb60e49a"}, "peridio_rat": {:git, "https://github.com/peridio/peridio-rat.git", "6ed7b060710c4c59ae732c8d709d4a6ffee9a402", [branch: "main"]}, - "peridio_sdk": {:git, "https://github.com/peridio/peridio-elixir.git", "3a83f3b05a0358b54f7a70ef5e7e35bb9ef0d4ef", [branch: "main"]}, + "peridio_sdk": {:git, "https://github.com/peridio/peridio-elixir.git", "9879551099b990071b9592c2547b01aabdfa14ba", [branch: "main"]}, "peridiod_persistence": {:git, "https://github.com/peridio/peridiod-persistence.git", "54ae22de2c78d8832f6cb6c447da135008918f8c", [branch: "main"]}, "plug": {:hex, :plug, "1.16.1", "40c74619c12f82736d2214557dedec2e9762029b2438d6d175c5074c933edc9d", [:mix], [{:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:plug_crypto, "~> 1.1.1 or ~> 1.2 or ~> 2.0", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.3 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "a13ff6b9006b03d7e33874945b2755253841b238c34071ed85b0e86057f8cddc"}, "plug_cowboy": {:hex, :plug_cowboy, "2.7.1", "87677ffe3b765bc96a89be7960f81703223fe2e21efa42c125fcd0127dd9d6b2", [:mix], [{:cowboy, "~> 2.7", [hex: :cowboy, repo: "hexpm", optional: false]}, {:cowboy_telemetry, "~> 0.3", [hex: :cowboy_telemetry, repo: "hexpm", optional: false]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "02dbd5f9ab571b864ae39418db7811618506256f6d13b4a45037e5fe78dc5de3"},