mirror of
https://github.com/jesseduffield/lazydocker.git
synced 2026-07-25 08:31:03 +00:00
Merge 1c9dca459a into 7e7aadc207
This commit is contained in:
commit
70d09cbc26
469 changed files with 36307 additions and 11495 deletions
29
go.mod
29
go.mod
|
|
@ -1,14 +1,12 @@
|
||||||
module github.com/jesseduffield/lazydocker
|
module github.com/jesseduffield/lazydocker
|
||||||
|
|
||||||
go 1.22
|
go 1.24.0
|
||||||
|
|
||||||
toolchain go1.23.6
|
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/OpenPeeDeeP/xdg v0.2.1-0.20190312153938-4ba9e1eb294c
|
github.com/OpenPeeDeeP/xdg v0.2.1-0.20190312153938-4ba9e1eb294c
|
||||||
github.com/boz/go-throttle v0.0.0-20160922054636-fdc4eab740c1
|
github.com/boz/go-throttle v0.0.0-20160922054636-fdc4eab740c1
|
||||||
github.com/cloudfoundry/jibber_jabber v0.0.0-20151120183258-bcc4c8345a21
|
github.com/cloudfoundry/jibber_jabber v0.0.0-20151120183258-bcc4c8345a21
|
||||||
github.com/docker/cli v27.1.1+incompatible
|
github.com/docker/cli v29.0.2+incompatible
|
||||||
github.com/docker/docker v28.5.2+incompatible
|
github.com/docker/docker v28.5.2+incompatible
|
||||||
github.com/fatih/color v1.10.0
|
github.com/fatih/color v1.10.0
|
||||||
github.com/go-errors/errors v1.5.1
|
github.com/go-errors/errors v1.5.1
|
||||||
|
|
@ -28,15 +26,18 @@ require (
|
||||||
github.com/sasha-s/go-deadlock v0.3.1
|
github.com/sasha-s/go-deadlock v0.3.1
|
||||||
github.com/sirupsen/logrus v1.9.3
|
github.com/sirupsen/logrus v1.9.3
|
||||||
github.com/spkg/bom v0.0.0-20160624110644-59b7046e48ad
|
github.com/spkg/bom v0.0.0-20160624110644-59b7046e48ad
|
||||||
github.com/stretchr/testify v1.9.0
|
github.com/stretchr/testify v1.10.0
|
||||||
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1
|
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1
|
||||||
)
|
)
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/containerd/errdefs v1.0.0 // indirect
|
github.com/containerd/errdefs v1.0.0 // indirect
|
||||||
github.com/containerd/errdefs/pkg v0.3.0 // indirect
|
github.com/containerd/errdefs/pkg v0.3.0 // indirect
|
||||||
|
github.com/moby/moby/api v1.52.0 // indirect
|
||||||
|
github.com/moby/moby/client v0.1.0 // indirect
|
||||||
github.com/moby/sys/atomicwriter v0.1.0 // indirect
|
github.com/moby/sys/atomicwriter v0.1.0 // indirect
|
||||||
github.com/moby/sys/sequential v0.6.0 // indirect
|
github.com/moby/sys/sequential v0.6.0 // indirect
|
||||||
|
go.opentelemetry.io/auto/sdk v1.1.0 // indirect
|
||||||
)
|
)
|
||||||
|
|
||||||
require (
|
require (
|
||||||
|
|
@ -45,7 +46,7 @@ require (
|
||||||
github.com/davecgh/go-spew v1.1.1 // indirect
|
github.com/davecgh/go-spew v1.1.1 // indirect
|
||||||
github.com/distribution/reference v0.6.0 // indirect
|
github.com/distribution/reference v0.6.0 // indirect
|
||||||
github.com/docker/docker-credential-helpers v0.8.2 // indirect
|
github.com/docker/docker-credential-helpers v0.8.2 // indirect
|
||||||
github.com/docker/go-connections v0.5.0 // indirect
|
github.com/docker/go-connections v0.6.0 // indirect
|
||||||
github.com/docker/go-units v0.5.0 // indirect
|
github.com/docker/go-units v0.5.0 // indirect
|
||||||
github.com/felixge/httpsnoop v1.0.4 // indirect
|
github.com/felixge/httpsnoop v1.0.4 // indirect
|
||||||
github.com/fvbommel/sortorder v1.1.0 // indirect
|
github.com/fvbommel/sortorder v1.1.0 // indirect
|
||||||
|
|
@ -58,28 +59,24 @@ require (
|
||||||
github.com/mattn/go-colorable v0.1.8 // indirect
|
github.com/mattn/go-colorable v0.1.8 // indirect
|
||||||
github.com/mattn/go-isatty v0.0.12 // indirect
|
github.com/mattn/go-isatty v0.0.12 // indirect
|
||||||
github.com/moby/docker-image-spec v1.3.1 // indirect
|
github.com/moby/docker-image-spec v1.3.1 // indirect
|
||||||
github.com/moby/term v0.5.0 // indirect
|
|
||||||
github.com/morikuni/aec v1.0.0 // indirect
|
github.com/morikuni/aec v1.0.0 // indirect
|
||||||
github.com/onsi/ginkgo v1.8.0 // indirect
|
github.com/onsi/ginkgo v1.8.0 // indirect
|
||||||
github.com/onsi/gomega v1.5.0 // indirect
|
github.com/onsi/gomega v1.5.0 // indirect
|
||||||
github.com/opencontainers/go-digest v1.0.0 // indirect
|
github.com/opencontainers/go-digest v1.0.0 // indirect
|
||||||
github.com/opencontainers/image-spec v1.1.0 // indirect
|
github.com/opencontainers/image-spec v1.1.1 // indirect
|
||||||
github.com/petermattis/goid v0.0.0-20180202154549-b0b1615b78e5 // indirect
|
github.com/petermattis/goid v0.0.0-20180202154549-b0b1615b78e5 // indirect
|
||||||
github.com/pkg/errors v0.9.1 // indirect
|
github.com/pkg/errors v0.9.1 // indirect
|
||||||
github.com/rivo/uniseg v0.4.7 // indirect
|
github.com/rivo/uniseg v0.4.7 // indirect
|
||||||
github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778 // indirect
|
github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778 // indirect
|
||||||
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0 // indirect
|
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0 // indirect
|
||||||
go.opentelemetry.io/otel v1.28.0 // indirect
|
go.opentelemetry.io/otel v1.35.0 // indirect
|
||||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.28.0 // indirect
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.28.0 // indirect
|
||||||
go.opentelemetry.io/otel/metric v1.28.0 // indirect
|
go.opentelemetry.io/otel/metric v1.35.0 // indirect
|
||||||
go.opentelemetry.io/otel/sdk v1.28.0 // indirect
|
go.opentelemetry.io/otel/trace v1.35.0 // indirect
|
||||||
go.opentelemetry.io/otel/trace v1.28.0 // indirect
|
|
||||||
golang.org/x/crypto v0.24.0 // indirect
|
golang.org/x/crypto v0.24.0 // indirect
|
||||||
golang.org/x/exp v0.0.0-20231006140011-7918f672742d // indirect
|
golang.org/x/exp v0.0.0-20231006140011-7918f672742d // indirect
|
||||||
golang.org/x/sys v0.24.0 // indirect
|
golang.org/x/sys v0.33.0 // indirect
|
||||||
golang.org/x/term v0.21.0 // indirect
|
golang.org/x/term v0.21.0 // indirect
|
||||||
golang.org/x/text v0.16.0 // indirect
|
golang.org/x/text v0.16.0 // indirect
|
||||||
golang.org/x/time v0.5.0 // indirect
|
|
||||||
gopkg.in/yaml.v3 v3.0.1 // indirect
|
gopkg.in/yaml.v3 v3.0.1 // indirect
|
||||||
gotest.tools/v3 v3.5.1 // indirect
|
|
||||||
)
|
)
|
||||||
|
|
|
||||||
80
go.sum
80
go.sum
|
|
@ -1,5 +1,5 @@
|
||||||
github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8=
|
github.com/Azure/go-ansiterm v0.0.0-20250102033503-faa5f7b0171c h1:udKWzYgxTojEKWjV8V+WSxDXJ4NFATAsZjh8iIbsQIg=
|
||||||
github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E=
|
github.com/Azure/go-ansiterm v0.0.0-20250102033503-faa5f7b0171c/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E=
|
||||||
github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY=
|
github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY=
|
||||||
github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU=
|
github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU=
|
||||||
github.com/OpenPeeDeeP/xdg v0.2.1-0.20190312153938-4ba9e1eb294c h1:YDsGA6tou+tAxVe0Dre29iSbQ8TrWdWfwOisKArJT5E=
|
github.com/OpenPeeDeeP/xdg v0.2.1-0.20190312153938-4ba9e1eb294c h1:YDsGA6tou+tAxVe0Dre29iSbQ8TrWdWfwOisKArJT5E=
|
||||||
|
|
@ -21,14 +21,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/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk=
|
github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk=
|
||||||
github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E=
|
github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E=
|
||||||
github.com/docker/cli v27.1.1+incompatible h1:goaZxOqs4QKxznZjjBWKONQci/MywhtRv2oNn0GkeZE=
|
github.com/docker/cli v29.0.2+incompatible h1:iLuKy2GWOSLXGp8feLYBJQVDv7m/8xoofz6lPq41x6A=
|
||||||
github.com/docker/cli v27.1.1+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8=
|
github.com/docker/cli v29.0.2+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8=
|
||||||
github.com/docker/docker v28.5.2+incompatible h1:DBX0Y0zAjZbSrm1uzOkdr1onVghKaftjlSWt4AFexzM=
|
github.com/docker/docker v28.5.2+incompatible h1:DBX0Y0zAjZbSrm1uzOkdr1onVghKaftjlSWt4AFexzM=
|
||||||
github.com/docker/docker v28.5.2+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
|
github.com/docker/docker v28.5.2+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
|
||||||
github.com/docker/docker-credential-helpers v0.8.2 h1:bX3YxiGzFP5sOXWc3bTPEXdEaZSeVMrFgOr3T+zrFAo=
|
github.com/docker/docker-credential-helpers v0.8.2 h1:bX3YxiGzFP5sOXWc3bTPEXdEaZSeVMrFgOr3T+zrFAo=
|
||||||
github.com/docker/docker-credential-helpers v0.8.2/go.mod h1:P3ci7E3lwkZg6XiHdRKft1KckHiO9a2rNtyFbZ/ry9M=
|
github.com/docker/docker-credential-helpers v0.8.2/go.mod h1:P3ci7E3lwkZg6XiHdRKft1KckHiO9a2rNtyFbZ/ry9M=
|
||||||
github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c=
|
github.com/docker/go-connections v0.6.0 h1:LlMG9azAe1TqfR7sO+NJttz1gy6KO7VJBh+pMmjSD94=
|
||||||
github.com/docker/go-connections v0.5.0/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc=
|
github.com/docker/go-connections v0.6.0/go.mod h1:AahvXYshr6JgfUJGdDCs2b5EZG/vmaMAntpSFH5BFKE=
|
||||||
github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4=
|
github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4=
|
||||||
github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
|
github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
|
||||||
github.com/fatih/color v1.10.0 h1:s36xzo75JdqLaaWoiEHk767eHiwo0598uUxyfiPkDsg=
|
github.com/fatih/color v1.10.0 h1:s36xzo75JdqLaaWoiEHk767eHiwo0598uUxyfiPkDsg=
|
||||||
|
|
@ -60,8 +60,8 @@ github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn
|
||||||
github.com/goccy/go-yaml v1.11.0 h1:n7Z+zx8S9f9KgzG6KtQKf+kwqXZlLNR2F6018Dgau54=
|
github.com/goccy/go-yaml v1.11.0 h1:n7Z+zx8S9f9KgzG6KtQKf+kwqXZlLNR2F6018Dgau54=
|
||||||
github.com/goccy/go-yaml v1.11.0/go.mod h1:H+mJrWtjPTJAHvRbV09MCK9xYwODM+wRTVFFTWckfng=
|
github.com/goccy/go-yaml v1.11.0/go.mod h1:H+mJrWtjPTJAHvRbV09MCK9xYwODM+wRTVFFTWckfng=
|
||||||
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||||
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
|
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
|
||||||
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
|
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
|
||||||
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
|
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
|
||||||
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||||
github.com/gookit/color v1.5.0 h1:1Opow3+BWDwqor78DcJkJCIwnkviFi+rrOANki9BUFw=
|
github.com/gookit/color v1.5.0 h1:1Opow3+BWDwqor78DcJkJCIwnkviFi+rrOANki9BUFw=
|
||||||
|
|
@ -84,6 +84,8 @@ github.com/jesseduffield/lazycore v0.0.0-20221023210126-718a4caea996 h1:CH1en6Gp
|
||||||
github.com/jesseduffield/lazycore v0.0.0-20221023210126-718a4caea996/go.mod h1:qxN4mHOAyeIDLP7IK7defgPClM/z1Kze8VVQiaEjzsQ=
|
github.com/jesseduffield/lazycore v0.0.0-20221023210126-718a4caea996/go.mod h1:qxN4mHOAyeIDLP7IK7defgPClM/z1Kze8VVQiaEjzsQ=
|
||||||
github.com/jesseduffield/yaml v0.0.0-20190702115811-b900b7e08b56 h1:33wSxJWU/f2TAozHYtJ8zqBxEnEVYM+22moLoiAkxvg=
|
github.com/jesseduffield/yaml v0.0.0-20190702115811-b900b7e08b56 h1:33wSxJWU/f2TAozHYtJ8zqBxEnEVYM+22moLoiAkxvg=
|
||||||
github.com/jesseduffield/yaml v0.0.0-20190702115811-b900b7e08b56/go.mod h1:FZJBwOhE+RXz8EVZfY+xnbCw2cVOwxlK3/aIi581z/s=
|
github.com/jesseduffield/yaml v0.0.0-20190702115811-b900b7e08b56/go.mod h1:FZJBwOhE+RXz8EVZfY+xnbCw2cVOwxlK3/aIi581z/s=
|
||||||
|
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
|
||||||
|
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
|
||||||
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
|
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
|
||||||
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
|
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
|
||||||
github.com/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y=
|
github.com/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y=
|
||||||
|
|
@ -102,16 +104,18 @@ github.com/mgutz/str v1.2.0 h1:4IzWSdIz9qPQWLfKZ0rJcV0jcUDpxvP4JVZ4GXQyvSw=
|
||||||
github.com/mgutz/str v1.2.0/go.mod h1:w1v0ofgLaJdoD0HpQ3fycxKD1WtxpjSo151pK/31q6w=
|
github.com/mgutz/str v1.2.0/go.mod h1:w1v0ofgLaJdoD0HpQ3fycxKD1WtxpjSo151pK/31q6w=
|
||||||
github.com/moby/docker-image-spec v1.3.1 h1:jMKff3w6PgbfSa69GfNg+zN/XLhfXJGnEx3Nl2EsFP0=
|
github.com/moby/docker-image-spec v1.3.1 h1:jMKff3w6PgbfSa69GfNg+zN/XLhfXJGnEx3Nl2EsFP0=
|
||||||
github.com/moby/docker-image-spec v1.3.1/go.mod h1:eKmb5VW8vQEh/BAr2yvVNvuiJuY6UIocYsFu/DxxRpo=
|
github.com/moby/docker-image-spec v1.3.1/go.mod h1:eKmb5VW8vQEh/BAr2yvVNvuiJuY6UIocYsFu/DxxRpo=
|
||||||
|
github.com/moby/moby/api v1.52.0 h1:00BtlJY4MXkkt84WhUZPRqt5TvPbgig2FZvTbe3igYg=
|
||||||
|
github.com/moby/moby/api v1.52.0/go.mod h1:8mb+ReTlisw4pS6BRzCMts5M49W5M7bKt1cJy/YbAqc=
|
||||||
|
github.com/moby/moby/client v0.1.0 h1:nt+hn6O9cyJQqq5UWnFGqsZRTS/JirUqzPjEl0Bdc/8=
|
||||||
|
github.com/moby/moby/client v0.1.0/go.mod h1:O+/tw5d4a1Ha/ZA/tPxIZJapJRUS6LNZ1wiVRxYHyUE=
|
||||||
github.com/moby/sys/atomicwriter v0.1.0 h1:kw5D/EqkBwsBFi0ss9v1VG3wIkVhzGvLklJ+w3A14Sw=
|
github.com/moby/sys/atomicwriter v0.1.0 h1:kw5D/EqkBwsBFi0ss9v1VG3wIkVhzGvLklJ+w3A14Sw=
|
||||||
github.com/moby/sys/atomicwriter v0.1.0/go.mod h1:Ul8oqv2ZMNHOceF643P6FKPXeCmYtlQMvpizfsSoaWs=
|
github.com/moby/sys/atomicwriter v0.1.0/go.mod h1:Ul8oqv2ZMNHOceF643P6FKPXeCmYtlQMvpizfsSoaWs=
|
||||||
github.com/moby/sys/sequential v0.6.0 h1:qrx7XFUd/5DxtqcoH1h438hF5TmOvzC/lspjy7zgvCU=
|
github.com/moby/sys/sequential v0.6.0 h1:qrx7XFUd/5DxtqcoH1h438hF5TmOvzC/lspjy7zgvCU=
|
||||||
github.com/moby/sys/sequential v0.6.0/go.mod h1:uyv8EUTrca5PnDsdMGXhZe6CCe8U/UiTWd+lL+7b/Ko=
|
github.com/moby/sys/sequential v0.6.0/go.mod h1:uyv8EUTrca5PnDsdMGXhZe6CCe8U/UiTWd+lL+7b/Ko=
|
||||||
github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0=
|
github.com/moby/term v0.5.2 h1:6qk3FJAFDs6i/q3W/pQ97SX192qKfZgGjCQqfCJkgzQ=
|
||||||
github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y=
|
github.com/moby/term v0.5.2/go.mod h1:d3djjFCrjnB+fl8NJux+EJzu0msscUP+f8it8hPkFLc=
|
||||||
github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A=
|
github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A=
|
||||||
github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc=
|
github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc=
|
||||||
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/onsi/ginkgo v1.6.0/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 h1:VkHVNpR4iVnU8XQR6DBm8BqYjN7CRzw+xKUbVVbbW9w=
|
github.com/onsi/ginkgo v1.8.0 h1:VkHVNpR4iVnU8XQR6DBm8BqYjN7CRzw+xKUbVVbbW9w=
|
||||||
github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
||||||
|
|
@ -119,8 +123,8 @@ github.com/onsi/gomega v1.5.0 h1:izbySO9zDPmjJ8rDjLvkA2zJHIo+HkYXHnf7eN7SSyo=
|
||||||
github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
|
github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
|
||||||
github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U=
|
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/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM=
|
||||||
github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQb2IpWsCzug=
|
github.com/opencontainers/image-spec v1.1.1 h1:y0fUlFfIZhPF1W537XOLg0/fcx6zcHCJwooC2xJA040=
|
||||||
github.com/opencontainers/image-spec v1.1.0/go.mod h1:W4s4sFTMaBeK1BQLXbG4AdM2szdn85PY75RI83NrTrM=
|
github.com/opencontainers/image-spec v1.1.1/go.mod h1:qpqAh3Dmcf36wStyyWU+kCeDgrGnAve2nCC8+7h8Q0M=
|
||||||
github.com/petermattis/goid v0.0.0-20180202154549-b0b1615b78e5 h1:q2e307iGHPdTGp0hoxKjt1H5pDo6utceo3dQVK3I5XQ=
|
github.com/petermattis/goid v0.0.0-20180202154549-b0b1615b78e5 h1:q2e307iGHPdTGp0hoxKjt1H5pDo6utceo3dQVK3I5XQ=
|
||||||
github.com/petermattis/goid v0.0.0-20180202154549-b0b1615b78e5/go.mod h1:jvVRKCrJTQWu0XVbaOlby/2lO20uSCHEMzzplHXte1o=
|
github.com/petermattis/goid v0.0.0-20180202154549-b0b1615b78e5/go.mod h1:jvVRKCrJTQWu0XVbaOlby/2lO20uSCHEMzzplHXte1o=
|
||||||
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
|
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
|
||||||
|
|
@ -131,6 +135,8 @@ github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJ
|
||||||
github.com/rivo/uniseg v0.4.3/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88=
|
github.com/rivo/uniseg v0.4.3/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88=
|
||||||
github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ=
|
github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ=
|
||||||
github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88=
|
github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88=
|
||||||
|
github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII=
|
||||||
|
github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o=
|
||||||
github.com/samber/lo v1.31.0 h1:Sfa+/064Tdo4SvlohQUQzBhgSer9v/coGvKQI/XLWAM=
|
github.com/samber/lo v1.31.0 h1:Sfa+/064Tdo4SvlohQUQzBhgSer9v/coGvKQI/XLWAM=
|
||||||
github.com/samber/lo v1.31.0/go.mod h1:HLeWcJRRyLKp3+/XBJvOrerCQn9mhdKMHyd7IRlgeQ8=
|
github.com/samber/lo v1.31.0/go.mod h1:HLeWcJRRyLKp3+/XBJvOrerCQn9mhdKMHyd7IRlgeQ8=
|
||||||
github.com/sasha-s/go-deadlock v0.3.1 h1:sqv7fDNShgjcaxkO0JNcOAlr8B9+cV5Ey/OB71efZx0=
|
github.com/sasha-s/go-deadlock v0.3.1 h1:sqv7fDNShgjcaxkO0JNcOAlr8B9+cV5Ey/OB71efZx0=
|
||||||
|
|
@ -145,27 +151,31 @@ github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=
|
||||||
github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=
|
github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=
|
||||||
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
|
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
|
||||||
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||||
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
|
github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
|
||||||
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
|
github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
|
||||||
github.com/thoas/go-funk v0.9.1 h1:O549iLZqPpTUQ10ykd26sZhzD+rmR5pWhuElrhbC20M=
|
github.com/thoas/go-funk v0.9.1 h1:O549iLZqPpTUQ10ykd26sZhzD+rmR5pWhuElrhbC20M=
|
||||||
github.com/thoas/go-funk v0.9.1/go.mod h1:+IWnUfUmFO1+WVYQWQtIJHeRRdaIyyYglZN7xzUPe4Q=
|
github.com/thoas/go-funk v0.9.1/go.mod h1:+IWnUfUmFO1+WVYQWQtIJHeRRdaIyyYglZN7xzUPe4Q=
|
||||||
github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778 h1:QldyIu/L63oPpyvQmHgvgickp1Yw510KJOqX7H24mg8=
|
github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778 h1:QldyIu/L63oPpyvQmHgvgickp1Yw510KJOqX7H24mg8=
|
||||||
github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778/go.mod h1:2MuV+tbUrU1zIOPMxZ5EncGwgmMJsa+9ucAQZXxsObs=
|
github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778/go.mod h1:2MuV+tbUrU1zIOPMxZ5EncGwgmMJsa+9ucAQZXxsObs=
|
||||||
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
|
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
|
||||||
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0 h1:4K4tsIXefpVJtvA/8srF4V4y0akAoPHkIslgAkjixJA=
|
go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA=
|
||||||
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0/go.mod h1:jjdQuTGVsXV4vSs+CJ2qYDeDPf9yIJV23qlIzBm73Vg=
|
go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A=
|
||||||
go.opentelemetry.io/otel v1.28.0 h1:/SqNcYk+idO0CxKEUOtKQClMK/MimZihKYMruSMViUo=
|
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0 h1:sbiXRNDSWJOTobXh5HyQKjq6wUC5tNybqjIqDpAY4CU=
|
||||||
go.opentelemetry.io/otel v1.28.0/go.mod h1:q68ijF8Fc8CnMHKyzqL6akLO46ePnjkgfIMIjUIX9z4=
|
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0/go.mod h1:69uWxva0WgAA/4bu2Yy70SLDBwZXuQ6PbBpbsa5iZrQ=
|
||||||
|
go.opentelemetry.io/otel v1.35.0 h1:xKWKPxrxB6OtMCbmMY021CqC45J+3Onta9MqjhnusiQ=
|
||||||
|
go.opentelemetry.io/otel v1.35.0/go.mod h1:UEqy8Zp11hpkUrL73gSlELM0DupHoiq72dR+Zqel/+Y=
|
||||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0 h1:3Q/xZUyC1BBkualc9ROb4G8qkH90LXEIICcs5zv1OYY=
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0 h1:3Q/xZUyC1BBkualc9ROb4G8qkH90LXEIICcs5zv1OYY=
|
||||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0/go.mod h1:s75jGIWA9OfCMzF0xr+ZgfrB5FEbbV7UuYo32ahUiFI=
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0/go.mod h1:s75jGIWA9OfCMzF0xr+ZgfrB5FEbbV7UuYo32ahUiFI=
|
||||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.28.0 h1:j9+03ymgYhPKmeXGk5Zu+cIZOlVzd9Zv7QIiyItjFBU=
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.28.0 h1:j9+03ymgYhPKmeXGk5Zu+cIZOlVzd9Zv7QIiyItjFBU=
|
||||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.28.0/go.mod h1:Y5+XiUG4Emn1hTfciPzGPJaSI+RpDts6BnCIir0SLqk=
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.28.0/go.mod h1:Y5+XiUG4Emn1hTfciPzGPJaSI+RpDts6BnCIir0SLqk=
|
||||||
go.opentelemetry.io/otel/metric v1.28.0 h1:f0HGvSl1KRAU1DLgLGFjrwVyismPlnuU6JD6bOeuA5Q=
|
go.opentelemetry.io/otel/metric v1.35.0 h1:0znxYu2SNyuMSQT4Y9WDWej0VpcsxkuklLa4/siN90M=
|
||||||
go.opentelemetry.io/otel/metric v1.28.0/go.mod h1:Fb1eVBFZmLVTMb6PPohq3TO9IIhUisDsbJoL/+uQW4s=
|
go.opentelemetry.io/otel/metric v1.35.0/go.mod h1:nKVFgxBZ2fReX6IlyW28MgZojkoAkJGaE8CpgeAU3oE=
|
||||||
go.opentelemetry.io/otel/sdk v1.28.0 h1:b9d7hIry8yZsgtbmM0DKyPWMMUMlK9NEKuIG4aBqWyE=
|
go.opentelemetry.io/otel/sdk v1.35.0 h1:iPctf8iprVySXSKJffSS79eOjl9pvxV9ZqOWT0QejKY=
|
||||||
go.opentelemetry.io/otel/sdk v1.28.0/go.mod h1:oYj7ClPUA7Iw3m+r7GeEjz0qckQRJK2B8zjcZEfu7Pg=
|
go.opentelemetry.io/otel/sdk v1.35.0/go.mod h1:+ga1bZliga3DxJ3CQGg3updiaAJoNECOgJREo9KHGQg=
|
||||||
go.opentelemetry.io/otel/trace v1.28.0 h1:GhQ9cUuQGmNDd5BTCP2dAvv75RdMxEfTmYejp+lkx9g=
|
go.opentelemetry.io/otel/sdk/metric v1.35.0 h1:1RriWBmCKgkeHEhM7a2uMjMUfP7MsOF5JpUCaEqEI9o=
|
||||||
go.opentelemetry.io/otel/trace v1.28.0/go.mod h1:jPyXzNPg6da9+38HEwElrQiHlVMTnVfM3/yv2OlIHaI=
|
go.opentelemetry.io/otel/sdk/metric v1.35.0/go.mod h1:is6XYCUMpcKi+ZsOvfluY5YstFnhW0BidkR+gL+qN+w=
|
||||||
|
go.opentelemetry.io/otel/trace v1.35.0 h1:dPpEfJu1sDIqruz7BHFG3c7528f6ddfSWfFDVt/xgMs=
|
||||||
|
go.opentelemetry.io/otel/trace v1.35.0/go.mod h1:WUk7DtFp1Aw2MkvqGdwiXYDZZNvA/1J8o6xRXLrIkyc=
|
||||||
go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0=
|
go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0=
|
||||||
go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8=
|
go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8=
|
||||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||||
|
|
@ -199,8 +209,8 @@ golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBc
|
||||||
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||||
golang.org/x/sys v0.24.0 h1:Twjiwq9dn6R1fQcyiK+wQyHWfaz/BJB+YIpzU/Cv3Xg=
|
golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw=
|
||||||
golang.org/x/sys v0.24.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
|
||||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||||
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
|
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
|
||||||
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
|
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
|
||||||
|
|
@ -214,8 +224,8 @@ golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
|
||||||
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
|
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
|
||||||
golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4=
|
golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4=
|
||||||
golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI=
|
golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI=
|
||||||
golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk=
|
golang.org/x/time v0.11.0 h1:/bpjEDfN9tkoN/ryeYHnv5hcMlc8ncjMcM4XBk5NWV0=
|
||||||
golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
|
golang.org/x/time v0.11.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg=
|
||||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/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-20191119224855-298f0cb1881e/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.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
|
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
|
||||||
|
|
@ -232,8 +242,8 @@ google.golang.org/grpc v1.67.0/go.mod h1:1gLDyUQU7CTLJI90u3nXZ9ekeghjeM7pTDZlqFN
|
||||||
google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg=
|
google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg=
|
||||||
google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw=
|
google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw=
|
||||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/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-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
|
||||||
gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
|
||||||
gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4=
|
gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4=
|
||||||
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
|
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
|
||||||
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=
|
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=
|
||||||
|
|
@ -243,5 +253,7 @@ gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||||
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
||||||
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||||
gotest.tools/v3 v3.5.1 h1:EENdUnS3pdur5nybKYIh2Vfgc8IUNBjxDPSjtiJcOzU=
|
gotest.tools/v3 v3.5.2 h1:7koQfIKdy+I8UTetycgUqXWSDwpgv193Ka+qRsmBY8Q=
|
||||||
gotest.tools/v3 v3.5.1/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU=
|
gotest.tools/v3 v3.5.2/go.mod h1:LtdLGcnqToBH83WByAAi/wiwSFCArdFIUV/xxN4pcjA=
|
||||||
|
pgregory.net/rapid v1.2.0 h1:keKAYRcjm+e1F0oAuU5F5+YPAWcyxNNRK2wud503Gnk=
|
||||||
|
pgregory.net/rapid v1.2.0/go.mod h1:PY5XlDGj0+V1FCq0o192FdRhpKHGTRIWBgqjDBTrq04=
|
||||||
|
|
|
||||||
30
vendor/github.com/containerd/log/.golangci.yml
generated
vendored
30
vendor/github.com/containerd/log/.golangci.yml
generated
vendored
|
|
@ -1,30 +0,0 @@
|
||||||
linters:
|
|
||||||
enable:
|
|
||||||
- exportloopref # Checks for pointers to enclosing loop variables
|
|
||||||
- gofmt
|
|
||||||
- goimports
|
|
||||||
- gosec
|
|
||||||
- ineffassign
|
|
||||||
- misspell
|
|
||||||
- nolintlint
|
|
||||||
- revive
|
|
||||||
- staticcheck
|
|
||||||
- tenv # Detects using os.Setenv instead of t.Setenv since Go 1.17
|
|
||||||
- unconvert
|
|
||||||
- unused
|
|
||||||
- vet
|
|
||||||
- dupword # Checks for duplicate words in the source code
|
|
||||||
disable:
|
|
||||||
- errcheck
|
|
||||||
|
|
||||||
run:
|
|
||||||
timeout: 5m
|
|
||||||
skip-dirs:
|
|
||||||
- api
|
|
||||||
- cluster
|
|
||||||
- design
|
|
||||||
- docs
|
|
||||||
- docs/man
|
|
||||||
- releases
|
|
||||||
- reports
|
|
||||||
- test # e2e scripts
|
|
||||||
17
vendor/github.com/containerd/log/README.md
generated
vendored
17
vendor/github.com/containerd/log/README.md
generated
vendored
|
|
@ -1,17 +0,0 @@
|
||||||
# log
|
|
||||||
|
|
||||||
A Go package providing a common logging interface across containerd repositories and a way for clients to use and configure logging in containerd packages.
|
|
||||||
|
|
||||||
This package is not intended to be used as a standalone logging package outside of the containerd ecosystem and is intended as an interface wrapper around a logging implementation.
|
|
||||||
In the future this package may be replaced with a common go logging interface.
|
|
||||||
|
|
||||||
## Project details
|
|
||||||
|
|
||||||
**log** 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/main/GOVERNANCE.md),
|
|
||||||
* [Maintainers](https://github.com/containerd/project/blob/main/MAINTAINERS),
|
|
||||||
* and [Contributing guidelines](https://github.com/containerd/project/blob/main/CONTRIBUTING.md)
|
|
||||||
|
|
||||||
information in our [`containerd/project`](https://github.com/containerd/project) repository.
|
|
||||||
|
|
||||||
182
vendor/github.com/containerd/log/context.go
generated
vendored
182
vendor/github.com/containerd/log/context.go
generated
vendored
|
|
@ -1,182 +0,0 @@
|
||||||
/*
|
|
||||||
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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
// Package log provides types and functions related to logging, passing
|
|
||||||
// loggers through a context, and attaching context to the logger.
|
|
||||||
//
|
|
||||||
// # Transitional types
|
|
||||||
//
|
|
||||||
// This package contains various types that are aliases for types in [logrus].
|
|
||||||
// These aliases are intended for transitioning away from hard-coding logrus
|
|
||||||
// as logging implementation. Consumers of this package are encouraged to use
|
|
||||||
// the type-aliases from this package instead of directly using their logrus
|
|
||||||
// equivalent.
|
|
||||||
//
|
|
||||||
// The intent is to replace these aliases with locally defined types and
|
|
||||||
// interfaces once all consumers are no longer directly importing logrus
|
|
||||||
// types.
|
|
||||||
//
|
|
||||||
// IMPORTANT: due to the transitional purpose of this package, it is not
|
|
||||||
// guaranteed for the full logrus API to be provided in the future. As
|
|
||||||
// outlined, these aliases are provided as a step to transition away from
|
|
||||||
// a specific implementation which, as a result, exposes the full logrus API.
|
|
||||||
// While no decisions have been made on the ultimate design and interface
|
|
||||||
// provided by this package, we do not expect carrying "less common" features.
|
|
||||||
package log
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"fmt"
|
|
||||||
|
|
||||||
"github.com/sirupsen/logrus"
|
|
||||||
)
|
|
||||||
|
|
||||||
// G is a shorthand for [GetLogger].
|
|
||||||
//
|
|
||||||
// We may want to define this locally to a package to get package tagged log
|
|
||||||
// messages.
|
|
||||||
var G = GetLogger
|
|
||||||
|
|
||||||
// L is an alias for the standard logger.
|
|
||||||
var L = &Entry{
|
|
||||||
Logger: logrus.StandardLogger(),
|
|
||||||
// Default is three fields plus a little extra room.
|
|
||||||
Data: make(Fields, 6),
|
|
||||||
}
|
|
||||||
|
|
||||||
type loggerKey struct{}
|
|
||||||
|
|
||||||
// Fields type to pass to "WithFields".
|
|
||||||
type Fields = map[string]any
|
|
||||||
|
|
||||||
// Entry is a logging entry. It contains all the fields passed with
|
|
||||||
// [Entry.WithFields]. It's finally logged when Trace, Debug, Info, Warn,
|
|
||||||
// Error, Fatal or Panic is called on it. These objects can be reused and
|
|
||||||
// passed around as much as you wish to avoid field duplication.
|
|
||||||
//
|
|
||||||
// Entry is a transitional type, and currently an alias for [logrus.Entry].
|
|
||||||
type Entry = logrus.Entry
|
|
||||||
|
|
||||||
// RFC3339NanoFixed is [time.RFC3339Nano] with nanoseconds padded using
|
|
||||||
// zeros to ensure the formatted time is always the same number of
|
|
||||||
// characters.
|
|
||||||
const RFC3339NanoFixed = "2006-01-02T15:04:05.000000000Z07:00"
|
|
||||||
|
|
||||||
// Level is a logging level.
|
|
||||||
type Level = logrus.Level
|
|
||||||
|
|
||||||
// Supported log levels.
|
|
||||||
const (
|
|
||||||
// TraceLevel level. Designates finer-grained informational events
|
|
||||||
// than [DebugLevel].
|
|
||||||
TraceLevel Level = logrus.TraceLevel
|
|
||||||
|
|
||||||
// DebugLevel level. Usually only enabled when debugging. Very verbose
|
|
||||||
// logging.
|
|
||||||
DebugLevel Level = logrus.DebugLevel
|
|
||||||
|
|
||||||
// InfoLevel level. General operational entries about what's going on
|
|
||||||
// inside the application.
|
|
||||||
InfoLevel Level = logrus.InfoLevel
|
|
||||||
|
|
||||||
// WarnLevel level. Non-critical entries that deserve eyes.
|
|
||||||
WarnLevel Level = logrus.WarnLevel
|
|
||||||
|
|
||||||
// ErrorLevel level. Logs errors that should definitely be noted.
|
|
||||||
// Commonly used for hooks to send errors to an error tracking service.
|
|
||||||
ErrorLevel Level = logrus.ErrorLevel
|
|
||||||
|
|
||||||
// FatalLevel level. Logs and then calls "logger.Exit(1)". It exits
|
|
||||||
// even if the logging level is set to Panic.
|
|
||||||
FatalLevel Level = logrus.FatalLevel
|
|
||||||
|
|
||||||
// PanicLevel level. This is the highest level of severity. Logs and
|
|
||||||
// then calls panic with the message passed to Debug, Info, ...
|
|
||||||
PanicLevel Level = logrus.PanicLevel
|
|
||||||
)
|
|
||||||
|
|
||||||
// SetLevel sets log level globally. It returns an error if the given
|
|
||||||
// level is not supported.
|
|
||||||
//
|
|
||||||
// level can be one of:
|
|
||||||
//
|
|
||||||
// - "trace" ([TraceLevel])
|
|
||||||
// - "debug" ([DebugLevel])
|
|
||||||
// - "info" ([InfoLevel])
|
|
||||||
// - "warn" ([WarnLevel])
|
|
||||||
// - "error" ([ErrorLevel])
|
|
||||||
// - "fatal" ([FatalLevel])
|
|
||||||
// - "panic" ([PanicLevel])
|
|
||||||
func SetLevel(level string) error {
|
|
||||||
lvl, err := logrus.ParseLevel(level)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
L.Logger.SetLevel(lvl)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetLevel returns the current log level.
|
|
||||||
func GetLevel() Level {
|
|
||||||
return L.Logger.GetLevel()
|
|
||||||
}
|
|
||||||
|
|
||||||
// OutputFormat specifies a log output format.
|
|
||||||
type OutputFormat string
|
|
||||||
|
|
||||||
// Supported log output formats.
|
|
||||||
const (
|
|
||||||
// TextFormat represents the text logging format.
|
|
||||||
TextFormat OutputFormat = "text"
|
|
||||||
|
|
||||||
// JSONFormat represents the JSON logging format.
|
|
||||||
JSONFormat OutputFormat = "json"
|
|
||||||
)
|
|
||||||
|
|
||||||
// SetFormat sets the log output format ([TextFormat] or [JSONFormat]).
|
|
||||||
func SetFormat(format OutputFormat) error {
|
|
||||||
switch format {
|
|
||||||
case TextFormat:
|
|
||||||
L.Logger.SetFormatter(&logrus.TextFormatter{
|
|
||||||
TimestampFormat: RFC3339NanoFixed,
|
|
||||||
FullTimestamp: true,
|
|
||||||
})
|
|
||||||
return nil
|
|
||||||
case JSONFormat:
|
|
||||||
L.Logger.SetFormatter(&logrus.JSONFormatter{
|
|
||||||
TimestampFormat: RFC3339NanoFixed,
|
|
||||||
})
|
|
||||||
return nil
|
|
||||||
default:
|
|
||||||
return fmt.Errorf("unknown log format: %s", format)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// WithLogger returns a new context with the provided logger. Use in
|
|
||||||
// combination with logger.WithField(s) for great effect.
|
|
||||||
func WithLogger(ctx context.Context, logger *Entry) context.Context {
|
|
||||||
return context.WithValue(ctx, loggerKey{}, logger.WithContext(ctx))
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetLogger retrieves the current logger from the context. If no logger is
|
|
||||||
// available, the default logger is returned.
|
|
||||||
func GetLogger(ctx context.Context) *Entry {
|
|
||||||
if logger := ctx.Value(loggerKey{}); logger != nil {
|
|
||||||
return logger.(*Entry)
|
|
||||||
}
|
|
||||||
return L.WithContext(ctx)
|
|
||||||
}
|
|
||||||
41
vendor/github.com/docker/cli/AUTHORS
generated
vendored
41
vendor/github.com/docker/cli/AUTHORS
generated
vendored
|
|
@ -48,6 +48,7 @@ Alfred Landrum <alfred.landrum@docker.com>
|
||||||
Ali Rostami <rostami.ali@gmail.com>
|
Ali Rostami <rostami.ali@gmail.com>
|
||||||
Alicia Lauerman <alicia@eta.im>
|
Alicia Lauerman <alicia@eta.im>
|
||||||
Allen Sun <allensun.shl@alibaba-inc.com>
|
Allen Sun <allensun.shl@alibaba-inc.com>
|
||||||
|
Allie Sadler <allie.sadler@docker.com>
|
||||||
Alvin Deng <alvin.q.deng@utexas.edu>
|
Alvin Deng <alvin.q.deng@utexas.edu>
|
||||||
Amen Belayneh <amenbelayneh@gmail.com>
|
Amen Belayneh <amenbelayneh@gmail.com>
|
||||||
Amey Shrivastava <72866602+AmeyShrivastava@users.noreply.github.com>
|
Amey Shrivastava <72866602+AmeyShrivastava@users.noreply.github.com>
|
||||||
|
|
@ -62,6 +63,7 @@ Andreas Köhler <andi5.py@gmx.net>
|
||||||
Andres G. Aragoneses <knocte@gmail.com>
|
Andres G. Aragoneses <knocte@gmail.com>
|
||||||
Andres Leon Rangel <aleon1220@gmail.com>
|
Andres Leon Rangel <aleon1220@gmail.com>
|
||||||
Andrew France <andrew@avito.co.uk>
|
Andrew France <andrew@avito.co.uk>
|
||||||
|
Andrew He <he.andrew.mail@gmail.com>
|
||||||
Andrew Hsu <andrewhsu@docker.com>
|
Andrew Hsu <andrewhsu@docker.com>
|
||||||
Andrew Macpherson <hopscotch23@gmail.com>
|
Andrew Macpherson <hopscotch23@gmail.com>
|
||||||
Andrew McDonnell <bugs@andrewmcdonnell.net>
|
Andrew McDonnell <bugs@andrewmcdonnell.net>
|
||||||
|
|
@ -81,13 +83,16 @@ Antonis Kalipetis <akalipetis@gmail.com>
|
||||||
Anusha Ragunathan <anusha.ragunathan@docker.com>
|
Anusha Ragunathan <anusha.ragunathan@docker.com>
|
||||||
Ao Li <la9249@163.com>
|
Ao Li <la9249@163.com>
|
||||||
Arash Deshmeh <adeshmeh@ca.ibm.com>
|
Arash Deshmeh <adeshmeh@ca.ibm.com>
|
||||||
|
Archimedes Trajano <developer@trajano.net>
|
||||||
Arko Dasgupta <arko@tetrate.io>
|
Arko Dasgupta <arko@tetrate.io>
|
||||||
Arnaud Porterie <icecrime@gmail.com>
|
Arnaud Porterie <icecrime@gmail.com>
|
||||||
Arnaud Rebillout <elboulangero@gmail.com>
|
Arnaud Rebillout <elboulangero@gmail.com>
|
||||||
|
Arthur Flageul <arthur.flageul@gmail.com>
|
||||||
Arthur Peka <arthur.peka@outlook.com>
|
Arthur Peka <arthur.peka@outlook.com>
|
||||||
Ashly Mathew <ashly.mathew@sap.com>
|
Ashly Mathew <ashly.mathew@sap.com>
|
||||||
Ashwini Oruganti <ashwini.oruganti@gmail.com>
|
Ashwini Oruganti <ashwini.oruganti@gmail.com>
|
||||||
Aslam Ahemad <aslamahemad@gmail.com>
|
Aslam Ahemad <aslamahemad@gmail.com>
|
||||||
|
Austin Vazquez <austin.vazquez@docker.com>
|
||||||
Azat Khuyiyakhmetov <shadow_uz@mail.ru>
|
Azat Khuyiyakhmetov <shadow_uz@mail.ru>
|
||||||
Bardia Keyoumarsi <bkeyouma@ucsc.edu>
|
Bardia Keyoumarsi <bkeyouma@ucsc.edu>
|
||||||
Barnaby Gray <barnaby@pickle.me.uk>
|
Barnaby Gray <barnaby@pickle.me.uk>
|
||||||
|
|
@ -132,9 +137,12 @@ Cao Weiwei <cao.weiwei30@zte.com.cn>
|
||||||
Carlo Mion <mion00@gmail.com>
|
Carlo Mion <mion00@gmail.com>
|
||||||
Carlos Alexandro Becker <caarlos0@gmail.com>
|
Carlos Alexandro Becker <caarlos0@gmail.com>
|
||||||
Carlos de Paula <me@carlosedp.com>
|
Carlos de Paula <me@carlosedp.com>
|
||||||
|
carsontham <carsontham@outlook.com>
|
||||||
|
Carston Schilds <Carston.Schilds@visier.com>
|
||||||
Casey Korver <casey@korver.dev>
|
Casey Korver <casey@korver.dev>
|
||||||
Ce Gao <ce.gao@outlook.com>
|
Ce Gao <ce.gao@outlook.com>
|
||||||
Cedric Davies <cedricda@microsoft.com>
|
Cedric Davies <cedricda@microsoft.com>
|
||||||
|
Cesar Talledo <cesar.talledo@docker.com>
|
||||||
Cezar Sa Espinola <cezarsa@gmail.com>
|
Cezar Sa Espinola <cezarsa@gmail.com>
|
||||||
Chad Faragher <wyckster@hotmail.com>
|
Chad Faragher <wyckster@hotmail.com>
|
||||||
Chao Wang <wangchao.fnst@cn.fujitsu.com>
|
Chao Wang <wangchao.fnst@cn.fujitsu.com>
|
||||||
|
|
@ -189,6 +197,7 @@ Daisuke Ito <itodaisuke00@gmail.com>
|
||||||
dalanlan <dalanlan925@gmail.com>
|
dalanlan <dalanlan925@gmail.com>
|
||||||
Damien Nadé <github@livna.org>
|
Damien Nadé <github@livna.org>
|
||||||
Dan Cotora <dan@bluevision.ro>
|
Dan Cotora <dan@bluevision.ro>
|
||||||
|
Dan Wallis <dan@wallis.nz>
|
||||||
Danial Gharib <danial.mail.gh@gmail.com>
|
Danial Gharib <danial.mail.gh@gmail.com>
|
||||||
Daniel Artine <daniel.artine@ufrj.br>
|
Daniel Artine <daniel.artine@ufrj.br>
|
||||||
Daniel Cassidy <mail@danielcassidy.me.uk>
|
Daniel Cassidy <mail@danielcassidy.me.uk>
|
||||||
|
|
@ -215,7 +224,7 @@ David Alvarez <david.alvarez@flyeralarm.com>
|
||||||
David Beitey <david@davidjb.com>
|
David Beitey <david@davidjb.com>
|
||||||
David Calavera <david.calavera@gmail.com>
|
David Calavera <david.calavera@gmail.com>
|
||||||
David Cramer <davcrame@cisco.com>
|
David Cramer <davcrame@cisco.com>
|
||||||
David Dooling <dooling@gmail.com>
|
David Dooling <david.dooling@docker.com>
|
||||||
David Gageot <david@gageot.net>
|
David Gageot <david@gageot.net>
|
||||||
David Karlsson <david.karlsson@docker.com>
|
David Karlsson <david.karlsson@docker.com>
|
||||||
David le Blanc <systemmonkey42@users.noreply.github.com>
|
David le Blanc <systemmonkey42@users.noreply.github.com>
|
||||||
|
|
@ -237,6 +246,7 @@ Deshi Xiao <dxiao@redhat.com>
|
||||||
Dharmit Shah <shahdharmit@gmail.com>
|
Dharmit Shah <shahdharmit@gmail.com>
|
||||||
Dhawal Yogesh Bhanushali <dbhanushali@vmware.com>
|
Dhawal Yogesh Bhanushali <dbhanushali@vmware.com>
|
||||||
Dieter Reuter <dieter.reuter@me.com>
|
Dieter Reuter <dieter.reuter@me.com>
|
||||||
|
Dilep Dev <34891655+DilepDev@users.noreply.github.com>
|
||||||
Dima Stopel <dima@twistlock.com>
|
Dima Stopel <dima@twistlock.com>
|
||||||
Dimitry Andric <d.andric@activevideo.com>
|
Dimitry Andric <d.andric@activevideo.com>
|
||||||
Ding Fei <dingfei@stars.org.cn>
|
Ding Fei <dingfei@stars.org.cn>
|
||||||
|
|
@ -259,6 +269,7 @@ Eli Uriegas <eli.uriegas@docker.com>
|
||||||
Eli Uriegas <seemethere101@gmail.com>
|
Eli Uriegas <seemethere101@gmail.com>
|
||||||
Elias Faxö <elias.faxo@tre.se>
|
Elias Faxö <elias.faxo@tre.se>
|
||||||
Elliot Luo <956941328@qq.com>
|
Elliot Luo <956941328@qq.com>
|
||||||
|
Eng Zer Jun <engzerjun@gmail.com>
|
||||||
Eric Bode <eric.bode@foundries.io>
|
Eric Bode <eric.bode@foundries.io>
|
||||||
Eric Curtin <ericcurtin17@gmail.com>
|
Eric Curtin <ericcurtin17@gmail.com>
|
||||||
Eric Engestrom <eric@engestrom.ch>
|
Eric Engestrom <eric@engestrom.ch>
|
||||||
|
|
@ -308,6 +319,8 @@ George MacRorie <gmacr31@gmail.com>
|
||||||
George Margaritis <gmargaritis@protonmail.com>
|
George Margaritis <gmargaritis@protonmail.com>
|
||||||
George Xie <georgexsh@gmail.com>
|
George Xie <georgexsh@gmail.com>
|
||||||
Gianluca Borello <g.borello@gmail.com>
|
Gianluca Borello <g.borello@gmail.com>
|
||||||
|
Giau. Tran Minh <hello@giautm.dev>
|
||||||
|
Giedrius Jonikas <giedriusj1@gmail.com>
|
||||||
Gildas Cuisinier <gildas.cuisinier@gcuisinier.net>
|
Gildas Cuisinier <gildas.cuisinier@gcuisinier.net>
|
||||||
Gio d'Amelio <giodamelio@gmail.com>
|
Gio d'Amelio <giodamelio@gmail.com>
|
||||||
Gleb Stsenov <gleb.stsenov@gmail.com>
|
Gleb Stsenov <gleb.stsenov@gmail.com>
|
||||||
|
|
@ -337,6 +350,7 @@ Henning Sprang <henning.sprang@gmail.com>
|
||||||
Henry N <henrynmail-github@yahoo.de>
|
Henry N <henrynmail-github@yahoo.de>
|
||||||
Hernan Garcia <hernandanielg@gmail.com>
|
Hernan Garcia <hernandanielg@gmail.com>
|
||||||
Hongbin Lu <hongbin034@gmail.com>
|
Hongbin Lu <hongbin034@gmail.com>
|
||||||
|
Hossein Abbasi <16090309+hsnabszhdn@users.noreply.github.com>
|
||||||
Hu Keping <hukeping@huawei.com>
|
Hu Keping <hukeping@huawei.com>
|
||||||
Huayi Zhang <irachex@gmail.com>
|
Huayi Zhang <irachex@gmail.com>
|
||||||
Hugo Chastel <Hugo-C@users.noreply.github.com>
|
Hugo Chastel <Hugo-C@users.noreply.github.com>
|
||||||
|
|
@ -344,6 +358,7 @@ Hugo Gabriel Eyherabide <hugogabriel.eyherabide@gmail.com>
|
||||||
huqun <huqun@zju.edu.cn>
|
huqun <huqun@zju.edu.cn>
|
||||||
Huu Nguyen <huu@prismskylabs.com>
|
Huu Nguyen <huu@prismskylabs.com>
|
||||||
Hyzhou Zhy <hyzhou.zhy@alibaba-inc.com>
|
Hyzhou Zhy <hyzhou.zhy@alibaba-inc.com>
|
||||||
|
Iain MacDonald <IJMacD@gmail.com>
|
||||||
Iain Samuel McLean Elder <iain@isme.es>
|
Iain Samuel McLean Elder <iain@isme.es>
|
||||||
Ian Campbell <ian.campbell@docker.com>
|
Ian Campbell <ian.campbell@docker.com>
|
||||||
Ian Philpot <ian.philpot@microsoft.com>
|
Ian Philpot <ian.philpot@microsoft.com>
|
||||||
|
|
@ -393,6 +408,7 @@ Jesse Adametz <jesseadametz@gmail.com>
|
||||||
Jessica Frazelle <jess@oxide.computer>
|
Jessica Frazelle <jess@oxide.computer>
|
||||||
Jezeniel Zapanta <jpzapanta22@gmail.com>
|
Jezeniel Zapanta <jpzapanta22@gmail.com>
|
||||||
Jian Zhang <zhangjian.fnst@cn.fujitsu.com>
|
Jian Zhang <zhangjian.fnst@cn.fujitsu.com>
|
||||||
|
Jianyong Wu <wujianyong@hygon.cn>
|
||||||
Jie Luo <luo612@zju.edu.cn>
|
Jie Luo <luo612@zju.edu.cn>
|
||||||
Jilles Oldenbeuving <ojilles@gmail.com>
|
Jilles Oldenbeuving <ojilles@gmail.com>
|
||||||
Jim Chen <njucjc@gmail.com>
|
Jim Chen <njucjc@gmail.com>
|
||||||
|
|
@ -446,6 +462,7 @@ Julian <gitea+julian@ic.thejulian.uk>
|
||||||
Julien Barbier <write0@gmail.com>
|
Julien Barbier <write0@gmail.com>
|
||||||
Julien Kassar <github@kassisol.com>
|
Julien Kassar <github@kassisol.com>
|
||||||
Julien Maitrehenry <julien.maitrehenry@me.com>
|
Julien Maitrehenry <julien.maitrehenry@me.com>
|
||||||
|
Julio Cesar Garcia <juliogarciamelgarejo@gmail.com>
|
||||||
Justas Brazauskas <brazauskasjustas@gmail.com>
|
Justas Brazauskas <brazauskasjustas@gmail.com>
|
||||||
Justin Chadwell <me@jedevc.com>
|
Justin Chadwell <me@jedevc.com>
|
||||||
Justin Cormack <justin.cormack@docker.com>
|
Justin Cormack <justin.cormack@docker.com>
|
||||||
|
|
@ -490,19 +507,22 @@ Kunal Kushwaha <kushwaha_kunal_v7@lab.ntt.co.jp>
|
||||||
Kyle Mitofsky <Kylemit@gmail.com>
|
Kyle Mitofsky <Kylemit@gmail.com>
|
||||||
Lachlan Cooper <lachlancooper@gmail.com>
|
Lachlan Cooper <lachlancooper@gmail.com>
|
||||||
Lai Jiangshan <jiangshanlai@gmail.com>
|
Lai Jiangshan <jiangshanlai@gmail.com>
|
||||||
|
Lajos Papp <lajos.papp@sequenceiq.com>
|
||||||
Lars Kellogg-Stedman <lars@redhat.com>
|
Lars Kellogg-Stedman <lars@redhat.com>
|
||||||
Laura Brehm <laurabrehm@hey.com>
|
Laura Brehm <laurabrehm@hey.com>
|
||||||
Laura Frank <ljfrank@gmail.com>
|
Laura Frank <ljfrank@gmail.com>
|
||||||
Laurent Erignoux <lerignoux@gmail.com>
|
Laurent Erignoux <lerignoux@gmail.com>
|
||||||
|
Laurent Goderre <laurent.goderre@docker.com>
|
||||||
Lee Gaines <eightlimbed@gmail.com>
|
Lee Gaines <eightlimbed@gmail.com>
|
||||||
Lei Jitang <leijitang@huawei.com>
|
Lei Jitang <leijitang@huawei.com>
|
||||||
Lennie <github@consolejunkie.net>
|
Lennie <github@consolejunkie.net>
|
||||||
|
lentil32 <lentil32@icloud.com>
|
||||||
Leo Gallucci <elgalu3@gmail.com>
|
Leo Gallucci <elgalu3@gmail.com>
|
||||||
Leonid Skorospelov <leosko94@gmail.com>
|
Leonid Skorospelov <leosko94@gmail.com>
|
||||||
Lewis Daly <lewisdaly@me.com>
|
Lewis Daly <lewisdaly@me.com>
|
||||||
Li Fu Bang <lifubang@acmcoder.com>
|
Li Fu Bang <lifubang@acmcoder.com>
|
||||||
Li Yi <denverdino@gmail.com>
|
Li Yi <denverdino@gmail.com>
|
||||||
Li Yi <weiyuan.yl@alibaba-inc.com>
|
Li Zeghong <zeghong@hotmail.com>
|
||||||
Liang-Chi Hsieh <viirya@gmail.com>
|
Liang-Chi Hsieh <viirya@gmail.com>
|
||||||
Lihua Tang <lhtang@alauda.io>
|
Lihua Tang <lhtang@alauda.io>
|
||||||
Lily Guo <lily.guo@docker.com>
|
Lily Guo <lily.guo@docker.com>
|
||||||
|
|
@ -515,6 +535,7 @@ lixiaobing10051267 <li.xiaobing1@zte.com.cn>
|
||||||
Lloyd Dewolf <foolswisdom@gmail.com>
|
Lloyd Dewolf <foolswisdom@gmail.com>
|
||||||
Lorenzo Fontana <lo@linux.com>
|
Lorenzo Fontana <lo@linux.com>
|
||||||
Louis Opter <kalessin@kalessin.fr>
|
Louis Opter <kalessin@kalessin.fr>
|
||||||
|
Lovekesh Kumar <lovekesh.kumar@rtcamp.com>
|
||||||
Luca Favatella <luca.favatella@erlang-solutions.com>
|
Luca Favatella <luca.favatella@erlang-solutions.com>
|
||||||
Luca Marturana <lucamarturana@gmail.com>
|
Luca Marturana <lucamarturana@gmail.com>
|
||||||
Lucas Chan <lucas-github@lucaschan.com>
|
Lucas Chan <lucas-github@lucaschan.com>
|
||||||
|
|
@ -559,6 +580,7 @@ Matt Robenolt <matt@ydekproductions.com>
|
||||||
Matteo Orefice <matteo.orefice@bites4bits.software>
|
Matteo Orefice <matteo.orefice@bites4bits.software>
|
||||||
Matthew Heon <mheon@redhat.com>
|
Matthew Heon <mheon@redhat.com>
|
||||||
Matthieu Hauglustaine <matt.hauglustaine@gmail.com>
|
Matthieu Hauglustaine <matt.hauglustaine@gmail.com>
|
||||||
|
Matthieu MOREL <matthieu.morel35@gmail.com>
|
||||||
Mauro Porras P <mauroporrasp@gmail.com>
|
Mauro Porras P <mauroporrasp@gmail.com>
|
||||||
Max Shytikov <mshytikov@gmail.com>
|
Max Shytikov <mshytikov@gmail.com>
|
||||||
Max-Julian Pogner <max-julian@pogner.at>
|
Max-Julian Pogner <max-julian@pogner.at>
|
||||||
|
|
@ -566,6 +588,7 @@ Maxime Petazzoni <max@signalfuse.com>
|
||||||
Maximillian Fan Xavier <maximillianfx@gmail.com>
|
Maximillian Fan Xavier <maximillianfx@gmail.com>
|
||||||
Mei ChunTao <mei.chuntao@zte.com.cn>
|
Mei ChunTao <mei.chuntao@zte.com.cn>
|
||||||
Melroy van den Berg <melroy@melroy.org>
|
Melroy van den Berg <melroy@melroy.org>
|
||||||
|
Mert Şişmanoğlu <mert190737fb@gmail.com>
|
||||||
Metal <2466052+tedhexaflow@users.noreply.github.com>
|
Metal <2466052+tedhexaflow@users.noreply.github.com>
|
||||||
Micah Zoltu <micah@newrelic.com>
|
Micah Zoltu <micah@newrelic.com>
|
||||||
Michael A. Smith <michael@smith-li.com>
|
Michael A. Smith <michael@smith-li.com>
|
||||||
|
|
@ -578,6 +601,7 @@ Michael Prokop <github@michael-prokop.at>
|
||||||
Michael Scharf <github@scharf.gr>
|
Michael Scharf <github@scharf.gr>
|
||||||
Michael Spetsiotis <michael_spets@hotmail.com>
|
Michael Spetsiotis <michael_spets@hotmail.com>
|
||||||
Michael Steinert <mike.steinert@gmail.com>
|
Michael Steinert <mike.steinert@gmail.com>
|
||||||
|
Michael Tews <michael@tews.dev>
|
||||||
Michael West <mwest@mdsol.com>
|
Michael West <mwest@mdsol.com>
|
||||||
Michal Minář <miminar@redhat.com>
|
Michal Minář <miminar@redhat.com>
|
||||||
Michał Czeraszkiewicz <czerasz@gmail.com>
|
Michał Czeraszkiewicz <czerasz@gmail.com>
|
||||||
|
|
@ -598,7 +622,9 @@ Mindaugas Rukas <momomg@gmail.com>
|
||||||
Miroslav Gula <miroslav.gula@naytrolabs.com>
|
Miroslav Gula <miroslav.gula@naytrolabs.com>
|
||||||
Misty Stanley-Jones <misty@docker.com>
|
Misty Stanley-Jones <misty@docker.com>
|
||||||
Mohammad Banikazemi <mb@us.ibm.com>
|
Mohammad Banikazemi <mb@us.ibm.com>
|
||||||
|
Mohammad Hossein <mhm98035@gmail.com>
|
||||||
Mohammed Aaqib Ansari <maaquib@gmail.com>
|
Mohammed Aaqib Ansari <maaquib@gmail.com>
|
||||||
|
Mohammed Aminu Futa <mohammedfuta2000@gmail.com>
|
||||||
Mohini Anne Dsouza <mohini3917@gmail.com>
|
Mohini Anne Dsouza <mohini3917@gmail.com>
|
||||||
Moorthy RS <rsmoorthy@gmail.com>
|
Moorthy RS <rsmoorthy@gmail.com>
|
||||||
Morgan Bauer <mbauer@us.ibm.com>
|
Morgan Bauer <mbauer@us.ibm.com>
|
||||||
|
|
@ -633,9 +659,11 @@ Nicolas De Loof <nicolas.deloof@gmail.com>
|
||||||
Nikhil Chawla <chawlanikhil24@gmail.com>
|
Nikhil Chawla <chawlanikhil24@gmail.com>
|
||||||
Nikolas Garofil <nikolas.garofil@uantwerpen.be>
|
Nikolas Garofil <nikolas.garofil@uantwerpen.be>
|
||||||
Nikolay Milovanov <nmil@itransformers.net>
|
Nikolay Milovanov <nmil@itransformers.net>
|
||||||
|
NinaLua <iturf@sina.cn>
|
||||||
Nir Soffer <nsoffer@redhat.com>
|
Nir Soffer <nsoffer@redhat.com>
|
||||||
Nishant Totla <nishanttotla@gmail.com>
|
Nishant Totla <nishanttotla@gmail.com>
|
||||||
NIWA Hideyuki <niwa.niwa@nifty.ne.jp>
|
NIWA Hideyuki <niwa.niwa@nifty.ne.jp>
|
||||||
|
Noah Silas <noah@hustle.com>
|
||||||
Noah Treuhaft <noah.treuhaft@docker.com>
|
Noah Treuhaft <noah.treuhaft@docker.com>
|
||||||
O.S. Tezer <ostezer@gmail.com>
|
O.S. Tezer <ostezer@gmail.com>
|
||||||
Oded Arbel <oded@geek.co.il>
|
Oded Arbel <oded@geek.co.il>
|
||||||
|
|
@ -653,10 +681,12 @@ Patrick Böänziger <patrick.baenziger@bsi-software.com>
|
||||||
Patrick Daigle <114765035+pdaig@users.noreply.github.com>
|
Patrick Daigle <114765035+pdaig@users.noreply.github.com>
|
||||||
Patrick Hemmer <patrick.hemmer@gmail.com>
|
Patrick Hemmer <patrick.hemmer@gmail.com>
|
||||||
Patrick Lang <plang@microsoft.com>
|
Patrick Lang <plang@microsoft.com>
|
||||||
|
Patrick St. laurent <patrick@saint-laurent.us>
|
||||||
Paul <paul9869@gmail.com>
|
Paul <paul9869@gmail.com>
|
||||||
Paul Kehrer <paul.l.kehrer@gmail.com>
|
Paul Kehrer <paul.l.kehrer@gmail.com>
|
||||||
Paul Lietar <paul@lietar.net>
|
Paul Lietar <paul@lietar.net>
|
||||||
Paul Mulders <justinkb@gmail.com>
|
Paul Mulders <justinkb@gmail.com>
|
||||||
|
Paul Rogalski <mail@paul-rogalski.de>
|
||||||
Paul Seyfert <pseyfert.mathphys@gmail.com>
|
Paul Seyfert <pseyfert.mathphys@gmail.com>
|
||||||
Paul Weaver <pauweave@cisco.com>
|
Paul Weaver <pauweave@cisco.com>
|
||||||
Pavel Pospisil <pospispa@gmail.com>
|
Pavel Pospisil <pospispa@gmail.com>
|
||||||
|
|
@ -678,7 +708,6 @@ Philip Alexander Etling <paetling@gmail.com>
|
||||||
Philipp Gillé <philipp.gille@gmail.com>
|
Philipp Gillé <philipp.gille@gmail.com>
|
||||||
Philipp Schmied <pschmied@schutzwerk.com>
|
Philipp Schmied <pschmied@schutzwerk.com>
|
||||||
Phong Tran <tran.pho@northeastern.edu>
|
Phong Tran <tran.pho@northeastern.edu>
|
||||||
pidster <pid@pidster.com>
|
|
||||||
Pieter E Smit <diepes@github.com>
|
Pieter E Smit <diepes@github.com>
|
||||||
pixelistik <pixelistik@users.noreply.github.com>
|
pixelistik <pixelistik@users.noreply.github.com>
|
||||||
Pratik Karki <prertik@outlook.com>
|
Pratik Karki <prertik@outlook.com>
|
||||||
|
|
@ -738,6 +767,7 @@ Samuel Cochran <sj26@sj26.com>
|
||||||
Samuel Karp <skarp@amazon.com>
|
Samuel Karp <skarp@amazon.com>
|
||||||
Sandro Jäckel <sandro.jaeckel@gmail.com>
|
Sandro Jäckel <sandro.jaeckel@gmail.com>
|
||||||
Santhosh Manohar <santhosh@docker.com>
|
Santhosh Manohar <santhosh@docker.com>
|
||||||
|
Sarah Sanders <sarah.sanders@docker.com>
|
||||||
Sargun Dhillon <sargun@netflix.com>
|
Sargun Dhillon <sargun@netflix.com>
|
||||||
Saswat Bhattacharya <sas.saswat@gmail.com>
|
Saswat Bhattacharya <sas.saswat@gmail.com>
|
||||||
Saurabh Kumar <saurabhkumar0184@gmail.com>
|
Saurabh Kumar <saurabhkumar0184@gmail.com>
|
||||||
|
|
@ -770,6 +800,7 @@ Spencer Brown <spencer@spencerbrown.org>
|
||||||
Spring Lee <xi.shuai@outlook.com>
|
Spring Lee <xi.shuai@outlook.com>
|
||||||
squeegels <lmscrewy@gmail.com>
|
squeegels <lmscrewy@gmail.com>
|
||||||
Srini Brahmaroutu <srbrahma@us.ibm.com>
|
Srini Brahmaroutu <srbrahma@us.ibm.com>
|
||||||
|
Stavros Panakakis <stavrospanakakis@gmail.com>
|
||||||
Stefan S. <tronicum@user.github.com>
|
Stefan S. <tronicum@user.github.com>
|
||||||
Stefan Scherer <stefan.scherer@docker.com>
|
Stefan Scherer <stefan.scherer@docker.com>
|
||||||
Stefan Weil <sw@weilnetz.de>
|
Stefan Weil <sw@weilnetz.de>
|
||||||
|
|
@ -780,6 +811,7 @@ Steve Durrheimer <s.durrheimer@gmail.com>
|
||||||
Steve Richards <steve.richards@docker.com>
|
Steve Richards <steve.richards@docker.com>
|
||||||
Steven Burgess <steven.a.burgess@hotmail.com>
|
Steven Burgess <steven.a.burgess@hotmail.com>
|
||||||
Stoica-Marcu Floris-Andrei <floris.sm@gmail.com>
|
Stoica-Marcu Floris-Andrei <floris.sm@gmail.com>
|
||||||
|
Stuart Williams <pid@pidster.com>
|
||||||
Subhajit Ghosh <isubuz.g@gmail.com>
|
Subhajit Ghosh <isubuz.g@gmail.com>
|
||||||
Sun Jianbo <wonderflow.sun@gmail.com>
|
Sun Jianbo <wonderflow.sun@gmail.com>
|
||||||
Sune Keller <absukl@almbrand.dk>
|
Sune Keller <absukl@almbrand.dk>
|
||||||
|
|
@ -867,9 +899,11 @@ Wang Yumu <37442693@qq.com>
|
||||||
Wataru Ishida <ishida.wataru@lab.ntt.co.jp>
|
Wataru Ishida <ishida.wataru@lab.ntt.co.jp>
|
||||||
Wayne Song <wsong@docker.com>
|
Wayne Song <wsong@docker.com>
|
||||||
Wen Cheng Ma <wenchma@cn.ibm.com>
|
Wen Cheng Ma <wenchma@cn.ibm.com>
|
||||||
|
Wenlong Zhang <zhangwenlong@loongson.cn>
|
||||||
Wenzhi Liang <wenzhi.liang@gmail.com>
|
Wenzhi Liang <wenzhi.liang@gmail.com>
|
||||||
Wes Morgan <cap10morgan@gmail.com>
|
Wes Morgan <cap10morgan@gmail.com>
|
||||||
Wewang Xiaorenfine <wang.xiaoren@zte.com.cn>
|
Wewang Xiaorenfine <wang.xiaoren@zte.com.cn>
|
||||||
|
Will Wang <willww64@gmail.com>
|
||||||
William Henry <whenry@redhat.com>
|
William Henry <whenry@redhat.com>
|
||||||
Xianglin Gao <xlgao@zju.edu.cn>
|
Xianglin Gao <xlgao@zju.edu.cn>
|
||||||
Xiaodong Liu <liuxiaodong@loongson.cn>
|
Xiaodong Liu <liuxiaodong@loongson.cn>
|
||||||
|
|
@ -908,3 +942,4 @@ Zhuo Zhi <h.dwwwwww@gmail.com>
|
||||||
Átila Camurça Alves <camurca.home@gmail.com>
|
Átila Camurça Alves <camurca.home@gmail.com>
|
||||||
Александр Менщиков <__Singleton__@hackerdom.ru>
|
Александр Менщиков <__Singleton__@hackerdom.ru>
|
||||||
徐俊杰 <paco.xu@daocloud.io>
|
徐俊杰 <paco.xu@daocloud.io>
|
||||||
|
林博仁 Buo-ren Lin <Buo.Ren.Lin@gmail.com>
|
||||||
|
|
|
||||||
16
vendor/github.com/docker/cli/cli/config/config.go
generated
vendored
16
vendor/github.com/docker/cli/cli/config/config.go
generated
vendored
|
|
@ -13,7 +13,6 @@ import (
|
||||||
"github.com/docker/cli/cli/config/configfile"
|
"github.com/docker/cli/cli/config/configfile"
|
||||||
"github.com/docker/cli/cli/config/credentials"
|
"github.com/docker/cli/cli/config/credentials"
|
||||||
"github.com/docker/cli/cli/config/types"
|
"github.com/docker/cli/cli/config/types"
|
||||||
"github.com/pkg/errors"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
|
@ -58,7 +57,7 @@ func resetConfigDir() {
|
||||||
// getHomeDir is a copy of [pkg/homedir.Get] to prevent adding docker/docker
|
// getHomeDir is a copy of [pkg/homedir.Get] to prevent adding docker/docker
|
||||||
// as dependency for consumers that only need to read the config-file.
|
// as dependency for consumers that only need to read the config-file.
|
||||||
//
|
//
|
||||||
// [pkg/homedir.Get]: https://pkg.go.dev/github.com/docker/docker@v26.1.4+incompatible/pkg/homedir#Get
|
// [pkg/homedir.Get]: https://pkg.go.dev/github.com/docker/docker@v28.0.3+incompatible/pkg/homedir#Get
|
||||||
func getHomeDir() string {
|
func getHomeDir() string {
|
||||||
home, _ := os.UserHomeDir()
|
home, _ := os.UserHomeDir()
|
||||||
if home == "" && runtime.GOOS != "windows" {
|
if home == "" && runtime.GOOS != "windows" {
|
||||||
|
|
@ -69,6 +68,11 @@ func getHomeDir() string {
|
||||||
return home
|
return home
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Provider defines an interface for providing the CLI config.
|
||||||
|
type Provider interface {
|
||||||
|
ConfigFile() *configfile.ConfigFile
|
||||||
|
}
|
||||||
|
|
||||||
// Dir returns the directory the configuration file is stored in
|
// Dir returns the directory the configuration file is stored in
|
||||||
func Dir() string {
|
func Dir() string {
|
||||||
initConfigDir.Do(func() {
|
initConfigDir.Do(func() {
|
||||||
|
|
@ -96,7 +100,7 @@ func SetDir(dir string) {
|
||||||
func Path(p ...string) (string, error) {
|
func Path(p ...string) (string, error) {
|
||||||
path := filepath.Join(append([]string{Dir()}, p...)...)
|
path := filepath.Join(append([]string{Dir()}, p...)...)
|
||||||
if !strings.HasPrefix(path, Dir()+string(filepath.Separator)) {
|
if !strings.HasPrefix(path, Dir()+string(filepath.Separator)) {
|
||||||
return "", errors.Errorf("path %q is outside of root config directory %q", path, Dir())
|
return "", fmt.Errorf("path %q is outside of root config directory %q", path, Dir())
|
||||||
}
|
}
|
||||||
return path, nil
|
return path, nil
|
||||||
}
|
}
|
||||||
|
|
@ -138,12 +142,12 @@ func load(configDir string) (*configfile.ConfigFile, error) {
|
||||||
return configFile, nil
|
return configFile, nil
|
||||||
}
|
}
|
||||||
// Any other error happening when failing to read the file must be returned.
|
// Any other error happening when failing to read the file must be returned.
|
||||||
return configFile, errors.Wrap(err, "loading config file")
|
return configFile, fmt.Errorf("loading config file: %w", err)
|
||||||
}
|
}
|
||||||
defer file.Close()
|
defer func() { _ = file.Close() }()
|
||||||
err = configFile.LoadFromReader(file)
|
err = configFile.LoadFromReader(file)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
err = errors.Wrapf(err, "loading config file: %s: ", filename)
|
err = fmt.Errorf("parsing config file (%s): %w", filename, err)
|
||||||
}
|
}
|
||||||
return configFile, err
|
return configFile, err
|
||||||
}
|
}
|
||||||
|
|
|
||||||
109
vendor/github.com/docker/cli/cli/config/configfile/file.go
generated
vendored
109
vendor/github.com/docker/cli/cli/config/configfile/file.go
generated
vendored
|
|
@ -3,14 +3,16 @@ package configfile
|
||||||
import (
|
import (
|
||||||
"encoding/base64"
|
"encoding/base64"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/docker/cli/cli/config/credentials"
|
"github.com/docker/cli/cli/config/credentials"
|
||||||
|
"github.com/docker/cli/cli/config/memorystore"
|
||||||
"github.com/docker/cli/cli/config/types"
|
"github.com/docker/cli/cli/config/types"
|
||||||
"github.com/pkg/errors"
|
|
||||||
"github.com/sirupsen/logrus"
|
"github.com/sirupsen/logrus"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -36,7 +38,6 @@ type ConfigFile struct {
|
||||||
NodesFormat string `json:"nodesFormat,omitempty"`
|
NodesFormat string `json:"nodesFormat,omitempty"`
|
||||||
PruneFilters []string `json:"pruneFilters,omitempty"`
|
PruneFilters []string `json:"pruneFilters,omitempty"`
|
||||||
Proxies map[string]ProxyConfig `json:"proxies,omitempty"`
|
Proxies map[string]ProxyConfig `json:"proxies,omitempty"`
|
||||||
Experimental string `json:"experimental,omitempty"`
|
|
||||||
CurrentContext string `json:"currentContext,omitempty"`
|
CurrentContext string `json:"currentContext,omitempty"`
|
||||||
CLIPluginsExtraDirs []string `json:"cliPluginsExtraDirs,omitempty"`
|
CLIPluginsExtraDirs []string `json:"cliPluginsExtraDirs,omitempty"`
|
||||||
Plugins map[string]map[string]string `json:"plugins,omitempty"`
|
Plugins map[string]map[string]string `json:"plugins,omitempty"`
|
||||||
|
|
@ -44,6 +45,31 @@ type ConfigFile struct {
|
||||||
Features map[string]string `json:"features,omitempty"`
|
Features map[string]string `json:"features,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type configEnvAuth struct {
|
||||||
|
Auth string `json:"auth"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type configEnv struct {
|
||||||
|
AuthConfigs map[string]configEnvAuth `json:"auths"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// DockerEnvConfigKey is an environment variable that contains a JSON encoded
|
||||||
|
// credential config. It only supports storing the credentials as a base64
|
||||||
|
// encoded string in the format base64("username:pat").
|
||||||
|
//
|
||||||
|
// Adding additional fields will produce a parsing error.
|
||||||
|
//
|
||||||
|
// Example:
|
||||||
|
//
|
||||||
|
// {
|
||||||
|
// "auths": {
|
||||||
|
// "example.test": {
|
||||||
|
// "auth": base64-encoded-username-pat
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
const DockerEnvConfigKey = "DOCKER_AUTH_CONFIG"
|
||||||
|
|
||||||
// ProxyConfig contains proxy configuration settings
|
// ProxyConfig contains proxy configuration settings
|
||||||
type ProxyConfig struct {
|
type ProxyConfig struct {
|
||||||
HTTPProxy string `json:"httpProxy,omitempty"`
|
HTTPProxy string `json:"httpProxy,omitempty"`
|
||||||
|
|
@ -138,7 +164,7 @@ func (configFile *ConfigFile) SaveToWriter(writer io.Writer) error {
|
||||||
// Save encodes and writes out all the authorization information
|
// Save encodes and writes out all the authorization information
|
||||||
func (configFile *ConfigFile) Save() (retErr error) {
|
func (configFile *ConfigFile) Save() (retErr error) {
|
||||||
if configFile.Filename == "" {
|
if configFile.Filename == "" {
|
||||||
return errors.Errorf("Can't save config with empty filename")
|
return errors.New("can't save config with empty filename")
|
||||||
}
|
}
|
||||||
|
|
||||||
dir := filepath.Dir(configFile.Filename)
|
dir := filepath.Dir(configFile.Filename)
|
||||||
|
|
@ -150,7 +176,8 @@ func (configFile *ConfigFile) Save() (retErr error) {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
defer func() {
|
defer func() {
|
||||||
temp.Close()
|
// ignore error as the file may already be closed when we reach this.
|
||||||
|
_ = temp.Close()
|
||||||
if retErr != nil {
|
if retErr != nil {
|
||||||
if err := os.Remove(temp.Name()); err != nil {
|
if err := os.Remove(temp.Name()); err != nil {
|
||||||
logrus.WithError(err).WithField("file", temp.Name()).Debug("Error cleaning up temp file")
|
logrus.WithError(err).WithField("file", temp.Name()).Debug("Error cleaning up temp file")
|
||||||
|
|
@ -164,13 +191,19 @@ func (configFile *ConfigFile) Save() (retErr error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := temp.Close(); err != nil {
|
if err := temp.Close(); err != nil {
|
||||||
return errors.Wrap(err, "error closing temp file")
|
return fmt.Errorf("error closing temp file: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Handle situation where the configfile is a symlink
|
// Handle situation where the configfile is a symlink, and allow for dangling symlinks
|
||||||
cfgFile := configFile.Filename
|
cfgFile := configFile.Filename
|
||||||
if f, err := os.Readlink(cfgFile); err == nil {
|
if f, err := filepath.EvalSymlinks(cfgFile); err == nil {
|
||||||
cfgFile = f
|
cfgFile = f
|
||||||
|
} else if os.IsNotExist(err) {
|
||||||
|
// extract the path from the error if the configfile does not exist or is a dangling symlink
|
||||||
|
var pathError *os.PathError
|
||||||
|
if errors.As(err, &pathError) {
|
||||||
|
cfgFile = pathError.Path
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Try copying the current config file (if any) ownership and permissions
|
// Try copying the current config file (if any) ownership and permissions
|
||||||
|
|
@ -242,11 +275,11 @@ func decodeAuth(authStr string) (string, string, error) {
|
||||||
return "", "", err
|
return "", "", err
|
||||||
}
|
}
|
||||||
if n > decLen {
|
if n > decLen {
|
||||||
return "", "", errors.Errorf("Something went wrong decoding auth config")
|
return "", "", errors.New("something went wrong decoding auth config")
|
||||||
}
|
}
|
||||||
userName, password, ok := strings.Cut(string(decoded), ":")
|
userName, password, ok := strings.Cut(string(decoded), ":")
|
||||||
if !ok || userName == "" {
|
if !ok || userName == "" {
|
||||||
return "", "", errors.Errorf("Invalid auth configuration file")
|
return "", "", errors.New("invalid auth configuration file")
|
||||||
}
|
}
|
||||||
return userName, strings.Trim(password, "\x00"), nil
|
return userName, strings.Trim(password, "\x00"), nil
|
||||||
}
|
}
|
||||||
|
|
@ -254,10 +287,64 @@ func decodeAuth(authStr string) (string, string, error) {
|
||||||
// GetCredentialsStore returns a new credentials store from the settings in the
|
// GetCredentialsStore returns a new credentials store from the settings in the
|
||||||
// configuration file
|
// configuration file
|
||||||
func (configFile *ConfigFile) GetCredentialsStore(registryHostname string) credentials.Store {
|
func (configFile *ConfigFile) GetCredentialsStore(registryHostname string) credentials.Store {
|
||||||
|
store := credentials.NewFileStore(configFile)
|
||||||
|
|
||||||
if helper := getConfiguredCredentialStore(configFile, registryHostname); helper != "" {
|
if helper := getConfiguredCredentialStore(configFile, registryHostname); helper != "" {
|
||||||
return newNativeStore(configFile, helper)
|
store = newNativeStore(configFile, helper)
|
||||||
}
|
}
|
||||||
return credentials.NewFileStore(configFile)
|
|
||||||
|
envConfig := os.Getenv(DockerEnvConfigKey)
|
||||||
|
if envConfig == "" {
|
||||||
|
return store
|
||||||
|
}
|
||||||
|
|
||||||
|
authConfig, err := parseEnvConfig(envConfig)
|
||||||
|
if err != nil {
|
||||||
|
_, _ = fmt.Fprintln(os.Stderr, "Failed to create credential store from DOCKER_AUTH_CONFIG: ", err)
|
||||||
|
return store
|
||||||
|
}
|
||||||
|
|
||||||
|
// use DOCKER_AUTH_CONFIG if set
|
||||||
|
// it uses the native or file store as a fallback to fetch and store credentials
|
||||||
|
envStore, err := memorystore.New(
|
||||||
|
memorystore.WithAuthConfig(authConfig),
|
||||||
|
memorystore.WithFallbackStore(store),
|
||||||
|
)
|
||||||
|
if err != nil {
|
||||||
|
_, _ = fmt.Fprintln(os.Stderr, "Failed to create credential store from DOCKER_AUTH_CONFIG: ", err)
|
||||||
|
return store
|
||||||
|
}
|
||||||
|
|
||||||
|
return envStore
|
||||||
|
}
|
||||||
|
|
||||||
|
func parseEnvConfig(v string) (map[string]types.AuthConfig, error) {
|
||||||
|
envConfig := &configEnv{}
|
||||||
|
decoder := json.NewDecoder(strings.NewReader(v))
|
||||||
|
decoder.DisallowUnknownFields()
|
||||||
|
if err := decoder.Decode(envConfig); err != nil && !errors.Is(err, io.EOF) {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if decoder.More() {
|
||||||
|
return nil, errors.New("DOCKER_AUTH_CONFIG does not support more than one JSON object")
|
||||||
|
}
|
||||||
|
|
||||||
|
authConfigs := make(map[string]types.AuthConfig)
|
||||||
|
for addr, envAuth := range envConfig.AuthConfigs {
|
||||||
|
if envAuth.Auth == "" {
|
||||||
|
return nil, fmt.Errorf("DOCKER_AUTH_CONFIG environment variable is missing key `auth` for %s", addr)
|
||||||
|
}
|
||||||
|
username, password, err := decodeAuth(envAuth.Auth)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
authConfigs[addr] = types.AuthConfig{
|
||||||
|
Username: username,
|
||||||
|
Password: password,
|
||||||
|
ServerAddress: addr,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return authConfigs, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// var for unit testing.
|
// var for unit testing.
|
||||||
|
|
|
||||||
50
vendor/github.com/docker/cli/cli/config/credentials/file_store.go
generated
vendored
50
vendor/github.com/docker/cli/cli/config/credentials/file_store.go
generated
vendored
|
|
@ -1,9 +1,12 @@
|
||||||
package credentials
|
package credentials
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
"net"
|
"net"
|
||||||
"net/url"
|
"net/url"
|
||||||
|
"os"
|
||||||
"strings"
|
"strings"
|
||||||
|
"sync/atomic"
|
||||||
|
|
||||||
"github.com/docker/cli/cli/config/types"
|
"github.com/docker/cli/cli/config/types"
|
||||||
)
|
)
|
||||||
|
|
@ -25,8 +28,13 @@ func NewFileStore(file store) Store {
|
||||||
return &fileStore{file: file}
|
return &fileStore{file: file}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Erase removes the given credentials from the file store.
|
// Erase removes the given credentials from the file store.This function is
|
||||||
|
// idempotent and does not update the file if credentials did not change.
|
||||||
func (c *fileStore) Erase(serverAddress string) error {
|
func (c *fileStore) Erase(serverAddress string) error {
|
||||||
|
if _, exists := c.file.GetAuthConfigs()[serverAddress]; !exists {
|
||||||
|
// nothing to do; no credentials found for the given serverAddress
|
||||||
|
return nil
|
||||||
|
}
|
||||||
delete(c.file.GetAuthConfigs(), serverAddress)
|
delete(c.file.GetAuthConfigs(), serverAddress)
|
||||||
return c.file.Save()
|
return c.file.Save()
|
||||||
}
|
}
|
||||||
|
|
@ -52,19 +60,43 @@ func (c *fileStore) GetAll() (map[string]types.AuthConfig, error) {
|
||||||
return c.file.GetAuthConfigs(), nil
|
return c.file.GetAuthConfigs(), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Store saves the given credentials in the file store.
|
// unencryptedWarning warns the user when using an insecure credential storage.
|
||||||
|
// After a deprecation period, user will get prompted if stdin and stderr are a terminal.
|
||||||
|
// Otherwise, we'll assume they want it (sadly), because people may have been scripting
|
||||||
|
// insecure logins and we don't want to break them. Maybe they'll see the warning in their
|
||||||
|
// logs and fix things.
|
||||||
|
const unencryptedWarning = `
|
||||||
|
WARNING! Your credentials are stored unencrypted in '%s'.
|
||||||
|
Configure a credential helper to remove this warning. See
|
||||||
|
https://docs.docker.com/go/credential-store/
|
||||||
|
`
|
||||||
|
|
||||||
|
// alreadyPrinted ensures that we only print the unencryptedWarning once per
|
||||||
|
// CLI invocation (no need to warn the user multiple times per command).
|
||||||
|
var alreadyPrinted atomic.Bool
|
||||||
|
|
||||||
|
// Store saves the given credentials in the file store. This function is
|
||||||
|
// idempotent and does not update the file if credentials did not change.
|
||||||
func (c *fileStore) Store(authConfig types.AuthConfig) error {
|
func (c *fileStore) Store(authConfig types.AuthConfig) error {
|
||||||
authConfigs := c.file.GetAuthConfigs()
|
authConfigs := c.file.GetAuthConfigs()
|
||||||
|
if oldAuthConfig, ok := authConfigs[authConfig.ServerAddress]; ok && oldAuthConfig == authConfig {
|
||||||
|
// Credentials didn't change, so skip updating the configuration file.
|
||||||
|
return nil
|
||||||
|
}
|
||||||
authConfigs[authConfig.ServerAddress] = authConfig
|
authConfigs[authConfig.ServerAddress] = authConfig
|
||||||
return c.file.Save()
|
if err := c.file.Save(); err != nil {
|
||||||
}
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
func (c *fileStore) GetFilename() string {
|
if !alreadyPrinted.Load() && authConfig.Password != "" {
|
||||||
return c.file.GetFilename()
|
// Display a warning if we're storing the users password (not a token).
|
||||||
}
|
//
|
||||||
|
// FIXME(thaJeztah): make output configurable instead of hardcoding to os.Stderr
|
||||||
|
_, _ = fmt.Fprintln(os.Stderr, fmt.Sprintf(unencryptedWarning, c.file.GetFilename()))
|
||||||
|
alreadyPrinted.Store(true)
|
||||||
|
}
|
||||||
|
|
||||||
func (c *fileStore) IsFileStore() bool {
|
return nil
|
||||||
return true
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// ConvertToHostname converts a registry url which has http|https prepended
|
// ConvertToHostname converts a registry url which has http|https prepended
|
||||||
|
|
|
||||||
131
vendor/github.com/docker/cli/cli/config/memorystore/store.go
generated
vendored
Normal file
131
vendor/github.com/docker/cli/cli/config/memorystore/store.go
generated
vendored
Normal file
|
|
@ -0,0 +1,131 @@
|
||||||
|
// FIXME(thaJeztah): remove once we are a module; the go:build directive prevents go from downgrading language version to go1.16:
|
||||||
|
//go:build go1.24
|
||||||
|
|
||||||
|
package memorystore
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"maps"
|
||||||
|
"os"
|
||||||
|
"sync"
|
||||||
|
|
||||||
|
"github.com/docker/cli/cli/config/credentials"
|
||||||
|
"github.com/docker/cli/cli/config/types"
|
||||||
|
)
|
||||||
|
|
||||||
|
// notFoundErr is the error returned when a plugin could not be found.
|
||||||
|
type notFoundErr string
|
||||||
|
|
||||||
|
func (notFoundErr) NotFound() {}
|
||||||
|
|
||||||
|
func (e notFoundErr) Error() string {
|
||||||
|
return string(e)
|
||||||
|
}
|
||||||
|
|
||||||
|
var errValueNotFound notFoundErr = "value not found"
|
||||||
|
|
||||||
|
type Config struct {
|
||||||
|
lock sync.RWMutex
|
||||||
|
memoryCredentials map[string]types.AuthConfig
|
||||||
|
fallbackStore credentials.Store
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *Config) Erase(serverAddress string) error {
|
||||||
|
e.lock.Lock()
|
||||||
|
defer e.lock.Unlock()
|
||||||
|
delete(e.memoryCredentials, serverAddress)
|
||||||
|
|
||||||
|
if e.fallbackStore != nil {
|
||||||
|
err := e.fallbackStore.Erase(serverAddress)
|
||||||
|
if err != nil {
|
||||||
|
_, _ = fmt.Fprintln(os.Stderr, "memorystore: ", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *Config) Get(serverAddress string) (types.AuthConfig, error) {
|
||||||
|
e.lock.RLock()
|
||||||
|
defer e.lock.RUnlock()
|
||||||
|
authConfig, ok := e.memoryCredentials[serverAddress]
|
||||||
|
if !ok {
|
||||||
|
if e.fallbackStore != nil {
|
||||||
|
return e.fallbackStore.Get(serverAddress)
|
||||||
|
}
|
||||||
|
return types.AuthConfig{}, errValueNotFound
|
||||||
|
}
|
||||||
|
return authConfig, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *Config) GetAll() (map[string]types.AuthConfig, error) {
|
||||||
|
e.lock.RLock()
|
||||||
|
defer e.lock.RUnlock()
|
||||||
|
creds := make(map[string]types.AuthConfig)
|
||||||
|
|
||||||
|
if e.fallbackStore != nil {
|
||||||
|
fileCredentials, err := e.fallbackStore.GetAll()
|
||||||
|
if err != nil {
|
||||||
|
_, _ = fmt.Fprintln(os.Stderr, "memorystore: ", err)
|
||||||
|
} else {
|
||||||
|
creds = fileCredentials
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
maps.Copy(creds, e.memoryCredentials)
|
||||||
|
return creds, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *Config) Store(authConfig types.AuthConfig) error {
|
||||||
|
e.lock.Lock()
|
||||||
|
defer e.lock.Unlock()
|
||||||
|
e.memoryCredentials[authConfig.ServerAddress] = authConfig
|
||||||
|
|
||||||
|
if e.fallbackStore != nil {
|
||||||
|
return e.fallbackStore.Store(authConfig)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithFallbackStore sets a fallback store.
|
||||||
|
//
|
||||||
|
// Write operations will be performed on both the memory store and the
|
||||||
|
// fallback store.
|
||||||
|
//
|
||||||
|
// Read operations will first check the memory store, and if the credential
|
||||||
|
// is not found, it will then check the fallback store.
|
||||||
|
//
|
||||||
|
// Retrieving all credentials will return from both the memory store and the
|
||||||
|
// fallback store, merging the results from both stores into a single map.
|
||||||
|
//
|
||||||
|
// Data stored in the memory store will take precedence over data in the
|
||||||
|
// fallback store.
|
||||||
|
func WithFallbackStore(store credentials.Store) Options {
|
||||||
|
return func(s *Config) error {
|
||||||
|
s.fallbackStore = store
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithAuthConfig allows to set the initial credentials in the memory store.
|
||||||
|
func WithAuthConfig(config map[string]types.AuthConfig) Options {
|
||||||
|
return func(s *Config) error {
|
||||||
|
s.memoryCredentials = config
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
type Options func(*Config) error
|
||||||
|
|
||||||
|
// New creates a new in memory credential store
|
||||||
|
func New(opts ...Options) (credentials.Store, error) {
|
||||||
|
m := &Config{
|
||||||
|
memoryCredentials: make(map[string]types.AuthConfig),
|
||||||
|
}
|
||||||
|
for _, opt := range opts {
|
||||||
|
if err := opt(m); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return m, nil
|
||||||
|
}
|
||||||
5
vendor/github.com/docker/cli/cli/config/types/authconfig.go
generated
vendored
5
vendor/github.com/docker/cli/cli/config/types/authconfig.go
generated
vendored
|
|
@ -6,11 +6,6 @@ type AuthConfig struct {
|
||||||
Password string `json:"password,omitempty"`
|
Password string `json:"password,omitempty"`
|
||||||
Auth string `json:"auth,omitempty"`
|
Auth string `json:"auth,omitempty"`
|
||||||
|
|
||||||
// Email is an optional value associated with the username.
|
|
||||||
// This field is deprecated and will be removed in a later
|
|
||||||
// version of docker.
|
|
||||||
Email string `json:"email,omitempty"`
|
|
||||||
|
|
||||||
ServerAddress string `json:"serveraddress,omitempty"`
|
ServerAddress string `json:"serveraddress,omitempty"`
|
||||||
|
|
||||||
// IdentityToken is used to authenticate the user and get
|
// IdentityToken is used to authenticate the user and get
|
||||||
|
|
|
||||||
35
vendor/github.com/docker/cli/cli/connhelper/commandconn/commandconn.go
generated
vendored
35
vendor/github.com/docker/cli/cli/connhelper/commandconn/commandconn.go
generated
vendored
|
|
@ -28,23 +28,32 @@ import (
|
||||||
"syscall"
|
"syscall"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/pkg/errors"
|
|
||||||
"github.com/sirupsen/logrus"
|
"github.com/sirupsen/logrus"
|
||||||
)
|
)
|
||||||
|
|
||||||
// New returns net.Conn
|
// New returns net.Conn
|
||||||
func New(_ context.Context, cmd string, args ...string) (net.Conn, error) {
|
func New(ctx context.Context, cmd string, args ...string) (net.Conn, error) {
|
||||||
var (
|
// Don't kill the ssh process if the context is cancelled. Killing the
|
||||||
c commandConn
|
// ssh process causes an error when go's http.Client tries to reuse the
|
||||||
err error
|
// net.Conn (commandConn).
|
||||||
)
|
//
|
||||||
c.cmd = exec.Command(cmd, args...)
|
// Not passing down the Context might seem counter-intuitive, but in this
|
||||||
|
// case, the lifetime of the process should be managed by the http.Client,
|
||||||
|
// not the caller's Context.
|
||||||
|
//
|
||||||
|
// Further details;;
|
||||||
|
//
|
||||||
|
// - https://github.com/docker/cli/pull/3900
|
||||||
|
// - https://github.com/docker/compose/issues/9448#issuecomment-1264263721
|
||||||
|
ctx = context.WithoutCancel(ctx)
|
||||||
|
c := commandConn{cmd: exec.CommandContext(ctx, cmd, args...)}
|
||||||
// we assume that args never contains sensitive information
|
// we assume that args never contains sensitive information
|
||||||
logrus.Debugf("commandconn: starting %s with %v", cmd, args)
|
logrus.Debugf("commandconn: starting %s with %v", cmd, args)
|
||||||
c.cmd.Env = os.Environ()
|
c.cmd.Env = os.Environ()
|
||||||
c.cmd.SysProcAttr = &syscall.SysProcAttr{}
|
c.cmd.SysProcAttr = &syscall.SysProcAttr{}
|
||||||
setPdeathsig(c.cmd)
|
setPdeathsig(c.cmd)
|
||||||
createSession(c.cmd)
|
createSession(c.cmd)
|
||||||
|
var err error
|
||||||
c.stdin, err = c.cmd.StdinPipe()
|
c.stdin, err = c.cmd.StdinPipe()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
|
@ -139,7 +148,7 @@ func (c *commandConn) handleEOF(err error) error {
|
||||||
c.stderrMu.Lock()
|
c.stderrMu.Lock()
|
||||||
stderr := c.stderr.String()
|
stderr := c.stderr.String()
|
||||||
c.stderrMu.Unlock()
|
c.stderrMu.Unlock()
|
||||||
return errors.Errorf("command %v did not exit after %v: stderr=%q", c.cmd.Args, err, stderr)
|
return fmt.Errorf("command %v did not exit after %v: stderr=%q", c.cmd.Args, err, stderr)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -149,7 +158,7 @@ func (c *commandConn) handleEOF(err error) error {
|
||||||
c.stderrMu.Lock()
|
c.stderrMu.Lock()
|
||||||
stderr := c.stderr.String()
|
stderr := c.stderr.String()
|
||||||
c.stderrMu.Unlock()
|
c.stderrMu.Unlock()
|
||||||
return errors.Errorf("command %v has exited with %v, make sure the URL is valid, and Docker 18.09 or later is installed on the remote host: stderr=%s", c.cmd.Args, werr, stderr)
|
return fmt.Errorf("command %v has exited with %v, make sure the URL is valid, and Docker 18.09 or later is installed on the remote host: stderr=%s", c.cmd.Args, werr, stderr)
|
||||||
}
|
}
|
||||||
|
|
||||||
func ignorableCloseError(err error) bool {
|
func ignorableCloseError(err error) bool {
|
||||||
|
|
@ -224,11 +233,9 @@ func (c *commandConn) Close() error {
|
||||||
defer c.closing.Store(false)
|
defer c.closing.Store(false)
|
||||||
|
|
||||||
if err := c.CloseRead(); err != nil {
|
if err := c.CloseRead(); err != nil {
|
||||||
logrus.Warnf("commandConn.Close: CloseRead: %v", err)
|
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if err := c.CloseWrite(); err != nil {
|
if err := c.CloseWrite(); err != nil {
|
||||||
logrus.Warnf("commandConn.Close: CloseWrite: %v", err)
|
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -243,17 +250,17 @@ func (c *commandConn) RemoteAddr() net.Addr {
|
||||||
return c.remoteAddr
|
return c.remoteAddr
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *commandConn) SetDeadline(t time.Time) error {
|
func (*commandConn) SetDeadline(t time.Time) error {
|
||||||
logrus.Debugf("unimplemented call: SetDeadline(%v)", t)
|
logrus.Debugf("unimplemented call: SetDeadline(%v)", t)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *commandConn) SetReadDeadline(t time.Time) error {
|
func (*commandConn) SetReadDeadline(t time.Time) error {
|
||||||
logrus.Debugf("unimplemented call: SetReadDeadline(%v)", t)
|
logrus.Debugf("unimplemented call: SetReadDeadline(%v)", t)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *commandConn) SetWriteDeadline(t time.Time) error {
|
func (*commandConn) SetWriteDeadline(t time.Time) error {
|
||||||
logrus.Debugf("unimplemented call: SetWriteDeadline(%v)", t)
|
logrus.Debugf("unimplemented call: SetWriteDeadline(%v)", t)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
|
||||||
37
vendor/github.com/docker/cli/cli/connhelper/connhelper.go
generated
vendored
37
vendor/github.com/docker/cli/cli/connhelper/connhelper.go
generated
vendored
|
|
@ -3,13 +3,13 @@ package connhelper
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"fmt"
|
||||||
"net"
|
"net"
|
||||||
"net/url"
|
"net/url"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/docker/cli/cli/connhelper/commandconn"
|
"github.com/docker/cli/cli/connhelper/commandconn"
|
||||||
"github.com/docker/cli/cli/connhelper/ssh"
|
"github.com/docker/cli/cli/connhelper/ssh"
|
||||||
"github.com/pkg/errors"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// ConnectionHelper allows to connect to a remote host with custom stream provider binary.
|
// ConnectionHelper allows to connect to a remote host with custom stream provider binary.
|
||||||
|
|
@ -41,19 +41,25 @@ func getConnectionHelper(daemonURL string, sshFlags []string) (*ConnectionHelper
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
if u.Scheme == "ssh" {
|
if u.Scheme == "ssh" {
|
||||||
sp, err := ssh.ParseURL(daemonURL)
|
sp, err := ssh.NewSpec(u)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, errors.Wrap(err, "ssh host connection is not valid")
|
return nil, fmt.Errorf("ssh host connection is not valid: %w", err)
|
||||||
|
}
|
||||||
|
sshFlags = addSSHTimeout(sshFlags)
|
||||||
|
sshFlags = disablePseudoTerminalAllocation(sshFlags)
|
||||||
|
|
||||||
|
remoteCommand := []string{"docker", "system", "dial-stdio"}
|
||||||
|
socketPath := sp.Path
|
||||||
|
if strings.Trim(sp.Path, "/") != "" {
|
||||||
|
remoteCommand = []string{"docker", "--host=unix://" + socketPath, "system", "dial-stdio"}
|
||||||
|
}
|
||||||
|
sshArgs, err := sp.Command(sshFlags, remoteCommand...)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
}
|
}
|
||||||
return &ConnectionHelper{
|
return &ConnectionHelper{
|
||||||
Dialer: func(ctx context.Context, network, addr string) (net.Conn, error) {
|
Dialer: func(ctx context.Context, network, addr string) (net.Conn, error) {
|
||||||
args := []string{"docker"}
|
return commandconn.New(ctx, "ssh", sshArgs...)
|
||||||
if sp.Path != "" {
|
|
||||||
args = append(args, "--host", "unix://"+sp.Path)
|
|
||||||
}
|
|
||||||
sshFlags = addSSHTimeout(sshFlags)
|
|
||||||
args = append(args, "system", "dial-stdio")
|
|
||||||
return commandconn.New(ctx, "ssh", append(sshFlags, sp.Args(args...)...)...)
|
|
||||||
},
|
},
|
||||||
Host: "http://docker.example.com",
|
Host: "http://docker.example.com",
|
||||||
}, nil
|
}, nil
|
||||||
|
|
@ -79,3 +85,14 @@ func addSSHTimeout(sshFlags []string) []string {
|
||||||
}
|
}
|
||||||
return sshFlags
|
return sshFlags
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// disablePseudoTerminalAllocation disables pseudo-terminal allocation to
|
||||||
|
// prevent SSH from executing as a login shell
|
||||||
|
func disablePseudoTerminalAllocation(sshFlags []string) []string {
|
||||||
|
for _, flag := range sshFlags {
|
||||||
|
if flag == "-T" {
|
||||||
|
return sshFlags
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return append(sshFlags, "-T")
|
||||||
|
}
|
||||||
|
|
|
||||||
27
vendor/github.com/docker/cli/cli/connhelper/internal/syntax/LICENSE
generated
vendored
Normal file
27
vendor/github.com/docker/cli/cli/connhelper/internal/syntax/LICENSE
generated
vendored
Normal file
|
|
@ -0,0 +1,27 @@
|
||||||
|
Copyright (c) 2016, Daniel Martí. All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions are
|
||||||
|
met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer.
|
||||||
|
* Redistributions in binary form must reproduce the above
|
||||||
|
copyright notice, this list of conditions and the following disclaimer
|
||||||
|
in the documentation and/or other materials provided with the
|
||||||
|
distribution.
|
||||||
|
* Neither the name of the copyright holder nor the names of its
|
||||||
|
contributors may be used to endorse or promote products derived from
|
||||||
|
this software without specific prior written permission.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
13
vendor/github.com/docker/cli/cli/connhelper/internal/syntax/doc.go
generated
vendored
Normal file
13
vendor/github.com/docker/cli/cli/connhelper/internal/syntax/doc.go
generated
vendored
Normal file
|
|
@ -0,0 +1,13 @@
|
||||||
|
// Package syntax is a fork of [mvdan.cc/sh/v3@v3.10.0/syntax].
|
||||||
|
//
|
||||||
|
// Copyright (c) 2016, Daniel Martí. All rights reserved.
|
||||||
|
//
|
||||||
|
// It is a reduced set of the package to only provide the [Quote] function,
|
||||||
|
// and contains the [LICENSE], [quote.go] and [parser.go] files at the given
|
||||||
|
// revision.
|
||||||
|
//
|
||||||
|
// [quote.go]: https://raw.githubusercontent.com/mvdan/sh/refs/tags/v3.10.0/syntax/quote.go
|
||||||
|
// [parser.go]: https://raw.githubusercontent.com/mvdan/sh/refs/tags/v3.10.0/syntax/parser.go
|
||||||
|
// [LICENSE]: https://raw.githubusercontent.com/mvdan/sh/refs/tags/v3.10.0/LICENSE
|
||||||
|
// [mvdan.cc/sh/v3@v3.10.0/syntax]: https://pkg.go.dev/mvdan.cc/sh/v3@v3.10.0/syntax
|
||||||
|
package syntax
|
||||||
95
vendor/github.com/docker/cli/cli/connhelper/internal/syntax/parser.go
generated
vendored
Normal file
95
vendor/github.com/docker/cli/cli/connhelper/internal/syntax/parser.go
generated
vendored
Normal file
|
|
@ -0,0 +1,95 @@
|
||||||
|
// Copyright (c) 2016, Daniel Martí <mvdan@mvdan.cc>
|
||||||
|
// See LICENSE for licensing information
|
||||||
|
|
||||||
|
package syntax
|
||||||
|
|
||||||
|
// LangVariant describes a shell language variant to use when tokenizing and
|
||||||
|
// parsing shell code. The zero value is [LangBash].
|
||||||
|
type LangVariant int
|
||||||
|
|
||||||
|
const (
|
||||||
|
// LangBash corresponds to the GNU Bash language, as described in its
|
||||||
|
// manual at https://www.gnu.org/software/bash/manual/bash.html.
|
||||||
|
//
|
||||||
|
// We currently follow Bash version 5.2.
|
||||||
|
//
|
||||||
|
// Its string representation is "bash".
|
||||||
|
LangBash LangVariant = iota
|
||||||
|
|
||||||
|
// LangPOSIX corresponds to the POSIX Shell language, as described at
|
||||||
|
// https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html.
|
||||||
|
//
|
||||||
|
// Its string representation is "posix" or "sh".
|
||||||
|
LangPOSIX
|
||||||
|
|
||||||
|
// LangMirBSDKorn corresponds to the MirBSD Korn Shell, also known as
|
||||||
|
// mksh, as described at http://www.mirbsd.org/htman/i386/man1/mksh.htm.
|
||||||
|
// Note that it shares some features with Bash, due to the shared
|
||||||
|
// ancestry that is ksh.
|
||||||
|
//
|
||||||
|
// We currently follow mksh version 59.
|
||||||
|
//
|
||||||
|
// Its string representation is "mksh".
|
||||||
|
LangMirBSDKorn
|
||||||
|
|
||||||
|
// LangBats corresponds to the Bash Automated Testing System language,
|
||||||
|
// as described at https://github.com/bats-core/bats-core. Note that
|
||||||
|
// it's just a small extension of the Bash language.
|
||||||
|
//
|
||||||
|
// Its string representation is "bats".
|
||||||
|
LangBats
|
||||||
|
|
||||||
|
// LangAuto corresponds to automatic language detection,
|
||||||
|
// commonly used by end-user applications like shfmt,
|
||||||
|
// which can guess a file's language variant given its filename or shebang.
|
||||||
|
//
|
||||||
|
// At this time, [Variant] does not support LangAuto.
|
||||||
|
LangAuto
|
||||||
|
)
|
||||||
|
|
||||||
|
func (l LangVariant) String() string {
|
||||||
|
switch l {
|
||||||
|
case LangBash:
|
||||||
|
return "bash"
|
||||||
|
case LangPOSIX:
|
||||||
|
return "posix"
|
||||||
|
case LangMirBSDKorn:
|
||||||
|
return "mksh"
|
||||||
|
case LangBats:
|
||||||
|
return "bats"
|
||||||
|
case LangAuto:
|
||||||
|
return "auto"
|
||||||
|
}
|
||||||
|
return "unknown shell language variant"
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsKeyword returns true if the given word is part of the language keywords.
|
||||||
|
func IsKeyword(word string) bool {
|
||||||
|
// This list has been copied from the bash 5.1 source code, file y.tab.c +4460
|
||||||
|
switch word {
|
||||||
|
case
|
||||||
|
"!",
|
||||||
|
"[[", // only if COND_COMMAND is defined
|
||||||
|
"]]", // only if COND_COMMAND is defined
|
||||||
|
"case",
|
||||||
|
"coproc", // only if COPROCESS_SUPPORT is defined
|
||||||
|
"do",
|
||||||
|
"done",
|
||||||
|
"else",
|
||||||
|
"esac",
|
||||||
|
"fi",
|
||||||
|
"for",
|
||||||
|
"function",
|
||||||
|
"if",
|
||||||
|
"in",
|
||||||
|
"select", // only if SELECT_COMMAND is defined
|
||||||
|
"then",
|
||||||
|
"time", // only if COMMAND_TIMING is defined
|
||||||
|
"until",
|
||||||
|
"while",
|
||||||
|
"{",
|
||||||
|
"}":
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
187
vendor/github.com/docker/cli/cli/connhelper/internal/syntax/quote.go
generated
vendored
Normal file
187
vendor/github.com/docker/cli/cli/connhelper/internal/syntax/quote.go
generated
vendored
Normal file
|
|
@ -0,0 +1,187 @@
|
||||||
|
// Copyright (c) 2021, Daniel Martí <mvdan@mvdan.cc>
|
||||||
|
// See LICENSE for licensing information
|
||||||
|
|
||||||
|
package syntax
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"strings"
|
||||||
|
"unicode"
|
||||||
|
"unicode/utf8"
|
||||||
|
)
|
||||||
|
|
||||||
|
type QuoteError struct {
|
||||||
|
ByteOffset int
|
||||||
|
Message string
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e QuoteError) Error() string {
|
||||||
|
return fmt.Sprintf("cannot quote character at byte %d: %s", e.ByteOffset, e.Message)
|
||||||
|
}
|
||||||
|
|
||||||
|
const (
|
||||||
|
quoteErrNull = "shell strings cannot contain null bytes"
|
||||||
|
quoteErrPOSIX = "POSIX shell lacks escape sequences"
|
||||||
|
quoteErrRange = "rune out of range"
|
||||||
|
quoteErrMksh = "mksh cannot escape codepoints above 16 bits"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Quote returns a quoted version of the input string,
|
||||||
|
// so that the quoted version is expanded or interpreted
|
||||||
|
// as the original string in the given language variant.
|
||||||
|
//
|
||||||
|
// Quoting is necessary when using arbitrary literal strings
|
||||||
|
// as words in a shell script or command.
|
||||||
|
// Without quoting, one can run into syntax errors,
|
||||||
|
// as well as the possibility of running unintended code.
|
||||||
|
//
|
||||||
|
// An error is returned when a string cannot be quoted for a variant.
|
||||||
|
// For instance, POSIX lacks escape sequences for non-printable characters,
|
||||||
|
// and no language variant can represent a string containing null bytes.
|
||||||
|
// In such cases, the returned error type will be *QuoteError.
|
||||||
|
//
|
||||||
|
// The quoting strategy is chosen on a best-effort basis,
|
||||||
|
// to minimize the amount of extra bytes necessary.
|
||||||
|
//
|
||||||
|
// Some strings do not require any quoting and are returned unchanged.
|
||||||
|
// Those strings can be directly surrounded in single quotes as well.
|
||||||
|
//
|
||||||
|
//nolint:gocyclo // ignore "cyclomatic complexity 35 of func `Quote` is high (> 16) (gocyclo)"
|
||||||
|
func Quote(s string, lang LangVariant) (string, error) {
|
||||||
|
if s == "" {
|
||||||
|
// Special case; an empty string must always be quoted,
|
||||||
|
// as otherwise it expands to zero fields.
|
||||||
|
return "''", nil
|
||||||
|
}
|
||||||
|
shellChars := false
|
||||||
|
nonPrintable := false
|
||||||
|
offs := 0
|
||||||
|
for rem := s; len(rem) > 0; {
|
||||||
|
r, size := utf8.DecodeRuneInString(rem)
|
||||||
|
switch r {
|
||||||
|
// Like regOps; token characters.
|
||||||
|
case ';', '"', '\'', '(', ')', '$', '|', '&', '>', '<', '`',
|
||||||
|
// Whitespace; might result in multiple fields.
|
||||||
|
' ', '\t', '\r', '\n',
|
||||||
|
// Escape sequences would be expanded.
|
||||||
|
'\\',
|
||||||
|
// Would start a comment unless quoted.
|
||||||
|
'#',
|
||||||
|
// Might result in brace expansion.
|
||||||
|
'{',
|
||||||
|
// Might result in tilde expansion.
|
||||||
|
'~',
|
||||||
|
// Might result in globbing.
|
||||||
|
'*', '?', '[',
|
||||||
|
// Might result in an assignment.
|
||||||
|
'=':
|
||||||
|
shellChars = true
|
||||||
|
case '\x00':
|
||||||
|
return "", &QuoteError{ByteOffset: offs, Message: quoteErrNull}
|
||||||
|
}
|
||||||
|
if r == utf8.RuneError || !unicode.IsPrint(r) {
|
||||||
|
if lang == LangPOSIX {
|
||||||
|
return "", &QuoteError{ByteOffset: offs, Message: quoteErrPOSIX}
|
||||||
|
}
|
||||||
|
nonPrintable = true
|
||||||
|
}
|
||||||
|
rem = rem[size:]
|
||||||
|
offs += size
|
||||||
|
}
|
||||||
|
if !shellChars && !nonPrintable && !IsKeyword(s) {
|
||||||
|
// Nothing to quote; avoid allocating.
|
||||||
|
return s, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Single quotes are usually best,
|
||||||
|
// as they don't require any escaping of characters.
|
||||||
|
// If we have any invalid utf8 or non-printable runes,
|
||||||
|
// use $'' so that we can escape them.
|
||||||
|
// Note that we can't use double quotes for those.
|
||||||
|
var b strings.Builder
|
||||||
|
if nonPrintable {
|
||||||
|
b.WriteString("$'")
|
||||||
|
lastRequoteIfHex := false
|
||||||
|
offs = 0
|
||||||
|
for rem := s; len(rem) > 0; {
|
||||||
|
nextRequoteIfHex := false
|
||||||
|
r, size := utf8.DecodeRuneInString(rem)
|
||||||
|
switch {
|
||||||
|
case r == '\'', r == '\\':
|
||||||
|
b.WriteByte('\\')
|
||||||
|
b.WriteRune(r)
|
||||||
|
case unicode.IsPrint(r) && r != utf8.RuneError:
|
||||||
|
if lastRequoteIfHex && isHex(r) {
|
||||||
|
b.WriteString("'$'")
|
||||||
|
}
|
||||||
|
b.WriteRune(r)
|
||||||
|
case r == '\a':
|
||||||
|
b.WriteString(`\a`)
|
||||||
|
case r == '\b':
|
||||||
|
b.WriteString(`\b`)
|
||||||
|
case r == '\f':
|
||||||
|
b.WriteString(`\f`)
|
||||||
|
case r == '\n':
|
||||||
|
b.WriteString(`\n`)
|
||||||
|
case r == '\r':
|
||||||
|
b.WriteString(`\r`)
|
||||||
|
case r == '\t':
|
||||||
|
b.WriteString(`\t`)
|
||||||
|
case r == '\v':
|
||||||
|
b.WriteString(`\v`)
|
||||||
|
case r < utf8.RuneSelf, r == utf8.RuneError && size == 1:
|
||||||
|
// \xXX, fixed at two hexadecimal characters.
|
||||||
|
fmt.Fprintf(&b, "\\x%02x", rem[0])
|
||||||
|
// Unfortunately, mksh allows \x to consume more hex characters.
|
||||||
|
// Ensure that we don't allow it to read more than two.
|
||||||
|
if lang == LangMirBSDKorn {
|
||||||
|
nextRequoteIfHex = true
|
||||||
|
}
|
||||||
|
case r > utf8.MaxRune:
|
||||||
|
// Not a valid Unicode code point?
|
||||||
|
return "", &QuoteError{ByteOffset: offs, Message: quoteErrRange}
|
||||||
|
case lang == LangMirBSDKorn && r > 0xFFFD:
|
||||||
|
// From the CAVEATS section in R59's man page:
|
||||||
|
//
|
||||||
|
// mksh currently uses OPTU-16 internally, which is the same as
|
||||||
|
// UTF-8 and CESU-8 with 0000..FFFD being valid codepoints.
|
||||||
|
return "", &QuoteError{ByteOffset: offs, Message: quoteErrMksh}
|
||||||
|
case r < 0x10000:
|
||||||
|
// \uXXXX, fixed at four hexadecimal characters.
|
||||||
|
fmt.Fprintf(&b, "\\u%04x", r)
|
||||||
|
default:
|
||||||
|
// \UXXXXXXXX, fixed at eight hexadecimal characters.
|
||||||
|
fmt.Fprintf(&b, "\\U%08x", r)
|
||||||
|
}
|
||||||
|
rem = rem[size:]
|
||||||
|
lastRequoteIfHex = nextRequoteIfHex
|
||||||
|
offs += size
|
||||||
|
}
|
||||||
|
b.WriteString("'")
|
||||||
|
return b.String(), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Single quotes without any need for escaping.
|
||||||
|
if !strings.Contains(s, "'") {
|
||||||
|
return "'" + s + "'", nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// The string contains single quotes,
|
||||||
|
// so fall back to double quotes.
|
||||||
|
b.WriteByte('"')
|
||||||
|
for _, r := range s {
|
||||||
|
switch r {
|
||||||
|
case '"', '\\', '`', '$':
|
||||||
|
b.WriteByte('\\')
|
||||||
|
}
|
||||||
|
b.WriteRune(r)
|
||||||
|
}
|
||||||
|
b.WriteByte('"')
|
||||||
|
return b.String(), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func isHex(r rune) bool {
|
||||||
|
return (r >= '0' && r <= '9') ||
|
||||||
|
(r >= 'a' && r <= 'f') ||
|
||||||
|
(r >= 'A' && r <= 'F')
|
||||||
|
}
|
||||||
150
vendor/github.com/docker/cli/cli/connhelper/ssh/ssh.go
generated
vendored
150
vendor/github.com/docker/cli/cli/connhelper/ssh/ssh.go
generated
vendored
|
|
@ -2,19 +2,48 @@
|
||||||
package ssh
|
package ssh
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
"net/url"
|
"net/url"
|
||||||
|
|
||||||
"github.com/pkg/errors"
|
"github.com/docker/cli/cli/connhelper/internal/syntax"
|
||||||
)
|
)
|
||||||
|
|
||||||
// ParseURL parses URL
|
// ParseURL creates a [Spec] from the given ssh URL. It returns an error if
|
||||||
|
// the URL is using the wrong scheme, contains fragments, query-parameters,
|
||||||
|
// or contains a password.
|
||||||
func ParseURL(daemonURL string) (*Spec, error) {
|
func ParseURL(daemonURL string) (*Spec, error) {
|
||||||
u, err := url.Parse(daemonURL)
|
u, err := url.Parse(daemonURL)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
var urlErr *url.Error
|
||||||
|
if errors.As(err, &urlErr) {
|
||||||
|
err = urlErr.Unwrap()
|
||||||
|
}
|
||||||
|
return nil, fmt.Errorf("invalid SSH URL: %w", err)
|
||||||
|
}
|
||||||
|
return NewSpec(u)
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewSpec creates a [Spec] from the given ssh URL's properties. It returns
|
||||||
|
// an error if the URL is using the wrong scheme, contains fragments,
|
||||||
|
// query-parameters, or contains a password.
|
||||||
|
func NewSpec(sshURL *url.URL) (*Spec, error) {
|
||||||
|
s, err := newSpec(sshURL)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("invalid SSH URL: %w", err)
|
||||||
|
}
|
||||||
|
return s, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func newSpec(u *url.URL) (*Spec, error) {
|
||||||
|
if u == nil {
|
||||||
|
return nil, errors.New("URL is nil")
|
||||||
|
}
|
||||||
|
if u.Scheme == "" {
|
||||||
|
return nil, errors.New("no scheme provided")
|
||||||
}
|
}
|
||||||
if u.Scheme != "ssh" {
|
if u.Scheme != "ssh" {
|
||||||
return nil, errors.Errorf("expected scheme ssh, got %q", u.Scheme)
|
return nil, errors.New("incorrect scheme: " + u.Scheme)
|
||||||
}
|
}
|
||||||
|
|
||||||
var sp Spec
|
var sp Spec
|
||||||
|
|
@ -27,17 +56,18 @@ func ParseURL(daemonURL string) (*Spec, error) {
|
||||||
}
|
}
|
||||||
sp.Host = u.Hostname()
|
sp.Host = u.Hostname()
|
||||||
if sp.Host == "" {
|
if sp.Host == "" {
|
||||||
return nil, errors.Errorf("no host specified")
|
return nil, errors.New("hostname is empty")
|
||||||
}
|
}
|
||||||
sp.Port = u.Port()
|
sp.Port = u.Port()
|
||||||
sp.Path = u.Path
|
sp.Path = u.Path
|
||||||
if u.RawQuery != "" {
|
if u.RawQuery != "" {
|
||||||
return nil, errors.Errorf("extra query after the host: %q", u.RawQuery)
|
return nil, fmt.Errorf("query parameters are not allowed: %q", u.RawQuery)
|
||||||
}
|
}
|
||||||
if u.Fragment != "" {
|
if u.Fragment != "" {
|
||||||
return nil, errors.Errorf("extra fragment after the host: %q", u.Fragment)
|
return nil, fmt.Errorf("fragments are not allowed: %q", u.Fragment)
|
||||||
}
|
}
|
||||||
return &sp, err
|
|
||||||
|
return &sp, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Spec of SSH URL
|
// Spec of SSH URL
|
||||||
|
|
@ -48,16 +78,106 @@ type Spec struct {
|
||||||
Path string
|
Path string
|
||||||
}
|
}
|
||||||
|
|
||||||
// Args returns args except "ssh" itself combined with optional additional command args
|
// Args returns args except "ssh" itself combined with optional additional
|
||||||
func (sp *Spec) Args(add ...string) []string {
|
// command and args to be executed on the remote host. It attempts to quote
|
||||||
|
// the given arguments to account for ssh executing the remote command in a
|
||||||
|
// shell. It returns nil when unable to quote the remote command.
|
||||||
|
func (sp *Spec) Args(remoteCommandAndArgs ...string) []string {
|
||||||
|
// Format the remote command to run using the ssh connection, quoting
|
||||||
|
// values where needed because ssh executes these in a POSIX shell.
|
||||||
|
remoteCommand, err := quoteCommand(remoteCommandAndArgs...)
|
||||||
|
if err != nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
sshArgs, err := sp.args()
|
||||||
|
if err != nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
if remoteCommand != "" {
|
||||||
|
sshArgs = append(sshArgs, remoteCommand)
|
||||||
|
}
|
||||||
|
return sshArgs
|
||||||
|
}
|
||||||
|
|
||||||
|
func (sp *Spec) args(sshFlags ...string) ([]string, error) {
|
||||||
var args []string
|
var args []string
|
||||||
|
if sp.Host == "" {
|
||||||
|
return nil, errors.New("no host specified")
|
||||||
|
}
|
||||||
if sp.User != "" {
|
if sp.User != "" {
|
||||||
args = append(args, "-l", sp.User)
|
// Quote user, as it's obtained from the URL.
|
||||||
|
usr, err := syntax.Quote(sp.User, syntax.LangPOSIX)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("invalid user: %w", err)
|
||||||
|
}
|
||||||
|
args = append(args, "-l", usr)
|
||||||
}
|
}
|
||||||
if sp.Port != "" {
|
if sp.Port != "" {
|
||||||
args = append(args, "-p", sp.Port)
|
// Quote port, as it's obtained from the URL.
|
||||||
|
port, err := syntax.Quote(sp.Port, syntax.LangPOSIX)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("invalid port: %w", err)
|
||||||
}
|
}
|
||||||
args = append(args, "--", sp.Host)
|
args = append(args, "-p", port)
|
||||||
args = append(args, add...)
|
}
|
||||||
return args
|
|
||||||
|
// We consider "sshFlags" to be "trusted", and set from code only,
|
||||||
|
// as they are not parsed from the DOCKER_HOST URL.
|
||||||
|
args = append(args, sshFlags...)
|
||||||
|
|
||||||
|
host, err := syntax.Quote(sp.Host, syntax.LangPOSIX)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("invalid host: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return append(args, "--", host), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Command returns the ssh flags and arguments to execute a command
|
||||||
|
// (remoteCommandAndArgs) on the remote host. Where needed, it quotes
|
||||||
|
// values passed in remoteCommandAndArgs to account for ssh executing
|
||||||
|
// the remote command in a shell. It returns an error if no remote command
|
||||||
|
// is passed, or when unable to quote the remote command.
|
||||||
|
//
|
||||||
|
// Important: to preserve backward-compatibility, Command does not currently
|
||||||
|
// perform sanitization or quoting on the sshFlags and callers are expected
|
||||||
|
// to sanitize this argument.
|
||||||
|
func (sp *Spec) Command(sshFlags []string, remoteCommandAndArgs ...string) ([]string, error) {
|
||||||
|
if len(remoteCommandAndArgs) == 0 {
|
||||||
|
return nil, errors.New("no remote command specified")
|
||||||
|
}
|
||||||
|
sshArgs, err := sp.args(sshFlags...)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
remoteCommand, err := quoteCommand(remoteCommandAndArgs...)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if remoteCommand != "" {
|
||||||
|
sshArgs = append(sshArgs, remoteCommand)
|
||||||
|
}
|
||||||
|
return sshArgs, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// quoteCommand returns the remote command to run using the ssh connection
|
||||||
|
// as a single string, quoting values where needed because ssh executes
|
||||||
|
// these in a POSIX shell.
|
||||||
|
func quoteCommand(commandAndArgs ...string) (string, error) {
|
||||||
|
var quotedCmd string
|
||||||
|
for i, arg := range commandAndArgs {
|
||||||
|
a, err := syntax.Quote(arg, syntax.LangPOSIX)
|
||||||
|
if err != nil {
|
||||||
|
return "", fmt.Errorf("invalid argument: %w", err)
|
||||||
|
}
|
||||||
|
if i == 0 {
|
||||||
|
quotedCmd = a
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
quotedCmd += " " + a //nolint:perfsprint // ignore "concat-loop"; no need to use a string-builder for this.
|
||||||
|
}
|
||||||
|
// each part is quoted appropriately, so now we'll have a full
|
||||||
|
// shell command to pass off to "ssh"
|
||||||
|
return quotedCmd, nil
|
||||||
}
|
}
|
||||||
|
|
|
||||||
58
vendor/github.com/docker/cli/cli/context/docker/load.go
generated
vendored
58
vendor/github.com/docker/cli/cli/context/docker/load.go
generated
vendored
|
|
@ -4,16 +4,18 @@ import (
|
||||||
"crypto/tls"
|
"crypto/tls"
|
||||||
"crypto/x509"
|
"crypto/x509"
|
||||||
"encoding/pem"
|
"encoding/pem"
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
"net"
|
"net"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/docker/cli/cli/connhelper"
|
"github.com/docker/cli/cli/connhelper"
|
||||||
"github.com/docker/cli/cli/context"
|
"github.com/docker/cli/cli/context"
|
||||||
"github.com/docker/cli/cli/context/store"
|
"github.com/docker/cli/cli/context/store"
|
||||||
"github.com/docker/docker/client"
|
|
||||||
"github.com/docker/go-connections/tlsconfig"
|
"github.com/docker/go-connections/tlsconfig"
|
||||||
"github.com/pkg/errors"
|
"github.com/moby/moby/client"
|
||||||
)
|
)
|
||||||
|
|
||||||
// EndpointMeta is a typed wrapper around a context-store generic endpoint describing
|
// EndpointMeta is a typed wrapper around a context-store generic endpoint describing
|
||||||
|
|
@ -67,7 +69,7 @@ func (ep *Endpoint) tlsConfig() (*tls.Config, error) {
|
||||||
|
|
||||||
x509cert, err := tls.X509KeyPair(ep.TLSData.Cert, keyBytes)
|
x509cert, err := tls.X509KeyPair(ep.TLSData.Cert, keyBytes)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, errors.Wrap(err, "failed to retrieve context tls info")
|
return nil, fmt.Errorf("failed to retrieve context tls info: %w", err)
|
||||||
}
|
}
|
||||||
tlsOpts = append(tlsOpts, func(cfg *tls.Config) {
|
tlsOpts = append(tlsOpts, func(cfg *tls.Config) {
|
||||||
cfg.Certificates = []tls.Certificate{x509cert}
|
cfg.Certificates = []tls.Certificate{x509cert}
|
||||||
|
|
@ -90,14 +92,34 @@ func (ep *Endpoint) ClientOpts() ([]client.Opt, error) {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
if helper == nil {
|
if helper == nil {
|
||||||
|
// Check if we're connecting over a socket, because there's no
|
||||||
|
// need to configure TLS for a socket connection.
|
||||||
|
//
|
||||||
|
// TODO(thaJeztah); make resolveDockerEndpoint and resolveDefaultDockerEndpoint not load TLS data,
|
||||||
|
// and load TLS files lazily; see https://github.com/docker/cli/pull/1581
|
||||||
|
if !isSocket(ep.Host) {
|
||||||
tlsConfig, err := ep.tlsConfig()
|
tlsConfig, err := ep.tlsConfig()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// If there's no tlsConfig available, we use the default HTTPClient.
|
||||||
|
if tlsConfig != nil {
|
||||||
result = append(result,
|
result = append(result,
|
||||||
withHTTPClient(tlsConfig),
|
client.WithHTTPClient(&http.Client{
|
||||||
client.WithHost(ep.Host),
|
Transport: &http.Transport{
|
||||||
|
TLSClientConfig: tlsConfig,
|
||||||
|
DialContext: (&net.Dialer{
|
||||||
|
KeepAlive: 30 * time.Second,
|
||||||
|
Timeout: 30 * time.Second,
|
||||||
|
}).DialContext,
|
||||||
|
},
|
||||||
|
CheckRedirect: client.CheckRedirect,
|
||||||
|
}),
|
||||||
)
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
result = append(result, client.WithHost(ep.Host))
|
||||||
} else {
|
} else {
|
||||||
result = append(result,
|
result = append(result,
|
||||||
client.WithHTTPClient(&http.Client{
|
client.WithHTTPClient(&http.Client{
|
||||||
|
|
@ -116,22 +138,14 @@ func (ep *Endpoint) ClientOpts() ([]client.Opt, error) {
|
||||||
return result, nil
|
return result, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func withHTTPClient(tlsConfig *tls.Config) func(*client.Client) error {
|
// isSocket checks if the given address is a Unix-socket (linux),
|
||||||
return func(c *client.Client) error {
|
// named pipe (Windows), or file-descriptor.
|
||||||
if tlsConfig == nil {
|
func isSocket(addr string) bool {
|
||||||
// Use the default HTTPClient
|
switch proto, _, _ := strings.Cut(addr, "://"); proto {
|
||||||
return nil
|
case "unix", "npipe", "fd":
|
||||||
}
|
return true
|
||||||
return client.WithHTTPClient(&http.Client{
|
default:
|
||||||
Transport: &http.Transport{
|
return false
|
||||||
TLSClientConfig: tlsConfig,
|
|
||||||
DialContext: (&net.Dialer{
|
|
||||||
KeepAlive: 30 * time.Second,
|
|
||||||
Timeout: 30 * time.Second,
|
|
||||||
}).DialContext,
|
|
||||||
},
|
|
||||||
CheckRedirect: client.CheckRedirect,
|
|
||||||
})(c)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -143,7 +157,7 @@ func EndpointFromContext(metadata store.Metadata) (EndpointMeta, error) {
|
||||||
}
|
}
|
||||||
typed, ok := ep.(EndpointMeta)
|
typed, ok := ep.(EndpointMeta)
|
||||||
if !ok {
|
if !ok {
|
||||||
return EndpointMeta{}, errors.Errorf("endpoint %q is not of type EndpointMeta", DockerEndpoint)
|
return EndpointMeta{}, fmt.Errorf("endpoint %q is not of type EndpointMeta", DockerEndpoint)
|
||||||
}
|
}
|
||||||
return typed, nil
|
return typed, nil
|
||||||
}
|
}
|
||||||
|
|
|
||||||
28
vendor/github.com/docker/cli/cli/context/store/errors.go
generated
vendored
Normal file
28
vendor/github.com/docker/cli/cli/context/store/errors.go
generated
vendored
Normal file
|
|
@ -0,0 +1,28 @@
|
||||||
|
package store
|
||||||
|
|
||||||
|
import "github.com/containerd/errdefs"
|
||||||
|
|
||||||
|
func invalidParameter(err error) error {
|
||||||
|
if err == nil || errdefs.IsInvalidArgument(err) {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return invalidParameterErr{err}
|
||||||
|
}
|
||||||
|
|
||||||
|
type invalidParameterErr struct{ error }
|
||||||
|
|
||||||
|
func (invalidParameterErr) InvalidParameter() {}
|
||||||
|
|
||||||
|
func notFound(err error) error {
|
||||||
|
if err == nil || errdefs.IsNotFound(err) {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return notFoundErr{err}
|
||||||
|
}
|
||||||
|
|
||||||
|
type notFoundErr struct{ error }
|
||||||
|
|
||||||
|
func (notFoundErr) NotFound() {}
|
||||||
|
func (e notFoundErr) Unwrap() error {
|
||||||
|
return e.error
|
||||||
|
}
|
||||||
8
vendor/github.com/docker/cli/cli/context/store/io_utils.go
generated
vendored
8
vendor/github.com/docker/cli/cli/context/store/io_utils.go
generated
vendored
|
|
@ -5,14 +5,14 @@ import (
|
||||||
"io"
|
"io"
|
||||||
)
|
)
|
||||||
|
|
||||||
// LimitedReader is a fork of io.LimitedReader to override Read.
|
// limitedReader is a fork of [io.LimitedReader] to override Read.
|
||||||
type LimitedReader struct {
|
type limitedReader struct {
|
||||||
R io.Reader
|
R io.Reader
|
||||||
N int64 // max bytes remaining
|
N int64 // max bytes remaining
|
||||||
}
|
}
|
||||||
|
|
||||||
// Read is a fork of io.LimitedReader.Read that returns an error when limit exceeded.
|
// Read is a fork of [io.LimitedReader.Read] that returns an error when limit exceeded.
|
||||||
func (l *LimitedReader) Read(p []byte) (n int, err error) {
|
func (l *limitedReader) Read(p []byte) (n int, err error) {
|
||||||
if l.N < 0 {
|
if l.N < 0 {
|
||||||
return 0, errors.New("read exceeds the defined limit")
|
return 0, errors.New("read exceeds the defined limit")
|
||||||
}
|
}
|
||||||
|
|
|
||||||
17
vendor/github.com/docker/cli/cli/context/store/metadatastore.go
generated
vendored
17
vendor/github.com/docker/cli/cli/context/store/metadatastore.go
generated
vendored
|
|
@ -1,20 +1,19 @@
|
||||||
// FIXME(thaJeztah): remove once we are a module; the go:build directive prevents go from downgrading language version to go1.16:
|
// FIXME(thaJeztah): remove once we are a module; the go:build directive prevents go from downgrading language version to go1.16:
|
||||||
//go:build go1.21
|
//go:build go1.24
|
||||||
|
|
||||||
package store
|
package store
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"reflect"
|
"reflect"
|
||||||
"sort"
|
"sort"
|
||||||
|
|
||||||
"github.com/docker/docker/errdefs"
|
|
||||||
"github.com/docker/docker/pkg/ioutils"
|
|
||||||
"github.com/fvbommel/sortorder"
|
"github.com/fvbommel/sortorder"
|
||||||
"github.com/pkg/errors"
|
"github.com/moby/sys/atomicwriter"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
|
@ -40,7 +39,7 @@ func (s *metadataStore) createOrUpdate(meta Metadata) error {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
return ioutils.AtomicWriteFile(filepath.Join(contextDir, metaFile), bytes, 0o644)
|
return atomicwriter.WriteFile(filepath.Join(contextDir, metaFile), bytes, 0o644)
|
||||||
}
|
}
|
||||||
|
|
||||||
func parseTypedOrMap(payload []byte, getter TypeGetter) (any, error) {
|
func parseTypedOrMap(payload []byte, getter TypeGetter) (any, error) {
|
||||||
|
|
@ -64,7 +63,7 @@ func parseTypedOrMap(payload []byte, getter TypeGetter) (any, error) {
|
||||||
func (s *metadataStore) get(name string) (Metadata, error) {
|
func (s *metadataStore) get(name string) (Metadata, error) {
|
||||||
m, err := s.getByID(contextdirOf(name))
|
m, err := s.getByID(contextdirOf(name))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return m, errors.Wrapf(err, "context %q", name)
|
return m, fmt.Errorf("context %q: %w", name, err)
|
||||||
}
|
}
|
||||||
return m, nil
|
return m, nil
|
||||||
}
|
}
|
||||||
|
|
@ -74,7 +73,7 @@ func (s *metadataStore) getByID(id contextdir) (Metadata, error) {
|
||||||
bytes, err := os.ReadFile(fileName)
|
bytes, err := os.ReadFile(fileName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if errors.Is(err, os.ErrNotExist) {
|
if errors.Is(err, os.ErrNotExist) {
|
||||||
return Metadata{}, errdefs.NotFound(errors.Wrap(err, "context not found"))
|
return Metadata{}, notFound(fmt.Errorf("context not found: %w", err))
|
||||||
}
|
}
|
||||||
return Metadata{}, err
|
return Metadata{}, err
|
||||||
}
|
}
|
||||||
|
|
@ -99,7 +98,7 @@ func (s *metadataStore) getByID(id contextdir) (Metadata, error) {
|
||||||
|
|
||||||
func (s *metadataStore) remove(name string) error {
|
func (s *metadataStore) remove(name string) error {
|
||||||
if err := os.RemoveAll(s.contextDir(contextdirOf(name))); err != nil {
|
if err := os.RemoveAll(s.contextDir(contextdirOf(name))); err != nil {
|
||||||
return errors.Wrapf(err, "failed to remove metadata")
|
return fmt.Errorf("failed to remove metadata: %w", err)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
@ -119,7 +118,7 @@ func (s *metadataStore) list() ([]Metadata, error) {
|
||||||
if errors.Is(err, os.ErrNotExist) {
|
if errors.Is(err, os.ErrNotExist) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
return nil, errors.Wrap(err, "failed to read metadata")
|
return nil, fmt.Errorf("failed to read metadata: %w", err)
|
||||||
}
|
}
|
||||||
res = append(res, c)
|
res = append(res, c)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
64
vendor/github.com/docker/cli/cli/context/store/store.go
generated
vendored
64
vendor/github.com/docker/cli/cli/context/store/store.go
generated
vendored
|
|
@ -1,5 +1,5 @@
|
||||||
// FIXME(thaJeztah): remove once we are a module; the go:build directive prevents go from downgrading language version to go1.16:
|
// FIXME(thaJeztah): remove once we are a module; the go:build directive prevents go from downgrading language version to go1.16:
|
||||||
//go:build go1.21
|
//go:build go1.24
|
||||||
|
|
||||||
package store
|
package store
|
||||||
|
|
||||||
|
|
@ -10,22 +10,17 @@ import (
|
||||||
"bytes"
|
"bytes"
|
||||||
_ "crypto/sha256" // ensure ids can be computed
|
_ "crypto/sha256" // ensure ids can be computed
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"net/http"
|
"net/http"
|
||||||
"path"
|
"path"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"regexp"
|
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/docker/docker/errdefs"
|
|
||||||
"github.com/opencontainers/go-digest"
|
"github.com/opencontainers/go-digest"
|
||||||
"github.com/pkg/errors"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
const restrictedNamePattern = "^[a-zA-Z0-9][a-zA-Z0-9_.+-]+$"
|
|
||||||
|
|
||||||
var restrictedNameRegEx = regexp.MustCompile(restrictedNamePattern)
|
|
||||||
|
|
||||||
// Store provides a context store for easily remembering endpoints configuration
|
// Store provides a context store for easily remembering endpoints configuration
|
||||||
type Store interface {
|
type Store interface {
|
||||||
Reader
|
Reader
|
||||||
|
|
@ -146,10 +141,10 @@ func (s *ContextStore) CreateOrUpdate(meta Metadata) error {
|
||||||
// Remove deletes the context with the given name, if found.
|
// Remove deletes the context with the given name, if found.
|
||||||
func (s *ContextStore) Remove(name string) error {
|
func (s *ContextStore) Remove(name string) error {
|
||||||
if err := s.meta.remove(name); err != nil {
|
if err := s.meta.remove(name); err != nil {
|
||||||
return errors.Wrapf(err, "failed to remove context %s", name)
|
return fmt.Errorf("failed to remove context %s: %w", name, err)
|
||||||
}
|
}
|
||||||
if err := s.tls.remove(name); err != nil {
|
if err := s.tls.remove(name); err != nil {
|
||||||
return errors.Wrapf(err, "failed to remove context %s", name)
|
return fmt.Errorf("failed to remove context %s: %w", name, err)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
@ -225,12 +220,43 @@ func ValidateContextName(name string) error {
|
||||||
if name == "default" {
|
if name == "default" {
|
||||||
return errors.New(`"default" is a reserved context name`)
|
return errors.New(`"default" is a reserved context name`)
|
||||||
}
|
}
|
||||||
if !restrictedNameRegEx.MatchString(name) {
|
if !isValidName(name) {
|
||||||
return errors.Errorf("context name %q is invalid, names are validated against regexp %q", name, restrictedNamePattern)
|
return fmt.Errorf("context name %q is invalid, names are validated against regexp %q", name, validNameFormat)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// validNameFormat is used as part of errors for invalid context-names.
|
||||||
|
// We should consider making this less technical ("must start with "a-z",
|
||||||
|
// and only consist of alphanumeric characters and separators").
|
||||||
|
const validNameFormat = `^[a-zA-Z0-9][a-zA-Z0-9_.+-]+$`
|
||||||
|
|
||||||
|
// isValidName checks if the context-name is valid ("^[a-zA-Z0-9][a-zA-Z0-9_.+-]+$").
|
||||||
|
//
|
||||||
|
// Names must start with an alphanumeric character (a-zA-Z0-9), followed by
|
||||||
|
// alphanumeric or separators ("_", ".", "+", "-").
|
||||||
|
func isValidName(s string) bool {
|
||||||
|
if len(s) < 2 || !isAlphaNum(s[0]) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
for i := 1; i < len(s); i++ {
|
||||||
|
c := s[i]
|
||||||
|
if isAlphaNum(c) || c == '_' || c == '.' || c == '+' || c == '-' {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
func isAlphaNum(c byte) bool {
|
||||||
|
return (c >= 'a' && c <= 'z') ||
|
||||||
|
(c >= 'A' && c <= 'Z') ||
|
||||||
|
(c >= '0' && c <= '9')
|
||||||
|
}
|
||||||
|
|
||||||
// Export exports an existing namespace into an opaque data stream
|
// Export exports an existing namespace into an opaque data stream
|
||||||
// This stream is actually a tarball containing context metadata and TLS materials, but it does
|
// This stream is actually a tarball containing context metadata and TLS materials, but it does
|
||||||
// not map 1:1 the layout of the context store (don't try to restore it manually without calling store.Import)
|
// not map 1:1 the layout of the context store (don't try to restore it manually without calling store.Import)
|
||||||
|
|
@ -356,7 +382,7 @@ func isValidFilePath(p string) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
func importTar(name string, s Writer, reader io.Reader) error {
|
func importTar(name string, s Writer, reader io.Reader) error {
|
||||||
tr := tar.NewReader(&LimitedReader{R: reader, N: maxAllowedFileSizeToImport})
|
tr := tar.NewReader(&limitedReader{R: reader, N: maxAllowedFileSizeToImport})
|
||||||
tlsData := ContextTLSData{
|
tlsData := ContextTLSData{
|
||||||
Endpoints: map[string]EndpointTLSData{},
|
Endpoints: map[string]EndpointTLSData{},
|
||||||
}
|
}
|
||||||
|
|
@ -374,7 +400,7 @@ func importTar(name string, s Writer, reader io.Reader) error {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if err := isValidFilePath(hdr.Name); err != nil {
|
if err := isValidFilePath(hdr.Name); err != nil {
|
||||||
return errors.Wrap(err, hdr.Name)
|
return fmt.Errorf("%s: %w", hdr.Name, err)
|
||||||
}
|
}
|
||||||
if hdr.Name == metaFile {
|
if hdr.Name == metaFile {
|
||||||
data, err := io.ReadAll(tr)
|
data, err := io.ReadAll(tr)
|
||||||
|
|
@ -400,13 +426,13 @@ func importTar(name string, s Writer, reader io.Reader) error {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if !importedMetaFile {
|
if !importedMetaFile {
|
||||||
return errdefs.InvalidParameter(errors.New("invalid context: no metadata found"))
|
return invalidParameter(errors.New("invalid context: no metadata found"))
|
||||||
}
|
}
|
||||||
return s.ResetTLSMaterial(name, &tlsData)
|
return s.ResetTLSMaterial(name, &tlsData)
|
||||||
}
|
}
|
||||||
|
|
||||||
func importZip(name string, s Writer, reader io.Reader) error {
|
func importZip(name string, s Writer, reader io.Reader) error {
|
||||||
body, err := io.ReadAll(&LimitedReader{R: reader, N: maxAllowedFileSizeToImport})
|
body, err := io.ReadAll(&limitedReader{R: reader, N: maxAllowedFileSizeToImport})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
@ -426,7 +452,7 @@ func importZip(name string, s Writer, reader io.Reader) error {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if err := isValidFilePath(zf.Name); err != nil {
|
if err := isValidFilePath(zf.Name); err != nil {
|
||||||
return errors.Wrap(err, zf.Name)
|
return fmt.Errorf("%s: %w", zf.Name, err)
|
||||||
}
|
}
|
||||||
if zf.Name == metaFile {
|
if zf.Name == metaFile {
|
||||||
f, err := zf.Open()
|
f, err := zf.Open()
|
||||||
|
|
@ -434,7 +460,7 @@ func importZip(name string, s Writer, reader io.Reader) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
data, err := io.ReadAll(&LimitedReader{R: f, N: maxAllowedFileSizeToImport})
|
data, err := io.ReadAll(&limitedReader{R: f, N: maxAllowedFileSizeToImport})
|
||||||
defer f.Close()
|
defer f.Close()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
|
@ -464,7 +490,7 @@ func importZip(name string, s Writer, reader io.Reader) error {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if !importedMetaFile {
|
if !importedMetaFile {
|
||||||
return errdefs.InvalidParameter(errors.New("invalid context: no metadata found"))
|
return invalidParameter(errors.New("invalid context: no metadata found"))
|
||||||
}
|
}
|
||||||
return s.ResetTLSMaterial(name, &tlsData)
|
return s.ResetTLSMaterial(name, &tlsData)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
2
vendor/github.com/docker/cli/cli/context/store/storeconfig.go
generated
vendored
2
vendor/github.com/docker/cli/cli/context/store/storeconfig.go
generated
vendored
|
|
@ -1,5 +1,5 @@
|
||||||
// FIXME(thaJeztah): remove once we are a module; the go:build directive prevents go from downgrading language version to go1.16:
|
// FIXME(thaJeztah): remove once we are a module; the go:build directive prevents go from downgrading language version to go1.16:
|
||||||
//go:build go1.21
|
//go:build go1.24
|
||||||
|
|
||||||
package store
|
package store
|
||||||
|
|
||||||
|
|
|
||||||
19
vendor/github.com/docker/cli/cli/context/store/tlsstore.go
generated
vendored
19
vendor/github.com/docker/cli/cli/context/store/tlsstore.go
generated
vendored
|
|
@ -1,12 +1,11 @@
|
||||||
package store
|
package store
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
|
||||||
"github.com/docker/docker/errdefs"
|
"github.com/moby/sys/atomicwriter"
|
||||||
"github.com/docker/docker/pkg/ioutils"
|
|
||||||
"github.com/pkg/errors"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
const tlsDir = "tls"
|
const tlsDir = "tls"
|
||||||
|
|
@ -32,16 +31,16 @@ func (s *tlsStore) createOrUpdate(name, endpointName, filename string, data []by
|
||||||
if err := os.MkdirAll(endpointDir, 0o700); err != nil {
|
if err := os.MkdirAll(endpointDir, 0o700); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
return ioutils.AtomicWriteFile(filepath.Join(endpointDir, filename), data, 0o600)
|
return atomicwriter.WriteFile(filepath.Join(endpointDir, filename), data, 0o600)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *tlsStore) getData(name, endpointName, filename string) ([]byte, error) {
|
func (s *tlsStore) getData(name, endpointName, filename string) ([]byte, error) {
|
||||||
data, err := os.ReadFile(filepath.Join(s.endpointDir(name, endpointName), filename))
|
data, err := os.ReadFile(filepath.Join(s.endpointDir(name, endpointName), filename))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if os.IsNotExist(err) {
|
if os.IsNotExist(err) {
|
||||||
return nil, errdefs.NotFound(errors.Errorf("TLS data for %s/%s/%s does not exist", name, endpointName, filename))
|
return nil, notFound(fmt.Errorf("TLS data for %s/%s/%s does not exist", name, endpointName, filename))
|
||||||
}
|
}
|
||||||
return nil, errors.Wrapf(err, "failed to read TLS data for endpoint %s", endpointName)
|
return nil, fmt.Errorf("failed to read TLS data for endpoint %s: %w", endpointName, err)
|
||||||
}
|
}
|
||||||
return data, nil
|
return data, nil
|
||||||
}
|
}
|
||||||
|
|
@ -49,14 +48,14 @@ func (s *tlsStore) getData(name, endpointName, filename string) ([]byte, error)
|
||||||
// remove deletes all TLS data for the given context.
|
// remove deletes all TLS data for the given context.
|
||||||
func (s *tlsStore) remove(name string) error {
|
func (s *tlsStore) remove(name string) error {
|
||||||
if err := os.RemoveAll(s.contextDir(name)); err != nil {
|
if err := os.RemoveAll(s.contextDir(name)); err != nil {
|
||||||
return errors.Wrapf(err, "failed to remove TLS data")
|
return fmt.Errorf("failed to remove TLS data: %w", err)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *tlsStore) removeEndpoint(name, endpointName string) error {
|
func (s *tlsStore) removeEndpoint(name, endpointName string) error {
|
||||||
if err := os.RemoveAll(s.endpointDir(name, endpointName)); err != nil {
|
if err := os.RemoveAll(s.endpointDir(name, endpointName)); err != nil {
|
||||||
return errors.Wrapf(err, "failed to remove TLS data for endpoint %s", endpointName)
|
return fmt.Errorf("failed to remove TLS data for endpoint %s: %w", endpointName, err)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
@ -68,7 +67,7 @@ func (s *tlsStore) listContextData(name string) (map[string]EndpointFiles, error
|
||||||
if os.IsNotExist(err) {
|
if os.IsNotExist(err) {
|
||||||
return map[string]EndpointFiles{}, nil
|
return map[string]EndpointFiles{}, nil
|
||||||
}
|
}
|
||||||
return nil, errors.Wrapf(err, "failed to list TLS files for context %s", name)
|
return nil, fmt.Errorf("failed to list TLS files for context %s: %w", name, err)
|
||||||
}
|
}
|
||||||
r := make(map[string]EndpointFiles)
|
r := make(map[string]EndpointFiles)
|
||||||
for _, epFS := range epFSs {
|
for _, epFS := range epFSs {
|
||||||
|
|
@ -78,7 +77,7 @@ func (s *tlsStore) listContextData(name string) (map[string]EndpointFiles, error
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, errors.Wrapf(err, "failed to list TLS files for endpoint %s", epFS.Name())
|
return nil, fmt.Errorf("failed to list TLS files for endpoint %s: %w", epFS.Name(), err)
|
||||||
}
|
}
|
||||||
var files EndpointFiles
|
var files EndpointFiles
|
||||||
for _, fs := range fss {
|
for _, fs := range fss {
|
||||||
|
|
|
||||||
6
vendor/github.com/docker/cli/cli/context/tlsdata.go
generated
vendored
6
vendor/github.com/docker/cli/cli/context/tlsdata.go
generated
vendored
|
|
@ -1,10 +1,10 @@
|
||||||
package context
|
package context
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
|
|
||||||
"github.com/docker/cli/cli/context/store"
|
"github.com/docker/cli/cli/context/store"
|
||||||
"github.com/pkg/errors"
|
|
||||||
"github.com/sirupsen/logrus"
|
"github.com/sirupsen/logrus"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -45,14 +45,14 @@ func (data *TLSData) ToStoreTLSData() *store.EndpointTLSData {
|
||||||
func LoadTLSData(s store.Reader, contextName, endpointName string) (*TLSData, error) {
|
func LoadTLSData(s store.Reader, contextName, endpointName string) (*TLSData, error) {
|
||||||
tlsFiles, err := s.ListTLSFiles(contextName)
|
tlsFiles, err := s.ListTLSFiles(contextName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, errors.Wrapf(err, "failed to retrieve TLS files for context %q", contextName)
|
return nil, fmt.Errorf("failed to retrieve TLS files for context %q: %w", contextName, err)
|
||||||
}
|
}
|
||||||
if epTLSFiles, ok := tlsFiles[endpointName]; ok {
|
if epTLSFiles, ok := tlsFiles[endpointName]; ok {
|
||||||
var tlsData TLSData
|
var tlsData TLSData
|
||||||
for _, f := range epTLSFiles {
|
for _, f := range epTLSFiles {
|
||||||
data, err := s.GetTLSData(contextName, endpointName, f)
|
data, err := s.GetTLSData(contextName, endpointName, f)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, errors.Wrapf(err, "failed to retrieve TLS data (%s) for context %q", f, contextName)
|
return nil, fmt.Errorf("failed to retrieve TLS data (%s) for context %q: %w", f, contextName, err)
|
||||||
}
|
}
|
||||||
switch f {
|
switch f {
|
||||||
case caKey:
|
case caKey:
|
||||||
|
|
|
||||||
69
vendor/github.com/docker/docker/errdefs/defs.go
generated
vendored
69
vendor/github.com/docker/docker/errdefs/defs.go
generated
vendored
|
|
@ -1,69 +0,0 @@
|
||||||
package errdefs
|
|
||||||
|
|
||||||
// ErrNotFound signals that the requested object doesn't exist
|
|
||||||
type ErrNotFound interface {
|
|
||||||
NotFound()
|
|
||||||
}
|
|
||||||
|
|
||||||
// ErrInvalidParameter signals that the user input is invalid
|
|
||||||
type ErrInvalidParameter interface {
|
|
||||||
InvalidParameter()
|
|
||||||
}
|
|
||||||
|
|
||||||
// ErrConflict signals that some internal state conflicts with the requested action and can't be performed.
|
|
||||||
// A change in state should be able to clear this error.
|
|
||||||
type ErrConflict interface {
|
|
||||||
Conflict()
|
|
||||||
}
|
|
||||||
|
|
||||||
// ErrUnauthorized is used to signify that the user is not authorized to perform a specific action
|
|
||||||
type ErrUnauthorized interface {
|
|
||||||
Unauthorized()
|
|
||||||
}
|
|
||||||
|
|
||||||
// ErrUnavailable signals that the requested action/subsystem is not available.
|
|
||||||
type ErrUnavailable interface {
|
|
||||||
Unavailable()
|
|
||||||
}
|
|
||||||
|
|
||||||
// ErrForbidden signals that the requested action cannot be performed under any circumstances.
|
|
||||||
// When a ErrForbidden is returned, the caller should never retry the action.
|
|
||||||
type ErrForbidden interface {
|
|
||||||
Forbidden()
|
|
||||||
}
|
|
||||||
|
|
||||||
// ErrSystem signals that some internal error occurred.
|
|
||||||
// An example of this would be a failed mount request.
|
|
||||||
type ErrSystem interface {
|
|
||||||
System()
|
|
||||||
}
|
|
||||||
|
|
||||||
// ErrNotModified signals that an action can't be performed because it's already in the desired state
|
|
||||||
type ErrNotModified interface {
|
|
||||||
NotModified()
|
|
||||||
}
|
|
||||||
|
|
||||||
// ErrNotImplemented signals that the requested action/feature is not implemented on the system as configured.
|
|
||||||
type ErrNotImplemented interface {
|
|
||||||
NotImplemented()
|
|
||||||
}
|
|
||||||
|
|
||||||
// ErrUnknown signals that the kind of error that occurred is not known.
|
|
||||||
type ErrUnknown interface {
|
|
||||||
Unknown()
|
|
||||||
}
|
|
||||||
|
|
||||||
// ErrCancelled signals that the action was cancelled.
|
|
||||||
type ErrCancelled interface {
|
|
||||||
Cancelled()
|
|
||||||
}
|
|
||||||
|
|
||||||
// ErrDeadline signals that the deadline was reached before the action completed.
|
|
||||||
type ErrDeadline interface {
|
|
||||||
DeadlineExceeded()
|
|
||||||
}
|
|
||||||
|
|
||||||
// ErrDataLoss indicates that data was lost or there is data corruption.
|
|
||||||
type ErrDataLoss interface {
|
|
||||||
DataLoss()
|
|
||||||
}
|
|
||||||
8
vendor/github.com/docker/docker/errdefs/doc.go
generated
vendored
8
vendor/github.com/docker/docker/errdefs/doc.go
generated
vendored
|
|
@ -1,8 +0,0 @@
|
||||||
// Package errdefs defines a set of error interfaces that packages should use for communicating classes of errors.
|
|
||||||
// Errors that cross the package boundary should implement one (and only one) of these interfaces.
|
|
||||||
//
|
|
||||||
// Packages should not reference these interfaces directly, only implement them.
|
|
||||||
// To check if a particular error implements one of these interfaces, there are helper
|
|
||||||
// functions provided (e.g. `Is<SomeError>`) which can be used rather than asserting the interfaces directly.
|
|
||||||
// If you must assert on these interfaces, be sure to check the causal chain (`err.Unwrap()`).
|
|
||||||
package errdefs
|
|
||||||
309
vendor/github.com/docker/docker/errdefs/helpers.go
generated
vendored
309
vendor/github.com/docker/docker/errdefs/helpers.go
generated
vendored
|
|
@ -1,309 +0,0 @@
|
||||||
package errdefs
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
|
|
||||||
cerrdefs "github.com/containerd/errdefs"
|
|
||||||
)
|
|
||||||
|
|
||||||
type errNotFound struct{ error }
|
|
||||||
|
|
||||||
func (errNotFound) NotFound() {}
|
|
||||||
|
|
||||||
func (e errNotFound) Cause() error {
|
|
||||||
return e.error
|
|
||||||
}
|
|
||||||
|
|
||||||
func (e errNotFound) Unwrap() error {
|
|
||||||
return e.error
|
|
||||||
}
|
|
||||||
|
|
||||||
// NotFound creates an [ErrNotFound] error from the given error.
|
|
||||||
// It returns the error as-is if it is either nil (no error) or already implements
|
|
||||||
// [ErrNotFound],
|
|
||||||
func NotFound(err error) error {
|
|
||||||
if err == nil || cerrdefs.IsNotFound(err) {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return errNotFound{err}
|
|
||||||
}
|
|
||||||
|
|
||||||
type errInvalidParameter struct{ error }
|
|
||||||
|
|
||||||
func (errInvalidParameter) InvalidParameter() {}
|
|
||||||
|
|
||||||
func (e errInvalidParameter) Cause() error {
|
|
||||||
return e.error
|
|
||||||
}
|
|
||||||
|
|
||||||
func (e errInvalidParameter) Unwrap() error {
|
|
||||||
return e.error
|
|
||||||
}
|
|
||||||
|
|
||||||
// InvalidParameter creates an [ErrInvalidParameter] error from the given error.
|
|
||||||
// It returns the error as-is if it is either nil (no error) or already implements
|
|
||||||
// [ErrInvalidParameter],
|
|
||||||
func InvalidParameter(err error) error {
|
|
||||||
if err == nil || cerrdefs.IsInvalidArgument(err) {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return errInvalidParameter{err}
|
|
||||||
}
|
|
||||||
|
|
||||||
type errConflict struct{ error }
|
|
||||||
|
|
||||||
func (errConflict) Conflict() {}
|
|
||||||
|
|
||||||
func (e errConflict) Cause() error {
|
|
||||||
return e.error
|
|
||||||
}
|
|
||||||
|
|
||||||
func (e errConflict) Unwrap() error {
|
|
||||||
return e.error
|
|
||||||
}
|
|
||||||
|
|
||||||
// Conflict creates an [ErrConflict] error from the given error.
|
|
||||||
// It returns the error as-is if it is either nil (no error) or already implements
|
|
||||||
// [ErrConflict],
|
|
||||||
func Conflict(err error) error {
|
|
||||||
if err == nil || cerrdefs.IsConflict(err) {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return errConflict{err}
|
|
||||||
}
|
|
||||||
|
|
||||||
type errUnauthorized struct{ error }
|
|
||||||
|
|
||||||
func (errUnauthorized) Unauthorized() {}
|
|
||||||
|
|
||||||
func (e errUnauthorized) Cause() error {
|
|
||||||
return e.error
|
|
||||||
}
|
|
||||||
|
|
||||||
func (e errUnauthorized) Unwrap() error {
|
|
||||||
return e.error
|
|
||||||
}
|
|
||||||
|
|
||||||
// Unauthorized creates an [ErrUnauthorized] error from the given error.
|
|
||||||
// It returns the error as-is if it is either nil (no error) or already implements
|
|
||||||
// [ErrUnauthorized],
|
|
||||||
func Unauthorized(err error) error {
|
|
||||||
if err == nil || cerrdefs.IsUnauthorized(err) {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return errUnauthorized{err}
|
|
||||||
}
|
|
||||||
|
|
||||||
type errUnavailable struct{ error }
|
|
||||||
|
|
||||||
func (errUnavailable) Unavailable() {}
|
|
||||||
|
|
||||||
func (e errUnavailable) Cause() error {
|
|
||||||
return e.error
|
|
||||||
}
|
|
||||||
|
|
||||||
func (e errUnavailable) Unwrap() error {
|
|
||||||
return e.error
|
|
||||||
}
|
|
||||||
|
|
||||||
// Unavailable creates an [ErrUnavailable] error from the given error.
|
|
||||||
// It returns the error as-is if it is either nil (no error) or already implements
|
|
||||||
// [ErrUnavailable],
|
|
||||||
func Unavailable(err error) error {
|
|
||||||
if err == nil || cerrdefs.IsUnavailable(err) {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return errUnavailable{err}
|
|
||||||
}
|
|
||||||
|
|
||||||
type errForbidden struct{ error }
|
|
||||||
|
|
||||||
func (errForbidden) Forbidden() {}
|
|
||||||
|
|
||||||
func (e errForbidden) Cause() error {
|
|
||||||
return e.error
|
|
||||||
}
|
|
||||||
|
|
||||||
func (e errForbidden) Unwrap() error {
|
|
||||||
return e.error
|
|
||||||
}
|
|
||||||
|
|
||||||
// Forbidden creates an [ErrForbidden] error from the given error.
|
|
||||||
// It returns the error as-is if it is either nil (no error) or already implements
|
|
||||||
// [ErrForbidden],
|
|
||||||
func Forbidden(err error) error {
|
|
||||||
if err == nil || cerrdefs.IsPermissionDenied(err) {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return errForbidden{err}
|
|
||||||
}
|
|
||||||
|
|
||||||
type errSystem struct{ error }
|
|
||||||
|
|
||||||
func (errSystem) System() {}
|
|
||||||
|
|
||||||
func (e errSystem) Cause() error {
|
|
||||||
return e.error
|
|
||||||
}
|
|
||||||
|
|
||||||
func (e errSystem) Unwrap() error {
|
|
||||||
return e.error
|
|
||||||
}
|
|
||||||
|
|
||||||
// System creates an [ErrSystem] error from the given error.
|
|
||||||
// It returns the error as-is if it is either nil (no error) or already implements
|
|
||||||
// [ErrSystem],
|
|
||||||
func System(err error) error {
|
|
||||||
if err == nil || cerrdefs.IsInternal(err) {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return errSystem{err}
|
|
||||||
}
|
|
||||||
|
|
||||||
type errNotModified struct{ error }
|
|
||||||
|
|
||||||
func (errNotModified) NotModified() {}
|
|
||||||
|
|
||||||
func (e errNotModified) Cause() error {
|
|
||||||
return e.error
|
|
||||||
}
|
|
||||||
|
|
||||||
func (e errNotModified) Unwrap() error {
|
|
||||||
return e.error
|
|
||||||
}
|
|
||||||
|
|
||||||
// NotModified creates an [ErrNotModified] error from the given error.
|
|
||||||
// It returns the error as-is if it is either nil (no error) or already implements
|
|
||||||
// [NotModified],
|
|
||||||
func NotModified(err error) error {
|
|
||||||
if err == nil || cerrdefs.IsNotModified(err) {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return errNotModified{err}
|
|
||||||
}
|
|
||||||
|
|
||||||
type errNotImplemented struct{ error }
|
|
||||||
|
|
||||||
func (errNotImplemented) NotImplemented() {}
|
|
||||||
|
|
||||||
func (e errNotImplemented) Cause() error {
|
|
||||||
return e.error
|
|
||||||
}
|
|
||||||
|
|
||||||
func (e errNotImplemented) Unwrap() error {
|
|
||||||
return e.error
|
|
||||||
}
|
|
||||||
|
|
||||||
// NotImplemented creates an [ErrNotImplemented] error from the given error.
|
|
||||||
// It returns the error as-is if it is either nil (no error) or already implements
|
|
||||||
// [ErrNotImplemented],
|
|
||||||
func NotImplemented(err error) error {
|
|
||||||
if err == nil || cerrdefs.IsNotImplemented(err) {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return errNotImplemented{err}
|
|
||||||
}
|
|
||||||
|
|
||||||
type errUnknown struct{ error }
|
|
||||||
|
|
||||||
func (errUnknown) Unknown() {}
|
|
||||||
|
|
||||||
func (e errUnknown) Cause() error {
|
|
||||||
return e.error
|
|
||||||
}
|
|
||||||
|
|
||||||
func (e errUnknown) Unwrap() error {
|
|
||||||
return e.error
|
|
||||||
}
|
|
||||||
|
|
||||||
// Unknown creates an [ErrUnknown] error from the given error.
|
|
||||||
// It returns the error as-is if it is either nil (no error) or already implements
|
|
||||||
// [ErrUnknown],
|
|
||||||
func Unknown(err error) error {
|
|
||||||
if err == nil || cerrdefs.IsUnknown(err) {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return errUnknown{err}
|
|
||||||
}
|
|
||||||
|
|
||||||
type errCancelled struct{ error }
|
|
||||||
|
|
||||||
func (errCancelled) Cancelled() {}
|
|
||||||
|
|
||||||
func (e errCancelled) Cause() error {
|
|
||||||
return e.error
|
|
||||||
}
|
|
||||||
|
|
||||||
func (e errCancelled) Unwrap() error {
|
|
||||||
return e.error
|
|
||||||
}
|
|
||||||
|
|
||||||
// Cancelled creates an [ErrCancelled] error from the given error.
|
|
||||||
// It returns the error as-is if it is either nil (no error) or already implements
|
|
||||||
// [ErrCancelled],
|
|
||||||
func Cancelled(err error) error {
|
|
||||||
if err == nil || cerrdefs.IsCanceled(err) {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return errCancelled{err}
|
|
||||||
}
|
|
||||||
|
|
||||||
type errDeadline struct{ error }
|
|
||||||
|
|
||||||
func (errDeadline) DeadlineExceeded() {}
|
|
||||||
|
|
||||||
func (e errDeadline) Cause() error {
|
|
||||||
return e.error
|
|
||||||
}
|
|
||||||
|
|
||||||
func (e errDeadline) Unwrap() error {
|
|
||||||
return e.error
|
|
||||||
}
|
|
||||||
|
|
||||||
// Deadline creates an [ErrDeadline] error from the given error.
|
|
||||||
// It returns the error as-is if it is either nil (no error) or already implements
|
|
||||||
// [ErrDeadline],
|
|
||||||
func Deadline(err error) error {
|
|
||||||
if err == nil || cerrdefs.IsDeadlineExceeded(err) {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return errDeadline{err}
|
|
||||||
}
|
|
||||||
|
|
||||||
type errDataLoss struct{ error }
|
|
||||||
|
|
||||||
func (errDataLoss) DataLoss() {}
|
|
||||||
|
|
||||||
func (e errDataLoss) Cause() error {
|
|
||||||
return e.error
|
|
||||||
}
|
|
||||||
|
|
||||||
func (e errDataLoss) Unwrap() error {
|
|
||||||
return e.error
|
|
||||||
}
|
|
||||||
|
|
||||||
// DataLoss creates an [ErrDataLoss] error from the given error.
|
|
||||||
// It returns the error as-is if it is either nil (no error) or already implements
|
|
||||||
// [ErrDataLoss],
|
|
||||||
func DataLoss(err error) error {
|
|
||||||
if err == nil || cerrdefs.IsDataLoss(err) {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return errDataLoss{err}
|
|
||||||
}
|
|
||||||
|
|
||||||
// FromContext returns the error class from the passed in context
|
|
||||||
func FromContext(ctx context.Context) error {
|
|
||||||
e := ctx.Err()
|
|
||||||
if e == nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
if e == context.Canceled {
|
|
||||||
return Cancelled(e)
|
|
||||||
}
|
|
||||||
if e == context.DeadlineExceeded {
|
|
||||||
return Deadline(e)
|
|
||||||
}
|
|
||||||
return Unknown(e)
|
|
||||||
}
|
|
||||||
49
vendor/github.com/docker/docker/errdefs/http_helpers.go
generated
vendored
49
vendor/github.com/docker/docker/errdefs/http_helpers.go
generated
vendored
|
|
@ -1,49 +0,0 @@
|
||||||
package errdefs
|
|
||||||
|
|
||||||
import (
|
|
||||||
"net/http"
|
|
||||||
)
|
|
||||||
|
|
||||||
// FromStatusCode creates an errdef error, based on the provided HTTP status-code
|
|
||||||
//
|
|
||||||
// Deprecated: Use [cerrdefs.ToNative] instead
|
|
||||||
func FromStatusCode(err error, statusCode int) error {
|
|
||||||
if err == nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
switch statusCode {
|
|
||||||
case http.StatusNotFound:
|
|
||||||
return NotFound(err)
|
|
||||||
case http.StatusBadRequest:
|
|
||||||
return InvalidParameter(err)
|
|
||||||
case http.StatusConflict:
|
|
||||||
return Conflict(err)
|
|
||||||
case http.StatusUnauthorized:
|
|
||||||
return Unauthorized(err)
|
|
||||||
case http.StatusServiceUnavailable:
|
|
||||||
return Unavailable(err)
|
|
||||||
case http.StatusForbidden:
|
|
||||||
return Forbidden(err)
|
|
||||||
case http.StatusNotModified:
|
|
||||||
return NotModified(err)
|
|
||||||
case http.StatusNotImplemented:
|
|
||||||
return NotImplemented(err)
|
|
||||||
case http.StatusInternalServerError:
|
|
||||||
if IsCancelled(err) || IsSystem(err) || IsUnknown(err) || IsDataLoss(err) || IsDeadline(err) {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return System(err)
|
|
||||||
default:
|
|
||||||
switch {
|
|
||||||
case statusCode >= http.StatusOK && statusCode < http.StatusBadRequest:
|
|
||||||
// it's a client error
|
|
||||||
return err
|
|
||||||
case statusCode >= http.StatusBadRequest && statusCode < http.StatusInternalServerError:
|
|
||||||
return InvalidParameter(err)
|
|
||||||
case statusCode >= http.StatusInternalServerError && statusCode < 600:
|
|
||||||
return System(err)
|
|
||||||
default:
|
|
||||||
return Unknown(err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
78
vendor/github.com/docker/docker/errdefs/is.go
generated
vendored
78
vendor/github.com/docker/docker/errdefs/is.go
generated
vendored
|
|
@ -1,78 +0,0 @@
|
||||||
package errdefs
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"errors"
|
|
||||||
|
|
||||||
cerrdefs "github.com/containerd/errdefs"
|
|
||||||
)
|
|
||||||
|
|
||||||
// IsNotFound returns if the passed in error is an [ErrNotFound],
|
|
||||||
//
|
|
||||||
// Deprecated: use containerd [cerrdefs.IsNotFound]
|
|
||||||
var IsNotFound = cerrdefs.IsNotFound
|
|
||||||
|
|
||||||
// IsInvalidParameter returns if the passed in error is an [ErrInvalidParameter].
|
|
||||||
//
|
|
||||||
// Deprecated: use containerd [cerrdefs.IsInvalidArgument]
|
|
||||||
var IsInvalidParameter = cerrdefs.IsInvalidArgument
|
|
||||||
|
|
||||||
// IsConflict returns if the passed in error is an [ErrConflict].
|
|
||||||
//
|
|
||||||
// Deprecated: use containerd [cerrdefs.IsConflict]
|
|
||||||
var IsConflict = cerrdefs.IsConflict
|
|
||||||
|
|
||||||
// IsUnauthorized returns if the passed in error is an [ErrUnauthorized].
|
|
||||||
//
|
|
||||||
// Deprecated: use containerd [cerrdefs.IsUnauthorized]
|
|
||||||
var IsUnauthorized = cerrdefs.IsUnauthorized
|
|
||||||
|
|
||||||
// IsUnavailable returns if the passed in error is an [ErrUnavailable].
|
|
||||||
//
|
|
||||||
// Deprecated: use containerd [cerrdefs.IsUnavailable]
|
|
||||||
var IsUnavailable = cerrdefs.IsUnavailable
|
|
||||||
|
|
||||||
// IsForbidden returns if the passed in error is an [ErrForbidden].
|
|
||||||
//
|
|
||||||
// Deprecated: use containerd [cerrdefs.IsPermissionDenied]
|
|
||||||
var IsForbidden = cerrdefs.IsPermissionDenied
|
|
||||||
|
|
||||||
// IsSystem returns if the passed in error is an [ErrSystem].
|
|
||||||
//
|
|
||||||
// Deprecated: use containerd [cerrdefs.IsInternal]
|
|
||||||
var IsSystem = cerrdefs.IsInternal
|
|
||||||
|
|
||||||
// IsNotModified returns if the passed in error is an [ErrNotModified].
|
|
||||||
//
|
|
||||||
// Deprecated: use containerd [cerrdefs.IsNotModified]
|
|
||||||
var IsNotModified = cerrdefs.IsNotModified
|
|
||||||
|
|
||||||
// IsNotImplemented returns if the passed in error is an [ErrNotImplemented].
|
|
||||||
//
|
|
||||||
// Deprecated: use containerd [cerrdefs.IsNotImplemented]
|
|
||||||
var IsNotImplemented = cerrdefs.IsNotImplemented
|
|
||||||
|
|
||||||
// IsUnknown returns if the passed in error is an [ErrUnknown].
|
|
||||||
//
|
|
||||||
// Deprecated: use containerd [cerrdefs.IsUnknown]
|
|
||||||
var IsUnknown = cerrdefs.IsUnknown
|
|
||||||
|
|
||||||
// IsCancelled returns if the passed in error is an [ErrCancelled].
|
|
||||||
//
|
|
||||||
// Deprecated: use containerd [cerrdefs.IsCanceled]
|
|
||||||
var IsCancelled = cerrdefs.IsCanceled
|
|
||||||
|
|
||||||
// IsDeadline returns if the passed in error is an [ErrDeadline].
|
|
||||||
//
|
|
||||||
// Deprecated: use containerd [cerrdefs.IsDeadlineExceeded]
|
|
||||||
var IsDeadline = cerrdefs.IsDeadlineExceeded
|
|
||||||
|
|
||||||
// IsDataLoss returns if the passed in error is an [ErrDataLoss].
|
|
||||||
//
|
|
||||||
// Deprecated: use containerd [cerrdefs.IsDataLoss]
|
|
||||||
var IsDataLoss = cerrdefs.IsDataLoss
|
|
||||||
|
|
||||||
// IsContext returns if the passed in error is due to context cancellation or deadline exceeded.
|
|
||||||
func IsContext(err error) bool {
|
|
||||||
return errors.Is(err, context.Canceled) || errors.Is(err, context.DeadlineExceeded)
|
|
||||||
}
|
|
||||||
44
vendor/github.com/docker/docker/pkg/ioutils/fswriters_deprecated.go
generated
vendored
44
vendor/github.com/docker/docker/pkg/ioutils/fswriters_deprecated.go
generated
vendored
|
|
@ -1,44 +0,0 @@
|
||||||
package ioutils
|
|
||||||
|
|
||||||
import (
|
|
||||||
"io"
|
|
||||||
"os"
|
|
||||||
|
|
||||||
"github.com/moby/sys/atomicwriter"
|
|
||||||
)
|
|
||||||
|
|
||||||
// NewAtomicFileWriter returns WriteCloser so that writing to it writes to a
|
|
||||||
// temporary file and closing it atomically changes the temporary file to
|
|
||||||
// destination path. Writing and closing concurrently is not allowed.
|
|
||||||
// NOTE: umask is not considered for the file's permissions.
|
|
||||||
//
|
|
||||||
// Deprecated: use [atomicwriter.New] instead.
|
|
||||||
func NewAtomicFileWriter(filename string, perm os.FileMode) (io.WriteCloser, error) {
|
|
||||||
return atomicwriter.New(filename, perm)
|
|
||||||
}
|
|
||||||
|
|
||||||
// AtomicWriteFile atomically writes data to a file named by filename and with the specified permission bits.
|
|
||||||
// NOTE: umask is not considered for the file's permissions.
|
|
||||||
//
|
|
||||||
// Deprecated: use [atomicwriter.WriteFile] instead.
|
|
||||||
func AtomicWriteFile(filename string, data []byte, perm os.FileMode) error {
|
|
||||||
return atomicwriter.WriteFile(filename, data, perm)
|
|
||||||
}
|
|
||||||
|
|
||||||
// AtomicWriteSet is used to atomically write a set
|
|
||||||
// of files and ensure they are visible at the same time.
|
|
||||||
// Must be committed to a new directory.
|
|
||||||
//
|
|
||||||
// Deprecated: use [atomicwriter.WriteSet] instead.
|
|
||||||
type AtomicWriteSet = atomicwriter.WriteSet
|
|
||||||
|
|
||||||
// NewAtomicWriteSet creates a new atomic write set to
|
|
||||||
// atomically create a set of files. The given directory
|
|
||||||
// is used as the base directory for storing files before
|
|
||||||
// commit. If no temporary directory is given the system
|
|
||||||
// default is used.
|
|
||||||
//
|
|
||||||
// Deprecated: use [atomicwriter.NewWriteSet] instead.
|
|
||||||
func NewAtomicWriteSet(tmpDir string) (*atomicwriter.WriteSet, error) {
|
|
||||||
return atomicwriter.NewWriteSet(tmpDir)
|
|
||||||
}
|
|
||||||
118
vendor/github.com/docker/docker/pkg/ioutils/readers.go
generated
vendored
118
vendor/github.com/docker/docker/pkg/ioutils/readers.go
generated
vendored
|
|
@ -1,118 +0,0 @@
|
||||||
package ioutils
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"io"
|
|
||||||
"runtime/debug"
|
|
||||||
"sync/atomic"
|
|
||||||
|
|
||||||
"github.com/containerd/log"
|
|
||||||
)
|
|
||||||
|
|
||||||
// readCloserWrapper wraps an io.Reader, and implements an io.ReadCloser
|
|
||||||
// It calls the given callback function when closed. It should be constructed
|
|
||||||
// with NewReadCloserWrapper
|
|
||||||
type readCloserWrapper struct {
|
|
||||||
io.Reader
|
|
||||||
closer func() error
|
|
||||||
closed atomic.Bool
|
|
||||||
}
|
|
||||||
|
|
||||||
// Close calls back the passed closer function
|
|
||||||
func (r *readCloserWrapper) Close() error {
|
|
||||||
if !r.closed.CompareAndSwap(false, true) {
|
|
||||||
subsequentCloseWarn("ReadCloserWrapper")
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
return r.closer()
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewReadCloserWrapper wraps an io.Reader, and implements an io.ReadCloser.
|
|
||||||
// It calls the given callback function when closed.
|
|
||||||
func NewReadCloserWrapper(r io.Reader, closer func() error) io.ReadCloser {
|
|
||||||
return &readCloserWrapper{
|
|
||||||
Reader: r,
|
|
||||||
closer: closer,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// cancelReadCloser wraps an io.ReadCloser with a context for cancelling read
|
|
||||||
// operations.
|
|
||||||
type cancelReadCloser struct {
|
|
||||||
cancel func()
|
|
||||||
pR *io.PipeReader // Stream to read from
|
|
||||||
pW *io.PipeWriter
|
|
||||||
closed atomic.Bool
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewCancelReadCloser creates a wrapper that closes the ReadCloser when the
|
|
||||||
// context is cancelled. The returned io.ReadCloser must be closed when it is
|
|
||||||
// no longer needed.
|
|
||||||
func NewCancelReadCloser(ctx context.Context, in io.ReadCloser) io.ReadCloser {
|
|
||||||
pR, pW := io.Pipe()
|
|
||||||
|
|
||||||
// Create a context used to signal when the pipe is closed
|
|
||||||
doneCtx, cancel := context.WithCancel(context.Background())
|
|
||||||
|
|
||||||
p := &cancelReadCloser{
|
|
||||||
cancel: cancel,
|
|
||||||
pR: pR,
|
|
||||||
pW: pW,
|
|
||||||
}
|
|
||||||
|
|
||||||
go func() {
|
|
||||||
_, err := io.Copy(pW, in)
|
|
||||||
select {
|
|
||||||
case <-ctx.Done():
|
|
||||||
// If the context was closed, p.closeWithError
|
|
||||||
// was already called. Calling it again would
|
|
||||||
// change the error that Read returns.
|
|
||||||
default:
|
|
||||||
p.closeWithError(err)
|
|
||||||
}
|
|
||||||
in.Close()
|
|
||||||
}()
|
|
||||||
go func() {
|
|
||||||
for {
|
|
||||||
select {
|
|
||||||
case <-ctx.Done():
|
|
||||||
p.closeWithError(ctx.Err())
|
|
||||||
case <-doneCtx.Done():
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
|
|
||||||
return p
|
|
||||||
}
|
|
||||||
|
|
||||||
// Read wraps the Read method of the pipe that provides data from the wrapped
|
|
||||||
// ReadCloser.
|
|
||||||
func (p *cancelReadCloser) Read(buf []byte) (int, error) {
|
|
||||||
return p.pR.Read(buf)
|
|
||||||
}
|
|
||||||
|
|
||||||
// closeWithError closes the wrapper and its underlying reader. It will
|
|
||||||
// cause future calls to Read to return err.
|
|
||||||
func (p *cancelReadCloser) closeWithError(err error) {
|
|
||||||
_ = p.pW.CloseWithError(err)
|
|
||||||
p.cancel()
|
|
||||||
}
|
|
||||||
|
|
||||||
// Close closes the wrapper its underlying reader. It will cause
|
|
||||||
// future calls to Read to return io.EOF.
|
|
||||||
func (p *cancelReadCloser) Close() error {
|
|
||||||
if !p.closed.CompareAndSwap(false, true) {
|
|
||||||
subsequentCloseWarn("cancelReadCloser")
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
p.closeWithError(io.EOF)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func subsequentCloseWarn(name string) {
|
|
||||||
log.G(context.TODO()).Error("subsequent attempt to close " + name)
|
|
||||||
if log.GetLevel() >= log.DebugLevel {
|
|
||||||
log.G(context.TODO()).Errorf("stack trace: %s", string(debug.Stack()))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
96
vendor/github.com/docker/docker/pkg/ioutils/writeflusher.go
generated
vendored
96
vendor/github.com/docker/docker/pkg/ioutils/writeflusher.go
generated
vendored
|
|
@ -1,96 +0,0 @@
|
||||||
package ioutils
|
|
||||||
|
|
||||||
import (
|
|
||||||
"io"
|
|
||||||
"sync"
|
|
||||||
)
|
|
||||||
|
|
||||||
// WriteFlusher wraps the Write and Flush operation ensuring that every write
|
|
||||||
// is a flush. In addition, the Close method can be called to intercept
|
|
||||||
// Read/Write calls if the targets lifecycle has already ended.
|
|
||||||
type WriteFlusher struct {
|
|
||||||
w io.Writer
|
|
||||||
flusher flusher
|
|
||||||
flushed chan struct{}
|
|
||||||
flushedOnce sync.Once
|
|
||||||
closed chan struct{}
|
|
||||||
closeLock sync.Mutex
|
|
||||||
}
|
|
||||||
|
|
||||||
type flusher interface {
|
|
||||||
Flush()
|
|
||||||
}
|
|
||||||
|
|
||||||
func (wf *WriteFlusher) Write(b []byte) (int, error) {
|
|
||||||
select {
|
|
||||||
case <-wf.closed:
|
|
||||||
return 0, io.EOF
|
|
||||||
default:
|
|
||||||
}
|
|
||||||
|
|
||||||
n, err := wf.w.Write(b)
|
|
||||||
wf.Flush() // every write is a flush.
|
|
||||||
return n, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// Flush the stream immediately.
|
|
||||||
func (wf *WriteFlusher) Flush() {
|
|
||||||
select {
|
|
||||||
case <-wf.closed:
|
|
||||||
return
|
|
||||||
default:
|
|
||||||
}
|
|
||||||
|
|
||||||
wf.flushedOnce.Do(func() {
|
|
||||||
close(wf.flushed)
|
|
||||||
})
|
|
||||||
wf.flusher.Flush()
|
|
||||||
}
|
|
||||||
|
|
||||||
// Flushed returns the state of flushed.
|
|
||||||
// If it's flushed, return true, or else it return false.
|
|
||||||
func (wf *WriteFlusher) Flushed() bool {
|
|
||||||
// BUG(stevvooe): Remove this method. Its use is inherently racy. Seems to
|
|
||||||
// be used to detect whether or a response code has been issued or not.
|
|
||||||
// Another hook should be used instead.
|
|
||||||
var flushed bool
|
|
||||||
select {
|
|
||||||
case <-wf.flushed:
|
|
||||||
flushed = true
|
|
||||||
default:
|
|
||||||
}
|
|
||||||
return flushed
|
|
||||||
}
|
|
||||||
|
|
||||||
// Close closes the write flusher, disallowing any further writes to the
|
|
||||||
// target. After the flusher is closed, all calls to write or flush will
|
|
||||||
// result in an error.
|
|
||||||
func (wf *WriteFlusher) Close() error {
|
|
||||||
wf.closeLock.Lock()
|
|
||||||
defer wf.closeLock.Unlock()
|
|
||||||
|
|
||||||
select {
|
|
||||||
case <-wf.closed:
|
|
||||||
return io.EOF
|
|
||||||
default:
|
|
||||||
close(wf.closed)
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// nopFlusher represents a type which flush operation is nop.
|
|
||||||
type nopFlusher struct{}
|
|
||||||
|
|
||||||
// Flush is a nop operation.
|
|
||||||
func (f *nopFlusher) Flush() {}
|
|
||||||
|
|
||||||
// NewWriteFlusher returns a new WriteFlusher.
|
|
||||||
func NewWriteFlusher(w io.Writer) *WriteFlusher {
|
|
||||||
var fl flusher
|
|
||||||
if f, ok := w.(flusher); ok {
|
|
||||||
fl = f
|
|
||||||
} else {
|
|
||||||
fl = &nopFlusher{}
|
|
||||||
}
|
|
||||||
return &WriteFlusher{w: w, flusher: fl, closed: make(chan struct{}), flushed: make(chan struct{})}
|
|
||||||
}
|
|
||||||
28
vendor/github.com/docker/docker/pkg/ioutils/writers.go
generated
vendored
28
vendor/github.com/docker/docker/pkg/ioutils/writers.go
generated
vendored
|
|
@ -1,28 +0,0 @@
|
||||||
package ioutils
|
|
||||||
|
|
||||||
import (
|
|
||||||
"io"
|
|
||||||
"sync/atomic"
|
|
||||||
)
|
|
||||||
|
|
||||||
type writeCloserWrapper struct {
|
|
||||||
io.Writer
|
|
||||||
closer func() error
|
|
||||||
closed atomic.Bool
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *writeCloserWrapper) Close() error {
|
|
||||||
if !r.closed.CompareAndSwap(false, true) {
|
|
||||||
subsequentCloseWarn("WriteCloserWrapper")
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
return r.closer()
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewWriteCloserWrapper returns a new io.WriteCloser.
|
|
||||||
func NewWriteCloserWrapper(r io.Writer, closer func() error) io.WriteCloser {
|
|
||||||
return &writeCloserWrapper{
|
|
||||||
Writer: r,
|
|
||||||
closer: closer,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
135
vendor/github.com/docker/go-connections/nat/nat.go
generated
vendored
135
vendor/github.com/docker/go-connections/nat/nat.go
generated
vendored
|
|
@ -2,6 +2,7 @@
|
||||||
package nat
|
package nat
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"net"
|
"net"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
@ -43,19 +44,19 @@ func NewPort(proto, port string) (Port, error) {
|
||||||
|
|
||||||
// ParsePort parses the port number string and returns an int
|
// ParsePort parses the port number string and returns an int
|
||||||
func ParsePort(rawPort string) (int, error) {
|
func ParsePort(rawPort string) (int, error) {
|
||||||
if len(rawPort) == 0 {
|
if rawPort == "" {
|
||||||
return 0, nil
|
return 0, nil
|
||||||
}
|
}
|
||||||
port, err := strconv.ParseUint(rawPort, 10, 16)
|
port, err := strconv.ParseUint(rawPort, 10, 16)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, err
|
return 0, fmt.Errorf("invalid port '%s': %w", rawPort, errors.Unwrap(err))
|
||||||
}
|
}
|
||||||
return int(port), nil
|
return int(port), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// ParsePortRangeToInt parses the port range string and returns start/end ints
|
// ParsePortRangeToInt parses the port range string and returns start/end ints
|
||||||
func ParsePortRangeToInt(rawPort string) (int, int, error) {
|
func ParsePortRangeToInt(rawPort string) (int, int, error) {
|
||||||
if len(rawPort) == 0 {
|
if rawPort == "" {
|
||||||
return 0, 0, nil
|
return 0, 0, nil
|
||||||
}
|
}
|
||||||
start, end, err := ParsePortRange(rawPort)
|
start, end, err := ParsePortRange(rawPort)
|
||||||
|
|
@ -91,29 +92,31 @@ func (p Port) Range() (int, int, error) {
|
||||||
return ParsePortRangeToInt(p.Port())
|
return ParsePortRangeToInt(p.Port())
|
||||||
}
|
}
|
||||||
|
|
||||||
// SplitProtoPort splits a port in the format of proto/port
|
// SplitProtoPort splits a port(range) and protocol, formatted as "<portnum>/[<proto>]"
|
||||||
func SplitProtoPort(rawPort string) (string, string) {
|
// "<startport-endport>/[<proto>]". It returns an empty string for both if
|
||||||
parts := strings.Split(rawPort, "/")
|
// no port(range) is provided. If a port(range) is provided, but no protocol,
|
||||||
l := len(parts)
|
// the default ("tcp") protocol is returned.
|
||||||
if len(rawPort) == 0 || l == 0 || len(parts[0]) == 0 {
|
//
|
||||||
|
// SplitProtoPort does not validate or normalize the returned values.
|
||||||
|
func SplitProtoPort(rawPort string) (proto string, port string) {
|
||||||
|
port, proto, _ = strings.Cut(rawPort, "/")
|
||||||
|
if port == "" {
|
||||||
return "", ""
|
return "", ""
|
||||||
}
|
}
|
||||||
if l == 1 {
|
if proto == "" {
|
||||||
return "tcp", rawPort
|
proto = "tcp"
|
||||||
}
|
}
|
||||||
if len(parts[1]) == 0 {
|
return proto, port
|
||||||
return "tcp", parts[0]
|
|
||||||
}
|
|
||||||
return parts[1], parts[0]
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func validateProto(proto string) bool {
|
func validateProto(proto string) error {
|
||||||
for _, availableProto := range []string{"tcp", "udp", "sctp"} {
|
switch proto {
|
||||||
if availableProto == proto {
|
case "tcp", "udp", "sctp":
|
||||||
return true
|
// All good
|
||||||
|
return nil
|
||||||
|
default:
|
||||||
|
return errors.New("invalid proto: " + proto)
|
||||||
}
|
}
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// ParsePortSpecs receives port specs in the format of ip:public:private/proto and parses
|
// ParsePortSpecs receives port specs in the format of ip:public:private/proto and parses
|
||||||
|
|
@ -123,22 +126,18 @@ func ParsePortSpecs(ports []string) (map[Port]struct{}, map[Port][]PortBinding,
|
||||||
exposedPorts = make(map[Port]struct{}, len(ports))
|
exposedPorts = make(map[Port]struct{}, len(ports))
|
||||||
bindings = make(map[Port][]PortBinding)
|
bindings = make(map[Port][]PortBinding)
|
||||||
)
|
)
|
||||||
for _, rawPort := range ports {
|
for _, p := range ports {
|
||||||
portMappings, err := ParsePortSpec(rawPort)
|
portMappings, err := ParsePortSpec(p)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, nil, err
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, portMapping := range portMappings {
|
for _, pm := range portMappings {
|
||||||
port := portMapping.Port
|
port := pm.Port
|
||||||
if _, exists := exposedPorts[port]; !exists {
|
if _, ok := exposedPorts[port]; !ok {
|
||||||
exposedPorts[port] = struct{}{}
|
exposedPorts[port] = struct{}{}
|
||||||
}
|
}
|
||||||
bslice, exists := bindings[port]
|
bindings[port] = append(bindings[port], pm.Binding)
|
||||||
if !exists {
|
|
||||||
bslice = []PortBinding{}
|
|
||||||
}
|
|
||||||
bindings[port] = append(bslice, portMapping.Binding)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return exposedPorts, bindings, nil
|
return exposedPorts, bindings, nil
|
||||||
|
|
@ -150,28 +149,34 @@ type PortMapping struct {
|
||||||
Binding PortBinding
|
Binding PortBinding
|
||||||
}
|
}
|
||||||
|
|
||||||
func splitParts(rawport string) (string, string, string) {
|
func (p *PortMapping) String() string {
|
||||||
parts := strings.Split(rawport, ":")
|
return net.JoinHostPort(p.Binding.HostIP, p.Binding.HostPort+":"+string(p.Port))
|
||||||
n := len(parts)
|
}
|
||||||
containerPort := parts[n-1]
|
|
||||||
|
|
||||||
switch n {
|
func splitParts(rawport string) (hostIP, hostPort, containerPort string) {
|
||||||
|
parts := strings.Split(rawport, ":")
|
||||||
|
|
||||||
|
switch len(parts) {
|
||||||
case 1:
|
case 1:
|
||||||
return "", "", containerPort
|
return "", "", parts[0]
|
||||||
case 2:
|
case 2:
|
||||||
return "", parts[0], containerPort
|
return "", parts[0], parts[1]
|
||||||
case 3:
|
case 3:
|
||||||
return parts[0], parts[1], containerPort
|
return parts[0], parts[1], parts[2]
|
||||||
default:
|
default:
|
||||||
return strings.Join(parts[:n-2], ":"), parts[n-2], containerPort
|
n := len(parts)
|
||||||
|
return strings.Join(parts[:n-2], ":"), parts[n-2], parts[n-1]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// ParsePortSpec parses a port specification string into a slice of PortMappings
|
// ParsePortSpec parses a port specification string into a slice of PortMappings
|
||||||
func ParsePortSpec(rawPort string) ([]PortMapping, error) {
|
func ParsePortSpec(rawPort string) ([]PortMapping, error) {
|
||||||
var proto string
|
|
||||||
ip, hostPort, containerPort := splitParts(rawPort)
|
ip, hostPort, containerPort := splitParts(rawPort)
|
||||||
proto, containerPort = SplitProtoPort(containerPort)
|
proto, containerPort := SplitProtoPort(containerPort)
|
||||||
|
proto = strings.ToLower(proto)
|
||||||
|
if err := validateProto(proto); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
if ip != "" && ip[0] == '[' {
|
if ip != "" && ip[0] == '[' {
|
||||||
// Strip [] from IPV6 addresses
|
// Strip [] from IPV6 addresses
|
||||||
|
|
@ -182,7 +187,7 @@ func ParsePortSpec(rawPort string) ([]PortMapping, error) {
|
||||||
ip = rawIP
|
ip = rawIP
|
||||||
}
|
}
|
||||||
if ip != "" && net.ParseIP(ip) == nil {
|
if ip != "" && net.ParseIP(ip) == nil {
|
||||||
return nil, fmt.Errorf("invalid IP address: %s", ip)
|
return nil, errors.New("invalid IP address: " + ip)
|
||||||
}
|
}
|
||||||
if containerPort == "" {
|
if containerPort == "" {
|
||||||
return nil, fmt.Errorf("no port specified: %s<empty>", rawPort)
|
return nil, fmt.Errorf("no port specified: %s<empty>", rawPort)
|
||||||
|
|
@ -190,18 +195,16 @@ func ParsePortSpec(rawPort string) ([]PortMapping, error) {
|
||||||
|
|
||||||
startPort, endPort, err := ParsePortRange(containerPort)
|
startPort, endPort, err := ParsePortRange(containerPort)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("invalid containerPort: %s", containerPort)
|
return nil, errors.New("invalid containerPort: " + containerPort)
|
||||||
}
|
}
|
||||||
|
|
||||||
var startHostPort, endHostPort uint64 = 0, 0
|
var startHostPort, endHostPort uint64
|
||||||
if len(hostPort) > 0 {
|
if hostPort != "" {
|
||||||
startHostPort, endHostPort, err = ParsePortRange(hostPort)
|
startHostPort, endHostPort, err = ParsePortRange(hostPort)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("invalid hostPort: %s", hostPort)
|
return nil, errors.New("invalid hostPort: " + hostPort)
|
||||||
}
|
}
|
||||||
}
|
if (endPort - startPort) != (endHostPort - startHostPort) {
|
||||||
|
|
||||||
if hostPort != "" && (endPort-startPort) != (endHostPort-startHostPort) {
|
|
||||||
// Allow host port range iff containerPort is not a range.
|
// Allow host port range iff containerPort is not a range.
|
||||||
// In this case, use the host port range as the dynamic
|
// In this case, use the host port range as the dynamic
|
||||||
// host port range to allocate into.
|
// host port range to allocate into.
|
||||||
|
|
@ -209,32 +212,26 @@ func ParsePortSpec(rawPort string) ([]PortMapping, error) {
|
||||||
return nil, fmt.Errorf("invalid ranges specified for container and host Ports: %s and %s", containerPort, hostPort)
|
return nil, fmt.Errorf("invalid ranges specified for container and host Ports: %s and %s", containerPort, hostPort)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if !validateProto(strings.ToLower(proto)) {
|
|
||||||
return nil, fmt.Errorf("invalid proto: %s", proto)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ports := []PortMapping{}
|
count := endPort - startPort + 1
|
||||||
for i := uint64(0); i <= (endPort - startPort); i++ {
|
ports := make([]PortMapping, 0, count)
|
||||||
containerPort = strconv.FormatUint(startPort+i, 10)
|
|
||||||
if len(hostPort) > 0 {
|
for i := uint64(0); i < count; i++ {
|
||||||
hostPort = strconv.FormatUint(startHostPort+i, 10)
|
cPort := Port(strconv.FormatUint(startPort+i, 10) + "/" + proto)
|
||||||
}
|
hPort := ""
|
||||||
|
if hostPort != "" {
|
||||||
|
hPort = strconv.FormatUint(startHostPort+i, 10)
|
||||||
// Set hostPort to a range only if there is a single container port
|
// Set hostPort to a range only if there is a single container port
|
||||||
// and a dynamic host port.
|
// and a dynamic host port.
|
||||||
if startPort == endPort && startHostPort != endHostPort {
|
if count == 1 && startHostPort != endHostPort {
|
||||||
hostPort = fmt.Sprintf("%s-%s", hostPort, strconv.FormatUint(endHostPort, 10))
|
hPort += "-" + strconv.FormatUint(endHostPort, 10)
|
||||||
}
|
}
|
||||||
port, err := NewPort(strings.ToLower(proto), containerPort)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
}
|
||||||
|
ports = append(ports, PortMapping{
|
||||||
binding := PortBinding{
|
Port: cPort,
|
||||||
HostIP: ip,
|
Binding: PortBinding{HostIP: ip, HostPort: hPort},
|
||||||
HostPort: hostPort,
|
})
|
||||||
}
|
|
||||||
ports = append(ports, PortMapping{Port: port, Binding: binding})
|
|
||||||
}
|
}
|
||||||
return ports, nil
|
return ports, nil
|
||||||
}
|
}
|
||||||
|
|
|
||||||
6
vendor/github.com/docker/go-connections/nat/parse.go
generated
vendored
6
vendor/github.com/docker/go-connections/nat/parse.go
generated
vendored
|
|
@ -1,7 +1,7 @@
|
||||||
package nat
|
package nat
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"errors"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
@ -9,7 +9,7 @@ import (
|
||||||
// ParsePortRange parses and validates the specified string as a port-range (8000-9000)
|
// ParsePortRange parses and validates the specified string as a port-range (8000-9000)
|
||||||
func ParsePortRange(ports string) (uint64, uint64, error) {
|
func ParsePortRange(ports string) (uint64, uint64, error) {
|
||||||
if ports == "" {
|
if ports == "" {
|
||||||
return 0, 0, fmt.Errorf("empty string specified for ports")
|
return 0, 0, errors.New("empty string specified for ports")
|
||||||
}
|
}
|
||||||
if !strings.Contains(ports, "-") {
|
if !strings.Contains(ports, "-") {
|
||||||
start, err := strconv.ParseUint(ports, 10, 16)
|
start, err := strconv.ParseUint(ports, 10, 16)
|
||||||
|
|
@ -27,7 +27,7 @@ func ParsePortRange(ports string) (uint64, uint64, error) {
|
||||||
return 0, 0, err
|
return 0, 0, err
|
||||||
}
|
}
|
||||||
if end < start {
|
if end < start {
|
||||||
return 0, 0, fmt.Errorf("invalid range specified for port: %s", ports)
|
return 0, 0, errors.New("invalid range specified for port: " + ports)
|
||||||
}
|
}
|
||||||
return start, end, nil
|
return start, end, nil
|
||||||
}
|
}
|
||||||
|
|
|
||||||
0
vendor/github.com/docker/go-connections/sockets/README.md
generated
vendored
0
vendor/github.com/docker/go-connections/sockets/README.md
generated
vendored
9
vendor/github.com/docker/go-connections/sockets/proxy.go
generated
vendored
9
vendor/github.com/docker/go-connections/sockets/proxy.go
generated
vendored
|
|
@ -9,6 +9,8 @@ import (
|
||||||
// GetProxyEnv allows access to the uppercase and the lowercase forms of
|
// GetProxyEnv allows access to the uppercase and the lowercase forms of
|
||||||
// proxy-related variables. See the Go specification for details on these
|
// proxy-related variables. See the Go specification for details on these
|
||||||
// variables. https://golang.org/pkg/net/http/
|
// variables. https://golang.org/pkg/net/http/
|
||||||
|
//
|
||||||
|
// Deprecated: this function was used as helper for [DialerFromEnvironment] and is no longer used. It will be removed in the next release.
|
||||||
func GetProxyEnv(key string) string {
|
func GetProxyEnv(key string) string {
|
||||||
proxyValue := os.Getenv(strings.ToUpper(key))
|
proxyValue := os.Getenv(strings.ToUpper(key))
|
||||||
if proxyValue == "" {
|
if proxyValue == "" {
|
||||||
|
|
@ -19,10 +21,11 @@ func GetProxyEnv(key string) string {
|
||||||
|
|
||||||
// DialerFromEnvironment was previously used to configure a net.Dialer to route
|
// DialerFromEnvironment was previously used to configure a net.Dialer to route
|
||||||
// connections through a SOCKS proxy.
|
// connections through a SOCKS proxy.
|
||||||
// DEPRECATED: SOCKS proxies are now supported by configuring only
|
//
|
||||||
|
// Deprecated: SOCKS proxies are now supported by configuring only
|
||||||
// http.Transport.Proxy, and no longer require changing http.Transport.Dial.
|
// http.Transport.Proxy, and no longer require changing http.Transport.Dial.
|
||||||
// Therefore, only sockets.ConfigureTransport() needs to be called, and any
|
// Therefore, only [sockets.ConfigureTransport] needs to be called, and any
|
||||||
// sockets.DialerFromEnvironment() calls can be dropped.
|
// [sockets.DialerFromEnvironment] calls can be dropped.
|
||||||
func DialerFromEnvironment(direct *net.Dialer) (*net.Dialer, error) {
|
func DialerFromEnvironment(direct *net.Dialer) (*net.Dialer, error) {
|
||||||
return direct, nil
|
return direct, nil
|
||||||
}
|
}
|
||||||
|
|
|
||||||
31
vendor/github.com/docker/go-connections/sockets/sockets.go
generated
vendored
31
vendor/github.com/docker/go-connections/sockets/sockets.go
generated
vendored
|
|
@ -2,13 +2,19 @@
|
||||||
package sockets
|
package sockets
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"context"
|
||||||
"errors"
|
"errors"
|
||||||
|
"fmt"
|
||||||
"net"
|
"net"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
"syscall"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
const defaultTimeout = 10 * time.Second
|
const (
|
||||||
|
defaultTimeout = 10 * time.Second
|
||||||
|
maxUnixSocketPathSize = len(syscall.RawSockaddrUnix{}.Path)
|
||||||
|
)
|
||||||
|
|
||||||
// ErrProtocolNotAvailable is returned when a given transport protocol is not provided by the operating system.
|
// ErrProtocolNotAvailable is returned when a given transport protocol is not provided by the operating system.
|
||||||
var ErrProtocolNotAvailable = errors.New("protocol not available")
|
var ErrProtocolNotAvailable = errors.New("protocol not available")
|
||||||
|
|
@ -35,3 +41,26 @@ func ConfigureTransport(tr *http.Transport, proto, addr string) error {
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// DialPipe connects to a Windows named pipe. It is not supported on
|
||||||
|
// non-Windows platforms.
|
||||||
|
//
|
||||||
|
// Deprecated: use [github.com/Microsoft/go-winio.DialPipe] or [github.com/Microsoft/go-winio.DialPipeContext].
|
||||||
|
func DialPipe(addr string, timeout time.Duration) (net.Conn, error) {
|
||||||
|
return dialPipe(addr, timeout)
|
||||||
|
}
|
||||||
|
|
||||||
|
func configureUnixTransport(tr *http.Transport, proto, addr string) error {
|
||||||
|
if len(addr) > maxUnixSocketPathSize {
|
||||||
|
return fmt.Errorf("unix socket path %q is too long", addr)
|
||||||
|
}
|
||||||
|
// No need for compression in local communications.
|
||||||
|
tr.DisableCompression = true
|
||||||
|
dialer := &net.Dialer{
|
||||||
|
Timeout: defaultTimeout,
|
||||||
|
}
|
||||||
|
tr.DialContext = func(ctx context.Context, _, _ string) (net.Conn, error) {
|
||||||
|
return dialer.DialContext(ctx, proto, addr)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
|
||||||
23
vendor/github.com/docker/go-connections/sockets/sockets_unix.go
generated
vendored
23
vendor/github.com/docker/go-connections/sockets/sockets_unix.go
generated
vendored
|
|
@ -3,37 +3,16 @@
|
||||||
package sockets
|
package sockets
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
|
||||||
"fmt"
|
|
||||||
"net"
|
"net"
|
||||||
"net/http"
|
"net/http"
|
||||||
"syscall"
|
"syscall"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
const maxUnixSocketPathSize = len(syscall.RawSockaddrUnix{}.Path)
|
|
||||||
|
|
||||||
func configureUnixTransport(tr *http.Transport, proto, addr string) error {
|
|
||||||
if len(addr) > maxUnixSocketPathSize {
|
|
||||||
return fmt.Errorf("unix socket path %q is too long", addr)
|
|
||||||
}
|
|
||||||
// No need for compression in local communications.
|
|
||||||
tr.DisableCompression = true
|
|
||||||
dialer := &net.Dialer{
|
|
||||||
Timeout: defaultTimeout,
|
|
||||||
}
|
|
||||||
tr.DialContext = func(ctx context.Context, _, _ string) (net.Conn, error) {
|
|
||||||
return dialer.DialContext(ctx, proto, addr)
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func configureNpipeTransport(tr *http.Transport, proto, addr string) error {
|
func configureNpipeTransport(tr *http.Transport, proto, addr string) error {
|
||||||
return ErrProtocolNotAvailable
|
return ErrProtocolNotAvailable
|
||||||
}
|
}
|
||||||
|
|
||||||
// DialPipe connects to a Windows named pipe.
|
func dialPipe(_ string, _ time.Duration) (net.Conn, error) {
|
||||||
// This is not supported on other OSes.
|
|
||||||
func DialPipe(_ string, _ time.Duration) (net.Conn, error) {
|
|
||||||
return nil, syscall.EAFNOSUPPORT
|
return nil, syscall.EAFNOSUPPORT
|
||||||
}
|
}
|
||||||
|
|
|
||||||
7
vendor/github.com/docker/go-connections/sockets/sockets_windows.go
generated
vendored
7
vendor/github.com/docker/go-connections/sockets/sockets_windows.go
generated
vendored
|
|
@ -9,10 +9,6 @@ import (
|
||||||
"github.com/Microsoft/go-winio"
|
"github.com/Microsoft/go-winio"
|
||||||
)
|
)
|
||||||
|
|
||||||
func configureUnixTransport(tr *http.Transport, proto, addr string) error {
|
|
||||||
return ErrProtocolNotAvailable
|
|
||||||
}
|
|
||||||
|
|
||||||
func configureNpipeTransport(tr *http.Transport, proto, addr string) error {
|
func configureNpipeTransport(tr *http.Transport, proto, addr string) error {
|
||||||
// No need for compression in local communications.
|
// No need for compression in local communications.
|
||||||
tr.DisableCompression = true
|
tr.DisableCompression = true
|
||||||
|
|
@ -22,7 +18,6 @@ func configureNpipeTransport(tr *http.Transport, proto, addr string) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// DialPipe connects to a Windows named pipe.
|
func dialPipe(addr string, timeout time.Duration) (net.Conn, error) {
|
||||||
func DialPipe(addr string, timeout time.Duration) (net.Conn, error) {
|
|
||||||
return winio.DialPipe(addr, &timeout)
|
return winio.DialPipe(addr, &timeout)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
44
vendor/github.com/docker/go-connections/sockets/unix_socket.go
generated
vendored
44
vendor/github.com/docker/go-connections/sockets/unix_socket.go
generated
vendored
|
|
@ -1,5 +1,3 @@
|
||||||
//go:build !windows
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Package sockets is a simple unix domain socket wrapper.
|
Package sockets is a simple unix domain socket wrapper.
|
||||||
|
|
||||||
|
|
@ -57,26 +55,6 @@ import (
|
||||||
// SockOption sets up socket file's creating option
|
// SockOption sets up socket file's creating option
|
||||||
type SockOption func(string) error
|
type SockOption func(string) error
|
||||||
|
|
||||||
// WithChown modifies the socket file's uid and gid
|
|
||||||
func WithChown(uid, gid int) SockOption {
|
|
||||||
return func(path string) error {
|
|
||||||
if err := os.Chown(path, uid, gid); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// WithChmod modifies socket file's access mode.
|
|
||||||
func WithChmod(mask os.FileMode) SockOption {
|
|
||||||
return func(path string) error {
|
|
||||||
if err := os.Chmod(path, mask); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewUnixSocketWithOpts creates a unix socket with the specified options.
|
// NewUnixSocketWithOpts creates a unix socket with the specified options.
|
||||||
// By default, socket permissions are 0000 (i.e.: no access for anyone); pass
|
// By default, socket permissions are 0000 (i.e.: no access for anyone); pass
|
||||||
// WithChmod() and WithChown() to set the desired ownership and permissions.
|
// WithChmod() and WithChown() to set the desired ownership and permissions.
|
||||||
|
|
@ -90,22 +68,7 @@ func NewUnixSocketWithOpts(path string, opts ...SockOption) (net.Listener, error
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// net.Listen does not allow for permissions to be set. As a result, when
|
l, err := listenUnix(path)
|
||||||
// specifying custom permissions ("WithChmod()"), there is a short time
|
|
||||||
// between creating the socket and applying the permissions, during which
|
|
||||||
// the socket permissions are Less restrictive than desired.
|
|
||||||
//
|
|
||||||
// To work around this limitation of net.Listen(), we temporarily set the
|
|
||||||
// umask to 0777, which forces the socket to be created with 000 permissions
|
|
||||||
// (i.e.: no access for anyone). After that, WithChmod() must be used to set
|
|
||||||
// the desired permissions.
|
|
||||||
//
|
|
||||||
// We don't use "defer" here, to reset the umask to its original value as soon
|
|
||||||
// as possible. Ideally we'd be able to detect if WithChmod() was passed as
|
|
||||||
// an option, and skip changing umask if default permissions are used.
|
|
||||||
origUmask := syscall.Umask(0o777)
|
|
||||||
l, err := net.Listen("unix", path)
|
|
||||||
syscall.Umask(origUmask)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
@ -119,8 +82,3 @@ func NewUnixSocketWithOpts(path string, opts ...SockOption) (net.Listener, error
|
||||||
|
|
||||||
return l, nil
|
return l, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewUnixSocket creates a unix socket with the specified path and group.
|
|
||||||
func NewUnixSocket(path string, gid int) (net.Listener, error) {
|
|
||||||
return NewUnixSocketWithOpts(path, WithChown(0, gid), WithChmod(0o660))
|
|
||||||
}
|
|
||||||
|
|
|
||||||
54
vendor/github.com/docker/go-connections/sockets/unix_socket_unix.go
generated
vendored
Normal file
54
vendor/github.com/docker/go-connections/sockets/unix_socket_unix.go
generated
vendored
Normal file
|
|
@ -0,0 +1,54 @@
|
||||||
|
//go:build !windows
|
||||||
|
|
||||||
|
package sockets
|
||||||
|
|
||||||
|
import (
|
||||||
|
"net"
|
||||||
|
"os"
|
||||||
|
"syscall"
|
||||||
|
)
|
||||||
|
|
||||||
|
// WithChown modifies the socket file's uid and gid
|
||||||
|
func WithChown(uid, gid int) SockOption {
|
||||||
|
return func(path string) error {
|
||||||
|
if err := os.Chown(path, uid, gid); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithChmod modifies socket file's access mode.
|
||||||
|
func WithChmod(mask os.FileMode) SockOption {
|
||||||
|
return func(path string) error {
|
||||||
|
if err := os.Chmod(path, mask); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewUnixSocket creates a unix socket with the specified path and group.
|
||||||
|
func NewUnixSocket(path string, gid int) (net.Listener, error) {
|
||||||
|
return NewUnixSocketWithOpts(path, WithChown(0, gid), WithChmod(0o660))
|
||||||
|
}
|
||||||
|
|
||||||
|
func listenUnix(path string) (net.Listener, error) {
|
||||||
|
// net.Listen does not allow for permissions to be set. As a result, when
|
||||||
|
// specifying custom permissions ("WithChmod()"), there is a short time
|
||||||
|
// between creating the socket and applying the permissions, during which
|
||||||
|
// the socket permissions are Less restrictive than desired.
|
||||||
|
//
|
||||||
|
// To work around this limitation of net.Listen(), we temporarily set the
|
||||||
|
// umask to 0777, which forces the socket to be created with 000 permissions
|
||||||
|
// (i.e.: no access for anyone). After that, WithChmod() must be used to set
|
||||||
|
// the desired permissions.
|
||||||
|
//
|
||||||
|
// We don't use "defer" here, to reset the umask to its original value as soon
|
||||||
|
// as possible. Ideally we'd be able to detect if WithChmod() was passed as
|
||||||
|
// an option, and skip changing umask if default permissions are used.
|
||||||
|
origUmask := syscall.Umask(0o777)
|
||||||
|
l, err := net.Listen("unix", path)
|
||||||
|
syscall.Umask(origUmask)
|
||||||
|
return l, err
|
||||||
|
}
|
||||||
7
vendor/github.com/docker/go-connections/sockets/unix_socket_windows.go
generated
vendored
Normal file
7
vendor/github.com/docker/go-connections/sockets/unix_socket_windows.go
generated
vendored
Normal file
|
|
@ -0,0 +1,7 @@
|
||||||
|
package sockets
|
||||||
|
|
||||||
|
import "net"
|
||||||
|
|
||||||
|
func listenUnix(path string) (net.Listener, error) {
|
||||||
|
return net.Listen("unix", path)
|
||||||
|
}
|
||||||
98
vendor/github.com/docker/go-connections/tlsconfig/config.go
generated
vendored
98
vendor/github.com/docker/go-connections/tlsconfig/config.go
generated
vendored
|
|
@ -34,51 +34,37 @@ type Options struct {
|
||||||
// the system pool will be used.
|
// the system pool will be used.
|
||||||
ExclusiveRootPools bool
|
ExclusiveRootPools bool
|
||||||
MinVersion uint16
|
MinVersion uint16
|
||||||
// If Passphrase is set, it will be used to decrypt a TLS private key
|
|
||||||
// if the key is encrypted.
|
|
||||||
//
|
|
||||||
// Deprecated: Use of encrypted TLS private keys has been deprecated, and
|
|
||||||
// will be removed in a future release. Golang has deprecated support for
|
|
||||||
// legacy PEM encryption (as specified in RFC 1423), as it is insecure by
|
|
||||||
// design (see https://go-review.googlesource.com/c/go/+/264159).
|
|
||||||
Passphrase string
|
|
||||||
}
|
|
||||||
|
|
||||||
// Extra (server-side) accepted CBC cipher suites - will phase out in the future
|
|
||||||
var acceptedCBCCiphers = []uint16{
|
|
||||||
tls.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA,
|
|
||||||
tls.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA,
|
|
||||||
tls.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,
|
|
||||||
tls.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// DefaultServerAcceptedCiphers should be uses by code which already has a crypto/tls
|
// DefaultServerAcceptedCiphers should be uses by code which already has a crypto/tls
|
||||||
// options struct but wants to use a commonly accepted set of TLS cipher suites, with
|
// options struct but wants to use a commonly accepted set of TLS cipher suites, with
|
||||||
// known weak algorithms removed.
|
// known weak algorithms removed.
|
||||||
var DefaultServerAcceptedCiphers = append(clientCipherSuites, acceptedCBCCiphers...)
|
var DefaultServerAcceptedCiphers = defaultCipherSuites
|
||||||
|
|
||||||
|
// defaultCipherSuites is shared by both client and server as the default set.
|
||||||
|
var defaultCipherSuites = []uint16{
|
||||||
|
tls.TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,
|
||||||
|
tls.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,
|
||||||
|
tls.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
|
||||||
|
tls.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
|
||||||
|
}
|
||||||
|
|
||||||
// ServerDefault returns a secure-enough TLS configuration for the server TLS configuration.
|
// ServerDefault returns a secure-enough TLS configuration for the server TLS configuration.
|
||||||
func ServerDefault(ops ...func(*tls.Config)) *tls.Config {
|
func ServerDefault(ops ...func(*tls.Config)) *tls.Config {
|
||||||
tlsConfig := &tls.Config{
|
return defaultConfig(ops...)
|
||||||
// Avoid fallback by default to SSL protocols < TLS1.2
|
|
||||||
MinVersion: tls.VersionTLS12,
|
|
||||||
PreferServerCipherSuites: true,
|
|
||||||
CipherSuites: DefaultServerAcceptedCiphers,
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, op := range ops {
|
|
||||||
op(tlsConfig)
|
|
||||||
}
|
|
||||||
|
|
||||||
return tlsConfig
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// ClientDefault returns a secure-enough TLS configuration for the client TLS configuration.
|
// ClientDefault returns a secure-enough TLS configuration for the client TLS configuration.
|
||||||
func ClientDefault(ops ...func(*tls.Config)) *tls.Config {
|
func ClientDefault(ops ...func(*tls.Config)) *tls.Config {
|
||||||
|
return defaultConfig(ops...)
|
||||||
|
}
|
||||||
|
|
||||||
|
// defaultConfig is the default config used by both client and server TLS configuration.
|
||||||
|
func defaultConfig(ops ...func(*tls.Config)) *tls.Config {
|
||||||
tlsConfig := &tls.Config{
|
tlsConfig := &tls.Config{
|
||||||
// Prefer TLS1.2 as the client minimum
|
// Avoid fallback by default to SSL protocols < TLS1.2
|
||||||
MinVersion: tls.VersionTLS12,
|
MinVersion: tls.VersionTLS12,
|
||||||
CipherSuites: clientCipherSuites,
|
CipherSuites: defaultCipherSuites,
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, op := range ops {
|
for _, op := range ops {
|
||||||
|
|
@ -92,13 +78,13 @@ func ClientDefault(ops ...func(*tls.Config)) *tls.Config {
|
||||||
func certPool(caFile string, exclusivePool bool) (*x509.CertPool, error) {
|
func certPool(caFile string, exclusivePool bool) (*x509.CertPool, error) {
|
||||||
// If we should verify the server, we need to load a trusted ca
|
// If we should verify the server, we need to load a trusted ca
|
||||||
var (
|
var (
|
||||||
certPool *x509.CertPool
|
pool *x509.CertPool
|
||||||
err error
|
err error
|
||||||
)
|
)
|
||||||
if exclusivePool {
|
if exclusivePool {
|
||||||
certPool = x509.NewCertPool()
|
pool = x509.NewCertPool()
|
||||||
} else {
|
} else {
|
||||||
certPool, err = SystemCertPool()
|
pool, err = SystemCertPool()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("failed to read system certificates: %v", err)
|
return nil, fmt.Errorf("failed to read system certificates: %v", err)
|
||||||
}
|
}
|
||||||
|
|
@ -107,10 +93,10 @@ func certPool(caFile string, exclusivePool bool) (*x509.CertPool, error) {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("could not read CA certificate %q: %v", caFile, err)
|
return nil, fmt.Errorf("could not read CA certificate %q: %v", caFile, err)
|
||||||
}
|
}
|
||||||
if !certPool.AppendCertsFromPEM(pemData) {
|
if !pool.AppendCertsFromPEM(pemData) {
|
||||||
return nil, fmt.Errorf("failed to append certificates from PEM file: %q", caFile)
|
return nil, fmt.Errorf("failed to append certificates from PEM file: %q", caFile)
|
||||||
}
|
}
|
||||||
return certPool, nil
|
return pool, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// allTLSVersions lists all the TLS versions and is used by the code that validates
|
// allTLSVersions lists all the TLS versions and is used by the code that validates
|
||||||
|
|
@ -144,34 +130,32 @@ func adjustMinVersion(options Options, config *tls.Config) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// IsErrEncryptedKey returns true if the 'err' is an error of incorrect
|
// errEncryptedKeyDeprecated is produced when we encounter an encrypted
|
||||||
// password when trying to decrypt a TLS private key.
|
// (password-protected) key. From https://go-review.googlesource.com/c/go/+/264159;
|
||||||
//
|
//
|
||||||
// Deprecated: Use of encrypted TLS private keys has been deprecated, and
|
// > Legacy PEM encryption as specified in RFC 1423 is insecure by design. Since
|
||||||
// will be removed in a future release. Golang has deprecated support for
|
// > it does not authenticate the ciphertext, it is vulnerable to padding oracle
|
||||||
// legacy PEM encryption (as specified in RFC 1423), as it is insecure by
|
// > attacks that can let an attacker recover the plaintext
|
||||||
// design (see https://go-review.googlesource.com/c/go/+/264159).
|
// >
|
||||||
func IsErrEncryptedKey(err error) bool {
|
// > It's unfortunate that we don't implement PKCS#8 encryption so we can't
|
||||||
return errors.Is(err, x509.IncorrectPasswordError)
|
// > recommend an alternative but PEM encryption is so broken that it's worth
|
||||||
}
|
// > deprecating outright.
|
||||||
|
//
|
||||||
|
// Also see https://docs.docker.com/go/deprecated/
|
||||||
|
var errEncryptedKeyDeprecated = errors.New("private key is encrypted; encrypted private keys are obsolete, and not supported")
|
||||||
|
|
||||||
// getPrivateKey returns the private key in 'keyBytes', in PEM-encoded format.
|
// getPrivateKey returns the private key in 'keyBytes', in PEM-encoded format.
|
||||||
// If the private key is encrypted, 'passphrase' is used to decrypted the
|
// It returns an error if the file could not be decoded or was protected by
|
||||||
// private key.
|
// a passphrase.
|
||||||
func getPrivateKey(keyBytes []byte, passphrase string) ([]byte, error) {
|
func getPrivateKey(keyBytes []byte) ([]byte, error) {
|
||||||
// this section makes some small changes to code from notary/tuf/utils/x509.go
|
// this section makes some small changes to code from notary/tuf/utils/x509.go
|
||||||
pemBlock, _ := pem.Decode(keyBytes)
|
pemBlock, _ := pem.Decode(keyBytes)
|
||||||
if pemBlock == nil {
|
if pemBlock == nil {
|
||||||
return nil, fmt.Errorf("no valid private key found")
|
return nil, fmt.Errorf("no valid private key found")
|
||||||
}
|
}
|
||||||
|
|
||||||
var err error
|
|
||||||
if x509.IsEncryptedPEMBlock(pemBlock) { //nolint:staticcheck // Ignore SA1019 (IsEncryptedPEMBlock is deprecated)
|
if x509.IsEncryptedPEMBlock(pemBlock) { //nolint:staticcheck // Ignore SA1019 (IsEncryptedPEMBlock is deprecated)
|
||||||
keyBytes, err = x509.DecryptPEMBlock(pemBlock, []byte(passphrase)) //nolint:staticcheck // Ignore SA1019 (DecryptPEMBlock is deprecated)
|
return nil, errEncryptedKeyDeprecated
|
||||||
if err != nil {
|
|
||||||
return nil, fmt.Errorf("private key is encrypted, but could not decrypt it: %w", err)
|
|
||||||
}
|
|
||||||
keyBytes = pem.EncodeToMemory(&pem.Block{Type: pemBlock.Type, Bytes: keyBytes})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return keyBytes, nil
|
return keyBytes, nil
|
||||||
|
|
@ -195,7 +179,7 @@ func getCert(options Options) ([]tls.Certificate, error) {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
prKeyBytes, err = getPrivateKey(prKeyBytes, options.Passphrase)
|
prKeyBytes, err = getPrivateKey(prKeyBytes)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
@ -210,7 +194,7 @@ func getCert(options Options) ([]tls.Certificate, error) {
|
||||||
|
|
||||||
// Client returns a TLS configuration meant to be used by a client.
|
// Client returns a TLS configuration meant to be used by a client.
|
||||||
func Client(options Options) (*tls.Config, error) {
|
func Client(options Options) (*tls.Config, error) {
|
||||||
tlsConfig := ClientDefault()
|
tlsConfig := defaultConfig()
|
||||||
tlsConfig.InsecureSkipVerify = options.InsecureSkipVerify
|
tlsConfig.InsecureSkipVerify = options.InsecureSkipVerify
|
||||||
if !options.InsecureSkipVerify && options.CAFile != "" {
|
if !options.InsecureSkipVerify && options.CAFile != "" {
|
||||||
CAs, err := certPool(options.CAFile, options.ExclusiveRootPools)
|
CAs, err := certPool(options.CAFile, options.ExclusiveRootPools)
|
||||||
|
|
@ -235,7 +219,7 @@ func Client(options Options) (*tls.Config, error) {
|
||||||
|
|
||||||
// Server returns a TLS configuration meant to be used by a server.
|
// Server returns a TLS configuration meant to be used by a server.
|
||||||
func Server(options Options) (*tls.Config, error) {
|
func Server(options Options) (*tls.Config, error) {
|
||||||
tlsConfig := ServerDefault()
|
tlsConfig := defaultConfig()
|
||||||
tlsConfig.ClientAuth = options.ClientAuth
|
tlsConfig.ClientAuth = options.ClientAuth
|
||||||
tlsCert, err := tls.LoadX509KeyPair(options.CertFile, options.KeyFile)
|
tlsCert, err := tls.LoadX509KeyPair(options.CertFile, options.KeyFile)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
||||||
14
vendor/github.com/docker/go-connections/tlsconfig/config_client_ciphers.go
generated
vendored
14
vendor/github.com/docker/go-connections/tlsconfig/config_client_ciphers.go
generated
vendored
|
|
@ -1,14 +0,0 @@
|
||||||
// Package tlsconfig provides primitives to retrieve secure-enough TLS configurations for both clients and servers.
|
|
||||||
package tlsconfig
|
|
||||||
|
|
||||||
import (
|
|
||||||
"crypto/tls"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Client TLS cipher suites (dropping CBC ciphers for client preferred suite set)
|
|
||||||
var clientCipherSuites = []uint16{
|
|
||||||
tls.TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,
|
|
||||||
tls.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,
|
|
||||||
tls.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
|
|
||||||
tls.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
|
|
||||||
}
|
|
||||||
2
vendor/github.com/containerd/log/LICENSE → vendor/github.com/moby/moby/api/LICENSE
generated
vendored
2
vendor/github.com/containerd/log/LICENSE → vendor/github.com/moby/moby/api/LICENSE
generated
vendored
|
|
@ -176,7 +176,7 @@
|
||||||
|
|
||||||
END OF TERMS AND CONDITIONS
|
END OF TERMS AND CONDITIONS
|
||||||
|
|
||||||
Copyright The containerd Authors
|
Copyright 2013-2018 Docker, Inc.
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
23
vendor/github.com/moby/moby/api/types/blkiodev/blkio.go
generated
vendored
Normal file
23
vendor/github.com/moby/moby/api/types/blkiodev/blkio.go
generated
vendored
Normal file
|
|
@ -0,0 +1,23 @@
|
||||||
|
package blkiodev
|
||||||
|
|
||||||
|
import "fmt"
|
||||||
|
|
||||||
|
// WeightDevice is a structure that holds device:weight pair
|
||||||
|
type WeightDevice struct {
|
||||||
|
Path string
|
||||||
|
Weight uint16
|
||||||
|
}
|
||||||
|
|
||||||
|
func (w *WeightDevice) String() string {
|
||||||
|
return fmt.Sprintf("%s:%d", w.Path, w.Weight)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ThrottleDevice is a structure that holds device:rate_per_second pair
|
||||||
|
type ThrottleDevice struct {
|
||||||
|
Path string
|
||||||
|
Rate uint64
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *ThrottleDevice) String() string {
|
||||||
|
return fmt.Sprintf("%s:%d", t.Path, t.Rate)
|
||||||
|
}
|
||||||
16
vendor/github.com/moby/moby/api/types/build/build.go
generated
vendored
Normal file
16
vendor/github.com/moby/moby/api/types/build/build.go
generated
vendored
Normal file
|
|
@ -0,0 +1,16 @@
|
||||||
|
package build
|
||||||
|
|
||||||
|
// BuilderVersion sets the version of underlying builder to use
|
||||||
|
type BuilderVersion string
|
||||||
|
|
||||||
|
const (
|
||||||
|
// BuilderV1 is the first generation builder in docker daemon
|
||||||
|
BuilderV1 BuilderVersion = "1"
|
||||||
|
// BuilderBuildKit is builder based on moby/buildkit project
|
||||||
|
BuilderBuildKit BuilderVersion = "2"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Result contains the image id of a successful build.
|
||||||
|
type Result struct {
|
||||||
|
ID string
|
||||||
|
}
|
||||||
35
vendor/github.com/moby/moby/api/types/build/cache.go
generated
vendored
Normal file
35
vendor/github.com/moby/moby/api/types/build/cache.go
generated
vendored
Normal file
|
|
@ -0,0 +1,35 @@
|
||||||
|
package build
|
||||||
|
|
||||||
|
import (
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
// CacheRecord contains information about a build cache record.
|
||||||
|
type CacheRecord struct {
|
||||||
|
// ID is the unique ID of the build cache record.
|
||||||
|
ID string
|
||||||
|
// Parents is the list of parent build cache record IDs.
|
||||||
|
Parents []string `json:" Parents,omitempty"`
|
||||||
|
// Type is the cache record type.
|
||||||
|
Type string
|
||||||
|
// Description is a description of the build-step that produced the build cache.
|
||||||
|
Description string
|
||||||
|
// InUse indicates if the build cache is in use.
|
||||||
|
InUse bool
|
||||||
|
// Shared indicates if the build cache is shared.
|
||||||
|
Shared bool
|
||||||
|
// Size is the amount of disk space used by the build cache (in bytes).
|
||||||
|
Size int64
|
||||||
|
// CreatedAt is the date and time at which the build cache was created.
|
||||||
|
CreatedAt time.Time
|
||||||
|
// LastUsedAt is the date and time at which the build cache was last used.
|
||||||
|
LastUsedAt *time.Time
|
||||||
|
UsageCount int
|
||||||
|
}
|
||||||
|
|
||||||
|
// CachePruneReport contains the response for Engine API:
|
||||||
|
// POST "/build/prune"
|
||||||
|
type CachePruneReport struct {
|
||||||
|
CachesDeleted []string
|
||||||
|
SpaceReclaimed uint64
|
||||||
|
}
|
||||||
36
vendor/github.com/moby/moby/api/types/build/disk_usage.go
generated
vendored
Normal file
36
vendor/github.com/moby/moby/api/types/build/disk_usage.go
generated
vendored
Normal file
|
|
@ -0,0 +1,36 @@
|
||||||
|
// Code generated by go-swagger; DO NOT EDIT.
|
||||||
|
|
||||||
|
package build
|
||||||
|
|
||||||
|
// This file was generated by the swagger tool.
|
||||||
|
// Editing this file might prove futile when you re-run the swagger generate command
|
||||||
|
|
||||||
|
// DiskUsage represents system data usage for build cache resources.
|
||||||
|
//
|
||||||
|
// swagger:model DiskUsage
|
||||||
|
type DiskUsage struct {
|
||||||
|
|
||||||
|
// Count of active build cache records.
|
||||||
|
//
|
||||||
|
// Example: 1
|
||||||
|
ActiveCount int64 `json:"ActiveCount,omitempty"`
|
||||||
|
|
||||||
|
// List of build cache records.
|
||||||
|
//
|
||||||
|
Items []CacheRecord `json:"Items,omitempty"`
|
||||||
|
|
||||||
|
// Disk space that can be reclaimed by removing inactive build cache records.
|
||||||
|
//
|
||||||
|
// Example: 12345678
|
||||||
|
Reclaimable int64 `json:"Reclaimable,omitempty"`
|
||||||
|
|
||||||
|
// Count of all build cache records.
|
||||||
|
//
|
||||||
|
// Example: 4
|
||||||
|
TotalCount int64 `json:"TotalCount,omitempty"`
|
||||||
|
|
||||||
|
// Disk space in use by build cache records.
|
||||||
|
//
|
||||||
|
// Example: 98765432
|
||||||
|
TotalSize int64 `json:"TotalSize,omitempty"`
|
||||||
|
}
|
||||||
8
vendor/github.com/moby/moby/api/types/checkpoint/create_request.go
generated
vendored
Normal file
8
vendor/github.com/moby/moby/api/types/checkpoint/create_request.go
generated
vendored
Normal file
|
|
@ -0,0 +1,8 @@
|
||||||
|
package checkpoint
|
||||||
|
|
||||||
|
// CreateRequest holds parameters to create a checkpoint from a container.
|
||||||
|
type CreateRequest struct {
|
||||||
|
CheckpointID string
|
||||||
|
CheckpointDir string
|
||||||
|
Exit bool
|
||||||
|
}
|
||||||
7
vendor/github.com/moby/moby/api/types/checkpoint/list.go
generated
vendored
Normal file
7
vendor/github.com/moby/moby/api/types/checkpoint/list.go
generated
vendored
Normal file
|
|
@ -0,0 +1,7 @@
|
||||||
|
package checkpoint
|
||||||
|
|
||||||
|
// Summary represents the details of a checkpoint when listing endpoints.
|
||||||
|
type Summary struct {
|
||||||
|
// Name is the name of the checkpoint.
|
||||||
|
Name string
|
||||||
|
}
|
||||||
17
vendor/github.com/moby/moby/api/types/common/error_response.go
generated
vendored
Normal file
17
vendor/github.com/moby/moby/api/types/common/error_response.go
generated
vendored
Normal file
|
|
@ -0,0 +1,17 @@
|
||||||
|
// Code generated by go-swagger; DO NOT EDIT.
|
||||||
|
|
||||||
|
package common
|
||||||
|
|
||||||
|
// This file was generated by the swagger tool.
|
||||||
|
// Editing this file might prove futile when you re-run the swagger generate command
|
||||||
|
|
||||||
|
// ErrorResponse Represents an error.
|
||||||
|
// Example: {"message":"Something went wrong."}
|
||||||
|
//
|
||||||
|
// swagger:model ErrorResponse
|
||||||
|
type ErrorResponse struct {
|
||||||
|
|
||||||
|
// The error message.
|
||||||
|
// Required: true
|
||||||
|
Message string `json:"message"`
|
||||||
|
}
|
||||||
6
vendor/github.com/moby/moby/api/types/common/error_response_ext.go
generated
vendored
Normal file
6
vendor/github.com/moby/moby/api/types/common/error_response_ext.go
generated
vendored
Normal file
|
|
@ -0,0 +1,6 @@
|
||||||
|
package common
|
||||||
|
|
||||||
|
// Error returns the error message
|
||||||
|
func (e ErrorResponse) Error() string {
|
||||||
|
return e.Message
|
||||||
|
}
|
||||||
16
vendor/github.com/moby/moby/api/types/common/id_response.go
generated
vendored
Normal file
16
vendor/github.com/moby/moby/api/types/common/id_response.go
generated
vendored
Normal file
|
|
@ -0,0 +1,16 @@
|
||||||
|
// Code generated by go-swagger; DO NOT EDIT.
|
||||||
|
|
||||||
|
package common
|
||||||
|
|
||||||
|
// This file was generated by the swagger tool.
|
||||||
|
// Editing this file might prove futile when you re-run the swagger generate command
|
||||||
|
|
||||||
|
// IDResponse Response to an API call that returns just an Id
|
||||||
|
//
|
||||||
|
// swagger:model IDResponse
|
||||||
|
type IDResponse struct {
|
||||||
|
|
||||||
|
// The id of the newly created object.
|
||||||
|
// Required: true
|
||||||
|
ID string `json:"Id"`
|
||||||
|
}
|
||||||
17
vendor/github.com/moby/moby/api/types/container/change_type.go
generated
vendored
Normal file
17
vendor/github.com/moby/moby/api/types/container/change_type.go
generated
vendored
Normal file
|
|
@ -0,0 +1,17 @@
|
||||||
|
// Code generated by go-swagger; DO NOT EDIT.
|
||||||
|
|
||||||
|
package container
|
||||||
|
|
||||||
|
// This file was generated by the swagger tool.
|
||||||
|
// Editing this file might prove futile when you re-run the swagger generate command
|
||||||
|
|
||||||
|
// ChangeType Kind of change
|
||||||
|
//
|
||||||
|
// Can be one of:
|
||||||
|
//
|
||||||
|
// - `0`: Modified ("C")
|
||||||
|
// - `1`: Added ("A")
|
||||||
|
// - `2`: Deleted ("D")
|
||||||
|
//
|
||||||
|
// swagger:model ChangeType
|
||||||
|
type ChangeType uint8
|
||||||
23
vendor/github.com/moby/moby/api/types/container/change_types.go
generated
vendored
Normal file
23
vendor/github.com/moby/moby/api/types/container/change_types.go
generated
vendored
Normal file
|
|
@ -0,0 +1,23 @@
|
||||||
|
package container
|
||||||
|
|
||||||
|
const (
|
||||||
|
// ChangeModify represents the modify operation.
|
||||||
|
ChangeModify ChangeType = 0
|
||||||
|
// ChangeAdd represents the add operation.
|
||||||
|
ChangeAdd ChangeType = 1
|
||||||
|
// ChangeDelete represents the delete operation.
|
||||||
|
ChangeDelete ChangeType = 2
|
||||||
|
)
|
||||||
|
|
||||||
|
func (ct ChangeType) String() string {
|
||||||
|
switch ct {
|
||||||
|
case ChangeModify:
|
||||||
|
return "C"
|
||||||
|
case ChangeAdd:
|
||||||
|
return "A"
|
||||||
|
case ChangeDelete:
|
||||||
|
return "D"
|
||||||
|
default:
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
}
|
||||||
7
vendor/github.com/moby/moby/api/types/container/commit.go
generated
vendored
Normal file
7
vendor/github.com/moby/moby/api/types/container/commit.go
generated
vendored
Normal file
|
|
@ -0,0 +1,7 @@
|
||||||
|
package container
|
||||||
|
|
||||||
|
import "github.com/moby/moby/api/types/common"
|
||||||
|
|
||||||
|
// CommitResponse response for the commit API call, containing the ID of the
|
||||||
|
// image that was produced.
|
||||||
|
type CommitResponse = common.IDResponse
|
||||||
50
vendor/github.com/moby/moby/api/types/container/config.go
generated
vendored
Normal file
50
vendor/github.com/moby/moby/api/types/container/config.go
generated
vendored
Normal file
|
|
@ -0,0 +1,50 @@
|
||||||
|
package container
|
||||||
|
|
||||||
|
import (
|
||||||
|
"time"
|
||||||
|
|
||||||
|
dockerspec "github.com/moby/docker-image-spec/specs-go/v1"
|
||||||
|
"github.com/moby/moby/api/types/network"
|
||||||
|
)
|
||||||
|
|
||||||
|
// MinimumDuration puts a minimum on user configured duration.
|
||||||
|
// This is to prevent API error on time unit. For example, API may
|
||||||
|
// set 3 as healthcheck interval with intention of 3 seconds, but
|
||||||
|
// Docker interprets it as 3 nanoseconds.
|
||||||
|
const MinimumDuration = 1 * time.Millisecond
|
||||||
|
|
||||||
|
// HealthConfig holds configuration settings for the HEALTHCHECK feature.
|
||||||
|
type HealthConfig = dockerspec.HealthcheckConfig
|
||||||
|
|
||||||
|
// Config contains the configuration data about a container.
|
||||||
|
// It should hold only portable information about the container.
|
||||||
|
// Here, "portable" means "independent from the host we are running on".
|
||||||
|
// Non-portable information *should* appear in HostConfig.
|
||||||
|
// All fields added to this struct must be marked `omitempty` to keep getting
|
||||||
|
// predictable hashes from the old `v1Compatibility` configuration.
|
||||||
|
type Config struct {
|
||||||
|
Hostname string // Hostname
|
||||||
|
Domainname string // Domainname
|
||||||
|
User string // User that will run the command(s) inside the container, also support user:group
|
||||||
|
AttachStdin bool // Attach the standard input, makes possible user interaction
|
||||||
|
AttachStdout bool // Attach the standard output
|
||||||
|
AttachStderr bool // Attach the standard error
|
||||||
|
ExposedPorts network.PortSet `json:",omitempty"` // List of exposed ports
|
||||||
|
Tty bool // Attach standard streams to a tty, including stdin if it is not closed.
|
||||||
|
OpenStdin bool // Open stdin
|
||||||
|
StdinOnce bool // If true, close stdin after the 1 attached client disconnects.
|
||||||
|
Env []string // List of environment variable to set in the container
|
||||||
|
Cmd []string // Command to run when starting the container
|
||||||
|
Healthcheck *HealthConfig `json:",omitempty"` // Healthcheck describes how to check the container is healthy
|
||||||
|
ArgsEscaped bool `json:",omitempty"` // True if command is already escaped (meaning treat as a command line) (Windows specific).
|
||||||
|
Image string // Name of the image as it was passed by the operator (e.g. could be symbolic)
|
||||||
|
Volumes map[string]struct{} // List of volumes (mounts) used for the container
|
||||||
|
WorkingDir string // Current directory (PWD) in the command will be launched
|
||||||
|
Entrypoint []string // Entrypoint to run when starting the container
|
||||||
|
NetworkDisabled bool `json:",omitempty"` // Is network disabled
|
||||||
|
OnBuild []string `json:",omitempty"` // ONBUILD metadata that were defined on the image Dockerfile
|
||||||
|
Labels map[string]string // List of labels set to this container
|
||||||
|
StopSignal string `json:",omitempty"` // Signal to stop a container
|
||||||
|
StopTimeout *int `json:",omitempty"` // Timeout (in seconds) to stop a container
|
||||||
|
Shell []string `json:",omitempty"` // Shell for shell-form of RUN, CMD, ENTRYPOINT
|
||||||
|
}
|
||||||
151
vendor/github.com/moby/moby/api/types/container/container.go
generated
vendored
Normal file
151
vendor/github.com/moby/moby/api/types/container/container.go
generated
vendored
Normal file
|
|
@ -0,0 +1,151 @@
|
||||||
|
package container
|
||||||
|
|
||||||
|
import (
|
||||||
|
"os"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/moby/moby/api/types/mount"
|
||||||
|
"github.com/moby/moby/api/types/storage"
|
||||||
|
ocispec "github.com/opencontainers/image-spec/specs-go/v1"
|
||||||
|
)
|
||||||
|
|
||||||
|
// PruneReport contains the response for Engine API:
|
||||||
|
// POST "/containers/prune"
|
||||||
|
type PruneReport struct {
|
||||||
|
ContainersDeleted []string
|
||||||
|
SpaceReclaimed uint64
|
||||||
|
}
|
||||||
|
|
||||||
|
// PathStat is used to encode the header from
|
||||||
|
// GET "/containers/{name:.*}/archive"
|
||||||
|
// "Name" is the file or directory name.
|
||||||
|
type PathStat struct {
|
||||||
|
Name string `json:"name"`
|
||||||
|
Size int64 `json:"size"`
|
||||||
|
Mode os.FileMode `json:"mode"`
|
||||||
|
Mtime time.Time `json:"mtime"`
|
||||||
|
LinkTarget string `json:"linkTarget"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// MountPoint represents a mount point configuration inside the container.
|
||||||
|
// This is used for reporting the mountpoints in use by a container.
|
||||||
|
type MountPoint struct {
|
||||||
|
// Type is the type of mount, see [mount.Type] definitions for details.
|
||||||
|
Type mount.Type `json:",omitempty"`
|
||||||
|
|
||||||
|
// Name is the name reference to the underlying data defined by `Source`
|
||||||
|
// e.g., the volume name.
|
||||||
|
Name string `json:",omitempty"`
|
||||||
|
|
||||||
|
// Source is the source location of the mount.
|
||||||
|
//
|
||||||
|
// For volumes, this contains the storage location of the volume (within
|
||||||
|
// `/var/lib/docker/volumes/`). For bind-mounts, and `npipe`, this contains
|
||||||
|
// the source (host) part of the bind-mount. For `tmpfs` mount points, this
|
||||||
|
// field is empty.
|
||||||
|
Source string
|
||||||
|
|
||||||
|
// Destination is the path relative to the container root (`/`) where the
|
||||||
|
// Source is mounted inside the container.
|
||||||
|
Destination string
|
||||||
|
|
||||||
|
// Driver is the volume driver used to create the volume (if it is a volume).
|
||||||
|
Driver string `json:",omitempty"`
|
||||||
|
|
||||||
|
// Mode is a comma separated list of options supplied by the user when
|
||||||
|
// creating the bind/volume mount.
|
||||||
|
//
|
||||||
|
// The default is platform-specific (`"z"` on Linux, empty on Windows).
|
||||||
|
Mode string
|
||||||
|
|
||||||
|
// RW indicates whether the mount is mounted writable (read-write).
|
||||||
|
RW bool
|
||||||
|
|
||||||
|
// Propagation describes how mounts are propagated from the host into the
|
||||||
|
// mount point, and vice-versa. Refer to the Linux kernel documentation
|
||||||
|
// for details:
|
||||||
|
// https://www.kernel.org/doc/Documentation/filesystems/sharedsubtree.txt
|
||||||
|
//
|
||||||
|
// This field is not used on Windows.
|
||||||
|
Propagation mount.Propagation
|
||||||
|
}
|
||||||
|
|
||||||
|
// State stores container's running state
|
||||||
|
// it's part of ContainerJSONBase and returned by "inspect" command
|
||||||
|
type State struct {
|
||||||
|
Status ContainerState // String representation of the container state. Can be one of "created", "running", "paused", "restarting", "removing", "exited", or "dead"
|
||||||
|
Running bool
|
||||||
|
Paused bool
|
||||||
|
Restarting bool
|
||||||
|
OOMKilled bool
|
||||||
|
Dead bool
|
||||||
|
Pid int
|
||||||
|
ExitCode int
|
||||||
|
Error string
|
||||||
|
StartedAt string
|
||||||
|
FinishedAt string
|
||||||
|
Health *Health `json:",omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// Summary contains response of Engine API:
|
||||||
|
// GET "/containers/json"
|
||||||
|
type Summary struct {
|
||||||
|
ID string `json:"Id"`
|
||||||
|
Names []string
|
||||||
|
Image string
|
||||||
|
ImageID string
|
||||||
|
ImageManifestDescriptor *ocispec.Descriptor `json:"ImageManifestDescriptor,omitempty"`
|
||||||
|
Command string
|
||||||
|
Created int64
|
||||||
|
Ports []PortSummary
|
||||||
|
SizeRw int64 `json:",omitempty"`
|
||||||
|
SizeRootFs int64 `json:",omitempty"`
|
||||||
|
Labels map[string]string
|
||||||
|
State ContainerState
|
||||||
|
Status string
|
||||||
|
HostConfig struct {
|
||||||
|
NetworkMode string `json:",omitempty"`
|
||||||
|
Annotations map[string]string `json:",omitempty"`
|
||||||
|
}
|
||||||
|
Health *HealthSummary `json:",omitempty"`
|
||||||
|
NetworkSettings *NetworkSettingsSummary
|
||||||
|
Mounts []MountPoint
|
||||||
|
}
|
||||||
|
|
||||||
|
// InspectResponse is the response for the GET "/containers/{name:.*}/json"
|
||||||
|
// endpoint.
|
||||||
|
type InspectResponse struct {
|
||||||
|
ID string `json:"Id"`
|
||||||
|
Created string
|
||||||
|
Path string
|
||||||
|
Args []string
|
||||||
|
State *State
|
||||||
|
Image string
|
||||||
|
ResolvConfPath string
|
||||||
|
HostnamePath string
|
||||||
|
HostsPath string
|
||||||
|
LogPath string
|
||||||
|
Name string
|
||||||
|
RestartCount int
|
||||||
|
Driver string
|
||||||
|
Platform string
|
||||||
|
MountLabel string
|
||||||
|
ProcessLabel string
|
||||||
|
AppArmorProfile string
|
||||||
|
ExecIDs []string
|
||||||
|
HostConfig *HostConfig
|
||||||
|
|
||||||
|
// GraphDriver contains information about the container's graph driver.
|
||||||
|
GraphDriver *storage.DriverData `json:"GraphDriver,omitempty"`
|
||||||
|
|
||||||
|
// Storage contains information about the storage used for the container's filesystem.
|
||||||
|
Storage *storage.Storage `json:"Storage,omitempty"`
|
||||||
|
|
||||||
|
SizeRw *int64 `json:",omitempty"`
|
||||||
|
SizeRootFs *int64 `json:",omitempty"`
|
||||||
|
Mounts []MountPoint
|
||||||
|
Config *Config
|
||||||
|
NetworkSettings *NetworkSettings
|
||||||
|
// ImageManifestDescriptor is the descriptor of a platform-specific manifest of the image used to create the container.
|
||||||
|
ImageManifestDescriptor *ocispec.Descriptor `json:"ImageManifestDescriptor,omitempty"`
|
||||||
|
}
|
||||||
13
vendor/github.com/moby/moby/api/types/container/create_request.go
generated
vendored
Normal file
13
vendor/github.com/moby/moby/api/types/container/create_request.go
generated
vendored
Normal file
|
|
@ -0,0 +1,13 @@
|
||||||
|
package container
|
||||||
|
|
||||||
|
import "github.com/moby/moby/api/types/network"
|
||||||
|
|
||||||
|
// CreateRequest is the request message sent to the server for container
|
||||||
|
// create calls. It is a config wrapper that holds the container [Config]
|
||||||
|
// (portable) and the corresponding [HostConfig] (non-portable) and
|
||||||
|
// [network.NetworkingConfig].
|
||||||
|
type CreateRequest struct {
|
||||||
|
*Config
|
||||||
|
HostConfig *HostConfig `json:"HostConfig,omitempty"`
|
||||||
|
NetworkingConfig *network.NetworkingConfig `json:"NetworkingConfig,omitempty"`
|
||||||
|
}
|
||||||
24
vendor/github.com/moby/moby/api/types/container/create_response.go
generated
vendored
Normal file
24
vendor/github.com/moby/moby/api/types/container/create_response.go
generated
vendored
Normal file
|
|
@ -0,0 +1,24 @@
|
||||||
|
// Code generated by go-swagger; DO NOT EDIT.
|
||||||
|
|
||||||
|
package container
|
||||||
|
|
||||||
|
// This file was generated by the swagger tool.
|
||||||
|
// Editing this file might prove futile when you re-run the swagger generate command
|
||||||
|
|
||||||
|
// CreateResponse ContainerCreateResponse
|
||||||
|
//
|
||||||
|
// # OK response to ContainerCreate operation
|
||||||
|
//
|
||||||
|
// swagger:model CreateResponse
|
||||||
|
type CreateResponse struct {
|
||||||
|
|
||||||
|
// The ID of the created container
|
||||||
|
// Example: ede54ee1afda366ab42f824e8a5ffd195155d853ceaec74a927f249ea270c743
|
||||||
|
// Required: true
|
||||||
|
ID string `json:"Id"`
|
||||||
|
|
||||||
|
// Warnings encountered when creating the container
|
||||||
|
// Example: []
|
||||||
|
// Required: true
|
||||||
|
Warnings []string `json:"Warnings"`
|
||||||
|
}
|
||||||
36
vendor/github.com/moby/moby/api/types/container/disk_usage.go
generated
vendored
Normal file
36
vendor/github.com/moby/moby/api/types/container/disk_usage.go
generated
vendored
Normal file
|
|
@ -0,0 +1,36 @@
|
||||||
|
// Code generated by go-swagger; DO NOT EDIT.
|
||||||
|
|
||||||
|
package container
|
||||||
|
|
||||||
|
// This file was generated by the swagger tool.
|
||||||
|
// Editing this file might prove futile when you re-run the swagger generate command
|
||||||
|
|
||||||
|
// DiskUsage represents system data usage information for container resources.
|
||||||
|
//
|
||||||
|
// swagger:model DiskUsage
|
||||||
|
type DiskUsage struct {
|
||||||
|
|
||||||
|
// Count of active containers.
|
||||||
|
//
|
||||||
|
// Example: 1
|
||||||
|
ActiveCount int64 `json:"ActiveCount,omitempty"`
|
||||||
|
|
||||||
|
// List of container summaries.
|
||||||
|
//
|
||||||
|
Items []Summary `json:"Items,omitempty"`
|
||||||
|
|
||||||
|
// Disk space that can be reclaimed by removing inactive containers.
|
||||||
|
//
|
||||||
|
// Example: 12345678
|
||||||
|
Reclaimable int64 `json:"Reclaimable,omitempty"`
|
||||||
|
|
||||||
|
// Count of all containers.
|
||||||
|
//
|
||||||
|
// Example: 4
|
||||||
|
TotalCount int64 `json:"TotalCount,omitempty"`
|
||||||
|
|
||||||
|
// Disk space in use by containers.
|
||||||
|
//
|
||||||
|
// Example: 98765432
|
||||||
|
TotalSize int64 `json:"TotalSize,omitempty"`
|
||||||
|
}
|
||||||
9
vendor/github.com/moby/moby/api/types/container/errors.go
generated
vendored
Normal file
9
vendor/github.com/moby/moby/api/types/container/errors.go
generated
vendored
Normal file
|
|
@ -0,0 +1,9 @@
|
||||||
|
package container
|
||||||
|
|
||||||
|
type errInvalidParameter struct{ error }
|
||||||
|
|
||||||
|
func (e *errInvalidParameter) InvalidParameter() {}
|
||||||
|
|
||||||
|
func (e *errInvalidParameter) Unwrap() error {
|
||||||
|
return e.error
|
||||||
|
}
|
||||||
35
vendor/github.com/moby/moby/api/types/container/exec.go
generated
vendored
Normal file
35
vendor/github.com/moby/moby/api/types/container/exec.go
generated
vendored
Normal file
|
|
@ -0,0 +1,35 @@
|
||||||
|
package container
|
||||||
|
|
||||||
|
import "github.com/moby/moby/api/types/common"
|
||||||
|
|
||||||
|
// ExecCreateResponse is the response for a successful exec-create request.
|
||||||
|
// It holds the ID of the exec that was created.
|
||||||
|
//
|
||||||
|
// TODO(thaJeztah): make this a distinct type.
|
||||||
|
type ExecCreateResponse = common.IDResponse
|
||||||
|
|
||||||
|
// ExecInspectResponse is the API response for the "GET /exec/{id}/json"
|
||||||
|
// endpoint and holds information about and exec.
|
||||||
|
type ExecInspectResponse struct {
|
||||||
|
ID string `json:"ID"`
|
||||||
|
Running bool `json:"Running"`
|
||||||
|
ExitCode *int `json:"ExitCode"`
|
||||||
|
ProcessConfig *ExecProcessConfig
|
||||||
|
OpenStdin bool `json:"OpenStdin"`
|
||||||
|
OpenStderr bool `json:"OpenStderr"`
|
||||||
|
OpenStdout bool `json:"OpenStdout"`
|
||||||
|
CanRemove bool `json:"CanRemove"`
|
||||||
|
ContainerID string `json:"ContainerID"`
|
||||||
|
DetachKeys []byte `json:"DetachKeys"`
|
||||||
|
Pid int `json:"Pid"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// ExecProcessConfig holds information about the exec process
|
||||||
|
// running on the host.
|
||||||
|
type ExecProcessConfig struct {
|
||||||
|
Tty bool `json:"tty"`
|
||||||
|
Entrypoint string `json:"entrypoint"`
|
||||||
|
Arguments []string `json:"arguments"`
|
||||||
|
Privileged *bool `json:"privileged,omitempty"`
|
||||||
|
User string `json:"user,omitempty"`
|
||||||
|
}
|
||||||
17
vendor/github.com/moby/moby/api/types/container/exec_create_request.go
generated
vendored
Normal file
17
vendor/github.com/moby/moby/api/types/container/exec_create_request.go
generated
vendored
Normal file
|
|
@ -0,0 +1,17 @@
|
||||||
|
package container
|
||||||
|
|
||||||
|
// ExecCreateRequest is a small subset of the Config struct that holds the configuration
|
||||||
|
// for the exec feature of docker.
|
||||||
|
type ExecCreateRequest struct {
|
||||||
|
User string // User that will run the command
|
||||||
|
Privileged bool // Is the container in privileged mode
|
||||||
|
Tty bool // Attach standard streams to a tty.
|
||||||
|
ConsoleSize *[2]uint `json:",omitempty"` // Initial console size [height, width]
|
||||||
|
AttachStdin bool // Attach the standard input, makes possible user interaction
|
||||||
|
AttachStderr bool // Attach the standard error
|
||||||
|
AttachStdout bool // Attach the standard output
|
||||||
|
DetachKeys string // Escape keys for detach
|
||||||
|
Env []string // Environment variables
|
||||||
|
WorkingDir string // Working directory
|
||||||
|
Cmd []string // Execution commands and args
|
||||||
|
}
|
||||||
12
vendor/github.com/moby/moby/api/types/container/exec_start_request.go
generated
vendored
Normal file
12
vendor/github.com/moby/moby/api/types/container/exec_start_request.go
generated
vendored
Normal file
|
|
@ -0,0 +1,12 @@
|
||||||
|
package container
|
||||||
|
|
||||||
|
// ExecStartRequest is a temp struct used by execStart
|
||||||
|
// Config fields is part of ExecConfig in runconfig package
|
||||||
|
type ExecStartRequest struct {
|
||||||
|
// ExecStart will first check if it's detached
|
||||||
|
Detach bool
|
||||||
|
// Check if there's a tty
|
||||||
|
Tty bool
|
||||||
|
// Terminal size [height, width], unused if Tty == false
|
||||||
|
ConsoleSize *[2]uint `json:",omitempty"`
|
||||||
|
}
|
||||||
21
vendor/github.com/moby/moby/api/types/container/filesystem_change.go
generated
vendored
Normal file
21
vendor/github.com/moby/moby/api/types/container/filesystem_change.go
generated
vendored
Normal file
|
|
@ -0,0 +1,21 @@
|
||||||
|
// Code generated by go-swagger; DO NOT EDIT.
|
||||||
|
|
||||||
|
package container
|
||||||
|
|
||||||
|
// This file was generated by the swagger tool.
|
||||||
|
// Editing this file might prove futile when you re-run the swagger generate command
|
||||||
|
|
||||||
|
// FilesystemChange Change in the container's filesystem.
|
||||||
|
//
|
||||||
|
// swagger:model FilesystemChange
|
||||||
|
type FilesystemChange struct {
|
||||||
|
|
||||||
|
// kind
|
||||||
|
// Required: true
|
||||||
|
Kind ChangeType `json:"Kind"`
|
||||||
|
|
||||||
|
// Path to file or directory that has changed.
|
||||||
|
//
|
||||||
|
// Required: true
|
||||||
|
Path string `json:"Path"`
|
||||||
|
}
|
||||||
57
vendor/github.com/moby/moby/api/types/container/health.go
generated
vendored
Normal file
57
vendor/github.com/moby/moby/api/types/container/health.go
generated
vendored
Normal file
|
|
@ -0,0 +1,57 @@
|
||||||
|
package container
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"strings"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
// HealthStatus is a string representation of the container's health.
|
||||||
|
type HealthStatus string
|
||||||
|
|
||||||
|
// Health states
|
||||||
|
const (
|
||||||
|
NoHealthcheck HealthStatus = "none" // Indicates there is no healthcheck
|
||||||
|
Starting HealthStatus = "starting" // Starting indicates that the container is not yet ready
|
||||||
|
Healthy HealthStatus = "healthy" // Healthy indicates that the container is running correctly
|
||||||
|
Unhealthy HealthStatus = "unhealthy" // Unhealthy indicates that the container has a problem
|
||||||
|
)
|
||||||
|
|
||||||
|
// Health stores information about the container's healthcheck results
|
||||||
|
type Health struct {
|
||||||
|
Status HealthStatus // Status is one of [Starting], [Healthy] or [Unhealthy].
|
||||||
|
FailingStreak int // FailingStreak is the number of consecutive failures
|
||||||
|
Log []*HealthcheckResult // Log contains the last few results (oldest first)
|
||||||
|
}
|
||||||
|
|
||||||
|
// HealthSummary stores a summary of the container's healthcheck results.
|
||||||
|
type HealthSummary struct {
|
||||||
|
Status HealthStatus // Status is one of [NoHealthcheck], [Starting], [Healthy] or [Unhealthy].
|
||||||
|
FailingStreak int // FailingStreak is the number of consecutive failures
|
||||||
|
}
|
||||||
|
|
||||||
|
// HealthcheckResult stores information about a single run of a healthcheck probe
|
||||||
|
type HealthcheckResult struct {
|
||||||
|
Start time.Time // Start is the time this check started
|
||||||
|
End time.Time // End is the time this check ended
|
||||||
|
ExitCode int // ExitCode meanings: 0=healthy, 1=unhealthy, 2=reserved (considered unhealthy), else=error running probe
|
||||||
|
Output string // Output from last check
|
||||||
|
}
|
||||||
|
|
||||||
|
var validHealths = []string{
|
||||||
|
string(NoHealthcheck),
|
||||||
|
string(Starting),
|
||||||
|
string(Healthy),
|
||||||
|
string(Unhealthy),
|
||||||
|
}
|
||||||
|
|
||||||
|
// ValidateHealthStatus checks if the provided string is a valid
|
||||||
|
// container [HealthStatus].
|
||||||
|
func ValidateHealthStatus(s HealthStatus) error {
|
||||||
|
switch s {
|
||||||
|
case NoHealthcheck, Starting, Healthy, Unhealthy:
|
||||||
|
return nil
|
||||||
|
default:
|
||||||
|
return errInvalidParameter{error: fmt.Errorf("invalid value for health (%s): must be one of %s", s, strings.Join(validHealths, ", "))}
|
||||||
|
}
|
||||||
|
}
|
||||||
495
vendor/github.com/moby/moby/api/types/container/hostconfig.go
generated
vendored
Normal file
495
vendor/github.com/moby/moby/api/types/container/hostconfig.go
generated
vendored
Normal file
|
|
@ -0,0 +1,495 @@
|
||||||
|
package container
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
"net/netip"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"github.com/docker/go-units"
|
||||||
|
"github.com/moby/moby/api/types/blkiodev"
|
||||||
|
"github.com/moby/moby/api/types/mount"
|
||||||
|
"github.com/moby/moby/api/types/network"
|
||||||
|
)
|
||||||
|
|
||||||
|
// CgroupnsMode represents the cgroup namespace mode of the container
|
||||||
|
type CgroupnsMode string
|
||||||
|
|
||||||
|
// cgroup namespace modes for containers
|
||||||
|
const (
|
||||||
|
CgroupnsModeEmpty CgroupnsMode = ""
|
||||||
|
CgroupnsModePrivate CgroupnsMode = "private"
|
||||||
|
CgroupnsModeHost CgroupnsMode = "host"
|
||||||
|
)
|
||||||
|
|
||||||
|
// IsPrivate indicates whether the container uses its own private cgroup namespace
|
||||||
|
func (c CgroupnsMode) IsPrivate() bool {
|
||||||
|
return c == CgroupnsModePrivate
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsHost indicates whether the container shares the host's cgroup namespace
|
||||||
|
func (c CgroupnsMode) IsHost() bool {
|
||||||
|
return c == CgroupnsModeHost
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsEmpty indicates whether the container cgroup namespace mode is unset
|
||||||
|
func (c CgroupnsMode) IsEmpty() bool {
|
||||||
|
return c == CgroupnsModeEmpty
|
||||||
|
}
|
||||||
|
|
||||||
|
// Valid indicates whether the cgroup namespace mode is valid
|
||||||
|
func (c CgroupnsMode) Valid() bool {
|
||||||
|
return c.IsEmpty() || c.IsPrivate() || c.IsHost()
|
||||||
|
}
|
||||||
|
|
||||||
|
// Isolation represents the isolation technology of a container. The supported
|
||||||
|
// values are platform specific
|
||||||
|
type Isolation string
|
||||||
|
|
||||||
|
// Isolation modes for containers
|
||||||
|
const (
|
||||||
|
IsolationEmpty Isolation = "" // IsolationEmpty is unspecified (same behavior as default)
|
||||||
|
IsolationDefault Isolation = "default" // IsolationDefault is the default isolation mode on current daemon
|
||||||
|
IsolationProcess Isolation = "process" // IsolationProcess is process isolation mode
|
||||||
|
IsolationHyperV Isolation = "hyperv" // IsolationHyperV is HyperV isolation mode
|
||||||
|
)
|
||||||
|
|
||||||
|
// IsDefault indicates the default isolation technology of a container. On Linux this
|
||||||
|
// is the native driver. On Windows, this is a Windows Server Container.
|
||||||
|
func (i Isolation) IsDefault() bool {
|
||||||
|
// TODO consider making isolation-mode strict (case-sensitive)
|
||||||
|
v := Isolation(strings.ToLower(string(i)))
|
||||||
|
return v == IsolationDefault || v == IsolationEmpty
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsHyperV indicates the use of a Hyper-V partition for isolation
|
||||||
|
func (i Isolation) IsHyperV() bool {
|
||||||
|
// TODO consider making isolation-mode strict (case-sensitive)
|
||||||
|
return Isolation(strings.ToLower(string(i))) == IsolationHyperV
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsProcess indicates the use of process isolation
|
||||||
|
func (i Isolation) IsProcess() bool {
|
||||||
|
// TODO consider making isolation-mode strict (case-sensitive)
|
||||||
|
return Isolation(strings.ToLower(string(i))) == IsolationProcess
|
||||||
|
}
|
||||||
|
|
||||||
|
// IpcMode represents the container ipc stack.
|
||||||
|
type IpcMode string
|
||||||
|
|
||||||
|
// IpcMode constants
|
||||||
|
const (
|
||||||
|
IPCModeNone IpcMode = "none"
|
||||||
|
IPCModeHost IpcMode = "host"
|
||||||
|
IPCModeContainer IpcMode = "container"
|
||||||
|
IPCModePrivate IpcMode = "private"
|
||||||
|
IPCModeShareable IpcMode = "shareable"
|
||||||
|
)
|
||||||
|
|
||||||
|
// IsPrivate indicates whether the container uses its own private ipc namespace which can not be shared.
|
||||||
|
func (n IpcMode) IsPrivate() bool {
|
||||||
|
return n == IPCModePrivate
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsHost indicates whether the container shares the host's ipc namespace.
|
||||||
|
func (n IpcMode) IsHost() bool {
|
||||||
|
return n == IPCModeHost
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsShareable indicates whether the container's ipc namespace can be shared with another container.
|
||||||
|
func (n IpcMode) IsShareable() bool {
|
||||||
|
return n == IPCModeShareable
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsContainer indicates whether the container uses another container's ipc namespace.
|
||||||
|
func (n IpcMode) IsContainer() bool {
|
||||||
|
_, ok := containerID(string(n))
|
||||||
|
return ok
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsNone indicates whether container IpcMode is set to "none".
|
||||||
|
func (n IpcMode) IsNone() bool {
|
||||||
|
return n == IPCModeNone
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsEmpty indicates whether container IpcMode is empty
|
||||||
|
func (n IpcMode) IsEmpty() bool {
|
||||||
|
return n == ""
|
||||||
|
}
|
||||||
|
|
||||||
|
// Valid indicates whether the ipc mode is valid.
|
||||||
|
func (n IpcMode) Valid() bool {
|
||||||
|
// TODO(thaJeztah): align with PidMode, and consider container-mode without a container name/ID to be invalid.
|
||||||
|
return n.IsEmpty() || n.IsNone() || n.IsPrivate() || n.IsHost() || n.IsShareable() || n.IsContainer()
|
||||||
|
}
|
||||||
|
|
||||||
|
// Container returns the name of the container ipc stack is going to be used.
|
||||||
|
func (n IpcMode) Container() (idOrName string) {
|
||||||
|
idOrName, _ = containerID(string(n))
|
||||||
|
return idOrName
|
||||||
|
}
|
||||||
|
|
||||||
|
// NetworkMode represents the container network stack.
|
||||||
|
type NetworkMode string
|
||||||
|
|
||||||
|
// IsNone indicates whether container isn't using a network stack.
|
||||||
|
func (n NetworkMode) IsNone() bool {
|
||||||
|
return n == network.NetworkNone
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsDefault indicates whether container uses the default network stack.
|
||||||
|
func (n NetworkMode) IsDefault() bool {
|
||||||
|
return n == network.NetworkDefault
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsPrivate indicates whether container uses its private network stack.
|
||||||
|
func (n NetworkMode) IsPrivate() bool {
|
||||||
|
return !n.IsHost() && !n.IsContainer()
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsContainer indicates whether container uses a container network stack.
|
||||||
|
func (n NetworkMode) IsContainer() bool {
|
||||||
|
_, ok := containerID(string(n))
|
||||||
|
return ok
|
||||||
|
}
|
||||||
|
|
||||||
|
// ConnectedContainer is the id of the container which network this container is connected to.
|
||||||
|
func (n NetworkMode) ConnectedContainer() (idOrName string) {
|
||||||
|
idOrName, _ = containerID(string(n))
|
||||||
|
return idOrName
|
||||||
|
}
|
||||||
|
|
||||||
|
// UserDefined indicates user-created network
|
||||||
|
func (n NetworkMode) UserDefined() string {
|
||||||
|
if n.IsUserDefined() {
|
||||||
|
return string(n)
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
// UsernsMode represents userns mode in the container.
|
||||||
|
type UsernsMode string
|
||||||
|
|
||||||
|
// IsHost indicates whether the container uses the host's userns.
|
||||||
|
func (n UsernsMode) IsHost() bool {
|
||||||
|
return n == "host"
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsPrivate indicates whether the container uses the a private userns.
|
||||||
|
func (n UsernsMode) IsPrivate() bool {
|
||||||
|
return !n.IsHost()
|
||||||
|
}
|
||||||
|
|
||||||
|
// Valid indicates whether the userns is valid.
|
||||||
|
func (n UsernsMode) Valid() bool {
|
||||||
|
return n == "" || n.IsHost()
|
||||||
|
}
|
||||||
|
|
||||||
|
// CgroupSpec represents the cgroup to use for the container.
|
||||||
|
type CgroupSpec string
|
||||||
|
|
||||||
|
// IsContainer indicates whether the container is using another container cgroup
|
||||||
|
func (c CgroupSpec) IsContainer() bool {
|
||||||
|
_, ok := containerID(string(c))
|
||||||
|
return ok
|
||||||
|
}
|
||||||
|
|
||||||
|
// Valid indicates whether the cgroup spec is valid.
|
||||||
|
func (c CgroupSpec) Valid() bool {
|
||||||
|
// TODO(thaJeztah): align with PidMode, and consider container-mode without a container name/ID to be invalid.
|
||||||
|
return c == "" || c.IsContainer()
|
||||||
|
}
|
||||||
|
|
||||||
|
// Container returns the ID or name of the container whose cgroup will be used.
|
||||||
|
func (c CgroupSpec) Container() (idOrName string) {
|
||||||
|
idOrName, _ = containerID(string(c))
|
||||||
|
return idOrName
|
||||||
|
}
|
||||||
|
|
||||||
|
// UTSMode represents the UTS namespace of the container.
|
||||||
|
type UTSMode string
|
||||||
|
|
||||||
|
// IsPrivate indicates whether the container uses its private UTS namespace.
|
||||||
|
func (n UTSMode) IsPrivate() bool {
|
||||||
|
return !n.IsHost()
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsHost indicates whether the container uses the host's UTS namespace.
|
||||||
|
func (n UTSMode) IsHost() bool {
|
||||||
|
return n == "host"
|
||||||
|
}
|
||||||
|
|
||||||
|
// Valid indicates whether the UTS namespace is valid.
|
||||||
|
func (n UTSMode) Valid() bool {
|
||||||
|
return n == "" || n.IsHost()
|
||||||
|
}
|
||||||
|
|
||||||
|
// PidMode represents the pid namespace of the container.
|
||||||
|
type PidMode string
|
||||||
|
|
||||||
|
// IsPrivate indicates whether the container uses its own new pid namespace.
|
||||||
|
func (n PidMode) IsPrivate() bool {
|
||||||
|
return !n.IsHost() && !n.IsContainer()
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsHost indicates whether the container uses the host's pid namespace.
|
||||||
|
func (n PidMode) IsHost() bool {
|
||||||
|
return n == "host"
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsContainer indicates whether the container uses a container's pid namespace.
|
||||||
|
func (n PidMode) IsContainer() bool {
|
||||||
|
_, ok := containerID(string(n))
|
||||||
|
return ok
|
||||||
|
}
|
||||||
|
|
||||||
|
// Valid indicates whether the pid namespace is valid.
|
||||||
|
func (n PidMode) Valid() bool {
|
||||||
|
return n == "" || n.IsHost() || validContainer(string(n))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Container returns the name of the container whose pid namespace is going to be used.
|
||||||
|
func (n PidMode) Container() (idOrName string) {
|
||||||
|
idOrName, _ = containerID(string(n))
|
||||||
|
return idOrName
|
||||||
|
}
|
||||||
|
|
||||||
|
// DeviceRequest represents a request for devices from a device driver.
|
||||||
|
// Used by GPU device drivers.
|
||||||
|
type DeviceRequest struct {
|
||||||
|
Driver string // Name of device driver
|
||||||
|
Count int // Number of devices to request (-1 = All)
|
||||||
|
DeviceIDs []string // List of device IDs as recognizable by the device driver
|
||||||
|
Capabilities [][]string // An OR list of AND lists of device capabilities (e.g. "gpu")
|
||||||
|
Options map[string]string // Options to pass onto the device driver
|
||||||
|
}
|
||||||
|
|
||||||
|
// DeviceMapping represents the device mapping between the host and the container.
|
||||||
|
type DeviceMapping struct {
|
||||||
|
PathOnHost string
|
||||||
|
PathInContainer string
|
||||||
|
CgroupPermissions string
|
||||||
|
}
|
||||||
|
|
||||||
|
// RestartPolicy represents the restart policies of the container.
|
||||||
|
type RestartPolicy struct {
|
||||||
|
Name RestartPolicyMode
|
||||||
|
MaximumRetryCount int
|
||||||
|
}
|
||||||
|
|
||||||
|
type RestartPolicyMode string
|
||||||
|
|
||||||
|
const (
|
||||||
|
RestartPolicyDisabled RestartPolicyMode = "no"
|
||||||
|
RestartPolicyAlways RestartPolicyMode = "always"
|
||||||
|
RestartPolicyOnFailure RestartPolicyMode = "on-failure"
|
||||||
|
RestartPolicyUnlessStopped RestartPolicyMode = "unless-stopped"
|
||||||
|
)
|
||||||
|
|
||||||
|
// IsNone indicates whether the container has the "no" restart policy.
|
||||||
|
// This means the container will not automatically restart when exiting.
|
||||||
|
func (rp *RestartPolicy) IsNone() bool {
|
||||||
|
return rp.Name == RestartPolicyDisabled || rp.Name == ""
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsAlways indicates whether the container has the "always" restart policy.
|
||||||
|
// This means the container will automatically restart regardless of the exit status.
|
||||||
|
func (rp *RestartPolicy) IsAlways() bool {
|
||||||
|
return rp.Name == RestartPolicyAlways
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsOnFailure indicates whether the container has the "on-failure" restart policy.
|
||||||
|
// This means the container will automatically restart of exiting with a non-zero exit status.
|
||||||
|
func (rp *RestartPolicy) IsOnFailure() bool {
|
||||||
|
return rp.Name == RestartPolicyOnFailure
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsUnlessStopped indicates whether the container has the
|
||||||
|
// "unless-stopped" restart policy. This means the container will
|
||||||
|
// automatically restart unless user has put it to stopped state.
|
||||||
|
func (rp *RestartPolicy) IsUnlessStopped() bool {
|
||||||
|
return rp.Name == RestartPolicyUnlessStopped
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsSame compares two RestartPolicy to see if they are the same
|
||||||
|
func (rp *RestartPolicy) IsSame(tp *RestartPolicy) bool {
|
||||||
|
return rp.Name == tp.Name && rp.MaximumRetryCount == tp.MaximumRetryCount
|
||||||
|
}
|
||||||
|
|
||||||
|
// ValidateRestartPolicy validates the given RestartPolicy.
|
||||||
|
func ValidateRestartPolicy(policy RestartPolicy) error {
|
||||||
|
switch policy.Name {
|
||||||
|
case RestartPolicyAlways, RestartPolicyUnlessStopped, RestartPolicyDisabled:
|
||||||
|
if policy.MaximumRetryCount != 0 {
|
||||||
|
msg := "invalid restart policy: maximum retry count can only be used with 'on-failure'"
|
||||||
|
if policy.MaximumRetryCount < 0 {
|
||||||
|
msg += " and cannot be negative"
|
||||||
|
}
|
||||||
|
return &errInvalidParameter{errors.New(msg)}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
case RestartPolicyOnFailure:
|
||||||
|
if policy.MaximumRetryCount < 0 {
|
||||||
|
return &errInvalidParameter{errors.New("invalid restart policy: maximum retry count cannot be negative")}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
case "":
|
||||||
|
// Versions before v25.0.0 created an empty restart-policy "name" as
|
||||||
|
// default. Allow an empty name with "any" MaximumRetryCount for
|
||||||
|
// backward-compatibility.
|
||||||
|
return nil
|
||||||
|
default:
|
||||||
|
return &errInvalidParameter{fmt.Errorf("invalid restart policy: unknown policy '%s'; use one of '%s', '%s', '%s', or '%s'", policy.Name, RestartPolicyDisabled, RestartPolicyAlways, RestartPolicyOnFailure, RestartPolicyUnlessStopped)}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// LogMode is a type to define the available modes for logging
|
||||||
|
// These modes affect how logs are handled when log messages start piling up.
|
||||||
|
type LogMode string
|
||||||
|
|
||||||
|
// Available logging modes
|
||||||
|
const (
|
||||||
|
LogModeUnset LogMode = ""
|
||||||
|
LogModeBlocking LogMode = "blocking"
|
||||||
|
LogModeNonBlock LogMode = "non-blocking"
|
||||||
|
)
|
||||||
|
|
||||||
|
// LogConfig represents the logging configuration of the container.
|
||||||
|
type LogConfig struct {
|
||||||
|
Type string
|
||||||
|
Config map[string]string
|
||||||
|
}
|
||||||
|
|
||||||
|
// Ulimit is an alias for [units.Ulimit], which may be moving to a different
|
||||||
|
// location or become a local type. This alias is to help transitioning.
|
||||||
|
//
|
||||||
|
// Users are recommended to use this alias instead of using [units.Ulimit] directly.
|
||||||
|
type Ulimit = units.Ulimit
|
||||||
|
|
||||||
|
// Resources contains container's resources (cgroups config, ulimits...)
|
||||||
|
type Resources struct {
|
||||||
|
// Applicable to all platforms
|
||||||
|
CPUShares int64 `json:"CpuShares"` // CPU shares (relative weight vs. other containers)
|
||||||
|
Memory int64 // Memory limit (in bytes)
|
||||||
|
NanoCPUs int64 `json:"NanoCpus"` // CPU quota in units of 10<sup>-9</sup> CPUs.
|
||||||
|
|
||||||
|
// Applicable to UNIX platforms
|
||||||
|
CgroupParent string // Parent cgroup.
|
||||||
|
BlkioWeight uint16 // Block IO weight (relative weight vs. other containers)
|
||||||
|
BlkioWeightDevice []*blkiodev.WeightDevice
|
||||||
|
BlkioDeviceReadBps []*blkiodev.ThrottleDevice
|
||||||
|
BlkioDeviceWriteBps []*blkiodev.ThrottleDevice
|
||||||
|
BlkioDeviceReadIOps []*blkiodev.ThrottleDevice
|
||||||
|
BlkioDeviceWriteIOps []*blkiodev.ThrottleDevice
|
||||||
|
CPUPeriod int64 `json:"CpuPeriod"` // CPU CFS (Completely Fair Scheduler) period
|
||||||
|
CPUQuota int64 `json:"CpuQuota"` // CPU CFS (Completely Fair Scheduler) quota
|
||||||
|
CPURealtimePeriod int64 `json:"CpuRealtimePeriod"` // CPU real-time period
|
||||||
|
CPURealtimeRuntime int64 `json:"CpuRealtimeRuntime"` // CPU real-time runtime
|
||||||
|
CpusetCpus string // CpusetCpus 0-2, 0,1
|
||||||
|
CpusetMems string // CpusetMems 0-2, 0,1
|
||||||
|
Devices []DeviceMapping // List of devices to map inside the container
|
||||||
|
DeviceCgroupRules []string // List of rule to be added to the device cgroup
|
||||||
|
DeviceRequests []DeviceRequest // List of device requests for device drivers
|
||||||
|
MemoryReservation int64 // Memory soft limit (in bytes)
|
||||||
|
MemorySwap int64 // Total memory usage (memory + swap); set `-1` to enable unlimited swap
|
||||||
|
MemorySwappiness *int64 // Tuning container memory swappiness behaviour
|
||||||
|
OomKillDisable *bool // Whether to disable OOM Killer or not
|
||||||
|
PidsLimit *int64 // Setting PIDs limit for a container; Set `0` or `-1` for unlimited, or `null` to not change.
|
||||||
|
Ulimits []*Ulimit // List of ulimits to be set in the container
|
||||||
|
|
||||||
|
// Applicable to Windows
|
||||||
|
CPUCount int64 `json:"CpuCount"` // CPU count
|
||||||
|
CPUPercent int64 `json:"CpuPercent"` // CPU percent
|
||||||
|
IOMaximumIOps uint64 // Maximum IOps for the container system drive
|
||||||
|
IOMaximumBandwidth uint64 // Maximum IO in bytes per second for the container system drive
|
||||||
|
}
|
||||||
|
|
||||||
|
// UpdateConfig holds the mutable attributes of a Container.
|
||||||
|
// Those attributes can be updated at runtime.
|
||||||
|
type UpdateConfig struct {
|
||||||
|
// Contains container's resources (cgroups, ulimits)
|
||||||
|
Resources
|
||||||
|
RestartPolicy RestartPolicy
|
||||||
|
}
|
||||||
|
|
||||||
|
// HostConfig the non-portable Config structure of a container.
|
||||||
|
// Here, "non-portable" means "dependent of the host we are running on".
|
||||||
|
// Portable information *should* appear in Config.
|
||||||
|
type HostConfig struct {
|
||||||
|
// Applicable to all platforms
|
||||||
|
Binds []string // List of volume bindings for this container
|
||||||
|
ContainerIDFile string // File (path) where the containerId is written
|
||||||
|
LogConfig LogConfig // Configuration of the logs for this container
|
||||||
|
NetworkMode NetworkMode // Network mode to use for the container
|
||||||
|
PortBindings network.PortMap // Port mapping between the exposed port (container) and the host
|
||||||
|
RestartPolicy RestartPolicy // Restart policy to be used for the container
|
||||||
|
AutoRemove bool // Automatically remove container when it exits
|
||||||
|
VolumeDriver string // Name of the volume driver used to mount volumes
|
||||||
|
VolumesFrom []string // List of volumes to take from other container
|
||||||
|
ConsoleSize [2]uint // Initial console size (height,width)
|
||||||
|
Annotations map[string]string `json:",omitempty"` // Arbitrary non-identifying metadata attached to container and provided to the runtime
|
||||||
|
|
||||||
|
// Applicable to UNIX platforms
|
||||||
|
CapAdd []string // List of kernel capabilities to add to the container
|
||||||
|
CapDrop []string // List of kernel capabilities to remove from the container
|
||||||
|
CgroupnsMode CgroupnsMode // Cgroup namespace mode to use for the container
|
||||||
|
DNS []netip.Addr `json:"Dns"` // List of DNS server to lookup
|
||||||
|
DNSOptions []string `json:"DnsOptions"` // List of DNSOption to look for
|
||||||
|
DNSSearch []string `json:"DnsSearch"` // List of DNSSearch to look for
|
||||||
|
ExtraHosts []string // List of extra hosts
|
||||||
|
GroupAdd []string // List of additional groups that the container process will run as
|
||||||
|
IpcMode IpcMode // IPC namespace to use for the container
|
||||||
|
Cgroup CgroupSpec // Cgroup to use for the container
|
||||||
|
Links []string // List of links (in the name:alias form)
|
||||||
|
OomScoreAdj int // Container preference for OOM-killing
|
||||||
|
PidMode PidMode // PID namespace to use for the container
|
||||||
|
Privileged bool // Is the container in privileged mode
|
||||||
|
PublishAllPorts bool // Should docker publish all exposed port for the container
|
||||||
|
ReadonlyRootfs bool // Is the container root filesystem in read-only
|
||||||
|
SecurityOpt []string // List of string values to customize labels for MLS systems, such as SELinux.
|
||||||
|
StorageOpt map[string]string `json:",omitempty"` // Storage driver options per container.
|
||||||
|
Tmpfs map[string]string `json:",omitempty"` // List of tmpfs (mounts) used for the container
|
||||||
|
UTSMode UTSMode // UTS namespace to use for the container
|
||||||
|
UsernsMode UsernsMode // The user namespace to use for the container
|
||||||
|
ShmSize int64 // Total shm memory usage
|
||||||
|
Sysctls map[string]string `json:",omitempty"` // List of Namespaced sysctls used for the container
|
||||||
|
Runtime string `json:",omitempty"` // Runtime to use with this container
|
||||||
|
|
||||||
|
// Applicable to Windows
|
||||||
|
Isolation Isolation // Isolation technology of the container (e.g. default, hyperv)
|
||||||
|
|
||||||
|
// Contains container's resources (cgroups, ulimits)
|
||||||
|
Resources
|
||||||
|
|
||||||
|
// Mounts specs used by the container
|
||||||
|
Mounts []mount.Mount `json:",omitempty"`
|
||||||
|
|
||||||
|
// MaskedPaths is the list of paths to be masked inside the container (this overrides the default set of paths)
|
||||||
|
MaskedPaths []string
|
||||||
|
|
||||||
|
// ReadonlyPaths is the list of paths to be set as read-only inside the container (this overrides the default set of paths)
|
||||||
|
ReadonlyPaths []string
|
||||||
|
|
||||||
|
// Run a custom init inside the container, if null, use the daemon's configured settings
|
||||||
|
Init *bool `json:",omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// containerID splits "container:<ID|name>" values. It returns the container
|
||||||
|
// ID or name, and whether an ID/name was found. It returns an empty string and
|
||||||
|
// a "false" if the value does not have a "container:" prefix. Further validation
|
||||||
|
// of the returned, including checking if the value is empty, should be handled
|
||||||
|
// by the caller.
|
||||||
|
func containerID(val string) (idOrName string, ok bool) {
|
||||||
|
k, v, hasSep := strings.Cut(val, ":")
|
||||||
|
if !hasSep || k != "container" {
|
||||||
|
return "", false
|
||||||
|
}
|
||||||
|
return v, true
|
||||||
|
}
|
||||||
|
|
||||||
|
// validContainer checks if the given value is a "container:" mode with
|
||||||
|
// a non-empty name/ID.
|
||||||
|
func validContainer(val string) bool {
|
||||||
|
id, ok := containerID(val)
|
||||||
|
return ok && id != ""
|
||||||
|
}
|
||||||
45
vendor/github.com/moby/moby/api/types/container/hostconfig_unix.go
generated
vendored
Normal file
45
vendor/github.com/moby/moby/api/types/container/hostconfig_unix.go
generated
vendored
Normal file
|
|
@ -0,0 +1,45 @@
|
||||||
|
//go:build !windows
|
||||||
|
|
||||||
|
package container
|
||||||
|
|
||||||
|
import "github.com/moby/moby/api/types/network"
|
||||||
|
|
||||||
|
// IsValid indicates if an isolation technology is valid
|
||||||
|
func (i Isolation) IsValid() bool {
|
||||||
|
return i.IsDefault()
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsBridge indicates whether container uses the bridge network stack
|
||||||
|
func (n NetworkMode) IsBridge() bool {
|
||||||
|
return n == network.NetworkBridge
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsHost indicates whether container uses the host network stack.
|
||||||
|
func (n NetworkMode) IsHost() bool {
|
||||||
|
return n == network.NetworkHost
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsUserDefined indicates user-created network
|
||||||
|
func (n NetworkMode) IsUserDefined() bool {
|
||||||
|
return !n.IsDefault() && !n.IsBridge() && !n.IsHost() && !n.IsNone() && !n.IsContainer()
|
||||||
|
}
|
||||||
|
|
||||||
|
// NetworkName returns the name of the network stack.
|
||||||
|
func (n NetworkMode) NetworkName() string {
|
||||||
|
switch {
|
||||||
|
case n.IsDefault():
|
||||||
|
return network.NetworkDefault
|
||||||
|
case n.IsBridge():
|
||||||
|
return network.NetworkBridge
|
||||||
|
case n.IsHost():
|
||||||
|
return network.NetworkHost
|
||||||
|
case n.IsNone():
|
||||||
|
return network.NetworkNone
|
||||||
|
case n.IsContainer():
|
||||||
|
return "container"
|
||||||
|
case n.IsUserDefined():
|
||||||
|
return n.UserDefined()
|
||||||
|
default:
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
}
|
||||||
47
vendor/github.com/moby/moby/api/types/container/hostconfig_windows.go
generated
vendored
Normal file
47
vendor/github.com/moby/moby/api/types/container/hostconfig_windows.go
generated
vendored
Normal file
|
|
@ -0,0 +1,47 @@
|
||||||
|
package container
|
||||||
|
|
||||||
|
import "github.com/moby/moby/api/types/network"
|
||||||
|
|
||||||
|
// IsValid indicates if an isolation technology is valid
|
||||||
|
func (i Isolation) IsValid() bool {
|
||||||
|
return i.IsDefault() || i.IsHyperV() || i.IsProcess()
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsBridge indicates whether container uses the bridge network stack
|
||||||
|
// in windows it is given the name NAT
|
||||||
|
func (n NetworkMode) IsBridge() bool {
|
||||||
|
return n == network.NetworkNat
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsHost indicates whether container uses the host network stack.
|
||||||
|
// returns false as this is not supported by windows
|
||||||
|
func (n NetworkMode) IsHost() bool {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsUserDefined indicates user-created network
|
||||||
|
func (n NetworkMode) IsUserDefined() bool {
|
||||||
|
return !n.IsDefault() && !n.IsNone() && !n.IsBridge() && !n.IsContainer()
|
||||||
|
}
|
||||||
|
|
||||||
|
// NetworkName returns the name of the network stack.
|
||||||
|
func (n NetworkMode) NetworkName() string {
|
||||||
|
switch {
|
||||||
|
case n.IsDefault():
|
||||||
|
return network.NetworkDefault
|
||||||
|
case n.IsBridge():
|
||||||
|
return network.NetworkNat
|
||||||
|
case n.IsHost():
|
||||||
|
// Windows currently doesn't support host network-mode, so
|
||||||
|
// this would currently never happen..
|
||||||
|
return network.NetworkHost
|
||||||
|
case n.IsNone():
|
||||||
|
return network.NetworkNone
|
||||||
|
case n.IsContainer():
|
||||||
|
return "container"
|
||||||
|
case n.IsUserDefined():
|
||||||
|
return n.UserDefined()
|
||||||
|
default:
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
}
|
||||||
22
vendor/github.com/moby/moby/api/types/container/network_settings.go
generated
vendored
Normal file
22
vendor/github.com/moby/moby/api/types/container/network_settings.go
generated
vendored
Normal file
|
|
@ -0,0 +1,22 @@
|
||||||
|
package container
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/moby/moby/api/types/network"
|
||||||
|
)
|
||||||
|
|
||||||
|
// NetworkSettings exposes the network settings in the api
|
||||||
|
type NetworkSettings struct {
|
||||||
|
SandboxID string // SandboxID uniquely represents a container's network stack
|
||||||
|
SandboxKey string // SandboxKey identifies the sandbox
|
||||||
|
|
||||||
|
// Ports is a collection of [network.PortBinding] indexed by [network.Port]
|
||||||
|
Ports network.PortMap
|
||||||
|
|
||||||
|
Networks map[string]*network.EndpointSettings
|
||||||
|
}
|
||||||
|
|
||||||
|
// NetworkSettingsSummary provides a summary of container's networks
|
||||||
|
// in /containers/json
|
||||||
|
type NetworkSettingsSummary struct {
|
||||||
|
Networks map[string]*network.EndpointSettings
|
||||||
|
}
|
||||||
33
vendor/github.com/moby/moby/api/types/container/port_summary.go
generated
vendored
Normal file
33
vendor/github.com/moby/moby/api/types/container/port_summary.go
generated
vendored
Normal file
|
|
@ -0,0 +1,33 @@
|
||||||
|
// Code generated by go-swagger; DO NOT EDIT.
|
||||||
|
|
||||||
|
package container
|
||||||
|
|
||||||
|
// This file was generated by the swagger tool.
|
||||||
|
// Editing this file might prove futile when you re-run the swagger generate command
|
||||||
|
|
||||||
|
import (
|
||||||
|
"net/netip"
|
||||||
|
)
|
||||||
|
|
||||||
|
// PortSummary Describes a port-mapping between the container and the host.
|
||||||
|
//
|
||||||
|
// Example: {"PrivatePort":8080,"PublicPort":80,"Type":"tcp"}
|
||||||
|
//
|
||||||
|
// swagger:model PortSummary
|
||||||
|
type PortSummary struct {
|
||||||
|
|
||||||
|
// Host IP address that the container's port is mapped to
|
||||||
|
IP netip.Addr `json:"IP,omitempty"`
|
||||||
|
|
||||||
|
// Port on the container
|
||||||
|
// Required: true
|
||||||
|
PrivatePort uint16 `json:"PrivatePort"`
|
||||||
|
|
||||||
|
// Port exposed on the host
|
||||||
|
PublicPort uint16 `json:"PublicPort,omitempty"`
|
||||||
|
|
||||||
|
// type
|
||||||
|
// Required: true
|
||||||
|
// Enum: ["tcp","udp","sctp"]
|
||||||
|
Type string `json:"Type"`
|
||||||
|
}
|
||||||
40
vendor/github.com/moby/moby/api/types/container/state.go
generated
vendored
Normal file
40
vendor/github.com/moby/moby/api/types/container/state.go
generated
vendored
Normal file
|
|
@ -0,0 +1,40 @@
|
||||||
|
package container
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
// ContainerState is a string representation of the container's current state.
|
||||||
|
type ContainerState string
|
||||||
|
|
||||||
|
const (
|
||||||
|
StateCreated ContainerState = "created" // StateCreated indicates the container is created, but not (yet) started.
|
||||||
|
StateRunning ContainerState = "running" // StateRunning indicates that the container is running.
|
||||||
|
StatePaused ContainerState = "paused" // StatePaused indicates that the container's current state is paused.
|
||||||
|
StateRestarting ContainerState = "restarting" // StateRestarting indicates that the container is currently restarting.
|
||||||
|
StateRemoving ContainerState = "removing" // StateRemoving indicates that the container is being removed.
|
||||||
|
StateExited ContainerState = "exited" // StateExited indicates that the container exited.
|
||||||
|
StateDead ContainerState = "dead" // StateDead indicates that the container failed to be deleted. Containers in this state are attempted to be cleaned up when the daemon restarts.
|
||||||
|
)
|
||||||
|
|
||||||
|
var validStates = []string{
|
||||||
|
string(StateCreated),
|
||||||
|
string(StateRunning),
|
||||||
|
string(StatePaused),
|
||||||
|
string(StateRestarting),
|
||||||
|
string(StateRemoving),
|
||||||
|
string(StateExited),
|
||||||
|
string(StateDead),
|
||||||
|
}
|
||||||
|
|
||||||
|
// ValidateContainerState checks if the provided string is a valid
|
||||||
|
// container [ContainerState].
|
||||||
|
func ValidateContainerState(s ContainerState) error {
|
||||||
|
switch s {
|
||||||
|
case StateCreated, StateRunning, StatePaused, StateRestarting, StateRemoving, StateExited, StateDead:
|
||||||
|
return nil
|
||||||
|
default:
|
||||||
|
return errInvalidParameter{error: fmt.Errorf("invalid value for state (%s): must be one of %s", s, strings.Join(validStates, ", "))}
|
||||||
|
}
|
||||||
|
}
|
||||||
224
vendor/github.com/moby/moby/api/types/container/stats.go
generated
vendored
Normal file
224
vendor/github.com/moby/moby/api/types/container/stats.go
generated
vendored
Normal file
|
|
@ -0,0 +1,224 @@
|
||||||
|
package container
|
||||||
|
|
||||||
|
import "time"
|
||||||
|
|
||||||
|
// ThrottlingData stores CPU throttling stats of one running container.
|
||||||
|
// Not used on Windows.
|
||||||
|
type ThrottlingData struct {
|
||||||
|
// Number of periods with throttling active
|
||||||
|
Periods uint64 `json:"periods"`
|
||||||
|
// Number of periods when the container hits its throttling limit.
|
||||||
|
ThrottledPeriods uint64 `json:"throttled_periods"`
|
||||||
|
// Aggregate time the container was throttled for in nanoseconds.
|
||||||
|
ThrottledTime uint64 `json:"throttled_time"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// CPUUsage stores All CPU stats aggregated since container inception.
|
||||||
|
type CPUUsage struct {
|
||||||
|
// Total CPU time consumed.
|
||||||
|
// Units: nanoseconds (Linux)
|
||||||
|
// Units: 100's of nanoseconds (Windows)
|
||||||
|
TotalUsage uint64 `json:"total_usage"`
|
||||||
|
|
||||||
|
// Total CPU time consumed per core (Linux). Not used on Windows.
|
||||||
|
// Units: nanoseconds.
|
||||||
|
PercpuUsage []uint64 `json:"percpu_usage,omitempty"`
|
||||||
|
|
||||||
|
// Time spent by tasks of the cgroup in kernel mode (Linux).
|
||||||
|
// Time spent by all container processes in kernel mode (Windows).
|
||||||
|
// Units: nanoseconds (Linux).
|
||||||
|
// Units: 100's of nanoseconds (Windows). Not populated for Hyper-V Containers.
|
||||||
|
UsageInKernelmode uint64 `json:"usage_in_kernelmode"`
|
||||||
|
|
||||||
|
// Time spent by tasks of the cgroup in user mode (Linux).
|
||||||
|
// Time spent by all container processes in user mode (Windows).
|
||||||
|
// Units: nanoseconds (Linux).
|
||||||
|
// Units: 100's of nanoseconds (Windows). Not populated for Hyper-V Containers
|
||||||
|
UsageInUsermode uint64 `json:"usage_in_usermode"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// CPUStats aggregates and wraps all CPU related info of container
|
||||||
|
type CPUStats struct {
|
||||||
|
// CPU Usage. Linux and Windows.
|
||||||
|
CPUUsage CPUUsage `json:"cpu_usage"`
|
||||||
|
|
||||||
|
// System Usage. Linux only.
|
||||||
|
SystemUsage uint64 `json:"system_cpu_usage,omitempty"`
|
||||||
|
|
||||||
|
// Online CPUs. Linux only.
|
||||||
|
OnlineCPUs uint32 `json:"online_cpus,omitempty"`
|
||||||
|
|
||||||
|
// Throttling Data. Linux only.
|
||||||
|
ThrottlingData ThrottlingData `json:"throttling_data,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// MemoryStats aggregates all memory stats since container inception on Linux.
|
||||||
|
// Windows returns stats for commit and private working set only.
|
||||||
|
type MemoryStats struct {
|
||||||
|
// Linux Memory Stats
|
||||||
|
|
||||||
|
// current res_counter usage for memory
|
||||||
|
Usage uint64 `json:"usage,omitempty"`
|
||||||
|
// maximum usage ever recorded.
|
||||||
|
MaxUsage uint64 `json:"max_usage,omitempty"`
|
||||||
|
// TODO(vishh): Export these as stronger types.
|
||||||
|
// all the stats exported via memory.stat.
|
||||||
|
Stats map[string]uint64 `json:"stats,omitempty"`
|
||||||
|
// number of times memory usage hits limits.
|
||||||
|
Failcnt uint64 `json:"failcnt,omitempty"`
|
||||||
|
Limit uint64 `json:"limit,omitempty"`
|
||||||
|
|
||||||
|
// Windows Memory Stats
|
||||||
|
// See https://technet.microsoft.com/en-us/magazine/ff382715.aspx
|
||||||
|
|
||||||
|
// committed bytes
|
||||||
|
Commit uint64 `json:"commitbytes,omitempty"`
|
||||||
|
// peak committed bytes
|
||||||
|
CommitPeak uint64 `json:"commitpeakbytes,omitempty"`
|
||||||
|
// private working set
|
||||||
|
PrivateWorkingSet uint64 `json:"privateworkingset,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// BlkioStatEntry is one small entity to store a piece of Blkio stats
|
||||||
|
// Not used on Windows.
|
||||||
|
type BlkioStatEntry struct {
|
||||||
|
Major uint64 `json:"major"`
|
||||||
|
Minor uint64 `json:"minor"`
|
||||||
|
Op string `json:"op"`
|
||||||
|
Value uint64 `json:"value"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// BlkioStats stores All IO service stats for data read and write.
|
||||||
|
// This is a Linux specific structure as the differences between expressing
|
||||||
|
// block I/O on Windows and Linux are sufficiently significant to make
|
||||||
|
// little sense attempting to morph into a combined structure.
|
||||||
|
type BlkioStats struct {
|
||||||
|
// number of bytes transferred to and from the block device
|
||||||
|
IoServiceBytesRecursive []BlkioStatEntry `json:"io_service_bytes_recursive"`
|
||||||
|
IoServicedRecursive []BlkioStatEntry `json:"io_serviced_recursive"`
|
||||||
|
IoQueuedRecursive []BlkioStatEntry `json:"io_queue_recursive"`
|
||||||
|
IoServiceTimeRecursive []BlkioStatEntry `json:"io_service_time_recursive"`
|
||||||
|
IoWaitTimeRecursive []BlkioStatEntry `json:"io_wait_time_recursive"`
|
||||||
|
IoMergedRecursive []BlkioStatEntry `json:"io_merged_recursive"`
|
||||||
|
IoTimeRecursive []BlkioStatEntry `json:"io_time_recursive"`
|
||||||
|
SectorsRecursive []BlkioStatEntry `json:"sectors_recursive"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// StorageStats is the disk I/O stats for read/write on Windows.
|
||||||
|
type StorageStats struct {
|
||||||
|
ReadCountNormalized uint64 `json:"read_count_normalized,omitempty"`
|
||||||
|
ReadSizeBytes uint64 `json:"read_size_bytes,omitempty"`
|
||||||
|
WriteCountNormalized uint64 `json:"write_count_normalized,omitempty"`
|
||||||
|
WriteSizeBytes uint64 `json:"write_size_bytes,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// NetworkStats aggregates the network stats of one container
|
||||||
|
type NetworkStats struct {
|
||||||
|
// Bytes received. Windows and Linux.
|
||||||
|
RxBytes uint64 `json:"rx_bytes"`
|
||||||
|
// Packets received. Windows and Linux.
|
||||||
|
RxPackets uint64 `json:"rx_packets"`
|
||||||
|
// Received errors. Not used on Windows. Note that we don't `omitempty` this
|
||||||
|
// field as it is expected in the >=v1.21 API stats structure.
|
||||||
|
RxErrors uint64 `json:"rx_errors"`
|
||||||
|
// Incoming packets dropped. Windows and Linux.
|
||||||
|
RxDropped uint64 `json:"rx_dropped"`
|
||||||
|
// Bytes sent. Windows and Linux.
|
||||||
|
TxBytes uint64 `json:"tx_bytes"`
|
||||||
|
// Packets sent. Windows and Linux.
|
||||||
|
TxPackets uint64 `json:"tx_packets"`
|
||||||
|
// Sent errors. Not used on Windows. Note that we don't `omitempty` this
|
||||||
|
// field as it is expected in the >=v1.21 API stats structure.
|
||||||
|
TxErrors uint64 `json:"tx_errors"`
|
||||||
|
// Outgoing packets dropped. Windows and Linux.
|
||||||
|
TxDropped uint64 `json:"tx_dropped"`
|
||||||
|
// Endpoint ID. Not used on Linux.
|
||||||
|
EndpointID string `json:"endpoint_id,omitempty"`
|
||||||
|
// Instance ID. Not used on Linux.
|
||||||
|
InstanceID string `json:"instance_id,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// PidsStats contains the stats of a container's pids
|
||||||
|
type PidsStats struct {
|
||||||
|
// Current is the number of pids in the cgroup
|
||||||
|
Current uint64 `json:"current,omitempty"`
|
||||||
|
// Limit is the hard limit on the number of pids in the cgroup.
|
||||||
|
// A "Limit" of 0 means that there is no limit.
|
||||||
|
Limit uint64 `json:"limit,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// StatsResponse aggregates all types of stats of one container.
|
||||||
|
type StatsResponse struct {
|
||||||
|
// ID is the ID of the container for which the stats were collected.
|
||||||
|
ID string `json:"id,omitempty"`
|
||||||
|
|
||||||
|
// Name is the name of the container for which the stats were collected.
|
||||||
|
Name string `json:"name,omitempty"`
|
||||||
|
|
||||||
|
// OSType is the OS of the container ("linux" or "windows") to allow
|
||||||
|
// platform-specific handling of stats.
|
||||||
|
OSType string `json:"os_type,omitempty"`
|
||||||
|
|
||||||
|
// Read is the date and time at which this sample was collected.
|
||||||
|
Read time.Time `json:"read"`
|
||||||
|
|
||||||
|
// CPUStats contains CPU related info of the container.
|
||||||
|
CPUStats CPUStats `json:"cpu_stats,omitempty"`
|
||||||
|
|
||||||
|
// MemoryStats aggregates all memory stats since container inception on Linux.
|
||||||
|
// Windows returns stats for commit and private working set only.
|
||||||
|
MemoryStats MemoryStats `json:"memory_stats,omitempty"`
|
||||||
|
|
||||||
|
// Networks contains Nntwork statistics for the container per interface.
|
||||||
|
//
|
||||||
|
// This field is omitted if the container has no networking enabled.
|
||||||
|
Networks map[string]NetworkStats `json:"networks,omitempty"`
|
||||||
|
|
||||||
|
// -------------------------------------------------------------------------
|
||||||
|
// Linux-specific stats, not populated on Windows.
|
||||||
|
// -------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// PidsStats contains Linux-specific stats of a container's process-IDs (PIDs).
|
||||||
|
//
|
||||||
|
// This field is Linux-specific and omitted for Windows containers.
|
||||||
|
PidsStats PidsStats `json:"pids_stats,omitempty"`
|
||||||
|
|
||||||
|
// BlkioStats stores all IO service stats for data read and write.
|
||||||
|
//
|
||||||
|
// This type is Linux-specific and holds many fields that are specific
|
||||||
|
// to cgroups v1.
|
||||||
|
//
|
||||||
|
// On a cgroup v2 host, all fields other than "io_service_bytes_recursive"
|
||||||
|
// are omitted or "null".
|
||||||
|
//
|
||||||
|
// This type is only populated on Linux and omitted for Windows containers.
|
||||||
|
BlkioStats BlkioStats `json:"blkio_stats,omitempty"`
|
||||||
|
|
||||||
|
// -------------------------------------------------------------------------
|
||||||
|
// Windows-specific stats, not populated on Linux.
|
||||||
|
// -------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// NumProcs is the number of processors on the system.
|
||||||
|
//
|
||||||
|
// This field is Windows-specific and always zero for Linux containers.
|
||||||
|
NumProcs uint32 `json:"num_procs"`
|
||||||
|
|
||||||
|
// StorageStats is the disk I/O stats for read/write on Windows.
|
||||||
|
//
|
||||||
|
// This type is Windows-specific and omitted for Linux containers.
|
||||||
|
StorageStats StorageStats `json:"storage_stats,omitempty"`
|
||||||
|
|
||||||
|
// -------------------------------------------------------------------------
|
||||||
|
// PreRead and PreCPUStats contain the previous sample of stats for
|
||||||
|
// the container, and can be used to perform delta-calculation.
|
||||||
|
// -------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// PreRead is the date and time at which this first sample was collected.
|
||||||
|
// This field is not propagated if the "one-shot" option is set. If the
|
||||||
|
// "one-shot" option is set, this field may be omitted, empty, or set
|
||||||
|
// to a default date (`0001-01-01T00:00:00Z`).
|
||||||
|
PreRead time.Time `json:"preread"`
|
||||||
|
|
||||||
|
// PreCPUStats contains the CPUStats of the previous sample.
|
||||||
|
PreCPUStats CPUStats `json:"precpu_stats,omitempty"`
|
||||||
|
}
|
||||||
23
vendor/github.com/moby/moby/api/types/container/top_response.go
generated
vendored
Normal file
23
vendor/github.com/moby/moby/api/types/container/top_response.go
generated
vendored
Normal file
|
|
@ -0,0 +1,23 @@
|
||||||
|
// Code generated by go-swagger; DO NOT EDIT.
|
||||||
|
|
||||||
|
package container
|
||||||
|
|
||||||
|
// This file was generated by the swagger tool.
|
||||||
|
// Editing this file might prove futile when you re-run the swagger generate command
|
||||||
|
|
||||||
|
// TopResponse ContainerTopResponse
|
||||||
|
//
|
||||||
|
// Container "top" response.
|
||||||
|
//
|
||||||
|
// swagger:model TopResponse
|
||||||
|
type TopResponse struct {
|
||||||
|
|
||||||
|
// Each process running in the container, where each process
|
||||||
|
// is an array of values corresponding to the titles.
|
||||||
|
// Example: {"Processes":[["root","13642","882","0","17:03","pts/0","00:00:00","/bin/bash"],["root","13735","13642","0","17:06","pts/0","00:00:00","sleep 10"]]}
|
||||||
|
Processes [][]string `json:"Processes"`
|
||||||
|
|
||||||
|
// The ps column titles
|
||||||
|
// Example: {"Titles":["UID","PID","PPID","C","STIME","TTY","TIME","CMD"]}
|
||||||
|
Titles []string `json:"Titles"`
|
||||||
|
}
|
||||||
18
vendor/github.com/moby/moby/api/types/container/update_response.go
generated
vendored
Normal file
18
vendor/github.com/moby/moby/api/types/container/update_response.go
generated
vendored
Normal file
|
|
@ -0,0 +1,18 @@
|
||||||
|
// Code generated by go-swagger; DO NOT EDIT.
|
||||||
|
|
||||||
|
package container
|
||||||
|
|
||||||
|
// This file was generated by the swagger tool.
|
||||||
|
// Editing this file might prove futile when you re-run the swagger generate command
|
||||||
|
|
||||||
|
// UpdateResponse ContainerUpdateResponse
|
||||||
|
//
|
||||||
|
// Response for a successful container-update.
|
||||||
|
//
|
||||||
|
// swagger:model UpdateResponse
|
||||||
|
type UpdateResponse struct {
|
||||||
|
|
||||||
|
// Warnings encountered when updating the container.
|
||||||
|
// Example: ["Published ports are discarded when using host network mode"]
|
||||||
|
Warnings []string `json:"Warnings"`
|
||||||
|
}
|
||||||
15
vendor/github.com/moby/moby/api/types/container/wait_exit_error.go
generated
vendored
Normal file
15
vendor/github.com/moby/moby/api/types/container/wait_exit_error.go
generated
vendored
Normal file
|
|
@ -0,0 +1,15 @@
|
||||||
|
// Code generated by go-swagger; DO NOT EDIT.
|
||||||
|
|
||||||
|
package container
|
||||||
|
|
||||||
|
// This file was generated by the swagger tool.
|
||||||
|
// Editing this file might prove futile when you re-run the swagger generate command
|
||||||
|
|
||||||
|
// WaitExitError container waiting error, if any
|
||||||
|
//
|
||||||
|
// swagger:model WaitExitError
|
||||||
|
type WaitExitError struct {
|
||||||
|
|
||||||
|
// Details of an error
|
||||||
|
Message string `json:"Message,omitempty"`
|
||||||
|
}
|
||||||
21
vendor/github.com/moby/moby/api/types/container/wait_response.go
generated
vendored
Normal file
21
vendor/github.com/moby/moby/api/types/container/wait_response.go
generated
vendored
Normal file
|
|
@ -0,0 +1,21 @@
|
||||||
|
// Code generated by go-swagger; DO NOT EDIT.
|
||||||
|
|
||||||
|
package container
|
||||||
|
|
||||||
|
// This file was generated by the swagger tool.
|
||||||
|
// Editing this file might prove futile when you re-run the swagger generate command
|
||||||
|
|
||||||
|
// WaitResponse ContainerWaitResponse
|
||||||
|
//
|
||||||
|
// # OK response to ContainerWait operation
|
||||||
|
//
|
||||||
|
// swagger:model WaitResponse
|
||||||
|
type WaitResponse struct {
|
||||||
|
|
||||||
|
// error
|
||||||
|
Error *WaitExitError `json:"Error,omitempty"`
|
||||||
|
|
||||||
|
// Exit code of the container
|
||||||
|
// Required: true
|
||||||
|
StatusCode int64 `json:"StatusCode"`
|
||||||
|
}
|
||||||
22
vendor/github.com/moby/moby/api/types/container/waitcondition.go
generated
vendored
Normal file
22
vendor/github.com/moby/moby/api/types/container/waitcondition.go
generated
vendored
Normal file
|
|
@ -0,0 +1,22 @@
|
||||||
|
package container
|
||||||
|
|
||||||
|
// WaitCondition is a type used to specify a container state for which
|
||||||
|
// to wait.
|
||||||
|
type WaitCondition string
|
||||||
|
|
||||||
|
// Possible WaitCondition Values.
|
||||||
|
//
|
||||||
|
// WaitConditionNotRunning (default) is used to wait for any of the non-running
|
||||||
|
// states: "created", "exited", "dead", "removing", or "removed".
|
||||||
|
//
|
||||||
|
// WaitConditionNextExit is used to wait for the next time the state changes
|
||||||
|
// to a non-running state. If the state is currently "created" or "exited",
|
||||||
|
// this would cause Wait() to block until either the container runs and exits
|
||||||
|
// or is removed.
|
||||||
|
//
|
||||||
|
// WaitConditionRemoved is used to wait for the container to be removed.
|
||||||
|
const (
|
||||||
|
WaitConditionNotRunning WaitCondition = "not-running"
|
||||||
|
WaitConditionNextExit WaitCondition = "next-exit"
|
||||||
|
WaitConditionRemoved WaitCondition = "removed"
|
||||||
|
)
|
||||||
121
vendor/github.com/moby/moby/api/types/events/events.go
generated
vendored
Normal file
121
vendor/github.com/moby/moby/api/types/events/events.go
generated
vendored
Normal file
|
|
@ -0,0 +1,121 @@
|
||||||
|
package events
|
||||||
|
|
||||||
|
// Type is used for event-types.
|
||||||
|
type Type string
|
||||||
|
|
||||||
|
// List of known event types.
|
||||||
|
const (
|
||||||
|
BuilderEventType Type = "builder" // BuilderEventType is the event type that the builder generates.
|
||||||
|
ConfigEventType Type = "config" // ConfigEventType is the event type that configs generate.
|
||||||
|
ContainerEventType Type = "container" // ContainerEventType is the event type that containers generate.
|
||||||
|
DaemonEventType Type = "daemon" // DaemonEventType is the event type that daemon generate.
|
||||||
|
ImageEventType Type = "image" // ImageEventType is the event type that images generate.
|
||||||
|
NetworkEventType Type = "network" // NetworkEventType is the event type that networks generate.
|
||||||
|
NodeEventType Type = "node" // NodeEventType is the event type that nodes generate.
|
||||||
|
PluginEventType Type = "plugin" // PluginEventType is the event type that plugins generate.
|
||||||
|
SecretEventType Type = "secret" // SecretEventType is the event type that secrets generate.
|
||||||
|
ServiceEventType Type = "service" // ServiceEventType is the event type that services generate.
|
||||||
|
VolumeEventType Type = "volume" // VolumeEventType is the event type that volumes generate.
|
||||||
|
)
|
||||||
|
|
||||||
|
// Action is used for event-actions.
|
||||||
|
type Action string
|
||||||
|
|
||||||
|
const (
|
||||||
|
ActionCreate Action = "create"
|
||||||
|
ActionStart Action = "start"
|
||||||
|
ActionRestart Action = "restart"
|
||||||
|
ActionStop Action = "stop"
|
||||||
|
ActionCheckpoint Action = "checkpoint"
|
||||||
|
ActionPause Action = "pause"
|
||||||
|
ActionUnPause Action = "unpause"
|
||||||
|
ActionAttach Action = "attach"
|
||||||
|
ActionDetach Action = "detach"
|
||||||
|
ActionResize Action = "resize"
|
||||||
|
ActionUpdate Action = "update"
|
||||||
|
ActionRename Action = "rename"
|
||||||
|
ActionKill Action = "kill"
|
||||||
|
ActionDie Action = "die"
|
||||||
|
ActionOOM Action = "oom"
|
||||||
|
ActionDestroy Action = "destroy"
|
||||||
|
ActionRemove Action = "remove"
|
||||||
|
ActionCommit Action = "commit"
|
||||||
|
ActionTop Action = "top"
|
||||||
|
ActionCopy Action = "copy"
|
||||||
|
ActionArchivePath Action = "archive-path"
|
||||||
|
ActionExtractToDir Action = "extract-to-dir"
|
||||||
|
ActionExport Action = "export"
|
||||||
|
ActionImport Action = "import"
|
||||||
|
ActionSave Action = "save"
|
||||||
|
ActionLoad Action = "load"
|
||||||
|
ActionTag Action = "tag"
|
||||||
|
ActionUnTag Action = "untag"
|
||||||
|
ActionPush Action = "push"
|
||||||
|
ActionPull Action = "pull"
|
||||||
|
ActionPrune Action = "prune"
|
||||||
|
ActionDelete Action = "delete"
|
||||||
|
ActionEnable Action = "enable"
|
||||||
|
ActionDisable Action = "disable"
|
||||||
|
ActionConnect Action = "connect"
|
||||||
|
ActionDisconnect Action = "disconnect"
|
||||||
|
ActionReload Action = "reload"
|
||||||
|
ActionMount Action = "mount"
|
||||||
|
ActionUnmount Action = "unmount"
|
||||||
|
|
||||||
|
// ActionExecCreate is the prefix used for exec_create events. These
|
||||||
|
// event-actions are commonly followed by a colon and space (": "),
|
||||||
|
// and the command that's defined for the exec, for example:
|
||||||
|
//
|
||||||
|
// exec_create: /bin/sh -c 'echo hello'
|
||||||
|
//
|
||||||
|
// This is far from ideal; it's a compromise to allow filtering and
|
||||||
|
// to preserve backward-compatibility.
|
||||||
|
ActionExecCreate Action = "exec_create"
|
||||||
|
// ActionExecStart is the prefix used for exec_create events. These
|
||||||
|
// event-actions are commonly followed by a colon and space (": "),
|
||||||
|
// and the command that's defined for the exec, for example:
|
||||||
|
//
|
||||||
|
// exec_start: /bin/sh -c 'echo hello'
|
||||||
|
//
|
||||||
|
// This is far from ideal; it's a compromise to allow filtering and
|
||||||
|
// to preserve backward-compatibility.
|
||||||
|
ActionExecStart Action = "exec_start"
|
||||||
|
ActionExecDie Action = "exec_die"
|
||||||
|
ActionExecDetach Action = "exec_detach"
|
||||||
|
|
||||||
|
// ActionHealthStatus is the prefix to use for health_status events.
|
||||||
|
//
|
||||||
|
// Health-status events can either have a pre-defined status, in which
|
||||||
|
// case the "health_status" action is followed by a colon, or can be
|
||||||
|
// "free-form", in which case they're followed by the output of the
|
||||||
|
// health-check output.
|
||||||
|
//
|
||||||
|
// This is far form ideal, and a compromise to allow filtering, and
|
||||||
|
// to preserve backward-compatibility.
|
||||||
|
ActionHealthStatus Action = "health_status"
|
||||||
|
ActionHealthStatusRunning Action = "health_status: running"
|
||||||
|
ActionHealthStatusHealthy Action = "health_status: healthy"
|
||||||
|
ActionHealthStatusUnhealthy Action = "health_status: unhealthy"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Actor describes something that generates events,
|
||||||
|
// like a container, or a network, or a volume.
|
||||||
|
// It has a defined name and a set of attributes.
|
||||||
|
// The container attributes are its labels, other actors
|
||||||
|
// can generate these attributes from other properties.
|
||||||
|
type Actor struct {
|
||||||
|
ID string
|
||||||
|
Attributes map[string]string
|
||||||
|
}
|
||||||
|
|
||||||
|
// Message represents the information an event contains
|
||||||
|
type Message struct {
|
||||||
|
Type Type
|
||||||
|
Action Action
|
||||||
|
Actor Actor
|
||||||
|
// Engine events are local scope. Cluster events are swarm scope.
|
||||||
|
Scope string `json:"scope,omitempty"`
|
||||||
|
|
||||||
|
Time int64 `json:"time,omitempty"`
|
||||||
|
TimeNano int64 `json:"timeNano,omitempty"`
|
||||||
|
}
|
||||||
18
vendor/github.com/moby/moby/api/types/image/delete_response.go
generated
vendored
Normal file
18
vendor/github.com/moby/moby/api/types/image/delete_response.go
generated
vendored
Normal file
|
|
@ -0,0 +1,18 @@
|
||||||
|
// Code generated by go-swagger; DO NOT EDIT.
|
||||||
|
|
||||||
|
package image
|
||||||
|
|
||||||
|
// This file was generated by the swagger tool.
|
||||||
|
// Editing this file might prove futile when you re-run the swagger generate command
|
||||||
|
|
||||||
|
// DeleteResponse delete response
|
||||||
|
//
|
||||||
|
// swagger:model DeleteResponse
|
||||||
|
type DeleteResponse struct {
|
||||||
|
|
||||||
|
// The image ID of an image that was deleted
|
||||||
|
Deleted string `json:"Deleted,omitempty"`
|
||||||
|
|
||||||
|
// The image ID of an image that was untagged
|
||||||
|
Untagged string `json:"Untagged,omitempty"`
|
||||||
|
}
|
||||||
36
vendor/github.com/moby/moby/api/types/image/disk_usage.go
generated
vendored
Normal file
36
vendor/github.com/moby/moby/api/types/image/disk_usage.go
generated
vendored
Normal file
|
|
@ -0,0 +1,36 @@
|
||||||
|
// Code generated by go-swagger; DO NOT EDIT.
|
||||||
|
|
||||||
|
package image
|
||||||
|
|
||||||
|
// This file was generated by the swagger tool.
|
||||||
|
// Editing this file might prove futile when you re-run the swagger generate command
|
||||||
|
|
||||||
|
// DiskUsage represents system data usage for image resources.
|
||||||
|
//
|
||||||
|
// swagger:model DiskUsage
|
||||||
|
type DiskUsage struct {
|
||||||
|
|
||||||
|
// Count of active images.
|
||||||
|
//
|
||||||
|
// Example: 1
|
||||||
|
ActiveCount int64 `json:"ActiveCount,omitempty"`
|
||||||
|
|
||||||
|
// List of image summaries.
|
||||||
|
//
|
||||||
|
Items []Summary `json:"Items,omitempty"`
|
||||||
|
|
||||||
|
// Disk space that can be reclaimed by removing unused images.
|
||||||
|
//
|
||||||
|
// Example: 12345678
|
||||||
|
Reclaimable int64 `json:"Reclaimable,omitempty"`
|
||||||
|
|
||||||
|
// Count of all images.
|
||||||
|
//
|
||||||
|
// Example: 4
|
||||||
|
TotalCount int64 `json:"TotalCount,omitempty"`
|
||||||
|
|
||||||
|
// Disk space in use by images.
|
||||||
|
//
|
||||||
|
// Example: 98765432
|
||||||
|
TotalSize int64 `json:"TotalSize,omitempty"`
|
||||||
|
}
|
||||||
18
vendor/github.com/moby/moby/api/types/image/image.go
generated
vendored
Normal file
18
vendor/github.com/moby/moby/api/types/image/image.go
generated
vendored
Normal file
|
|
@ -0,0 +1,18 @@
|
||||||
|
package image
|
||||||
|
|
||||||
|
import (
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Metadata contains engine-local data about the image.
|
||||||
|
type Metadata struct {
|
||||||
|
// LastTagTime is the date and time at which the image was last tagged.
|
||||||
|
LastTagTime time.Time `json:",omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// PruneReport contains the response for Engine API:
|
||||||
|
// POST "/images/prune"
|
||||||
|
type PruneReport struct {
|
||||||
|
ImagesDeleted []DeleteResponse
|
||||||
|
SpaceReclaimed uint64
|
||||||
|
}
|
||||||
39
vendor/github.com/moby/moby/api/types/image/image_history.go
generated
vendored
Normal file
39
vendor/github.com/moby/moby/api/types/image/image_history.go
generated
vendored
Normal file
|
|
@ -0,0 +1,39 @@
|
||||||
|
// Code generated by go-swagger; DO NOT EDIT.
|
||||||
|
|
||||||
|
package image
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// Code generated by `swagger generate operation`.
|
||||||
|
//
|
||||||
|
// See hack/generate-swagger-api.sh
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// HistoryResponseItem individual image layer information in response to ImageHistory operation
|
||||||
|
//
|
||||||
|
// swagger:model HistoryResponseItem
|
||||||
|
type HistoryResponseItem struct {
|
||||||
|
|
||||||
|
// comment
|
||||||
|
// Required: true
|
||||||
|
Comment string `json:"Comment"`
|
||||||
|
|
||||||
|
// created
|
||||||
|
// Required: true
|
||||||
|
Created int64 `json:"Created"`
|
||||||
|
|
||||||
|
// created by
|
||||||
|
// Required: true
|
||||||
|
CreatedBy string `json:"CreatedBy"`
|
||||||
|
|
||||||
|
// Id
|
||||||
|
// Required: true
|
||||||
|
ID string `json:"Id"`
|
||||||
|
|
||||||
|
// size
|
||||||
|
// Required: true
|
||||||
|
Size int64 `json:"Size"`
|
||||||
|
|
||||||
|
// tags
|
||||||
|
// Required: true
|
||||||
|
Tags []string `json:"Tags"`
|
||||||
|
}
|
||||||
108
vendor/github.com/moby/moby/api/types/image/image_inspect.go
generated
vendored
Normal file
108
vendor/github.com/moby/moby/api/types/image/image_inspect.go
generated
vendored
Normal file
|
|
@ -0,0 +1,108 @@
|
||||||
|
package image
|
||||||
|
|
||||||
|
import (
|
||||||
|
dockerspec "github.com/moby/docker-image-spec/specs-go/v1"
|
||||||
|
"github.com/moby/moby/api/types/storage"
|
||||||
|
ocispec "github.com/opencontainers/image-spec/specs-go/v1"
|
||||||
|
)
|
||||||
|
|
||||||
|
// RootFS returns Image's RootFS description including the layer IDs.
|
||||||
|
type RootFS struct {
|
||||||
|
Type string `json:",omitempty"`
|
||||||
|
Layers []string `json:",omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// InspectResponse contains response of Engine API:
|
||||||
|
// GET "/images/{name:.*}/json"
|
||||||
|
type InspectResponse struct {
|
||||||
|
// ID is the content-addressable ID of an image.
|
||||||
|
//
|
||||||
|
// This identifier is a content-addressable digest calculated from the
|
||||||
|
// image's configuration (which includes the digests of layers used by
|
||||||
|
// the image).
|
||||||
|
//
|
||||||
|
// Note that this digest differs from the `RepoDigests` below, which
|
||||||
|
// holds digests of image manifests that reference the image.
|
||||||
|
ID string `json:"Id"`
|
||||||
|
|
||||||
|
// RepoTags is a list of image names/tags in the local image cache that
|
||||||
|
// reference this image.
|
||||||
|
//
|
||||||
|
// Multiple image tags can refer to the same image, and this list may be
|
||||||
|
// empty if no tags reference the image, in which case the image is
|
||||||
|
// "untagged", in which case it can still be referenced by its ID.
|
||||||
|
RepoTags []string
|
||||||
|
|
||||||
|
// RepoDigests is a list of content-addressable digests of locally available
|
||||||
|
// image manifests that the image is referenced from. Multiple manifests can
|
||||||
|
// refer to the same image.
|
||||||
|
//
|
||||||
|
// These digests are usually only available if the image was either pulled
|
||||||
|
// from a registry, or if the image was pushed to a registry, which is when
|
||||||
|
// the manifest is generated and its digest calculated.
|
||||||
|
RepoDigests []string
|
||||||
|
|
||||||
|
// Comment is an optional message that can be set when committing or
|
||||||
|
// importing the image. This field is omitted if not set.
|
||||||
|
Comment string `json:",omitempty"`
|
||||||
|
|
||||||
|
// Created is the date and time at which the image was created, formatted in
|
||||||
|
// RFC 3339 nano-seconds (time.RFC3339Nano).
|
||||||
|
//
|
||||||
|
// This information is only available if present in the image,
|
||||||
|
// and omitted otherwise.
|
||||||
|
Created string `json:",omitempty"`
|
||||||
|
|
||||||
|
// Author is the name of the author that was specified when committing the
|
||||||
|
// image, or as specified through MAINTAINER (deprecated) in the Dockerfile.
|
||||||
|
// This field is omitted if not set.
|
||||||
|
Author string `json:",omitempty"`
|
||||||
|
Config *dockerspec.DockerOCIImageConfig
|
||||||
|
|
||||||
|
// Architecture is the hardware CPU architecture that the image runs on.
|
||||||
|
Architecture string
|
||||||
|
|
||||||
|
// Variant is the CPU architecture variant (presently ARM-only).
|
||||||
|
Variant string `json:",omitempty"`
|
||||||
|
|
||||||
|
// OS is the Operating System the image is built to run on.
|
||||||
|
Os string
|
||||||
|
|
||||||
|
// OsVersion is the version of the Operating System the image is built to
|
||||||
|
// run on (especially for Windows).
|
||||||
|
OsVersion string `json:",omitempty"`
|
||||||
|
|
||||||
|
// Size is the total size of the image including all layers it is composed of.
|
||||||
|
Size int64
|
||||||
|
|
||||||
|
// GraphDriver holds information about the storage driver used to store the
|
||||||
|
// container's and image's filesystem.
|
||||||
|
GraphDriver *storage.DriverData `json:"GraphDriver,omitempty"`
|
||||||
|
|
||||||
|
// RootFS contains information about the image's RootFS, including the
|
||||||
|
// layer IDs.
|
||||||
|
RootFS RootFS
|
||||||
|
|
||||||
|
// Metadata of the image in the local cache.
|
||||||
|
//
|
||||||
|
// This information is local to the daemon, and not part of the image itself.
|
||||||
|
Metadata Metadata
|
||||||
|
|
||||||
|
// Descriptor is the OCI descriptor of the image target.
|
||||||
|
// It's only set if the daemon provides a multi-platform image store.
|
||||||
|
//
|
||||||
|
// WARNING: This is experimental and may change at any time without any backward
|
||||||
|
// compatibility.
|
||||||
|
Descriptor *ocispec.Descriptor `json:"Descriptor,omitempty"`
|
||||||
|
|
||||||
|
// Manifests is a list of image manifests available in this image. It
|
||||||
|
// provides a more detailed view of the platform-specific image manifests or
|
||||||
|
// other image-attached data like build attestations.
|
||||||
|
//
|
||||||
|
// Only available if the daemon provides a multi-platform image store, the client
|
||||||
|
// requests manifests AND does not request a specific platform.
|
||||||
|
//
|
||||||
|
// WARNING: This is experimental and may change at any time without any backward
|
||||||
|
// compatibility.
|
||||||
|
Manifests []ManifestSummary `json:"Manifests,omitempty"`
|
||||||
|
}
|
||||||
99
vendor/github.com/moby/moby/api/types/image/manifest.go
generated
vendored
Normal file
99
vendor/github.com/moby/moby/api/types/image/manifest.go
generated
vendored
Normal file
|
|
@ -0,0 +1,99 @@
|
||||||
|
package image
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/opencontainers/go-digest"
|
||||||
|
ocispec "github.com/opencontainers/image-spec/specs-go/v1"
|
||||||
|
)
|
||||||
|
|
||||||
|
type ManifestKind string
|
||||||
|
|
||||||
|
const (
|
||||||
|
ManifestKindImage ManifestKind = "image"
|
||||||
|
ManifestKindAttestation ManifestKind = "attestation"
|
||||||
|
ManifestKindUnknown ManifestKind = "unknown"
|
||||||
|
)
|
||||||
|
|
||||||
|
type ManifestSummary struct {
|
||||||
|
// ID is the content-addressable ID of an image and is the same as the
|
||||||
|
// digest of the image manifest.
|
||||||
|
//
|
||||||
|
// Required: true
|
||||||
|
ID string `json:"ID"`
|
||||||
|
|
||||||
|
// Descriptor is the OCI descriptor of the image.
|
||||||
|
//
|
||||||
|
// Required: true
|
||||||
|
Descriptor ocispec.Descriptor `json:"Descriptor"`
|
||||||
|
|
||||||
|
// Indicates whether all the child content (image config, layers) is
|
||||||
|
// fully available locally
|
||||||
|
//
|
||||||
|
// Required: true
|
||||||
|
Available bool `json:"Available"`
|
||||||
|
|
||||||
|
// Size is the size information of the content related to this manifest.
|
||||||
|
// Note: These sizes only take the locally available content into account.
|
||||||
|
//
|
||||||
|
// Required: true
|
||||||
|
Size struct {
|
||||||
|
// Content is the size (in bytes) of all the locally present
|
||||||
|
// content in the content store (e.g. image config, layers)
|
||||||
|
// referenced by this manifest and its children.
|
||||||
|
// This only includes blobs in the content store.
|
||||||
|
Content int64 `json:"Content"`
|
||||||
|
|
||||||
|
// Total is the total size (in bytes) of all the locally present
|
||||||
|
// data (both distributable and non-distributable) that's related to
|
||||||
|
// this manifest and its children.
|
||||||
|
// This equal to the sum of [Content] size AND all the sizes in the
|
||||||
|
// [Size] struct present in the Kind-specific data struct.
|
||||||
|
// For example, for an image kind (Kind == ManifestKindImage),
|
||||||
|
// this would include the size of the image content and unpacked
|
||||||
|
// image snapshots ([Size.Content] + [ImageData.Size.Unpacked]).
|
||||||
|
Total int64 `json:"Total"`
|
||||||
|
} `json:"Size"`
|
||||||
|
|
||||||
|
// Kind is the kind of the image manifest.
|
||||||
|
//
|
||||||
|
// Required: true
|
||||||
|
Kind ManifestKind `json:"Kind"`
|
||||||
|
|
||||||
|
// Fields below are specific to the kind of the image manifest.
|
||||||
|
|
||||||
|
// Present only if Kind == ManifestKindImage.
|
||||||
|
ImageData *ImageProperties `json:"ImageData,omitempty"`
|
||||||
|
|
||||||
|
// Present only if Kind == ManifestKindAttestation.
|
||||||
|
AttestationData *AttestationProperties `json:"AttestationData,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type ImageProperties struct {
|
||||||
|
// Platform is the OCI platform object describing the platform of the image.
|
||||||
|
//
|
||||||
|
// Required: true
|
||||||
|
Platform ocispec.Platform `json:"Platform"`
|
||||||
|
|
||||||
|
Size struct {
|
||||||
|
// Unpacked is the size (in bytes) of the locally unpacked
|
||||||
|
// (uncompressed) image content that's directly usable by the containers
|
||||||
|
// running this image.
|
||||||
|
// It's independent of the distributable content - e.g.
|
||||||
|
// the image might still have an unpacked data that's still used by
|
||||||
|
// some container even when the distributable/compressed content is
|
||||||
|
// already gone.
|
||||||
|
//
|
||||||
|
// Required: true
|
||||||
|
Unpacked int64 `json:"Unpacked"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// Containers is an array containing the IDs of the containers that are
|
||||||
|
// using this image.
|
||||||
|
//
|
||||||
|
// Required: true
|
||||||
|
Containers []string `json:"Containers"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type AttestationProperties struct {
|
||||||
|
// For is the digest of the image manifest that this attestation is for.
|
||||||
|
For digest.Digest `json:"For"`
|
||||||
|
}
|
||||||
95
vendor/github.com/moby/moby/api/types/image/summary.go
generated
vendored
Normal file
95
vendor/github.com/moby/moby/api/types/image/summary.go
generated
vendored
Normal file
|
|
@ -0,0 +1,95 @@
|
||||||
|
package image
|
||||||
|
|
||||||
|
import ocispec "github.com/opencontainers/image-spec/specs-go/v1"
|
||||||
|
|
||||||
|
type Summary struct {
|
||||||
|
// Number of containers using this image. Includes both stopped and running
|
||||||
|
// containers.
|
||||||
|
//
|
||||||
|
// This size is not calculated by default, and depends on which API endpoint
|
||||||
|
// is used. `-1` indicates that the value has not been set / calculated.
|
||||||
|
//
|
||||||
|
// Required: true
|
||||||
|
Containers int64 `json:"Containers"`
|
||||||
|
|
||||||
|
// Date and time at which the image was created as a Unix timestamp
|
||||||
|
// (number of seconds since EPOCH).
|
||||||
|
//
|
||||||
|
// Required: true
|
||||||
|
Created int64 `json:"Created"`
|
||||||
|
|
||||||
|
// ID is the content-addressable ID of an image.
|
||||||
|
//
|
||||||
|
// This identifier is a content-addressable digest calculated from the
|
||||||
|
// image's configuration (which includes the digests of layers used by
|
||||||
|
// the image).
|
||||||
|
//
|
||||||
|
// Note that this digest differs from the `RepoDigests` below, which
|
||||||
|
// holds digests of image manifests that reference the image.
|
||||||
|
//
|
||||||
|
// Required: true
|
||||||
|
ID string `json:"Id"`
|
||||||
|
|
||||||
|
// User-defined key/value metadata.
|
||||||
|
// Required: true
|
||||||
|
Labels map[string]string `json:"Labels"`
|
||||||
|
|
||||||
|
// ID of the parent image.
|
||||||
|
//
|
||||||
|
// Depending on how the image was created, this field may be empty and
|
||||||
|
// is only set for images that were built/created locally. This field
|
||||||
|
// is empty if the image was pulled from an image registry.
|
||||||
|
//
|
||||||
|
// Required: true
|
||||||
|
ParentID string `json:"ParentId"`
|
||||||
|
|
||||||
|
// Descriptor is the OCI descriptor of the image target.
|
||||||
|
// It's only set if the daemon provides a multi-platform image store.
|
||||||
|
//
|
||||||
|
// WARNING: This is experimental and may change at any time without any backward
|
||||||
|
// compatibility.
|
||||||
|
Descriptor *ocispec.Descriptor `json:"Descriptor,omitempty"`
|
||||||
|
|
||||||
|
// Manifests is a list of image manifests available in this image. It
|
||||||
|
// provides a more detailed view of the platform-specific image manifests or
|
||||||
|
// other image-attached data like build attestations.
|
||||||
|
//
|
||||||
|
// WARNING: This is experimental and may change at any time without any backward
|
||||||
|
// compatibility.
|
||||||
|
Manifests []ManifestSummary `json:"Manifests,omitempty"`
|
||||||
|
|
||||||
|
// List of content-addressable digests of locally available image manifests
|
||||||
|
// that the image is referenced from. Multiple manifests can refer to the
|
||||||
|
// same image.
|
||||||
|
//
|
||||||
|
// These digests are usually only available if the image was either pulled
|
||||||
|
// from a registry, or if the image was pushed to a registry, which is when
|
||||||
|
// the manifest is generated and its digest calculated.
|
||||||
|
//
|
||||||
|
// Required: true
|
||||||
|
RepoDigests []string `json:"RepoDigests"`
|
||||||
|
|
||||||
|
// List of image names/tags in the local image cache that reference this
|
||||||
|
// image.
|
||||||
|
//
|
||||||
|
// Multiple image tags can refer to the same image, and this list may be
|
||||||
|
// empty if no tags reference the image, in which case the image is
|
||||||
|
// "untagged", in which case it can still be referenced by its ID.
|
||||||
|
//
|
||||||
|
// Required: true
|
||||||
|
RepoTags []string `json:"RepoTags"`
|
||||||
|
|
||||||
|
// Total size of image layers that are shared between this image and other
|
||||||
|
// images.
|
||||||
|
//
|
||||||
|
// This size is not calculated by default. `-1` indicates that the value
|
||||||
|
// has not been set / calculated.
|
||||||
|
//
|
||||||
|
// Required: true
|
||||||
|
SharedSize int64 `json:"SharedSize"`
|
||||||
|
|
||||||
|
// Total size of the image including all layers it is composed of.
|
||||||
|
//
|
||||||
|
// Required: true
|
||||||
|
Size int64 `json:"Size"`
|
||||||
|
}
|
||||||
12
vendor/github.com/moby/moby/api/types/jsonstream/json_error.go
generated
vendored
Normal file
12
vendor/github.com/moby/moby/api/types/jsonstream/json_error.go
generated
vendored
Normal file
|
|
@ -0,0 +1,12 @@
|
||||||
|
package jsonstream
|
||||||
|
|
||||||
|
// Error wraps a concrete Code and Message, Code is
|
||||||
|
// an integer error code, Message is the error message.
|
||||||
|
type Error struct {
|
||||||
|
Code int `json:"code,omitempty"`
|
||||||
|
Message string `json:"message,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *Error) Error() string {
|
||||||
|
return e.Message
|
||||||
|
}
|
||||||
15
vendor/github.com/moby/moby/api/types/jsonstream/message.go
generated
vendored
Normal file
15
vendor/github.com/moby/moby/api/types/jsonstream/message.go
generated
vendored
Normal file
|
|
@ -0,0 +1,15 @@
|
||||||
|
package jsonstream
|
||||||
|
|
||||||
|
import "encoding/json"
|
||||||
|
|
||||||
|
// JSONMessage defines a message struct. It describes
|
||||||
|
// the created time, where it from, status, ID of the
|
||||||
|
// message. It's used for docker events.
|
||||||
|
type Message struct {
|
||||||
|
Stream string `json:"stream,omitempty"`
|
||||||
|
Status string `json:"status,omitempty"`
|
||||||
|
Progress *Progress `json:"progressDetail,omitempty"`
|
||||||
|
ID string `json:"id,omitempty"`
|
||||||
|
Error *Error `json:"errorDetail,omitempty"`
|
||||||
|
Aux *json.RawMessage `json:"aux,omitempty"` // Aux contains out-of-band data, such as digests for push signing and image id after building.
|
||||||
|
}
|
||||||
10
vendor/github.com/moby/moby/api/types/jsonstream/progress.go
generated
vendored
Normal file
10
vendor/github.com/moby/moby/api/types/jsonstream/progress.go
generated
vendored
Normal file
|
|
@ -0,0 +1,10 @@
|
||||||
|
package jsonstream
|
||||||
|
|
||||||
|
// Progress describes a progress message in a JSON stream.
|
||||||
|
type Progress struct {
|
||||||
|
Current int64 `json:"current,omitempty"` // Current is the current status and value of the progress made towards Total.
|
||||||
|
Total int64 `json:"total,omitempty"` // Total is the end value describing when we made 100% progress for an operation.
|
||||||
|
Start int64 `json:"start,omitempty"` // Start is the initial value for the operation.
|
||||||
|
HideCounts bool `json:"hidecounts,omitempty"` // HideCounts. if true, hides the progress count indicator (xB/yB).
|
||||||
|
Units string `json:"units,omitempty"` // Units is the unit to print for progress. It defaults to "bytes" if empty.
|
||||||
|
}
|
||||||
157
vendor/github.com/moby/moby/api/types/mount/mount.go
generated
vendored
Normal file
157
vendor/github.com/moby/moby/api/types/mount/mount.go
generated
vendored
Normal file
|
|
@ -0,0 +1,157 @@
|
||||||
|
package mount
|
||||||
|
|
||||||
|
import (
|
||||||
|
"os"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Type represents the type of a mount.
|
||||||
|
type Type string
|
||||||
|
|
||||||
|
// Type constants
|
||||||
|
const (
|
||||||
|
// TypeBind is the type for mounting host dir
|
||||||
|
TypeBind Type = "bind"
|
||||||
|
// TypeVolume is the type for remote storage volumes
|
||||||
|
TypeVolume Type = "volume"
|
||||||
|
// TypeTmpfs is the type for mounting tmpfs
|
||||||
|
TypeTmpfs Type = "tmpfs"
|
||||||
|
// TypeNamedPipe is the type for mounting Windows named pipes
|
||||||
|
TypeNamedPipe Type = "npipe"
|
||||||
|
// TypeCluster is the type for Swarm Cluster Volumes.
|
||||||
|
TypeCluster Type = "cluster"
|
||||||
|
// TypeImage is the type for mounting another image's filesystem
|
||||||
|
TypeImage Type = "image"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Mount represents a mount (volume).
|
||||||
|
type Mount struct {
|
||||||
|
Type Type `json:",omitempty"`
|
||||||
|
// Source specifies the name of the mount. Depending on mount type, this
|
||||||
|
// may be a volume name or a host path, or even ignored.
|
||||||
|
// Source is not supported for tmpfs (must be an empty value)
|
||||||
|
Source string `json:",omitempty"`
|
||||||
|
Target string `json:",omitempty"`
|
||||||
|
ReadOnly bool `json:",omitempty"` // attempts recursive read-only if possible
|
||||||
|
Consistency Consistency `json:",omitempty"`
|
||||||
|
|
||||||
|
BindOptions *BindOptions `json:",omitempty"`
|
||||||
|
VolumeOptions *VolumeOptions `json:",omitempty"`
|
||||||
|
ImageOptions *ImageOptions `json:",omitempty"`
|
||||||
|
TmpfsOptions *TmpfsOptions `json:",omitempty"`
|
||||||
|
ClusterOptions *ClusterOptions `json:",omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// Propagation represents the propagation of a mount.
|
||||||
|
type Propagation string
|
||||||
|
|
||||||
|
const (
|
||||||
|
// PropagationRPrivate RPRIVATE
|
||||||
|
PropagationRPrivate Propagation = "rprivate"
|
||||||
|
// PropagationPrivate PRIVATE
|
||||||
|
PropagationPrivate Propagation = "private"
|
||||||
|
// PropagationRShared RSHARED
|
||||||
|
PropagationRShared Propagation = "rshared"
|
||||||
|
// PropagationShared SHARED
|
||||||
|
PropagationShared Propagation = "shared"
|
||||||
|
// PropagationRSlave RSLAVE
|
||||||
|
PropagationRSlave Propagation = "rslave"
|
||||||
|
// PropagationSlave SLAVE
|
||||||
|
PropagationSlave Propagation = "slave"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Propagations is the list of all valid mount propagations
|
||||||
|
var Propagations = []Propagation{
|
||||||
|
PropagationRPrivate,
|
||||||
|
PropagationPrivate,
|
||||||
|
PropagationRShared,
|
||||||
|
PropagationShared,
|
||||||
|
PropagationRSlave,
|
||||||
|
PropagationSlave,
|
||||||
|
}
|
||||||
|
|
||||||
|
// Consistency represents the consistency requirements of a mount.
|
||||||
|
type Consistency string
|
||||||
|
|
||||||
|
const (
|
||||||
|
// ConsistencyFull guarantees bind mount-like consistency
|
||||||
|
ConsistencyFull Consistency = "consistent"
|
||||||
|
// ConsistencyCached mounts can cache read data and FS structure
|
||||||
|
ConsistencyCached Consistency = "cached"
|
||||||
|
// ConsistencyDelegated mounts can cache read and written data and structure
|
||||||
|
ConsistencyDelegated Consistency = "delegated"
|
||||||
|
// ConsistencyDefault provides "consistent" behavior unless overridden
|
||||||
|
ConsistencyDefault Consistency = "default"
|
||||||
|
)
|
||||||
|
|
||||||
|
// BindOptions defines options specific to mounts of type "bind".
|
||||||
|
type BindOptions struct {
|
||||||
|
Propagation Propagation `json:",omitempty"`
|
||||||
|
NonRecursive bool `json:",omitempty"`
|
||||||
|
CreateMountpoint bool `json:",omitempty"`
|
||||||
|
// ReadOnlyNonRecursive makes the mount non-recursively read-only, but still leaves the mount recursive
|
||||||
|
// (unless NonRecursive is set to true in conjunction).
|
||||||
|
ReadOnlyNonRecursive bool `json:",omitempty"`
|
||||||
|
// ReadOnlyForceRecursive raises an error if the mount cannot be made recursively read-only.
|
||||||
|
ReadOnlyForceRecursive bool `json:",omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// VolumeOptions represents the options for a mount of type volume.
|
||||||
|
type VolumeOptions struct {
|
||||||
|
NoCopy bool `json:",omitempty"`
|
||||||
|
Labels map[string]string `json:",omitempty"`
|
||||||
|
Subpath string `json:",omitempty"`
|
||||||
|
DriverConfig *Driver `json:",omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type ImageOptions struct {
|
||||||
|
Subpath string `json:",omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// Driver represents a volume driver.
|
||||||
|
type Driver struct {
|
||||||
|
Name string `json:",omitempty"`
|
||||||
|
Options map[string]string `json:",omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// TmpfsOptions defines options specific to mounts of type "tmpfs".
|
||||||
|
type TmpfsOptions struct {
|
||||||
|
// Size sets the size of the tmpfs, in bytes.
|
||||||
|
//
|
||||||
|
// This will be converted to an operating system specific value
|
||||||
|
// depending on the host. For example, on linux, it will be converted to
|
||||||
|
// use a 'k', 'm' or 'g' syntax. BSD, though not widely supported with
|
||||||
|
// docker, uses a straight byte value.
|
||||||
|
//
|
||||||
|
// Percentages are not supported.
|
||||||
|
SizeBytes int64 `json:",omitempty"`
|
||||||
|
// Mode of the tmpfs upon creation
|
||||||
|
Mode os.FileMode `json:",omitempty"`
|
||||||
|
// Options to be passed to the tmpfs mount. An array of arrays. Flag
|
||||||
|
// options should be provided as 1-length arrays. Other types should be
|
||||||
|
// provided as 2-length arrays, where the first item is the key and the
|
||||||
|
// second the value.
|
||||||
|
Options [][]string `json:",omitempty"`
|
||||||
|
// TODO(stevvooe): There are several more tmpfs flags, specified in the
|
||||||
|
// daemon, that are accepted. Only the most basic are added for now.
|
||||||
|
//
|
||||||
|
// From https://github.com/moby/sys/blob/mount/v0.1.1/mount/flags.go#L47-L56
|
||||||
|
//
|
||||||
|
// var validFlags = map[string]bool{
|
||||||
|
// "": true,
|
||||||
|
// "size": true, X
|
||||||
|
// "mode": true, X
|
||||||
|
// "uid": true,
|
||||||
|
// "gid": true,
|
||||||
|
// "nr_inodes": true,
|
||||||
|
// "nr_blocks": true,
|
||||||
|
// "mpol": true,
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// Some of these may be straightforward to add, but others, such as
|
||||||
|
// uid/gid have implications in a clustered system.
|
||||||
|
}
|
||||||
|
|
||||||
|
// ClusterOptions specifies options for a Cluster volume.
|
||||||
|
type ClusterOptions struct {
|
||||||
|
// intentionally empty
|
||||||
|
}
|
||||||
20
vendor/github.com/moby/moby/api/types/network/config_reference.go
generated
vendored
Normal file
20
vendor/github.com/moby/moby/api/types/network/config_reference.go
generated
vendored
Normal file
|
|
@ -0,0 +1,20 @@
|
||||||
|
// Code generated by go-swagger; DO NOT EDIT.
|
||||||
|
|
||||||
|
package network
|
||||||
|
|
||||||
|
// This file was generated by the swagger tool.
|
||||||
|
// Editing this file might prove futile when you re-run the swagger generate command
|
||||||
|
|
||||||
|
// ConfigReference The config-only network source to provide the configuration for
|
||||||
|
// this network.
|
||||||
|
//
|
||||||
|
// swagger:model ConfigReference
|
||||||
|
type ConfigReference struct {
|
||||||
|
|
||||||
|
// The name of the config-only network that provides the network's
|
||||||
|
// configuration. The specified network must be an existing config-only
|
||||||
|
// network. Only network names are allowed, not network IDs.
|
||||||
|
//
|
||||||
|
// Example: config_only_network_01
|
||||||
|
Network string `json:"Network"`
|
||||||
|
}
|
||||||
20
vendor/github.com/moby/moby/api/types/network/connect_request.go
generated
vendored
Normal file
20
vendor/github.com/moby/moby/api/types/network/connect_request.go
generated
vendored
Normal file
|
|
@ -0,0 +1,20 @@
|
||||||
|
// Code generated by go-swagger; DO NOT EDIT.
|
||||||
|
|
||||||
|
package network
|
||||||
|
|
||||||
|
// This file was generated by the swagger tool.
|
||||||
|
// Editing this file might prove futile when you re-run the swagger generate command
|
||||||
|
|
||||||
|
// ConnectRequest NetworkConnectRequest represents the data to be used to connect a container to a network.
|
||||||
|
//
|
||||||
|
// swagger:model ConnectRequest
|
||||||
|
type ConnectRequest struct {
|
||||||
|
|
||||||
|
// The ID or name of the container to connect to the network.
|
||||||
|
// Example: 3613f73ba0e4
|
||||||
|
// Required: true
|
||||||
|
Container string `json:"Container"`
|
||||||
|
|
||||||
|
// endpoint config
|
||||||
|
EndpointConfig *EndpointSettings `json:"EndpointConfig,omitempty"`
|
||||||
|
}
|
||||||
23
vendor/github.com/moby/moby/api/types/network/create_response.go
generated
vendored
Normal file
23
vendor/github.com/moby/moby/api/types/network/create_response.go
generated
vendored
Normal file
|
|
@ -0,0 +1,23 @@
|
||||||
|
// Code generated by go-swagger; DO NOT EDIT.
|
||||||
|
|
||||||
|
package network
|
||||||
|
|
||||||
|
// This file was generated by the swagger tool.
|
||||||
|
// Editing this file might prove futile when you re-run the swagger generate command
|
||||||
|
|
||||||
|
// CreateResponse NetworkCreateResponse
|
||||||
|
//
|
||||||
|
// # OK response to NetworkCreate operation
|
||||||
|
//
|
||||||
|
// swagger:model CreateResponse
|
||||||
|
type CreateResponse struct {
|
||||||
|
|
||||||
|
// The ID of the created network.
|
||||||
|
// Example: b5c4fc71e8022147cd25de22b22173de4e3b170134117172eb595cb91b4e7e5d
|
||||||
|
// Required: true
|
||||||
|
ID string `json:"Id"`
|
||||||
|
|
||||||
|
// Warnings encountered when creating the container
|
||||||
|
// Required: true
|
||||||
|
Warning string `json:"Warning"`
|
||||||
|
}
|
||||||
21
vendor/github.com/moby/moby/api/types/network/disconnect_request.go
generated
vendored
Normal file
21
vendor/github.com/moby/moby/api/types/network/disconnect_request.go
generated
vendored
Normal file
|
|
@ -0,0 +1,21 @@
|
||||||
|
// Code generated by go-swagger; DO NOT EDIT.
|
||||||
|
|
||||||
|
package network
|
||||||
|
|
||||||
|
// This file was generated by the swagger tool.
|
||||||
|
// Editing this file might prove futile when you re-run the swagger generate command
|
||||||
|
|
||||||
|
// DisconnectRequest NetworkDisconnectRequest represents the data to be used to disconnect a container from a network.
|
||||||
|
//
|
||||||
|
// swagger:model DisconnectRequest
|
||||||
|
type DisconnectRequest struct {
|
||||||
|
|
||||||
|
// The ID or name of the container to disconnect from the network.
|
||||||
|
// Example: 3613f73ba0e4
|
||||||
|
// Required: true
|
||||||
|
Container string `json:"Container"`
|
||||||
|
|
||||||
|
// Force the container to disconnect from the network.
|
||||||
|
// Example: false
|
||||||
|
Force bool `json:"Force"`
|
||||||
|
}
|
||||||
74
vendor/github.com/moby/moby/api/types/network/endpoint.go
generated
vendored
Normal file
74
vendor/github.com/moby/moby/api/types/network/endpoint.go
generated
vendored
Normal file
|
|
@ -0,0 +1,74 @@
|
||||||
|
package network
|
||||||
|
|
||||||
|
import (
|
||||||
|
"maps"
|
||||||
|
"net/netip"
|
||||||
|
"slices"
|
||||||
|
)
|
||||||
|
|
||||||
|
// EndpointSettings stores the network endpoint details
|
||||||
|
type EndpointSettings struct {
|
||||||
|
// Configuration data
|
||||||
|
IPAMConfig *EndpointIPAMConfig
|
||||||
|
Links []string
|
||||||
|
Aliases []string // Aliases holds the list of extra, user-specified DNS names for this endpoint.
|
||||||
|
DriverOpts map[string]string
|
||||||
|
|
||||||
|
// GwPriority determines which endpoint will provide the default gateway
|
||||||
|
// for the container. The endpoint with the highest priority will be used.
|
||||||
|
// If multiple endpoints have the same priority, they are lexicographically
|
||||||
|
// sorted based on their network name, and the one that sorts first is picked.
|
||||||
|
GwPriority int
|
||||||
|
|
||||||
|
// Operational data
|
||||||
|
|
||||||
|
NetworkID string
|
||||||
|
EndpointID string
|
||||||
|
Gateway netip.Addr
|
||||||
|
IPAddress netip.Addr
|
||||||
|
|
||||||
|
// MacAddress may be used to specify a MAC address when the container is created.
|
||||||
|
// Once the container is running, it becomes operational data (it may contain a
|
||||||
|
// generated address).
|
||||||
|
MacAddress HardwareAddr
|
||||||
|
IPPrefixLen int
|
||||||
|
IPv6Gateway netip.Addr
|
||||||
|
GlobalIPv6Address netip.Addr
|
||||||
|
GlobalIPv6PrefixLen int
|
||||||
|
// DNSNames holds all the (non fully qualified) DNS names associated to this
|
||||||
|
// endpoint. The first entry is used to generate PTR records.
|
||||||
|
DNSNames []string
|
||||||
|
}
|
||||||
|
|
||||||
|
// Copy makes a deep copy of `EndpointSettings`
|
||||||
|
func (es *EndpointSettings) Copy() *EndpointSettings {
|
||||||
|
if es == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
epCopy := *es
|
||||||
|
epCopy.IPAMConfig = es.IPAMConfig.Copy()
|
||||||
|
epCopy.Links = slices.Clone(es.Links)
|
||||||
|
epCopy.Aliases = slices.Clone(es.Aliases)
|
||||||
|
epCopy.DNSNames = slices.Clone(es.DNSNames)
|
||||||
|
epCopy.DriverOpts = maps.Clone(es.DriverOpts)
|
||||||
|
|
||||||
|
return &epCopy
|
||||||
|
}
|
||||||
|
|
||||||
|
// EndpointIPAMConfig represents IPAM configurations for the endpoint
|
||||||
|
type EndpointIPAMConfig struct {
|
||||||
|
IPv4Address netip.Addr `json:",omitempty"`
|
||||||
|
IPv6Address netip.Addr `json:",omitempty"`
|
||||||
|
LinkLocalIPs []netip.Addr `json:",omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// Copy makes a copy of the endpoint ipam config
|
||||||
|
func (cfg *EndpointIPAMConfig) Copy() *EndpointIPAMConfig {
|
||||||
|
if cfg == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
cfgCopy := *cfg
|
||||||
|
cfgCopy.LinkLocalIPs = slices.Clone(cfg.LinkLocalIPs)
|
||||||
|
return &cfgCopy
|
||||||
|
}
|
||||||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Reference in a new issue