Skip to content

Commit 74a8187

Browse files
authored
add events to special secrets (nginx#6878)
1 parent ba34c0e commit 74a8187

File tree

1 file changed

+33
-13
lines changed

1 file changed

+33
-13
lines changed

cmd/nginx-ingress/main.go

Lines changed: 33 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ import (
3434
"github.com/prometheus/client_golang/prometheus"
3535
api_v1 "k8s.io/api/core/v1"
3636
meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
37+
pkg_runtime "k8s.io/apimachinery/pkg/runtime"
3738
util_version "k8s.io/apimachinery/pkg/util/version"
3839
"k8s.io/client-go/dynamic"
3940
"k8s.io/client-go/kubernetes"
@@ -75,6 +76,8 @@ const (
7576
appProtectVersionPath = "/opt/app_protect/RELEASE"
7677
appProtectv4BundleFolder = "/etc/nginx/waf/bundles/"
7778
appProtectv5BundleFolder = "/etc/app_protect/bundles/"
79+
fatalEventFlushTime = 200 * time.Millisecond
80+
secretErrorReason = "SecretError"
7881
)
7982

8083
func main() {
@@ -89,9 +92,14 @@ func main() {
8992

9093
buildOS := os.Getenv("BUILD_OS")
9194
controllerNamespace := os.Getenv("POD_NAMESPACE")
95+
podName := os.Getenv("POD_NAME")
9296

9397
config, kubeClient := mustCreateConfigAndKubeClient(ctx)
9498
mustValidateKubernetesVersionInfo(ctx, kubeClient)
99+
pod, err := kubeClient.CoreV1().Pods(controllerNamespace).Get(context.TODO(), podName, meta_v1.GetOptions{})
100+
if err != nil {
101+
nl.Fatalf(l, "Failed to get pod: %v", err)
102+
}
95103
eventBroadcaster := record.NewBroadcaster()
96104
eventBroadcaster.StartLogging(func(format string, args ...interface{}) {
97105
nl.Infof(l, format, args...)
@@ -101,6 +109,7 @@ func main() {
101109
})
102110
eventRecorder := eventBroadcaster.NewRecorder(scheme.Scheme,
103111
api_v1.EventSource{Component: "nginx-ingress-controller"})
112+
defer eventBroadcaster.Shutdown()
104113
mustValidateIngressClass(ctx, kubeClient)
105114

106115
checkNamespaces(ctx, kubeClient)
@@ -143,12 +152,17 @@ func main() {
143152

144153
templateExecutor, templateExecutorV2 := createTemplateExecutors(ctx)
145154

146-
sslRejectHandshake := processDefaultServerSecret(ctx, kubeClient, nginxManager)
147-
148-
isWildcardEnabled := processWildcardSecret(ctx, kubeClient, nginxManager)
155+
sslRejectHandshake, err := processDefaultServerSecret(kubeClient, nginxManager)
156+
if err != nil {
157+
logEventAndExit(ctx, eventRecorder, pod, secretErrorReason, err)
158+
}
149159

150160
staticSSLPath := nginxManager.GetSecretsDir()
151161

162+
isWildcardEnabled, err := processWildcardSecret(kubeClient, nginxManager)
163+
if err != nil {
164+
logEventAndExit(ctx, eventRecorder, pod, secretErrorReason, err)
165+
}
152166
globalConfigurationValidator := createGlobalConfigurationValidator()
153167

154168
mustProcessGlobalConfiguration(ctx)
@@ -562,14 +576,13 @@ func startChildProcesses(nginxManager nginx.Manager, appProtectV5 bool) childPro
562576
}
563577
}
564578

565-
func processDefaultServerSecret(ctx context.Context, kubeClient *kubernetes.Clientset, nginxManager nginx.Manager) bool {
566-
l := nl.LoggerFromContext(ctx)
579+
func processDefaultServerSecret(kubeClient *kubernetes.Clientset, nginxManager nginx.Manager) (bool, error) {
567580
var sslRejectHandshake bool
568581

569582
if *defaultServerSecret != "" {
570583
secret, err := getAndValidateSecret(kubeClient, *defaultServerSecret, api_v1.SecretTypeTLS)
571584
if err != nil {
572-
nl.Fatalf(l, "Error trying to get the default server TLS secret %v: %v", *defaultServerSecret, err)
585+
return sslRejectHandshake, fmt.Errorf("error trying to get the default server TLS secret %v: %w", *defaultServerSecret, err)
573586
}
574587

575588
bytes := configs.GenerateCertAndKeyFileContent(secret)
@@ -581,25 +594,25 @@ func processDefaultServerSecret(ctx context.Context, kubeClient *kubernetes.Clie
581594
// file doesn't exist - it is OK! we will reject TLS connections in the default server
582595
sslRejectHandshake = true
583596
} else {
584-
nl.Fatalf(l, "Error checking the default server TLS cert and key in %s: %v", configs.DefaultServerSecretPath, err)
597+
return sslRejectHandshake, fmt.Errorf("error checking the default server TLS cert and key in %s: %w", configs.DefaultServerSecretPath, err)
585598
}
586599
}
587600
}
588-
return sslRejectHandshake
601+
return sslRejectHandshake, nil
589602
}
590603

591-
func processWildcardSecret(ctx context.Context, kubeClient *kubernetes.Clientset, nginxManager nginx.Manager) bool {
592-
l := nl.LoggerFromContext(ctx)
593-
if *wildcardTLSSecret != "" {
604+
func processWildcardSecret(kubeClient *kubernetes.Clientset, nginxManager nginx.Manager) (bool, error) {
605+
isWildcardEnabled := *wildcardTLSSecret != ""
606+
if isWildcardEnabled {
594607
secret, err := getAndValidateSecret(kubeClient, *wildcardTLSSecret, api_v1.SecretTypeTLS)
595608
if err != nil {
596-
nl.Fatalf(l, "Error trying to get the wildcard TLS secret %v: %v", *wildcardTLSSecret, err)
609+
return false, fmt.Errorf("error trying to get the wildcard TLS secret %v: %w", *wildcardTLSSecret, err)
597610
}
598611

599612
bytes := configs.GenerateCertAndKeyFileContent(secret)
600613
nginxManager.CreateSecret(configs.WildcardSecretFileName, bytes, nginx.ReadWriteOnlyFileMode)
601614
}
602-
return *wildcardTLSSecret != ""
615+
return isWildcardEnabled, nil
603616
}
604617

605618
func createGlobalConfigurationValidator() *cr_validation.GlobalConfigurationValidator {
@@ -946,6 +959,13 @@ func updateSelfWithVersionInfo(ctx context.Context, eventLog record.EventRecorde
946959
}
947960
}
948961

962+
func logEventAndExit(ctx context.Context, eventLog record.EventRecorder, obj pkg_runtime.Object, reason string, err error) {
963+
l := nl.LoggerFromContext(ctx)
964+
eventLog.Eventf(obj, api_v1.EventTypeWarning, reason, err.Error())
965+
time.Sleep(fatalEventFlushTime) // wait for the event to be flushed
966+
nl.Fatal(l, err.Error())
967+
}
968+
949969
func initLogger(logFormat string, level slog.Level, out io.Writer) context.Context {
950970
programLevel := new(slog.LevelVar) // Info by default
951971
var h slog.Handler

0 commit comments

Comments
 (0)