...
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
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
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