diff --git a/cmd/endpoints/list/listcontract.go b/cmd/endpoints/list/listcontract.go new file mode 100644 index 000000000..5cb22f5c2 --- /dev/null +++ b/cmd/endpoints/list/listcontract.go @@ -0,0 +1,15 @@ +package list + +type ListRequest struct { + RequestID string +} + +type ListRespose struct { + Status bool + Data []HelmRelease +} + +type HelmRelease struct { + Release string `json:"release"` + Namespace string `json:"namespace"` +} diff --git a/cmd/endpoints/list/listhandler.go b/cmd/endpoints/list/listhandler.go new file mode 100644 index 000000000..a0f7dcd3b --- /dev/null +++ b/cmd/endpoints/list/listhandler.go @@ -0,0 +1,52 @@ +package list + +import ( + "encoding/json" + "fmt" + "net/http" + + "helm.sh/helm/v3/pkg/action" + "helm.sh/helm/v3/pkg/servercontext" +) + +func Handler() http.Handler { + return http.HandlerFunc(func(res http.ResponseWriter, req *http.Request) { + + res.Header().Set("Content-Type", "application/json") + defer req.Body.Close() + + var request ListRequest + decoder := json.NewDecoder(req.Body) + decoder.UseNumber() + + if err := decoder.Decode(&request); err != nil { + fmt.Println("error in request") + return + } + + request.RequestID = req.Header.Get("Request-Id") + + list := action.NewList(servercontext.App().ActionConfig) + + list.SetStateMask() + results, err := list.Run() + if err != nil { + fmt.Print("error while running helm list") + } + + var helmReleases []HelmRelease + for _, res := range results { + r := HelmRelease{Release: res.Name, Namespace: res.Namespace} + helmReleases = append(helmReleases, r) + } + + response := ListRespose{Status: true, Data: helmReleases} + payload, err := json.Marshal(response) + if err != nil { + fmt.Println("error parsing response") + return + } + + res.Write(payload) + }) +} diff --git a/cmd/endpoints/ping/pingcontract.go b/cmd/endpoints/ping/pingcontract.go new file mode 100644 index 000000000..4dc780c63 --- /dev/null +++ b/cmd/endpoints/ping/pingcontract.go @@ -0,0 +1,10 @@ +package ping + +type PingReq struct { + RequestID string +} + +type PingResponse struct { + Status bool + Data string +} diff --git a/cmd/endpoints/ping/pinghandler.go b/cmd/endpoints/ping/pinghandler.go new file mode 100644 index 000000000..d6c0a3740 --- /dev/null +++ b/cmd/endpoints/ping/pinghandler.go @@ -0,0 +1,35 @@ +package ping + +import ( + "encoding/json" + "fmt" + "net/http" +) + +func Handler() http.Handler { + return http.HandlerFunc(func(res http.ResponseWriter, req *http.Request) { + + res.Header().Set("Content-Type", "application/json") + defer req.Body.Close() + + var request PingReq + decoder := json.NewDecoder(req.Body) + decoder.UseNumber() + + if err := decoder.Decode(&request); err != nil { + fmt.Println("error in request") + return + } + + request.RequestID = req.Header.Get("Request-Id") + + response := PingResponse{Status: true, Data: "pong"} + payload, err := json.Marshal(response) + if err != nil { + fmt.Println("error parsing response") + return + } + + res.Write(payload) + }) +} diff --git a/cmd/servercontext/context.go b/cmd/servercontext/context.go new file mode 100644 index 000000000..c8867a0c1 --- /dev/null +++ b/cmd/servercontext/context.go @@ -0,0 +1,49 @@ +package servercontext + +import ( + "fmt" + "log" + "os" + + "helm.sh/helm/v3/pkg/action" + "helm.sh/helm/v3/pkg/cli" +) + +var app Application + +type Application struct { + Config *cli.EnvSettings + ActionConfig *action.Configuration +} + +func App() *Application { + return &app +} + +func NewApp() *Application { + app.Config = envSettings() + app.ActionConfig = boostrapActionConfig() + return &app +} + +func envSettings() *cli.EnvSettings { + envSettings := cli.New() + for k, v := range envSettings.EnvVars() { + fmt.Println(k, v) + } + return envSettings +} + +func debug(format string, v ...interface{}) { + format = fmt.Sprintf("[debug] %s\n", format) + log.Output(2, fmt.Sprintf(format, v...)) +} + +func boostrapActionConfig() *action.Configuration { + actionConfig := new(action.Configuration) + if err := actionConfig.Init(app.Config.RESTClientGetter(), app.Config.Namespace(), os.Getenv("HELM_DRIVER"), debug); err != nil { + log.Fatalf("error getting configuration: %v", err) + return nil + } + return actionConfig +} diff --git a/cmd/service/service.go b/cmd/service/service.go index f0868c699..af2fcfa0e 100644 --- a/cmd/service/service.go +++ b/cmd/service/service.go @@ -2,70 +2,25 @@ package main import ( "fmt" - "log" - "os" + "net/http" - "helm.sh/helm/v3/pkg/action" - "helm.sh/helm/v3/pkg/cli" - "helm.sh/helm/v3/pkg/gates" - "helm.sh/helm/v3/pkg/http" - _ "k8s.io/client-go/plugin/pkg/client/auth" + "helm.sh/helm/v3/cmd/endpoints/list" + "helm.sh/helm/v3/cmd/endpoints/ping" + "helm.sh/helm/v3/cmd/servercontext" ) -var ( - settings = cli.New() -) - -func debug(format string, v ...interface{}) { - format = fmt.Sprintf("[debug] %s\n", format) - log.Output(2, fmt.Sprintf(format, v...)) -} - -const FeatureGateOCI = gates.Gate("HELM_EXPERIMENTAL_OCI") - -// Input: repositories.yaml, repositories cache (optional), chart location - func main() { - actionConfig := new(action.Configuration) - for k, v := range settings.EnvVars() { - fmt.Println(k, v) - } - if err := actionConfig.Init(settings.RESTClientGetter(), settings.Namespace(), os.Getenv("HELM_DRIVER"), debug); err != nil { - log.Fatalf("error getting configuration: %v", err) - return - } - if _, err := actionConfig.KubernetesClientSet(); err != nil { - log.Fatalf("error initilizing kubernetes client configuration: %v", err) - return - } - - listReleases(actionConfig) - helmRepoUpdate() - // this has to be added in repositories: https://charts.bitnami.com/bitnami - installRelease(actionConfig, "bitnami/redis", "bitnami-redis-2") -} - -func listReleases(cfg *action.Configuration) { - releases, err := http.List(cfg) - if err != nil { - panic(err) - } - fmt.Println(string(releases)) + app := servercontext.NewApp() + startServer(app) } -func helmRepoUpdate() { - err := http.HelmRepoUpdate() - if err != nil { - panic(err) - } -} +func startServer(appconfig *servercontext.Application) { + router := http.NewServeMux() + router.Handle("/ping", ping.Handler()) + router.Handle("/list", list.Handler()) -func installRelease(cfg *action.Configuration, chartPath string, releaseName string) { - fmt.Printf("installing chart: %s. release name: %s ", chartPath, releaseName) - _, err := http.Install(cfg, chartPath, releaseName) + err := http.ListenAndServe(fmt.Sprintf(":%d", 8080), router) if err != nil { - fmt.Println("error installing chart", err) - return + fmt.Println("error starting server", err) } - fmt.Printf("installed chart: %s release: %s successfully", chartPath, releaseName) } diff --git a/pkg/server.go b/pkg/server.go deleted file mode 100644 index f86f0bb58..000000000 --- a/pkg/server.go +++ /dev/null @@ -1,24 +0,0 @@ -package main - -import ( - "fmt" - "net/http" -) - -func main() { - startServer() -} - -func startServer() { - router := http.NewServeMux() - router.HandleFunc("/ping", pingFunc) - - err := http.ListenAndServe(fmt.Sprintf(":%d", 8080), router) - if err != nil { - fmt.Println("error starting server", err) - } -} - -func pingFunc(w http.ResponseWriter, r *http.Request) { - fmt.Println("pong") -}