Skip to content
Closed
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
54 commits
Select commit Hold shift + click to select a range
a59724b
chore(deps): update module github.com/onsi/gomega to v1.22.1
renovate[bot] Oct 11, 2022
c9ff25b
chore(deps): update cimg/go docker tag to v1.19.2
renovate[bot] Oct 10, 2022
79757d0
fix: add base href for k3d uri
a-cordier Oct 13, 2022
59b42b5
chore(release): 0.1.0-alpha.6 [skip ci]
graviteeio Oct 14, 2022
f2b16f0
chore(deps): update gravitee orb to v2.1.16
renovate[bot] Oct 17, 2022
8a20fcf
chore(deps): update kubernetes packages to v0.25.3
renovate[bot] Oct 17, 2022
2278a16
fix: rename cors fields to match v3 definition
a-cordier Oct 14, 2022
8be05d8
chore(release): 0.1.0-alpha.7 [skip ci]
graviteeio Oct 17, 2022
19e9dd3
fix: merge create and update of api definition
a-cordier Oct 18, 2022
83bb2c5
refactor: rename status generation
a-cordier Oct 20, 2022
b309629
refactor: rename add finalizer method
a-cordier Oct 20, 2022
78ed8e2
refactor: rename has finalizer method
a-cordier Oct 20, 2022
7f68a69
chore(release): 0.1.0-alpha.8 [skip ci]
graviteeio Oct 20, 2022
400c160
refactor: rename has management context method
a-cordier Oct 21, 2022
9c69558
chore(deps): update mcr.microsoft.com/azure-cli docker tag to v2.41.0
renovate[bot] Oct 24, 2022
97901ed
chore(deps): update module github.com/onsi/ginkgo/v2 to v2.4.0
renovate[bot] Oct 24, 2022
7427457
fix: import api with life cycle state
Okhelifi Oct 25, 2022
3b98614
test: add context ref on update
a-cordier Oct 21, 2022
b75aec8
chore(release): 0.1.0-alpha.9 [skip ci]
graviteeio Oct 25, 2022
933af8d
ci: remove wait step from test job
a-cordier Oct 21, 2022
c73cc63
refactor: error handling
a-cordier Oct 21, 2022
dd74bba
refactor: move integration tests to their own package
a-cordier Oct 27, 2022
43276ce
fix: reconcile api resources on context updates
a-cordier Oct 27, 2022
8f4e099
chore(release): 0.1.0-alpha.10 [skip ci]
graviteeio Oct 27, 2022
bbe475a
fix: add enabled in health check model
Okhelifi Oct 27, 2022
71346fa
fix: change fail over data type
Okhelifi Oct 27, 2022
565d745
fix: align endpoint mapping with apim
Okhelifi Oct 27, 2022
62323fb
docs: update reference
Okhelifi Oct 28, 2022
e7f1083
chore(release): 0.1.0-alpha.11 [skip ci]
graviteeio Oct 28, 2022
b54d9a7
fix: reference secret in context
a-cordier Oct 27, 2022
39c682f
refactor: move test fixtures and const to internal
a-cordier Oct 28, 2022
8a94424
refactor: define fixture paths as constants
a-cordier Oct 28, 2022
3907f83
refactor: default secret namespace to context one
a-cordier Oct 28, 2022
0ac9d4b
chore(release): 0.1.0-alpha.12 [skip ci]
graviteeio Oct 28, 2022
3aebf3e
chore(deps): update module github.com/onsi/gomega to v1.23.0
renovate[bot] Oct 31, 2022
814794e
ci: update go version for machine executor to 1.19.2
a-cordier Oct 31, 2022
4bd7456
fix: add rbac marker for secret lists
a-cordier Nov 2, 2022
b3c431b
chore(release): 0.1.0-alpha.13 [skip ci]
graviteeio Nov 2, 2022
34a7b91
refactor(tests): make context names random
a-cordier Oct 28, 2022
81933cb
test: delete all resources at once after suite
a-cordier Oct 29, 2022
1b29bd3
refactor(test): move unit tests to ginkgo
a-cordier Nov 1, 2022
111cc3e
ci: run tests with ginkgo cli
a-cordier Nov 1, 2022
784abbe
refactor: log bad request error messages
a-cordier Oct 31, 2022
c4032eb
fix: import api with several endpoint groups
a-cordier Oct 31, 2022
a874ac6
fix: import api with disabled health check
a-cordier Nov 2, 2022
7179561
fix: import API with logging
a-cordier Nov 2, 2022
28c7acc
test: add table test with featured api definitions
a-cordier Nov 2, 2022
6e81619
chore: clean up config sample files
a-cordier Nov 2, 2022
0afeb80
chore(release): 0.1.0-alpha.14 [skip ci]
graviteeio Nov 3, 2022
4e45fbc
ci: fix ginkgo flags
a-cordier Nov 4, 2022
9f12dff
test: add create test for api with metadata
a-cordier Nov 4, 2022
9867084
test: add opt in option to run the operator locally
a-cordier Nov 3, 2022
ddc6af5
test: update management context when running in cluster
a-cordier Nov 3, 2022
1392143
chore: generate management context webhook
a-cordier Nov 4, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
refactor: move integration tests to their own package
  • Loading branch information
