Newer
Older
EnvoyControlPlane / main.go
// cmd/main.go
package main

import (
	"context"
	"flag"
	"os"
	"os/signal"
	"syscall"

	"envoy-control-plane/internal/app"
	"envoy-control-plane/internal/config"
	internallog "envoy-control-plane/internal/log"

	"k8s.io/klog/v2"
)

func main() {
	// 1. Initialize and Parse Flags
	config.InitFlags()
	flag.Parse()
	defer klog.Flush()

	// 2. Setup Logger and Root Context
	logger := internallog.NewDefaultLogger()
	ctx := internallog.WithLogger(context.Background(), logger)
	log := internallog.LogFromContext(ctx)

	// 3. Create a cancellable context for graceful shutdown
	ctx, cancel := context.WithCancel(ctx)

	// 4. Setup signal listener (SIGINT, SIGTERM)
	sigChan := make(chan os.Signal, 2)
	signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM)

	go func() {
		sig := <-sigChan
		log.Infof("Received signal: %v. Initiating graceful shutdown...", sig)
		cancel() // propagate shutdown to app.Run

		// If user presses Ctrl+C again → force exit immediately.
		sig = <-sigChan
		log.Errorf("Received second signal: %v. Forcing exit.", sig)
		os.Exit(1)
	}()

	// 5. Run main application
	if err := app.Run(ctx); err != nil {
		log.Errorf("Application failed: %v", err)
		os.Exit(1)
	}

	log.Infof("Process exited cleanly.")
}