Skip to content
This repository was archived by the owner on Nov 1, 2023. It is now read-only.

Commit 7fa5ba9

Browse files
authored
Renaming, add in shared gallery images
1 parent b40cb0c commit 7fa5ba9

File tree

2 files changed

+142
-23
lines changed

2 files changed

+142
-23
lines changed

src/ApiService/ApiService/onefuzzlib/ImageReference.cs

Lines changed: 66 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,14 @@ public static OneFuzzResult<ImageReference> TryParse(string image) {
2929
try {
3030
// see if it is a valid ARM resource identifier:
3131
identifier = new ResourceIdentifier(image);
32-
if (identifier.ResourceType == GalleryImageResource.ResourceType) {
32+
if (identifier.ResourceType == SharedGalleryImageResource.ResourceType) {
33+
result = new LatestSharedGalleryImage(identifier);
34+
} else if (identifier.ResourceType == SharedGalleryImageVersionResource.ResourceType) {
35+
result = new SharedGalleryImage(identifier);
36+
} else if (identifier.ResourceType == GalleryImageVersionResource.ResourceType) {
3337
result = new GalleryImage(identifier);
38+
} else if (identifier.ResourceType == GalleryImageResource.ResourceType) {
39+
result = new LatestGalleryImage(identifier);
3440
} else if (identifier.ResourceType == ImageResource.ResourceType) {
3541
result = new Image(identifier);
3642
} else {
@@ -70,10 +76,17 @@ public static OneFuzzResult<ImageReference> TryParse(string image) {
7076

7177
public abstract override string ToString();
7278

73-
[JsonConverter(typeof(Converter<GalleryImage>))]
74-
public sealed record GalleryImage(ResourceIdentifier Identifier) : ImageReference {
75-
public override long MaximumVmCount => CustomImageMaximumVmCount;
79+
public abstract record ArmImageReference(ResourceIdentifier Identifier) : ImageReference {
80+
public sealed override long MaximumVmCount => CustomImageMaximumVmCount;
81+
82+
public sealed override Compute.Models.ImageReference ToArm()
83+
=> new() { Id = Identifier };
7684

85+
public sealed override string ToString() => Identifier.ToString();
86+
}
87+
88+
[JsonConverter(typeof(Converter<LatestGalleryImage>))]
89+
public sealed record LatestGalleryImage(ResourceIdentifier Identifier) : ArmImageReference(Identifier) {
7790
public override async Task<OneFuzzResult<Os>> GetOs(ArmClient armClient, string region) {
7891
try {
7992
var resource = await armClient.GetGalleryImageResource(Identifier).GetAsync();
@@ -86,17 +99,60 @@ public override async Task<OneFuzzResult<Os>> GetOs(ArmClient armClient, string
8699
return new Error(ErrorCode.INVALID_IMAGE, new[] { ex.ToString() });
87100
}
88101
}
102+
}
89103

90-
public override Compute.Models.ImageReference ToArm()
91-
=> new() { Id = Identifier };
104+
[JsonConverter(typeof(Converter<GalleryImage>))]
105+
public sealed record GalleryImage(ResourceIdentifier Identifier) : ArmImageReference(Identifier) {
106+
public override async Task<OneFuzzResult<Os>> GetOs(ArmClient armClient, string region) {
107+
try {
108+
// need to access parent of versioned resource to get the OS data
109+
var resource = await armClient.GetGalleryImageResource(Identifier.Parent!).GetAsync();
110+
if (resource.Value.Data.OSType is OperatingSystemTypes os) {
111+
return OneFuzzResult.Ok(Enum.Parse<Os>(os.ToString(), ignoreCase: true));
112+
} else {
113+
return new Error(ErrorCode.INVALID_IMAGE, new[] { "Specified image had no OSType" });
114+
}
115+
} catch (Exception ex) when (ex is RequestFailedException) {
116+
return new Error(ErrorCode.INVALID_IMAGE, new[] { ex.ToString() });
117+
}
118+
}
119+
}
120+
121+
[JsonConverter(typeof(Converter<LatestSharedGalleryImage>))]
122+
public sealed record LatestSharedGalleryImage(ResourceIdentifier Identifier) : ArmImageReference(Identifier) {
123+
public override async Task<OneFuzzResult<Os>> GetOs(ArmClient armClient, string region) {
124+
try {
125+
var resource = await armClient.GetSharedGalleryImageResource(Identifier).GetAsync();
126+
if (resource.Value.Data.OSType is OperatingSystemTypes os) {
127+
return OneFuzzResult.Ok(Enum.Parse<Os>(os.ToString(), ignoreCase: true));
128+
} else {
129+
return new Error(ErrorCode.INVALID_IMAGE, new[] { "Specified image had no OSType" });
130+
}
131+
} catch (Exception ex) when (ex is RequestFailedException) {
132+
return new Error(ErrorCode.INVALID_IMAGE, new[] { ex.ToString() });
133+
}
134+
}
135+
}
92136

93-
public override string ToString() => Identifier.ToString();
137+
[JsonConverter(typeof(Converter<SharedGalleryImage>))]
138+
public sealed record SharedGalleryImage(ResourceIdentifier Identifier) : ArmImageReference(Identifier) {
139+
public override async Task<OneFuzzResult<Os>> GetOs(ArmClient armClient, string region) {
140+
try {
141+
// need to access parent of versioned resource to get OS info
142+
var resource = await armClient.GetSharedGalleryImageResource(Identifier.Parent!).GetAsync();
143+
if (resource.Value.Data.OSType is OperatingSystemTypes os) {
144+
return OneFuzzResult.Ok(Enum.Parse<Os>(os.ToString(), ignoreCase: true));
145+
} else {
146+
return new Error(ErrorCode.INVALID_IMAGE, new[] { "Specified image had no OSType" });
147+
}
148+
} catch (Exception ex) when (ex is RequestFailedException) {
149+
return new Error(ErrorCode.INVALID_IMAGE, new[] { ex.ToString() });
150+
}
151+
}
94152
}
95153

96154
[JsonConverter(typeof(Converter<Image>))]
97-
public sealed record Image(ResourceIdentifier Identifier) : ImageReference {
98-
public override long MaximumVmCount => CustomImageMaximumVmCount;
99-
155+
public sealed record Image(ResourceIdentifier Identifier) : ArmImageReference(Identifier) {
100156
public override async Task<OneFuzzResult<Os>> GetOs(ArmClient armClient, string region) {
101157
try {
102158
var resource = await armClient.GetImageResource(Identifier).GetAsync();
@@ -106,11 +162,6 @@ public override async Task<OneFuzzResult<Os>> GetOs(ArmClient armClient, string
106162
return new Error(ErrorCode.INVALID_IMAGE, new[] { ex.ToString() });
107163
}
108164
}
109-
110-
public override Compute.Models.ImageReference ToArm()
111-
=> new() { Id = Identifier };
112-
113-
public override string ToString() => Identifier.ToString();
114165
}
115166

116167
[JsonConverter(typeof(Converter<Marketplace>))]

src/ApiService/Tests/ImageReferenceTests.cs

Lines changed: 76 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ public void CanParseImageGalleryReference() {
1515
subId.ToString(), "resource-group", "gallery", "imageName");
1616

1717
var result = ImageReference.MustParse(fakeId.ToString());
18-
var galleryImage = Assert.IsType<ImageReference.GalleryImage>(result);
18+
var galleryImage = Assert.IsType<ImageReference.LatestGalleryImage>(result);
1919
Assert.Equal("imageName", galleryImage.Identifier.Name);
2020
Assert.Equal("gallery", galleryImage.Identifier.Parent?.Name);
2121
Assert.Equal("resource-group", galleryImage.Identifier.ResourceGroupName);
@@ -45,6 +45,47 @@ public void CanParseMarketplaceReference() {
4545
Assert.Equal("latest", marketplace.Version);
4646
}
4747

48+
[Fact]
49+
public void CanParseSpecificVersionGalleryImage() {
50+
var subId = Guid.NewGuid();
51+
var fakeId = GalleryImageVersionResource.CreateResourceIdentifier(
52+
subId.ToString(), "resource-group", "gallery", "imageName", "latest");
53+
54+
var result = ImageReference.MustParse(fakeId.ToString());
55+
var galleryImage = Assert.IsType<ImageReference.GalleryImage>(result);
56+
Assert.Equal("latest", galleryImage.Identifier.Name);
57+
Assert.Equal("imageName", galleryImage.Identifier.Parent?.Name);
58+
Assert.Equal("gallery", galleryImage.Identifier.Parent?.Parent?.Name);
59+
Assert.Equal("resource-group", galleryImage.Identifier.ResourceGroupName);
60+
}
61+
62+
[Fact]
63+
public void CanParseSharedGalleryImage() {
64+
var subId = Guid.NewGuid();
65+
var fakeId = SharedGalleryImageResource.CreateResourceIdentifier(
66+
subId.ToString(), "location", "gallery", "imageName");
67+
68+
var result = ImageReference.MustParse(fakeId.ToString());
69+
var galleryImage = Assert.IsType<ImageReference.LatestSharedGalleryImage>(result);
70+
Assert.Equal("imageName", galleryImage.Identifier.Name);
71+
Assert.Equal("gallery", galleryImage.Identifier.Parent?.Name);
72+
Assert.Null(galleryImage.Identifier.ResourceGroupName);
73+
}
74+
75+
[Fact]
76+
public void CanParseSpecificVersionSharedGalleryImage() {
77+
var subId = Guid.NewGuid();
78+
var fakeId = SharedGalleryImageVersionResource.CreateResourceIdentifier(
79+
subId.ToString(), "location", "gallery", "imageName", "latest");
80+
81+
var result = ImageReference.MustParse(fakeId.ToString());
82+
var galleryImage = Assert.IsType<ImageReference.SharedGalleryImage>(result);
83+
Assert.Equal("latest", galleryImage.Identifier.Name);
84+
Assert.Equal("imageName", galleryImage.Identifier.Parent?.Name);
85+
Assert.Equal("gallery", galleryImage.Identifier.Parent?.Parent?.Name);
86+
Assert.Null(galleryImage.Identifier.ResourceGroupName);
87+
}
88+
4889
[Fact]
4990
public void UnknownResourceTypeGeneratesError() {
5091
var subId = Guid.NewGuid();
@@ -56,21 +97,31 @@ public void UnknownResourceTypeGeneratesError() {
5697
}
5798

5899
static readonly string _expected = @$"{{
59-
""galleryImageId"": ""/subscriptions/{Guid.Empty}/resourceGroups/resource-group/providers/Microsoft.Compute/galleries/gallery/images/imageName"",
100+
""latestGalleryId"": ""/subscriptions/{Guid.Empty}/resourceGroups/resource-group/providers/Microsoft.Compute/galleries/gallery/images/imageName"",
60101
""imageId"": ""/subscriptions/{Guid.Empty}/resourceGroups/resource-group/providers/Microsoft.Compute/images/imageName"",
61-
""marketplaceId"": ""Canonical:UbuntuServer:18.04-LTS:latest""
102+
""marketplaceId"": ""Canonical:UbuntuServer:18.04-LTS:latest"",
103+
""galleryId"": ""/subscriptions/{Guid.Empty}/resourceGroups/resource-group/providers/Microsoft.Compute/galleries/gallery/images/imageName/versions/latest"",
104+
""latestSharedGalleryId"": ""/subscriptions/{Guid.Empty}/providers/Microsoft.Compute/locations/location/sharedGalleries/gallery/images/imageName"",
105+
""sharedGalleryId"": ""/subscriptions/{Guid.Empty}/providers/Microsoft.Compute/locations/location/sharedGalleries/gallery/images/imageName/versions/latest""
62106
}}";
63107

64108
private record Holder(
65-
ImageReference galleryImageId,
109+
ImageReference latestGalleryId,
66110
ImageReference imageId,
67-
ImageReference marketplaceId);
111+
ImageReference marketplaceId,
112+
ImageReference galleryId,
113+
ImageReference.LatestSharedGalleryImage latestSharedGalleryId,
114+
ImageReference.SharedGalleryImage sharedGalleryId);
68115

69116
[Fact]
70117
public void SerializesToStringAndDeserializesFromString() {
71118
var subId = Guid.Empty;
72119

73-
var galleryImageId = new ImageReference.GalleryImage(
120+
var galleryId = new ImageReference.GalleryImage(
121+
GalleryImageVersionResource.CreateResourceIdentifier(
122+
subId.ToString(), "resource-group", "gallery", "imageName", "latest"));
123+
124+
var latestGalleryId = new ImageReference.LatestGalleryImage(
74125
GalleryImageResource.CreateResourceIdentifier(
75126
subId.ToString(), "resource-group", "gallery", "imageName"));
76127

@@ -81,16 +132,33 @@ public void SerializesToStringAndDeserializesFromString() {
81132
var marketplaceId = new ImageReference.Marketplace(
82133
"Canonical", "UbuntuServer", "18.04-LTS", "latest");
83134

135+
var latestSharedGalleryId = new ImageReference.LatestSharedGalleryImage(
136+
SharedGalleryImageResource.CreateResourceIdentifier(
137+
subId.ToString(), "location", "gallery", "imageName"));
138+
139+
var sharedGalleryId = new ImageReference.SharedGalleryImage(
140+
SharedGalleryImageVersionResource.CreateResourceIdentifier(
141+
subId.ToString(), "location", "gallery", "imageName", "latest"));
142+
84143
var result = JsonSerializer.Serialize(
85-
new Holder(galleryImageId, imageId, marketplaceId),
144+
new Holder(
145+
latestGalleryId,
146+
imageId,
147+
marketplaceId,
148+
galleryId,
149+
latestSharedGalleryId,
150+
sharedGalleryId),
86151
new JsonSerializerOptions { WriteIndented = true });
87152

88153
Assert.Equal(_expected, result);
89154

90155
var deserialized = JsonSerializer.Deserialize<Holder>(result);
91156
Assert.NotNull(deserialized);
92-
Assert.Equal(galleryImageId, deserialized!.galleryImageId);
157+
Assert.Equal(latestGalleryId, deserialized!.latestGalleryId);
158+
Assert.Equal(galleryId, deserialized.galleryId);
93159
Assert.Equal(imageId, deserialized.imageId);
94160
Assert.Equal(marketplaceId, deserialized.marketplaceId);
161+
Assert.Equal(latestSharedGalleryId, deserialized.latestSharedGalleryId);
162+
Assert.Equal(sharedGalleryId, deserialized.sharedGalleryId);
95163
}
96164
}

0 commit comments

Comments
 (0)