Merge pull request #511 from docker/ecs-e2e

First ECS E2E test
This commit is contained in:
Guillaume Tardif 2020-08-20 10:57:23 +02:00 committed by GitHub
commit 2df4112913
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 171 additions and 4 deletions

View File

@ -6,6 +6,7 @@
<!-- optional tests
You can add a @ mention to run tests executed by default only on main branch :
* `test-aci` to run ACI E2E tests
* `test-ecs` to run ECS E2E tests
* `test-windows` to run tests & E2E tests on windows
-->

View File

@ -12,6 +12,7 @@ jobs:
runs-on: ubuntu-latest
outputs:
trigger-aci: ${{steps.runacitest.outputs.triggered}}
trigger-ecs: ${{steps.runecstest.outputs.triggered}}
trigger-windows: ${{steps.runwindowstest.outputs.triggered}}
steps:
- uses: khan/pull-request-comment-trigger@master
@ -26,8 +27,14 @@ jobs:
id: runwindowstest
with:
trigger: '@test-windows'
- uses: khan/pull-request-comment-trigger@master
name: Check if test ECS
if: github.event_name == 'pull_request'
id: runecstest
with:
trigger: '@test-ecs'
build:
aci-tests:
name: ACI e2e tests
runs-on: ubuntu-latest
env:
@ -59,6 +66,41 @@ jobs:
AZURE_TENANT_ID: ${{ secrets.AZURE_TENANT_ID }}
run: make e2e-aci
ecs-tests:
name: ECS e2e tests
runs-on: ubuntu-latest
env:
GO111MODULE: "on"
needs: check-optional-tests
if: github.ref == 'refs/heads/main' || needs.check-optional-tests.outputs.trigger-ecs == 'true'
steps:
- name: Set up Go 1.15
uses: actions/setup-go@v1
with:
go-version: 1.15
id: go
- name: Checkout code into the Go module directory
uses: actions/checkout@v2
- uses: actions/cache@v2
with:
path: ~/go/pkg/mod
key: go-${{ hashFiles('**/go.sum') }}
- name: Build for ECS e2e tests
run: make -f builder.Makefile cli
- name: create aws config folder
run: mkdir -p ~/.aws
- name: ECS e2e Test
env:
AWS_DEFAULT_REGION: us-west-2
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_ACCESS_KEY }}
run: make e2e-ecs
windows-build:
name: Windows Build
runs-on: windows-latest

View File

@ -52,6 +52,9 @@ e2e-win-ci: ## Run end to end local tests on Windows CI, no Docker for Linux con
e2e-aci: ## Run End to end ACI tests. Set E2E_TEST=TestName to run a single test
go test -count=1 -v $(TEST_FLAGS) ./tests/aci-e2e
e2e-ecs: ## Run End to end ECS tests. Set E2E_TEST=TestName to run a single test
go test -timeout 20m -count=1 -v $(TEST_FLAGS) ./tests/ecs-e2e
cross: ## Compile the CLI for linux, darwin and windows
@docker build . --target cross \
--build-arg BUILD_TAGS \

View File

@ -48,6 +48,7 @@ make e2e-local
```
This requires a local Docker Engine running
Local ACI E2E tests:
```
AZURE_TENANT_ID="xxx" AZURE_CLIENT_ID="yyy" AZURE_CLIENT_SECRET="yyy" make e2e-aci
```
@ -65,6 +66,13 @@ You can also run a single ACI test from the test suite:
AZURE_TENANT_ID="xxx" AZURE_CLIENT_ID="yyy" AZURE_CLIENT_SECRET="yyy" make E2E_TEST=TestContainerRun e2e-aci
```
Local ECS E2E tests:
```
TEST_AWS_PROFILE=myProfile TEST_AWS_REGION=eu-west-3 make e2e-ecs
```
This requires a valid AWS profile defined in ~/.aws/credentials.
## Release
To create a new release:

View File

@ -1,5 +1,3 @@
// +build ecs
/*
Copyright 2020 Docker, Inc.

View File

@ -3,4 +3,5 @@ version: "3.7"
services:
nginx:
image: nginx
isolation: FARGATE
ports:
- "80:80"

View File

@ -0,0 +1,114 @@
/*
Copyright 2020 Docker, Inc.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package main
import (
"fmt"
"io/ioutil"
"net/http"
"os"
"strconv"
"strings"
"testing"
"time"
"gotest.tools/v3/assert"
. "github.com/docker/api/tests/framework"
"gotest.tools/v3/icmd"
)
var binDir string
func TestMain(m *testing.M) {
p, cleanup, err := SetupExistingCLI()
if err != nil {
fmt.Println(err)
os.Exit(1)
}
binDir = p
exitCode := m.Run()
cleanup()
os.Exit(exitCode)
}
func TestCompose(t *testing.T) {
startTime := strconv.Itoa(int(time.Now().UnixNano()))
c := NewE2eCLI(t, binDir)
contextName := "teste2e" + startTime
stack := contextName
t.Run("create context", func(t *testing.T) {
localTestProfile := os.Getenv("TEST_AWS_PROFILE")
var res *icmd.Result
if localTestProfile != "" {
region := os.Getenv("TEST_AWS_REGION")
assert.Check(t, region != "")
res = c.RunDockerCmd("context", "create", "ecs", contextName, "--profile", localTestProfile, "--region", region)
res.Assert(t, icmd.Success)
} else {
profile := contextName
region := os.Getenv("AWS_DEFAULT_REGION")
secretKey := os.Getenv("AWS_SECRET_ACCESS_KEY")
keyID := os.Getenv("AWS_ACCESS_KEY_ID")
assert.Check(t, keyID != "")
assert.Check(t, secretKey != "")
assert.Check(t, region != "")
res = c.RunDockerCmd("context", "create", "ecs", contextName, "--profile", profile, "--region", region, "--secret-key", secretKey, "--key-id", keyID)
res.Assert(t, icmd.Success)
}
res = c.RunDockerCmd("context", "use", contextName)
res.Assert(t, icmd.Expected{Out: contextName})
res = c.RunDockerCmd("context", "ls")
res.Assert(t, icmd.Expected{Out: contextName + " *"})
})
t.Run("compose up", func(t *testing.T) {
res := c.RunDockerCmd("compose", "up", "--project-name", stack, "-f", "../composefiles/nginx.yaml")
res.Assert(t, icmd.Success)
})
var url string
t.Run("compose ps", func(t *testing.T) {
res := c.RunDockerCmd("compose", "ps", "--project-name", stack)
res.Assert(t, icmd.Success)
lines := strings.Split(res.Stdout(), "\n")
assert.Equal(t, 3, len(lines))
fields := strings.Fields(lines[1])
assert.Equal(t, 4, len(fields))
assert.Check(t, strings.Contains(fields[0], stack))
assert.Equal(t, "nginx", fields[1])
assert.Equal(t, "1/1", fields[2])
assert.Check(t, strings.Contains(fields[3], "->80/http"))
url = "http://" + strings.Replace(fields[3], "->80/http", "", 1)
})
t.Run("nginx GET", func(t *testing.T) {
r, err := http.Get(url)
assert.NilError(t, err)
assert.Equal(t, r.StatusCode, http.StatusOK)
b, err := ioutil.ReadAll(r.Body)
assert.NilError(t, err)
assert.Assert(t, strings.Contains(string(b), "Welcome to nginx!"))
})
t.Run("compose down", func(t *testing.T) {
res := c.RunDockerCmd("compose", "down", "--project-name", stack, "-f", "../composefiles/nginx.yaml")
res.Assert(t, icmd.Success)
})
}