Add ClusterUpgrade tests
This commit is contained in:
		@@ -110,20 +110,52 @@ func nodeUpgradeGCE(rawV string) error {
 | 
			
		||||
	// TODO(ihmccreery) This code path should be identical to how a user
 | 
			
		||||
	// would trigger a node update; right now it's very different.
 | 
			
		||||
	v := "v" + rawV
 | 
			
		||||
 | 
			
		||||
	Logf("Getting the node template before the upgrade")
 | 
			
		||||
	tmplBefore, err := migTemplate()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return fmt.Errorf("error getting the node template before the upgrade: %v", err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	Logf("Preparing node upgrade by creating new instance template for %q", v)
 | 
			
		||||
	stdout, _, err := runCmd(path.Join(testContext.RepoRoot, "cluster/gce/upgrade.sh"), "-P", v)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
		cleanupNodeUpgradeGCE(tmplBefore)
 | 
			
		||||
		return fmt.Errorf("error preparing node upgrade: %v", err)
 | 
			
		||||
	}
 | 
			
		||||
	tmpl := strings.TrimSpace(stdout)
 | 
			
		||||
 | 
			
		||||
	Logf("Performing a node upgrade to %q; waiting at most %v per node", tmpl, restartPerNodeTimeout)
 | 
			
		||||
	if err := migRollingUpdate(tmpl, restartPerNodeTimeout); err != nil {
 | 
			
		||||
		cleanupNodeUpgradeGCE(tmplBefore)
 | 
			
		||||
		return fmt.Errorf("error doing node upgrade via a migRollingUpdate to %s: %v", tmpl, err)
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func cleanupNodeUpgradeGCE(tmplBefore string) {
 | 
			
		||||
	Logf("Cleaning up any unused node templates")
 | 
			
		||||
	tmplAfter, err := migTemplate()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		Logf("Could not get node template post-upgrade; may have leaked template %s", tmplBefore)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	if tmplBefore == tmplAfter {
 | 
			
		||||
		// The node upgrade failed so there's no need to delete
 | 
			
		||||
		// anything.
 | 
			
		||||
		Logf("Node template %s is still in use; not cleaning up", tmplBefore)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	Logf("Deleting node template %s", tmplBefore)
 | 
			
		||||
	if _, _, err := retryCmd("gcloud", "compute", "instance-templates",
 | 
			
		||||
		fmt.Sprintf("--project=%s", testContext.CloudConfig.ProjectID),
 | 
			
		||||
		"delete",
 | 
			
		||||
		tmplBefore); err != nil {
 | 
			
		||||
		Logf("gcloud compute instance-templates delete %s call failed with err: %v", tmplBefore, err)
 | 
			
		||||
		Logf("May have leaked instance template %q", tmplBefore)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func nodeUpgradeGKE(v string) error {
 | 
			
		||||
	Logf("Upgrading nodes to %q", v)
 | 
			
		||||
	_, _, err := runCmd("gcloud", "container",
 | 
			
		||||
@@ -204,42 +236,6 @@ var _ = KubeDescribe("Upgrade [Feature:Upgrade]", func() {
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	KubeDescribe("node upgrade", func() {
 | 
			
		||||
		var tmplBefore, tmplAfter string
 | 
			
		||||
		BeforeEach(func() {
 | 
			
		||||
			if providerIs("gce") {
 | 
			
		||||
				By("Getting the node template before the upgrade")
 | 
			
		||||
				var err error
 | 
			
		||||
				tmplBefore, err = migTemplate()
 | 
			
		||||
				expectNoError(err)
 | 
			
		||||
			}
 | 
			
		||||
		})
 | 
			
		||||
 | 
			
		||||
		AfterEach(func() {
 | 
			
		||||
			if providerIs("gce") {
 | 
			
		||||
				By("Cleaning up any unused node templates")
 | 
			
		||||
				var err error
 | 
			
		||||
				tmplAfter, err = migTemplate()
 | 
			
		||||
				if err != nil {
 | 
			
		||||
					Logf("Could not get node template post-upgrade; may have leaked template %s", tmplBefore)
 | 
			
		||||
					return
 | 
			
		||||
				}
 | 
			
		||||
				if tmplBefore == tmplAfter {
 | 
			
		||||
					// The node upgrade failed so there's no need to delete
 | 
			
		||||
					// anything.
 | 
			
		||||
					Logf("Node template %s is still in use; not cleaning up", tmplBefore)
 | 
			
		||||
					return
 | 
			
		||||
				}
 | 
			
		||||
				Logf("Deleting node template %s", tmplBefore)
 | 
			
		||||
				if _, _, err := retryCmd("gcloud", "compute", "instance-templates",
 | 
			
		||||
					fmt.Sprintf("--project=%s", testContext.CloudConfig.ProjectID),
 | 
			
		||||
					"delete",
 | 
			
		||||
					tmplBefore); err != nil {
 | 
			
		||||
					Logf("gcloud compute instance-templates delete %s call failed with err: %v", tmplBefore, err)
 | 
			
		||||
					Logf("May have leaked instance template %q", tmplBefore)
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		})
 | 
			
		||||
 | 
			
		||||
		It("should maintain a functioning cluster [Feature:NodeUpgrade]", func() {
 | 
			
		||||
			By("Validating cluster before node upgrade")
 | 
			
		||||
			expectNoError(validate(f, svcName, rcName, ingress, replicas))
 | 
			
		||||
@@ -267,6 +263,53 @@ var _ = KubeDescribe("Upgrade [Feature:Upgrade]", func() {
 | 
			
		||||
			expectNoError(validate(f, svcName, rcName, ingress, replicas))
 | 
			
		||||
		})
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	KubeDescribe("cluster upgrade", func() {
 | 
			
		||||
		It("should maintain responsive services [Feature:ClusterUpgrade]", func() {
 | 
			
		||||
			By("Validating cluster before master upgrade")
 | 
			
		||||
			expectNoError(validate(f, svcName, rcName, ingress, replicas))
 | 
			
		||||
			By("Performing a master upgrade")
 | 
			
		||||
			testUpgrade(ip, v, masterUpgrade)
 | 
			
		||||
			By("Checking master version")
 | 
			
		||||
			expectNoError(checkMasterVersion(f.Client, v))
 | 
			
		||||
			By("Validating cluster after master upgrade")
 | 
			
		||||
			expectNoError(validate(f, svcName, rcName, ingress, replicas))
 | 
			
		||||
 | 
			
		||||
			By("Validating cluster before node upgrade")
 | 
			
		||||
			expectNoError(validate(f, svcName, rcName, ingress, replicas))
 | 
			
		||||
			By("Performing a node upgrade")
 | 
			
		||||
			// Circumnavigate testUpgrade, since services don't necessarily stay up.
 | 
			
		||||
			Logf("Starting upgrade")
 | 
			
		||||
			expectNoError(nodeUpgrade(f, replicas, v))
 | 
			
		||||
			Logf("Upgrade complete")
 | 
			
		||||
			By("Checking node versions")
 | 
			
		||||
			expectNoError(checkNodesVersions(f.Client, v))
 | 
			
		||||
			By("Validating cluster after node upgrade")
 | 
			
		||||
			expectNoError(validate(f, svcName, rcName, ingress, replicas))
 | 
			
		||||
		})
 | 
			
		||||
 | 
			
		||||
		It("should maintain responsive services [Feature:ExperimentalClusterUpgrade]", func() {
 | 
			
		||||
			By("Validating cluster before master upgrade")
 | 
			
		||||
			expectNoError(validate(f, svcName, rcName, ingress, replicas))
 | 
			
		||||
			By("Performing a master upgrade")
 | 
			
		||||
			testUpgrade(ip, v, masterUpgrade)
 | 
			
		||||
			By("Checking master version")
 | 
			
		||||
			expectNoError(checkMasterVersion(f.Client, v))
 | 
			
		||||
			By("Validating cluster after master upgrade")
 | 
			
		||||
			expectNoError(validate(f, svcName, rcName, ingress, replicas))
 | 
			
		||||
 | 
			
		||||
			By("Validating cluster before node upgrade")
 | 
			
		||||
			expectNoError(validate(f, svcName, rcName, ingress, replicas))
 | 
			
		||||
			By("Performing a node upgrade")
 | 
			
		||||
			testUpgrade(ip, v, func(v string) error {
 | 
			
		||||
				return nodeUpgrade(f, replicas, v)
 | 
			
		||||
			})
 | 
			
		||||
			By("Checking node versions")
 | 
			
		||||
			expectNoError(checkNodesVersions(f.Client, v))
 | 
			
		||||
			By("Validating cluster after node upgrade")
 | 
			
		||||
			expectNoError(validate(f, svcName, rcName, ingress, replicas))
 | 
			
		||||
		})
 | 
			
		||||
	})
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
func testUpgrade(ip, v string, upF func(v string) error) {
 | 
			
		||||
@@ -437,7 +480,7 @@ func migRollingUpdate(tmpl string, nt time.Duration) error {
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// migTemplate (GCE/GKE-only) returns the name of the MIG template that the
 | 
			
		||||
// migTemplate (GCE-only) returns the name of the MIG template that the
 | 
			
		||||
// nodes of the cluster use.
 | 
			
		||||
func migTemplate() (string, error) {
 | 
			
		||||
	var errLast error
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user