Skip to content

Commit 55a0a6d

Browse files
authored
refactor(e2e): move watch-selector onto the harness
226 lines to 159, and the first use of WithOperatorArgs. The Logging literal stays: fixture.WithFluentbit would add Network.Keepalive and WithFluentd would add Resources, BufferVolumeMetrics and Workers, none of which this suite has. Signed-off-by: Vyncint Ng <115854244+vyncint@users.noreply.github.com>
1 parent da78773 commit 55a0a6d

1 file changed

Lines changed: 96 additions & 163 deletions

File tree

e2e/watch-selector/watch_selector_test.go

Lines changed: 96 additions & 163 deletions
Original file line numberDiff line numberDiff line change
@@ -15,197 +15,130 @@
1515
package watch_selector
1616

1717
import (
18-
"context"
1918
"fmt"
20-
"os"
21-
"path/filepath"
2219
"testing"
23-
"time"
2420

2521
"github.com/stretchr/testify/require"
2622
appsv1 "k8s.io/api/apps/v1"
27-
batchv1 "k8s.io/api/batch/v1"
2823
corev1 "k8s.io/api/core/v1"
29-
rbacv1 "k8s.io/api/rbac/v1"
30-
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
3124
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
32-
"k8s.io/apimachinery/pkg/runtime"
3325
"sigs.k8s.io/controller-runtime/pkg/client"
34-
"sigs.k8s.io/controller-runtime/pkg/cluster"
3526
"sigs.k8s.io/e2e-framework/third_party/helm"
3627

3728
"github.com/kube-logging/logging-operator/e2e/common"
38-
"github.com/kube-logging/logging-operator/e2e/common/setup"
29+
"github.com/kube-logging/logging-operator/e2e/internal/harness"
3930
"github.com/kube-logging/logging-operator/e2e/internal/wait"
4031
"github.com/kube-logging/logging-operator/pkg/sdk/logging/api/v1beta1"
4132
)
4233

43-
var TestTempDir string
34+
const (
35+
ns = "test"
36+
release = "e2e"
4437

45-
func init() {
46-
var ok bool
47-
TestTempDir, ok = os.LookupEnv("PROJECT_DIR")
48-
if !ok {
49-
TestTempDir = "../.."
50-
}
51-
TestTempDir = filepath.Join(TestTempDir, "build/_test")
52-
err := os.MkdirAll(TestTempDir, os.FileMode(0o755))
53-
if err != nil {
54-
panic(err)
55-
}
56-
}
38+
// unmanagedNS is created by the fluent chart, not by the harness.
39+
unmanagedNS = "fluentd"
40+
)
5741

