@@ -1113,3 +1113,230 @@ want: %#+v`, got, converted)
11131113 })
11141114 }
11151115}
1116+
1117+ func TestDedupOwnerReferences (t * testing.T ) {
1118+ falseA := false
1119+ falseB := false
1120+ testCases := []struct {
1121+ name string
1122+ ownerReferences []metav1.OwnerReference
1123+ expected []metav1.OwnerReference
1124+ }{
1125+ {
1126+ name : "simple multiple duplicates" ,
1127+ ownerReferences : []metav1.OwnerReference {
1128+ {
1129+ APIVersion : "customresourceVersion" ,
1130+ Kind : "customresourceKind" ,
1131+ Name : "name" ,
1132+ UID : "1" ,
1133+ },
1134+ {
1135+ APIVersion : "customresourceVersion" ,
1136+ Kind : "customresourceKind" ,
1137+ Name : "name" ,
1138+ UID : "2" ,
1139+ },
1140+ {
1141+ APIVersion : "customresourceVersion" ,
1142+ Kind : "customresourceKind" ,
1143+ Name : "name" ,
1144+ UID : "1" ,
1145+ },
1146+ {
1147+ APIVersion : "customresourceVersion" ,
1148+ Kind : "customresourceKind" ,
1149+ Name : "name" ,
1150+ UID : "1" ,
1151+ },
1152+ {
1153+ APIVersion : "customresourceVersion" ,
1154+ Kind : "customresourceKind" ,
1155+ Name : "name" ,
1156+ UID : "2" ,
1157+ },
1158+ },
1159+ expected : []metav1.OwnerReference {
1160+ {
1161+ APIVersion : "customresourceVersion" ,
1162+ Kind : "customresourceKind" ,
1163+ Name : "name" ,
1164+ UID : "1" ,
1165+ },
1166+ {
1167+ APIVersion : "customresourceVersion" ,
1168+ Kind : "customresourceKind" ,
1169+ Name : "name" ,
1170+ UID : "2" ,
1171+ },
1172+ },
1173+ },
1174+ {
1175+ name : "don't dedup same uid different name entries" ,
1176+ ownerReferences : []metav1.OwnerReference {
1177+ {
1178+ APIVersion : "customresourceVersion" ,
1179+ Kind : "customresourceKind" ,
1180+ Name : "name1" ,
1181+ UID : "1" ,
1182+ },
1183+ {
1184+ APIVersion : "customresourceVersion" ,
1185+ Kind : "customresourceKind" ,
1186+ Name : "name2" ,
1187+ UID : "1" ,
1188+ },
1189+ },
1190+ expected : []metav1.OwnerReference {
1191+ {
1192+ APIVersion : "customresourceVersion" ,
1193+ Kind : "customresourceKind" ,
1194+ Name : "name1" ,
1195+ UID : "1" ,
1196+ },
1197+ {
1198+ APIVersion : "customresourceVersion" ,
1199+ Kind : "customresourceKind" ,
1200+ Name : "name2" ,
1201+ UID : "1" ,
1202+ },
1203+ },
1204+ },
1205+ {
1206+ name : "don't dedup same uid different API version entries" ,
1207+ ownerReferences : []metav1.OwnerReference {
1208+ {
1209+ APIVersion : "customresourceVersion1" ,
1210+ Kind : "customresourceKind" ,
1211+ Name : "name" ,
1212+ UID : "1" ,
1213+ },
1214+ {
1215+ APIVersion : "customresourceVersion2" ,
1216+ Kind : "customresourceKind" ,
1217+ Name : "name" ,
1218+ UID : "1" ,
1219+ },
1220+ },
1221+ expected : []metav1.OwnerReference {
1222+ {
1223+ APIVersion : "customresourceVersion1" ,
1224+ Kind : "customresourceKind" ,
1225+ Name : "name" ,
1226+ UID : "1" ,
1227+ },
1228+ {
1229+ APIVersion : "customresourceVersion2" ,
1230+ Kind : "customresourceKind" ,
1231+ Name : "name" ,
1232+ UID : "1" ,
1233+ },
1234+ },
1235+ },
1236+ {
1237+ name : "dedup memory-equal entries" ,
1238+ ownerReferences : []metav1.OwnerReference {
1239+ {
1240+ APIVersion : "customresourceVersion" ,
1241+ Kind : "customresourceKind" ,
1242+ Name : "name" ,
1243+ UID : "1" ,
1244+ Controller : & falseA ,
1245+ BlockOwnerDeletion : & falseA ,
1246+ },
1247+ {
1248+ APIVersion : "customresourceVersion" ,
1249+ Kind : "customresourceKind" ,
1250+ Name : "name" ,
1251+ UID : "1" ,
1252+ Controller : & falseA ,
1253+ BlockOwnerDeletion : & falseA ,
1254+ },
1255+ },
1256+ expected : []metav1.OwnerReference {
1257+ {
1258+ APIVersion : "customresourceVersion" ,
1259+ Kind : "customresourceKind" ,
1260+ Name : "name" ,
1261+ UID : "1" ,
1262+ Controller : & falseA ,
1263+ BlockOwnerDeletion : & falseA ,
1264+ },
1265+ },
1266+ },
1267+ {
1268+ name : "dedup semantic-equal entries" ,
1269+ ownerReferences : []metav1.OwnerReference {
1270+ {
1271+ APIVersion : "customresourceVersion" ,
1272+ Kind : "customresourceKind" ,
1273+ Name : "name" ,
1274+ UID : "1" ,
1275+ Controller : & falseA ,
1276+ BlockOwnerDeletion : & falseA ,
1277+ },
1278+ {
1279+ APIVersion : "customresourceVersion" ,
1280+ Kind : "customresourceKind" ,
1281+ Name : "name" ,
1282+ UID : "1" ,
1283+ Controller : & falseB ,
1284+ BlockOwnerDeletion : & falseB ,
1285+ },
1286+ },
1287+ expected : []metav1.OwnerReference {
1288+ {
1289+ APIVersion : "customresourceVersion" ,
1290+ Kind : "customresourceKind" ,
1291+ Name : "name" ,
1292+ UID : "1" ,
1293+ Controller : & falseA ,
1294+ BlockOwnerDeletion : & falseA ,
1295+ },
1296+ },
1297+ },
1298+ {
1299+ name : "don't dedup semantic-different entries" ,
1300+ ownerReferences : []metav1.OwnerReference {
1301+ {
1302+ APIVersion : "customresourceVersion" ,
1303+ Kind : "customresourceKind" ,
1304+ Name : "name" ,
1305+ UID : "1" ,
1306+ Controller : & falseA ,
1307+ BlockOwnerDeletion : & falseA ,
1308+ },
1309+ {
1310+ APIVersion : "customresourceVersion" ,
1311+ Kind : "customresourceKind" ,
1312+ Name : "name" ,
1313+ UID : "1" ,
1314+ },
1315+ },
1316+ expected : []metav1.OwnerReference {
1317+ {
1318+ APIVersion : "customresourceVersion" ,
1319+ Kind : "customresourceKind" ,
1320+ Name : "name" ,
1321+ UID : "1" ,
1322+ Controller : & falseA ,
1323+ BlockOwnerDeletion : & falseA ,
1324+ },
1325+ {
1326+ APIVersion : "customresourceVersion" ,
1327+ Kind : "customresourceKind" ,
1328+ Name : "name" ,
1329+ UID : "1" ,
1330+ },
1331+ },
1332+ },
1333+ }
1334+ for _ , tc := range testCases {
1335+ t .Run (tc .name , func (t * testing.T ) {
1336+ deduped , _ := dedupOwnerReferences (tc .ownerReferences )
1337+ if ! apiequality .Semantic .DeepEqual (deduped , tc .expected ) {
1338+ t .Errorf ("diff: %v" , diff .ObjectReflectDiff (deduped , tc .expected ))
1339+ }
1340+ })
1341+ }
1342+ }
0 commit comments