package controller
import (
"encoding/json"
"net/http"
"strings"
"github.com/go-chi/chi"
"github.com/goodrain/rainbond/api/handler"
httputil "github.com/goodrain/rainbond/util/http"
)
type HelmReleaseController struct{}
func (c *HelmReleaseController) ListReleases(w http.ResponseWriter, r *http.Request) {
tenantName := chi.URLParam(r, "tenant_name")
namespace := strings.TrimSpace(r.URL.Query().Get("namespace"))
list, err := handler.GetHelmReleaseHandler().ListReleases(tenantName, namespace)
if err != nil {
httputil.ReturnBcodeError(r, w, err)
return
}
httputil.ReturnSuccess(r, w, map[string]interface{}{"list": list, "total": len(list)})
}
type installReleaseReq struct {
handler.HelmReleaseInstallRequest
}
type rollbackReleaseReq struct {
handler.HelmReleaseRollbackRequest
}
func (c *HelmReleaseController) InstallRelease(w http.ResponseWriter, r *http.Request) {
tenantName := chi.URLParam(r, "tenant_name")
var req installReleaseReq
if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
httputil.ReturnBcodeError(r, w, err)
return
}
req.Normalize()
if err := req.Validate(); err != nil {
httputil.ReturnBcodeError(r, w, httputil.NewErrBadRequest(err))
return
}
rel, err := handler.GetHelmReleaseHandler().InstallRelease(tenantName, req.HelmReleaseInstallRequest)
if err != nil {
httputil.ReturnBcodeError(r, w, err)
return
}
httputil.ReturnSuccess(r, w, rel)
}
func (c *HelmReleaseController) PreviewChart(w http.ResponseWriter, r *http.Request) {
tenantName := chi.URLParam(r, "tenant_name")
var req installReleaseReq
if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
httputil.ReturnBcodeError(r, w, err)
return
}
req.Normalize()
if err := req.ValidateForPreview(); err != nil {
httputil.ReturnBcodeError(r, w, httputil.NewErrBadRequest(err))
return
}
preview, err := handler.GetHelmReleaseHandler().PreviewChart(tenantName, req.HelmReleaseInstallRequest)
if err != nil {
httputil.ReturnBcodeError(r, w, err)
return
}
httputil.ReturnSuccess(r, w, preview)
}
func (c *HelmReleaseController) GetReleaseHistory(w http.ResponseWriter, r *http.Request) {
tenantName := chi.URLParam(r, "tenant_name")
releaseName := chi.URLParam(r, "release_name")
namespace := strings.TrimSpace(r.URL.Query().Get("namespace"))
list, err := handler.GetHelmReleaseHandler().GetReleaseHistory(tenantName, releaseName, namespace)
if err != nil {
httputil.ReturnBcodeError(r, w, err)
return
}
httputil.ReturnSuccess(r, w, map[string]interface{}{"list": list, "total": len(list)})
}
func (c *HelmReleaseController) GetReleaseDetail(w http.ResponseWriter, r *http.Request) {
tenantName := chi.URLParam(r, "tenant_name")
releaseName := chi.URLParam(r, "release_name")
namespace := strings.TrimSpace(r.URL.Query().Get("namespace"))
detail, err := handler.GetHelmReleaseHandler().GetReleaseDetail(tenantName, releaseName, namespace)
if err != nil {
httputil.ReturnBcodeError(r, w, err)
return
}
httputil.ReturnSuccess(r, w, detail)
}
func (c *HelmReleaseController) UpgradeRelease(w http.ResponseWriter, r *http.Request) {
tenantName := chi.URLParam(r, "tenant_name")
releaseName := chi.URLParam(r, "release_name")
var req installReleaseReq
if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
httputil.ReturnBcodeError(r, w, err)
return
}
req.ReleaseName = releaseName
req.Normalize()
if err := req.Validate(); err != nil {
httputil.ReturnBcodeError(r, w, httputil.NewErrBadRequest(err))
return
}
rel, err := handler.GetHelmReleaseHandler().UpgradeRelease(tenantName, releaseName, req.HelmReleaseInstallRequest)
if err != nil {
httputil.ReturnBcodeError(r, w, err)
return
}
httputil.ReturnSuccess(r, w, rel)
}
func (c *HelmReleaseController) RollbackRelease(w http.ResponseWriter, r *http.Request) {
tenantName := chi.URLParam(r, "tenant_name")
releaseName := chi.URLParam(r, "release_name")
namespace := strings.TrimSpace(r.URL.Query().Get("namespace"))
var req rollbackReleaseReq
if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
httputil.ReturnBcodeError(r, w, err)
return
}
if err := req.Validate(); err != nil {
httputil.ReturnBcodeError(r, w, httputil.NewErrBadRequest(err))
return
}
if err := handler.GetHelmReleaseHandler().RollbackRelease(tenantName, releaseName, namespace, req.Revision); err != nil {
httputil.ReturnBcodeError(r, w, err)
return
}
httputil.ReturnSuccess(r, w, nil)
}
func (c *HelmReleaseController) UninstallRelease(w http.ResponseWriter, r *http.Request) {
tenantName := chi.URLParam(r, "tenant_name")
releaseName := chi.URLParam(r, "release_name")
namespace := strings.TrimSpace(r.URL.Query().Get("namespace"))
if err := handler.GetHelmReleaseHandler().UninstallRelease(tenantName, releaseName, namespace); err != nil {
httputil.ReturnBcodeError(r, w, err)
return
}
httputil.ReturnSuccess(r, w, nil)
}
func GetHelmReleaseController() *HelmReleaseController {
return &HelmReleaseController{}
}