...
1 package render
2
3 import (
4 "bytes"
5 "context"
6 "fmt"
7 "io"
8
9 "edge-infra.dev/pkg/f8n/warehouse/cluster"
10 "edge-infra.dev/pkg/f8n/warehouse/lift"
11 "edge-infra.dev/pkg/f8n/warehouse/lift/cmd/internal"
12 "edge-infra.dev/pkg/f8n/warehouse/lift/unpack"
13 "edge-infra.dev/pkg/f8n/warehouse/oci/layer"
14 "edge-infra.dev/pkg/f8n/warehouse/pallet"
15 "edge-infra.dev/pkg/lib/cli/sink"
16 )
17
18 var buffer *bytes.Buffer
19
20 func New(cfg lift.Config) *sink.Command {
21 var (
22 packer = internal.NewPacker(cfg)
23 unpacker = internal.NewUnpacker(cfg.Parameters)
24 )
25 cmd := &sink.Command{
26 Use: "render [flags] <artifact>",
27 Short: "unpack and render Pallets",
28 Commands: []*sink.Command{newRenderShipmentCmd(cfg)},
29 Extensions: []sink.Extension{packer, unpacker},
30 Exec: func(_ context.Context, r sink.Run) error {
31 switch len(r.Args()) {
32 case 0:
33 return fmt.Errorf("a pallet is required")
34 case 1:
35 default:
36 return fmt.Errorf("only one pallet can be rendered at a time")
37 }
38
39 artifact, err := internal.ResolveArtifact(packer, r.Args()[0])
40 if err != nil {
41 return err
42 }
43
44 unpacker.Info(r)
45 err = unpack.Walk(artifact, pkgRender, unpacker.Options()...)
46 if err == cluster.ErrNoProviders {
47 return fmt.Errorf("%w, pass via --cluster-provider or CLUSTER_PROVIDER environment variable", err)
48 }
49
50 if err != nil {
51 return err
52 }
53 fmt.Fprintln(r.Out(), buffer.String())
54 return nil
55 },
56 }
57 return cmd
58 }
59
60
61 func pkgRender(_ pallet.Pallet, layers []layer.Layer) error {
62 if buffer == nil {
63 buffer = bytes.NewBufferString("")
64 }
65 for _, l := range layers {
66 r, err := l.Uncompressed()
67 if err != nil {
68 return err
69 }
70 yaml, err := io.ReadAll(r)
71 if err != nil {
72 return err
73 }
74 buffer.WriteString(string(yaml))
75 buffer.WriteString("---\n")
76 }
77 return nil
78 }
79
View as plain text