rebased, fixed merge conflicts
commit
24a2748af8
|
@ -29,12 +29,12 @@ _testmain.go
|
|||
/out
|
||||
/_gopath
|
||||
|
||||
|
||||
#iso version file
|
||||
deploy/iso/minikube-iso/board/coreos/minikube/rootfs-overlay/etc/VERSION
|
||||
|
||||
/pkg/minikube/assets/assets.go
|
||||
/pkg/minikube/translate/translations.go
|
||||
/pkg/minikube/translate/translations.go-e
|
||||
/minikube
|
||||
|
||||
.DS_Store
|
||||
|
@ -42,3 +42,5 @@ deploy/iso/minikube-iso/board/coreos/minikube/rootfs-overlay/etc/VERSION
|
|||
/.idea
|
||||
|
||||
/.vscode
|
||||
|
||||
test/integration/testdata/minikube-linux-amd64-latest-stable
|
||||
|
|
|
@ -1,3 +1,3 @@
|
|||
[submodule "site/themes/hugo-whisper-theme"]
|
||||
path = site/themes/hugo-whisper-theme
|
||||
url = https://github.com/jugglerx/hugo-whisper-theme.git
|
||||
[submodule "site/themes/docsy"]
|
||||
path = site/themes/docsy
|
||||
url = https://github.com/google/docsy.git
|
||||
|
|
|
@ -1,9 +1,12 @@
|
|||
language: go
|
||||
os: linux
|
||||
sudo: required
|
||||
|
||||
go:
|
||||
- 1.x
|
||||
matrix:
|
||||
include:
|
||||
- go: 1.12.7
|
||||
- language: python
|
||||
before_install: pip install flake8
|
||||
script: flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics
|
||||
|
||||
before_install:
|
||||
- sudo apt-get install -y libvirt-dev
|
||||
|
|
63
CHANGELOG.md
63
CHANGELOG.md
|
@ -1,4 +1,65 @@
|
|||
# Minikube Release Notes
|
||||
# Release Notes
|
||||
|
||||
## Version 1.3.0 - 2019-08-XX (TBD)
|
||||
|
||||
* Added a new command: profile list [#4811](https://github.com/kubernetes/minikube/pull/4811)
|
||||
* Update latest kubernetes version to v1.15.1 [#4915](https://github.com/kubernetes/minikube/pull/4915)
|
||||
* logs: Add container status & cruntime logs [#4960](https://github.com/kubernetes/minikube/pull/4960)
|
||||
* Automatically set flags for MINIKUBE_ prefixed env vars [#4607](https://github.com/kubernetes/minikube/pull/4607)
|
||||
* hyperv: Run "sudo poweroff" before stopping VM [#4758](https://github.com/kubernetes/minikube/pull/4758)
|
||||
* Decrease ReasonableStartTime from 10 minutes to 5 minutes [#4961](https://github.com/kubernetes/minikube/pull/4961)
|
||||
* Remove ingress-nginx default backend [#4786](https://github.com/kubernetes/minikube/pull/4786)
|
||||
* Upgrade nginx ingress to 0.25.0 [#4785](https://github.com/kubernetes/minikube/pull/4785)
|
||||
* Bump k8s.io/kubernetes to 1.15.0 [#4719](https://github.com/kubernetes/minikube/pull/4719)
|
||||
* Upgrade Docker, from 18.09.7 to 18.09.8 [#4818](https://github.com/kubernetes/minikube/pull/4818)
|
||||
* Upgrade Docker, from 18.09.6 to 18.09.7 [#4657](https://github.com/kubernetes/minikube/pull/4657)
|
||||
* Upgrade crio to 1.15.0 [#4703](https://github.com/kubernetes/minikube/pull/4703)
|
||||
* Update crictl to v1.15.0 [#4761](https://github.com/kubernetes/minikube/pull/4761)
|
||||
* Upgrade Podman to 1.4 [#4610](https://github.com/kubernetes/minikube/pull/4610)
|
||||
* Upgrade libmachine to master [#4817](https://github.com/kubernetes/minikube/pull/4817)
|
||||
* Add linux packaging for the kvm2 driver binary [#4556](https://github.com/kubernetes/minikube/pull/4556)
|
||||
* Unset profile when it is deleted [#4922](https://github.com/kubernetes/minikube/pull/4922)
|
||||
* more reliable stop for none driver [#4871](https://github.com/kubernetes/minikube/pull/4871)
|
||||
* Fix regression caused by registry-proxy [#4805](https://github.com/kubernetes/minikube/pull/4805)
|
||||
* Warn if hyperkit version is old [#4691](https://github.com/kubernetes/minikube/pull/4691)
|
||||
* Add warn if kvm driver version is old [#4676](https://github.com/kubernetes/minikube/pull/4676)
|
||||
* Add T versions of the console convenience functions [#4796](https://github.com/kubernetes/minikube/pull/4796)
|
||||
* Remove deprecated drivers: kvm-old and xhyve [#4781](https://github.com/kubernetes/minikube/pull/4781)
|
||||
* Don't disable other container engines when --vm_driver=none [#4545](https://github.com/kubernetes/minikube/pull/4545)
|
||||
* Proxy: handle lower case proxy env vars [#4602](https://github.com/kubernetes/minikube/pull/4602)
|
||||
* virtualbox: Make DNS settings configurable [#4619](https://github.com/kubernetes/minikube/pull/4619)
|
||||
* Add support to custom qemu uri on kvm2 driver [#4401](https://github.com/kubernetes/minikube/pull/4401)
|
||||
* Update Ingress-NGINX to 0.24.1 Release [#4583](https://github.com/kubernetes/minikube/pull/4583)
|
||||
|
||||
A big thanks goes out to our crew of merry contributors:
|
||||
|
||||
- Aida Ghazizadeh
|
||||
- Anders F Björklund
|
||||
- Ben Ebsworth
|
||||
- Benjamin Howell
|
||||
- cclauss
|
||||
- Christophe VILA
|
||||
- Deepjyoti Mondal
|
||||
- fang duan
|
||||
- Francis
|
||||
- Gustavo Belfort
|
||||
- Himanshu Pandey
|
||||
- Jituri, Pranav
|
||||
- josedonizetti
|
||||
- Jose Donizetti
|
||||
- Kazuki Suda
|
||||
- Kyle Bai
|
||||
- Marcos Diez
|
||||
- Medya Ghazizadeh
|
||||
- Nabarun Pal
|
||||
- Om Kumar
|
||||
- Pranav Jituri
|
||||
- RA489
|
||||
- serhat çetinkaya
|
||||
- Sharif Elgamal
|
||||
- Stuart P. Bentley
|
||||
- Thomas Strömberg
|
||||
- Zoltán Reegn
|
||||
|
||||
## Version 1.2.0 - 2019-06-24
|
||||
|
||||
|
|
119
Makefile
119
Makefile
|
@ -14,7 +14,7 @@
|
|||
|
||||
# Bump these on release - and please check ISO_VERSION for correctness.
|
||||
VERSION_MAJOR ?= 1
|
||||
VERSION_MINOR ?= 2
|
||||
VERSION_MINOR ?= 3
|
||||
VERSION_BUILD ?= 0
|
||||
# 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).0
|
||||
|
@ -31,21 +31,35 @@ COMMIT_NO := $(shell git rev-parse HEAD 2> /dev/null || true)
|
|||
COMMIT ?= $(if $(shell git status --porcelain --untracked-files=no),"${COMMIT_NO}-dirty","${COMMIT_NO}")
|
||||
|
||||
HYPERKIT_BUILD_IMAGE ?= karalabe/xgo-1.12.x
|
||||
# NOTE: "latest" as of 2019-05-09. kube-cross images aren't updated as often as Kubernetes
|
||||
BUILD_IMAGE ?= k8s.gcr.io/kube-cross:v1.12.5-1
|
||||
# NOTE: "latest" as of 2019-07-12. kube-cross images aren't updated as often as Kubernetes
|
||||
BUILD_IMAGE ?= k8s.gcr.io/kube-cross:v1.12.7-1
|
||||
ISO_BUILD_IMAGE ?= $(REGISTRY)/buildroot-image
|
||||
KVM_BUILD_IMAGE ?= $(REGISTRY)/kvm-build-image
|
||||
KVM_BUILD_IMAGE ?= $(REGISTRY)/kvm-build-image:$(GO_VERSION)
|
||||
|
||||
ISO_BUCKET ?= minikube/iso
|
||||
|
||||
MINIKUBE_VERSION ?= $(ISO_VERSION)
|
||||
MINIKUBE_BUCKET ?= minikube/releases
|
||||
MINIKUBE_UPLOAD_LOCATION := gs://${MINIKUBE_BUCKET}
|
||||
MINIKUBE_RELEASES_URL=https://github.com/kubernetes/minikube/releases/download
|
||||
|
||||
KERNEL_VERSION ?= 4.16.14
|
||||
KERNEL_VERSION ?= 4.15
|
||||
|
||||
# Currently *only* used for the KVM_BUILD_IMAGE, see also BUILD_IMAGE above
|
||||
GO_VERSION ?= 1.12.7
|
||||
|
||||
GO_VERSION ?= $(shell go version | cut -d' ' -f3 | sed -e 's/go//')
|
||||
GOLINT_VERSION ?= v1.17.1
|
||||
# Limit number of default jobs, to avoid the CI builds running out of memory
|
||||
GOLINT_JOBS ?= 4
|
||||
# see https://github.com/golangci/golangci-lint#memory-usage-of-golangci-lint
|
||||
GOLINT_GOGC ?= 8
|
||||
# options for lint (golangci-lint)
|
||||
GOLINT_OPTIONS = --deadline 4m \
|
||||
--build-tags "${MINIKUBE_INTEGRATION_BUILD_TAGS}" \
|
||||
--enable goimports,gocritic,golint,gocyclo,interfacer,misspell,nakedret,stylecheck,unconvert,unparam \
|
||||
--exclude 'variable on range scope.*in function literal|ifElseChain'
|
||||
|
||||
|
||||
export GO111MODULE := on
|
||||
|
||||
GOOS ?= $(shell go env GOOS)
|
||||
|
@ -74,6 +88,7 @@ MINIKUBE_TEST_FILES := ./cmd/... ./pkg/...
|
|||
# npm install -g markdownlint-cli
|
||||
MARKDOWNLINT ?= markdownlint
|
||||
|
||||
|
||||
MINIKUBE_MARKDOWN_FILES := README.md docs CONTRIBUTING.md CHANGELOG.md
|
||||
|
||||
MINIKUBE_BUILD_TAGS := container_image_ostree_stub containers_image_openpgp
|
||||
|
@ -114,7 +129,7 @@ out/minikube$(IS_EXE): out/minikube-$(GOOS)-$(GOARCH)$(IS_EXE)
|
|||
cp $< $@
|
||||
|
||||
out/minikube-windows-amd64.exe: out/minikube-windows-amd64
|
||||
mv out/minikube-windows-amd64 out/minikube-windows-amd64.exe
|
||||
cp out/minikube-windows-amd64 out/minikube-windows-amd64.exe
|
||||
|
||||
out/minikube-%: pkg/minikube/assets/assets.go pkg/minikube/translate/translations.go $(shell find $(CMD_SOURCE_DIRS) -type f -name "*.go")
|
||||
ifeq ($(MINIKUBE_BUILD_IN_DOCKER),y)
|
||||
|
@ -128,7 +143,7 @@ e2e-%-$(GOARCH): out/minikube-%-$(GOARCH)
|
|||
GOOS=$* GOARCH=$(GOARCH) go test -c k8s.io/minikube/test/integration --tags="$(MINIKUBE_INTEGRATION_BUILD_TAGS)" -o out/$@
|
||||
|
||||
e2e-windows-amd64.exe: e2e-windows-amd64
|
||||
mv $(BUILD_DIR)/e2e-windows-amd64 $(BUILD_DIR)/e2e-windows-amd64.exe
|
||||
cp $(BUILD_DIR)/e2e-windows-amd64 $(BUILD_DIR)/e2e-windows-amd64.exe
|
||||
|
||||
minikube_iso: # old target kept for making tests happy
|
||||
echo $(ISO_VERSION) > deploy/iso/minikube-iso/board/coreos/minikube/rootfs-overlay/etc/VERSION
|
||||
|
@ -196,16 +211,28 @@ integration-versioned: out/minikube
|
|||
test: pkg/minikube/assets/assets.go pkg/minikube/translate/translations.go
|
||||
./test.sh
|
||||
|
||||
.PHONY: extract
|
||||
extract:
|
||||
go run cmd/extract/extract.go
|
||||
|
||||
# Regenerates assets.go when template files have been updated
|
||||
pkg/minikube/assets/assets.go: $(shell find deploy/addons -type f)
|
||||
ifeq ($(MINIKUBE_BUILD_IN_DOCKER),y)
|
||||
$(call DOCKER,$(BUILD_IMAGE),/usr/bin/make $@)
|
||||
else
|
||||
which go-bindata || GO111MODULE=off GOBIN=$(GOPATH)/bin go get github.com/jteeuwen/go-bindata/...
|
||||
PATH="$(PATH):$(GOPATH)/bin" go-bindata -nomemcopy -o pkg/minikube/assets/assets.go -pkg assets deploy/addons/...
|
||||
-gofmt -s -w $@
|
||||
endif
|
||||
|
||||
pkg/minikube/translate/translations.go: $(shell find translations/ -type f)
|
||||
ifeq ($(MINIKUBE_BUILD_IN_DOCKER),y)
|
||||
$(call DOCKER,$(BUILD_IMAGE),/usr/bin/make $@)
|
||||
else
|
||||
which go-bindata || GO111MODULE=off GOBIN=$(GOPATH)/bin go get github.com/jteeuwen/go-bindata/...
|
||||
PATH="$(PATH):$(GOPATH)/bin" go-bindata -nomemcopy -o pkg/minikube/translate/translations.go -pkg translate translations/...
|
||||
-gofmt -s -w $@
|
||||
endif
|
||||
@#golint: Json should be JSON (compat sed)
|
||||
@sed -i -e 's/Json/JSON/' $@ && rm -f ./-e
|
||||
|
||||
|
@ -268,14 +295,16 @@ out/linters/golangci-lint:
|
|||
mkdir -p out/linters
|
||||
curl -sfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b out/linters $(GOLINT_VERSION)
|
||||
|
||||
# this one is meant for local use
|
||||
.PHONY: lint
|
||||
lint: pkg/minikube/assets/assets.go pkg/minikube/translate/translations.go out/linters/golangci-lint
|
||||
./out/linters/golangci-lint run \
|
||||
--deadline 4m \
|
||||
--build-tags "${MINIKUBE_INTEGRATION_BUILD_TAGS}" \
|
||||
--enable goimports,gocritic,golint,gocyclo,interfacer,misspell,nakedret,stylecheck,unconvert,unparam \
|
||||
--exclude 'variable on range scope.*in function literal|ifElseChain' \
|
||||
./...
|
||||
./out/linters/golangci-lint run ${GOLINT_OPTIONS} ./...
|
||||
|
||||
# lint-ci is slower version of lint and is meant to be used in ci (travis) to avoid out of memory leaks.
|
||||
.PHONY: lint-ci
|
||||
lint-ci: pkg/minikube/assets/assets.go pkg/minikube/translate/translations.go out/linters/golangci-lint
|
||||
GOGC=${GOLINT_GOGC} ./out/linters/golangci-lint run \
|
||||
--concurrency ${GOLINT_JOBS} ${GOLINT_OPTIONS} ./...
|
||||
|
||||
.PHONY: reportcard
|
||||
reportcard:
|
||||
|
@ -288,7 +317,7 @@ mdlint:
|
|||
@$(MARKDOWNLINT) $(MINIKUBE_MARKDOWN_FILES)
|
||||
|
||||
out/docs/minikube.md: $(shell find cmd) $(shell find pkg/minikube/constants) pkg/minikube/assets/assets.go pkg/minikube/translate/translations.go
|
||||
go run -ldflags="$(MINIKUBE_LDFLAGS)" hack/help_text/gen_help_text.go
|
||||
go run -ldflags="$(MINIKUBE_LDFLAGS)" -tags gendocs hack/help_text/gen_help_text.go
|
||||
|
||||
out/minikube_$(DEB_VERSION).deb: out/minikube-linux-amd64
|
||||
cp -r installers/linux/deb/minikube_deb_template out/minikube_$(DEB_VERSION)
|
||||
|
@ -307,6 +336,20 @@ out/minikube-$(RPM_VERSION).rpm: out/minikube-linux-amd64
|
|||
out/minikube-$(RPM_VERSION)/minikube.spec
|
||||
rm -rf out/minikube-$(RPM_VERSION)
|
||||
|
||||
.PHONY: apt
|
||||
apt: out/Release
|
||||
|
||||
out/Release: out/minikube_$(DEB_VERSION).deb
|
||||
( cd out && apt-ftparchive packages . ) | gzip -c > out/Packages.gz
|
||||
( cd out && apt-ftparchive release . ) > out/Release
|
||||
|
||||
.PHONY: yum
|
||||
yum: out/repodata/repomd.xml
|
||||
|
||||
out/repodata/repomd.xml: out/minikube-$(RPM_VERSION).rpm
|
||||
createrepo --simple-md-filenames --no-database \
|
||||
-u "$(MINIKUBE_RELEASES_URL)/$(VERSION)/" out
|
||||
|
||||
.SECONDEXPANSION:
|
||||
TAR_TARGETS_linux := out/minikube-linux-amd64 out/docker-machine-driver-kvm2
|
||||
TAR_TARGETS_darwin := out/minikube-darwin-amd64
|
||||
|
@ -316,7 +359,7 @@ out/minikube-%-amd64.tar.gz: $$(TAR_TARGETS_$$*) $(TAR_TARGETS_ALL)
|
|||
tar -cvf $@ $^
|
||||
|
||||
.PHONY: cross-tars
|
||||
cross-tars: kvm_in_docker out/minikube-windows-amd64.tar.gz out/minikube-linux-amd64.tar.gz out/minikube-darwin-amd64.tar.gz
|
||||
cross-tars: out/minikube-windows-amd64.tar.gz out/minikube-linux-amd64.tar.gz out/minikube-darwin-amd64.tar.gz
|
||||
|
||||
out/minikube-installer.exe: out/minikube-windows-amd64.exe
|
||||
rm -rf out/windows_tmp
|
||||
|
@ -332,7 +375,7 @@ out/minikube-installer.exe: out/minikube-windows-amd64.exe
|
|||
mv out/windows_tmp/minikube-installer.exe out/minikube-installer.exe
|
||||
rm -rf out/windows_tmp
|
||||
|
||||
out/docker-machine-driver-hyperkit:
|
||||
out/docker-machine-driver-hyperkit: pkg/minikube/translate/translations.go
|
||||
ifeq ($(MINIKUBE_BUILD_IN_DOCKER),y)
|
||||
$(call DOCKER,$(HYPERKIT_BUILD_IMAGE),CC=o64-clang CXX=o64-clang++ /usr/bin/make $@)
|
||||
else
|
||||
|
@ -398,31 +441,55 @@ release-minikube: out/minikube checksum
|
|||
gsutil cp out/minikube-$(GOOS)-$(GOARCH) $(MINIKUBE_UPLOAD_LOCATION)/$(MINIKUBE_VERSION)/minikube-$(GOOS)-$(GOARCH)
|
||||
gsutil cp out/minikube-$(GOOS)-$(GOARCH).sha256 $(MINIKUBE_UPLOAD_LOCATION)/$(MINIKUBE_VERSION)/minikube-$(GOOS)-$(GOARCH).sha256
|
||||
|
||||
out/docker-machine-driver-kvm2:
|
||||
out/docker-machine-driver-kvm2: pkg/minikube/translate/translations.go
|
||||
ifeq ($(MINIKUBE_BUILD_IN_DOCKER),y)
|
||||
docker inspect -f '{{.Id}} {{.RepoTags}}' $(KVM_BUILD_IMAGE) || $(MAKE) kvm-image
|
||||
$(call DOCKER,$(KVM_BUILD_IMAGE),/usr/bin/make $@ COMMIT=$(COMMIT))
|
||||
# make extra sure that we are linking with the older version of libvirt (1.3.1)
|
||||
test "`strings $@ | grep '^LIBVIRT_[0-9]' | sort | tail -n 1`" = "LIBVIRT_1.2.9"
|
||||
else
|
||||
go build \
|
||||
-installsuffix "static" \
|
||||
-ldflags="$(KVM2_LDFLAGS)" \
|
||||
-tags libvirt.1.3.1 \
|
||||
-tags "libvirt.1.3.1 without_lxc" \
|
||||
-o $(BUILD_DIR)/docker-machine-driver-kvm2 \
|
||||
k8s.io/minikube/cmd/drivers/kvm
|
||||
endif
|
||||
chmod +X $@
|
||||
|
||||
kvm-image: $(KVM_BUILD_IMAGE) # convenient alias to build the docker container
|
||||
$(KVM_BUILD_IMAGE): installers/linux/kvm/Dockerfile
|
||||
docker build --build-arg "GO_VERSION=$(GO_VERSION)" -t $@ -f $< $(dir $<)
|
||||
out/docker-machine-driver-kvm2_$(DEB_VERSION).deb: out/docker-machine-driver-kvm2
|
||||
cp -r installers/linux/deb/kvm2_deb_template out/docker-machine-driver-kvm2_$(DEB_VERSION)
|
||||
chmod 0755 out/docker-machine-driver-kvm2_$(DEB_VERSION)/DEBIAN
|
||||
sed -E -i 's/--VERSION--/'$(DEB_VERSION)'/g' out/docker-machine-driver-kvm2_$(DEB_VERSION)/DEBIAN/control
|
||||
mkdir -p out/docker-machine-driver-kvm2_$(DEB_VERSION)/usr/bin
|
||||
cp out/docker-machine-driver-kvm2 out/docker-machine-driver-kvm2_$(DEB_VERSION)/usr/bin/docker-machine-driver-kvm2
|
||||
fakeroot dpkg-deb --build out/docker-machine-driver-kvm2_$(DEB_VERSION)
|
||||
rm -rf out/docker-machine-driver-kvm2_$(DEB_VERSION)
|
||||
|
||||
out/docker-machine-driver-kvm2-$(RPM_VERSION).rpm: out/docker-machine-driver-kvm2
|
||||
cp -r installers/linux/rpm/kvm2_rpm_template out/docker-machine-driver-kvm2-$(RPM_VERSION)
|
||||
sed -E -i 's/--VERSION--/'$(RPM_VERSION)'/g' out/docker-machine-driver-kvm2-$(RPM_VERSION)/docker-machine-driver-kvm2.spec
|
||||
sed -E -i 's|--OUT--|'$(PWD)/out'|g' out/docker-machine-driver-kvm2-$(RPM_VERSION)/docker-machine-driver-kvm2.spec
|
||||
rpmbuild -bb -D "_rpmdir $(PWD)/out" -D "_rpmfilename docker-machine-driver-kvm2-$(RPM_VERSION).rpm" \
|
||||
out/docker-machine-driver-kvm2-$(RPM_VERSION)/docker-machine-driver-kvm2.spec
|
||||
rm -rf out/docker-machine-driver-kvm2-$(RPM_VERSION)
|
||||
|
||||
.PHONY: kvm-image # convenient alias to build the docker container
|
||||
kvm-image: installers/linux/kvm/Dockerfile
|
||||
docker build --build-arg "GO_VERSION=$(GO_VERSION)" -t $(KVM_BUILD_IMAGE) -f $< $(dir $<)
|
||||
@echo ""
|
||||
@echo "$(@) successfully built"
|
||||
|
||||
kvm_in_docker:
|
||||
docker inspect $(KVM_BUILD_IMAGE) || $(MAKE) $(KVM_BUILD_IMAGE)
|
||||
docker inspect -f '{{.Id}} {{.RepoTags}}' $(KVM_BUILD_IMAGE) || $(MAKE) kvm-image
|
||||
rm -f out/docker-machine-driver-kvm2
|
||||
$(call DOCKER,$(KVM_BUILD_IMAGE),/usr/bin/make out/docker-machine-driver-kvm2 COMMIT=$(COMMIT))
|
||||
|
||||
.PHONY: install-kvm
|
||||
install-kvm: out/docker-machine-driver-kvm2
|
||||
.PHONY: install-kvm-driver
|
||||
install-kvm-driver: out/docker-machine-driver-kvm2
|
||||
cp out/docker-machine-driver-kvm2 $(GOBIN)/docker-machine-driver-kvm2
|
||||
|
||||
.PHONY: release-kvm-driver
|
||||
release-kvm-driver: kvm_in_docker checksum install-kvm
|
||||
release-kvm-driver: install-kvm-driver checksum
|
||||
gsutil cp $(GOBIN)/docker-machine-driver-kvm2 gs://minikube/drivers/kvm/$(VERSION)/
|
||||
gsutil cp $(GOBIN)/docker-machine-driver-kvm2.sha256 gs://minikube/drivers/kvm/$(VERSION)/
|
||||
|
|
|
@ -24,6 +24,9 @@ Usage: from the root minikube directory, go run cmd/extract/extract.go
|
|||
package main
|
||||
|
||||
import (
|
||||
"os"
|
||||
"strings"
|
||||
|
||||
"k8s.io/minikube/pkg/minikube/extract"
|
||||
)
|
||||
|
||||
|
@ -31,7 +34,19 @@ func main() {
|
|||
paths := []string{"cmd", "pkg"}
|
||||
functions := []string{"translate.T"}
|
||||
outDir := "translations"
|
||||
err := extract.TranslatableStrings(paths, functions, outDir)
|
||||
cwd, err := os.Getwd()
|
||||
if err != nil {
|
||||
panic("Getting current working directory failed")
|
||||
}
|
||||
|
||||
if strings.Contains(cwd, "cmd") {
|
||||
panic("run extract.go from the minikube root directory")
|
||||
}
|
||||
|
||||
if _, err = os.Stat(extract.ErrMapFile); os.IsNotExist(err) {
|
||||
panic("err_map.go doesn't exist")
|
||||
}
|
||||
err = extract.TranslatableStrings(paths, functions, outDir)
|
||||
|
||||
if err != nil {
|
||||
panic(err)
|
||||
|
|
|
@ -93,8 +93,8 @@ func CacheImagesInConfigFile() error {
|
|||
return machine.CacheImages(images, constants.ImageCacheDir)
|
||||
}
|
||||
|
||||
// LoadCachedImagesInConfigFile loads the images currently in the config file (minikube start)
|
||||
func LoadCachedImagesInConfigFile() error {
|
||||
// loadCachedImagesInConfigFile loads the images currently in the config file (minikube start)
|
||||
func loadCachedImagesInConfigFile() error {
|
||||
images, err := imagesInConfigFile()
|
||||
if err != nil {
|
||||
return err
|
||||
|
@ -108,5 +108,4 @@ func LoadCachedImagesInConfigFile() error {
|
|||
func init() {
|
||||
cacheCmd.AddCommand(addCacheCmd)
|
||||
cacheCmd.AddCommand(deleteCacheCmd)
|
||||
RootCmd.AddCommand(cacheCmd)
|
||||
}
|
||||
|
|
|
@ -24,6 +24,7 @@ import (
|
|||
"github.com/pkg/errors"
|
||||
"github.com/spf13/cobra"
|
||||
"k8s.io/minikube/pkg/minikube/exit"
|
||||
"k8s.io/minikube/pkg/minikube/out"
|
||||
)
|
||||
|
||||
const longDescription = `
|
||||
|
@ -69,10 +70,10 @@ var completionCmd = &cobra.Command{
|
|||
Long: longDescription,
|
||||
Run: func(cmd *cobra.Command, args []string) {
|
||||
if len(args) != 1 {
|
||||
exit.Usage("Usage: minikube completion SHELL")
|
||||
exit.UsageT("Usage: minikube completion SHELL")
|
||||
}
|
||||
if args[0] != "bash" && args[0] != "zsh" {
|
||||
exit.Usage("Sorry, completion support is not yet implemented for %q", args[0])
|
||||
exit.UsageT("Sorry, completion support is not yet implemented for {{.name}}", out.V{"name": args[0]})
|
||||
} else if args[0] == "bash" {
|
||||
err := GenerateBashCompletion(os.Stdout, cmd.Parent())
|
||||
if err != nil {
|
||||
|
@ -278,7 +279,3 @@ __minikube_bash_source <(__minikube_convert_bash_to_zsh)
|
|||
|
||||
return nil
|
||||
}
|
||||
|
||||
func init() {
|
||||
RootCmd.AddCommand(completionCmd)
|
||||
}
|
||||
|
|
|
@ -41,7 +41,7 @@ var addonsListCmd = &cobra.Command{
|
|||
Long: "Lists all available minikube addons as well as their current statuses (enabled/disabled)",
|
||||
Run: func(cmd *cobra.Command, args []string) {
|
||||
if len(args) != 0 {
|
||||
exit.Usage("usage: minikube addons list")
|
||||
exit.UsageT("usage: minikube addons list")
|
||||
}
|
||||
err := addonList()
|
||||
if err != nil {
|
||||
|
|
|
@ -17,10 +17,6 @@ limitations under the License.
|
|||
package config
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"io"
|
||||
"os"
|
||||
"strings"
|
||||
|
||||
"github.com/golang/glog"
|
||||
|
@ -302,7 +298,7 @@ func AddToConfigMap(name string, images []string) error {
|
|||
return err
|
||||
}
|
||||
// Set the values
|
||||
configFile, err := config.ReadConfig()
|
||||
cfg, err := config.ReadConfig()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
@ -310,16 +306,16 @@ func AddToConfigMap(name string, images []string) error {
|
|||
for _, image := range images {
|
||||
newImages[image] = nil
|
||||
}
|
||||
if values, ok := configFile[name].(map[string]interface{}); ok {
|
||||
if values, ok := cfg[name].(map[string]interface{}); ok {
|
||||
for key := range values {
|
||||
newImages[key] = nil
|
||||
}
|
||||
}
|
||||
if err = s.setMap(configFile, name, newImages); err != nil {
|
||||
if err = s.setMap(cfg, name, newImages); err != nil {
|
||||
return err
|
||||
}
|
||||
// Write the values
|
||||
return WriteConfig(configFile)
|
||||
return config.WriteConfig(constants.ConfigFile, cfg)
|
||||
}
|
||||
|
||||
// DeleteFromConfigMap deletes entries from a map in the config file
|
||||
|
@ -329,45 +325,20 @@ func DeleteFromConfigMap(name string, images []string) error {
|
|||
return err
|
||||
}
|
||||
// Set the values
|
||||
configFile, err := config.ReadConfig()
|
||||
cfg, err := config.ReadConfig()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
values, ok := configFile[name]
|
||||
values, ok := cfg[name]
|
||||
if !ok {
|
||||
return nil
|
||||
}
|
||||
for _, image := range images {
|
||||
delete(values.(map[string]interface{}), image)
|
||||
}
|
||||
if err = s.setMap(configFile, name, values.(map[string]interface{})); err != nil {
|
||||
if err = s.setMap(cfg, name, values.(map[string]interface{})); err != nil {
|
||||
return err
|
||||
}
|
||||
// Write the values
|
||||
return WriteConfig(configFile)
|
||||
}
|
||||
|
||||
// WriteConfig writes a minikube config to the JSON file
|
||||
func WriteConfig(m config.MinikubeConfig) error {
|
||||
f, err := os.Create(constants.ConfigFile)
|
||||
if err != nil {
|
||||
return fmt.Errorf("create %s: %s", constants.ConfigFile, err)
|
||||
}
|
||||
defer f.Close()
|
||||
err = encode(f, m)
|
||||
if err != nil {
|
||||
return fmt.Errorf("encode %s: %s", constants.ConfigFile, err)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func encode(w io.Writer, m config.MinikubeConfig) error {
|
||||
b, err := json.MarshalIndent(m, "", " ")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
_, err = w.Write(b)
|
||||
|
||||
return err
|
||||
return config.WriteConfig(constants.ConfigFile, cfg)
|
||||
}
|
||||
|
|
|
@ -20,46 +20,8 @@ import (
|
|||
"bytes"
|
||||
"fmt"
|
||||
"testing"
|
||||
|
||||
"k8s.io/minikube/pkg/minikube/constants"
|
||||
)
|
||||
|
||||
type configTestCase struct {
|
||||
data string
|
||||
config map[string]interface{}
|
||||
}
|
||||
|
||||
var configTestCases = []configTestCase{
|
||||
{
|
||||
data: `{
|
||||
"memory": 2
|
||||
}`,
|
||||
config: map[string]interface{}{
|
||||
"memory": 2,
|
||||
},
|
||||
},
|
||||
{
|
||||
data: `{
|
||||
"ReminderWaitPeriodInHours": 99,
|
||||
"cpus": 4,
|
||||
"disk-size": "20g",
|
||||
"log_dir": "/etc/hosts",
|
||||
"show-libmachine-logs": true,
|
||||
"v": 5,
|
||||
"vm-driver": "kvm"
|
||||
}`,
|
||||
config: map[string]interface{}{
|
||||
"vm-driver": constants.DriverKvmOld,
|
||||
"cpus": 4,
|
||||
"disk-size": "20g",
|
||||
"v": 5,
|
||||
"show-libmachine-logs": true,
|
||||
"log_dir": "/etc/hosts",
|
||||
"ReminderWaitPeriodInHours": 99,
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
func TestHiddenPrint(t *testing.T) {
|
||||
testCases := []struct {
|
||||
TestString string
|
||||
|
@ -90,17 +52,3 @@ func TestHiddenPrint(t *testing.T) {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestWriteConfig(t *testing.T) {
|
||||
var b bytes.Buffer
|
||||
for _, tt := range configTestCases {
|
||||
err := encode(&b, tt.config)
|
||||
if err != nil {
|
||||
t.Errorf("Error encoding: %v", err)
|
||||
}
|
||||
if b.String() != tt.data {
|
||||
t.Errorf("Did not write config correctly, \n\n expected:\n %+v \n\n actual:\n %+v", tt.data, b.String())
|
||||
}
|
||||
b.Reset()
|
||||
}
|
||||
}
|
||||
|
|
|
@ -20,8 +20,8 @@ import (
|
|||
"io/ioutil"
|
||||
|
||||
"github.com/spf13/cobra"
|
||||
"k8s.io/minikube/pkg/minikube/console"
|
||||
"k8s.io/minikube/pkg/minikube/exit"
|
||||
"k8s.io/minikube/pkg/minikube/out"
|
||||
"k8s.io/minikube/pkg/minikube/service"
|
||||
)
|
||||
|
||||
|
@ -31,7 +31,7 @@ var addonsConfigureCmd = &cobra.Command{
|
|||
Long: "Configures the addon w/ADDON_NAME within minikube (example: minikube addons configure registry-creds). For a list of available addons use: minikube addons list ",
|
||||
Run: func(cmd *cobra.Command, args []string) {
|
||||
if len(args) != 1 {
|
||||
exit.Usage("usage: minikube addons configure ADDON_NAME")
|
||||
exit.UsageT("usage: minikube addons configure ADDON_NAME")
|
||||
}
|
||||
|
||||
addon := args[0]
|
||||
|
@ -77,7 +77,7 @@ var addonsConfigureCmd = &cobra.Command{
|
|||
dat, err := ioutil.ReadFile(gcrPath)
|
||||
|
||||
if err != nil {
|
||||
console.Failure("Error reading %s: %v", gcrPath, err)
|
||||
out.FailureT("Error reading {{.path}}: {{.error}}", out.V{"path": gcrPath, "error": err})
|
||||
} else {
|
||||
gcrApplicationDefaultCredentials = string(dat)
|
||||
}
|
||||
|
@ -109,7 +109,7 @@ var addonsConfigureCmd = &cobra.Command{
|
|||
})
|
||||
|
||||
if err != nil {
|
||||
console.Failure("ERROR creating `registry-creds-ecr` secret: %v", err)
|
||||
out.FailureT("ERROR creating `registry-creds-ecr` secret: {{.error}}", out.V{"error": err})
|
||||
}
|
||||
|
||||
// Create GCR Secret
|
||||
|
@ -127,7 +127,7 @@ var addonsConfigureCmd = &cobra.Command{
|
|||
})
|
||||
|
||||
if err != nil {
|
||||
console.Failure("ERROR creating `registry-creds-gcr` secret: %v", err)
|
||||
out.FailureT("ERROR creating `registry-creds-gcr` secret: {{.error}}", out.V{"error": err})
|
||||
}
|
||||
|
||||
// Create Docker Secret
|
||||
|
@ -146,14 +146,14 @@ var addonsConfigureCmd = &cobra.Command{
|
|||
})
|
||||
|
||||
if err != nil {
|
||||
console.Warning("ERROR creating `registry-creds-dpr` secret")
|
||||
out.WarningT("ERROR creating `registry-creds-dpr` secret")
|
||||
}
|
||||
default:
|
||||
console.Failure("%s has no available configuration options", addon)
|
||||
out.FailureT("{{.name}} has no available configuration options", out.V{"name": addon})
|
||||
return
|
||||
}
|
||||
|
||||
console.Success("%s was successfully configured", addon)
|
||||
out.SuccessT("{{.name}} was successfully configured", out.V{"name": addon})
|
||||
},
|
||||
}
|
||||
|
||||
|
|
|
@ -18,8 +18,8 @@ package config
|
|||
|
||||
import (
|
||||
"github.com/spf13/cobra"
|
||||
"k8s.io/minikube/pkg/minikube/console"
|
||||
"k8s.io/minikube/pkg/minikube/exit"
|
||||
"k8s.io/minikube/pkg/minikube/out"
|
||||
)
|
||||
|
||||
var addonsDisableCmd = &cobra.Command{
|
||||
|
@ -28,7 +28,7 @@ var addonsDisableCmd = &cobra.Command{
|
|||
Long: "Disables the addon w/ADDON_NAME within minikube (example: minikube addons disable dashboard). For a list of available addons use: minikube addons list ",
|
||||
Run: func(cmd *cobra.Command, args []string) {
|
||||
if len(args) != 1 {
|
||||
exit.Usage("usage: minikube addons disable ADDON_NAME")
|
||||
exit.UsageT("usage: minikube addons disable ADDON_NAME")
|
||||
}
|
||||
|
||||
addon := args[0]
|
||||
|
@ -36,7 +36,7 @@ var addonsDisableCmd = &cobra.Command{
|
|||
if err != nil {
|
||||
exit.WithError("disable failed", err)
|
||||
}
|
||||
console.Success("%s was successfully disabled", addon)
|
||||
out.SuccessT(`"{{.minikube_addon}}" was successfully disabled`, out.V{"minikube_addon": addon})
|
||||
},
|
||||
}
|
||||
|
||||
|
|
|
@ -18,8 +18,8 @@ package config
|
|||
|
||||
import (
|
||||
"github.com/spf13/cobra"
|
||||
"k8s.io/minikube/pkg/minikube/console"
|
||||
"k8s.io/minikube/pkg/minikube/exit"
|
||||
"k8s.io/minikube/pkg/minikube/out"
|
||||
)
|
||||
|
||||
var addonsEnableCmd = &cobra.Command{
|
||||
|
@ -28,16 +28,15 @@ var addonsEnableCmd = &cobra.Command{
|
|||
Long: "Enables the addon w/ADDON_NAME within minikube (example: minikube addons enable dashboard). For a list of available addons use: minikube addons list ",
|
||||
Run: func(cmd *cobra.Command, args []string) {
|
||||
if len(args) != 1 {
|
||||
exit.Usage("usage: minikube addons enable ADDON_NAME")
|
||||
exit.UsageT("usage: minikube addons enable ADDON_NAME")
|
||||
}
|
||||
|
||||
addon := args[0]
|
||||
err := Set(addon, "true")
|
||||
if err != nil {
|
||||
console.Fatal("enable failed: %v", err)
|
||||
} else {
|
||||
console.Success("%s was successfully enabled", addon)
|
||||
exit.WithError("enable failed", err)
|
||||
}
|
||||
out.SuccessT("{{.addonName}} was successfully enabled", out.V{"addonName": addon})
|
||||
},
|
||||
}
|
||||
|
||||
|
|
|
@ -22,7 +22,7 @@ import (
|
|||
|
||||
"github.com/spf13/cobra"
|
||||
pkgConfig "k8s.io/minikube/pkg/minikube/config"
|
||||
"k8s.io/minikube/pkg/minikube/console"
|
||||
"k8s.io/minikube/pkg/minikube/out"
|
||||
)
|
||||
|
||||
var configGetCmd = &cobra.Command{
|
||||
|
@ -44,7 +44,7 @@ var configGetCmd = &cobra.Command{
|
|||
return fmt.Errorf("no value for key '%s'", args[0])
|
||||
}
|
||||
|
||||
console.OutLn(val)
|
||||
out.Ln(val)
|
||||
return nil
|
||||
},
|
||||
}
|
||||
|
|
|
@ -17,16 +17,15 @@ limitations under the License.
|
|||
package config
|
||||
|
||||
import (
|
||||
"os"
|
||||
"text/template"
|
||||
|
||||
"github.com/spf13/cobra"
|
||||
"k8s.io/minikube/pkg/minikube/assets"
|
||||
"k8s.io/minikube/pkg/minikube/cluster"
|
||||
"k8s.io/minikube/pkg/minikube/console"
|
||||
"k8s.io/minikube/pkg/minikube/constants"
|
||||
"k8s.io/minikube/pkg/minikube/exit"
|
||||
"k8s.io/minikube/pkg/minikube/machine"
|
||||
"k8s.io/minikube/pkg/minikube/out"
|
||||
"k8s.io/minikube/pkg/minikube/service"
|
||||
)
|
||||
|
||||
|
@ -48,13 +47,13 @@ var addonsOpenCmd = &cobra.Command{
|
|||
PreRun: func(cmd *cobra.Command, args []string) {
|
||||
t, err := template.New("addonsURL").Parse(addonsURLFormat)
|
||||
if err != nil {
|
||||
exit.Usage("The value passed to --format is invalid: %s", err)
|
||||
exit.UsageT("The value passed to --format is invalid: {{.error}}", out.V{"error": err})
|
||||
}
|
||||
addonsURLTemplate = t
|
||||
},
|
||||
Run: func(cmd *cobra.Command, args []string) {
|
||||
if len(args) != 1 {
|
||||
exit.Usage("usage: minikube addons open ADDON_NAME")
|
||||
exit.UsageT("usage: minikube addons open ADDON_NAME")
|
||||
}
|
||||
addonName := args[0]
|
||||
// TODO(r2d4): config should not reference API, pull this out
|
||||
|
@ -67,19 +66,18 @@ var addonsOpenCmd = &cobra.Command{
|
|||
cluster.EnsureMinikubeRunningOrExit(api, 1)
|
||||
addon, ok := assets.Addons[addonName] // validate addon input
|
||||
if !ok {
|
||||
exit.WithCode(exit.Data, `addon '%s' is not a valid addon packaged with minikube.
|
||||
exit.WithCodeT(exit.Data, `addon '{{.name}}' is not a valid addon packaged with minikube.
|
||||
To see the list of available addons run:
|
||||
minikube addons list`, addonName)
|
||||
minikube addons list`, out.V{"name": addonName})
|
||||
}
|
||||
ok, err = addon.IsEnabled()
|
||||
if err != nil {
|
||||
exit.WithError("IsEnabled failed", err)
|
||||
}
|
||||
if !ok {
|
||||
console.ErrStyle(console.Conflict, `addon '%s' is currently not enabled.
|
||||
exit.WithCodeT(exit.Unavailable, `addon '{{.name}}' is currently not enabled.
|
||||
To enable this addon run:
|
||||
minikube addons enable %s`, addonName, addonName)
|
||||
os.Exit(exit.Unavailable)
|
||||
minikube addons enable {{.name}}`, out.V{"name": addonName})
|
||||
}
|
||||
|
||||
namespace := "kube-system"
|
||||
|
@ -87,16 +85,16 @@ minikube addons enable %s`, addonName, addonName)
|
|||
|
||||
serviceList, err := service.GetServiceListByLabel(namespace, key, addonName)
|
||||
if err != nil {
|
||||
exit.WithCode(exit.Unavailable, "Error getting service with namespace: %s and labels %s:%s: %v", namespace, key, addonName, err)
|
||||
exit.WithCodeT(exit.Unavailable, "Error getting service with namespace: {{.namespace}} and labels {{.labelName}}:{{.addonName}}: {{.error}}", out.V{"namespace": namespace, "labelName": key, "addonName": addonName, "error": err})
|
||||
}
|
||||
if len(serviceList.Items) == 0 {
|
||||
exit.WithCode(exit.Config, `This addon does not have an endpoint defined for the 'addons open' command.
|
||||
You can add one by annotating a service with the label %s:%s`, key, addonName)
|
||||
exit.WithCodeT(exit.Config, `This addon does not have an endpoint defined for the 'addons open' command.
|
||||
You can add one by annotating a service with the label {{.labelName}}:{{.addonName}}`, out.V{"labelName": key, "addonName": addonName})
|
||||
}
|
||||
for i := range serviceList.Items {
|
||||
svc := serviceList.Items[i].ObjectMeta.Name
|
||||
if err := service.WaitAndMaybeOpenService(api, namespace, svc, addonsURLTemplate, addonsURLMode, https, wait, interval); err != nil {
|
||||
exit.WithCode(exit.Unavailable, "Wait failed: %v", err)
|
||||
exit.WithCodeT(exit.Unavailable, "Wait failed: {{.error}}", out.V{"error": err})
|
||||
}
|
||||
}
|
||||
},
|
||||
|
|
|
@ -22,9 +22,9 @@ import (
|
|||
"github.com/spf13/cobra"
|
||||
"github.com/spf13/viper"
|
||||
pkgConfig "k8s.io/minikube/pkg/minikube/config"
|
||||
"k8s.io/minikube/pkg/minikube/console"
|
||||
"k8s.io/minikube/pkg/minikube/constants"
|
||||
"k8s.io/minikube/pkg/minikube/exit"
|
||||
"k8s.io/minikube/pkg/minikube/out"
|
||||
pkgutil "k8s.io/minikube/pkg/util"
|
||||
)
|
||||
|
||||
|
@ -36,12 +36,12 @@ var ProfileCmd = &cobra.Command{
|
|||
Run: func(cmd *cobra.Command, args []string) {
|
||||
if len(args) == 0 {
|
||||
profile := viper.GetString(pkgConfig.MachineProfile)
|
||||
console.OutLn("%s", profile)
|
||||
out.T(out.Empty, profile)
|
||||
os.Exit(0)
|
||||
}
|
||||
|
||||
if len(args) > 1 {
|
||||
exit.Usage("usage: minikube profile [MINIKUBE_PROFILE_NAME]")
|
||||
exit.UsageT("usage: minikube profile [MINIKUBE_PROFILE_NAME]")
|
||||
}
|
||||
|
||||
profile := args[0]
|
||||
|
@ -55,19 +55,19 @@ var ProfileCmd = &cobra.Command{
|
|||
cc, err := pkgConfig.Load()
|
||||
// might err when loading older version of cfg file that doesn't have KeepContext field
|
||||
if err != nil && !os.IsNotExist(err) {
|
||||
console.ErrLn("Error loading profile config: %v", err)
|
||||
out.ErrT(out.Sad, `Error loading profile config: {{.error}}`, out.V{"error": err})
|
||||
}
|
||||
if err == nil {
|
||||
if cc.MachineConfig.KeepContext {
|
||||
console.Success("Skipped switching kubectl context for %s , because --keep-context", profile)
|
||||
console.Success("To connect to this cluster, use: kubectl --context=%s", profile)
|
||||
out.SuccessT("Skipped switching kubectl context for {{.profile_name}} , because --keep-context", out.V{"profile_name": profile})
|
||||
out.SuccessT("To connect to this cluster, use: kubectl --context={{.profile_name}}", out.V{"profile_name": profile})
|
||||
} else {
|
||||
err := pkgutil.SetCurrentContext(constants.KubeconfigPath, profile)
|
||||
if err != nil {
|
||||
console.ErrLn("Error while setting kubectl current context : %v", err)
|
||||
out.ErrT(out.Sad, `Error while setting kubectl current context : {{.error}}`, out.V{"error": err})
|
||||
}
|
||||
}
|
||||
}
|
||||
console.Success("minikube profile was successfully set to %s", profile)
|
||||
out.SuccessT("minikube profile was successfully set to {{.profile_name}}", out.V{"profile_name": profile})
|
||||
},
|
||||
}
|
||||
|
|
|
@ -0,0 +1,76 @@
|
|||
/*
|
||||
Copyright 2019 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 config
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
"strconv"
|
||||
|
||||
"k8s.io/minikube/pkg/minikube/config"
|
||||
"k8s.io/minikube/pkg/minikube/exit"
|
||||
"k8s.io/minikube/pkg/minikube/out"
|
||||
|
||||
"github.com/olekukonko/tablewriter"
|
||||
"github.com/spf13/cobra"
|
||||
)
|
||||
|
||||
var profileListCmd = &cobra.Command{
|
||||
Use: "list",
|
||||
Short: "Lists all minikube profiles.",
|
||||
Long: "Lists all valid minikube profiles and detects all possible invalid profiles.",
|
||||
Run: func(cmd *cobra.Command, args []string) {
|
||||
|
||||
var validData [][]string
|
||||
|
||||
table := tablewriter.NewWriter(os.Stdout)
|
||||
table.SetHeader([]string{"Profile", "VM Driver", "NodeIP", "Node Port", "Kubernetes Version"})
|
||||
table.SetAutoFormatHeaders(false)
|
||||
table.SetBorders(tablewriter.Border{Left: true, Top: true, Right: true, Bottom: true})
|
||||
table.SetCenterSeparator("|")
|
||||
validProfiles, invalidProfiles, err := config.ListProfiles()
|
||||
|
||||
if len(validProfiles) == 0 || err != nil {
|
||||
exit.UsageT("No minikube profile was found. you could create one using: `minikube start`")
|
||||
}
|
||||
for _, p := range validProfiles {
|
||||
validData = append(validData, []string{p.Name, p.Config.MachineConfig.VMDriver, p.Config.KubernetesConfig.NodeIP, strconv.Itoa(p.Config.KubernetesConfig.NodePort), p.Config.KubernetesConfig.KubernetesVersion})
|
||||
}
|
||||
|
||||
table.AppendBulk(validData)
|
||||
table.Render()
|
||||
|
||||
if invalidProfiles != nil {
|
||||
out.T(out.WarningType, "Found {{.number}} invalid profile(s) ! ", out.V{"number": len(invalidProfiles)})
|
||||
for _, p := range invalidProfiles {
|
||||
out.T(out.Empty, "\t "+p.Name)
|
||||
}
|
||||
out.T(out.Tip, "You can delete them using the following command(s): ")
|
||||
for _, p := range invalidProfiles {
|
||||
out.String(fmt.Sprintf("\t $ minikube delete -p %s \n", p.Name))
|
||||
}
|
||||
|
||||
}
|
||||
if err != nil {
|
||||
exit.WithCodeT(exit.Config, fmt.Sprintf("error loading profiles: %v", err))
|
||||
}
|
||||
},
|
||||
}
|
||||
|
||||
func init() {
|
||||
ProfileCmd.AddCommand(profileListCmd)
|
||||
}
|
|
@ -25,7 +25,7 @@ import (
|
|||
|
||||
"github.com/golang/glog"
|
||||
"golang.org/x/crypto/ssh/terminal"
|
||||
"k8s.io/minikube/pkg/minikube/console"
|
||||
"k8s.io/minikube/pkg/minikube/out"
|
||||
)
|
||||
|
||||
// AskForYesNoConfirmation asks the user for confirmation. A user must type in "yes" or "no" and
|
||||
|
@ -36,7 +36,7 @@ func AskForYesNoConfirmation(s string, posResponses, negResponses []string) bool
|
|||
reader := bufio.NewReader(os.Stdin)
|
||||
|
||||
for {
|
||||
console.Out("%s [y/n]: ", s)
|
||||
out.String("%s [y/n]: ", s)
|
||||
|
||||
response, err := reader.ReadString('\n')
|
||||
if err != nil {
|
||||
|
@ -49,7 +49,7 @@ func AskForYesNoConfirmation(s string, posResponses, negResponses []string) bool
|
|||
case containsString(negResponses, r):
|
||||
return false
|
||||
default:
|
||||
console.Err("Please type yes or no:")
|
||||
out.Err("Please type yes or no:")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -63,7 +63,7 @@ func AskForStaticValue(s string) string {
|
|||
|
||||
// Can't have zero length
|
||||
if len(response) == 0 {
|
||||
console.Err("--Error, please enter a value:")
|
||||
out.Err("--Error, please enter a value:")
|
||||
continue
|
||||
}
|
||||
return response
|
||||
|
@ -78,7 +78,7 @@ func AskForStaticValueOptional(s string) string {
|
|||
}
|
||||
|
||||
func getStaticValue(reader *bufio.Reader, s string) string {
|
||||
console.Out("%s", s)
|
||||
out.String("%s", s)
|
||||
|
||||
response, err := reader.ReadString('\n')
|
||||
if err != nil {
|
||||
|
@ -110,7 +110,7 @@ func concealableAskForStaticValue(readWriter io.ReadWriter, promptString string,
|
|||
}
|
||||
response = strings.TrimSpace(response)
|
||||
if len(response) == 0 {
|
||||
console.Warning("Please enter a value:")
|
||||
out.WarningT("Please enter a value:")
|
||||
continue
|
||||
}
|
||||
return response, nil
|
||||
|
|
|
@ -19,6 +19,7 @@ package config
|
|||
import (
|
||||
"github.com/spf13/cobra"
|
||||
pkgConfig "k8s.io/minikube/pkg/minikube/config"
|
||||
"k8s.io/minikube/pkg/minikube/constants"
|
||||
"k8s.io/minikube/pkg/minikube/exit"
|
||||
)
|
||||
|
||||
|
@ -29,7 +30,7 @@ var configSetCmd = &cobra.Command{
|
|||
These values can be overwritten by flags or environment variables at runtime.`,
|
||||
Run: func(cmd *cobra.Command, args []string) {
|
||||
if len(args) != 2 {
|
||||
exit.Usage("usage: minikube config set PROPERTY_NAME PROPERTY_VALUE")
|
||||
exit.UsageT("usage: minikube config set PROPERTY_NAME PROPERTY_VALUE")
|
||||
}
|
||||
err := Set(args[0], args[1])
|
||||
if err != nil {
|
||||
|
@ -71,5 +72,5 @@ func Set(name string, value string) error {
|
|||
}
|
||||
|
||||
// Write the value
|
||||
return WriteConfig(config)
|
||||
return pkgConfig.WriteConfig(constants.ConfigFile, config)
|
||||
}
|
||||
|
|
|
@ -19,6 +19,7 @@ package config
|
|||
import (
|
||||
"github.com/spf13/cobra"
|
||||
pkgConfig "k8s.io/minikube/pkg/minikube/config"
|
||||
"k8s.io/minikube/pkg/minikube/constants"
|
||||
"k8s.io/minikube/pkg/minikube/exit"
|
||||
)
|
||||
|
||||
|
@ -28,9 +29,9 @@ var configUnsetCmd = &cobra.Command{
|
|||
Long: "unsets PROPERTY_NAME from the minikube config file. Can be overwritten by flags or environmental variables",
|
||||
Run: func(cmd *cobra.Command, args []string) {
|
||||
if len(args) != 1 {
|
||||
exit.Usage("usage: minikube config unset PROPERTY_NAME")
|
||||
exit.UsageT("usage: minikube config unset PROPERTY_NAME")
|
||||
}
|
||||
err := unset(args[0])
|
||||
err := Unset(args[0])
|
||||
if err != nil {
|
||||
exit.WithError("unset failed", err)
|
||||
}
|
||||
|
@ -41,11 +42,12 @@ func init() {
|
|||
ConfigCmd.AddCommand(configUnsetCmd)
|
||||
}
|
||||
|
||||
func unset(name string) error {
|
||||
// Unset unsets a property
|
||||
func Unset(name string) error {
|
||||
m, err := pkgConfig.ReadConfig()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
delete(m, name)
|
||||
return WriteConfig(m)
|
||||
return pkgConfig.WriteConfig(constants.ConfigFile, m)
|
||||
}
|
||||
|
|
|
@ -16,7 +16,11 @@ limitations under the License.
|
|||
|
||||
package config
|
||||
|
||||
import "testing"
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"k8s.io/minikube/pkg/minikube/config"
|
||||
)
|
||||
|
||||
func TestUnsetConfig(t *testing.T) {
|
||||
propName := "cpus"
|
||||
|
@ -25,8 +29,23 @@ func TestUnsetConfig(t *testing.T) {
|
|||
if err != nil {
|
||||
t.Errorf("Failed to set the property %q", propName)
|
||||
}
|
||||
err = unset(propName)
|
||||
|
||||
cpus, err := config.Get("cpus")
|
||||
if err != nil {
|
||||
t.Errorf("Failed to read config %q", err)
|
||||
}
|
||||
|
||||
if cpus != propValue {
|
||||
t.Errorf("Expected cpus to be %s but got %s", propValue, cpus)
|
||||
}
|
||||
|
||||
err = Unset(propName)
|
||||
if err != nil {
|
||||
t.Errorf("Failed to unset property %q", err)
|
||||
}
|
||||
|
||||
_, err = config.Get("cpus")
|
||||
if err != config.ErrKeyNotFound {
|
||||
t.Errorf("Expected error %q but got %q", config.ErrKeyNotFound, err)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -27,10 +27,10 @@ import (
|
|||
"k8s.io/minikube/pkg/minikube/cluster"
|
||||
"k8s.io/minikube/pkg/minikube/command"
|
||||
"k8s.io/minikube/pkg/minikube/config"
|
||||
"k8s.io/minikube/pkg/minikube/console"
|
||||
"k8s.io/minikube/pkg/minikube/constants"
|
||||
"k8s.io/minikube/pkg/minikube/exit"
|
||||
"k8s.io/minikube/pkg/minikube/machine"
|
||||
"k8s.io/minikube/pkg/minikube/out"
|
||||
"k8s.io/minikube/pkg/minikube/storageclass"
|
||||
)
|
||||
|
||||
|
@ -130,7 +130,7 @@ func EnableOrDisableAddon(name string, val string) error {
|
|||
|
||||
cfg, err := config.Load()
|
||||
if err != nil && !os.IsNotExist(err) {
|
||||
exit.WithCode(exit.Data, "Unable to load config: %v", err)
|
||||
exit.WithCodeT(exit.Data, "Unable to load config: {{.error}}", out.V{"error": err})
|
||||
}
|
||||
|
||||
data := assets.GenerateTemplateData(cfg.KubernetesConfig)
|
||||
|
@ -158,7 +158,7 @@ func enableOrDisableAddonInternal(addon *assets.Addon, cmd command.Runner, data
|
|||
var err error
|
||||
// check addon status before enabling/disabling it
|
||||
if err := isAddonAlreadySet(addon, enable); err != nil {
|
||||
console.ErrStyle(console.Conflict, "%v", err)
|
||||
out.ErrT(out.Conflict, "{{.error}}", out.V{"error": err})
|
||||
os.Exit(0)
|
||||
}
|
||||
|
||||
|
|
|
@ -25,7 +25,7 @@ import (
|
|||
)
|
||||
|
||||
var minikubeConfig = pkgConfig.MinikubeConfig{
|
||||
"vm-driver": constants.DriverKvmOld,
|
||||
"vm-driver": constants.DriverKvm2,
|
||||
"cpus": 12,
|
||||
"show-libmachine-logs": true,
|
||||
}
|
||||
|
|
|
@ -28,9 +28,9 @@ import (
|
|||
"github.com/pkg/errors"
|
||||
"k8s.io/minikube/pkg/minikube/assets"
|
||||
"k8s.io/minikube/pkg/minikube/config"
|
||||
"k8s.io/minikube/pkg/minikube/console"
|
||||
"k8s.io/minikube/pkg/minikube/constants"
|
||||
"k8s.io/minikube/pkg/minikube/cruntime"
|
||||
"k8s.io/minikube/pkg/minikube/out"
|
||||
)
|
||||
|
||||
// containerdOnlyMsg is the message shown when a containerd-only addon is enabled
|
||||
|
@ -55,7 +55,7 @@ func IsValidDriver(string, driver string) error {
|
|||
|
||||
// RequiresRestartMsg returns the "requires restart" message
|
||||
func RequiresRestartMsg(string, string) error {
|
||||
console.OutStyle(console.WarningType, "These changes will take effect upon a minikube delete and then a minikube start")
|
||||
out.T(out.WarningType, "These changes will take effect upon a minikube delete and then a minikube start")
|
||||
return nil
|
||||
}
|
||||
|
||||
|
|
|
@ -35,9 +35,9 @@ import (
|
|||
"k8s.io/minikube/pkg/minikube/assets"
|
||||
"k8s.io/minikube/pkg/minikube/cluster"
|
||||
pkg_config "k8s.io/minikube/pkg/minikube/config"
|
||||
"k8s.io/minikube/pkg/minikube/console"
|
||||
"k8s.io/minikube/pkg/minikube/exit"
|
||||
"k8s.io/minikube/pkg/minikube/machine"
|
||||
"k8s.io/minikube/pkg/minikube/out"
|
||||
"k8s.io/minikube/pkg/minikube/proxy"
|
||||
"k8s.io/minikube/pkg/minikube/service"
|
||||
"k8s.io/minikube/pkg/util"
|
||||
|
@ -58,7 +58,7 @@ var dashboardCmd = &cobra.Command{
|
|||
Run: func(cmd *cobra.Command, args []string) {
|
||||
cc, err := pkg_config.Load()
|
||||
if err != nil && !os.IsNotExist(err) {
|
||||
console.ErrLn("Error loading profile config: %v", err)
|
||||
exit.WithError("Error loading profile config", err)
|
||||
}
|
||||
|
||||
api, err := machine.NewAPIClient()
|
||||
|
@ -76,8 +76,7 @@ var dashboardCmd = &cobra.Command{
|
|||
if _, err = api.Load(pkg_config.GetMachineName()); err != nil {
|
||||
switch err := errors.Cause(err).(type) {
|
||||
case mcnerror.ErrHostDoesNotExist:
|
||||
console.OutStyle(console.Meh, "%q cluster does not exist", pkg_config.GetMachineName())
|
||||
os.Exit(exit.Unavailable)
|
||||
exit.WithCodeT(exit.Unavailable, "{{.name}} cluster does not exist", out.V{"name": pkg_config.GetMachineName()})
|
||||
default:
|
||||
exit.WithError("Error getting cluster", err)
|
||||
}
|
||||
|
@ -90,7 +89,7 @@ var dashboardCmd = &cobra.Command{
|
|||
|
||||
kubectl, err := exec.LookPath("kubectl")
|
||||
if err != nil {
|
||||
exit.WithCode(exit.NoInput, "kubectl not found in PATH, but is required for the dashboard. Installation guide: https://kubernetes.io/docs/tasks/tools/install-kubectl/")
|
||||
exit.WithCodeT(exit.NoInput, "kubectl not found in PATH, but is required for the dashboard. Installation guide: https://kubernetes.io/docs/tasks/tools/install-kubectl/")
|
||||
}
|
||||
|
||||
cluster.EnsureMinikubeRunningOrExit(api, 1)
|
||||
|
@ -100,7 +99,7 @@ var dashboardCmd = &cobra.Command{
|
|||
dashboardStatus, _ := dashboardAddon.IsEnabled()
|
||||
if !dashboardStatus {
|
||||
// Send status messages to stderr for folks re-using this output.
|
||||
console.ErrStyle(console.Enabling, "Enabling dashboard ...")
|
||||
out.ErrT(out.Enabling, "Enabling dashboard ...")
|
||||
// Enable the dashboard add-on
|
||||
err = configcmd.Set("dashboard", "true")
|
||||
if err != nil {
|
||||
|
@ -110,29 +109,29 @@ var dashboardCmd = &cobra.Command{
|
|||
|
||||
ns := "kube-system"
|
||||
svc := "kubernetes-dashboard"
|
||||
console.ErrStyle(console.Verifying, "Verifying dashboard health ...")
|
||||
out.ErrT(out.Verifying, "Verifying dashboard health ...")
|
||||
if err = util.RetryAfter(180, func() error { return service.CheckService(ns, svc) }, 1*time.Second); err != nil {
|
||||
exit.WithCode(exit.Unavailable, "%s:%s is not running: %v", ns, svc, err)
|
||||
exit.WithCodeT(exit.Unavailable, "dashboard service is not running: {{.error}}", out.V{"error": err})
|
||||
}
|
||||
|
||||
console.ErrStyle(console.Launch, "Launching proxy ...")
|
||||
out.ErrT(out.Launch, "Launching proxy ...")
|
||||
p, hostPort, err := kubectlProxy(kubectl)
|
||||
if err != nil {
|
||||
exit.WithError("kubectl proxy", err)
|
||||
}
|
||||
url := dashboardURL(hostPort, ns, svc)
|
||||
|
||||
console.ErrStyle(console.Verifying, "Verifying proxy health ...")
|
||||
out.ErrT(out.Verifying, "Verifying proxy health ...")
|
||||
if err = util.RetryAfter(60, func() error { return checkURL(url) }, 1*time.Second); err != nil {
|
||||
exit.WithCode(exit.Unavailable, "%s is not responding properly: %v", url, err)
|
||||
exit.WithCodeT(exit.Unavailable, "{{.url}} is not accessible: {{.error}}", out.V{"url": url, "error": err})
|
||||
}
|
||||
|
||||
if dashboardURLMode {
|
||||
console.OutLn(url)
|
||||
out.Ln(url)
|
||||
} else {
|
||||
console.ErrStyle(console.Celebrate, "Opening %s in your default browser...", url)
|
||||
out.ErrT(out.Celebrate, "Opening %s in your default browser...", out.V{"url": url})
|
||||
if err = browser.OpenURL(url); err != nil {
|
||||
console.Failure("failed to open browser: %v", err)
|
||||
exit.WithCodeT(exit.Software, "failed to open browser: {{.error}}", out.V{"error": err})
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -229,5 +228,4 @@ func checkURL(url string) error {
|
|||
|
||||
func init() {
|
||||
dashboardCmd.Flags().BoolVar(&dashboardURLMode, "url", false, "Display dashboard URL instead of opening a browser")
|
||||
RootCmd.AddCommand(dashboardCmd)
|
||||
}
|
||||
|
|
|
@ -28,10 +28,10 @@ import (
|
|||
cmdUtil "k8s.io/minikube/cmd/util"
|
||||
"k8s.io/minikube/pkg/minikube/cluster"
|
||||
pkg_config "k8s.io/minikube/pkg/minikube/config"
|
||||
"k8s.io/minikube/pkg/minikube/console"
|
||||
"k8s.io/minikube/pkg/minikube/constants"
|
||||
"k8s.io/minikube/pkg/minikube/exit"
|
||||
"k8s.io/minikube/pkg/minikube/machine"
|
||||
"k8s.io/minikube/pkg/minikube/out"
|
||||
pkgutil "k8s.io/minikube/pkg/util"
|
||||
)
|
||||
|
||||
|
@ -47,7 +47,7 @@ associated files.`,
|
|||
// runDelete handles the executes the flow of "minikube delete"
|
||||
func runDelete(cmd *cobra.Command, args []string) {
|
||||
if len(args) > 0 {
|
||||
exit.Usage("usage: minikube delete")
|
||||
exit.UsageT("usage: minikube delete")
|
||||
}
|
||||
profile := viper.GetString(pkg_config.MachineProfile)
|
||||
api, err := machine.NewAPIClient()
|
||||
|
@ -58,7 +58,7 @@ func runDelete(cmd *cobra.Command, args []string) {
|
|||
|
||||
cc, err := pkg_config.Load()
|
||||
if err != nil && !os.IsNotExist(err) {
|
||||
console.ErrLn("Error loading profile config: %v", err)
|
||||
out.ErrT(out.Sad, "Error loading profile config: {{.error}}", out.V{"name": profile})
|
||||
}
|
||||
|
||||
// In the case of "none", we want to uninstall Kubernetes as there is no VM to delete
|
||||
|
@ -69,41 +69,41 @@ func runDelete(cmd *cobra.Command, args []string) {
|
|||
if err = cluster.DeleteHost(api); err != nil {
|
||||
switch err := errors.Cause(err).(type) {
|
||||
case mcnerror.ErrHostDoesNotExist:
|
||||
console.OutStyle(console.Meh, "%q cluster does not exist", profile)
|
||||
out.T(out.Meh, `"{{.name}}" cluster does not exist`, out.V{"name": profile})
|
||||
default:
|
||||
exit.WithError("Failed to delete cluster", err)
|
||||
}
|
||||
}
|
||||
|
||||
if err := cmdUtil.KillMountProcess(); err != nil {
|
||||
console.Fatal("Failed to kill mount process: %v", err)
|
||||
out.FatalT("Failed to kill mount process: {{.error}}", out.V{"error": err})
|
||||
}
|
||||
|
||||
if err := os.RemoveAll(constants.GetProfilePath(viper.GetString(pkg_config.MachineProfile))); err != nil {
|
||||
if os.IsNotExist(err) {
|
||||
console.OutStyle(console.Meh, "%q profile does not exist", profile)
|
||||
out.T(out.Meh, `"{{.profile_name}}" profile does not exist`, out.V{"profile_name": profile})
|
||||
os.Exit(0)
|
||||
}
|
||||
exit.WithError("Failed to remove profile", err)
|
||||
}
|
||||
console.OutStyle(console.Crushed, "The %q cluster has been deleted.", profile)
|
||||
out.T(out.Crushed, `The "{{.cluster_name}}" cluster has been deleted.`, out.V{"cluster_name": profile})
|
||||
|
||||
machineName := pkg_config.GetMachineName()
|
||||
if err := pkgutil.DeleteKubeConfigContext(constants.KubeconfigPath, machineName); err != nil {
|
||||
exit.WithError("update config", err)
|
||||
}
|
||||
}
|
||||
|
||||
func uninstallKubernetes(api libmachine.API, kc pkg_config.KubernetesConfig, bsName string) {
|
||||
console.OutStyle(console.Resetting, "Uninstalling Kubernetes %s using %s ...", kc.KubernetesVersion, bsName)
|
||||
clusterBootstrapper, err := GetClusterBootstrapper(api, bsName)
|
||||
if err != nil {
|
||||
console.ErrLn("Unable to get bootstrapper: %v", err)
|
||||
} else if err = clusterBootstrapper.DeleteCluster(kc); err != nil {
|
||||
console.ErrLn("Failed to delete cluster: %v", err)
|
||||
if err := cmdcfg.Unset(pkg_config.MachineProfile); err != nil {
|
||||
exit.WithError("unset minikube profile", err)
|
||||
}
|
||||
}
|
||||
|
||||
func init() {
|
||||
RootCmd.AddCommand(deleteCmd)
|
||||
func uninstallKubernetes(api libmachine.API, kc pkg_config.KubernetesConfig, bsName string) {
|
||||
out.T(out.Resetting, "Uninstalling Kubernetes {{.kubernetes_version}} using {{.bootstrapper_name}} ...", out.V{"kubernetes_version": kc.KubernetesVersion, "bootstrapper_name": bsName})
|
||||
clusterBootstrapper, err := getClusterBootstrapper(api, bsName)
|
||||
if err != nil {
|
||||
out.ErrT(out.Empty, "Unable to get bootstrapper: {{.error}}", out.V{"error": err})
|
||||
} else if err = clusterBootstrapper.DeleteCluster(kc); err != nil {
|
||||
out.ErrT(out.Empty, "Failed to delete cluster: {{.error}}", out.V{"error": err})
|
||||
}
|
||||
}
|
||||
|
|
|
@ -344,21 +344,21 @@ var dockerEnvCmd = &cobra.Command{
|
|||
exit.WithError("Error getting host", err)
|
||||
}
|
||||
if host.Driver.DriverName() == constants.DriverNone {
|
||||
exit.Usage(`'none' driver does not support 'minikube docker-env' command`)
|
||||
exit.UsageT(`'none' driver does not support 'minikube docker-env' command`)
|
||||
}
|
||||
hostSt, err := cluster.GetHostStatus(api)
|
||||
if err != nil {
|
||||
exit.WithError("Error getting host status", err)
|
||||
}
|
||||
if hostSt != state.Running.String() {
|
||||
exit.WithCode(exit.Unavailable, `The docker host is currently not running`)
|
||||
exit.WithCodeT(exit.Unavailable, `The docker host is currently not running`)
|
||||
}
|
||||
docker, err := GetDockerActive(host)
|
||||
if err != nil {
|
||||
exit.WithError("Error getting service status", err)
|
||||
}
|
||||
if !docker {
|
||||
exit.WithCode(exit.Unavailable, `The docker service is currently not active`)
|
||||
exit.WithCodeT(exit.Unavailable, `The docker service is currently not active`)
|
||||
}
|
||||
|
||||
var shellCfg *ShellConfig
|
||||
|
@ -382,7 +382,6 @@ var dockerEnvCmd = &cobra.Command{
|
|||
}
|
||||
|
||||
func init() {
|
||||
RootCmd.AddCommand(dockerEnvCmd)
|
||||
defaultShellDetector = &LibmachineShellDetector{}
|
||||
defaultNoProxyGetter = &EnvNoProxyGetter{}
|
||||
dockerEnvCmd.Flags().BoolVar(&noProxy, "no-proxy", false, "Add machine IP to NO_PROXY environment variable")
|
||||
|
|
|
@ -20,7 +20,6 @@ import (
|
|||
"reflect"
|
||||
"testing"
|
||||
|
||||
"github.com/docker/machine/libmachine"
|
||||
"github.com/docker/machine/libmachine/host"
|
||||
"k8s.io/minikube/pkg/minikube/config"
|
||||
"k8s.io/minikube/pkg/minikube/constants"
|
||||
|
@ -71,7 +70,7 @@ func newShellCfg(shell, prefix, suffix, delim string) *ShellConfig {
|
|||
func TestShellCfgSet(t *testing.T) {
|
||||
var tests = []struct {
|
||||
description string
|
||||
api libmachine.API
|
||||
api *tests.MockAPI
|
||||
shell string
|
||||
noProxyVar string
|
||||
noProxyValue string
|
||||
|
@ -236,7 +235,7 @@ func TestShellCfgSet(t *testing.T) {
|
|||
defaultShellDetector = &FakeShellDetector{test.shell}
|
||||
defaultNoProxyGetter = &FakeNoProxyGetter{test.noProxyVar, test.noProxyValue}
|
||||
noProxy = test.noProxyFlag
|
||||
|
||||
test.api.T = t
|
||||
shellCfg, err := shellCfgSet(test.api)
|
||||
if !reflect.DeepEqual(shellCfg, test.expectedShellCfg) {
|
||||
t.Errorf("Shell cfgs differ: expected %+v, \n\n got %+v", test.expectedShellCfg, shellCfg)
|
||||
|
|
|
@ -21,9 +21,9 @@ import (
|
|||
"github.com/pkg/errors"
|
||||
"github.com/spf13/cobra"
|
||||
"k8s.io/minikube/pkg/minikube/config"
|
||||
"k8s.io/minikube/pkg/minikube/console"
|
||||
"k8s.io/minikube/pkg/minikube/exit"
|
||||
"k8s.io/minikube/pkg/minikube/machine"
|
||||
"k8s.io/minikube/pkg/minikube/out"
|
||||
)
|
||||
|
||||
// ipCmd represents the ip command
|
||||
|
@ -42,7 +42,7 @@ var ipCmd = &cobra.Command{
|
|||
if err != nil {
|
||||
switch err := errors.Cause(err).(type) {
|
||||
case mcnerror.ErrHostDoesNotExist:
|
||||
exit.WithCode(exit.NoInput, "%q host does not exist, unable to show an IP", config.GetMachineName())
|
||||
exit.WithCodeT(exit.NoInput, `"{{.profile_name}}" host does not exist, unable to show an IP`, out.V{"profile_name": config.GetMachineName()})
|
||||
default:
|
||||
exit.WithError("Error getting host", err)
|
||||
}
|
||||
|
@ -51,10 +51,6 @@ var ipCmd = &cobra.Command{
|
|||
if err != nil {
|
||||
exit.WithError("Error getting IP", err)
|
||||
}
|
||||
console.OutLn(ip)
|
||||
out.Ln(ip)
|
||||
},
|
||||
}
|
||||
|
||||
func init() {
|
||||
RootCmd.AddCommand(ipCmd)
|
||||
}
|
||||
|
|
|
@ -26,10 +26,10 @@ import (
|
|||
"github.com/golang/glog"
|
||||
"github.com/spf13/cobra"
|
||||
pkg_config "k8s.io/minikube/pkg/minikube/config"
|
||||
"k8s.io/minikube/pkg/minikube/console"
|
||||
"k8s.io/minikube/pkg/minikube/constants"
|
||||
"k8s.io/minikube/pkg/minikube/exit"
|
||||
"k8s.io/minikube/pkg/minikube/machine"
|
||||
"k8s.io/minikube/pkg/minikube/out"
|
||||
)
|
||||
|
||||
// kubectlCmd represents the kubectl command
|
||||
|
@ -50,7 +50,7 @@ kubectl get pods --namespace kube-system`,
|
|||
|
||||
cc, err := pkg_config.Load()
|
||||
if err != nil && !os.IsNotExist(err) {
|
||||
console.ErrLn("Error loading profile config: %v", err)
|
||||
out.ErrLn("Error loading profile config: %v", err)
|
||||
}
|
||||
|
||||
binary := "kubectl"
|
||||
|
@ -86,7 +86,3 @@ kubectl get pods --namespace kube-system`,
|
|||
}
|
||||
},
|
||||
}
|
||||
|
||||
func init() {
|
||||
RootCmd.AddCommand(kubectlCmd)
|
||||
}
|
||||
|
|
|
@ -66,7 +66,7 @@ var logsCmd = &cobra.Command{
|
|||
if err != nil {
|
||||
exit.WithError("command runner", err)
|
||||
}
|
||||
bs, err := GetClusterBootstrapper(api, viper.GetString(cmdcfg.Bootstrapper))
|
||||
bs, err := getClusterBootstrapper(api, viper.GetString(cmdcfg.Bootstrapper))
|
||||
if err != nil {
|
||||
exit.WithError("Error getting cluster bootstrapper", err)
|
||||
}
|
||||
|
@ -97,6 +97,5 @@ var logsCmd = &cobra.Command{
|
|||
func init() {
|
||||
logsCmd.Flags().BoolVarP(&followLogs, "follow", "f", false, "Show only the most recent journal entries, and continuously print new entries as they are appended to the journal.")
|
||||
logsCmd.Flags().BoolVar(&showProblems, "problems", false, "Show only log entries which point to known problems")
|
||||
logsCmd.Flags().IntVarP(&numberOfLines, "length", "n", 50, "Number of lines back to go within the log")
|
||||
RootCmd.AddCommand(logsCmd)
|
||||
logsCmd.Flags().IntVarP(&numberOfLines, "length", "n", 30, "Number of lines back to go within the log")
|
||||
}
|
||||
|
|
|
@ -17,6 +17,7 @@ limitations under the License.
|
|||
package cmd
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"net"
|
||||
"os"
|
||||
"os/signal"
|
||||
|
@ -30,10 +31,10 @@ import (
|
|||
cmdUtil "k8s.io/minikube/cmd/util"
|
||||
"k8s.io/minikube/pkg/minikube/cluster"
|
||||
"k8s.io/minikube/pkg/minikube/config"
|
||||
"k8s.io/minikube/pkg/minikube/console"
|
||||
"k8s.io/minikube/pkg/minikube/constants"
|
||||
"k8s.io/minikube/pkg/minikube/exit"
|
||||
"k8s.io/minikube/pkg/minikube/machine"
|
||||
"k8s.io/minikube/pkg/minikube/out"
|
||||
"k8s.io/minikube/third_party/go9p/ufs"
|
||||
)
|
||||
|
||||
|
@ -68,25 +69,25 @@ var mountCmd = &cobra.Command{
|
|||
}
|
||||
|
||||
if len(args) != 1 {
|
||||
exit.Usage(`Please specify the directory to be mounted:
|
||||
exit.UsageT(`Please specify the directory to be mounted:
|
||||
minikube mount <source directory>:<target directory> (example: "/host-home:/vm-home")`)
|
||||
}
|
||||
mountString := args[0]
|
||||
idx := strings.LastIndex(mountString, ":")
|
||||
if idx == -1 { // no ":" was present
|
||||
exit.Usage(`mount argument %q must be in form: <source directory>:<target directory>`, mountString)
|
||||
exit.UsageT(`mount argument "{{.value}}" must be in form: <source directory>:<target directory>`, out.V{"value": mountString})
|
||||
}
|
||||
hostPath := mountString[:idx]
|
||||
vmPath := mountString[idx+1:]
|
||||
if _, err := os.Stat(hostPath); err != nil {
|
||||
if os.IsNotExist(err) {
|
||||
exit.WithCode(exit.NoInput, "Cannot find directory %s for mount", hostPath)
|
||||
exit.WithCodeT(exit.NoInput, "Cannot find directory {{.path}} for mount", out.V{"path": hostPath})
|
||||
} else {
|
||||
exit.WithError("stat failed", err)
|
||||
}
|
||||
}
|
||||
if len(vmPath) == 0 || !strings.HasPrefix(vmPath, "/") {
|
||||
exit.Usage("Target directory %q must be an absolute path", vmPath)
|
||||
exit.UsageT("Target directory {{.path}} must be an absolute path", out.V{"path": vmPath})
|
||||
}
|
||||
var debugVal int
|
||||
if glog.V(1) {
|
||||
|
@ -103,7 +104,7 @@ var mountCmd = &cobra.Command{
|
|||
exit.WithError("Error loading api", err)
|
||||
}
|
||||
if host.Driver.DriverName() == constants.DriverNone {
|
||||
exit.Usage(`'none' driver does not support 'minikube mount' command`)
|
||||
exit.UsageT(`'none' driver does not support 'minikube mount' command`)
|
||||
}
|
||||
var ip net.IP
|
||||
if mountIP == "" {
|
||||
|
@ -114,7 +115,7 @@ var mountCmd = &cobra.Command{
|
|||
} else {
|
||||
ip = net.ParseIP(mountIP)
|
||||
if ip == nil {
|
||||
exit.WithCode(exit.Data, "error parsing the input ip address for mount")
|
||||
exit.WithCodeT(exit.Data, "error parsing the input ip address for mount")
|
||||
}
|
||||
}
|
||||
port, err := cmdUtil.GetPort()
|
||||
|
@ -142,29 +143,27 @@ var mountCmd = &cobra.Command{
|
|||
cfg.Options[parts[0]] = parts[1]
|
||||
}
|
||||
|
||||
console.OutStyle(console.Mounting, "Mounting host path %s into VM as %s ...", hostPath, vmPath)
|
||||
console.OutStyle(console.MountOptions, "Mount options:")
|
||||
console.OutStyle(console.Option, "Type: %s", cfg.Type)
|
||||
console.OutStyle(console.Option, "UID: %s", cfg.UID)
|
||||
console.OutStyle(console.Option, "GID: %s", cfg.GID)
|
||||
console.OutStyle(console.Option, "Version: %s", cfg.Version)
|
||||
console.OutStyle(console.Option, "MSize: %d", cfg.MSize)
|
||||
console.OutStyle(console.Option, "Mode: %o (%s)", cfg.Mode, cfg.Mode)
|
||||
console.OutStyle(console.Option, "Options: %s", cfg.Options)
|
||||
out.T(out.Mounting, "Mounting host path {{.sourcePath}} into VM as {{.destinationPath}} ...", out.V{"sourcePath": hostPath, "destinationPath": vmPath})
|
||||
out.T(out.Option, "Mount type: {{.name}}", out.V{"type": cfg.Type})
|
||||
out.T(out.Option, "User ID: {{.userID}}", out.V{"userID": cfg.UID})
|
||||
out.T(out.Option, "Group ID: {{.groupID}}", out.V{"groupID": cfg.GID})
|
||||
out.T(out.Option, "Version: {{.version}}", out.V{"version": cfg.Version})
|
||||
out.T(out.Option, "Message Size: {{.size}}", out.V{"size": cfg.MSize})
|
||||
out.T(out.Option, "Permissions: {{.octalMode}} ({{.writtenMode}})", out.V{"octalMode": fmt.Sprintf("%o", cfg.Mode), "writtenMode": cfg.Mode})
|
||||
out.T(out.Option, "Options: {{.options}}", out.V{"options": cfg.Options})
|
||||
|
||||
// An escape valve to allow future hackers to try NFS, VirtFS, or other FS types.
|
||||
if !supportedFilesystems[cfg.Type] {
|
||||
console.OutLn("")
|
||||
console.OutStyle(console.WarningType, "%s is not yet a supported filesystem. We will try anyways!", cfg.Type)
|
||||
out.T(out.WarningType, "{{.type}} is not yet a supported filesystem. We will try anyways!", out.V{"type": cfg.Type})
|
||||
}
|
||||
|
||||
var wg sync.WaitGroup
|
||||
if cfg.Type == nineP {
|
||||
wg.Add(1)
|
||||
go func() {
|
||||
console.OutStyle(console.Fileserver, "Userspace file server: ")
|
||||
out.T(out.Fileserver, "Userspace file server: ")
|
||||
ufs.StartServer(net.JoinHostPort(ip.String(), strconv.Itoa(port)), debugVal, hostPath)
|
||||
console.OutStyle(console.Stopped, "Userspace file server is shutdown")
|
||||
out.T(out.Stopped, "Userspace file server is shutdown")
|
||||
wg.Done()
|
||||
}()
|
||||
}
|
||||
|
@ -180,12 +179,12 @@ var mountCmd = &cobra.Command{
|
|||
signal.Notify(c, os.Interrupt, syscall.SIGTERM)
|
||||
go func() {
|
||||
for sig := range c {
|
||||
console.OutStyle(console.Unmount, "Unmounting %s ...", vmPath)
|
||||
out.T(out.Unmount, "Unmounting {{.path}} ...", out.V{"path": vmPath})
|
||||
err := cluster.Unmount(runner, vmPath)
|
||||
if err != nil {
|
||||
console.ErrStyle(console.FailureType, "Failed unmount: %v", err)
|
||||
out.ErrT(out.FailureType, "Failed unmount: {{.error}}", out.V{"error": err})
|
||||
}
|
||||
exit.WithCode(exit.Interrupted, "Exiting due to %s signal", sig)
|
||||
exit.WithCodeT(exit.Interrupted, "Received {{.name}} signal", out.V{"name": sig})
|
||||
}
|
||||
}()
|
||||
|
||||
|
@ -193,9 +192,9 @@ var mountCmd = &cobra.Command{
|
|||
if err != nil {
|
||||
exit.WithError("mount failed", err)
|
||||
}
|
||||
console.OutStyle(console.SuccessType, "Successfully mounted %s to %s", hostPath, vmPath)
|
||||
console.OutLn("")
|
||||
console.OutStyle(console.Notice, "NOTE: This process must stay alive for the mount to be accessible ...")
|
||||
out.T(out.SuccessType, "Successfully mounted {{.sourcePath}} to {{.destinationPath}}", out.V{"sourcePath": hostPath, "destinationPath": vmPath})
|
||||
out.Ln("")
|
||||
out.T(out.Notice, "NOTE: This process must stay alive for the mount to be accessible ...")
|
||||
wg.Wait()
|
||||
},
|
||||
}
|
||||
|
@ -210,5 +209,4 @@ func init() {
|
|||
mountCmd.Flags().UintVar(&mode, "mode", 0755, "File permissions used for the mount")
|
||||
mountCmd.Flags().StringSliceVar(&options, "options", []string{}, "Additional mount options, such as cache=fscache")
|
||||
mountCmd.Flags().IntVar(&mSize, "msize", constants.DefaultMsize, "The number of bytes to use for 9p packet payload")
|
||||
RootCmd.AddCommand(mountCmd)
|
||||
}
|
||||
|
|
|
@ -30,6 +30,7 @@ import (
|
|||
"github.com/spf13/cobra"
|
||||
"github.com/spf13/pflag"
|
||||
"github.com/spf13/viper"
|
||||
"k8s.io/kubectl/pkg/util/templates"
|
||||
configCmd "k8s.io/minikube/cmd/minikube/cmd/config"
|
||||
"k8s.io/minikube/pkg/minikube/bootstrapper"
|
||||
"k8s.io/minikube/pkg/minikube/bootstrapper/kubeadm"
|
||||
|
@ -128,9 +129,66 @@ func setFlagsUsingViper() {
|
|||
func init() {
|
||||
RootCmd.PersistentFlags().StringP(config.MachineProfile, "p", constants.DefaultMachineName, `The name of the minikube VM being used. This can be set to allow having multiple instances of minikube independently.`)
|
||||
RootCmd.PersistentFlags().StringP(configCmd.Bootstrapper, "b", constants.DefaultClusterBootstrapper, "The name of the cluster bootstrapper that will set up the kubernetes cluster.")
|
||||
RootCmd.AddCommand(configCmd.ConfigCmd)
|
||||
RootCmd.AddCommand(configCmd.AddonsCmd)
|
||||
RootCmd.AddCommand(configCmd.ProfileCmd)
|
||||
|
||||
groups := templates.CommandGroups{
|
||||
{
|
||||
Message: "Basic Commands:",
|
||||
Commands: []*cobra.Command{
|
||||
startCmd,
|
||||
statusCmd,
|
||||
stopCmd,
|
||||
deleteCmd,
|
||||
dashboardCmd,
|
||||
},
|
||||
},
|
||||
{
|
||||
Message: "Images Commands:",
|
||||
Commands: []*cobra.Command{
|
||||
dockerEnvCmd,
|
||||
cacheCmd,
|
||||
},
|
||||
},
|
||||
{
|
||||
Message: "Configuration and Management Commands:",
|
||||
Commands: []*cobra.Command{
|
||||
configCmd.AddonsCmd,
|
||||
configCmd.ConfigCmd,
|
||||
configCmd.ProfileCmd,
|
||||
updateContextCmd,
|
||||
},
|
||||
},
|
||||
{
|
||||
Message: "Networking and Connectivity Commands:",
|
||||
Commands: []*cobra.Command{
|
||||
serviceCmd,
|
||||
tunnelCmd,
|
||||
},
|
||||
},
|
||||
{
|
||||
Message: "Advanced Commands:",
|
||||
Commands: []*cobra.Command{
|
||||
mountCmd,
|
||||
sshCmd,
|
||||
kubectlCmd,
|
||||
},
|
||||
},
|
||||
{
|
||||
Message: "Troubleshooting Commands:",
|
||||
Commands: []*cobra.Command{
|
||||
sshKeyCmd,
|
||||
ipCmd,
|
||||
logsCmd,
|
||||
updateCheckCmd,
|
||||
versionCmd,
|
||||
},
|
||||
},
|
||||
}
|
||||
groups.Add(RootCmd)
|
||||
|
||||
// any not grouped command will show in Other Commands group.
|
||||
RootCmd.AddCommand(completionCmd)
|
||||
templates.ActsAsRootCommand(RootCmd, []string{"options"}, groups...)
|
||||
|
||||
pflag.CommandLine.AddGoFlagSet(goflag.CommandLine)
|
||||
if err := viper.BindPFlags(RootCmd.PersistentFlags()); err != nil {
|
||||
exit.WithError("Unable to bind flags", err)
|
||||
|
@ -170,8 +228,8 @@ func setupViper() {
|
|||
setFlagsUsingViper()
|
||||
}
|
||||
|
||||
// GetClusterBootstrapper returns a new bootstrapper for the cluster
|
||||
func GetClusterBootstrapper(api libmachine.API, bootstrapperName string) (bootstrapper.Bootstrapper, error) {
|
||||
// getClusterBootstrapper returns a new bootstrapper for the cluster
|
||||
func getClusterBootstrapper(api libmachine.API, bootstrapperName string) (bootstrapper.Bootstrapper, error) {
|
||||
var b bootstrapper.Bootstrapper
|
||||
var err error
|
||||
switch bootstrapperName {
|
||||
|
|
|
@ -55,7 +55,7 @@ var serviceCmd = &cobra.Command{
|
|||
},
|
||||
Run: func(cmd *cobra.Command, args []string) {
|
||||
if len(args) == 0 || len(args) > 1 {
|
||||
exit.Usage("You must specify a service name")
|
||||
exit.UsageT("You must specify a service name")
|
||||
}
|
||||
|
||||
svc := args[0]
|
||||
|
@ -83,5 +83,4 @@ func init() {
|
|||
|
||||
serviceCmd.PersistentFlags().StringVar(&serviceURLFormat, "format", defaultServiceFormatTemplate, "Format to output service URL in. This format will be applied to each url individually and they will be printed one at a time.")
|
||||
|
||||
RootCmd.AddCommand(serviceCmd)
|
||||
}
|
||||
|
|
|
@ -22,9 +22,9 @@ import (
|
|||
|
||||
"github.com/spf13/cobra"
|
||||
core "k8s.io/api/core/v1"
|
||||
"k8s.io/minikube/pkg/minikube/console"
|
||||
"k8s.io/minikube/pkg/minikube/exit"
|
||||
"k8s.io/minikube/pkg/minikube/machine"
|
||||
"k8s.io/minikube/pkg/minikube/out"
|
||||
"k8s.io/minikube/pkg/minikube/service"
|
||||
)
|
||||
|
||||
|
@ -43,8 +43,8 @@ var serviceListCmd = &cobra.Command{
|
|||
defer api.Close()
|
||||
serviceURLs, err := service.GetServiceURLs(api, serviceListNamespace, serviceURLTemplate)
|
||||
if err != nil {
|
||||
console.Fatal("Failed to get service URL: %v", err)
|
||||
console.ErrStyle(console.Notice, "Check that minikube is running and that you have specified the correct namespace (-n flag) if required.")
|
||||
out.FatalT("Failed to get service URL: {{.error}}", out.V{"error": err})
|
||||
out.ErrT(out.Notice, "Check that minikube is running and that you have specified the correct namespace (-n flag) if required.")
|
||||
os.Exit(exit.Unavailable)
|
||||
}
|
||||
|
||||
|
|
|
@ -21,8 +21,8 @@ import (
|
|||
|
||||
"github.com/spf13/cobra"
|
||||
"k8s.io/minikube/pkg/minikube/config"
|
||||
"k8s.io/minikube/pkg/minikube/console"
|
||||
"k8s.io/minikube/pkg/minikube/constants"
|
||||
"k8s.io/minikube/pkg/minikube/out"
|
||||
)
|
||||
|
||||
// sshKeyCmd represents the sshKey command
|
||||
|
@ -31,10 +31,6 @@ var sshKeyCmd = &cobra.Command{
|
|||
Short: "Retrieve the ssh identity key path of the specified cluster",
|
||||
Long: "Retrieve the ssh identity key path of the specified cluster.",
|
||||
Run: func(cmd *cobra.Command, args []string) {
|
||||
console.OutLn(filepath.Join(constants.GetMinipath(), "machines", config.GetMachineName(), "id_rsa"))
|
||||
out.Ln(filepath.Join(constants.GetMinipath(), "machines", config.GetMachineName(), "id_rsa"))
|
||||
},
|
||||
}
|
||||
|
||||
func init() {
|
||||
RootCmd.AddCommand(sshKeyCmd)
|
||||
}
|
||||
|
|
|
@ -22,10 +22,10 @@ import (
|
|||
"github.com/spf13/cobra"
|
||||
"k8s.io/minikube/pkg/minikube/cluster"
|
||||
"k8s.io/minikube/pkg/minikube/config"
|
||||
"k8s.io/minikube/pkg/minikube/console"
|
||||
"k8s.io/minikube/pkg/minikube/constants"
|
||||
"k8s.io/minikube/pkg/minikube/exit"
|
||||
"k8s.io/minikube/pkg/minikube/machine"
|
||||
"k8s.io/minikube/pkg/minikube/out"
|
||||
)
|
||||
|
||||
// sshCmd represents the docker-ssh command
|
||||
|
@ -44,18 +44,14 @@ var sshCmd = &cobra.Command{
|
|||
exit.WithError("Error getting host", err)
|
||||
}
|
||||
if host.Driver.DriverName() == constants.DriverNone {
|
||||
exit.Usage("'none' driver does not support 'minikube ssh' command")
|
||||
exit.UsageT("'none' driver does not support 'minikube ssh' command")
|
||||
}
|
||||
err = cluster.CreateSSHShell(api, args)
|
||||
if err != nil {
|
||||
// This is typically due to a non-zero exit code, so no need for flourish.
|
||||
console.ErrLn("ssh: %v", err)
|
||||
out.ErrLn("ssh: %v", err)
|
||||
// It'd be nice if we could pass up the correct error code here :(
|
||||
os.Exit(exit.Failure)
|
||||
}
|
||||
},
|
||||
}
|
||||
|
||||
func init() {
|
||||
RootCmd.AddCommand(sshCmd)
|
||||
}
|
||||
|
|
|
@ -41,6 +41,7 @@ import (
|
|||
"github.com/google/go-containerregistry/pkg/authn"
|
||||
"github.com/google/go-containerregistry/pkg/name"
|
||||
"github.com/google/go-containerregistry/pkg/v1/remote"
|
||||
gopshost "github.com/shirou/gopsutil/host"
|
||||
"github.com/spf13/cobra"
|
||||
"github.com/spf13/viper"
|
||||
"golang.org/x/sync/errgroup"
|
||||
|
@ -51,12 +52,12 @@ import (
|
|||
"k8s.io/minikube/pkg/minikube/cluster"
|
||||
"k8s.io/minikube/pkg/minikube/command"
|
||||
cfg "k8s.io/minikube/pkg/minikube/config"
|
||||
"k8s.io/minikube/pkg/minikube/console"
|
||||
"k8s.io/minikube/pkg/minikube/constants"
|
||||
"k8s.io/minikube/pkg/minikube/cruntime"
|
||||
"k8s.io/minikube/pkg/minikube/exit"
|
||||
"k8s.io/minikube/pkg/minikube/logs"
|
||||
"k8s.io/minikube/pkg/minikube/machine"
|
||||
"k8s.io/minikube/pkg/minikube/out"
|
||||
"k8s.io/minikube/pkg/minikube/proxy"
|
||||
pkgutil "k8s.io/minikube/pkg/util"
|
||||
"k8s.io/minikube/pkg/version"
|
||||
|
@ -68,7 +69,6 @@ const (
|
|||
cpus = "cpus"
|
||||
humanReadableDiskSize = "disk-size"
|
||||
vmDriver = "vm-driver"
|
||||
xhyveDiskDriver = "xhyve-disk-driver"
|
||||
nfsSharesRoot = "nfs-shares-root"
|
||||
nfsShare = "nfs-share"
|
||||
kubernetesVersion = "kubernetes-version"
|
||||
|
@ -102,6 +102,7 @@ const (
|
|||
downloadOnly = "download-only"
|
||||
dnsProxy = "dns-proxy"
|
||||
hostDNSResolver = "host-dns-resolver"
|
||||
waitUntilHealthy = "wait"
|
||||
)
|
||||
|
||||
var (
|
||||
|
@ -115,82 +116,163 @@ var (
|
|||
)
|
||||
|
||||
func init() {
|
||||
startCmd.Flags().Bool(keepContext, constants.DefaultKeepContext, "This will keep the existing kubectl context and will create a minikube context.")
|
||||
startCmd.Flags().Bool(createMount, false, "This will start the mount daemon and automatically mount files into minikube")
|
||||
startCmd.Flags().String(mountString, constants.DefaultMountDir+":"+constants.DefaultMountEndpoint, "The argument to pass the minikube mount command on start")
|
||||
startCmd.Flags().Bool(disableDriverMounts, false, "Disables the filesystem mounts provided by the hypervisors (vboxfs, xhyve-9p)")
|
||||
startCmd.Flags().String(isoURL, constants.DefaultISOURL, "Location of the minikube iso")
|
||||
startCmd.Flags().String(vmDriver, constants.DefaultVMDriver, fmt.Sprintf("VM driver is one of: %v", constants.SupportedVMDrivers))
|
||||
startCmd.Flags().String(memory, constants.DefaultMemorySize, "Amount of RAM allocated to the minikube VM (format: <number>[<unit>], where unit = b, k, m or g)")
|
||||
initMinikubeFlags()
|
||||
initKubernetesFlags()
|
||||
initDriverFlags()
|
||||
initNetworkingFlags()
|
||||
if err := viper.BindPFlags(startCmd.Flags()); err != nil {
|
||||
exit.WithError("unable to bind flags", err)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// initMinikubeFlags includes commandline flags for minikube.
|
||||
func initMinikubeFlags() {
|
||||
viper.SetEnvPrefix(constants.MinikubeEnvPrefix)
|
||||
// Replaces '-' in flags with '_' in env variables
|
||||
// e.g. iso-url => $ENVPREFIX_ISO_URL
|
||||
viper.SetEnvKeyReplacer(strings.NewReplacer("-", "_"))
|
||||
viper.AutomaticEnv()
|
||||
|
||||
startCmd.Flags().Int(cpus, constants.DefaultCPUS, "Number of CPUs allocated to the minikube VM")
|
||||
startCmd.Flags().String(memory, constants.DefaultMemorySize, "Amount of RAM allocated to the minikube VM (format: <number>[<unit>], where unit = b, k, m or g)")
|
||||
startCmd.Flags().String(humanReadableDiskSize, constants.DefaultDiskSize, "Disk size allocated to the minikube VM (format: <number>[<unit>], where unit = b, k, m or g)")
|
||||
startCmd.Flags().String(hostOnlyCIDR, "192.168.99.1/24", "The CIDR to be used for the minikube VM (only supported with Virtualbox driver)")
|
||||
startCmd.Flags().String(hypervVirtualSwitch, "", "The hyperv virtual switch name. Defaults to first found. (only supported with HyperV driver)")
|
||||
startCmd.Flags().String(kvmNetwork, "default", "The KVM network name. (only supported with KVM driver)")
|
||||
startCmd.Flags().String(kvmQemuURI, "qemu:///system", "The KVM QEMU connection URI. (works only with kvm2 driver on linux)")
|
||||
startCmd.Flags().Bool(kvmGPU, false, "Enable experimental NVIDIA GPU support in minikube")
|
||||
startCmd.Flags().Bool(kvmHidden, false, "Hide the hypervisor signature from the guest in minikube")
|
||||
startCmd.Flags().String(xhyveDiskDriver, "ahci-hd", "The disk driver to use [ahci-hd|virtio-blk] (only supported with xhyve driver)")
|
||||
startCmd.Flags().StringSlice(nfsShare, []string{}, "Local folders to share with Guest via NFS mounts (Only supported on with hyperkit now)")
|
||||
startCmd.Flags().String(nfsSharesRoot, "/nfsshares", "Where to root the NFS Shares (defaults to /nfsshares, only supported with hyperkit now)")
|
||||
startCmd.Flags().StringArrayVar(&dockerEnv, "docker-env", nil, "Environment variables to pass to the Docker daemon. (format: key=value)")
|
||||
startCmd.Flags().StringArrayVar(&dockerOpt, "docker-opt", nil, "Specify arbitrary flags to pass to the Docker daemon. (format: key=value)")
|
||||
startCmd.Flags().Int(apiServerPort, pkgutil.APIServerPort, "The apiserver listening port")
|
||||
startCmd.Flags().String(apiServerName, constants.APIServerName, "The apiserver name which is used in the generated certificate for kubernetes. This can be used if you want to make the apiserver available from outside the machine")
|
||||
startCmd.Flags().StringArrayVar(&apiServerNames, "apiserver-names", nil, "A set of apiserver names which are used in the generated certificate for kubernetes. This can be used if you want to make the apiserver available from outside the machine")
|
||||
startCmd.Flags().IPSliceVar(&apiServerIPs, "apiserver-ips", nil, "A set of apiserver IP Addresses which are used in the generated certificate for kubernetes. This can be used if you want to make the apiserver available from outside the machine")
|
||||
startCmd.Flags().String(dnsDomain, constants.ClusterDNSDomain, "The cluster dns domain name used in the kubernetes cluster")
|
||||
startCmd.Flags().String(serviceCIDR, pkgutil.DefaultServiceCIDR, "The CIDR to be used for service cluster IPs.")
|
||||
startCmd.Flags().StringSliceVar(&insecureRegistry, "insecure-registry", nil, "Insecure Docker registries to pass to the Docker daemon. The default service CIDR range will automatically be added.")
|
||||
startCmd.Flags().StringSliceVar(®istryMirror, "registry-mirror", nil, "Registry mirrors to pass to the Docker daemon")
|
||||
startCmd.Flags().String(imageRepository, "", "Alternative image repository to pull docker images from. This can be used when you have limited access to gcr.io. Set it to \"auto\" to let minikube decide one for you. For Chinese mainland users, you may use local gcr.io mirrors such as registry.cn-hangzhou.aliyuncs.com/google_containers")
|
||||
startCmd.Flags().String(imageMirrorCountry, "", "Country code of the image mirror to be used. Leave empty to use the global one. For Chinese mainland users, set it to cn")
|
||||
startCmd.Flags().String(containerRuntime, "docker", "The container runtime to be used (docker, crio, containerd)")
|
||||
startCmd.Flags().String(criSocket, "", "The cri socket path to be used")
|
||||
startCmd.Flags().String(kubernetesVersion, constants.DefaultKubernetesVersion, "The kubernetes version that the minikube VM will use (ex: v1.2.3)")
|
||||
startCmd.Flags().String(networkPlugin, "", "The name of the network plugin")
|
||||
startCmd.Flags().Bool(enableDefaultCNI, false, "Enable the default CNI plugin (/etc/cni/net.d/k8s.conf). Used in conjunction with \"--network-plugin=cni\"")
|
||||
startCmd.Flags().String(featureGates, "", "A set of key=value pairs that describe feature gates for alpha/experimental features.")
|
||||
startCmd.Flags().Bool(downloadOnly, false, "If true, only download and cache files for later use - don't install or start anything.")
|
||||
startCmd.Flags().Bool(cacheImages, true, "If true, cache docker images for the current bootstrapper and load them into the machine. Always false with --vm-driver=none.")
|
||||
startCmd.Flags().String(isoURL, constants.DefaultISOURL, "Location of the minikube iso")
|
||||
startCmd.Flags().Bool(keepContext, constants.DefaultKeepContext, "This will keep the existing kubectl context and will create a minikube context.")
|
||||
startCmd.Flags().String(containerRuntime, "docker", "The container runtime to be used (docker, crio, containerd)")
|
||||
startCmd.Flags().Bool(createMount, false, "This will start the mount daemon and automatically mount files into minikube")
|
||||
startCmd.Flags().String(mountString, constants.DefaultMountDir+":"+constants.DefaultMountEndpoint, "The argument to pass the minikube mount command on start")
|
||||
startCmd.Flags().String(criSocket, "", "The cri socket path to be used")
|
||||
startCmd.Flags().String(networkPlugin, "", "The name of the network plugin")
|
||||
startCmd.Flags().Bool(enableDefaultCNI, false, "Enable the default CNI plugin (/etc/cni/net.d/k8s.conf). Used in conjunction with \"--network-plugin=cni\"")
|
||||
startCmd.Flags().Bool(waitUntilHealthy, true, "Wait until Kubernetes core services are healthy before exiting")
|
||||
}
|
||||
|
||||
// initKubernetesFlags inits the commandline flags for kubernetes related options
|
||||
func initKubernetesFlags() {
|
||||
startCmd.Flags().String(kubernetesVersion, constants.DefaultKubernetesVersion, "The kubernetes version that the minikube VM will use (ex: v1.2.3)")
|
||||
startCmd.Flags().Var(&extraOptions, "extra-config",
|
||||
`A set of key=value pairs that describe configuration that may be passed to different components.
|
||||
The key should be '.' separated, and the first part before the dot is the component to apply the configuration to.
|
||||
Valid components are: kubelet, kubeadm, apiserver, controller-manager, etcd, proxy, scheduler
|
||||
Valid kubeadm parameters: `+fmt.Sprintf("%s, %s", strings.Join(kubeadm.KubeadmExtraArgsWhitelist[kubeadm.KubeadmCmdParam], ", "), strings.Join(kubeadm.KubeadmExtraArgsWhitelist[kubeadm.KubeadmConfigParam], ",")))
|
||||
startCmd.Flags().String(uuid, "", "Provide VM UUID to restore MAC address (only supported with Hyperkit driver).")
|
||||
startCmd.Flags().String(vpnkitSock, "", "Location of the VPNKit socket used for networking. If empty, disables Hyperkit VPNKitSock, if 'auto' uses Docker for Mac VPNKit connection, otherwise uses the specified VSock.")
|
||||
startCmd.Flags().StringSlice(vsockPorts, []string{}, "List of guest VSock ports that should be exposed as sockets on the host (Only supported on with hyperkit now).")
|
||||
startCmd.Flags().Bool(noVTXCheck, false, "Disable checking for the availability of hardware virtualization before the vm is started (virtualbox)")
|
||||
startCmd.Flags().String(featureGates, "", "A set of key=value pairs that describe feature gates for alpha/experimental features.")
|
||||
startCmd.Flags().String(dnsDomain, constants.ClusterDNSDomain, "The cluster dns domain name used in the kubernetes cluster")
|
||||
startCmd.Flags().Int(apiServerPort, pkgutil.APIServerPort, "The apiserver listening port")
|
||||
startCmd.Flags().String(apiServerName, constants.APIServerName, "The apiserver name which is used in the generated certificate for kubernetes. This can be used if you want to make the apiserver available from outside the machine")
|
||||
startCmd.Flags().StringArrayVar(&apiServerNames, "apiserver-names", nil, "A set of apiserver names which are used in the generated certificate for kubernetes. This can be used if you want to make the apiserver available from outside the machine")
|
||||
startCmd.Flags().IPSliceVar(&apiServerIPs, "apiserver-ips", nil, "A set of apiserver IP Addresses which are used in the generated certificate for kubernetes. This can be used if you want to make the apiserver available from outside the machine")
|
||||
}
|
||||
|
||||
// initDriverFlags inits the commandline flags for vm drivers
|
||||
func initDriverFlags() {
|
||||
startCmd.Flags().String(vmDriver, constants.DefaultVMDriver, fmt.Sprintf("VM driver is one of: %v", constants.SupportedVMDrivers))
|
||||
|
||||
// kvm2
|
||||
startCmd.Flags().String(kvmNetwork, "default", "The KVM network name. (only supported with KVM driver)")
|
||||
startCmd.Flags().String(kvmQemuURI, "qemu:///system", "The KVM QEMU connection URI. (works only with kvm2 driver on linux)")
|
||||
startCmd.Flags().Bool(kvmGPU, false, "Enable experimental NVIDIA GPU support in minikube")
|
||||
startCmd.Flags().Bool(kvmHidden, false, "Hide the hypervisor signature from the guest in minikube")
|
||||
|
||||
// virtualbox
|
||||
startCmd.Flags().String(hostOnlyCIDR, "192.168.99.1/24", "The CIDR to be used for the minikube VM (only supported with Virtualbox driver)")
|
||||
startCmd.Flags().Bool(dnsProxy, false, "Enable proxy for NAT DNS requests (virtualbox)")
|
||||
startCmd.Flags().Bool(hostDNSResolver, true, "Enable host resolver for NAT DNS requests (virtualbox)")
|
||||
if err := viper.BindPFlags(startCmd.Flags()); err != nil {
|
||||
exit.WithError("unable to bind flags", err)
|
||||
}
|
||||
RootCmd.AddCommand(startCmd)
|
||||
startCmd.Flags().Bool(noVTXCheck, false, "Disable checking for the availability of hardware virtualization before the vm is started (virtualbox)")
|
||||
|
||||
// hyperkit
|
||||
startCmd.Flags().StringSlice(vsockPorts, []string{}, "List of guest VSock ports that should be exposed as sockets on the host (Only supported on with hyperkit now).")
|
||||
startCmd.Flags().String(uuid, "", "Provide VM UUID to restore MAC address (only supported with Hyperkit driver).")
|
||||
startCmd.Flags().String(vpnkitSock, "", "Location of the VPNKit socket used for networking. If empty, disables Hyperkit VPNKitSock, if 'auto' uses Docker for Mac VPNKit connection, otherwise uses the specified VSock.")
|
||||
startCmd.Flags().StringSlice(nfsShare, []string{}, "Local folders to share with Guest via NFS mounts (Only supported on with hyperkit now)")
|
||||
startCmd.Flags().String(nfsSharesRoot, "/nfsshares", "Where to root the NFS Shares (defaults to /nfsshares, only supported with hyperkit now)")
|
||||
|
||||
// hyperv
|
||||
startCmd.Flags().String(hypervVirtualSwitch, "", "The hyperv virtual switch name. Defaults to first found. (only supported with HyperV driver)")
|
||||
}
|
||||
|
||||
// initNetworkingFlags inits the commandline flags for connectivity related flags for start
|
||||
func initNetworkingFlags() {
|
||||
startCmd.Flags().StringSliceVar(&insecureRegistry, "insecure-registry", nil, "Insecure Docker registries to pass to the Docker daemon. The default service CIDR range will automatically be added.")
|
||||
startCmd.Flags().StringSliceVar(®istryMirror, "registry-mirror", nil, "Registry mirrors to pass to the Docker daemon")
|
||||
startCmd.Flags().String(imageRepository, "", "Alternative image repository to pull docker images from. This can be used when you have limited access to gcr.io. Set it to \"auto\" to let minikube decide one for you. For Chinese mainland users, you may use local gcr.io mirrors such as registry.cn-hangzhou.aliyuncs.com/google_containers")
|
||||
startCmd.Flags().String(imageMirrorCountry, "", "Country code of the image mirror to be used. Leave empty to use the global one. For Chinese mainland users, set it to cn")
|
||||
startCmd.Flags().String(serviceCIDR, pkgutil.DefaultServiceCIDR, "The CIDR to be used for service cluster IPs.")
|
||||
startCmd.Flags().StringArrayVar(&dockerEnv, "docker-env", nil, "Environment variables to pass to the Docker daemon. (format: key=value)")
|
||||
startCmd.Flags().StringArrayVar(&dockerOpt, "docker-opt", nil, "Specify arbitrary flags to pass to the Docker daemon. (format: key=value)")
|
||||
}
|
||||
|
||||
// startCmd represents the start command
|
||||
var startCmd = &cobra.Command{
|
||||
Use: "start",
|
||||
Short: "Starts a local kubernetes cluster",
|
||||
Long: `Starts a local kubernetes cluster using VM. This command
|
||||
assumes you have already installed one of the VM drivers: virtualbox/parallels/vmwarefusion/kvm/xhyve/hyperv.`,
|
||||
Run: runStart,
|
||||
Long: "Starts a local kubernetes cluster",
|
||||
Run: runStart,
|
||||
}
|
||||
|
||||
// platform generates a user-readable platform message
|
||||
func platform() string {
|
||||
var s strings.Builder
|
||||
|
||||
// Show the distro version if possible
|
||||
hi, err := gopshost.Info()
|
||||
if err == nil {
|
||||
s.WriteString(fmt.Sprintf("%s %s", strings.Title(hi.Platform), hi.PlatformVersion))
|
||||
glog.Infof("hostinfo: %+v", hi)
|
||||
} else {
|
||||
glog.Warningf("gopshost.Info returned error: %v", err)
|
||||
s.WriteString(runtime.GOOS)
|
||||
}
|
||||
|
||||
vsys, vrole, err := gopshost.Virtualization()
|
||||
if err != nil {
|
||||
glog.Warningf("gopshost.Virtualization returned error: %v", err)
|
||||
} else {
|
||||
glog.Infof("virtualization: %s %s", vsys, vrole)
|
||||
}
|
||||
|
||||
// This environment is exotic, let's output a bit more.
|
||||
if vrole == "guest" || runtime.GOARCH != "amd64" {
|
||||
s.WriteString(fmt.Sprintf(" (%s/%s)", vsys, runtime.GOARCH))
|
||||
}
|
||||
return s.String()
|
||||
}
|
||||
|
||||
// runStart handles the executes the flow of "minikube start"
|
||||
func runStart(cmd *cobra.Command, args []string) {
|
||||
console.OutT(console.Happy, "minikube {{.version}} on {{.os}} ({{.arch}})", console.Arg{"version": version.GetVersion(), "os": runtime.GOOS, "arch": runtime.GOARCH})
|
||||
validateConfig()
|
||||
|
||||
validateUser()
|
||||
|
||||
oldConfig, err := cfg.Load()
|
||||
if err != nil && !os.IsNotExist(err) {
|
||||
exit.WithCode(exit.Data, "Unable to load config: %v", err)
|
||||
prefix := ""
|
||||
if viper.GetString(cfg.MachineProfile) != constants.DefaultMachineName {
|
||||
prefix = fmt.Sprintf("[%s] ", viper.GetString(cfg.MachineProfile))
|
||||
}
|
||||
k8sVersion, isUpgrade := validateKubernetesVersions(oldConfig)
|
||||
out.T(out.Happy, "{{.prefix}}minikube {{.version}} on {{.platform}}", out.V{"prefix": prefix, "version": version.GetVersion(), "platform": platform()})
|
||||
|
||||
// if --registry-mirror specified when run minikube start,
|
||||
// take arg precedence over MINIKUBE_REGISTRY_MIRROR
|
||||
// actually this is a hack, because viper 1.0.0 can assign env to variable if StringSliceVar
|
||||
// and i can't update it to 1.4.0, it affects too much code
|
||||
// other types (like String, Bool) of flag works, so imageRepository, imageMirrorCountry
|
||||
// can be configured as MINIKUBE_IMAGE_REPOSITORY and IMAGE_MIRROR_COUNTRY
|
||||
// this should be updated to documentation
|
||||
if len(registryMirror) == 0 {
|
||||
registryMirror = viper.GetStringSlice("registry_mirror")
|
||||
}
|
||||
|
||||
vmDriver := viper.GetString(vmDriver)
|
||||
if err := cmdcfg.IsValidDriver(runtime.GOOS, vmDriver); err != nil {
|
||||
exit.WithCodeT(
|
||||
exit.Failure,
|
||||
"The driver '{{.driver}}' is not supported on {{.os}}",
|
||||
out.V{"driver": vmDriver, "os": runtime.GOOS},
|
||||
)
|
||||
}
|
||||
|
||||
validateConfig()
|
||||
validateUser()
|
||||
validateDriverVersion(viper.GetString(vmDriver))
|
||||
|
||||
k8sVersion, isUpgrade := getKubernetesVersion()
|
||||
config, err := generateConfig(cmd, k8sVersion)
|
||||
if err != nil {
|
||||
exit.WithError("Failed to generate config", err)
|
||||
|
@ -200,7 +282,7 @@ func runStart(cmd *cobra.Command, args []string) {
|
|||
downloadISO(config)
|
||||
|
||||
// With "none", images are persistently stored in Docker, so internal caching isn't necessary.
|
||||
skipCache(config)
|
||||
skipCache(&config)
|
||||
|
||||
// Now that the ISO is downloaded, pull images in the background while the VM boots.
|
||||
var cacheGroup errgroup.Group
|
||||
|
@ -208,76 +290,89 @@ func runStart(cmd *cobra.Command, args []string) {
|
|||
|
||||
// Abstraction leakage alert: startHost requires the config to be saved, to satistfy pkg/provision/buildroot.
|
||||
// Hence, saveConfig must be called before startHost, and again afterwards when we know the IP.
|
||||
if err := saveConfig(config); err != nil {
|
||||
if err := saveConfig(&config); err != nil {
|
||||
exit.WithError("Failed to save config", err)
|
||||
}
|
||||
|
||||
validateDriverVersion(viper.GetString(vmDriver))
|
||||
// exits here in case of --download-only option.
|
||||
handleDownloadOnly(&cacheGroup, k8sVersion)
|
||||
mRunner, preExists, machineAPI, host := startMachine(&config)
|
||||
defer machineAPI.Close()
|
||||
// configure the runtime (docker, containerd, crio)
|
||||
cr := configureRuntimes(mRunner)
|
||||
showVersionInfo(k8sVersion, cr)
|
||||
waitCacheImages(&cacheGroup)
|
||||
|
||||
// setup kube adm and certs and return bootstrapperx
|
||||
bs := setupKubeAdm(machineAPI, config.KubernetesConfig)
|
||||
// The kube config must be update must come before bootstrapping, otherwise health checks may use a stale IP
|
||||
kubeconfig := updateKubeConfig(host, &config)
|
||||
// pull images or restart cluster
|
||||
bootstrapCluster(bs, cr, mRunner, config.KubernetesConfig, preExists, isUpgrade)
|
||||
configureMounts()
|
||||
if err = loadCachedImagesInConfigFile(); err != nil {
|
||||
out.T(out.FailureType, "Unable to load cached images from config file.")
|
||||
}
|
||||
// special ops for none driver, like change minikube directory.
|
||||
prepareNone(viper.GetString(vmDriver))
|
||||
if viper.GetBool(waitUntilHealthy) {
|
||||
if err := bs.WaitCluster(config.KubernetesConfig); err != nil {
|
||||
exit.WithError("Wait failed", err)
|
||||
}
|
||||
}
|
||||
showKubectlConnectInfo(kubeconfig)
|
||||
|
||||
}
|
||||
|
||||
func handleDownloadOnly(cacheGroup *errgroup.Group, k8sVersion string) {
|
||||
// If --download-only, complete the remaining downloads and exit.
|
||||
if !viper.GetBool(downloadOnly) {
|
||||
return
|
||||
}
|
||||
if err := doCacheBinaries(k8sVersion); err != nil {
|
||||
exit.WithError("Failed to cache binaries", err)
|
||||
}
|
||||
waitCacheImages(cacheGroup)
|
||||
if err := CacheImagesInConfigFile(); err != nil {
|
||||
exit.WithError("Failed to cache images", err)
|
||||
}
|
||||
out.T(out.Check, "Download complete!")
|
||||
os.Exit(0)
|
||||
|
||||
}
|
||||
|
||||
func startMachine(config *cfg.Config) (runner command.Runner, preExists bool, machineAPI libmachine.API, host *host.Host) {
|
||||
m, err := machine.NewAPIClient()
|
||||
if err != nil {
|
||||
exit.WithError("Failed to get machine client", err)
|
||||
}
|
||||
defer m.Close()
|
||||
|
||||
// If --download-only, complete the remaining downloads and exit.
|
||||
if viper.GetBool(downloadOnly) {
|
||||
if err := doCacheBinaries(k8sVersion); err != nil {
|
||||
exit.WithError("Failed to cache binaries", err)
|
||||
}
|
||||
waitCacheImages(&cacheGroup)
|
||||
if err := CacheImagesInConfigFile(); err != nil {
|
||||
exit.WithError("Failed to cache images", err)
|
||||
}
|
||||
console.OutStyle(console.Check, "Download complete!")
|
||||
return
|
||||
}
|
||||
|
||||
host, preexisting := startHost(m, config.MachineConfig)
|
||||
host, preExists = startHost(m, config.MachineConfig)
|
||||
|
||||
ip := validateNetwork(host)
|
||||
// Bypass proxy for minikube's vm ip
|
||||
// Bypass proxy for minikube's vm host ip
|
||||
err = proxy.ExcludeIP(ip)
|
||||
if err != nil {
|
||||
console.ErrT(console.FailureType, "Failed to set NO_PROXY Env. Please use `export NO_PROXY=$NO_PROXY,{{.ip}}`.", console.Arg{"ip": ip})
|
||||
out.ErrT(out.FailureType, "Failed to set NO_PROXY Env. Please use `export NO_PROXY=$NO_PROXY,{{.ip}}`.", out.V{"ip": ip})
|
||||
}
|
||||
|
||||
// Save IP to configuration file for subsequent use
|
||||
config.KubernetesConfig.NodeIP = ip
|
||||
if err := saveConfig(config); err != nil {
|
||||
exit.WithError("Failed to save config", err)
|
||||
}
|
||||
runner, err := machine.CommandRunner(host)
|
||||
runner, err = machine.CommandRunner(host)
|
||||
if err != nil {
|
||||
exit.WithError("Failed to get command runner", err)
|
||||
}
|
||||
|
||||
cr := configureRuntimes(runner)
|
||||
showVersionInfo(k8sVersion, cr)
|
||||
return runner, preExists, m, host
|
||||
}
|
||||
|
||||
// prepareHostEnvironment uses the downloaded images, so we need to wait for background task completion.
|
||||
waitCacheImages(&cacheGroup)
|
||||
|
||||
bs := prepareHostEnvironment(m, config.KubernetesConfig)
|
||||
|
||||
// The kube config must be update must come before bootstrapping, otherwise health checks may use a stale IP
|
||||
kubeconfig := updateKubeConfig(host, &config)
|
||||
bootstrapCluster(bs, cr, runner, config.KubernetesConfig, preexisting, isUpgrade)
|
||||
configureMounts()
|
||||
if err = LoadCachedImagesInConfigFile(); err != nil {
|
||||
console.Failure("Unable to load cached images from config file.")
|
||||
func getKubernetesVersion() (k8sVersion string, isUpgrade bool) {
|
||||
oldConfig, err := cfg.Load()
|
||||
if err != nil && !os.IsNotExist(err) {
|
||||
exit.WithCodeT(exit.Data, "Unable to load config: {{.error}}", out.V{"error": err})
|
||||
}
|
||||
|
||||
if config.MachineConfig.VMDriver == constants.DriverNone {
|
||||
console.OutStyle(console.StartingNone, "Configuring local host environment ...")
|
||||
prepareNone()
|
||||
}
|
||||
|
||||
if err := bs.WaitCluster(config.KubernetesConfig); err != nil {
|
||||
exit.WithError("Wait failed", err)
|
||||
}
|
||||
showKubectlConnectInfo(kubeconfig)
|
||||
|
||||
return validateKubernetesVersions(oldConfig)
|
||||
}
|
||||
|
||||
func downloadISO(config cfg.Config) {
|
||||
|
@ -288,7 +383,7 @@ func downloadISO(config cfg.Config) {
|
|||
}
|
||||
}
|
||||
|
||||
func skipCache(config cfg.Config) {
|
||||
func skipCache(config *cfg.Config) {
|
||||
if viper.GetString(vmDriver) == constants.DriverNone {
|
||||
viper.Set(cacheImages, false)
|
||||
config.KubernetesConfig.ShouldLoadCachedImages = false
|
||||
|
@ -297,24 +392,24 @@ func skipCache(config cfg.Config) {
|
|||
|
||||
func showVersionInfo(k8sVersion string, cr cruntime.Manager) {
|
||||
version, _ := cr.Version()
|
||||
console.OutT(cr.Style(), "Configuring environment for Kubernetes {{.k8sVersion}} on {{.runtime}} {{.runtimeVersion}}", console.Arg{"k8sVersion": k8sVersion, "runtime": cr.Name(), "runtimeVersion": version})
|
||||
out.T(cr.Style(), "Preparing Kubernetes {{.k8sVersion}} on {{.runtime}} {{.runtimeVersion}} ...", out.V{"k8sVersion": k8sVersion, "runtime": cr.Name(), "runtimeVersion": version})
|
||||
for _, v := range dockerOpt {
|
||||
console.OutStyle(console.Option, "opt %s", v)
|
||||
out.T(out.Option, "opt {{.docker_option}}", out.V{"docker_option": v})
|
||||
}
|
||||
for _, v := range dockerEnv {
|
||||
console.OutStyle(console.Option, "env %s", v)
|
||||
out.T(out.Option, "env {{.docker_env}}", out.V{"docker_env": v})
|
||||
}
|
||||
}
|
||||
|
||||
func showKubectlConnectInfo(kubeconfig *pkgutil.KubeConfigSetup) {
|
||||
if kubeconfig.KeepContext {
|
||||
console.OutT(console.Kubectl, "To connect to this cluster, use: kubectl --context={{.name}}", console.Arg{"name": kubeconfig.ClusterName})
|
||||
out.T(out.Kubectl, "To connect to this cluster, use: kubectl --context={{.name}}", out.V{"name": kubeconfig.ClusterName})
|
||||
} else {
|
||||
console.OutT(console.Ready, "Done! kubectl is now configured to use {{.name}}", console.Arg{"name": cfg.GetMachineName()})
|
||||
out.T(out.Ready, `Done! kubectl is now configured to use "{{.name}}"`, out.V{"name": cfg.GetMachineName()})
|
||||
}
|
||||
_, err := exec.LookPath("kubectl")
|
||||
if err != nil {
|
||||
console.OutStyle(console.Tip, "For best results, install kubectl: https://kubernetes.io/docs/tasks/tools/install-kubectl/")
|
||||
out.T(out.Tip, "For best results, install kubectl: https://kubernetes.io/docs/tasks/tools/install-kubectl/")
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -377,10 +472,9 @@ func validateUser() {
|
|||
// Check if minikube needs to run with sudo or not.
|
||||
if err == nil {
|
||||
if d == constants.DriverNone && u.Name != "root" {
|
||||
exit.Usage("Please run with sudo. the vm-driver %q requires sudo.", constants.DriverNone)
|
||||
|
||||
exit.UsageT(`Please run with sudo. the vm-driver "{{.driver_name}}" requires sudo.`, out.V{"driver_name": constants.DriverNone})
|
||||
} else if u.Name == "root" && !(d == constants.DriverHyperv || d == constants.DriverNone) {
|
||||
console.OutT(console.WarningType, "Please don't run minikube as root or with 'sudo' privileges. It isn't necessary with {{.driver}} driver.", console.Arg{"driver": d})
|
||||
out.T(out.WarningType, "Please don't run minikube as root or with 'sudo' privileges. It isn't necessary with {{.driver}} driver.", out.V{"driver": d})
|
||||
}
|
||||
|
||||
} else {
|
||||
|
@ -393,7 +487,7 @@ func validateUser() {
|
|||
func validateConfig() {
|
||||
diskSizeMB := pkgutil.CalculateSizeInMB(viper.GetString(humanReadableDiskSize))
|
||||
if diskSizeMB < pkgutil.CalculateSizeInMB(constants.MinimumDiskSize) {
|
||||
exit.WithCode(exit.Config, "Requested disk size (%dMB) is less than minimum of (%dMB)", diskSizeMB, pkgutil.CalculateSizeInMB(constants.MinimumDiskSize))
|
||||
exit.WithCodeT(exit.Config, "Requested disk size {{.size_in_mb}} is less than minimum of {{.size_in_mb2}}", out.V{"size_in_mb": diskSizeMB, "size_in_mb2": pkgutil.CalculateSizeInMB(constants.MinimumDiskSize)})
|
||||
}
|
||||
|
||||
err := autoSetOptions(viper.GetString(vmDriver))
|
||||
|
@ -403,17 +497,18 @@ func validateConfig() {
|
|||
|
||||
memorySizeMB := pkgutil.CalculateSizeInMB(viper.GetString(memory))
|
||||
if memorySizeMB < pkgutil.CalculateSizeInMB(constants.MinimumMemorySize) {
|
||||
exit.Usage("Requested memory allocation (%dMB) is less than the minimum allowed of %dMB", memorySizeMB, pkgutil.CalculateSizeInMB(constants.MinimumMemorySize))
|
||||
exit.UsageT("Requested memory allocation {{.size_in_mb}} is less than the minimum allowed of {{.size_in_mb2}}", out.V{"size_in_mb": memorySizeMB, "size_in_mb2": pkgutil.CalculateSizeInMB(constants.MinimumMemorySize)})
|
||||
}
|
||||
if memorySizeMB < pkgutil.CalculateSizeInMB(constants.DefaultMemorySize) {
|
||||
console.OutT(console.Notice, "Requested memory allocation ({{.memory}}MB) is less than the default memory allocation of {{.default}}MB. Beware that minikube might not work correctly or crash unexpectedly.", console.Arg{"memory": memorySizeMB, "default": pkgutil.CalculateSizeInMB(constants.DefaultMemorySize)})
|
||||
out.T(out.Notice, "Requested memory allocation ({{.memory}}MB) is less than the default memory allocation of {{.default_memorysize}}MB. Beware that minikube might not work correctly or crash unexpectedly.",
|
||||
out.V{"memory": memorySizeMB, "default_memorysize": pkgutil.CalculateSizeInMB(constants.DefaultMemorySize)})
|
||||
}
|
||||
|
||||
// check that kubeadm extra args contain only whitelisted parameters
|
||||
for param := range extraOptions.AsMap().Get(kubeadm.Kubeadm) {
|
||||
if !pkgutil.ContainsString(kubeadm.KubeadmExtraArgsWhitelist[kubeadm.KubeadmCmdParam], param) &&
|
||||
!pkgutil.ContainsString(kubeadm.KubeadmExtraArgsWhitelist[kubeadm.KubeadmConfigParam], param) {
|
||||
exit.Usage("Sorry, the kubeadm.%s parameter is currently not supported by --extra-config", param)
|
||||
exit.UsageT("Sorry, the kubeadm.{{.parameter_name}} parameter is currently not supported by --extra-config", out.V{"parameter_name": param})
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -431,7 +526,7 @@ func validateRegistryMirror() {
|
|||
glog.Errorln("Error Parsing URL: ", err)
|
||||
}
|
||||
if (URL.Scheme != "http" && URL.Scheme != "https") || URL.Path != "" {
|
||||
exit.Usage("Sorry, url provided with --registry-mirror flag is invalid %q", loc)
|
||||
exit.UsageT("Sorry, url provided with --registry-mirror flag is invalid {{.url}}", out.V{"url": loc})
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -505,9 +600,9 @@ func generateConfig(cmd *cobra.Command, k8sVersion string) (cfg.Config, error) {
|
|||
|
||||
if !found {
|
||||
if autoSelectedRepository == "" {
|
||||
exit.WithCode(exit.Failure, "None of known repositories is accessible. Consider specifying an alternative image repository with --image-repository flag")
|
||||
exit.WithCodeT(exit.Failure, "None of known repositories is accessible. Consider specifying an alternative image repository with --image-repository flag")
|
||||
} else {
|
||||
console.Warning("None of known repositories in your location is accessible. Use %s as fallback.", autoSelectedRepository)
|
||||
out.WarningT("None of known repositories in your location is accessible. Use {{.image_repository_name}} as fallback.", out.V{"image_repository_name": autoSelectedRepository})
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -515,7 +610,7 @@ func generateConfig(cmd *cobra.Command, k8sVersion string) (cfg.Config, error) {
|
|||
}
|
||||
|
||||
if repository != "" {
|
||||
console.OutT(console.SuccessType, "Using image repository {{.name}}", console.Arg{"name": repository})
|
||||
out.T(out.SuccessType, "Using image repository {{.name}}", out.V{"name": repository})
|
||||
}
|
||||
|
||||
cfg := cfg.Config{
|
||||
|
@ -529,7 +624,6 @@ func generateConfig(cmd *cobra.Command, k8sVersion string) (cfg.Config, error) {
|
|||
ContainerRuntime: viper.GetString(containerRuntime),
|
||||
HyperkitVpnKitSock: viper.GetString(vpnkitSock),
|
||||
HyperkitVSockPorts: viper.GetStringSlice(vsockPorts),
|
||||
XhyveDiskDriver: viper.GetString(xhyveDiskDriver),
|
||||
NFSShare: viper.GetStringSlice(nfsShare),
|
||||
NFSSharesRoot: viper.GetString(nfsSharesRoot),
|
||||
DockerEnv: dockerEnv,
|
||||
|
@ -583,31 +677,35 @@ func autoSetOptions(vmDriver string) error {
|
|||
}
|
||||
|
||||
// prepareNone prepares the user and host for the joy of the "none" driver
|
||||
func prepareNone() {
|
||||
func prepareNone(vmDriver string) {
|
||||
if vmDriver != constants.DriverNone {
|
||||
return
|
||||
}
|
||||
out.T(out.StartingNone, "Configuring local host environment ...")
|
||||
if viper.GetBool(cfg.WantNoneDriverWarning) {
|
||||
console.OutLn("")
|
||||
console.Warning("The 'none' driver provides limited isolation and may reduce system security and reliability.")
|
||||
console.Warning("For more information, see:")
|
||||
console.OutStyle(console.URL, "https://github.com/kubernetes/minikube/blob/master/docs/vmdriver-none.md")
|
||||
console.OutLn("")
|
||||
out.T(out.Empty, "")
|
||||
out.WarningT("The 'none' driver provides limited isolation and may reduce system security and reliability.")
|
||||
out.WarningT("For more information, see:")
|
||||
out.T(out.URL, "https://github.com/kubernetes/minikube/blob/master/docs/vmdriver-none.md")
|
||||
out.T(out.Empty, "")
|
||||
}
|
||||
|
||||
if os.Getenv("CHANGE_MINIKUBE_NONE_USER") == "" {
|
||||
home := os.Getenv("HOME")
|
||||
console.Warning("kubectl and minikube configuration will be stored in %s", home)
|
||||
console.Warning("To use kubectl or minikube commands as your own user, you may")
|
||||
console.Warning("need to relocate them. For example, to overwrite your own settings:")
|
||||
out.WarningT("kubectl and minikube configuration will be stored in {{.home_folder}}", out.V{"home_folder": home})
|
||||
out.WarningT("To use kubectl or minikube commands as your own user, you may")
|
||||
out.WarningT("need to relocate them. For example, to overwrite your own settings:")
|
||||
|
||||
console.OutLn("")
|
||||
console.OutStyle(console.Command, "sudo mv %s/.kube %s/.minikube $HOME", home, home)
|
||||
console.OutStyle(console.Command, "sudo chown -R $USER $HOME/.kube $HOME/.minikube")
|
||||
console.OutLn("")
|
||||
out.T(out.Empty, "")
|
||||
out.T(out.Command, "sudo mv {{.home_folder}}/.kube {{.home_folder}}/.minikube $HOME", out.V{"home_folder": home})
|
||||
out.T(out.Command, "sudo chown -R $USER $HOME/.kube $HOME/.minikube")
|
||||
out.T(out.Empty, "")
|
||||
|
||||
console.OutStyle(console.Tip, "This can also be done automatically by setting the env var CHANGE_MINIKUBE_NONE_USER=true")
|
||||
out.T(out.Tip, "This can also be done automatically by setting the env var CHANGE_MINIKUBE_NONE_USER=true")
|
||||
}
|
||||
|
||||
if err := pkgutil.MaybeChownDirRecursiveToMinikubeUser(constants.GetMinipath()); err != nil {
|
||||
exit.WithCode(exit.Permissions, "Failed to chown %s: %v", constants.GetMinipath(), err)
|
||||
exit.WithCodeT(exit.Permissions, "Failed to chown {{.minikube_dir_path}}: {{.error}}", out.V{"minikube_dir_path": constants.GetMinipath(), "error": err})
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -644,14 +742,14 @@ func validateNetwork(h *host.Host) string {
|
|||
for _, k := range proxy.EnvVars {
|
||||
if v := os.Getenv(k); v != "" {
|
||||
if !optSeen {
|
||||
console.OutStyle(console.Internet, "Found network options:")
|
||||
out.T(out.Internet, "Found network options:")
|
||||
optSeen = true
|
||||
}
|
||||
console.OutStyle(console.Option, "%s=%s", k, v)
|
||||
out.T(out.Option, "{{.key}}={{.value}}", out.V{"key": k, "value": v})
|
||||
ipExcluded := proxy.IsIPExcluded(ip) // Skip warning if minikube ip is already in NO_PROXY
|
||||
k = strings.ToUpper(k) // for http_proxy & https_proxy
|
||||
if (k == "HTTP_PROXY" || k == "HTTPS_PROXY") && !ipExcluded && !warnedOnce {
|
||||
console.Warning("You appear to be using a proxy, but your NO_PROXY environment does not include the minikube IP (%s). Please see https://github.com/kubernetes/minikube/blob/master/docs/http_proxy.md for more details", ip)
|
||||
out.WarningT("You appear to be using a proxy, but your NO_PROXY environment does not include the minikube IP ({{.ip_address}}). Please see https://github.com/kubernetes/minikube/blob/master/docs/http_proxy.md for more details", out.V{"ip_address": ip})
|
||||
warnedOnce = true
|
||||
}
|
||||
}
|
||||
|
@ -671,7 +769,7 @@ func validateKubernetesVersions(old *cfg.Config) (string, bool) {
|
|||
|
||||
nvs, err := semver.Make(strings.TrimPrefix(rawVersion, version.VersionPrefix))
|
||||
if err != nil {
|
||||
exit.WithCode(exit.Data, "Unable to parse %q: %v", rawVersion, err)
|
||||
exit.WithCodeT(exit.Data, `Unable to parse "{{.kubenretes_version}}": {{.error}}`, out.V{"kubenretes_version": rawVersion, "error": err})
|
||||
}
|
||||
nv := version.VersionPrefix + nvs.String()
|
||||
|
||||
|
@ -686,24 +784,24 @@ func validateKubernetesVersions(old *cfg.Config) (string, bool) {
|
|||
|
||||
if nvs.LT(ovs) {
|
||||
nv = version.VersionPrefix + ovs.String()
|
||||
console.ErrT(console.Conflict, "Kubernetes downgrade is not supported, will continue to use {{.version}}", console.Arg{"version": nv})
|
||||
out.ErrT(out.Conflict, "Kubernetes downgrade is not supported, will continue to use {{.version}}", out.V{"version": nv})
|
||||
return nv, isUpgrade
|
||||
}
|
||||
if nvs.GT(ovs) {
|
||||
console.OutT(console.ThumbsUp, "minikube will upgrade the local cluster from Kubernetes {{.old}} to {{.new}}", console.Arg{"old": ovs, "new": nvs})
|
||||
out.T(out.ThumbsUp, "Upgrading from Kubernetes {{.old}} to {{.new}}", out.V{"old": ovs, "new": nvs})
|
||||
isUpgrade = true
|
||||
}
|
||||
return nv, isUpgrade
|
||||
}
|
||||
|
||||
// prepareHostEnvironment adds any requested files into the VM before Kubernetes is started
|
||||
func prepareHostEnvironment(api libmachine.API, kc cfg.KubernetesConfig) bootstrapper.Bootstrapper {
|
||||
bs, err := GetClusterBootstrapper(api, viper.GetString(cmdcfg.Bootstrapper))
|
||||
// setupKubeAdm adds any requested files into the VM before Kubernetes is started
|
||||
func setupKubeAdm(mAPI libmachine.API, kc cfg.KubernetesConfig) bootstrapper.Bootstrapper {
|
||||
bs, err := getClusterBootstrapper(mAPI, viper.GetString(cmdcfg.Bootstrapper))
|
||||
if err != nil {
|
||||
exit.WithError("Failed to get bootstrapper", err)
|
||||
}
|
||||
for _, eo := range extraOptions {
|
||||
console.OutStyle(console.Option, "%s.%s=%s", eo.Component, eo.Key, eo.Value)
|
||||
out.T(out.Option, "{{.extra_option_component_name}}.{{.key}}={{.value}}", out.V{"extra_option_component_name": eo.Component, "key": eo.Key, "value": eo.Value})
|
||||
}
|
||||
// Loads cached images, generates config files, download binaries
|
||||
if err := bs.UpdateCluster(kc); err != nil {
|
||||
|
@ -748,7 +846,7 @@ func configureRuntimes(runner cruntime.CommandRunner) cruntime.Manager {
|
|||
config := cruntime.Config{Type: viper.GetString(containerRuntime), Runner: runner}
|
||||
cr, err := cruntime.New(config)
|
||||
if err != nil {
|
||||
exit.WithError(fmt.Sprintf("Failed runtime for %+v", config), err)
|
||||
exit.WithError("Failed runtime", err)
|
||||
}
|
||||
|
||||
disableOthers := true
|
||||
|
@ -769,21 +867,21 @@ func bootstrapCluster(bs bootstrapper.Bootstrapper, r cruntime.Manager, runner c
|
|||
bsName := viper.GetString(cmdcfg.Bootstrapper)
|
||||
|
||||
if isUpgrade || !preexisting {
|
||||
console.OutStyle(console.Pulling, "Pulling images ...")
|
||||
out.T(out.Pulling, "Pulling images ...")
|
||||
if err := bs.PullImages(kc); err != nil {
|
||||
console.OutT(console.FailureType, "Unable to pull images, which may be OK: {{.error}}", console.Arg{"error": err})
|
||||
out.T(out.FailureType, "Unable to pull images, which may be OK: {{.error}}", out.V{"error": err})
|
||||
}
|
||||
}
|
||||
|
||||
if preexisting {
|
||||
console.OutT(console.Restarting, "Relaunching Kubernetes {{.version}} using {{.bootstrapper}} ... ", console.Arg{"version": kc.KubernetesVersion, "bootstrapper": bsName})
|
||||
out.T(out.Restarting, "Relaunching Kubernetes using {{.bootstrapper}} ... ", out.V{"bootstrapper": bsName})
|
||||
if err := bs.RestartCluster(kc); err != nil {
|
||||
exit.WithLogEntries("Error restarting cluster", err, logs.FindProblems(r, bs, runner))
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
console.OutStyle(console.Launch, "Launching Kubernetes ... ")
|
||||
out.T(out.Launch, "Launching Kubernetes ... ")
|
||||
if err := bs.StartCluster(kc); err != nil {
|
||||
exit.WithLogEntries("Error starting cluster", err, logs.FindProblems(r, bs, runner))
|
||||
}
|
||||
|
@ -795,7 +893,7 @@ func configureMounts() {
|
|||
return
|
||||
}
|
||||
|
||||
console.OutT(console.Mounting, "Creating mount {{.name}} ...", console.Arg{"name": viper.GetString(mountString)})
|
||||
out.T(out.Mounting, "Creating mount {{.name}} ...", out.V{"name": viper.GetString(mountString)})
|
||||
path := os.Args[0]
|
||||
mountDebugVal := 0
|
||||
if glog.V(8) {
|
||||
|
@ -816,7 +914,7 @@ func configureMounts() {
|
|||
}
|
||||
|
||||
// saveConfig saves profile cluster configuration in $MINIKUBE_HOME/profiles/<profilename>/config.json
|
||||
func saveConfig(clusterConfig cfg.Config) error {
|
||||
func saveConfig(clusterConfig *cfg.Config) error {
|
||||
data, err := json.MarshalIndent(clusterConfig, "", " ")
|
||||
if err != nil {
|
||||
return err
|
||||
|
@ -860,39 +958,60 @@ func saveConfig(clusterConfig cfg.Config) error {
|
|||
}
|
||||
|
||||
func validateDriverVersion(vmDriver string) {
|
||||
if vmDriver == constants.DriverKvm2 {
|
||||
cmd := exec.Command("docker-machine-driver-kvm2", "version")
|
||||
output, err := cmd.Output()
|
||||
var (
|
||||
driverExecutable string
|
||||
driverDocumentation string
|
||||
)
|
||||
|
||||
// we don't want to fail if an error was returned,
|
||||
// libmachine has a nice message for the user if the driver isn't present
|
||||
if err != nil {
|
||||
console.Warning("Error checking driver version: %v", err)
|
||||
return
|
||||
}
|
||||
switch vmDriver {
|
||||
case constants.DriverKvm2:
|
||||
driverExecutable = fmt.Sprintf("docker-machine-driver-%s", constants.DriverKvm2)
|
||||
driverDocumentation = fmt.Sprintf("%s#%s", constants.DriverDocumentation, "kvm2-upgrade")
|
||||
case constants.DriverHyperkit:
|
||||
driverExecutable = fmt.Sprintf("docker-machine-driver-%s", constants.DriverHyperkit)
|
||||
driverDocumentation = fmt.Sprintf("%s#%s", constants.DriverDocumentation, "hyperkit-upgrade")
|
||||
default: // driver doesn't support version
|
||||
return
|
||||
}
|
||||
|
||||
v := extractVMDriverVersion(string(output))
|
||||
cmd := exec.Command(driverExecutable, "version")
|
||||
output, err := cmd.Output()
|
||||
|
||||
// if the driver doesn't have return any version, it is really old, we force a upgrade.
|
||||
if len(v) == 0 {
|
||||
exit.WithCode(exit.Failure, "Please upgrade the 'docker-machine-driver-kvm2'. %s", constants.KVMDocumentation)
|
||||
}
|
||||
// we don't want to fail if an error was returned,
|
||||
// libmachine has a nice message for the user if the driver isn't present
|
||||
if err != nil {
|
||||
out.WarningT("Error checking driver version: {{.error}}", out.V{"error": err})
|
||||
return
|
||||
}
|
||||
|
||||
vmDriverVersion, err := semver.Make(v)
|
||||
if err != nil {
|
||||
console.Warning("Error parsing vmDriver version: %v", err)
|
||||
return
|
||||
}
|
||||
v := extractVMDriverVersion(string(output))
|
||||
|
||||
minikubeVersion, err := version.GetSemverVersion()
|
||||
if err != nil {
|
||||
console.Warning("Error parsing minukube version: %v", err)
|
||||
return
|
||||
}
|
||||
// if the driver doesn't have return any version, it is really old, we force a upgrade.
|
||||
if len(v) == 0 {
|
||||
exit.WithCodeT(
|
||||
exit.Failure,
|
||||
"Please upgrade the '{{.driver_executable}}'. {{.documentation_url}}",
|
||||
out.V{"driver_executable": driverExecutable, "documentation_url": driverDocumentation},
|
||||
)
|
||||
}
|
||||
|
||||
if vmDriverVersion.LT(minikubeVersion) {
|
||||
console.Warning("The 'docker-machine-driver-kvm2' version is old. Please consider upgrading. %s", constants.KVMDocumentation)
|
||||
}
|
||||
vmDriverVersion, err := semver.Make(v)
|
||||
if err != nil {
|
||||
out.WarningT("Error parsing vmDriver version: {{.error}}", out.V{"error": err})
|
||||
return
|
||||
}
|
||||
|
||||
minikubeVersion, err := version.GetSemverVersion()
|
||||
if err != nil {
|
||||
out.WarningT("Error parsing minukube version: {{.error}}", out.V{"error": err})
|
||||
return
|
||||
}
|
||||
|
||||
if vmDriverVersion.LT(minikubeVersion) {
|
||||
out.WarningT(
|
||||
"There's a new version for '{{.driver_executable}}'. Please consider upgrading. {{.documentation_url}}",
|
||||
out.V{"driver_executable": driverExecutable, "documentation_url": driverDocumentation},
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -31,6 +31,7 @@ import (
|
|||
"k8s.io/minikube/pkg/minikube/constants"
|
||||
"k8s.io/minikube/pkg/minikube/exit"
|
||||
"k8s.io/minikube/pkg/minikube/machine"
|
||||
"k8s.io/minikube/pkg/minikube/out"
|
||||
pkgutil "k8s.io/minikube/pkg/util"
|
||||
)
|
||||
|
||||
|
@ -61,7 +62,7 @@ var statusCmd = &cobra.Command{
|
|||
var returnCode = 0
|
||||
api, err := machine.NewAPIClient()
|
||||
if err != nil {
|
||||
exit.WithCode(exit.Unavailable, "Error getting client: %v", err)
|
||||
exit.WithCodeT(exit.Unavailable, "Error getting client: {{.error}}", out.V{"error": err})
|
||||
}
|
||||
defer api.Close()
|
||||
|
||||
|
@ -75,7 +76,7 @@ var statusCmd = &cobra.Command{
|
|||
apiserverSt := state.None.String()
|
||||
|
||||
if hostSt == state.Running.String() {
|
||||
clusterBootstrapper, err := GetClusterBootstrapper(api, viper.GetString(cmdcfg.Bootstrapper))
|
||||
clusterBootstrapper, err := getClusterBootstrapper(api, viper.GetString(cmdcfg.Bootstrapper))
|
||||
if err != nil {
|
||||
exit.WithError("Error getting bootstrapper", err)
|
||||
}
|
||||
|
@ -143,5 +144,4 @@ func init() {
|
|||
statusCmd.Flags().StringVar(&statusFormat, "format", constants.DefaultStatusFormat,
|
||||
`Go template format string for the status output. The format for Go templates can be found here: https://golang.org/pkg/text/template/
|
||||
For the list accessible variables for the template, see the struct values here: https://godoc.org/k8s.io/minikube/cmd/minikube/cmd#Status`)
|
||||
RootCmd.AddCommand(statusCmd)
|
||||
}
|
||||
|
|
|
@ -26,10 +26,10 @@ import (
|
|||
cmdUtil "k8s.io/minikube/cmd/util"
|
||||
"k8s.io/minikube/pkg/minikube/cluster"
|
||||
pkg_config "k8s.io/minikube/pkg/minikube/config"
|
||||
"k8s.io/minikube/pkg/minikube/console"
|
||||
"k8s.io/minikube/pkg/minikube/constants"
|
||||
"k8s.io/minikube/pkg/minikube/exit"
|
||||
"k8s.io/minikube/pkg/minikube/machine"
|
||||
"k8s.io/minikube/pkg/minikube/out"
|
||||
pkgutil "k8s.io/minikube/pkg/util"
|
||||
)
|
||||
|
||||
|
@ -52,27 +52,27 @@ func runStop(cmd *cobra.Command, args []string) {
|
|||
defer api.Close()
|
||||
|
||||
nonexistent := false
|
||||
|
||||
stop := func() (err error) {
|
||||
err = cluster.StopHost(api)
|
||||
switch err := errors.Cause(err).(type) {
|
||||
case mcnerror.ErrHostDoesNotExist:
|
||||
console.OutStyle(console.Meh, "%q VM does not exist, nothing to stop", profile)
|
||||
out.T(out.Meh, `"{{.profile_name}}" VM does not exist, nothing to stop`, out.V{"profile_name": profile})
|
||||
nonexistent = true
|
||||
return nil
|
||||
default:
|
||||
return err
|
||||
}
|
||||
}
|
||||
if err := pkgutil.RetryAfter(5, stop, 2*time.Second); err != nil {
|
||||
if err := pkgutil.RetryAfter(3, stop, 2*time.Second); err != nil {
|
||||
exit.WithError("Unable to stop VM", err)
|
||||
}
|
||||
|
||||
if !nonexistent {
|
||||
console.OutStyle(console.Stopped, "%q stopped.", profile)
|
||||
out.T(out.Stopped, `"{{.profile_name}}" stopped.`, out.V{"profile_name": profile})
|
||||
}
|
||||
|
||||
if err := cmdUtil.KillMountProcess(); err != nil {
|
||||
console.OutStyle(console.WarningType, "Unable to kill mount process: %s", err)
|
||||
out.T(out.WarningType, "Unable to kill mount process: {{.error}}", out.V{"error": err})
|
||||
}
|
||||
|
||||
machineName := pkg_config.GetMachineName()
|
||||
|
@ -81,7 +81,3 @@ func runStop(cmd *cobra.Command, args []string) {
|
|||
exit.WithError("update config", err)
|
||||
}
|
||||
}
|
||||
|
||||
func init() {
|
||||
RootCmd.AddCommand(stopCmd)
|
||||
}
|
||||
|
|
|
@ -86,5 +86,4 @@ var tunnelCmd = &cobra.Command{
|
|||
|
||||
func init() {
|
||||
tunnelCmd.Flags().BoolVarP(&cleanup, "cleanup", "c", false, "call with cleanup=true to remove old tunnels")
|
||||
RootCmd.AddCommand(tunnelCmd)
|
||||
}
|
||||
|
|
|
@ -18,10 +18,10 @@ package cmd
|
|||
|
||||
import (
|
||||
"github.com/spf13/cobra"
|
||||
"k8s.io/minikube/pkg/minikube/console"
|
||||
"k8s.io/minikube/pkg/minikube/constants"
|
||||
"k8s.io/minikube/pkg/minikube/exit"
|
||||
"k8s.io/minikube/pkg/minikube/notify"
|
||||
"k8s.io/minikube/pkg/minikube/out"
|
||||
"k8s.io/minikube/pkg/version"
|
||||
)
|
||||
|
||||
|
@ -41,14 +41,10 @@ var updateCheckCmd = &cobra.Command{
|
|||
}
|
||||
|
||||
if len(r) < 1 {
|
||||
exit.WithCode(exit.Data, "Update server returned an empty list")
|
||||
exit.WithCodeT(exit.Data, "Update server returned an empty list")
|
||||
}
|
||||
|
||||
console.OutLn("CurrentVersion: %s", version.GetVersion())
|
||||
console.OutLn("LatestVersion: %s", r[0].Name)
|
||||
out.Ln("CurrentVersion: %s", version.GetVersion())
|
||||
out.Ln("LatestVersion: %s", r[0].Name)
|
||||
},
|
||||
}
|
||||
|
||||
func init() {
|
||||
RootCmd.AddCommand(updateCheckCmd)
|
||||
}
|
||||
|
|
|
@ -20,10 +20,10 @@ import (
|
|||
"github.com/spf13/cobra"
|
||||
"k8s.io/minikube/pkg/minikube/cluster"
|
||||
"k8s.io/minikube/pkg/minikube/config"
|
||||
"k8s.io/minikube/pkg/minikube/console"
|
||||
"k8s.io/minikube/pkg/minikube/constants"
|
||||
"k8s.io/minikube/pkg/minikube/exit"
|
||||
"k8s.io/minikube/pkg/minikube/machine"
|
||||
"k8s.io/minikube/pkg/minikube/out"
|
||||
"k8s.io/minikube/pkg/util"
|
||||
)
|
||||
|
||||
|
@ -49,14 +49,10 @@ var updateContextCmd = &cobra.Command{
|
|||
exit.WithError("update config", err)
|
||||
}
|
||||
if updated {
|
||||
console.OutStyle(console.Celebrate, "%s IP has been updated to point at %s", machineName, ip)
|
||||
out.T(out.Celebrate, "{{.machine}} IP has been updated to point at {{.ip}}", out.V{"machine": machineName, "ip": ip})
|
||||
} else {
|
||||
console.OutStyle(console.Meh, "%s IP was already correctly configured for %s", machineName, ip)
|
||||
out.T(out.Meh, "{{.machine}} IP was already correctly configured for {{.ip}}", out.V{"machine": machineName, "ip": ip})
|
||||
}
|
||||
|
||||
},
|
||||
}
|
||||
|
||||
func init() {
|
||||
RootCmd.AddCommand(updateContextCmd)
|
||||
}
|
||||
|
|
|
@ -18,7 +18,7 @@ package cmd
|
|||
|
||||
import (
|
||||
"github.com/spf13/cobra"
|
||||
"k8s.io/minikube/pkg/minikube/console"
|
||||
"k8s.io/minikube/pkg/minikube/out"
|
||||
"k8s.io/minikube/pkg/version"
|
||||
)
|
||||
|
||||
|
@ -31,14 +31,10 @@ var versionCmd = &cobra.Command{
|
|||
enableUpdateNotification = false
|
||||
},
|
||||
Run: func(command *cobra.Command, args []string) {
|
||||
console.OutLn("minikube version: %v", version.GetVersion())
|
||||
out.Ln("minikube version: %v", version.GetVersion())
|
||||
gitCommitID := version.GetGitCommitID()
|
||||
if gitCommitID != "" {
|
||||
console.OutLn("commit: %v", gitCommitID)
|
||||
out.Ln("commit: %v", gitCommitID)
|
||||
}
|
||||
},
|
||||
}
|
||||
|
||||
func init() {
|
||||
RootCmd.AddCommand(versionCmd)
|
||||
}
|
||||
|
|
|
@ -23,12 +23,16 @@ import (
|
|||
"os"
|
||||
"strconv"
|
||||
|
||||
// initflag must be imported before any other minikube pkg.
|
||||
// Fix for https://github.com/kubernetes/minikube/issues/4866
|
||||
_ "k8s.io/minikube/pkg/initflag"
|
||||
|
||||
"github.com/golang/glog"
|
||||
"github.com/pkg/profile"
|
||||
"k8s.io/minikube/cmd/minikube/cmd"
|
||||
"k8s.io/minikube/pkg/minikube/console"
|
||||
"k8s.io/minikube/pkg/minikube/constants"
|
||||
"k8s.io/minikube/pkg/minikube/machine"
|
||||
"k8s.io/minikube/pkg/minikube/out"
|
||||
"k8s.io/minikube/pkg/minikube/translate"
|
||||
_ "k8s.io/minikube/pkg/provision"
|
||||
)
|
||||
|
@ -45,8 +49,8 @@ func main() {
|
|||
if os.Getenv(constants.IsMinikubeChildProcess) == "" {
|
||||
machine.StartDriver()
|
||||
}
|
||||
console.SetOutFile(os.Stdout)
|
||||
console.SetErrFile(os.Stderr)
|
||||
out.SetOutFile(os.Stdout)
|
||||
out.SetErrFile(os.Stderr)
|
||||
translate.DetermineLocale()
|
||||
cmd.Execute()
|
||||
}
|
||||
|
|
|
@ -12,51 +12,6 @@
|
|||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
|
||||
apiVersion: extensions/v1beta1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: default-http-backend
|
||||
namespace: kube-system
|
||||
labels:
|
||||
app.kubernetes.io/name: default-http-backend
|
||||
app.kubernetes.io/part-of: kube-system
|
||||
addonmanager.kubernetes.io/mode: Reconcile
|
||||
spec:
|
||||
replicas: 1
|
||||
selector:
|
||||
matchLabels:
|
||||
app.kubernetes.io/name: default-http-backend
|
||||
addonmanager.kubernetes.io/mode: Reconcile
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
app.kubernetes.io/name: default-http-backend
|
||||
addonmanager.kubernetes.io/mode: Reconcile
|
||||
spec:
|
||||
terminationGracePeriodSeconds: 60
|
||||
containers:
|
||||
- name: default-http-backend
|
||||
# Any image is permissible as long as:
|
||||
# 1. It serves a 404 page at /
|
||||
# 2. It serves 200 on a /healthz endpoint
|
||||
image: {{default "gcr.io/google_containers" .ImageRepository}}/defaultbackend{{.ExoticArch}}:1.4
|
||||
imagePullPolicy: IfNotPresent
|
||||
livenessProbe:
|
||||
httpGet:
|
||||
path: /healthz
|
||||
port: 8080
|
||||
scheme: HTTP
|
||||
initialDelaySeconds: 30
|
||||
timeoutSeconds: 5
|
||||
ports:
|
||||
- containerPort: 8080
|
||||
resources:
|
||||
limits:
|
||||
cpu: 20m
|
||||
memory: 30Mi
|
||||
requests:
|
||||
cpu: 20m
|
||||
memory: 30Mi
|
||||
---
|
||||
apiVersion: extensions/v1beta1
|
||||
kind: Deployment
|
||||
|
@ -87,7 +42,7 @@ spec:
|
|||
serviceAccountName: nginx-ingress
|
||||
terminationGracePeriodSeconds: 60
|
||||
containers:
|
||||
- image: quay.io/kubernetes-ingress-controller/nginx-ingress-controller{{.ExoticArch}}:0.24.1
|
||||
- image: quay.io/kubernetes-ingress-controller/nginx-ingress-controller{{.ExoticArch}}:0.25.0
|
||||
name: nginx-ingress-controller
|
||||
imagePullPolicy: IfNotPresent
|
||||
readinessProbe:
|
||||
|
@ -121,7 +76,6 @@ spec:
|
|||
hostPort: 18080
|
||||
args:
|
||||
- /nginx-ingress-controller
|
||||
- --default-backend-service=$(POD_NAMESPACE)/default-http-backend
|
||||
- --configmap=$(POD_NAMESPACE)/nginx-load-balancer-conf
|
||||
- --tcp-services-configmap=$(POD_NAMESPACE)/tcp-services
|
||||
- --udp-services-configmap=$(POD_NAMESPACE)/udp-services
|
||||
|
|
|
@ -45,6 +45,7 @@ rules:
|
|||
- watch
|
||||
- apiGroups:
|
||||
- "extensions"
|
||||
- "networking.k8s.io"
|
||||
resources:
|
||||
- ingresses
|
||||
verbs:
|
||||
|
@ -60,6 +61,7 @@ rules:
|
|||
- patch
|
||||
- apiGroups:
|
||||
- "extensions"
|
||||
- "networking.k8s.io"
|
||||
resources:
|
||||
- ingresses/status
|
||||
verbs:
|
||||
|
@ -146,4 +148,4 @@ roleRef:
|
|||
subjects:
|
||||
- kind: ServiceAccount
|
||||
name: nginx-ingress
|
||||
namespace: kube-system
|
||||
namespace: kube-system
|
||||
|
|
|
@ -1,33 +0,0 @@
|
|||
# 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.
|
||||
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: default-http-backend
|
||||
namespace: kube-system
|
||||
labels:
|
||||
app.kubernetes.io/name: default-http-backend
|
||||
app.kubernetes.io/part-of: kube-system
|
||||
kubernetes.io/minikube-addons: ingress
|
||||
kubernetes.io/minikube-addons-endpoint: ingress
|
||||
addonmanager.kubernetes.io/mode: Reconcile
|
||||
spec:
|
||||
type: NodePort
|
||||
ports:
|
||||
- port: 80
|
||||
targetPort: 8080
|
||||
nodePort: 30001
|
||||
selector:
|
||||
app.kubernetes.io/name: default-http-backend
|
|
@ -10,6 +10,7 @@ spec:
|
|||
template:
|
||||
metadata:
|
||||
labels:
|
||||
kubernetes.io/minikube-addons: registry
|
||||
addonmanager.kubernetes.io/mode: Reconcile
|
||||
spec:
|
||||
containers:
|
||||
|
|
|
@ -13,6 +13,7 @@ spec:
|
|||
template:
|
||||
metadata:
|
||||
labels:
|
||||
actual-registry: "true"
|
||||
kubernetes.io/minikube-addons: registry
|
||||
addonmanager.kubernetes.io/mode: Reconcile
|
||||
spec:
|
||||
|
|
|
@ -12,4 +12,5 @@ spec:
|
|||
- port: 80
|
||||
targetPort: 5000
|
||||
selector:
|
||||
actual-registry: "true"
|
||||
kubernetes.io/minikube-addons: registry
|
||||
|
|
|
@ -0,0 +1,9 @@
|
|||
|
||||
#if !defined(CONFIG_H)
|
||||
#define CONFIG_H
|
||||
|
||||
#define BUF_SIZE 8192
|
||||
#define STDIO_BUF_SIZE 8192
|
||||
#define DEFAULT_SOCKET_PATH "/var/run/crio"
|
||||
|
||||
#endif // CONFIG_H
|
|
@ -5,3 +5,4 @@ sha256 92588998dbb79002c38f65f84602b5659f0d0ef1cd36b1a568a2e40269b66816 v1.13.0.
|
|||
sha256 48e7cf64a757d62a3edf214e1b93b74d99f090ca924f956ede2494a260eab2db v1.13.1.tar.gz
|
||||
sha256 7435c4745017f06c260973b049440d924efe65b0df008d14175dfb8f5e23b599 v1.14.0.tar.gz
|
||||
sha256 1f6f72b1f89d4286b2d5b54a48f4d5ed4c0c01065d484635dcb343a706feb743 v1.14.1.tar.gz
|
||||
sha256 f7041a92e2d3a4c341be8df58f1076ba57ecb5daa02b6c65e652530c5f242739 v1.15.0.tar.gz
|
||||
|
|
|
@ -4,9 +4,9 @@
|
|||
#
|
||||
################################################################################
|
||||
|
||||
CRIO_BIN_VERSION = v1.14.1
|
||||
CRIO_BIN_COMMIT = b7644f67e6383cc862b3e37fb74fba334b0b2721
|
||||
CRIO_BIN_SITE = https://github.com/kubernetes-sigs/cri-o/archive
|
||||
CRIO_BIN_VERSION = v1.15.0
|
||||
CRIO_BIN_COMMIT = 485227d727401fa0472a449b5df3b0537e314ebb
|
||||
CRIO_BIN_SITE = https://github.com/cri-o/cri-o/archive
|
||||
CRIO_BIN_SOURCE = $(CRIO_BIN_VERSION).tar.gz
|
||||
CRIO_BIN_DEPENDENCIES = host-go libgpgme
|
||||
CRIO_BIN_GOPATH = $(@D)/_output
|
||||
|
@ -23,8 +23,10 @@ define CRIO_BIN_USERS
|
|||
endef
|
||||
|
||||
define CRIO_BIN_CONFIGURE_CMDS
|
||||
mkdir -p $(CRIO_BIN_GOPATH)/src/github.com/kubernetes-sigs
|
||||
ln -sf $(@D) $(CRIO_BIN_GOPATH)/src/github.com/kubernetes-sigs/cri-o
|
||||
mkdir -p $(CRIO_BIN_GOPATH)/src/github.com/cri-o
|
||||
ln -sf $(@D) $(CRIO_BIN_GOPATH)/src/github.com/cri-o/cri-o
|
||||
# Generate conmon/config.h with a simplified bin/crio-config
|
||||
$(CRIO_BIN_ENV) $(MAKE) $(TARGET_CONFIGURE_OPTS) -C $(@D) BUILDTAGS="containers_image_ostree_stub exclude_graphdriver_btrfs exclude_graphdriver_devicemapper containers_image_openpgp" conmon/config.h
|
||||
endef
|
||||
|
||||
define CRIO_BIN_BUILD_CMDS
|
||||
|
@ -45,9 +47,6 @@ define CRIO_BIN_INSTALL_TARGET_CMDS
|
|||
$(INSTALL) -Dm755 \
|
||||
$(@D)/bin/pause \
|
||||
$(TARGET_DIR)/usr/libexec/crio/pause
|
||||
$(INSTALL) -Dm644 \
|
||||
$(@D)/seccomp.json \
|
||||
$(TARGET_DIR)/etc/crio/seccomp.json
|
||||
$(INSTALL) -Dm644 \
|
||||
$(BR2_EXTERNAL_MINIKUBE_PATH)/package/crio-bin/crio.conf \
|
||||
$(TARGET_DIR)/etc/crio/crio.conf
|
||||
|
|
|
@ -0,0 +1,39 @@
|
|||
diff --git a/Makefile b/Makefile
|
||||
index de79f63..a9ea13b 100644
|
||||
--- a/Makefile
|
||||
+++ b/Makefile
|
||||
@@ -136,7 +136,7 @@ crio.conf: bin/crio
|
||||
release-note: ${RELEASE_TOOL}
|
||||
${RELEASE_TOOL} -n $(release)
|
||||
|
||||
-conmon/config.h: git-vars cmd/crio-config/config.go oci/oci.go
|
||||
+conmon/config.h: cmd/crio-config/config.go oci/oci.go
|
||||
$(GO) build $(LDFLAGS) -tags "$(BUILDTAGS)" -o bin/crio-config $(PROJECT)/cmd/crio-config
|
||||
( cd conmon && $(CURDIR)/bin/crio-config )
|
||||
|
||||
diff --git a/cmd/crio/main.go b/cmd/crio/main.go
|
||||
index 0bc347a..ab9969f 100644
|
||||
--- a/cmd/crio/main.go
|
||||
+++ b/cmd/crio/main.go
|
||||
@@ -207,7 +207,7 @@ func mergeConfig(config *server.Config, ctx *cli.Context) (string, error) {
|
||||
}
|
||||
|
||||
func writeCrioGoroutineStacks() {
|
||||
- path := filepath.Join("/tmp", fmt.Sprintf("crio-goroutine-stacks-%s.log", strings.ReplaceAll(time.Now().Format(time.RFC3339), ":", "")))
|
||||
+ path := filepath.Join("/tmp", fmt.Sprintf("crio-goroutine-stacks-%s.log", strings.Replace(time.Now().Format(time.RFC3339), ":", "", -1)))
|
||||
if err := utils.WriteGoroutineStacksToFile(path); err != nil {
|
||||
logrus.Warnf("Failed to write goroutine stacks: %s", err)
|
||||
}
|
||||
diff --git a/oci/runtime_vm.go b/oci/runtime_vm.go
|
||||
index 57a1fde..64f853f 100644
|
||||
--- a/oci/runtime_vm.go
|
||||
+++ b/oci/runtime_vm.go
|
||||
@@ -172,7 +172,7 @@ func (r *runtimeVM) startRuntimeDaemon(c *Container) error {
|
||||
args = append(args, "start")
|
||||
|
||||
// Modify the runtime path so that it complies with v2 shim API
|
||||
- newRuntimePath := strings.ReplaceAll(r.path, "-", ".")
|
||||
+ newRuntimePath := strings.Replace(r.path, "-", ".", -1)
|
||||
|
||||
// Setup default namespace
|
||||
r.ctx = namespaces.WithNamespace(r.ctx, namespaces.Default)
|
|
@ -5,6 +5,11 @@
|
|||
#
|
||||
# Please refer to crio.conf(5) for details of all configuration options.
|
||||
|
||||
# CRI-O supports partial configuration reload during runtime, which can be
|
||||
# done by sending SIGHUP to the running process. Currently supported options
|
||||
# are explicitly mentioned with: 'This option supports live configuration
|
||||
# reload'.
|
||||
|
||||
# CRI-O reads its storage defaults from the containers-storage.conf(5) file
|
||||
# located at /etc/containers/storage.conf. Modify this storage configuration if
|
||||
# you want to change the system's defaults. If you want to modify storage just
|
||||
|
@ -28,9 +33,11 @@ storage_driver = "overlay"
|
|||
#]
|
||||
|
||||
# If set to false, in-memory locking will be used instead of file-based locking.
|
||||
file_locking = true
|
||||
# **Deprecated** this option will be removed in the future.
|
||||
file_locking = false
|
||||
|
||||
# Path to the lock file.
|
||||
# **Deprecated** this option will be removed in the future.
|
||||
file_locking_path = "/run/crio.lock"
|
||||
|
||||
|
||||
|
@ -90,6 +97,9 @@ no_pivot = true
|
|||
# Path to the conmon binary, used for monitoring the OCI runtime.
|
||||
conmon = "/usr/libexec/crio/conmon"
|
||||
|
||||
# Cgroup setting for conmon
|
||||
conmon_cgroup = "pod"
|
||||
|
||||
# Environment variable list for the conmon process, used for passing necessary
|
||||
# environment variables to conmon or the runtime.
|
||||
conmon_env = [
|
||||
|
@ -100,8 +110,9 @@ conmon_env = [
|
|||
selinux = false
|
||||
|
||||
# Path to the seccomp.json profile which is used as the default seccomp profile
|
||||
# for the runtime.
|
||||
seccomp_profile = "/etc/crio/seccomp.json"
|
||||
# for the runtime. If not specified, then the internal default seccomp profile
|
||||
# will be used.
|
||||
seccomp_profile = ""
|
||||
|
||||
# Used to change the name of the default AppArmor profile of CRI-O. The default
|
||||
# profile name is "crio-default-" followed by the version string of CRI-O.
|
||||
|
@ -185,9 +196,13 @@ container_attach_socket_dir = "/var/run/crio"
|
|||
read_only = false
|
||||
|
||||
# Changes the verbosity of the logs based on the level it is set to. Options
|
||||
# are fatal, panic, error, warn, info, and debug.
|
||||
# are fatal, panic, error, warn, info, and debug. This option supports live
|
||||
# configuration reload.
|
||||
log_level = "error"
|
||||
|
||||
# The default log directory where all logs will go unless directly specified by the kubelet
|
||||
log_dir = "/var/log/crio/pods"
|
||||
|
||||
# The UID mappings for the user namespace of each container. A range is
|
||||
# specified in the form containerUID:HostUID:Size. Multiple ranges must be
|
||||
# separated by comma.
|
||||
|
@ -202,15 +217,19 @@ gid_mappings = ""
|
|||
# regarding the proper termination of the container.
|
||||
ctr_stop_timeout = 0
|
||||
|
||||
# The "crio.runtime.runtimes" table defines a list of OCI compatible runtimes.
|
||||
# The runtime to use is picked based on the runtime_handler provided by the CRI.
|
||||
# If no runtime_handler is provided, the runtime will be picked based on the level
|
||||
# of trust of the workload.
|
||||
|
||||
[crio.runtime.runtimes.runc]
|
||||
runtime_path = "/usr/bin/runc"
|
||||
runtime_type = "oci"
|
||||
|
||||
# ManageNetworkNSLifecycle determines whether we pin and remove network namespace
|
||||
# and manage its lifecycle.
|
||||
manage_network_ns_lifecycle = false
|
||||
|
||||
# The "crio.runtime.runtimes" table defines a list of OCI compatible runtimes.
|
||||
# The runtime to use is picked based on the runtime_handler provided by the CRI.
|
||||
# If no runtime_handler is provided, the runtime will be picked based on the level
|
||||
# of trust of the workload.
|
||||
|
||||
[crio.runtime.runtimes.runc]
|
||||
runtime_path = "/usr/bin/runc"
|
||||
runtime_type = "oci"
|
||||
runtime_root = "/run/runc"
|
||||
|
||||
|
||||
# The crio.image table contains settings pertaining to the management of OCI images.
|
||||
|
@ -225,14 +244,21 @@ ctr_stop_timeout = 0
|
|||
# Default transport for pulling images from a remote container storage.
|
||||
default_transport = "docker://"
|
||||
|
||||
# The path to a file containing credentials necessary for pulling images from
|
||||
# secure registries. The file is similar to that of /var/lib/kubelet/config.json
|
||||
global_auth_file = ""
|
||||
|
||||
# The image used to instantiate infra containers.
|
||||
# This option supports live configuration reload.
|
||||
pause_image = "k8s.gcr.io/pause:3.1"
|
||||
|
||||
# If not empty, the path to a docker/config.json-like file containing credentials
|
||||
# necessary for pulling the image specified by pause_image above.
|
||||
# The path to a file containing credentials specific for pulling the pause_image from
|
||||
# above. The file is similar to that of /var/lib/kubelet/config.json
|
||||
# This option supports live configuration reload.
|
||||
pause_image_auth_file = ""
|
||||
|
||||
# The command to run to have a container stay in the paused state.
|
||||
# This option supports live configuration reload.
|
||||
pause_command = "/pause"
|
||||
|
||||
# Path to the file which decides what sort of policy we use when deciding
|
||||
|
@ -264,6 +290,6 @@ registries = [
|
|||
network_dir = "/etc/cni/net.d/"
|
||||
|
||||
# Paths to directories where CNI plugin binaries are located.
|
||||
plugin_dir = [
|
||||
plugin_dirs = [
|
||||
"/opt/cni/bin/",
|
||||
]
|
||||
|
|
|
@ -5,6 +5,11 @@
|
|||
#
|
||||
# Please refer to crio.conf(5) for details of all configuration options.
|
||||
|
||||
# CRI-O supports partial configuration reload during runtime, which can be
|
||||
# done by sending SIGHUP to the running process. Currently supported options
|
||||
# are explicitly mentioned with: 'This option supports live configuration
|
||||
# reload'.
|
||||
|
||||
# CRI-O reads its storage defaults from the containers-storage.conf(5) file
|
||||
# located at /etc/containers/storage.conf. Modify this storage configuration if
|
||||
# you want to change the system's defaults. If you want to modify storage just
|
||||
|
@ -20,7 +25,7 @@
|
|||
|
||||
# Storage driver used to manage the storage of images and containers. Please
|
||||
# refer to containers-storage.conf(5) to see all available storage drivers.
|
||||
#storage_driver = "overlay"
|
||||
#storage_driver = ""
|
||||
|
||||
# List to pass options to the storage driver. Please refer to
|
||||
# containers-storage.conf(5) to see all available storage options.
|
||||
|
@ -28,9 +33,11 @@
|
|||
#]
|
||||
|
||||
# If set to false, in-memory locking will be used instead of file-based locking.
|
||||
file_locking = true
|
||||
# **Deprecated** this option will be removed in the future.
|
||||
file_locking = false
|
||||
|
||||
# Path to the lock file.
|
||||
# **Deprecated** this option will be removed in the future.
|
||||
file_locking_path = "/run/crio.lock"
|
||||
|
||||
|
||||
|
@ -90,6 +97,9 @@ no_pivot = false
|
|||
# Path to the conmon binary, used for monitoring the OCI runtime.
|
||||
conmon = "/usr/local/libexec/crio/conmon"
|
||||
|
||||
# Cgroup setting for conmon
|
||||
conmon_cgroup = "pod"
|
||||
|
||||
# Environment variable list for the conmon process, used for passing necessary
|
||||
# environment variables to conmon or the runtime.
|
||||
conmon_env = [
|
||||
|
@ -100,8 +110,9 @@ conmon_env = [
|
|||
selinux = false
|
||||
|
||||
# Path to the seccomp.json profile which is used as the default seccomp profile
|
||||
# for the runtime.
|
||||
seccomp_profile = "/etc/crio/seccomp.json"
|
||||
# for the runtime. If not specified, then the internal default seccomp profile
|
||||
# will be used.
|
||||
seccomp_profile = ""
|
||||
|
||||
# Used to change the name of the default AppArmor profile of CRI-O. The default
|
||||
# profile name is "crio-default-" followed by the version string of CRI-O.
|
||||
|
@ -185,9 +196,13 @@ container_attach_socket_dir = "/var/run/crio"
|
|||
read_only = false
|
||||
|
||||
# Changes the verbosity of the logs based on the level it is set to. Options
|
||||
# are fatal, panic, error, warn, info, and debug.
|
||||
# are fatal, panic, error, warn, info, and debug. This option supports live
|
||||
# configuration reload.
|
||||
log_level = "error"
|
||||
|
||||
# The default log directory where all logs will go unless directly specified by the kubelet
|
||||
log_dir = "/var/log/crio/pods"
|
||||
|
||||
# The UID mappings for the user namespace of each container. A range is
|
||||
# specified in the form containerUID:HostUID:Size. Multiple ranges must be
|
||||
# separated by comma.
|
||||
|
@ -202,15 +217,19 @@ gid_mappings = ""
|
|||
# regarding the proper termination of the container.
|
||||
ctr_stop_timeout = 0
|
||||
|
||||
# The "crio.runtime.runtimes" table defines a list of OCI compatible runtimes.
|
||||
# The runtime to use is picked based on the runtime_handler provided by the CRI.
|
||||
# If no runtime_handler is provided, the runtime will be picked based on the level
|
||||
# of trust of the workload.
|
||||
|
||||
[crio.runtime.runtimes.runc]
|
||||
runtime_path = "/usr/bin/runc"
|
||||
runtime_type = "oci"
|
||||
|
||||
# ManageNetworkNSLifecycle determines whether we pin and remove network namespace
|
||||
# and manage its lifecycle.
|
||||
manage_network_ns_lifecycle = false
|
||||
|
||||
# The "crio.runtime.runtimes" table defines a list of OCI compatible runtimes.
|
||||
# The runtime to use is picked based on the runtime_handler provided by the CRI.
|
||||
# If no runtime_handler is provided, the runtime will be picked based on the level
|
||||
# of trust of the workload.
|
||||
|
||||
[crio.runtime.runtimes.runc]
|
||||
runtime_path = ""
|
||||
runtime_type = "oci"
|
||||
runtime_root = "/run/runc"
|
||||
|
||||
|
||||
# The crio.image table contains settings pertaining to the management of OCI images.
|
||||
|
@ -225,14 +244,21 @@ ctr_stop_timeout = 0
|
|||
# Default transport for pulling images from a remote container storage.
|
||||
default_transport = "docker://"
|
||||
|
||||
# The path to a file containing credentials necessary for pulling images from
|
||||
# secure registries. The file is similar to that of /var/lib/kubelet/config.json
|
||||
global_auth_file = ""
|
||||
|
||||
# The image used to instantiate infra containers.
|
||||
# This option supports live configuration reload.
|
||||
pause_image = "k8s.gcr.io/pause:3.1"
|
||||
|
||||
# If not empty, the path to a docker/config.json-like file containing credentials
|
||||
# necessary for pulling the image specified by pause_image above.
|
||||
# The path to a file containing credentials specific for pulling the pause_image from
|
||||
# above. The file is similar to that of /var/lib/kubelet/config.json
|
||||
# This option supports live configuration reload.
|
||||
pause_image_auth_file = ""
|
||||
|
||||
# The command to run to have a container stay in the paused state.
|
||||
# This option supports live configuration reload.
|
||||
pause_command = "/pause"
|
||||
|
||||
# Path to the file which decides what sort of policy we use when deciding
|
||||
|
@ -263,6 +289,6 @@ image_volumes = "mkdir"
|
|||
network_dir = "/etc/cni/net.d/"
|
||||
|
||||
# Paths to directories where CNI plugin binaries are located.
|
||||
plugin_dir = [
|
||||
plugin_dirs = [
|
||||
"/opt/cni/bin/",
|
||||
]
|
||||
|
|
|
@ -11,3 +11,4 @@ sha256 346f9394393ee8db5f8bd1e229ee9d90e5b36931bdd754308b2ae68884dd6822 docker-
|
|||
sha256 99ca9395e9c7ffbf75537de71aa828761f492491d02bc6e29db2920fa582c6c5 docker-18.09.5.tgz
|
||||
sha256 1f3f6774117765279fce64ee7f76abbb5f260264548cf80631d68fb2d795bb09 docker-18.09.6.tgz
|
||||
sha256 e106ccfa2b1f60794faaa6bae57a2dac9dc4cb33e5541fad6a826ea525d01cc4 docker-18.09.7.tgz
|
||||
sha256 12277eff64363f51ba2f20dd258bdc2c3248022996c0251921193ec6fd179e52 docker-18.09.8.tgz
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
#
|
||||
################################################################################
|
||||
|
||||
DOCKER_BIN_VERSION = 18.09.7
|
||||
DOCKER_BIN_VERSION = 18.09.8
|
||||
DOCKER_BIN_SITE = https://download.docker.com/linux/static/stable/x86_64
|
||||
DOCKER_BIN_SOURCE = docker-$(DOCKER_BIN_VERSION).tgz
|
||||
|
||||
|
|
|
@ -247,7 +247,7 @@ minikube service [command]
|
|||
|
||||
---
|
||||
### start
|
||||
**Description -** Starts a local kubernetes cluster using VM. This command assumes you have already installed one of the VM drivers: **virtualbox/parallels/vmwarefusion/kvm/xhyve/hyperv**.
|
||||
**Description -** Starts a local kubernetes cluster.
|
||||
**Usage -** `minikube start [flags]`
|
||||
**Available Flags -**
|
||||
```
|
||||
|
@ -259,7 +259,7 @@ minikube service [command]
|
|||
--container-runtime string The container runtime to be used (docker, crio, containerd) (default "docker")
|
||||
--cpus int Number of CPUs allocated to the minikube VM (default 2)
|
||||
--cri-socket string The cri socket path to be used
|
||||
--disable-driver-mounts Disables the filesystem mounts provided by the hypervisors (vboxfs, xhyve-9p)
|
||||
--disable-driver-mounts Disables the filesystem mounts provided by the hypervisors (vboxfs)
|
||||
--disk-size string Disk size allocated to the minikube VM (format: <number>[<unit>], where unit = b, k, m or g) (default "20000mb")
|
||||
--dns-domain string The cluster dns domain name used in the kubernetes cluster (default "cluster.local")
|
||||
--docker-env stringArray Environment variables to pass to the Docker daemon. (format: key=value)
|
||||
|
@ -295,8 +295,7 @@ minikube service [command]
|
|||
--registry-mirror strings Registry mirrors to pass to the Docker daemon
|
||||
--service-cluster-ip-range string The CIDR to be used for service cluster IPs. (default "10.96.0.0/12")
|
||||
--uuid string Provide VM UUID to restore MAC address (only supported with Hyperkit driver).
|
||||
--vm-driver string VM driver is one of: [virtualbox parallels vmwarefusion kvm xhyve hyperv hyperkit kvm2 vmware none] (default "virtualbox")
|
||||
--xhyve-disk-driver string The disk driver to use [ahci-hd|virtio-blk] (only supported with xhyve driver) (default "ahci-hd")
|
||||
--vm-driver string VM driver is one of: [virtualbox parallels vmwarefusion kvm hyperv hyperkit kvm2 vmware none] (default "virtualbox")
|
||||
```
|
||||
|
||||
---
|
||||
|
|
|
@ -22,4 +22,4 @@ Here are some specific minikube features that align with our goal:
|
|||
## Non-Goals
|
||||
|
||||
* Simplifying Kubernetes production deployment experience
|
||||
* Supporting all possible deployment configurations of Kubernetes like various types of storage, networking, etc.
|
||||
* Supporting all possible deployment configurations of Kubernetes, such as storage, networking, etc.
|
||||
|
|
|
@ -11,7 +11,7 @@ the host PATH:
|
|||
|
||||
* [KVM2](#kvm2-driver)
|
||||
* [Hyperkit](#hyperkit-driver)
|
||||
* [HyperV](#hyperv-driver)
|
||||
* [Hyper-V](#hyper-v-driver)
|
||||
* [VMware](#vmware-unified-driver)
|
||||
* [Parallels](#parallels-driver)
|
||||
|
||||
|
@ -23,7 +23,7 @@ To install the KVM2 driver, first install and configure the prerequisites, namel
|
|||
|
||||
* Debian or Ubuntu 18.x: `sudo apt install libvirt-clients libvirt-daemon-system qemu-kvm`
|
||||
* Ubuntu 16.x or older: `sudo apt install libvirt-bin libvirt-daemon-system qemu-kvm`
|
||||
* Fedora/CentOS/RHEL: `sudo yum install libvirt-daemon-kvm qemu-kvm`
|
||||
* Fedora/CentOS/RHEL: `sudo yum install libvirt libvirt-daemon-kvm qemu-kvm`
|
||||
* openSUSE/SLES: `sudo zypper install libvirt qemu-kvm`
|
||||
|
||||
Check your installed virsh version:
|
||||
|
@ -143,6 +143,13 @@ or, to use hyperkit as a default driver for minikube:
|
|||
minikube config set vm-driver hyperkit
|
||||
```
|
||||
|
||||
### Hyperkit upgrade
|
||||
|
||||
```shell
|
||||
curl -LO https://storage.googleapis.com/minikube/releases/latest/docker-machine-driver-hyperkit \
|
||||
&& sudo install -o root -g wheel -m 4755 docker-machine-driver-hyperkit /usr/local/bin/
|
||||
```
|
||||
|
||||
### Hyperkit troubleshoot
|
||||
|
||||
Make sure you are running the lastest version of your driver.
|
||||
|
@ -151,11 +158,11 @@ Make sure you are running the lastest version of your driver.
|
|||
docker-machine-driver-hyperkit version
|
||||
```
|
||||
|
||||
## HyperV driver
|
||||
## Hyper-V driver
|
||||
|
||||
Hyper-v users may need to create a new external network switch as described [here](https://docs.docker.com/machine/drivers/hyper-v/). This step may prevent a problem in which `minikube start` hangs indefinitely, unable to ssh into the minikube virtual machine. In this add, add the `--hyperv-virtual-switch=switch-name` argument to the `minikube start` command.
|
||||
Hyper-V users will need to create a new external network switch as described [here](https://docs.docker.com/machine/drivers/hyper-v/). This step may prevent a problem in which `minikube start` hangs indefinitely, unable to ssh into the minikube virtual machine. In this add, add the `--hyperv-virtual-switch=switch-name` argument to the `minikube start` command.
|
||||
|
||||
On some machines, having **dynamic memory management** turned on for the minikube VM can cause problems of unexpected and random restarts which manifests itself in simply losing the connection to the cluster, after which `minikube status` would simply state `stopped`. Machine restarts are caused due to following Hyper-V error: `The dynamic memory balancer could not add memory to the virtual machine 'minikube' because its configured maximum has been reached`. **Solution**: turned the dynamic memory management in hyper-v settings off (and allocate a fixed amount of memory to the machine).
|
||||
Older Hyper-V VM's may have **dynamic memory management** enabled, which can cause problems of unexpected and random restarts which manifests itself in simply losing the connection to the cluster, after which `minikube status` would simply state `stopped`. **Solution**: run `minikube delete` to delete the old VM.
|
||||
|
||||
To use the driver:
|
||||
|
||||
|
|
|
@ -10,7 +10,7 @@ If all cluster IP addresses and Load Balancers were made available on the miniku
|
|||
|
||||
Tools like telepresence.io, sshuttle, and the OpenVPN chart provide similar capabilities already.
|
||||
|
||||
Also, Steve Sloka has provided a very detailed guide on how to setup a similar configuration [manually](https://stevesloka.com/2017/06/12/access-minikube-service-from-linux-host/).
|
||||
Also, Steve Sloka has provided a very detailed guide on how to setup a similar configuration [manually](https://stevesloka.com/access-minikube-service-from-linux-host/).
|
||||
|
||||
Elson Rodriguez has provided a similar guide, including a Minikube [external LB controller](https://github.com/elsonrodriguez/minikube-lb-patch).
|
||||
|
||||
|
|
117
go.mod
117
go.mod
|
@ -3,109 +3,96 @@ module k8s.io/minikube
|
|||
go 1.12
|
||||
|
||||
require (
|
||||
github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78 // indirect
|
||||
github.com/Microsoft/go-winio v0.4.13 // indirect
|
||||
github.com/Parallels/docker-machine-parallels v1.3.0
|
||||
github.com/Sirupsen/logrus v0.0.0-20170822132746-89742aefa4b2 // indirect
|
||||
github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d // indirect
|
||||
github.com/blang/semver v3.5.0+incompatible
|
||||
github.com/c4milo/gotoolkit v0.0.0-20170318115440-bcc06269efa9 // indirect
|
||||
github.com/cenkalti/backoff v2.2.1+incompatible
|
||||
github.com/cloudfoundry-attic/jibber_jabber v0.0.0-20151120183258-bcc4c8345a21
|
||||
github.com/cloudfoundry/jibber_jabber v0.0.0-20151120183258-bcc4c8345a21 // indirect
|
||||
github.com/cpuguy83/go-md2man v1.0.4 // indirect
|
||||
github.com/docker/distribution v2.7.1+incompatible // indirect
|
||||
github.com/docker/docker v0.0.0-20180531152204-71cd53e4a197 // indirect
|
||||
github.com/docker/go-connections v0.4.0 // indirect
|
||||
github.com/docker/go-units v0.0.0-20170127094116-9e638d38cf69
|
||||
github.com/docker/machine v0.16.1
|
||||
github.com/docker/docker v1.13.1 // indirect
|
||||
github.com/docker/go-units v0.3.3
|
||||
github.com/docker/machine v0.16.1-0.20190718054102-a555e4f7a8f5
|
||||
github.com/elazarl/goproxy v0.0.0-20190421051319-9d40249d3c2f
|
||||
github.com/elazarl/goproxy/ext v0.0.0-20190421051319-9d40249d3c2f // indirect
|
||||
github.com/fatih/color v1.7.0 // indirect
|
||||
github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680 // indirect
|
||||
github.com/gogo/protobuf v0.0.0-20170330071051-c0656edd0d9e // indirect
|
||||
github.com/go-ole/go-ole v1.2.4 // indirect
|
||||
github.com/golang-collections/collections v0.0.0-20130729185459-604e922904d3
|
||||
github.com/golang/glog v0.0.0-20141105023935-44145f04b68c
|
||||
github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903 // indirect
|
||||
github.com/google/btree v1.0.0 // indirect
|
||||
github.com/google/go-cmp v0.2.0
|
||||
github.com/google/go-containerregistry v0.0.0-20190729175742-ef12d49c8daf
|
||||
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b
|
||||
github.com/google/go-cmp v0.3.0
|
||||
github.com/google/go-containerregistry v0.0.0-20190318164241-019cdfc6adf9
|
||||
github.com/google/go-github/v25 v25.0.2
|
||||
github.com/google/gofuzz v0.0.0-20161122191042-44d81051d367 // indirect
|
||||
github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d // indirect
|
||||
github.com/gorilla/mux v1.7.1 // indirect
|
||||
github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7 // indirect
|
||||
github.com/hashicorp/errwrap v0.0.0-20141028054710-7554cd9344ce // indirect
|
||||
github.com/hashicorp/go-getter v1.3.0
|
||||
github.com/hashicorp/go-multierror v0.0.0-20160811015721-8c5f0ad93604 // indirect
|
||||
github.com/hashicorp/go-retryablehttp v0.5.4
|
||||
github.com/hashicorp/go-version v1.1.0 // indirect
|
||||
github.com/hashicorp/golang-lru v0.0.0-20160207214719-a0d98a5f2880 // indirect
|
||||
github.com/hashicorp/hcl v0.0.0-20160711231752-d8c773c4cba1 // indirect
|
||||
github.com/hooklift/assert v0.0.0-20170704181755-9d1defd6d214 // indirect
|
||||
github.com/hooklift/iso9660 v0.0.0-20170318115843-1cf07e5970d8
|
||||
github.com/imdario/mergo v0.0.0-20141206190957-6633656539c1 // indirect
|
||||
github.com/inconshreveable/mousetrap v1.0.0 // indirect
|
||||
github.com/intel-go/cpuid v0.0.0-20181003105527-1a4a6f06a1c6 // indirect
|
||||
github.com/jimmidyson/go-download v0.0.0-20161028105827-7f9a90c8c95b
|
||||
github.com/johanneswuerbach/nfsexports v0.0.0-20181204082207-1aa528dcb345
|
||||
github.com/json-iterator/go v1.1.5 // indirect
|
||||
github.com/kr/fs v0.0.0-20131111012553-2788f0dbd169 // indirect
|
||||
github.com/kr/pretty v0.1.0 // indirect
|
||||
github.com/libvirt/libvirt-go v3.4.0+incompatible
|
||||
github.com/machine-drivers/docker-machine-driver-vmware v0.1.1
|
||||
github.com/magiconair/properties v0.0.0-20160816085511-61b492c03cf4 // indirect
|
||||
github.com/mattn/go-colorable v0.1.1 // indirect
|
||||
github.com/mattn/go-isatty v0.0.5
|
||||
github.com/mattn/go-runewidth v0.0.0-20161012013512-737072b4e32b // indirect
|
||||
github.com/mitchellh/go-ps v0.0.0-20170309133038-4fdf99ab2936
|
||||
github.com/mitchellh/mapstructure v0.0.0-20170307201123-53818660ed49 // indirect
|
||||
github.com/moby/hyperkit v0.0.0-20171020124204-a12cd7250bcd
|
||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
|
||||
github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742 // indirect
|
||||
github.com/olekukonko/tablewriter v0.0.0-20160923125401-bdcc175572fd
|
||||
github.com/onsi/ginkgo v1.8.0 // indirect
|
||||
github.com/onsi/gomega v1.5.0 // indirect
|
||||
github.com/opencontainers/go-digest v1.0.0-rc1 // indirect
|
||||
github.com/opencontainers/image-spec v1.0.1 // indirect
|
||||
github.com/pborman/uuid v0.0.0-20150603214016-ca53cad383ca
|
||||
github.com/pelletier/go-buffruneio v0.1.0 // indirect
|
||||
github.com/pelletier/go-toml v0.0.0-20160822122712-0049ab3dc4c4 // indirect
|
||||
github.com/peterbourgon/diskv v2.0.1+incompatible // indirect
|
||||
github.com/pborman/uuid v1.2.0
|
||||
github.com/phayes/freeport v0.0.0-20180830031419-95f893ade6f2
|
||||
github.com/pkg/browser v0.0.0-20160118053552-9302be274faa
|
||||
github.com/pkg/errors v0.8.1
|
||||
github.com/pkg/profile v0.0.0-20161223203901-3a8809bd8a80
|
||||
github.com/pkg/sftp v0.0.0-20160930220758-4d0e916071f6 // indirect
|
||||
github.com/pmezard/go-difflib v1.0.0
|
||||
github.com/r2d4/external-storage v0.0.0-20171222174501-8c0e8605dc7b
|
||||
github.com/russross/blackfriday v0.0.0-20151117072312-300106c228d5 // indirect
|
||||
github.com/samalba/dockerclient v0.0.0-20160414174713-91d7393ff859 // indirect
|
||||
github.com/shurcooL/sanitized_anchor_name v0.0.0-20151028001915-10ef21a441db // indirect
|
||||
github.com/spf13/afero v0.0.0-20160816080757-b28a7effac97 // indirect
|
||||
github.com/spf13/cast v0.0.0-20160730092037-e31f36ffc91a // indirect
|
||||
github.com/spf13/cobra v0.0.0-20180228053838-6644d46b81fa
|
||||
github.com/spf13/jwalterweatherman v0.0.0-20160311093646-33c24e77fb80 // indirect
|
||||
github.com/spf13/pflag v1.0.1
|
||||
github.com/spf13/viper v1.0.0
|
||||
github.com/stretchr/testify v1.3.0 // indirect
|
||||
github.com/shirou/gopsutil v2.18.12+incompatible
|
||||
github.com/sirupsen/logrus v1.4.1 // indirect
|
||||
github.com/spf13/cobra v0.0.5
|
||||
github.com/spf13/pflag v1.0.3
|
||||
github.com/spf13/viper v1.3.2
|
||||
github.com/xeipuuv/gojsonpointer v0.0.0-20151027082146-e0fe6f683076 // indirect
|
||||
github.com/xeipuuv/gojsonreference v0.0.0-20150808065054-e02fc20de94c // indirect
|
||||
github.com/xeipuuv/gojsonschema v0.0.0-20160623135812-c539bca196be
|
||||
github.com/zchee/go-vmnet v0.0.0-20161021174912-97ebf9174097
|
||||
golang.org/x/crypto v0.0.0-20190506204251-e1dfcc566284
|
||||
golang.org/x/oauth2 v0.0.0-20190115181402-5dab4167f31c
|
||||
golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8
|
||||
golang.org/x/oauth2 v0.0.0-20190402181905-9f3314589c9a
|
||||
golang.org/x/sync v0.0.0-20190423024810-112230192c58
|
||||
golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b
|
||||
golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f
|
||||
golang.org/x/text v0.3.2
|
||||
golang.org/x/time v0.0.0-20161028155119-f51c12702a4d // indirect
|
||||
gopkg.in/airbrake/gobrake.v2 v2.0.9 // indirect
|
||||
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 // indirect
|
||||
gopkg.in/cheggaaa/pb.v1 v1.0.6 // indirect
|
||||
gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2 // indirect
|
||||
gopkg.in/inf.v0 v0.9.0 // indirect
|
||||
gopkg.in/yaml.v1 v1.0.0-20140924161607-9f9df34309c0 // indirect
|
||||
k8s.io/api v0.0.0-20180712090710-2d6f90ab1293
|
||||
k8s.io/apimachinery v0.0.0-20180621070125-103fd098999d
|
||||
k8s.io/apiserver v0.0.0-20180914001516-67c892841170 // indirect
|
||||
k8s.io/client-go v0.0.0-20180806134042-1f13a808da65
|
||||
k8s.io/kube-openapi v0.0.0-20180216212618-50ae88d24ede // indirect
|
||||
k8s.io/kubernetes v1.11.3
|
||||
k8s.io/api v0.0.0
|
||||
k8s.io/apimachinery v0.0.0
|
||||
k8s.io/client-go v0.0.0
|
||||
k8s.io/kubectl v0.0.0-00010101000000-000000000000
|
||||
k8s.io/kubernetes v1.15.0
|
||||
sigs.k8s.io/sig-storage-lib-external-provisioner v4.0.0+incompatible
|
||||
)
|
||||
|
||||
replace (
|
||||
k8s.io/api => k8s.io/kubernetes/staging/src/k8s.io/api v0.0.0-20190623232353-8c3b7d7679cc
|
||||
k8s.io/apiextensions-apiserver => k8s.io/kubernetes/staging/src/k8s.io/apiextensions-apiserver v0.0.0-20190623232353-8c3b7d7679cc
|
||||
k8s.io/apimachinery => k8s.io/kubernetes/staging/src/k8s.io/apimachinery v0.0.0-20190623232353-8c3b7d7679cc
|
||||
k8s.io/apiserver => k8s.io/kubernetes/staging/src/k8s.io/apiserver v0.0.0-20190623232353-8c3b7d7679cc
|
||||
k8s.io/cli-runtime => k8s.io/kubernetes/staging/src/k8s.io/cli-runtime v0.0.0-20190623232353-8c3b7d7679cc
|
||||
k8s.io/client-go => k8s.io/kubernetes/staging/src/k8s.io/client-go v0.0.0-20190623232353-8c3b7d7679cc
|
||||
k8s.io/cloud-provider => k8s.io/kubernetes/staging/src/k8s.io/cloud-provider v0.0.0-20190623232353-8c3b7d7679cc
|
||||
k8s.io/cluster-bootstrap => k8s.io/kubernetes/staging/src/k8s.io/cluster-bootstrap v0.0.0-20190623232353-8c3b7d7679cc
|
||||
k8s.io/code-generator => k8s.io/kubernetes/staging/src/k8s.io/code-generator v0.0.0-20190623232353-8c3b7d7679cc
|
||||
k8s.io/component-base => k8s.io/kubernetes/staging/src/k8s.io/component-base v0.0.0-20190623232353-8c3b7d7679cc
|
||||
k8s.io/cri-api => k8s.io/kubernetes/staging/src/k8s.io/cri-api v0.0.0-20190623232353-8c3b7d7679cc
|
||||
k8s.io/csi-translation-lib => k8s.io/kubernetes/staging/src/k8s.io/csi-translation-lib v0.0.0-20190623232353-8c3b7d7679cc
|
||||
k8s.io/kube-aggregator => k8s.io/kubernetes/staging/src/k8s.io/kube-aggregator v0.0.0-20190623232353-8c3b7d7679cc
|
||||
k8s.io/kube-controller-manager => k8s.io/kubernetes/staging/src/k8s.io/kube-controller-manager v0.0.0-20190623232353-8c3b7d7679cc
|
||||
k8s.io/kube-proxy => k8s.io/kubernetes/staging/src/k8s.io/kube-proxy v0.0.0-20190623232353-8c3b7d7679cc
|
||||
k8s.io/kube-scheduler => k8s.io/kubernetes/staging/src/k8s.io/kube-scheduler v0.0.0-20190623232353-8c3b7d7679cc
|
||||
k8s.io/kubectl => k8s.io/kubernetes/staging/src/k8s.io/kubectl v0.0.0-20190623232353-8c3b7d7679cc
|
||||
k8s.io/kubelet => k8s.io/kubernetes/staging/src/k8s.io/kubelet v0.0.0-20190623232353-8c3b7d7679cc
|
||||
k8s.io/legacy-cloud-providers => k8s.io/kubernetes/staging/src/k8s.io/legacy-cloud-providers v0.0.0-20190623232353-8c3b7d7679cc
|
||||
k8s.io/metrics => k8s.io/kubernetes/staging/src/k8s.io/metrics v0.0.0-20190623232353-8c3b7d7679cc
|
||||
k8s.io/node-api => k8s.io/kubernetes/staging/src/k8s.io/node-api v0.0.0-20190623232353-8c3b7d7679cc
|
||||
k8s.io/sample-apiserver => k8s.io/kubernetes/staging/src/k8s.io/sample-apiserver v0.0.0-20190623232353-8c3b7d7679cc
|
||||
k8s.io/sample-cli-plugin => k8s.io/kubernetes/staging/src/k8s.io/sample-cli-plugin v0.0.0-20190623232353-8c3b7d7679cc
|
||||
k8s.io/sample-controller => k8s.io/kubernetes/staging/src/k8s.io/sample-controller v0.0.0-20190623232353-8c3b7d7679cc
|
||||
)
|
||||
|
|
596
go.sum
596
go.sum
|
@ -1,160 +1,363 @@
|
|||
bitbucket.org/bertimus9/systemstat v0.0.0-20180207000608-0eeff89b0690/go.mod h1:Ulb78X89vxKYgdL24HMTiXYHlyHEvruOj1ZPlqeNEZM=
|
||||
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
|
||||
cloud.google.com/go v0.31.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
|
||||
cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
|
||||
cloud.google.com/go v0.36.0 h1:+aCSj7tOo2LODWVEuZDZeGCckdt6MlSF+X/rB3wUiS8=
|
||||
cloud.google.com/go v0.36.0/go.mod h1:RUoy9p/M4ge0HzT8L+SDZ8jg+Q6fth0CiBuhFJpSV40=
|
||||
dmitri.shuralyov.com/app/changes v0.0.0-20180602232624-0a106ad413e3/go.mod h1:Yl+fi1br7+Rr3LqpNJf1/uxUdtRUV+Tnj0o93V2B9MU=
|
||||
dmitri.shuralyov.com/html/belt v0.0.0-20180602232347-f7d459c86be0/go.mod h1:JLBrvjyP0v+ecvNYvCpyZgu5/xkfAUhi6wJj28eUfSU=
|
||||
dmitri.shuralyov.com/service/change v0.0.0-20181023043359-a85b471d5412/go.mod h1:a1inKt/atXimZ4Mv927x+r7UpyzRUf4emIoiiSC2TN4=
|
||||
dmitri.shuralyov.com/state v0.0.0-20180228185332-28bcc343414c/go.mod h1:0PRwlb0D6DFvNNtx+9ybjezNCa8XF0xaYcETyp6rHWU=
|
||||
git.apache.org/thrift.git v0.0.0-20180902110319-2566ecd5d999/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg=
|
||||
github.com/Azure/azure-sdk-for-go v21.4.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc=
|
||||
github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78 h1:w+iIsaOQNcT7OZ575w+acHgRric5iCyQh+xv+KJ4HB8=
|
||||
github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8=
|
||||
github.com/Microsoft/go-winio v0.4.13 h1:Hmi80lzZuI/CaYmlJp/b+FjZdRZhKu9c2mDVqKlLWVs=
|
||||
github.com/Microsoft/go-winio v0.4.13/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA=
|
||||
github.com/Azure/go-autorest v11.1.2+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24=
|
||||
github.com/BurntSushi/toml v0.3.0/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
|
||||
github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ=
|
||||
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
|
||||
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
|
||||
github.com/GoogleCloudPlatform/k8s-cloud-provider v0.0.0-20181220005116-f8e995905100/go.mod h1:iroGtC8B3tQiqtds1l+mgk/BBOrxbqjH+eUfFQYRc14=
|
||||
github.com/JeffAshton/win_pdh v0.0.0-20161109143554-76bb4ee9f0ab/go.mod h1:3VYc5hodBMJ5+l/7J4xAyMeuM2PNuepvHlGs8yilUCA=
|
||||
github.com/MakeNowJust/heredoc v0.0.0-20170808103936-bb23615498cd h1:sjQovDkwrZp8u+gxLtPgKGjk5hCxuy2hrRejBTA9xFU=
|
||||
github.com/MakeNowJust/heredoc v0.0.0-20170808103936-bb23615498cd/go.mod h1:64YHyfSL2R96J44Nlwm39UHepQbyR5q10x7iYa1ks2E=
|
||||
github.com/Microsoft/go-winio v0.4.11/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA=
|
||||
github.com/Microsoft/hcsshim v0.8.6/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg=
|
||||
github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ=
|
||||
github.com/Parallels/docker-machine-parallels v1.3.0 h1:RG1fyf3v1GwXMCeHRiZkB4tL9phFZEv6ixcvRZ1raN8=
|
||||
github.com/Parallels/docker-machine-parallels v1.3.0/go.mod h1:HCOMm3Hulq/xuEVQMyZOuQlA+dSZpFY5kdCTZWjMVis=
|
||||
github.com/PuerkitoBio/purell v1.1.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
|
||||
github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE=
|
||||
github.com/Rican7/retry v0.1.0/go.mod h1:FgOROf8P5bebcC1DS0PdOQiqGUridaZvikzUmkFW6gg=
|
||||
github.com/Sirupsen/logrus v0.0.0-20170822132746-89742aefa4b2 h1:k1A7eIeUk6rnX2yuagwljW/pDezkK8oSpvPumT9zdZY=
|
||||
github.com/Sirupsen/logrus v0.0.0-20170822132746-89742aefa4b2/go.mod h1:rmk17hk6i8ZSAJkSDa7nOxamrG+SP4P0mm+DAvExv4U=
|
||||
github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d h1:G0m3OIz70MZUWq3EgK3CesDbo8upS2Vm9/P3FtgI+Jk=
|
||||
github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg=
|
||||
github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c=
|
||||
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/auth0/go-jwt-middleware v0.0.0-20170425171159-5493cabe49f7/go.mod h1:LWMyo4iOLWXHGdBki7NIht1kHru/0wM179h+d3g8ATM=
|
||||
github.com/aws/aws-sdk-go v1.15.78/go.mod h1:E3/ieXAlvM0XWO57iftYVDLLvQ824smPP3ATZkfNZeM=
|
||||
github.com/aws/aws-sdk-go v1.16.26 h1:GWkl3rkRO/JGRTWoLLIqwf7AWC4/W/1hMOUZqmX0js4=
|
||||
github.com/aws/aws-sdk-go v1.16.26/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo=
|
||||
github.com/bazelbuild/bazel-gazelle v0.0.0-20181012220611-c728ce9f663e/go.mod h1:uHBSeeATKpVazAACZBDPL/Nk/UhQDDsJWDlqYJo8/Us=
|
||||
github.com/bazelbuild/buildtools v0.0.0-20180226164855-80c7f0d45d7e/go.mod h1:5JP0TXzWDHXv8qvxRC4InIazwdyDseBDbzESUMKk1yU=
|
||||
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973 h1:xJ4a3vCFaGF/jqvzLMYoU8P317H5OQ+Via4RmuPwCS0=
|
||||
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
|
||||
github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d h1:xDfNPAt8lFiC1UJrqV3uuy861HCTo708pDMbjHHdCas=
|
||||
github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d/go.mod h1:6QX/PXZ00z/TKoufEY6K/a0k6AhaJrQKdFe6OfVXsa4=
|
||||
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/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=
|
||||
github.com/c4milo/gotoolkit v0.0.0-20170318115440-bcc06269efa9/go.mod h1:txokOny9wavBtq2PWuHmj1P+eFwpCsj+gQeNNANChfU=
|
||||
github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4=
|
||||
github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM=
|
||||
github.com/cespare/prettybench v0.0.0-20150116022406-03b8cfe5406c/go.mod h1:Xe6ZsFhtM8HrDku0pxJ3/Lr51rwykrzgFwpmTzleatY=
|
||||
github.com/chai2010/gettext-go v0.0.0-20160711120539-c6fed771bfd5/go.mod h1:/iP1qXHoty45bqomnu2LM+VVyAEdWN+vtSHGlQgyxbw=
|
||||
github.com/cheggaaa/pb v1.0.27/go.mod h1:pQciLPpbU0oxA0h+VJYYLxO+XeDQb5pZijXscXHm81s=
|
||||
github.com/client9/misspell v0.0.0-20170928000206-9ce5d979ffda/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
|
||||
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
|
||||
github.com/cloudflare/cfssl v0.0.0-20180726162950-56268a613adf/go.mod h1:yMWuSON2oQp+43nFtAV/uvKQIFpSPerB57DCt9t8sSA=
|
||||
github.com/cloudfoundry-attic/jibber_jabber v0.0.0-20151120183258-bcc4c8345a21 h1:Yg2hDs4b13Evkpj42FU2idX2cVXVFqQSheXYKM86Qsk=
|
||||
github.com/cloudfoundry-attic/jibber_jabber v0.0.0-20151120183258-bcc4c8345a21/go.mod h1:MgJyK38wkzZbiZSKeIeFankxxSA8gayko/nr5x5bgBA=
|
||||
github.com/cloudfoundry/jibber_jabber v0.0.0-20151120183258-bcc4c8345a21 h1:tuijfIjZyjZaHq9xDUh0tNitwXshJpbLkqMOJv4H3do=
|
||||
github.com/cloudfoundry/jibber_jabber v0.0.0-20151120183258-bcc4c8345a21/go.mod h1:po7NpZ/QiTKzBKyrsEAxwnTamCoh8uDk/egRpQ7siIc=
|
||||
github.com/cpuguy83/go-md2man v1.0.4 h1:OwjhDpK9YGCcI5CDf8HcdfsXqr6znFyAJfuZ27ixJsc=
|
||||
github.com/clusterhq/flocker-go v0.0.0-20160920122132-2b8b7259d313/go.mod h1:P1wt9Z3DP8O6W3rvwCt0REIlshg1InHImaLW0t3ObY0=
|
||||
github.com/codedellemc/goscaleio v0.0.0-20170830184815-20e2ce2cf885/go.mod h1:JIHmDHNZO4tmA3y3RHp6+Gap6kFsNf55W9Pn/3YS9IY=
|
||||
github.com/codegangsta/negroni v1.0.0/go.mod h1:v0y3T5G7Y1UlFfyxFn/QLRU4a2EuNau2iZY63YTKWo0=
|
||||
github.com/container-storage-interface/spec v1.1.0/go.mod h1:6URME8mwIBbpVyZV93Ce5St17xBiQJQY67NDsuohiy4=
|
||||
github.com/containerd/console v0.0.0-20170925154832-84eeaae905fa/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw=
|
||||
github.com/containerd/containerd v1.0.2/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA=
|
||||
github.com/containerd/typeurl v0.0.0-20190228175220-2a93cfde8c20/go.mod h1:Cm3kwCdlkCfMSHURc+r6fwoGH6/F1hH3S4sg0rLFWPc=
|
||||
github.com/containernetworking/cni v0.6.0/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY=
|
||||
github.com/coreos/bbolt v1.3.1-coreos.6/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk=
|
||||
github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
|
||||
github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
|
||||
github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk=
|
||||
github.com/coreos/go-oidc v0.0.0-20180117170138-065b426bd416/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc=
|
||||
github.com/coreos/go-semver v0.0.0-20180108230905-e214231b295a/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
|
||||
github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
|
||||
github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
|
||||
github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
|
||||
github.com/coreos/go-systemd v0.0.0-20181012123002-c6f51f82210d/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
|
||||
github.com/coreos/pkg v0.0.0-20180108230652-97fdf19511ea/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
|
||||
github.com/coreos/rkt v1.30.0/go.mod h1:O634mlH6U7qk87poQifK6M2rsFNt+FyUTWNMnP1hF1U=
|
||||
github.com/cpuguy83/go-md2man v1.0.4/go.mod h1:N6JayAiVKtlHSnuTCeuLSQVs75hb8q+dYQLjr7cDsKY=
|
||||
github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8=
|
||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/cpuguy83/go-md2man v1.0.10 h1:BSKMNlYxDvnunlTymqtgONjNnaRV1sTpcovwwjF22jk=
|
||||
github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE=
|
||||
github.com/cyphar/filepath-securejoin v0.0.0-20170720062807-ae69057f2299/go.mod h1:FpkQEhXnPnOthhzymB7CGsFk2G9VLXONKD9G7QGMM+4=
|
||||
github.com/d2g/dhcp4 v0.0.0-20170904100407-a1d1b6c41b1c/go.mod h1:Ct2BUK8SB0YC1SMSibvLzxjeJLnrYEVLULFNiHY9YfQ=
|
||||
github.com/d2g/dhcp4client v0.0.0-20170829104524-6e570ed0a266/go.mod h1:j0hNfjhrt2SxUOw55nL0ATM/z4Yt3t2Kd1mW34z5W5s=
|
||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/docker/distribution v2.7.1+incompatible h1:a5mlkVzth6W5A4fOsS3D2EO5BUmsJpcB+cRlLU7cSug=
|
||||
github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w=
|
||||
github.com/docker/docker v0.0.0-20180531152204-71cd53e4a197 h1:raQhUHOMIAZAWHmo3hLEwoIy0aVkKb2uxZdWw/Up+HI=
|
||||
github.com/docker/docker v0.0.0-20180531152204-71cd53e4a197/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
|
||||
github.com/daviddengcn/go-colortext v0.0.0-20160507010035-511bcaf42ccd/go.mod h1:dv4zxwHi5C/8AeI+4gX4dCWOIvNi7I6JCSX0HvlKPgE=
|
||||
github.com/dgrijalva/jwt-go v0.0.0-20160705203006-01aeca54ebda/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
|
||||
github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E=
|
||||
github.com/docker/distribution v0.0.0-20170726174610-edc3ab29cdff/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w=
|
||||
github.com/docker/docker v0.7.3-0.20190327010347-be7ac8be2ae0/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
|
||||
github.com/docker/docker v1.13.1 h1:IkZjBSIc8hBjLpqeAbeE5mca5mNgeatLHBy3GO78BWo=
|
||||
github.com/docker/docker v1.13.1/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
|
||||
github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ=
|
||||
github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec=
|
||||
github.com/docker/go-units v0.0.0-20170127094116-9e638d38cf69 h1:N4WAsrRIb+4U1yIwJO3FMrLnrr61ael894nygpViQTU=
|
||||
github.com/docker/go-units v0.0.0-20170127094116-9e638d38cf69/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
|
||||
github.com/docker/machine v0.16.1 h1:zrgroZounGVkxLmBqMyc1uT2GgapXVjIWHCfBf0udrA=
|
||||
github.com/docker/machine v0.16.1/go.mod h1:I8mPNDeK1uH+JTcUU7X0ZW8KiYz0jyAgNaeSJ1rCfDI=
|
||||
github.com/docker/go-connections v0.3.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec=
|
||||
github.com/docker/go-units v0.3.3 h1:Xk8S3Xj5sLGlG5g67hJmYMmUgXv5N4PhkjJHHqrwnTk=
|
||||
github.com/docker/go-units v0.3.3/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
|
||||
github.com/docker/libnetwork v0.0.0-20180830151422-a9cd636e3789/go.mod h1:93m0aTqz6z+g32wla4l4WxTrdtvBRmVzYRkYvasA5Z8=
|
||||
github.com/docker/machine v0.16.1-0.20190718054102-a555e4f7a8f5 h1:5OiV/JwT55JRKNJsM9HZrTlJH/TRp97Ee89ahtB78+w=
|
||||
github.com/docker/machine v0.16.1-0.20190718054102-a555e4f7a8f5/go.mod h1:I8mPNDeK1uH+JTcUU7X0ZW8KiYz0jyAgNaeSJ1rCfDI=
|
||||
github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96 h1:cenwrSVm+Z7QLSV/BsnenAOcDXdX4cMv4wP0B/5QbPg=
|
||||
github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM=
|
||||
github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
|
||||
github.com/elazarl/goproxy v0.0.0-20170405201442-c4fc26588b6e/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc=
|
||||
github.com/elazarl/goproxy v0.0.0-20190421051319-9d40249d3c2f h1:8GDPb0tCY8LQ+OJ3dbHb5sA6YZWXFORQYZx5sdsTlMs=
|
||||
github.com/elazarl/goproxy v0.0.0-20190421051319-9d40249d3c2f/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc=
|
||||
github.com/elazarl/goproxy/ext v0.0.0-20190421051319-9d40249d3c2f h1:AUj1VoZUfhPhOPHULCQQDnGhRelpFWHMLhQVWDsS0v4=
|
||||
github.com/elazarl/goproxy/ext v0.0.0-20190421051319-9d40249d3c2f/go.mod h1:gNh8nYJoAm43RfaxurUnxr+N1PwuFV3ZMl/efxlIlY8=
|
||||
github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs=
|
||||
github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs=
|
||||
github.com/euank/go-kmsg-parser v2.0.0+incompatible/go.mod h1:MhmAMZ8V4CYH4ybgdRwPr2TU5ThnS43puaKEMpja1uw=
|
||||
github.com/evanphx/json-patch v0.0.0-20190203023257-5858425f7550/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=
|
||||
github.com/evanphx/json-patch v4.2.0+incompatible h1:fUDGZCv/7iAN7u0puUVhvKCcsR6vRfwrJatElLBEf0I=
|
||||
github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=
|
||||
github.com/exponent-io/jsonpath v0.0.0-20151013193312-d6023ce2651d/go.mod h1:ZZMPRZwes7CROmyNKgQzC3XPs6L/G2EJLHddWejkmf4=
|
||||
github.com/fatih/camelcase v0.0.0-20160318181535-f6a740d52f96/go.mod h1:yN2Sb0lFhZJUdVvtELVWefmrXpuZESvPmqwoZc+/fpc=
|
||||
github.com/fatih/color v1.7.0 h1:DkWD4oS2D8LGGgTQ6IvwJJXSL5Vp2ffcQg58nFV38Ys=
|
||||
github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
|
||||
github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc=
|
||||
github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I=
|
||||
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
|
||||
github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680 h1:ZktWZesgun21uEDrwW7iEV1zPCGQldM2atlJZ3TdvVM=
|
||||
github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
|
||||
github.com/gogo/protobuf v0.0.0-20170330071051-c0656edd0d9e h1:ago6fNuQ6IhszPsXkeU7qRCyfsIX7L67WDybsAPkLl8=
|
||||
github.com/gogo/protobuf v0.0.0-20170330071051-c0656edd0d9e/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
|
||||
github.com/ghodss/yaml v0.0.0-20180820084758-c7ce16629ff4/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
|
||||
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
|
||||
github.com/gliderlabs/ssh v0.1.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0=
|
||||
github.com/globalsign/mgo v0.0.0-20180905125535-1ca0a4f7cbcb/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q=
|
||||
github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q=
|
||||
github.com/go-ole/go-ole v1.2.4 h1:nNBDSCOigTSiarFpYE9J/KtEA1IOW4CNeqT9TQDqCxI=
|
||||
github.com/go-ole/go-ole v1.2.4/go.mod h1:XCwSNxSkXRo4vlyPy93sltvi/qJq0jqQhjqQNIwKuxM=
|
||||
github.com/go-openapi/analysis v0.0.0-20180825180245-b006789cd277/go.mod h1:k70tL6pCuVxPJOHXQ+wIac1FUrvNkHolPie/cLEU6hI=
|
||||
github.com/go-openapi/analysis v0.17.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik=
|
||||
github.com/go-openapi/analysis v0.17.2/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik=
|
||||
github.com/go-openapi/errors v0.17.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0=
|
||||
github.com/go-openapi/errors v0.17.2/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0=
|
||||
github.com/go-openapi/jsonpointer v0.17.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M=
|
||||
github.com/go-openapi/jsonpointer v0.19.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M=
|
||||
github.com/go-openapi/jsonreference v0.17.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I=
|
||||
github.com/go-openapi/jsonreference v0.19.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I=
|
||||
github.com/go-openapi/loads v0.17.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU=
|
||||
github.com/go-openapi/loads v0.17.2/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU=
|
||||
github.com/go-openapi/runtime v0.0.0-20180920151709-4f900dc2ade9/go.mod h1:6v9a6LTXWQCdL8k1AO3cvqx5OtZY/Y9wKTgaoP6YRfA=
|
||||
github.com/go-openapi/runtime v0.17.2/go.mod h1:QO936ZXeisByFmZEO1IS1Dqhtf4QV1sYYFtIq6Ld86Q=
|
||||
github.com/go-openapi/spec v0.17.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI=
|
||||
github.com/go-openapi/spec v0.17.2/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI=
|
||||
github.com/go-openapi/strfmt v0.17.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU=
|
||||
github.com/go-openapi/swag v0.17.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg=
|
||||
github.com/go-openapi/swag v0.17.2/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg=
|
||||
github.com/go-openapi/validate v0.17.0/go.mod h1:Uh4HdOzKt19xGIGm1qHf/ofbX1YQ4Y+MYsct2VUrAJ4=
|
||||
github.com/go-openapi/validate v0.18.0/go.mod h1:Uh4HdOzKt19xGIGm1qHf/ofbX1YQ4Y+MYsct2VUrAJ4=
|
||||
github.com/go-ozzo/ozzo-validation v3.5.0+incompatible/go.mod h1:gsEKFIVnabGBt6mXmxK0MoFy+cZoTJY6mu5Ll3LVLBU=
|
||||
github.com/godbus/dbus v0.0.0-20151105175453-c7fdd8b5cd55/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw=
|
||||
github.com/gogo/protobuf v0.0.0-20171007142547-342cbe0a0415 h1:WSBJMqJbLxsn+bTCPyPYZfqHdJmc8MK4wrBjMft6BAM=
|
||||
github.com/gogo/protobuf v0.0.0-20171007142547-342cbe0a0415/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
|
||||
github.com/gogo/protobuf v1.1.1 h1:72R+M5VuhED/KujmZVcIquuo8mBgX4oVda//DQb3PXo=
|
||||
github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
|
||||
github.com/golang-collections/collections v0.0.0-20130729185459-604e922904d3 h1:zN2lZNZRflqFyxVaTIU61KNKQ9C0055u9CAfpmqUvo4=
|
||||
github.com/golang-collections/collections v0.0.0-20130729185459-604e922904d3/go.mod h1:nPpo7qLxd6XL3hWJG/O60sR8ZKfMCiIoNap5GvD12KU=
|
||||
github.com/golang/glog v0.0.0-20141105023935-44145f04b68c h1:CbdkBQ1/PiAo0FYJhQGwASD8wrgNvTdf01g6+O9tNuA=
|
||||
github.com/golang/glog v0.0.0-20141105023935-44145f04b68c/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
|
||||
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58=
|
||||
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
|
||||
github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903 h1:LbsanbbD6LieFkXbj9YNNBupiGHJgFeLpO0j0Fza1h8=
|
||||
github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
||||
github.com/golang/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:tluoj9z5200jBnyusfRPU2LqT6J+DAorxEvtC7LHB+E=
|
||||
github.com/golang/mock v0.0.0-20160127222235-bd3c8e81be01/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
|
||||
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
|
||||
github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
|
||||
github.com/golang/protobuf v1.2.0 h1:P3YflyNX/ehuJFLhxviNdFxQPkGK5cDcApsge1SqnvM=
|
||||
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||
github.com/google/btree v1.0.0 h1:0udJVsspx3VBr5FwtLhQQtuAsVc79tTq0ocGIPAU6qo=
|
||||
github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
|
||||
github.com/google/go-cmp v0.2.0 h1:+dTQ8DZQJz0Mb/HjFlkptS1FeQ4cWSnN941F8aEG4SQ=
|
||||
github.com/golangplus/bytes v0.0.0-20160111154220-45c989fe5450/go.mod h1:Bk6SMAONeMXrxql8uvOKuAZSu8aM5RUGv+1C6IJaEho=
|
||||
github.com/golangplus/fmt v0.0.0-20150411045040-2a5d6d7d2995/go.mod h1:lJgMEyOkYFkPcDKwRXegd+iM6E7matEszMG5HhwytU8=
|
||||
github.com/golangplus/testing v0.0.0-20180327235837-af21d9c3145e/go.mod h1:0AA//k/eakGydO4jKRoRL2j92ZKSzTgj9tclaCrvXHk=
|
||||
github.com/google/btree v0.0.0-20160524151835-7d79101e329e/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
|
||||
github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
|
||||
github.com/google/cadvisor v0.33.2-0.20190411163913-9db8c7dee20a/go.mod h1:1nql6U13uTHaLYB8rLS5x9IJc2qT6Xd/Tr1sTX6NE48=
|
||||
github.com/google/certificate-transparency-go v1.0.21/go.mod h1:QeJfpSbVSfYc7RgB3gJFj9cbuQMMchQxrWXz8Ruopmg=
|
||||
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
|
||||
github.com/google/go-cmp v0.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY=
|
||||
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
||||
github.com/google/go-containerregistry v0.0.0-20190318164241-019cdfc6adf9 h1:YVdfjqpMrLPm95Jc5JBFaEeGoPfhFxr43VW/UHQ2NVo=
|
||||
github.com/google/go-containerregistry v0.0.0-20190318164241-019cdfc6adf9/go.mod h1:yZAFP63pRshzrEYLXLGPmUt0Ay+2zdjmMN1loCnRLUk=
|
||||
github.com/google/go-containerregistry v0.0.0-20190729175742-ef12d49c8daf h1:Wl/OmLiz1KZOQiAYUcttxkW01NbwzUGWy+whD7R58IQ=
|
||||
github.com/google/go-containerregistry v0.0.0-20190729175742-ef12d49c8daf/go.mod h1:yZAFP63pRshzrEYLXLGPmUt0Ay+2zdjmMN1loCnRLUk=
|
||||
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/v25 v25.0.2 h1:MqXE7nOlIF91NJ/PXAcvS2dC+XXCDbY7RvJzjyEPAoU=
|
||||
github.com/google/go-github/v25 v25.0.2/go.mod h1:6z5pC69qHtrPJ0sXPsj4BLnd82b+r6sLB7qcBoRZqpw=
|
||||
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 h1:ScAXWS+TR6MZKex+7Z8rneuSJH+FSDqd6ocQyl+ZHo4=
|
||||
github.com/google/gofuzz v0.0.0-20161122191042-44d81051d367/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI=
|
||||
github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI=
|
||||
github.com/google/gofuzz v1.0.0 h1:A8PeW59pxE9IoFRqBp37U+mSNaQoZ46F1f0f863XSXw=
|
||||
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
|
||||
github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
|
||||
github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
|
||||
github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||
github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY=
|
||||
github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||
github.com/googleapis/gax-go v2.0.0+incompatible h1:j0GKcs05QVmm7yesiZq2+9cxHkNK9YM6zKx4D2qucQU=
|
||||
github.com/googleapis/gax-go v2.0.0+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY=
|
||||
github.com/googleapis/gax-go/v2 v2.0.3 h1:siORttZ36U2R/WjiJuDz8znElWBiAlO9rVt+mqJt0Cc=
|
||||
github.com/googleapis/gax-go/v2 v2.0.3/go.mod h1:LLvjysVCY1JZeum8Z6l8qUty8fiNwE08qbEPm1M08qg=
|
||||
github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d h1:7XGaL1e6bYS1yIonGp9761ExpPPV1ui0SAC59Yube9k=
|
||||
github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY=
|
||||
github.com/gophercloud/gophercloud v0.0.0-20190126172459-c818fa66e4c8/go.mod h1:3WdhXV3rUYy9p6AUW8d94kr+HS62Y4VL9mBnFxsD8q4=
|
||||
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
|
||||
github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg=
|
||||
github.com/gorilla/mux v1.7.0/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
|
||||
github.com/gorilla/mux v1.7.1 h1:Dw4jY2nghMMRsh1ol8dv1axHkDwMQK2DHerMNJsIpJU=
|
||||
github.com/gorilla/mux v1.7.1/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
|
||||
github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7 h1:pdN6V1QBWetyv/0+wjACpqVH+eVULgEjkurDLq3goeM=
|
||||
github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
|
||||
github.com/gregjones/httpcache v0.0.0-20170728041850-787624de3eb7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA=
|
||||
github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA=
|
||||
github.com/grpc-ecosystem/go-grpc-middleware v0.0.0-20190222133341-cfaf5686ec79/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
|
||||
github.com/grpc-ecosystem/go-grpc-prometheus v0.0.0-20170330212424-2500245aa611/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=
|
||||
github.com/grpc-ecosystem/grpc-gateway v1.3.0/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw=
|
||||
github.com/grpc-ecosystem/grpc-gateway v1.5.0/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw=
|
||||
github.com/hashicorp/errwrap v0.0.0-20141028054710-7554cd9344ce h1:prjrVgOk2Yg6w+PflHoszQNLTUh4kaByUcEWM/9uin4=
|
||||
github.com/hashicorp/errwrap v0.0.0-20141028054710-7554cd9344ce/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
|
||||
github.com/hashicorp/go-cleanhttp v0.5.0 h1:wvCrVc9TjDls6+YGAF2hAifE1E5U1+b4tH6KdvN3Gig=
|
||||
github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
|
||||
github.com/hashicorp/go-getter v1.3.0 h1:pFMSFlI9l5NaeuzkpE3L7BYk9qQ9juTAgXW/H0cqxcU=
|
||||
github.com/hashicorp/go-getter v1.3.0/go.mod h1:/O1k/AizTN0QmfEKknCYGvICeyKUDqCYA8vvWtGWDeQ=
|
||||
github.com/hashicorp/go-multierror v0.0.0-20160811015721-8c5f0ad93604 h1:VIq8E7fMiC4h3agg0ya56L0jHn7QisZZcWZXVKJb9jQ=
|
||||
github.com/hashicorp/go-multierror v0.0.0-20160811015721-8c5f0ad93604/go.mod h1:JMRHfdO9jKNzS/+BTlxCjKNQHg/jZAft8U7LloJvN7I=
|
||||
github.com/hashicorp/go-retryablehttp v0.5.4 h1:1BZvpawXoJCWX6pNtow9+rpEj+3itIlutiqnntI6jOE=
|
||||
github.com/hashicorp/go-retryablehttp v0.5.4/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs=
|
||||
github.com/hashicorp/go-safetemp v1.0.0 h1:2HR189eFNrjHQyENnQMMpCiBAsRxzbTMIgBhEyExpmo=
|
||||
github.com/hashicorp/go-safetemp v1.0.0/go.mod h1:oaerMy3BhqiTbVye6QuFhFtIceqFoDHxNAB65b+Rj1I=
|
||||
github.com/hashicorp/go-version v1.1.0 h1:bPIoEKD27tNdebFGGxxYwcL4nepeY4j1QP23PFRGzg0=
|
||||
github.com/hashicorp/go-version v1.1.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=
|
||||
github.com/hashicorp/golang-lru v0.0.0-20160207214719-a0d98a5f2880 h1:OaRuzt9oCKNui8cCskZijoKUwe+aCuuCwvx1ox8FNyw=
|
||||
github.com/hashicorp/golang-lru v0.0.0-20160207214719-a0d98a5f2880/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
|
||||
github.com/hashicorp/hcl v0.0.0-20160711231752-d8c773c4cba1 h1:9j16AiR0R5hDbDBMzfUfIP9CUbbw6T8nYN4iZz3/wjg=
|
||||
github.com/hashicorp/golang-lru v0.5.0 h1:CL2msUPvZTLb5O648aiLNJw3hnBxN2+1Jq8rCOH9wdo=
|
||||
github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
|
||||
github.com/hashicorp/hcl v0.0.0-20160711231752-d8c773c4cba1/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 v0.0.0-20181109135656-558b29266ce0/go.mod h1:bB9ly3RchcQqsQ9CpyaQwvva7RS5ytVoSoholZQON6o=
|
||||
github.com/heketi/rest v0.0.0-20180404230133-aa6a65207413/go.mod h1:BeS3M108VzVlmAue3lv2WcGuPAX94/KN63MUURzbYSI=
|
||||
github.com/heketi/tests v0.0.0-20151005000721-f3775cbcefd6/go.mod h1:xGMAM8JLi7UkZt1i4FQeQy0R2T8GLUwQhOP5M1gBhy4=
|
||||
github.com/heketi/utils v0.0.0-20170317161834-435bc5bdfa64/go.mod h1:RYlF4ghFZPPmk2TC5REt5OFwvfb6lzxFWrTWB+qs28s=
|
||||
github.com/hooklift/assert v0.0.0-20170704181755-9d1defd6d214 h1:WgfvpuKg42WVLkxNwzfFraXkTXPK36bMqXvMFN67clI=
|
||||
github.com/hooklift/assert v0.0.0-20170704181755-9d1defd6d214/go.mod h1:kj6hFWqfwSjFjLnYW5PK1DoxZ4O0uapwHRmd9jhln4E=
|
||||
github.com/hooklift/iso9660 v0.0.0-20170318115843-1cf07e5970d8 h1:ARl0RuGZTqBOMXQIfXen0twVSJ8kMojd7ThJf4EBcrc=
|
||||
github.com/hooklift/iso9660 v0.0.0-20170318115843-1cf07e5970d8/go.mod h1:sOC47ru8lB0DlU0EZ7BJ0KCP5rDqOvx0c/5K5ADm8H0=
|
||||
github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI=
|
||||
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
|
||||
github.com/imdario/mergo v0.0.0-20141206190957-6633656539c1 h1:FeeCi0I2Fu8kA8IXrdVPtGzym+mW9bzfj9f26EaES9k=
|
||||
github.com/imdario/mergo v0.0.0-20141206190957-6633656539c1/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
|
||||
github.com/imdario/mergo v0.3.5 h1:JboBksRwiiAJWvIYJVo46AfV+IAIKZpfrSzVKj42R4Q=
|
||||
github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
|
||||
github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM=
|
||||
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
|
||||
github.com/intel-go/cpuid v0.0.0-20181003105527-1a4a6f06a1c6 h1:XboatR7lasl05yel5hNXF7kQBw2oFUGdMztcgisfhNU=
|
||||
github.com/intel-go/cpuid v0.0.0-20181003105527-1a4a6f06a1c6/go.mod h1:RmeVYf9XrPRbRc3XIx0gLYA8qOFvNoPOfaEZduRlEp4=
|
||||
github.com/jellevandenhooff/dkim v0.0.0-20150330215556-f50fe3d243e1/go.mod h1:E0B/fFc00Y+Rasa88328GlI/XbtyysCtTHZS8h7IrBU=
|
||||
github.com/jimmidyson/go-download v0.0.0-20161028105827-7f9a90c8c95b h1:3TknJxYSK1eDe21QorC3C2Yz8jylk6vlJG9YABnFzkU=
|
||||
github.com/jimmidyson/go-download v0.0.0-20161028105827-7f9a90c8c95b/go.mod h1:I3WsAhNNoG7a/d8HMlYUywJJlfOs/+/83NEUjuDp4lc=
|
||||
github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=
|
||||
github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af h1:pmfjZENx5imkbgOkpRUYLnmbU7UEFbjtDA2hxJ1ichM=
|
||||
github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=
|
||||
github.com/johanneswuerbach/nfsexports v0.0.0-20181204082207-1aa528dcb345 h1:XP1VL9iOZu4yz/rq8zj+yvB23XEY5erXRzp8JYmkWu0=
|
||||
github.com/johanneswuerbach/nfsexports v0.0.0-20181204082207-1aa528dcb345/go.mod h1:+c1/kUpg2zlkoWqTOvzDs36Wpbm3Gd1nlmtXAEB0WGU=
|
||||
github.com/json-iterator/go v1.1.5 h1:gL2yXlmiIo4+t+y32d4WGwOjKGYcGOuyrg46vadswDE=
|
||||
github.com/json-iterator/go v1.1.5/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
|
||||
github.com/jonboulle/clockwork v0.0.0-20141017032234-72f9bd7c4e0c/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=
|
||||
github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=
|
||||
github.com/json-iterator/go v0.0.0-20180701071628-ab8a2e0c74be/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
|
||||
github.com/json-iterator/go v1.1.6 h1:MrUvLMLTMxbqFJ9kzlvat/rYZqZnW3u4wkLzWTaFwKs=
|
||||
github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
|
||||
github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
|
||||
github.com/jteeuwen/go-bindata v0.0.0-20151023091102-a0ff2567cfb7/go.mod h1:JVvhzYOiGBnFSYRyV00iY8q7/0PThjIYav1p9h5dmKs=
|
||||
github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
|
||||
github.com/kardianos/osext v0.0.0-20150410034420-8fef92e41e22/go.mod h1:1NbS8ALrpOvjt0rHPNLyCIeMtbizbir8U//inJ+zuB8=
|
||||
github.com/karrick/godirwalk v1.7.5/go.mod h1:2c9FRhkDxdIbgkOnCEvnSWs71Bhugbl46shStcFDJ34=
|
||||
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
|
||||
github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk=
|
||||
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
||||
github.com/kr/fs v0.0.0-20131111012553-2788f0dbd169 h1:YUrU1/jxRqnt0PSrKj1Uj/wEjk/fjnE80QFfi2Zlj7Q=
|
||||
github.com/kr/fs v0.0.0-20131111012553-2788f0dbd169/go.mod h1:glhvuHOU9Hy7/8PwwdtnarXqLagOX0b/TbZx2zLMqEg=
|
||||
github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
|
||||
github.com/kr/pretty v0.0.0-20140812000539-f31442d60e51/go.mod h1:Bvhd+E3laJ0AVkG0c9rmtZcnhV0HQ3+c3YxxqTvc/gA=
|
||||
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
|
||||
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
||||
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
|
||||
github.com/kr/pty v1.1.3/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
||||
github.com/kr/text v0.0.0-20130911015532-6807e777504f/go.mod h1:sjUstKUATFIcff4qlB53Kml0wQPtJVc/3fWrmuUmcfA=
|
||||
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
||||
github.com/libopenstorage/openstorage v0.0.0-20170906232338-093a0c388875/go.mod h1:Sp1sIObHjat1BeXhfMqLZ14wnOzEhNx2YQedreMcUyc=
|
||||
github.com/libvirt/libvirt-go v3.4.0+incompatible h1:Cpyalgj1x8JIeTlL6SDYZBo7j8nY3+5XHqmi8DaunCk=
|
||||
github.com/libvirt/libvirt-go v3.4.0+incompatible/go.mod h1:34zsnB4iGeOv7Byj6qotuW8Ya4v4Tr43ttjz/F0wjLE=
|
||||
github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de/go.mod h1:zAbeS9B/r2mtpb6U+EI2rYA5OAXxsYw6wTamcNW+zcE=
|
||||
github.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z9BP0jIOc=
|
||||
github.com/lpabon/godbc v0.1.1/go.mod h1:Jo9QV0cf3U6jZABgiJ2skINAXb9j8m51r07g4KI92ZA=
|
||||
github.com/machine-drivers/docker-machine-driver-vmware v0.1.1 h1:+E1IKKk+6kaQrCPg6edJZ/zISZijuZTPnzy6RE4C/Ho=
|
||||
github.com/machine-drivers/docker-machine-driver-vmware v0.1.1/go.mod h1:ej014C83EmSnxJeJ8PtVb8OLJ91PJKO1Q8Y7sM5CK0o=
|
||||
github.com/magiconair/properties v0.0.0-20160816085511-61b492c03cf4 h1:YVH4JcnWs1z/qQ2Dg5BnGGQL8PcUOO97Sb5w7RyuBl4=
|
||||
github.com/magiconair/properties v0.0.0-20160816085511-61b492c03cf4/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
|
||||
github.com/magiconair/properties v1.8.0 h1:LLgXmsheXeRoUOBOjtwPQCWIYqM/LU1ayDtDePerRcY=
|
||||
github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
|
||||
github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
|
||||
github.com/marstr/guid v0.0.0-20170427235115-8bdf7d1a087c/go.mod h1:74gB1z2wpxxInTG6yaqA7KrtM0NZ+RbrcqDvYHefzho=
|
||||
github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
|
||||
github.com/mattn/go-colorable v0.1.1 h1:G1f5SKeVxmagw/IyvzvtZE4Gybcc4Tr1tf7I8z0XgOg=
|
||||
github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ=
|
||||
github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
|
||||
github.com/mattn/go-isatty v0.0.5 h1:tHXDdz1cpzGaovsTB+TVB8q90WEokoVmfMqoVcrLUgw=
|
||||
github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
|
||||
github.com/mattn/go-runewidth v0.0.0-20161012013512-737072b4e32b h1:idzeyUe3K4aU/SIZWMykIkJJyTD7CgDkxUQEjV07fno=
|
||||
github.com/mattn/go-runewidth v0.0.0-20161012013512-737072b4e32b/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
|
||||
github.com/mattn/go-runewidth v0.0.4 h1:2BvfKmzob6Bmd4YsL0zygOqfdFnK7GR4QL06Do4/p7Y=
|
||||
github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
|
||||
github.com/mattn/go-shellwords v0.0.0-20180605041737-f8471b0a71de/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o=
|
||||
github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU=
|
||||
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
|
||||
github.com/mesos/mesos-go v0.0.9/go.mod h1:kPYCMQ9gsOXVAle1OsoY4I1+9kPu8GHkf88aV59fDr4=
|
||||
github.com/mholt/caddy v0.0.0-20180213163048-2de495001514/go.mod h1:Wb1PlT4DAYSqOEd03MsqkdkXnTxA8v9pKjdpxbqM1kY=
|
||||
github.com/microcosm-cc/bluemonday v1.0.1/go.mod h1:hsXNsILzKxV+sX77C5b8FSuKF00vh2OMYv+xgHpAMF4=
|
||||
github.com/miekg/dns v0.0.0-20160614162101-5d001d020961 h1:vX2vkMipgQZ8gfmAsFeZdcgmhHoB7jMo6chAtajG3AI=
|
||||
github.com/miekg/dns v0.0.0-20160614162101-5d001d020961/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
|
||||
github.com/mindprince/gonvml v0.0.0-20171110221305-fee913ce8fb2/go.mod h1:2eu9pRWp8mo84xCg6KswZ+USQHjwgRhNp06sozOdsTY=
|
||||
github.com/mistifyio/go-zfs v0.0.0-20151009155749-1b4ae6fb4e77/go.mod h1:8AuVvqP/mXw1px98n46wfvcGfQ4ci2FwoAjKYxuo3Z4=
|
||||
github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
|
||||
github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=
|
||||
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
|
||||
github.com/mitchellh/go-ps v0.0.0-20170309133038-4fdf99ab2936 h1:kw1v0NlnN+GZcU8Ma8CLF2Zzgjfx95gs3/GN3vYAPpo=
|
||||
github.com/mitchellh/go-ps v0.0.0-20170309133038-4fdf99ab2936/go.mod h1:r1VsdOzOPt1ZSrGZWFoNhsAedKnEd6r9Np1+5blZCWk=
|
||||
github.com/mitchellh/mapstructure v0.0.0-20170307201123-53818660ed49 h1:kaWdlw4YogwkDl8CG+/VxhXkrL9uz3n1D9QBC2pEGLE=
|
||||
github.com/mitchellh/mapstructure v0.0.0-20170307201123-53818660ed49/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
|
||||
github.com/mitchellh/go-testing-interface v1.0.0 h1:fzU/JVNcaqHQEcVFAKeR41fkiLdIPrefOvVG1VZ96U0=
|
||||
github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI=
|
||||
github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=
|
||||
github.com/mitchellh/go-wordwrap v1.0.0 h1:6GlHJ/LTGMrIJbwgdqdl2eEH8o+Exx/0m8ir9Gns0u4=
|
||||
github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=
|
||||
github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE=
|
||||
github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
|
||||
github.com/moby/hyperkit v0.0.0-20171020124204-a12cd7250bcd h1:WDG9l//UGcGx4lqqEDY23+mRnQMKFY+8LD83OxQllRk=
|
||||
github.com/moby/hyperkit v0.0.0-20171020124204-a12cd7250bcd/go.mod h1:zGAVB/FkAf4ozkR8CCuj4LcVuErrNsj9APTDFvhOckw=
|
||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
|
||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
|
||||
github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742 h1:Esafd1046DLDQ0W1YjYsBW+p8U2u7vzgW2SQVmlNazg=
|
||||
github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
|
||||
github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI=
|
||||
github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
|
||||
github.com/mohae/deepcopy v0.0.0-20170603005431-491d3605edfb/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8=
|
||||
github.com/morikuni/aec v0.0.0-20170113033406-39771216ff4c/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc=
|
||||
github.com/mrunalp/fileutils v0.0.0-20160930181131-4ee1cc9a8058/go.mod h1:x8F1gnqOkIEiO4rqoeEEEqQbo7HjGMTvyoq3gej4iT0=
|
||||
github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
|
||||
github.com/mvdan/xurls v0.0.0-20160110113200-1b768d7c393a/go.mod h1:tQlNn3BED8bE/15hnSL2HLkDeLWpNPAwtw7wkEq44oU=
|
||||
github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw=
|
||||
github.com/natefinch/lumberjack v2.0.0+incompatible/go.mod h1:Wi9p2TTF5DG5oU+6YfsmYQpsTIOm0B1VNzQg9Mw6nPk=
|
||||
github.com/neelance/astrewrite v0.0.0-20160511093645-99348263ae86/go.mod h1:kHJEU3ofeGjhHklVoIGuVj85JJwZ6kWPaJwCIxgnFmo=
|
||||
github.com/neelance/sourcemap v0.0.0-20151028013722-8c68805598ab/go.mod h1:Qr6/a/Q4r9LP1IltGz7tA7iOK1WonHEYhu1HRBA7ZiM=
|
||||
github.com/olekukonko/tablewriter v0.0.0-20160923125401-bdcc175572fd h1:nEatQ6JnwCT9iYD5uqYUiFqq8tJGX25to8KVKXqya7k=
|
||||
github.com/olekukonko/tablewriter v0.0.0-20160923125401-bdcc175572fd/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo=
|
||||
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
||||
github.com/onsi/ginkgo v1.8.0 h1:VkHVNpR4iVnU8XQR6DBm8BqYjN7CRzw+xKUbVVbbW9w=
|
||||
github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
||||
github.com/onsi/gomega v0.0.0-20190113212917-5533ce8a0da3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
|
||||
github.com/onsi/gomega v1.5.0 h1:izbySO9zDPmjJ8rDjLvkA2zJHIo+HkYXHnf7eN7SSyo=
|
||||
github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
|
||||
github.com/opencontainers/go-digest v1.0.0-rc1 h1:WzifXhOVOEOuFYOJAW6aQqW0TooG2iki3E3Ii+WN7gQ=
|
||||
github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s=
|
||||
github.com/opencontainers/image-spec v1.0.1 h1:JMemWkRwHx4Zj+fVxWoMCFm/8sYGGrUVojFA6h/TRcI=
|
||||
github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0=
|
||||
github.com/pborman/uuid v0.0.0-20150603214016-ca53cad383ca h1:dKRMHfduZ/ZqOHuYGk/0kkTIUbnyorkAfzLOp6Ts8pU=
|
||||
github.com/pborman/uuid v0.0.0-20150603214016-ca53cad383ca/go.mod h1:VyrYX9gd7irzKovcSS6BIIEwPRkP2Wm2m9ufcdFSJ34=
|
||||
github.com/pelletier/go-buffruneio v0.1.0 h1:ig6N9Cg71k/P+UUbhwdOFtJWz+qa8/3by7AzMprMWBM=
|
||||
github.com/pelletier/go-buffruneio v0.1.0/go.mod h1:JkE26KsDizTr40EUHkXVtNPvgGtbSNq5BcowyYOWdKo=
|
||||
github.com/pelletier/go-toml v0.0.0-20160822122712-0049ab3dc4c4 h1:tMVXZ04h5CqgTvMyA8IL1b9xlJz7G+mTcCsYi3WXRtA=
|
||||
github.com/pelletier/go-toml v0.0.0-20160822122712-0049ab3dc4c4/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
|
||||
github.com/peterbourgon/diskv v2.0.1+incompatible h1:UBdAOUP5p4RWqPBg048CAvpKN+vxiaj6gdUUzhl4XmI=
|
||||
github.com/opencontainers/go-digest v0.0.0-20170106003457-a6d0ee40d420/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s=
|
||||
github.com/opencontainers/image-spec v0.0.0-20170604055404-372ad780f634/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0=
|
||||
github.com/opencontainers/runc v0.0.0-20181113202123-f000fe11ece1/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U=
|
||||
github.com/opencontainers/runtime-spec v1.0.0/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=
|
||||
github.com/opencontainers/selinux v0.0.0-20170621221121-4a2974bf1ee9/go.mod h1:+BLncwf63G4dgOzykXAxcmnFlUaOlkDdmw/CqsW6pjs=
|
||||
github.com/openzipkin/zipkin-go v0.1.1/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8=
|
||||
github.com/pborman/uuid v1.2.0 h1:J7Q5mO4ysT1dv8hyrUGHb9+ooztCXu1D8MY8DZYsu3g=
|
||||
github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k=
|
||||
github.com/pelletier/go-toml v1.0.1/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
|
||||
github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc=
|
||||
github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
|
||||
github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU=
|
||||
github.com/phayes/freeport v0.0.0-20180830031419-95f893ade6f2 h1:JhzVVoYvbOACxoUmOs6V/G4D5nPVUW73rKvXxP4XUJc=
|
||||
github.com/phayes/freeport v0.0.0-20180830031419-95f893ade6f2/go.mod h1:iIss55rKnNBTvrwdmkUpLnDpZoAHvWaiq5+iMmen4AE=
|
||||
|
@ -164,117 +367,300 @@ github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=
|
|||
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||
github.com/pkg/profile v0.0.0-20161223203901-3a8809bd8a80 h1:DQFOykp5w+HOykOMzd2yOX5P6ty58Ggiu2rthHgcNQg=
|
||||
github.com/pkg/profile v0.0.0-20161223203901-3a8809bd8a80/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA=
|
||||
github.com/pkg/sftp v0.0.0-20160930220758-4d0e916071f6 h1:V8AT/I4KmIDRfObq0yBUvbD4DeaYmQY9GhC5sKl24Mo=
|
||||
github.com/pkg/sftp v0.0.0-20160930220758-4d0e916071f6/go.mod h1:NxmoDg/QLVWluQDUYG7XBZTLUpKeFa8e3aMf1BfjyHk=
|
||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||
github.com/r2d4/external-storage v0.0.0-20171222174501-8c0e8605dc7b h1:+wokSDzl6kjfWhVQsBhFOC2t4TYfdLfRXfWorEg3KUE=
|
||||
github.com/r2d4/external-storage v0.0.0-20171222174501-8c0e8605dc7b/go.mod h1:/UlUhYuWiiitqIPbAxyU96i/wDlBS8sRHX2lRN+ffgs=
|
||||
github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA=
|
||||
github.com/pquerna/ffjson v0.0.0-20180717144149-af8b230fcd20/go.mod h1:YARuvh7BUWHNhzDq2OM5tzR2RiCcN2D7sapiKyCel/M=
|
||||
github.com/prometheus/client_golang v0.8.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
|
||||
github.com/prometheus/client_golang v0.9.2 h1:awm861/B8OKDd2I/6o1dy3ra4BamzKhYOiGItCeZ740=
|
||||
github.com/prometheus/client_golang v0.9.2/go.mod h1:OsXs2jCmiKlQ1lTBmv21f2mNfw4xf/QclQDMrYNZzcM=
|
||||
github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910 h1:idejC8f05m9MGOsuEi1ATq9shN03HrxNkD/luQvxCv8=
|
||||
github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
|
||||
github.com/prometheus/common v0.0.0-20180801064454-c7de2306084e/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
|
||||
github.com/prometheus/common v0.0.0-20181126121408-4724e9255275 h1:PnBWHBf+6L0jOqq0gIVUe6Yk0/QMZ640k6NvkxcBf+8=
|
||||
github.com/prometheus/common v0.0.0-20181126121408-4724e9255275/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
|
||||
github.com/prometheus/procfs v0.0.0-20180725123919-05ee40e3a273/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
|
||||
github.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a h1:9a8MnZMP0X2nLJdBg+pBmGgkJlSaKC2KaQmTCk1XDtE=
|
||||
github.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
|
||||
github.com/quobyte/api v0.1.2/go.mod h1:jL7lIHrmqQ7yh05OJ+eEEdHr0u/kmT1Ff9iHd+4H6VI=
|
||||
github.com/remyoudompheng/bigfft v0.0.0-20170806203942-52369c62f446/go.mod h1:uYEyJGbgTkfkS4+E/PavXkNJcbFIpEtjt2B0KDQ5+9M=
|
||||
github.com/robfig/cron v0.0.0-20170309132418-df38d32658d8/go.mod h1:JGuDeoQd7Z6yL4zQhZ3OPEVHB7fL6Ka6skscFHfmt2k=
|
||||
github.com/rogpeppe/go-charset v0.0.0-20180617210344-2471d30d28b4/go.mod h1:qgYeAmZ5ZIpBWTGllZSQnw97Dj+woV0toclVaRGI8pc=
|
||||
github.com/russross/blackfriday v0.0.0-20151117072312-300106c228d5 h1:+6eORf9Bt4C3Wjt91epyu6wvLW+P6+AEODb6uKgO+4g=
|
||||
github.com/rubiojr/go-vhd v0.0.0-20160810183302-0bfd3b39853c/go.mod h1:DM5xW0nvfNNm2uytzsvhI3OnX8uzaRAg8UX/CnDqbto=
|
||||
github.com/russross/blackfriday v0.0.0-20151117072312-300106c228d5/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g=
|
||||
github.com/russross/blackfriday v1.5.2 h1:HyvC0ARfnZBqnXwABFeSZHpKvJHJJfPz81GNueLj0oo=
|
||||
github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g=
|
||||
github.com/samalba/dockerclient v0.0.0-20160414174713-91d7393ff859 h1:XRl74t6xHKI5EVIjDI5nPlHRq0bHED9/TjQuD8/UMkE=
|
||||
github.com/samalba/dockerclient v0.0.0-20160414174713-91d7393ff859/go.mod h1:yeYR4SlaRZJct6lwNRKR+qd0CocnxxWDE7Vh5dxsn/w=
|
||||
github.com/shurcooL/sanitized_anchor_name v0.0.0-20151028001915-10ef21a441db h1:lrOUn8raSZS/V52c7elGaEyuogqSkEo/Qj2Auo2G1ik=
|
||||
github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
|
||||
github.com/seccomp/libseccomp-golang v0.0.0-20150813023252-1b506fc7c24e/go.mod h1:GbW5+tmTXfcxTToHLXlScSlAvWlF4P2Ca7zGrPiEpWo=
|
||||
github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo=
|
||||
github.com/shirou/gopsutil v2.18.12+incompatible h1:1eaJvGomDnH74/5cF4CTmTbLHAriGFsTZppLXDX93OM=
|
||||
github.com/shirou/gopsutil v2.18.12+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA=
|
||||
github.com/shurcooL/component v0.0.0-20170202220835-f88ec8f54cc4/go.mod h1:XhFIlyj5a1fBNx5aJTbKoIq0mNaPvOagO+HjB3EtxrY=
|
||||
github.com/shurcooL/events v0.0.0-20181021180414-410e4ca65f48/go.mod h1:5u70Mqkb5O5cxEA8nxTsgrgLehJeAw6Oc4Ab1c/P1HM=
|
||||
github.com/shurcooL/github_flavored_markdown v0.0.0-20181002035957-2122de532470/go.mod h1:2dOwnU2uBioM+SGy2aZoq1f/Sd1l9OkAeAUvjSyvgU0=
|
||||
github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk=
|
||||
github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041/go.mod h1:N5mDOmsrJOB+vfqUK+7DmDyjhSLIIBnXo9lvZJj3MWQ=
|
||||
github.com/shurcooL/gofontwoff v0.0.0-20180329035133-29b52fc0a18d/go.mod h1:05UtEgK5zq39gLST6uB0cf3NEHjETfB4Fgr3Gx5R9Vw=
|
||||
github.com/shurcooL/gopherjslib v0.0.0-20160914041154-feb6d3990c2c/go.mod h1:8d3azKNyqcHP1GaQE/c6dDgjkgSx2BZ4IoEi4F1reUI=
|
||||
github.com/shurcooL/highlight_diff v0.0.0-20170515013008-09bb4053de1b/go.mod h1:ZpfEhSmds4ytuByIcDnOLkTHGUI6KNqRNPDLHDk+mUU=
|
||||
github.com/shurcooL/highlight_go v0.0.0-20181028180052-98c3abbbae20/go.mod h1:UDKB5a1T23gOMUJrI+uSuH0VRDStOiUVSjBTRDVBVag=
|
||||
github.com/shurcooL/home v0.0.0-20181020052607-80b7ffcb30f9/go.mod h1:+rgNQw2P9ARFAs37qieuu7ohDNQ3gds9msbT2yn85sg=
|
||||
github.com/shurcooL/htmlg v0.0.0-20170918183704-d01228ac9e50/go.mod h1:zPn1wHpTIePGnXSHpsVPWEktKXHr6+SS6x/IKRb7cpw=
|
||||
github.com/shurcooL/httperror v0.0.0-20170206035902-86b7830d14cc/go.mod h1:aYMfkZ6DWSJPJ6c4Wwz3QtW22G7mf/PEgaB9k/ik5+Y=
|
||||
github.com/shurcooL/httpfs v0.0.0-20171119174359-809beceb2371/go.mod h1:ZY1cvUeJuFPAdZ/B6v7RHavJWZn2YPVFQ1OSXhCGOkg=
|
||||
github.com/shurcooL/httpgzip v0.0.0-20180522190206-b1c53ac65af9/go.mod h1:919LwcH0M7/W4fcZ0/jy0qGght1GIhqyS/EgWGH2j5Q=
|
||||
github.com/shurcooL/issues v0.0.0-20181008053335-6292fdc1e191/go.mod h1:e2qWDig5bLteJ4fwvDAc2NHzqFEthkqn7aOZAOpj+PQ=
|
||||
github.com/shurcooL/issuesapp v0.0.0-20180602232740-048589ce2241/go.mod h1:NPpHK2TI7iSaM0buivtFUc9offApnI0Alt/K8hcHy0I=
|
||||
github.com/shurcooL/notifications v0.0.0-20181007000457-627ab5aea122/go.mod h1:b5uSkrEVM1jQUspwbixRBhaIjIzL2xazXp6kntxYle0=
|
||||
github.com/shurcooL/octicon v0.0.0-20181028054416-fa4f57f9efb2/go.mod h1:eWdoE5JD4R5UVWDucdOPg1g2fqQRq78IQa9zlOV1vpQ=
|
||||
github.com/shurcooL/reactions v0.0.0-20181006231557-f2e0b4ca5b82/go.mod h1:TCR1lToEk4d2s07G3XGfz2QrgHXg4RJBvjrOozvoWfk=
|
||||
github.com/shurcooL/sanitized_anchor_name v0.0.0-20151028001915-10ef21a441db/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
|
||||
github.com/shurcooL/sanitized_anchor_name v0.0.0-20170918181015-86672fcb3f95/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
|
||||
github.com/shurcooL/users v0.0.0-20180125191416-49c67e49c537/go.mod h1:QJTqeLYEDaXHZDBsXlPCDqdhQuJkuw4NOtaxYe3xii4=
|
||||
github.com/shurcooL/webdavfs v0.0.0-20170829043945-18c3829fa133/go.mod h1:hKmq5kWdCj2z2KEozexVbfEZIWiTjhE0+UjmZgPqehw=
|
||||
github.com/sigma/go-inotify v0.0.0-20181102212354-c87b6cf5033d/go.mod h1:stlh9OsqBQSdwxTxX73mu41BBtRbIpZLQ7flcAoxAfo=
|
||||
github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
|
||||
github.com/sirupsen/logrus v1.4.1 h1:GL2rEmy6nsikmW0r8opw9JIRScdMF5hA8cOYLH7In1k=
|
||||
github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=
|
||||
github.com/spf13/afero v0.0.0-20160816080757-b28a7effac97 h1:Gv1HykSEG+RKWWWkM69nPrJKhE/EM2oFb1nBWogHNv8=
|
||||
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
|
||||
github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
|
||||
github.com/soheilhy/cmux v0.1.3/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM=
|
||||
github.com/sourcegraph/annotate v0.0.0-20160123013949-f4cad6c6324d/go.mod h1:UdhH50NIW0fCiwBSr0co2m7BnFLdv4fQTgdqdJTHFeE=
|
||||
github.com/sourcegraph/syntaxhighlight v0.0.0-20170531221838-bd320f5d308e/go.mod h1:HuIsMU8RRBOtsCgI77wP899iHVBQpCmg4ErYMZB+2IA=
|
||||
github.com/spf13/afero v0.0.0-20160816080757-b28a7effac97/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
|
||||
github.com/spf13/cast v0.0.0-20160730092037-e31f36ffc91a h1:tPI5RnYZJhcXj0LhJ9pi7PS7gqOhuFR+4HEKyDz3BnQ=
|
||||
github.com/spf13/afero v1.1.2 h1:m8/z1t7/fwjysjQRYbP0RD+bUIF/8tJwPdEZsI83ACI=
|
||||
github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
|
||||
github.com/spf13/cast v0.0.0-20160730092037-e31f36ffc91a/go.mod h1:r2rcYCSwa1IExKTDiTfzaxqT2FNHs8hODu4LnUfgKEg=
|
||||
github.com/spf13/cobra v0.0.0-20180228053838-6644d46b81fa h1:w+PYzMV4Hrxj0nSHUxY881YFte8hst14ZZ0ZNL3mlEA=
|
||||
github.com/spf13/cobra v0.0.0-20180228053838-6644d46b81fa/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
|
||||
github.com/spf13/jwalterweatherman v0.0.0-20160311093646-33c24e77fb80 h1:evyGXhHMrxKBDkdlSPv9HMWV2o53o+Ibhm28BGc0450=
|
||||
github.com/spf13/cast v1.3.0 h1:oget//CVOEoFewqQxwr0Ej5yjygnqGkvggSE/gB35Q8=
|
||||
github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
|
||||
github.com/spf13/cobra v0.0.0-20180319062004-c439c4fa0937/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
|
||||
github.com/spf13/cobra v0.0.4/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU=
|
||||
github.com/spf13/cobra v0.0.5 h1:f0B+LkLX6DtmRH1isoNA9VTtNUK9K8xYd28JNNfOv/s=
|
||||
github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU=
|
||||
github.com/spf13/jwalterweatherman v0.0.0-20160311093646-33c24e77fb80/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=
|
||||
github.com/spf13/pflag v1.0.1 h1:aCvUg6QPl3ibpQUxyLkrEkCHtPqYJL4x9AuhqVqFis4=
|
||||
github.com/spf13/jwalterweatherman v1.0.0 h1:XHEdyB+EcvlqZamSM4ZOMGlc93t6AcsBEu9Gc1vn7yk=
|
||||
github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=
|
||||
github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
|
||||
github.com/spf13/viper v1.0.0 h1:RUA/ghS2i64rlnn4ydTfblY8Og8QzcPtCcHvgMn+w/I=
|
||||
github.com/spf13/viper v1.0.0/go.mod h1:A8kyI5cUJhb8N+3pkfONlcEcZbueH6nhAm0Fq7SrnBM=
|
||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||
github.com/spf13/pflag v1.0.3 h1:zPAT6CGy6wXeQ7NtTnaTerfKOsV6V6F8agHXFiazDkg=
|
||||
github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
|
||||
github.com/spf13/viper v0.0.0-20160820190039-7fb2782df3d8/go.mod h1:A8kyI5cUJhb8N+3pkfONlcEcZbueH6nhAm0Fq7SrnBM=
|
||||
github.com/spf13/viper v1.3.2 h1:VUFqw5KcqRf7i70GOzW7N+Q7+gxVBkSSqiXB12+JQ4M=
|
||||
github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s=
|
||||
github.com/storageos/go-api v0.0.0-20180912212459-343b3eff91fc/go.mod h1:ZrLn+e0ZuF3Y65PNF6dIwbJPZqfmtCXxFm9ckv0agOY=
|
||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||
github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w=
|
||||
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
|
||||
github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q=
|
||||
github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q=
|
||||
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
||||
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
||||
github.com/syndtr/gocapability v0.0.0-20160928074757-e7cb7fa329f4/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww=
|
||||
github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA=
|
||||
github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
|
||||
github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0=
|
||||
github.com/ulikunitz/xz v0.5.5 h1:pFrO0lVpTBXLpYw+pnLj6TbvHuyjXMfjGeCwSqCVwok=
|
||||
github.com/ulikunitz/xz v0.5.5/go.mod h1:2bypXElzHzzJZwzH67Y6wb67pO62Rzfn7BSiF4ABRW8=
|
||||
github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4=
|
||||
github.com/vishvananda/netlink v0.0.0-20171020171820-b2de5d10e38e/go.mod h1:+SR5DhBJrl6ZM7CoCKvpw5BKroDKQ+PJqOg65H/2ktk=
|
||||
github.com/vishvananda/netns v0.0.0-20171111001504-be1fbeda1936/go.mod h1:ZjcWmFBXmLKZu9Nxj3WKYEafiSqer2rnvPr0en9UNpI=
|
||||
github.com/vmware/govmomi v0.20.1/go.mod h1:URlwyTFZX72RmxtxuaFL2Uj3fD1JTvZdx59bHWk6aFU=
|
||||
github.com/vmware/photon-controller-go-sdk v0.0.0-20170310013346-4a435daef6cc/go.mod h1:e6humHha1ekIwTCm+A5Qed5mG8V4JL+ChHcUOJ+L/8U=
|
||||
github.com/xanzy/go-cloudstack v0.0.0-20160728180336-1e2cbf647e57/go.mod h1:s3eL3z5pNXF5FVybcT+LIVdId8pYn709yv6v5mrkrQE=
|
||||
github.com/xeipuuv/gojsonpointer v0.0.0-20151027082146-e0fe6f683076 h1:KM4T3G70MiR+JtqplcYkNVoNz7pDwYaBxWBXQK804So=
|
||||
github.com/xeipuuv/gojsonpointer v0.0.0-20151027082146-e0fe6f683076/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU=
|
||||
github.com/xeipuuv/gojsonreference v0.0.0-20150808065054-e02fc20de94c h1:XZWnr3bsDQWAZg4Ne+cPoXRPILrNlPNQfxBuwLl43is=
|
||||
github.com/xeipuuv/gojsonreference v0.0.0-20150808065054-e02fc20de94c/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ=
|
||||
github.com/xeipuuv/gojsonschema v0.0.0-20160623135812-c539bca196be h1:sRGd3e18izj1hQgF1hSvDOA8RPPnA2t4p8YeLZ/GdBU=
|
||||
github.com/xeipuuv/gojsonschema v0.0.0-20160623135812-c539bca196be/go.mod h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs=
|
||||
github.com/xiang90/probing v0.0.0-20160813154853-07dd2e8dfe18/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
|
||||
github.com/xlab/handysort v0.0.0-20150421192137-fb3537ed64a1/go.mod h1:QcJo0QPSfTONNIgpN5RA8prR7fF8nkF6cTWTcNerRO8=
|
||||
github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q=
|
||||
github.com/zchee/go-vmnet v0.0.0-20161021174912-97ebf9174097 h1:Ucx5I1l1+TWXvqFmBigYu4Ub4MLvUuUU/whjoUvV95I=
|
||||
github.com/zchee/go-vmnet v0.0.0-20161021174912-97ebf9174097/go.mod h1:lFZSWRIpCfE/pt91hHBBpV6+x87YlCjsp+aIR2qCPPU=
|
||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2 h1:VklqNMn3ovrHsnt90PveolxSbWFaJdECFbxSq0Mqo2M=
|
||||
go.opencensus.io v0.18.0 h1:Mk5rgZcggtbvtAun5aJzAtjKKN/t0R3jJPlWILlv938=
|
||||
go.opencensus.io v0.18.0/go.mod h1:vKdFvxhtzZ9onBp9VKHK8z/sRpBMnKAsufL7wlDrCOA=
|
||||
go.uber.org/atomic v0.0.0-20181018215023-8dc6146f7569/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
|
||||
go.uber.org/multierr v0.0.0-20180122172545-ddea229ff1df/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
|
||||
go.uber.org/zap v0.0.0-20180814183419-67bc79d13d15/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
|
||||
go4.org v0.0.0-20180809161055-417644f6feb5/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE=
|
||||
golang.org/x/build v0.0.0-20190111050920-041ab4dc3f9d/go.mod h1:OWs+y06UdEOHN4y+MfF/py+xQ/tYqIWW03b70/CG9Rw=
|
||||
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
||||
golang.org/x/crypto v0.0.0-20181025213731-e84da0312774/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
||||
golang.org/x/crypto v0.0.0-20181030102418-4d3f4d9ffa16/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
||||
golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
||||
golang.org/x/crypto v0.0.0-20190228161510-8dd112bcdc25/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||
golang.org/x/crypto v0.0.0-20190506204251-e1dfcc566284 h1:rlLehGeYg6jfoyz/eDqDU1iRXLKfR42nnNh57ytKEWo=
|
||||
golang.org/x/crypto v0.0.0-20190506204251-e1dfcc566284/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||
golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8 h1:1wopBVtVdWnn03fZelqdXTqk7U7zPQCb+T4rbU9ZEoU=
|
||||
golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||
golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||
golang.org/x/exp v0.0.0-20190312203227-4b39c73a6495/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
|
||||
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
|
||||
golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
||||
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
||||
golang.org/x/lint v0.0.0-20181217174547-8f45f776aaf1/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
||||
golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=
|
||||
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e h1:bRhVy7zSSasaqNksaRZiA5EEI+Ei4I1nO5Jh72wfHlg=
|
||||
golang.org/x/net v0.0.0-20181005035420-146acd28ed58/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20181029044818-c44066c5c816/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20181106065722-10aee1819953/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20190311183353-d8887717615a h1:oWX7TPOiFAMXLq8o0ikBYfCJVlRHBcsciT5bXOrH628=
|
||||
golang.org/x/net v0.0.0-20190206173232-65e2d4e15006/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||
golang.org/x/net v0.0.0-20190328230028-74de082e2cca/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3 h1:0GoQqolDA55aaLxZyTzK/Y2ePZzZTUrRacwib7cNsYQ=
|
||||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
||||
golang.org/x/oauth2 v0.0.0-20190115181402-5dab4167f31c h1:pcBdqVcrlT+A3i+tWsOROFONQyey9tisIQHI4xqVGLg=
|
||||
golang.org/x/oauth2 v0.0.0-20190115181402-5dab4167f31c/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||
golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
||||
golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
||||
golang.org/x/oauth2 v0.0.0-20190402181905-9f3314589c9a h1:tImsplftrFpALCYumobsd0K86vlAs/eXGFms2txfJfA=
|
||||
golang.org/x/oauth2 v0.0.0-20190402181905-9f3314589c9a/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||
golang.org/x/perf v0.0.0-20180704124530-6e6d33e29852/go.mod h1:JLpeXjPJfIyPr5TlbXLkXWLhP8nz10XfvxElABhCtcw=
|
||||
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4 h1:YUO/7uOKsKeq9UokNS62b8FYywz3ker1l1vDZRCRefw=
|
||||
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6 h1:bjcUS9ztw9kFmmIxJInhon/0Is3p+EHBKNgquIzo1OI=
|
||||
golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20190423024810-112230192c58 h1:8gQV6CLnAEikrhgkHFbMAEhagSSnXWGV915qUMm9mrU=
|
||||
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a h1:1BGLXjeY4akVXGgbC9HugT3Jv3hCI0z56oJR5vAMgBU=
|
||||
golang.org/x/sys v0.0.0-20181004145325-8469e314837c/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20181029174526-d69651ed3497/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20181213200352-4d1cda033e06/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b h1:ag/x1USPSsqHud38I9BAC88qdNLDHHtQ4mlgQIZPPNA=
|
||||
golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f h1:25KHgbfyiSm6vwQLbM3zZIe1v9p/3ea4Rz+nnM5K/i4=
|
||||
golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
golang.org/x/text v0.3.1-0.20181227161524-e6919f6577db/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
|
||||
golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs=
|
||||
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
|
||||
golang.org/x/time v0.0.0-20161028155119-f51c12702a4d h1:TnM+PKb3ylGmZvyPXmo9m/wktg7Jn/a/fNmr33HSj8g=
|
||||
golang.org/x/time v0.0.0-20161028155119-f51c12702a4d/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||
golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c h1:fqgJT0MGcGpPgpWU7VRdRjuArfcOvC4AoJmILihzhDg=
|
||||
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||
golang.org/x/tools v0.0.0-20170824195420-5d2fd3ccab98/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.0.0-20181030000716-a0a13e073c7b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
||||
golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
||||
gonum.org/v1/gonum v0.0.0-20190331200053-3d26580ed485/go.mod h1:2ltnJ7xHfj0zHS40VVPYEAAMTa3ZGguvHGBSJeRWqE0=
|
||||
gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=
|
||||
gonum.org/v1/netlib v0.0.0-20190331212654-76723241ea4e/go.mod h1:kS+toOQn6AQKjmKJ7gzohV1XkqsFehRA2FbsbkopSuQ=
|
||||
google.golang.org/api v0.0.0-20180910000450-7ca32eb868bf/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0=
|
||||
google.golang.org/api v0.0.0-20181030000543-1d582fd0359e/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0=
|
||||
google.golang.org/api v0.0.0-20181220000619-583d854617af/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0=
|
||||
google.golang.org/api v0.1.0 h1:K6z2u68e86TPdSdefXdzvXgR1zEMa+459vBSfWYAZkI=
|
||||
google.golang.org/api v0.1.0/go.mod h1:UGEZY7KEX120AnNLIHFMKIo4obdJhkp2tPbaPlQx13Y=
|
||||
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
|
||||
google.golang.org/appengine v1.4.0 h1:/wp5JvzpHIxhs/dumFmF7BXTf3Z+dd4uXta4kVyO508=
|
||||
google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
||||
google.golang.org/appengine v1.3.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
||||
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
||||
google.golang.org/appengine v1.5.0 h1:KxkO13IPW4Lslp2bz+KHP2E3gtFlrIGNThxkZQ3g+4c=
|
||||
google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
||||
google.golang.org/genproto v0.0.0-20170731182057-09f6ed296fc6/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
|
||||
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
|
||||
google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
|
||||
google.golang.org/genproto v0.0.0-20181029155118-b69ba1387ce2/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
|
||||
google.golang.org/genproto v0.0.0-20181202183823-bd91e49a0898/go.mod h1:7Ep/1NZk928CDR8SjdVbjWNpdIf6nzjE3BTgJDr2Atg=
|
||||
google.golang.org/genproto v0.0.0-20190201180003-4b09977fb922 h1:mBVYJnbrXLA/ZCBTCe7PtEgAUP+1bg92qTaFoPHdz+8=
|
||||
google.golang.org/genproto v0.0.0-20190201180003-4b09977fb922/go.mod h1:L3J43x8/uS+qIUoksaLKe6OS3nUKxOKuIFz1sl2/jx4=
|
||||
google.golang.org/grpc v1.13.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw=
|
||||
google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw=
|
||||
google.golang.org/grpc v1.16.0/go.mod h1:0JHn/cJsOMiMfNA9+DeHDlAU7KAAB5GDlYFpa9MZMio=
|
||||
google.golang.org/grpc v1.17.0 h1:TRJYBgMclJvGYn2rIMjj+h9KtMt5r1Ij7ODVRIZkwhk=
|
||||
google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs=
|
||||
gopkg.in/airbrake/gobrake.v2 v2.0.9 h1:7z2uVWwn7oVeeugY1DtlPAy5H+KYgB1KeKTnqjNatLo=
|
||||
gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
|
||||
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/cheggaaa/pb.v1 v1.0.6 h1:YQye4a1JysUfXYB6VihDfxb4lxOAei0xS44yN+srOew=
|
||||
gopkg.in/cheggaaa/pb.v1 v1.0.6/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw=
|
||||
gopkg.in/cheggaaa/pb.v1 v1.0.27 h1:kJdccidYzt3CaHD1crCFTS1hxyhSi059NhOFUf03YFo=
|
||||
gopkg.in/cheggaaa/pb.v1 v1.0.27/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw=
|
||||
gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4=
|
||||
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
|
||||
gopkg.in/gcfg.v1 v1.2.0/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o=
|
||||
gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2 h1:OAj3g0cR6Dx/R07QgQe8wkA9RNjB2u4i700xBkIT4e0=
|
||||
gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo=
|
||||
gopkg.in/inf.v0 v0.9.0 h1:3zYtXIO92bvsdS3ggAdA8Gb4Azj0YU+TVY1uGYNFA8o=
|
||||
gopkg.in/inf.v0 v0.9.0/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=
|
||||
gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc=
|
||||
gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=
|
||||
gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=
|
||||
gopkg.in/square/go-jose.v2 v2.0.0-20180411045311-89060dee6a84/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI=
|
||||
gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI=
|
||||
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=
|
||||
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
|
||||
gopkg.in/yaml.v1 v1.0.0-20140924161607-9f9df34309c0 h1:POO/ycCATvegFmVuPpQzZFJ+pGZeX22Ufu6fibxDVjU=
|
||||
gopkg.in/warnings.v0 v0.1.1/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI=
|
||||
gopkg.in/yaml.v1 v1.0.0-20140924161607-9f9df34309c0/go.mod h1:WDnlLJ4WF5VGsH/HVa3CI79GS0ol3YnhVnKP89i0kNg=
|
||||
gopkg.in/yaml.v2 v2.2.1 h1:mUhvW9EsL+naU5Q3cakzfE91YhliOondGd6ZrsDBHQE=
|
||||
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
k8s.io/api v0.0.0-20180712090710-2d6f90ab1293 h1:hROmpFC7JMobXFXMmD7ZKZLhDKvr1IKfFJoYS/45G/8=
|
||||
k8s.io/api v0.0.0-20180712090710-2d6f90ab1293/go.mod h1:iuAfoD4hCxJ8Onx9kaTIt30j7jUFS00AXQi6QMi99vA=
|
||||
k8s.io/apimachinery v0.0.0-20180621070125-103fd098999d h1:MZjlsu9igBoVPZkXpIGoxI6EonqNsXXZU7hhvfQLkd4=
|
||||
k8s.io/apimachinery v0.0.0-20180621070125-103fd098999d/go.mod h1:ccL7Eh7zubPUSh9A3USN90/OzHNSVN6zxzde07TDCL0=
|
||||
k8s.io/apiserver v0.0.0-20180914001516-67c892841170 h1:a9iLDj8v4x5/JpYsgKWSv3k6c5Q7M8dsyrAt4GLOzKQ=
|
||||
k8s.io/apiserver v0.0.0-20180914001516-67c892841170/go.mod h1:6bqaTSOSJavUIXUtfaR9Os9JtTCm8ZqH2SUl2S60C4w=
|
||||
k8s.io/client-go v0.0.0-20180806134042-1f13a808da65 h1:kQX7jEIMYrWV9XqFN4usRaBLzCu7fd/qsCXxbgf3+9g=
|
||||
k8s.io/client-go v0.0.0-20180806134042-1f13a808da65/go.mod h1:7vJpHMYJwNQCWgzmNV+VYUl1zCObLyodBc8nIyt8L5s=
|
||||
k8s.io/kube-openapi v0.0.0-20180216212618-50ae88d24ede h1:YOWlONzJUq456SnNYPcK/org5asA+LU6AzNBm+l/04o=
|
||||
k8s.io/kube-openapi v0.0.0-20180216212618-50ae88d24ede/go.mod h1:BXM9ceUBTj2QnfH2MK1odQs778ajze1RxcmP6S8RVVc=
|
||||
k8s.io/kubernetes v1.11.3 h1:49Pz+NOerox7nZ9F0m/fWv2MIuFDU5cDAoYMozurx1k=
|
||||
k8s.io/kubernetes v1.11.3/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk=
|
||||
gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw=
|
||||
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw=
|
||||
grpc.go4.org v0.0.0-20170609214715-11d0a25b4919/go.mod h1:77eQGdRu53HpSqPFJFmuJdjuHRquDANNeA4x7B8WQ9o=
|
||||
honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
||||
honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
||||
k8s.io/gengo v0.0.0-20190116091435-f8a0810f38af/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0=
|
||||
k8s.io/heapster v1.2.0-beta.1/go.mod h1:h1uhptVXMwC8xtZBYsPXKVi8fpdlYkTs6k949KozGrM=
|
||||
k8s.io/klog v0.3.1 h1:RVgyDHY/kFKtLqh67NvEWIgkMneNoIrdkN0CxDSQc68=
|
||||
k8s.io/klog v0.3.1/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk=
|
||||
k8s.io/kube-openapi v0.0.0-20190228160746-b3a7cee44a30 h1:TRb4wNWoBVrH9plmkp2q86FIDppkbrEXdXlxU3a3BMI=
|
||||
k8s.io/kube-openapi v0.0.0-20190228160746-b3a7cee44a30/go.mod h1:BXM9ceUBTj2QnfH2MK1odQs778ajze1RxcmP6S8RVVc=
|
||||
k8s.io/kubernetes v1.15.0 h1:0P6jAdZ1cF5/wSc14HqHCjWlbnwYzmFJBYeXBezZEE0=
|
||||
k8s.io/kubernetes v1.15.0/go.mod h1:3RE5ikMc73WK+dSxk4pQuQ6ZaJcPXiZX2dj98RcdCuM=
|
||||
k8s.io/kubernetes/staging/src/k8s.io/api v0.0.0-20190623232353-8c3b7d7679cc h1:vZ5+77WP1yImZo23wc75vV5b5zCGq9gv484q8Yw5sBw=
|
||||
k8s.io/kubernetes/staging/src/k8s.io/api v0.0.0-20190623232353-8c3b7d7679cc/go.mod h1:pU9hbGZc8Z6+6HlNLEFY1GiNGzcCykU1Glsd4vEea2U=
|
||||
k8s.io/kubernetes/staging/src/k8s.io/apiextensions-apiserver v0.0.0-20190623232353-8c3b7d7679cc/go.mod h1:Q49J/iUBV6A9nn8loyV72DK2EXhN8sqCR8FyfxIFDA4=
|
||||
k8s.io/kubernetes/staging/src/k8s.io/apimachinery v0.0.0-20190623232353-8c3b7d7679cc h1:SHxaBZWgNouwsZCVg2+iffu0Um1ExSLPKgvO1drWShs=
|
||||
k8s.io/kubernetes/staging/src/k8s.io/apimachinery v0.0.0-20190623232353-8c3b7d7679cc/go.mod h1:rRBYbORqofLsn4/tsQWkeXkdKUoGrTfUwbI9s7NhU0Q=
|
||||
k8s.io/kubernetes/staging/src/k8s.io/apiserver v0.0.0-20190623232353-8c3b7d7679cc/go.mod h1:0xlmg2F70Iaf7pdSDkfFQhWiyKh7eRqO0fBx4OvA4IA=
|
||||
k8s.io/kubernetes/staging/src/k8s.io/cli-runtime v0.0.0-20190623232353-8c3b7d7679cc/go.mod h1:YZQFNMZSNiRALChwxrRkzjVrmmJWNlSl4StwOETTIYI=
|
||||
k8s.io/kubernetes/staging/src/k8s.io/client-go v0.0.0-20190623232353-8c3b7d7679cc h1:NkZ6eBWe3aFn6wCHgMBPfcjVSji1Nz/EcwGpFQjcT0c=
|
||||
k8s.io/kubernetes/staging/src/k8s.io/client-go v0.0.0-20190623232353-8c3b7d7679cc/go.mod h1:O+HAJNvEkq6MA64VSkhBp2oKeuSVWtTgc9O3z7AgDfA=
|
||||
k8s.io/kubernetes/staging/src/k8s.io/cloud-provider v0.0.0-20190623232353-8c3b7d7679cc/go.mod h1:rQUOm/XLTGmz4tguTc3V1Ee8zCf5BZ2lCh7nv6dXTzA=
|
||||
k8s.io/kubernetes/staging/src/k8s.io/cluster-bootstrap v0.0.0-20190623232353-8c3b7d7679cc h1:RvTiGzEJ1/k72+BZMjwkGCF6gYMBxn0zeeiE8Yu6f/I=
|
||||
k8s.io/kubernetes/staging/src/k8s.io/cluster-bootstrap v0.0.0-20190623232353-8c3b7d7679cc/go.mod h1:8RJmS4bkGaaevegssxZX5h3eMJzW3smzE67LISltg+k=
|
||||
k8s.io/kubernetes/staging/src/k8s.io/code-generator v0.0.0-20190623232353-8c3b7d7679cc/go.mod h1:oFKBcitmDfPm+OpCoj4rfVSuHbWynjF3/L/sMV4tB0w=
|
||||
k8s.io/kubernetes/staging/src/k8s.io/component-base v0.0.0-20190623232353-8c3b7d7679cc h1:WLHw9cDk+CO4nOmbXsU4twzxlJymyKjncV96XDFwkck=
|
||||
k8s.io/kubernetes/staging/src/k8s.io/component-base v0.0.0-20190623232353-8c3b7d7679cc/go.mod h1:kUl6x7EkDsgIPSyB6dN6UIRqtofbZpoGp9RDYlqm1EY=
|
||||
k8s.io/kubernetes/staging/src/k8s.io/cri-api v0.0.0-20190623232353-8c3b7d7679cc/go.mod h1:YrwDlnLsMEkKgyPt/gJOHrXoCpYIdDpcikarkQ1hubo=
|
||||
k8s.io/kubernetes/staging/src/k8s.io/csi-translation-lib v0.0.0-20190623232353-8c3b7d7679cc/go.mod h1:5RWpGgZKzUcW9gCtmSVRq8maZkOetGv87HrohpTrnLI=
|
||||
k8s.io/kubernetes/staging/src/k8s.io/kube-aggregator v0.0.0-20190623232353-8c3b7d7679cc/go.mod h1:ogOX4l9UCMfFGIF+FZqmsln4NtCGPqf9zTMCIlm2YX4=
|
||||
k8s.io/kubernetes/staging/src/k8s.io/kube-controller-manager v0.0.0-20190623232353-8c3b7d7679cc/go.mod h1:o6aAFW1lCnr5CJm1riWnhQskrAHhyt8btyv5UHhgZ6c=
|
||||
k8s.io/kubernetes/staging/src/k8s.io/kube-proxy v0.0.0-20190623232353-8c3b7d7679cc/go.mod h1:y0hpsQGN8h3HcNqYbpSZEH4yC1ohi45N35c8ma9yg6M=
|
||||
k8s.io/kubernetes/staging/src/k8s.io/kube-scheduler v0.0.0-20190623232353-8c3b7d7679cc/go.mod h1:/hbCTKdfutEO2iTQv8NuYcnAxd8Tuu4mMEymYv/EZHk=
|
||||
k8s.io/kubernetes/staging/src/k8s.io/kubectl v0.0.0-20190623232353-8c3b7d7679cc h1:Bsljf/3UDy91qqLkevAiq6y+wl0qJrkLjWfBCQs9rss=
|
||||
k8s.io/kubernetes/staging/src/k8s.io/kubectl v0.0.0-20190623232353-8c3b7d7679cc/go.mod h1:Vg6Q3IDU3hfYMICKyb43lClOXWtCtOBh2o1FfuQw8mQ=
|
||||
k8s.io/kubernetes/staging/src/k8s.io/kubelet v0.0.0-20190623232353-8c3b7d7679cc/go.mod h1:9UInPlSttlDwZBFNMAsqhTtl7zH00dE2M88B9Z0Ennc=
|
||||
k8s.io/kubernetes/staging/src/k8s.io/legacy-cloud-providers v0.0.0-20190623232353-8c3b7d7679cc/go.mod h1:xlTRb77uaXbuT6evILwFescWPMENFKYGYj3a/kOjYQE=
|
||||
k8s.io/kubernetes/staging/src/k8s.io/metrics v0.0.0-20190623232353-8c3b7d7679cc/go.mod h1:6Cs3k9ccbWbJo3CQOrGDu2QEVLwsWbBlu9HitjPhuSk=
|
||||
k8s.io/kubernetes/staging/src/k8s.io/sample-apiserver v0.0.0-20190623232353-8c3b7d7679cc/go.mod h1:2LUaF4APkM/13Q3y9+NnAjBQrLPDy3IrJ0uKTS+zxP4=
|
||||
k8s.io/repo-infra v0.0.0-20181204233714-00fe14e3d1a3/go.mod h1:+G1xBfZDfVFsm1Tj/HNCvg4QqWx8rJ2Fxpqr1rqp/gQ=
|
||||
k8s.io/utils v0.0.0-20190221042446-c2654d5206da h1:ElyM7RPonbKnQqOcw7dG2IK5uvQQn3b/WPHqD5mBvP4=
|
||||
k8s.io/utils v0.0.0-20190221042446-c2654d5206da/go.mod h1:8k8uAuAQ0rXslZKaEWd0c3oVhZz7sSzSiPnVZayjIX0=
|
||||
modernc.org/cc v1.0.0/go.mod h1:1Sk4//wdnYJiUIxnW8ddKpaOJCF37yAdqYnkxUpaYxw=
|
||||
modernc.org/golex v1.0.0/go.mod h1:b/QX9oBD/LhixY6NDh+IdGv17hgB+51fET1i2kPSmvk=
|
||||
modernc.org/mathutil v1.0.0/go.mod h1:wU0vUrJsVWBZ4P6e7xtFJEhFSNsfRLJ8H458uRjg03k=
|
||||
modernc.org/strutil v1.0.0/go.mod h1:lstksw84oURvj9y3tn8lGvRxyRC1S2+g5uuIzNfIOBs=
|
||||
modernc.org/xc v1.0.0/go.mod h1:mRNCo0bvLjGhHO9WsyuKVU4q0ceiDDDoEeWDJHrNx8I=
|
||||
sigs.k8s.io/kustomize v2.0.3+incompatible/go.mod h1:MkjgH3RdOWrievjo6c9T245dYlB5QeXV4WCbnt/PEpU=
|
||||
sigs.k8s.io/sig-storage-lib-external-provisioner v4.0.0+incompatible h1:qV3eFdgCp7Cp/ORjkJI9VBBEOntT+z385jLqdBtmgHA=
|
||||
sigs.k8s.io/sig-storage-lib-external-provisioner v4.0.0+incompatible/go.mod h1:qhqLyNwJC49PoUalmtzYb4s9fT8HOMBTLbTY1QoVOqI=
|
||||
sigs.k8s.io/structured-merge-diff v0.0.0-20190302045857-e85c7b244fd2/go.mod h1:wWxsB5ozmmv/SG7nM11ayaAW51xMvak/t1r0CSlcokI=
|
||||
sigs.k8s.io/yaml v1.1.0 h1:4A07+ZFc2wgJwo8YNlQpr1rVlgUDlxXHhPJciaPY5gs=
|
||||
sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o=
|
||||
sourcegraph.com/sourcegraph/go-diff v0.5.0/go.mod h1:kuch7UrkMzY0X+p9CRK03kfuPQ2zzQcaEFbx8wA8rck=
|
||||
sourcegraph.com/sqs/pbtypes v0.0.0-20180604144634-d3ebe8f20ae4/go.mod h1:ketZ/q3QxT9HOBeFhu6RdvsftgpsbFHBF5Cas6cDKZ0=
|
||||
vbom.ml/util v0.0.0-20160121211510-db5cfe13f5cc/go.mod h1:so/NYdZXCz+E3ZpW0uAoCj6uzU2+8OWDFv/HxUSs7kI=
|
||||
|
|
|
@ -23,7 +23,7 @@
|
|||
# EXTRA_START_ARGS: additional flags to pass into minikube start
|
||||
# EXTRA_ARGS: additional flags to pass into minikube
|
||||
# JOB_NAME: the name of the logfile and check name to update on github
|
||||
#
|
||||
# PARALLEL_COUNT: number of tests to run in parallel
|
||||
|
||||
|
||||
readonly TEST_ROOT="${HOME}/minikube-integration"
|
||||
|
@ -76,6 +76,7 @@ gsutil -qm cp \
|
|||
|
||||
gsutil -qm cp "gs://minikube-builds/${MINIKUBE_LOCATION}/testdata"/* testdata/
|
||||
|
||||
|
||||
# Set the executable bit on the e2e binary and out binary
|
||||
export MINIKUBE_BIN="out/minikube-${OS_ARCH}"
|
||||
export E2E_BIN="out/e2e-${OS_ARCH}"
|
||||
|
@ -83,7 +84,7 @@ chmod +x "${MINIKUBE_BIN}" "${E2E_BIN}" out/docker-machine-driver-*
|
|||
|
||||
procs=$(pgrep "minikube-${OS_ARCH}|e2e-${OS_ARCH}" || true)
|
||||
if [[ "${procs}" != "" ]]; then
|
||||
echo "ERROR: found stale test processes to kill:"
|
||||
echo "Warning: found stale test processes to kill:"
|
||||
ps -f -p ${procs} || true
|
||||
kill ${procs} || true
|
||||
kill -9 ${procs} || true
|
||||
|
@ -131,6 +132,13 @@ if type -P virsh; then
|
|||
| awk '{ print $2 }' \
|
||||
| xargs -I {} sh -c "virsh -c qemu:///system destroy {}; virsh -c qemu:///system undefine {}" \
|
||||
|| true
|
||||
virsh -c qemu:///system list --all \
|
||||
| grep Test \
|
||||
| awk '{ print $2 }' \
|
||||
| xargs -I {} sh -c "virsh -c qemu:///system destroy {}; virsh -c qemu:///system undefine {}" \
|
||||
|| true
|
||||
echo ">> Virsh VM list after clean up (should be empty) :"
|
||||
virsh -c qemu:///system list --all || true
|
||||
fi
|
||||
|
||||
if type -P vboxmanage; then
|
||||
|
@ -140,6 +148,21 @@ if type -P vboxmanage; then
|
|||
| cut -d'"' -f2 \
|
||||
| xargs -I {} sh -c "vboxmanage startvm {} --type emergencystop; vboxmanage unregistervm {} --delete" \
|
||||
|| true
|
||||
vboxmanage list vms \
|
||||
| grep Test \
|
||||
| cut -d'"' -f2 \
|
||||
| xargs -I {} sh -c "vboxmanage startvm {} --type emergencystop; vboxmanage unregistervm {} --delete" \
|
||||
|| true
|
||||
|
||||
# remove inaccessible stale VMs https://github.com/kubernetes/minikube/issues/4872
|
||||
vboxmanage list vms \
|
||||
| grep inaccessible \
|
||||
| cut -d'"' -f3 \
|
||||
| xargs -I {} sh -c "vboxmanage startvm {} --type emergencystop; vboxmanage unregistervm {} --delete" \
|
||||
|| true
|
||||
|
||||
# list them again after clean up
|
||||
vboxmanage list vms || true
|
||||
fi
|
||||
|
||||
if type -P hdiutil; then
|
||||
|
@ -151,6 +174,23 @@ if type -P hdiutil; then
|
|||
|| true
|
||||
fi
|
||||
|
||||
# cleaning up stale hyperkits
|
||||
if type -P hyperkit; then
|
||||
# find all hyperkits excluding com.docker
|
||||
hyper_procs=$(ps aux | grep hyperkit | grep -v com.docker | grep -v grep | grep -v osx_integration_tests_hyperkit.sh | awk '{print $2}' || true)
|
||||
if [[ "${hyper_procs}" != "" ]]; then
|
||||
echo "Found stale hyperkits test processes to kill : "
|
||||
for p in $hyper_procs
|
||||
do
|
||||
echo "Killing stale hyperkit $p"
|
||||
ps -f -p $p || true
|
||||
kill $p || true
|
||||
kill -9 $p || true
|
||||
done
|
||||
fi
|
||||
fi
|
||||
|
||||
|
||||
if [[ "${VM_DRIVER}" == "hyperkit" ]]; then
|
||||
if [[ -e out/docker-machine-driver-hyperkit ]]; then
|
||||
sudo chown root:wheel out/docker-machine-driver-hyperkit || true
|
||||
|
@ -162,9 +202,22 @@ kprocs=$(pgrep kubectl || true)
|
|||
if [[ "${kprocs}" != "" ]]; then
|
||||
echo "error: killing hung kubectl processes ..."
|
||||
ps -f -p ${kprocs} || true
|
||||
${SUDO_PREFIX} kill ${kprocs} || true
|
||||
sudo -E kill ${kprocs} || true
|
||||
fi
|
||||
|
||||
# clean up none drivers binding on 8443
|
||||
none_procs=$(sudo lsof -i :8443 | tail -n +2 | awk '{print $2}' || true)
|
||||
if [[ "${none_procs}" != "" ]]; then
|
||||
echo "Found stale api servers listening on 8443 processes to kill: "
|
||||
for p in $none_procs
|
||||
do
|
||||
echo "Kiling stale none driver: $p"
|
||||
sudo -E ps -f -p $p || true
|
||||
sudo -E kill $p || true
|
||||
sudo -E kill -9 $p || true
|
||||
done
|
||||
fi
|
||||
|
||||
function cleanup_stale_routes() {
|
||||
local show="netstat -rn -f inet"
|
||||
local del="sudo route -n delete"
|
||||
|
@ -198,7 +251,7 @@ echo ">> Starting ${E2E_BIN} at $(date)"
|
|||
${SUDO_PREFIX}${E2E_BIN} \
|
||||
-minikube-start-args="--vm-driver=${VM_DRIVER} ${EXTRA_START_ARGS}" \
|
||||
-minikube-args="--v=10 --logtostderr ${EXTRA_ARGS}" \
|
||||
-test.v -test.timeout=90m -binary="${MINIKUBE_BIN}" && result=$? || result=$?
|
||||
-test.v -test.timeout=100m -test.parallel=${PARALLEL_COUNT} -binary="${MINIKUBE_BIN}" && result=$? || result=$?
|
||||
echo ">> ${E2E_BIN} exited with ${result} at $(date)"
|
||||
echo ""
|
||||
|
||||
|
|
|
@ -28,6 +28,7 @@ set -e
|
|||
OS_ARCH="linux-amd64"
|
||||
VM_DRIVER="kvm2"
|
||||
JOB_NAME="Linux-KVM"
|
||||
PARALLEL_COUNT=4
|
||||
|
||||
# Download files and set permissions
|
||||
source ./common.sh
|
||||
|
|
|
@ -30,6 +30,7 @@ OS_ARCH="linux-amd64"
|
|||
VM_DRIVER="none"
|
||||
JOB_NAME="Linux-None"
|
||||
EXTRA_ARGS="--bootstrapper=kubeadm"
|
||||
PARALLEL_COUNT=1
|
||||
|
||||
SUDO_PREFIX="sudo -E "
|
||||
export KUBECONFIG="/root/.kube/config"
|
||||
|
|
|
@ -28,6 +28,7 @@ set -e
|
|||
OS_ARCH="linux-amd64"
|
||||
VM_DRIVER="virtualbox"
|
||||
JOB_NAME="Linux-VirtualBox"
|
||||
PARALLEL_COUNT=4
|
||||
|
||||
# Download files and set permissions
|
||||
source ./common.sh
|
||||
|
|
|
@ -0,0 +1,39 @@
|
|||
#!/bin/sh
|
||||
|
||||
# Copyright 2019 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.
|
||||
|
||||
# Periodically cleanup and reboot if no Jenkins subprocesses are running.
|
||||
set -uf -o pipefail
|
||||
|
||||
PATH=/usr/local/bin:/sbin:/usr/local/sbin:$PATH
|
||||
|
||||
exit_if_jenkins() {
|
||||
jenkins=$(pgrep java)
|
||||
if [[ "$jenkins" -- "" ]]; then
|
||||
echo "no java, no jenkins"
|
||||
return 0
|
||||
fi
|
||||
pstree $jenkins | grep -v java && echo "jenkins is running..." && exit 1
|
||||
}
|
||||
|
||||
exit_if_jenkins
|
||||
echo "waiting to see if any jobs are coming in..."
|
||||
sleep 15
|
||||
exit_if_jenkins
|
||||
echo "doing it"
|
||||
killall java
|
||||
sudo rm -Rf ~jenkins/.minikube || echo "could not delete minikube"
|
||||
sudo rm -Rf ~/jenkins/minikube-integration/* || true
|
||||
sudo reboot
|
|
@ -31,7 +31,7 @@ VM_DRIVER="hyperkit"
|
|||
JOB_NAME="OSX-Hyperkit"
|
||||
EXTRA_ARGS="--bootstrapper=kubeadm"
|
||||
EXTRA_START_ARGS=""
|
||||
|
||||
PARALLEL_COUNT=3
|
||||
|
||||
# Download files and set permissions
|
||||
source common.sh
|
||||
|
|
|
@ -29,6 +29,7 @@ OS_ARCH="darwin-amd64"
|
|||
VM_DRIVER="virtualbox"
|
||||
JOB_NAME="OSX-Virtualbox"
|
||||
EXTRA_ARGS="--bootstrapper=kubeadm"
|
||||
PARALLEL_COUNT=3
|
||||
|
||||
# Download files and set permissions
|
||||
source common.sh
|
||||
|
|
|
@ -37,7 +37,9 @@ cat Makefile | grep "VERSION_MINOR ?=" | grep $VERSION_MINOR
|
|||
cat Makefile | grep "VERSION_BUILD ?=" | grep $VERSION_BUILD
|
||||
|
||||
# Build and upload
|
||||
BUILD_IN_DOCKER=y make -j 16 all out/minikube-installer.exe out/minikube_${DEB_VERSION}.deb out/minikube-${RPM_VERSION}.rpm
|
||||
BUILD_IN_DOCKER=y make -j 16 all out/minikube-installer.exe \
|
||||
out/minikube_${DEB_VERSION}.deb out/minikube-${RPM_VERSION}.rpm \
|
||||
out/docker-machine-driver-kvm2_${DEB_VERSION}.deb out/docker-machine-driver-kvm2-${RPM_VERSION}.rpm
|
||||
make checksum
|
||||
|
||||
gsutil -m cp out/* gs://$BUCKET/releases/$TAGNAME/
|
||||
|
|
|
@ -0,0 +1,33 @@
|
|||
:: Copyright 2019 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.
|
||||
|
||||
:: Periodically cleanup and reboot if no Jenkins subprocesses are running.
|
||||
|
||||
@echo off
|
||||
call :jenkins
|
||||
echo waiting to see if any jobs are coming in...
|
||||
timeout 30
|
||||
call :jenkins
|
||||
echo doing it
|
||||
taskkill /IM putty.exe
|
||||
taskkill /F /IM java.exe
|
||||
powershell -Command "Stop-VM minikube"
|
||||
powershell -Command "Delete-VM minikube"
|
||||
rmdir /S /Q C:\Users\admin\.minikube
|
||||
shutdown /r
|
||||
|
||||
:jenkins
|
||||
tasklist | find /i /n "e2e-windows-amd64.exe">NUL
|
||||
if %ERRORLEVEL% == 0 exit 1
|
||||
exit /B 0
|
|
@ -0,0 +1,12 @@
|
|||
Package: docker-machine-driver-kvm2
|
||||
Version: --VERSION--
|
||||
Section: base
|
||||
Priority: optional
|
||||
Architecture: amd64
|
||||
Depends: libvirt0 (>= 1.3.1)
|
||||
Recommends: minikube
|
||||
Maintainer: Thomas Strömberg <t+minikube@stromberg.org>
|
||||
Description: Machine driver for KVM
|
||||
minikube uses Docker Machine to manage the Kubernetes VM so it benefits
|
||||
from the driver plugin architecture that Docker Machine uses to provide
|
||||
a consistent way to manage various VM providers.
|
|
@ -4,9 +4,9 @@ Section: base
|
|||
Priority: optional
|
||||
Architecture: amd64
|
||||
Recommends: virtualbox
|
||||
Maintainer: Aaron Prindle <aaprindle@gmail.com>
|
||||
Maintainer: Thomas Strömberg <t+minikube@stromberg.org>
|
||||
Description: Minikube
|
||||
Minikube is a tool that makes it easy to run Kubernetes locally.
|
||||
Minikube runs a single-node Kubernetes cluster inside a VM on your
|
||||
minikube is a tool that makes it easy to run Kubernetes locally.
|
||||
minikube runs a single-node Kubernetes cluster inside a VM on your
|
||||
laptop for users looking to try out Kubernetes or develop with it
|
||||
day-to-day.
|
||||
|
|
|
@ -0,0 +1,29 @@
|
|||
Name: docker-machine-driver-kvm2
|
||||
Version: --VERSION--
|
||||
Release: 0
|
||||
Summary: Machine driver for KVM
|
||||
License: ASL 2.0
|
||||
Group: Development/Tools
|
||||
URL: https://github.com/kubernetes/minikube
|
||||
#Requires: <determined automatically by rpm>
|
||||
|
||||
# Needed for older versions of RPM
|
||||
BuildRoot: %{_tmppath}%{name}-buildroot
|
||||
|
||||
%description
|
||||
Minikube uses Docker Machine to manage the Kubernetes VM so it benefits
|
||||
from the driver plugin architecture that Docker Machine uses to provide
|
||||
a consistent way to manage various VM providers.
|
||||
|
||||
%prep
|
||||
mkdir -p %{name}-%{version}
|
||||
cd %{name}-%{version}
|
||||
cp --OUT--/docker-machine-driver-kvm2 .
|
||||
|
||||
%install
|
||||
cd %{name}-%{version}
|
||||
mkdir -p %{buildroot}%{_bindir}
|
||||
install -m 755 docker-machine-driver-kvm2 %{buildroot}%{_bindir}/%{name}
|
||||
|
||||
%files
|
||||
%{_bindir}/%{name}
|
12
netlify.toml
12
netlify.toml
|
@ -1,17 +1,17 @@
|
|||
[build]
|
||||
base = "site/"
|
||||
publish = "site/public/"
|
||||
command = "hugo"
|
||||
command = "pwd && cd themes/docsy && git submodule update -f --init && cd ../.. && hugo"
|
||||
|
||||
[build.environment]
|
||||
HUGO_VERSION = "0.55.0"
|
||||
HUGO_VERSION = "0.55.6"
|
||||
|
||||
[context.production.environment]
|
||||
HUGO_ENV = "production"
|
||||
HUGO_BASEURL = "https://minikube.sigs.k8s.io/"
|
||||
|
||||
[context.deploy-preview]
|
||||
command = "hugo --enableGitInfo --buildFuture -b $DEPLOY_PRIME_URL"
|
||||
#[context.deploy-preview]
|
||||
#command = "hugo --enableGitInfo --buildFuture -b $DEPLOY_PRIME_URL"
|
||||
|
||||
[context.branch-deploy]
|
||||
command = "hugo --enableGitInfo --buildFuture -b $DEPLOY_PRIME_URL"
|
||||
#[context.branch-deploy]
|
||||
#command = "hugo --enableGitInfo --buildFuture -b $DEPLOY_PRIME_URL"
|
||||
|
|
|
@ -17,8 +17,10 @@ limitations under the License.
|
|||
package none
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"fmt"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/docker/machine/libmachine/drivers"
|
||||
"github.com/docker/machine/libmachine/state"
|
||||
|
@ -29,6 +31,7 @@ import (
|
|||
"k8s.io/minikube/pkg/minikube/command"
|
||||
"k8s.io/minikube/pkg/minikube/constants"
|
||||
"k8s.io/minikube/pkg/minikube/cruntime"
|
||||
"k8s.io/minikube/pkg/util"
|
||||
)
|
||||
|
||||
const driverName = constants.DriverNone
|
||||
|
@ -218,7 +221,29 @@ func (d *Driver) RunSSHCommandFromDriver() error {
|
|||
// stopKubelet idempotently stops the kubelet
|
||||
func stopKubelet(exec command.Runner) error {
|
||||
glog.Infof("stopping kubelet.service ...")
|
||||
return exec.Run("sudo systemctl stop kubelet.service")
|
||||
stop := func() error {
|
||||
cmdStop := "sudo systemctl stop kubelet.service"
|
||||
cmdCheck := "sudo systemctl show -p SubState kubelet"
|
||||
err := exec.Run(cmdStop)
|
||||
if err != nil {
|
||||
glog.Errorf("temporary error for %q : %v", cmdStop, err)
|
||||
}
|
||||
var out bytes.Buffer
|
||||
errStatus := exec.CombinedOutputTo(cmdCheck, &out)
|
||||
if errStatus != nil {
|
||||
glog.Errorf("temporary error: for %q : %v", cmdCheck, errStatus)
|
||||
}
|
||||
if !strings.Contains(out.String(), "dead") {
|
||||
return fmt.Errorf("expected to kubelet to be dead but it got : %q", out)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
if err := util.RetryAfter(3, stop, 2*time.Second); err != nil {
|
||||
return errors.Wrapf(err, "error stopping kubelet")
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// restartKubelet restarts the kubelet
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
Copyright 2018 The Kubernetes Authors All rights reserved.
|
||||
Copyright 2019 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.
|
||||
|
@ -14,6 +14,16 @@ See the License for the specific language governing permissions and
|
|||
limitations under the License.
|
||||
*/
|
||||
|
||||
package kvm
|
||||
package initflag
|
||||
|
||||
// doc...
|
||||
import (
|
||||
"flag"
|
||||
)
|
||||
|
||||
func init() {
|
||||
// Workaround for "ERROR: logging before flag.Parse"
|
||||
// See: https://github.com/kubernetes/kubernetes/issues/17162
|
||||
fs := flag.NewFlagSet("", flag.ContinueOnError)
|
||||
_ = fs.Parse([]string{})
|
||||
flag.CommandLine = fs
|
||||
}
|
|
@ -220,12 +220,6 @@ var Addons = map[string]*Addon{
|
|||
"ingress-dp.yaml",
|
||||
"0640",
|
||||
true),
|
||||
MustBinAsset(
|
||||
"deploy/addons/ingress/ingress-svc.yaml.tmpl",
|
||||
constants.AddonsPath,
|
||||
"ingress-svc.yaml",
|
||||
"0640",
|
||||
false),
|
||||
}, false, "ingress"),
|
||||
"metrics-server": NewAddon([]*BinAsset{
|
||||
MustBinAsset(
|
||||
|
|
|
@ -38,10 +38,10 @@ import (
|
|||
"k8s.io/minikube/pkg/minikube/bootstrapper"
|
||||
"k8s.io/minikube/pkg/minikube/command"
|
||||
"k8s.io/minikube/pkg/minikube/config"
|
||||
"k8s.io/minikube/pkg/minikube/console"
|
||||
"k8s.io/minikube/pkg/minikube/constants"
|
||||
"k8s.io/minikube/pkg/minikube/cruntime"
|
||||
"k8s.io/minikube/pkg/minikube/machine"
|
||||
"k8s.io/minikube/pkg/minikube/out"
|
||||
"k8s.io/minikube/pkg/util"
|
||||
)
|
||||
|
||||
|
@ -305,7 +305,7 @@ func (k *Bootstrapper) WaitCluster(k8s config.KubernetesConfig) error {
|
|||
// by a CNI plugin which is usually started after minikube has been brought
|
||||
// up. Otherwise, minikube won't start, as "k8s-app" pods are not ready.
|
||||
componentsOnly := k8s.NetworkPlugin == "cni"
|
||||
console.OutStyle(console.WaitingPods, "Verifying:")
|
||||
out.T(out.WaitingPods, "Waiting for:")
|
||||
client, err := util.GetClient()
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "k8s client")
|
||||
|
@ -313,7 +313,7 @@ func (k *Bootstrapper) WaitCluster(k8s config.KubernetesConfig) error {
|
|||
|
||||
// Wait until the apiserver can answer queries properly. We don't care if the apiserver
|
||||
// pod shows up as registered, but need the webserver for all subsequent queries.
|
||||
console.Out(" apiserver")
|
||||
out.String(" apiserver")
|
||||
if err := k.waitForAPIServer(k8s); err != nil {
|
||||
return errors.Wrap(err, "waiting for apiserver")
|
||||
}
|
||||
|
@ -323,13 +323,13 @@ func (k *Bootstrapper) WaitCluster(k8s config.KubernetesConfig) error {
|
|||
continue
|
||||
}
|
||||
|
||||
console.Out(" %s", p.name)
|
||||
out.String(" %s", p.name)
|
||||
selector := labels.SelectorFromSet(labels.Set(map[string]string{p.key: p.value}))
|
||||
if err := util.WaitForPodsWithLabelRunning(client, "kube-system", selector); err != nil {
|
||||
return errors.Wrap(err, fmt.Sprintf("waiting for %s=%s", p.key, p.value))
|
||||
}
|
||||
}
|
||||
console.OutLn("")
|
||||
out.Ln("")
|
||||
return nil
|
||||
}
|
||||
|
||||
|
@ -483,7 +483,7 @@ func (k *Bootstrapper) UpdateCluster(cfg config.KubernetesConfig) error {
|
|||
_, images := constants.GetKubeadmCachedImages(cfg.ImageRepository, cfg.KubernetesVersion)
|
||||
if cfg.ShouldLoadCachedImages {
|
||||
if err := machine.LoadImages(k.c, images, constants.ImageCacheDir); err != nil {
|
||||
console.Failure("Unable to load cached images: %v", err)
|
||||
out.FailureT("Unable to load cached images: {{.error}}", out.V{"error": err})
|
||||
}
|
||||
}
|
||||
r, err := cruntime.New(cruntime.Config{Type: cfg.ContainerRuntime, Socket: cfg.CRISocket})
|
||||
|
|
|
@ -111,28 +111,20 @@ func TestParseFeatureArgs(t *testing.T) {
|
|||
expectedComponentFeatureArgs string
|
||||
}{
|
||||
{
|
||||
description: "only kubeadm feature",
|
||||
featureGates: "Auditing=true,SelfHosting=false",
|
||||
description: "CoreDNS enabled",
|
||||
featureGates: "CoreDNS=true",
|
||||
expectedKubeadmFeatureArgs: map[string]bool{
|
||||
"Auditing": true,
|
||||
"SelfHosting": false,
|
||||
"CoreDNS": true,
|
||||
},
|
||||
expectedComponentFeatureArgs: "",
|
||||
},
|
||||
{
|
||||
description: "only component feature",
|
||||
featureGates: "PodPriority=true,Accelerators=false",
|
||||
expectedKubeadmFeatureArgs: map[string]bool{},
|
||||
expectedComponentFeatureArgs: "PodPriority=true,Accelerators=false",
|
||||
},
|
||||
{
|
||||
description: "between component and kubeadm feature",
|
||||
featureGates: "Auditing=true,PodPriority=true,SelfHosting=false,Accelerators=false",
|
||||
description: "CoreDNS disabled",
|
||||
featureGates: "CoreDNS=false",
|
||||
expectedKubeadmFeatureArgs: map[string]bool{
|
||||
"Auditing": true,
|
||||
"SelfHosting": false,
|
||||
"CoreDNS": false,
|
||||
},
|
||||
expectedComponentFeatureArgs: "PodPriority=true,Accelerators=false",
|
||||
expectedComponentFeatureArgs: "",
|
||||
},
|
||||
}
|
||||
|
||||
|
|
|
@ -20,6 +20,7 @@ import (
|
|||
"encoding/json"
|
||||
"flag"
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
"math"
|
||||
"net"
|
||||
"os/exec"
|
||||
|
@ -29,6 +30,7 @@ import (
|
|||
"time"
|
||||
|
||||
"github.com/docker/machine/libmachine"
|
||||
"github.com/docker/machine/libmachine/drivers"
|
||||
"github.com/docker/machine/libmachine/engine"
|
||||
"github.com/docker/machine/libmachine/host"
|
||||
"github.com/docker/machine/libmachine/mcnerror"
|
||||
|
@ -37,11 +39,14 @@ import (
|
|||
"github.com/docker/machine/libmachine/state"
|
||||
"github.com/golang/glog"
|
||||
"github.com/pkg/errors"
|
||||
"github.com/shirou/gopsutil/cpu"
|
||||
"github.com/shirou/gopsutil/disk"
|
||||
"github.com/shirou/gopsutil/mem"
|
||||
"github.com/spf13/viper"
|
||||
cfg "k8s.io/minikube/pkg/minikube/config"
|
||||
"k8s.io/minikube/pkg/minikube/console"
|
||||
"k8s.io/minikube/pkg/minikube/constants"
|
||||
"k8s.io/minikube/pkg/minikube/exit"
|
||||
"k8s.io/minikube/pkg/minikube/out"
|
||||
"k8s.io/minikube/pkg/minikube/registry"
|
||||
"k8s.io/minikube/pkg/util"
|
||||
pkgutil "k8s.io/minikube/pkg/util"
|
||||
|
@ -72,12 +77,10 @@ func init() {
|
|||
|
||||
// CacheISO downloads and caches ISO.
|
||||
func CacheISO(config cfg.MachineConfig) error {
|
||||
if config.VMDriver != constants.DriverNone {
|
||||
if err := config.Downloader.CacheMinikubeISOFromURL(config.MinikubeISO); err != nil {
|
||||
return err
|
||||
}
|
||||
if localDriver(config.VMDriver) {
|
||||
return nil
|
||||
}
|
||||
return nil
|
||||
return config.Downloader.CacheMinikubeISOFromURL(config.MinikubeISO)
|
||||
}
|
||||
|
||||
// StartHost starts a host VM.
|
||||
|
@ -100,14 +103,14 @@ func StartHost(api libmachine.API, config cfg.MachineConfig) (*host.Host, error)
|
|||
}
|
||||
|
||||
if h.Driver.DriverName() != config.VMDriver {
|
||||
console.Out("\n")
|
||||
console.Warning("Ignoring --vm-driver=%s, as the existing %q VM was created using the %s driver.",
|
||||
config.VMDriver, cfg.GetMachineName(), h.Driver.DriverName())
|
||||
console.Warning("To switch drivers, you may create a new VM using `minikube start -p <name> --vm-driver=%s`", config.VMDriver)
|
||||
console.Warning("Alternatively, you may delete the existing VM using `minikube delete -p %s`", cfg.GetMachineName())
|
||||
console.Out("\n")
|
||||
out.T(out.Empty, "\n")
|
||||
out.WarningT(`Ignoring --vm-driver={{.driver_name}}, as the existing "{{.profile_name}}" VM was created using the {{.driver_name2}} driver.`,
|
||||
out.V{"driver_name": config.VMDriver, "profile_name": cfg.GetMachineName(), "driver_name2": h.Driver.DriverName()})
|
||||
out.WarningT("To switch drivers, you may create a new VM using `minikube start -p <name> --vm-driver={{.driver_name}}`", out.V{"driver_name": config.VMDriver})
|
||||
out.WarningT("Alternatively, you may delete the existing VM using `minikube delete -p {{.profile_name}}`", out.V{"profile_name": cfg.GetMachineName()})
|
||||
out.T(out.Empty, "\n")
|
||||
} else if exists && cfg.GetMachineName() == constants.DefaultMachineName {
|
||||
console.OutStyle(console.Tip, "Tip: Use 'minikube start -p <name>' to create a new cluster, or 'minikube delete' to delete this one.")
|
||||
out.T(out.Tip, "Tip: Use 'minikube start -p <name>' to create a new cluster, or 'minikube delete' to delete this one.")
|
||||
}
|
||||
|
||||
s, err := h.Driver.GetState()
|
||||
|
@ -117,9 +120,9 @@ func StartHost(api libmachine.API, config cfg.MachineConfig) (*host.Host, error)
|
|||
}
|
||||
|
||||
if s == state.Running {
|
||||
console.OutStyle(console.Running, "Re-using the currently running %s VM for %q ...", h.Driver.DriverName(), cfg.GetMachineName())
|
||||
out.T(out.Running, `Using the running {{.driver_name}} "{{.profile_name}}" VM ...`, out.V{"driver_name": h.Driver.DriverName(), "profile_name": cfg.GetMachineName()})
|
||||
} else {
|
||||
console.OutStyle(console.Restarting, "Restarting existing %s VM for %q ...", h.Driver.DriverName(), cfg.GetMachineName())
|
||||
out.T(out.Restarting, `Starting existing {{.driver_name}} VM for "{{.profile_name}}" ...`, out.V{"driver_name": h.Driver.DriverName(), "profile_name": cfg.GetMachineName()})
|
||||
if err := h.Driver.Start(); err != nil {
|
||||
return nil, errors.Wrap(err, "start")
|
||||
}
|
||||
|
@ -131,6 +134,7 @@ func StartHost(api libmachine.API, config cfg.MachineConfig) (*host.Host, error)
|
|||
e := engineOptions(config)
|
||||
glog.Infof("engine options: %+v", e)
|
||||
|
||||
out.T(out.Waiting, "Waiting for the host to be provisioned ...")
|
||||
err = configureHost(h, e)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
|
@ -138,23 +142,32 @@ func StartHost(api libmachine.API, config cfg.MachineConfig) (*host.Host, error)
|
|||
return h, nil
|
||||
}
|
||||
|
||||
// localDriver returns whether or not the driver should be considered local
|
||||
func localDriver(name string) bool {
|
||||
if name == constants.DriverNone || name == constants.DriverMock {
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
// configureHost handles any post-powerup configuration required
|
||||
func configureHost(h *host.Host, e *engine.Options) error {
|
||||
// Slightly counter-intuitive, but this is what DetectProvisioner & ConfigureAuth block on.
|
||||
console.OutStyle(console.Waiting, "Waiting for SSH access ...")
|
||||
|
||||
glog.Infof("configureHost: %T %+v", h, h)
|
||||
if len(e.Env) > 0 {
|
||||
h.HostOptions.EngineOptions.Env = e.Env
|
||||
glog.Infof("Detecting provisioner ...")
|
||||
provisioner, err := provision.DetectProvisioner(h.Driver)
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "detecting provisioner")
|
||||
}
|
||||
glog.Infof("Provisioning: %+v", *h.HostOptions)
|
||||
if err := provisioner.Provision(*h.HostOptions.SwarmOptions, *h.HostOptions.AuthOptions, *h.HostOptions.EngineOptions); err != nil {
|
||||
return errors.Wrap(err, "provision")
|
||||
}
|
||||
}
|
||||
|
||||
if h.Driver.DriverName() != constants.DriverNone {
|
||||
if !localDriver(h.Driver.DriverName()) {
|
||||
glog.Infof("Configuring auth for driver %s ...", h.Driver.DriverName())
|
||||
if err := h.ConfigureAuth(); err != nil {
|
||||
return &util.RetriableError{Err: errors.Wrap(err, "Error configuring auth on host")}
|
||||
}
|
||||
|
@ -213,21 +226,22 @@ func adjustGuestClock(h hostRunner, t time.Time) error {
|
|||
}
|
||||
|
||||
// trySSHPowerOff runs the poweroff command on the guest VM to speed up deletion
|
||||
func trySSHPowerOff(h *host.Host) {
|
||||
func trySSHPowerOff(h *host.Host) error {
|
||||
s, err := h.Driver.GetState()
|
||||
if err != nil {
|
||||
glog.Warningf("unable to get state: %v", err)
|
||||
return
|
||||
return err
|
||||
}
|
||||
if s != state.Running {
|
||||
glog.Infof("host is in state %s", s)
|
||||
return
|
||||
return nil
|
||||
}
|
||||
|
||||
console.OutStyle(console.Shutdown, "Powering off %q via SSH ...", cfg.GetMachineName())
|
||||
out.T(out.Shutdown, `Powering off "{{.profile_name}}" via SSH ...`, out.V{"profile_name": cfg.GetMachineName()})
|
||||
out, err := h.RunSSHCommand("sudo poweroff")
|
||||
// poweroff always results in an error, since the host disconnects.
|
||||
glog.Infof("poweroff result: out=%s, err=%v", out, err)
|
||||
return nil
|
||||
}
|
||||
|
||||
// StopHost stops the host VM, saving state to disk.
|
||||
|
@ -236,7 +250,15 @@ func StopHost(api libmachine.API) error {
|
|||
if err != nil {
|
||||
return errors.Wrapf(err, "load")
|
||||
}
|
||||
console.OutStyle(console.Stopping, "Stopping %q in %s ...", cfg.GetMachineName(), host.DriverName)
|
||||
|
||||
out.T(out.Stopping, `Stopping "{{.profile_name}}" in {{.driver_name}} ...`, out.V{"profile_name": cfg.GetMachineName(), "driver_name": host.DriverName})
|
||||
if host.DriverName == constants.DriverHyperv {
|
||||
glog.Infof("As there are issues with stopping Hyper-V VMs using API, trying to shut down using SSH")
|
||||
if err := trySSHPowerOff(host); err != nil {
|
||||
return errors.Wrap(err, "ssh power off")
|
||||
}
|
||||
}
|
||||
|
||||
if err := host.Stop(); err != nil {
|
||||
alreadyInStateError, ok := err.(mcnerror.ErrHostAlreadyInState)
|
||||
if ok && alreadyInStateError.State == state.Stopped {
|
||||
|
@ -255,10 +277,12 @@ func DeleteHost(api libmachine.API) error {
|
|||
}
|
||||
// This is slow if SSH is not responding, but HyperV hangs otherwise, See issue #2914
|
||||
if host.Driver.DriverName() == constants.DriverHyperv {
|
||||
trySSHPowerOff(host)
|
||||
if err := trySSHPowerOff(host); err != nil {
|
||||
glog.Infof("Unable to power off minikube because the host was not found.")
|
||||
}
|
||||
}
|
||||
|
||||
console.OutStyle(console.DeletingHost, "Deleting %q from %s ...", cfg.GetMachineName(), host.DriverName)
|
||||
out.T(out.DeletingHost, `Deleting "{{.profile_name}}" in {{.driver_name}} ...`, out.V{"profile_name": cfg.GetMachineName(), "driver_name": host.DriverName})
|
||||
if err := host.Driver.Remove(); err != nil {
|
||||
return errors.Wrap(err, "host remove")
|
||||
}
|
||||
|
@ -318,41 +342,96 @@ func engineOptions(config cfg.MachineConfig) *engine.Options {
|
|||
return &o
|
||||
}
|
||||
|
||||
func preCreateHost(config *cfg.MachineConfig) {
|
||||
switch config.VMDriver {
|
||||
case constants.DriverKvmOld:
|
||||
if viper.GetBool(cfg.ShowDriverDeprecationNotification) {
|
||||
console.Warning(`The kvm driver is deprecated and support for it will be removed in a future release.
|
||||
Please consider switching to the kvm2 driver, which is intended to replace the kvm driver.
|
||||
See https://github.com/kubernetes/minikube/blob/master/docs/drivers.md#kvm2-driver for more information.
|
||||
To disable this message, run [minikube config set ShowDriverDeprecationNotification false]`)
|
||||
}
|
||||
case constants.DriverXhyve:
|
||||
if viper.GetBool(cfg.ShowDriverDeprecationNotification) {
|
||||
console.Warning(`The xhyve driver is deprecated and support for it will be removed in a future release.
|
||||
Please consider switching to the hyperkit driver, which is intended to replace the xhyve driver.
|
||||
See https://github.com/kubernetes/minikube/blob/master/docs/drivers.md#hyperkit-driver for more information.
|
||||
To disable this message, run [minikube config set ShowDriverDeprecationNotification false]`)
|
||||
}
|
||||
case constants.DriverVmwareFusion:
|
||||
if viper.GetBool(cfg.ShowDriverDeprecationNotification) {
|
||||
console.Warning(`The vmwarefusion driver is deprecated and support for it will be removed in a future release.
|
||||
Please consider switching to the new vmware unified driver, which is intended to replace the vmwarefusion driver.
|
||||
See https://github.com/kubernetes/minikube/blob/master/docs/drivers.md#vmware-unified-driver for more information.
|
||||
To disable this message, run [minikube config set ShowDriverDeprecationNotification false]`)
|
||||
}
|
||||
type hostInfo struct {
|
||||
Memory int
|
||||
CPUs int
|
||||
DiskSize int
|
||||
}
|
||||
|
||||
func megs(bytes uint64) int {
|
||||
return int(bytes / 1024 / 1024)
|
||||
}
|
||||
|
||||
func getHostInfo() (*hostInfo, error) {
|
||||
i, err := cpu.Info()
|
||||
if err != nil {
|
||||
glog.Warningf("Unable to get cpu info: %v", err)
|
||||
return nil, err
|
||||
}
|
||||
v, err := mem.VirtualMemory()
|
||||
if err != nil {
|
||||
glog.Warningf("Unable to get mem info: %v", err)
|
||||
return nil, err
|
||||
}
|
||||
d, err := disk.Usage("/")
|
||||
if err != nil {
|
||||
glog.Warningf("Unable to get disk info: %v", err)
|
||||
return nil, err
|
||||
}
|
||||
|
||||
var info hostInfo
|
||||
info.CPUs = len(i)
|
||||
info.Memory = megs(v.Total)
|
||||
info.DiskSize = megs(d.Total)
|
||||
return &info, nil
|
||||
}
|
||||
|
||||
// showLocalOsRelease shows systemd information about the current linux distribution, on the local host
|
||||
func showLocalOsRelease() {
|
||||
osReleaseOut, err := ioutil.ReadFile("/etc/os-release")
|
||||
if err != nil {
|
||||
glog.Errorf("ReadFile: %v", err)
|
||||
return
|
||||
}
|
||||
|
||||
osReleaseInfo, err := provision.NewOsRelease(osReleaseOut)
|
||||
if err != nil {
|
||||
glog.Errorf("NewOsRelease: %v", err)
|
||||
return
|
||||
}
|
||||
|
||||
out.T(out.Provisioner, "OS release is {{.pretty_name}}", out.V{"pretty_name": osReleaseInfo.PrettyName})
|
||||
}
|
||||
|
||||
// showRemoteOsRelease shows systemd information about the current linux distribution, on the remote VM
|
||||
func showRemoteOsRelease(driver drivers.Driver) {
|
||||
provisioner, err := provision.DetectProvisioner(driver)
|
||||
if err != nil {
|
||||
glog.Errorf("DetectProvisioner: %v", err)
|
||||
return
|
||||
}
|
||||
|
||||
osReleaseInfo, err := provisioner.GetOsReleaseInfo()
|
||||
if err != nil {
|
||||
glog.Errorf("GetOsReleaseInfo: %v", err)
|
||||
return
|
||||
}
|
||||
|
||||
glog.Infof("Provisioned with %s", osReleaseInfo.PrettyName)
|
||||
}
|
||||
|
||||
func createHost(api libmachine.API, config cfg.MachineConfig) (*host.Host, error) {
|
||||
preCreateHost(&config)
|
||||
console.OutStyle(console.StartingVM, "Creating %s VM (CPUs=%d, Memory=%dMB, Disk=%dMB) ...", config.VMDriver, config.CPUs, config.Memory, config.DiskSize)
|
||||
if config.VMDriver == constants.DriverVmwareFusion && viper.GetBool(cfg.ShowDriverDeprecationNotification) {
|
||||
out.WarningT(`The vmwarefusion driver is deprecated and support for it will be removed in a future release.
|
||||
Please consider switching to the new vmware unified driver, which is intended to replace the vmwarefusion driver.
|
||||
See https://github.com/kubernetes/minikube/blob/master/docs/drivers.md#vmware-unified-driver for more information.
|
||||
To disable this message, run [minikube config set ShowDriverDeprecationNotification false]`)
|
||||
}
|
||||
if !localDriver(config.VMDriver) {
|
||||
out.T(out.StartingVM, "Creating {{.driver_name}} VM (CPUs={{.number_of_cpus}}, Memory={{.memory_size}}MB, Disk={{.disk_size}}MB) ...", out.V{"driver_name": config.VMDriver, "number_of_cpus": config.CPUs, "memory_size": config.Memory, "disk_size": config.DiskSize})
|
||||
} else {
|
||||
info, err := getHostInfo()
|
||||
if err == nil {
|
||||
out.T(out.StartingNone, "Running on localhost (CPUs={{.number_of_cpus}}, Memory={{.memory_size}}MB, Disk={{.disk_size}}MB) ...", out.V{"number_of_cpus": info.CPUs, "memory_size": info.Memory, "disk_size": info.DiskSize})
|
||||
}
|
||||
}
|
||||
|
||||
def, err := registry.Driver(config.VMDriver)
|
||||
if err != nil {
|
||||
if err == registry.ErrDriverNotFound {
|
||||
exit.Usage("unsupported driver: %s", config.VMDriver)
|
||||
return nil, fmt.Errorf("unsupported driver: %s", config.VMDriver)
|
||||
}
|
||||
exit.WithError("error getting driver", err)
|
||||
return nil, errors.Wrap(err, "error getting driver")
|
||||
}
|
||||
|
||||
driver := def.ConfigCreator(config)
|
||||
|
@ -376,6 +455,12 @@ func createHost(api libmachine.API, config cfg.MachineConfig) (*host.Host, error
|
|||
return nil, errors.Wrap(err, "create")
|
||||
}
|
||||
|
||||
if !localDriver(config.VMDriver) {
|
||||
showRemoteOsRelease(h.Driver)
|
||||
} else {
|
||||
showLocalOsRelease()
|
||||
}
|
||||
|
||||
if err := api.Save(h); err != nil {
|
||||
return nil, errors.Wrap(err, "save")
|
||||
}
|
||||
|
@ -407,8 +492,6 @@ func GetHostDockerEnv(api libmachine.API) (map[string]string, error) {
|
|||
// GetVMHostIP gets the ip address to be used for mapping host -> VM and VM -> host
|
||||
func GetVMHostIP(host *host.Host) (net.IP, error) {
|
||||
switch host.DriverName {
|
||||
case constants.DriverKvmOld:
|
||||
return net.ParseIP("192.168.42.1"), nil
|
||||
case constants.DriverKvm2:
|
||||
return net.ParseIP("192.168.39.1"), nil
|
||||
case constants.DriverHyperv:
|
||||
|
@ -432,7 +515,7 @@ func GetVMHostIP(host *host.Host) (net.IP, error) {
|
|||
return []byte{}, errors.Wrap(err, "Error getting VM/Host IP address")
|
||||
}
|
||||
return ip, nil
|
||||
case constants.DriverXhyve, constants.DriverHyperkit:
|
||||
case constants.DriverHyperkit:
|
||||
return net.ParseIP("192.168.64.1"), nil
|
||||
case constants.DriverVmware:
|
||||
vmIPString, err := host.Driver.GetIP()
|
||||
|
@ -512,6 +595,6 @@ func EnsureMinikubeRunningOrExit(api libmachine.API, exitStatus int) {
|
|||
exit.WithError("Error getting machine status", err)
|
||||
}
|
||||
if s != state.Running.String() {
|
||||
exit.WithCode(exit.Unavailable, "minikube is not running, so the service cannot be accessed")
|
||||
exit.WithCodeT(exit.Unavailable, "minikube is not running, so the service cannot be accessed")
|
||||
}
|
||||
}
|
||||
|
|
|
@ -37,14 +37,40 @@ type MockDownloader struct{}
|
|||
func (d MockDownloader) GetISOFileURI(isoURL string) string { return "" }
|
||||
func (d MockDownloader) CacheMinikubeISOFromURL(isoURL string) error { return nil }
|
||||
|
||||
func createMockDriverHost(c config.MachineConfig) interface{} {
|
||||
return nil
|
||||
}
|
||||
|
||||
func RegisterMockDriver(t *testing.T) {
|
||||
t.Helper()
|
||||
_, err := registry.Driver(constants.DriverMock)
|
||||
// Already registered
|
||||
if err == nil {
|
||||
return
|
||||
}
|
||||
err = registry.Register(registry.DriverDef{
|
||||
Name: constants.DriverMock,
|
||||
Builtin: true,
|
||||
ConfigCreator: createMockDriverHost,
|
||||
DriverCreator: func() drivers.Driver {
|
||||
return &tests.MockDriver{T: t}
|
||||
},
|
||||
})
|
||||
if err != nil {
|
||||
t.Fatalf("register failed: %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
var defaultMachineConfig = config.MachineConfig{
|
||||
VMDriver: constants.DefaultVMDriver,
|
||||
VMDriver: constants.DriverMock,
|
||||
MinikubeISO: constants.DefaultISOURL,
|
||||
Downloader: MockDownloader{},
|
||||
DockerEnv: []string{"MOCK_MAKE_IT_PROVISION=true"},
|
||||
}
|
||||
|
||||
func TestCreateHost(t *testing.T) {
|
||||
api := tests.NewMockAPI()
|
||||
RegisterMockDriver(t)
|
||||
api := tests.NewMockAPI(t)
|
||||
|
||||
exists, _ := api.Exists(config.GetMachineName())
|
||||
if exists {
|
||||
|
@ -54,9 +80,12 @@ func TestCreateHost(t *testing.T) {
|
|||
if err != nil {
|
||||
t.Fatalf("Error creating host: %v", err)
|
||||
}
|
||||
exists, _ = api.Exists(config.GetMachineName())
|
||||
exists, err = api.Exists(config.GetMachineName())
|
||||
if err != nil {
|
||||
t.Fatalf("exists failed for %q: %v", config.GetMachineName(), err)
|
||||
}
|
||||
if !exists {
|
||||
t.Fatal("Machine does not exist, but should.")
|
||||
t.Fatalf("%q does not exist, but should.", config.GetMachineName())
|
||||
}
|
||||
|
||||
h, err := api.Load(config.GetMachineName())
|
||||
|
@ -82,7 +111,8 @@ func TestCreateHost(t *testing.T) {
|
|||
}
|
||||
|
||||
func TestStartHostExists(t *testing.T) {
|
||||
api := tests.NewMockAPI()
|
||||
RegisterMockDriver(t)
|
||||
api := tests.NewMockAPI(t)
|
||||
// Create an initial host.
|
||||
_, err := createHost(api, defaultMachineConfig)
|
||||
if err != nil {
|
||||
|
@ -101,10 +131,10 @@ func TestStartHostExists(t *testing.T) {
|
|||
// This should pass without calling Create because the host exists already.
|
||||
h, err := StartHost(api, defaultMachineConfig)
|
||||
if err != nil {
|
||||
t.Fatal("Error starting host.")
|
||||
t.Fatalf("Error starting host: %v", err)
|
||||
}
|
||||
if h.Name != config.GetMachineName() {
|
||||
t.Fatalf("Machine created with incorrect name: %s", h.Name)
|
||||
t.Fatalf("GetMachineName()=%q, want %q", config.GetMachineName(), h.Name)
|
||||
}
|
||||
if s, _ := h.Driver.GetState(); s != state.Running {
|
||||
t.Fatalf("Machine not started.")
|
||||
|
@ -115,13 +145,14 @@ func TestStartHostExists(t *testing.T) {
|
|||
}
|
||||
|
||||
func TestStartStoppedHost(t *testing.T) {
|
||||
api := tests.NewMockAPI()
|
||||
RegisterMockDriver(t)
|
||||
api := tests.NewMockAPI(t)
|
||||
// Create an initial host.
|
||||
h, err := createHost(api, defaultMachineConfig)
|
||||
if err != nil {
|
||||
t.Fatalf("Error creating host: %v", err)
|
||||
}
|
||||
d := tests.MockDriver{}
|
||||
d := tests.MockDriver{T: t}
|
||||
h.Driver = &d
|
||||
d.CurrentState = state.Stopped
|
||||
|
||||
|
@ -149,7 +180,8 @@ func TestStartStoppedHost(t *testing.T) {
|
|||
}
|
||||
|
||||
func TestStartHost(t *testing.T) {
|
||||
api := tests.NewMockAPI()
|
||||
RegisterMockDriver(t)
|
||||
api := tests.NewMockAPI(t)
|
||||
|
||||
md := &tests.MockDetector{Provisioner: &tests.MockProvisioner{}}
|
||||
provision.SetDetector(md)
|
||||
|
@ -159,7 +191,7 @@ func TestStartHost(t *testing.T) {
|
|||
t.Fatal("Error starting host.")
|
||||
}
|
||||
if h.Name != config.GetMachineName() {
|
||||
t.Fatalf("Machine created with incorrect name: %s", h.Name)
|
||||
t.Fatalf("GetMachineName()=%q, want %q", config.GetMachineName(), h.Name)
|
||||
}
|
||||
if exists, _ := api.Exists(h.Name); !exists {
|
||||
t.Fatal("Machine not saved.")
|
||||
|
@ -176,7 +208,8 @@ func TestStartHost(t *testing.T) {
|
|||
}
|
||||
|
||||
func TestStartHostConfig(t *testing.T) {
|
||||
api := tests.NewMockAPI()
|
||||
RegisterMockDriver(t)
|
||||
api := tests.NewMockAPI(t)
|
||||
|
||||
md := &tests.MockDetector{Provisioner: &tests.MockProvisioner{}}
|
||||
provision.SetDetector(md)
|
||||
|
@ -208,14 +241,16 @@ func TestStartHostConfig(t *testing.T) {
|
|||
}
|
||||
|
||||
func TestStopHostError(t *testing.T) {
|
||||
api := tests.NewMockAPI()
|
||||
RegisterMockDriver(t)
|
||||
api := tests.NewMockAPI(t)
|
||||
if err := StopHost(api); err == nil {
|
||||
t.Fatal("An error should be thrown when stopping non-existing machine.")
|
||||
}
|
||||
}
|
||||
|
||||
func TestStopHost(t *testing.T) {
|
||||
api := tests.NewMockAPI()
|
||||
RegisterMockDriver(t)
|
||||
api := tests.NewMockAPI(t)
|
||||
h, err := createHost(api, defaultMachineConfig)
|
||||
if err != nil {
|
||||
t.Errorf("createHost failed: %v", err)
|
||||
|
@ -230,7 +265,8 @@ func TestStopHost(t *testing.T) {
|
|||
}
|
||||
|
||||
func TestDeleteHost(t *testing.T) {
|
||||
api := tests.NewMockAPI()
|
||||
RegisterMockDriver(t)
|
||||
api := tests.NewMockAPI(t)
|
||||
if _, err := createHost(api, defaultMachineConfig); err != nil {
|
||||
t.Errorf("createHost failed: %v", err)
|
||||
}
|
||||
|
@ -241,14 +277,14 @@ func TestDeleteHost(t *testing.T) {
|
|||
}
|
||||
|
||||
func TestDeleteHostErrorDeletingVM(t *testing.T) {
|
||||
api := tests.NewMockAPI()
|
||||
RegisterMockDriver(t)
|
||||
api := tests.NewMockAPI(t)
|
||||
h, err := createHost(api, defaultMachineConfig)
|
||||
if err != nil {
|
||||
t.Errorf("createHost failed: %v", err)
|
||||
}
|
||||
|
||||
d := &tests.MockDriver{RemoveError: true}
|
||||
|
||||
d := &tests.MockDriver{RemoveError: true, T: t}
|
||||
h.Driver = d
|
||||
|
||||
if err := DeleteHost(api); err == nil {
|
||||
|
@ -257,7 +293,8 @@ func TestDeleteHostErrorDeletingVM(t *testing.T) {
|
|||
}
|
||||
|
||||
func TestDeleteHostErrorDeletingFiles(t *testing.T) {
|
||||
api := tests.NewMockAPI()
|
||||
RegisterMockDriver(t)
|
||||
api := tests.NewMockAPI(t)
|
||||
api.RemoveError = true
|
||||
if _, err := createHost(api, defaultMachineConfig); err != nil {
|
||||
t.Errorf("createHost failed: %v", err)
|
||||
|
@ -269,7 +306,8 @@ func TestDeleteHostErrorDeletingFiles(t *testing.T) {
|
|||
}
|
||||
|
||||
func TestGetHostStatus(t *testing.T) {
|
||||
api := tests.NewMockAPI()
|
||||
RegisterMockDriver(t)
|
||||
api := tests.NewMockAPI(t)
|
||||
|
||||
checkState := func(expected string) {
|
||||
s, err := GetHostStatus(api)
|
||||
|
@ -296,10 +334,11 @@ func TestGetHostStatus(t *testing.T) {
|
|||
}
|
||||
|
||||
func TestGetHostDockerEnv(t *testing.T) {
|
||||
RegisterMockDriver(t)
|
||||
tempDir := tests.MakeTempDir()
|
||||
defer os.RemoveAll(tempDir)
|
||||
|
||||
api := tests.NewMockAPI()
|
||||
api := tests.NewMockAPI(t)
|
||||
h, err := createHost(api, defaultMachineConfig)
|
||||
if err != nil {
|
||||
t.Fatalf("Error creating host: %v", err)
|
||||
|
@ -308,6 +347,7 @@ func TestGetHostDockerEnv(t *testing.T) {
|
|||
BaseDriver: drivers.BaseDriver{
|
||||
IPAddress: "127.0.0.1",
|
||||
},
|
||||
T: t,
|
||||
}
|
||||
h.Driver = d
|
||||
|
||||
|
@ -332,7 +372,7 @@ func TestGetHostDockerEnvIPv6(t *testing.T) {
|
|||
tempDir := tests.MakeTempDir()
|
||||
defer os.RemoveAll(tempDir)
|
||||
|
||||
api := tests.NewMockAPI()
|
||||
api := tests.NewMockAPI(t)
|
||||
h, err := createHost(api, defaultMachineConfig)
|
||||
if err != nil {
|
||||
t.Fatalf("Error creating host: %v", err)
|
||||
|
@ -341,6 +381,7 @@ func TestGetHostDockerEnvIPv6(t *testing.T) {
|
|||
BaseDriver: drivers.BaseDriver{
|
||||
IPAddress: "fe80::215:5dff:fe00:a903",
|
||||
},
|
||||
T: t,
|
||||
}
|
||||
h.Driver = d
|
||||
|
||||
|
@ -357,9 +398,9 @@ func TestGetHostDockerEnvIPv6(t *testing.T) {
|
|||
}
|
||||
|
||||
func TestCreateSSHShell(t *testing.T) {
|
||||
api := tests.NewMockAPI()
|
||||
api := tests.NewMockAPI(t)
|
||||
|
||||
s, _ := tests.NewSSHServer()
|
||||
s, _ := tests.NewSSHServer(t)
|
||||
port, err := s.Start()
|
||||
if err != nil {
|
||||
t.Fatalf("Error starting ssh server: %v", err)
|
||||
|
@ -372,6 +413,7 @@ func TestCreateSSHShell(t *testing.T) {
|
|||
IPAddress: "127.0.0.1",
|
||||
SSHKeyPath: "",
|
||||
},
|
||||
T: t,
|
||||
}
|
||||
api.Hosts[config.GetMachineName()] = &host.Host{Driver: d}
|
||||
|
||||
|
|
|
@ -20,12 +20,10 @@ import (
|
|||
// Import all the default drivers
|
||||
_ "k8s.io/minikube/pkg/minikube/drivers/hyperkit"
|
||||
_ "k8s.io/minikube/pkg/minikube/drivers/hyperv"
|
||||
_ "k8s.io/minikube/pkg/minikube/drivers/kvm"
|
||||
_ "k8s.io/minikube/pkg/minikube/drivers/kvm2"
|
||||
_ "k8s.io/minikube/pkg/minikube/drivers/none"
|
||||
_ "k8s.io/minikube/pkg/minikube/drivers/parallels"
|
||||
_ "k8s.io/minikube/pkg/minikube/drivers/virtualbox"
|
||||
_ "k8s.io/minikube/pkg/minikube/drivers/vmware"
|
||||
_ "k8s.io/minikube/pkg/minikube/drivers/vmwarefusion"
|
||||
_ "k8s.io/minikube/pkg/minikube/drivers/xhyve"
|
||||
)
|
||||
|
|
|
@ -50,6 +50,11 @@ const (
|
|||
ShowBootstrapperDeprecationNotification = "ShowBootstrapperDeprecationNotification"
|
||||
)
|
||||
|
||||
var (
|
||||
// ErrKeyNotFound is the error returned when a key doesn't exist in the config file
|
||||
ErrKeyNotFound = errors.New("specified key could not be found in config")
|
||||
)
|
||||
|
||||
// MinikubeConfig represents minikube config
|
||||
type MinikubeConfig map[string]interface{}
|
||||
|
||||
|
@ -66,12 +71,30 @@ func get(name string, config MinikubeConfig) (string, error) {
|
|||
if val, ok := config[name]; ok {
|
||||
return fmt.Sprintf("%v", val), nil
|
||||
}
|
||||
return "", errors.New("specified key could not be found in config")
|
||||
return "", ErrKeyNotFound
|
||||
}
|
||||
|
||||
// WriteConfig writes a minikube config to the JSON file
|
||||
func WriteConfig(configFile string, m MinikubeConfig) error {
|
||||
f, err := os.Create(configFile)
|
||||
if err != nil {
|
||||
return fmt.Errorf("create %s: %s", configFile, err)
|
||||
}
|
||||
defer f.Close()
|
||||
err = encode(f, m)
|
||||
if err != nil {
|
||||
return fmt.Errorf("encode %s: %s", configFile, err)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// ReadConfig reads in the JSON minikube config
|
||||
func ReadConfig() (MinikubeConfig, error) {
|
||||
f, err := os.Open(constants.ConfigFile)
|
||||
return readConfig(constants.ConfigFile)
|
||||
}
|
||||
|
||||
func readConfig(configFile string) (MinikubeConfig, error) {
|
||||
f, err := os.Open(configFile)
|
||||
if err != nil {
|
||||
if os.IsNotExist(err) {
|
||||
return make(map[string]interface{}), nil
|
||||
|
@ -94,8 +117,20 @@ func decode(r io.Reader) (MinikubeConfig, error) {
|
|||
return data, err
|
||||
}
|
||||
|
||||
func encode(w io.Writer, m MinikubeConfig) error {
|
||||
b, err := json.MarshalIndent(m, "", " ")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
_, err = w.Write(b)
|
||||
|
||||
return err
|
||||
}
|
||||
|
||||
// GetMachineName gets the machine name for the VM
|
||||
func GetMachineName() string {
|
||||
// REFACTOR NECESSARY: This function should not rely on globals.
|
||||
if viper.GetString(MachineProfile) == "" {
|
||||
return constants.DefaultMachineName
|
||||
}
|
||||
|
@ -109,7 +144,7 @@ func Load() (*Config, error) {
|
|||
|
||||
// Loader loads the kubernetes and machine config based on the machine profile name
|
||||
type Loader interface {
|
||||
LoadConfigFromFile(profile string) (*Config, error)
|
||||
LoadConfigFromFile(profile string, miniHome ...string) (*Config, error)
|
||||
}
|
||||
|
||||
type simpleConfigLoader struct{}
|
||||
|
@ -117,10 +152,10 @@ type simpleConfigLoader struct{}
|
|||
// DefaultLoader is the default config loader
|
||||
var DefaultLoader Loader = &simpleConfigLoader{}
|
||||
|
||||
func (c *simpleConfigLoader) LoadConfigFromFile(profile string) (*Config, error) {
|
||||
func (c *simpleConfigLoader) LoadConfigFromFile(profile string, miniHome ...string) (*Config, error) {
|
||||
var cc Config
|
||||
|
||||
path := constants.GetProfileFile(profile)
|
||||
path := constants.GetProfileFile(profile, miniHome...)
|
||||
|
||||
if _, err := os.Stat(path); os.IsNotExist(err) {
|
||||
return nil, err
|
||||
|
|
|
@ -18,6 +18,8 @@ package config
|
|||
|
||||
import (
|
||||
"bytes"
|
||||
"io/ioutil"
|
||||
"os"
|
||||
"reflect"
|
||||
"testing"
|
||||
|
||||
|
@ -46,10 +48,10 @@ var configTestCases = []configTestCase{
|
|||
"log_dir": "/etc/hosts",
|
||||
"show-libmachine-logs": true,
|
||||
"v": 5,
|
||||
"vm-driver": "kvm"
|
||||
"vm-driver": "kvm2"
|
||||
}`,
|
||||
config: map[string]interface{}{
|
||||
"vm-driver": constants.DriverKvmOld,
|
||||
"vm-driver": constants.DriverKvm2,
|
||||
"cpus": 4,
|
||||
"disk-size": "20g",
|
||||
"v": 5,
|
||||
|
@ -60,7 +62,7 @@ var configTestCases = []configTestCase{
|
|||
},
|
||||
}
|
||||
|
||||
func TestReadConfig(t *testing.T) {
|
||||
func Test_decode(t *testing.T) {
|
||||
for _, tt := range configTestCases {
|
||||
r := bytes.NewBufferString(tt.data)
|
||||
config, err := decode(r)
|
||||
|
@ -70,7 +72,7 @@ func TestReadConfig(t *testing.T) {
|
|||
}
|
||||
}
|
||||
|
||||
func TestGet(t *testing.T) {
|
||||
func Test_get(t *testing.T) {
|
||||
cfg := `{
|
||||
"key": "val"
|
||||
}`
|
||||
|
@ -101,3 +103,87 @@ func TestGet(t *testing.T) {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
func Test_readConfig(t *testing.T) {
|
||||
// non existing file
|
||||
mkConfig, err := readConfig("non_existing_file")
|
||||
if err != nil {
|
||||
t.Fatalf("Error not exepected but got %v", err)
|
||||
}
|
||||
|
||||
if len(mkConfig) != 0 {
|
||||
t.Errorf("Expected empty map but got %v", mkConfig)
|
||||
}
|
||||
|
||||
// invalid config file
|
||||
mkConfig, err = readConfig("./testdata/.minikube/config/invalid_config.json")
|
||||
if err == nil {
|
||||
t.Fatalf("Error expected but got none")
|
||||
}
|
||||
|
||||
if mkConfig != nil {
|
||||
t.Errorf("Expected nil but got %v", mkConfig)
|
||||
}
|
||||
|
||||
// valid config file
|
||||
mkConfig, err = readConfig("./testdata/.minikube/config/valid_config.json")
|
||||
if err != nil {
|
||||
t.Fatalf("Error not expected but got %v", err)
|
||||
}
|
||||
|
||||
expectedConfig := map[string]interface{}{
|
||||
"vm-driver": constants.DriverKvm2,
|
||||
"cpus": 4,
|
||||
"disk-size": "20g",
|
||||
"show-libmachine-logs": true,
|
||||
"log_dir": "/etc/hosts",
|
||||
}
|
||||
|
||||
if reflect.DeepEqual(expectedConfig, mkConfig) || err != nil {
|
||||
t.Errorf("Did not read config correctly,\n\n wanted %+v, \n\n got %+v", expectedConfig, mkConfig)
|
||||
}
|
||||
}
|
||||
|
||||
func TestWriteConfig(t *testing.T) {
|
||||
configFile, err := ioutil.TempFile("/tmp", "configTest")
|
||||
if err != nil {
|
||||
t.Fatalf("Error not expected but got %v", err)
|
||||
}
|
||||
|
||||
cfg := map[string]interface{}{
|
||||
"vm-driver": constants.DriverKvm2,
|
||||
"cpus": 4,
|
||||
"disk-size": "20g",
|
||||
"show-libmachine-logs": true,
|
||||
"log_dir": "/etc/hosts",
|
||||
}
|
||||
|
||||
err = WriteConfig(configFile.Name(), cfg)
|
||||
if err != nil {
|
||||
t.Fatalf("Error not expected but got %v", err)
|
||||
}
|
||||
defer os.Remove(configFile.Name())
|
||||
|
||||
mkConfig, err := readConfig(configFile.Name())
|
||||
if err != nil {
|
||||
t.Fatalf("Error not expected but got %v", err)
|
||||
}
|
||||
|
||||
if reflect.DeepEqual(cfg, mkConfig) || err != nil {
|
||||
t.Errorf("Did not read config correctly,\n\n wanted %+v, \n\n got %+v", cfg, mkConfig)
|
||||
}
|
||||
}
|
||||
|
||||
func Test_encode(t *testing.T) {
|
||||
var b bytes.Buffer
|
||||
for _, tt := range configTestCases {
|
||||
err := encode(&b, tt.config)
|
||||
if err != nil {
|
||||
t.Errorf("Error encoding: %v", err)
|
||||
}
|
||||
if b.String() != tt.data {
|
||||
t.Errorf("Did not write config correctly, \n\n expected:\n %+v \n\n actual:\n %+v", tt.data, b.String())
|
||||
}
|
||||
b.Reset()
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,84 @@
|
|||
/*
|
||||
Copyright 2019 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 config
|
||||
|
||||
import (
|
||||
"io/ioutil"
|
||||
"path/filepath"
|
||||
|
||||
"k8s.io/minikube/pkg/minikube/constants"
|
||||
)
|
||||
|
||||
// isValid checks if the profile has the essential info needed for a profile
|
||||
func (p *Profile) isValid() bool {
|
||||
if p.Config.MachineConfig.VMDriver == "" {
|
||||
return false
|
||||
}
|
||||
if p.Config.KubernetesConfig.KubernetesVersion == "" {
|
||||
return false
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
// ListProfiles returns all valid and invalid (if any) minikube profiles
|
||||
// invalidPs are the profiles that have a directory or config file but not usable
|
||||
// invalidPs would be suggeted to be deleted
|
||||
func ListProfiles(miniHome ...string) (validPs []*Profile, inValidPs []*Profile, err error) {
|
||||
pDirs, err := profileDirs(miniHome...)
|
||||
if err != nil {
|
||||
return nil, nil, err
|
||||
}
|
||||
for _, n := range pDirs {
|
||||
p, err := loadProfile(n, miniHome...)
|
||||
if err != nil {
|
||||
inValidPs = append(inValidPs, p)
|
||||
continue
|
||||
}
|
||||
if !p.isValid() {
|
||||
inValidPs = append(inValidPs, p)
|
||||
continue
|
||||
}
|
||||
validPs = append(validPs, p)
|
||||
}
|
||||
return validPs, inValidPs, nil
|
||||
}
|
||||
|
||||
// loadProfile loads type Profile based on its name
|
||||
func loadProfile(name string, miniHome ...string) (*Profile, error) {
|
||||
cfg, err := DefaultLoader.LoadConfigFromFile(name, miniHome...)
|
||||
p := &Profile{
|
||||
Name: name,
|
||||
Config: cfg,
|
||||
}
|
||||
return p, err
|
||||
}
|
||||
|
||||
// profileDirs gets all the folders in the user's profiles folder regardless of valid or invalid config
|
||||
func profileDirs(miniHome ...string) (dirs []string, err error) {
|
||||
miniPath := constants.GetMinipath()
|
||||
if len(miniHome) > 0 {
|
||||
miniPath = miniHome[0]
|
||||
}
|
||||
pRootDir := filepath.Join(miniPath, "profiles")
|
||||
items, err := ioutil.ReadDir(pRootDir)
|
||||
for _, f := range items {
|
||||
if f.IsDir() {
|
||||
dirs = append(dirs, f.Name())
|
||||
}
|
||||
}
|
||||
return dirs, err
|
||||
}
|
|
@ -0,0 +1,72 @@
|
|||
/*
|
||||
Copyright 2019 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 config
|
||||
|
||||
import (
|
||||
"path/filepath"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestListProfiles(t *testing.T) {
|
||||
miniDir, err := filepath.Abs("./testdata/.minikube")
|
||||
if err != nil {
|
||||
t.Errorf("error getting dir path for ./testdata/.minikube : %v", err)
|
||||
}
|
||||
// test cases for valid profiles
|
||||
var testCasesValidProfs = []struct {
|
||||
index int
|
||||
expectName string
|
||||
vmDriver string
|
||||
}{
|
||||
{0, "p1", "hyperkit"},
|
||||
{1, "p2", "virtualbox"},
|
||||
}
|
||||
|
||||
// test cases for invalid profiles
|
||||
var testCasesInValidProfs = []struct {
|
||||
index int
|
||||
expectName string
|
||||
vmDriver string
|
||||
}{
|
||||
{0, "p3_empty", ""},
|
||||
{1, "p4_invalid_file", ""},
|
||||
{2, "p5_partial_config", ""},
|
||||
}
|
||||
|
||||
val, inv, err := ListProfiles(miniDir)
|
||||
|
||||
for _, tt := range testCasesValidProfs {
|
||||
if val[tt.index].Name != tt.expectName {
|
||||
t.Errorf("expected %s got %v", tt.expectName, val[tt.index].Name)
|
||||
}
|
||||
if val[tt.index].Config.MachineConfig.VMDriver != tt.vmDriver {
|
||||
t.Errorf("expected %s got %v", tt.vmDriver, val[tt.index].Config.MachineConfig.VMDriver)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// making sure it returns the invalid profiles
|
||||
for _, tt := range testCasesInValidProfs {
|
||||
if inv[tt.index].Name != tt.expectName {
|
||||
t.Errorf("expected %s got %v", tt.expectName, inv[tt.index].Name)
|
||||
}
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
t.Errorf("error listing profiles %v", err)
|
||||
}
|
||||
}
|
|
@ -0,0 +1,2 @@
|
|||
{
|
||||
"vm-driver": "kvm2"
|
|
@ -0,0 +1,7 @@
|
|||
{
|
||||
"vm-driver": "kvm2",
|
||||
"cpus": 4,
|
||||
"disk-size": "20g",
|
||||
"show-libmachine-logs": true,
|
||||
"log_dir": "/etc/hosts"
|
||||
}
|
|
@ -0,0 +1,50 @@
|
|||
{
|
||||
"MachineConfig": {
|
||||
"KeepContext": false,
|
||||
"MinikubeISO": "https://storage.googleapis.com/minikube/iso/minikube-v1.2.0.iso",
|
||||
"Memory": 2000,
|
||||
"CPUs": 2,
|
||||
"DiskSize": 20000,
|
||||
"VMDriver": "hyperkit",
|
||||
"ContainerRuntime": "docker",
|
||||
"HyperkitVpnKitSock": "",
|
||||
"HyperkitVSockPorts": [],
|
||||
"XhyveDiskDriver": "ahci-hd",
|
||||
"DockerEnv": null,
|
||||
"InsecureRegistry": null,
|
||||
"RegistryMirror": null,
|
||||
"HostOnlyCIDR": "192.168.99.1/24",
|
||||
"HypervVirtualSwitch": "",
|
||||
"KVMNetwork": "default",
|
||||
"KVMQemuURI": "qemu:///system",
|
||||
"KVMGPU": false,
|
||||
"KVMHidden": false,
|
||||
"DockerOpt": null,
|
||||
"DisableDriverMounts": false,
|
||||
"NFSShare": [],
|
||||
"NFSSharesRoot": "/nfsshares",
|
||||
"UUID": "",
|
||||
"NoVTXCheck": false,
|
||||
"DNSProxy": false,
|
||||
"HostDNSResolver": true
|
||||
},
|
||||
"KubernetesConfig": {
|
||||
"KubernetesVersion": "v1.15.0",
|
||||
"NodeIP": "192.168.64.75",
|
||||
"NodePort": 8443,
|
||||
"NodeName": "minikube",
|
||||
"APIServerName": "minikubeCA",
|
||||
"APIServerNames": null,
|
||||
"APIServerIPs": null,
|
||||
"DNSDomain": "cluster.local",
|
||||
"ContainerRuntime": "docker",
|
||||
"CRISocket": "",
|
||||
"NetworkPlugin": "",
|
||||
"FeatureGates": "",
|
||||
"ServiceCIDR": "10.96.0.0/12",
|
||||
"ImageRepository": "",
|
||||
"ExtraOptions": null,
|
||||
"ShouldLoadCachedImages": true,
|
||||
"EnableDefaultCNI": false
|
||||
}
|
||||
}
|
|
@ -0,0 +1,49 @@
|
|||
{
|
||||
"MachineConfig": {
|
||||
"KeepContext": false,
|
||||
"MinikubeISO": "https://storage.googleapis.com/minikube/iso/minikube-v1.2.0.iso",
|
||||
"Memory": 2000,
|
||||
"CPUs": 2,
|
||||
"DiskSize": 20000,
|
||||
"VMDriver": "virtualbox",
|
||||
"ContainerRuntime": "docker",
|
||||
"HyperkitVpnKitSock": "",
|
||||
"HyperkitVSockPorts": [],
|
||||
"DockerEnv": null,
|
||||
"InsecureRegistry": null,
|
||||
"RegistryMirror": null,
|
||||
"HostOnlyCIDR": "192.168.99.1/24",
|
||||
"HypervVirtualSwitch": "",
|
||||
"KVMNetwork": "default",
|
||||
"KVMQemuURI": "qemu:///system",
|
||||
"KVMGPU": false,
|
||||
"KVMHidden": false,
|
||||
"DockerOpt": null,
|
||||
"DisableDriverMounts": false,
|
||||
"NFSShare": [],
|
||||
"NFSSharesRoot": "/nfsshares",
|
||||
"UUID": "",
|
||||
"NoVTXCheck": false,
|
||||
"DNSProxy": false,
|
||||
"HostDNSResolver": true
|
||||
},
|
||||
"KubernetesConfig": {
|
||||
"KubernetesVersion": "v1.15.0",
|
||||
"NodeIP": "192.168.99.136",
|
||||
"NodePort": 8443,
|
||||
"NodeName": "minikube",
|
||||
"APIServerName": "minikubeCA",
|
||||
"APIServerNames": null,
|
||||
"APIServerIPs": null,
|
||||
"DNSDomain": "cluster.local",
|
||||
"ContainerRuntime": "docker",
|
||||
"CRISocket": "",
|
||||
"NetworkPlugin": "",
|
||||
"FeatureGates": "",
|
||||
"ServiceCIDR": "10.96.0.0/12",
|
||||
"ImageRepository": "",
|
||||
"ExtraOptions": null,
|
||||
"ShouldLoadCachedImages": true,
|
||||
"EnableDefaultCNI": false
|
||||
}
|
||||
}
|
|
@ -0,0 +1 @@
|
|||
invalid json file :)
|
47
pkg/minikube/config/testdata/.minikube/profiles/p5_partial_config/config.json
vendored
Normal file
47
pkg/minikube/config/testdata/.minikube/profiles/p5_partial_config/config.json
vendored
Normal file
|
@ -0,0 +1,47 @@
|
|||
{
|
||||
"MachineConfig": {
|
||||
"KeepContext": false,
|
||||
"MinikubeISO": "https://storage.googleapis.com/minikube/iso/minikube-v1.2.0.iso",
|
||||
"Memory": 2000,
|
||||
"CPUs": 2,
|
||||
"DiskSize": 20000,
|
||||
"ContainerRuntime": "docker",
|
||||
"HyperkitVpnKitSock": "",
|
||||
"HyperkitVSockPorts": [],
|
||||
"XhyveDiskDriver": "ahci-hd",
|
||||
"DockerEnv": null,
|
||||
"InsecureRegistry": null,
|
||||
"RegistryMirror": null,
|
||||
"HostOnlyCIDR": "192.168.99.1/24",
|
||||
"HypervVirtualSwitch": "",
|
||||
"KVMNetwork": "default",
|
||||
"KVMQemuURI": "qemu:///system",
|
||||
"KVMGPU": false,
|
||||
"KVMHidden": false,
|
||||
"DockerOpt": null,
|
||||
"DisableDriverMounts": false,
|
||||
"NFSShare": [],
|
||||
"NFSSharesRoot": "/nfsshares",
|
||||
"UUID": "",
|
||||
"NoVTXCheck": false,
|
||||
"DNSProxy": false,
|
||||
"HostDNSResolver": true
|
||||
},
|
||||
"KubernetesConfig": {
|
||||
"NodePort": 8443,
|
||||
"NodeName": "minikube",
|
||||
"APIServerName": "minikubeCA",
|
||||
"APIServerNames": null,
|
||||
"APIServerIPs": null,
|
||||
"DNSDomain": "cluster.local",
|
||||
"ContainerRuntime": "docker",
|
||||
"CRISocket": "",
|
||||
"NetworkPlugin": "",
|
||||
"FeatureGates": "",
|
||||
"ServiceCIDR": "10.96.0.0/12",
|
||||
"ImageRepository": "",
|
||||
"ExtraOptions": null,
|
||||
"ShouldLoadCachedImages": true,
|
||||
"EnableDefaultCNI": false
|
||||
}
|
||||
}
|
|
@ -22,6 +22,12 @@ import (
|
|||
"k8s.io/minikube/pkg/util"
|
||||
)
|
||||
|
||||
// Profile represents a minikube profile
|
||||
type Profile struct {
|
||||
Name string
|
||||
Config *Config
|
||||
}
|
||||
|
||||
// Config contains machine and k8s config
|
||||
type Config struct {
|
||||
MachineConfig MachineConfig
|
||||
|
@ -39,7 +45,6 @@ type MachineConfig struct {
|
|||
ContainerRuntime string
|
||||
HyperkitVpnKitSock string // Only used by the Hyperkit driver
|
||||
HyperkitVSockPorts []string // Only used by the Hyperkit driver
|
||||
XhyveDiskDriver string // Only used by the xhyve driver
|
||||
DockerEnv []string // Each entry is formatted as KEY=VALUE.
|
||||
InsecureRegistry []string
|
||||
RegistryMirror []string
|
||||
|
@ -51,7 +56,7 @@ type MachineConfig struct {
|
|||
KVMHidden bool // Only used by kvm2
|
||||
Downloader util.ISODownloader `json:"-"`
|
||||
DockerOpt []string // Each entry is formatted as KEY=VALUE.
|
||||
DisableDriverMounts bool // Only used by virtualbox and xhyve
|
||||
DisableDriverMounts bool // Only used by virtualbox
|
||||
NFSShare []string
|
||||
NFSSharesRoot string
|
||||
UUID string // Only used by hyperkit to restore the mac address
|
||||
|
|
|
@ -59,12 +59,12 @@ func ArchTag(hasTag bool) string {
|
|||
return "-" + runtime.GOARCH + ":"
|
||||
}
|
||||
|
||||
// DriverMock is a mock driver.
|
||||
const DriverMock = "mock-driver"
|
||||
|
||||
// DriverNone is the none driver.
|
||||
const DriverNone = "none"
|
||||
|
||||
// DriverKvmOld is the depricated kvm driver option name
|
||||
const DriverKvmOld = "kvm"
|
||||
|
||||
// DriverKvm2 is the kvm2 driver option name for in linux
|
||||
const DriverKvm2 = "kvm2"
|
||||
|
||||
|
@ -83,27 +83,9 @@ const DriverVmwareFusion = "vmwarefusion"
|
|||
// DriverHyperv is the hyperv driver option for windows
|
||||
const DriverHyperv = "hyperv"
|
||||
|
||||
// DriverXhyve is the depricated xhyve driver option name
|
||||
const DriverXhyve = "xhyve"
|
||||
|
||||
// DriverParallels is the parallels driver option name
|
||||
const DriverParallels = "parallels"
|
||||
|
||||
// SupportedVMDrivers is a list of supported drivers on all platforms. Currently
|
||||
// used in gendocs.
|
||||
var SupportedVMDrivers = [...]string{
|
||||
DriverVirtualbox,
|
||||
DriverParallels,
|
||||
DriverVmwareFusion,
|
||||
DriverKvmOld,
|
||||
DriverXhyve,
|
||||
DriverHyperv,
|
||||
DriverHyperkit,
|
||||
DriverKvm2,
|
||||
DriverVmware,
|
||||
DriverNone,
|
||||
}
|
||||
|
||||
// DefaultMinipath is the default Minikube path (under the home directory)
|
||||
var DefaultMinipath = filepath.Join(homedir.HomeDir(), ".minikube")
|
||||
|
||||
|
@ -194,10 +176,10 @@ var DefaultISOURL = fmt.Sprintf("https://storage.googleapis.com/%s/minikube-%s.i
|
|||
var DefaultISOSHAURL = DefaultISOURL + SHASuffix
|
||||
|
||||
// DefaultKubernetesVersion is the default kubernetes version
|
||||
var DefaultKubernetesVersion = "v1.15.0"
|
||||
var DefaultKubernetesVersion = "v1.15.1"
|
||||
|
||||
// NewestKubernetesVersion is the newest Kubernetes version to test against
|
||||
var NewestKubernetesVersion = "v1.15.0"
|
||||
var NewestKubernetesVersion = "v1.15.1"
|
||||
|
||||
// OldestKubernetesVersion is the oldest Kubernetes version to test against
|
||||
var OldestKubernetesVersion = "v1.10.13"
|
||||
|
@ -209,13 +191,21 @@ var ConfigFilePath = MakeMiniPath("config")
|
|||
var ConfigFile = MakeMiniPath("config", "config.json")
|
||||
|
||||
// GetProfileFile returns the Minikube profile config file
|
||||
func GetProfileFile(profile string) string {
|
||||
return filepath.Join(GetMinipath(), "profiles", profile, "config.json")
|
||||
func GetProfileFile(profile string, miniHome ...string) string {
|
||||
miniPath := GetMinipath()
|
||||
if len(miniHome) > 0 {
|
||||
miniPath = miniHome[0]
|
||||
}
|
||||
return filepath.Join(miniPath, "profiles", profile, "config.json")
|
||||
}
|
||||
|
||||
// GetProfilePath returns the Minikube profile path of config file
|
||||
func GetProfilePath(profile string) string {
|
||||
return filepath.Join(GetMinipath(), "profiles", profile)
|
||||
func GetProfilePath(profile string, miniHome ...string) string {
|
||||
miniPath := GetMinipath()
|
||||
if len(miniHome) > 0 {
|
||||
miniPath = miniHome[0]
|
||||
}
|
||||
return filepath.Join(miniPath, "profiles", profile)
|
||||
}
|
||||
|
||||
// AddonsPath is the default path of the addons configuration
|
||||
|
@ -435,6 +425,6 @@ const (
|
|||
)
|
||||
|
||||
const (
|
||||
// KVMDocumentation the documentation of the KVM driver
|
||||
KVMDocumentation = "https://github.com/kubernetes/minikube/blob/master/docs/drivers.md#kvm2-driver"
|
||||
// DriverDocumentation the documentation of the KVM driver
|
||||
DriverDocumentation = "https://github.com/kubernetes/minikube/blob/master/docs/drivers.md"
|
||||
)
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue