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

Change return type of AggregatedListNetworkEndpointGroup in cloudprovideradapter. #938

Merged
merged 2 commits into from
Nov 14, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
26 changes: 16 additions & 10 deletions pkg/neg/manager.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ import (
"sync"

"github.com/GoogleCloudPlatform/k8s-cloud-provider/pkg/cloud/meta"
v1 "k8s.io/api/core/v1"
"k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/labels"
utilerrors "k8s.io/apimachinery/pkg/util/errors"
"k8s.io/apimachinery/pkg/util/sets"
Expand Down Expand Up @@ -255,17 +255,23 @@ func (manager *syncerManager) garbageCollectSyncer() {
func (manager *syncerManager) garbageCollectNEG() error {
// Retrieve aggregated NEG list from cloud
// Compare against svcPortMap and Remove unintended NEGs by best effort
zoneNEGList, err := manager.cloud.AggregatedListNetworkEndpointGroup(meta.VersionGA)
negList, err := manager.cloud.AggregatedListNetworkEndpointGroup(meta.VersionGA)
if err != nil {
return fmt.Errorf("failed to retrieve aggregated NEG list: %v", err)
}

negNames := sets.String{}
for _, list := range zoneNEGList {
for _, neg := range list {
if manager.namer.IsNEG(neg.Name) {
negNames.Insert(neg.Name)
deleteCandidates := map[string][]string{}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: add a comment
// deleteCandidates is a map from neg name to list of zones it is in.

for key, neg := range negList {
if key.Type() != meta.Zonal {
// covers the case when key.Zone is not populated
klog.V(4).Infof("Ignoring key %v as it is not zonal", key)
continue
}
if manager.namer.IsNEG(neg.Name) {
if _, ok := deleteCandidates[neg.Name]; !ok {
deleteCandidates[neg.Name] = []string{}
}
deleteCandidates[neg.Name] = append(deleteCandidates[neg.Name], key.Zone)
}
}

Expand All @@ -274,7 +280,7 @@ func (manager *syncerManager) garbageCollectNEG() error {
defer manager.mu.Unlock()
for _, portInfoMap := range manager.svcPortMap {
for _, portInfo := range portInfoMap {
negNames.Delete(portInfo.NegName)
delete(deleteCandidates, portInfo.NegName)
}
}
}()
Expand All @@ -283,8 +289,8 @@ func (manager *syncerManager) garbageCollectNEG() error {
// The worst outcome of the race condition is that neg is deleted in the end but user actually specifies a neg.
// This would be resolved (sync neg) when the next endpoint update or resync arrives.
// TODO: avoid race condition here
for zone := range zoneNEGList {
for _, name := range negNames.List() {
for name, zones := range deleteCandidates {
for _, zone := range zones {
if err := manager.ensureDeleteNetworkEndpointGroup(name, zone); err != nil {
return fmt.Errorf("failed to delete NEG %q in %q: %v", name, zone, err)
}
Expand Down
16 changes: 11 additions & 5 deletions pkg/neg/manager_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -356,15 +356,21 @@ func TestGarbageCollectionNEG(t *testing.T) {
Name: negName,
NetworkEndpointType: string(networkEndpointType),
}, negtypes.TestZone1)
manager.cloud.CreateNetworkEndpointGroup(&composite.NetworkEndpointGroup{
Version: meta.VersionGA,
Name: negName,
NetworkEndpointType: string(networkEndpointType),
}, negtypes.TestZone2)

if err := manager.GC(); err != nil {
t.Fatalf("Failed to GC: %v", err)
}

negs, _ := manager.cloud.ListNetworkEndpointGroup(negtypes.TestZone1, meta.VersionGA)
for _, neg := range negs {
if neg.Name == negName {
t.Errorf("Expect NEG %q to be GCed.", negName)
for _, zone := range []string{negtypes.TestZone1, negtypes.TestZone2} {
negs, _ := manager.cloud.ListNetworkEndpointGroup(zone, meta.VersionGA)
for _, neg := range negs {
if neg.Name == negName {
t.Errorf("Expect NEG %q in zone %q to be GCed.", negName, zone)
}
}
}
}
Expand Down
18 changes: 10 additions & 8 deletions pkg/neg/syncers/transaction_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -151,19 +151,21 @@ func TestTransactionSyncNetworkEndpoints(t *testing.T) {
// Verify the NEGs are created as expected
ret, _ := transactionSyncer.cloud.AggregatedListNetworkEndpointGroup(meta.VersionGA)
expectZones := []string{testZone1, testZone2}
retZones := sets.NewString()

for key, _ := range ret {
retZones.Insert(key.Zone)
}
for _, zone := range expectZones {
negs, ok := ret[zone]
_, ok := retZones[zone]
if !ok {
t.Errorf("Failed to find zone %q from ret %v", zone, ret)
continue
}

if len(negs) != 1 {
t.Errorf("Unexpected negs %v", negs)
} else {
if negs[0].Name != testNegName {
t.Errorf("Unexpected neg %q", negs[0].Name)
}
}
for _, neg := range ret {
if neg.Name != testNegName {
t.Errorf("Unexpected neg %q", neg.Name)
}
}

Expand Down
26 changes: 2 additions & 24 deletions pkg/neg/types/cloudprovideradapter.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@ package types
import (
"github.com/GoogleCloudPlatform/k8s-cloud-provider/pkg/cloud/meta"
"k8s.io/ingress-gce/pkg/composite"
"k8s.io/klog"
"k8s.io/legacy-cloud-providers/gce"
)

Expand Down Expand Up @@ -59,30 +58,9 @@ func (a *cloudProviderAdapter) ListNetworkEndpointGroup(zone string, version met
}

// AggregatedListNetworkEndpointGroup returns a map of zone -> endpoint group.
func (a *cloudProviderAdapter) AggregatedListNetworkEndpointGroup(version meta.Version) (map[string][]*composite.NetworkEndpointGroup, error) {
func (a *cloudProviderAdapter) AggregatedListNetworkEndpointGroup(version meta.Version) (map[*meta.Key]*composite.NetworkEndpointGroup, error) {
// TODO: filter for the region the cluster is in.
all, err := composite.AggregatedListNetworkEndpointGroup(a.c, version)
if err != nil {
return nil, err
}
ret := map[string][]*composite.NetworkEndpointGroup{}
for key, obj := range all {
// key is scope
// zonal key is "zones/<zone name>"
// regional key is "regions/<region name>"
// global key is "global"
// TODO: use cloud provider meta.KeyType and scope name as key
if key.Type() == meta.Global {
klog.V(4).Infof("Ignoring key %v as it is global", key)
continue
}
if key.Zone == "" {
klog.Warningf("Key %v does not have zone populated, ignoring", key)
continue
}
ret[key.Zone] = append(ret[key.Zone], obj)
}
return ret, nil
return composite.AggregatedListNetworkEndpointGroup(a.c, version)
}

// CreateNetworkEndpointGroup implements NetworkEndpointGroupCloud.
Expand Down
35 changes: 12 additions & 23 deletions pkg/neg/types/cloudprovideradapter_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -77,36 +77,25 @@ func validateAggregatedList(t *testing.T, adapter NetworkEndpointGroupCloud, exp
if err != nil {
t.Errorf("Expect AggregatedListNetworkEndpointGroup to return nil error, but got %v", err)
}
if len(ret) != expectZoneNum {
t.Errorf("Expect len(ret) == %v, got %v", expectZoneNum, len(ret))
}

zoneNames := sets.NewString()
expectZoneNames := sets.NewString()
for key := range expectZoneNegs {
expectZoneNames.Insert(key)
}
for zone, negs := range ret {
zoneNames.Insert(zone)
negNames := sets.NewString()
expectNegNames := sets.NewString()

for _, neg := range negs {
negNames.Insert(neg.Name)
}

expectNegs, ok := expectZoneNegs[zone]
if !ok {
t.Errorf("Zone %v from return is not expected", zone)
continue
}
negNames := sets.NewString()
expectNegNames := sets.NewString()

for zone, expectNegs := range expectZoneNegs {
expectZoneNames.Insert(zone)
for _, neg := range expectNegs {
expectNegNames.Insert(neg)
}
if !negNames.Equal(expectNegNames) {
t.Errorf("Expect NEG names %v, but got %v", expectNegNames.List(), negNames.List())
}
}
for key, neg := range ret {
zoneNames.Insert(key.Zone)
negNames.Insert(neg.Name)
}

if !negNames.Equal(expectNegNames) {
t.Errorf("Expect NEG names %v, but got %v", expectNegNames.List(), negNames.List())
}

if !zoneNames.Equal(expectZoneNames) {
Expand Down
10 changes: 8 additions & 2 deletions pkg/neg/types/fakes.go
Original file line number Diff line number Diff line change
Expand Up @@ -108,10 +108,16 @@ func (f *FakeNetworkEndpointGroupCloud) ListNetworkEndpointGroup(zone string, ve
return f.NetworkEndpointGroups[zone], nil
}

func (f *FakeNetworkEndpointGroupCloud) AggregatedListNetworkEndpointGroup(version meta.Version) (map[string][]*composite.NetworkEndpointGroup, error) {
func (f *FakeNetworkEndpointGroupCloud) AggregatedListNetworkEndpointGroup(version meta.Version) (map[*meta.Key]*composite.NetworkEndpointGroup, error) {
f.mu.Lock()
defer f.mu.Unlock()
return f.NetworkEndpointGroups, nil
result := make(map[*meta.Key]*composite.NetworkEndpointGroup)
for zone, negs := range f.NetworkEndpointGroups {
for _, neg := range negs {
result[&meta.Key{Zone: zone}] = neg
}
}
return result, nil
}

func (f *FakeNetworkEndpointGroupCloud) CreateNetworkEndpointGroup(neg *composite.NetworkEndpointGroup, zone string) error {
Expand Down
2 changes: 1 addition & 1 deletion pkg/neg/types/interfaces.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ type ZoneGetter interface {
type NetworkEndpointGroupCloud interface {
GetNetworkEndpointGroup(name string, zone string, version meta.Version) (*composite.NetworkEndpointGroup, error)
ListNetworkEndpointGroup(zone string, version meta.Version) ([]*composite.NetworkEndpointGroup, error)
AggregatedListNetworkEndpointGroup(version meta.Version) (map[string][]*composite.NetworkEndpointGroup, error)
AggregatedListNetworkEndpointGroup(version meta.Version) (map[*meta.Key]*composite.NetworkEndpointGroup, error)
CreateNetworkEndpointGroup(neg *composite.NetworkEndpointGroup, zone string) error
DeleteNetworkEndpointGroup(name string, zone string, version meta.Version) error
AttachNetworkEndpoints(name, zone string, endpoints []*composite.NetworkEndpoint, version meta.Version) error
Expand Down