Return an entire options struct

pull/6603/head
tstromberg 2020-02-13 16:50:53 -08:00
parent 250e00564b
commit 9b1d2da478
2 changed files with 72 additions and 15 deletions

View File

@ -57,19 +57,26 @@ func releaseURL(binaryName, version, osName, archName string) string {
return fmt.Sprintf("https://storage.googleapis.com/kubernetes-release/release/%s/bin/%s/%s/%s", version, osName, archName, binaryName)
}
// checksumVerifier returns the binary checksum URL and hash method
func checksumVerifier(binaryName, version, osName, archName string) (string, crypto.Hash, error) {
binURL := releaseURL(binaryName, version, osName, archName)
// downloadOptions returns appropriate download options for a
func downloadOptions(url string, version string) (download.FileOptions, error) {
fo := download.FileOptions{
Mkdirs: download.MkdirAll,
Options: download.Options{
ChecksumHash: crypto.SHA1,
Checksum: url + ".sha1",
},
}
v, err := semver.Make(version[1:])
if err != nil {
return "", 0, err
return fo, err
}
if v.GTE(semver.MustParse("1.17.0")) {
return binURL + ".sha256", crypto.SHA256, nil
fo.ChecksumHash = crypto.SHA256
fo.Checksum = url + ".sha256"
}
return binURL + ".sha1", crypto.SHA1, nil
return fo, nil
}
// CacheBinary will cache a binary on the host
@ -94,17 +101,10 @@ func CacheBinary(binary, version, osName, archName string) (string, error) {
return "", errors.Wrapf(err, "mkdir %s", targetDir)
}
options := download.FileOptions{
Mkdirs: download.MkdirAll,
}
ckURL, ckAlgo, err := checksumVerifier(binary, version, osName, archName)
options, err := downloadOptions(url, version)
if err != nil {
return "", errors.Wrap(err, "verifier")
return "", errors.Wrap(err, "options")
}
options.Checksum = ckURL
options.ChecksumHash = ckAlgo
glog.Infof("Downloading %s: options: %+v", url, options)
out.T(out.FileDownload, "Downloading {{.name}} {{.version}}", out.V{"name": binary, "version": version})

View File

@ -17,12 +17,15 @@ limitations under the License.
package machine
import (
"crypto"
"fmt"
"io/ioutil"
"os"
"runtime"
"testing"
"github.com/google/go-cmp/cmp"
"github.com/jimmidyson/go-download"
"k8s.io/minikube/pkg/minikube/assets"
"k8s.io/minikube/pkg/minikube/bootstrapper"
"k8s.io/minikube/pkg/minikube/command"
@ -215,3 +218,57 @@ func TestCacheBinary(t *testing.T) {
})
}
}
func TestDownloadOptions(t *testing.T) {
var tc = []struct {
url string
version string
want download.FileOptions
}{
{
url: "https://s/kubernetes-release/release/v1.16.0/bin/amd64/kubectl",
version: "v1.16.0",
want: download.FileOptions{
download.Options{
Checksum: "https://s/kubernetes-release/release/v1.16.0/bin/amd64/kubectl.sha1",
ChecksumHash: crypto.SHA1,
},
download.MkdirAll,
},
},
{
url: "https://s/kubernetes-release/release/v1.10.0/bin/hp9k/kubeadm",
version: "v1.10.0",
want: download.FileOptions{
download.Options{
Checksum: "https://s/kubernetes-release/release/v1.10.0/bin/hp9k/kubeadm.sha1",
ChecksumHash: crypto.SHA1,
},
download.MkdirAll,
},
},
{
url: "https://s/kubernetes-release/release/v1.18.0/bin/arm64/kubelet",
version: "v1.18.0",
want: download.FileOptions{
download.Options{
Checksum: "https://s/kubernetes-release/release/v1.18.0/bin/arm64/kubelet.sha256",
ChecksumHash: crypto.SHA256,
},
download.MkdirAll,
},
},
}
for _, test := range tc {
t.Run(test.version, func(t *testing.T) {
got, err := downloadOptions(test.url, test.version)
if err != nil {
t.Fatalf("unexpected error %v", err)
}
if diff := cmp.Diff(test.want, got); diff != "" {
t.Errorf("unexpected options(-want +got):\n%s", diff)
}
})
}
}