github.com/navikt/knorten@v0.0.0-20240419132333-1333f46ed8b6/main.go (about) 1 package main 2 3 import ( 4 "context" 5 "flag" 6 "html/template" 7 "net" 8 "time" 9 10 "github.com/gin-gonic/gin" 11 "github.com/navikt/knorten/pkg/api" 12 "github.com/navikt/knorten/pkg/api/auth" 13 "github.com/navikt/knorten/pkg/api/handlers" 14 "github.com/navikt/knorten/pkg/api/middlewares" 15 "github.com/navikt/knorten/pkg/api/service" 16 "github.com/navikt/knorten/pkg/config" 17 "github.com/navikt/knorten/pkg/database" 18 "github.com/navikt/knorten/pkg/events" 19 "github.com/navikt/knorten/pkg/helm" 20 "github.com/navikt/knorten/pkg/imageupdater" 21 "github.com/sirupsen/logrus" 22 ) 23 24 const ( 25 imageUpdaterFrequency = 24 * time.Hour 26 ) 27 28 var configFilePath = flag.String("config", "config.yaml", "path to config file") 29 30 func main() { 31 log := logrus.New() 32 log.SetFormatter(&logrus.JSONFormatter{}) 33 34 flag.Parse() 35 36 fileParts, err := config.ProcessConfigPath(*configFilePath) 37 if err != nil { 38 log.WithError(err).Fatal("processing config path") 39 40 return 41 } 42 43 cfg, err := config.NewFileSystemLoader().Load(fileParts.FileName, fileParts.Path, "KNORTEN") 44 if err != nil { 45 log.WithError(err).Fatal("loading config") 46 47 return 48 } 49 50 err = cfg.Validate() 51 if err != nil { 52 log.WithError(err).Fatal("validating config") 53 54 return 55 } 56 57 dbClient, err := database.New(cfg.Postgres.ConnectionString(), cfg.DBEncKey, log.WithField("subsystem", "db")) 58 if err != nil { 59 log.WithError(err).Fatal("setting up database") 60 return 61 } 62 63 azureClient, err := auth.NewAzureClient( 64 cfg.DryRun, 65 cfg.Oauth.ClientID, 66 cfg.Oauth.ClientSecret, 67 cfg.Oauth.TenantID, 68 log.WithField("subsystem", "auth"), 69 ) 70 if err != nil { 71 log.WithError(err).Fatal("creating azure client") 72 return 73 } 74 75 if !cfg.DryRun { 76 imageUpdater := imageupdater.NewClient(dbClient, log.WithField("subsystem", "imageupdater")) 77 go imageUpdater.Run(imageUpdaterFrequency) 78 79 if err := helm.UpdateHelmRepositories(); err != nil { 80 log.WithError(err).Fatal("updating helm repositories") 81 } 82 } 83 84 eventHandler, err := events.NewHandler( 85 context.Background(), 86 dbClient, 87 azureClient, 88 cfg.GCP.Project, 89 cfg.GCP.Region, 90 cfg.GCP.Zone, 91 cfg.Helm.AirflowChartVersion, 92 cfg.Helm.JupyterChartVersion, 93 cfg.DryRun, 94 cfg.InCluster, 95 log.WithField("subsystem", "events"), 96 ) 97 if err != nil { 98 log.WithError(err).Fatal("starting event watcher") 99 return 100 } 101 eventHandler.Run(10 * time.Second) 102 103 router := gin.New() 104 105 session, err := dbClient.NewSessionStore(cfg.SessionKey) 106 if err != nil { 107 log.WithError(err).Fatal("creating session store") 108 109 return 110 } 111 112 adminGroupID, err := azureClient.GetGroupID(cfg.AdminGroup) 113 if err != nil { 114 log.WithError(err).Fatal("getting admin group id") 115 116 return 117 } 118 119 authService := service.NewAuthService( 120 dbClient, 121 adminGroupID, 122 1*time.Hour, 123 32, 124 azureClient, 125 ) 126 127 authHandler := handlers.NewAuthHandler( 128 authService, 129 cfg.LoginPage, 130 cfg.Cookies, 131 log.WithField("subsystem", "auth"), 132 dbClient, 133 ) 134 135 router.Use(session) 136 router.Static("/assets", "./assets") 137 router.FuncMap = template.FuncMap{ 138 "toArray": toArray, 139 } 140 router.LoadHTMLGlob("templates/**/*") 141 router.Use(middlewares.SetSessionStatus(log.WithField("subsystem", "status_middleware"), cfg.Cookies.Session.Name, dbClient)) 142 router.GET("/", handlers.IndexHandler) 143 router.GET("/oauth2/login", authHandler.LoginHandler(cfg.DryRun)) 144 router.GET("/oauth2/callback", authHandler.CallbackHandler()) 145 router.GET("/oauth2/logout", authHandler.LogoutHandler()) 146 router.Use(middlewares.Authenticate( 147 log.WithField("subsystem", "authentication"), 148 dbClient, 149 azureClient, 150 cfg.DryRun, 151 )) 152 153 err = api.New(router, dbClient, azureClient, log.WithField("subsystem", "api"), cfg.DryRun, cfg.GCP.Project, cfg.GCP.Zone) 154 if err != nil { 155 log.WithError(err).Fatal("creating api") 156 return 157 } 158 159 err = router.Run(net.JoinHostPort(cfg.Server.Hostname, cfg.Server.Port)) 160 if err != nil { 161 log.WithError(err).Fatal("running api") 162 163 return 164 } 165 } 166 167 // Need to move this 168 func toArray(args ...any) []any { 169 return args 170 }