Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fixing the nodebalancer config rebuilds to include ids of preexisting nodebalancer nodes #192

Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
d7865a5
Fixing the nodebalancer config rebuilds to include ids of preexisting…
akaokunc Mar 13, 2024
bb0ce4e
Bumping k8s deps and updating CCM to reflect new API
akaokunc Mar 19, 2024
f7449de
Fixing node_controller and service_controller due to changes in k8s api.
akaokunc Mar 19, 2024
416767c
upgrading toolchain
akaokunc Mar 19, 2024
50ecce4
Bumping CI's go version
akaokunc Mar 19, 2024
7d9df14
Updating go .mod
akaokunc Mar 27, 2024
c0bce4c
Adding node for nodebalancer test
akaokunc Mar 27, 2024
566c108
Adding test for nodebalancer config update and fixing capacity of new…
akaokunc Apr 2, 2024
7133b8c
Fixing loop variable export on finding the request type within fake r…
akaokunc Apr 2, 2024
d97f744
Updating go.mod
akaokunc Apr 2, 2024
c1a903c
gofumpt + go.mod updates
akaokunc Apr 2, 2024
6285aaa
Adding build deps/tools to separate file
akaokunc Apr 3, 2024
46f6365
Bumping e2e tests go version
akaokunc Apr 5, 2024
1580640
Addressing review comments
akaokunc Apr 5, 2024
71b2ec2
Update cloud/linode/loadbalancers.go
akaokunc Apr 5, 2024
79b7fd6
Update cloud/linode/loadbalancers_test.go
akaokunc Apr 5, 2024
49c9fa2
Refactored client mocks to generate just one file and dropped the two…
akaokunc Apr 8, 2024
45aca4e
Saving some cycles during tests by compiling the regex just once.
akaokunc Apr 8, 2024
f3420f0
Contracting as per @avestuk's suggestion
akaokunc Apr 8, 2024
e2e78f0
Merge branch 'main' into okunc/fix_nodebalancer_config_rebuild_2nd_at…
akaokunc Apr 8, 2024
6b53aec
Addressing review comments
akaokunc Apr 9, 2024
6eb65e6
Adding cluster role to allow getting leases since these are used for …
akaokunc Apr 9, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ jobs:
runs-on: ubuntu-latest
strategy:
matrix:
go-version: [ 'stable', 'oldstable', '1.20' ]
go-version: [ 'stable', 'oldstable', '1.21' ]
steps:
- uses: actions/checkout@v4
with:
Expand Down
1 change: 1 addition & 0 deletions cloud/linode/client/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ type Client interface {
UpdateNodeBalancer(context.Context, int, linodego.NodeBalancerUpdateOptions) (*linodego.NodeBalancer, error)
DeleteNodeBalancer(context.Context, int) error
ListNodeBalancers(context.Context, *linodego.ListOptions) ([]linodego.NodeBalancer, error)
ListNodeBalancerNodes(context.Context, int, int, *linodego.ListOptions) ([]linodego.NodeBalancerNode, error)

CreateNodeBalancerConfig(context.Context, int, linodego.NodeBalancerConfigCreateOptions) (*linodego.NodeBalancerConfig, error)
DeleteNodeBalancerConfig(context.Context, int, int) error
Expand Down
15 changes: 15 additions & 0 deletions cloud/linode/client/mock_client_test.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

53 changes: 38 additions & 15 deletions cloud/linode/loadbalancers.go
Original file line number Diff line number Diff line change
Expand Up @@ -296,12 +296,6 @@ func (l *loadbalancers) updateNodeBalancer(
return err
}

// Add all of the Nodes to the config
var newNBNodes []linodego.NodeBalancerNodeCreateOptions
for _, node := range nodes {
newNBNodes = append(newNBNodes, l.buildNodeBalancerNodeCreateOptions(node, port.NodePort))
}

// Look for an existing config for this port
var currentNBCfg *linodego.NodeBalancerConfig
for i := range nbCfgs {
akaokunc marked this conversation as resolved.
Show resolved Hide resolved
Expand All @@ -311,6 +305,33 @@ func (l *loadbalancers) updateNodeBalancer(
break
}
}
oldNBNodeIDs := make(map[string]int)
if currentNBCfg != nil {
// Obtain list of current NB nodes and convert it to map of node IDs
currentNBNodes, err := l.client.ListNodeBalancerNodes(ctx, nb.ID, currentNBCfg.ID, nil)
if err != nil {
klog.Warningf("Unable to list existing nodebalancer nodes for NB %d config %d, error: %s", nb.ID, newNBCfg.ID, err)
akaokunc marked this conversation as resolved.
Show resolved Hide resolved
} else {
for _, node := range currentNBNodes {
oldNBNodeIDs[node.Address] = node.ID
}
}
akaokunc marked this conversation as resolved.
Show resolved Hide resolved
klog.Infof("Nodebalancer %d had nodes %v", nb.ID, oldNBNodeIDs)
} else {
klog.Infof("No preexisting nodebalancer for port %v found.", port.Port)
}
// Add all of the Nodes to the config
newNBNodes := make([]linodego.NodeBalancerConfigRebuildNodeOptions, 0)
akaokunc marked this conversation as resolved.
Show resolved Hide resolved
for _, node := range nodes {
newNodeOpts := l.buildNodeBalancerNodeConfigRebuildOptions(node, port.NodePort)
oldNodeID, ok := oldNBNodeIDs[newNodeOpts.Address]
if ok {
newNodeOpts.ID = oldNodeID
} else {
klog.Infof("No preexisting node id for %v found.", newNodeOpts.Address)
}
newNBNodes = append(newNBNodes, newNodeOpts)
}

// If there's no existing config, create it
var rebuildOpts linodego.NodeBalancerConfigRebuildOptions
Expand Down Expand Up @@ -652,7 +673,7 @@ func (l *loadbalancers) buildLoadBalancerRequest(ctx context.Context, clusterNam
createOpt := config.GetCreateOptions()

for _, n := range nodes {
createOpt.Nodes = append(createOpt.Nodes, l.buildNodeBalancerNodeCreateOptions(n, port.NodePort))
createOpt.Nodes = append(createOpt.Nodes, l.buildNodeBalancerNodeConfigRebuildOptions(n, port.NodePort).NodeBalancerNodeCreateOptions)
}

configs = append(configs, &createOpt)
Expand All @@ -672,14 +693,16 @@ func coerceString(s string, minLen, maxLen int, padding string) string {
return s
}

func (l *loadbalancers) buildNodeBalancerNodeCreateOptions(node *v1.Node, nodePort int32) linodego.NodeBalancerNodeCreateOptions {
return linodego.NodeBalancerNodeCreateOptions{
Address: fmt.Sprintf("%v:%v", getNodePrivateIP(node), nodePort),
// NodeBalancer backends must be 3-32 chars in length
// If < 3 chars, pad node name with "node-" prefix
Label: coerceString(node.Name, 3, 32, "node-"),
Mode: "accept",
Weight: 100,
func (l *loadbalancers) buildNodeBalancerNodeConfigRebuildOptions(node *v1.Node, nodePort int32) linodego.NodeBalancerConfigRebuildNodeOptions {
return linodego.NodeBalancerConfigRebuildNodeOptions{
NodeBalancerNodeCreateOptions: linodego.NodeBalancerNodeCreateOptions{
Address: fmt.Sprintf("%v:%v", getNodePrivateIP(node), nodePort),
// NodeBalancer backends must be 3-32 chars in length
// If < 3 chars, pad node name with "node-" prefix
Label: coerceString(node.Name, 3, 32, "node-"),
Mode: "accept",
Weight: 100,
},
}
}

Expand Down
3 changes: 2 additions & 1 deletion cloud/linode/loadbalancers_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -1788,7 +1788,8 @@ func testUpdateLoadBalancerAddNodeBalancerID(t *testing.T, client *linodego.Clie
t.Errorf("UpdateLoadBalancer returned an error while updated annotations: %s", err)
}

lbStatus, _, err := lb.GetLoadBalancer(context.TODO(), svc.ClusterName, svc)
clusterName := strings.TrimPrefix(svc.Namespace, "kube-system-")
lbStatus, _, err := lb.GetLoadBalancer(context.TODO(), clusterName, svc)
if err != nil {
t.Errorf("GetLoadBalancer returned an error: %s", err)
}
Expand Down
19 changes: 17 additions & 2 deletions cloud/linode/mock_client_test.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 4 additions & 1 deletion cloud/linode/node_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ func newNodeController(kubeclient kubernetes.Interface, client client.Client, in
}

func (s *nodeController) Run(stopCh <-chan struct{}) {
s.informer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{
_, err := s.informer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{
akaokunc marked this conversation as resolved.
Show resolved Hide resolved
AddFunc: func(obj interface{}) {
node, ok := obj.(*v1.Node)
if !ok {
Expand All @@ -68,6 +68,9 @@ func (s *nodeController) Run(stopCh <-chan struct{}) {
s.queue.Add(node)
},
})
if err != nil {
klog.Errorf("NodeController can't handle newly created node's metadata. %s", err)
}

go wait.Until(s.worker, time.Second, stopCh)
s.informer.Informer().Run(stopCh)
Expand Down
9 changes: 7 additions & 2 deletions cloud/linode/service_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package linode
import (
"context"
"net/http"
"strings"
"time"

"github.com/appscode/go/wait"
Expand Down Expand Up @@ -32,7 +33,7 @@ func newServiceController(loadbalancers *loadbalancers, informer v1informers.Ser
}

func (s *serviceController) Run(stopCh <-chan struct{}) {
s.informer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{
_, err := s.informer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{
akaokunc marked this conversation as resolved.
Show resolved Hide resolved
DeleteFunc: func(obj interface{}) {
service, ok := obj.(*v1.Service)
if !ok {
Expand All @@ -47,6 +48,9 @@ func (s *serviceController) Run(stopCh <-chan struct{}) {
s.queue.Add(service)
},
})
if err != nil {
klog.Errorf("ServiceController didn't successfully register it's Informer %s", err)
}

go wait.Until(s.worker, time.Second, stopCh)
s.informer.Informer().Run(stopCh)
Expand Down Expand Up @@ -91,5 +95,6 @@ func (s *serviceController) processNextDeletion() bool {

func (s *serviceController) handleServiceDeleted(service *v1.Service) error {
klog.Infof("ServiceController handling service (%s) deletion", getServiceNn(service))
return s.loadbalancers.EnsureLoadBalancerDeleted(context.Background(), service.ClusterName, service)
clusterName := strings.TrimPrefix(service.Namespace, "kube-system-")
return s.loadbalancers.EnsureLoadBalancerDeleted(context.Background(), clusterName, service)
}
24 changes: 12 additions & 12 deletions e2e/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -4,18 +4,18 @@ go 1.20

akaokunc marked this conversation as resolved.
Show resolved Hide resolved
require (
github.com/appscode/go v0.0.0-20200323182826-54e98e09185a
github.com/linode/linodego v1.26.0
github.com/onsi/ginkgo/v2 v2.13.2
github.com/linode/linodego v1.30.0
github.com/onsi/ginkgo/v2 v2.17.0
github.com/onsi/gomega v1.30.0
k8s.io/api v0.23.17
k8s.io/apimachinery v0.23.17
k8s.io/client-go v0.23.17
k8s.io/client-go v1.5.2
)

require (
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/go-logr/logr v1.3.0 // indirect
github.com/go-resty/resty/v2 v2.9.1 // indirect
github.com/go-logr/logr v1.4.1 // indirect
github.com/go-resty/resty/v2 v2.11.0 // indirect
github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect
github.com/gogo/protobuf v1.3.2 // indirect
github.com/golang/protobuf v1.5.3 // indirect
Expand All @@ -28,15 +28,15 @@ require (
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.2 // indirect
github.com/spf13/pflag v1.0.5 // indirect
golang.org/x/net v0.19.0 // indirect
golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8 // indirect
golang.org/x/sys v0.15.0 // indirect
golang.org/x/term v0.15.0 // indirect
golang.org/x/net v0.22.0 // indirect
golang.org/x/oauth2 v0.18.0 // indirect
golang.org/x/sys v0.18.0 // indirect
golang.org/x/term v0.18.0 // indirect
golang.org/x/text v0.14.0 // indirect
golang.org/x/time v0.0.0-20220210224613-90d013bbcef8 // indirect
golang.org/x/tools v0.14.0 // indirect
golang.org/x/time v0.3.0 // indirect
golang.org/x/tools v0.17.0 // indirect
google.golang.org/appengine v1.6.7 // indirect
google.golang.org/protobuf v1.28.0 // indirect
google.golang.org/protobuf v1.31.0 // indirect
gopkg.in/inf.v0 v0.9.1 // indirect
gopkg.in/ini.v1 v1.66.6 // indirect
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect
Expand Down
Loading
Loading