-
Notifications
You must be signed in to change notification settings - Fork 726
/
OciRegistryHelper.cs
132 lines (109 loc) · 5.7 KB
/
OciRegistryHelper.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.
using System.IO.Abstractions.TestingHelpers;
using Bicep.Core.Configuration;
using Bicep.Core.Features;
using Bicep.Core.Modules;
using Bicep.Core.Registry;
using Bicep.Core.Registry.Oci;
using Bicep.Core.UnitTests.Mock;
using Bicep.Core.UnitTests.Registry;
using FluentAssertions;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Microsoft.WindowsAzure.ResourceStack.Common.Memory;
using Moq;
namespace Bicep.Core.UnitTests.Utils
{
public static class OciRegistryHelper
{
public static OciArtifactReference CreateModuleReferenceMock(string registry, string repository, Uri parentModuleUri, string? digest, string? tag)
=> new(ArtifactType.Module, registry, repository, tag, digest, parentModuleUri);
public static OciArtifactReference ParseModuleReference(string moduleId /* with or without br: */, Uri? parentModuleUri = null)
{
if (moduleId.StartsWith(OciArtifactReferenceFacts.SchemeWithColon))
{
moduleId = moduleId.Substring(OciArtifactReferenceFacts.SchemeWithColon.Length);
}
OciArtifactReference.TryParse(
ArtifactType.Module,
null,
moduleId,
BicepTestConstants.BuiltInConfiguration,
parentModuleUri ?? new Uri("file:///main.bicep"))
.IsSuccess(out var moduleReference).Should().BeTrue();
return moduleReference!;
}
public static OciArtifactReference CreateModuleReference(string registry, string repository, string? tag, string? digest, Uri? parentModuleUri = null)
{
return ParseModuleReference($"{registry}/{repository}" + (tag is null ? $"@{digest}" : $":{tag}"), parentModuleUri);
}
public static void SaveManifestFileToModuleRegistryCache(
TestContext testContext,
string registry,
string repository,
string manifestFileContents,
string testOutputPath,
string? digest,
string? tag)
{
string? manifestFileRelativePath = null;
if (digest is not null)
{
manifestFileRelativePath = Path.Combine("br", registry, repository.Replace("/", "$"), digest.Replace(":", "#"));
}
else if (tag is not null)
{
manifestFileRelativePath = Path.Combine("br", registry, repository.Replace("/", "$"), tag + "$");
}
if (!string.IsNullOrWhiteSpace(manifestFileRelativePath))
{
FileHelper.SaveResultFile(testContext, Path.Join(manifestFileRelativePath, "manifest"), manifestFileContents, testOutputPath);
}
}
// create a new (real) OciArtifactRegistry instance with an empty on-disk cache that can push and pull modules
public static (OciArtifactRegistry, MockRegistryBlobClient) CreateModuleRegistry(
Uri parentModuleUri,
IFeatureProvider featureProvider)
{
IContainerRegistryClientFactory ClientFactory = StrictMock.Of<IContainerRegistryClientFactory>().Object;
var blobClient = new MockRegistryBlobClient();
var clientFactory = StrictMock.Of<IContainerRegistryClientFactory>();
clientFactory
.Setup(m => m.CreateAuthenticatedBlobClient(It.IsAny<RootConfiguration>(), It.IsAny<Uri>(), It.IsAny<string>()))
.Returns(blobClient);
var registry = new OciArtifactRegistry(
BicepTestConstants.FileResolver,
BicepTestConstants.FileSystem,
clientFactory.Object,
featureProvider,
BicepTestConstants.BuiltInConfiguration,
parentModuleUri);
return (registry, blobClient);
}
public static async Task<(MockRegistryBlobClient, Mock<IContainerRegistryClientFactory>)> PublishArtifactLayersToMockClient(string tempDirectory, string registry, Uri registryUri, string repository, string? mediaType, string? artifactType, string? configContents, IEnumerable<(string mediaType, string contents)> layers)
{
var client = new MockRegistryBlobClient();
var clientFactory = StrictMock.Of<IContainerRegistryClientFactory>();
clientFactory.Setup(m => m.CreateAuthenticatedBlobClient(It.IsAny<RootConfiguration>(), registryUri, repository)).Returns(client);
var templateSpecRepositoryFactory = BicepTestConstants.TemplateSpecRepositoryFactory;
Directory.CreateDirectory(tempDirectory);
var containerRegistryManager = new AzureContainerRegistryManager(clientFactory.Object);
var fs = new MockFileSystem();
var configurationManager = new ConfigurationManager(fs);
var parentUri = new Uri("http://test.bicep", UriKind.Absolute);
var configuration = configurationManager.GetConfiguration(parentUri);
using var compiledStream = new BufferedMemoryStream();
var moduleReference = CreateModuleReference(registry, repository, "v1", null);
await containerRegistryManager.PushArtifactAsync(
configuration: configuration,
artifactReference: moduleReference,
mediaType: mediaType,
artifactType: artifactType,
config: new OciDescriptor(configContents ?? string.Empty, BicepMediaTypes.BicepModuleConfigV1),
layers: layers.Select(layer => new OciDescriptor(layer.contents, layer.mediaType)),
new OciManifestAnnotationsBuilder()
);
return (client, clientFactory);
}
}
}