2016-02-22 00:13:08 +00:00
|
|
|
/*
|
2016-09-08 11:02:39 +00:00
|
|
|
Copyright 2015 The Kubernetes Authors.
|
2016-02-22 00:13:08 +00:00
|
|
|
|
|
|
|
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 loadbalancers
|
|
|
|
|
|
|
|
import (
|
2016-08-09 02:11:47 +00:00
|
|
|
"fmt"
|
2016-02-22 00:13:08 +00:00
|
|
|
"testing"
|
|
|
|
|
|
|
|
compute "google.golang.org/api/compute/v1"
|
2017-04-01 14:38:58 +00:00
|
|
|
"k8s.io/apimachinery/pkg/util/sets"
|
|
|
|
|
2016-11-10 23:31:49 +00:00
|
|
|
"k8s.io/ingress/controllers/gce/backends"
|
|
|
|
"k8s.io/ingress/controllers/gce/healthchecks"
|
|
|
|
"k8s.io/ingress/controllers/gce/instances"
|
|
|
|
"k8s.io/ingress/controllers/gce/utils"
|
2016-02-22 00:13:08 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
const (
|
2017-04-18 19:44:17 +00:00
|
|
|
defaultZone = "zone-a"
|
|
|
|
)
|
|
|
|
|
|
|
|
var (
|
|
|
|
testDefaultBeNodePort = backends.ServicePort{Port: 3000, Protocol: utils.ProtocolHTTP}
|
2016-02-22 00:13:08 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
func newFakeLoadBalancerPool(f LoadBalancers, t *testing.T) LoadBalancerPool {
|
2017-02-09 01:23:15 +00:00
|
|
|
fakeBackends := backends.NewFakeBackendServices(func(op int, be *compute.BackendService) error { return nil })
|
2016-02-22 00:13:08 +00:00
|
|
|
fakeIGs := instances.NewFakeInstanceGroups(sets.NewString())
|
2017-04-18 19:44:17 +00:00
|
|
|
fakeHCP := healthchecks.NewFakeHealthCheckProvider()
|
2016-03-15 00:33:12 +00:00
|
|
|
namer := &utils.Namer{}
|
2017-04-18 19:44:17 +00:00
|
|
|
healthChecker := healthchecks.NewHealthChecker(fakeHCP, "/", namer)
|
2016-06-03 18:22:56 +00:00
|
|
|
nodePool := instances.NewNodePool(fakeIGs)
|
2016-12-28 02:19:31 +00:00
|
|
|
nodePool.Init(&instances.FakeZoneLister{Zones: []string{defaultZone}})
|
2016-02-22 00:13:08 +00:00
|
|
|
backendPool := backends.NewBackendPool(
|
2016-05-29 23:05:38 +00:00
|
|
|
fakeBackends, healthChecker, nodePool, namer, []int64{}, false)
|
2016-02-22 00:13:08 +00:00
|
|
|
return NewLoadBalancerPool(f, backendPool, testDefaultBeNodePort, namer)
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestCreateHTTPLoadBalancer(t *testing.T) {
|
|
|
|
// This should NOT create the forwarding rule and target proxy
|
|
|
|
// associated with the HTTPS branch of this loadbalancer.
|
|
|
|
lbInfo := &L7RuntimeInfo{Name: "test", AllowHTTP: true}
|
|
|
|
f := NewFakeLoadBalancers(lbInfo.Name)
|
|
|
|
pool := newFakeLoadBalancerPool(f, t)
|
2016-12-07 19:53:16 +00:00
|
|
|
pool.Sync([]*L7RuntimeInfo{lbInfo})
|
2016-02-22 00:13:08 +00:00
|
|
|
l7, err := pool.Get(lbInfo.Name)
|
|
|
|
if err != nil || l7 == nil {
|
|
|
|
t.Fatalf("Expected l7 not created")
|
|
|
|
}
|
|
|
|
um, err := f.GetUrlMap(f.umName())
|
|
|
|
if err != nil ||
|
|
|
|
um.DefaultService != pool.(*L7s).glbcDefaultBackend.SelfLink {
|
|
|
|
t.Fatalf("%v", err)
|
|
|
|
}
|
|
|
|
tp, err := f.GetTargetHttpProxy(f.tpName(false))
|
|
|
|
if err != nil || tp.UrlMap != um.SelfLink {
|
|
|
|
t.Fatalf("%v", err)
|
|
|
|
}
|
|
|
|
fw, err := f.GetGlobalForwardingRule(f.fwName(false))
|
|
|
|
if err != nil || fw.Target != tp.SelfLink {
|
|
|
|
t.Fatalf("%v", err)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestCreateHTTPSLoadBalancer(t *testing.T) {
|
|
|
|
// This should NOT create the forwarding rule and target proxy
|
|
|
|
// associated with the HTTP branch of this loadbalancer.
|
|
|
|
lbInfo := &L7RuntimeInfo{
|
|
|
|
Name: "test",
|
|
|
|
AllowHTTP: false,
|
|
|
|
TLS: &TLSCerts{Key: "key", Cert: "cert"},
|
|
|
|
}
|
|
|
|
f := NewFakeLoadBalancers(lbInfo.Name)
|
|
|
|
pool := newFakeLoadBalancerPool(f, t)
|
2016-12-07 19:53:16 +00:00
|
|
|
pool.Sync([]*L7RuntimeInfo{lbInfo})
|
2016-02-22 00:13:08 +00:00
|
|
|
l7, err := pool.Get(lbInfo.Name)
|
|
|
|
if err != nil || l7 == nil {
|
|
|
|
t.Fatalf("Expected l7 not created")
|
2017-03-07 21:42:41 +00:00
|
|
|
}
|
|
|
|
um, err := f.GetUrlMap(f.umName())
|
|
|
|
if err != nil ||
|
|
|
|
um.DefaultService != pool.(*L7s).glbcDefaultBackend.SelfLink {
|
|
|
|
t.Fatalf("%v", err)
|
|
|
|
}
|
|
|
|
tps, err := f.GetTargetHttpsProxy(f.tpName(true))
|
|
|
|
if err != nil || tps.UrlMap != um.SelfLink {
|
|
|
|
t.Fatalf("%v", err)
|
|
|
|
}
|
|
|
|
fws, err := f.GetGlobalForwardingRule(f.fwName(true))
|
|
|
|
if err != nil || fws.Target != tps.SelfLink {
|
|
|
|
t.Fatalf("%v", err)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-04-26 18:15:19 +00:00
|
|
|
// Tests that a certificate is created from the provided Key/Cert combo
|
|
|
|
// and the proxy is updated to another cert when the provided cert changes
|
|
|
|
func TestCertUpdate(t *testing.T) {
|
|
|
|
primaryCertName := "k8s-ssl-test"
|
|
|
|
secondaryCertName := "k8s-ssl-1-test"
|
|
|
|
lbInfo := &L7RuntimeInfo{
|
|
|
|
Name: "test",
|
|
|
|
AllowHTTP: false,
|
|
|
|
TLS: &TLSCerts{Key: "key", Cert: "cert"},
|
|
|
|
}
|
|
|
|
|
|
|
|
f := NewFakeLoadBalancers(lbInfo.Name)
|
|
|
|
pool := newFakeLoadBalancerPool(f, t)
|
|
|
|
|
|
|
|
// Sync first cert
|
|
|
|
pool.Sync([]*L7RuntimeInfo{lbInfo})
|
|
|
|
verifyCertAndProxyLink(primaryCertName, lbInfo.TLS.Cert, f, t)
|
|
|
|
|
|
|
|
// Sync with different cert
|
|
|
|
lbInfo.TLS = &TLSCerts{Key: "key2", Cert: "cert2"}
|
|
|
|
pool.Sync([]*L7RuntimeInfo{lbInfo})
|
|
|
|
verifyCertAndProxyLink(secondaryCertName, lbInfo.TLS.Cert, f, t)
|
|
|
|
}
|
|
|
|
|
|
|
|
// Tests that controller can overwrite existing, unused certificates
|
|
|
|
func TestCertCreationWithCollision(t *testing.T) {
|
|
|
|
primaryCertName := "k8s-ssl-test"
|
|
|
|
secondaryCertName := "k8s-ssl-1-test"
|
|
|
|
lbInfo := &L7RuntimeInfo{
|
|
|
|
Name: "test",
|
|
|
|
AllowHTTP: false,
|
|
|
|
TLS: &TLSCerts{Key: "key", Cert: "cert"},
|
|
|
|
}
|
|
|
|
|
|
|
|
f := NewFakeLoadBalancers(lbInfo.Name)
|
|
|
|
pool := newFakeLoadBalancerPool(f, t)
|
|
|
|
|
|
|
|
// Have both names already used by orphaned certs
|
|
|
|
f.CreateSslCertificate(&compute.SslCertificate{
|
|
|
|
Name: primaryCertName,
|
|
|
|
Certificate: "abc",
|
|
|
|
SelfLink: "existing",
|
|
|
|
})
|
|
|
|
f.CreateSslCertificate(&compute.SslCertificate{
|
|
|
|
Name: secondaryCertName,
|
|
|
|
Certificate: "xyz",
|
|
|
|
SelfLink: "existing",
|
|
|
|
})
|
|
|
|
|
|
|
|
// Sync first cert
|
|
|
|
pool.Sync([]*L7RuntimeInfo{lbInfo})
|
|
|
|
verifyCertAndProxyLink(primaryCertName, lbInfo.TLS.Cert, f, t)
|
|
|
|
|
|
|
|
// Sync with different cert
|
|
|
|
lbInfo.TLS = &TLSCerts{Key: "key2", Cert: "cert2"}
|
|
|
|
pool.Sync([]*L7RuntimeInfo{lbInfo})
|
|
|
|
verifyCertAndProxyLink(secondaryCertName, lbInfo.TLS.Cert, f, t)
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestCertRetentionAfterRestart(t *testing.T) {
|
|
|
|
primaryCertName := "k8s-ssl-test"
|
|
|
|
secondaryCertName := "k8s-ssl-1-test"
|
|
|
|
lbInfo := &L7RuntimeInfo{
|
|
|
|
Name: "test",
|
|
|
|
AllowHTTP: false,
|
|
|
|
TLS: &TLSCerts{Key: "key", Cert: "cert"},
|
|
|
|
}
|
|
|
|
|
|
|
|
f := NewFakeLoadBalancers(lbInfo.Name)
|
|
|
|
firstPool := newFakeLoadBalancerPool(f, t)
|
|
|
|
|
|
|
|
// Sync twice so the expected certificate uses the secondary name
|
|
|
|
firstPool.Sync([]*L7RuntimeInfo{lbInfo})
|
|
|
|
verifyCertAndProxyLink(primaryCertName, lbInfo.TLS.Cert, f, t)
|
|
|
|
lbInfo.TLS = &TLSCerts{Key: "key2", Cert: "cert2"}
|
|
|
|
firstPool.Sync([]*L7RuntimeInfo{lbInfo})
|
|
|
|
verifyCertAndProxyLink(secondaryCertName, lbInfo.TLS.Cert, f, t)
|
|
|
|
|
|
|
|
// Restart of controller represented by a new pool
|
|
|
|
secondPool := newFakeLoadBalancerPool(f, t)
|
|
|
|
secondPool.Sync([]*L7RuntimeInfo{lbInfo})
|
|
|
|
|
|
|
|
// Verify second name is still used
|
|
|
|
verifyCertAndProxyLink(secondaryCertName, lbInfo.TLS.Cert, f, t)
|
|
|
|
|
|
|
|
// Update cert one more time to verify loop
|
|
|
|
lbInfo.TLS = &TLSCerts{Key: "key3", Cert: "cert3"}
|
|
|
|
secondPool.Sync([]*L7RuntimeInfo{lbInfo})
|
|
|
|
verifyCertAndProxyLink(primaryCertName, lbInfo.TLS.Cert, f, t)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
func verifyCertAndProxyLink(certName, certValue string, f *FakeLoadBalancers, t *testing.T) {
|
|
|
|
cert, err := f.GetSslCertificate(certName)
|
|
|
|
if err != nil {
|
|
|
|
t.Fatalf("expected ssl certificate to exist: %v, err: %v", certName, err)
|
|
|
|
}
|
|
|
|
|
|
|
|
if cert.Certificate != certValue {
|
|
|
|
t.Fatalf("unexpected certificate value; expected %v, actual %v", certValue, cert.Certificate)
|
|
|
|
}
|
|
|
|
|
|
|
|
tps, err := f.GetTargetHttpsProxy(f.tpName(true))
|
|
|
|
if err != nil {
|
|
|
|
t.Fatalf("expected https proxy to exist: %v, err: %v", certName, err)
|
|
|
|
}
|
|
|
|
|
|
|
|
if len(tps.SslCertificates) == 0 || tps.SslCertificates[0] != cert.SelfLink {
|
|
|
|
t.Fatalf("expected ssl certificate to be linked in target proxy; Cert Link: %q; Target Proxy Certs: %v", cert.SelfLink, tps.SslCertificates)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-03-07 21:42:41 +00:00
|
|
|
func TestCreateHTTPSLoadBalancerAnnotationCert(t *testing.T) {
|
|
|
|
// This should NOT create the forwarding rule and target proxy
|
|
|
|
// associated with the HTTP branch of this loadbalancer.
|
|
|
|
tlsName := "external-cert-name"
|
|
|
|
lbInfo := &L7RuntimeInfo{
|
|
|
|
Name: "test",
|
|
|
|
AllowHTTP: false,
|
|
|
|
TLSName: tlsName,
|
|
|
|
}
|
|
|
|
f := NewFakeLoadBalancers(lbInfo.Name)
|
|
|
|
f.CreateSslCertificate(&compute.SslCertificate{
|
|
|
|
Name: tlsName,
|
|
|
|
})
|
|
|
|
pool := newFakeLoadBalancerPool(f, t)
|
|
|
|
pool.Sync([]*L7RuntimeInfo{lbInfo})
|
|
|
|
l7, err := pool.Get(lbInfo.Name)
|
|
|
|
if err != nil || l7 == nil {
|
|
|
|
t.Fatalf("Expected l7 not created")
|
2016-02-22 00:13:08 +00:00
|
|
|
}
|
|
|
|
um, err := f.GetUrlMap(f.umName())
|
|
|
|
if err != nil ||
|
|
|
|
um.DefaultService != pool.(*L7s).glbcDefaultBackend.SelfLink {
|
|
|
|
t.Fatalf("%v", err)
|
|
|
|
}
|
|
|
|
tps, err := f.GetTargetHttpsProxy(f.tpName(true))
|
|
|
|
if err != nil || tps.UrlMap != um.SelfLink {
|
|
|
|
t.Fatalf("%v", err)
|
|
|
|
}
|
|
|
|
fws, err := f.GetGlobalForwardingRule(f.fwName(true))
|
|
|
|
if err != nil || fws.Target != tps.SelfLink {
|
|
|
|
t.Fatalf("%v", err)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestCreateBothLoadBalancers(t *testing.T) {
|
|
|
|
// This should create 2 forwarding rules and target proxies
|
|
|
|
// but they should use the same urlmap, and have the same
|
|
|
|
// static ip.
|
|
|
|
lbInfo := &L7RuntimeInfo{
|
|
|
|
Name: "test",
|
|
|
|
AllowHTTP: true,
|
|
|
|
TLS: &TLSCerts{Key: "key", Cert: "cert"},
|
|
|
|
}
|
|
|
|
f := NewFakeLoadBalancers(lbInfo.Name)
|
|
|
|
pool := newFakeLoadBalancerPool(f, t)
|
2016-12-07 19:53:16 +00:00
|
|
|
pool.Sync([]*L7RuntimeInfo{lbInfo})
|
2016-02-22 00:13:08 +00:00
|
|
|
l7, err := pool.Get(lbInfo.Name)
|
|
|
|
if err != nil || l7 == nil {
|
|
|
|
t.Fatalf("Expected l7 not created")
|
|
|
|
}
|
|
|
|
um, err := f.GetUrlMap(f.umName())
|
|
|
|
if err != nil ||
|
|
|
|
um.DefaultService != pool.(*L7s).glbcDefaultBackend.SelfLink {
|
|
|
|
t.Fatalf("%v", err)
|
|
|
|
}
|
|
|
|
tps, err := f.GetTargetHttpsProxy(f.tpName(true))
|
|
|
|
if err != nil || tps.UrlMap != um.SelfLink {
|
|
|
|
t.Fatalf("%v", err)
|
|
|
|
}
|
|
|
|
tp, err := f.GetTargetHttpProxy(f.tpName(false))
|
|
|
|
if err != nil || tp.UrlMap != um.SelfLink {
|
|
|
|
t.Fatalf("%v", err)
|
|
|
|
}
|
|
|
|
fws, err := f.GetGlobalForwardingRule(f.fwName(true))
|
|
|
|
if err != nil || fws.Target != tps.SelfLink {
|
|
|
|
t.Fatalf("%v", err)
|
|
|
|
}
|
|
|
|
fw, err := f.GetGlobalForwardingRule(f.fwName(false))
|
|
|
|
if err != nil || fw.Target != tp.SelfLink {
|
|
|
|
t.Fatalf("%v", err)
|
|
|
|
}
|
|
|
|
ip, err := f.GetGlobalStaticIP(f.fwName(false))
|
|
|
|
if err != nil || ip.Address != fw.IPAddress || ip.Address != fws.IPAddress {
|
|
|
|
t.Fatalf("%v", err)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestUpdateUrlMap(t *testing.T) {
|
|
|
|
um1 := utils.GCEURLMap{
|
|
|
|
"bar.example.com": {
|
|
|
|
"/bar2": &compute.BackendService{SelfLink: "bar2svc"},
|
|
|
|
},
|
|
|
|
}
|
|
|
|
um2 := utils.GCEURLMap{
|
|
|
|
"foo.example.com": {
|
|
|
|
"/foo1": &compute.BackendService{SelfLink: "foo1svc"},
|
|
|
|
"/foo2": &compute.BackendService{SelfLink: "foo2svc"},
|
|
|
|
},
|
|
|
|
"bar.example.com": {
|
|
|
|
"/bar1": &compute.BackendService{SelfLink: "bar1svc"},
|
|
|
|
},
|
|
|
|
}
|
|
|
|
um2.PutDefaultBackend(&compute.BackendService{SelfLink: "default"})
|
|
|
|
|
|
|
|
lbInfo := &L7RuntimeInfo{Name: "test", AllowHTTP: true}
|
|
|
|
f := NewFakeLoadBalancers(lbInfo.Name)
|
|
|
|
pool := newFakeLoadBalancerPool(f, t)
|
2016-12-07 19:53:16 +00:00
|
|
|
pool.Sync([]*L7RuntimeInfo{lbInfo})
|
2016-02-22 00:13:08 +00:00
|
|
|
l7, err := pool.Get(lbInfo.Name)
|
|
|
|
if err != nil {
|
|
|
|
t.Fatalf("%v", err)
|
|
|
|
}
|
|
|
|
for _, ir := range []utils.GCEURLMap{um1, um2} {
|
|
|
|
if err := l7.UpdateUrlMap(ir); err != nil {
|
|
|
|
t.Fatalf("%v", err)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// The final map doesn't contain /bar2
|
|
|
|
expectedMap := map[string]utils.FakeIngressRuleValueMap{
|
|
|
|
utils.DefaultBackendKey: {
|
|
|
|
utils.DefaultBackendKey: "default",
|
|
|
|
},
|
|
|
|
"foo.example.com": {
|
|
|
|
"/foo1": "foo1svc",
|
|
|
|
"/foo2": "foo2svc",
|
|
|
|
},
|
|
|
|
"bar.example.com": {
|
|
|
|
"/bar1": "bar1svc",
|
|
|
|
},
|
|
|
|
}
|
|
|
|
f.CheckURLMap(t, l7, expectedMap)
|
|
|
|
}
|
2016-08-09 02:11:47 +00:00
|
|
|
|
2017-01-05 01:57:55 +00:00
|
|
|
func TestUpdateUrlMapNoChanges(t *testing.T) {
|
|
|
|
um1 := utils.GCEURLMap{
|
|
|
|
"foo.example.com": {
|
|
|
|
"/foo1": &compute.BackendService{SelfLink: "foo1svc"},
|
|
|
|
"/foo2": &compute.BackendService{SelfLink: "foo2svc"},
|
|
|
|
},
|
|
|
|
"bar.example.com": {
|
|
|
|
"/bar1": &compute.BackendService{SelfLink: "bar1svc"},
|
|
|
|
},
|
|
|
|
}
|
|
|
|
um1.PutDefaultBackend(&compute.BackendService{SelfLink: "default"})
|
|
|
|
um2 := utils.GCEURLMap{
|
|
|
|
"foo.example.com": {
|
|
|
|
"/foo1": &compute.BackendService{SelfLink: "foo1svc"},
|
|
|
|
"/foo2": &compute.BackendService{SelfLink: "foo2svc"},
|
|
|
|
},
|
|
|
|
"bar.example.com": {
|
|
|
|
"/bar1": &compute.BackendService{SelfLink: "bar1svc"},
|
|
|
|
},
|
|
|
|
}
|
|
|
|
um2.PutDefaultBackend(&compute.BackendService{SelfLink: "default"})
|
|
|
|
|
|
|
|
lbInfo := &L7RuntimeInfo{Name: "test", AllowHTTP: true}
|
|
|
|
f := NewFakeLoadBalancers(lbInfo.Name)
|
|
|
|
pool := newFakeLoadBalancerPool(f, t)
|
|
|
|
pool.Sync([]*L7RuntimeInfo{lbInfo})
|
|
|
|
l7, err := pool.Get(lbInfo.Name)
|
|
|
|
if err != nil {
|
|
|
|
t.Fatalf("%v", err)
|
|
|
|
}
|
|
|
|
for _, ir := range []utils.GCEURLMap{um1, um2} {
|
|
|
|
if err := l7.UpdateUrlMap(ir); err != nil {
|
|
|
|
t.Fatalf("%v", err)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
for _, call := range f.calls {
|
|
|
|
if call == "UpdateUrlMap" {
|
|
|
|
t.Errorf("UpdateUrlMap() should not have been called")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-08-09 02:11:47 +00:00
|
|
|
func TestNameParsing(t *testing.T) {
|
|
|
|
clusterName := "123"
|
2017-02-28 00:08:42 +00:00
|
|
|
firewallName := clusterName
|
|
|
|
namer := utils.NewNamer(clusterName, firewallName)
|
2016-08-09 02:11:47 +00:00
|
|
|
fullName := namer.Truncate(fmt.Sprintf("%v-%v", forwardingRulePrefix, namer.LBName("testlb")))
|
|
|
|
annotationsMap := map[string]string{
|
|
|
|
fmt.Sprintf("%v/forwarding-rule", utils.K8sAnnotationPrefix): fullName,
|
|
|
|
}
|
|
|
|
components := namer.ParseName(GCEResourceName(annotationsMap, "forwarding-rule"))
|
|
|
|
t.Logf("%+v", components)
|
|
|
|
if components.ClusterName != clusterName {
|
|
|
|
t.Errorf("Failed to parse cluster name from %v, expected %v got %v", fullName, clusterName, components.ClusterName)
|
|
|
|
}
|
|
|
|
resourceName := "fw"
|
|
|
|
if components.Resource != resourceName {
|
|
|
|
t.Errorf("Failed to parse resource from %v, expected %v got %v", fullName, resourceName, components.Resource)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestClusterNameChange(t *testing.T) {
|
|
|
|
lbInfo := &L7RuntimeInfo{
|
|
|
|
Name: "test",
|
|
|
|
TLS: &TLSCerts{Key: "key", Cert: "cert"},
|
|
|
|
}
|
|
|
|
f := NewFakeLoadBalancers(lbInfo.Name)
|
|
|
|
pool := newFakeLoadBalancerPool(f, t)
|
2016-12-07 19:53:16 +00:00
|
|
|
pool.Sync([]*L7RuntimeInfo{lbInfo})
|
2016-08-09 02:11:47 +00:00
|
|
|
l7, err := pool.Get(lbInfo.Name)
|
|
|
|
if err != nil || l7 == nil {
|
|
|
|
t.Fatalf("Expected l7 not created")
|
|
|
|
}
|
|
|
|
um, err := f.GetUrlMap(f.umName())
|
|
|
|
if err != nil ||
|
|
|
|
um.DefaultService != pool.(*L7s).glbcDefaultBackend.SelfLink {
|
|
|
|
t.Fatalf("%v", err)
|
|
|
|
}
|
|
|
|
tps, err := f.GetTargetHttpsProxy(f.tpName(true))
|
|
|
|
if err != nil || tps.UrlMap != um.SelfLink {
|
|
|
|
t.Fatalf("%v", err)
|
|
|
|
}
|
|
|
|
fws, err := f.GetGlobalForwardingRule(f.fwName(true))
|
|
|
|
if err != nil || fws.Target != tps.SelfLink {
|
|
|
|
t.Fatalf("%v", err)
|
|
|
|
}
|
|
|
|
newName := "newName"
|
|
|
|
namer := pool.(*L7s).namer
|
|
|
|
namer.SetClusterName(newName)
|
|
|
|
f.name = fmt.Sprintf("%v--%v", lbInfo.Name, newName)
|
|
|
|
|
|
|
|
// Now the components should get renamed with the next suffix.
|
2016-12-07 19:53:16 +00:00
|
|
|
pool.Sync([]*L7RuntimeInfo{lbInfo})
|
2016-08-09 02:11:47 +00:00
|
|
|
l7, err = pool.Get(lbInfo.Name)
|
|
|
|
if err != nil || namer.ParseName(l7.Name).ClusterName != newName {
|
|
|
|
t.Fatalf("Expected L7 name to change.")
|
|
|
|
}
|
|
|
|
um, err = f.GetUrlMap(f.umName())
|
|
|
|
if err != nil || namer.ParseName(um.Name).ClusterName != newName {
|
|
|
|
t.Fatalf("Expected urlmap name to change.")
|
|
|
|
}
|
|
|
|
if err != nil ||
|
|
|
|
um.DefaultService != pool.(*L7s).glbcDefaultBackend.SelfLink {
|
|
|
|
t.Fatalf("%v", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
tps, err = f.GetTargetHttpsProxy(f.tpName(true))
|
|
|
|
if err != nil || tps.UrlMap != um.SelfLink {
|
|
|
|
t.Fatalf("%v", err)
|
|
|
|
}
|
|
|
|
fws, err = f.GetGlobalForwardingRule(f.fwName(true))
|
|
|
|
if err != nil || fws.Target != tps.SelfLink {
|
|
|
|
t.Fatalf("%v", err)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestInvalidClusterNameChange(t *testing.T) {
|
2017-02-28 00:08:42 +00:00
|
|
|
namer := utils.NewNamer("test--123", "test--123")
|
2016-08-09 02:11:47 +00:00
|
|
|
if got := namer.GetClusterName(); got != "123" {
|
|
|
|
t.Fatalf("Expected name 123, got %v", got)
|
|
|
|
}
|
|
|
|
// A name with `--` should take the last token
|
|
|
|
for _, testCase := range []struct{ newName, expected string }{
|
|
|
|
{"foo--bar", "bar"},
|
|
|
|
{"--", ""},
|
|
|
|
{"", ""},
|
|
|
|
{"foo--bar--com", "com"},
|
|
|
|
} {
|
|
|
|
namer.SetClusterName(testCase.newName)
|
|
|
|
if got := namer.GetClusterName(); got != testCase.expected {
|
|
|
|
t.Fatalf("Expected %q got %q", testCase.expected, got)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|