Skip to content

Commit 479929f

Browse files
authored
Remove security enforcement label from namespace in SaaS (#531)
In SaaS we recently introduced a label that indicates to prevent certain actions (security related), see related [slack thread ](https://camunda.slack.com/archives/CT702EPFH/p1714475896279759) In order to make sure that our experiments, and actions are successful in SaaS we need to make sure that reconciliation is paused and the security enforcement label is removed from the corresponding target namespace. That is now always done when creating a client for a SaaS environment. After doing so we can get further privileges, that are needed for actions like putting stress on the CPU, network partition, etc.
2 parents cf8018a + d39f073 commit 479929f

File tree

4 files changed

+61
-0
lines changed

4 files changed

+61
-0
lines changed

go-chaos/internal/helper_test.go

+11
Original file line numberDiff line numberDiff line change
@@ -133,3 +133,14 @@ func (c K8Client) CreateStatefulSetWithLabelsAndName(t *testing.T, selector *met
133133

134134
require.NoError(t, err)
135135
}
136+
137+
func (c *K8Client) createSaaSNamespace(t *testing.T) {
138+
namespace := v1.Namespace{
139+
ObjectMeta: metav1.ObjectMeta{
140+
Name: c.GetCurrentNamespace(),
141+
Labels: map[string]string{"pod-security.kubernetes.io/enforce": "true"},
142+
},
143+
}
144+
_, err := c.Clientset.CoreV1().Namespaces().Create(context.TODO(), &namespace, metav1.CreateOptions{})
145+
require.NoError(t, err)
146+
}

go-chaos/internal/k8helper.go

+18
Original file line numberDiff line numberDiff line change
@@ -61,13 +61,31 @@ func createK8Client(settings KubernetesSettings) (K8Client, error) {
6161

6262
if client.SaaSEnv {
6363
LogVerbose("Running experiment in SaaS environment.")
64+
err = prepareSaaSTargetCluster(client)
65+
if err != nil {
66+
return K8Client{}, err
67+
}
6468
} else {
6569
LogVerbose("Running experiment in self-managed environment.")
6670
}
6771

6872
return client, nil
6973
}
7074

75+
func prepareSaaSTargetCluster(client K8Client) error {
76+
LogVerbose("Pausing reconciliation preventive.")
77+
err := client.PauseReconciliation()
78+
if err != nil {
79+
return err
80+
}
81+
82+
err = client.disableSaaSNamespaceSecurityLabel()
83+
if err != nil {
84+
return err
85+
}
86+
return nil
87+
}
88+
7189
func internalCreateClient(settings KubernetesSettings) (K8Client, error) {
7290
clientConfig := clientcmd.NewNonInteractiveDeferredLoadingClientConfig(
7391
&clientcmd.ClientConfigLoadingRules{ExplicitPath: settings.kubeConfigPath},

go-chaos/internal/labels.go

+14
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
package internal
1616

1717
import (
18+
"context"
1819
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1920
"k8s.io/apimachinery/pkg/labels"
2021
)
@@ -84,3 +85,16 @@ func (c K8Client) getWorkerLabels() string {
8485
}
8586
return labels.Set(labelSelector.MatchLabels).String()
8687
}
88+
89+
func (c K8Client) disableSaaSNamespaceSecurityLabel() error {
90+
ns, err := c.Clientset.CoreV1().Namespaces().Get(context.TODO(), c.GetCurrentNamespace(), metav1.GetOptions{})
91+
if err != nil {
92+
return err
93+
}
94+
95+
LogVerbose("Removing namespace label: 'pod-security.kubernetes.io/enforce' to allow further privileges.")
96+
delete(ns.Labels, "pod-security.kubernetes.io/enforce")
97+
98+
_, err = c.Clientset.CoreV1().Namespaces().Update(context.TODO(), ns, metav1.UpdateOptions{})
99+
return err
100+
}

go-chaos/internal/labels_test.go

+18
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@
1515
package internal
1616

1717
import (
18+
"context"
19+
"github.com/stretchr/testify/require"
20+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1821
"testing"
1922

2023
"github.com/stretchr/testify/assert"
@@ -63,3 +66,18 @@ func Test_shouldGetSaasGatewayLabels(t *testing.T) {
6366
// then
6467
assert.Equal(t, expected, actual, "Labels should be equal")
6568
}
69+
70+
func Test_shouldRemoveNamespaceLabel(t *testing.T) {
71+
// given
72+
k8Client := CreateFakeClient()
73+
k8Client.createSaaSNamespace(t)
74+
75+
// when
76+
err := k8Client.disableSaaSNamespaceSecurityLabel()
77+
78+
// then
79+
require.NoError(t, err)
80+
namespace, err := k8Client.Clientset.CoreV1().Namespaces().Get(context.TODO(), k8Client.GetCurrentNamespace(), metav1.GetOptions{})
81+
require.NoError(t, err)
82+
assert.Empty(t, namespace.Labels)
83+
}

0 commit comments

Comments
 (0)