Skip to content

Commit 302e1ce

Browse files
[release-1.17] Added the verification for resourceUtil mode to split traffic (#317)
* Added the verification for resourceUtil mode to split traffic * Keep the check on the LastStage --------- Co-authored-by: Vincent Hou <shou73@bloomberg.net>
1 parent 50b161c commit 302e1ce

File tree

2 files changed

+57
-23
lines changed

2 files changed

+57
-23
lines changed

pkg/reconciler/service/service.go

Lines changed: 48 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ import (
4444
listers "knative.dev/serving-progressive-rollout/pkg/client/listers/serving/v1"
4545
"knative.dev/serving-progressive-rollout/pkg/reconciler/common"
4646
"knative.dev/serving-progressive-rollout/pkg/reconciler/rolloutorchestrator"
47+
"knative.dev/serving-progressive-rollout/pkg/reconciler/rolloutorchestrator/strategies"
4748
"knative.dev/serving-progressive-rollout/pkg/reconciler/service/resources"
4849
"knative.dev/serving/pkg/apis/autoscaling"
4950
"knative.dev/serving/pkg/apis/serving"
@@ -937,14 +938,38 @@ func convertIntoTrafficTarget(name string, ro *v1.RolloutOrchestrator, rc *Rollo
937938
// The name is the same as the revision name.
938939
spaTargetRevName := targetRevName
939940
targetNumberReplicas, minScale := finalTargetRevs[0].MinScale, finalTargetRevs[0].MinScale
941+
var minScalingDown *int32
942+
targetNameScalingDown := ""
943+
var targetReplicasPercentage *int64
940944

941945
// Find the target number of replicas for the current stage.
942946
for _, revision := range ro.Spec.StageTargetRevisions {
943947
if revision.RevisionName == spaTargetRevName && revision.TargetReplicas != nil {
944948
targetNumberReplicas = revision.TargetReplicas
949+
targetReplicasPercentage = revision.Percent
945950
}
951+
952+
if revision.Direction == v1.DirectionDown {
953+
targetNameScalingDown = revision.RevisionName
954+
minScalingDown = revision.MinScale
955+
}
956+
}
957+
958+
// Verify if the revision scaling down is traffic driven or not.
959+
spa, err := spaLister.Get(targetNameScalingDown)
960+
trafficDriven := true
961+
962+
if err == nil && ((spa.Status.ActualScale != nil && minScalingDown != nil &&
963+
*spa.Status.ActualScale <= *minScalingDown) ||
964+
(spa.Status.ActualScale != nil && *spa.Status.ActualScale == 0 && minScalingDown == nil)) {
965+
trafficDriven = false
966+
}
967+
968+
lastStage := false
969+
if targetReplicasPercentage != nil && *targetReplicasPercentage == 100 {
970+
lastStage = true
946971
}
947-
spa, err := spaLister.Get(spaTargetRevName)
972+
spa, err = spaLister.Get(spaTargetRevName)
948973
// Check the number of replicas has reached the target number of replicas for the revision scaling up
949974
if err == nil && targetNumberReplicas != nil && spa.Status.ActualScale != nil && minScale != nil &&
950975
*spa.Status.ActualScale < *minScale && *spa.Status.ActualScale < *targetNumberReplicas {
@@ -954,27 +979,31 @@ func convertIntoTrafficTarget(name string, ro *v1.RolloutOrchestrator, rc *Rollo
954979
// However, if there is no issue getting yhe spa, and the actual number of replicas is less than
955980
// the target number of replicas, we need to use ro.Status.StageRevisionStatus or route.Status.Traffic
956981
// as the traffic information for the route.
957-
if len(ro.Status.StageRevisionStatus) > 0 {
958-
// If the ro has the StageRevisionStatus in the status, use it.
959-
revisionTarget = ro.Status.StageRevisionStatus
960-
for index := range revisionTarget {
961-
if revisionTarget[index].RevisionName == spaTargetRevName {
962-
continue
963-
}
964-
revisionTarget[index].LatestRevision = ptr.Bool(false)
965-
}
966-
} else {
967-
// If the ro does not have the StageRevisionStatus in the status, use the existing one in route.
968-
route, errRoute := routeLister.Get(ro.Name)
969-
if errRoute == nil && len(route.Status.Traffic) > 0 {
970-
traffics := route.Status.Traffic
971-
for index := range traffics {
972-
if traffics[index].RevisionName == spaTargetRevName {
982+
983+
if rc.ProgressiveRolloutStrategy == strategies.AvailabilityStrategy ||
984+
(rc.ProgressiveRolloutStrategy == strategies.ResourceUtilStrategy && !trafficDriven && !lastStage) {
985+
if len(ro.Status.StageRevisionStatus) > 0 {
986+
// If the ro has the StageRevisionStatus in the status, use it.
987+
revisionTarget = ro.Status.StageRevisionStatus
988+
for index := range revisionTarget {
989+
if revisionTarget[index].RevisionName == spaTargetRevName {
973990
continue
974991
}
975-
traffics[index].LatestRevision = ptr.Bool(false)
992+
revisionTarget[index].LatestRevision = ptr.Bool(false)
993+
}
994+
} else {
995+
// If the ro does not have the StageRevisionStatus in the status, use the existing one in route.
996+
route, errRoute := routeLister.Get(ro.Name)
997+
if errRoute == nil && len(route.Status.Traffic) > 0 {
998+
traffics := route.Status.Traffic
999+
for index := range traffics {
1000+
if traffics[index].RevisionName == spaTargetRevName {
1001+
continue
1002+
}
1003+
traffics[index].LatestRevision = ptr.Bool(false)
1004+
}
1005+
return traffics
9761006
}
977-
return traffics
9781007
}
9791008
}
9801009
}

pkg/reconciler/service/service_test.go

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import (
2929
v1 "knative.dev/serving-progressive-rollout/pkg/apis/serving/v1"
3030
listers "knative.dev/serving-progressive-rollout/pkg/client/listers/serving/v1"
3131
"knative.dev/serving-progressive-rollout/pkg/reconciler/common"
32+
"knative.dev/serving-progressive-rollout/pkg/reconciler/rolloutorchestrator/strategies"
3233
"knative.dev/serving-progressive-rollout/pkg/reconciler/service/resources"
3334
"knative.dev/serving/pkg/apis/autoscaling"
3435
"knative.dev/serving/pkg/apis/autoscaling/v1alpha1"
@@ -912,7 +913,8 @@ func TestTransformService(t *testing.T) {
912913
},
913914
routeLister: MockRouteLister{},
914915
rc: &RolloutConfig{
915-
ProgressiveRolloutEnabled: true,
916+
ProgressiveRolloutEnabled: true,
917+
ProgressiveRolloutStrategy: strategies.AvailabilityStrategy,
916918
},
917919
service: &servingv1.Service{
918920
ObjectMeta: metav1.ObjectMeta{
@@ -950,7 +952,8 @@ func TestTransformService(t *testing.T) {
950952
},
951953
routeLister: MockRouteLister{},
952954
rc: &RolloutConfig{
953-
ProgressiveRolloutEnabled: true,
955+
ProgressiveRolloutEnabled: true,
956+
ProgressiveRolloutStrategy: strategies.AvailabilityStrategy,
954957
},
955958
service: &servingv1.Service{
956959
ObjectMeta: metav1.ObjectMeta{
@@ -983,7 +986,8 @@ func TestTransformService(t *testing.T) {
983986
},
984987
routeLister: MockRouteLister{},
985988
rc: &RolloutConfig{
986-
ProgressiveRolloutEnabled: true,
989+
ProgressiveRolloutEnabled: true,
990+
ProgressiveRolloutStrategy: strategies.AvailabilityStrategy,
987991
},
988992
service: &servingv1.Service{
989993
ObjectMeta: metav1.ObjectMeta{
@@ -1022,7 +1026,8 @@ func TestTransformService(t *testing.T) {
10221026
},
10231027
routeLister: MockRouteLister{},
10241028
rc: &RolloutConfig{
1025-
ProgressiveRolloutEnabled: true,
1029+
ProgressiveRolloutEnabled: true,
1030+
ProgressiveRolloutStrategy: strategies.AvailabilityStrategy,
10261031
},
10271032
service: &servingv1.Service{
10281033
ObjectMeta: metav1.ObjectMeta{

0 commit comments

Comments
 (0)