Skip to content

Commit 89a68be

Browse files
committed
Add integration test for a nop apply with an empty map
1 parent ae5543e commit 89a68be

File tree

1 file changed

+111
-0
lines changed

1 file changed

+111
-0
lines changed

test/integration/apiserver/apply/apply_test.go

Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -244,6 +244,117 @@ func TestNoOpUpdateSameResourceVersion(t *testing.T) {
244244
}
245245
}
246246

247+
// TestNoOpApplyWithEmptyMap
248+
func TestNoOpApplyWithEmptyMap(t *testing.T) {
249+
client, closeFn := setup(t)
250+
defer closeFn()
251+
252+
deploymentName := "no-op"
253+
deploymentsResource := "deployments"
254+
deploymentBytes := []byte(`{
255+
"apiVersion": "apps/v1",
256+
"kind": "Deployment",
257+
"metadata": {
258+
"name": "` + deploymentName + `",
259+
"labels": {
260+
"app": "nginx"
261+
}
262+
},
263+
"spec": {
264+
"replicas": 1,
265+
"selector": {
266+
"matchLabels": {
267+
"app": "nginx"
268+
}
269+
},
270+
"template": {
271+
"metadata": {
272+
"annotations": {},
273+
"labels": {
274+
"app": "nginx"
275+
}
276+
},
277+
"spec": {
278+
"containers": [{
279+
"name": "nginx",
280+
"image": "nginx:1.14.2",
281+
"ports": [{
282+
"containerPort": 80
283+
}]
284+
}]
285+
}
286+
}
287+
}
288+
}`)
289+
290+
_, err := client.AppsV1().RESTClient().Patch(types.ApplyPatchType).
291+
Namespace("default").
292+
Param("fieldManager", "apply_test").
293+
Resource(deploymentsResource).
294+
Name(deploymentName).
295+
Body(deploymentBytes).
296+
Do(context.TODO()).
297+
Get()
298+
if err != nil {
299+
t.Fatalf("Failed to create object: %v", err)
300+
}
301+
302+
// Sleep for one second to make sure that the times of each update operation is different.
303+
time.Sleep(1 * time.Second)
304+
305+
createdObject, err := client.AppsV1().RESTClient().Get().Namespace("default").Resource(deploymentsResource).Name(deploymentName).Do(context.TODO()).Get()
306+
if err != nil {
307+
t.Fatalf("Failed to retrieve created object: %v", err)
308+
}
309+
310+
createdAccessor, err := meta.Accessor(createdObject)
311+
if err != nil {
312+
t.Fatalf("Failed to get meta accessor for created object: %v", err)
313+
}
314+
315+
createdBytes, err := json.MarshalIndent(createdObject, "\t", "\t")
316+
if err != nil {
317+
t.Fatalf("Failed to marshal created object: %v", err)
318+
}
319+
320+
// Test that we can apply the same object and don't change the RV
321+
_, err = client.AppsV1().RESTClient().Patch(types.ApplyPatchType).
322+
Namespace("default").
323+
Param("fieldManager", "apply_test").
324+
Resource(deploymentsResource).
325+
Name(deploymentName).
326+
Body(deploymentBytes).
327+
Do(context.TODO()).
328+
Get()
329+
if err != nil {
330+
t.Fatalf("Failed to create object: %v", err)
331+
}
332+
333+
updatedObject, err := client.AppsV1().RESTClient().Get().Namespace("default").Resource(deploymentsResource).Name(deploymentName).Do(context.TODO()).Get()
334+
if err != nil {
335+
t.Fatalf("Failed to retrieve updated object: %v", err)
336+
}
337+
338+
updatedAccessor, err := meta.Accessor(updatedObject)
339+
if err != nil {
340+
t.Fatalf("Failed to get meta accessor for updated object: %v", err)
341+
}
342+
343+
updatedBytes, err := json.MarshalIndent(updatedObject, "\t", "\t")
344+
if err != nil {
345+
t.Fatalf("Failed to marshal updated object: %v", err)
346+
}
347+
348+
if createdAccessor.GetResourceVersion() != updatedAccessor.GetResourceVersion() {
349+
t.Fatalf("Expected same resource version to be %v but got: %v\nold object:\n%v\nnew object:\n%v",
350+
createdAccessor.GetResourceVersion(),
351+
updatedAccessor.GetResourceVersion(),
352+
string(createdBytes),
353+
string(updatedBytes),
354+
)
355+
}
356+
}
357+
247358
func getRV(obj runtime.Object) (string, error) {
248359
acc, err := meta.Accessor(obj)
249360
if err != nil {

0 commit comments

Comments
 (0)