build(deps): bump github.com/Microsoft/hcsshim from 0.8.20 to 0.9.6
Bumps [github.com/Microsoft/hcsshim](https://github.com/Microsoft/hcsshim) from 0.8.20 to 0.9.6. - [Release notes](https://github.com/Microsoft/hcsshim/releases) - [Commits](https://github.com/Microsoft/hcsshim/compare/v0.8.20...v0.9.6) --- updated-dependencies: - dependency-name: github.com/Microsoft/hcsshim dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Signed-off-by: Matthieu MOREL <matthieu.morel35@gmail.com>
This commit is contained in:
parent
020b8db6ab
commit
90ed30a55a
2
go.mod
2
go.mod
@ -3,7 +3,7 @@ module github.com/containernetworking/plugins
|
|||||||
go 1.17
|
go 1.17
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/Microsoft/hcsshim v0.8.20
|
github.com/Microsoft/hcsshim v0.9.6
|
||||||
github.com/alexflint/go-filemutex v1.1.0
|
github.com/alexflint/go-filemutex v1.1.0
|
||||||
github.com/buger/jsonparser v1.1.1
|
github.com/buger/jsonparser v1.1.1
|
||||||
github.com/containernetworking/cni v1.0.1
|
github.com/containernetworking/cni v1.0.1
|
||||||
|
97
go.sum
97
go.sum
@ -10,6 +10,7 @@ cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6T
|
|||||||
cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4=
|
cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4=
|
||||||
cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M=
|
cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M=
|
||||||
cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc=
|
cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc=
|
||||||
|
cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs=
|
||||||
cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
|
cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
|
||||||
cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=
|
cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=
|
||||||
cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=
|
cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=
|
||||||
@ -52,13 +53,16 @@ github.com/Microsoft/hcsshim v0.8.9/go.mod h1:5692vkUqntj1idxauYlpoINNKeqCiG6Sg3
|
|||||||
github.com/Microsoft/hcsshim v0.8.14/go.mod h1:NtVKoYxQuTLx6gEq0L96c9Ju4JbRJ4nY2ow3VK6a9Lg=
|
github.com/Microsoft/hcsshim v0.8.14/go.mod h1:NtVKoYxQuTLx6gEq0L96c9Ju4JbRJ4nY2ow3VK6a9Lg=
|
||||||
github.com/Microsoft/hcsshim v0.8.15/go.mod h1:x38A4YbHbdxJtc0sF6oIz+RG0npwSCAvn69iY6URG00=
|
github.com/Microsoft/hcsshim v0.8.15/go.mod h1:x38A4YbHbdxJtc0sF6oIz+RG0npwSCAvn69iY6URG00=
|
||||||
github.com/Microsoft/hcsshim v0.8.16/go.mod h1:o5/SZqmR7x9JNKsW3pu+nqHm0MF8vbA+VxGOoXdC600=
|
github.com/Microsoft/hcsshim v0.8.16/go.mod h1:o5/SZqmR7x9JNKsW3pu+nqHm0MF8vbA+VxGOoXdC600=
|
||||||
github.com/Microsoft/hcsshim v0.8.20 h1:ZTwcx3NS8n07kPf/JZ1qwU6vnjhVPMUWlXBF8r9UxrE=
|
github.com/Microsoft/hcsshim v0.8.21/go.mod h1:+w2gRZ5ReXQhFOrvSQeNfhrYB/dg3oDwTOcER2fw4I4=
|
||||||
github.com/Microsoft/hcsshim v0.8.20/go.mod h1:+w2gRZ5ReXQhFOrvSQeNfhrYB/dg3oDwTOcER2fw4I4=
|
github.com/Microsoft/hcsshim v0.9.6 h1:VwnDOgLeoi2du6dAznfmspNqTiwczvjv4K7NxuY9jsY=
|
||||||
|
github.com/Microsoft/hcsshim v0.9.6/go.mod h1:7pLA8lDk46WKDWlVsENo92gC0XFa8rbKfyFRBqxEbCc=
|
||||||
github.com/Microsoft/hcsshim/test v0.0.0-20201218223536-d3e5debf77da/go.mod h1:5hlzMzRKMLyo42nCZ9oml8AdTlq/0cvIaBv6tK1RehU=
|
github.com/Microsoft/hcsshim/test v0.0.0-20201218223536-d3e5debf77da/go.mod h1:5hlzMzRKMLyo42nCZ9oml8AdTlq/0cvIaBv6tK1RehU=
|
||||||
github.com/Microsoft/hcsshim/test v0.0.0-20210227013316-43a75bb4edd3/go.mod h1:mw7qgWloBUl75W/gVH3cQszUg1+gUITj7D6NY7ywVnY=
|
github.com/Microsoft/hcsshim/test v0.0.0-20210227013316-43a75bb4edd3/go.mod h1:mw7qgWloBUl75W/gVH3cQszUg1+gUITj7D6NY7ywVnY=
|
||||||
github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ=
|
github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ=
|
||||||
github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
|
github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
|
||||||
|
github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
|
||||||
github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
|
github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
|
||||||
|
github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE=
|
||||||
github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE=
|
github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE=
|
||||||
github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d/go.mod h1:HI8ITrYtUY+O+ZhtlqUnD8+KwNPOyugEhfP9fdUIaEQ=
|
github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d/go.mod h1:HI8ITrYtUY+O+ZhtlqUnD8+KwNPOyugEhfP9fdUIaEQ=
|
||||||
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
|
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
|
||||||
@ -68,6 +72,7 @@ github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRF
|
|||||||
github.com/alexflint/go-filemutex v0.0.0-20171022225611-72bdc8eae2ae/go.mod h1:CgnQgUtFrFz9mxFNtED3jI5tLDjKlOM+oUF/sTk6ps0=
|
github.com/alexflint/go-filemutex v0.0.0-20171022225611-72bdc8eae2ae/go.mod h1:CgnQgUtFrFz9mxFNtED3jI5tLDjKlOM+oUF/sTk6ps0=
|
||||||
github.com/alexflint/go-filemutex v1.1.0 h1:IAWuUuRYL2hETx5b8vCgwnD+xSdlsTQY6s2JjBsqLdg=
|
github.com/alexflint/go-filemutex v1.1.0 h1:IAWuUuRYL2hETx5b8vCgwnD+xSdlsTQY6s2JjBsqLdg=
|
||||||
github.com/alexflint/go-filemutex v1.1.0/go.mod h1:7P4iRhttt/nUvUOrYIhcpMzv2G6CY9UnI16Z+UJqRyk=
|
github.com/alexflint/go-filemutex v1.1.0/go.mod h1:7P4iRhttt/nUvUOrYIhcpMzv2G6CY9UnI16Z+UJqRyk=
|
||||||
|
github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
|
||||||
github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
|
github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
|
||||||
github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY=
|
github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY=
|
||||||
github.com/aws/aws-sdk-go v1.15.11/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0=
|
github.com/aws/aws-sdk-go v1.15.11/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0=
|
||||||
@ -77,6 +82,7 @@ github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+Ce
|
|||||||
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
|
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
|
||||||
github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
|
github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
|
||||||
github.com/bitly/go-simplejson v0.5.0/go.mod h1:cXHtHw4XUPsvGaxgjIAn8PhEWG9NfngEKAMDJEczWVA=
|
github.com/bitly/go-simplejson v0.5.0/go.mod h1:cXHtHw4XUPsvGaxgjIAn8PhEWG9NfngEKAMDJEczWVA=
|
||||||
|
github.com/bits-and-blooms/bitset v1.2.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA=
|
||||||
github.com/blang/semver v3.1.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk=
|
github.com/blang/semver v3.1.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk=
|
||||||
github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk=
|
github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk=
|
||||||
github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4=
|
github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4=
|
||||||
@ -87,10 +93,12 @@ github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx2
|
|||||||
github.com/bugsnag/bugsnag-go v0.0.0-20141110184014-b1d153021fcd/go.mod h1:2oa8nejYd4cQ/b0hMIopN0lCRxU0bueqREvZLWFrtK8=
|
github.com/bugsnag/bugsnag-go v0.0.0-20141110184014-b1d153021fcd/go.mod h1:2oa8nejYd4cQ/b0hMIopN0lCRxU0bueqREvZLWFrtK8=
|
||||||
github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b/go.mod h1:obH5gd0BsqsP2LwDJ9aOkm/6J86V6lyAXCoQWGw3K50=
|
github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b/go.mod h1:obH5gd0BsqsP2LwDJ9aOkm/6J86V6lyAXCoQWGw3K50=
|
||||||
github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0/go.mod h1:D/8v3kj0zr8ZAKg1AQ6crr+5VwKN5eIywRkfhyM/+dE=
|
github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0/go.mod h1:D/8v3kj0zr8ZAKg1AQ6crr+5VwKN5eIywRkfhyM/+dE=
|
||||||
|
github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw=
|
||||||
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
|
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
|
||||||
github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
|
github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
|
||||||
github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
|
github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
|
||||||
github.com/checkpoint-restore/go-criu/v4 v4.1.0/go.mod h1:xUQBLp4RLc5zJtWY++yjOoMoB5lihDt7fai+75m+rGw=
|
github.com/checkpoint-restore/go-criu/v4 v4.1.0/go.mod h1:xUQBLp4RLc5zJtWY++yjOoMoB5lihDt7fai+75m+rGw=
|
||||||
|
github.com/checkpoint-restore/go-criu/v5 v5.0.0/go.mod h1:cfwC0EG7HMUenopBsUf9d89JlCLQIfgVcNsNN0t6T2M=
|
||||||
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
|
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
|
||||||
github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
|
github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
|
||||||
github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
|
github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
|
||||||
@ -98,8 +106,11 @@ github.com/cilium/ebpf v0.0.0-20200110133405-4032b1d8aae3/go.mod h1:MA5e5Lr8slmE
|
|||||||
github.com/cilium/ebpf v0.0.0-20200702112145-1c8d4c9ef775/go.mod h1:7cR51M8ViRLIdUjrmSXlK9pkrsDlLHbO8jiB8X8JnOc=
|
github.com/cilium/ebpf v0.0.0-20200702112145-1c8d4c9ef775/go.mod h1:7cR51M8ViRLIdUjrmSXlK9pkrsDlLHbO8jiB8X8JnOc=
|
||||||
github.com/cilium/ebpf v0.2.0/go.mod h1:To2CFviqOWL/M0gIMsvSMlqe7em/l1ALkX1PyjrX2Qs=
|
github.com/cilium/ebpf v0.2.0/go.mod h1:To2CFviqOWL/M0gIMsvSMlqe7em/l1ALkX1PyjrX2Qs=
|
||||||
github.com/cilium/ebpf v0.4.0/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs=
|
github.com/cilium/ebpf v0.4.0/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs=
|
||||||
|
github.com/cilium/ebpf v0.6.2/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs=
|
||||||
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
|
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
|
||||||
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
|
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
|
||||||
|
github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
|
||||||
|
github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
|
||||||
github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8=
|
github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8=
|
||||||
github.com/containerd/aufs v0.0.0-20200908144142-dab0cbea06f4/go.mod h1:nukgQABAEopAHvB6j7cnP5zJ+/3aVcE7hCYqvIwAHyE=
|
github.com/containerd/aufs v0.0.0-20200908144142-dab0cbea06f4/go.mod h1:nukgQABAEopAHvB6j7cnP5zJ+/3aVcE7hCYqvIwAHyE=
|
||||||
github.com/containerd/aufs v0.0.0-20201003224125-76a6863f2989/go.mod h1:AkGGQs9NM2vtYHaUen+NljV0/baGCAPELGm2q9ZXpWU=
|
github.com/containerd/aufs v0.0.0-20201003224125-76a6863f2989/go.mod h1:AkGGQs9NM2vtYHaUen+NljV0/baGCAPELGm2q9ZXpWU=
|
||||||
@ -134,6 +145,7 @@ github.com/containerd/containerd v1.5.0-beta.3/go.mod h1:/wr9AVtEM7x9c+n0+stptlo
|
|||||||
github.com/containerd/containerd v1.5.0-beta.4/go.mod h1:GmdgZd2zA2GYIBZ0w09ZvgqEq8EfBp/m3lcVZIvPHhI=
|
github.com/containerd/containerd v1.5.0-beta.4/go.mod h1:GmdgZd2zA2GYIBZ0w09ZvgqEq8EfBp/m3lcVZIvPHhI=
|
||||||
github.com/containerd/containerd v1.5.0-rc.0/go.mod h1:V/IXoMqNGgBlabz3tHD2TWDoTJseu1FGOKuoA4nNb2s=
|
github.com/containerd/containerd v1.5.0-rc.0/go.mod h1:V/IXoMqNGgBlabz3tHD2TWDoTJseu1FGOKuoA4nNb2s=
|
||||||
github.com/containerd/containerd v1.5.1/go.mod h1:0DOxVqwDy2iZvrZp2JUx/E+hS0UNTVn7dJnIOwtYR4g=
|
github.com/containerd/containerd v1.5.1/go.mod h1:0DOxVqwDy2iZvrZp2JUx/E+hS0UNTVn7dJnIOwtYR4g=
|
||||||
|
github.com/containerd/containerd v1.5.7/go.mod h1:gyvv6+ugqY25TiXxcZC3L5yOeYgEw0QMhscqVp1AR9c=
|
||||||
github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y=
|
github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y=
|
||||||
github.com/containerd/continuity v0.0.0-20190815185530-f2a389ac0a02/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y=
|
github.com/containerd/continuity v0.0.0-20190815185530-f2a389ac0a02/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y=
|
||||||
github.com/containerd/continuity v0.0.0-20191127005431-f65d91d395eb/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y=
|
github.com/containerd/continuity v0.0.0-20191127005431-f65d91d395eb/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y=
|
||||||
@ -161,11 +173,13 @@ github.com/containerd/imgcrypt v1.1.1/go.mod h1:xpLnwiQmEUJPvQoAapeb2SNCxz7Xr6PJ
|
|||||||
github.com/containerd/nri v0.0.0-20201007170849-eb1350a75164/go.mod h1:+2wGSDGFYfE5+So4M5syatU0N0f0LbWpuqyMi4/BE8c=
|
github.com/containerd/nri v0.0.0-20201007170849-eb1350a75164/go.mod h1:+2wGSDGFYfE5+So4M5syatU0N0f0LbWpuqyMi4/BE8c=
|
||||||
github.com/containerd/nri v0.0.0-20210316161719-dbaa18c31c14/go.mod h1:lmxnXF6oMkbqs39FiCt1s0R2HSMhcLel9vNL3m4AaeY=
|
github.com/containerd/nri v0.0.0-20210316161719-dbaa18c31c14/go.mod h1:lmxnXF6oMkbqs39FiCt1s0R2HSMhcLel9vNL3m4AaeY=
|
||||||
github.com/containerd/nri v0.1.0/go.mod h1:lmxnXF6oMkbqs39FiCt1s0R2HSMhcLel9vNL3m4AaeY=
|
github.com/containerd/nri v0.1.0/go.mod h1:lmxnXF6oMkbqs39FiCt1s0R2HSMhcLel9vNL3m4AaeY=
|
||||||
|
github.com/containerd/stargz-snapshotter/estargz v0.4.1/go.mod h1:x7Q9dg9QYb4+ELgxmo4gBUeJB0tl5dqH1Sdz0nJU1QM=
|
||||||
github.com/containerd/ttrpc v0.0.0-20190828154514-0e0f228740de/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o=
|
github.com/containerd/ttrpc v0.0.0-20190828154514-0e0f228740de/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o=
|
||||||
github.com/containerd/ttrpc v0.0.0-20190828172938-92c8520ef9f8/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o=
|
github.com/containerd/ttrpc v0.0.0-20190828172938-92c8520ef9f8/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o=
|
||||||
github.com/containerd/ttrpc v0.0.0-20191028202541-4f1b8fe65a5c/go.mod h1:LPm1u0xBw8r8NOKoOdNMeVHSawSsltak+Ihv+etqsE8=
|
github.com/containerd/ttrpc v0.0.0-20191028202541-4f1b8fe65a5c/go.mod h1:LPm1u0xBw8r8NOKoOdNMeVHSawSsltak+Ihv+etqsE8=
|
||||||
github.com/containerd/ttrpc v1.0.1/go.mod h1:UAxOpgT9ziI0gJrmKvgcZivgxOp8iFPSk8httJEt98Y=
|
github.com/containerd/ttrpc v1.0.1/go.mod h1:UAxOpgT9ziI0gJrmKvgcZivgxOp8iFPSk8httJEt98Y=
|
||||||
github.com/containerd/ttrpc v1.0.2/go.mod h1:UAxOpgT9ziI0gJrmKvgcZivgxOp8iFPSk8httJEt98Y=
|
github.com/containerd/ttrpc v1.0.2/go.mod h1:UAxOpgT9ziI0gJrmKvgcZivgxOp8iFPSk8httJEt98Y=
|
||||||
|
github.com/containerd/ttrpc v1.1.0/go.mod h1:XX4ZTnoOId4HklF4edwc4DcqskFZuvXB1Evzy5KFQpQ=
|
||||||
github.com/containerd/typeurl v0.0.0-20180627222232-a93fcdb778cd/go.mod h1:Cm3kwCdlkCfMSHURc+r6fwoGH6/F1hH3S4sg0rLFWPc=
|
github.com/containerd/typeurl v0.0.0-20180627222232-a93fcdb778cd/go.mod h1:Cm3kwCdlkCfMSHURc+r6fwoGH6/F1hH3S4sg0rLFWPc=
|
||||||
github.com/containerd/typeurl v0.0.0-20190911142611-5eb25027c9fd/go.mod h1:GeKYzf2pQcqv7tJ0AoCuuhtnqhva5LNU3U+OyKxxJpk=
|
github.com/containerd/typeurl v0.0.0-20190911142611-5eb25027c9fd/go.mod h1:GeKYzf2pQcqv7tJ0AoCuuhtnqhva5LNU3U+OyKxxJpk=
|
||||||
github.com/containerd/typeurl v1.0.1/go.mod h1:TB1hUtrpaiO88KEK56ijojHS1+NeF0izUACaJW2mdXg=
|
github.com/containerd/typeurl v1.0.1/go.mod h1:TB1hUtrpaiO88KEK56ijojHS1+NeF0izUACaJW2mdXg=
|
||||||
@ -207,6 +221,7 @@ github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfc
|
|||||||
github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
|
github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
|
||||||
github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
|
github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
|
||||||
github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY=
|
github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY=
|
||||||
|
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
|
||||||
github.com/cyphar/filepath-securejoin v0.2.2/go.mod h1:FpkQEhXnPnOthhzymB7CGsFk2G9VLXONKD9G7QGMM+4=
|
github.com/cyphar/filepath-securejoin v0.2.2/go.mod h1:FpkQEhXnPnOthhzymB7CGsFk2G9VLXONKD9G7QGMM+4=
|
||||||
github.com/d2g/dhcp4 v0.0.0-20170904100407-a1d1b6c41b1c h1:Xo2rK1pzOm0jO6abTPIQwbAmqBIOj132otexc1mmzFc=
|
github.com/d2g/dhcp4 v0.0.0-20170904100407-a1d1b6c41b1c h1:Xo2rK1pzOm0jO6abTPIQwbAmqBIOj132otexc1mmzFc=
|
||||||
github.com/d2g/dhcp4 v0.0.0-20170904100407-a1d1b6c41b1c/go.mod h1:Ct2BUK8SB0YC1SMSibvLzxjeJLnrYEVLULFNiHY9YfQ=
|
github.com/d2g/dhcp4 v0.0.0-20170904100407-a1d1b6c41b1c/go.mod h1:Ct2BUK8SB0YC1SMSibvLzxjeJLnrYEVLULFNiHY9YfQ=
|
||||||
@ -224,9 +239,13 @@ github.com/dgrijalva/jwt-go v0.0.0-20170104182250-a601269ab70c/go.mod h1:E3ru+11
|
|||||||
github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
|
github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
|
||||||
github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no=
|
github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no=
|
||||||
github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E=
|
github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E=
|
||||||
|
github.com/docker/cli v0.0.0-20191017083524-a8ff7f821017/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8=
|
||||||
github.com/docker/distribution v0.0.0-20190905152932-14b96e55d84c/go.mod h1:0+TTO4EOBfRPhZXAeF1Vu+W3hHZ8eLp8PgKVZlcvtFY=
|
github.com/docker/distribution v0.0.0-20190905152932-14b96e55d84c/go.mod h1:0+TTO4EOBfRPhZXAeF1Vu+W3hHZ8eLp8PgKVZlcvtFY=
|
||||||
github.com/docker/distribution v2.7.1-0.20190205005809-0d3efadf0154+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w=
|
github.com/docker/distribution v2.7.1-0.20190205005809-0d3efadf0154+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w=
|
||||||
github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w=
|
github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w=
|
||||||
|
github.com/docker/docker v1.4.2-0.20190924003213-a8608b5b67c7/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
|
||||||
|
github.com/docker/docker-credential-helpers v0.6.3/go.mod h1:WRaJzqw3CTB9bk10avuGsjVBZsD05qeibJ1/TYlvc0Y=
|
||||||
|
github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec=
|
||||||
github.com/docker/go-events v0.0.0-20170721190031-9461782956ad/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA=
|
github.com/docker/go-events v0.0.0-20170721190031-9461782956ad/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA=
|
||||||
github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA=
|
github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA=
|
||||||
github.com/docker/go-metrics v0.0.0-20180209012529-399ea8c73916/go.mod h1:/u0gXw0Gay3ceNrsHubL3BtdOL2fHf93USgMTe0W5dI=
|
github.com/docker/go-metrics v0.0.0-20180209012529-399ea8c73916/go.mod h1:/u0gXw0Gay3ceNrsHubL3BtdOL2fHf93USgMTe0W5dI=
|
||||||
@ -243,6 +262,8 @@ github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT
|
|||||||
github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
|
github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
|
||||||
github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
|
github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
|
||||||
github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
|
github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
|
||||||
|
github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
|
||||||
|
github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ=
|
||||||
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
|
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
|
||||||
github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=
|
github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=
|
||||||
github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
|
github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
|
||||||
@ -267,11 +288,15 @@ github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7
|
|||||||
github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU=
|
github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU=
|
||||||
github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0=
|
github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0=
|
||||||
github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
|
github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
|
||||||
|
github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0=
|
||||||
github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg=
|
github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg=
|
||||||
github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=
|
github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=
|
||||||
|
github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg=
|
||||||
github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc=
|
github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc=
|
||||||
github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8=
|
github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8=
|
||||||
|
github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc=
|
||||||
github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo=
|
github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo=
|
||||||
|
github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I=
|
||||||
github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=
|
github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=
|
||||||
github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=
|
github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=
|
||||||
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
|
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
|
||||||
@ -304,6 +329,8 @@ github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfb
|
|||||||
github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=
|
github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=
|
||||||
github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
|
github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
|
||||||
github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
|
github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
|
||||||
|
github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
|
||||||
|
github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=
|
||||||
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/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||||
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||||
@ -332,9 +359,11 @@ github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/
|
|||||||
github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||||
github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||||
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||||
|
github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||||
github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
|
github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
|
||||||
github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
|
github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
|
||||||
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
|
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
|
||||||
|
github.com/google/go-containerregistry v0.5.1/go.mod h1:Ct15B4yir3PLOP5jsy0GNeYVaIZs/MK/Jz5any1wFW0=
|
||||||
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
|
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
|
||||||
github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
|
github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
|
||||||
github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
|
github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
|
||||||
@ -343,6 +372,7 @@ github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OI
|
|||||||
github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
|
github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
|
||||||
github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
|
github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
|
||||||
github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
|
github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
|
||||||
|
github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
|
||||||
github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
|
github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
|
||||||
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
|
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
|
||||||
github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||||
@ -355,6 +385,7 @@ github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3i
|
|||||||
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
|
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
|
||||||
github.com/gorilla/handlers v0.0.0-20150720190736-60c7bfde3e33/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ=
|
github.com/gorilla/handlers v0.0.0-20150720190736-60c7bfde3e33/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ=
|
||||||
github.com/gorilla/mux v1.7.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
|
github.com/gorilla/mux v1.7.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
|
||||||
|
github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
|
||||||
github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
|
github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
|
||||||
github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
|
github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
|
||||||
github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
|
github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
|
||||||
@ -364,6 +395,7 @@ github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de
|
|||||||
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=
|
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=
|
||||||
github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
|
github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
|
||||||
github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
|
github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
|
||||||
|
github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=
|
||||||
github.com/hashicorp/errwrap v0.0.0-20141028054710-7554cd9344ce/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
|
github.com/hashicorp/errwrap v0.0.0-20141028054710-7554cd9344ce/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
|
||||||
github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
|
github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
|
||||||
github.com/hashicorp/go-multierror v0.0.0-20161216184304-ed905158d874/go.mod h1:JMRHfdO9jKNzS/+BTlxCjKNQHg/jZAft8U7LloJvN7I=
|
github.com/hashicorp/go-multierror v0.0.0-20161216184304-ed905158d874/go.mod h1:JMRHfdO9jKNzS/+BTlxCjKNQHg/jZAft8U7LloJvN7I=
|
||||||
@ -378,10 +410,12 @@ github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJ
|
|||||||
github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
|
github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
|
||||||
github.com/imdario/mergo v0.3.10/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA=
|
github.com/imdario/mergo v0.3.10/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA=
|
||||||
github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA=
|
github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA=
|
||||||
|
github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA=
|
||||||
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
|
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
|
||||||
github.com/j-keck/arping v0.0.0-20160618110441-2cf9dc699c56/go.mod h1:ymszkNOg6tORTn+6F6j+Jc8TOr5osrynvN6ivFWZ2GA=
|
github.com/j-keck/arping v0.0.0-20160618110441-2cf9dc699c56/go.mod h1:ymszkNOg6tORTn+6F6j+Jc8TOr5osrynvN6ivFWZ2GA=
|
||||||
github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=
|
github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=
|
||||||
github.com/jmespath/go-jmespath v0.0.0-20160803190731-bd40a432e4c7/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=
|
github.com/jmespath/go-jmespath v0.0.0-20160803190731-bd40a432e4c7/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=
|
||||||
|
github.com/joefitzgerald/rainbow-reporter v0.1.0/go.mod h1:481CNgqmVHQZzdIbN52CupLJyoVwB10FQ/IQlF1pdL8=
|
||||||
github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=
|
github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=
|
||||||
github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
|
github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
|
||||||
github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
|
github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
|
||||||
@ -402,13 +436,15 @@ github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxv
|
|||||||
github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
|
github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
|
||||||
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
|
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
|
||||||
github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
|
github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
|
||||||
github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI=
|
|
||||||
github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
|
github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
|
||||||
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
||||||
github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA=
|
github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA=
|
||||||
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
|
|
||||||
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
||||||
|
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
|
||||||
|
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
|
||||||
|
github.com/linuxkit/virtsock v0.0.0-20201010232012-f8cee7dfc7a3/go.mod h1:3r6x7q95whyfWQpmGZTu3gk3v2YkMi05HEzl7Tf7YEo=
|
||||||
github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
|
github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
|
||||||
|
github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
|
||||||
github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
|
github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
|
||||||
github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
|
github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
|
||||||
github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs=
|
github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs=
|
||||||
@ -417,10 +453,12 @@ github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaO
|
|||||||
github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
|
github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
|
||||||
github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
|
github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
|
||||||
github.com/mattn/go-shellwords v1.0.3/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o=
|
github.com/mattn/go-shellwords v1.0.3/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o=
|
||||||
|
github.com/mattn/go-shellwords v1.0.6/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o=
|
||||||
github.com/mattn/go-shellwords v1.0.12 h1:M2zGm7EW6UQJvDeQxo4T51eKPurbeFbe8WtebGE2xrk=
|
github.com/mattn/go-shellwords v1.0.12 h1:M2zGm7EW6UQJvDeQxo4T51eKPurbeFbe8WtebGE2xrk=
|
||||||
github.com/mattn/go-shellwords v1.0.12/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y=
|
github.com/mattn/go-shellwords v1.0.12/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y=
|
||||||
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
|
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
|
||||||
github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4=
|
github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4=
|
||||||
|
github.com/maxbrunsfeld/counterfeiter/v6 v6.2.2/go.mod h1:eD9eIE7cdwcMi9rYluz88Jz2VyhSmden33/aXg4oVIY=
|
||||||
github.com/miekg/pkcs11 v1.0.3/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs=
|
github.com/miekg/pkcs11 v1.0.3/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs=
|
||||||
github.com/mistifyio/go-zfs v2.1.2-0.20190413222219-f784269be439+incompatible/go.mod h1:8AuVvqP/mXw1px98n46wfvcGfQ4ci2FwoAjKYxuo3Z4=
|
github.com/mistifyio/go-zfs v2.1.2-0.20190413222219-f784269be439+incompatible/go.mod h1:8AuVvqP/mXw1px98n46wfvcGfQ4ci2FwoAjKYxuo3Z4=
|
||||||
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
|
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
|
||||||
@ -435,6 +473,7 @@ github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJ
|
|||||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
|
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
|
||||||
github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
|
github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
|
||||||
github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
|
github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
|
||||||
|
github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc=
|
||||||
github.com/mrunalp/fileutils v0.5.0/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2QJNHXfbSQ=
|
github.com/mrunalp/fileutils v0.5.0/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2QJNHXfbSQ=
|
||||||
github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
|
github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
|
||||||
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
|
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
|
||||||
@ -443,6 +482,8 @@ github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+
|
|||||||
github.com/ncw/swift v1.0.47/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM=
|
github.com/ncw/swift v1.0.47/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM=
|
||||||
github.com/networkplumbing/go-nft v0.2.0 h1:eKapmyVUt/3VGfhYaDos5yeprm+LPt881UeksmKKZHY=
|
github.com/networkplumbing/go-nft v0.2.0 h1:eKapmyVUt/3VGfhYaDos5yeprm+LPt881UeksmKKZHY=
|
||||||
github.com/networkplumbing/go-nft v0.2.0/go.mod h1:HnnM+tYvlGAsMU7yoYwXEVLLiDW9gdMmb5HoGcwpuQs=
|
github.com/networkplumbing/go-nft v0.2.0/go.mod h1:HnnM+tYvlGAsMU7yoYwXEVLLiDW9gdMmb5HoGcwpuQs=
|
||||||
|
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs=
|
||||||
|
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
|
||||||
github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
|
github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
|
||||||
github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE=
|
github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE=
|
||||||
github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU=
|
github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU=
|
||||||
@ -451,9 +492,11 @@ github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:v
|
|||||||
github.com/onsi/ginkgo v0.0.0-20151202141238-7f8ab55aaf3b/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
github.com/onsi/ginkgo v0.0.0-20151202141238-7f8ab55aaf3b/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
||||||
github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
||||||
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
||||||
|
github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
||||||
github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
||||||
github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
||||||
github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
||||||
|
github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg=
|
||||||
github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=
|
github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=
|
||||||
github.com/onsi/ginkgo v1.13.0/go.mod h1:+REjRxOmWfHCjfv9TTWB1jD1Frx4XydAD3zm1lskyM0=
|
github.com/onsi/ginkgo v1.13.0/go.mod h1:+REjRxOmWfHCjfv9TTWB1jD1Frx4XydAD3zm1lskyM0=
|
||||||
github.com/onsi/ginkgo v1.16.4 h1:29JGrr5oVBm5ulCWet69zQkzWipVXIol6ygQUe/EzNc=
|
github.com/onsi/ginkgo v1.16.4 h1:29JGrr5oVBm5ulCWet69zQkzWipVXIol6ygQUe/EzNc=
|
||||||
@ -468,8 +511,10 @@ github.com/onsi/ginkgo/v2 v2.6.1 h1:1xQPCjcqYw/J5LchOcp4/2q/jzJFjiAOc25chhnDw+Q=
|
|||||||
github.com/onsi/ginkgo/v2 v2.6.1/go.mod h1:yjiuMwPokqY1XauOgju45q3sJt6VzQ/Fict1LFVcsAo=
|
github.com/onsi/ginkgo/v2 v2.6.1/go.mod h1:yjiuMwPokqY1XauOgju45q3sJt6VzQ/Fict1LFVcsAo=
|
||||||
github.com/onsi/gomega v0.0.0-20151007035656-2152b45fa28a/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA=
|
github.com/onsi/gomega v0.0.0-20151007035656-2152b45fa28a/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA=
|
||||||
github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA=
|
github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA=
|
||||||
|
github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
|
||||||
github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
|
github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
|
||||||
github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
|
github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
|
||||||
|
github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA=
|
||||||
github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
|
github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
|
||||||
github.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc=
|
github.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc=
|
||||||
github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY=
|
github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY=
|
||||||
@ -493,14 +538,17 @@ github.com/opencontainers/runc v0.1.1/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59P
|
|||||||
github.com/opencontainers/runc v1.0.0-rc8.0.20190926000215-3e425f80a8c9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U=
|
github.com/opencontainers/runc v1.0.0-rc8.0.20190926000215-3e425f80a8c9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U=
|
||||||
github.com/opencontainers/runc v1.0.0-rc9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U=
|
github.com/opencontainers/runc v1.0.0-rc9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U=
|
||||||
github.com/opencontainers/runc v1.0.0-rc93/go.mod h1:3NOsor4w32B2tC0Zbl8Knk4Wg84SM2ImC1fxBuqJ/H0=
|
github.com/opencontainers/runc v1.0.0-rc93/go.mod h1:3NOsor4w32B2tC0Zbl8Knk4Wg84SM2ImC1fxBuqJ/H0=
|
||||||
|
github.com/opencontainers/runc v1.0.2/go.mod h1:aTaHFFwQXuA71CiyxOdFFIorAoemI04suvGRQFzWTD0=
|
||||||
github.com/opencontainers/runtime-spec v0.1.2-0.20190507144316-5b71a03e2700/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=
|
github.com/opencontainers/runtime-spec v0.1.2-0.20190507144316-5b71a03e2700/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=
|
||||||
github.com/opencontainers/runtime-spec v1.0.1/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=
|
github.com/opencontainers/runtime-spec v1.0.1/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=
|
||||||
github.com/opencontainers/runtime-spec v1.0.2-0.20190207185410-29686dbc5559/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=
|
github.com/opencontainers/runtime-spec v1.0.2-0.20190207185410-29686dbc5559/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=
|
||||||
github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=
|
github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=
|
||||||
github.com/opencontainers/runtime-spec v1.0.3-0.20200929063507-e6143ca7d51d/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=
|
github.com/opencontainers/runtime-spec v1.0.3-0.20200929063507-e6143ca7d51d/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=
|
||||||
|
github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=
|
||||||
github.com/opencontainers/runtime-tools v0.0.0-20181011054405-1d69bd0f9c39/go.mod h1:r3f7wjNzSs2extwzU3Y+6pKfobzPh+kKFJ3ofN+3nfs=
|
github.com/opencontainers/runtime-tools v0.0.0-20181011054405-1d69bd0f9c39/go.mod h1:r3f7wjNzSs2extwzU3Y+6pKfobzPh+kKFJ3ofN+3nfs=
|
||||||
github.com/opencontainers/selinux v1.6.0/go.mod h1:VVGKuOLlE7v4PJyT6h7mNWvq1rzqiriPsEqVhc+svHE=
|
github.com/opencontainers/selinux v1.6.0/go.mod h1:VVGKuOLlE7v4PJyT6h7mNWvq1rzqiriPsEqVhc+svHE=
|
||||||
github.com/opencontainers/selinux v1.8.0/go.mod h1:RScLhm78qiWa2gbVCcGkC7tCGdgk3ogry1nUQF8Evvo=
|
github.com/opencontainers/selinux v1.8.0/go.mod h1:RScLhm78qiWa2gbVCcGkC7tCGdgk3ogry1nUQF8Evvo=
|
||||||
|
github.com/opencontainers/selinux v1.8.2/go.mod h1:MUIHuUEvKB1wtJjQdOyYRgOnLD2xAPP8dBsCoU0KuF8=
|
||||||
github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
|
github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
|
||||||
github.com/pelletier/go-toml v1.8.1/go.mod h1:T2/BmBdy8dvIRq1a/8aqjN41wvWlN4lrapLU/GW4pbc=
|
github.com/pelletier/go-toml v1.8.1/go.mod h1:T2/BmBdy8dvIRq1a/8aqjN41wvWlN4lrapLU/GW4pbc=
|
||||||
github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU=
|
github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU=
|
||||||
@ -542,6 +590,7 @@ github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4O
|
|||||||
github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
|
github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
|
||||||
github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU=
|
github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU=
|
||||||
github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=
|
github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=
|
||||||
|
github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
|
||||||
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
|
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
|
||||||
github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
|
github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
|
||||||
github.com/safchain/ethtool v0.0.0-20190326074333-42ed695e3de8/go.mod h1:Z0q5wiBQGYcxhMZ6gUqHn6pYNLypFAvaL3UvgZLR0U4=
|
github.com/safchain/ethtool v0.0.0-20190326074333-42ed695e3de8/go.mod h1:Z0q5wiBQGYcxhMZ6gUqHn6pYNLypFAvaL3UvgZLR0U4=
|
||||||
@ -549,6 +598,7 @@ github.com/safchain/ethtool v0.0.0-20210803160452-9aa261dae9b1 h1:ZFfeKAhIQiiOrQ
|
|||||||
github.com/safchain/ethtool v0.0.0-20210803160452-9aa261dae9b1/go.mod h1:Z0q5wiBQGYcxhMZ6gUqHn6pYNLypFAvaL3UvgZLR0U4=
|
github.com/safchain/ethtool v0.0.0-20210803160452-9aa261dae9b1/go.mod h1:Z0q5wiBQGYcxhMZ6gUqHn6pYNLypFAvaL3UvgZLR0U4=
|
||||||
github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
|
github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
|
||||||
github.com/sclevine/agouti v3.0.0+incompatible/go.mod h1:b4WX9W9L1sfQKXeJf1mUTLZKJ48R1S7H23Ji7oFO5Bw=
|
github.com/sclevine/agouti v3.0.0+incompatible/go.mod h1:b4WX9W9L1sfQKXeJf1mUTLZKJ48R1S7H23Ji7oFO5Bw=
|
||||||
|
github.com/sclevine/spec v1.2.0/go.mod h1:W4J29eT/Kzv7/b9IWLB055Z+qvVC9vt0Arko24q7p+U=
|
||||||
github.com/seccomp/libseccomp-golang v0.9.1/go.mod h1:GbW5+tmTXfcxTToHLXlScSlAvWlF4P2Ca7zGrPiEpWo=
|
github.com/seccomp/libseccomp-golang v0.9.1/go.mod h1:GbW5+tmTXfcxTToHLXlScSlAvWlF4P2Ca7zGrPiEpWo=
|
||||||
github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
|
github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
|
||||||
github.com/sirupsen/logrus v1.0.4-0.20170822132746-89742aefa4b2/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc=
|
github.com/sirupsen/logrus v1.0.4-0.20170822132746-89742aefa4b2/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc=
|
||||||
@ -629,6 +679,7 @@ github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f/go
|
|||||||
go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
|
go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
|
||||||
go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
|
go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
|
||||||
go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ=
|
go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ=
|
||||||
|
go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4=
|
||||||
go.etcd.io/etcd v0.5.0-alpha.5.0.20200910180754-dd1b699fc489/go.mod h1:yVHk9ub3CSBatqGNg7GRmsnfLWtoW60w4eDYfh7vHDg=
|
go.etcd.io/etcd v0.5.0-alpha.5.0.20200910180754-dd1b699fc489/go.mod h1:yVHk9ub3CSBatqGNg7GRmsnfLWtoW60w4eDYfh7vHDg=
|
||||||
go.mozilla.org/pkcs7 v0.0.0-20200128120323-432b2356ecb1/go.mod h1:SNgMg+EgDFwmvSmLRTNKC5fegJjB7v23qTQ0XLGUNHk=
|
go.mozilla.org/pkcs7 v0.0.0-20200128120323-432b2356ecb1/go.mod h1:SNgMg+EgDFwmvSmLRTNKC5fegJjB7v23qTQ0XLGUNHk=
|
||||||
go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
|
go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
|
||||||
@ -636,6 +687,7 @@ go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
|
|||||||
go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
|
go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
|
||||||
go.opencensus.io v0.22.3 h1:8sGtKOrtQqkN1bp2AtX+misvLIlOmsEsNd+9NIcPEm8=
|
go.opencensus.io v0.22.3 h1:8sGtKOrtQqkN1bp2AtX+misvLIlOmsEsNd+9NIcPEm8=
|
||||||
go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
|
go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
|
||||||
|
go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=
|
||||||
go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
|
go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
|
||||||
go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
|
go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
|
||||||
go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
|
go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
|
||||||
@ -707,6 +759,7 @@ golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR
|
|||||||
golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
golang.org/x/net v0.0.0-20190619014844-b5b0513f8c1b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
golang.org/x/net v0.0.0-20190619014844-b5b0513f8c1b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
|
golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
@ -718,8 +771,10 @@ golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLL
|
|||||||
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
|
golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
|
||||||
|
golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
|
||||||
golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
|
golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
|
||||||
golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
|
golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
|
||||||
|
golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
|
||||||
golang.org/x/net v0.0.0-20201006153459-a7d1128ccaa0/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
golang.org/x/net v0.0.0-20201006153459-a7d1128ccaa0/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
||||||
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
||||||
golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
||||||
@ -727,6 +782,7 @@ golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v
|
|||||||
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
|
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
|
||||||
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
|
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
|
||||||
golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk=
|
golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk=
|
||||||
|
golang.org/x/net v0.0.0-20210825183410-e898025ed96a/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||||
golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||||
golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
|
golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
|
||||||
golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
|
golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
|
||||||
@ -747,6 +803,7 @@ golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJ
|
|||||||
golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
|
golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
@ -771,6 +828,7 @@ golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7w
|
|||||||
golang.org/x/sys v0.0.0-20190606203320-7fc4e5ec1444/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20190606203320-7fc4e5ec1444/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20190812073006-9eafafc0a87e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20190812073006-9eafafc0a87e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
@ -797,6 +855,7 @@ golang.org/x/sys v0.0.0-20200217220822-9197077df867/go.mod h1:h1NjWce9XRLGQEsW7w
|
|||||||
golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
@ -805,6 +864,7 @@ golang.org/x/sys v0.0.0-20200817155316-9781c653f443/go.mod h1:h1NjWce9XRLGQEsW7w
|
|||||||
golang.org/x/sys v0.0.0-20200909081042-eff7692f9009/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20200909081042-eff7692f9009/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20200916030750-2334cc1a136f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20200916030750-2334cc1a136f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20200922070232-aee5d888a860/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20200922070232-aee5d888a860/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20201112073958-5cba982894dd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20201112073958-5cba982894dd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20201117170446-d9b008d0a637/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20201117170446-d9b008d0a637/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
@ -816,6 +876,7 @@ golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7w
|
|||||||
golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20210426230700-d19ff857e887/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
@ -848,9 +909,11 @@ golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxb
|
|||||||
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||||
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||||
golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||||
|
golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||||
golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||||
golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||||
|
golang.org/x/tools v0.0.0-20181011042414-1f849cf54d09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||||
golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||||
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||||
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
|
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
|
||||||
@ -866,6 +929,7 @@ golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgw
|
|||||||
golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
|
golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
|
||||||
golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
|
golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
|
||||||
golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
|
golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
|
||||||
|
golang.org/x/tools v0.0.0-20190706070813-72ffa07ba3db/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI=
|
||||||
golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||||
golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||||
golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||||
@ -884,9 +948,14 @@ golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapK
|
|||||||
golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
||||||
golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
||||||
golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
|
golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
|
||||||
|
golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
|
||||||
|
golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
|
||||||
|
golang.org/x/tools v0.0.0-20200616133436-c1934b75d054/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
|
||||||
golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
|
golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
|
||||||
|
golang.org/x/tools v0.0.0-20200916195026-c9a70fc28ce3/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU=
|
||||||
golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
|
golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
|
||||||
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
|
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
|
||||||
|
golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
|
||||||
golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
|
golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
|
||||||
golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E=
|
golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E=
|
||||||
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=
|
||||||
@ -907,11 +976,13 @@ google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsb
|
|||||||
google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
|
google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
|
||||||
google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
|
google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
|
||||||
google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
|
google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
|
||||||
|
google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
|
||||||
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
|
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
|
||||||
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
||||||
google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
||||||
google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=
|
google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=
|
||||||
google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
|
google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
|
||||||
|
google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
|
||||||
google.golang.org/cloud v0.0.0-20151119220103-975617b05ea8/go.mod h1:0H1ncTHf11KCFhTc/+EFRbzSCOZx+VUbRMk55Yv5MYk=
|
google.golang.org/cloud v0.0.0-20151119220103-975617b05ea8/go.mod h1:0H1ncTHf11KCFhTc/+EFRbzSCOZx+VUbRMk55Yv5MYk=
|
||||||
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
|
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
|
||||||
google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
|
google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
|
||||||
@ -933,7 +1004,10 @@ google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4
|
|||||||
google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
|
google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
|
||||||
google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
|
google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
|
||||||
google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
|
google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
|
||||||
|
google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
|
||||||
|
google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
|
||||||
google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
|
google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
|
||||||
|
google.golang.org/genproto v0.0.0-20200527145253-8367513e4ece/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA=
|
||||||
google.golang.org/genproto v0.0.0-20201110150050-8816d57aaa9a/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
google.golang.org/genproto v0.0.0-20201110150050-8816d57aaa9a/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
||||||
google.golang.org/grpc v0.0.0-20160317175043-d3ddb4469d5a/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw=
|
google.golang.org/grpc v0.0.0-20160317175043-d3ddb4469d5a/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw=
|
||||||
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
|
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
|
||||||
@ -947,8 +1021,12 @@ google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQ
|
|||||||
google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
|
google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
|
||||||
google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
|
google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
|
||||||
google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
|
google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
|
||||||
|
google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=
|
||||||
google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
|
google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
|
||||||
|
google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0=
|
||||||
google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc=
|
google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc=
|
||||||
|
google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
|
||||||
|
google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34=
|
||||||
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
|
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
|
||||||
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
|
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
|
||||||
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
|
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
|
||||||
@ -961,6 +1039,7 @@ google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGj
|
|||||||
google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
|
google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
|
||||||
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
|
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
|
||||||
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
|
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
|
||||||
|
google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
|
||||||
google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw=
|
google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw=
|
||||||
google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
|
google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
|
||||||
gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U=
|
gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U=
|
||||||
@ -968,8 +1047,9 @@ gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLks
|
|||||||
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-20141024133853-64131543e789/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
gopkg.in/check.v1 v1.0.0-20141024133853-64131543e789/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo=
|
|
||||||
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
|
gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU=
|
||||||
|
gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw=
|
gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw=
|
||||||
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
|
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
|
||||||
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
|
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
|
||||||
@ -985,6 +1065,7 @@ gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWD
|
|||||||
gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74=
|
gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74=
|
||||||
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||||
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||||
|
gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||||
gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||||
gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||||
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||||
@ -1014,6 +1095,7 @@ k8s.io/apiserver v0.20.6/go.mod h1:QIJXNt6i6JB+0YQRNcS0hdRHJlMhflFmsBDeSgT1r8Q=
|
|||||||
k8s.io/client-go v0.20.1/go.mod h1:/zcHdt1TeWSd5HoUe6elJmHSQ6uLLgp4bIJHVEuy+/Y=
|
k8s.io/client-go v0.20.1/go.mod h1:/zcHdt1TeWSd5HoUe6elJmHSQ6uLLgp4bIJHVEuy+/Y=
|
||||||
k8s.io/client-go v0.20.4/go.mod h1:LiMv25ND1gLUdBeYxBIwKpkSC5IsozMMmOOeSJboP+k=
|
k8s.io/client-go v0.20.4/go.mod h1:LiMv25ND1gLUdBeYxBIwKpkSC5IsozMMmOOeSJboP+k=
|
||||||
k8s.io/client-go v0.20.6/go.mod h1:nNQMnOvEUEsOzRRFIIkdmYOjAZrC8bgq0ExboWSU1I0=
|
k8s.io/client-go v0.20.6/go.mod h1:nNQMnOvEUEsOzRRFIIkdmYOjAZrC8bgq0ExboWSU1I0=
|
||||||
|
k8s.io/code-generator v0.19.7/go.mod h1:lwEq3YnLYb/7uVXLorOJfxg+cUu2oihFhHZ0n9NIla0=
|
||||||
k8s.io/component-base v0.20.1/go.mod h1:guxkoJnNoh8LNrbtiQOlyp2Y2XFCZQmrcg2n/DeYNLk=
|
k8s.io/component-base v0.20.1/go.mod h1:guxkoJnNoh8LNrbtiQOlyp2Y2XFCZQmrcg2n/DeYNLk=
|
||||||
k8s.io/component-base v0.20.4/go.mod h1:t4p9EdiagbVCJKrQ1RsA5/V4rFQNDfRlevJajlGwgjI=
|
k8s.io/component-base v0.20.4/go.mod h1:t4p9EdiagbVCJKrQ1RsA5/V4rFQNDfRlevJajlGwgjI=
|
||||||
k8s.io/component-base v0.20.6/go.mod h1:6f1MPBAeI+mvuts3sIdtpjljHWBQ2cIy38oBIWMYnrM=
|
k8s.io/component-base v0.20.6/go.mod h1:6f1MPBAeI+mvuts3sIdtpjljHWBQ2cIy38oBIWMYnrM=
|
||||||
@ -1022,8 +1104,12 @@ k8s.io/cri-api v0.20.1/go.mod h1:2JRbKt+BFLTjtrILYVqQK5jqhI+XNdF6UiGMgczeBCI=
|
|||||||
k8s.io/cri-api v0.20.4/go.mod h1:2JRbKt+BFLTjtrILYVqQK5jqhI+XNdF6UiGMgczeBCI=
|
k8s.io/cri-api v0.20.4/go.mod h1:2JRbKt+BFLTjtrILYVqQK5jqhI+XNdF6UiGMgczeBCI=
|
||||||
k8s.io/cri-api v0.20.6/go.mod h1:ew44AjNXwyn1s0U4xCKGodU7J1HzBeZ1MpGrpa5r8Yc=
|
k8s.io/cri-api v0.20.6/go.mod h1:ew44AjNXwyn1s0U4xCKGodU7J1HzBeZ1MpGrpa5r8Yc=
|
||||||
k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0=
|
k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0=
|
||||||
|
k8s.io/gengo v0.0.0-20200428234225-8167cfdcfc14/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0=
|
||||||
|
k8s.io/gengo v0.0.0-20201113003025-83324d819ded/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E=
|
||||||
k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE=
|
k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE=
|
||||||
|
k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y=
|
||||||
k8s.io/klog/v2 v2.4.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y=
|
k8s.io/klog/v2 v2.4.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y=
|
||||||
|
k8s.io/kube-openapi v0.0.0-20200805222855-6aeccd4b50c6/go.mod h1:UuqjUnNftUyPE5H64/qeyjQoUZhGpeFDVdxjTeEVN2o=
|
||||||
k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd/go.mod h1:WOJ3KddDSol4tAGcJo0Tvi+dK12EcqSLqcWsryKMpfM=
|
k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd/go.mod h1:WOJ3KddDSol4tAGcJo0Tvi+dK12EcqSLqcWsryKMpfM=
|
||||||
k8s.io/kubernetes v1.13.0/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk=
|
k8s.io/kubernetes v1.13.0/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk=
|
||||||
k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
|
k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
|
||||||
@ -1032,6 +1118,7 @@ rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
|
|||||||
rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
|
rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
|
||||||
sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.14/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg=
|
sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.14/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg=
|
||||||
sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.15/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg=
|
sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.15/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg=
|
||||||
|
sigs.k8s.io/structured-merge-diff/v4 v4.0.1/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw=
|
||||||
sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw=
|
sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw=
|
||||||
sigs.k8s.io/structured-merge-diff/v4 v4.0.3/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw=
|
sigs.k8s.io/structured-merge-diff/v4 v4.0.3/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw=
|
||||||
sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o=
|
sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o=
|
||||||
|
39
vendor/github.com/Microsoft/hcsshim/.gitignore
generated
vendored
39
vendor/github.com/Microsoft/hcsshim/.gitignore
generated
vendored
@ -1,3 +1,38 @@
|
|||||||
|
# Binaries for programs and plugins
|
||||||
*.exe
|
*.exe
|
||||||
.idea
|
*.dll
|
||||||
.vscode
|
*.so
|
||||||
|
*.dylib
|
||||||
|
|
||||||
|
# Ignore vscode setting files
|
||||||
|
.vscode/
|
||||||
|
|
||||||
|
# Test binary, build with `go test -c`
|
||||||
|
*.test
|
||||||
|
|
||||||
|
# Output of the go coverage tool, specifically when used with LiteIDE
|
||||||
|
*.out
|
||||||
|
|
||||||
|
# Project-local glide cache, RE: https://github.com/Masterminds/glide/issues/736
|
||||||
|
.glide/
|
||||||
|
|
||||||
|
# Ignore gcs bin directory
|
||||||
|
service/bin/
|
||||||
|
service/pkg/
|
||||||
|
|
||||||
|
*.img
|
||||||
|
*.vhd
|
||||||
|
*.tar.gz
|
||||||
|
|
||||||
|
# Make stuff
|
||||||
|
.rootfs-done
|
||||||
|
bin/*
|
||||||
|
rootfs/*
|
||||||
|
*.o
|
||||||
|
/build/
|
||||||
|
|
||||||
|
deps/*
|
||||||
|
out/*
|
||||||
|
|
||||||
|
.idea/
|
||||||
|
.vscode/
|
99
vendor/github.com/Microsoft/hcsshim/.golangci.yml
generated
vendored
Normal file
99
vendor/github.com/Microsoft/hcsshim/.golangci.yml
generated
vendored
Normal file
@ -0,0 +1,99 @@
|
|||||||
|
run:
|
||||||
|
timeout: 8m
|
||||||
|
|
||||||
|
linters:
|
||||||
|
enable:
|
||||||
|
- stylecheck
|
||||||
|
|
||||||
|
linters-settings:
|
||||||
|
stylecheck:
|
||||||
|
# https://staticcheck.io/docs/checks
|
||||||
|
checks: ["all"]
|
||||||
|
|
||||||
|
|
||||||
|
issues:
|
||||||
|
# This repo has a LOT of generated schema files, operating system bindings, and other things that ST1003 from stylecheck won't like
|
||||||
|
# (screaming case Windows api constants for example). There's also some structs that we *could* change the initialisms to be Go
|
||||||
|
# friendly (Id -> ID) but they're exported and it would be a breaking change. This makes it so that most new code, code that isn't
|
||||||
|
# supposed to be a pretty faithful mapping to an OS call/constants, or non-generated code still checks if we're following idioms,
|
||||||
|
# while ignoring the things that are just noise or would be more of a hassle than it'd be worth to change.
|
||||||
|
exclude-rules:
|
||||||
|
- path: layer.go
|
||||||
|
linters:
|
||||||
|
- stylecheck
|
||||||
|
Text: "ST1003:"
|
||||||
|
|
||||||
|
- path: hcsshim.go
|
||||||
|
linters:
|
||||||
|
- stylecheck
|
||||||
|
Text: "ST1003:"
|
||||||
|
|
||||||
|
- path: internal\\hcs\\schema2\\
|
||||||
|
linters:
|
||||||
|
- stylecheck
|
||||||
|
Text: "ST1003:"
|
||||||
|
|
||||||
|
- path: internal\\wclayer\\
|
||||||
|
linters:
|
||||||
|
- stylecheck
|
||||||
|
Text: "ST1003:"
|
||||||
|
|
||||||
|
- path: hcn\\
|
||||||
|
linters:
|
||||||
|
- stylecheck
|
||||||
|
Text: "ST1003:"
|
||||||
|
|
||||||
|
- path: internal\\hcs\\schema1\\
|
||||||
|
linters:
|
||||||
|
- stylecheck
|
||||||
|
Text: "ST1003:"
|
||||||
|
|
||||||
|
- path: internal\\hns\\
|
||||||
|
linters:
|
||||||
|
- stylecheck
|
||||||
|
Text: "ST1003:"
|
||||||
|
|
||||||
|
- path: ext4\\internal\\compactext4\\
|
||||||
|
linters:
|
||||||
|
- stylecheck
|
||||||
|
Text: "ST1003:"
|
||||||
|
|
||||||
|
- path: ext4\\internal\\format\\
|
||||||
|
linters:
|
||||||
|
- stylecheck
|
||||||
|
Text: "ST1003:"
|
||||||
|
|
||||||
|
- path: internal\\guestrequest\\
|
||||||
|
linters:
|
||||||
|
- stylecheck
|
||||||
|
Text: "ST1003:"
|
||||||
|
|
||||||
|
- path: internal\\guest\\prot\\
|
||||||
|
linters:
|
||||||
|
- stylecheck
|
||||||
|
Text: "ST1003:"
|
||||||
|
|
||||||
|
- path: internal\\windevice\\
|
||||||
|
linters:
|
||||||
|
- stylecheck
|
||||||
|
Text: "ST1003:"
|
||||||
|
|
||||||
|
- path: internal\\winapi\\
|
||||||
|
linters:
|
||||||
|
- stylecheck
|
||||||
|
Text: "ST1003:"
|
||||||
|
|
||||||
|
- path: internal\\vmcompute\\
|
||||||
|
linters:
|
||||||
|
- stylecheck
|
||||||
|
Text: "ST1003:"
|
||||||
|
|
||||||
|
- path: internal\\regstate\\
|
||||||
|
linters:
|
||||||
|
- stylecheck
|
||||||
|
Text: "ST1003:"
|
||||||
|
|
||||||
|
- path: internal\\hcserror\\
|
||||||
|
linters:
|
||||||
|
- stylecheck
|
||||||
|
Text: "ST1003:"
|
87
vendor/github.com/Microsoft/hcsshim/Makefile
generated
vendored
Normal file
87
vendor/github.com/Microsoft/hcsshim/Makefile
generated
vendored
Normal file
@ -0,0 +1,87 @@
|
|||||||
|
BASE:=base.tar.gz
|
||||||
|
|
||||||
|
GO:=go
|
||||||
|
GO_FLAGS:=-ldflags "-s -w" # strip Go binaries
|
||||||
|
CGO_ENABLED:=0
|
||||||
|
GOMODVENDOR:=
|
||||||
|
|
||||||
|
CFLAGS:=-O2 -Wall
|
||||||
|
LDFLAGS:=-static -s # strip C binaries
|
||||||
|
|
||||||
|
GO_FLAGS_EXTRA:=
|
||||||
|
ifeq "$(GOMODVENDOR)" "1"
|
||||||
|
GO_FLAGS_EXTRA += -mod=vendor
|
||||||
|
endif
|
||||||
|
GO_BUILD:=CGO_ENABLED=$(CGO_ENABLED) $(GO) build $(GO_FLAGS) $(GO_FLAGS_EXTRA)
|
||||||
|
|
||||||
|
SRCROOT=$(dir $(abspath $(firstword $(MAKEFILE_LIST))))
|
||||||
|
|
||||||
|
# The link aliases for gcstools
|
||||||
|
GCS_TOOLS=\
|
||||||
|
generichook
|
||||||
|
|
||||||
|
.PHONY: all always rootfs test
|
||||||
|
|
||||||
|
all: out/initrd.img out/rootfs.tar.gz
|
||||||
|
|
||||||
|
clean:
|
||||||
|
find -name '*.o' -print0 | xargs -0 -r rm
|
||||||
|
rm -rf bin deps rootfs out
|
||||||
|
|
||||||
|
test:
|
||||||
|
cd $(SRCROOT) && go test -v ./internal/guest/...
|
||||||
|
|
||||||
|
out/delta.tar.gz: bin/init bin/vsockexec bin/cmd/gcs bin/cmd/gcstools Makefile
|
||||||
|
@mkdir -p out
|
||||||
|
rm -rf rootfs
|
||||||
|
mkdir -p rootfs/bin/
|
||||||
|
cp bin/init rootfs/
|
||||||
|
cp bin/vsockexec rootfs/bin/
|
||||||
|
cp bin/cmd/gcs rootfs/bin/
|
||||||
|
cp bin/cmd/gcstools rootfs/bin/
|
||||||
|
for tool in $(GCS_TOOLS); do ln -s gcstools rootfs/bin/$$tool; done
|
||||||
|
git -C $(SRCROOT) rev-parse HEAD > rootfs/gcs.commit && \
|
||||||
|
git -C $(SRCROOT) rev-parse --abbrev-ref HEAD > rootfs/gcs.branch
|
||||||
|
tar -zcf $@ -C rootfs .
|
||||||
|
rm -rf rootfs
|
||||||
|
|
||||||
|
out/rootfs.tar.gz: out/initrd.img
|
||||||
|
rm -rf rootfs-conv
|
||||||
|
mkdir rootfs-conv
|
||||||
|
gunzip -c out/initrd.img | (cd rootfs-conv && cpio -imd)
|
||||||
|
tar -zcf $@ -C rootfs-conv .
|
||||||
|
rm -rf rootfs-conv
|
||||||
|
|
||||||
|
out/initrd.img: $(BASE) out/delta.tar.gz $(SRCROOT)/hack/catcpio.sh
|
||||||
|
$(SRCROOT)/hack/catcpio.sh "$(BASE)" out/delta.tar.gz > out/initrd.img.uncompressed
|
||||||
|
gzip -c out/initrd.img.uncompressed > $@
|
||||||
|
rm out/initrd.img.uncompressed
|
||||||
|
|
||||||
|
-include deps/cmd/gcs.gomake
|
||||||
|
-include deps/cmd/gcstools.gomake
|
||||||
|
|
||||||
|
# Implicit rule for includes that define Go targets.
|
||||||
|
%.gomake: $(SRCROOT)/Makefile
|
||||||
|
@mkdir -p $(dir $@)
|
||||||
|
@/bin/echo $(@:deps/%.gomake=bin/%): $(SRCROOT)/hack/gomakedeps.sh > $@.new
|
||||||
|
@/bin/echo -e '\t@mkdir -p $$(dir $$@) $(dir $@)' >> $@.new
|
||||||
|
@/bin/echo -e '\t$$(GO_BUILD) -o $$@.new $$(SRCROOT)/$$(@:bin/%=%)' >> $@.new
|
||||||
|
@/bin/echo -e '\tGO="$(GO)" $$(SRCROOT)/hack/gomakedeps.sh $$@ $$(SRCROOT)/$$(@:bin/%=%) $$(GO_FLAGS) $$(GO_FLAGS_EXTRA) > $(@:%.gomake=%.godeps).new' >> $@.new
|
||||||
|
@/bin/echo -e '\tmv $(@:%.gomake=%.godeps).new $(@:%.gomake=%.godeps)' >> $@.new
|
||||||
|
@/bin/echo -e '\tmv $$@.new $$@' >> $@.new
|
||||||
|
@/bin/echo -e '-include $(@:%.gomake=%.godeps)' >> $@.new
|
||||||
|
mv $@.new $@
|
||||||
|
|
||||||
|
VPATH=$(SRCROOT)
|
||||||
|
|
||||||
|
bin/vsockexec: vsockexec/vsockexec.o vsockexec/vsock.o
|
||||||
|
@mkdir -p bin
|
||||||
|
$(CC) $(LDFLAGS) -o $@ $^
|
||||||
|
|
||||||
|
bin/init: init/init.o vsockexec/vsock.o
|
||||||
|
@mkdir -p bin
|
||||||
|
$(CC) $(LDFLAGS) -o $@ $^
|
||||||
|
|
||||||
|
%.o: %.c
|
||||||
|
@mkdir -p $(dir $@)
|
||||||
|
$(CC) $(CFLAGS) $(CPPFLAGS) -c -o $@ $<
|
80
vendor/github.com/Microsoft/hcsshim/README.md
generated
vendored
80
vendor/github.com/Microsoft/hcsshim/README.md
generated
vendored
@ -2,9 +2,63 @@
|
|||||||
|
|
||||||
[](https://github.com/microsoft/hcsshim/actions?query=branch%3Amaster)
|
[](https://github.com/microsoft/hcsshim/actions?query=branch%3Amaster)
|
||||||
|
|
||||||
This package contains the Golang interface for using the Windows [Host Compute Service](https://techcommunity.microsoft.com/t5/containers/introducing-the-host-compute-service-hcs/ba-p/382332) (HCS) to launch and manage [Windows Containers](https://docs.microsoft.com/en-us/virtualization/windowscontainers/about/). It also contains other helpers and functions for managing Windows Containers such as the Golang interface for the Host Network Service (HNS).
|
This package contains the Golang interface for using the Windows [Host Compute Service](https://techcommunity.microsoft.com/t5/containers/introducing-the-host-compute-service-hcs/ba-p/382332) (HCS) to launch and manage [Windows Containers](https://docs.microsoft.com/en-us/virtualization/windowscontainers/about/). It also contains other helpers and functions for managing Windows Containers such as the Golang interface for the Host Network Service (HNS), as well as code for the [guest agent](./internal/guest/README.md) (commonly referred to as the GCS or Guest Compute Service in the codebase) used to support running Linux Hyper-V containers.
|
||||||
|
|
||||||
It is primarily used in the [Moby Project](https://github.com/moby/moby), but it can be freely used by other projects as well.
|
It is primarily used in the [Moby](https://github.com/moby/moby) and [Containerd](https://github.com/containerd/containerd) projects, but it can be freely used by other projects as well.
|
||||||
|
|
||||||
|
## Building
|
||||||
|
|
||||||
|
While this repository can be used as a library of sorts to call the HCS apis, there are a couple binaries built out of the repository as well. The main ones being the Linux guest agent, and an implementation of the [runtime v2 containerd shim api](https://github.com/containerd/containerd/blob/master/runtime/v2/README.md).
|
||||||
|
### Linux Hyper-V Container Guest Agent
|
||||||
|
|
||||||
|
To build the Linux guest agent itself all that's needed is to set your GOOS to "Linux" and build out of ./cmd/gcs.
|
||||||
|
```powershell
|
||||||
|
C:\> $env:GOOS="linux"
|
||||||
|
C:\> go build .\cmd\gcs\
|
||||||
|
```
|
||||||
|
|
||||||
|
or on a Linux machine
|
||||||
|
```sh
|
||||||
|
> go build ./cmd/gcs
|
||||||
|
```
|
||||||
|
|
||||||
|
If you want it to be packaged inside of a rootfs to boot with alongside all of the other tools then you'll need to provide a rootfs that it can be packaged inside of. An easy way is to export the rootfs of a container.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
docker pull busybox
|
||||||
|
docker run --name base_image_container busybox
|
||||||
|
docker export base_image_container | gzip > base.tar.gz
|
||||||
|
BASE=./base.tar.gz
|
||||||
|
make all
|
||||||
|
```
|
||||||
|
|
||||||
|
If the build is successful, in the `./out` folder you should see:
|
||||||
|
```sh
|
||||||
|
> ls ./out/
|
||||||
|
delta.tar.gz initrd.img rootfs.tar.gz
|
||||||
|
```
|
||||||
|
|
||||||
|
### Containerd Shim
|
||||||
|
For info on the Runtime V2 API: https://github.com/containerd/containerd/blob/master/runtime/v2/README.md.
|
||||||
|
|
||||||
|
Contrary to the typical Linux architecture of shim -> runc, the runhcs shim is used both to launch and manage the lifetime of containers.
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
C:\> $env:GOOS="windows"
|
||||||
|
C:\> go build .\cmd\containerd-shim-runhcs-v1
|
||||||
|
```
|
||||||
|
|
||||||
|
Then place the binary in the same directory that Containerd is located at in your environment. A default Containerd configuration file can be generated by running:
|
||||||
|
```powershell
|
||||||
|
.\containerd.exe config default | Out-File "C:\Program Files\containerd\config.toml" -Encoding ascii
|
||||||
|
```
|
||||||
|
|
||||||
|
This config file will already have the shim set as the default runtime for cri interactions.
|
||||||
|
|
||||||
|
To trial using the shim out with ctr.exe:
|
||||||
|
```powershell
|
||||||
|
C:\> ctr.exe run --runtime io.containerd.runhcs.v1 --rm mcr.microsoft.com/windows/nanoserver:2004 windows-test cmd /c "echo Hello World!"
|
||||||
|
```
|
||||||
|
|
||||||
## Contributing
|
## Contributing
|
||||||
|
|
||||||
@ -16,7 +70,27 @@ When you submit a pull request, a CLA-bot will automatically determine whether y
|
|||||||
a CLA and decorate the PR appropriately (e.g., label, comment). Simply follow the instructions
|
a CLA and decorate the PR appropriately (e.g., label, comment). Simply follow the instructions
|
||||||
provided by the bot. You will only need to do this once across all repos using our CLA.
|
provided by the bot. You will only need to do this once across all repos using our CLA.
|
||||||
|
|
||||||
We also ask that contributors [sign their commits](https://git-scm.com/docs/git-commit) using `git commit -s` or `git commit --signoff` to certify they either authored the work themselves or otherwise have permission to use it in this project.
|
We also require that contributors [sign their commits](https://git-scm.com/docs/git-commit) using `git commit -s` or `git commit --signoff` to
|
||||||
|
certify they either authored the work themselves or otherwise have permission to use it in this project. Please see https://developercertificate.org/ for
|
||||||
|
more info, as well as to make sure that you can attest to the rules listed. Our CI uses the [DCO Github app](https://github.com/apps/dco) to ensure
|
||||||
|
that all commits in a given PR are signed-off.
|
||||||
|
|
||||||
|
### Test Directory (Important to note)
|
||||||
|
|
||||||
|
This project has tried to trim some dependencies from the root Go modules file that would be cumbersome to get transitively included if this
|
||||||
|
project is being vendored/used as a library. Some of these dependencies were only being used for tests, so the /test directory in this project also has
|
||||||
|
its own go.mod file where these are now included to get around this issue. Our tests rely on the code in this project to run, so the test Go modules file
|
||||||
|
has a relative path replace directive to pull in the latest hcsshim code that the tests actually touch from this project
|
||||||
|
(which is the repo itself on your disk).
|
||||||
|
|
||||||
|
```
|
||||||
|
replace (
|
||||||
|
github.com/Microsoft/hcsshim => ../
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
Because of this, for most code changes you may need to run `go mod vendor` + `go mod tidy` in the /test directory in this repository, as the
|
||||||
|
CI in this project will check if the files are out of date and will fail if this is true.
|
||||||
|
|
||||||
|
|
||||||
## Code of Conduct
|
## Code of Conduct
|
||||||
|
91
vendor/github.com/Microsoft/hcsshim/hcn/hcn.go
generated
vendored
91
vendor/github.com/Microsoft/hcsshim/hcn/hcn.go
generated
vendored
@ -122,12 +122,15 @@ func defaultQuery() HostComputeQuery {
|
|||||||
|
|
||||||
// PlatformDoesNotSupportError happens when users are attempting to use a newer shim on an older OS
|
// PlatformDoesNotSupportError happens when users are attempting to use a newer shim on an older OS
|
||||||
func platformDoesNotSupportError(featureName string) error {
|
func platformDoesNotSupportError(featureName string) error {
|
||||||
return fmt.Errorf("Platform does not support feature %s", featureName)
|
return fmt.Errorf("platform does not support feature %s", featureName)
|
||||||
}
|
}
|
||||||
|
|
||||||
// V2ApiSupported returns an error if the HCN version does not support the V2 Apis.
|
// V2ApiSupported returns an error if the HCN version does not support the V2 Apis.
|
||||||
func V2ApiSupported() error {
|
func V2ApiSupported() error {
|
||||||
supported := GetSupportedFeatures()
|
supported, err := GetCachedSupportedFeatures()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
if supported.Api.V2 {
|
if supported.Api.V2 {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@ -143,7 +146,10 @@ func V2SchemaVersion() SchemaVersion {
|
|||||||
|
|
||||||
// RemoteSubnetSupported returns an error if the HCN version does not support Remote Subnet policies.
|
// RemoteSubnetSupported returns an error if the HCN version does not support Remote Subnet policies.
|
||||||
func RemoteSubnetSupported() error {
|
func RemoteSubnetSupported() error {
|
||||||
supported := GetSupportedFeatures()
|
supported, err := GetCachedSupportedFeatures()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
if supported.RemoteSubnet {
|
if supported.RemoteSubnet {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@ -152,7 +158,10 @@ func RemoteSubnetSupported() error {
|
|||||||
|
|
||||||
// HostRouteSupported returns an error if the HCN version does not support Host Route policies.
|
// HostRouteSupported returns an error if the HCN version does not support Host Route policies.
|
||||||
func HostRouteSupported() error {
|
func HostRouteSupported() error {
|
||||||
supported := GetSupportedFeatures()
|
supported, err := GetCachedSupportedFeatures()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
if supported.HostRoute {
|
if supported.HostRoute {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@ -161,7 +170,10 @@ func HostRouteSupported() error {
|
|||||||
|
|
||||||
// DSRSupported returns an error if the HCN version does not support Direct Server Return.
|
// DSRSupported returns an error if the HCN version does not support Direct Server Return.
|
||||||
func DSRSupported() error {
|
func DSRSupported() error {
|
||||||
supported := GetSupportedFeatures()
|
supported, err := GetCachedSupportedFeatures()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
if supported.DSR {
|
if supported.DSR {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@ -170,7 +182,10 @@ func DSRSupported() error {
|
|||||||
|
|
||||||
// Slash32EndpointPrefixesSupported returns an error if the HCN version does not support configuring endpoints with /32 prefixes.
|
// Slash32EndpointPrefixesSupported returns an error if the HCN version does not support configuring endpoints with /32 prefixes.
|
||||||
func Slash32EndpointPrefixesSupported() error {
|
func Slash32EndpointPrefixesSupported() error {
|
||||||
supported := GetSupportedFeatures()
|
supported, err := GetCachedSupportedFeatures()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
if supported.Slash32EndpointPrefixes {
|
if supported.Slash32EndpointPrefixes {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@ -179,7 +194,10 @@ func Slash32EndpointPrefixesSupported() error {
|
|||||||
|
|
||||||
// AclSupportForProtocol252Supported returns an error if the HCN version does not support HNS ACL Policies to support protocol 252 for VXLAN.
|
// AclSupportForProtocol252Supported returns an error if the HCN version does not support HNS ACL Policies to support protocol 252 for VXLAN.
|
||||||
func AclSupportForProtocol252Supported() error {
|
func AclSupportForProtocol252Supported() error {
|
||||||
supported := GetSupportedFeatures()
|
supported, err := GetCachedSupportedFeatures()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
if supported.AclSupportForProtocol252 {
|
if supported.AclSupportForProtocol252 {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@ -188,7 +206,10 @@ func AclSupportForProtocol252Supported() error {
|
|||||||
|
|
||||||
// SessionAffinitySupported returns an error if the HCN version does not support Session Affinity.
|
// SessionAffinitySupported returns an error if the HCN version does not support Session Affinity.
|
||||||
func SessionAffinitySupported() error {
|
func SessionAffinitySupported() error {
|
||||||
supported := GetSupportedFeatures()
|
supported, err := GetCachedSupportedFeatures()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
if supported.SessionAffinity {
|
if supported.SessionAffinity {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@ -197,7 +218,10 @@ func SessionAffinitySupported() error {
|
|||||||
|
|
||||||
// IPv6DualStackSupported returns an error if the HCN version does not support IPv6DualStack.
|
// IPv6DualStackSupported returns an error if the HCN version does not support IPv6DualStack.
|
||||||
func IPv6DualStackSupported() error {
|
func IPv6DualStackSupported() error {
|
||||||
supported := GetSupportedFeatures()
|
supported, err := GetCachedSupportedFeatures()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
if supported.IPv6DualStack {
|
if supported.IPv6DualStack {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@ -206,7 +230,10 @@ func IPv6DualStackSupported() error {
|
|||||||
|
|
||||||
//L4proxySupported returns an error if the HCN verison does not support L4Proxy
|
//L4proxySupported returns an error if the HCN verison does not support L4Proxy
|
||||||
func L4proxyPolicySupported() error {
|
func L4proxyPolicySupported() error {
|
||||||
supported := GetSupportedFeatures()
|
supported, err := GetCachedSupportedFeatures()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
if supported.L4Proxy {
|
if supported.L4Proxy {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@ -215,7 +242,10 @@ func L4proxyPolicySupported() error {
|
|||||||
|
|
||||||
// L4WfpProxySupported returns an error if the HCN verison does not support L4WfpProxy
|
// L4WfpProxySupported returns an error if the HCN verison does not support L4WfpProxy
|
||||||
func L4WfpProxyPolicySupported() error {
|
func L4WfpProxyPolicySupported() error {
|
||||||
supported := GetSupportedFeatures()
|
supported, err := GetCachedSupportedFeatures()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
if supported.L4WfpProxy {
|
if supported.L4WfpProxy {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@ -224,7 +254,10 @@ func L4WfpProxyPolicySupported() error {
|
|||||||
|
|
||||||
// SetPolicySupported returns an error if the HCN version does not support SetPolicy.
|
// SetPolicySupported returns an error if the HCN version does not support SetPolicy.
|
||||||
func SetPolicySupported() error {
|
func SetPolicySupported() error {
|
||||||
supported := GetSupportedFeatures()
|
supported, err := GetCachedSupportedFeatures()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
if supported.SetPolicy {
|
if supported.SetPolicy {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@ -233,7 +266,10 @@ func SetPolicySupported() error {
|
|||||||
|
|
||||||
// VxlanPortSupported returns an error if the HCN version does not support configuring the VXLAN TCP port.
|
// VxlanPortSupported returns an error if the HCN version does not support configuring the VXLAN TCP port.
|
||||||
func VxlanPortSupported() error {
|
func VxlanPortSupported() error {
|
||||||
supported := GetSupportedFeatures()
|
supported, err := GetCachedSupportedFeatures()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
if supported.VxlanPort {
|
if supported.VxlanPort {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@ -242,13 +278,40 @@ func VxlanPortSupported() error {
|
|||||||
|
|
||||||
// TierAclPolicySupported returns an error if the HCN version does not support configuring the TierAcl.
|
// TierAclPolicySupported returns an error if the HCN version does not support configuring the TierAcl.
|
||||||
func TierAclPolicySupported() error {
|
func TierAclPolicySupported() error {
|
||||||
supported := GetSupportedFeatures()
|
supported, err := GetCachedSupportedFeatures()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
if supported.TierAcl {
|
if supported.TierAcl {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
return platformDoesNotSupportError("TierAcl")
|
return platformDoesNotSupportError("TierAcl")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NetworkACLPolicySupported returns an error if the HCN version does not support NetworkACLPolicy
|
||||||
|
func NetworkACLPolicySupported() error {
|
||||||
|
supported, err := GetCachedSupportedFeatures()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if supported.NetworkACL {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return platformDoesNotSupportError("NetworkACL")
|
||||||
|
}
|
||||||
|
|
||||||
|
// NestedIpSetSupported returns an error if the HCN version does not support NestedIpSet
|
||||||
|
func NestedIpSetSupported() error {
|
||||||
|
supported, err := GetCachedSupportedFeatures()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if supported.NestedIpSet {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return platformDoesNotSupportError("NestedIpSet")
|
||||||
|
}
|
||||||
|
|
||||||
// RequestType are the different operations performed to settings.
|
// RequestType are the different operations performed to settings.
|
||||||
// Used to update the settings of Endpoint/Namespace objects.
|
// Used to update the settings of Endpoint/Namespace objects.
|
||||||
type RequestType string
|
type RequestType string
|
||||||
|
6
vendor/github.com/Microsoft/hcsshim/hcn/hcnglobals.go
generated
vendored
6
vendor/github.com/Microsoft/hcsshim/hcn/hcnglobals.go
generated
vendored
@ -76,6 +76,12 @@ var (
|
|||||||
|
|
||||||
//HNS 14.0 allows for TierAcl Policy support
|
//HNS 14.0 allows for TierAcl Policy support
|
||||||
TierAclPolicyVersion = VersionRanges{VersionRange{MinVersion: Version{Major: 14, Minor: 0}, MaxVersion: Version{Major: math.MaxInt32, Minor: math.MaxInt32}}}
|
TierAclPolicyVersion = VersionRanges{VersionRange{MinVersion: Version{Major: 14, Minor: 0}, MaxVersion: Version{Major: math.MaxInt32, Minor: math.MaxInt32}}}
|
||||||
|
|
||||||
|
//HNS 15.0 allows for NetworkACL Policy support
|
||||||
|
NetworkACLPolicyVersion = VersionRanges{VersionRange{MinVersion: Version{Major: 15, Minor: 0}, MaxVersion: Version{Major: math.MaxInt32, Minor: math.MaxInt32}}}
|
||||||
|
|
||||||
|
//HNS 15.0 allows for NestedIpSet support
|
||||||
|
NestedIpSetVersion = VersionRanges{VersionRange{MinVersion: Version{Major: 15, Minor: 0}, MaxVersion: Version{Major: math.MaxInt32, Minor: math.MaxInt32}}}
|
||||||
)
|
)
|
||||||
|
|
||||||
// GetGlobals returns the global properties of the HCN Service.
|
// GetGlobals returns the global properties of the HCN Service.
|
||||||
|
15
vendor/github.com/Microsoft/hcsshim/hcn/hcnpolicy.go
generated
vendored
15
vendor/github.com/Microsoft/hcsshim/hcn/hcnpolicy.go
generated
vendored
@ -50,6 +50,7 @@ const (
|
|||||||
SetPolicy NetworkPolicyType = "SetPolicy"
|
SetPolicy NetworkPolicyType = "SetPolicy"
|
||||||
NetworkL4Proxy NetworkPolicyType = "L4Proxy"
|
NetworkL4Proxy NetworkPolicyType = "L4Proxy"
|
||||||
LayerConstraint NetworkPolicyType = "LayerConstraint"
|
LayerConstraint NetworkPolicyType = "LayerConstraint"
|
||||||
|
NetworkACL NetworkPolicyType = "NetworkACL"
|
||||||
)
|
)
|
||||||
|
|
||||||
// NetworkPolicy is a collection of Policy settings for a Network.
|
// NetworkPolicy is a collection of Policy settings for a Network.
|
||||||
@ -154,6 +155,19 @@ type SDNRoutePolicySetting struct {
|
|||||||
NeedEncap bool `json:",omitempty"`
|
NeedEncap bool `json:",omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NetworkACLPolicySetting creates ACL rules on a network
|
||||||
|
type NetworkACLPolicySetting struct {
|
||||||
|
Protocols string `json:",omitempty"` // EX: 6 (TCP), 17 (UDP), 1 (ICMPv4), 58 (ICMPv6), 2 (IGMP)
|
||||||
|
Action ActionType `json:","`
|
||||||
|
Direction DirectionType `json:","`
|
||||||
|
LocalAddresses string `json:",omitempty"`
|
||||||
|
RemoteAddresses string `json:",omitempty"`
|
||||||
|
LocalPorts string `json:",omitempty"`
|
||||||
|
RemotePorts string `json:",omitempty"`
|
||||||
|
RuleType RuleType `json:",omitempty"`
|
||||||
|
Priority uint16 `json:",omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
// FiveTuple is nested in L4ProxyPolicySetting for WFP support.
|
// FiveTuple is nested in L4ProxyPolicySetting for WFP support.
|
||||||
type FiveTuple struct {
|
type FiveTuple struct {
|
||||||
Protocols string `json:",omitempty"`
|
Protocols string `json:",omitempty"`
|
||||||
@ -271,6 +285,7 @@ type SetPolicyType string
|
|||||||
|
|
||||||
const (
|
const (
|
||||||
SetPolicyTypeIpSet SetPolicyType = "IPSET"
|
SetPolicyTypeIpSet SetPolicyType = "IPSET"
|
||||||
|
SetPolicyTypeNestedIpSet SetPolicyType = "NESTEDIPSET"
|
||||||
)
|
)
|
||||||
|
|
||||||
// SetPolicySetting creates IPSets on network
|
// SetPolicySetting creates IPSets on network
|
||||||
|
2
vendor/github.com/Microsoft/hcsshim/hcn/hcnroute.go
generated
vendored
2
vendor/github.com/Microsoft/hcsshim/hcn/hcnroute.go
generated
vendored
@ -137,7 +137,7 @@ func AddRoute(endpoints []HostComputeEndpoint, destinationPrefix string, nextHop
|
|||||||
logrus.Debugf("hcn::HostComputeRoute::AddRoute endpointId=%v, destinationPrefix=%v, nextHop=%v, needEncapsulation=%v", endpoints, destinationPrefix, nextHop, needEncapsulation)
|
logrus.Debugf("hcn::HostComputeRoute::AddRoute endpointId=%v, destinationPrefix=%v, nextHop=%v, needEncapsulation=%v", endpoints, destinationPrefix, nextHop, needEncapsulation)
|
||||||
|
|
||||||
if len(endpoints) <= 0 {
|
if len(endpoints) <= 0 {
|
||||||
return nil, errors.New("Missing endpoints")
|
return nil, errors.New("missing endpoints")
|
||||||
}
|
}
|
||||||
|
|
||||||
route := &HostComputeRoute{
|
route := &HostComputeRoute{
|
||||||
|
61
vendor/github.com/Microsoft/hcsshim/hcn/hcnsupport.go
generated
vendored
61
vendor/github.com/Microsoft/hcsshim/hcn/hcnsupport.go
generated
vendored
@ -1,9 +1,21 @@
|
|||||||
package hcn
|
package hcn
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
|
"sync"
|
||||||
|
|
||||||
|
"github.com/pkg/errors"
|
||||||
"github.com/sirupsen/logrus"
|
"github.com/sirupsen/logrus"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
// featuresOnce handles assigning the supported features and printing the supported info to stdout only once to avoid unnecessary work
|
||||||
|
// multiple times.
|
||||||
|
featuresOnce sync.Once
|
||||||
|
featuresErr error
|
||||||
|
supportedFeatures SupportedFeatures
|
||||||
|
)
|
||||||
|
|
||||||
// SupportedFeatures are the features provided by the Service.
|
// SupportedFeatures are the features provided by the Service.
|
||||||
type SupportedFeatures struct {
|
type SupportedFeatures struct {
|
||||||
Acl AclFeatures `json:"ACL"`
|
Acl AclFeatures `json:"ACL"`
|
||||||
@ -20,6 +32,8 @@ type SupportedFeatures struct {
|
|||||||
L4Proxy bool `json:"L4Proxy"` // network policy that applies VFP rules to all endpoints on the network to redirect traffic
|
L4Proxy bool `json:"L4Proxy"` // network policy that applies VFP rules to all endpoints on the network to redirect traffic
|
||||||
L4WfpProxy bool `json:"L4WfpProxy"` // endpoint policy that applies WFP filters to redirect traffic to/from that endpoint
|
L4WfpProxy bool `json:"L4WfpProxy"` // endpoint policy that applies WFP filters to redirect traffic to/from that endpoint
|
||||||
TierAcl bool `json:"TierAcl"`
|
TierAcl bool `json:"TierAcl"`
|
||||||
|
NetworkACL bool `json:"NetworkACL"`
|
||||||
|
NestedIpSet bool `json:"NestedIpSet"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// AclFeatures are the supported ACL possibilities.
|
// AclFeatures are the supported ACL possibilities.
|
||||||
@ -36,17 +50,41 @@ type ApiSupport struct {
|
|||||||
V2 bool `json:"V2"`
|
V2 bool `json:"V2"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetSupportedFeatures returns the features supported by the Service.
|
// GetCachedSupportedFeatures returns the features supported by the Service and an error if the query failed. If this has been called
|
||||||
func GetSupportedFeatures() SupportedFeatures {
|
// before it will return the supported features and error received from the first call. This can be used to optimize if many calls to the
|
||||||
var features SupportedFeatures
|
// various hcn.IsXSupported methods need to be made.
|
||||||
|
func GetCachedSupportedFeatures() (SupportedFeatures, error) {
|
||||||
|
// Only query the HCN version and features supported once, instead of everytime this is invoked. The logs are useful to
|
||||||
|
// debug incidents where there's confusion on if a feature is supported on the host machine. The sync.Once helps to avoid redundant
|
||||||
|
// spam of these anytime a check needs to be made for if an HCN feature is supported. This is a common occurrence in kube-proxy
|
||||||
|
// for example.
|
||||||
|
featuresOnce.Do(func() {
|
||||||
|
supportedFeatures, featuresErr = getSupportedFeatures()
|
||||||
|
})
|
||||||
|
|
||||||
globals, err := GetGlobals()
|
return supportedFeatures, featuresErr
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetSupportedFeatures returns the features supported by the Service.
|
||||||
|
//
|
||||||
|
// Deprecated: Use GetCachedSupportedFeatures instead.
|
||||||
|
func GetSupportedFeatures() SupportedFeatures {
|
||||||
|
features, err := GetCachedSupportedFeatures()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
// Expected on pre-1803 builds, all features will be false/unsupported
|
// Expected on pre-1803 builds, all features will be false/unsupported
|
||||||
logrus.Debugf("Unable to obtain globals: %s", err)
|
logrus.WithError(err).Errorf("unable to obtain supported features")
|
||||||
|
return features
|
||||||
|
}
|
||||||
return features
|
return features
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func getSupportedFeatures() (SupportedFeatures, error) {
|
||||||
|
var features SupportedFeatures
|
||||||
|
globals, err := GetGlobals()
|
||||||
|
if err != nil {
|
||||||
|
// It's expected if this fails once, it should always fail. It should fail on pre 1803 builds for example.
|
||||||
|
return SupportedFeatures{}, errors.Wrap(err, "failed to query HCN version number: this is expected on pre 1803 builds.")
|
||||||
|
}
|
||||||
features.Acl = AclFeatures{
|
features.Acl = AclFeatures{
|
||||||
AclAddressLists: isFeatureSupported(globals.Version, HNSVersion1803),
|
AclAddressLists: isFeatureSupported(globals.Version, HNSVersion1803),
|
||||||
AclNoHostRulePriority: isFeatureSupported(globals.Version, HNSVersion1803),
|
AclNoHostRulePriority: isFeatureSupported(globals.Version, HNSVersion1803),
|
||||||
@ -71,8 +109,15 @@ func GetSupportedFeatures() SupportedFeatures {
|
|||||||
features.L4Proxy = isFeatureSupported(globals.Version, L4ProxyPolicyVersion)
|
features.L4Proxy = isFeatureSupported(globals.Version, L4ProxyPolicyVersion)
|
||||||
features.L4WfpProxy = isFeatureSupported(globals.Version, L4WfpProxyPolicyVersion)
|
features.L4WfpProxy = isFeatureSupported(globals.Version, L4WfpProxyPolicyVersion)
|
||||||
features.TierAcl = isFeatureSupported(globals.Version, TierAclPolicyVersion)
|
features.TierAcl = isFeatureSupported(globals.Version, TierAclPolicyVersion)
|
||||||
|
features.NetworkACL = isFeatureSupported(globals.Version, NetworkACLPolicyVersion)
|
||||||
|
features.NestedIpSet = isFeatureSupported(globals.Version, NestedIpSetVersion)
|
||||||
|
|
||||||
return features
|
logrus.WithFields(logrus.Fields{
|
||||||
|
"version": fmt.Sprintf("%+v", globals.Version),
|
||||||
|
"supportedFeatures": fmt.Sprintf("%+v", features),
|
||||||
|
}).Info("HCN feature check")
|
||||||
|
|
||||||
|
return features, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func isFeatureSupported(currentVersion Version, versionsSupported VersionRanges) bool {
|
func isFeatureSupported(currentVersion Version, versionsSupported VersionRanges) bool {
|
||||||
@ -87,19 +132,15 @@ func isFeatureSupported(currentVersion Version, versionsSupported VersionRanges)
|
|||||||
|
|
||||||
func isFeatureInRange(currentVersion Version, versionRange VersionRange) bool {
|
func isFeatureInRange(currentVersion Version, versionRange VersionRange) bool {
|
||||||
if currentVersion.Major < versionRange.MinVersion.Major {
|
if currentVersion.Major < versionRange.MinVersion.Major {
|
||||||
logrus.Infof("currentVersion.Major < versionRange.MinVersion.Major: %v, %v", currentVersion.Major, versionRange.MinVersion.Major)
|
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
if currentVersion.Major > versionRange.MaxVersion.Major {
|
if currentVersion.Major > versionRange.MaxVersion.Major {
|
||||||
logrus.Infof("currentVersion.Major > versionRange.MaxVersion.Major: %v, %v", currentVersion.Major, versionRange.MaxVersion.Major)
|
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
if currentVersion.Major == versionRange.MinVersion.Major && currentVersion.Minor < versionRange.MinVersion.Minor {
|
if currentVersion.Major == versionRange.MinVersion.Major && currentVersion.Minor < versionRange.MinVersion.Minor {
|
||||||
logrus.Infof("currentVersion.Minor < versionRange.MinVersion.Major: %v, %v", currentVersion.Minor, versionRange.MinVersion.Minor)
|
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
if currentVersion.Major == versionRange.MaxVersion.Major && currentVersion.Minor > versionRange.MaxVersion.Minor {
|
if currentVersion.Major == versionRange.MaxVersion.Major && currentVersion.Minor > versionRange.MaxVersion.Minor {
|
||||||
logrus.Infof("currentVersion.Minor > versionRange.MaxVersion.Major: %v, %v", currentVersion.Minor, versionRange.MaxVersion.Minor)
|
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
return true
|
return true
|
||||||
|
8
vendor/github.com/Microsoft/hcsshim/hnsendpoint.go
generated
vendored
8
vendor/github.com/Microsoft/hcsshim/hnsendpoint.go
generated
vendored
@ -7,6 +7,9 @@ import (
|
|||||||
// HNSEndpoint represents a network endpoint in HNS
|
// HNSEndpoint represents a network endpoint in HNS
|
||||||
type HNSEndpoint = hns.HNSEndpoint
|
type HNSEndpoint = hns.HNSEndpoint
|
||||||
|
|
||||||
|
// HNSEndpointStats represent the stats for an networkendpoint in HNS
|
||||||
|
type HNSEndpointStats = hns.EndpointStats
|
||||||
|
|
||||||
// Namespace represents a Compartment.
|
// Namespace represents a Compartment.
|
||||||
type Namespace = hns.Namespace
|
type Namespace = hns.Namespace
|
||||||
|
|
||||||
@ -108,3 +111,8 @@ func GetHNSEndpointByID(endpointID string) (*HNSEndpoint, error) {
|
|||||||
func GetHNSEndpointByName(endpointName string) (*HNSEndpoint, error) {
|
func GetHNSEndpointByName(endpointName string) (*HNSEndpoint, error) {
|
||||||
return hns.GetHNSEndpointByName(endpointName)
|
return hns.GetHNSEndpointByName(endpointName)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetHNSEndpointStats gets the endpoint stats by ID
|
||||||
|
func GetHNSEndpointStats(endpointName string) (*HNSEndpointStats, error) {
|
||||||
|
return hns.GetHNSEndpointStats(endpointName)
|
||||||
|
}
|
||||||
|
6
vendor/github.com/Microsoft/hcsshim/internal/cow/cow.go
generated
vendored
6
vendor/github.com/Microsoft/hcsshim/internal/cow/cow.go
generated
vendored
@ -86,6 +86,12 @@ type Container interface {
|
|||||||
// container to be terminated by some error condition (including calling
|
// container to be terminated by some error condition (including calling
|
||||||
// Close).
|
// Close).
|
||||||
Wait() error
|
Wait() error
|
||||||
|
// WaitChannel returns the wait channel of the container
|
||||||
|
WaitChannel() <-chan struct{}
|
||||||
|
// WaitError returns the container termination error.
|
||||||
|
// This function should only be called after the channel in WaitChannel()
|
||||||
|
// is closed. Otherwise it is not thread safe.
|
||||||
|
WaitError() error
|
||||||
// Modify sends a request to modify container resources
|
// Modify sends a request to modify container resources
|
||||||
Modify(ctx context.Context, config interface{}) error
|
Modify(ctx context.Context, config interface{}) error
|
||||||
}
|
}
|
||||||
|
22
vendor/github.com/Microsoft/hcsshim/internal/hcs/errors.go
generated
vendored
22
vendor/github.com/Microsoft/hcsshim/internal/hcs/errors.go
generated
vendored
@ -78,6 +78,13 @@ var (
|
|||||||
|
|
||||||
// ErrNotSupported is an error encountered when hcs doesn't support the request
|
// ErrNotSupported is an error encountered when hcs doesn't support the request
|
||||||
ErrPlatformNotSupported = errors.New("unsupported platform request")
|
ErrPlatformNotSupported = errors.New("unsupported platform request")
|
||||||
|
|
||||||
|
// ErrProcessAlreadyStopped is returned by hcs if the process we're trying to kill has already been stopped.
|
||||||
|
ErrProcessAlreadyStopped = syscall.Errno(0x8037011f)
|
||||||
|
|
||||||
|
// ErrInvalidHandle is an error that can be encountrered when querying the properties of a compute system when the handle to that
|
||||||
|
// compute system has already been closed.
|
||||||
|
ErrInvalidHandle = syscall.Errno(0x6)
|
||||||
)
|
)
|
||||||
|
|
||||||
type ErrorEvent struct {
|
type ErrorEvent struct {
|
||||||
@ -147,7 +154,7 @@ func (e *HcsError) Error() string {
|
|||||||
|
|
||||||
func (e *HcsError) Temporary() bool {
|
func (e *HcsError) Temporary() bool {
|
||||||
err, ok := e.Err.(net.Error)
|
err, ok := e.Err.(net.Error)
|
||||||
return ok && err.Temporary()
|
return ok && err.Temporary() //nolint:staticcheck
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *HcsError) Timeout() bool {
|
func (e *HcsError) Timeout() bool {
|
||||||
@ -186,7 +193,7 @@ func (e *SystemError) Error() string {
|
|||||||
|
|
||||||
func (e *SystemError) Temporary() bool {
|
func (e *SystemError) Temporary() bool {
|
||||||
err, ok := e.Err.(net.Error)
|
err, ok := e.Err.(net.Error)
|
||||||
return ok && err.Temporary()
|
return ok && err.Temporary() //nolint:staticcheck
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *SystemError) Timeout() bool {
|
func (e *SystemError) Timeout() bool {
|
||||||
@ -217,7 +224,7 @@ func (e *ProcessError) Error() string {
|
|||||||
|
|
||||||
func (e *ProcessError) Temporary() bool {
|
func (e *ProcessError) Temporary() bool {
|
||||||
err, ok := e.Err.(net.Error)
|
err, ok := e.Err.(net.Error)
|
||||||
return ok && err.Temporary()
|
return ok && err.Temporary() //nolint:staticcheck
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *ProcessError) Timeout() bool {
|
func (e *ProcessError) Timeout() bool {
|
||||||
@ -249,6 +256,14 @@ func IsNotExist(err error) bool {
|
|||||||
err == ErrElementNotFound
|
err == ErrElementNotFound
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// IsErrorInvalidHandle checks whether the error is the result of an operation carried
|
||||||
|
// out on a handle that is invalid/closed. This error popped up while trying to query
|
||||||
|
// stats on a container in the process of being stopped.
|
||||||
|
func IsErrorInvalidHandle(err error) bool {
|
||||||
|
err = getInnerError(err)
|
||||||
|
return err == ErrInvalidHandle
|
||||||
|
}
|
||||||
|
|
||||||
// IsAlreadyClosed checks if an error is caused by the Container or Process having been
|
// IsAlreadyClosed checks if an error is caused by the Container or Process having been
|
||||||
// already closed by a call to the Close() method.
|
// already closed by a call to the Close() method.
|
||||||
func IsAlreadyClosed(err error) bool {
|
func IsAlreadyClosed(err error) bool {
|
||||||
@ -281,6 +296,7 @@ func IsTimeout(err error) bool {
|
|||||||
func IsAlreadyStopped(err error) bool {
|
func IsAlreadyStopped(err error) bool {
|
||||||
err = getInnerError(err)
|
err = getInnerError(err)
|
||||||
return err == ErrVmcomputeAlreadyStopped ||
|
return err == ErrVmcomputeAlreadyStopped ||
|
||||||
|
err == ErrProcessAlreadyStopped ||
|
||||||
err == ErrElementNotFound
|
err == ErrElementNotFound
|
||||||
}
|
}
|
||||||
|
|
||||||
|
36
vendor/github.com/Microsoft/hcsshim/internal/hcs/process.go
generated
vendored
36
vendor/github.com/Microsoft/hcsshim/internal/hcs/process.go
generated
vendored
@ -3,7 +3,9 @@ package hcs
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
"errors"
|
||||||
"io"
|
"io"
|
||||||
|
"os"
|
||||||
"sync"
|
"sync"
|
||||||
"syscall"
|
"syscall"
|
||||||
"time"
|
"time"
|
||||||
@ -26,6 +28,7 @@ type Process struct {
|
|||||||
stdout io.ReadCloser
|
stdout io.ReadCloser
|
||||||
stderr io.ReadCloser
|
stderr io.ReadCloser
|
||||||
callbackNumber uintptr
|
callbackNumber uintptr
|
||||||
|
killSignalDelivered bool
|
||||||
|
|
||||||
closedWaitOnce sync.Once
|
closedWaitOnce sync.Once
|
||||||
waitBlock chan struct{}
|
waitBlock chan struct{}
|
||||||
@ -149,12 +152,45 @@ func (process *Process) Kill(ctx context.Context) (bool, error) {
|
|||||||
return false, makeProcessError(process, operation, ErrAlreadyClosed, nil)
|
return false, makeProcessError(process, operation, ErrAlreadyClosed, nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if process.killSignalDelivered {
|
||||||
|
// A kill signal has already been sent to this process. Sending a second
|
||||||
|
// one offers no real benefit, as processes cannot stop themselves from
|
||||||
|
// being terminated, once a TerminateProcess has been issued. Sending a
|
||||||
|
// second kill may result in a number of errors (two of which detailed bellow)
|
||||||
|
// and which we can avoid handling.
|
||||||
|
return true, nil
|
||||||
|
}
|
||||||
|
|
||||||
resultJSON, err := vmcompute.HcsTerminateProcess(ctx, process.handle)
|
resultJSON, err := vmcompute.HcsTerminateProcess(ctx, process.handle)
|
||||||
|
if err != nil {
|
||||||
|
// We still need to check these two cases, as processes may still be killed by an
|
||||||
|
// external actor (human operator, OOM, random script etc).
|
||||||
|
if errors.Is(err, os.ErrPermission) || IsAlreadyStopped(err) {
|
||||||
|
// There are two cases where it should be safe to ignore an error returned
|
||||||
|
// by HcsTerminateProcess. The first one is cause by the fact that
|
||||||
|
// HcsTerminateProcess ends up calling TerminateProcess in the context
|
||||||
|
// of a container. According to the TerminateProcess documentation:
|
||||||
|
// https://docs.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-terminateprocess#remarks
|
||||||
|
// After a process has terminated, call to TerminateProcess with open
|
||||||
|
// handles to the process fails with ERROR_ACCESS_DENIED (5) error code.
|
||||||
|
// It's safe to ignore this error here. HCS should always have permissions
|
||||||
|
// to kill processes inside any container. So an ERROR_ACCESS_DENIED
|
||||||
|
// is unlikely to be anything else than what the ending remarks in the
|
||||||
|
// documentation states.
|
||||||
|
//
|
||||||
|
// The second case is generated by hcs itself, if for any reason HcsTerminateProcess
|
||||||
|
// is called twice in a very short amount of time. In such cases, hcs may return
|
||||||
|
// HCS_E_PROCESS_ALREADY_STOPPED.
|
||||||
|
return true, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
events := processHcsResult(ctx, resultJSON)
|
events := processHcsResult(ctx, resultJSON)
|
||||||
delivered, err := process.processSignalResult(ctx, err)
|
delivered, err := process.processSignalResult(ctx, err)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
err = makeProcessError(process, operation, err, events)
|
err = makeProcessError(process, operation, err, events)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
process.killSignalDelivered = delivered
|
||||||
return delivered, err
|
return delivered, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
6
vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/attachment.go
generated
vendored
6
vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/attachment.go
generated
vendored
@ -27,4 +27,10 @@ type Attachment struct {
|
|||||||
CaptureIoAttributionContext bool `json:"CaptureIoAttributionContext,omitempty"`
|
CaptureIoAttributionContext bool `json:"CaptureIoAttributionContext,omitempty"`
|
||||||
|
|
||||||
ReadOnly bool `json:"ReadOnly,omitempty"`
|
ReadOnly bool `json:"ReadOnly,omitempty"`
|
||||||
|
|
||||||
|
SupportCompressedVolumes bool `json:"SupportCompressedVolumes,omitempty"`
|
||||||
|
|
||||||
|
AlwaysAllowSparseFiles bool `json:"AlwaysAllowSparseFiles,omitempty"`
|
||||||
|
|
||||||
|
ExtensibleVirtualDiskType string `json:"ExtensibleVirtualDiskType,omitempty"`
|
||||||
}
|
}
|
||||||
|
2
vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/container.go
generated
vendored
2
vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/container.go
generated
vendored
@ -31,4 +31,6 @@ type Container struct {
|
|||||||
RegistryChanges *RegistryChanges `json:"RegistryChanges,omitempty"`
|
RegistryChanges *RegistryChanges `json:"RegistryChanges,omitempty"`
|
||||||
|
|
||||||
AssignedDevices []Device `json:"AssignedDevices,omitempty"`
|
AssignedDevices []Device `json:"AssignedDevices,omitempty"`
|
||||||
|
|
||||||
|
AdditionalDeviceNamespace *ContainerDefinitionDevice `json:"AdditionalDeviceNamespace,omitempty"`
|
||||||
}
|
}
|
||||||
|
2
vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/cpu_group_config.go
generated
vendored
2
vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/cpu_group_config.go
generated
vendored
@ -14,5 +14,5 @@ type CpuGroupConfig struct {
|
|||||||
Affinity *CpuGroupAffinity `json:"Affinity,omitempty"`
|
Affinity *CpuGroupAffinity `json:"Affinity,omitempty"`
|
||||||
GroupProperties []CpuGroupProperty `json:"GroupProperties,omitempty"`
|
GroupProperties []CpuGroupProperty `json:"GroupProperties,omitempty"`
|
||||||
// Hypervisor CPU group IDs exposed to clients
|
// Hypervisor CPU group IDs exposed to clients
|
||||||
HypervisorGroupId int32 `json:"HypervisorGroupId,omitempty"`
|
HypervisorGroupId uint64 `json:"HypervisorGroupId,omitempty"`
|
||||||
}
|
}
|
||||||
|
4
vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/device.go
generated
vendored
4
vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/device.go
generated
vendored
@ -13,7 +13,7 @@ type DeviceType string
|
|||||||
|
|
||||||
const (
|
const (
|
||||||
ClassGUID DeviceType = "ClassGuid"
|
ClassGUID DeviceType = "ClassGuid"
|
||||||
DeviceInstance DeviceType = "DeviceInstance"
|
DeviceInstanceID DeviceType = "DeviceInstance"
|
||||||
GPUMirror DeviceType = "GpuMirror"
|
GPUMirror DeviceType = "GpuMirror"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -22,6 +22,6 @@ type Device struct {
|
|||||||
Type DeviceType `json:"Type,omitempty"`
|
Type DeviceType `json:"Type,omitempty"`
|
||||||
// The interface class guid of the device interfaces to assign to the container. Only used when Type is ClassGuid.
|
// The interface class guid of the device interfaces to assign to the container. Only used when Type is ClassGuid.
|
||||||
InterfaceClassGuid string `json:"InterfaceClassGuid,omitempty"`
|
InterfaceClassGuid string `json:"InterfaceClassGuid,omitempty"`
|
||||||
// The location path of the device to assign to the container. Only used when Type is DeviceInstance.
|
// The location path of the device to assign to the container. Only used when Type is DeviceInstanceID.
|
||||||
LocationPath string `json:"LocationPath,omitempty"`
|
LocationPath string `json:"LocationPath,omitempty"`
|
||||||
}
|
}
|
||||||
|
14
vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/model_container_definition_device.go
generated
vendored
Normal file
14
vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/model_container_definition_device.go
generated
vendored
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
/*
|
||||||
|
* HCS API
|
||||||
|
*
|
||||||
|
* No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)
|
||||||
|
*
|
||||||
|
* API version: 2.4
|
||||||
|
* Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
|
||||||
|
*/
|
||||||
|
|
||||||
|
package hcsschema
|
||||||
|
|
||||||
|
type ContainerDefinitionDevice struct {
|
||||||
|
DeviceExtension []DeviceExtension `json:"device_extension,omitempty"`
|
||||||
|
}
|
15
vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/model_device_category.go
generated
vendored
Normal file
15
vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/model_device_category.go
generated
vendored
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
/*
|
||||||
|
* HCS API
|
||||||
|
*
|
||||||
|
* No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)
|
||||||
|
*
|
||||||
|
* API version: 2.4
|
||||||
|
* Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
|
||||||
|
*/
|
||||||
|
|
||||||
|
package hcsschema
|
||||||
|
|
||||||
|
type DeviceCategory struct {
|
||||||
|
Name string `json:"name,omitempty"`
|
||||||
|
InterfaceClass []InterfaceClass `json:"interface_class,omitempty"`
|
||||||
|
}
|
15
vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/model_device_extension.go
generated
vendored
Normal file
15
vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/model_device_extension.go
generated
vendored
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
/*
|
||||||
|
* HCS API
|
||||||
|
*
|
||||||
|
* No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)
|
||||||
|
*
|
||||||
|
* API version: 2.4
|
||||||
|
* Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
|
||||||
|
*/
|
||||||
|
|
||||||
|
package hcsschema
|
||||||
|
|
||||||
|
type DeviceExtension struct {
|
||||||
|
DeviceCategory *DeviceCategory `json:"device_category,omitempty"`
|
||||||
|
Namespace *DeviceExtensionNamespace `json:"namespace,omitempty"`
|
||||||
|
}
|
17
vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/model_device_instance.go
generated
vendored
Normal file
17
vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/model_device_instance.go
generated
vendored
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
/*
|
||||||
|
* HCS API
|
||||||
|
*
|
||||||
|
* No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)
|
||||||
|
*
|
||||||
|
* API version: 2.4
|
||||||
|
* Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
|
||||||
|
*/
|
||||||
|
|
||||||
|
package hcsschema
|
||||||
|
|
||||||
|
type DeviceInstance struct {
|
||||||
|
Id string `json:"id,omitempty"`
|
||||||
|
LocationPath string `json:"location_path,omitempty"`
|
||||||
|
PortName string `json:"port_name,omitempty"`
|
||||||
|
InterfaceClass []InterfaceClass `json:"interface_class,omitempty"`
|
||||||
|
}
|
16
vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/model_device_namespace.go
generated
vendored
Normal file
16
vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/model_device_namespace.go
generated
vendored
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
/*
|
||||||
|
* HCS API
|
||||||
|
*
|
||||||
|
* No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)
|
||||||
|
*
|
||||||
|
* API version: 2.4
|
||||||
|
* Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
|
||||||
|
*/
|
||||||
|
|
||||||
|
package hcsschema
|
||||||
|
|
||||||
|
type DeviceNamespace struct {
|
||||||
|
RequiresDriverstore bool `json:"requires_driverstore,omitempty"`
|
||||||
|
DeviceCategory []DeviceCategory `json:"device_category,omitempty"`
|
||||||
|
DeviceInstance []DeviceInstance `json:"device_instance,omitempty"`
|
||||||
|
}
|
16
vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/model_interface_class.go
generated
vendored
Normal file
16
vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/model_interface_class.go
generated
vendored
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
/*
|
||||||
|
* HCS API
|
||||||
|
*
|
||||||
|
* No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)
|
||||||
|
*
|
||||||
|
* API version: 2.4
|
||||||
|
* Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
|
||||||
|
*/
|
||||||
|
|
||||||
|
package hcsschema
|
||||||
|
|
||||||
|
type InterfaceClass struct {
|
||||||
|
Type_ string `json:"type,omitempty"`
|
||||||
|
Identifier string `json:"identifier,omitempty"`
|
||||||
|
Recurse bool `json:"recurse,omitempty"`
|
||||||
|
}
|
15
vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/model_namespace.go
generated
vendored
Normal file
15
vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/model_namespace.go
generated
vendored
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
/*
|
||||||
|
* HCS API
|
||||||
|
*
|
||||||
|
* No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)
|
||||||
|
*
|
||||||
|
* API version: 2.4
|
||||||
|
* Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
|
||||||
|
*/
|
||||||
|
|
||||||
|
package hcsschema
|
||||||
|
|
||||||
|
type DeviceExtensionNamespace struct {
|
||||||
|
Ob *ObjectNamespace `json:"ob,omitempty"`
|
||||||
|
Device *DeviceNamespace `json:"device,omitempty"`
|
||||||
|
}
|
18
vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/model_object_directory.go
generated
vendored
Normal file
18
vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/model_object_directory.go
generated
vendored
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
/*
|
||||||
|
* HCS API
|
||||||
|
*
|
||||||
|
* No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)
|
||||||
|
*
|
||||||
|
* API version: 2.4
|
||||||
|
* Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
|
||||||
|
*/
|
||||||
|
|
||||||
|
package hcsschema
|
||||||
|
|
||||||
|
type ObjectDirectory struct {
|
||||||
|
Name string `json:"name,omitempty"`
|
||||||
|
Clonesd string `json:"clonesd,omitempty"`
|
||||||
|
Shadow string `json:"shadow,omitempty"`
|
||||||
|
Symlink []ObjectSymlink `json:"symlink,omitempty"`
|
||||||
|
Objdir []ObjectDirectory `json:"objdir,omitempty"`
|
||||||
|
}
|
16
vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/model_object_namespace.go
generated
vendored
Normal file
16
vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/model_object_namespace.go
generated
vendored
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
/*
|
||||||
|
* HCS API
|
||||||
|
*
|
||||||
|
* No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)
|
||||||
|
*
|
||||||
|
* API version: 2.4
|
||||||
|
* Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
|
||||||
|
*/
|
||||||
|
|
||||||
|
package hcsschema
|
||||||
|
|
||||||
|
type ObjectNamespace struct {
|
||||||
|
Shadow string `json:"shadow,omitempty"`
|
||||||
|
Symlink []ObjectSymlink `json:"symlink,omitempty"`
|
||||||
|
Objdir []ObjectDirectory `json:"objdir,omitempty"`
|
||||||
|
}
|
18
vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/model_object_symlink.go
generated
vendored
Normal file
18
vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/model_object_symlink.go
generated
vendored
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
/*
|
||||||
|
* HCS API
|
||||||
|
*
|
||||||
|
* No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)
|
||||||
|
*
|
||||||
|
* API version: 2.4
|
||||||
|
* Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
|
||||||
|
*/
|
||||||
|
|
||||||
|
package hcsschema
|
||||||
|
|
||||||
|
type ObjectSymlink struct {
|
||||||
|
Name string `json:"name,omitempty"`
|
||||||
|
Path string `json:"path,omitempty"`
|
||||||
|
Scope string `json:"scope,omitempty"`
|
||||||
|
Pathtoclone string `json:"pathtoclone,omitempty"`
|
||||||
|
AccessMask int32 `json:"access_mask,omitempty"`
|
||||||
|
}
|
15
vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/virtual_p_mem_mapping.go
generated
vendored
Normal file
15
vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/virtual_p_mem_mapping.go
generated
vendored
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
/*
|
||||||
|
* HCS API
|
||||||
|
*
|
||||||
|
* No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)
|
||||||
|
*
|
||||||
|
* API version: 2.4
|
||||||
|
* Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
|
||||||
|
*/
|
||||||
|
|
||||||
|
package hcsschema
|
||||||
|
|
||||||
|
type VirtualPMemMapping struct {
|
||||||
|
HostPath string `json:"HostPath,omitempty"`
|
||||||
|
ImageFormat string `json:"ImageFormat,omitempty"`
|
||||||
|
}
|
198
vendor/github.com/Microsoft/hcsshim/internal/hcs/system.go
generated
vendored
198
vendor/github.com/Microsoft/hcsshim/internal/hcs/system.go
generated
vendored
@ -4,17 +4,22 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"errors"
|
"errors"
|
||||||
|
"fmt"
|
||||||
"strings"
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
"syscall"
|
"syscall"
|
||||||
|
"time"
|
||||||
|
|
||||||
"github.com/Microsoft/hcsshim/internal/cow"
|
"github.com/Microsoft/hcsshim/internal/cow"
|
||||||
"github.com/Microsoft/hcsshim/internal/hcs/schema1"
|
"github.com/Microsoft/hcsshim/internal/hcs/schema1"
|
||||||
hcsschema "github.com/Microsoft/hcsshim/internal/hcs/schema2"
|
hcsschema "github.com/Microsoft/hcsshim/internal/hcs/schema2"
|
||||||
|
"github.com/Microsoft/hcsshim/internal/jobobject"
|
||||||
"github.com/Microsoft/hcsshim/internal/log"
|
"github.com/Microsoft/hcsshim/internal/log"
|
||||||
|
"github.com/Microsoft/hcsshim/internal/logfields"
|
||||||
"github.com/Microsoft/hcsshim/internal/oc"
|
"github.com/Microsoft/hcsshim/internal/oc"
|
||||||
"github.com/Microsoft/hcsshim/internal/timeout"
|
"github.com/Microsoft/hcsshim/internal/timeout"
|
||||||
"github.com/Microsoft/hcsshim/internal/vmcompute"
|
"github.com/Microsoft/hcsshim/internal/vmcompute"
|
||||||
|
"github.com/sirupsen/logrus"
|
||||||
"go.opencensus.io/trace"
|
"go.opencensus.io/trace"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -28,7 +33,8 @@ type System struct {
|
|||||||
waitBlock chan struct{}
|
waitBlock chan struct{}
|
||||||
waitError error
|
waitError error
|
||||||
exitError error
|
exitError error
|
||||||
os, typ string
|
os, typ, owner string
|
||||||
|
startTime time.Time
|
||||||
}
|
}
|
||||||
|
|
||||||
func newSystem(id string) *System {
|
func newSystem(id string) *System {
|
||||||
@ -38,6 +44,11 @@ func newSystem(id string) *System {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Implementation detail for silo naming, this should NOT be relied upon very heavily.
|
||||||
|
func siloNameFmt(containerID string) string {
|
||||||
|
return fmt.Sprintf(`\Container_%s`, containerID)
|
||||||
|
}
|
||||||
|
|
||||||
// CreateComputeSystem creates a new compute system with the given configuration but does not start it.
|
// CreateComputeSystem creates a new compute system with the given configuration but does not start it.
|
||||||
func CreateComputeSystem(ctx context.Context, id string, hcsDocumentInterface interface{}) (_ *System, err error) {
|
func CreateComputeSystem(ctx context.Context, id string, hcsDocumentInterface interface{}) (_ *System, err error) {
|
||||||
operation := "hcs::CreateComputeSystem"
|
operation := "hcs::CreateComputeSystem"
|
||||||
@ -127,6 +138,7 @@ func (computeSystem *System) getCachedProperties(ctx context.Context) error {
|
|||||||
}
|
}
|
||||||
computeSystem.typ = strings.ToLower(props.SystemType)
|
computeSystem.typ = strings.ToLower(props.SystemType)
|
||||||
computeSystem.os = strings.ToLower(props.RuntimeOSType)
|
computeSystem.os = strings.ToLower(props.RuntimeOSType)
|
||||||
|
computeSystem.owner = strings.ToLower(props.Owner)
|
||||||
if computeSystem.os == "" && computeSystem.typ == "container" {
|
if computeSystem.os == "" && computeSystem.typ == "container" {
|
||||||
// Pre-RS5 HCS did not return the OS, but it only supported containers
|
// Pre-RS5 HCS did not return the OS, but it only supported containers
|
||||||
// that ran Windows.
|
// that ran Windows.
|
||||||
@ -195,7 +207,7 @@ func (computeSystem *System) Start(ctx context.Context) (err error) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return makeSystemError(computeSystem, operation, err, events)
|
return makeSystemError(computeSystem, operation, err, events)
|
||||||
}
|
}
|
||||||
|
computeSystem.startTime = time.Now()
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -275,11 +287,19 @@ func (computeSystem *System) waitBackground() {
|
|||||||
oc.SetSpanStatus(span, err)
|
oc.SetSpanStatus(span, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (computeSystem *System) WaitChannel() <-chan struct{} {
|
||||||
|
return computeSystem.waitBlock
|
||||||
|
}
|
||||||
|
|
||||||
|
func (computeSystem *System) WaitError() error {
|
||||||
|
return computeSystem.waitError
|
||||||
|
}
|
||||||
|
|
||||||
// Wait synchronously waits for the compute system to shutdown or terminate. If
|
// Wait synchronously waits for the compute system to shutdown or terminate. If
|
||||||
// the compute system has already exited returns the previous error (if any).
|
// the compute system has already exited returns the previous error (if any).
|
||||||
func (computeSystem *System) Wait() error {
|
func (computeSystem *System) Wait() error {
|
||||||
<-computeSystem.waitBlock
|
<-computeSystem.WaitChannel()
|
||||||
return computeSystem.waitError
|
return computeSystem.WaitError()
|
||||||
}
|
}
|
||||||
|
|
||||||
// ExitError returns an error describing the reason the compute system terminated.
|
// ExitError returns an error describing the reason the compute system terminated.
|
||||||
@ -324,11 +344,115 @@ func (computeSystem *System) Properties(ctx context.Context, types ...schema1.Pr
|
|||||||
return properties, nil
|
return properties, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// PropertiesV2 returns the requested container properties targeting a V2 schema container.
|
// queryInProc handles querying for container properties without reaching out to HCS. `props`
|
||||||
func (computeSystem *System) PropertiesV2(ctx context.Context, types ...hcsschema.PropertyType) (*hcsschema.Properties, error) {
|
// will be updated to contain any data returned from the queries present in `types`. If any properties
|
||||||
computeSystem.handleLock.RLock()
|
// failed to be queried they will be tallied up and returned in as the first return value. Failures on
|
||||||
defer computeSystem.handleLock.RUnlock()
|
// query are NOT considered errors; the only failure case for this method is if the containers job object
|
||||||
|
// cannot be opened.
|
||||||
|
func (computeSystem *System) queryInProc(ctx context.Context, props *hcsschema.Properties, types []hcsschema.PropertyType) ([]hcsschema.PropertyType, error) {
|
||||||
|
// In the future we can make use of some new functionality in the HCS that allows you
|
||||||
|
// to pass a job object for HCS to use for the container. Currently, the only way we'll
|
||||||
|
// be able to open the job/silo is if we're running as SYSTEM.
|
||||||
|
jobOptions := &jobobject.Options{
|
||||||
|
UseNTVariant: true,
|
||||||
|
Name: siloNameFmt(computeSystem.id),
|
||||||
|
}
|
||||||
|
job, err := jobobject.Open(ctx, jobOptions)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
defer job.Close()
|
||||||
|
|
||||||
|
var fallbackQueryTypes []hcsschema.PropertyType
|
||||||
|
for _, propType := range types {
|
||||||
|
switch propType {
|
||||||
|
case hcsschema.PTStatistics:
|
||||||
|
// Handle a bad caller asking for the same type twice. No use in re-querying if this is
|
||||||
|
// filled in already.
|
||||||
|
if props.Statistics == nil {
|
||||||
|
props.Statistics, err = computeSystem.statisticsInProc(job)
|
||||||
|
if err != nil {
|
||||||
|
log.G(ctx).WithError(err).Warn("failed to get statistics in-proc")
|
||||||
|
|
||||||
|
fallbackQueryTypes = append(fallbackQueryTypes, propType)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
fallbackQueryTypes = append(fallbackQueryTypes, propType)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return fallbackQueryTypes, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// statisticsInProc emulates what HCS does to grab statistics for a given container with a small
|
||||||
|
// change to make grabbing the private working set total much more efficient.
|
||||||
|
func (computeSystem *System) statisticsInProc(job *jobobject.JobObject) (*hcsschema.Statistics, error) {
|
||||||
|
// Start timestamp for these stats before we grab them to match HCS
|
||||||
|
timestamp := time.Now()
|
||||||
|
|
||||||
|
memInfo, err := job.QueryMemoryStats()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
processorInfo, err := job.QueryProcessorStats()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
storageInfo, err := job.QueryStorageStats()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// This calculates the private working set more efficiently than HCS does. HCS calls NtQuerySystemInformation
|
||||||
|
// with the class SystemProcessInformation which returns an array containing system information for *every*
|
||||||
|
// process running on the machine. They then grab the pids that are running in the container and filter down
|
||||||
|
// the entries in the array to only what's running in that silo and start tallying up the total. This doesn't
|
||||||
|
// work well as performance should get worse if more processess are running on the machine in general and not
|
||||||
|
// just in the container. All of the additional information besides the WorkingSetPrivateSize field is ignored
|
||||||
|
// as well which isn't great and is wasted work to fetch.
|
||||||
|
//
|
||||||
|
// HCS only let's you grab statistics in an all or nothing fashion, so we can't just grab the private
|
||||||
|
// working set ourselves and ask for everything else seperately. The optimization we can make here is
|
||||||
|
// to open the silo ourselves and do the same queries for the rest of the info, as well as calculating
|
||||||
|
// the private working set in a more efficient manner by:
|
||||||
|
//
|
||||||
|
// 1. Find the pids running in the silo
|
||||||
|
// 2. Get a process handle for every process (only need PROCESS_QUERY_LIMITED_INFORMATION access)
|
||||||
|
// 3. Call NtQueryInformationProcess on each process with the class ProcessVmCounters
|
||||||
|
// 4. Tally up the total using the field PrivateWorkingSetSize in VM_COUNTERS_EX2.
|
||||||
|
privateWorkingSet, err := job.QueryPrivateWorkingSet()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return &hcsschema.Statistics{
|
||||||
|
Timestamp: timestamp,
|
||||||
|
ContainerStartTime: computeSystem.startTime,
|
||||||
|
Uptime100ns: uint64(time.Since(computeSystem.startTime).Nanoseconds()) / 100,
|
||||||
|
Memory: &hcsschema.MemoryStats{
|
||||||
|
MemoryUsageCommitBytes: memInfo.JobMemory,
|
||||||
|
MemoryUsageCommitPeakBytes: memInfo.PeakJobMemoryUsed,
|
||||||
|
MemoryUsagePrivateWorkingSetBytes: privateWorkingSet,
|
||||||
|
},
|
||||||
|
Processor: &hcsschema.ProcessorStats{
|
||||||
|
RuntimeKernel100ns: uint64(processorInfo.TotalKernelTime),
|
||||||
|
RuntimeUser100ns: uint64(processorInfo.TotalUserTime),
|
||||||
|
TotalRuntime100ns: uint64(processorInfo.TotalKernelTime + processorInfo.TotalUserTime),
|
||||||
|
},
|
||||||
|
Storage: &hcsschema.StorageStats{
|
||||||
|
ReadCountNormalized: uint64(storageInfo.ReadStats.IoCount),
|
||||||
|
ReadSizeBytes: storageInfo.ReadStats.TotalSize,
|
||||||
|
WriteCountNormalized: uint64(storageInfo.WriteStats.IoCount),
|
||||||
|
WriteSizeBytes: storageInfo.WriteStats.TotalSize,
|
||||||
|
},
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// hcsPropertiesV2Query is a helper to make a HcsGetComputeSystemProperties call using the V2 schema property types.
|
||||||
|
func (computeSystem *System) hcsPropertiesV2Query(ctx context.Context, types []hcsschema.PropertyType) (*hcsschema.Properties, error) {
|
||||||
operation := "hcs::System::PropertiesV2"
|
operation := "hcs::System::PropertiesV2"
|
||||||
|
|
||||||
queryBytes, err := json.Marshal(hcsschema.PropertyQuery{PropertyTypes: types})
|
queryBytes, err := json.Marshal(hcsschema.PropertyQuery{PropertyTypes: types})
|
||||||
@ -345,12 +469,66 @@ func (computeSystem *System) PropertiesV2(ctx context.Context, types ...hcsschem
|
|||||||
if propertiesJSON == "" {
|
if propertiesJSON == "" {
|
||||||
return nil, ErrUnexpectedValue
|
return nil, ErrUnexpectedValue
|
||||||
}
|
}
|
||||||
properties := &hcsschema.Properties{}
|
props := &hcsschema.Properties{}
|
||||||
if err := json.Unmarshal([]byte(propertiesJSON), properties); err != nil {
|
if err := json.Unmarshal([]byte(propertiesJSON), props); err != nil {
|
||||||
return nil, makeSystemError(computeSystem, operation, err, nil)
|
return nil, makeSystemError(computeSystem, operation, err, nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return props, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// PropertiesV2 returns the requested compute systems properties targeting a V2 schema compute system.
|
||||||
|
func (computeSystem *System) PropertiesV2(ctx context.Context, types ...hcsschema.PropertyType) (_ *hcsschema.Properties, err error) {
|
||||||
|
computeSystem.handleLock.RLock()
|
||||||
|
defer computeSystem.handleLock.RUnlock()
|
||||||
|
|
||||||
|
// Let HCS tally up the total for VM based queries instead of querying ourselves.
|
||||||
|
if computeSystem.typ != "container" {
|
||||||
|
return computeSystem.hcsPropertiesV2Query(ctx, types)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Define a starter Properties struct with the default fields returned from every
|
||||||
|
// query. Owner is only returned from Statistics but it's harmless to include.
|
||||||
|
properties := &hcsschema.Properties{
|
||||||
|
Id: computeSystem.id,
|
||||||
|
SystemType: computeSystem.typ,
|
||||||
|
RuntimeOsType: computeSystem.os,
|
||||||
|
Owner: computeSystem.owner,
|
||||||
|
}
|
||||||
|
|
||||||
|
logEntry := log.G(ctx)
|
||||||
|
// First lets try and query ourselves without reaching to HCS. If any of the queries fail
|
||||||
|
// we'll take note and fallback to querying HCS for any of the failed types.
|
||||||
|
fallbackTypes, err := computeSystem.queryInProc(ctx, properties, types)
|
||||||
|
if err == nil && len(fallbackTypes) == 0 {
|
||||||
return properties, nil
|
return properties, nil
|
||||||
|
} else if err != nil {
|
||||||
|
logEntry.WithError(fmt.Errorf("failed to query compute system properties in-proc: %w", err))
|
||||||
|
fallbackTypes = types
|
||||||
|
}
|
||||||
|
|
||||||
|
logEntry.WithFields(logrus.Fields{
|
||||||
|
logfields.ContainerID: computeSystem.id,
|
||||||
|
"propertyTypes": fallbackTypes,
|
||||||
|
}).Info("falling back to HCS for property type queries")
|
||||||
|
|
||||||
|
hcsProperties, err := computeSystem.hcsPropertiesV2Query(ctx, fallbackTypes)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Now add in anything that we might have successfully queried in process.
|
||||||
|
if properties.Statistics != nil {
|
||||||
|
hcsProperties.Statistics = properties.Statistics
|
||||||
|
hcsProperties.Owner = properties.Owner
|
||||||
|
}
|
||||||
|
|
||||||
|
// For future support for querying processlist in-proc as well.
|
||||||
|
if properties.ProcessList != nil {
|
||||||
|
hcsProperties.ProcessList = properties.ProcessList
|
||||||
|
}
|
||||||
|
|
||||||
|
return hcsProperties, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Pause pauses the execution of the computeSystem. This feature is not enabled in TP5.
|
// Pause pauses the execution of the computeSystem. This feature is not enabled in TP5.
|
||||||
|
30
vendor/github.com/Microsoft/hcsshim/internal/hns/hnsendpoint.go
generated
vendored
30
vendor/github.com/Microsoft/hcsshim/internal/hns/hnsendpoint.go
generated
vendored
@ -20,6 +20,7 @@ type HNSEndpoint struct {
|
|||||||
IPv6Address net.IP `json:",omitempty"`
|
IPv6Address net.IP `json:",omitempty"`
|
||||||
DNSSuffix string `json:",omitempty"`
|
DNSSuffix string `json:",omitempty"`
|
||||||
DNSServerList string `json:",omitempty"`
|
DNSServerList string `json:",omitempty"`
|
||||||
|
DNSDomain string `json:",omitempty"`
|
||||||
GatewayAddress string `json:",omitempty"`
|
GatewayAddress string `json:",omitempty"`
|
||||||
GatewayAddressV6 string `json:",omitempty"`
|
GatewayAddressV6 string `json:",omitempty"`
|
||||||
EnableInternalDNS bool `json:",omitempty"`
|
EnableInternalDNS bool `json:",omitempty"`
|
||||||
@ -30,6 +31,7 @@ type HNSEndpoint struct {
|
|||||||
EnableLowMetric bool `json:",omitempty"`
|
EnableLowMetric bool `json:",omitempty"`
|
||||||
Namespace *Namespace `json:",omitempty"`
|
Namespace *Namespace `json:",omitempty"`
|
||||||
EncapOverhead uint16 `json:",omitempty"`
|
EncapOverhead uint16 `json:",omitempty"`
|
||||||
|
SharedContainers []string `json:",omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
//SystemType represents the type of the system on which actions are done
|
//SystemType represents the type of the system on which actions are done
|
||||||
@ -57,6 +59,18 @@ type EndpointResquestResponse struct {
|
|||||||
Error string
|
Error string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// EndpointStats is the object that has stats for a given endpoint
|
||||||
|
type EndpointStats struct {
|
||||||
|
BytesReceived uint64 `json:"BytesReceived"`
|
||||||
|
BytesSent uint64 `json:"BytesSent"`
|
||||||
|
DroppedPacketsIncoming uint64 `json:"DroppedPacketsIncoming"`
|
||||||
|
DroppedPacketsOutgoing uint64 `json:"DroppedPacketsOutgoing"`
|
||||||
|
EndpointID string `json:"EndpointId"`
|
||||||
|
InstanceID string `json:"InstanceId"`
|
||||||
|
PacketsReceived uint64 `json:"PacketsReceived"`
|
||||||
|
PacketsSent uint64 `json:"PacketsSent"`
|
||||||
|
}
|
||||||
|
|
||||||
// HNSEndpointRequest makes a HNS call to modify/query a network endpoint
|
// HNSEndpointRequest makes a HNS call to modify/query a network endpoint
|
||||||
func HNSEndpointRequest(method, path, request string) (*HNSEndpoint, error) {
|
func HNSEndpointRequest(method, path, request string) (*HNSEndpoint, error) {
|
||||||
endpoint := &HNSEndpoint{}
|
endpoint := &HNSEndpoint{}
|
||||||
@ -79,11 +93,27 @@ func HNSListEndpointRequest() ([]HNSEndpoint, error) {
|
|||||||
return endpoint, nil
|
return endpoint, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// hnsEndpointStatsRequest makes a HNS call to query the stats for a given endpoint ID
|
||||||
|
func hnsEndpointStatsRequest(id string) (*EndpointStats, error) {
|
||||||
|
var stats EndpointStats
|
||||||
|
err := hnsCall("GET", "/endpointstats/"+id, "", &stats)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return &stats, nil
|
||||||
|
}
|
||||||
|
|
||||||
// GetHNSEndpointByID get the Endpoint by ID
|
// GetHNSEndpointByID get the Endpoint by ID
|
||||||
func GetHNSEndpointByID(endpointID string) (*HNSEndpoint, error) {
|
func GetHNSEndpointByID(endpointID string) (*HNSEndpoint, error) {
|
||||||
return HNSEndpointRequest("GET", endpointID, "")
|
return HNSEndpointRequest("GET", endpointID, "")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetHNSEndpointStats get the stats for a n Endpoint by ID
|
||||||
|
func GetHNSEndpointStats(endpointID string) (*EndpointStats, error) {
|
||||||
|
return hnsEndpointStatsRequest(endpointID)
|
||||||
|
}
|
||||||
|
|
||||||
// GetHNSEndpointByName gets the endpoint filtered by Name
|
// GetHNSEndpointByName gets the endpoint filtered by Name
|
||||||
func GetHNSEndpointByName(endpointName string) (*HNSEndpoint, error) {
|
func GetHNSEndpointByName(endpointName string) (*HNSEndpoint, error) {
|
||||||
hnsResponse, err := HNSListEndpointRequest()
|
hnsResponse, err := HNSListEndpointRequest()
|
||||||
|
23
vendor/github.com/Microsoft/hcsshim/internal/hns/hnspolicy.go
generated
vendored
23
vendor/github.com/Microsoft/hcsshim/internal/hns/hnspolicy.go
generated
vendored
@ -22,9 +22,10 @@ const (
|
|||||||
|
|
||||||
type NatPolicy struct {
|
type NatPolicy struct {
|
||||||
Type PolicyType `json:"Type"`
|
Type PolicyType `json:"Type"`
|
||||||
Protocol string
|
Protocol string `json:",omitempty"`
|
||||||
InternalPort uint16
|
InternalPort uint16 `json:",omitempty"`
|
||||||
ExternalPort uint16
|
ExternalPort uint16 `json:",omitempty"`
|
||||||
|
ExternalPortReserved bool `json:",omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type QosPolicy struct {
|
type QosPolicy struct {
|
||||||
@ -88,20 +89,20 @@ const (
|
|||||||
type ACLPolicy struct {
|
type ACLPolicy struct {
|
||||||
Type PolicyType `json:"Type"`
|
Type PolicyType `json:"Type"`
|
||||||
Id string `json:"Id,omitempty"`
|
Id string `json:"Id,omitempty"`
|
||||||
Protocol uint16
|
Protocol uint16 `json:",omitempty"`
|
||||||
Protocols string `json:"Protocols,omitempty"`
|
Protocols string `json:"Protocols,omitempty"`
|
||||||
InternalPort uint16
|
InternalPort uint16 `json:",omitempty"`
|
||||||
Action ActionType
|
Action ActionType
|
||||||
Direction DirectionType
|
Direction DirectionType
|
||||||
LocalAddresses string
|
LocalAddresses string `json:",omitempty"`
|
||||||
RemoteAddresses string
|
RemoteAddresses string `json:",omitempty"`
|
||||||
LocalPorts string `json:"LocalPorts,omitempty"`
|
LocalPorts string `json:"LocalPorts,omitempty"`
|
||||||
LocalPort uint16
|
LocalPort uint16 `json:",omitempty"`
|
||||||
RemotePorts string `json:"RemotePorts,omitempty"`
|
RemotePorts string `json:"RemotePorts,omitempty"`
|
||||||
RemotePort uint16
|
RemotePort uint16 `json:",omitempty"`
|
||||||
RuleType RuleType `json:"RuleType,omitempty"`
|
RuleType RuleType `json:"RuleType,omitempty"`
|
||||||
Priority uint16
|
Priority uint16 `json:",omitempty"`
|
||||||
ServiceName string
|
ServiceName string `json:",omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type Policy struct {
|
type Policy struct {
|
||||||
|
111
vendor/github.com/Microsoft/hcsshim/internal/jobobject/iocp.go
generated
vendored
Normal file
111
vendor/github.com/Microsoft/hcsshim/internal/jobobject/iocp.go
generated
vendored
Normal file
@ -0,0 +1,111 @@
|
|||||||
|
package jobobject
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"fmt"
|
||||||
|
"sync"
|
||||||
|
"unsafe"
|
||||||
|
|
||||||
|
"github.com/Microsoft/hcsshim/internal/log"
|
||||||
|
"github.com/Microsoft/hcsshim/internal/queue"
|
||||||
|
"github.com/Microsoft/hcsshim/internal/winapi"
|
||||||
|
"github.com/sirupsen/logrus"
|
||||||
|
"golang.org/x/sys/windows"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
ioInitOnce sync.Once
|
||||||
|
initIOErr error
|
||||||
|
// Global iocp handle that will be re-used for every job object
|
||||||
|
ioCompletionPort windows.Handle
|
||||||
|
// Mapping of job handle to queue to place notifications in.
|
||||||
|
jobMap sync.Map
|
||||||
|
)
|
||||||
|
|
||||||
|
// MsgAllProcessesExited is a type representing a message that every process in a job has exited.
|
||||||
|
type MsgAllProcessesExited struct{}
|
||||||
|
|
||||||
|
// MsgUnimplemented represents a message that we are aware of, but that isn't implemented currently.
|
||||||
|
// This should not be treated as an error.
|
||||||
|
type MsgUnimplemented struct{}
|
||||||
|
|
||||||
|
// pollIOCP polls the io completion port forever.
|
||||||
|
func pollIOCP(ctx context.Context, iocpHandle windows.Handle) {
|
||||||
|
var (
|
||||||
|
overlapped uintptr
|
||||||
|
code uint32
|
||||||
|
key uintptr
|
||||||
|
)
|
||||||
|
|
||||||
|
for {
|
||||||
|
err := windows.GetQueuedCompletionStatus(iocpHandle, &code, &key, (**windows.Overlapped)(unsafe.Pointer(&overlapped)), windows.INFINITE)
|
||||||
|
if err != nil {
|
||||||
|
log.G(ctx).WithError(err).Error("failed to poll for job object message")
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if val, ok := jobMap.Load(key); ok {
|
||||||
|
msq, ok := val.(*queue.MessageQueue)
|
||||||
|
if !ok {
|
||||||
|
log.G(ctx).WithField("value", msq).Warn("encountered non queue type in job map")
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
notification, err := parseMessage(code, overlapped)
|
||||||
|
if err != nil {
|
||||||
|
log.G(ctx).WithFields(logrus.Fields{
|
||||||
|
"code": code,
|
||||||
|
"overlapped": overlapped,
|
||||||
|
}).Warn("failed to parse job object message")
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if err := msq.Enqueue(notification); err == queue.ErrQueueClosed {
|
||||||
|
// Write will only return an error when the queue is closed.
|
||||||
|
// The only time a queue would ever be closed is when we call `Close` on
|
||||||
|
// the job it belongs to which also removes it from the jobMap, so something
|
||||||
|
// went wrong here. We can't return as this is reading messages for all jobs
|
||||||
|
// so just log it and move on.
|
||||||
|
log.G(ctx).WithFields(logrus.Fields{
|
||||||
|
"code": code,
|
||||||
|
"overlapped": overlapped,
|
||||||
|
}).Warn("tried to write to a closed queue")
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
log.G(ctx).Warn("received a message for a job not present in the mapping")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func parseMessage(code uint32, overlapped uintptr) (interface{}, error) {
|
||||||
|
// Check code and parse out relevant information related to that notification
|
||||||
|
// that we care about. For now all we handle is the message that all processes
|
||||||
|
// in the job have exited.
|
||||||
|
switch code {
|
||||||
|
case winapi.JOB_OBJECT_MSG_ACTIVE_PROCESS_ZERO:
|
||||||
|
return MsgAllProcessesExited{}, nil
|
||||||
|
// Other messages for completeness and a check to make sure that if we fall
|
||||||
|
// into the default case that this is a code we don't know how to handle.
|
||||||
|
case winapi.JOB_OBJECT_MSG_END_OF_JOB_TIME:
|
||||||
|
case winapi.JOB_OBJECT_MSG_END_OF_PROCESS_TIME:
|
||||||
|
case winapi.JOB_OBJECT_MSG_ACTIVE_PROCESS_LIMIT:
|
||||||
|
case winapi.JOB_OBJECT_MSG_NEW_PROCESS:
|
||||||
|
case winapi.JOB_OBJECT_MSG_EXIT_PROCESS:
|
||||||
|
case winapi.JOB_OBJECT_MSG_ABNORMAL_EXIT_PROCESS:
|
||||||
|
case winapi.JOB_OBJECT_MSG_PROCESS_MEMORY_LIMIT:
|
||||||
|
case winapi.JOB_OBJECT_MSG_JOB_MEMORY_LIMIT:
|
||||||
|
case winapi.JOB_OBJECT_MSG_NOTIFICATION_LIMIT:
|
||||||
|
default:
|
||||||
|
return nil, fmt.Errorf("unknown job notification type: %d", code)
|
||||||
|
}
|
||||||
|
return MsgUnimplemented{}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Assigns an IO completion port to get notified of events for the registered job
|
||||||
|
// object.
|
||||||
|
func attachIOCP(job windows.Handle, iocp windows.Handle) error {
|
||||||
|
info := winapi.JOBOBJECT_ASSOCIATE_COMPLETION_PORT{
|
||||||
|
CompletionKey: job,
|
||||||
|
CompletionPort: iocp,
|
||||||
|
}
|
||||||
|
_, err := windows.SetInformationJobObject(job, windows.JobObjectAssociateCompletionPortInformation, uintptr(unsafe.Pointer(&info)), uint32(unsafe.Sizeof(info)))
|
||||||
|
return err
|
||||||
|
}
|
538
vendor/github.com/Microsoft/hcsshim/internal/jobobject/jobobject.go
generated
vendored
Normal file
538
vendor/github.com/Microsoft/hcsshim/internal/jobobject/jobobject.go
generated
vendored
Normal file
@ -0,0 +1,538 @@
|
|||||||
|
package jobobject
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
"sync"
|
||||||
|
"unsafe"
|
||||||
|
|
||||||
|
"github.com/Microsoft/hcsshim/internal/queue"
|
||||||
|
"github.com/Microsoft/hcsshim/internal/winapi"
|
||||||
|
"golang.org/x/sys/windows"
|
||||||
|
)
|
||||||
|
|
||||||
|
// This file provides higher level constructs for the win32 job object API.
|
||||||
|
// Most of the core creation and management functions are already present in "golang.org/x/sys/windows"
|
||||||
|
// (CreateJobObject, AssignProcessToJobObject, etc.) as well as most of the limit information
|
||||||
|
// structs and associated limit flags. Whatever is not present from the job object API
|
||||||
|
// in golang.org/x/sys/windows is located in /internal/winapi.
|
||||||
|
//
|
||||||
|
// https://docs.microsoft.com/en-us/windows/win32/procthread/job-objects
|
||||||
|
|
||||||
|
// JobObject is a high level wrapper around a Windows job object. Holds a handle to
|
||||||
|
// the job, a queue to receive iocp notifications about the lifecycle
|
||||||
|
// of the job and a mutex for synchronized handle access.
|
||||||
|
type JobObject struct {
|
||||||
|
handle windows.Handle
|
||||||
|
mq *queue.MessageQueue
|
||||||
|
handleLock sync.RWMutex
|
||||||
|
}
|
||||||
|
|
||||||
|
// JobLimits represents the resource constraints that can be applied to a job object.
|
||||||
|
type JobLimits struct {
|
||||||
|
CPULimit uint32
|
||||||
|
CPUWeight uint32
|
||||||
|
MemoryLimitInBytes uint64
|
||||||
|
MaxIOPS int64
|
||||||
|
MaxBandwidth int64
|
||||||
|
}
|
||||||
|
|
||||||
|
type CPURateControlType uint32
|
||||||
|
|
||||||
|
const (
|
||||||
|
WeightBased CPURateControlType = iota
|
||||||
|
RateBased
|
||||||
|
)
|
||||||
|
|
||||||
|
// Processor resource controls
|
||||||
|
const (
|
||||||
|
cpuLimitMin = 1
|
||||||
|
cpuLimitMax = 10000
|
||||||
|
cpuWeightMin = 1
|
||||||
|
cpuWeightMax = 9
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
ErrAlreadyClosed = errors.New("the handle has already been closed")
|
||||||
|
ErrNotRegistered = errors.New("job is not registered to receive notifications")
|
||||||
|
)
|
||||||
|
|
||||||
|
// Options represents the set of configurable options when making or opening a job object.
|
||||||
|
type Options struct {
|
||||||
|
// `Name` specifies the name of the job object if a named job object is desired.
|
||||||
|
Name string
|
||||||
|
// `Notifications` specifies if the job will be registered to receive notifications.
|
||||||
|
// Defaults to false.
|
||||||
|
Notifications bool
|
||||||
|
// `UseNTVariant` specifies if we should use the `Nt` variant of Open/CreateJobObject.
|
||||||
|
// Defaults to false.
|
||||||
|
UseNTVariant bool
|
||||||
|
// `IOTracking` enables tracking I/O statistics on the job object. More specifically this
|
||||||
|
// calls SetInformationJobObject with the JobObjectIoAttribution class.
|
||||||
|
EnableIOTracking bool
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create creates a job object.
|
||||||
|
//
|
||||||
|
// If options.Name is an empty string, the job will not be assigned a name.
|
||||||
|
//
|
||||||
|
// If options.Notifications are not enabled `PollNotifications` will return immediately with error `errNotRegistered`.
|
||||||
|
//
|
||||||
|
// If `options` is nil, use default option values.
|
||||||
|
//
|
||||||
|
// Returns a JobObject structure and an error if there is one.
|
||||||
|
func Create(ctx context.Context, options *Options) (_ *JobObject, err error) {
|
||||||
|
if options == nil {
|
||||||
|
options = &Options{}
|
||||||
|
}
|
||||||
|
|
||||||
|
var jobName *winapi.UnicodeString
|
||||||
|
if options.Name != "" {
|
||||||
|
jobName, err = winapi.NewUnicodeString(options.Name)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var jobHandle windows.Handle
|
||||||
|
if options.UseNTVariant {
|
||||||
|
oa := winapi.ObjectAttributes{
|
||||||
|
Length: unsafe.Sizeof(winapi.ObjectAttributes{}),
|
||||||
|
ObjectName: jobName,
|
||||||
|
Attributes: 0,
|
||||||
|
}
|
||||||
|
status := winapi.NtCreateJobObject(&jobHandle, winapi.JOB_OBJECT_ALL_ACCESS, &oa)
|
||||||
|
if status != 0 {
|
||||||
|
return nil, winapi.RtlNtStatusToDosError(status)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
var jobNameBuf *uint16
|
||||||
|
if jobName != nil && jobName.Buffer != nil {
|
||||||
|
jobNameBuf = jobName.Buffer
|
||||||
|
}
|
||||||
|
jobHandle, err = windows.CreateJobObject(nil, jobNameBuf)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
defer func() {
|
||||||
|
if err != nil {
|
||||||
|
windows.Close(jobHandle)
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
job := &JobObject{
|
||||||
|
handle: jobHandle,
|
||||||
|
}
|
||||||
|
|
||||||
|
// If the IOCP we'll be using to receive messages for all jobs hasn't been
|
||||||
|
// created, create it and start polling.
|
||||||
|
if options.Notifications {
|
||||||
|
mq, err := setupNotifications(ctx, job)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
job.mq = mq
|
||||||
|
}
|
||||||
|
|
||||||
|
if options.EnableIOTracking {
|
||||||
|
if err := enableIOTracking(jobHandle); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return job, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Open opens an existing job object with name provided in `options`. If no name is provided
|
||||||
|
// return an error since we need to know what job object to open.
|
||||||
|
//
|
||||||
|
// If options.Notifications is false `PollNotifications` will return immediately with error `errNotRegistered`.
|
||||||
|
//
|
||||||
|
// Returns a JobObject structure and an error if there is one.
|
||||||
|
func Open(ctx context.Context, options *Options) (_ *JobObject, err error) {
|
||||||
|
if options == nil || (options != nil && options.Name == "") {
|
||||||
|
return nil, errors.New("no job object name specified to open")
|
||||||
|
}
|
||||||
|
|
||||||
|
unicodeJobName, err := winapi.NewUnicodeString(options.Name)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
var jobHandle windows.Handle
|
||||||
|
if options != nil && options.UseNTVariant {
|
||||||
|
oa := winapi.ObjectAttributes{
|
||||||
|
Length: unsafe.Sizeof(winapi.ObjectAttributes{}),
|
||||||
|
ObjectName: unicodeJobName,
|
||||||
|
Attributes: 0,
|
||||||
|
}
|
||||||
|
status := winapi.NtOpenJobObject(&jobHandle, winapi.JOB_OBJECT_ALL_ACCESS, &oa)
|
||||||
|
if status != 0 {
|
||||||
|
return nil, winapi.RtlNtStatusToDosError(status)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
jobHandle, err = winapi.OpenJobObject(winapi.JOB_OBJECT_ALL_ACCESS, false, unicodeJobName.Buffer)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
defer func() {
|
||||||
|
if err != nil {
|
||||||
|
windows.Close(jobHandle)
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
job := &JobObject{
|
||||||
|
handle: jobHandle,
|
||||||
|
}
|
||||||
|
|
||||||
|
// If the IOCP we'll be using to receive messages for all jobs hasn't been
|
||||||
|
// created, create it and start polling.
|
||||||
|
if options != nil && options.Notifications {
|
||||||
|
mq, err := setupNotifications(ctx, job)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
job.mq = mq
|
||||||
|
}
|
||||||
|
|
||||||
|
return job, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// helper function to setup notifications for creating/opening a job object
|
||||||
|
func setupNotifications(ctx context.Context, job *JobObject) (*queue.MessageQueue, error) {
|
||||||
|
job.handleLock.RLock()
|
||||||
|
defer job.handleLock.RUnlock()
|
||||||
|
|
||||||
|
if job.handle == 0 {
|
||||||
|
return nil, ErrAlreadyClosed
|
||||||
|
}
|
||||||
|
|
||||||
|
ioInitOnce.Do(func() {
|
||||||
|
h, err := windows.CreateIoCompletionPort(windows.InvalidHandle, 0, 0, 0xffffffff)
|
||||||
|
if err != nil {
|
||||||
|
initIOErr = err
|
||||||
|
return
|
||||||
|
}
|
||||||
|
ioCompletionPort = h
|
||||||
|
go pollIOCP(ctx, h)
|
||||||
|
})
|
||||||
|
|
||||||
|
if initIOErr != nil {
|
||||||
|
return nil, initIOErr
|
||||||
|
}
|
||||||
|
|
||||||
|
mq := queue.NewMessageQueue()
|
||||||
|
jobMap.Store(uintptr(job.handle), mq)
|
||||||
|
if err := attachIOCP(job.handle, ioCompletionPort); err != nil {
|
||||||
|
jobMap.Delete(uintptr(job.handle))
|
||||||
|
return nil, fmt.Errorf("failed to attach job to IO completion port: %w", err)
|
||||||
|
}
|
||||||
|
return mq, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// PollNotification will poll for a job object notification. This call should only be called once
|
||||||
|
// per job (ideally in a goroutine loop) and will block if there is not a notification ready.
|
||||||
|
// This call will return immediately with error `ErrNotRegistered` if the job was not registered
|
||||||
|
// to receive notifications during `Create`. Internally, messages will be queued and there
|
||||||
|
// is no worry of messages being dropped.
|
||||||
|
func (job *JobObject) PollNotification() (interface{}, error) {
|
||||||
|
if job.mq == nil {
|
||||||
|
return nil, ErrNotRegistered
|
||||||
|
}
|
||||||
|
return job.mq.Dequeue()
|
||||||
|
}
|
||||||
|
|
||||||
|
// UpdateProcThreadAttribute updates the passed in ProcThreadAttributeList to contain what is necessary to
|
||||||
|
// launch a process in a job at creation time. This can be used to avoid having to call Assign() after a process
|
||||||
|
// has already started running.
|
||||||
|
func (job *JobObject) UpdateProcThreadAttribute(attrList *windows.ProcThreadAttributeListContainer) error {
|
||||||
|
job.handleLock.RLock()
|
||||||
|
defer job.handleLock.RUnlock()
|
||||||
|
|
||||||
|
if job.handle == 0 {
|
||||||
|
return ErrAlreadyClosed
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := attrList.Update(
|
||||||
|
winapi.PROC_THREAD_ATTRIBUTE_JOB_LIST,
|
||||||
|
unsafe.Pointer(&job.handle),
|
||||||
|
unsafe.Sizeof(job.handle),
|
||||||
|
); err != nil {
|
||||||
|
return fmt.Errorf("failed to update proc thread attributes for job object: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Close closes the job object handle.
|
||||||
|
func (job *JobObject) Close() error {
|
||||||
|
job.handleLock.Lock()
|
||||||
|
defer job.handleLock.Unlock()
|
||||||
|
|
||||||
|
if job.handle == 0 {
|
||||||
|
return ErrAlreadyClosed
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := windows.Close(job.handle); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if job.mq != nil {
|
||||||
|
job.mq.Close()
|
||||||
|
}
|
||||||
|
// Handles now invalid so if the map entry to receive notifications for this job still
|
||||||
|
// exists remove it so we can stop receiving notifications.
|
||||||
|
if _, ok := jobMap.Load(uintptr(job.handle)); ok {
|
||||||
|
jobMap.Delete(uintptr(job.handle))
|
||||||
|
}
|
||||||
|
|
||||||
|
job.handle = 0
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Assign assigns a process to the job object.
|
||||||
|
func (job *JobObject) Assign(pid uint32) error {
|
||||||
|
job.handleLock.RLock()
|
||||||
|
defer job.handleLock.RUnlock()
|
||||||
|
|
||||||
|
if job.handle == 0 {
|
||||||
|
return ErrAlreadyClosed
|
||||||
|
}
|
||||||
|
|
||||||
|
if pid == 0 {
|
||||||
|
return errors.New("invalid pid: 0")
|
||||||
|
}
|
||||||
|
hProc, err := windows.OpenProcess(winapi.PROCESS_ALL_ACCESS, true, pid)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
defer windows.Close(hProc)
|
||||||
|
return windows.AssignProcessToJobObject(job.handle, hProc)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Terminate terminates the job, essentially calls TerminateProcess on every process in the
|
||||||
|
// job.
|
||||||
|
func (job *JobObject) Terminate(exitCode uint32) error {
|
||||||
|
job.handleLock.RLock()
|
||||||
|
defer job.handleLock.RUnlock()
|
||||||
|
if job.handle == 0 {
|
||||||
|
return ErrAlreadyClosed
|
||||||
|
}
|
||||||
|
return windows.TerminateJobObject(job.handle, exitCode)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Pids returns all of the process IDs in the job object.
|
||||||
|
func (job *JobObject) Pids() ([]uint32, error) {
|
||||||
|
job.handleLock.RLock()
|
||||||
|
defer job.handleLock.RUnlock()
|
||||||
|
|
||||||
|
if job.handle == 0 {
|
||||||
|
return nil, ErrAlreadyClosed
|
||||||
|
}
|
||||||
|
|
||||||
|
info := winapi.JOBOBJECT_BASIC_PROCESS_ID_LIST{}
|
||||||
|
err := winapi.QueryInformationJobObject(
|
||||||
|
job.handle,
|
||||||
|
winapi.JobObjectBasicProcessIdList,
|
||||||
|
unsafe.Pointer(&info),
|
||||||
|
uint32(unsafe.Sizeof(info)),
|
||||||
|
nil,
|
||||||
|
)
|
||||||
|
|
||||||
|
// This is either the case where there is only one process or no processes in
|
||||||
|
// the job. Any other case will result in ERROR_MORE_DATA. Check if info.NumberOfProcessIdsInList
|
||||||
|
// is 1 and just return this, otherwise return an empty slice.
|
||||||
|
if err == nil {
|
||||||
|
if info.NumberOfProcessIdsInList == 1 {
|
||||||
|
return []uint32{uint32(info.ProcessIdList[0])}, nil
|
||||||
|
}
|
||||||
|
// Return empty slice instead of nil to play well with the caller of this.
|
||||||
|
// Do not return an error if no processes are running inside the job
|
||||||
|
return []uint32{}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
if err != winapi.ERROR_MORE_DATA {
|
||||||
|
return nil, fmt.Errorf("failed initial query for PIDs in job object: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
jobBasicProcessIDListSize := unsafe.Sizeof(info) + (unsafe.Sizeof(info.ProcessIdList[0]) * uintptr(info.NumberOfAssignedProcesses-1))
|
||||||
|
buf := make([]byte, jobBasicProcessIDListSize)
|
||||||
|
if err = winapi.QueryInformationJobObject(
|
||||||
|
job.handle,
|
||||||
|
winapi.JobObjectBasicProcessIdList,
|
||||||
|
unsafe.Pointer(&buf[0]),
|
||||||
|
uint32(len(buf)),
|
||||||
|
nil,
|
||||||
|
); err != nil {
|
||||||
|
return nil, fmt.Errorf("failed to query for PIDs in job object: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
bufInfo := (*winapi.JOBOBJECT_BASIC_PROCESS_ID_LIST)(unsafe.Pointer(&buf[0]))
|
||||||
|
pids := make([]uint32, bufInfo.NumberOfProcessIdsInList)
|
||||||
|
for i, bufPid := range bufInfo.AllPids() {
|
||||||
|
pids[i] = uint32(bufPid)
|
||||||
|
}
|
||||||
|
return pids, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// QueryMemoryStats gets the memory stats for the job object.
|
||||||
|
func (job *JobObject) QueryMemoryStats() (*winapi.JOBOBJECT_MEMORY_USAGE_INFORMATION, error) {
|
||||||
|
job.handleLock.RLock()
|
||||||
|
defer job.handleLock.RUnlock()
|
||||||
|
|
||||||
|
if job.handle == 0 {
|
||||||
|
return nil, ErrAlreadyClosed
|
||||||
|
}
|
||||||
|
|
||||||
|
info := winapi.JOBOBJECT_MEMORY_USAGE_INFORMATION{}
|
||||||
|
if err := winapi.QueryInformationJobObject(
|
||||||
|
job.handle,
|
||||||
|
winapi.JobObjectMemoryUsageInformation,
|
||||||
|
unsafe.Pointer(&info),
|
||||||
|
uint32(unsafe.Sizeof(info)),
|
||||||
|
nil,
|
||||||
|
); err != nil {
|
||||||
|
return nil, fmt.Errorf("failed to query for job object memory stats: %w", err)
|
||||||
|
}
|
||||||
|
return &info, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// QueryProcessorStats gets the processor stats for the job object.
|
||||||
|
func (job *JobObject) QueryProcessorStats() (*winapi.JOBOBJECT_BASIC_ACCOUNTING_INFORMATION, error) {
|
||||||
|
job.handleLock.RLock()
|
||||||
|
defer job.handleLock.RUnlock()
|
||||||
|
|
||||||
|
if job.handle == 0 {
|
||||||
|
return nil, ErrAlreadyClosed
|
||||||
|
}
|
||||||
|
|
||||||
|
info := winapi.JOBOBJECT_BASIC_ACCOUNTING_INFORMATION{}
|
||||||
|
if err := winapi.QueryInformationJobObject(
|
||||||
|
job.handle,
|
||||||
|
winapi.JobObjectBasicAccountingInformation,
|
||||||
|
unsafe.Pointer(&info),
|
||||||
|
uint32(unsafe.Sizeof(info)),
|
||||||
|
nil,
|
||||||
|
); err != nil {
|
||||||
|
return nil, fmt.Errorf("failed to query for job object process stats: %w", err)
|
||||||
|
}
|
||||||
|
return &info, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// QueryStorageStats gets the storage (I/O) stats for the job object. This call will error
|
||||||
|
// if either `EnableIOTracking` wasn't set to true on creation of the job, or SetIOTracking()
|
||||||
|
// hasn't been called since creation of the job.
|
||||||
|
func (job *JobObject) QueryStorageStats() (*winapi.JOBOBJECT_IO_ATTRIBUTION_INFORMATION, error) {
|
||||||
|
job.handleLock.RLock()
|
||||||
|
defer job.handleLock.RUnlock()
|
||||||
|
|
||||||
|
if job.handle == 0 {
|
||||||
|
return nil, ErrAlreadyClosed
|
||||||
|
}
|
||||||
|
|
||||||
|
info := winapi.JOBOBJECT_IO_ATTRIBUTION_INFORMATION{
|
||||||
|
ControlFlags: winapi.JOBOBJECT_IO_ATTRIBUTION_CONTROL_ENABLE,
|
||||||
|
}
|
||||||
|
if err := winapi.QueryInformationJobObject(
|
||||||
|
job.handle,
|
||||||
|
winapi.JobObjectIoAttribution,
|
||||||
|
unsafe.Pointer(&info),
|
||||||
|
uint32(unsafe.Sizeof(info)),
|
||||||
|
nil,
|
||||||
|
); err != nil {
|
||||||
|
return nil, fmt.Errorf("failed to query for job object storage stats: %w", err)
|
||||||
|
}
|
||||||
|
return &info, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// QueryPrivateWorkingSet returns the private working set size for the job. This is calculated by adding up the
|
||||||
|
// private working set for every process running in the job.
|
||||||
|
func (job *JobObject) QueryPrivateWorkingSet() (uint64, error) {
|
||||||
|
pids, err := job.Pids()
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
|
||||||
|
openAndQueryWorkingSet := func(pid uint32) (uint64, error) {
|
||||||
|
h, err := windows.OpenProcess(windows.PROCESS_QUERY_LIMITED_INFORMATION, false, pid)
|
||||||
|
if err != nil {
|
||||||
|
// Continue to the next if OpenProcess doesn't return a valid handle (fails). Handles a
|
||||||
|
// case where one of the pids in the job exited before we open.
|
||||||
|
return 0, nil
|
||||||
|
}
|
||||||
|
defer func() {
|
||||||
|
_ = windows.Close(h)
|
||||||
|
}()
|
||||||
|
// Check if the process is actually running in the job still. There's a small chance
|
||||||
|
// that the process could have exited and had its pid re-used between grabbing the pids
|
||||||
|
// in the job and opening the handle to it above.
|
||||||
|
var inJob int32
|
||||||
|
if err := winapi.IsProcessInJob(h, job.handle, &inJob); err != nil {
|
||||||
|
// This shouldn't fail unless we have incorrect access rights which we control
|
||||||
|
// here so probably best to error out if this failed.
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
// Don't report stats for this process as it's not running in the job. This shouldn't be
|
||||||
|
// an error condition though.
|
||||||
|
if inJob == 0 {
|
||||||
|
return 0, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
var vmCounters winapi.VM_COUNTERS_EX2
|
||||||
|
status := winapi.NtQueryInformationProcess(
|
||||||
|
h,
|
||||||
|
winapi.ProcessVmCounters,
|
||||||
|
unsafe.Pointer(&vmCounters),
|
||||||
|
uint32(unsafe.Sizeof(vmCounters)),
|
||||||
|
nil,
|
||||||
|
)
|
||||||
|
if !winapi.NTSuccess(status) {
|
||||||
|
return 0, fmt.Errorf("failed to query information for process: %w", winapi.RtlNtStatusToDosError(status))
|
||||||
|
}
|
||||||
|
return uint64(vmCounters.PrivateWorkingSetSize), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
var jobWorkingSetSize uint64
|
||||||
|
for _, pid := range pids {
|
||||||
|
workingSet, err := openAndQueryWorkingSet(pid)
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
jobWorkingSetSize += workingSet
|
||||||
|
}
|
||||||
|
|
||||||
|
return jobWorkingSetSize, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// SetIOTracking enables IO tracking for processes in the job object.
|
||||||
|
// This enables use of the QueryStorageStats method.
|
||||||
|
func (job *JobObject) SetIOTracking() error {
|
||||||
|
job.handleLock.RLock()
|
||||||
|
defer job.handleLock.RUnlock()
|
||||||
|
|
||||||
|
if job.handle == 0 {
|
||||||
|
return ErrAlreadyClosed
|
||||||
|
}
|
||||||
|
|
||||||
|
return enableIOTracking(job.handle)
|
||||||
|
}
|
||||||
|
|
||||||
|
func enableIOTracking(job windows.Handle) error {
|
||||||
|
info := winapi.JOBOBJECT_IO_ATTRIBUTION_INFORMATION{
|
||||||
|
ControlFlags: winapi.JOBOBJECT_IO_ATTRIBUTION_CONTROL_ENABLE,
|
||||||
|
}
|
||||||
|
if _, err := windows.SetInformationJobObject(
|
||||||
|
job,
|
||||||
|
winapi.JobObjectIoAttribution,
|
||||||
|
uintptr(unsafe.Pointer(&info)),
|
||||||
|
uint32(unsafe.Sizeof(info)),
|
||||||
|
); err != nil {
|
||||||
|
return fmt.Errorf("failed to enable IO tracking on job object: %w", err)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
315
vendor/github.com/Microsoft/hcsshim/internal/jobobject/limits.go
generated
vendored
Normal file
315
vendor/github.com/Microsoft/hcsshim/internal/jobobject/limits.go
generated
vendored
Normal file
@ -0,0 +1,315 @@
|
|||||||
|
package jobobject
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
"unsafe"
|
||||||
|
|
||||||
|
"github.com/Microsoft/hcsshim/internal/winapi"
|
||||||
|
"golang.org/x/sys/windows"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
memoryLimitMax uint64 = 0xffffffffffffffff
|
||||||
|
)
|
||||||
|
|
||||||
|
func isFlagSet(flag, controlFlags uint32) bool {
|
||||||
|
return (flag & controlFlags) == flag
|
||||||
|
}
|
||||||
|
|
||||||
|
// SetResourceLimits sets resource limits on the job object (cpu, memory, storage).
|
||||||
|
func (job *JobObject) SetResourceLimits(limits *JobLimits) error {
|
||||||
|
// Go through and check what limits were specified and apply them to the job.
|
||||||
|
if limits.MemoryLimitInBytes != 0 {
|
||||||
|
if err := job.SetMemoryLimit(limits.MemoryLimitInBytes); err != nil {
|
||||||
|
return fmt.Errorf("failed to set job object memory limit: %w", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if limits.CPULimit != 0 {
|
||||||
|
if err := job.SetCPULimit(RateBased, limits.CPULimit); err != nil {
|
||||||
|
return fmt.Errorf("failed to set job object cpu limit: %w", err)
|
||||||
|
}
|
||||||
|
} else if limits.CPUWeight != 0 {
|
||||||
|
if err := job.SetCPULimit(WeightBased, limits.CPUWeight); err != nil {
|
||||||
|
return fmt.Errorf("failed to set job object cpu limit: %w", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if limits.MaxBandwidth != 0 || limits.MaxIOPS != 0 {
|
||||||
|
if err := job.SetIOLimit(limits.MaxBandwidth, limits.MaxIOPS); err != nil {
|
||||||
|
return fmt.Errorf("failed to set io limit on job object: %w", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// SetTerminateOnLastHandleClose sets the job object flag that specifies that the job should terminate
|
||||||
|
// all processes in the job on the last open handle being closed.
|
||||||
|
func (job *JobObject) SetTerminateOnLastHandleClose() error {
|
||||||
|
info, err := job.getExtendedInformation()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
info.BasicLimitInformation.LimitFlags |= windows.JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE
|
||||||
|
return job.setExtendedInformation(info)
|
||||||
|
}
|
||||||
|
|
||||||
|
// SetMemoryLimit sets the memory limit of the job object based on the given `memoryLimitInBytes`.
|
||||||
|
func (job *JobObject) SetMemoryLimit(memoryLimitInBytes uint64) error {
|
||||||
|
if memoryLimitInBytes >= memoryLimitMax {
|
||||||
|
return errors.New("memory limit specified exceeds the max size")
|
||||||
|
}
|
||||||
|
|
||||||
|
info, err := job.getExtendedInformation()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
info.JobMemoryLimit = uintptr(memoryLimitInBytes)
|
||||||
|
info.BasicLimitInformation.LimitFlags |= windows.JOB_OBJECT_LIMIT_JOB_MEMORY
|
||||||
|
return job.setExtendedInformation(info)
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetMemoryLimit gets the memory limit in bytes of the job object.
|
||||||
|
func (job *JobObject) GetMemoryLimit() (uint64, error) {
|
||||||
|
info, err := job.getExtendedInformation()
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
return uint64(info.JobMemoryLimit), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// SetCPULimit sets the CPU limit depending on the specified `CPURateControlType` to
|
||||||
|
// `rateControlValue` for the job object.
|
||||||
|
func (job *JobObject) SetCPULimit(rateControlType CPURateControlType, rateControlValue uint32) error {
|
||||||
|
cpuInfo, err := job.getCPURateControlInformation()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
switch rateControlType {
|
||||||
|
case WeightBased:
|
||||||
|
if rateControlValue < cpuWeightMin || rateControlValue > cpuWeightMax {
|
||||||
|
return fmt.Errorf("processor weight value of `%d` is invalid", rateControlValue)
|
||||||
|
}
|
||||||
|
cpuInfo.ControlFlags |= winapi.JOB_OBJECT_CPU_RATE_CONTROL_ENABLE | winapi.JOB_OBJECT_CPU_RATE_CONTROL_WEIGHT_BASED
|
||||||
|
cpuInfo.Value = rateControlValue
|
||||||
|
case RateBased:
|
||||||
|
if rateControlValue < cpuLimitMin || rateControlValue > cpuLimitMax {
|
||||||
|
return fmt.Errorf("processor rate of `%d` is invalid", rateControlValue)
|
||||||
|
}
|
||||||
|
cpuInfo.ControlFlags |= winapi.JOB_OBJECT_CPU_RATE_CONTROL_ENABLE | winapi.JOB_OBJECT_CPU_RATE_CONTROL_HARD_CAP
|
||||||
|
cpuInfo.Value = rateControlValue
|
||||||
|
default:
|
||||||
|
return errors.New("invalid job object cpu rate control type")
|
||||||
|
}
|
||||||
|
return job.setCPURateControlInfo(cpuInfo)
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetCPULimit gets the cpu limits for the job object.
|
||||||
|
// `rateControlType` is used to indicate what type of cpu limit to query for.
|
||||||
|
func (job *JobObject) GetCPULimit(rateControlType CPURateControlType) (uint32, error) {
|
||||||
|
info, err := job.getCPURateControlInformation()
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if !isFlagSet(winapi.JOB_OBJECT_CPU_RATE_CONTROL_ENABLE, info.ControlFlags) {
|
||||||
|
return 0, errors.New("the job does not have cpu rate control enabled")
|
||||||
|
}
|
||||||
|
|
||||||
|
switch rateControlType {
|
||||||
|
case WeightBased:
|
||||||
|
if !isFlagSet(winapi.JOB_OBJECT_CPU_RATE_CONTROL_WEIGHT_BASED, info.ControlFlags) {
|
||||||
|
return 0, errors.New("cannot get cpu weight for job object without cpu weight option set")
|
||||||
|
}
|
||||||
|
case RateBased:
|
||||||
|
if !isFlagSet(winapi.JOB_OBJECT_CPU_RATE_CONTROL_HARD_CAP, info.ControlFlags) {
|
||||||
|
return 0, errors.New("cannot get cpu rate hard cap for job object without cpu rate hard cap option set")
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
return 0, errors.New("invalid job object cpu rate control type")
|
||||||
|
}
|
||||||
|
return info.Value, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// SetCPUAffinity sets the processor affinity for the job object.
|
||||||
|
// The affinity is passed in as a bitmask.
|
||||||
|
func (job *JobObject) SetCPUAffinity(affinityBitMask uint64) error {
|
||||||
|
info, err := job.getExtendedInformation()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
info.BasicLimitInformation.LimitFlags |= uint32(windows.JOB_OBJECT_LIMIT_AFFINITY)
|
||||||
|
info.BasicLimitInformation.Affinity = uintptr(affinityBitMask)
|
||||||
|
return job.setExtendedInformation(info)
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetCPUAffinity gets the processor affinity for the job object.
|
||||||
|
// The returned affinity is a bitmask.
|
||||||
|
func (job *JobObject) GetCPUAffinity() (uint64, error) {
|
||||||
|
info, err := job.getExtendedInformation()
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
return uint64(info.BasicLimitInformation.Affinity), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// SetIOLimit sets the IO limits specified on the job object.
|
||||||
|
func (job *JobObject) SetIOLimit(maxBandwidth, maxIOPS int64) error {
|
||||||
|
ioInfo, err := job.getIOLimit()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
ioInfo.ControlFlags |= winapi.JOB_OBJECT_IO_RATE_CONTROL_ENABLE
|
||||||
|
if maxBandwidth != 0 {
|
||||||
|
ioInfo.MaxBandwidth = maxBandwidth
|
||||||
|
}
|
||||||
|
if maxIOPS != 0 {
|
||||||
|
ioInfo.MaxIops = maxIOPS
|
||||||
|
}
|
||||||
|
return job.setIORateControlInfo(ioInfo)
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetIOMaxBandwidthLimit gets the max bandwidth for the job object.
|
||||||
|
func (job *JobObject) GetIOMaxBandwidthLimit() (int64, error) {
|
||||||
|
info, err := job.getIOLimit()
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
return info.MaxBandwidth, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetIOMaxIopsLimit gets the max iops for the job object.
|
||||||
|
func (job *JobObject) GetIOMaxIopsLimit() (int64, error) {
|
||||||
|
info, err := job.getIOLimit()
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
return info.MaxIops, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Helper function for getting a job object's extended information.
|
||||||
|
func (job *JobObject) getExtendedInformation() (*windows.JOBOBJECT_EXTENDED_LIMIT_INFORMATION, error) {
|
||||||
|
job.handleLock.RLock()
|
||||||
|
defer job.handleLock.RUnlock()
|
||||||
|
|
||||||
|
if job.handle == 0 {
|
||||||
|
return nil, ErrAlreadyClosed
|
||||||
|
}
|
||||||
|
|
||||||
|
info := windows.JOBOBJECT_EXTENDED_LIMIT_INFORMATION{}
|
||||||
|
if err := winapi.QueryInformationJobObject(
|
||||||
|
job.handle,
|
||||||
|
windows.JobObjectExtendedLimitInformation,
|
||||||
|
unsafe.Pointer(&info),
|
||||||
|
uint32(unsafe.Sizeof(info)),
|
||||||
|
nil,
|
||||||
|
); err != nil {
|
||||||
|
return nil, fmt.Errorf("query %v returned error: %w", info, err)
|
||||||
|
}
|
||||||
|
return &info, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Helper function for getting a job object's CPU rate control information.
|
||||||
|
func (job *JobObject) getCPURateControlInformation() (*winapi.JOBOBJECT_CPU_RATE_CONTROL_INFORMATION, error) {
|
||||||
|
job.handleLock.RLock()
|
||||||
|
defer job.handleLock.RUnlock()
|
||||||
|
|
||||||
|
if job.handle == 0 {
|
||||||
|
return nil, ErrAlreadyClosed
|
||||||
|
}
|
||||||
|
|
||||||
|
info := winapi.JOBOBJECT_CPU_RATE_CONTROL_INFORMATION{}
|
||||||
|
if err := winapi.QueryInformationJobObject(
|
||||||
|
job.handle,
|
||||||
|
windows.JobObjectCpuRateControlInformation,
|
||||||
|
unsafe.Pointer(&info),
|
||||||
|
uint32(unsafe.Sizeof(info)),
|
||||||
|
nil,
|
||||||
|
); err != nil {
|
||||||
|
return nil, fmt.Errorf("query %v returned error: %w", info, err)
|
||||||
|
}
|
||||||
|
return &info, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Helper function for setting a job object's extended information.
|
||||||
|
func (job *JobObject) setExtendedInformation(info *windows.JOBOBJECT_EXTENDED_LIMIT_INFORMATION) error {
|
||||||
|
job.handleLock.RLock()
|
||||||
|
defer job.handleLock.RUnlock()
|
||||||
|
|
||||||
|
if job.handle == 0 {
|
||||||
|
return ErrAlreadyClosed
|
||||||
|
}
|
||||||
|
|
||||||
|
if _, err := windows.SetInformationJobObject(
|
||||||
|
job.handle,
|
||||||
|
windows.JobObjectExtendedLimitInformation,
|
||||||
|
uintptr(unsafe.Pointer(info)),
|
||||||
|
uint32(unsafe.Sizeof(*info)),
|
||||||
|
); err != nil {
|
||||||
|
return fmt.Errorf("failed to set Extended info %v on job object: %w", info, err)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Helper function for querying job handle for IO limit information.
|
||||||
|
func (job *JobObject) getIOLimit() (*winapi.JOBOBJECT_IO_RATE_CONTROL_INFORMATION, error) {
|
||||||
|
job.handleLock.RLock()
|
||||||
|
defer job.handleLock.RUnlock()
|
||||||
|
|
||||||
|
if job.handle == 0 {
|
||||||
|
return nil, ErrAlreadyClosed
|
||||||
|
}
|
||||||
|
|
||||||
|
ioInfo := &winapi.JOBOBJECT_IO_RATE_CONTROL_INFORMATION{}
|
||||||
|
var blockCount uint32 = 1
|
||||||
|
|
||||||
|
if _, err := winapi.QueryIoRateControlInformationJobObject(
|
||||||
|
job.handle,
|
||||||
|
nil,
|
||||||
|
&ioInfo,
|
||||||
|
&blockCount,
|
||||||
|
); err != nil {
|
||||||
|
return nil, fmt.Errorf("query %v returned error: %w", ioInfo, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if !isFlagSet(winapi.JOB_OBJECT_IO_RATE_CONTROL_ENABLE, ioInfo.ControlFlags) {
|
||||||
|
return nil, fmt.Errorf("query %v cannot get IO limits for job object without IO rate control option set", ioInfo)
|
||||||
|
}
|
||||||
|
return ioInfo, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Helper function for setting a job object's IO rate control information.
|
||||||
|
func (job *JobObject) setIORateControlInfo(ioInfo *winapi.JOBOBJECT_IO_RATE_CONTROL_INFORMATION) error {
|
||||||
|
job.handleLock.RLock()
|
||||||
|
defer job.handleLock.RUnlock()
|
||||||
|
|
||||||
|
if job.handle == 0 {
|
||||||
|
return ErrAlreadyClosed
|
||||||
|
}
|
||||||
|
|
||||||
|
if _, err := winapi.SetIoRateControlInformationJobObject(job.handle, ioInfo); err != nil {
|
||||||
|
return fmt.Errorf("failed to set IO limit info %v on job object: %w", ioInfo, err)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Helper function for setting a job object's CPU rate control information.
|
||||||
|
func (job *JobObject) setCPURateControlInfo(cpuInfo *winapi.JOBOBJECT_CPU_RATE_CONTROL_INFORMATION) error {
|
||||||
|
job.handleLock.RLock()
|
||||||
|
defer job.handleLock.RUnlock()
|
||||||
|
|
||||||
|
if job.handle == 0 {
|
||||||
|
return ErrAlreadyClosed
|
||||||
|
}
|
||||||
|
if _, err := windows.SetInformationJobObject(
|
||||||
|
job.handle,
|
||||||
|
windows.JobObjectCpuRateControlInformation,
|
||||||
|
uintptr(unsafe.Pointer(cpuInfo)),
|
||||||
|
uint32(unsafe.Sizeof(cpuInfo)),
|
||||||
|
); err != nil {
|
||||||
|
return fmt.Errorf("failed to set cpu limit info %v on job object: %w", cpuInfo, err)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
92
vendor/github.com/Microsoft/hcsshim/internal/queue/mq.go
generated
vendored
Normal file
92
vendor/github.com/Microsoft/hcsshim/internal/queue/mq.go
generated
vendored
Normal file
@ -0,0 +1,92 @@
|
|||||||
|
package queue
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"sync"
|
||||||
|
)
|
||||||
|
|
||||||
|
var ErrQueueClosed = errors.New("the queue is closed for reading and writing")
|
||||||
|
|
||||||
|
// MessageQueue represents a threadsafe message queue to be used to retrieve or
|
||||||
|
// write messages to.
|
||||||
|
type MessageQueue struct {
|
||||||
|
m *sync.RWMutex
|
||||||
|
c *sync.Cond
|
||||||
|
messages []interface{}
|
||||||
|
closed bool
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewMessageQueue returns a new MessageQueue.
|
||||||
|
func NewMessageQueue() *MessageQueue {
|
||||||
|
m := &sync.RWMutex{}
|
||||||
|
return &MessageQueue{
|
||||||
|
m: m,
|
||||||
|
c: sync.NewCond(m),
|
||||||
|
messages: []interface{}{},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Enqueue writes `msg` to the queue.
|
||||||
|
func (mq *MessageQueue) Enqueue(msg interface{}) error {
|
||||||
|
mq.m.Lock()
|
||||||
|
defer mq.m.Unlock()
|
||||||
|
|
||||||
|
if mq.closed {
|
||||||
|
return ErrQueueClosed
|
||||||
|
}
|
||||||
|
mq.messages = append(mq.messages, msg)
|
||||||
|
// Signal a waiter that there is now a value available in the queue.
|
||||||
|
mq.c.Signal()
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Dequeue will read a value from the queue and remove it. If the queue
|
||||||
|
// is empty, this will block until the queue is closed or a value gets enqueued.
|
||||||
|
func (mq *MessageQueue) Dequeue() (interface{}, error) {
|
||||||
|
mq.m.Lock()
|
||||||
|
defer mq.m.Unlock()
|
||||||
|
|
||||||
|
for !mq.closed && mq.size() == 0 {
|
||||||
|
mq.c.Wait()
|
||||||
|
}
|
||||||
|
|
||||||
|
// We got woken up, check if it's because the queue got closed.
|
||||||
|
if mq.closed {
|
||||||
|
return nil, ErrQueueClosed
|
||||||
|
}
|
||||||
|
|
||||||
|
val := mq.messages[0]
|
||||||
|
mq.messages[0] = nil
|
||||||
|
mq.messages = mq.messages[1:]
|
||||||
|
return val, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Size returns the size of the queue.
|
||||||
|
func (mq *MessageQueue) Size() int {
|
||||||
|
mq.m.RLock()
|
||||||
|
defer mq.m.RUnlock()
|
||||||
|
return mq.size()
|
||||||
|
}
|
||||||
|
|
||||||
|
// Nonexported size check to check if the queue is empty inside already locked functions.
|
||||||
|
func (mq *MessageQueue) size() int {
|
||||||
|
return len(mq.messages)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Close closes the queue for future writes or reads. Any attempts to read or write from the
|
||||||
|
// queue after close will return ErrQueueClosed. This is safe to call multiple times.
|
||||||
|
func (mq *MessageQueue) Close() {
|
||||||
|
mq.m.Lock()
|
||||||
|
defer mq.m.Unlock()
|
||||||
|
|
||||||
|
// Already closed, noop
|
||||||
|
if mq.closed {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
mq.messages = nil
|
||||||
|
mq.closed = true
|
||||||
|
// If there's anybody currently waiting on a value from Dequeue, we need to
|
||||||
|
// broadcast so the read(s) can return ErrQueueClosed.
|
||||||
|
mq.c.Broadcast()
|
||||||
|
}
|
4
vendor/github.com/Microsoft/hcsshim/internal/regstate/regstate.go
generated
vendored
4
vendor/github.com/Microsoft/hcsshim/internal/regstate/regstate.go
generated
vendored
@ -34,11 +34,11 @@ var localUser = &Key{registry.CURRENT_USER, "HKEY_CURRENT_USER"}
|
|||||||
var rootPath = `SOFTWARE\Microsoft\runhcs`
|
var rootPath = `SOFTWARE\Microsoft\runhcs`
|
||||||
|
|
||||||
type NotFoundError struct {
|
type NotFoundError struct {
|
||||||
Id string
|
ID string
|
||||||
}
|
}
|
||||||
|
|
||||||
func (err *NotFoundError) Error() string {
|
func (err *NotFoundError) Error() string {
|
||||||
return fmt.Sprintf("ID '%s' was not found", err.Id)
|
return fmt.Sprintf("ID '%s' was not found", err.ID)
|
||||||
}
|
}
|
||||||
|
|
||||||
func IsNotFoundError(err error) bool {
|
func IsNotFoundError(err error) bool {
|
||||||
|
2
vendor/github.com/Microsoft/hcsshim/internal/wclayer/activatelayer.go
generated
vendored
2
vendor/github.com/Microsoft/hcsshim/internal/wclayer/activatelayer.go
generated
vendored
@ -21,7 +21,7 @@ func ActivateLayer(ctx context.Context, path string) (err error) {
|
|||||||
|
|
||||||
err = activateLayer(&stdDriverInfo, path)
|
err = activateLayer(&stdDriverInfo, path)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return hcserror.New(err, title+" - failed", "")
|
return hcserror.New(err, title, "")
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
2
vendor/github.com/Microsoft/hcsshim/internal/wclayer/createlayer.go
generated
vendored
2
vendor/github.com/Microsoft/hcsshim/internal/wclayer/createlayer.go
generated
vendored
@ -21,7 +21,7 @@ func CreateLayer(ctx context.Context, path, parent string) (err error) {
|
|||||||
|
|
||||||
err = createLayer(&stdDriverInfo, path, parent)
|
err = createLayer(&stdDriverInfo, path, parent)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return hcserror.New(err, title+" - failed", "")
|
return hcserror.New(err, title, "")
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
2
vendor/github.com/Microsoft/hcsshim/internal/wclayer/createscratchlayer.go
generated
vendored
2
vendor/github.com/Microsoft/hcsshim/internal/wclayer/createscratchlayer.go
generated
vendored
@ -28,7 +28,7 @@ func CreateScratchLayer(ctx context.Context, path string, parentLayerPaths []str
|
|||||||
|
|
||||||
err = createSandboxLayer(&stdDriverInfo, path, 0, layers)
|
err = createSandboxLayer(&stdDriverInfo, path, 0, layers)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return hcserror.New(err, title+" - failed", "")
|
return hcserror.New(err, title, "")
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
2
vendor/github.com/Microsoft/hcsshim/internal/wclayer/destroylayer.go
generated
vendored
2
vendor/github.com/Microsoft/hcsshim/internal/wclayer/destroylayer.go
generated
vendored
@ -19,7 +19,7 @@ func DestroyLayer(ctx context.Context, path string) (err error) {
|
|||||||
|
|
||||||
err = destroyLayer(&stdDriverInfo, path)
|
err = destroyLayer(&stdDriverInfo, path)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return hcserror.New(err, title+" - failed", "")
|
return hcserror.New(err, title, "")
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
2
vendor/github.com/Microsoft/hcsshim/internal/wclayer/expandscratchsize.go
generated
vendored
2
vendor/github.com/Microsoft/hcsshim/internal/wclayer/expandscratchsize.go
generated
vendored
@ -25,7 +25,7 @@ func ExpandScratchSize(ctx context.Context, path string, size uint64) (err error
|
|||||||
|
|
||||||
err = expandSandboxSize(&stdDriverInfo, path, size)
|
err = expandSandboxSize(&stdDriverInfo, path, size)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return hcserror.New(err, title+" - failed", "")
|
return hcserror.New(err, title, "")
|
||||||
}
|
}
|
||||||
|
|
||||||
// Manually expand the volume now in order to work around bugs in 19H1 and
|
// Manually expand the volume now in order to work around bugs in 19H1 and
|
||||||
|
2
vendor/github.com/Microsoft/hcsshim/internal/wclayer/exportlayer.go
generated
vendored
2
vendor/github.com/Microsoft/hcsshim/internal/wclayer/exportlayer.go
generated
vendored
@ -35,7 +35,7 @@ func ExportLayer(ctx context.Context, path string, exportFolderPath string, pare
|
|||||||
|
|
||||||
err = exportLayer(&stdDriverInfo, path, exportFolderPath, layers)
|
err = exportLayer(&stdDriverInfo, path, exportFolderPath, layers)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return hcserror.New(err, title+" - failed", "")
|
return hcserror.New(err, title, "")
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
4
vendor/github.com/Microsoft/hcsshim/internal/wclayer/getlayermountpath.go
generated
vendored
4
vendor/github.com/Microsoft/hcsshim/internal/wclayer/getlayermountpath.go
generated
vendored
@ -27,7 +27,7 @@ func GetLayerMountPath(ctx context.Context, path string) (_ string, err error) {
|
|||||||
log.G(ctx).Debug("Calling proc (1)")
|
log.G(ctx).Debug("Calling proc (1)")
|
||||||
err = getLayerMountPath(&stdDriverInfo, path, &mountPathLength, nil)
|
err = getLayerMountPath(&stdDriverInfo, path, &mountPathLength, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", hcserror.New(err, title+" - failed", "(first call)")
|
return "", hcserror.New(err, title, "(first call)")
|
||||||
}
|
}
|
||||||
|
|
||||||
// Allocate a mount path of the returned length.
|
// Allocate a mount path of the returned length.
|
||||||
@ -41,7 +41,7 @@ func GetLayerMountPath(ctx context.Context, path string) (_ string, err error) {
|
|||||||
log.G(ctx).Debug("Calling proc (2)")
|
log.G(ctx).Debug("Calling proc (2)")
|
||||||
err = getLayerMountPath(&stdDriverInfo, path, &mountPathLength, &mountPathp[0])
|
err = getLayerMountPath(&stdDriverInfo, path, &mountPathLength, &mountPathp[0])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", hcserror.New(err, title+" - failed", "(second call)")
|
return "", hcserror.New(err, title, "(second call)")
|
||||||
}
|
}
|
||||||
|
|
||||||
mountPath := syscall.UTF16ToString(mountPathp[0:])
|
mountPath := syscall.UTF16ToString(mountPathp[0:])
|
||||||
|
2
vendor/github.com/Microsoft/hcsshim/internal/wclayer/getsharedbaseimages.go
generated
vendored
2
vendor/github.com/Microsoft/hcsshim/internal/wclayer/getsharedbaseimages.go
generated
vendored
@ -21,7 +21,7 @@ func GetSharedBaseImages(ctx context.Context) (_ string, err error) {
|
|||||||
var buffer *uint16
|
var buffer *uint16
|
||||||
err = getBaseImages(&buffer)
|
err = getBaseImages(&buffer)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", hcserror.New(err, title+" - failed", "")
|
return "", hcserror.New(err, title, "")
|
||||||
}
|
}
|
||||||
imageData := interop.ConvertAndFreeCoTaskMemString(buffer)
|
imageData := interop.ConvertAndFreeCoTaskMemString(buffer)
|
||||||
span.AddAttributes(trace.StringAttribute("imageData", imageData))
|
span.AddAttributes(trace.StringAttribute("imageData", imageData))
|
||||||
|
2
vendor/github.com/Microsoft/hcsshim/internal/wclayer/grantvmaccess.go
generated
vendored
2
vendor/github.com/Microsoft/hcsshim/internal/wclayer/grantvmaccess.go
generated
vendored
@ -20,7 +20,7 @@ func GrantVmAccess(ctx context.Context, vmid string, filepath string) (err error
|
|||||||
|
|
||||||
err = grantVmAccess(vmid, filepath)
|
err = grantVmAccess(vmid, filepath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return hcserror.New(err, title+" - failed", "")
|
return hcserror.New(err, title, "")
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
2
vendor/github.com/Microsoft/hcsshim/internal/wclayer/importlayer.go
generated
vendored
2
vendor/github.com/Microsoft/hcsshim/internal/wclayer/importlayer.go
generated
vendored
@ -36,7 +36,7 @@ func ImportLayer(ctx context.Context, path string, importFolderPath string, pare
|
|||||||
|
|
||||||
err = importLayer(&stdDriverInfo, path, importFolderPath, layers)
|
err = importLayer(&stdDriverInfo, path, importFolderPath, layers)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return hcserror.New(err, title+" - failed", "")
|
return hcserror.New(err, title, "")
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
2
vendor/github.com/Microsoft/hcsshim/internal/wclayer/layerexists.go
generated
vendored
2
vendor/github.com/Microsoft/hcsshim/internal/wclayer/layerexists.go
generated
vendored
@ -21,7 +21,7 @@ func LayerExists(ctx context.Context, path string) (_ bool, err error) {
|
|||||||
var exists uint32
|
var exists uint32
|
||||||
err = layerExists(&stdDriverInfo, path, &exists)
|
err = layerExists(&stdDriverInfo, path, &exists)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false, hcserror.New(err, title+" - failed", "")
|
return false, hcserror.New(err, title, "")
|
||||||
}
|
}
|
||||||
span.AddAttributes(trace.BoolAttribute("layer-exists", exists != 0))
|
span.AddAttributes(trace.BoolAttribute("layer-exists", exists != 0))
|
||||||
return exists != 0, nil
|
return exists != 0, nil
|
||||||
|
2
vendor/github.com/Microsoft/hcsshim/internal/wclayer/legacy.go
generated
vendored
2
vendor/github.com/Microsoft/hcsshim/internal/wclayer/legacy.go
generated
vendored
@ -76,7 +76,7 @@ func readTombstones(path string) (map[string]([]string), error) {
|
|||||||
defer tf.Close()
|
defer tf.Close()
|
||||||
s := bufio.NewScanner(tf)
|
s := bufio.NewScanner(tf)
|
||||||
if !s.Scan() || s.Text() != "\xef\xbb\xbfVersion 1.0" {
|
if !s.Scan() || s.Text() != "\xef\xbb\xbfVersion 1.0" {
|
||||||
return nil, errors.New("Invalid tombstones file")
|
return nil, errors.New("invalid tombstones file")
|
||||||
}
|
}
|
||||||
|
|
||||||
ts := make(map[string]([]string))
|
ts := make(map[string]([]string))
|
||||||
|
4
vendor/github.com/Microsoft/hcsshim/internal/wclayer/nametoguid.go
generated
vendored
4
vendor/github.com/Microsoft/hcsshim/internal/wclayer/nametoguid.go
generated
vendored
@ -17,12 +17,12 @@ func NameToGuid(ctx context.Context, name string) (_ guid.GUID, err error) {
|
|||||||
ctx, span := trace.StartSpan(ctx, title) //nolint:ineffassign,staticcheck
|
ctx, span := trace.StartSpan(ctx, title) //nolint:ineffassign,staticcheck
|
||||||
defer span.End()
|
defer span.End()
|
||||||
defer func() { oc.SetSpanStatus(span, err) }()
|
defer func() { oc.SetSpanStatus(span, err) }()
|
||||||
span.AddAttributes(trace.StringAttribute("name", name))
|
span.AddAttributes(trace.StringAttribute("objectName", name))
|
||||||
|
|
||||||
var id guid.GUID
|
var id guid.GUID
|
||||||
err = nameToGuid(name, &id)
|
err = nameToGuid(name, &id)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return guid.GUID{}, hcserror.New(err, title+" - failed", "")
|
return guid.GUID{}, hcserror.New(err, title, "")
|
||||||
}
|
}
|
||||||
span.AddAttributes(trace.StringAttribute("guid", id.String()))
|
span.AddAttributes(trace.StringAttribute("guid", id.String()))
|
||||||
return id, nil
|
return id, nil
|
||||||
|
2
vendor/github.com/Microsoft/hcsshim/internal/wclayer/preparelayer.go
generated
vendored
2
vendor/github.com/Microsoft/hcsshim/internal/wclayer/preparelayer.go
generated
vendored
@ -38,7 +38,7 @@ func PrepareLayer(ctx context.Context, path string, parentLayerPaths []string) (
|
|||||||
defer prepareLayerLock.Unlock()
|
defer prepareLayerLock.Unlock()
|
||||||
err = prepareLayer(&stdDriverInfo, path, layers)
|
err = prepareLayer(&stdDriverInfo, path, layers)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return hcserror.New(err, title+" - failed", "")
|
return hcserror.New(err, title, "")
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
2
vendor/github.com/Microsoft/hcsshim/internal/wclayer/unpreparelayer.go
generated
vendored
2
vendor/github.com/Microsoft/hcsshim/internal/wclayer/unpreparelayer.go
generated
vendored
@ -19,7 +19,7 @@ func UnprepareLayer(ctx context.Context, path string) (err error) {
|
|||||||
|
|
||||||
err = unprepareLayer(&stdDriverInfo, path)
|
err = unprepareLayer(&stdDriverInfo, path)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return hcserror.New(err, title+" - failed", "")
|
return hcserror.New(err, title, "")
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
44
vendor/github.com/Microsoft/hcsshim/internal/winapi/console.go
generated
vendored
Normal file
44
vendor/github.com/Microsoft/hcsshim/internal/winapi/console.go
generated
vendored
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
package winapi
|
||||||
|
|
||||||
|
import (
|
||||||
|
"unsafe"
|
||||||
|
|
||||||
|
"golang.org/x/sys/windows"
|
||||||
|
)
|
||||||
|
|
||||||
|
const PSEUDOCONSOLE_INHERIT_CURSOR = 0x1
|
||||||
|
|
||||||
|
// CreatePseudoConsole creates a windows pseudo console.
|
||||||
|
func CreatePseudoConsole(size windows.Coord, hInput windows.Handle, hOutput windows.Handle, dwFlags uint32, hpcon *windows.Handle) error {
|
||||||
|
// We need this wrapper as the function takes a COORD struct and not a pointer to one, so we need to cast to something beforehand.
|
||||||
|
return createPseudoConsole(*((*uint32)(unsafe.Pointer(&size))), hInput, hOutput, 0, hpcon)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ResizePseudoConsole resizes the internal buffers of the pseudo console to the width and height specified in `size`.
|
||||||
|
func ResizePseudoConsole(hpcon windows.Handle, size windows.Coord) error {
|
||||||
|
// We need this wrapper as the function takes a COORD struct and not a pointer to one, so we need to cast to something beforehand.
|
||||||
|
return resizePseudoConsole(hpcon, *((*uint32)(unsafe.Pointer(&size))))
|
||||||
|
}
|
||||||
|
|
||||||
|
// HRESULT WINAPI CreatePseudoConsole(
|
||||||
|
// _In_ COORD size,
|
||||||
|
// _In_ HANDLE hInput,
|
||||||
|
// _In_ HANDLE hOutput,
|
||||||
|
// _In_ DWORD dwFlags,
|
||||||
|
// _Out_ HPCON* phPC
|
||||||
|
// );
|
||||||
|
//
|
||||||
|
//sys createPseudoConsole(size uint32, hInput windows.Handle, hOutput windows.Handle, dwFlags uint32, hpcon *windows.Handle) (hr error) = kernel32.CreatePseudoConsole
|
||||||
|
|
||||||
|
// void WINAPI ClosePseudoConsole(
|
||||||
|
// _In_ HPCON hPC
|
||||||
|
// );
|
||||||
|
//
|
||||||
|
//sys ClosePseudoConsole(hpc windows.Handle) = kernel32.ClosePseudoConsole
|
||||||
|
|
||||||
|
// HRESULT WINAPI ResizePseudoConsole(
|
||||||
|
// _In_ HPCON hPC ,
|
||||||
|
// _In_ COORD size
|
||||||
|
// );
|
||||||
|
//
|
||||||
|
//sys resizePseudoConsole(hPc windows.Handle, size uint32) (hr error) = kernel32.ResizePseudoConsole
|
3
vendor/github.com/Microsoft/hcsshim/internal/winapi/iocp.go
generated
vendored
3
vendor/github.com/Microsoft/hcsshim/internal/winapi/iocp.go
generated
vendored
@ -1,3 +0,0 @@
|
|||||||
package winapi
|
|
||||||
|
|
||||||
//sys GetQueuedCompletionStatus(cphandle windows.Handle, qty *uint32, key *uintptr, overlapped **windows.Overlapped, timeout uint32) (err error)
|
|
11
vendor/github.com/Microsoft/hcsshim/internal/winapi/jobobject.go
generated
vendored
11
vendor/github.com/Microsoft/hcsshim/internal/winapi/jobobject.go
generated
vendored
@ -24,7 +24,10 @@ const (
|
|||||||
// Access rights for creating or opening job objects.
|
// Access rights for creating or opening job objects.
|
||||||
//
|
//
|
||||||
// https://docs.microsoft.com/en-us/windows/win32/procthread/job-object-security-and-access-rights
|
// https://docs.microsoft.com/en-us/windows/win32/procthread/job-object-security-and-access-rights
|
||||||
const JOB_OBJECT_ALL_ACCESS = 0x1F001F
|
const (
|
||||||
|
JOB_OBJECT_QUERY = 0x0004
|
||||||
|
JOB_OBJECT_ALL_ACCESS = 0x1F001F
|
||||||
|
)
|
||||||
|
|
||||||
// IO limit flags
|
// IO limit flags
|
||||||
//
|
//
|
||||||
@ -93,7 +96,7 @@ type JOBOBJECT_BASIC_PROCESS_ID_LIST struct {
|
|||||||
|
|
||||||
// AllPids returns all the process Ids in the job object.
|
// AllPids returns all the process Ids in the job object.
|
||||||
func (p *JOBOBJECT_BASIC_PROCESS_ID_LIST) AllPids() []uintptr {
|
func (p *JOBOBJECT_BASIC_PROCESS_ID_LIST) AllPids() []uintptr {
|
||||||
return (*[(1 << 27) - 1]uintptr)(unsafe.Pointer(&p.ProcessIdList[0]))[:p.NumberOfProcessIdsInList]
|
return (*[(1 << 27) - 1]uintptr)(unsafe.Pointer(&p.ProcessIdList[0]))[:p.NumberOfProcessIdsInList:p.NumberOfProcessIdsInList]
|
||||||
}
|
}
|
||||||
|
|
||||||
// https://docs.microsoft.com/en-us/windows/win32/api/winnt/ns-winnt-jobobject_basic_accounting_information
|
// https://docs.microsoft.com/en-us/windows/win32/api/winnt/ns-winnt-jobobject_basic_accounting_information
|
||||||
@ -162,7 +165,7 @@ type JOBOBJECT_ASSOCIATE_COMPLETION_PORT struct {
|
|||||||
// PBOOL Result
|
// PBOOL Result
|
||||||
// );
|
// );
|
||||||
//
|
//
|
||||||
//sys IsProcessInJob(procHandle windows.Handle, jobHandle windows.Handle, result *bool) (err error) = kernel32.IsProcessInJob
|
//sys IsProcessInJob(procHandle windows.Handle, jobHandle windows.Handle, result *int32) (err error) = kernel32.IsProcessInJob
|
||||||
|
|
||||||
// BOOL QueryInformationJobObject(
|
// BOOL QueryInformationJobObject(
|
||||||
// HANDLE hJob,
|
// HANDLE hJob,
|
||||||
@ -172,7 +175,7 @@ type JOBOBJECT_ASSOCIATE_COMPLETION_PORT struct {
|
|||||||
// LPDWORD lpReturnLength
|
// LPDWORD lpReturnLength
|
||||||
// );
|
// );
|
||||||
//
|
//
|
||||||
//sys QueryInformationJobObject(jobHandle windows.Handle, infoClass uint32, jobObjectInfo uintptr, jobObjectInformationLength uint32, lpReturnLength *uint32) (err error) = kernel32.QueryInformationJobObject
|
//sys QueryInformationJobObject(jobHandle windows.Handle, infoClass uint32, jobObjectInfo unsafe.Pointer, jobObjectInformationLength uint32, lpReturnLength *uint32) (err error) = kernel32.QueryInformationJobObject
|
||||||
|
|
||||||
// HANDLE OpenJobObjectW(
|
// HANDLE OpenJobObjectW(
|
||||||
// DWORD dwDesiredAccess,
|
// DWORD dwDesiredAccess,
|
||||||
|
23
vendor/github.com/Microsoft/hcsshim/internal/winapi/memory.go
generated
vendored
23
vendor/github.com/Microsoft/hcsshim/internal/winapi/memory.go
generated
vendored
@ -1,27 +1,4 @@
|
|||||||
package winapi
|
package winapi
|
||||||
|
|
||||||
// VOID RtlMoveMemory(
|
|
||||||
// _Out_ VOID UNALIGNED *Destination,
|
|
||||||
// _In_ const VOID UNALIGNED *Source,
|
|
||||||
// _In_ SIZE_T Length
|
|
||||||
// );
|
|
||||||
//sys RtlMoveMemory(destination *byte, source *byte, length uintptr) (err error) = kernel32.RtlMoveMemory
|
|
||||||
|
|
||||||
//sys LocalAlloc(flags uint32, size int) (ptr uintptr) = kernel32.LocalAlloc
|
//sys LocalAlloc(flags uint32, size int) (ptr uintptr) = kernel32.LocalAlloc
|
||||||
//sys LocalFree(ptr uintptr) = kernel32.LocalFree
|
//sys LocalFree(ptr uintptr) = kernel32.LocalFree
|
||||||
|
|
||||||
// BOOL QueryWorkingSet(
|
|
||||||
// HANDLE hProcess,
|
|
||||||
// PVOID pv,
|
|
||||||
// DWORD cb
|
|
||||||
// );
|
|
||||||
//sys QueryWorkingSet(handle windows.Handle, pv uintptr, cb uint32) (err error) = psapi.QueryWorkingSet
|
|
||||||
|
|
||||||
type PSAPI_WORKING_SET_INFORMATION struct {
|
|
||||||
NumberOfEntries uintptr
|
|
||||||
WorkingSetInfo [1]PSAPI_WORKING_SET_BLOCK
|
|
||||||
}
|
|
||||||
|
|
||||||
type PSAPI_WORKING_SET_BLOCK struct {
|
|
||||||
Flags uintptr
|
|
||||||
}
|
|
||||||
|
65
vendor/github.com/Microsoft/hcsshim/internal/winapi/process.go
generated
vendored
65
vendor/github.com/Microsoft/hcsshim/internal/winapi/process.go
generated
vendored
@ -2,9 +2,64 @@ package winapi
|
|||||||
|
|
||||||
const PROCESS_ALL_ACCESS uint32 = 2097151
|
const PROCESS_ALL_ACCESS uint32 = 2097151
|
||||||
|
|
||||||
// DWORD GetProcessImageFileNameW(
|
const (
|
||||||
// HANDLE hProcess,
|
PROC_THREAD_ATTRIBUTE_PSEUDOCONSOLE = 0x20016
|
||||||
// LPWSTR lpImageFileName,
|
PROC_THREAD_ATTRIBUTE_JOB_LIST = 0x2000D
|
||||||
// DWORD nSize
|
)
|
||||||
|
|
||||||
|
// ProcessVmCounters corresponds to the _VM_COUNTERS_EX and _VM_COUNTERS_EX2 structures.
|
||||||
|
const ProcessVmCounters = 3
|
||||||
|
|
||||||
|
// __kernel_entry NTSTATUS NtQueryInformationProcess(
|
||||||
|
// [in] HANDLE ProcessHandle,
|
||||||
|
// [in] PROCESSINFOCLASS ProcessInformationClass,
|
||||||
|
// [out] PVOID ProcessInformation,
|
||||||
|
// [in] ULONG ProcessInformationLength,
|
||||||
|
// [out, optional] PULONG ReturnLength
|
||||||
// );
|
// );
|
||||||
//sys GetProcessImageFileName(hProcess windows.Handle, imageFileName *uint16, nSize uint32) (size uint32, err error) = kernel32.GetProcessImageFileNameW
|
//
|
||||||
|
//sys NtQueryInformationProcess(processHandle windows.Handle, processInfoClass uint32, processInfo unsafe.Pointer, processInfoLength uint32, returnLength *uint32) (status uint32) = ntdll.NtQueryInformationProcess
|
||||||
|
|
||||||
|
// typedef struct _VM_COUNTERS_EX
|
||||||
|
// {
|
||||||
|
// SIZE_T PeakVirtualSize;
|
||||||
|
// SIZE_T VirtualSize;
|
||||||
|
// ULONG PageFaultCount;
|
||||||
|
// SIZE_T PeakWorkingSetSize;
|
||||||
|
// SIZE_T WorkingSetSize;
|
||||||
|
// SIZE_T QuotaPeakPagedPoolUsage;
|
||||||
|
// SIZE_T QuotaPagedPoolUsage;
|
||||||
|
// SIZE_T QuotaPeakNonPagedPoolUsage;
|
||||||
|
// SIZE_T QuotaNonPagedPoolUsage;
|
||||||
|
// SIZE_T PagefileUsage;
|
||||||
|
// SIZE_T PeakPagefileUsage;
|
||||||
|
// SIZE_T PrivateUsage;
|
||||||
|
// } VM_COUNTERS_EX, *PVM_COUNTERS_EX;
|
||||||
|
//
|
||||||
|
type VM_COUNTERS_EX struct {
|
||||||
|
PeakVirtualSize uintptr
|
||||||
|
VirtualSize uintptr
|
||||||
|
PageFaultCount uint32
|
||||||
|
PeakWorkingSetSize uintptr
|
||||||
|
WorkingSetSize uintptr
|
||||||
|
QuotaPeakPagedPoolUsage uintptr
|
||||||
|
QuotaPagedPoolUsage uintptr
|
||||||
|
QuotaPeakNonPagedPoolUsage uintptr
|
||||||
|
QuotaNonPagedPoolUsage uintptr
|
||||||
|
PagefileUsage uintptr
|
||||||
|
PeakPagefileUsage uintptr
|
||||||
|
PrivateUsage uintptr
|
||||||
|
}
|
||||||
|
|
||||||
|
// typedef struct _VM_COUNTERS_EX2
|
||||||
|
// {
|
||||||
|
// VM_COUNTERS_EX CountersEx;
|
||||||
|
// SIZE_T PrivateWorkingSetSize;
|
||||||
|
// SIZE_T SharedCommitUsage;
|
||||||
|
// } VM_COUNTERS_EX2, *PVM_COUNTERS_EX2;
|
||||||
|
//
|
||||||
|
type VM_COUNTERS_EX2 struct {
|
||||||
|
CountersEx VM_COUNTERS_EX
|
||||||
|
PrivateWorkingSetSize uintptr
|
||||||
|
SharedCommitUsage uintptr
|
||||||
|
}
|
||||||
|
3
vendor/github.com/Microsoft/hcsshim/internal/winapi/system.go
generated
vendored
3
vendor/github.com/Microsoft/hcsshim/internal/winapi/system.go
generated
vendored
@ -12,7 +12,8 @@ const STATUS_INFO_LENGTH_MISMATCH = 0xC0000004
|
|||||||
// ULONG SystemInformationLength,
|
// ULONG SystemInformationLength,
|
||||||
// PULONG ReturnLength
|
// PULONG ReturnLength
|
||||||
// );
|
// );
|
||||||
//sys NtQuerySystemInformation(systemInfoClass int, systemInformation uintptr, systemInfoLength uint32, returnLength *uint32) (status uint32) = ntdll.NtQuerySystemInformation
|
//
|
||||||
|
//sys NtQuerySystemInformation(systemInfoClass int, systemInformation unsafe.Pointer, systemInfoLength uint32, returnLength *uint32) (status uint32) = ntdll.NtQuerySystemInformation
|
||||||
|
|
||||||
type SYSTEM_PROCESS_INFORMATION struct {
|
type SYSTEM_PROCESS_INFORMATION struct {
|
||||||
NextEntryOffset uint32 // ULONG
|
NextEntryOffset uint32 // ULONG
|
||||||
|
25
vendor/github.com/Microsoft/hcsshim/internal/winapi/utils.go
generated
vendored
25
vendor/github.com/Microsoft/hcsshim/internal/winapi/utils.go
generated
vendored
@ -20,36 +20,41 @@ func Uint16BufferToSlice(buffer *uint16, bufferLength int) (result []uint16) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// UnicodeString corresponds to UNICODE_STRING win32 struct defined here
|
||||||
|
// https://docs.microsoft.com/en-us/windows/win32/api/ntdef/ns-ntdef-_unicode_string
|
||||||
type UnicodeString struct {
|
type UnicodeString struct {
|
||||||
Length uint16
|
Length uint16
|
||||||
MaximumLength uint16
|
MaximumLength uint16
|
||||||
Buffer *uint16
|
Buffer *uint16
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NTSTRSAFE_UNICODE_STRING_MAX_CCH is a constant defined in ntstrsafe.h. This value
|
||||||
|
// denotes the maximum number of wide chars a path can have.
|
||||||
|
const NTSTRSAFE_UNICODE_STRING_MAX_CCH = 32767
|
||||||
|
|
||||||
//String converts a UnicodeString to a golang string
|
//String converts a UnicodeString to a golang string
|
||||||
func (uni UnicodeString) String() string {
|
func (uni UnicodeString) String() string {
|
||||||
// UnicodeString is not guaranteed to be null terminated, therefore
|
// UnicodeString is not guaranteed to be null terminated, therefore
|
||||||
// use the UnicodeString's Length field
|
// use the UnicodeString's Length field
|
||||||
return syscall.UTF16ToString(Uint16BufferToSlice(uni.Buffer, int(uni.Length/2)))
|
return windows.UTF16ToString(Uint16BufferToSlice(uni.Buffer, int(uni.Length/2)))
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewUnicodeString allocates a new UnicodeString and copies `s` into
|
// NewUnicodeString allocates a new UnicodeString and copies `s` into
|
||||||
// the buffer of the new UnicodeString.
|
// the buffer of the new UnicodeString.
|
||||||
func NewUnicodeString(s string) (*UnicodeString, error) {
|
func NewUnicodeString(s string) (*UnicodeString, error) {
|
||||||
// Get length of original `s` to use in the UnicodeString since the `buf`
|
|
||||||
// created later will have an additional trailing null character
|
|
||||||
length := len(s)
|
|
||||||
if length > 32767 {
|
|
||||||
return nil, syscall.ENAMETOOLONG
|
|
||||||
}
|
|
||||||
|
|
||||||
buf, err := windows.UTF16FromString(s)
|
buf, err := windows.UTF16FromString(s)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if len(buf) > NTSTRSAFE_UNICODE_STRING_MAX_CCH {
|
||||||
|
return nil, syscall.ENAMETOOLONG
|
||||||
|
}
|
||||||
|
|
||||||
uni := &UnicodeString{
|
uni := &UnicodeString{
|
||||||
Length: uint16(length * 2),
|
// The length is in bytes and should not include the trailing null character.
|
||||||
MaximumLength: uint16(length * 2),
|
Length: uint16((len(buf) - 1) * 2),
|
||||||
|
MaximumLength: uint16((len(buf) - 1) * 2),
|
||||||
Buffer: &buf[0],
|
Buffer: &buf[0],
|
||||||
}
|
}
|
||||||
return uni, nil
|
return uni, nil
|
||||||
|
2
vendor/github.com/Microsoft/hcsshim/internal/winapi/winapi.go
generated
vendored
2
vendor/github.com/Microsoft/hcsshim/internal/winapi/winapi.go
generated
vendored
@ -2,4 +2,4 @@
|
|||||||
// be thought of as an extension to golang.org/x/sys/windows.
|
// be thought of as an extension to golang.org/x/sys/windows.
|
||||||
package winapi
|
package winapi
|
||||||
|
|
||||||
//go:generate go run ..\..\mksyscall_windows.go -output zsyscall_windows.go system.go net.go path.go thread.go iocp.go jobobject.go logon.go memory.go process.go processor.go devices.go filesystem.go errors.go
|
//go:generate go run ..\..\mksyscall_windows.go -output zsyscall_windows.go user.go console.go system.go net.go path.go thread.go jobobject.go logon.go memory.go process.go processor.go devices.go filesystem.go errors.go
|
||||||
|
93
vendor/github.com/Microsoft/hcsshim/internal/winapi/zsyscall_windows.go
generated
vendored
93
vendor/github.com/Microsoft/hcsshim/internal/winapi/zsyscall_windows.go
generated
vendored
@ -37,18 +37,19 @@ func errnoErr(e syscall.Errno) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
modkernel32 = windows.NewLazySystemDLL("kernel32.dll")
|
||||||
modntdll = windows.NewLazySystemDLL("ntdll.dll")
|
modntdll = windows.NewLazySystemDLL("ntdll.dll")
|
||||||
modiphlpapi = windows.NewLazySystemDLL("iphlpapi.dll")
|
modiphlpapi = windows.NewLazySystemDLL("iphlpapi.dll")
|
||||||
modkernel32 = windows.NewLazySystemDLL("kernel32.dll")
|
|
||||||
modadvapi32 = windows.NewLazySystemDLL("advapi32.dll")
|
modadvapi32 = windows.NewLazySystemDLL("advapi32.dll")
|
||||||
modpsapi = windows.NewLazySystemDLL("psapi.dll")
|
|
||||||
modcfgmgr32 = windows.NewLazySystemDLL("cfgmgr32.dll")
|
modcfgmgr32 = windows.NewLazySystemDLL("cfgmgr32.dll")
|
||||||
|
|
||||||
|
procCreatePseudoConsole = modkernel32.NewProc("CreatePseudoConsole")
|
||||||
|
procClosePseudoConsole = modkernel32.NewProc("ClosePseudoConsole")
|
||||||
|
procResizePseudoConsole = modkernel32.NewProc("ResizePseudoConsole")
|
||||||
procNtQuerySystemInformation = modntdll.NewProc("NtQuerySystemInformation")
|
procNtQuerySystemInformation = modntdll.NewProc("NtQuerySystemInformation")
|
||||||
procSetJobCompartmentId = modiphlpapi.NewProc("SetJobCompartmentId")
|
procSetJobCompartmentId = modiphlpapi.NewProc("SetJobCompartmentId")
|
||||||
procSearchPathW = modkernel32.NewProc("SearchPathW")
|
procSearchPathW = modkernel32.NewProc("SearchPathW")
|
||||||
procCreateRemoteThread = modkernel32.NewProc("CreateRemoteThread")
|
procCreateRemoteThread = modkernel32.NewProc("CreateRemoteThread")
|
||||||
procGetQueuedCompletionStatus = modkernel32.NewProc("GetQueuedCompletionStatus")
|
|
||||||
procIsProcessInJob = modkernel32.NewProc("IsProcessInJob")
|
procIsProcessInJob = modkernel32.NewProc("IsProcessInJob")
|
||||||
procQueryInformationJobObject = modkernel32.NewProc("QueryInformationJobObject")
|
procQueryInformationJobObject = modkernel32.NewProc("QueryInformationJobObject")
|
||||||
procOpenJobObjectW = modkernel32.NewProc("OpenJobObjectW")
|
procOpenJobObjectW = modkernel32.NewProc("OpenJobObjectW")
|
||||||
@ -57,11 +58,9 @@ var (
|
|||||||
procNtOpenJobObject = modntdll.NewProc("NtOpenJobObject")
|
procNtOpenJobObject = modntdll.NewProc("NtOpenJobObject")
|
||||||
procNtCreateJobObject = modntdll.NewProc("NtCreateJobObject")
|
procNtCreateJobObject = modntdll.NewProc("NtCreateJobObject")
|
||||||
procLogonUserW = modadvapi32.NewProc("LogonUserW")
|
procLogonUserW = modadvapi32.NewProc("LogonUserW")
|
||||||
procRtlMoveMemory = modkernel32.NewProc("RtlMoveMemory")
|
|
||||||
procLocalAlloc = modkernel32.NewProc("LocalAlloc")
|
procLocalAlloc = modkernel32.NewProc("LocalAlloc")
|
||||||
procLocalFree = modkernel32.NewProc("LocalFree")
|
procLocalFree = modkernel32.NewProc("LocalFree")
|
||||||
procQueryWorkingSet = modpsapi.NewProc("QueryWorkingSet")
|
procNtQueryInformationProcess = modntdll.NewProc("NtQueryInformationProcess")
|
||||||
procGetProcessImageFileNameW = modkernel32.NewProc("GetProcessImageFileNameW")
|
|
||||||
procGetActiveProcessorCount = modkernel32.NewProc("GetActiveProcessorCount")
|
procGetActiveProcessorCount = modkernel32.NewProc("GetActiveProcessorCount")
|
||||||
procCM_Get_Device_ID_List_SizeA = modcfgmgr32.NewProc("CM_Get_Device_ID_List_SizeA")
|
procCM_Get_Device_ID_List_SizeA = modcfgmgr32.NewProc("CM_Get_Device_ID_List_SizeA")
|
||||||
procCM_Get_Device_ID_ListA = modcfgmgr32.NewProc("CM_Get_Device_ID_ListA")
|
procCM_Get_Device_ID_ListA = modcfgmgr32.NewProc("CM_Get_Device_ID_ListA")
|
||||||
@ -74,7 +73,34 @@ var (
|
|||||||
procRtlNtStatusToDosError = modntdll.NewProc("RtlNtStatusToDosError")
|
procRtlNtStatusToDosError = modntdll.NewProc("RtlNtStatusToDosError")
|
||||||
)
|
)
|
||||||
|
|
||||||
func NtQuerySystemInformation(systemInfoClass int, systemInformation uintptr, systemInfoLength uint32, returnLength *uint32) (status uint32) {
|
func createPseudoConsole(size uint32, hInput windows.Handle, hOutput windows.Handle, dwFlags uint32, hpcon *windows.Handle) (hr error) {
|
||||||
|
r0, _, _ := syscall.Syscall6(procCreatePseudoConsole.Addr(), 5, uintptr(size), uintptr(hInput), uintptr(hOutput), uintptr(dwFlags), uintptr(unsafe.Pointer(hpcon)), 0)
|
||||||
|
if int32(r0) < 0 {
|
||||||
|
if r0&0x1fff0000 == 0x00070000 {
|
||||||
|
r0 &= 0xffff
|
||||||
|
}
|
||||||
|
hr = syscall.Errno(r0)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func ClosePseudoConsole(hpc windows.Handle) {
|
||||||
|
syscall.Syscall(procClosePseudoConsole.Addr(), 1, uintptr(hpc), 0, 0)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func resizePseudoConsole(hPc windows.Handle, size uint32) (hr error) {
|
||||||
|
r0, _, _ := syscall.Syscall(procResizePseudoConsole.Addr(), 2, uintptr(hPc), uintptr(size), 0)
|
||||||
|
if int32(r0) < 0 {
|
||||||
|
if r0&0x1fff0000 == 0x00070000 {
|
||||||
|
r0 &= 0xffff
|
||||||
|
}
|
||||||
|
hr = syscall.Errno(r0)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func NtQuerySystemInformation(systemInfoClass int, systemInformation unsafe.Pointer, systemInfoLength uint32, returnLength *uint32) (status uint32) {
|
||||||
r0, _, _ := syscall.Syscall6(procNtQuerySystemInformation.Addr(), 4, uintptr(systemInfoClass), uintptr(systemInformation), uintptr(systemInfoLength), uintptr(unsafe.Pointer(returnLength)), 0, 0)
|
r0, _, _ := syscall.Syscall6(procNtQuerySystemInformation.Addr(), 4, uintptr(systemInfoClass), uintptr(systemInformation), uintptr(systemInfoLength), uintptr(unsafe.Pointer(returnLength)), 0, 0)
|
||||||
status = uint32(r0)
|
status = uint32(r0)
|
||||||
return
|
return
|
||||||
@ -114,19 +140,7 @@ func CreateRemoteThread(process windows.Handle, sa *windows.SecurityAttributes,
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func GetQueuedCompletionStatus(cphandle windows.Handle, qty *uint32, key *uintptr, overlapped **windows.Overlapped, timeout uint32) (err error) {
|
func IsProcessInJob(procHandle windows.Handle, jobHandle windows.Handle, result *int32) (err error) {
|
||||||
r1, _, e1 := syscall.Syscall6(procGetQueuedCompletionStatus.Addr(), 5, uintptr(cphandle), uintptr(unsafe.Pointer(qty)), uintptr(unsafe.Pointer(key)), uintptr(unsafe.Pointer(overlapped)), uintptr(timeout), 0)
|
|
||||||
if r1 == 0 {
|
|
||||||
if e1 != 0 {
|
|
||||||
err = errnoErr(e1)
|
|
||||||
} else {
|
|
||||||
err = syscall.EINVAL
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func IsProcessInJob(procHandle windows.Handle, jobHandle windows.Handle, result *bool) (err error) {
|
|
||||||
r1, _, e1 := syscall.Syscall(procIsProcessInJob.Addr(), 3, uintptr(procHandle), uintptr(jobHandle), uintptr(unsafe.Pointer(result)))
|
r1, _, e1 := syscall.Syscall(procIsProcessInJob.Addr(), 3, uintptr(procHandle), uintptr(jobHandle), uintptr(unsafe.Pointer(result)))
|
||||||
if r1 == 0 {
|
if r1 == 0 {
|
||||||
if e1 != 0 {
|
if e1 != 0 {
|
||||||
@ -138,7 +152,7 @@ func IsProcessInJob(procHandle windows.Handle, jobHandle windows.Handle, result
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func QueryInformationJobObject(jobHandle windows.Handle, infoClass uint32, jobObjectInfo uintptr, jobObjectInformationLength uint32, lpReturnLength *uint32) (err error) {
|
func QueryInformationJobObject(jobHandle windows.Handle, infoClass uint32, jobObjectInfo unsafe.Pointer, jobObjectInformationLength uint32, lpReturnLength *uint32) (err error) {
|
||||||
r1, _, e1 := syscall.Syscall6(procQueryInformationJobObject.Addr(), 5, uintptr(jobHandle), uintptr(infoClass), uintptr(jobObjectInfo), uintptr(jobObjectInformationLength), uintptr(unsafe.Pointer(lpReturnLength)), 0)
|
r1, _, e1 := syscall.Syscall6(procQueryInformationJobObject.Addr(), 5, uintptr(jobHandle), uintptr(infoClass), uintptr(jobObjectInfo), uintptr(jobObjectInformationLength), uintptr(unsafe.Pointer(lpReturnLength)), 0)
|
||||||
if r1 == 0 {
|
if r1 == 0 {
|
||||||
if e1 != 0 {
|
if e1 != 0 {
|
||||||
@ -219,18 +233,6 @@ func LogonUser(username *uint16, domain *uint16, password *uint16, logonType uin
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func RtlMoveMemory(destination *byte, source *byte, length uintptr) (err error) {
|
|
||||||
r1, _, e1 := syscall.Syscall(procRtlMoveMemory.Addr(), 3, uintptr(unsafe.Pointer(destination)), uintptr(unsafe.Pointer(source)), uintptr(length))
|
|
||||||
if r1 == 0 {
|
|
||||||
if e1 != 0 {
|
|
||||||
err = errnoErr(e1)
|
|
||||||
} else {
|
|
||||||
err = syscall.EINVAL
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func LocalAlloc(flags uint32, size int) (ptr uintptr) {
|
func LocalAlloc(flags uint32, size int) (ptr uintptr) {
|
||||||
r0, _, _ := syscall.Syscall(procLocalAlloc.Addr(), 2, uintptr(flags), uintptr(size), 0)
|
r0, _, _ := syscall.Syscall(procLocalAlloc.Addr(), 2, uintptr(flags), uintptr(size), 0)
|
||||||
ptr = uintptr(r0)
|
ptr = uintptr(r0)
|
||||||
@ -242,28 +244,9 @@ func LocalFree(ptr uintptr) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func QueryWorkingSet(handle windows.Handle, pv uintptr, cb uint32) (err error) {
|
func NtQueryInformationProcess(processHandle windows.Handle, processInfoClass uint32, processInfo unsafe.Pointer, processInfoLength uint32, returnLength *uint32) (status uint32) {
|
||||||
r1, _, e1 := syscall.Syscall(procQueryWorkingSet.Addr(), 3, uintptr(handle), uintptr(pv), uintptr(cb))
|
r0, _, _ := syscall.Syscall6(procNtQueryInformationProcess.Addr(), 5, uintptr(processHandle), uintptr(processInfoClass), uintptr(processInfo), uintptr(processInfoLength), uintptr(unsafe.Pointer(returnLength)), 0)
|
||||||
if r1 == 0 {
|
status = uint32(r0)
|
||||||
if e1 != 0 {
|
|
||||||
err = errnoErr(e1)
|
|
||||||
} else {
|
|
||||||
err = syscall.EINVAL
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetProcessImageFileName(hProcess windows.Handle, imageFileName *uint16, nSize uint32) (size uint32, err error) {
|
|
||||||
r0, _, e1 := syscall.Syscall(procGetProcessImageFileNameW.Addr(), 3, uintptr(hProcess), uintptr(unsafe.Pointer(imageFileName)), uintptr(nSize))
|
|
||||||
size = uint32(r0)
|
|
||||||
if size == 0 {
|
|
||||||
if e1 != 0 {
|
|
||||||
err = errnoErr(e1)
|
|
||||||
} else {
|
|
||||||
err = syscall.EINVAL
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
12
vendor/github.com/Microsoft/hcsshim/osversion/windowsbuilds.go
generated
vendored
12
vendor/github.com/Microsoft/hcsshim/osversion/windowsbuilds.go
generated
vendored
@ -35,4 +35,16 @@ const (
|
|||||||
|
|
||||||
// V20H2 corresponds to Windows Server 20H2 (semi-annual channel).
|
// V20H2 corresponds to Windows Server 20H2 (semi-annual channel).
|
||||||
V20H2 = 19042
|
V20H2 = 19042
|
||||||
|
|
||||||
|
// V21H1 corresponds to Windows Server 21H1 (semi-annual channel).
|
||||||
|
V21H1 = 19043
|
||||||
|
|
||||||
|
// V21H2Win10 corresponds to Windows 10 (November 2021 Update).
|
||||||
|
V21H2Win10 = 19044
|
||||||
|
|
||||||
|
// V21H2Server corresponds to Windows Server 2022 (ltsc2022).
|
||||||
|
V21H2Server = 20348
|
||||||
|
|
||||||
|
// V21H2Win11 corresponds to Windows 11 (original release).
|
||||||
|
V21H2Win11 = 22000
|
||||||
)
|
)
|
||||||
|
4
vendor/modules.txt
vendored
4
vendor/modules.txt
vendored
@ -4,7 +4,7 @@ github.com/Microsoft/go-winio
|
|||||||
github.com/Microsoft/go-winio/pkg/guid
|
github.com/Microsoft/go-winio/pkg/guid
|
||||||
github.com/Microsoft/go-winio/pkg/security
|
github.com/Microsoft/go-winio/pkg/security
|
||||||
github.com/Microsoft/go-winio/vhd
|
github.com/Microsoft/go-winio/vhd
|
||||||
# github.com/Microsoft/hcsshim v0.8.20
|
# github.com/Microsoft/hcsshim v0.9.6
|
||||||
## explicit; go 1.13
|
## explicit; go 1.13
|
||||||
github.com/Microsoft/hcsshim
|
github.com/Microsoft/hcsshim
|
||||||
github.com/Microsoft/hcsshim/computestorage
|
github.com/Microsoft/hcsshim/computestorage
|
||||||
@ -17,11 +17,13 @@ github.com/Microsoft/hcsshim/internal/hcs/schema2
|
|||||||
github.com/Microsoft/hcsshim/internal/hcserror
|
github.com/Microsoft/hcsshim/internal/hcserror
|
||||||
github.com/Microsoft/hcsshim/internal/hns
|
github.com/Microsoft/hcsshim/internal/hns
|
||||||
github.com/Microsoft/hcsshim/internal/interop
|
github.com/Microsoft/hcsshim/internal/interop
|
||||||
|
github.com/Microsoft/hcsshim/internal/jobobject
|
||||||
github.com/Microsoft/hcsshim/internal/log
|
github.com/Microsoft/hcsshim/internal/log
|
||||||
github.com/Microsoft/hcsshim/internal/logfields
|
github.com/Microsoft/hcsshim/internal/logfields
|
||||||
github.com/Microsoft/hcsshim/internal/longpath
|
github.com/Microsoft/hcsshim/internal/longpath
|
||||||
github.com/Microsoft/hcsshim/internal/mergemaps
|
github.com/Microsoft/hcsshim/internal/mergemaps
|
||||||
github.com/Microsoft/hcsshim/internal/oc
|
github.com/Microsoft/hcsshim/internal/oc
|
||||||
|
github.com/Microsoft/hcsshim/internal/queue
|
||||||
github.com/Microsoft/hcsshim/internal/regstate
|
github.com/Microsoft/hcsshim/internal/regstate
|
||||||
github.com/Microsoft/hcsshim/internal/runhcs
|
github.com/Microsoft/hcsshim/internal/runhcs
|
||||||
github.com/Microsoft/hcsshim/internal/safefile
|
github.com/Microsoft/hcsshim/internal/safefile
|
||||||
|
Loading…
x
Reference in New Issue
Block a user