Skip to content

Commit c2cba5f

Browse files
authored
test: fix the missing controller logs (#3117)
1 parent 9ef0375 commit c2cba5f

File tree

9 files changed

+97
-13
lines changed

9 files changed

+97
-13
lines changed

internal/cmd/rootcmd/run.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,12 @@ package rootcmd
33
import (
44
"fmt"
55

6+
"github.com/sirupsen/logrus"
7+
68
"github.com/kong/kubernetes-ingress-controller/v2/internal/manager"
79
)
810

11+
// Run starts the controller manager.
912
func Run(c *manager.Config) error {
1013
ctx, err := SetupSignalHandler(c)
1114
if err != nil {
@@ -18,3 +21,18 @@ func Run(c *manager.Config) error {
1821
}
1922
return manager.Run(ctx, c, diag.ConfigDumps)
2023
}
24+
25+
// RunWithLogger starts the controller manager.
26+
// This function is intended for use in tests, where the logger can be injected.
27+
func RunWithLogger(c *manager.Config, l logrus.FieldLogger) error {
28+
ctx, err := SetupSignalHandler(c)
29+
if err != nil {
30+
return fmt.Errorf("failed to setup signal handler: %w", err)
31+
}
32+
33+
diag, err := StartDiagnosticsServer(ctx, manager.DiagnosticsPort, c)
34+
if err != nil {
35+
return fmt.Errorf("failed to start diagnostics server: %w", err)
36+
}
37+
return manager.RunWithLogger(ctx, c, diag.ConfigDumps, l)
38+
}

internal/manager/run.go

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import (
1212
"github.com/avast/retry-go/v4"
1313
"github.com/blang/semver/v4"
1414
"github.com/kong/go-kong/kong"
15+
"github.com/sirupsen/logrus"
1516
"k8s.io/apimachinery/pkg/runtime"
1617
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
1718
clientgoscheme "k8s.io/client-go/kubernetes/scheme"
@@ -39,10 +40,16 @@ import (
3940

4041
// Run starts the controller manager and blocks until it exits.
4142
func Run(ctx context.Context, c *Config, diagnostic util.ConfigDumpDiagnostic) error {
42-
deprecatedLogger, _, err := setupLoggers(c)
43+
deprecatedLogger, _, err := SetupLoggers(c)
4344
if err != nil {
4445
return err
4546
}
47+
return RunWithLogger(ctx, c, diagnostic, deprecatedLogger)
48+
}
49+
50+
// RunWithLogger starts the controller manager and blocks until it exits.
51+
// This function is intended for use in tests, where the logger can be injected.
52+
func RunWithLogger(ctx context.Context, c *Config, diagnostic util.ConfigDumpDiagnostic, deprecatedLogger logrus.FieldLogger) error {
4653
setupLog := ctrl.Log.WithName("setup")
4754
setupLog.Info("starting controller manager", "release", metadata.Release, "repo", metadata.Repo, "commit", metadata.Commit)
4855
setupLog.V(util.DebugLevel).Info("the ingress class name has been set", "value", c.IngressClassName)

internal/manager/setup.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,8 @@ import (
3030
// Controller Manager - Setup Utility Functions
3131
// -----------------------------------------------------------------------------
3232

33-
func setupLoggers(c *Config) (logrus.FieldLogger, logr.Logger, error) {
33+
// SetupLoggers sets up the loggers for the controller manager.
34+
func SetupLoggers(c *Config) (logrus.FieldLogger, logr.Logger, error) {
3435
deprecatedLogger, err := util.MakeLogger(c.LogLevel, c.LogFormat)
3536
if err != nil {
3637
return nil, logr.Logger{}, fmt.Errorf("failed to make logger: %w", err)

internal/util/test/controller_manager.go

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,10 @@ import (
55
"fmt"
66
"os"
77

8+
"github.com/go-logr/logr"
89
"github.com/kong/kubernetes-testing-framework/pkg/clusters"
910
"github.com/kong/kubernetes-testing-framework/pkg/clusters/addons/kong"
11+
"github.com/sirupsen/logrus"
1012

1113
"github.com/kong/kubernetes-ingress-controller/v2/internal/cmd/rootcmd"
1214
"github.com/kong/kubernetes-ingress-controller/v2/internal/manager"
@@ -23,7 +25,7 @@ import (
2325
// Controller managers started this way will run in the background in a goroutine:
2426
// The caller must use the provided context.Context to stop the controller manager
2527
// from running when they're done with it.
26-
func DeployControllerManagerForCluster(ctx context.Context, cluster clusters.Cluster, additionalFlags ...string) error {
28+
func DeployControllerManagerForCluster(ctx context.Context, l logrus.FieldLogger, cluster clusters.Cluster, additionalFlags ...string) error {
2729
// ensure that the provided test cluster has a kongAddon deployed to it
2830
var kongAddon *kong.Addon
2931
for _, addon := range cluster.ListAddons() {
@@ -79,10 +81,27 @@ func DeployControllerManagerForCluster(ctx context.Context, cluster clusters.Clu
7981
go func() {
8082
defer os.Remove(kubeconfig.Name())
8183
fmt.Fprintf(os.Stderr, "INFO: Starting Controller Manager for Cluster %s with Configuration: %+v\n", cluster.Name(), config)
82-
if err := rootcmd.Run(&config); err != nil {
84+
if err := rootcmd.RunWithLogger(&config, l); err != nil {
8385
panic(err)
8486
}
8587
}()
8688

8789
return nil
8890
}
91+
92+
// SetupLoggers sets up the loggers for the controller manager.
93+
// The controller manager logs needs to be setup before the 30s timeout passes.
94+
// Given the cluster deployment takes time, there is a chance that the timeout
95+
// will pass before the controller manager logs are setup.
96+
// This function can be used to sets up the loggers for the controller manager
97+
// before the cluster deployment.
98+
func SetupLoggers(logLevel string, logFormat string, logReduceRedundancy bool) (logrus.FieldLogger, logr.Logger, error) {
99+
// construct the config for the logger
100+
config := manager.Config{
101+
LogLevel: logLevel,
102+
LogFormat: logFormat,
103+
LogReduceRedundancy: logReduceRedundancy,
104+
}
105+
106+
return manager.SetupLoggers(&config)
107+
}

test/conformance/gateway_conformance_test.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,8 @@ func TestGatewayConformance(t *testing.T) {
5050
"--feature-gates=GatewayAlpha=true",
5151
"--anonymous-reports=false",
5252
}
53-
require.NoError(t, testutils.DeployControllerManagerForCluster(ctx, env.Cluster(), args...))
53+
54+
require.NoError(t, testutils.DeployControllerManagerForCluster(ctx, globalLogger, env.Cluster(), args...))
5455

5556
t.Log("creating GatewayClass for gateway conformance tests")
5657
gwc := &gatewayv1beta1.GatewayClass{

test/conformance/suite_test.go

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,26 +14,41 @@ import (
1414
"github.com/kong/kubernetes-testing-framework/pkg/clusters/addons/metallb"
1515
"github.com/kong/kubernetes-testing-framework/pkg/clusters/types/kind"
1616
"github.com/kong/kubernetes-testing-framework/pkg/environments"
17+
"github.com/sirupsen/logrus"
18+
19+
testutils "github.com/kong/kubernetes-ingress-controller/v2/internal/util/test"
1720
)
1821

1922
var (
2023
existingCluster = os.Getenv("KONG_TEST_CLUSTER")
2124
ingressClass = "kong-conformance-tests"
2225

23-
env environments.Environment
24-
ctx context.Context
26+
env environments.Environment
27+
ctx context.Context
28+
globalLogger logrus.FieldLogger
2529
)
2630

2731
func TestMain(m *testing.M) {
2832
var cancel context.CancelFunc
2933
ctx, cancel = context.WithCancel(context.Background())
3034
defer cancel()
3135

36+
// Logger needs to be configured before anything else happens.
37+
// This is because the controller manager has a timeout for
38+
// logger initialization, and if the logger isn't configured
39+
// after 30s from the start of controller manager package init function,
40+
// the controller manager will set up a no op logger and continue.
41+
// The logger cannot be configured after that point.
42+
logger, _, err := testutils.SetupLoggers("trace", "text", false)
43+
if err != nil {
44+
exitOnErr(fmt.Errorf("failed to setup loggers: %w", err))
45+
}
46+
globalLogger = logger
47+
3248
kongAddon := kong.NewBuilder().WithControllerDisabled().WithProxyAdminServiceTypeLoadBalancer().Build()
3349
builder := environments.NewBuilder().WithAddons(metallb.New(), kongAddon)
3450
useExistingClusterIfPresent(builder)
3551

36-
var err error
3752
env, err = builder.Build(ctx)
3853
exitOnErr(err)
3954
defer func() {

test/e2e/istio_test.go

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,15 @@ func TestIstioWithKongIngressGateway(t *testing.T) {
5959
ctx, cancel := context.WithCancel(context.Background())
6060
defer cancel()
6161

62+
// Logger needs to be configured before anything else happens.
63+
// This is because the controller manager has a timeout for
64+
// logger initialization, and if the logger isn't configured
65+
// after 30s from the start of controller manager package init function,
66+
// the controller manager will set up a no op logger and continue.
67+
// The logger cannot be configured after that point.
68+
logger, _, err := testutils.SetupLoggers("trace", "text", false)
69+
require.NoError(t, err, "failed to configure logger")
70+
6271
t.Log("configuring cluster addons for the testing environment")
6372
metallbAddon := metallb.New()
6473
kongBuilder := kong.NewBuilder().
@@ -111,7 +120,7 @@ func TestIstioWithKongIngressGateway(t *testing.T) {
111120
}, time.Minute, time.Second)
112121

113122
t.Log("starting the controller manager")
114-
require.NoError(t, testutils.DeployControllerManagerForCluster(ctx, env.Cluster(), "--log-level=debug"))
123+
require.NoError(t, testutils.DeployControllerManagerForCluster(ctx, logger, env.Cluster(), "--log-level=debug"))
115124

116125
t.Log("creating a new mesh-enabled namespace for testing http traffic")
117126
namespace := &corev1.Namespace{

test/integration/suite_test.go

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,17 @@ func TestMain(m *testing.M) {
8383
ctx, cancel = context.WithCancel(context.Background())
8484
defer cancel()
8585

86+
// Logger needs to be configured before anything else happens.
87+
// This is because the controller manager has a timeout for
88+
// logger initialization, and if the logger isn't configured
89+
// after 30s from the start of controller manager package init function,
90+
// the controller manager will set up a no op logger and continue.
91+
// The logger cannot be configured after that point.
92+
logger, _, err := testutils.SetupLoggers("trace", "text", false)
93+
if err != nil {
94+
exitOnErrWithCode(fmt.Errorf("failed to setup loggers: %w", err), ExitCodeCantCreateLogger)
95+
}
96+
8697
fmt.Println("INFO: setting up test environment")
8798
kongbuilder, extraControllerArgs := generateKongBuilder()
8899
kongAddon := kongbuilder.Build()
@@ -129,7 +140,6 @@ func TestMain(m *testing.M) {
129140
}
130141

131142
fmt.Println("INFO: building test environment")
132-
var err error
133143
env, err = builder.Build(ctx)
134144
exitOnErr(err)
135145
k8sClient = env.Cluster().Client()
@@ -200,14 +210,14 @@ func TestMain(m *testing.M) {
200210
fmt.Sprintf("--admission-webhook-listen=0.0.0.0:%d", testutils.AdmissionWebhookListenPort),
201211
"--profiling",
202212
"--dump-config",
203-
"--log-level=trace",
204-
"--debug-log-reduce-redundancy",
213+
"--log-level=trace", // not used, as controller logger is configured separately
214+
"--debug-log-reduce-redundancy", // not used, as controller logger is configured separately
205215
"--anonymous-reports=false",
206216
fmt.Sprintf("--feature-gates=%s", controllerFeatureGates),
207217
fmt.Sprintf("--election-namespace=%s", kongAddon.Namespace()),
208218
}
209219
allControllerArgs := append(standardControllerArgs, extraControllerArgs...)
210-
exitOnErr(testutils.DeployControllerManagerForCluster(ctx, env.Cluster(), allControllerArgs...))
220+
exitOnErr(testutils.DeployControllerManagerForCluster(ctx, logger, env.Cluster(), allControllerArgs...))
211221
}
212222

213223
gatewayClient, err := gatewayclient.NewForConfig(env.Cluster().Config())

test/integration/utils_test.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,10 @@ const (
175175
// problems setting up the testing environment and/or cluster.
176176
ExitCodeEnvSetupFailed = 104
177177

178+
// ExitCodeCentCreateLogger is a POSIX compliant exit code for the test suite to indicate
179+
// that a failure occurred when trying to create a logger for the test suite.
180+
ExitCodeCantCreateLogger = 105
181+
178182
// kongTestPassword is used as a password only within the context of transient integration test runs
179183
// and is left static to help developers debug failures in those testing environments.
180184
kongTestPassword = "password"

0 commit comments

Comments
 (0)