test(e2e): modifying CapsuleConfiguration at runtime

This commit is contained in:
Dario Tranchitella
2021-05-31 16:15:44 +02:00
parent ca7b85971b
commit 61034947fd
21 changed files with 101 additions and 139 deletions
+1 -1
View File
@@ -69,7 +69,7 @@ var _ = Describe("creating a Namespace with an additional Role Binding", func()
for _, ns := range []string{"rb-1", "rb-2", "rb-3"} {
ns := NewNamespace(ns)
NamespaceCreation(ns, tnt, defaultTimeoutInterval).Should(Succeed())
TenantNamespaceList(tnt, podRecreationTimeoutInterval).Should(ContainElement(ns.GetName()))
TenantNamespaceList(tnt, defaultTimeoutInterval).Should(ContainElement(ns.GetName()))
var rb *rbacv1.RoleBinding
+18 -27
View File
@@ -20,7 +20,6 @@ package e2e
import (
"context"
"fmt"
. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
@@ -53,41 +52,33 @@ var _ = Describe("creating a Namespace as Tenant owner with custom --capsule-gro
})
It("should fail using a User non matching the capsule-user-group flag", func() {
var managerPodArgs []string
capsuleGroups := []string{"test"}
for _, group := range capsuleGroups {
managerPodArgs = append(managerPodArgs, fmt.Sprintf("--capsule-user-group=%s", group))
}
ModifyCapsuleConfigurationOpts(func(configuration *v1alpha1.CapsuleConfiguration) {
configuration.Spec.UserGroups = []string{"test"}
})
args := append(defaulManagerPodArgs, managerPodArgs...)
ModifyCapsuleManagerPodArgs(args)
CapsuleClusterGroupParam(podRecreationTimeoutInterval, capsuleGroups).Should(ContainElements(capsuleGroups))
ns := NewNamespace("cg-namespace-fail")
NamespaceCreation(ns, tnt, podRecreationTimeoutInterval).ShouldNot(Succeed())
NamespaceCreation(ns, tnt, defaultTimeoutInterval).ShouldNot(Succeed())
})
It("should succeed and be available in Tenant namespaces list with multiple groups", func() {
var managerPodArgs []string
capsuleGroups := []string{"test", "alice"}
for _, group := range capsuleGroups {
managerPodArgs = append(managerPodArgs, fmt.Sprintf("--capsule-user-group=%s", group))
}
ModifyCapsuleConfigurationOpts(func(configuration *v1alpha1.CapsuleConfiguration) {
configuration.Spec.UserGroups = []string{"test", "alice"}
})
args := append(defaulManagerPodArgs, managerPodArgs...)
ModifyCapsuleManagerPodArgs(args)
CapsuleClusterGroupParam(podRecreationTimeoutInterval, capsuleGroups).Should(ContainElements(capsuleGroups))
ns := NewNamespace("cg-namespace-1")
NamespaceCreation(ns, tnt, podRecreationTimeoutInterval).Should(Succeed())
TenantNamespaceList(tnt, podRecreationTimeoutInterval).Should(ContainElement(ns.GetName()))
NamespaceCreation(ns, tnt, defaultTimeoutInterval).Should(Succeed())
TenantNamespaceList(tnt, defaultTimeoutInterval).Should(ContainElement(ns.GetName()))
})
It("should succeed and be available in Tenant namespaces list with default single group", func() {
capsuleGroups := []string{"capsule.clastix.io"}
ModifyCapsuleManagerPodArgs(defaulManagerPodArgs)
CapsuleClusterGroupParam(podRecreationTimeoutInterval, capsuleGroups).Should(ContainElements("capsule.clastix.io"))
ns := NewNamespace("cg-namespace-2")
NamespaceCreation(ns, tnt, podRecreationTimeoutInterval).Should(Succeed())
TenantNamespaceList(tnt, podRecreationTimeoutInterval).Should(ContainElement(ns.GetName()))
})
ModifyCapsuleConfigurationOpts(func(configuration *v1alpha1.CapsuleConfiguration) {
configuration.Spec.UserGroups = []string{"capsule.clastix.io"}
})
ns := NewNamespace("cg-namespace-2")
NamespaceCreation(ns, tnt, defaultTimeoutInterval).Should(Succeed())
TenantNamespaceList(tnt, defaultTimeoutInterval).Should(ContainElement(ns.GetName()))
})
})
+9 -3
View File
@@ -28,7 +28,7 @@ import (
"github.com/clastix/capsule/api/v1alpha1"
)
var _ = Describe("creating a Namespace with --force-tenant-name flag", func() {
var _ = Describe("creating a Namespace with Tenant name prefix enforcement", func() {
t1 := &v1alpha1.Tenant{
ObjectMeta: metav1.ObjectMeta{
Name: "awesome",
@@ -61,12 +61,18 @@ var _ = Describe("creating a Namespace with --force-tenant-name flag", func() {
t2.ResourceVersion = ""
return k8sClient.Create(context.TODO(), t2)
}).Should(Succeed())
ModifyCapsuleManagerPodArgs(append(defaulManagerPodArgs, []string{"--force-tenant-prefix"}...))
ModifyCapsuleConfigurationOpts(func(configuration *v1alpha1.CapsuleConfiguration) {
configuration.Spec.ForceTenantPrefix = true
})
})
JustAfterEach(func() {
Expect(k8sClient.Delete(context.TODO(), t1)).Should(Succeed())
Expect(k8sClient.Delete(context.TODO(), t2)).Should(Succeed())
ModifyCapsuleManagerPodArgs(defaulManagerPodArgs)
ModifyCapsuleConfigurationOpts(func(configuration *v1alpha1.CapsuleConfiguration) {
configuration.Spec.ForceTenantPrefix = false
})
})
It("should fail when non using prefix", func() {
+5 -5
View File
@@ -66,7 +66,7 @@ var _ = Describe("when Tenant handles Ingress classes", func() {
cs := ownerClient(tnt)
NamespaceCreation(ns, tnt, defaultTimeoutInterval).Should(Succeed())
TenantNamespaceList(tnt, podRecreationTimeoutInterval).Should(ContainElement(ns.GetName()))
TenantNamespaceList(tnt, defaultTimeoutInterval).Should(ContainElement(ns.GetName()))
By("non-specifying at all", func() {
Eventually(func() (err error) {
@@ -130,7 +130,7 @@ var _ = Describe("when Tenant handles Ingress classes", func() {
cs := ownerClient(tnt)
NamespaceCreation(ns, tnt, defaultTimeoutInterval).Should(Succeed())
TenantNamespaceList(tnt, podRecreationTimeoutInterval).Should(ContainElement(ns.GetName()))
TenantNamespaceList(tnt, defaultTimeoutInterval).Should(ContainElement(ns.GetName()))
for _, c := range tnt.Spec.IngressClasses.Exact {
Eventually(func() (err error) {
@@ -164,7 +164,7 @@ var _ = Describe("when Tenant handles Ingress classes", func() {
}
NamespaceCreation(ns, tnt, defaultTimeoutInterval).Should(Succeed())
TenantNamespaceList(tnt, podRecreationTimeoutInterval).Should(ContainElement(ns.GetName()))
TenantNamespaceList(tnt, defaultTimeoutInterval).Should(ContainElement(ns.GetName()))
for _, c := range tnt.Spec.IngressClasses.Exact {
Eventually(func() (err error) {
@@ -192,7 +192,7 @@ var _ = Describe("when Tenant handles Ingress classes", func() {
ingressClass := "oil-ingress"
NamespaceCreation(ns, tnt, defaultTimeoutInterval).Should(Succeed())
TenantNamespaceList(tnt, podRecreationTimeoutInterval).Should(ContainElement(ns.GetName()))
TenantNamespaceList(tnt, defaultTimeoutInterval).Should(ContainElement(ns.GetName()))
Eventually(func() (err error) {
i := &extensionsv1beta1.Ingress{
@@ -225,7 +225,7 @@ var _ = Describe("when Tenant handles Ingress classes", func() {
}
NamespaceCreation(ns, tnt, defaultTimeoutInterval).Should(Succeed())
TenantNamespaceList(tnt, podRecreationTimeoutInterval).Should(ContainElement(ns.GetName()))
TenantNamespaceList(tnt, defaultTimeoutInterval).Should(ContainElement(ns.GetName()))
Eventually(func() (err error) {
i := &extensionsv1beta1.Ingress{
@@ -80,9 +80,17 @@ var _ = Describe("when handling Ingress hostnames collision", func() {
tnt.ResourceVersion = ""
return k8sClient.Create(context.TODO(), tnt)
}).Should(Succeed())
ModifyCapsuleConfigurationOpts(func(configuration *v1alpha1.CapsuleConfiguration) {
configuration.Spec.AllowIngressHostnameCollision = true
})
})
JustAfterEach(func() {
Expect(k8sClient.Delete(context.TODO(), tnt)).Should(Succeed())
ModifyCapsuleConfigurationOpts(func(configuration *v1alpha1.CapsuleConfiguration) {
configuration.Spec.AllowIngressHostnameCollision = false
})
})
It("should allow creating several Ingress with same hostname", func() {
@@ -92,7 +100,7 @@ var _ = Describe("when handling Ingress hostnames collision", func() {
cs := ownerClient(tnt)
NamespaceCreation(ns, tnt, defaultTimeoutInterval).Should(Succeed())
TenantNamespaceList(tnt, podRecreationTimeoutInterval).Should(ContainElement(ns.GetName()))
TenantNamespaceList(tnt, defaultTimeoutInterval).Should(ContainElement(ns.GetName()))
if maj == 1 && min > 18 {
By("testing networking.k8s.io", func() {
@@ -79,11 +79,17 @@ var _ = Describe("when handling Ingress hostnames collision", func() {
EventuallyCreation(func() error {
return k8sClient.Create(context.TODO(), tnt)
}).Should(Succeed())
ModifyCapsuleManagerPodArgs(append(defaulManagerPodArgs, []string{"--allow-ingress-hostname-collision=false"}...))
ModifyCapsuleConfigurationOpts(func(configuration *v1alpha1.CapsuleConfiguration) {
configuration.Spec.AllowIngressHostnameCollision = true
})
})
JustAfterEach(func() {
Expect(k8sClient.Delete(context.TODO(), tnt)).Should(Succeed())
ModifyCapsuleManagerPodArgs(defaulManagerPodArgs)
ModifyCapsuleConfigurationOpts(func(configuration *v1alpha1.CapsuleConfiguration) {
configuration.Spec.AllowIngressHostnameCollision = false
})
})
It("should not allow creating several Ingress with same hostname", func() {
@@ -93,7 +99,7 @@ var _ = Describe("when handling Ingress hostnames collision", func() {
cs := ownerClient(tnt)
NamespaceCreation(ns, tnt, defaultTimeoutInterval).Should(Succeed())
TenantNamespaceList(tnt, podRecreationTimeoutInterval).Should(ContainElement(ns.GetName()))
TenantNamespaceList(tnt, defaultTimeoutInterval).Should(ContainElement(ns.GetName()))
if maj == 1 && min > 18 {
By("testing networking.k8s.io", func() {
+3 -3
View File
@@ -132,7 +132,7 @@ var _ = Describe("when Tenant handles Ingress hostnames", func() {
cs := ownerClient(tnt)
NamespaceCreation(ns, tnt, defaultTimeoutInterval).Should(Succeed())
TenantNamespaceList(tnt, podRecreationTimeoutInterval).Should(ContainElement(ns.GetName()))
TenantNamespaceList(tnt, defaultTimeoutInterval).Should(ContainElement(ns.GetName()))
if maj == 1 && min > 18 {
By("testing networking.k8s.io", func() {
@@ -161,7 +161,7 @@ var _ = Describe("when Tenant handles Ingress hostnames", func() {
cs := ownerClient(tnt)
NamespaceCreation(ns, tnt, defaultTimeoutInterval).Should(Succeed())
TenantNamespaceList(tnt, podRecreationTimeoutInterval).Should(ContainElement(ns.GetName()))
TenantNamespaceList(tnt, defaultTimeoutInterval).Should(ContainElement(ns.GetName()))
if maj == 1 && min > 18 {
By("testing networking.k8s.io", func() {
@@ -194,7 +194,7 @@ var _ = Describe("when Tenant handles Ingress hostnames", func() {
cs := ownerClient(tnt)
NamespaceCreation(ns, tnt, defaultTimeoutInterval).Should(Succeed())
TenantNamespaceList(tnt, podRecreationTimeoutInterval).Should(ContainElement(ns.GetName()))
TenantNamespaceList(tnt, defaultTimeoutInterval).Should(ContainElement(ns.GetName()))
if maj == 1 && min > 18 {
By("testing networking.k8s.io", func() {
+1 -1
View File
@@ -64,7 +64,7 @@ var _ = Describe("creating a Namespace for a Tenant with additional metadata", f
It("should contain additional Namespace metadata", func() {
ns := NewNamespace("namespace-metadata")
NamespaceCreation(ns, tnt, defaultTimeoutInterval).Should(Succeed())
TenantNamespaceList(tnt, podRecreationTimeoutInterval).Should(ContainElement(ns.GetName()))
TenantNamespaceList(tnt, defaultTimeoutInterval).Should(ContainElement(ns.GetName()))
By("checking additional labels", func() {
Eventually(func() (ok bool) {
+1 -1
View File
@@ -53,6 +53,6 @@ var _ = Describe("creating a Namespace as Tenant owner", func() {
It("should be available in Tenant namespaces list", func() {
ns := NewNamespace("new-namespace")
NamespaceCreation(ns, tnt, defaultTimeoutInterval).Should(Succeed())
TenantNamespaceList(tnt, podRecreationTimeoutInterval).Should(ContainElement(ns.GetName()))
TenantNamespaceList(tnt, defaultTimeoutInterval).Should(ContainElement(ns.GetName()))
})
})
+1 -1
View File
@@ -57,7 +57,7 @@ var _ = Describe("creating a Namespace in over-quota of three", func() {
for _, name := range []string{"bob-dev", "bob-staging", "bob-production"} {
ns := NewNamespace(name)
NamespaceCreation(ns, tnt, defaultTimeoutInterval).Should(Succeed())
TenantNamespaceList(tnt, podRecreationTimeoutInterval).Should(ContainElement(ns.GetName()))
TenantNamespaceList(tnt, defaultTimeoutInterval).Should(ContainElement(ns.GetName()))
}
})
+7 -7
View File
@@ -109,7 +109,7 @@ var _ = Describe("when Tenant owner interacts with the webhooks", func() {
By("blocking Capsule Limit ranges", func() {
ns := NewNamespace("limit-range-disallow")
NamespaceCreation(ns, tnt, defaultTimeoutInterval).Should(Succeed())
TenantNamespaceList(tnt, podRecreationTimeoutInterval).Should(ContainElement(ns.GetName()))
TenantNamespaceList(tnt, defaultTimeoutInterval).Should(ContainElement(ns.GetName()))
lr := &corev1.LimitRange{}
Eventually(func() error {
@@ -123,7 +123,7 @@ var _ = Describe("when Tenant owner interacts with the webhooks", func() {
By("blocking Capsule Network Policy", func() {
ns := NewNamespace("network-policy-disallow")
NamespaceCreation(ns, tnt, defaultTimeoutInterval).Should(Succeed())
TenantNamespaceList(tnt, podRecreationTimeoutInterval).Should(ContainElement(ns.GetName()))
TenantNamespaceList(tnt, defaultTimeoutInterval).Should(ContainElement(ns.GetName()))
np := &networkingv1.NetworkPolicy{}
Eventually(func() error {
@@ -137,7 +137,7 @@ var _ = Describe("when Tenant owner interacts with the webhooks", func() {
By("blocking Capsule Resource Quota", func() {
ns := NewNamespace("resource-quota-disallow")
NamespaceCreation(ns, tnt, defaultTimeoutInterval).Should(Succeed())
TenantNamespaceList(tnt, podRecreationTimeoutInterval).Should(ContainElement(ns.GetName()))
TenantNamespaceList(tnt, defaultTimeoutInterval).Should(ContainElement(ns.GetName()))
rq := &corev1.ResourceQuota{}
Eventually(func() error {
@@ -154,7 +154,7 @@ var _ = Describe("when Tenant owner interacts with the webhooks", func() {
By("listing Limit Range", func() {
ns := NewNamespace("limit-range-list")
NamespaceCreation(ns, tnt, defaultTimeoutInterval).Should(Succeed())
TenantNamespaceList(tnt, podRecreationTimeoutInterval).Should(ContainElement(ns.GetName()))
TenantNamespaceList(tnt, defaultTimeoutInterval).Should(ContainElement(ns.GetName()))
Eventually(func() (err error) {
cs := ownerClient(tnt)
@@ -165,7 +165,7 @@ var _ = Describe("when Tenant owner interacts with the webhooks", func() {
By("listing Network Policy", func() {
ns := NewNamespace("network-policy-list")
NamespaceCreation(ns, tnt, defaultTimeoutInterval).Should(Succeed())
TenantNamespaceList(tnt, podRecreationTimeoutInterval).Should(ContainElement(ns.GetName()))
TenantNamespaceList(tnt, defaultTimeoutInterval).Should(ContainElement(ns.GetName()))
Eventually(func() (err error) {
cs := ownerClient(tnt)
@@ -176,7 +176,7 @@ var _ = Describe("when Tenant owner interacts with the webhooks", func() {
By("listin Resource Quota", func() {
ns := NewNamespace("resource-quota-list")
NamespaceCreation(ns, tnt, defaultTimeoutInterval).Should(Succeed())
TenantNamespaceList(tnt, podRecreationTimeoutInterval).Should(ContainElement(ns.GetName()))
TenantNamespaceList(tnt, defaultTimeoutInterval).Should(ContainElement(ns.GetName()))
Eventually(func() (err error) {
cs := ownerClient(tnt)
@@ -189,7 +189,7 @@ var _ = Describe("when Tenant owner interacts with the webhooks", func() {
It("should allow all actions to Tenant owner Network Policy", func() {
ns := NewNamespace("network-policy-allow")
NamespaceCreation(ns, tnt, defaultTimeoutInterval).Should(Succeed())
TenantNamespaceList(tnt, podRecreationTimeoutInterval).Should(ContainElement(ns.GetName()))
TenantNamespaceList(tnt, defaultTimeoutInterval).Should(ContainElement(ns.GetName()))
cs := ownerClient(tnt)
np := &networkingv1.NetworkPolicy{
+13 -7
View File
@@ -28,7 +28,7 @@ import (
"github.com/clastix/capsule/api/v1alpha1"
)
var _ = Describe("creating a Namespace with --protected-namespace-regex enabled", func() {
var _ = Describe("creating a Namespace with a protected Namespace regex enabled", func() {
tnt := &v1alpha1.Tenant{
ObjectMeta: metav1.ObjectMeta{
Name: "tenant-protected-namespace",
@@ -52,16 +52,22 @@ var _ = Describe("creating a Namespace with --protected-namespace-regex enabled"
})
It("should succeed and be available in Tenant namespaces list", func() {
args := append(defaulManagerPodArgs, []string{"--protected-namespace-regex=^.*[-.]system$"}...)
ModifyCapsuleManagerPodArgs(args)
ModifyCapsuleConfigurationOpts(func(configuration *v1alpha1.CapsuleConfiguration) {
configuration.Spec.ProtectedNamespaceRegexpString = `^.*[-.]system$`
})
ns := NewNamespace("test-ok")
NamespaceCreation(ns, tnt, podRecreationTimeoutInterval).Should(Succeed())
TenantNamespaceList(tnt, podRecreationTimeoutInterval).Should(ContainElement(ns.GetName()))
NamespaceCreation(ns, tnt, defaultTimeoutInterval).Should(Succeed())
TenantNamespaceList(tnt, defaultTimeoutInterval).Should(ContainElement(ns.GetName()))
})
It("should fail using a value non matching the regex", func() {
ns := NewNamespace("test-system")
NamespaceCreation(ns, tnt, podRecreationTimeoutInterval).ShouldNot(Succeed())
ModifyCapsuleManagerPodArgs(defaulManagerPodArgs)
NamespaceCreation(ns, tnt, defaultTimeoutInterval).ShouldNot(Succeed())
ModifyCapsuleConfigurationOpts(func(configuration *v1alpha1.CapsuleConfiguration) {
configuration.Spec.ProtectedNamespaceRegexpString = ""
})
})
})
+1 -1
View File
@@ -125,7 +125,7 @@ var _ = Describe("exceeding a Tenant resource quota", func() {
for _, i := range nsl {
ns := NewNamespace(i)
NamespaceCreation(ns, tnt, defaultTimeoutInterval).Should(Succeed())
TenantNamespaceList(tnt, podRecreationTimeoutInterval).Should(ContainElement(ns.GetName()))
TenantNamespaceList(tnt, defaultTimeoutInterval).Should(ContainElement(ns.GetName()))
}
})
})
+3 -3
View File
@@ -81,7 +81,7 @@ var _ = Describe("adding metadata to Service objects", func() {
It("should apply them to Service", func() {
ns := NewNamespace("service-metadata")
NamespaceCreation(ns, tnt, defaultTimeoutInterval).Should(Succeed())
TenantNamespaceList(tnt, podRecreationTimeoutInterval).Should(ContainElement(ns.GetName()))
TenantNamespaceList(tnt, defaultTimeoutInterval).Should(ContainElement(ns.GetName()))
svc := &corev1.Service{
ObjectMeta: metav1.ObjectMeta{
@@ -135,7 +135,7 @@ var _ = Describe("adding metadata to Service objects", func() {
It("should apply them to Endpoints", func() {
ns := NewNamespace("endpoints-metadata")
NamespaceCreation(ns, tnt, defaultTimeoutInterval).Should(Succeed())
TenantNamespaceList(tnt, podRecreationTimeoutInterval).Should(ContainElement(ns.GetName()))
TenantNamespaceList(tnt, defaultTimeoutInterval).Should(ContainElement(ns.GetName()))
ep := &corev1.Endpoints{
ObjectMeta: metav1.ObjectMeta{
@@ -195,7 +195,7 @@ var _ = Describe("adding metadata to Service objects", func() {
ns := NewNamespace("endpointslice-metadata")
NamespaceCreation(ns, tnt, defaultTimeoutInterval).Should(Succeed())
TenantNamespaceList(tnt, podRecreationTimeoutInterval).Should(ContainElement(ns.GetName()))
TenantNamespaceList(tnt, defaultTimeoutInterval).Should(ContainElement(ns.GetName()))
eps := &discoveryv1beta1.EndpointSlice{
ObjectMeta: metav1.ObjectMeta{
+2 -2
View File
@@ -64,7 +64,7 @@ var _ = Describe("when Tenant handles Storage classes", func() {
It("should fails", func() {
ns := NewNamespace("storage-class-disallowed")
NamespaceCreation(ns, tnt, defaultTimeoutInterval).Should(Succeed())
TenantNamespaceList(tnt, podRecreationTimeoutInterval).Should(ContainElement(ns.GetName()))
TenantNamespaceList(tnt, defaultTimeoutInterval).Should(ContainElement(ns.GetName()))
By("non-specifying it", func() {
Eventually(func() (err error) {
@@ -113,7 +113,7 @@ var _ = Describe("when Tenant handles Storage classes", func() {
cs := ownerClient(tnt)
NamespaceCreation(ns, tnt, defaultTimeoutInterval).Should(Succeed())
TenantNamespaceList(tnt, podRecreationTimeoutInterval).Should(ContainElement(ns.GetName()))
TenantNamespaceList(tnt, defaultTimeoutInterval).Should(ContainElement(ns.GetName()))
By("using exact matches", func() {
for _, c := range tnt.Spec.StorageClasses.Exact {
Eventually(func() (err error) {
-12
View File
@@ -19,14 +19,11 @@ limitations under the License.
package e2e
import (
"context"
"path/filepath"
"testing"
. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
appsv1 "k8s.io/api/apps/v1"
"k8s.io/apimachinery/pkg/types"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/kubernetes/scheme"
"k8s.io/client-go/rest"
@@ -47,7 +44,6 @@ var (
cfg *rest.Config
k8sClient client.Client
testEnv *envtest.Environment
defaulManagerPodArgs []string
tenantRoleBindingNames = []string{"namespace:admin", "namespace-deleter"}
)
@@ -88,14 +84,6 @@ var _ = BeforeSuite(func(done Done) {
Expect(err).ToNot(HaveOccurred())
Expect(k8sClient).ToNot(BeNil())
capsuleDeployment := &appsv1.Deployment{}
k8sClient.Get(context.TODO(), types.NamespacedName{Name: capsuleDeploymentName, Namespace: capsuleNamespace}, capsuleDeployment)
for _, container := range capsuleDeployment.Spec.Template.Spec.Containers {
if container.Name == capsuleManagerContainerName {
defaulManagerPodArgs = container.Args
}
}
Expect(defaulManagerPodArgs).ToNot(BeEmpty())
close(done)
}, 60)
@@ -50,11 +50,17 @@ var _ = Describe("when a second Tenant contains an already declared allowed Ingr
tnt.ResourceVersion = ""
return k8sClient.Create(context.TODO(), tnt)
}).Should(Succeed())
ModifyCapsuleManagerPodArgs(append(defaulManagerPodArgs, []string{"--allow-tenant-ingress-hostnames-collision=true"}...))
ModifyCapsuleConfigurationOpts(func(configuration *v1alpha1.CapsuleConfiguration) {
configuration.Spec.AllowTenantIngressHostnamesCollision = true
})
})
JustAfterEach(func() {
Expect(k8sClient.Delete(context.TODO(), tnt)).Should(Succeed())
ModifyCapsuleManagerPodArgs(defaulManagerPodArgs)
ModifyCapsuleConfigurationOpts(func(configuration *v1alpha1.CapsuleConfiguration) {
configuration.Spec.AllowTenantIngressHostnamesCollision = false
})
})
It("should not block creation if contains collided Ingress hostnames", func() {
+1 -1
View File
@@ -54,7 +54,7 @@ var _ = Describe("creating a Namespace with group Tenant owner", func() {
It("should succeed and be available in Tenant namespaces list", func() {
ns := NewNamespace("gto-namespace")
NamespaceCreation(ns, tnt, defaultTimeoutInterval).Should(Succeed())
TenantNamespaceList(tnt, podRecreationTimeoutInterval).Should(ContainElement(ns.GetName()))
TenantNamespaceList(tnt, defaultTimeoutInterval).Should(ContainElement(ns.GetName()))
for _, a := range KindInTenantRoleBindingAssertions(ns, defaultTimeoutInterval) {
a.Should(BeIdenticalTo("Group"))
}
+1 -1
View File
@@ -171,7 +171,7 @@ var _ = Describe("changing Tenant managed Kubernetes resources", func() {
for _, i := range nsl {
ns := NewNamespace(i)
NamespaceCreation(ns, tnt, defaultTimeoutInterval).Should(Succeed())
TenantNamespaceList(tnt, podRecreationTimeoutInterval).Should(ContainElement(ns.GetName()))
TenantNamespaceList(tnt, defaultTimeoutInterval).Should(ContainElement(ns.GetName()))
}
})
})
+1 -1
View File
@@ -170,7 +170,7 @@ var _ = Describe("creating namespaces within a Tenant with resources", func() {
for _, i := range nsl {
ns := NewNamespace(i)
NamespaceCreation(ns, tnt, defaultTimeoutInterval).Should(Succeed())
TenantNamespaceList(tnt, podRecreationTimeoutInterval).Should(ContainElement(ns.GetName()))
TenantNamespaceList(tnt, defaultTimeoutInterval).Should(ContainElement(ns.GetName()))
}
})
})
+7 -56
View File
@@ -20,28 +20,21 @@ package e2e
import (
"context"
b64 "encoding/base64"
"fmt"
"strconv"
"time"
"github.com/clastix/capsule/api/v1alpha1"
. "github.com/onsi/gomega"
appsv1 "k8s.io/api/apps/v1"
corev1 "k8s.io/api/core/v1"
rbacv1 "k8s.io/api/rbac/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/types"
"k8s.io/apimachinery/pkg/version"
"k8s.io/client-go/kubernetes"
"sigs.k8s.io/controller-runtime/pkg/client"
"github.com/clastix/capsule/api/v1alpha1"
"github.com/clastix/capsule/controllers/rbac"
)
const (
defaultTimeoutInterval = 20 * time.Second
podRecreationTimeoutInterval = 90 * time.Second
defaultPollInterval = time.Second
)
@@ -72,57 +65,15 @@ func EventuallyCreation(f interface{}) AsyncAssertion {
return Eventually(f, defaultTimeoutInterval, defaultPollInterval)
}
func CapsuleClusterGroupParam(timeout time.Duration, groups []string) AsyncAssertion {
capsuleCRB := &rbacv1.ClusterRoleBinding{}
func ModifyCapsuleConfigurationOpts(fn func(configuration *v1alpha1.CapsuleConfiguration)) {
config := &v1alpha1.CapsuleConfiguration{}
Expect(k8sClient.Get(context.Background(), types.NamespacedName{Name: "default"}, config)).ToNot(HaveOccurred())
return Eventually(func() []string {
var subjectNames []string
for _, group := range groups {
name := b64.RawStdEncoding.EncodeToString([]byte(group))
Expect(k8sClient.Get(context.TODO(), types.NamespacedName{Name: fmt.Sprintf("%s-%v", rbac.ProvisionerRoleName, name)}, capsuleCRB)).Should(Succeed())
subjectNames = append(subjectNames, capsuleCRB.Subjects[0].Name)
}
return subjectNames
}, timeout, defaultPollInterval)
}
fn(config)
func ModifyCapsuleManagerPodArgs(args []string) {
capsuleDeployment := &appsv1.Deployment{}
k8sClient.Get(context.TODO(), types.NamespacedName{Name: capsuleDeploymentName, Namespace: capsuleNamespace}, capsuleDeployment)
Expect(k8sClient.Update(context.Background(), config)).ToNot(HaveOccurred())
for i, container := range capsuleDeployment.Spec.Template.Spec.Containers {
if container.Name == capsuleManagerContainerName {
capsuleDeployment.Spec.Template.Spec.Containers[i].Args = args
capsuleDeployment.Spec.Template.Spec.Containers[i].LivenessProbe.FailureThreshold = 4
capsuleDeployment.Spec.Template.Spec.Containers[i].LivenessProbe.PeriodSeconds = 3
}
}
capsuleDeployment.ResourceVersion = ""
err := k8sClient.Update(context.TODO(), capsuleDeployment)
Expect(err).ToNot(HaveOccurred())
Eventually(func() []string {
var containerArgs []string
Expect(k8sClient.Get(context.TODO(), types.NamespacedName{Name: capsuleDeploymentName, Namespace: capsuleNamespace}, capsuleDeployment)).Should(Succeed())
for i, container := range capsuleDeployment.Spec.Template.Spec.Containers {
if container.Name == capsuleManagerContainerName {
containerArgs = capsuleDeployment.Spec.Template.Spec.Containers[i].Args
}
}
return containerArgs
}, podRecreationTimeoutInterval, defaultPollInterval).Should(HaveLen(len(args)))
pl := &corev1.PodList{}
Eventually(func() []corev1.Pod {
Expect(k8sClient.List(context.TODO(), pl, client.MatchingLabels{"app.kubernetes.io/instance": "capsule"})).Should(Succeed())
return pl.Items
}, podRecreationTimeoutInterval, defaultPollInterval).Should(HaveLen(2))
Eventually(func() []corev1.Pod {
Expect(k8sClient.List(context.TODO(), pl, client.MatchingLabels{"app.kubernetes.io/instance": "capsule"})).Should(Succeed())
return pl.Items
}, podRecreationTimeoutInterval, defaultPollInterval).Should(HaveLen(1))
// had to add sleep in order to manager be started
time.Sleep(defaultTimeoutInterval)
time.Sleep(time.Second)
}
func KindInTenantRoleBindingAssertions(ns *corev1.Namespace, timeout time.Duration) (out []AsyncAssertion) {