From bf726f7880887d8e0a01cc8e4764dc13f63c8e1e Mon Sep 17 00:00:00 2001 From: Ciara Stacke Date: Wed, 6 Sep 2023 12:55:42 +0100 Subject: [PATCH 1/7] Ensure reload occurs --- docs/architecture.md | 11 +- docs/images/nkg-pod.png | Bin 125453 -> 131746 bytes internal/mode/static/handler.go | 4 +- internal/mode/static/handler_test.go | 2 +- internal/mode/static/manager.go | 2 +- .../config/configfakes/fake_generator.go | 23 ++-- .../mode/static/nginx/config/generator.go | 31 +++++- .../static/nginx/config/generator_test.go | 10 +- internal/mode/static/nginx/config/version.go | 13 +++ .../static/nginx/config/version_template.go | 14 +++ .../mode/static/nginx/config/version_test.go | 21 ++++ internal/mode/static/nginx/runtime/manager.go | 76 ++++++++++--- .../mode/static/nginx/runtime/manager_test.go | 103 ++++++++++++++++++ .../runtime/runtimefakes/fake_manager.go | 18 +-- internal/mode/static/nginx/runtime/verify.go | 92 ++++++++++++++++ .../mode/static/nginx/runtime/verify_test.go | 74 +++++++++++++ .../static/state/conditions/conditions.go | 4 +- 17 files changed, 448 insertions(+), 50 deletions(-) create mode 100644 internal/mode/static/nginx/config/version.go create mode 100644 internal/mode/static/nginx/config/version_template.go create mode 100644 internal/mode/static/nginx/config/version_test.go create mode 100644 internal/mode/static/nginx/runtime/verify.go create mode 100644 internal/mode/static/nginx/runtime/verify_test.go diff --git a/docs/architecture.md b/docs/architecture.md index 3eabd49f65..026135587e 100644 --- a/docs/architecture.md +++ b/docs/architecture.md @@ -106,7 +106,7 @@ API to update the handled resources' statuses and emit events. - Read: *NKG* reads the PID file `nginx.pid` from the `nginx-run` volume, located at `/var/run/nginx`. *NKG* extracts the PID of the nginx process from this file in order to send reload signals to *NGINX master*. 4. (File I/O) *NKG* writes logs to its *stdout* and *stderr*, which are collected by the container runtime. -5. (HTTP) *NKG* fetches the NGINX metrics via the unix:/var/lib/nginx/nginx-status.sock UNIX socket and converts it to +5. (HTTP) *NKG* fetches the NGINX metrics via the unix:/var/run/nginx/nginx-status.sock UNIX socket and converts it to *Prometheus* format used in #2. 6. (Signal) To reload NGINX, *NKG* sends the [reload signal][reload] to the **NGINX master**. 7. (File I/O) @@ -124,9 +124,12 @@ API to update the handled resources' statuses and emit events. 9. (File I/O) The *NGINX master* sends logs to its *stdout* and *stderr*, which are collected by the container runtime. 10. (File I/O) An *NGINX worker* writes logs to its *stdout* and *stderr*, which are collected by the container runtime. 11. (Signal) The *NGINX master* controls the [lifecycle of *NGINX workers*][lifecycle] it creates workers with the new -configuration and shutdowns workers with the old configuration. -12. (HTTP,HTTPS) A *client* sends traffic to and receives traffic from any of the *NGINX workers* on ports 80 and 443. -13. (HTTP,HTTPS) An *NGINX worker* sends traffic to and receives traffic from the *backends*. + configuration and shutdowns workers with the old configuration. +12. (HTTP) To consider a configuration reload a success, *NKG* ensures that at least one NGINX worker has the new + configuration. To do that, *NKG* checks a particular endpoint via the unix:/var/run/nginx/nginx-config-version.sock + UNIX socket. +13. (HTTP,HTTPS) A *client* sends traffic to and receives traffic from any of the *NGINX workers* on ports 80 and 443. +14. (HTTP,HTTPS) An *NGINX worker* sends traffic to and receives traffic from the *backends*. [controller]: https://kubernetes.io/docs/concepts/architecture/controller/ diff --git a/docs/images/nkg-pod.png b/docs/images/nkg-pod.png index 7af069f20167eda9536b6cdc48904c343b0133ef..48e2e60a35a2a4c39981817b6aa7ff0f93c4a1f4 100644 GIT binary patch literal 131746 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

