Skip to content

Commit 249315b

Browse files
authored
Implement checkImageChange and tests (#5333)
* Implement checkImageChange and tests Signed-off-by: Shinnosuke Sawada-Dazai <[email protected]> * Add test case for the container order change Signed-off-by: Shinnosuke Sawada-Dazai <[email protected]> --------- Signed-off-by: Shinnosuke Sawada-Dazai <[email protected]>
1 parent 1763f92 commit 249315b

File tree

2 files changed

+202
-0
lines changed

2 files changed

+202
-0
lines changed

pkg/app/pipedv1/plugin/kubernetes/deployment/determine.go

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import (
2323
"github.com/pipe-cd/pipecd/pkg/app/pipedv1/plugin/kubernetes/config"
2424
"github.com/pipe-cd/pipecd/pkg/app/pipedv1/plugin/kubernetes/provider"
2525
"github.com/pipe-cd/pipecd/pkg/model"
26+
"github.com/pipe-cd/pipecd/pkg/plugin/diff"
2627
)
2728

2829
type containerImage struct {
@@ -170,3 +171,25 @@ func findConfigsAndSecrets(manifests []provider.Manifest) map[provider.ResourceK
170171
}
171172
return configs
172173
}
174+
175+
func checkImageChange(ns diff.Nodes) (string, bool) {
176+
const containerImageQuery = `^spec\.template\.spec\.containers\.\d+.image$`
177+
nodes, _ := ns.Find(containerImageQuery)
178+
if len(nodes) == 0 {
179+
return "", false
180+
}
181+
182+
images := make([]string, 0, len(ns))
183+
for _, n := range nodes {
184+
beforeImg := parseContainerImage(n.StringX())
185+
afterImg := parseContainerImage(n.StringY())
186+
187+
if beforeImg.name == afterImg.name {
188+
images = append(images, fmt.Sprintf("image %s from %s to %s", beforeImg.name, beforeImg.tag, afterImg.tag))
189+
} else {
190+
images = append(images, fmt.Sprintf("image %s:%s to %s:%s", beforeImg.name, beforeImg.tag, afterImg.name, afterImg.tag))
191+
}
192+
}
193+
desc := fmt.Sprintf("Sync progressively because of updating %s", strings.Join(images, ", "))
194+
return desc, true
195+
}

pkg/app/pipedv1/plugin/kubernetes/deployment/determine_test.go

Lines changed: 179 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import (
2121

2222
"github.com/stretchr/testify/assert"
2323
"github.com/stretchr/testify/require"
24+
"go.uber.org/zap"
2425
"sigs.k8s.io/yaml"
2526

2627
"github.com/pipe-cd/pipecd/pkg/app/pipedv1/plugin/kubernetes/config"
@@ -1064,3 +1065,181 @@ data:
10641065
})
10651066
}
10661067
}
1068+
1069+
func TestCheckImageChange(t *testing.T) {
1070+
tests := []struct {
1071+
name string
1072+
old string
1073+
new string
1074+
want string
1075+
wantOk bool
1076+
}{
1077+
{
1078+
name: "image updated",
1079+
old: `
1080+
apiVersion: apps/v1
1081+
kind: Deployment
1082+
metadata:
1083+
name: nginx-deployment
1084+
spec:
1085+
template:
1086+
spec:
1087+
containers:
1088+
- name: nginx
1089+
image: nginx:1.19.3
1090+
`,
1091+
new: `
1092+
apiVersion: apps/v1
1093+
kind: Deployment
1094+
metadata:
1095+
name: nginx-deployment
1096+
spec:
1097+
template:
1098+
spec:
1099+
containers:
1100+
- name: nginx
1101+
image: nginx:1.19.4
1102+
`,
1103+
want: "Sync progressively because of updating image nginx from 1.19.3 to 1.19.4",
1104+
wantOk: true,
1105+
},
1106+
{
1107+
name: "image name changed",
1108+
old: `
1109+
apiVersion: apps/v1
1110+
kind: Deployment
1111+
metadata:
1112+
name: nginx-deployment
1113+
spec:
1114+
template:
1115+
spec:
1116+
containers:
1117+
- name: nginx
1118+
image: nginx:1.19.3
1119+
`,
1120+
new: `
1121+
apiVersion: apps/v1
1122+
kind: Deployment
1123+
metadata:
1124+
name: nginx-deployment
1125+
spec:
1126+
template:
1127+
spec:
1128+
containers:
1129+
- name: redis
1130+
image: redis:6.0.9
1131+
`,
1132+
want: "Sync progressively because of updating image nginx:1.19.3 to redis:6.0.9",
1133+
wantOk: true,
1134+
},
1135+
{
1136+
name: "no image change",
1137+
old: `
1138+
apiVersion: apps/v1
1139+
kind: Deployment
1140+
metadata:
1141+
name: nginx-deployment
1142+
spec:
1143+
template:
1144+
spec:
1145+
containers:
1146+
- name: nginx
1147+
image: nginx:1.19.3
1148+
`,
1149+
new: `
1150+
apiVersion: apps/v1
1151+
kind: Deployment
1152+
metadata:
1153+
name: nginx-deployment
1154+
spec:
1155+
template:
1156+
spec:
1157+
containers:
1158+
- name: nginx
1159+
image: nginx:1.19.3
1160+
`,
1161+
want: "",
1162+
wantOk: false,
1163+
},
1164+
{
1165+
name: "multiple image updates",
1166+
old: `
1167+
apiVersion: apps/v1
1168+
kind: Deployment
1169+
metadata:
1170+
name: app-deployment
1171+
spec:
1172+
template:
1173+
spec:
1174+
containers:
1175+
- name: nginx
1176+
image: nginx:1.19.3
1177+
- name: redis
1178+
image: redis:6.0.9
1179+
`,
1180+
new: `
1181+
apiVersion: apps/v1
1182+
kind: Deployment
1183+
metadata:
1184+
name: app-deployment
1185+
spec:
1186+
template:
1187+
spec:
1188+
containers:
1189+
- name: nginx
1190+
image: nginx:1.19.4
1191+
- name: redis
1192+
image: redis:6.0.10
1193+
`,
1194+
want: "Sync progressively because of updating image nginx from 1.19.3 to 1.19.4, image redis from 6.0.9 to 6.0.10",
1195+
wantOk: true,
1196+
},
1197+
{
1198+
name: "change the order cause multi-image update",
1199+
old: `
1200+
apiVersion: apps/v1
1201+
kind: Deployment
1202+
metadata:
1203+
name: app-deployment
1204+
spec:
1205+
template:
1206+
spec:
1207+
containers:
1208+
- name: nginx
1209+
image: nginx:1.19.3
1210+
- name: redis
1211+
image: redis:6.0.9
1212+
`,
1213+
new: `
1214+
apiVersion: apps/v1
1215+
kind: Deployment
1216+
metadata:
1217+
name: app-deployment
1218+
spec:
1219+
template:
1220+
spec:
1221+
containers:
1222+
- name: redis
1223+
image: redis:6.0.9
1224+
- name: nginx
1225+
image: nginx:1.19.3
1226+
`,
1227+
want: "Sync progressively because of updating image nginx:1.19.3 to redis:6.0.9, image redis:6.0.9 to nginx:1.19.3",
1228+
wantOk: true,
1229+
},
1230+
}
1231+
1232+
for _, tt := range tests {
1233+
t.Run(tt.name, func(t *testing.T) {
1234+
oldManifests := mustParseManifests(t, tt.old)
1235+
newManifests := mustParseManifests(t, tt.new)
1236+
logger := zap.NewNop() // or use a real logger if available
1237+
diffs, err := provider.Diff(oldManifests[0], newManifests[0], logger)
1238+
require.NoError(t, err)
1239+
1240+
got, ok := checkImageChange(diffs.Nodes())
1241+
assert.Equal(t, tt.wantOk, ok)
1242+
assert.Equal(t, tt.want, got)
1243+
})
1244+
}
1245+
}

0 commit comments

Comments
 (0)