Skip to content

Commit 5a5885b

Browse files
authored
remove unnecessary patch requests (#3380)
the suit seems failed due to a flaky test timeout, will manually rerun the suit
1 parent db7416e commit 5a5885b

File tree

2 files changed

+26
-85
lines changed

2 files changed

+26
-85
lines changed

pkg/targetgroupbinding/resource_manager.go

Lines changed: 18 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ package targetgroupbinding
22

33
import (
44
"context"
5-
"encoding/json"
65
"fmt"
76
"net/netip"
87
"time"
@@ -17,9 +16,7 @@ import (
1716
corev1 "k8s.io/api/core/v1"
1817
apierrors "k8s.io/apimachinery/pkg/api/errors"
1918
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
20-
"k8s.io/apimachinery/pkg/types"
2119
"k8s.io/apimachinery/pkg/util/sets"
22-
"k8s.io/apimachinery/pkg/util/strategicpatch"
2320
elbv2api "sigs.k8s.io/aws-load-balancer-controller/apis/elbv2/v1beta1"
2421
"sigs.k8s.io/aws-load-balancer-controller/pkg/aws/services"
2522
"sigs.k8s.io/aws-load-balancer-controller/pkg/backend"
@@ -290,9 +287,9 @@ func (m *defaultResourceManager) updateTargetHealthPodConditionForPod(ctx contex
290287
}
291288
needFurtherProbe := targetHealthCondStatus != corev1.ConditionTrue
292289

293-
existingTargetHealthCond, exists := pod.GetPodCondition(targetHealthCondType)
290+
existingTargetHealthCond, hasExistingTargetHealthCond := pod.GetPodCondition(targetHealthCondType)
294291
// we skip patch pod if it matches current computed status/reason/message.
295-
if exists &&
292+
if hasExistingTargetHealthCond &&
296293
existingTargetHealthCond.Status == targetHealthCondStatus &&
297294
existingTargetHealthCond.Reason == reason &&
298295
existingTargetHealthCond.Message == message {
@@ -305,22 +302,30 @@ func (m *defaultResourceManager) updateTargetHealthPodConditionForPod(ctx contex
305302
Reason: reason,
306303
Message: message,
307304
}
308-
if !exists || existingTargetHealthCond.Status != targetHealthCondStatus {
305+
if !hasExistingTargetHealthCond || existingTargetHealthCond.Status != targetHealthCondStatus {
309306
newTargetHealthCond.LastTransitionTime = metav1.Now()
307+
} else {
308+
newTargetHealthCond.LastTransitionTime = existingTargetHealthCond.LastTransitionTime
310309
}
311310

312-
patch, err := buildPodConditionPatch(pod, newTargetHealthCond)
313-
if err != nil {
314-
return false, err
315-
}
316-
k8sPod := &corev1.Pod{
311+
podPatchSource := &corev1.Pod{
317312
ObjectMeta: metav1.ObjectMeta{
318313
Namespace: pod.Key.Namespace,
319314
Name: pod.Key.Name,
320-
UID: pod.UID,
315+
},
316+
Status: corev1.PodStatus{
317+
Conditions: []corev1.PodCondition{},
321318
},
322319
}
323-
if err := m.k8sClient.Status().Patch(ctx, k8sPod, patch); err != nil {
320+
if hasExistingTargetHealthCond {
321+
podPatchSource.Status.Conditions = []corev1.PodCondition{existingTargetHealthCond}
322+
}
323+
324+
podPatchTarget := podPatchSource.DeepCopy()
325+
podPatchTarget.UID = pod.UID // only put the uid in the new object to ensure it appears in the patch as a precondition
326+
podPatchTarget.Status.Conditions = []corev1.PodCondition{newTargetHealthCond}
327+
328+
if err := m.k8sClient.Status().Patch(ctx, podPatchTarget, client.StrategicMergeFrom(podPatchSource)); err != nil {
324329
if apierrors.IsNotFound(err) {
325330
return false, nil
326331
}
@@ -512,31 +517,6 @@ func matchNodePortEndpointWithTargets(endpoints []backend.NodePortEndpoint, targ
512517
return matchedEndpointAndTargets, unmatchedEndpoints, unmatchedTargets
513518
}
514519

515-
func buildPodConditionPatch(pod k8s.PodInfo, condition corev1.PodCondition) (client.Patch, error) {
516-
oldData, err := json.Marshal(corev1.Pod{
517-
Status: corev1.PodStatus{
518-
Conditions: nil,
519-
},
520-
})
521-
if err != nil {
522-
return nil, err
523-
}
524-
newData, err := json.Marshal(corev1.Pod{
525-
ObjectMeta: metav1.ObjectMeta{UID: pod.UID}, // only put the uid in the new object to ensure it appears in the patch as a precondition
526-
Status: corev1.PodStatus{
527-
Conditions: []corev1.PodCondition{condition},
528-
},
529-
})
530-
if err != nil {
531-
return nil, err
532-
}
533-
patchBytes, err := strategicpatch.CreateTwoWayMergePatch(oldData, newData, corev1.Pod{})
534-
if err != nil {
535-
return nil, err
536-
}
537-
return client.RawPatch(types.StrategicMergePatchType, patchBytes), nil
538-
}
539-
540520
func isELBV2TargetGroupNotFoundError(err error) bool {
541521
var awsErr awserr.Error
542522
if errors.As(err, &awsErr) {

pkg/targetgroupbinding/resource_manager_test.go

Lines changed: 8 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -137,8 +137,10 @@ func Test_defaultResourceManager_updateTargetHealthPodConditionForPod(t *testing
137137
Status: corev1.PodStatus{
138138
Conditions: []corev1.PodCondition{
139139
{
140-
Type: "target-health.elbv2.k8s.aws/my-tgb",
141-
Status: corev1.ConditionFalse,
140+
Type: "target-health.elbv2.k8s.aws/my-tgb",
141+
Message: elbv2sdk.TargetHealthReasonEnumElbRegistrationInProgress,
142+
Reason: "Elb.RegistrationInProgress",
143+
Status: corev1.ConditionFalse,
142144
},
143145
{
144146
Type: corev1.ContainersReady,
@@ -160,8 +162,10 @@ func Test_defaultResourceManager_updateTargetHealthPodConditionForPod(t *testing
160162
},
161163
Conditions: []corev1.PodCondition{
162164
{
163-
Type: "target-health.elbv2.k8s.aws/my-tgb",
164-
Status: corev1.ConditionFalse,
165+
Type: "target-health.elbv2.k8s.aws/my-tgb",
166+
Message: elbv2sdk.TargetHealthReasonEnumElbRegistrationInProgress,
167+
Reason: "Elb.RegistrationInProgress",
168+
Status: corev1.ConditionFalse,
165169
},
166170
{
167171
Type: corev1.ContainersReady,
@@ -459,46 +463,3 @@ func Test_containsTargetsInInitialState(t *testing.T) {
459463
})
460464
}
461465
}
462-
463-
func Test_buildPodConditionPatch(t *testing.T) {
464-
type args struct {
465-
pod k8s.PodInfo
466-
condition corev1.PodCondition
467-
}
468-
tests := []struct {
469-
name string
470-
args args
471-
wantPatch []byte
472-
wantErr error
473-
}{
474-
{
475-
name: "standard case",
476-
args: args{
477-
pod: k8s.PodInfo{
478-
Key: types.NamespacedName{Namespace: "ns-1", Name: "pod-1"},
479-
UID: "pod-uuid",
480-
},
481-
condition: corev1.PodCondition{
482-
Type: "custom-condition",
483-
Status: corev1.ConditionTrue,
484-
Reason: "some-reason",
485-
Message: "some-msg",
486-
},
487-
},
488-
wantPatch: []byte(`{"metadata":{"uid":"pod-uuid"},"status":{"conditions":[{"lastProbeTime":null,"lastTransitionTime":null,"message":"some-msg","reason":"some-reason","status":"True","type":"custom-condition"}]}}`),
489-
},
490-
}
491-
for _, tt := range tests {
492-
t.Run(tt.name, func(t *testing.T) {
493-
got, err := buildPodConditionPatch(tt.args.pod, tt.args.condition)
494-
if tt.wantErr != nil {
495-
assert.EqualError(t, err, tt.wantErr.Error())
496-
} else {
497-
assert.NoError(t, err)
498-
gotPatch, _ := got.Data(nil)
499-
assert.Equal(t, tt.wantPatch, gotPatch)
500-
assert.Equal(t, types.StrategicMergePatchType, got.Type())
501-
}
502-
})
503-
}
504-
}

0 commit comments

Comments
 (0)