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
 | 
						// TODO(ihmccreery) This code path should be identical to how a user
 | 
				
			||||||
	// would trigger a node update; right now it's very different.
 | 
						// would trigger a node update; right now it's very different.
 | 
				
			||||||
	v := "v" + rawV
 | 
						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)
 | 
						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)
 | 
						stdout, _, err := runCmd(path.Join(testContext.RepoRoot, "cluster/gce/upgrade.sh"), "-P", v)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return err
 | 
							cleanupNodeUpgradeGCE(tmplBefore)
 | 
				
			||||||
 | 
							return fmt.Errorf("error preparing node upgrade: %v", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	tmpl := strings.TrimSpace(stdout)
 | 
						tmpl := strings.TrimSpace(stdout)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	Logf("Performing a node upgrade to %q; waiting at most %v per node", tmpl, restartPerNodeTimeout)
 | 
						Logf("Performing a node upgrade to %q; waiting at most %v per node", tmpl, restartPerNodeTimeout)
 | 
				
			||||||
	if err := migRollingUpdate(tmpl, restartPerNodeTimeout); err != nil {
 | 
						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 fmt.Errorf("error doing node upgrade via a migRollingUpdate to %s: %v", tmpl, err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return nil
 | 
						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 {
 | 
					func nodeUpgradeGKE(v string) error {
 | 
				
			||||||
	Logf("Upgrading nodes to %q", v)
 | 
						Logf("Upgrading nodes to %q", v)
 | 
				
			||||||
	_, _, err := runCmd("gcloud", "container",
 | 
						_, _, err := runCmd("gcloud", "container",
 | 
				
			||||||
@@ -204,42 +236,6 @@ var _ = KubeDescribe("Upgrade [Feature:Upgrade]", func() {
 | 
				
			|||||||
	})
 | 
						})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	KubeDescribe("node 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() {
 | 
							It("should maintain a functioning cluster [Feature:NodeUpgrade]", func() {
 | 
				
			||||||
			By("Validating cluster before node upgrade")
 | 
								By("Validating cluster before node upgrade")
 | 
				
			||||||
			expectNoError(validate(f, svcName, rcName, ingress, replicas))
 | 
								expectNoError(validate(f, svcName, rcName, ingress, replicas))
 | 
				
			||||||
@@ -267,6 +263,53 @@ var _ = KubeDescribe("Upgrade [Feature:Upgrade]", func() {
 | 
				
			|||||||
			expectNoError(validate(f, svcName, rcName, ingress, replicas))
 | 
								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) {
 | 
					func testUpgrade(ip, v string, upF func(v string) error) {
 | 
				
			||||||
@@ -437,7 +480,7 @@ func migRollingUpdate(tmpl string, nt time.Duration) error {
 | 
				
			|||||||
	return nil
 | 
						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.
 | 
					// nodes of the cluster use.
 | 
				
			||||||
func migTemplate() (string, error) {
 | 
					func migTemplate() (string, error) {
 | 
				
			||||||
	var errLast error
 | 
						var errLast error
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user