-
Notifications
You must be signed in to change notification settings - Fork 4.7k
/
rollback_generator_test.go
122 lines (100 loc) · 3.4 KB
/
rollback_generator_test.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
package rollback
import (
"testing"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
kapi "k8s.io/kubernetes/pkg/api"
deployapi "github.com/openshift/origin/pkg/deploy/api"
deploytest "github.com/openshift/origin/pkg/deploy/api/test"
)
func TestGeneration(t *testing.T) {
from := deploytest.OkDeploymentConfig(2)
from.Spec.Strategy = deployapi.DeploymentStrategy{
Type: deployapi.DeploymentStrategyTypeCustom,
}
from.Spec.Triggers = append(from.Spec.Triggers, deployapi.DeploymentTriggerPolicy{Type: deployapi.DeploymentTriggerOnConfigChange})
from.Spec.Triggers = append(from.Spec.Triggers, deploytest.OkImageChangeTrigger())
from.Spec.Template.Spec.Containers[0].Name = "changed"
from.Spec.Replicas = 5
from.Spec.Selector = map[string]string{
"new1": "new2",
"new2": "new2",
}
to := deploytest.OkDeploymentConfig(1)
// Generate a rollback for every combination of flag (using 1 bit per flag).
rollbackSpecs := []*deployapi.DeploymentConfigRollbackSpec{}
for i := 0; i < 15; i++ {
spec := &deployapi.DeploymentConfigRollbackSpec{
From: kapi.ObjectReference{
Name: "deployment",
Namespace: metav1.NamespaceDefault,
},
IncludeTriggers: i&(1<<0) > 0,
IncludeTemplate: i&(1<<1) > 0,
IncludeReplicationMeta: i&(1<<2) > 0,
IncludeStrategy: i&(1<<3) > 0,
}
rollbackSpecs = append(rollbackSpecs, spec)
}
generator := NewRollbackGenerator()
// Test every combination.
for _, spec := range rollbackSpecs {
t.Logf("testing spec %#v", spec)
if rollback, err := generator.GenerateRollback(from, to, spec); err != nil {
t.Fatalf("Unexpected error: %v", err)
} else {
if hasStrategyDiff(from, rollback) && !spec.IncludeStrategy {
t.Fatalf("unexpected strategy diff: from=%v, rollback=%v", from, rollback)
}
if hasTriggerDiff(from, rollback) && !spec.IncludeTriggers {
t.Fatalf("unexpected trigger diff: from=%v, rollback=%v", from, rollback)
}
if hasPodTemplateDiff(from, rollback) && !spec.IncludeTemplate {
t.Fatalf("unexpected template diff: from=%v, rollback=%v", from, rollback)
}
if hasReplicationMetaDiff(from, rollback) && !spec.IncludeReplicationMeta {
t.Fatalf("unexpected replication meta diff: from=%v, rollback=%v", from, rollback)
}
for i, trigger := range rollback.Spec.Triggers {
if trigger.Type == deployapi.DeploymentTriggerOnImageChange && trigger.ImageChangeParams.Automatic {
t.Errorf("image change trigger %d should be disabled", i)
}
}
}
}
}
func hasStrategyDiff(a, b *deployapi.DeploymentConfig) bool {
return a.Spec.Strategy.Type != b.Spec.Strategy.Type
}
func hasTriggerDiff(a, b *deployapi.DeploymentConfig) bool {
if len(a.Spec.Triggers) != len(b.Spec.Triggers) {
return true
}
for _, triggerA := range a.Spec.Triggers {
bHasTrigger := false
for _, triggerB := range b.Spec.Triggers {
if triggerB.Type == triggerA.Type {
bHasTrigger = true
break
}
}
if !bHasTrigger {
return true
}
}
return false
}
func hasReplicationMetaDiff(a, b *deployapi.DeploymentConfig) bool {
if a.Spec.Replicas != b.Spec.Replicas {
return true
}
for keyA, valueA := range a.Spec.Selector {
if valueB, exists := b.Spec.Selector[keyA]; !exists || valueA != valueB {
return true
}
}
return false
}
func hasPodTemplateDiff(a, b *deployapi.DeploymentConfig) bool {
specA, specB := a.Spec.Template.Spec, b.Spec.Template.Spec
return !kapi.Semantic.DeepEqual(specA, specB)
}