2017-11-05 11:23:29 +00:00
|
|
|
/*
|
|
|
|
Copyright 2017 The Kubernetes Authors.
|
|
|
|
|
|
|
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
you may not use this file except in compliance with the License.
|
|
|
|
You may obtain a copy of the License at
|
|
|
|
|
|
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
|
|
|
|
Unless required by applicable law or agreed to in writing, software
|
|
|
|
distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
See the License for the specific language governing permissions and
|
|
|
|
limitations under the License.
|
|
|
|
*/
|
|
|
|
|
|
|
|
package testing
|
|
|
|
|
|
|
|
import (
|
2017-12-18 09:20:06 +00:00
|
|
|
"fmt"
|
|
|
|
|
|
|
|
"k8s.io/apimachinery/pkg/util/sets"
|
2017-11-05 11:23:29 +00:00
|
|
|
"k8s.io/kubernetes/pkg/util/ipset"
|
|
|
|
)
|
|
|
|
|
|
|
|
// FakeIPSet is a no-op implementation of ipset Interface
|
|
|
|
type FakeIPSet struct {
|
2017-12-18 09:20:06 +00:00
|
|
|
// version of ipset util
|
|
|
|
Version string
|
|
|
|
// The key of Sets map is the ip set name
|
|
|
|
Sets map[string]*ipset.IPSet
|
|
|
|
// The key of Entries map is the ip set name where the entries exists
|
|
|
|
Entries map[string]sets.String
|
2017-11-05 11:23:29 +00:00
|
|
|
}
|
|
|
|
|
2017-12-18 09:20:06 +00:00
|
|
|
// NewFake create a new fake ipset interface - it initialize the FakeIPSet.
|
|
|
|
func NewFake(version string) *FakeIPSet {
|
|
|
|
return &FakeIPSet{
|
|
|
|
Version: version,
|
|
|
|
Sets: make(map[string]*ipset.IPSet),
|
|
|
|
Entries: make(map[string]sets.String),
|
|
|
|
}
|
2017-11-05 11:23:29 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// GetVersion is part of interface.
|
2017-12-18 09:20:06 +00:00
|
|
|
func (f *FakeIPSet) GetVersion() (string, error) {
|
|
|
|
return f.Version, nil
|
2017-11-05 11:23:29 +00:00
|
|
|
}
|
|
|
|
|
2017-12-18 09:20:06 +00:00
|
|
|
// FlushSet is part of interface. It deletes all entries from a named set but keeps the set itself.
|
|
|
|
func (f *FakeIPSet) FlushSet(set string) error {
|
|
|
|
if f.Entries == nil {
|
|
|
|
return fmt.Errorf("entries map can't be nil")
|
|
|
|
}
|
|
|
|
|
|
|
|
// delete all entry elements
|
|
|
|
for true {
|
|
|
|
if _, has := f.Entries[set].PopAny(); has {
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
break
|
|
|
|
}
|
2017-11-05 11:23:29 +00:00
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2017-12-18 09:20:06 +00:00
|
|
|
// DestroySet is part of interface. It deletes both the entries and the set itself.
|
|
|
|
func (f *FakeIPSet) DestroySet(set string) error {
|
|
|
|
delete(f.Sets, set)
|
|
|
|
delete(f.Entries, set)
|
2017-11-05 11:23:29 +00:00
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
// DestroyAllSets is part of interface.
|
2017-12-18 09:20:06 +00:00
|
|
|
func (f *FakeIPSet) DestroyAllSets() error {
|
|
|
|
f.Sets = nil
|
|
|
|
f.Entries = nil
|
2017-11-05 11:23:29 +00:00
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
// CreateSet is part of interface.
|
2017-12-18 09:20:06 +00:00
|
|
|
func (f *FakeIPSet) CreateSet(set *ipset.IPSet, ignoreExistErr bool) error {
|
|
|
|
if f.Sets[set.Name] != nil {
|
|
|
|
if !ignoreExistErr {
|
|
|
|
// already exists
|
|
|
|
return fmt.Errorf("Set cannot be created: set with the same name already exists")
|
|
|
|
}
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
f.Sets[set.Name] = set
|
|
|
|
// initialize entry map
|
|
|
|
f.Entries[set.Name] = sets.NewString()
|
2017-11-05 11:23:29 +00:00
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
// AddEntry is part of interface.
|
2017-12-18 06:51:34 +00:00
|
|
|
func (f *FakeIPSet) AddEntry(entry string, set *ipset.IPSet, ignoreExistErr bool) error {
|
|
|
|
if f.Entries[set.Name].Has(entry) {
|
2017-12-18 09:20:06 +00:00
|
|
|
if !ignoreExistErr {
|
|
|
|
// already exists
|
|
|
|
return fmt.Errorf("Element cannot be added to the set: it's already added")
|
|
|
|
}
|
|
|
|
return nil
|
|
|
|
}
|
2017-12-18 06:51:34 +00:00
|
|
|
f.Entries[set.Name].Insert(entry)
|
2017-11-05 11:23:29 +00:00
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
// DelEntry is part of interface.
|
2017-12-18 09:20:06 +00:00
|
|
|
func (f *FakeIPSet) DelEntry(entry string, set string) error {
|
|
|
|
if f.Entries == nil {
|
|
|
|
return fmt.Errorf("entries map can't be nil")
|
|
|
|
}
|
|
|
|
f.Entries[set].Delete(entry)
|
2017-11-05 11:23:29 +00:00
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
// TestEntry is part of interface.
|
2017-12-18 09:20:06 +00:00
|
|
|
func (f *FakeIPSet) TestEntry(entry string, set string) (bool, error) {
|
|
|
|
if f.Entries == nil {
|
|
|
|
return false, fmt.Errorf("entries map can't be nil")
|
|
|
|
}
|
|
|
|
found := f.Entries[set].Has(entry)
|
|
|
|
return found, nil
|
2017-11-05 11:23:29 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// ListEntries is part of interface.
|
2017-12-18 09:20:06 +00:00
|
|
|
func (f *FakeIPSet) ListEntries(set string) ([]string, error) {
|
|
|
|
if f.Entries == nil {
|
|
|
|
return nil, fmt.Errorf("entries map can't be nil")
|
|
|
|
}
|
|
|
|
return f.Entries[set].UnsortedList(), nil
|
2017-11-05 11:23:29 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// ListSets is part of interface.
|
2017-12-18 09:20:06 +00:00
|
|
|
func (f *FakeIPSet) ListSets() ([]string, error) {
|
|
|
|
res := []string{}
|
|
|
|
for set := range f.Sets {
|
|
|
|
res = append(res, set)
|
|
|
|
}
|
|
|
|
return res, nil
|
2017-11-05 11:23:29 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
var _ = ipset.Interface(&FakeIPSet{})
|