// 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.")
}