diff --git a/Makefile b/Makefile index 4732bc6763..6a3b3face8 100755 --- a/Makefile +++ b/Makefile @@ -21,8 +21,6 @@ VERSION ?= v$(RAW_VERSION) KUBERNETES_VERSION ?= $(shell egrep "DefaultKubernetesVersion =" pkg/minikube/constants/constants.go | cut -d \" -f2) KIC_VERSION ?= $(shell egrep "Version =" pkg/drivers/kic/types.go | cut -d \" -f2) -PRELOADED_TARBALL_VERSION ?= $(shell egrep "PreloadVersion =" pkg/minikube/download/preload.go | cut -d \" -f2) -PRELOADED_VOLUMES_GCS_BUCKET ?= $(shell egrep "PreloadBucket =" pkg/minikube/download/preload.go | cut -d \" -f2) # Default to .0 for higher cache hit rates, as build increments typically don't require new ISO versions ISO_VERSION ?= v$(VERSION_MAJOR).$(VERSION_MINOR).$(VERSION_BUILD) @@ -526,14 +524,8 @@ kic-base-image: ## builds the base image used for kic. docker build -f ./hack/images/kicbase.Dockerfile -t $(REGISTRY)/kicbase:$(KIC_VERSION)-snapshot --build-arg COMMIT_SHA=${VERSION}-$(COMMIT) --target base . .PHONY: upload-preloaded-images-tar -upload-preloaded-images-tar: generate-preloaded-images-tar # Upload the preloaded images tar to the GCS bucket. Specify a specific kubernetes version to build via `KUBERNETES_VERSION=vx.y.z make upload-preloaded-images-tar`. - gsutil cp out/preloaded-images-k8s-${PRELOADED_TARBALL_VERSION}-${KUBERNETES_VERSION}-docker-overlay2.tar.lz4 gs://${PRELOADED_VOLUMES_GCS_BUCKET} - gsutil acl ch -u AllUsers:R gs://${PRELOADED_VOLUMES_GCS_BUCKET}/preloaded-images-k8s-${PRELOADED_TARBALL_VERSION}-${KUBERNETES_VERSION}-docker-overlay2.tar.lz4 - -.PHONY: generate-preloaded-images-tar -generate-preloaded-images-tar: - go run ./hack/preload-images/preload_images.go -kubernetes-version ${KUBERNETES_VERSION} -preloaded-tarball-version ${PRELOADED_TARBALL_VERSION} - +upload-preloaded-images-tar: out/minikube # Upload the preloaded images for oldest supported, newest supported, and default kubernetes versions to GCS. + go run ./hack/preload-images/*.go .PHONY: push-storage-provisioner-image push-storage-provisioner-image: storage-provisioner-image ## Push storage-provisioner docker image using gcloud diff --git a/go.mod b/go.mod index 6777081f84..b1861de795 100644 --- a/go.mod +++ b/go.mod @@ -27,6 +27,8 @@ require ( github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b github.com/google/go-cmp v0.3.1 github.com/google/go-containerregistry v0.0.0-20200131185320-aec8da010de2 + github.com/google/go-github v17.0.0+incompatible + github.com/google/go-github/v29 v29.0.3 // indirect github.com/googleapis/gnostic v0.3.0 // indirect github.com/hashicorp/go-getter v1.4.0 github.com/hashicorp/go-retryablehttp v0.5.4 diff --git a/go.sum b/go.sum index 0cd403ed47..dfeb89780e 100644 --- a/go.sum +++ b/go.sum @@ -68,6 +68,7 @@ github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYU github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/asaskevich/govalidator v0.0.0-20180720115003-f9ffefc3facf/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= +github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a h1:idn718Q4B6AGu/h5Sxe66HYVdqdGu2l9Iebqhi/AEoA= github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= github.com/auth0/go-jwt-middleware v0.0.0-20170425171159-5493cabe49f7/go.mod h1:LWMyo4iOLWXHGdBki7NIht1kHru/0wM179h+d3g8ATM= github.com/aws/aws-sdk-go v1.15.78 h1:LaXy6lWR0YK7LKyuU0QWy2ws/LWTPfYV/UgfiBu4tvY= @@ -93,6 +94,7 @@ github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kB github.com/bifurcation/mint v0.0.0-20180715133206-93c51c6ce115/go.mod h1:zVt7zX3K/aDCk9Tj+VM7YymsX66ERvzCJzw8rFCX2JU= github.com/blang/semver v3.5.0+incompatible h1:CGxCgetQ64DKk7rdZ++Vfnb1+ogGNnB17OJKJXD2Cfs= github.com/blang/semver v3.5.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= +github.com/boltdb/bolt v1.3.1 h1:JQmyP4ZBrce+ZQu0dY660FMfatumYDLun9hBCUVIkF4= github.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx27Ps= github.com/bradfitz/go-smtpd v0.0.0-20170404230938-deb6d6237625/go.mod h1:HYsPBTaaSFSlLx/70C2HPIMNZpVV8+vt/A+FMnYP11g= github.com/c4milo/gotoolkit v0.0.0-20170318115440-bcc06269efa9 h1:+ziP/wVJWuAORkjv7386TRidVKY57X0bXBZFMeFlW+U= @@ -260,6 +262,7 @@ github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh github.com/go-openapi/validate v0.18.0/go.mod h1:Uh4HdOzKt19xGIGm1qHf/ofbX1YQ4Y+MYsct2VUrAJ4= github.com/go-openapi/validate v0.19.2/go.mod h1:1tRCw7m3jtI8eNWEEliiAqUIcBztB2KDnRCRMUi7GTA= github.com/go-openapi/validate v0.19.5/go.mod h1:8DJv2CVJQ6kGNpFW6eV9N3JviE1C85nY1c2z52x1Gk4= +github.com/go-ozzo/ozzo-validation v3.5.0+incompatible h1:sUy/in/P6askYr16XJgTKq/0SZhiWsdg4WZGaLsGQkM= github.com/go-ozzo/ozzo-validation v3.5.0+incompatible/go.mod h1:gsEKFIVnabGBt6mXmxK0MoFy+cZoTJY6mu5Ll3LVLBU= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-toolsmith/astcast v1.0.0/go.mod h1:mt2OdQTeAQcY4DQgPSArJjHCcOwlX+Wl/kwN+LbLGQ4= @@ -335,6 +338,8 @@ github.com/google/go-containerregistry v0.0.0-20200131185320-aec8da010de2 h1:/z0 github.com/google/go-containerregistry v0.0.0-20200131185320-aec8da010de2/go.mod h1:Wtl/v6YdQxv397EREtzwgd9+Ud7Q5D8XMbi3Zazgkrs= github.com/google/go-github v17.0.0+incompatible h1:N0LgJ1j65A7kfXrZnUDaYCs/Sf4rEjNlfyDHW9dolSY= github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ= +github.com/google/go-github/v29 v29.0.3 h1:IktKCTwU//aFHnpA+2SLIi7Oo9uhAzgsdZNbcAqhgdc= +github.com/google/go-github/v29 v29.0.3/go.mod h1:CHKiKKPHJ0REzfwc14QMklvtHwCveD0PxlMjLlzAM5E= github.com/google/go-querystring v1.0.0 h1:Xkwi/a1rcvNg1PPYe5vI8GbeBY/jrVuDX5ASuANWTrk= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/gofuzz v0.0.0-20161122191042-44d81051d367/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= @@ -391,7 +396,9 @@ github.com/hashicorp/golang-lru v0.5.3/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uG github.com/hashicorp/hcl v0.0.0-20180404174102-ef8a98b0bbce/go.mod h1:oZtUIOe8dh44I2q6ScRibXws4Ajl+d+nod3AaR9vL5w= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/heketi/heketi v9.0.1-0.20190917153846-c2e2a4ab7ab9+incompatible h1:ysqc8k973k1lLJ4BOOHAkx14K2nt4cLjsIm+hwWDZDE= github.com/heketi/heketi v9.0.1-0.20190917153846-c2e2a4ab7ab9+incompatible/go.mod h1:bB9ly3RchcQqsQ9CpyaQwvva7RS5ytVoSoholZQON6o= +github.com/heketi/tests v0.0.0-20151005000721-f3775cbcefd6 h1:oJ/NLadJn5HoxvonA6VxG31lg0d6XOURNA09BTtM4fY= github.com/heketi/tests v0.0.0-20151005000721-f3775cbcefd6/go.mod h1:xGMAM8JLi7UkZt1i4FQeQy0R2T8GLUwQhOP5M1gBhy4= github.com/hooklift/assert v0.0.0-20170704181755-9d1defd6d214 h1:WgfvpuKg42WVLkxNwzfFraXkTXPK36bMqXvMFN67clI= github.com/hooklift/assert v0.0.0-20170704181755-9d1defd6d214/go.mod h1:kj6hFWqfwSjFjLnYW5PK1DoxZ4O0uapwHRmd9jhln4E= diff --git a/hack/jenkins/preload_generation.sh b/hack/jenkins/preload_generation.sh new file mode 100644 index 0000000000..66e2ba1125 --- /dev/null +++ b/hack/jenkins/preload_generation.sh @@ -0,0 +1,28 @@ +#!/bin/bash + +# Copyright 2016 The Kubernetes Authors All rights reserved. +# +# 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. + +# This script builds all the minikube binary for all 3 platforms as well as Windows-installer and .deb +# This is intended to be run on a new release tag in order to build/upload the required files for a release + + +set -eux -o pipefail + +# Make sure the right golang version is installed based on Makefile +WANT_GOLANG_VERSION=$(grep '^GO_VERSION' Makefile | awk '{ print $3 }') +./hack/jenkins/installers/check_install_golang.sh $WANT_GOLANG_VERSION /usr/local + +make upload-preloaded-images-tar +make clean diff --git a/hack/preload-images/generate.go b/hack/preload-images/generate.go new file mode 100644 index 0000000000..a3160bc5a1 --- /dev/null +++ b/hack/preload-images/generate.go @@ -0,0 +1,125 @@ +/* +Copyright 2020 The Kubernetes Authors All rights reserved. + +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 main + +import ( + "fmt" + "os" + "os/exec" + "path/filepath" + + "github.com/pkg/errors" + "k8s.io/minikube/pkg/drivers/kic" + "k8s.io/minikube/pkg/drivers/kic/oci" + "k8s.io/minikube/pkg/minikube/bootstrapper/bsutil" + "k8s.io/minikube/pkg/minikube/bootstrapper/images" + "k8s.io/minikube/pkg/minikube/command" + "k8s.io/minikube/pkg/minikube/config" + "k8s.io/minikube/pkg/minikube/driver" + "k8s.io/minikube/pkg/minikube/localpath" +) + +func generateTarball(kubernetesVersion, tarballFilename string) error { + defer func() { + if err := deleteMinikube(); err != nil { + fmt.Println(err) + } + }() + + driver := kic.NewDriver(kic.Config{ + KubernetesVersion: kubernetesVersion, + ContainerRuntime: driver.Docker, + OCIBinary: oci.Docker, + MachineName: profile, + ImageDigest: kic.BaseImage, + StorePath: localpath.MiniPath(), + CPU: 2, + Memory: 4000, + APIServerPort: 8080, + }) + + baseDir := filepath.Dir(driver.GetSSHKeyPath()) + defer os.Remove(baseDir) + + if err := os.MkdirAll(baseDir, 0755); err != nil { + return errors.Wrap(err, "mkdir") + } + if err := driver.Create(); err != nil { + return errors.Wrap(err, "creating kic driver") + } + + // Now, get images to pull + imgs, err := images.Kubeadm("", kubernetesVersion) + if err != nil { + return errors.Wrap(err, "kubeadm images") + } + + for _, img := range append(imgs, kic.OverlayImage) { + cmd := exec.Command("docker", "exec", profile, "docker", "pull", img) + cmd.Stdout = os.Stdout + cmd.Stderr = os.Stderr + if err := cmd.Run(); err != nil { + return errors.Wrapf(err, "downloading %s", img) + } + } + + // Transfer in k8s binaries + kcfg := config.KubernetesConfig{ + KubernetesVersion: kubernetesVersion, + } + runner := command.NewKICRunner(profile, driver.OCIBinary) + if err := bsutil.TransferBinaries(kcfg, runner); err != nil { + return errors.Wrap(err, "transferring k8s binaries") + } + // Create image tarball + if err := createImageTarball(tarballFilename); err != nil { + return errors.Wrap(err, "create tarball") + } + return copyTarballToHost(tarballFilename) +} + +func createImageTarball(tarballFilename string) error { + dirs := []string{ + fmt.Sprintf("./lib/docker/%s", dockerStorageDriver), + "./lib/docker/image", + "./lib/minikube/binaries", + } + args := []string{"exec", profile, "sudo", "tar", "-I", "lz4", "-C", "/var", "-cvf", tarballFilename} + args = append(args, dirs...) + cmd := exec.Command("docker", args...) + cmd.Stdout = os.Stdout + if err := cmd.Run(); err != nil { + return errors.Wrapf(err, "tarball cmd: %s", cmd.Args) + } + return nil +} + +func copyTarballToHost(tarballFilename string) error { + dest := filepath.Join("out/", tarballFilename) + cmd := exec.Command("docker", "cp", fmt.Sprintf("%s:/%s", profile, tarballFilename), dest) + cmd.Stdout = os.Stdout + if err := cmd.Run(); err != nil { + return errors.Wrapf(err, "cp cmd: %s", cmd.Args) + } + return nil +} + +func deleteMinikube() error { + cmd := exec.Command(minikubePath, "delete", "-p", profile) + cmd.Stdout = os.Stdout + return cmd.Run() +} diff --git a/hack/preload-images/kubernetes.go b/hack/preload-images/kubernetes.go new file mode 100644 index 0000000000..1114d39e12 --- /dev/null +++ b/hack/preload-images/kubernetes.go @@ -0,0 +1,40 @@ +/* +Copyright 2020 The Kubernetes Authors All rights reserved. + +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 main + +import ( + "context" + + "github.com/golang/glog" + "github.com/google/go-github/github" +) + +// RecentK8sVersions returns the most recent k8s version, usually around 30 +func RecentK8sVersions() ([]string, error) { + client := github.NewClient(nil) + k8s := "kubernetes" + list, _, err := client.Repositories.ListReleases(context.Background(), k8s, k8s, &github.ListOptions{}) + if err != nil { + return nil, err + } + var releases []string + for _, r := range list { + releases = append(releases, r.GetTagName()) + } + glog.Infof("Got releases: %v", releases) + return releases, nil +} diff --git a/hack/preload-images/preload_images.go b/hack/preload-images/preload_images.go index 1c6c858331..ceb0e5021b 100644 --- a/hack/preload-images/preload_images.go +++ b/hack/preload-images/preload_images.go @@ -20,20 +20,11 @@ import ( "bytes" "flag" "fmt" - "os" "os/exec" - "path/filepath" "strings" - "github.com/pkg/errors" - "k8s.io/minikube/pkg/drivers/kic" - "k8s.io/minikube/pkg/drivers/kic/oci" - "k8s.io/minikube/pkg/minikube/bootstrapper/bsutil" - "k8s.io/minikube/pkg/minikube/bootstrapper/images" - "k8s.io/minikube/pkg/minikube/command" - "k8s.io/minikube/pkg/minikube/config" - "k8s.io/minikube/pkg/minikube/driver" - "k8s.io/minikube/pkg/minikube/localpath" + "k8s.io/minikube/pkg/minikube/download" + "k8s.io/minikube/pkg/minikube/exit" ) const ( @@ -42,123 +33,56 @@ const ( ) var ( - kubernetesVersion = "" - tarballFilename = "" - dockerStorageDriver = "" - preloadedTarballVersion = "" - containerRuntime = "" + dockerStorageDriver = "overlay2" + preloadedTarballVersion = "v1" + containerRuntimes = []string{"docker"} + k8sVersion string + k8sVersions []string ) func init() { - flag.StringVar(&kubernetesVersion, "kubernetes-version", "", "desired kubernetes version, for example `v1.17.2`") - flag.StringVar(&dockerStorageDriver, "docker-storage-driver", "overlay2", "docker storage driver backend") - flag.StringVar(&preloadedTarballVersion, "preloaded-tarball-version", "", "preloaded tarball version") - flag.StringVar(&containerRuntime, "container-runtime", "docker", "container runtime") - + flag.StringVar(&k8sVersion, "kubernetes-version", "", "desired kubernetes version, for example `v1.17.2`") flag.Parse() - tarballFilename = fmt.Sprintf("preloaded-images-k8s-%s-%s-%s-%s.tar.lz4", preloadedTarballVersion, kubernetesVersion, containerRuntime, dockerStorageDriver) + if k8sVersion != "" { + k8sVersions = append(k8sVersions, k8sVersion) + } } func main() { if err := verifyDockerStorage(); err != nil { - fmt.Println(err) - os.Exit(1) + exit.WithError("Docker storage type is incompatible: %v\n", err) } - if err := executePreloadImages(); err != nil { - fmt.Println(err) - os.Exit(1) - } -} - -func executePreloadImages() error { - defer func() { - if err := deleteMinikube(); err != nil { - fmt.Println(err) - } - }() - - driver := kic.NewDriver(kic.Config{ - KubernetesVersion: kubernetesVersion, - ContainerRuntime: driver.Docker, - OCIBinary: oci.Docker, - MachineName: profile, - ImageDigest: kic.BaseImage, - StorePath: localpath.MiniPath(), - CPU: 2, - Memory: 4000, - APIServerPort: 8080, - }) - - baseDir := filepath.Dir(driver.GetSSHKeyPath()) - defer os.Remove(baseDir) - - if err := os.MkdirAll(baseDir, 0755); err != nil { - return errors.Wrap(err, "mkdir") - } - if err := driver.Create(); err != nil { - return errors.Wrap(err, "creating kic driver") - } - - // Now, get images to pull - imgs, err := images.Kubeadm("", kubernetesVersion) - if err != nil { - return errors.Wrap(err, "kubeadm images") - } - - for _, img := range append(imgs, kic.OverlayImage) { - cmd := exec.Command("docker", "exec", profile, "docker", "pull", img) - cmd.Stdout = os.Stdout - cmd.Stderr = os.Stderr - if err := cmd.Run(); err != nil { - return errors.Wrapf(err, "downloading %s", img) + if k8sVersions == nil { + var err error + k8sVersions, err = RecentK8sVersions() + if err != nil { + exit.WithError("Unable to get recent k8s versions: %v\n", err) } } - // Transfer in k8s binaries - kcfg := config.KubernetesConfig{ - KubernetesVersion: kubernetesVersion, + for _, kv := range k8sVersions { + for _, cr := range containerRuntimes { + tf := download.TarballName(kv) + if tarballExists(tf) { + fmt.Printf("A preloaded tarball for k8s version %s already exists, skipping generation.\n", kv) + continue + } + fmt.Printf("A preloaded tarball for k8s version %s doesn't exist, generating now...\n", kv) + if err := generateTarball(kv, tf); err != nil { + exit.WithError(fmt.Sprintf("generating tarball for k8s version %s with %s", kv, cr), err) + } + if err := uploadTarball(tf); err != nil { + exit.WithError(fmt.Sprintf("uploading tarball for k8s version %s with %s", kv, cr), err) + } + } } - runner := command.NewKICRunner(profile, driver.OCIBinary) - if err := bsutil.TransferBinaries(kcfg, runner); err != nil { - return errors.Wrap(err, "transferring k8s binaries") - } - // Create image tarball - if err := createImageTarball(); err != nil { - return errors.Wrap(err, "create tarball") - } - return copyTarballToHost() } -func createImageTarball() error { - dirs := []string{ - fmt.Sprintf("./lib/docker/%s", dockerStorageDriver), - "./lib/docker/image", - "./lib/minikube/binaries", - } - args := []string{"exec", profile, "sudo", "tar", "-I", "lz4", "-C", "/var", "-cvf", tarballFilename} - args = append(args, dirs...) - cmd := exec.Command("docker", args...) - cmd.Stdout = os.Stdout - if err := cmd.Run(); err != nil { - return errors.Wrapf(err, "tarball cmd: %s", cmd.Args) - } - return nil -} - -func copyTarballToHost() error { - dest := filepath.Join("out/", tarballFilename) - cmd := exec.Command("docker", "cp", fmt.Sprintf("%s:/%s", profile, tarballFilename), dest) - cmd.Stdout = os.Stdout - if err := cmd.Run(); err != nil { - return errors.Wrapf(err, "cp cmd: %s", cmd.Args) - } - return nil -} - -func deleteMinikube() error { - cmd := exec.Command(minikubePath, "delete", "-p", profile) - cmd.Stdout = os.Stdout - return cmd.Run() +func tarballExists(tarballFilename string) bool { + fmt.Println("Checking if tarball already exists...") + gcsPath := fmt.Sprintf("gs://%s/%s", download.PreloadBucket, tarballFilename) + cmd := exec.Command("gsutil", "stat", gcsPath) + return cmd.Run() == nil } func verifyDockerStorage() error { diff --git a/hack/preload-images/upload.go b/hack/preload-images/upload.go new file mode 100644 index 0000000000..a2181294e6 --- /dev/null +++ b/hack/preload-images/upload.go @@ -0,0 +1,43 @@ +/* +Copyright 2020 The Kubernetes Authors All rights reserved. + +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 main + +import ( + "fmt" + "os/exec" + "path" + + "github.com/pkg/errors" + "k8s.io/minikube/pkg/minikube/download" +) + +func uploadTarball(tarballFilename string) error { + // Upload tarball to GCS + hostPath := path.Join("out/", tarballFilename) + gcsDest := fmt.Sprintf("gs://%s", download.PreloadBucket) + cmd := exec.Command("gsutil", "cp", hostPath, gcsDest) + if output, err := cmd.Output(); err != nil { + return errors.Wrapf(err, "uploading %s to GCS bucket: %v\n%s", hostPath, err, string(output)) + } + // Make tarball public to all users + gcsPath := fmt.Sprintf("%s/%s", gcsDest, tarballFilename) + cmd = exec.Command("gsutil", "acl", "ch", "-u", "AllUsers:R", gcsPath) + if output, err := cmd.Output(); err != nil { + return errors.Wrapf(err, "uploading %s to GCS bucket: %v\n%s", hostPath, err, string(output)) + } + return nil +} diff --git a/pkg/minikube/download/preload.go b/pkg/minikube/download/preload.go index 62893edf1b..08f7e307c4 100644 --- a/pkg/minikube/download/preload.go +++ b/pkg/minikube/download/preload.go @@ -42,14 +42,14 @@ const ( PreloadBucket = "minikube-preloaded-volume-tarballs" ) -// returns name of the tarball -func tarballName(k8sVersion string) string { - return fmt.Sprintf("preloaded-images-k8s-%s-%s-docker-overlay2.tar.lz4", PreloadVersion, k8sVersion) +// TarballName returns name of the tarball +func TarballName(k8sVersion string) string { + return fmt.Sprintf("preloaded-images-k8s-%s-%s-docker-overlay2-amd64.tar.lz4", PreloadVersion, k8sVersion) } // returns the name of the checksum file func checksumName(k8sVersion string) string { - return fmt.Sprintf("%s.checksum", tarballName(k8sVersion)) + return fmt.Sprintf("%s.checksum", TarballName(k8sVersion)) } // returns target dir for all cached items related to preloading @@ -64,12 +64,12 @@ func PreloadChecksumPath(k8sVersion string) string { // TarballPath returns the path to the preloaded tarball func TarballPath(k8sVersion string) string { - return path.Join(targetDir(), tarballName(k8sVersion)) + return path.Join(targetDir(), TarballName(k8sVersion)) } // remoteTarballURL returns the URL for the remote tarball in GCS func remoteTarballURL(k8sVersion string) string { - return fmt.Sprintf("https://storage.googleapis.com/%s/%s", PreloadBucket, tarballName(k8sVersion)) + return fmt.Sprintf("https://storage.googleapis.com/%s/%s", PreloadBucket, TarballName(k8sVersion)) } // PreloadExists returns true if there is a preloaded tarball that can be used @@ -147,13 +147,13 @@ func Preload(k8sVersion, containerRuntime string) error { } func saveChecksumFile(k8sVersion string) error { - glog.Infof("saving checksum for %s ...", tarballName(k8sVersion)) + glog.Infof("saving checksum for %s ...", TarballName(k8sVersion)) ctx := context.Background() client, err := storage.NewClient(ctx, option.WithoutAuthentication()) if err != nil { return errors.Wrap(err, "getting storage client") } - attrs, err := client.Bucket(PreloadBucket).Object(tarballName(k8sVersion)).Attrs(ctx) + attrs, err := client.Bucket(PreloadBucket).Object(TarballName(k8sVersion)).Attrs(ctx) if err != nil { return errors.Wrap(err, "getting storage object") }