a-cordier committed Oct 27, 2022
commit dd74bba9ef97e45664cfae3dbbdce798dcd83d9d
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ 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 apidefinition
package test

import (
"encoding/json"
Expand All @@ -40,7 +40,6 @@ import (
gio "github.com/gravitee-io/gravitee-kubernetes-operator/api/v1alpha1"
managementapi "github.com/gravitee-io/gravitee-kubernetes-operator/internal/apim/managementapi"
"github.com/gravitee-io/gravitee-kubernetes-operator/internal/utils"
"github.com/gravitee-io/gravitee-kubernetes-operator/test"
)

var _ = Describe("API Definition Controller", func() {
Expand All @@ -59,7 +58,7 @@ var _ = Describe("API Definition Controller", func() {
BeforeEach(func() {
By("Without a management context")

apiDefinition, err := test.NewApiDefinition("../../../config/samples/apim/basic-example.yml")
apiDefinition, err := NewApiDefinition("../config/samples/apim/basic-example.yml")
Expect(err).ToNot(HaveOccurred())

apiDefinitionFixture = apiDefinition
Expand All @@ -83,7 +82,7 @@ var _ = Describe("API Definition Controller", func() {
return err == nil && apiDefinition.Status.CrossID != ""
}, timeout, interval).Should(BeTrue())

var endpoint = test.GatewayUrl + apiDefinition.Spec.Proxy.VirtualHosts[0].Path
var endpoint = GatewayUrl + apiDefinition.Spec.Proxy.VirtualHosts[0].Path

expectedApiName := apiDefinitionFixture.Spec.Name
Expect(apiDefinition.Spec.Name).Should(Equal(expectedApiName))
Expand All @@ -104,11 +103,11 @@ var _ = Describe("API Definition Controller", func() {
var contextLookupKey types.NamespacedName

BeforeEach(func() {
managementContext, err := test.NewManagementContext(
"../../../config/samples/context/dev/managementcontext_credentials.yaml")
managementContext, err := NewManagementContext(
"../config/samples/context/dev/managementcontext_credentials.yaml")
Expect(err).ToNot(HaveOccurred())

apiDefinition, err := test.NewApiDefinition("../../../config/samples/apim/basic-example-with-ctx.yml")
apiDefinition, err := NewApiDefinition("../config/samples/apim/basic-example-with-ctx.yml")
Expect(err).ToNot(HaveOccurred())

apiDefinitionFixture = apiDefinition
Expand Down Expand Up @@ -146,7 +145,7 @@ var _ = Describe("API Definition Controller", func() {

By("Call gateway endpoint and expect the API to be available")

var endpoint = test.GatewayUrl + apiDefinition.Spec.Proxy.VirtualHosts[0].Path
var endpoint = GatewayUrl + apiDefinition.Spec.Proxy.VirtualHosts[0].Path

Eventually(func() bool {
res, callErr := httpClient.Get(endpoint)
Expand Down Expand Up @@ -196,7 +195,7 @@ var _ = Describe("API Definition Controller", func() {

By("Call gateway endpoint and expect the API not to be available")

var endpoint = test.GatewayUrl + apiDefinition.Spec.Proxy.VirtualHosts[0].Path
var endpoint = GatewayUrl + apiDefinition.Spec.Proxy.VirtualHosts[0].Path

Eventually(func() bool {
res, callErr := httpClient.Get(endpoint)
Expand Down Expand Up @@ -262,7 +261,7 @@ var _ = Describe("API Definition Controller", func() {

By("Call gateway endpoint and expect the API to be available")

var endpoint = test.GatewayUrl + apiDefinition.Spec.Proxy.VirtualHosts[0].Path
var endpoint = GatewayUrl + apiDefinition.Spec.Proxy.VirtualHosts[0].Path

Eventually(func() bool {
res, callErr := httpClient.Get(endpoint)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ 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 apidefinition
package test

import (
"net/http"
Expand All @@ -39,7 +39,6 @@ import (
"k8s.io/apimachinery/pkg/types"

gio "github.com/gravitee-io/gravitee-kubernetes-operator/api/v1alpha1"
"github.com/gravitee-io/gravitee-kubernetes-operator/test"
)

var _ = Describe("API Definition Controller", func() {
Expand All @@ -53,13 +52,13 @@ var _ = Describe("API Definition Controller", func() {

BeforeEach(func() {
By("Create a management context to synchronize with the REST API")
managementContext, err := test.NewManagementContext(
"../../../config/samples/context/dev/managementcontext_credentials.yaml")
managementContext, err := NewManagementContext(
"../config/samples/context/dev/managementcontext_credentials.yaml")
Expect(err).ToNot(HaveOccurred())
Expect(k8sClient.Create(ctx, managementContext)).Should(Succeed())

By("Create an API definition resource stared by default")
apiDefinition, err := test.NewApiDefinition("../../../config/samples/apim/basic-example-with-ctx.yml")
apiDefinition, err := NewApiDefinition("../config/samples/apim/basic-example-with-ctx.yml")
Expect(err).ToNot(HaveOccurred())
Expect(k8sClient.Create(ctx, apiDefinition)).Should(Succeed())

Expand All @@ -84,7 +83,7 @@ var _ = Describe("API Definition Controller", func() {
By("Call initial API definition URL and expect no error")

// Check created api is callable
var gatewayEndpoint = test.GatewayUrl + createdApiDefinition.Spec.Proxy.VirtualHosts[0].Path
var gatewayEndpoint = GatewayUrl + createdApiDefinition.Spec.Proxy.VirtualHosts[0].Path

Eventually(func() bool {
res, callErr := httpClient.Get(gatewayEndpoint)
Expand Down Expand Up @@ -138,7 +137,7 @@ var _ = Describe("API Definition Controller", func() {

By("Call initial API definition URL and expect no error")
// Check created api is callable
var gatewayEndpoint = test.GatewayUrl + createdApiDefinition.Spec.Proxy.VirtualHosts[0].Path
var gatewayEndpoint = GatewayUrl + createdApiDefinition.Spec.Proxy.VirtualHosts[0].Path

Eventually(func() bool {
res, callErr := httpClient.Get(gatewayEndpoint)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,17 +25,20 @@ 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 apidefinition
package test

import (
"net/http"
"time"

. "github.com/onsi/ginkgo/v2"
. "github.com/onsi/gomega"
"k8s.io/apimachinery/pkg/types"
k8sUtil "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"

gio "github.com/gravitee-io/gravitee-kubernetes-operator/api/v1alpha1"
managementApi "github.com/gravitee-io/gravitee-kubernetes-operator/internal/apim/managementapi"
"github.com/gravitee-io/gravitee-kubernetes-operator/pkg/keys"
"github.com/gravitee-io/gravitee-kubernetes-operator/test"
)

var _ = Describe("Checking NoneRecoverable && Recoverable error", Label("DisableSmokeExpect"), func() {
Expand All @@ -50,13 +53,13 @@ var _ = Describe("Checking NoneRecoverable && Recoverable error", Label("Disable

BeforeEach(func() {
By("Create a management context to synchronize with the REST API")
managementContext, err := test.NewManagementContext(
"../../../config/samples/context/dev/managementcontext_credentials.yaml")
managementContext, err := NewManagementContext(
"../config/samples/context/dev/managementcontext_credentials.yaml")
Expect(err).ToNot(HaveOccurred())
Expect(k8sClient.Create(ctx, managementContext)).Should(Succeed())

By("Create an API definition resource stared by default")
apiDefinition, err := test.NewApiDefinition("../../../config/samples/apim/basic-example-with-ctx.yml")
apiDefinition, err := NewApiDefinition("../config/samples/apim/basic-example-with-ctx.yml")
Expect(err).ToNot(HaveOccurred())
Expect(k8sClient.Create(ctx, apiDefinition)).Should(Succeed())

Expand Down Expand Up @@ -109,12 +112,12 @@ var _ = Describe("Checking NoneRecoverable && Recoverable error", Label("Disable
err = k8sClient.Update(ctx, managementContextRight)
Expect(err).ToNot(HaveOccurred())

By("Update the API definition")
// TODO: find a way to reconcile the API definition when management context is updated ?
apiDefinition = savedApiDefinition.DeepCopy()
apiDefinition.Spec.Name = "new-name-v2"
err = k8sClient.Update(ctx, apiDefinition)
Expect(err).ToNot(HaveOccurred())
httpClient := http.Client{Timeout: 5 * time.Second}
apimClient := managementApi.NewClient(ctx, managementContextFixture, httpClient)
Eventually(func() bool {
api, apiErr := apimClient.GetByCrossId(apiDefinition.Status.CrossID)
return apiErr == nil && api.Name == "new-name" && api.Id == apiDefinition.Status.ID
}, timeout, interval).Should(BeTrue())

By("Check API definition processing status")
Eventually(func() bool {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ 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 apidefinition
package test

import (
"net/http"
Expand All @@ -42,7 +42,6 @@ import (
managementapi "github.com/gravitee-io/gravitee-kubernetes-operator/internal/apim/managementapi"
managementapimodel "github.com/gravitee-io/gravitee-kubernetes-operator/internal/apim/managementapi/model"
"github.com/gravitee-io/gravitee-kubernetes-operator/internal/utils"
"github.com/gravitee-io/gravitee-kubernetes-operator/test"
)

var _ = Describe("Checking ApiKey plan and subscription", Ordered, func() {
Expand All @@ -62,13 +61,13 @@ var _ = Describe("Checking ApiKey plan and subscription", Ordered, func() {

BeforeAll(func() {
By("Create a management context to synchronize with the REST API")
managementContext, err := test.NewManagementContext(
"../../../config/samples/context/dev/managementcontext_credentials.yaml")
managementContext, err := NewManagementContext(
"../config/samples/context/dev/managementcontext_credentials.yaml")
Expect(err).ToNot(HaveOccurred())
Expect(k8sClient.Create(ctx, managementContext)).Should(Succeed())

By("Create an API definition resource stared by default")
apiDefinition, err := test.NewApiDefinition("../../../config/samples/apim/apikey-example-with-ctx.yml")
apiDefinition, err := NewApiDefinition("../config/samples/apim/apikey-example-with-ctx.yml")
Expect(err).ToNot(HaveOccurred())
Expect(k8sClient.Create(ctx, apiDefinition)).Should(Succeed())

Expand All @@ -83,7 +82,7 @@ var _ = Describe("Checking ApiKey plan and subscription", Ordered, func() {
return k8sErr == nil && savedApiDefinition.Status.CrossID != ""
}, timeout, interval).Should(BeTrue())

gatewayEndpoint = test.GatewayUrl + savedApiDefinition.Spec.Proxy.VirtualHosts[0].Path
gatewayEndpoint = GatewayUrl + savedApiDefinition.Spec.Proxy.VirtualHosts[0].Path
mgmtClient = managementapi.NewClient(ctx, managementContextFixture, httpClient)

})
Expand Down Expand Up @@ -137,7 +136,7 @@ var _ = Describe("Checking ApiKey plan and subscription", Ordered, func() {

// Update savedApiDefinition & global var with last Get
savedApiDefinition = updatedApiDefinition.DeepCopy()
gatewayEndpoint = test.GatewayUrl + savedApiDefinition.Spec.Proxy.VirtualHosts[0].Path
gatewayEndpoint = GatewayUrl + savedApiDefinition.Spec.Proxy.VirtualHosts[0].Path

By("Update ApiDefinition add ApiKey plan")

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ 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 apidefinition
package test

import (
"net/http"
Expand All @@ -37,7 +37,6 @@ import (

gio "github.com/gravitee-io/gravitee-kubernetes-operator/api/v1alpha1"
managementapi "github.com/gravitee-io/gravitee-kubernetes-operator/internal/apim/managementapi"
"github.com/gravitee-io/gravitee-kubernetes-operator/test"
)

var _ = Describe("API Definition Controller", func() {
Expand All @@ -51,13 +50,13 @@ var _ = Describe("API Definition Controller", func() {

BeforeEach(func() {
By("Create a management context to synchronize with the REST API")
managementContext, err := test.NewManagementContext(
"../../../config/samples/context/dev/managementcontext_credentials.yaml")
managementContext, err := NewManagementContext(
"../config/samples/context/dev/managementcontext_credentials.yaml")
Expect(err).ToNot(HaveOccurred())
Expect(k8sClient.Create(ctx, managementContext)).Should(Succeed())

By("Create an API definition resource stared by default")
apiDefinition, err := test.NewApiDefinition("../../../config/samples/apim/basic-example-with-ctx.yml")
apiDefinition, err := NewApiDefinition("../config/samples/apim/basic-example-with-ctx.yml")
Expect(err).ToNot(HaveOccurred())
Expect(k8sClient.Create(ctx, apiDefinition)).Should(Succeed())

Expand All @@ -82,7 +81,7 @@ var _ = Describe("API Definition Controller", func() {
By("Call initial API definition URL and expect no error")

// Check created api is callable
var gatewayEndpoint = test.GatewayUrl + createdApiDefinition.Spec.Proxy.VirtualHosts[0].Path
var gatewayEndpoint = GatewayUrl + createdApiDefinition.Spec.Proxy.VirtualHosts[0].Path

Eventually(func() bool {
res, callErr := httpClient.Get(gatewayEndpoint)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ 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 apidefinition
package test

import (
"net/http"
Expand All @@ -38,7 +38,6 @@ import (
"github.com/gravitee-io/gravitee-kubernetes-operator/api/model"
gio "github.com/gravitee-io/gravitee-kubernetes-operator/api/v1alpha1"
managementapi "github.com/gravitee-io/gravitee-kubernetes-operator/internal/apim/managementapi"
"github.com/gravitee-io/gravitee-kubernetes-operator/test"
)

var _ = Describe("API Definition Controller", func() {
Expand All @@ -52,7 +51,7 @@ var _ = Describe("API Definition Controller", func() {
BeforeEach(func() {
By("Create an API definition resource without a management context")

apiDefinition, err := test.NewApiDefinition("../../../config/samples/apim/basic-example.yml")
apiDefinition, err := NewApiDefinition("../config/samples/apim/basic-example.yml")
Expect(err).ToNot(HaveOccurred())
Expect(k8sClient.Create(ctx, apiDefinition)).Should(Succeed())

Expand All @@ -75,7 +74,7 @@ var _ = Describe("API Definition Controller", func() {
By("Call initial API definition URL and expect no error")

// Check created api is callable
var endpointInitial = test.GatewayUrl + createdApiDefinition.Spec.Proxy.VirtualHosts[0].Path
var endpointInitial = GatewayUrl + createdApiDefinition.Spec.Proxy.VirtualHosts[0].Path

Eventually(func() bool {
res, callErr := httpClient.Get(endpointInitial)
Expand All @@ -94,7 +93,7 @@ var _ = Describe("API Definition Controller", func() {

By("Call updated API definition URL and expect no error")

var endpointUpdated = test.GatewayUrl + expectedPath
var endpointUpdated = GatewayUrl + expectedPath

Eventually(func() bool {
res, callErr := httpClient.Get(endpointUpdated)
Expand All @@ -118,14 +117,14 @@ var _ = Describe("API Definition Controller", func() {
BeforeEach(func() {
By("Create a management context to synchronize with the REST API")

managementContext, err := test.NewManagementContext(
"../../../config/samples/context/dev/managementcontext_credentials.yaml")
managementContext, err := NewManagementContext(
"../config/samples/context/dev/managementcontext_credentials.yaml")
Expect(err).ToNot(HaveOccurred())
Expect(k8sClient.Create(ctx, managementContext)).Should(Succeed())

By("Create an API definition resource without a management context")

apiDefinition, err := test.NewApiDefinition("../../../config/samples/apim/basic-example-with-ctx.yml")
apiDefinition, err := NewApiDefinition("../config/samples/apim/basic-example-with-ctx.yml")
Expect(err).ToNot(HaveOccurred())
Expect(k8sClient.Create(ctx, apiDefinition)).Should(Succeed())

Expand All @@ -149,7 +148,7 @@ var _ = Describe("API Definition Controller", func() {
By("Call initial API definition URL and expect no error")

// Check created api is callable
var endpointInitial = test.GatewayUrl + createdApiDefinition.Spec.Proxy.VirtualHosts[0].Path
var endpointInitial = GatewayUrl + createdApiDefinition.Spec.Proxy.VirtualHosts[0].Path

Eventually(func() bool {
res, callErr := httpClient.Get(endpointInitial)
Expand All @@ -170,7 +169,7 @@ var _ = Describe("API Definition Controller", func() {

By("Call updated API definition URL and expect no error")

var endpointUpdated = test.GatewayUrl + expectedPath
var endpointUpdated = GatewayUrl + expectedPath

Eventually(func() bool {
res, callErr := httpClient.Get(endpointUpdated)
Expand All @@ -197,14 +196,14 @@ var _ = Describe("API Definition Controller", func() {
BeforeEach(func() {
By("Create a management context to synchronize with the REST API")

managementContext, err := test.NewManagementContext(
"../../../config/samples/context/dev/managementcontext_credentials.yaml")
managementContext, err := NewManagementContext(
"../config/samples/context/dev/managementcontext_credentials.yaml")
Expect(err).ToNot(HaveOccurred())
Expect(k8sClient.Create(ctx, managementContext)).Should(Succeed())

By("Create an API definition resource without a management context")

apiDefinition, err := test.NewApiDefinition("../../../config/samples/apim/basic-example.yml")
apiDefinition, err := NewApiDefinition("../config/samples/apim/basic-example.yml")
Expect(err).ToNot(HaveOccurred())
Expect(k8sClient.Create(ctx, apiDefinition)).Should(Succeed())

Expand Down
Loading