mirror of
https://github.com/komodorio/helm-dashboard.git
synced 2026-03-24 03:38:04 +00:00
* Correct path to static dir * Add UI build to makefile * Fix docker build * describe now works * Installed page - revision view - implement url consistent state logic (#403) * refactor * refactor * Fix/responsive and small stylings (#404) * add user defined (#405) * Fix/modal loading button (#406) * add repo to url (#407) * Fix/resources table badges (#408) * filters is now good * fix * test results fix * fix * fixes - error modal, uninstall modals, typees * fixes * bug fix * Helm dashboard v2 (#402) * missing config (#409) * fixes * fixes * Fix/minor responsiveness (#410) * installed release page * default helm icon * guard * refactor * refactor * refactor * key * refactor * fixes * fixes to install * install, add, upgrade, reconfigure now works * latest ver fix * Revision page ui fixes (#411) * link color * Add-repository-link (#412) * empty badge fix * diff fix in install repo * removed console.log * unique key in helathstatus * Cosmetics * Goreleaser upgraded * Another way to fix it * refactor * refactor * chart install fix (#413) * more maintailable * loading, empty space and default namespace * typed * loading diff state is shared * modal height fix * upgrade and add repo connected * add repo suggestion data connected to modal * removed console.log * Chart install fix (#414) * refactor: fix text align uninstall * install modal values big fix * refactor * no changes in diff msg * refactor * sorted versions * typography changes * refactor * refactor * refactor * migrate to sb 7 (#416) * Chart install fix (#415) * Add troubleshoot in komodor (#417) * status style * fix * fixes * delete now reload the page correclty * navigate after add repo fix * Chart install fix (#419) * refactor * refactor * Fix revision age (#420) * refactor * fixed redirects and nav links selected ui (#421) * test modal ui fixes * arrows fix * loading ui (#422) * test dialog now shows errors * fixed rollback diff, redirect after rollback, and debouncing before refetching chart values after changing user defined values (#423) * everything is working besides install chart * install chart should work now * no need for this anymore * styling and naming * improvements * navigation fix * flow fixes * top bar pixel perfect * onClose is optional * ts optional * pixel perfect - clusters, box shadow, error modal * installed page pixel perfect * fixes * need to fix this naming * rollback logic is now good * buttons now similiar to the old app * pass release instead of release date (#426) * repository page style fixes * rounded input * colors like in the old app * more rounding * colors * colors * Cosmetics * drop-shadow cause the dropdown to swallowed * smaller text * fixes (#428) * fixes * describe fix * Fix/lint (#431) * style fixes * fix * describe panel style fixes * diff when repo is available * diff style fixes * fixes to install dialog * specific version should be latests revision * refactor * fixes * fixes * cause troubles * Fixes (#434) * fix * dont fetch if repo not available * tag should not be visible * custom-shdaow fixes * space and shadow like in the old app * refactor (#435) * describe display logic aligned with the old app * style fix * action button style fix * selected revision default logic fix * font fix * style fixes * shutdown button fix * latest revision is now consistent in dev and prod * namespace should be empty on install * fix for current version on install * sorting fix * checkmark should be displayed in options - install * state jump fix * local charts (#436) * Several more fixes (#438) * api docs (#439) * html remove diff2html dep (#437) * Refactor * refactor * Adding storybook for StatusLabel component (#441) * refactor (#442) * we need the css * add prettier (#440) * add prettier * refactor * refactor * Fix reconfigure issue (#443) * first diff fetch fix * missing dep in hooks (#444) * namespace should be from query * triggering diff rerender by listening to loading * missing uservalues * no need for auto retry * we should work against latest revision * refactor * Fix build merge * refactor * refactor * fix * refactor * refactor * age tooltip * prettier fix * fix bug (#447) * Add eslint now (#449) * repo install chart now works as expected * release modal and eslint working good now * we should fetch when return to the initial value * Tailwind theme reorganized (#446) * install release code is like reading a story ! * namespace is not needed for chart values * install repo chart is now like reading a story :) * Fix/filternamesapce (#451) * not needed dep * prettier fix * namespace fix * add debounce (#452) * namespace filter fix * now namespace filter behaves like in the old app * more linter rules and configurations * intial value should be empty * no need to keep filters on cluster change * we don't want to keep tab state between pages * button should be disabled when loading * prettier fix * initial value we're not presented * navigation fix * namespace should always be empty * supporting pre selected namespaces * lint adjustments * Refactor stories fodler (#450) * refactor * refactor * if no user values, use the release values * Adding layer to base style (#456) * Extract duplicate type to types file (#453) * Refactor callApi into direct usage of apiService (#454) * Remove scanners from backend * Give some room for multiple HealthStatus (#458) * refactor: add dynamic api docs (#460) * remove scanners from openapi * was loading forever * fix * Extract defined values from the Modals (#461) * refactor (#462) * fix chart with no repo diff flow * naming fix * crypto UUID not available through https * revert * Update analytics.js with UUID fallback * Cosmetics * repo fetch fix * not need to depened on versions * forgot to push * revert * was causing infinite loop * COsmetics --------- Co-authored-by: Nir Parisian <nir.parisian@gmail.com> Co-authored-by: dav-sap <davidsaper@gmail.com> Co-authored-by: chad11111 <chad1111@tutanota.com> Co-authored-by: IdanSchiller <58664272+IdanSchiller@users.noreply.github.com> Co-authored-by: dav-sap <16819417+dav-sap@users.noreply.github.com> Co-authored-by: rotembm12 <46103618+rotembm12@users.noreply.github.com> Co-authored-by: naorzr <naorzruk@gmail.com> Co-authored-by: Gary Gensler <127234894+chad11111@users.noreply.github.com> Co-authored-by: Tamir Abutbul <1tamir198@gmail.com> Co-authored-by: Nir Parisian <nir2002@users.noreply.github.com>
206 lines
5.1 KiB
Go
206 lines
5.1 KiB
Go
package dashboard
|
|
|
|
import (
|
|
"context"
|
|
"github.com/komodorio/helm-dashboard/pkg/frontend"
|
|
"html"
|
|
"net/http"
|
|
"os"
|
|
"path"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
"github.com/komodorio/helm-dashboard/pkg/dashboard/handlers"
|
|
"github.com/komodorio/helm-dashboard/pkg/dashboard/objects"
|
|
log "github.com/sirupsen/logrus"
|
|
)
|
|
|
|
func noCache(c *gin.Context) {
|
|
if c.GetHeader("Cache-Control") == "" { // default policy is not to cache
|
|
c.Header("Cache-Control", "no-cache")
|
|
}
|
|
|
|
c.Next()
|
|
}
|
|
|
|
func allowCORS(c *gin.Context) {
|
|
c.Header("Access-Control-Allow-Origin", "*")
|
|
c.Header("Access-Control-Allow-Headers", "*")
|
|
c.Next()
|
|
}
|
|
|
|
func errorHandler(c *gin.Context) {
|
|
c.Next()
|
|
|
|
errs := ""
|
|
for _, err := range c.Errors {
|
|
log.Debugf("Error: %+v", err)
|
|
errs += err.Error() + "\n"
|
|
}
|
|
|
|
if errs != "" {
|
|
c.String(http.StatusInternalServerError, html.EscapeString(errs))
|
|
}
|
|
}
|
|
|
|
func contextSetter(data *objects.DataLayer) gin.HandlerFunc {
|
|
return func(c *gin.Context) {
|
|
ctxName := ""
|
|
if ctx, ok := c.Request.Header["X-Kubecontext"]; ok {
|
|
ctxName = ctx[0]
|
|
if err := data.SetContext(ctxName); err != nil {
|
|
c.String(http.StatusInternalServerError, err.Error())
|
|
return
|
|
}
|
|
}
|
|
|
|
app, err := data.AppForCtx(ctxName)
|
|
if err != nil {
|
|
c.String(http.StatusInternalServerError, err.Error())
|
|
return
|
|
}
|
|
|
|
c.Set(handlers.APP, app)
|
|
|
|
c.Next()
|
|
}
|
|
}
|
|
|
|
// Middleware for CORS
|
|
func corsMiddleware() gin.HandlerFunc {
|
|
return func(c *gin.Context) {
|
|
c.Writer.Header().Set("Access-Control-Allow-Origin", "*")
|
|
c.Writer.Header().Set("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS")
|
|
c.Writer.Header().Set("Access-Control-Allow-Headers", "*")
|
|
|
|
// Handle preflight requests
|
|
if c.Request.Method == "OPTIONS" {
|
|
c.AbortWithStatus(http.StatusOK)
|
|
return
|
|
}
|
|
|
|
c.Next()
|
|
}
|
|
}
|
|
func NewRouter(abortWeb context.CancelFunc, data *objects.DataLayer, debug bool) *gin.Engine {
|
|
var api *gin.Engine
|
|
if debug {
|
|
api = gin.New()
|
|
api.Use(gin.Recovery())
|
|
} else {
|
|
api = gin.Default()
|
|
}
|
|
|
|
api.Use(contextSetter(data))
|
|
api.Use(noCache)
|
|
api.Use(errorHandler)
|
|
api.Use(corsMiddleware())
|
|
|
|
if os.Getenv("HD_CORS") != "" {
|
|
api.Use(allowCORS)
|
|
}
|
|
|
|
configureStatic(api)
|
|
configureRoutes(abortWeb, data, api)
|
|
|
|
return api
|
|
}
|
|
|
|
func configureRoutes(abortWeb context.CancelFunc, data *objects.DataLayer, api *gin.Engine) {
|
|
// server shutdown handler
|
|
api.DELETE("/", func(c *gin.Context) {
|
|
abortWeb()
|
|
c.Status(http.StatusAccepted)
|
|
})
|
|
|
|
api.GET("/status", func(c *gin.Context) {
|
|
c.Header("X-Application-Name", "Helm Dashboard by Komodor.io") // to identify ourselves by ourselves
|
|
c.IndentedJSON(http.StatusOK, data.GetStatus())
|
|
})
|
|
|
|
api.GET("/api/cache", func(c *gin.Context) { // TODO: included into OpenAPI or not?
|
|
c.IndentedJSON(http.StatusOK, data.Cache)
|
|
})
|
|
|
|
api.DELETE("/api/cache", func(c *gin.Context) { // TODO: included into OpenAPI or not?
|
|
err := data.Cache.Clear()
|
|
if err != nil {
|
|
_ = c.AbortWithError(http.StatusBadRequest, err)
|
|
return
|
|
}
|
|
c.Status(http.StatusAccepted)
|
|
})
|
|
|
|
api.POST("/diff", func(c *gin.Context) { // TODO: included into OpenAPI or not?
|
|
a := c.PostForm("a")
|
|
b := c.PostForm("b")
|
|
|
|
out := handlers.GetDiff(a, b, "current.yaml", "upgraded.yaml")
|
|
c.Header("Content-Type", "text/plain")
|
|
c.String(http.StatusOK, out)
|
|
})
|
|
|
|
api.GET("/api-docs", func(c *gin.Context) { // https://github.com/OAI/OpenAPI-Specification/search?q=api-docs
|
|
c.Redirect(http.StatusFound, "static/api-docs.html")
|
|
})
|
|
|
|
configureHelms(api.Group("/api/helm"), data)
|
|
configureKubectls(api.Group("/api/k8s"), data)
|
|
}
|
|
|
|
func configureHelms(api *gin.RouterGroup, data *objects.DataLayer) {
|
|
h := handlers.HelmHandler{
|
|
Contexted: &handlers.Contexted{
|
|
Data: data,
|
|
},
|
|
}
|
|
|
|
rels := api.Group("/releases")
|
|
rels.GET("", h.GetReleases)
|
|
rels.POST(":ns", h.Install)
|
|
rels.POST(":ns/:name", h.Upgrade)
|
|
rels.DELETE(":ns/:name", h.Uninstall)
|
|
rels.GET(":ns/:name/history", h.History)
|
|
rels.GET(":ns/:name/:section", h.GetInfoSection)
|
|
rels.GET(":ns/:name/resources", h.Resources)
|
|
rels.POST(":ns/:name/rollback", h.Rollback)
|
|
rels.POST(":ns/:name/test", h.RunTests)
|
|
|
|
repos := api.Group("/repositories")
|
|
repos.GET("", h.RepoList)
|
|
repos.POST("", h.RepoAdd)
|
|
repos.GET("/:name", h.RepoCharts)
|
|
repos.POST("/:name", h.RepoUpdate)
|
|
repos.DELETE("/:name", h.RepoDelete)
|
|
repos.GET("/latestver", h.RepoLatestVer) // TODO: use /versions in client insted and remove this?
|
|
repos.GET("/versions", h.RepoVersions)
|
|
repos.GET("/values", h.RepoValues)
|
|
}
|
|
|
|
func configureKubectls(api *gin.RouterGroup, data *objects.DataLayer) {
|
|
h := handlers.KubeHandler{
|
|
Contexted: &handlers.Contexted{
|
|
Data: data,
|
|
},
|
|
}
|
|
api.GET("/contexts", h.GetContexts)
|
|
api.GET("/:kind/get", h.GetResourceInfo)
|
|
api.GET("/:kind/describe", h.Describe)
|
|
api.GET("/:kind/list", h.GetNameSpaces)
|
|
}
|
|
|
|
func configureStatic(api *gin.Engine) {
|
|
fs := http.FS(frontend.StaticFS)
|
|
|
|
api.GET("/", func(c *gin.Context) {
|
|
c.FileFromFS("/dist/", fs)
|
|
})
|
|
|
|
api.GET("/assets/*filepath", func(c *gin.Context) {
|
|
c.FileFromFS(path.Join("dist", c.Request.URL.Path), fs)
|
|
})
|
|
|
|
api.GET("/static/*filepath", func(c *gin.Context) {
|
|
c.FileFromFS(path.Join("dist", c.Request.URL.Path), fs)
|
|
})
|
|
}
|