get.porter.sh/porter@v1.3.0/pkg/grpc/portergrpc/installation.go (about)

     1  package portergrpc
     2  
     3  import (
     4  	"context"
     5  	"encoding/json"
     6  	"fmt"
     7  
     8  	iGRPCv1alpha1 "get.porter.sh/porter/gen/proto/go/porterapis/installation/v1alpha1"
     9  	"get.porter.sh/porter/pkg/porter"
    10  	"get.porter.sh/porter/pkg/tracing"
    11  	"google.golang.org/protobuf/encoding/protojson"
    12  )
    13  
    14  func newInstallationOptsFromLabels(labels map[string]string) []string {
    15  	var retLabels []string
    16  	for k, v := range labels {
    17  		retLabels = append(retLabels, fmt.Sprintf("%s=%s", k, v))
    18  	}
    19  	return retLabels
    20  }
    21  
    22  // populateGRPCInstallation populates a GRPC Installation (generated from protobuf)
    23  // a native porter DisplayInstallation
    24  func populateGRPCInstallation(ctx context.Context, inst porter.DisplayInstallation, gInst *iGRPCv1alpha1.Installation) error {
    25  	_, log := tracing.StartSpan(ctx)
    26  	defer log.EndSpan()
    27  	bInst, err := json.Marshal(inst)
    28  	if err != nil {
    29  		return log.Errorf("porter.DisplayInstallation marshal error: %e", err)
    30  	}
    31  	pjum := protojson.UnmarshalOptions{}
    32  	err = pjum.Unmarshal(bInst, gInst)
    33  	if err != nil {
    34  		return log.Errorf("installation GRPC Installation unmarshal error: %e", err)
    35  	}
    36  	return nil
    37  }
    38  
    39  // populateGRPCPorterValue populates a GRPC PorterValue (generated from protobuf)
    40  // from a native porter DisplayValue
    41  func populateGRPCPorterValue(ctx context.Context, dv porter.DisplayValue, gInstOut *iGRPCv1alpha1.PorterValue) error {
    42  	_, log := tracing.StartSpan(ctx)
    43  	defer log.EndSpan()
    44  	bInstOut, err := json.Marshal(dv)
    45  	if err != nil {
    46  		return log.Errorf("PorterValue marshal error: %e", err)
    47  	}
    48  	pjum := protojson.UnmarshalOptions{}
    49  	err = pjum.Unmarshal(bInstOut, gInstOut)
    50  	if err != nil {
    51  		return log.Errorf("installation GRPC InstallationOutputs unmarshal error: %e", err)
    52  	}
    53  	return nil
    54  }
    55  
    56  // ListInstallations takes a GRPC ListInstallationsRequest and returns a filtered list of
    57  // porter installations as a GRPC ListInstallationsResponse
    58  func (s *PorterServer) ListInstallations(ctx context.Context, req *iGRPCv1alpha1.ListInstallationsRequest) (*iGRPCv1alpha1.ListInstallationsResponse, error) {
    59  	ctx, log := tracing.StartSpan(ctx)
    60  	defer log.EndSpan()
    61  	p, err := GetPorterConnectionFromContext(ctx)
    62  	// Maybe try to setup a new porter connection instead of erring?
    63  	if err != nil {
    64  		return nil, err
    65  	}
    66  	opts := porter.ListOptions{
    67  		Name:          req.GetName(),
    68  		Namespace:     req.GetNamespace(),
    69  		Labels:        newInstallationOptsFromLabels(req.GetLabels()),
    70  		AllNamespaces: req.GetAllNamespaces(),
    71  		Skip:          req.GetSkip(),
    72  		Limit:         req.GetLimit(),
    73  	}
    74  	installations, err := p.ListInstallations(ctx, opts)
    75  	if err != nil {
    76  		return nil, err
    77  	}
    78  	insts := []*iGRPCv1alpha1.Installation{}
    79  	for _, pInst := range installations {
    80  		gInst := &iGRPCv1alpha1.Installation{}
    81  		err := populateGRPCInstallation(ctx, pInst, gInst)
    82  		if err != nil {
    83  			return nil, err
    84  		}
    85  		insts = append(insts, gInst)
    86  	}
    87  	res := iGRPCv1alpha1.ListInstallationsResponse{
    88  		Installation: insts,
    89  	}
    90  	return &res, nil
    91  }
    92  
    93  // ListInstallationLatestOutputs takes a GRPC ListInstallationLatestOutputRequest and returns
    94  // the most recent outputs for the porter installation as a GRPC ListInstallationLatestOutputResponse
    95  func (s *PorterServer) ListInstallationLatestOutputs(ctx context.Context, req *iGRPCv1alpha1.ListInstallationLatestOutputRequest) (*iGRPCv1alpha1.ListInstallationLatestOutputResponse, error) {
    96  	ctx, log := tracing.StartSpan(ctx)
    97  	defer log.EndSpan()
    98  	p, err := GetPorterConnectionFromContext(ctx)
    99  	// Maybe try to setup a new porter connection instead of erring?
   100  	if err != nil {
   101  		return nil, err
   102  	}
   103  
   104  	opts := porter.OutputListOptions{}
   105  	opts.Name = req.GetName()
   106  	opts.Namespace = req.GetNamespace()
   107  	opts.Format = "json"
   108  	pdv, err := p.ListBundleOutputs(ctx, &opts)
   109  	if err != nil {
   110  		return nil, err
   111  	}
   112  	gInstOuts := []*iGRPCv1alpha1.PorterValue{}
   113  	for _, dv := range pdv {
   114  		gInstOut := &iGRPCv1alpha1.PorterValue{}
   115  		err = populateGRPCPorterValue(ctx, dv, gInstOut)
   116  		if err != nil {
   117  			return nil, err
   118  		}
   119  		gInstOuts = append(gInstOuts, gInstOut)
   120  	}
   121  	res := &iGRPCv1alpha1.ListInstallationLatestOutputResponse{
   122  		Outputs: gInstOuts,
   123  	}
   124  	return res, nil
   125  }