From 84d630c189b509d0bed8016b2fb47f4766248e7f Mon Sep 17 00:00:00 2001 From: Michelle Au Date: Thu, 9 Feb 2017 16:28:29 -0800 Subject: [PATCH] Add PV upgrade test --- test/e2e/cluster_upgrade.go | 1 + test/e2e/upgrades/BUILD | 1 + test/e2e/upgrades/persistent_volumes.go | 98 +++++++++++++++++++++++++ 3 files changed, 100 insertions(+) create mode 100644 test/e2e/upgrades/persistent_volumes.go diff --git a/test/e2e/cluster_upgrade.go b/test/e2e/cluster_upgrade.go index 56b925e1cbc..b785f246589 100644 --- a/test/e2e/cluster_upgrade.go +++ b/test/e2e/cluster_upgrade.go @@ -36,6 +36,7 @@ var upgradeTests = []upgrades.Test{ &upgrades.DeploymentUpgradeTest{}, &upgrades.ConfigMapUpgradeTest{}, &upgrades.HPAUpgradeTest{}, + &upgrades.PersistentVolumeUpgradeTest{}, } var _ = framework.KubeDescribe("Upgrade [Feature:Upgrade]", func() { diff --git a/test/e2e/upgrades/BUILD b/test/e2e/upgrades/BUILD index e36647ab13b..4a0ddbbef9a 100644 --- a/test/e2e/upgrades/BUILD +++ b/test/e2e/upgrades/BUILD @@ -13,6 +13,7 @@ go_library( "configmaps.go", "deployments.go", "horizontal_pod_autoscalers.go", + "persistent_volumes.go", "secrets.go", "services.go", "statefulset.go", diff --git a/test/e2e/upgrades/persistent_volumes.go b/test/e2e/upgrades/persistent_volumes.go new file mode 100644 index 00000000000..03b8423bbed --- /dev/null +++ b/test/e2e/upgrades/persistent_volumes.go @@ -0,0 +1,98 @@ +/* +Copyright 2017 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package upgrades + +import ( + "k8s.io/kubernetes/pkg/api/v1" + "k8s.io/kubernetes/test/e2e/framework" + + . "github.com/onsi/ginkgo" +) + +// PersistentVolumeUpgradeTest test that a pv is available before and after a cluster upgrade. +type PersistentVolumeUpgradeTest struct { + pvSource *v1.PersistentVolumeSource + pv *v1.PersistentVolume + pvc *v1.PersistentVolumeClaim +} + +const ( + pvTestFile string = "/mnt/pv_upgrade_test" + pvTestData string = "keep it pv" + pvWriteCmd string = "echo \"" + pvTestData + "\" > " + pvTestFile + pvReadCmd string = "cat " + pvTestFile +) + +func (t *PersistentVolumeUpgradeTest) createGCEVolume() *v1.PersistentVolumeSource { + diskName, err := framework.CreatePDWithRetry() + framework.ExpectNoError(err) + return &v1.PersistentVolumeSource{ + GCEPersistentDisk: &v1.GCEPersistentDiskVolumeSource{ + PDName: diskName, + FSType: "ext3", + ReadOnly: false, + }, + } +} +func (t *PersistentVolumeUpgradeTest) deleteGCEVolume(pvSource *v1.PersistentVolumeSource) { + framework.DeletePDWithRetry(pvSource.GCEPersistentDisk.PDName) +} + +// Setup creates a pv and then verifies that a pod can consume it. The pod writes data to the volume. +func (t *PersistentVolumeUpgradeTest) Setup(f *framework.Framework) { + + // TODO: generalize this to other providers + framework.SkipUnlessProviderIs("gce", "gke") + + ns := f.Namespace.Name + + By("Initializing PV source") + t.pvSource = t.createGCEVolume() + pvConfig := framework.PersistentVolumeConfig{ + NamePrefix: "pv-upgrade", + PVSource: *t.pvSource, + Prebind: nil, + } + + By("Creating the PV and PVC") + t.pv, t.pvc = framework.CreatePVPVC(f.ClientSet, pvConfig, ns, true) + framework.WaitOnPVandPVC(f.ClientSet, ns, t.pv, t.pvc) + + By("Consuming the PV before upgrade") + t.testPod(f, pvWriteCmd+";"+pvReadCmd) +} + +// Test waits for the upgrade to complete, and then verifies that a pod can still consume the pv +// and that the volume data persists. +func (t *PersistentVolumeUpgradeTest) Test(f *framework.Framework, done <-chan struct{}, upgrade UpgradeType) { + <-done + By("Consuming the PV after upgrade") + t.testPod(f, pvReadCmd) +} + +// Teardown cleans up any remaining resources. +func (t *PersistentVolumeUpgradeTest) Teardown(f *framework.Framework) { + framework.PVPVCCleanup(f.ClientSet, f.Namespace.Name, t.pv, t.pvc) + t.deleteGCEVolume(t.pvSource) +} + +// testPod creates a pod that consumes a pv and prints it out. The output is then verified. +func (t *PersistentVolumeUpgradeTest) testPod(f *framework.Framework, cmd string) { + pod := framework.MakePod(f.Namespace.Name, t.pvc.Name, false, cmd) + expectedOutput := []string{pvTestData} + f.TestContainerOutput("pod consumes pv", pod, 0, expectedOutput) +}