@@ -18,9 +18,14 @@ along with this program. If not, see <https://www.gnu.org/licenses/>.
18
18
package rclone
19
19
20
20
import (
21
+ "flag"
22
+ "os"
23
+
21
24
snapv1 "github.com/kubernetes-csi/external-snapshotter/client/v4/apis/volumesnapshot/v1beta1"
22
25
. "github.com/onsi/ginkgo"
23
26
. "github.com/onsi/gomega"
27
+ "github.com/spf13/pflag"
28
+ "github.com/spf13/viper"
24
29
batchv1 "k8s.io/api/batch/v1"
25
30
corev1 "k8s.io/api/core/v1"
26
31
rbacv1 "k8s.io/api/rbac/v1"
@@ -49,8 +54,9 @@ var emptyString = ""
49
54
var _ = Describe ("Rclone properly registers" , func () {
50
55
When ("Rclone's registration function is called" , func () {
51
56
BeforeEach (func () {
52
- Register ()
57
+ Expect ( Register ()). To ( Succeed () )
53
58
})
59
+
54
60
It ("is added to the mover catalog" , func () {
55
61
found := false
56
62
for _ , v := range mover .Catalog {
@@ -63,6 +69,115 @@ var _ = Describe("Rclone properly registers", func() {
63
69
})
64
70
})
65
71
72
+ var _ = Describe ("Rclone init flags and env vars" , func () {
73
+ logger := zap .New (zap .UseDevMode (true ), zap .WriteTo (GinkgoWriter ))
74
+ When ("Rclone builder inits flags" , func () {
75
+ var builderForInitTests * Builder
76
+ var testPflagSet * pflag.FlagSet
77
+ BeforeEach (func () {
78
+ os .Unsetenv (rcloneContainerImageEnvVar )
79
+
80
+ // Instantiate new viper instance and flagset instance just for this test
81
+ testViper := viper .New ()
82
+ testFlagSet := flag .NewFlagSet ("testflagsetrclone" , flag .ExitOnError )
83
+
84
+ // New Builder for this test - use testViper and testFlagSet so we can modify
85
+ // flags for these tests without modifying global flags and potentially affecting other tests
86
+ var err error
87
+ builderForInitTests , err = newBuilder (testViper , testFlagSet )
88
+ Expect (err ).NotTo (HaveOccurred ())
89
+ Expect (builderForInitTests ).NotTo (BeNil ())
90
+
91
+ // code here (see main.go) for viper to bind cmd line flags (including those
92
+ // defined in the mover Register() func)
93
+ // Bind viper to a new set of flags so each of these tests can get their own
94
+ testPflagSet = pflag .NewFlagSet ("testpflagsetrclone" , pflag .ExitOnError )
95
+ testPflagSet .AddGoFlagSet (testFlagSet )
96
+ Expect (testViper .BindPFlags (testPflagSet )).To (Succeed ())
97
+ })
98
+
99
+ AfterEach (func () {
100
+ os .Unsetenv (rcloneContainerImageEnvVar )
101
+ })
102
+
103
+ JustBeforeEach (func () {
104
+ // Common checks - make sure if we instantiate a source/dest mover, it uses the container image that
105
+ // was picked up by flags/command line etc from the builder
106
+ var err error
107
+
108
+ rs := & volsyncv1alpha1.ReplicationSource {
109
+ ObjectMeta : metav1.ObjectMeta {
110
+ Name : "testrscr" ,
111
+ Namespace : "testing" ,
112
+ },
113
+ Spec : volsyncv1alpha1.ReplicationSourceSpec {
114
+ Rclone : & volsyncv1alpha1.ReplicationSourceRcloneSpec {},
115
+ },
116
+ Status : & volsyncv1alpha1.ReplicationSourceStatus {}, // Controller sets status to non-nil
117
+ }
118
+ sourceMover , err := builderForInitTests .FromSource (k8sClient , logger , rs )
119
+ Expect (err ).NotTo (HaveOccurred ())
120
+ Expect (sourceMover ).NotTo (BeNil ())
121
+ sourceRcloneMover , _ := sourceMover .(* Mover )
122
+ Expect (sourceRcloneMover .containerImage ).To (Equal (builderForInitTests .getRcloneContainerImage ()))
123
+
124
+ rd := & volsyncv1alpha1.ReplicationDestination {
125
+ ObjectMeta : metav1.ObjectMeta {
126
+ Name : "rd" ,
127
+ Namespace : "testing" ,
128
+ },
129
+ Spec : volsyncv1alpha1.ReplicationDestinationSpec {
130
+ Trigger : & volsyncv1alpha1.ReplicationDestinationTriggerSpec {},
131
+ Rclone : & volsyncv1alpha1.ReplicationDestinationRcloneSpec {},
132
+ },
133
+ Status : & volsyncv1alpha1.ReplicationDestinationStatus {}, // Controller sets status to non-nil
134
+ }
135
+ destMover , err := builderForInitTests .FromDestination (k8sClient , logger , rd )
136
+ Expect (err ).NotTo (HaveOccurred ())
137
+ Expect (destMover ).NotTo (BeNil ())
138
+ destRcloneMover , _ := destMover .(* Mover )
139
+ Expect (destRcloneMover .containerImage ).To (Equal (builderForInitTests .getRcloneContainerImage ()))
140
+ })
141
+
142
+ Context ("When no command line flag or ENV var is specified" , func () {
143
+ It ("Should use the default rclone container image" , func () {
144
+ Expect (builderForInitTests .getRcloneContainerImage ()).To (Equal (defaultRcloneContainerImage ))
145
+ })
146
+ })
147
+
148
+ Context ("When rclone container image command line flag is specified" , func () {
149
+ const cmdLineOverrideImageName = "test-rclone-image-name:cmdlineoverride"
150
+ BeforeEach (func () {
151
+ // Manually set the value of the command line flag
152
+ Expect (testPflagSet .Set ("rclone-container-image" , cmdLineOverrideImageName )).To (Succeed ())
153
+ })
154
+ It ("Should use the rclone container image set by the cmd line flag" , func () {
155
+ Expect (builderForInitTests .getRcloneContainerImage ()).To (Equal (cmdLineOverrideImageName ))
156
+ })
157
+
158
+ Context ("And env var is set" , func () {
159
+ const envVarOverrideShouldBeIgnored = "test-rclone-image-name:donotuseme"
160
+ BeforeEach (func () {
161
+ os .Setenv (rcloneContainerImageEnvVar , envVarOverrideShouldBeIgnored )
162
+ })
163
+ It ("Should still use the cmd line flag instead of the env var" , func () {
164
+ Expect (builderForInitTests .getRcloneContainerImage ()).To (Equal (cmdLineOverrideImageName ))
165
+ })
166
+ })
167
+ })
168
+
169
+ Context ("When rclone container image cmd line flag is not set and env var is" , func () {
170
+ const envVarOverrideImageName = "test-rclone-image-name:setbyenvvar"
171
+ BeforeEach (func () {
172
+ os .Setenv (rcloneContainerImageEnvVar , envVarOverrideImageName )
173
+ })
174
+ It ("Should use the value from the env var" , func () {
175
+ Expect (builderForInitTests .getRcloneContainerImage ()).To (Equal (envVarOverrideImageName ))
176
+ })
177
+ })
178
+ })
179
+ })
180
+
66
181
var _ = Describe ("Rclone ignores other movers" , func () {
67
182
logger := zap .New (zap .UseDevMode (true ), zap .WriteTo (GinkgoWriter ))
68
183
When ("An RS isn't for rclone" , func () {
@@ -76,8 +191,7 @@ var _ = Describe("Rclone ignores other movers", func() {
76
191
Rclone : nil ,
77
192
},
78
193
}
79
- builder := Builder {}
80
- m , e := builder .FromSource (k8sClient , logger , rs )
194
+ m , e := commonBuilderForTestSuite .FromSource (k8sClient , logger , rs )
81
195
Expect (m ).To (BeNil ())
82
196
Expect (e ).NotTo (HaveOccurred ())
83
197
})
@@ -93,8 +207,7 @@ var _ = Describe("Rclone ignores other movers", func() {
93
207
Rclone : nil ,
94
208
},
95
209
}
96
- builder := Builder {}
97
- m , e := builder .FromDestination (k8sClient , logger , rd )
210
+ m , e := commonBuilderForTestSuite .FromDestination (k8sClient , logger , rd )
98
211
Expect (m ).To (BeNil ())
99
212
Expect (e ).NotTo (HaveOccurred ())
100
213
})
@@ -168,9 +281,7 @@ var _ = Describe("Rclone as a source", func() {
168
281
// Controller sets status to non-nil
169
282
rs .Status = & volsyncv1alpha1.ReplicationSourceStatus {}
170
283
// Instantiate a rclone mover for the tests
171
- b := Builder {}
172
- var err error
173
- m , err := b .FromSource (k8sClient , logger , rs )
284
+ m , err := commonBuilderForTestSuite .FromSource (k8sClient , logger , rs )
174
285
Expect (err ).ToNot (HaveOccurred ())
175
286
Expect (m ).NotTo (BeNil ())
176
287
mover , _ = m .(* Mover )
@@ -401,7 +512,6 @@ var _ = Describe("Rclone as a source", func() {
401
512
}
402
513
})
403
514
JustBeforeEach (func () {
404
- rcloneContainerImage = "therclonecontainerimage"
405
515
Expect (k8sClient .Create (ctx , sa )).To (Succeed ())
406
516
Expect (k8sClient .Create (ctx , rcloneConfigSecret )).To (Succeed ())
407
517
})
@@ -431,7 +541,7 @@ var _ = Describe("Rclone as a source", func() {
431
541
return err
432
542
}).Should (Succeed ())
433
543
Expect (len (job .Spec .Template .Spec .Containers )).To (BeNumerically (">" , 0 ))
434
- Expect (job .Spec .Template .Spec .Containers [0 ].Image ).To (Equal (rcloneContainerImage ))
544
+ Expect (job .Spec .Template .Spec .Containers [0 ].Image ).To (Equal (defaultRcloneContainerImage ))
435
545
})
436
546
437
547
It ("should use the specified service account" , func () {
@@ -640,9 +750,7 @@ var _ = Describe("Rclone as a destination", func() {
640
750
// Controller sets status to non-nil
641
751
rd .Status = & volsyncv1alpha1.ReplicationDestinationStatus {}
642
752
// Instantiate a restic mover for the tests
643
- b := Builder {}
644
- var err error
645
- m , err := b .FromDestination (k8sClient , logger , rd )
753
+ m , err := commonBuilderForTestSuite .FromDestination (k8sClient , logger , rd )
646
754
Expect (err ).ToNot (HaveOccurred ())
647
755
Expect (m ).NotTo (BeNil ())
648
756
mover , _ = m .(* Mover )
@@ -769,7 +877,6 @@ var _ = Describe("Rclone as a destination", func() {
769
877
}
770
878
})
771
879
JustBeforeEach (func () {
772
- rcloneContainerImage = "therclonecontainerimage"
773
880
Expect (k8sClient .Create (ctx , dPVC )).To (Succeed ())
774
881
Expect (k8sClient .Create (ctx , sa )).To (Succeed ())
775
882
Expect (k8sClient .Create (ctx , rcloneConfigSecret )).To (Succeed ())
0 commit comments