E2E changes to support templated addon

This commit is contained in:
Prashanth Balasubramanian 2016-04-20 16:14:53 -07:00
parent b066cb5357
commit 1f4e48ba59

View File

@ -255,7 +255,6 @@ func kubectlLogLBController(c *client.Client, ns string) {
type IngressController struct { type IngressController struct {
ns string ns string
rcPath string rcPath string
defaultSvcPath string
UID string UID string
Project string Project string
rc *api.ReplicationController rc *api.ReplicationController
@ -263,66 +262,40 @@ type IngressController struct {
c *client.Client c *client.Client
} }
func (cont *IngressController) create() { func (cont *IngressController) getL7AddonUID() (string, error) {
// TODO: This cop out is because it would be *more* brittle to duplicate all
// the name construction logic from the controller cross-repo. We will not
// need to be so paranoid about leaked resources once we figure out a solution
// for issues like #16337. Currently, all names should fall within 63 chars.
testName := fmt.Sprintf("k8s-fw-foo-app-X-%v--%v", cont.ns, cont.UID)
if len(testName) > nameLenLimit {
framework.Failf("Cannot reliably test the given namespace(%v)/uid(%v), too close to GCE limit of %v",
cont.ns, cont.UID, nameLenLimit)
}
if cont.defaultSvcPath != "" {
svc := svcFromManifest(cont.defaultSvcPath)
svc.Namespace = cont.ns
svc.Labels = controllerLabels
svc.Spec.Selector = controllerLabels
cont.svc = svc
_, err := cont.c.Services(cont.ns).Create(cont.svc)
Expect(err).NotTo(HaveOccurred())
}
rc := rcFromManifest(cont.rcPath)
listOpts := api.ListOptions{LabelSelector: labels.SelectorFromSet(labels.Set(clusterAddonLBLabels))} listOpts := api.ListOptions{LabelSelector: labels.SelectorFromSet(labels.Set(clusterAddonLBLabels))}
existingRCs, err := cont.c.ReplicationControllers(api.NamespaceSystem).List(listOpts) existingRCs, err := cont.c.ReplicationControllers(api.NamespaceSystem).List(listOpts)
Expect(err).NotTo(HaveOccurred()) if err != nil {
return "", err
}
if len(existingRCs.Items) != 1 { if len(existingRCs.Items) != 1 {
framework.Failf("Unexpected number of lb cluster addons %v with label %v in kube-system namespace", len(existingRCs.Items), clusterAddonLBLabels) return "", fmt.Errorf("Unexpected number of lb cluster addons %v with label %v in kube-system namespace", len(existingRCs.Items), clusterAddonLBLabels)
}
// Merge the existing spec and new spec. The modifications should not
// manifest as functional changes to the controller. Most importantly, the
// podTemplate shouldn't change (but for the additional test cmd line flags)
// to ensure we test actual cluster functionality across upgrades.
rc.Spec = existingRCs.Items[0].Spec
rc.Name = "glbc"
rc.Namespace = cont.ns
rc.Labels = controllerLabels
rc.Spec.Selector = controllerLabels
rc.Spec.Template.Labels = controllerLabels
rc.Spec.Replicas = 1
// These command line params are only recognized by v0.51 and above.
testArgs := []string{
// Pass namespace uid so the controller will tag resources with it.
fmt.Sprintf("--cluster-uid=%v", cont.UID),
// Tell the controller to delete all resources as it quits.
fmt.Sprintf("--delete-all-on-quit=true"),
// Don't use the default Service from kube-system.
fmt.Sprintf("--default-backend-service=%v/%v", cont.svc.Namespace, cont.svc.Name),
} }
rc := existingRCs.Items[0]
commandPrefix := "--cluster-uid="
for i, c := range rc.Spec.Template.Spec.Containers { for i, c := range rc.Spec.Template.Spec.Containers {
if c.Name == lbContainerName { if c.Name == lbContainerName {
rc.Spec.Template.Spec.Containers[i].Args = append(c.Args, testArgs...) for _, arg := range rc.Spec.Template.Spec.Containers[i].Args {
if strings.HasPrefix(arg, commandPrefix) {
return strings.Replace(arg, commandPrefix, "", -1), nil
} }
} }
cont.rc = rc }
_, err = cont.c.ReplicationControllers(cont.ns).Create(cont.rc) }
return "", fmt.Errorf("Could not find cluster UID for L7 addon pod")
}
func (cont *IngressController) init() {
uid, err := cont.getL7AddonUID()
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
Expect(framework.WaitForRCPodsRunning(cont.c, cont.ns, cont.rc.Name)).NotTo(HaveOccurred()) cont.UID = uid
// There's a name limit imposed by GCE. The controller will truncate.
testName := fmt.Sprintf("k8s-fw-foo-app-X-%v--%v", cont.ns, cont.UID)
if len(testName) > nameLenLimit {
framework.Logf("WARNING: test name including cluster UID: %v is over the GCE limit of %v", testName, nameLenLimit)
} else {
framework.Logf("Deteced cluster UID %v", cont.UID)
}
} }
func (cont *IngressController) Cleanup(del bool) error { func (cont *IngressController) Cleanup(del bool) error {
@ -457,24 +430,14 @@ var _ = framework.KubeDescribe("GCE L7 LoadBalancer Controller [Feature:Ingress]
f.BeforeEach() f.BeforeEach()
client = f.Client client = f.Client
ns = f.Namespace.Name ns = f.Namespace.Name
// Scaled down the existing Ingress controller so it doesn't interfere with the test.
Expect(framework.ScaleRCByLabels(client, api.NamespaceSystem, clusterAddonLBLabels, 0)).NotTo(HaveOccurred())
addonDir = filepath.Join( addonDir = filepath.Join(
framework.TestContext.RepoRoot, "cluster", "addons", "cluster-loadbalancing", "glbc") framework.TestContext.RepoRoot, "cluster", "addons", "cluster-loadbalancing", "glbc")
nsParts := strings.Split(ns, "-")
ingController = &IngressController{ ingController = &IngressController{
ns: ns, ns: ns,
// The UID in the namespace was generated by the master, so it's
// global to the cluster.
UID: nsParts[len(nsParts)-1],
Project: framework.TestContext.CloudConfig.ProjectID, Project: framework.TestContext.CloudConfig.ProjectID,
rcPath: filepath.Join(addonDir, "glbc-controller.yaml"),
defaultSvcPath: filepath.Join(addonDir, "default-svc.yaml"),
c: client, c: client,
} }
ingController.create() ingController.init()
framework.Logf("Finished creating ingress controller")
// If we somehow get the same namespace uid as someone else in this // If we somehow get the same namespace uid as someone else in this
// gce project, just back off. // gce project, just back off.
Expect(ingController.Cleanup(false)).NotTo(HaveOccurred()) Expect(ingController.Cleanup(false)).NotTo(HaveOccurred())
@ -509,9 +472,6 @@ var _ = framework.KubeDescribe("GCE L7 LoadBalancer Controller [Feature:Ingress]
} }
return true, nil return true, nil
}) })
// TODO: Remove this once issue #17802 is fixed
Expect(framework.ScaleRCByLabels(client, ingController.rc.Namespace, ingController.rc.Labels, 0)).NotTo(HaveOccurred())
// If the controller failed to cleanup the test will fail, but we want to cleanup // If the controller failed to cleanup the test will fail, but we want to cleanup
// resources before that. // resources before that.
if pollErr != nil { if pollErr != nil {
@ -520,8 +480,6 @@ var _ = framework.KubeDescribe("GCE L7 LoadBalancer Controller [Feature:Ingress]
} }
framework.Failf("Failed to cleanup GCE L7 resources.") framework.Failf("Failed to cleanup GCE L7 resources.")
} }
// Restore the cluster Addon.
Expect(framework.ScaleRCByLabels(client, api.NamespaceSystem, clusterAddonLBLabels, 1)).NotTo(HaveOccurred())
f.AfterEach() f.AfterEach()
framework.Logf("Successfully verified GCE L7 loadbalancer via Ingress.") framework.Logf("Successfully verified GCE L7 loadbalancer via Ingress.")
}) })