From e7e1dc9519cf551711d4807763b5e81b161ba6bf Mon Sep 17 00:00:00 2001 From: MOREL Matthieu Date: Fri, 16 Apr 2021 22:38:23 +0200 Subject: [PATCH 01/18] Fixes #324 --- cmd/common.go | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/cmd/common.go b/cmd/common.go index c32288b94..9b304490b 100644 --- a/cmd/common.go +++ b/cmd/common.go @@ -177,33 +177,27 @@ func kongVersion(config utils.KongClientConfig) (semver.Version, error) { var version string - workspace := config.Workspace - - // remove workspace to be able to call top-level / endpoint - config.Workspace = "" client, err := utils.GetKongClient(config) if err != nil { return semver.Version{}, err } - root, err := client.Root(nil) - if err != nil { - if workspace == "" { - return semver.Version{}, err - } - // try with workspace path - req, err := http.NewRequest("GET", - utils.CleanAddress(config.Address)+"/"+workspace+"/kong", - nil) + + if len(config.Workspace) > 0 { + req, err := http.NewRequest("GET", "/kong", nil) if err != nil { return semver.Version{}, err } var resp map[string]interface{} - _, err = client.Do(nil, req, &resp) + _, err = client.Do(context.TODO(), req, &resp) if err != nil { return semver.Version{}, err } version = resp["version"].(string) } else { + root, err := client.Root(context.TODO()) + if err != nil { + return semver.Version{}, err + } version = root["version"].(string) } From 5615f7311ee169f403048a6403326f6c1ef3a1f4 Mon Sep 17 00:00:00 2001 From: MOREL Matthieu Date: Sat, 17 Apr 2021 08:28:49 +0200 Subject: [PATCH 02/18] client NewRequest know the workspace not http --- cmd/common.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/cmd/common.go b/cmd/common.go index 9b304490b..a1f922f20 100644 --- a/cmd/common.go +++ b/cmd/common.go @@ -3,7 +3,6 @@ package cmd import ( "context" "fmt" - "net/http" "os" "github.com/blang/semver/v4" @@ -183,7 +182,7 @@ func kongVersion(config utils.KongClientConfig) (semver.Version, error) { } if len(config.Workspace) > 0 { - req, err := http.NewRequest("GET", "/kong", nil) + req, err := client.NewRequest("GET", "/kong", nil, nil) if err != nil { return semver.Version{}, err } From 9bfeb5d8aa8002561ad60ee45d7a6f95ff2175af Mon Sep 17 00:00:00 2001 From: MOREL Matthieu Date: Tue, 20 Apr 2021 08:01:53 +0200 Subject: [PATCH 03/18] introduce context as a parameter for kongVersion --- cmd/common.go | 11 ++++++----- cmd/ping.go | 3 ++- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/cmd/common.go b/cmd/common.go index a1f922f20..6495844cf 100644 --- a/cmd/common.go +++ b/cmd/common.go @@ -64,7 +64,7 @@ func workspaceExists(config utils.KongClientConfig) (bool, error) { } } -func syncMain(filenames []string, dry bool, parallelism, delay int, workspace string) error { +func syncMain(filenames []string, dry bool, parallelism, delay int, workspace string) error { // read target file targetContent, err := file.GetContentFromFiles(filenames) @@ -88,7 +88,7 @@ func syncMain(filenames []string, dry bool, parallelism, delay int, workspace st } // load Kong version after workspace - kongVersion, err := kongVersion(wsConfig) + kongVersion, err := kongVersion(context.Background(), wsConfig) if err != nil { return errors.Wrap(err, "reading Kong version") } @@ -172,7 +172,8 @@ func syncMain(filenames []string, dry bool, parallelism, delay int, workspace st return nil } -func kongVersion(config utils.KongClientConfig) (semver.Version, error) { +func kongVersion(ctx context.Context, + config utils.KongClientConfig) (semver.Version, error) { var version string @@ -187,13 +188,13 @@ func kongVersion(config utils.KongClientConfig) (semver.Version, error) { return semver.Version{}, err } var resp map[string]interface{} - _, err = client.Do(context.TODO(), req, &resp) + _, err = client.Do(ctx, req, &resp) if err != nil { return semver.Version{}, err } version = resp["version"].(string) } else { - root, err := client.Root(context.TODO()) + root, err := client.Root(ctx) if err != nil { return semver.Version{}, err } diff --git a/cmd/ping.go b/cmd/ping.go index 648f721c3..17e731996 100644 --- a/cmd/ping.go +++ b/cmd/ping.go @@ -1,6 +1,7 @@ package cmd import ( + "context" "fmt" "github.com/pkg/errors" @@ -21,7 +22,7 @@ can connect to Kong's Admin API or not.`, RunE: func(cmd *cobra.Command, args []string) error { wsConfig := rootConfig.ForWorkspace(pingWorkspace) - version, err := kongVersion(wsConfig) + version, err := kongVersion(context.Background(), wsConfig) if err != nil { return errors.Wrap(err, "reading Kong version") } From c70682c8a2f0491c9d884c5de677d9d59acb8495 Mon Sep 17 00:00:00 2001 From: MOREL Matthieu Date: Tue, 20 Apr 2021 08:05:02 +0200 Subject: [PATCH 04/18] apply gofmt --- cmd/common.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/common.go b/cmd/common.go index 6495844cf..4712bd5dd 100644 --- a/cmd/common.go +++ b/cmd/common.go @@ -64,7 +64,7 @@ func workspaceExists(config utils.KongClientConfig) (bool, error) { } } -func syncMain(filenames []string, dry bool, parallelism, delay int, workspace string) error { +func syncMain(filenames []string, dry bool, parallelism, delay int, workspace string) error { // read target file targetContent, err := file.GetContentFromFiles(filenames) From 3e998d03576cf53ce8348bd7bda940a0d742d4ad Mon Sep 17 00:00:00 2001 From: MOREL Matthieu Date: Tue, 20 Apr 2021 08:42:36 +0200 Subject: [PATCH 05/18] Define context as parameter for workspaceExists, listWorkspaces and syncMain functions --- cmd/common.go | 12 ++++++------ cmd/diff.go | 4 +++- cmd/dump.go | 11 ++++++----- cmd/reset.go | 7 ++++--- cmd/sync.go | 4 +++- 5 files changed, 22 insertions(+), 16 deletions(-) diff --git a/cmd/common.go b/cmd/common.go index 4712bd5dd..f7abb95d3 100644 --- a/cmd/common.go +++ b/cmd/common.go @@ -37,7 +37,7 @@ func SetStopCh(stopCh chan struct{}) { } // workspaceExists checks if workspace exists in Kong. -func workspaceExists(config utils.KongClientConfig) (bool, error) { +func workspaceExists(ctx context.Context, config utils.KongClientConfig) (bool, error) { if config.Workspace == "" { // default workspace always exists return true, nil @@ -53,7 +53,7 @@ func workspaceExists(config utils.KongClientConfig) (bool, error) { return false, err } - _, _, err = wsClient.Routes.List(context.TODO(), nil) + _, _, err = wsClient.Routes.List(ctx, nil) switch { case kong.IsNotFoundErr(err): return false, nil @@ -64,7 +64,7 @@ func workspaceExists(config utils.KongClientConfig) (bool, error) { } } -func syncMain(filenames []string, dry bool, parallelism, delay int, workspace string) error { +func syncMain(ctx context.Context, filenames []string, dry bool, parallelism, delay int, workspace string) error { // read target file targetContent, err := file.GetContentFromFiles(filenames) @@ -88,12 +88,12 @@ func syncMain(filenames []string, dry bool, parallelism, delay int, workspace st } // load Kong version after workspace - kongVersion, err := kongVersion(context.Background(), wsConfig) + kongVersion, err := kongVersion(ctx, wsConfig) if err != nil { return errors.Wrap(err, "reading Kong version") } - workspaceExists, err := workspaceExists(wsConfig) + workspaceExists, err := workspaceExists(ctx, wsConfig) if err != nil { return err } @@ -130,7 +130,7 @@ func syncMain(filenames []string, dry bool, parallelism, delay int, workspace st } if !dry { - _, err = rootClient.Workspaces.Create(nil, &kong.Workspace{Name: &wsConfig.Workspace}) + _, err = rootClient.Workspaces.Create(ctx, &kong.Workspace{Name: &wsConfig.Workspace}) if err != nil { return err } diff --git a/cmd/diff.go b/cmd/diff.go index 9f39d3966..1fd315474 100644 --- a/cmd/diff.go +++ b/cmd/diff.go @@ -1,6 +1,8 @@ package cmd import ( + "context" + "github.com/pkg/errors" "github.com/spf13/cobra" ) @@ -24,7 +26,7 @@ that will be created or updated or deleted. `, Args: validateNoArgs, RunE: func(cmd *cobra.Command, args []string) error { - return syncMain(diffCmdKongStateFile, true, diffCmdParallelism, 0, diffWorkspace) + return syncMain(context.Background(), diffCmdKongStateFile, true, diffCmdParallelism, 0, diffWorkspace) }, PreRunE: func(cmd *cobra.Command, args []string) error { if len(diffCmdKongStateFile) == 0 { diff --git a/cmd/dump.go b/cmd/dump.go index 459a61d06..5664f0abf 100644 --- a/cmd/dump.go +++ b/cmd/dump.go @@ -1,6 +1,7 @@ package cmd import ( + "context" "net/http" "strings" @@ -21,7 +22,7 @@ var ( dumpWithID bool ) -func listWorkspaces(client *kong.Client, baseURL string) ([]string, error) { +func listWorkspaces(ctx context.Context, client *kong.Client, baseURL string) ([]string, error) { type Workspace struct { Name string } @@ -35,7 +36,7 @@ func listWorkspaces(client *kong.Client, baseURL string) ([]string, error) { if err != nil { return nil, errors.Wrap(err, "building request for fetching workspaces") } - _, err = client.Do(nil, req, &response) + _, err = client.Do(ctx, req, &response) if err != nil { return nil, errors.Wrap(err, "fetching workspaces from Kong") } @@ -58,7 +59,7 @@ The file can then be read using the Sync o Diff command to again configure Kong.`, Args: validateNoArgs, RunE: func(cmd *cobra.Command, args []string) error { - + var ctx = context.Background() wsClient, err := utils.GetKongClient(rootConfig) if err != nil { return err @@ -74,7 +75,7 @@ configure Kong.`, if dumpCmdKongStateFile != "kong" { return errors.New("output-file cannot be specified with --all-workspace flag") } - workspaces, err := listWorkspaces(wsClient, rootConfig.Address) + workspaces, err := listWorkspaces(ctx, wsClient, rootConfig.Address) if err != nil { return err } @@ -118,7 +119,7 @@ configure Kong.`, if dumpWorkspace != "" { wsConfig := rootConfig.ForWorkspace(dumpWorkspace) - exists, err := workspaceExists(wsConfig) + exists, err := workspaceExists(ctx, wsConfig) if err != nil { return err } diff --git a/cmd/reset.go b/cmd/reset.go index b575cd93f..95feeffaf 100644 --- a/cmd/reset.go +++ b/cmd/reset.go @@ -1,6 +1,7 @@ package cmd import ( + "context" "github.com/kong/deck/dump" "github.com/kong/deck/reset" "github.com/kong/deck/utils" @@ -57,17 +58,17 @@ By default, this command will ask for a confirmation prompt.`, if resetAllWorkspaces && resetWorkspace != "" { return errors.New("workspace cannot be specified with --all-workspace flag") } - + var ctx = context.Background() // Kong Enterprise var workspaces []string if resetAllWorkspaces { - workspaces, err = listWorkspaces(rootClient, rootConfig.Address) + workspaces, err = listWorkspaces(ctx, rootClient, rootConfig.Address) if err != nil { return err } } if resetWorkspace != "" { - exists, err := workspaceExists(rootConfig.ForWorkspace(resetWorkspace)) + exists, err := workspaceExists(ctx, rootConfig.ForWorkspace(resetWorkspace)) if err != nil { return err } diff --git a/cmd/sync.go b/cmd/sync.go index b121e3610..baa9ffc43 100644 --- a/cmd/sync.go +++ b/cmd/sync.go @@ -1,6 +1,7 @@ package cmd import ( + "context" "github.com/pkg/errors" "github.com/spf13/cobra" ) @@ -21,7 +22,8 @@ var syncCmd = &cobra.Command{ to get Kong's state in sync with the input state.`, Args: validateNoArgs, RunE: func(cmd *cobra.Command, args []string) error { - return syncMain(syncCmdKongStateFile, false, syncCmdParallelism, syncCmdDBUpdateDelay, syncWorkspace) + return syncMain(context.Background(), syncCmdKongStateFile, false, syncCmdParallelism, + syncCmdDBUpdateDelay, syncWorkspace) }, PreRunE: func(cmd *cobra.Command, args []string) error { if len(syncCmdKongStateFile) == 0 { From 0b48815a9e7038ecc2204fb400b615389da76820 Mon Sep 17 00:00:00 2001 From: MOREL Matthieu Date: Wed, 21 Apr 2021 20:04:01 +0200 Subject: [PATCH 06/18] use cmd.Context() instead of context.Background() --- cmd/diff.go | 4 +--- cmd/dump.go | 2 +- cmd/ping.go | 3 +-- cmd/reset.go | 3 +-- cmd/sync.go | 3 +-- 5 files changed, 5 insertions(+), 10 deletions(-) diff --git a/cmd/diff.go b/cmd/diff.go index 1fd315474..03d53ecc1 100644 --- a/cmd/diff.go +++ b/cmd/diff.go @@ -1,8 +1,6 @@ package cmd import ( - "context" - "github.com/pkg/errors" "github.com/spf13/cobra" ) @@ -26,7 +24,7 @@ that will be created or updated or deleted. `, Args: validateNoArgs, RunE: func(cmd *cobra.Command, args []string) error { - return syncMain(context.Background(), diffCmdKongStateFile, true, diffCmdParallelism, 0, diffWorkspace) + return syncMain(cmd.Context(), diffCmdKongStateFile, true, diffCmdParallelism, 0, diffWorkspace) }, PreRunE: func(cmd *cobra.Command, args []string) error { if len(diffCmdKongStateFile) == 0 { diff --git a/cmd/dump.go b/cmd/dump.go index 5664f0abf..09580e37e 100644 --- a/cmd/dump.go +++ b/cmd/dump.go @@ -59,7 +59,7 @@ The file can then be read using the Sync o Diff command to again configure Kong.`, Args: validateNoArgs, RunE: func(cmd *cobra.Command, args []string) error { - var ctx = context.Background() + var ctx = cmd.Context() wsClient, err := utils.GetKongClient(rootConfig) if err != nil { return err diff --git a/cmd/ping.go b/cmd/ping.go index 17e731996..e5cedc88e 100644 --- a/cmd/ping.go +++ b/cmd/ping.go @@ -1,7 +1,6 @@ package cmd import ( - "context" "fmt" "github.com/pkg/errors" @@ -22,7 +21,7 @@ can connect to Kong's Admin API or not.`, RunE: func(cmd *cobra.Command, args []string) error { wsConfig := rootConfig.ForWorkspace(pingWorkspace) - version, err := kongVersion(context.Background(), wsConfig) + version, err := kongVersion(cmd.Context(), wsConfig) if err != nil { return errors.Wrap(err, "reading Kong version") } diff --git a/cmd/reset.go b/cmd/reset.go index 95feeffaf..0beda45a7 100644 --- a/cmd/reset.go +++ b/cmd/reset.go @@ -1,7 +1,6 @@ package cmd import ( - "context" "github.com/kong/deck/dump" "github.com/kong/deck/reset" "github.com/kong/deck/utils" @@ -58,7 +57,7 @@ By default, this command will ask for a confirmation prompt.`, if resetAllWorkspaces && resetWorkspace != "" { return errors.New("workspace cannot be specified with --all-workspace flag") } - var ctx = context.Background() + var ctx = cmd.Context() // Kong Enterprise var workspaces []string if resetAllWorkspaces { diff --git a/cmd/sync.go b/cmd/sync.go index baa9ffc43..509915192 100644 --- a/cmd/sync.go +++ b/cmd/sync.go @@ -1,7 +1,6 @@ package cmd import ( - "context" "github.com/pkg/errors" "github.com/spf13/cobra" ) @@ -22,7 +21,7 @@ var syncCmd = &cobra.Command{ to get Kong's state in sync with the input state.`, Args: validateNoArgs, RunE: func(cmd *cobra.Command, args []string) error { - return syncMain(context.Background(), syncCmdKongStateFile, false, syncCmdParallelism, + return syncMain(cmd.Context(), syncCmdKongStateFile, false, syncCmdParallelism, syncCmdDBUpdateDelay, syncWorkspace) }, PreRunE: func(cmd *cobra.Command, args []string) error { From 3162f0b843a1a8c841e5e5b6ff8bced258b41337 Mon Sep 17 00:00:00 2001 From: MOREL Matthieu Date: Sat, 24 Apr 2021 20:50:00 +0200 Subject: [PATCH 07/18] Setup integration test for kongVersion on community edition --- .ci/setup_kong.sh | 50 +++++++++++++++++++++++ .github/workflows/integration-test.yaml | 54 +++++++++++++++++++++++++ .github/workflows/test.yaml | 4 +- Makefile | 10 +++-- cmd/common_test.go | 27 +++++++++++++ 5 files changed, 140 insertions(+), 5 deletions(-) create mode 100644 .ci/setup_kong.sh create mode 100644 .github/workflows/integration-test.yaml create mode 100644 cmd/common_test.go diff --git a/.ci/setup_kong.sh b/.ci/setup_kong.sh new file mode 100644 index 000000000..3f259f41d --- /dev/null +++ b/.ci/setup_kong.sh @@ -0,0 +1,50 @@ +#!/bin/bash + +set -e +# download Kong deb + +sudo apt-get update +sudo apt-get install openssl libpcre3 procps perl wget zlibc + +function setup_kong(){ + SWITCH="1.3.100" + + URL="https://kong.bintray.com/kong-deb/kong-${KONG_VERSION}.xenial.all.deb" + + if [[ "$KONG_VERSION" > "$SWITCH" ]]; + then + URL="https://kong.bintray.com/kong-deb/kong-${KONG_VERSION}.xenial.amd64.deb" + fi + + /usr/bin/curl -sL $URL -o kong.deb +} + +function setup_kong_enterprise(){ + KONG_VERSION="${KONG_VERSION#enterprise-}" + URL="https://kong.bintray.com/kong-enterprise-edition-deb/dists/kong-enterprise-edition-${KONG_VERSION}.xenial.all.deb" + RESPONSE_CODE=$(/usr/bin/curl -sL \ + -w "%{http_code}" \ + -u $KONG_ENTERPRISE_REPO_USERNAME:$KONG_ENTERPRISE_REPO_PASSSWORD \ + $URL -o kong.deb) + if [[ $RESPONSE_CODE != "200" ]]; then + echo "error retrieving kong enterprise package from ${URL}. response code ${RESPONSE_CODE}" + exit 1 + fi +} + +if [[ $KONG_VERSION == *"enterprise"* ]]; then + setup_kong_enterprise +else + setup_kong +fi + +sudo dpkg -i kong.deb +echo $KONG_LICENSE_DATA | sudo tee /etc/kong/license.json +export KONG_LICENSE_PATH=/tmp/license.json +export KONG_PASSWORD=kong +export KONG_ENFORCE_RBAC=on +export KONG_PORTAL=on + +sudo kong migrations bootstrap +sudo kong version +sudo kong start diff --git a/.github/workflows/integration-test.yaml b/.github/workflows/integration-test.yaml new file mode 100644 index 000000000..04198834c --- /dev/null +++ b/.github/workflows/integration-test.yaml @@ -0,0 +1,54 @@ +name: 'Integration Test : Community' + +on: [push, pull_request] + +jobs: + test: + strategy: + matrix: + kong_version: + - '1.0.3' + - '1.1.2' + - '1.2.0' + - '1.3.0' + - '1.4.0' + - '2.0.4' + - '2.1.0' + - '2.2.0' + - '2.3.0' + env: + KONG_VERSION: ${{ matrix.kong_version }} + KONG_ENTERPRISE_REPO_USERNAME: ${{ secrets.KONG_ENTERPRISE_REPO_USERNAME }} + KONG_ENTERPRISE_REPO_PASSSWORD: ${{ secrets.KONG_ENTERPRISE_REPO_PASSSWORD }} + KONG_LICENSE_DATA: ${{ secrets.KONG_LICENSE_DATA }} + KONG_ANONYMOUS_REPORTS: "off" + runs-on: ubuntu-latest + services: + postgres: + image: postgres:11.6-alpine + ports: + - 5432:5432 + # needed because the postgres container does not provide a healthcheck + options: --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5 + steps: + - name: Setup go + uses: actions/setup-go@v2 + with: + go-version: '^1.16' + - name: Checkout repository + uses: actions/checkout@v2 + - name: Setup Postgres + run: | + psql -c 'create database kong;' -U postgres -h 127.0.0.1 -p 5432 + psql -c 'create user kong;' -U postgres -h 127.0.0.1 -p 5432 + psql -c 'GRANT ALL PRIVILEGES ON DATABASE "kong" to kong;' -U postgres -h 127.0.0.1 -p 5432 + - name: Setup Kong + run: make setup-kong + - name: Run tests + run: make test-coverage + - name: Upload Code Coverage + uses: codecov/codecov-action@v1 + with: + name: codecov-${{ matrix.kong_version }} + flags: ${{ matrix.kong_version }},integration,community + fail_ci_if_error: true \ No newline at end of file diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 4dc19cf82..0f4581e91 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -9,7 +9,7 @@ jobs: - name: Setup go uses: actions/setup-go@v2 with: - go-version: '^1.16' + go-version: "^1.16" - name: Checkout repository uses: actions/checkout@v2 - name: Setup golangci-lint @@ -19,7 +19,7 @@ jobs: - name: Verify Codegen run: make verify-codegen - name: Run tests with Coverage - run: make coverage + run: make test-coverage - name: Upload Code Coverage run: "bash <(curl -s https://codecov.io/bash)" - name: Build diff --git a/Makefile b/Makefile index cff781319..25095fab2 100644 --- a/Makefile +++ b/Makefile @@ -25,9 +25,13 @@ update-codegen: go generate ./... ./scripts/update-deepcopy-gen.sh -.PHONY: coverage -coverage: +.PHONY: test-coverage +test-coverage: go test -race -v -count=1 -coverprofile=coverage.out.tmp ./... # ignoring generated code for coverage grep -E -v 'generated.deepcopy.go' coverage.out.tmp > coverage.out - rm -f coverage.out.tmp + rm -f coverage.out.tmp + +.PHONY: setup-kong +setup-kong: + bash .ci/setup_kong.sh \ No newline at end of file diff --git a/cmd/common_test.go b/cmd/common_test.go new file mode 100644 index 000000000..5458a4a96 --- /dev/null +++ b/cmd/common_test.go @@ -0,0 +1,27 @@ +package cmd + +import ( + "github.com/kong/deck/utils" + "github.com/stretchr/testify/assert" + "os" + "testing" + "github.com/blang/semver/v4" +) + +func Test_kongVersion(T *testing.T) { + kongVersion, _ := os.LookupEnv("KONG_VERSION") + expectedVersion = semver.MustParse(kongVersion) + version, err := kongVersion(nil, NewTestClientConfig()) + assert := assert.New(T) + assert.Nil(err) + assert.NotNil(version) + assert.Equal(version, expectedVersion, "The two version should be identical") +} + +func NewTestClientConfig() utils.KongClientConfig { + kongAdminToken, _ := os.LookupEnv("KONG_ADMIN_TOKEN") + return utils.KongClientConfig{ + Address: "http://localhost:8001", + Headers: []string{"kong-admin-token:" + kongAdminToken}, + } +} From c27373ca4f43af06d2d16280d32c4e62185f118e Mon Sep 17 00:00:00 2001 From: MOREL Matthieu Date: Sat, 24 Apr 2021 20:56:12 +0200 Subject: [PATCH 08/18] Variables declaration --- cmd/common_test.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cmd/common_test.go b/cmd/common_test.go index 5458a4a96..2d71cce7f 100644 --- a/cmd/common_test.go +++ b/cmd/common_test.go @@ -1,16 +1,16 @@ package cmd import ( + "github.com/blang/semver/v4" "github.com/kong/deck/utils" "github.com/stretchr/testify/assert" "os" "testing" - "github.com/blang/semver/v4" ) func Test_kongVersion(T *testing.T) { - kongVersion, _ := os.LookupEnv("KONG_VERSION") - expectedVersion = semver.MustParse(kongVersion) + kongVersionEnv, _ := os.LookupEnv("KONG_VERSION") + var expectedVersion = semver.MustParse(kongVersionEnv) version, err := kongVersion(nil, NewTestClientConfig()) assert := assert.New(T) assert.Nil(err) From 2a9894f20e1497df9e865e704c1c9400df1c9822 Mon Sep 17 00:00:00 2001 From: MOREL Matthieu Date: Sat, 24 Apr 2021 21:06:49 +0200 Subject: [PATCH 09/18] build only for integration test and compare only minor and major --- .github/workflows/integration-test.yaml | 26 ++++++++++++------------- Makefile | 7 +++++++ cmd/common_test.go | 4 +++- 3 files changed, 23 insertions(+), 14 deletions(-) diff --git a/.github/workflows/integration-test.yaml b/.github/workflows/integration-test.yaml index 04198834c..6a0cc43aa 100644 --- a/.github/workflows/integration-test.yaml +++ b/.github/workflows/integration-test.yaml @@ -1,4 +1,4 @@ -name: 'Integration Test : Community' +name: "Integration Test : Community" on: [push, pull_request] @@ -7,15 +7,15 @@ jobs: strategy: matrix: kong_version: - - '1.0.3' - - '1.1.2' - - '1.2.0' - - '1.3.0' - - '1.4.0' - - '2.0.4' - - '2.1.0' - - '2.2.0' - - '2.3.0' + - "1.0.3" + - "1.1.2" + - "1.2.0" + - "1.3.0" + - "1.4.0" + - "2.0.4" + - "2.1.0" + - "2.2.0" + - "2.3.0" env: KONG_VERSION: ${{ matrix.kong_version }} KONG_ENTERPRISE_REPO_USERNAME: ${{ secrets.KONG_ENTERPRISE_REPO_USERNAME }} @@ -34,7 +34,7 @@ jobs: - name: Setup go uses: actions/setup-go@v2 with: - go-version: '^1.16' + go-version: "^1.16" - name: Checkout repository uses: actions/checkout@v2 - name: Setup Postgres @@ -45,10 +45,10 @@ jobs: - name: Setup Kong run: make setup-kong - name: Run tests - run: make test-coverage + run: make integration-test-coverage - name: Upload Code Coverage uses: codecov/codecov-action@v1 with: name: codecov-${{ matrix.kong_version }} flags: ${{ matrix.kong_version }},integration,community - fail_ci_if_error: true \ No newline at end of file + fail_ci_if_error: true diff --git a/Makefile b/Makefile index 25095fab2..54f299251 100644 --- a/Makefile +++ b/Makefile @@ -32,6 +32,13 @@ test-coverage: grep -E -v 'generated.deepcopy.go' coverage.out.tmp > coverage.out rm -f coverage.out.tmp +.PHONY: integration-test-coverage +test-coverage: + go test -tags=integration -race -v -count=1 -coverprofile=coverage.out.tmp ./... + # ignoring generated code for coverage + grep -E -v 'generated.deepcopy.go' coverage.out.tmp > coverage.out + rm -f coverage.out.tmp + .PHONY: setup-kong setup-kong: bash .ci/setup_kong.sh \ No newline at end of file diff --git a/cmd/common_test.go b/cmd/common_test.go index 2d71cce7f..2b725616f 100644 --- a/cmd/common_test.go +++ b/cmd/common_test.go @@ -1,3 +1,4 @@ +// +build integration package cmd import ( @@ -15,7 +16,8 @@ func Test_kongVersion(T *testing.T) { assert := assert.New(T) assert.Nil(err) assert.NotNil(version) - assert.Equal(version, expectedVersion, "The two version should be identical") + assert.Equal(version.Major, expectedVersion.Major, "The two version should have the same major") + assert.Equal(version.Minor, expectedVersion.Minor, "The two version should have the same minor") } func NewTestClientConfig() utils.KongClientConfig { From bc2a432b0994cb6a8084c329f13168c56ff0f226 Mon Sep 17 00:00:00 2001 From: MOREL Matthieu Date: Sat, 24 Apr 2021 21:10:28 +0200 Subject: [PATCH 10/18] build tag is followed by a blank line --- cmd/common_test.go | 1 + 1 file changed, 1 insertion(+) diff --git a/cmd/common_test.go b/cmd/common_test.go index 2b725616f..dfef34a3a 100644 --- a/cmd/common_test.go +++ b/cmd/common_test.go @@ -1,4 +1,5 @@ // +build integration + package cmd import ( From 5301d49fb8eac7e641a8d3792f1fcb19f7a69fa3 Mon Sep 17 00:00:00 2001 From: MOREL Matthieu Date: Sat, 24 Apr 2021 21:13:42 +0200 Subject: [PATCH 11/18] makefile name --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 54f299251..e65742103 100644 --- a/Makefile +++ b/Makefile @@ -33,7 +33,7 @@ test-coverage: rm -f coverage.out.tmp .PHONY: integration-test-coverage -test-coverage: +integration-test-coverage: go test -tags=integration -race -v -count=1 -coverprofile=coverage.out.tmp ./... # ignoring generated code for coverage grep -E -v 'generated.deepcopy.go' coverage.out.tmp > coverage.out From 29d29687a20dc9ad2330ec50ac5846dfc8197cac Mon Sep 17 00:00:00 2001 From: MOREL Matthieu Date: Sat, 24 Apr 2021 21:30:26 +0200 Subject: [PATCH 12/18] Test with workspace --- cmd/common_test.go | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/cmd/common_test.go b/cmd/common_test.go index dfef34a3a..77c2a7cea 100644 --- a/cmd/common_test.go +++ b/cmd/common_test.go @@ -10,21 +10,41 @@ import ( "testing" ) +var ( + defaultCtx = context.Background() +) + func Test_kongVersion(T *testing.T) { kongVersionEnv, _ := os.LookupEnv("KONG_VERSION") var expectedVersion = semver.MustParse(kongVersionEnv) - version, err := kongVersion(nil, NewTestClientConfig()) + var config = NewTestClientConfig("") + version, err := kongVersion(defaultCtx, config) + assert := assert.New(T) + assert.Nil(err) + assert.NotNil(version) + assert.Equal(version.Major, expectedVersion.Major, "The two version should have the same major") + assert.Equal(version.Minor, expectedVersion.Minor, "The two version should have the same minor") + + client, err := utils.GetKongClient(config) + ws := &kong.Workspace{ + Name: kong.String("test"), + } + client.Workspaces.Create(defaultCtx, ws) + config = NewTestClientConfig(*ws.Name) + version, err := kongVersion(defaultCtx, config) assert := assert.New(T) assert.Nil(err) assert.NotNil(version) assert.Equal(version.Major, expectedVersion.Major, "The two version should have the same major") assert.Equal(version.Minor, expectedVersion.Minor, "The two version should have the same minor") + client.Workspaces.Delete(defaultCtx, *ws.Name) } -func NewTestClientConfig() utils.KongClientConfig { +func NewTestClientConfig(workspace string) utils.KongClientConfig { kongAdminToken, _ := os.LookupEnv("KONG_ADMIN_TOKEN") return utils.KongClientConfig{ - Address: "http://localhost:8001", - Headers: []string{"kong-admin-token:" + kongAdminToken}, + Address: "http://localhost:8001", + Workspace: workspace, + Headers: []string{"kong-admin-token:" + kongAdminToken}, } } From 17b96279736a8d4407f8a89d57110bb25c11a094 Mon Sep 17 00:00:00 2001 From: MOREL Matthieu Date: Sat, 24 Apr 2021 21:36:08 +0200 Subject: [PATCH 13/18] imports and new assertion --- cmd/common_test.go | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/cmd/common_test.go b/cmd/common_test.go index 77c2a7cea..f26a5b1cd 100644 --- a/cmd/common_test.go +++ b/cmd/common_test.go @@ -3,8 +3,10 @@ package cmd import ( + "context" "github.com/blang/semver/v4" "github.com/kong/deck/utils" + "github.com/kong/go-kong/kong" "github.com/stretchr/testify/assert" "os" "testing" @@ -32,11 +34,11 @@ func Test_kongVersion(T *testing.T) { client.Workspaces.Create(defaultCtx, ws) config = NewTestClientConfig(*ws.Name) version, err := kongVersion(defaultCtx, config) - assert := assert.New(T) - assert.Nil(err) - assert.NotNil(version) - assert.Equal(version.Major, expectedVersion.Major, "The two version should have the same major") - assert.Equal(version.Minor, expectedVersion.Minor, "The two version should have the same minor") + assert2 := assert.New(T) + assert2.Nil(err) + assert2.NotNil(version) + assert2.Equal(version.Major, expectedVersion.Major, "The two version should have the same major") + assert2.Equal(version.Minor, expectedVersion.Minor, "The two version should have the same minor") client.Workspaces.Delete(defaultCtx, *ws.Name) } From f4347a6836ac6e77aa2ddbae92fefdeca45d7bcd Mon Sep 17 00:00:00 2001 From: MOREL Matthieu Date: Sat, 24 Apr 2021 21:41:22 +0200 Subject: [PATCH 14/18] Fix test --- cmd/common_test.go | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/cmd/common_test.go b/cmd/common_test.go index f26a5b1cd..7c753900d 100644 --- a/cmd/common_test.go +++ b/cmd/common_test.go @@ -34,12 +34,11 @@ func Test_kongVersion(T *testing.T) { client.Workspaces.Create(defaultCtx, ws) config = NewTestClientConfig(*ws.Name) version, err := kongVersion(defaultCtx, config) - assert2 := assert.New(T) - assert2.Nil(err) - assert2.NotNil(version) - assert2.Equal(version.Major, expectedVersion.Major, "The two version should have the same major") - assert2.Equal(version.Minor, expectedVersion.Minor, "The two version should have the same minor") - client.Workspaces.Delete(defaultCtx, *ws.Name) + assert.Nil(err) + assert.NotNil(version) + assert.Equal(version.Major, expectedVersion.Major, "The two version should have the same major") + assert.Equal(version.Minor, expectedVersion.Minor, "The two version should have the same minor") + client.Workspaces.Delete(defaultCtx, ws.Name) } func NewTestClientConfig(workspace string) utils.KongClientConfig { From aa4c66fda1272fdedb01551e49044aca83768dc3 Mon Sep 17 00:00:00 2001 From: MOREL Matthieu Date: Sat, 24 Apr 2021 21:44:15 +0200 Subject: [PATCH 15/18] Workspace version --- cmd/common_test.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/cmd/common_test.go b/cmd/common_test.go index 7c753900d..2f8d873cc 100644 --- a/cmd/common_test.go +++ b/cmd/common_test.go @@ -33,11 +33,11 @@ func Test_kongVersion(T *testing.T) { } client.Workspaces.Create(defaultCtx, ws) config = NewTestClientConfig(*ws.Name) - version, err := kongVersion(defaultCtx, config) + workspaceversion, err := kongVersion(defaultCtx, config) assert.Nil(err) - assert.NotNil(version) - assert.Equal(version.Major, expectedVersion.Major, "The two version should have the same major") - assert.Equal(version.Minor, expectedVersion.Minor, "The two version should have the same minor") + assert.NotNil(workspaceversion) + assert.Equal(workspaceversion.Major, expectedVersion.Major, "The two version should have the same major") + assert.Equal(workspaceversion.Minor, expectedVersion.Minor, "The two version should have the same minor") client.Workspaces.Delete(defaultCtx, ws.Name) } From 2fabc8b1d9a7a580824f32a17bd71210c7339f85 Mon Sep 17 00:00:00 2001 From: MOREL Matthieu Date: Sat, 24 Apr 2021 21:52:23 +0200 Subject: [PATCH 16/18] workspace only for enterprise --- cmd/common_test.go | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/cmd/common_test.go b/cmd/common_test.go index 2f8d873cc..327629997 100644 --- a/cmd/common_test.go +++ b/cmd/common_test.go @@ -27,18 +27,20 @@ func Test_kongVersion(T *testing.T) { assert.Equal(version.Major, expectedVersion.Major, "The two version should have the same major") assert.Equal(version.Minor, expectedVersion.Minor, "The two version should have the same minor") - client, err := utils.GetKongClient(config) - ws := &kong.Workspace{ - Name: kong.String("test"), + if strings.Contains(kongVersionEnv, "enterprise") { + t.Log("Enterprise test Kong") + client, err := utils.GetKongClient(config) + ws := &kong.Workspace{ + Name: kong.String("test"), + } + client.Workspaces.Create(defaultCtx, ws) + config = NewTestClientConfig(*ws.Name) + workspaceversion, err := kongVersion(defaultCtx, config) + assert.Nil(err) + assert.NotNil(workspaceversion) + assert.Equal(workspaceversion.Major, expectedVersion.Major, "The two version should have the same major") + assert.Equal(workspaceversion.Minor, expectedVersion.Minor, "The two version should have the same minor") } - client.Workspaces.Create(defaultCtx, ws) - config = NewTestClientConfig(*ws.Name) - workspaceversion, err := kongVersion(defaultCtx, config) - assert.Nil(err) - assert.NotNil(workspaceversion) - assert.Equal(workspaceversion.Major, expectedVersion.Major, "The two version should have the same major") - assert.Equal(workspaceversion.Minor, expectedVersion.Minor, "The two version should have the same minor") - client.Workspaces.Delete(defaultCtx, ws.Name) } func NewTestClientConfig(workspace string) utils.KongClientConfig { From 72405b3fc7e163ee4eb8113942191add839a303a Mon Sep 17 00:00:00 2001 From: MOREL Matthieu Date: Sat, 24 Apr 2021 21:56:31 +0200 Subject: [PATCH 17/18] missing imports --- cmd/common_test.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cmd/common_test.go b/cmd/common_test.go index 327629997..4fb093598 100644 --- a/cmd/common_test.go +++ b/cmd/common_test.go @@ -9,6 +9,7 @@ import ( "github.com/kong/go-kong/kong" "github.com/stretchr/testify/assert" "os" + "strings" "testing" ) @@ -28,7 +29,7 @@ func Test_kongVersion(T *testing.T) { assert.Equal(version.Minor, expectedVersion.Minor, "The two version should have the same minor") if strings.Contains(kongVersionEnv, "enterprise") { - t.Log("Enterprise test Kong") + T.Log("Enterprise test Kong") client, err := utils.GetKongClient(config) ws := &kong.Workspace{ Name: kong.String("test"), From cc50af7c3d712c140811fcc21f3425e4b3f98b9f Mon Sep 17 00:00:00 2001 From: MOREL Matthieu Date: Mon, 26 Apr 2021 07:41:43 +0200 Subject: [PATCH 18/18] Integration tests for enterprise, deletion of unused env variables in community edition integration tests --- .../integration-test-enterprise.yaml | 52 +++++++++++++++++++ .github/workflows/integration-test.yaml | 2 - cmd/common_test.go | 45 +++++++++++----- 3 files changed, 83 insertions(+), 16 deletions(-) create mode 100644 .github/workflows/integration-test-enterprise.yaml diff --git a/.github/workflows/integration-test-enterprise.yaml b/.github/workflows/integration-test-enterprise.yaml new file mode 100644 index 000000000..e616226b3 --- /dev/null +++ b/.github/workflows/integration-test-enterprise.yaml @@ -0,0 +1,52 @@ +name: "Integration Test : Enterprise" + +on: [push, pull_request] + +jobs: + test: + continue-on-error: true + strategy: + matrix: + kong_version: + - "enterprise-1.3.0.2" + - "enterprise-1.5.0.9" + - "enterprise-2.1.4.4" + - "enterprise-2.2.1.0" + - "enterprise-2.3.2.0" + env: + KONG_VERSION: ${{ matrix.kong_version }} + KONG_ENTERPRISE_REPO_USERNAME: ${{ secrets.KONG_ENTERPRISE_REPO_USERNAME }} + KONG_ENTERPRISE_REPO_PASSSWORD: ${{ secrets.KONG_ENTERPRISE_REPO_PASSSWORD }} + KONG_LICENSE_DATA: ${{ secrets.KONG_LICENSE_DATA }} + KONG_ANONYMOUS_REPORTS: "off" + KONG_ADMIN_TOKEN: kong + runs-on: ubuntu-latest + services: + postgres: + image: postgres:11.6-alpine + ports: + - 5432:5432 + # needed because the postgres container does not provide a healthcheck + options: --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5 + steps: + - name: Setup go + uses: actions/setup-go@v2 + with: + go-version: "^1.16" + - name: Checkout repository + uses: actions/checkout@v2 + - name: Setup Postgres + run: | + psql -c 'create database kong;' -U postgres -h 127.0.0.1 -p 5432 + psql -c 'create user kong;' -U postgres -h 127.0.0.1 -p 5432 + psql -c 'GRANT ALL PRIVILEGES ON DATABASE "kong" to kong;' -U postgres -h 127.0.0.1 -p 5432 + - name: Setup Kong + run: make setup-kong + - name: Run tests + run: make integration-test-coverage + - name: Upload Code Coverage + uses: codecov/codecov-action@v1 + with: + name: codecov-${{ matrix.kong_version }} + flags: ${{ matrix.kong_version }},integration,enterprise + fail_ci_if_error: true diff --git a/.github/workflows/integration-test.yaml b/.github/workflows/integration-test.yaml index 6a0cc43aa..49a8162af 100644 --- a/.github/workflows/integration-test.yaml +++ b/.github/workflows/integration-test.yaml @@ -18,8 +18,6 @@ jobs: - "2.3.0" env: KONG_VERSION: ${{ matrix.kong_version }} - KONG_ENTERPRISE_REPO_USERNAME: ${{ secrets.KONG_ENTERPRISE_REPO_USERNAME }} - KONG_ENTERPRISE_REPO_PASSSWORD: ${{ secrets.KONG_ENTERPRISE_REPO_PASSSWORD }} KONG_LICENSE_DATA: ${{ secrets.KONG_LICENSE_DATA }} KONG_ANONYMOUS_REPORTS: "off" runs-on: ubuntu-latest diff --git a/cmd/common_test.go b/cmd/common_test.go index 4fb093598..7954b0c1e 100644 --- a/cmd/common_test.go +++ b/cmd/common_test.go @@ -17,8 +17,11 @@ var ( defaultCtx = context.Background() ) -func Test_kongVersion(T *testing.T) { +func Test_kongVersion_Community(T *testing.T) { kongVersionEnv, _ := os.LookupEnv("KONG_VERSION") + if strings.Contains(kongVersionEnv, "enterprise") { + T.Skip() + } var expectedVersion = semver.MustParse(kongVersionEnv) var config = NewTestClientConfig("") version, err := kongVersion(defaultCtx, config) @@ -27,21 +30,35 @@ func Test_kongVersion(T *testing.T) { assert.NotNil(version) assert.Equal(version.Major, expectedVersion.Major, "The two version should have the same major") assert.Equal(version.Minor, expectedVersion.Minor, "The two version should have the same minor") +} - if strings.Contains(kongVersionEnv, "enterprise") { - T.Log("Enterprise test Kong") - client, err := utils.GetKongClient(config) - ws := &kong.Workspace{ - Name: kong.String("test"), - } - client.Workspaces.Create(defaultCtx, ws) - config = NewTestClientConfig(*ws.Name) - workspaceversion, err := kongVersion(defaultCtx, config) - assert.Nil(err) - assert.NotNil(workspaceversion) - assert.Equal(workspaceversion.Major, expectedVersion.Major, "The two version should have the same major") - assert.Equal(workspaceversion.Minor, expectedVersion.Minor, "The two version should have the same minor") +func Test_kongVersion_Enterprise(T *testing.T) { + kongVersionEnv, _ := os.LookupEnv("KONG_VERSION") + if !strings.Contains(kongVersionEnv, "enterprise") { + T.Skip() } + kongVersionEnv = strings.Replace(kongVersionEnv, "enterprise-", "", 1) + var expectedVersion = semver.MustParse(kongVersionEnv) + var config = NewTestClientConfig("") + version, err := kongVersion(defaultCtx, config) + assert := assert.New(T) + assert.Nil(err) + assert.NotNil(version) + assert.Equal(version.Major, expectedVersion.Major, "The two version should have the same major") + assert.Equal(version.Minor, expectedVersion.Minor, "The two version should have the same minor") + + client, err := utils.GetKongClient(config) + ws := &kong.Workspace{ + Name: kong.String("test"), + } + client.Workspaces.Create(defaultCtx, ws) + config = NewTestClientConfig(*ws.Name) + workspaceversion, err := kongVersion(defaultCtx, config) + assert.Nil(err) + assert.NotNil(workspaceversion) + assert.Equal(workspaceversion.Major, expectedVersion.Major, "The two version should have the same major") + assert.Equal(workspaceversion.Minor, expectedVersion.Minor, "The two version should have the same minor") + } func NewTestClientConfig(workspace string) utils.KongClientConfig {