M~Q@8qwa~spxh!hB&RYP&tuk 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 }Qo-{2l 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 diff --git a/internal/mode/static/handler.go b/internal/mode/static/handler.go index 17427964db..c5c69ca768 100644 --- a/internal/mode/static/handler.go +++ b/internal/mode/static/handler.go @@ -101,13 +101,13 @@ func (h *eventHandlerImpl) HandleEventBatch(ctx context.Context, batch events.Ev } func (h *eventHandlerImpl) updateNginx(ctx context.Context, conf dataplane.Configuration) error { - files := h.cfg.generator.Generate(conf) + files, configVersion := h.cfg.generator.Generate(conf) if err := h.cfg.nginxFileMgr.ReplaceFiles(files); err != nil { return fmt.Errorf("failed to replace NGINX configuration files: %w", err) } - if err := h.cfg.nginxRuntimeMgr.Reload(ctx); err != nil { + if err := h.cfg.nginxRuntimeMgr.Reload(ctx, configVersion); err != nil { return fmt.Errorf("failed to reload NGINX: %w", err) } diff --git a/internal/mode/static/handler_test.go b/internal/mode/static/handler_test.go index d3299e8ebf..c0393e8f4d 100644 --- a/internal/mode/static/handler_test.go +++ b/internal/mode/static/handler_test.go @@ -100,7 +100,7 @@ var _ = Describe("eventHandler", func() { BeforeEach(func() { fakeProcessor.ProcessReturns(true /* changed */, &graph.Graph{}) - fakeGenerator.GenerateReturns(fakeCfgFiles) + fakeGenerator.GenerateReturns(fakeCfgFiles, 1) }) When("a batch has one event", func() { diff --git a/internal/mode/static/manager.go b/internal/mode/static/manager.go index ac5a239775..be8599738d 100644 --- a/internal/mode/static/manager.go +++ b/internal/mode/static/manager.go @@ -212,7 +212,7 @@ func StartManager(cfg config.Config) error { eventHandler := newEventHandlerImpl(eventHandlerConfig{ processor: processor, serviceResolver: resolver.NewServiceResolverImpl(mgr.GetClient()), - generator: configGenerator, + generator: &configGenerator, logger: cfg.Logger.WithName("eventHandler"), logLevelSetter: logLevelSetter, nginxFileMgr: nginxFileMgr, diff --git a/internal/mode/static/nginx/config/configfakes/fake_generator.go b/internal/mode/static/nginx/config/configfakes/fake_generator.go index 4b058a3553..a9afbdb659 100644 --- a/internal/mode/static/nginx/config/configfakes/fake_generator.go +++ b/internal/mode/static/nginx/config/configfakes/fake_generator.go @@ -10,22 +10,24 @@ import ( ) type FakeGenerator struct { - GenerateStub func(dataplane.Configuration) []file.File + GenerateStub func(dataplane.Configuration) ([]file.File, int) generateMutex sync.RWMutex generateArgsForCall []struct { arg1 dataplane.Configuration } generateReturns struct { result1 []file.File + result2 int } generateReturnsOnCall map[int]struct { result1 []file.File + result2 int } invocations map[string][][]interface{} invocationsMutex sync.RWMutex } -func (fake *FakeGenerator) Generate(arg1 dataplane.Configuration) []file.File { +func (fake *FakeGenerator) Generate(arg1 dataplane.Configuration) ([]file.File, int) { fake.generateMutex.Lock() ret, specificReturn := fake.generateReturnsOnCall[len(fake.generateArgsForCall)] fake.generateArgsForCall = append(fake.generateArgsForCall, struct { @@ -39,9 +41,9 @@ func (fake *FakeGenerator) Generate(arg1 dataplane.Configuration) []file.File { return stub(arg1) } if specificReturn { - return ret.result1 + return ret.result1, ret.result2 } - return fakeReturns.result1 + return fakeReturns.result1, fakeReturns.result2 } func (fake *FakeGenerator) GenerateCallCount() int { @@ -50,7 +52,7 @@ func (fake *FakeGenerator) GenerateCallCount() int { return len(fake.generateArgsForCall) } -func (fake *FakeGenerator) GenerateCalls(stub func(dataplane.Configuration) []file.File) { +func (fake *FakeGenerator) GenerateCalls(stub func(dataplane.Configuration) ([]file.File, int)) { fake.generateMutex.Lock() defer fake.generateMutex.Unlock() fake.GenerateStub = stub @@ -63,27 +65,30 @@ func (fake *FakeGenerator) GenerateArgsForCall(i int) dataplane.Configuration { return argsForCall.arg1 } -func (fake *FakeGenerator) GenerateReturns(result1 []file.File) { +func (fake *FakeGenerator) GenerateReturns(result1 []file.File, result2 int) { fake.generateMutex.Lock() defer fake.generateMutex.Unlock() fake.GenerateStub = nil fake.generateReturns = struct { result1 []file.File - }{result1} + result2 int + }{result1, result2} } -func (fake *FakeGenerator) GenerateReturnsOnCall(i int, result1 []file.File) { +func (fake *FakeGenerator) GenerateReturnsOnCall(i int, result1 []file.File, result2 int) { fake.generateMutex.Lock() defer fake.generateMutex.Unlock() fake.GenerateStub = nil if fake.generateReturnsOnCall == nil { fake.generateReturnsOnCall = make(map[int]struct { result1 []file.File + result2 int }) } fake.generateReturnsOnCall[i] = struct { result1 []file.File - }{result1} + result2 int + }{result1, result2} } func (fake *FakeGenerator) Invocations() map[string][][]interface{} { diff --git a/internal/mode/static/nginx/config/generator.go b/internal/mode/static/nginx/config/generator.go index 1956a03664..c015a94261 100644 --- a/internal/mode/static/nginx/config/generator.go +++ b/internal/mode/static/nginx/config/generator.go @@ -20,6 +20,9 @@ const ( // httpConfigFile is the path to the configuration file with HTTP configuration. httpConfigFile = httpFolder + "/http.conf" + + // configVersionFile is the path to the config version configuration file. + configVersionFile = httpFolder + "/config-version.conf" ) // ConfigFolders is a list of folders where NGINX configuration files are stored. @@ -29,7 +32,7 @@ var ConfigFolders = []string{httpFolder, secretsFolder} // This interface is used for testing purposes only. type Generator interface { // Generate generates NGINX configuration files from internal representation. - Generate(configuration dataplane.Configuration) []file.File + Generate(configuration dataplane.Configuration) ([]file.File, int) } // GeneratorImpl is an implementation of Generator. @@ -40,11 +43,15 @@ type Generator interface { // // It also expects that the main NGINX configuration file nginx.conf is located in configFolder and nginx.conf // includes (https://nginx.org/en/docs/ngx_core_module.html#include) the files from httpFolder. -type GeneratorImpl struct{} +type GeneratorImpl struct { + configVersion int +} // NewGeneratorImpl creates a new GeneratorImpl. func NewGeneratorImpl() GeneratorImpl { - return GeneratorImpl{} + return GeneratorImpl{ + configVersion: 0, + } } // executeFunc is a function that generates NGINX configuration from internal representation. @@ -54,7 +61,8 @@ type executeFunc func(configuration dataplane.Configuration) []byte // It is the responsibility of the caller to validate the configuration before calling this function. // In case of invalid configuration, NGINX will fail to reload or could be configured with malicious configuration. // To validate, use the validators from the validation package. -func (g GeneratorImpl) Generate(conf dataplane.Configuration) []file.File { +func (g *GeneratorImpl) Generate(conf dataplane.Configuration) ([]file.File, int) { + g.configVersion++ files := make([]file.File, 0, len(conf.SSLKeyPairs)+1 /* http config */) for id, pair := range conf.SSLKeyPairs { @@ -63,7 +71,9 @@ func (g GeneratorImpl) Generate(conf dataplane.Configuration) []file.File { files = append(files, generateHTTPConfig(conf)) - return files + files = append(files, generateConfigVersion(g.configVersion)) + + return files, g.configVersion } func generatePEM(id dataplane.SSLKeyPairID, cert []byte, key []byte) file.File { @@ -104,3 +114,14 @@ func getExecuteFuncs() []executeFunc { executeMaps, } } + +// generateConfigVersion writes the config version file. +func generateConfigVersion(configVersion int) file.File { + c := executeVersion(configVersion) + + return file.File{ + Content: c, + Path: configVersionFile, + Type: file.TypeRegular, + } +} diff --git a/internal/mode/static/nginx/config/generator_test.go b/internal/mode/static/nginx/config/generator_test.go index 3d64174dad..8dbd6423ec 100644 --- a/internal/mode/static/nginx/config/generator_test.go +++ b/internal/mode/static/nginx/config/generator_test.go @@ -1,6 +1,7 @@ package config_test import ( + "fmt" "testing" . "github.com/onsi/gomega" @@ -63,9 +64,9 @@ func TestGenerate(t *testing.T) { generator := config.NewGeneratorImpl() - files := generator.Generate(conf) + files, version := generator.Generate(conf) - g.Expect(files).To(HaveLen(2)) + g.Expect(files).To(HaveLen(3)) g.Expect(files[0]).To(Equal(file.File{ Type: file.TypeSecret, @@ -82,4 +83,9 @@ func TestGenerate(t *testing.T) { g.Expect(httpCfg).To(ContainSubstring("listen 443")) g.Expect(httpCfg).To(ContainSubstring("upstream")) g.Expect(httpCfg).To(ContainSubstring("split_clients")) + + g.Expect(files[2].Type).To(Equal(file.TypeRegular)) + g.Expect(files[2].Path).To(Equal("/etc/nginx/conf.d/config-version.conf")) + configVersion := string(files[2].Content) + g.Expect(configVersion).To(ContainSubstring(fmt.Sprintf("return 200 %d", version))) } diff --git a/internal/mode/static/nginx/config/version.go b/internal/mode/static/nginx/config/version.go new file mode 100644 index 0000000000..c5ac52e2d2 --- /dev/null +++ b/internal/mode/static/nginx/config/version.go @@ -0,0 +1,13 @@ +package config + +import ( + gotemplate "text/template" +) + +var versionTemplate = gotemplate.Must(gotemplate.New("version").Parse(versionTemplateText)) + +func executeVersion(version int) []byte { + data := make(map[string]int, 1) + data["Version"] = version + return execute(versionTemplate, data) +} diff --git a/internal/mode/static/nginx/config/version_template.go b/internal/mode/static/nginx/config/version_template.go new file mode 100644 index 0000000000..cd76938835 --- /dev/null +++ b/internal/mode/static/nginx/config/version_template.go @@ -0,0 +1,14 @@ +package config + +var versionTemplateText = `server { + listen unix:/var/run/nginx/nginx-config-version.sock; + access_log off; + + location /configVersion { + return 200 {{.Version}}; + } +} +map $http_x_expected_config_version $config_version_mismatch { + "{{.Version}}" ""; + default "mismatch"; +}` diff --git a/internal/mode/static/nginx/config/version_test.go b/internal/mode/static/nginx/config/version_test.go new file mode 100644 index 0000000000..2c84d92f5d --- /dev/null +++ b/internal/mode/static/nginx/config/version_test.go @@ -0,0 +1,21 @@ +package config + +import ( + "strings" + "testing" + + . "github.com/onsi/gomega" +) + +func TestExecuteVersion(t *testing.T) { + g := NewGomegaWithT(t) + expSubStrings := map[string]int{ + "return 200 42;": 1, + `"42" ""`: 1, + } + + maps := string(executeVersion(42)) + for expSubStr, expCount := range expSubStrings { + g.Expect(expCount).To(Equal(strings.Count(maps, expSubStr))) + } +} diff --git a/internal/mode/static/nginx/runtime/manager.go b/internal/mode/static/nginx/runtime/manager.go index 957d7f491e..9703870507 100644 --- a/internal/mode/static/nginx/runtime/manager.go +++ b/internal/mode/static/nginx/runtime/manager.go @@ -1,6 +1,7 @@ package runtime import ( + "bytes" "context" "errors" "fmt" @@ -15,8 +16,10 @@ import ( ) const ( - pidFile = "/var/run/nginx/nginx.pid" - pidFileTimeout = 10 * time.Second + pidFile = "/var/run/nginx/nginx.pid" + pidFileTimeout = 10000 * time.Millisecond + childProcsTimeout = 1000 * time.Millisecond + nginxReloadTimeout = 60000 * time.Millisecond ) type ( @@ -29,41 +32,49 @@ type ( // Manager manages the runtime of NGINX. type Manager interface { // Reload reloads NGINX configuration. It is a blocking operation. - Reload(ctx context.Context) error + Reload(ctx context.Context, configVersion int) error } // ManagerImpl implements Manager. -type ManagerImpl struct{} +type ManagerImpl struct { + verifyClient *verifyClient +} // NewManagerImpl creates a new ManagerImpl. func NewManagerImpl() *ManagerImpl { - return &ManagerImpl{} + return &ManagerImpl{ + verifyClient: newVerifyClient(nginxReloadTimeout), + } } -func (m *ManagerImpl) Reload(ctx context.Context) error { +func (m *ManagerImpl) Reload(ctx context.Context, configVersion int) error { // We find the main NGINX PID on every reload because it will change if the NGINX container is restarted. pid, err := findMainProcess(ctx, os.Stat, os.ReadFile, pidFileTimeout) if err != nil { return fmt.Errorf("failed to find NGINX main process: %w", err) } + childProcFile := fmt.Sprintf("/proc/%d/task/%d/children", pid, pid) + currentChildProcesses, err := os.ReadFile(childProcFile) + if err != nil { + return err + } + // send HUP signal to the NGINX main process reload configuration // See https://nginx.org/en/docs/control.html if err := syscall.Kill(pid, syscall.SIGHUP); err != nil { return fmt.Errorf("failed to send the HUP signal to NGINX main: %w", err) } - // FIXME(pleshakov) - // (1) ensure the reload actually happens. - // https://github.com/nginxinc/nginx-kubernetes-gateway/issues/664 - - // for now, to prevent a subsequent reload starting before the in-flight reload finishes, we simply sleep. - // Fixing (1) will make the sleep unnecessary. + newProcsStarted, err := ensureNewNginxWorkers( + ctx, childProcFile, currentChildProcesses, os.ReadFile, childProcsTimeout) + if !newProcsStarted { + return fmt.Errorf("reload unsuccessful: no new NGINX worker processes started: %w", err) + } - select { - case <-ctx.Done(): - return nil - case <-time.After(1 * time.Second): + err = m.verifyClient.WaitForCorrectVersion(ctx, configVersion) + if err != nil { + return fmt.Errorf("could not get newest config version: %w", err) } return nil @@ -116,3 +127,36 @@ func findMainProcess( return pid, nil } + +func ensureNewNginxWorkers( + ctx context.Context, + childProcFile string, + previousContents []byte, + readFile readFileFunc, + timeout time.Duration, +) (bool, error) { + ctx, cancel := context.WithTimeout(ctx, timeout) + defer cancel() + + newWorkersStarted := true + + err := wait.PollUntilContextCancel( + ctx, + 25*time.Millisecond, + true, /* poll immediately */ + func(ctx context.Context) (bool, error) { + content, err := readFile(childProcFile) + if err != nil { + return false, err + } + if !bytes.Equal(previousContents, content) { + return true, nil + } + return false, nil + }) + if err != nil { + return false, err + } + + return newWorkersStarted, nil +} diff --git a/internal/mode/static/nginx/runtime/manager_test.go b/internal/mode/static/nginx/runtime/manager_test.go index c5ff89b041..0f5d949b2c 100644 --- a/internal/mode/static/nginx/runtime/manager_test.go +++ b/internal/mode/static/nginx/runtime/manager_test.go @@ -4,6 +4,7 @@ import ( "context" "errors" "io/fs" + "os" "testing" "time" ) @@ -113,3 +114,105 @@ func TestFindMainProcess(t *testing.T) { } } } + +func TestEnsureNewNginxWorkers(t *testing.T) { + readFileError := func(string) ([]byte, error) { + return nil, errors.New("error") + } + + tempFileFunc := func(contents []byte) *os.File { + tempFile, err := os.CreateTemp("", "tmpfile-") + if err != nil { + return nil + } + if _, err = tempFile.Write(contents); err != nil { + return nil + } + return tempFile + } + + previousContents := []byte("1 2 3") + + childFileSame := tempFileFunc(previousContents) + childFileDifferent := tempFileFunc([]byte("4 5 6")) + + defer childFileSame.Close() + defer os.Remove(childFileSame.Name()) + defer childFileDifferent.Close() + defer os.Remove(childFileDifferent.Name()) + + ctx := context.Background() + cancellingCtx, cancel := context.WithCancel(ctx) + time.AfterFunc(1*time.Millisecond, cancel) + + tests := []struct { + ctx context.Context + readFile readFileFunc + childFile string + msg string + previousContents []byte + expected bool + expectError bool + }{ + { + ctx: ctx, + readFile: os.ReadFile, + childFile: childFileDifferent.Name(), + previousContents: previousContents, + expected: true, + expectError: false, + msg: "normal case", + }, + { + ctx: ctx, + readFile: readFileError, + childFile: childFileDifferent.Name(), + previousContents: previousContents, + expected: false, + expectError: true, + msg: "cannot read file", + }, + { + ctx: ctx, + readFile: os.ReadFile, + childFile: childFileSame.Name(), + previousContents: previousContents, + expected: false, + expectError: true, + msg: "no new workers", + }, + { + ctx: cancellingCtx, + readFile: os.ReadFile, + childFile: childFileSame.Name(), + previousContents: previousContents, + expected: false, + expectError: true, + msg: "context canceled", + }, + } + + for _, test := range tests { + result, err := ensureNewNginxWorkers( + test.ctx, + test.childFile, + test.previousContents, + test.readFile, + 2*time.Millisecond, + ) + + if result != test.expected { + t.Errorf("ensureNewNginxWorkers() returned %v but expected %v for case %q", result, test.expected, test.msg) + } + + if test.expectError { + if err == nil { + t.Errorf("ensureNewNginxWorkers() didn't return error for case %q", test.msg) + } + } else { + if err != nil { + t.Errorf("ensureNewNginxWorkers() returned unexpected error %v for case %q", err, test.msg) + } + } + } +} diff --git a/internal/mode/static/nginx/runtime/runtimefakes/fake_manager.go b/internal/mode/static/nginx/runtime/runtimefakes/fake_manager.go index 93b65360a3..1fd6724c7d 100644 --- a/internal/mode/static/nginx/runtime/runtimefakes/fake_manager.go +++ b/internal/mode/static/nginx/runtime/runtimefakes/fake_manager.go @@ -9,10 +9,11 @@ import ( ) type FakeManager struct { - ReloadStub func(context.Context) error + ReloadStub func(context.Context, int) error reloadMutex sync.RWMutex reloadArgsForCall []struct { arg1 context.Context + arg2 int } reloadReturns struct { result1 error @@ -24,18 +25,19 @@ type FakeManager struct { invocationsMutex sync.RWMutex } -func (fake *FakeManager) Reload(arg1 context.Context) error { +func (fake *FakeManager) Reload(arg1 context.Context, arg2 int) error { fake.reloadMutex.Lock() ret, specificReturn := fake.reloadReturnsOnCall[len(fake.reloadArgsForCall)] fake.reloadArgsForCall = append(fake.reloadArgsForCall, struct { arg1 context.Context - }{arg1}) + arg2 int + }{arg1, arg2}) stub := fake.ReloadStub fakeReturns := fake.reloadReturns - fake.recordInvocation("Reload", []interface{}{arg1}) + fake.recordInvocation("Reload", []interface{}{arg1, arg2}) fake.reloadMutex.Unlock() if stub != nil { - return stub(arg1) + return stub(arg1, arg2) } if specificReturn { return ret.result1 @@ -49,17 +51,17 @@ func (fake *FakeManager) ReloadCallCount() int { return len(fake.reloadArgsForCall) } -func (fake *FakeManager) ReloadCalls(stub func(context.Context) error) { +func (fake *FakeManager) ReloadCalls(stub func(context.Context, int) error) { fake.reloadMutex.Lock() defer fake.reloadMutex.Unlock() fake.ReloadStub = stub } -func (fake *FakeManager) ReloadArgsForCall(i int) context.Context { +func (fake *FakeManager) ReloadArgsForCall(i int) (context.Context, int) { fake.reloadMutex.RLock() defer fake.reloadMutex.RUnlock() argsForCall := fake.reloadArgsForCall[i] - return argsForCall.arg1 + return argsForCall.arg1, argsForCall.arg2 } func (fake *FakeManager) ReloadReturns(result1 error) { diff --git a/internal/mode/static/nginx/runtime/verify.go b/internal/mode/static/nginx/runtime/verify.go new file mode 100644 index 0000000000..8106df28f1 --- /dev/null +++ b/internal/mode/static/nginx/runtime/verify.go @@ -0,0 +1,92 @@ +package runtime + +import ( + "context" + "fmt" + "io" + "net" + "net/http" + "strconv" + "time" + + "k8s.io/apimachinery/pkg/util/wait" +) + +// verifyClient is a client for verifying the config version. +type verifyClient struct { + client *http.Client + timeout time.Duration +} + +// newVerifyClient returns a new client pointed at the config version socket. +func newVerifyClient(timeout time.Duration) *verifyClient { + return &verifyClient{ + client: &http.Client{ + Transport: &http.Transport{ + DialContext: func(_ context.Context, _, _ string) (net.Conn, error) { + return net.Dial("unix", "/var/run/nginx/nginx-config-version.sock") + }, + }, + }, + timeout: timeout, + } +} + +// GetConfigVersion gets the version number that we put in the nginx config to verify that we're using +// the correct config. +func (c *verifyClient) GetConfigVersion() (int, error) { + ctx := context.Background() + reqContext, cancel := context.WithTimeout(ctx, c.timeout) + defer cancel() + req, err := http.NewRequestWithContext(reqContext, "GET", "http://config-version/configVersion", nil) + if err != nil { + return 0, fmt.Errorf("error creating request: %w", err) + } + + resp, err := c.client.Do(req) + if err != nil { + return 0, fmt.Errorf("error getting client: %w", err) + } + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + return 0, fmt.Errorf("non-200 response: %v", resp.StatusCode) + } + + body, err := io.ReadAll(resp.Body) + if err != nil { + return 0, fmt.Errorf("failed to read the response body: %w", err) + } + v, err := strconv.Atoi(string(body)) + if err != nil { + return 0, fmt.Errorf("error converting string to int: %w", err) + } + return v, nil +} + +// WaitForCorrectVersion calls the config version endpoint until it gets the expectedVersion, +// which ensures that a new worker process has been started for that config version. +func (c *verifyClient) WaitForCorrectVersion(ctx context.Context, expectedVersion int) error { + ctx, cancel := context.WithTimeout(ctx, c.timeout) + defer cancel() + + err := wait.PollUntilContextCancel( + ctx, + 25*time.Millisecond, + true, /* poll immediately */ + func(ctx context.Context) (bool, error) { + version, err := c.GetConfigVersion() + if err != nil { + return false, err + } + if version == expectedVersion { + return true, nil + } + return false, nil + }) + if err != nil { + return fmt.Errorf("could not get expected version %v: %w", expectedVersion, err) + } + + return nil +} diff --git a/internal/mode/static/nginx/runtime/verify_test.go b/internal/mode/static/nginx/runtime/verify_test.go new file mode 100644 index 0000000000..7ff32b3d6b --- /dev/null +++ b/internal/mode/static/nginx/runtime/verify_test.go @@ -0,0 +1,74 @@ +package runtime + +import ( + "bytes" + "context" + "io" + "net/http" + "testing" + "time" +) + +type Transport struct{} + +func (c Transport) RoundTrip(_ *http.Request) (*http.Response, error) { + return &http.Response{ + StatusCode: 200, + Body: io.NopCloser(bytes.NewBufferString("42")), + Header: make(http.Header), + }, nil +} + +func getTestHTTPClient() *http.Client { + ts := Transport{} + tClient := &http.Client{ + Transport: ts, + } + return tClient +} + +func TestVerifyClient(t *testing.T) { + t.Parallel() + c := verifyClient{ + client: getTestHTTPClient(), + timeout: 25 * time.Millisecond, + } + + ctx := context.Background() + cancellingCtx, cancel := context.WithCancel(ctx) + time.AfterFunc(1*time.Millisecond, cancel) + + tests := []struct { + ctx context.Context + msg string + expectedVersion int + expectError bool + }{ + { + ctx: ctx, + expectedVersion: 42, + expectError: false, + msg: "normal case", + }, + { + ctx: cancellingCtx, + expectedVersion: 0, + expectError: true, + msg: "context canceled", + }, + } + + for _, test := range tests { + err := c.WaitForCorrectVersion(test.ctx, test.expectedVersion) + + if test.expectError { + if err == nil { + t.Errorf("WaitForCorrectVersion() didn't return error for case %q", test.msg) + } + } else { + if err != nil { + t.Errorf("WaitForCorrectVersion() returned unexpected error %v for case %q", err, test.msg) + } + } + } +} diff --git a/internal/mode/static/state/conditions/conditions.go b/internal/mode/static/state/conditions/conditions.go index 3d27571afa..9ad84eb35b 100644 --- a/internal/mode/static/state/conditions/conditions.go +++ b/internal/mode/static/state/conditions/conditions.go @@ -18,7 +18,7 @@ const ( // ListenerMessageFailedNginxReload is a message used with ListenerConditionProgrammed (false) // when nginx fails to reload. ListenerMessageFailedNginxReload = "The Listener is not programmed due to a failure to " + - "reload nginx with the configuration" + "reload nginx with the configuration. Please see the nginx container logs for any possible configuration issues." // RouteReasonBackendRefUnsupportedValue is used with the "ResolvedRefs" condition when one of the // Route rules has a backendRef with an unsupported value. @@ -50,7 +50,7 @@ const ( // GatewayMessageFailedNginxReload is a message used with GatewayConditionProgrammed (false) // when nginx fails to reload. GatewayMessageFailedNginxReload = "The Gateway is not programmed due to a failure to " + - "reload nginx with the configuration" + "reload nginx with the configuration. Please see the nginx container logs for any possible configuration issues" // RouteMessageFailedNginxReload is a message used with RouteReasonGatewayNotProgrammed // when nginx fails to reload. From 9e1b36729c30fffbed0e875b7591f76d4c79bce6 Mon Sep 17 00:00:00 2001 From: Ciara Stacke Date: Wed, 6 Sep 2023 16:27:35 +0100 Subject: [PATCH 2/7] Review feedback --- .../static/nginx/config/version_template.go | 12 ++- .../mode/static/nginx/config/version_test.go | 1 - internal/mode/static/nginx/runtime/manager.go | 18 ++-- .../mode/static/nginx/runtime/manager_test.go | 84 +++++++++---------- internal/mode/static/nginx/runtime/verify.go | 14 ++-- .../mode/static/nginx/runtime/verify_test.go | 26 +++--- 6 files changed, 73 insertions(+), 82 deletions(-) diff --git a/internal/mode/static/nginx/config/version_template.go b/internal/mode/static/nginx/config/version_template.go index cd76938835..ff735b75cf 100644 --- a/internal/mode/static/nginx/config/version_template.go +++ b/internal/mode/static/nginx/config/version_template.go @@ -1,14 +1,12 @@ package config -var versionTemplateText = `server { +var versionTemplateText = ` +server { listen unix:/var/run/nginx/nginx-config-version.sock; - access_log off; + access_log off; - location /configVersion { + location /version { return 200 {{.Version}}; } } -map $http_x_expected_config_version $config_version_mismatch { - "{{.Version}}" ""; - default "mismatch"; -}` +` diff --git a/internal/mode/static/nginx/config/version_test.go b/internal/mode/static/nginx/config/version_test.go index 2c84d92f5d..3432354259 100644 --- a/internal/mode/static/nginx/config/version_test.go +++ b/internal/mode/static/nginx/config/version_test.go @@ -11,7 +11,6 @@ func TestExecuteVersion(t *testing.T) { g := NewGomegaWithT(t) expSubStrings := map[string]int{ "return 200 42;": 1, - `"42" ""`: 1, } maps := string(executeVersion(42)) diff --git a/internal/mode/static/nginx/runtime/manager.go b/internal/mode/static/nginx/runtime/manager.go index 9703870507..ca5fafaacc 100644 --- a/internal/mode/static/nginx/runtime/manager.go +++ b/internal/mode/static/nginx/runtime/manager.go @@ -54,8 +54,8 @@ func (m *ManagerImpl) Reload(ctx context.Context, configVersion int) error { return fmt.Errorf("failed to find NGINX main process: %w", err) } - childProcFile := fmt.Sprintf("/proc/%d/task/%d/children", pid, pid) - currentChildProcesses, err := os.ReadFile(childProcFile) + childProcFile := fmt.Sprintf("/proc/%[1]v/task/%[1]v/children", pid) + previousChildProcesses, err := os.ReadFile(childProcFile) if err != nil { return err } @@ -67,13 +67,12 @@ func (m *ManagerImpl) Reload(ctx context.Context, configVersion int) error { } newProcsStarted, err := ensureNewNginxWorkers( - ctx, childProcFile, currentChildProcesses, os.ReadFile, childProcsTimeout) + ctx, childProcFile, previousChildProcesses, os.ReadFile, childProcsTimeout) if !newProcsStarted { return fmt.Errorf("reload unsuccessful: no new NGINX worker processes started: %w", err) } - err = m.verifyClient.WaitForCorrectVersion(ctx, configVersion) - if err != nil { + if err = m.verifyClient.WaitForCorrectVersion(ctx, configVersion); err != nil { return fmt.Errorf("could not get newest config version: %w", err) } @@ -138,9 +137,7 @@ func ensureNewNginxWorkers( ctx, cancel := context.WithTimeout(ctx, timeout) defer cancel() - newWorkersStarted := true - - err := wait.PollUntilContextCancel( + if err := wait.PollUntilContextCancel( ctx, 25*time.Millisecond, true, /* poll immediately */ @@ -153,10 +150,9 @@ func ensureNewNginxWorkers( return true, nil } return false, nil - }) - if err != nil { + }); err != nil { return false, err } - return newWorkersStarted, nil + return true, nil } diff --git a/internal/mode/static/nginx/runtime/manager_test.go b/internal/mode/static/nginx/runtime/manager_test.go index 0f5d949b2c..5c41bf4361 100644 --- a/internal/mode/static/nginx/runtime/manager_test.go +++ b/internal/mode/static/nginx/runtime/manager_test.go @@ -7,6 +7,8 @@ import ( "os" "testing" "time" + + . "github.com/onsi/gomega" ) func TestFindMainProcess(t *testing.T) { @@ -42,7 +44,7 @@ func TestFindMainProcess(t *testing.T) { ctx context.Context readFile readFileFunc checkFile checkFileFunc - msg string + name string expected int expectError bool }{ @@ -52,7 +54,7 @@ func TestFindMainProcess(t *testing.T) { checkFile: checkFileFuncGen(testFileInfo), expected: 1, expectError: false, - msg: "normal case", + name: "normal case", }, { ctx: ctx, @@ -60,7 +62,7 @@ func TestFindMainProcess(t *testing.T) { checkFile: checkFileFuncGen(testFileInfo), expected: 0, expectError: true, - msg: "empty file content", + name: "empty file content", }, { ctx: ctx, @@ -68,7 +70,7 @@ func TestFindMainProcess(t *testing.T) { checkFile: checkFileFuncGen(testFileInfo), expected: 0, expectError: true, - msg: "bad file content", + name: "bad file content", }, { ctx: ctx, @@ -76,7 +78,7 @@ func TestFindMainProcess(t *testing.T) { checkFile: checkFileFuncGen(testFileInfo), expected: 0, expectError: true, - msg: "cannot read file", + name: "cannot read file", }, { ctx: ctx, @@ -84,7 +86,7 @@ func TestFindMainProcess(t *testing.T) { checkFile: checkFileError, expected: 0, expectError: true, - msg: "cannot find pid file", + name: "cannot find pid file", }, { ctx: cancellingCtx, @@ -92,26 +94,23 @@ func TestFindMainProcess(t *testing.T) { checkFile: checkFileError, expected: 0, expectError: true, - msg: "context canceled", + name: "context canceled", }, } for _, test := range tests { - result, err := findMainProcess(test.ctx, test.checkFile, test.readFile, 2*time.Millisecond) + t.Run(test.name, func(t *testing.T) { + g := NewGomegaWithT(t) - if result != test.expected { - t.Errorf("findMainProcess() returned %d but expected %d for case %q", result, test.expected, test.msg) - } + result, err := findMainProcess(test.ctx, test.checkFile, test.readFile, 2*time.Millisecond) - if test.expectError { - if err == nil { - t.Errorf("findMainProcess() didn't return error for case %q", test.msg) + if test.expectError { + g.Expect(err).To(HaveOccurred()) + } else { + g.Expect(err).ToNot(HaveOccurred()) + g.Expect(result).To(Equal(test.expected)) } - } else { - if err != nil { - t.Errorf("findMainProcess() returned unexpected error %v for case %q", err, test.msg) - } - } + }) } } @@ -149,7 +148,7 @@ func TestEnsureNewNginxWorkers(t *testing.T) { ctx context.Context readFile readFileFunc childFile string - msg string + name string previousContents []byte expected bool expectError bool @@ -161,7 +160,7 @@ func TestEnsureNewNginxWorkers(t *testing.T) { previousContents: previousContents, expected: true, expectError: false, - msg: "normal case", + name: "normal case", }, { ctx: ctx, @@ -170,7 +169,7 @@ func TestEnsureNewNginxWorkers(t *testing.T) { previousContents: previousContents, expected: false, expectError: true, - msg: "cannot read file", + name: "cannot read file", }, { ctx: ctx, @@ -179,7 +178,7 @@ func TestEnsureNewNginxWorkers(t *testing.T) { previousContents: previousContents, expected: false, expectError: true, - msg: "no new workers", + name: "no new workers", }, { ctx: cancellingCtx, @@ -188,31 +187,28 @@ func TestEnsureNewNginxWorkers(t *testing.T) { previousContents: previousContents, expected: false, expectError: true, - msg: "context canceled", + name: "context canceled", }, } for _, test := range tests { - result, err := ensureNewNginxWorkers( - test.ctx, - test.childFile, - test.previousContents, - test.readFile, - 2*time.Millisecond, - ) - - if result != test.expected { - t.Errorf("ensureNewNginxWorkers() returned %v but expected %v for case %q", result, test.expected, test.msg) - } - - if test.expectError { - if err == nil { - t.Errorf("ensureNewNginxWorkers() didn't return error for case %q", test.msg) + t.Run(test.name, func(t *testing.T) { + g := NewGomegaWithT(t) + + result, err := ensureNewNginxWorkers( + test.ctx, + test.childFile, + test.previousContents, + test.readFile, + 2*time.Millisecond, + ) + + if test.expectError { + g.Expect(err).To(HaveOccurred()) + } else { + g.Expect(err).ToNot(HaveOccurred()) + g.Expect(result).To(Equal(test.expected)) } - } else { - if err != nil { - t.Errorf("ensureNewNginxWorkers() returned unexpected error %v for case %q", err, test.msg) - } - } + }) } } diff --git a/internal/mode/static/nginx/runtime/verify.go b/internal/mode/static/nginx/runtime/verify.go index 8106df28f1..15049a41a8 100644 --- a/internal/mode/static/nginx/runtime/verify.go +++ b/internal/mode/static/nginx/runtime/verify.go @@ -12,6 +12,8 @@ import ( "k8s.io/apimachinery/pkg/util/wait" ) +const configVersionURI = "/var/run/nginx/nginx-config-version.sock" + // verifyClient is a client for verifying the config version. type verifyClient struct { client *http.Client @@ -24,7 +26,7 @@ func newVerifyClient(timeout time.Duration) *verifyClient { client: &http.Client{ Transport: &http.Transport{ DialContext: func(_ context.Context, _, _ string) (net.Conn, error) { - return net.Dial("unix", "/var/run/nginx/nginx-config-version.sock") + return net.Dial("unix", configVersionURI) }, }, }, @@ -35,10 +37,9 @@ func newVerifyClient(timeout time.Duration) *verifyClient { // GetConfigVersion gets the version number that we put in the nginx config to verify that we're using // the correct config. func (c *verifyClient) GetConfigVersion() (int, error) { - ctx := context.Background() - reqContext, cancel := context.WithTimeout(ctx, c.timeout) + ctx, cancel := context.WithTimeout(context.Background(), c.timeout) defer cancel() - req, err := http.NewRequestWithContext(reqContext, "GET", "http://config-version/configVersion", nil) + req, err := http.NewRequestWithContext(ctx, "GET", "http://config-version/version", nil) if err != nil { return 0, fmt.Errorf("error creating request: %w", err) } @@ -70,7 +71,7 @@ func (c *verifyClient) WaitForCorrectVersion(ctx context.Context, expectedVersio ctx, cancel := context.WithTimeout(ctx, c.timeout) defer cancel() - err := wait.PollUntilContextCancel( + if err := wait.PollUntilContextCancel( ctx, 25*time.Millisecond, true, /* poll immediately */ @@ -83,8 +84,7 @@ func (c *verifyClient) WaitForCorrectVersion(ctx context.Context, expectedVersio return true, nil } return false, nil - }) - if err != nil { + }); err != nil { return fmt.Errorf("could not get expected version %v: %w", expectedVersion, err) } diff --git a/internal/mode/static/nginx/runtime/verify_test.go b/internal/mode/static/nginx/runtime/verify_test.go index 7ff32b3d6b..c63173d037 100644 --- a/internal/mode/static/nginx/runtime/verify_test.go +++ b/internal/mode/static/nginx/runtime/verify_test.go @@ -7,6 +7,8 @@ import ( "net/http" "testing" "time" + + . "github.com/onsi/gomega" ) type Transport struct{} @@ -40,7 +42,7 @@ func TestVerifyClient(t *testing.T) { tests := []struct { ctx context.Context - msg string + name string expectedVersion int expectError bool }{ @@ -48,27 +50,27 @@ func TestVerifyClient(t *testing.T) { ctx: ctx, expectedVersion: 42, expectError: false, - msg: "normal case", + name: "normal case", }, { ctx: cancellingCtx, expectedVersion: 0, expectError: true, - msg: "context canceled", + name: "context canceled", }, } for _, test := range tests { - err := c.WaitForCorrectVersion(test.ctx, test.expectedVersion) + t.Run(test.name, func(t *testing.T) { + g := NewGomegaWithT(t) - if test.expectError { - if err == nil { - t.Errorf("WaitForCorrectVersion() didn't return error for case %q", test.msg) - } - } else { - if err != nil { - t.Errorf("WaitForCorrectVersion() returned unexpected error %v for case %q", err, test.msg) + err := c.WaitForCorrectVersion(test.ctx, test.expectedVersion) + + if test.expectError { + g.Expect(err).To(HaveOccurred()) + } else { + g.Expect(err).ToNot(HaveOccurred()) } - } + }) } } From 900491fecd1a85ea1f9c39c25b9d1e9f93c0a287 Mon Sep 17 00:00:00 2001 From: Ciara Stacke Date: Thu, 7 Sep 2023 15:38:58 +0100 Subject: [PATCH 3/7] Review feedback --- internal/mode/static/nginx/config/version.go | 4 +- .../static/nginx/config/version_template.go | 2 +- internal/mode/static/nginx/runtime/manager.go | 37 ++++++++++--------- .../mode/static/nginx/runtime/manager_test.go | 8 +--- internal/mode/static/nginx/runtime/verify.go | 25 ++++++------- .../mode/static/nginx/runtime/verify_test.go | 18 +++++---- 6 files changed, 45 insertions(+), 49 deletions(-) diff --git a/internal/mode/static/nginx/config/version.go b/internal/mode/static/nginx/config/version.go index c5ac52e2d2..494a3f7d31 100644 --- a/internal/mode/static/nginx/config/version.go +++ b/internal/mode/static/nginx/config/version.go @@ -7,7 +7,5 @@ import ( var versionTemplate = gotemplate.Must(gotemplate.New("version").Parse(versionTemplateText)) func executeVersion(version int) []byte { - data := make(map[string]int, 1) - data["Version"] = version - return execute(versionTemplate, data) + return execute(versionTemplate, version) } diff --git a/internal/mode/static/nginx/config/version_template.go b/internal/mode/static/nginx/config/version_template.go index ff735b75cf..3f0d3ea544 100644 --- a/internal/mode/static/nginx/config/version_template.go +++ b/internal/mode/static/nginx/config/version_template.go @@ -6,7 +6,7 @@ server { access_log off; location /version { - return 200 {{.Version}}; + return 200 {{.}}; } } ` diff --git a/internal/mode/static/nginx/runtime/manager.go b/internal/mode/static/nginx/runtime/manager.go index ca5fafaacc..23b066afe0 100644 --- a/internal/mode/static/nginx/runtime/manager.go +++ b/internal/mode/static/nginx/runtime/manager.go @@ -27,6 +27,12 @@ type ( checkFileFunc func(string) (fs.FileInfo, error) ) +var ( + noNewWorkersErr = "reload unsuccessful: no new NGINX worker processes started for config version %d." + + " Please check the NGINX container logs for possible configuration issues: %w" + childProcPath = "/proc/%[1]v/task/%[1]v/children" +) + //go:generate go run github.com/maxbrunsfeld/counterfeiter/v6 . Manager // Manager manages the runtime of NGINX. @@ -54,7 +60,7 @@ func (m *ManagerImpl) Reload(ctx context.Context, configVersion int) error { return fmt.Errorf("failed to find NGINX main process: %w", err) } - childProcFile := fmt.Sprintf("/proc/%[1]v/task/%[1]v/children", pid) + childProcFile := fmt.Sprintf(childProcPath, pid) previousChildProcesses, err := os.ReadFile(childProcFile) if err != nil { return err @@ -66,17 +72,17 @@ func (m *ManagerImpl) Reload(ctx context.Context, configVersion int) error { return fmt.Errorf("failed to send the HUP signal to NGINX main: %w", err) } - newProcsStarted, err := ensureNewNginxWorkers( - ctx, childProcFile, previousChildProcesses, os.ReadFile, childProcsTimeout) - if !newProcsStarted { - return fmt.Errorf("reload unsuccessful: no new NGINX worker processes started: %w", err) - } - - if err = m.verifyClient.WaitForCorrectVersion(ctx, configVersion); err != nil { - return fmt.Errorf("could not get newest config version: %w", err) + if err := ensureNewNginxWorkers( + ctx, + childProcFile, + previousChildProcesses, + os.ReadFile, + childProcsTimeout, + ); err != nil { + return fmt.Errorf(noNewWorkersErr, configVersion, err) } - return nil + return m.verifyClient.waitForCorrectVersion(ctx, configVersion) } // EnsureNginxRunning ensures NGINX is running by locating the main process. @@ -133,11 +139,11 @@ func ensureNewNginxWorkers( previousContents []byte, readFile readFileFunc, timeout time.Duration, -) (bool, error) { +) error { ctx, cancel := context.WithTimeout(ctx, timeout) defer cancel() - if err := wait.PollUntilContextCancel( + return wait.PollUntilContextCancel( ctx, 25*time.Millisecond, true, /* poll immediately */ @@ -150,9 +156,6 @@ func ensureNewNginxWorkers( return true, nil } return false, nil - }); err != nil { - return false, err - } - - return true, nil + }, + ) } diff --git a/internal/mode/static/nginx/runtime/manager_test.go b/internal/mode/static/nginx/runtime/manager_test.go index 5c41bf4361..0993f0d99d 100644 --- a/internal/mode/static/nginx/runtime/manager_test.go +++ b/internal/mode/static/nginx/runtime/manager_test.go @@ -150,7 +150,6 @@ func TestEnsureNewNginxWorkers(t *testing.T) { childFile string name string previousContents []byte - expected bool expectError bool }{ { @@ -158,7 +157,6 @@ func TestEnsureNewNginxWorkers(t *testing.T) { readFile: os.ReadFile, childFile: childFileDifferent.Name(), previousContents: previousContents, - expected: true, expectError: false, name: "normal case", }, @@ -167,7 +165,6 @@ func TestEnsureNewNginxWorkers(t *testing.T) { readFile: readFileError, childFile: childFileDifferent.Name(), previousContents: previousContents, - expected: false, expectError: true, name: "cannot read file", }, @@ -176,7 +173,6 @@ func TestEnsureNewNginxWorkers(t *testing.T) { readFile: os.ReadFile, childFile: childFileSame.Name(), previousContents: previousContents, - expected: false, expectError: true, name: "no new workers", }, @@ -185,7 +181,6 @@ func TestEnsureNewNginxWorkers(t *testing.T) { readFile: os.ReadFile, childFile: childFileSame.Name(), previousContents: previousContents, - expected: false, expectError: true, name: "context canceled", }, @@ -195,7 +190,7 @@ func TestEnsureNewNginxWorkers(t *testing.T) { t.Run(test.name, func(t *testing.T) { g := NewGomegaWithT(t) - result, err := ensureNewNginxWorkers( + err := ensureNewNginxWorkers( test.ctx, test.childFile, test.previousContents, @@ -207,7 +202,6 @@ func TestEnsureNewNginxWorkers(t *testing.T) { g.Expect(err).To(HaveOccurred()) } else { g.Expect(err).ToNot(HaveOccurred()) - g.Expect(result).To(Equal(test.expected)) } }) } diff --git a/internal/mode/static/nginx/runtime/verify.go b/internal/mode/static/nginx/runtime/verify.go index 15049a41a8..50f7697ee9 100644 --- a/internal/mode/static/nginx/runtime/verify.go +++ b/internal/mode/static/nginx/runtime/verify.go @@ -2,6 +2,7 @@ package runtime import ( "context" + "errors" "fmt" "io" "net" @@ -34,9 +35,9 @@ func newVerifyClient(timeout time.Duration) *verifyClient { } } -// GetConfigVersion gets the version number that we put in the nginx config to verify that we're using +// getConfigVersion gets the version number that we put in the nginx config to verify that we're using // the correct config. -func (c *verifyClient) GetConfigVersion() (int, error) { +func (c *verifyClient) getConfigVersion() (int, error) { ctx, cancel := context.WithTimeout(context.Background(), c.timeout) defer cancel() req, err := http.NewRequestWithContext(ctx, "GET", "http://config-version/version", nil) @@ -65,9 +66,9 @@ func (c *verifyClient) GetConfigVersion() (int, error) { return v, nil } -// WaitForCorrectVersion calls the config version endpoint until it gets the expectedVersion, +// waitForCorrectVersion calls the config version endpoint until it gets the expectedVersion, // which ensures that a new worker process has been started for that config version. -func (c *verifyClient) WaitForCorrectVersion(ctx context.Context, expectedVersion int) error { +func (c *verifyClient) waitForCorrectVersion(ctx context.Context, expectedVersion int) error { ctx, cancel := context.WithTimeout(ctx, c.timeout) defer cancel() @@ -76,17 +77,13 @@ func (c *verifyClient) WaitForCorrectVersion(ctx context.Context, expectedVersio 25*time.Millisecond, true, /* poll immediately */ func(ctx context.Context) (bool, error) { - version, err := c.GetConfigVersion() - if err != nil { - return false, err - } - if version == expectedVersion { - return true, nil - } - return false, nil + version, err := c.getConfigVersion() + return version == expectedVersion, err }); err != nil { - return fmt.Errorf("could not get expected version %v: %w", expectedVersion, err) + if errors.Is(err, context.DeadlineExceeded) { + err = fmt.Errorf("config version check didn't return expected version within the deadline") + } + return fmt.Errorf("could not get expected config version %d: %w", expectedVersion, err) } - return nil } diff --git a/internal/mode/static/nginx/runtime/verify_test.go b/internal/mode/static/nginx/runtime/verify_test.go index c63173d037..0f32704bb5 100644 --- a/internal/mode/static/nginx/runtime/verify_test.go +++ b/internal/mode/static/nginx/runtime/verify_test.go @@ -11,9 +11,9 @@ import ( . "github.com/onsi/gomega" ) -type Transport struct{} +type transport struct{} -func (c Transport) RoundTrip(_ *http.Request) (*http.Response, error) { +func (c transport) RoundTrip(_ *http.Request) (*http.Response, error) { return &http.Response{ StatusCode: 200, Body: io.NopCloser(bytes.NewBufferString("42")), @@ -22,15 +22,13 @@ func (c Transport) RoundTrip(_ *http.Request) (*http.Response, error) { } func getTestHTTPClient() *http.Client { - ts := Transport{} - tClient := &http.Client{ + ts := transport{} + return &http.Client{ Transport: ts, } - return tClient } func TestVerifyClient(t *testing.T) { - t.Parallel() c := verifyClient{ client: getTestHTTPClient(), timeout: 25 * time.Millisecond, @@ -52,6 +50,12 @@ func TestVerifyClient(t *testing.T) { expectError: false, name: "normal case", }, + { + ctx: ctx, + expectedVersion: 43, + expectError: true, + name: "wrong version", + }, { ctx: cancellingCtx, expectedVersion: 0, @@ -64,7 +68,7 @@ func TestVerifyClient(t *testing.T) { t.Run(test.name, func(t *testing.T) { g := NewGomegaWithT(t) - err := c.WaitForCorrectVersion(test.ctx, test.expectedVersion) + err := c.waitForCorrectVersion(test.ctx, test.expectedVersion) if test.expectError { g.Expect(err).To(HaveOccurred()) From faee5aa8d0a79d491790cf5f96b74e14829477bf Mon Sep 17 00:00:00 2001 From: Ciara Stacke Date: Fri, 8 Sep 2023 15:14:14 +0100 Subject: [PATCH 4/7] Change var names --- internal/mode/static/nginx/runtime/manager.go | 8 ++++---- internal/mode/static/nginx/runtime/verify.go | 5 ++++- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/internal/mode/static/nginx/runtime/manager.go b/internal/mode/static/nginx/runtime/manager.go index 23b066afe0..eb7f48c208 100644 --- a/internal/mode/static/nginx/runtime/manager.go +++ b/internal/mode/static/nginx/runtime/manager.go @@ -28,9 +28,9 @@ type ( ) var ( - noNewWorkersErr = "reload unsuccessful: no new NGINX worker processes started for config version %d." + + noNewWorkersErrFmt = "reload unsuccessful: no new NGINX worker processes started for config version %d." + " Please check the NGINX container logs for possible configuration issues: %w" - childProcPath = "/proc/%[1]v/task/%[1]v/children" + childProcPathFmt = "/proc/%[1]v/task/%[1]v/children" ) //go:generate go run github.com/maxbrunsfeld/counterfeiter/v6 . Manager @@ -60,7 +60,7 @@ func (m *ManagerImpl) Reload(ctx context.Context, configVersion int) error { return fmt.Errorf("failed to find NGINX main process: %w", err) } - childProcFile := fmt.Sprintf(childProcPath, pid) + childProcFile := fmt.Sprintf(childProcPathFmt, pid) previousChildProcesses, err := os.ReadFile(childProcFile) if err != nil { return err @@ -79,7 +79,7 @@ func (m *ManagerImpl) Reload(ctx context.Context, configVersion int) error { os.ReadFile, childProcsTimeout, ); err != nil { - return fmt.Errorf(noNewWorkersErr, configVersion, err) + return fmt.Errorf(noNewWorkersErrFmt, configVersion, err) } return m.verifyClient.waitForCorrectVersion(ctx, configVersion) diff --git a/internal/mode/static/nginx/runtime/verify.go b/internal/mode/static/nginx/runtime/verify.go index 50f7697ee9..519885816f 100644 --- a/internal/mode/static/nginx/runtime/verify.go +++ b/internal/mode/static/nginx/runtime/verify.go @@ -81,7 +81,10 @@ func (c *verifyClient) waitForCorrectVersion(ctx context.Context, expectedVersio return version == expectedVersion, err }); err != nil { if errors.Is(err, context.DeadlineExceeded) { - err = fmt.Errorf("config version check didn't return expected version within the deadline") + err = fmt.Errorf( + "config version check didn't return expected version %d within the deadline", + expectedVersion, + ) } return fmt.Errorf("could not get expected config version %d: %w", expectedVersion, err) } From 9f5f71ee8a31bd9e6e8b2668f145a22486f912db Mon Sep 17 00:00:00 2001 From: Ciara Stacke Date: Fri, 8 Sep 2023 15:35:55 +0100 Subject: [PATCH 5/7] Move config version to dataplane.Configuration type --- internal/mode/static/handler.go | 6 ++-- internal/mode/static/handler_test.go | 4 +-- .../config/configfakes/fake_generator.go | 29 ++++++++----------- .../mode/static/nginx/config/generator.go | 9 +++--- .../static/nginx/config/generator_test.go | 4 +-- .../mode/static/nginx/config/servers_test.go | 2 +- .../static/state/dataplane/configuration.go | 8 ++--- internal/mode/static/state/dataplane/types.go | 2 ++ 8 files changed, 31 insertions(+), 33 deletions(-) diff --git a/internal/mode/static/handler.go b/internal/mode/static/handler.go index c5c69ca768..126adeba49 100644 --- a/internal/mode/static/handler.go +++ b/internal/mode/static/handler.go @@ -100,14 +100,14 @@ func (h *eventHandlerImpl) HandleEventBatch(ctx context.Context, batch events.Ev h.cfg.statusUpdater.Update(ctx, buildStatuses(graph, nginxReloadRes)) } -func (h *eventHandlerImpl) updateNginx(ctx context.Context, conf dataplane.Configuration) error { - files, configVersion := h.cfg.generator.Generate(conf) +func (h *eventHandlerImpl) updateNginx(ctx context.Context, conf *dataplane.Configuration) error { + files := h.cfg.generator.Generate(conf) if err := h.cfg.nginxFileMgr.ReplaceFiles(files); err != nil { return fmt.Errorf("failed to replace NGINX configuration files: %w", err) } - if err := h.cfg.nginxRuntimeMgr.Reload(ctx, configVersion); err != nil { + if err := h.cfg.nginxRuntimeMgr.Reload(ctx, conf.Version); err != nil { return fmt.Errorf("failed to reload NGINX: %w", err) } diff --git a/internal/mode/static/handler_test.go b/internal/mode/static/handler_test.go index c0393e8f4d..db0a88c39b 100644 --- a/internal/mode/static/handler_test.go +++ b/internal/mode/static/handler_test.go @@ -45,7 +45,7 @@ var _ = Describe("eventHandler", func() { Expect(fakeProcessor.ProcessCallCount()).Should(Equal(1)) Expect(fakeGenerator.GenerateCallCount()).Should(Equal(1)) - Expect(fakeGenerator.GenerateArgsForCall(0)).Should(Equal(expectedConf)) + Expect(fakeGenerator.GenerateArgsForCall(0)).Should(Equal(&expectedConf)) Expect(fakeNginxFileMgr.ReplaceFilesCallCount()).Should(Equal(1)) files := fakeNginxFileMgr.ReplaceFilesArgsForCall(0) @@ -100,7 +100,7 @@ var _ = Describe("eventHandler", func() { BeforeEach(func() { fakeProcessor.ProcessReturns(true /* changed */, &graph.Graph{}) - fakeGenerator.GenerateReturns(fakeCfgFiles, 1) + fakeGenerator.GenerateReturns(fakeCfgFiles) }) When("a batch has one event", func() { diff --git a/internal/mode/static/nginx/config/configfakes/fake_generator.go b/internal/mode/static/nginx/config/configfakes/fake_generator.go index a9afbdb659..0c14817a48 100644 --- a/internal/mode/static/nginx/config/configfakes/fake_generator.go +++ b/internal/mode/static/nginx/config/configfakes/fake_generator.go @@ -10,28 +10,26 @@ import ( ) type FakeGenerator struct { - GenerateStub func(dataplane.Configuration) ([]file.File, int) + GenerateStub func(*dataplane.Configuration) []file.File generateMutex sync.RWMutex generateArgsForCall []struct { - arg1 dataplane.Configuration + arg1 *dataplane.Configuration } generateReturns struct { result1 []file.File - result2 int } generateReturnsOnCall map[int]struct { result1 []file.File - result2 int } invocations map[string][][]interface{} invocationsMutex sync.RWMutex } -func (fake *FakeGenerator) Generate(arg1 dataplane.Configuration) ([]file.File, int) { +func (fake *FakeGenerator) Generate(arg1 *dataplane.Configuration) []file.File { fake.generateMutex.Lock() ret, specificReturn := fake.generateReturnsOnCall[len(fake.generateArgsForCall)] fake.generateArgsForCall = append(fake.generateArgsForCall, struct { - arg1 dataplane.Configuration + arg1 *dataplane.Configuration }{arg1}) stub := fake.GenerateStub fakeReturns := fake.generateReturns @@ -41,9 +39,9 @@ func (fake *FakeGenerator) Generate(arg1 dataplane.Configuration) ([]file.File, return stub(arg1) } if specificReturn { - return ret.result1, ret.result2 + return ret.result1 } - return fakeReturns.result1, fakeReturns.result2 + return fakeReturns.result1 } func (fake *FakeGenerator) GenerateCallCount() int { @@ -52,43 +50,40 @@ func (fake *FakeGenerator) GenerateCallCount() int { return len(fake.generateArgsForCall) } -func (fake *FakeGenerator) GenerateCalls(stub func(dataplane.Configuration) ([]file.File, int)) { +func (fake *FakeGenerator) GenerateCalls(stub func(*dataplane.Configuration) []file.File) { fake.generateMutex.Lock() defer fake.generateMutex.Unlock() fake.GenerateStub = stub } -func (fake *FakeGenerator) GenerateArgsForCall(i int) dataplane.Configuration { +func (fake *FakeGenerator) GenerateArgsForCall(i int) *dataplane.Configuration { fake.generateMutex.RLock() defer fake.generateMutex.RUnlock() argsForCall := fake.generateArgsForCall[i] return argsForCall.arg1 } -func (fake *FakeGenerator) GenerateReturns(result1 []file.File, result2 int) { +func (fake *FakeGenerator) GenerateReturns(result1 []file.File) { fake.generateMutex.Lock() defer fake.generateMutex.Unlock() fake.GenerateStub = nil fake.generateReturns = struct { result1 []file.File - result2 int - }{result1, result2} + }{result1} } -func (fake *FakeGenerator) GenerateReturnsOnCall(i int, result1 []file.File, result2 int) { +func (fake *FakeGenerator) GenerateReturnsOnCall(i int, result1 []file.File) { fake.generateMutex.Lock() defer fake.generateMutex.Unlock() fake.GenerateStub = nil if fake.generateReturnsOnCall == nil { fake.generateReturnsOnCall = make(map[int]struct { result1 []file.File - result2 int }) } fake.generateReturnsOnCall[i] = struct { result1 []file.File - result2 int - }{result1, result2} + }{result1} } func (fake *FakeGenerator) Invocations() map[string][][]interface{} { diff --git a/internal/mode/static/nginx/config/generator.go b/internal/mode/static/nginx/config/generator.go index c015a94261..b9fd10b508 100644 --- a/internal/mode/static/nginx/config/generator.go +++ b/internal/mode/static/nginx/config/generator.go @@ -32,7 +32,7 @@ var ConfigFolders = []string{httpFolder, secretsFolder} // This interface is used for testing purposes only. type Generator interface { // Generate generates NGINX configuration files from internal representation. - Generate(configuration dataplane.Configuration) ([]file.File, int) + Generate(configuration *dataplane.Configuration) []file.File } // GeneratorImpl is an implementation of Generator. @@ -61,19 +61,20 @@ type executeFunc func(configuration dataplane.Configuration) []byte // It is the responsibility of the caller to validate the configuration before calling this function. // In case of invalid configuration, NGINX will fail to reload or could be configured with malicious configuration. // To validate, use the validators from the validation package. -func (g *GeneratorImpl) Generate(conf dataplane.Configuration) ([]file.File, int) { +func (g *GeneratorImpl) Generate(conf *dataplane.Configuration) []file.File { g.configVersion++ + conf.Version = g.configVersion files := make([]file.File, 0, len(conf.SSLKeyPairs)+1 /* http config */) for id, pair := range conf.SSLKeyPairs { files = append(files, generatePEM(id, pair.Cert, pair.Key)) } - files = append(files, generateHTTPConfig(conf)) + files = append(files, generateHTTPConfig(*conf)) files = append(files, generateConfigVersion(g.configVersion)) - return files, g.configVersion + return files } func generatePEM(id dataplane.SSLKeyPairID, cert []byte, key []byte) file.File { diff --git a/internal/mode/static/nginx/config/generator_test.go b/internal/mode/static/nginx/config/generator_test.go index 8dbd6423ec..774f498e40 100644 --- a/internal/mode/static/nginx/config/generator_test.go +++ b/internal/mode/static/nginx/config/generator_test.go @@ -64,7 +64,7 @@ func TestGenerate(t *testing.T) { generator := config.NewGeneratorImpl() - files, version := generator.Generate(conf) + files := generator.Generate(&conf) g.Expect(files).To(HaveLen(3)) @@ -87,5 +87,5 @@ func TestGenerate(t *testing.T) { g.Expect(files[2].Type).To(Equal(file.TypeRegular)) g.Expect(files[2].Path).To(Equal("/etc/nginx/conf.d/config-version.conf")) configVersion := string(files[2].Content) - g.Expect(configVersion).To(ContainSubstring(fmt.Sprintf("return 200 %d", version))) + g.Expect(configVersion).To(ContainSubstring(fmt.Sprintf("return 200 %d", conf.Version))) } diff --git a/internal/mode/static/nginx/config/servers_test.go b/internal/mode/static/nginx/config/servers_test.go index bf0be01065..84d10ebe60 100644 --- a/internal/mode/static/nginx/config/servers_test.go +++ b/internal/mode/static/nginx/config/servers_test.go @@ -79,9 +79,9 @@ func TestExecuteServers(t *testing.T) { func TestExecuteForDefaultServers(t *testing.T) { testcases := []struct { msg string - conf dataplane.Configuration httpPorts []int sslPorts []int + conf dataplane.Configuration }{ { conf: dataplane.Configuration{}, diff --git a/internal/mode/static/state/dataplane/configuration.go b/internal/mode/static/state/dataplane/configuration.go index cb41b52bd4..eab1fd21ed 100644 --- a/internal/mode/static/state/dataplane/configuration.go +++ b/internal/mode/static/state/dataplane/configuration.go @@ -16,13 +16,13 @@ import ( const wildcardHostname = "~^" // BuildConfiguration builds the Configuration from the Graph. -func BuildConfiguration(ctx context.Context, g *graph.Graph, resolver resolver.ServiceResolver) Configuration { +func BuildConfiguration(ctx context.Context, g *graph.Graph, resolver resolver.ServiceResolver) *Configuration { if g.GatewayClass == nil || !g.GatewayClass.Valid { - return Configuration{} + return &Configuration{} } if g.Gateway == nil { - return Configuration{} + return &Configuration{} } upstreams := buildUpstreams(ctx, g.Gateway.Listeners, resolver) @@ -38,7 +38,7 @@ func BuildConfiguration(ctx context.Context, g *graph.Graph, resolver resolver.S SSLKeyPairs: keyPairs, } - return config + return &config } // buildSSLKeyPairs builds the SSLKeyPairs from the Secrets. It will only include Secrets that are referenced by diff --git a/internal/mode/static/state/dataplane/types.go b/internal/mode/static/state/dataplane/types.go index e6ee3f0d5f..9964227829 100644 --- a/internal/mode/static/state/dataplane/types.go +++ b/internal/mode/static/state/dataplane/types.go @@ -31,6 +31,8 @@ type Configuration struct { Upstreams []Upstream // BackendGroups holds all unique BackendGroups. BackendGroups []BackendGroup + // Version represents the version of the generated configuration. + Version int } // SSLKeyPairID is a unique identifier for a SSLKeyPair. From ac09dcd01d9fe5b6df58cab2525c1a297053d200 Mon Sep 17 00:00:00 2001 From: Ciara Stacke Date: Mon, 11 Sep 2023 10:26:59 +0100 Subject: [PATCH 6/7] Tidy tests --- .../mode/static/nginx/config/version_test.go | 2 +- .../mode/static/nginx/runtime/manager_test.go | 44 ++++++------------- internal/mode/static/nginx/runtime/verify.go | 1 + .../mode/static/nginx/runtime/verify_test.go | 2 +- 4 files changed, 17 insertions(+), 32 deletions(-) diff --git a/internal/mode/static/nginx/config/version_test.go b/internal/mode/static/nginx/config/version_test.go index 3432354259..4219844c39 100644 --- a/internal/mode/static/nginx/config/version_test.go +++ b/internal/mode/static/nginx/config/version_test.go @@ -8,7 +8,7 @@ import ( ) func TestExecuteVersion(t *testing.T) { - g := NewGomegaWithT(t) + g := NewWithT(t) expSubStrings := map[string]int{ "return 200 42;": 1, } diff --git a/internal/mode/static/nginx/runtime/manager_test.go b/internal/mode/static/nginx/runtime/manager_test.go index 0993f0d99d..1b31408580 100644 --- a/internal/mode/static/nginx/runtime/manager_test.go +++ b/internal/mode/static/nginx/runtime/manager_test.go @@ -4,7 +4,6 @@ import ( "context" "errors" "io/fs" - "os" "testing" "time" @@ -100,7 +99,7 @@ func TestFindMainProcess(t *testing.T) { for _, test := range tests { t.Run(test.name, func(t *testing.T) { - g := NewGomegaWithT(t) + g := NewWithT(t) result, err := findMainProcess(test.ctx, test.checkFile, test.readFile, 2*time.Millisecond) @@ -115,30 +114,20 @@ func TestFindMainProcess(t *testing.T) { } func TestEnsureNewNginxWorkers(t *testing.T) { + previousContents := []byte("1 2 3") + newContents := []byte("4 5 6") + readFileError := func(string) ([]byte, error) { return nil, errors.New("error") } - tempFileFunc := func(contents []byte) *os.File { - tempFile, err := os.CreateTemp("", "tmpfile-") - if err != nil { - return nil - } - if _, err = tempFile.Write(contents); err != nil { - return nil - } - return tempFile + readFilePrevious := func(string) ([]byte, error) { + return previousContents, nil } - previousContents := []byte("1 2 3") - - childFileSame := tempFileFunc(previousContents) - childFileDifferent := tempFileFunc([]byte("4 5 6")) - - defer childFileSame.Close() - defer os.Remove(childFileSame.Name()) - defer childFileDifferent.Close() - defer os.Remove(childFileDifferent.Name()) + readFileNew := func(string) ([]byte, error) { + return newContents, nil + } ctx := context.Background() cancellingCtx, cancel := context.WithCancel(ctx) @@ -147,15 +136,13 @@ func TestEnsureNewNginxWorkers(t *testing.T) { tests := []struct { ctx context.Context readFile readFileFunc - childFile string name string previousContents []byte expectError bool }{ { ctx: ctx, - readFile: os.ReadFile, - childFile: childFileDifferent.Name(), + readFile: readFileNew, previousContents: previousContents, expectError: false, name: "normal case", @@ -163,23 +150,20 @@ func TestEnsureNewNginxWorkers(t *testing.T) { { ctx: ctx, readFile: readFileError, - childFile: childFileDifferent.Name(), previousContents: previousContents, expectError: true, name: "cannot read file", }, { ctx: ctx, - readFile: os.ReadFile, - childFile: childFileSame.Name(), + readFile: readFilePrevious, previousContents: previousContents, expectError: true, name: "no new workers", }, { ctx: cancellingCtx, - readFile: os.ReadFile, - childFile: childFileSame.Name(), + readFile: readFilePrevious, previousContents: previousContents, expectError: true, name: "context canceled", @@ -188,11 +172,11 @@ func TestEnsureNewNginxWorkers(t *testing.T) { for _, test := range tests { t.Run(test.name, func(t *testing.T) { - g := NewGomegaWithT(t) + g := NewWithT(t) err := ensureNewNginxWorkers( test.ctx, - test.childFile, + "/childfile", test.previousContents, test.readFile, 2*time.Millisecond, diff --git a/internal/mode/static/nginx/runtime/verify.go b/internal/mode/static/nginx/runtime/verify.go index 519885816f..1b5dff93d1 100644 --- a/internal/mode/static/nginx/runtime/verify.go +++ b/internal/mode/static/nginx/runtime/verify.go @@ -40,6 +40,7 @@ func newVerifyClient(timeout time.Duration) *verifyClient { func (c *verifyClient) getConfigVersion() (int, error) { ctx, cancel := context.WithTimeout(context.Background(), c.timeout) defer cancel() + req, err := http.NewRequestWithContext(ctx, "GET", "http://config-version/version", nil) if err != nil { return 0, fmt.Errorf("error creating request: %w", err) diff --git a/internal/mode/static/nginx/runtime/verify_test.go b/internal/mode/static/nginx/runtime/verify_test.go index 0f32704bb5..9cd35f0bca 100644 --- a/internal/mode/static/nginx/runtime/verify_test.go +++ b/internal/mode/static/nginx/runtime/verify_test.go @@ -66,7 +66,7 @@ func TestVerifyClient(t *testing.T) { for _, test := range tests { t.Run(test.name, func(t *testing.T) { - g := NewGomegaWithT(t) + g := NewWithT(t) err := c.waitForCorrectVersion(test.ctx, test.expectedVersion) From d7b261dbda403488ce4b6e98ddf8a03263d138ef Mon Sep 17 00:00:00 2001 From: Ciara Stacke Date: Mon, 11 Sep 2023 11:31:09 +0100 Subject: [PATCH 7/7] Move version state to event handler --- internal/mode/static/handler.go | 10 ++++++++-- internal/mode/static/handler_test.go | 6 +++--- internal/mode/static/manager.go | 2 +- .../nginx/config/configfakes/fake_generator.go | 12 ++++++------ internal/mode/static/nginx/config/generator.go | 18 ++++++------------ .../mode/static/nginx/config/generator_test.go | 2 +- .../static/state/dataplane/configuration.go | 14 ++++++++++---- .../state/dataplane/configuration_test.go | 3 ++- 8 files changed, 37 insertions(+), 30 deletions(-) diff --git a/internal/mode/static/handler.go b/internal/mode/static/handler.go index 126adeba49..144cc0adc2 100644 --- a/internal/mode/static/handler.go +++ b/internal/mode/static/handler.go @@ -45,6 +45,8 @@ type eventHandlerConfig struct { logger logr.Logger // controlConfigNSName is the NamespacedName of the NginxGateway config for this controller. controlConfigNSName types.NamespacedName + // version is the current version number of the nginx config. + version int } // eventHandlerImpl implements EventHandler. @@ -90,7 +92,11 @@ func (h *eventHandlerImpl) HandleEventBatch(ctx context.Context, batch events.Ev } var nginxReloadRes nginxReloadResult - if err := h.updateNginx(ctx, dataplane.BuildConfiguration(ctx, graph, h.cfg.serviceResolver)); err != nil { + h.cfg.version++ + if err := h.updateNginx( + ctx, + dataplane.BuildConfiguration(ctx, graph, h.cfg.serviceResolver, h.cfg.version), + ); err != nil { h.cfg.logger.Error(err, "Failed to update NGINX configuration") nginxReloadRes.error = err } else { @@ -100,7 +106,7 @@ func (h *eventHandlerImpl) HandleEventBatch(ctx context.Context, batch events.Ev h.cfg.statusUpdater.Update(ctx, buildStatuses(graph, nginxReloadRes)) } -func (h *eventHandlerImpl) updateNginx(ctx context.Context, conf *dataplane.Configuration) error { +func (h *eventHandlerImpl) updateNginx(ctx context.Context, conf dataplane.Configuration) error { files := h.cfg.generator.Generate(conf) if err := h.cfg.nginxFileMgr.ReplaceFiles(files); err != nil { diff --git a/internal/mode/static/handler_test.go b/internal/mode/static/handler_test.go index db0a88c39b..a6b0fa4a42 100644 --- a/internal/mode/static/handler_test.go +++ b/internal/mode/static/handler_test.go @@ -45,7 +45,7 @@ var _ = Describe("eventHandler", func() { Expect(fakeProcessor.ProcessCallCount()).Should(Equal(1)) Expect(fakeGenerator.GenerateCallCount()).Should(Equal(1)) - Expect(fakeGenerator.GenerateArgsForCall(0)).Should(Equal(&expectedConf)) + Expect(fakeGenerator.GenerateArgsForCall(0)).Should(Equal(expectedConf)) Expect(fakeNginxFileMgr.ReplaceFilesCallCount()).Should(Equal(1)) files := fakeNginxFileMgr.ReplaceFilesArgsForCall(0) @@ -111,7 +111,7 @@ var _ = Describe("eventHandler", func() { handler.HandleEventBatch(context.Background(), batch) checkUpsertEventExpectations(e) - expectReconfig(dataplane.Configuration{}, fakeCfgFiles) + expectReconfig(dataplane.Configuration{Version: 1}, fakeCfgFiles) }) It("should process Delete", func() { @@ -124,7 +124,7 @@ var _ = Describe("eventHandler", func() { handler.HandleEventBatch(context.Background(), batch) checkDeleteEventExpectations(e) - expectReconfig(dataplane.Configuration{}, fakeCfgFiles) + expectReconfig(dataplane.Configuration{Version: 1}, fakeCfgFiles) }) }) diff --git a/internal/mode/static/manager.go b/internal/mode/static/manager.go index be8599738d..ac5a239775 100644 --- a/internal/mode/static/manager.go +++ b/internal/mode/static/manager.go @@ -212,7 +212,7 @@ func StartManager(cfg config.Config) error { eventHandler := newEventHandlerImpl(eventHandlerConfig{ processor: processor, serviceResolver: resolver.NewServiceResolverImpl(mgr.GetClient()), - generator: &configGenerator, + generator: configGenerator, logger: cfg.Logger.WithName("eventHandler"), logLevelSetter: logLevelSetter, nginxFileMgr: nginxFileMgr, diff --git a/internal/mode/static/nginx/config/configfakes/fake_generator.go b/internal/mode/static/nginx/config/configfakes/fake_generator.go index 0c14817a48..4b058a3553 100644 --- a/internal/mode/static/nginx/config/configfakes/fake_generator.go +++ b/internal/mode/static/nginx/config/configfakes/fake_generator.go @@ -10,10 +10,10 @@ import ( ) type FakeGenerator struct { - GenerateStub func(*dataplane.Configuration) []file.File + GenerateStub func(dataplane.Configuration) []file.File generateMutex sync.RWMutex generateArgsForCall []struct { - arg1 *dataplane.Configuration + arg1 dataplane.Configuration } generateReturns struct { result1 []file.File @@ -25,11 +25,11 @@ type FakeGenerator struct { invocationsMutex sync.RWMutex } -func (fake *FakeGenerator) Generate(arg1 *dataplane.Configuration) []file.File { +func (fake *FakeGenerator) Generate(arg1 dataplane.Configuration) []file.File { fake.generateMutex.Lock() ret, specificReturn := fake.generateReturnsOnCall[len(fake.generateArgsForCall)] fake.generateArgsForCall = append(fake.generateArgsForCall, struct { - arg1 *dataplane.Configuration + arg1 dataplane.Configuration }{arg1}) stub := fake.GenerateStub fakeReturns := fake.generateReturns @@ -50,13 +50,13 @@ func (fake *FakeGenerator) GenerateCallCount() int { return len(fake.generateArgsForCall) } -func (fake *FakeGenerator) GenerateCalls(stub func(*dataplane.Configuration) []file.File) { +func (fake *FakeGenerator) GenerateCalls(stub func(dataplane.Configuration) []file.File) { fake.generateMutex.Lock() defer fake.generateMutex.Unlock() fake.GenerateStub = stub } -func (fake *FakeGenerator) GenerateArgsForCall(i int) *dataplane.Configuration { +func (fake *FakeGenerator) GenerateArgsForCall(i int) dataplane.Configuration { fake.generateMutex.RLock() defer fake.generateMutex.RUnlock() argsForCall := fake.generateArgsForCall[i] diff --git a/internal/mode/static/nginx/config/generator.go b/internal/mode/static/nginx/config/generator.go index b9fd10b508..851d8147f8 100644 --- a/internal/mode/static/nginx/config/generator.go +++ b/internal/mode/static/nginx/config/generator.go @@ -32,7 +32,7 @@ var ConfigFolders = []string{httpFolder, secretsFolder} // This interface is used for testing purposes only. type Generator interface { // Generate generates NGINX configuration files from internal representation. - Generate(configuration *dataplane.Configuration) []file.File + Generate(configuration dataplane.Configuration) []file.File } // GeneratorImpl is an implementation of Generator. @@ -43,15 +43,11 @@ type Generator interface { // // It also expects that the main NGINX configuration file nginx.conf is located in configFolder and nginx.conf // includes (https://nginx.org/en/docs/ngx_core_module.html#include) the files from httpFolder. -type GeneratorImpl struct { - configVersion int -} +type GeneratorImpl struct{} // NewGeneratorImpl creates a new GeneratorImpl. func NewGeneratorImpl() GeneratorImpl { - return GeneratorImpl{ - configVersion: 0, - } + return GeneratorImpl{} } // executeFunc is a function that generates NGINX configuration from internal representation. @@ -61,18 +57,16 @@ type executeFunc func(configuration dataplane.Configuration) []byte // It is the responsibility of the caller to validate the configuration before calling this function. // In case of invalid configuration, NGINX will fail to reload or could be configured with malicious configuration. // To validate, use the validators from the validation package. -func (g *GeneratorImpl) Generate(conf *dataplane.Configuration) []file.File { - g.configVersion++ - conf.Version = g.configVersion +func (g GeneratorImpl) Generate(conf dataplane.Configuration) []file.File { files := make([]file.File, 0, len(conf.SSLKeyPairs)+1 /* http config */) for id, pair := range conf.SSLKeyPairs { files = append(files, generatePEM(id, pair.Cert, pair.Key)) } - files = append(files, generateHTTPConfig(*conf)) + files = append(files, generateHTTPConfig(conf)) - files = append(files, generateConfigVersion(g.configVersion)) + files = append(files, generateConfigVersion(conf.Version)) return files } diff --git a/internal/mode/static/nginx/config/generator_test.go b/internal/mode/static/nginx/config/generator_test.go index 774f498e40..983185d2c0 100644 --- a/internal/mode/static/nginx/config/generator_test.go +++ b/internal/mode/static/nginx/config/generator_test.go @@ -64,7 +64,7 @@ func TestGenerate(t *testing.T) { generator := config.NewGeneratorImpl() - files := generator.Generate(&conf) + files := generator.Generate(conf) g.Expect(files).To(HaveLen(3)) diff --git a/internal/mode/static/state/dataplane/configuration.go b/internal/mode/static/state/dataplane/configuration.go index eab1fd21ed..d438c1ec66 100644 --- a/internal/mode/static/state/dataplane/configuration.go +++ b/internal/mode/static/state/dataplane/configuration.go @@ -16,13 +16,18 @@ import ( const wildcardHostname = "~^" // BuildConfiguration builds the Configuration from the Graph. -func BuildConfiguration(ctx context.Context, g *graph.Graph, resolver resolver.ServiceResolver) *Configuration { +func BuildConfiguration( + ctx context.Context, + g *graph.Graph, + resolver resolver.ServiceResolver, + configVersion int, +) Configuration { if g.GatewayClass == nil || !g.GatewayClass.Valid { - return &Configuration{} + return Configuration{Version: configVersion} } if g.Gateway == nil { - return &Configuration{} + return Configuration{Version: configVersion} } upstreams := buildUpstreams(ctx, g.Gateway.Listeners, resolver) @@ -36,9 +41,10 @@ func BuildConfiguration(ctx context.Context, g *graph.Graph, resolver resolver.S Upstreams: upstreams, BackendGroups: backendGroups, SSLKeyPairs: keyPairs, + Version: configVersion, } - return &config + return config } // buildSSLKeyPairs builds the SSLKeyPairs from the Secrets. It will only include Secrets that are referenced by diff --git a/internal/mode/static/state/dataplane/configuration_test.go b/internal/mode/static/state/dataplane/configuration_test.go index 9e722d0e01..cff5bc8592 100644 --- a/internal/mode/static/state/dataplane/configuration_test.go +++ b/internal/mode/static/state/dataplane/configuration_test.go @@ -1488,13 +1488,14 @@ func TestBuildConfiguration(t *testing.T) { t.Run(test.msg, func(t *testing.T) { g := NewGomegaWithT(t) - result := BuildConfiguration(context.TODO(), test.graph, fakeResolver) + result := BuildConfiguration(context.TODO(), test.graph, fakeResolver, 1) g.Expect(result.BackendGroups).To(ConsistOf(test.expConf.BackendGroups)) g.Expect(result.Upstreams).To(ConsistOf(test.expConf.Upstreams)) g.Expect(result.HTTPServers).To(ConsistOf(test.expConf.HTTPServers)) g.Expect(result.SSLServers).To(ConsistOf(test.expConf.SSLServers)) g.Expect(result.SSLKeyPairs).To(Equal(test.expConf.SSLKeyPairs)) + g.Expect(result.Version).To(Equal(1)) }) } }