From 5d66427c0427881ffe598998f8e0eeb5beb891c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20F=20Bj=C3=B6rklund?= Date: Mon, 31 Jul 2023 15:09:23 +0200 Subject: [PATCH] Verify containerd storage separately from docker --- hack/preload-images/generate.go | 7 ++++- hack/preload-images/preload_images.go | 42 ++++++++++++++++++++------- 2 files changed, 38 insertions(+), 11 deletions(-) diff --git a/hack/preload-images/generate.go b/hack/preload-images/generate.go index 92e455e1ea..3d734b740f 100644 --- a/hack/preload-images/generate.go +++ b/hack/preload-images/generate.go @@ -136,11 +136,16 @@ func generateTarball(kubernetesVersion, containerRuntime, tarballFilename string } func verifyStorage(containerRuntime string) error { - if containerRuntime == "docker" || containerRuntime == "containerd" { + if containerRuntime == "docker" { if err := retry.Expo(verifyDockerStorage, 100*time.Microsecond, time.Minute*2); err != nil { return errors.Wrap(err, "Docker storage type is incompatible") } } + if containerRuntime == "containerd" { + if err := retry.Expo(verifyContainerdStorage, 100*time.Microsecond, time.Minute*2); err != nil { + return errors.Wrap(err, "containerd storage type is incompatible") + } + } if containerRuntime == "cri-o" { if err := retry.Expo(verifyPodmanStorage, 100*time.Microsecond, time.Minute*2); err != nil { return errors.Wrap(err, "Podman storage type is incompatible") diff --git a/hack/preload-images/preload_images.go b/hack/preload-images/preload_images.go index 6a27e4c0b2..e7e87522df 100644 --- a/hack/preload-images/preload_images.go +++ b/hack/preload-images/preload_images.go @@ -41,16 +41,17 @@ const ( ) var ( - dockerStorageDriver = "overlay2" - podmanStorageDriver = "overlay" - containerRuntimes = []string{"docker", "containerd", "cri-o"} - k8sVersions []string - k8sVersion = flag.String("kubernetes-version", "", "desired Kubernetes version, for example `v1.17.2`") - noUpload = flag.Bool("no-upload", false, "Do not upload tarballs to GCS") - force = flag.Bool("force", false, "Generate the preload tarball even if it's already exists") - limit = flag.Int("limit", 0, "Limit the number of tarballs to generate") - armUpload = flag.Bool("arm-upload", false, "Upload the arm64 preload tarballs to GCS") - armPreloadsDir = flag.String("arm-preloads-dir", "artifacts", "Directory containing the arm64 preload tarballs") + dockerStorageDriver = "overlay2" + containerdSnapshotter = "overlayfs" + podmanStorageDriver = "overlay" + containerRuntimes = []string{"docker", "containerd", "cri-o"} + k8sVersions []string + k8sVersion = flag.String("kubernetes-version", "", "desired Kubernetes version, for example `v1.17.2`") + noUpload = flag.Bool("no-upload", false, "Do not upload tarballs to GCS") + force = flag.Bool("force", false, "Generate the preload tarball even if it's already exists") + limit = flag.Int("limit", 0, "Limit the number of tarballs to generate") + armUpload = flag.Bool("arm-upload", false, "Upload the arm64 preload tarballs to GCS") + armPreloadsDir = flag.String("arm-preloads-dir", "artifacts", "Directory containing the arm64 preload tarballs") ) type preloadCfg struct { @@ -179,6 +180,27 @@ var verifyDockerStorage = func() error { return nil } +var verifyContainerdStorage = func() error { + cmd := exec.Command("docker", "exec", profile, "sudo", "containerd", "config", "dump") + var stderr bytes.Buffer + cmd.Stderr = &stderr + output, err := cmd.Output() + if err != nil { + return fmt.Errorf("%v: %v:\n%s", cmd.Args, err, stderr.String()) + } + var driver string + for _, line := range strings.Split(string(output), "\n") { + if strings.Contains(line, "snapshotter = ") { + driver = strings.Split(line, " = ")[1] + driver = strings.Trim(driver, "\"") + } + } + if driver != containerdSnapshotter { + return fmt.Errorf("containerd snapshotter %s does not match requested %s", driver, containerdSnapshotter) + } + return nil +} + var verifyPodmanStorage = func() error { cmd := exec.Command("docker", "exec", profile, "sudo", "podman", "info", "-f", "json") var stderr bytes.Buffer