Skip to content

Commit

Permalink
Fix OCI config deserialization issue
Browse files Browse the repository at this point in the history
  • Loading branch information
anthony-c-martin committed Jun 6, 2024
1 parent 8f7ca14 commit 608232b
Show file tree
Hide file tree
Showing 4 changed files with 26 additions and 4 deletions.
4 changes: 3 additions & 1 deletion src/Bicep.Core/Registry/AzureContainerRegistryManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -155,7 +155,9 @@ private static async Task<OciArtifactResult> DownloadManifestAndLayersAsync(IOci
.Select(async layer => new OciArtifactLayer(layer.Digest, layer.MediaType, await PullLayerAsync(client, layer)));
var layers = await Task.WhenAll(layerTasks);

var config = new OciArtifactLayer(deserializedManifest.Config.Digest, deserializedManifest.Config.MediaType, await PullLayerAsync(client, deserializedManifest.Config));
var config = !deserializedManifest.Config.IsEmpty() ?
new OciArtifactLayer(deserializedManifest.Config.Digest, deserializedManifest.Config.MediaType, await PullLayerAsync(client, deserializedManifest.Config)) :
null;

return deserializedManifest.ArtifactType switch
{
Expand Down
18 changes: 18 additions & 0 deletions src/Bicep.Core/Registry/Oci/OciDescriptor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -56,5 +56,23 @@ public static string ComputeDigest(string algorithmIdentifier, BinaryData data,
AlgorithmIdentifierSha512 => SHA512.Create(),
_ => throw new NotImplementedException($"Unknown hash algorithm '{algorithm}'.")
};

public bool IsEmpty()
{
if (Size == 0)
{
return true;
}

if (Size == 2 &&
OciArtifactReferenceFacts.DigestComparer.Equals(Digest, "sha256:44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a"))
{
// This SHA is a special case - it refers to "{}" (empty object).
// See https://github.com/opencontainers/image-spec/blob/main/manifest.md#guidance-for-an-empty-descriptor for more information.
return true;
}

return false;
}
}
}
4 changes: 2 additions & 2 deletions src/Bicep.Core/Registry/Oci/OciProviderArtifactResult.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ public class OciProviderArtifactResult : OciArtifactResult
{
private readonly OciArtifactLayer mainLayer;

public OciProviderArtifactResult(BinaryData manifestBits, string manifestDigest, IEnumerable<OciArtifactLayer> layers, OciArtifactLayer config) :
public OciProviderArtifactResult(BinaryData manifestBits, string manifestDigest, IEnumerable<OciArtifactLayer> layers, OciArtifactLayer? config) :
base(manifestBits, manifestDigest, layers)
{
var manifest = this.Manifest;
Expand All @@ -27,6 +27,6 @@ public OciProviderArtifactResult(BinaryData manifestBits, string manifestDigest,

public override OciArtifactLayer GetMainLayer() => this.mainLayer;

public OciArtifactLayer Config { get; }
public OciArtifactLayer? Config { get; }
}
}
4 changes: 3 additions & 1 deletion src/Bicep.Core/Registry/OciArtifactRegistry.cs
Original file line number Diff line number Diff line change
Expand Up @@ -402,7 +402,9 @@ protected override void WriteArtifactContentToCache(OciArtifactReference referen

if (result is OciProviderArtifactResult providerArtifact)
{
var config = JsonSerializer.Deserialize(providerArtifact.Config.Data, OciProvidersV1ConfigSerializationContext.Default.OciProvidersV1Config);
var config = providerArtifact.Config is {} ?
JsonSerializer.Deserialize(providerArtifact.Config.Data, OciProvidersV1ConfigSerializationContext.Default.OciProvidersV1Config) :
null;

// if the artifact supports local deployment, fetch the provider binary
if (config?.LocalDeployEnabled == true)
Expand Down

0 comments on commit 608232b

Please sign in to comment.