Skip to content

Commit 9da51e1

Browse files
committed
Corrects the NGINX Plus Client interface
There was a change in the API for the NGINX Plus Client that was missed when updating to the latest version. This corrects that.
1 parent cbc295e commit 9da51e1

File tree

6 files changed

+76
-23
lines changed

6 files changed

+76
-23
lines changed

cmd/nginx-loadbalancer-kubernetes/main.go

Lines changed: 27 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,16 @@ package main
88
import (
99
"context"
1010
"fmt"
11+
"os"
12+
1113
"github.com/nginxinc/kubernetes-nginx-ingress/internal/configuration"
1214
"github.com/nginxinc/kubernetes-nginx-ingress/internal/observation"
1315
"github.com/nginxinc/kubernetes-nginx-ingress/internal/probation"
1416
"github.com/nginxinc/kubernetes-nginx-ingress/internal/synchronization"
1517
"github.com/sirupsen/logrus"
1618
"k8s.io/client-go/kubernetes"
1719
"k8s.io/client-go/rest"
20+
"k8s.io/client-go/tools/clientcmd"
1821
"k8s.io/client-go/util/workqueue"
1922
)
2023

@@ -88,18 +91,34 @@ func run() error {
8891
return nil
8992
}
9093

94+
// buildKubernetesClient builds a Kubernetes clientset, supporting both in-cluster and out-of-cluster (kubeconfig) configurations.
9195
func buildKubernetesClient() (*kubernetes.Clientset, error) {
92-
logrus.Debug("Watcher::buildKubernetesClient")
93-
k8sConfig, err := rest.InClusterConfig()
94-
if err == rest.ErrNotInCluster {
95-
return nil, fmt.Errorf(`not running in a Cluster: %w`, err)
96-
} else if err != nil {
97-
return nil, fmt.Errorf(`error occurred getting the Cluster config: %w`, err)
96+
var config *rest.Config
97+
var err error
98+
99+
// Try in-cluster config first
100+
config, err = rest.InClusterConfig()
101+
if err != nil {
102+
if err == rest.ErrNotInCluster {
103+
// Not running in a cluster, fall back to kubeconfig
104+
kubeconfigPath := os.Getenv("KUBECONFIG")
105+
if kubeconfigPath == "" {
106+
kubeconfigPath = clientcmd.RecommendedHomeFile // ~/.kube/config
107+
}
108+
109+
config, err = clientcmd.BuildConfigFromFlags("", kubeconfigPath)
110+
if err != nil {
111+
return nil, fmt.Errorf("could not get Kubernetes config: %w", err)
112+
}
113+
} else {
114+
return nil, fmt.Errorf("error occurred getting the in-cluster config: %w", err)
115+
}
98116
}
99117

100-
client, err := kubernetes.NewForConfig(k8sConfig)
118+
// Create the clientset
119+
client, err := kubernetes.NewForConfig(config)
101120
if err != nil {
102-
return nil, fmt.Errorf(`error occurred creating a client: %w`, err)
121+
return nil, fmt.Errorf("error occurred creating a Kubernetes client: %w", err)
103122
}
104123

105124
return client, nil

internal/application/nginx_client_interface.go

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,23 @@
55

66
package application
77

8-
import nginxClient "github.com/nginxinc/nginx-plus-go-client/v2/client"
8+
import (
9+
"context"
10+
11+
nginxClient "github.com/nginxinc/nginx-plus-go-client/v2/client"
12+
)
913

1014
// NginxClientInterface defines the functions used on the NGINX Plus client, abstracting away the full details of that client.
1115
type NginxClientInterface interface {
1216
// DeleteStreamServer is used by the NginxStreamBorderClient.
13-
DeleteStreamServer(upstream string, server string) error
17+
DeleteStreamServer(ctx context.Context, upstream string, server string) error
1418

1519
// UpdateStreamServers is used by the NginxStreamBorderClient.
16-
UpdateStreamServers(upstream string, servers []nginxClient.StreamUpstreamServer) ([]nginxClient.StreamUpstreamServer, []nginxClient.StreamUpstreamServer, []nginxClient.StreamUpstreamServer, error)
20+
UpdateStreamServers(ctx context.Context, upstream string, servers []nginxClient.StreamUpstreamServer) ([]nginxClient.StreamUpstreamServer, []nginxClient.StreamUpstreamServer, []nginxClient.StreamUpstreamServer, error)
1721

1822
// DeleteHTTPServer is used by the NginxHttpBorderClient.
19-
DeleteHTTPServer(upstream string, server string) error
23+
DeleteHTTPServer(ctx context.Context, upstream string, server string) error
2024

2125
// UpdateHTTPServers is used by the NginxHttpBorderClient.
22-
UpdateHTTPServers(upstream string, servers []nginxClient.UpstreamServer) ([]nginxClient.UpstreamServer, []nginxClient.UpstreamServer, []nginxClient.UpstreamServer, error)
26+
UpdateHTTPServers(ctx context.Context, upstream string, servers []nginxClient.UpstreamServer) ([]nginxClient.UpstreamServer, []nginxClient.UpstreamServer, []nginxClient.UpstreamServer, error)
2327
}

internal/application/nginx_http_border_client.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,9 @@
66
package application
77

88
import (
9+
"context"
910
"fmt"
11+
1012
"github.com/nginxinc/kubernetes-nginx-ingress/internal/core"
1113
nginxClient "github.com/nginxinc/nginx-plus-go-client/v2/client"
1214
)
@@ -15,6 +17,7 @@ import (
1517
type NginxHttpBorderClient struct {
1618
BorderClient
1719
nginxClient NginxClientInterface
20+
ctx context.Context
1821
}
1922

2023
// NewNginxHttpBorderClient is the Factory function for creating an NginxHttpBorderClient.
@@ -26,13 +29,14 @@ func NewNginxHttpBorderClient(client interface{}) (Interface, error) {
2629

2730
return &NginxHttpBorderClient{
2831
nginxClient: ngxClient,
32+
ctx: context.Background(),
2933
}, nil
3034
}
3135

3236
// Update manages the Upstream servers for the Upstream Name given in the ServerUpdateEvent.
3337
func (hbc *NginxHttpBorderClient) Update(event *core.ServerUpdateEvent) error {
3438
httpUpstreamServers := asNginxHttpUpstreamServers(event.UpstreamServers)
35-
_, _, _, err := hbc.nginxClient.UpdateHTTPServers(event.UpstreamName, httpUpstreamServers)
39+
_, _, _, err := hbc.nginxClient.UpdateHTTPServers(hbc.ctx, event.UpstreamName, httpUpstreamServers)
3640
if err != nil {
3741
return fmt.Errorf(`error occurred updating the nginx+ upstream server: %w`, err)
3842
}
@@ -42,7 +46,7 @@ func (hbc *NginxHttpBorderClient) Update(event *core.ServerUpdateEvent) error {
4246

4347
// Delete deletes the Upstream server for the Upstream Name given in the ServerUpdateEvent.
4448
func (hbc *NginxHttpBorderClient) Delete(event *core.ServerUpdateEvent) error {
45-
err := hbc.nginxClient.DeleteHTTPServer(event.UpstreamName, event.UpstreamServers[0].Host)
49+
err := hbc.nginxClient.DeleteHTTPServer(hbc.ctx, event.UpstreamName, event.UpstreamServers[0].Host)
4650
if err != nil {
4751
return fmt.Errorf(`error occurred deleting the nginx+ upstream server: %w`, err)
4852
}

internal/application/nginx_stream_border_client.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,9 @@
66
package application
77

88
import (
9+
"context"
910
"fmt"
11+
1012
"github.com/nginxinc/kubernetes-nginx-ingress/internal/core"
1113
nginxClient "github.com/nginxinc/nginx-plus-go-client/v2/client"
1214
)
@@ -15,6 +17,7 @@ import (
1517
type NginxStreamBorderClient struct {
1618
BorderClient
1719
nginxClient NginxClientInterface
20+
ctx context.Context
1821
}
1922

2023
// NewNginxStreamBorderClient is the Factory function for creating an NginxStreamBorderClient.
@@ -26,13 +29,14 @@ func NewNginxStreamBorderClient(client interface{}) (Interface, error) {
2629

2730
return &NginxStreamBorderClient{
2831
nginxClient: ngxClient,
32+
ctx: context.Background(),
2933
}, nil
3034
}
3135

3236
// Update manages the Upstream servers for the Upstream Name given in the ServerUpdateEvent.
3337
func (tbc *NginxStreamBorderClient) Update(event *core.ServerUpdateEvent) error {
3438
streamUpstreamServers := asNginxStreamUpstreamServers(event.UpstreamServers)
35-
_, _, _, err := tbc.nginxClient.UpdateStreamServers(event.UpstreamName, streamUpstreamServers)
39+
_, _, _, err := tbc.nginxClient.UpdateStreamServers(tbc.ctx, event.UpstreamName, streamUpstreamServers)
3640
if err != nil {
3741
return fmt.Errorf(`error occurred updating the nginx+ upstream server: %w`, err)
3842
}
@@ -42,7 +46,7 @@ func (tbc *NginxStreamBorderClient) Update(event *core.ServerUpdateEvent) error
4246

4347
// Delete deletes the Upstream server for the Upstream Name given in the ServerUpdateEvent.
4448
func (tbc *NginxStreamBorderClient) Delete(event *core.ServerUpdateEvent) error {
45-
err := tbc.nginxClient.DeleteStreamServer(event.UpstreamName, event.UpstreamServers[0].Host)
49+
err := tbc.nginxClient.DeleteStreamServer(tbc.ctx, event.UpstreamName, event.UpstreamServers[0].Host)
4650
if err != nil {
4751
return fmt.Errorf(`error occurred deleting the nginx+ upstream server: %w`, err)
4852
}

internal/synchronization/synchronizer_test.go

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,11 @@ package synchronization
88
import (
99
"context"
1010
"fmt"
11+
"testing"
12+
1113
"github.com/nginxinc/kubernetes-nginx-ingress/internal/configuration"
1214
"github.com/nginxinc/kubernetes-nginx-ingress/internal/core"
1315
"github.com/nginxinc/kubernetes-nginx-ingress/test/mocks"
14-
"testing"
1516
)
1617

1718
func TestSynchronizer_NewSynchronizer(t *testing.T) {
@@ -184,6 +185,23 @@ func TestSynchronizer_AddEventsManyHosts(t *testing.T) {
184185
}
185186
}
186187

188+
//func TestBuildBorderClient(t *testing.T) {
189+
// events := buildEvents(1)
190+
//
191+
// settings, err := configuration.NewSettings(context.Background(), nil)
192+
// rateLimiter := &mocks.MockRateLimiter{}
193+
//
194+
// synchronizer, err := NewSynchronizer(settings, rateLimiter)
195+
// if err != nil {
196+
// t.Fatalf(`should have been no error, %v`, err)
197+
// }
198+
//
199+
// _, err = synchronizer.buildBorderClient(events[0])
200+
// if err != nil {
201+
// t.Fatalf(`should have been no error, %v`, err)
202+
// }
203+
//}
204+
187205
func buildEvents(count int) core.ServerUpdateEvents {
188206
events := make(core.ServerUpdateEvents, count)
189207
for i := 0; i < count; i++ {

test/mocks/mock_nginx_plus_client.go

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,11 @@
55

66
package mocks
77

8-
import nginxClient "github.com/nginxinc/nginx-plus-go-client/v2/client"
8+
import (
9+
"context"
10+
11+
nginxClient "github.com/nginxinc/nginx-plus-go-client/v2/client"
12+
)
913

1014
type MockNginxClient struct {
1115
CalledFunctions map[string]bool
@@ -26,7 +30,7 @@ func NewErroringMockClient(err error) *MockNginxClient {
2630
}
2731
}
2832

29-
func (m MockNginxClient) DeleteStreamServer(_ string, _ string) error {
33+
func (m MockNginxClient) DeleteStreamServer(ctx context.Context, string, _ string) error {
3034
m.CalledFunctions["DeleteStreamServer"] = true
3135

3236
if m.Error != nil {
@@ -36,7 +40,7 @@ func (m MockNginxClient) DeleteStreamServer(_ string, _ string) error {
3640
return nil
3741
}
3842

39-
func (m MockNginxClient) UpdateStreamServers(_ string, _ []nginxClient.StreamUpstreamServer) ([]nginxClient.StreamUpstreamServer, []nginxClient.StreamUpstreamServer, []nginxClient.StreamUpstreamServer, error) {
43+
func (m MockNginxClient) UpdateStreamServers(ctx context.Context, _ string, _ []nginxClient.StreamUpstreamServer) ([]nginxClient.StreamUpstreamServer, []nginxClient.StreamUpstreamServer, []nginxClient.StreamUpstreamServer, error) {
4044
m.CalledFunctions["UpdateStreamServers"] = true
4145

4246
if m.Error != nil {
@@ -46,7 +50,7 @@ func (m MockNginxClient) UpdateStreamServers(_ string, _ []nginxClient.StreamUps
4650
return nil, nil, nil, nil
4751
}
4852

49-
func (m MockNginxClient) DeleteHTTPServer(_ string, _ string) error {
53+
func (m MockNginxClient) DeleteHTTPServer(ctx context.Context, _ string, _ string) error {
5054
m.CalledFunctions["DeleteHTTPServer"] = true
5155

5256
if m.Error != nil {
@@ -56,7 +60,7 @@ func (m MockNginxClient) DeleteHTTPServer(_ string, _ string) error {
5660
return nil
5761
}
5862

59-
func (m MockNginxClient) UpdateHTTPServers(_ string, _ []nginxClient.UpstreamServer) ([]nginxClient.UpstreamServer, []nginxClient.UpstreamServer, []nginxClient.UpstreamServer, error) {
63+
func (m MockNginxClient) UpdateHTTPServers(ctx context.Context, _ string, _ []nginxClient.UpstreamServer) ([]nginxClient.UpstreamServer, []nginxClient.UpstreamServer, []nginxClient.UpstreamServer, error) {
6064
m.CalledFunctions["UpdateHTTPServers"] = true
6165

6266
if m.Error != nil {

0 commit comments

Comments
 (0)