mirror of
				https://github.com/optim-enterprises-bv/kubernetes.git
				synced 2025-11-03 19:58:17 +00:00 
			
		
		
		
	e2e test layout changes for vsphere (#398)
This commit is contained in:
		@@ -796,6 +796,8 @@ test/e2e/scalability
 | 
				
			|||||||
test/e2e/scheduling
 | 
					test/e2e/scheduling
 | 
				
			||||||
test/e2e/servicecatalog
 | 
					test/e2e/servicecatalog
 | 
				
			||||||
test/e2e/storage
 | 
					test/e2e/storage
 | 
				
			||||||
 | 
					test/e2e/storage/utils
 | 
				
			||||||
 | 
					test/e2e/storage/vsphere
 | 
				
			||||||
test/e2e/ui
 | 
					test/e2e/ui
 | 
				
			||||||
test/e2e/upgrades
 | 
					test/e2e/upgrades
 | 
				
			||||||
test/e2e/upgrades/apps
 | 
					test/e2e/upgrades/apps
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -10,66 +10,42 @@ go_library(
 | 
				
			|||||||
    srcs = [
 | 
					    srcs = [
 | 
				
			||||||
        "empty_dir_wrapper.go",
 | 
					        "empty_dir_wrapper.go",
 | 
				
			||||||
        "flexvolume.go",
 | 
					        "flexvolume.go",
 | 
				
			||||||
        "framework.go",
 | 
					 | 
				
			||||||
        "pd.go",
 | 
					        "pd.go",
 | 
				
			||||||
        "persistent_volumes.go",
 | 
					        "persistent_volumes.go",
 | 
				
			||||||
        "persistent_volumes-disruptive.go",
 | 
					        "persistent_volumes-disruptive.go",
 | 
				
			||||||
        "persistent_volumes-gce.go",
 | 
					        "persistent_volumes-gce.go",
 | 
				
			||||||
        "persistent_volumes-local.go",
 | 
					        "persistent_volumes-local.go",
 | 
				
			||||||
        "persistent_volumes-vsphere.go",
 | 
					 | 
				
			||||||
        "pv_reclaimpolicy.go",
 | 
					 | 
				
			||||||
        "pvc_label_selector.go",
 | 
					 | 
				
			||||||
        "pvc_protection.go",
 | 
					        "pvc_protection.go",
 | 
				
			||||||
        "volume_expand.go",
 | 
					        "volume_expand.go",
 | 
				
			||||||
        "volume_io.go",
 | 
					        "volume_io.go",
 | 
				
			||||||
        "volume_metrics.go",
 | 
					        "volume_metrics.go",
 | 
				
			||||||
        "volume_provisioning.go",
 | 
					        "volume_provisioning.go",
 | 
				
			||||||
        "volumes.go",
 | 
					        "volumes.go",
 | 
				
			||||||
        "vsphere_scale.go",
 | 
					 | 
				
			||||||
        "vsphere_statefulsets.go",
 | 
					 | 
				
			||||||
        "vsphere_stress.go",
 | 
					 | 
				
			||||||
        "vsphere_utils.go",
 | 
					 | 
				
			||||||
        "vsphere_volume_cluster_ds.go",
 | 
					 | 
				
			||||||
        "vsphere_volume_datastore.go",
 | 
					 | 
				
			||||||
        "vsphere_volume_diskformat.go",
 | 
					 | 
				
			||||||
        "vsphere_volume_disksize.go",
 | 
					 | 
				
			||||||
        "vsphere_volume_fstype.go",
 | 
					 | 
				
			||||||
        "vsphere_volume_master_restart.go",
 | 
					 | 
				
			||||||
        "vsphere_volume_node_poweroff.go",
 | 
					 | 
				
			||||||
        "vsphere_volume_ops_storm.go",
 | 
					 | 
				
			||||||
        "vsphere_volume_perf.go",
 | 
					 | 
				
			||||||
        "vsphere_volume_placement.go",
 | 
					 | 
				
			||||||
        "vsphere_volume_vsan_policy.go",
 | 
					 | 
				
			||||||
    ],
 | 
					    ],
 | 
				
			||||||
    importpath = "k8s.io/kubernetes/test/e2e/storage",
 | 
					    importpath = "k8s.io/kubernetes/test/e2e/storage",
 | 
				
			||||||
    deps = [
 | 
					    deps = [
 | 
				
			||||||
        "//pkg/api/testapi:go_default_library",
 | 
					        "//pkg/api/testapi:go_default_library",
 | 
				
			||||||
        "//pkg/apis/core/v1/helper:go_default_library",
 | 
					        "//pkg/apis/core/v1/helper:go_default_library",
 | 
				
			||||||
        "//pkg/apis/storage/v1/util:go_default_library",
 | 
					        "//pkg/apis/storage/v1/util:go_default_library",
 | 
				
			||||||
        "//pkg/cloudprovider/providers/vsphere:go_default_library",
 | 
					 | 
				
			||||||
        "//pkg/cloudprovider/providers/vsphere/vclib:go_default_library",
 | 
					 | 
				
			||||||
        "//pkg/kubelet/apis:go_default_library",
 | 
					        "//pkg/kubelet/apis:go_default_library",
 | 
				
			||||||
        "//pkg/kubelet/metrics:go_default_library",
 | 
					        "//pkg/kubelet/metrics:go_default_library",
 | 
				
			||||||
        "//pkg/util/slice:go_default_library",
 | 
					        "//pkg/util/slice:go_default_library",
 | 
				
			||||||
        "//pkg/volume/util:go_default_library",
 | 
					        "//pkg/volume/util:go_default_library",
 | 
				
			||||||
        "//pkg/volume/util/volumehelper:go_default_library",
 | 
					 | 
				
			||||||
        "//test/e2e/framework:go_default_library",
 | 
					        "//test/e2e/framework:go_default_library",
 | 
				
			||||||
        "//test/e2e/framework/metrics:go_default_library",
 | 
					        "//test/e2e/framework/metrics:go_default_library",
 | 
				
			||||||
        "//test/e2e/generated:go_default_library",
 | 
					        "//test/e2e/generated:go_default_library",
 | 
				
			||||||
 | 
					        "//test/e2e/storage/utils:go_default_library",
 | 
				
			||||||
 | 
					        "//test/e2e/storage/vsphere:go_default_library",
 | 
				
			||||||
        "//test/utils/image:go_default_library",
 | 
					        "//test/utils/image:go_default_library",
 | 
				
			||||||
        "//vendor/github.com/aws/aws-sdk-go/aws:go_default_library",
 | 
					        "//vendor/github.com/aws/aws-sdk-go/aws:go_default_library",
 | 
				
			||||||
        "//vendor/github.com/aws/aws-sdk-go/aws/session:go_default_library",
 | 
					        "//vendor/github.com/aws/aws-sdk-go/aws/session:go_default_library",
 | 
				
			||||||
        "//vendor/github.com/aws/aws-sdk-go/service/ec2:go_default_library",
 | 
					        "//vendor/github.com/aws/aws-sdk-go/service/ec2:go_default_library",
 | 
				
			||||||
        "//vendor/github.com/onsi/ginkgo:go_default_library",
 | 
					        "//vendor/github.com/onsi/ginkgo:go_default_library",
 | 
				
			||||||
        "//vendor/github.com/onsi/gomega:go_default_library",
 | 
					        "//vendor/github.com/onsi/gomega:go_default_library",
 | 
				
			||||||
        "//vendor/github.com/vmware/govmomi/find:go_default_library",
 | 
					 | 
				
			||||||
        "//vendor/github.com/vmware/govmomi/vim25/types:go_default_library",
 | 
					 | 
				
			||||||
        "//vendor/golang.org/x/net/context:go_default_library",
 | 
					 | 
				
			||||||
        "//vendor/google.golang.org/api/googleapi:go_default_library",
 | 
					        "//vendor/google.golang.org/api/googleapi:go_default_library",
 | 
				
			||||||
        "//vendor/k8s.io/api/apps/v1beta1:go_default_library",
 | 
					        "//vendor/k8s.io/api/apps/v1beta1:go_default_library",
 | 
				
			||||||
        "//vendor/k8s.io/api/batch/v1:go_default_library",
 | 
					        "//vendor/k8s.io/api/batch/v1:go_default_library",
 | 
				
			||||||
        "//vendor/k8s.io/api/core/v1:go_default_library",
 | 
					        "//vendor/k8s.io/api/core/v1:go_default_library",
 | 
				
			||||||
        "//vendor/k8s.io/api/extensions/v1beta1:go_default_library",
 | 
					 | 
				
			||||||
        "//vendor/k8s.io/api/policy/v1beta1:go_default_library",
 | 
					        "//vendor/k8s.io/api/policy/v1beta1:go_default_library",
 | 
				
			||||||
        "//vendor/k8s.io/api/rbac/v1beta1:go_default_library",
 | 
					        "//vendor/k8s.io/api/rbac/v1beta1:go_default_library",
 | 
				
			||||||
        "//vendor/k8s.io/api/storage/v1:go_default_library",
 | 
					        "//vendor/k8s.io/api/storage/v1:go_default_library",
 | 
				
			||||||
@@ -101,6 +77,10 @@ filegroup(
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
filegroup(
 | 
					filegroup(
 | 
				
			||||||
    name = "all-srcs",
 | 
					    name = "all-srcs",
 | 
				
			||||||
    srcs = [":package-srcs"],
 | 
					    srcs = [
 | 
				
			||||||
 | 
					        ":package-srcs",
 | 
				
			||||||
 | 
					        "//test/e2e/storage/utils:all-srcs",
 | 
				
			||||||
 | 
					        "//test/e2e/storage/vsphere:all-srcs",
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
    tags = ["automanaged"],
 | 
					    tags = ["automanaged"],
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -30,6 +30,8 @@ import (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	. "github.com/onsi/ginkgo"
 | 
						. "github.com/onsi/ginkgo"
 | 
				
			||||||
	. "github.com/onsi/gomega"
 | 
						. "github.com/onsi/gomega"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"k8s.io/kubernetes/test/e2e/storage/utils"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const (
 | 
					const (
 | 
				
			||||||
@@ -51,7 +53,7 @@ const (
 | 
				
			|||||||
	wrappedVolumeRaceRCNamePrefix            = "wrapped-volume-race-"
 | 
						wrappedVolumeRaceRCNamePrefix            = "wrapped-volume-race-"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var _ = SIGDescribe("EmptyDir wrapper volumes", func() {
 | 
					var _ = utils.SIGDescribe("EmptyDir wrapper volumes", func() {
 | 
				
			||||||
	f := framework.NewDefaultFramework("emptydir-wrapper")
 | 
						f := framework.NewDefaultFramework("emptydir-wrapper")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	It("should not conflict", func() {
 | 
						It("should not conflict", func() {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -28,6 +28,7 @@ import (
 | 
				
			|||||||
	clientset "k8s.io/client-go/kubernetes"
 | 
						clientset "k8s.io/client-go/kubernetes"
 | 
				
			||||||
	"k8s.io/kubernetes/test/e2e/framework"
 | 
						"k8s.io/kubernetes/test/e2e/framework"
 | 
				
			||||||
	"k8s.io/kubernetes/test/e2e/generated"
 | 
						"k8s.io/kubernetes/test/e2e/generated"
 | 
				
			||||||
 | 
						"k8s.io/kubernetes/test/e2e/storage/utils"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const (
 | 
					const (
 | 
				
			||||||
@@ -136,7 +137,7 @@ func sshAndLog(cmd, host string) {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var _ = SIGDescribe("Flexvolumes [Disruptive] [Feature:FlexVolume]", func() {
 | 
					var _ = utils.SIGDescribe("Flexvolumes [Disruptive] [Feature:FlexVolume]", func() {
 | 
				
			||||||
	f := framework.NewDefaultFramework("flexvolume")
 | 
						f := framework.NewDefaultFramework("flexvolume")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// note that namespace deletion is handled by delete-namespace flag
 | 
						// note that namespace deletion is handled by delete-namespace flag
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -40,6 +40,7 @@ import (
 | 
				
			|||||||
	v1core "k8s.io/client-go/kubernetes/typed/core/v1"
 | 
						v1core "k8s.io/client-go/kubernetes/typed/core/v1"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/api/testapi"
 | 
						"k8s.io/kubernetes/pkg/api/testapi"
 | 
				
			||||||
	"k8s.io/kubernetes/test/e2e/framework"
 | 
						"k8s.io/kubernetes/test/e2e/framework"
 | 
				
			||||||
 | 
						"k8s.io/kubernetes/test/e2e/storage/utils"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const (
 | 
					const (
 | 
				
			||||||
@@ -52,7 +53,7 @@ const (
 | 
				
			|||||||
	minNodes            = 2
 | 
						minNodes            = 2
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var _ = SIGDescribe("Pod Disks", func() {
 | 
					var _ = utils.SIGDescribe("Pod Disks", func() {
 | 
				
			||||||
	var (
 | 
						var (
 | 
				
			||||||
		ns         string
 | 
							ns         string
 | 
				
			||||||
		cs         clientset.Interface
 | 
							cs         clientset.Interface
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -18,18 +18,17 @@ package storage
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
	"strings"
 | 
					 | 
				
			||||||
	"time"
 | 
						"time"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	. "github.com/onsi/ginkgo"
 | 
						. "github.com/onsi/ginkgo"
 | 
				
			||||||
	. "github.com/onsi/gomega"
 | 
						. "github.com/onsi/gomega"
 | 
				
			||||||
	"k8s.io/api/core/v1"
 | 
						"k8s.io/api/core/v1"
 | 
				
			||||||
	apierrs "k8s.io/apimachinery/pkg/api/errors"
 | 
					 | 
				
			||||||
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 | 
						metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 | 
				
			||||||
	"k8s.io/apimachinery/pkg/labels"
 | 
						"k8s.io/apimachinery/pkg/labels"
 | 
				
			||||||
	utilerrors "k8s.io/apimachinery/pkg/util/errors"
 | 
						utilerrors "k8s.io/apimachinery/pkg/util/errors"
 | 
				
			||||||
	clientset "k8s.io/client-go/kubernetes"
 | 
						clientset "k8s.io/client-go/kubernetes"
 | 
				
			||||||
	"k8s.io/kubernetes/test/e2e/framework"
 | 
						"k8s.io/kubernetes/test/e2e/framework"
 | 
				
			||||||
 | 
						"k8s.io/kubernetes/test/e2e/storage/utils"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type testBody func(c clientset.Interface, f *framework.Framework, clientPod *v1.Pod, pvc *v1.PersistentVolumeClaim, pv *v1.PersistentVolume)
 | 
					type testBody func(c clientset.Interface, f *framework.Framework, clientPod *v1.Pod, pvc *v1.PersistentVolumeClaim, pv *v1.PersistentVolume)
 | 
				
			||||||
@@ -37,17 +36,12 @@ type disruptiveTest struct {
 | 
				
			|||||||
	testItStmt string
 | 
						testItStmt string
 | 
				
			||||||
	runTest    testBody
 | 
						runTest    testBody
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
type kubeletOpt string
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
const (
 | 
					const (
 | 
				
			||||||
	MinNodes = 2
 | 
						MinNodes = 2
 | 
				
			||||||
	NodeStateTimeout            = 1 * time.Minute
 | 
					 | 
				
			||||||
	kStart           kubeletOpt = "start"
 | 
					 | 
				
			||||||
	kStop            kubeletOpt = "stop"
 | 
					 | 
				
			||||||
	kRestart         kubeletOpt = "restart"
 | 
					 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var _ = SIGDescribe("PersistentVolumes[Disruptive][Flaky]", func() {
 | 
					var _ = utils.SIGDescribe("PersistentVolumes[Disruptive][Flaky]", func() {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	f := framework.NewDefaultFramework("disruptive-pv")
 | 
						f := framework.NewDefaultFramework("disruptive-pv")
 | 
				
			||||||
	var (
 | 
						var (
 | 
				
			||||||
@@ -223,11 +217,11 @@ var _ = SIGDescribe("PersistentVolumes[Disruptive][Flaky]", func() {
 | 
				
			|||||||
		disruptiveTestTable := []disruptiveTest{
 | 
							disruptiveTestTable := []disruptiveTest{
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
				testItStmt: "Should test that a file written to the mount before kubelet restart is readable after restart.",
 | 
									testItStmt: "Should test that a file written to the mount before kubelet restart is readable after restart.",
 | 
				
			||||||
				runTest:    testKubeletRestartsAndRestoresMount,
 | 
									runTest:    utils.TestKubeletRestartsAndRestoresMount,
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
				testItStmt: "Should test that a volume mounted to a pod that is deleted while the kubelet is down unmounts when the kubelet returns.",
 | 
									testItStmt: "Should test that a volume mounted to a pod that is deleted while the kubelet is down unmounts when the kubelet returns.",
 | 
				
			||||||
				runTest:    testVolumeUnmountsFromDeletedPod,
 | 
									runTest:    utils.TestVolumeUnmountsFromDeletedPod,
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -243,61 +237,6 @@ var _ = SIGDescribe("PersistentVolumes[Disruptive][Flaky]", func() {
 | 
				
			|||||||
	})
 | 
						})
 | 
				
			||||||
})
 | 
					})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// testKubeletRestartsAndRestoresMount tests that a volume mounted to a pod remains mounted after a kubelet restarts
 | 
					 | 
				
			||||||
func testKubeletRestartsAndRestoresMount(c clientset.Interface, f *framework.Framework, clientPod *v1.Pod, pvc *v1.PersistentVolumeClaim, pv *v1.PersistentVolume) {
 | 
					 | 
				
			||||||
	By("Writing to the volume.")
 | 
					 | 
				
			||||||
	file := "/mnt/_SUCCESS"
 | 
					 | 
				
			||||||
	out, err := podExec(clientPod, fmt.Sprintf("touch %s", file))
 | 
					 | 
				
			||||||
	framework.Logf(out)
 | 
					 | 
				
			||||||
	Expect(err).NotTo(HaveOccurred())
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	By("Restarting kubelet")
 | 
					 | 
				
			||||||
	kubeletCommand(kRestart, c, clientPod)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	By("Testing that written file is accessible.")
 | 
					 | 
				
			||||||
	out, err = podExec(clientPod, fmt.Sprintf("cat %s", file))
 | 
					 | 
				
			||||||
	framework.Logf(out)
 | 
					 | 
				
			||||||
	Expect(err).NotTo(HaveOccurred())
 | 
					 | 
				
			||||||
	framework.Logf("Volume mount detected on pod %s and written file %s is readable post-restart.", clientPod.Name, file)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// testVolumeUnmountsFromDeletedPod tests that a volume unmounts if the client pod was deleted while the kubelet was down.
 | 
					 | 
				
			||||||
func testVolumeUnmountsFromDeletedPod(c clientset.Interface, f *framework.Framework, clientPod *v1.Pod, pvc *v1.PersistentVolumeClaim, pv *v1.PersistentVolume) {
 | 
					 | 
				
			||||||
	nodeIP, err := framework.GetHostExternalAddress(c, clientPod)
 | 
					 | 
				
			||||||
	Expect(err).NotTo(HaveOccurred())
 | 
					 | 
				
			||||||
	nodeIP = nodeIP + ":22"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	By("Expecting the volume mount to be found.")
 | 
					 | 
				
			||||||
	result, err := framework.SSH(fmt.Sprintf("mount | grep %s", clientPod.UID), nodeIP, framework.TestContext.Provider)
 | 
					 | 
				
			||||||
	framework.LogSSHResult(result)
 | 
					 | 
				
			||||||
	Expect(err).NotTo(HaveOccurred(), "Encountered SSH error.")
 | 
					 | 
				
			||||||
	Expect(result.Code).To(BeZero(), fmt.Sprintf("Expected grep exit code of 0, got %d", result.Code))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	By("Stopping the kubelet.")
 | 
					 | 
				
			||||||
	kubeletCommand(kStop, c, clientPod)
 | 
					 | 
				
			||||||
	defer func() {
 | 
					 | 
				
			||||||
		if err != nil {
 | 
					 | 
				
			||||||
			kubeletCommand(kStart, c, clientPod)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}()
 | 
					 | 
				
			||||||
	By(fmt.Sprintf("Deleting Pod %q", clientPod.Name))
 | 
					 | 
				
			||||||
	err = c.CoreV1().Pods(clientPod.Namespace).Delete(clientPod.Name, &metav1.DeleteOptions{})
 | 
					 | 
				
			||||||
	Expect(err).NotTo(HaveOccurred())
 | 
					 | 
				
			||||||
	By("Starting the kubelet and waiting for pod to delete.")
 | 
					 | 
				
			||||||
	kubeletCommand(kStart, c, clientPod)
 | 
					 | 
				
			||||||
	err = f.WaitForPodTerminated(clientPod.Name, "")
 | 
					 | 
				
			||||||
	if !apierrs.IsNotFound(err) && err != nil {
 | 
					 | 
				
			||||||
		Expect(err).NotTo(HaveOccurred(), "Expected pod to terminate.")
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	By("Expecting the volume mount not to be found.")
 | 
					 | 
				
			||||||
	result, err = framework.SSH(fmt.Sprintf("mount | grep %s", clientPod.UID), nodeIP, framework.TestContext.Provider)
 | 
					 | 
				
			||||||
	framework.LogSSHResult(result)
 | 
					 | 
				
			||||||
	Expect(err).NotTo(HaveOccurred(), "Encountered SSH error.")
 | 
					 | 
				
			||||||
	Expect(result.Stdout).To(BeEmpty(), "Expected grep stdout to be empty (i.e. no mount found).")
 | 
					 | 
				
			||||||
	framework.Logf("Volume unmounted on node %s", clientPod.Spec.NodeName)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// initTestCase initializes spec resources (pv, pvc, and pod) and returns pointers to be consumed
 | 
					// initTestCase initializes spec resources (pv, pvc, and pod) and returns pointers to be consumed
 | 
				
			||||||
// by the test.
 | 
					// by the test.
 | 
				
			||||||
func initTestCase(f *framework.Framework, c clientset.Interface, pvConfig framework.PersistentVolumeConfig, pvcConfig framework.PersistentVolumeClaimConfig, ns, nodeName string) (*v1.Pod, *v1.PersistentVolume, *v1.PersistentVolumeClaim) {
 | 
					func initTestCase(f *framework.Framework, c clientset.Interface, pvConfig framework.PersistentVolumeConfig, pvcConfig framework.PersistentVolumeClaimConfig, ns, nodeName string) (*v1.Pod, *v1.PersistentVolume, *v1.PersistentVolumeClaim) {
 | 
				
			||||||
@@ -339,101 +278,3 @@ func tearDownTestCase(c clientset.Interface, f *framework.Framework, ns string,
 | 
				
			|||||||
	framework.DeletePersistentVolumeClaim(c, pvc.Name, ns)
 | 
						framework.DeletePersistentVolumeClaim(c, pvc.Name, ns)
 | 
				
			||||||
	framework.DeletePersistentVolume(c, pv.Name)
 | 
						framework.DeletePersistentVolume(c, pv.Name)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					 | 
				
			||||||
// kubeletCommand performs `start`, `restart`, or `stop` on the kubelet running on the node of the target pod and waits
 | 
					 | 
				
			||||||
// for the desired statues..
 | 
					 | 
				
			||||||
// - First issues the command via `systemctl`
 | 
					 | 
				
			||||||
// - If `systemctl` returns stderr "command not found, issues the command via `service`
 | 
					 | 
				
			||||||
// - If `service` also returns stderr "command not found", the test is aborted.
 | 
					 | 
				
			||||||
// Allowed kubeletOps are `kStart`, `kStop`, and `kRestart`
 | 
					 | 
				
			||||||
func kubeletCommand(kOp kubeletOpt, c clientset.Interface, pod *v1.Pod) {
 | 
					 | 
				
			||||||
	command := ""
 | 
					 | 
				
			||||||
	sudoPresent := false
 | 
					 | 
				
			||||||
	systemctlPresent := false
 | 
					 | 
				
			||||||
	kubeletPid := ""
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	nodeIP, err := framework.GetHostExternalAddress(c, pod)
 | 
					 | 
				
			||||||
	Expect(err).NotTo(HaveOccurred())
 | 
					 | 
				
			||||||
	nodeIP = nodeIP + ":22"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	framework.Logf("Checking if sudo command is present")
 | 
					 | 
				
			||||||
	sshResult, err := framework.SSH("sudo --version", nodeIP, framework.TestContext.Provider)
 | 
					 | 
				
			||||||
	Expect(err).NotTo(HaveOccurred(), fmt.Sprintf("SSH to Node %q errored.", pod.Spec.NodeName))
 | 
					 | 
				
			||||||
	if !strings.Contains(sshResult.Stderr, "command not found") {
 | 
					 | 
				
			||||||
		sudoPresent = true
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	framework.Logf("Checking if systemctl command is present")
 | 
					 | 
				
			||||||
	sshResult, err = framework.SSH("systemctl --version", nodeIP, framework.TestContext.Provider)
 | 
					 | 
				
			||||||
	Expect(err).NotTo(HaveOccurred(), fmt.Sprintf("SSH to Node %q errored.", pod.Spec.NodeName))
 | 
					 | 
				
			||||||
	if !strings.Contains(sshResult.Stderr, "command not found") {
 | 
					 | 
				
			||||||
		command = fmt.Sprintf("systemctl %s kubelet", string(kOp))
 | 
					 | 
				
			||||||
		systemctlPresent = true
 | 
					 | 
				
			||||||
	} else {
 | 
					 | 
				
			||||||
		command = fmt.Sprintf("service kubelet %s", string(kOp))
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if sudoPresent {
 | 
					 | 
				
			||||||
		command = fmt.Sprintf("sudo %s", command)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if kOp == kRestart {
 | 
					 | 
				
			||||||
		kubeletPid = getKubeletMainPid(nodeIP, sudoPresent, systemctlPresent)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	framework.Logf("Attempting `%s`", command)
 | 
					 | 
				
			||||||
	sshResult, err = framework.SSH(command, nodeIP, framework.TestContext.Provider)
 | 
					 | 
				
			||||||
	Expect(err).NotTo(HaveOccurred(), fmt.Sprintf("SSH to Node %q errored.", pod.Spec.NodeName))
 | 
					 | 
				
			||||||
	framework.LogSSHResult(sshResult)
 | 
					 | 
				
			||||||
	Expect(sshResult.Code).To(BeZero(), "Failed to [%s] kubelet:\n%#v", string(kOp), sshResult)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if kOp == kStop {
 | 
					 | 
				
			||||||
		if ok := framework.WaitForNodeToBeNotReady(c, pod.Spec.NodeName, NodeStateTimeout); !ok {
 | 
					 | 
				
			||||||
			framework.Failf("Node %s failed to enter NotReady state", pod.Spec.NodeName)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if kOp == kRestart {
 | 
					 | 
				
			||||||
		// Wait for a minute to check if kubelet Pid is getting changed
 | 
					 | 
				
			||||||
		isPidChanged := false
 | 
					 | 
				
			||||||
		for start := time.Now(); time.Since(start) < 1*time.Minute; time.Sleep(2 * time.Second) {
 | 
					 | 
				
			||||||
			kubeletPidAfterRestart := getKubeletMainPid(nodeIP, sudoPresent, systemctlPresent)
 | 
					 | 
				
			||||||
			if kubeletPid != kubeletPidAfterRestart {
 | 
					 | 
				
			||||||
				isPidChanged = true
 | 
					 | 
				
			||||||
				break
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		Expect(isPidChanged).To(BeTrue(), "Kubelet PID remained unchanged after restarting Kubelet")
 | 
					 | 
				
			||||||
		framework.Logf("Noticed that kubelet PID is changed. Waiting for 30 Seconds for Kubelet to come back")
 | 
					 | 
				
			||||||
		time.Sleep(30 * time.Second)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if kOp == kStart || kOp == kRestart {
 | 
					 | 
				
			||||||
		// For kubelet start and restart operations, Wait until Node becomes Ready
 | 
					 | 
				
			||||||
		if ok := framework.WaitForNodeToBeReady(c, pod.Spec.NodeName, NodeStateTimeout); !ok {
 | 
					 | 
				
			||||||
			framework.Failf("Node %s failed to enter Ready state", pod.Spec.NodeName)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// return the Main PID of the Kubelet Process
 | 
					 | 
				
			||||||
func getKubeletMainPid(nodeIP string, sudoPresent bool, systemctlPresent bool) string {
 | 
					 | 
				
			||||||
	command := ""
 | 
					 | 
				
			||||||
	if systemctlPresent {
 | 
					 | 
				
			||||||
		command = "systemctl status kubelet | grep 'Main PID'"
 | 
					 | 
				
			||||||
	} else {
 | 
					 | 
				
			||||||
		command = "service kubelet status | grep 'Main PID'"
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if sudoPresent {
 | 
					 | 
				
			||||||
		command = fmt.Sprintf("sudo %s", command)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	framework.Logf("Attempting `%s`", command)
 | 
					 | 
				
			||||||
	sshResult, err := framework.SSH(command, nodeIP, framework.TestContext.Provider)
 | 
					 | 
				
			||||||
	Expect(err).NotTo(HaveOccurred(), fmt.Sprintf("SSH to Node %q errored.", nodeIP))
 | 
					 | 
				
			||||||
	framework.LogSSHResult(sshResult)
 | 
					 | 
				
			||||||
	Expect(sshResult.Code).To(BeZero(), "Failed to get kubelet PID")
 | 
					 | 
				
			||||||
	Expect(sshResult.Stdout).NotTo(BeEmpty(), "Kubelet Main PID should not be Empty")
 | 
					 | 
				
			||||||
	return sshResult.Stdout
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// podExec wraps RunKubectl to execute a bash cmd in target pod
 | 
					 | 
				
			||||||
func podExec(pod *v1.Pod, bashExec string) (string, error) {
 | 
					 | 
				
			||||||
	return framework.RunKubectl("exec", fmt.Sprintf("--namespace=%s", pod.Namespace), pod.Name, "--", "/bin/sh", "-c", bashExec)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 
 | 
				
			|||||||
@@ -26,6 +26,7 @@ import (
 | 
				
			|||||||
	utilerrors "k8s.io/apimachinery/pkg/util/errors"
 | 
						utilerrors "k8s.io/apimachinery/pkg/util/errors"
 | 
				
			||||||
	clientset "k8s.io/client-go/kubernetes"
 | 
						clientset "k8s.io/client-go/kubernetes"
 | 
				
			||||||
	"k8s.io/kubernetes/test/e2e/framework"
 | 
						"k8s.io/kubernetes/test/e2e/framework"
 | 
				
			||||||
 | 
						"k8s.io/kubernetes/test/e2e/storage/utils"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// verifyGCEDiskAttached performs a sanity check to verify the PD attached to the node
 | 
					// verifyGCEDiskAttached performs a sanity check to verify the PD attached to the node
 | 
				
			||||||
@@ -51,7 +52,7 @@ func initializeGCETestSpec(c clientset.Interface, ns string, pvConfig framework.
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Testing configurations of single a PV/PVC pair attached to a GCE PD
 | 
					// Testing configurations of single a PV/PVC pair attached to a GCE PD
 | 
				
			||||||
var _ = SIGDescribe("PersistentVolumes GCEPD", func() {
 | 
					var _ = utils.SIGDescribe("PersistentVolumes GCEPD", func() {
 | 
				
			||||||
	var (
 | 
						var (
 | 
				
			||||||
		c         clientset.Interface
 | 
							c         clientset.Interface
 | 
				
			||||||
		diskName  string
 | 
							diskName  string
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -44,6 +44,7 @@ import (
 | 
				
			|||||||
	"k8s.io/apimachinery/pkg/util/wait"
 | 
						"k8s.io/apimachinery/pkg/util/wait"
 | 
				
			||||||
	clientset "k8s.io/client-go/kubernetes"
 | 
						clientset "k8s.io/client-go/kubernetes"
 | 
				
			||||||
	"k8s.io/kubernetes/test/e2e/framework"
 | 
						"k8s.io/kubernetes/test/e2e/framework"
 | 
				
			||||||
 | 
						"k8s.io/kubernetes/test/e2e/storage/utils"
 | 
				
			||||||
	imageutils "k8s.io/kubernetes/test/utils/image"
 | 
						imageutils "k8s.io/kubernetes/test/utils/image"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -138,7 +139,7 @@ var (
 | 
				
			|||||||
		Level: "s0:c0,c1"}
 | 
							Level: "s0:c0,c1"}
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var _ = SIGDescribe("PersistentVolumes-local [Feature:LocalPersistentVolumes] [Serial]", func() {
 | 
					var _ = utils.SIGDescribe("PersistentVolumes-local [Feature:LocalPersistentVolumes] [Serial]", func() {
 | 
				
			||||||
	f := framework.NewDefaultFramework("persistent-local-volumes-test")
 | 
						f := framework.NewDefaultFramework("persistent-local-volumes-test")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var (
 | 
						var (
 | 
				
			||||||
@@ -835,7 +836,7 @@ func createFileDoesntExistCmd(testFileDir string, testFile string) string {
 | 
				
			|||||||
// Execute a read or write command in a pod.
 | 
					// Execute a read or write command in a pod.
 | 
				
			||||||
// Fail on error
 | 
					// Fail on error
 | 
				
			||||||
func podRWCmdExec(pod *v1.Pod, cmd string) string {
 | 
					func podRWCmdExec(pod *v1.Pod, cmd string) string {
 | 
				
			||||||
	out, err := podExec(pod, cmd)
 | 
						out, err := utils.PodExec(pod, cmd)
 | 
				
			||||||
	Expect(err).NotTo(HaveOccurred())
 | 
						Expect(err).NotTo(HaveOccurred())
 | 
				
			||||||
	return out
 | 
						return out
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -29,6 +29,7 @@ import (
 | 
				
			|||||||
	utilerrors "k8s.io/apimachinery/pkg/util/errors"
 | 
						utilerrors "k8s.io/apimachinery/pkg/util/errors"
 | 
				
			||||||
	clientset "k8s.io/client-go/kubernetes"
 | 
						clientset "k8s.io/client-go/kubernetes"
 | 
				
			||||||
	"k8s.io/kubernetes/test/e2e/framework"
 | 
						"k8s.io/kubernetes/test/e2e/framework"
 | 
				
			||||||
 | 
						"k8s.io/kubernetes/test/e2e/storage/utils"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Validate PV/PVC, create and verify writer pod, delete the PVC, and validate the PV's
 | 
					// Validate PV/PVC, create and verify writer pod, delete the PVC, and validate the PV's
 | 
				
			||||||
@@ -85,7 +86,7 @@ func completeMultiTest(f *framework.Framework, c clientset.Interface, ns string,
 | 
				
			|||||||
	return nil
 | 
						return nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var _ = SIGDescribe("PersistentVolumes", func() {
 | 
					var _ = utils.SIGDescribe("PersistentVolumes", func() {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// global vars for the Context()s and It()'s below
 | 
						// global vars for the Context()s and It()'s below
 | 
				
			||||||
	f := framework.NewDefaultFramework("pv")
 | 
						f := framework.NewDefaultFramework("pv")
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -30,9 +30,10 @@ import (
 | 
				
			|||||||
	"k8s.io/kubernetes/pkg/util/slice"
 | 
						"k8s.io/kubernetes/pkg/util/slice"
 | 
				
			||||||
	volumeutil "k8s.io/kubernetes/pkg/volume/util"
 | 
						volumeutil "k8s.io/kubernetes/pkg/volume/util"
 | 
				
			||||||
	"k8s.io/kubernetes/test/e2e/framework"
 | 
						"k8s.io/kubernetes/test/e2e/framework"
 | 
				
			||||||
 | 
						"k8s.io/kubernetes/test/e2e/storage/utils"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var _ = SIGDescribe("PVC Protection [Feature:PVCProtection]", func() {
 | 
					var _ = utils.SIGDescribe("PVC Protection [Feature:PVCProtection]", func() {
 | 
				
			||||||
	var (
 | 
						var (
 | 
				
			||||||
		client                  clientset.Interface
 | 
							client                  clientset.Interface
 | 
				
			||||||
		nameSpace               string
 | 
							nameSpace               string
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										37
									
								
								test/e2e/storage/utils/BUILD
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								test/e2e/storage/utils/BUILD
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,37 @@
 | 
				
			|||||||
 | 
					package(default_visibility = ["//visibility:public"])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					load(
 | 
				
			||||||
 | 
					    "@io_bazel_rules_go//go:def.bzl",
 | 
				
			||||||
 | 
					    "go_library",
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					go_library(
 | 
				
			||||||
 | 
					    name = "go_default_library",
 | 
				
			||||||
 | 
					    srcs = [
 | 
				
			||||||
 | 
					        "framework.go",
 | 
				
			||||||
 | 
					        "utils.go",
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    importpath = "k8s.io/kubernetes/test/e2e/storage/utils",
 | 
				
			||||||
 | 
					    deps = [
 | 
				
			||||||
 | 
					        "//test/e2e/framework:go_default_library",
 | 
				
			||||||
 | 
					        "//vendor/github.com/onsi/ginkgo:go_default_library",
 | 
				
			||||||
 | 
					        "//vendor/github.com/onsi/gomega:go_default_library",
 | 
				
			||||||
 | 
					        "//vendor/k8s.io/api/core/v1:go_default_library",
 | 
				
			||||||
 | 
					        "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library",
 | 
				
			||||||
 | 
					        "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
 | 
				
			||||||
 | 
					        "//vendor/k8s.io/client-go/kubernetes:go_default_library",
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					filegroup(
 | 
				
			||||||
 | 
					    name = "package-srcs",
 | 
				
			||||||
 | 
					    srcs = glob(["**"]),
 | 
				
			||||||
 | 
					    tags = ["automanaged"],
 | 
				
			||||||
 | 
					    visibility = ["//visibility:private"],
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					filegroup(
 | 
				
			||||||
 | 
					    name = "all-srcs",
 | 
				
			||||||
 | 
					    srcs = [":package-srcs"],
 | 
				
			||||||
 | 
					    tags = ["automanaged"],
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
@@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
 | 
				
			|||||||
limitations under the License.
 | 
					limitations under the License.
 | 
				
			||||||
*/
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package storage
 | 
					package utils
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import "github.com/onsi/ginkgo"
 | 
					import "github.com/onsi/ginkgo"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										240
									
								
								test/e2e/storage/utils/utils.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										240
									
								
								test/e2e/storage/utils/utils.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,240 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					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 utils
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"fmt"
 | 
				
			||||||
 | 
						"strings"
 | 
				
			||||||
 | 
						"time"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						. "github.com/onsi/ginkgo"
 | 
				
			||||||
 | 
						. "github.com/onsi/gomega"
 | 
				
			||||||
 | 
						"k8s.io/api/core/v1"
 | 
				
			||||||
 | 
						apierrs "k8s.io/apimachinery/pkg/api/errors"
 | 
				
			||||||
 | 
						metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 | 
				
			||||||
 | 
						clientset "k8s.io/client-go/kubernetes"
 | 
				
			||||||
 | 
						"k8s.io/kubernetes/test/e2e/framework"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type KubeletOpt string
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const (
 | 
				
			||||||
 | 
						NodeStateTimeout            = 1 * time.Minute
 | 
				
			||||||
 | 
						KStart           KubeletOpt = "start"
 | 
				
			||||||
 | 
						KStop            KubeletOpt = "stop"
 | 
				
			||||||
 | 
						KRestart         KubeletOpt = "restart"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// PodExec wraps RunKubectl to execute a bash cmd in target pod
 | 
				
			||||||
 | 
					func PodExec(pod *v1.Pod, bashExec string) (string, error) {
 | 
				
			||||||
 | 
						return framework.RunKubectl("exec", fmt.Sprintf("--namespace=%s", pod.Namespace), pod.Name, "--", "/bin/sh", "-c", bashExec)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// KubeletCommand performs `start`, `restart`, or `stop` on the kubelet running on the node of the target pod and waits
 | 
				
			||||||
 | 
					// for the desired statues..
 | 
				
			||||||
 | 
					// - First issues the command via `systemctl`
 | 
				
			||||||
 | 
					// - If `systemctl` returns stderr "command not found, issues the command via `service`
 | 
				
			||||||
 | 
					// - If `service` also returns stderr "command not found", the test is aborted.
 | 
				
			||||||
 | 
					// Allowed kubeletOps are `KStart`, `KStop`, and `KRestart`
 | 
				
			||||||
 | 
					func KubeletCommand(kOp KubeletOpt, c clientset.Interface, pod *v1.Pod) {
 | 
				
			||||||
 | 
						command := ""
 | 
				
			||||||
 | 
						sudoPresent := false
 | 
				
			||||||
 | 
						systemctlPresent := false
 | 
				
			||||||
 | 
						kubeletPid := ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						nodeIP, err := framework.GetHostExternalAddress(c, pod)
 | 
				
			||||||
 | 
						Expect(err).NotTo(HaveOccurred())
 | 
				
			||||||
 | 
						nodeIP = nodeIP + ":22"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						framework.Logf("Checking if sudo command is present")
 | 
				
			||||||
 | 
						sshResult, err := framework.SSH("sudo --version", nodeIP, framework.TestContext.Provider)
 | 
				
			||||||
 | 
						Expect(err).NotTo(HaveOccurred(), fmt.Sprintf("SSH to Node %q errored.", pod.Spec.NodeName))
 | 
				
			||||||
 | 
						if !strings.Contains(sshResult.Stderr, "command not found") {
 | 
				
			||||||
 | 
							sudoPresent = true
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						framework.Logf("Checking if systemctl command is present")
 | 
				
			||||||
 | 
						sshResult, err = framework.SSH("systemctl --version", nodeIP, framework.TestContext.Provider)
 | 
				
			||||||
 | 
						Expect(err).NotTo(HaveOccurred(), fmt.Sprintf("SSH to Node %q errored.", pod.Spec.NodeName))
 | 
				
			||||||
 | 
						if !strings.Contains(sshResult.Stderr, "command not found") {
 | 
				
			||||||
 | 
							command = fmt.Sprintf("systemctl %s kubelet", string(kOp))
 | 
				
			||||||
 | 
							systemctlPresent = true
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							command = fmt.Sprintf("service kubelet %s", string(kOp))
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if sudoPresent {
 | 
				
			||||||
 | 
							command = fmt.Sprintf("sudo %s", command)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if kOp == KRestart {
 | 
				
			||||||
 | 
							kubeletPid = getKubeletMainPid(nodeIP, sudoPresent, systemctlPresent)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						framework.Logf("Attempting `%s`", command)
 | 
				
			||||||
 | 
						sshResult, err = framework.SSH(command, nodeIP, framework.TestContext.Provider)
 | 
				
			||||||
 | 
						Expect(err).NotTo(HaveOccurred(), fmt.Sprintf("SSH to Node %q errored.", pod.Spec.NodeName))
 | 
				
			||||||
 | 
						framework.LogSSHResult(sshResult)
 | 
				
			||||||
 | 
						Expect(sshResult.Code).To(BeZero(), "Failed to [%s] kubelet:\n%#v", string(kOp), sshResult)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if kOp == KStop {
 | 
				
			||||||
 | 
							if ok := framework.WaitForNodeToBeNotReady(c, pod.Spec.NodeName, NodeStateTimeout); !ok {
 | 
				
			||||||
 | 
								framework.Failf("Node %s failed to enter NotReady state", pod.Spec.NodeName)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if kOp == KRestart {
 | 
				
			||||||
 | 
							// Wait for a minute to check if kubelet Pid is getting changed
 | 
				
			||||||
 | 
							isPidChanged := false
 | 
				
			||||||
 | 
							for start := time.Now(); time.Since(start) < 1*time.Minute; time.Sleep(2 * time.Second) {
 | 
				
			||||||
 | 
								kubeletPidAfterRestart := getKubeletMainPid(nodeIP, sudoPresent, systemctlPresent)
 | 
				
			||||||
 | 
								if kubeletPid != kubeletPidAfterRestart {
 | 
				
			||||||
 | 
									isPidChanged = true
 | 
				
			||||||
 | 
									break
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							Expect(isPidChanged).To(BeTrue(), "Kubelet PID remained unchanged after restarting Kubelet")
 | 
				
			||||||
 | 
							framework.Logf("Noticed that kubelet PID is changed. Waiting for 30 Seconds for Kubelet to come back")
 | 
				
			||||||
 | 
							time.Sleep(30 * time.Second)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if kOp == KStart || kOp == KRestart {
 | 
				
			||||||
 | 
							// For kubelet start and restart operations, Wait until Node becomes Ready
 | 
				
			||||||
 | 
							if ok := framework.WaitForNodeToBeReady(c, pod.Spec.NodeName, NodeStateTimeout); !ok {
 | 
				
			||||||
 | 
								framework.Failf("Node %s failed to enter Ready state", pod.Spec.NodeName)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// getKubeletMainPid return the Main PID of the Kubelet Process
 | 
				
			||||||
 | 
					func getKubeletMainPid(nodeIP string, sudoPresent bool, systemctlPresent bool) string {
 | 
				
			||||||
 | 
						command := ""
 | 
				
			||||||
 | 
						if systemctlPresent {
 | 
				
			||||||
 | 
							command = "systemctl status kubelet | grep 'Main PID'"
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							command = "service kubelet status | grep 'Main PID'"
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if sudoPresent {
 | 
				
			||||||
 | 
							command = fmt.Sprintf("sudo %s", command)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						framework.Logf("Attempting `%s`", command)
 | 
				
			||||||
 | 
						sshResult, err := framework.SSH(command, nodeIP, framework.TestContext.Provider)
 | 
				
			||||||
 | 
						Expect(err).NotTo(HaveOccurred(), fmt.Sprintf("SSH to Node %q errored.", nodeIP))
 | 
				
			||||||
 | 
						framework.LogSSHResult(sshResult)
 | 
				
			||||||
 | 
						Expect(sshResult.Code).To(BeZero(), "Failed to get kubelet PID")
 | 
				
			||||||
 | 
						Expect(sshResult.Stdout).NotTo(BeEmpty(), "Kubelet Main PID should not be Empty")
 | 
				
			||||||
 | 
						return sshResult.Stdout
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// TestKubeletRestartsAndRestoresMount tests that a volume mounted to a pod remains mounted after a kubelet restarts
 | 
				
			||||||
 | 
					func TestKubeletRestartsAndRestoresMount(c clientset.Interface, f *framework.Framework, clientPod *v1.Pod, pvc *v1.PersistentVolumeClaim, pv *v1.PersistentVolume) {
 | 
				
			||||||
 | 
						By("Writing to the volume.")
 | 
				
			||||||
 | 
						file := "/mnt/_SUCCESS"
 | 
				
			||||||
 | 
						out, err := PodExec(clientPod, fmt.Sprintf("touch %s", file))
 | 
				
			||||||
 | 
						framework.Logf(out)
 | 
				
			||||||
 | 
						Expect(err).NotTo(HaveOccurred())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						By("Restarting kubelet")
 | 
				
			||||||
 | 
						KubeletCommand(KRestart, c, clientPod)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						By("Testing that written file is accessible.")
 | 
				
			||||||
 | 
						out, err = PodExec(clientPod, fmt.Sprintf("cat %s", file))
 | 
				
			||||||
 | 
						framework.Logf(out)
 | 
				
			||||||
 | 
						Expect(err).NotTo(HaveOccurred())
 | 
				
			||||||
 | 
						framework.Logf("Volume mount detected on pod %s and written file %s is readable post-restart.", clientPod.Name, file)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// TestVolumeUnmountsFromDeletedPod tests that a volume unmounts if the client pod was deleted while the kubelet was down.
 | 
				
			||||||
 | 
					func TestVolumeUnmountsFromDeletedPod(c clientset.Interface, f *framework.Framework, clientPod *v1.Pod, pvc *v1.PersistentVolumeClaim, pv *v1.PersistentVolume) {
 | 
				
			||||||
 | 
						nodeIP, err := framework.GetHostExternalAddress(c, clientPod)
 | 
				
			||||||
 | 
						Expect(err).NotTo(HaveOccurred())
 | 
				
			||||||
 | 
						nodeIP = nodeIP + ":22"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						By("Expecting the volume mount to be found.")
 | 
				
			||||||
 | 
						result, err := framework.SSH(fmt.Sprintf("mount | grep %s", clientPod.UID), nodeIP, framework.TestContext.Provider)
 | 
				
			||||||
 | 
						framework.LogSSHResult(result)
 | 
				
			||||||
 | 
						Expect(err).NotTo(HaveOccurred(), "Encountered SSH error.")
 | 
				
			||||||
 | 
						Expect(result.Code).To(BeZero(), fmt.Sprintf("Expected grep exit code of 0, got %d", result.Code))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						By("Stopping the kubelet.")
 | 
				
			||||||
 | 
						KubeletCommand(KStop, c, clientPod)
 | 
				
			||||||
 | 
						defer func() {
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								KubeletCommand(KStart, c, clientPod)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}()
 | 
				
			||||||
 | 
						By(fmt.Sprintf("Deleting Pod %q", clientPod.Name))
 | 
				
			||||||
 | 
						err = c.CoreV1().Pods(clientPod.Namespace).Delete(clientPod.Name, &metav1.DeleteOptions{})
 | 
				
			||||||
 | 
						Expect(err).NotTo(HaveOccurred())
 | 
				
			||||||
 | 
						By("Starting the kubelet and waiting for pod to delete.")
 | 
				
			||||||
 | 
						KubeletCommand(KStart, c, clientPod)
 | 
				
			||||||
 | 
						err = f.WaitForPodTerminated(clientPod.Name, "")
 | 
				
			||||||
 | 
						if !apierrs.IsNotFound(err) && err != nil {
 | 
				
			||||||
 | 
							Expect(err).NotTo(HaveOccurred(), "Expected pod to terminate.")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						By("Expecting the volume mount not to be found.")
 | 
				
			||||||
 | 
						result, err = framework.SSH(fmt.Sprintf("mount | grep %s", clientPod.UID), nodeIP, framework.TestContext.Provider)
 | 
				
			||||||
 | 
						framework.LogSSHResult(result)
 | 
				
			||||||
 | 
						Expect(err).NotTo(HaveOccurred(), "Encountered SSH error.")
 | 
				
			||||||
 | 
						Expect(result.Stdout).To(BeEmpty(), "Expected grep stdout to be empty (i.e. no mount found).")
 | 
				
			||||||
 | 
						framework.Logf("Volume unmounted on node %s", clientPod.Spec.NodeName)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// RunInPodWithVolume runs a command in a pod with given claim mounted to /mnt directory.
 | 
				
			||||||
 | 
					func RunInPodWithVolume(c clientset.Interface, ns, claimName, command string) {
 | 
				
			||||||
 | 
						pod := &v1.Pod{
 | 
				
			||||||
 | 
							TypeMeta: metav1.TypeMeta{
 | 
				
			||||||
 | 
								Kind:       "Pod",
 | 
				
			||||||
 | 
								APIVersion: "v1",
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							ObjectMeta: metav1.ObjectMeta{
 | 
				
			||||||
 | 
								GenerateName: "pvc-volume-tester-",
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							Spec: v1.PodSpec{
 | 
				
			||||||
 | 
								Containers: []v1.Container{
 | 
				
			||||||
 | 
									{
 | 
				
			||||||
 | 
										Name:    "volume-tester",
 | 
				
			||||||
 | 
										Image:   "busybox",
 | 
				
			||||||
 | 
										Command: []string{"/bin/sh"},
 | 
				
			||||||
 | 
										Args:    []string{"-c", command},
 | 
				
			||||||
 | 
										VolumeMounts: []v1.VolumeMount{
 | 
				
			||||||
 | 
											{
 | 
				
			||||||
 | 
												Name:      "my-volume",
 | 
				
			||||||
 | 
												MountPath: "/mnt/test",
 | 
				
			||||||
 | 
											},
 | 
				
			||||||
 | 
										},
 | 
				
			||||||
 | 
									},
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
								RestartPolicy: v1.RestartPolicyNever,
 | 
				
			||||||
 | 
								Volumes: []v1.Volume{
 | 
				
			||||||
 | 
									{
 | 
				
			||||||
 | 
										Name: "my-volume",
 | 
				
			||||||
 | 
										VolumeSource: v1.VolumeSource{
 | 
				
			||||||
 | 
											PersistentVolumeClaim: &v1.PersistentVolumeClaimVolumeSource{
 | 
				
			||||||
 | 
												ClaimName: claimName,
 | 
				
			||||||
 | 
												ReadOnly:  false,
 | 
				
			||||||
 | 
											},
 | 
				
			||||||
 | 
										},
 | 
				
			||||||
 | 
									},
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						pod, err := c.CoreV1().Pods(ns).Create(pod)
 | 
				
			||||||
 | 
						framework.ExpectNoError(err, "Failed to create pod: %v", err)
 | 
				
			||||||
 | 
						defer func() {
 | 
				
			||||||
 | 
							framework.DeletePodOrFail(c, ns, pod.Name)
 | 
				
			||||||
 | 
						}()
 | 
				
			||||||
 | 
						framework.ExpectNoError(framework.WaitForPodSuccessInNamespaceSlow(c, pod.Name, pod.Namespace))
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -30,6 +30,7 @@ import (
 | 
				
			|||||||
	"k8s.io/apimachinery/pkg/util/wait"
 | 
						"k8s.io/apimachinery/pkg/util/wait"
 | 
				
			||||||
	clientset "k8s.io/client-go/kubernetes"
 | 
						clientset "k8s.io/client-go/kubernetes"
 | 
				
			||||||
	"k8s.io/kubernetes/test/e2e/framework"
 | 
						"k8s.io/kubernetes/test/e2e/framework"
 | 
				
			||||||
 | 
						"k8s.io/kubernetes/test/e2e/storage/utils"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const (
 | 
					const (
 | 
				
			||||||
@@ -38,7 +39,7 @@ const (
 | 
				
			|||||||
	totalResizeWaitPeriod = 20 * time.Minute
 | 
						totalResizeWaitPeriod = 20 * time.Minute
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var _ = SIGDescribe("Volume expand [Feature:ExpandPersistentVolumes] [Slow]", func() {
 | 
					var _ = utils.SIGDescribe("Volume expand [Feature:ExpandPersistentVolumes] [Slow]", func() {
 | 
				
			||||||
	var (
 | 
						var (
 | 
				
			||||||
		c           clientset.Interface
 | 
							c           clientset.Interface
 | 
				
			||||||
		ns          string
 | 
							ns          string
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -40,6 +40,7 @@ import (
 | 
				
			|||||||
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 | 
						metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 | 
				
			||||||
	clientset "k8s.io/client-go/kubernetes"
 | 
						clientset "k8s.io/client-go/kubernetes"
 | 
				
			||||||
	"k8s.io/kubernetes/test/e2e/framework"
 | 
						"k8s.io/kubernetes/test/e2e/framework"
 | 
				
			||||||
 | 
						"k8s.io/kubernetes/test/e2e/storage/utils"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const (
 | 
					const (
 | 
				
			||||||
@@ -126,7 +127,7 @@ func writeToFile(pod *v1.Pod, fpath, dd_input string, fsize int64) error {
 | 
				
			|||||||
	By(fmt.Sprintf("writing %d bytes to test file %s", fsize, fpath))
 | 
						By(fmt.Sprintf("writing %d bytes to test file %s", fsize, fpath))
 | 
				
			||||||
	loopCnt := fsize / minFileSize
 | 
						loopCnt := fsize / minFileSize
 | 
				
			||||||
	writeCmd := fmt.Sprintf("i=0; while [ $i -lt %d ]; do dd if=%s bs=%d >>%s 2>/dev/null; let i+=1; done", loopCnt, dd_input, minFileSize, fpath)
 | 
						writeCmd := fmt.Sprintf("i=0; while [ $i -lt %d ]; do dd if=%s bs=%d >>%s 2>/dev/null; let i+=1; done", loopCnt, dd_input, minFileSize, fpath)
 | 
				
			||||||
	_, err := podExec(pod, writeCmd)
 | 
						_, err := utils.PodExec(pod, writeCmd)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return err
 | 
						return err
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -134,7 +135,7 @@ func writeToFile(pod *v1.Pod, fpath, dd_input string, fsize int64) error {
 | 
				
			|||||||
// Verify that the test file is the expected size and contains the expected content.
 | 
					// Verify that the test file is the expected size and contains the expected content.
 | 
				
			||||||
func verifyFile(pod *v1.Pod, fpath string, expectSize int64, dd_input string) error {
 | 
					func verifyFile(pod *v1.Pod, fpath string, expectSize int64, dd_input string) error {
 | 
				
			||||||
	By("verifying file size")
 | 
						By("verifying file size")
 | 
				
			||||||
	rtnstr, err := podExec(pod, fmt.Sprintf("stat -c %%s %s", fpath))
 | 
						rtnstr, err := utils.PodExec(pod, fmt.Sprintf("stat -c %%s %s", fpath))
 | 
				
			||||||
	if err != nil || rtnstr == "" {
 | 
						if err != nil || rtnstr == "" {
 | 
				
			||||||
		return fmt.Errorf("unable to get file size via `stat %s`: %v", fpath, err)
 | 
							return fmt.Errorf("unable to get file size via `stat %s`: %v", fpath, err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -147,7 +148,7 @@ func verifyFile(pod *v1.Pod, fpath string, expectSize int64, dd_input string) er
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	By("verifying file hash")
 | 
						By("verifying file hash")
 | 
				
			||||||
	rtnstr, err = podExec(pod, fmt.Sprintf("md5sum %s | cut -d' ' -f1", fpath))
 | 
						rtnstr, err = utils.PodExec(pod, fmt.Sprintf("md5sum %s | cut -d' ' -f1", fpath))
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return fmt.Errorf("unable to test file hash via `md5sum %s`: %v", fpath, err)
 | 
							return fmt.Errorf("unable to test file hash via `md5sum %s`: %v", fpath, err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -168,7 +169,7 @@ func verifyFile(pod *v1.Pod, fpath string, expectSize int64, dd_input string) er
 | 
				
			|||||||
// Delete `fpath` to save some disk space on host. Delete errors are logged but ignored.
 | 
					// Delete `fpath` to save some disk space on host. Delete errors are logged but ignored.
 | 
				
			||||||
func deleteFile(pod *v1.Pod, fpath string) {
 | 
					func deleteFile(pod *v1.Pod, fpath string) {
 | 
				
			||||||
	By(fmt.Sprintf("deleting test file %s...", fpath))
 | 
						By(fmt.Sprintf("deleting test file %s...", fpath))
 | 
				
			||||||
	_, err := podExec(pod, fmt.Sprintf("rm -f %s", fpath))
 | 
						_, err := utils.PodExec(pod, fmt.Sprintf("rm -f %s", fpath))
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		// keep going, the test dir will be deleted when the volume is unmounted
 | 
							// keep going, the test dir will be deleted when the volume is unmounted
 | 
				
			||||||
		framework.Logf("unable to delete test file %s: %v\nerror ignored, continuing test", fpath, err)
 | 
							framework.Logf("unable to delete test file %s: %v\nerror ignored, continuing test", fpath, err)
 | 
				
			||||||
@@ -237,7 +238,7 @@ func testVolumeIO(f *framework.Framework, cs clientset.Interface, config framewo
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// These tests need privileged containers which are disabled by default.
 | 
					// These tests need privileged containers which are disabled by default.
 | 
				
			||||||
// TODO: support all of the plugins tested in storage/volumes.go
 | 
					// TODO: support all of the plugins tested in storage/volumes.go
 | 
				
			||||||
var _ = SIGDescribe("Volume plugin streaming [Slow]", func() {
 | 
					var _ = utils.SIGDescribe("Volume plugin streaming [Slow]", func() {
 | 
				
			||||||
	f := framework.NewDefaultFramework("volume-io")
 | 
						f := framework.NewDefaultFramework("volume-io")
 | 
				
			||||||
	var (
 | 
						var (
 | 
				
			||||||
		config    framework.VolumeTestConfig
 | 
							config    framework.VolumeTestConfig
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -30,11 +30,12 @@ import (
 | 
				
			|||||||
	kubeletmetrics "k8s.io/kubernetes/pkg/kubelet/metrics"
 | 
						kubeletmetrics "k8s.io/kubernetes/pkg/kubelet/metrics"
 | 
				
			||||||
	"k8s.io/kubernetes/test/e2e/framework"
 | 
						"k8s.io/kubernetes/test/e2e/framework"
 | 
				
			||||||
	"k8s.io/kubernetes/test/e2e/framework/metrics"
 | 
						"k8s.io/kubernetes/test/e2e/framework/metrics"
 | 
				
			||||||
 | 
						"k8s.io/kubernetes/test/e2e/storage/utils"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// This test needs to run in serial because other tests could interfere
 | 
					// This test needs to run in serial because other tests could interfere
 | 
				
			||||||
// with metrics being tested here.
 | 
					// with metrics being tested here.
 | 
				
			||||||
var _ = SIGDescribe("[Serial] Volume metrics", func() {
 | 
					var _ = utils.SIGDescribe("[Serial] Volume metrics", func() {
 | 
				
			||||||
	var (
 | 
						var (
 | 
				
			||||||
		c              clientset.Interface
 | 
							c              clientset.Interface
 | 
				
			||||||
		ns             string
 | 
							ns             string
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -45,6 +45,7 @@ import (
 | 
				
			|||||||
	storageutil "k8s.io/kubernetes/pkg/apis/storage/v1/util"
 | 
						storageutil "k8s.io/kubernetes/pkg/apis/storage/v1/util"
 | 
				
			||||||
	kubeletapis "k8s.io/kubernetes/pkg/kubelet/apis"
 | 
						kubeletapis "k8s.io/kubernetes/pkg/kubelet/apis"
 | 
				
			||||||
	"k8s.io/kubernetes/test/e2e/framework"
 | 
						"k8s.io/kubernetes/test/e2e/framework"
 | 
				
			||||||
 | 
						"k8s.io/kubernetes/test/e2e/storage/utils"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type storageClassTest struct {
 | 
					type storageClassTest struct {
 | 
				
			||||||
@@ -229,7 +230,7 @@ func checkGCEPD(volume *v1.PersistentVolume, volumeType string) error {
 | 
				
			|||||||
	return nil
 | 
						return nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var _ = SIGDescribe("Dynamic Provisioning", func() {
 | 
					var _ = utils.SIGDescribe("Dynamic Provisioning", func() {
 | 
				
			||||||
	f := framework.NewDefaultFramework("volume-provisioning")
 | 
						f := framework.NewDefaultFramework("volume-provisioning")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// filled in BeforeEach
 | 
						// filled in BeforeEach
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -55,6 +55,8 @@ import (
 | 
				
			|||||||
	clientset "k8s.io/client-go/kubernetes"
 | 
						clientset "k8s.io/client-go/kubernetes"
 | 
				
			||||||
	kubeletapis "k8s.io/kubernetes/pkg/kubelet/apis"
 | 
						kubeletapis "k8s.io/kubernetes/pkg/kubelet/apis"
 | 
				
			||||||
	"k8s.io/kubernetes/test/e2e/framework"
 | 
						"k8s.io/kubernetes/test/e2e/framework"
 | 
				
			||||||
 | 
						"k8s.io/kubernetes/test/e2e/storage/utils"
 | 
				
			||||||
 | 
						vspheretest "k8s.io/kubernetes/test/e2e/storage/vsphere"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func DeleteCinderVolume(name string) error {
 | 
					func DeleteCinderVolume(name string) error {
 | 
				
			||||||
@@ -79,7 +81,7 @@ func DeleteCinderVolume(name string) error {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// These tests need privileged containers, which are disabled by default.
 | 
					// These tests need privileged containers, which are disabled by default.
 | 
				
			||||||
var _ = SIGDescribe("Volumes", func() {
 | 
					var _ = utils.SIGDescribe("Volumes", func() {
 | 
				
			||||||
	f := framework.NewDefaultFramework("volume")
 | 
						f := framework.NewDefaultFramework("volume")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// note that namespace deletion is handled by delete-namespace flag
 | 
						// note that namespace deletion is handled by delete-namespace flag
 | 
				
			||||||
@@ -510,10 +512,10 @@ var _ = SIGDescribe("Volumes", func() {
 | 
				
			|||||||
			if err != nil {
 | 
								if err != nil {
 | 
				
			||||||
				return
 | 
									return
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			vsp, err := getVSphere(c)
 | 
								vsp, err := vspheretest.GetVSphere(c)
 | 
				
			||||||
			Expect(err).NotTo(HaveOccurred())
 | 
								Expect(err).NotTo(HaveOccurred())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			volumePath, err = createVSphereVolume(vsp, nil)
 | 
								volumePath, err = vspheretest.CreateVSphereVolume(vsp, nil)
 | 
				
			||||||
			Expect(err).NotTo(HaveOccurred())
 | 
								Expect(err).NotTo(HaveOccurred())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			defer func() {
 | 
								defer func() {
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										67
									
								
								test/e2e/storage/vsphere/BUILD
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										67
									
								
								test/e2e/storage/vsphere/BUILD
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,67 @@
 | 
				
			|||||||
 | 
					package(default_visibility = ["//visibility:public"])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					load(
 | 
				
			||||||
 | 
					    "@io_bazel_rules_go//go:def.bzl",
 | 
				
			||||||
 | 
					    "go_library",
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					go_library(
 | 
				
			||||||
 | 
					    name = "go_default_library",
 | 
				
			||||||
 | 
					    srcs = [
 | 
				
			||||||
 | 
					        "persistent_volumes-vsphere.go",
 | 
				
			||||||
 | 
					        "pv_reclaimpolicy.go",
 | 
				
			||||||
 | 
					        "pvc_label_selector.go",
 | 
				
			||||||
 | 
					        "vsphere_scale.go",
 | 
				
			||||||
 | 
					        "vsphere_statefulsets.go",
 | 
				
			||||||
 | 
					        "vsphere_stress.go",
 | 
				
			||||||
 | 
					        "vsphere_utils.go",
 | 
				
			||||||
 | 
					        "vsphere_volume_cluster_ds.go",
 | 
				
			||||||
 | 
					        "vsphere_volume_datastore.go",
 | 
				
			||||||
 | 
					        "vsphere_volume_diskformat.go",
 | 
				
			||||||
 | 
					        "vsphere_volume_disksize.go",
 | 
				
			||||||
 | 
					        "vsphere_volume_fstype.go",
 | 
				
			||||||
 | 
					        "vsphere_volume_master_restart.go",
 | 
				
			||||||
 | 
					        "vsphere_volume_node_poweroff.go",
 | 
				
			||||||
 | 
					        "vsphere_volume_ops_storm.go",
 | 
				
			||||||
 | 
					        "vsphere_volume_perf.go",
 | 
				
			||||||
 | 
					        "vsphere_volume_placement.go",
 | 
				
			||||||
 | 
					        "vsphere_volume_vsan_policy.go",
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    importpath = "k8s.io/kubernetes/test/e2e/storage/vsphere",
 | 
				
			||||||
 | 
					    deps = [
 | 
				
			||||||
 | 
					        "//pkg/cloudprovider/providers/vsphere:go_default_library",
 | 
				
			||||||
 | 
					        "//pkg/cloudprovider/providers/vsphere/vclib:go_default_library",
 | 
				
			||||||
 | 
					        "//pkg/volume/util/volumehelper:go_default_library",
 | 
				
			||||||
 | 
					        "//test/e2e/framework:go_default_library",
 | 
				
			||||||
 | 
					        "//test/e2e/storage/utils:go_default_library",
 | 
				
			||||||
 | 
					        "//vendor/github.com/onsi/ginkgo:go_default_library",
 | 
				
			||||||
 | 
					        "//vendor/github.com/onsi/gomega:go_default_library",
 | 
				
			||||||
 | 
					        "//vendor/github.com/vmware/govmomi/find:go_default_library",
 | 
				
			||||||
 | 
					        "//vendor/github.com/vmware/govmomi/vim25/types:go_default_library",
 | 
				
			||||||
 | 
					        "//vendor/golang.org/x/net/context:go_default_library",
 | 
				
			||||||
 | 
					        "//vendor/k8s.io/api/core/v1:go_default_library",
 | 
				
			||||||
 | 
					        "//vendor/k8s.io/api/extensions/v1beta1:go_default_library",
 | 
				
			||||||
 | 
					        "//vendor/k8s.io/api/storage/v1:go_default_library",
 | 
				
			||||||
 | 
					        "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library",
 | 
				
			||||||
 | 
					        "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library",
 | 
				
			||||||
 | 
					        "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
 | 
				
			||||||
 | 
					        "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library",
 | 
				
			||||||
 | 
					        "//vendor/k8s.io/apimachinery/pkg/types:go_default_library",
 | 
				
			||||||
 | 
					        "//vendor/k8s.io/apimachinery/pkg/util/uuid:go_default_library",
 | 
				
			||||||
 | 
					        "//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library",
 | 
				
			||||||
 | 
					        "//vendor/k8s.io/client-go/kubernetes:go_default_library",
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					filegroup(
 | 
				
			||||||
 | 
					    name = "package-srcs",
 | 
				
			||||||
 | 
					    srcs = glob(["**"]),
 | 
				
			||||||
 | 
					    tags = ["automanaged"],
 | 
				
			||||||
 | 
					    visibility = ["//visibility:private"],
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					filegroup(
 | 
				
			||||||
 | 
					    name = "all-srcs",
 | 
				
			||||||
 | 
					    srcs = [":package-srcs"],
 | 
				
			||||||
 | 
					    tags = ["automanaged"],
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
@@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
 | 
				
			|||||||
limitations under the License.
 | 
					limitations under the License.
 | 
				
			||||||
*/
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package storage
 | 
					package vsphere
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"time"
 | 
						"time"
 | 
				
			||||||
@@ -28,10 +28,11 @@ import (
 | 
				
			|||||||
	clientset "k8s.io/client-go/kubernetes"
 | 
						clientset "k8s.io/client-go/kubernetes"
 | 
				
			||||||
	vsphere "k8s.io/kubernetes/pkg/cloudprovider/providers/vsphere"
 | 
						vsphere "k8s.io/kubernetes/pkg/cloudprovider/providers/vsphere"
 | 
				
			||||||
	"k8s.io/kubernetes/test/e2e/framework"
 | 
						"k8s.io/kubernetes/test/e2e/framework"
 | 
				
			||||||
 | 
						"k8s.io/kubernetes/test/e2e/storage/utils"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Testing configurations of single a PV/PVC pair attached to a vSphere Disk
 | 
					// Testing configurations of single a PV/PVC pair attached to a vSphere Disk
 | 
				
			||||||
var _ = SIGDescribe("PersistentVolumes:vsphere", func() {
 | 
					var _ = utils.SIGDescribe("PersistentVolumes:vsphere", func() {
 | 
				
			||||||
	var (
 | 
						var (
 | 
				
			||||||
		c          clientset.Interface
 | 
							c          clientset.Interface
 | 
				
			||||||
		ns         string
 | 
							ns         string
 | 
				
			||||||
@@ -182,7 +183,7 @@ var _ = SIGDescribe("PersistentVolumes:vsphere", func() {
 | 
				
			|||||||
		3. Verify that written file is accessible after kubelet restart
 | 
							3. Verify that written file is accessible after kubelet restart
 | 
				
			||||||
	*/
 | 
						*/
 | 
				
			||||||
	It("should test that a file written to the vspehre volume mount before kubelet restart can be read after restart [Disruptive]", func() {
 | 
						It("should test that a file written to the vspehre volume mount before kubelet restart can be read after restart [Disruptive]", func() {
 | 
				
			||||||
		testKubeletRestartsAndRestoresMount(c, f, clientPod, pvc, pv)
 | 
							utils.TestKubeletRestartsAndRestoresMount(c, f, clientPod, pvc, pv)
 | 
				
			||||||
	})
 | 
						})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/*
 | 
						/*
 | 
				
			||||||
@@ -197,7 +198,7 @@ var _ = SIGDescribe("PersistentVolumes:vsphere", func() {
 | 
				
			|||||||
		5. Verify that volume mount not to be found.
 | 
							5. Verify that volume mount not to be found.
 | 
				
			||||||
	*/
 | 
						*/
 | 
				
			||||||
	It("should test that a vspehre volume mounted to a pod that is deleted while the kubelet is down unmounts when the kubelet returns [Disruptive]", func() {
 | 
						It("should test that a vspehre volume mounted to a pod that is deleted while the kubelet is down unmounts when the kubelet returns [Disruptive]", func() {
 | 
				
			||||||
		testVolumeUnmountsFromDeletedPod(c, f, clientPod, pvc, pv)
 | 
							utils.TestVolumeUnmountsFromDeletedPod(c, f, clientPod, pvc, pv)
 | 
				
			||||||
	})
 | 
						})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/*
 | 
						/*
 | 
				
			||||||
@@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
 | 
				
			|||||||
limitations under the License.
 | 
					limitations under the License.
 | 
				
			||||||
*/
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package storage
 | 
					package vsphere
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"strconv"
 | 
						"strconv"
 | 
				
			||||||
@@ -29,9 +29,10 @@ import (
 | 
				
			|||||||
	clientset "k8s.io/client-go/kubernetes"
 | 
						clientset "k8s.io/client-go/kubernetes"
 | 
				
			||||||
	vsphere "k8s.io/kubernetes/pkg/cloudprovider/providers/vsphere"
 | 
						vsphere "k8s.io/kubernetes/pkg/cloudprovider/providers/vsphere"
 | 
				
			||||||
	"k8s.io/kubernetes/test/e2e/framework"
 | 
						"k8s.io/kubernetes/test/e2e/framework"
 | 
				
			||||||
 | 
						"k8s.io/kubernetes/test/e2e/storage/utils"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var _ = SIGDescribe("PersistentVolumes [Feature:ReclaimPolicy]", func() {
 | 
					var _ = utils.SIGDescribe("PersistentVolumes [Feature:ReclaimPolicy]", func() {
 | 
				
			||||||
	f := framework.NewDefaultFramework("persistentvolumereclaim")
 | 
						f := framework.NewDefaultFramework("persistentvolumereclaim")
 | 
				
			||||||
	var (
 | 
						var (
 | 
				
			||||||
		c          clientset.Interface
 | 
							c          clientset.Interface
 | 
				
			||||||
@@ -47,7 +48,7 @@ var _ = SIGDescribe("PersistentVolumes [Feature:ReclaimPolicy]", func() {
 | 
				
			|||||||
		framework.ExpectNoError(framework.WaitForAllNodesSchedulable(c, framework.TestContext.NodeSchedulableTimeout))
 | 
							framework.ExpectNoError(framework.WaitForAllNodesSchedulable(c, framework.TestContext.NodeSchedulableTimeout))
 | 
				
			||||||
	})
 | 
						})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	SIGDescribe("persistentvolumereclaim:vsphere", func() {
 | 
						utils.SIGDescribe("persistentvolumereclaim:vsphere", func() {
 | 
				
			||||||
		BeforeEach(func() {
 | 
							BeforeEach(func() {
 | 
				
			||||||
			framework.SkipUnlessProviderIs("vsphere")
 | 
								framework.SkipUnlessProviderIs("vsphere")
 | 
				
			||||||
			pv = nil
 | 
								pv = nil
 | 
				
			||||||
@@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
 | 
				
			|||||||
limitations under the License.
 | 
					limitations under the License.
 | 
				
			||||||
*/
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package storage
 | 
					package vsphere
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"time"
 | 
						"time"
 | 
				
			||||||
@@ -24,6 +24,7 @@ import (
 | 
				
			|||||||
	"k8s.io/api/core/v1"
 | 
						"k8s.io/api/core/v1"
 | 
				
			||||||
	clientset "k8s.io/client-go/kubernetes"
 | 
						clientset "k8s.io/client-go/kubernetes"
 | 
				
			||||||
	"k8s.io/kubernetes/test/e2e/framework"
 | 
						"k8s.io/kubernetes/test/e2e/framework"
 | 
				
			||||||
 | 
						"k8s.io/kubernetes/test/e2e/storage/utils"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
@@ -43,7 +44,7 @@ import (
 | 
				
			|||||||
   9. delete pvc_vvol
 | 
					   9. delete pvc_vvol
 | 
				
			||||||
 | 
					
 | 
				
			||||||
*/
 | 
					*/
 | 
				
			||||||
var _ = SIGDescribe("PersistentVolumes [Feature:LabelSelector]", func() {
 | 
					var _ = utils.SIGDescribe("PersistentVolumes [Feature:LabelSelector]", func() {
 | 
				
			||||||
	f := framework.NewDefaultFramework("pvclabelselector")
 | 
						f := framework.NewDefaultFramework("pvclabelselector")
 | 
				
			||||||
	var (
 | 
						var (
 | 
				
			||||||
		c          clientset.Interface
 | 
							c          clientset.Interface
 | 
				
			||||||
@@ -68,7 +69,7 @@ var _ = SIGDescribe("PersistentVolumes [Feature:LabelSelector]", func() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	})
 | 
						})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	SIGDescribe("Selector-Label Volume Binding:vsphere", func() {
 | 
						utils.SIGDescribe("Selector-Label Volume Binding:vsphere", func() {
 | 
				
			||||||
		AfterEach(func() {
 | 
							AfterEach(func() {
 | 
				
			||||||
			By("Running clean up actions")
 | 
								By("Running clean up actions")
 | 
				
			||||||
			if framework.ProviderIs("vsphere") {
 | 
								if framework.ProviderIs("vsphere") {
 | 
				
			||||||
@@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
 | 
				
			|||||||
limitations under the License.
 | 
					limitations under the License.
 | 
				
			||||||
*/
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package storage
 | 
					package vsphere
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
@@ -30,6 +30,7 @@ import (
 | 
				
			|||||||
	clientset "k8s.io/client-go/kubernetes"
 | 
						clientset "k8s.io/client-go/kubernetes"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/cloudprovider/providers/vsphere"
 | 
						"k8s.io/kubernetes/pkg/cloudprovider/providers/vsphere"
 | 
				
			||||||
	"k8s.io/kubernetes/test/e2e/framework"
 | 
						"k8s.io/kubernetes/test/e2e/framework"
 | 
				
			||||||
 | 
						"k8s.io/kubernetes/test/e2e/storage/utils"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
@@ -52,7 +53,7 @@ type NodeSelector struct {
 | 
				
			|||||||
	labelValue string
 | 
						labelValue string
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var _ = SIGDescribe("vcp at scale [Feature:vsphere] ", func() {
 | 
					var _ = utils.SIGDescribe("vcp at scale [Feature:vsphere] ", func() {
 | 
				
			||||||
	f := framework.NewDefaultFramework("vcp-at-scale")
 | 
						f := framework.NewDefaultFramework("vcp-at-scale")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var (
 | 
						var (
 | 
				
			||||||
@@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
 | 
				
			|||||||
limitations under the License.
 | 
					limitations under the License.
 | 
				
			||||||
*/
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package storage
 | 
					package vsphere
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
@@ -25,6 +25,7 @@ import (
 | 
				
			|||||||
	"k8s.io/apimachinery/pkg/types"
 | 
						"k8s.io/apimachinery/pkg/types"
 | 
				
			||||||
	clientset "k8s.io/client-go/kubernetes"
 | 
						clientset "k8s.io/client-go/kubernetes"
 | 
				
			||||||
	"k8s.io/kubernetes/test/e2e/framework"
 | 
						"k8s.io/kubernetes/test/e2e/framework"
 | 
				
			||||||
 | 
						"k8s.io/kubernetes/test/e2e/storage/utils"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
@@ -49,7 +50,7 @@ const (
 | 
				
			|||||||
	storageclassname = "nginx-sc"
 | 
						storageclassname = "nginx-sc"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var _ = SIGDescribe("vsphere statefulset", func() {
 | 
					var _ = utils.SIGDescribe("vsphere statefulset", func() {
 | 
				
			||||||
	f := framework.NewDefaultFramework("vsphere-statefulset")
 | 
						f := framework.NewDefaultFramework("vsphere-statefulset")
 | 
				
			||||||
	var (
 | 
						var (
 | 
				
			||||||
		namespace string
 | 
							namespace string
 | 
				
			||||||
@@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
 | 
				
			|||||||
limitations under the License.
 | 
					limitations under the License.
 | 
				
			||||||
*/
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package storage
 | 
					package vsphere
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
@@ -31,6 +31,7 @@ import (
 | 
				
			|||||||
	k8stype "k8s.io/apimachinery/pkg/types"
 | 
						k8stype "k8s.io/apimachinery/pkg/types"
 | 
				
			||||||
	clientset "k8s.io/client-go/kubernetes"
 | 
						clientset "k8s.io/client-go/kubernetes"
 | 
				
			||||||
	"k8s.io/kubernetes/test/e2e/framework"
 | 
						"k8s.io/kubernetes/test/e2e/framework"
 | 
				
			||||||
 | 
						"k8s.io/kubernetes/test/e2e/storage/utils"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
@@ -43,7 +44,7 @@ import (
 | 
				
			|||||||
	4. Each instance of routine iterates for n times, where n is read from system env - VCP_STRESS_ITERATIONS
 | 
						4. Each instance of routine iterates for n times, where n is read from system env - VCP_STRESS_ITERATIONS
 | 
				
			||||||
	5. Each iteration creates 1 PVC, 1 POD using the provisioned PV, Verify disk is attached to the node, Verify pod can access the volume, delete the pod and finally delete the PVC.
 | 
						5. Each iteration creates 1 PVC, 1 POD using the provisioned PV, Verify disk is attached to the node, Verify pod can access the volume, delete the pod and finally delete the PVC.
 | 
				
			||||||
*/
 | 
					*/
 | 
				
			||||||
var _ = SIGDescribe("vsphere cloud provider stress [Feature:vsphere]", func() {
 | 
					var _ = utils.SIGDescribe("vsphere cloud provider stress [Feature:vsphere]", func() {
 | 
				
			||||||
	f := framework.NewDefaultFramework("vcp-stress")
 | 
						f := framework.NewDefaultFramework("vcp-stress")
 | 
				
			||||||
	var (
 | 
						var (
 | 
				
			||||||
		client        clientset.Interface
 | 
							client        clientset.Interface
 | 
				
			||||||
@@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
 | 
				
			|||||||
limitations under the License.
 | 
					limitations under the License.
 | 
				
			||||||
*/
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package storage
 | 
					package vsphere
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
@@ -36,6 +36,7 @@ import (
 | 
				
			|||||||
	"k8s.io/kubernetes/pkg/cloudprovider/providers/vsphere/vclib"
 | 
						"k8s.io/kubernetes/pkg/cloudprovider/providers/vsphere/vclib"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/volume/util/volumehelper"
 | 
						"k8s.io/kubernetes/pkg/volume/util/volumehelper"
 | 
				
			||||||
	"k8s.io/kubernetes/test/e2e/framework"
 | 
						"k8s.io/kubernetes/test/e2e/framework"
 | 
				
			||||||
 | 
						"k8s.io/kubernetes/test/e2e/storage/utils"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const (
 | 
					const (
 | 
				
			||||||
@@ -250,15 +251,20 @@ func createVSphereVolume(vsp *vsphere.VSphere, volumeOptions *vclib.VolumeOption
 | 
				
			|||||||
	return volumePath, nil
 | 
						return volumePath, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// CreateVSphereVolume creates a vmdk volume
 | 
				
			||||||
 | 
					func CreateVSphereVolume(vsp *vsphere.VSphere, volumeOptions *vclib.VolumeOptions) (string, error) {
 | 
				
			||||||
 | 
						return createVSphereVolume(vsp, volumeOptions)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// function to write content to the volume backed by given PVC
 | 
					// function to write content to the volume backed by given PVC
 | 
				
			||||||
func writeContentToVSpherePV(client clientset.Interface, pvc *v1.PersistentVolumeClaim, expectedContent string) {
 | 
					func writeContentToVSpherePV(client clientset.Interface, pvc *v1.PersistentVolumeClaim, expectedContent string) {
 | 
				
			||||||
	runInPodWithVolume(client, pvc.Namespace, pvc.Name, "echo "+expectedContent+" > /mnt/test/data")
 | 
						utils.RunInPodWithVolume(client, pvc.Namespace, pvc.Name, "echo "+expectedContent+" > /mnt/test/data")
 | 
				
			||||||
	framework.Logf("Done with writing content to volume")
 | 
						framework.Logf("Done with writing content to volume")
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// function to verify content is matching on the volume backed for given PVC
 | 
					// function to verify content is matching on the volume backed for given PVC
 | 
				
			||||||
func verifyContentOfVSpherePV(client clientset.Interface, pvc *v1.PersistentVolumeClaim, expectedContent string) {
 | 
					func verifyContentOfVSpherePV(client clientset.Interface, pvc *v1.PersistentVolumeClaim, expectedContent string) {
 | 
				
			||||||
	runInPodWithVolume(client, pvc.Namespace, pvc.Name, "grep '"+expectedContent+"' /mnt/test/data")
 | 
						utils.RunInPodWithVolume(client, pvc.Namespace, pvc.Name, "grep '"+expectedContent+"' /mnt/test/data")
 | 
				
			||||||
	framework.Logf("Successfully verified content of the volume")
 | 
						framework.Logf("Successfully verified content of the volume")
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -457,3 +463,8 @@ func getVSphere(c clientset.Interface) (*vsphere.VSphere, error) {
 | 
				
			|||||||
	addNodesToVCP(vsp, c)
 | 
						addNodesToVCP(vsp, c)
 | 
				
			||||||
	return vsp, nil
 | 
						return vsp, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// GetVSphere returns vsphere cloud provider
 | 
				
			||||||
 | 
					func GetVSphere(c clientset.Interface) (*vsphere.VSphere, error) {
 | 
				
			||||||
 | 
						return getVSphere(c)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
 | 
				
			|||||||
limitations under the License.
 | 
					limitations under the License.
 | 
				
			||||||
*/
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package storage
 | 
					package vsphere
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
@@ -27,6 +27,7 @@ import (
 | 
				
			|||||||
	clientset "k8s.io/client-go/kubernetes"
 | 
						clientset "k8s.io/client-go/kubernetes"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/cloudprovider/providers/vsphere/vclib"
 | 
						"k8s.io/kubernetes/pkg/cloudprovider/providers/vsphere/vclib"
 | 
				
			||||||
	"k8s.io/kubernetes/test/e2e/framework"
 | 
						"k8s.io/kubernetes/test/e2e/framework"
 | 
				
			||||||
 | 
						"k8s.io/kubernetes/test/e2e/storage/utils"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
@@ -39,7 +40,7 @@ import (
 | 
				
			|||||||
	1. CLUSTER_DATASTORE which should be set to clustered datastore
 | 
						1. CLUSTER_DATASTORE which should be set to clustered datastore
 | 
				
			||||||
	2. VSPHERE_SPBM_POLICY_DS_CLUSTER which should be set to a tag based spbm policy tagged to a clustered datastore
 | 
						2. VSPHERE_SPBM_POLICY_DS_CLUSTER which should be set to a tag based spbm policy tagged to a clustered datastore
 | 
				
			||||||
*/
 | 
					*/
 | 
				
			||||||
var _ = SIGDescribe("Volume Provisioning On Clustered Datastore [Feature:vsphere]", func() {
 | 
					var _ = utils.SIGDescribe("Volume Provisioning On Clustered Datastore [Feature:vsphere]", func() {
 | 
				
			||||||
	f := framework.NewDefaultFramework("volume-provision")
 | 
						f := framework.NewDefaultFramework("volume-provision")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var client clientset.Interface
 | 
						var client clientset.Interface
 | 
				
			||||||
@@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
 | 
				
			|||||||
limitations under the License.
 | 
					limitations under the License.
 | 
				
			||||||
*/
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package storage
 | 
					package vsphere
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
@@ -27,6 +27,7 @@ import (
 | 
				
			|||||||
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 | 
						metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 | 
				
			||||||
	clientset "k8s.io/client-go/kubernetes"
 | 
						clientset "k8s.io/client-go/kubernetes"
 | 
				
			||||||
	"k8s.io/kubernetes/test/e2e/framework"
 | 
						"k8s.io/kubernetes/test/e2e/framework"
 | 
				
			||||||
 | 
						"k8s.io/kubernetes/test/e2e/storage/utils"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const (
 | 
					const (
 | 
				
			||||||
@@ -44,7 +45,7 @@ const (
 | 
				
			|||||||
	4. Verify the error returned on PVC failure is the correct.
 | 
						4. Verify the error returned on PVC failure is the correct.
 | 
				
			||||||
*/
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var _ = SIGDescribe("Volume Provisioning on Datastore [Feature:vsphere]", func() {
 | 
					var _ = utils.SIGDescribe("Volume Provisioning on Datastore [Feature:vsphere]", func() {
 | 
				
			||||||
	f := framework.NewDefaultFramework("volume-datastore")
 | 
						f := framework.NewDefaultFramework("volume-datastore")
 | 
				
			||||||
	var (
 | 
						var (
 | 
				
			||||||
		client       clientset.Interface
 | 
							client       clientset.Interface
 | 
				
			||||||
@@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
 | 
				
			|||||||
limitations under the License.
 | 
					limitations under the License.
 | 
				
			||||||
*/
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package storage
 | 
					package vsphere
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"os"
 | 
						"os"
 | 
				
			||||||
@@ -32,6 +32,7 @@ import (
 | 
				
			|||||||
	clientset "k8s.io/client-go/kubernetes"
 | 
						clientset "k8s.io/client-go/kubernetes"
 | 
				
			||||||
	vsphere "k8s.io/kubernetes/pkg/cloudprovider/providers/vsphere"
 | 
						vsphere "k8s.io/kubernetes/pkg/cloudprovider/providers/vsphere"
 | 
				
			||||||
	"k8s.io/kubernetes/test/e2e/framework"
 | 
						"k8s.io/kubernetes/test/e2e/framework"
 | 
				
			||||||
 | 
						"k8s.io/kubernetes/test/e2e/storage/utils"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
@@ -52,7 +53,7 @@ import (
 | 
				
			|||||||
	11. Delete PVC, PV and Storage Class
 | 
						11. Delete PVC, PV and Storage Class
 | 
				
			||||||
*/
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var _ = SIGDescribe("Volume Disk Format [Feature:vsphere]", func() {
 | 
					var _ = utils.SIGDescribe("Volume Disk Format [Feature:vsphere]", func() {
 | 
				
			||||||
	f := framework.NewDefaultFramework("volume-disk-format")
 | 
						f := framework.NewDefaultFramework("volume-disk-format")
 | 
				
			||||||
	var (
 | 
						var (
 | 
				
			||||||
		client            clientset.Interface
 | 
							client            clientset.Interface
 | 
				
			||||||
@@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
 | 
				
			|||||||
limitations under the License.
 | 
					limitations under the License.
 | 
				
			||||||
*/
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package storage
 | 
					package vsphere
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
@@ -28,6 +28,7 @@ import (
 | 
				
			|||||||
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 | 
						metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 | 
				
			||||||
	clientset "k8s.io/client-go/kubernetes"
 | 
						clientset "k8s.io/client-go/kubernetes"
 | 
				
			||||||
	"k8s.io/kubernetes/test/e2e/framework"
 | 
						"k8s.io/kubernetes/test/e2e/framework"
 | 
				
			||||||
 | 
						"k8s.io/kubernetes/test/e2e/storage/utils"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const (
 | 
					const (
 | 
				
			||||||
@@ -44,7 +45,7 @@ const (
 | 
				
			|||||||
	4. Verify the error returned on PVC failure is the correct.
 | 
						4. Verify the error returned on PVC failure is the correct.
 | 
				
			||||||
*/
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var _ = SIGDescribe("Volume Disk Size [Feature:vsphere]", func() {
 | 
					var _ = utils.SIGDescribe("Volume Disk Size [Feature:vsphere]", func() {
 | 
				
			||||||
	f := framework.NewDefaultFramework("volume-disksize")
 | 
						f := framework.NewDefaultFramework("volume-disksize")
 | 
				
			||||||
	var (
 | 
						var (
 | 
				
			||||||
		client       clientset.Interface
 | 
							client       clientset.Interface
 | 
				
			||||||
@@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
 | 
				
			|||||||
limitations under the License.
 | 
					limitations under the License.
 | 
				
			||||||
*/
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package storage
 | 
					package vsphere
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"strings"
 | 
						"strings"
 | 
				
			||||||
@@ -28,6 +28,7 @@ import (
 | 
				
			|||||||
	clientset "k8s.io/client-go/kubernetes"
 | 
						clientset "k8s.io/client-go/kubernetes"
 | 
				
			||||||
	vsphere "k8s.io/kubernetes/pkg/cloudprovider/providers/vsphere"
 | 
						vsphere "k8s.io/kubernetes/pkg/cloudprovider/providers/vsphere"
 | 
				
			||||||
	"k8s.io/kubernetes/test/e2e/framework"
 | 
						"k8s.io/kubernetes/test/e2e/framework"
 | 
				
			||||||
 | 
						"k8s.io/kubernetes/test/e2e/storage/utils"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const (
 | 
					const (
 | 
				
			||||||
@@ -63,7 +64,7 @@ const (
 | 
				
			|||||||
	7. Verify if the MountVolume.MountDevice fails because it is unable to find the file system executable file on the node.
 | 
						7. Verify if the MountVolume.MountDevice fails because it is unable to find the file system executable file on the node.
 | 
				
			||||||
*/
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var _ = SIGDescribe("Volume FStype [Feature:vsphere]", func() {
 | 
					var _ = utils.SIGDescribe("Volume FStype [Feature:vsphere]", func() {
 | 
				
			||||||
	f := framework.NewDefaultFramework("volume-fstype")
 | 
						f := framework.NewDefaultFramework("volume-fstype")
 | 
				
			||||||
	var (
 | 
						var (
 | 
				
			||||||
		client    clientset.Interface
 | 
							client    clientset.Interface
 | 
				
			||||||
@@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
 | 
				
			|||||||
limitations under the License.
 | 
					limitations under the License.
 | 
				
			||||||
*/
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package storage
 | 
					package vsphere
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
@@ -28,6 +28,7 @@ import (
 | 
				
			|||||||
	"k8s.io/apimachinery/pkg/util/uuid"
 | 
						"k8s.io/apimachinery/pkg/util/uuid"
 | 
				
			||||||
	clientset "k8s.io/client-go/kubernetes"
 | 
						clientset "k8s.io/client-go/kubernetes"
 | 
				
			||||||
	"k8s.io/kubernetes/test/e2e/framework"
 | 
						"k8s.io/kubernetes/test/e2e/framework"
 | 
				
			||||||
 | 
						"k8s.io/kubernetes/test/e2e/storage/utils"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
@@ -41,7 +42,7 @@ import (
 | 
				
			|||||||
	6. Delete the pod and wait for the volume to be detached
 | 
						6. Delete the pod and wait for the volume to be detached
 | 
				
			||||||
	7. Delete the volume
 | 
						7. Delete the volume
 | 
				
			||||||
*/
 | 
					*/
 | 
				
			||||||
var _ = SIGDescribe("Volume Attach Verify [Feature:vsphere][Serial][Disruptive]", func() {
 | 
					var _ = utils.SIGDescribe("Volume Attach Verify [Feature:vsphere][Serial][Disruptive]", func() {
 | 
				
			||||||
	f := framework.NewDefaultFramework("restart-master")
 | 
						f := framework.NewDefaultFramework("restart-master")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	const labelKey = "vsphere_e2e_label"
 | 
						const labelKey = "vsphere_e2e_label"
 | 
				
			||||||
@@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
 | 
				
			|||||||
limitations under the License.
 | 
					limitations under the License.
 | 
				
			||||||
*/
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package storage
 | 
					package vsphere
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
@@ -36,6 +36,7 @@ import (
 | 
				
			|||||||
	clientset "k8s.io/client-go/kubernetes"
 | 
						clientset "k8s.io/client-go/kubernetes"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/cloudprovider/providers/vsphere"
 | 
						"k8s.io/kubernetes/pkg/cloudprovider/providers/vsphere"
 | 
				
			||||||
	"k8s.io/kubernetes/test/e2e/framework"
 | 
						"k8s.io/kubernetes/test/e2e/framework"
 | 
				
			||||||
 | 
						"k8s.io/kubernetes/test/e2e/storage/utils"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
@@ -43,7 +44,7 @@ import (
 | 
				
			|||||||
	1. Verify the pod got provisioned on a different node with volume attached to it
 | 
						1. Verify the pod got provisioned on a different node with volume attached to it
 | 
				
			||||||
	2. Verify the volume is detached from the powered off node
 | 
						2. Verify the volume is detached from the powered off node
 | 
				
			||||||
*/
 | 
					*/
 | 
				
			||||||
var _ = SIGDescribe("Node Poweroff [Feature:vsphere] [Slow] [Disruptive]", func() {
 | 
					var _ = utils.SIGDescribe("Node Poweroff [Feature:vsphere] [Slow] [Disruptive]", func() {
 | 
				
			||||||
	f := framework.NewDefaultFramework("node-poweroff")
 | 
						f := framework.NewDefaultFramework("node-poweroff")
 | 
				
			||||||
	var (
 | 
						var (
 | 
				
			||||||
		client     clientset.Interface
 | 
							client     clientset.Interface
 | 
				
			||||||
@@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
 | 
				
			|||||||
limitations under the License.
 | 
					limitations under the License.
 | 
				
			||||||
*/
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package storage
 | 
					package vsphere
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
@@ -29,6 +29,7 @@ import (
 | 
				
			|||||||
	clientset "k8s.io/client-go/kubernetes"
 | 
						clientset "k8s.io/client-go/kubernetes"
 | 
				
			||||||
	vsphere "k8s.io/kubernetes/pkg/cloudprovider/providers/vsphere"
 | 
						vsphere "k8s.io/kubernetes/pkg/cloudprovider/providers/vsphere"
 | 
				
			||||||
	"k8s.io/kubernetes/test/e2e/framework"
 | 
						"k8s.io/kubernetes/test/e2e/framework"
 | 
				
			||||||
 | 
						"k8s.io/kubernetes/test/e2e/storage/utils"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
@@ -47,7 +48,7 @@ import (
 | 
				
			|||||||
		10. Delete storage class.
 | 
							10. Delete storage class.
 | 
				
			||||||
*/
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var _ = SIGDescribe("Volume Operations Storm [Feature:vsphere]", func() {
 | 
					var _ = utils.SIGDescribe("Volume Operations Storm [Feature:vsphere]", func() {
 | 
				
			||||||
	f := framework.NewDefaultFramework("volume-ops-storm")
 | 
						f := framework.NewDefaultFramework("volume-ops-storm")
 | 
				
			||||||
	const DEFAULT_VOLUME_OPS_SCALE = 30
 | 
						const DEFAULT_VOLUME_OPS_SCALE = 30
 | 
				
			||||||
	var (
 | 
						var (
 | 
				
			||||||
@@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
 | 
				
			|||||||
limitations under the License.
 | 
					limitations under the License.
 | 
				
			||||||
*/
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package storage
 | 
					package vsphere
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
@@ -29,6 +29,7 @@ import (
 | 
				
			|||||||
	"k8s.io/apimachinery/pkg/types"
 | 
						"k8s.io/apimachinery/pkg/types"
 | 
				
			||||||
	clientset "k8s.io/client-go/kubernetes"
 | 
						clientset "k8s.io/client-go/kubernetes"
 | 
				
			||||||
	"k8s.io/kubernetes/test/e2e/framework"
 | 
						"k8s.io/kubernetes/test/e2e/framework"
 | 
				
			||||||
 | 
						"k8s.io/kubernetes/test/e2e/storage/utils"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* This test calculates latency numbers for volume lifecycle operations
 | 
					/* This test calculates latency numbers for volume lifecycle operations
 | 
				
			||||||
@@ -48,7 +49,7 @@ const (
 | 
				
			|||||||
	DeleteOp                  = "DeleteOp"
 | 
						DeleteOp                  = "DeleteOp"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var _ = SIGDescribe("vcp-performance [Feature:vsphere]", func() {
 | 
					var _ = utils.SIGDescribe("vcp-performance [Feature:vsphere]", func() {
 | 
				
			||||||
	f := framework.NewDefaultFramework("vcp-performance")
 | 
						f := framework.NewDefaultFramework("vcp-performance")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var (
 | 
						var (
 | 
				
			||||||
@@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
 | 
				
			|||||||
limitations under the License.
 | 
					limitations under the License.
 | 
				
			||||||
*/
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package storage
 | 
					package vsphere
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
@@ -31,9 +31,10 @@ import (
 | 
				
			|||||||
	vsphere "k8s.io/kubernetes/pkg/cloudprovider/providers/vsphere"
 | 
						vsphere "k8s.io/kubernetes/pkg/cloudprovider/providers/vsphere"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/cloudprovider/providers/vsphere/vclib"
 | 
						"k8s.io/kubernetes/pkg/cloudprovider/providers/vsphere/vclib"
 | 
				
			||||||
	"k8s.io/kubernetes/test/e2e/framework"
 | 
						"k8s.io/kubernetes/test/e2e/framework"
 | 
				
			||||||
 | 
						"k8s.io/kubernetes/test/e2e/storage/utils"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var _ = SIGDescribe("Volume Placement", func() {
 | 
					var _ = utils.SIGDescribe("Volume Placement", func() {
 | 
				
			||||||
	f := framework.NewDefaultFramework("volume-placement")
 | 
						f := framework.NewDefaultFramework("volume-placement")
 | 
				
			||||||
	var (
 | 
						var (
 | 
				
			||||||
		c                  clientset.Interface
 | 
							c                  clientset.Interface
 | 
				
			||||||
@@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
 | 
				
			|||||||
limitations under the License.
 | 
					limitations under the License.
 | 
				
			||||||
*/
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package storage
 | 
					package vsphere
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
@@ -26,6 +26,7 @@ import (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	. "github.com/onsi/ginkgo"
 | 
						. "github.com/onsi/ginkgo"
 | 
				
			||||||
	. "github.com/onsi/gomega"
 | 
						. "github.com/onsi/gomega"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/vmware/govmomi/find"
 | 
						"github.com/vmware/govmomi/find"
 | 
				
			||||||
	"golang.org/x/net/context"
 | 
						"golang.org/x/net/context"
 | 
				
			||||||
	"k8s.io/api/core/v1"
 | 
						"k8s.io/api/core/v1"
 | 
				
			||||||
@@ -34,6 +35,7 @@ import (
 | 
				
			|||||||
	clientset "k8s.io/client-go/kubernetes"
 | 
						clientset "k8s.io/client-go/kubernetes"
 | 
				
			||||||
	vsphere "k8s.io/kubernetes/pkg/cloudprovider/providers/vsphere"
 | 
						vsphere "k8s.io/kubernetes/pkg/cloudprovider/providers/vsphere"
 | 
				
			||||||
	"k8s.io/kubernetes/test/e2e/framework"
 | 
						"k8s.io/kubernetes/test/e2e/framework"
 | 
				
			||||||
 | 
						"k8s.io/kubernetes/test/e2e/storage/utils"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const (
 | 
					const (
 | 
				
			||||||
@@ -90,7 +92,7 @@ const (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
*/
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var _ = SIGDescribe("Storage Policy Based Volume Provisioning [Feature:vsphere]", func() {
 | 
					var _ = utils.SIGDescribe("Storage Policy Based Volume Provisioning [Feature:vsphere]", func() {
 | 
				
			||||||
	f := framework.NewDefaultFramework("volume-vsan-policy")
 | 
						f := framework.NewDefaultFramework("volume-vsan-policy")
 | 
				
			||||||
	var (
 | 
						var (
 | 
				
			||||||
		client       clientset.Interface
 | 
							client       clientset.Interface
 | 
				
			||||||
		Reference in New Issue
	
	Block a user