Skip to content

Commit 99e0d98

Browse files
authored
Support flat OCI Spec image (#133)
1 parent e070441 commit 99e0d98

File tree

3 files changed

+92
-24
lines changed

3 files changed

+92
-24
lines changed

internal/controller/serverbootconfiguration_pxe_controller.go

Lines changed: 30 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -219,42 +219,49 @@ func (r *ServerBootConfigurationPXEReconciler) getLayerDigestsFromNestedManifest
219219
return "", "", "", fmt.Errorf("failed to resolve image reference: %w", err)
220220
}
221221

222-
indexData, err := fetchContent(ctx, resolver, name, desc)
222+
targetManifestDesc := desc
223+
manifestData, err := fetchContent(ctx, resolver, name, desc)
223224
if err != nil {
224-
return "", "", "", fmt.Errorf("failed to fetch index manifest: %w", err)
225+
return "", "", "", fmt.Errorf("failed to fetch manifest data: %w", err)
225226
}
226227

227-
var indexManifest ocispec.Index
228-
if err := json.Unmarshal(indexData, &indexManifest); err != nil {
228+
var manifest ocispec.Manifest
229+
if err := json.Unmarshal(manifestData, &manifest); err != nil {
229230
return "", "", "", fmt.Errorf("failed to unmarshal index manifest: %w", err)
230231
}
231232

232-
var targetManifestDesc ocispec.Descriptor
233-
for _, manifest := range indexManifest.Manifests {
234-
if strings.HasPrefix(manifest.Annotations["cname"], CNAMEPrefixMetalPXE) {
235-
if manifest.Annotations["architecture"] == r.Architecture {
236-
targetManifestDesc = manifest
237-
break
238-
}
233+
if desc.MediaType == ocispec.MediaTypeImageIndex {
234+
var indexManifest ocispec.Index
235+
if err := json.Unmarshal(manifestData, &indexManifest); err != nil {
236+
return "", "", "", fmt.Errorf("failed to unmarshal index manifest: %w", err)
239237
}
240-
}
241238

242-
if targetManifestDesc.Digest == "" {
243-
return "", "", "", fmt.Errorf("failed to find target manifest with cname annotation")
244-
}
239+
for _, manifest := range indexManifest.Manifests {
240+
if strings.HasPrefix(manifest.Annotations["cname"], CNAMEPrefixMetalPXE) {
241+
if manifest.Annotations["architecture"] == r.Architecture {
242+
targetManifestDesc = manifest
243+
break
244+
}
245+
}
246+
}
247+
if targetManifestDesc.Digest == "" {
248+
return "", "", "", fmt.Errorf("failed to find target manifest with cname annotation")
249+
}
245250

246-
nestedData, err := fetchContent(ctx, resolver, name, targetManifestDesc)
247-
if err != nil {
248-
return "", "", "", fmt.Errorf("failed to fetch nested manifest: %w", err)
249-
}
251+
nestedData, err := fetchContent(ctx, resolver, name, targetManifestDesc)
252+
if err != nil {
253+
return "", "", "", fmt.Errorf("failed to fetch nested manifest: %w", err)
254+
}
250255

251-
var nestedManifest ocispec.Manifest
252-
if err := json.Unmarshal(nestedData, &nestedManifest); err != nil {
253-
return "", "", "", fmt.Errorf("failed to unmarshal nested manifest: %w", err)
256+
var nestedManifest ocispec.Manifest
257+
if err := json.Unmarshal(nestedData, &nestedManifest); err != nil {
258+
return "", "", "", fmt.Errorf("failed to unmarshal nested manifest: %w", err)
259+
}
260+
manifest = nestedManifest
254261
}
255262

256263
var kernelDigest, initrdDigest, squashFSDigest string
257-
for _, layer := range nestedManifest.Layers {
264+
for _, layer := range manifest.Layers {
258265
if layer.Annotations[AnnotationArchitecture] == r.Architecture {
259266
switch layer.MediaType {
260267
case MediaTypeKernel:

internal/controller/serverbootconfiguration_pxe_controller_test.go

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,4 +91,65 @@ var _ = Describe("ServerBootConfiguration Controller", func() {
9191
HaveField("Spec.IgnitionSecretRef.Name", "foo"),
9292
))
9393
})
94+
95+
It("should map a new ServerBootConfiguration", func(ctx SpecContext) {
96+
By("creating a new Server object")
97+
server := &metalv1alpha1.Server{
98+
ObjectMeta: metav1.ObjectMeta{
99+
GenerateName: "server-",
100+
},
101+
Spec: metalv1alpha1.ServerSpec{
102+
UUID: "12345",
103+
},
104+
}
105+
Expect(k8sClient.Create(ctx, server)).To(Succeed())
106+
107+
By("patching the Server NICs in Server status")
108+
Eventually(UpdateStatus(server, func() {
109+
server.Status.NetworkInterfaces = []metalv1alpha1.NetworkInterface{
110+
{
111+
Name: "foo",
112+
IP: metalv1alpha1.MustParseIP("1.1.1.1"),
113+
MACAddress: "abcd",
114+
},
115+
}
116+
})).Should(Succeed())
117+
118+
By("creating a new ServerBootConfiguration")
119+
config := &metalv1alpha1.ServerBootConfiguration{
120+
ObjectMeta: metav1.ObjectMeta{
121+
Namespace: ns.Name,
122+
GenerateName: "test-",
123+
},
124+
Spec: metalv1alpha1.ServerBootConfigurationSpec{
125+
ServerRef: corev1.LocalObjectReference{
126+
Name: server.Name,
127+
},
128+
Image: "ghcr.io/gardenlinux/gardenlinux:1770.0-metal_pxe-arm64-1770.0-60d819dd-arm64",
129+
IgnitionSecretRef: &corev1.LocalObjectReference{Name: "foo"},
130+
},
131+
}
132+
Expect(k8sClient.Create(ctx, config)).To(Succeed())
133+
134+
By("ensuring that the ipxe boot configuration is correct")
135+
bootConfig := &v1alpha1.IPXEBootConfig{
136+
ObjectMeta: metav1.ObjectMeta{
137+
Namespace: ns.Name,
138+
Name: config.Name,
139+
},
140+
}
141+
Eventually(Object(bootConfig)).Should(SatisfyAll(
142+
HaveField("OwnerReferences", ContainElement(metav1.OwnerReference{
143+
APIVersion: "metal.ironcore.dev/v1alpha1",
144+
Kind: "ServerBootConfiguration",
145+
Name: config.Name,
146+
UID: config.UID,
147+
Controller: ptr.To(true),
148+
BlockOwnerDeletion: ptr.To(true),
149+
})),
150+
HaveField("Spec.SystemUUID", server.Spec.UUID),
151+
HaveField("Spec.SystemIPs", ContainElement("1.1.1.1")),
152+
HaveField("Spec.IgnitionSecretRef.Name", "foo"),
153+
))
154+
})
94155
})

internal/controller/suite_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ func SetupTest() *corev1.Namespace {
132132
Client: k8sManager.GetClient(),
133133
Scheme: k8sManager.GetScheme(),
134134
IPXEServiceURL: "http://localhost:5000",
135-
Architecture: "amd64",
135+
Architecture: "arm64",
136136
}).SetupWithManager(k8sManager)).To(Succeed())
137137

138138
Expect((&ServerBootConfigurationHTTPReconciler{

0 commit comments

Comments
 (0)