Skip to content

Commit a81fdf4

Browse files
committed
chore: add tests for secret updation behavior
1 parent af2db6b commit a81fdf4

File tree

1 file changed

+185
-0
lines changed

1 file changed

+185
-0
lines changed

test/e2e/reconcile_objects_test.go

Lines changed: 185 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,185 @@
1+
package e2e
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"os"
7+
"strings"
8+
"testing"
9+
"time"
10+
11+
"github.com/openshift/cluster-monitoring-operator/pkg/manifests"
12+
"github.com/openshift/cluster-monitoring-operator/test/e2e/framework"
13+
"github.com/stretchr/testify/require"
14+
v1 "k8s.io/api/core/v1"
15+
"k8s.io/apimachinery/pkg/api/errors"
16+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
17+
"k8s.io/apimachinery/pkg/types"
18+
"sigs.k8s.io/yaml"
19+
)
20+
21+
func extractNamespacedNameFromFile[T metav1.ObjectMetaAccessor](t *testing.T, file string) types.NamespacedName {
22+
t.Helper()
23+
24+
data, err := os.ReadFile("../../assets/" + file)
25+
require.NoError(t, err)
26+
27+
var s T
28+
require.NoError(t, yaml.Unmarshal(data, &s))
29+
return types.NamespacedName{
30+
Name: s.GetObjectMeta().GetName(),
31+
Namespace: s.GetObjectMeta().GetNamespace(),
32+
}
33+
}
34+
35+
func TestSecretsReconciliation(t *testing.T) {
36+
// List of secrets that should not be synced during operator's reconciliation.
37+
var (
38+
namespaceMonitoring = f.Ns
39+
namespaceUserWorkloadMonitoring = f.UserWorkloadMonitoringNs
40+
extractNamespacedNameFromFileSecret = extractNamespacedNameFromFile[*v1.Secret]
41+
)
42+
unsyncedSecrets := []types.NamespacedName{
43+
extractNamespacedNameFromFileSecret(t, manifests.AlertmanagerConfig),
44+
extractNamespacedNameFromFileSecret(t, manifests.AlertmanagerUserWorkloadSecret),
45+
}
46+
syncedSecrets := []types.NamespacedName{
47+
extractNamespacedNameFromFileSecret(t, manifests.AlertmanagerRBACProxyMetricSecret),
48+
extractNamespacedNameFromFileSecret(t, manifests.AlertmanagerRBACProxySecret),
49+
extractNamespacedNameFromFileSecret(t, manifests.AlertmanagerRBACProxyWebSecret),
50+
extractNamespacedNameFromFileSecret(t, manifests.AlertmanagerUserWorkloadRBACProxyMetricSecret),
51+
extractNamespacedNameFromFileSecret(t, manifests.AlertmanagerUserWorkloadRBACProxySecret),
52+
extractNamespacedNameFromFileSecret(t, manifests.AlertmanagerUserWorkloadRBACProxyTenancySecret),
53+
extractNamespacedNameFromFileSecret(t, manifests.KubeStateMetricsKubeRbacProxySecret),
54+
extractNamespacedNameFromFileSecret(t, manifests.NodeExporterKubeRbacProxySecret),
55+
extractNamespacedNameFromFileSecret(t, manifests.OpenShiftStateMetricsKubeRbacProxySecret),
56+
extractNamespacedNameFromFileSecret(t, manifests.PrometheusK8sRBACProxyWebSecret),
57+
extractNamespacedNameFromFileSecret(t, manifests.PrometheusOperatorKubeRbacProxySecret),
58+
extractNamespacedNameFromFileSecret(t, manifests.PrometheusOperatorUserWorkloadKubeRbacProxySecret),
59+
extractNamespacedNameFromFileSecret(t, manifests.PrometheusRBACProxySecret),
60+
extractNamespacedNameFromFileSecret(t, manifests.PrometheusUserWorkloadRBACProxyFederateSecret),
61+
extractNamespacedNameFromFileSecret(t, manifests.PrometheusUserWorkloadRBACProxyMetricsSecret),
62+
extractNamespacedNameFromFileSecret(t, manifests.TelemeterClientKubeRbacProxySecret),
63+
extractNamespacedNameFromFileSecret(t, manifests.ThanosQuerierRBACProxyMetricsSecret),
64+
extractNamespacedNameFromFileSecret(t, manifests.ThanosQuerierRBACProxyRulesSecret),
65+
extractNamespacedNameFromFileSecret(t, manifests.ThanosQuerierRBACProxySecret),
66+
extractNamespacedNameFromFileSecret(t, manifests.ThanosQuerierRBACProxyWebSecret),
67+
extractNamespacedNameFromFileSecret(t, manifests.ThanosRulerAlertmanagerConfigSecret),
68+
extractNamespacedNameFromFileSecret(t, manifests.ThanosRulerQueryConfigSecret),
69+
extractNamespacedNameFromFileSecret(t, manifests.ThanosRulerRBACProxyMetricsSecret),
70+
extractNamespacedNameFromFileSecret(t, manifests.ThanosRulerRBACProxyWebSecret),
71+
{
72+
Name: "alert-relabel-configs",
73+
Namespace: namespaceMonitoring,
74+
},
75+
{
76+
Name: "prometheus-k8s-additional-alertmanager-configs",
77+
Namespace: namespaceMonitoring,
78+
},
79+
{
80+
Name: "prometheus-user-workload-additional-alertmanager-configs",
81+
Namespace: namespaceUserWorkloadMonitoring,
82+
},
83+
}
84+
85+
// Create assets under both scenarios for us to work with.
86+
setupUserWorkloadAssetsWithTeardownHook(t, f)
87+
userWorkloadConfigMap := f.BuildUserWorkloadConfigMap(t, `alertmanager:
88+
enabled: true
89+
`)
90+
f.MustCreateOrUpdateConfigMap(t, userWorkloadConfigMap)
91+
defer f.MustDeleteConfigMap(t, userWorkloadConfigMap)
92+
for _, secret := range []types.NamespacedName{
93+
extractNamespacedNameFromFileSecret(t, manifests.AlertmanagerRBACProxyMetricSecret),
94+
extractNamespacedNameFromFileSecret(t, manifests.AlertmanagerUserWorkloadRBACProxyMetricSecret),
95+
} {
96+
f.AssertSecretExists(secret.Name, secret.Namespace)(t)
97+
}
98+
99+
cleanup := func() {
100+
// Restore all unsynced secrets to their original state.
101+
for _, secret := range unsyncedSecrets {
102+
gotSecret, err := f.KubeClient.CoreV1().Secrets(secret.Namespace).Get(context.Background(), secret.Name, metav1.GetOptions{})
103+
if err != nil {
104+
if errors.IsNotFound(err) {
105+
continue
106+
}
107+
require.NoError(t, err)
108+
}
109+
data := gotSecret.Data
110+
stringData := gotSecret.StringData
111+
for k, v := range data {
112+
data[k] = []byte(strings.TrimPrefix(string(v), t.Name()))
113+
}
114+
for k, v := range stringData {
115+
stringData[k] = strings.TrimPrefix(v, t.Name())
116+
}
117+
_, err = f.KubeClient.CoreV1().Secrets(secret.Namespace).Update(context.Background(), gotSecret, metav1.UpdateOptions{})
118+
require.NoError(t, err)
119+
}
120+
}
121+
defer cleanup()
122+
123+
// Update the aforementioned secrets' data.
124+
for _, secret := range append(syncedSecrets, unsyncedSecrets...) {
125+
gotSecret, err := f.KubeClient.CoreV1().Secrets(secret.Namespace).Get(context.Background(), secret.Name, metav1.GetOptions{})
126+
require.NoError(t, err)
127+
data := gotSecret.Data
128+
stringData := gotSecret.StringData
129+
for k, v := range data {
130+
data[k] = []byte(t.Name() + string(v))
131+
break
132+
}
133+
for k, v := range stringData {
134+
stringData[k] = t.Name() + v
135+
break
136+
}
137+
_, err = f.KubeClient.CoreV1().Secrets(secret.Namespace).Update(context.Background(), gotSecret, metav1.UpdateOptions{})
138+
require.NoError(t, err)
139+
}
140+
141+
// Check if the secrets were reconciled as expected.
142+
for _, secret := range syncedSecrets {
143+
err := framework.Poll(time.Second, 6*time.Minute, func() error {
144+
updatedSecret, err := f.KubeClient.CoreV1().Secrets(secret.Namespace).Get(context.Background(), secret.Name, metav1.GetOptions{})
145+
if err != nil {
146+
return err
147+
}
148+
data := updatedSecret.Data
149+
stringData := updatedSecret.StringData
150+
for _, v := range data {
151+
if strings.HasPrefix(string(v), t.Name()) {
152+
return fmt.Errorf("secret %s has unexpected data", secret.String())
153+
}
154+
}
155+
for _, v := range stringData {
156+
if strings.HasPrefix(v, t.Name()) {
157+
return fmt.Errorf("secret %s has unexpected stringData", secret.String())
158+
}
159+
}
160+
return nil
161+
})
162+
require.NoError(t, err)
163+
}
164+
165+
// Check if the secrets were reconciled unexpectedly.
166+
for _, secret := range unsyncedSecrets {
167+
updatedSecret, err := f.KubeClient.CoreV1().Secrets(secret.Namespace).Get(context.Background(), secret.Name, metav1.GetOptions{})
168+
require.NoError(t, err)
169+
data, dataHasTestNamePrefix := updatedSecret.Data, false
170+
stringData, stringDataHasTestNamePrefix := updatedSecret.StringData, false
171+
for _, v := range data {
172+
if strings.HasPrefix(string(v), t.Name()) {
173+
dataHasTestNamePrefix = true
174+
break
175+
}
176+
}
177+
for _, v := range stringData {
178+
if strings.HasPrefix(v, t.Name()) {
179+
stringDataHasTestNamePrefix = true
180+
break
181+
}
182+
}
183+
require.True(t, dataHasTestNamePrefix || stringDataHasTestNamePrefix, fmt.Sprintf("secret %s was unexpectedly reconciled", secret.String()))
184+
}
185+
}

0 commit comments

Comments
 (0)