5842
func TestWatchSelectors(t *testing.T) {
59-
common.Initialize(t)
60-
ns := "test"
61-
releaseNameOverride := "e2e"
62-
common.WithCluster("watch-selector", t, func(t *testing.T, c common.Cluster) {
63-
setup.LoggingOperator(t, c, setup.LoggingOperatorOptionFunc(func(options *setup.LoggingOperatorOptions) {
64-
options.Namespace = ns
65-
options.NameOverride = releaseNameOverride
66-
options.Args = []string{"-enable-leader-election=true", "-watch-labeled-children=true", "-watch-labeled-secrets=true"}
67-
}))
68-
69-
ctx := context.Background()
70-
71-
// Managed logging resource which creates a fluentd pod with a secret named: watch-selector-test-fluentd
72-
logging := v1beta1.Logging{
73-
ObjectMeta: metav1.ObjectMeta{
74-
Name: "watch-selector-test",
75-
Namespace: ns,
76-
},
77-
Spec: v1beta1.LoggingSpec{
78-
ControlNamespace: ns,
79-
FluentbitSpec: &v1beta1.FluentbitSpec{
80-
ConfigHotReload: &v1beta1.HotReload{
81-
Image: v1beta1.ImageSpec{
82-
Repository: common.ConfigReloaderRepo,
83-
Tag: common.ConfigReloaderTag,
84-
},
85-
},
86-
BufferVolumeImage: v1beta1.ImageSpec{
87-
Repository: common.NodeExporterRepo,
88-
Tag: common.NodeExporterTag,
89-
},
90-
},
91-
FluentdSpec: &v1beta1.FluentdSpec{
43+
env := harness.New(t).
44+
WithCluster("watch-selector").
45+
WithRelease(release).
46+
WithControlNamespace(ns).
47+
WithOperatorArgs("-enable-leader-election=true", "-watch-labeled-children=true", "-watch-labeled-secrets=true").
48+
Start()
49+
50+
logging := &v1beta1.Logging{
51+
ObjectMeta: metav1.ObjectMeta{
52+
Name: "watch-selector-test",
53+
Namespace: ns,
54+
},
55+
Spec: v1beta1.LoggingSpec{
56+
ControlNamespace: ns,
57+
FluentbitSpec: &v1beta1.FluentbitSpec{
58+
ConfigHotReload: &v1beta1.HotReload{
9259
Image: v1beta1.ImageSpec{
93-
Repository: common.FluentdImageRepo,
94-
Tag: common.FluentdImageTag,
95-
},
96-
ConfigReloaderImage: v1beta1.ImageSpec{
9760
Repository: common.ConfigReloaderRepo,
9861
Tag: common.ConfigReloaderTag,
9962
},
100-
BufferVolumeImage: v1beta1.ImageSpec{
101-
Repository: common.NodeExporterRepo,
102-
Tag: common.NodeExporterTag,
103-
},
63+
},
64+
BufferVolumeImage: v1beta1.ImageSpec{
65+
Repository: common.NodeExporterRepo,
66+
Tag: common.NodeExporterTag,
10467
},
10568
},
106-
}
107-
common.RequireNoError(t, c.GetClient().Create(ctx, &logging))
108-
109-
// Unmanaged resources
110-
common.RequireNoError(t, installFluentdSts(c))
111-
112-
unmanagedSecret := &corev1.Secret{
113-
ObjectMeta: metav1.ObjectMeta{
114-
Name: "unmanaged-fluentd-secret",
115-
Namespace: ns,
116-
Labels: map[string]string{
117-
"app": "fluentd",
69+
FluentdSpec: &v1beta1.FluentdSpec{
70+
Image: v1beta1.ImageSpec{
71+
Repository: common.FluentdImageRepo,
72+
Tag: common.FluentdImageTag,
73+
},
74+
ConfigReloaderImage: v1beta1.ImageSpec{
75+
Repository: common.ConfigReloaderRepo,
76+
Tag: common.ConfigReloaderTag,
77+
},
78+
BufferVolumeImage: v1beta1.ImageSpec{
79+
Repository: common.NodeExporterRepo,
80+
Tag: common.NodeExporterTag,
11881
},
11982
},
120-
Data: map[string][]byte{
121-
"key": []byte("value"),
83+
},
84+
}
85+
env.Create(logging)
86+
87+
require.NoError(t, installFluentdSts(env))
88+
89+
unmanagedSecret := &corev1.Secret{
90+
ObjectMeta: metav1.ObjectMeta{
91+
Name: "unmanaged-fluentd-secret",
92+
Namespace: ns,
93+
Labels: map[string]string{
94+
"app": "fluentd",
12295
},
123-
}
124-
common.RequireNoError(t, c.GetClient().Create(ctx, unmanagedSecret))
125-
126-
require.Eventually(t, func() bool {
127-
if isManagedFluentdPodRunning := wait.PodShouldBeRunning(t, c.GetClient(), client.ObjectKey{Namespace: ns, Name: logging.Name + "-fluentd-0"}); !isManagedFluentdPodRunning() {
128-
t.Logf("managed fluentd pod is not running")
129-
return false
130-
}
131-
132-
if isUnmanagedFluentdPodRunning := wait.PodShouldBeRunning(t, c.GetClient(), client.ObjectKey{Namespace: "fluentd", Name: "fluentd-0"}); !isUnmanagedFluentdPodRunning() {
133-
t.Logf("unmanaged fluentd pod is not running")
134-
return false
135-
}
136-
137-
return true
138-
}, 5*time.Minute, 3*time.Second)
139-
140-
deployedLogging := &v1beta1.Logging{}
141-
common.RequireNoError(t, c.GetClient().Get(ctx, client.ObjectKeyFromObject(&logging), deployedLogging))
142-
143-
// Check if the managed resources are actually controlled by the logging resource
144-
managedSts := &appsv1.StatefulSet{}
145-
common.RequireNoError(t, c.GetClient().Get(ctx, client.ObjectKey{Namespace: ns, Name: deployedLogging.Name + "-fluentd"}, managedSts))
146-
stsOwnerRefMeta := metav1.GetControllerOf(managedSts)
147-
require.NotNil(t, stsOwnerRefMeta)
148-
149-
require.Equal(t, deployedLogging.APIVersion, stsOwnerRefMeta.APIVersion)
150-
require.Equal(t, deployedLogging.Kind, stsOwnerRefMeta.Kind)
151-
require.Equal(t, deployedLogging.Name, stsOwnerRefMeta.Name)
152-
require.True(t, *stsOwnerRefMeta.Controller)
153-
154-
managedSecret := &corev1.Secret{}
155-
common.RequireNoError(t, c.GetClient().Get(ctx, client.ObjectKey{Namespace: ns, Name: deployedLogging.Name + "-fluentd"}, managedSecret))
156-
secretOwnerRefMeta := metav1.GetControllerOf(managedSecret)
157-
require.NotNil(t, secretOwnerRefMeta)
158-
159-
require.Equal(t, deployedLogging.APIVersion, secretOwnerRefMeta.APIVersion)
160-
require.Equal(t, deployedLogging.Kind, secretOwnerRefMeta.Kind)
161-
require.Equal(t, deployedLogging.Name, secretOwnerRefMeta.Name)
162-
require.True(t, *secretOwnerRefMeta.Controller)
163-
164-
// Check if the unmanaged resources are actually not controlled by the operator
165-
unmanagedSts := &appsv1.StatefulSet{}
166-
common.RequireNoError(t, c.GetClient().Get(ctx, client.ObjectKey{Namespace: "fluentd", Name: "fluentd"}, unmanagedSts))
167-
secretOwnerRefMeta = metav1.GetControllerOf(unmanagedSts)
168-
require.Nil(t, secretOwnerRefMeta)
169-
170-
secret := &corev1.Secret{}
171-
common.RequireNoError(t, c.GetClient().Get(ctx, client.ObjectKeyFromObject(unmanagedSecret), secret))
172-
secretOwnerRefMeta = metav1.GetControllerOf(secret)
173-
require.Nil(t, secretOwnerRefMeta)
174-
}, func(t *testing.T, c common.Cluster) error {
175-
path := filepath.Join(TestTempDir, fmt.Sprintf("cluster-%s.log", t.Name()))
176-
t.Logf("Printing cluster logs to %s", path)
177-
err := c.PrintLogs(common.PrintLogConfig{
178-
Namespaces: []string{ns, "default"},
179-
FilePath: path,
180-
Limit: 100 * 1000,
181-
})
182-
if err != nil {
183-
return err
184-
}
185-
186-
loggingOperatorName := "logging-operator-" + releaseNameOverride
187-
t.Logf("Collecting coverage files from logging-operator: %s/%s", ns, loggingOperatorName)
188-
err = c.CollectTestCoverageFiles(ns, loggingOperatorName)
189-
if err != nil {
190-
t.Logf("Failed collecting coverage files: %s", err)
191-
}
192-
193-
return nil
194-
}, func(o *cluster.Options) {
195-
if o.Scheme == nil {
196-
o.Scheme = runtime.NewScheme()
197-
}
198-
common.RequireNoError(t, v1beta1.AddToScheme(o.Scheme))
199-
common.RequireNoError(t, apiextensionsv1.AddToScheme(o.Scheme))
200-
common.RequireNoError(t, appsv1.AddToScheme(o.Scheme))
201-
common.RequireNoError(t, batchv1.AddToScheme(o.Scheme))
202-
common.RequireNoError(t, corev1.AddToScheme(o.Scheme))
203-
common.RequireNoError(t, rbacv1.AddToScheme(o.Scheme))
204-
})
96+
},
97+
Data: map[string][]byte{
98+
"key": []byte("value"),
99+
},
100+
}
101+
env.Create(unmanagedSecret)
102+
103+
env.WaitForRunning(
104+
wait.Pod(ns, logging.Name+"-fluentd-0"),
105+
wait.Pod(unmanagedNS, "fluentd-0"),
106+
)
107+
108+
deployedLogging := &v1beta1.Logging{}
109+
require.NoError(t, env.Client.Get(env.Ctx, client.ObjectKeyFromObject(logging), deployedLogging))
110+
111+
// The managed resources have to be owned by the logging resource.
112+
managedSts := &appsv1.StatefulSet{}
113+
require.NoError(t, env.Client.Get(env.Ctx, client.ObjectKey{Namespace: ns, Name: deployedLogging.Name + "-fluentd"}, managedSts))
114+
requireOwnedBy(t, deployedLogging, metav1.GetControllerOf(managedSts))
115+
116+
managedSecret := &corev1.Secret{}
117+
require.NoError(t, env.Client.Get(env.Ctx, client.ObjectKey{Namespace: ns, Name: deployedLogging.Name + "-fluentd"}, managedSecret))
118+
requireOwnedBy(t, deployedLogging, metav1.GetControllerOf(managedSecret))
119+
120+
// The unmanaged ones have to be left alone.
121+
unmanagedSts := &appsv1.StatefulSet{}
122+
require.NoError(t, env.Client.Get(env.Ctx, client.ObjectKey{Namespace: unmanagedNS, Name: "fluentd"}, unmanagedSts))
123+
require.Nil(t, metav1.GetControllerOf(unmanagedSts))
124+
125+
secret := &corev1.Secret{}
126+
require.NoError(t, env.Client.Get(env.Ctx, client.ObjectKeyFromObject(unmanagedSecret), secret))
127+
require.Nil(t, metav1.GetControllerOf(secret))
128+
}
129+
130+
func requireOwnedBy(t *testing.T, owner *v1beta1.Logging, ref *metav1.OwnerReference) {
131+
t.Helper()
132+
133+
require.NotNil(t, ref)
134+
require.Equal(t, owner.APIVersion, ref.APIVersion)
135+
require.Equal(t, owner.Kind, ref.Kind)
136+
require.Equal(t, owner.Name, ref.Name)
137+
require.True(t, *ref.Controller)
205138
}
206139

207-
func installFluentdSts(c common.Cluster) error {
208-
manager := helm.New(c.KubeConfigFilePath())
140+
func installFluentdSts(env *harness.Env) error {
141+
manager := helm.New(env.Cluster.KubeConfigFilePath())
209142

210143
if err := manager.RunRepo(helm.WithArgs("add", "fluent", "https://fluent.github.io/helm-charts")); err != nil {
211144
return fmt.Errorf("failed to add fluent repo: %v", err)
@@ -215,7 +148,7 @@ func installFluentdSts(c common.Cluster) error {
215148
helm.WithName("fluentd"),
216149
helm.WithChart("fluent/fluentd"),
217150
helm.WithArgs("--create-namespace"),
218-
helm.WithNamespace("fluentd"),
151+
helm.WithNamespace(unmanagedNS),
219152
helm.WithArgs("--set", "kind=StatefulSet"),
220153
helm.WithWait(),
221154
); err != nil {

0 commit comments

Comments
 (0)