...

Source file src/edge-infra.dev/pkg/f8n/warehouse/lift/cmd/render/shipment.go

Documentation: edge-infra.dev/pkg/f8n/warehouse/lift/cmd/render

     1  package render
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  
     7  	"github.com/google/go-containerregistry/pkg/name"
     8  	"sigs.k8s.io/controller-runtime/pkg/client"
     9  
    10  	whv1 "edge-infra.dev/pkg/f8n/warehouse/k8s/apis/v1alpha2"
    11  	"edge-infra.dev/pkg/f8n/warehouse/lift"
    12  	"edge-infra.dev/pkg/f8n/warehouse/lift/cmd/internal"
    13  	"edge-infra.dev/pkg/f8n/warehouse/lift/unpack"
    14  	"edge-infra.dev/pkg/f8n/warehouse/oci/remote"
    15  	"edge-infra.dev/pkg/lib/cli/sink"
    16  )
    17  
    18  func newRenderShipmentCmd(cfg lift.Config) *sink.Command {
    19  	var (
    20  		applier  = internal.NewApplier()
    21  		unpacker = internal.NewUnpacker(cfg.Parameters)
    22  	)
    23  	cmd := &sink.Command{
    24  		Use:        "shipment [flags] <name>",
    25  		Short:      "render package contents from Shipment object on a K8s cluster",
    26  		Extensions: []sink.Extension{applier, unpacker},
    27  		Exec: func(ctx context.Context, r sink.Run) error {
    28  			switch len(r.Args()) {
    29  			case 0:
    30  				return fmt.Errorf("a shipment is required")
    31  			case 1:
    32  			default:
    33  				return fmt.Errorf("only one shipment can be rendered at a time")
    34  			}
    35  
    36  			var s whv1.Shipment
    37  			if err := applier.Klient.Get(ctx, client.ObjectKey{Name: r.Args()[0]}, &s); err != nil {
    38  				return err
    39  			}
    40  			renderingParams, err := resolveParameters(ctx, applier.Klient, s)
    41  			if err != nil {
    42  				return err
    43  			}
    44  
    45  			unpackOpts := []unpack.Option{
    46  				unpack.RenderWith(renderingParams),
    47  				unpack.ForLayerKeys(s.Layers()...),
    48  				// TODO: get this info from controller deployment / config
    49  				unpack.ForProvider(unpacker.Provider),
    50  			}
    51  
    52  			repo := s.Spec.Repository
    53  			for _, s := range s.Status.LastApplied {
    54  				packageName := s.Name
    55  				digest := s.Digest
    56  				ref, err := name.ParseReference(fmt.Sprintf("%s/%s@%s", repo, packageName, digest))
    57  				if err != nil {
    58  					return err
    59  				}
    60  				artifact, err := remote.Get(ref)
    61  				if err != nil {
    62  					return err
    63  				}
    64  				if err := unpack.Walk(artifact, pkgRender, unpackOpts...); err != nil {
    65  					return err
    66  				}
    67  			}
    68  			return nil
    69  		},
    70  	}
    71  	return cmd
    72  }
    73  
    74  // TODO: make part of Shipment types code?
    75  func resolveParameters(ctx context.Context, client client.Client, s whv1.Shipment) (map[string]string, error) {
    76  	result := make(map[string]string, 0)
    77  	for _, p := range s.Spec.Rendering {
    78  		vars, err := p.Resolve(ctx, client)
    79  		if err != nil {
    80  			return nil, err
    81  		}
    82  		for k, v := range vars {
    83  			result[k] = v
    84  		}
    85  	}
    86  	return result, nil
    87  }
    88  

View as plain text