diff --git a/test/e2e/storage/drivers/proxy/io.go b/test/e2e/storage/drivers/proxy/io.go index b44962a32d4..df0a06c01d4 100644 --- a/test/e2e/storage/drivers/proxy/io.go +++ b/test/e2e/storage/drivers/proxy/io.go @@ -17,9 +17,11 @@ limitations under the License. package proxy import ( + "encoding/base64" "fmt" "io" + "k8s.io/klog/v2" "k8s.io/kubernetes/test/e2e/framework" e2epod "k8s.io/kubernetes/test/e2e/framework/pod" "k8s.io/kubernetes/test/e2e/storage/drivers/csi-test/mock/service" @@ -30,6 +32,7 @@ type PodDirIO struct { Namespace string PodName string ContainerName string + Logger *klog.Logger } var _ service.DirIO = PodDirIO{} @@ -64,9 +67,23 @@ func (p PodDirIO) Mkdir(path string) error { } func (p PodDirIO) CreateFile(path string, content io.Reader) error { - _, stderr, err := p.execute([]string{"dd", "of=" + path}, content) + // Piping the content into dd via stdin turned out to be unreliable. + // Sometimes dd would stop after writing zero bytes, without an error + // from ExecWithOptions (reported as + // https://github.com/kubernetes/kubernetes/issues/112834). + // + // Therefore the content is now encoded inside the command itself. + data, err := io.ReadAll(content) if err != nil { - return fmt.Errorf("dd of=%s: stderr=%q, %v", path, stderr, err) + return fmt.Errorf("read content: %v", err) + } + encoded := make([]byte, base64.StdEncoding.EncodedLen(len(data))) + base64.StdEncoding.Encode(encoded, data) + _, stderr, err := p.execute([]string{"sh", "-c", fmt.Sprintf(`base64 -d >'%s' <