Current section
Files
Jump to
Current section
Files
lib/regc/oci/image/config_consistency.ex
defmodule Regc.Oci.Image.ConfigConsistency do
@moduledoc false
alias Regc.Oci.{Error, Image, Platform}
@spec validate(map(), Platform.t() | nil, Image.Resolved.t()) ::
:ok | {:error, Error.t()}
def validate(config, requested_platform, %Image.Resolved{} = resolved) do
with :ok <- validate_layer_count(config, resolved),
:ok <- validate_platform(config, requested_platform, resolved) do
:ok
end
end
defp validate_platform(
config,
_requested_platform,
%Image.Resolved{platform: %Platform{} = selected_platform, selected_ref: reference}
) do
Platform.validate_config(config, selected_platform, reference, :descriptor)
end
defp validate_platform(_config, nil, %Image.Resolved{platform: nil}), do: :ok
defp validate_platform(
config,
requested_platform,
%Image.Resolved{platform: nil} = resolved
) do
Platform.validate_config(config, requested_platform, resolved.selected_ref)
end
defp validate_layer_count(config, %Image.Resolved{
layer_descriptors: layers,
selected_ref: reference
}) do
layer_count = length(layers)
diff_id_count = length(config.rootfs_diff_ids)
if layer_count == diff_id_count do
:ok
else
Error.result(
:config_decode,
:invalid_config,
"image config diff IDs do not correspond to manifest layers",
reference: reference,
details: %{layers: layer_count, diff_ids: diff_id_count}
)
end
end
end