diff --git a/test/e2e/framework/nodes_util.go b/test/e2e/framework/nodes_util.go index 6b54bee712..8ab6e9defe 100644 --- a/test/e2e/framework/nodes_util.go +++ b/test/e2e/framework/nodes_util.go @@ -20,6 +20,7 @@ import ( "fmt" "os" "path" + "path/filepath" "strings" "time" @@ -46,6 +47,8 @@ func MasterUpgrade(v string) error { return masterUpgradeGCE(v, false) case "gke": return masterUpgradeGKE(v) + case "kubernetes-anywhere": + return masterUpgradeKubernetesAnywhere(v) default: return fmt.Errorf("MasterUpgrade() is not implemented for provider %s", TestContext.Provider) } @@ -103,6 +106,46 @@ func masterUpgradeGKE(v string) error { return nil } +func masterUpgradeKubernetesAnywhere(v string) error { + Logf("Upgrading master to %q", v) + + kaPath := TestContext.KubernetesAnywherePath + originalConfigPath := filepath.Join(kaPath, ".config") + backupConfigPath := filepath.Join(kaPath, ".config.bak") + updatedConfigPath := filepath.Join(kaPath, fmt.Sprintf(".config-%s", v)) + + // backup .config to .config.bak + if err := os.Rename(originalConfigPath, backupConfigPath); err != nil { + return err + } + defer func() { + // revert .config.bak to .config + if err := os.Rename(backupConfigPath, originalConfigPath); err != nil { + Logf("Could not rename %s back to %s", backupConfigPath, originalConfigPath) + } + }() + + // modify config with specified k8s version + if _, _, err := RunCmd("sed", + fmt.Sprintf(`s/kubernetes_version=.*$/kubernetes_version=%s/`, v), + backupConfigPath, ">", originalConfigPath); err != nil { + return err + } + + // invoke ka upgrade + if _, _, err := RunCmd("make", "-C", TestContext.KubernetesAnywherePath, + "WAIT_FOR_KUBECONFIG=y", "upgrade-master"); err != nil { + return err + } + + // move .config to .config. + if err := os.Rename(originalConfigPath, updatedConfigPath); err != nil { + return err + } + + return nil +} + func NodeUpgrade(f *Framework, v string, img string) error { // Perform the upgrade. var err error diff --git a/test/e2e/framework/test_context.go b/test/e2e/framework/test_context.go index 3abb93495e..205a4d013b 100644 --- a/test/e2e/framework/test_context.go +++ b/test/e2e/framework/test_context.go @@ -106,6 +106,9 @@ type TestContextType struct { // Whether configuration for accessing federation member clusters should be sourced from the host cluster FederationConfigFromCluster bool + // Indicates what path the kubernetes-anywhere is installed on + KubernetesAnywherePath string + // Viper-only parameters. These will in time replace all flags. // Example: Create a file 'e2e.json' with the following: @@ -201,6 +204,7 @@ func RegisterCommonFlags() { flag.StringVar(&TestContext.ContainerRuntimeEndpoint, "container-runtime-endpoint", "", "The container runtime endpoint of cluster VM instances.") flag.StringVar(&TestContext.ImageServiceEndpoint, "image-service-endpoint", "", "The image service endpoint of cluster VM instances.") flag.StringVar(&TestContext.DockershimCheckpointDir, "dockershim-checkpoint-dir", "/var/lib/dockershim/sandbox", "The directory for dockershim to store sandbox checkpoints.") + flag.StringVar(&TestContext.KubernetesAnywherePath, "kubernetes-anywhere-path", "/workspace/kubernetes-anywhere", "Which directory kubernetes-anywhere is installed to.") } // Register flags specific to the cluster e2e test suite.