diff --git a/daemon/cmd/daemon_main.go b/daemon/cmd/daemon_main.go index 139970f3580b1..ae0c9c3bea3ac 100644 --- a/daemon/cmd/daemon_main.go +++ b/daemon/cmd/daemon_main.go @@ -1713,12 +1713,19 @@ func newDaemonPromise(params daemonParams) promise.Promise[*Daemon] { OnStart: func(cell.HookContext) error { d, restoredEndpoints, err := newDaemon(daemonCtx, cleaner, ¶ms) if err != nil { + cancelDaemonCtx() + cleaner.Clean() return fmt.Errorf("daemon creation failed: %w", err) } daemon = d if !option.Config.DryMode { - startDaemon(daemon, restoredEndpoints, cleaner, params) + if err := startDaemon(daemon, restoredEndpoints, cleaner, params); err != nil { + daemonResolver.Reject(err) + cancelDaemonCtx() + cleaner.Clean() + return err + } } daemonResolver.Resolve(daemon) @@ -1726,9 +1733,6 @@ func newDaemonPromise(params daemonParams) promise.Promise[*Daemon] { }, OnStop: func(cell.HookContext) error { cancelDaemonCtx() - if daemon.statusCollector != nil { - daemon.statusCollector.Close() - } cleaner.Clean() wg.Wait() return nil @@ -1738,14 +1742,14 @@ func newDaemonPromise(params daemonParams) promise.Promise[*Daemon] { } // startDaemon starts the old unmodular part of the cilium-agent. -func startDaemon(d *Daemon, restoredEndpoints *endpointRestoreState, cleaner *daemonCleanup, params daemonParams) { +func startDaemon(d *Daemon, restoredEndpoints *endpointRestoreState, cleaner *daemonCleanup, params daemonParams) error { log.Info("Initializing daemon") // This validation needs to be done outside of the agent until // datapath.NodeAddressing is used consistently across the code base. log.Info("Validating configured node address ranges") if err := node.ValidatePostInit(); err != nil { - log.Fatalf("postinit failed: %s", err) + return fmt.Errorf("postinit failed: %w", err) } bootstrapStats.enableConntrack.Start() @@ -1774,11 +1778,11 @@ func startDaemon(d *Daemon, restoredEndpoints *endpointRestoreState, cleaner *da d.endpointManager.InitHostEndpointLabels(d.ctx) } else { log.Info("Creating host endpoint") - if err := d.endpointManager.AddHostEndpoint( + err := d.endpointManager.AddHostEndpoint( d.ctx, d, d, d.ipcache, d.l7Proxy, d.identityAllocator, - "Create host endpoint", nodeTypes.GetName(), - ); err != nil { - log.Fatalf("unable to create host endpoint: %s", err) + "Create host endpoint", nodeTypes.GetName()) + if err != nil { + return fmt.Errorf("unable to create host endpoint: %w", err) } } @@ -1791,11 +1795,11 @@ func startDaemon(d *Daemon, restoredEndpoints *endpointRestoreState, cleaner *da log.Warn("Ingress IPs are not available, skipping creation of the Ingress Endpoint: Policy enforcement on Cilium Ingress will not work as expected.") } else { log.Info("Creating ingress endpoint") - if err := d.endpointManager.AddIngressEndpoint( + err := d.endpointManager.AddIngressEndpoint( d.ctx, d, d, d.ipcache, d.l7Proxy, d.identityAllocator, - "Create ingress endpoint", - ); err != nil { - log.Fatalf("unable to create ingress endpoint: %s", err) + "Create ingress endpoint") + if err != nil { + return fmt.Errorf("unable to create ingress endpoint: %w", err) } } } @@ -1804,7 +1808,7 @@ func startDaemon(d *Daemon, restoredEndpoints *endpointRestoreState, cleaner *da if option.Config.EnableIPMasqAgent { ipmasqAgent, err := ipmasq.NewIPMasqAgent(option.Config.IPMasqAgentConfigPath) if err != nil { - log.Fatalf("failed to create ipmasq agent: %s", err) + return fmt.Errorf("failed to create ipmasq agent: %w", err) } ipmasqAgent.Start() } @@ -1906,6 +1910,8 @@ func startDaemon(d *Daemon, restoredEndpoints *endpointRestoreState, cleaner *da if err != nil { log.WithError(err).Error("Unable to store Viper's configuration") } + + return nil } func newRestorerPromise(lc cell.Lifecycle, daemonPromise promise.Promise[*Daemon]) promise.Promise[endpointstate.Restorer] { diff --git a/daemon/cmd/status.go b/daemon/cmd/status.go index 3c9963499dcd5..72a60a4856e5a 100644 --- a/daemon/cmd/status.go +++ b/daemon/cmd/status.go @@ -1128,5 +1128,7 @@ func (d *Daemon) startStatusCollector(cleaner *daemonCleanup) { }).Error("KVStore state not OK") } + + d.statusCollector.Close() }) }