@@ -5,22 +5,19 @@ package controller
55
66import (
77 "context"
8- "encoding/json"
98 "fmt"
109 "strings"
1110
1211 apimeta "k8s.io/apimachinery/pkg/api/meta"
1312
14- "github.com/containerd/containerd/remotes/docker"
15- ocispec "github.com/opencontainers/image-spec/specs-go/v1"
16-
1713 corev1 "k8s.io/api/core/v1"
1814 "k8s.io/apimachinery/pkg/types"
1915 "sigs.k8s.io/controller-runtime/pkg/handler"
2016 "sigs.k8s.io/controller-runtime/pkg/reconcile"
2117
2218 "github.com/go-logr/logr"
2319 bootv1alpha1 "github.com/ironcore-dev/boot-operator/api/v1alpha1"
20+ "github.com/ironcore-dev/boot-operator/internal/uki"
2421 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2522 "k8s.io/apimachinery/pkg/runtime"
2623 ctrl "sigs.k8s.io/controller-runtime"
@@ -30,10 +27,6 @@ import (
3027 metalv1alpha1 "github.com/ironcore-dev/metal-operator/api/v1alpha1"
3128)
3229
33- const (
34- MediaTypeUKI = "application/vnd.ironcore.image.uki"
35- )
36-
3730type ServerBootConfigurationHTTPReconciler struct {
3831 client.Client
3932 Scheme * runtime.Scheme
@@ -187,74 +180,10 @@ func (r *ServerBootConfigurationHTTPReconciler) getSystemNetworkIDsFromServer(ct
187180}
188181
189182func (r * ServerBootConfigurationHTTPReconciler ) constructUKIURL (ctx context.Context , image string ) (string , error ) {
190- imageDetails := strings .Split (image , ":" )
191- if len (imageDetails ) != 2 {
192- return "" , fmt .Errorf ("invalid image format" )
193- }
194-
195- ukiDigest , err := r .getUKIDigestFromNestedManifest (ctx , imageDetails [0 ], imageDetails [1 ])
196- if err != nil {
197- return "" , fmt .Errorf ("failed to fetch UKI layer digest: %w" , err )
198- }
199-
200- ukiDigest = strings .TrimPrefix (ukiDigest , "sha256:" )
201- ukiURL := fmt .Sprintf ("%s/%s/sha256-%s.efi" , r .ImageServerURL , imageDetails [0 ], ukiDigest )
202- return ukiURL , nil
203- }
204-
205- func (r * ServerBootConfigurationHTTPReconciler ) getUKIDigestFromNestedManifest (ctx context.Context , imageName , imageVersion string ) (string , error ) {
206- resolver := docker .NewResolver (docker.ResolverOptions {})
207- imageRef := fmt .Sprintf ("%s:%s" , imageName , imageVersion )
208- name , desc , err := resolver .Resolve (ctx , imageRef )
209- if err != nil {
210- return "" , fmt .Errorf ("failed to resolve image reference: %w" , err )
211- }
212-
213- targetManifestDesc := desc
214- manifestData , err := fetchContent (ctx , resolver , name , desc )
215- if err != nil {
216- return "" , fmt .Errorf ("failed to fetch manifest data: %w" , err )
217- }
218-
219- var manifest ocispec.Manifest
220- if desc .MediaType == ocispec .MediaTypeImageIndex {
221- var indexManifest ocispec.Index
222- if err := json .Unmarshal (manifestData , & indexManifest ); err != nil {
223- return "" , fmt .Errorf ("failed to unmarshal index manifest: %w" , err )
224- }
225-
226- for _ , manifest := range indexManifest .Manifests {
227- platform := manifest .Platform
228- if manifest .Platform != nil && platform .Architecture == r .Architecture {
229- targetManifestDesc = manifest
230- break
231- }
232- }
233- if targetManifestDesc .Digest == "" {
234- return "" , fmt .Errorf ("failed to find target manifest with architecture %s" , r .Architecture )
235- }
236-
237- nestedData , err := fetchContent (ctx , resolver , name , targetManifestDesc )
238- if err != nil {
239- return "" , fmt .Errorf ("failed to fetch nested manifest: %w" , err )
240- }
241-
242- if err := json .Unmarshal (nestedData , & manifest ); err != nil {
243- return "" , fmt .Errorf ("failed to unmarshal nested manifest: %w" , err )
244- }
245- } else {
246- if err := json .Unmarshal (manifestData , & manifest ); err != nil {
247- return "" , fmt .Errorf ("failed to unmarshal manifest: %w" , err )
248- }
183+ if strings .TrimSpace (r .ImageServerURL ) == "" {
184+ return "" , fmt .Errorf ("image server URL is empty" )
249185 }
250-
251- for _ , layer := range manifest .Layers {
252- if layer .MediaType == MediaTypeUKI {
253- return layer .Digest .String (), nil
254- }
255- }
256-
257- return "" , fmt .Errorf ("UKI layer digest not found" )
186+ return uki .ConstructUKIURLFromOCI (ctx , image , r .ImageServerURL , r .Architecture )
258187}
259188
260189func (r * ServerBootConfigurationHTTPReconciler ) enqueueServerBootConfigReferencingIgnitionSecret (ctx context.Context , secret client.Object ) []reconcile.Request {
0 commit comments