...

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

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

     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  // pkgRender is called for each package during unpack.Walk
    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