Skip to content

Commit

Permalink
remove vpc from cache if it doesn't exist
Browse files Browse the repository at this point in the history
  • Loading branch information
rahulait committed Nov 13, 2024
1 parent 4527c56 commit f95b9bd
Show file tree
Hide file tree
Showing 3 changed files with 32 additions and 25 deletions.
16 changes: 5 additions & 11 deletions cloud/linode/instances.go
Original file line number Diff line number Diff line change
Expand Up @@ -85,22 +85,16 @@ func (nc *nodeCache) refreshInstances(ctx context.Context, client client.Client)
if vpcName == "" {
continue
}
vpcID, err := GetVPCID(client, strings.TrimSpace(vpcName))
resp, err := GetVPCIPAddresses(ctx, client, vpcName)
if err != nil {
klog.Errorf("failed updating instances cache for VPC %s. Error: %s", vpcName, err.Error())
continue

Check warning on line 91 in cloud/linode/instances.go

View check run for this annotation

Codecov / codecov/patch

cloud/linode/instances.go#L90-L91

Added lines #L90 - L91 were not covered by tests
}
if vpcID != 0 {
resp, err := client.ListVPCIPAddresses(ctx, vpcID, linodego.NewListOptions(0, ""))
if err != nil {
return err
}
for _, r := range resp {
if r.Address == nil {
continue
}
vpcNodes[r.LinodeID] = append(vpcNodes[r.LinodeID], *r.Address)
for _, r := range resp {
if r.Address == nil {
continue
}
vpcNodes[r.LinodeID] = append(vpcNodes[r.LinodeID], *r.Address)
}
}

Expand Down
16 changes: 4 additions & 12 deletions cloud/linode/route_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,12 +27,12 @@ type routeCache struct {
}

// RefreshCache checks if cache has expired and updates it accordingly
func (rc *routeCache) refreshRoutes(ctx context.Context, client client.Client) error {
func (rc *routeCache) refreshRoutes(ctx context.Context, client client.Client) {
rc.Mu.Lock()
defer rc.Mu.Unlock()

if time.Since(rc.lastUpdate) < rc.ttl {
return nil
return
}

vpcNodes := map[int][]linodego.VPCIP{}
Expand All @@ -42,23 +42,18 @@ func (rc *routeCache) refreshRoutes(ctx context.Context, client client.Client) e
if vpcName == "" {
continue

Check warning on line 43 in cloud/linode/route_controller.go

View check run for this annotation

Codecov / codecov/patch

cloud/linode/route_controller.go#L43

Added line #L43 was not covered by tests
}
vpcID, err := GetVPCID(client, strings.TrimSpace(vpcName))
resp, err := GetVPCIPAddresses(ctx, client, vpcName)
if err != nil {
klog.Errorf("failed updating cache for VPC %s. Error: %s", vpcName, err.Error())
continue

Check warning on line 48 in cloud/linode/route_controller.go

View check run for this annotation

Codecov / codecov/patch

cloud/linode/route_controller.go#L47-L48

Added lines #L47 - L48 were not covered by tests
}
resp, err := client.ListVPCIPAddresses(ctx, vpcID, linodego.NewListOptions(0, ""))
if err != nil {
return err
}
for _, r := range resp {
vpcNodes[r.LinodeID] = append(vpcNodes[r.LinodeID], r)
}
}

rc.routes = vpcNodes
rc.lastUpdate = time.Now()
return nil
}

type routes struct {
Expand Down Expand Up @@ -104,10 +99,7 @@ func (r *routes) instanceRoutesByID(id int) ([]linodego.VPCIP, error) {
// getInstanceRoutes returns routes for given instance id
// It refreshes routeCache if it has expired
func (r *routes) getInstanceRoutes(ctx context.Context, id int) ([]linodego.VPCIP, error) {
if err := r.routeCache.refreshRoutes(ctx, r.client); err != nil {
return nil, err
}

r.routeCache.refreshRoutes(ctx, r.client)
return r.instanceRoutesByID(id)
}

Expand Down
25 changes: 23 additions & 2 deletions cloud/linode/vpc.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,12 @@ package linode
import (
"context"
"fmt"
"strings"
"sync"

"github.com/linode/linode-cloud-controller-manager/cloud/linode/client"
"github.com/linode/linodego"
"k8s.io/klog/v2"
)

var (
Expand Down Expand Up @@ -35,15 +37,15 @@ func GetAllVPCIDs() []int {
}

// GetVPCID returns the VPC id of given VPC label
func GetVPCID(client client.Client, vpcName string) (int, error) {
func GetVPCID(ctx context.Context, client client.Client, vpcName string) (int, error) {
Mu.Lock()
defer Mu.Unlock()

// check if map contains vpc id for given label
if vpcid, ok := vpcIDs[vpcName]; ok {
return vpcid, nil
}
vpcs, err := client.ListVPCs(context.TODO(), &linodego.ListOptions{})
vpcs, err := client.ListVPCs(ctx, &linodego.ListOptions{})

Check warning on line 48 in cloud/linode/vpc.go

View check run for this annotation

Codecov / codecov/patch

cloud/linode/vpc.go#L48

Added line #L48 was not covered by tests
if err != nil {
return 0, err
}
Expand All @@ -55,3 +57,22 @@ func GetVPCID(client client.Client, vpcName string) (int, error) {
}
return 0, vpcLookupError{vpcName}
}

// GetVPCIPAddresses returns vpc ip's for given VPC label
func GetVPCIPAddresses(ctx context.Context, client client.Client, vpcName string) ([]linodego.VPCIP, error) {
vpcID, err := GetVPCID(ctx, client, strings.TrimSpace(vpcName))
if err != nil {
return nil, err
}

Check warning on line 66 in cloud/linode/vpc.go

View check run for this annotation

Codecov / codecov/patch

cloud/linode/vpc.go#L65-L66

Added lines #L65 - L66 were not covered by tests
resp, err := client.ListVPCIPAddresses(ctx, vpcID, linodego.NewListOptions(0, ""))
if err != nil {
if strings.Contains(err.Error(), "Not found") {
Mu.Lock()
defer Mu.Unlock()
klog.Errorf("vpc %s not found. Deleting entry from cache", vpcName)
delete(vpcIDs, vpcName)
}
return nil, err

Check warning on line 75 in cloud/linode/vpc.go

View check run for this annotation

Codecov / codecov/patch

cloud/linode/vpc.go#L69-L75

Added lines #L69 - L75 were not covered by tests
}
return resp, nil
}

0 comments on commit f95b9bd

Please sign in to comment.