Merge branch 'master' into DELETE_ALL_PROFILES
# Conflicts: # cmd/minikube/cmd/delete.go # pkg/minikube/constants/constants.go # test/integration/z_proxy_test.go # translations/fr-FR.json # translations/zh-CN.jsonpull/4780/head
commit
ba67c8516a
|
@ -42,3 +42,11 @@ deploy/iso/minikube-iso/board/coreos/minikube/rootfs-overlay/etc/VERSION
|
|||
/.idea
|
||||
|
||||
/.vscode
|
||||
|
||||
test/integration/testdata/minikube-linux-amd64-latest-stable
|
||||
|
||||
# hugo
|
||||
/public
|
||||
/site/resources
|
||||
/_gen
|
||||
|
||||
|
|
|
@ -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,11 @@
|
|||
language: go
|
||||
os: linux
|
||||
|
||||
env:
|
||||
- GOPROXY=https://proxy.golang.org
|
||||
matrix:
|
||||
include:
|
||||
- go: 1.x
|
||||
- go: 1.12.7
|
||||
- language: python
|
||||
before_install: pip install flake8
|
||||
script: flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics
|
||||
|
|
85
CHANGELOG.md
85
CHANGELOG.md
|
@ -1,4 +1,85 @@
|
|||
# Minikube Release Notes
|
||||
# Release Notes
|
||||
|
||||
## Version 1.3.1 - 2019-08-13
|
||||
|
||||
* Update code references to point to new documentation site [#5052](https://github.com/kubernetes/minikube/pull/5052)
|
||||
* Localization support for help text [#4814](https://github.com/kubernetes/minikube/pull/4814)
|
||||
* Fix progress bar on Windows + git bash [#5025](https://github.com/kubernetes/minikube/pull/5025)
|
||||
* Restore --disable-driver-mounts flag [#5026](https://github.com/kubernetes/minikube/pull/5026)
|
||||
* Fixed the template for dashboard output [#5004](https://github.com/kubernetes/minikube/pull/5004)
|
||||
* Use a temp dest to atomically download the iso [#5000](https://github.com/kubernetes/minikube/pull/5000)
|
||||
|
||||
Thank you to our merry band of contributors for assembling this last minute bug fix release.
|
||||
|
||||
- Jituri, Pranav
|
||||
- Medya Ghazizadeh
|
||||
- Pranav Jituri
|
||||
- Ramiro Berrelleza
|
||||
- Sharif Elgamal
|
||||
- Thomas Strömberg
|
||||
- josedonizetti
|
||||
|
||||
## Version 1.3.0 - 2019-08-05
|
||||
|
||||
* Added a new command: profile list [#4811](https://github.com/kubernetes/minikube/pull/4811)
|
||||
* Update latest kubernetes version to v1.15.2 [#4986](https://github.com/kubernetes/minikube/pull/4986)
|
||||
* 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
|
||||
|
||||
|
@ -1071,7 +1152,7 @@ Huge Thank You for this release to our contributors:
|
|||
* Added a `minikube dashboard` command to open the Kubernetes Dashboard.
|
||||
* Updated Docker to version 1.11.1.
|
||||
* Updated Kubernetes components to v1.3.0-alpha.5-330-g760c563.
|
||||
* Generated documentation for all commands. Documentation [is here](https://github.com/kubernetes/minikube/blob/master/docs/minikube.md).
|
||||
* Generated documentation for all commands. Documentation [is here](https://minikube.sigs.k8s.io/docs/).
|
||||
|
||||
## Version 0.2.0 - 6/3/2016
|
||||
|
||||
|
|
|
@ -1,21 +1 @@
|
|||
# Contributing guidelines
|
||||
|
||||
## Filing issues
|
||||
|
||||
File issues using the standard Github issue tracker for the repo.
|
||||
|
||||
## How to become a contributor and submit your own code
|
||||
|
||||
### Contributor License Agreements
|
||||
|
||||
We'd love to accept your patches! Before we can take them, we have to jump a couple of legal hurdles.
|
||||
|
||||
[Please fill out either the individual or corporate Contributor License Agreement (CLA)](http://git.k8s.io/community/CLA.md)
|
||||
|
||||
### Contributing A Patch
|
||||
|
||||
1. Submit an issue describing your proposed change to the repo in question.
|
||||
1. The repo owner will respond to your issue promptly.
|
||||
1. If your proposed change is accepted, and you haven't already done so, sign a Contributor License Agreement (see details above).
|
||||
1. Fork the desired repo, develop and test your code changes.
|
||||
1. Submit a pull request.
|
||||
This document has moved to https://minikube.sigs.k8s.io/docs/contributing/guide/
|
||||
|
|
|
@ -1,4 +0,0 @@
|
|||
Thomas Stromberg <tstromberg@google.com> (@tstromberg)
|
||||
Anders F Björklund <anders.f.bjorklund@gmail.com> (@afbjorklund)
|
||||
Sharif Elgamal <selgamal@google.com> (@sharifelgamal)
|
||||
Medya Ghazizadeh <medya@google.com> (@medyagh)
|
113
Makefile
113
Makefile
|
@ -14,14 +14,17 @@
|
|||
|
||||
# Bump these on release - and please check ISO_VERSION for correctness.
|
||||
VERSION_MAJOR ?= 1
|
||||
VERSION_MINOR ?= 2
|
||||
VERSION_BUILD ?= 0
|
||||
VERSION_MINOR ?= 3
|
||||
VERSION_BUILD ?= 1
|
||||
# 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
|
||||
|
||||
VERSION ?= v$(VERSION_MAJOR).$(VERSION_MINOR).$(VERSION_BUILD)
|
||||
DEB_VERSION ?= $(VERSION_MAJOR).$(VERSION_MINOR).$(VERSION_BUILD)
|
||||
RPM_VERSION ?= $(VERSION_MAJOR).$(VERSION_MINOR).$(VERSION_BUILD)
|
||||
# used by hack/jenkins/release_build_and_upload.sh and KVM_BUILD_IMAGE, see also BUILD_IMAGE below
|
||||
GO_VERSION ?= 1.12.8
|
||||
|
||||
INSTALL_SIZE ?= $(shell du out/minikube-windows-amd64.exe | cut -f1)
|
||||
BUILDROOT_BRANCH ?= 2018.05.3
|
||||
REGISTRY?=gcr.io/k8s-minikube
|
||||
|
@ -31,10 +34,10 @@ 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-08-15. kube-cross images aren't updated as often as Kubernetes
|
||||
BUILD_IMAGE ?= k8s.gcr.io/kube-cross:v$(GO_VERSION)-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
|
||||
|
||||
|
@ -43,10 +46,20 @@ 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
|
||||
|
||||
GO_VERSION ?= $(shell go version | cut -d' ' -f3 | sed -e 's/go//')
|
||||
KERNEL_VERSION ?= 4.15
|
||||
# latest from https://github.com/golangci/golangci-lint/releases
|
||||
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)
|
||||
|
@ -59,6 +72,8 @@ $(shell mkdir -p $(BUILD_DIR))
|
|||
PYTHON := $(shell command -v python || echo "docker run --rm -it -v $(shell pwd):/minikube -w /minikube python python")
|
||||
BUILD_OS := $(shell uname -s)
|
||||
|
||||
SHA512SUM=$(shell command -v sha512sum || echo "shasum -a 512")
|
||||
|
||||
STORAGE_PROVISIONER_TAG := v1.8.1
|
||||
|
||||
# Set the version information for the Kubernetes servers
|
||||
|
@ -75,6 +90,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
|
||||
|
@ -176,7 +192,7 @@ test-pkg/%: pkg/minikube/assets/assets.go pkg/minikube/translate/translations.go
|
|||
go test -v -test.timeout=60m ./$* --tags="$(MINIKUBE_BUILD_TAGS)"
|
||||
|
||||
.PHONY: all
|
||||
all: cross drivers e2e-cross
|
||||
all: cross drivers e2e-cross out/gvisor-addon
|
||||
|
||||
.PHONY: drivers
|
||||
drivers: out/docker-machine-driver-hyperkit out/docker-machine-driver-kvm2
|
||||
|
@ -203,14 +219,22 @@ extract:
|
|||
|
||||
# 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
|
||||
|
||||
|
@ -273,14 +297,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:
|
||||
|
@ -328,14 +354,14 @@ out/repodata/repomd.xml: out/minikube-$(RPM_VERSION).rpm
|
|||
|
||||
.SECONDEXPANSION:
|
||||
TAR_TARGETS_linux := out/minikube-linux-amd64 out/docker-machine-driver-kvm2
|
||||
TAR_TARGETS_darwin := out/minikube-darwin-amd64
|
||||
TAR_TARGETS_darwin := out/minikube-darwin-amd64 out/docker-machine-driver-hyperkit
|
||||
TAR_TARGETS_windows := out/minikube-windows-amd64.exe
|
||||
TAR_TARGETS_ALL := $(shell find deploy/addons -type f)
|
||||
out/minikube-%-amd64.tar.gz: $$(TAR_TARGETS_$$*) $(TAR_TARGETS_ALL)
|
||||
tar -cvf $@ $^
|
||||
out/minikube-%-amd64.tar.gz: $$(TAR_TARGETS_$$*)
|
||||
tar -cvzf $@ $^
|
||||
|
||||
.PHONY: cross-tars
|
||||
cross-tars: out/minikube-windows-amd64.tar.gz out/minikube-linux-amd64.tar.gz out/minikube-darwin-amd64.tar.gz
|
||||
-cd out && $(SHA512SUM) *.tar.gz > SHA512SUM
|
||||
|
||||
out/minikube-installer.exe: out/minikube-windows-amd64.exe
|
||||
rm -rf out/windows_tmp
|
||||
|
@ -360,12 +386,21 @@ else
|
|||
-o $(BUILD_DIR)/docker-machine-driver-hyperkit k8s.io/minikube/cmd/drivers/hyperkit
|
||||
endif
|
||||
|
||||
hyperkit_in_docker:
|
||||
rm -f out/docker-machine-driver-hyperkit
|
||||
$(call DOCKER,$(HYPERKIT_BUILD_IMAGE),CC=o64-clang CXX=o64-clang++ /usr/bin/make out/docker-machine-driver-hyperkit)
|
||||
|
||||
.PHONY: install-hyperkit-driver
|
||||
install-hyperkit-driver: out/docker-machine-driver-hyperkit
|
||||
sudo cp out/docker-machine-driver-hyperkit $(HOME)/bin/docker-machine-driver-hyperkit
|
||||
sudo chown root:wheel $(HOME)/bin/docker-machine-driver-hyperkit
|
||||
sudo chmod u+s $(HOME)/bin/docker-machine-driver-hyperkit
|
||||
|
||||
.PHONY: release-hyperkit-driver
|
||||
release-hyperkit-driver: install-hyperkit-driver checksum
|
||||
gsutil cp $(GOBIN)/docker-machine-driver-hyperkit gs://minikube/drivers/hyperkit/$(VERSION)/
|
||||
gsutil cp $(GOBIN)/docker-machine-driver-hyperkit.sha256 gs://minikube/drivers/hyperkit/$(VERSION)/
|
||||
|
||||
.PHONY: check-release
|
||||
check-release:
|
||||
go test -v ./deploy/minikube/release_sanity_test.go -tags=release
|
||||
|
@ -396,7 +431,7 @@ else
|
|||
endif
|
||||
|
||||
.PHONY: out/gvisor-addon
|
||||
out/gvisor-addon:
|
||||
out/gvisor-addon: pkg/minikube/assets/assets.go pkg/minikube/translate/translations.go
|
||||
GOOS=linux CGO_ENABLED=0 go build -o $@ cmd/gvisor/gvisor.go
|
||||
|
||||
.PHONY: gvisor-addon-image
|
||||
|
@ -419,16 +454,16 @@ release-minikube: out/minikube checksum
|
|||
|
||||
out/docker-machine-driver-kvm2:
|
||||
ifeq ($(MINIKUBE_BUILD_IN_DOCKER),y)
|
||||
docker pull $(KVM_BUILD_IMAGE) || $(MAKE) $(KVM_BUILD_IMAGE)
|
||||
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 without_lxc" \
|
||||
-o $(BUILD_DIR)/docker-machine-driver-kvm2 \
|
||||
go build \
|
||||
-installsuffix "static" \
|
||||
-ldflags="$(KVM2_LDFLAGS)" \
|
||||
-tags "libvirt.1.3.1 without_lxc" \
|
||||
-o $(BUILD_DIR)/docker-machine-driver-kvm2 \
|
||||
k8s.io/minikube/cmd/drivers/kvm
|
||||
endif
|
||||
chmod +X $@
|
||||
|
@ -450,14 +485,14 @@ out/docker-machine-driver-kvm2-$(RPM_VERSION).rpm: out/docker-machine-driver-kvm
|
|||
out/docker-machine-driver-kvm2-$(RPM_VERSION)/docker-machine-driver-kvm2.spec
|
||||
rm -rf out/docker-machine-driver-kvm2-$(RPM_VERSION)
|
||||
|
||||
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 $<)
|
||||
.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 -f '{{.Id}} {{.RepoTags}}' $(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))
|
||||
|
||||
|
@ -469,3 +504,21 @@ install-kvm-driver: out/docker-machine-driver-kvm2
|
|||
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)/
|
||||
|
||||
site/themes/docsy/assets/vendor/bootstrap/package.js:
|
||||
git submodule update -f --init --recursive
|
||||
|
||||
# hugo for generating site previews
|
||||
out/hugo/hugo:
|
||||
mkdir -p out
|
||||
test -d out/hugo || git clone https://github.com/gohugoio/hugo.git out/hugo
|
||||
(cd out/hugo && go build --tags extended)
|
||||
|
||||
# Serve the documentation site to localhost
|
||||
.PHONY: site
|
||||
site: site/themes/docsy/assets/vendor/bootstrap/package.js out/hugo/hugo
|
||||
(cd site && ../out/hugo/hugo serve \
|
||||
--disableFastRender \
|
||||
--navigateToChanged \
|
||||
--ignoreCache \
|
||||
--buildFuture)
|
||||
|
|
124
README.md
124
README.md
|
@ -9,55 +9,47 @@
|
|||
[GoReport Status]: https://goreportcard.com/report/github.com/kubernetes/minikube
|
||||
[GoReport Widget]: https://goreportcard.com/badge/github.com/kubernetes/minikube
|
||||
|
||||
<img src="https://github.com/kubernetes/minikube/raw/master/images/logo/logo.png" width="100">
|
||||
<img src="https://github.com/kubernetes/minikube/raw/master/images/logo/logo.png" width="100" alt="minikube logo">
|
||||
|
||||
## What is minikube?
|
||||
minikube implements a local Kubernetes cluster on macOS, Linux, and Windows. minikube's [primary goals](https://minikube.sigs.k8s.io/docs/concepts/principles/) are to be the best tool for local Kubernetes application development and to support all Kubernetes features that fit.
|
||||
|
||||
minikube implements a local Kubernetes cluster on macOS, Linux, and Windows.
|
||||
|
||||
![screenshot](/images/start.jpg)
|
||||
|
||||
minikube's [primary goals](https://github.com/kubernetes/minikube/blob/master/docs/contributors/principles.md) are to be the best tool for local Kubernetes application development and to support all Kubernetes features that fit. We hope you enjoy it!
|
||||
|
||||
## News
|
||||
|
||||
:mega: **Please fill out our [fast 5-question survey](https://forms.gle/Gg3hG5ZySw8c1C24A)** so that we can learn how & why you use minikube, and what improvements we should make. Thank you! :dancers:
|
||||
|
||||
* 2019-06-24 - v1.2.0 released! [[download](https://github.com/kubernetes/minikube/releases/tag/v1.2.0)] [[release notes](https://github.com/kubernetes/minikube/blob/master/CHANGELOG.md#version-120---2019-06-24)]
|
||||
* 2019-06-07 - v1.1.1 released! [[download](https://github.com/kubernetes/minikube/releases/tag/v1.1.1)] [[release notes](https://github.com/kubernetes/minikube/blob/master/CHANGELOG.md#version-111---2019-06-07)]
|
||||
* 2019-05-21 - v1.1.0 released! [[download](https://github.com/kubernetes/minikube/releases/tag/v1.1.0)] [[release notes](https://github.com/kubernetes/minikube/blob/master/CHANGELOG.md#version-110---2019-05-21)]
|
||||
<img src="https://github.com/kubernetes/minikube/raw/master/site/content/en/start.png" width="738" alt="screenshot">
|
||||
|
||||
## Features
|
||||
|
||||
minikube runs the latest stable release of Kubernetes, with support for standard Kubernetes features like:
|
||||
|
||||
* [LoadBalancer](https://github.com/kubernetes/minikube/blob/master/docs/tunnel.md) - using `minikube tunnel`
|
||||
* [LoadBalancer](https://minikube.sigs.k8s.io/docs/tasks/loadbalancer/) - using `minikube tunnel`
|
||||
* Multi-cluster - using `minikube start -p <name>`
|
||||
* NodePorts - using `minikube service`
|
||||
* [Persistent Volumes](https://github.com/kubernetes/minikube/blob/master/docs/persistent_volumes.md)
|
||||
* [Persistent Volumes](https://minikube.sigs.k8s.io/docs/reference/persistent_volumes/)
|
||||
* Ingress
|
||||
* RBAC
|
||||
* [Dashboard](https://github.com/kubernetes/minikube/blob/master/docs/dashboard.md) - `minikube dashboard`
|
||||
* [Container runtimes](https://github.com/kubernetes/minikube/blob/master/docs/alternative_runtimes.md) - `start --container-runtime`
|
||||
* [Configure apiserver and kubelet options](https://github.com/kubernetes/minikube/blob/master/docs/configuring_kubernetes.md) via command-line flags
|
||||
* [Dashboard](https://minikube.sigs.k8s.io/docs/tasks/dashboard/) - `minikube dashboard`
|
||||
* [Container runtimes](https://minikube.sigs.k8s.io/docs/reference/runtimes/) - `start --container-runtime`
|
||||
* [Configure apiserver and kubelet options](https://minikube.sigs.k8s.io/docs/reference/configuration/kubernetes/) via command-line flags
|
||||
|
||||
As well as developer-friendly features:
|
||||
|
||||
* [Addons](https://github.com/kubernetes/minikube/blob/master/docs/addons.md) - a marketplace for developers to share configurations for running services on minikube
|
||||
* [GPU support](https://github.com/kubernetes/minikube/blob/master/docs/gpu.md) - for machine learning
|
||||
* [Filesystem mounts](https://github.com/kubernetes/minikube/blob/master/docs/host_folder_mount.md)
|
||||
* Automatic failure analysis
|
||||
* [Addons](https://minikube.sigs.k8s.io/docs/tasks/addons/) - a marketplace for developers to share configurations for running services on minikube
|
||||
* [NVIDIA GPU support](https://minikube.sigs.k8s.io/docs/tutorials/nvidia_gpu/) - for machine learning
|
||||
* [Filesystem mounts](https://minikube.sigs.k8s.io/docs/tasks/mount/)
|
||||
|
||||
**For more information, see the official [minikube website](https://minikube.sigs.k8s.io)**
|
||||
|
||||
## Installation
|
||||
|
||||
Installation methods can be found in the [Getting Started Guide](https://minikube.sigs.k8s.io/docs/start/)
|
||||
|
||||
## Documentation
|
||||
|
||||
* [**Installation**](https://kubernetes.io/docs/tasks/tools/install-minikube/)
|
||||
* [Advanced Topics and Tutorials](https://github.com/kubernetes/minikube/blob/master/docs/README.md)
|
||||
* [Contributors Guide](https://github.com/kubernetes/minikube/blob/master/docs/contributors/README.md)
|
||||
See https://minikube.sigs.k8s.io/docs/
|
||||
|
||||
## More Examples
|
||||
|
||||
See our [examples page](https://minikube.sigs.k8s.io/docs/examples/)
|
||||
|
||||
## Community
|
||||
|
||||
![Help Wanted!](/images/help_wanted.jpg)
|
||||
|
||||
minikube is a Kubernetes [#sig-cluster-lifecycle](https://github.com/kubernetes/community/tree/master/sig-cluster-lifecycle) project.
|
||||
|
||||
* [**#minikube on Kubernetes Slack**](https://kubernetes.slack.com) - Live chat with minikube developers!
|
||||
|
@ -65,74 +57,6 @@ minikube is a Kubernetes [#sig-cluster-lifecycle](https://github.com/kubernetes/
|
|||
* [minikube-dev mailing list](https://groups.google.com/forum/#!forum/minikube-dev)
|
||||
* [Bi-weekly office hours, Mondays @ 10am PST](https://tinyurl.com/minikube-oh)
|
||||
|
||||
* [Contributing](https://github.com/kubernetes/minikube/blob/master/CONTRIBUTING.md)
|
||||
* [Development Roadmap](https://github.com/kubernetes/minikube/blob/master/docs/contributors/roadmap.md)
|
||||
* [Contributing](https://minikube.sigs.k8s.io/docs/contributing/)
|
||||
* [Development Roadmap](https://minikube.sigs.k8s.io/docs/contributing/roadmap/)
|
||||
|
||||
## Installation
|
||||
|
||||
See the [installation guide](https://kubernetes.io/docs/tasks/tools/install-minikube/). For the impatient, here is the TL;DR:
|
||||
|
||||
* *macOS 10.12 (Sierra)*
|
||||
* Requires installing a hypervisor, such as [hyperkit](https://github.com/kubernetes/minikube/blob/master/docs/drivers.md#hyperkit-driver) (recommended) or VirtualBox
|
||||
* using [brew](https://brew.sh/): `brew cask install minikube`
|
||||
* manually: `curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-darwin-amd64 && sudo install minikube-darwin-amd64 /usr/local/bin/minikube`
|
||||
|
||||
* *Windows 10*
|
||||
* Requires a hypervisor, such as VirtualBox (recommended) or HyperV
|
||||
* VT-x/AMD-v virtualization must be enabled in BIOS
|
||||
* using [chocolatey](https://chocolatey.org/) `choco install minikube`
|
||||
* manually: Download and run the [installer](https://storage.googleapis.com/minikube/releases/latest/minikube-installer.exe)
|
||||
|
||||
* *Linux*
|
||||
* Requires either the [kvm2 driver](https://github.com/kubernetes/minikube/blob/master/docs/drivers.md#kvm2-driver) (recommended), or VirtualBox
|
||||
* VT-x/AMD-v virtualization must be enabled in BIOS
|
||||
* manually: `curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 && sudo install minikube-linux-amd64 /usr/local/bin/minikube`
|
||||
|
||||
### Supported Hypervisors
|
||||
|
||||
`minikube start` defaults to virtualbox, but supports other drivers using the `--vm-driver` argument:
|
||||
|
||||
* [KVM2](https://github.com/kubernetes/minikube/blob/master/docs/drivers.md#kvm2-driver) - Recommended Linux driver
|
||||
* [hyperkit](https://github.com/kubernetes/minikube/blob/master/docs/drivers.md#hyperkit-driver) - Recommended macOS driver
|
||||
* virtualbox - Recommended Windows driver
|
||||
* [none](https://github.com/kubernetes/minikube/blob/master/docs/vmdriver-none.md) - bare-metal execution on Linux, at the expense of system security and reliability
|
||||
|
||||
Other drivers which are not yet part of our continuous integration system are:
|
||||
|
||||
* [hyperv](https://github.com/kubernetes/minikube/blob/master/docs/drivers.md#hyperV-driver)
|
||||
* [vmware](https://github.com/kubernetes/minikube/blob/master/docs/drivers.md#vmware-unified-driver)
|
||||
* [parallels](https://github.com/kubernetes/minikube/blob/master/docs/drivers.md#parallels-driver)
|
||||
|
||||
## Quick Start
|
||||
|
||||
Start a cluster by running:
|
||||
|
||||
`minikube start`
|
||||
|
||||
Access Kubernetes Dashboard within Minikube:
|
||||
|
||||
`minikube dashboard`
|
||||
|
||||
Once started, you can interact with your cluster using `kubectl`, just like any other Kubernetes cluster. For instance, starting a server:
|
||||
|
||||
`kubectl run hello-minikube --image=k8s.gcr.io/echoserver:1.4 --port=8080`
|
||||
|
||||
Exposing a service as a NodePort
|
||||
|
||||
`kubectl expose deployment hello-minikube --type=NodePort`
|
||||
|
||||
minikube makes it easy to open this exposed endpoint in your browser:
|
||||
|
||||
`minikube service hello-minikube`
|
||||
|
||||
Start a second local cluster:
|
||||
|
||||
`minikube start -p cluster2`
|
||||
|
||||
Stop your local cluster:
|
||||
|
||||
`minikube stop`
|
||||
|
||||
Delete your local cluster:
|
||||
|
||||
`minikube delete`
|
||||
|
|
|
@ -108,5 +108,4 @@ func loadCachedImagesInConfigFile() error {
|
|||
func init() {
|
||||
cacheCmd.AddCommand(addCacheCmd)
|
||||
cacheCmd.AddCommand(deleteCacheCmd)
|
||||
RootCmd.AddCommand(cacheCmd)
|
||||
}
|
||||
|
|
|
@ -279,7 +279,3 @@ __minikube_bash_source <(__minikube_convert_bash_to_zsh)
|
|||
|
||||
return nil
|
||||
}
|
||||
|
||||
func init() {
|
||||
RootCmd.AddCommand(completionCmd)
|
||||
}
|
||||
|
|
|
@ -17,10 +17,6 @@ limitations under the License.
|
|||
package config
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"io"
|
||||
"os"
|
||||
"strings"
|
||||
|
||||
"github.com/golang/glog"
|
||||
|
@ -52,6 +48,12 @@ var settings = []Setting{
|
|||
validations: []setFn{IsValidDriver},
|
||||
callbacks: []setFn{RequiresRestartMsg},
|
||||
},
|
||||
{
|
||||
name: "container-runtime",
|
||||
set: SetString,
|
||||
validations: []setFn{IsContainerdRuntime},
|
||||
callbacks: []setFn{RequiresRestartMsg},
|
||||
},
|
||||
{
|
||||
name: "feature-gates",
|
||||
set: SetString,
|
||||
|
@ -175,6 +177,12 @@ var settings = []Setting{
|
|||
validations: []setFn{IsValidAddon},
|
||||
callbacks: []setFn{EnableOrDisableAddon},
|
||||
},
|
||||
{
|
||||
name: "insecure-registry",
|
||||
set: SetBool,
|
||||
validations: []setFn{IsValidAddon},
|
||||
callbacks: []setFn{EnableOrDisableAddon},
|
||||
},
|
||||
{
|
||||
name: "registry",
|
||||
set: SetBool,
|
||||
|
@ -302,7 +310,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 +318,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 +337,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": "kvm2"
|
||||
}`,
|
||||
config: map[string]interface{}{
|
||||
"vm-driver": constants.DriverKvm2,
|
||||
"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()
|
||||
}
|
||||
}
|
||||
|
|
|
@ -24,8 +24,8 @@ import (
|
|||
pkgConfig "k8s.io/minikube/pkg/minikube/config"
|
||||
"k8s.io/minikube/pkg/minikube/constants"
|
||||
"k8s.io/minikube/pkg/minikube/exit"
|
||||
"k8s.io/minikube/pkg/minikube/kubeconfig"
|
||||
"k8s.io/minikube/pkg/minikube/out"
|
||||
pkgutil "k8s.io/minikube/pkg/util"
|
||||
)
|
||||
|
||||
// ProfileCmd represents the profile command
|
||||
|
@ -48,6 +48,15 @@ var ProfileCmd = &cobra.Command{
|
|||
if profile == "default" {
|
||||
profile = "minikube"
|
||||
}
|
||||
|
||||
if !pkgConfig.ProfileExists(profile) {
|
||||
err := pkgConfig.CreateEmptyProfile(profile)
|
||||
if err != nil {
|
||||
exit.WithError("Creating a new profile failed", err)
|
||||
}
|
||||
out.SuccessT("Created a new profile : {{.profile_name}}", out.V{"profile_name": profile})
|
||||
}
|
||||
|
||||
err := Set(pkgConfig.MachineProfile, profile)
|
||||
if err != nil {
|
||||
exit.WithError("Setting profile failed", err)
|
||||
|
@ -62,7 +71,7 @@ var ProfileCmd = &cobra.Command{
|
|||
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)
|
||||
err := kubeconfig.SetCurrentContext(constants.KubeconfigPath, profile)
|
||||
if err != nil {
|
||||
out.ErrT(out.Sad, `Error while setting kubectl current context : {{.error}}`, out.V{"error": err})
|
||||
}
|
||||
|
|
|
@ -45,7 +45,7 @@ var profileListCmd = &cobra.Command{
|
|||
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`")
|
||||
exit.UsageT("No minikube profile was found. You can 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})
|
||||
|
|
|
@ -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"
|
||||
)
|
||||
|
||||
|
@ -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"
|
||||
)
|
||||
|
||||
|
@ -30,7 +31,7 @@ var configUnsetCmd = &cobra.Command{
|
|||
if len(args) != 1 {
|
||||
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)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -40,7 +40,7 @@ import (
|
|||
"k8s.io/minikube/pkg/minikube/out"
|
||||
"k8s.io/minikube/pkg/minikube/proxy"
|
||||
"k8s.io/minikube/pkg/minikube/service"
|
||||
"k8s.io/minikube/pkg/util"
|
||||
"k8s.io/minikube/pkg/util/retry"
|
||||
)
|
||||
|
||||
var (
|
||||
|
@ -110,7 +110,8 @@ var dashboardCmd = &cobra.Command{
|
|||
ns := "kube-system"
|
||||
svc := "kubernetes-dashboard"
|
||||
out.ErrT(out.Verifying, "Verifying dashboard health ...")
|
||||
if err = util.RetryAfter(180, func() error { return service.CheckService(ns, svc) }, 1*time.Second); err != nil {
|
||||
checkSVC := func() error { return service.CheckService(ns, svc) }
|
||||
if err = retry.Expo(checkSVC, 1*time.Second, time.Minute*3); err != nil {
|
||||
exit.WithCodeT(exit.Unavailable, "dashboard service is not running: {{.error}}", out.V{"error": err})
|
||||
}
|
||||
|
||||
|
@ -122,14 +123,15 @@ var dashboardCmd = &cobra.Command{
|
|||
url := dashboardURL(hostPort, ns, svc)
|
||||
|
||||
out.ErrT(out.Verifying, "Verifying proxy health ...")
|
||||
if err = util.RetryAfter(60, func() error { return checkURL(url) }, 1*time.Second); err != nil {
|
||||
chkURL := func() error { return checkURL(url) }
|
||||
if err = retry.Expo(chkURL, 1*time.Second, 3*time.Minute); err != nil {
|
||||
exit.WithCodeT(exit.Unavailable, "{{.url}} is not accessible: {{.error}}", out.V{"url": url, "error": err})
|
||||
}
|
||||
|
||||
if dashboardURLMode {
|
||||
out.Ln(url)
|
||||
} else {
|
||||
out.ErrT(out.Celebrate, "Opening %s in your default browser...", out.V{"url": url})
|
||||
out.T(out.Celebrate, "Opening {{.url}} in your default browser...", out.V{"url": url})
|
||||
if err = browser.OpenURL(url); err != nil {
|
||||
exit.WithCodeT(exit.Software, "failed to open browser: {{.error}}", out.V{"error": err})
|
||||
}
|
||||
|
@ -219,7 +221,7 @@ func checkURL(url string) error {
|
|||
return errors.Wrap(err, "checkURL")
|
||||
}
|
||||
if resp.StatusCode != http.StatusOK {
|
||||
return &util.RetriableError{
|
||||
return &retry.RetriableError{
|
||||
Err: fmt.Errorf("unexpected response code: %d", resp.StatusCode),
|
||||
}
|
||||
}
|
||||
|
@ -228,5 +230,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)
|
||||
}
|
||||
|
|
|
@ -18,23 +18,26 @@ package cmd
|
|||
|
||||
import (
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strconv"
|
||||
|
||||
"github.com/docker/machine/libmachine"
|
||||
"github.com/docker/machine/libmachine/mcnerror"
|
||||
"github.com/golang/glog"
|
||||
ps "github.com/mitchellh/go-ps"
|
||||
"github.com/pkg/errors"
|
||||
"github.com/spf13/cobra"
|
||||
"github.com/spf13/viper"
|
||||
cmdcfg "k8s.io/minikube/cmd/minikube/cmd/config"
|
||||
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/constants"
|
||||
"k8s.io/minikube/pkg/minikube/exit"
|
||||
"k8s.io/minikube/pkg/minikube/kubeconfig"
|
||||
"k8s.io/minikube/pkg/minikube/machine"
|
||||
"k8s.io/minikube/pkg/minikube/out"
|
||||
pkgutil "k8s.io/minikube/pkg/util"
|
||||
)
|
||||
|
||||
var deleteAll bool
|
||||
|
@ -143,6 +146,7 @@ func deleteProfile(profile *pkg_config.Profile) error {
|
|||
|
||||
cc, err := pkg_config.Load()
|
||||
if err != nil && !os.IsNotExist(err) {
|
||||
out.ErrT(out.Sad, "Error loading profile {{.name}}: {{.error}}", out.V{"name": profile, "error": err})
|
||||
delErr := profileDeletionErr(profile.Name, fmt.Sprintf("error loading profile config: %v", err))
|
||||
return DeletionError{Err: delErr, Errtype: MissingProfile}
|
||||
}
|
||||
|
@ -160,23 +164,32 @@ func deleteProfile(profile *pkg_config.Profile) error {
|
|||
}
|
||||
}
|
||||
|
||||
if err := killMountProcess(); err != nil {
|
||||
out.T(out.FailureType, "Failed to kill mount process: {{.error}}", out.V{"error": err})
|
||||
}
|
||||
|
||||
if err = cluster.DeleteHost(api); err != nil {
|
||||
switch err := errors.Cause(err).(type) {
|
||||
switch errors.Cause(err).(type) {
|
||||
case mcnerror.ErrHostDoesNotExist:
|
||||
delErr := profileDeletionErr(profile.Name, fmt.Sprintf("\"%s\" cluster does not exist", profile.Name))
|
||||
return DeletionError{Err: delErr, Errtype: MissingCluster}
|
||||
default:
|
||||
delErr := profileDeletionErr(profile.Name, fmt.Sprintf("failed to delete cluster %v", err))
|
||||
return DeletionError{Err: delErr, Errtype: Fatal}
|
||||
out.T(out.FailureType, "Failed to delete cluster: {{.error}}", out.V{"error": err})
|
||||
out.T(out.Notice, `You may need to manually remove the "{{.name}}" VM from your hypervisor`, out.V{"name": profile.Name})
|
||||
}
|
||||
}
|
||||
|
||||
if err := cmdUtil.KillMountProcess(); err != nil {
|
||||
delErr := profileDeletionErr(profile.Name, fmt.Sprintf("failed to kill mount process: %v", err))
|
||||
return DeletionError{Err: delErr, Errtype: Fatal}
|
||||
// In case DeleteHost didn't complete the job.
|
||||
machineDir := filepath.Join(constants.GetMinipath(), "machines", profile.Name)
|
||||
if _, err := os.Stat(machineDir); err == nil {
|
||||
out.T(out.DeletingHost, `Removing {{.directory}} ...`, out.V{"directory": machineDir})
|
||||
err := os.RemoveAll(machineDir)
|
||||
if err != nil {
|
||||
return DeletionError{Err: fmt.Errorf("unable to remove machine directory: %v", err), Errtype: Fatal}
|
||||
}
|
||||
}
|
||||
|
||||
if err := os.RemoveAll(constants.GetProfilePath(viper.GetString(pkg_config.MachineProfile))); err != nil {
|
||||
if err := pkg_config.DeleteProfile(profile.Name); err != nil {
|
||||
if os.IsNotExist(err) {
|
||||
delErr := profileDeletionErr(profile.Name, fmt.Sprintf("\"%s\" profile does not exist", profile.Name))
|
||||
return DeletionError{Err: delErr, Errtype: MissingProfile}
|
||||
|
@ -184,12 +197,16 @@ func deleteProfile(profile *pkg_config.Profile) error {
|
|||
delErr := profileDeletionErr(profile.Name, fmt.Sprintf("failed to remove profile %v", err))
|
||||
return DeletionError{Err: delErr, Errtype: Fatal}
|
||||
}
|
||||
out.T(out.Crushed, `The "{{.cluster_name}}" cluster has been deleted.`, out.V{"cluster_name": profile.Name})
|
||||
|
||||
out.T(out.Crushed, `The "{{.name}}" cluster has been deleted.`, out.V{"name": profile.Name})
|
||||
|
||||
machineName := pkg_config.GetMachineName()
|
||||
if err := pkgutil.DeleteKubeConfigContext(constants.KubeconfigPath, machineName); err != nil {
|
||||
delErr := profileDeletionErr(profile.Name, fmt.Sprintf("update config %v", err))
|
||||
return DeletionError{Err: delErr, Errtype: Fatal}
|
||||
if err := kubeconfig.DeleteContext(constants.KubeconfigPath, machineName); err != nil {
|
||||
return DeletionError{Err: fmt.Errorf("update config: %v", err), Errtype: Fatal}
|
||||
}
|
||||
|
||||
if err := cmdcfg.Unset(pkg_config.MachineProfile); err != nil {
|
||||
return DeletionError{Err: fmt.Errorf("unset minikube profile: %v", err), Errtype: Fatal}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
@ -272,7 +289,50 @@ func handleMultipleDeletionErrors(errors []error) {
|
|||
}
|
||||
}
|
||||
|
||||
func init() {
|
||||
deleteCmd.Flags().BoolVar(&deleteAll, "all", false, "Set flag to delete all profiles")
|
||||
RootCmd.AddCommand(deleteCmd)
|
||||
// killMountProcess kills the mount process, if it is running
|
||||
func killMountProcess() error {
|
||||
pidPath := filepath.Join(constants.GetMinipath(), constants.MountProcessFileName)
|
||||
if _, err := os.Stat(pidPath); os.IsNotExist(err) {
|
||||
return nil
|
||||
}
|
||||
|
||||
glog.Infof("Found %s ...", pidPath)
|
||||
out, err := ioutil.ReadFile(pidPath)
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "ReadFile")
|
||||
}
|
||||
glog.Infof("pidfile contents: %s", out)
|
||||
pid, err := strconv.Atoi(string(out))
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "error parsing pid")
|
||||
}
|
||||
// os.FindProcess does not check if pid is running :(
|
||||
entry, err := ps.FindProcess(pid)
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "ps.FindProcess")
|
||||
}
|
||||
if entry == nil {
|
||||
glog.Infof("Stale pid: %d", pid)
|
||||
if err := os.Remove(pidPath); err != nil {
|
||||
return errors.Wrap(err, "Removing stale pid")
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// We found a process, but it still may not be ours.
|
||||
glog.Infof("Found process %d: %s", pid, entry.Executable())
|
||||
proc, err := os.FindProcess(pid)
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "os.FindProcess")
|
||||
}
|
||||
|
||||
glog.Infof("Killing pid %d ...", pid)
|
||||
if err := proc.Kill(); err != nil {
|
||||
glog.Infof("Kill failed with %v - removing probably stale pid...", err)
|
||||
if err := os.Remove(pidPath); err != nil {
|
||||
return errors.Wrap(err, "Removing likely stale unkillable pid")
|
||||
}
|
||||
return errors.Wrap(err, fmt.Sprintf("Kill(%d/%s)", pid, entry.Executable()))
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
|
|
@ -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")
|
||||
|
|
|
@ -54,7 +54,3 @@ var ipCmd = &cobra.Command{
|
|||
out.Ln(ip)
|
||||
},
|
||||
}
|
||||
|
||||
func init() {
|
||||
RootCmd.AddCommand(ipCmd)
|
||||
}
|
||||
|
|
|
@ -86,7 +86,3 @@ kubectl get pods --namespace kube-system`,
|
|||
}
|
||||
},
|
||||
}
|
||||
|
||||
func init() {
|
||||
RootCmd.AddCommand(kubectlCmd)
|
||||
}
|
||||
|
|
|
@ -44,7 +44,7 @@ var (
|
|||
// logsCmd represents the logs command
|
||||
var logsCmd = &cobra.Command{
|
||||
Use: "logs",
|
||||
Short: "Gets the logs of the running instance, used for debugging minikube, not user code",
|
||||
Short: "Gets the logs of the running instance, used for debugging minikube, not user code.",
|
||||
Long: `Gets the logs of the running instance, used for debugging minikube, not user code.`,
|
||||
Run: func(cmd *cobra.Command, args []string) {
|
||||
cfg, err := config.Load()
|
||||
|
@ -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")
|
||||
}
|
||||
|
|
|
@ -27,8 +27,8 @@ import (
|
|||
"syscall"
|
||||
|
||||
"github.com/golang/glog"
|
||||
"github.com/pkg/errors"
|
||||
"github.com/spf13/cobra"
|
||||
cmdUtil "k8s.io/minikube/cmd/util"
|
||||
"k8s.io/minikube/pkg/minikube/cluster"
|
||||
"k8s.io/minikube/pkg/minikube/config"
|
||||
"k8s.io/minikube/pkg/minikube/constants"
|
||||
|
@ -62,7 +62,7 @@ var mountCmd = &cobra.Command{
|
|||
Long: `Mounts the specified directory into minikube.`,
|
||||
Run: func(cmd *cobra.Command, args []string) {
|
||||
if isKill {
|
||||
if err := cmdUtil.KillMountProcess(); err != nil {
|
||||
if err := killMountProcess(); err != nil {
|
||||
exit.WithError("Error killing mount process", err)
|
||||
}
|
||||
os.Exit(0)
|
||||
|
@ -118,7 +118,7 @@ var mountCmd = &cobra.Command{
|
|||
exit.WithCodeT(exit.Data, "error parsing the input ip address for mount")
|
||||
}
|
||||
}
|
||||
port, err := cmdUtil.GetPort()
|
||||
port, err := getPort()
|
||||
if err != nil {
|
||||
exit.WithError("Error finding port for mount", err)
|
||||
}
|
||||
|
@ -209,5 +209,19 @@ 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)
|
||||
}
|
||||
|
||||
// getPort asks the kernel for a free open port that is ready to use
|
||||
func getPort() (int, error) {
|
||||
addr, err := net.ResolveTCPAddr("tcp", "localhost:0")
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
l, err := net.ListenTCP("tcp", addr)
|
||||
if err != nil {
|
||||
return -1, errors.Errorf("Error accessing port %d", addr.Port)
|
||||
}
|
||||
defer l.Close()
|
||||
return l.Addr().(*net.TCPAddr).Port, nil
|
||||
}
|
||||
|
|
|
@ -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"
|
||||
|
@ -37,6 +38,7 @@ import (
|
|||
"k8s.io/minikube/pkg/minikube/constants"
|
||||
"k8s.io/minikube/pkg/minikube/exit"
|
||||
"k8s.io/minikube/pkg/minikube/notify"
|
||||
"k8s.io/minikube/pkg/minikube/translate"
|
||||
)
|
||||
|
||||
var dirs = [...]string{
|
||||
|
@ -100,12 +102,57 @@ var RootCmd = &cobra.Command{
|
|||
// Execute adds all child commands to the root command sets flags appropriately.
|
||||
// This is called by main.main(). It only needs to happen once to the rootCmd.
|
||||
func Execute() {
|
||||
for _, c := range RootCmd.Commands() {
|
||||
c.Short = translate.T(c.Short)
|
||||
c.Long = translate.T(c.Long)
|
||||
c.Flags().VisitAll(func(flag *pflag.Flag) {
|
||||
flag.Usage = translate.T(flag.Usage)
|
||||
})
|
||||
|
||||
c.SetUsageTemplate(usageTemplate())
|
||||
}
|
||||
RootCmd.Short = translate.T(RootCmd.Short)
|
||||
RootCmd.Long = translate.T(RootCmd.Long)
|
||||
RootCmd.Flags().VisitAll(func(flag *pflag.Flag) {
|
||||
flag.Usage = translate.T(flag.Usage)
|
||||
})
|
||||
|
||||
if err := RootCmd.Execute(); err != nil {
|
||||
// Cobra already outputs the error, typically because the user provided an unknown command.
|
||||
os.Exit(exit.BadUsage)
|
||||
}
|
||||
}
|
||||
|
||||
// usageTemplate just calls translate.T on the default usage template
|
||||
// explicitly using the raw string instead of calling c.UsageTemplate()
|
||||
// so the extractor can find this monstrosity of a string
|
||||
func usageTemplate() string {
|
||||
return fmt.Sprintf(`%s:{{if .Runnable}}
|
||||
{{.UseLine}}{{end}}{{if .HasAvailableSubCommands}}
|
||||
{{.CommandPath}} [command]{{end}}{{if gt (len .Aliases) 0}}
|
||||
|
||||
%s:
|
||||
{{.NameAndAliases}}{{end}}{{if .HasExample}}
|
||||
|
||||
%s:
|
||||
{{.Example}}{{end}}{{if .HasAvailableSubCommands}}
|
||||
|
||||
%s:{{range .Commands}}{{if (or .IsAvailableCommand (eq .Name "help"))}}
|
||||
{{rpad .Name .NamePadding }} {{.Short}}{{end}}{{end}}{{end}}{{if .HasAvailableLocalFlags}}
|
||||
|
||||
%s:
|
||||
{{.LocalFlags.FlagUsages | trimTrailingWhitespaces}}{{end}}{{if .HasAvailableInheritedFlags}}
|
||||
|
||||
%s:
|
||||
{{.InheritedFlags.FlagUsages | trimTrailingWhitespaces}}{{end}}{{if .HasHelpSubCommands}}
|
||||
|
||||
%s:{{range .Commands}}{{if .IsAdditionalHelpTopicCommand}}
|
||||
{{rpad .CommandPath .CommandPathPadding}} {{.Short}}{{end}}{{end}}{{end}}{{if .HasAvailableSubCommands}}
|
||||
|
||||
%s{{end}}
|
||||
`, translate.T("Usage"), translate.T("Aliases"), translate.T("Examples"), translate.T("Available Commands"), translate.T("Flags"), translate.T("Global Flags"), translate.T("Additional help topics"), translate.T(`Use "{{.CommandPath}} [command] --help" for more information about a command.`))
|
||||
}
|
||||
|
||||
// Handle config values for flags used in external packages (e.g. glog)
|
||||
// by setting them directly, using values from viper when not passed in as args
|
||||
func setFlagsUsingViper() {
|
||||
|
@ -126,16 +173,73 @@ func setFlagsUsingViper() {
|
|||
}
|
||||
|
||||
func init() {
|
||||
translate.DetermineLocale()
|
||||
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: translate.T("Basic Commands:"),
|
||||
Commands: []*cobra.Command{
|
||||
startCmd,
|
||||
statusCmd,
|
||||
stopCmd,
|
||||
deleteCmd,
|
||||
dashboardCmd,
|
||||
},
|
||||
},
|
||||
{
|
||||
Message: translate.T("Images Commands:"),
|
||||
Commands: []*cobra.Command{
|
||||
dockerEnvCmd,
|
||||
cacheCmd,
|
||||
},
|
||||
},
|
||||
{
|
||||
Message: translate.T("Configuration and Management Commands:"),
|
||||
Commands: []*cobra.Command{
|
||||
configCmd.AddonsCmd,
|
||||
configCmd.ConfigCmd,
|
||||
configCmd.ProfileCmd,
|
||||
updateContextCmd,
|
||||
},
|
||||
},
|
||||
{
|
||||
Message: translate.T("Networking and Connectivity Commands:"),
|
||||
Commands: []*cobra.Command{
|
||||
serviceCmd,
|
||||
tunnelCmd,
|
||||
},
|
||||
},
|
||||
{
|
||||
Message: translate.T("Advanced Commands:"),
|
||||
Commands: []*cobra.Command{
|
||||
mountCmd,
|
||||
sshCmd,
|
||||
kubectlCmd,
|
||||
},
|
||||
},
|
||||
{
|
||||
Message: translate.T("Troubleshooting Commands:"),
|
||||
Commands: []*cobra.Command{
|
||||
sshKeyCmd,
|
||||
ipCmd,
|
||||
logsCmd,
|
||||
updateCheckCmd,
|
||||
versionCmd,
|
||||
},
|
||||
},
|
||||
}
|
||||
groups.Add(RootCmd)
|
||||
|
||||
// Ungrouped commands will show up in the "Other Commands" section
|
||||
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)
|
||||
}
|
||||
|
||||
cobra.OnInitialize(initConfig)
|
||||
|
||||
}
|
||||
|
|
|
@ -79,9 +79,8 @@ func init() {
|
|||
serviceCmd.Flags().BoolVar(&serviceURLMode, "url", false, "Display the kubernetes service URL in the CLI instead of opening it in the default browser")
|
||||
serviceCmd.Flags().BoolVar(&https, "https", false, "Open the service URL with https instead of http")
|
||||
serviceCmd.Flags().IntVar(&wait, "wait", constants.DefaultWait, "Amount of time to wait for a service in seconds")
|
||||
serviceCmd.Flags().IntVar(&interval, "interval", constants.DefaultInterval, "The time interval for each check that wait performs in seconds")
|
||||
serviceCmd.Flags().IntVar(&interval, "interval", constants.DefaultInterval, "The initial time interval for each check that wait performs in seconds")
|
||||
|
||||
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)
|
||||
}
|
||||
|
|
|
@ -34,7 +34,3 @@ var sshKeyCmd = &cobra.Command{
|
|||
out.Ln(filepath.Join(constants.GetMinipath(), "machines", config.GetMachineName(), "id_rsa"))
|
||||
},
|
||||
}
|
||||
|
||||
func init() {
|
||||
RootCmd.AddCommand(sshKeyCmd)
|
||||
}
|
||||
|
|
|
@ -55,7 +55,3 @@ var sshCmd = &cobra.Command{
|
|||
}
|
||||
},
|
||||
}
|
||||
|
||||
func init() {
|
||||
RootCmd.AddCommand(sshCmd)
|
||||
}
|
||||
|
|
|
@ -17,9 +17,7 @@ limitations under the License.
|
|||
package cmd
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
"net"
|
||||
"net/url"
|
||||
"os"
|
||||
|
@ -32,8 +30,6 @@ import (
|
|||
"strings"
|
||||
"time"
|
||||
|
||||
"k8s.io/minikube/pkg/minikube/drivers/none"
|
||||
|
||||
"github.com/blang/semver"
|
||||
"github.com/docker/machine/libmachine"
|
||||
"github.com/docker/machine/libmachine/host"
|
||||
|
@ -41,11 +37,11 @@ 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"
|
||||
cmdcfg "k8s.io/minikube/cmd/minikube/cmd/config"
|
||||
cmdutil "k8s.io/minikube/cmd/util"
|
||||
"k8s.io/minikube/pkg/minikube/bootstrapper"
|
||||
"k8s.io/minikube/pkg/minikube/bootstrapper/kubeadm"
|
||||
"k8s.io/minikube/pkg/minikube/cluster"
|
||||
|
@ -53,12 +49,16 @@ import (
|
|||
cfg "k8s.io/minikube/pkg/minikube/config"
|
||||
"k8s.io/minikube/pkg/minikube/constants"
|
||||
"k8s.io/minikube/pkg/minikube/cruntime"
|
||||
"k8s.io/minikube/pkg/minikube/drivers/none"
|
||||
"k8s.io/minikube/pkg/minikube/exit"
|
||||
"k8s.io/minikube/pkg/minikube/kubeconfig"
|
||||
"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/util/lock"
|
||||
"k8s.io/minikube/pkg/util/retry"
|
||||
"k8s.io/minikube/pkg/version"
|
||||
)
|
||||
|
||||
|
@ -123,25 +123,31 @@ func init() {
|
|||
exit.WithError("unable to bind flags", err)
|
||||
}
|
||||
|
||||
RootCmd.AddCommand(startCmd)
|
||||
}
|
||||
|
||||
// initMinikubeFlags includes commandline flags for minikube.
|
||||
func initMinikubeFlags() {
|
||||
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)")
|
||||
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().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().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")
|
||||
startCmd.Flags().Bool(embedCerts, constants.DefaultEmbedCerts, "if true, will embed the certs in kubeconfig.")
|
||||
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
|
||||
|
@ -154,16 +160,16 @@ func initKubernetesFlags() {
|
|||
Valid kubeadm parameters: `+fmt.Sprintf("%s, %s", strings.Join(kubeadm.KubeadmExtraArgsWhitelist[kubeadm.KubeadmCmdParam], ", "), strings.Join(kubeadm.KubeadmExtraArgsWhitelist[kubeadm.KubeadmConfigParam], ",")))
|
||||
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().Int(apiServerPort, constants.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))
|
||||
startCmd.Flags().Bool(disableDriverMounts, false, "Disables the filesystem mounts provided by the hypervisors")
|
||||
|
||||
// kvm2
|
||||
startCmd.Flags().String(kvmNetwork, "default", "The KVM network name. (only supported with KVM driver)")
|
||||
|
@ -207,14 +213,67 @@ var startCmd = &cobra.Command{
|
|||
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) {
|
||||
out.T(out.Happy, "minikube {{.version}} on {{.os}} ({{.arch}})", out.V{"version": version.GetVersion(), "os": runtime.GOOS, "arch": runtime.GOARCH})
|
||||
prefix := ""
|
||||
if viper.GetString(cfg.MachineProfile) != constants.DefaultMachineName {
|
||||
prefix = fmt.Sprintf("[%s] ", viper.GetString(cfg.MachineProfile))
|
||||
}
|
||||
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")
|
||||
}
|
||||
|
||||
if err := cmdcfg.IsValidDriver(runtime.GOOS, viper.GetString(vmDriver)); err != nil {
|
||||
exit.WithCodeT(
|
||||
exit.Failure,
|
||||
"The driver '{{.driver}}' is not supported on {{.os}}",
|
||||
out.V{"driver": viper.GetString(vmDriver), "os": runtime.GOOS},
|
||||
)
|
||||
}
|
||||
|
||||
validateConfig()
|
||||
validateUser()
|
||||
validateDriverVersion(viper.GetString(vmDriver))
|
||||
|
||||
k8sVersion, isUpgrade := getKubernetesVersion()
|
||||
config, err := generateConfig(cmd, k8sVersion)
|
||||
config, err := generateCfgFromFlags(cmd, k8sVersion)
|
||||
if err != nil {
|
||||
exit.WithError("Failed to generate config", err)
|
||||
}
|
||||
|
@ -235,7 +294,6 @@ func runStart(cmd *cobra.Command, args []string) {
|
|||
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)
|
||||
|
@ -247,8 +305,13 @@ func runStart(cmd *cobra.Command, args []string) {
|
|||
|
||||
// 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)
|
||||
kubeconfig, err := setupKubeconfig(host, &config)
|
||||
if err != nil {
|
||||
exit.WithError("Failed to setup kubeconfig", err)
|
||||
}
|
||||
|
||||
// pull images or restart cluster
|
||||
bootstrapCluster(bs, cr, mRunner, config.KubernetesConfig, preExists, isUpgrade)
|
||||
configureMounts()
|
||||
|
@ -266,6 +329,33 @@ func runStart(cmd *cobra.Command, args []string) {
|
|||
|
||||
}
|
||||
|
||||
func setupKubeconfig(h *host.Host, c *cfg.Config) (*kubeconfig.Settings, error) {
|
||||
addr, err := h.Driver.GetURL()
|
||||
if err != nil {
|
||||
exit.WithError("Failed to get driver URL", err)
|
||||
}
|
||||
addr = strings.Replace(addr, "tcp://", "https://", -1)
|
||||
addr = strings.Replace(addr, ":2376", ":"+strconv.Itoa(c.KubernetesConfig.NodePort), -1)
|
||||
if c.KubernetesConfig.APIServerName != constants.APIServerName {
|
||||
addr = strings.Replace(addr, c.KubernetesConfig.NodeIP, c.KubernetesConfig.APIServerName, -1)
|
||||
}
|
||||
|
||||
kcs := &kubeconfig.Settings{
|
||||
ClusterName: cfg.GetMachineName(),
|
||||
ClusterServerAddress: addr,
|
||||
ClientCertificate: constants.MakeMiniPath("client.crt"),
|
||||
ClientKey: constants.MakeMiniPath("client.key"),
|
||||
CertificateAuthority: constants.MakeMiniPath("ca.crt"),
|
||||
KeepContext: viper.GetBool(keepContext),
|
||||
EmbedCerts: viper.GetBool(embedCerts),
|
||||
}
|
||||
kcs.SetPath(kubeconfig.PathFromEnv())
|
||||
if err := kubeconfig.Update(kcs); err != nil {
|
||||
return kcs, err
|
||||
}
|
||||
return kcs, nil
|
||||
}
|
||||
|
||||
func handleDownloadOnly(cacheGroup *errgroup.Group, k8sVersion string) {
|
||||
// If --download-only, complete the remaining downloads and exit.
|
||||
if !viper.GetBool(downloadOnly) {
|
||||
|
@ -334,7 +424,7 @@ func skipCache(config *cfg.Config) {
|
|||
|
||||
func showVersionInfo(k8sVersion string, cr cruntime.Manager) {
|
||||
version, _ := cr.Version()
|
||||
out.T(cr.Style(), "Configuring environment for Kubernetes {{.k8sVersion}} on {{.runtime}} {{.runtimeVersion}}", out.V{"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 {
|
||||
out.T(out.Option, "opt {{.docker_option}}", out.V{"docker_option": v})
|
||||
}
|
||||
|
@ -343,15 +433,11 @@ func showVersionInfo(k8sVersion string, cr cruntime.Manager) {
|
|||
}
|
||||
}
|
||||
|
||||
func showKubectlConnectInfo(kubeconfig *pkgutil.KubeConfigSetup) {
|
||||
if kubeconfig.KeepContext {
|
||||
out.T(out.Kubectl, "To connect to this cluster, use: kubectl --context={{.name}}", out.V{"name": kubeconfig.ClusterName})
|
||||
func showKubectlConnectInfo(kcs *kubeconfig.Settings) {
|
||||
if kcs.KeepContext {
|
||||
out.T(out.Kubectl, "To connect to this cluster, use: kubectl --context={{.name}}", out.V{"name": kcs.ClusterName})
|
||||
} else {
|
||||
if !viper.GetBool(waitUntilHealthy) {
|
||||
out.T(out.Ready, "kubectl has been configured configured to use {{.name}}", out.V{"name": cfg.GetMachineName()})
|
||||
} else {
|
||||
out.T(out.Ready, "Done! kubectl is now configured to use {{.name}}", out.V{"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 {
|
||||
|
@ -433,7 +519,7 @@ func validateUser() {
|
|||
func validateConfig() {
|
||||
diskSizeMB := pkgutil.CalculateSizeInMB(viper.GetString(humanReadableDiskSize))
|
||||
if 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)})
|
||||
exit.WithCodeT(exit.Config, "Requested disk size {{.requested_size}} is less than minimum of {{.minimum_size}}", out.V{"requested_size": diskSizeMB, "minimum_size": pkgutil.CalculateSizeInMB(constants.MinimumDiskSize)})
|
||||
}
|
||||
|
||||
err := autoSetOptions(viper.GetString(vmDriver))
|
||||
|
@ -443,7 +529,7 @@ func validateConfig() {
|
|||
|
||||
memorySizeMB := pkgutil.CalculateSizeInMB(viper.GetString(memory))
|
||||
if 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)})
|
||||
exit.UsageT("Requested memory allocation {{.requested_size}} is less than the minimum allowed of {{.minimum_size}}", out.V{"requested_size": memorySizeMB, "minimum_size": pkgutil.CalculateSizeInMB(constants.MinimumMemorySize)})
|
||||
}
|
||||
if memorySizeMB < 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.",
|
||||
|
@ -505,8 +591,8 @@ func waitCacheImages(g *errgroup.Group) {
|
|||
}
|
||||
}
|
||||
|
||||
// generateConfig generates cfg.Config based on flags and supplied arguments
|
||||
func generateConfig(cmd *cobra.Command, k8sVersion string) (cfg.Config, error) {
|
||||
// generateCfgFromFlags generates cfg.Config based on flags and supplied arguments
|
||||
func generateCfgFromFlags(cmd *cobra.Command, k8sVersion string) (cfg.Config, error) {
|
||||
r, err := cruntime.New(cruntime.Config{Type: viper.GetString(containerRuntime)})
|
||||
if err != nil {
|
||||
return cfg.Config{}, err
|
||||
|
@ -562,6 +648,7 @@ func generateConfig(cmd *cobra.Command, k8sVersion string) (cfg.Config, error) {
|
|||
cfg := cfg.Config{
|
||||
MachineConfig: cfg.MachineConfig{
|
||||
KeepContext: viper.GetBool(keepContext),
|
||||
EmbedCerts: viper.GetBool(embedCerts),
|
||||
MinikubeISO: viper.GetString(isoURL),
|
||||
Memory: pkgutil.CalculateSizeInMB(viper.GetString(memory)),
|
||||
CPUs: viper.GetInt(cpus),
|
||||
|
@ -632,7 +719,7 @@ func prepareNone(vmDriver string) {
|
|||
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.URL, "https://minikube.sigs.k8s.io/docs/reference/drivers/none/")
|
||||
out.T(out.Empty, "")
|
||||
}
|
||||
|
||||
|
@ -670,7 +757,8 @@ func startHost(api libmachine.API, mc cfg.MachineConfig) (*host.Host, bool) {
|
|||
}
|
||||
return err
|
||||
}
|
||||
if err = pkgutil.RetryAfter(3, start, 2*time.Second); err != nil {
|
||||
|
||||
if err = retry.Expo(start, 2*time.Second, 3*time.Minute, 5); err != nil {
|
||||
exit.WithError("Unable to start VM", err)
|
||||
}
|
||||
return host, exists
|
||||
|
@ -695,7 +783,7 @@ func validateNetwork(h *host.Host) string {
|
|||
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 {
|
||||
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})
|
||||
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://minikube.sigs.k8s.io/docs/reference/networking/proxy/ for more details", out.V{"ip_address": ip})
|
||||
warnedOnce = true
|
||||
}
|
||||
}
|
||||
|
@ -715,7 +803,7 @@ func validateKubernetesVersions(old *cfg.Config) (string, bool) {
|
|||
|
||||
nvs, err := semver.Make(strings.TrimPrefix(rawVersion, version.VersionPrefix))
|
||||
if err != nil {
|
||||
exit.WithCodeT(exit.Data, `Unable to parse "{{.kubenretes_version}}": {{.error}}`, out.V{"kubenretes_version": rawVersion, "error": err})
|
||||
exit.WithCodeT(exit.Data, `Unable to parse "{{.kubernetes_version}}": {{.error}}`, out.V{"kubernetes_version": rawVersion, "error": err})
|
||||
}
|
||||
nv := version.VersionPrefix + nvs.String()
|
||||
|
||||
|
@ -734,7 +822,7 @@ func validateKubernetesVersions(old *cfg.Config) (string, bool) {
|
|||
return nv, isUpgrade
|
||||
}
|
||||
if nvs.GT(ovs) {
|
||||
out.T(out.ThumbsUp, "minikube will upgrade the local cluster from Kubernetes {{.old}} to {{.new}}", out.V{"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
|
||||
|
@ -759,34 +847,6 @@ func setupKubeAdm(mAPI libmachine.API, kc cfg.KubernetesConfig) bootstrapper.Boo
|
|||
return bs
|
||||
}
|
||||
|
||||
// updateKubeConfig sets up kubectl
|
||||
func updateKubeConfig(h *host.Host, c *cfg.Config) *pkgutil.KubeConfigSetup {
|
||||
addr, err := h.Driver.GetURL()
|
||||
if err != nil {
|
||||
exit.WithError("Failed to get driver URL", err)
|
||||
}
|
||||
addr = strings.Replace(addr, "tcp://", "https://", -1)
|
||||
addr = strings.Replace(addr, ":2376", ":"+strconv.Itoa(c.KubernetesConfig.NodePort), -1)
|
||||
if c.KubernetesConfig.APIServerName != constants.APIServerName {
|
||||
addr = strings.Replace(addr, c.KubernetesConfig.NodeIP, c.KubernetesConfig.APIServerName, -1)
|
||||
}
|
||||
|
||||
kcs := &pkgutil.KubeConfigSetup{
|
||||
ClusterName: cfg.GetMachineName(),
|
||||
ClusterServerAddress: addr,
|
||||
ClientCertificate: constants.MakeMiniPath("client.crt"),
|
||||
ClientKey: constants.MakeMiniPath("client.key"),
|
||||
CertificateAuthority: constants.MakeMiniPath("ca.crt"),
|
||||
KeepContext: viper.GetBool(keepContext),
|
||||
EmbedCerts: viper.GetBool(embedCerts),
|
||||
}
|
||||
kcs.SetKubeConfigFile(cmdutil.GetKubeConfigPath())
|
||||
if err := pkgutil.SetupKubeConfig(kcs); err != nil {
|
||||
exit.WithError("Failed to setup kubeconfig", err)
|
||||
}
|
||||
return kcs
|
||||
}
|
||||
|
||||
// configureRuntimes does what needs to happen to get a runtime going.
|
||||
func configureRuntimes(runner cruntime.CommandRunner) cruntime.Manager {
|
||||
config := cruntime.Config{Type: viper.GetString(containerRuntime), Runner: runner}
|
||||
|
@ -820,7 +880,7 @@ func bootstrapCluster(bs bootstrapper.Bootstrapper, r cruntime.Manager, runner c
|
|||
}
|
||||
|
||||
if preexisting {
|
||||
out.T(out.Restarting, "Relaunching Kubernetes {{.version}} using {{.bootstrapper}} ... ", out.V{"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))
|
||||
}
|
||||
|
@ -854,89 +914,71 @@ func configureMounts() {
|
|||
if err := mountCmd.Start(); err != nil {
|
||||
exit.WithError("Error starting mount", err)
|
||||
}
|
||||
if err := ioutil.WriteFile(filepath.Join(constants.GetMinipath(), constants.MountProcessFileName), []byte(strconv.Itoa(mountCmd.Process.Pid)), 0644); err != nil {
|
||||
if err := lock.WriteFile(filepath.Join(constants.GetMinipath(), constants.MountProcessFileName), []byte(strconv.Itoa(mountCmd.Process.Pid)), 0644); err != nil {
|
||||
exit.WithError("Error writing mount pid", err)
|
||||
}
|
||||
}
|
||||
|
||||
// saveConfig saves profile cluster configuration in $MINIKUBE_HOME/profiles/<profilename>/config.json
|
||||
func saveConfig(clusterConfig *cfg.Config) error {
|
||||
data, err := json.MarshalIndent(clusterConfig, "", " ")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
glog.Infof("Saving config:\n%s", data)
|
||||
path := constants.GetProfileFile(viper.GetString(cfg.MachineProfile))
|
||||
if err := os.MkdirAll(filepath.Dir(path), 0700); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// If no config file exists, don't worry about swapping paths
|
||||
if _, err := os.Stat(path); os.IsNotExist(err) {
|
||||
if err := ioutil.WriteFile(path, data, 0600); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
tf, err := ioutil.TempFile(filepath.Dir(path), "config.json.tmp")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer os.Remove(tf.Name())
|
||||
|
||||
if err = ioutil.WriteFile(tf.Name(), data, 0600); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if err = tf.Close(); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if err = os.Remove(path); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if err = os.Rename(tf.Name(), path); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
func saveConfig(clusterCfg *cfg.Config) error {
|
||||
return cfg.CreateProfile(viper.GetString(cfg.MachineProfile), clusterCfg)
|
||||
}
|
||||
|
||||
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 {
|
||||
out.WarningT("Error checking driver version: {{.error}}", out.V{"error": 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.WithCodeT(exit.Failure, "Please upgrade the 'docker-machine-driver-kvm2'. {{.documentation_url}}", out.V{"documentation_url": 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 {
|
||||
out.WarningT("Error parsing vmDriver version: {{.error}}", out.V{"error": err})
|
||||
return
|
||||
}
|
||||
v := extractVMDriverVersion(string(output))
|
||||
|
||||
minikubeVersion, err := version.GetSemverVersion()
|
||||
if err != nil {
|
||||
out.WarningT("Error parsing minukube version: {{.error}}", out.V{"error": 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) {
|
||||
out.WarningT("The 'docker-machine-driver-kvm2' version is old. Please consider upgrading. {{.documentation_url}}", out.V{"documentation_url": 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 minikube 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},
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -25,14 +25,13 @@ import (
|
|||
"github.com/spf13/cobra"
|
||||
"github.com/spf13/viper"
|
||||
cmdcfg "k8s.io/minikube/cmd/minikube/cmd/config"
|
||||
"k8s.io/minikube/cmd/util"
|
||||
"k8s.io/minikube/pkg/minikube/cluster"
|
||||
"k8s.io/minikube/pkg/minikube/config"
|
||||
"k8s.io/minikube/pkg/minikube/constants"
|
||||
"k8s.io/minikube/pkg/minikube/exit"
|
||||
"k8s.io/minikube/pkg/minikube/kubeconfig"
|
||||
"k8s.io/minikube/pkg/minikube/machine"
|
||||
"k8s.io/minikube/pkg/minikube/out"
|
||||
pkgutil "k8s.io/minikube/pkg/util"
|
||||
)
|
||||
|
||||
var statusFormat string
|
||||
|
@ -93,10 +92,10 @@ var statusCmd = &cobra.Command{
|
|||
glog.Errorln("Error host driver ip status:", err)
|
||||
}
|
||||
|
||||
apiserverPort, err := pkgutil.GetPortFromKubeConfig(util.GetKubeConfigPath(), config.GetMachineName())
|
||||
apiserverPort, err := kubeconfig.Port(config.GetMachineName())
|
||||
if err != nil {
|
||||
// Fallback to presuming default apiserver port
|
||||
apiserverPort = pkgutil.APIServerPort
|
||||
apiserverPort = constants.APIServerPort
|
||||
}
|
||||
|
||||
apiserverSt, err = clusterBootstrapper.GetAPIServerStatus(ip, apiserverPort)
|
||||
|
@ -106,7 +105,7 @@ var statusCmd = &cobra.Command{
|
|||
returnCode |= clusterNotRunningStatusFlag
|
||||
}
|
||||
|
||||
ks, err := pkgutil.GetKubeConfigStatus(ip, util.GetKubeConfigPath(), config.GetMachineName())
|
||||
ks, err := kubeconfig.IsClusterInConfig(ip, config.GetMachineName())
|
||||
if err != nil {
|
||||
glog.Errorln("Error kubeconfig status:", err)
|
||||
}
|
||||
|
@ -144,5 +143,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)
|
||||
}
|
||||
|
|
|
@ -23,14 +23,14 @@ import (
|
|||
"github.com/pkg/errors"
|
||||
"github.com/spf13/cobra"
|
||||
"github.com/spf13/viper"
|
||||
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/constants"
|
||||
"k8s.io/minikube/pkg/minikube/exit"
|
||||
"k8s.io/minikube/pkg/minikube/kubeconfig"
|
||||
"k8s.io/minikube/pkg/minikube/machine"
|
||||
"k8s.io/minikube/pkg/minikube/out"
|
||||
pkgutil "k8s.io/minikube/pkg/util"
|
||||
"k8s.io/minikube/pkg/util/retry"
|
||||
)
|
||||
|
||||
// stopCmd represents the stop command
|
||||
|
@ -52,7 +52,6 @@ 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) {
|
||||
|
@ -64,24 +63,22 @@ func runStop(cmd *cobra.Command, args []string) {
|
|||
return err
|
||||
}
|
||||
}
|
||||
if err := pkgutil.RetryAfter(5, stop, 2*time.Second); err != nil {
|
||||
|
||||
if err := retry.Expo(stop, 5*time.Second, 3*time.Minute, 5); err != nil {
|
||||
exit.WithError("Unable to stop VM", err)
|
||||
}
|
||||
|
||||
if !nonexistent {
|
||||
out.T(out.Stopped, `"{{.profile_name}}" stopped.`, out.V{"profile_name": profile})
|
||||
}
|
||||
|
||||
if err := cmdUtil.KillMountProcess(); err != nil {
|
||||
if err := killMountProcess(); err != nil {
|
||||
out.T(out.WarningType, "Unable to kill mount process: {{.error}}", out.V{"error": err})
|
||||
}
|
||||
|
||||
machineName := pkg_config.GetMachineName()
|
||||
err = pkgutil.UnsetCurrentContext(constants.KubeconfigPath, machineName)
|
||||
err = kubeconfig.UnsetCurrentContext(constants.KubeconfigPath, machineName)
|
||||
if err != nil {
|
||||
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)
|
||||
}
|
||||
|
|
|
@ -48,7 +48,3 @@ var updateCheckCmd = &cobra.Command{
|
|||
out.Ln("LatestVersion: %s", r[0].Name)
|
||||
},
|
||||
}
|
||||
|
||||
func init() {
|
||||
RootCmd.AddCommand(updateCheckCmd)
|
||||
}
|
||||
|
|
|
@ -22,9 +22,9 @@ import (
|
|||
"k8s.io/minikube/pkg/minikube/config"
|
||||
"k8s.io/minikube/pkg/minikube/constants"
|
||||
"k8s.io/minikube/pkg/minikube/exit"
|
||||
"k8s.io/minikube/pkg/minikube/kubeconfig"
|
||||
"k8s.io/minikube/pkg/minikube/machine"
|
||||
"k8s.io/minikube/pkg/minikube/out"
|
||||
"k8s.io/minikube/pkg/util"
|
||||
)
|
||||
|
||||
// updateContextCmd represents the update-context command
|
||||
|
@ -44,7 +44,7 @@ var updateContextCmd = &cobra.Command{
|
|||
if err != nil {
|
||||
exit.WithError("Error host driver ip status", err)
|
||||
}
|
||||
updated, err := util.UpdateKubeconfigIP(ip, constants.KubeconfigPath, machineName)
|
||||
updated, err := kubeconfig.UpdateIP(ip, constants.KubeconfigPath, machineName)
|
||||
if err != nil {
|
||||
exit.WithError("update config", err)
|
||||
}
|
||||
|
@ -56,7 +56,3 @@ var updateContextCmd = &cobra.Command{
|
|||
|
||||
},
|
||||
}
|
||||
|
||||
func init() {
|
||||
RootCmd.AddCommand(updateContextCmd)
|
||||
}
|
||||
|
|
|
@ -38,7 +38,3 @@ var versionCmd = &cobra.Command{
|
|||
}
|
||||
},
|
||||
}
|
||||
|
||||
func init() {
|
||||
RootCmd.AddCommand(versionCmd)
|
||||
}
|
||||
|
|
|
@ -23,13 +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/constants"
|
||||
"k8s.io/minikube/pkg/minikube/machine"
|
||||
"k8s.io/minikube/pkg/minikube/out"
|
||||
"k8s.io/minikube/pkg/minikube/translate"
|
||||
_ "k8s.io/minikube/pkg/provision"
|
||||
)
|
||||
|
||||
|
@ -47,7 +50,6 @@ func main() {
|
|||
}
|
||||
out.SetOutFile(os.Stdout)
|
||||
out.SetErrFile(os.Stderr)
|
||||
translate.DetermineLocale()
|
||||
cmd.Execute()
|
||||
}
|
||||
|
||||
|
|
104
cmd/util/util.go
104
cmd/util/util.go
|
@ -1,104 +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.
|
||||
*/
|
||||
|
||||
// Package util is a hodge-podge of utility functions that should be moved elsewhere.
|
||||
package util
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
"net"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strconv"
|
||||
|
||||
"github.com/golang/glog"
|
||||
ps "github.com/mitchellh/go-ps"
|
||||
"github.com/pkg/errors"
|
||||
"k8s.io/minikube/pkg/minikube/constants"
|
||||
)
|
||||
|
||||
// GetPort asks the kernel for a free open port that is ready to use
|
||||
func GetPort() (int, error) {
|
||||
addr, err := net.ResolveTCPAddr("tcp", "localhost:0")
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
l, err := net.ListenTCP("tcp", addr)
|
||||
if err != nil {
|
||||
return -1, errors.Errorf("Error accessing port %d", addr.Port)
|
||||
}
|
||||
defer l.Close()
|
||||
return l.Addr().(*net.TCPAddr).Port, nil
|
||||
}
|
||||
|
||||
// KillMountProcess kills the mount process, if it is running
|
||||
func KillMountProcess() error {
|
||||
pidPath := filepath.Join(constants.GetMinipath(), constants.MountProcessFileName)
|
||||
if _, err := os.Stat(pidPath); os.IsNotExist(err) {
|
||||
return nil
|
||||
}
|
||||
|
||||
glog.Infof("Found %s ...", pidPath)
|
||||
out, err := ioutil.ReadFile(pidPath)
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "ReadFile")
|
||||
}
|
||||
glog.Infof("pidfile contents: %s", out)
|
||||
pid, err := strconv.Atoi(string(out))
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "error parsing pid")
|
||||
}
|
||||
// os.FindProcess does not check if pid is running :(
|
||||
entry, err := ps.FindProcess(pid)
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "ps.FindProcess")
|
||||
}
|
||||
if entry == nil {
|
||||
glog.Infof("Stale pid: %d", pid)
|
||||
if err := os.Remove(pidPath); err != nil {
|
||||
return errors.Wrap(err, "Removing stale pid")
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// We found a process, but it still may not be ours.
|
||||
glog.Infof("Found process %d: %s", pid, entry.Executable())
|
||||
proc, err := os.FindProcess(pid)
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "os.FindProcess")
|
||||
}
|
||||
|
||||
glog.Infof("Killing pid %d ...", pid)
|
||||
if err := proc.Kill(); err != nil {
|
||||
glog.Infof("Kill failed with %v - removing probably stale pid...", err)
|
||||
if err := os.Remove(pidPath); err != nil {
|
||||
return errors.Wrap(err, "Removing likely stale unkillable pid")
|
||||
}
|
||||
return errors.Wrap(err, fmt.Sprintf("Kill(%d/%s)", pid, entry.Executable()))
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// GetKubeConfigPath gets the path to the first kubeconfig
|
||||
func GetKubeConfigPath() string {
|
||||
kubeConfigEnv := os.Getenv(constants.KubeconfigEnvVar)
|
||||
if kubeConfigEnv == "" {
|
||||
return constants.KubeconfigPath
|
||||
}
|
||||
return filepath.SplitList(kubeConfigEnv)[0]
|
||||
}
|
|
@ -1,47 +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.
|
||||
*/
|
||||
|
||||
package util
|
||||
|
||||
import (
|
||||
"os"
|
||||
"testing"
|
||||
|
||||
"k8s.io/client-go/tools/clientcmd"
|
||||
)
|
||||
|
||||
func TestGetKubeConfigPath(t *testing.T) {
|
||||
var tests = []struct {
|
||||
input string
|
||||
want string
|
||||
}{
|
||||
{
|
||||
input: "/home/fake/.kube/.kubeconfig",
|
||||
want: "/home/fake/.kube/.kubeconfig",
|
||||
},
|
||||
{
|
||||
input: "/home/fake/.kube/.kubeconfig:/home/fake2/.kubeconfig",
|
||||
want: "/home/fake/.kube/.kubeconfig",
|
||||
},
|
||||
}
|
||||
|
||||
for _, test := range tests {
|
||||
os.Setenv(clientcmd.RecommendedConfigPathEnvVar, test.input)
|
||||
if result := GetKubeConfigPath(); result != test.want {
|
||||
t.Errorf("Expected first splitted chunk, got: %s", result)
|
||||
}
|
||||
}
|
||||
}
|
|
@ -47,6 +47,7 @@ spec:
|
|||
value: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/node/bin
|
||||
- name: SYSTEMD_IGNORE_CHROOT
|
||||
value: "yes"
|
||||
imagePullPolicy: IfNotPresent
|
||||
volumes:
|
||||
- name: node
|
||||
hostPath:
|
||||
|
|
|
@ -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,5 +1,5 @@
|
|||
## storage-provisioner-gluster addon
|
||||
[Gluster](https://gluster.org/), a scalable network filesystem that provides dynamic provisioning of PersistenVolumeClaims.
|
||||
[Gluster](https://gluster.org/), a scalable network filesystem that provides dynamic provisioning of PersistentVolumeClaims.
|
||||
|
||||
### Starting Minikube
|
||||
This addon works within Minikube, without any additional configuration.
|
||||
|
|
|
@ -0,0 +1,2 @@
|
|||
[Unit]
|
||||
ConditionVirtualization=!oracle
|
|
@ -47,6 +47,8 @@ BR2_PACKAGE_SOCAT=y
|
|||
BR2_PACKAGE_SUDO=y
|
||||
BR2_PACKAGE_ACL=y
|
||||
BR2_PACKAGE_COREUTILS=y
|
||||
BR2_PACKAGE_LIBRESSL=y
|
||||
BR2_PACKAGE_LIBRESSL_BIN=y
|
||||
BR2_PACKAGE_OPENVMTOOLS=y
|
||||
BR2_PACKAGE_OPENVMTOOLS_PROCPS=y
|
||||
BR2_PACKAGE_SYSTEMD_LOGIND=y
|
||||
|
@ -59,4 +61,4 @@ BR2_TARGET_ROOTFS_ISO9660=y
|
|||
BR2_TARGET_ROOTFS_ISO9660_BOOT_MENU="$(BR2_EXTERNAL_MINIKUBE_PATH)/board/coreos/minikube/isolinux.cfg"
|
||||
BR2_TARGET_SYSLINUX=y
|
||||
BR2_PACKAGE_HOST_E2TOOLS=y
|
||||
BR2_PACKAGE_SYSTEMD_TIMESYNCD=n
|
||||
BR2_PACKAGE_SYSTEMD_TIMESYNCD=y
|
||||
|
|
|
@ -1,4 +1,20 @@
|
|||
[
|
||||
{
|
||||
"name": "v1.3.1",
|
||||
"checksums": {
|
||||
"darwin": "5947abe57fa390fcfd96849ac87fc9319f026d4b13f944b6beecc3615e3668be",
|
||||
"linux": "057a4f4ca36ff51ecad59509d94d3694543b874949e805e2b79792ceef21f983",
|
||||
"windows": "be1999452b166de72f946aac17ca7c40d53b8a5c8f59dad912c2413f7cc42563"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "v1.3.0",
|
||||
"checksums": {
|
||||
"darwin": "5bda29e2d990bb8ac9da1767143e228772adc45507d22a49b5af70b03e7db682",
|
||||
"linux": "5aa7c5f0b6dd09348f7e2435b9618f6a916fbb573580619b393b514258771eab",
|
||||
"windows": "d808b6e42e6f53c9338d135a352bebd4469634f33646d06e7cad3569330225cb"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "v1.2.0",
|
||||
"checksums": {
|
||||
|
|
|
@ -1,11 +1 @@
|
|||
# Accessing Host Resources From Inside A Pod
|
||||
|
||||
## When you have a VirtualBox driver
|
||||
|
||||
In order to access host resources from inside a pod, run the following command to determine the host IP you can use:
|
||||
|
||||
```shell
|
||||
ip addr
|
||||
```
|
||||
|
||||
The IP address under `vboxnet1` is the IP that you need to access the host from within a pod.
|
||||
This document has moved to https://minikube.sigs.k8s.io/docs/tasks/accessing-host-resources/
|
|
@ -1,50 +1 @@
|
|||
# Add-ons
|
||||
|
||||
Minikube has a set of built in addons that can be used enabled, disabled, and opened inside of the local k8s environment. Below is an example of this functionality for the `heapster` addon:
|
||||
|
||||
```shell
|
||||
$ minikube addons list
|
||||
- registry: disabled
|
||||
- registry-creds: disabled
|
||||
- freshpod: disabled
|
||||
- addon-manager: enabled
|
||||
- dashboard: enabled
|
||||
- heapster: disabled
|
||||
- efk: disabled
|
||||
- ingress: disabled
|
||||
- default-storageclass: enabled
|
||||
- storage-provisioner: enabled
|
||||
- storage-provisioner-gluster: disabled
|
||||
- nvidia-driver-installer: disabled
|
||||
- nvidia-gpu-device-plugin: disabled
|
||||
|
||||
# minikube must be running for these commands to take effect
|
||||
$ minikube addons enable heapster
|
||||
heapster was successfully enabled
|
||||
|
||||
$ minikube addons open heapster # This will open grafana (interacting w/ heapster) in the browser
|
||||
Waiting, endpoint for service is not ready yet...
|
||||
Waiting, endpoint for service is not ready yet...
|
||||
Created new window in existing browser session.
|
||||
```
|
||||
|
||||
The currently supported addons include:
|
||||
|
||||
* [Kubernetes Dashboard](https://github.com/kubernetes/kubernetes/tree/master/cluster/addons/dashboard)
|
||||
* [Heapster](https://github.com/kubernetes/heapster): [Troubleshooting Guide](https://github.com/kubernetes/heapster/blob/master/docs/influxdb.md) Note:You will need to login to Grafana as admin/admin in order to access the console
|
||||
* [EFK](https://github.com/kubernetes/kubernetes/tree/master/cluster/addons/fluentd-elasticsearch)
|
||||
* [Registry](https://github.com/kubernetes/minikube/tree/master/deploy/addons/registry)
|
||||
* [Registry Credentials](https://github.com/upmc-enterprises/registry-creds)
|
||||
* [Ingress](https://github.com/kubernetes/ingress-nginx)
|
||||
* [Freshpod](https://github.com/GoogleCloudPlatform/freshpod)
|
||||
* [nvidia-driver-installer](https://github.com/GoogleCloudPlatform/container-engine-accelerators/tree/master/nvidia-driver-installer/minikube)
|
||||
* [nvidia-gpu-device-plugin](https://github.com/GoogleCloudPlatform/container-engine-accelerators/tree/master/cmd/nvidia_gpu)
|
||||
* [logviewer](https://github.com/ivans3/minikube-log-viewer)
|
||||
* [gvisor](../deploy/addons/gvisor/README.md)
|
||||
* [storage-provisioner-gluster](../deploy/addons/storage-provisioner-gluster/README.md)
|
||||
|
||||
If you would like to have minikube properly start/restart custom addons, place the addon(s) you wish to be launched with minikube in the `.minikube/addons` directory. Addons in this folder will be moved to the minikube VM and launched each time minikube is started/restarted.
|
||||
|
||||
If you have a request for an addon in minikube, please open an issue with the name and preferably a link to the addon with a description of its purpose and why it should be added. You can also attempt to add the addon to minikube by following the guide at [Adding an Addon](contributors/adding_an_addon.md)
|
||||
|
||||
**Note:** If you want to have a look at the default configuration for the addons, see [deploy/addons](https://github.com/kubernetes/minikube/tree/master/deploy/addons).
|
||||
This document has moved to https://minikube.sigs.k8s.io/docs/tasks/addons/
|
||||
|
|
|
@ -1,41 +1 @@
|
|||
# Alternative runtimes
|
||||
|
||||
## Using CRI-O
|
||||
|
||||
To use [CRI-O](https://github.com/kubernetes-sigs/cri-o) as the container runtime, run:
|
||||
|
||||
```shell
|
||||
$ minikube start --container-runtime=cri-o
|
||||
```
|
||||
|
||||
Or you can use the extended version:
|
||||
|
||||
```shell
|
||||
$ minikube start --container-runtime=cri-o \
|
||||
--network-plugin=cni \
|
||||
--enable-default-cni \
|
||||
--cri-socket=/var/run/crio/crio.sock \
|
||||
--extra-config=kubelet.container-runtime=remote \
|
||||
--extra-config=kubelet.container-runtime-endpoint=unix:///var/run/crio/crio.sock \
|
||||
--extra-config=kubelet.image-service-endpoint=unix:///var/run/crio/crio.sock
|
||||
```
|
||||
|
||||
## Using containerd
|
||||
|
||||
To use [containerd](https://github.com/containerd/containerd) as the container runtime, run:
|
||||
|
||||
```shell
|
||||
$ minikube start --container-runtime=containerd
|
||||
```
|
||||
|
||||
Or you can use the extended version:
|
||||
|
||||
```shell
|
||||
$ minikube start --container-runtime=containerd \
|
||||
--network-plugin=cni \
|
||||
--enable-default-cni \
|
||||
--cri-socket=/run/containerd/containerd.sock \
|
||||
--extra-config=kubelet.container-runtime=remote \
|
||||
--extra-config=kubelet.container-runtime-endpoint=unix:///run/containerd/containerd.sock \
|
||||
--extra-config=kubelet.image-service-endpoint=unix:///run/containerd/containerd.sock
|
||||
```
|
||||
This document has moved to https://minikube.sigs.k8s.io/docs/reference/runtimes/
|
||||
|
|
|
@ -1,31 +1 @@
|
|||
# Building images within the VM
|
||||
|
||||
When using a single VM of Kubernetes it's really handy to build inside the VM; as this means you don't have to build on your host machine and push the image into a docker registry - you can just build inside the same machine as minikube which speeds up local experiments.
|
||||
|
||||
## Docker (containerd)
|
||||
|
||||
For Docker, you can either set up your host docker client to communicate by [reusing the docker daemon](reusing_the_docker_daemon.md).
|
||||
|
||||
Or you can use `minikube ssh` to connect to the virtual machine, and run the `docker build` there:
|
||||
|
||||
```shell
|
||||
docker build
|
||||
```
|
||||
|
||||
For more information on the `docker build` command, read the [Docker documentation](https://docs.docker.com/engine/reference/commandline/build/) (docker.com).
|
||||
|
||||
## Podman (cri-o)
|
||||
|
||||
For Podman, there is no daemon running. The processes are started by the user, monitored by `conmon`.
|
||||
|
||||
So you need to use `minikube ssh`, and you will also make sure to run the command as the root user:
|
||||
|
||||
```shell
|
||||
sudo -E podman build
|
||||
```
|
||||
|
||||
For more information on the `podman build` command, read the [Podman documentation](https://github.com/containers/libpod/blob/master/docs/podman-build.1.md) (podman.io).
|
||||
|
||||
## Build context
|
||||
|
||||
For the build context you can use any directory on the virtual machine, or any address on the network.
|
||||
This document has moved to https://minikube.sigs.k8s.io/docs/tasks/building_within/
|
||||
|
|
|
@ -1,20 +1 @@
|
|||
# Caching Images
|
||||
|
||||
Minikube supports caching non-minikube images using the `minikube cache` command. Images can be added to the cache by running `minikube cache add <img>`, and deleted by running `minikube cache delete <img>`.
|
||||
|
||||
Images in the cache will be loaded on `minikube start`. If you want to list all available cached images, you can use `minikube cache list` command to list. Below is an example of this functionality:
|
||||
|
||||
```shell
|
||||
# cache a image into $HOME/.minikube/cache/images
|
||||
$ minikube cache add ubuntu:16.04
|
||||
$ minikube cache add redis:3
|
||||
|
||||
# list cached images
|
||||
$ minikube cache list
|
||||
redis:3
|
||||
ubuntu:16.04
|
||||
|
||||
# delete cached images
|
||||
$ minikube cache delete ubuntu:16.04
|
||||
$ minikube cache delete $(minikube cache list)
|
||||
```
|
||||
This document has moved to https://minikube.sigs.k8s.io/docs/tasks/caching
|
||||
|
|
|
@ -1,340 +1 @@
|
|||
# minikube CLI Commands
|
||||
This document serves as a reference to all the commands, flags and their accepted arguments
|
||||
|
||||
## Global Flags
|
||||
These flags can be used globally with any command on the CLI. Following are the global flags -
|
||||
```
|
||||
--alsologtostderr log to standard error as well as files
|
||||
-b, --bootstrapper string The name of the cluster bootstrapper that will set up the kubernetes cluster. (default "kubeadm")
|
||||
-h, --help help for minikube
|
||||
--log_backtrace_at traceLocation when logging hits line file:N, emit a stack trace (default :0)
|
||||
--log_dir string If non-empty, write log files in this directory
|
||||
--logtostderr log to standard error instead of files
|
||||
-p, --profile string The name of the minikube VM being used.
|
||||
This can be modified to allow for multiple minikube instances to be run independently (default "minikube")
|
||||
--stderrthreshold severity logs at or above this threshold go to stderr (default 2)
|
||||
-v, --v Level log level for V logs
|
||||
--vmodule moduleSpec comma-separated list of pattern=N settings for file-filtered logging
|
||||
```
|
||||
|
||||
## Commands
|
||||
In this section, all commands which are accepted by the `minikube` CLI are described. To get help about any command, you can also type in `minikube help <command>`
|
||||
|
||||
---
|
||||
### addons
|
||||
**Description -** Modifies minikube addons files using subcommands like `minikube addons enable heapster`
|
||||
**Usage -**
|
||||
```
|
||||
minikube addons SUBCOMMAND [flags]
|
||||
minikube addons [command]
|
||||
```
|
||||
**Available Subcommands -**
|
||||
```
|
||||
configure Configures the addon w/ADDON_NAME within minikube (example: minikube addons configure registry-creds). For a list of available addons use: minikube addons list
|
||||
disable Disables the addon w/ADDON_NAME within minikube (example: minikube addons disable dashboard). For a list of available addons use: minikube addons list
|
||||
enable Enables the addon w/ADDON_NAME within minikube (example: minikube addons enable dashboard). For a list of available addons use: minikube addons list
|
||||
list Lists all available minikube addons as well as their current statuses (enabled/disabled)
|
||||
open Opens the addon w/ADDON_NAME within minikube (example: minikube addons open dashboard). For a list of available addons use: minikube addons list
|
||||
```
|
||||
|
||||
---
|
||||
### cache
|
||||
**Description -** Add or delete an image from the local cache.
|
||||
**Usage -** `minikube cache [command]`
|
||||
**Available Subcommands-**
|
||||
```
|
||||
add Add an image to local cache.
|
||||
delete Delete an image from the local cache.
|
||||
list List all available images from the local cache.
|
||||
```
|
||||
|
||||
---
|
||||
### completion
|
||||
**Description -**
|
||||
|
||||
> Outputs minikube shell completion for the given shell (bash or zsh)
|
||||
>
|
||||
> This depends on the bash-completion binary. Example installation instructions:
|
||||
> OS X:
|
||||
> $ brew install bash-completion
|
||||
> $ source $(brew --prefix)/etc/bash_completion
|
||||
> $ minikube completion bash > ~/.minikube-completion # for bash users
|
||||
> $ minikube completion zsh > ~/.minikube-completion # for zsh users
|
||||
> $ source ~/.minikube-completion
|
||||
> Ubuntu:
|
||||
> $ apt-get install bash-completion
|
||||
> $ source /etc/bash-completion
|
||||
> $ source <(minikube completion bash) # for bash users
|
||||
> $ source <(minikube completion zsh) # for zsh users
|
||||
>
|
||||
> Additionally, you may want to output the completion to a file and source in your .bashrc
|
||||
>
|
||||
> Note for zsh users: [1] zsh completions are only supported in versions of zsh >= 5.2
|
||||
**Usage -** `minikube completion SHELL`
|
||||
|
||||
---
|
||||
### config
|
||||
**Description -** config modifies minikube config files using subcommands like `minikube config set vm-driver kvm`
|
||||
Configurable fields:
|
||||
* vm-driver
|
||||
* feature-gates
|
||||
* v
|
||||
* cpus
|
||||
* disk-size
|
||||
* host-only-cidr
|
||||
* memory
|
||||
* log_dir
|
||||
* kubernetes-version
|
||||
* iso-url
|
||||
* WantUpdateNotification
|
||||
* ReminderWaitPeriodInHours
|
||||
* WantReportError
|
||||
* WantReportErrorPrompt
|
||||
* WantKubectlDownloadMsg
|
||||
* WantNoneDriverWarning
|
||||
* profile
|
||||
* bootstrapper
|
||||
* ShowDriverDeprecationNotification
|
||||
* ShowBootstrapperDeprecationNotification
|
||||
* dashboard
|
||||
* addon-manager
|
||||
* default-storageclass
|
||||
* heapster
|
||||
* efk
|
||||
* ingress
|
||||
* registry
|
||||
* registry-creds
|
||||
* freshpod
|
||||
* default-storageclass
|
||||
* storage-provisioner
|
||||
* storage-provisioner-gluster
|
||||
* metrics-server
|
||||
* nvidia-driver-installer
|
||||
* nvidia-gpu-device-plugin
|
||||
* logviewer
|
||||
* gvisor
|
||||
* hyperv-virtual-switch
|
||||
* disable-driver-mounts
|
||||
* cache
|
||||
* embed-certs
|
||||
|
||||
**Usage -**
|
||||
```
|
||||
minikube config SUBCOMMAND [flags]
|
||||
minikube config [command]
|
||||
```
|
||||
**Available Subcommands-**
|
||||
```
|
||||
get Gets the value of PROPERTY_NAME from the minikube config file
|
||||
set Sets an individual value in a minikube config file
|
||||
unset unsets an individual value in a minikube config file
|
||||
view Display values currently set in the minikube config file
|
||||
```
|
||||
|
||||
---
|
||||
### dashboard
|
||||
**Description -** Access the kubernetes dashboard running within the minikube cluster
|
||||
**Usage -** `minikube dashboard [flags]`
|
||||
**Available Flags -**
|
||||
```
|
||||
-h, --help help for dashboard
|
||||
--url Display dashboard URL instead of opening a browser
|
||||
```
|
||||
|
||||
---
|
||||
### delete
|
||||
**Description -** Deletes a local kubernetes cluster. This command deletes the VM, and removes all
|
||||
associated files.
|
||||
**Usage -** `minikube delete`
|
||||
|
||||
---
|
||||
### docker-env
|
||||
**Description -** Sets up docker env variables; similar to '$(docker-machine env)'.
|
||||
**Usage -** `minikube docker-env [flags]`
|
||||
**Available Flags -**
|
||||
```
|
||||
-h, --help help for docker-env
|
||||
--no-proxy Add machine IP to NO_PROXY environment variable
|
||||
--shell string Force environment to be configured for a specified shell: [fish, cmd, powershell, tcsh, bash, zsh], default is auto-detect
|
||||
-u, --unset Unset variables instead of setting them
|
||||
```
|
||||
|
||||
---
|
||||
### help
|
||||
**Description -** Help provides help for any command in the application. Simply type minikube help [path to command] for full details.
|
||||
**Usage -** `minikube help [command] [flags]`
|
||||
|
||||
---
|
||||
### ip
|
||||
**Description -** Retrieves the IP address of the running cluster, and writes it to STDOUT.
|
||||
**Usage -** `minikube ip`
|
||||
|
||||
---
|
||||
### kubectl
|
||||
**Description -** Run the kubernetes client, download it if necessary.
|
||||
**Usage -** `minikube kubectl`
|
||||
|
||||
---
|
||||
### logs
|
||||
**Description -** Gets the logs of the running instance, used for debugging minikube, not user code.
|
||||
**Usage -** `minikube logs [flags]`
|
||||
**Available Flags -**
|
||||
```
|
||||
-f, --follow Show only the most recent journal entries, and continuously print new entries as they are appended to the journal.
|
||||
-h, --help help for logs
|
||||
-n, --length int Number of lines back to go within the log (default 50)
|
||||
--problems Show only log entries which point to known problems
|
||||
```
|
||||
|
||||
---
|
||||
### mount
|
||||
**Description -** Mounts the specified directory into minikube.
|
||||
**Usage -** `minikube mount [flags] <source directory>:<target directory>`
|
||||
**Available Flags -**
|
||||
```
|
||||
--9p-version string Specify the 9p version that the mount should use (default "9p2000.L")
|
||||
--gid string Default group id used for the mount (default "docker")
|
||||
-h, --help help for mount
|
||||
--ip string Specify the ip that the mount should be setup on
|
||||
--kill Kill the mount process spawned by minikube start
|
||||
--mode uint File permissions used for the mount (default 493)
|
||||
--msize int The number of bytes to use for 9p packet payload (default 262144)
|
||||
--options strings Additional mount options, such as cache=fscache
|
||||
--type string Specify the mount filesystem type (supported types: 9p) (default "9p")
|
||||
--uid string Default user id used for the mount (default "docker")
|
||||
```
|
||||
|
||||
---
|
||||
### profile
|
||||
**Description -** Sets the current minikube profile, or gets the current profile if no arguments are provided. This is used to run and manage multiple minikube instance. You can return to the default minikube profile by running `minikube profile default`
|
||||
**Usage -**
|
||||
```
|
||||
minikube profile [MINIKUBE_PROFILE_NAME]. You can return to the default minikube profile by running `minikube profile default` [flags]
|
||||
```
|
||||
|
||||
---
|
||||
### service
|
||||
**Description -** Gets the kubernetes URL(s) for the specified service in your local cluster. In the case of multiple URLs they will be printed one at a time.
|
||||
**Usage -**
|
||||
```
|
||||
minikube service [flags] SERVICE
|
||||
minikube service [command]
|
||||
```
|
||||
**Available Commands -**
|
||||
```
|
||||
list Lists the URLs for the services in your local cluster
|
||||
```
|
||||
**Available Flags -**
|
||||
```
|
||||
--format string Format to output service URL in. This format will be applied to each url individually and they will be printed one at a time. (default "http://{{.IP}}:{{.Port}}")
|
||||
-h, --help help for service
|
||||
--https Open the service URL with https instead of http
|
||||
--interval int The time interval for each check that wait performs in seconds (default 20)
|
||||
-n, --namespace string The service namespace (default "default")
|
||||
--url Display the kubernetes service URL in the CLI instead of opening it in the default browser
|
||||
--wait int Amount of time to wait for a service in seconds (default 20)
|
||||
```
|
||||
|
||||
---
|
||||
### ssh
|
||||
**Description -** Log into or run a command on a machine with SSH; similar to 'docker-machine ssh'.
|
||||
**Usage -** `minikube ssh`
|
||||
|
||||
---
|
||||
### ssh-key
|
||||
**Description -** Retrieve the ssh identity key path of the specified cluster.
|
||||
**Usage -** `minikube ssh-key`
|
||||
|
||||
---
|
||||
### start
|
||||
**Description -** Starts a local kubernetes cluster.
|
||||
**Usage -** `minikube start [flags]`
|
||||
**Available Flags -**
|
||||
```
|
||||
--apiserver-ips ipSlice 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 (default [])
|
||||
--apiserver-name string 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 (default "minikubeCA")
|
||||
--apiserver-names stringArray 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
|
||||
--apiserver-port int The apiserver listening port (default 8443)
|
||||
--cache-images If true, cache docker images for the current bootstrapper and load them into the machine. Always false with --vm-driver=none. (default true)
|
||||
--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)
|
||||
--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)
|
||||
--docker-opt stringArray Specify arbitrary flags to pass to the Docker daemon. (format: key=value)
|
||||
--download-only If true, only download and cache files for later use - don't install or start anything.
|
||||
--enable-default-cni Enable the default CNI plugin (/etc/cni/net.d/k8s.conf). Used in conjunction with "--network-plugin=cni"
|
||||
--extra-config ExtraOption 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: ignore-preflight-errors, dry-run, kubeconfig, kubeconfig-dir, node-name, cri-socket, experimental-upload-certs, certificate-key, rootfs, pod-network-cidr
|
||||
--feature-gates string A set of key=value pairs that describe feature gates for alpha/experimental features.
|
||||
--gpu Enable experimental NVIDIA GPU support in minikube (works only with kvm2 driver on Linux)
|
||||
-h, --help help for start
|
||||
--hidden Hide the hypervisor signature from the guest in minikube (works only with kvm2 driver on Linux)
|
||||
--host-only-cidr string The CIDR to be used for the minikube VM (only supported with Virtualbox driver) (default "192.168.99.1/24")
|
||||
--hyperkit-vpnkit-sock string 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.
|
||||
--hyperkit-vsock-ports strings List of guest VSock ports that should be exposed as sockets on the host (Only supported on with hyperkit now).
|
||||
--hyperv-virtual-switch string The hyperv virtual switch name. Defaults to first found. (only supported with HyperV driver)
|
||||
--image-mirror-country string Country code of the image mirror to be used. Leave empty to use the global one. For Chinese mainland users, set it to cn
|
||||
--image-repository string 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
|
||||
--insecure-registry strings Insecure Docker registries to pass to the Docker daemon. The default service CIDR range will automatically be added.
|
||||
--iso-url string Location of the minikube iso (default "https://storage.googleapis.com/minikube/iso/minikube-v1.2.0.iso")
|
||||
--keep-context This will keep the existing kubectl context and will create a minikube context.
|
||||
--kubernetes-version string The kubernetes version that the minikube VM will use (ex: v1.2.3) (default "v1.15.0")
|
||||
--kvm-network string The KVM network name. (only supported with KVM driver) (default "default")
|
||||
--memory string Amount of RAM allocated to the minikube VM (format: <number>[<unit>], where unit = b, k, m or g) (default "2000mb")
|
||||
--mount This will start the mount daemon and automatically mount files into minikube
|
||||
--mount-string string The argument to pass the minikube mount command on start (default "C:\\Users\\Pranav.Jituri:/minikube-host")
|
||||
--network-plugin string The name of the network plugin
|
||||
--nfs-share strings Local folders to share with Guest via NFS mounts (Only supported on with hyperkit now)
|
||||
--nfs-shares-root string Where to root the NFS Shares (defaults to /nfsshares, only supported with hyperkit now) (default "/nfsshares")
|
||||
--no-vtx-check Disable checking for the availability of hardware virtualization before the vm is started (virtualbox)
|
||||
--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 hyperv hyperkit kvm2 vmware none] (default "virtualbox")
|
||||
```
|
||||
|
||||
---
|
||||
### status
|
||||
**Description -** Gets the status of a local kubernetes cluster. Exit status contains the status of minikube's VM, cluster and kubernetes encoded on it's bits in this order from right to left.
|
||||
Eg: 7 meaning: 1 (for minikube NOK) + 2 (for cluster NOK) + 4 (for kubernetes NOK)
|
||||
**Usage -** `minikube status [flags]`
|
||||
**Available Flags -**
|
||||
```
|
||||
--format string 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 (default "host: {{.Host}}\nkubelet: {{.Kubelet}}\napiserver: {{.APIServer}}\nkubectl: {{.Kubeconfig}}\n")
|
||||
```
|
||||
|
||||
---
|
||||
### stop
|
||||
**Description -** Stops a local kubernetes cluster running in Virtualbox. This command stops the VM
|
||||
itself, leaving all files intact. The cluster can be started again with the `start` command.
|
||||
**Usage -** `minikube stop`
|
||||
|
||||
---
|
||||
### tunnel
|
||||
**Description -** Creates a route to services deployed with type LoadBalancer and sets their Ingress to their ClusterIP
|
||||
**Usage -** `minikube tunnel [flags]`
|
||||
**Available Flags -**
|
||||
```
|
||||
-c, --cleanup call with cleanup=true to remove old tunnels
|
||||
```
|
||||
|
||||
---
|
||||
### update-check
|
||||
**Description -** Print current and latest version number.
|
||||
**Usage -** `minikube update-check`
|
||||
|
||||
---
|
||||
### update-context
|
||||
**Description -** Retrieves the IP address of the running cluster, checks it with IP in kubeconfig, and corrects kubeconfig if incorrect.
|
||||
**Usage -** `minikube update-context`
|
||||
|
||||
---
|
||||
### version
|
||||
**Description -** Print the version of minikube.
|
||||
**Usage -** `minikube version`
|
||||
This document has moved to https://minikube.sigs.k8s.io/docs/reference/commands/
|
||||
|
|
|
@ -1,42 +1 @@
|
|||
# Configuring Kubernetes
|
||||
|
||||
Minikube has a "configurator" feature that allows users to configure the Kubernetes components with arbitrary values.
|
||||
To use this feature, you can use the `--extra-config` flag on the `minikube start` command.
|
||||
|
||||
This flag is repeated, so you can pass it several times with several different values to set multiple options.
|
||||
|
||||
## Selecting a Kubernetes version
|
||||
|
||||
minikube defaults to the latest stable version of Kubernetes. You may select a different Kubernetes release by using the `--kubernetes-version` flag, for example:
|
||||
|
||||
`minikube start --kubernetes-version=v1.10.13`
|
||||
|
||||
minikube follows the [Kubernetes Version and Version Skew Support Policy](https://kubernetes.io/docs/setup/version-skew-policy/), so we guarantee support for the latest build for the last 3 minor Kubernetes releases. When practical, minikube extends this policy two additional minor releases so that users can emulate legacy environments.
|
||||
|
||||
As of April 2019, this means that minikube supports and actively tests against the latest builds of:
|
||||
|
||||
* v1.14 (default)
|
||||
* v1.13
|
||||
* v1.12
|
||||
* v1.11 (best effort)
|
||||
* v1.10 (best effort)
|
||||
|
||||
For more up to date information, see `OldestKubernetesVersion` and `NewestKubernetesVersion` in [constants.go](https://github.com/kubernetes/minikube/blob/master/pkg/minikube/constants/constants.go)
|
||||
|
||||
## kubeadm
|
||||
|
||||
The kubeadm bootstrapper can be configured by the `--extra-config` flag on the `minikube start` command. It takes a string of the form `component.key=value` where `component` is one of the strings
|
||||
|
||||
* kubeadm
|
||||
* kubelet
|
||||
* apiserver
|
||||
* controller-manager
|
||||
* scheduler
|
||||
|
||||
and `key=value` is a flag=value pair for the component being configured. For example,
|
||||
|
||||
```shell
|
||||
minikube start --extra-config=apiserver.v=10 --extra-config=kubelet.max-pods=100
|
||||
|
||||
minikube start --extra-config=kubeadm.ignore-preflight-errors=SystemVerification # allows any version of docker
|
||||
```
|
||||
This document has moved to https://minikube.sigs.k8s.io/docs/reference/configuration/kubernetes/
|
||||
|
|
|
@ -1,21 +1 @@
|
|||
# Contributing
|
||||
|
||||
* **New contributors** ([contributors.md](https://github.com/kubernetes/minikube/blob/master/CONTRIBUTING.md)): Process for new contributors, CLA instructions
|
||||
|
||||
* **Roadmap** ([roadmap.md](roadmap.md)): The roadmap for future minikube development
|
||||
|
||||
## New Features and Dependencies
|
||||
|
||||
* **Adding a new addon** ([adding_an_addon.md](adding_an_addon.md)): How to add a new addon to minikube for `minikube addons`
|
||||
|
||||
* **Adding a new driver** ([adding_driver.md](adding_driver.md)): How to add a new driver to minikube for `minikube create --vm-driver=<driver>`
|
||||
|
||||
## Building and Releasing
|
||||
|
||||
* **Build Guide** ([build_guide.md](build_guide.md)): How to build minikube from source
|
||||
|
||||
* **ISO Build Guide** ([minikube_iso.md](minikube_iso.md)): How to build and hack on the ISO image that minikube uses
|
||||
|
||||
* **CI Builds** ([ci_builds.md](./ci_builds.md)): Accessing CI build artifacts from Jenkins
|
||||
|
||||
* **Releasing minikube** ([releasing_minikube.md](releasing_minikube.md)): Steps to release a new version of minikube
|
||||
This document has moved to https://minikube.sigs.k8s.io/docs/contributing/
|
||||
|
|
|
@ -1,56 +1 @@
|
|||
# Adding a New Addon
|
||||
|
||||
To add a new addon to minikube the following steps are required:
|
||||
|
||||
* For the new addon's .yaml file(s):
|
||||
* Put the required .yaml files for the addon in the `minikube/deploy/addons` directory.
|
||||
* Add the `kubernetes.io/minikube-addons: <NEW_ADDON_NAME>` label to each piece of the addon (ReplicationController, Service, etc.)
|
||||
* Also, `addonmanager.kubernetes.io/mode` annotation is needed so that your resources are picked up by the `addon-manager` minikube addon.
|
||||
* In order to have `minikube addons open <NEW_ADDON_NAME>` work properly, the `kubernetes.io/minikube-addons-endpoint: <NEW_ADDON_NAME>` label must be added to the appropriate endpoint service (what the user would want to open/interact with). This service must be of type NodePort.
|
||||
|
||||
* To add the addon into minikube commands/VM:
|
||||
* Add the addon with appropriate fields filled into the `Addon` dictionary, see this [commit](https://github.com/kubernetes/minikube/commit/41998bdad0a5543d6b15b86b0862233e3204fab6#diff-e2da306d559e3f019987acc38431a3e8R133) and example.
|
||||
|
||||
```go
|
||||
// cmd/minikube/cmd/config/config.go
|
||||
var settings = []Setting{
|
||||
...,
|
||||
// add other addon setting
|
||||
{
|
||||
name: "efk",
|
||||
set: SetBool,
|
||||
validations: []setFn{IsValidAddon},
|
||||
callbacks: []setFn{EnableOrDisableAddon},
|
||||
},
|
||||
}
|
||||
```
|
||||
|
||||
* Add the addon to settings list, see this [commit](https://github.com/kubernetes/minikube/commit/41998bdad0a5543d6b15b86b0862233e3204fab6#diff-07ad0c54f98b231e68537d908a214659R89) and example.
|
||||
|
||||
```go
|
||||
// pkg/minikube/assets/addons.go
|
||||
var Addons = map[string]*Addon{
|
||||
...,
|
||||
// add other addon asset
|
||||
"efk": NewAddon([]*BinAsset{
|
||||
MustBinAsset(
|
||||
"deploy/addons/efk/efk-configmap.yaml",
|
||||
constants.AddonsPath,
|
||||
"efk-configmap.yaml",
|
||||
"0640"),
|
||||
MustBinAsset(
|
||||
"deploy/addons/efk/efk-rc.yaml",
|
||||
constants.AddonsPath,
|
||||
"efk-rc.yaml",
|
||||
"0640"),
|
||||
MustBinAsset(
|
||||
"deploy/addons/efk/efk-svc.yaml",
|
||||
constants.AddonsPath,
|
||||
"efk-svc.yaml",
|
||||
"0640"),
|
||||
}, false, "efk"),
|
||||
}
|
||||
```
|
||||
|
||||
* Rebuild minikube using make out/minikube. This will put the addon's .yaml binary files into the minikube binary using go-bindata.
|
||||
* Test addon using `minikube addons enable <NEW_ADDON_NAME>` command to start service.
|
||||
This document has moved to https://minikube.sigs.k8s.io/docs/contributing/addons/
|
|
@ -1,100 +1 @@
|
|||
# Adding new driver (Deprecated)
|
||||
|
||||
New drivers should be added into <https://github.com/machine-drivers>
|
||||
|
||||
Minikube relies on docker machine drivers to manage machines. This document talks about how to
|
||||
add an existing docker machine driver into minikube registry, so that minikube can use the driver
|
||||
by `minikube create --vm-driver=<new_driver>`. This document is not going to talk about how to
|
||||
create a new docker machine driver.
|
||||
|
||||
## Understand your driver
|
||||
|
||||
First of all, before started, you need to understand your driver in terms of:
|
||||
|
||||
- Which operating system is your driver running on?
|
||||
- Is your driver builtin the minikube binary or triggered through RPC?
|
||||
- How to translate minikube config to driver config?
|
||||
- If builtin, how to instantiate the driver instance?
|
||||
|
||||
Builtin basically means whether or not you need separate driver binary in your `$PATH` for minikube to
|
||||
work. For instance, `hyperkit` is not builtin, because you need `docker-machine-driver-hyperkit` in your
|
||||
`$PATH`. `vmwarefusion` is builtin, because you don't need anything.
|
||||
|
||||
## Understand registry
|
||||
|
||||
Registry is what minikube uses to register all the supported drivers. The driver author registers
|
||||
their drivers in registry, and minikube runtime will look at the registry to find a driver and use the
|
||||
driver metadata to determine what workflow to apply while those drivers are being used.
|
||||
|
||||
The godoc of registry is available here: <https://godoc.org/k8s.io/minikube/pkg/minikube/registry>
|
||||
|
||||
[DriverDef](https://godoc.org/k8s.io/minikube/pkg/minikube/registry#DriverDef) is the main
|
||||
struct to define a driver metadata. Essentially, you need to define 4 things at most, which is
|
||||
pretty simple once you understand your driver well:
|
||||
|
||||
- Name: unique name of the driver, it will be used as the unique ID in registry and as
|
||||
`--vm-driver` option in minikube command
|
||||
|
||||
- Builtin: `true` if the driver is builtin minikube binary. `false` otherwise.
|
||||
|
||||
- ConfigCreator: how to translate a minikube config to driver config. The driver config will be persistent
|
||||
on your `$USER/.minikube` directory. Most likely the driver config is the driver itself.
|
||||
|
||||
- DriverCreator: Only needed when driver is builtin, to instantiate the driver instance.
|
||||
|
||||
## An example
|
||||
|
||||
All drivers are located in `k8s.io/minikube/pkg/minikube/drivers`. Take `vmwarefusion` as an example:
|
||||
|
||||
```golang
|
||||
// +build darwin
|
||||
|
||||
package vmwarefusion
|
||||
|
||||
import (
|
||||
"github.com/docker/machine/drivers/vmwarefusion"
|
||||
"github.com/docker/machine/libmachine/drivers"
|
||||
cfg "k8s.io/minikube/pkg/minikube/config"
|
||||
"k8s.io/minikube/pkg/minikube/constants"
|
||||
"k8s.io/minikube/pkg/minikube/registry"
|
||||
)
|
||||
|
||||
func init() {
|
||||
registry.Register(registry.DriverDef{
|
||||
Name: "vmwarefusion",
|
||||
Builtin: true,
|
||||
ConfigCreator: createVMwareFusionHost,
|
||||
DriverCreator: func() drivers.Driver {
|
||||
return vmwarefusion.NewDriver("", "")
|
||||
},
|
||||
})
|
||||
}
|
||||
|
||||
func createVMwareFusionHost(config cfg.MachineConfig) interface{} {
|
||||
d := vmwarefusion.NewDriver(cfg.GetMachineName(), constants.GetMinipath()).(*vmwarefusion.Driver)
|
||||
d.Boot2DockerURL = config.Downloader.GetISOFileURI(config.MinikubeISO)
|
||||
d.Memory = config.Memory
|
||||
d.CPU = config.CPUs
|
||||
d.DiskSize = config.DiskSize
|
||||
d.SSHPort = 22
|
||||
d.ISO = d.ResolveStorePath("boot2docker.iso")
|
||||
return d
|
||||
}
|
||||
```
|
||||
|
||||
- In init function, register a `DriverDef` in registry. Specify the metadata in the `DriverDef`. As mentioned
|
||||
earlier, it's builtin, so you also need to specify `DriverCreator` to tell minikube how to create a `drivers.Driver`.
|
||||
- Another important thing is `vmwarefusion` only runs on MacOS. You need to add a build tag on top so it only
|
||||
runs on MacOS, so that the releases on Windows and Linux won't have this driver in registry.
|
||||
- Last but not least, import the driver in `pkg/minikube/cluster/default_drivers.go` to include it in build.
|
||||
|
||||
## Summary
|
||||
|
||||
In summary, the process includes the following steps:
|
||||
|
||||
1. Add the driver under `k8s.io/minikube/pkg/minikube/drivers`
|
||||
- Add build tag for supported operating system
|
||||
- Define driver metadata in `DriverDef`
|
||||
2. Add import in `pkg/minikube/cluster/default_drivers.go`
|
||||
|
||||
Any Questions: please ping your friend [@anfernee](https://github.com/anfernee)
|
||||
This document has moved to https://minikube.sigs.k8s.io/docs/contributing/drivers/
|
||||
|
|
|
@ -1,114 +1 @@
|
|||
# Build Guide
|
||||
|
||||
## Build Requirements
|
||||
|
||||
* A recent Go distribution (>=1.12)
|
||||
* If you're not on Linux, you'll need a Docker installation
|
||||
* minikube requires at least 4GB of RAM to compile, which can be problematic when using docker-machine
|
||||
|
||||
### Prerequisites for different GNU/Linux distributions
|
||||
|
||||
#### Fedora
|
||||
|
||||
On Fedora you need to install _glibc-static_
|
||||
```shell
|
||||
$ sudo dnf install -y glibc-static
|
||||
```
|
||||
|
||||
### Building from Source
|
||||
|
||||
Clone and build minikube:
|
||||
```shell
|
||||
$ git clone https://github.com/kubernetes/minikube.git
|
||||
$ cd minikube
|
||||
$ make
|
||||
```
|
||||
|
||||
Note: Make sure that you uninstall any previous versions of minikube before building
|
||||
from the source.
|
||||
|
||||
### Building from Source in Docker (using Debian stretch image with golang)
|
||||
|
||||
Clone minikube:
|
||||
```shell
|
||||
$ git clone https://github.com/kubernetes/minikube.git
|
||||
```
|
||||
|
||||
Build (cross compile for linux / OS X and Windows) using make:
|
||||
```shell
|
||||
$ cd minikube
|
||||
$ MINIKUBE_BUILD_IN_DOCKER=y make cross
|
||||
```
|
||||
|
||||
Check "out" directory:
|
||||
```shell
|
||||
$ ls out/
|
||||
minikube-darwin-amd64 minikube-linux-amd64 minikube-windows-amd64.exe
|
||||
```
|
||||
|
||||
You can also build platform specific executables like below:
|
||||
1. `make windows` will build the binary for Windows platform
|
||||
2. `make linux` will build the binary for Linux platform
|
||||
3. `make darwin` will build the binary for Darwin/Mac platform
|
||||
|
||||
### Run Instructions
|
||||
|
||||
Start the cluster using your built minikube with:
|
||||
|
||||
```shell
|
||||
$ ./out/minikube start
|
||||
```
|
||||
|
||||
## Running Tests
|
||||
|
||||
### Unit Tests
|
||||
|
||||
Unit tests are run on Travis before code is merged. To run as part of a development cycle:
|
||||
|
||||
```shell
|
||||
make test
|
||||
```
|
||||
|
||||
### Integration Tests
|
||||
|
||||
Integration tests are currently run manually.
|
||||
To run them, build the binary and run the tests:
|
||||
|
||||
```shell
|
||||
make integration
|
||||
```
|
||||
|
||||
You may find it useful to set various options to test only a particular test against a non-default driver. For instance:
|
||||
|
||||
```shell
|
||||
env TEST_ARGS="-minikube-start-args=--vm-driver=hyperkit -test.run TestStartStop" make integration
|
||||
```
|
||||
|
||||
### Conformance Tests
|
||||
|
||||
These are Kubernetes tests that run against an arbitrary cluster and exercise a wide range of Kubernetes features.
|
||||
You can run these against minikube by following these steps:
|
||||
|
||||
* Clone the Kubernetes repo somewhere on your system.
|
||||
* Run `make quick-release` in the k8s repo.
|
||||
* Start up a minikube cluster with: `minikube start`.
|
||||
* Set following two environment variables:
|
||||
|
||||
```shell
|
||||
export KUBECONFIG=$HOME/.kube/config
|
||||
export KUBERNETES_CONFORMANCE_TEST=y
|
||||
```
|
||||
|
||||
* Run the tests (from the k8s repo):
|
||||
|
||||
```shell
|
||||
go run hack/e2e.go -v --test --test_args="--ginkgo.focus=\[Conformance\]" --check-version-skew=false
|
||||
```
|
||||
|
||||
To run a specific conformance test, you can use the `ginkgo.focus` flag to filter the set using a regular expression.
|
||||
The `hack/e2e.go` wrapper and the `e2e.sh` wrappers have a little trouble with quoting spaces though, so use the `\s` regular expression character instead.
|
||||
For example, to run the test `should update annotations on modification [Conformance]`, use following command:
|
||||
|
||||
```shell
|
||||
go run hack/e2e.go -v --test --test_args="--ginkgo.focus=should\supdate\sannotations\son\smodification" --check-version-skew=false
|
||||
```
|
||||
This document has moved to https://minikube.sigs.k8s.io/docs/contributing/building/
|
|
@ -1,11 +1 @@
|
|||
# CI Builds
|
||||
|
||||
We publish CI builds of minikube, built at every Pull Request. Builds are available at (substitute in the relevant PR number):
|
||||
|
||||
- <https://storage.googleapis.com/minikube-builds/PR_NUMBER/minikube-darwin-amd64>
|
||||
- <https://storage.googleapis.com/minikube-builds/PR_NUMBER/minikube-linux-amd64>
|
||||
- <https://storage.googleapis.com/minikube-builds/PR_NUMBER/minikube-windows-amd64.exe>
|
||||
|
||||
We also publish CI builds of minikube-iso, built at every Pull Request that touches deploy/iso/minikube-iso. Builds are available at:
|
||||
|
||||
- <https://storage.googleapis.com/minikube-builds/PR_NUMBER/minikube-testing.iso>
|
||||
This document has moved to https://minikube.sigs.k8s.io/docs/contributing/building/
|
||||
|
|
|
@ -1,78 +1 @@
|
|||
# minikube ISO image
|
||||
|
||||
This includes the configuration for an alternative bootable ISO image meant to be used in conjunction with minikube.
|
||||
|
||||
It includes:
|
||||
|
||||
- systemd as the init system
|
||||
- docker
|
||||
- CRI-O
|
||||
|
||||
## Hacking
|
||||
|
||||
### Requirements
|
||||
|
||||
* Linux
|
||||
|
||||
```shell
|
||||
sudo apt-get install build-essential gnupg2 p7zip-full git wget cpio python \
|
||||
unzip bc gcc-multilib automake libtool locales
|
||||
```
|
||||
|
||||
Either import your private key or generate a sign-only key using `gpg2 --gen-key`.
|
||||
Also be sure to have an UTF-8 locale set up in order to build the ISO.
|
||||
|
||||
### Build instructions
|
||||
|
||||
```shell
|
||||
$ git clone https://github.com/kubernetes/minikube.git
|
||||
$ cd minikube
|
||||
$ make buildroot-image
|
||||
$ make out/minikube.iso
|
||||
```
|
||||
|
||||
The build will occur inside a docker container. If you want to do this on
|
||||
baremetal, replace `make out/minikube.iso` with `IN_DOCKER=1 make out/minikube.iso`.
|
||||
The bootable ISO image will be available in `out/minikube.iso`.
|
||||
|
||||
### Testing local minikube-iso changes
|
||||
|
||||
```shell
|
||||
$ ./out/minikube start --iso-url=file://$(pwd)/out/minikube.iso
|
||||
```
|
||||
|
||||
### Buildroot configuration
|
||||
|
||||
To change the buildroot configuration, execute:
|
||||
|
||||
```shell
|
||||
$ cd out/buildroot
|
||||
$ make menuconfig
|
||||
$ make
|
||||
```
|
||||
|
||||
To save any buildroot configuration changes made with `make menuconfig`, execute:
|
||||
|
||||
```shell
|
||||
$ cd out/buildroot
|
||||
$ make savedefconfig
|
||||
```
|
||||
|
||||
The changes will be reflected in the `minikube-iso/configs/minikube_defconfig` file.
|
||||
|
||||
```shell
|
||||
$ git status
|
||||
## master
|
||||
M deploy/iso/minikube-iso/configs/minikube_defconfig
|
||||
```
|
||||
|
||||
### Saving buildroot/kernel configuration changes
|
||||
|
||||
To make any kernel configuration changes and save them, execute:
|
||||
|
||||
```shell
|
||||
$ make linux-menuconfig
|
||||
```
|
||||
|
||||
This will open the kernel configuration menu, and then save your changes to our
|
||||
iso directory after they've been selected.
|
||||
This document has moved to https://minikube.sigs.k8s.io/docs/contributing/iso/
|
||||
|
|
|
@ -1,25 +1 @@
|
|||
# Principles of Minikube
|
||||
|
||||
The primary goal of minikube is to make it simple to run Kubernetes locally, for day-to-day development workflows and learning purposes. Here are the guiding principles for minikube, in rough priority order:
|
||||
|
||||
1. User-friendly and accessible
|
||||
2. Inclusive and community-driven
|
||||
3. Cross-platform
|
||||
4. Support all Kubernetes features
|
||||
5. High-fidelity
|
||||
6. Compatible with all supported Kubernetes releases
|
||||
7. Support for all Kubernetes-friendly container runtimes
|
||||
8. Stable and easy to debug
|
||||
|
||||
Here are some specific minikube features that align with our goal:
|
||||
|
||||
* Single command setup and teardown UX
|
||||
* Support for local storage, networking, auto-scaling, load balancing, etc.
|
||||
* Unified UX across operating systems
|
||||
* Minimal dependencies on third party software
|
||||
* Minimal resource overhead
|
||||
|
||||
## Non-Goals
|
||||
|
||||
* Simplifying Kubernetes production deployment experience
|
||||
* Supporting all possible deployment configurations of Kubernetes like various types of storage, networking, etc.
|
||||
This document has moved to https://minikube.sigs.k8s.io/docs/concepts/principles/
|
||||
|
|
|
@ -1,109 +1 @@
|
|||
# Steps to Release Minikube
|
||||
|
||||
## Preparation
|
||||
|
||||
* Announce release intent on #minikube
|
||||
* Pause merge requests so that they are not accidentally left out of the ISO or release notes
|
||||
|
||||
## Build a new ISO
|
||||
|
||||
Major releases always get a new ISO. Minor bugfixes may or may not require it: check for changes in the `deploy/iso` folder.
|
||||
To check, run `git log -- deploy/iso` from the root directory and see if there has been a commit since the most recent release.
|
||||
|
||||
Note: you can build the ISO using the `hack/jenkins/build_iso.sh` script locally.
|
||||
|
||||
* navigate to the minikube ISO jenkins job
|
||||
* Ensure that you are logged in (top right)
|
||||
* Click "▶️ Build with Parameters" (left)
|
||||
* For `ISO_VERSION`, type in the intended release version (same as the minikube binary's version)
|
||||
* For `ISO_BUCKET`, type in `minikube/iso`
|
||||
* Click *Build*
|
||||
|
||||
The build will take roughly 50 minutes.
|
||||
|
||||
## Update Makefile
|
||||
|
||||
Edit the minikube `Makefile`, updating the version number values at the top:
|
||||
|
||||
* `VERSION_MAJOR`, `VERSION_MINOR`, `VERSION_BUILD` as necessary
|
||||
* `ISO_VERSION` - defaults to MAJOR.MINOR.0 - update if point release requires a new ISO to be built.
|
||||
|
||||
Make sure the integration tests run against this PR, once the new ISO is built.
|
||||
|
||||
## Ad-Hoc testing of other platforms
|
||||
|
||||
If there are supported platforms which do not have functioning Jenkins workers (Windows), you may use the following to build a sanity check:
|
||||
|
||||
```shell
|
||||
env BUILD_IN_DOCKER=y make cross checksum
|
||||
```
|
||||
|
||||
## Send out Makefile PR
|
||||
|
||||
Once submitted, HEAD will use the new ISO. Please pay attention to test failures, as this is our integration test across platforms. If there are known acceptable failures, please add a PR comment linking to the appropriate issue.
|
||||
|
||||
## Update Release Notes
|
||||
|
||||
Run the following script to update the release notes:
|
||||
|
||||
```shell
|
||||
hack/release_notes.sh
|
||||
```
|
||||
|
||||
Merge the output into CHANGELOG.md. See [PR#3175](https://github.com/kubernetes/minikube/pull/3175) as an example. Then get the PR submitted.
|
||||
|
||||
## Tag the Release
|
||||
|
||||
```shell
|
||||
sh hack/tag_release.sh 1.<minor>.<patch>
|
||||
```
|
||||
|
||||
## Build the Release
|
||||
|
||||
This step uses the git tag to publish new binaries to GCS and create a github release:
|
||||
|
||||
* navigate to the minikube "Release" jenkins job
|
||||
* Ensure that you are logged in (top right)
|
||||
* Click "▶️ Build with Parameters" (left)
|
||||
* `VERSION_MAJOR`, `VERSION_MINOR`, and `VERSION_BUILD` should reflect the values in your Makefile
|
||||
* For `ISO_SHA256`, run: `gsutil cat gs://minikube/iso/minikube-v<version>.iso.sha256`
|
||||
* Click *Build*
|
||||
|
||||
## Check the release logs
|
||||
|
||||
After job completion, click "Console Output" to verify that the release completed without errors. This is typically where one will see brew automation fail, for instance.
|
||||
|
||||
## Check releases.json
|
||||
|
||||
This file is used for auto-update notifications, but is not active until releases.json is copied to GCS.
|
||||
|
||||
minikube-bot will send out a PR to update the release checksums at the top of `deploy/minikube/releases.json`. You should merge this PR.
|
||||
|
||||
## Package managers which include minikube
|
||||
|
||||
These are downstream packages that are being maintained by others and how to upgrade them to make sure they have the latest versions
|
||||
|
||||
| Package Manager | URL | TODO |
|
||||
| --- | --- | --- |
|
||||
| Arch Linux AUR | <https://aur.archlinux.org/packages/minikube-bin/> | "Flag as package out-of-date"
|
||||
| Brew Cask | <https://github.com/Homebrew/homebrew-cask/blob/master/Casks/minikube.rb> | The release job creates a new PR in [Homebrew/homebrew-cask](https://github.com/Homebrew/homebrew-cask) with an updated version and SHA256, double check that it's created.
|
||||
|
||||
WARNING: The Brew cask automation is error-prone. please ensure that a PR was created.
|
||||
|
||||
## Verification
|
||||
|
||||
Verify release checksums by running`make check-release`
|
||||
|
||||
## Update minikube frontpage
|
||||
|
||||
We document the last 3 releases on our frontpage. Please add it to the list: <https://github.com/kubernetes/minikube/blob/master/README.md>
|
||||
|
||||
## Update official Kubernetes docs
|
||||
|
||||
If there are major changes, please send a PR to update <https://kubernetes.io/docs/setup/minikube/>
|
||||
|
||||
## Announce!
|
||||
|
||||
- #minikube on Slack
|
||||
- minikube-dev, minikube-users mailing list
|
||||
- Twitter (optional!)
|
||||
This document has moved to https://minikube.sigs.k8s.io/docs/contributing/releasing/
|
||||
|
|
|
@ -1,50 +1 @@
|
|||
# minikube roadmap (2019)
|
||||
|
||||
This roadmap is a living document outlining the major technical improvements which we would like to see in minikube during 2019, divided by how they apply to our [guiding principles](principles.md)
|
||||
|
||||
Please send a PR to suggest any improvements to it.
|
||||
|
||||
## (#1) User-friendly and accessible
|
||||
|
||||
- [ ] Creation of a user-centric minikube website for installation & documentation [#4388](https://github.com/kubernetes/minikube/issues/4388)
|
||||
- [ ] Localized output to 5+ written languages [#4186](https://github.com/kubernetes/minikube/issues/4186) [#4185](https://github.com/kubernetes/minikube/issues/4185)
|
||||
- [x] Make minikube usable in environments with challenging connectivity requirements
|
||||
- [ ] Support lightweight deployment methods for environments where VM's are impractical [#4389](https://github.com/kubernetes/minikube/issues/4389) [#4390](https://github.com/kubernetes/minikube/issues/4390)
|
||||
- [x] Add offline support
|
||||
|
||||
## (#2) Inclusive and community-driven
|
||||
|
||||
- [x] Increase community involvement in planning and decision making
|
||||
- [ ] Make the continuous integration and release infrastructure publicly available [#3256](https://github.com/kubernetes/minikube/issues/4390)
|
||||
- [x] Double the number of active maintainers
|
||||
|
||||
## (#3) Cross-platform
|
||||
|
||||
- [ ] Users should never need to separately install supporting binaries [#3975](https://github.com/kubernetes/minikube/issues/3975) [#4391](https://github.com/kubernetes/minikube/issues/4391)
|
||||
- [ ] Simplified installation process across all supported platforms
|
||||
|
||||
## (#4) Support all Kubernetes features
|
||||
|
||||
- [ ] Add multi-node support [#94](https://github.com/kubernetes/minikube/issues/94)
|
||||
|
||||
## (#5) High-fidelity
|
||||
|
||||
- [ ] Reduce guest VM overhead by 50% [#3207](https://github.com/kubernetes/minikube/issues/3207)
|
||||
- [x] Disable swap in the guest VM
|
||||
|
||||
## (#6) Compatible with all supported Kubernetes releases
|
||||
|
||||
- [x] Continuous Integration testing across all supported Kubernetes releases
|
||||
- [ ] Automatic PR generation for updating the default Kubernetes release minikube uses [#4392](https://github.com/kubernetes/minikube/issues/4392)
|
||||
|
||||
## (#7) Support for all Kubernetes-friendly container runtimes
|
||||
|
||||
- [x] Run all integration tests across all supported container runtimes
|
||||
- [ ] Support for Kata Containers [#4347](https://github.com/kubernetes/minikube/issues/4347)
|
||||
|
||||
## (#8) Stable and easy to debug
|
||||
|
||||
- [x] Pre-flight error checks for common connectivity and configuration errors
|
||||
- [ ] Improve the `minikube status` command so that it can diagnose common issues
|
||||
- [ ] Mark all features not covered by continuous integration as `experimental`
|
||||
- [x] Stabilize and improve profiles support (AKA multi-cluster)
|
||||
This document has moved to https://minikube.sigs.k8s.io/docs/contributing/roadmap/
|
||||
|
|
|
@ -1,37 +1 @@
|
|||
# Dashboard
|
||||
|
||||
Minikube supports the [Kubernetes Dashboard](https://github.com/kubernetes/dashboard) out of the box.
|
||||
|
||||
## Accessing the UI
|
||||
|
||||
To access the dashboard:
|
||||
|
||||
```shell
|
||||
minikube dashboard
|
||||
```
|
||||
|
||||
This will enable the dashboard add-on, and open the proxy in the default web browser.
|
||||
|
||||
To stop the proxy (leaves the dashboard running), abort the started process (`Ctrl+C`).
|
||||
|
||||
## Individual steps
|
||||
|
||||
If the automatic command doesn't work for you for some reason, here are the steps:
|
||||
|
||||
```console
|
||||
$ minikube addons enable dashboard
|
||||
✅ dashboard was successfully enabled
|
||||
```
|
||||
|
||||
If you have your kubernetes client configured for minikube, you can start the proxy:
|
||||
|
||||
```console
|
||||
$ kubectl --context minikube proxy
|
||||
Starting to serve on 127.0.0.1:8001
|
||||
```
|
||||
|
||||
Access the dashboard at:
|
||||
|
||||
<http://localhost:8001/api/v1/namespaces/kube-system/services/http:kubernetes-dashboard:/proxy/>
|
||||
|
||||
For additional information, see [this page](https://kubernetes.io/docs/tasks/access-application-cluster/web-ui-dashboard/).
|
||||
This document has moved to https://minikube.sigs.k8s.io/docs/tasks/dashboard/
|
||||
|
|
|
@ -1,17 +1 @@
|
|||
# Debugging Issues With Minikube
|
||||
|
||||
To debug issues with minikube (not *Kubernetes* but **minikube** itself), you can use the `-v` flag to see debug level info. The specified values for `-v` will do the following (the values are all encompassing in that higher values will give you all lower value outputs as well):
|
||||
|
||||
* `--v=0` will output **INFO** level logs
|
||||
* `--v=1` will output **WARNING** level logs
|
||||
* `--v=2` will output **ERROR** level logs
|
||||
* `--v=3` will output *libmachine* logging
|
||||
* `--v=7` will output *libmachine --debug* level logging
|
||||
|
||||
Example:
|
||||
`minikube start --v=1` Will start minikube and output all warnings to stdout.
|
||||
|
||||
If you need to access additional tools for debugging, minikube also includes the [CoreOS toolbox](https://github.com/coreos/toolbox)
|
||||
|
||||
You can ssh into the toolbox and access these additional commands using:
|
||||
`minikube ssh toolbox`
|
||||
This document has moved to https://minikube.sigs.k8s.io/docs/tasks/debug/
|
||||
|
|
257
docs/drivers.md
257
docs/drivers.md
|
@ -1,256 +1 @@
|
|||
# VM Driver plugin installation
|
||||
|
||||
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. Minikube embeds VirtualBox and VMware Fusion drivers
|
||||
so there are no additional steps to use them. However, other drivers require an
|
||||
extra binary to be present in the host PATH.
|
||||
|
||||
The following drivers currently require driver plugin binaries to be present in
|
||||
the host PATH:
|
||||
|
||||
* [KVM2](#kvm2-driver)
|
||||
* [Hyperkit](#hyperkit-driver)
|
||||
* [Hyper-V](#hyper-v-driver)
|
||||
* [VMware](#vmware-unified-driver)
|
||||
* [Parallels](#parallels-driver)
|
||||
|
||||
## KVM2 driver
|
||||
|
||||
### KVM2 install
|
||||
|
||||
To install the KVM2 driver, first install and configure the prerequisites, namely libvirt 1.3.1 or higher, and qemu-kvm:
|
||||
|
||||
* 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`
|
||||
* openSUSE/SLES: `sudo zypper install libvirt qemu-kvm`
|
||||
|
||||
Check your installed virsh version:
|
||||
|
||||
`virsh --version`
|
||||
|
||||
If your version of virsh is newer than 1.3.1 (January 2016), you may download our pre-built driver:
|
||||
|
||||
```shell
|
||||
curl -LO https://storage.googleapis.com/minikube/releases/latest/docker-machine-driver-kvm2 \
|
||||
&& sudo install docker-machine-driver-kvm2 /usr/local/bin/
|
||||
```
|
||||
|
||||
If your version of virsh is older than 1.3.1 (Januarry 2016), you may build your own driver binary if you have go 1.12+ installed.
|
||||
|
||||
```console
|
||||
$ sudo apt install libvirt-dev
|
||||
$ git clone https://github.com/kubernetes/minikube.git
|
||||
$ cd minikube
|
||||
$ make out/docker-machine-driver-kvm2
|
||||
$ sudo install out/docker-machine-driver-kvm2 /usr/local/bin
|
||||
$
|
||||
```
|
||||
|
||||
To finish the kvm installation, start and verify the `libvirtd` service
|
||||
|
||||
```shell
|
||||
sudo systemctl enable libvirtd.service
|
||||
sudo systemctl start libvirtd.service
|
||||
sudo systemctl status libvirtd.service
|
||||
```
|
||||
|
||||
Add your user to `libvirt` group (older distributions may use `libvirtd` instead)
|
||||
|
||||
```shell
|
||||
sudo usermod -a -G libvirt $(whoami)
|
||||
```
|
||||
|
||||
Join the `libvirt` group with your current shell session:
|
||||
|
||||
```shell
|
||||
newgrp libvirt
|
||||
```
|
||||
|
||||
To use the kvm2 driver:
|
||||
|
||||
```shell
|
||||
minikube start --vm-driver kvm2
|
||||
```
|
||||
|
||||
or, to use kvm2 as a default driver for `minikube start`:
|
||||
|
||||
```shell
|
||||
minikube config set vm-driver kvm2
|
||||
```
|
||||
|
||||
### KVM2 upgrade
|
||||
|
||||
```shell
|
||||
curl -LO https://storage.googleapis.com/minikube/releases/latest/docker-machine-driver-kvm2 \
|
||||
&& sudo install docker-machine-driver-kvm2 /usr/local/bin/
|
||||
```
|
||||
|
||||
### KVM2 troubleshoot
|
||||
|
||||
If minikube can't start, check if the kvm default network exists.
|
||||
|
||||
```shell
|
||||
virsh net-list
|
||||
Name State Autostart Persistent
|
||||
----------------------------------------------------------
|
||||
default active yes yes
|
||||
```
|
||||
|
||||
In case the default network doesn't exist you can define it.
|
||||
|
||||
```shell
|
||||
curl https://raw.githubusercontent.com/libvirt/libvirt/master/src/network/default.xml > kvm-default.xml
|
||||
virsh net-define kvm-default.xml
|
||||
virsh net-start default
|
||||
```
|
||||
|
||||
Make sure you are running the lastest version of your driver.
|
||||
|
||||
```shell
|
||||
docker-machine-driver-kvm2 version
|
||||
```
|
||||
|
||||
## Hyperkit driver
|
||||
|
||||
Install the [hyperkit](http://github.com/moby/hyperkit) VM manager using [brew](https://brew.sh):
|
||||
|
||||
```shell
|
||||
brew install hyperkit
|
||||
```
|
||||
|
||||
Then install the most recent version of minikube's fork of the hyperkit driver:
|
||||
|
||||
```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/
|
||||
```
|
||||
|
||||
If you are using [dnsmasq](http://www.thekelleys.org.uk/dnsmasq/doc.html) in your setup and cluster creation fails (stuck at kube-dns initialization) you might need to add `listen-address=192.168.64.1` to `dnsmasq.conf`.
|
||||
|
||||
*Note: If `dnsmasq.conf` contains `listen-address=127.0.0.1` kubernetes discovers dns at 127.0.0.1:53 and tries to use it using bridge ip address, but dnsmasq replies only to requests from 127.0.0.1*
|
||||
|
||||
To use the driver:
|
||||
|
||||
```shell
|
||||
minikube start --vm-driver hyperkit
|
||||
```
|
||||
|
||||
or, to use hyperkit as a default driver for minikube:
|
||||
|
||||
```shell
|
||||
minikube config set vm-driver hyperkit
|
||||
```
|
||||
|
||||
### Hyperkit troubleshoot
|
||||
|
||||
Make sure you are running the lastest version of your driver.
|
||||
|
||||
```shell
|
||||
docker-machine-driver-hyperkit version
|
||||
```
|
||||
|
||||
## Hyper-V driver
|
||||
|
||||
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.
|
||||
|
||||
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:
|
||||
|
||||
```shell
|
||||
minikube start --vm-driver hyperv --hyperv-virtual-switch=switch-name
|
||||
```
|
||||
|
||||
or, to use hyperv as a default driver:
|
||||
|
||||
```shell
|
||||
minikube config set vm-driver hyperv && minikube config set hyperv-virtual-switch switch-name
|
||||
```
|
||||
|
||||
and run minikube as usual:
|
||||
|
||||
```shell
|
||||
minikube start
|
||||
```
|
||||
|
||||
## VMware unified driver
|
||||
|
||||
The VMware unified driver will eventually replace the existing vmwarefusion driver.
|
||||
The new unified driver supports both VMware Fusion (on macOS) and VMware Workstation (on Linux and Windows)
|
||||
|
||||
To install the vmware unified driver, head over at <https://github.com/machine-drivers/docker-machine-driver-vmware/releases> and download the release for your operating system.
|
||||
|
||||
The driver must be:
|
||||
|
||||
1. Stored in `$PATH`
|
||||
2. Named `docker-machine-driver-vmware`
|
||||
3. Executable (`chmod +x` on UNIX based platforms)
|
||||
|
||||
If you're running on macOS with Fusion, this is an easy way install the driver:
|
||||
|
||||
```shell
|
||||
export LATEST_VERSION=$(curl -L -s -H 'Accept: application/json' https://github.com/machine-drivers/docker-machine-driver-vmware/releases/latest | sed -e 's/.*"tag_name":"\([^"]*\)".*/\1/') \
|
||||
&& curl -L -o docker-machine-driver-vmware https://github.com/machine-drivers/docker-machine-driver-vmware/releases/download/$LATEST_VERSION/docker-machine-driver-vmware_darwin_amd64 \
|
||||
&& chmod +x docker-machine-driver-vmware \
|
||||
&& mv docker-machine-driver-vmware /usr/local/bin/
|
||||
```
|
||||
|
||||
To use the driver:
|
||||
|
||||
```shell
|
||||
minikube start --vm-driver vmware
|
||||
```
|
||||
|
||||
or, to use vmware unified driver as a default driver:
|
||||
|
||||
```shell
|
||||
minikube config set vm-driver vmware
|
||||
```
|
||||
|
||||
and run minikube as usual:
|
||||
|
||||
```shell
|
||||
minikube start
|
||||
```
|
||||
|
||||
## Parallels driver
|
||||
|
||||
This driver is useful for users who own Parallels Desktop for Mac that do not have VT-x hardware support required by the hyperkit driver.
|
||||
|
||||
Pre-requisites: Parallels Desktop for Mac
|
||||
|
||||
Install the [Parallels docker-machine driver](https://github.com/Parallels/docker-machine-parallels) using [brew](https://brew.sh):
|
||||
|
||||
```shell
|
||||
brew install docker-machine-parallels
|
||||
```
|
||||
|
||||
To use the driver:
|
||||
|
||||
```shell
|
||||
minikube start --vm-driver parallels
|
||||
```
|
||||
|
||||
or, to use parallels as a default driver for minikube:
|
||||
|
||||
```shell
|
||||
minikube config set vm-driver parallels
|
||||
```
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
minikube is currently unable to display the error message received back from the VM driver. Users can however reveal the error by passing `--alsologtostderr -v=8` to `minikube start`. For instance:
|
||||
|
||||
```shell
|
||||
minikube start --vm-driver=kvm2 --alsologtostderr -v=8
|
||||
```
|
||||
|
||||
Output:
|
||||
|
||||
```text
|
||||
Found binary path at /usr/local/bin/docker-machine-driver-kvm2
|
||||
Launching plugin server for driver kvm2
|
||||
Error starting plugin binary: fork/exec /usr/local/bin/docker-machine-driver-kvm2: exec format error
|
||||
```
|
||||
This document has moved to https://minikube.sigs.k8s.io/docs/reference/drivers/
|
||||
|
|
|
@ -1,59 +1 @@
|
|||
|
||||
# minikube Environment Variables
|
||||
|
||||
## Config option variables
|
||||
|
||||
minikube supports passing environment variables instead of flags for every value listed in `minikube config list`. This is done by passing an environment variable with the prefix `MINIKUBE_`.
|
||||
|
||||
For example the `minikube start --iso-url="$ISO_URL"` flag can also be set by setting the `MINIKUBE_ISO_URL="$ISO_URL"` environment variable.
|
||||
|
||||
## Other variables
|
||||
|
||||
Some features can only be accessed by environment variables, here is a list of these features:
|
||||
|
||||
* **MINIKUBE_HOME** - (string) sets the path for the .minikube directory that minikube uses for state/configuration
|
||||
|
||||
* **MINIKUBE_IN_STYLE** - (bool) manually sets whether or not emoji and colors should appear in minikube. Set to false or 0 to disable this feature, true or 1 to force it to be turned on.
|
||||
|
||||
* **MINIKUBE_WANTUPDATENOTIFICATION** - (bool) sets whether the user wants an update notification for new minikube versions
|
||||
|
||||
* **MINIKUBE_REMINDERWAITPERIODINHOURS** - (int) sets the number of hours to check for an update notification
|
||||
|
||||
* **CHANGE_MINIKUBE_NONE_USER** - (bool) automatically change ownership of ~/.minikube to the value of $SUDO_USER
|
||||
|
||||
* **MINIKUBE_ENABLE_PROFILING** - (int, `1` enables it) enables trace profiling to be generated for minikube
|
||||
|
||||
## Making these values permanent
|
||||
|
||||
To make the exported variables permanent:
|
||||
|
||||
* Linux and macOS: Add these declarations to `~/.bashrc` or wherever your shells environment variables are stored.
|
||||
* Windows: Add these declarations via [system settings](https://support.microsoft.com/en-au/help/310519/how-to-manage-environment-variables-in-windows-xp) or using [setx](https://stackoverflow.com/questions/5898131/set-a-persistent-environment-variable-from-cmd-exe)
|
||||
|
||||
### Example: Disabling emoji
|
||||
|
||||
```shell
|
||||
export MINIKUBE_IN_STYLE=false
|
||||
minikube start
|
||||
```
|
||||
|
||||
### Example: Profiling
|
||||
|
||||
```shell
|
||||
MINIKUBE_ENABLE_PROFILING=1 minikube start
|
||||
```
|
||||
|
||||
Output:
|
||||
|
||||
``` text
|
||||
2017/01/09 13:18:00 profile: cpu profiling enabled, /tmp/profile933201292/cpu.pprof
|
||||
Starting local Kubernetes cluster...
|
||||
Kubectl is now configured to use the cluster.
|
||||
2017/01/09 13:19:06 profile: cpu profiling disabled, /tmp/profile933201292/cpu.pprof
|
||||
```
|
||||
|
||||
Examine the cpu profiling results:
|
||||
|
||||
```shell
|
||||
go tool pprof /tmp/profile933201292/cpu.pprof
|
||||
```
|
||||
This document has moved to https://minikube.sigs.k8s.io/docs/reference/environment_variables
|
||||
|
|
122
docs/gpu.md
122
docs/gpu.md
|
@ -1,121 +1 @@
|
|||
# (Experimental) NVIDIA GPU support in minikube
|
||||
|
||||
minikube has experimental support for using NVIDIA GPUs on Linux.
|
||||
|
||||
## Using NVIDIA GPUs on minikube on Linux with `--vm-driver=kvm2`
|
||||
|
||||
When using NVIDIA GPUs with the kvm2 vm-driver. We passthrough spare GPUs on the
|
||||
host to the minikube VM. Doing so has a few prerequisites:
|
||||
|
||||
- You must install the [kvm2 driver](drivers.md#kvm2-driver). If you already had
|
||||
this installed make sure that you fetch the latest
|
||||
`docker-machine-driver-kvm2` binary that has GPU support.
|
||||
|
||||
- Your CPU must support IOMMU. Different vendors have different names for this
|
||||
technology. Intel calls it Intel VT-d. AMD calls it AMD-Vi. Your motherboard
|
||||
must also support IOMMU.
|
||||
|
||||
- You must enable IOMMU in the kernel: add `intel_iommu=on` or `amd_iommu=on`
|
||||
(depending to your CPU vendor) to the kernel command line. Also add `iommu=pt`
|
||||
to the kernel command line.
|
||||
|
||||
- You must have spare GPUs that are not used on the host and can be passthrough
|
||||
to the VM. These GPUs must not be controlled by the nvidia/nouveau driver. You
|
||||
can ensure this by either not loading the nvidia/nouveau driver on the host at
|
||||
all or assigning the spare GPU devices to stub kernel modules like `vfio-pci`
|
||||
or `pci-stub` at boot time. You can do that by adding the
|
||||
[vendorId:deviceId](https://pci-ids.ucw.cz/read/PC/10de) of your spare GPU to
|
||||
the kernel command line. For ex. for Quadro M4000 add `pci-stub.ids=10de:13f1`
|
||||
to the kernel command line. Note that you will have to do this for all GPUs
|
||||
you want to passthrough to the VM and all other devices that are in the IOMMU
|
||||
group of these GPUs.
|
||||
|
||||
- Once you reboot the system after doing the above, you should be ready to use
|
||||
GPUs with kvm2. Run the following command to start minikube:
|
||||
```shell
|
||||
minikube start --vm-driver kvm2 --gpu
|
||||
```
|
||||
|
||||
This command will check if all the above conditions are satisfied and
|
||||
passthrough spare GPUs found on the host to the VM.
|
||||
|
||||
If this succeeded, run the following commands:
|
||||
```shell
|
||||
minikube addons enable nvidia-gpu-device-plugin
|
||||
minikube addons enable nvidia-driver-installer
|
||||
```
|
||||
|
||||
This will install the NVIDIA driver (that works for GeForce/Quadro cards)
|
||||
on the VM.
|
||||
|
||||
- If everything succeeded, you should be able to see `nvidia.com/gpu` in the
|
||||
capacity:
|
||||
```shell
|
||||
kubectl get nodes -ojson | jq .items[].status.capacity
|
||||
```
|
||||
|
||||
### Where can I learn more about GPU passthrough?
|
||||
|
||||
See the excellent documentation at
|
||||
<https://wiki.archlinux.org/index.php/PCI_passthrough_via_OVMF>
|
||||
|
||||
### Why are so many manual steps required to use GPUs with kvm2 on minikube?
|
||||
|
||||
These steps require elevated privileges which minikube doesn't run with and they
|
||||
are disruptive to the host, so we decided to not do them automatically.
|
||||
|
||||
## Using NVIDIA GPU on minikube on Linux with `--vm-driver=none`
|
||||
|
||||
NOTE: This approach used to expose GPUs here is different than the approach used
|
||||
to expose GPUs with `--vm-driver=kvm2`. Please don't mix these instructions.
|
||||
|
||||
- Install minikube.
|
||||
|
||||
- Install the nvidia driver, nvidia-docker and configure docker with nvidia as
|
||||
the default runtime. See instructions at
|
||||
<https://github.com/NVIDIA/nvidia-docker>
|
||||
|
||||
- Start minikube:
|
||||
```shell
|
||||
minikube start --vm-driver=none --apiserver-ips 127.0.0.1 --apiserver-name localhost
|
||||
```
|
||||
|
||||
- Install NVIDIA's device plugin:
|
||||
```shell
|
||||
kubectl create -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/v1.10/nvidia-device-plugin.yml
|
||||
```
|
||||
|
||||
## Why does minikube not support NVIDIA GPUs on macOS?
|
||||
|
||||
VM drivers supported by minikube for macOS doesn't support GPU passthrough:
|
||||
|
||||
- [mist64/xhyve#108](https://github.com/mist64/xhyve/issues/108)
|
||||
- [moby/hyperkit#159](https://github.com/moby/hyperkit/issues/159)
|
||||
- [VirtualBox docs](http://www.virtualbox.org/manual/ch09.html#pcipassthrough)
|
||||
|
||||
Also:
|
||||
|
||||
- For quite a while, all Mac hardware (both laptops and desktops) have come with
|
||||
Intel or AMD GPUs (and not with NVIDIA GPUs). Recently, Apple added [support
|
||||
for eGPUs](https://support.apple.com/en-us/HT208544), but even then all the
|
||||
supported GPUs listed are AMD’s.
|
||||
|
||||
- nvidia-docker [doesn't support
|
||||
macOS](https://github.com/NVIDIA/nvidia-docker/issues/101) either.
|
||||
|
||||
## Why does minikube not support NVIDIA GPUs on Windows?
|
||||
|
||||
minikube supports Windows host through Hyper-V or VirtualBox.
|
||||
|
||||
- VirtualBox doesn't support PCI passthrough for [Windows
|
||||
host](http://www.virtualbox.org/manual/ch09.html#pcipassthrough).
|
||||
|
||||
- Hyper-V supports DDA (discrete device assignment) but [only for Windows Server
|
||||
2016](https://docs.microsoft.com/en-us/windows-server/virtualization/hyper-v/plan/plan-for-deploying-devices-using-discrete-device-assignment)
|
||||
|
||||
Since the only possibility of supporting GPUs on minikube on Windows is on a
|
||||
server OS where users don't usually run minikube, we haven't invested time in
|
||||
trying to support NVIDIA GPUs on minikube on Windows.
|
||||
|
||||
Also, nvidia-docker [doesn't support
|
||||
Windows](https://github.com/NVIDIA/nvidia-docker/issues/197) either.
|
||||
This document has moved to https://minikube.sigs.k8s.io/docs/tutorials/nvidia_gpu/
|
||||
|
|
|
@ -1,76 +1 @@
|
|||
# Mounting Host Folders
|
||||
|
||||
`minikube mount /path/to/dir/to/mount:/vm-mount-path` is the recommended way to mount directories into minikube so that they can be used in your local Kubernetes cluster. The command works on all supported platforms. Below is an example workflow for using `minikube mount`:
|
||||
|
||||
```shell
|
||||
# terminal 1
|
||||
$ mkdir ~/mount-dir
|
||||
$ minikube mount ~/mount-dir:/mount-9p
|
||||
Mounting /home/user/mount-dir/ into /mount-9p on the minikubeVM
|
||||
This daemon process needs to stay alive for the mount to still be accessible...
|
||||
ufs starting
|
||||
# This process has to stay open, so in another terminal...
|
||||
```
|
||||
|
||||
```shell
|
||||
# terminal 2
|
||||
$ echo "hello from host" > ~/mount-dir/hello-from-host
|
||||
$ kubectl run -i --rm --tty ubuntu --overrides='
|
||||
{
|
||||
"apiVersion": "v1",
|
||||
"kind": "Pod",
|
||||
"metadata": {
|
||||
"name": "ubuntu"
|
||||
},
|
||||
"spec": {
|
||||
"containers": [
|
||||
{
|
||||
"name": "ubuntu",
|
||||
"image": "ubuntu:14.04",
|
||||
"args": [
|
||||
"bash"
|
||||
],
|
||||
"stdin": true,
|
||||
"stdinOnce": true,
|
||||
"tty": true,
|
||||
"workingDir": "/mount-9p",
|
||||
"volumeMounts": [{
|
||||
"mountPath": "/mount-9p",
|
||||
"name": "host-mount"
|
||||
}]
|
||||
}
|
||||
],
|
||||
"volumes": [
|
||||
{
|
||||
"name": "host-mount",
|
||||
"hostPath": {
|
||||
"path": "/mount-9p"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
' --image=ubuntu:14.04 --restart=Never -- bash
|
||||
|
||||
Waiting for pod default/ubuntu to be running, status is Pending, pod ready: false
|
||||
Waiting for pod default/ubuntu to be running, status is Running, pod ready: false
|
||||
# ======================================================================================
|
||||
# We are now in the pod
|
||||
#=======================================================================================
|
||||
root@ubuntu:/mount-9p# cat hello-from-host
|
||||
hello from host
|
||||
root@ubuntu:/mount-9p# echo "hello from pod" > /mount-9p/hello-from-pod
|
||||
root@ubuntu:/mount-9p# ls
|
||||
hello-from-host hello-from-pod
|
||||
root@ubuntu:/mount-9p# exit
|
||||
exit
|
||||
Waiting for pod default/ubuntu to terminate, status is Running
|
||||
pod "ubuntu" deleted
|
||||
# ======================================================================================
|
||||
# We are back on the host
|
||||
#=======================================================================================
|
||||
$ cat ~/mount-dir/hello-from-pod
|
||||
hello from pod
|
||||
```
|
||||
|
||||
Some drivers themselves provide host-folder sharing options, but we plan to deprecate these in the future as they are all implemented differently and they are not configurable through minikube.
|
||||
This document has moved to https://minikube.sigs.k8s.io/docs/tasks/mount/
|
||||
|
|
|
@ -1,102 +1 @@
|
|||
# minikube: Using HTTP/HTTPS proxies
|
||||
|
||||
minikube requires access to the internet via HTTP, HTTPS, and DNS protocols. If a HTTP proxy is required to access the internet, you may need to pass the proxy connection information to both minikube and Docker using environment variables:
|
||||
|
||||
* `HTTP_PROXY` - The URL to your HTTP proxy
|
||||
* `HTTPS_PROXY` - The URL to your HTTPS proxy
|
||||
* `NO_PROXY` - A comma-separated list of hosts which should not go through the proxy.
|
||||
|
||||
The NO_PROXY variable here is important: Without setting it, minikube may not be able to access resources within the VM. minikube uses two IP ranges, which should not go through the proxy:
|
||||
|
||||
* **192.168.99.0/24**: Used by the minikube VM. Configurable for some hypervisors via `--host-only-cidr`
|
||||
* **192.168.39.0/24**: Used by the minikube kvm2 driver.
|
||||
* **10.96.0.0/12**: Used by service cluster IP's. Configurable via `--service-cluster-ip-range`
|
||||
|
||||
One important note: If NO_PROXY is required by non-Kubernetes applications, such as Firefox or Chrome, you may want to specifically add the minikube IP to the comma-separated list, as they may not understand IP ranges ([#3827](https://github.com/kubernetes/minikube/issues/3827)).
|
||||
|
||||
## Example Usage
|
||||
|
||||
### macOS and Linux
|
||||
|
||||
```shell
|
||||
export HTTP_PROXY=http://<proxy hostname:port>
|
||||
export HTTPS_PROXY=https://<proxy hostname:port>
|
||||
export NO_PROXY=localhost,127.0.0.1,10.96.0.0/12,192.168.99.0/24,192.168.39.0/24
|
||||
|
||||
minikube start
|
||||
```
|
||||
|
||||
To make the exported variables permanent, consider adding the declarations to ~/.bashrc or wherever your user-set environment variables are stored.
|
||||
|
||||
### Windows
|
||||
|
||||
```shell
|
||||
set HTTP_PROXY=http://<proxy hostname:port>
|
||||
set HTTPS_PROXY=https://<proxy hostname:port>
|
||||
set NO_PROXY=localhost,127.0.0.1,10.96.0.0/12,192.168.99.1/24,192.168.39.0/24
|
||||
|
||||
minikube start
|
||||
```
|
||||
|
||||
To set these environment variables permanently, consider adding these to your [system settings](https://support.microsoft.com/en-au/help/310519/how-to-manage-environment-variables-in-windows-xp) or using [setx](https://stackoverflow.com/questions/5898131/set-a-persistent-environment-variable-from-cmd-exe)
|
||||
|
||||
## Configuring Docker to use a proxy
|
||||
|
||||
As of v1.0, minikube automatically configures the Docker instance inside of the VM to use the proxy environment variables, unless you have specified a `--docker-env` override. If you need to manually configure Docker for a set of proxies, use:
|
||||
|
||||
```shell
|
||||
minikube start \
|
||||
--docker-env=HTTP_PROXY=$HTTP_PROXY \
|
||||
--docker-env HTTPS_PROXY=$HTTPS_PROXY \
|
||||
--docker-env NO_PROXY=$NO_PROXY
|
||||
```
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### unable to cache ISO... connection refused
|
||||
|
||||
```text
|
||||
Unable to start VM: unable to cache ISO: https://storage.googleapis.com/minikube/iso/minikube.iso:
|
||||
failed to download: failed to download to temp file: download failed: 5 error(s) occurred:
|
||||
|
||||
* Temporary download error: Get https://storage.googleapis.com/minikube/iso/minikube.iso:
|
||||
proxyconnect tcp: dial tcp <host>:<port>: connect: connection refused
|
||||
```
|
||||
|
||||
This error indicates that the host:port combination defined by HTTPS_PROXY or HTTP_PROXY is incorrect, or that the proxy is unavailable.
|
||||
|
||||
## Unable to pull images..Client.Timeout exceeded while awaiting headers
|
||||
|
||||
```text
|
||||
Unable to pull images, which may be OK:
|
||||
|
||||
failed to pull image "k8s.gcr.io/kube-apiserver:v1.13.3": output: Error response from daemon:
|
||||
Get https://k8s.gcr.io/v2/: net/http: request canceled while waiting for connection
|
||||
(Client.Timeout exceeded while awaiting headers)
|
||||
```
|
||||
|
||||
This error indicates that the container runtime running within the VM does not have access to the internet. Verify that you are passing the appropriate value to `--docker-env HTTPS_PROXY`.
|
||||
|
||||
## x509: certificate signed by unknown authority
|
||||
|
||||
```text
|
||||
[ERROR ImagePull]: failed to pull image k8s.gcr.io/kube-apiserver:v1.13.3:
|
||||
output: Error response from daemon:
|
||||
Get https://k8s.gcr.io/v2/: x509: certificate signed by unknown authority
|
||||
```
|
||||
|
||||
This is because minikube VM is stuck behind a proxy that rewrites HTTPS responses to contain its own TLS certificate. The [solution](https://github.com/kubernetes/minikube/issues/3613#issuecomment-461034222) is to install the proxy certificate into a location that is copied to the VM at startup, so that it can be validated.
|
||||
|
||||
Ask your IT department for the appropriate PEM file, and add it to:
|
||||
|
||||
`~/.minikube/files/etc/ssl/certs`
|
||||
|
||||
Then run `minikube delete` and `minikube start`.
|
||||
|
||||
## downloading binaries: proxyconnect tcp: tls: oversized record received with length 20527
|
||||
|
||||
Your need to set a correct `HTTPS_PROXY` value.
|
||||
|
||||
## Additional Information
|
||||
|
||||
* [Configure Docker to use a proxy server](https://docs.docker.com/network/proxy/)
|
||||
This document has moved to https://minikube.sigs.k8s.io/docs/reference/networking/proxy/
|
||||
|
|
|
@ -1,28 +1 @@
|
|||
# Enabling Docker Insecure Registry
|
||||
|
||||
Minikube allows users to configure the docker engine's `--insecure-registry` flag. You can use the `--insecure-registry` flag on the
|
||||
`minikube start` command to enable insecure communication between the docker engine and registries listening to requests from the CIDR range.
|
||||
|
||||
One nifty hack is to allow the kubelet running in minikube to talk to registries deployed inside a pod in the cluster without backing them
|
||||
with TLS certificates. Because the default service cluster IP is known to be available at 10.0.0.1, users can pull images from registries
|
||||
deployed inside the cluster by creating the cluster with `minikube start --insecure-registry "10.0.0.0/24"`.
|
||||
|
||||
## Private Container Registries
|
||||
|
||||
**GCR/ECR/Docker**: Minikube has an addon, `registry-creds` which maps credentials into Minikube to support pulling from Google Container Registry (GCR), Amazon's EC2 Container Registry (ECR), and Private Docker registries. You will need to run `minikube addons configure registry-creds` and `minikube addons enable registry-creds` to get up and running. An example of this is below:
|
||||
|
||||
```shell
|
||||
$ minikube addons configure registry-creds
|
||||
Do you want to enable AWS Elastic Container Registry? [y/n]: n
|
||||
|
||||
Do you want to enable Google Container Registry? [y/n]: y
|
||||
-- Enter path to credentials (e.g. /home/user/.config/gcloud/application_default_credentials.json):/home/user/.config/gcloud/application_default_credentials.json
|
||||
|
||||
Do you want to enable Docker Registry? [y/n]: n
|
||||
registry-creds was successfully configured
|
||||
$ minikube addons enable registry-creds
|
||||
```
|
||||
|
||||
For additional information on private container registries, see [this page](https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/).
|
||||
|
||||
We recommend you use _ImagePullSecrets_, but if you would like to configure access on the minikube VM you can place the `.dockercfg` in the `/home/docker` directory or the `config.json` in the `/var/lib/kubelet` directory. Make sure to restart your kubelet (for kubeadm) process with `sudo systemctl restart kubelet`.
|
||||
This document has moved to https://minikube.sigs.k8s.io/docs/tasks/registry/
|
||||
|
|
|
@ -1,78 +1,2 @@
|
|||
# Networking
|
||||
|
||||
## Firewalls, VPN's, and proxies
|
||||
|
||||
minikube may require access from the host to the following IP ranges: 192.168.99.0/24, 192.168.39.0/24, and 10.96.0.0/12. These networks can be changed in minikube using `--host-only-cidr` and `--service-cluster-ip-range`.
|
||||
|
||||
* To use minikube with a proxy, see [Using HTTP/HTTPS proxies](http_proxy.md).
|
||||
|
||||
* If you are using minikube with a VPN, you may need to configure the VPN to allow local routing for traffic to the afforementioned IP ranges.
|
||||
|
||||
* If you are using minikube with a local firewall, you will need to allow access from the host to the afforementioned IP ranges on TCP ports 22 and 8443. You will also need to add access from these IP's to TCP ports 443 and 53 externally to pull images.
|
||||
|
||||
## Access to NodePort services
|
||||
|
||||
The minikube VM is exposed to the host system via a host-only IP address, that can be obtained with the `minikube ip` command. Any services of type `NodePort` can be accessed over that IP address, on the NodePort.
|
||||
|
||||
To determine the NodePort for your service, you can use a `kubectl` command like this (note that `nodePort` begins with lowercase `n` in JSON output):
|
||||
|
||||
`kubectl get service $SERVICE --output='jsonpath="{.spec.ports[0].nodePort}"'`
|
||||
|
||||
We also have a shortcut for fetching the minikube IP and a service's `NodePort`:
|
||||
|
||||
`minikube service --url $SERVICE`
|
||||
|
||||
### Increasing the NodePort range
|
||||
|
||||
By default, minikube only exposes ports 30000-32767. If this is not enough, you can configure the apiserver to allow all ports using:
|
||||
|
||||
`minikube start --extra-config=apiserver.service-node-port-range=1-65535`
|
||||
|
||||
This flag also accepts a comma separated list of ports and port ranges.
|
||||
|
||||
## Access to LoadBalancer services using `minikube tunnel`
|
||||
|
||||
Services of type `LoadBalancer` can be exposed via the `minikube tunnel` command.
|
||||
|
||||
````shell
|
||||
minikube tunnel
|
||||
````
|
||||
|
||||
Will output:
|
||||
|
||||
```text
|
||||
out/minikube tunnel
|
||||
Password: *****
|
||||
Status:
|
||||
machine: minikube
|
||||
pid: 59088
|
||||
route: 10.96.0.0/12 -> 192.168.99.101
|
||||
minikube: Running
|
||||
services: []
|
||||
errors:
|
||||
minikube: no errors
|
||||
router: no errors
|
||||
loadbalancer emulator: no errors
|
||||
|
||||
|
||||
````
|
||||
|
||||
Tunnel might ask you for password for creating and deleting network routes.
|
||||
|
||||
## Cleaning up orphaned routes
|
||||
|
||||
If the `minikube tunnel` shuts down in an unclean way, it might leave a network route around.
|
||||
This case the ~/.minikube/tunnels.json file will contain an entry for that tunnel.
|
||||
To cleanup orphaned routes, run:
|
||||
|
||||
````shell
|
||||
minikube tunnel --cleanup
|
||||
````
|
||||
|
||||
## Tunnel: Avoid entering password multiple times
|
||||
|
||||
`minikube tunnel` runs as a separate daemon, creates a network route on the host to the service CIDR of the cluster using the cluster's IP address as a gateway. Adding a route requires root privileges for the user, and thus there are differences in how to run `minikube tunnel` depending on the OS.
|
||||
|
||||
If you want to avoid entering the root password, consider setting NOPASSWD for "ip" and "route" commands:
|
||||
|
||||
<https://superuser.com/questions/1328452/sudoers-nopasswd-for-single-executable-but-allowing-others>
|
||||
This document has moved to https://minikube.sigs.k8s.io/docs/reference/networking/
|
||||
|
|
@ -1,40 +1 @@
|
|||
# Offline support in minikube
|
||||
|
||||
As of v1.0, `minikube start` is offline compatible out of the box. Here are some implementation details to help systems integrators:
|
||||
|
||||
## Requirements
|
||||
|
||||
* On the initial run for a given Kubernetes release, `minikube start` must have access to the internet, or a configured `--image-repository` to pull from.
|
||||
|
||||
## Cache location
|
||||
|
||||
* `~/.minikube/cache` - Top-level folder
|
||||
* `~/.minikube/cache/iso` - VM ISO image. Typically updated once per major minikube release.
|
||||
* `~/.minikube/cache/images` - Docker images used by Kubernetes.
|
||||
* `~/.minikube/cache/<version>` - Kubernetes binaries, such as `kubeadm` and `kubelet`
|
||||
|
||||
## Sharing the minikube cache
|
||||
|
||||
For offline use on other hosts, one can copy the contents of `~/.minikube/cache`. As of the v1.0 release, this directory
|
||||
contains 685MB of data:
|
||||
|
||||
```text
|
||||
cache/iso/minikube-v1.0.0.iso
|
||||
cache/images/gcr.io/k8s-minikube/storage-provisioner_v1.8.1
|
||||
cache/images/k8s.gcr.io/k8s-dns-sidecar-amd64_1.14.13
|
||||
cache/images/k8s.gcr.io/k8s-dns-dnsmasq-nanny-amd64_1.14.13
|
||||
cache/images/k8s.gcr.io/kubernetes-dashboard-amd64_v1.10.1
|
||||
cache/images/k8s.gcr.io/kube-scheduler_v1.14.0
|
||||
cache/images/k8s.gcr.io/coredns_1.3.1
|
||||
cache/images/k8s.gcr.io/kube-controller-manager_v1.14.0
|
||||
cache/images/k8s.gcr.io/kube-apiserver_v1.14.0
|
||||
cache/images/k8s.gcr.io/pause_3.1
|
||||
cache/images/k8s.gcr.io/etcd_3.3.10
|
||||
cache/images/k8s.gcr.io/kube-addon-manager_v9.0
|
||||
cache/images/k8s.gcr.io/k8s-dns-kube-dns-amd64_1.14.13
|
||||
cache/images/k8s.gcr.io/kube-proxy_v1.14.0
|
||||
cache/v1.14.0/kubeadm
|
||||
cache/v1.14.0/kubelet
|
||||
```
|
||||
|
||||
If any of these files exist, minikube will use copy them into the VM directly rather than pulling them from the internet.
|
||||
This document has moved to https://minikube.sigs.k8s.io/docs/reference/cache/
|
||||
|
|
|
@ -1,33 +1 @@
|
|||
# OpenID Connect Authentication
|
||||
|
||||
Minikube `kube-apiserver` can be configured to support OpenID Connect Authentication.
|
||||
|
||||
Read more about OpenID Connect Authentication for Kubernetes here: <https://kubernetes.io/docs/reference/access-authn-authz/authentication/#openid-connect-tokens>
|
||||
|
||||
## Configuring the API Server
|
||||
|
||||
Configuration values can be passed to the API server using the `--extra-config` flag on the `minikube start` command. See [configuring_kubernetes.md](https://github.com/kubernetes/minikube/blob/master/docs/configuring_kubernetes.md) for more details.
|
||||
|
||||
The following example configures your Minikube cluster to support RBAC and OIDC:
|
||||
|
||||
```shell
|
||||
minikube start \
|
||||
--extra-config=apiserver.authorization-mode=RBAC \
|
||||
--extra-config=apiserver.oidc-issuer-url=https://example.com \
|
||||
--extra-config=apiserver.oidc-username-claim=email \
|
||||
--extra-config=apiserver.oidc-client-id=kubernetes-local
|
||||
```
|
||||
|
||||
## Configuring kubectl
|
||||
|
||||
You can use the kubectl `oidc` authenticator to create a kubeconfig as shown in the Kubernetes docs: <https://kubernetes.io/docs/reference/access-authn-authz/authentication/#option-1-oidc-authenticator>
|
||||
|
||||
`minikube start` already creates a kubeconfig that includes a `cluster`, in order to use it with your `oidc` authenticator kubeconfig, you can run:
|
||||
|
||||
```shell
|
||||
kubectl config set-context kubernetes-local-oidc --cluster=minikube --user username@example.com
|
||||
Context "kubernetes-local-oidc" created.
|
||||
kubectl config use-context kubernetes-local-oidc
|
||||
```
|
||||
|
||||
For the new context to work you will need to create, at the very minimum, a `Role` and a `RoleBinding` in your cluster to grant permissions to the `subjects` included in your `oidc-username-claim`.
|
||||
This document has moved to https://minikube.sigs.k8s.io/docs/tutorials/openid_connect_auth/
|
||||
|
|
|
@ -1,39 +1 @@
|
|||
# Persistent Volumes
|
||||
|
||||
Minikube supports [PersistentVolumes](https://kubernetes.io/docs/concepts/storage/persistent-volumes/) of type `hostPath` out of the box. These PersistentVolumes are mapped to a directory inside the running Minikube instance (usually a VM, unless you use `--vm-driver=none`). For more information on how this works, read the Dynamic Provisioning section below.
|
||||
|
||||
## A note on mounts, persistence, and Minikube hosts
|
||||
|
||||
Minikube is configured to persist files stored under the following directories, which are made in the Minikube VM (or on your localhost if running on bare metal). You may lose data from other directories on reboots.
|
||||
|
||||
* `/data`
|
||||
* `/var/lib/minikube`
|
||||
* `/var/lib/docker`
|
||||
* `/tmp/hostpath_pv`
|
||||
* `/tmp/hostpath-provisioner`
|
||||
|
||||
Here is an example PersistentVolume config to persist data in the '/data' directory:
|
||||
|
||||
```yaml
|
||||
apiVersion: v1
|
||||
kind: PersistentVolume
|
||||
metadata:
|
||||
name: pv0001
|
||||
spec:
|
||||
accessModes:
|
||||
- ReadWriteOnce
|
||||
capacity:
|
||||
storage: 5Gi
|
||||
hostPath:
|
||||
path: /data/pv0001/
|
||||
```
|
||||
|
||||
You can also achieve persistence by creating a PV in a mounted host folder.
|
||||
|
||||
## Dynamic provisioning and CSI
|
||||
|
||||
In addition, minikube implements a very simple, canonical implementation of dynamic storage controller that runs alongside its deployment. This manages provisioning of *hostPath* volumes (rather then via the previous, in-tree hostPath provider).
|
||||
|
||||
The default [Storage Provisioner Controller](https://github.com/kubernetes/minikube/blob/master/pkg/storage/storage_provisioner.go) is managed internally, in the minikube codebase, demonstrating how easy it is to plug a custom storage controller into kubernetes as a storage component of the system, and provides pods with dynamically, to test your pod's behaviour when persistent storage is mapped to it.
|
||||
|
||||
Note that this is not a CSI based storage provider, rather, it simply declares a PersistentVolume object of type hostpath dynamically when the controller see's that there is an outstanding storage request.
|
||||
This document has moved to https://minikube.sigs.k8s.io/docs/reference/persistent_volumes/
|
||||
|
|
|
@ -1,81 +1 @@
|
|||
# Reusing the Docker daemon
|
||||
|
||||
## Method 1: Without minikube registry addon
|
||||
|
||||
When using a single VM of Kubernetes it's really handy to reuse the Docker daemon inside the VM; as this means you don't have to build on your host machine and push the image into a docker registry - you can just build inside the same docker daemon as minikube which speeds up local experiments.
|
||||
|
||||
To be able to work with the docker daemon on your mac/linux host use the docker-env command in your shell:
|
||||
|
||||
```shell
|
||||
eval $(minikube docker-env)
|
||||
```
|
||||
|
||||
You should now be able to use docker on the command line on your host mac/linux machine talking to the docker daemon inside the minikube VM:
|
||||
|
||||
```shell
|
||||
docker ps
|
||||
```
|
||||
|
||||
Docker may report following forbidden error if you are using http proxy and the `$(minikube ip)` is not added to `no_proxy`/`NO_PROXY`:
|
||||
|
||||
```shell
|
||||
error during connect: Get https://192.168.39.98:2376/v1.39/containers/json: Forbidden
|
||||
```
|
||||
|
||||
On Centos 7, docker may report the following error:
|
||||
|
||||
```shell
|
||||
Could not read CA certificate "/etc/docker/ca.pem": open /etc/docker/ca.pem: no such file or directory
|
||||
```
|
||||
|
||||
The fix is to update /etc/sysconfig/docker to ensure that minikube's environment changes are respected:
|
||||
|
||||
```diff
|
||||
< DOCKER_CERT_PATH=/etc/docker
|
||||
---
|
||||
> if [ -z "${DOCKER_CERT_PATH}" ]; then
|
||||
> DOCKER_CERT_PATH=/etc/docker
|
||||
> fi
|
||||
```
|
||||
|
||||
Remember to turn off the _imagePullPolicy:Always_, as otherwise Kubernetes won't use images you built locally.
|
||||
|
||||
## Method 2: With minikube registry addon
|
||||
|
||||
Enable minikube registry addon and then push images directly into registry. Steps are as follows:
|
||||
|
||||
For illustration purpose, we will assume that minikube VM has one of the ip from `192.168.39.0/24` subnet. If you have not overridden these subnets as per [networking guide](https://github.com/kubernetes/minikube/blob/master/docs/networking.md), you can find out default subnet being used by minikube for a specific OS and driver combination [here](https://github.com/kubernetes/minikube/blob/dfd9b6b83d0ca2eeab55588a16032688bc26c348/pkg/minikube/cluster/cluster.go#L408) which is subject to change. Replace `192.168.39.0/24` with appropriate values for your environment wherever applicable.
|
||||
|
||||
Ensure that docker is configured to use `192.168.39.0/24` as insecure registry. Refer [here](https://docs.docker.com/registry/insecure/) for instructions.
|
||||
|
||||
Ensure that `192.168.39.0/24` is enabled as insecure registry in minikube. Refer [here](https://github.com/kubernetes/minikube/blob/master/docs/insecure_registry.md) for instructions..
|
||||
|
||||
Enable minikube registry addon:
|
||||
|
||||
```shell
|
||||
minikube addons enable registry
|
||||
```
|
||||
|
||||
Build docker image and tag it appropriately:
|
||||
|
||||
```shell
|
||||
docker build --tag $(minikube ip):5000/test-img .
|
||||
```
|
||||
|
||||
Push docker image to minikube registry:
|
||||
|
||||
```shell
|
||||
docker push $(minikube ip):5000/test-img
|
||||
```
|
||||
|
||||
Now run it in minikube:
|
||||
|
||||
```shell
|
||||
kubectl run test-img --image=$(minikube ip):5000/test-img
|
||||
```
|
||||
|
||||
Or if `192.168.39.0/24` is not enabled as insecure registry in minikube, then:
|
||||
|
||||
```shell
|
||||
kubectl run test-img --image=localhost:5000/test-img
|
||||
```
|
||||
This document has moved to https://minikube.sigs.k8s.io/docs/tasks/docker_daemon/
|
||||
|
|
|
@ -1,15 +1 @@
|
|||
# minikube: Syncing files into the VM
|
||||
|
||||
## Syncing files during start up
|
||||
|
||||
As soon as a VM is created, minikube will populate the root filesystem with any files stored in $MINIKUBE_HOME (~/.minikube/files).
|
||||
|
||||
For example, running the following commands will result in `/etc/OMG` being added with the contents of `hello` into the minikube VM:
|
||||
|
||||
```shell
|
||||
mkdir -p ~/.minikube/files/etc
|
||||
echo hello > ~/.minikube/files/etc/OMG
|
||||
minikube start
|
||||
```
|
||||
|
||||
This method of file synchronization can be useful for adding configuration files for apiserver, or adding HTTPS certificates.
|
||||
This document has moved to https://minikube.sigs.k8s.io/docs/tasks/sync/
|
||||
|
|
145
docs/tunnel.md
145
docs/tunnel.md
|
@ -1,144 +1 @@
|
|||
# Minikube Tunnel Design Doc
|
||||
|
||||
## Background
|
||||
|
||||
Minikube today only exposes a single IP address for all cluster and VM communication.
|
||||
This effectively requires users to connect to any running Pods, Services or LoadBalancers over ClusterIPs, which can require modifications to workflows when compared to developing against a production cluster.
|
||||
|
||||
A main goal of Minikube is to minimize the differences required in code and configuration between development and production, so this is not ideal.
|
||||
If all cluster IP addresses and Load Balancers were made available on the minikube host machine, these modifications would not be necessary and users would get the "magic" experience of developing from inside a cluster.
|
||||
|
||||
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/).
|
||||
|
||||
Elson Rodriguez has provided a similar guide, including a Minikube [external LB controller](https://github.com/elsonrodriguez/minikube-lb-patch).
|
||||
|
||||
## Example usage
|
||||
|
||||
```shell
|
||||
$ minikube tunnel
|
||||
Starting minikube tunnel process. Press Ctrl+C to exit.
|
||||
All cluster IPs and load balancers are now available from your host machine.
|
||||
```
|
||||
|
||||
## Overview
|
||||
|
||||
We will introduce a new command, `minikube tunnel`, that must be run with root permissions.
|
||||
This command will:
|
||||
|
||||
* Establish networking routes from the host into the VM for all IP ranges used by Kubernetes.
|
||||
* Enable a cluster controller that allocates IPs to services external `LoadBalancer` IPs.
|
||||
* Clean up routes and IPs when stopped, or when `minikube` stops.
|
||||
|
||||
Additionally, we will introduce a Minikube LoadBalancer controller that manages a CIDR of IPs and assigns them to services of type `LoadBalancer`.
|
||||
These IPs will also be made available on the host machine.
|
||||
|
||||
## Network Routes
|
||||
|
||||
Minikube drivers usually establish "host-only" IP addresses (192.168.1.1, for example) that route into the running VM
|
||||
from the host.
|
||||
|
||||
The new `minikube tunnel` command will create a static routing table entry that maps the CIDRs used by Pods, Services and LoadBalancers to the host-only IP, obtainable via the `minikube ip` command.
|
||||
|
||||
The commands below detail adding routes for the entire `/8` block, we should probably add individual entries for each CIDR we manage instead.
|
||||
|
||||
### Linux
|
||||
|
||||
Route entries for the entire 10.* block can be added via:
|
||||
|
||||
```shell
|
||||
sudo ip route add 10.0.0.0/8 via $(minikube ip)
|
||||
```
|
||||
|
||||
and deleted via:
|
||||
|
||||
```shell
|
||||
sudo ip route delete 10.0.0.0/8
|
||||
```
|
||||
|
||||
The routing table can be queried with `netstat -nr -f inet`
|
||||
|
||||
### OSX
|
||||
|
||||
Route entries can be added via:
|
||||
|
||||
```shell
|
||||
sudo route -n add 10.0.0.0/8 $(minikube ip)
|
||||
```
|
||||
|
||||
and deleted via:
|
||||
|
||||
```shell
|
||||
sudo route -n delete 10.0.0.0/8
|
||||
|
||||
```
|
||||
|
||||
The routing table can be queried with `netstat -nr -f inet`
|
||||
|
||||
### Windows
|
||||
|
||||
Route entries can be added via:
|
||||
|
||||
```shell
|
||||
route ADD 10.0.0.0 MASK 255.0.0.0 <minikube ip>
|
||||
```
|
||||
|
||||
and deleted via:
|
||||
|
||||
```shell
|
||||
route DELETE 10.0.0.0
|
||||
```
|
||||
|
||||
The routing table can be queried with `route print -4`
|
||||
|
||||
### Handling unclean shutdowns
|
||||
|
||||
Unclean shutdowns of the tunnel process can result in partially executed cleanup process, leaving network routes in the routing table.
|
||||
We will keep track of the routes created by each tunnel in a centralized location in the main minikube config directory.
|
||||
This list serves as a registry for tunnels containing information about
|
||||
|
||||
- machine profile
|
||||
- process ID
|
||||
- and the route that was created
|
||||
|
||||
The cleanup command cleans the routes from both the routing table and the registry for tunnels that are not running:
|
||||
|
||||
```shell
|
||||
minikube tunnel --cleanup
|
||||
```
|
||||
|
||||
Updating the tunnel registry and the routing table is an atomic transaction:
|
||||
|
||||
- create route in the routing table + create registry entry if both are successful, otherwise rollback
|
||||
- delete route in the routing table + remove registry entry if both are successful, otherwise rollback
|
||||
|
||||
*Note*: because we don't support currently real multi cluster setup (due to overlapping CIDRs), the handling of running/not-running processes is not strictly required however it is forward looking.
|
||||
|
||||
### Handling routing table conflicts
|
||||
|
||||
A routing table conflict happens when a destination CIDR of the route required by the tunnel overlaps with an existing route.
|
||||
Minikube tunnel will warn the user if this happens and should not create the rule.
|
||||
There should not be any automated removal of conflicting routes.
|
||||
|
||||
*Note*: If the user removes the minikube config directory, this might leave conflicting rules in the network routing table that will have to be cleaned up manually.
|
||||
|
||||
## Load Balancer Controller
|
||||
|
||||
In addition to making IPs routable, minikube tunnel will assign an external IP (the ClusterIP) to all services of type `LoadBalancer`.
|
||||
|
||||
The logic of this controller will be, roughly:
|
||||
|
||||
```python
|
||||
for service in services:
|
||||
if service.type == "LoadBalancer" and len(service.ingress) == 0:
|
||||
add_ip_to_service(ClusterIP, service)
|
||||
sleep
|
||||
```
|
||||
|
||||
Note that the Minikube ClusterIP can change over time (during system reboots) and this loop should also handle reconciliation of those changes.
|
||||
|
||||
## Handling multiple clusters
|
||||
|
||||
Multiple clusters are currently not supported due to our inability to specify ServiceCIDR.
|
||||
This causes conflicting routes having the same destination CIDR.
|
||||
This document has moved to https://minikube.sigs.k8s.io/docs/tasks/loadbalancer/
|
||||
|
|
|
@ -1,119 +1 @@
|
|||
# vm-driver=none
|
||||
|
||||
## Overview
|
||||
|
||||
This document is written for system integrators who are familiar with minikube, and wish to run it within a customized VM environment.
|
||||
|
||||
The `none` driver allows advanced minikube users to skip VM creation, allowing minikube to be run on a user-supplied VM.
|
||||
|
||||
## What operating systems are supported?
|
||||
|
||||
The `none` driver supports releases of Debian, Ubuntu, and Fedora that are less than 2 years old. In practice, any systemd-based modern distribution is likely to work, and we will accept pull requests which improve compatibility with other systems.
|
||||
|
||||
## Example: basic usage
|
||||
|
||||
`sudo minikube start --vm-driver=none`
|
||||
|
||||
NOTE: The none driver requires minikube to be run as root, until [#3760](https://github.com/kubernetes/minikube/issues/3760) can be addressed.
|
||||
|
||||
## Example: Using minikube for continuous integration testing
|
||||
|
||||
Most continuous integration environments are already running inside a VM, and may not supported nested virtualization. The `none` driver was designed for this use case. Here is an example, that runs minikube from a non-root user, and ensures that the latest stable kubectl is installed:
|
||||
|
||||
```shell
|
||||
curl -Lo minikube \
|
||||
https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 \
|
||||
&& sudo install minikube /usr/local/bin/
|
||||
|
||||
kv=$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)
|
||||
curl -Lo kubectl \
|
||||
https://storage.googleapis.com/kubernetes-release/release/$kv/bin/linux/amd64/kubectl \
|
||||
&& sudo install kubectl /usr/local/bin/
|
||||
|
||||
export MINIKUBE_WANTUPDATENOTIFICATION=false
|
||||
export MINIKUBE_WANTREPORTERRORPROMPT=false
|
||||
export MINIKUBE_HOME=$HOME
|
||||
export CHANGE_MINIKUBE_NONE_USER=true
|
||||
export KUBECONFIG=$HOME/.kube/config
|
||||
|
||||
mkdir -p $HOME/.kube $HOME/.minikube
|
||||
touch $KUBECONFIG
|
||||
|
||||
sudo -E minikube start --vm-driver=none
|
||||
```
|
||||
|
||||
At this point, kubectl should be able to interact with the minikube cluster.
|
||||
|
||||
## Can the none driver be used outside of a VM?
|
||||
|
||||
Yes, *but please avoid doing so if at all possible.*
|
||||
|
||||
minikube was designed to run Kubernetes within a dedicated VM, and assumes that it has complete control over the machine it is executing on. With the `none` driver, minikube and Kubernetes run in an environment with very limited isolation, which could result in:
|
||||
|
||||
* Decreased security
|
||||
* Decreased reliability
|
||||
* Data loss
|
||||
|
||||
We'll cover these in detail below:
|
||||
|
||||
### Decreased security
|
||||
|
||||
* minikube starts services that may be available on the Internet. Please ensure that you have a firewall to protect your host from unexpected access. For instance:
|
||||
* apiserver listens on TCP *:8443
|
||||
* kubelet listens on TCP *:10250 and *:10255
|
||||
* kube-scheduler listens on TCP *:10259
|
||||
* kube-controller listens on TCP *:10257
|
||||
* Containers may have full access to your filesystem.
|
||||
* Containers may be able to execute arbitrary code on your host, by using container escape vulnerabilities such as [CVE-2019-5736](https://access.redhat.com/security/vulnerabilities/runcescape). Please keep your release of minikube up to date.
|
||||
|
||||
### Decreased reliability
|
||||
|
||||
* minikube with the none driver may be tricky to configure correctly at first, because there are many more chances for interference with other locally run services, such as dnsmasq.
|
||||
|
||||
* When run in `none` mode, minikube has no built-in resource limit mechanism, which means you could deploy pods which would consume all of the hosts resources.
|
||||
|
||||
* minikube and the Kubernetes services it starts may interfere with other running software on the system. For instance, minikube will start and stop container runtimes via systemd, such as docker, containerd, cri-o.
|
||||
|
||||
### Data loss
|
||||
|
||||
With the `none` driver, minikube will overwrite the following system paths:
|
||||
|
||||
* /usr/bin/kubeadm - Updated to match the exact version of Kubernetes selected
|
||||
* /usr/bin/kubelet - Updated to match the exact version of Kubernetes selected
|
||||
* /etc/kubernetes - configuration files
|
||||
|
||||
These paths will be erased when running `minikube delete`:
|
||||
|
||||
* /data/minikube
|
||||
* /etc/kubernetes/manifests
|
||||
* /var/lib/minikube
|
||||
|
||||
As Kubernetes has full access to both your filesystem as well as your docker images, it is possible that other unexpected data loss issues may arise.
|
||||
|
||||
## Environment variables
|
||||
|
||||
Some environment variables may be useful for using the `none` driver:
|
||||
|
||||
* **CHANGE_MINIKUBE_NONE_USER**: Sets file ownership to the user running sudo ($SUDO_USER)
|
||||
* **MINIKUBE_HOME**: Saves all files to this directory instead of $HOME
|
||||
* **MINIKUBE_WANTUPDATENOTIFICATION**: Toggles the notification that your version of minikube is obsolete
|
||||
* **MINIKUBE_WANTREPORTERRORPROMPT**: Toggles the error reporting prompt
|
||||
* **MINIKUBE_IN_STYLE**: Toggles color output and emoji usage
|
||||
|
||||
## Known Issues
|
||||
|
||||
* `systemctl` is required. [#2704](https://github.com/kubernetes/minikube/issues/2704)
|
||||
* `-p` (profiles) are unsupported: It is not possible to run more than one `--vm-driver=none` instance
|
||||
* Many `minikube` commands are not supported, such as: `dashboard`, `mount`, `ssh`
|
||||
* minikube with the `none` driver has a confusing permissions model, as some commands need to be run as root ("start"), and others by a regular user ("dashboard")
|
||||
* CoreDNS detects resolver loop, goes into CrashloopBackoff - [#3511](https://github.com/kubernetes/minikube/issues/3511)
|
||||
* Some versions of Linux have a version of docker that is newer then what Kubernetes expects. To overwrite this, run minikube with the following parameters: `sudo -E minikube start --vm-driver=none --kubernetes-version v1.11.8 --extra-config kubeadm.ignore-preflight-errors=SystemVerification`
|
||||
* On Ubuntu 18.04 (and probably others), because of how `systemd-resolve` is configured by default, one needs to bypass the default `resolv.conf` file and use a different one instead.
|
||||
- In this case, you should use this file: `/run/systemd/resolve/resolv.conf`
|
||||
- `sudo -E minikube --vm-driver=none start --extra-config=kubelet.resolv-conf=/run/systemd/resolve/resolv.conf`
|
||||
- Apperently, though, if `resolve.conf` is too big (about 10 lines!!!), one gets the following error: `Waiting for pods: apiserver proxy! Error restarting cluster: wait: waiting for k8s-app=kube-proxy: timed out waiting for the condition`
|
||||
- This error happens in Kubernetes 0.11.x, 0.12.x and 0.13.x, but *not* in 0.14.x
|
||||
- If that's your case, try this:
|
||||
- `grep -E "^nameserver" /run/systemd/resolve/resolv.conf |head -n 3 > /tmp/resolv.conf && sudo -E minikube --vm-driver=none start --extra-config=kubelet.resolv-conf=/tmp/resolv.conf`
|
||||
|
||||
* [Full list of open 'none' driver issues](https://github.com/kubernetes/minikube/labels/co%2Fnone-driver)
|
||||
This document has moved to https://minikube.sigs.k8s.io/docs/reference/drivers/none/
|
||||
|
|
116
go.mod
116
go.mod
|
@ -2,109 +2,101 @@ module k8s.io/minikube
|
|||
|
||||
go 1.12
|
||||
|
||||
require github.com/google/go-containerregistry v0.0.0-20180731221751-697ee0b3d46e
|
||||
|
||||
require k8s.io/kubernetes v1.15.2
|
||||
|
||||
require (
|
||||
github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78 // 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/cheggaaa/pb/v3 v3.0.1
|
||||
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/docker v1.13.1 // indirect
|
||||
github.com/docker/go-units v0.0.0-20170127094116-9e638d38cf69
|
||||
github.com/docker/machine v0.16.1
|
||||
github.com/docker/go-units v0.3.3
|
||||
github.com/docker/machine v0.7.1-0.20190718054102-a555e4f7a8f5 // version is 0.7.1 to pin to 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/go-ole/go-ole v1.2.4 // indirect
|
||||
github.com/gogo/protobuf v0.0.0-20170330071051-c0656edd0d9e // 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-20190318164241-019cdfc6adf9
|
||||
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b
|
||||
github.com/google/go-cmp v0.3.0
|
||||
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/juju/fslock v0.0.0-20160525022230-4d5c94c67b4b
|
||||
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/mattn/go-isatty v0.0.8
|
||||
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/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.0
|
||||
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/shirou/gopsutil v2.18.12+incompatible
|
||||
github.com/shurcooL/sanitized_anchor_name v0.0.0-20151028001915-10ef21a441db // indirect
|
||||
github.com/shirou/w32 v0.0.0-20160930032740-bb4de0191aa4 // indirect
|
||||
github.com/sirupsen/logrus v1.4.1 // 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/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-20190626221950-04f50cda93cb
|
||||
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
|
||||
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
|
||||
)
|
||||
|
|
610
go.sum
610
go.sum
|
@ -1,272 +1,686 @@
|
|||
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/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 h1:zoIOcVf0xPN1tnMVbTtEdI+P8OofVk3NObnwOQ6nK2Q=
|
||||
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/VividCortex/ewma v1.1.1 h1:MnEK4VOv6n0RSY4vtRe3h11qjxL3+t0B8yOL8iMXdcM=
|
||||
github.com/VividCortex/ewma v1.1.1/go.mod h1:2Tkkvm3sRDVXaiyucHiACn4cqf7DpdyLvmxzcbUokwA=
|
||||
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 h1:wIkZHkNfC7R6GI5w7l/PdAdzXzlrbcI3p8OAlnkTsnc=
|
||||
github.com/cheggaaa/pb v1.0.27/go.mod h1:pQciLPpbU0oxA0h+VJYYLxO+XeDQb5pZijXscXHm81s=
|
||||
github.com/cheggaaa/pb/v3 v3.0.1 h1:m0BngUk2LuSRYdx4fujDKNRXNDpbNCfptPfVT2m6OJY=
|
||||
github.com/cheggaaa/pb/v3 v3.0.1/go.mod h1:SqqeMF/pMOIu3xgGoxtPYhMNQP258xE4x/XRTYua+KU=
|
||||
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/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 h1:FKH02LHYqSmeWd3GBh0KIkM8JBpw3RrShgtcWShdWJg=
|
||||
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 h1:w3NnFcKR5241cfmQU5ZZAsf0xcpId6mWOupTvJlUX2U=
|
||||
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-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 h1:3lOnM9cSzgGwx8VfK/NGOW5fLQ0GjIlCkaktF+n1M6o=
|
||||
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.7.1-0.20190718054102-a555e4f7a8f5 h1:/2G2PrqxKga8hAVGPri/5NEv24rvDwXoH5pjPXUBCpA=
|
||||
github.com/docker/machine v0.7.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/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/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/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-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-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-20180731221751-697ee0b3d46e h1:Hm0cmAopLRcMPePDVUo93UC2JGtNWPlZKo8OIzyPbhQ=
|
||||
github.com/google/go-containerregistry v0.0.0-20180731221751-697ee0b3d46e/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 h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no=
|
||||
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/juju/fslock v0.0.0-20160525022230-4d5c94c67b4b h1:FQ7+9fxhyp82ks9vAuyPzG0/vVbWwMwLJ+P6yJI5FN8=
|
||||
github.com/juju/fslock v0.0.0-20160525022230-4d5c94c67b4b/go.mod h1:HMcgvsgd0Fjj4XXDkbjdmlbI505rUPBs6WBMYg2pXks=
|
||||
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/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.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/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.2 h1:/bC9yWikZXAL9uJdulbSfyVNIR3n3trXl+v8+1sx8mU=
|
||||
github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
|
||||
github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
|
||||
github.com/mattn/go-isatty v0.0.8 h1:HLtExJ+uU2HOZ+wI0Tt5DtUDrx8yhUqDcp7fYERX4CE=
|
||||
github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
|
||||
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 h1:nXxl5PrvVm2L/wCy8dQu6DMTwH4oIuGN8GJDAlqDdVE=
|
||||
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/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 h1:Yu3681ykYHDfLoI6XVjL4JWmkE+3TX9yfIWwRCh1kFM=
|
||||
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 h1:BNgUWy7fCNMkfpyG05/9wWeDnIY4hqs9UpqkGIjAb68=
|
||||
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=
|
||||
github.com/pkg/browser v0.0.0-20160118053552-9302be274faa h1:od00Tr1U7+cLVtc+RNFmR53spHUF98Ziu33S8UIQnt0=
|
||||
github.com/pkg/browser v0.0.0-20160118053552-9302be274faa/go.mod h1:4OwLy04Bl9Ef3GJJCoec+30X3LQs/0/m4HFRt/2LUSA=
|
||||
github.com/pkg/errors v0.8.0 h1:WdK/asTD0HN+q6hsWO3/vpuAkAr+tw6aNJNDFFf0+qw=
|
||||
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||
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/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/sanitized_anchor_name v0.0.0-20151028001915-10ef21a441db h1:lrOUn8raSZS/V52c7elGaEyuogqSkEo/Qj2Auo2G1ik=
|
||||
github.com/shirou/w32 v0.0.0-20160930032740-bb4de0191aa4 h1:udFKJ0aHUL60LboW/A+DfgoHVedieIzIXE8uylPue0U=
|
||||
github.com/shirou/w32 v0.0.0-20160930032740-bb4de0191aa4/go.mod h1:qsXQc7+bwAM3Q1u/4XEfrquwF8Lw7D7y5cD8CuHnfIc=
|
||||
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-20190626221950-04f50cda93cb h1:fgwFCsaw9buMuxNd6+DQfAuSFqbNiQZpcgJQAgJsK6k=
|
||||
golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/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 h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo=
|
||||
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.2 h1:RO9EuRw5vlN3oa/lnmPxmywOoJRtg9o40KcklHXNIAQ=
|
||||
k8s.io/kubernetes v1.15.2/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 h1:2s4y/VeY+iATOZqZdNhr/sfPFL7+Tvu6wNl/u5WTBcI=
|
||||
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=
|
||||
|
|
|
@ -56,7 +56,7 @@ name: minikube
|
|||
version: ${version}
|
||||
website_url: https://github.com/kubernetes/minikube
|
||||
repo_url: https://github.com/kubernetes/minikube
|
||||
documentation_url: https://github.com/kubernetes/minikube/blob/master/docs/README.md
|
||||
documentation_url: https://minikube.sigs.k8s.io/docs/
|
||||
product_logo_url: https://raw.githubusercontent.com/kubernetes/minikube/master/images/logo/logo.svg
|
||||
type: installer
|
||||
description: minikube runs a local Kubernetes cluster on macOS, Linux, and Windows.
|
||||
|
|
|
@ -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"
|
||||
|
@ -71,10 +71,12 @@ echo ">> Downloading test inputs from ${MINIKUBE_LOCATION} ..."
|
|||
gsutil -qm cp \
|
||||
"gs://minikube-builds/${MINIKUBE_LOCATION}/minikube-${OS_ARCH}" \
|
||||
"gs://minikube-builds/${MINIKUBE_LOCATION}/docker-machine-driver"-* \
|
||||
"gs://minikube-builds/${MINIKUBE_LOCATION}/e2e-${OS_ARCH}" out
|
||||
"gs://minikube-builds/${MINIKUBE_LOCATION}/e2e-${OS_ARCH}" \
|
||||
"gs://minikube-builds/${MINIKUBE_LOCATION}/gvisor-addon" out
|
||||
|
||||
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}"
|
||||
|
@ -82,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
|
||||
|
@ -130,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
|
||||
|
@ -139,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
|
||||
|
@ -150,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
|
||||
|
@ -161,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"
|
||||
|
@ -197,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 ""
|
||||
|
||||
|
@ -220,6 +274,9 @@ ${SUDO_PREFIX} rm -f "${KUBECONFIG}" || true
|
|||
rmdir "${TEST_HOME}"
|
||||
echo ">> ${TEST_HOME} completed at $(date)"
|
||||
|
||||
# Build the gvisor image. This will be copied into minikube and loaded by ctr.
|
||||
docker build -t gcr.io/k8s-minikube/gvisor-addon:latest -f testdata/gvisor-addon-Dockerfile out
|
||||
|
||||
if [[ "${MINIKUBE_LOCATION}" != "master" ]]; then
|
||||
readonly target_url="https://storage.googleapis.com/minikube-builds/logs/${MINIKUBE_LOCATION}/${JOB_NAME}.txt"
|
||||
curl -s "https://api.github.com/repos/kubernetes/minikube/statuses/${COMMIT}?access_token=$access_token" \
|
||||
|
|
|
@ -0,0 +1,64 @@
|
|||
#!/bin/bash
|
||||
|
||||
# Copyright 2016 The Kubernetes Authors All rights reserved.
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
|
||||
set -eux -o pipefail
|
||||
|
||||
if (($# < 2)); then
|
||||
echo "ERROR: given ! ($#) number of parameters but expect 2."
|
||||
echo "USAGE: ./check_and_install_golang.sh VERSION_TO_INSTALL INSTALL_PATH"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
VERSION_TO_INSTALL=${1}
|
||||
INSTALL_PATH=${2}
|
||||
|
||||
# installs or updates golang if right version doesn't exists
|
||||
function check_and_install_golang() {
|
||||
if ! go version &>/dev/null; then
|
||||
echo "WARNING: No golang installation found in your enviroment."
|
||||
install_golang "$VERSION_TO_INSTALL" "$INSTALL_PATH"
|
||||
return
|
||||
fi
|
||||
|
||||
# golang has been installed and check its version
|
||||
if [[ $(go version) =~ (([0-9]+)\.([0-9]+).([0-9]+).([\.0-9]*)) ]]; then
|
||||
HOST_VERSION=${BASH_REMATCH[1]}
|
||||
if [ $HOST_VERSION = $VERSION_TO_INSTALL ]; then
|
||||
echo "go version on the host looks good : $HOST_VERSION"
|
||||
else
|
||||
echo "WARNING: expected go version to be $VERSION_TO_INSTALL but got $HOST_VERSION"
|
||||
install_golang "$VERSION_TO_INSTALL" "$INSTALL_PATH"
|
||||
fi
|
||||
else
|
||||
echo "ERROR: Failed to parse golang version: $HOST_VERSION"
|
||||
return
|
||||
fi
|
||||
}
|
||||
|
||||
# install_golang takes two parameters version and path to install.
|
||||
function install_golang() {
|
||||
echo "Installing golang version: $1 on $2"
|
||||
pushd /tmp >/dev/null
|
||||
# using sudo because previously installed versions might have been installed by a different user.
|
||||
# as it was the case on jenkins VM.
|
||||
sudo curl -qL -O "https://storage.googleapis.com/golang/go${1}.linux-amd64.tar.gz" &&
|
||||
sudo tar xfa go${1}.linux-amd64.tar.gz &&
|
||||
sudo rm -rf "${2}/go" &&
|
||||
sudo mv go "${2}/" && sudo chown -R $(whoami): ${2}/go
|
||||
popd >/dev/null
|
||||
}
|
||||
|
||||
check_and_install_golang
|
|
@ -27,7 +27,8 @@ set -e
|
|||
|
||||
OS_ARCH="linux-amd64"
|
||||
VM_DRIVER="kvm2"
|
||||
JOB_NAME="Linux-KVM"
|
||||
JOB_NAME="KVM_Linux"
|
||||
PARALLEL_COUNT=4
|
||||
|
||||
# Download files and set permissions
|
||||
source ./common.sh
|
||||
|
|
|
@ -15,7 +15,7 @@
|
|||
# limitations under the License.
|
||||
|
||||
|
||||
# This script runs the integration tests on a Linux machine for the Virtualbox Driver
|
||||
# This script runs the integration tests on a Linux machine for the none Driver
|
||||
|
||||
# The script expects the following env variables:
|
||||
# MINIKUBE_LOCATION: GIT_COMMIT from upstream build.
|
||||
|
@ -28,8 +28,9 @@ set -e
|
|||
|
||||
OS_ARCH="linux-amd64"
|
||||
VM_DRIVER="none"
|
||||
JOB_NAME="Linux-None"
|
||||
JOB_NAME="none_Linux"
|
||||
EXTRA_ARGS="--bootstrapper=kubeadm"
|
||||
PARALLEL_COUNT=1
|
||||
|
||||
SUDO_PREFIX="sudo -E "
|
||||
export KUBECONFIG="/root/.kube/config"
|
||||
|
|
|
@ -15,7 +15,7 @@
|
|||
# limitations under the License.
|
||||
|
||||
|
||||
# This script runs the integration tests on a Linux machine for the Virtualbox Driver
|
||||
# This script runs the integration tests on a Linux machine for the VirtualBox Driver
|
||||
|
||||
# The script expects the following env variables:
|
||||
# MINIKUBE_LOCATION: GIT_COMMIT from upstream build.
|
||||
|
@ -27,7 +27,8 @@ set -e
|
|||
|
||||
OS_ARCH="linux-amd64"
|
||||
VM_DRIVER="virtualbox"
|
||||
JOB_NAME="Linux-VirtualBox"
|
||||
JOB_NAME="VirtualBox_Linux"
|
||||
PARALLEL_COUNT=4
|
||||
|
||||
# Download files and set permissions
|
||||
source ./common.sh
|
||||
|
|
|
@ -25,6 +25,11 @@ set -eux -o pipefail
|
|||
|
||||
readonly bucket="minikube-builds"
|
||||
|
||||
# Make sure the right golang version is installed based on Makefile
|
||||
WANT_GOLANG_VERSION=$(grep '^GO_VERSION' Makefile | awk '{ print $3 }')
|
||||
./hack/jenkins/installers/check_install_golang.sh $WANT_GOLANG_VERSION /usr/local
|
||||
|
||||
|
||||
declare -rx BUILD_IN_DOCKER=y
|
||||
declare -rx GOPATH=/var/lib/jenkins/go
|
||||
declare -rx ISO_BUCKET="${bucket}/${ghprbPullId}"
|
||||
|
@ -49,8 +54,8 @@ git diff ${ghprbActualCommit} --name-only \
|
|||
| grep -q deploy/iso/minikube && rebuild=1 || rebuild=0
|
||||
|
||||
if [[ "${rebuild}" -eq 1 ]]; then
|
||||
echo "ISO changes detected ... rebuilding ISO"
|
||||
make release-iso
|
||||
echo "ISO changes detected ... rebuilding ISO"
|
||||
make release-iso
|
||||
fi
|
||||
|
||||
cp -r test/integration/testdata out/
|
||||
|
|
|
@ -24,19 +24,29 @@
|
|||
# ghprbActualCommit: The commit hash, injected from the ghpbr plugin.
|
||||
# access_token: The Github API access token. Injected by the Jenkins credential provider.
|
||||
|
||||
set -e
|
||||
set +x
|
||||
set -eux -o pipefail
|
||||
|
||||
if [ "${ghprbPullId}" == "master" ]; then
|
||||
echo "not setting github status for continuous builds"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
for job in "OSX-Virtualbox" "OSX-Hyperkit" "Linux-Virtualbox" "Linux-KVM" "Linux-None"; do
|
||||
target_url="https://storage.googleapis.com/minikube-builds/logs/${ghprbPullId}/${job}.txt"
|
||||
jobs=(
|
||||
'HyperKit_macOS'
|
||||
'Hyper-V_Windows'
|
||||
'VirtualBox_Linux'
|
||||
'VirtualBox_macOS'
|
||||
'VirtualBox_Windows'
|
||||
# 'KVM-GPU_Linux' - Disabled
|
||||
'KVM_Linux'
|
||||
'none_Linux'
|
||||
)
|
||||
|
||||
for j in ${jobs[@]}; do
|
||||
target_url="https://storage.googleapis.com/minikube-builds/logs/${ghprbPullId}/${j}.txt"
|
||||
curl "https://api.github.com/repos/kubernetes/minikube/statuses/${ghprbActualCommit}?access_token=$access_token" \
|
||||
-H "Content-Type: application/json" \
|
||||
-X POST \
|
||||
-d "{\"state\": \"pending\", \"description\": \"Jenkins\", \"target_url\": \"${target_url}\", \"context\": \"${job}\"}"
|
||||
-d "{\"state\": \"pending\", \"description\": \"Jenkins\", \"target_url\": \"${target_url}\", \"context\": \"${j}\"}"
|
||||
done
|
||||
|
||||
|
|
|
@ -1,221 +0,0 @@
|
|||
#!/bin/bash
|
||||
|
||||
# Copyright 2017 The Kubernetes Authors All rights reserved.
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
|
||||
|
||||
# This script runs the integration tests on a Linux machine for the KVM Driver
|
||||
|
||||
# The script expects the following env variables:
|
||||
# MINIKUBE_LOCATION: GIT_COMMIT from upstream build.
|
||||
# COMMIT: Actual commit ID from upstream build
|
||||
# EXTRA_BUILD_ARGS (optional): Extra args to be passed into the minikube integrations tests
|
||||
# access_token: The Github API access token. Injected by the Jenkins credential provider.
|
||||
|
||||
set -e
|
||||
|
||||
OS_ARCH="linux-amd64"
|
||||
VM_DRIVER="kvm"
|
||||
JOB_NAME="Minishift-Linux-KVM"
|
||||
BINARY=$(pwd)/out/minishift
|
||||
EXTRA_FLAGS="--show-libmachine-logs"
|
||||
|
||||
# Download files and set permissions
|
||||
mkdir -p out/
|
||||
|
||||
curl -L http://artifacts.ci.centos.org/minishift/minishift/master/latest/linux-amd64/minishift -o out/minishift
|
||||
gsutil -m cp gs://minikube-builds/${MINIKUBE_LOCATION}/docker-machine-driver-* out/ || true
|
||||
gsutil -m cp gs://minikube-builds/${MINIKUBE_LOCATION}/minikube-testing.iso out/ || true
|
||||
|
||||
# Set the executable bit on the minishift and driver binary
|
||||
chmod +x out/minishift
|
||||
chmod +x out/docker-machine-driver-* || true
|
||||
|
||||
# Get version information
|
||||
./out/minishift version
|
||||
|
||||
# Remove pre-exist kube config files
|
||||
rm -fr $HOME/.kube || true
|
||||
|
||||
ISO=https://storage.googleapis.com/minikube/iso/minikube-v0.24.0.iso
|
||||
if [ -f $(pwd)/out/minikube-testing.iso ]; then
|
||||
ISO=file://$(pwd)/out/minikube-testing.iso
|
||||
fi
|
||||
|
||||
export MINIKUBE_WANTREPORTERRORPROMPT=False
|
||||
./out/minishift delete --force || true
|
||||
|
||||
# Add the out/ directory to the PATH, for using new drivers.
|
||||
export PATH="$(pwd)/out/":$PATH
|
||||
|
||||
# Linux cleanup
|
||||
virsh -c qemu:///system list --all \
|
||||
| sed -n '3,$ p' \
|
||||
| cut -d' ' -f 7 \
|
||||
| xargs -I {} sh -c "virsh -c qemu:///system destroy {}; virsh -c qemu:///system undefine {}" \
|
||||
|| true
|
||||
|
||||
sudo virsh net-define /usr/share/libvirt/networks/default.xml || true
|
||||
sudo virsh net-start default || true
|
||||
sudo virsh net-list
|
||||
|
||||
# see what driver we are using
|
||||
which docker-machine-driver-${VM_DRIVER} || true
|
||||
|
||||
result=$?
|
||||
echo $result
|
||||
|
||||
function print_success_message() {
|
||||
echo ""
|
||||
echo " ------------ [ $1 - Passed ]"
|
||||
echo ""
|
||||
}
|
||||
|
||||
function exit_with_message() {
|
||||
if [[ "$1" != 0 ]]; then
|
||||
echo "$2"
|
||||
result=1
|
||||
fi
|
||||
}
|
||||
|
||||
function assert_equal() {
|
||||
if [ "$1" != "$2" ]; then
|
||||
echo "Expected '$1' equal to '$2'"
|
||||
result=1
|
||||
fi
|
||||
}
|
||||
|
||||
# http://www.linuxjournal.com/content/validating-ip-address-bash-script
|
||||
function assert_valid_ip() {
|
||||
local ip=$1
|
||||
local valid=1
|
||||
|
||||
if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
|
||||
OIFS=$IFS
|
||||
IFS='.'
|
||||
ip=($ip)
|
||||
IFS=$OIFS
|
||||
[[ ${ip[0]} -le 255 && ${ip[1]} -le 255 \
|
||||
&& ${ip[2]} -le 255 && ${ip[3]} -le 255 ]]
|
||||
valid=$?
|
||||
fi
|
||||
|
||||
if [[ "$valid" != 0 ]]; then
|
||||
echo "IP '$1' is invalid"
|
||||
result=1
|
||||
fi
|
||||
}
|
||||
|
||||
function verify_start_instance() {
|
||||
$BINARY start --iso-url $ISO $EXTRA_FLAGS
|
||||
exit_with_message "$?" "Error starting Minishift VM"
|
||||
output=`$BINARY status | sed -n 1p`
|
||||
assert_equal "$output" "Minishift: Running"
|
||||
print_success_message "Starting VM"
|
||||
}
|
||||
|
||||
function verify_stop_instance() {
|
||||
$BINARY stop
|
||||
exit_with_message "$?" "Error starting Minishift VM"
|
||||
output=`$BINARY status | sed -n 1p`
|
||||
assert_equal "$output" "Minishift: Stopped"
|
||||
print_success_message "Stopping VM"
|
||||
}
|
||||
|
||||
function verify_swap_space() {
|
||||
output=`$BINARY ssh -- free | tail -n 1 | awk '{print $2}'`
|
||||
if [ "$output" == "0" ]; then
|
||||
echo "Expected '$output' not equal to 0"
|
||||
result=1
|
||||
fi
|
||||
print_success_message "Swap space check"
|
||||
}
|
||||
|
||||
function verify_ssh_connection() {
|
||||
output=`$BINARY ssh -- echo hello`
|
||||
assert_equal $output "hello"
|
||||
print_success_message "SSH Connection"
|
||||
}
|
||||
|
||||
function verify_vm_ip() {
|
||||
output=`$BINARY ip`
|
||||
assert_valid_ip $output
|
||||
print_success_message "Getting VM IP"
|
||||
}
|
||||
|
||||
function verify_cifs_installation() {
|
||||
expected="mount.cifs version: 6.6"
|
||||
output=`$BINARY ssh -- sudo /sbin/mount.cifs -V`
|
||||
assert_equal "$output" "$expected"
|
||||
print_success_message "CIFS installation"
|
||||
}
|
||||
|
||||
function verify_nfs_installation() {
|
||||
expected="mount.nfs: (linux nfs-utils 1.3.3)"
|
||||
output=`$BINARY ssh -- sudo /sbin/mount.nfs -V /need/for/version`
|
||||
assert_equal "$output" "$expected"
|
||||
print_success_message "NFS installation"
|
||||
}
|
||||
|
||||
function verify_bind_mount() {
|
||||
output=`$BINARY ssh -- 'findmnt | grep "\[/var/lib/" | wc -l'`
|
||||
assert_equal $output "11"
|
||||
print_success_message "Bind mount check"
|
||||
}
|
||||
|
||||
function verify_delete() {
|
||||
$BINARY delete --force
|
||||
exit_with_message "$?" "Error deleting Minishift VM"
|
||||
output=`$BINARY status`
|
||||
if [ "$1" != "$2" ]; then
|
||||
echo "Expected '$1' equal to '$2'"
|
||||
result=1
|
||||
fi
|
||||
print_success_message "Deleting VM"
|
||||
}
|
||||
|
||||
function verify_sshfs_installation() {
|
||||
expected="SSHFS version 2.5"
|
||||
output=`$BINARY ssh -- sudo sshfs -V`
|
||||
assert_equal "$output" "$expected"
|
||||
print_success_message "SSHFS installation"
|
||||
}
|
||||
|
||||
# Tests
|
||||
set +e
|
||||
verify_start_instance
|
||||
verify_vm_ip
|
||||
verify_cifs_installation
|
||||
verify_nfs_installation
|
||||
verify_sshfs_installation
|
||||
verify_bind_mount
|
||||
verify_swap_space
|
||||
verify_delete
|
||||
set -e
|
||||
|
||||
if [[ $result -eq 0 ]]; then
|
||||
status="success"
|
||||
else
|
||||
status="failure"
|
||||
fi
|
||||
|
||||
set +x
|
||||
target_url="https://storage.googleapis.com/minikube-builds/logs/${MINIKUBE_LOCATION}/${JOB_NAME}.txt"
|
||||
curl "https://api.github.com/repos/kubernetes/minikube/statuses/${COMMIT}?access_token=$access_token" \
|
||||
-H "Content-Type: application/json" \
|
||||
-X POST \
|
||||
-d "{\"state\": \"$status\", \"description\": \"Jenkins\", \"target_url\": \"$target_url\", \"context\": \"${JOB_NAME}\"}"
|
||||
set -x
|
||||
|
||||
exit $result
|
|
@ -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
|
|
@ -28,10 +28,10 @@ set -e
|
|||
|
||||
OS_ARCH="darwin-amd64"
|
||||
VM_DRIVER="hyperkit"
|
||||
JOB_NAME="OSX-Hyperkit"
|
||||
JOB_NAME="HyperKit_macOS"
|
||||
EXTRA_ARGS="--bootstrapper=kubeadm"
|
||||
EXTRA_START_ARGS=""
|
||||
|
||||
PARALLEL_COUNT=3
|
||||
|
||||
# Download files and set permissions
|
||||
source common.sh
|
||||
|
|
|
@ -15,7 +15,7 @@
|
|||
# limitations under the License.
|
||||
|
||||
|
||||
# This script runs the integration tests on an OSX machine for the Virtualbox Driver
|
||||
# This script runs the integration tests on an macOS machine for the VirtualBox Driver
|
||||
|
||||
# The script expects the following env variables:
|
||||
# MINIKUBE_LOCATION: GIT_COMMIT from upstream build.
|
||||
|
@ -27,8 +27,9 @@
|
|||
set -e
|
||||
OS_ARCH="darwin-amd64"
|
||||
VM_DRIVER="virtualbox"
|
||||
JOB_NAME="OSX-Virtualbox"
|
||||
JOB_NAME="VirtualBox_macOS"
|
||||
EXTRA_ARGS="--bootstrapper=kubeadm"
|
||||
PARALLEL_COUNT=3
|
||||
|
||||
# Download files and set permissions
|
||||
source common.sh
|
||||
|
|
|
@ -31,6 +31,11 @@ export DEB_VERSION=${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_BUILD}
|
|||
export RPM_VERSION=${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_BUILD}
|
||||
export GOPATH=~/go
|
||||
|
||||
# Make sure the right golang version is installed based on Makefile
|
||||
WANT_GOLANG_VERSION=$(grep '^GO_VERSION' Makefile | awk '{ print $3 }')
|
||||
./hack/jenkins/installers/check_install_golang.sh $WANT_GOLANG_VERSION /usr/local
|
||||
|
||||
|
||||
# Make sure the tag matches the Makefile
|
||||
cat Makefile | grep "VERSION_MAJOR ?=" | grep $VERSION_MAJOR
|
||||
cat Makefile | grep "VERSION_MINOR ?=" | grep $VERSION_MINOR
|
||||
|
|
|
@ -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
|
|
@ -25,8 +25,8 @@ $env:result=$lastexitcode
|
|||
If($env:result -eq 0){$env:status="success"}
|
||||
Else {$env:status="failure"}
|
||||
|
||||
$env:target_url="https://storage.googleapis.com/minikube-builds/logs/$env:MINIKUBE_LOCATION/Windows-hyperv.txt"
|
||||
$json = "{`"state`": `"$env:status`", `"description`": `"Jenkins`", `"target_url`": `"$env:target_url`", `"context`": `"Windows-hyperv`"}"
|
||||
$env:target_url="https://storage.googleapis.com/minikube-builds/logs/$env:MINIKUBE_LOCATION/Hyper-V_Windows.txt"
|
||||
$json = "{`"state`": `"$env:status`", `"description`": `"Jenkins`", `"target_url`": `"$env:target_url`", `"context`": `"Hyper-V_Windows`"}"
|
||||
Invoke-WebRequest -Uri "https://api.github.com/repos/kubernetes/minikube/statuses/$env:COMMIT`?access_token=$env:access_token" -Body $json -ContentType "application/json" -Method Post -usebasicparsing
|
||||
|
||||
Exit $env:result
|
||||
|
|
|
@ -25,8 +25,8 @@ $env:result=$lastexitcode
|
|||
If($env:result -eq 0){$env:status="success"}
|
||||
Else {$env:status="failure"}
|
||||
|
||||
$env:target_url="https://storage.googleapis.com/minikube-builds/logs/$env:MINIKUBE_LOCATION/Windows-virtualbox.txt"
|
||||
$json = "{`"state`": `"$env:status`", `"description`": `"Jenkins`", `"target_url`": `"$env:target_url`", `"context`": `"Windows-virtualbox`"}"
|
||||
$env:target_url="https://storage.googleapis.com/minikube-builds/logs/$env:MINIKUBE_LOCATION/VirtualBox_Windows.txt"
|
||||
$json = "{`"state`": `"$env:status`", `"description`": `"Jenkins`", `"target_url`": `"$env:target_url`", `"context`": `"VirtualBox_Windows`"}"
|
||||
Invoke-WebRequest -Uri "https://api.github.com/repos/kubernetes/minikube/statuses/$env:COMMIT`?access_token=$env:access_token" -Body $json -ContentType "application/json" -Method Post -usebasicparsing
|
||||
|
||||
Exit $env:result
|
||||
|
|
|
@ -1,34 +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.
|
||||
|
||||
mkdir -p out
|
||||
gsutil.cmd -m cp gs://minikube-builds/$env:MINIKUBE_LOCATION/minikube-windows-amd64.exe out/
|
||||
gsutil.cmd -m cp gs://minikube-builds/$env:MINIKUBE_LOCATION/e2e-windows-amd64.exe out/
|
||||
gsutil.cmd -m cp -r gs://minikube-builds/$env:MINIKUBE_LOCATION/testdata .
|
||||
|
||||
|
||||
./out/minikube-windows-amd64.exe delete
|
||||
|
||||
out/e2e-windows-amd64.exe --% -minikube-start-args="--vm-driver=virtualbox --container-runtime=cri-o" -minikube-args="--v=10 --logtostderr --bootstrapper=kubeadm" -test.v -test.timeout=30m -binary=out/minikube-windows-amd64.exe
|
||||
|
||||
$env:result=$lastexitcode
|
||||
# If the last exit code was 0->success, x>0->error
|
||||
If($env:result -eq 0){$env:status="success"}
|
||||
Else {$env:status="failure"}
|
||||
|
||||
$env:target_url="https://storage.googleapis.com/minikube-builds/logs/$env:MINIKUBE_LOCATION/Windows-Kubeadm-CRI-O.txt"
|
||||
$json = "{`"state`": `"$env:status`", `"description`": `"Jenkins`", `"target_url`": `"$env:target_url`", `"context`": `"Windows-Kubeadm-CRI-O`"}"
|
||||
Invoke-WebRequest -Uri "https://api.github.com/repos/kubernetes/minikube/statuses/$env:COMMIT`?access_token=$env:access_token" -Body $json -ContentType "application/json" -Method Post -usebasicparsing
|
||||
|
||||
Exit $env:result
|
Binary file not shown.
Before Width: | Height: | Size: 6.2 KiB |
BIN
images/start.jpg
BIN
images/start.jpg
Binary file not shown.
Before Width: | Height: | Size: 70 KiB |
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"
|
||||
|
|
|
@ -40,9 +40,6 @@ import (
|
|||
hyperkit "github.com/moby/hyperkit/go"
|
||||
"github.com/pkg/errors"
|
||||
pkgdrivers "k8s.io/minikube/pkg/drivers"
|
||||
|
||||
"k8s.io/minikube/pkg/minikube/constants"
|
||||
commonutil "k8s.io/minikube/pkg/util"
|
||||
)
|
||||
|
||||
const (
|
||||
|
@ -77,7 +74,6 @@ func NewDriver(hostName, storePath string) *Driver {
|
|||
SSHUser: "docker",
|
||||
},
|
||||
CommonDriver: &pkgdrivers.CommonDriver{},
|
||||
DiskSize: commonutil.CalculateSizeInMB(constants.DefaultDiskSize),
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -121,7 +117,7 @@ func (d *Driver) Create() error {
|
|||
|
||||
// DriverName returns the name of the driver
|
||||
func (d *Driver) DriverName() string {
|
||||
return constants.DriverHyperkit
|
||||
return "hyperkit"
|
||||
}
|
||||
|
||||
// GetSSHHostname returns hostname for use with ssh
|
||||
|
@ -227,7 +223,7 @@ func (d *Driver) Start() error {
|
|||
h.Memory = d.Memory
|
||||
h.UUID = d.UUID
|
||||
// This should stream logs from hyperkit, but doesn't seem to work.
|
||||
logger := golog.New(os.Stderr, constants.DriverHyperkit, golog.LstdFlags)
|
||||
logger := golog.New(os.Stderr, "hyperkit", golog.LstdFlags)
|
||||
h.SetLogger(logger)
|
||||
|
||||
if vsockPorts, err := d.extractVSockPorts(); err != nil {
|
||||
|
@ -269,12 +265,25 @@ func (d *Driver) Start() error {
|
|||
|
||||
d.IPAddress, err = GetIPAddressByMACAddress(mac)
|
||||
if err != nil {
|
||||
return &commonutil.RetriableError{Err: err}
|
||||
return &tempError{err}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
if err := commonutil.RetryAfter(30, getIP, 2*time.Second); err != nil {
|
||||
// Implement a retry loop without calling any minikube code
|
||||
for i := 0; i < 30; i++ {
|
||||
log.Debugf("Attempt %d", i)
|
||||
err = getIP()
|
||||
if err == nil {
|
||||
break
|
||||
}
|
||||
if _, ok := err.(*tempError); !ok {
|
||||
return err
|
||||
}
|
||||
time.Sleep(2 * time.Second)
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
return fmt.Errorf("IP address never found in dhcp leases file %v", err)
|
||||
}
|
||||
log.Debugf("IP: %s", d.IPAddress)
|
||||
|
@ -294,6 +303,14 @@ func (d *Driver) Start() error {
|
|||
return nil
|
||||
}
|
||||
|
||||
type tempError struct {
|
||||
Err error
|
||||
}
|
||||
|
||||
func (t tempError) Error() string {
|
||||
return "Temporary error: " + t.Err.Error()
|
||||
}
|
||||
|
||||
//recoverFromUncleanShutdown searches for an existing hyperkit.pid file in
|
||||
//the machine directory. If it can't find it, a clean shutdown is assumed.
|
||||
//If it finds the pid file, it checks for a running hyperkit process with that pid
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue