Skip to content

Commit

Permalink
Check GCE ILB works with static IP
Browse files Browse the repository at this point in the history
  • Loading branch information
Nick Sardo committed Aug 31, 2017
1 parent bdd0e99 commit 840f411
Show file tree
Hide file tree
Showing 2 changed files with 80 additions and 21 deletions.
45 changes: 45 additions & 0 deletions test/e2e/framework/google_compute.go
Expand Up @@ -27,6 +27,7 @@ import (
"time"

"github.com/golang/glog"
computebeta "google.golang.org/api/compute/v0.beta"

"k8s.io/kubernetes/pkg/cloudprovider/providers/gce"
)
Expand Down Expand Up @@ -77,6 +78,50 @@ func CreateGCEStaticIP(name string) (string, error) {
}
}

func CreateGCEInternalStaticIP(name string) (string, error) {
gceCloud := TestContext.CloudConfig.Provider.(*gce.GCECloud)

subnet := gceCloud.SubnetworkURL()
if subnet == "" {
subnet = subnetURL(gceCloud.NetworkProjectID(), gceCloud.Region(), getNameFromLink(gceCloud.NetworkURL()))
}

addr := &computebeta.Address{
Name: name,
AddressType: "INTERNAL",
Subnetwork: subnet,
}

if err := gceCloud.ReserveBetaRegionAddress(addr, gceCloud.Region()); err != nil {
return "", err
}

addr, err := gceCloud.GetBetaRegionAddress(name, gceCloud.Region())
if err != nil {
return "", err
}

return addr.Address, nil
}

func DeleteGCEInternalStaticIP(name string) error {
gceCloud := TestContext.CloudConfig.Provider.(*gce.GCECloud)
return gceCloud.DeleteRegionAddress(name, gceCloud.Region())
}

func getNameFromLink(link string) string {
if link == "" {
return ""
}

fields := strings.Split(link, "/")
return fields[len(fields)-1]
}

func subnetURL(project, region, subnetwork string) string {
return "https://www.googleapis.com/compute/v1/" + strings.Join([]string{"projects", project, "regions", region, "subnetworks", subnetwork}, "/")
}

func DeleteGCEStaticIP(name string) error {
// gcloud compute --project "abshah-kubernetes-001" addresses create "test-static-ip" --region "us-central1"
// abshah@abhidesk:~/go/src/code.google.com/p/google-api-go-client/compute/v1$ gcloud compute --project "abshah-kubernetes-001" addresses create "test-static-ip" --region "us-central1"
Expand Down
56 changes: 35 additions & 21 deletions test/e2e/network/service.go
Expand Up @@ -1387,30 +1387,44 @@ var _ = SIGDescribe("Services", func() {
jig.SanityCheckService(svc, v1.ServiceTypeLoadBalancer)
Expect(isInternalEndpoint(lbIngress)).To(BeFalse())

// GCE cannot test a specific IP because the test may not own it. This cloud specific condition
// will be removed when GCP supports similar functionality.
if framework.ProviderIs("azure") {
By("switching back to interal type LoadBalancer, with static IP specified.")
internalStaticIP := "10.240.11.11"
svc = jig.UpdateServiceOrFail(namespace, serviceName, func(svc *v1.Service) {
svc.Spec.LoadBalancerIP = internalStaticIP
enableILB(svc)
})
framework.Logf("Waiting up to %v for service %q to have an internal LoadBalancer", createTimeout, serviceName)
if pollErr := wait.PollImmediate(pollInterval, createTimeout, func() (bool, error) {
svc, err := jig.Client.Core().Services(namespace).Get(serviceName, metav1.GetOptions{})
if err != nil {
return false, err
// Azure's internal static IP
internalStaticIP := "10.240.11.11"
// GCE will just create a reservation and take whatever IP is returned.
if framework.ProviderIs("gce", "gke") {
By("creating a static internal IP")
staticIPName := fmt.Sprintf("e2e-internal-lb-test-%s", framework.RunId)
addr, err := framework.CreateGCEInternalStaticIP(staticIPName)
defer func() {
if staticIPName != "" {
// Release GCE static IP - this is not kube-managed and will not be automatically released.
if err := framework.DeleteGCEInternalStaticIP(staticIPName); err != nil {
framework.Logf("failed to release internal static IP %s: %v", staticIPName, err)
}
}
lbIngress = &svc.Status.LoadBalancer.Ingress[0]
return isInternalEndpoint(lbIngress), nil
}); pollErr != nil {
framework.Failf("Loadbalancer IP not changed to internal.")
}()
Expect(err).NotTo(HaveOccurred())
internalStaticIP = addr
}

By("switching back to interal type LoadBalancer, with static IP specified.")
svc = jig.UpdateServiceOrFail(namespace, serviceName, func(svc *v1.Service) {
svc.Spec.LoadBalancerIP = internalStaticIP
enableILB(svc)
})
framework.Logf("Waiting up to %v for service %q to have an internal LoadBalancer", createTimeout, serviceName)
if pollErr := wait.PollImmediate(pollInterval, createTimeout, func() (bool, error) {
svc, err := jig.Client.Core().Services(namespace).Get(serviceName, metav1.GetOptions{})
if err != nil {
return false, err
}
// should have the given static internal IP.
jig.SanityCheckService(svc, v1.ServiceTypeLoadBalancer)
Expect(framework.GetIngressPoint(lbIngress)).To(Equal(internalStaticIP))
lbIngress = &svc.Status.LoadBalancer.Ingress[0]
return isInternalEndpoint(lbIngress), nil
}); pollErr != nil {
framework.Failf("Loadbalancer IP not changed to internal.")
}
// should have the given static internal IP.
jig.SanityCheckService(svc, v1.ServiceTypeLoadBalancer)
Expect(framework.GetIngressPoint(lbIngress)).To(Equal(internalStaticIP))

By("switching to ClusterIP type to destroy loadbalancer")
jig.ChangeServiceType(svc.Namespace, svc.Name, v1.ServiceTypeClusterIP, createTimeout)
Expand Down

0 comments on commit 840f411

Please sign in to comment.