mirror of
https://github.com/komodorio/helm-dashboard.git
synced 2026-03-24 11:48:04 +00:00
* Object model with self-sufficient binary (#131) * Code cosmetics * Experimenting with object model and direct HELM usage * Experiment with object model * replacing the kubectl * Progressing * Save the progress * Able to start with migration in mind * Migrated two pieces * List releases via Helm * Forgotten field * Cristallized the problem of ctx switcher * Reworked to multi-context * Rollback is also new style * More migration * Refactoring * Describe via code * Bye-bye kubectl binary * Eliminate more old code * Refactor a bit * Merges * No binaries in dockerfile * Commit * Progress with getting the data * Learned the thing about get * One field less * Sstart with repos * Repo add * repo remove * Repos! Icons! * Simplified access to data * Ver listing works * Ver check works * Caching and values * fixup * Done with repos * Working on install * Install work-ish * Fix UI failing on install * Upgrade flow works * Fix image building * Remove outdated test file * Move files around * REfactorings * Cosmetics * Test for cache control (#151) * Files import formatted * Added go-test tools * Added test for no-cache header * added changes * test for cache behaviour of app * test for static route (#153) * Tests: route configuration & context setter (#154) * Test for route configuration * Test for context setter middleware * implemented changes * Restore coverage profile Fixes #156 * Cosmetics * Test for `NewRouter` function (#157) * Test for `configureScanners` (#158) * Test for `configureKubectls` (#163) * Test for repository loading (#169) - Created `repos_test.go` - Test: `Load()` of Repositories * Build all PRs * Fixes failing test (#171) * Fixes failing test - Fixes failing test of repo loading * handles error for * Did some changes * Test for listing of repos (#173) - and did some code formatting Signed-off-by: OmAxiani0 <aximaniom@gmail.com> Signed-off-by: OmAxiani0 <aximaniom@gmail.com> * Test for adding repo (#175) - Modified the `repositories.yml` file Signed-off-by: OmAxiani0 <aximaniom@gmail.com> Signed-off-by: OmAxiani0 <aximaniom@gmail.com> * Test for deleting the repository (#176) * Test for deleting the repository - Also added cleanup function for `TestAdd` * Fixes failing test * Add auto labeler for PR's (#174) * Add auto labeler for PR's * Add all file under .github/workflow to 'ci' label Co-authored-by: Harshit Mehta <harshitm@nvidia.com> * Test for getting repository (#177) * Add github workflow for auto PR labeling (#181) Co-authored-by: Harshit Mehta <harshitm@nvidia.com> * Stub compilation * Fixes around installing * More complex test * Using object model to execute helm test (#191) * Expand test * More test * Coverage * Add mutex for operations * Rectore cluster detection code * Change receiver to pointer * Support multiple namespaces * Cosmetics * Update repos periodically * fix tests * Fix error display * Allow reconfiguring chart without repo * mute linter * Cosmetics * Failing approach to parse manifests Relates to #30 * Report the error properly * ✅ Add test for dashboard/objects/data.go NewDataLayer (#199) * Fix problem of wrong namespace * Added unit tests for releases (#204) * Rework API routes (#197) * Bootstrap OpenAPI doc * Renaming some routes * Listing namespaces * k8s part of things * Repositories section * Document scanners API * One more API call * Progress * Reworked install flow * History endpoint * Textual info section * Resources endpoint * Rollback endpoint * Rollback endpoint * Unit tests * Cleanup * Forgotten tags * Fix tests * TODOs * Rework manifest scanning * add hasTests flag * Adding more information on UI for helm test API response (#195) * Hide test button when no tests Fixes #115 Improves #195 --------- Signed-off-by: OmAxiani0 <aximaniom@gmail.com> Co-authored-by: Om Aximani <75031769+OmAximani0@users.noreply.github.com> Co-authored-by: Harshit Mehta <hdm23061993@gmail.com> Co-authored-by: Harshit Mehta <harshitm@nvidia.com> Co-authored-by: Todd Turner <todd@toddtee.sh> Co-authored-by: arvindsundararajan98 <109727359+arvindsundararajan98@users.noreply.github.com>
130 lines
3.2 KiB
Go
130 lines
3.2 KiB
Go
package main
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"os"
|
|
"os/signal"
|
|
"strings"
|
|
"syscall"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
"github.com/jessevdk/go-flags"
|
|
"github.com/komodorio/helm-dashboard/pkg/dashboard"
|
|
"github.com/pkg/browser"
|
|
log "github.com/sirupsen/logrus"
|
|
)
|
|
|
|
var (
|
|
version = "0.0.0"
|
|
commit = "none"
|
|
date = "unknown"
|
|
)
|
|
|
|
type options struct {
|
|
Version bool `long:"version" description:"Show tool version"`
|
|
Verbose bool `short:"v" long:"verbose" description:"Show verbose debug information"`
|
|
NoBrowser bool `short:"b" long:"no-browser" description:"Do not attempt to open Web browser upon start"`
|
|
NoTracking bool `long:"no-analytics" description:"Disable user analytics (GA, DataDog etc.)"`
|
|
BindHost string `long:"bind" description:"Host binding to start server (default: localhost)"` // default should be printed but not assigned as the precedence: flag > env > default
|
|
Port uint `short:"p" long:"port" description:"Port to start server on" default:"8080"`
|
|
Namespace string `short:"n" long:"namespace" description:"Namespace for HELM operations"`
|
|
}
|
|
|
|
func main() {
|
|
opts := parseFlags()
|
|
if opts.BindHost == "" {
|
|
host := os.Getenv("HD_BIND")
|
|
if host == "" {
|
|
host = "localhost"
|
|
}
|
|
opts.BindHost = host
|
|
}
|
|
|
|
opts.Verbose = opts.Verbose || os.Getenv("DEBUG") != ""
|
|
setupLogging(opts.Verbose)
|
|
|
|
server := dashboard.Server{
|
|
Version: version,
|
|
Namespaces: strings.Split(opts.Namespace, ","),
|
|
Address: fmt.Sprintf("%s:%d", opts.BindHost, opts.Port),
|
|
Debug: opts.Verbose,
|
|
NoTracking: opts.NoTracking,
|
|
}
|
|
|
|
ctx, cancel := context.WithCancel(context.Background())
|
|
|
|
osSignal := make(chan os.Signal, 1)
|
|
signal.Notify(osSignal, os.Interrupt, syscall.SIGINT, syscall.SIGTERM)
|
|
go func() {
|
|
oscall := <-osSignal
|
|
log.Warnf("Stopping on signal: %s\n", oscall)
|
|
cancel()
|
|
}()
|
|
|
|
address, webServerDone, err := server.StartServer(ctx, cancel)
|
|
if err != nil {
|
|
log.Fatalf("Failed to start Helm Dashboard: %+v", err)
|
|
}
|
|
|
|
if !opts.NoTracking {
|
|
log.Infof("User analytics is collected to improve the quality, disable it with --no-analytics")
|
|
}
|
|
|
|
if opts.NoBrowser {
|
|
log.Infof("Access web UI at: %s", address)
|
|
} else {
|
|
log.Infof("Opening web UI: %s", address)
|
|
err := browser.OpenURL(address)
|
|
if err != nil {
|
|
log.Warnf("Failed to open Web browser for URL: %s", err)
|
|
}
|
|
}
|
|
|
|
<-webServerDone
|
|
log.Infof("Done.")
|
|
}
|
|
|
|
func parseFlags() options {
|
|
ns := os.Getenv("HELM_NAMESPACE")
|
|
if ns == "default" { // it's how Helm passes to plugin the empty NS, we have to reset it back
|
|
ns = ""
|
|
}
|
|
|
|
opts := options{Namespace: ns}
|
|
args, err := flags.Parse(&opts)
|
|
if err != nil {
|
|
if e, ok := err.(*flags.Error); ok {
|
|
if e.Type == flags.ErrHelp {
|
|
os.Exit(0)
|
|
}
|
|
}
|
|
|
|
// we rely on default behavior to print the problem inside `flags` library
|
|
os.Exit(1)
|
|
}
|
|
|
|
if opts.Version {
|
|
fmt.Println(version)
|
|
os.Exit(0)
|
|
}
|
|
|
|
if len(args) > 0 {
|
|
fmt.Println("The program does not take arguments, see --help for usage")
|
|
os.Exit(1)
|
|
}
|
|
return opts
|
|
}
|
|
|
|
func setupLogging(verbose bool) {
|
|
if verbose {
|
|
log.SetLevel(log.DebugLevel)
|
|
gin.SetMode(gin.DebugMode)
|
|
log.Debugf("Debug logging is enabled")
|
|
} else {
|
|
log.SetLevel(log.InfoLevel)
|
|
gin.SetMode(gin.ReleaseMode)
|
|
}
|
|
log.Infof("Helm Dashboard by Komodor, version %s (%s @ %s)", version, commit, date)
|
|
}
|