This is the result of automatically editing source files like this:
go install golang.org/x/tools/cmd/goimports@latest
find ./test/e2e* -name "*.go" | xargs env PATH=$GOPATH/bin:$PATH ./e2e-framework-sed.sh
with e2e-framework-sed.sh containing this:
sed -i \
-e "s/\(f\|fr\|\w\w*\.[fF]\w*\)\.ExecCommandInContainer(/e2epod.ExecCommandInContainer(\1, /" \
-e "s/\(f\|fr\|\w\w*\.[fF]\w*\)\.ExecCommandInContainerWithFullOutput(/e2epod.ExecCommandInContainerWithFullOutput(\1, /" \
-e "s/\(f\|fr\|\w\w*\.[fF]\w*\)\.ExecShellInContainer(/e2epod.ExecShellInContainer(\1, /" \
-e "s/\(f\|fr\|\w\w*\.[fF]\w*\)\.ExecShellInPod(/e2epod.ExecShellInPod(\1, /" \
-e "s/\(f\|fr\|\w\w*\.[fF]\w*\)\.ExecShellInPodWithFullOutput(/e2epod.ExecShellInPodWithFullOutput(\1, /" \
-e "s/\(f\|fr\|\w\w*\.[fF]\w*\)\.ExecWithOptions(/e2epod.ExecWithOptions(\1, /" \
-e "s/\(f\|fr\|\w\w*\.[fF]\w*\)\.MatchContainerOutput(/e2eoutput.MatchContainerOutput(\1, /" \
-e "s/\(f\|fr\|\w\w*\.[fF]\w*\)\.PodClient(/e2epod.NewPodClient(\1, /" \
-e "s/\(f\|fr\|\w\w*\.[fF]\w*\)\.PodClientNS(/e2epod.PodClientNS(\1, /" \
-e "s/\(f\|fr\|\w\w*\.[fF]\w*\)\.TestContainerOutput(/e2eoutput.TestContainerOutput(\1, /" \
-e "s/\(f\|fr\|\w\w*\.[fF]\w*\)\.TestContainerOutputRegexp(/e2eoutput.TestContainerOutputRegexp(\1, /" \
-e "s/framework.AddOrUpdateLabelOnNode\b/e2enode.AddOrUpdateLabelOnNode/" \
-e "s/framework.AllNodes\b/e2edebug.AllNodes/" \
-e "s/framework.AllNodesReady\b/e2enode.AllNodesReady/" \
-e "s/framework.ContainerResourceGatherer\b/e2edebug.ContainerResourceGatherer/" \
-e "s/framework.ContainerResourceUsage\b/e2edebug.ContainerResourceUsage/" \
-e "s/framework.CreateEmptyFileOnPod\b/e2eoutput.CreateEmptyFileOnPod/" \
-e "s/framework.DefaultPodDeletionTimeout\b/e2epod.DefaultPodDeletionTimeout/" \
-e "s/framework.DumpAllNamespaceInfo\b/e2edebug.DumpAllNamespaceInfo/" \
-e "s/framework.DumpDebugInfo\b/e2eoutput.DumpDebugInfo/" \
-e "s/framework.DumpNodeDebugInfo\b/e2edebug.DumpNodeDebugInfo/" \
-e "s/framework.EtcdUpgrade\b/e2eproviders.EtcdUpgrade/" \
-e "s/framework.EventsLister\b/e2edebug.EventsLister/" \
-e "s/framework.ExecOptions\b/e2epod.ExecOptions/" \
-e "s/framework.ExpectNodeHasLabel\b/e2enode.ExpectNodeHasLabel/" \
-e "s/framework.ExpectNodeHasTaint\b/e2enode.ExpectNodeHasTaint/" \
-e "s/framework.GCEUpgradeScript\b/e2eproviders.GCEUpgradeScript/" \
-e "s/framework.ImagePrePullList\b/e2epod.ImagePrePullList/" \
-e "s/framework.KubectlBuilder\b/e2ekubectl.KubectlBuilder/" \
-e "s/framework.LocationParamGKE\b/e2eproviders.LocationParamGKE/" \
-e "s/framework.LogSizeDataTimeseries\b/e2edebug.LogSizeDataTimeseries/" \
-e "s/framework.LogSizeGatherer\b/e2edebug.LogSizeGatherer/" \
-e "s/framework.LogsSizeData\b/e2edebug.LogsSizeData/" \
-e "s/framework.LogsSizeDataSummary\b/e2edebug.LogsSizeDataSummary/" \
-e "s/framework.LogsSizeVerifier\b/e2edebug.LogsSizeVerifier/" \
-e "s/framework.LookForStringInLog\b/e2eoutput.LookForStringInLog/" \
-e "s/framework.LookForStringInPodExec\b/e2eoutput.LookForStringInPodExec/" \
-e "s/framework.LookForStringInPodExecToContainer\b/e2eoutput.LookForStringInPodExecToContainer/" \
-e "s/framework.MasterAndDNSNodes\b/e2edebug.MasterAndDNSNodes/" \
-e "s/framework.MasterNodes\b/e2edebug.MasterNodes/" \
-e "s/framework.MasterUpgradeGKE\b/e2eproviders.MasterUpgradeGKE/" \
-e "s/framework.NewKubectlCommand\b/e2ekubectl.NewKubectlCommand/" \
-e "s/framework.NewLogsVerifier\b/e2edebug.NewLogsVerifier/" \
-e "s/framework.NewNodeKiller\b/e2enode.NewNodeKiller/" \
-e "s/framework.NewResourceUsageGatherer\b/e2edebug.NewResourceUsageGatherer/" \
-e "s/framework.NodeHasTaint\b/e2enode.NodeHasTaint/" \
-e "s/framework.NodeKiller\b/e2enode.NodeKiller/" \
-e "s/framework.NodesSet\b/e2edebug.NodesSet/" \
-e "s/framework.PodClient\b/e2epod.PodClient/" \
-e "s/framework.RemoveLabelOffNode\b/e2enode.RemoveLabelOffNode/" \
-e "s/framework.ResourceConstraint\b/e2edebug.ResourceConstraint/" \
-e "s/framework.ResourceGathererOptions\b/e2edebug.ResourceGathererOptions/" \
-e "s/framework.ResourceUsagePerContainer\b/e2edebug.ResourceUsagePerContainer/" \
-e "s/framework.ResourceUsageSummary\b/e2edebug.ResourceUsageSummary/" \
-e "s/framework.RunHostCmd\b/e2eoutput.RunHostCmd/" \
-e "s/framework.RunHostCmdOrDie\b/e2eoutput.RunHostCmdOrDie/" \
-e "s/framework.RunHostCmdWithFullOutput\b/e2eoutput.RunHostCmdWithFullOutput/" \
-e "s/framework.RunHostCmdWithRetries\b/e2eoutput.RunHostCmdWithRetries/" \
-e "s/framework.RunKubectl\b/e2ekubectl.RunKubectl/" \
-e "s/framework.RunKubectlInput\b/e2ekubectl.RunKubectlInput/" \
-e "s/framework.RunKubectlOrDie\b/e2ekubectl.RunKubectlOrDie/" \
-e "s/framework.RunKubectlOrDieInput\b/e2ekubectl.RunKubectlOrDieInput/" \
-e "s/framework.RunKubectlWithFullOutput\b/e2ekubectl.RunKubectlWithFullOutput/" \
-e "s/framework.RunKubemciCmd\b/e2ekubectl.RunKubemciCmd/" \
-e "s/framework.RunKubemciWithKubeconfig\b/e2ekubectl.RunKubemciWithKubeconfig/" \
-e "s/framework.SingleContainerSummary\b/e2edebug.SingleContainerSummary/" \
-e "s/framework.SingleLogSummary\b/e2edebug.SingleLogSummary/" \
-e "s/framework.TimestampedSize\b/e2edebug.TimestampedSize/" \
-e "s/framework.WaitForAllNodesSchedulable\b/e2enode.WaitForAllNodesSchedulable/" \
-e "s/framework.WaitForSSHTunnels\b/e2enode.WaitForSSHTunnels/" \
-e "s/framework.WorkItem\b/e2edebug.WorkItem/" \
"$@"
for i in "$@"; do
# Import all sub packages and let goimports figure out which of those
# are redundant (= already imported) or not needed.
sed -i -e '/"k8s.io.kubernetes.test.e2e.framework"/a e2edebug "k8s.io/kubernetes/test/e2e/framework/debug"' "$i"
sed -i -e '/"k8s.io.kubernetes.test.e2e.framework"/a e2ekubectl "k8s.io/kubernetes/test/e2e/framework/kubectl"' "$i"
sed -i -e '/"k8s.io.kubernetes.test.e2e.framework"/a e2enode "k8s.io/kubernetes/test/e2e/framework/node"' "$i"
sed -i -e '/"k8s.io.kubernetes.test.e2e.framework"/a e2eoutput "k8s.io/kubernetes/test/e2e/framework/pod/output"' "$i"
sed -i -e '/"k8s.io.kubernetes.test.e2e.framework"/a e2epod "k8s.io/kubernetes/test/e2e/framework/pod"' "$i"
sed -i -e '/"k8s.io.kubernetes.test.e2e.framework"/a e2eproviders "k8s.io/kubernetes/test/e2e/framework/providers"' "$i"
goimports -w "$i"
done
361 lines
14 KiB
Go
361 lines
14 KiB
Go
/*
|
|
Copyright 2019 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
|
|
|
|
/*
|
|
* Various local test resource implementations.
|
|
*/
|
|
|
|
import (
|
|
"fmt"
|
|
"path/filepath"
|
|
"strings"
|
|
|
|
"github.com/onsi/ginkgo/v2"
|
|
v1 "k8s.io/api/core/v1"
|
|
"k8s.io/apimachinery/pkg/util/uuid"
|
|
"k8s.io/kubernetes/test/e2e/framework"
|
|
)
|
|
|
|
// LocalVolumeType represents type of local volume, e.g. tmpfs, directory,
|
|
// block, etc.
|
|
type LocalVolumeType string
|
|
|
|
const (
|
|
// LocalVolumeDirectory reprensents a simple directory as local volume
|
|
LocalVolumeDirectory LocalVolumeType = "dir"
|
|
// LocalVolumeDirectoryLink is like LocalVolumeDirectory but it's a symbolic link to directory
|
|
LocalVolumeDirectoryLink LocalVolumeType = "dir-link"
|
|
// LocalVolumeDirectoryBindMounted is like LocalVolumeDirectory but bind mounted
|
|
LocalVolumeDirectoryBindMounted LocalVolumeType = "dir-bindmounted"
|
|
// LocalVolumeDirectoryLinkBindMounted is like LocalVolumeDirectory but it's a symbolic link to self bind mounted directory
|
|
// Note that bind mounting at symbolic link actually mounts at directory it
|
|
// links to
|
|
LocalVolumeDirectoryLinkBindMounted LocalVolumeType = "dir-link-bindmounted"
|
|
// LocalVolumeTmpfs represents a temporary filesystem to be used as local volume
|
|
LocalVolumeTmpfs LocalVolumeType = "tmpfs"
|
|
// LocalVolumeBlock represents a Block device, creates a local file, and maps it as a block device
|
|
LocalVolumeBlock LocalVolumeType = "block"
|
|
// LocalVolumeBlockFS represents a filesystem backed by a block device
|
|
LocalVolumeBlockFS LocalVolumeType = "blockfs"
|
|
// LocalVolumeGCELocalSSD represents a Filesystem backed by GCE Local SSD as local volume
|
|
LocalVolumeGCELocalSSD LocalVolumeType = "gce-localssd-scsi-fs"
|
|
)
|
|
|
|
// LocalTestResource represents test resource of a local volume.
|
|
type LocalTestResource struct {
|
|
VolumeType LocalVolumeType
|
|
Node *v1.Node
|
|
// Volume path, path to filesystem or block device on the node
|
|
Path string
|
|
// If volume is backed by a loop device, we create loop device storage file
|
|
// under this directory.
|
|
loopDir string
|
|
}
|
|
|
|
// LocalTestResourceManager represents interface to create/destroy local test resources on node
|
|
type LocalTestResourceManager interface {
|
|
Create(node *v1.Node, volumeType LocalVolumeType, parameters map[string]string) *LocalTestResource
|
|
ExpandBlockDevice(ltr *LocalTestResource, mbToAdd int) error
|
|
Remove(ltr *LocalTestResource)
|
|
}
|
|
|
|
// ltrMgr implements LocalTestResourceManager
|
|
type ltrMgr struct {
|
|
prefix string
|
|
hostExec HostExec
|
|
// hostBase represents a writable directory on the host under which we
|
|
// create test directories
|
|
hostBase string
|
|
}
|
|
|
|
// NewLocalResourceManager returns a instance of LocalTestResourceManager
|
|
func NewLocalResourceManager(prefix string, hostExec HostExec, hostBase string) LocalTestResourceManager {
|
|
return <rMgr{
|
|
prefix: prefix,
|
|
hostExec: hostExec,
|
|
hostBase: hostBase,
|
|
}
|
|
}
|
|
|
|
// getTestDir returns a test dir under `hostBase` directory with randome name.
|
|
func (l *ltrMgr) getTestDir() string {
|
|
testDirName := fmt.Sprintf("%s-%s", l.prefix, string(uuid.NewUUID()))
|
|
return filepath.Join(l.hostBase, testDirName)
|
|
}
|
|
|
|
func (l *ltrMgr) setupLocalVolumeTmpfs(node *v1.Node, parameters map[string]string) *LocalTestResource {
|
|
hostDir := l.getTestDir()
|
|
ginkgo.By(fmt.Sprintf("Creating tmpfs mount point on node %q at path %q", node.Name, hostDir))
|
|
err := l.hostExec.IssueCommand(fmt.Sprintf("mkdir -p %q && mount -t tmpfs -o size=10m tmpfs-%q %q", hostDir, hostDir, hostDir), node)
|
|
framework.ExpectNoError(err)
|
|
return &LocalTestResource{
|
|
Node: node,
|
|
Path: hostDir,
|
|
}
|
|
}
|
|
|
|
func (l *ltrMgr) cleanupLocalVolumeTmpfs(ltr *LocalTestResource) {
|
|
ginkgo.By(fmt.Sprintf("Unmount tmpfs mount point on node %q at path %q", ltr.Node.Name, ltr.Path))
|
|
err := l.hostExec.IssueCommand(fmt.Sprintf("umount %q", ltr.Path), ltr.Node)
|
|
framework.ExpectNoError(err)
|
|
|
|
ginkgo.By("Removing the test directory")
|
|
err = l.hostExec.IssueCommand(fmt.Sprintf("rm -r %s", ltr.Path), ltr.Node)
|
|
framework.ExpectNoError(err)
|
|
}
|
|
|
|
// createAndSetupLoopDevice creates an empty file and associates a loop devie with it.
|
|
func (l *ltrMgr) createAndSetupLoopDevice(dir string, node *v1.Node, size int) {
|
|
ginkgo.By(fmt.Sprintf("Creating block device on node %q using path %q", node.Name, dir))
|
|
mkdirCmd := fmt.Sprintf("mkdir -p %s", dir)
|
|
count := size / 4096
|
|
// xfs requires at least 4096 blocks
|
|
if count < 4096 {
|
|
count = 4096
|
|
}
|
|
ddCmd := fmt.Sprintf("dd if=/dev/zero of=%s/file bs=4096 count=%d", dir, count)
|
|
losetupCmd := fmt.Sprintf("losetup -f %s/file", dir)
|
|
err := l.hostExec.IssueCommand(fmt.Sprintf("%s && %s && %s", mkdirCmd, ddCmd, losetupCmd), node)
|
|
framework.ExpectNoError(err)
|
|
}
|
|
|
|
// findLoopDevice finds loop device path by its associated storage directory.
|
|
func (l *ltrMgr) findLoopDevice(dir string, node *v1.Node) string {
|
|
cmd := fmt.Sprintf("E2E_LOOP_DEV=$(losetup | grep %s/file | awk '{ print $1 }') 2>&1 > /dev/null && echo ${E2E_LOOP_DEV}", dir)
|
|
loopDevResult, err := l.hostExec.IssueCommandWithResult(cmd, node)
|
|
framework.ExpectNoError(err)
|
|
return strings.TrimSpace(loopDevResult)
|
|
}
|
|
|
|
func (l *ltrMgr) setupLocalVolumeBlock(node *v1.Node, parameters map[string]string) *LocalTestResource {
|
|
loopDir := l.getTestDir()
|
|
l.createAndSetupLoopDevice(loopDir, node, 20*1024*1024)
|
|
loopDev := l.findLoopDevice(loopDir, node)
|
|
return &LocalTestResource{
|
|
Node: node,
|
|
Path: loopDev,
|
|
loopDir: loopDir,
|
|
}
|
|
}
|
|
|
|
// teardownLoopDevice tears down loop device by its associated storage directory.
|
|
func (l *ltrMgr) teardownLoopDevice(dir string, node *v1.Node) {
|
|
loopDev := l.findLoopDevice(dir, node)
|
|
ginkgo.By(fmt.Sprintf("Tear down block device %q on node %q at path %s/file", loopDev, node.Name, dir))
|
|
losetupDeleteCmd := fmt.Sprintf("losetup -d %s", loopDev)
|
|
err := l.hostExec.IssueCommand(losetupDeleteCmd, node)
|
|
framework.ExpectNoError(err)
|
|
return
|
|
}
|
|
|
|
func (l *ltrMgr) cleanupLocalVolumeBlock(ltr *LocalTestResource) {
|
|
l.teardownLoopDevice(ltr.loopDir, ltr.Node)
|
|
ginkgo.By(fmt.Sprintf("Removing the test directory %s", ltr.loopDir))
|
|
removeCmd := fmt.Sprintf("rm -r %s", ltr.loopDir)
|
|
err := l.hostExec.IssueCommand(removeCmd, ltr.Node)
|
|
framework.ExpectNoError(err)
|
|
}
|
|
|
|
func (l *ltrMgr) setupLocalVolumeBlockFS(node *v1.Node, parameters map[string]string) *LocalTestResource {
|
|
ltr := l.setupLocalVolumeBlock(node, parameters)
|
|
loopDev := ltr.Path
|
|
loopDir := ltr.loopDir
|
|
// Format and mount at loopDir and give others rwx for read/write testing
|
|
cmd := fmt.Sprintf("mkfs -t ext4 %s && mount -t ext4 %s %s && chmod o+rwx %s", loopDev, loopDev, loopDir, loopDir)
|
|
err := l.hostExec.IssueCommand(cmd, node)
|
|
framework.ExpectNoError(err)
|
|
return &LocalTestResource{
|
|
Node: node,
|
|
Path: loopDir,
|
|
loopDir: loopDir,
|
|
}
|
|
}
|
|
|
|
func (l *ltrMgr) cleanupLocalVolumeBlockFS(ltr *LocalTestResource) {
|
|
umountCmd := fmt.Sprintf("umount %s", ltr.Path)
|
|
err := l.hostExec.IssueCommand(umountCmd, ltr.Node)
|
|
framework.ExpectNoError(err)
|
|
l.cleanupLocalVolumeBlock(ltr)
|
|
}
|
|
|
|
func (l *ltrMgr) setupLocalVolumeDirectory(node *v1.Node, parameters map[string]string) *LocalTestResource {
|
|
hostDir := l.getTestDir()
|
|
mkdirCmd := fmt.Sprintf("mkdir -p %s", hostDir)
|
|
err := l.hostExec.IssueCommand(mkdirCmd, node)
|
|
framework.ExpectNoError(err)
|
|
return &LocalTestResource{
|
|
Node: node,
|
|
Path: hostDir,
|
|
}
|
|
}
|
|
|
|
func (l *ltrMgr) cleanupLocalVolumeDirectory(ltr *LocalTestResource) {
|
|
ginkgo.By("Removing the test directory")
|
|
removeCmd := fmt.Sprintf("rm -r %s", ltr.Path)
|
|
err := l.hostExec.IssueCommand(removeCmd, ltr.Node)
|
|
framework.ExpectNoError(err)
|
|
}
|
|
|
|
func (l *ltrMgr) setupLocalVolumeDirectoryLink(node *v1.Node, parameters map[string]string) *LocalTestResource {
|
|
hostDir := l.getTestDir()
|
|
hostDirBackend := hostDir + "-backend"
|
|
cmd := fmt.Sprintf("mkdir %s && ln -s %s %s", hostDirBackend, hostDirBackend, hostDir)
|
|
err := l.hostExec.IssueCommand(cmd, node)
|
|
framework.ExpectNoError(err)
|
|
return &LocalTestResource{
|
|
Node: node,
|
|
Path: hostDir,
|
|
}
|
|
}
|
|
|
|
func (l *ltrMgr) cleanupLocalVolumeDirectoryLink(ltr *LocalTestResource) {
|
|
ginkgo.By("Removing the test directory")
|
|
hostDir := ltr.Path
|
|
hostDirBackend := hostDir + "-backend"
|
|
removeCmd := fmt.Sprintf("rm -r %s && rm -r %s", hostDir, hostDirBackend)
|
|
err := l.hostExec.IssueCommand(removeCmd, ltr.Node)
|
|
framework.ExpectNoError(err)
|
|
}
|
|
|
|
func (l *ltrMgr) setupLocalVolumeDirectoryBindMounted(node *v1.Node, parameters map[string]string) *LocalTestResource {
|
|
hostDir := l.getTestDir()
|
|
cmd := fmt.Sprintf("mkdir %s && mount --bind %s %s", hostDir, hostDir, hostDir)
|
|
err := l.hostExec.IssueCommand(cmd, node)
|
|
framework.ExpectNoError(err)
|
|
return &LocalTestResource{
|
|
Node: node,
|
|
Path: hostDir,
|
|
}
|
|
}
|
|
|
|
func (l *ltrMgr) cleanupLocalVolumeDirectoryBindMounted(ltr *LocalTestResource) {
|
|
ginkgo.By("Removing the test directory")
|
|
hostDir := ltr.Path
|
|
removeCmd := fmt.Sprintf("umount %s && rm -r %s", hostDir, hostDir)
|
|
err := l.hostExec.IssueCommand(removeCmd, ltr.Node)
|
|
framework.ExpectNoError(err)
|
|
}
|
|
|
|
func (l *ltrMgr) setupLocalVolumeDirectoryLinkBindMounted(node *v1.Node, parameters map[string]string) *LocalTestResource {
|
|
hostDir := l.getTestDir()
|
|
hostDirBackend := hostDir + "-backend"
|
|
cmd := fmt.Sprintf("mkdir %s && mount --bind %s %s && ln -s %s %s", hostDirBackend, hostDirBackend, hostDirBackend, hostDirBackend, hostDir)
|
|
err := l.hostExec.IssueCommand(cmd, node)
|
|
framework.ExpectNoError(err)
|
|
return &LocalTestResource{
|
|
Node: node,
|
|
Path: hostDir,
|
|
}
|
|
}
|
|
|
|
func (l *ltrMgr) cleanupLocalVolumeDirectoryLinkBindMounted(ltr *LocalTestResource) {
|
|
ginkgo.By("Removing the test directory")
|
|
hostDir := ltr.Path
|
|
hostDirBackend := hostDir + "-backend"
|
|
removeCmd := fmt.Sprintf("rm %s && umount %s && rm -r %s", hostDir, hostDirBackend, hostDirBackend)
|
|
err := l.hostExec.IssueCommand(removeCmd, ltr.Node)
|
|
framework.ExpectNoError(err)
|
|
}
|
|
|
|
func (l *ltrMgr) setupLocalVolumeGCELocalSSD(node *v1.Node, parameters map[string]string) *LocalTestResource {
|
|
res, err := l.hostExec.IssueCommandWithResult("ls /mnt/disks/by-uuid/google-local-ssds-scsi-fs/", node)
|
|
framework.ExpectNoError(err)
|
|
dirName := strings.Fields(res)[0]
|
|
hostDir := "/mnt/disks/by-uuid/google-local-ssds-scsi-fs/" + dirName
|
|
return &LocalTestResource{
|
|
Node: node,
|
|
Path: hostDir,
|
|
}
|
|
}
|
|
|
|
func (l *ltrMgr) cleanupLocalVolumeGCELocalSSD(ltr *LocalTestResource) {
|
|
// This filesystem is attached in cluster initialization, we clean all files to make it reusable.
|
|
removeCmd := fmt.Sprintf("find '%s' -mindepth 1 -maxdepth 1 -print0 | xargs -r -0 rm -rf", ltr.Path)
|
|
err := l.hostExec.IssueCommand(removeCmd, ltr.Node)
|
|
framework.ExpectNoError(err)
|
|
}
|
|
|
|
func (l *ltrMgr) expandLocalVolumeBlockFS(ltr *LocalTestResource, mbToAdd int) error {
|
|
ddCmd := fmt.Sprintf("dd if=/dev/zero of=%s/file conv=notrunc oflag=append bs=1M count=%d", ltr.loopDir, mbToAdd)
|
|
loopDev := l.findLoopDevice(ltr.loopDir, ltr.Node)
|
|
losetupCmd := fmt.Sprintf("losetup -c %s", loopDev)
|
|
return l.hostExec.IssueCommand(fmt.Sprintf("%s && %s", ddCmd, losetupCmd), ltr.Node)
|
|
}
|
|
|
|
func (l *ltrMgr) ExpandBlockDevice(ltr *LocalTestResource, mbtoAdd int) error {
|
|
switch ltr.VolumeType {
|
|
case LocalVolumeBlockFS:
|
|
return l.expandLocalVolumeBlockFS(ltr, mbtoAdd)
|
|
}
|
|
return fmt.Errorf("Failed to expand local test resource, unsupported volume type: %s", ltr.VolumeType)
|
|
}
|
|
|
|
func (l *ltrMgr) Create(node *v1.Node, volumeType LocalVolumeType, parameters map[string]string) *LocalTestResource {
|
|
var ltr *LocalTestResource
|
|
switch volumeType {
|
|
case LocalVolumeDirectory:
|
|
ltr = l.setupLocalVolumeDirectory(node, parameters)
|
|
case LocalVolumeDirectoryLink:
|
|
ltr = l.setupLocalVolumeDirectoryLink(node, parameters)
|
|
case LocalVolumeDirectoryBindMounted:
|
|
ltr = l.setupLocalVolumeDirectoryBindMounted(node, parameters)
|
|
case LocalVolumeDirectoryLinkBindMounted:
|
|
ltr = l.setupLocalVolumeDirectoryLinkBindMounted(node, parameters)
|
|
case LocalVolumeTmpfs:
|
|
ltr = l.setupLocalVolumeTmpfs(node, parameters)
|
|
case LocalVolumeBlock:
|
|
ltr = l.setupLocalVolumeBlock(node, parameters)
|
|
case LocalVolumeBlockFS:
|
|
ltr = l.setupLocalVolumeBlockFS(node, parameters)
|
|
case LocalVolumeGCELocalSSD:
|
|
ltr = l.setupLocalVolumeGCELocalSSD(node, parameters)
|
|
default:
|
|
framework.Failf("Failed to create local test resource on node %q, unsupported volume type: %v is specified", node.Name, volumeType)
|
|
return nil
|
|
}
|
|
if ltr == nil {
|
|
framework.Failf("Failed to create local test resource on node %q, volume type: %v, parameters: %v", node.Name, volumeType, parameters)
|
|
}
|
|
ltr.VolumeType = volumeType
|
|
return ltr
|
|
}
|
|
|
|
func (l *ltrMgr) Remove(ltr *LocalTestResource) {
|
|
switch ltr.VolumeType {
|
|
case LocalVolumeDirectory:
|
|
l.cleanupLocalVolumeDirectory(ltr)
|
|
case LocalVolumeDirectoryLink:
|
|
l.cleanupLocalVolumeDirectoryLink(ltr)
|
|
case LocalVolumeDirectoryBindMounted:
|
|
l.cleanupLocalVolumeDirectoryBindMounted(ltr)
|
|
case LocalVolumeDirectoryLinkBindMounted:
|
|
l.cleanupLocalVolumeDirectoryLinkBindMounted(ltr)
|
|
case LocalVolumeTmpfs:
|
|
l.cleanupLocalVolumeTmpfs(ltr)
|
|
case LocalVolumeBlock:
|
|
l.cleanupLocalVolumeBlock(ltr)
|
|
case LocalVolumeBlockFS:
|
|
l.cleanupLocalVolumeBlockFS(ltr)
|
|
case LocalVolumeGCELocalSSD:
|
|
l.cleanupLocalVolumeGCELocalSSD(ltr)
|
|
default:
|
|
framework.Failf("Failed to remove local test resource, unsupported volume type: %v is specified", ltr.VolumeType)
|
|
}
|
|
return
|
|
}
|