Skip to content

Commit 98d1d1b

Browse files
committed
Add socket option to agent config for NGINX API
1 parent 0746682 commit 98d1d1b

File tree

5 files changed

+73
-5
lines changed

5 files changed

+73
-5
lines changed

internal/config/config.go

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -501,6 +501,18 @@ func registerDataPlaneFlags(fs *flag.FlagSet) {
501501
"Warning messages in the NGINX errors logs after a NGINX reload will be treated as an error.",
502502
)
503503

504+
fs.String(
505+
NginxApiURLKey,
506+
"",
507+
"The NGINX Plus API URL.",
508+
)
509+
510+
fs.String(
511+
NginxApiSocketKey,
512+
"",
513+
"The NGINX Plus API Unix socket path.",
514+
)
515+
504516
fs.String(
505517
NginxApiTlsCaKey,
506518
DefNginxApiTlsCa,
@@ -1090,14 +1102,15 @@ func parseJSON(value string) interface{} {
10901102
}
10911103

10921104
func resolveDataPlaneConfig() *DataPlaneConfig {
1093-
return &DataPlaneConfig{
1105+
dataPlaneConfig := &DataPlaneConfig{
10941106
Nginx: &NginxDataPlaneConfig{
10951107
ReloadMonitoringPeriod: viperInstance.GetDuration(NginxReloadMonitoringPeriodKey),
10961108
TreatWarningsAsErrors: viperInstance.GetBool(NginxTreatWarningsAsErrorsKey),
10971109
ExcludeLogs: viperInstance.GetStringSlice(NginxExcludeLogsKey),
10981110
API: &NginxAPI{
1099-
URL: viperInstance.GetString(NginxApiURLKey),
1100-
TLS: TLSConfig{Ca: viperInstance.GetString(NginxApiTlsCaKey)},
1111+
URL: viperInstance.GetString(NginxApiURLKey),
1112+
Socket: viperInstance.GetString(NginxApiSocketKey),
1113+
TLS: TLSConfig{Ca: viperInstance.GetString(NginxApiTlsCaKey)},
11011114
},
11021115
ReloadBackoff: &BackOff{
11031116
InitialInterval: viperInstance.GetDuration(NginxReloadBackoffInitialIntervalKey),
@@ -1108,6 +1121,12 @@ func resolveDataPlaneConfig() *DataPlaneConfig {
11081121
},
11091122
},
11101123
}
1124+
1125+
if dataPlaneConfig.Nginx.API.Socket != "" && !strings.HasPrefix(dataPlaneConfig.Nginx.API.Socket, "unix:") {
1126+
dataPlaneConfig.Nginx.API.Socket = "unix:" + dataPlaneConfig.Nginx.API.Socket
1127+
}
1128+
1129+
return dataPlaneConfig
11111130
}
11121131

11131132
func resolveClient() *Client {

internal/config/flags.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,7 @@ var (
139139
NginxExcludeLogsKey = pre(DataPlaneConfigRootKey, "nginx") + "exclude_logs"
140140
NginxApiTlsCaKey = pre(DataPlaneConfigRootKey, "nginx") + "api_tls_ca"
141141
NginxApiURLKey = pre(DataPlaneConfigRootKey, "nginx") + "api_url"
142+
NginxApiSocketKey = pre(DataPlaneConfigRootKey, "nginx") + "api_socket"
142143

143144
SyslogServerPort = pre("syslog_server") + "port"
144145

internal/config/types.go

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,8 +74,9 @@ type (
7474
}
7575

7676
NginxAPI struct {
77-
URL string `yaml:"url" mapstructure:"url"`
78-
TLS TLSConfig `yaml:"tls" mapstructure:"tls"`
77+
URL string `yaml:"url" mapstructure:"url"`
78+
Socket string `yaml:"socket" mapstructure:"socket"`
79+
TLS TLSConfig `yaml:"tls" mapstructure:"tls"`
7980
}
8081

8182
Client struct {
@@ -510,6 +511,14 @@ func (c *Config) IsNginxApiUrlConfigured() bool {
510511
return c.DataPlaneConfig.Nginx.API.URL != ""
511512
}
512513

514+
func (c *Config) IsNginxApiSocketConfigured() bool {
515+
if !c.IsNginxApiConfigured() {
516+
return false
517+
}
518+
519+
return c.DataPlaneConfig.Nginx.API.Socket != ""
520+
}
521+
513522
func (c *Config) IsNginxApiConfigured() bool {
514523
if c.DataPlaneConfig == nil || c.DataPlaneConfig.Nginx == nil || c.DataPlaneConfig.Nginx.API == nil {
515524
return false

internal/datasource/config/nginx_config_parser.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -330,6 +330,10 @@ func (ncp *NginxConfigParser) addApiToNginxConfigContext(
330330
return nginxConfigContext
331331
}
332332

333+
if ncp.agentConfig.IsNginxApiSocketConfigured() {
334+
apiDetails.Listen = ncp.agentConfig.DataPlaneConfig.Nginx.API.Socket
335+
}
336+
333337
if ncp.pingAPIEndpoint(ctx, apiDetails, stubStatusAPIDirective) {
334338
nginxConfigContext.StubStatus = apiDetails
335339
} else if ncp.pingAPIEndpoint(ctx, apiDetails, plusAPIDirective) {

internal/datasource/config/nginx_config_parser_test.go

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99
"bytes"
1010
"context"
1111
"fmt"
12+
"net"
1213
"net/http"
1314
"net/http/httptest"
1415
"net/url"
@@ -756,6 +757,23 @@ func TestNginxConfigParser_PlusAPIParse(t *testing.T) {
756757
fakeServerUrl, err := url.Parse(fakeServer.URL)
757758
require.NoError(t, err)
758759

760+
// Create a unix socket listener for testing unix socket
761+
socketFile, err := os.CreateTemp("/tmp", "nginx-plus-api-*.sock")
762+
require.NoError(t, err)
763+
socket := socketFile.Name()
764+
require.NoError(t, socketFile.Close())
765+
require.NoError(t, os.Remove(socket))
766+
defer os.Remove(socket)
767+
768+
listener, err := (&net.ListenConfig{}).Listen(t.Context(), "unix", socket)
769+
require.NoError(t, err)
770+
defer listener.Close()
771+
772+
server := httptest.NewUnstartedServer(handler)
773+
server.Listener = listener
774+
server.Start()
775+
defer server.Close()
776+
759777
file := helpers.CreateFileWithErrorCheck(t, dir, "nginx-parse-config.conf")
760778
defer helpers.RemoveFileWithErrorCheck(t, file.Name())
761779

@@ -772,25 +790,40 @@ func TestNginxConfigParser_PlusAPIParse(t *testing.T) {
772790
agentConfigWithOverride.DataPlaneConfig.Nginx.API = &config.NginxAPI{
773791
URL: fmt.Sprintf("http://localhost:%s/api/", fakeServerUrl.Port()),
774792
}
793+
agentConfigWithUnixOverride := types.AgentConfig()
794+
agentConfigWithUnixOverride.DataPlaneConfig.Nginx.API = &config.NginxAPI{
795+
URL: "http://localhost/api/",
796+
Socket: "unix:" + socket,
797+
}
775798

776799
tests := []struct {
777800
agentConfig *config.Config
778801
name string
779802
content string
780803
url string
804+
listen string
781805
}{
782806
{
783807
name: "Test 1: No override of Plus API URL in agent config",
784808
content: testconfig.NginxConfigWithPlusAPI(fakeServerUrl.Port()),
785809
url: "http://localhost:" + fakeServerUrl.Port() + "/api/",
810+
listen: "localhost:" + fakeServerUrl.Port(),
786811
agentConfig: types.AgentConfig(),
787812
},
788813
{
789814
name: "Test 2: Override Plus API URL in agent config",
790815
content: testconfig.NginxConfigWithPlusAPI("8080"),
791816
url: "http://localhost:" + fakeServerUrl.Port() + "/api/",
817+
listen: "localhost:" + fakeServerUrl.Port(),
792818
agentConfig: agentConfigWithOverride,
793819
},
820+
{
821+
name: "Test 3: Override Plus API URL in agent config with unix socket",
822+
content: testconfig.NginxConfigWithPlusAPI("8080"),
823+
url: "http://localhost/api/",
824+
listen: "unix:" + socket,
825+
agentConfig: agentConfigWithUnixOverride,
826+
},
794827
}
795828

796829
for _, test := range tests {
@@ -806,6 +839,8 @@ func TestNginxConfigParser_PlusAPIParse(t *testing.T) {
806839
require.NoError(t, parseError)
807840

808841
assert.Equal(t, test.url, result.PlusAPI.URL)
842+
assert.Equal(t, test.listen, result.PlusAPI.Listen)
843+
assert.Equal(t, "/api/", result.PlusAPI.Location)
809844
})
810845
}
811846
}

0 commit comments

Comments
 (0)