Commit a4b719dc authored by Kubernetes Submit Queue's avatar Kubernetes Submit Queue Committed by GitHub

Merge pull request #50640 from yujuhong/check-ips

Automatic merge from submit-queue (batch tested with PRs 50893, 50913, 50963, 50629, 50640) gce external LB: add a function to verify the requested IP address Factor out the logic for verifying the user-requested IP for better readability and testing. Also rename a few variables for clarity.
parents 9292074a afcb9483
...@@ -87,6 +87,7 @@ go_test( ...@@ -87,6 +87,7 @@ go_test(
deps = [ deps = [
"//pkg/cloudprovider:go_default_library", "//pkg/cloudprovider:go_default_library",
"//pkg/kubelet/apis:go_default_library", "//pkg/kubelet/apis:go_default_library",
"//vendor/github.com/stretchr/testify/assert:go_default_library",
"//vendor/golang.org/x/oauth2/google:go_default_library", "//vendor/golang.org/x/oauth2/google:go_default_library",
"//vendor/google.golang.org/api/compute/v1:go_default_library", "//vendor/google.golang.org/api/compute/v1:go_default_library",
"//vendor/google.golang.org/api/googleapi:go_default_library", "//vendor/google.golang.org/api/googleapi:go_default_library",
......
...@@ -34,6 +34,9 @@ type FakeCloudAddressService struct { ...@@ -34,6 +34,9 @@ type FakeCloudAddressService struct {
addrsByRegionAndName map[string]map[string]*compute.Address addrsByRegionAndName map[string]map[string]*compute.Address
} }
// FakeCloudAddressService Implements CloudAddressService
var _ CloudAddressService = &FakeCloudAddressService{}
func NewFakeCloudAddressService() *FakeCloudAddressService { func NewFakeCloudAddressService() *FakeCloudAddressService {
return &FakeCloudAddressService{ return &FakeCloudAddressService{
reservedAddrs: make(map[string]bool), reservedAddrs: make(map[string]bool),
...@@ -41,6 +44,18 @@ func NewFakeCloudAddressService() *FakeCloudAddressService { ...@@ -41,6 +44,18 @@ func NewFakeCloudAddressService() *FakeCloudAddressService {
} }
} }
// SetRegionalAddresses populates the addresses of the region with the name to
// IP map.
func (cas *FakeCloudAddressService) SetRegionalAddresses(region string, ipList map[string]string) {
// Reset addresses in the region.
cas.addrsByRegionAndName[region] = make(map[string]*compute.Address)
for name, ip := range ipList {
cas.reservedAddrs[ip] = true
cas.addrsByRegionAndName[region][name] = &compute.Address{Name: name, Address: ip}
}
}
func (cas *FakeCloudAddressService) ReserveRegionAddress(addr *compute.Address, region string) error { func (cas *FakeCloudAddressService) ReserveRegionAddress(addr *compute.Address, region string) error {
if addr.Address == "" { if addr.Address == "" {
addr.Address = fmt.Sprintf("1.2.3.%d", cas.count) addr.Address = fmt.Sprintf("1.2.3.%d", cas.count)
......
...@@ -22,6 +22,7 @@ import compute "google.golang.org/api/compute/v1" ...@@ -22,6 +22,7 @@ import compute "google.golang.org/api/compute/v1"
type CloudAddressService interface { type CloudAddressService interface {
ReserveRegionAddress(*compute.Address, string) error ReserveRegionAddress(*compute.Address, string) error
GetRegionAddress(string, string) (*compute.Address, error) GetRegionAddress(string, string) (*compute.Address, error)
GetRegionAddressByIP(region, ipAddress string) (*compute.Address, error)
// TODO: Mock `DeleteRegionAddress(name, region string) endpoint // TODO: Mock `DeleteRegionAddress(name, region string) endpoint
// TODO: Mock Global endpoints // TODO: Mock Global endpoints
} }
...@@ -16,7 +16,12 @@ limitations under the License. ...@@ -16,7 +16,12 @@ limitations under the License.
package gce package gce
import "testing" import (
"fmt"
"testing"
"github.com/stretchr/testify/assert"
)
func TestEnsureStaticIP(t *testing.T) { func TestEnsureStaticIP(t *testing.T) {
fcas := NewFakeCloudAddressService() fcas := NewFakeCloudAddressService()
...@@ -37,3 +42,44 @@ func TestEnsureStaticIP(t *testing.T) { ...@@ -37,3 +42,44 @@ func TestEnsureStaticIP(t *testing.T) {
t.Fatalf(`ensureStaticIP(%v, %v, %v, %v, %v) = %v, %v, %v; want %v, true, nil`, fcas, ipName, serviceName, region, ip, ipPrime, existed, err, ip) t.Fatalf(`ensureStaticIP(%v, %v, %v, %v, %v) = %v, %v, %v; want %v, true, nil`, fcas, ipName, serviceName, region, ip, ipPrime, existed, err, ip)
} }
} }
func TestVerifyRequestedIP(t *testing.T) {
region := "test-region"
lbRef := "test-lb"
s := NewFakeCloudAddressService()
for desc, tc := range map[string]struct {
requestedIP string
fwdRuleIP string
ipList map[string]string
expectErr bool
expectUserOwned bool
}{
"requested IP exists": {
requestedIP: "1.1.1.1",
ipList: map[string]string{"foo": "1.1.1.1"},
expectErr: false,
expectUserOwned: true,
},
"requested IP is not static, but is in use by the fwd rule": {
requestedIP: "1.1.1.1",
fwdRuleIP: "1.1.1.1",
expectErr: false,
},
"requested IP is not static and is not used by the fwd rule": {
requestedIP: "1.1.1.1",
fwdRuleIP: "2.2.2.2",
expectErr: true,
},
"no requested IP": {
expectErr: false,
},
} {
t.Run(desc, func(t *testing.T) {
s.SetRegionalAddresses(region, tc.ipList)
isUserOwnedIP, err := verifyUserRequestedIP(s, region, tc.requestedIP, tc.fwdRuleIP, lbRef)
assert.Equal(t, tc.expectErr, err != nil, fmt.Sprintf("err: %v", err))
assert.Equal(t, tc.expectUserOwned, isUserOwnedIP, desc)
})
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment