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 }