mirror of https://github.com/docker/cli.git
vendor with go mod
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
This commit is contained in:
parent
6fbf816901
commit
7e560ae76f
|
@ -4,4 +4,6 @@
|
||||||
/man/man*/
|
/man/man*/
|
||||||
/docs/yaml/gen/
|
/docs/yaml/gen/
|
||||||
profile.out
|
profile.out
|
||||||
/vndr.log
|
|
||||||
|
# top-level go.mod is not meant to be checked in
|
||||||
|
/go.mod
|
||||||
|
|
|
@ -11,7 +11,7 @@ on:
|
||||||
pull_request:
|
pull_request:
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
lint:
|
validate:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
|
@ -19,6 +19,7 @@ jobs:
|
||||||
target:
|
target:
|
||||||
- lint
|
- lint
|
||||||
- shellcheck
|
- shellcheck
|
||||||
|
- validate-vendor
|
||||||
steps:
|
steps:
|
||||||
-
|
-
|
||||||
name: Checkout
|
name: Checkout
|
||||||
|
|
|
@ -15,4 +15,6 @@ Thumbs.db
|
||||||
/man/man8/
|
/man/man8/
|
||||||
/docs/yaml/gen/
|
/docs/yaml/gen/
|
||||||
profile.out
|
profile.out
|
||||||
/vndr.log
|
|
||||||
|
# top-level go.mod is not meant to be checked in
|
||||||
|
/go.mod
|
||||||
|
|
16
Makefile
16
Makefile
|
@ -49,11 +49,18 @@ dynbinary: ## build dynamically linked binary
|
||||||
plugins: ## build example CLI plugins
|
plugins: ## build example CLI plugins
|
||||||
./scripts/build/plugins
|
./scripts/build/plugins
|
||||||
|
|
||||||
vendor: vendor.conf ## check that vendor matches vendor.conf
|
.PHONY: vendor
|
||||||
|
vendor: ## update vendor with go modules
|
||||||
rm -rf vendor
|
rm -rf vendor
|
||||||
bash -c 'vndr |& grep -v -i clone | tee ./vndr.log'
|
./scripts/vendor update
|
||||||
scripts/validate/check-git-diff vendor
|
|
||||||
scripts/validate/check-all-packages-vendored
|
.PHONY: validate-vendor
|
||||||
|
validate-vendor: ## validate vendor
|
||||||
|
./scripts/vendor validate
|
||||||
|
|
||||||
|
.PHONY: mod-outdated
|
||||||
|
mod-outdated: ## check outdated dependencies
|
||||||
|
./scripts/vendor outdated
|
||||||
|
|
||||||
.PHONY: authors
|
.PHONY: authors
|
||||||
authors: ## generate AUTHORS file from git history
|
authors: ## generate AUTHORS file from git history
|
||||||
|
@ -73,6 +80,5 @@ help: ## print this help
|
||||||
|
|
||||||
.PHONY: ci-validate
|
.PHONY: ci-validate
|
||||||
ci-validate:
|
ci-validate:
|
||||||
time make -B vendor
|
|
||||||
time make manpages
|
time make manpages
|
||||||
time make yamldocs
|
time make yamldocs
|
||||||
|
|
|
@ -78,6 +78,32 @@ target "shellcheck" {
|
||||||
output = ["type=cacheonly"]
|
output = ["type=cacheonly"]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
target "validate-vendor" {
|
||||||
|
dockerfile = "./dockerfiles/Dockerfile.vendor"
|
||||||
|
target = "validate"
|
||||||
|
output = ["type=cacheonly"]
|
||||||
|
}
|
||||||
|
|
||||||
|
target "update-vendor" {
|
||||||
|
dockerfile = "./dockerfiles/Dockerfile.vendor"
|
||||||
|
target = "update"
|
||||||
|
output = ["."]
|
||||||
|
}
|
||||||
|
|
||||||
|
// Used to invalidate cache for mod-outdated run stage
|
||||||
|
// See also https://github.com/moby/buildkit/issues/1213
|
||||||
|
variable "TIMESTAMP" {
|
||||||
|
default = ""
|
||||||
|
}
|
||||||
|
target "mod-outdated" {
|
||||||
|
dockerfile = "./dockerfiles/Dockerfile.vendor"
|
||||||
|
target = "outdated"
|
||||||
|
args = {
|
||||||
|
TIMESTAMP = TIMESTAMP
|
||||||
|
}
|
||||||
|
output = ["type=cacheonly"]
|
||||||
|
}
|
||||||
|
|
||||||
target "test" {
|
target "test" {
|
||||||
target = "test"
|
target = "test"
|
||||||
output = ["type=cacheonly"]
|
output = ["type=cacheonly"]
|
||||||
|
|
|
@ -20,6 +20,7 @@ ifeq ($(DOCKER_CLI_GO_BUILD_CACHE),y)
|
||||||
DOCKER_CLI_MOUNTS += -v "$(CACHE_VOLUME_NAME):/root/.cache/go-build"
|
DOCKER_CLI_MOUNTS += -v "$(CACHE_VOLUME_NAME):/root/.cache/go-build"
|
||||||
endif
|
endif
|
||||||
VERSION = $(shell cat VERSION)
|
VERSION = $(shell cat VERSION)
|
||||||
|
TIMESTAMP = $(shell date '+%s')
|
||||||
ENVVARS = -e VERSION=$(VERSION) -e GITCOMMIT -e PLATFORM -e TESTFLAGS -e TESTDIRS -e GOOS -e GOARCH -e GOARM -e TEST_ENGINE_VERSION=$(E2E_ENGINE_VERSION)
|
ENVVARS = -e VERSION=$(VERSION) -e GITCOMMIT -e PLATFORM -e TESTFLAGS -e TESTDIRS -e GOOS -e GOARCH -e GOARM -e TEST_ENGINE_VERSION=$(E2E_ENGINE_VERSION)
|
||||||
|
|
||||||
# Some Dockerfiles use features that are only supported with BuildKit enabled
|
# Some Dockerfiles use features that are only supported with BuildKit enabled
|
||||||
|
@ -80,8 +81,20 @@ fmt: ## run gofmt
|
||||||
$(DOCKER_RUN) $(DEV_DOCKER_IMAGE_NAME) make fmt
|
$(DOCKER_RUN) $(DEV_DOCKER_IMAGE_NAME) make fmt
|
||||||
|
|
||||||
.PHONY: vendor
|
.PHONY: vendor
|
||||||
vendor: build_docker_image vendor.conf ## download dependencies (vendor/) listed in vendor.conf
|
vendor: ## update vendor with go modules
|
||||||
$(DOCKER_RUN) -it $(DEV_DOCKER_IMAGE_NAME) make vendor
|
$(eval $@_TMP_OUT := $(shell mktemp -d -t dockercli-output.XXXXXXXXXX))
|
||||||
|
docker buildx bake --set "*.output=$($@_TMP_OUT)" update-vendor
|
||||||
|
rm -rf ./vendor
|
||||||
|
cp -R "$($@_TMP_OUT)"/out/* .
|
||||||
|
rm -rf $($@_TMP_OUT)/*
|
||||||
|
|
||||||
|
.PHONY: validate-vendor
|
||||||
|
validate-vendor: ## validate vendor
|
||||||
|
docker buildx bake validate-vendor
|
||||||
|
|
||||||
|
.PHONY: mod-outdated
|
||||||
|
mod-outdated: ## check outdated dependencies
|
||||||
|
TIMESTAMP=$(TIMESTAMP) docker buildx bake mod-outdated
|
||||||
|
|
||||||
.PHONY: authors
|
.PHONY: authors
|
||||||
authors: ## generate AUTHORS file from git history
|
authors: ## generate AUTHORS file from git history
|
||||||
|
|
|
@ -12,13 +12,6 @@ RUN --mount=type=cache,target=/root/.cache/go-build \
|
||||||
--mount=type=tmpfs,target=/go/src/ \
|
--mount=type=tmpfs,target=/go/src/ \
|
||||||
GO111MODULE=on go install gotest.tools/gotestsum@${GOTESTSUM_VERSION}
|
GO111MODULE=on go install gotest.tools/gotestsum@${GOTESTSUM_VERSION}
|
||||||
|
|
||||||
FROM golang AS vndr
|
|
||||||
ARG VNDR_VERSION=v0.1.2
|
|
||||||
RUN --mount=type=cache,target=/root/.cache/go-build \
|
|
||||||
--mount=type=cache,target=/go/pkg/mod \
|
|
||||||
--mount=type=tmpfs,target=/go/src/ \
|
|
||||||
GO111MODULE=on go install github.com/LK4D4/vndr@${VNDR_VERSION}
|
|
||||||
|
|
||||||
FROM golang AS goversioninfo
|
FROM golang AS goversioninfo
|
||||||
ARG GOVERSIONINFO_VERSION=v1.3.0
|
ARG GOVERSIONINFO_VERSION=v1.3.0
|
||||||
RUN --mount=type=cache,target=/root/.cache/go-build \
|
RUN --mount=type=cache,target=/root/.cache/go-build \
|
||||||
|
@ -39,7 +32,6 @@ CMD bash
|
||||||
ENV DISABLE_WARN_OUTSIDE_CONTAINER=1
|
ENV DISABLE_WARN_OUTSIDE_CONTAINER=1
|
||||||
ENV PATH=$PATH:/go/src/github.com/docker/cli/build
|
ENV PATH=$PATH:/go/src/github.com/docker/cli/build
|
||||||
|
|
||||||
COPY --from=vndr /go/bin/* /go/bin/
|
|
||||||
COPY --from=gotestsum /go/bin/* /go/bin/
|
COPY --from=gotestsum /go/bin/* /go/bin/
|
||||||
COPY --from=goversioninfo /go/bin/* /go/bin/
|
COPY --from=goversioninfo /go/bin/* /go/bin/
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,41 @@
|
||||||
|
# syntax=docker/dockerfile:1.3-labs
|
||||||
|
|
||||||
|
ARG GO_VERSION=1.16.11
|
||||||
|
ARG MODOUTDATED_VERSION=v0.8.0
|
||||||
|
|
||||||
|
FROM golang:${GO_VERSION}-alpine AS base
|
||||||
|
RUN apk add --no-cache bash git rsync
|
||||||
|
WORKDIR /src
|
||||||
|
|
||||||
|
FROM base AS vendored
|
||||||
|
RUN --mount=target=/context \
|
||||||
|
--mount=target=.,type=tmpfs \
|
||||||
|
--mount=target=/go/pkg/mod,type=cache <<EOT
|
||||||
|
set -e
|
||||||
|
rsync -a /context/. .
|
||||||
|
./scripts/vendor update
|
||||||
|
mkdir /out
|
||||||
|
cp -r vendor.mod vendor.sum vendor /out
|
||||||
|
EOT
|
||||||
|
|
||||||
|
FROM scratch AS update
|
||||||
|
COPY --from=vendored /out /out
|
||||||
|
|
||||||
|
FROM vendored AS validate
|
||||||
|
RUN --mount=target=/context \
|
||||||
|
--mount=target=.,type=tmpfs <<EOT
|
||||||
|
set -e
|
||||||
|
rsync -a /context/. .
|
||||||
|
git add -A
|
||||||
|
rm -rf vendor
|
||||||
|
cp -rf /out/* .
|
||||||
|
./scripts/vendor validate
|
||||||
|
EOT
|
||||||
|
|
||||||
|
FROM psampaz/go-mod-outdated:${MODOUTDATED_VERSION} AS go-mod-outdated
|
||||||
|
FROM base AS outdated
|
||||||
|
ARG TIMESTAMP
|
||||||
|
RUN --mount=target=.,rw \
|
||||||
|
--mount=target=/go/pkg/mod,type=cache \
|
||||||
|
--mount=from=go-mod-outdated,source=/home/go-mod-outdated,target=/usr/bin/go-mod-outdated \
|
||||||
|
./scripts/vendor outdated
|
|
@ -3,5 +3,5 @@
|
||||||
package main
|
package main
|
||||||
|
|
||||||
// Not used, but required for generating other man pages.
|
// Not used, but required for generating other man pages.
|
||||||
// Import it here so that the package is included by vndr.
|
// Import it here so that the package is included by go modules.
|
||||||
import _ "github.com/cpuguy83/go-md2man/v2"
|
import _ "github.com/cpuguy83/go-md2man/v2"
|
||||||
|
|
|
@ -1,12 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
|
|
||||||
set -eu
|
|
||||||
|
|
||||||
WARN_MISS_VENDOR='WARNING: dependency is not vendored'
|
|
||||||
|
|
||||||
if grep -q "$WARN_MISS_VENDOR" "./vndr.log"; then
|
|
||||||
echo
|
|
||||||
echo "Some dependencies are not vendored."
|
|
||||||
echo
|
|
||||||
exit 1
|
|
||||||
fi
|
|
|
@ -1,17 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
|
|
||||||
set -eu
|
|
||||||
|
|
||||||
DIFF_PATH=$1
|
|
||||||
DIFF=$(git status --porcelain -- "$DIFF_PATH")
|
|
||||||
|
|
||||||
if [ "$DIFF" ]; then
|
|
||||||
echo
|
|
||||||
echo "These files were changed:"
|
|
||||||
echo
|
|
||||||
echo "$DIFF"
|
|
||||||
echo
|
|
||||||
exit 1
|
|
||||||
else
|
|
||||||
echo "$DIFF_PATH is correct"
|
|
||||||
fi;
|
|
|
@ -0,0 +1,60 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
set -eu
|
||||||
|
|
||||||
|
TYP=$1
|
||||||
|
|
||||||
|
usage() {
|
||||||
|
echo "usage: ./scripts/vendor <update|validate|outdated>"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
if [ -z "$TYP" ]; then
|
||||||
|
usage
|
||||||
|
fi
|
||||||
|
|
||||||
|
# create dummy go.mod, see comment in vendor.mod
|
||||||
|
cat > go.mod <<EOL
|
||||||
|
module github.com/docker/cli
|
||||||
|
|
||||||
|
go 1.16
|
||||||
|
EOL
|
||||||
|
|
||||||
|
update() {
|
||||||
|
(set -x ; go mod vendor -modfile=vendor.mod)
|
||||||
|
}
|
||||||
|
|
||||||
|
validate() {
|
||||||
|
(set -x ; go mod tidy -modfile=vendor.mod)
|
||||||
|
diff=$(git status --porcelain -- vendor.mod vendor.sum vendor)
|
||||||
|
if [ -n "$diff" ]; then
|
||||||
|
echo >&2 'ERROR: Vendor result differs. Please vendor your package with "make -f docker.Makefile vendor"'
|
||||||
|
echo "$diff"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
outdated() {
|
||||||
|
if [ ! -x "$(command -v go-mod-outdated)" ]; then
|
||||||
|
echo "go-mod-outdated not found. Install with 'go install github.com/psampaz/go-mod-outdated@v0.8.0'"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
(set -x ; go list -mod=vendor -mod=readonly -modfile=vendor.mod -u -m -json all | go-mod-outdated -update -direct)
|
||||||
|
}
|
||||||
|
|
||||||
|
case $TYP in
|
||||||
|
"update")
|
||||||
|
update
|
||||||
|
;;
|
||||||
|
"validate")
|
||||||
|
update
|
||||||
|
validate
|
||||||
|
;;
|
||||||
|
"outdated")
|
||||||
|
outdated
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo >&2 "Unknown type $TYP"
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
95
vendor.conf
95
vendor.conf
|
@ -1,95 +0,0 @@
|
||||||
cloud.google.com/go ceeb313ad77b789a7fa5287b36a1d127b69b7093 # v0.44.3
|
|
||||||
github.com/Azure/go-ansiterm d185dfc1b5a126116ea5a19e148e29d16b4574c9
|
|
||||||
github.com/beorn7/perks 37c8de3658fcb183f997c4e13e8337516ab753e6 # v1.0.1
|
|
||||||
github.com/cespare/xxhash/v2 d7df74196a9e781ede915320c11c378c1b2f3a1f # v2.1.1
|
|
||||||
github.com/containerd/console 2f1e3d2b6afd18e8b2077816c711205a0b4d8769 # v1.0.2
|
|
||||||
github.com/containerd/containerd 72cec4be58a9eb6b2910f5d10f1c01ca47d231c0 # v1.5.5
|
|
||||||
github.com/containerd/continuity bce1c3f9669b6f3e7f6656ee715b0b4d75fa64a6 # v0.1.0
|
|
||||||
github.com/containerd/typeurl 5e43fb8b75ed2f2305fc04e6918c8d10636771bc # v1.0.2
|
|
||||||
github.com/coreos/etcd 2c834459e1aab78a5d5219c7dfe42335fc4b617a # v3.3.25
|
|
||||||
github.com/cpuguy83/go-md2man/v2 b1ec32e02fe539480dc03e3bf381c20066e7c6cc # v2.0.1
|
|
||||||
github.com/creack/pty 2a38352e8b4d7ab6c336eef107e42a55e72e7fbc # v1.1.11
|
|
||||||
github.com/davecgh/go-spew 8991bc29aa16c548c550c7ff78260e27b9ab7c73 # v1.1.1
|
|
||||||
github.com/docker/compose-on-kubernetes 78e6a00beda64ac8ccb9fec787e601fe2ce0d5bb # v0.5.0-alpha1
|
|
||||||
github.com/docker/distribution 0d3efadf0154c2b8a4e7b6621fff9809655cc580
|
|
||||||
github.com/docker/docker 343665850e3a7ee160989b33b39477b6dd3f15cb # master (v21.xx-dev)
|
|
||||||
github.com/docker/docker-credential-helpers fc9290adbcf1594e78910e2f0334090eaee0e1ee # v0.6.4
|
|
||||||
github.com/docker/go d30aec9fd63c35133f8f79c3412ad91a3b08be06 # Contains a customized version of canonical/json and is used by Notary. The package is periodically rebased on current Go versions.
|
|
||||||
github.com/docker/go-connections 7395e3f8aa162843a74ed6d48e79627d9792ac55 # v0.4.0
|
|
||||||
github.com/docker/go-events e31b211e4f1cd09aa76fe4ac244571fab96ae47f
|
|
||||||
github.com/docker/go-metrics b619b3592b65de4f087d9f16863a7e6ff905973c # v0.0.1
|
|
||||||
github.com/docker/go-units 519db1ee28dcc9fd2474ae59fca29a810482bfb1 # v0.4.0
|
|
||||||
github.com/docker/swarmkit 3629f50980f6c0dd5ccd7dbfa0956b57ea0cd78d # master
|
|
||||||
github.com/evanphx/json-patch 72bf35d0ff611848c1dc9df0f976c81192392fa5 # v4.1.0
|
|
||||||
github.com/fvbommel/sortorder 26fad50c6b32a3064c09ed089865c16f2f3615f6 # v1.0.2
|
|
||||||
github.com/gofrs/flock 6caa7350c26b838538005fae7dbee4e69d9398db # v0.7.3
|
|
||||||
github.com/gogo/googleapis 01e0f9cca9b92166042241267ee2a5cdf5cff46c # v1.3.2
|
|
||||||
github.com/gogo/protobuf b03c65ea87cdc3521ede29f62fe3ce239267c1bc # v1.3.2
|
|
||||||
github.com/golang/glog 23def4e6c14b4da8ac2ed8007337bc5eb5007998
|
|
||||||
github.com/golang/protobuf ae97035608a719c7a1c1c41bed0ae0744bdb0c6f # v1.5.2
|
|
||||||
github.com/google/go-cmp 3af367b6b30c263d47e8895973edcca9a49cf029 # v0.2.0
|
|
||||||
github.com/google/gofuzz 24818f796faf91cd76ec7bddd72458fbced7a6c1
|
|
||||||
github.com/google/shlex e7afc7fbc51079733e9468cdfd1efcd7d196cd1d
|
|
||||||
github.com/googleapis/gnostic 7c663266750e7d82587642f65e60bc4083f1f84e # v0.2.0
|
|
||||||
github.com/gorilla/mux 98cb6bf42e086f6af920b965c38cacc07402d51b # v1.8.0
|
|
||||||
github.com/grpc-ecosystem/go-grpc-middleware 3c51f7f332123e8be5a157c0802a228ac85bf9db # v1.2.0
|
|
||||||
github.com/grpc-ecosystem/grpc-gateway 1a03ca3bad1e1ebadaedd3abb76bc58d4ac8143b
|
|
||||||
github.com/grpc-ecosystem/grpc-opentracing 8e809c8a86450a29b90dcc9efbf062d0fe6d9746
|
|
||||||
github.com/hashicorp/golang-lru 7f827b33c0f158ec5dfbba01bb0b14a4541fd81d # v0.5.3
|
|
||||||
github.com/imdario/mergo 29fb3d3bdc5512887f1dc9aedde6a0fed407fa8f # v0.3.12
|
|
||||||
github.com/inconshreveable/mousetrap 76626ae9c91c4f2a10f34cad8ce83ea42c93bb75 # v1.0.0
|
|
||||||
github.com/jaguilar/vt100 ad4c4a5743050fb7f88ce968dca9422f72a0e3f2 git://github.com/tonistiigi/vt100.git
|
|
||||||
github.com/json-iterator/go a1ca0830781e007c66b225121d2cdb3a649421f6 # v1.1.10
|
|
||||||
github.com/matttproud/golang_protobuf_extensions c12348ce28de40eed0136aa2b644d0ee0650e56c # v1.0.1
|
|
||||||
github.com/Microsoft/go-winio 5c2e05d71961716a6c392a06ada435aaf5d5302c # v0.4.19
|
|
||||||
github.com/miekg/pkcs11 210dc1e16747c5ba98a03bcbcf728c38086ea357 # v1.0.3
|
|
||||||
github.com/mitchellh/mapstructure d16e9488127408e67948eb43b6d3fbb9f222da10 # v1.3.2
|
|
||||||
github.com/moby/buildkit 9f254e18360a24c2ae47b26f772c3c89533bcbb7 # master / v0.9.0-dev
|
|
||||||
github.com/moby/sys 03b9f8d59a07f5206a2264105f4903a222aea964 # signal/v0.6.0 (latest tag, either mount/vXXX, mountinfo/vXXX, signal/vXXX, or symlink/vXXX)
|
|
||||||
github.com/moby/term 3f7ff695adc6a35abc925370dd0a4dafb48ec64d
|
|
||||||
github.com/modern-go/concurrent bacd9c7ef1dd9b15be4a9909b8ac7a4e313eec94 # 1.0.3
|
|
||||||
github.com/modern-go/reflect2 94122c33edd36123c84d5368cfb2b69df93a0ec8 # v1.0.1
|
|
||||||
github.com/morikuni/aec 39771216ff4c63d11f5e604076f9c45e8be1067b # v1.0.0
|
|
||||||
github.com/opencontainers/go-digest ea51bea511f75cfa3ef6098cc253c5c3609b037a # v1.0.0
|
|
||||||
github.com/opencontainers/image-spec d60099175f88c47cd379c4738d158884749ed235 # v1.0.1
|
|
||||||
github.com/opencontainers/runc 4144b63817ebcc5b358fc2c8ef95f7cddd709aa7 # v1.0.1
|
|
||||||
github.com/opentracing/opentracing-go d34af3eaa63c4d08ab54863a4bdd0daa45212e12 # v1.2.0
|
|
||||||
github.com/pkg/errors 614d223910a179a466c1767a985424175c39b465 # v0.9.1
|
|
||||||
github.com/prometheus/client_golang 6edbbd9e560190e318cdc5b4d3e630b442858380 # v1.6.0
|
|
||||||
github.com/prometheus/client_model 7bc5445566f0fe75b15de23e6b93886e982d7bf9 # v0.2.0
|
|
||||||
github.com/prometheus/common d978bcb1309602d68bb4ba69cf3f8ed900e07308 # v0.9.1
|
|
||||||
github.com/prometheus/procfs 46159f73e74d1cb8dc223deef9b2d049286f46b1 # v0.0.11
|
|
||||||
github.com/russross/blackfriday/v2 4c9bf9512682b995722660a4196c0013228e2049 # v2.1.0
|
|
||||||
github.com/sirupsen/logrus bdc0db8ead3853c56b7cd1ac2ba4e11b47d7da6b # v1.8.1
|
|
||||||
github.com/spf13/cobra 8380ddd3132bdf8fd77731725b550c181dda0aa8 # v1.1.3
|
|
||||||
github.com/spf13/pflag 2e9d26c8c37aae03e3f9d4e90b7116f5accb7cab # v1.0.5
|
|
||||||
github.com/theupdateframework/notary bf96a202a09a312ae005cd312fc06ff4d2c166ce # v0.7.0-21-gbf96a202
|
|
||||||
github.com/tonistiigi/fsutil d72af97c0eaf93c1d20360e3cb9c63c223675b83
|
|
||||||
github.com/tonistiigi/go-rosetta f79598599c5d34ea253b56a1d7c89bc6a96de7db
|
|
||||||
github.com/tonistiigi/units 6950e57a87eaf136bbe44ef2ec8e75b9e3569de2
|
|
||||||
github.com/xeipuuv/gojsonpointer 02993c407bfbf5f6dae44c4f4b1cf6a39b5fc5bb
|
|
||||||
github.com/xeipuuv/gojsonreference bd5ef7bd5415a7ac448318e64f11a24cd21e594b
|
|
||||||
github.com/xeipuuv/gojsonschema 82fcdeb203eb6ab2a67d0a623d9c19e5e5a64927 # v1.2.0
|
|
||||||
golang.org/x/crypto 0c34fe9e7dc2486962ef9867e3edb3503537209f
|
|
||||||
golang.org/x/net e18ecbb051101a46fc263334b127c89bc7bff7ea
|
|
||||||
golang.org/x/oauth2 bf48bf16ab8d622ce64ec6ce98d2c98f916b6303
|
|
||||||
golang.org/x/sync 036812b2e83c0ddf193dd5a34e034151da389d09
|
|
||||||
golang.org/x/sys 63515b42dcdf9544f4e6a02fd7632793fde2f72d
|
|
||||||
golang.org/x/term f5c789dd3221ff39d752ac54467d762de7cfbec6
|
|
||||||
golang.org/x/text 23ae387dee1f90d29a23c0e87ee0b46038fbed0e # v0.3.3
|
|
||||||
golang.org/x/time 3af7569d3a1e776fc2a3c1cec133b43105ea9c2e
|
|
||||||
google.golang.org/genproto 8816d57aaa9ad8cba31b2a8ecb6199c494bdf8b4 # v0.0.0-20201110150050-8816d57aaa9a
|
|
||||||
google.golang.org/grpc 0257c8657362b76f24e7a8cfb61df48d4cb735d3 # v1.38.0
|
|
||||||
google.golang.org/protobuf f2d1f6cbe10b90d22296ea09a7217081c2798009 # v1.26.0
|
|
||||||
gopkg.in/inf.v0 d2d2541c53f18d2a059457998ce2876cc8e67cbf # v0.9.1
|
|
||||||
gopkg.in/yaml.v2 53403b58ad1b561927d19068c655246f2db79d48 # v2.2.8
|
|
||||||
gotest.tools/v3 bb0d8a963040ea5048dcef1a14d8f8b58a33d4b3 # v3.0.2
|
|
||||||
k8s.io/api d49a3f108dab8e8d25f22c497fb48678b124efd2 # v0.16.9
|
|
||||||
k8s.io/apimachinery f336d9be0221d10a93a7d6d2ec25f6fc799f4fc6 # v0.16.9
|
|
||||||
k8s.io/client-go 002560d5bf54049bf5b5ae99231cb2b591f15954 # v0.16.9
|
|
||||||
k8s.io/klog 4ad0115ba9e45c096d06a31d8dfb0e5bd945ec5f # v1.0.0-2-g4ad0115 pending v1.0.1 release to fix https://github.com/docker/cli/issues/2420
|
|
||||||
k8s.io/kube-openapi 0270cf2f1c1d995d34b36019a6f65d58e6e33ad4
|
|
||||||
k8s.io/utils 69764acb6e8e900b7c05296c5d3c9c19545475f9
|
|
||||||
sigs.k8s.io/yaml fd68e9863619f6ec2fdd8625fe1f02e7c877e480 # v1.1.0
|
|
||||||
|
|
||||||
# DO NOT EDIT BELOW THIS LINE -------- reserved for downstream projects --------
|
|
|
@ -0,0 +1,94 @@
|
||||||
|
module github.com/docker/cli
|
||||||
|
|
||||||
|
// 'vendor.mod' enables use of 'go mod vendor' to managed 'vendor/' directory.
|
||||||
|
// There is no 'go.mod' file, as that would imply opting in for all the rules
|
||||||
|
// around SemVer, which this repo cannot abide by as it uses CalVer.
|
||||||
|
|
||||||
|
go 1.16
|
||||||
|
|
||||||
|
require (
|
||||||
|
github.com/Microsoft/go-winio v0.4.19 // indirect
|
||||||
|
github.com/containerd/console v1.0.2
|
||||||
|
github.com/containerd/containerd v1.5.5
|
||||||
|
github.com/coreos/etcd v3.3.25+incompatible // indirect
|
||||||
|
github.com/cpuguy83/go-md2man/v2 v2.0.1
|
||||||
|
github.com/creack/pty v1.1.11
|
||||||
|
github.com/docker/compose-on-kubernetes v0.5.0-test1
|
||||||
|
github.com/docker/distribution v2.7.1+incompatible
|
||||||
|
github.com/docker/docker v20.10.7+incompatible
|
||||||
|
github.com/docker/docker-credential-helpers v0.6.4
|
||||||
|
github.com/docker/go-connections v0.4.0
|
||||||
|
github.com/docker/go-units v0.4.0
|
||||||
|
github.com/docker/swarmkit v1.12.1-0.20210726173615-3629f50980f6
|
||||||
|
github.com/fvbommel/sortorder v1.0.2
|
||||||
|
github.com/gogo/protobuf v1.3.2
|
||||||
|
github.com/golang/protobuf v1.5.2 // indirect
|
||||||
|
github.com/google/go-cmp v0.5.5
|
||||||
|
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510
|
||||||
|
github.com/imdario/mergo v0.3.12
|
||||||
|
github.com/json-iterator/go v1.1.10 // indirect
|
||||||
|
github.com/mitchellh/mapstructure v1.3.2
|
||||||
|
github.com/moby/buildkit v0.8.2-0.20210615162540-9f254e18360a
|
||||||
|
github.com/moby/sys/signal v0.6.0
|
||||||
|
github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6
|
||||||
|
github.com/morikuni/aec v1.0.0
|
||||||
|
github.com/opencontainers/go-digest v1.0.0
|
||||||
|
github.com/opencontainers/image-spec v1.0.1
|
||||||
|
github.com/pkg/errors v0.9.1
|
||||||
|
github.com/sirupsen/logrus v1.8.1
|
||||||
|
github.com/spf13/cobra v1.1.3
|
||||||
|
github.com/spf13/pflag v1.0.5
|
||||||
|
github.com/theupdateframework/notary v0.7.1-0.20210315103452-bf96a202a09a
|
||||||
|
github.com/tonistiigi/fsutil v0.0.0-20210609172227-d72af97c0eaf
|
||||||
|
github.com/tonistiigi/go-rosetta v0.0.0-20200727161949-f79598599c5d
|
||||||
|
github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect
|
||||||
|
github.com/xeipuuv/gojsonschema v1.2.0
|
||||||
|
golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d // indirect
|
||||||
|
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c
|
||||||
|
golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359
|
||||||
|
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1
|
||||||
|
golang.org/x/text v0.3.4
|
||||||
|
google.golang.org/grpc v1.38.0 // indirect
|
||||||
|
gopkg.in/yaml.v2 v2.4.0
|
||||||
|
gotest.tools/v3 v3.0.3
|
||||||
|
k8s.io/api v0.20.6
|
||||||
|
k8s.io/apimachinery v0.20.6
|
||||||
|
k8s.io/client-go v0.20.6
|
||||||
|
k8s.io/klog v1.0.1-0.20200310124935-4ad0115ba9e4 // indirect
|
||||||
|
)
|
||||||
|
|
||||||
|
replace (
|
||||||
|
cloud.google.com/go => cloud.google.com/go v0.44.3
|
||||||
|
github.com/docker/distribution => github.com/docker/distribution v2.7.1-0.20190205005809-0d3efadf0154+incompatible
|
||||||
|
github.com/docker/docker => github.com/docker/docker v20.10.3-0.20210811141259-343665850e3a+incompatible // master (v21.xx-dev)
|
||||||
|
github.com/docker/go => github.com/docker/go v1.5.1-1.0.20160303222718-d30aec9fd63c // contains a customized version of canonical/json and is used by Notary. The package is periodically rebased on current Go versions.
|
||||||
|
github.com/evanphx/json-patch => gopkg.in/evanphx/json-patch.v4 v4.1.0
|
||||||
|
github.com/gogo/googleapis => github.com/gogo/googleapis v1.3.2
|
||||||
|
github.com/google/go-cmp => github.com/google/go-cmp v0.2.0
|
||||||
|
github.com/google/gofuzz => github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf
|
||||||
|
github.com/googleapis/gnostic => github.com/googleapis/gnostic v0.2.0
|
||||||
|
github.com/imdario/mergo => github.com/imdario/mergo v0.3.12
|
||||||
|
github.com/jaguilar/vt100 => github.com/tonistiigi/vt100 v0.0.0-20190402012908-ad4c4a574305
|
||||||
|
github.com/json-iterator/go => github.com/json-iterator/go v1.1.10
|
||||||
|
github.com/moby/buildkit => github.com/moby/buildkit v0.8.2-0.20210615162540-9f254e18360a // master (v0.9.0-dev)
|
||||||
|
github.com/moby/sys/mount => github.com/moby/sys/mount v0.3.0
|
||||||
|
github.com/moby/sys/mountinfo => github.com/moby/sys/mountinfo v0.5.0
|
||||||
|
github.com/moby/sys/symlink => github.com/moby/sys/symlink v0.2.0
|
||||||
|
github.com/prometheus/client_golang => github.com/prometheus/client_golang v1.6.0
|
||||||
|
github.com/prometheus/client_model => github.com/prometheus/client_model v0.2.0
|
||||||
|
github.com/prometheus/common => github.com/prometheus/common v0.9.1
|
||||||
|
github.com/prometheus/procfs => github.com/prometheus/procfs v0.0.11
|
||||||
|
github.com/theupdateframework/notary => github.com/theupdateframework/notary v0.7.1-0.20210315103452-bf96a202a09a
|
||||||
|
golang.org/x/sys => golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf
|
||||||
|
golang.org/x/term => golang.org/x/term v0.0.0-20201117132131-f5c789dd3221
|
||||||
|
golang.org/x/text => golang.org/x/text v0.3.3
|
||||||
|
gopkg.in/yaml.v2 => gopkg.in/yaml.v2 v2.2.8
|
||||||
|
gotest.tools/v3 => gotest.tools/v3 v3.0.2
|
||||||
|
k8s.io/api => k8s.io/api v0.16.9
|
||||||
|
k8s.io/apimachinery => k8s.io/apimachinery v0.16.9
|
||||||
|
k8s.io/client-go => k8s.io/client-go v0.16.9
|
||||||
|
k8s.io/klog => k8s.io/klog v1.0.1-0.20200310124935-4ad0115ba9e4 // v1.0.0-2-g4ad0115 pending v1.0.1 release to fix https://github.com/docker/cli/issues/2420
|
||||||
|
k8s.io/kube-openapi => k8s.io/kube-openapi v0.0.0-20190918143330-0270cf2f1c1d
|
||||||
|
k8s.io/utils => k8s.io/utils v0.0.0-20190923111123-69764acb6e8e
|
||||||
|
sigs.k8s.io/yaml => sigs.k8s.io/yaml v1.1.0
|
||||||
|
)
|
|
@ -0,0 +1,944 @@
|
||||||
|
bazil.org/fuse v0.0.0-20160811212531-371fbbdaa898/go.mod h1:Xbm+BRKSBEpa4q4hTSxohYNQpsxXPbPry4JJWOB3LB8=
|
||||||
|
cloud.google.com/go v0.44.3 h1:0sMegbmn/8uTwpNkB0q9cLEpZ2W5a6kl+wtBQgPWBJQ=
|
||||||
|
cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=
|
||||||
|
cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=
|
||||||
|
cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk=
|
||||||
|
cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=
|
||||||
|
dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
|
||||||
|
github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8=
|
||||||
|
github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8=
|
||||||
|
github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E=
|
||||||
|
github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI=
|
||||||
|
github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0=
|
||||||
|
github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA=
|
||||||
|
github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0=
|
||||||
|
github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0=
|
||||||
|
github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc=
|
||||||
|
github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk=
|
||||||
|
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/Microsoft/go-winio v0.4.11/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA=
|
||||||
|
github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA=
|
||||||
|
github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw=
|
||||||
|
github.com/Microsoft/go-winio v0.4.16-0.20201130162521-d1ffc52c7331/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0=
|
||||||
|
github.com/Microsoft/go-winio v0.4.16/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0=
|
||||||
|
github.com/Microsoft/go-winio v0.4.17-0.20210211115548-6eac466e5fa3/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84=
|
||||||
|
github.com/Microsoft/go-winio v0.4.17-0.20210324224401-5516f17a5958/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84=
|
||||||
|
github.com/Microsoft/go-winio v0.4.17/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84=
|
||||||
|
github.com/Microsoft/go-winio v0.4.19 h1:ZMZG0O5M8bhD0lgCURV8yu3hQ7TGvQ4L1ZW8+J0j9iE=
|
||||||
|
github.com/Microsoft/go-winio v0.4.19/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84=
|
||||||
|
github.com/Microsoft/hcsshim v0.8.6/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg=
|
||||||
|
github.com/Microsoft/hcsshim v0.8.7-0.20190325164909-8abdbb8205e4/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg=
|
||||||
|
github.com/Microsoft/hcsshim v0.8.7/go.mod h1:OHd7sQqRFrYd3RmSgbgji+ctCwkbq2wbEYNSzOYtcBQ=
|
||||||
|
github.com/Microsoft/hcsshim v0.8.9/go.mod h1:5692vkUqntj1idxauYlpoINNKeqCiG6Sg38RRsjT5y8=
|
||||||
|
github.com/Microsoft/hcsshim v0.8.14/go.mod h1:NtVKoYxQuTLx6gEq0L96c9Ju4JbRJ4nY2ow3VK6a9Lg=
|
||||||
|
github.com/Microsoft/hcsshim v0.8.15/go.mod h1:x38A4YbHbdxJtc0sF6oIz+RG0npwSCAvn69iY6URG00=
|
||||||
|
github.com/Microsoft/hcsshim v0.8.16/go.mod h1:o5/SZqmR7x9JNKsW3pu+nqHm0MF8vbA+VxGOoXdC600=
|
||||||
|
github.com/Microsoft/hcsshim v0.8.18 h1:cYnKADiM1869gvBpos3YCteeT6sZLB48lB5dmMMs8Tg=
|
||||||
|
github.com/Microsoft/hcsshim v0.8.18/go.mod h1:+w2gRZ5ReXQhFOrvSQeNfhrYB/dg3oDwTOcER2fw4I4=
|
||||||
|
github.com/Microsoft/hcsshim/test v0.0.0-20201218223536-d3e5debf77da/go.mod h1:5hlzMzRKMLyo42nCZ9oml8AdTlq/0cvIaBv6tK1RehU=
|
||||||
|
github.com/Microsoft/hcsshim/test v0.0.0-20210227013316-43a75bb4edd3/go.mod h1:mw7qgWloBUl75W/gVH3cQszUg1+gUITj7D6NY7ywVnY=
|
||||||
|
github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ=
|
||||||
|
github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
|
||||||
|
github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
|
||||||
|
github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE=
|
||||||
|
github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE=
|
||||||
|
github.com/Shopify/logrus-bugsnag v0.0.0-20170309145241-6dbc35f2c30d h1:hi6J4K6DKrR4/ljxn6SF6nURyu785wKMuQcjt7H3VCQ=
|
||||||
|
github.com/Shopify/logrus-bugsnag v0.0.0-20170309145241-6dbc35f2c30d/go.mod h1:HI8ITrYtUY+O+ZhtlqUnD8+KwNPOyugEhfP9fdUIaEQ=
|
||||||
|
github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
|
||||||
|
github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
|
||||||
|
github.com/alexflint/go-filemutex v0.0.0-20171022225611-72bdc8eae2ae/go.mod h1:CgnQgUtFrFz9mxFNtED3jI5tLDjKlOM+oUF/sTk6ps0=
|
||||||
|
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/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=
|
||||||
|
github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
|
||||||
|
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
|
||||||
|
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
|
||||||
|
github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
|
||||||
|
github.com/bitly/go-hostpool v0.1.0/go.mod h1:4gOCgp6+NZnVqlKyZ/iBZFTAJKembaVENUpMkpg42fw=
|
||||||
|
github.com/bitly/go-simplejson v0.5.0/go.mod h1:cXHtHw4XUPsvGaxgjIAn8PhEWG9NfngEKAMDJEczWVA=
|
||||||
|
github.com/bits-and-blooms/bitset v1.2.0 h1:Kn4yilvwNtMACtf1eYDlG8H77R07mZSPbMjLyS07ChA=
|
||||||
|
github.com/bits-and-blooms/bitset v1.2.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA=
|
||||||
|
github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84=
|
||||||
|
github.com/blang/semver v3.1.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk=
|
||||||
|
github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk=
|
||||||
|
github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4=
|
||||||
|
github.com/buger/jsonparser v0.0.0-20180808090653-f4dd9f5a6b44/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s=
|
||||||
|
github.com/bugsnag/bugsnag-go v1.0.5 h1:NIoY2u+am1/GRgUZa+ata8UUrRBuCK4pLq0/lcvMF7M=
|
||||||
|
github.com/bugsnag/bugsnag-go v1.0.5/go.mod h1:2oa8nejYd4cQ/b0hMIopN0lCRxU0bueqREvZLWFrtK8=
|
||||||
|
github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b h1:otBG+dV+YK+Soembjv71DPz3uX/V/6MMlSyD9JBQ6kQ=
|
||||||
|
github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b/go.mod h1:obH5gd0BsqsP2LwDJ9aOkm/6J86V6lyAXCoQWGw3K50=
|
||||||
|
github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0 h1:nvj0OLI3YqYXer/kZD8Ri1aaunCxIEsOst1BVJswV0o=
|
||||||
|
github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0/go.mod h1:D/8v3kj0zr8ZAKg1AQ6crr+5VwKN5eIywRkfhyM/+dE=
|
||||||
|
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
|
||||||
|
github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY=
|
||||||
|
github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
|
||||||
|
github.com/checkpoint-restore/go-criu/v4 v4.1.0/go.mod h1:xUQBLp4RLc5zJtWY++yjOoMoB5lihDt7fai+75m+rGw=
|
||||||
|
github.com/checkpoint-restore/go-criu/v5 v5.0.0/go.mod h1:cfwC0EG7HMUenopBsUf9d89JlCLQIfgVcNsNN0t6T2M=
|
||||||
|
github.com/cilium/ebpf v0.0.0-20200110133405-4032b1d8aae3/go.mod h1:MA5e5Lr8slmEg9bt0VpxxWqJlO4iwu3FBdHUzV7wQVg=
|
||||||
|
github.com/cilium/ebpf v0.0.0-20200702112145-1c8d4c9ef775/go.mod h1:7cR51M8ViRLIdUjrmSXlK9pkrsDlLHbO8jiB8X8JnOc=
|
||||||
|
github.com/cilium/ebpf v0.2.0/go.mod h1:To2CFviqOWL/M0gIMsvSMlqe7em/l1ALkX1PyjrX2Qs=
|
||||||
|
github.com/cilium/ebpf v0.4.0/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs=
|
||||||
|
github.com/cilium/ebpf v0.6.2/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs=
|
||||||
|
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
|
||||||
|
github.com/cloudflare/cfssl v0.0.0-20180223231731-4e2dcbde5004 h1:lkAMpLVBDaj17e85keuznYcH5rqI438v41pKcBl4ZxQ=
|
||||||
|
github.com/cloudflare/cfssl v0.0.0-20180223231731-4e2dcbde5004/go.mod h1:yMWuSON2oQp+43nFtAV/uvKQIFpSPerB57DCt9t8sSA=
|
||||||
|
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
|
||||||
|
github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
|
||||||
|
github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8=
|
||||||
|
github.com/codahale/hdrhistogram v0.0.0-20160425231609-f8ad88b59a58/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI=
|
||||||
|
github.com/containerd/aufs v0.0.0-20200908144142-dab0cbea06f4/go.mod h1:nukgQABAEopAHvB6j7cnP5zJ+/3aVcE7hCYqvIwAHyE=
|
||||||
|
github.com/containerd/aufs v0.0.0-20201003224125-76a6863f2989/go.mod h1:AkGGQs9NM2vtYHaUen+NljV0/baGCAPELGm2q9ZXpWU=
|
||||||
|
github.com/containerd/aufs v0.0.0-20210316121734-20793ff83c97/go.mod h1:kL5kd6KM5TzQjR79jljyi4olc1Vrx6XBlcyj3gNv2PU=
|
||||||
|
github.com/containerd/aufs v1.0.0/go.mod h1:kL5kd6KM5TzQjR79jljyi4olc1Vrx6XBlcyj3gNv2PU=
|
||||||
|
github.com/containerd/btrfs v0.0.0-20201111183144-404b9149801e/go.mod h1:jg2QkJcsabfHugurUvvPhS3E08Oxiuh5W/g1ybB4e0E=
|
||||||
|
github.com/containerd/btrfs v0.0.0-20210316141732-918d888fb676/go.mod h1:zMcX3qkXTAi9GI50+0HOeuV8LU2ryCE/V2vG/ZBiTss=
|
||||||
|
github.com/containerd/btrfs v1.0.0/go.mod h1:zMcX3qkXTAi9GI50+0HOeuV8LU2ryCE/V2vG/ZBiTss=
|
||||||
|
github.com/containerd/cgroups v0.0.0-20190717030353-c4b9ac5c7601/go.mod h1:X9rLEHIqSf/wfK8NsPqxJmeZgW4pcfzdXITDrUSJ6uI=
|
||||||
|
github.com/containerd/cgroups v0.0.0-20190919134610-bf292b21730f/go.mod h1:OApqhQ4XNSNC13gXIwDjhOQxjWa/NxkwZXJ1EvqT0ko=
|
||||||
|
github.com/containerd/cgroups v0.0.0-20200531161412-0dbf7f05ba59/go.mod h1:pA0z1pT8KYB3TCXK/ocprsh7MAkoW8bZVzPdih9snmM=
|
||||||
|
github.com/containerd/cgroups v0.0.0-20200710171044-318312a37340/go.mod h1:s5q4SojHctfxANBDvMeIaIovkq29IP48TKAxnhYRxvo=
|
||||||
|
github.com/containerd/cgroups v0.0.0-20200824123100-0b889c03f102/go.mod h1:s5q4SojHctfxANBDvMeIaIovkq29IP48TKAxnhYRxvo=
|
||||||
|
github.com/containerd/cgroups v0.0.0-20210114181951-8a68de567b68/go.mod h1:ZJeTFisyysqgcCdecO57Dj79RfL0LNeGiFUqLYQRYLE=
|
||||||
|
github.com/containerd/cgroups v1.0.1 h1:iJnMvco9XGvKUvNQkv88bE4uJXxRQH18efbKo9w5vHQ=
|
||||||
|
github.com/containerd/cgroups v1.0.1/go.mod h1:0SJrPIenamHDcZhEcJMNBB85rHcUsw4f25ZfBiPYRkU=
|
||||||
|
github.com/containerd/console v0.0.0-20180822173158-c12b1e7919c1/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw=
|
||||||
|
github.com/containerd/console v0.0.0-20181022165439-0650fd9eeb50/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw=
|
||||||
|
github.com/containerd/console v0.0.0-20191206165004-02ecf6a7291e/go.mod h1:8Pf4gM6VEbTNRIT26AyyU7hxdQU3MvAvxVI0sc00XBE=
|
||||||
|
github.com/containerd/console v1.0.1/go.mod h1:XUsP6YE/mKtz6bxc+I8UiKKTP04qjQL4qcS3XoQ5xkw=
|
||||||
|
github.com/containerd/console v1.0.2 h1:Pi6D+aZXM+oUw1czuKgH5IJ+y0jhYcwBJfx5/Ghn9dE=
|
||||||
|
github.com/containerd/console v1.0.2/go.mod h1:ytZPjGgY2oeTkAONYafi2kSj0aYggsf8acV1PGKCbzQ=
|
||||||
|
github.com/containerd/containerd v1.2.10/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA=
|
||||||
|
github.com/containerd/containerd v1.3.0-beta.2.0.20190828155532-0293cbd26c69/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA=
|
||||||
|
github.com/containerd/containerd v1.3.0/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA=
|
||||||
|
github.com/containerd/containerd v1.3.1-0.20191213020239-082f7e3aed57/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA=
|
||||||
|
github.com/containerd/containerd v1.3.2/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA=
|
||||||
|
github.com/containerd/containerd v1.4.0-beta.2.0.20200729163537-40b22ef07410/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA=
|
||||||
|
github.com/containerd/containerd v1.4.1/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA=
|
||||||
|
github.com/containerd/containerd v1.4.3/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA=
|
||||||
|
github.com/containerd/containerd v1.5.0-beta.1/go.mod h1:5HfvG1V2FsKesEGQ17k5/T7V960Tmcumvqn8Mc+pCYQ=
|
||||||
|
github.com/containerd/containerd v1.5.0-beta.3/go.mod h1:/wr9AVtEM7x9c+n0+stptlo/uBBoBORwEx6ardVcmKU=
|
||||||
|
github.com/containerd/containerd v1.5.0-beta.4/go.mod h1:GmdgZd2zA2GYIBZ0w09ZvgqEq8EfBp/m3lcVZIvPHhI=
|
||||||
|
github.com/containerd/containerd v1.5.0-rc.0/go.mod h1:V/IXoMqNGgBlabz3tHD2TWDoTJseu1FGOKuoA4nNb2s=
|
||||||
|
github.com/containerd/containerd v1.5.1/go.mod h1:0DOxVqwDy2iZvrZp2JUx/E+hS0UNTVn7dJnIOwtYR4g=
|
||||||
|
github.com/containerd/containerd v1.5.2/go.mod h1:0DOxVqwDy2iZvrZp2JUx/E+hS0UNTVn7dJnIOwtYR4g=
|
||||||
|
github.com/containerd/containerd v1.5.5 h1:q1gxsZsGZ8ddVe98yO6pR21b5xQSMiR61lD0W96pgQo=
|
||||||
|
github.com/containerd/containerd v1.5.5/go.mod h1:oSTh0QpT1w6jYcGmbiSbxv9OSQYaa88mPyWIuU79zyo=
|
||||||
|
github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y=
|
||||||
|
github.com/containerd/continuity v0.0.0-20190815185530-f2a389ac0a02/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y=
|
||||||
|
github.com/containerd/continuity v0.0.0-20191127005431-f65d91d395eb/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y=
|
||||||
|
github.com/containerd/continuity v0.0.0-20200710164510-efbc4488d8fe/go.mod h1:cECdGN1O8G9bgKTlLhuPJimka6Xb/Gg7vYzCTNVxhvo=
|
||||||
|
github.com/containerd/continuity v0.0.0-20201208142359-180525291bb7/go.mod h1:kR3BEg7bDFaEddKm54WSmrol1fKWDU1nKYkgrcgZT7Y=
|
||||||
|
github.com/containerd/continuity v0.0.0-20210208174643-50096c924a4e/go.mod h1:EXlVlkqNba9rJe3j7w3Xa924itAMLgZH4UD/Q4PExuQ=
|
||||||
|
github.com/containerd/continuity v0.1.0 h1:UFRRY5JemiAhPZrr/uE0n8fMTLcZsUvySPr1+D7pgr8=
|
||||||
|
github.com/containerd/continuity v0.1.0/go.mod h1:ICJu0PwR54nI0yPEnJ6jcS+J7CZAUXrLh8lPo2knzsM=
|
||||||
|
github.com/containerd/fifo v0.0.0-20180307165137-3d5202aec260/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI=
|
||||||
|
github.com/containerd/fifo v0.0.0-20190226154929-a9fb20d87448/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI=
|
||||||
|
github.com/containerd/fifo v0.0.0-20200410184934-f15a3290365b/go.mod h1:jPQ2IAeZRCYxpS/Cm1495vGFww6ecHmMk1YJH2Q5ln0=
|
||||||
|
github.com/containerd/fifo v0.0.0-20201026212402-0724c46b320c/go.mod h1:jPQ2IAeZRCYxpS/Cm1495vGFww6ecHmMk1YJH2Q5ln0=
|
||||||
|
github.com/containerd/fifo v0.0.0-20210316144830-115abcc95a1d/go.mod h1:ocF/ME1SX5b1AOlWi9r677YJmCPSwwWnQ9O123vzpE4=
|
||||||
|
github.com/containerd/fifo v1.0.0 h1:6PirWBr9/L7GDamKr+XM0IeUFXu5mf3M/BPpH9gaLBU=
|
||||||
|
github.com/containerd/fifo v1.0.0/go.mod h1:ocF/ME1SX5b1AOlWi9r677YJmCPSwwWnQ9O123vzpE4=
|
||||||
|
github.com/containerd/fuse-overlayfs-snapshotter v1.0.2/go.mod h1:nRZceC8a7dRm3Ao6cJAwuJWPFiBPaibHiFntRUnzhwU=
|
||||||
|
github.com/containerd/go-cni v1.0.1/go.mod h1:+vUpYxKvAF72G9i1WoDOiPGRtQpqsNW/ZHtSlv++smU=
|
||||||
|
github.com/containerd/go-cni v1.0.2/go.mod h1:nrNABBHzu0ZwCug9Ije8hL2xBCYh/pjfMb1aZGrrohk=
|
||||||
|
github.com/containerd/go-runc v0.0.0-20180907222934-5a6d9f37cfa3/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0=
|
||||||
|
github.com/containerd/go-runc v0.0.0-20190911050354-e029b79d8cda/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0=
|
||||||
|
github.com/containerd/go-runc v0.0.0-20200220073739-7016d3ce2328/go.mod h1:PpyHrqVs8FTi9vpyHwPwiNEGaACDxT/N/pLcvMSRA9g=
|
||||||
|
github.com/containerd/go-runc v0.0.0-20201020171139-16b287bc67d0/go.mod h1:cNU0ZbCgCQVZK4lgG3P+9tn9/PaJNmoDXPpoJhDR+Ok=
|
||||||
|
github.com/containerd/go-runc v1.0.0/go.mod h1:cNU0ZbCgCQVZK4lgG3P+9tn9/PaJNmoDXPpoJhDR+Ok=
|
||||||
|
github.com/containerd/imgcrypt v1.0.1/go.mod h1:mdd8cEPW7TPgNG4FpuP3sGBiQ7Yi/zak9TYCG3juvb0=
|
||||||
|
github.com/containerd/imgcrypt v1.0.4-0.20210301171431-0ae5c75f59ba/go.mod h1:6TNsg0ctmizkrOgXRNQjAPFWpMYRWuiB6dSF4Pfa5SA=
|
||||||
|
github.com/containerd/imgcrypt v1.1.1-0.20210312161619-7ed62a527887/go.mod h1:5AZJNI6sLHJljKuI9IHnw1pWqo/F0nGDOuR9zgTs7ow=
|
||||||
|
github.com/containerd/imgcrypt v1.1.1/go.mod h1:xpLnwiQmEUJPvQoAapeb2SNCxz7Xr6PJrXQb0Dpc4ms=
|
||||||
|
github.com/containerd/nri v0.0.0-20201007170849-eb1350a75164/go.mod h1:+2wGSDGFYfE5+So4M5syatU0N0f0LbWpuqyMi4/BE8c=
|
||||||
|
github.com/containerd/nri v0.0.0-20210316161719-dbaa18c31c14/go.mod h1:lmxnXF6oMkbqs39FiCt1s0R2HSMhcLel9vNL3m4AaeY=
|
||||||
|
github.com/containerd/nri v0.1.0/go.mod h1:lmxnXF6oMkbqs39FiCt1s0R2HSMhcLel9vNL3m4AaeY=
|
||||||
|
github.com/containerd/stargz-snapshotter v0.6.4/go.mod h1:1t0SF1gAHJhCSftWKDLVitvfF3c2qhL5hymG7C50wto=
|
||||||
|
github.com/containerd/stargz-snapshotter/estargz v0.6.4/go.mod h1:83VWDqHnurTKliEB0YvWMiCfLDwv4Cjj1X9Vk98GJZw=
|
||||||
|
github.com/containerd/ttrpc v0.0.0-20190828154514-0e0f228740de/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o=
|
||||||
|
github.com/containerd/ttrpc v0.0.0-20190828172938-92c8520ef9f8/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o=
|
||||||
|
github.com/containerd/ttrpc v0.0.0-20191028202541-4f1b8fe65a5c/go.mod h1:LPm1u0xBw8r8NOKoOdNMeVHSawSsltak+Ihv+etqsE8=
|
||||||
|
github.com/containerd/ttrpc v1.0.1/go.mod h1:UAxOpgT9ziI0gJrmKvgcZivgxOp8iFPSk8httJEt98Y=
|
||||||
|
github.com/containerd/ttrpc v1.0.2 h1:2/O3oTZN36q2xRolk0a2WWGgh7/Vf/liElg5hFYLX9U=
|
||||||
|
github.com/containerd/ttrpc v1.0.2/go.mod h1:UAxOpgT9ziI0gJrmKvgcZivgxOp8iFPSk8httJEt98Y=
|
||||||
|
github.com/containerd/typeurl v0.0.0-20180627222232-a93fcdb778cd/go.mod h1:Cm3kwCdlkCfMSHURc+r6fwoGH6/F1hH3S4sg0rLFWPc=
|
||||||
|
github.com/containerd/typeurl v0.0.0-20190911142611-5eb25027c9fd/go.mod h1:GeKYzf2pQcqv7tJ0AoCuuhtnqhva5LNU3U+OyKxxJpk=
|
||||||
|
github.com/containerd/typeurl v1.0.1/go.mod h1:TB1hUtrpaiO88KEK56ijojHS1+NeF0izUACaJW2mdXg=
|
||||||
|
github.com/containerd/typeurl v1.0.2 h1:Chlt8zIieDbzQFzXzAeBEF92KhExuE4p9p92/QmY7aY=
|
||||||
|
github.com/containerd/typeurl v1.0.2/go.mod h1:9trJWW2sRlGub4wZJRTW83VtbOLS6hwcDZXTn6oPz9s=
|
||||||
|
github.com/containerd/zfs v0.0.0-20200918131355-0a33824f23a2/go.mod h1:8IgZOBdv8fAgXddBT4dBXJPtxyRsejFIpXoklgxgEjw=
|
||||||
|
github.com/containerd/zfs v0.0.0-20210301145711-11e8f1707f62/go.mod h1:A9zfAbMlQwE+/is6hi0Xw8ktpL+6glmqZYtevJgaB8Y=
|
||||||
|
github.com/containerd/zfs v0.0.0-20210315114300-dde8f0fda960/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY=
|
||||||
|
github.com/containerd/zfs v0.0.0-20210324211415-d5c4544f0433/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY=
|
||||||
|
github.com/containerd/zfs v1.0.0/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY=
|
||||||
|
github.com/containernetworking/cni v0.7.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY=
|
||||||
|
github.com/containernetworking/cni v0.8.0/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY=
|
||||||
|
github.com/containernetworking/cni v0.8.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY=
|
||||||
|
github.com/containernetworking/plugins v0.8.6/go.mod h1:qnw5mN19D8fIwkqW7oHHYDHVlzhJpcY6TQxn/fUyDDM=
|
||||||
|
github.com/containernetworking/plugins v0.9.1/go.mod h1:xP/idU2ldlzN6m4p5LmGiwRDjeJr6FLK6vuiUwoH7P8=
|
||||||
|
github.com/containers/ocicrypt v1.0.1/go.mod h1:MeJDzk1RJHv89LjsH0Sp5KTY3ZYkjXO/C+bKAeWFIrc=
|
||||||
|
github.com/containers/ocicrypt v1.1.0/go.mod h1:b8AOe0YR67uU8OqfVNcznfFpAzu3rdgUV4GP9qXPfu4=
|
||||||
|
github.com/containers/ocicrypt v1.1.1/go.mod h1:Dm55fwWm1YZAjYRaJ94z2mfZikIyIN4B0oB3dj3jFxY=
|
||||||
|
github.com/coreos/bbolt v1.3.2/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/etcd v3.3.25+incompatible h1:0GQEw6h3YnuOVdtwygkIfJ+Omx0tZ8/QkVyXI4LkbeY=
|
||||||
|
github.com/coreos/etcd v3.3.25+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
|
||||||
|
github.com/coreos/go-iptables v0.4.5/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU=
|
||||||
|
github.com/coreos/go-iptables v0.5.0/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU=
|
||||||
|
github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc=
|
||||||
|
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-20161114122254-48702e0da86b/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
|
||||||
|
github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
|
||||||
|
github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
|
||||||
|
github.com/coreos/go-systemd/v22 v22.0.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk=
|
||||||
|
github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk=
|
||||||
|
github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
|
||||||
|
github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
|
||||||
|
github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
|
||||||
|
github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
|
||||||
|
github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
|
||||||
|
github.com/cpuguy83/go-md2man/v2 v2.0.1 h1:r/myEWzV9lfsM1tFLgDyu0atFtJ1fXn261LKYj/3DxU=
|
||||||
|
github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
|
||||||
|
github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY=
|
||||||
|
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
|
||||||
|
github.com/creack/pty v1.1.11 h1:07n33Z8lZxZ2qwegKbObQohDhXDQxiMMz1NOUGYlesw=
|
||||||
|
github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
|
||||||
|
github.com/cyphar/filepath-securejoin v0.2.2/go.mod h1:FpkQEhXnPnOthhzymB7CGsFk2G9VLXONKD9G7QGMM+4=
|
||||||
|
github.com/d2g/dhcp4 v0.0.0-20170904100407-a1d1b6c41b1c/go.mod h1:Ct2BUK8SB0YC1SMSibvLzxjeJLnrYEVLULFNiHY9YfQ=
|
||||||
|
github.com/d2g/dhcp4client v1.0.0/go.mod h1:j0hNfjhrt2SxUOw55nL0ATM/z4Yt3t2Kd1mW34z5W5s=
|
||||||
|
github.com/d2g/dhcp4server v0.0.0-20181031114812-7d4a0a7f59a5/go.mod h1:Eo87+Kg/IX2hfWJfwxMzLyuSZyxSoAug2nGa1G2QAi8=
|
||||||
|
github.com/d2g/hardwareaddr v0.0.0-20190221164911-e7d9fbe030e4/go.mod h1:bMl4RjIciD2oAxI7DmWRx6gbeqrkoLqv3MV0vzNad+I=
|
||||||
|
github.com/danieljoos/wincred v1.1.0/go.mod h1:XYlo+eRTsVA9aHGp7NGjFkPla4m+DCL7hqDjlFjiygg=
|
||||||
|
github.com/davecgh/go-spew v0.0.0-20151105211317-5215b55f46b2/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
|
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/denisenkom/go-mssqldb v0.0.0-20191128021309-1d7a30a10f73/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU=
|
||||||
|
github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
|
||||||
|
github.com/docker/cli v20.10.6+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8=
|
||||||
|
github.com/docker/cli v20.10.7+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8=
|
||||||
|
github.com/docker/compose-on-kubernetes v0.5.0-test1 h1:VBI6lGDImDen7Cf8bbGbqKhoxlrR5ThYSHGCCW4S49E=
|
||||||
|
github.com/docker/compose-on-kubernetes v0.5.0-test1/go.mod h1:iT2pYfi580XlpaV4KmK0T6+4/9+XoKmk/fhoDod1emE=
|
||||||
|
github.com/docker/distribution v2.7.1-0.20190205005809-0d3efadf0154+incompatible h1:dvc1KSkIYTVjZgHf/CTC2diTYC8PzhaA5sFISRfNVrE=
|
||||||
|
github.com/docker/distribution v2.7.1-0.20190205005809-0d3efadf0154+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w=
|
||||||
|
github.com/docker/docker v20.10.3-0.20210811141259-343665850e3a+incompatible h1:u4VL5McCDGrakMyJTrk6IRPk1A4NtmfJt07ARS3DXs0=
|
||||||
|
github.com/docker/docker v20.10.3-0.20210811141259-343665850e3a+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
|
||||||
|
github.com/docker/docker-credential-helpers v0.6.3/go.mod h1:WRaJzqw3CTB9bk10avuGsjVBZsD05qeibJ1/TYlvc0Y=
|
||||||
|
github.com/docker/docker-credential-helpers v0.6.4 h1:axCks+yV+2MR3/kZhAmy07yC56WZ2Pwu/fKWtKuZB0o=
|
||||||
|
github.com/docker/docker-credential-helpers v0.6.4/go.mod h1:ofX3UI0Gz1TteYBjtgs07O36Pyasyp66D2uKT7H8W1c=
|
||||||
|
github.com/docker/go v1.5.1-1.0.20160303222718-d30aec9fd63c h1:lzqkGL9b3znc+ZUgi7FlLnqjQhcXxkNM/quxIjBVMD0=
|
||||||
|
github.com/docker/go v1.5.1-1.0.20160303222718-d30aec9fd63c/go.mod h1:CADgU4DSXK5QUlFslkQu2yW2TKzFZcXq/leZfM0UH5Q=
|
||||||
|
github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ=
|
||||||
|
github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec=
|
||||||
|
github.com/docker/go-events v0.0.0-20170721190031-9461782956ad/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA=
|
||||||
|
github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c h1:+pKlWGMw7gf6bQ+oDZB4KHQFypsfjYlq/C4rfL7D3g8=
|
||||||
|
github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA=
|
||||||
|
github.com/docker/go-metrics v0.0.0-20180209012529-399ea8c73916/go.mod h1:/u0gXw0Gay3ceNrsHubL3BtdOL2fHf93USgMTe0W5dI=
|
||||||
|
github.com/docker/go-metrics v0.0.1 h1:AgB/0SvBxihN0X8OR4SjsblXkbMvalQ8cjmtKQ2rQV8=
|
||||||
|
github.com/docker/go-metrics v0.0.1/go.mod h1:cG1hvH2utMXtqgqqYE9plW6lDxS3/5ayHzueweSI3Vw=
|
||||||
|
github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw=
|
||||||
|
github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
|
||||||
|
github.com/docker/libtrust v0.0.0-20160708172513-aabc10ec26b7 h1:UhxFibDNY/bfvqU5CAUmr9zpesgbU6SWc8/B4mflAE4=
|
||||||
|
github.com/docker/libtrust v0.0.0-20160708172513-aabc10ec26b7/go.mod h1:cyGadeNEkKy96OOhEzfZl+yxihPEzKnqJwvfuSUqbZE=
|
||||||
|
github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM=
|
||||||
|
github.com/docker/swarmkit v1.12.1-0.20210726173615-3629f50980f6 h1:mFQcXSzzNXVKAnl0KltjSQ7rbgipTYcXJns4sucurKA=
|
||||||
|
github.com/docker/swarmkit v1.12.1-0.20210726173615-3629f50980f6/go.mod h1:n3Z4lIEl7g261ptkGDBcYi/3qBMDl9csaAhwi2MPejs=
|
||||||
|
github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
|
||||||
|
github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
|
||||||
|
github.com/dvsekhvalnov/jose2go v0.0.0-20170216131308-f21a8cedbbae/go.mod h1:7BvyPhdbLxMXIYTFPLsyJRFMsKmOZnQmzh6Gb+uquuM=
|
||||||
|
github.com/elazarl/goproxy v0.0.0-20170405201442-c4fc26588b6e/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc=
|
||||||
|
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/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
|
||||||
|
github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
|
||||||
|
github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
|
||||||
|
github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
|
||||||
|
github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
|
||||||
|
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
|
||||||
|
github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5/go.mod h1:a2zkGnVExMxdzMo3M0Hi/3sEU+cWnZpSni0O6/Yb/P0=
|
||||||
|
github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
|
||||||
|
github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k=
|
||||||
|
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
|
||||||
|
github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4=
|
||||||
|
github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
|
||||||
|
github.com/fullsailor/pkcs7 v0.0.0-20190404230743-d7302db945fa/go.mod h1:KnogPXtdwXqoenmZCw6S+25EAm2MkxbG0deNDu4cbSA=
|
||||||
|
github.com/fvbommel/sortorder v1.0.2 h1:mV4o8B2hKboCdkJm+a7uX/SIpZob4JzUpc5GGnM45eo=
|
||||||
|
github.com/fvbommel/sortorder v1.0.2/go.mod h1:uk88iVf1ovNn1iLfgUVU2F9o5eO30ui720w+kxuqRs0=
|
||||||
|
github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
|
||||||
|
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
|
||||||
|
github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
|
||||||
|
github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
|
||||||
|
github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
|
||||||
|
github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas=
|
||||||
|
github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU=
|
||||||
|
github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0=
|
||||||
|
github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg=
|
||||||
|
github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=
|
||||||
|
github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg=
|
||||||
|
github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc=
|
||||||
|
github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc=
|
||||||
|
github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo=
|
||||||
|
github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I=
|
||||||
|
github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=
|
||||||
|
github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=
|
||||||
|
github.com/go-sql-driver/mysql v1.5.0 h1:ozyZYNQW3x3HtqT1jira07DN2PArx2v7/mN66gGcHOs=
|
||||||
|
github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
|
||||||
|
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
|
||||||
|
github.com/godbus/dbus v0.0.0-20151105175453-c7fdd8b5cd55/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw=
|
||||||
|
github.com/godbus/dbus v0.0.0-20180201030542-885f9cc04c9c/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw=
|
||||||
|
github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4=
|
||||||
|
github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
|
||||||
|
github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
|
||||||
|
github.com/gofrs/flock v0.7.3 h1:I0EKY9l8HZCXTMYC4F80vwT6KNypV9uYKP3Alm/hjmQ=
|
||||||
|
github.com/gofrs/flock v0.7.3/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU=
|
||||||
|
github.com/gogo/googleapis v1.3.2 h1:kX1es4djPJrsDhY7aZKJy7aZasdcB5oSOEphMjSB53c=
|
||||||
|
github.com/gogo/googleapis v1.3.2/go.mod h1:5YRNX2z1oM5gXdAkurHa942MDgEJyk02w4OecKY87+c=
|
||||||
|
github.com/gogo/protobuf v1.0.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
|
||||||
|
github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4=
|
||||||
|
github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o=
|
||||||
|
github.com/gogo/protobuf v1.3.0/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o=
|
||||||
|
github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o=
|
||||||
|
github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
|
||||||
|
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
|
||||||
|
github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0=
|
||||||
|
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/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
||||||
|
github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
||||||
|
github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
||||||
|
github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e h1:1r7pUrabqp18hOBcwBwiTsbnFeTZHV9eER/QT5JVZxY=
|
||||||
|
github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
||||||
|
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
|
||||||
|
github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=
|
||||||
|
github.com/golang/protobuf v0.0.0-20161109072736-4bd1920723d7/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||||
|
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||||
|
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||||
|
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||||
|
github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
|
||||||
|
github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
|
||||||
|
github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=
|
||||||
|
github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
|
||||||
|
github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
|
||||||
|
github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
|
||||||
|
github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
|
||||||
|
github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
|
||||||
|
github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
|
||||||
|
github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
|
||||||
|
github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
|
||||||
|
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
|
||||||
|
github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=
|
||||||
|
github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
|
||||||
|
github.com/golang/snappy v0.0.3 h1:fHPg5GQYlCeLIPB9BZqMVR5nR9A+IM5zcgeTdjMYmLA=
|
||||||
|
github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
|
||||||
|
github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
|
||||||
|
github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
|
||||||
|
github.com/google/certificate-transparency-go v1.0.10-0.20180222191210-5ab67e519c93 h1:jc2UWq7CbdszqeH6qu1ougXMIUBfSy8Pbh/anURYbGI=
|
||||||
|
github.com/google/certificate-transparency-go v1.0.10-0.20180222191210-5ab67e519c93/go.mod h1:QeJfpSbVSfYc7RgB3gJFj9cbuQMMchQxrWXz8Ruopmg=
|
||||||
|
github.com/google/go-cmp v0.2.0 h1:+dTQ8DZQJz0Mb/HjFlkptS1FeQ4cWSnN941F8aEG4SQ=
|
||||||
|
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
|
||||||
|
github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf h1:+RRA9JqSOZFfKrOeqr2z77+8R2RKyh8PG66dcu1V0ck=
|
||||||
|
github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI=
|
||||||
|
github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
|
||||||
|
github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
|
||||||
|
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4=
|
||||||
|
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ=
|
||||||
|
github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||||
|
github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||||
|
github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||||
|
github.com/google/uuid v1.2.0 h1:qJYtXnJRWmpe7m/3XlyhrsLrEURqHRM2kxzoxXqyUDs=
|
||||||
|
github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||||
|
github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
|
||||||
|
github.com/googleapis/gnostic v0.2.0 h1:l6N3VoaVzTncYYW+9yOz2LJJammFZGBO13sqgEhpy9g=
|
||||||
|
github.com/googleapis/gnostic v0.2.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY=
|
||||||
|
github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8=
|
||||||
|
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
|
||||||
|
github.com/gorilla/mux v1.7.0/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
|
||||||
|
github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI=
|
||||||
|
github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So=
|
||||||
|
github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
|
||||||
|
github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
|
||||||
|
github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
|
||||||
|
github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA=
|
||||||
|
github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
|
||||||
|
github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
|
||||||
|
github.com/grpc-ecosystem/go-grpc-middleware v1.2.0 h1:0IKlLyQ3Hs9nDaiK5cSHAGmcQEIC8l2Ts1u6x5Dfrqg=
|
||||||
|
github.com/grpc-ecosystem/go-grpc-middleware v1.2.0/go.mod h1:mJzapYve32yjrKlk9GbyCZHuPgZsrbyIbyKhSzOpg6s=
|
||||||
|
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=
|
||||||
|
github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
|
||||||
|
github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
|
||||||
|
github.com/grpc-ecosystem/grpc-opentracing v0.0.0-20180507213350-8e809c8a8645 h1:MJG/KsmcqMwFAkh8mTnAwhyKoB+sTAnY4CACC110tbU=
|
||||||
|
github.com/grpc-ecosystem/grpc-opentracing v0.0.0-20180507213350-8e809c8a8645/go.mod h1:6iZfnjpejD4L/4DwD7NryNaJyCQdzwWwH2MWhCA90Kw=
|
||||||
|
github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed h1:5upAirOpQc1Q53c0bnx2ufif5kANL7bfZWcc6VJWJd8=
|
||||||
|
github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed/go.mod h1:tMWxXQ9wFIaZeTI9F+hmhFiGpFmhOHzyShyFUhRm0H4=
|
||||||
|
github.com/hanwen/go-fuse v1.0.0/go.mod h1:unqXarDXqzAk0rt98O2tVndEPIpUgLD9+rwFisZH3Ok=
|
||||||
|
github.com/hanwen/go-fuse/v2 v2.1.0/go.mod h1:oRyA5eK+pvJyv5otpO/DgccS8y/RvYMaO00GgRLGryc=
|
||||||
|
github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q=
|
||||||
|
github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8=
|
||||||
|
github.com/hashicorp/errwrap v0.0.0-20141028054710-7554cd9344ce/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
|
||||||
|
github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
|
||||||
|
github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
|
||||||
|
github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=
|
||||||
|
github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=
|
||||||
|
github.com/hashicorp/go-multierror v0.0.0-20161216184304-ed905158d874/go.mod h1:JMRHfdO9jKNzS/+BTlxCjKNQHg/jZAft8U7LloJvN7I=
|
||||||
|
github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=
|
||||||
|
github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=
|
||||||
|
github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU=
|
||||||
|
github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=
|
||||||
|
github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=
|
||||||
|
github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
|
||||||
|
github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
|
||||||
|
github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90=
|
||||||
|
github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
|
||||||
|
github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
|
||||||
|
github.com/hashicorp/golang-lru v0.5.3 h1:YPkqC67at8FYaadspW/6uE0COsBxS2656RLEr8Bppgk=
|
||||||
|
github.com/hashicorp/golang-lru v0.5.3/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=
|
||||||
|
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/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=
|
||||||
|
github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ=
|
||||||
|
github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I=
|
||||||
|
github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc=
|
||||||
|
github.com/hashicorp/uuid v0.0.0-20160311170451-ebb0a03e909c/go.mod h1:fHzc09UnyJyqyW+bFuq864eh+wC7dj65aXmXLRe5to0=
|
||||||
|
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
|
||||||
|
github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU=
|
||||||
|
github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA=
|
||||||
|
github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM=
|
||||||
|
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
|
||||||
|
github.com/ishidawataru/sctp v0.0.0-20210226210310-f2269e66cdee/go.mod h1:co9pwDoBCm1kGxawmb4sPq0cSIOOWNPT4KnHotMP1Zg=
|
||||||
|
github.com/j-keck/arping v0.0.0-20160618110441-2cf9dc699c56/go.mod h1:ymszkNOg6tORTn+6F6j+Jc8TOr5osrynvN6ivFWZ2GA=
|
||||||
|
github.com/jinzhu/gorm v0.0.0-20170222002820-5409931a1bb8 h1:CZkYfurY6KGhVtlalI4QwQ6T0Cu6iuY3e0x5RLu96WE=
|
||||||
|
github.com/jinzhu/gorm v0.0.0-20170222002820-5409931a1bb8/go.mod h1:Vla75njaFJ8clLU1W44h34PjIkijhjHIYnZxMqCdxqo=
|
||||||
|
github.com/jinzhu/inflection v0.0.0-20170102125226-1c35d901db3d h1:jRQLvyVGL+iVtDElaEIDdKwpPqUIZJfzkNLV34htpEc=
|
||||||
|
github.com/jinzhu/inflection v0.0.0-20170102125226-1c35d901db3d/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=
|
||||||
|
github.com/jinzhu/now v1.1.1/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=
|
||||||
|
github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=
|
||||||
|
github.com/json-iterator/go v1.1.10 h1:Kz6Cvnvv2wGdaG/V8yMvfkmNiXq9Ya2KUv4rouJJr68=
|
||||||
|
github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
|
||||||
|
github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
|
||||||
|
github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
|
||||||
|
github.com/juju/loggo v0.0.0-20190526231331-6e530bcce5d8/go.mod h1:vgyd7OREkbtVEN/8IXZe5Ooef3LQePvuBm9UWj6ZL8U=
|
||||||
|
github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
|
||||||
|
github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q=
|
||||||
|
github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00=
|
||||||
|
github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
|
||||||
|
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
|
||||||
|
github.com/klauspost/compress v1.11.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
|
||||||
|
github.com/klauspost/compress v1.11.13/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
|
||||||
|
github.com/klauspost/compress v1.12.3 h1:G5AfA94pHPysR56qqrkO2pxEexdDzrpFJ6yt/VqWxVU=
|
||||||
|
github.com/klauspost/compress v1.12.3/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg=
|
||||||
|
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
||||||
|
github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
||||||
|
github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
||||||
|
github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
|
||||||
|
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
|
||||||
|
github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
|
||||||
|
github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
|
||||||
|
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
||||||
|
github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA=
|
||||||
|
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
||||||
|
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
|
||||||
|
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
|
||||||
|
github.com/kylelemons/godebug v0.0.0-20170820004349-d65d576e9348/go.mod h1:B69LEHPfb2qLo0BaaOLcbitczOKLWTsrBG9LczfCD4k=
|
||||||
|
github.com/lib/pq v1.9.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
|
||||||
|
github.com/magiconair/properties v1.5.3/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
|
||||||
|
github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
|
||||||
|
github.com/magiconair/properties v1.8.1 h1:ZC2Vc7/ZFkGmsVC9KvOjumD+G5lXy2RtTKyzRKO2BQ4=
|
||||||
|
github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
|
||||||
|
github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
|
||||||
|
github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
|
||||||
|
github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
|
||||||
|
github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs=
|
||||||
|
github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
|
||||||
|
github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
|
||||||
|
github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
|
||||||
|
github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
|
||||||
|
github.com/mattn/go-shellwords v1.0.3/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o=
|
||||||
|
github.com/mattn/go-sqlite3 v1.6.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
|
||||||
|
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
|
||||||
|
github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI=
|
||||||
|
github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4=
|
||||||
|
github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
|
||||||
|
github.com/miekg/pkcs11 v1.0.3 h1:iMwmD7I5225wv84WxIG/bmxz9AXjWvTWIbM/TYHvWtw=
|
||||||
|
github.com/miekg/pkcs11 v1.0.3/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs=
|
||||||
|
github.com/mistifyio/go-zfs v2.1.2-0.20190413222219-f784269be439+incompatible/go.mod h1:8AuVvqP/mXw1px98n46wfvcGfQ4ci2FwoAjKYxuo3Z4=
|
||||||
|
github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=
|
||||||
|
github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
|
||||||
|
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
|
||||||
|
github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI=
|
||||||
|
github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg=
|
||||||
|
github.com/mitchellh/hashstructure v1.0.0/go.mod h1:QjSHrPWS+BGUVBYkbTZWEnOh3G1DutKwClXU/ABz6AQ=
|
||||||
|
github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY=
|
||||||
|
github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
|
||||||
|
github.com/mitchellh/mapstructure v1.0.0/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
|
||||||
|
github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
|
||||||
|
github.com/mitchellh/mapstructure v1.3.2 h1:mRS76wmkOn3KkKAyXDu42V+6ebnXWIztFSYGN7GeoRg=
|
||||||
|
github.com/mitchellh/mapstructure v1.3.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
|
||||||
|
github.com/moby/buildkit v0.8.2-0.20210615162540-9f254e18360a h1:1KdH8CRFygJ8oj8l8wD2TUy3hGaGUzXO2h6gyQKg780=
|
||||||
|
github.com/moby/buildkit v0.8.2-0.20210615162540-9f254e18360a/go.mod h1:OieevFziOisPBM43fLKG+lPcVp9XW+BlUiws8VIpG6k=
|
||||||
|
github.com/moby/locker v1.0.1 h1:fOXqR41zeveg4fFODix+1Ch4mj/gT0NE1XJbp/epuBg=
|
||||||
|
github.com/moby/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc=
|
||||||
|
github.com/moby/sys/mount v0.3.0 h1:bXZYMmq7DBQPwHRxH/MG+u9+XF90ZOwoXpHTOznMGp0=
|
||||||
|
github.com/moby/sys/mount v0.3.0/go.mod h1:U2Z3ur2rXPFrFmy4q6WMwWrBOAQGYtYTRVM8BIvzbwk=
|
||||||
|
github.com/moby/sys/mountinfo v0.5.0 h1:2Ks8/r6lopsxWi9m58nlwjaeSzUX9iiL1vj5qB/9ObI=
|
||||||
|
github.com/moby/sys/mountinfo v0.5.0/go.mod h1:3bMD3Rg+zkqx8MRYPi7Pyb0Ie97QEBmdxbhnCLlSvSU=
|
||||||
|
github.com/moby/sys/signal v0.6.0 h1:aDpY94H8VlhTGa9sNYUFCFsMZIUh5wm0B6XkIoJj/iY=
|
||||||
|
github.com/moby/sys/signal v0.6.0/go.mod h1:GQ6ObYZfqacOwTtlXvcmh9A26dVRul/hbOZn88Kg8Tg=
|
||||||
|
github.com/moby/sys/symlink v0.2.0 h1:tk1rOM+Ljp0nFmfOIBtlV3rTDlWOwFRhjEeAhZB0nZc=
|
||||||
|
github.com/moby/sys/symlink v0.2.0/go.mod h1:7uZVF2dqJjG/NsClqul95CqKOBRQyYSNnJ6BMgR/gFs=
|
||||||
|
github.com/moby/term v0.0.0-20200312100748-672ec06f55cd/go.mod h1:DdlQx2hp0Ss5/fLikoLlEeIYiATotOjgB//nb973jeo=
|
||||||
|
github.com/moby/term v0.0.0-20201110203204-bea5bbe245bf/go.mod h1:FBS0z0QWA44HXygs7VXDUOGoN/1TV3RuWkLO04am3wc=
|
||||||
|
github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6 h1:dcztxKSvZ4Id8iPpHERQBbIJfabdt4wUm5qy3wOL2Zc=
|
||||||
|
github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6/go.mod h1:E2VnQOmVuvZB6UYnnDB0qG5Nq/1tD9acaOpo6xmt0Kw=
|
||||||
|
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
|
||||||
|
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-20180320133207-05fbef0ca5da/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
|
||||||
|
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/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A=
|
||||||
|
github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc=
|
||||||
|
github.com/mrunalp/fileutils v0.5.0/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2QJNHXfbSQ=
|
||||||
|
github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
|
||||||
|
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
|
||||||
|
github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
|
||||||
|
github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw=
|
||||||
|
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs=
|
||||||
|
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
|
||||||
|
github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78=
|
||||||
|
github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
|
||||||
|
github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo=
|
||||||
|
github.com/onsi/ginkgo v0.0.0-20151202141238-7f8ab55aaf3b/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
||||||
|
github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
||||||
|
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
||||||
|
github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
||||||
|
github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
||||||
|
github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
||||||
|
github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg=
|
||||||
|
github.com/onsi/ginkgo v1.12.1 h1:mFwc4LvZ0xpSvDZ3E+k8Yte0hLOMxXUlP+yXtJqkYfQ=
|
||||||
|
github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=
|
||||||
|
github.com/onsi/gomega v0.0.0-20151007035656-2152b45fa28a/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA=
|
||||||
|
github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA=
|
||||||
|
github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
|
||||||
|
github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
|
||||||
|
github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
|
||||||
|
github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA=
|
||||||
|
github.com/onsi/gomega v1.10.3 h1:gph6h/qe9GSUw1NhH1gp+qb+h8rXD8Cy60Z32Qw3ELA=
|
||||||
|
github.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc=
|
||||||
|
github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s=
|
||||||
|
github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s=
|
||||||
|
github.com/opencontainers/go-digest v1.0.0-rc1.0.20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s=
|
||||||
|
github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U=
|
||||||
|
github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM=
|
||||||
|
github.com/opencontainers/image-spec v1.0.1 h1:JMemWkRwHx4Zj+fVxWoMCFm/8sYGGrUVojFA6h/TRcI=
|
||||||
|
github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0=
|
||||||
|
github.com/opencontainers/runc v0.0.0-20190115041553-12f6a991201f/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U=
|
||||||
|
github.com/opencontainers/runc v0.1.1/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U=
|
||||||
|
github.com/opencontainers/runc v1.0.0-rc8.0.20190926000215-3e425f80a8c9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U=
|
||||||
|
github.com/opencontainers/runc v1.0.0-rc9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U=
|
||||||
|
github.com/opencontainers/runc v1.0.0-rc93/go.mod h1:3NOsor4w32B2tC0Zbl8Knk4Wg84SM2ImC1fxBuqJ/H0=
|
||||||
|
github.com/opencontainers/runc v1.0.1 h1:G18PGckGdAm3yVQRWDVQ1rLSLntiniKJ0cNRT2Tm5gs=
|
||||||
|
github.com/opencontainers/runc v1.0.1/go.mod h1:aTaHFFwQXuA71CiyxOdFFIorAoemI04suvGRQFzWTD0=
|
||||||
|
github.com/opencontainers/runtime-spec v0.1.2-0.20190507144316-5b71a03e2700/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=
|
||||||
|
github.com/opencontainers/runtime-spec v1.0.1/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=
|
||||||
|
github.com/opencontainers/runtime-spec v1.0.2-0.20190207185410-29686dbc5559/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=
|
||||||
|
github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=
|
||||||
|
github.com/opencontainers/runtime-spec v1.0.3-0.20200929063507-e6143ca7d51d/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=
|
||||||
|
github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417 h1:3snG66yBm59tKhhSPQrQ/0bCrv1LQbKt40LnUPiUxdc=
|
||||||
|
github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=
|
||||||
|
github.com/opencontainers/runtime-tools v0.0.0-20181011054405-1d69bd0f9c39/go.mod h1:r3f7wjNzSs2extwzU3Y+6pKfobzPh+kKFJ3ofN+3nfs=
|
||||||
|
github.com/opencontainers/selinux v1.6.0/go.mod h1:VVGKuOLlE7v4PJyT6h7mNWvq1rzqiriPsEqVhc+svHE=
|
||||||
|
github.com/opencontainers/selinux v1.8.0/go.mod h1:RScLhm78qiWa2gbVCcGkC7tCGdgk3ogry1nUQF8Evvo=
|
||||||
|
github.com/opencontainers/selinux v1.8.2 h1:c4ca10UMgRcvZ6h0K4HtS15UaVSBEaE+iln2LVpAuGc=
|
||||||
|
github.com/opencontainers/selinux v1.8.2/go.mod h1:MUIHuUEvKB1wtJjQdOyYRgOnLD2xAPP8dBsCoU0KuF8=
|
||||||
|
github.com/opentracing-contrib/go-stdlib v1.0.0/go.mod h1:qtI1ogk+2JhVPIXVc6q+NHziSmy2W5GbdQZFUHADCBU=
|
||||||
|
github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
|
||||||
|
github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs=
|
||||||
|
github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc=
|
||||||
|
github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
|
||||||
|
github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
|
||||||
|
github.com/pelletier/go-toml v1.8.1/go.mod h1:T2/BmBdy8dvIRq1a/8aqjN41wvWlN4lrapLU/GW4pbc=
|
||||||
|
github.com/pelletier/go-toml v1.9.1 h1:a6qW1EVNZWH9WGI6CsYdD8WAylkoXBS5yv0XHlh17Tc=
|
||||||
|
github.com/pelletier/go-toml v1.9.1/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c=
|
||||||
|
github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU=
|
||||||
|
github.com/pkg/errors v0.8.1-0.20171018195549-f15c970de5b7/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||||
|
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||||
|
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
|
||||||
|
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||||
|
github.com/pkg/profile v1.5.0/go.mod h1:qBsxPvzyUincmltOk6iyRVxHYg4adc0OFOv72ZdLa18=
|
||||||
|
github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||||
|
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/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=
|
||||||
|
github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA=
|
||||||
|
github.com/prometheus/client_golang v1.6.0 h1:YVPodQOcK15POxhgARIvnDRVpLcuK8mglnMrWfyrw6A=
|
||||||
|
github.com/prometheus/client_golang v1.6.0/go.mod h1:ZLOG9ck3JLRdB5MgO8f+lLTe83AXG6ro35rLTxvnIl4=
|
||||||
|
github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M=
|
||||||
|
github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
||||||
|
github.com/prometheus/common v0.9.1 h1:KOMtN28tlbam3/7ZKEYKHhKoJZYYj3gMH4uc62x7X7U=
|
||||||
|
github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4=
|
||||||
|
github.com/prometheus/procfs v0.0.11 h1:DhHlBtkHWPYi8O2y31JkK0TF+DGM+51OopZjH/Ia5qI=
|
||||||
|
github.com/prometheus/procfs v0.0.11/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
|
||||||
|
github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=
|
||||||
|
github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ=
|
||||||
|
github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
|
||||||
|
github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk=
|
||||||
|
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
|
||||||
|
github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
|
||||||
|
github.com/safchain/ethtool v0.0.0-20190326074333-42ed695e3de8/go.mod h1:Z0q5wiBQGYcxhMZ6gUqHn6pYNLypFAvaL3UvgZLR0U4=
|
||||||
|
github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
|
||||||
|
github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=
|
||||||
|
github.com/seccomp/libseccomp-golang v0.9.1/go.mod h1:GbW5+tmTXfcxTToHLXlScSlAvWlF4P2Ca7zGrPiEpWo=
|
||||||
|
github.com/serialx/hashring v0.0.0-20190422032157-8b2912629002/go.mod h1:/yeG0My1xr/u+HZrFQ1tOQQQQrOawfyMUH13ai5brBc=
|
||||||
|
github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
|
||||||
|
github.com/sirupsen/logrus v1.0.4-0.20170822132746-89742aefa4b2/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc=
|
||||||
|
github.com/sirupsen/logrus v1.0.6/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc=
|
||||||
|
github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=
|
||||||
|
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
|
||||||
|
github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=
|
||||||
|
github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
|
||||||
|
github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE=
|
||||||
|
github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
|
||||||
|
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
|
||||||
|
github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
|
||||||
|
github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM=
|
||||||
|
github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
|
||||||
|
github.com/spf13/afero v1.2.2 h1:5jhuqJyZCZf2JRofRvN/nIFgIWNzPa3/Vz8mYylgbWc=
|
||||||
|
github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk=
|
||||||
|
github.com/spf13/cast v0.0.0-20150508191742-4d07383ffe94/go.mod h1:r2rcYCSwa1IExKTDiTfzaxqT2FNHs8hODu4LnUfgKEg=
|
||||||
|
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.1/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
|
||||||
|
github.com/spf13/cobra v0.0.2-0.20171109065643-2da4a54c5cee/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
|
||||||
|
github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
|
||||||
|
github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE=
|
||||||
|
github.com/spf13/cobra v1.1.3 h1:xghbfqPkxzxP3C/f3n5DdpAbdKLj4ZE4BWQI362l53M=
|
||||||
|
github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo=
|
||||||
|
github.com/spf13/jwalterweatherman v0.0.0-20141219030609-3d60171a6431/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=
|
||||||
|
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 v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
|
||||||
|
github.com/spf13/pflag v1.0.0/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
|
||||||
|
github.com/spf13/pflag v1.0.1-0.20171106142849-4c012f6dcd95/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
|
||||||
|
github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
|
||||||
|
github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
|
||||||
|
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
|
||||||
|
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
|
||||||
|
github.com/spf13/viper v0.0.0-20150530192845-be5ff3e4840c/go.mod h1:A8kyI5cUJhb8N+3pkfONlcEcZbueH6nhAm0Fq7SrnBM=
|
||||||
|
github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE=
|
||||||
|
github.com/spf13/viper v1.7.0 h1:xVKxvI7ouOI5I+U9s2eeiUfMaWBVoXA3AWskkrqK0VM=
|
||||||
|
github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg=
|
||||||
|
github.com/stefanberger/go-pkcs11uri v0.0.0-20201008174630-78d3cae3a980/go.mod h1:AO3tvPzVZ/ayst6UlUKUv6rcPQInYe3IknH3jYhAKu8=
|
||||||
|
github.com/stretchr/objx v0.0.0-20180129172003-8a3f7159479f/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||||
|
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/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
|
||||||
|
github.com/stretchr/testify v0.0.0-20151208002404-e3a8ff8ce365/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
|
||||||
|
github.com/stretchr/testify v0.0.0-20180303142811-b89eecf5ca5d/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
|
||||||
|
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
|
||||||
|
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
||||||
|
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
|
||||||
|
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
|
||||||
|
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||||
|
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
|
||||||
|
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||||
|
github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s=
|
||||||
|
github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw=
|
||||||
|
github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww=
|
||||||
|
github.com/syndtr/gocapability v0.0.0-20180916011248-d98352740cb2/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww=
|
||||||
|
github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww=
|
||||||
|
github.com/tchap/go-patricia v2.2.6+incompatible/go.mod h1:bmLyhP68RS6kStMGxByiQ23RP/odRBOTVjwp2cDyi6I=
|
||||||
|
github.com/theupdateframework/notary v0.7.1-0.20210315103452-bf96a202a09a h1:tlJ7tGUHvcvL1v3yR6NcCc9nOqh2L+CG6HWrYQtwzQ0=
|
||||||
|
github.com/theupdateframework/notary v0.7.1-0.20210315103452-bf96a202a09a/go.mod h1:Y94A6rPp2OwNfP/7vmf8O2xx2IykP8pPXQ1DLouGnEw=
|
||||||
|
github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
|
||||||
|
github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
|
||||||
|
github.com/tonistiigi/fsutil v0.0.0-20210609172227-d72af97c0eaf h1:L0ixhsTk9j+dVnIvF6aiVCxPiaFvwTOyJxqimPq44p8=
|
||||||
|
github.com/tonistiigi/fsutil v0.0.0-20210609172227-d72af97c0eaf/go.mod h1:lJAxK//iyZ3yGbQswdrPTxugZIDM7sd4bEsD0x3XMHk=
|
||||||
|
github.com/tonistiigi/go-rosetta v0.0.0-20200727161949-f79598599c5d h1:wvQZpqy8p0D/FUia6ipKDhXrzPzBVJE4PZyPc5+5Ay0=
|
||||||
|
github.com/tonistiigi/go-rosetta v0.0.0-20200727161949-f79598599c5d/go.mod h1:xKQhd7snlzKFuUi1taTGWjpRE8iFTA06DeacYi3CVFQ=
|
||||||
|
github.com/tonistiigi/units v0.0.0-20180711220420-6950e57a87ea h1:SXhTLE6pb6eld/v/cCndK0AMpt1wiVFb/YYmqB3/QG0=
|
||||||
|
github.com/tonistiigi/units v0.0.0-20180711220420-6950e57a87ea/go.mod h1:WPnis/6cRcDZSUvVmezrxJPkiO87ThFYsoUiMwWNDJk=
|
||||||
|
github.com/tonistiigi/vt100 v0.0.0-20190402012908-ad4c4a574305 h1:y/1cL5AL2oRcfzz8CAHHhR6kDDfIOT0WEyH5k40sccM=
|
||||||
|
github.com/tonistiigi/vt100 v0.0.0-20190402012908-ad4c4a574305/go.mod h1:gXOLibKqQTRAVuVZ9gX7G9Ykky8ll8yb4slxsEMoY0c=
|
||||||
|
github.com/uber/jaeger-client-go v2.25.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk=
|
||||||
|
github.com/uber/jaeger-lib v2.2.0+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U=
|
||||||
|
github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc=
|
||||||
|
github.com/urfave/cli v0.0.0-20171014202726-7bc6a0acffa5/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA=
|
||||||
|
github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA=
|
||||||
|
github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=
|
||||||
|
github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=
|
||||||
|
github.com/vishvananda/netlink v0.0.0-20181108222139-023a6dafdcdf/go.mod h1:+SR5DhBJrl6ZM7CoCKvpw5BKroDKQ+PJqOg65H/2ktk=
|
||||||
|
github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE=
|
||||||
|
github.com/vishvananda/netlink v1.1.1-0.20201029203352-d40f9887b852/go.mod h1:twkDnbuQxJYemMlGd4JFIcuhgX83tXhKS2B/PRMpOho=
|
||||||
|
github.com/vishvananda/netns v0.0.0-20180720170159-13995c7128cc/go.mod h1:ZjcWmFBXmLKZu9Nxj3WKYEafiSqer2rnvPr0en9UNpI=
|
||||||
|
github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU=
|
||||||
|
github.com/vishvananda/netns v0.0.0-20200728191858-db3c7e526aae/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0=
|
||||||
|
github.com/willf/bitset v1.1.11-0.20200630133818-d5bec3311243/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4=
|
||||||
|
github.com/willf/bitset v1.1.11/go.mod h1:83CECat5yLh5zVOf4P1ErAgKA5UDvKtgyUABdr3+MjI=
|
||||||
|
github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU=
|
||||||
|
github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb h1:zGWFAtiMcyryUHoUjUJX0/lt1H2+i2Ka2n+D3DImSNo=
|
||||||
|
github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU=
|
||||||
|
github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0=
|
||||||
|
github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ=
|
||||||
|
github.com/xeipuuv/gojsonschema v0.0.0-20180618132009-1d523034197f/go.mod h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs=
|
||||||
|
github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74=
|
||||||
|
github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y=
|
||||||
|
github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
|
||||||
|
github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q=
|
||||||
|
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||||
|
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||||
|
go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
|
||||||
|
go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
|
||||||
|
go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ=
|
||||||
|
go.etcd.io/etcd v0.5.0-alpha.5.0.20200910180754-dd1b699fc489/go.mod h1:yVHk9ub3CSBatqGNg7GRmsnfLWtoW60w4eDYfh7vHDg=
|
||||||
|
go.mozilla.org/pkcs7 v0.0.0-20200128120323-432b2356ecb1/go.mod h1:SNgMg+EgDFwmvSmLRTNKC5fegJjB7v23qTQ0XLGUNHk=
|
||||||
|
go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
|
||||||
|
go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
|
||||||
|
go.opencensus.io v0.22.3 h1:8sGtKOrtQqkN1bp2AtX+misvLIlOmsEsNd+9NIcPEm8=
|
||||||
|
go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
|
||||||
|
go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
|
||||||
|
go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
|
||||||
|
go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
|
||||||
|
go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
|
||||||
|
golang.org/x/crypto v0.0.0-20171113213409-9f005a07e0d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
||||||
|
golang.org/x/crypto v0.0.0-20181009213950-7c1a557ab941/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
||||||
|
golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
||||||
|
golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
||||||
|
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||||
|
golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||||
|
golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||||
|
golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||||
|
golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||||
|
golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||||
|
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||||
|
golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||||
|
golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||||
|
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||||
|
golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||||
|
golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||||
|
golang.org/x/crypto v0.0.0-20201117144127-c1f2f97bffc9/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
|
||||||
|
golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2 h1:It14KIkyBFYkHkwZ7k45minvA9aorojkyjGk9KJ5B/w=
|
||||||
|
golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
|
||||||
|
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||||
|
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||||
|
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
|
||||||
|
golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=
|
||||||
|
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
|
||||||
|
golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
|
||||||
|
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
||||||
|
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
|
||||||
|
golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
||||||
|
golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
||||||
|
golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
||||||
|
golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=
|
||||||
|
golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=
|
||||||
|
golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=
|
||||||
|
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||||
|
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||||
|
golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
|
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-20181011144130-49bb7cea24b1/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
|
golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/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-20181220203305-927f97764cc3/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-20190213061140-3a22650c66bd/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-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||||
|
golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||||
|
golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||||
|
golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
|
||||||
|
golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
|
||||||
|
golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
|
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
|
golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
|
golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
|
golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
|
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
|
golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
|
||||||
|
golang.org/x/net v0.0.0-20201006153459-a7d1128ccaa0/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
||||||
|
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
||||||
|
golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
||||||
|
golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
|
||||||
|
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110 h1:qWPm9rbaAMKs8Bq/9LRpbMqxWRVUAQwMI9fVrssnTfw=
|
||||||
|
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
|
||||||
|
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
||||||
|
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||||
|
golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d h1:TzXSXBo42m9gQenoE3b9BGiEpg5IG2JkU5FkPIawgtw=
|
||||||
|
golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||||
|
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
|
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/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
|
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
|
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
|
golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
|
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
|
golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
|
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ=
|
||||||
|
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
|
golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf h1:2ucpDCmfkl8Bd/FsLtiD653Wf96cW37s+iGx93zsu4k=
|
||||||
|
golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221 h1:/ZHdbVpdR/jk3g30/d4yUL0JU9kksj8+F/bnQUVLGDM=
|
||||||
|
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
|
||||||
|
golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k=
|
||||||
|
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||||
|
golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||||
|
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||||
|
golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e h1:EHBhcS0mlXEAVwNyO2dLfjToGsyY4j24pTs2ScHnX7s=
|
||||||
|
golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||||
|
golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/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-20181011042414-1f849cf54d09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||||
|
golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||||
|
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||||
|
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
|
||||||
|
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
||||||
|
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=
|
||||||
|
golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
|
||||||
|
golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
|
||||||
|
golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
|
||||||
|
golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
|
||||||
|
golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
|
||||||
|
golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
|
||||||
|
golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
|
||||||
|
golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||||
|
golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||||
|
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||||
|
golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
|
||||||
|
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
|
||||||
|
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
|
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
|
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
|
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=
|
||||||
|
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
|
google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=
|
||||||
|
google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
|
||||||
|
google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
|
||||||
|
google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
|
||||||
|
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
|
||||||
|
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
||||||
|
google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
||||||
|
google.golang.org/appengine v1.6.1 h1:QzqyMA1tlu6CgqCDUtU9V+ZKhLFT2dkJuANu5QaxI3I=
|
||||||
|
google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=
|
||||||
|
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
|
||||||
|
google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
|
||||||
|
google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
|
||||||
|
google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
|
||||||
|
google.golang.org/genproto v0.0.0-20190522204451-c2c4e71fbf69/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s=
|
||||||
|
google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
|
||||||
|
google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
|
||||||
|
google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=
|
||||||
|
google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
|
||||||
|
google.golang.org/genproto v0.0.0-20200117163144-32f20d992d24/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
|
||||||
|
google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
|
||||||
|
google.golang.org/genproto v0.0.0-20201110150050-8816d57aaa9a h1:pOwg4OoaRYScjmR4LlLgdtnyoHYTSAVhhqe5uPdpII8=
|
||||||
|
google.golang.org/genproto v0.0.0-20201110150050-8816d57aaa9a/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
||||||
|
google.golang.org/grpc v1.0.5/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw=
|
||||||
|
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
|
||||||
|
google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
|
||||||
|
google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
|
||||||
|
google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
|
||||||
|
google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
|
||||||
|
google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
|
||||||
|
google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA=
|
||||||
|
google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
|
||||||
|
google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
|
||||||
|
google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
|
||||||
|
google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
|
||||||
|
google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
|
||||||
|
google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc=
|
||||||
|
google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
|
||||||
|
google.golang.org/grpc v1.38.0 h1:/9BgsAsa5nWe26HqOlvlgJnqBuktYOLCgjCPqsa56W0=
|
||||||
|
google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=
|
||||||
|
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
|
||||||
|
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
|
||||||
|
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
|
||||||
|
google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
|
||||||
|
google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
|
||||||
|
google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
|
||||||
|
google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
|
||||||
|
google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
|
||||||
|
google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=
|
||||||
|
google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
|
||||||
|
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
|
||||||
|
google.golang.org/protobuf v1.26.0 h1:bxAC2xTBsZGibn2RTntX0oH50xLsqy1OxA9tTL3p/lk=
|
||||||
|
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
|
||||||
|
gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U=
|
||||||
|
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
|
||||||
|
gopkg.in/cenkalti/backoff.v2 v2.2.1 h1:eJ9UAg01/HIHG987TwxvnzK2MgxXq97YY6rYDpY9aII=
|
||||||
|
gopkg.in/cenkalti/backoff.v2 v2.2.1/go.mod h1:S0QdOvT2AlerfSBkp0O+dk+bbIMaNbEmVk876gPCthU=
|
||||||
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
|
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
|
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
|
gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU=
|
||||||
|
gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
|
gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw=
|
||||||
|
gopkg.in/evanphx/json-patch.v4 v4.1.0 h1:mhIoJVEZ3fFhgv3oDUrnu+LCnoHhVlQnEU1B22bcC/Y=
|
||||||
|
gopkg.in/evanphx/json-patch.v4 v4.1.0/go.mod h1:p8EYWUEYMpynmqDbY58zCKCFZw8pRWMG4EsWvDvM72M=
|
||||||
|
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
|
||||||
|
gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo=
|
||||||
|
gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc=
|
||||||
|
gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=
|
||||||
|
gopkg.in/ini.v1 v1.51.0 h1:AQvPpx3LzTDM0AjnIRlVFwFFGC+npRopjZxLJj6gdno=
|
||||||
|
gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
|
||||||
|
gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=
|
||||||
|
gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo=
|
||||||
|
gopkg.in/rethinkdb/rethinkdb-go.v6 v6.2.1 h1:d4KQkxAaAiRY2h5Zqis161Pv91A37uZyJOx73duwUwM=
|
||||||
|
gopkg.in/rethinkdb/rethinkdb-go.v6 v6.2.1/go.mod h1:WbjuEoo1oadwzQ4apSDU+JTvmllEHtsNHS6y7vFc7iw=
|
||||||
|
gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI=
|
||||||
|
gopkg.in/square/go-jose.v2 v2.3.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI=
|
||||||
|
gopkg.in/square/go-jose.v2 v2.5.1/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.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10=
|
||||||
|
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||||
|
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
|
||||||
|
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||||
|
gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo=
|
||||||
|
gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw=
|
||||||
|
gotest.tools/v3 v3.0.2 h1:kG1BFyqVHuQoVQiR1bWGnfz/fmHvvuiSPIV7rvl360E=
|
||||||
|
gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk=
|
||||||
|
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
||||||
|
honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
||||||
|
honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
||||||
|
k8s.io/api v0.16.9 h1:3vCx0WX9qcg1Hv4aQ/G1tiIKectGVuimvPVTJU4VOCA=
|
||||||
|
k8s.io/api v0.16.9/go.mod h1:Y7dZNHs1Xy0mSwSlzL9QShi6qkljnN41yR8oWCRTDe8=
|
||||||
|
k8s.io/apimachinery v0.16.9 h1:ESUZ4hMBUKF2kn2HBFL5zM/wQv4j/0uRbR7AjgqGJ4o=
|
||||||
|
k8s.io/apimachinery v0.16.9/go.mod h1:Xk2vD2TRRpuWYLQNM6lT9R7DSFZUYG03SarNkbGrnKE=
|
||||||
|
k8s.io/apiserver v0.20.1/go.mod h1:ro5QHeQkgMS7ZGpvf4tSMx6bBOgPfE+f52KwvXfScaU=
|
||||||
|
k8s.io/apiserver v0.20.4/go.mod h1:Mc80thBKOyy7tbvFtB4kJv1kbdD0eIH8k8vianJcbFM=
|
||||||
|
k8s.io/apiserver v0.20.6/go.mod h1:QIJXNt6i6JB+0YQRNcS0hdRHJlMhflFmsBDeSgT1r8Q=
|
||||||
|
k8s.io/client-go v0.16.9 h1:6Eh4lMDxFtDzBkqid1AOL3bQ/pPYrulx8l23DXw4mRU=
|
||||||
|
k8s.io/client-go v0.16.9/go.mod h1:ThjPlh7Kx+XoBFOCt775vx5J7atwY7F/zaFzTco5gL0=
|
||||||
|
k8s.io/component-base v0.20.1/go.mod h1:guxkoJnNoh8LNrbtiQOlyp2Y2XFCZQmrcg2n/DeYNLk=
|
||||||
|
k8s.io/component-base v0.20.4/go.mod h1:t4p9EdiagbVCJKrQ1RsA5/V4rFQNDfRlevJajlGwgjI=
|
||||||
|
k8s.io/component-base v0.20.6/go.mod h1:6f1MPBAeI+mvuts3sIdtpjljHWBQ2cIy38oBIWMYnrM=
|
||||||
|
k8s.io/cri-api v0.17.3/go.mod h1:X1sbHmuXhwaHs9xxYffLqJogVsnI+f6cPRcgPel7ywM=
|
||||||
|
k8s.io/cri-api v0.20.1/go.mod h1:2JRbKt+BFLTjtrILYVqQK5jqhI+XNdF6UiGMgczeBCI=
|
||||||
|
k8s.io/cri-api v0.20.4/go.mod h1:2JRbKt+BFLTjtrILYVqQK5jqhI+XNdF6UiGMgczeBCI=
|
||||||
|
k8s.io/cri-api v0.20.6/go.mod h1:ew44AjNXwyn1s0U4xCKGodU7J1HzBeZ1MpGrpa5r8Yc=
|
||||||
|
k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0=
|
||||||
|
k8s.io/klog v1.0.1-0.20200310124935-4ad0115ba9e4 h1:PbZJplYddJmSutLN9divJ0qU2nwGuY9ce++qhcsjqU0=
|
||||||
|
k8s.io/klog v1.0.1-0.20200310124935-4ad0115ba9e4/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I=
|
||||||
|
k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE=
|
||||||
|
k8s.io/klog/v2 v2.4.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y=
|
||||||
|
k8s.io/kube-openapi v0.0.0-20190918143330-0270cf2f1c1d h1:Xpe6sK+RY4ZgCTyZ3y273UmFmURhjtoJiwOMbQsXitY=
|
||||||
|
k8s.io/kube-openapi v0.0.0-20190918143330-0270cf2f1c1d/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E=
|
||||||
|
k8s.io/kubernetes v1.13.0/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk=
|
||||||
|
k8s.io/utils v0.0.0-20190923111123-69764acb6e8e h1:BXSmdH6S3YGLlhC89DZp+sNdYSmwNeDU6Xu5ZpzGOlM=
|
||||||
|
k8s.io/utils v0.0.0-20190923111123-69764acb6e8e/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew=
|
||||||
|
rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
|
||||||
|
sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.14/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg=
|
||||||
|
sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.15/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg=
|
||||||
|
sigs.k8s.io/structured-merge-diff v0.0.0-20190525122527-15d366b2352e/go.mod h1:wWxsB5ozmmv/SG7nM11ayaAW51xMvak/t1r0CSlcokI=
|
||||||
|
sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw=
|
||||||
|
sigs.k8s.io/structured-merge-diff/v4 v4.0.3/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw=
|
||||||
|
sigs.k8s.io/yaml v1.1.0 h1:4A07+ZFc2wgJwo8YNlQpr1rVlgUDlxXHhPJciaPY5gs=
|
||||||
|
sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o=
|
|
@ -1,227 +0,0 @@
|
||||||
# Google Cloud Client Libraries for Go
|
|
||||||
|
|
||||||
[![GoDoc](https://godoc.org/cloud.google.com/go?status.svg)](https://godoc.org/cloud.google.com/go)
|
|
||||||
|
|
||||||
Go packages for [Google Cloud Platform](https://cloud.google.com) services.
|
|
||||||
|
|
||||||
``` go
|
|
||||||
import "cloud.google.com/go"
|
|
||||||
```
|
|
||||||
|
|
||||||
To install the packages on your system, *do not clone the repo*. Instead use
|
|
||||||
|
|
||||||
```
|
|
||||||
$ go get -u cloud.google.com/go/...
|
|
||||||
```
|
|
||||||
|
|
||||||
**NOTE:** Some of these packages are under development, and may occasionally
|
|
||||||
make backwards-incompatible changes.
|
|
||||||
|
|
||||||
**NOTE:** Github repo is a mirror of [https://code.googlesource.com/gocloud](https://code.googlesource.com/gocloud).
|
|
||||||
|
|
||||||
## Supported APIs
|
|
||||||
|
|
||||||
Google API | Status | Package
|
|
||||||
------------------------------------------------|--------------|-----------------------------------------------------------
|
|
||||||
[Asset][cloud-asset] | alpha | [`cloud.google.com/go/asset/v1beta`][cloud-asset-ref]
|
|
||||||
[BigQuery][cloud-bigquery] | stable | [`cloud.google.com/go/bigquery`][cloud-bigquery-ref]
|
|
||||||
[Bigtable][cloud-bigtable] | stable | [`cloud.google.com/go/bigtable`][cloud-bigtable-ref]
|
|
||||||
[Cloudtasks][cloud-tasks] | stable | [`cloud.google.com/go/cloudtasks/apiv2`][cloud-tasks-ref]
|
|
||||||
[Container][cloud-container] | stable | [`cloud.google.com/go/container/apiv1`][cloud-container-ref]
|
|
||||||
[ContainerAnalysis][cloud-containeranalysis] | beta | [`cloud.google.com/go/containeranalysis/apiv1beta1`][cloud-containeranalysis-ref]
|
|
||||||
[Dataproc][cloud-dataproc] | stable | [`cloud.google.com/go/dataproc/apiv1`][cloud-dataproc-ref]
|
|
||||||
[Datastore][cloud-datastore] | stable | [`cloud.google.com/go/datastore`][cloud-datastore-ref]
|
|
||||||
[Debugger][cloud-debugger] | alpha | [`cloud.google.com/go/debugger/apiv2`][cloud-debugger-ref]
|
|
||||||
[Dialogflow][cloud-dialogflow] | alpha | [`cloud.google.com/go/dialogflow/apiv2`][cloud-dialogflow-ref]
|
|
||||||
[Data Loss Prevention][cloud-dlp] | alpha | [`cloud.google.com/go/dlp/apiv2`][cloud-dlp-ref]
|
|
||||||
[ErrorReporting][cloud-errors] | alpha | [`cloud.google.com/go/errorreporting`][cloud-errors-ref]
|
|
||||||
[Firestore][cloud-firestore] | stable | [`cloud.google.com/go/firestore`][cloud-firestore-ref]
|
|
||||||
[IAM][cloud-iam] | stable | [`cloud.google.com/go/iam`][cloud-iam-ref]
|
|
||||||
[IoT][cloud-iot] | alpha | [`cloud.google.com/iot/apiv1`][cloud-iot-ref]
|
|
||||||
[KMS][cloud-kms] | stable | [`cloud.google.com/go/kms`][cloud-kms-ref]
|
|
||||||
[Natural Language][cloud-natural-language] | stable | [`cloud.google.com/go/language/apiv1`][cloud-natural-language-ref]
|
|
||||||
[Logging][cloud-logging] | stable | [`cloud.google.com/go/logging`][cloud-logging-ref]
|
|
||||||
[Monitoring][cloud-monitoring] | alpha | [`cloud.google.com/go/monitoring/apiv3`][cloud-monitoring-ref]
|
|
||||||
[OS Login][cloud-oslogin] | alpha | [`cloud.google.com/go/oslogin/apiv1`][cloud-oslogin-ref]
|
|
||||||
[Pub/Sub][cloud-pubsub] | stable | [`cloud.google.com/go/pubsub`][cloud-pubsub-ref]
|
|
||||||
[Phishing Protection][cloud-phishingprotection] | alpha | [`cloud.google.com/go/phishingprotection/apiv1betad1`][cloud-phishingprotection-ref]
|
|
||||||
[reCAPTCHA Enterprise][cloud-recaptcha] | alpha | [`cloud.google.com/go/recaptchaenterprise/apiv1betad1`][cloud-recaptcha-ref]
|
|
||||||
[Memorystore][cloud-memorystore] | alpha | [`cloud.google.com/go/redis/apiv1`][cloud-memorystore-ref]
|
|
||||||
[Scheduler][cloud-scheduler] | stable | [`cloud.google.com/go/scheduler/apiv1`][cloud-scheduler-ref]
|
|
||||||
[Spanner][cloud-spanner] | stable | [`cloud.google.com/go/spanner`][cloud-spanner-ref]
|
|
||||||
[Speech][cloud-speech] | stable | [`cloud.google.com/go/speech/apiv1`][cloud-speech-ref]
|
|
||||||
[Storage][cloud-storage] | stable | [`cloud.google.com/go/storage`][cloud-storage-ref]
|
|
||||||
[Talent][cloud-talent] | alpha | [`cloud.google.com/go/talent/apiv4beta1`][cloud-talent-ref]
|
|
||||||
[Text To Speech][cloud-texttospeech] | alpha | [`cloud.google.com/go/texttospeech/apiv1`][cloud-texttospeech-ref]
|
|
||||||
[Trace][cloud-trace] | alpha | [`cloud.google.com/go/trace/apiv2`][cloud-trace-ref]
|
|
||||||
[Translate][cloud-translate] | stable | [`cloud.google.com/go/translate`][cloud-translate-ref]
|
|
||||||
[Video Intelligence][cloud-video] | alpha | [`cloud.google.com/go/videointelligence/apiv1beta1`][cloud-video-ref]
|
|
||||||
[Vision][cloud-vision] | stable | [`cloud.google.com/go/vision/apiv1`][cloud-vision-ref]
|
|
||||||
|
|
||||||
> **Alpha status**: the API is still being actively developed. As a
|
|
||||||
> result, it might change in backward-incompatible ways and is not recommended
|
|
||||||
> for production use.
|
|
||||||
>
|
|
||||||
> **Beta status**: the API is largely complete, but still has outstanding
|
|
||||||
> features and bugs to be addressed. There may be minor backwards-incompatible
|
|
||||||
> changes where necessary.
|
|
||||||
>
|
|
||||||
> **Stable status**: the API is mature and ready for production use. We will
|
|
||||||
> continue addressing bugs and feature requests.
|
|
||||||
|
|
||||||
Documentation and examples are available at [godoc.org/cloud.google.com/go](godoc.org/cloud.google.com/go)
|
|
||||||
|
|
||||||
## Go Versions Supported
|
|
||||||
|
|
||||||
We support the two most recent major versions of Go. If Google App Engine uses
|
|
||||||
an older version, we support that as well.
|
|
||||||
|
|
||||||
## Authorization
|
|
||||||
|
|
||||||
By default, each API will use [Google Application Default Credentials](https://developers.google.com/identity/protocols/application-default-credentials)
|
|
||||||
for authorization credentials used in calling the API endpoints. This will allow your
|
|
||||||
application to run in many environments without requiring explicit configuration.
|
|
||||||
|
|
||||||
[snip]:# (auth)
|
|
||||||
```go
|
|
||||||
client, err := storage.NewClient(ctx)
|
|
||||||
```
|
|
||||||
|
|
||||||
To authorize using a
|
|
||||||
[JSON key file](https://cloud.google.com/iam/docs/managing-service-account-keys),
|
|
||||||
pass
|
|
||||||
[`option.WithCredentialsFile`](https://godoc.org/google.golang.org/api/option#WithCredentialsFile)
|
|
||||||
to the `NewClient` function of the desired package. For example:
|
|
||||||
|
|
||||||
[snip]:# (auth-JSON)
|
|
||||||
```go
|
|
||||||
client, err := storage.NewClient(ctx, option.WithCredentialsFile("path/to/keyfile.json"))
|
|
||||||
```
|
|
||||||
|
|
||||||
You can exert more control over authorization by using the
|
|
||||||
[`golang.org/x/oauth2`](https://godoc.org/golang.org/x/oauth2) package to
|
|
||||||
create an `oauth2.TokenSource`. Then pass
|
|
||||||
[`option.WithTokenSource`](https://godoc.org/google.golang.org/api/option#WithTokenSource)
|
|
||||||
to the `NewClient` function:
|
|
||||||
[snip]:# (auth-ts)
|
|
||||||
```go
|
|
||||||
tokenSource := ...
|
|
||||||
client, err := storage.NewClient(ctx, option.WithTokenSource(tokenSource))
|
|
||||||
```
|
|
||||||
|
|
||||||
## Contributing
|
|
||||||
|
|
||||||
Contributions are welcome. Please, see the
|
|
||||||
[CONTRIBUTING](https://github.com/GoogleCloudPlatform/google-cloud-go/blob/master/CONTRIBUTING.md)
|
|
||||||
document for details. We're using Gerrit for our code reviews. Please don't open pull
|
|
||||||
requests against this repo, new pull requests will be automatically closed.
|
|
||||||
|
|
||||||
Please note that this project is released with a Contributor Code of Conduct.
|
|
||||||
By participating in this project you agree to abide by its terms.
|
|
||||||
See [Contributor Code of Conduct](https://github.com/GoogleCloudPlatform/google-cloud-go/blob/master/CONTRIBUTING.md#contributor-code-of-conduct)
|
|
||||||
for more information.
|
|
||||||
|
|
||||||
[cloud-datastore]: https://cloud.google.com/datastore/
|
|
||||||
[cloud-datastore-ref]: https://godoc.org/cloud.google.com/go/datastore
|
|
||||||
|
|
||||||
[cloud-firestore]: https://cloud.google.com/firestore/
|
|
||||||
[cloud-firestore-ref]: https://godoc.org/cloud.google.com/go/firestore
|
|
||||||
|
|
||||||
[cloud-pubsub]: https://cloud.google.com/pubsub/
|
|
||||||
[cloud-pubsub-ref]: https://godoc.org/cloud.google.com/go/pubsub
|
|
||||||
|
|
||||||
[cloud-storage]: https://cloud.google.com/storage/
|
|
||||||
[cloud-storage-ref]: https://godoc.org/cloud.google.com/go/storage
|
|
||||||
|
|
||||||
[cloud-bigtable]: https://cloud.google.com/bigtable/
|
|
||||||
[cloud-bigtable-ref]: https://godoc.org/cloud.google.com/go/bigtable
|
|
||||||
|
|
||||||
[cloud-bigquery]: https://cloud.google.com/bigquery/
|
|
||||||
[cloud-bigquery-ref]: https://godoc.org/cloud.google.com/go/bigquery
|
|
||||||
|
|
||||||
[cloud-logging]: https://cloud.google.com/logging/
|
|
||||||
[cloud-logging-ref]: https://godoc.org/cloud.google.com/go/logging
|
|
||||||
|
|
||||||
[cloud-monitoring]: https://cloud.google.com/monitoring/
|
|
||||||
[cloud-monitoring-ref]: https://godoc.org/cloud.google.com/go/monitoring/apiv3
|
|
||||||
|
|
||||||
[cloud-vision]: https://cloud.google.com/vision
|
|
||||||
[cloud-vision-ref]: https://godoc.org/cloud.google.com/go/vision/apiv1
|
|
||||||
|
|
||||||
[cloud-language]: https://cloud.google.com/natural-language
|
|
||||||
[cloud-language-ref]: https://godoc.org/cloud.google.com/go/language/apiv1
|
|
||||||
|
|
||||||
[cloud-oslogin]: https://cloud.google.com/compute/docs/oslogin/rest
|
|
||||||
[cloud-oslogin-ref]: https://cloud.google.com/go/oslogin/apiv1
|
|
||||||
|
|
||||||
[cloud-speech]: https://cloud.google.com/speech
|
|
||||||
[cloud-speech-ref]: https://godoc.org/cloud.google.com/go/speech/apiv1
|
|
||||||
|
|
||||||
[cloud-spanner]: https://cloud.google.com/spanner/
|
|
||||||
[cloud-spanner-ref]: https://godoc.org/cloud.google.com/go/spanner
|
|
||||||
|
|
||||||
[cloud-translate]: https://cloud.google.com/translate
|
|
||||||
[cloud-translate-ref]: https://godoc.org/cloud.google.com/go/translate
|
|
||||||
|
|
||||||
[cloud-video]: https://cloud.google.com/video-intelligence/
|
|
||||||
[cloud-video-ref]: https://godoc.org/cloud.google.com/go/videointelligence/apiv1beta1
|
|
||||||
|
|
||||||
[cloud-errors]: https://cloud.google.com/error-reporting/
|
|
||||||
[cloud-errors-ref]: https://godoc.org/cloud.google.com/go/errorreporting
|
|
||||||
|
|
||||||
[cloud-container]: https://cloud.google.com/containers/
|
|
||||||
[cloud-container-ref]: https://godoc.org/cloud.google.com/go/container/apiv1
|
|
||||||
|
|
||||||
[cloud-debugger]: https://cloud.google.com/debugger/
|
|
||||||
[cloud-debugger-ref]: https://godoc.org/cloud.google.com/go/debugger/apiv2
|
|
||||||
|
|
||||||
[cloud-dlp]: https://cloud.google.com/dlp/
|
|
||||||
[cloud-dlp-ref]: https://godoc.org/cloud.google.com/go/dlp/apiv2beta1
|
|
||||||
|
|
||||||
[cloud-dataproc]: https://cloud.google.com/dataproc/
|
|
||||||
[cloud-dataproc-ref]: https://godoc.org/cloud.google.com/go/dataproc/apiv1
|
|
||||||
|
|
||||||
[cloud-iam]: https://cloud.google.com/iam/
|
|
||||||
[cloud-iam-ref]: https://godoc.org/cloud.google.com/go/iam
|
|
||||||
|
|
||||||
[cloud-kms]: https://cloud.google.com/kms/
|
|
||||||
[cloud-kms-ref]: https://godoc.org/cloud.google.com/go/kms/apiv1
|
|
||||||
|
|
||||||
[cloud-natural-language]: https://cloud.google.com/natural-language/
|
|
||||||
[cloud-natural-language-ref]: https://godoc.org/cloud.google.com/go/language/apiv1
|
|
||||||
|
|
||||||
[cloud-memorystore]: https://cloud.google.com/memorystore/
|
|
||||||
[cloud-memorystore-ref]: https://godoc.org/cloud.google.com/go/redis/apiv1
|
|
||||||
|
|
||||||
[cloud-texttospeech]: https://cloud.google.com/texttospeech/
|
|
||||||
[cloud-texttospeech-ref]: https://godoc.org/cloud.google.com/go/texttospeech/apiv1
|
|
||||||
|
|
||||||
[cloud-trace]: https://cloud.google.com/trace/
|
|
||||||
[cloud-trace-ref]: https://godoc.org/cloud.google.com/go/trace/apiv2
|
|
||||||
|
|
||||||
[cloud-dialogflow]: https://cloud.google.com/dialogflow-enterprise/
|
|
||||||
[cloud-dialogflow-ref]: https://godoc.org/cloud.google.com/go/dialogflow/apiv2
|
|
||||||
|
|
||||||
[cloud-containeranalysis]: https://cloud.google.com/container-registry/docs/container-analysis
|
|
||||||
[cloud-containeranalysis-ref]: https://godoc.org/cloud.google.com/go/devtools/containeranalysis/apiv1beta1
|
|
||||||
|
|
||||||
[cloud-asset]: https://cloud.google.com/security-command-center/docs/how-to-asset-inventory
|
|
||||||
[cloud-asset-ref]: https://godoc.org/cloud.google.com/go/asset/apiv1
|
|
||||||
|
|
||||||
[cloud-tasks]: https://cloud.google.com/tasks/
|
|
||||||
[cloud-tasks-ref]: https://godoc.org/cloud.google.com/go/cloudtasks/apiv2
|
|
||||||
|
|
||||||
[cloud-scheduler]: https://cloud.google.com/scheduler
|
|
||||||
[cloud-scheduler-ref]: https://godoc.org/cloud.google.com/go/scheduler/apiv1
|
|
||||||
|
|
||||||
[cloud-iot]: https://cloud.google.com/iot-core/
|
|
||||||
[cloud-iot-ref]: https://godoc.org/cloud.google.com/go/iot/apiv1
|
|
||||||
|
|
||||||
[cloud-phishingprotection]: https://cloud.google.com/phishing-protection/
|
|
||||||
[cloud-phishingprotection-ref]: https://cloud.google.com/go/phishingprotection/apiv1beta1
|
|
||||||
|
|
||||||
[cloud-recaptcha]: https://cloud.google.com/recaptcha-enterprise/
|
|
||||||
[cloud-recaptcha-ref]: https://cloud.google.com/go/recaptchaenterprise/apiv1beta1
|
|
||||||
|
|
||||||
[cloud-talent]: https://cloud.google.com/solutions/talent-solution/
|
|
||||||
[cloud-talent-ref]: https://godoc.org/cloud.google.com/go/talent/apiv4beta1
|
|
|
@ -1,9 +0,0 @@
|
||||||
// +build ignore
|
|
||||||
|
|
||||||
// Empty include file to generate z symbols
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// EOF
|
|
472
vendor/cloud.google.com/go/cmd/go-cloud-debug-agent/internal/debug/gosym/pclntab.go
generated
vendored
472
vendor/cloud.google.com/go/cmd/go-cloud-debug-agent/internal/debug/gosym/pclntab.go
generated
vendored
|
@ -1,472 +0,0 @@
|
||||||
// Copyright 2018 Google Inc. 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.
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Line tables
|
|
||||||
*/
|
|
||||||
|
|
||||||
package gosym
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/binary"
|
|
||||||
"sync"
|
|
||||||
)
|
|
||||||
|
|
||||||
// A LineTable is a data structure mapping program counters to line numbers.
|
|
||||||
//
|
|
||||||
// In Go 1.1 and earlier, each function (represented by a Func) had its own LineTable,
|
|
||||||
// and the line number corresponded to a numbering of all source lines in the
|
|
||||||
// program, across all files. That absolute line number would then have to be
|
|
||||||
// converted separately to a file name and line number within the file.
|
|
||||||
//
|
|
||||||
// In Go 1.2, the format of the data changed so that there is a single LineTable
|
|
||||||
// for the entire program, shared by all Funcs, and there are no absolute line
|
|
||||||
// numbers, just line numbers within specific files.
|
|
||||||
//
|
|
||||||
// For the most part, LineTable's methods should be treated as an internal
|
|
||||||
// detail of the package; callers should use the methods on Table instead.
|
|
||||||
type LineTable struct {
|
|
||||||
Data []byte
|
|
||||||
PC uint64
|
|
||||||
Line int
|
|
||||||
|
|
||||||
// Go 1.2 state
|
|
||||||
mu sync.Mutex
|
|
||||||
go12 int // is this in Go 1.2 format? -1 no, 0 unknown, 1 yes
|
|
||||||
binary binary.ByteOrder
|
|
||||||
quantum uint32
|
|
||||||
ptrsize uint32
|
|
||||||
functab []byte
|
|
||||||
nfunctab uint32
|
|
||||||
filetab []byte
|
|
||||||
nfiletab uint32
|
|
||||||
fileMap map[string]uint32
|
|
||||||
}
|
|
||||||
|
|
||||||
// NOTE(rsc): This is wrong for GOARCH=arm, which uses a quantum of 4,
|
|
||||||
// but we have no idea whether we're using arm or not. This only
|
|
||||||
// matters in the old (pre-Go 1.2) symbol table format, so it's not worth
|
|
||||||
// fixing.
|
|
||||||
const oldQuantum = 1
|
|
||||||
|
|
||||||
func (t *LineTable) parse(targetPC uint64, targetLine int) (b []byte, pc uint64, line int) {
|
|
||||||
// The PC/line table can be thought of as a sequence of
|
|
||||||
// <pc update>* <line update>
|
|
||||||
// batches. Each update batch results in a (pc, line) pair,
|
|
||||||
// where line applies to every PC from pc up to but not
|
|
||||||
// including the pc of the next pair.
|
|
||||||
//
|
|
||||||
// Here we process each update individually, which simplifies
|
|
||||||
// the code, but makes the corner cases more confusing.
|
|
||||||
b, pc, line = t.Data, t.PC, t.Line
|
|
||||||
for pc <= targetPC && line != targetLine && len(b) > 0 {
|
|
||||||
code := b[0]
|
|
||||||
b = b[1:]
|
|
||||||
switch {
|
|
||||||
case code == 0:
|
|
||||||
if len(b) < 4 {
|
|
||||||
b = b[0:0]
|
|
||||||
break
|
|
||||||
}
|
|
||||||
val := binary.BigEndian.Uint32(b)
|
|
||||||
b = b[4:]
|
|
||||||
line += int(val)
|
|
||||||
case code <= 64:
|
|
||||||
line += int(code)
|
|
||||||
case code <= 128:
|
|
||||||
line -= int(code - 64)
|
|
||||||
default:
|
|
||||||
pc += oldQuantum * uint64(code-128)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
pc += oldQuantum
|
|
||||||
}
|
|
||||||
return b, pc, line
|
|
||||||
}
|
|
||||||
|
|
||||||
func (t *LineTable) slice(pc uint64) *LineTable {
|
|
||||||
data, pc, line := t.parse(pc, -1)
|
|
||||||
return &LineTable{Data: data, PC: pc, Line: line}
|
|
||||||
}
|
|
||||||
|
|
||||||
// PCToLine returns the line number for the given program counter.
|
|
||||||
// Callers should use Table's PCToLine method instead.
|
|
||||||
func (t *LineTable) PCToLine(pc uint64) int {
|
|
||||||
if t.isGo12() {
|
|
||||||
return t.go12PCToLine(pc)
|
|
||||||
}
|
|
||||||
_, _, line := t.parse(pc, -1)
|
|
||||||
return line
|
|
||||||
}
|
|
||||||
|
|
||||||
// LineToPC returns the program counter for the given line number,
|
|
||||||
// considering only program counters before maxpc.
|
|
||||||
// Callers should use Table's LineToPC method instead.
|
|
||||||
func (t *LineTable) LineToPC(line int, maxpc uint64) uint64 {
|
|
||||||
if t.isGo12() {
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
_, pc, line1 := t.parse(maxpc, line)
|
|
||||||
if line1 != line {
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
// Subtract quantum from PC to account for post-line increment
|
|
||||||
return pc - oldQuantum
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewLineTable returns a new PC/line table
|
|
||||||
// corresponding to the encoded data.
|
|
||||||
// Text must be the start address of the
|
|
||||||
// corresponding text segment.
|
|
||||||
func NewLineTable(data []byte, text uint64) *LineTable {
|
|
||||||
return &LineTable{Data: data, PC: text, Line: 0}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Go 1.2 symbol table format.
|
|
||||||
// See golang.org/s/go12symtab.
|
|
||||||
//
|
|
||||||
// A general note about the methods here: rather than try to avoid
|
|
||||||
// index out of bounds errors, we trust Go to detect them, and then
|
|
||||||
// we recover from the panics and treat them as indicative of a malformed
|
|
||||||
// or incomplete table.
|
|
||||||
//
|
|
||||||
// The methods called by symtab.go, which begin with "go12" prefixes,
|
|
||||||
// are expected to have that recovery logic.
|
|
||||||
|
|
||||||
// isGo12 reports whether this is a Go 1.2 (or later) symbol table.
|
|
||||||
func (t *LineTable) isGo12() bool {
|
|
||||||
t.go12Init()
|
|
||||||
return t.go12 == 1
|
|
||||||
}
|
|
||||||
|
|
||||||
const go12magic = 0xfffffffb
|
|
||||||
|
|
||||||
// uintptr returns the pointer-sized value encoded at b.
|
|
||||||
// The pointer size is dictated by the table being read.
|
|
||||||
func (t *LineTable) uintptr(b []byte) uint64 {
|
|
||||||
if t.ptrsize == 4 {
|
|
||||||
return uint64(t.binary.Uint32(b))
|
|
||||||
}
|
|
||||||
return t.binary.Uint64(b)
|
|
||||||
}
|
|
||||||
|
|
||||||
// go12init initializes the Go 1.2 metadata if t is a Go 1.2 symbol table.
|
|
||||||
func (t *LineTable) go12Init() {
|
|
||||||
t.mu.Lock()
|
|
||||||
defer t.mu.Unlock()
|
|
||||||
if t.go12 != 0 {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
defer func() {
|
|
||||||
// If we panic parsing, assume it's not a Go 1.2 symbol table.
|
|
||||||
recover()
|
|
||||||
}()
|
|
||||||
|
|
||||||
// Check header: 4-byte magic, two zeros, pc quantum, pointer size.
|
|
||||||
t.go12 = -1 // not Go 1.2 until proven otherwise
|
|
||||||
if len(t.Data) < 16 || t.Data[4] != 0 || t.Data[5] != 0 ||
|
|
||||||
(t.Data[6] != 1 && t.Data[6] != 4) || // pc quantum
|
|
||||||
(t.Data[7] != 4 && t.Data[7] != 8) { // pointer size
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
switch uint32(go12magic) {
|
|
||||||
case binary.LittleEndian.Uint32(t.Data):
|
|
||||||
t.binary = binary.LittleEndian
|
|
||||||
case binary.BigEndian.Uint32(t.Data):
|
|
||||||
t.binary = binary.BigEndian
|
|
||||||
default:
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
t.quantum = uint32(t.Data[6])
|
|
||||||
t.ptrsize = uint32(t.Data[7])
|
|
||||||
|
|
||||||
t.nfunctab = uint32(t.uintptr(t.Data[8:]))
|
|
||||||
t.functab = t.Data[8+t.ptrsize:]
|
|
||||||
functabsize := t.nfunctab*2*t.ptrsize + t.ptrsize
|
|
||||||
fileoff := t.binary.Uint32(t.functab[functabsize:])
|
|
||||||
t.functab = t.functab[:functabsize]
|
|
||||||
t.filetab = t.Data[fileoff:]
|
|
||||||
t.nfiletab = t.binary.Uint32(t.filetab)
|
|
||||||
t.filetab = t.filetab[:t.nfiletab*4]
|
|
||||||
|
|
||||||
t.go12 = 1 // so far so good
|
|
||||||
}
|
|
||||||
|
|
||||||
// go12Funcs returns a slice of Funcs derived from the Go 1.2 pcln table.
|
|
||||||
func (t *LineTable) go12Funcs() []Func {
|
|
||||||
// Assume it is malformed and return nil on error.
|
|
||||||
defer func() {
|
|
||||||
recover()
|
|
||||||
}()
|
|
||||||
|
|
||||||
n := len(t.functab) / int(t.ptrsize) / 2
|
|
||||||
funcs := make([]Func, n)
|
|
||||||
for i := range funcs {
|
|
||||||
f := &funcs[i]
|
|
||||||
f.Entry = uint64(t.uintptr(t.functab[2*i*int(t.ptrsize):]))
|
|
||||||
f.End = uint64(t.uintptr(t.functab[(2*i+2)*int(t.ptrsize):]))
|
|
||||||
info := t.Data[t.uintptr(t.functab[(2*i+1)*int(t.ptrsize):]):]
|
|
||||||
f.LineTable = t
|
|
||||||
f.FrameSize = int(t.binary.Uint32(info[t.ptrsize+2*4:]))
|
|
||||||
f.Sym = &Sym{
|
|
||||||
Value: f.Entry,
|
|
||||||
Type: 'T',
|
|
||||||
Name: t.string(t.binary.Uint32(info[t.ptrsize:])),
|
|
||||||
GoType: 0,
|
|
||||||
Func: f,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return funcs
|
|
||||||
}
|
|
||||||
|
|
||||||
// findFunc returns the func corresponding to the given program counter.
|
|
||||||
func (t *LineTable) findFunc(pc uint64) []byte {
|
|
||||||
if pc < t.uintptr(t.functab) || pc >= t.uintptr(t.functab[len(t.functab)-int(t.ptrsize):]) {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// The function table is a list of 2*nfunctab+1 uintptrs,
|
|
||||||
// alternating program counters and offsets to func structures.
|
|
||||||
f := t.functab
|
|
||||||
nf := t.nfunctab
|
|
||||||
for nf > 0 {
|
|
||||||
m := nf / 2
|
|
||||||
fm := f[2*t.ptrsize*m:]
|
|
||||||
if t.uintptr(fm) <= pc && pc < t.uintptr(fm[2*t.ptrsize:]) {
|
|
||||||
return t.Data[t.uintptr(fm[t.ptrsize:]):]
|
|
||||||
} else if pc < t.uintptr(fm) {
|
|
||||||
nf = m
|
|
||||||
} else {
|
|
||||||
f = f[(m+1)*2*t.ptrsize:]
|
|
||||||
nf -= m + 1
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// readvarint reads, removes, and returns a varint from *pp.
|
|
||||||
func (t *LineTable) readvarint(pp *[]byte) uint32 {
|
|
||||||
var v, shift uint32
|
|
||||||
p := *pp
|
|
||||||
for shift = 0; ; shift += 7 {
|
|
||||||
b := p[0]
|
|
||||||
p = p[1:]
|
|
||||||
v |= (uint32(b) & 0x7F) << shift
|
|
||||||
if b&0x80 == 0 {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*pp = p
|
|
||||||
return v
|
|
||||||
}
|
|
||||||
|
|
||||||
// string returns a Go string found at off.
|
|
||||||
func (t *LineTable) string(off uint32) string {
|
|
||||||
for i := off; ; i++ {
|
|
||||||
if t.Data[i] == 0 {
|
|
||||||
return string(t.Data[off:i])
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// step advances to the next pc, value pair in the encoded table.
|
|
||||||
func (t *LineTable) step(p *[]byte, pc *uint64, val *int32, first bool) bool {
|
|
||||||
uvdelta := t.readvarint(p)
|
|
||||||
if uvdelta == 0 && !first {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
if uvdelta&1 != 0 {
|
|
||||||
uvdelta = ^(uvdelta >> 1)
|
|
||||||
} else {
|
|
||||||
uvdelta >>= 1
|
|
||||||
}
|
|
||||||
vdelta := int32(uvdelta)
|
|
||||||
pcdelta := t.readvarint(p) * t.quantum
|
|
||||||
*pc += uint64(pcdelta)
|
|
||||||
*val += vdelta
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
// pcvalue reports the value associated with the target pc.
|
|
||||||
// off is the offset to the beginning of the pc-value table,
|
|
||||||
// and entry is the start PC for the corresponding function.
|
|
||||||
func (t *LineTable) pcvalue(off uint32, entry, targetpc uint64) int32 {
|
|
||||||
if off == 0 {
|
|
||||||
return -1
|
|
||||||
}
|
|
||||||
p := t.Data[off:]
|
|
||||||
|
|
||||||
val := int32(-1)
|
|
||||||
pc := entry
|
|
||||||
for t.step(&p, &pc, &val, pc == entry) {
|
|
||||||
if targetpc < pc {
|
|
||||||
return val
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return -1
|
|
||||||
}
|
|
||||||
|
|
||||||
// findFileLine scans one function in the binary looking for a
|
|
||||||
// program counter in the given file on the given line.
|
|
||||||
// It does so by running the pc-value tables mapping program counter
|
|
||||||
// to file number. Since most functions come from a single file, these
|
|
||||||
// are usually short and quick to scan. If a file match is found, then the
|
|
||||||
// code goes to the expense of looking for a simultaneous line number match.
|
|
||||||
func (t *LineTable) findFileLine(entry uint64, filetab, linetab uint32, filenum, line int32) uint64 {
|
|
||||||
if filetab == 0 || linetab == 0 {
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
fp := t.Data[filetab:]
|
|
||||||
fl := t.Data[linetab:]
|
|
||||||
fileVal := int32(-1)
|
|
||||||
filePC := entry
|
|
||||||
lineVal := int32(-1)
|
|
||||||
linePC := entry
|
|
||||||
fileStartPC := filePC
|
|
||||||
for t.step(&fp, &filePC, &fileVal, filePC == entry) {
|
|
||||||
if fileVal == filenum && fileStartPC < filePC {
|
|
||||||
// fileVal is in effect starting at fileStartPC up to
|
|
||||||
// but not including filePC, and it's the file we want.
|
|
||||||
// Run the PC table looking for a matching line number
|
|
||||||
// or until we reach filePC.
|
|
||||||
lineStartPC := linePC
|
|
||||||
for linePC < filePC && t.step(&fl, &linePC, &lineVal, linePC == entry) {
|
|
||||||
// lineVal is in effect until linePC, and lineStartPC < filePC.
|
|
||||||
if lineVal == line {
|
|
||||||
if fileStartPC <= lineStartPC {
|
|
||||||
return lineStartPC
|
|
||||||
}
|
|
||||||
if fileStartPC < linePC {
|
|
||||||
return fileStartPC
|
|
||||||
}
|
|
||||||
}
|
|
||||||
lineStartPC = linePC
|
|
||||||
}
|
|
||||||
}
|
|
||||||
fileStartPC = filePC
|
|
||||||
}
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
// go12PCToLine maps program counter to line number for the Go 1.2 pcln table.
|
|
||||||
func (t *LineTable) go12PCToLine(pc uint64) (line int) {
|
|
||||||
return t.go12PCToVal(pc, t.ptrsize+5*4)
|
|
||||||
}
|
|
||||||
|
|
||||||
// go12PCToSPAdj maps program counter to Stack Pointer adjustment for the Go 1.2 pcln table.
|
|
||||||
func (t *LineTable) go12PCToSPAdj(pc uint64) (spadj int) {
|
|
||||||
return t.go12PCToVal(pc, t.ptrsize+3*4)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (t *LineTable) go12PCToVal(pc uint64, fOffset uint32) (val int) {
|
|
||||||
defer func() {
|
|
||||||
if recover() != nil {
|
|
||||||
val = -1
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
|
|
||||||
f := t.findFunc(pc)
|
|
||||||
if f == nil {
|
|
||||||
return -1
|
|
||||||
}
|
|
||||||
entry := t.uintptr(f)
|
|
||||||
linetab := t.binary.Uint32(f[fOffset:])
|
|
||||||
return int(t.pcvalue(linetab, entry, pc))
|
|
||||||
}
|
|
||||||
|
|
||||||
// go12PCToFile maps program counter to file name for the Go 1.2 pcln table.
|
|
||||||
func (t *LineTable) go12PCToFile(pc uint64) (file string) {
|
|
||||||
defer func() {
|
|
||||||
if recover() != nil {
|
|
||||||
file = ""
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
|
|
||||||
f := t.findFunc(pc)
|
|
||||||
if f == nil {
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
entry := t.uintptr(f)
|
|
||||||
filetab := t.binary.Uint32(f[t.ptrsize+4*4:])
|
|
||||||
fno := t.pcvalue(filetab, entry, pc)
|
|
||||||
if fno <= 0 {
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
return t.string(t.binary.Uint32(t.filetab[4*fno:]))
|
|
||||||
}
|
|
||||||
|
|
||||||
// go12LineToPC maps a (file, line) pair to a program counter for the Go 1.2 pcln table.
|
|
||||||
func (t *LineTable) go12LineToPC(file string, line int) (pc uint64) {
|
|
||||||
defer func() {
|
|
||||||
if recover() != nil {
|
|
||||||
pc = 0
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
|
|
||||||
t.initFileMap()
|
|
||||||
filenum := t.fileMap[file]
|
|
||||||
if filenum == 0 {
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
// Scan all functions.
|
|
||||||
// If this turns out to be a bottleneck, we could build a map[int32][]int32
|
|
||||||
// mapping file number to a list of functions with code from that file.
|
|
||||||
for i := uint32(0); i < t.nfunctab; i++ {
|
|
||||||
f := t.Data[t.uintptr(t.functab[2*t.ptrsize*i+t.ptrsize:]):]
|
|
||||||
entry := t.uintptr(f)
|
|
||||||
filetab := t.binary.Uint32(f[t.ptrsize+4*4:])
|
|
||||||
linetab := t.binary.Uint32(f[t.ptrsize+5*4:])
|
|
||||||
pc := t.findFileLine(entry, filetab, linetab, int32(filenum), int32(line))
|
|
||||||
if pc != 0 {
|
|
||||||
return pc
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
// initFileMap initializes the map from file name to file number.
|
|
||||||
func (t *LineTable) initFileMap() {
|
|
||||||
t.mu.Lock()
|
|
||||||
defer t.mu.Unlock()
|
|
||||||
|
|
||||||
if t.fileMap != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
m := make(map[string]uint32)
|
|
||||||
|
|
||||||
for i := uint32(1); i < t.nfiletab; i++ {
|
|
||||||
s := t.string(t.binary.Uint32(t.filetab[4*i:]))
|
|
||||||
m[s] = i
|
|
||||||
}
|
|
||||||
t.fileMap = m
|
|
||||||
}
|
|
||||||
|
|
||||||
// go12MapFiles adds to m a key for every file in the Go 1.2 LineTable.
|
|
||||||
// Every key maps to obj. That's not a very interesting map, but it provides
|
|
||||||
// a way for callers to obtain the list of files in the program.
|
|
||||||
func (t *LineTable) go12MapFiles(m map[string]*Obj, obj *Obj) {
|
|
||||||
defer func() {
|
|
||||||
recover()
|
|
||||||
}()
|
|
||||||
|
|
||||||
t.initFileMap()
|
|
||||||
for file := range t.fileMap {
|
|
||||||
m[file] = obj
|
|
||||||
}
|
|
||||||
}
|
|
731
vendor/cloud.google.com/go/cmd/go-cloud-debug-agent/internal/debug/gosym/symtab.go
generated
vendored
731
vendor/cloud.google.com/go/cmd/go-cloud-debug-agent/internal/debug/gosym/symtab.go
generated
vendored
|
@ -1,731 +0,0 @@
|
||||||
// Copyright 2018 Google Inc. 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 gosym implements access to the Go symbol
|
|
||||||
// and line number tables embedded in Go binaries generated
|
|
||||||
// by the gc compilers.
|
|
||||||
package gosym
|
|
||||||
|
|
||||||
// The table format is a variant of the format used in Plan 9's a.out
|
|
||||||
// format, documented at http://plan9.bell-labs.com/magic/man2html/6/a.out.
|
|
||||||
// The best reference for the differences between the Plan 9 format
|
|
||||||
// and the Go format is the runtime source, specifically ../../runtime/symtab.c.
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"encoding/binary"
|
|
||||||
"fmt"
|
|
||||||
"strconv"
|
|
||||||
"strings"
|
|
||||||
)
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Symbols
|
|
||||||
*/
|
|
||||||
|
|
||||||
// A Sym represents a single symbol table entry.
|
|
||||||
type Sym struct {
|
|
||||||
Value uint64
|
|
||||||
Type byte
|
|
||||||
Name string
|
|
||||||
GoType uint64
|
|
||||||
// If this symbol if a function symbol, the corresponding Func
|
|
||||||
Func *Func
|
|
||||||
}
|
|
||||||
|
|
||||||
// Static reports whether this symbol is static (not visible outside its file).
|
|
||||||
func (s *Sym) Static() bool { return s.Type >= 'a' }
|
|
||||||
|
|
||||||
// PackageName returns the package part of the symbol name,
|
|
||||||
// or the empty string if there is none.
|
|
||||||
func (s *Sym) PackageName() string {
|
|
||||||
if i := strings.Index(s.Name, "."); i != -1 {
|
|
||||||
return s.Name[0:i]
|
|
||||||
}
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
|
|
||||||
// ReceiverName returns the receiver type name of this symbol,
|
|
||||||
// or the empty string if there is none.
|
|
||||||
func (s *Sym) ReceiverName() string {
|
|
||||||
l := strings.Index(s.Name, ".")
|
|
||||||
r := strings.LastIndex(s.Name, ".")
|
|
||||||
if l == -1 || r == -1 || l == r {
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
return s.Name[l+1 : r]
|
|
||||||
}
|
|
||||||
|
|
||||||
// BaseName returns the symbol name without the package or receiver name.
|
|
||||||
func (s *Sym) BaseName() string {
|
|
||||||
if i := strings.LastIndex(s.Name, "."); i != -1 {
|
|
||||||
return s.Name[i+1:]
|
|
||||||
}
|
|
||||||
return s.Name
|
|
||||||
}
|
|
||||||
|
|
||||||
// A Func collects information about a single function.
|
|
||||||
type Func struct {
|
|
||||||
Entry uint64
|
|
||||||
*Sym
|
|
||||||
End uint64
|
|
||||||
Params []*Sym
|
|
||||||
Locals []*Sym
|
|
||||||
FrameSize int
|
|
||||||
LineTable *LineTable
|
|
||||||
Obj *Obj
|
|
||||||
}
|
|
||||||
|
|
||||||
// An Obj represents a collection of functions in a symbol table.
|
|
||||||
//
|
|
||||||
// The exact method of division of a binary into separate Objs is an internal detail
|
|
||||||
// of the symbol table format.
|
|
||||||
//
|
|
||||||
// In early versions of Go each source file became a different Obj.
|
|
||||||
//
|
|
||||||
// In Go 1 and Go 1.1, each package produced one Obj for all Go sources
|
|
||||||
// and one Obj per C source file.
|
|
||||||
//
|
|
||||||
// In Go 1.2, there is a single Obj for the entire program.
|
|
||||||
type Obj struct {
|
|
||||||
// Funcs is a list of functions in the Obj.
|
|
||||||
Funcs []Func
|
|
||||||
|
|
||||||
// In Go 1.1 and earlier, Paths is a list of symbols corresponding
|
|
||||||
// to the source file names that produced the Obj.
|
|
||||||
// In Go 1.2, Paths is nil.
|
|
||||||
// Use the keys of Table.Files to obtain a list of source files.
|
|
||||||
Paths []Sym // meta
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Symbol tables
|
|
||||||
*/
|
|
||||||
|
|
||||||
// Table represents a Go symbol table. It stores all of the
|
|
||||||
// symbols decoded from the program and provides methods to translate
|
|
||||||
// between symbols, names, and addresses.
|
|
||||||
type Table struct {
|
|
||||||
Syms []Sym
|
|
||||||
Funcs []Func
|
|
||||||
Files map[string]*Obj // nil for Go 1.2 and later binaries
|
|
||||||
Objs []Obj // nil for Go 1.2 and later binaries
|
|
||||||
|
|
||||||
go12line *LineTable // Go 1.2 line number table
|
|
||||||
}
|
|
||||||
|
|
||||||
type sym struct {
|
|
||||||
value uint64
|
|
||||||
gotype uint64
|
|
||||||
typ byte
|
|
||||||
name []byte
|
|
||||||
}
|
|
||||||
|
|
||||||
var (
|
|
||||||
littleEndianSymtab = []byte{0xFD, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00}
|
|
||||||
bigEndianSymtab = []byte{0xFF, 0xFF, 0xFF, 0xFD, 0x00, 0x00, 0x00}
|
|
||||||
oldLittleEndianSymtab = []byte{0xFE, 0xFF, 0xFF, 0xFF, 0x00, 0x00}
|
|
||||||
)
|
|
||||||
|
|
||||||
func walksymtab(data []byte, fn func(sym) error) error {
|
|
||||||
if len(data) == 0 { // missing symtab is okay
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
var order binary.ByteOrder = binary.BigEndian
|
|
||||||
newTable := false
|
|
||||||
switch {
|
|
||||||
case bytes.HasPrefix(data, oldLittleEndianSymtab):
|
|
||||||
// Same as Go 1.0, but little endian.
|
|
||||||
// Format was used during interim development between Go 1.0 and Go 1.1.
|
|
||||||
// Should not be widespread, but easy to support.
|
|
||||||
data = data[6:]
|
|
||||||
order = binary.LittleEndian
|
|
||||||
case bytes.HasPrefix(data, bigEndianSymtab):
|
|
||||||
newTable = true
|
|
||||||
case bytes.HasPrefix(data, littleEndianSymtab):
|
|
||||||
newTable = true
|
|
||||||
order = binary.LittleEndian
|
|
||||||
}
|
|
||||||
var ptrsz int
|
|
||||||
if newTable {
|
|
||||||
if len(data) < 8 {
|
|
||||||
return &DecodingError{len(data), "unexpected EOF", nil}
|
|
||||||
}
|
|
||||||
ptrsz = int(data[7])
|
|
||||||
if ptrsz != 4 && ptrsz != 8 {
|
|
||||||
return &DecodingError{7, "invalid pointer size", ptrsz}
|
|
||||||
}
|
|
||||||
data = data[8:]
|
|
||||||
}
|
|
||||||
var s sym
|
|
||||||
p := data
|
|
||||||
for len(p) >= 4 {
|
|
||||||
var typ byte
|
|
||||||
if newTable {
|
|
||||||
// Symbol type, value, Go type.
|
|
||||||
typ = p[0] & 0x3F
|
|
||||||
wideValue := p[0]&0x40 != 0
|
|
||||||
goType := p[0]&0x80 != 0
|
|
||||||
if typ < 26 {
|
|
||||||
typ += 'A'
|
|
||||||
} else {
|
|
||||||
typ += 'a' - 26
|
|
||||||
}
|
|
||||||
s.typ = typ
|
|
||||||
p = p[1:]
|
|
||||||
if wideValue {
|
|
||||||
if len(p) < ptrsz {
|
|
||||||
return &DecodingError{len(data), "unexpected EOF", nil}
|
|
||||||
}
|
|
||||||
// fixed-width value
|
|
||||||
if ptrsz == 8 {
|
|
||||||
s.value = order.Uint64(p[0:8])
|
|
||||||
p = p[8:]
|
|
||||||
} else {
|
|
||||||
s.value = uint64(order.Uint32(p[0:4]))
|
|
||||||
p = p[4:]
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// varint value
|
|
||||||
s.value = 0
|
|
||||||
shift := uint(0)
|
|
||||||
for len(p) > 0 && p[0]&0x80 != 0 {
|
|
||||||
s.value |= uint64(p[0]&0x7F) << shift
|
|
||||||
shift += 7
|
|
||||||
p = p[1:]
|
|
||||||
}
|
|
||||||
if len(p) == 0 {
|
|
||||||
return &DecodingError{len(data), "unexpected EOF", nil}
|
|
||||||
}
|
|
||||||
s.value |= uint64(p[0]) << shift
|
|
||||||
p = p[1:]
|
|
||||||
}
|
|
||||||
if goType {
|
|
||||||
if len(p) < ptrsz {
|
|
||||||
return &DecodingError{len(data), "unexpected EOF", nil}
|
|
||||||
}
|
|
||||||
// fixed-width go type
|
|
||||||
if ptrsz == 8 {
|
|
||||||
s.gotype = order.Uint64(p[0:8])
|
|
||||||
p = p[8:]
|
|
||||||
} else {
|
|
||||||
s.gotype = uint64(order.Uint32(p[0:4]))
|
|
||||||
p = p[4:]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// Value, symbol type.
|
|
||||||
s.value = uint64(order.Uint32(p[0:4]))
|
|
||||||
if len(p) < 5 {
|
|
||||||
return &DecodingError{len(data), "unexpected EOF", nil}
|
|
||||||
}
|
|
||||||
typ = p[4]
|
|
||||||
if typ&0x80 == 0 {
|
|
||||||
return &DecodingError{len(data) - len(p) + 4, "bad symbol type", typ}
|
|
||||||
}
|
|
||||||
typ &^= 0x80
|
|
||||||
s.typ = typ
|
|
||||||
p = p[5:]
|
|
||||||
}
|
|
||||||
|
|
||||||
// Name.
|
|
||||||
var i int
|
|
||||||
var nnul int
|
|
||||||
for i = 0; i < len(p); i++ {
|
|
||||||
if p[i] == 0 {
|
|
||||||
nnul = 1
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
switch typ {
|
|
||||||
case 'z', 'Z':
|
|
||||||
p = p[i+nnul:]
|
|
||||||
for i = 0; i+2 <= len(p); i += 2 {
|
|
||||||
if p[i] == 0 && p[i+1] == 0 {
|
|
||||||
nnul = 2
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if len(p) < i+nnul {
|
|
||||||
return &DecodingError{len(data), "unexpected EOF", nil}
|
|
||||||
}
|
|
||||||
s.name = p[0:i]
|
|
||||||
i += nnul
|
|
||||||
p = p[i:]
|
|
||||||
|
|
||||||
if !newTable {
|
|
||||||
if len(p) < 4 {
|
|
||||||
return &DecodingError{len(data), "unexpected EOF", nil}
|
|
||||||
}
|
|
||||||
// Go type.
|
|
||||||
s.gotype = uint64(order.Uint32(p[:4]))
|
|
||||||
p = p[4:]
|
|
||||||
}
|
|
||||||
fn(s)
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewTable decodes the Go symbol table in data,
|
|
||||||
// returning an in-memory representation.
|
|
||||||
func NewTable(symtab []byte, pcln *LineTable) (*Table, error) {
|
|
||||||
var n int
|
|
||||||
err := walksymtab(symtab, func(s sym) error {
|
|
||||||
n++
|
|
||||||
return nil
|
|
||||||
})
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
var t Table
|
|
||||||
if pcln.isGo12() {
|
|
||||||
t.go12line = pcln
|
|
||||||
}
|
|
||||||
fname := make(map[uint16]string)
|
|
||||||
t.Syms = make([]Sym, 0, n)
|
|
||||||
nf := 0
|
|
||||||
nz := 0
|
|
||||||
lasttyp := uint8(0)
|
|
||||||
err = walksymtab(symtab, func(s sym) error {
|
|
||||||
n := len(t.Syms)
|
|
||||||
t.Syms = t.Syms[0 : n+1]
|
|
||||||
ts := &t.Syms[n]
|
|
||||||
ts.Type = s.typ
|
|
||||||
ts.Value = uint64(s.value)
|
|
||||||
ts.GoType = uint64(s.gotype)
|
|
||||||
switch s.typ {
|
|
||||||
default:
|
|
||||||
// rewrite name to use . instead of · (c2 b7)
|
|
||||||
w := 0
|
|
||||||
b := s.name
|
|
||||||
for i := 0; i < len(b); i++ {
|
|
||||||
if b[i] == 0xc2 && i+1 < len(b) && b[i+1] == 0xb7 {
|
|
||||||
i++
|
|
||||||
b[i] = '.'
|
|
||||||
}
|
|
||||||
b[w] = b[i]
|
|
||||||
w++
|
|
||||||
}
|
|
||||||
ts.Name = string(s.name[0:w])
|
|
||||||
case 'z', 'Z':
|
|
||||||
if lasttyp != 'z' && lasttyp != 'Z' {
|
|
||||||
nz++
|
|
||||||
}
|
|
||||||
for i := 0; i < len(s.name); i += 2 {
|
|
||||||
eltIdx := binary.BigEndian.Uint16(s.name[i : i+2])
|
|
||||||
elt, ok := fname[eltIdx]
|
|
||||||
if !ok {
|
|
||||||
return &DecodingError{-1, "bad filename code", eltIdx}
|
|
||||||
}
|
|
||||||
if n := len(ts.Name); n > 0 && ts.Name[n-1] != '/' {
|
|
||||||
ts.Name += "/"
|
|
||||||
}
|
|
||||||
ts.Name += elt
|
|
||||||
}
|
|
||||||
}
|
|
||||||
switch s.typ {
|
|
||||||
case 'T', 't', 'L', 'l':
|
|
||||||
nf++
|
|
||||||
case 'f':
|
|
||||||
fname[uint16(s.value)] = ts.Name
|
|
||||||
}
|
|
||||||
lasttyp = s.typ
|
|
||||||
return nil
|
|
||||||
})
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
t.Funcs = make([]Func, 0, nf)
|
|
||||||
t.Files = make(map[string]*Obj)
|
|
||||||
|
|
||||||
var obj *Obj
|
|
||||||
if t.go12line != nil {
|
|
||||||
// Put all functions into one Obj.
|
|
||||||
t.Objs = make([]Obj, 1)
|
|
||||||
obj = &t.Objs[0]
|
|
||||||
t.go12line.go12MapFiles(t.Files, obj)
|
|
||||||
} else {
|
|
||||||
t.Objs = make([]Obj, 0, nz)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Count text symbols and attach frame sizes, parameters, and
|
|
||||||
// locals to them. Also, find object file boundaries.
|
|
||||||
lastf := 0
|
|
||||||
for i := 0; i < len(t.Syms); i++ {
|
|
||||||
sym := &t.Syms[i]
|
|
||||||
switch sym.Type {
|
|
||||||
case 'Z', 'z': // path symbol
|
|
||||||
if t.go12line != nil {
|
|
||||||
// Go 1.2 binaries have the file information elsewhere. Ignore.
|
|
||||||
break
|
|
||||||
}
|
|
||||||
// Finish the current object
|
|
||||||
if obj != nil {
|
|
||||||
obj.Funcs = t.Funcs[lastf:]
|
|
||||||
}
|
|
||||||
lastf = len(t.Funcs)
|
|
||||||
|
|
||||||
// Start new object
|
|
||||||
n := len(t.Objs)
|
|
||||||
t.Objs = t.Objs[0 : n+1]
|
|
||||||
obj = &t.Objs[n]
|
|
||||||
|
|
||||||
// Count & copy path symbols
|
|
||||||
var end int
|
|
||||||
for end = i + 1; end < len(t.Syms); end++ {
|
|
||||||
if c := t.Syms[end].Type; c != 'Z' && c != 'z' {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
obj.Paths = t.Syms[i:end]
|
|
||||||
i = end - 1 // loop will i++
|
|
||||||
|
|
||||||
// Record file names
|
|
||||||
depth := 0
|
|
||||||
for j := range obj.Paths {
|
|
||||||
s := &obj.Paths[j]
|
|
||||||
if s.Name == "" {
|
|
||||||
depth--
|
|
||||||
} else {
|
|
||||||
if depth == 0 {
|
|
||||||
t.Files[s.Name] = obj
|
|
||||||
}
|
|
||||||
depth++
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
case 'T', 't', 'L', 'l': // text symbol
|
|
||||||
if n := len(t.Funcs); n > 0 {
|
|
||||||
t.Funcs[n-1].End = sym.Value
|
|
||||||
}
|
|
||||||
if sym.Name == "etext" {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
// Count parameter and local (auto) syms
|
|
||||||
var np, na int
|
|
||||||
var end int
|
|
||||||
countloop:
|
|
||||||
for end = i + 1; end < len(t.Syms); end++ {
|
|
||||||
switch t.Syms[end].Type {
|
|
||||||
case 'T', 't', 'L', 'l', 'Z', 'z':
|
|
||||||
break countloop
|
|
||||||
case 'p':
|
|
||||||
np++
|
|
||||||
case 'a':
|
|
||||||
na++
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Fill in the function symbol
|
|
||||||
n := len(t.Funcs)
|
|
||||||
t.Funcs = t.Funcs[0 : n+1]
|
|
||||||
fn := &t.Funcs[n]
|
|
||||||
sym.Func = fn
|
|
||||||
fn.Params = make([]*Sym, 0, np)
|
|
||||||
fn.Locals = make([]*Sym, 0, na)
|
|
||||||
fn.Sym = sym
|
|
||||||
fn.Entry = sym.Value
|
|
||||||
fn.Obj = obj
|
|
||||||
if t.go12line != nil {
|
|
||||||
// All functions share the same line table.
|
|
||||||
// It knows how to narrow down to a specific
|
|
||||||
// function quickly.
|
|
||||||
fn.LineTable = t.go12line
|
|
||||||
} else if pcln != nil {
|
|
||||||
fn.LineTable = pcln.slice(fn.Entry)
|
|
||||||
pcln = fn.LineTable
|
|
||||||
}
|
|
||||||
for j := i; j < end; j++ {
|
|
||||||
s := &t.Syms[j]
|
|
||||||
switch s.Type {
|
|
||||||
case 'm':
|
|
||||||
fn.FrameSize = int(s.Value)
|
|
||||||
case 'p':
|
|
||||||
n := len(fn.Params)
|
|
||||||
fn.Params = fn.Params[0 : n+1]
|
|
||||||
fn.Params[n] = s
|
|
||||||
case 'a':
|
|
||||||
n := len(fn.Locals)
|
|
||||||
fn.Locals = fn.Locals[0 : n+1]
|
|
||||||
fn.Locals[n] = s
|
|
||||||
}
|
|
||||||
}
|
|
||||||
i = end - 1 // loop will i++
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if t.go12line != nil && nf == 0 {
|
|
||||||
t.Funcs = t.go12line.go12Funcs()
|
|
||||||
}
|
|
||||||
if obj != nil {
|
|
||||||
obj.Funcs = t.Funcs[lastf:]
|
|
||||||
}
|
|
||||||
return &t, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// PCToFunc returns the function containing the program counter pc,
|
|
||||||
// or nil if there is no such function.
|
|
||||||
func (t *Table) PCToFunc(pc uint64) *Func {
|
|
||||||
funcs := t.Funcs
|
|
||||||
for len(funcs) > 0 {
|
|
||||||
m := len(funcs) / 2
|
|
||||||
fn := &funcs[m]
|
|
||||||
switch {
|
|
||||||
case pc < fn.Entry:
|
|
||||||
funcs = funcs[0:m]
|
|
||||||
case fn.Entry <= pc && pc < fn.End:
|
|
||||||
return fn
|
|
||||||
default:
|
|
||||||
funcs = funcs[m+1:]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// PCToLine looks up line number information for a program counter.
|
|
||||||
// If there is no information, it returns fn == nil.
|
|
||||||
func (t *Table) PCToLine(pc uint64) (file string, line int, fn *Func) {
|
|
||||||
if fn = t.PCToFunc(pc); fn == nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if t.go12line != nil {
|
|
||||||
file = t.go12line.go12PCToFile(pc)
|
|
||||||
line = t.go12line.go12PCToLine(pc)
|
|
||||||
} else {
|
|
||||||
file, line = fn.Obj.lineFromAline(fn.LineTable.PCToLine(pc))
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// PCToSPAdj returns the stack pointer adjustment for a program counter.
|
|
||||||
func (t *Table) PCToSPAdj(pc uint64) (spadj int) {
|
|
||||||
if fn := t.PCToFunc(pc); fn == nil {
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
if t.go12line != nil {
|
|
||||||
return t.go12line.go12PCToSPAdj(pc)
|
|
||||||
}
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
// LineToPC looks up the first program counter on the given line in
|
|
||||||
// the named file. It returns UnknownPathError or UnknownLineError if
|
|
||||||
// there is an error looking up this line.
|
|
||||||
func (t *Table) LineToPC(file string, line int) (pc uint64, fn *Func, err error) {
|
|
||||||
obj, ok := t.Files[file]
|
|
||||||
if !ok {
|
|
||||||
return 0, nil, UnknownFileError(file)
|
|
||||||
}
|
|
||||||
|
|
||||||
if t.go12line != nil {
|
|
||||||
pc := t.go12line.go12LineToPC(file, line)
|
|
||||||
if pc == 0 {
|
|
||||||
return 0, nil, &UnknownLineError{file, line}
|
|
||||||
}
|
|
||||||
return pc, t.PCToFunc(pc), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
abs, err := obj.alineFromLine(file, line)
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
for i := range obj.Funcs {
|
|
||||||
f := &obj.Funcs[i]
|
|
||||||
pc := f.LineTable.LineToPC(abs, f.End)
|
|
||||||
if pc != 0 {
|
|
||||||
return pc, f, nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 0, nil, &UnknownLineError{file, line}
|
|
||||||
}
|
|
||||||
|
|
||||||
// LookupSym returns the text, data, or bss symbol with the given name,
|
|
||||||
// or nil if no such symbol is found.
|
|
||||||
func (t *Table) LookupSym(name string) *Sym {
|
|
||||||
// TODO(austin) Maybe make a map
|
|
||||||
for i := range t.Syms {
|
|
||||||
s := &t.Syms[i]
|
|
||||||
switch s.Type {
|
|
||||||
case 'T', 't', 'L', 'l', 'D', 'd', 'B', 'b':
|
|
||||||
if s.Name == name {
|
|
||||||
return s
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// LookupFunc returns the text, data, or bss symbol with the given name,
|
|
||||||
// or nil if no such symbol is found.
|
|
||||||
func (t *Table) LookupFunc(name string) *Func {
|
|
||||||
for i := range t.Funcs {
|
|
||||||
f := &t.Funcs[i]
|
|
||||||
if f.Sym.Name == name {
|
|
||||||
return f
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// SymByAddr returns the text, data, or bss symbol starting at the given address.
|
|
||||||
func (t *Table) SymByAddr(addr uint64) *Sym {
|
|
||||||
for i := range t.Syms {
|
|
||||||
s := &t.Syms[i]
|
|
||||||
switch s.Type {
|
|
||||||
case 'T', 't', 'L', 'l', 'D', 'd', 'B', 'b':
|
|
||||||
if s.Value == addr {
|
|
||||||
return s
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Object files
|
|
||||||
*/
|
|
||||||
|
|
||||||
// This is legacy code for Go 1.1 and earlier, which used the
|
|
||||||
// Plan 9 format for pc-line tables. This code was never quite
|
|
||||||
// correct. It's probably very close, and it's usually correct, but
|
|
||||||
// we never quite found all the corner cases.
|
|
||||||
//
|
|
||||||
// Go 1.2 and later use a simpler format, documented at golang.org/s/go12symtab.
|
|
||||||
|
|
||||||
func (o *Obj) lineFromAline(aline int) (string, int) {
|
|
||||||
type stackEnt struct {
|
|
||||||
path string
|
|
||||||
start int
|
|
||||||
offset int
|
|
||||||
prev *stackEnt
|
|
||||||
}
|
|
||||||
|
|
||||||
noPath := &stackEnt{"", 0, 0, nil}
|
|
||||||
tos := noPath
|
|
||||||
|
|
||||||
pathloop:
|
|
||||||
for _, s := range o.Paths {
|
|
||||||
val := int(s.Value)
|
|
||||||
switch {
|
|
||||||
case val > aline:
|
|
||||||
break pathloop
|
|
||||||
|
|
||||||
case val == 1:
|
|
||||||
// Start a new stack
|
|
||||||
tos = &stackEnt{s.Name, val, 0, noPath}
|
|
||||||
|
|
||||||
case s.Name == "":
|
|
||||||
// Pop
|
|
||||||
if tos == noPath {
|
|
||||||
return "<malformed symbol table>", 0
|
|
||||||
}
|
|
||||||
tos.prev.offset += val - tos.start
|
|
||||||
tos = tos.prev
|
|
||||||
|
|
||||||
default:
|
|
||||||
// Push
|
|
||||||
tos = &stackEnt{s.Name, val, 0, tos}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if tos == noPath {
|
|
||||||
return "", 0
|
|
||||||
}
|
|
||||||
return tos.path, aline - tos.start - tos.offset + 1
|
|
||||||
}
|
|
||||||
|
|
||||||
func (o *Obj) alineFromLine(path string, line int) (int, error) {
|
|
||||||
if line < 1 {
|
|
||||||
return 0, &UnknownLineError{path, line}
|
|
||||||
}
|
|
||||||
|
|
||||||
for i, s := range o.Paths {
|
|
||||||
// Find this path
|
|
||||||
if s.Name != path {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
// Find this line at this stack level
|
|
||||||
depth := 0
|
|
||||||
var incstart int
|
|
||||||
line += int(s.Value)
|
|
||||||
pathloop:
|
|
||||||
for _, s := range o.Paths[i:] {
|
|
||||||
val := int(s.Value)
|
|
||||||
switch {
|
|
||||||
case depth == 1 && val >= line:
|
|
||||||
return line - 1, nil
|
|
||||||
|
|
||||||
case s.Name == "":
|
|
||||||
depth--
|
|
||||||
if depth == 0 {
|
|
||||||
break pathloop
|
|
||||||
} else if depth == 1 {
|
|
||||||
line += val - incstart
|
|
||||||
}
|
|
||||||
|
|
||||||
default:
|
|
||||||
if depth == 1 {
|
|
||||||
incstart = val
|
|
||||||
}
|
|
||||||
depth++
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 0, &UnknownLineError{path, line}
|
|
||||||
}
|
|
||||||
return 0, UnknownFileError(path)
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Errors
|
|
||||||
*/
|
|
||||||
|
|
||||||
// UnknownFileError represents a failure to find the specific file in
|
|
||||||
// the symbol table.
|
|
||||||
type UnknownFileError string
|
|
||||||
|
|
||||||
func (e UnknownFileError) Error() string { return "unknown file: " + string(e) }
|
|
||||||
|
|
||||||
// UnknownLineError represents a failure to map a line to a program
|
|
||||||
// counter, either because the line is beyond the bounds of the file
|
|
||||||
// or because there is no code on the given line.
|
|
||||||
type UnknownLineError struct {
|
|
||||||
File string
|
|
||||||
Line int
|
|
||||||
}
|
|
||||||
|
|
||||||
func (e *UnknownLineError) Error() string {
|
|
||||||
return "no code at " + e.File + ":" + strconv.Itoa(e.Line)
|
|
||||||
}
|
|
||||||
|
|
||||||
// DecodingError represents an error during the decoding of
|
|
||||||
// the symbol table.
|
|
||||||
type DecodingError struct {
|
|
||||||
off int
|
|
||||||
msg string
|
|
||||||
val interface{}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (e *DecodingError) Error() string {
|
|
||||||
msg := e.msg
|
|
||||||
if e.val != nil {
|
|
||||||
msg += fmt.Sprintf(" '%v'", e.val)
|
|
||||||
}
|
|
||||||
msg += fmt.Sprintf(" at byte %#x", e.off)
|
|
||||||
return msg
|
|
||||||
}
|
|
|
@ -1,29 +0,0 @@
|
||||||
module cloud.google.com/go
|
|
||||||
|
|
||||||
go 1.9
|
|
||||||
|
|
||||||
require (
|
|
||||||
cloud.google.com/go/datastore v1.0.0
|
|
||||||
github.com/golang/mock v1.3.1
|
|
||||||
github.com/golang/protobuf v1.3.2
|
|
||||||
github.com/google/btree v1.0.0
|
|
||||||
github.com/google/go-cmp v0.3.0
|
|
||||||
github.com/google/martian v2.1.0+incompatible
|
|
||||||
github.com/google/pprof v0.0.0-20190515194954-54271f7e092f
|
|
||||||
github.com/googleapis/gax-go/v2 v2.0.5
|
|
||||||
github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024
|
|
||||||
go.opencensus.io v0.22.0
|
|
||||||
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522
|
|
||||||
golang.org/x/lint v0.0.0-20190409202823-959b441ac422
|
|
||||||
golang.org/x/net v0.0.0-20190620200207-3b0461eec859
|
|
||||||
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45
|
|
||||||
golang.org/x/sync v0.0.0-20190423024810-112230192c58
|
|
||||||
golang.org/x/text v0.3.2
|
|
||||||
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4
|
|
||||||
golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0
|
|
||||||
google.golang.org/api v0.8.0
|
|
||||||
google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64
|
|
||||||
google.golang.org/grpc v1.21.1
|
|
||||||
honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a
|
|
||||||
rsc.io/binaryregexp v0.2.0
|
|
||||||
)
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
golang.org/x/sys v0.0.0-20210616094352-59db8d763f22 h1:RqytpXGR1iVNX7psjB3ff8y7sNFinVFvkx1c8SjBkio=
|
||||||
|
golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
|
@ -0,0 +1 @@
|
||||||
|
*.exe
|
|
@ -0,0 +1 @@
|
||||||
|
* @microsoft/containerplat
|
|
@ -0,0 +1,14 @@
|
||||||
|
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/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
|
||||||
|
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||||
|
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/sirupsen/logrus v1.7.0 h1:ShrD1U9pZB12TX0cVy0DtePoCH97K8EtX+mg7ZARUtM=
|
||||||
|
github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
|
||||||
|
github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w=
|
||||||
|
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
|
||||||
|
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037 h1:YyJpGZS1sBuBCzLAR1VEpK193GlqGZbnPFnPV/5Rsb4=
|
||||||
|
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c h1:VwygUrnw9jn88c4u8GD3rZQbqrP/tgas88tPUbBxQrk=
|
||||||
|
golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
@ -1,31 +0,0 @@
|
||||||
# Perks for Go (golang.org)
|
|
||||||
|
|
||||||
Perks contains the Go package quantile that computes approximate quantiles over
|
|
||||||
an unbounded data stream within low memory and CPU bounds.
|
|
||||||
|
|
||||||
For more information and examples, see:
|
|
||||||
http://godoc.org/github.com/bmizerany/perks
|
|
||||||
|
|
||||||
A very special thank you and shout out to Graham Cormode (Rutgers University),
|
|
||||||
Flip Korn (AT&T Labs–Research), S. Muthukrishnan (Rutgers University), and
|
|
||||||
Divesh Srivastava (AT&T Labs–Research) for their research and publication of
|
|
||||||
[Effective Computation of Biased Quantiles over Data Streams](http://www.cs.rutgers.edu/~muthu/bquant.pdf)
|
|
||||||
|
|
||||||
Thank you, also:
|
|
||||||
* Armon Dadgar (@armon)
|
|
||||||
* Andrew Gerrand (@nf)
|
|
||||||
* Brad Fitzpatrick (@bradfitz)
|
|
||||||
* Keith Rarick (@kr)
|
|
||||||
|
|
||||||
FAQ:
|
|
||||||
|
|
||||||
Q: Why not move the quantile package into the project root?
|
|
||||||
A: I want to add more packages to perks later.
|
|
||||||
|
|
||||||
Copyright (C) 2013 Blake Mizerany
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
|
@ -1,3 +0,0 @@
|
||||||
module github.com/beorn7/perks
|
|
||||||
|
|
||||||
go 1.11
|
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,8 @@
|
||||||
|
language: go
|
||||||
|
go:
|
||||||
|
- "1.x"
|
||||||
|
- master
|
||||||
|
env:
|
||||||
|
- TAGS=""
|
||||||
|
- TAGS="-tags purego"
|
||||||
|
script: go test $TAGS -v ./...
|
|
@ -0,0 +1,20 @@
|
||||||
|
linters:
|
||||||
|
enable:
|
||||||
|
- structcheck
|
||||||
|
- varcheck
|
||||||
|
- staticcheck
|
||||||
|
- unconvert
|
||||||
|
- gofmt
|
||||||
|
- goimports
|
||||||
|
- golint
|
||||||
|
- ineffassign
|
||||||
|
- vet
|
||||||
|
- unused
|
||||||
|
- misspell
|
||||||
|
disable:
|
||||||
|
- errcheck
|
||||||
|
|
||||||
|
run:
|
||||||
|
timeout: 3m
|
||||||
|
skip-dirs:
|
||||||
|
- vendor
|
|
@ -0,0 +1,4 @@
|
||||||
|
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
|
||||||
|
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||||
|
golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c h1:VwygUrnw9jn88c4u8GD3rZQbqrP/tgas88tPUbBxQrk=
|
||||||
|
golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
@ -1,332 +0,0 @@
|
||||||
![containerd banner](https://raw.githubusercontent.com/cncf/artwork/master/projects/containerd/horizontal/color/containerd-horizontal-color.png)
|
|
||||||
|
|
||||||
[![PkgGoDev](https://pkg.go.dev/badge/github.com/containerd/containerd)](https://pkg.go.dev/github.com/containerd/containerd)
|
|
||||||
[![Build Status](https://github.com/containerd/containerd/workflows/CI/badge.svg)](https://github.com/containerd/containerd/actions?query=workflow%3ACI)
|
|
||||||
[![Nightlies](https://github.com/containerd/containerd/workflows/Nightly/badge.svg)](https://github.com/containerd/containerd/actions?query=workflow%3ANightly)
|
|
||||||
[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bhttps%3A%2F%2Fgithub.com%2Fcontainerd%2Fcontainerd.svg?type=shield)](https://app.fossa.io/projects/git%2Bhttps%3A%2F%2Fgithub.com%2Fcontainerd%2Fcontainerd?ref=badge_shield)
|
|
||||||
[![Go Report Card](https://goreportcard.com/badge/github.com/containerd/containerd)](https://goreportcard.com/report/github.com/containerd/containerd)
|
|
||||||
[![CII Best Practices](https://bestpractices.coreinfrastructure.org/projects/1271/badge)](https://bestpractices.coreinfrastructure.org/projects/1271)
|
|
||||||
|
|
||||||
containerd is an industry-standard container runtime with an emphasis on simplicity, robustness and portability. It is available as a daemon for Linux and Windows, which can manage the complete container lifecycle of its host system: image transfer and storage, container execution and supervision, low-level storage and network attachments, etc.
|
|
||||||
|
|
||||||
containerd is a member of CNCF with ['graduated'](https://landscape.cncf.io/selected=containerd) status.
|
|
||||||
|
|
||||||
containerd is designed to be embedded into a larger system, rather than being used directly by developers or end-users.
|
|
||||||
|
|
||||||
![architecture](design/architecture.png)
|
|
||||||
|
|
||||||
## Now Recruiting
|
|
||||||
|
|
||||||
We are a large inclusive OSS project that is welcoming help of any kind shape or form:
|
|
||||||
* Documentation help is needed to make the product easier to consume and extend.
|
|
||||||
* We need OSS community outreach / organizing help to get the word out; manage
|
|
||||||
and create messaging and educational content; and to help with social media, community forums/groups, and google groups.
|
|
||||||
* We are actively inviting new [security advisors](https://github.com/containerd/project/blob/master/GOVERNANCE.md#security-advisors) to join the team.
|
|
||||||
* New sub-projects are being created, core and non-core that could use additional development help.
|
|
||||||
* Each of the [containerd projects](https://github.com/containerd) has a list of issues currently being worked on or that need help resolving.
|
|
||||||
- If the issue has not already been assigned to someone, or has not made recent progress and you are interested, please inquire.
|
|
||||||
- If you are interested in starting with a smaller / beginner level issue, look for issues with an `exp/beginner` tag, for example [containerd/containerd beginner issues.](https://github.com/containerd/containerd/issues?q=is%3Aissue+is%3Aopen+label%3Aexp%2Fbeginner)
|
|
||||||
|
|
||||||
## Getting Started
|
|
||||||
|
|
||||||
See our documentation on [containerd.io](https://containerd.io):
|
|
||||||
* [for ops and admins](docs/ops.md)
|
|
||||||
* [namespaces](docs/namespaces.md)
|
|
||||||
* [client options](docs/client-opts.md)
|
|
||||||
|
|
||||||
See how to build containerd from source at [BUILDING](BUILDING.md).
|
|
||||||
|
|
||||||
If you are interested in trying out containerd see our example at [Getting Started](docs/getting-started.md).
|
|
||||||
|
|
||||||
## Nightly builds
|
|
||||||
|
|
||||||
There are nightly builds available for download [here](https://github.com/containerd/containerd/actions?query=workflow%3ANightly).
|
|
||||||
Binaries are generated from `master` branch every night for `Linux` and `Windows`.
|
|
||||||
|
|
||||||
Please be aware: nightly builds might have critical bugs, it's not recommended for use in production and no support provided.
|
|
||||||
|
|
||||||
## Runtime Requirements
|
|
||||||
|
|
||||||
Runtime requirements for containerd are very minimal. Most interactions with
|
|
||||||
the Linux and Windows container feature sets are handled via [runc](https://github.com/opencontainers/runc) and/or
|
|
||||||
OS-specific libraries (e.g. [hcsshim](https://github.com/Microsoft/hcsshim) for Microsoft).
|
|
||||||
The current required version of `runc` is described in [RUNC.md](docs/RUNC.md).
|
|
||||||
|
|
||||||
There are specific features
|
|
||||||
used by containerd core code and snapshotters that will require a minimum kernel
|
|
||||||
version on Linux. With the understood caveat of distro kernel versioning, a
|
|
||||||
reasonable starting point for Linux is a minimum 4.x kernel version.
|
|
||||||
|
|
||||||
The overlay filesystem snapshotter, used by default, uses features that were
|
|
||||||
finalized in the 4.x kernel series. If you choose to use btrfs, there may
|
|
||||||
be more flexibility in kernel version (minimum recommended is 3.18), but will
|
|
||||||
require the btrfs kernel module and btrfs tools to be installed on your Linux
|
|
||||||
distribution.
|
|
||||||
|
|
||||||
To use Linux checkpoint and restore features, you will need `criu` installed on
|
|
||||||
your system. See more details in [Checkpoint and Restore](#checkpoint-and-restore).
|
|
||||||
|
|
||||||
Build requirements for developers are listed in [BUILDING](BUILDING.md).
|
|
||||||
|
|
||||||
## Features
|
|
||||||
|
|
||||||
### Client
|
|
||||||
|
|
||||||
containerd offers a full client package to help you integrate containerd into your platform.
|
|
||||||
|
|
||||||
```go
|
|
||||||
|
|
||||||
import (
|
|
||||||
"github.com/containerd/containerd"
|
|
||||||
"github.com/containerd/containerd/cio"
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
client, err := containerd.New("/run/containerd/containerd.sock")
|
|
||||||
defer client.Close()
|
|
||||||
}
|
|
||||||
|
|
||||||
```
|
|
||||||
|
|
||||||
### Namespaces
|
|
||||||
|
|
||||||
Namespaces allow multiple consumers to use the same containerd without conflicting with each other. It has the benefit of sharing content but still having separation with containers and images.
|
|
||||||
|
|
||||||
To set a namespace for requests to the API:
|
|
||||||
|
|
||||||
```go
|
|
||||||
context = context.Background()
|
|
||||||
// create a context for docker
|
|
||||||
docker = namespaces.WithNamespace(context, "docker")
|
|
||||||
|
|
||||||
containerd, err := client.NewContainer(docker, "id")
|
|
||||||
```
|
|
||||||
|
|
||||||
To set a default namespace on the client:
|
|
||||||
|
|
||||||
```go
|
|
||||||
client, err := containerd.New(address, containerd.WithDefaultNamespace("docker"))
|
|
||||||
```
|
|
||||||
|
|
||||||
### Distribution
|
|
||||||
|
|
||||||
```go
|
|
||||||
// pull an image
|
|
||||||
image, err := client.Pull(context, "docker.io/library/redis:latest")
|
|
||||||
|
|
||||||
// push an image
|
|
||||||
err := client.Push(context, "docker.io/library/redis:latest", image.Target())
|
|
||||||
```
|
|
||||||
|
|
||||||
### Containers
|
|
||||||
|
|
||||||
In containerd, a container is a metadata object. Resources such as an OCI runtime specification, image, root filesystem, and other metadata can be attached to a container.
|
|
||||||
|
|
||||||
```go
|
|
||||||
redis, err := client.NewContainer(context, "redis-master")
|
|
||||||
defer redis.Delete(context)
|
|
||||||
```
|
|
||||||
|
|
||||||
### OCI Runtime Specification
|
|
||||||
|
|
||||||
containerd fully supports the OCI runtime specification for running containers. We have built in functions to help you generate runtime specifications based on images as well as custom parameters.
|
|
||||||
|
|
||||||
You can specify options when creating a container about how to modify the specification.
|
|
||||||
|
|
||||||
```go
|
|
||||||
redis, err := client.NewContainer(context, "redis-master", containerd.WithNewSpec(oci.WithImageConfig(image)))
|
|
||||||
```
|
|
||||||
|
|
||||||
### Root Filesystems
|
|
||||||
|
|
||||||
containerd allows you to use overlay or snapshot filesystems with your containers. It comes with built in support for overlayfs and btrfs.
|
|
||||||
|
|
||||||
```go
|
|
||||||
// pull an image and unpack it into the configured snapshotter
|
|
||||||
image, err := client.Pull(context, "docker.io/library/redis:latest", containerd.WithPullUnpack)
|
|
||||||
|
|
||||||
// allocate a new RW root filesystem for a container based on the image
|
|
||||||
redis, err := client.NewContainer(context, "redis-master",
|
|
||||||
containerd.WithNewSnapshot("redis-rootfs", image),
|
|
||||||
containerd.WithNewSpec(oci.WithImageConfig(image)),
|
|
||||||
)
|
|
||||||
|
|
||||||
// use a readonly filesystem with multiple containers
|
|
||||||
for i := 0; i < 10; i++ {
|
|
||||||
id := fmt.Sprintf("id-%s", i)
|
|
||||||
container, err := client.NewContainer(ctx, id,
|
|
||||||
containerd.WithNewSnapshotView(id, image),
|
|
||||||
containerd.WithNewSpec(oci.WithImageConfig(image)),
|
|
||||||
)
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
### Tasks
|
|
||||||
|
|
||||||
Taking a container object and turning it into a runnable process on a system is done by creating a new `Task` from the container. A task represents the runnable object within containerd.
|
|
||||||
|
|
||||||
```go
|
|
||||||
// create a new task
|
|
||||||
task, err := redis.NewTask(context, cio.NewCreator(cio.WithStdio))
|
|
||||||
defer task.Delete(context)
|
|
||||||
|
|
||||||
// the task is now running and has a pid that can be used to setup networking
|
|
||||||
// or other runtime settings outside of containerd
|
|
||||||
pid := task.Pid()
|
|
||||||
|
|
||||||
// start the redis-server process inside the container
|
|
||||||
err := task.Start(context)
|
|
||||||
|
|
||||||
// wait for the task to exit and get the exit status
|
|
||||||
status, err := task.Wait(context)
|
|
||||||
```
|
|
||||||
|
|
||||||
### Checkpoint and Restore
|
|
||||||
|
|
||||||
If you have [criu](https://criu.org/Main_Page) installed on your machine you can checkpoint and restore containers and their tasks. This allows you to clone and/or live migrate containers to other machines.
|
|
||||||
|
|
||||||
```go
|
|
||||||
// checkpoint the task then push it to a registry
|
|
||||||
checkpoint, err := task.Checkpoint(context)
|
|
||||||
|
|
||||||
err := client.Push(context, "myregistry/checkpoints/redis:master", checkpoint)
|
|
||||||
|
|
||||||
// on a new machine pull the checkpoint and restore the redis container
|
|
||||||
checkpoint, err := client.Pull(context, "myregistry/checkpoints/redis:master")
|
|
||||||
|
|
||||||
redis, err = client.NewContainer(context, "redis-master", containerd.WithNewSnapshot("redis-rootfs", checkpoint))
|
|
||||||
defer container.Delete(context)
|
|
||||||
|
|
||||||
task, err = redis.NewTask(context, cio.NewCreator(cio.WithStdio), containerd.WithTaskCheckpoint(checkpoint))
|
|
||||||
defer task.Delete(context)
|
|
||||||
|
|
||||||
err := task.Start(context)
|
|
||||||
```
|
|
||||||
|
|
||||||
### Snapshot Plugins
|
|
||||||
|
|
||||||
In addition to the built-in Snapshot plugins in containerd, additional external
|
|
||||||
plugins can be configured using GRPC. An external plugin is made available using
|
|
||||||
the configured name and appears as a plugin alongside the built-in ones.
|
|
||||||
|
|
||||||
To add an external snapshot plugin, add the plugin to containerd's config file
|
|
||||||
(by default at `/etc/containerd/config.toml`). The string following
|
|
||||||
`proxy_plugin.` will be used as the name of the snapshotter and the address
|
|
||||||
should refer to a socket with a GRPC listener serving containerd's Snapshot
|
|
||||||
GRPC API. Remember to restart containerd for any configuration changes to take
|
|
||||||
effect.
|
|
||||||
|
|
||||||
```
|
|
||||||
[proxy_plugins]
|
|
||||||
[proxy_plugins.customsnapshot]
|
|
||||||
type = "snapshot"
|
|
||||||
address = "/var/run/mysnapshotter.sock"
|
|
||||||
```
|
|
||||||
|
|
||||||
See [PLUGINS.md](/docs/PLUGINS.md) for how to create plugins
|
|
||||||
|
|
||||||
### Releases and API Stability
|
|
||||||
|
|
||||||
Please see [RELEASES.md](RELEASES.md) for details on versioning and stability
|
|
||||||
of containerd components.
|
|
||||||
|
|
||||||
Downloadable 64-bit Intel/AMD binaries of all official releases are available on
|
|
||||||
our [releases page](https://github.com/containerd/containerd/releases).
|
|
||||||
|
|
||||||
For other architectures and distribution support, you will find that many
|
|
||||||
Linux distributions package their own containerd and provide it across several
|
|
||||||
architectures, such as [Canonical's Ubuntu packaging](https://launchpad.net/ubuntu/bionic/+package/containerd).
|
|
||||||
|
|
||||||
#### Enabling command auto-completion
|
|
||||||
|
|
||||||
Starting with containerd 1.4, the urfave client feature for auto-creation of bash and zsh
|
|
||||||
autocompletion data is enabled. To use the autocomplete feature in a bash shell for example, source
|
|
||||||
the autocomplete/ctr file in your `.bashrc`, or manually like:
|
|
||||||
|
|
||||||
```
|
|
||||||
$ source ./contrib/autocomplete/ctr
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Distribution of `ctr` autocomplete for bash and zsh
|
|
||||||
|
|
||||||
For bash, copy the `contrib/autocomplete/ctr` script into
|
|
||||||
`/etc/bash_completion.d/` and rename it to `ctr`. The `zsh_autocomplete`
|
|
||||||
file is also available and can be used similarly for zsh users.
|
|
||||||
|
|
||||||
Provide documentation to users to `source` this file into their shell if
|
|
||||||
you don't place the autocomplete file in a location where it is automatically
|
|
||||||
loaded for the user's shell environment.
|
|
||||||
|
|
||||||
### CRI
|
|
||||||
|
|
||||||
`cri` is a [containerd](https://containerd.io/) plugin implementation of the Kubernetes [container runtime interface (CRI)](https://github.com/kubernetes/cri-api/blob/master/pkg/apis/runtime/v1alpha2/api.proto). With it, you are able to use containerd as the container runtime for a Kubernetes cluster.
|
|
||||||
|
|
||||||
![cri](./docs/cri/cri.png)
|
|
||||||
|
|
||||||
#### CRI Status
|
|
||||||
|
|
||||||
`cri` is a native plugin of containerd. Since containerd 1.1, the cri plugin is built into the release binaries and enabled by default.
|
|
||||||
|
|
||||||
> **Note:** As of containerd 1.5, the `cri` plugin is merged into the containerd/containerd repo. For example, the source code previously stored under [`containerd/cri/pkg`](https://github.com/containerd/cri/tree/release/1.4/pkg)
|
|
||||||
was moved to [`containerd/containerd/pkg/cri` package](https://github.com/containerd/containerd/tree/master/pkg/cri).
|
|
||||||
|
|
||||||
The `cri` plugin has reached GA status, representing that it is:
|
|
||||||
* Feature complete
|
|
||||||
* Works with Kubernetes 1.10 and above
|
|
||||||
* Passes all [CRI validation tests](https://github.com/kubernetes/community/blob/master/contributors/devel/sig-node/cri-validation.md).
|
|
||||||
* Passes all [node e2e tests](https://github.com/kubernetes/community/blob/master/contributors/devel/sig-node/e2e-node-tests.md).
|
|
||||||
* Passes all [e2e tests](https://github.com/kubernetes/community/blob/master/contributors/devel/sig-testing/e2e-tests.md).
|
|
||||||
|
|
||||||
See results on the containerd k8s [test dashboard](https://k8s-testgrid.appspot.com/sig-node-containerd)
|
|
||||||
|
|
||||||
#### Validating Your `cri` Setup
|
|
||||||
A Kubernetes incubator project, [cri-tools](https://github.com/kubernetes-sigs/cri-tools), includes programs for exercising CRI implementations. More importantly, cri-tools includes the program `critest` which is used for running [CRI Validation Testing](https://github.com/kubernetes/community/blob/master/contributors/devel/sig-node/cri-validation.md).
|
|
||||||
|
|
||||||
#### CRI Guides
|
|
||||||
* [Installing with Ansible and Kubeadm](contrib/ansible/README.md)
|
|
||||||
* [For Non-Ansible Users, Preforming a Custom Installation Using the Release Tarball and Kubeadm](docs/cri/installation.md)
|
|
||||||
* [CRI Plugin Testing Guide](./docs/cri/testing.md)
|
|
||||||
* [Debugging Pods, Containers, and Images with `crictl`](./docs/cri/crictl.md)
|
|
||||||
* [Configuring `cri` Plugins](./docs/cri/config.md)
|
|
||||||
* [Configuring containerd](https://github.com/containerd/containerd/blob/master/docs/man/containerd-config.8.md)
|
|
||||||
|
|
||||||
### Communication
|
|
||||||
|
|
||||||
For async communication and long running discussions please use issues and pull requests on the github repo.
|
|
||||||
This will be the best place to discuss design and implementation.
|
|
||||||
|
|
||||||
For sync communication catch us in the `#containerd` and `#containerd-dev` slack channels on Cloud Native Computing Foundation's (CNCF) slack - `cloud-native.slack.com`. Everyone is welcome to join and chat. [Get Invite to CNCF slack.](https://slack.cncf.io)
|
|
||||||
|
|
||||||
### Security audit
|
|
||||||
|
|
||||||
A third party security audit was performed by Cure53 in 4Q2018; the [full report](docs/SECURITY_AUDIT.pdf) is available in our docs/ directory.
|
|
||||||
|
|
||||||
### Reporting security issues
|
|
||||||
|
|
||||||
__If you are reporting a security issue, please reach out discreetly at security@containerd.io__.
|
|
||||||
|
|
||||||
## Licenses
|
|
||||||
|
|
||||||
The containerd codebase is released under the [Apache 2.0 license](LICENSE).
|
|
||||||
The README.md file, and files in the "docs" folder are licensed under the
|
|
||||||
Creative Commons Attribution 4.0 International License. You may obtain a
|
|
||||||
copy of the license, titled CC-BY-4.0, at http://creativecommons.org/licenses/by/4.0/.
|
|
||||||
|
|
||||||
## Project details
|
|
||||||
|
|
||||||
**containerd** is the primary open source project within the broader containerd GitHub repository.
|
|
||||||
However, all projects within the repo have common maintainership, governance, and contributing
|
|
||||||
guidelines which are stored in a `project` repository commonly for all containerd projects.
|
|
||||||
|
|
||||||
Please find all these core project documents, including the:
|
|
||||||
* [Project governance](https://github.com/containerd/project/blob/master/GOVERNANCE.md),
|
|
||||||
* [Maintainers](https://github.com/containerd/project/blob/master/MAINTAINERS),
|
|
||||||
* and [Contributing guidelines](https://github.com/containerd/project/blob/master/CONTRIBUTING.md)
|
|
||||||
|
|
||||||
information in our [`containerd/project`](https://github.com/containerd/project) repository.
|
|
||||||
|
|
||||||
## Adoption
|
|
||||||
|
|
||||||
Interested to see who is using containerd? Are you using containerd in a project?
|
|
||||||
Please add yourself via pull request to our [ADOPTERS.md](./ADOPTERS.md) file.
|
|
|
@ -1,18 +0,0 @@
|
||||||
This directory contains the GRPC API definitions for containerd.
|
|
||||||
|
|
||||||
All defined services and messages have been aggregated into `*.pb.txt`
|
|
||||||
descriptors files in this directory. Definitions present here are considered
|
|
||||||
frozen after the release.
|
|
||||||
|
|
||||||
At release time, the current `next.pb.txt` file will be moved into place to
|
|
||||||
freeze the API changes for the minor version. For example, when 1.0.0 is
|
|
||||||
released, `next.pb.txt` should be moved to `1.0.txt`. Notice that we leave off
|
|
||||||
the patch number, since the API will be completely locked down for a given
|
|
||||||
patch series.
|
|
||||||
|
|
||||||
We may find that by default, protobuf descriptors are too noisy to lock down
|
|
||||||
API changes. In that case, we may filter out certain fields in the descriptors,
|
|
||||||
possibly regenerating for old versions.
|
|
||||||
|
|
||||||
This process is similar to the [process used to ensure backwards compatibility
|
|
||||||
in Go](https://github.com/golang/go/tree/master/api).
|
|
|
@ -1,82 +0,0 @@
|
||||||
module github.com/containerd/containerd
|
|
||||||
|
|
||||||
go 1.16
|
|
||||||
|
|
||||||
require (
|
|
||||||
github.com/Microsoft/go-winio v0.4.17
|
|
||||||
github.com/Microsoft/hcsshim v0.8.18
|
|
||||||
github.com/containerd/aufs v1.0.0
|
|
||||||
github.com/containerd/btrfs v1.0.0
|
|
||||||
github.com/containerd/cgroups v1.0.1
|
|
||||||
github.com/containerd/console v1.0.2
|
|
||||||
github.com/containerd/continuity v0.1.0
|
|
||||||
github.com/containerd/fifo v1.0.0
|
|
||||||
github.com/containerd/go-cni v1.0.2
|
|
||||||
github.com/containerd/go-runc v1.0.0
|
|
||||||
github.com/containerd/imgcrypt v1.1.1
|
|
||||||
github.com/containerd/nri v0.1.0
|
|
||||||
github.com/containerd/ttrpc v1.0.2
|
|
||||||
github.com/containerd/typeurl v1.0.2
|
|
||||||
github.com/containerd/zfs v1.0.0
|
|
||||||
github.com/containernetworking/plugins v0.9.1
|
|
||||||
github.com/coreos/go-systemd/v22 v22.3.2
|
|
||||||
github.com/davecgh/go-spew v1.1.1
|
|
||||||
github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c
|
|
||||||
github.com/docker/go-metrics v0.0.1
|
|
||||||
github.com/docker/go-units v0.4.0
|
|
||||||
github.com/emicklei/go-restful v2.9.5+incompatible
|
|
||||||
github.com/fsnotify/fsnotify v1.4.9
|
|
||||||
github.com/gogo/googleapis v1.4.0
|
|
||||||
github.com/gogo/protobuf v1.3.2
|
|
||||||
github.com/golang/protobuf v1.5.0
|
|
||||||
github.com/google/go-cmp v0.5.5
|
|
||||||
github.com/google/uuid v1.2.0
|
|
||||||
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0
|
|
||||||
github.com/hashicorp/go-multierror v1.0.0
|
|
||||||
github.com/imdario/mergo v0.3.11
|
|
||||||
github.com/klauspost/compress v1.11.13
|
|
||||||
github.com/moby/locker v1.0.1
|
|
||||||
github.com/moby/sys/mountinfo v0.4.1
|
|
||||||
github.com/moby/sys/symlink v0.1.0
|
|
||||||
github.com/opencontainers/go-digest v1.0.0
|
|
||||||
github.com/opencontainers/image-spec v1.0.1
|
|
||||||
github.com/opencontainers/runc v1.0.1
|
|
||||||
github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417
|
|
||||||
github.com/opencontainers/selinux v1.8.2
|
|
||||||
github.com/pelletier/go-toml v1.8.1
|
|
||||||
github.com/pkg/errors v0.9.1
|
|
||||||
github.com/prometheus/client_golang v1.7.1
|
|
||||||
github.com/prometheus/procfs v0.6.0 // indirect; temporarily force v0.6.0, which was previously defined in imgcrypt as explicit version
|
|
||||||
github.com/satori/go.uuid v1.2.0 // indirect
|
|
||||||
github.com/sirupsen/logrus v1.8.1
|
|
||||||
github.com/stretchr/testify v1.6.1
|
|
||||||
github.com/tchap/go-patricia v2.2.6+incompatible
|
|
||||||
github.com/urfave/cli v1.22.2
|
|
||||||
go.etcd.io/bbolt v1.3.5
|
|
||||||
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110
|
|
||||||
golang.org/x/sync v0.0.0-20201207232520-09787c993a3a
|
|
||||||
golang.org/x/sys v0.0.0-20210426230700-d19ff857e887
|
|
||||||
google.golang.org/grpc v1.33.2
|
|
||||||
gotest.tools/v3 v3.0.3
|
|
||||||
k8s.io/api v0.20.6
|
|
||||||
k8s.io/apimachinery v0.20.6
|
|
||||||
k8s.io/apiserver v0.20.6
|
|
||||||
k8s.io/client-go v0.20.6
|
|
||||||
k8s.io/component-base v0.20.6
|
|
||||||
k8s.io/cri-api v0.20.6
|
|
||||||
k8s.io/klog/v2 v2.4.0
|
|
||||||
k8s.io/utils v0.0.0-20201110183641-67b214c5f920
|
|
||||||
)
|
|
||||||
|
|
||||||
// When updating replace rules, make sure to also update the rules in integration/client/go.mod
|
|
||||||
replace (
|
|
||||||
// prevent transitional dependencies due to containerd having a circular
|
|
||||||
// dependency on itself through plugins. see .empty-mod/go.mod for details
|
|
||||||
github.com/containerd/containerd => ./.empty-mod/
|
|
||||||
github.com/gogo/googleapis => github.com/gogo/googleapis v1.3.2
|
|
||||||
github.com/golang/protobuf => github.com/golang/protobuf v1.3.5
|
|
||||||
// urfave/cli must be <= v1.22.1 due to a regression: https://github.com/urfave/cli/issues/1092
|
|
||||||
github.com/urfave/cli => github.com/urfave/cli v1.22.1
|
|
||||||
google.golang.org/genproto => google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63
|
|
||||||
google.golang.org/grpc => google.golang.org/grpc v1.27.1
|
|
||||||
)
|
|
|
@ -0,0 +1,40 @@
|
||||||
|
Aaron Lehmann <aaron.lehmann@docker.com>
|
||||||
|
Akash Gupta <akagup@microsoft.com>
|
||||||
|
Akihiro Suda <akihiro.suda.cz@hco.ntt.co.jp>
|
||||||
|
Akihiro Suda <suda.akihiro@lab.ntt.co.jp>
|
||||||
|
Akihiro Suda <suda.kyoto@gmail.com>
|
||||||
|
Andrew Pennebaker <apennebaker@datapipe.com>
|
||||||
|
Brandon Philips <brandon.philips@coreos.com>
|
||||||
|
Brian Goff <cpuguy83@gmail.com>
|
||||||
|
Christopher Jones <tophj@linux.vnet.ibm.com>
|
||||||
|
Daniel, Dao Quang Minh <dqminh89@gmail.com>
|
||||||
|
Darren Stahl <darst@microsoft.com>
|
||||||
|
Derek McGowan <derek@mcg.dev>
|
||||||
|
Derek McGowan <derek@mcgstyle.net>
|
||||||
|
Edward Pilatowicz <edward.pilatowicz@oracle.com>
|
||||||
|
Ian Campbell <ijc@docker.com>
|
||||||
|
Ivan Markin <sw@nogoegst.net>
|
||||||
|
Justin Cormack <justin.cormack@docker.com>
|
||||||
|
Justin Cummins <sul3n3t@gmail.com>
|
||||||
|
Kasper Fabæch Brandt <poizan@poizan.dk>
|
||||||
|
Kir Kolyshkin <kolyshkin@gmail.com>
|
||||||
|
Michael Crosby <crosbymichael@gmail.com>
|
||||||
|
Michael Crosby <michael@thepasture.io>
|
||||||
|
Michael Wan <zirenwan@gmail.com>
|
||||||
|
Mike Brown <brownwm@us.ibm.com>
|
||||||
|
Niels de Vos <ndevos@redhat.com>
|
||||||
|
Phil Estes <estesp@gmail.com>
|
||||||
|
Phil Estes <estesp@linux.vnet.ibm.com>
|
||||||
|
Samuel Karp <me@samuelkarp.com>
|
||||||
|
Sam Whited <sam@samwhited.com>
|
||||||
|
Sebastiaan van Stijn <github@gone.nl>
|
||||||
|
Shengjing Zhu <zhsj@debian.org>
|
||||||
|
Stephen J Day <stephen.day@docker.com>
|
||||||
|
Tibor Vass <tibor@docker.com>
|
||||||
|
Tobias Klauser <tklauser@distanz.ch>
|
||||||
|
Tom Faulhaber <tffaulha@amazon.com>
|
||||||
|
Tonis Tiigi <tonistiigi@gmail.com>
|
||||||
|
Trevor Porter <trkporter@ucdavis.edu>
|
||||||
|
Wei Fu <fuweid89@gmail.com>
|
||||||
|
Wilbert van de Ridder <wilbert.ridder@gmail.com>
|
||||||
|
Xiaodong Ye <xiaodongy@vmware.com>
|
|
@ -1,88 +0,0 @@
|
||||||
# continuity
|
|
||||||
|
|
||||||
[![GoDoc](https://godoc.org/github.com/containerd/continuity?status.svg)](https://godoc.org/github.com/containerd/continuity)
|
|
||||||
[![Build Status](https://travis-ci.org/containerd/continuity.svg?branch=master)](https://travis-ci.org/containerd/continuity)
|
|
||||||
|
|
||||||
A transport-agnostic, filesystem metadata manifest system
|
|
||||||
|
|
||||||
This project is a staging area for experiments in providing transport agnostic
|
|
||||||
metadata storage.
|
|
||||||
|
|
||||||
Please see https://github.com/opencontainers/specs/issues/11 for more details.
|
|
||||||
|
|
||||||
## Manifest Format
|
|
||||||
|
|
||||||
A continuity manifest encodes filesystem metadata in Protocol Buffers.
|
|
||||||
Please refer to [proto/manifest.proto](proto/manifest.proto).
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
Build:
|
|
||||||
|
|
||||||
```console
|
|
||||||
$ make
|
|
||||||
```
|
|
||||||
|
|
||||||
Create a manifest (of this repo itself):
|
|
||||||
|
|
||||||
```console
|
|
||||||
$ ./bin/continuity build . > /tmp/a.pb
|
|
||||||
```
|
|
||||||
|
|
||||||
Dump a manifest:
|
|
||||||
|
|
||||||
```console
|
|
||||||
$ ./bin/continuity ls /tmp/a.pb
|
|
||||||
...
|
|
||||||
-rw-rw-r-- 270 B /.gitignore
|
|
||||||
-rw-rw-r-- 88 B /.mailmap
|
|
||||||
-rw-rw-r-- 187 B /.travis.yml
|
|
||||||
-rw-rw-r-- 359 B /AUTHORS
|
|
||||||
-rw-rw-r-- 11 kB /LICENSE
|
|
||||||
-rw-rw-r-- 1.5 kB /Makefile
|
|
||||||
...
|
|
||||||
-rw-rw-r-- 986 B /testutil_test.go
|
|
||||||
drwxrwxr-x 0 B /version
|
|
||||||
-rw-rw-r-- 478 B /version/version.go
|
|
||||||
```
|
|
||||||
|
|
||||||
Verify a manifest:
|
|
||||||
|
|
||||||
```console
|
|
||||||
$ ./bin/continuity verify . /tmp/a.pb
|
|
||||||
```
|
|
||||||
|
|
||||||
Break the directory and restore using the manifest:
|
|
||||||
```console
|
|
||||||
$ chmod 777 Makefile
|
|
||||||
$ ./bin/continuity verify . /tmp/a.pb
|
|
||||||
2017/06/23 08:00:34 error verifying manifest: resource "/Makefile" has incorrect mode: -rwxrwxrwx != -rw-rw-r--
|
|
||||||
$ ./bin/continuity apply . /tmp/a.pb
|
|
||||||
$ stat -c %a Makefile
|
|
||||||
664
|
|
||||||
$ ./bin/continuity verify . /tmp/a.pb
|
|
||||||
```
|
|
||||||
|
|
||||||
## Platforms
|
|
||||||
|
|
||||||
continuity primarily targets Linux. continuity may compile for and work on
|
|
||||||
other operating systems, but those platforms are not tested.
|
|
||||||
|
|
||||||
## Contribution Guide
|
|
||||||
### Building Proto Package
|
|
||||||
|
|
||||||
If you change the proto file you will need to rebuild the generated Go with `go generate`.
|
|
||||||
|
|
||||||
```console
|
|
||||||
$ go generate ./proto
|
|
||||||
```
|
|
||||||
|
|
||||||
## Project details
|
|
||||||
|
|
||||||
continuity is a containerd sub-project, licensed under the [Apache 2.0 license](./LICENSE).
|
|
||||||
As a containerd sub-project, you will find the:
|
|
||||||
* [Project governance](https://github.com/containerd/project/blob/master/GOVERNANCE.md),
|
|
||||||
* [Maintainers](https://github.com/containerd/project/blob/master/MAINTAINERS),
|
|
||||||
* and [Contributing guidelines](https://github.com/containerd/project/blob/master/CONTRIBUTING.md)
|
|
||||||
|
|
||||||
information in our [`containerd/project`](https://github.com/containerd/project) repository.
|
|
|
@ -1,15 +0,0 @@
|
||||||
module github.com/containerd/continuity
|
|
||||||
|
|
||||||
go 1.13
|
|
||||||
|
|
||||||
require (
|
|
||||||
bazil.org/fuse v0.0.0-20160811212531-371fbbdaa898
|
|
||||||
github.com/dustin/go-humanize v1.0.0
|
|
||||||
github.com/golang/protobuf v1.3.5
|
|
||||||
github.com/opencontainers/go-digest v1.0.0
|
|
||||||
github.com/pkg/errors v0.9.1
|
|
||||||
github.com/sirupsen/logrus v1.7.0
|
|
||||||
github.com/spf13/cobra v1.0.0
|
|
||||||
golang.org/x/sync v0.0.0-20201207232520-09787c993a3a
|
|
||||||
golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c
|
|
||||||
)
|
|
|
@ -0,0 +1,52 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Copyright The containerd Authors.
|
||||||
|
|
||||||
|
# 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 -e
|
||||||
|
|
||||||
|
mksyscall="$(go env GOROOT)/src/syscall/mksyscall.pl"
|
||||||
|
|
||||||
|
fix() {
|
||||||
|
sed 's,^package syscall$,package sysx,' \
|
||||||
|
| sed 's,^import "unsafe"$,import (\n\t"syscall"\n\t"unsafe"\n),' \
|
||||||
|
| gofmt -r='BytePtrFromString -> syscall.BytePtrFromString' \
|
||||||
|
| gofmt -r='Syscall6 -> syscall.Syscall6' \
|
||||||
|
| gofmt -r='Syscall -> syscall.Syscall' \
|
||||||
|
| gofmt -r='SYS_GETXATTR -> syscall.SYS_GETXATTR' \
|
||||||
|
| gofmt -r='SYS_LISTXATTR -> syscall.SYS_LISTXATTR' \
|
||||||
|
| gofmt -r='SYS_SETXATTR -> syscall.SYS_SETXATTR' \
|
||||||
|
| gofmt -r='SYS_REMOVEXATTR -> syscall.SYS_REMOVEXATTR' \
|
||||||
|
| gofmt -r='SYS_LGETXATTR -> syscall.SYS_LGETXATTR' \
|
||||||
|
| gofmt -r='SYS_LLISTXATTR -> syscall.SYS_LLISTXATTR' \
|
||||||
|
| gofmt -r='SYS_LSETXATTR -> syscall.SYS_LSETXATTR' \
|
||||||
|
| gofmt -r='SYS_LREMOVEXATTR -> syscall.SYS_LREMOVEXATTR'
|
||||||
|
}
|
||||||
|
|
||||||
|
if [ "$GOARCH" == "" ] || [ "$GOOS" == "" ]; then
|
||||||
|
echo "Must specify \$GOARCH and \$GOOS"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
mkargs=""
|
||||||
|
|
||||||
|
if [ "$GOARCH" == "386" ] || [ "$GOARCH" == "arm" ]; then
|
||||||
|
mkargs="-l32"
|
||||||
|
fi
|
||||||
|
|
||||||
|
for f in "$@"; do
|
||||||
|
$mksyscall $mkargs "${f}_${GOOS}.go" | fix > "${f}_${GOOS}_${GOARCH}.go"
|
||||||
|
done
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
*.test
|
||||||
|
coverage.txt
|
|
@ -0,0 +1,33 @@
|
||||||
|
github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
|
||||||
|
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
|
||||||
|
github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
|
||||||
|
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
|
||||||
|
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
|
||||||
|
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||||
|
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||||
|
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||||
|
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||||
|
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||||
|
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||||
|
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||||
|
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||||
|
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||||
|
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
|
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
|
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
||||||
|
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
|
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
|
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
|
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
|
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
|
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||||
|
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||||
|
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||||
|
golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
|
||||||
|
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
|
||||||
|
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
|
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
|
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
|
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
|
@ -1,161 +0,0 @@
|
||||||
# etcd
|
|
||||||
|
|
||||||
[![Go Report Card](https://goreportcard.com/badge/github.com/coreos/etcd?style=flat-square)](https://goreportcard.com/report/github.com/coreos/etcd)
|
|
||||||
[![Coverage](https://codecov.io/gh/coreos/etcd/branch/master/graph/badge.svg)](https://codecov.io/gh/coreos/etcd)
|
|
||||||
[![Build Status Travis](https://img.shields.io/travis/coreos/etcdlabs.svg?style=flat-square&&branch=master)](https://travis-ci.org/coreos/etcd)
|
|
||||||
[![Build Status Semaphore](https://semaphoreci.com/api/v1/coreos/etcd/branches/master/shields_badge.svg)](https://semaphoreci.com/coreos/etcd)
|
|
||||||
[![Godoc](http://img.shields.io/badge/go-documentation-blue.svg?style=flat-square)](https://godoc.org/github.com/coreos/etcd)
|
|
||||||
[![Releases](https://img.shields.io/github/release/coreos/etcd/all.svg?style=flat-square)](https://github.com/coreos/etcd/releases)
|
|
||||||
[![LICENSE](https://img.shields.io/github/license/coreos/etcd.svg?style=flat-square)](https://github.com/coreos/etcd/blob/master/LICENSE)
|
|
||||||
|
|
||||||
**Note**: The `master` branch may be in an *unstable or even broken state* during development. Please use [releases][github-release] instead of the `master` branch in order to get stable binaries.
|
|
||||||
|
|
||||||
*the etcd v2 [documentation](Documentation/v2/README.md) has moved*
|
|
||||||
|
|
||||||
![etcd Logo](logos/etcd-horizontal-color.png)
|
|
||||||
|
|
||||||
etcd is a distributed reliable key-value store for the most critical data of a distributed system, with a focus on being:
|
|
||||||
|
|
||||||
* *Simple*: well-defined, user-facing API (gRPC)
|
|
||||||
* *Secure*: automatic TLS with optional client cert authentication
|
|
||||||
* *Fast*: benchmarked 10,000 writes/sec
|
|
||||||
* *Reliable*: properly distributed using Raft
|
|
||||||
|
|
||||||
etcd is written in Go and uses the [Raft][raft] consensus algorithm to manage a highly-available replicated log.
|
|
||||||
|
|
||||||
etcd is used [in production by many companies](./Documentation/production-users.md), and the development team stands behind it in critical deployment scenarios, where etcd is frequently teamed with applications such as [Kubernetes][k8s], [fleet][fleet], [locksmith][locksmith], [vulcand][vulcand], [Doorman][doorman], and many others. Reliability is further ensured by rigorous [testing][etcd-tests].
|
|
||||||
|
|
||||||
See [etcdctl][etcdctl] for a simple command line client.
|
|
||||||
|
|
||||||
[raft]: https://raft.github.io/
|
|
||||||
[k8s]: http://kubernetes.io/
|
|
||||||
[doorman]: https://github.com/youtube/doorman
|
|
||||||
[fleet]: https://github.com/coreos/fleet
|
|
||||||
[locksmith]: https://github.com/coreos/locksmith
|
|
||||||
[vulcand]: https://github.com/vulcand/vulcand
|
|
||||||
[etcdctl]: https://github.com/coreos/etcd/tree/master/etcdctl
|
|
||||||
[etcd-tests]: http://dash.etcd.io
|
|
||||||
|
|
||||||
## Community meetings
|
|
||||||
|
|
||||||
etcd contributors and maintainers have bi-weekly meetings at 11:00 AM (USA Pacific) on Tuesdays. There is an [iCalendar][rfc5545] format for the meetings [here](meeting.ics). Anyone is welcome to join via [Zoom][zoom] or audio-only: +1 669 900 6833. An initial agenda will be posted to the [shared Google docs][shared-meeting-notes] a day before each meeting, and everyone is welcome to suggest additional topics or other agendas.
|
|
||||||
|
|
||||||
[rfc5545]: https://tools.ietf.org/html/rfc5545
|
|
||||||
[zoom]: https://coreos.zoom.us/j/854793406
|
|
||||||
[shared-meeting-notes]: https://docs.google.com/document/d/1DbVXOHvd9scFsSmL2oNg4YGOHJdXqtx583DmeVWrB_M/edit#
|
|
||||||
|
|
||||||
## Getting started
|
|
||||||
|
|
||||||
### Getting etcd
|
|
||||||
|
|
||||||
The easiest way to get etcd is to use one of the pre-built release binaries which are available for OSX, Linux, Windows, [rkt][rkt], and Docker. Instructions for using these binaries are on the [GitHub releases page][github-release].
|
|
||||||
|
|
||||||
For those wanting to try the very latest version, [build the latest version of etcd][dl-build] from the `master` branch. This first needs [*Go*](https://golang.org/) installed (version 1.9+ is required). All development occurs on `master`, including new features and bug fixes. Bug fixes are first targeted at `master` and subsequently ported to release branches, as described in the [branch management][branch-management] guide.
|
|
||||||
|
|
||||||
[rkt]: https://github.com/rkt/rkt/releases/
|
|
||||||
[github-release]: https://github.com/coreos/etcd/releases/
|
|
||||||
[branch-management]: ./Documentation/branch_management.md
|
|
||||||
[dl-build]: ./Documentation/dl_build.md#build-the-latest-version
|
|
||||||
|
|
||||||
### Running etcd
|
|
||||||
|
|
||||||
First start a single-member cluster of etcd.
|
|
||||||
|
|
||||||
If etcd is installed using the [pre-built release binaries][github-release], run it from the installation location as below:
|
|
||||||
|
|
||||||
```sh
|
|
||||||
/tmp/etcd-download-test/etcd
|
|
||||||
```
|
|
||||||
The etcd command can be simply run as such if it is moved to the system path as below:
|
|
||||||
|
|
||||||
```sh
|
|
||||||
mv /tmp/etcd-download-test/etcd /usr/locale/bin/
|
|
||||||
|
|
||||||
etcd
|
|
||||||
```
|
|
||||||
|
|
||||||
If etcd is [build from the master branch][dl-build], run it as below:
|
|
||||||
|
|
||||||
```sh
|
|
||||||
./bin/etcd
|
|
||||||
```
|
|
||||||
|
|
||||||
This will bring up etcd listening on port 2379 for client communication and on port 2380 for server-to-server communication.
|
|
||||||
|
|
||||||
Next, let's set a single key, and then retrieve it:
|
|
||||||
|
|
||||||
```
|
|
||||||
ETCDCTL_API=3 etcdctl put mykey "this is awesome"
|
|
||||||
ETCDCTL_API=3 etcdctl get mykey
|
|
||||||
```
|
|
||||||
|
|
||||||
That's it! etcd is now running and serving client requests. For more
|
|
||||||
|
|
||||||
- [Animated quick demo][demo-gif]
|
|
||||||
- [Interactive etcd playground][etcd-play]
|
|
||||||
|
|
||||||
[demo-gif]: ./Documentation/demo.md
|
|
||||||
[etcd-play]: http://play.etcd.io/
|
|
||||||
|
|
||||||
### etcd TCP ports
|
|
||||||
|
|
||||||
The [official etcd ports][iana-ports] are 2379 for client requests, and 2380 for peer communication.
|
|
||||||
|
|
||||||
[iana-ports]: http://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.txt
|
|
||||||
|
|
||||||
### Running a local etcd cluster
|
|
||||||
|
|
||||||
First install [goreman](https://github.com/mattn/goreman), which manages Procfile-based applications.
|
|
||||||
|
|
||||||
Our [Procfile script](./Procfile) will set up a local example cluster. Start it with:
|
|
||||||
|
|
||||||
```sh
|
|
||||||
goreman start
|
|
||||||
```
|
|
||||||
|
|
||||||
This will bring up 3 etcd members `infra1`, `infra2` and `infra3` and etcd `grpc-proxy`, which runs locally and composes a cluster.
|
|
||||||
|
|
||||||
Every cluster member and proxy accepts key value reads and key value writes.
|
|
||||||
|
|
||||||
### Running etcd on Kubernetes
|
|
||||||
|
|
||||||
To run an etcd cluster on Kubernetes, try [etcd operator](https://github.com/coreos/etcd-operator).
|
|
||||||
|
|
||||||
### Next steps
|
|
||||||
|
|
||||||
Now it's time to dig into the full etcd API and other guides.
|
|
||||||
|
|
||||||
- Read the full [documentation][fulldoc].
|
|
||||||
- Explore the full gRPC [API][api].
|
|
||||||
- Set up a [multi-machine cluster][clustering].
|
|
||||||
- Learn the [config format, env variables and flags][configuration].
|
|
||||||
- Find [language bindings and tools][integrations].
|
|
||||||
- Use TLS to [secure an etcd cluster][security].
|
|
||||||
- [Tune etcd][tuning].
|
|
||||||
|
|
||||||
[fulldoc]: ./Documentation/docs.md
|
|
||||||
[api]: ./Documentation/dev-guide/api_reference_v3.md
|
|
||||||
[clustering]: ./Documentation/op-guide/clustering.md
|
|
||||||
[configuration]: ./Documentation/op-guide/configuration.md
|
|
||||||
[integrations]: ./Documentation/integrations.md
|
|
||||||
[security]: ./Documentation/op-guide/security.md
|
|
||||||
[tuning]: ./Documentation/tuning.md
|
|
||||||
|
|
||||||
## Contact
|
|
||||||
|
|
||||||
- Mailing list: [etcd-dev](https://groups.google.com/forum/?hl=en#!forum/etcd-dev)
|
|
||||||
- IRC: #[etcd](irc://irc.freenode.org:6667/#etcd) on freenode.org
|
|
||||||
- Planning/Roadmap: [milestones](https://github.com/coreos/etcd/milestones), [roadmap](./ROADMAP.md)
|
|
||||||
- Bugs: [issues](https://github.com/coreos/etcd/issues)
|
|
||||||
|
|
||||||
## Contributing
|
|
||||||
|
|
||||||
See [CONTRIBUTING](CONTRIBUTING.md) for details on submitting patches and the contribution workflow.
|
|
||||||
|
|
||||||
## Reporting bugs
|
|
||||||
|
|
||||||
See [reporting bugs](Documentation/reporting_bugs.md) for details about reporting any issues.
|
|
||||||
|
|
||||||
### License
|
|
||||||
|
|
||||||
etcd is under the Apache 2.0 license. See the [LICENSE](LICENSE) file for details.
|
|
|
@ -1,196 +0,0 @@
|
||||||
# Raft library
|
|
||||||
|
|
||||||
Raft is a protocol with which a cluster of nodes can maintain a replicated state machine.
|
|
||||||
The state machine is kept in sync through the use of a replicated log.
|
|
||||||
For more details on Raft, see "In Search of an Understandable Consensus Algorithm"
|
|
||||||
(https://ramcloud.stanford.edu/raft.pdf) by Diego Ongaro and John Ousterhout.
|
|
||||||
|
|
||||||
This Raft library is stable and feature complete. As of 2016, it is **the most widely used** Raft library in production, serving tens of thousands clusters each day. It powers distributed systems such as etcd, Kubernetes, Docker Swarm, Cloud Foundry Diego, CockroachDB, TiDB, Project Calico, Flannel, and more.
|
|
||||||
|
|
||||||
Most Raft implementations have a monolithic design, including storage handling, messaging serialization, and network transport. This library instead follows a minimalistic design philosophy by only implementing the core raft algorithm. This minimalism buys flexibility, determinism, and performance.
|
|
||||||
|
|
||||||
To keep the codebase small as well as provide flexibility, the library only implements the Raft algorithm; both network and disk IO are left to the user. Library users must implement their own transportation layer for message passing between Raft peers over the wire. Similarly, users must implement their own storage layer to persist the Raft log and state.
|
|
||||||
|
|
||||||
In order to easily test the Raft library, its behavior should be deterministic. To achieve this determinism, the library models Raft as a state machine. The state machine takes a `Message` as input. A message can either be a local timer update or a network message sent from a remote peer. The state machine's output is a 3-tuple `{[]Messages, []LogEntries, NextState}` consisting of an array of `Messages`, `log entries`, and `Raft state changes`. For state machines with the same state, the same state machine input should always generate the same state machine output.
|
|
||||||
|
|
||||||
A simple example application, _raftexample_, is also available to help illustrate how to use this package in practice: https://github.com/coreos/etcd/tree/master/contrib/raftexample
|
|
||||||
|
|
||||||
# Features
|
|
||||||
|
|
||||||
This raft implementation is a full feature implementation of Raft protocol. Features includes:
|
|
||||||
|
|
||||||
- Leader election
|
|
||||||
- Log replication
|
|
||||||
- Log compaction
|
|
||||||
- Membership changes
|
|
||||||
- Leadership transfer extension
|
|
||||||
- Efficient linearizable read-only queries served by both the leader and followers
|
|
||||||
- leader checks with quorum and bypasses Raft log before processing read-only queries
|
|
||||||
- followers asks leader to get a safe read index before processing read-only queries
|
|
||||||
- More efficient lease-based linearizable read-only queries served by both the leader and followers
|
|
||||||
- leader bypasses Raft log and processing read-only queries locally
|
|
||||||
- followers asks leader to get a safe read index before processing read-only queries
|
|
||||||
- this approach relies on the clock of the all the machines in raft group
|
|
||||||
|
|
||||||
This raft implementation also includes a few optional enhancements:
|
|
||||||
|
|
||||||
- Optimistic pipelining to reduce log replication latency
|
|
||||||
- Flow control for log replication
|
|
||||||
- Batching Raft messages to reduce synchronized network I/O calls
|
|
||||||
- Batching log entries to reduce disk synchronized I/O
|
|
||||||
- Writing to leader's disk in parallel
|
|
||||||
- Internal proposal redirection from followers to leader
|
|
||||||
- Automatic stepping down when the leader loses quorum
|
|
||||||
|
|
||||||
## Notable Users
|
|
||||||
|
|
||||||
- [cockroachdb](https://github.com/cockroachdb/cockroach) A Scalable, Survivable, Strongly-Consistent SQL Database
|
|
||||||
- [dgraph](https://github.com/dgraph-io/dgraph) A Scalable, Distributed, Low Latency, High Throughput Graph Database
|
|
||||||
- [etcd](https://github.com/coreos/etcd) A distributed reliable key-value store
|
|
||||||
- [tikv](https://github.com/pingcap/tikv) A Distributed transactional key value database powered by Rust and Raft
|
|
||||||
- [swarmkit](https://github.com/docker/swarmkit) A toolkit for orchestrating distributed systems at any scale.
|
|
||||||
- [chain core](https://github.com/chain/chain) Software for operating permissioned, multi-asset blockchain networks
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
The primary object in raft is a Node. Either start a Node from scratch using raft.StartNode or start a Node from some initial state using raft.RestartNode.
|
|
||||||
|
|
||||||
To start a three-node cluster
|
|
||||||
```go
|
|
||||||
storage := raft.NewMemoryStorage()
|
|
||||||
c := &Config{
|
|
||||||
ID: 0x01,
|
|
||||||
ElectionTick: 10,
|
|
||||||
HeartbeatTick: 1,
|
|
||||||
Storage: storage,
|
|
||||||
MaxSizePerMsg: 4096,
|
|
||||||
MaxInflightMsgs: 256,
|
|
||||||
}
|
|
||||||
// Set peer list to the other nodes in the cluster.
|
|
||||||
// Note that they need to be started separately as well.
|
|
||||||
n := raft.StartNode(c, []raft.Peer{{ID: 0x02}, {ID: 0x03}})
|
|
||||||
```
|
|
||||||
|
|
||||||
Start a single node cluster, like so:
|
|
||||||
```go
|
|
||||||
// Create storage and config as shown above.
|
|
||||||
// Set peer list to itself, so this node can become the leader of this single-node cluster.
|
|
||||||
peers := []raft.Peer{{ID: 0x01}}
|
|
||||||
n := raft.StartNode(c, peers)
|
|
||||||
```
|
|
||||||
|
|
||||||
To allow a new node to join this cluster, do not pass in any peers. First, add the node to the existing cluster by calling `ProposeConfChange` on any existing node inside the cluster. Then, start the node with an empty peer list, like so:
|
|
||||||
```go
|
|
||||||
// Create storage and config as shown above.
|
|
||||||
n := raft.StartNode(c, nil)
|
|
||||||
```
|
|
||||||
|
|
||||||
To restart a node from previous state:
|
|
||||||
```go
|
|
||||||
storage := raft.NewMemoryStorage()
|
|
||||||
|
|
||||||
// Recover the in-memory storage from persistent snapshot, state and entries.
|
|
||||||
storage.ApplySnapshot(snapshot)
|
|
||||||
storage.SetHardState(state)
|
|
||||||
storage.Append(entries)
|
|
||||||
|
|
||||||
c := &Config{
|
|
||||||
ID: 0x01,
|
|
||||||
ElectionTick: 10,
|
|
||||||
HeartbeatTick: 1,
|
|
||||||
Storage: storage,
|
|
||||||
MaxSizePerMsg: 4096,
|
|
||||||
MaxInflightMsgs: 256,
|
|
||||||
}
|
|
||||||
|
|
||||||
// Restart raft without peer information.
|
|
||||||
// Peer information is already included in the storage.
|
|
||||||
n := raft.RestartNode(c)
|
|
||||||
```
|
|
||||||
|
|
||||||
After creating a Node, the user has a few responsibilities:
|
|
||||||
|
|
||||||
First, read from the Node.Ready() channel and process the updates it contains. These steps may be performed in parallel, except as noted in step 2.
|
|
||||||
|
|
||||||
1. Write Entries, HardState and Snapshot to persistent storage in order, i.e. Entries first, then HardState and Snapshot if they are not empty. If persistent storage supports atomic writes then all of them can be written together. Note that when writing an Entry with Index i, any previously-persisted entries with Index >= i must be discarded.
|
|
||||||
|
|
||||||
2. Send all Messages to the nodes named in the To field. It is important that no messages be sent until the latest HardState has been persisted to disk, and all Entries written by any previous Ready batch (Messages may be sent while entries from the same batch are being persisted). To reduce the I/O latency, an optimization can be applied to make leader write to disk in parallel with its followers (as explained at section 10.2.1 in Raft thesis). If any Message has type MsgSnap, call Node.ReportSnapshot() after it has been sent (these messages may be large). Note: Marshalling messages is not thread-safe; it is important to make sure that no new entries are persisted while marshalling. The easiest way to achieve this is to serialise the messages directly inside the main raft loop.
|
|
||||||
|
|
||||||
3. Apply Snapshot (if any) and CommittedEntries to the state machine. If any committed Entry has Type EntryConfChange, call Node.ApplyConfChange() to apply it to the node. The configuration change may be cancelled at this point by setting the NodeID field to zero before calling ApplyConfChange (but ApplyConfChange must be called one way or the other, and the decision to cancel must be based solely on the state machine and not external information such as the observed health of the node).
|
|
||||||
|
|
||||||
4. Call Node.Advance() to signal readiness for the next batch of updates. This may be done at any time after step 1, although all updates must be processed in the order they were returned by Ready.
|
|
||||||
|
|
||||||
Second, all persisted log entries must be made available via an implementation of the Storage interface. The provided MemoryStorage type can be used for this (if repopulating its state upon a restart), or a custom disk-backed implementation can be supplied.
|
|
||||||
|
|
||||||
Third, after receiving a message from another node, pass it to Node.Step:
|
|
||||||
|
|
||||||
```go
|
|
||||||
func recvRaftRPC(ctx context.Context, m raftpb.Message) {
|
|
||||||
n.Step(ctx, m)
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
Finally, call `Node.Tick()` at regular intervals (probably via a `time.Ticker`). Raft has two important timeouts: heartbeat and the election timeout. However, internally to the raft package time is represented by an abstract "tick".
|
|
||||||
|
|
||||||
The total state machine handling loop will look something like this:
|
|
||||||
|
|
||||||
```go
|
|
||||||
for {
|
|
||||||
select {
|
|
||||||
case <-s.Ticker:
|
|
||||||
n.Tick()
|
|
||||||
case rd := <-s.Node.Ready():
|
|
||||||
saveToStorage(rd.State, rd.Entries, rd.Snapshot)
|
|
||||||
send(rd.Messages)
|
|
||||||
if !raft.IsEmptySnap(rd.Snapshot) {
|
|
||||||
processSnapshot(rd.Snapshot)
|
|
||||||
}
|
|
||||||
for _, entry := range rd.CommittedEntries {
|
|
||||||
process(entry)
|
|
||||||
if entry.Type == raftpb.EntryConfChange {
|
|
||||||
var cc raftpb.ConfChange
|
|
||||||
cc.Unmarshal(entry.Data)
|
|
||||||
s.Node.ApplyConfChange(cc)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
s.Node.Advance()
|
|
||||||
case <-s.done:
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
To propose changes to the state machine from the node to take application data, serialize it into a byte slice and call:
|
|
||||||
|
|
||||||
```go
|
|
||||||
n.Propose(ctx, data)
|
|
||||||
```
|
|
||||||
|
|
||||||
If the proposal is committed, data will appear in committed entries with type raftpb.EntryNormal. There is no guarantee that a proposed command will be committed; the command may have to be reproposed after a timeout.
|
|
||||||
|
|
||||||
To add or remove node in a cluster, build ConfChange struct 'cc' and call:
|
|
||||||
|
|
||||||
```go
|
|
||||||
n.ProposeConfChange(ctx, cc)
|
|
||||||
```
|
|
||||||
|
|
||||||
After config change is committed, some committed entry with type raftpb.EntryConfChange will be returned. This must be applied to node through:
|
|
||||||
|
|
||||||
```go
|
|
||||||
var cc raftpb.ConfChange
|
|
||||||
cc.Unmarshal(data)
|
|
||||||
n.ApplyConfChange(cc)
|
|
||||||
```
|
|
||||||
|
|
||||||
Note: An ID represents a unique node in a cluster for all time. A
|
|
||||||
given ID MUST be used only once even if the old node has been removed.
|
|
||||||
This means that for example IP addresses make poor node IDs since they
|
|
||||||
may be reused. Node IDs must be non-zero.
|
|
||||||
|
|
||||||
## Implementation notes
|
|
||||||
|
|
||||||
This implementation is up to date with the final Raft thesis (https://ramcloud.stanford.edu/~ongaro/thesis.pdf), although this implementation of the membership change protocol differs somewhat from that described in chapter 4. The key invariant that membership changes happen one node at a time is preserved, but in our implementation the membership change takes effect when its entry is applied, not when it is added to the log (so the entry is committed under the old membership instead of the new). This is equivalent in terms of safety, since the old and new configurations are guaranteed to overlap.
|
|
||||||
|
|
||||||
To ensure there is no attempt to commit two membership changes at once by matching log positions (which would be unsafe since they should have different quorum requirements), any proposed membership change is simply disallowed while any uncommitted change appears in the leader's log.
|
|
||||||
|
|
||||||
This approach introduces a problem when removing a member from a two-member cluster: If one of the members dies before the other one receives the commit of the confchange entry, then the member cannot be removed any more since the cluster cannot make progress. For this reason it is highly recommended to use three or more nodes in every cluster.
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
go-md2man
|
||||||
|
bin
|
|
@ -0,0 +1,8 @@
|
||||||
|
FROM golang:1.8 AS build
|
||||||
|
COPY . /go/src/github.com/cpuguy83/go-md2man
|
||||||
|
WORKDIR /go/src/github.com/cpuguy83/go-md2man
|
||||||
|
RUN CGO_ENABLED=0 go build
|
||||||
|
|
||||||
|
FROM scratch
|
||||||
|
COPY --from=build /go/src/github.com/cpuguy83/go-md2man/go-md2man /go-md2man
|
||||||
|
ENTRYPOINT ["/go-md2man"]
|
|
@ -0,0 +1,35 @@
|
||||||
|
GO111MODULE ?= on
|
||||||
|
LINTER_BIN ?= golangci-lint
|
||||||
|
|
||||||
|
export GO111MODULE
|
||||||
|
|
||||||
|
.PHONY:
|
||||||
|
build: bin/go-md2man
|
||||||
|
|
||||||
|
.PHONY: clean
|
||||||
|
clean:
|
||||||
|
@rm -rf bin/*
|
||||||
|
|
||||||
|
.PHONY: test
|
||||||
|
test:
|
||||||
|
@go test $(TEST_FLAGS) ./...
|
||||||
|
|
||||||
|
bin/go-md2man: actual_build_flags := $(BUILD_FLAGS) -o bin/go-md2man
|
||||||
|
bin/go-md2man: bin
|
||||||
|
@CGO_ENABLED=0 go build $(actual_build_flags)
|
||||||
|
|
||||||
|
bin:
|
||||||
|
@mkdir ./bin
|
||||||
|
|
||||||
|
.PHONY: mod
|
||||||
|
mod:
|
||||||
|
@go mod tidy
|
||||||
|
|
||||||
|
.PHONY: check-mod
|
||||||
|
check-mod: # verifies that module changes for go.mod and go.sum are checked in
|
||||||
|
@hack/ci/check_mods.sh
|
||||||
|
|
||||||
|
.PHONY: vendor
|
||||||
|
vendor: mod
|
||||||
|
@go mod vendor -v
|
||||||
|
|
|
@ -0,0 +1,23 @@
|
||||||
|
go-md2man 1 "January 2015" go-md2man "User Manual"
|
||||||
|
==================================================
|
||||||
|
|
||||||
|
# NAME
|
||||||
|
go-md2man - Convert markdown files into manpages
|
||||||
|
|
||||||
|
# SYNOPSIS
|
||||||
|
go-md2man -in=[/path/to/md/file] -out=[/path/to/output]
|
||||||
|
|
||||||
|
# Description
|
||||||
|
go-md2man converts standard markdown formatted documents into manpages. It is
|
||||||
|
written purely in Go so as to reduce dependencies on 3rd party libs.
|
||||||
|
|
||||||
|
By default, the input is stdin and the output is stdout.
|
||||||
|
|
||||||
|
# Example
|
||||||
|
Convert the markdown file "go-md2man.1.md" into a manpage.
|
||||||
|
|
||||||
|
go-md2man -in=go-md2man.1.md -out=go-md2man.1.out
|
||||||
|
|
||||||
|
# HISTORY
|
||||||
|
January 2015, Originally compiled by Brian Goff( cpuguy83@gmail.com )
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk=
|
||||||
|
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
|
|
@ -0,0 +1,4 @@
|
||||||
|
[568].out
|
||||||
|
_go*
|
||||||
|
_test*
|
||||||
|
_obj
|
|
@ -0,0 +1,14 @@
|
||||||
|
FROM golang:1.13
|
||||||
|
|
||||||
|
# Clone and complie a riscv compatible version of the go compiler.
|
||||||
|
RUN git clone https://review.gerrithub.io/riscv/riscv-go /riscv-go
|
||||||
|
# riscvdev branch HEAD as of 2019-06-29.
|
||||||
|
RUN cd /riscv-go && git checkout 04885fddd096d09d4450726064d06dd107e374bf
|
||||||
|
ENV PATH=/riscv-go/misc/riscv:/riscv-go/bin:$PATH
|
||||||
|
RUN cd /riscv-go/src && GOROOT_BOOTSTRAP=$(go env GOROOT) ./make.bash
|
||||||
|
ENV GOROOT=/riscv-go
|
||||||
|
|
||||||
|
# Make sure we compile.
|
||||||
|
WORKDIR pty
|
||||||
|
ADD . .
|
||||||
|
RUN GOOS=linux GOARCH=riscv go build
|
|
@ -0,0 +1,19 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
GOOSARCH="${GOOS}_${GOARCH}"
|
||||||
|
case "$GOOSARCH" in
|
||||||
|
_* | *_ | _)
|
||||||
|
echo 'undefined $GOOS_$GOARCH:' "$GOOSARCH" 1>&2
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
GODEFS="go tool cgo -godefs"
|
||||||
|
|
||||||
|
$GODEFS types.go |gofmt > ztypes_$GOARCH.go
|
||||||
|
|
||||||
|
case $GOOS in
|
||||||
|
freebsd|dragonfly|openbsd)
|
||||||
|
$GODEFS types_$GOOS.go |gofmt > ztypes_$GOOSARCH.go
|
||||||
|
;;
|
||||||
|
esac
|
|
@ -0,0 +1,50 @@
|
||||||
|
#!/usr/bin/env sh
|
||||||
|
|
||||||
|
# Test script checking that all expected os/arch compile properly.
|
||||||
|
# Does not actually test the logic, just the compilation so we make sure we don't break code depending on the lib.
|
||||||
|
|
||||||
|
echo2() {
|
||||||
|
echo $@ >&2
|
||||||
|
}
|
||||||
|
|
||||||
|
trap end 0
|
||||||
|
end() {
|
||||||
|
[ "$?" = 0 ] && echo2 "Pass." || (echo2 "Fail."; exit 1)
|
||||||
|
}
|
||||||
|
|
||||||
|
cross() {
|
||||||
|
os=$1
|
||||||
|
shift
|
||||||
|
echo2 "Build for $os."
|
||||||
|
for arch in $@; do
|
||||||
|
echo2 " - $os/$arch"
|
||||||
|
GOOS=$os GOARCH=$arch go build
|
||||||
|
done
|
||||||
|
echo2
|
||||||
|
}
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
cross linux amd64 386 arm arm64 ppc64 ppc64le s390x mips mipsle mips64 mips64le
|
||||||
|
cross darwin amd64 386 arm arm64
|
||||||
|
cross freebsd amd64 386 arm
|
||||||
|
cross netbsd amd64 386 arm
|
||||||
|
cross openbsd amd64 386 arm arm64
|
||||||
|
cross dragonfly amd64
|
||||||
|
cross solaris amd64
|
||||||
|
|
||||||
|
# Not expected to work but should still compile.
|
||||||
|
cross windows amd64 386 arm
|
||||||
|
|
||||||
|
# TODO: Fix compilation error on openbsd/arm.
|
||||||
|
# TODO: Merge the solaris PR.
|
||||||
|
|
||||||
|
# Some os/arch require a different compiler. Run in docker.
|
||||||
|
if ! hash docker; then
|
||||||
|
# If docker is not present, stop here.
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo2 "Build for linux."
|
||||||
|
echo2 " - linux/riscv"
|
||||||
|
docker build -t test -f Dockerfile.riscv .
|
|
@ -1,201 +0,0 @@
|
||||||
go-spew
|
|
||||||
=======
|
|
||||||
|
|
||||||
[![Build Status](https://img.shields.io/travis/davecgh/go-spew.svg)](https://travis-ci.org/davecgh/go-spew)
|
|
||||||
[![ISC License](http://img.shields.io/badge/license-ISC-blue.svg)](http://copyfree.org)
|
|
||||||
[![Coverage Status](https://img.shields.io/coveralls/davecgh/go-spew.svg)](https://coveralls.io/r/davecgh/go-spew?branch=master)
|
|
||||||
|
|
||||||
Go-spew implements a deep pretty printer for Go data structures to aid in
|
|
||||||
debugging. A comprehensive suite of tests with 100% test coverage is provided
|
|
||||||
to ensure proper functionality. See `test_coverage.txt` for the gocov coverage
|
|
||||||
report. Go-spew is licensed under the liberal ISC license, so it may be used in
|
|
||||||
open source or commercial projects.
|
|
||||||
|
|
||||||
If you're interested in reading about how this package came to life and some
|
|
||||||
of the challenges involved in providing a deep pretty printer, there is a blog
|
|
||||||
post about it
|
|
||||||
[here](https://web.archive.org/web/20160304013555/https://blog.cyphertite.com/go-spew-a-journey-into-dumping-go-data-structures/).
|
|
||||||
|
|
||||||
## Documentation
|
|
||||||
|
|
||||||
[![GoDoc](https://img.shields.io/badge/godoc-reference-blue.svg)](http://godoc.org/github.com/davecgh/go-spew/spew)
|
|
||||||
|
|
||||||
Full `go doc` style documentation for the project can be viewed online without
|
|
||||||
installing this package by using the excellent GoDoc site here:
|
|
||||||
http://godoc.org/github.com/davecgh/go-spew/spew
|
|
||||||
|
|
||||||
You can also view the documentation locally once the package is installed with
|
|
||||||
the `godoc` tool by running `godoc -http=":6060"` and pointing your browser to
|
|
||||||
http://localhost:6060/pkg/github.com/davecgh/go-spew/spew
|
|
||||||
|
|
||||||
## Installation
|
|
||||||
|
|
||||||
```bash
|
|
||||||
$ go get -u github.com/davecgh/go-spew/spew
|
|
||||||
```
|
|
||||||
|
|
||||||
## Quick Start
|
|
||||||
|
|
||||||
Add this import line to the file you're working in:
|
|
||||||
|
|
||||||
```Go
|
|
||||||
import "github.com/davecgh/go-spew/spew"
|
|
||||||
```
|
|
||||||
|
|
||||||
To dump a variable with full newlines, indentation, type, and pointer
|
|
||||||
information use Dump, Fdump, or Sdump:
|
|
||||||
|
|
||||||
```Go
|
|
||||||
spew.Dump(myVar1, myVar2, ...)
|
|
||||||
spew.Fdump(someWriter, myVar1, myVar2, ...)
|
|
||||||
str := spew.Sdump(myVar1, myVar2, ...)
|
|
||||||
```
|
|
||||||
|
|
||||||
Alternatively, if you would prefer to use format strings with a compacted inline
|
|
||||||
printing style, use the convenience wrappers Printf, Fprintf, etc with %v (most
|
|
||||||
compact), %+v (adds pointer addresses), %#v (adds types), or %#+v (adds types
|
|
||||||
and pointer addresses):
|
|
||||||
|
|
||||||
```Go
|
|
||||||
spew.Printf("myVar1: %v -- myVar2: %+v", myVar1, myVar2)
|
|
||||||
spew.Printf("myVar3: %#v -- myVar4: %#+v", myVar3, myVar4)
|
|
||||||
spew.Fprintf(someWriter, "myVar1: %v -- myVar2: %+v", myVar1, myVar2)
|
|
||||||
spew.Fprintf(someWriter, "myVar3: %#v -- myVar4: %#+v", myVar3, myVar4)
|
|
||||||
```
|
|
||||||
|
|
||||||
## Debugging a Web Application Example
|
|
||||||
|
|
||||||
Here is an example of how you can use `spew.Sdump()` to help debug a web application. Please be sure to wrap your output using the `html.EscapeString()` function for safety reasons. You should also only use this debugging technique in a development environment, never in production.
|
|
||||||
|
|
||||||
```Go
|
|
||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"html"
|
|
||||||
"net/http"
|
|
||||||
|
|
||||||
"github.com/davecgh/go-spew/spew"
|
|
||||||
)
|
|
||||||
|
|
||||||
func handler(w http.ResponseWriter, r *http.Request) {
|
|
||||||
w.Header().Set("Content-Type", "text/html")
|
|
||||||
fmt.Fprintf(w, "Hi there, %s!", r.URL.Path[1:])
|
|
||||||
fmt.Fprintf(w, "<!--\n" + html.EscapeString(spew.Sdump(w)) + "\n-->")
|
|
||||||
}
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
http.HandleFunc("/", handler)
|
|
||||||
http.ListenAndServe(":8080", nil)
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
## Sample Dump Output
|
|
||||||
|
|
||||||
```
|
|
||||||
(main.Foo) {
|
|
||||||
unexportedField: (*main.Bar)(0xf84002e210)({
|
|
||||||
flag: (main.Flag) flagTwo,
|
|
||||||
data: (uintptr) <nil>
|
|
||||||
}),
|
|
||||||
ExportedField: (map[interface {}]interface {}) {
|
|
||||||
(string) "one": (bool) true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
([]uint8) {
|
|
||||||
00000000 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f 20 |............... |
|
|
||||||
00000010 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f 30 |!"#$%&'()*+,-./0|
|
|
||||||
00000020 31 32 |12|
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
## Sample Formatter Output
|
|
||||||
|
|
||||||
Double pointer to a uint8:
|
|
||||||
```
|
|
||||||
%v: <**>5
|
|
||||||
%+v: <**>(0xf8400420d0->0xf8400420c8)5
|
|
||||||
%#v: (**uint8)5
|
|
||||||
%#+v: (**uint8)(0xf8400420d0->0xf8400420c8)5
|
|
||||||
```
|
|
||||||
|
|
||||||
Pointer to circular struct with a uint8 field and a pointer to itself:
|
|
||||||
```
|
|
||||||
%v: <*>{1 <*><shown>}
|
|
||||||
%+v: <*>(0xf84003e260){ui8:1 c:<*>(0xf84003e260)<shown>}
|
|
||||||
%#v: (*main.circular){ui8:(uint8)1 c:(*main.circular)<shown>}
|
|
||||||
%#+v: (*main.circular)(0xf84003e260){ui8:(uint8)1 c:(*main.circular)(0xf84003e260)<shown>}
|
|
||||||
```
|
|
||||||
|
|
||||||
## Configuration Options
|
|
||||||
|
|
||||||
Configuration of spew is handled by fields in the ConfigState type. For
|
|
||||||
convenience, all of the top-level functions use a global state available via the
|
|
||||||
spew.Config global.
|
|
||||||
|
|
||||||
It is also possible to create a ConfigState instance that provides methods
|
|
||||||
equivalent to the top-level functions. This allows concurrent configuration
|
|
||||||
options. See the ConfigState documentation for more details.
|
|
||||||
|
|
||||||
```
|
|
||||||
* Indent
|
|
||||||
String to use for each indentation level for Dump functions.
|
|
||||||
It is a single space by default. A popular alternative is "\t".
|
|
||||||
|
|
||||||
* MaxDepth
|
|
||||||
Maximum number of levels to descend into nested data structures.
|
|
||||||
There is no limit by default.
|
|
||||||
|
|
||||||
* DisableMethods
|
|
||||||
Disables invocation of error and Stringer interface methods.
|
|
||||||
Method invocation is enabled by default.
|
|
||||||
|
|
||||||
* DisablePointerMethods
|
|
||||||
Disables invocation of error and Stringer interface methods on types
|
|
||||||
which only accept pointer receivers from non-pointer variables. This option
|
|
||||||
relies on access to the unsafe package, so it will not have any effect when
|
|
||||||
running in environments without access to the unsafe package such as Google
|
|
||||||
App Engine or with the "safe" build tag specified.
|
|
||||||
Pointer method invocation is enabled by default.
|
|
||||||
|
|
||||||
* DisablePointerAddresses
|
|
||||||
DisablePointerAddresses specifies whether to disable the printing of
|
|
||||||
pointer addresses. This is useful when diffing data structures in tests.
|
|
||||||
|
|
||||||
* DisableCapacities
|
|
||||||
DisableCapacities specifies whether to disable the printing of capacities
|
|
||||||
for arrays, slices, maps and channels. This is useful when diffing data
|
|
||||||
structures in tests.
|
|
||||||
|
|
||||||
* ContinueOnMethod
|
|
||||||
Enables recursion into types after invoking error and Stringer interface
|
|
||||||
methods. Recursion after method invocation is disabled by default.
|
|
||||||
|
|
||||||
* SortKeys
|
|
||||||
Specifies map keys should be sorted before being printed. Use
|
|
||||||
this to have a more deterministic, diffable output. Note that
|
|
||||||
only native types (bool, int, uint, floats, uintptr and string)
|
|
||||||
and types which implement error or Stringer interfaces are supported,
|
|
||||||
with other types sorted according to the reflect.Value.String() output
|
|
||||||
which guarantees display stability. Natural map order is used by
|
|
||||||
default.
|
|
||||||
|
|
||||||
* SpewKeys
|
|
||||||
SpewKeys specifies that, as a last resort attempt, map keys should be
|
|
||||||
spewed to strings and sorted by those strings. This is only considered
|
|
||||||
if SortKeys is true.
|
|
||||||
|
|
||||||
```
|
|
||||||
|
|
||||||
## Unsafe Package Dependency
|
|
||||||
|
|
||||||
This package relies on the unsafe package to perform some of the more advanced
|
|
||||||
features, however it also supports a "limited" mode which allows it to work in
|
|
||||||
environments where the unsafe package is not available. By default, it will
|
|
||||||
operate in this mode on Google App Engine and when compiled with GopherJS. The
|
|
||||||
"safe" build tag may also be specified to force the package to build without
|
|
||||||
using the unsafe package.
|
|
||||||
|
|
||||||
## License
|
|
||||||
|
|
||||||
Go-spew is licensed under the [copyfree](http://copyfree.org) ISC License.
|
|
|
@ -1,196 +0,0 @@
|
||||||
# Compose on Kubernetes
|
|
||||||
|
|
||||||
[![CircleCI](https://circleci.com/gh/docker/compose-on-kubernetes/tree/master.svg?style=svg)](https://circleci.com/gh/docker/compose-on-kubernetes/tree/master)
|
|
||||||
|
|
||||||
Compose on Kubernetes allows you to deploy Docker Compose files onto a
|
|
||||||
Kubernetes cluster.
|
|
||||||
|
|
||||||
# Table of contents
|
|
||||||
|
|
||||||
- [Get started](#get-started)
|
|
||||||
- [Developing Compose on Kubernetes](#developing-compose-on-kubernetes)
|
|
||||||
|
|
||||||
More documentation can be found in the [docs/](./docs) directory. This includes:
|
|
||||||
- [Architecture](./docs/architecture.md)
|
|
||||||
- [Mapping of stack to Kubernetes objects](./docs/mapping.md)
|
|
||||||
- [Compatibility matrix](./docs/compatibility.md)
|
|
||||||
|
|
||||||
# Get started
|
|
||||||
|
|
||||||
Compose on Kubernetes comes installed on
|
|
||||||
[Docker Desktop](https://www.docker.com/products/docker-desktop) and
|
|
||||||
[Docker Enterprise](https://www.docker.com/products/docker-enterprise).
|
|
||||||
|
|
||||||
On Docker Desktop you will need to activate Kubernetes in the settings to use
|
|
||||||
Compose on Kubernetes.
|
|
||||||
|
|
||||||
## Check that Compose on Kubernetes is installed
|
|
||||||
|
|
||||||
You can check that Compose on Kubernetes is installed by checking for the
|
|
||||||
availability of the API using the command:
|
|
||||||
|
|
||||||
```console
|
|
||||||
$ kubectl api-versions | grep compose
|
|
||||||
compose.docker.com/v1beta1
|
|
||||||
compose.docker.com/v1beta2
|
|
||||||
```
|
|
||||||
|
|
||||||
## Deploy a stack
|
|
||||||
|
|
||||||
To deploy a stack, you can use the Docker CLI:
|
|
||||||
|
|
||||||
```console
|
|
||||||
$ cat docker-compose.yml
|
|
||||||
version: '3.3'
|
|
||||||
|
|
||||||
services:
|
|
||||||
|
|
||||||
db:
|
|
||||||
build: db
|
|
||||||
image: dockersamples/k8s-wordsmith-db
|
|
||||||
|
|
||||||
words:
|
|
||||||
build: words
|
|
||||||
image: dockersamples/k8s-wordsmith-api
|
|
||||||
deploy:
|
|
||||||
replicas: 5
|
|
||||||
|
|
||||||
web:
|
|
||||||
build: web
|
|
||||||
image: dockersamples/k8s-wordsmith-web
|
|
||||||
ports:
|
|
||||||
- "33000:80"
|
|
||||||
|
|
||||||
$ docker stack deploy --orchestrator=kubernetes -c docker-compose.yml hellokube
|
|
||||||
```
|
|
||||||
|
|
||||||
## Remove a stack
|
|
||||||
|
|
||||||
```
|
|
||||||
$ docker stack rm --orchestrator=kubernetes hellokube
|
|
||||||
```
|
|
||||||
|
|
||||||
# Developing Compose on Kubernetes
|
|
||||||
|
|
||||||
See the [contributing](./CONTRIBUTING.md) guides for how to contribute code.
|
|
||||||
|
|
||||||
## Pre-requisites
|
|
||||||
|
|
||||||
- `make`
|
|
||||||
- [Docker Desktop](https://www.docker.com/products/docker-desktop) (Mac or Windows) with engine version 18.09 or later
|
|
||||||
- Enable Buildkit by setting `DOCKER_BUILDKIT=1` in your environment
|
|
||||||
- Enable Kubernetes in Docker Desktop settings
|
|
||||||
|
|
||||||
### For live debugging
|
|
||||||
|
|
||||||
- Debugger capable of remote debugging with Delve API version 2
|
|
||||||
- Goland run-configs are pre-configured
|
|
||||||
|
|
||||||
## Debug quick start
|
|
||||||
|
|
||||||
### Debug install
|
|
||||||
|
|
||||||
To build and install a debug version of Compose on Kubernetes onto Docker
|
|
||||||
Desktop, you can use the following command:
|
|
||||||
|
|
||||||
```console
|
|
||||||
$ make -f debug.Makefile install-debug-images
|
|
||||||
```
|
|
||||||
|
|
||||||
This command:
|
|
||||||
- Builds the images with debug symbols
|
|
||||||
- Runs the debug installer:
|
|
||||||
- Installs debug versions of API server and Compose controller in the `docker` namespace
|
|
||||||
- Creates two debugging _LoadBalancer_ services (unused in this mode)
|
|
||||||
|
|
||||||
You can verify that Compose on Kubernetes is running with `kubectl` as follows:
|
|
||||||
|
|
||||||
```console
|
|
||||||
$ kubectl get all -n docker
|
|
||||||
NAME READY STATUS RESTARTS AGE
|
|
||||||
pod/compose-7c4dfcff76-jgwst 1/1 Running 0 59s
|
|
||||||
pod/compose-api-759f8dbb4b-2z5n2 2/2 Running 0 59s
|
|
||||||
|
|
||||||
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
|
|
||||||
service/compose-api ClusterIP 10.98.42.151 <none> 443/TCP 59s
|
|
||||||
service/compose-api-server-remote-debug LoadBalancer 10.101.198.179 localhost 40001:31693/TCP 59s
|
|
||||||
service/compose-controller-remote-debug LoadBalancer 10.101.158.160 localhost 40000:31167/TCP 59s
|
|
||||||
|
|
||||||
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
|
|
||||||
deployment.apps/compose 1 1 1 1 59s
|
|
||||||
deployment.apps/compose-api 1 1 1 1 59s
|
|
||||||
|
|
||||||
NAME DESIRED CURRENT READY AGE
|
|
||||||
replicaset.apps/compose-7c4dfcff76 1 1 1 59s
|
|
||||||
replicaset.apps/compose-api-759f8dbb4b 1 1 1 59s
|
|
||||||
```
|
|
||||||
|
|
||||||
If you describe one of the deployments, you should see `*-debug:latest` in the
|
|
||||||
image name.
|
|
||||||
|
|
||||||
### Live debugging install
|
|
||||||
|
|
||||||
To build and install a live debugging version of Compose on Kubernetes onto
|
|
||||||
Docker Desktop, you can use the following command:
|
|
||||||
|
|
||||||
```console
|
|
||||||
$ make -f debug.Makefile install-live-debug-images
|
|
||||||
```
|
|
||||||
|
|
||||||
This command:
|
|
||||||
- Builds the images with debug symbols
|
|
||||||
- Sets the image entrypoint to run a [Delve server](https://github.com/derekparker/delve)
|
|
||||||
- Runs the debug installer
|
|
||||||
- Installs debug version of API server and Compose controller in the `docker` namespace
|
|
||||||
- Creates two debugging _LoadBalancer_ services
|
|
||||||
- `localhost:40000`: Compose controller
|
|
||||||
- `localhost:40001`: API server
|
|
||||||
- The API server and Compose controller only start once a debugger is attached
|
|
||||||
|
|
||||||
To attach a debugger you have multiple options:
|
|
||||||
- Use [GoLand](https://www.jetbrains.com/go/): configuration can be found in `.idea` of the repository
|
|
||||||
- Select the `Debug all` config, setup breakpoints and start the debugger
|
|
||||||
- Set your Delve compatible debugger to point to use `locahost:40000` and `localhost:40001`
|
|
||||||
- Using a terminal: `dlv connect localhost:40000` then type `continue` and hit enter
|
|
||||||
|
|
||||||
To verify that the components are installed, you can use the following command:
|
|
||||||
|
|
||||||
```console
|
|
||||||
$ kubectl get all -n docker
|
|
||||||
```
|
|
||||||
|
|
||||||
To verify that the API server has started, ensure that it has started logging:
|
|
||||||
```console
|
|
||||||
$ kubectl logs -f -n docker deployment.apps/compose-api compose
|
|
||||||
API server listening at: [::]:40000
|
|
||||||
ERROR: logging before flag.Parse: I1207 15:25:13.760739 11 plugins.go:158] Loaded 2 mutating admission controller(s) successfully in the following order: NamespaceLifecycle,MutatingAdmissionWebhook.
|
|
||||||
ERROR: logging before flag.Parse: I1207 15:25:13.763211 11 plugins.go:161] Loaded 1 validating admission controller(s) successfully in the following order: ValidatingAdmissionWebhook.
|
|
||||||
ERROR: logging before flag.Parse: W1207 15:25:13.767429 11 client_config.go:552] Neither --kubeconfig nor --master was specified. Using the inClusterConfig. This might not work.
|
|
||||||
ERROR: logging before flag.Parse: W1207 15:25:13.851500 11 genericapiserver.go:319] Skipping API compose.docker.com/storage because it has no resources.
|
|
||||||
ERROR: logging before flag.Parse: I1207 15:25:13.998154 11 serve.go:116] Serving securely on [::]:9443
|
|
||||||
```
|
|
||||||
|
|
||||||
To verify that the Compose controller has started, ensure that it is logging:
|
|
||||||
```console
|
|
||||||
kubectl logs -f -n docker deployment.apps/compose
|
|
||||||
API server listening at: [::]:40000
|
|
||||||
Version: v0.4.16-dirty
|
|
||||||
Git commit: b2e3a6b-dirty
|
|
||||||
OS/Arch: linux/amd64
|
|
||||||
Built: Fri Dec 7 15:18:13 2018
|
|
||||||
time="2018-12-07T15:25:19Z" level=info msg="Controller ready"
|
|
||||||
```
|
|
||||||
|
|
||||||
## Reinstall default
|
|
||||||
|
|
||||||
To reinstall the default Compose on Kubernetes on Docker Desktop, simply restart
|
|
||||||
your Kubernetes cluster. You can do this by deactivating and then reactivating
|
|
||||||
Kubernetes or by restarting Docker Desktop.
|
|
||||||
See the [contributing](./CONTRIBUTING.md) and [debugging](./DEBUGGING.md) guides.
|
|
||||||
|
|
||||||
# Deploying Compose on Kubernetes
|
|
||||||
|
|
||||||
- Guide for [Azure AKS](./docs/install-on-aks.md).
|
|
||||||
- Guide for [GKE](./docs/install-on-gke.md).
|
|
||||||
- Guide for [Microk8s](./docs/install-on-microk8s.md).
|
|
||||||
- Guide for [Minikube](./docs/install-on-minikube.md).
|
|
|
@ -0,0 +1,38 @@
|
||||||
|
# Compiled Object files, Static and Dynamic libs (Shared Objects)
|
||||||
|
*.o
|
||||||
|
*.a
|
||||||
|
*.so
|
||||||
|
|
||||||
|
# Folders
|
||||||
|
_obj
|
||||||
|
_test
|
||||||
|
|
||||||
|
# Architecture specific extensions/prefixes
|
||||||
|
*.[568vq]
|
||||||
|
[568vq].out
|
||||||
|
|
||||||
|
*.cgo1.go
|
||||||
|
*.cgo2.c
|
||||||
|
_cgo_defun.c
|
||||||
|
_cgo_gotypes.go
|
||||||
|
_cgo_export.*
|
||||||
|
|
||||||
|
_testmain.go
|
||||||
|
|
||||||
|
*.exe
|
||||||
|
*.test
|
||||||
|
*.prof
|
||||||
|
|
||||||
|
# never checkin from the bin file (for now)
|
||||||
|
bin/*
|
||||||
|
|
||||||
|
# Test key files
|
||||||
|
*.pem
|
||||||
|
|
||||||
|
# Cover profiles
|
||||||
|
*.out
|
||||||
|
|
||||||
|
# Editor/IDE specific files.
|
||||||
|
*.sublime-project
|
||||||
|
*.sublime-workspace
|
||||||
|
.idea/*
|
|
@ -0,0 +1,16 @@
|
||||||
|
{
|
||||||
|
"Vendor": true,
|
||||||
|
"Deadline": "2m",
|
||||||
|
"Sort": ["linter", "severity", "path", "line"],
|
||||||
|
"EnableGC": true,
|
||||||
|
"Enable": [
|
||||||
|
"structcheck",
|
||||||
|
"staticcheck",
|
||||||
|
"unconvert",
|
||||||
|
|
||||||
|
"gofmt",
|
||||||
|
"goimports",
|
||||||
|
"golint",
|
||||||
|
"vet"
|
||||||
|
]
|
||||||
|
}
|
|
@ -0,0 +1,32 @@
|
||||||
|
Stephen J Day <stephen.day@docker.com> Stephen Day <stevvooe@users.noreply.github.com>
|
||||||
|
Stephen J Day <stephen.day@docker.com> Stephen Day <stevvooe@gmail.com>
|
||||||
|
Olivier Gambier <olivier@docker.com> Olivier Gambier <dmp42@users.noreply.github.com>
|
||||||
|
Brian Bland <brian.bland@docker.com> Brian Bland <r4nd0m1n4t0r@gmail.com>
|
||||||
|
Brian Bland <brian.bland@docker.com> Brian Bland <brian.t.bland@gmail.com>
|
||||||
|
Josh Hawn <josh.hawn@docker.com> Josh Hawn <jlhawn@berkeley.edu>
|
||||||
|
Richard Scothern <richard.scothern@docker.com> Richard <richard.scothern@gmail.com>
|
||||||
|
Richard Scothern <richard.scothern@docker.com> Richard Scothern <richard.scothern@gmail.com>
|
||||||
|
Andrew Meredith <andymeredith@gmail.com> Andrew Meredith <kendru@users.noreply.github.com>
|
||||||
|
harche <p.harshal@gmail.com> harche <harche@users.noreply.github.com>
|
||||||
|
Jessie Frazelle <jessie@docker.com> <jfrazelle@users.noreply.github.com>
|
||||||
|
Sharif Nassar <sharif@mrwacky.com> Sharif Nassar <mrwacky42@users.noreply.github.com>
|
||||||
|
Sven Dowideit <SvenDowideit@home.org.au> Sven Dowideit <SvenDowideit@users.noreply.github.com>
|
||||||
|
Vincent Giersch <vincent.giersch@ovh.net> Vincent Giersch <vincent@giersch.fr>
|
||||||
|
davidli <wenquan.li@hp.com> davidli <wenquan.li@hpe.com>
|
||||||
|
Omer Cohen <git@omer.io> Omer Cohen <git@omerc.net>
|
||||||
|
Eric Yang <windfarer@gmail.com> Eric Yang <Windfarer@users.noreply.github.com>
|
||||||
|
Nikita Tarasov <nikita@mygento.ru> Nikita <luckyraul@users.noreply.github.com>
|
||||||
|
Yu Wang <yuwa@microsoft.com> yuwaMSFT2 <yuwa@microsoft.com>
|
||||||
|
Yu Wang <yuwa@microsoft.com> Yu Wang (UC) <yuwa@microsoft.com>
|
||||||
|
Olivier Gambier <olivier@docker.com> dmp <dmp@loaner.local>
|
||||||
|
Olivier Gambier <olivier@docker.com> Olivier <o+github@gambier.email>
|
||||||
|
Olivier Gambier <olivier@docker.com> Olivier <dmp42@users.noreply.github.com>
|
||||||
|
Elsan Li 李楠 <elsanli@tencent.com> elsanli(李楠) <elsanli@tencent.com>
|
||||||
|
Rui Cao <ruicao@alauda.io> ruicao <ruicao@alauda.io>
|
||||||
|
Gwendolynne Barr <gwendolynne.barr@docker.com> gbarr01 <gwendolynne.barr@docker.com>
|
||||||
|
Haibing Zhou 周海兵 <zhouhaibing089@gmail.com> zhouhaibing089 <zhouhaibing089@gmail.com>
|
||||||
|
Feng Honglin <tifayuki@gmail.com> tifayuki <tifayuki@gmail.com>
|
||||||
|
Helen Xie <xieyulin821@harmonycloud.cn> Helen-xie <xieyulin821@harmonycloud.cn>
|
||||||
|
Mike Brown <brownwm@us.ibm.com> Mike Brown <mikebrow@users.noreply.github.com>
|
||||||
|
Manish Tomar <manish.tomar@docker.com> Manish Tomar <manishtomar@users.noreply.github.com>
|
||||||
|
Sakeven Jiang <jc5930@sina.cn> sakeven <jc5930@sina.cn>
|
|
@ -0,0 +1,51 @@
|
||||||
|
dist: trusty
|
||||||
|
sudo: required
|
||||||
|
# setup travis so that we can run containers for integration tests
|
||||||
|
services:
|
||||||
|
- docker
|
||||||
|
|
||||||
|
language: go
|
||||||
|
|
||||||
|
go:
|
||||||
|
- "1.11.x"
|
||||||
|
|
||||||
|
go_import_path: github.com/docker/distribution
|
||||||
|
|
||||||
|
addons:
|
||||||
|
apt:
|
||||||
|
packages:
|
||||||
|
- python-minimal
|
||||||
|
|
||||||
|
|
||||||
|
env:
|
||||||
|
- TRAVIS_GOOS=linux DOCKER_BUILDTAGS="include_oss include_gcs" TRAVIS_CGO_ENABLED=1
|
||||||
|
|
||||||
|
before_install:
|
||||||
|
- uname -r
|
||||||
|
- sudo apt-get -q update
|
||||||
|
|
||||||
|
install:
|
||||||
|
- go get -u github.com/vbatts/git-validation
|
||||||
|
# TODO: Add enforcement of license
|
||||||
|
# - go get -u github.com/kunalkushwaha/ltag
|
||||||
|
- cd $TRAVIS_BUILD_DIR
|
||||||
|
|
||||||
|
script:
|
||||||
|
- export GOOS=$TRAVIS_GOOS
|
||||||
|
- export CGO_ENABLED=$TRAVIS_CGO_ENABLED
|
||||||
|
- DCO_VERBOSITY=-q script/validate/dco
|
||||||
|
- GOOS=linux script/setup/install-dev-tools
|
||||||
|
- script/validate/vendor
|
||||||
|
- go build -i .
|
||||||
|
- make check
|
||||||
|
- make build
|
||||||
|
- make binaries
|
||||||
|
# Currently takes too long
|
||||||
|
#- if [ "$GOOS" = "linux" ]; then make test-race ; fi
|
||||||
|
- if [ "$GOOS" = "linux" ]; then make coverage ; fi
|
||||||
|
|
||||||
|
after_success:
|
||||||
|
- bash <(curl -s https://codecov.io/bash) -F linux
|
||||||
|
|
||||||
|
before_deploy:
|
||||||
|
# Run tests with storage driver configurations
|
|
@ -0,0 +1,117 @@
|
||||||
|
|
||||||
|
# Building the registry source
|
||||||
|
|
||||||
|
## Use-case
|
||||||
|
|
||||||
|
This is useful if you intend to actively work on the registry.
|
||||||
|
|
||||||
|
### Alternatives
|
||||||
|
|
||||||
|
Most people should use the [official Registry docker image](https://hub.docker.com/r/library/registry/).
|
||||||
|
|
||||||
|
People looking for advanced operational use cases might consider rolling their own image with a custom Dockerfile inheriting `FROM registry:2`.
|
||||||
|
|
||||||
|
OS X users who want to run natively can do so following [the instructions here](https://github.com/docker/docker.github.io/blob/master/registry/recipes/osx-setup-guide.md).
|
||||||
|
|
||||||
|
### Gotchas
|
||||||
|
|
||||||
|
You are expected to know your way around with go & git.
|
||||||
|
|
||||||
|
If you are a casual user with no development experience, and no preliminary knowledge of go, building from source is probably not a good solution for you.
|
||||||
|
|
||||||
|
## Build the development environment
|
||||||
|
|
||||||
|
The first prerequisite of properly building distribution targets is to have a Go
|
||||||
|
development environment setup. Please follow [How to Write Go Code](https://golang.org/doc/code.html)
|
||||||
|
for proper setup. If done correctly, you should have a GOROOT and GOPATH set in the
|
||||||
|
environment.
|
||||||
|
|
||||||
|
If a Go development environment is setup, one can use `go get` to install the
|
||||||
|
`registry` command from the current latest:
|
||||||
|
|
||||||
|
go get github.com/docker/distribution/cmd/registry
|
||||||
|
|
||||||
|
The above will install the source repository into the `GOPATH`.
|
||||||
|
|
||||||
|
Now create the directory for the registry data (this might require you to set permissions properly)
|
||||||
|
|
||||||
|
mkdir -p /var/lib/registry
|
||||||
|
|
||||||
|
... or alternatively `export REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY=/somewhere` if you want to store data into another location.
|
||||||
|
|
||||||
|
The `registry`
|
||||||
|
binary can then be run with the following:
|
||||||
|
|
||||||
|
$ $GOPATH/bin/registry --version
|
||||||
|
$GOPATH/bin/registry github.com/docker/distribution v2.0.0-alpha.1+unknown
|
||||||
|
|
||||||
|
> __NOTE:__ While you do not need to use `go get` to checkout the distribution
|
||||||
|
> project, for these build instructions to work, the project must be checked
|
||||||
|
> out in the correct location in the `GOPATH`. This should almost always be
|
||||||
|
> `$GOPATH/src/github.com/docker/distribution`.
|
||||||
|
|
||||||
|
The registry can be run with the default config using the following
|
||||||
|
incantation:
|
||||||
|
|
||||||
|
$ $GOPATH/bin/registry serve $GOPATH/src/github.com/docker/distribution/cmd/registry/config-example.yml
|
||||||
|
INFO[0000] endpoint local-5003 disabled, skipping app.id=34bbec38-a91a-494a-9a3f-b72f9010081f version=v2.0.0-alpha.1+unknown
|
||||||
|
INFO[0000] endpoint local-8083 disabled, skipping app.id=34bbec38-a91a-494a-9a3f-b72f9010081f version=v2.0.0-alpha.1+unknown
|
||||||
|
INFO[0000] listening on :5000 app.id=34bbec38-a91a-494a-9a3f-b72f9010081f version=v2.0.0-alpha.1+unknown
|
||||||
|
INFO[0000] debug server listening localhost:5001
|
||||||
|
|
||||||
|
If it is working, one should see the above log messages.
|
||||||
|
|
||||||
|
### Repeatable Builds
|
||||||
|
|
||||||
|
For the full development experience, one should `cd` into
|
||||||
|
`$GOPATH/src/github.com/docker/distribution`. From there, the regular `go`
|
||||||
|
commands, such as `go test`, should work per package (please see
|
||||||
|
[Developing](#developing) if they don't work).
|
||||||
|
|
||||||
|
A `Makefile` has been provided as a convenience to support repeatable builds.
|
||||||
|
Please install the following into `GOPATH` for it to work:
|
||||||
|
|
||||||
|
go get github.com/golang/lint/golint
|
||||||
|
|
||||||
|
Once these commands are available in the `GOPATH`, run `make` to get a full
|
||||||
|
build:
|
||||||
|
|
||||||
|
$ make
|
||||||
|
+ clean
|
||||||
|
+ fmt
|
||||||
|
+ vet
|
||||||
|
+ lint
|
||||||
|
+ build
|
||||||
|
github.com/docker/docker/vendor/src/code.google.com/p/go/src/pkg/archive/tar
|
||||||
|
github.com/sirupsen/logrus
|
||||||
|
github.com/docker/libtrust
|
||||||
|
...
|
||||||
|
github.com/yvasiyarov/gorelic
|
||||||
|
github.com/docker/distribution/registry/handlers
|
||||||
|
github.com/docker/distribution/cmd/registry
|
||||||
|
+ test
|
||||||
|
...
|
||||||
|
ok github.com/docker/distribution/digest 7.875s
|
||||||
|
ok github.com/docker/distribution/manifest 0.028s
|
||||||
|
ok github.com/docker/distribution/notifications 17.322s
|
||||||
|
? github.com/docker/distribution/registry [no test files]
|
||||||
|
ok github.com/docker/distribution/registry/api/v2 0.101s
|
||||||
|
? github.com/docker/distribution/registry/auth [no test files]
|
||||||
|
ok github.com/docker/distribution/registry/auth/silly 0.011s
|
||||||
|
...
|
||||||
|
+ /Users/sday/go/src/github.com/docker/distribution/bin/registry
|
||||||
|
+ /Users/sday/go/src/github.com/docker/distribution/bin/registry-api-descriptor-template
|
||||||
|
+ binaries
|
||||||
|
|
||||||
|
The above provides a repeatable build using the contents of the vendor
|
||||||
|
directory. This includes formatting, vetting, linting, building,
|
||||||
|
testing and generating tagged binaries. We can verify this worked by running
|
||||||
|
the registry binary generated in the "./bin" directory:
|
||||||
|
|
||||||
|
$ ./bin/registry --version
|
||||||
|
./bin/registry github.com/docker/distribution v2.0.0-alpha.2-80-g16d8b2c.m
|
||||||
|
|
||||||
|
### Optional build tags
|
||||||
|
|
||||||
|
Optional [build tags](http://golang.org/pkg/go/build/) can be provided using
|
||||||
|
the environment variable `DOCKER_BUILDTAGS`.
|
|
@ -0,0 +1,148 @@
|
||||||
|
# Contributing to the registry
|
||||||
|
|
||||||
|
## Before reporting an issue...
|
||||||
|
|
||||||
|
### If your problem is with...
|
||||||
|
|
||||||
|
- automated builds
|
||||||
|
- your account on the [Docker Hub](https://hub.docker.com/)
|
||||||
|
- any other [Docker Hub](https://hub.docker.com/) issue
|
||||||
|
|
||||||
|
Then please do not report your issue here - you should instead report it to [https://support.docker.com](https://support.docker.com)
|
||||||
|
|
||||||
|
### If you...
|
||||||
|
|
||||||
|
- need help setting up your registry
|
||||||
|
- can't figure out something
|
||||||
|
- are not sure what's going on or what your problem is
|
||||||
|
|
||||||
|
Then please do not open an issue here yet - you should first try one of the following support forums:
|
||||||
|
|
||||||
|
- irc: #docker-distribution on freenode
|
||||||
|
- mailing-list: <distribution@dockerproject.org> or https://groups.google.com/a/dockerproject.org/forum/#!forum/distribution
|
||||||
|
|
||||||
|
### Reporting security issues
|
||||||
|
|
||||||
|
The Docker maintainers take security seriously. If you discover a security
|
||||||
|
issue, please bring it to their attention right away!
|
||||||
|
|
||||||
|
Please **DO NOT** file a public issue, instead send your report privately to
|
||||||
|
[security@docker.com](mailto:security@docker.com).
|
||||||
|
|
||||||
|
## Reporting an issue properly
|
||||||
|
|
||||||
|
By following these simple rules you will get better and faster feedback on your issue.
|
||||||
|
|
||||||
|
- search the bugtracker for an already reported issue
|
||||||
|
|
||||||
|
### If you found an issue that describes your problem:
|
||||||
|
|
||||||
|
- please read other user comments first, and confirm this is the same issue: a given error condition might be indicative of different problems - you may also find a workaround in the comments
|
||||||
|
- please refrain from adding "same thing here" or "+1" comments
|
||||||
|
- you don't need to comment on an issue to get notified of updates: just hit the "subscribe" button
|
||||||
|
- comment if you have some new, technical and relevant information to add to the case
|
||||||
|
- __DO NOT__ comment on closed issues or merged PRs. If you think you have a related problem, open up a new issue and reference the PR or issue.
|
||||||
|
|
||||||
|
### If you have not found an existing issue that describes your problem:
|
||||||
|
|
||||||
|
1. create a new issue, with a succinct title that describes your issue:
|
||||||
|
- bad title: "It doesn't work with my docker"
|
||||||
|
- good title: "Private registry push fail: 400 error with E_INVALID_DIGEST"
|
||||||
|
2. copy the output of:
|
||||||
|
- `docker version`
|
||||||
|
- `docker info`
|
||||||
|
- `docker exec <registry-container> registry --version`
|
||||||
|
3. copy the command line you used to launch your Registry
|
||||||
|
4. restart your docker daemon in debug mode (add `-D` to the daemon launch arguments)
|
||||||
|
5. reproduce your problem and get your docker daemon logs showing the error
|
||||||
|
6. if relevant, copy your registry logs that show the error
|
||||||
|
7. provide any relevant detail about your specific Registry configuration (e.g., storage backend used)
|
||||||
|
8. indicate if you are using an enterprise proxy, Nginx, or anything else between you and your Registry
|
||||||
|
|
||||||
|
## Contributing a patch for a known bug, or a small correction
|
||||||
|
|
||||||
|
You should follow the basic GitHub workflow:
|
||||||
|
|
||||||
|
1. fork
|
||||||
|
2. commit a change
|
||||||
|
3. make sure the tests pass
|
||||||
|
4. PR
|
||||||
|
|
||||||
|
Additionally, you must [sign your commits](https://github.com/docker/docker/blob/master/CONTRIBUTING.md#sign-your-work). It's very simple:
|
||||||
|
|
||||||
|
- configure your name with git: `git config user.name "Real Name" && git config user.email mail@example.com`
|
||||||
|
- sign your commits using `-s`: `git commit -s -m "My commit"`
|
||||||
|
|
||||||
|
Some simple rules to ensure quick merge:
|
||||||
|
|
||||||
|
- clearly point to the issue(s) you want to fix in your PR comment (e.g., `closes #12345`)
|
||||||
|
- prefer multiple (smaller) PRs addressing individual issues over a big one trying to address multiple issues at once
|
||||||
|
- if you need to amend your PR following comments, please squash instead of adding more commits
|
||||||
|
|
||||||
|
## Contributing new features
|
||||||
|
|
||||||
|
You are heavily encouraged to first discuss what you want to do. You can do so on the irc channel, or by opening an issue that clearly describes the use case you want to fulfill, or the problem you are trying to solve.
|
||||||
|
|
||||||
|
If this is a major new feature, you should then submit a proposal that describes your technical solution and reasoning.
|
||||||
|
If you did discuss it first, this will likely be greenlighted very fast. It's advisable to address all feedback on this proposal before starting actual work.
|
||||||
|
|
||||||
|
Then you should submit your implementation, clearly linking to the issue (and possible proposal).
|
||||||
|
|
||||||
|
Your PR will be reviewed by the community, then ultimately by the project maintainers, before being merged.
|
||||||
|
|
||||||
|
It's mandatory to:
|
||||||
|
|
||||||
|
- interact respectfully with other community members and maintainers - more generally, you are expected to abide by the [Docker community rules](https://github.com/docker/docker/blob/master/CONTRIBUTING.md#docker-community-guidelines)
|
||||||
|
- address maintainers' comments and modify your submission accordingly
|
||||||
|
- write tests for any new code
|
||||||
|
|
||||||
|
Complying to these simple rules will greatly accelerate the review process, and will ensure you have a pleasant experience in contributing code to the Registry.
|
||||||
|
|
||||||
|
Have a look at a great, successful contribution: the [Swift driver PR](https://github.com/docker/distribution/pull/493)
|
||||||
|
|
||||||
|
## Coding Style
|
||||||
|
|
||||||
|
Unless explicitly stated, we follow all coding guidelines from the Go
|
||||||
|
community. While some of these standards may seem arbitrary, they somehow seem
|
||||||
|
to result in a solid, consistent codebase.
|
||||||
|
|
||||||
|
It is possible that the code base does not currently comply with these
|
||||||
|
guidelines. We are not looking for a massive PR that fixes this, since that
|
||||||
|
goes against the spirit of the guidelines. All new contributions should make a
|
||||||
|
best effort to clean up and make the code base better than they left it.
|
||||||
|
Obviously, apply your best judgement. Remember, the goal here is to make the
|
||||||
|
code base easier for humans to navigate and understand. Always keep that in
|
||||||
|
mind when nudging others to comply.
|
||||||
|
|
||||||
|
The rules:
|
||||||
|
|
||||||
|
1. All code should be formatted with `gofmt -s`.
|
||||||
|
2. All code should pass the default levels of
|
||||||
|
[`golint`](https://github.com/golang/lint).
|
||||||
|
3. All code should follow the guidelines covered in [Effective
|
||||||
|
Go](http://golang.org/doc/effective_go.html) and [Go Code Review
|
||||||
|
Comments](https://github.com/golang/go/wiki/CodeReviewComments).
|
||||||
|
4. Comment the code. Tell us the why, the history and the context.
|
||||||
|
5. Document _all_ declarations and methods, even private ones. Declare
|
||||||
|
expectations, caveats and anything else that may be important. If a type
|
||||||
|
gets exported, having the comments already there will ensure it's ready.
|
||||||
|
6. Variable name length should be proportional to its context and no longer.
|
||||||
|
`noCommaALongVariableNameLikeThisIsNotMoreClearWhenASimpleCommentWouldDo`.
|
||||||
|
In practice, short methods will have short variable names and globals will
|
||||||
|
have longer names.
|
||||||
|
7. No underscores in package names. If you need a compound name, step back,
|
||||||
|
and re-examine why you need a compound name. If you still think you need a
|
||||||
|
compound name, lose the underscore.
|
||||||
|
8. No utils or helpers packages. If a function is not general enough to
|
||||||
|
warrant its own package, it has not been written generally enough to be a
|
||||||
|
part of a util package. Just leave it unexported and well-documented.
|
||||||
|
9. All tests should run with `go test` and outside tooling should not be
|
||||||
|
required. No, we don't need another unit testing framework. Assertion
|
||||||
|
packages are acceptable if they provide _real_ incremental value.
|
||||||
|
10. Even though we call these "rules" above, they are actually just
|
||||||
|
guidelines. Since you've read all the rules, you now know that.
|
||||||
|
|
||||||
|
If you are having trouble getting into the mood of idiomatic Go, we recommend
|
||||||
|
reading through [Effective Go](http://golang.org/doc/effective_go.html). The
|
||||||
|
[Go Blog](http://blog.golang.org/) is also a great resource. Drinking the
|
||||||
|
kool-aid is a lot easier than going thirsty.
|
|
@ -0,0 +1,23 @@
|
||||||
|
FROM golang:1.11-alpine AS build
|
||||||
|
|
||||||
|
ENV DISTRIBUTION_DIR /go/src/github.com/docker/distribution
|
||||||
|
ENV DOCKER_BUILDTAGS include_oss include_gcs
|
||||||
|
|
||||||
|
ARG GOOS=linux
|
||||||
|
ARG GOARCH=amd64
|
||||||
|
ARG GOARM=6
|
||||||
|
|
||||||
|
RUN set -ex \
|
||||||
|
&& apk add --no-cache make git file
|
||||||
|
|
||||||
|
WORKDIR $DISTRIBUTION_DIR
|
||||||
|
COPY . $DISTRIBUTION_DIR
|
||||||
|
RUN CGO_ENABLED=0 make PREFIX=/go clean binaries && file ./bin/registry | grep "statically linked"
|
||||||
|
|
||||||
|
FROM alpine
|
||||||
|
COPY cmd/registry/config-dev.yml /etc/docker/registry/config.yml
|
||||||
|
COPY --from=build /go/src/github.com/docker/distribution/bin/registry /bin/registry
|
||||||
|
VOLUME ["/var/lib/registry"]
|
||||||
|
EXPOSE 5000
|
||||||
|
ENTRYPOINT ["registry"]
|
||||||
|
CMD ["serve", "/etc/docker/registry/config.yml"]
|
|
@ -0,0 +1,243 @@
|
||||||
|
# Distribution maintainers file
|
||||||
|
#
|
||||||
|
# This file describes who runs the docker/distribution project and how.
|
||||||
|
# This is a living document - if you see something out of date or missing, speak up!
|
||||||
|
#
|
||||||
|
# It is structured to be consumable by both humans and programs.
|
||||||
|
# To extract its contents programmatically, use any TOML-compliant parser.
|
||||||
|
#
|
||||||
|
|
||||||
|
[Rules]
|
||||||
|
|
||||||
|
[Rules.maintainers]
|
||||||
|
|
||||||
|
title = "What is a maintainer?"
|
||||||
|
|
||||||
|
text = """
|
||||||
|
There are different types of maintainers, with different responsibilities, but
|
||||||
|
all maintainers have 3 things in common:
|
||||||
|
|
||||||
|
1) They share responsibility in the project's success.
|
||||||
|
2) They have made a long-term, recurring time investment to improve the project.
|
||||||
|
3) They spend that time doing whatever needs to be done, not necessarily what
|
||||||
|
is the most interesting or fun.
|
||||||
|
|
||||||
|
Maintainers are often under-appreciated, because their work is harder to appreciate.
|
||||||
|
It's easy to appreciate a really cool and technically advanced feature. It's harder
|
||||||
|
to appreciate the absence of bugs, the slow but steady improvement in stability,
|
||||||
|
or the reliability of a release process. But those things distinguish a good
|
||||||
|
project from a great one.
|
||||||
|
"""
|
||||||
|
|
||||||
|
[Rules.reviewer]
|
||||||
|
|
||||||
|
title = "What is a reviewer?"
|
||||||
|
|
||||||
|
text = """
|
||||||
|
A reviewer is a core role within the project.
|
||||||
|
They share in reviewing issues and pull requests and their LGTM count towards the
|
||||||
|
required LGTM count to merge a code change into the project.
|
||||||
|
|
||||||
|
Reviewers are part of the organization but do not have write access.
|
||||||
|
Becoming a reviewer is a core aspect in the journey to becoming a maintainer.
|
||||||
|
"""
|
||||||
|
|
||||||
|
[Rules.adding-maintainers]
|
||||||
|
|
||||||
|
title = "How are maintainers added?"
|
||||||
|
|
||||||
|
text = """
|
||||||
|
Maintainers are first and foremost contributors that have shown they are
|
||||||
|
committed to the long term success of a project. Contributors wanting to become
|
||||||
|
maintainers are expected to be deeply involved in contributing code, pull
|
||||||
|
request review, and triage of issues in the project for more than three months.
|
||||||
|
|
||||||
|
Just contributing does not make you a maintainer, it is about building trust
|
||||||
|
with the current maintainers of the project and being a person that they can
|
||||||
|
depend on and trust to make decisions in the best interest of the project.
|
||||||
|
|
||||||
|
Periodically, the existing maintainers curate a list of contributors that have
|
||||||
|
shown regular activity on the project over the prior months. From this list,
|
||||||
|
maintainer candidates are selected and proposed on the maintainers mailing list.
|
||||||
|
|
||||||
|
After a candidate has been announced on the maintainers mailing list, the
|
||||||
|
existing maintainers are given five business days to discuss the candidate,
|
||||||
|
raise objections and cast their vote. Candidates must be approved by at least 66% of the current maintainers by adding their vote on the mailing
|
||||||
|
list. Only maintainers of the repository that the candidate is proposed for are
|
||||||
|
allowed to vote.
|
||||||
|
|
||||||
|
If a candidate is approved, a maintainer will contact the candidate to invite
|
||||||
|
the candidate to open a pull request that adds the contributor to the
|
||||||
|
MAINTAINERS file. The candidate becomes a maintainer once the pull request is
|
||||||
|
merged.
|
||||||
|
"""
|
||||||
|
|
||||||
|
[Rules.stepping-down-policy]
|
||||||
|
|
||||||
|
title = "Stepping down policy"
|
||||||
|
|
||||||
|
text = """
|
||||||
|
Life priorities, interests, and passions can change. If you're a maintainer but
|
||||||
|
feel you must remove yourself from the list, inform other maintainers that you
|
||||||
|
intend to step down, and if possible, help find someone to pick up your work.
|
||||||
|
At the very least, ensure your work can be continued where you left off.
|
||||||
|
|
||||||
|
After you've informed other maintainers, create a pull request to remove
|
||||||
|
yourself from the MAINTAINERS file.
|
||||||
|
"""
|
||||||
|
|
||||||
|
[Rules.inactive-maintainers]
|
||||||
|
|
||||||
|
title = "Removal of inactive maintainers"
|
||||||
|
|
||||||
|
text = """
|
||||||
|
Similar to the procedure for adding new maintainers, existing maintainers can
|
||||||
|
be removed from the list if they do not show significant activity on the
|
||||||
|
project. Periodically, the maintainers review the list of maintainers and their
|
||||||
|
activity over the last three months.
|
||||||
|
|
||||||
|
If a maintainer has shown insufficient activity over this period, a neutral
|
||||||
|
person will contact the maintainer to ask if they want to continue being
|
||||||
|
a maintainer. If the maintainer decides to step down as a maintainer, they
|
||||||
|
open a pull request to be removed from the MAINTAINERS file.
|
||||||
|
|
||||||
|
If the maintainer wants to remain a maintainer, but is unable to perform the
|
||||||
|
required duties they can be removed with a vote of at least 66% of
|
||||||
|
the current maintainers. An e-mail is sent to the
|
||||||
|
mailing list, inviting maintainers of the project to vote. The voting period is
|
||||||
|
five business days. Issues related to a maintainer's performance should be
|
||||||
|
discussed with them among the other maintainers so that they are not surprised
|
||||||
|
by a pull request removing them.
|
||||||
|
"""
|
||||||
|
|
||||||
|
[Rules.decisions]
|
||||||
|
|
||||||
|
title = "How are decisions made?"
|
||||||
|
|
||||||
|
text = """
|
||||||
|
Short answer: EVERYTHING IS A PULL REQUEST.
|
||||||
|
|
||||||
|
distribution is an open-source project with an open design philosophy. This means
|
||||||
|
that the repository is the source of truth for EVERY aspect of the project,
|
||||||
|
including its philosophy, design, road map, and APIs. *If it's part of the
|
||||||
|
project, it's in the repo. If it's in the repo, it's part of the project.*
|
||||||
|
|
||||||
|
As a result, all decisions can be expressed as changes to the repository. An
|
||||||
|
implementation change is a change to the source code. An API change is a change
|
||||||
|
to the API specification. A philosophy change is a change to the philosophy
|
||||||
|
manifesto, and so on.
|
||||||
|
|
||||||
|
All decisions affecting distribution, big and small, follow the same 3 steps:
|
||||||
|
|
||||||
|
* Step 1: Open a pull request. Anyone can do this.
|
||||||
|
|
||||||
|
* Step 2: Discuss the pull request. Anyone can do this.
|
||||||
|
|
||||||
|
* Step 3: Merge or refuse the pull request. Who does this depends on the nature
|
||||||
|
of the pull request and which areas of the project it affects.
|
||||||
|
"""
|
||||||
|
|
||||||
|
[Rules.DCO]
|
||||||
|
|
||||||
|
title = "Helping contributors with the DCO"
|
||||||
|
|
||||||
|
text = """
|
||||||
|
The [DCO or `Sign your work`](
|
||||||
|
https://github.com/moby/moby/blob/master/CONTRIBUTING.md#sign-your-work)
|
||||||
|
requirement is not intended as a roadblock or speed bump.
|
||||||
|
|
||||||
|
Some distribution contributors are not as familiar with `git`, or have used a web
|
||||||
|
based editor, and thus asking them to `git commit --amend -s` is not the best
|
||||||
|
way forward.
|
||||||
|
|
||||||
|
In this case, maintainers can update the commits based on clause (c) of the DCO.
|
||||||
|
The most trivial way for a contributor to allow the maintainer to do this, is to
|
||||||
|
add a DCO signature in a pull requests's comment, or a maintainer can simply
|
||||||
|
note that the change is sufficiently trivial that it does not substantially
|
||||||
|
change the existing contribution - i.e., a spelling change.
|
||||||
|
|
||||||
|
When you add someone's DCO, please also add your own to keep a log.
|
||||||
|
"""
|
||||||
|
|
||||||
|
[Rules."no direct push"]
|
||||||
|
|
||||||
|
title = "I'm a maintainer. Should I make pull requests too?"
|
||||||
|
|
||||||
|
text = """
|
||||||
|
Yes. Nobody should ever push to master directly. All changes should be
|
||||||
|
made through a pull request.
|
||||||
|
"""
|
||||||
|
|
||||||
|
[Rules.tsc]
|
||||||
|
|
||||||
|
title = "Conflict Resolution and technical disputes"
|
||||||
|
|
||||||
|
text = """
|
||||||
|
distribution defers to the [Technical Steering Committee](https://github.com/moby/tsc) for escalations and resolution on disputes for technical matters."
|
||||||
|
"""
|
||||||
|
|
||||||
|
[Rules.meta]
|
||||||
|
|
||||||
|
title = "How is this process changed?"
|
||||||
|
|
||||||
|
text = "Just like everything else: by making a pull request :)"
|
||||||
|
|
||||||
|
# Current project organization
|
||||||
|
[Org]
|
||||||
|
|
||||||
|
[Org.Maintainers]
|
||||||
|
people = [
|
||||||
|
"dmcgowan",
|
||||||
|
"dmp42",
|
||||||
|
"stevvooe",
|
||||||
|
]
|
||||||
|
[Org.Reviewers]
|
||||||
|
people = [
|
||||||
|
"manishtomar",
|
||||||
|
"caervs",
|
||||||
|
"davidswu",
|
||||||
|
"RobbKistler"
|
||||||
|
]
|
||||||
|
|
||||||
|
[people]
|
||||||
|
|
||||||
|
# A reference list of all people associated with the project.
|
||||||
|
# All other sections should refer to people by their canonical key
|
||||||
|
# in the people section.
|
||||||
|
|
||||||
|
# ADD YOURSELF HERE IN ALPHABETICAL ORDER
|
||||||
|
|
||||||
|
[people.caervs]
|
||||||
|
Name = "Ryan Abrams"
|
||||||
|
Email = "rdabrams@gmail.com"
|
||||||
|
GitHub = "caervs"
|
||||||
|
|
||||||
|
[people.davidswu]
|
||||||
|
Name = "David Wu"
|
||||||
|
Email = "dwu7401@gmail.com"
|
||||||
|
GitHub = "davidswu"
|
||||||
|
|
||||||
|
[people.dmcgowan]
|
||||||
|
Name = "Derek McGowan"
|
||||||
|
Email = "derek@mcgstyle.net"
|
||||||
|
GitHub = "dmcgowan"
|
||||||
|
|
||||||
|
[people.dmp42]
|
||||||
|
Name = "Olivier Gambier"
|
||||||
|
Email = "olivier@docker.com"
|
||||||
|
GitHub = "dmp42"
|
||||||
|
|
||||||
|
[people.manishtomar]
|
||||||
|
Name = "Manish Tomar"
|
||||||
|
Email = "manish.tomar@docker.com"
|
||||||
|
GitHub = "manishtomar"
|
||||||
|
|
||||||
|
[people.RobbKistler]
|
||||||
|
Name = "Robb Kistler"
|
||||||
|
Email = "robb.kistler@docker.com"
|
||||||
|
GitHub = "RobbKistler"
|
||||||
|
|
||||||
|
[people.stevvooe]
|
||||||
|
Name = "Stephen Day"
|
||||||
|
Email = "stephen.day@docker.com"
|
||||||
|
GitHub = "stevvooe"
|
|
@ -0,0 +1,102 @@
|
||||||
|
# Root directory of the project (absolute path).
|
||||||
|
ROOTDIR=$(dir $(abspath $(lastword $(MAKEFILE_LIST))))
|
||||||
|
|
||||||
|
# Used to populate version variable in main package.
|
||||||
|
VERSION=$(shell git describe --match 'v[0-9]*' --dirty='.m' --always)
|
||||||
|
REVISION=$(shell git rev-parse HEAD)$(shell if ! git diff --no-ext-diff --quiet --exit-code; then echo .m; fi)
|
||||||
|
|
||||||
|
|
||||||
|
PKG=github.com/docker/distribution
|
||||||
|
|
||||||
|
# Project packages.
|
||||||
|
PACKAGES=$(shell go list -tags "${BUILDTAGS}" ./... | grep -v /vendor/)
|
||||||
|
INTEGRATION_PACKAGE=${PKG}
|
||||||
|
COVERAGE_PACKAGES=$(filter-out ${PKG}/registry/storage/driver/%,${PACKAGES})
|
||||||
|
|
||||||
|
|
||||||
|
# Project binaries.
|
||||||
|
COMMANDS=registry digest registry-api-descriptor-template
|
||||||
|
|
||||||
|
# Allow turning off function inlining and variable registerization
|
||||||
|
ifeq (${DISABLE_OPTIMIZATION},true)
|
||||||
|
GO_GCFLAGS=-gcflags "-N -l"
|
||||||
|
VERSION:="$(VERSION)-noopt"
|
||||||
|
endif
|
||||||
|
|
||||||
|
WHALE = "+"
|
||||||
|
|
||||||
|
# Go files
|
||||||
|
#
|
||||||
|
TESTFLAGS_RACE=
|
||||||
|
GOFILES=$(shell find . -type f -name '*.go')
|
||||||
|
GO_TAGS=$(if $(BUILDTAGS),-tags "$(BUILDTAGS)",)
|
||||||
|
GO_LDFLAGS=-ldflags '-s -w -X $(PKG)/version.Version=$(VERSION) -X $(PKG)/version.Revision=$(REVISION) -X $(PKG)/version.Package=$(PKG) $(EXTRA_LDFLAGS)'
|
||||||
|
|
||||||
|
BINARIES=$(addprefix bin/,$(COMMANDS))
|
||||||
|
|
||||||
|
# Flags passed to `go test`
|
||||||
|
TESTFLAGS ?= -v $(TESTFLAGS_RACE)
|
||||||
|
TESTFLAGS_PARALLEL ?= 8
|
||||||
|
|
||||||
|
.PHONY: all build binaries check clean test test-race test-full integration coverage
|
||||||
|
.DEFAULT: all
|
||||||
|
|
||||||
|
all: binaries
|
||||||
|
|
||||||
|
# This only needs to be generated by hand when cutting full releases.
|
||||||
|
version/version.go:
|
||||||
|
@echo "$(WHALE) $@"
|
||||||
|
./version/version.sh > $@
|
||||||
|
|
||||||
|
check: ## run all linters (TODO: enable "unused", "varcheck", "ineffassign", "unconvert", "staticheck", "goimports", "structcheck")
|
||||||
|
@echo "$(WHALE) $@"
|
||||||
|
gometalinter --config .gometalinter.json ./...
|
||||||
|
|
||||||
|
test: ## run tests, except integration test with test.short
|
||||||
|
@echo "$(WHALE) $@"
|
||||||
|
@go test ${GO_TAGS} -test.short ${TESTFLAGS} $(filter-out ${INTEGRATION_PACKAGE},${PACKAGES})
|
||||||
|
|
||||||
|
test-race: ## run tests, except integration test with test.short and race
|
||||||
|
@echo "$(WHALE) $@"
|
||||||
|
@go test ${GO_TAGS} -race -test.short ${TESTFLAGS} $(filter-out ${INTEGRATION_PACKAGE},${PACKAGES})
|
||||||
|
|
||||||
|
test-full: ## run tests, except integration tests
|
||||||
|
@echo "$(WHALE) $@"
|
||||||
|
@go test ${GO_TAGS} ${TESTFLAGS} $(filter-out ${INTEGRATION_PACKAGE},${PACKAGES})
|
||||||
|
|
||||||
|
integration: ## run integration tests
|
||||||
|
@echo "$(WHALE) $@"
|
||||||
|
@go test ${TESTFLAGS} -parallel ${TESTFLAGS_PARALLEL} ${INTEGRATION_PACKAGE}
|
||||||
|
|
||||||
|
coverage: ## generate coverprofiles from the unit tests
|
||||||
|
@echo "$(WHALE) $@"
|
||||||
|
@rm -f coverage.txt
|
||||||
|
@go test ${GO_TAGS} -i ${TESTFLAGS} $(filter-out ${INTEGRATION_PACKAGE},${COVERAGE_PACKAGES}) 2> /dev/null
|
||||||
|
@( for pkg in $(filter-out ${INTEGRATION_PACKAGE},${COVERAGE_PACKAGES}); do \
|
||||||
|
go test ${GO_TAGS} ${TESTFLAGS} \
|
||||||
|
-cover \
|
||||||
|
-coverprofile=profile.out \
|
||||||
|
-covermode=atomic $$pkg || exit; \
|
||||||
|
if [ -f profile.out ]; then \
|
||||||
|
cat profile.out >> coverage.txt; \
|
||||||
|
rm profile.out; \
|
||||||
|
fi; \
|
||||||
|
done )
|
||||||
|
|
||||||
|
FORCE:
|
||||||
|
|
||||||
|
# Build a binary from a cmd.
|
||||||
|
bin/%: cmd/% FORCE
|
||||||
|
@echo "$(WHALE) $@${BINARY_SUFFIX}"
|
||||||
|
@go build ${GO_GCFLAGS} ${GO_BUILD_FLAGS} -o $@${BINARY_SUFFIX} ${GO_LDFLAGS} ${GO_TAGS} ./$<
|
||||||
|
|
||||||
|
binaries: $(BINARIES) ## build binaries
|
||||||
|
@echo "$(WHALE) $@"
|
||||||
|
|
||||||
|
build:
|
||||||
|
@echo "$(WHALE) $@"
|
||||||
|
@go build ${GO_GCFLAGS} ${GO_BUILD_FLAGS} ${GO_LDFLAGS} ${GO_TAGS} $(PACKAGES)
|
||||||
|
|
||||||
|
clean: ## clean up binaries
|
||||||
|
@echo "$(WHALE) $@"
|
||||||
|
@rm -f $(BINARIES)
|
|
@ -0,0 +1,267 @@
|
||||||
|
# Roadmap
|
||||||
|
|
||||||
|
The Distribution Project consists of several components, some of which are
|
||||||
|
still being defined. This document defines the high-level goals of the
|
||||||
|
project, identifies the current components, and defines the release-
|
||||||
|
relationship to the Docker Platform.
|
||||||
|
|
||||||
|
* [Distribution Goals](#distribution-goals)
|
||||||
|
* [Distribution Components](#distribution-components)
|
||||||
|
* [Project Planning](#project-planning): release-relationship to the Docker Platform.
|
||||||
|
|
||||||
|
This road map is a living document, providing an overview of the goals and
|
||||||
|
considerations made in respect of the future of the project.
|
||||||
|
|
||||||
|
## Distribution Goals
|
||||||
|
|
||||||
|
- Replace the existing [docker registry](github.com/docker/docker-registry)
|
||||||
|
implementation as the primary implementation.
|
||||||
|
- Replace the existing push and pull code in the docker engine with the
|
||||||
|
distribution package.
|
||||||
|
- Define a strong data model for distributing docker images
|
||||||
|
- Provide a flexible distribution tool kit for use in the docker platform
|
||||||
|
- Unlock new distribution models
|
||||||
|
|
||||||
|
## Distribution Components
|
||||||
|
|
||||||
|
Components of the Distribution Project are managed via github [milestones](https://github.com/docker/distribution/milestones). Upcoming
|
||||||
|
features and bugfixes for a component will be added to the relevant milestone. If a feature or
|
||||||
|
bugfix is not part of a milestone, it is currently unscheduled for
|
||||||
|
implementation.
|
||||||
|
|
||||||
|
* [Registry](#registry)
|
||||||
|
* [Distribution Package](#distribution-package)
|
||||||
|
|
||||||
|
***
|
||||||
|
|
||||||
|
### Registry
|
||||||
|
|
||||||
|
The new Docker registry is the main portion of the distribution repository.
|
||||||
|
Registry 2.0 is the first release of the next-generation registry. This was
|
||||||
|
primarily focused on implementing the [new registry
|
||||||
|
API](https://github.com/docker/distribution/blob/master/docs/spec/api.md),
|
||||||
|
with a focus on security and performance.
|
||||||
|
|
||||||
|
Following from the Distribution project goals above, we have a set of goals
|
||||||
|
for registry v2 that we would like to follow in the design. New features
|
||||||
|
should be compared against these goals.
|
||||||
|
|
||||||
|
#### Data Storage and Distribution First
|
||||||
|
|
||||||
|
The registry's first goal is to provide a reliable, consistent storage
|
||||||
|
location for Docker images. The registry should only provide the minimal
|
||||||
|
amount of indexing required to fetch image data and no more.
|
||||||
|
|
||||||
|
This means we should be selective in new features and API additions, including
|
||||||
|
those that may require expensive, ever growing indexes. Requests should be
|
||||||
|
servable in "constant time".
|
||||||
|
|
||||||
|
#### Content Addressability
|
||||||
|
|
||||||
|
All data objects used in the registry API should be content addressable.
|
||||||
|
Content identifiers should be secure and verifiable. This provides a secure,
|
||||||
|
reliable base from which to build more advanced content distribution systems.
|
||||||
|
|
||||||
|
#### Content Agnostic
|
||||||
|
|
||||||
|
In the past, changes to the image format would require large changes in Docker
|
||||||
|
and the Registry. By decoupling the distribution and image format, we can
|
||||||
|
allow the formats to progress without having to coordinate between the two.
|
||||||
|
This means that we should be focused on decoupling Docker from the registry
|
||||||
|
just as much as decoupling the registry from Docker. Such an approach will
|
||||||
|
allow us to unlock new distribution models that haven't been possible before.
|
||||||
|
|
||||||
|
We can take this further by saying that the new registry should be content
|
||||||
|
agnostic. The registry provides a model of names, tags, manifests and content
|
||||||
|
addresses and that model can be used to work with content.
|
||||||
|
|
||||||
|
#### Simplicity
|
||||||
|
|
||||||
|
The new registry should be closer to a microservice component than its
|
||||||
|
predecessor. This means it should have a narrower API and a low number of
|
||||||
|
service dependencies. It should be easy to deploy.
|
||||||
|
|
||||||
|
This means that other solutions should be explored before changing the API or
|
||||||
|
adding extra dependencies. If functionality is required, can it be added as an
|
||||||
|
extension or companion service.
|
||||||
|
|
||||||
|
#### Extensibility
|
||||||
|
|
||||||
|
The registry should provide extension points to add functionality. By keeping
|
||||||
|
the scope narrow, but providing the ability to add functionality.
|
||||||
|
|
||||||
|
Features like search, indexing, synchronization and registry explorers fall
|
||||||
|
into this category. No such feature should be added unless we've found it
|
||||||
|
impossible to do through an extension.
|
||||||
|
|
||||||
|
#### Active Feature Discussions
|
||||||
|
|
||||||
|
The following are feature discussions that are currently active.
|
||||||
|
|
||||||
|
If you don't see your favorite, unimplemented feature, feel free to contact us
|
||||||
|
via IRC or the mailing list and we can talk about adding it. The goal here is
|
||||||
|
to make sure that new features go through a rigid design process before
|
||||||
|
landing in the registry.
|
||||||
|
|
||||||
|
##### Proxying to other Registries
|
||||||
|
|
||||||
|
A _pull-through caching_ mode exists for the registry, but is restricted from
|
||||||
|
within the docker client to only mirror the official Docker Hub. This functionality
|
||||||
|
can be expanded when image provenance has been specified and implemented in the
|
||||||
|
distribution project.
|
||||||
|
|
||||||
|
##### Metadata storage
|
||||||
|
|
||||||
|
Metadata for the registry is currently stored with the manifest and layer data on
|
||||||
|
the storage backend. While this is a big win for simplicity and reliably maintaining
|
||||||
|
state, it comes with the cost of consistency and high latency. The mutable registry
|
||||||
|
metadata operations should be abstracted behind an API which will allow ACID compliant
|
||||||
|
storage systems to handle metadata.
|
||||||
|
|
||||||
|
##### Peer to Peer transfer
|
||||||
|
|
||||||
|
Discussion has started here: https://docs.google.com/document/d/1rYDpSpJiQWmCQy8Cuiaa3NH-Co33oK_SC9HeXYo87QA/edit
|
||||||
|
|
||||||
|
##### Indexing, Search and Discovery
|
||||||
|
|
||||||
|
The original registry provided some implementation of search for use with
|
||||||
|
private registries. Support has been elided from V2 since we'd like to both
|
||||||
|
decouple search functionality from the registry. The makes the registry
|
||||||
|
simpler to deploy, especially in use cases where search is not needed, and
|
||||||
|
let's us decouple the image format from the registry.
|
||||||
|
|
||||||
|
There are explorations into using the catalog API and notification system to
|
||||||
|
build external indexes. The current line of thought is that we will define a
|
||||||
|
common search API to index and query docker images. Such a system could be run
|
||||||
|
as a companion to a registry or set of registries to power discovery.
|
||||||
|
|
||||||
|
The main issue with search and discovery is that there are so many ways to
|
||||||
|
accomplish it. There are two aspects to this project. The first is deciding on
|
||||||
|
how it will be done, including an API definition that can work with changing
|
||||||
|
data formats. The second is the process of integrating with `docker search`.
|
||||||
|
We expect that someone attempts to address the problem with the existing tools
|
||||||
|
and propose it as a standard search API or uses it to inform a standardization
|
||||||
|
process. Once this has been explored, we integrate with the docker client.
|
||||||
|
|
||||||
|
Please see the following for more detail:
|
||||||
|
|
||||||
|
- https://github.com/docker/distribution/issues/206
|
||||||
|
|
||||||
|
##### Deletes
|
||||||
|
|
||||||
|
> __NOTE:__ Deletes are a much asked for feature. Before requesting this
|
||||||
|
feature or participating in discussion, we ask that you read this section in
|
||||||
|
full and understand the problems behind deletes.
|
||||||
|
|
||||||
|
While, at first glance, implementing deleting seems simple, there are a number
|
||||||
|
mitigating factors that make many solutions not ideal or even pathological in
|
||||||
|
the context of a registry. The following paragraph discuss the background and
|
||||||
|
approaches that could be applied to arrive at a solution.
|
||||||
|
|
||||||
|
The goal of deletes in any system is to remove unused or unneeded data. Only
|
||||||
|
data requested for deletion should be removed and no other data. Removing
|
||||||
|
unintended data is worse than _not_ removing data that was requested for
|
||||||
|
removal but ideally, both are supported. Generally, according to this rule, we
|
||||||
|
err on holding data longer than needed, ensuring that it is only removed when
|
||||||
|
we can be certain that it can be removed. With the current behavior, we opt to
|
||||||
|
hold onto the data forever, ensuring that data cannot be incorrectly removed.
|
||||||
|
|
||||||
|
To understand the problems with implementing deletes, one must understand the
|
||||||
|
data model. All registry data is stored in a filesystem layout, implemented on
|
||||||
|
a "storage driver", effectively a _virtual file system_ (VFS). The storage
|
||||||
|
system must assume that this VFS layer will be eventually consistent and has
|
||||||
|
poor read- after-write consistency, since this is the lower common denominator
|
||||||
|
among the storage drivers. This is mitigated by writing values in reverse-
|
||||||
|
dependent order, but makes wider transactional operations unsafe.
|
||||||
|
|
||||||
|
Layered on the VFS model is a content-addressable _directed, acyclic graph_
|
||||||
|
(DAG) made up of blobs. Manifests reference layers. Tags reference manifests.
|
||||||
|
Since the same data can be referenced by multiple manifests, we only store
|
||||||
|
data once, even if it is in different repositories. Thus, we have a set of
|
||||||
|
blobs, referenced by tags and manifests. If we want to delete a blob we need
|
||||||
|
to be certain that it is no longer referenced by another manifest or tag. When
|
||||||
|
we delete a manifest, we also can try to delete the referenced blobs. Deciding
|
||||||
|
whether or not a blob has an active reference is the crux of the problem.
|
||||||
|
|
||||||
|
Conceptually, deleting a manifest and its resources is quite simple. Just find
|
||||||
|
all the manifests, enumerate the referenced blobs and delete the blobs not in
|
||||||
|
that set. An astute observer will recognize this as a garbage collection
|
||||||
|
problem. As with garbage collection in programming languages, this is very
|
||||||
|
simple when one always has a consistent view. When one adds parallelism and an
|
||||||
|
inconsistent view of data, it becomes very challenging.
|
||||||
|
|
||||||
|
A simple example can demonstrate this. Let's say we are deleting a manifest
|
||||||
|
_A_ in one process. We scan the manifest and decide that all the blobs are
|
||||||
|
ready for deletion. Concurrently, we have another process accepting a new
|
||||||
|
manifest _B_ referencing one or more blobs from the manifest _A_. Manifest _B_
|
||||||
|
is accepted and all the blobs are considered present, so the operation
|
||||||
|
proceeds. The original process then deletes the referenced blobs, assuming
|
||||||
|
they were unreferenced. The manifest _B_, which we thought had all of its data
|
||||||
|
present, can no longer be served by the registry, since the dependent data has
|
||||||
|
been deleted.
|
||||||
|
|
||||||
|
Deleting data from the registry safely requires some way to coordinate this
|
||||||
|
operation. The following approaches are being considered:
|
||||||
|
|
||||||
|
- _Reference Counting_ - Maintain a count of references to each blob. This is
|
||||||
|
challenging for a number of reasons: 1. maintaining a consistent consensus
|
||||||
|
of reference counts across a set of Registries and 2. Building the initial
|
||||||
|
list of reference counts for an existing registry. These challenges can be
|
||||||
|
met with a consensus protocol like Paxos or Raft in the first case and a
|
||||||
|
necessary but simple scan in the second..
|
||||||
|
- _Lock the World GC_ - Halt all writes to the data store. Walk the data store
|
||||||
|
and find all blob references. Delete all unreferenced blobs. This approach
|
||||||
|
is very simple but requires disabling writes for a period of time while the
|
||||||
|
service reads all data. This is slow and expensive but very accurate and
|
||||||
|
effective.
|
||||||
|
- _Generational GC_ - Do something similar to above but instead of blocking
|
||||||
|
writes, writes are sent to another storage backend while reads are broadcast
|
||||||
|
to the new and old backends. GC is then performed on the read-only portion.
|
||||||
|
Because writes land in the new backend, the data in the read-only section
|
||||||
|
can be safely deleted. The main drawbacks of this approach are complexity
|
||||||
|
and coordination.
|
||||||
|
- _Centralized Oracle_ - Using a centralized, transactional database, we can
|
||||||
|
know exactly which data is referenced at any given time. This avoids
|
||||||
|
coordination problem by managing this data in a single location. We trade
|
||||||
|
off metadata scalability for simplicity and performance. This is a very good
|
||||||
|
option for most registry deployments. This would create a bottleneck for
|
||||||
|
registry metadata. However, metadata is generally not the main bottleneck
|
||||||
|
when serving images.
|
||||||
|
|
||||||
|
Please let us know if other solutions exist that we have yet to enumerate.
|
||||||
|
Note that for any approach, implementation is a massive consideration. For
|
||||||
|
example, a mark-sweep based solution may seem simple but the amount of work in
|
||||||
|
coordination offset the extra work it might take to build a _Centralized
|
||||||
|
Oracle_. We'll accept proposals for any solution but please coordinate with us
|
||||||
|
before dropping code.
|
||||||
|
|
||||||
|
At this time, we have traded off simplicity and ease of deployment for disk
|
||||||
|
space. Simplicity and ease of deployment tend to reduce developer involvement,
|
||||||
|
which is currently the most expensive resource in software engineering. Taking
|
||||||
|
on any solution for deletes will greatly effect these factors, trading off
|
||||||
|
very cheap disk space for a complex deployment and operational story.
|
||||||
|
|
||||||
|
Please see the following issues for more detail:
|
||||||
|
|
||||||
|
- https://github.com/docker/distribution/issues/422
|
||||||
|
- https://github.com/docker/distribution/issues/461
|
||||||
|
- https://github.com/docker/distribution/issues/462
|
||||||
|
|
||||||
|
### Distribution Package
|
||||||
|
|
||||||
|
At its core, the Distribution Project is a set of Go packages that make up
|
||||||
|
Distribution Components. At this time, most of these packages make up the
|
||||||
|
Registry implementation.
|
||||||
|
|
||||||
|
The package itself is considered unstable. If you're using it, please take care to vendor the dependent version.
|
||||||
|
|
||||||
|
For feature additions, please see the Registry section. In the future, we may break out a
|
||||||
|
separate Roadmap for distribution-specific features that apply to more than
|
||||||
|
just the registry.
|
||||||
|
|
||||||
|
***
|
||||||
|
|
||||||
|
### Project Planning
|
||||||
|
|
||||||
|
An [Open-Source Planning Process](https://github.com/docker/distribution/wiki/Open-Source-Planning-Process) is used to define the Roadmap. [Project Pages](https://github.com/docker/distribution/wiki) define the goals for each Milestone and identify current progress.
|
||||||
|
|
|
@ -1,82 +0,0 @@
|
||||||
## Introduction
|
|
||||||
|
|
||||||
docker-credential-helpers is a suite of programs to use native stores to keep Docker credentials safe.
|
|
||||||
|
|
||||||
## Installation
|
|
||||||
|
|
||||||
Go to the [Releases](https://github.com/docker/docker-credential-helpers/releases) page and download the binary that works better for you. Put that binary in your `$PATH`, so Docker can find it.
|
|
||||||
|
|
||||||
### Building from scratch
|
|
||||||
|
|
||||||
The programs in this repository are written with the Go programming language. These instructions assume that you have previous knowledge about the language and you have it installed in your machine.
|
|
||||||
|
|
||||||
1 - Download the source and put it in your `$GOPATH` with `go get`.
|
|
||||||
|
|
||||||
```
|
|
||||||
$ go get github.com/docker/docker-credential-helpers
|
|
||||||
```
|
|
||||||
|
|
||||||
2 - Use `make` to build the program you want. That will leave an executable in the `bin` directory inside the repository.
|
|
||||||
|
|
||||||
```
|
|
||||||
$ cd $GOPATH/docker/docker-credentials-helpers
|
|
||||||
$ make osxkeychain
|
|
||||||
```
|
|
||||||
|
|
||||||
3 - Put that binary in your `$PATH`, so Docker can find it.
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
### With the Docker Engine
|
|
||||||
|
|
||||||
Set the `credsStore` option in your `.docker/config.json` file with the suffix of the program you want to use. For instance, set it to `osxkeychain` if you want to use `docker-credential-osxkeychain`.
|
|
||||||
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"credsStore": "osxkeychain"
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
### With other command line applications
|
|
||||||
|
|
||||||
The sub-package [client](https://godoc.org/github.com/docker/docker-credential-helpers/client) includes
|
|
||||||
functions to call external programs from your own command line applications.
|
|
||||||
|
|
||||||
There are three things you need to know if you need to interact with a helper:
|
|
||||||
|
|
||||||
1. The name of the program to execute, for instance `docker-credential-osxkeychain`.
|
|
||||||
2. The server address to identify the credentials, for instance `https://example.com`.
|
|
||||||
3. The username and secret to store, when you want to store credentials.
|
|
||||||
|
|
||||||
You can see examples of each function in the [client](https://godoc.org/github.com/docker/docker-credential-helpers/client) documentation.
|
|
||||||
|
|
||||||
### Available programs
|
|
||||||
|
|
||||||
1. osxkeychain: Provides a helper to use the OS X keychain as credentials store.
|
|
||||||
2. secretservice: Provides a helper to use the D-Bus secret service as credentials store.
|
|
||||||
3. wincred: Provides a helper to use Windows credentials manager as store.
|
|
||||||
4. pass: Provides a helper to use `pass` as credentials store.
|
|
||||||
|
|
||||||
#### Note
|
|
||||||
|
|
||||||
`pass` needs to be configured for `docker-credential-pass` to work properly.
|
|
||||||
It must be initialized with a `gpg2` key ID. Make sure your GPG key exists is in `gpg2` keyring as `pass` uses `gpg2` instead of the regular `gpg`.
|
|
||||||
|
|
||||||
## Development
|
|
||||||
|
|
||||||
A credential helper can be any program that can read values from the standard input. We use the first argument in the command line to differentiate the kind of command to execute. There are four valid values:
|
|
||||||
|
|
||||||
- `store`: Adds credentials to the keychain. The payload in the standard input is a JSON document with `ServerURL`, `Username` and `Secret`.
|
|
||||||
- `get`: Retrieves credentials from the keychain. The payload in the standard input is the raw value for the `ServerURL`.
|
|
||||||
- `erase`: Removes credentials from the keychain. The payload in the standard input is the raw value for the `ServerURL`.
|
|
||||||
- `list`: Lists stored credentials. There is no standard input payload.
|
|
||||||
|
|
||||||
This repository also includes libraries to implement new credentials programs in Go. Adding a new helper program is pretty easy. You can see how the OS X keychain helper works in the [osxkeychain](osxkeychain) directory.
|
|
||||||
|
|
||||||
1. Implement the interface `credentials.Helper` in `YOUR_PACKAGE/YOUR_PACKAGE_$GOOS.go`
|
|
||||||
2. Create a main program in `YOUR_PACKAGE/cmd/main_$GOOS.go`.
|
|
||||||
3. Add make tasks to build your program and run tests.
|
|
||||||
|
|
||||||
## License
|
|
||||||
|
|
||||||
MIT. See [LICENSE](LICENSE) for more information.
|
|
|
@ -1,8 +0,0 @@
|
||||||
module github.com/docker/docker-credential-helpers
|
|
||||||
|
|
||||||
go 1.13
|
|
||||||
|
|
||||||
require (
|
|
||||||
github.com/danieljoos/wincred v1.1.0
|
|
||||||
golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4
|
|
||||||
)
|
|
227
vendor/github.com/docker/docker-credential-helpers/osxkeychain/osxkeychain_darwin.c
generated
vendored
227
vendor/github.com/docker/docker-credential-helpers/osxkeychain/osxkeychain_darwin.c
generated
vendored
|
@ -1,227 +0,0 @@
|
||||||
#include "osxkeychain_darwin.h"
|
|
||||||
#include <CoreFoundation/CoreFoundation.h>
|
|
||||||
#include <Foundation/NSValue.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
char *get_error(OSStatus status) {
|
|
||||||
char *buf = malloc(128);
|
|
||||||
CFStringRef str = SecCopyErrorMessageString(status, NULL);
|
|
||||||
int success = CFStringGetCString(str, buf, 128, kCFStringEncodingUTF8);
|
|
||||||
if (!success) {
|
|
||||||
strncpy(buf, "Unknown error", 128);
|
|
||||||
}
|
|
||||||
return buf;
|
|
||||||
}
|
|
||||||
|
|
||||||
char *keychain_add(struct Server *server, char *label, char *username, char *secret) {
|
|
||||||
SecKeychainItemRef item;
|
|
||||||
|
|
||||||
OSStatus status = SecKeychainAddInternetPassword(
|
|
||||||
NULL,
|
|
||||||
strlen(server->host), server->host,
|
|
||||||
0, NULL,
|
|
||||||
strlen(username), username,
|
|
||||||
strlen(server->path), server->path,
|
|
||||||
server->port,
|
|
||||||
server->proto,
|
|
||||||
kSecAuthenticationTypeDefault,
|
|
||||||
strlen(secret), secret,
|
|
||||||
&item
|
|
||||||
);
|
|
||||||
|
|
||||||
if (status) {
|
|
||||||
return get_error(status);
|
|
||||||
}
|
|
||||||
|
|
||||||
SecKeychainAttribute attribute;
|
|
||||||
SecKeychainAttributeList attrs;
|
|
||||||
attribute.tag = kSecLabelItemAttr;
|
|
||||||
attribute.data = label;
|
|
||||||
attribute.length = strlen(label);
|
|
||||||
attrs.count = 1;
|
|
||||||
attrs.attr = &attribute;
|
|
||||||
|
|
||||||
status = SecKeychainItemModifyContent(item, &attrs, 0, NULL);
|
|
||||||
|
|
||||||
if (status) {
|
|
||||||
return get_error(status);
|
|
||||||
}
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
char *keychain_get(struct Server *server, unsigned int *username_l, char **username, unsigned int *secret_l, char **secret) {
|
|
||||||
char *tmp;
|
|
||||||
SecKeychainItemRef item;
|
|
||||||
|
|
||||||
OSStatus status = SecKeychainFindInternetPassword(
|
|
||||||
NULL,
|
|
||||||
strlen(server->host), server->host,
|
|
||||||
0, NULL,
|
|
||||||
0, NULL,
|
|
||||||
strlen(server->path), server->path,
|
|
||||||
server->port,
|
|
||||||
server->proto,
|
|
||||||
kSecAuthenticationTypeDefault,
|
|
||||||
secret_l, (void **)&tmp,
|
|
||||||
&item);
|
|
||||||
|
|
||||||
if (status) {
|
|
||||||
return get_error(status);
|
|
||||||
}
|
|
||||||
|
|
||||||
*secret = strdup(tmp);
|
|
||||||
SecKeychainItemFreeContent(NULL, tmp);
|
|
||||||
|
|
||||||
SecKeychainAttributeList list;
|
|
||||||
SecKeychainAttribute attr;
|
|
||||||
|
|
||||||
list.count = 1;
|
|
||||||
list.attr = &attr;
|
|
||||||
attr.tag = kSecAccountItemAttr;
|
|
||||||
|
|
||||||
status = SecKeychainItemCopyContent(item, NULL, &list, NULL, NULL);
|
|
||||||
if (status) {
|
|
||||||
return get_error(status);
|
|
||||||
}
|
|
||||||
|
|
||||||
*username = strdup(attr.data);
|
|
||||||
*username_l = attr.length;
|
|
||||||
SecKeychainItemFreeContent(&list, NULL);
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
char *keychain_delete(struct Server *server) {
|
|
||||||
SecKeychainItemRef item;
|
|
||||||
|
|
||||||
OSStatus status = SecKeychainFindInternetPassword(
|
|
||||||
NULL,
|
|
||||||
strlen(server->host), server->host,
|
|
||||||
0, NULL,
|
|
||||||
0, NULL,
|
|
||||||
strlen(server->path), server->path,
|
|
||||||
server->port,
|
|
||||||
server->proto,
|
|
||||||
kSecAuthenticationTypeDefault,
|
|
||||||
0, NULL,
|
|
||||||
&item);
|
|
||||||
|
|
||||||
if (status) {
|
|
||||||
return get_error(status);
|
|
||||||
}
|
|
||||||
|
|
||||||
status = SecKeychainItemDelete(item);
|
|
||||||
if (status) {
|
|
||||||
return get_error(status);
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
char * CFStringToCharArr(CFStringRef aString) {
|
|
||||||
if (aString == NULL) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
CFIndex length = CFStringGetLength(aString);
|
|
||||||
CFIndex maxSize =
|
|
||||||
CFStringGetMaximumSizeForEncoding(length, kCFStringEncodingUTF8) + 1;
|
|
||||||
char *buffer = (char *)malloc(maxSize);
|
|
||||||
if (CFStringGetCString(aString, buffer, maxSize,
|
|
||||||
kCFStringEncodingUTF8)) {
|
|
||||||
return buffer;
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
char *keychain_list(char *credsLabel, char *** paths, char *** accts, unsigned int *list_l) {
|
|
||||||
CFStringRef credsLabelCF = CFStringCreateWithCString(NULL, credsLabel, kCFStringEncodingUTF8);
|
|
||||||
CFMutableDictionaryRef query = CFDictionaryCreateMutable (NULL, 1, NULL, NULL);
|
|
||||||
CFDictionaryAddValue(query, kSecClass, kSecClassInternetPassword);
|
|
||||||
CFDictionaryAddValue(query, kSecReturnAttributes, kCFBooleanTrue);
|
|
||||||
CFDictionaryAddValue(query, kSecMatchLimit, kSecMatchLimitAll);
|
|
||||||
CFDictionaryAddValue(query, kSecAttrLabel, credsLabelCF);
|
|
||||||
//Use this query dictionary
|
|
||||||
CFTypeRef result= NULL;
|
|
||||||
OSStatus status = SecItemCopyMatching(
|
|
||||||
query,
|
|
||||||
&result);
|
|
||||||
|
|
||||||
CFRelease(credsLabelCF);
|
|
||||||
|
|
||||||
//Ran a search and store the results in result
|
|
||||||
if (status) {
|
|
||||||
return get_error(status);
|
|
||||||
}
|
|
||||||
CFIndex numKeys = CFArrayGetCount(result);
|
|
||||||
*paths = (char **) malloc((int)sizeof(char *)*numKeys);
|
|
||||||
*accts = (char **) malloc((int)sizeof(char *)*numKeys);
|
|
||||||
//result is of type CFArray
|
|
||||||
for(CFIndex i=0; i<numKeys; i++) {
|
|
||||||
CFDictionaryRef currKey = CFArrayGetValueAtIndex(result,i);
|
|
||||||
|
|
||||||
CFStringRef protocolTmp = CFDictionaryGetValue(currKey, CFSTR("ptcl"));
|
|
||||||
if (protocolTmp != NULL) {
|
|
||||||
CFStringRef protocolStr = CFStringCreateWithFormat(NULL, NULL, CFSTR("%@"), protocolTmp);
|
|
||||||
if (CFStringCompare(protocolStr, CFSTR("htps"), 0) == kCFCompareEqualTo) {
|
|
||||||
protocolTmp = CFSTR("https://");
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
protocolTmp = CFSTR("http://");
|
|
||||||
}
|
|
||||||
CFRelease(protocolStr);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
char * path = "0";
|
|
||||||
char * acct = "0";
|
|
||||||
(*paths)[i] = (char *) malloc(sizeof(char)*(strlen(path)));
|
|
||||||
memcpy((*paths)[i], path, sizeof(char)*(strlen(path)));
|
|
||||||
(*accts)[i] = (char *) malloc(sizeof(char)*(strlen(acct)));
|
|
||||||
memcpy((*accts)[i], acct, sizeof(char)*(strlen(acct)));
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
CFMutableStringRef str = CFStringCreateMutableCopy(NULL, 0, protocolTmp);
|
|
||||||
CFStringRef serverTmp = CFDictionaryGetValue(currKey, CFSTR("srvr"));
|
|
||||||
if (serverTmp != NULL) {
|
|
||||||
CFStringAppend(str, serverTmp);
|
|
||||||
}
|
|
||||||
|
|
||||||
CFStringRef pathTmp = CFDictionaryGetValue(currKey, CFSTR("path"));
|
|
||||||
if (pathTmp != NULL) {
|
|
||||||
CFStringAppend(str, pathTmp);
|
|
||||||
}
|
|
||||||
|
|
||||||
const NSNumber * portTmp = CFDictionaryGetValue(currKey, CFSTR("port"));
|
|
||||||
if (portTmp != NULL && portTmp.integerValue != 0) {
|
|
||||||
CFStringRef portStr = CFStringCreateWithFormat(NULL, NULL, CFSTR("%@"), portTmp);
|
|
||||||
CFStringAppend(str, CFSTR(":"));
|
|
||||||
CFStringAppend(str, portStr);
|
|
||||||
CFRelease(portStr);
|
|
||||||
}
|
|
||||||
|
|
||||||
CFStringRef acctTmp = CFDictionaryGetValue(currKey, CFSTR("acct"));
|
|
||||||
if (acctTmp == NULL) {
|
|
||||||
acctTmp = CFSTR("account not defined");
|
|
||||||
}
|
|
||||||
|
|
||||||
char * path = CFStringToCharArr(str);
|
|
||||||
char * acct = CFStringToCharArr(acctTmp);
|
|
||||||
|
|
||||||
//We now have all we need, username and servername. Now export this to .go
|
|
||||||
(*paths)[i] = (char *) malloc(sizeof(char)*(strlen(path)+1));
|
|
||||||
memcpy((*paths)[i], path, sizeof(char)*(strlen(path)+1));
|
|
||||||
(*accts)[i] = (char *) malloc(sizeof(char)*(strlen(acct)+1));
|
|
||||||
memcpy((*accts)[i], acct, sizeof(char)*(strlen(acct)+1));
|
|
||||||
|
|
||||||
CFRelease(str);
|
|
||||||
}
|
|
||||||
*list_l = (int)numKeys;
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
void freeListData(char *** data, unsigned int length) {
|
|
||||||
for(int i=0; i<length; i++) {
|
|
||||||
free((*data)[i]);
|
|
||||||
}
|
|
||||||
}
|
|
182
vendor/github.com/docker/docker-credential-helpers/osxkeychain/osxkeychain_darwin.go
generated
vendored
182
vendor/github.com/docker/docker-credential-helpers/osxkeychain/osxkeychain_darwin.go
generated
vendored
|
@ -1,182 +0,0 @@
|
||||||
package osxkeychain
|
|
||||||
|
|
||||||
/*
|
|
||||||
#cgo CFLAGS: -x objective-c -mmacosx-version-min=10.11
|
|
||||||
#cgo LDFLAGS: -framework Security -framework Foundation -mmacosx-version-min=10.11
|
|
||||||
|
|
||||||
#include "osxkeychain_darwin.h"
|
|
||||||
#include <stdlib.h>
|
|
||||||
*/
|
|
||||||
import "C"
|
|
||||||
import (
|
|
||||||
"errors"
|
|
||||||
"strconv"
|
|
||||||
"unsafe"
|
|
||||||
|
|
||||||
"github.com/docker/docker-credential-helpers/credentials"
|
|
||||||
"github.com/docker/docker-credential-helpers/registryurl"
|
|
||||||
)
|
|
||||||
|
|
||||||
// errCredentialsNotFound is the specific error message returned by OS X
|
|
||||||
// when the credentials are not in the keychain.
|
|
||||||
const errCredentialsNotFound = "The specified item could not be found in the keychain."
|
|
||||||
|
|
||||||
// errCredentialsNotFound is the specific error message returned by OS X
|
|
||||||
// when environment does not allow showing dialog to unlock keychain.
|
|
||||||
const errInteractionNotAllowed = "User interaction is not allowed."
|
|
||||||
|
|
||||||
// ErrInteractionNotAllowed is returned if keychain password prompt can not be shown.
|
|
||||||
var ErrInteractionNotAllowed = errors.New(`keychain cannot be accessed because the current session does not allow user interaction. The keychain may be locked; unlock it by running "security -v unlock-keychain ~/Library/Keychains/login.keychain-db" and try again`)
|
|
||||||
|
|
||||||
// Osxkeychain handles secrets using the OS X Keychain as store.
|
|
||||||
type Osxkeychain struct{}
|
|
||||||
|
|
||||||
// Add adds new credentials to the keychain.
|
|
||||||
func (h Osxkeychain) Add(creds *credentials.Credentials) error {
|
|
||||||
h.Delete(creds.ServerURL)
|
|
||||||
|
|
||||||
s, err := splitServer(creds.ServerURL)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
defer freeServer(s)
|
|
||||||
|
|
||||||
label := C.CString(credentials.CredsLabel)
|
|
||||||
defer C.free(unsafe.Pointer(label))
|
|
||||||
username := C.CString(creds.Username)
|
|
||||||
defer C.free(unsafe.Pointer(username))
|
|
||||||
secret := C.CString(creds.Secret)
|
|
||||||
defer C.free(unsafe.Pointer(secret))
|
|
||||||
|
|
||||||
errMsg := C.keychain_add(s, label, username, secret)
|
|
||||||
if errMsg != nil {
|
|
||||||
defer C.free(unsafe.Pointer(errMsg))
|
|
||||||
return errors.New(C.GoString(errMsg))
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Delete removes credentials from the keychain.
|
|
||||||
func (h Osxkeychain) Delete(serverURL string) error {
|
|
||||||
s, err := splitServer(serverURL)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
defer freeServer(s)
|
|
||||||
|
|
||||||
errMsg := C.keychain_delete(s)
|
|
||||||
if errMsg != nil {
|
|
||||||
defer C.free(unsafe.Pointer(errMsg))
|
|
||||||
return errors.New(C.GoString(errMsg))
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get returns the username and secret to use for a given registry server URL.
|
|
||||||
func (h Osxkeychain) Get(serverURL string) (string, string, error) {
|
|
||||||
s, err := splitServer(serverURL)
|
|
||||||
if err != nil {
|
|
||||||
return "", "", err
|
|
||||||
}
|
|
||||||
defer freeServer(s)
|
|
||||||
|
|
||||||
var usernameLen C.uint
|
|
||||||
var username *C.char
|
|
||||||
var secretLen C.uint
|
|
||||||
var secret *C.char
|
|
||||||
defer C.free(unsafe.Pointer(username))
|
|
||||||
defer C.free(unsafe.Pointer(secret))
|
|
||||||
|
|
||||||
errMsg := C.keychain_get(s, &usernameLen, &username, &secretLen, &secret)
|
|
||||||
if errMsg != nil {
|
|
||||||
defer C.free(unsafe.Pointer(errMsg))
|
|
||||||
goMsg := C.GoString(errMsg)
|
|
||||||
if goMsg == errCredentialsNotFound {
|
|
||||||
return "", "", credentials.NewErrCredentialsNotFound()
|
|
||||||
}
|
|
||||||
if goMsg == errInteractionNotAllowed {
|
|
||||||
return "", "", ErrInteractionNotAllowed
|
|
||||||
}
|
|
||||||
|
|
||||||
return "", "", errors.New(goMsg)
|
|
||||||
}
|
|
||||||
|
|
||||||
user := C.GoStringN(username, C.int(usernameLen))
|
|
||||||
pass := C.GoStringN(secret, C.int(secretLen))
|
|
||||||
return user, pass, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// List returns the stored URLs and corresponding usernames.
|
|
||||||
func (h Osxkeychain) List() (map[string]string, error) {
|
|
||||||
credsLabelC := C.CString(credentials.CredsLabel)
|
|
||||||
defer C.free(unsafe.Pointer(credsLabelC))
|
|
||||||
|
|
||||||
var pathsC **C.char
|
|
||||||
defer C.free(unsafe.Pointer(pathsC))
|
|
||||||
var acctsC **C.char
|
|
||||||
defer C.free(unsafe.Pointer(acctsC))
|
|
||||||
var listLenC C.uint
|
|
||||||
errMsg := C.keychain_list(credsLabelC, &pathsC, &acctsC, &listLenC)
|
|
||||||
defer C.freeListData(&pathsC, listLenC)
|
|
||||||
defer C.freeListData(&acctsC, listLenC)
|
|
||||||
if errMsg != nil {
|
|
||||||
defer C.free(unsafe.Pointer(errMsg))
|
|
||||||
goMsg := C.GoString(errMsg)
|
|
||||||
if goMsg == errCredentialsNotFound {
|
|
||||||
return make(map[string]string), nil
|
|
||||||
}
|
|
||||||
if goMsg == errInteractionNotAllowed {
|
|
||||||
return nil, ErrInteractionNotAllowed
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil, errors.New(goMsg)
|
|
||||||
}
|
|
||||||
|
|
||||||
var listLen int
|
|
||||||
listLen = int(listLenC)
|
|
||||||
pathTmp := (*[1 << 30]*C.char)(unsafe.Pointer(pathsC))[:listLen:listLen]
|
|
||||||
acctTmp := (*[1 << 30]*C.char)(unsafe.Pointer(acctsC))[:listLen:listLen]
|
|
||||||
//taking the array of c strings into go while ignoring all the stuff irrelevant to credentials-helper
|
|
||||||
resp := make(map[string]string)
|
|
||||||
for i := 0; i < listLen; i++ {
|
|
||||||
if C.GoString(pathTmp[i]) == "0" {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
resp[C.GoString(pathTmp[i])] = C.GoString(acctTmp[i])
|
|
||||||
}
|
|
||||||
return resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func splitServer(serverURL string) (*C.struct_Server, error) {
|
|
||||||
u, err := registryurl.Parse(serverURL)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
proto := C.kSecProtocolTypeHTTPS
|
|
||||||
if u.Scheme == "http" {
|
|
||||||
proto = C.kSecProtocolTypeHTTP
|
|
||||||
}
|
|
||||||
var port int
|
|
||||||
p := registryurl.GetPort(u)
|
|
||||||
if p != "" {
|
|
||||||
port, err = strconv.Atoi(p)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return &C.struct_Server{
|
|
||||||
proto: C.SecProtocolType(proto),
|
|
||||||
host: C.CString(registryurl.GetHostname(u)),
|
|
||||||
port: C.uint(port),
|
|
||||||
path: C.CString(u.Path),
|
|
||||||
}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func freeServer(s *C.struct_Server) {
|
|
||||||
C.free(unsafe.Pointer(s.host))
|
|
||||||
C.free(unsafe.Pointer(s.path))
|
|
||||||
}
|
|
14
vendor/github.com/docker/docker-credential-helpers/osxkeychain/osxkeychain_darwin.h
generated
vendored
14
vendor/github.com/docker/docker-credential-helpers/osxkeychain/osxkeychain_darwin.h
generated
vendored
|
@ -1,14 +0,0 @@
|
||||||
#include <Security/Security.h>
|
|
||||||
|
|
||||||
struct Server {
|
|
||||||
SecProtocolType proto;
|
|
||||||
char *host;
|
|
||||||
char *path;
|
|
||||||
unsigned int port;
|
|
||||||
};
|
|
||||||
|
|
||||||
char *keychain_add(struct Server *server, char *label, char *username, char *secret);
|
|
||||||
char *keychain_get(struct Server *server, unsigned int *username_l, char **username, unsigned int *secret_l, char **secret);
|
|
||||||
char *keychain_delete(struct Server *server);
|
|
||||||
char *keychain_list(char *credsLabel, char *** data, char *** accts, unsigned int *list_l);
|
|
||||||
void freeListData(char *** data, unsigned int length);
|
|
161
vendor/github.com/docker/docker-credential-helpers/secretservice/secretservice_linux.c
generated
vendored
161
vendor/github.com/docker/docker-credential-helpers/secretservice/secretservice_linux.c
generated
vendored
|
@ -1,161 +0,0 @@
|
||||||
#include <string.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include "secretservice_linux.h"
|
|
||||||
|
|
||||||
const SecretSchema *docker_get_schema(void)
|
|
||||||
{
|
|
||||||
static const SecretSchema docker_schema = {
|
|
||||||
"io.docker.Credentials", SECRET_SCHEMA_NONE,
|
|
||||||
{
|
|
||||||
{ "label", SECRET_SCHEMA_ATTRIBUTE_STRING },
|
|
||||||
{ "server", SECRET_SCHEMA_ATTRIBUTE_STRING },
|
|
||||||
{ "username", SECRET_SCHEMA_ATTRIBUTE_STRING },
|
|
||||||
{ "docker_cli", SECRET_SCHEMA_ATTRIBUTE_STRING },
|
|
||||||
{ "NULL", 0 },
|
|
||||||
}
|
|
||||||
};
|
|
||||||
return &docker_schema;
|
|
||||||
}
|
|
||||||
|
|
||||||
GError *add(char *label, char *server, char *username, char *secret) {
|
|
||||||
GError *err = NULL;
|
|
||||||
|
|
||||||
secret_password_store_sync (DOCKER_SCHEMA, SECRET_COLLECTION_DEFAULT,
|
|
||||||
server, secret, NULL, &err,
|
|
||||||
"label", label,
|
|
||||||
"server", server,
|
|
||||||
"username", username,
|
|
||||||
"docker_cli", "1",
|
|
||||||
NULL);
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
|
|
||||||
GError *delete(char *server) {
|
|
||||||
GError *err = NULL;
|
|
||||||
|
|
||||||
secret_password_clear_sync(DOCKER_SCHEMA, NULL, &err,
|
|
||||||
"server", server,
|
|
||||||
"docker_cli", "1",
|
|
||||||
NULL);
|
|
||||||
if (err != NULL)
|
|
||||||
return err;
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
char *get_attribute(const char *attribute, SecretItem *item) {
|
|
||||||
GHashTable *attributes;
|
|
||||||
GHashTableIter iter;
|
|
||||||
gchar *value, *key;
|
|
||||||
|
|
||||||
attributes = secret_item_get_attributes(item);
|
|
||||||
g_hash_table_iter_init(&iter, attributes);
|
|
||||||
while (g_hash_table_iter_next(&iter, (void **)&key, (void **)&value)) {
|
|
||||||
if (strncmp(key, attribute, strlen(key)) == 0)
|
|
||||||
return (char *)value;
|
|
||||||
}
|
|
||||||
g_hash_table_unref(attributes);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
GError *get(char *server, char **username, char **secret) {
|
|
||||||
GError *err = NULL;
|
|
||||||
GHashTable *attributes;
|
|
||||||
SecretService *service;
|
|
||||||
GList *items, *l;
|
|
||||||
SecretSearchFlags flags = SECRET_SEARCH_LOAD_SECRETS | SECRET_SEARCH_ALL | SECRET_SEARCH_UNLOCK;
|
|
||||||
SecretValue *secretValue;
|
|
||||||
gsize length;
|
|
||||||
gchar *value;
|
|
||||||
|
|
||||||
attributes = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free);
|
|
||||||
g_hash_table_insert(attributes, g_strdup("server"), g_strdup(server));
|
|
||||||
g_hash_table_insert(attributes, g_strdup("docker_cli"), g_strdup("1"));
|
|
||||||
|
|
||||||
service = secret_service_get_sync(SECRET_SERVICE_NONE, NULL, &err);
|
|
||||||
if (err == NULL) {
|
|
||||||
items = secret_service_search_sync(service, DOCKER_SCHEMA, attributes, flags, NULL, &err);
|
|
||||||
if (err == NULL) {
|
|
||||||
for (l = items; l != NULL; l = g_list_next(l)) {
|
|
||||||
value = secret_item_get_schema_name(l->data);
|
|
||||||
if (strncmp(value, "io.docker.Credentials", strlen(value)) != 0) {
|
|
||||||
g_free(value);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
g_free(value);
|
|
||||||
secretValue = secret_item_get_secret(l->data);
|
|
||||||
if (secret != NULL) {
|
|
||||||
*secret = strdup(secret_value_get(secretValue, &length));
|
|
||||||
secret_value_unref(secretValue);
|
|
||||||
}
|
|
||||||
*username = get_attribute("username", l->data);
|
|
||||||
}
|
|
||||||
g_list_free_full(items, g_object_unref);
|
|
||||||
}
|
|
||||||
g_object_unref(service);
|
|
||||||
}
|
|
||||||
g_hash_table_unref(attributes);
|
|
||||||
if (err != NULL) {
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
GError *list(char *ref_label, char *** paths, char *** accts, unsigned int *list_l) {
|
|
||||||
GList *items;
|
|
||||||
GError *err = NULL;
|
|
||||||
SecretService *service;
|
|
||||||
SecretSearchFlags flags = SECRET_SEARCH_LOAD_SECRETS | SECRET_SEARCH_ALL | SECRET_SEARCH_UNLOCK;
|
|
||||||
GHashTable *attributes = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free);
|
|
||||||
|
|
||||||
// List credentials with the right label only
|
|
||||||
g_hash_table_insert(attributes, g_strdup("label"), g_strdup(ref_label));
|
|
||||||
|
|
||||||
service = secret_service_get_sync(SECRET_SERVICE_NONE, NULL, &err);
|
|
||||||
if (err != NULL) {
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
|
|
||||||
items = secret_service_search_sync(service, NULL, attributes, flags, NULL, &err);
|
|
||||||
int numKeys = g_list_length(items);
|
|
||||||
if (err != NULL) {
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
|
|
||||||
char **tmp_paths = (char **) calloc(1,(int)sizeof(char *)*numKeys);
|
|
||||||
char **tmp_accts = (char **) calloc(1,(int)sizeof(char *)*numKeys);
|
|
||||||
|
|
||||||
// items now contains our keys from the gnome keyring
|
|
||||||
// we will now put it in our two lists to return it to go
|
|
||||||
GList *current;
|
|
||||||
int listNumber = 0;
|
|
||||||
for(current = items; current!=NULL; current = current->next) {
|
|
||||||
char *pathTmp = secret_item_get_label(current->data);
|
|
||||||
// you cannot have a key without a label in the gnome keyring
|
|
||||||
char *acctTmp = get_attribute("username",current->data);
|
|
||||||
if (acctTmp==NULL) {
|
|
||||||
acctTmp = "account not defined";
|
|
||||||
}
|
|
||||||
|
|
||||||
tmp_paths[listNumber] = (char *) calloc(1, sizeof(char)*(strlen(pathTmp)+1));
|
|
||||||
tmp_accts[listNumber] = (char *) calloc(1, sizeof(char)*(strlen(acctTmp)+1));
|
|
||||||
|
|
||||||
memcpy(tmp_paths[listNumber], pathTmp, sizeof(char)*(strlen(pathTmp)+1));
|
|
||||||
memcpy(tmp_accts[listNumber], acctTmp, sizeof(char)*(strlen(acctTmp)+1));
|
|
||||||
|
|
||||||
listNumber = listNumber + 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
*paths = (char **) realloc(tmp_paths, (int)sizeof(char *)*listNumber);
|
|
||||||
*accts = (char **) realloc(tmp_accts, (int)sizeof(char *)*listNumber);
|
|
||||||
|
|
||||||
*list_l = listNumber;
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
void freeListData(char *** data, unsigned int length) {
|
|
||||||
int i;
|
|
||||||
for(i=0; i<length; i++) {
|
|
||||||
free((*data)[i]);
|
|
||||||
}
|
|
||||||
}
|
|
118
vendor/github.com/docker/docker-credential-helpers/secretservice/secretservice_linux.go
generated
vendored
118
vendor/github.com/docker/docker-credential-helpers/secretservice/secretservice_linux.go
generated
vendored
|
@ -1,118 +0,0 @@
|
||||||
package secretservice
|
|
||||||
|
|
||||||
/*
|
|
||||||
#cgo pkg-config: libsecret-1
|
|
||||||
|
|
||||||
#include "secretservice_linux.h"
|
|
||||||
#include <stdlib.h>
|
|
||||||
*/
|
|
||||||
import "C"
|
|
||||||
import (
|
|
||||||
"errors"
|
|
||||||
"unsafe"
|
|
||||||
|
|
||||||
"github.com/docker/docker-credential-helpers/credentials"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Secretservice handles secrets using Linux secret-service as a store.
|
|
||||||
type Secretservice struct{}
|
|
||||||
|
|
||||||
// Add adds new credentials to the keychain.
|
|
||||||
func (h Secretservice) Add(creds *credentials.Credentials) error {
|
|
||||||
if creds == nil {
|
|
||||||
return errors.New("missing credentials")
|
|
||||||
}
|
|
||||||
credsLabel := C.CString(credentials.CredsLabel)
|
|
||||||
defer C.free(unsafe.Pointer(credsLabel))
|
|
||||||
server := C.CString(creds.ServerURL)
|
|
||||||
defer C.free(unsafe.Pointer(server))
|
|
||||||
username := C.CString(creds.Username)
|
|
||||||
defer C.free(unsafe.Pointer(username))
|
|
||||||
secret := C.CString(creds.Secret)
|
|
||||||
defer C.free(unsafe.Pointer(secret))
|
|
||||||
|
|
||||||
if err := C.add(credsLabel, server, username, secret); err != nil {
|
|
||||||
defer C.g_error_free(err)
|
|
||||||
errMsg := (*C.char)(unsafe.Pointer(err.message))
|
|
||||||
return errors.New(C.GoString(errMsg))
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Delete removes credentials from the store.
|
|
||||||
func (h Secretservice) Delete(serverURL string) error {
|
|
||||||
if serverURL == "" {
|
|
||||||
return errors.New("missing server url")
|
|
||||||
}
|
|
||||||
server := C.CString(serverURL)
|
|
||||||
defer C.free(unsafe.Pointer(server))
|
|
||||||
|
|
||||||
if err := C.delete(server); err != nil {
|
|
||||||
defer C.g_error_free(err)
|
|
||||||
errMsg := (*C.char)(unsafe.Pointer(err.message))
|
|
||||||
return errors.New(C.GoString(errMsg))
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get returns the username and secret to use for a given registry server URL.
|
|
||||||
func (h Secretservice) Get(serverURL string) (string, string, error) {
|
|
||||||
if serverURL == "" {
|
|
||||||
return "", "", errors.New("missing server url")
|
|
||||||
}
|
|
||||||
var username *C.char
|
|
||||||
defer C.free(unsafe.Pointer(username))
|
|
||||||
var secret *C.char
|
|
||||||
defer C.free(unsafe.Pointer(secret))
|
|
||||||
server := C.CString(serverURL)
|
|
||||||
defer C.free(unsafe.Pointer(server))
|
|
||||||
|
|
||||||
err := C.get(server, &username, &secret)
|
|
||||||
if err != nil {
|
|
||||||
defer C.g_error_free(err)
|
|
||||||
errMsg := (*C.char)(unsafe.Pointer(err.message))
|
|
||||||
return "", "", errors.New(C.GoString(errMsg))
|
|
||||||
}
|
|
||||||
user := C.GoString(username)
|
|
||||||
pass := C.GoString(secret)
|
|
||||||
if pass == "" {
|
|
||||||
return "", "", credentials.NewErrCredentialsNotFound()
|
|
||||||
}
|
|
||||||
return user, pass, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// List returns the stored URLs and corresponding usernames for a given credentials label
|
|
||||||
func (h Secretservice) List() (map[string]string, error) {
|
|
||||||
credsLabelC := C.CString(credentials.CredsLabel)
|
|
||||||
defer C.free(unsafe.Pointer(credsLabelC))
|
|
||||||
|
|
||||||
var pathsC **C.char
|
|
||||||
defer C.free(unsafe.Pointer(pathsC))
|
|
||||||
var acctsC **C.char
|
|
||||||
defer C.free(unsafe.Pointer(acctsC))
|
|
||||||
var listLenC C.uint
|
|
||||||
err := C.list(credsLabelC, &pathsC, &acctsC, &listLenC)
|
|
||||||
defer C.freeListData(&pathsC, listLenC)
|
|
||||||
defer C.freeListData(&acctsC, listLenC)
|
|
||||||
if err != nil {
|
|
||||||
defer C.g_error_free(err)
|
|
||||||
return nil, errors.New("Error from list function in secretservice_linux.c likely due to error in secretservice library")
|
|
||||||
}
|
|
||||||
|
|
||||||
resp := make(map[string]string)
|
|
||||||
|
|
||||||
listLen := int(listLenC)
|
|
||||||
if listLen == 0 {
|
|
||||||
return resp, nil
|
|
||||||
}
|
|
||||||
// The maximum capacity of the following two slices is limited to (2^29)-1 to remain compatible
|
|
||||||
// with 32-bit platforms. The size of a `*C.char` (a pointer) is 4 Byte on a 32-bit system
|
|
||||||
// and (2^29)*4 == math.MaxInt32 + 1. -- See issue golang/go#13656
|
|
||||||
pathTmp := (*[(1 << 29) - 1]*C.char)(unsafe.Pointer(pathsC))[:listLen:listLen]
|
|
||||||
acctTmp := (*[(1 << 29) - 1]*C.char)(unsafe.Pointer(acctsC))[:listLen:listLen]
|
|
||||||
for i := 0; i < listLen; i++ {
|
|
||||||
resp[C.GoString(pathTmp[i])] = C.GoString(acctTmp[i])
|
|
||||||
}
|
|
||||||
|
|
||||||
return resp, nil
|
|
||||||
}
|
|
13
vendor/github.com/docker/docker-credential-helpers/secretservice/secretservice_linux.h
generated
vendored
13
vendor/github.com/docker/docker-credential-helpers/secretservice/secretservice_linux.h
generated
vendored
|
@ -1,13 +0,0 @@
|
||||||
#define SECRET_WITH_UNSTABLE 1
|
|
||||||
#define SECRET_API_SUBJECT_TO_CHANGE 1
|
|
||||||
#include <libsecret/secret.h>
|
|
||||||
|
|
||||||
const SecretSchema *docker_get_schema(void) G_GNUC_CONST;
|
|
||||||
|
|
||||||
#define DOCKER_SCHEMA docker_get_schema()
|
|
||||||
|
|
||||||
GError *add(char *label, char *server, char *username, char *secret);
|
|
||||||
GError *delete(char *server);
|
|
||||||
GError *get(char *server, char **username, char **secret);
|
|
||||||
GError *list(char *label, char *** paths, char *** accts, unsigned int *list_l);
|
|
||||||
void freeListData(char *** data, unsigned int length);
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,57 +0,0 @@
|
||||||
The Moby Project
|
|
||||||
================
|
|
||||||
|
|
||||||
![Moby Project logo](docs/static_files/moby-project-logo.png "The Moby Project")
|
|
||||||
|
|
||||||
Moby is an open-source project created by Docker to enable and accelerate software containerization.
|
|
||||||
|
|
||||||
It provides a "Lego set" of toolkit components, the framework for assembling them into custom container-based systems, and a place for all container enthusiasts and professionals to experiment and exchange ideas.
|
|
||||||
Components include container build tools, a container registry, orchestration tools, a runtime and more, and these can be used as building blocks in conjunction with other tools and projects.
|
|
||||||
|
|
||||||
## Principles
|
|
||||||
|
|
||||||
Moby is an open project guided by strong principles, aiming to be modular, flexible and without too strong an opinion on user experience.
|
|
||||||
It is open to the community to help set its direction.
|
|
||||||
|
|
||||||
- Modular: the project includes lots of components that have well-defined functions and APIs that work together.
|
|
||||||
- Batteries included but swappable: Moby includes enough components to build fully featured container system, but its modular architecture ensures that most of the components can be swapped by different implementations.
|
|
||||||
- Usable security: Moby provides secure defaults without compromising usability.
|
|
||||||
- Developer focused: The APIs are intended to be functional and useful to build powerful tools.
|
|
||||||
They are not necessarily intended as end user tools but as components aimed at developers.
|
|
||||||
Documentation and UX is aimed at developers not end users.
|
|
||||||
|
|
||||||
## Audience
|
|
||||||
|
|
||||||
The Moby Project is intended for engineers, integrators and enthusiasts looking to modify, hack, fix, experiment, invent and build systems based on containers.
|
|
||||||
It is not for people looking for a commercially supported system, but for people who want to work and learn with open source code.
|
|
||||||
|
|
||||||
## Relationship with Docker
|
|
||||||
|
|
||||||
The components and tools in the Moby Project are initially the open source components that Docker and the community have built for the Docker Project.
|
|
||||||
New projects can be added if they fit with the community goals. Docker is committed to using Moby as the upstream for the Docker Product.
|
|
||||||
However, other projects are also encouraged to use Moby as an upstream, and to reuse the components in diverse ways, and all these uses will be treated in the same way. External maintainers and contributors are welcomed.
|
|
||||||
|
|
||||||
The Moby project is not intended as a location for support or feature requests for Docker products, but as a place for contributors to work on open source code, fix bugs, and make the code more useful.
|
|
||||||
The releases are supported by the maintainers, community and users, on a best efforts basis only, and are not intended for customers who want enterprise or commercial support; Docker EE is the appropriate product for these use cases.
|
|
||||||
|
|
||||||
-----
|
|
||||||
|
|
||||||
Legal
|
|
||||||
=====
|
|
||||||
|
|
||||||
*Brought to you courtesy of our legal counsel. For more context,
|
|
||||||
please see the [NOTICE](https://github.com/moby/moby/blob/master/NOTICE) document in this repo.*
|
|
||||||
|
|
||||||
Use and transfer of Moby may be subject to certain restrictions by the
|
|
||||||
United States and other governments.
|
|
||||||
|
|
||||||
It is your responsibility to ensure that your use and/or transfer does not
|
|
||||||
violate applicable laws.
|
|
||||||
|
|
||||||
For more information, please see https://www.bis.doc.gov
|
|
||||||
|
|
||||||
Licensing
|
|
||||||
=========
|
|
||||||
Moby is licensed under the Apache License, Version 2.0. See
|
|
||||||
[LICENSE](https://github.com/moby/moby/blob/master/LICENSE) for the full
|
|
||||||
license text.
|
|
|
@ -0,0 +1,12 @@
|
||||||
|
|
||||||
|
layout:
|
||||||
|
models:
|
||||||
|
- name: definition
|
||||||
|
source: asset:model
|
||||||
|
target: "{{ joinFilePath .Target .ModelPackage }}"
|
||||||
|
file_name: "{{ (snakize (pascalize .Name)) }}.go"
|
||||||
|
operations:
|
||||||
|
- name: handler
|
||||||
|
source: asset:serverOperation
|
||||||
|
target: "{{ joinFilePath .Target .APIPackage .Package }}"
|
||||||
|
file_name: "{{ (snakize (pascalize .Name)) }}.go"
|
File diff suppressed because it is too large
Load Diff
|
@ -1,4 +0,0 @@
|
||||||
The `contrib` directory contains scripts, images, and other helpful things
|
|
||||||
which are not part of the core docker distribution. Please note that they
|
|
||||||
could be out of date, since they do not receive the same attention as the
|
|
||||||
rest of the repository.
|
|
|
@ -1,10 +0,0 @@
|
||||||
#include <stdio.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
|
||||||
{
|
|
||||||
printf("EUID=%d\n", geteuid());
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,16 +0,0 @@
|
||||||
#define _GNU_SOURCE
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <errno.h>
|
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
|
||||||
{
|
|
||||||
int err = acct("/tmp/t");
|
|
||||||
if (err == -1) {
|
|
||||||
fprintf(stderr, "acct failed: %s\n", strerror(errno));
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
exit(EXIT_SUCCESS);
|
|
||||||
}
|
|
|
@ -1,7 +0,0 @@
|
||||||
.globl _start
|
|
||||||
.text
|
|
||||||
_start:
|
|
||||||
xorl %eax, %eax
|
|
||||||
incl %eax
|
|
||||||
movb $0, %bl
|
|
||||||
int $0x80
|
|
|
@ -1,63 +0,0 @@
|
||||||
#define _GNU_SOURCE
|
|
||||||
#include <errno.h>
|
|
||||||
#include <sched.h>
|
|
||||||
#include <signal.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <sys/mman.h>
|
|
||||||
#include <sys/wait.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
|
|
||||||
#define STACK_SIZE (1024 * 1024) /* Stack size for cloned child */
|
|
||||||
|
|
||||||
struct clone_args {
|
|
||||||
char **argv;
|
|
||||||
};
|
|
||||||
|
|
||||||
// child_exec is the func that will be executed as the result of clone
|
|
||||||
static int child_exec(void *stuff)
|
|
||||||
{
|
|
||||||
struct clone_args *args = (struct clone_args *)stuff;
|
|
||||||
if (execvp(args->argv[0], args->argv) != 0) {
|
|
||||||
fprintf(stderr, "failed to execvp arguments %s\n",
|
|
||||||
strerror(errno));
|
|
||||||
exit(-1);
|
|
||||||
}
|
|
||||||
// we should never reach here!
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
|
||||||
{
|
|
||||||
struct clone_args args;
|
|
||||||
args.argv = &argv[1];
|
|
||||||
|
|
||||||
int clone_flags = CLONE_NEWNS | CLONE_NEWPID | SIGCHLD;
|
|
||||||
|
|
||||||
// allocate stack for child
|
|
||||||
char *stack; /* Start of stack buffer */
|
|
||||||
char *child_stack; /* End of stack buffer */
|
|
||||||
stack =
|
|
||||||
mmap(NULL, STACK_SIZE, PROT_READ | PROT_WRITE,
|
|
||||||
MAP_SHARED | MAP_ANON | MAP_STACK, -1, 0);
|
|
||||||
if (stack == MAP_FAILED) {
|
|
||||||
fprintf(stderr, "mmap failed: %s\n", strerror(errno));
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
child_stack = stack + STACK_SIZE; /* Assume stack grows downward */
|
|
||||||
|
|
||||||
// the result of this call is that our child_exec will be run in another
|
|
||||||
// process returning its pid
|
|
||||||
pid_t pid = clone(child_exec, child_stack, clone_flags, &args);
|
|
||||||
if (pid < 0) {
|
|
||||||
fprintf(stderr, "clone failed: %s\n", strerror(errno));
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
// lets wait on our child process here before we, the parent, exits
|
|
||||||
if (waitpid(pid, NULL, 0) == -1) {
|
|
||||||
fprintf(stderr, "failed to wait pid %d\n", pid);
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
exit(EXIT_SUCCESS);
|
|
||||||
}
|
|
|
@ -1,14 +0,0 @@
|
||||||
#include <stdio.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <sys/socket.h>
|
|
||||||
#include <netinet/ip.h>
|
|
||||||
#include <netinet/udp.h>
|
|
||||||
|
|
||||||
int main() {
|
|
||||||
if (socket(PF_INET, SOCK_RAW, IPPROTO_UDP) == -1) {
|
|
||||||
perror("socket");
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
|
@ -1,11 +0,0 @@
|
||||||
#include <sys/types.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
int main() {
|
|
||||||
if (setgid(1) == -1) {
|
|
||||||
perror("setgid");
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
|
@ -1,11 +0,0 @@
|
||||||
#include <sys/types.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
int main() {
|
|
||||||
if (setuid(1) == -1) {
|
|
||||||
perror("setuid");
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
|
@ -1,30 +0,0 @@
|
||||||
#include <stdio.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <sys/socket.h>
|
|
||||||
#include <netinet/in.h>
|
|
||||||
#include <arpa/inet.h>
|
|
||||||
|
|
||||||
int main() {
|
|
||||||
int s;
|
|
||||||
struct sockaddr_in sin;
|
|
||||||
|
|
||||||
s = socket(AF_INET, SOCK_STREAM, 0);
|
|
||||||
if (s == -1) {
|
|
||||||
perror("socket");
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
sin.sin_family = AF_INET;
|
|
||||||
sin.sin_addr.s_addr = INADDR_ANY;
|
|
||||||
sin.sin_port = htons(80);
|
|
||||||
|
|
||||||
if (bind(s, (struct sockaddr *)&sin, sizeof(sin)) == -1) {
|
|
||||||
perror("bind");
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
close(s);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
|
@ -1,63 +0,0 @@
|
||||||
#define _GNU_SOURCE
|
|
||||||
#include <errno.h>
|
|
||||||
#include <sched.h>
|
|
||||||
#include <signal.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <sys/mman.h>
|
|
||||||
#include <sys/wait.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
|
|
||||||
#define STACK_SIZE (1024 * 1024) /* Stack size for cloned child */
|
|
||||||
|
|
||||||
struct clone_args {
|
|
||||||
char **argv;
|
|
||||||
};
|
|
||||||
|
|
||||||
// child_exec is the func that will be executed as the result of clone
|
|
||||||
static int child_exec(void *stuff)
|
|
||||||
{
|
|
||||||
struct clone_args *args = (struct clone_args *)stuff;
|
|
||||||
if (execvp(args->argv[0], args->argv) != 0) {
|
|
||||||
fprintf(stderr, "failed to execvp arguments %s\n",
|
|
||||||
strerror(errno));
|
|
||||||
exit(-1);
|
|
||||||
}
|
|
||||||
// we should never reach here!
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
|
||||||
{
|
|
||||||
struct clone_args args;
|
|
||||||
args.argv = &argv[1];
|
|
||||||
|
|
||||||
int clone_flags = CLONE_NEWUSER | SIGCHLD;
|
|
||||||
|
|
||||||
// allocate stack for child
|
|
||||||
char *stack; /* Start of stack buffer */
|
|
||||||
char *child_stack; /* End of stack buffer */
|
|
||||||
stack =
|
|
||||||
mmap(NULL, STACK_SIZE, PROT_READ | PROT_WRITE,
|
|
||||||
MAP_SHARED | MAP_ANON | MAP_STACK, -1, 0);
|
|
||||||
if (stack == MAP_FAILED) {
|
|
||||||
fprintf(stderr, "mmap failed: %s\n", strerror(errno));
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
child_stack = stack + STACK_SIZE; /* Assume stack grows downward */
|
|
||||||
|
|
||||||
// the result of this call is that our child_exec will be run in another
|
|
||||||
// process returning its pid
|
|
||||||
pid_t pid = clone(child_exec, child_stack, clone_flags, &args);
|
|
||||||
if (pid < 0) {
|
|
||||||
fprintf(stderr, "clone failed: %s\n", strerror(errno));
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
// lets wait on our child process here before we, the parent, exits
|
|
||||||
if (waitpid(pid, NULL, 0) == -1) {
|
|
||||||
fprintf(stderr, "failed to wait pid %d\n", pid);
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
exit(EXIT_SUCCESS);
|
|
||||||
}
|
|
|
@ -1,11 +0,0 @@
|
||||||
pkg/ is a collection of utility packages used by the Moby project without being specific to its internals.
|
|
||||||
|
|
||||||
Utility packages are kept separate from the moby core codebase to keep it as small and concise as possible.
|
|
||||||
If some utilities grow larger and their APIs stabilize, they may be moved to their own repository under the
|
|
||||||
Moby organization, to facilitate re-use by other projects. However that is not the priority.
|
|
||||||
|
|
||||||
The directory `pkg` is named after the same directory in the camlistore project. Since Brad is a core
|
|
||||||
Go maintainer, we thought it made sense to copy his methods for organizing Go code :) Thanks Brad!
|
|
||||||
|
|
||||||
Because utility packages are small and neatly separated from the rest of the codebase, they are a good
|
|
||||||
place to start for aspiring maintainers and contributors. Get in touch if you want to help maintain them!
|
|
|
@ -1,192 +0,0 @@
|
||||||
github.com/Azure/go-ansiterm d185dfc1b5a126116ea5a19e148e29d16b4574c9
|
|
||||||
github.com/Microsoft/hcsshim 3ad51c76263bad09548a40e1996960814a12a870 # v0.8.20
|
|
||||||
github.com/Microsoft/go-winio 5c2e05d71961716a6c392a06ada435aaf5d5302c # v0.4.19
|
|
||||||
github.com/docker/libtrust 9cbd2a1374f46905c68a4eb3694a130610adc62a
|
|
||||||
github.com/golang/gddo 72a348e765d293ed6d1ded7b699591f14d6cd921
|
|
||||||
github.com/google/uuid 0cd6bf5da1e1c83f8b45653022c74f71af0538a4 # v1.1.1
|
|
||||||
github.com/gorilla/mux 98cb6bf42e086f6af920b965c38cacc07402d51b # v1.8.0
|
|
||||||
github.com/moby/locker 281af2d563954745bea9d1487c965f24d30742fe # v1.0.1
|
|
||||||
github.com/moby/term 3f7ff695adc6a35abc925370dd0a4dafb48ec64d
|
|
||||||
|
|
||||||
# Note that this dependency uses submodules, providing the github.com/moby/sys/mount,
|
|
||||||
# github.com/moby/sys/mountinfo, github.com/moby/sys/signal, and github.com/moby/sys/symlink
|
|
||||||
# modules. Our vendoring tool (vndr) currently does not support submodules / vendoring sub-paths,
|
|
||||||
# so we vendor the top-level moby/sys repository (which contains both) and pick the most recent tag,
|
|
||||||
# which could be either `mountinfo/vX.Y.Z`, `mount/vX.Y.Z`, `signal/vX.Y.Z`, or `symlink/vX.Y.Z`.
|
|
||||||
github.com/moby/sys 9b0136d132d8e0d1c116a38d7ec9af70d3a59536 # signal/v0.5.0
|
|
||||||
|
|
||||||
github.com/creack/pty 2a38352e8b4d7ab6c336eef107e42a55e72e7fbc # v1.1.11
|
|
||||||
github.com/sirupsen/logrus bdc0db8ead3853c56b7cd1ac2ba4e11b47d7da6b # v1.8.1
|
|
||||||
github.com/tchap/go-patricia a7f0089c6f496e8e70402f61733606daa326cac5 # v2.3.0
|
|
||||||
golang.org/x/net e18ecbb051101a46fc263334b127c89bc7bff7ea
|
|
||||||
golang.org/x/sys d19ff857e887eacb631721f188c7d365c2331456
|
|
||||||
github.com/docker/go-units 519db1ee28dcc9fd2474ae59fca29a810482bfb1 # v0.4.0
|
|
||||||
github.com/docker/go-connections 7395e3f8aa162843a74ed6d48e79627d9792ac55 # v0.4.0
|
|
||||||
golang.org/x/text 23ae387dee1f90d29a23c0e87ee0b46038fbed0e # v0.3.3
|
|
||||||
gotest.tools/v3 568bc57cc5c19a2ef85e5749870b49a4cc2ab54d # v3.0.3
|
|
||||||
github.com/google/go-cmp 3af367b6b30c263d47e8895973edcca9a49cf029 # v0.2.0
|
|
||||||
github.com/syndtr/gocapability 42c35b4376354fd554efc7ad35e0b7f94e3a0ffb
|
|
||||||
|
|
||||||
github.com/RackSec/srslog a4725f04ec91af1a91b380da679d6e0c2f061e59
|
|
||||||
github.com/imdario/mergo 1afb36080aec31e0d1528973ebe6721b191b0369 # v0.3.8
|
|
||||||
golang.org/x/sync 036812b2e83c0ddf193dd5a34e034151da389d09
|
|
||||||
|
|
||||||
# buildkit
|
|
||||||
github.com/moby/buildkit 9f254e18360a24c2ae47b26f772c3c89533bcbb7 # master / v0.9.0-dev
|
|
||||||
github.com/tonistiigi/fsutil d72af97c0eaf93c1d20360e3cb9c63c223675b83
|
|
||||||
github.com/tonistiigi/units 6950e57a87eaf136bbe44ef2ec8e75b9e3569de2
|
|
||||||
github.com/grpc-ecosystem/grpc-opentracing 8e809c8a86450a29b90dcc9efbf062d0fe6d9746
|
|
||||||
github.com/opentracing/opentracing-go d34af3eaa63c4d08ab54863a4bdd0daa45212e12 # v1.2.0
|
|
||||||
github.com/google/shlex e7afc7fbc51079733e9468cdfd1efcd7d196cd1d
|
|
||||||
github.com/opentracing-contrib/go-stdlib 8a6ff1ad1691a29e4f7b5d46604f97634997c8c4 # v1.0.0
|
|
||||||
github.com/mitchellh/hashstructure a38c50148365edc8df43c1580c48fb2b3a1e9cd7 # v1.0.0
|
|
||||||
github.com/gofrs/flock 6caa7350c26b838538005fae7dbee4e69d9398db # v0.7.3
|
|
||||||
github.com/grpc-ecosystem/go-grpc-middleware 3c51f7f332123e8be5a157c0802a228ac85bf9db # v1.2.0
|
|
||||||
|
|
||||||
# libnetwork
|
|
||||||
|
|
||||||
github.com/docker/go-events e31b211e4f1cd09aa76fe4ac244571fab96ae47f
|
|
||||||
github.com/armon/go-radix e39d623f12e8e41c7b5529e9a9dd67a1e2261f80
|
|
||||||
github.com/armon/go-metrics eb0af217e5e9747e41dd5303755356b62d28e3ec
|
|
||||||
github.com/hashicorp/go-msgpack 71c2886f5a673a35f909803f38ece5810165097b
|
|
||||||
github.com/hashicorp/memberlist 619135cdd9e5dda8c12f8ceef39bdade4f5899b6 # v0.2.4
|
|
||||||
github.com/sean-/seed e2103e2c35297fb7e17febb81e49b312087a2372
|
|
||||||
github.com/hashicorp/errwrap 8a6fb523712970c966eefc6b39ed2c5e74880354 # v1.0.0
|
|
||||||
github.com/hashicorp/go-sockaddr c7188e74f6acae5a989bdc959aa779f8b9f42faf # v1.0.2
|
|
||||||
github.com/hashicorp/go-multierror 886a7fbe3eb1c874d46f623bfa70af45f425b3d1 # v1.0.0
|
|
||||||
github.com/hashicorp/serf 598c54895cc5a7b1a24a398d635e8c0ea0959870
|
|
||||||
github.com/docker/libkv 458977154600b9f23984d9f4b82e79570b5ae12b
|
|
||||||
github.com/vishvananda/netns db3c7e526aae966c4ccfa6c8189b693d6ac5d202
|
|
||||||
github.com/vishvananda/netlink f049be6f391489d3f374498fe0c8df8449258372 # v1.1.0
|
|
||||||
github.com/moby/ipvs 4566ccea0e08d68e9614c3e7a64a23b850c4bb35 # v1.0.1
|
|
||||||
github.com/google/btree 479b5e81b0a93ec038d201b0b33d17db599531d3 # v1.0.1
|
|
||||||
|
|
||||||
github.com/samuel/go-zookeeper d0e0d8e11f318e000a8cc434616d69e329edc374
|
|
||||||
github.com/deckarep/golang-set ef32fa3046d9f249d399f98ebaf9be944430fd1d
|
|
||||||
github.com/coreos/etcd 2c834459e1aab78a5d5219c7dfe42335fc4b617a # v3.3.25
|
|
||||||
github.com/coreos/go-semver 8ab6407b697782a06568d4b7f1db25550ec2e4c6 # v0.2.0
|
|
||||||
github.com/hashicorp/consul 9a9cc9341bb487651a0399e3fc5e1e8a42e62dd9 # v0.5.2
|
|
||||||
github.com/miekg/dns 6c0c4e6581f8e173cc562c8b3363ab984e4ae071 # v1.1.27
|
|
||||||
github.com/ishidawataru/sctp f2269e66cdee387bd321445d5d300893449805be
|
|
||||||
go.etcd.io/bbolt 232d8fc87f50244f9c808f4745759e08a304c029 # v1.3.5
|
|
||||||
github.com/json-iterator/go a1ca0830781e007c66b225121d2cdb3a649421f6 # v1.1.10
|
|
||||||
github.com/modern-go/concurrent bacd9c7ef1dd9b15be4a9909b8ac7a4e313eec94 # 1.0.3
|
|
||||||
github.com/modern-go/reflect2 94122c33edd36123c84d5368cfb2b69df93a0ec8 # v1.0.1
|
|
||||||
|
|
||||||
# get graph and distribution packages
|
|
||||||
github.com/docker/distribution 0d3efadf0154c2b8a4e7b6621fff9809655cc580
|
|
||||||
github.com/vbatts/tar-split 620714a4c508c880ac1bdda9c8370a2b19af1a55 # v0.11.1
|
|
||||||
github.com/opencontainers/go-digest ea51bea511f75cfa3ef6098cc253c5c3609b037a # v1.0.0
|
|
||||||
|
|
||||||
# get go-zfs packages
|
|
||||||
github.com/mistifyio/go-zfs f784269be439d704d3dfa1906f45dd848fed2beb
|
|
||||||
|
|
||||||
google.golang.org/grpc f495f5b15ae7ccda3b38c53a1bfcde4c1a58a2bc # v1.27.1
|
|
||||||
|
|
||||||
# The version of runc should match the version that is used by the containerd
|
|
||||||
# version that is used. If you need to update runc, open a pull request in
|
|
||||||
# the containerd project first, and update both after that is merged.
|
|
||||||
# This commit does not need to match RUNC_COMMIT as it is used for helper
|
|
||||||
# packages but should be newer or equal.
|
|
||||||
github.com/opencontainers/runc 4144b63817ebcc5b358fc2c8ef95f7cddd709aa7 # v1.0.1
|
|
||||||
github.com/opencontainers/runtime-spec 1c3f411f041711bbeecf35ff7e93461ea6789220 # v1.0.3-0.20210326190908-1c3f411f0417
|
|
||||||
github.com/opencontainers/image-spec d60099175f88c47cd379c4738d158884749ed235 # v1.0.1
|
|
||||||
github.com/cyphar/filepath-securejoin a261ee33d7a517f054effbf451841abaafe3e0fd # v0.2.2
|
|
||||||
|
|
||||||
# go-systemd v17 is required by github.com/coreos/pkg/capnslog/journald_formatter.go
|
|
||||||
github.com/coreos/go-systemd 39ca1b05acc7ad1220e09f133283b8859a8b71ab # v17
|
|
||||||
|
|
||||||
# systemd integration (journald, daemon/listeners, containerd/cgroups)
|
|
||||||
github.com/coreos/go-systemd/v22 777e73a89cef78631ccaa97f53a9bae67e166186 # v22.3.2
|
|
||||||
github.com/godbus/dbus/v5 c88335c0b1d28a30e7fc76d526a06154b85e5d97 # v5.0.4
|
|
||||||
|
|
||||||
# gelf logging driver deps
|
|
||||||
github.com/Graylog2/go-gelf 1550ee647df0510058c9d67a45c56f18911d80b8 # v2 branch
|
|
||||||
|
|
||||||
# fluent-logger-golang deps
|
|
||||||
github.com/fluent/fluent-logger-golang b9b7fb02ccfee8ba4e69aa87386820c2bf24fd11 # v1.6.1
|
|
||||||
github.com/philhofer/fwd bb6d471dc95d4fe11e432687f8b70ff496cf3136 # v1.0.0
|
|
||||||
github.com/tinylib/msgp af6442a0fcf6e2a1b824f70dd0c734f01e817751 # v1.1.0
|
|
||||||
|
|
||||||
# fsnotify
|
|
||||||
github.com/fsnotify/fsnotify 45d7d09e39ef4ac08d493309fa031790c15bfe8a # v1.4.9
|
|
||||||
|
|
||||||
# awslogs deps
|
|
||||||
github.com/aws/aws-sdk-go 2590bc875c54c9fda225d8e4e56a9d28d90c6a47 # v1.28.11
|
|
||||||
github.com/jmespath/go-jmespath 2d053f87d1d7f9f48196ae04cf3daea4273d207d # v0.3.0
|
|
||||||
|
|
||||||
# logentries
|
|
||||||
github.com/bsphere/le_go 7a984a84b5492ae539b79b62fb4a10afc63c7bcf
|
|
||||||
|
|
||||||
# gcplogs deps
|
|
||||||
golang.org/x/oauth2 bf48bf16ab8d622ce64ec6ce98d2c98f916b6303
|
|
||||||
google.golang.org/api dec2ee309f5b09fc59bc40676447c15736284d78 # v0.8.0
|
|
||||||
github.com/golang/groupcache 869f871628b6baa9cfbc11732cdf6546b17c1298
|
|
||||||
go.opencensus.io d835ff86be02193d324330acdb7d65546b05f814 # v0.22.3
|
|
||||||
cloud.google.com/go ceeb313ad77b789a7fa5287b36a1d127b69b7093 # v0.44.3
|
|
||||||
github.com/googleapis/gax-go bd5b16380fd03dc758d11cef74ba2e3bc8b0e8c2 # v2.0.5
|
|
||||||
google.golang.org/genproto 3f1135a288c9a07e340ae8ba4cc6c7065a3160e8
|
|
||||||
|
|
||||||
# containerd
|
|
||||||
github.com/containerd/containerd 72cec4be58a9eb6b2910f5d10f1c01ca47d231c0 # v1.5.5
|
|
||||||
github.com/containerd/fifo 650e8a8a179d040123db61f016cb133143e7a581 # v1.0.0
|
|
||||||
github.com/containerd/continuity bce1c3f9669b6f3e7f6656ee715b0b4d75fa64a6 # v0.1.0
|
|
||||||
github.com/containerd/cgroups b9de8a2212026c07cec67baf3323f1fc0121e048 # v1.0.1
|
|
||||||
github.com/containerd/console 2f1e3d2b6afd18e8b2077816c711205a0b4d8769 # v1.0.2
|
|
||||||
github.com/containerd/go-runc 16b287bc67d069a60fa48db15f330b790b74365b # v1.0.0
|
|
||||||
github.com/containerd/typeurl 5e43fb8b75ed2f2305fc04e6918c8d10636771bc # v1.0.2
|
|
||||||
github.com/containerd/ttrpc bfba540dc45464586c106b1f31c8547933c1eb41 # v1.0.2
|
|
||||||
github.com/gogo/googleapis 01e0f9cca9b92166042241267ee2a5cdf5cff46c # v1.3.2
|
|
||||||
github.com/cilium/ebpf ca492085341e0e917f48ec30704d5054c5d42ca8 # v0.6.2
|
|
||||||
github.com/klauspost/compress a3b7545c88eea469c2246bee0e6c130525d56190 # v1.11.13
|
|
||||||
github.com/pelletier/go-toml 65ca8064882c8c308e5c804c5d5443d409e0738c # v1.8.1
|
|
||||||
|
|
||||||
# cluster
|
|
||||||
github.com/docker/swarmkit 3629f50980f6c0dd5ccd7dbfa0956b57ea0cd78d # master
|
|
||||||
github.com/gogo/protobuf b03c65ea87cdc3521ede29f62fe3ce239267c1bc # v1.3.2
|
|
||||||
github.com/golang/protobuf 84668698ea25b64748563aa20726db66a6b8d299 # v1.3.5
|
|
||||||
github.com/cloudflare/cfssl 5d63dbd981b5c408effbb58c442d54761ff94fbd # 1.3.2
|
|
||||||
github.com/fernet/fernet-go 9eac43b88a5efb8651d24de9b68e87567e029736
|
|
||||||
github.com/google/certificate-transparency-go 37a384cd035e722ea46e55029093e26687138edf # v1.0.20
|
|
||||||
golang.org/x/crypto 0c34fe9e7dc2486962ef9867e3edb3503537209f
|
|
||||||
golang.org/x/time 3af7569d3a1e776fc2a3c1cec133b43105ea9c2e
|
|
||||||
github.com/hashicorp/go-memdb cb9a474f84cc5e41b273b20c6927680b2a8776ad
|
|
||||||
github.com/hashicorp/go-immutable-radix 826af9ccf0feeee615d546d69b11f8e98da8c8f1 git://github.com/tonistiigi/go-immutable-radix.git
|
|
||||||
github.com/hashicorp/golang-lru 7f827b33c0f158ec5dfbba01bb0b14a4541fd81d # v0.5.3
|
|
||||||
github.com/coreos/pkg 97fdf19511ea361ae1c100dd393cc47f8dcfa1e1 # v4
|
|
||||||
code.cloudfoundry.org/clock 02e53af36e6c978af692887ed449b74026d76fec # v1.0.0
|
|
||||||
|
|
||||||
# prometheus
|
|
||||||
github.com/prometheus/client_golang 6edbbd9e560190e318cdc5b4d3e630b442858380 # v1.6.0
|
|
||||||
github.com/beorn7/perks 37c8de3658fcb183f997c4e13e8337516ab753e6 # v1.0.1
|
|
||||||
github.com/prometheus/client_model 7bc5445566f0fe75b15de23e6b93886e982d7bf9 # v0.2.0
|
|
||||||
github.com/prometheus/common d978bcb1309602d68bb4ba69cf3f8ed900e07308 # v0.9.1
|
|
||||||
github.com/prometheus/procfs 46159f73e74d1cb8dc223deef9b2d049286f46b1 # v0.0.11
|
|
||||||
github.com/matttproud/golang_protobuf_extensions c12348ce28de40eed0136aa2b644d0ee0650e56c # v1.0.1
|
|
||||||
github.com/pkg/errors 614d223910a179a466c1767a985424175c39b465 # v0.9.1
|
|
||||||
github.com/grpc-ecosystem/go-grpc-prometheus c225b8c3b01faf2899099b768856a9e916e5087b # v1.2.0
|
|
||||||
github.com/cespare/xxhash/v2 d7df74196a9e781ede915320c11c378c1b2f3a1f # v2.1.1
|
|
||||||
|
|
||||||
# cli
|
|
||||||
github.com/spf13/cobra 8380ddd3132bdf8fd77731725b550c181dda0aa8 # v1.1.3
|
|
||||||
github.com/spf13/pflag 2e9d26c8c37aae03e3f9d4e90b7116f5accb7cab # v1.0.5
|
|
||||||
github.com/inconshreveable/mousetrap 76626ae9c91c4f2a10f34cad8ce83ea42c93bb75 # v1.0.0
|
|
||||||
github.com/morikuni/aec 39771216ff4c63d11f5e604076f9c45e8be1067b # v1.0.0
|
|
||||||
|
|
||||||
# metrics
|
|
||||||
github.com/docker/go-metrics b619b3592b65de4f087d9f16863a7e6ff905973c # v0.0.1
|
|
||||||
|
|
||||||
github.com/opencontainers/selinux 76bc82e11d854d3e40c08889d13c98abcea72ea2 # v1.8.2
|
|
||||||
github.com/bits-and-blooms/bitset 59de210119f50cedaa42d175dc88b6335fcf63f6 # v1.2.0
|
|
||||||
|
|
||||||
|
|
||||||
# archive/tar
|
|
||||||
# rm -rf vendor/archive
|
|
||||||
# mkdir -p ./vendor/archive
|
|
||||||
# git clone -b go$GOLANG_VERSION --depth=1 git://github.com/golang/go.git ./go
|
|
||||||
# git --git-dir ./go/.git --work-tree ./go am ../patches/0001-archive-tar-do-not-populate-user-group-names.patch
|
|
||||||
# cp -a go/src/archive/tar ./vendor/archive/tar
|
|
||||||
# rm -rf ./go
|
|
||||||
# vndr -whitelist=^archive/tar
|
|
||||||
|
|
||||||
# DO NOT EDIT BELOW THIS LINE -------- reserved for downstream projects --------
|
|
|
@ -1,13 +0,0 @@
|
||||||
[![GoDoc](https://godoc.org/github.com/docker/go-connections?status.svg)](https://godoc.org/github.com/docker/go-connections)
|
|
||||||
|
|
||||||
# Introduction
|
|
||||||
|
|
||||||
go-connections provides common package to work with network connections.
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
See the [docs in godoc](https://godoc.org/github.com/docker/go-connections) for examples and documentation.
|
|
||||||
|
|
||||||
## License
|
|
||||||
|
|
||||||
go-connections is licensed under the Apache License, Version 2.0. See [LICENSE](LICENSE) for the full license text.
|
|
|
@ -0,0 +1,24 @@
|
||||||
|
# Compiled Object files, Static and Dynamic libs (Shared Objects)
|
||||||
|
*.o
|
||||||
|
*.a
|
||||||
|
*.so
|
||||||
|
|
||||||
|
# Folders
|
||||||
|
_obj
|
||||||
|
_test
|
||||||
|
|
||||||
|
# Architecture specific extensions/prefixes
|
||||||
|
*.[568vq]
|
||||||
|
[568vq].out
|
||||||
|
|
||||||
|
*.cgo1.go
|
||||||
|
*.cgo2.c
|
||||||
|
_cgo_defun.c
|
||||||
|
_cgo_gotypes.go
|
||||||
|
_cgo_export.*
|
||||||
|
|
||||||
|
_testmain.go
|
||||||
|
|
||||||
|
*.exe
|
||||||
|
*.test
|
||||||
|
*.prof
|
|
@ -0,0 +1,70 @@
|
||||||
|
# Contributing to Docker open source projects
|
||||||
|
|
||||||
|
Want to hack on go-events? Awesome! Here are instructions to get you started.
|
||||||
|
|
||||||
|
go-events is part of the [Docker](https://www.docker.com) project, and
|
||||||
|
follows the same rules and principles. If you're already familiar with the way
|
||||||
|
Docker does things, you'll feel right at home.
|
||||||
|
|
||||||
|
Otherwise, go read Docker's
|
||||||
|
[contributions guidelines](https://github.com/docker/docker/blob/master/CONTRIBUTING.md),
|
||||||
|
[issue triaging](https://github.com/docker/docker/blob/master/project/ISSUE-TRIAGE.md),
|
||||||
|
[review process](https://github.com/docker/docker/blob/master/project/REVIEWING.md) and
|
||||||
|
[branches and tags](https://github.com/docker/docker/blob/master/project/BRANCHES-AND-TAGS.md).
|
||||||
|
|
||||||
|
For an in-depth description of our contribution process, visit the
|
||||||
|
contributors guide: [Understand how to contribute](https://docs.docker.com/opensource/workflow/make-a-contribution/)
|
||||||
|
|
||||||
|
### Sign your work
|
||||||
|
|
||||||
|
The sign-off is a simple line at the end of the explanation for the patch. Your
|
||||||
|
signature certifies that you wrote the patch or otherwise have the right to pass
|
||||||
|
it on as an open-source patch. The rules are pretty simple: if you can certify
|
||||||
|
the below (from [developercertificate.org](http://developercertificate.org/)):
|
||||||
|
|
||||||
|
```
|
||||||
|
Developer Certificate of Origin
|
||||||
|
Version 1.1
|
||||||
|
|
||||||
|
Copyright (C) 2004, 2006 The Linux Foundation and its contributors.
|
||||||
|
660 York Street, Suite 102,
|
||||||
|
San Francisco, CA 94110 USA
|
||||||
|
|
||||||
|
Everyone is permitted to copy and distribute verbatim copies of this
|
||||||
|
license document, but changing it is not allowed.
|
||||||
|
|
||||||
|
Developer's Certificate of Origin 1.1
|
||||||
|
|
||||||
|
By making a contribution to this project, I certify that:
|
||||||
|
|
||||||
|
(a) The contribution was created in whole or in part by me and I
|
||||||
|
have the right to submit it under the open source license
|
||||||
|
indicated in the file; or
|
||||||
|
|
||||||
|
(b) The contribution is based upon previous work that, to the best
|
||||||
|
of my knowledge, is covered under an appropriate open source
|
||||||
|
license and I have the right under that license to submit that
|
||||||
|
work with modifications, whether created in whole or in part
|
||||||
|
by me, under the same open source license (unless I am
|
||||||
|
permitted to submit under a different license), as indicated
|
||||||
|
in the file; or
|
||||||
|
|
||||||
|
(c) The contribution was provided directly to me by some other
|
||||||
|
person who certified (a), (b) or (c) and I have not modified
|
||||||
|
it.
|
||||||
|
|
||||||
|
(d) I understand and agree that this project and the contribution
|
||||||
|
are public and that a record of the contribution (including all
|
||||||
|
personal information I submit with it, including my sign-off) is
|
||||||
|
maintained indefinitely and may be redistributed consistent with
|
||||||
|
this project or the open source license(s) involved.
|
||||||
|
```
|
||||||
|
|
||||||
|
Then you just add a line to every git commit message:
|
||||||
|
|
||||||
|
Signed-off-by: Joe Smith <joe.smith@email.com>
|
||||||
|
|
||||||
|
Use your real name (sorry, no pseudonyms or anonymous contributions.)
|
||||||
|
|
||||||
|
If you set your `user.name` and `user.email` git configs, you can sign your
|
||||||
|
commit automatically with `git commit -s`.
|
|
@ -0,0 +1,46 @@
|
||||||
|
# go-events maintainers file
|
||||||
|
#
|
||||||
|
# This file describes who runs the docker/go-events project and how.
|
||||||
|
# This is a living document - if you see something out of date or missing, speak up!
|
||||||
|
#
|
||||||
|
# It is structured to be consumable by both humans and programs.
|
||||||
|
# To extract its contents programmatically, use any TOML-compliant parser.
|
||||||
|
#
|
||||||
|
# This file is compiled into the MAINTAINERS file in docker/opensource.
|
||||||
|
#
|
||||||
|
[Org]
|
||||||
|
[Org."Core maintainers"]
|
||||||
|
people = [
|
||||||
|
"aaronlehmann",
|
||||||
|
"aluzzardi",
|
||||||
|
"lk4d4",
|
||||||
|
"stevvooe",
|
||||||
|
]
|
||||||
|
|
||||||
|
[people]
|
||||||
|
|
||||||
|
# A reference list of all people associated with the project.
|
||||||
|
# All other sections should refer to people by their canonical key
|
||||||
|
# in the people section.
|
||||||
|
|
||||||
|
# ADD YOURSELF HERE IN ALPHABETICAL ORDER
|
||||||
|
|
||||||
|
[people.aaronlehmann]
|
||||||
|
Name = "Aaron Lehmann"
|
||||||
|
Email = "aaron.lehmann@docker.com"
|
||||||
|
GitHub = "aaronlehmann"
|
||||||
|
|
||||||
|
[people.aluzzardi]
|
||||||
|
Name = "Andrea Luzzardi"
|
||||||
|
Email = "al@docker.com"
|
||||||
|
GitHub = "aluzzardi"
|
||||||
|
|
||||||
|
[people.lk4d4]
|
||||||
|
Name = "Alexander Morozov"
|
||||||
|
Email = "lk4d4@docker.com"
|
||||||
|
GitHub = "lk4d4"
|
||||||
|
|
||||||
|
[people.stevvooe]
|
||||||
|
Name = "Stephen Day"
|
||||||
|
Email = "stephen.day@docker.com"
|
||||||
|
GitHub = "stevvooe"
|
|
@ -0,0 +1,55 @@
|
||||||
|
# Contributing
|
||||||
|
|
||||||
|
## Sign your work
|
||||||
|
|
||||||
|
The sign-off is a simple line at the end of the explanation for the patch. Your
|
||||||
|
signature certifies that you wrote the patch or otherwise have the right to pass
|
||||||
|
it on as an open-source patch. The rules are pretty simple: if you can certify
|
||||||
|
the below (from [developercertificate.org](http://developercertificate.org/)):
|
||||||
|
|
||||||
|
```
|
||||||
|
Developer Certificate of Origin
|
||||||
|
Version 1.1
|
||||||
|
|
||||||
|
Copyright (C) 2004, 2006 The Linux Foundation and its contributors.
|
||||||
|
660 York Street, Suite 102,
|
||||||
|
San Francisco, CA 94110 USA
|
||||||
|
|
||||||
|
Everyone is permitted to copy and distribute verbatim copies of this
|
||||||
|
license document, but changing it is not allowed.
|
||||||
|
|
||||||
|
Developer's Certificate of Origin 1.1
|
||||||
|
|
||||||
|
By making a contribution to this project, I certify that:
|
||||||
|
|
||||||
|
(a) The contribution was created in whole or in part by me and I
|
||||||
|
have the right to submit it under the open source license
|
||||||
|
indicated in the file; or
|
||||||
|
|
||||||
|
(b) The contribution is based upon previous work that, to the best
|
||||||
|
of my knowledge, is covered under an appropriate open source
|
||||||
|
license and I have the right under that license to submit that
|
||||||
|
work with modifications, whether created in whole or in part
|
||||||
|
by me, under the same open source license (unless I am
|
||||||
|
permitted to submit under a different license), as indicated
|
||||||
|
in the file; or
|
||||||
|
|
||||||
|
(c) The contribution was provided directly to me by some other
|
||||||
|
person who certified (a), (b) or (c) and I have not modified
|
||||||
|
it.
|
||||||
|
|
||||||
|
(d) I understand and agree that this project and the contribution
|
||||||
|
are public and that a record of the contribution (including all
|
||||||
|
personal information I submit with it, including my sign-off) is
|
||||||
|
maintained indefinitely and may be redistributed consistent with
|
||||||
|
this project or the open source license(s) involved.
|
||||||
|
```
|
||||||
|
|
||||||
|
Then you just add a line to every git commit message:
|
||||||
|
|
||||||
|
Signed-off-by: Joe Smith <joe.smith@email.com>
|
||||||
|
|
||||||
|
Use your real name (sorry, no pseudonyms or anonymous contributions.)
|
||||||
|
|
||||||
|
If you set your `user.name` and `user.email` git configs, you can sign your
|
||||||
|
commit automatically with `git commit -s`.
|
|
@ -0,0 +1,67 @@
|
||||||
|
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
|
||||||
|
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
|
||||||
|
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
|
||||||
|
github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
|
||||||
|
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
|
||||||
|
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
|
||||||
|
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
|
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
|
github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
|
||||||
|
github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
|
||||||
|
github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
|
||||||
|
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
|
||||||
|
github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
|
||||||
|
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||||
|
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||||
|
github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs=
|
||||||
|
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||||
|
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
||||||
|
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
|
||||||
|
github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
|
||||||
|
github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
|
||||||
|
github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
|
||||||
|
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
||||||
|
github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
|
||||||
|
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/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
|
||||||
|
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
|
||||||
|
github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
|
||||||
|
github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
|
||||||
|
github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
|
||||||
|
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||||
|
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||||
|
github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
|
||||||
|
github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=
|
||||||
|
github.com/prometheus/client_golang v1.1.0 h1:BQ53HtBmfOitExawJ6LokA4x8ov/z0SYYb0+HxJfRI8=
|
||||||
|
github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g=
|
||||||
|
github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
|
||||||
|
github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90 h1:S/YWwWx/RA8rT8tKFRuGUZhuA90OyIBpPCXkcbwU8DE=
|
||||||
|
github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
||||||
|
github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
|
||||||
|
github.com/prometheus/common v0.6.0 h1:kRhiuYSXR3+uv2IbVbZhUxK5zVD/2pp3Gd2PpvPkpEo=
|
||||||
|
github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc=
|
||||||
|
github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
|
||||||
|
github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
|
||||||
|
github.com/prometheus/procfs v0.0.3 h1:CTwfnzjQ+8dS6MhHHu4YswVAD99sL2wjPqP+VkURmKE=
|
||||||
|
github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ=
|
||||||
|
github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
|
||||||
|
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/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
|
||||||
|
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
||||||
|
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
||||||
|
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||||
|
golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
|
golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
|
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/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
|
golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/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-20190801041406-cbf593c0f2f3 h1:4y9KwBHBgBNwDbtu44R5o1fdOCQUEXhbk/P4A9WmJq0=
|
||||||
|
golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
|
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
|
||||||
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
|
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
|
@ -0,0 +1,67 @@
|
||||||
|
# Contributing to go-units
|
||||||
|
|
||||||
|
Want to hack on go-units? Awesome! Here are instructions to get you started.
|
||||||
|
|
||||||
|
go-units is a part of the [Docker](https://www.docker.com) project, and follows
|
||||||
|
the same rules and principles. If you're already familiar with the way
|
||||||
|
Docker does things, you'll feel right at home.
|
||||||
|
|
||||||
|
Otherwise, go read Docker's
|
||||||
|
[contributions guidelines](https://github.com/docker/docker/blob/master/CONTRIBUTING.md),
|
||||||
|
[issue triaging](https://github.com/docker/docker/blob/master/project/ISSUE-TRIAGE.md),
|
||||||
|
[review process](https://github.com/docker/docker/blob/master/project/REVIEWING.md) and
|
||||||
|
[branches and tags](https://github.com/docker/docker/blob/master/project/BRANCHES-AND-TAGS.md).
|
||||||
|
|
||||||
|
### Sign your work
|
||||||
|
|
||||||
|
The sign-off is a simple line at the end of the explanation for the patch. Your
|
||||||
|
signature certifies that you wrote the patch or otherwise have the right to pass
|
||||||
|
it on as an open-source patch. The rules are pretty simple: if you can certify
|
||||||
|
the below (from [developercertificate.org](http://developercertificate.org/)):
|
||||||
|
|
||||||
|
```
|
||||||
|
Developer Certificate of Origin
|
||||||
|
Version 1.1
|
||||||
|
|
||||||
|
Copyright (C) 2004, 2006 The Linux Foundation and its contributors.
|
||||||
|
660 York Street, Suite 102,
|
||||||
|
San Francisco, CA 94110 USA
|
||||||
|
|
||||||
|
Everyone is permitted to copy and distribute verbatim copies of this
|
||||||
|
license document, but changing it is not allowed.
|
||||||
|
|
||||||
|
Developer's Certificate of Origin 1.1
|
||||||
|
|
||||||
|
By making a contribution to this project, I certify that:
|
||||||
|
|
||||||
|
(a) The contribution was created in whole or in part by me and I
|
||||||
|
have the right to submit it under the open source license
|
||||||
|
indicated in the file; or
|
||||||
|
|
||||||
|
(b) The contribution is based upon previous work that, to the best
|
||||||
|
of my knowledge, is covered under an appropriate open source
|
||||||
|
license and I have the right under that license to submit that
|
||||||
|
work with modifications, whether created in whole or in part
|
||||||
|
by me, under the same open source license (unless I am
|
||||||
|
permitted to submit under a different license), as indicated
|
||||||
|
in the file; or
|
||||||
|
|
||||||
|
(c) The contribution was provided directly to me by some other
|
||||||
|
person who certified (a), (b) or (c) and I have not modified
|
||||||
|
it.
|
||||||
|
|
||||||
|
(d) I understand and agree that this project and the contribution
|
||||||
|
are public and that a record of the contribution (including all
|
||||||
|
personal information I submit with it, including my sign-off) is
|
||||||
|
maintained indefinitely and may be redistributed consistent with
|
||||||
|
this project or the open source license(s) involved.
|
||||||
|
```
|
||||||
|
|
||||||
|
Then you just add a line to every git commit message:
|
||||||
|
|
||||||
|
Signed-off-by: Joe Smith <joe.smith@email.com>
|
||||||
|
|
||||||
|
Use your real name (sorry, no pseudonyms or anonymous contributions.)
|
||||||
|
|
||||||
|
If you set your `user.name` and `user.email` git configs, you can sign your
|
||||||
|
commit automatically with `git commit -s`.
|
|
@ -0,0 +1,46 @@
|
||||||
|
# go-units maintainers file
|
||||||
|
#
|
||||||
|
# This file describes who runs the docker/go-units project and how.
|
||||||
|
# This is a living document - if you see something out of date or missing, speak up!
|
||||||
|
#
|
||||||
|
# It is structured to be consumable by both humans and programs.
|
||||||
|
# To extract its contents programmatically, use any TOML-compliant parser.
|
||||||
|
#
|
||||||
|
# This file is compiled into the MAINTAINERS file in docker/opensource.
|
||||||
|
#
|
||||||
|
[Org]
|
||||||
|
[Org."Core maintainers"]
|
||||||
|
people = [
|
||||||
|
"akihirosuda",
|
||||||
|
"dnephin",
|
||||||
|
"thajeztah",
|
||||||
|
"vdemeester",
|
||||||
|
]
|
||||||
|
|
||||||
|
[people]
|
||||||
|
|
||||||
|
# A reference list of all people associated with the project.
|
||||||
|
# All other sections should refer to people by their canonical key
|
||||||
|
# in the people section.
|
||||||
|
|
||||||
|
# ADD YOURSELF HERE IN ALPHABETICAL ORDER
|
||||||
|
|
||||||
|
[people.akihirosuda]
|
||||||
|
Name = "Akihiro Suda"
|
||||||
|
Email = "akihiro.suda.cz@hco.ntt.co.jp"
|
||||||
|
GitHub = "AkihiroSuda"
|
||||||
|
|
||||||
|
[people.dnephin]
|
||||||
|
Name = "Daniel Nephin"
|
||||||
|
Email = "dnephin@gmail.com"
|
||||||
|
GitHub = "dnephin"
|
||||||
|
|
||||||
|
[people.thajeztah]
|
||||||
|
Name = "Sebastiaan van Stijn"
|
||||||
|
Email = "github@gone.nl"
|
||||||
|
GitHub = "thaJeztah"
|
||||||
|
|
||||||
|
[people.vdemeester]
|
||||||
|
Name = "Vincent Demeester"
|
||||||
|
Email = "vincent@sbr.pm"
|
||||||
|
GitHub = "vdemeester"
|
|
@ -0,0 +1,11 @@
|
||||||
|
dependencies:
|
||||||
|
post:
|
||||||
|
# install golint
|
||||||
|
- go get golang.org/x/lint/golint
|
||||||
|
|
||||||
|
test:
|
||||||
|
pre:
|
||||||
|
# run analysis before tests
|
||||||
|
- go vet ./...
|
||||||
|
- test -z "$(golint ./... | tee /dev/stderr)"
|
||||||
|
- test -z "$(gofmt -s -l . | tee /dev/stderr)"
|
|
@ -1,16 +0,0 @@
|
||||||
[![Circle CI](https://circleci.com/gh/docker/go.svg?style=svg)](https://circleci.com/gh/docker/go)
|
|
||||||
|
|
||||||
This is a repository used for building go packages based off upstream with
|
|
||||||
small patches.
|
|
||||||
|
|
||||||
It is only used so far for a canonical json pkg.
|
|
||||||
|
|
||||||
I hope we do not need to use it for anything else in the future.
|
|
||||||
|
|
||||||
**To update:**
|
|
||||||
|
|
||||||
```console
|
|
||||||
$ make update
|
|
||||||
```
|
|
||||||
|
|
||||||
This will nuke the current package, clone upstream and apply the patch.
|
|
|
@ -1,334 +0,0 @@
|
||||||
# [SwarmKit](https://github.com/docker/swarmkit)
|
|
||||||
|
|
||||||
[![GoDoc](https://godoc.org/github.com/docker/swarmkit?status.svg)](https://godoc.org/github.com/docker/swarmkit)
|
|
||||||
[![Circle CI](https://circleci.com/gh/docker/swarmkit.svg?style=shield&circle-token=a7bf494e28963703a59de71cf19b73ad546058a7)](https://circleci.com/gh/docker/swarmkit)
|
|
||||||
[![codecov.io](https://codecov.io/github/docker/swarmkit/coverage.svg?branch=master&token=LqD1dzTjsN)](https://codecov.io/github/docker/swarmkit?branch=master)
|
|
||||||
[![Badge Badge](http://doyouevenbadge.com/github.com/docker/swarmkit)](http://doyouevenbadge.com/report/github.com/docker/swarmkit)
|
|
||||||
|
|
||||||
*SwarmKit* is a toolkit for orchestrating distributed systems at any scale. It includes primitives for node discovery, raft-based consensus, task scheduling and more.
|
|
||||||
|
|
||||||
Its main benefits are:
|
|
||||||
|
|
||||||
- **Distributed**: *SwarmKit* uses the [Raft Consensus Algorithm](https://raft.github.io/) in order to coordinate and does not rely on a single point of failure to perform decisions.
|
|
||||||
- **Secure**: Node communication and membership within a *Swarm* are secure out of the box. *SwarmKit* uses mutual TLS for node *authentication*, *role authorization* and *transport encryption*, automating both certificate issuance and rotation.
|
|
||||||
- **Simple**: *SwarmKit* is operationally simple and minimizes infrastructure dependencies. It does not need an external database to operate.
|
|
||||||
|
|
||||||
## Overview
|
|
||||||
|
|
||||||
Machines running *SwarmKit* can be grouped together in order to form a *Swarm*, coordinating tasks with each other.
|
|
||||||
Once a machine joins, it becomes a *Swarm Node*. Nodes can either be *worker* nodes or *manager* nodes.
|
|
||||||
|
|
||||||
- **Worker Nodes** are responsible for running Tasks using an *Executor*. *SwarmKit* comes with a default *Docker Container Executor* that can be easily swapped out.
|
|
||||||
- **Manager Nodes** on the other hand accept specifications from the user and are responsible for reconciling the desired state with the actual cluster state.
|
|
||||||
|
|
||||||
An operator can dynamically update a Node's role by promoting a Worker to Manager or demoting a Manager to Worker.
|
|
||||||
|
|
||||||
*Tasks* are organized in *Services*. A service is a higher level abstraction that allows the user to declare the desired state of a group of tasks.
|
|
||||||
Services define what type of task should be created as well as how to execute them (e.g. run this many replicas at all times) and how to update them (e.g. rolling updates).
|
|
||||||
|
|
||||||
## Features
|
|
||||||
|
|
||||||
Some of *SwarmKit*'s main features are:
|
|
||||||
|
|
||||||
- **Orchestration**
|
|
||||||
|
|
||||||
- **Desired State Reconciliation**: *SwarmKit* constantly compares the desired state against the current cluster state and reconciles the two if necessary. For instance, if a node fails, *SwarmKit* reschedules its tasks onto a different node.
|
|
||||||
|
|
||||||
- **Service Types**: There are different types of services. The project currently ships with two of them out of the box
|
|
||||||
|
|
||||||
- **Replicated Services** are scaled to the desired number of replicas.
|
|
||||||
- **Global Services** run one task on every available node in the cluster.
|
|
||||||
|
|
||||||
- **Configurable Updates**: At any time, you can change the value of one or more fields for a service. After you make the update, *SwarmKit* reconciles the desired state by ensuring all tasks are using the desired settings. By default, it performs a lockstep update - that is, update all tasks at the same time. This can be configured through different knobs:
|
|
||||||
|
|
||||||
- **Parallelism** defines how many updates can be performed at the same time.
|
|
||||||
- **Delay** sets the minimum delay between updates. *SwarmKit* will start by shutting down the previous task, bring up a new one, wait for it to transition to the *RUNNING* state *then* wait for the additional configured delay. Finally, it will move onto other tasks.
|
|
||||||
|
|
||||||
- **Restart Policies**: The orchestration layer monitors tasks and reacts to failures based on the specified policy. The operator can define restart conditions, delays and limits (maximum number of attempts in a given time window). *SwarmKit* can decide to restart a task on a different machine. This means that faulty nodes will gradually be drained of their tasks.
|
|
||||||
|
|
||||||
- **Scheduling**
|
|
||||||
|
|
||||||
- **Resource Awareness**: *SwarmKit* is aware of resources available on nodes and will place tasks accordingly.
|
|
||||||
- **Constraints**: Operators can limit the set of nodes where a task can be scheduled by defining constraint expressions. Multiple constraints find nodes that satisfy every expression, i.e., an `AND` match. Constraints can match node attributes in the following table. Note that `engine.labels` are collected from Docker Engine with information like operating system, drivers, etc. `node.labels` are added by cluster administrators for operational purpose. For example, some nodes have security compliant labels to run tasks with compliant requirements.
|
|
||||||
|
|
||||||
| node attribute | matches | example |
|
|
||||||
|:------------- |:-------------| :-------------|
|
|
||||||
| node.id | node's ID | `node.id == 2ivku8v2gvtg4`|
|
|
||||||
| node.hostname | node's hostname | `node.hostname != node-2`|
|
|
||||||
| node.ip | node's IP address | `node.ip != 172.19.17.0/24`|
|
|
||||||
| node.role | node's manager or worker role | `node.role == manager`|
|
|
||||||
| node.platform.os | node's operating system | `node.platform.os == linux`|
|
|
||||||
| node.platform.arch | node's architecture | `node.platform.arch == x86_64`|
|
|
||||||
| node.labels | node's labels added by cluster admins | `node.labels.security == high`|
|
|
||||||
| engine.labels | Docker Engine's labels | `engine.labels.operatingsystem == ubuntu 14.04`|
|
|
||||||
|
|
||||||
- **Strategies**: The project currently ships with a *spread strategy* which will attempt to schedule tasks on the least loaded
|
|
||||||
nodes, provided they meet the constraints and resource requirements.
|
|
||||||
|
|
||||||
- **Cluster Management**
|
|
||||||
|
|
||||||
- **State Store**: Manager nodes maintain a strongly consistent, replicated (Raft based) and extremely fast (in-memory reads) view of the cluster which allows them to make quick scheduling decisions while tolerating failures.
|
|
||||||
- **Topology Management**: Node roles (*Worker* / *Manager*) can be dynamically changed through API/CLI calls.
|
|
||||||
- **Node Management**: An operator can alter the desired availability of a node: Setting it to *Paused* will prevent any further tasks from being scheduled to it while *Drained* will have the same effect while also re-scheduling its tasks somewhere else (mostly for maintenance scenarios).
|
|
||||||
|
|
||||||
- **Security**
|
|
||||||
|
|
||||||
- **Mutual TLS**: All nodes communicate with each other using mutual *TLS*. Swarm managers act as a *Root Certificate Authority*, issuing certificates to new nodes.
|
|
||||||
- **Token-based Join**: All nodes require a cryptographic token to join the swarm, which defines that node's role. Tokens can be rotated as often as desired without affecting already-joined nodes.
|
|
||||||
- **Certificate Rotation**: TLS Certificates are rotated and reloaded transparently on every node, allowing a user to set how frequently rotation should happen (the current default is 3 months, the minimum is 30 minutes).
|
|
||||||
|
|
||||||
## Build
|
|
||||||
|
|
||||||
Requirements:
|
|
||||||
|
|
||||||
- Go 1.6 or higher
|
|
||||||
- A [working golang](https://golang.org/doc/code.html) environment
|
|
||||||
- [Protobuf 3.x or higher](https://developers.google.com/protocol-buffers/docs/downloads) to regenerate protocol buffer files (e.g. using `make generate`)
|
|
||||||
|
|
||||||
*SwarmKit* is built in Go and leverages a standard project structure to work well with Go tooling.
|
|
||||||
If you are new to Go, please see [BUILDING.md](BUILDING.md) for a more detailed guide.
|
|
||||||
|
|
||||||
Once you have *SwarmKit* checked out in your `$GOPATH`, the `Makefile` can be used for common tasks.
|
|
||||||
|
|
||||||
From the project root directory, run the following to build `swarmd` and `swarmctl`:
|
|
||||||
|
|
||||||
```sh
|
|
||||||
$ make binaries
|
|
||||||
```
|
|
||||||
|
|
||||||
## Test
|
|
||||||
|
|
||||||
Before running tests for the first time, setup the tooling:
|
|
||||||
|
|
||||||
```sh
|
|
||||||
$ make setup
|
|
||||||
```
|
|
||||||
|
|
||||||
Then run:
|
|
||||||
|
|
||||||
```sh
|
|
||||||
$ make all
|
|
||||||
```
|
|
||||||
|
|
||||||
## Usage Examples
|
|
||||||
|
|
||||||
### Setting up a Swarm
|
|
||||||
|
|
||||||
These instructions assume that `swarmd` and `swarmctl` are in your PATH.
|
|
||||||
|
|
||||||
(Before starting, make sure `/tmp/node-N` don't exist)
|
|
||||||
|
|
||||||
Initialize the first node:
|
|
||||||
|
|
||||||
```sh
|
|
||||||
$ swarmd -d /tmp/node-1 --listen-control-api /tmp/node-1/swarm.sock --hostname node-1
|
|
||||||
```
|
|
||||||
|
|
||||||
Before joining cluster, the token should be fetched:
|
|
||||||
|
|
||||||
```
|
|
||||||
$ export SWARM_SOCKET=/tmp/node-1/swarm.sock
|
|
||||||
$ swarmctl cluster inspect default
|
|
||||||
ID : 87d2ecpg12dfonxp3g562fru1
|
|
||||||
Name : default
|
|
||||||
Orchestration settings:
|
|
||||||
Task history entries: 5
|
|
||||||
Dispatcher settings:
|
|
||||||
Dispatcher heartbeat period: 5s
|
|
||||||
Certificate Authority settings:
|
|
||||||
Certificate Validity Duration: 2160h0m0s
|
|
||||||
Join Tokens:
|
|
||||||
Worker: SWMTKN-1-3vi7ajem0jed8guusgvyl98nfg18ibg4pclify6wzac6ucrhg3-0117z3s2ytr6egmmnlr6gd37n
|
|
||||||
Manager: SWMTKN-1-3vi7ajem0jed8guusgvyl98nfg18ibg4pclify6wzac6ucrhg3-d1ohk84br3ph0njyexw0wdagx
|
|
||||||
```
|
|
||||||
|
|
||||||
In two additional terminals, join two nodes. From the example below, replace `127.0.0.1:4242`
|
|
||||||
with the address of the first node, and use the `<Worker Token>` acquired above.
|
|
||||||
In this example, the `<Worker Token>` is `SWMTKN-1-3vi7ajem0jed8guusgvyl98nfg18ibg4pclify6wzac6ucrhg3-0117z3s2ytr6egmmnlr6gd37n`.
|
|
||||||
If the joining nodes run on the same host as `node-1`, select a different remote
|
|
||||||
listening port, e.g., `--listen-remote-api 127.0.0.1:4343`.
|
|
||||||
|
|
||||||
```sh
|
|
||||||
$ swarmd -d /tmp/node-2 --hostname node-2 --join-addr 127.0.0.1:4242 --join-token <Worker Token>
|
|
||||||
$ swarmd -d /tmp/node-3 --hostname node-3 --join-addr 127.0.0.1:4242 --join-token <Worker Token>
|
|
||||||
```
|
|
||||||
|
|
||||||
If joining as a manager, also specify the listen-control-api.
|
|
||||||
|
|
||||||
```sh
|
|
||||||
$ swarmd -d /tmp/node-4 --hostname node-4 --join-addr 127.0.0.1:4242 --join-token <Manager Token> --listen-control-api /tmp/node-4/swarm.sock --listen-remote-api 127.0.0.1:4245
|
|
||||||
```
|
|
||||||
|
|
||||||
In a fourth terminal, use `swarmctl` to explore and control the cluster. Before
|
|
||||||
running `swarmctl`, set the `SWARM_SOCKET` environment variable to the path of the
|
|
||||||
manager socket that was specified in `--listen-control-api` when starting the
|
|
||||||
manager.
|
|
||||||
|
|
||||||
To list nodes:
|
|
||||||
|
|
||||||
```
|
|
||||||
$ export SWARM_SOCKET=/tmp/node-1/swarm.sock
|
|
||||||
$ swarmctl node ls
|
|
||||||
ID Name Membership Status Availability Manager Status
|
|
||||||
-- ---- ---------- ------ ------------ --------------
|
|
||||||
3x12fpoi36eujbdkgdnbvbi6r node-2 ACCEPTED READY ACTIVE
|
|
||||||
4spl3tyipofoa2iwqgabsdcve node-1 ACCEPTED READY ACTIVE REACHABLE *
|
|
||||||
dknwk1uqxhnyyujq66ho0h54t node-3 ACCEPTED READY ACTIVE
|
|
||||||
zw3rwfawdasdewfq66ho34eaw node-4 ACCEPTED READY ACTIVE REACHABLE
|
|
||||||
|
|
||||||
|
|
||||||
```
|
|
||||||
|
|
||||||
### Creating Services
|
|
||||||
|
|
||||||
Start a *redis* service:
|
|
||||||
|
|
||||||
```
|
|
||||||
$ swarmctl service create --name redis --image redis:3.0.5
|
|
||||||
08ecg7vc7cbf9k57qs722n2le
|
|
||||||
```
|
|
||||||
|
|
||||||
List the running services:
|
|
||||||
|
|
||||||
```
|
|
||||||
$ swarmctl service ls
|
|
||||||
ID Name Image Replicas
|
|
||||||
-- ---- ----- --------
|
|
||||||
08ecg7vc7cbf9k57qs722n2le redis redis:3.0.5 1/1
|
|
||||||
```
|
|
||||||
|
|
||||||
Inspect the service:
|
|
||||||
|
|
||||||
```
|
|
||||||
$ swarmctl service inspect redis
|
|
||||||
ID : 08ecg7vc7cbf9k57qs722n2le
|
|
||||||
Name : redis
|
|
||||||
Replicas : 1/1
|
|
||||||
Template
|
|
||||||
Container
|
|
||||||
Image : redis:3.0.5
|
|
||||||
|
|
||||||
Task ID Service Slot Image Desired State Last State Node
|
|
||||||
------- ------- ---- ----- ------------- ---------- ----
|
|
||||||
0xk1ir8wr85lbs8sqg0ug03vr redis 1 redis:3.0.5 RUNNING RUNNING 1 minutes ago node-1
|
|
||||||
```
|
|
||||||
|
|
||||||
### Updating Services
|
|
||||||
|
|
||||||
You can update any attribute of a service.
|
|
||||||
|
|
||||||
For example, you can scale the service by changing the instance count:
|
|
||||||
|
|
||||||
```
|
|
||||||
$ swarmctl service update redis --replicas 6
|
|
||||||
08ecg7vc7cbf9k57qs722n2le
|
|
||||||
|
|
||||||
$ swarmctl service inspect redis
|
|
||||||
ID : 08ecg7vc7cbf9k57qs722n2le
|
|
||||||
Name : redis
|
|
||||||
Replicas : 6/6
|
|
||||||
Template
|
|
||||||
Container
|
|
||||||
Image : redis:3.0.5
|
|
||||||
|
|
||||||
Task ID Service Slot Image Desired State Last State Node
|
|
||||||
------- ------- ---- ----- ------------- ---------- ----
|
|
||||||
0xk1ir8wr85lbs8sqg0ug03vr redis 1 redis:3.0.5 RUNNING RUNNING 3 minutes ago node-1
|
|
||||||
25m48y9fevrnh77til1d09vqq redis 2 redis:3.0.5 RUNNING RUNNING 28 seconds ago node-3
|
|
||||||
42vwc8z93c884anjgpkiatnx6 redis 3 redis:3.0.5 RUNNING RUNNING 28 seconds ago node-2
|
|
||||||
d41f3wnf9dex3mk6jfqp4tdjw redis 4 redis:3.0.5 RUNNING RUNNING 28 seconds ago node-2
|
|
||||||
66lefnooz63met6yfrsk6myvg redis 5 redis:3.0.5 RUNNING RUNNING 28 seconds ago node-1
|
|
||||||
3a2sawtoyk19wqhmtuiq7z9pt redis 6 redis:3.0.5 RUNNING RUNNING 28 seconds ago node-3
|
|
||||||
```
|
|
||||||
|
|
||||||
Changing *replicas* from *1* to *6* forced *SwarmKit* to create *5* additional Tasks in order to
|
|
||||||
comply with the desired state.
|
|
||||||
|
|
||||||
Every other field can be changed as well, such as image, args, env, ...
|
|
||||||
|
|
||||||
Let's change the image from *redis:3.0.5* to *redis:3.0.6* (e.g. upgrade):
|
|
||||||
|
|
||||||
```
|
|
||||||
$ swarmctl service update redis --image redis:3.0.6
|
|
||||||
08ecg7vc7cbf9k57qs722n2le
|
|
||||||
|
|
||||||
$ swarmctl service inspect redis
|
|
||||||
ID : 08ecg7vc7cbf9k57qs722n2le
|
|
||||||
Name : redis
|
|
||||||
Replicas : 6/6
|
|
||||||
Update Status
|
|
||||||
State : COMPLETED
|
|
||||||
Started : 3 minutes ago
|
|
||||||
Completed : 1 minute ago
|
|
||||||
Message : update completed
|
|
||||||
Template
|
|
||||||
Container
|
|
||||||
Image : redis:3.0.6
|
|
||||||
|
|
||||||
Task ID Service Slot Image Desired State Last State Node
|
|
||||||
------- ------- ---- ----- ------------- ---------- ----
|
|
||||||
0udsjss61lmwz52pke5hd107g redis 1 redis:3.0.6 RUNNING RUNNING 1 minute ago node-3
|
|
||||||
b8o394v840thk10tamfqlwztb redis 2 redis:3.0.6 RUNNING RUNNING 1 minute ago node-1
|
|
||||||
efw7j66xqpoj3cn3zjkdrwff7 redis 3 redis:3.0.6 RUNNING RUNNING 1 minute ago node-3
|
|
||||||
8ajeipzvxucs3776e4z8gemey redis 4 redis:3.0.6 RUNNING RUNNING 1 minute ago node-2
|
|
||||||
f05f2lbqzk9fh4kstwpulygvu redis 5 redis:3.0.6 RUNNING RUNNING 1 minute ago node-2
|
|
||||||
7sbpoy82deq7hu3q9cnucfin6 redis 6 redis:3.0.6 RUNNING RUNNING 1 minute ago node-1
|
|
||||||
```
|
|
||||||
|
|
||||||
By default, all tasks are updated at the same time.
|
|
||||||
|
|
||||||
This behavior can be changed by defining update options.
|
|
||||||
|
|
||||||
For instance, in order to update tasks 2 at a time and wait at least 10 seconds between updates:
|
|
||||||
|
|
||||||
```
|
|
||||||
$ swarmctl service update redis --image redis:3.0.7 --update-parallelism 2 --update-delay 10s
|
|
||||||
$ watch -n1 "swarmctl service inspect redis" # watch the update
|
|
||||||
```
|
|
||||||
|
|
||||||
This will update 2 tasks, wait for them to become *RUNNING*, then wait an additional 10 seconds before moving to other tasks.
|
|
||||||
|
|
||||||
Update options can be set at service creation and updated later on. If an update command doesn't specify update options, the last set of options will be used.
|
|
||||||
|
|
||||||
### Node Management
|
|
||||||
|
|
||||||
*SwarmKit* monitors node health. In the case of node failures, it re-schedules tasks to other nodes.
|
|
||||||
|
|
||||||
An operator can manually define the *Availability* of a node and can *Pause* and *Drain* nodes.
|
|
||||||
|
|
||||||
Let's put `node-1` into maintenance mode:
|
|
||||||
|
|
||||||
```
|
|
||||||
$ swarmctl node drain node-1
|
|
||||||
|
|
||||||
$ swarmctl node ls
|
|
||||||
ID Name Membership Status Availability Manager Status
|
|
||||||
-- ---- ---------- ------ ------------ --------------
|
|
||||||
3x12fpoi36eujbdkgdnbvbi6r node-2 ACCEPTED READY ACTIVE
|
|
||||||
4spl3tyipofoa2iwqgabsdcve node-1 ACCEPTED READY DRAIN REACHABLE *
|
|
||||||
dknwk1uqxhnyyujq66ho0h54t node-3 ACCEPTED READY ACTIVE
|
|
||||||
|
|
||||||
$ swarmctl service inspect redis
|
|
||||||
ID : 08ecg7vc7cbf9k57qs722n2le
|
|
||||||
Name : redis
|
|
||||||
Replicas : 6/6
|
|
||||||
Update Status
|
|
||||||
State : COMPLETED
|
|
||||||
Started : 2 minutes ago
|
|
||||||
Completed : 1 minute ago
|
|
||||||
Message : update completed
|
|
||||||
Template
|
|
||||||
Container
|
|
||||||
Image : redis:3.0.7
|
|
||||||
|
|
||||||
Task ID Service Slot Image Desired State Last State Node
|
|
||||||
------- ------- ---- ----- ------------- ---------- ----
|
|
||||||
8uy2fy8dqbwmlvw5iya802tj0 redis 1 redis:3.0.7 RUNNING RUNNING 23 seconds ago node-2
|
|
||||||
7h9lgvidypcr7q1k3lfgohb42 redis 2 redis:3.0.7 RUNNING RUNNING 2 minutes ago node-3
|
|
||||||
ae4dl0chk3gtwm1100t5yeged redis 3 redis:3.0.7 RUNNING RUNNING 23 seconds ago node-3
|
|
||||||
9fz7fxbg0igypstwliyameobs redis 4 redis:3.0.7 RUNNING RUNNING 2 minutes ago node-3
|
|
||||||
drzndxnjz3c8iujdewzaplgr6 redis 5 redis:3.0.7 RUNNING RUNNING 23 seconds ago node-2
|
|
||||||
7rcgciqhs4239quraw7evttyf redis 6 redis:3.0.7 RUNNING RUNNING 2 minutes ago node-2
|
|
||||||
```
|
|
||||||
|
|
||||||
As you can see, every Task running on `node-1` was rebalanced to either `node-2` or `node-3` by the reconciliation loop.
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,79 +0,0 @@
|
||||||
# grpc and protobuf
|
|
||||||
#
|
|
||||||
# NOTE(dperny,cyli): there is some error handling, found in the
|
|
||||||
# (*firstSessionErrorTracker).SessionClosed method in node/node.go, which
|
|
||||||
# relies on string matching to handle x509 errors. between grpc versions 1.3.0
|
|
||||||
# and 1.7.5, the error string we were matching changed, breaking swarmkit.
|
|
||||||
# In 1.10.x, GRPC stopped surfacing those errors entirely, breaking swarmkit.
|
|
||||||
# In >=1.11, those errors were brought back but the string had changed again.
|
|
||||||
# After updating GRPC, if integration test failures occur, verify that the
|
|
||||||
# string matching there is correct.
|
|
||||||
google.golang.org/grpc f495f5b15ae7ccda3b38c53a1bfcde4c1a58a2bc # v1.27.1
|
|
||||||
github.com/gogo/protobuf b03c65ea87cdc3521ede29f62fe3ce239267c1bc # v1.3.2
|
|
||||||
github.com/golang/protobuf 84668698ea25b64748563aa20726db66a6b8d299 # v1.3.5
|
|
||||||
github.com/matttproud/golang_protobuf_extensions c12348ce28de40eed0136aa2b644d0ee0650e56c # v1.0.1
|
|
||||||
google.golang.org/genproto 3f1135a288c9a07e340ae8ba4cc6c7065a3160e8
|
|
||||||
|
|
||||||
# metrics
|
|
||||||
github.com/grpc-ecosystem/go-grpc-prometheus c225b8c3b01faf2899099b768856a9e916e5087b # v1.2.0
|
|
||||||
github.com/docker/go-metrics b619b3592b65de4f087d9f16863a7e6ff905973c # v0.0.1
|
|
||||||
|
|
||||||
# etcd/raft
|
|
||||||
github.com/coreos/etcd 2c834459e1aab78a5d5219c7dfe42335fc4b617a # v3.3.25
|
|
||||||
|
|
||||||
# go-systemd v17 is required by github.com/coreos/pkg/capnslog/journald_formatter.go
|
|
||||||
github.com/coreos/go-systemd 39ca1b05acc7ad1220e09f133283b8859a8b71ab # v17
|
|
||||||
github.com/coreos/pkg 97fdf19511ea361ae1c100dd393cc47f8dcfa1e1 # v4
|
|
||||||
github.com/prometheus/client_golang 6edbbd9e560190e318cdc5b4d3e630b442858380 # v1.6.0
|
|
||||||
github.com/prometheus/client_model 7bc5445566f0fe75b15de23e6b93886e982d7bf9 # v0.2.0
|
|
||||||
github.com/prometheus/common d978bcb1309602d68bb4ba69cf3f8ed900e07308 # v0.9.1
|
|
||||||
github.com/prometheus/procfs 46159f73e74d1cb8dc223deef9b2d049286f46b1 # v0.0.11
|
|
||||||
github.com/cespare/xxhash/v2 d7df74196a9e781ede915320c11c378c1b2f3a1f # v2.1.1
|
|
||||||
|
|
||||||
github.com/docker/distribution 0d3efadf0154c2b8a4e7b6621fff9809655cc580
|
|
||||||
github.com/docker/docker 471fd27709777d2cce3251129887e14e8bb2e0c7 # master / v21.xx-dev
|
|
||||||
github.com/docker/go-connections 7395e3f8aa162843a74ed6d48e79627d9792ac55 # v0.4.0
|
|
||||||
github.com/docker/go-events e31b211e4f1cd09aa76fe4ac244571fab96ae47f
|
|
||||||
github.com/docker/go-units 519db1ee28dcc9fd2474ae59fca29a810482bfb1 # v0.4.0
|
|
||||||
github.com/docker/libkv 458977154600b9f23984d9f4b82e79570b5ae12b
|
|
||||||
github.com/opencontainers/runc b9ee9c6314599f1b4a7f497e1f1f856fe433d3b7 # v1.0.0-rc95
|
|
||||||
github.com/opencontainers/go-digest ea51bea511f75cfa3ef6098cc253c5c3609b037a # v1.0.0
|
|
||||||
github.com/opencontainers/image-spec d60099175f88c47cd379c4738d158884749ed235 # v1.0.1
|
|
||||||
github.com/ishidawataru/sctp f2269e66cdee387bd321445d5d300893449805be
|
|
||||||
github.com/containerd/containerd 36cc874494a56a253cd181a1a685b44b58a2e34a # v1.5.2
|
|
||||||
|
|
||||||
github.com/davecgh/go-spew 8991bc29aa16c548c550c7ff78260e27b9ab7c73 # v1.1.1
|
|
||||||
github.com/Microsoft/go-winio 5b44b70ab3ab4d291a7c1d28afe7b4afeced0ed4 # v0.4.15
|
|
||||||
github.com/sirupsen/logrus 6699a89a232f3db797f2e280639854bbc4b89725 # v1.7.0
|
|
||||||
github.com/beorn7/perks 37c8de3658fcb183f997c4e13e8337516ab753e6 # v1.0.1
|
|
||||||
github.com/cloudflare/cfssl 5d63dbd981b5c408effbb58c442d54761ff94fbd # 1.3.2
|
|
||||||
github.com/dustin/go-humanize 9f541cc9db5d55bce703bd99987c9d5cb8eea45e # v1.0.0
|
|
||||||
github.com/fernet/fernet-go 9eac43b88a5efb8651d24de9b68e87567e029736
|
|
||||||
github.com/google/certificate-transparency-go 37a384cd035e722ea46e55029093e26687138edf # v1.0.20
|
|
||||||
github.com/hashicorp/go-immutable-radix 826af9ccf0feeee615d546d69b11f8e98da8c8f1 git://github.com/tonistiigi/go-immutable-radix.git
|
|
||||||
github.com/hashicorp/go-memdb cb9a474f84cc5e41b273b20c6927680b2a8776ad
|
|
||||||
github.com/hashicorp/golang-lru 7f827b33c0f158ec5dfbba01bb0b14a4541fd81d # v0.5.3
|
|
||||||
github.com/inconshreveable/mousetrap 76626ae9c91c4f2a10f34cad8ce83ea42c93bb75 # v1.0.0
|
|
||||||
github.com/phayes/permbits f7e3ac5e859d0b919c5068d581cc4c5d4f4f9bc5
|
|
||||||
code.cloudfoundry.org/clock 02e53af36e6c978af692887ed449b74026d76fec # v1.0.0
|
|
||||||
github.com/pkg/errors 614d223910a179a466c1767a985424175c39b465 # v0.9.1
|
|
||||||
github.com/pmezard/go-difflib 792786c7400a136282c1664665ae0a8db921c6c2 # v1.0.0
|
|
||||||
github.com/rcrowley/go-metrics 51425a2415d21afadfd55cd93432c0bc69e9598d
|
|
||||||
github.com/spf13/cobra 8380ddd3132bdf8fd77731725b550c181dda0aa8 # v1.1.3
|
|
||||||
github.com/spf13/pflag 2e9d26c8c37aae03e3f9d4e90b7116f5accb7cab # v1.0.5
|
|
||||||
github.com/stretchr/testify ffdc059bfe9ce6a4e144ba849dbedead332c6053 # v1.3.0
|
|
||||||
go.etcd.io/bbolt 232d8fc87f50244f9c808f4745759e08a304c029 # v1.3.5
|
|
||||||
golang.org/x/crypto c1f2f97bffc9c53fc40a1a28a5b460094c0050d9
|
|
||||||
golang.org/x/net 6772e930b67bb09bf22262c7378e7d2f67cf59d1
|
|
||||||
golang.org/x/sys d19ff857e887eacb631721f188c7d365c2331456
|
|
||||||
golang.org/x/text 23ae387dee1f90d29a23c0e87ee0b46038fbed0e # v0.3.3
|
|
||||||
golang.org/x/time 555d28b269f0569763d25dbe1a237ae74c6bcc82
|
|
||||||
|
|
||||||
# ginkgo is used for testing in some places in the code. this is it and its
|
|
||||||
# sub-dependencies.
|
|
||||||
github.com/onsi/ginkgo eea6ad008b96acdaa524f5b409513bf062b500ad # v1.8.0
|
|
||||||
github.com/onsi/gomega 90e289841c1ed79b7a598a7cd9959750cb5e89e2 # v1.5.0
|
|
||||||
gopkg.in/yaml.v2 7649d4548cb53a614db133b2a8ac1f31859dda8c # v2.4.0
|
|
||||||
github.com/hpcloud/tail a30252cb686a21eb2d0b98132633053ec2f7f1e5 # v1.0.0
|
|
||||||
gopkg.in/fsnotify.v1 c2828203cd70a50dcccfb2761f8b1f8ceef9a8e9 # v1.4.7
|
|
||||||
gopkg.in/tomb.v1 dd632973f1e7218eb1089048e0798ec9ae7dceb8 # v1
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue