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  }