1515package watch_selector
1616
1717import (
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
5842func 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