mirror of
https://gitea.com/Lydanne/buildx.git
synced 2025-08-15 08:15:55 +08:00
Compare commits
81 Commits
v0.4.2
...
v0.5.0-rc1
Author | SHA1 | Date | |
---|---|---|---|
![]() |
33e3ca524e | ||
![]() |
ea1a71dc07 | ||
![]() |
ae820293a2 | ||
![]() |
f68f42cb11 | ||
![]() |
7f58ad45fa | ||
![]() |
aa7c17989b | ||
![]() |
6b6afc4077 | ||
![]() |
69a1419ab1 | ||
![]() |
080e9981c7 | ||
![]() |
8cc00ab486 | ||
![]() |
40fad4bbb5 | ||
![]() |
232af9aa0d | ||
![]() |
5bf2ff98c9 | ||
![]() |
570e733a51 | ||
![]() |
cffcd57edb | ||
![]() |
1496ac9b55 | ||
![]() |
290e25917c | ||
![]() |
0360668cc1 | ||
![]() |
343a4753c7 | ||
![]() |
d827f42d38 | ||
![]() |
5843e67a90 | ||
![]() |
517df133e3 | ||
![]() |
621114fbe1 | ||
![]() |
2066051d3a | ||
![]() |
d94cbd870c | ||
![]() |
48f15dcf3d | ||
![]() |
35a60b8e04 | ||
![]() |
4b3df09155 | ||
![]() |
b1215c2ce2 | ||
![]() |
99ac03f9f3 | ||
![]() |
a0aa45a4a7 | ||
![]() |
aab3a92890 | ||
![]() |
37020dc8da | ||
![]() |
d66d3a2d09 | ||
![]() |
f057195a4f | ||
![]() |
378bf70d4b | ||
![]() |
1ccf0bd7d8 | ||
![]() |
ddbfddce88 | ||
![]() |
ea19cf9d8d | ||
![]() |
3b69482a2f | ||
![]() |
778fbb4669 | ||
![]() |
13533e359a | ||
![]() |
3c2d0aa667 | ||
![]() |
5551de4b8a | ||
![]() |
fa51b90094 | ||
![]() |
bfd1ea3877 | ||
![]() |
abfb2c064d | ||
![]() |
4f7517115c | ||
![]() |
1621b9bad0 | ||
![]() |
d2bf42f8b4 | ||
![]() |
d1a46faf84 | ||
![]() |
39f1d99dcc | ||
![]() |
1f04ec9575 | ||
![]() |
ac2e081528 | ||
![]() |
95ac9ebb8a | ||
![]() |
c41b006be1 | ||
![]() |
92fb995505 | ||
![]() |
3c94621142 | ||
![]() |
2d720a1e0b | ||
![]() |
0269388aa7 | ||
![]() |
4b2aab09b5 | ||
![]() |
1c7434a8f0 | ||
![]() |
20f8f67928 | ||
![]() |
159535261d | ||
![]() |
a840e891fe | ||
![]() |
a7c704c39d | ||
![]() |
e1c0eb2187 | ||
![]() |
aa8ab9fcca | ||
![]() |
a746959fc1 | ||
![]() |
ee34eb2180 | ||
![]() |
844b901005 | ||
![]() |
83ebc13a37 | ||
![]() |
82c8f2d8f0 | ||
![]() |
a11cc8840e | ||
![]() |
35ee6ce62d | ||
![]() |
37861cb99f | ||
![]() |
a178d05023 | ||
![]() |
ee9ccfe2e3 | ||
![]() |
c6c4b4a871 | ||
![]() |
273c6a75a2 | ||
![]() |
1384bf02f9 |
185
.github/workflows/build.yml
vendored
Normal file
185
.github/workflows/build.yml
vendored
Normal file
@@ -0,0 +1,185 @@
|
|||||||
|
name: build
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- 'master'
|
||||||
|
tags:
|
||||||
|
- 'v*'
|
||||||
|
pull_request:
|
||||||
|
branches:
|
||||||
|
- 'master'
|
||||||
|
|
||||||
|
env:
|
||||||
|
REPO_SLUG_ORIGIN: "moby/buildkit:master"
|
||||||
|
CACHEKEY_BINARIES: "binaries"
|
||||||
|
PLATFORMS: "linux/amd64,linux/arm/v6,linux/arm/v7,linux/arm64,linux/s390x,linux/ppc64le"
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
base:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
-
|
||||||
|
name: Checkout
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
-
|
||||||
|
name: Cache ${{ env.CACHEKEY_BINARIES }}
|
||||||
|
uses: actions/cache@v2
|
||||||
|
with:
|
||||||
|
path: /tmp/.buildx-cache/${{ env.CACHEKEY_BINARIES }}
|
||||||
|
key: ${{ runner.os }}-buildx-${{ env.CACHEKEY_BINARIES }}-${{ github.sha }}
|
||||||
|
restore-keys: |
|
||||||
|
${{ runner.os }}-buildx-${{ env.CACHEKEY_BINARIES }}-
|
||||||
|
-
|
||||||
|
name: Set up QEMU
|
||||||
|
uses: docker/setup-qemu-action@v1
|
||||||
|
-
|
||||||
|
name: Set up Docker Buildx
|
||||||
|
uses: docker/setup-buildx-action@v1
|
||||||
|
with:
|
||||||
|
driver-opts: image=${{ env.REPO_SLUG_ORIGIN }}
|
||||||
|
-
|
||||||
|
name: Build ${{ env.CACHEKEY_BINARIES }}
|
||||||
|
run: |
|
||||||
|
./hack/build_ci_first_pass binaries
|
||||||
|
env:
|
||||||
|
CACHEDIR_FROM: /tmp/.buildx-cache/${{ env.CACHEKEY_BINARIES }}
|
||||||
|
CACHEDIR_TO: /tmp/.buildx-cache/${{ env.CACHEKEY_BINARIES }}-new
|
||||||
|
-
|
||||||
|
# FIXME: Temp fix for https://github.com/moby/buildkit/issues/1850
|
||||||
|
name: Move cache
|
||||||
|
run: |
|
||||||
|
rm -rf /tmp/.buildx-cache/${{ env.CACHEKEY_BINARIES }}
|
||||||
|
mv /tmp/.buildx-cache/${{ env.CACHEKEY_BINARIES }}-new /tmp/.buildx-cache/${{ env.CACHEKEY_BINARIES }}
|
||||||
|
|
||||||
|
test:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
needs: [base]
|
||||||
|
steps:
|
||||||
|
-
|
||||||
|
name: Checkout
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
-
|
||||||
|
name: Cache ${{ env.CACHEKEY_BINARIES }}
|
||||||
|
uses: actions/cache@v2
|
||||||
|
with:
|
||||||
|
path: /tmp/.buildx-cache/${{ env.CACHEKEY_BINARIES }}
|
||||||
|
key: ${{ runner.os }}-buildx-${{ env.CACHEKEY_BINARIES }}-${{ github.sha }}
|
||||||
|
restore-keys: |
|
||||||
|
${{ runner.os }}-buildx-${{ env.CACHEKEY_BINARIES }}-
|
||||||
|
-
|
||||||
|
name: Set up QEMU
|
||||||
|
uses: docker/setup-qemu-action@v1
|
||||||
|
-
|
||||||
|
name: Set up Docker Buildx
|
||||||
|
uses: docker/setup-buildx-action@v1
|
||||||
|
with:
|
||||||
|
driver-opts: image=${{ env.REPO_SLUG_ORIGIN }}
|
||||||
|
-
|
||||||
|
name: Test
|
||||||
|
run: |
|
||||||
|
make test
|
||||||
|
env:
|
||||||
|
TEST_COVERAGE: 1
|
||||||
|
TESTFLAGS: -v --parallel=6 --timeout=20m
|
||||||
|
CACHEDIR_FROM: /tmp/.buildx-cache/${{ env.CACHEKEY_BINARIES }}
|
||||||
|
-
|
||||||
|
name: Send to Codecov
|
||||||
|
uses: codecov/codecov-action@v1
|
||||||
|
with:
|
||||||
|
file: ./coverage/coverage.txt
|
||||||
|
|
||||||
|
cross:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
needs: [base]
|
||||||
|
steps:
|
||||||
|
-
|
||||||
|
name: Checkout
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
-
|
||||||
|
name: Cache ${{ env.CACHEKEY_BINARIES }}
|
||||||
|
uses: actions/cache@v2
|
||||||
|
with:
|
||||||
|
path: /tmp/.buildx-cache/${{ env.CACHEKEY_BINARIES }}
|
||||||
|
key: ${{ runner.os }}-buildx-${{ env.CACHEKEY_BINARIES }}-${{ github.sha }}
|
||||||
|
restore-keys: |
|
||||||
|
${{ runner.os }}-buildx-${{ env.CACHEKEY_BINARIES }}-
|
||||||
|
-
|
||||||
|
name: Set up QEMU
|
||||||
|
uses: docker/setup-qemu-action@v1
|
||||||
|
-
|
||||||
|
name: Set up Docker Buildx
|
||||||
|
uses: docker/setup-buildx-action@v1
|
||||||
|
with:
|
||||||
|
driver-opts: image=${{ env.REPO_SLUG_ORIGIN }}
|
||||||
|
-
|
||||||
|
name: Cross
|
||||||
|
run: |
|
||||||
|
make cross
|
||||||
|
env:
|
||||||
|
TARGETPLATFORM: ${{ env.PLATFORMS }},darwin/amd64,windows/amd64
|
||||||
|
CACHEDIR_FROM: /tmp/.buildx-cache/${{ env.CACHEKEY_BINARIES }}
|
||||||
|
|
||||||
|
binaries:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
needs: [test, cross]
|
||||||
|
steps:
|
||||||
|
-
|
||||||
|
name: Checkout
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
-
|
||||||
|
name: Prepare
|
||||||
|
id: prep
|
||||||
|
run: |
|
||||||
|
TAG=pr
|
||||||
|
if [[ $GITHUB_REF == refs/tags/v* ]]; then
|
||||||
|
TAG=${GITHUB_REF#refs/tags/}
|
||||||
|
elif [[ $GITHUB_REF == refs/heads/* ]]; then
|
||||||
|
TAG=$(echo ${GITHUB_REF#refs/heads/} | sed -r 's#/+#-#g')
|
||||||
|
fi
|
||||||
|
echo ::set-output name=tag::${TAG}
|
||||||
|
-
|
||||||
|
name: Cache ${{ env.CACHEKEY_BINARIES }}
|
||||||
|
uses: actions/cache@v2
|
||||||
|
with:
|
||||||
|
path: /tmp/.buildx-cache/${{ env.CACHEKEY_BINARIES }}
|
||||||
|
key: ${{ runner.os }}-buildx-${{ env.CACHEKEY_BINARIES }}-${{ github.sha }}
|
||||||
|
restore-keys: |
|
||||||
|
${{ runner.os }}-buildx-${{ env.CACHEKEY_BINARIES }}-
|
||||||
|
-
|
||||||
|
name: Set up QEMU
|
||||||
|
uses: docker/setup-qemu-action@v1
|
||||||
|
-
|
||||||
|
name: Set up Docker Buildx
|
||||||
|
uses: docker/setup-buildx-action@v1
|
||||||
|
with:
|
||||||
|
driver-opts: image=${{ env.REPO_SLUG_ORIGIN }}
|
||||||
|
-
|
||||||
|
name: Build ${{ steps.prep.outputs.tag }}
|
||||||
|
run: |
|
||||||
|
./hack/release "${{ steps.prep.outputs.tag }}" release-out
|
||||||
|
env:
|
||||||
|
PLATFORMS: ${{ env.PLATFORMS }},darwin/amd64,windows/amd64
|
||||||
|
CACHEDIR_FROM: /tmp/.buildx-cache/${{ env.CACHEKEY_BINARIES }}
|
||||||
|
-
|
||||||
|
name: Move artifacts
|
||||||
|
run: |
|
||||||
|
mv ./release-out/**/* ./release-out/
|
||||||
|
-
|
||||||
|
name: Upload artifacts
|
||||||
|
uses: actions/upload-artifact@v2
|
||||||
|
with:
|
||||||
|
name: buildx
|
||||||
|
path: ./release-out/*
|
||||||
|
if-no-files-found: error
|
||||||
|
-
|
||||||
|
name: GitHub Release
|
||||||
|
if: startsWith(github.ref, 'refs/tags/v')
|
||||||
|
uses: softprops/action-gh-release@v1
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
with:
|
||||||
|
draft: true
|
||||||
|
files: ./release-out/*
|
||||||
|
name: ${{ steps.prep.outputs.tag }}
|
25
.github/workflows/godev.yml
vendored
Normal file
25
.github/workflows/godev.yml
vendored
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
# Workflow used to make a request to proxy.golang.org to refresh cache on https://pkg.go.dev/github.com/docker/buildx
|
||||||
|
# when a released of buildx is produced
|
||||||
|
name: godev
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
tags:
|
||||||
|
- 'v*'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
update:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
-
|
||||||
|
name: Set up Go
|
||||||
|
uses: actions/setup-go@v2
|
||||||
|
with:
|
||||||
|
go-version: 1.13
|
||||||
|
-
|
||||||
|
name: Call pkg.go.dev
|
||||||
|
run: |
|
||||||
|
go get github.com/${GITHUB_REPOSITORY}@${GITHUB_REF#refs/tags/}
|
||||||
|
env:
|
||||||
|
GO111MODULE: on
|
||||||
|
GOPROXY: https://proxy.golang.org
|
38
.github/workflows/validate.yml
vendored
Normal file
38
.github/workflows/validate.yml
vendored
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
name: validate
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- 'master'
|
||||||
|
tags:
|
||||||
|
- 'v*'
|
||||||
|
pull_request:
|
||||||
|
branches:
|
||||||
|
- 'master'
|
||||||
|
|
||||||
|
env:
|
||||||
|
REPO_SLUG_ORIGIN: "moby/buildkit:master"
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
validate:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
target:
|
||||||
|
- lint
|
||||||
|
- validate-vendor
|
||||||
|
steps:
|
||||||
|
-
|
||||||
|
name: Checkout
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
-
|
||||||
|
name: Set up Docker Buildx
|
||||||
|
uses: docker/setup-buildx-action@v1
|
||||||
|
with:
|
||||||
|
driver-opts: image=${{ env.REPO_SLUG_ORIGIN }}
|
||||||
|
-
|
||||||
|
name: Run
|
||||||
|
run: |
|
||||||
|
make ${{ matrix.target }}
|
3
.gitignore
vendored
3
.gitignore
vendored
@@ -1,2 +1,3 @@
|
|||||||
bin
|
bin
|
||||||
cross-out
|
coverage
|
||||||
|
cross-out
|
||||||
|
48
.travis.yml
48
.travis.yml
@@ -1,35 +1,31 @@
|
|||||||
dist: trusty
|
|
||||||
sudo: required
|
sudo: required
|
||||||
|
language: minimal
|
||||||
install:
|
|
||||||
- docker run --name buildkit --rm -d --privileged -p 1234:1234 $REPO_SLUG_ORIGIN --addr tcp://0.0.0.0:1234
|
|
||||||
- sudo docker cp buildkit:/usr/bin/buildctl /usr/bin/
|
|
||||||
- export BUILDKIT_HOST=tcp://0.0.0.0:1234
|
|
||||||
|
|
||||||
env:
|
env:
|
||||||
global:
|
global:
|
||||||
|
- DOCKER_CHANNEL="stable"
|
||||||
|
- DOCKER_CLI_EXPERIMENTAL="enabled"
|
||||||
- PLATFORMS="linux/amd64,linux/arm/v6,linux/arm/v7,linux/arm64,linux/s390x,linux/ppc64le"
|
- PLATFORMS="linux/amd64,linux/arm/v6,linux/arm/v7,linux/arm64,linux/s390x,linux/ppc64le"
|
||||||
- CROSS_PLATFORMS="${PLATFORMS},darwin/amd64,windows/amd64"
|
- CROSS_PLATFORMS="${PLATFORMS},darwin/amd64,windows/amd64"
|
||||||
- PREFER_BUILDCTL="1"
|
- PREFER_BUILDCTL="1"
|
||||||
|
|
||||||
|
before_install:
|
||||||
|
# update docker
|
||||||
|
- curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
|
||||||
|
- sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) $DOCKER_CHANNEL"
|
||||||
|
- sudo apt-get update
|
||||||
|
- sudo apt-get -y -o Dpkg::Options::="--force-confnew" install docker-ce docker-ce-cli
|
||||||
|
# check
|
||||||
|
- sudo systemctl restart docker
|
||||||
|
- docker info
|
||||||
|
|
||||||
|
install:
|
||||||
|
- docker buildx create --name builder --driver docker-container --driver-opt image=$REPO_SLUG_ORIGIN --use
|
||||||
|
- docker run --rm --privileged tonistiigi/binfmt:latest --install all
|
||||||
|
- docker run --name buildkit --rm -d --privileged -p 1234:1234 $REPO_SLUG_ORIGIN --addr tcp://0.0.0.0:1234
|
||||||
|
- sudo docker cp buildkit:/usr/bin/buildctl /usr/bin/
|
||||||
|
- export BUILDKIT_HOST=tcp://0.0.0.0:1234
|
||||||
|
|
||||||
script:
|
script:
|
||||||
- make binaries validate-all && TARGETPLATFORM="${CROSS_PLATFORMS}" ./hack/cross
|
- make binaries validate-all
|
||||||
|
- TARGETPLATFORM="${CROSS_PLATFORMS}" ./hack/cross
|
||||||
|
|
||||||
deploy:
|
|
||||||
- provider: script
|
|
||||||
script: PLATFORMS="${CROSS_PLATFORMS}" ./hack/release $TRAVIS_TAG release-out
|
|
||||||
on:
|
|
||||||
repo: docker/buildx
|
|
||||||
tags: true
|
|
||||||
condition: $TRAVIS_TAG =~ ^v[0-9]
|
|
||||||
- provider: releases
|
|
||||||
api_key:
|
|
||||||
secure: "VKVL+tyS3BfqjM4VMGHoHJbcKY4mqq4AGrclVEvBnt0gm1LkGeKxSheCZgF1EC4oSV8rCy6dkoRWL0PLkl895MIl20Z4v53o1NOQ4Fn0A+eptnrld8jYUkL5PcD+kdEqv2GkBn7vO6E/fwYY/wH9FYlE+fXUa0c/YQGqNGS+XVDtgkftqBV+F2EzaIwk+D+QClFBRmKvIbXrUQASi1K6K2eT3gvzR4zh679TSdI2nbnTKtE06xG1PBFVmb1Ux3/Jz4yHFvf2d3M1mOyqIBsozKoyxisiFQxnm3FjhPrdlZJ9oy/nsQM3ahQKJ3DF8hiLI1LxcxRa6wo//t3uu2eJSYl/c5nu0T7gVw4sChQNy52fUhEGoDTDwYoAxsLSDXcpj1jevRsKvxt/dh2e2De1a9HYj5oM+z2O+pcyiY98cKDbhe2miUqUdiYMBy24xUunB46zVcJF3pIqCYtw5ts8ES6Ixn3u+4OGV/hMDrVdiG2bOZtNVkdbKMEkOEBGa3parPJ69jh6og639kdAD3DFxyZn3YKYuJlcNShn3tj6iPokBYhlLwwf8vuEV7gK7G0rDS9yxuF03jgkwpBBF2wy+u1AbJv241T7v2ZB8H8VlYyHA0E5pnoWbw+lIOTy4IAc8gIesMvDuFFi4r1okhiAt/24U0p4aAohjh1nPuU3spY="
|
|
||||||
file: release-out/**/*
|
|
||||||
skip_cleanup: true
|
|
||||||
file_glob: true
|
|
||||||
on:
|
|
||||||
repo: docker/buildx
|
|
||||||
tags: true
|
|
||||||
condition: $TRAVIS_TAG =~ ^v[0-9]
|
|
||||||
|
13
.yamllint.yml
Normal file
13
.yamllint.yml
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
ignore: |
|
||||||
|
/vendor
|
||||||
|
|
||||||
|
extends: default
|
||||||
|
|
||||||
|
yaml-files:
|
||||||
|
- '*.yaml'
|
||||||
|
- '*.yml'
|
||||||
|
|
||||||
|
rules:
|
||||||
|
truthy: disable
|
||||||
|
line-length: disable
|
||||||
|
document-start: disable
|
3
Makefile
3
Makefile
@@ -7,6 +7,9 @@ binaries:
|
|||||||
binaries-cross:
|
binaries-cross:
|
||||||
EXPORT_LOCAL=cross-out ./hack/cross
|
EXPORT_LOCAL=cross-out ./hack/cross
|
||||||
|
|
||||||
|
cross:
|
||||||
|
./hack/cross
|
||||||
|
|
||||||
install: binaries
|
install: binaries
|
||||||
mkdir -p ~/.docker/cli-plugins
|
mkdir -p ~/.docker/cli-plugins
|
||||||
cp bin/buildx ~/.docker/cli-plugins/docker-buildx
|
cp bin/buildx ~/.docker/cli-plugins/docker-buildx
|
||||||
|
54
README.md
54
README.md
@@ -1,9 +1,13 @@
|
|||||||
# buildx
|
# buildx
|
||||||
### Docker CLI plugin for extended build capabilities with BuildKit
|
|
||||||
|
|
||||||
_buildx is Tech Preview_
|
[](https://pkg.go.dev/github.com/docker/buildx)
|
||||||
|
[](https://github.com/docker/buildx/actions?query=workflow%3Abuild)
|
||||||
|
[](https://goreportcard.com/report/github.com/docker/buildx)
|
||||||
|
[](https://codecov.io/gh/docker/buildx)
|
||||||
|
|
||||||
### TL;DR
|
`buildx` is a Docker CLI plugin for extended build capabilities with [BuildKit](https://github.com/moby/buildkit).
|
||||||
|
|
||||||
|
Key features:
|
||||||
|
|
||||||
- Familiar UI from `docker build`
|
- Familiar UI from `docker build`
|
||||||
- Full BuildKit capabilities with container driver
|
- Full BuildKit capabilities with container driver
|
||||||
@@ -117,7 +121,11 @@ When invoking a build, the `--platform` flag can be used to specify the target p
|
|||||||
|
|
||||||
Multi-platform images can be built by mainly three different strategies that are all supported by buildx and Dockerfiles. You can use the QEMU emulation support in the kernel, build on multiple native nodes using the same builder instance or use a stage in Dockerfile to cross-compile to different architectures.
|
Multi-platform images can be built by mainly three different strategies that are all supported by buildx and Dockerfiles. You can use the QEMU emulation support in the kernel, build on multiple native nodes using the same builder instance or use a stage in Dockerfile to cross-compile to different architectures.
|
||||||
|
|
||||||
QEMU is the easiest way to get started if your node already supports it (e.g. if you are using Docker Desktop). It requires no changes to your Dockerfile and BuildKit will automatically detect the secondary architectures that are available. When BuildKit needs to run a binary for a different architecture it will automatically load it through a binary registered in the binfmt_misc handler. For QEMU binaries registered with binfmt_misc on the host OS to work transparently inside containers they must be registed with the fix_binary flag. This requires a kernel >= 4.8 and binfmt-support >= 2.1.7. You can check for proper registration by checking if `F` is among the flags in `/proc/sys/fs/binfmt_misc/qemu-*`. While Docker Desktop comes preconfigured with binfmt_misc support for additional platforms, for other installations it likely needs to be installed manually.
|
QEMU is the easiest way to get started if your node already supports it (e.g. if you are using Docker Desktop). It requires no changes to your Dockerfile and BuildKit will automatically detect the secondary architectures that are available. When BuildKit needs to run a binary for a different architecture it will automatically load it through a binary registered in the binfmt_misc handler. For QEMU binaries registered with binfmt_misc on the host OS to work transparently inside containers they must be registed with the fix_binary flag. This requires a kernel >= 4.8 and binfmt-support >= 2.1.7. You can check for proper registration by checking if `F` is among the flags in `/proc/sys/fs/binfmt_misc/qemu-*`. While Docker Desktop comes preconfigured with binfmt_misc support for additional platforms, for other installations it likely needs to be installed using [`tonistiigi/binfmt`](https://github.com/tonistiigi/binfmt) image.
|
||||||
|
|
||||||
|
```
|
||||||
|
$ docker run --privileged --rm tonistiigi/binfmt --install all
|
||||||
|
```
|
||||||
|
|
||||||
Using multiple native nodes provides better support for more complicated cases not handled by QEMU and generally have better performance. Additional nodes can be added to the builder instance with `--append` flag.
|
Using multiple native nodes provides better support for more complicated cases not handled by QEMU and generally have better performance. Additional nodes can be added to the builder instance with `--append` flag.
|
||||||
|
|
||||||
@@ -407,6 +415,7 @@ Passes additional driver-specific options. Details for each driver:
|
|||||||
- `image=IMAGE` - Sets the container image to be used for running buildkit.
|
- `image=IMAGE` - Sets the container image to be used for running buildkit.
|
||||||
- `namespace=NS` - Sets the Kubernetes namespace. Defaults to the current namespace.
|
- `namespace=NS` - Sets the Kubernetes namespace. Defaults to the current namespace.
|
||||||
- `replicas=N` - Sets the number of `Pod` replicas. Defaults to 1.
|
- `replicas=N` - Sets the number of `Pod` replicas. Defaults to 1.
|
||||||
|
- `nodeselector="label1=value1,label2=value2"` - Sets the kv of `Pod` nodeSelector. No Defaults. Example `nodeselector=kubernetes.io/arch=arm64`
|
||||||
- `rootless=(true|false)` - Run the container as a non-root user without `securityContext.privileged`. [Using Ubuntu host kernel is recommended](https://github.com/moby/buildkit/blob/master/docs/rootless.md). Defaults to false.
|
- `rootless=(true|false)` - Run the container as a non-root user without `securityContext.privileged`. [Using Ubuntu host kernel is recommended](https://github.com/moby/buildkit/blob/master/docs/rootless.md). Defaults to false.
|
||||||
- `loadbalance=(sticky|random)` - Load-balancing strategy. If set to "sticky", the pod is chosen using the hash of the context path. Defaults to "sticky"
|
- `loadbalance=(sticky|random)` - Load-balancing strategy. If set to "sticky", the pod is chosen using the hash of the context path. Defaults to "sticky"
|
||||||
|
|
||||||
@@ -736,6 +745,43 @@ $ docker buildx bake --print webapp
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Example of only adding tags if a variable is not empty using an `notequal` function:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ cat <<'EOF' > docker-bake.hcl
|
||||||
|
variable "TAG" {default="" }
|
||||||
|
|
||||||
|
group "default" {
|
||||||
|
targets = [
|
||||||
|
"webapp",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
target "webapp" {
|
||||||
|
context="."
|
||||||
|
dockerfile="Dockerfile"
|
||||||
|
tags = [
|
||||||
|
"my-image:latest",
|
||||||
|
notequal("",TAG) ? "my-image:${TAG}": "",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
|
||||||
|
$ docker buildx bake --print webapp
|
||||||
|
{
|
||||||
|
"target": {
|
||||||
|
"webapp": {
|
||||||
|
"context": ".",
|
||||||
|
"dockerfile": "Dockerfile",
|
||||||
|
"tags": [
|
||||||
|
"my-image:latest"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
### `buildx imagetools create [OPTIONS] [SOURCE] [SOURCE...]`
|
### `buildx imagetools create [OPTIONS] [SOURCE] [SOURCE...]`
|
||||||
|
|
||||||
Imagetools contains commands for working with manifest lists in the registry. These commands are useful for inspecting multi-platform build results.
|
Imagetools contains commands for working with manifest lists in the registry. These commands are useful for inspecting multi-platform build results.
|
||||||
|
122
bake/bake.go
122
bake/bake.go
@@ -5,6 +5,7 @@ import (
|
|||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"os"
|
"os"
|
||||||
"path"
|
"path"
|
||||||
|
"regexp"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
@@ -12,14 +13,55 @@ import (
|
|||||||
"github.com/docker/buildx/util/platformutil"
|
"github.com/docker/buildx/util/platformutil"
|
||||||
"github.com/docker/docker/pkg/urlutil"
|
"github.com/docker/docker/pkg/urlutil"
|
||||||
hcl "github.com/hashicorp/hcl/v2"
|
hcl "github.com/hashicorp/hcl/v2"
|
||||||
|
"github.com/moby/buildkit/client/llb"
|
||||||
"github.com/moby/buildkit/session/auth/authprovider"
|
"github.com/moby/buildkit/session/auth/authprovider"
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
)
|
)
|
||||||
|
|
||||||
func ReadTargets(ctx context.Context, files, targets, overrides []string) (map[string]*Target, error) {
|
var httpPrefix = regexp.MustCompile(`^https?://`)
|
||||||
|
var gitURLPathWithFragmentSuffix = regexp.MustCompile(`\.git(?:#.+)?$`)
|
||||||
|
|
||||||
|
type File struct {
|
||||||
|
Name string
|
||||||
|
Data []byte
|
||||||
|
}
|
||||||
|
|
||||||
|
func defaultFilenames() []string {
|
||||||
|
return []string{
|
||||||
|
"docker-compose.yml", // support app
|
||||||
|
"docker-compose.yaml", // support app
|
||||||
|
"docker-bake.json",
|
||||||
|
"docker-bake.override.json",
|
||||||
|
"docker-bake.hcl",
|
||||||
|
"docker-bake.override.hcl",
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func ReadLocalFiles(names []string) ([]File, error) {
|
||||||
|
isDefault := false
|
||||||
|
if len(names) == 0 {
|
||||||
|
isDefault = true
|
||||||
|
names = defaultFilenames()
|
||||||
|
}
|
||||||
|
out := make([]File, 0, len(names))
|
||||||
|
|
||||||
|
for _, n := range names {
|
||||||
|
dt, err := ioutil.ReadFile(n)
|
||||||
|
if err != nil {
|
||||||
|
if isDefault && errors.Is(err, os.ErrNotExist) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
out = append(out, File{Name: n, Data: dt})
|
||||||
|
}
|
||||||
|
return out, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func ReadTargets(ctx context.Context, files []File, targets, overrides []string) (map[string]*Target, error) {
|
||||||
var c Config
|
var c Config
|
||||||
for _, f := range files {
|
for _, f := range files {
|
||||||
cfg, err := ParseFile(f)
|
cfg, err := ParseFile(f.Data, f.Name)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -44,12 +86,7 @@ func ReadTargets(ctx context.Context, files, targets, overrides []string) (map[s
|
|||||||
return m, nil
|
return m, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func ParseFile(fn string) (*Config, error) {
|
func ParseFile(dt []byte, fn string) (*Config, error) {
|
||||||
dt, err := ioutil.ReadFile(fn)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
fnl := strings.ToLower(fn)
|
fnl := strings.ToLower(fn)
|
||||||
if strings.HasSuffix(fnl, ".yml") || strings.HasSuffix(fnl, ".yaml") {
|
if strings.HasSuffix(fnl, ".yml") || strings.HasSuffix(fnl, ".yaml") {
|
||||||
return ParseCompose(dt)
|
return ParseCompose(dt)
|
||||||
@@ -336,20 +373,22 @@ type Target struct {
|
|||||||
// Inherits is the only field that cannot be overridden with --set
|
// Inherits is the only field that cannot be overridden with --set
|
||||||
Inherits []string `json:"inherits,omitempty" hcl:"inherits,optional"`
|
Inherits []string `json:"inherits,omitempty" hcl:"inherits,optional"`
|
||||||
|
|
||||||
Context *string `json:"context,omitempty" hcl:"context,optional"`
|
Context *string `json:"context,omitempty" hcl:"context,optional"`
|
||||||
Dockerfile *string `json:"dockerfile,omitempty" hcl:"dockerfile,optional"`
|
Dockerfile *string `json:"dockerfile,omitempty" hcl:"dockerfile,optional"`
|
||||||
Args map[string]string `json:"args,omitempty" hcl:"args,optional"`
|
DockerfileInline *string `json:"dockerfile-inline,omitempty" hcl:"dockerfile-inline,optional"`
|
||||||
Labels map[string]string `json:"labels,omitempty" hcl:"labels,optional"`
|
Args map[string]string `json:"args,omitempty" hcl:"args,optional"`
|
||||||
Tags []string `json:"tags,omitempty" hcl:"tags,optional"`
|
Labels map[string]string `json:"labels,omitempty" hcl:"labels,optional"`
|
||||||
CacheFrom []string `json:"cache-from,omitempty" hcl:"cache-from,optional"`
|
Tags []string `json:"tags,omitempty" hcl:"tags,optional"`
|
||||||
CacheTo []string `json:"cache-to,omitempty" hcl:"cache-to,optional"`
|
CacheFrom []string `json:"cache-from,omitempty" hcl:"cache-from,optional"`
|
||||||
Target *string `json:"target,omitempty" hcl:"target,optional"`
|
CacheTo []string `json:"cache-to,omitempty" hcl:"cache-to,optional"`
|
||||||
Secrets []string `json:"secret,omitempty" hcl:"secret,optional"`
|
Target *string `json:"target,omitempty" hcl:"target,optional"`
|
||||||
SSH []string `json:"ssh,omitempty" hcl:"ssh,optional"`
|
Secrets []string `json:"secret,omitempty" hcl:"secret,optional"`
|
||||||
Platforms []string `json:"platforms,omitempty" hcl:"platforms,optional"`
|
SSH []string `json:"ssh,omitempty" hcl:"ssh,optional"`
|
||||||
Outputs []string `json:"output,omitempty" hcl:"output,optional"`
|
Platforms []string `json:"platforms,omitempty" hcl:"platforms,optional"`
|
||||||
Pull *bool `json:"pull,omitempty" hcl:"pull,optional"`
|
Outputs []string `json:"output,omitempty" hcl:"output,optional"`
|
||||||
NoCache *bool `json:"no-cache,omitempty" hcl:"no-cache,optional"`
|
Pull *bool `json:"pull,omitempty" hcl:"pull,optional"`
|
||||||
|
NoCache *bool `json:"no-cache,omitempty" hcl:"no-cache,optional"`
|
||||||
|
|
||||||
// IMPORTANT: if you add more fields here, do not forget to update newOverrides and README.
|
// IMPORTANT: if you add more fields here, do not forget to update newOverrides and README.
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -363,10 +402,10 @@ func (t *Target) normalize() {
|
|||||||
t.Outputs = removeDupes(t.Outputs)
|
t.Outputs = removeDupes(t.Outputs)
|
||||||
}
|
}
|
||||||
|
|
||||||
func TargetsToBuildOpt(m map[string]*Target) (map[string]build.Options, error) {
|
func TargetsToBuildOpt(m map[string]*Target, inp *Input) (map[string]build.Options, error) {
|
||||||
m2 := make(map[string]build.Options, len(m))
|
m2 := make(map[string]build.Options, len(m))
|
||||||
for k, v := range m {
|
for k, v := range m {
|
||||||
bo, err := toBuildOpt(v)
|
bo, err := toBuildOpt(v, inp)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -375,7 +414,19 @@ func TargetsToBuildOpt(m map[string]*Target) (map[string]build.Options, error) {
|
|||||||
return m2, nil
|
return m2, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func toBuildOpt(t *Target) (*build.Options, error) {
|
func updateContext(t *build.Inputs, inp *Input) {
|
||||||
|
if inp == nil || inp.State == nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if t.ContextPath == "." {
|
||||||
|
t.ContextPath = inp.URL
|
||||||
|
return
|
||||||
|
}
|
||||||
|
st := llb.Scratch().File(llb.Copy(*inp.State, t.ContextPath, "/"), llb.WithCustomNamef("set context to %s", t.ContextPath))
|
||||||
|
t.ContextState = &st
|
||||||
|
}
|
||||||
|
|
||||||
|
func toBuildOpt(t *Target, inp *Input) (*build.Options, error) {
|
||||||
if v := t.Context; v != nil && *v == "-" {
|
if v := t.Context; v != nil && *v == "-" {
|
||||||
return nil, errors.Errorf("context from stdin not allowed in bake")
|
return nil, errors.Errorf("context from stdin not allowed in bake")
|
||||||
}
|
}
|
||||||
@@ -387,6 +438,7 @@ func toBuildOpt(t *Target) (*build.Options, error) {
|
|||||||
if t.Context != nil {
|
if t.Context != nil {
|
||||||
contextPath = *t.Context
|
contextPath = *t.Context
|
||||||
}
|
}
|
||||||
|
contextPath = path.Clean(contextPath)
|
||||||
dockerfilePath := "Dockerfile"
|
dockerfilePath := "Dockerfile"
|
||||||
if t.Dockerfile != nil {
|
if t.Dockerfile != nil {
|
||||||
dockerfilePath = *t.Dockerfile
|
dockerfilePath = *t.Dockerfile
|
||||||
@@ -405,11 +457,17 @@ func toBuildOpt(t *Target) (*build.Options, error) {
|
|||||||
pull = *t.Pull
|
pull = *t.Pull
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bi := build.Inputs{
|
||||||
|
ContextPath: contextPath,
|
||||||
|
DockerfilePath: dockerfilePath,
|
||||||
|
}
|
||||||
|
if t.DockerfileInline != nil {
|
||||||
|
bi.DockerfileInline = *t.DockerfileInline
|
||||||
|
}
|
||||||
|
updateContext(&bi, inp)
|
||||||
|
|
||||||
bo := &build.Options{
|
bo := &build.Options{
|
||||||
Inputs: build.Inputs{
|
Inputs: bi,
|
||||||
ContextPath: contextPath,
|
|
||||||
DockerfilePath: dockerfilePath,
|
|
||||||
},
|
|
||||||
Tags: t.Tags,
|
Tags: t.Tags,
|
||||||
BuildArgs: t.Args,
|
BuildArgs: t.Args,
|
||||||
Labels: t.Labels,
|
Labels: t.Labels,
|
||||||
@@ -473,6 +531,9 @@ func merge(t1, t2 *Target) *Target {
|
|||||||
if t2.Dockerfile != nil {
|
if t2.Dockerfile != nil {
|
||||||
t1.Dockerfile = t2.Dockerfile
|
t1.Dockerfile = t2.Dockerfile
|
||||||
}
|
}
|
||||||
|
if t2.DockerfileInline != nil {
|
||||||
|
t1.DockerfileInline = t2.DockerfileInline
|
||||||
|
}
|
||||||
for k, v := range t2.Args {
|
for k, v := range t2.Args {
|
||||||
if t1.Args == nil {
|
if t1.Args == nil {
|
||||||
t1.Args = map[string]string{}
|
t1.Args = map[string]string{}
|
||||||
@@ -526,6 +587,9 @@ func removeDupes(s []string) []string {
|
|||||||
if _, ok := seen[v]; ok {
|
if _, ok := seen[v]; ok {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
if v == "" {
|
||||||
|
continue
|
||||||
|
}
|
||||||
seen[v] = struct{}{}
|
seen[v] = struct{}{}
|
||||||
s[i] = v
|
s[i] = v
|
||||||
i++
|
i++
|
||||||
|
@@ -2,9 +2,7 @@ package bake
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"io/ioutil"
|
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
@@ -12,12 +10,10 @@ import (
|
|||||||
|
|
||||||
func TestReadTargets(t *testing.T) {
|
func TestReadTargets(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
tmpdir, err := ioutil.TempDir("", "bake")
|
|
||||||
require.NoError(t, err)
|
|
||||||
defer os.RemoveAll(tmpdir)
|
|
||||||
|
|
||||||
fp := filepath.Join(tmpdir, "config.hcl")
|
fp := File{
|
||||||
err = ioutil.WriteFile(fp, []byte(`
|
Name: "config.hcl",
|
||||||
|
Data: []byte(`
|
||||||
target "webDEP" {
|
target "webDEP" {
|
||||||
args = {
|
args = {
|
||||||
VAR_INHERITED = "webDEP"
|
VAR_INHERITED = "webDEP"
|
||||||
@@ -32,13 +28,13 @@ target "webapp" {
|
|||||||
VAR_BOTH = "webapp"
|
VAR_BOTH = "webapp"
|
||||||
}
|
}
|
||||||
inherits = ["webDEP"]
|
inherits = ["webDEP"]
|
||||||
}`), 0600)
|
}`),
|
||||||
require.NoError(t, err)
|
}
|
||||||
|
|
||||||
ctx := context.TODO()
|
ctx := context.TODO()
|
||||||
|
|
||||||
t.Run("NoOverrides", func(t *testing.T) {
|
t.Run("NoOverrides", func(t *testing.T) {
|
||||||
m, err := ReadTargets(ctx, []string{fp}, []string{"webapp"}, nil)
|
m, err := ReadTargets(ctx, []File{fp}, []string{"webapp"}, nil)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
require.Equal(t, 1, len(m))
|
require.Equal(t, 1, len(m))
|
||||||
|
|
||||||
@@ -50,7 +46,7 @@ target "webapp" {
|
|||||||
})
|
})
|
||||||
|
|
||||||
t.Run("InvalidTargetOverrides", func(t *testing.T) {
|
t.Run("InvalidTargetOverrides", func(t *testing.T) {
|
||||||
_, err := ReadTargets(ctx, []string{fp}, []string{"webapp"}, []string{"nosuchtarget.context=foo"})
|
_, err := ReadTargets(ctx, []File{fp}, []string{"webapp"}, []string{"nosuchtarget.context=foo"})
|
||||||
require.NotNil(t, err)
|
require.NotNil(t, err)
|
||||||
require.Equal(t, err.Error(), "could not find any target matching 'nosuchtarget'")
|
require.Equal(t, err.Error(), "could not find any target matching 'nosuchtarget'")
|
||||||
})
|
})
|
||||||
@@ -60,7 +56,7 @@ target "webapp" {
|
|||||||
os.Setenv("VAR_FROMENV"+t.Name(), "fromEnv")
|
os.Setenv("VAR_FROMENV"+t.Name(), "fromEnv")
|
||||||
defer os.Unsetenv("VAR_FROM_ENV" + t.Name())
|
defer os.Unsetenv("VAR_FROM_ENV" + t.Name())
|
||||||
|
|
||||||
m, err := ReadTargets(ctx, []string{fp}, []string{"webapp"}, []string{
|
m, err := ReadTargets(ctx, []File{fp}, []string{"webapp"}, []string{
|
||||||
"webapp.args.VAR_UNSET",
|
"webapp.args.VAR_UNSET",
|
||||||
"webapp.args.VAR_EMPTY=",
|
"webapp.args.VAR_EMPTY=",
|
||||||
"webapp.args.VAR_SET=bananas",
|
"webapp.args.VAR_SET=bananas",
|
||||||
@@ -89,7 +85,7 @@ target "webapp" {
|
|||||||
|
|
||||||
// building leaf but overriding parent fields
|
// building leaf but overriding parent fields
|
||||||
t.Run("parent", func(t *testing.T) {
|
t.Run("parent", func(t *testing.T) {
|
||||||
m, err := ReadTargets(ctx, []string{fp}, []string{"webapp"}, []string{
|
m, err := ReadTargets(ctx, []File{fp}, []string{"webapp"}, []string{
|
||||||
"webDEP.args.VAR_INHERITED=override",
|
"webDEP.args.VAR_INHERITED=override",
|
||||||
"webDEP.args.VAR_BOTH=override",
|
"webDEP.args.VAR_BOTH=override",
|
||||||
})
|
})
|
||||||
@@ -100,23 +96,23 @@ target "webapp" {
|
|||||||
})
|
})
|
||||||
|
|
||||||
t.Run("ContextOverride", func(t *testing.T) {
|
t.Run("ContextOverride", func(t *testing.T) {
|
||||||
_, err := ReadTargets(ctx, []string{fp}, []string{"webapp"}, []string{"webapp.context"})
|
_, err := ReadTargets(ctx, []File{fp}, []string{"webapp"}, []string{"webapp.context"})
|
||||||
require.NotNil(t, err)
|
require.NotNil(t, err)
|
||||||
|
|
||||||
m, err := ReadTargets(ctx, []string{fp}, []string{"webapp"}, []string{"webapp.context=foo"})
|
m, err := ReadTargets(ctx, []File{fp}, []string{"webapp"}, []string{"webapp.context=foo"})
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
require.Equal(t, "foo", *m["webapp"].Context)
|
require.Equal(t, "foo", *m["webapp"].Context)
|
||||||
})
|
})
|
||||||
|
|
||||||
t.Run("NoCacheOverride", func(t *testing.T) {
|
t.Run("NoCacheOverride", func(t *testing.T) {
|
||||||
m, err := ReadTargets(ctx, []string{fp}, []string{"webapp"}, []string{"webapp.no-cache=false"})
|
m, err := ReadTargets(ctx, []File{fp}, []string{"webapp"}, []string{"webapp.no-cache=false"})
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
require.Equal(t, false, *m["webapp"].NoCache)
|
require.Equal(t, false, *m["webapp"].NoCache)
|
||||||
})
|
})
|
||||||
|
|
||||||
t.Run("PullOverride", func(t *testing.T) {
|
t.Run("PullOverride", func(t *testing.T) {
|
||||||
m, err := ReadTargets(ctx, []string{fp}, []string{"webapp"}, []string{"webapp.pull=false"})
|
m, err := ReadTargets(ctx, []File{fp}, []string{"webapp"}, []string{"webapp.pull=false"})
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
require.Equal(t, false, *m["webapp"].Pull)
|
require.Equal(t, false, *m["webapp"].Pull)
|
||||||
})
|
})
|
||||||
@@ -176,7 +172,7 @@ target "webapp" {
|
|||||||
}
|
}
|
||||||
for _, test := range cases {
|
for _, test := range cases {
|
||||||
t.Run(test.name, func(t *testing.T) {
|
t.Run(test.name, func(t *testing.T) {
|
||||||
m, err := ReadTargets(ctx, []string{fp}, test.targets, test.overrides)
|
m, err := ReadTargets(ctx, []File{fp}, test.targets, test.overrides)
|
||||||
test.check(t, m, err)
|
test.check(t, m, err)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@@ -185,14 +181,11 @@ target "webapp" {
|
|||||||
|
|
||||||
func TestReadTargetsCompose(t *testing.T) {
|
func TestReadTargetsCompose(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
tmpdir, err := ioutil.TempDir("", "bake")
|
|
||||||
require.NoError(t, err)
|
|
||||||
defer os.RemoveAll(tmpdir)
|
|
||||||
|
|
||||||
fp := filepath.Join(tmpdir, "docker-compose.yml")
|
|
||||||
err = ioutil.WriteFile(fp, []byte(`
|
|
||||||
version: "3"
|
|
||||||
|
|
||||||
|
fp := File{
|
||||||
|
Name: "docker-compose.yml",
|
||||||
|
Data: []byte(
|
||||||
|
`version: "3"
|
||||||
services:
|
services:
|
||||||
db:
|
db:
|
||||||
build: .
|
build: .
|
||||||
@@ -203,13 +196,13 @@ services:
|
|||||||
dockerfile: Dockerfile.webapp
|
dockerfile: Dockerfile.webapp
|
||||||
args:
|
args:
|
||||||
buildno: 1
|
buildno: 1
|
||||||
`), 0600)
|
`),
|
||||||
require.NoError(t, err)
|
}
|
||||||
|
|
||||||
fp2 := filepath.Join(tmpdir, "docker-compose2.yml")
|
|
||||||
err = ioutil.WriteFile(fp2, []byte(`
|
|
||||||
version: "3"
|
|
||||||
|
|
||||||
|
fp2 := File{
|
||||||
|
Name: "docker-compose2.yml",
|
||||||
|
Data: []byte(
|
||||||
|
`version: "3"
|
||||||
services:
|
services:
|
||||||
newservice:
|
newservice:
|
||||||
build: .
|
build: .
|
||||||
@@ -217,12 +210,12 @@ services:
|
|||||||
build:
|
build:
|
||||||
args:
|
args:
|
||||||
buildno2: 12
|
buildno2: 12
|
||||||
`), 0600)
|
`),
|
||||||
require.NoError(t, err)
|
}
|
||||||
|
|
||||||
ctx := context.TODO()
|
ctx := context.TODO()
|
||||||
|
|
||||||
m, err := ReadTargets(ctx, []string{fp, fp2}, []string{"default"}, nil)
|
m, err := ReadTargets(ctx, []File{fp, fp2}, []string{"default"}, nil)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
require.Equal(t, 3, len(m))
|
require.Equal(t, 3, len(m))
|
||||||
|
57
bake/hcl.go
57
bake/hcl.go
@@ -9,6 +9,8 @@ import (
|
|||||||
"github.com/hashicorp/hcl/v2/hclsimple"
|
"github.com/hashicorp/hcl/v2/hclsimple"
|
||||||
"github.com/hashicorp/hcl/v2/hclsyntax"
|
"github.com/hashicorp/hcl/v2/hclsyntax"
|
||||||
"github.com/hashicorp/hcl/v2/json"
|
"github.com/hashicorp/hcl/v2/json"
|
||||||
|
"github.com/moby/buildkit/solver/errdefs"
|
||||||
|
"github.com/moby/buildkit/solver/pb"
|
||||||
"github.com/zclconf/go-cty/cty"
|
"github.com/zclconf/go-cty/cty"
|
||||||
"github.com/zclconf/go-cty/cty/function"
|
"github.com/zclconf/go-cty/cty/function"
|
||||||
"github.com/zclconf/go-cty/cty/function/stdlib"
|
"github.com/zclconf/go-cty/cty/function/stdlib"
|
||||||
@@ -29,6 +31,7 @@ var (
|
|||||||
"csvdecode": stdlib.CSVDecodeFunc,
|
"csvdecode": stdlib.CSVDecodeFunc,
|
||||||
"coalesce": stdlib.CoalesceFunc,
|
"coalesce": stdlib.CoalesceFunc,
|
||||||
"coalescelist": stdlib.CoalesceListFunc,
|
"coalescelist": stdlib.CoalesceListFunc,
|
||||||
|
"compact": stdlib.CompactFunc,
|
||||||
"concat": stdlib.ConcatFunc,
|
"concat": stdlib.ConcatFunc,
|
||||||
"contains": stdlib.ContainsFunc,
|
"contains": stdlib.ContainsFunc,
|
||||||
"distinct": stdlib.DistinctFunc,
|
"distinct": stdlib.DistinctFunc,
|
||||||
@@ -103,7 +106,25 @@ type staticConfig struct {
|
|||||||
Remain hcl.Body `hcl:",remain"`
|
Remain hcl.Body `hcl:",remain"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func ParseHCL(dt []byte, fn string) (*Config, error) {
|
func ParseHCL(dt []byte, fn string) (_ *Config, err error) {
|
||||||
|
if strings.HasSuffix(fn, ".json") || strings.HasSuffix(fn, ".hcl") {
|
||||||
|
return parseHCL(dt, fn)
|
||||||
|
}
|
||||||
|
cfg, err := parseHCL(dt, fn+".hcl")
|
||||||
|
if err != nil {
|
||||||
|
cfg2, err2 := parseHCL(dt, fn+".json")
|
||||||
|
if err2 == nil {
|
||||||
|
return cfg2, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return cfg, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func parseHCL(dt []byte, fn string) (_ *Config, err error) {
|
||||||
|
defer func() {
|
||||||
|
err = formatHCLError(dt, err)
|
||||||
|
}()
|
||||||
|
|
||||||
// Decode user defined functions, first parsing as hcl and falling back to
|
// Decode user defined functions, first parsing as hcl and falling back to
|
||||||
// json, returning errors based on the file suffix.
|
// json, returning errors based on the file suffix.
|
||||||
file, hcldiags := hclsyntax.ParseConfig(dt, fn, hcl.Pos{Line: 1, Column: 1})
|
file, hcldiags := hclsyntax.ParseConfig(dt, fn, hcl.Pos{Line: 1, Column: 1})
|
||||||
@@ -172,3 +193,37 @@ func ParseHCL(dt []byte, fn string) (*Config, error) {
|
|||||||
}
|
}
|
||||||
return &c, nil
|
return &c, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func formatHCLError(dt []byte, err error) error {
|
||||||
|
if err == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
diags, ok := err.(hcl.Diagnostics)
|
||||||
|
if !ok {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
for _, d := range diags {
|
||||||
|
if d.Severity != hcl.DiagError {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if d.Subject != nil {
|
||||||
|
src := errdefs.Source{
|
||||||
|
Info: &pb.SourceInfo{
|
||||||
|
Filename: d.Subject.Filename,
|
||||||
|
Data: dt,
|
||||||
|
},
|
||||||
|
Ranges: []*pb.Range{toErrRange(d.Subject)},
|
||||||
|
}
|
||||||
|
err = errdefs.WithSource(err, src)
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func toErrRange(in *hcl.Range) *pb.Range {
|
||||||
|
return &pb.Range{
|
||||||
|
Start: pb.Position{Line: int32(in.Start.Line), Character: int32(in.Start.Column)},
|
||||||
|
End: pb.Position{Line: int32(in.End.Line), Character: int32(in.End.Column)},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
236
bake/remote.go
Normal file
236
bake/remote.go
Normal file
@@ -0,0 +1,236 @@
|
|||||||
|
package bake
|
||||||
|
|
||||||
|
import (
|
||||||
|
"archive/tar"
|
||||||
|
"bytes"
|
||||||
|
"context"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"github.com/docker/buildx/build"
|
||||||
|
"github.com/docker/buildx/driver"
|
||||||
|
"github.com/docker/buildx/util/progress"
|
||||||
|
"github.com/moby/buildkit/client"
|
||||||
|
"github.com/moby/buildkit/client/llb"
|
||||||
|
gwclient "github.com/moby/buildkit/frontend/gateway/client"
|
||||||
|
"github.com/pkg/errors"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Input struct {
|
||||||
|
State *llb.State
|
||||||
|
URL string
|
||||||
|
}
|
||||||
|
|
||||||
|
func ReadRemoteFiles(ctx context.Context, dis []build.DriverInfo, url string, names []string, pw progress.Writer) ([]File, *Input, error) {
|
||||||
|
st, filename, ok := detectHttpContext(url)
|
||||||
|
if !ok {
|
||||||
|
st, ok = detectGitContext(url)
|
||||||
|
if !ok {
|
||||||
|
return nil, nil, errors.Errorf("not url context")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
inp := &Input{State: st, URL: url}
|
||||||
|
var files []File
|
||||||
|
|
||||||
|
var di *build.DriverInfo
|
||||||
|
for _, d := range dis {
|
||||||
|
if d.Err == nil {
|
||||||
|
di = &d
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if di == nil {
|
||||||
|
return nil, nil, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
c, err := driver.Boot(ctx, di.Driver, pw)
|
||||||
|
if err != nil {
|
||||||
|
return nil, nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
ch, done := progress.NewChannel(pw)
|
||||||
|
defer func() { <-done }()
|
||||||
|
_, err = c.Build(ctx, client.SolveOpt{}, "buildx", func(ctx context.Context, c gwclient.Client) (*gwclient.Result, error) {
|
||||||
|
def, err := st.Marshal(ctx)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
res, err := c.Solve(ctx, gwclient.SolveRequest{
|
||||||
|
Definition: def.ToPB(),
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
ref, err := res.SingleRef()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if filename != "" {
|
||||||
|
files, err = filesFromURLRef(ctx, c, ref, inp, filename, names)
|
||||||
|
} else {
|
||||||
|
files, err = filesFromRef(ctx, ref, names)
|
||||||
|
}
|
||||||
|
return nil, err
|
||||||
|
}, ch)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return nil, nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return files, inp, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func IsRemoteURL(url string) bool {
|
||||||
|
if _, _, ok := detectHttpContext(url); ok {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
if _, ok := detectGitContext(url); ok {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
func detectHttpContext(url string) (*llb.State, string, bool) {
|
||||||
|
if httpPrefix.MatchString(url) {
|
||||||
|
httpContext := llb.HTTP(url, llb.Filename("context"), llb.WithCustomName("[internal] load remote build context"))
|
||||||
|
return &httpContext, "context", true
|
||||||
|
}
|
||||||
|
return nil, "", false
|
||||||
|
}
|
||||||
|
|
||||||
|
func detectGitContext(ref string) (*llb.State, bool) {
|
||||||
|
found := false
|
||||||
|
if httpPrefix.MatchString(ref) && gitURLPathWithFragmentSuffix.MatchString(ref) {
|
||||||
|
found = true
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, prefix := range []string{"git://", "github.com/", "git@"} {
|
||||||
|
if strings.HasPrefix(ref, prefix) {
|
||||||
|
found = true
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if !found {
|
||||||
|
return nil, false
|
||||||
|
}
|
||||||
|
|
||||||
|
parts := strings.SplitN(ref, "#", 2)
|
||||||
|
branch := ""
|
||||||
|
if len(parts) > 1 {
|
||||||
|
branch = parts[1]
|
||||||
|
}
|
||||||
|
gitOpts := []llb.GitOption{llb.WithCustomName("[internal] load git source " + ref)}
|
||||||
|
|
||||||
|
st := llb.Git(parts[0], branch, gitOpts...)
|
||||||
|
return &st, true
|
||||||
|
}
|
||||||
|
|
||||||
|
func isArchive(header []byte) bool {
|
||||||
|
for _, m := range [][]byte{
|
||||||
|
{0x42, 0x5A, 0x68}, // bzip2
|
||||||
|
{0x1F, 0x8B, 0x08}, // gzip
|
||||||
|
{0xFD, 0x37, 0x7A, 0x58, 0x5A, 0x00}, // xz
|
||||||
|
} {
|
||||||
|
if len(header) < len(m) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if bytes.Equal(m, header[:len(m)]) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
r := tar.NewReader(bytes.NewBuffer(header))
|
||||||
|
_, err := r.Next()
|
||||||
|
return err == nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func filesFromURLRef(ctx context.Context, c gwclient.Client, ref gwclient.Reference, inp *Input, filename string, names []string) ([]File, error) {
|
||||||
|
stat, err := ref.StatFile(ctx, gwclient.StatRequest{Path: filename})
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
dt, err := ref.ReadFile(ctx, gwclient.ReadRequest{
|
||||||
|
Filename: filename,
|
||||||
|
Range: &gwclient.FileRange{
|
||||||
|
Length: 1024,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if isArchive(dt) {
|
||||||
|
bc := llb.Scratch().File(llb.Copy(inp.State, filename, "/", &llb.CopyInfo{
|
||||||
|
AttemptUnpack: true,
|
||||||
|
}))
|
||||||
|
inp.State = &bc
|
||||||
|
inp.URL = ""
|
||||||
|
def, err := bc.Marshal(ctx)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
res, err := c.Solve(ctx, gwclient.SolveRequest{
|
||||||
|
Definition: def.ToPB(),
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
ref, err := res.SingleRef()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return filesFromRef(ctx, ref, names)
|
||||||
|
}
|
||||||
|
|
||||||
|
inp.State = nil
|
||||||
|
name := inp.URL
|
||||||
|
inp.URL = ""
|
||||||
|
|
||||||
|
if len(dt) > stat.Size() {
|
||||||
|
if stat.Size() > 1024*512 {
|
||||||
|
return nil, errors.Errorf("non-archive definition URL bigger than maximum allowed size")
|
||||||
|
}
|
||||||
|
|
||||||
|
dt, err = ref.ReadFile(ctx, gwclient.ReadRequest{
|
||||||
|
Filename: filename,
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return []File{{Name: name, Data: dt}}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func filesFromRef(ctx context.Context, ref gwclient.Reference, names []string) ([]File, error) {
|
||||||
|
// TODO: auto-remove parent dir in needed
|
||||||
|
var files []File
|
||||||
|
|
||||||
|
isDefault := false
|
||||||
|
if len(names) == 0 {
|
||||||
|
isDefault = true
|
||||||
|
names = defaultFilenames()
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, name := range names {
|
||||||
|
_, err := ref.StatFile(ctx, gwclient.StatRequest{Path: name})
|
||||||
|
if err != nil {
|
||||||
|
if isDefault {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
dt, err := ref.ReadFile(ctx, gwclient.ReadRequest{Filename: name})
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
files = append(files, File{Name: name, Data: dt})
|
||||||
|
}
|
||||||
|
|
||||||
|
return files, nil
|
||||||
|
}
|
304
build/build.go
304
build/build.go
@@ -3,6 +3,7 @@ package build
|
|||||||
import (
|
import (
|
||||||
"bufio"
|
"bufio"
|
||||||
"context"
|
"context"
|
||||||
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
@@ -11,6 +12,7 @@ import (
|
|||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
|
"time"
|
||||||
|
|
||||||
"github.com/containerd/containerd/images"
|
"github.com/containerd/containerd/images"
|
||||||
"github.com/containerd/containerd/platforms"
|
"github.com/containerd/containerd/platforms"
|
||||||
@@ -19,12 +21,16 @@ import (
|
|||||||
"github.com/docker/buildx/util/progress"
|
"github.com/docker/buildx/util/progress"
|
||||||
clitypes "github.com/docker/cli/cli/config/types"
|
clitypes "github.com/docker/cli/cli/config/types"
|
||||||
"github.com/docker/distribution/reference"
|
"github.com/docker/distribution/reference"
|
||||||
|
"github.com/docker/docker/api/types"
|
||||||
dockerclient "github.com/docker/docker/client"
|
dockerclient "github.com/docker/docker/client"
|
||||||
|
"github.com/docker/docker/pkg/jsonmessage"
|
||||||
"github.com/docker/docker/pkg/urlutil"
|
"github.com/docker/docker/pkg/urlutil"
|
||||||
"github.com/moby/buildkit/client"
|
"github.com/moby/buildkit/client"
|
||||||
|
"github.com/moby/buildkit/client/llb"
|
||||||
"github.com/moby/buildkit/session"
|
"github.com/moby/buildkit/session"
|
||||||
"github.com/moby/buildkit/session/upload/uploadprovider"
|
"github.com/moby/buildkit/session/upload/uploadprovider"
|
||||||
"github.com/moby/buildkit/util/entitlements"
|
"github.com/moby/buildkit/util/entitlements"
|
||||||
|
"github.com/moby/buildkit/util/progress/progresswriter"
|
||||||
"github.com/opencontainers/go-digest"
|
"github.com/opencontainers/go-digest"
|
||||||
specs "github.com/opencontainers/image-spec/specs-go/v1"
|
specs "github.com/opencontainers/image-spec/specs-go/v1"
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
@@ -61,9 +67,11 @@ type Options struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type Inputs struct {
|
type Inputs struct {
|
||||||
ContextPath string
|
ContextPath string
|
||||||
DockerfilePath string
|
DockerfilePath string
|
||||||
InStream io.Reader
|
InStream io.Reader
|
||||||
|
ContextState *llb.State
|
||||||
|
DockerfileInline string
|
||||||
}
|
}
|
||||||
|
|
||||||
type DriverInfo struct {
|
type DriverInfo struct {
|
||||||
@@ -172,8 +180,7 @@ func splitToDriverPairs(availablePlatforms map[string]int, opt map[string]Option
|
|||||||
return m
|
return m
|
||||||
}
|
}
|
||||||
|
|
||||||
func resolveDrivers(ctx context.Context, drivers []DriverInfo, opt map[string]Options, pw progress.Writer) (map[string][]driverPair, []*client.Client, error) {
|
func resolveDrivers(ctx context.Context, drivers []DriverInfo, auth Auth, opt map[string]Options, pw progress.Writer) (map[string][]driverPair, []*client.Client, error) {
|
||||||
|
|
||||||
availablePlatforms := map[string]int{}
|
availablePlatforms := map[string]int{}
|
||||||
for i, d := range drivers {
|
for i, d := range drivers {
|
||||||
for _, p := range d.Platform {
|
for _, p := range d.Platform {
|
||||||
@@ -278,14 +285,7 @@ func toRepoOnly(in string) (string, error) {
|
|||||||
return strings.Join(out, ","), nil
|
return strings.Join(out, ","), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func isDefaultMobyDriver(d driver.Driver) bool {
|
func toSolveOpt(ctx context.Context, d driver.Driver, multiDriver bool, opt Options, pw progress.Writer, dl dockerLoadCallback) (solveOpt *client.SolveOpt, release func(), err error) {
|
||||||
_, ok := d.(interface {
|
|
||||||
IsDefaultMobyDriver()
|
|
||||||
})
|
|
||||||
return ok
|
|
||||||
}
|
|
||||||
|
|
||||||
func toSolveOpt(d driver.Driver, multiDriver bool, opt Options, dl dockerLoadCallback) (solveOpt *client.SolveOpt, release func(), err error) {
|
|
||||||
defers := make([]func(), 0, 2)
|
defers := make([]func(), 0, 2)
|
||||||
releaseF := func() {
|
releaseF := func() {
|
||||||
for _, f := range defers {
|
for _, f := range defers {
|
||||||
@@ -331,20 +331,22 @@ func toSolveOpt(d driver.Driver, multiDriver bool, opt Options, dl dockerLoadCal
|
|||||||
AllowedEntitlements: opt.Allow,
|
AllowedEntitlements: opt.Allow,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if v, ok := opt.BuildArgs["BUILDKIT_MULTI_PLATFORM"]; ok {
|
||||||
|
if v, _ := strconv.ParseBool(v); v {
|
||||||
|
so.FrontendAttrs["multi-platform"] = "true"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if multiDriver {
|
if multiDriver {
|
||||||
// force creation of manifest list
|
// force creation of manifest list
|
||||||
so.FrontendAttrs["multi-platform"] = "true"
|
so.FrontendAttrs["multi-platform"] = "true"
|
||||||
}
|
}
|
||||||
|
|
||||||
_, isDefaultMobyDriver := d.(interface {
|
|
||||||
IsDefaultMobyDriver()
|
|
||||||
})
|
|
||||||
|
|
||||||
switch len(opt.Exports) {
|
switch len(opt.Exports) {
|
||||||
case 1:
|
case 1:
|
||||||
// valid
|
// valid
|
||||||
case 0:
|
case 0:
|
||||||
if isDefaultMobyDriver && !noDefaultLoad() {
|
if d.IsMobyDriver() && !noDefaultLoad() {
|
||||||
// backwards compat for docker driver only:
|
// backwards compat for docker driver only:
|
||||||
// this ensures the build results in a docker image.
|
// this ensures the build results in a docker image.
|
||||||
opt.Exports = []client.ExportEntry{{Type: "image", Attrs: map[string]string{}}}
|
opt.Exports = []client.ExportEntry{{Type: "image", Attrs: map[string]string{}}}
|
||||||
@@ -398,7 +400,7 @@ func toSolveOpt(d driver.Driver, multiDriver bool, opt Options, dl dockerLoadCal
|
|||||||
}
|
}
|
||||||
if e.Type == "docker" {
|
if e.Type == "docker" {
|
||||||
if e.Output == nil {
|
if e.Output == nil {
|
||||||
if isDefaultMobyDriver {
|
if d.IsMobyDriver() {
|
||||||
e.Type = "image"
|
e.Type = "image"
|
||||||
} else {
|
} else {
|
||||||
w, cancel, err := dl(e.Attrs["context"])
|
w, cancel, err := dl(e.Attrs["context"])
|
||||||
@@ -412,11 +414,13 @@ func toSolveOpt(d driver.Driver, multiDriver bool, opt Options, dl dockerLoadCal
|
|||||||
return nil, nil, notSupported(d, driver.DockerExporter)
|
return nil, nil, notSupported(d, driver.DockerExporter)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if e.Type == "image" && isDefaultMobyDriver {
|
if e.Type == "image" && d.IsMobyDriver() {
|
||||||
opt.Exports[i].Type = "moby"
|
opt.Exports[i].Type = "moby"
|
||||||
if e.Attrs["push"] != "" {
|
if e.Attrs["push"] != "" {
|
||||||
if ok, _ := strconv.ParseBool(e.Attrs["push"]); ok {
|
if ok, _ := strconv.ParseBool(e.Attrs["push"]); ok {
|
||||||
return nil, nil, errors.Errorf("auto-push is currently not implemented for docker driver")
|
if ok, _ := strconv.ParseBool(e.Attrs["push-by-digest"]); ok {
|
||||||
|
return nil, nil, errors.Errorf("push-by-digest is currently not implemented for docker driver, please create a new builder instance")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -425,7 +429,7 @@ func toSolveOpt(d driver.Driver, multiDriver bool, opt Options, dl dockerLoadCal
|
|||||||
so.Exports = opt.Exports
|
so.Exports = opt.Exports
|
||||||
so.Session = opt.Session
|
so.Session = opt.Session
|
||||||
|
|
||||||
releaseLoad, err := LoadInputs(opt.Inputs, &so)
|
releaseLoad, err := LoadInputs(ctx, d, opt.Inputs, pw, &so)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, nil, err
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
@@ -479,7 +483,7 @@ func toSolveOpt(d driver.Driver, multiDriver bool, opt Options, dl dockerLoadCal
|
|||||||
return &so, releaseF, nil
|
return &so, releaseF, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func Build(ctx context.Context, drivers []DriverInfo, opt map[string]Options, docker DockerAPI, auth Auth, pw progress.Writer) (resp map[string]*client.SolveResponse, err error) {
|
func Build(ctx context.Context, drivers []DriverInfo, opt map[string]Options, docker DockerAPI, auth Auth, w progress.Writer) (resp map[string]*client.SolveResponse, err error) {
|
||||||
if len(drivers) == 0 {
|
if len(drivers) == 0 {
|
||||||
return nil, errors.Errorf("driver required for build")
|
return nil, errors.Errorf("driver required for build")
|
||||||
}
|
}
|
||||||
@@ -491,7 +495,7 @@ func Build(ctx context.Context, drivers []DriverInfo, opt map[string]Options, do
|
|||||||
|
|
||||||
var noMobyDriver driver.Driver
|
var noMobyDriver driver.Driver
|
||||||
for _, d := range drivers {
|
for _, d := range drivers {
|
||||||
if !isDefaultMobyDriver(d.Driver) {
|
if !d.Driver.IsMobyDriver() {
|
||||||
noMobyDriver = d.Driver
|
noMobyDriver = d.Driver
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
@@ -506,10 +510,8 @@ func Build(ctx context.Context, drivers []DriverInfo, opt map[string]Options, do
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
m, clients, err := resolveDrivers(ctx, drivers, opt, pw)
|
m, clients, err := resolveDrivers(ctx, drivers, auth, opt, w)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
close(pw.Status())
|
|
||||||
<-pw.Done()
|
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -522,16 +524,19 @@ func Build(ctx context.Context, drivers []DriverInfo, opt map[string]Options, do
|
|||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
|
||||||
mw := progress.NewMultiWriter(pw)
|
|
||||||
eg, ctx := errgroup.WithContext(ctx)
|
eg, ctx := errgroup.WithContext(ctx)
|
||||||
|
|
||||||
for k, opt := range opt {
|
for k, opt := range opt {
|
||||||
multiDriver := len(m[k]) > 1
|
multiDriver := len(m[k]) > 1
|
||||||
|
hasMobyDriver := false
|
||||||
for i, dp := range m[k] {
|
for i, dp := range m[k] {
|
||||||
d := drivers[dp.driverIndex].Driver
|
d := drivers[dp.driverIndex].Driver
|
||||||
|
if d.IsMobyDriver() {
|
||||||
|
hasMobyDriver = true
|
||||||
|
}
|
||||||
opt.Platforms = dp.platforms
|
opt.Platforms = dp.platforms
|
||||||
so, release, err := toSolveOpt(d, multiDriver, opt, func(name string) (io.WriteCloser, func(), error) {
|
so, release, err := toSolveOpt(ctx, d, multiDriver, opt, w, func(name string) (io.WriteCloser, func(), error) {
|
||||||
return newDockerLoader(ctx, docker, name, mw)
|
return newDockerLoader(ctx, docker, name, w)
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
@@ -539,6 +544,28 @@ func Build(ctx context.Context, drivers []DriverInfo, opt map[string]Options, do
|
|||||||
defers = append(defers, release)
|
defers = append(defers, release)
|
||||||
m[k][i].so = so
|
m[k][i].so = so
|
||||||
}
|
}
|
||||||
|
for _, at := range opt.Session {
|
||||||
|
if s, ok := at.(interface {
|
||||||
|
SetLogger(progresswriter.Logger)
|
||||||
|
}); ok {
|
||||||
|
s.SetLogger(func(s *client.SolveStatus) {
|
||||||
|
w.Write(s)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// validate for multi-node push
|
||||||
|
if hasMobyDriver && multiDriver {
|
||||||
|
for _, dp := range m[k] {
|
||||||
|
for _, e := range dp.so.Exports {
|
||||||
|
if e.Type == "moby" {
|
||||||
|
if ok, _ := strconv.ParseBool(e.Attrs["push"]); ok {
|
||||||
|
return nil, errors.Errorf("multi-node push can't currently be performed with the docker driver, please switch to a different driver")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
resp = map[string]*client.SolveResponse{}
|
resp = map[string]*client.SolveResponse{}
|
||||||
@@ -559,8 +586,7 @@ func Build(ctx context.Context, drivers []DriverInfo, opt map[string]Options, do
|
|||||||
var pushNames string
|
var pushNames string
|
||||||
|
|
||||||
eg.Go(func() error {
|
eg.Go(func() error {
|
||||||
pw := mw.WithPrefix("default", false)
|
pw := progress.WithPrefix(w, "default", false)
|
||||||
defer close(pw.Status())
|
|
||||||
wg.Wait()
|
wg.Wait()
|
||||||
select {
|
select {
|
||||||
case <-ctx.Done():
|
case <-ctx.Done():
|
||||||
@@ -663,27 +689,43 @@ func Build(ctx context.Context, drivers []DriverInfo, opt map[string]Options, do
|
|||||||
}
|
}
|
||||||
|
|
||||||
func(i int, dp driverPair, so client.SolveOpt) {
|
func(i int, dp driverPair, so client.SolveOpt) {
|
||||||
pw := mw.WithPrefix(k, multiTarget)
|
pw := progress.WithPrefix(w, k, multiTarget)
|
||||||
|
|
||||||
c := clients[dp.driverIndex]
|
c := clients[dp.driverIndex]
|
||||||
|
|
||||||
var statusCh chan *client.SolveStatus
|
pw = progress.ResetTime(pw)
|
||||||
if pw != nil {
|
|
||||||
pw = progress.ResetTime(pw)
|
|
||||||
statusCh = pw.Status()
|
|
||||||
eg.Go(func() error {
|
|
||||||
<-pw.Done()
|
|
||||||
return pw.Err()
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
eg.Go(func() error {
|
eg.Go(func() error {
|
||||||
defer wg.Done()
|
defer wg.Done()
|
||||||
rr, err := c.Solve(ctx, nil, so, statusCh)
|
ch, done := progress.NewChannel(pw)
|
||||||
|
defer func() { <-done }()
|
||||||
|
rr, err := c.Solve(ctx, nil, so, ch)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
res[i] = rr
|
res[i] = rr
|
||||||
|
|
||||||
|
d := drivers[dp.driverIndex].Driver
|
||||||
|
if d.IsMobyDriver() {
|
||||||
|
for _, e := range so.Exports {
|
||||||
|
if e.Type == "moby" && e.Attrs["push"] != "" {
|
||||||
|
if ok, _ := strconv.ParseBool(e.Attrs["push"]); ok {
|
||||||
|
pushNames = e.Attrs["name"]
|
||||||
|
if pushNames == "" {
|
||||||
|
return errors.Errorf("tag is needed when pushing to registry")
|
||||||
|
}
|
||||||
|
pw := progress.ResetTime(pw)
|
||||||
|
for _, name := range strings.Split(pushNames, ",") {
|
||||||
|
if err := progress.Wrap(fmt.Sprintf("pushing %s with docker", name), pw.Write, func(l progress.SubLogger) error {
|
||||||
|
return pushWithMoby(ctx, d, name, l)
|
||||||
|
}); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
return nil
|
return nil
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -704,6 +746,86 @@ func Build(ctx context.Context, drivers []DriverInfo, opt map[string]Options, do
|
|||||||
return resp, nil
|
return resp, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func pushWithMoby(ctx context.Context, d driver.Driver, name string, l progress.SubLogger) error {
|
||||||
|
api := d.Config().DockerAPI
|
||||||
|
if api == nil {
|
||||||
|
return errors.Errorf("invalid empty Docker API reference") // should never happen
|
||||||
|
}
|
||||||
|
creds, err := imagetools.RegistryAuthForRef(name, d.Config().Auth)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
rc, err := api.ImagePush(ctx, name, types.ImagePushOptions{
|
||||||
|
RegistryAuth: creds,
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
started := map[string]*client.VertexStatus{}
|
||||||
|
|
||||||
|
defer func() {
|
||||||
|
for _, st := range started {
|
||||||
|
if st.Completed == nil {
|
||||||
|
now := time.Now()
|
||||||
|
st.Completed = &now
|
||||||
|
l.SetStatus(st)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
dec := json.NewDecoder(rc)
|
||||||
|
var parsedError error
|
||||||
|
for {
|
||||||
|
var jm jsonmessage.JSONMessage
|
||||||
|
if err := dec.Decode(&jm); err != nil {
|
||||||
|
if parsedError != nil {
|
||||||
|
return parsedError
|
||||||
|
}
|
||||||
|
if err == io.EOF {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if jm.ID != "" {
|
||||||
|
id := "pushing layer " + jm.ID
|
||||||
|
st, ok := started[id]
|
||||||
|
if !ok {
|
||||||
|
if jm.Progress != nil || jm.Status == "Pushed" {
|
||||||
|
now := time.Now()
|
||||||
|
st = &client.VertexStatus{
|
||||||
|
ID: id,
|
||||||
|
Started: &now,
|
||||||
|
}
|
||||||
|
started[id] = st
|
||||||
|
} else {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
st.Timestamp = time.Now()
|
||||||
|
if jm.Progress != nil {
|
||||||
|
st.Current = jm.Progress.Current
|
||||||
|
st.Total = jm.Progress.Total
|
||||||
|
}
|
||||||
|
if jm.Error != nil {
|
||||||
|
now := time.Now()
|
||||||
|
st.Completed = &now
|
||||||
|
}
|
||||||
|
if jm.Status == "Pushed" {
|
||||||
|
now := time.Now()
|
||||||
|
st.Completed = &now
|
||||||
|
st.Current = st.Total
|
||||||
|
}
|
||||||
|
l.SetStatus(st)
|
||||||
|
}
|
||||||
|
if jm.Error != nil {
|
||||||
|
parsedError = jm.Error
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func createTempDockerfile(r io.Reader) (string, error) {
|
func createTempDockerfile(r io.Reader) (string, error) {
|
||||||
dir, err := ioutil.TempDir("", "dockerfile")
|
dir, err := ioutil.TempDir("", "dockerfile")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -720,7 +842,7 @@ func createTempDockerfile(r io.Reader) (string, error) {
|
|||||||
return dir, err
|
return dir, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func LoadInputs(inp Inputs, target *client.SolveOpt) (func(), error) {
|
func LoadInputs(ctx context.Context, d driver.Driver, inp Inputs, pw progress.Writer, target *client.SolveOpt) (func(), error) {
|
||||||
if inp.ContextPath == "" {
|
if inp.ContextPath == "" {
|
||||||
return nil, errors.New("please specify build context (e.g. \".\" for the current directory)")
|
return nil, errors.New("please specify build context (e.g. \".\" for the current directory)")
|
||||||
}
|
}
|
||||||
@@ -736,6 +858,12 @@ func LoadInputs(inp Inputs, target *client.SolveOpt) (func(), error) {
|
|||||||
)
|
)
|
||||||
|
|
||||||
switch {
|
switch {
|
||||||
|
case inp.ContextState != nil:
|
||||||
|
if target.FrontendInputs == nil {
|
||||||
|
target.FrontendInputs = make(map[string]llb.State)
|
||||||
|
}
|
||||||
|
target.FrontendInputs["context"] = *inp.ContextState
|
||||||
|
target.FrontendInputs["dockerfile"] = *inp.ContextState
|
||||||
case inp.ContextPath == "-":
|
case inp.ContextPath == "-":
|
||||||
if inp.DockerfilePath == "-" {
|
if inp.DockerfilePath == "-" {
|
||||||
return nil, errStdinConflict
|
return nil, errStdinConflict
|
||||||
@@ -746,21 +874,22 @@ func LoadInputs(inp Inputs, target *client.SolveOpt) (func(), error) {
|
|||||||
if err != nil && err != io.EOF {
|
if err != nil && err != io.EOF {
|
||||||
return nil, errors.Wrap(err, "failed to peek context header from STDIN")
|
return nil, errors.Wrap(err, "failed to peek context header from STDIN")
|
||||||
}
|
}
|
||||||
|
if !(err == io.EOF && len(magic) == 0) {
|
||||||
if isArchive(magic) {
|
if isArchive(magic) {
|
||||||
// stdin is context
|
// stdin is context
|
||||||
up := uploadprovider.New()
|
up := uploadprovider.New()
|
||||||
target.FrontendAttrs["context"] = up.Add(buf)
|
target.FrontendAttrs["context"] = up.Add(buf)
|
||||||
target.Session = append(target.Session, up)
|
target.Session = append(target.Session, up)
|
||||||
} else {
|
} else {
|
||||||
if inp.DockerfilePath != "" {
|
if inp.DockerfilePath != "" {
|
||||||
return nil, errDockerfileConflict
|
return nil, errDockerfileConflict
|
||||||
|
}
|
||||||
|
// stdin is dockerfile
|
||||||
|
dockerfileReader = buf
|
||||||
|
inp.ContextPath, _ = ioutil.TempDir("", "empty-dir")
|
||||||
|
toRemove = append(toRemove, inp.ContextPath)
|
||||||
|
target.LocalDirs["context"] = inp.ContextPath
|
||||||
}
|
}
|
||||||
// stdin is dockerfile
|
|
||||||
dockerfileReader = buf
|
|
||||||
inp.ContextPath, _ = ioutil.TempDir("", "empty-dir")
|
|
||||||
toRemove = append(toRemove, inp.ContextPath)
|
|
||||||
target.LocalDirs["context"] = inp.ContextPath
|
|
||||||
}
|
}
|
||||||
|
|
||||||
case isLocalDir(inp.ContextPath):
|
case isLocalDir(inp.ContextPath):
|
||||||
@@ -784,6 +913,10 @@ func LoadInputs(inp Inputs, target *client.SolveOpt) (func(), error) {
|
|||||||
return nil, errors.Errorf("unable to prepare context: path %q not found", inp.ContextPath)
|
return nil, errors.Errorf("unable to prepare context: path %q not found", inp.ContextPath)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if inp.DockerfileInline != "" {
|
||||||
|
dockerfileReader = strings.NewReader(inp.DockerfileInline)
|
||||||
|
}
|
||||||
|
|
||||||
if dockerfileReader != nil {
|
if dockerfileReader != nil {
|
||||||
dockerfileDir, err = createTempDockerfile(dockerfileReader)
|
dockerfileDir, err = createTempDockerfile(dockerfileReader)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -791,17 +924,30 @@ func LoadInputs(inp Inputs, target *client.SolveOpt) (func(), error) {
|
|||||||
}
|
}
|
||||||
toRemove = append(toRemove, dockerfileDir)
|
toRemove = append(toRemove, dockerfileDir)
|
||||||
dockerfileName = "Dockerfile"
|
dockerfileName = "Dockerfile"
|
||||||
|
target.FrontendAttrs["dockerfilekey"] = "dockerfile"
|
||||||
|
}
|
||||||
|
if urlutil.IsURL(inp.DockerfilePath) {
|
||||||
|
dockerfileDir, err = createTempDockerfileFromURL(ctx, d, inp.DockerfilePath, pw)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
toRemove = append(toRemove, dockerfileDir)
|
||||||
|
dockerfileName = "Dockerfile"
|
||||||
|
target.FrontendAttrs["dockerfilekey"] = "dockerfile"
|
||||||
|
delete(target.FrontendInputs, "dockerfile")
|
||||||
}
|
}
|
||||||
|
|
||||||
if dockerfileName == "" {
|
if dockerfileName == "" {
|
||||||
dockerfileName = "Dockerfile"
|
dockerfileName = "Dockerfile"
|
||||||
}
|
}
|
||||||
target.FrontendAttrs["filename"] = dockerfileName
|
|
||||||
|
|
||||||
if dockerfileDir != "" {
|
if dockerfileDir != "" {
|
||||||
target.LocalDirs["dockerfile"] = dockerfileDir
|
target.LocalDirs["dockerfile"] = dockerfileDir
|
||||||
|
dockerfileName = handleLowercaseDockerfile(dockerfileDir, dockerfileName)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
target.FrontendAttrs["filename"] = dockerfileName
|
||||||
|
|
||||||
release := func() {
|
release := func() {
|
||||||
for _, dir := range toRemove {
|
for _, dir := range toRemove {
|
||||||
os.RemoveAll(dir)
|
os.RemoveAll(dir)
|
||||||
@@ -816,7 +962,7 @@ func notSupported(d driver.Driver, f driver.Feature) error {
|
|||||||
|
|
||||||
type dockerLoadCallback func(name string) (io.WriteCloser, func(), error)
|
type dockerLoadCallback func(name string) (io.WriteCloser, func(), error)
|
||||||
|
|
||||||
func newDockerLoader(ctx context.Context, d DockerAPI, name string, mw *progress.MultiWriter) (io.WriteCloser, func(), error) {
|
func newDockerLoader(ctx context.Context, d DockerAPI, name string, status progress.Writer) (io.WriteCloser, func(), error) {
|
||||||
c, err := d.DockerAPI(name)
|
c, err := d.DockerAPI(name)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, nil, err
|
return nil, nil, err
|
||||||
@@ -839,7 +985,7 @@ func newDockerLoader(ctx context.Context, d DockerAPI, name string, mw *progress
|
|||||||
w.mu.Unlock()
|
w.mu.Unlock()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
prog := mw.WithPrefix("", false)
|
prog := progress.WithPrefix(status, "", false)
|
||||||
progress.FromReader(prog, "importing to docker", resp.Body)
|
progress.FromReader(prog, "importing to docker", resp.Body)
|
||||||
},
|
},
|
||||||
done: done,
|
done: done,
|
||||||
@@ -851,7 +997,10 @@ func newDockerLoader(ctx context.Context, d DockerAPI, name string, mw *progress
|
|||||||
}
|
}
|
||||||
|
|
||||||
func noDefaultLoad() bool {
|
func noDefaultLoad() bool {
|
||||||
v := os.Getenv("BUILDX_NO_DEFAULT_LOAD")
|
v, ok := os.LookupEnv("BUILDX_NO_DEFAULT_LOAD")
|
||||||
|
if !ok {
|
||||||
|
return false
|
||||||
|
}
|
||||||
b, err := strconv.ParseBool(v)
|
b, err := strconv.ParseBool(v)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logrus.Warnf("invalid non-bool value for BUILDX_NO_DEFAULT_LOAD: %s", v)
|
logrus.Warnf("invalid non-bool value for BUILDX_NO_DEFAULT_LOAD: %s", v)
|
||||||
@@ -886,3 +1035,34 @@ func (w *waitingWriter) Close() error {
|
|||||||
}
|
}
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// handle https://github.com/moby/moby/pull/10858
|
||||||
|
func handleLowercaseDockerfile(dir, p string) string {
|
||||||
|
if filepath.Base(p) != "Dockerfile" {
|
||||||
|
return p
|
||||||
|
}
|
||||||
|
|
||||||
|
f, err := os.Open(filepath.Dir(filepath.Join(dir, p)))
|
||||||
|
if err != nil {
|
||||||
|
return p
|
||||||
|
}
|
||||||
|
|
||||||
|
names, err := f.Readdirnames(-1)
|
||||||
|
if err != nil {
|
||||||
|
return p
|
||||||
|
}
|
||||||
|
|
||||||
|
foundLowerCase := false
|
||||||
|
for _, n := range names {
|
||||||
|
if n == "Dockerfile" {
|
||||||
|
return p
|
||||||
|
}
|
||||||
|
if n == "dockerfile" {
|
||||||
|
foundLowerCase = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if foundLowerCase {
|
||||||
|
return filepath.Join(filepath.Dir(p), "dockerfile")
|
||||||
|
}
|
||||||
|
return p
|
||||||
|
}
|
||||||
|
@@ -10,7 +10,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func ParseSecretSpecs(sl []string) (session.Attachable, error) {
|
func ParseSecretSpecs(sl []string) (session.Attachable, error) {
|
||||||
fs := make([]secretsprovider.FileSource, 0, len(sl))
|
fs := make([]secretsprovider.Source, 0, len(sl))
|
||||||
for _, v := range sl {
|
for _, v := range sl {
|
||||||
s, err := parseSecret(v)
|
s, err := parseSecret(v)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -18,21 +18,21 @@ func ParseSecretSpecs(sl []string) (session.Attachable, error) {
|
|||||||
}
|
}
|
||||||
fs = append(fs, *s)
|
fs = append(fs, *s)
|
||||||
}
|
}
|
||||||
store, err := secretsprovider.NewFileStore(fs)
|
store, err := secretsprovider.NewStore(fs)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
return secretsprovider.NewSecretProvider(store), nil
|
return secretsprovider.NewSecretProvider(store), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func parseSecret(value string) (*secretsprovider.FileSource, error) {
|
func parseSecret(value string) (*secretsprovider.Source, error) {
|
||||||
csvReader := csv.NewReader(strings.NewReader(value))
|
csvReader := csv.NewReader(strings.NewReader(value))
|
||||||
fields, err := csvReader.Read()
|
fields, err := csvReader.Read()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, errors.Wrap(err, "failed to parse csv secret")
|
return nil, errors.Wrap(err, "failed to parse csv secret")
|
||||||
}
|
}
|
||||||
|
|
||||||
fs := secretsprovider.FileSource{}
|
fs := secretsprovider.Source{}
|
||||||
|
|
||||||
for _, field := range fields {
|
for _, field := range fields {
|
||||||
parts := strings.SplitN(field, "=", 2)
|
parts := strings.SplitN(field, "=", 2)
|
||||||
|
71
build/url.go
Normal file
71
build/url.go
Normal file
@@ -0,0 +1,71 @@
|
|||||||
|
package build
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"io/ioutil"
|
||||||
|
"path/filepath"
|
||||||
|
|
||||||
|
"github.com/docker/buildx/driver"
|
||||||
|
"github.com/docker/buildx/util/progress"
|
||||||
|
"github.com/moby/buildkit/client"
|
||||||
|
"github.com/moby/buildkit/client/llb"
|
||||||
|
gwclient "github.com/moby/buildkit/frontend/gateway/client"
|
||||||
|
"github.com/pkg/errors"
|
||||||
|
)
|
||||||
|
|
||||||
|
func createTempDockerfileFromURL(ctx context.Context, d driver.Driver, url string, pw progress.Writer) (string, error) {
|
||||||
|
c, err := driver.Boot(ctx, d, pw)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
var out string
|
||||||
|
ch, done := progress.NewChannel(pw)
|
||||||
|
defer func() { <-done }()
|
||||||
|
_, err = c.Build(ctx, client.SolveOpt{}, "buildx", func(ctx context.Context, c gwclient.Client) (*gwclient.Result, error) {
|
||||||
|
def, err := llb.HTTP(url, llb.Filename("Dockerfile"), llb.WithCustomNamef("[internal] load %s", url)).Marshal(ctx)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
res, err := c.Solve(ctx, gwclient.SolveRequest{
|
||||||
|
Definition: def.ToPB(),
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
ref, err := res.SingleRef()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
stat, err := ref.StatFile(ctx, gwclient.StatRequest{
|
||||||
|
Path: "Dockerfile",
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if stat.Size() > 512*1024 {
|
||||||
|
return nil, errors.Errorf("Dockerfile %s bigger than allowed max size", url)
|
||||||
|
}
|
||||||
|
|
||||||
|
dt, err := ref.ReadFile(ctx, gwclient.ReadRequest{
|
||||||
|
Filename: "Dockerfile",
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
dir, err := ioutil.TempDir("", "buildx")
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if err := ioutil.WriteFile(filepath.Join(dir, "Dockerfile"), dt, 0600); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
out = dir
|
||||||
|
return nil, nil
|
||||||
|
}, ch)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
return out, nil
|
||||||
|
}
|
@@ -7,11 +7,14 @@ import (
|
|||||||
"github.com/containerd/containerd/pkg/seed"
|
"github.com/containerd/containerd/pkg/seed"
|
||||||
"github.com/docker/buildx/commands"
|
"github.com/docker/buildx/commands"
|
||||||
"github.com/docker/buildx/version"
|
"github.com/docker/buildx/version"
|
||||||
|
"github.com/docker/cli/cli"
|
||||||
"github.com/docker/cli/cli-plugins/manager"
|
"github.com/docker/cli/cli-plugins/manager"
|
||||||
"github.com/docker/cli/cli-plugins/plugin"
|
"github.com/docker/cli/cli-plugins/plugin"
|
||||||
"github.com/docker/cli/cli/command"
|
"github.com/docker/cli/cli/command"
|
||||||
|
"github.com/docker/cli/cli/debug"
|
||||||
cliflags "github.com/docker/cli/cli/flags"
|
cliflags "github.com/docker/cli/cli/flags"
|
||||||
"github.com/spf13/cobra"
|
"github.com/moby/buildkit/solver/errdefs"
|
||||||
|
"github.com/moby/buildkit/util/stack"
|
||||||
|
|
||||||
// FIXME: "k8s.io/client-go/plugin/pkg/client/auth/azure" is excluded because of compilation error
|
// FIXME: "k8s.io/client-go/plugin/pkg/client/auth/azure" is excluded because of compilation error
|
||||||
_ "k8s.io/client-go/plugin/pkg/client/auth/gcp"
|
_ "k8s.io/client-go/plugin/pkg/client/auth/gcp"
|
||||||
@@ -27,6 +30,7 @@ var experimental string
|
|||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
seed.WithTimeAndRand()
|
seed.WithTimeAndRand()
|
||||||
|
stack.SetVersionInfo(version.Version, version.Revision)
|
||||||
}
|
}
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
@@ -47,13 +51,42 @@ func main() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
plugin.Run(func(dockerCli command.Cli) *cobra.Command {
|
dockerCli, err := command.NewDockerCli()
|
||||||
return commands.NewRootCmd("buildx", true, dockerCli)
|
if err != nil {
|
||||||
},
|
fmt.Fprintln(os.Stderr, err)
|
||||||
manager.Metadata{
|
os.Exit(1)
|
||||||
SchemaVersion: "0.1.0",
|
}
|
||||||
Vendor: "Docker Inc.",
|
|
||||||
Version: version.Version,
|
p := commands.NewRootCmd("buildx", true, dockerCli)
|
||||||
Experimental: experimental != "",
|
meta := manager.Metadata{
|
||||||
})
|
SchemaVersion: "0.1.0",
|
||||||
|
Vendor: "Docker Inc.",
|
||||||
|
Version: version.Version,
|
||||||
|
Experimental: experimental != "",
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := plugin.RunPlugin(dockerCli, p, meta); err != nil {
|
||||||
|
if sterr, ok := err.(cli.StatusError); ok {
|
||||||
|
if sterr.Status != "" {
|
||||||
|
fmt.Fprintln(dockerCli.Err(), sterr.Status)
|
||||||
|
}
|
||||||
|
// StatusError should only be used for errors, and all errors should
|
||||||
|
// have a non-zero exit status, so never exit with 0
|
||||||
|
if sterr.StatusCode == 0 {
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
os.Exit(sterr.StatusCode)
|
||||||
|
}
|
||||||
|
for _, s := range errdefs.Sources(err) {
|
||||||
|
s.Print(dockerCli.Err())
|
||||||
|
}
|
||||||
|
|
||||||
|
if debug.IsEnabled() {
|
||||||
|
fmt.Fprintf(dockerCli.Err(), "error: %+v", stack.Formatter(err))
|
||||||
|
} else {
|
||||||
|
fmt.Fprintf(dockerCli.Err(), "error: %v\n", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
1
codecov.yml
Normal file
1
codecov.yml
Normal file
@@ -0,0 +1 @@
|
|||||||
|
comment: false
|
@@ -1,11 +1,14 @@
|
|||||||
package commands
|
package commands
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"context"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
|
|
||||||
"github.com/docker/buildx/bake"
|
"github.com/docker/buildx/bake"
|
||||||
|
"github.com/docker/buildx/build"
|
||||||
|
"github.com/docker/buildx/util/progress"
|
||||||
"github.com/docker/cli/cli/command"
|
"github.com/docker/cli/cli/command"
|
||||||
"github.com/moby/buildkit/util/appcontext"
|
"github.com/moby/buildkit/util/appcontext"
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
@@ -19,18 +22,16 @@ type bakeOptions struct {
|
|||||||
commonOptions
|
commonOptions
|
||||||
}
|
}
|
||||||
|
|
||||||
func runBake(dockerCli command.Cli, targets []string, in bakeOptions) error {
|
func runBake(dockerCli command.Cli, targets []string, in bakeOptions) (err error) {
|
||||||
ctx := appcontext.Context()
|
ctx := appcontext.Context()
|
||||||
|
|
||||||
if len(in.files) == 0 {
|
var url string
|
||||||
files, err := defaultFiles()
|
|
||||||
if err != nil {
|
if len(targets) > 0 {
|
||||||
return err
|
if bake.IsRemoteURL(targets[0]) {
|
||||||
|
url = targets[0]
|
||||||
|
targets = targets[1:]
|
||||||
}
|
}
|
||||||
if len(files) == 0 {
|
|
||||||
return errors.Errorf("no docker-compose.yml or docker-bake.hcl found, specify build file with -f/--file")
|
|
||||||
}
|
|
||||||
in.files = files
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(targets) == 0 {
|
if len(targets) == 0 {
|
||||||
@@ -52,8 +53,38 @@ func runBake(dockerCli command.Cli, targets []string, in bakeOptions) error {
|
|||||||
if in.pull != nil {
|
if in.pull != nil {
|
||||||
overrides = append(overrides, fmt.Sprintf("*.pull=%t", *in.pull))
|
overrides = append(overrides, fmt.Sprintf("*.pull=%t", *in.pull))
|
||||||
}
|
}
|
||||||
|
contextPathHash, _ := os.Getwd()
|
||||||
|
|
||||||
m, err := bake.ReadTargets(ctx, in.files, targets, overrides)
|
ctx2, cancel := context.WithCancel(context.TODO())
|
||||||
|
defer cancel()
|
||||||
|
printer := progress.NewPrinter(ctx2, os.Stderr, in.progress)
|
||||||
|
|
||||||
|
defer func() {
|
||||||
|
if printer != nil {
|
||||||
|
err1 := printer.Wait()
|
||||||
|
if err == nil {
|
||||||
|
err = err1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
dis, err := getInstanceOrDefault(ctx, dockerCli, in.builder, contextPathHash)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
var files []bake.File
|
||||||
|
var inp *bake.Input
|
||||||
|
if url != "" {
|
||||||
|
files, inp, err = bake.ReadRemoteFiles(ctx, dis, url, in.files, printer)
|
||||||
|
} else {
|
||||||
|
files, err = bake.ReadLocalFiles(in.files)
|
||||||
|
}
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
m, err := bake.ReadTargets(ctx, files, targets, overrides)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@@ -63,40 +94,22 @@ func runBake(dockerCli command.Cli, targets []string, in bakeOptions) error {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
err = printer.Wait()
|
||||||
|
printer = nil
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
fmt.Fprintln(dockerCli.Out(), string(dt))
|
fmt.Fprintln(dockerCli.Out(), string(dt))
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
bo, err := bake.TargetsToBuildOpt(m)
|
bo, err := bake.TargetsToBuildOpt(m, inp)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
contextPathHash, _ := os.Getwd()
|
_, err = build.Build(ctx, dis, bo, dockerAPI(dockerCli), dockerCli.ConfigFile(), printer)
|
||||||
|
return err
|
||||||
return buildTargets(ctx, dockerCli, bo, in.progress, contextPathHash, in.builder)
|
|
||||||
}
|
|
||||||
|
|
||||||
func defaultFiles() ([]string, error) {
|
|
||||||
fns := []string{
|
|
||||||
"docker-compose.yml", // support app
|
|
||||||
"docker-compose.yaml", // support app
|
|
||||||
"docker-bake.json",
|
|
||||||
"docker-bake.override.json",
|
|
||||||
"docker-bake.hcl",
|
|
||||||
"docker-bake.override.hcl",
|
|
||||||
}
|
|
||||||
out := make([]string, 0, len(fns))
|
|
||||||
for _, f := range fns {
|
|
||||||
if _, err := os.Stat(f); err != nil {
|
|
||||||
if os.IsNotExist(errors.Cause(err)) {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
out = append(out, f)
|
|
||||||
}
|
|
||||||
return out, nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func bakeCmd(dockerCli command.Cli, rootOpts *rootOptions) *cobra.Command {
|
func bakeCmd(dockerCli command.Cli, rootOpts *rootOptions) *cobra.Command {
|
||||||
|
@@ -15,6 +15,7 @@ import (
|
|||||||
"github.com/moby/buildkit/session/auth/authprovider"
|
"github.com/moby/buildkit/session/auth/authprovider"
|
||||||
"github.com/moby/buildkit/util/appcontext"
|
"github.com/moby/buildkit/util/appcontext"
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
|
"github.com/sirupsen/logrus"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
"github.com/spf13/pflag"
|
"github.com/spf13/pflag"
|
||||||
)
|
)
|
||||||
@@ -75,7 +76,7 @@ func runBuild(dockerCli command.Cli, in buildOptions) error {
|
|||||||
return errors.Errorf("squash currently not implemented")
|
return errors.Errorf("squash currently not implemented")
|
||||||
}
|
}
|
||||||
if in.quiet {
|
if in.quiet {
|
||||||
return errors.Errorf("quiet currently not implemented")
|
logrus.Warnf("quiet currently not implemented")
|
||||||
}
|
}
|
||||||
|
|
||||||
ctx := appcontext.Context()
|
ctx := appcontext.Context()
|
||||||
@@ -202,9 +203,14 @@ func buildTargets(ctx context.Context, dockerCli command.Cli, opts map[string]bu
|
|||||||
|
|
||||||
ctx2, cancel := context.WithCancel(context.TODO())
|
ctx2, cancel := context.WithCancel(context.TODO())
|
||||||
defer cancel()
|
defer cancel()
|
||||||
pw := progress.NewPrinter(ctx2, os.Stderr, progressMode)
|
printer := progress.NewPrinter(ctx2, os.Stderr, progressMode)
|
||||||
|
|
||||||
|
_, err = build.Build(ctx, dis, opts, dockerAPI(dockerCli), dockerCli.ConfigFile(), printer)
|
||||||
|
err1 := printer.Wait()
|
||||||
|
if err == nil {
|
||||||
|
err = err1
|
||||||
|
}
|
||||||
|
|
||||||
_, err = build.Build(ctx, dis, opts, dockerAPI(dockerCli), dockerCli.ConfigFile(), pw)
|
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -142,6 +142,12 @@ func runCreate(dockerCli command.Cli, in createOptions, args []string) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if in.driver == "kubernetes" {
|
||||||
|
// naming endpoint to make --append works
|
||||||
|
ep = fmt.Sprintf("%s://%s?deployment=%s", in.driver, in.name, in.nodeName)
|
||||||
|
}
|
||||||
|
|
||||||
m, err := csvToMap(in.driverOpts)
|
m, err := csvToMap(in.driverOpts)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
@@ -109,7 +109,6 @@ func duCmd(dockerCli command.Cli, rootOpts *rootOptions) *cobra.Command {
|
|||||||
options.builder = rootOpts.builder
|
options.builder = rootOpts.builder
|
||||||
return runDiskUsage(dockerCli, options)
|
return runDiskUsage(dockerCli, options)
|
||||||
},
|
},
|
||||||
Annotations: map[string]string{"version": "1.00"},
|
|
||||||
}
|
}
|
||||||
|
|
||||||
flags := cmd.Flags()
|
flags := cmd.Flags()
|
||||||
|
@@ -79,12 +79,14 @@ func runInspect(dockerCli command.Cli, in inspectOptions) error {
|
|||||||
|
|
||||||
err = loadNodeGroupData(timeoutCtx, dockerCli, ngi)
|
err = loadNodeGroupData(timeoutCtx, dockerCli, ngi)
|
||||||
|
|
||||||
|
var bootNgi *nginfo
|
||||||
if in.bootstrap {
|
if in.bootstrap {
|
||||||
var ok bool
|
var ok bool
|
||||||
ok, err = boot(ctx, ngi)
|
ok, err = boot(ctx, ngi, dockerCli)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
bootNgi = ngi
|
||||||
if ok {
|
if ok {
|
||||||
ngi = &nginfo{ng: ng}
|
ngi = &nginfo{ng: ng}
|
||||||
err = loadNodeGroupData(ctx, dockerCli, ngi)
|
err = loadNodeGroupData(ctx, dockerCli, ngi)
|
||||||
@@ -113,6 +115,8 @@ func runInspect(dockerCli command.Cli, in inspectOptions) error {
|
|||||||
fmt.Fprintf(w, "Error:\t%s\n", err.Error())
|
fmt.Fprintf(w, "Error:\t%s\n", err.Error())
|
||||||
} else if err := ngi.drivers[i].err; err != nil {
|
} else if err := ngi.drivers[i].err; err != nil {
|
||||||
fmt.Fprintf(w, "Error:\t%s\n", err.Error())
|
fmt.Fprintf(w, "Error:\t%s\n", err.Error())
|
||||||
|
} else if bootNgi != nil && len(bootNgi.drivers) > i && bootNgi.drivers[i].err != nil {
|
||||||
|
fmt.Fprintf(w, "Error:\t%s\n", bootNgi.drivers[i].err.Error())
|
||||||
} else {
|
} else {
|
||||||
fmt.Fprintf(w, "Status:\t%s\n", ngi.drivers[i].info.Status)
|
fmt.Fprintf(w, "Status:\t%s\n", ngi.drivers[i].info.Status)
|
||||||
if len(n.Flags) > 0 {
|
if len(n.Flags) > 0 {
|
||||||
@@ -153,7 +157,7 @@ func inspectCmd(dockerCli command.Cli, rootOpts *rootOptions) *cobra.Command {
|
|||||||
return cmd
|
return cmd
|
||||||
}
|
}
|
||||||
|
|
||||||
func boot(ctx context.Context, ngi *nginfo) (bool, error) {
|
func boot(ctx context.Context, ngi *nginfo, dockerCli command.Cli) (bool, error) {
|
||||||
toBoot := make([]int, 0, len(ngi.drivers))
|
toBoot := make([]int, 0, len(ngi.drivers))
|
||||||
for i, d := range ngi.drivers {
|
for i, d := range ngi.drivers {
|
||||||
if d.err != nil || d.di.Err != nil || d.di.Driver == nil || d.info == nil {
|
if d.err != nil || d.di.Err != nil || d.di.Driver == nil || d.info == nil {
|
||||||
@@ -167,25 +171,27 @@ func boot(ctx context.Context, ngi *nginfo) (bool, error) {
|
|||||||
return false, nil
|
return false, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
pw := progress.NewPrinter(context.TODO(), os.Stderr, "auto")
|
printer := progress.NewPrinter(context.TODO(), os.Stderr, "auto")
|
||||||
|
|
||||||
mw := progress.NewMultiWriter(pw)
|
|
||||||
|
|
||||||
eg, _ := errgroup.WithContext(ctx)
|
eg, _ := errgroup.WithContext(ctx)
|
||||||
for _, idx := range toBoot {
|
for _, idx := range toBoot {
|
||||||
func(idx int) {
|
func(idx int) {
|
||||||
eg.Go(func() error {
|
eg.Go(func() error {
|
||||||
pw := mw.WithPrefix(ngi.ng.Nodes[idx].Name, len(toBoot) > 1)
|
pw := progress.WithPrefix(printer, ngi.ng.Nodes[idx].Name, len(toBoot) > 1)
|
||||||
_, err := driver.Boot(ctx, ngi.drivers[idx].di.Driver, pw)
|
_, err := driver.Boot(ctx, ngi.drivers[idx].di.Driver, pw)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
ngi.drivers[idx].err = err
|
ngi.drivers[idx].err = err
|
||||||
}
|
}
|
||||||
close(pw.Status())
|
|
||||||
<-pw.Done()
|
|
||||||
return nil
|
return nil
|
||||||
})
|
})
|
||||||
}(idx)
|
}(idx)
|
||||||
}
|
}
|
||||||
|
|
||||||
return true, eg.Wait()
|
err := eg.Wait()
|
||||||
|
err1 := printer.Wait()
|
||||||
|
if err == nil {
|
||||||
|
err = err1
|
||||||
|
}
|
||||||
|
|
||||||
|
return true, err
|
||||||
}
|
}
|
||||||
|
@@ -135,7 +135,6 @@ func pruneCmd(dockerCli command.Cli, rootOpts *rootOptions) *cobra.Command {
|
|||||||
options.builder = rootOpts.builder
|
options.builder = rootOpts.builder
|
||||||
return runPrune(dockerCli, options)
|
return runPrune(dockerCli, options)
|
||||||
},
|
},
|
||||||
Annotations: map[string]string{"version": "1.00"},
|
|
||||||
}
|
}
|
||||||
|
|
||||||
flags := cmd.Flags()
|
flags := cmd.Flags()
|
||||||
|
@@ -93,7 +93,7 @@ func stop(ctx context.Context, dockerCli command.Cli, ng *store.NodeGroup, rm bo
|
|||||||
}
|
}
|
||||||
|
|
||||||
func stopCurrent(ctx context.Context, dockerCli command.Cli, rm bool) error {
|
func stopCurrent(ctx context.Context, dockerCli command.Cli, rm bool) error {
|
||||||
dis, err := getDefaultDrivers(ctx, dockerCli, "")
|
dis, err := getDefaultDrivers(ctx, dockerCli, false, "")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
132
commands/util.go
132
commands/util.go
@@ -4,6 +4,7 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
"strings"
|
||||||
|
|
||||||
"github.com/docker/buildx/build"
|
"github.com/docker/buildx/build"
|
||||||
"github.com/docker/buildx/driver"
|
"github.com/docker/buildx/driver"
|
||||||
@@ -21,14 +22,27 @@ import (
|
|||||||
|
|
||||||
// getStore returns current builder instance store
|
// getStore returns current builder instance store
|
||||||
func getStore(dockerCli command.Cli) (*store.Txn, func(), error) {
|
func getStore(dockerCli command.Cli) (*store.Txn, func(), error) {
|
||||||
dir := filepath.Dir(dockerCli.ConfigFile().Filename)
|
s, err := store.New(getConfigStorePath(dockerCli))
|
||||||
s, err := store.New(dir)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, nil, err
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
return s.Txn()
|
return s.Txn()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// getConfigStorePath will look for correct configuration store path;
|
||||||
|
// if `$BUILDX_CONFIG` is set - use it, otherwise use parent directory
|
||||||
|
// of Docker config file (i.e. `${DOCKER_CONFIG}/buildx`)
|
||||||
|
func getConfigStorePath(dockerCli command.Cli) string {
|
||||||
|
if buildxConfig := os.Getenv("BUILDX_CONFIG"); buildxConfig != "" {
|
||||||
|
logrus.Debugf("using config store %q based in \"$BUILDX_CONFIG\" environment variable", buildxConfig)
|
||||||
|
return buildxConfig
|
||||||
|
}
|
||||||
|
|
||||||
|
buildxConfig := filepath.Join(filepath.Dir(dockerCli.ConfigFile().Filename), "buildx")
|
||||||
|
logrus.Debugf("using default config store %q", buildxConfig)
|
||||||
|
return buildxConfig
|
||||||
|
}
|
||||||
|
|
||||||
// getCurrentEndpoint returns the current default endpoint value
|
// getCurrentEndpoint returns the current default endpoint value
|
||||||
func getCurrentEndpoint(dockerCli command.Cli) (string, error) {
|
func getCurrentEndpoint(dockerCli command.Cli) (string, error) {
|
||||||
name := dockerCli.CurrentContext()
|
name := dockerCli.CurrentContext()
|
||||||
@@ -177,7 +191,9 @@ func driversForNodeGroup(ctx context.Context, dockerCli command.Cli, ng *store.N
|
|||||||
dockerapi.NegotiateAPIVersion(ctx)
|
dockerapi.NegotiateAPIVersion(ctx)
|
||||||
|
|
||||||
contextStore := dockerCli.ContextStore()
|
contextStore := dockerCli.ContextStore()
|
||||||
kcc, err := kubernetes.ConfigFromContext(n.Endpoint, contextStore)
|
|
||||||
|
var kcc driver.KubeClientConfig
|
||||||
|
kcc, err = kubernetes.ConfigFromContext(n.Endpoint, contextStore)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
// err is returned if n.Endpoint is non-context name like "unix:///var/run/docker.sock".
|
// err is returned if n.Endpoint is non-context name like "unix:///var/run/docker.sock".
|
||||||
// try again with name="default".
|
// try again with name="default".
|
||||||
@@ -187,7 +203,24 @@ func driversForNodeGroup(ctx context.Context, dockerCli command.Cli, ng *store.N
|
|||||||
logrus.Error(err)
|
logrus.Error(err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
d, err := driver.GetDriver(ctx, "buildx_buildkit_"+n.Name, f, dockerapi, kcc, n.Flags, n.ConfigFile, n.DriverOpts, contextPathHash)
|
|
||||||
|
tryToUseKubeConfigInCluster := false
|
||||||
|
if kcc == nil {
|
||||||
|
tryToUseKubeConfigInCluster = true
|
||||||
|
} else {
|
||||||
|
if _, err := kcc.ClientConfig(); err != nil {
|
||||||
|
tryToUseKubeConfigInCluster = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if tryToUseKubeConfigInCluster {
|
||||||
|
kccInCluster := driver.KubeClientConfigInCluster{}
|
||||||
|
if _, err := kccInCluster.ClientConfig(); err == nil {
|
||||||
|
logrus.Debug("using kube config in cluster")
|
||||||
|
kcc = kccInCluster
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
d, err := driver.GetDriver(ctx, "buildx_buildkit_"+n.Name, f, dockerapi, dockerCli.ConfigFile(), kcc, n.Flags, n.ConfigFile, assignDriverOptsByDriverInfo(n.DriverOpts, di), contextPathHash)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
di.Err = err
|
di.Err = err
|
||||||
return nil
|
return nil
|
||||||
@@ -205,6 +238,20 @@ func driversForNodeGroup(ctx context.Context, dockerCli command.Cli, ng *store.N
|
|||||||
return dis, nil
|
return dis, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// pass platform as driver opts to provide for some drive, like kubernetes
|
||||||
|
func assignDriverOptsByDriverInfo(opts map[string]string, driveInfo build.DriverInfo) map[string]string {
|
||||||
|
m := map[string]string{}
|
||||||
|
|
||||||
|
if len(driveInfo.Platform) > 0 {
|
||||||
|
m["platform"] = strings.Join(platformutil.Format(driveInfo.Platform), ",")
|
||||||
|
}
|
||||||
|
|
||||||
|
for key := range opts {
|
||||||
|
m[key] = opts[key]
|
||||||
|
}
|
||||||
|
return m
|
||||||
|
}
|
||||||
|
|
||||||
// clientForEndpoint returns a docker client for an endpoint
|
// clientForEndpoint returns a docker client for an endpoint
|
||||||
func clientForEndpoint(dockerCli command.Cli, name string) (dockerclient.APIClient, error) {
|
func clientForEndpoint(dockerCli command.Cli, name string) (dockerclient.APIClient, error) {
|
||||||
list, err := dockerCli.ContextStore().List()
|
list, err := dockerCli.ContextStore().List()
|
||||||
@@ -248,10 +295,29 @@ func clientForEndpoint(dockerCli command.Cli, name string) (dockerclient.APIClie
|
|||||||
}
|
}
|
||||||
|
|
||||||
func getInstanceOrDefault(ctx context.Context, dockerCli command.Cli, instance, contextPathHash string) ([]build.DriverInfo, error) {
|
func getInstanceOrDefault(ctx context.Context, dockerCli command.Cli, instance, contextPathHash string) ([]build.DriverInfo, error) {
|
||||||
|
var defaultOnly bool
|
||||||
|
|
||||||
|
if instance == "default" && instance != dockerCli.CurrentContext() {
|
||||||
|
return nil, errors.Errorf("use `docker --context=default buildx` to switch to default context")
|
||||||
|
}
|
||||||
|
if instance == "default" || instance == dockerCli.CurrentContext() {
|
||||||
|
instance = ""
|
||||||
|
defaultOnly = true
|
||||||
|
}
|
||||||
|
list, err := dockerCli.ContextStore().List()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
for _, l := range list {
|
||||||
|
if l.Name == instance {
|
||||||
|
return nil, errors.Errorf("use `docker --context=%s buildx` to switch to context %s", instance, instance)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if instance != "" {
|
if instance != "" {
|
||||||
return getInstanceByName(ctx, dockerCli, instance, contextPathHash)
|
return getInstanceByName(ctx, dockerCli, instance, contextPathHash)
|
||||||
}
|
}
|
||||||
return getDefaultDrivers(ctx, dockerCli, contextPathHash)
|
return getDefaultDrivers(ctx, dockerCli, defaultOnly, contextPathHash)
|
||||||
}
|
}
|
||||||
|
|
||||||
func getInstanceByName(ctx context.Context, dockerCli command.Cli, instance, contextPathHash string) ([]build.DriverInfo, error) {
|
func getInstanceByName(ctx context.Context, dockerCli command.Cli, instance, contextPathHash string) ([]build.DriverInfo, error) {
|
||||||
@@ -269,23 +335,25 @@ func getInstanceByName(ctx context.Context, dockerCli command.Cli, instance, con
|
|||||||
}
|
}
|
||||||
|
|
||||||
// getDefaultDrivers returns drivers based on current cli config
|
// getDefaultDrivers returns drivers based on current cli config
|
||||||
func getDefaultDrivers(ctx context.Context, dockerCli command.Cli, contextPathHash string) ([]build.DriverInfo, error) {
|
func getDefaultDrivers(ctx context.Context, dockerCli command.Cli, defaultOnly bool, contextPathHash string) ([]build.DriverInfo, error) {
|
||||||
txn, release, err := getStore(dockerCli)
|
txn, release, err := getStore(dockerCli)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
defer release()
|
defer release()
|
||||||
|
|
||||||
ng, err := getCurrentInstance(txn, dockerCli)
|
if !defaultOnly {
|
||||||
if err != nil {
|
ng, err := getCurrentInstance(txn, dockerCli)
|
||||||
return nil, err
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if ng != nil {
|
||||||
|
return driversForNodeGroup(ctx, dockerCli, ng, contextPathHash)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ng != nil {
|
d, err := driver.GetDriver(ctx, "buildx_buildkit_default", nil, dockerCli.Client(), dockerCli.ConfigFile(), nil, nil, "", nil, contextPathHash)
|
||||||
return driversForNodeGroup(ctx, dockerCli, ng, contextPathHash)
|
|
||||||
}
|
|
||||||
|
|
||||||
d, err := driver.GetDriver(ctx, "buildx_buildkit_default", nil, dockerCli.Client(), nil, nil, "", nil, contextPathHash)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -349,24 +417,28 @@ func loadNodeGroupData(ctx context.Context, dockerCli command.Cli, ngi *nginfo)
|
|||||||
if eg.Wait(); err != nil {
|
if eg.Wait(); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
for _, di := range ngi.drivers {
|
|
||||||
// dynamic nodes are used in Kubernetes driver.
|
// skip when multi drivers
|
||||||
// Kubernetes pods are dynamically mapped to BuildKit Nodes.
|
if len(ngi.drivers) == 1 {
|
||||||
if di.info != nil && len(di.info.DynamicNodes) > 0 {
|
for _, di := range ngi.drivers {
|
||||||
var drivers []dinfo
|
// dynamic nodes are used in Kubernetes driver.
|
||||||
for i := 0; i < len(di.info.DynamicNodes); i++ {
|
// Kubernetes pods are dynamically mapped to BuildKit Nodes.
|
||||||
// all []dinfo share *build.DriverInfo and *driver.Info
|
if di.info != nil && len(di.info.DynamicNodes) > 0 {
|
||||||
diClone := di
|
var drivers []dinfo
|
||||||
if pl := di.info.DynamicNodes[i].Platforms; len(pl) > 0 {
|
for i := 0; i < len(di.info.DynamicNodes); i++ {
|
||||||
diClone.platforms = pl
|
// all []dinfo share *build.DriverInfo and *driver.Info
|
||||||
|
diClone := di
|
||||||
|
if pl := di.info.DynamicNodes[i].Platforms; len(pl) > 0 {
|
||||||
|
diClone.platforms = pl
|
||||||
|
}
|
||||||
|
drivers = append(drivers, di)
|
||||||
}
|
}
|
||||||
drivers = append(drivers, di)
|
// not append (remove the static nodes in the store)
|
||||||
|
ngi.ng.Nodes = di.info.DynamicNodes
|
||||||
|
ngi.ng.Dynamic = true
|
||||||
|
ngi.drivers = drivers
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
// not append (remove the static nodes in the store)
|
|
||||||
ngi.ng.Nodes = di.info.DynamicNodes
|
|
||||||
ngi.ng.Dynamic = true
|
|
||||||
ngi.drivers = drivers
|
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
|
@@ -12,6 +12,7 @@ import (
|
|||||||
|
|
||||||
"github.com/docker/buildx/driver"
|
"github.com/docker/buildx/driver"
|
||||||
"github.com/docker/buildx/driver/bkimage"
|
"github.com/docker/buildx/driver/bkimage"
|
||||||
|
"github.com/docker/buildx/util/imagetools"
|
||||||
"github.com/docker/buildx/util/progress"
|
"github.com/docker/buildx/util/progress"
|
||||||
"github.com/docker/docker/api/types"
|
"github.com/docker/docker/api/types"
|
||||||
dockertypes "github.com/docker/docker/api/types"
|
dockertypes "github.com/docker/docker/api/types"
|
||||||
@@ -31,6 +32,14 @@ type Driver struct {
|
|||||||
env []string
|
env []string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (d *Driver) IsMobyDriver() bool {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *Driver) Config() driver.InitConfig {
|
||||||
|
return d.InitConfig
|
||||||
|
}
|
||||||
|
|
||||||
func (d *Driver) Bootstrap(ctx context.Context, l progress.Logger) error {
|
func (d *Driver) Bootstrap(ctx context.Context, l progress.Logger) error {
|
||||||
return progress.Wrap("[internal] booting buildkit", l, func(sub progress.SubLogger) error {
|
return progress.Wrap("[internal] booting buildkit", l, func(sub progress.SubLogger) error {
|
||||||
_, err := d.DockerAPI.ContainerInspect(ctx, d.Name)
|
_, err := d.DockerAPI.ContainerInspect(ctx, d.Name)
|
||||||
@@ -59,7 +68,13 @@ func (d *Driver) create(ctx context.Context, l progress.SubLogger) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if err := l.Wrap("pulling image "+imageName, func() error {
|
if err := l.Wrap("pulling image "+imageName, func() error {
|
||||||
rc, err := d.DockerAPI.ImageCreate(ctx, imageName, types.ImageCreateOptions{})
|
ra, err := imagetools.RegistryAuthForRef(imageName, d.Auth)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
rc, err := d.DockerAPI.ImageCreate(ctx, imageName, types.ImageCreateOptions{
|
||||||
|
RegistryAuth: ra,
|
||||||
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@@ -86,11 +101,12 @@ func (d *Driver) create(ctx context.Context, l progress.SubLogger) error {
|
|||||||
if err := l.Wrap("creating container "+d.Name, func() error {
|
if err := l.Wrap("creating container "+d.Name, func() error {
|
||||||
hc := &container.HostConfig{
|
hc := &container.HostConfig{
|
||||||
Privileged: true,
|
Privileged: true,
|
||||||
|
UsernsMode: "host",
|
||||||
}
|
}
|
||||||
if d.netMode != "" {
|
if d.netMode != "" {
|
||||||
hc.NetworkMode = container.NetworkMode(d.netMode)
|
hc.NetworkMode = container.NetworkMode(d.netMode)
|
||||||
}
|
}
|
||||||
_, err := d.DockerAPI.ContainerCreate(ctx, cfg, hc, &network.NetworkingConfig{}, d.Name)
|
_, err := d.DockerAPI.ContainerCreate(ctx, cfg, hc, &network.NetworkingConfig{}, nil, d.Name)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@@ -263,7 +279,7 @@ func (d *Driver) Client(ctx context.Context) (*client.Client, error) {
|
|||||||
|
|
||||||
conn = demuxConn(conn)
|
conn = demuxConn(conn)
|
||||||
|
|
||||||
return client.New(ctx, "", client.WithDialer(func(string, time.Duration) (net.Conn, error) {
|
return client.New(ctx, "", client.WithContextDialer(func(context.Context, string) (net.Conn, error) {
|
||||||
return conn, nil
|
return conn, nil
|
||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
|
@@ -3,7 +3,6 @@ package docker
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"net"
|
"net"
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/docker/buildx/driver"
|
"github.com/docker/buildx/driver"
|
||||||
"github.com/docker/buildx/util/progress"
|
"github.com/docker/buildx/util/progress"
|
||||||
@@ -39,7 +38,7 @@ func (d *Driver) Rm(ctx context.Context, force bool) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (d *Driver) Client(ctx context.Context) (*client.Client, error) {
|
func (d *Driver) Client(ctx context.Context) (*client.Client, error) {
|
||||||
return client.New(ctx, "", client.WithDialer(func(string, time.Duration) (net.Conn, error) {
|
return client.New(ctx, "", client.WithContextDialer(func(context.Context, string) (net.Conn, error) {
|
||||||
return d.DockerAPI.DialHijack(ctx, "/grpc", "h2c", nil)
|
return d.DockerAPI.DialHijack(ctx, "/grpc", "h2c", nil)
|
||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
@@ -48,9 +47,8 @@ func (d *Driver) Features() map[driver.Feature]bool {
|
|||||||
return map[driver.Feature]bool{
|
return map[driver.Feature]bool{
|
||||||
driver.OCIExporter: false,
|
driver.OCIExporter: false,
|
||||||
driver.DockerExporter: false,
|
driver.DockerExporter: false,
|
||||||
|
driver.CacheExport: false,
|
||||||
driver.CacheExport: false,
|
driver.MultiPlatform: false,
|
||||||
driver.MultiPlatform: false,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -58,4 +56,10 @@ func (d *Driver) Factory() driver.Factory {
|
|||||||
return d.factory
|
return d.factory
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *Driver) IsDefaultMobyDriver() {}
|
func (d *Driver) IsMobyDriver() bool {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *Driver) Config() driver.InitConfig {
|
||||||
|
return d.InitConfig
|
||||||
|
}
|
||||||
|
@@ -5,6 +5,7 @@ import (
|
|||||||
|
|
||||||
"github.com/docker/buildx/store"
|
"github.com/docker/buildx/store"
|
||||||
"github.com/docker/buildx/util/progress"
|
"github.com/docker/buildx/util/progress"
|
||||||
|
clitypes "github.com/docker/cli/cli/config/types"
|
||||||
"github.com/moby/buildkit/client"
|
"github.com/moby/buildkit/client"
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
)
|
)
|
||||||
@@ -44,6 +45,10 @@ type Info struct {
|
|||||||
DynamicNodes []store.Node
|
DynamicNodes []store.Node
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type Auth interface {
|
||||||
|
GetAuthConfig(registryHostname string) (clitypes.AuthConfig, error)
|
||||||
|
}
|
||||||
|
|
||||||
type Driver interface {
|
type Driver interface {
|
||||||
Factory() Factory
|
Factory() Factory
|
||||||
Bootstrap(context.Context, progress.Logger) error
|
Bootstrap(context.Context, progress.Logger) error
|
||||||
@@ -52,6 +57,8 @@ type Driver interface {
|
|||||||
Rm(ctx context.Context, force bool) error
|
Rm(ctx context.Context, force bool) error
|
||||||
Client(ctx context.Context) (*client.Client, error)
|
Client(ctx context.Context) (*client.Client, error)
|
||||||
Features() map[Feature]bool
|
Features() map[Feature]bool
|
||||||
|
IsMobyDriver() bool
|
||||||
|
Config() InitConfig
|
||||||
}
|
}
|
||||||
|
|
||||||
func Boot(ctx context.Context, d Driver, pw progress.Writer) (*client.Client, error) {
|
func Boot(ctx context.Context, d Driver, pw progress.Writer) (*client.Client, error) {
|
||||||
@@ -66,11 +73,7 @@ func Boot(ctx context.Context, d Driver, pw progress.Writer) (*client.Client, er
|
|||||||
if try > 2 {
|
if try > 2 {
|
||||||
return nil, errors.Errorf("failed to bootstrap %T driver in attempts", d)
|
return nil, errors.Errorf("failed to bootstrap %T driver in attempts", d)
|
||||||
}
|
}
|
||||||
if err := d.Bootstrap(ctx, func(s *client.SolveStatus) {
|
if err := d.Bootstrap(ctx, pw.Write); err != nil {
|
||||||
if pw != nil {
|
|
||||||
pw.Status() <- s
|
|
||||||
}
|
|
||||||
}); err != nil {
|
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -4,12 +4,15 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
"net"
|
"net"
|
||||||
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/docker/buildx/driver"
|
"github.com/docker/buildx/driver"
|
||||||
"github.com/docker/buildx/driver/kubernetes/execconn"
|
"github.com/docker/buildx/driver/kubernetes/execconn"
|
||||||
|
"github.com/docker/buildx/driver/kubernetes/manifest"
|
||||||
"github.com/docker/buildx/driver/kubernetes/podchooser"
|
"github.com/docker/buildx/driver/kubernetes/podchooser"
|
||||||
"github.com/docker/buildx/store"
|
"github.com/docker/buildx/store"
|
||||||
|
"github.com/docker/buildx/util/platformutil"
|
||||||
"github.com/docker/buildx/util/progress"
|
"github.com/docker/buildx/util/progress"
|
||||||
"github.com/moby/buildkit/client"
|
"github.com/moby/buildkit/client"
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
@@ -41,12 +44,19 @@ type Driver struct {
|
|||||||
podChooser podchooser.PodChooser
|
podChooser podchooser.PodChooser
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (d *Driver) IsMobyDriver() bool {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
func (d *Driver) Config() driver.InitConfig {
|
||||||
|
return d.InitConfig
|
||||||
|
}
|
||||||
|
|
||||||
func (d *Driver) Bootstrap(ctx context.Context, l progress.Logger) error {
|
func (d *Driver) Bootstrap(ctx context.Context, l progress.Logger) error {
|
||||||
return progress.Wrap("[internal] booting buildkit", l, func(sub progress.SubLogger) error {
|
return progress.Wrap("[internal] booting buildkit", l, func(sub progress.SubLogger) error {
|
||||||
_, err := d.deploymentClient.Get(d.deployment.Name, metav1.GetOptions{})
|
_, err := d.deploymentClient.Get(ctx, d.deployment.Name, metav1.GetOptions{})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
// TODO: return err if err != ErrNotFound
|
// TODO: return err if err != ErrNotFound
|
||||||
_, err = d.deploymentClient.Create(d.deployment)
|
_, err = d.deploymentClient.Create(ctx, d.deployment, metav1.CreateOptions{})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Wrapf(err, "error while calling deploymentClient.Create for %q", d.deployment.Name)
|
return errors.Wrapf(err, "error while calling deploymentClient.Create for %q", d.deployment.Name)
|
||||||
}
|
}
|
||||||
@@ -69,7 +79,7 @@ func (d *Driver) wait(ctx context.Context) error {
|
|||||||
depl *appsv1.Deployment
|
depl *appsv1.Deployment
|
||||||
)
|
)
|
||||||
for try := 0; try < 100; try++ {
|
for try := 0; try < 100; try++ {
|
||||||
depl, err = d.deploymentClient.Get(d.deployment.Name, metav1.GetOptions{})
|
depl, err = d.deploymentClient.Get(ctx, d.deployment.Name, metav1.GetOptions{})
|
||||||
if err == nil {
|
if err == nil {
|
||||||
if depl.Status.ReadyReplicas >= int32(d.minReplicas) {
|
if depl.Status.ReadyReplicas >= int32(d.minReplicas) {
|
||||||
return nil
|
return nil
|
||||||
@@ -87,7 +97,7 @@ func (d *Driver) wait(ctx context.Context) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (d *Driver) Info(ctx context.Context) (*driver.Info, error) {
|
func (d *Driver) Info(ctx context.Context) (*driver.Info, error) {
|
||||||
depl, err := d.deploymentClient.Get(d.deployment.Name, metav1.GetOptions{})
|
depl, err := d.deploymentClient.Get(ctx, d.deployment.Name, metav1.GetOptions{})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
// TODO: return err if err != ErrNotFound
|
// TODO: return err if err != ErrNotFound
|
||||||
return &driver.Info{
|
return &driver.Info{
|
||||||
@@ -99,7 +109,7 @@ func (d *Driver) Info(ctx context.Context) (*driver.Info, error) {
|
|||||||
Status: driver.Stopped,
|
Status: driver.Stopped,
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
pods, err := podchooser.ListRunningPods(d.podClient, depl)
|
pods, err := podchooser.ListRunningPods(ctx, d.podClient, depl)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -109,6 +119,16 @@ func (d *Driver) Info(ctx context.Context) (*driver.Info, error) {
|
|||||||
Name: p.Name,
|
Name: p.Name,
|
||||||
// Other fields are unset (TODO: detect real platforms)
|
// Other fields are unset (TODO: detect real platforms)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if p.Annotations != nil {
|
||||||
|
if p, ok := p.Annotations[manifest.AnnotationPlatform]; ok {
|
||||||
|
ps, err := platformutil.Parse(strings.Split(p, ","))
|
||||||
|
if err == nil {
|
||||||
|
node.Platforms = ps
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
dynNodes = append(dynNodes, node)
|
dynNodes = append(dynNodes, node)
|
||||||
}
|
}
|
||||||
return &driver.Info{
|
return &driver.Info{
|
||||||
@@ -123,7 +143,7 @@ func (d *Driver) Stop(ctx context.Context, force bool) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (d *Driver) Rm(ctx context.Context, force bool) error {
|
func (d *Driver) Rm(ctx context.Context, force bool) error {
|
||||||
if err := d.deploymentClient.Delete(d.deployment.Name, nil); err != nil {
|
if err := d.deploymentClient.Delete(ctx, d.deployment.Name, metav1.DeleteOptions{}); err != nil {
|
||||||
return errors.Wrapf(err, "error while calling deploymentClient.Delete for %q", d.deployment.Name)
|
return errors.Wrapf(err, "error while calling deploymentClient.Delete for %q", d.deployment.Name)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
@@ -149,7 +169,7 @@ func (d *Driver) Client(ctx context.Context) (*client.Client, error) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
return client.New(ctx, "", client.WithDialer(func(string, time.Duration) (net.Conn, error) {
|
return client.New(ctx, "", client.WithContextDialer(func(context.Context, string) (net.Conn, error) {
|
||||||
return conn, nil
|
return conn, nil
|
||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
|
@@ -9,6 +9,7 @@ import (
|
|||||||
"github.com/docker/buildx/driver/bkimage"
|
"github.com/docker/buildx/driver/bkimage"
|
||||||
"github.com/docker/buildx/driver/kubernetes/manifest"
|
"github.com/docker/buildx/driver/kubernetes/manifest"
|
||||||
"github.com/docker/buildx/driver/kubernetes/podchooser"
|
"github.com/docker/buildx/driver/kubernetes/podchooser"
|
||||||
|
"github.com/docker/buildx/util/platformutil"
|
||||||
dockerclient "github.com/docker/docker/client"
|
dockerclient "github.com/docker/docker/client"
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
"k8s.io/client-go/kubernetes"
|
"k8s.io/client-go/kubernetes"
|
||||||
@@ -90,6 +91,24 @@ func (f *factory) New(ctx context.Context, cfg driver.InitConfig) (driver.Driver
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
deploymentOpt.Image = bkimage.DefaultRootlessImage
|
deploymentOpt.Image = bkimage.DefaultRootlessImage
|
||||||
|
case "platform":
|
||||||
|
if v != "" {
|
||||||
|
platforms, err := platformutil.Parse(strings.Split(v, ","))
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
deploymentOpt.Platforms = platforms
|
||||||
|
}
|
||||||
|
case "nodeselector":
|
||||||
|
kvs := strings.Split(strings.Trim(v, `"`), ",")
|
||||||
|
s := map[string]string{}
|
||||||
|
for i := range kvs {
|
||||||
|
kv := strings.Split(kvs[i], "=")
|
||||||
|
if len(kv) == 2 {
|
||||||
|
s[kv[0]] = kv[1]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
deploymentOpt.NodeSelector = s
|
||||||
case "loadbalance":
|
case "loadbalance":
|
||||||
switch v {
|
switch v {
|
||||||
case LoadbalanceSticky:
|
case LoadbalanceSticky:
|
||||||
|
@@ -1,6 +1,10 @@
|
|||||||
package manifest
|
package manifest
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"github.com/docker/buildx/util/platformutil"
|
||||||
|
v1 "github.com/opencontainers/image-spec/specs-go/v1"
|
||||||
appsv1 "k8s.io/api/apps/v1"
|
appsv1 "k8s.io/api/apps/v1"
|
||||||
corev1 "k8s.io/api/core/v1"
|
corev1 "k8s.io/api/core/v1"
|
||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
@@ -13,28 +17,38 @@ type DeploymentOpt struct {
|
|||||||
Replicas int
|
Replicas int
|
||||||
BuildkitFlags []string
|
BuildkitFlags []string
|
||||||
Rootless bool
|
Rootless bool
|
||||||
|
NodeSelector map[string]string
|
||||||
|
Platforms []v1.Platform
|
||||||
}
|
}
|
||||||
|
|
||||||
const (
|
const (
|
||||||
containerName = "buildkitd"
|
containerName = "buildkitd"
|
||||||
|
AnnotationPlatform = "buildx.docker.com/platform"
|
||||||
)
|
)
|
||||||
|
|
||||||
func NewDeployment(opt *DeploymentOpt) (*appsv1.Deployment, error) {
|
func NewDeployment(opt *DeploymentOpt) (*appsv1.Deployment, error) {
|
||||||
labels := map[string]string{
|
labels := map[string]string{
|
||||||
"app": opt.Name,
|
"app": opt.Name,
|
||||||
}
|
}
|
||||||
|
annotations := map[string]string{}
|
||||||
replicas := int32(opt.Replicas)
|
replicas := int32(opt.Replicas)
|
||||||
privileged := true
|
privileged := true
|
||||||
args := opt.BuildkitFlags
|
args := opt.BuildkitFlags
|
||||||
|
|
||||||
|
if len(opt.Platforms) > 0 {
|
||||||
|
annotations[AnnotationPlatform] = strings.Join(platformutil.Format(opt.Platforms), ",")
|
||||||
|
}
|
||||||
|
|
||||||
d := &appsv1.Deployment{
|
d := &appsv1.Deployment{
|
||||||
TypeMeta: metav1.TypeMeta{
|
TypeMeta: metav1.TypeMeta{
|
||||||
APIVersion: appsv1.SchemeGroupVersion.String(),
|
APIVersion: appsv1.SchemeGroupVersion.String(),
|
||||||
Kind: "Deployment",
|
Kind: "Deployment",
|
||||||
},
|
},
|
||||||
ObjectMeta: metav1.ObjectMeta{
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
Namespace: opt.Namespace,
|
Namespace: opt.Namespace,
|
||||||
Name: opt.Name,
|
Name: opt.Name,
|
||||||
Labels: labels,
|
Labels: labels,
|
||||||
|
Annotations: annotations,
|
||||||
},
|
},
|
||||||
Spec: appsv1.DeploymentSpec{
|
Spec: appsv1.DeploymentSpec{
|
||||||
Replicas: &replicas,
|
Replicas: &replicas,
|
||||||
@@ -43,7 +57,8 @@ func NewDeployment(opt *DeploymentOpt) (*appsv1.Deployment, error) {
|
|||||||
},
|
},
|
||||||
Template: corev1.PodTemplateSpec{
|
Template: corev1.PodTemplateSpec{
|
||||||
ObjectMeta: metav1.ObjectMeta{
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
Labels: labels,
|
Labels: labels,
|
||||||
|
Annotations: annotations,
|
||||||
},
|
},
|
||||||
Spec: corev1.PodSpec{
|
Spec: corev1.PodSpec{
|
||||||
Containers: []corev1.Container{
|
Containers: []corev1.Container{
|
||||||
@@ -72,6 +87,11 @@ func NewDeployment(opt *DeploymentOpt) (*appsv1.Deployment, error) {
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if len(opt.NodeSelector) > 0 {
|
||||||
|
d.Spec.Template.Spec.NodeSelector = opt.NodeSelector
|
||||||
|
}
|
||||||
|
|
||||||
return d, nil
|
return d, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -25,7 +25,7 @@ type RandomPodChooser struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (pc *RandomPodChooser) ChoosePod(ctx context.Context) (*corev1.Pod, error) {
|
func (pc *RandomPodChooser) ChoosePod(ctx context.Context) (*corev1.Pod, error) {
|
||||||
pods, err := ListRunningPods(pc.PodClient, pc.Deployment)
|
pods, err := ListRunningPods(ctx, pc.PodClient, pc.Deployment)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -46,7 +46,7 @@ type StickyPodChooser struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (pc *StickyPodChooser) ChoosePod(ctx context.Context) (*corev1.Pod, error) {
|
func (pc *StickyPodChooser) ChoosePod(ctx context.Context) (*corev1.Pod, error) {
|
||||||
pods, err := ListRunningPods(pc.PodClient, pc.Deployment)
|
pods, err := ListRunningPods(ctx, pc.PodClient, pc.Deployment)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -70,7 +70,7 @@ func (pc *StickyPodChooser) ChoosePod(ctx context.Context) (*corev1.Pod, error)
|
|||||||
return podMap[chosen], nil
|
return podMap[chosen], nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func ListRunningPods(client clientcorev1.PodInterface, depl *appsv1.Deployment) ([]*corev1.Pod, error) {
|
func ListRunningPods(ctx context.Context, client clientcorev1.PodInterface, depl *appsv1.Deployment) ([]*corev1.Pod, error) {
|
||||||
selector, err := metav1.LabelSelectorAsSelector(depl.Spec.Selector)
|
selector, err := metav1.LabelSelectorAsSelector(depl.Spec.Selector)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
@@ -78,7 +78,7 @@ func ListRunningPods(client clientcorev1.PodInterface, depl *appsv1.Deployment)
|
|||||||
listOpts := metav1.ListOptions{
|
listOpts := metav1.ListOptions{
|
||||||
LabelSelector: selector.String(),
|
LabelSelector: selector.String(),
|
||||||
}
|
}
|
||||||
podList, err := client.List(listOpts)
|
podList, err := client.List(ctx, listOpts)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@@ -2,11 +2,16 @@ package driver
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"io/ioutil"
|
||||||
"sort"
|
"sort"
|
||||||
|
"strings"
|
||||||
|
"sync"
|
||||||
|
|
||||||
|
"k8s.io/client-go/rest"
|
||||||
|
|
||||||
dockerclient "github.com/docker/docker/client"
|
dockerclient "github.com/docker/docker/client"
|
||||||
|
"github.com/moby/buildkit/client"
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
"k8s.io/client-go/tools/clientcmd"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type Factory interface {
|
type Factory interface {
|
||||||
@@ -22,14 +27,34 @@ type BuildkitConfig struct {
|
|||||||
// Rootless bool
|
// Rootless bool
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type KubeClientConfig interface {
|
||||||
|
ClientConfig() (*rest.Config, error)
|
||||||
|
Namespace() (string, bool, error)
|
||||||
|
}
|
||||||
|
|
||||||
|
type KubeClientConfigInCluster struct{}
|
||||||
|
|
||||||
|
func (k KubeClientConfigInCluster) ClientConfig() (*rest.Config, error) {
|
||||||
|
return rest.InClusterConfig()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (k KubeClientConfigInCluster) Namespace() (string, bool, error) {
|
||||||
|
namespace, err := ioutil.ReadFile("/var/run/secrets/kubernetes.io/serviceaccount/namespace")
|
||||||
|
if err != nil {
|
||||||
|
return "", false, err
|
||||||
|
}
|
||||||
|
return strings.TrimSpace(string(namespace)), true, nil
|
||||||
|
}
|
||||||
|
|
||||||
type InitConfig struct {
|
type InitConfig struct {
|
||||||
// This object needs updates to be generic for different drivers
|
// This object needs updates to be generic for different drivers
|
||||||
Name string
|
Name string
|
||||||
DockerAPI dockerclient.APIClient
|
DockerAPI dockerclient.APIClient
|
||||||
KubeClientConfig clientcmd.ClientConfig
|
KubeClientConfig KubeClientConfig
|
||||||
BuildkitFlags []string
|
BuildkitFlags []string
|
||||||
ConfigFile string
|
ConfigFile string
|
||||||
DriverOpts map[string]string
|
DriverOpts map[string]string
|
||||||
|
Auth Auth
|
||||||
// ContextPathHash can be used for determining pods in the driver instance
|
// ContextPathHash can be used for determining pods in the driver instance
|
||||||
ContextPathHash string
|
ContextPathHash string
|
||||||
}
|
}
|
||||||
@@ -76,7 +101,7 @@ func GetFactory(name string, instanceRequired bool) Factory {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func GetDriver(ctx context.Context, name string, f Factory, api dockerclient.APIClient, kcc clientcmd.ClientConfig, flags []string, config string, do map[string]string, contextPathHash string) (Driver, error) {
|
func GetDriver(ctx context.Context, name string, f Factory, api dockerclient.APIClient, auth Auth, kcc KubeClientConfig, flags []string, config string, do map[string]string, contextPathHash string) (Driver, error) {
|
||||||
ic := InitConfig{
|
ic := InitConfig{
|
||||||
DockerAPI: api,
|
DockerAPI: api,
|
||||||
KubeClientConfig: kcc,
|
KubeClientConfig: kcc,
|
||||||
@@ -84,6 +109,7 @@ func GetDriver(ctx context.Context, name string, f Factory, api dockerclient.API
|
|||||||
BuildkitFlags: flags,
|
BuildkitFlags: flags,
|
||||||
ConfigFile: config,
|
ConfigFile: config,
|
||||||
DriverOpts: do,
|
DriverOpts: do,
|
||||||
|
Auth: auth,
|
||||||
ContextPathHash: contextPathHash,
|
ContextPathHash: contextPathHash,
|
||||||
}
|
}
|
||||||
if f == nil {
|
if f == nil {
|
||||||
@@ -93,9 +119,27 @@ func GetDriver(ctx context.Context, name string, f Factory, api dockerclient.API
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return f.New(ctx, ic)
|
d, err := f.New(ctx, ic)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return &cachedDriver{Driver: d}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func GetFactories() map[string]Factory {
|
func GetFactories() map[string]Factory {
|
||||||
return drivers
|
return drivers
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type cachedDriver struct {
|
||||||
|
Driver
|
||||||
|
client *client.Client
|
||||||
|
err error
|
||||||
|
once sync.Once
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *cachedDriver) Client(ctx context.Context) (*client.Client, error) {
|
||||||
|
d.once.Do(func() {
|
||||||
|
d.client, d.err = d.Driver.Client(ctx)
|
||||||
|
})
|
||||||
|
return d.client, d.err
|
||||||
|
}
|
||||||
|
67
go.mod
67
go.mod
@@ -1,75 +1,68 @@
|
|||||||
module github.com/docker/buildx
|
module github.com/docker/buildx
|
||||||
|
|
||||||
|
go 1.13
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78 // indirect
|
|
||||||
github.com/agl/ed25519 v0.0.0-20170116200512-5312a6153412 // indirect
|
github.com/agl/ed25519 v0.0.0-20170116200512-5312a6153412 // indirect
|
||||||
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973 // indirect
|
|
||||||
github.com/bitly/go-hostpool v0.0.0-20171023180738-a3a6125de932 // indirect
|
github.com/bitly/go-hostpool v0.0.0-20171023180738-a3a6125de932 // indirect
|
||||||
github.com/bugsnag/bugsnag-go v1.4.1 // indirect
|
github.com/bugsnag/bugsnag-go v1.4.1 // indirect
|
||||||
github.com/bugsnag/panicwrap v1.2.0 // indirect
|
github.com/bugsnag/panicwrap v1.2.0 // indirect
|
||||||
github.com/cenkalti/backoff v2.1.1+incompatible // indirect
|
github.com/cenkalti/backoff v2.1.1+incompatible // indirect
|
||||||
github.com/cloudflare/cfssl v0.0.0-20181213083726-b94e044bb51e // indirect
|
github.com/cloudflare/cfssl v0.0.0-20181213083726-b94e044bb51e // indirect
|
||||||
github.com/containerd/console v0.0.0-20191219165238-8375c3424e4d
|
github.com/containerd/console v1.0.1
|
||||||
github.com/containerd/containerd v1.4.0-0
|
github.com/containerd/containerd v1.4.1-0.20201117152358-0edc412565dc
|
||||||
github.com/denisenkom/go-mssqldb v0.0.0-20190315220205-a8ed825ac853 // indirect
|
github.com/denisenkom/go-mssqldb v0.0.0-20190315220205-a8ed825ac853 // indirect
|
||||||
github.com/docker/cli v0.0.0-20200227165822-2298e6a3fe24
|
github.com/docker/cli v20.10.0-beta1.0.20201029214301-1d20b15adc38+incompatible
|
||||||
github.com/docker/compose-on-kubernetes v0.4.19-0.20190128150448-356b2919c496 // indirect
|
github.com/docker/compose-on-kubernetes v0.4.19-0.20190128150448-356b2919c496 // indirect
|
||||||
github.com/docker/distribution v2.7.1-0.20190205005809-0d3efadf0154+incompatible
|
github.com/docker/distribution v2.7.1+incompatible
|
||||||
github.com/docker/docker v1.14.0-0.20190319215453-e7b5f7dbe98c
|
github.com/docker/docker v20.10.0-beta1.0.20201110211921-af34b94a78a1+incompatible
|
||||||
github.com/docker/docker-credential-helpers v0.6.1 // indirect
|
|
||||||
github.com/docker/go v1.5.1-1.0.20160303222718-d30aec9fd63c // indirect
|
github.com/docker/go v1.5.1-1.0.20160303222718-d30aec9fd63c // indirect
|
||||||
github.com/docker/go-connections v0.4.0 // indirect
|
github.com/docker/go-metrics v0.0.1 // indirect
|
||||||
github.com/docker/libtrust v0.0.0-20150526203908-9cbd2a1374f4 // indirect
|
github.com/docker/libtrust v0.0.0-20150526203908-9cbd2a1374f4 // indirect
|
||||||
github.com/docker/spdystream v0.0.0-20181023171402-6480d4af844c // indirect
|
github.com/docker/spdystream v0.0.0-20181023171402-6480d4af844c // indirect
|
||||||
github.com/elazarl/goproxy v0.0.0-20191011121108-aa519ddbe484 // indirect
|
github.com/elazarl/goproxy v0.0.0-20191011121108-aa519ddbe484 // indirect
|
||||||
github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5 // indirect
|
github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5 // indirect
|
||||||
github.com/go-sql-driver/mysql v1.4.1 // indirect
|
github.com/fvbommel/sortorder v1.0.1 // indirect
|
||||||
github.com/gofrs/flock v0.7.0
|
github.com/gofrs/flock v0.7.3
|
||||||
github.com/gofrs/uuid v3.2.0+incompatible // indirect
|
github.com/gofrs/uuid v3.2.0+incompatible // indirect
|
||||||
github.com/google/certificate-transparency-go v1.0.21 // indirect
|
github.com/google/certificate-transparency-go v1.0.21 // indirect
|
||||||
github.com/google/shlex v0.0.0-20150127133951-6f45313302b9
|
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510
|
||||||
github.com/googleapis/gnostic v0.3.1 // indirect
|
|
||||||
github.com/gophercloud/gophercloud v0.6.0 // indirect
|
|
||||||
github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed // indirect
|
github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed // indirect
|
||||||
github.com/hashicorp/hcl/v2 v2.4.0
|
github.com/hashicorp/hcl/v2 v2.6.0
|
||||||
github.com/jinzhu/gorm v1.9.2 // indirect
|
github.com/jinzhu/gorm v1.9.2 // indirect
|
||||||
github.com/jinzhu/inflection v0.0.0-20180308033659-04140366298a // indirect
|
github.com/jinzhu/inflection v0.0.0-20180308033659-04140366298a // indirect
|
||||||
github.com/jinzhu/now v1.0.0 // indirect
|
github.com/jinzhu/now v1.0.0 // indirect
|
||||||
github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0 // indirect
|
github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0 // indirect
|
||||||
github.com/lib/pq v1.0.0 // indirect
|
|
||||||
github.com/mattn/go-shellwords v1.0.5 // indirect
|
|
||||||
github.com/mattn/go-sqlite3 v1.10.0 // indirect
|
github.com/mattn/go-sqlite3 v1.10.0 // indirect
|
||||||
github.com/miekg/pkcs11 v0.0.0-20190322140431-074fd7a1ed19 // indirect
|
github.com/miekg/pkcs11 v0.0.0-20190322140431-074fd7a1ed19 // indirect
|
||||||
github.com/moby/buildkit v0.7.0
|
github.com/moby/buildkit v0.8.1-0.20201205083753-0af7b1b9c693
|
||||||
github.com/opencontainers/go-digest v1.0.0-rc1
|
github.com/opencontainers/go-digest v1.0.0
|
||||||
github.com/opencontainers/image-spec v1.0.1
|
github.com/opencontainers/image-spec v1.0.1
|
||||||
github.com/opencontainers/selinux v1.3.3 // indirect
|
|
||||||
github.com/pkg/errors v0.9.1
|
github.com/pkg/errors v0.9.1
|
||||||
github.com/prometheus/common v0.0.0-20180518154759-7600349dcfe1 // indirect
|
github.com/prometheus/client_golang v1.7.1 // indirect
|
||||||
github.com/serialx/hashring v0.0.0-20190422032157-8b2912629002
|
github.com/serialx/hashring v0.0.0-20190422032157-8b2912629002
|
||||||
github.com/sirupsen/logrus v1.4.2
|
github.com/sirupsen/logrus v1.7.0
|
||||||
github.com/spf13/cobra v0.0.3
|
github.com/spf13/cobra v1.0.0
|
||||||
github.com/spf13/pflag v1.0.5
|
github.com/spf13/pflag v1.0.5
|
||||||
github.com/spf13/viper v1.3.2 // indirect
|
github.com/stretchr/testify v1.5.1
|
||||||
github.com/stretchr/testify v1.4.0
|
|
||||||
github.com/theupdateframework/notary v0.6.1 // indirect
|
github.com/theupdateframework/notary v0.6.1 // indirect
|
||||||
github.com/tonistiigi/units v0.0.0-20180711220420-6950e57a87ea
|
github.com/tonistiigi/units v0.0.0-20180711220420-6950e57a87ea
|
||||||
github.com/xlab/handysort v0.0.0-20150421192137-fb3537ed64a1 // indirect
|
github.com/xeipuuv/gojsonschema v1.2.0 // indirect
|
||||||
github.com/zclconf/go-cty v1.4.0
|
github.com/zclconf/go-cty v1.4.0
|
||||||
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e
|
golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208
|
||||||
gopkg.in/dancannon/gorethink.v3 v3.0.5 // indirect
|
gopkg.in/dancannon/gorethink.v3 v3.0.5 // indirect
|
||||||
gopkg.in/fatih/pool.v2 v2.0.0 // indirect
|
gopkg.in/fatih/pool.v2 v2.0.0 // indirect
|
||||||
gopkg.in/gorethink/gorethink.v3 v3.0.5 // indirect
|
gopkg.in/gorethink/gorethink.v3 v3.0.5 // indirect
|
||||||
k8s.io/api v0.16.7
|
k8s.io/api v0.19.0
|
||||||
k8s.io/apimachinery v0.16.7
|
k8s.io/apimachinery v0.19.0
|
||||||
k8s.io/client-go v0.16.7
|
k8s.io/client-go v0.19.0
|
||||||
vbom.ml/util v0.0.0-20180919145318-efcd4e0f9787 // indirect
|
|
||||||
)
|
)
|
||||||
|
|
||||||
replace github.com/containerd/containerd => github.com/containerd/containerd v1.3.1-0.20200227195959-4d242818bf55
|
replace (
|
||||||
|
// protobuf: corresponds to containerd (through buildkit)
|
||||||
|
github.com/golang/protobuf => github.com/golang/protobuf v1.3.5
|
||||||
|
github.com/jaguilar/vt100 => github.com/tonistiigi/vt100 v0.0.0-20190402012908-ad4c4a574305
|
||||||
|
|
||||||
replace github.com/docker/docker => github.com/docker/docker v1.4.2-0.20200227233006-38f52c9fec82
|
// genproto: corresponds to containerd (through buildkit)
|
||||||
|
google.golang.org/genproto => google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63
|
||||||
replace github.com/jaguilar/vt100 => github.com/tonistiigi/vt100 v0.0.0-20190402012908-ad4c4a574305
|
)
|
||||||
|
|
||||||
go 1.13
|
|
||||||
|
@@ -1,56 +1,16 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
. $(dirname $0)/util
|
. $(dirname $0)/util
|
||||||
|
set -eu
|
||||||
|
|
||||||
: ${TARGETPLATFORM=$CLI_PLATFORM}
|
: ${TARGETPLATFORM=$CLI_PLATFORM}
|
||||||
: ${CONTINUOUS_INTEGRATION=}
|
|
||||||
|
|
||||||
set -ex
|
platformFlag=""
|
||||||
|
if [ -n "$TARGETPLATFORM" ]; then
|
||||||
|
platformFlag="--platform $TARGETPLATFORM"
|
||||||
|
fi
|
||||||
|
|
||||||
progressFlag=""
|
buildxCmd build $platformFlag \
|
||||||
if [ "$CONTINUOUS_INTEGRATION" == "true" ]; then progressFlag="--progress=plain"; fi
|
--target "binaries" \
|
||||||
|
--output "type=local,dest=./bin/" \
|
||||||
binariesDocker() {
|
.
|
||||||
mkdir -p bin/tmp
|
|
||||||
export DOCKER_BUILDKIT=1
|
|
||||||
iidfile=$(mktemp -t docker-iidfile.XXXXXXXXXX)
|
|
||||||
|
|
||||||
platformFlag=""
|
|
||||||
if [ -n "$TARGETPLATFORM" ]; then
|
|
||||||
platformFlag="--build-arg=TARGETPLATFORM=$TARGETPLATFORM"
|
|
||||||
fi
|
|
||||||
|
|
||||||
docker build $platformFlag --target=binaries --iidfile $iidfile --force-rm .
|
|
||||||
iid=$(cat $iidfile)
|
|
||||||
containerID=$(docker create $iid copy)
|
|
||||||
docker cp $containerID:/ bin/tmp
|
|
||||||
mv bin/tmp/build* bin/
|
|
||||||
rm -rf bin/tmp
|
|
||||||
docker rm $containerID
|
|
||||||
docker rmi -f $iid
|
|
||||||
rm -f $iidfile
|
|
||||||
}
|
|
||||||
|
|
||||||
binaries() {
|
|
||||||
platformFlag=""
|
|
||||||
if [ ! -z "$TARGETPLATFORM" ]; then
|
|
||||||
platformFlag="--frontend-opt=platform=$TARGETPLATFORM"
|
|
||||||
fi
|
|
||||||
buildctl build $progressFlag --frontend=dockerfile.v0 \
|
|
||||||
--local context=. --local dockerfile=. \
|
|
||||||
--frontend-opt target=binaries $platformFlag \
|
|
||||||
--output type=local,dest=./bin/
|
|
||||||
}
|
|
||||||
|
|
||||||
case $buildmode in
|
|
||||||
"buildkit")
|
|
||||||
binaries
|
|
||||||
;;
|
|
||||||
"docker-buildkit")
|
|
||||||
binariesDocker
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
echo "buildctl or docker with buildkit support is required"
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
38
hack/build_ci_first_pass
Executable file
38
hack/build_ci_first_pass
Executable file
@@ -0,0 +1,38 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
TYP=$1
|
||||||
|
|
||||||
|
. $(dirname $0)/util
|
||||||
|
set -e
|
||||||
|
|
||||||
|
usage() {
|
||||||
|
echo "usage: ./hack/build_ci_first_pass <binaries>"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
if [ -z "$TYP" ]; then
|
||||||
|
usage
|
||||||
|
fi
|
||||||
|
|
||||||
|
importCacheFlags=""
|
||||||
|
exportCacheFlags=""
|
||||||
|
if [ "$GITHUB_ACTIONS" = "true" ]; then
|
||||||
|
if [ -n "$cacheRefFrom" ]; then
|
||||||
|
importCacheFlags="--cache-from=type=local,src=$cacheRefFrom"
|
||||||
|
fi
|
||||||
|
if [ -n "$cacheRefTo" ]; then
|
||||||
|
exportCacheFlags="--cache-to=type=local,dest=$cacheRefTo"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
case $TYP in
|
||||||
|
"binaries")
|
||||||
|
buildxCmd build $importCacheFlags $exportCacheFlags \
|
||||||
|
--target "binaries" \
|
||||||
|
$currentcontext
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo >&2 "Unknown type $TYP"
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
20
hack/cross
20
hack/cross
@@ -1,20 +1,24 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
. $(dirname $0)/util
|
. $(dirname $0)/util
|
||||||
|
set -e
|
||||||
|
|
||||||
: ${TARGETPLATFORM=linux/amd64,linux/arm/v7,linux/arm64,darwin/amd64,windows/amd64,linux/ppc64le,linux/s390x}
|
: ${TARGETPLATFORM=linux/amd64,linux/arm/v7,linux/arm64,darwin/amd64,windows/amd64,linux/ppc64le,linux/s390x}
|
||||||
: ${CONTINUOUS_INTEGRATION=}
|
|
||||||
: ${EXPORT_LOCAL=}
|
: ${EXPORT_LOCAL=}
|
||||||
|
|
||||||
set -ex
|
importCacheFlags=""
|
||||||
|
if [ "$GITHUB_ACTIONS" = "true" ]; then
|
||||||
|
if [ -n "$cacheRefFrom" ]; then
|
||||||
|
importCacheFlags="--cache-from=type=local,src=$cacheRefFrom"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
exportFlag=""
|
exportFlag=""
|
||||||
if [ -n "$EXPORT_LOCAL" ]; then
|
if [ -n "$EXPORT_LOCAL" ]; then
|
||||||
exportFlag="--output=type=local,dest=$EXPORT_LOCAL"
|
exportFlag="--output=type=local,dest=$EXPORT_LOCAL"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
progressFlag=""
|
buildxCmd build $importCacheFlags $exportFlag \
|
||||||
if [ "$CONTINUOUS_INTEGRATION" == "true" ]; then progressFlag="--progress=plain";
|
--target "binaries" \
|
||||||
fi
|
--platform "$TARGETPLATFORM" \
|
||||||
|
$currentcontext
|
||||||
buildctl build $progressFlag --frontend=dockerfile.v0 --local context=. --local dockerfile=. --opt platform=$TARGETPLATFORM $exportFlag --opt target=binaries
|
|
||||||
|
@@ -10,4 +10,4 @@ services:
|
|||||||
context: .
|
context: .
|
||||||
dockerfile: Dockerfile.webapp
|
dockerfile: Dockerfile.webapp
|
||||||
args:
|
args:
|
||||||
buildno: 1
|
buildno: 1
|
||||||
|
@@ -1,10 +1,12 @@
|
|||||||
# syntax=docker/dockerfile:1.0-experimental
|
# syntax=docker/dockerfile:1.0-experimental
|
||||||
|
|
||||||
FROM golang:1.13-alpine
|
FROM golang:1.13-alpine
|
||||||
RUN apk add --no-cache git
|
RUN apk add --no-cache git yamllint
|
||||||
RUN go get -u gopkg.in/alecthomas/gometalinter.v1 \
|
RUN go get -u gopkg.in/alecthomas/gometalinter.v1 \
|
||||||
&& mv /go/bin/gometalinter.v1 /go/bin/gometalinter \
|
&& mv /go/bin/gometalinter.v1 /go/bin/gometalinter \
|
||||||
&& gometalinter --install
|
&& gometalinter --install
|
||||||
WORKDIR /go/src/github.com/docker/buildx
|
WORKDIR /go/src/github.com/docker/buildx
|
||||||
RUN --mount=target=/go/src/github.com/docker/buildx \
|
RUN --mount=target=/go/src/github.com/docker/buildx \
|
||||||
gometalinter --config=gometalinter.json ./...
|
gometalinter --config=gometalinter.json ./...
|
||||||
|
RUN --mount=target=/go/src/github.com/docker/buildx \
|
||||||
|
yamllint -c .yamllint.yml --strict .
|
||||||
|
35
hack/lint
35
hack/lint
@@ -1,37 +1,6 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
. $(dirname $0)/util
|
. $(dirname $0)/util
|
||||||
set -eu -o pipefail -x
|
set -eu
|
||||||
|
|
||||||
: ${CONTINUOUS_INTEGRATION=}
|
buildxCmd build --file ./hack/dockerfiles/lint.Dockerfile .
|
||||||
|
|
||||||
progressFlag=""
|
|
||||||
if [ "$CONTINUOUS_INTEGRATION" == "true" ]; then progressFlag="--progress=plain"; fi
|
|
||||||
|
|
||||||
lintDocker() {
|
|
||||||
export DOCKER_BUILDKIT=1
|
|
||||||
iidfile=$(mktemp -t docker-iidfile.XXXXXXXXXX)
|
|
||||||
docker build --iidfile $iidfile -f ./hack/dockerfiles/lint.Dockerfile --force-rm .
|
|
||||||
iid=$(cat $iidfile)
|
|
||||||
docker rmi $iid
|
|
||||||
rm -f $iidfile
|
|
||||||
}
|
|
||||||
|
|
||||||
lint() {
|
|
||||||
buildctl build $progressFlag --frontend=dockerfile.v0 \
|
|
||||||
--local context=. --local dockerfile=. \
|
|
||||||
--frontend-opt filename=./hack/dockerfiles/lint.Dockerfile
|
|
||||||
}
|
|
||||||
|
|
||||||
case $buildmode in
|
|
||||||
"buildkit")
|
|
||||||
lint
|
|
||||||
;;
|
|
||||||
"docker-buildkit")
|
|
||||||
lintDocker
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
echo "buildctl or docker with buildkit support is required"
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
27
hack/release
27
hack/release
@@ -3,30 +3,29 @@
|
|||||||
TAG=$1
|
TAG=$1
|
||||||
OUT=$2
|
OUT=$2
|
||||||
|
|
||||||
|
. $(dirname $0)/util
|
||||||
set -eu -o pipefail
|
set -eu -o pipefail
|
||||||
|
|
||||||
: ${PLATFORMS=linux/amd64}
|
: ${PLATFORMS=linux/amd64}
|
||||||
: ${CONTINUOUS_INTEGRATION=}
|
|
||||||
|
|
||||||
progressFlag=""
|
|
||||||
if [ "$CONTINUOUS_INTEGRATION" == "true" ]; then progressFlag="--progress=plain"; fi
|
|
||||||
|
|
||||||
|
|
||||||
usage() {
|
usage() {
|
||||||
echo "usage: ./hack/release <tag> <out>"
|
echo "usage: ./hack/release <tag> <out>"
|
||||||
exit 1
|
exit 1
|
||||||
}
|
}
|
||||||
|
|
||||||
if [ -z "$TAG" ] || [ -z "$OUT" ]; then
|
if [ -z "$TAG" ] || [ -z "$OUT" ]; then
|
||||||
usage
|
usage
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
importCacheFlags=""
|
||||||
|
if [[ -n "$cacheRefFrom" ]] && [[ "$cacheType" = "local" ]]; then
|
||||||
|
for ref in $cacheRefFrom; do
|
||||||
|
importCacheFlags="$importCacheFlags--cache-from=type=local,src=$ref "
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
set -x
|
buildxCmd build $importCacheFlags \
|
||||||
|
--target "release" \
|
||||||
buildctl build $progressFlag --frontend=dockerfile.v0 \
|
--platform "$PLATFORMS" \
|
||||||
--local context=. --local dockerfile=. \
|
--output "type=local,dest=$OUT" \
|
||||||
--opt target=release \
|
$currentcontext
|
||||||
--opt platform=$PLATFORMS \
|
|
||||||
--exporter local \
|
|
||||||
--exporter-opt output=$OUT
|
|
||||||
|
64
hack/test
64
hack/test
@@ -3,51 +3,45 @@
|
|||||||
. $(dirname $0)/util
|
. $(dirname $0)/util
|
||||||
set -eu -o pipefail
|
set -eu -o pipefail
|
||||||
|
|
||||||
: ${CONTINUOUS_INTEGRATION=}
|
|
||||||
: ${BUILDX_NOCACHE=}
|
: ${BUILDX_NOCACHE=}
|
||||||
|
: ${TEST_COVERAGE=}
|
||||||
|
|
||||||
progressFlag=""
|
importCacheFlags=""
|
||||||
if [ "$CONTINUOUS_INTEGRATION" == "true" ]; then progressFlag="--progress=plain"; fi
|
if [ -n "$cacheRefFrom" ]; then
|
||||||
|
if [ "$cacheType" = "local" ]; then
|
||||||
|
for ref in $cacheRefFrom; do
|
||||||
|
importCacheFlags="$importCacheFlags--cache-from=type=local,src=$ref "
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
iid="buildx-tests"
|
iid="buildx-tests"
|
||||||
iidfile=$(mktemp -t docker-iidfile.XXXXXXXXXX)
|
iidfile=$(mktemp -t docker-iidfile.XXXXXXXXXX)
|
||||||
set -x
|
|
||||||
|
|
||||||
case $buildmode in
|
coverageVol=""
|
||||||
"buildkit")
|
coverageFlags=""
|
||||||
tmpfile=$(mktemp -t docker-iidfile.XXXXXXXXXX)
|
if [ "$TEST_COVERAGE" = "1" ]; then
|
||||||
buildctl build $progressFlag --frontend=dockerfile.v0 \
|
covdir="$(pwd)/coverage"
|
||||||
--local context=. --local dockerfile=. \
|
mkdir -p "$covdir"
|
||||||
--frontend-opt target=integration-tests \
|
coverageVol="-v $covdir:/coverage"
|
||||||
--output type=docker,name=$iid,dest=$tmpfile
|
coverageFlags="-coverprofile=/coverage/coverage.txt -covermode=atomic"
|
||||||
docker load -i $tmpfile
|
|
||||||
rm $tmpfile
|
|
||||||
;;
|
|
||||||
"docker-buildkit")
|
|
||||||
export DOCKER_BUILDKIT=1
|
|
||||||
docker build --iidfile $iidfile --target integration-tests --force-rm .
|
|
||||||
iid=$(cat $iidfile)
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
echo "docker with buildkit support is required"
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
cacheVolume="buildx-cache"
|
|
||||||
if ! docker inspect "$cacheVolume" 2>&1 >/dev/null ; then
|
|
||||||
cacheVolume=$(docker create --name=buildx-cache -v /root/.cache -v /go/pkg/mod alpine)
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
docker run --rm -v /tmp --volumes-from=$cacheVolume --privileged $iid go test ${TESTFLAGS:--v} ${TESTPKGS:-./...}
|
buildxCmd build $importCacheFlags \
|
||||||
|
--target "integration-tests" \
|
||||||
|
--output "type=docker,name=$iid" \
|
||||||
|
$currentcontext
|
||||||
|
|
||||||
|
cacheVolume="buildx-cache"
|
||||||
|
if ! docker inspect "$cacheVolume" > /dev/null 2>&1; then
|
||||||
|
cacheVolume=$(docker create --name=buildx-cache -v /root/.cache -v /go/pkg/mod alpine)
|
||||||
|
fi
|
||||||
|
|
||||||
|
docker run --rm -v /tmp $coverageVol --volumes-from=$cacheVolume --privileged $iid go test $coverageFlags ${TESTFLAGS:--v} ${TESTPKGS:-./...}
|
||||||
|
|
||||||
if [ -n "$BUILDX_NOCACHE" ]; then
|
if [ -n "$BUILDX_NOCACHE" ]; then
|
||||||
docker rm -v $cacheVolume
|
docker rm -v $cacheVolume
|
||||||
fi
|
fi
|
||||||
|
|
||||||
case $buildmode in
|
rm "$iidfile"
|
||||||
"docker-buildkit")
|
docker rmi $iid
|
||||||
rm "$iidfile"
|
|
||||||
docker rmi $iid
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
@@ -1,45 +1,16 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
. $(dirname $0)/util
|
. $(dirname $0)/util
|
||||||
set -eu -o pipefail -x
|
set -eu
|
||||||
|
|
||||||
: ${CONTINUOUS_INTEGRATION=}
|
output=$(mktemp -d -t buildx-output.XXXXXXXXXX)
|
||||||
|
|
||||||
progressFlag=""
|
buildxCmd build \
|
||||||
if [ "$CONTINUOUS_INTEGRATION" == "true" ]; then progressFlag="--progress=plain"; fi
|
--target "update" \
|
||||||
|
--output "type=local,dest=$output" \
|
||||||
|
--file "./hack/dockerfiles/vendor.Dockerfile" \
|
||||||
|
.
|
||||||
|
|
||||||
case $buildmode in
|
rm -rf ./vendor
|
||||||
"buildkit")
|
cp -R "$output"/out/* .
|
||||||
output=$(mktemp -d -t buildctl-output.XXXXXXXXXX)
|
rm -rf $output
|
||||||
buildctl build $progressFlag --frontend=dockerfile.v0 --local context=. --local dockerfile=. \
|
|
||||||
--frontend-opt target=update \
|
|
||||||
--frontend-opt filename=./hack/dockerfiles/vendor.Dockerfile \
|
|
||||||
--output type=local,dest=$output
|
|
||||||
rm -rf ./vendor
|
|
||||||
cp -R "$output/out/" .
|
|
||||||
rm -rf $output
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
iidfile=$(mktemp -t docker-iidfile.XXXXXXXXXX)
|
|
||||||
case $buildmode in
|
|
||||||
"docker-buildkit")
|
|
||||||
export DOCKER_BUILDKIT=1
|
|
||||||
docker build --iidfile $iidfile -f ./hack/dockerfiles/vendor.Dockerfile --target update --force-rm .
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
echo "buildctl or docker with buildkit support is required"
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
iid=$(cat $iidfile)
|
|
||||||
cid=$(docker create $iid noop)
|
|
||||||
rm -rf ./vendor
|
|
||||||
|
|
||||||
docker cp $cid:/out/go.mod .
|
|
||||||
docker cp $cid:/out/go.sum .
|
|
||||||
docker cp $cid:/out/vendor .
|
|
||||||
|
|
||||||
docker rm $cid
|
|
||||||
rm -f $iidfile
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
55
hack/util
55
hack/util
@@ -1,13 +1,22 @@
|
|||||||
#!/usr/bin/env sh
|
#!/usr/bin/env sh
|
||||||
|
|
||||||
|
: ${CI=}
|
||||||
: ${PREFER_BUILDCTL=}
|
: ${PREFER_BUILDCTL=}
|
||||||
: ${PREFER_LEGACY=}
|
: ${PREFER_LEGACY=}
|
||||||
: ${CLI_PLATFORM=}
|
: ${CLI_PLATFORM=}
|
||||||
|
: ${GITHUB_ACTIONS=}
|
||||||
|
: ${CACHEDIR_FROM=}
|
||||||
|
: ${CACHEDIR_TO=}
|
||||||
|
|
||||||
newerEqualThan() { # $1=minimum wanted version $2=actual-version
|
newerEqualThan() { # $1=minimum wanted version $2=actual-version
|
||||||
[ "$1" = "$(printf "$1\n$2" | sort -V | head -n 1)" ]
|
[ "$1" = "$(printf "$1\n$2" | sort -V | head -n 1)" ]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
progressFlag=""
|
||||||
|
if [ "$CI" = "true" ]; then
|
||||||
|
progressFlag="--progress=plain"
|
||||||
|
fi
|
||||||
|
|
||||||
buildmode="legacy"
|
buildmode="legacy"
|
||||||
if [ "$PREFER_BUILDCTL" = "1" ]; then
|
if [ "$PREFER_BUILDCTL" = "1" ]; then
|
||||||
buildmode="buildkit";
|
buildmode="buildkit";
|
||||||
@@ -21,12 +30,46 @@ else
|
|||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
buildxCmd() {
|
||||||
|
if docker buildx version >/dev/null 2>&1; then
|
||||||
|
set -x
|
||||||
|
docker buildx "$@" $progressFlag
|
||||||
|
elif buildx version >/dev/null 2>&1; then
|
||||||
|
set -x
|
||||||
|
buildx "$@" $progressFlag
|
||||||
|
elif docker version >/dev/null 2>&1; then
|
||||||
|
set -x
|
||||||
|
DOCKER_BUILDKIT=1 docker "$@" $progressFlag
|
||||||
|
else
|
||||||
|
echo >&2 "ERROR: Please enable DOCKER_BUILDKIT or install standalone buildx"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
if [ -z "$CLI_PLATFORM" ]; then
|
if [ -z "$CLI_PLATFORM" ]; then
|
||||||
rawos=$(uname -s)
|
if [ "$(uname -s)" = "Darwin" ]; then
|
||||||
if [ "$rawos" = "Darwin" ]; then
|
arch="$(uname -m)"
|
||||||
CLI_PLATFORM="darwin/amd64"
|
if [ "$arch" = "x86_64" ]; then
|
||||||
elif uname -s | grep MINGW 2>&1 >/dev/null ; then
|
arch="amd64"
|
||||||
CLI_PLATFORM="windows/amd64"
|
fi
|
||||||
fi
|
CLI_PLATFORM="darwin/$arch"
|
||||||
|
elif uname -s | grep MINGW > /dev/null 2>&1 ; then
|
||||||
|
CLI_PLATFORM="windows/amd64"
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
cacheType=""
|
||||||
|
cacheRefFrom=""
|
||||||
|
cacheRefTo=""
|
||||||
|
currentref=""
|
||||||
|
if [ "$GITHUB_ACTIONS" = "true" ]; then
|
||||||
|
currentref="git://github.com/$GITHUB_REPOSITORY#$GITHUB_REF"
|
||||||
|
cacheType="local"
|
||||||
|
cacheRefFrom="$CACHEDIR_FROM"
|
||||||
|
cacheRefTo="$CACHEDIR_TO"
|
||||||
|
fi
|
||||||
|
|
||||||
|
currentcontext="."
|
||||||
|
if [ -n "$currentref" ]; then
|
||||||
|
currentcontext="--build-arg BUILDKIT_CONTEXT_KEEP_GIT_DIR=1 $currentref"
|
||||||
|
fi
|
||||||
|
@@ -1,40 +1,20 @@
|
|||||||
#!/usr/bin/env sh
|
#!/usr/bin/env sh
|
||||||
|
|
||||||
set -eu
|
set -eu
|
||||||
|
|
||||||
: ${CONTINUOUS_INTEGRATION=}
|
|
||||||
: ${DOCKER_BUILDKIT=}
|
|
||||||
|
|
||||||
progressFlag=""
|
|
||||||
if [ "$CONTINUOUS_INTEGRATION" = "true" ]; then progressFlag="--progress=plain"; fi
|
|
||||||
|
|
||||||
case ${1:-} in
|
case ${1:-} in
|
||||||
'')
|
'')
|
||||||
. $(dirname $0)/util
|
. $(dirname $0)/util
|
||||||
case $buildmode in
|
buildxCmd build \
|
||||||
"buildkit")
|
--target validate \
|
||||||
buildctl build $progressFlag --frontend=dockerfile.v0 --local context=. --local dockerfile=. --frontend-opt filename=./hack/dockerfiles/vendor.Dockerfile --frontend-opt target=validate
|
--file ./hack/dockerfiles/vendor.Dockerfile \
|
||||||
|
.
|
||||||
;;
|
;;
|
||||||
"docker-buildkit")
|
check)
|
||||||
export DOCKER_BUILDKIT=1
|
status="$(git status --porcelain -- go.mod go.sum vendor 2>/dev/null)"
|
||||||
iidfile=$(mktemp -t docker-iidfile.XXXXXXXXXX)
|
diffs=$(echo "$status" | grep -v '^[RAD] ' || true)
|
||||||
docker build --iidfile $iidfile -f ./hack/dockerfiles/vendor.Dockerfile --target validate --force-rm . || exit 1
|
if [ "$diffs" ]; then
|
||||||
iid=$(cat $iidfile)
|
|
||||||
docker rmi $iid
|
|
||||||
rm -f $iidfile
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
echo "buildkit support is required"
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
;;
|
|
||||||
check)
|
|
||||||
status="$(git status --porcelain -- go.mod go.sum vendor 2>/dev/null)"
|
|
||||||
diffs=$(echo "$status" | grep -v '^[RAD] ' || true)
|
|
||||||
if [ "$diffs" ]; then
|
|
||||||
{
|
{
|
||||||
set +x
|
set +x
|
||||||
echo 'The result of "make vendor" differs'
|
echo 'The result of "make vendor" differs'
|
||||||
echo
|
echo
|
||||||
echo "$diffs"
|
echo "$diffs"
|
||||||
@@ -43,7 +23,7 @@ check)
|
|||||||
echo
|
echo
|
||||||
} >&2
|
} >&2
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
echo 'Congratulations! All vendoring changes are done the right way.'
|
echo 'Congratulations! All vendoring changes are done the right way.'
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
@@ -15,7 +15,6 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func New(root string) (*Store, error) {
|
func New(root string) (*Store, error) {
|
||||||
root = filepath.Join(root, "buildx")
|
|
||||||
if err := os.MkdirAll(filepath.Join(root, "instances"), 0700); err != nil {
|
if err := os.MkdirAll(filepath.Join(root, "instances"), 0700); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@@ -3,6 +3,8 @@ package imagetools
|
|||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"context"
|
"context"
|
||||||
|
"encoding/base64"
|
||||||
|
"encoding/json"
|
||||||
"io"
|
"io"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
|
||||||
@@ -107,3 +109,26 @@ func toCredentialsFunc(a Auth) func(string) (string, string, error) {
|
|||||||
return ac.Username, ac.Password, nil
|
return ac.Username, ac.Password, nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func RegistryAuthForRef(ref string, a Auth) (string, error) {
|
||||||
|
if a == nil {
|
||||||
|
return "", nil
|
||||||
|
}
|
||||||
|
r, err := parseRef(ref)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
host := reference.Domain(r)
|
||||||
|
if host == "docker.io" {
|
||||||
|
host = "https://index.docker.io/v1/"
|
||||||
|
}
|
||||||
|
ac, err := a.GetAuthConfig(host)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
buf, err := json.Marshal(ac)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
return base64.URLEncoding.EncodeToString(buf), nil
|
||||||
|
}
|
||||||
|
@@ -11,7 +11,6 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func FromReader(w Writer, name string, rc io.ReadCloser) {
|
func FromReader(w Writer, name string, rc io.ReadCloser) {
|
||||||
status := w.Status()
|
|
||||||
dgst := digest.FromBytes([]byte(identity.NewID()))
|
dgst := digest.FromBytes([]byte(identity.NewID()))
|
||||||
tm := time.Now()
|
tm := time.Now()
|
||||||
|
|
||||||
@@ -21,9 +20,9 @@ func FromReader(w Writer, name string, rc io.ReadCloser) {
|
|||||||
Started: &tm,
|
Started: &tm,
|
||||||
}
|
}
|
||||||
|
|
||||||
status <- &client.SolveStatus{
|
w.Write(&client.SolveStatus{
|
||||||
Vertexes: []*client.Vertex{&vtx},
|
Vertexes: []*client.Vertex{&vtx},
|
||||||
}
|
})
|
||||||
|
|
||||||
_, err := io.Copy(ioutil.Discard, rc)
|
_, err := io.Copy(ioutil.Discard, rc)
|
||||||
|
|
||||||
@@ -33,8 +32,7 @@ func FromReader(w Writer, name string, rc io.ReadCloser) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
vtx2.Error = err.Error()
|
vtx2.Error = err.Error()
|
||||||
}
|
}
|
||||||
status <- &client.SolveStatus{
|
w.Write(&client.SolveStatus{
|
||||||
Vertexes: []*client.Vertex{&vtx2},
|
Vertexes: []*client.Vertex{&vtx2},
|
||||||
}
|
})
|
||||||
close(status)
|
|
||||||
}
|
}
|
||||||
|
@@ -1,101 +1,32 @@
|
|||||||
package progress
|
package progress
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
|
||||||
"strings"
|
"strings"
|
||||||
"sync"
|
|
||||||
|
|
||||||
"github.com/moby/buildkit/client"
|
"github.com/moby/buildkit/client"
|
||||||
"golang.org/x/sync/errgroup"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type MultiWriter struct {
|
func WithPrefix(w Writer, pfx string, force bool) Writer {
|
||||||
w Writer
|
return &prefixed{
|
||||||
eg *errgroup.Group
|
main: w,
|
||||||
once sync.Once
|
pfx: pfx,
|
||||||
ready chan struct{}
|
force: force,
|
||||||
}
|
|
||||||
|
|
||||||
func (mw *MultiWriter) WithPrefix(pfx string, force bool) Writer {
|
|
||||||
in := make(chan *client.SolveStatus)
|
|
||||||
out := mw.w.Status()
|
|
||||||
p := &prefixed{
|
|
||||||
main: mw.w,
|
|
||||||
in: in,
|
|
||||||
}
|
}
|
||||||
mw.eg.Go(func() error {
|
|
||||||
mw.once.Do(func() {
|
|
||||||
close(mw.ready)
|
|
||||||
})
|
|
||||||
for {
|
|
||||||
select {
|
|
||||||
case v, ok := <-in:
|
|
||||||
if ok {
|
|
||||||
if force {
|
|
||||||
for _, v := range v.Vertexes {
|
|
||||||
v.Name = addPrefix(pfx, v.Name)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
out <- v
|
|
||||||
} else {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
case <-mw.Done():
|
|
||||||
return mw.Err()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
return p
|
|
||||||
}
|
|
||||||
|
|
||||||
func (mw *MultiWriter) Done() <-chan struct{} {
|
|
||||||
return mw.w.Done()
|
|
||||||
}
|
|
||||||
|
|
||||||
func (mw *MultiWriter) Err() error {
|
|
||||||
return mw.w.Err()
|
|
||||||
}
|
|
||||||
|
|
||||||
func (mw *MultiWriter) Status() chan *client.SolveStatus {
|
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
type prefixed struct {
|
type prefixed struct {
|
||||||
main Writer
|
main Writer
|
||||||
in chan *client.SolveStatus
|
pfx string
|
||||||
|
force bool
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *prefixed) Done() <-chan struct{} {
|
func (p *prefixed) Write(v *client.SolveStatus) {
|
||||||
return p.main.Done()
|
if p.force {
|
||||||
}
|
for _, v := range v.Vertexes {
|
||||||
|
v.Name = addPrefix(p.pfx, v.Name)
|
||||||
func (p *prefixed) Err() error {
|
}
|
||||||
return p.main.Err()
|
|
||||||
}
|
|
||||||
|
|
||||||
func (p *prefixed) Status() chan *client.SolveStatus {
|
|
||||||
return p.in
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewMultiWriter(pw Writer) *MultiWriter {
|
|
||||||
if pw == nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
eg, _ := errgroup.WithContext(context.TODO())
|
|
||||||
|
|
||||||
ready := make(chan struct{})
|
|
||||||
|
|
||||||
go func() {
|
|
||||||
<-ready
|
|
||||||
eg.Wait()
|
|
||||||
close(pw.Status())
|
|
||||||
}()
|
|
||||||
|
|
||||||
return &MultiWriter{
|
|
||||||
w: pw,
|
|
||||||
eg: eg,
|
|
||||||
ready: ready,
|
|
||||||
}
|
}
|
||||||
|
p.main.Write(v)
|
||||||
}
|
}
|
||||||
|
|
||||||
func addPrefix(pfx, name string) string {
|
func addPrefix(pfx, name string) string {
|
||||||
|
@@ -9,32 +9,27 @@ import (
|
|||||||
"github.com/moby/buildkit/util/progress/progressui"
|
"github.com/moby/buildkit/util/progress/progressui"
|
||||||
)
|
)
|
||||||
|
|
||||||
type printer struct {
|
type Printer struct {
|
||||||
status chan *client.SolveStatus
|
status chan *client.SolveStatus
|
||||||
done <-chan struct{}
|
done <-chan struct{}
|
||||||
err error
|
err error
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *printer) Done() <-chan struct{} {
|
func (p *Printer) Wait() error {
|
||||||
return p.done
|
close(p.status)
|
||||||
}
|
<-p.done
|
||||||
|
|
||||||
func (p *printer) Err() error {
|
|
||||||
return p.err
|
return p.err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *printer) Status() chan *client.SolveStatus {
|
func (p *Printer) Write(s *client.SolveStatus) {
|
||||||
if p == nil {
|
p.status <- s
|
||||||
return nil
|
|
||||||
}
|
|
||||||
return p.status
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewPrinter(ctx context.Context, out console.File, mode string) Writer {
|
func NewPrinter(ctx context.Context, out console.File, mode string) *Printer {
|
||||||
statusCh := make(chan *client.SolveStatus)
|
statusCh := make(chan *client.SolveStatus)
|
||||||
doneCh := make(chan struct{})
|
doneCh := make(chan struct{})
|
||||||
|
|
||||||
pw := &printer{
|
pw := &Printer{
|
||||||
status: statusCh,
|
status: statusCh,
|
||||||
done: doneCh,
|
done: doneCh,
|
||||||
}
|
}
|
||||||
|
@@ -13,6 +13,7 @@ type Logger func(*client.SolveStatus)
|
|||||||
type SubLogger interface {
|
type SubLogger interface {
|
||||||
Wrap(name string, fn func() error) error
|
Wrap(name string, fn func() error) error
|
||||||
Log(stream int, dt []byte)
|
Log(stream int, dt []byte)
|
||||||
|
SetStatus(*client.VertexStatus)
|
||||||
}
|
}
|
||||||
|
|
||||||
func Wrap(name string, l Logger, fn func(SubLogger) error) (err error) {
|
func Wrap(name string, l Logger, fn func(SubLogger) error) (err error) {
|
||||||
@@ -88,3 +89,10 @@ func (sl *subLogger) Log(stream int, dt []byte) {
|
|||||||
}},
|
}},
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (sl *subLogger) SetStatus(st *client.VertexStatus) {
|
||||||
|
st.Vertex = sl.dgst
|
||||||
|
sl.logger(&client.SolveStatus{
|
||||||
|
Statuses: []*client.VertexStatus{st},
|
||||||
|
})
|
||||||
|
}
|
||||||
|
@@ -7,56 +7,45 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func ResetTime(in Writer) Writer {
|
func ResetTime(in Writer) Writer {
|
||||||
w := &pw{Writer: in, status: make(chan *client.SolveStatus), tm: time.Now()}
|
return &pw{Writer: in, status: make(chan *client.SolveStatus), tm: time.Now()}
|
||||||
go func() {
|
}
|
||||||
for {
|
|
||||||
select {
|
func (w *pw) Write(st *client.SolveStatus) {
|
||||||
case <-in.Done():
|
if w.diff == nil {
|
||||||
return
|
for _, v := range st.Vertexes {
|
||||||
case st, ok := <-w.status:
|
if v.Started != nil {
|
||||||
if !ok {
|
d := v.Started.Sub(w.tm)
|
||||||
close(in.Status())
|
w.diff = &d
|
||||||
return
|
|
||||||
}
|
|
||||||
if w.diff == nil {
|
|
||||||
for _, v := range st.Vertexes {
|
|
||||||
if v.Started != nil {
|
|
||||||
d := v.Started.Sub(w.tm)
|
|
||||||
w.diff = &d
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if w.diff != nil {
|
|
||||||
for _, v := range st.Vertexes {
|
|
||||||
if v.Started != nil {
|
|
||||||
d := v.Started.Add(-*w.diff)
|
|
||||||
v.Started = &d
|
|
||||||
}
|
|
||||||
if v.Completed != nil {
|
|
||||||
d := v.Completed.Add(-*w.diff)
|
|
||||||
v.Completed = &d
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for _, v := range st.Statuses {
|
|
||||||
if v.Started != nil {
|
|
||||||
d := v.Started.Add(-*w.diff)
|
|
||||||
v.Started = &d
|
|
||||||
}
|
|
||||||
if v.Completed != nil {
|
|
||||||
d := v.Completed.Add(-*w.diff)
|
|
||||||
v.Completed = &d
|
|
||||||
}
|
|
||||||
v.Timestamp = v.Timestamp.Add(-*w.diff)
|
|
||||||
}
|
|
||||||
for _, v := range st.Logs {
|
|
||||||
v.Timestamp = v.Timestamp.Add(-*w.diff)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
in.Status() <- st
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}()
|
}
|
||||||
return w
|
if w.diff != nil {
|
||||||
|
for _, v := range st.Vertexes {
|
||||||
|
if v.Started != nil {
|
||||||
|
d := v.Started.Add(-*w.diff)
|
||||||
|
v.Started = &d
|
||||||
|
}
|
||||||
|
if v.Completed != nil {
|
||||||
|
d := v.Completed.Add(-*w.diff)
|
||||||
|
v.Completed = &d
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for _, v := range st.Statuses {
|
||||||
|
if v.Started != nil {
|
||||||
|
d := v.Started.Add(-*w.diff)
|
||||||
|
v.Started = &d
|
||||||
|
}
|
||||||
|
if v.Completed != nil {
|
||||||
|
d := v.Completed.Add(-*w.diff)
|
||||||
|
v.Completed = &d
|
||||||
|
}
|
||||||
|
v.Timestamp = v.Timestamp.Add(-*w.diff)
|
||||||
|
}
|
||||||
|
for _, v := range st.Logs {
|
||||||
|
v.Timestamp = v.Timestamp.Add(-*w.diff)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
w.Writer.Write(st)
|
||||||
}
|
}
|
||||||
|
|
||||||
type pw struct {
|
type pw struct {
|
||||||
|
@@ -9,13 +9,10 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
type Writer interface {
|
type Writer interface {
|
||||||
Done() <-chan struct{}
|
Write(*client.SolveStatus)
|
||||||
Err() error
|
|
||||||
Status() chan *client.SolveStatus
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func Write(w Writer, name string, f func() error) {
|
func Write(w Writer, name string, f func() error) {
|
||||||
status := w.Status()
|
|
||||||
dgst := digest.FromBytes([]byte(identity.NewID()))
|
dgst := digest.FromBytes([]byte(identity.NewID()))
|
||||||
tm := time.Now()
|
tm := time.Now()
|
||||||
|
|
||||||
@@ -25,9 +22,9 @@ func Write(w Writer, name string, f func() error) {
|
|||||||
Started: &tm,
|
Started: &tm,
|
||||||
}
|
}
|
||||||
|
|
||||||
status <- &client.SolveStatus{
|
w.Write(&client.SolveStatus{
|
||||||
Vertexes: []*client.Vertex{&vtx},
|
Vertexes: []*client.Vertex{&vtx},
|
||||||
}
|
})
|
||||||
|
|
||||||
err := f()
|
err := f()
|
||||||
|
|
||||||
@@ -37,7 +34,23 @@ func Write(w Writer, name string, f func() error) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
vtx2.Error = err.Error()
|
vtx2.Error = err.Error()
|
||||||
}
|
}
|
||||||
status <- &client.SolveStatus{
|
w.Write(&client.SolveStatus{
|
||||||
Vertexes: []*client.Vertex{&vtx2},
|
Vertexes: []*client.Vertex{&vtx2},
|
||||||
}
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewChannel(w Writer) (chan *client.SolveStatus, chan struct{}) {
|
||||||
|
ch := make(chan *client.SolveStatus)
|
||||||
|
done := make(chan struct{})
|
||||||
|
go func() {
|
||||||
|
for {
|
||||||
|
v, ok := <-ch
|
||||||
|
if !ok {
|
||||||
|
close(done)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
w.Write(v)
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
return ch, done
|
||||||
}
|
}
|
||||||
|
65
vendor/cloud.google.com/go/compute/metadata/metadata.go
generated
vendored
65
vendor/cloud.google.com/go/compute/metadata/metadata.go
generated
vendored
@@ -61,25 +61,14 @@ var (
|
|||||||
instID = &cachedValue{k: "instance/id", trim: true}
|
instID = &cachedValue{k: "instance/id", trim: true}
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var defaultClient = &Client{hc: &http.Client{
|
||||||
defaultClient = &Client{hc: &http.Client{
|
Transport: &http.Transport{
|
||||||
Transport: &http.Transport{
|
Dial: (&net.Dialer{
|
||||||
Dial: (&net.Dialer{
|
Timeout: 2 * time.Second,
|
||||||
Timeout: 2 * time.Second,
|
KeepAlive: 30 * time.Second,
|
||||||
KeepAlive: 30 * time.Second,
|
}).Dial,
|
||||||
}).Dial,
|
},
|
||||||
ResponseHeaderTimeout: 2 * time.Second,
|
}}
|
||||||
},
|
|
||||||
}}
|
|
||||||
subscribeClient = &Client{hc: &http.Client{
|
|
||||||
Transport: &http.Transport{
|
|
||||||
Dial: (&net.Dialer{
|
|
||||||
Timeout: 2 * time.Second,
|
|
||||||
KeepAlive: 30 * time.Second,
|
|
||||||
}).Dial,
|
|
||||||
},
|
|
||||||
}}
|
|
||||||
)
|
|
||||||
|
|
||||||
// NotDefinedError is returned when requested metadata is not defined.
|
// NotDefinedError is returned when requested metadata is not defined.
|
||||||
//
|
//
|
||||||
@@ -206,10 +195,9 @@ func systemInfoSuggestsGCE() bool {
|
|||||||
return name == "Google" || name == "Google Compute Engine"
|
return name == "Google" || name == "Google Compute Engine"
|
||||||
}
|
}
|
||||||
|
|
||||||
// Subscribe calls Client.Subscribe on a client designed for subscribing (one with no
|
// Subscribe calls Client.Subscribe on the default client.
|
||||||
// ResponseHeaderTimeout).
|
|
||||||
func Subscribe(suffix string, fn func(v string, ok bool) error) error {
|
func Subscribe(suffix string, fn func(v string, ok bool) error) error {
|
||||||
return subscribeClient.Subscribe(suffix, fn)
|
return defaultClient.Subscribe(suffix, fn)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get calls Client.Get on the default client.
|
// Get calls Client.Get on the default client.
|
||||||
@@ -227,6 +215,9 @@ func InternalIP() (string, error) { return defaultClient.InternalIP() }
|
|||||||
// ExternalIP returns the instance's primary external (public) IP address.
|
// ExternalIP returns the instance's primary external (public) IP address.
|
||||||
func ExternalIP() (string, error) { return defaultClient.ExternalIP() }
|
func ExternalIP() (string, error) { return defaultClient.ExternalIP() }
|
||||||
|
|
||||||
|
// Email calls Client.Email on the default client.
|
||||||
|
func Email(serviceAccount string) (string, error) { return defaultClient.Email(serviceAccount) }
|
||||||
|
|
||||||
// Hostname returns the instance's hostname. This will be of the form
|
// Hostname returns the instance's hostname. This will be of the form
|
||||||
// "<instanceID>.c.<projID>.internal".
|
// "<instanceID>.c.<projID>.internal".
|
||||||
func Hostname() (string, error) { return defaultClient.Hostname() }
|
func Hostname() (string, error) { return defaultClient.Hostname() }
|
||||||
@@ -277,9 +268,14 @@ type Client struct {
|
|||||||
hc *http.Client
|
hc *http.Client
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewClient returns a Client that can be used to fetch metadata. All HTTP requests
|
// NewClient returns a Client that can be used to fetch metadata.
|
||||||
// will use the given http.Client instead of the default client.
|
// Returns the client that uses the specified http.Client for HTTP requests.
|
||||||
|
// If nil is specified, returns the default client.
|
||||||
func NewClient(c *http.Client) *Client {
|
func NewClient(c *http.Client) *Client {
|
||||||
|
if c == nil {
|
||||||
|
return defaultClient
|
||||||
|
}
|
||||||
|
|
||||||
return &Client{hc: c}
|
return &Client{hc: c}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -301,7 +297,10 @@ func (c *Client) getETag(suffix string) (value, etag string, err error) {
|
|||||||
host = metadataIP
|
host = metadataIP
|
||||||
}
|
}
|
||||||
u := "http://" + host + "/computeMetadata/v1/" + suffix
|
u := "http://" + host + "/computeMetadata/v1/" + suffix
|
||||||
req, _ := http.NewRequest("GET", u, nil)
|
req, err := http.NewRequest("GET", u, nil)
|
||||||
|
if err != nil {
|
||||||
|
return "", "", err
|
||||||
|
}
|
||||||
req.Header.Set("Metadata-Flavor", "Google")
|
req.Header.Set("Metadata-Flavor", "Google")
|
||||||
req.Header.Set("User-Agent", userAgent)
|
req.Header.Set("User-Agent", userAgent)
|
||||||
res, err := c.hc.Do(req)
|
res, err := c.hc.Do(req)
|
||||||
@@ -367,6 +366,16 @@ func (c *Client) InternalIP() (string, error) {
|
|||||||
return c.getTrimmed("instance/network-interfaces/0/ip")
|
return c.getTrimmed("instance/network-interfaces/0/ip")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Email returns the email address associated with the service account.
|
||||||
|
// The account may be empty or the string "default" to use the instance's
|
||||||
|
// main account.
|
||||||
|
func (c *Client) Email(serviceAccount string) (string, error) {
|
||||||
|
if serviceAccount == "" {
|
||||||
|
serviceAccount = "default"
|
||||||
|
}
|
||||||
|
return c.getTrimmed("instance/service-accounts/" + serviceAccount + "/email")
|
||||||
|
}
|
||||||
|
|
||||||
// ExternalIP returns the instance's primary external (public) IP address.
|
// ExternalIP returns the instance's primary external (public) IP address.
|
||||||
func (c *Client) ExternalIP() (string, error) {
|
func (c *Client) ExternalIP() (string, error) {
|
||||||
return c.getTrimmed("instance/network-interfaces/0/access-configs/0/external-ip")
|
return c.getTrimmed("instance/network-interfaces/0/access-configs/0/external-ip")
|
||||||
@@ -394,11 +403,7 @@ func (c *Client) InstanceTags() ([]string, error) {
|
|||||||
|
|
||||||
// InstanceName returns the current VM's instance ID string.
|
// InstanceName returns the current VM's instance ID string.
|
||||||
func (c *Client) InstanceName() (string, error) {
|
func (c *Client) InstanceName() (string, error) {
|
||||||
host, err := c.Hostname()
|
return c.getTrimmed("instance/name")
|
||||||
if err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
return strings.Split(host, ".")[0], nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Zone returns the current VM's zone, such as "us-central1-b".
|
// Zone returns the current VM's zone, such as "us-central1-b".
|
||||||
|
17
vendor/github.com/Microsoft/go-winio/pipe.go
generated
vendored
17
vendor/github.com/Microsoft/go-winio/pipe.go
generated
vendored
@@ -182,13 +182,14 @@ func (s pipeAddress) String() string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// tryDialPipe attempts to dial the pipe at `path` until `ctx` cancellation or timeout.
|
// tryDialPipe attempts to dial the pipe at `path` until `ctx` cancellation or timeout.
|
||||||
func tryDialPipe(ctx context.Context, path *string) (syscall.Handle, error) {
|
func tryDialPipe(ctx context.Context, path *string, access uint32) (syscall.Handle, error) {
|
||||||
for {
|
for {
|
||||||
|
|
||||||
select {
|
select {
|
||||||
case <-ctx.Done():
|
case <-ctx.Done():
|
||||||
return syscall.Handle(0), ctx.Err()
|
return syscall.Handle(0), ctx.Err()
|
||||||
default:
|
default:
|
||||||
h, err := createFile(*path, syscall.GENERIC_READ|syscall.GENERIC_WRITE, 0, nil, syscall.OPEN_EXISTING, syscall.FILE_FLAG_OVERLAPPED|cSECURITY_SQOS_PRESENT|cSECURITY_ANONYMOUS, 0)
|
h, err := createFile(*path, access, 0, nil, syscall.OPEN_EXISTING, syscall.FILE_FLAG_OVERLAPPED|cSECURITY_SQOS_PRESENT|cSECURITY_ANONYMOUS, 0)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
return h, nil
|
return h, nil
|
||||||
}
|
}
|
||||||
@@ -197,7 +198,7 @@ func tryDialPipe(ctx context.Context, path *string) (syscall.Handle, error) {
|
|||||||
}
|
}
|
||||||
// Wait 10 msec and try again. This is a rather simplistic
|
// Wait 10 msec and try again. This is a rather simplistic
|
||||||
// view, as we always try each 10 milliseconds.
|
// view, as we always try each 10 milliseconds.
|
||||||
time.Sleep(time.Millisecond * 10)
|
time.Sleep(10 * time.Millisecond)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -210,7 +211,7 @@ func DialPipe(path string, timeout *time.Duration) (net.Conn, error) {
|
|||||||
if timeout != nil {
|
if timeout != nil {
|
||||||
absTimeout = time.Now().Add(*timeout)
|
absTimeout = time.Now().Add(*timeout)
|
||||||
} else {
|
} else {
|
||||||
absTimeout = time.Now().Add(time.Second * 2)
|
absTimeout = time.Now().Add(2 * time.Second)
|
||||||
}
|
}
|
||||||
ctx, _ := context.WithDeadline(context.Background(), absTimeout)
|
ctx, _ := context.WithDeadline(context.Background(), absTimeout)
|
||||||
conn, err := DialPipeContext(ctx, path)
|
conn, err := DialPipeContext(ctx, path)
|
||||||
@@ -223,9 +224,15 @@ func DialPipe(path string, timeout *time.Duration) (net.Conn, error) {
|
|||||||
// DialPipeContext attempts to connect to a named pipe by `path` until `ctx`
|
// DialPipeContext attempts to connect to a named pipe by `path` until `ctx`
|
||||||
// cancellation or timeout.
|
// cancellation or timeout.
|
||||||
func DialPipeContext(ctx context.Context, path string) (net.Conn, error) {
|
func DialPipeContext(ctx context.Context, path string) (net.Conn, error) {
|
||||||
|
return DialPipeAccess(ctx, path, syscall.GENERIC_READ|syscall.GENERIC_WRITE)
|
||||||
|
}
|
||||||
|
|
||||||
|
// DialPipeAccess attempts to connect to a named pipe by `path` with `access` until `ctx`
|
||||||
|
// cancellation or timeout.
|
||||||
|
func DialPipeAccess(ctx context.Context, path string, access uint32) (net.Conn, error) {
|
||||||
var err error
|
var err error
|
||||||
var h syscall.Handle
|
var h syscall.Handle
|
||||||
h, err = tryDialPipe(ctx, &path)
|
h, err = tryDialPipe(ctx, &path, access)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
151
vendor/github.com/Microsoft/go-winio/vhd/vhd.go
generated
vendored
Normal file
151
vendor/github.com/Microsoft/go-winio/vhd/vhd.go
generated
vendored
Normal file
@@ -0,0 +1,151 @@
|
|||||||
|
// +build windows
|
||||||
|
|
||||||
|
package vhd
|
||||||
|
|
||||||
|
import "syscall"
|
||||||
|
|
||||||
|
//go:generate go run mksyscall_windows.go -output zvhd.go vhd.go
|
||||||
|
|
||||||
|
//sys createVirtualDisk(virtualStorageType *virtualStorageType, path string, virtualDiskAccessMask uint32, securityDescriptor *uintptr, flags uint32, providerSpecificFlags uint32, parameters *createVirtualDiskParameters, o *syscall.Overlapped, handle *syscall.Handle) (err error) [failretval != 0] = VirtDisk.CreateVirtualDisk
|
||||||
|
//sys openVirtualDisk(virtualStorageType *virtualStorageType, path string, virtualDiskAccessMask uint32, flags uint32, parameters *openVirtualDiskParameters, handle *syscall.Handle) (err error) [failretval != 0] = VirtDisk.OpenVirtualDisk
|
||||||
|
//sys detachVirtualDisk(handle syscall.Handle, flags uint32, providerSpecificFlags uint32) (err error) [failretval != 0] = VirtDisk.DetachVirtualDisk
|
||||||
|
|
||||||
|
type virtualStorageType struct {
|
||||||
|
DeviceID uint32
|
||||||
|
VendorID [16]byte
|
||||||
|
}
|
||||||
|
|
||||||
|
type (
|
||||||
|
createVirtualDiskFlag uint32
|
||||||
|
VirtualDiskAccessMask uint32
|
||||||
|
VirtualDiskFlag uint32
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
// Flags for creating a VHD (not exported)
|
||||||
|
createVirtualDiskFlagNone createVirtualDiskFlag = 0
|
||||||
|
createVirtualDiskFlagFullPhysicalAllocation createVirtualDiskFlag = 1
|
||||||
|
createVirtualDiskFlagPreventWritesToSourceDisk createVirtualDiskFlag = 2
|
||||||
|
createVirtualDiskFlagDoNotCopyMetadataFromParent createVirtualDiskFlag = 4
|
||||||
|
|
||||||
|
// Access Mask for opening a VHD
|
||||||
|
VirtualDiskAccessNone VirtualDiskAccessMask = 0
|
||||||
|
VirtualDiskAccessAttachRO VirtualDiskAccessMask = 65536
|
||||||
|
VirtualDiskAccessAttachRW VirtualDiskAccessMask = 131072
|
||||||
|
VirtualDiskAccessDetach VirtualDiskAccessMask = 262144
|
||||||
|
VirtualDiskAccessGetInfo VirtualDiskAccessMask = 524288
|
||||||
|
VirtualDiskAccessCreate VirtualDiskAccessMask = 1048576
|
||||||
|
VirtualDiskAccessMetaOps VirtualDiskAccessMask = 2097152
|
||||||
|
VirtualDiskAccessRead VirtualDiskAccessMask = 851968
|
||||||
|
VirtualDiskAccessAll VirtualDiskAccessMask = 4128768
|
||||||
|
VirtualDiskAccessWritable VirtualDiskAccessMask = 3276800
|
||||||
|
|
||||||
|
// Flags for opening a VHD
|
||||||
|
OpenVirtualDiskFlagNone VirtualDiskFlag = 0
|
||||||
|
OpenVirtualDiskFlagNoParents VirtualDiskFlag = 0x1
|
||||||
|
OpenVirtualDiskFlagBlankFile VirtualDiskFlag = 0x2
|
||||||
|
OpenVirtualDiskFlagBootDrive VirtualDiskFlag = 0x4
|
||||||
|
OpenVirtualDiskFlagCachedIO VirtualDiskFlag = 0x8
|
||||||
|
OpenVirtualDiskFlagCustomDiffChain VirtualDiskFlag = 0x10
|
||||||
|
OpenVirtualDiskFlagParentCachedIO VirtualDiskFlag = 0x20
|
||||||
|
OpenVirtualDiskFlagVhdSetFileOnly VirtualDiskFlag = 0x40
|
||||||
|
OpenVirtualDiskFlagIgnoreRelativeParentLocator VirtualDiskFlag = 0x80
|
||||||
|
OpenVirtualDiskFlagNoWriteHardening VirtualDiskFlag = 0x100
|
||||||
|
)
|
||||||
|
|
||||||
|
type createVersion2 struct {
|
||||||
|
UniqueID [16]byte // GUID
|
||||||
|
MaximumSize uint64
|
||||||
|
BlockSizeInBytes uint32
|
||||||
|
SectorSizeInBytes uint32
|
||||||
|
ParentPath *uint16 // string
|
||||||
|
SourcePath *uint16 // string
|
||||||
|
OpenFlags uint32
|
||||||
|
ParentVirtualStorageType virtualStorageType
|
||||||
|
SourceVirtualStorageType virtualStorageType
|
||||||
|
ResiliencyGUID [16]byte // GUID
|
||||||
|
}
|
||||||
|
|
||||||
|
type createVirtualDiskParameters struct {
|
||||||
|
Version uint32 // Must always be set to 2
|
||||||
|
Version2 createVersion2
|
||||||
|
}
|
||||||
|
|
||||||
|
type openVersion2 struct {
|
||||||
|
GetInfoOnly int32 // bool but 4-byte aligned
|
||||||
|
ReadOnly int32 // bool but 4-byte aligned
|
||||||
|
ResiliencyGUID [16]byte // GUID
|
||||||
|
}
|
||||||
|
|
||||||
|
type openVirtualDiskParameters struct {
|
||||||
|
Version uint32 // Must always be set to 2
|
||||||
|
Version2 openVersion2
|
||||||
|
}
|
||||||
|
|
||||||
|
// CreateVhdx will create a simple vhdx file at the given path using default values.
|
||||||
|
func CreateVhdx(path string, maxSizeInGb, blockSizeInMb uint32) error {
|
||||||
|
var (
|
||||||
|
defaultType virtualStorageType
|
||||||
|
handle syscall.Handle
|
||||||
|
)
|
||||||
|
|
||||||
|
parameters := createVirtualDiskParameters{
|
||||||
|
Version: 2,
|
||||||
|
Version2: createVersion2{
|
||||||
|
MaximumSize: uint64(maxSizeInGb) * 1024 * 1024 * 1024,
|
||||||
|
BlockSizeInBytes: blockSizeInMb * 1024 * 1024,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := createVirtualDisk(
|
||||||
|
&defaultType,
|
||||||
|
path,
|
||||||
|
uint32(VirtualDiskAccessNone),
|
||||||
|
nil,
|
||||||
|
uint32(createVirtualDiskFlagNone),
|
||||||
|
0,
|
||||||
|
¶meters,
|
||||||
|
nil,
|
||||||
|
&handle); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := syscall.CloseHandle(handle); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// DetachVhd detaches a mounted container layer vhd found at `path`.
|
||||||
|
func DetachVhd(path string) error {
|
||||||
|
handle, err := OpenVirtualDisk(
|
||||||
|
path,
|
||||||
|
VirtualDiskAccessNone,
|
||||||
|
OpenVirtualDiskFlagCachedIO|OpenVirtualDiskFlagIgnoreRelativeParentLocator)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
defer syscall.CloseHandle(handle)
|
||||||
|
return detachVirtualDisk(handle, 0, 0)
|
||||||
|
}
|
||||||
|
|
||||||
|
// OpenVirtualDisk obtains a handle to a VHD opened with supplied access mask and flags.
|
||||||
|
func OpenVirtualDisk(path string, accessMask VirtualDiskAccessMask, flag VirtualDiskFlag) (syscall.Handle, error) {
|
||||||
|
var (
|
||||||
|
defaultType virtualStorageType
|
||||||
|
handle syscall.Handle
|
||||||
|
)
|
||||||
|
parameters := openVirtualDiskParameters{Version: 2}
|
||||||
|
if err := openVirtualDisk(
|
||||||
|
&defaultType,
|
||||||
|
path,
|
||||||
|
uint32(accessMask),
|
||||||
|
uint32(flag),
|
||||||
|
¶meters,
|
||||||
|
&handle); err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
return handle, nil
|
||||||
|
}
|
99
vendor/github.com/Microsoft/go-winio/vhd/zvhd.go
generated
vendored
Normal file
99
vendor/github.com/Microsoft/go-winio/vhd/zvhd.go
generated
vendored
Normal file
@@ -0,0 +1,99 @@
|
|||||||
|
// MACHINE GENERATED BY 'go generate' COMMAND; DO NOT EDIT
|
||||||
|
|
||||||
|
package vhd
|
||||||
|
|
||||||
|
import (
|
||||||
|
"syscall"
|
||||||
|
"unsafe"
|
||||||
|
|
||||||
|
"golang.org/x/sys/windows"
|
||||||
|
)
|
||||||
|
|
||||||
|
var _ unsafe.Pointer
|
||||||
|
|
||||||
|
// Do the interface allocations only once for common
|
||||||
|
// Errno values.
|
||||||
|
const (
|
||||||
|
errnoERROR_IO_PENDING = 997
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
errERROR_IO_PENDING error = syscall.Errno(errnoERROR_IO_PENDING)
|
||||||
|
)
|
||||||
|
|
||||||
|
// errnoErr returns common boxed Errno values, to prevent
|
||||||
|
// allocations at runtime.
|
||||||
|
func errnoErr(e syscall.Errno) error {
|
||||||
|
switch e {
|
||||||
|
case 0:
|
||||||
|
return nil
|
||||||
|
case errnoERROR_IO_PENDING:
|
||||||
|
return errERROR_IO_PENDING
|
||||||
|
}
|
||||||
|
// TODO: add more here, after collecting data on the common
|
||||||
|
// error values see on Windows. (perhaps when running
|
||||||
|
// all.bat?)
|
||||||
|
return e
|
||||||
|
}
|
||||||
|
|
||||||
|
var (
|
||||||
|
modVirtDisk = windows.NewLazySystemDLL("VirtDisk.dll")
|
||||||
|
|
||||||
|
procCreateVirtualDisk = modVirtDisk.NewProc("CreateVirtualDisk")
|
||||||
|
procOpenVirtualDisk = modVirtDisk.NewProc("OpenVirtualDisk")
|
||||||
|
procDetachVirtualDisk = modVirtDisk.NewProc("DetachVirtualDisk")
|
||||||
|
)
|
||||||
|
|
||||||
|
func createVirtualDisk(virtualStorageType *virtualStorageType, path string, virtualDiskAccessMask uint32, securityDescriptor *uintptr, flags uint32, providerSpecificFlags uint32, parameters *createVirtualDiskParameters, o *syscall.Overlapped, handle *syscall.Handle) (err error) {
|
||||||
|
var _p0 *uint16
|
||||||
|
_p0, err = syscall.UTF16PtrFromString(path)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
return _createVirtualDisk(virtualStorageType, _p0, virtualDiskAccessMask, securityDescriptor, flags, providerSpecificFlags, parameters, o, handle)
|
||||||
|
}
|
||||||
|
|
||||||
|
func _createVirtualDisk(virtualStorageType *virtualStorageType, path *uint16, virtualDiskAccessMask uint32, securityDescriptor *uintptr, flags uint32, providerSpecificFlags uint32, parameters *createVirtualDiskParameters, o *syscall.Overlapped, handle *syscall.Handle) (err error) {
|
||||||
|
r1, _, e1 := syscall.Syscall9(procCreateVirtualDisk.Addr(), 9, uintptr(unsafe.Pointer(virtualStorageType)), uintptr(unsafe.Pointer(path)), uintptr(virtualDiskAccessMask), uintptr(unsafe.Pointer(securityDescriptor)), uintptr(flags), uintptr(providerSpecificFlags), uintptr(unsafe.Pointer(parameters)), uintptr(unsafe.Pointer(o)), uintptr(unsafe.Pointer(handle)))
|
||||||
|
if r1 != 0 {
|
||||||
|
if e1 != 0 {
|
||||||
|
err = errnoErr(e1)
|
||||||
|
} else {
|
||||||
|
err = syscall.EINVAL
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func openVirtualDisk(virtualStorageType *virtualStorageType, path string, virtualDiskAccessMask uint32, flags uint32, parameters *openVirtualDiskParameters, handle *syscall.Handle) (err error) {
|
||||||
|
var _p0 *uint16
|
||||||
|
_p0, err = syscall.UTF16PtrFromString(path)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
return _openVirtualDisk(virtualStorageType, _p0, virtualDiskAccessMask, flags, parameters, handle)
|
||||||
|
}
|
||||||
|
|
||||||
|
func _openVirtualDisk(virtualStorageType *virtualStorageType, path *uint16, virtualDiskAccessMask uint32, flags uint32, parameters *openVirtualDiskParameters, handle *syscall.Handle) (err error) {
|
||||||
|
r1, _, e1 := syscall.Syscall6(procOpenVirtualDisk.Addr(), 6, uintptr(unsafe.Pointer(virtualStorageType)), uintptr(unsafe.Pointer(path)), uintptr(virtualDiskAccessMask), uintptr(flags), uintptr(unsafe.Pointer(parameters)), uintptr(unsafe.Pointer(handle)))
|
||||||
|
if r1 != 0 {
|
||||||
|
if e1 != 0 {
|
||||||
|
err = errnoErr(e1)
|
||||||
|
} else {
|
||||||
|
err = syscall.EINVAL
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func detachVirtualDisk(handle syscall.Handle, flags uint32, providerSpecificFlags uint32) (err error) {
|
||||||
|
r1, _, e1 := syscall.Syscall(procDetachVirtualDisk.Addr(), 3, uintptr(handle), uintptr(flags), uintptr(providerSpecificFlags))
|
||||||
|
if r1 != 0 {
|
||||||
|
if e1 != 0 {
|
||||||
|
err = errnoErr(e1)
|
||||||
|
} else {
|
||||||
|
err = syscall.EINVAL
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
3
vendor/github.com/Microsoft/hcsshim/CODEOWNERS
generated
vendored
Normal file
3
vendor/github.com/Microsoft/hcsshim/CODEOWNERS
generated
vendored
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
* @microsoft/containerplat
|
||||||
|
|
||||||
|
/hcn/* @nagiesek
|
7
vendor/github.com/Microsoft/hcsshim/README.md
generated
vendored
7
vendor/github.com/Microsoft/hcsshim/README.md
generated
vendored
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
[](https://ci.appveyor.com/project/WindowsVirtualization/hcsshim/branch/master)
|
[](https://ci.appveyor.com/project/WindowsVirtualization/hcsshim/branch/master)
|
||||||
|
|
||||||
This package contains the Golang interface for using the Windows [Host Compute Service](https://blogs.technet.microsoft.com/virtualization/2017/01/27/introducing-the-host-compute-service-hcs/) (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).
|
||||||
|
|
||||||
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 Project](https://github.com/moby/moby), but it can be freely used by other projects as well.
|
||||||
|
|
||||||
@@ -16,6 +16,11 @@ 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.
|
||||||
|
|
||||||
|
|
||||||
|
## Code of Conduct
|
||||||
|
|
||||||
This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/).
|
This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/).
|
||||||
For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or
|
For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or
|
||||||
contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments.
|
contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments.
|
||||||
|
22
vendor/github.com/Microsoft/hcsshim/appveyor.yml
generated
vendored
22
vendor/github.com/Microsoft/hcsshim/appveyor.yml
generated
vendored
@@ -6,7 +6,7 @@ clone_folder: c:\gopath\src\github.com\Microsoft\hcsshim
|
|||||||
|
|
||||||
environment:
|
environment:
|
||||||
GOPATH: c:\gopath
|
GOPATH: c:\gopath
|
||||||
PATH: C:\mingw-w64\x86_64-7.2.0-posix-seh-rt_v5-rev1\mingw64\bin;%GOPATH%\bin;C:\gometalinter-2.0.12-windows-amd64;%PATH%
|
PATH: "%GOPATH%\\bin;C:\\gometalinter-2.0.12-windows-amd64;%PATH%"
|
||||||
|
|
||||||
stack: go 1.13.4
|
stack: go 1.13.4
|
||||||
|
|
||||||
@@ -18,24 +18,28 @@ build_script:
|
|||||||
- go build ./cmd/runhcs
|
- go build ./cmd/runhcs
|
||||||
- go build ./cmd/tar2ext4
|
- go build ./cmd/tar2ext4
|
||||||
- go build ./cmd/wclayer
|
- go build ./cmd/wclayer
|
||||||
|
- go build ./cmd/device-util
|
||||||
- go build ./internal/tools/grantvmgroupaccess
|
- go build ./internal/tools/grantvmgroupaccess
|
||||||
- go build ./internal/tools/uvmboot
|
- go build ./internal/tools/uvmboot
|
||||||
- go build ./internal/tools/zapdir
|
- go build ./internal/tools/zapdir
|
||||||
- go test -v ./... -tags admin
|
- go test -v ./... -tags admin
|
||||||
- go test -c ./test/containerd-shim-runhcs-v1/ -tags functional
|
- cd test
|
||||||
- go test -c ./test/cri-containerd/ -tags functional
|
- go test -v ./internal -tags admin
|
||||||
- go test -c ./test/functional/ -tags functional
|
- go test -c ./containerd-shim-runhcs-v1/ -tags functional
|
||||||
- go test -c ./test/runhcs/ -tags functional
|
- go test -c ./cri-containerd/ -tags functional
|
||||||
|
- go test -c ./functional/ -tags functional
|
||||||
|
- go test -c ./runhcs/ -tags functional
|
||||||
|
|
||||||
artifacts:
|
artifacts:
|
||||||
- path: 'containerd-shim-runhcs-v1.exe'
|
- path: 'containerd-shim-runhcs-v1.exe'
|
||||||
- path: 'runhcs.exe'
|
- path: 'runhcs.exe'
|
||||||
- path: 'tar2ext4.exe'
|
- path: 'tar2ext4.exe'
|
||||||
|
- path: 'device-util.exe'
|
||||||
- path: 'wclayer.exe'
|
- path: 'wclayer.exe'
|
||||||
- path: 'grantvmgroupaccess.exe'
|
- path: 'grantvmgroupaccess.exe'
|
||||||
- path: 'uvmboot.exe'
|
- path: 'uvmboot.exe'
|
||||||
- path: 'zapdir.exe'
|
- path: 'zapdir.exe'
|
||||||
- path: 'containerd-shim-runhcs-v1.test.exe'
|
- path: './test/containerd-shim-runhcs-v1.test.exe'
|
||||||
- path: 'cri-containerd.test.exe'
|
- path: './test/cri-containerd.test.exe'
|
||||||
- path: 'functional.test.exe'
|
- path: './test/functional.test.exe'
|
||||||
- path: 'runhcs.test.exe'
|
- path: './test/runhcs.test.exe'
|
||||||
|
40
vendor/github.com/Microsoft/hcsshim/go.mod
generated
vendored
40
vendor/github.com/Microsoft/hcsshim/go.mod
generated
vendored
@@ -3,35 +3,33 @@ module github.com/Microsoft/hcsshim
|
|||||||
go 1.13
|
go 1.13
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5
|
github.com/Microsoft/go-winio v0.4.15-0.20200908182639-5b44b70ab3ab
|
||||||
github.com/blang/semver v3.1.0+incompatible // indirect
|
github.com/containerd/cgroups v0.0.0-20200531161412-0dbf7f05ba59
|
||||||
github.com/containerd/cgroups v0.0.0-20190919134610-bf292b21730f
|
|
||||||
github.com/containerd/console v0.0.0-20180822173158-c12b1e7919c1
|
github.com/containerd/console v0.0.0-20180822173158-c12b1e7919c1
|
||||||
github.com/containerd/containerd v1.3.0-beta.2.0.20190828155532-0293cbd26c69
|
github.com/containerd/containerd v1.3.2
|
||||||
github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc // indirect
|
github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc // indirect
|
||||||
github.com/containerd/fifo v0.0.0-20190226154929-a9fb20d87448 // indirect
|
github.com/containerd/fifo v0.0.0-20190226154929-a9fb20d87448 // indirect
|
||||||
github.com/containerd/go-runc v0.0.0-20180907222934-5a6d9f37cfa3
|
github.com/containerd/go-runc v0.0.0-20180907222934-5a6d9f37cfa3
|
||||||
github.com/containerd/ttrpc v0.0.0-20190828154514-0e0f228740de
|
github.com/containerd/ttrpc v0.0.0-20190828154514-0e0f228740de
|
||||||
github.com/containerd/typeurl v0.0.0-20180627222232-a93fcdb778cd
|
github.com/containerd/typeurl v0.0.0-20180627222232-a93fcdb778cd
|
||||||
github.com/gogo/protobuf v1.2.1
|
github.com/gogo/protobuf v1.3.1
|
||||||
github.com/hashicorp/errwrap v0.0.0-20141028054710-7554cd9344ce // indirect
|
github.com/golang/protobuf v1.3.2 // indirect
|
||||||
github.com/hashicorp/go-multierror v0.0.0-20161216184304-ed905158d874 // indirect
|
github.com/kr/pretty v0.1.0 // indirect
|
||||||
github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2 // indirect
|
github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2 // indirect
|
||||||
github.com/opencontainers/runc v0.0.0-20190115041553-12f6a991201f // indirect
|
github.com/opencontainers/runc v0.0.0-20190115041553-12f6a991201f // indirect
|
||||||
github.com/opencontainers/runtime-spec v0.1.2-0.20190507144316-5b71a03e2700
|
github.com/opencontainers/runtime-spec v1.0.2
|
||||||
github.com/opencontainers/runtime-tools v0.0.0-20181011054405-1d69bd0f9c39
|
github.com/pkg/errors v0.9.1
|
||||||
github.com/pkg/errors v0.8.1
|
github.com/prometheus/procfs v0.0.0-20180125133057-cb4147076ac7 // indirect
|
||||||
github.com/prometheus/procfs v0.0.5 // indirect
|
github.com/sirupsen/logrus v1.4.2
|
||||||
github.com/sirupsen/logrus v1.4.1
|
github.com/stretchr/testify v1.4.0 // indirect
|
||||||
github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8 // indirect
|
github.com/urfave/cli v1.22.2
|
||||||
github.com/urfave/cli v0.0.0-20171014202726-7bc6a0acffa5
|
|
||||||
github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f // indirect
|
|
||||||
github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect
|
|
||||||
github.com/xeipuuv/gojsonschema v0.0.0-20180618132009-1d523034197f // indirect
|
|
||||||
go.opencensus.io v0.22.0
|
go.opencensus.io v0.22.0
|
||||||
golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6
|
golang.org/x/net v0.0.0-20191004110552-13f9640d40b9 // indirect
|
||||||
golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3
|
golang.org/x/sync v0.0.0-20190423024810-112230192c58
|
||||||
google.golang.org/grpc v1.20.1
|
golang.org/x/sys v0.0.0-20200120151820-655fe14d7479
|
||||||
|
google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873 // indirect
|
||||||
|
google.golang.org/grpc v1.23.1
|
||||||
|
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 // indirect
|
||||||
|
gopkg.in/yaml.v2 v2.2.8 // indirect
|
||||||
gotest.tools v2.2.0+incompatible // indirect
|
gotest.tools v2.2.0+incompatible // indirect
|
||||||
k8s.io/kubernetes v1.13.0
|
|
||||||
)
|
)
|
||||||
|
106
vendor/github.com/Microsoft/hcsshim/go.sum
generated
vendored
106
vendor/github.com/Microsoft/hcsshim/go.sum
generated
vendored
@@ -1,16 +1,16 @@
|
|||||||
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
|
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
|
||||||
|
github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ=
|
||||||
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
|
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
|
||||||
github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5 h1:ygIc8M6trr62pF5DucadTWGdEB4mEyvzi0e2nbcmcyA=
|
github.com/Microsoft/go-winio v0.4.15-0.20200908182639-5b44b70ab3ab h1:9pygWVFqbY9lPxM0peffumuVDyMuIMzNLyO9uFjJuQo=
|
||||||
github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw=
|
github.com/Microsoft/go-winio v0.4.15-0.20200908182639-5b44b70ab3ab/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw=
|
||||||
github.com/blang/semver v3.1.0+incompatible h1:7hqmJYuaEK3qwVjWubYiht3j93YI0WQBuysxHIfUriU=
|
github.com/cilium/ebpf v0.0.0-20200110133405-4032b1d8aae3/go.mod h1:MA5e5Lr8slmEg9bt0VpxxWqJlO4iwu3FBdHUzV7wQVg=
|
||||||
github.com/blang/semver v3.1.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk=
|
|
||||||
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
|
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
|
||||||
github.com/containerd/cgroups v0.0.0-20190919134610-bf292b21730f h1:tSNMc+rJDfmYntojat8lljbt1mgKNpTxUZJsSzJ9Y1s=
|
github.com/containerd/cgroups v0.0.0-20200531161412-0dbf7f05ba59 h1:qWj4qVYZ95vLWwqyNJCQg7rDsG5wPdze0UaPolH7DUk=
|
||||||
github.com/containerd/cgroups v0.0.0-20190919134610-bf292b21730f/go.mod h1:OApqhQ4XNSNC13gXIwDjhOQxjWa/NxkwZXJ1EvqT0ko=
|
github.com/containerd/cgroups v0.0.0-20200531161412-0dbf7f05ba59/go.mod h1:pA0z1pT8KYB3TCXK/ocprsh7MAkoW8bZVzPdih9snmM=
|
||||||
github.com/containerd/console v0.0.0-20180822173158-c12b1e7919c1 h1:uict5mhHFTzKLUCufdSLym7z/J0CbBJT59lYbP9wtbg=
|
github.com/containerd/console v0.0.0-20180822173158-c12b1e7919c1 h1:uict5mhHFTzKLUCufdSLym7z/J0CbBJT59lYbP9wtbg=
|
||||||
github.com/containerd/console v0.0.0-20180822173158-c12b1e7919c1/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw=
|
github.com/containerd/console v0.0.0-20180822173158-c12b1e7919c1/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw=
|
||||||
github.com/containerd/containerd v1.3.0-beta.2.0.20190828155532-0293cbd26c69 h1:rG1clvJbgsUcmb50J82YUJhUMopWNtZvyMZjb+4fqGw=
|
github.com/containerd/containerd v1.3.2 h1:ForxmXkA6tPIvffbrDAcPUIB32QgXkt2XFj+F0UxetA=
|
||||||
github.com/containerd/containerd v1.3.0-beta.2.0.20190828155532-0293cbd26c69/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA=
|
github.com/containerd/containerd v1.3.2/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA=
|
||||||
github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc h1:TP+534wVlf61smEIq1nwLLAjQVEK2EADoW3CX9AuT+8=
|
github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc h1:TP+534wVlf61smEIq1nwLLAjQVEK2EADoW3CX9AuT+8=
|
||||||
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/fifo v0.0.0-20190226154929-a9fb20d87448 h1:PUD50EuOMkXVcpBIA/R95d56duJR9VxhwncsFbNnxW4=
|
github.com/containerd/fifo v0.0.0-20190226154929-a9fb20d87448 h1:PUD50EuOMkXVcpBIA/R95d56duJR9VxhwncsFbNnxW4=
|
||||||
@@ -21,16 +21,18 @@ github.com/containerd/ttrpc v0.0.0-20190828154514-0e0f228740de h1:dlfGmNcE3jDAec
|
|||||||
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/typeurl v0.0.0-20180627222232-a93fcdb778cd h1:JNn81o/xG+8NEo3bC/vx9pbi/g2WI8mtP2/nXzu297Y=
|
github.com/containerd/typeurl v0.0.0-20180627222232-a93fcdb778cd h1:JNn81o/xG+8NEo3bC/vx9pbi/g2WI8mtP2/nXzu297Y=
|
||||||
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/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e h1:Wf6HqHfScWJN9/ZjdUKyjop4mf3Qdd+1TvvltAvM3m8=
|
github.com/coreos/go-systemd/v22 v22.0.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk=
|
||||||
github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
|
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 h1:EoUDS0afbrsXAZ9YQ9jdu/mZ2sXgT1/2yyNng4PGlyM=
|
||||||
|
github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
|
||||||
|
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw=
|
github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw=
|
||||||
github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
|
github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
|
||||||
github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e h1:BWhy2j3IXJhjCbC68FptL43tDKIq8FladmaTs3Xs7Z8=
|
github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
|
||||||
github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4=
|
github.com/gogo/protobuf v1.3.1 h1:DqDEcV5aeaTmdFBePNpYsp3FlcVH/2ISVVM9Qf8PSls=
|
||||||
github.com/gogo/protobuf v1.2.1 h1:/s5zKNz0uPFCZ5hddgPdo2TK2TVrUNMn0OOX8/aZMTE=
|
github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o=
|
||||||
github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4=
|
|
||||||
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58=
|
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58=
|
||||||
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
|
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
|
||||||
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
|
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
|
||||||
@@ -38,47 +40,54 @@ github.com/golang/protobuf v1.2.0 h1:P3YflyNX/ehuJFLhxviNdFxQPkGK5cDcApsge1SqnvM
|
|||||||
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||||
github.com/golang/protobuf v1.3.1 h1:YF8+flBXS5eO826T4nzqPrxfhQThhXl0YzfuUPu4SBg=
|
github.com/golang/protobuf v1.3.1 h1:YF8+flBXS5eO826T4nzqPrxfhQThhXl0YzfuUPu4SBg=
|
||||||
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 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs=
|
||||||
|
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||||
|
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
|
||||||
github.com/google/go-cmp v0.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY=
|
github.com/google/go-cmp v0.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY=
|
||||||
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
||||||
github.com/hashicorp/errwrap v0.0.0-20141028054710-7554cd9344ce h1:prjrVgOk2Yg6w+PflHoszQNLTUh4kaByUcEWM/9uin4=
|
|
||||||
github.com/hashicorp/errwrap v0.0.0-20141028054710-7554cd9344ce/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
|
|
||||||
github.com/hashicorp/go-multierror v0.0.0-20161216184304-ed905158d874 h1:cAv7ZbSmyb1wjn6T4TIiyFCkpcfgpbcNNC3bM2srLaI=
|
|
||||||
github.com/hashicorp/go-multierror v0.0.0-20161216184304-ed905158d874/go.mod h1:JMRHfdO9jKNzS/+BTlxCjKNQHg/jZAft8U7LloJvN7I=
|
|
||||||
github.com/hashicorp/golang-lru v0.5.1 h1:0hERBMJE1eitiLkihrMvRVBYAkpHzc/J3QdDN+dAcgU=
|
github.com/hashicorp/golang-lru v0.5.1 h1:0hERBMJE1eitiLkihrMvRVBYAkpHzc/J3QdDN+dAcgU=
|
||||||
github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
|
github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
|
||||||
github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q=
|
github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00=
|
||||||
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
|
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
|
||||||
github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk=
|
github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk=
|
||||||
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
||||||
|
github.com/konsorten/go-windows-terminal-sequences v1.0.2 h1:DB17ag19krx9CFsz4o3enTrPXyIXCl+2iCXH/aMAp9s=
|
||||||
|
github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
||||||
|
github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
|
||||||
|
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
|
||||||
|
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
||||||
|
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
|
||||||
|
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
||||||
github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2 h1:QhPf3A2AZW3tTGvHPg0TA+CR3oHbVLlXUhlghqISp1I=
|
github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2 h1:QhPf3A2AZW3tTGvHPg0TA+CR3oHbVLlXUhlghqISp1I=
|
||||||
github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s=
|
github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s=
|
||||||
github.com/opencontainers/runc v0.0.0-20190115041553-12f6a991201f h1:a969LJ4IQFwRHYqonHtUDMSh9i54WcKggeEkQ3fZMl4=
|
github.com/opencontainers/runc v0.0.0-20190115041553-12f6a991201f h1:a969LJ4IQFwRHYqonHtUDMSh9i54WcKggeEkQ3fZMl4=
|
||||||
github.com/opencontainers/runc v0.0.0-20190115041553-12f6a991201f/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U=
|
github.com/opencontainers/runc v0.0.0-20190115041553-12f6a991201f/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U=
|
||||||
github.com/opencontainers/runtime-spec v0.1.2-0.20190507144316-5b71a03e2700 h1:eNUVfm/RFLIi1G7flU5/ZRTHvd4kcVuzfRnL6OFlzCI=
|
github.com/opencontainers/runtime-spec v1.0.2 h1:UfAcuLBJB9Coz72x1hgl8O5RVzTdNiaglX6v2DM6FI0=
|
||||||
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.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=
|
||||||
github.com/opencontainers/runtime-tools v0.0.0-20181011054405-1d69bd0f9c39 h1:H7DMc6FAjgwZZi8BRqjrAAHWoqEr5e5L6pS4V0ezet4=
|
|
||||||
github.com/opencontainers/runtime-tools v0.0.0-20181011054405-1d69bd0f9c39/go.mod h1:r3f7wjNzSs2extwzU3Y+6pKfobzPh+kKFJ3ofN+3nfs=
|
|
||||||
github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=
|
github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=
|
||||||
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||||
|
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
|
||||||
|
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||||
github.com/prometheus/procfs v0.0.5 h1:3+auTFlqw+ZaQYJARz6ArODtkaIwtvBTx3N2NehQlL8=
|
github.com/prometheus/procfs v0.0.0-20180125133057-cb4147076ac7 h1:hhvfGDVThBnd4kYisSFmYuHYeUhglxcwag7FhVPH9zM=
|
||||||
github.com/prometheus/procfs v0.0.5/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ=
|
github.com/prometheus/procfs v0.0.0-20180125133057-cb4147076ac7/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
|
||||||
|
github.com/russross/blackfriday/v2 v2.0.1 h1:lPqVAte+HuHNfhJ/0LC98ESWRz8afy9tM/0RK8m9o+Q=
|
||||||
|
github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
|
||||||
|
github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo=
|
||||||
|
github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
|
||||||
github.com/sirupsen/logrus v1.4.1 h1:GL2rEmy6nsikmW0r8opw9JIRScdMF5hA8cOYLH7In1k=
|
github.com/sirupsen/logrus v1.4.1 h1:GL2rEmy6nsikmW0r8opw9JIRScdMF5hA8cOYLH7In1k=
|
||||||
github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=
|
github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=
|
||||||
|
github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4=
|
||||||
|
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
|
||||||
|
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||||
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||||
github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w=
|
github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w=
|
||||||
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
|
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
|
||||||
github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8 h1:zLV6q4e8Jv9EHjNg/iHfzwDkCve6Ua5jCygptrtXHvI=
|
github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk=
|
||||||
github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww=
|
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
|
||||||
github.com/urfave/cli v0.0.0-20171014202726-7bc6a0acffa5 h1:MCfT24H3f//U5+UCrZp1/riVO3B50BovxtDiNn0XKkk=
|
github.com/urfave/cli v1.22.2 h1:gsqYFH8bb9ekPA12kRo0hfjngWQjkJPlN9R0N78BoUo=
|
||||||
github.com/urfave/cli v0.0.0-20171014202726-7bc6a0acffa5/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA=
|
github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=
|
||||||
github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f h1:J9EGpcZtP0E/raorCMxlFGSTBrsSlaDGf3jU/qvAE2c=
|
|
||||||
github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU=
|
|
||||||
github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0=
|
|
||||||
github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ=
|
|
||||||
github.com/xeipuuv/gojsonschema v0.0.0-20180618132009-1d523034197f h1:mvXjJIHRZyhNuGassLTcXTwjiWq7NmjdavZsUnmFybQ=
|
|
||||||
github.com/xeipuuv/gojsonschema v0.0.0-20180618132009-1d523034197f/go.mod h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs=
|
|
||||||
go.opencensus.io v0.22.0 h1:C9hSCOW830chIVkdja34wa6Ky+IzWllkUinR+BtRZd4=
|
go.opencensus.io v0.22.0 h1:C9hSCOW830chIVkdja34wa6Ky+IzWllkUinR+BtRZd4=
|
||||||
go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
|
go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
|
||||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||||
@@ -93,39 +102,56 @@ golang.org/x/net v0.0.0-20190311183353-d8887717615a h1:oWX7TPOiFAMXLq8o0ikBYfCJV
|
|||||||
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||||
golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09 h1:KaQtG+aDELoNmXYas3TVkGNYRuq8JQ1aa7LJt8EXVyo=
|
golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09 h1:KaQtG+aDELoNmXYas3TVkGNYRuq8JQ1aa7LJt8EXVyo=
|
||||||
golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||||
|
golang.org/x/net v0.0.0-20191004110552-13f9640d40b9 h1:rjwSpXsdiK0dV8/Naq3kAw9ymfAeJIyd0upUIElB+lI=
|
||||||
|
golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
||||||
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
|
||||||
golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6 h1:bjcUS9ztw9kFmmIxJInhon/0Is3p+EHBKNgquIzo1OI=
|
golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6 h1:bjcUS9ztw9kFmmIxJInhon/0Is3p+EHBKNgquIzo1OI=
|
||||||
golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
|
golang.org/x/sync v0.0.0-20190423024810-112230192c58 h1:8gQV6CLnAEikrhgkHFbMAEhagSSnXWGV915qUMm9mrU=
|
||||||
|
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
|
golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20190514135907-3a4b5fb9f71f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3 h1:7TYNF4UdlohbFwpNH04CoPMp1cHUZgO1Ebq5r2hIjfo=
|
golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3 h1:7TYNF4UdlohbFwpNH04CoPMp1cHUZgO1Ebq5r2hIjfo=
|
||||||
golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20191022100944-742c48ecaeb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20200120151820-655fe14d7479 h1:LhLiKguPgZL+Tglay4GhVtfF0kb8cvOJ0dHTCBO8YNI=
|
||||||
|
golang.org/x/sys v0.0.0-20200120151820-655fe14d7479/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=
|
golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=
|
||||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs=
|
golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs=
|
||||||
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
|
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
|
||||||
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-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=
|
||||||
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
||||||
|
golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
|
||||||
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/genproto v0.0.0-20180817151627-c66870c02cf8 h1:Nw54tB0rB7hY/N0NQvRW8DG4Yk3Q6T9cu9RcFQDu1tc=
|
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8 h1:Nw54tB0rB7hY/N0NQvRW8DG4Yk3Q6T9cu9RcFQDu1tc=
|
||||||
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-20190425155659-357c62f0e4bb h1:i1Ppqkc3WQXikh8bXiwHqAN5Rv3/qDCcRk0/Otx73BY=
|
google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb h1:i1Ppqkc3WQXikh8bXiwHqAN5Rv3/qDCcRk0/Otx73BY=
|
||||||
google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
|
google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
|
||||||
|
google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873 h1:nfPFGzJkUDX6uBmpN/pSw7MbOAWegH5QDQuoXFHedLg=
|
||||||
|
google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
|
||||||
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
|
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
|
||||||
google.golang.org/grpc v1.20.1 h1:Hz2g2wirWK7H0qIIhGIqRGTuMwTE8HEKFnDZZ7lm9NU=
|
google.golang.org/grpc v1.20.1 h1:Hz2g2wirWK7H0qIIhGIqRGTuMwTE8HEKFnDZZ7lm9NU=
|
||||||
google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
|
google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
|
||||||
|
google.golang.org/grpc v1.23.1 h1:q4XQuHFC6I28BKZpo6IYyb3mNO+l7lSOxRuYTCiDfXk=
|
||||||
|
google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
|
||||||
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
|
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
|
||||||
|
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
|
gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw=
|
||||||
|
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||||
|
gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10=
|
||||||
|
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||||
gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo=
|
gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo=
|
||||||
gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw=
|
gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw=
|
||||||
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
||||||
k8s.io/kubernetes v1.13.0 h1:qTfB+u5M92k2fCCCVP2iuhgwwSOv1EkAkvQY1tQODD8=
|
honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
||||||
k8s.io/kubernetes v1.13.0/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk=
|
|
||||||
|
3
vendor/github.com/Microsoft/hcsshim/hnspolicy.go
generated
vendored
3
vendor/github.com/Microsoft/hcsshim/hnspolicy.go
generated
vendored
@@ -21,8 +21,11 @@ const (
|
|||||||
OutboundNat = hns.OutboundNat
|
OutboundNat = hns.OutboundNat
|
||||||
ExternalLoadBalancer = hns.ExternalLoadBalancer
|
ExternalLoadBalancer = hns.ExternalLoadBalancer
|
||||||
Route = hns.Route
|
Route = hns.Route
|
||||||
|
Proxy = hns.Proxy
|
||||||
)
|
)
|
||||||
|
|
||||||
|
type ProxyPolicy = hns.ProxyPolicy
|
||||||
|
|
||||||
type NatPolicy = hns.NatPolicy
|
type NatPolicy = hns.NatPolicy
|
||||||
|
|
||||||
type QosPolicy = hns.QosPolicy
|
type QosPolicy = hns.QosPolicy
|
||||||
|
7
vendor/github.com/Microsoft/hcsshim/internal/hcs/cgo.go
generated
vendored
7
vendor/github.com/Microsoft/hcsshim/internal/hcs/cgo.go
generated
vendored
@@ -1,7 +0,0 @@
|
|||||||
package hcs
|
|
||||||
|
|
||||||
import "C"
|
|
||||||
|
|
||||||
// This import is needed to make the library compile as CGO because HCSSHIM
|
|
||||||
// only works with CGO due to callbacks from HCS comming back from a C thread
|
|
||||||
// which is not supported without CGO. See https://github.com/golang/go/issues/10973
|
|
49
vendor/github.com/Microsoft/hcsshim/internal/hcs/service.go
generated
vendored
Normal file
49
vendor/github.com/Microsoft/hcsshim/internal/hcs/service.go
generated
vendored
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
package hcs
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"encoding/json"
|
||||||
|
|
||||||
|
hcsschema "github.com/Microsoft/hcsshim/internal/schema2"
|
||||||
|
"github.com/Microsoft/hcsshim/internal/vmcompute"
|
||||||
|
)
|
||||||
|
|
||||||
|
// GetServiceProperties returns properties of the host compute service.
|
||||||
|
func GetServiceProperties(ctx context.Context, q hcsschema.PropertyQuery) (*hcsschema.ServiceProperties, error) {
|
||||||
|
operation := "hcsshim::GetServiceProperties"
|
||||||
|
|
||||||
|
queryb, err := json.Marshal(q)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
propertiesJSON, resultJSON, err := vmcompute.HcsGetServiceProperties(ctx, string(queryb))
|
||||||
|
events := processHcsResult(ctx, resultJSON)
|
||||||
|
if err != nil {
|
||||||
|
return nil, &HcsError{Op: operation, Err: err, Events: events}
|
||||||
|
}
|
||||||
|
|
||||||
|
if propertiesJSON == "" {
|
||||||
|
return nil, ErrUnexpectedValue
|
||||||
|
}
|
||||||
|
properties := &hcsschema.ServiceProperties{}
|
||||||
|
if err := json.Unmarshal([]byte(propertiesJSON), properties); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return properties, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// ModifyServiceSettings modifies settings of the host compute service.
|
||||||
|
func ModifyServiceSettings(ctx context.Context, settings hcsschema.ModificationRequest) error {
|
||||||
|
operation := "hcsshim::ModifyServiceSettings"
|
||||||
|
|
||||||
|
settingsJSON, err := json.Marshal(settings)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
resultJSON, err := vmcompute.HcsModifyServiceSettings(ctx, string(settingsJSON))
|
||||||
|
events := processHcsResult(ctx, resultJSON)
|
||||||
|
if err != nil {
|
||||||
|
return &HcsError{Op: operation, Err: err, Events: events}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
5
vendor/github.com/Microsoft/hcsshim/internal/hcs/syscall.go
generated
vendored
Normal file
5
vendor/github.com/Microsoft/hcsshim/internal/hcs/syscall.go
generated
vendored
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
package hcs
|
||||||
|
|
||||||
|
//go:generate go run ../../mksyscall_windows.go -output zsyscall_windows.go syscall.go
|
||||||
|
|
||||||
|
//sys hcsFormatWritableLayerVhd(handle uintptr) (hr error) = computestorage.HcsFormatWritableLayerVhd
|
53
vendor/github.com/Microsoft/hcsshim/internal/hcs/system.go
generated
vendored
53
vendor/github.com/Microsoft/hcsshim/internal/hcs/system.go
generated
vendored
@@ -4,12 +4,9 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"errors"
|
"errors"
|
||||||
"os"
|
|
||||||
"strconv"
|
|
||||||
"strings"
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
"syscall"
|
"syscall"
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/Microsoft/hcsshim/internal/cow"
|
"github.com/Microsoft/hcsshim/internal/cow"
|
||||||
"github.com/Microsoft/hcsshim/internal/log"
|
"github.com/Microsoft/hcsshim/internal/log"
|
||||||
@@ -21,27 +18,6 @@ import (
|
|||||||
"go.opencensus.io/trace"
|
"go.opencensus.io/trace"
|
||||||
)
|
)
|
||||||
|
|
||||||
// currentContainerStarts is used to limit the number of concurrent container
|
|
||||||
// starts.
|
|
||||||
var currentContainerStarts containerStarts
|
|
||||||
|
|
||||||
type containerStarts struct {
|
|
||||||
maxParallel int
|
|
||||||
inProgress int
|
|
||||||
sync.Mutex
|
|
||||||
}
|
|
||||||
|
|
||||||
func init() {
|
|
||||||
mpsS := os.Getenv("HCSSHIM_MAX_PARALLEL_START")
|
|
||||||
if len(mpsS) > 0 {
|
|
||||||
mpsI, err := strconv.Atoi(mpsS)
|
|
||||||
if err != nil || mpsI < 0 {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
currentContainerStarts.maxParallel = mpsI
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
type System struct {
|
type System struct {
|
||||||
handleLock sync.RWMutex
|
handleLock sync.RWMutex
|
||||||
handle vmcompute.HcsSystem
|
handle vmcompute.HcsSystem
|
||||||
@@ -52,8 +28,7 @@ type System struct {
|
|||||||
waitBlock chan struct{}
|
waitBlock chan struct{}
|
||||||
waitError error
|
waitError error
|
||||||
exitError error
|
exitError error
|
||||||
|
os, typ string
|
||||||
os, typ string
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func newSystem(id string) *System {
|
func newSystem(id string) *System {
|
||||||
@@ -215,32 +190,6 @@ func (computeSystem *System) Start(ctx context.Context) (err error) {
|
|||||||
return makeSystemError(computeSystem, operation, "", ErrAlreadyClosed, nil)
|
return makeSystemError(computeSystem, operation, "", ErrAlreadyClosed, nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
// This is a very simple backoff-retry loop to limit the number
|
|
||||||
// of parallel container starts if environment variable
|
|
||||||
// HCSSHIM_MAX_PARALLEL_START is set to a positive integer.
|
|
||||||
// It should generally only be used as a workaround to various
|
|
||||||
// platform issues that exist between RS1 and RS4 as of Aug 2018
|
|
||||||
if currentContainerStarts.maxParallel > 0 {
|
|
||||||
for {
|
|
||||||
currentContainerStarts.Lock()
|
|
||||||
if currentContainerStarts.inProgress < currentContainerStarts.maxParallel {
|
|
||||||
currentContainerStarts.inProgress++
|
|
||||||
currentContainerStarts.Unlock()
|
|
||||||
break
|
|
||||||
}
|
|
||||||
if currentContainerStarts.inProgress == currentContainerStarts.maxParallel {
|
|
||||||
currentContainerStarts.Unlock()
|
|
||||||
time.Sleep(100 * time.Millisecond)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Make sure we decrement the count when we are done.
|
|
||||||
defer func() {
|
|
||||||
currentContainerStarts.Lock()
|
|
||||||
currentContainerStarts.inProgress--
|
|
||||||
currentContainerStarts.Unlock()
|
|
||||||
}()
|
|
||||||
}
|
|
||||||
|
|
||||||
resultJSON, err := vmcompute.HcsStartComputeSystem(ctx, computeSystem.handle, "")
|
resultJSON, err := vmcompute.HcsStartComputeSystem(ctx, computeSystem.handle, "")
|
||||||
events, err := processAsyncHcsResult(ctx, err, resultJSON, computeSystem.callbackNumber, hcsNotificationSystemStartCompleted, &timeout.SystemStart)
|
events, err := processAsyncHcsResult(ctx, err, resultJSON, computeSystem.callbackNumber, hcsNotificationSystemStartCompleted, &timeout.SystemStart)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
28
vendor/github.com/Microsoft/hcsshim/internal/hcs/utils.go
generated
vendored
28
vendor/github.com/Microsoft/hcsshim/internal/hcs/utils.go
generated
vendored
@@ -1,10 +1,14 @@
|
|||||||
package hcs
|
package hcs
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"context"
|
||||||
"io"
|
"io"
|
||||||
"syscall"
|
"syscall"
|
||||||
|
|
||||||
"github.com/Microsoft/go-winio"
|
"github.com/Microsoft/go-winio"
|
||||||
|
diskutil "github.com/Microsoft/go-winio/vhd"
|
||||||
|
"github.com/pkg/errors"
|
||||||
|
"golang.org/x/sys/windows"
|
||||||
)
|
)
|
||||||
|
|
||||||
// makeOpenFiles calls winio.MakeOpenFile for each handle in a slice but closes all the handles
|
// makeOpenFiles calls winio.MakeOpenFile for each handle in a slice but closes all the handles
|
||||||
@@ -31,3 +35,27 @@ func makeOpenFiles(hs []syscall.Handle) (_ []io.ReadWriteCloser, err error) {
|
|||||||
}
|
}
|
||||||
return fs, nil
|
return fs, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// creates a VHD formatted with NTFS of size `sizeGB` at the given `vhdPath`.
|
||||||
|
func CreateNTFSVHD(ctx context.Context, vhdPath string, sizeGB uint32) (err error) {
|
||||||
|
if err := diskutil.CreateVhdx(vhdPath, sizeGB, 1); err != nil {
|
||||||
|
return errors.Wrap(err, "failed to create VHD")
|
||||||
|
}
|
||||||
|
|
||||||
|
vhd, err := diskutil.OpenVirtualDisk(vhdPath, diskutil.VirtualDiskAccessNone, diskutil.OpenVirtualDiskFlagNone)
|
||||||
|
if err != nil {
|
||||||
|
return errors.Wrap(err, "failed to open VHD")
|
||||||
|
}
|
||||||
|
defer func() {
|
||||||
|
err2 := windows.CloseHandle(windows.Handle(vhd))
|
||||||
|
if err == nil {
|
||||||
|
err = errors.Wrap(err2, "failed to close VHD")
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
if err := hcsFormatWritableLayerVhd(uintptr(vhd)); err != nil {
|
||||||
|
return errors.Wrap(err, "failed to format VHD")
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
54
vendor/github.com/Microsoft/hcsshim/internal/hcs/zsyscall_windows.go
generated
vendored
Normal file
54
vendor/github.com/Microsoft/hcsshim/internal/hcs/zsyscall_windows.go
generated
vendored
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
// Code generated mksyscall_windows.exe DO NOT EDIT
|
||||||
|
|
||||||
|
package hcs
|
||||||
|
|
||||||
|
import (
|
||||||
|
"syscall"
|
||||||
|
"unsafe"
|
||||||
|
|
||||||
|
"golang.org/x/sys/windows"
|
||||||
|
)
|
||||||
|
|
||||||
|
var _ unsafe.Pointer
|
||||||
|
|
||||||
|
// Do the interface allocations only once for common
|
||||||
|
// Errno values.
|
||||||
|
const (
|
||||||
|
errnoERROR_IO_PENDING = 997
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
errERROR_IO_PENDING error = syscall.Errno(errnoERROR_IO_PENDING)
|
||||||
|
)
|
||||||
|
|
||||||
|
// errnoErr returns common boxed Errno values, to prevent
|
||||||
|
// allocations at runtime.
|
||||||
|
func errnoErr(e syscall.Errno) error {
|
||||||
|
switch e {
|
||||||
|
case 0:
|
||||||
|
return nil
|
||||||
|
case errnoERROR_IO_PENDING:
|
||||||
|
return errERROR_IO_PENDING
|
||||||
|
}
|
||||||
|
// TODO: add more here, after collecting data on the common
|
||||||
|
// error values see on Windows. (perhaps when running
|
||||||
|
// all.bat?)
|
||||||
|
return e
|
||||||
|
}
|
||||||
|
|
||||||
|
var (
|
||||||
|
modcomputestorage = windows.NewLazySystemDLL("computestorage.dll")
|
||||||
|
|
||||||
|
procHcsFormatWritableLayerVhd = modcomputestorage.NewProc("HcsFormatWritableLayerVhd")
|
||||||
|
)
|
||||||
|
|
||||||
|
func hcsFormatWritableLayerVhd(handle uintptr) (hr error) {
|
||||||
|
r0, _, _ := syscall.Syscall(procHcsFormatWritableLayerVhd.Addr(), 1, uintptr(handle), 0, 0)
|
||||||
|
if int32(r0) < 0 {
|
||||||
|
if r0&0x1fff0000 == 0x00070000 {
|
||||||
|
r0 &= 0xffff
|
||||||
|
}
|
||||||
|
hr = syscall.Errno(r0)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
24
vendor/github.com/Microsoft/hcsshim/internal/hns/hnsendpoint.go
generated
vendored
24
vendor/github.com/Microsoft/hcsshim/internal/hns/hnsendpoint.go
generated
vendored
@@ -17,12 +17,15 @@ type HNSEndpoint struct {
|
|||||||
Policies []json.RawMessage `json:",omitempty"`
|
Policies []json.RawMessage `json:",omitempty"`
|
||||||
MacAddress string `json:",omitempty"`
|
MacAddress string `json:",omitempty"`
|
||||||
IPAddress net.IP `json:",omitempty"`
|
IPAddress 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"`
|
||||||
GatewayAddress string `json:",omitempty"`
|
GatewayAddress string `json:",omitempty"`
|
||||||
|
GatewayAddressV6 string `json:",omitempty"`
|
||||||
EnableInternalDNS bool `json:",omitempty"`
|
EnableInternalDNS bool `json:",omitempty"`
|
||||||
DisableICC bool `json:",omitempty"`
|
DisableICC bool `json:",omitempty"`
|
||||||
PrefixLength uint8 `json:",omitempty"`
|
PrefixLength uint8 `json:",omitempty"`
|
||||||
|
IPv6PrefixLength uint8 `json:",omitempty"`
|
||||||
IsRemoteEndpoint bool `json:",omitempty"`
|
IsRemoteEndpoint bool `json:",omitempty"`
|
||||||
EnableLowMetric bool `json:",omitempty"`
|
EnableLowMetric bool `json:",omitempty"`
|
||||||
Namespace *Namespace `json:",omitempty"`
|
Namespace *Namespace `json:",omitempty"`
|
||||||
@@ -173,6 +176,27 @@ func (endpoint *HNSEndpoint) ApplyACLPolicy(policies ...*ACLPolicy) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ApplyProxyPolicy applies a set of Proxy Policies on the Endpoint
|
||||||
|
func (endpoint *HNSEndpoint) ApplyProxyPolicy(policies ...*ProxyPolicy) error {
|
||||||
|
operation := "ApplyProxyPolicy"
|
||||||
|
title := "hcsshim::HNSEndpoint::" + operation
|
||||||
|
logrus.Debugf(title+" id=%s", endpoint.Id)
|
||||||
|
|
||||||
|
for _, policy := range policies {
|
||||||
|
if policy == nil {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
jsonString, err := json.Marshal(policy)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
endpoint.Policies = append(endpoint.Policies, jsonString)
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err := endpoint.Update()
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
// ContainerAttach attaches an endpoint to container
|
// ContainerAttach attaches an endpoint to container
|
||||||
func (endpoint *HNSEndpoint) ContainerAttach(containerID string, compartmentID uint16) error {
|
func (endpoint *HNSEndpoint) ContainerAttach(containerID string, compartmentID uint16) error {
|
||||||
operation := "ContainerAttach"
|
operation := "ContainerAttach"
|
||||||
|
10
vendor/github.com/Microsoft/hcsshim/internal/hns/hnspolicy.go
generated
vendored
10
vendor/github.com/Microsoft/hcsshim/internal/hns/hnspolicy.go
generated
vendored
@@ -17,6 +17,7 @@ const (
|
|||||||
OutboundNat PolicyType = "OutBoundNAT"
|
OutboundNat PolicyType = "OutBoundNAT"
|
||||||
ExternalLoadBalancer PolicyType = "ELB"
|
ExternalLoadBalancer PolicyType = "ELB"
|
||||||
Route PolicyType = "ROUTE"
|
Route PolicyType = "ROUTE"
|
||||||
|
Proxy PolicyType = "PROXY"
|
||||||
)
|
)
|
||||||
|
|
||||||
type NatPolicy struct {
|
type NatPolicy struct {
|
||||||
@@ -60,6 +61,15 @@ type OutboundNatPolicy struct {
|
|||||||
Destinations []string `json:",omitempty"`
|
Destinations []string `json:",omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type ProxyPolicy struct {
|
||||||
|
Type PolicyType `json:"Type"`
|
||||||
|
IP string `json:",omitempty"`
|
||||||
|
Port string `json:",omitempty"`
|
||||||
|
ExceptionList []string `json:",omitempty"`
|
||||||
|
Destination string `json:",omitempty"`
|
||||||
|
OutboundNat bool `json:",omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
type ActionType string
|
type ActionType string
|
||||||
type DirectionType string
|
type DirectionType string
|
||||||
type RuleType string
|
type RuleType string
|
||||||
|
158
vendor/github.com/Microsoft/hcsshim/internal/safefile/safeopen.go
generated
vendored
158
vendor/github.com/Microsoft/hcsshim/internal/safefile/safeopen.go
generated
vendored
@@ -11,72 +11,11 @@ import (
|
|||||||
"unsafe"
|
"unsafe"
|
||||||
|
|
||||||
"github.com/Microsoft/hcsshim/internal/longpath"
|
"github.com/Microsoft/hcsshim/internal/longpath"
|
||||||
|
"github.com/Microsoft/hcsshim/internal/winapi"
|
||||||
|
|
||||||
winio "github.com/Microsoft/go-winio"
|
winio "github.com/Microsoft/go-winio"
|
||||||
)
|
)
|
||||||
|
|
||||||
//go:generate go run $GOROOT\src\syscall\mksyscall_windows.go -output zsyscall_windows.go safeopen.go
|
|
||||||
|
|
||||||
//sys ntCreateFile(handle *uintptr, accessMask uint32, oa *objectAttributes, iosb *ioStatusBlock, allocationSize *uint64, fileAttributes uint32, shareAccess uint32, createDisposition uint32, createOptions uint32, eaBuffer *byte, eaLength uint32) (status uint32) = ntdll.NtCreateFile
|
|
||||||
//sys ntSetInformationFile(handle uintptr, iosb *ioStatusBlock, information uintptr, length uint32, class uint32) (status uint32) = ntdll.NtSetInformationFile
|
|
||||||
//sys rtlNtStatusToDosError(status uint32) (winerr error) = ntdll.RtlNtStatusToDosErrorNoTeb
|
|
||||||
//sys localAlloc(flags uint32, size int) (ptr uintptr) = kernel32.LocalAlloc
|
|
||||||
//sys localFree(ptr uintptr) = kernel32.LocalFree
|
|
||||||
|
|
||||||
type ioStatusBlock struct {
|
|
||||||
Status, Information uintptr
|
|
||||||
}
|
|
||||||
|
|
||||||
type objectAttributes struct {
|
|
||||||
Length uintptr
|
|
||||||
RootDirectory uintptr
|
|
||||||
ObjectName uintptr
|
|
||||||
Attributes uintptr
|
|
||||||
SecurityDescriptor uintptr
|
|
||||||
SecurityQoS uintptr
|
|
||||||
}
|
|
||||||
|
|
||||||
type unicodeString struct {
|
|
||||||
Length uint16
|
|
||||||
MaximumLength uint16
|
|
||||||
Buffer uintptr
|
|
||||||
}
|
|
||||||
|
|
||||||
type fileLinkInformation struct {
|
|
||||||
ReplaceIfExists bool
|
|
||||||
RootDirectory uintptr
|
|
||||||
FileNameLength uint32
|
|
||||||
FileName [1]uint16
|
|
||||||
}
|
|
||||||
|
|
||||||
type fileDispositionInformationEx struct {
|
|
||||||
Flags uintptr
|
|
||||||
}
|
|
||||||
|
|
||||||
const (
|
|
||||||
_FileLinkInformation = 11
|
|
||||||
_FileDispositionInformationEx = 64
|
|
||||||
|
|
||||||
FILE_READ_ATTRIBUTES = 0x0080
|
|
||||||
FILE_WRITE_ATTRIBUTES = 0x0100
|
|
||||||
DELETE = 0x10000
|
|
||||||
|
|
||||||
FILE_OPEN = 1
|
|
||||||
FILE_CREATE = 2
|
|
||||||
|
|
||||||
FILE_DIRECTORY_FILE = 0x00000001
|
|
||||||
FILE_SYNCHRONOUS_IO_NONALERT = 0x00000020
|
|
||||||
FILE_DELETE_ON_CLOSE = 0x00001000
|
|
||||||
FILE_OPEN_FOR_BACKUP_INTENT = 0x00004000
|
|
||||||
FILE_OPEN_REPARSE_POINT = 0x00200000
|
|
||||||
|
|
||||||
FILE_DISPOSITION_DELETE = 0x00000001
|
|
||||||
|
|
||||||
_OBJ_DONT_REPARSE = 0x1000
|
|
||||||
|
|
||||||
_STATUS_REPARSE_POINT_ENCOUNTERED = 0xC000050B
|
|
||||||
)
|
|
||||||
|
|
||||||
func OpenRoot(path string) (*os.File, error) {
|
func OpenRoot(path string) (*os.File, error) {
|
||||||
longpath, err := longpath.LongAbs(path)
|
longpath, err := longpath.LongAbs(path)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -85,16 +24,24 @@ func OpenRoot(path string) (*os.File, error) {
|
|||||||
return winio.OpenForBackup(longpath, syscall.GENERIC_READ, syscall.FILE_SHARE_READ|syscall.FILE_SHARE_WRITE|syscall.FILE_SHARE_DELETE, syscall.OPEN_EXISTING)
|
return winio.OpenForBackup(longpath, syscall.GENERIC_READ, syscall.FILE_SHARE_READ|syscall.FILE_SHARE_WRITE|syscall.FILE_SHARE_DELETE, syscall.OPEN_EXISTING)
|
||||||
}
|
}
|
||||||
|
|
||||||
func ntRelativePath(path string) ([]uint16, error) {
|
func cleanGoStringRelativePath(path string) (string, error) {
|
||||||
path = filepath.Clean(path)
|
path = filepath.Clean(path)
|
||||||
if strings.Contains(path, ":") {
|
if strings.Contains(path, ":") {
|
||||||
// Since alternate data streams must follow the file they
|
// Since alternate data streams must follow the file they
|
||||||
// are attached to, finding one here (out of order) is invalid.
|
// are attached to, finding one here (out of order) is invalid.
|
||||||
return nil, errors.New("path contains invalid character `:`")
|
return "", errors.New("path contains invalid character `:`")
|
||||||
}
|
}
|
||||||
fspath := filepath.FromSlash(path)
|
fspath := filepath.FromSlash(path)
|
||||||
if len(fspath) > 0 && fspath[0] == '\\' {
|
if len(fspath) > 0 && fspath[0] == '\\' {
|
||||||
return nil, errors.New("expected relative path")
|
return "", errors.New("expected relative path")
|
||||||
|
}
|
||||||
|
return fspath, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func ntRelativePath(path string) ([]uint16, error) {
|
||||||
|
fspath, err := cleanGoStringRelativePath(path)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
path16 := utf16.Encode(([]rune)(fspath))
|
path16 := utf16.Encode(([]rune)(fspath))
|
||||||
@@ -110,11 +57,11 @@ func ntRelativePath(path string) ([]uint16, error) {
|
|||||||
func openRelativeInternal(path string, root *os.File, accessMask uint32, shareFlags uint32, createDisposition uint32, flags uint32) (*os.File, error) {
|
func openRelativeInternal(path string, root *os.File, accessMask uint32, shareFlags uint32, createDisposition uint32, flags uint32) (*os.File, error) {
|
||||||
var (
|
var (
|
||||||
h uintptr
|
h uintptr
|
||||||
iosb ioStatusBlock
|
iosb winapi.IOStatusBlock
|
||||||
oa objectAttributes
|
oa winapi.ObjectAttributes
|
||||||
)
|
)
|
||||||
|
|
||||||
path16, err := ntRelativePath(path)
|
cleanRelativePath, err := cleanGoStringRelativePath(path)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -123,20 +70,16 @@ func openRelativeInternal(path string, root *os.File, accessMask uint32, shareFl
|
|||||||
return nil, errors.New("missing root directory")
|
return nil, errors.New("missing root directory")
|
||||||
}
|
}
|
||||||
|
|
||||||
upathBuffer := localAlloc(0, int(unsafe.Sizeof(unicodeString{}))+len(path16)*2)
|
pathUnicode, err := winapi.NewUnicodeString(cleanRelativePath)
|
||||||
defer localFree(upathBuffer)
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
upath := (*unicodeString)(unsafe.Pointer(upathBuffer))
|
}
|
||||||
upath.Length = uint16(len(path16) * 2)
|
|
||||||
upath.MaximumLength = upath.Length
|
|
||||||
upath.Buffer = upathBuffer + unsafe.Sizeof(*upath)
|
|
||||||
copy((*[32768]uint16)(unsafe.Pointer(upath.Buffer))[:], path16)
|
|
||||||
|
|
||||||
oa.Length = unsafe.Sizeof(oa)
|
oa.Length = unsafe.Sizeof(oa)
|
||||||
oa.ObjectName = upathBuffer
|
oa.ObjectName = uintptr(unsafe.Pointer(pathUnicode))
|
||||||
oa.RootDirectory = uintptr(root.Fd())
|
oa.RootDirectory = uintptr(root.Fd())
|
||||||
oa.Attributes = _OBJ_DONT_REPARSE
|
oa.Attributes = winapi.OBJ_DONT_REPARSE
|
||||||
status := ntCreateFile(
|
status := winapi.NtCreateFile(
|
||||||
&h,
|
&h,
|
||||||
accessMask|syscall.SYNCHRONIZE,
|
accessMask|syscall.SYNCHRONIZE,
|
||||||
&oa,
|
&oa,
|
||||||
@@ -145,12 +88,12 @@ func openRelativeInternal(path string, root *os.File, accessMask uint32, shareFl
|
|||||||
0,
|
0,
|
||||||
shareFlags,
|
shareFlags,
|
||||||
createDisposition,
|
createDisposition,
|
||||||
FILE_OPEN_FOR_BACKUP_INTENT|FILE_SYNCHRONOUS_IO_NONALERT|flags,
|
winapi.FILE_OPEN_FOR_BACKUP_INTENT|winapi.FILE_SYNCHRONOUS_IO_NONALERT|flags,
|
||||||
nil,
|
nil,
|
||||||
0,
|
0,
|
||||||
)
|
)
|
||||||
if status != 0 {
|
if status != 0 {
|
||||||
return nil, rtlNtStatusToDosError(status)
|
return nil, winapi.RtlNtStatusToDosError(status)
|
||||||
}
|
}
|
||||||
|
|
||||||
fullPath, err := longpath.LongAbs(filepath.Join(root.Name(), path))
|
fullPath, err := longpath.LongAbs(filepath.Join(root.Name(), path))
|
||||||
@@ -182,7 +125,7 @@ func LinkRelative(oldname string, oldroot *os.File, newname string, newroot *os.
|
|||||||
oldroot,
|
oldroot,
|
||||||
syscall.FILE_WRITE_ATTRIBUTES,
|
syscall.FILE_WRITE_ATTRIBUTES,
|
||||||
syscall.FILE_SHARE_READ|syscall.FILE_SHARE_WRITE|syscall.FILE_SHARE_DELETE,
|
syscall.FILE_SHARE_READ|syscall.FILE_SHARE_WRITE|syscall.FILE_SHARE_DELETE,
|
||||||
FILE_OPEN,
|
winapi.FILE_OPEN,
|
||||||
0,
|
0,
|
||||||
)
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -199,8 +142,8 @@ func LinkRelative(oldname string, oldroot *os.File, newname string, newroot *os.
|
|||||||
newroot,
|
newroot,
|
||||||
syscall.GENERIC_READ,
|
syscall.GENERIC_READ,
|
||||||
syscall.FILE_SHARE_READ|syscall.FILE_SHARE_WRITE|syscall.FILE_SHARE_DELETE,
|
syscall.FILE_SHARE_READ|syscall.FILE_SHARE_WRITE|syscall.FILE_SHARE_DELETE,
|
||||||
FILE_OPEN,
|
winapi.FILE_OPEN,
|
||||||
FILE_DIRECTORY_FILE)
|
winapi.FILE_DIRECTORY_FILE)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return &os.LinkError{Op: "link", Old: oldf.Name(), New: filepath.Join(newroot.Name(), newname), Err: err}
|
return &os.LinkError{Op: "link", Old: oldf.Name(), New: filepath.Join(newroot.Name(), newname), Err: err}
|
||||||
}
|
}
|
||||||
@@ -211,7 +154,7 @@ func LinkRelative(oldname string, oldroot *os.File, newname string, newroot *os.
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if (fi.FileAttributes & syscall.FILE_ATTRIBUTE_REPARSE_POINT) != 0 {
|
if (fi.FileAttributes & syscall.FILE_ATTRIBUTE_REPARSE_POINT) != 0 {
|
||||||
return &os.LinkError{Op: "link", Old: oldf.Name(), New: filepath.Join(newroot.Name(), newname), Err: rtlNtStatusToDosError(_STATUS_REPARSE_POINT_ENCOUNTERED)}
|
return &os.LinkError{Op: "link", Old: oldf.Name(), New: filepath.Join(newroot.Name(), newname), Err: winapi.RtlNtStatusToDosError(winapi.STATUS_REPARSE_POINT_ENCOUNTERED)}
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
@@ -227,24 +170,25 @@ func LinkRelative(oldname string, oldroot *os.File, newname string, newroot *os.
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
size := int(unsafe.Offsetof(fileLinkInformation{}.FileName)) + len(newbase16)*2
|
size := int(unsafe.Offsetof(winapi.FileLinkInformation{}.FileName)) + len(newbase16)*2
|
||||||
linkinfoBuffer := localAlloc(0, size)
|
linkinfoBuffer := winapi.LocalAlloc(0, size)
|
||||||
defer localFree(linkinfoBuffer)
|
defer winapi.LocalFree(linkinfoBuffer)
|
||||||
linkinfo := (*fileLinkInformation)(unsafe.Pointer(linkinfoBuffer))
|
|
||||||
|
linkinfo := (*winapi.FileLinkInformation)(unsafe.Pointer(linkinfoBuffer))
|
||||||
linkinfo.RootDirectory = parent.Fd()
|
linkinfo.RootDirectory = parent.Fd()
|
||||||
linkinfo.FileNameLength = uint32(len(newbase16) * 2)
|
linkinfo.FileNameLength = uint32(len(newbase16) * 2)
|
||||||
copy((*[32768]uint16)(unsafe.Pointer(&linkinfo.FileName[0]))[:], newbase16)
|
copy((*[32768]uint16)(unsafe.Pointer(&linkinfo.FileName[0]))[:], newbase16)
|
||||||
|
|
||||||
var iosb ioStatusBlock
|
var iosb winapi.IOStatusBlock
|
||||||
status := ntSetInformationFile(
|
status := winapi.NtSetInformationFile(
|
||||||
oldf.Fd(),
|
oldf.Fd(),
|
||||||
&iosb,
|
&iosb,
|
||||||
linkinfoBuffer,
|
linkinfoBuffer,
|
||||||
uint32(size),
|
uint32(size),
|
||||||
_FileLinkInformation,
|
winapi.FileLinkInformationClass,
|
||||||
)
|
)
|
||||||
if status != 0 {
|
if status != 0 {
|
||||||
return &os.LinkError{Op: "link", Old: oldf.Name(), New: filepath.Join(parent.Name(), newbase), Err: rtlNtStatusToDosError(status)}
|
return &os.LinkError{Op: "link", Old: oldf.Name(), New: filepath.Join(parent.Name(), newbase), Err: winapi.RtlNtStatusToDosError(status)}
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
@@ -252,17 +196,17 @@ func LinkRelative(oldname string, oldroot *os.File, newname string, newroot *os.
|
|||||||
|
|
||||||
// deleteOnClose marks a file to be deleted when the handle is closed.
|
// deleteOnClose marks a file to be deleted when the handle is closed.
|
||||||
func deleteOnClose(f *os.File) error {
|
func deleteOnClose(f *os.File) error {
|
||||||
disposition := fileDispositionInformationEx{Flags: FILE_DISPOSITION_DELETE}
|
disposition := winapi.FileDispositionInformationEx{Flags: winapi.FILE_DISPOSITION_DELETE}
|
||||||
var iosb ioStatusBlock
|
var iosb winapi.IOStatusBlock
|
||||||
status := ntSetInformationFile(
|
status := winapi.NtSetInformationFile(
|
||||||
f.Fd(),
|
f.Fd(),
|
||||||
&iosb,
|
&iosb,
|
||||||
uintptr(unsafe.Pointer(&disposition)),
|
uintptr(unsafe.Pointer(&disposition)),
|
||||||
uint32(unsafe.Sizeof(disposition)),
|
uint32(unsafe.Sizeof(disposition)),
|
||||||
_FileDispositionInformationEx,
|
winapi.FileDispositionInformationExClass,
|
||||||
)
|
)
|
||||||
if status != 0 {
|
if status != 0 {
|
||||||
return rtlNtStatusToDosError(status)
|
return winapi.RtlNtStatusToDosError(status)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@@ -291,10 +235,10 @@ func RemoveRelative(path string, root *os.File) error {
|
|||||||
f, err := openRelativeInternal(
|
f, err := openRelativeInternal(
|
||||||
path,
|
path,
|
||||||
root,
|
root,
|
||||||
FILE_READ_ATTRIBUTES|FILE_WRITE_ATTRIBUTES|DELETE,
|
winapi.FILE_READ_ATTRIBUTES|winapi.FILE_WRITE_ATTRIBUTES|winapi.DELETE,
|
||||||
syscall.FILE_SHARE_READ|syscall.FILE_SHARE_WRITE|syscall.FILE_SHARE_DELETE,
|
syscall.FILE_SHARE_READ|syscall.FILE_SHARE_WRITE|syscall.FILE_SHARE_DELETE,
|
||||||
FILE_OPEN,
|
winapi.FILE_OPEN,
|
||||||
FILE_OPEN_REPARSE_POINT)
|
winapi.FILE_OPEN_REPARSE_POINT)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
defer f.Close()
|
defer f.Close()
|
||||||
err = deleteOnClose(f)
|
err = deleteOnClose(f)
|
||||||
@@ -385,8 +329,8 @@ func MkdirRelative(path string, root *os.File) error {
|
|||||||
root,
|
root,
|
||||||
0,
|
0,
|
||||||
syscall.FILE_SHARE_READ|syscall.FILE_SHARE_WRITE|syscall.FILE_SHARE_DELETE,
|
syscall.FILE_SHARE_READ|syscall.FILE_SHARE_WRITE|syscall.FILE_SHARE_DELETE,
|
||||||
FILE_CREATE,
|
winapi.FILE_CREATE,
|
||||||
FILE_DIRECTORY_FILE)
|
winapi.FILE_DIRECTORY_FILE)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
f.Close()
|
f.Close()
|
||||||
} else {
|
} else {
|
||||||
@@ -401,10 +345,10 @@ func LstatRelative(path string, root *os.File) (os.FileInfo, error) {
|
|||||||
f, err := openRelativeInternal(
|
f, err := openRelativeInternal(
|
||||||
path,
|
path,
|
||||||
root,
|
root,
|
||||||
FILE_READ_ATTRIBUTES,
|
winapi.FILE_READ_ATTRIBUTES,
|
||||||
syscall.FILE_SHARE_READ|syscall.FILE_SHARE_WRITE|syscall.FILE_SHARE_DELETE,
|
syscall.FILE_SHARE_READ|syscall.FILE_SHARE_WRITE|syscall.FILE_SHARE_DELETE,
|
||||||
FILE_OPEN,
|
winapi.FILE_OPEN,
|
||||||
FILE_OPEN_REPARSE_POINT)
|
winapi.FILE_OPEN_REPARSE_POINT)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, &os.PathError{Op: "stat", Path: filepath.Join(root.Name(), path), Err: err}
|
return nil, &os.PathError{Op: "stat", Path: filepath.Join(root.Name(), path), Err: err}
|
||||||
}
|
}
|
||||||
@@ -421,7 +365,7 @@ func EnsureNotReparsePointRelative(path string, root *os.File) error {
|
|||||||
root,
|
root,
|
||||||
0,
|
0,
|
||||||
syscall.FILE_SHARE_READ|syscall.FILE_SHARE_WRITE|syscall.FILE_SHARE_DELETE,
|
syscall.FILE_SHARE_READ|syscall.FILE_SHARE_WRITE|syscall.FILE_SHARE_DELETE,
|
||||||
FILE_OPEN,
|
winapi.FILE_OPEN,
|
||||||
0)
|
0)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
79
vendor/github.com/Microsoft/hcsshim/internal/safefile/zsyscall_windows.go
generated
vendored
79
vendor/github.com/Microsoft/hcsshim/internal/safefile/zsyscall_windows.go
generated
vendored
@@ -1,79 +0,0 @@
|
|||||||
// Code generated by 'go generate'; DO NOT EDIT.
|
|
||||||
|
|
||||||
package safefile
|
|
||||||
|
|
||||||
import (
|
|
||||||
"syscall"
|
|
||||||
"unsafe"
|
|
||||||
|
|
||||||
"golang.org/x/sys/windows"
|
|
||||||
)
|
|
||||||
|
|
||||||
var _ unsafe.Pointer
|
|
||||||
|
|
||||||
// Do the interface allocations only once for common
|
|
||||||
// Errno values.
|
|
||||||
const (
|
|
||||||
errnoERROR_IO_PENDING = 997
|
|
||||||
)
|
|
||||||
|
|
||||||
var (
|
|
||||||
errERROR_IO_PENDING error = syscall.Errno(errnoERROR_IO_PENDING)
|
|
||||||
)
|
|
||||||
|
|
||||||
// errnoErr returns common boxed Errno values, to prevent
|
|
||||||
// allocations at runtime.
|
|
||||||
func errnoErr(e syscall.Errno) error {
|
|
||||||
switch e {
|
|
||||||
case 0:
|
|
||||||
return nil
|
|
||||||
case errnoERROR_IO_PENDING:
|
|
||||||
return errERROR_IO_PENDING
|
|
||||||
}
|
|
||||||
// TODO: add more here, after collecting data on the common
|
|
||||||
// error values see on Windows. (perhaps when running
|
|
||||||
// all.bat?)
|
|
||||||
return e
|
|
||||||
}
|
|
||||||
|
|
||||||
var (
|
|
||||||
modntdll = windows.NewLazySystemDLL("ntdll.dll")
|
|
||||||
modkernel32 = windows.NewLazySystemDLL("kernel32.dll")
|
|
||||||
|
|
||||||
procNtCreateFile = modntdll.NewProc("NtCreateFile")
|
|
||||||
procNtSetInformationFile = modntdll.NewProc("NtSetInformationFile")
|
|
||||||
procRtlNtStatusToDosErrorNoTeb = modntdll.NewProc("RtlNtStatusToDosErrorNoTeb")
|
|
||||||
procLocalAlloc = modkernel32.NewProc("LocalAlloc")
|
|
||||||
procLocalFree = modkernel32.NewProc("LocalFree")
|
|
||||||
)
|
|
||||||
|
|
||||||
func ntCreateFile(handle *uintptr, accessMask uint32, oa *objectAttributes, iosb *ioStatusBlock, allocationSize *uint64, fileAttributes uint32, shareAccess uint32, createDisposition uint32, createOptions uint32, eaBuffer *byte, eaLength uint32) (status uint32) {
|
|
||||||
r0, _, _ := syscall.Syscall12(procNtCreateFile.Addr(), 11, uintptr(unsafe.Pointer(handle)), uintptr(accessMask), uintptr(unsafe.Pointer(oa)), uintptr(unsafe.Pointer(iosb)), uintptr(unsafe.Pointer(allocationSize)), uintptr(fileAttributes), uintptr(shareAccess), uintptr(createDisposition), uintptr(createOptions), uintptr(unsafe.Pointer(eaBuffer)), uintptr(eaLength), 0)
|
|
||||||
status = uint32(r0)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func ntSetInformationFile(handle uintptr, iosb *ioStatusBlock, information uintptr, length uint32, class uint32) (status uint32) {
|
|
||||||
r0, _, _ := syscall.Syscall6(procNtSetInformationFile.Addr(), 5, uintptr(handle), uintptr(unsafe.Pointer(iosb)), uintptr(information), uintptr(length), uintptr(class), 0)
|
|
||||||
status = uint32(r0)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func rtlNtStatusToDosError(status uint32) (winerr error) {
|
|
||||||
r0, _, _ := syscall.Syscall(procRtlNtStatusToDosErrorNoTeb.Addr(), 1, uintptr(status), 0, 0)
|
|
||||||
if r0 != 0 {
|
|
||||||
winerr = syscall.Errno(r0)
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func localAlloc(flags uint32, size int) (ptr uintptr) {
|
|
||||||
r0, _, _ := syscall.Syscall(procLocalAlloc.Addr(), 2, uintptr(flags), uintptr(size), 0)
|
|
||||||
ptr = uintptr(r0)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func localFree(ptr uintptr) {
|
|
||||||
syscall.Syscall(procLocalFree.Addr(), 1, uintptr(ptr), 0, 0)
|
|
||||||
return
|
|
||||||
}
|
|
7
vendor/github.com/Microsoft/hcsshim/internal/schema1/schema1.go
generated
vendored
7
vendor/github.com/Microsoft/hcsshim/internal/schema1/schema1.go
generated
vendored
@@ -214,9 +214,10 @@ type MappedVirtualDiskController struct {
|
|||||||
|
|
||||||
// GuestDefinedCapabilities is part of the GuestConnectionInfo returned by a GuestConnection call on a utility VM
|
// GuestDefinedCapabilities is part of the GuestConnectionInfo returned by a GuestConnection call on a utility VM
|
||||||
type GuestDefinedCapabilities struct {
|
type GuestDefinedCapabilities struct {
|
||||||
NamespaceAddRequestSupported bool `json:",omitempty"`
|
NamespaceAddRequestSupported bool `json:",omitempty"`
|
||||||
SignalProcessSupported bool `json:",omitempty"`
|
SignalProcessSupported bool `json:",omitempty"`
|
||||||
DumpStacksSupported bool `json:",omitempty"`
|
DumpStacksSupported bool `json:",omitempty"`
|
||||||
|
DeleteContainerStateSupported bool `json:",omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// GuestConnectionInfo is the structure of an iterm return by a GuestConnection call on a utility VM
|
// GuestConnectionInfo is the structure of an iterm return by a GuestConnection call on a utility VM
|
||||||
|
16
vendor/github.com/Microsoft/hcsshim/internal/schema2/container_credential_guard_add_instance_request.go
generated
vendored
Normal file
16
vendor/github.com/Microsoft/hcsshim/internal/schema2/container_credential_guard_add_instance_request.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 ContainerCredentialGuardAddInstanceRequest struct {
|
||||||
|
Id string `json:"Id,omitempty"`
|
||||||
|
CredentialSpec string `json:"CredentialSpec,omitempty"`
|
||||||
|
Transport string `json:"Transport,omitempty"`
|
||||||
|
}
|
15
vendor/github.com/Microsoft/hcsshim/internal/schema2/container_credential_guard_hv_socket_service_config.go
generated
vendored
Normal file
15
vendor/github.com/Microsoft/hcsshim/internal/schema2/container_credential_guard_hv_socket_service_config.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 ContainerCredentialGuardHvSocketServiceConfig struct {
|
||||||
|
ServiceId string `json:"ServiceId,omitempty"`
|
||||||
|
ServiceConfig *HvSocketServiceConfig `json:"ServiceConfig,omitempty"`
|
||||||
|
}
|
16
vendor/github.com/Microsoft/hcsshim/internal/schema2/container_credential_guard_instance.go
generated
vendored
Normal file
16
vendor/github.com/Microsoft/hcsshim/internal/schema2/container_credential_guard_instance.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 ContainerCredentialGuardInstance struct {
|
||||||
|
Id string `json:"Id,omitempty"`
|
||||||
|
CredentialGuard *ContainerCredentialGuardState `json:"CredentialGuard,omitempty"`
|
||||||
|
HvSocketConfig *ContainerCredentialGuardHvSocketServiceConfig `json:"HvSocketConfig,omitempty"`
|
||||||
|
}
|
17
vendor/github.com/Microsoft/hcsshim/internal/schema2/container_credential_guard_modify_operation.go
generated
vendored
Normal file
17
vendor/github.com/Microsoft/hcsshim/internal/schema2/container_credential_guard_modify_operation.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 ContainerCredentialGuardModifyOperation string
|
||||||
|
|
||||||
|
const (
|
||||||
|
AddInstance ContainerCredentialGuardModifyOperation = "AddInstance"
|
||||||
|
RemoveInstance ContainerCredentialGuardModifyOperation = "RemoveInstance"
|
||||||
|
)
|
15
vendor/github.com/Microsoft/hcsshim/internal/schema2/container_credential_guard_operation_request.go
generated
vendored
Normal file
15
vendor/github.com/Microsoft/hcsshim/internal/schema2/container_credential_guard_operation_request.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 ContainerCredentialGuardOperationRequest struct {
|
||||||
|
Operation ContainerCredentialGuardModifyOperation `json:"Operation,omitempty"`
|
||||||
|
OperationDetails interface{} `json:"OperationDetails,omitempty"`
|
||||||
|
}
|
14
vendor/github.com/Microsoft/hcsshim/internal/schema2/container_credential_guard_remove_instance_request.go
generated
vendored
Normal file
14
vendor/github.com/Microsoft/hcsshim/internal/schema2/container_credential_guard_remove_instance_request.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 ContainerCredentialGuardRemoveInstanceRequest struct {
|
||||||
|
Id string `json:"Id,omitempty"`
|
||||||
|
}
|
14
vendor/github.com/Microsoft/hcsshim/internal/schema2/container_credential_guard_system_info.go
generated
vendored
Normal file
14
vendor/github.com/Microsoft/hcsshim/internal/schema2/container_credential_guard_system_info.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 ContainerCredentialGuardSystemInfo struct {
|
||||||
|
Instances []ContainerCredentialGuardInstance `json:"Instances,omitempty"`
|
||||||
|
}
|
15
vendor/github.com/Microsoft/hcsshim/internal/schema2/device.go
generated
vendored
15
vendor/github.com/Microsoft/hcsshim/internal/schema2/device.go
generated
vendored
@@ -9,8 +9,19 @@
|
|||||||
|
|
||||||
package hcsschema
|
package hcsschema
|
||||||
|
|
||||||
type Device struct {
|
type DeviceType string
|
||||||
|
|
||||||
// The interface class guid of the device to assign to container.
|
const (
|
||||||
|
ClassGUID DeviceType = "ClassGuid"
|
||||||
|
DeviceInstance = "DeviceInstance"
|
||||||
|
GPUMirror = "GpuMirror"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Device struct {
|
||||||
|
// The type of device to assign to the container.
|
||||||
|
Type DeviceType `json:"Type,omitempty"`
|
||||||
|
// 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.
|
||||||
|
LocationPath string `json:"LocationPath,omitempty"`
|
||||||
}
|
}
|
||||||
|
4
vendor/github.com/Microsoft/hcsshim/internal/schema2/devices.go
generated
vendored
4
vendor/github.com/Microsoft/hcsshim/internal/schema2/devices.go
generated
vendored
@@ -39,4 +39,8 @@ type Devices struct {
|
|||||||
FlexibleIov map[string]FlexibleIoDevice `json:"FlexibleIov,omitempty"`
|
FlexibleIov map[string]FlexibleIoDevice `json:"FlexibleIov,omitempty"`
|
||||||
|
|
||||||
SharedMemory *SharedMemoryConfiguration `json:"SharedMemory,omitempty"`
|
SharedMemory *SharedMemoryConfiguration `json:"SharedMemory,omitempty"`
|
||||||
|
|
||||||
|
// TODO: This is pre-release support in schema 2.3. Need to add build number
|
||||||
|
// docs when a public build with this is out.
|
||||||
|
VirtualPci map[string]VirtualPciDevice `json:",omitempty"`
|
||||||
}
|
}
|
||||||
|
17
vendor/github.com/Microsoft/hcsshim/internal/schema2/hv_socket_address.go
generated
vendored
Normal file
17
vendor/github.com/Microsoft/hcsshim/internal/schema2/hv_socket_address.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
|
||||||
|
|
||||||
|
// This class defines address settings applied to a VM
|
||||||
|
// by the GCS every time a VM starts or restores.
|
||||||
|
type HvSocketAddress struct {
|
||||||
|
LocalAddress string `json:"LocalAddress,omitempty"`
|
||||||
|
ParentAddress string `json:"ParentAddress,omitempty"`
|
||||||
|
}
|
18
vendor/github.com/Microsoft/hcsshim/internal/schema2/logical_processor.go
generated
vendored
Normal file
18
vendor/github.com/Microsoft/hcsshim/internal/schema2/logical_processor.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 LogicalProcessor struct {
|
||||||
|
LpIndex uint32 `json:"LpIndex,omitempty"`
|
||||||
|
NodeNumber uint8 `json:"NodeNumber, omitempty"`
|
||||||
|
PackageId uint32 `json:"PackageId, omitempty"`
|
||||||
|
CoreId uint32 `json:"CoreId, omitempty"`
|
||||||
|
RootVpIndex int32 `json:"RootVpIndex, omitempty"`
|
||||||
|
}
|
2
vendor/github.com/Microsoft/hcsshim/internal/schema2/memory.go
generated
vendored
2
vendor/github.com/Microsoft/hcsshim/internal/schema2/memory.go
generated
vendored
@@ -10,5 +10,5 @@
|
|||||||
package hcsschema
|
package hcsschema
|
||||||
|
|
||||||
type Memory struct {
|
type Memory struct {
|
||||||
SizeInMB int32 `json:"SizeInMB,omitempty"`
|
SizeInMB uint64 `json:"SizeInMB,omitempty"`
|
||||||
}
|
}
|
||||||
|
21
vendor/github.com/Microsoft/hcsshim/internal/schema2/memory_2.go
generated
vendored
21
vendor/github.com/Microsoft/hcsshim/internal/schema2/memory_2.go
generated
vendored
@@ -10,7 +10,7 @@
|
|||||||
package hcsschema
|
package hcsschema
|
||||||
|
|
||||||
type Memory2 struct {
|
type Memory2 struct {
|
||||||
SizeInMB int32 `json:"SizeInMB,omitempty"`
|
SizeInMB uint64 `json:"SizeInMB,omitempty"`
|
||||||
|
|
||||||
AllowOvercommit bool `json:"AllowOvercommit,omitempty"`
|
AllowOvercommit bool `json:"AllowOvercommit,omitempty"`
|
||||||
|
|
||||||
@@ -27,4 +27,23 @@ type Memory2 struct {
|
|||||||
// to the VM, allowing it to trim non-zeroed pages from the working set (if supported by
|
// to the VM, allowing it to trim non-zeroed pages from the working set (if supported by
|
||||||
// the guest operating system).
|
// the guest operating system).
|
||||||
EnableColdDiscardHint bool `json:"EnableColdDiscardHint,omitempty"`
|
EnableColdDiscardHint bool `json:"EnableColdDiscardHint,omitempty"`
|
||||||
|
|
||||||
|
// LowMmioGapInMB is the low MMIO region allocated below 4GB.
|
||||||
|
//
|
||||||
|
// TODO: This is pre-release support in schema 2.3. Need to add build number
|
||||||
|
// docs when a public build with this is out.
|
||||||
|
LowMMIOGapInMB uint64 `json:"LowMmioGapInMB,omitempty"`
|
||||||
|
|
||||||
|
// HighMmioBaseInMB is the high MMIO region allocated above 4GB (base and
|
||||||
|
// size).
|
||||||
|
//
|
||||||
|
// TODO: This is pre-release support in schema 2.3. Need to add build number
|
||||||
|
// docs when a public build with this is out.
|
||||||
|
HighMMIOBaseInMB uint64 `json:"HighMmioBaseInMB,omitempty"`
|
||||||
|
|
||||||
|
// HighMmioGapInMB is the high MMIO region.
|
||||||
|
//
|
||||||
|
// TODO: This is pre-release support in schema 2.3. Need to add build number
|
||||||
|
// docs when a public build with this is out.
|
||||||
|
HighMMIOGapInMB uint64 `json:"HighMmioGapInMB,omitempty"`
|
||||||
}
|
}
|
||||||
|
15
vendor/github.com/Microsoft/hcsshim/internal/schema2/modification_request.go
generated
vendored
Normal file
15
vendor/github.com/Microsoft/hcsshim/internal/schema2/modification_request.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 ModificationRequest struct {
|
||||||
|
PropertyType PropertyType `json:"PropertyType,omitempty"`
|
||||||
|
Settings interface{} `json:"Settings,omitempty"`
|
||||||
|
}
|
15
vendor/github.com/Microsoft/hcsshim/internal/schema2/processor_topology.go
generated
vendored
Normal file
15
vendor/github.com/Microsoft/hcsshim/internal/schema2/processor_topology.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 ProcessorTopology struct {
|
||||||
|
LogicalProcessorCount uint32 `json:"LogicalProcessorCount,omitempty"`
|
||||||
|
LogicalProcessors []LogicalProcessor `json:"LogicalProcessors,omitempty"`
|
||||||
|
}
|
2
vendor/github.com/Microsoft/hcsshim/internal/schema2/property_type.go
generated
vendored
2
vendor/github.com/Microsoft/hcsshim/internal/schema2/property_type.go
generated
vendored
@@ -18,6 +18,8 @@ const (
|
|||||||
PTProcessList PropertyType = "ProcessList"
|
PTProcessList PropertyType = "ProcessList"
|
||||||
PTTerminateOnLastHandleClosed PropertyType = "TerminateOnLastHandleClosed"
|
PTTerminateOnLastHandleClosed PropertyType = "TerminateOnLastHandleClosed"
|
||||||
PTSharedMemoryRegion PropertyType = "SharedMemoryRegion"
|
PTSharedMemoryRegion PropertyType = "SharedMemoryRegion"
|
||||||
|
PTContainerCredentialGuard PropertyType = "ContainerCredentialGuard" // This field is not generated by swagger. This was added manually.
|
||||||
PTGuestConnection PropertyType = "GuestConnection"
|
PTGuestConnection PropertyType = "GuestConnection"
|
||||||
PTICHeartbeatStatus PropertyType = "ICHeartbeatStatus"
|
PTICHeartbeatStatus PropertyType = "ICHeartbeatStatus"
|
||||||
|
PTProcessorTopology PropertyType = "ProcessorTopology"
|
||||||
)
|
)
|
||||||
|
18
vendor/github.com/Microsoft/hcsshim/internal/schema2/service_properties.go
generated
vendored
Normal file
18
vendor/github.com/Microsoft/hcsshim/internal/schema2/service_properties.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
|
||||||
|
|
||||||
|
import "encoding/json"
|
||||||
|
|
||||||
|
type ServiceProperties struct {
|
||||||
|
// Changed Properties field to []json.RawMessage from []interface{} to avoid having to
|
||||||
|
// remarshal sp.Properties[n] and unmarshal into the type(s) we want.
|
||||||
|
Properties []json.RawMessage `json:"Properties,omitempty"`
|
||||||
|
}
|
16
vendor/github.com/Microsoft/hcsshim/internal/schema2/virtual_pci_device.go
generated
vendored
Normal file
16
vendor/github.com/Microsoft/hcsshim/internal/schema2/virtual_pci_device.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.3
|
||||||
|
* Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
|
||||||
|
*/
|
||||||
|
|
||||||
|
package hcsschema
|
||||||
|
|
||||||
|
// TODO: This is pre-release support in schema 2.3. Need to add build number
|
||||||
|
// docs when a public build with this is out.
|
||||||
|
type VirtualPciDevice struct {
|
||||||
|
Functions []VirtualPciFunction `json:",omitempty"`
|
||||||
|
}
|
18
vendor/github.com/Microsoft/hcsshim/internal/schema2/virtual_pci_function.go
generated
vendored
Normal file
18
vendor/github.com/Microsoft/hcsshim/internal/schema2/virtual_pci_function.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.3
|
||||||
|
* Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
|
||||||
|
*/
|
||||||
|
|
||||||
|
package hcsschema
|
||||||
|
|
||||||
|
// TODO: This is pre-release support in schema 2.3. Need to add build number
|
||||||
|
// docs when a public build with this is out.
|
||||||
|
type VirtualPciFunction struct {
|
||||||
|
DeviceInstancePath string `json:",omitempty"`
|
||||||
|
|
||||||
|
VirtualFunction uint16 `json:",omitempty"`
|
||||||
|
}
|
22
vendor/github.com/Microsoft/hcsshim/internal/vmcompute/vmcompute.go
generated
vendored
22
vendor/github.com/Microsoft/hcsshim/internal/vmcompute/vmcompute.go
generated
vendored
@@ -26,6 +26,7 @@ import (
|
|||||||
//sys hcsResumeComputeSystem(computeSystem HcsSystem, options string, result **uint16) (hr error) = vmcompute.HcsResumeComputeSystem?
|
//sys hcsResumeComputeSystem(computeSystem HcsSystem, options string, result **uint16) (hr error) = vmcompute.HcsResumeComputeSystem?
|
||||||
//sys hcsGetComputeSystemProperties(computeSystem HcsSystem, propertyQuery string, properties **uint16, result **uint16) (hr error) = vmcompute.HcsGetComputeSystemProperties?
|
//sys hcsGetComputeSystemProperties(computeSystem HcsSystem, propertyQuery string, properties **uint16, result **uint16) (hr error) = vmcompute.HcsGetComputeSystemProperties?
|
||||||
//sys hcsModifyComputeSystem(computeSystem HcsSystem, configuration string, result **uint16) (hr error) = vmcompute.HcsModifyComputeSystem?
|
//sys hcsModifyComputeSystem(computeSystem HcsSystem, configuration string, result **uint16) (hr error) = vmcompute.HcsModifyComputeSystem?
|
||||||
|
//sys hcsModifyServiceSettings(settings string, result **uint16) (hr error) = vmcompute.HcsModifyServiceSettings?
|
||||||
//sys hcsRegisterComputeSystemCallback(computeSystem HcsSystem, callback uintptr, context uintptr, callbackHandle *HcsCallback) (hr error) = vmcompute.HcsRegisterComputeSystemCallback?
|
//sys hcsRegisterComputeSystemCallback(computeSystem HcsSystem, callback uintptr, context uintptr, callbackHandle *HcsCallback) (hr error) = vmcompute.HcsRegisterComputeSystemCallback?
|
||||||
//sys hcsUnregisterComputeSystemCallback(callbackHandle HcsCallback) (hr error) = vmcompute.HcsUnregisterComputeSystemCallback?
|
//sys hcsUnregisterComputeSystemCallback(callbackHandle HcsCallback) (hr error) = vmcompute.HcsUnregisterComputeSystemCallback?
|
||||||
|
|
||||||
@@ -337,6 +338,27 @@ func HcsModifyComputeSystem(ctx gcontext.Context, computeSystem HcsSystem, confi
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func HcsModifyServiceSettings(ctx gcontext.Context, settings string) (result string, hr error) {
|
||||||
|
ctx, span := trace.StartSpan(ctx, "HcsModifyServiceSettings")
|
||||||
|
defer span.End()
|
||||||
|
defer func() {
|
||||||
|
if result != "" {
|
||||||
|
span.AddAttributes(trace.StringAttribute("result", result))
|
||||||
|
}
|
||||||
|
oc.SetSpanStatus(span, hr)
|
||||||
|
}()
|
||||||
|
span.AddAttributes(trace.StringAttribute("settings", settings))
|
||||||
|
|
||||||
|
return result, execute(ctx, timeout.SyscallWatcher, func() error {
|
||||||
|
var resultp *uint16
|
||||||
|
err := hcsModifyServiceSettings(settings, &resultp)
|
||||||
|
if resultp != nil {
|
||||||
|
result = interop.ConvertAndFreeCoTaskMemString(resultp)
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
func HcsRegisterComputeSystemCallback(ctx gcontext.Context, computeSystem HcsSystem, callback uintptr, context uintptr) (callbackHandle HcsCallback, hr error) {
|
func HcsRegisterComputeSystemCallback(ctx gcontext.Context, computeSystem HcsSystem, callback uintptr, context uintptr) (callbackHandle HcsCallback, hr error) {
|
||||||
ctx, span := trace.StartSpan(ctx, "HcsRegisterComputeSystemCallback")
|
ctx, span := trace.StartSpan(ctx, "HcsRegisterComputeSystemCallback")
|
||||||
defer span.End()
|
defer span.End()
|
||||||
|
24
vendor/github.com/Microsoft/hcsshim/internal/vmcompute/zsyscall_windows.go
generated
vendored
24
vendor/github.com/Microsoft/hcsshim/internal/vmcompute/zsyscall_windows.go
generated
vendored
@@ -50,6 +50,7 @@ var (
|
|||||||
procHcsResumeComputeSystem = modvmcompute.NewProc("HcsResumeComputeSystem")
|
procHcsResumeComputeSystem = modvmcompute.NewProc("HcsResumeComputeSystem")
|
||||||
procHcsGetComputeSystemProperties = modvmcompute.NewProc("HcsGetComputeSystemProperties")
|
procHcsGetComputeSystemProperties = modvmcompute.NewProc("HcsGetComputeSystemProperties")
|
||||||
procHcsModifyComputeSystem = modvmcompute.NewProc("HcsModifyComputeSystem")
|
procHcsModifyComputeSystem = modvmcompute.NewProc("HcsModifyComputeSystem")
|
||||||
|
procHcsModifyServiceSettings = modvmcompute.NewProc("HcsModifyServiceSettings")
|
||||||
procHcsRegisterComputeSystemCallback = modvmcompute.NewProc("HcsRegisterComputeSystemCallback")
|
procHcsRegisterComputeSystemCallback = modvmcompute.NewProc("HcsRegisterComputeSystemCallback")
|
||||||
procHcsUnregisterComputeSystemCallback = modvmcompute.NewProc("HcsUnregisterComputeSystemCallback")
|
procHcsUnregisterComputeSystemCallback = modvmcompute.NewProc("HcsUnregisterComputeSystemCallback")
|
||||||
procHcsCreateProcess = modvmcompute.NewProc("HcsCreateProcess")
|
procHcsCreateProcess = modvmcompute.NewProc("HcsCreateProcess")
|
||||||
@@ -314,6 +315,29 @@ func _hcsModifyComputeSystem(computeSystem HcsSystem, configuration *uint16, res
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func hcsModifyServiceSettings(settings string, result **uint16) (hr error) {
|
||||||
|
var _p0 *uint16
|
||||||
|
_p0, hr = syscall.UTF16PtrFromString(settings)
|
||||||
|
if hr != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
return _hcsModifyServiceSettings(_p0, result)
|
||||||
|
}
|
||||||
|
|
||||||
|
func _hcsModifyServiceSettings(settings *uint16, result **uint16) (hr error) {
|
||||||
|
if hr = procHcsModifyServiceSettings.Find(); hr != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
r0, _, _ := syscall.Syscall(procHcsModifyServiceSettings.Addr(), 2, uintptr(unsafe.Pointer(settings)), uintptr(unsafe.Pointer(result)), 0)
|
||||||
|
if int32(r0) < 0 {
|
||||||
|
if r0&0x1fff0000 == 0x00070000 {
|
||||||
|
r0 &= 0xffff
|
||||||
|
}
|
||||||
|
hr = syscall.Errno(r0)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
func hcsRegisterComputeSystemCallback(computeSystem HcsSystem, callback uintptr, context uintptr, callbackHandle *HcsCallback) (hr error) {
|
func hcsRegisterComputeSystemCallback(computeSystem HcsSystem, callback uintptr, context uintptr, callbackHandle *HcsCallback) (hr error) {
|
||||||
if hr = procHcsRegisterComputeSystemCallback.Find(); hr != nil {
|
if hr = procHcsRegisterComputeSystemCallback.Find(); hr != nil {
|
||||||
return
|
return
|
||||||
|
23
vendor/github.com/Microsoft/hcsshim/internal/wclayer/activatelayer.go
generated
vendored
23
vendor/github.com/Microsoft/hcsshim/internal/wclayer/activatelayer.go
generated
vendored
@@ -1,28 +1,23 @@
|
|||||||
package wclayer
|
package wclayer
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"context"
|
||||||
|
|
||||||
"github.com/Microsoft/hcsshim/internal/hcserror"
|
"github.com/Microsoft/hcsshim/internal/hcserror"
|
||||||
"github.com/sirupsen/logrus"
|
"github.com/Microsoft/hcsshim/internal/oc"
|
||||||
|
"go.opencensus.io/trace"
|
||||||
)
|
)
|
||||||
|
|
||||||
// ActivateLayer will find the layer with the given id and mount it's filesystem.
|
// ActivateLayer will find the layer with the given id and mount it's filesystem.
|
||||||
// For a read/write layer, the mounted filesystem will appear as a volume on the
|
// For a read/write layer, the mounted filesystem will appear as a volume on the
|
||||||
// host, while a read-only layer is generally expected to be a no-op.
|
// host, while a read-only layer is generally expected to be a no-op.
|
||||||
// An activated layer must later be deactivated via DeactivateLayer.
|
// An activated layer must later be deactivated via DeactivateLayer.
|
||||||
func ActivateLayer(path string) (err error) {
|
func ActivateLayer(ctx context.Context, path string) (err error) {
|
||||||
title := "hcsshim::ActivateLayer"
|
title := "hcsshim::ActivateLayer"
|
||||||
fields := logrus.Fields{
|
ctx, span := trace.StartSpan(ctx, title)
|
||||||
"path": path,
|
defer span.End()
|
||||||
}
|
defer func() { oc.SetSpanStatus(span, err) }()
|
||||||
logrus.WithFields(fields).Debug(title)
|
span.AddAttributes(trace.StringAttribute("path", path))
|
||||||
defer func() {
|
|
||||||
if err != nil {
|
|
||||||
fields[logrus.ErrorKey] = err
|
|
||||||
logrus.WithFields(fields).Error(err)
|
|
||||||
} else {
|
|
||||||
logrus.WithFields(fields).Debug(title + " - succeeded")
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
|
|
||||||
err = activateLayer(&stdDriverInfo, path)
|
err = activateLayer(&stdDriverInfo, path)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
29
vendor/github.com/Microsoft/hcsshim/internal/wclayer/baselayer.go
generated
vendored
29
vendor/github.com/Microsoft/hcsshim/internal/wclayer/baselayer.go
generated
vendored
@@ -1,6 +1,7 @@
|
|||||||
package wclayer
|
package wclayer
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"context"
|
||||||
"errors"
|
"errors"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
@@ -8,10 +9,16 @@ import (
|
|||||||
|
|
||||||
"github.com/Microsoft/go-winio"
|
"github.com/Microsoft/go-winio"
|
||||||
"github.com/Microsoft/hcsshim/internal/hcserror"
|
"github.com/Microsoft/hcsshim/internal/hcserror"
|
||||||
|
"github.com/Microsoft/hcsshim/internal/oc"
|
||||||
"github.com/Microsoft/hcsshim/internal/safefile"
|
"github.com/Microsoft/hcsshim/internal/safefile"
|
||||||
|
"github.com/Microsoft/hcsshim/internal/winapi"
|
||||||
|
"go.opencensus.io/trace"
|
||||||
)
|
)
|
||||||
|
|
||||||
type baseLayerWriter struct {
|
type baseLayerWriter struct {
|
||||||
|
ctx context.Context
|
||||||
|
s *trace.Span
|
||||||
|
|
||||||
root *os.File
|
root *os.File
|
||||||
f *os.File
|
f *os.File
|
||||||
bw *winio.BackupFileWriter
|
bw *winio.BackupFileWriter
|
||||||
@@ -31,7 +38,7 @@ type dirInfo struct {
|
|||||||
func reapplyDirectoryTimes(root *os.File, dis []dirInfo) error {
|
func reapplyDirectoryTimes(root *os.File, dis []dirInfo) error {
|
||||||
for i := range dis {
|
for i := range dis {
|
||||||
di := &dis[len(dis)-i-1] // reverse order: process child directories first
|
di := &dis[len(dis)-i-1] // reverse order: process child directories first
|
||||||
f, err := safefile.OpenRelative(di.path, root, syscall.GENERIC_READ|syscall.GENERIC_WRITE, syscall.FILE_SHARE_READ, safefile.FILE_OPEN, safefile.FILE_DIRECTORY_FILE)
|
f, err := safefile.OpenRelative(di.path, root, syscall.GENERIC_READ|syscall.GENERIC_WRITE, syscall.FILE_SHARE_READ, winapi.FILE_OPEN, winapi.FILE_DIRECTORY_FILE|syscall.FILE_FLAG_OPEN_REPARSE_POINT)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@@ -41,6 +48,7 @@ func reapplyDirectoryTimes(root *os.File, dis []dirInfo) error {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@@ -86,14 +94,12 @@ func (w *baseLayerWriter) Add(name string, fileInfo *winio.FileBasicInfo) (err e
|
|||||||
|
|
||||||
extraFlags := uint32(0)
|
extraFlags := uint32(0)
|
||||||
if fileInfo.FileAttributes&syscall.FILE_ATTRIBUTE_DIRECTORY != 0 {
|
if fileInfo.FileAttributes&syscall.FILE_ATTRIBUTE_DIRECTORY != 0 {
|
||||||
extraFlags |= safefile.FILE_DIRECTORY_FILE
|
extraFlags |= winapi.FILE_DIRECTORY_FILE
|
||||||
if fileInfo.FileAttributes&syscall.FILE_ATTRIBUTE_REPARSE_POINT == 0 {
|
w.dirInfo = append(w.dirInfo, dirInfo{name, *fileInfo})
|
||||||
w.dirInfo = append(w.dirInfo, dirInfo{name, *fileInfo})
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
mode := uint32(syscall.GENERIC_READ | syscall.GENERIC_WRITE | winio.WRITE_DAC | winio.WRITE_OWNER | winio.ACCESS_SYSTEM_SECURITY)
|
mode := uint32(syscall.GENERIC_READ | syscall.GENERIC_WRITE | winio.WRITE_DAC | winio.WRITE_OWNER | winio.ACCESS_SYSTEM_SECURITY)
|
||||||
f, err = safefile.OpenRelative(name, w.root, mode, syscall.FILE_SHARE_READ, safefile.FILE_CREATE, extraFlags)
|
f, err = safefile.OpenRelative(name, w.root, mode, syscall.FILE_SHARE_READ, winapi.FILE_CREATE, extraFlags)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return hcserror.New(err, "Failed to safefile.OpenRelative", name)
|
return hcserror.New(err, "Failed to safefile.OpenRelative", name)
|
||||||
}
|
}
|
||||||
@@ -136,12 +142,15 @@ func (w *baseLayerWriter) Write(b []byte) (int, error) {
|
|||||||
return n, err
|
return n, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (w *baseLayerWriter) Close() error {
|
func (w *baseLayerWriter) Close() (err error) {
|
||||||
|
defer w.s.End()
|
||||||
|
defer func() { oc.SetSpanStatus(w.s, err) }()
|
||||||
defer func() {
|
defer func() {
|
||||||
w.root.Close()
|
w.root.Close()
|
||||||
w.root = nil
|
w.root = nil
|
||||||
}()
|
}()
|
||||||
err := w.closeCurrentFile()
|
|
||||||
|
err = w.closeCurrentFile()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@@ -153,7 +162,7 @@ func (w *baseLayerWriter) Close() error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
err = ProcessBaseLayer(w.root.Name())
|
err = ProcessBaseLayer(w.ctx, w.root.Name())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@@ -163,7 +172,7 @@ func (w *baseLayerWriter) Close() error {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
err = ProcessUtilityVMImage(filepath.Join(w.root.Name(), "UtilityVM"))
|
err = ProcessUtilityVMImage(w.ctx, filepath.Join(w.root.Name(), "UtilityVM"))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
26
vendor/github.com/Microsoft/hcsshim/internal/wclayer/createlayer.go
generated
vendored
26
vendor/github.com/Microsoft/hcsshim/internal/wclayer/createlayer.go
generated
vendored
@@ -1,27 +1,23 @@
|
|||||||
package wclayer
|
package wclayer
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"context"
|
||||||
|
|
||||||
"github.com/Microsoft/hcsshim/internal/hcserror"
|
"github.com/Microsoft/hcsshim/internal/hcserror"
|
||||||
"github.com/sirupsen/logrus"
|
"github.com/Microsoft/hcsshim/internal/oc"
|
||||||
|
"go.opencensus.io/trace"
|
||||||
)
|
)
|
||||||
|
|
||||||
// CreateLayer creates a new, empty, read-only layer on the filesystem based on
|
// CreateLayer creates a new, empty, read-only layer on the filesystem based on
|
||||||
// the parent layer provided.
|
// the parent layer provided.
|
||||||
func CreateLayer(path, parent string) (err error) {
|
func CreateLayer(ctx context.Context, path, parent string) (err error) {
|
||||||
title := "hcsshim::CreateLayer"
|
title := "hcsshim::CreateLayer"
|
||||||
fields := logrus.Fields{
|
ctx, span := trace.StartSpan(ctx, title)
|
||||||
"parent": parent,
|
defer span.End()
|
||||||
"path": path,
|
defer func() { oc.SetSpanStatus(span, err) }()
|
||||||
}
|
span.AddAttributes(
|
||||||
logrus.WithFields(fields).Debug(title)
|
trace.StringAttribute("path", path),
|
||||||
defer func() {
|
trace.StringAttribute("parent", parent))
|
||||||
if err != nil {
|
|
||||||
fields[logrus.ErrorKey] = err
|
|
||||||
logrus.WithFields(fields).Error(err)
|
|
||||||
} else {
|
|
||||||
logrus.WithFields(fields).Debug(title + " - succeeded")
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
|
|
||||||
err = createLayer(&stdDriverInfo, path, parent)
|
err = createLayer(&stdDriverInfo, path, parent)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
32
vendor/github.com/Microsoft/hcsshim/internal/wclayer/createscratchlayer.go
generated
vendored
32
vendor/github.com/Microsoft/hcsshim/internal/wclayer/createscratchlayer.go
generated
vendored
@@ -1,31 +1,27 @@
|
|||||||
package wclayer
|
package wclayer
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"context"
|
||||||
|
"strings"
|
||||||
|
|
||||||
"github.com/Microsoft/hcsshim/internal/hcserror"
|
"github.com/Microsoft/hcsshim/internal/hcserror"
|
||||||
"github.com/sirupsen/logrus"
|
"github.com/Microsoft/hcsshim/internal/oc"
|
||||||
|
"go.opencensus.io/trace"
|
||||||
)
|
)
|
||||||
|
|
||||||
// CreateScratchLayer creates and populates new read-write layer for use by a container.
|
// CreateScratchLayer creates and populates new read-write layer for use by a container.
|
||||||
// This requires both the id of the direct parent layer, as well as the full list
|
// This requires the full list of paths to all parent layers up to the base
|
||||||
// of paths to all parent layers up to the base (and including the direct parent
|
func CreateScratchLayer(ctx context.Context, path string, parentLayerPaths []string) (err error) {
|
||||||
// whose id was provided).
|
|
||||||
func CreateScratchLayer(path string, parentLayerPaths []string) (err error) {
|
|
||||||
title := "hcsshim::CreateScratchLayer"
|
title := "hcsshim::CreateScratchLayer"
|
||||||
fields := logrus.Fields{
|
ctx, span := trace.StartSpan(ctx, title)
|
||||||
"path": path,
|
defer span.End()
|
||||||
}
|
defer func() { oc.SetSpanStatus(span, err) }()
|
||||||
logrus.WithFields(fields).Debug(title)
|
span.AddAttributes(
|
||||||
defer func() {
|
trace.StringAttribute("path", path),
|
||||||
if err != nil {
|
trace.StringAttribute("parentLayerPaths", strings.Join(parentLayerPaths, ", ")))
|
||||||
fields[logrus.ErrorKey] = err
|
|
||||||
logrus.WithFields(fields).Error(err)
|
|
||||||
} else {
|
|
||||||
logrus.WithFields(fields).Debug(title + " - succeeded")
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
|
|
||||||
// Generate layer descriptors
|
// Generate layer descriptors
|
||||||
layers, err := layerPathsToDescriptors(parentLayerPaths)
|
layers, err := layerPathsToDescriptors(ctx, parentLayerPaths)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user