mirror of
https://github.com/projectcapsule/capsule.git
synced 2026-08-25 16:07:24 +00:00
test(e2e): modifying CapsuleConfiguration at runtime
This commit is contained in:
@@ -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
|
||||
|
||||
|
||||
@@ -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()))
|
||||
})
|
||||
})
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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()))
|
||||
})
|
||||
})
|
||||
|
||||
@@ -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()))
|
||||
}
|
||||
})
|
||||
|
||||
|
||||
@@ -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{
|
||||
|
||||
@@ -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 = ""
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
@@ -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()))
|
||||
}
|
||||
})
|
||||
})
|
||||
|
||||
@@ -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{
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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"))
|
||||
}
|
||||
|
||||
@@ -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()))
|
||||
}
|
||||
})
|
||||
})
|
||||
|
||||
@@ -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
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user