This repository has been archived by the owner on Nov 20, 2021. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 7
/
marketplace.go
132 lines (120 loc) · 3.6 KB
/
marketplace.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
package app
// Marketplace routines for returning a list of categroies, apps, and app details within the marketplace
import (
"context"
"net/http"
"net/url"
"strings"
"github.com/coreos/go-semver/semver"
marketplacev1alpha2 "github.com/criticalstack/marketplace/api/v1alpha2"
echo "github.com/labstack/echo/v4"
"github.com/pkg/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"sigs.k8s.io/controller-runtime/pkg/client"
"helm.sh/helm/v3/pkg/chart/loader"
helmcli "helm.sh/helm/v3/pkg/cli"
"helm.sh/helm/v3/pkg/getter"
)
// MarkeplaceApps returns all applications in the cluster catalog optionally filtered by category or source
func (x *Controller) MarketplaceAppsListAll(c echo.Context) error {
cli, err := x.userClient(c)
if err != nil {
return errors.Wrap(err, "unable to create marketplace apps client")
}
var opts []client.ListOption
if src := c.QueryParam("source"); src != "" {
opts = append(opts, client.MatchingLabels{"marketplace.criticalstack.com/source.name": src})
}
if cat := strings.ToLower(c.QueryParam("category")); cat != "" {
opts = append(opts, client.HasLabels{"marketplace.criticalstack.com/application.category." + cat})
}
var apps marketplacev1alpha2.ApplicationList
if cli.List(context.TODO(), &apps, opts...); err != nil {
return newError(err)
}
return x.sendJSONSuccess(c, Map{
"resourceVersion": apps.GetResourceVersion(),
"result": apps.Items,
})
}
func compareVersions(a, b string) int {
av, err1 := semver.NewVersion(a)
bv, err2 := semver.NewVersion(b)
if err1 != nil || err2 != nil {
return strings.Compare(a, b)
}
return av.Compare(*bv)
}
func (x *Controller) MarketplaceAppDetail(c echo.Context) error {
cli, err := x.userClient(c)
if err != nil {
return newError(err)
}
appid := c.Param("app")
var app marketplacev1alpha2.Application
if cli.Get(context.TODO(), client.ObjectKey{Name: appid}, &app); err != nil {
return newError(err)
}
// TODO(ktravis): semver.Sort versions
reqVersion := c.QueryParam("version")
var appVersion *marketplacev1alpha2.ChartVersion
vv := make([]string, 0)
for _, cv := range app.Versions {
vv = append(vv, cv.Version)
v := cv
if reqVersion != "" {
if reqVersion == cv.Version {
appVersion = &v
}
} else {
if appVersion == nil || compareVersions(v.Version, appVersion.Version) > 0 {
appVersion = &v
}
}
}
if appVersion == nil {
if reqVersion != "" {
return newStatusError(http.StatusNotFound, errors.Errorf("app %q version %q not found", appid, reqVersion))
}
return newStatusError(http.StatusNotFound, errors.Errorf("app %q not found", appid))
}
settings := &helmcli.EnvSettings{}
getters := getter.All(settings)
u, err := url.Parse(appVersion.URLs[0])
if err != nil {
return newError(err)
}
g, err := getters.ByScheme(u.Scheme)
if err != nil {
return newError(err)
}
var opts []getter.Option
if con := metav1.GetControllerOf(&app); con != nil {
var src marketplacev1alpha2.Source
if cli.Get(context.TODO(), client.ObjectKey{Name: con.Name}, &src); err != nil {
return newError(err)
}
if src.Spec.CertFile != "" {
opts = append(opts, getter.WithTLSClientConfig(src.Spec.CertFile, src.Spec.KeyFile, src.Spec.CAFile))
}
if src.Spec.Username != "" {
opts = append(opts, getter.WithBasicAuth(src.Spec.Username, src.Spec.Password))
}
}
buf, err := g.Get(u.String(), opts...)
if err != nil {
return newError(err)
}
chart, err := loader.LoadArchive(buf)
if err != nil {
return newError(err)
}
return x.sendJSONSuccess(c, Map{
"result": Map{
"app": appVersion,
"metadata": app.ObjectMeta,
"versions": vv,
"chart": chart,
},
})
}