@@ -146,7 +146,8 @@ func defaultStatefulSetBuilder() *Builder {
146146 SetName (TestName ).
147147 SetNamespace (TestNamespace ).
148148 SetServiceName (fmt .Sprintf ("%s-svc" , TestName )).
149- SetLabels (map [string ]string {})
149+ SetLabels (map [string ]string {}).
150+ SetUpdateStrategy (appsv1 .RollingUpdateStatefulSetStrategyType )
150151}
151152
152153func podTemplateWithContainers (containers []corev1.Container ) corev1.PodTemplateSpec {
@@ -203,3 +204,73 @@ func TestCreateVolumeMountWithMultipleOptions(t *testing.T) {
203204 assert .Equal (t , mount .SubPath , "our-subpath" )
204205 assert .True (t , mount .ReadOnly )
205206}
207+
208+ func TestHaveEqualSpec (t * testing.T ) {
209+ t .Run ("Identical StatefulSet" , func (t * testing.T ) {
210+ builtSts , _ := defaultStatefulSetBuilder ().Build ()
211+ existingSts , _ := defaultStatefulSetBuilder ().Build ()
212+ areEqual , err := HaveEqualSpec (builtSts , existingSts )
213+ assert .NoError (t , err )
214+ assert .True (t , areEqual , "When both stateful sets are identical, these should be considered equivalent" )
215+ })
216+ t .Run ("Built StatefulSet is different from existing StatefulSet" , func (t * testing.T ) {
217+ builtSts , _ := defaultStatefulSetBuilder ().SetUpdateStrategy (appsv1 .OnDeleteStatefulSetStrategyType ).Build ()
218+ existingSts , _ := defaultStatefulSetBuilder ().Build ()
219+ areEqual , err := HaveEqualSpec (builtSts , existingSts )
220+ assert .NoError (t , err )
221+ assert .False (t , areEqual , "We have specified a field that is different from the existing StatefulSet, so these should be considered different" )
222+ })
223+ t .Run ("Existing StatefulSet has values we don't specify" , func (t * testing.T ) {
224+ builtSts , _ := defaultStatefulSetBuilder ().Build ()
225+ existingSts , _ := defaultStatefulSetBuilder ().Build ()
226+ revHistoryList := int32 (30 )
227+ existingSts .Spec .RevisionHistoryLimit = & revHistoryList
228+
229+ areEqual , err := HaveEqualSpec (builtSts , existingSts )
230+ assert .NoError (t , err )
231+ assert .True (t , areEqual , "Specs should be considered equal even though the existing StatefulSet has fields we are not interested in" )
232+ })
233+
234+ t .Run ("Metadata differences" , func (t * testing.T ) {
235+ builtSts , _ := defaultStatefulSetBuilder ().SetName ("different-name" ).Build ()
236+ existingSts , _ := defaultStatefulSetBuilder ().Build ()
237+ areEqual , err := HaveEqualSpec (builtSts , existingSts )
238+ assert .NoError (t , err )
239+ assert .True (t , areEqual , "Metadata differences should not be considered, we are just looking at spec" )
240+ })
241+
242+ t .Run ("Change to PodSpecTemplate" , func (t * testing.T ) {
243+ builtSts , _ := defaultStatefulSetBuilder ().Build ()
244+ existingSts , _ := defaultStatefulSetBuilder ().Build ()
245+ t .Run ("Same Container added" , func (t * testing.T ) {
246+ builtSts .Spec .Template .Spec .Containers = []corev1.Container {{Name : "container-1" }}
247+ existingSts .Spec .Template .Spec .Containers = []corev1.Container {{Name : "container-1" }}
248+ areEqual , err := HaveEqualSpec (builtSts , existingSts )
249+ assert .NoError (t , err )
250+ assert .True (t , areEqual , "Having the same container should be equal" )
251+ })
252+
253+ t .Run ("Existing StatefulSet has init containers" , func (t * testing.T ) {
254+ builtSts .Spec .Template .Spec .Containers = []corev1.Container {{Name : "container-1" }}
255+ existingSts .Spec .Template .Spec .Containers = []corev1.Container {{Name : "container-1" }}
256+ existingSts .Spec .Template .Spec .InitContainers = []corev1.Container {{Name : "container-1-init" }}
257+ areEqual , err := HaveEqualSpec (builtSts , existingSts )
258+ assert .NoError (t , err )
259+ assert .True (t , areEqual , "The existing StatefulSet has a field we have not touched in the spec (initContainers), this should be ignored in spec comparison" )
260+ })
261+ t .Run ("Different Container added" , func (t * testing.T ) {
262+ builtSts .Spec .Template .Spec .Containers = []corev1.Container {{Name : "container-2" }}
263+ existingSts .Spec .Template .Spec .Containers = []corev1.Container {{Name : "container-3" }}
264+ areEqual , err := HaveEqualSpec (builtSts , existingSts )
265+ assert .NoError (t , err )
266+ assert .False (t , areEqual , "Metadata differences should not be considered, we are just looking at spec" )
267+ })
268+ t .Run ("Image Change" , func (t * testing.T ) {
269+ builtSts .Spec .Template .Spec .Containers = []corev1.Container {{Name : "container-1" , Image : "image-1" }}
270+ existingSts .Spec .Template .Spec .Containers = []corev1.Container {{Name : "container-1" , Image : "image-2" }}
271+ areEqual , err := HaveEqualSpec (builtSts , existingSts )
272+ assert .NoError (t , err )
273+ assert .False (t , areEqual , "A single different field in an element in a list should result in the specs being different" )
274+ })
275+ })
276+ }
0 commit comments