@@ -24,6 +24,7 @@ import (
24
24
25
25
"k8s.io/apimachinery/pkg/api/errors"
26
26
"k8s.io/apimachinery/pkg/api/meta"
27
+ metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
27
28
"k8s.io/apimachinery/pkg/runtime/schema"
28
29
"k8s.io/apimachinery/pkg/types"
29
30
genericfeatures "k8s.io/apiserver/pkg/features"
@@ -438,3 +439,106 @@ func TestApplyRequiresFieldManager(t *testing.T) {
438
439
t .Fatalf ("Apply failed to create with fieldManager: %v" , err )
439
440
}
440
441
}
442
+
443
+ // TestApplyRemoveContainerPort removes a container port from a deployment
444
+ func TestApplyRemoveContainerPort (t * testing.T ) {
445
+ defer utilfeaturetesting .SetFeatureGateDuringTest (t , utilfeature .DefaultFeatureGate , genericfeatures .ServerSideApply , true )()
446
+
447
+ _ , client , closeFn := setup (t )
448
+ defer closeFn ()
449
+
450
+ obj := []byte (`{
451
+ "apiVersion": "extensions/v1beta1",
452
+ "kind": "Deployment",
453
+ "metadata": {
454
+ "name": "deployment",
455
+ "labels": {"app": "nginx"}
456
+ },
457
+ "spec": {
458
+ "replicas": 3,
459
+ "selector": {
460
+ "matchLabels": {
461
+ "app": "nginx"
462
+ }
463
+ },
464
+ "template": {
465
+ "metadata": {
466
+ "labels": {
467
+ "app": "nginx"
468
+ }
469
+ },
470
+ "spec": {
471
+ "containers": [{
472
+ "name": "nginx",
473
+ "image": "nginx:latest",
474
+ "ports": [{
475
+ "containerPort": 80,
476
+ "protocol": "TCP"
477
+ }]
478
+ }]
479
+ }
480
+ }
481
+ }
482
+ }` )
483
+
484
+ _ , err := client .CoreV1 ().RESTClient ().Patch (types .ApplyPatchType ).
485
+ AbsPath ("/apis/extensions/v1beta1" ).
486
+ Namespace ("default" ).
487
+ Resource ("deployments" ).
488
+ Name ("deployment" ).
489
+ Param ("fieldManager" , "apply_test" ).
490
+ Body (obj ).Do ().Get ()
491
+ if err != nil {
492
+ t .Fatalf ("Failed to create object using Apply patch: %v" , err )
493
+ }
494
+
495
+ obj = []byte (`{
496
+ "apiVersion": "apps/v1",
497
+ "kind": "Deployment",
498
+ "metadata": {
499
+ "name": "deployment",
500
+ "labels": {"app": "nginx"}
501
+ },
502
+ "spec": {
503
+ "replicas": 3,
504
+ "selector": {
505
+ "matchLabels": {
506
+ "app": "nginx"
507
+ }
508
+ },
509
+ "template": {
510
+ "metadata": {
511
+ "labels": {
512
+ "app": "nginx"
513
+ }
514
+ },
515
+ "spec": {
516
+ "containers": [{
517
+ "name": "nginx",
518
+ "image": "nginx:latest"
519
+ }]
520
+ }
521
+ }
522
+ }
523
+ }` )
524
+
525
+ _ , err = client .CoreV1 ().RESTClient ().Patch (types .ApplyPatchType ).
526
+ AbsPath ("/apis/apps/v1" ).
527
+ Namespace ("default" ).
528
+ Resource ("deployments" ).
529
+ Name ("deployment" ).
530
+ Param ("fieldManager" , "apply_test" ).
531
+ Body (obj ).Do ().Get ()
532
+ if err != nil {
533
+ t .Fatalf ("Failed to remove container port using Apply patch: %v" , err )
534
+ }
535
+
536
+ deployment , err := client .AppsV1 ().Deployments ("default" ).Get ("deployment" , metav1.GetOptions {})
537
+ if err != nil {
538
+ t .Fatalf ("Failed to retrieve object: %v" , err )
539
+ }
540
+
541
+ if len (deployment .Spec .Template .Spec .Containers [0 ].Ports ) > 0 {
542
+ t .Fatalf ("Expected no container ports but got: %v" , deployment .Spec .Template .Spec .Containers [0 ].Ports )
543
+ }
544
+ }
0 commit comments