mirror of https://github.com/knative/client.git
Traffic split auto redirection should only consider the active revisions (#1617)
* Traffic split should consider only the active revisions * Modified unit test for traffic split change * Fix e2e test case * e2e test fix
This commit is contained in:
parent
8ac7a827ba
commit
7be13f05ac
|
|
@ -242,12 +242,12 @@ func errorSumGreaterThan100(sum int) error {
|
||||||
// - if provided traffic portion are integers
|
// - if provided traffic portion are integers
|
||||||
// - if traffic as per flags sums to 100
|
// - if traffic as per flags sums to 100
|
||||||
// - if traffic as per flags < 100, can remaining traffic be automatically directed
|
// - if traffic as per flags < 100, can remaining traffic be automatically directed
|
||||||
func verifyInput(trafficFlags *flags.Traffic, svc *servingv1.Service, revisions []servingv1.Revision, mutation bool) error {
|
func verifyInput(trafficFlags *flags.Traffic, svc *servingv1.Service, targets []servingv1.TrafficTarget, existingRevisions []servingv1.Revision, mutation bool) error {
|
||||||
// check if traffic is being sent to @latest tag
|
// check if traffic is being sent to @latest tag
|
||||||
var latestRefTraffic bool
|
var latestRefTraffic bool
|
||||||
|
|
||||||
// number of existing revisions
|
// number of existing targets
|
||||||
var existingRevisionCount = len(revisions)
|
var existingRevisionCount = len(targets)
|
||||||
|
|
||||||
err := verifyLatestTag(trafficFlags)
|
err := verifyLatestTag(trafficFlags)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
@ -272,7 +272,7 @@ func verifyInput(trafficFlags *flags.Traffic, svc *servingv1.Service, revisions
|
||||||
latestRefTraffic = true
|
latestRefTraffic = true
|
||||||
}
|
}
|
||||||
|
|
||||||
// number of revisions specified in traffic flags
|
// number of targets specified in traffic flags
|
||||||
specRevPercentCount := len(trafficFlags.RevisionsPercentages)
|
specRevPercentCount := len(trafficFlags.RevisionsPercentages)
|
||||||
|
|
||||||
// no traffic to route
|
// no traffic to route
|
||||||
|
|
@ -307,8 +307,12 @@ func verifyInput(trafficFlags *flags.Traffic, svc *servingv1.Service, revisions
|
||||||
}
|
}
|
||||||
|
|
||||||
// remaining % to 100
|
// remaining % to 100
|
||||||
for _, rev := range revisions {
|
for _, target := range targets {
|
||||||
if !checkRevisionPresent(revisionRefMap, rev) {
|
rev := getRevisionFromList(existingRevisions, target.RevisionName)
|
||||||
|
if rev == nil {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
if !checkRevisionPresent(revisionRefMap, *rev) {
|
||||||
trafficFlags.RevisionsPercentages = append(trafficFlags.RevisionsPercentages, fmt.Sprintf("%s=%d", rev.Name, 100-sum))
|
trafficFlags.RevisionsPercentages = append(trafficFlags.RevisionsPercentages, fmt.Sprintf("%s=%d", rev.Name, 100-sum))
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
@ -317,6 +321,17 @@ func verifyInput(trafficFlags *flags.Traffic, svc *servingv1.Service, revisions
|
||||||
return errorTrafficDistribution(sum, errorDistributionRevisionNotFound)
|
return errorTrafficDistribution(sum, errorDistributionRevisionNotFound)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func getRevisionFromList(revisions []servingv1.Revision, name string) *servingv1.Revision {
|
||||||
|
var revisionWithName *servingv1.Revision
|
||||||
|
for _, rev := range revisions {
|
||||||
|
if rev.Name == name {
|
||||||
|
revisionWithName = rev.DeepCopy()
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return revisionWithName
|
||||||
|
}
|
||||||
|
|
||||||
func verifyRevisionSumAndReferences(trafficFlags *flags.Traffic) (revisionRefMap map[string]int, sum int, err error) {
|
func verifyRevisionSumAndReferences(trafficFlags *flags.Traffic) (revisionRefMap map[string]int, sum int, err error) {
|
||||||
|
|
||||||
revisionRefMap = make(map[string]int)
|
revisionRefMap = make(map[string]int)
|
||||||
|
|
@ -384,10 +399,12 @@ func checkRevisionPresent(refMap map[string]int, rev servingv1.Revision) bool {
|
||||||
// total traffic per flags < 100, the params 'revisions' and 'mutation' are used to direct remaining
|
// total traffic per flags < 100, the params 'revisions' and 'mutation' are used to direct remaining
|
||||||
// traffic. Param 'mutation' is set to true if a new revision will be created on service update
|
// traffic. Param 'mutation' is set to true if a new revision will be created on service update
|
||||||
func Compute(cmd *cobra.Command, svc *servingv1.Service,
|
func Compute(cmd *cobra.Command, svc *servingv1.Service,
|
||||||
trafficFlags *flags.Traffic, revisions []servingv1.Revision, mutation bool) ([]servingv1.TrafficTarget, error) {
|
trafficFlags *flags.Traffic, allRevisions []servingv1.Revision, mutation bool) ([]servingv1.TrafficTarget, error) {
|
||||||
targets := svc.Spec.Traffic
|
targets := svc.Spec.Traffic
|
||||||
serviceName := svc.Name
|
serviceName := svc.Name
|
||||||
err := verifyInput(trafficFlags, svc, revisions, mutation)
|
revisions := svc.Status.Traffic
|
||||||
|
|
||||||
|
err := verifyInput(trafficFlags, svc, revisions, allRevisions, mutation)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -82,6 +82,7 @@ func getService(name, latestRevision string, existingTraffic ServiceTraffic) *se
|
||||||
},
|
},
|
||||||
}}
|
}}
|
||||||
service.Status.LatestReadyRevisionName = latestRevision
|
service.Status.LatestReadyRevisionName = latestRevision
|
||||||
|
service.Status.Traffic = existingTraffic
|
||||||
return service
|
return service
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -553,7 +554,7 @@ func TestComputeErrMsg(t *testing.T) {
|
||||||
{
|
{
|
||||||
name: "traffic split sum < 100 error when remaining revision not found",
|
name: "traffic split sum < 100 error when remaining revision not found",
|
||||||
existingTraffic: append(newServiceTraffic([]servingv1.TrafficTarget{}), newTarget("rev-00003", "rev-00001", 0, false), newTarget("", "rev-00002", 0, false), newTarget("", "rev-00003", 100, true)),
|
existingTraffic: append(newServiceTraffic([]servingv1.TrafficTarget{}), newTarget("rev-00003", "rev-00001", 0, false), newTarget("", "rev-00002", 0, false), newTarget("", "rev-00003", 100, true)),
|
||||||
inputFlags: []string{"--traffic", "rev-00003=10,rev-00002=20"},
|
inputFlags: []string{"--traffic", "rev-00003=10,rev-00001=20"},
|
||||||
errMsg: errorTrafficDistribution(30, errorDistributionRevisionNotFound).Error(),
|
errMsg: errorTrafficDistribution(30, errorDistributionRevisionNotFound).Error(),
|
||||||
existingRevisions: []servingv1.Revision{{
|
existingRevisions: []servingv1.Revision{{
|
||||||
ObjectMeta: metav1.ObjectMeta{
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
|
|
@ -565,13 +566,6 @@ func TestComputeErrMsg(t *testing.T) {
|
||||||
revision.RevisionTagsAnnotation: "rev-00003",
|
revision.RevisionTagsAnnotation: "rev-00003",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}, {
|
|
||||||
ObjectMeta: metav1.ObjectMeta{
|
|
||||||
Name: "rev-00002",
|
|
||||||
Labels: map[string]string{
|
|
||||||
"serving.knative.dev/service": "serviceName",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}, {
|
}, {
|
||||||
ObjectMeta: metav1.ObjectMeta{
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
Name: "rev-00003",
|
Name: "rev-00003",
|
||||||
|
|
@ -588,7 +582,7 @@ func TestComputeErrMsg(t *testing.T) {
|
||||||
testCmd.Execute()
|
testCmd.Execute()
|
||||||
svc := getService("serviceName", testCase.latestRevision, testCase.existingTraffic)
|
svc := getService("serviceName", testCase.latestRevision, testCase.existingTraffic)
|
||||||
_, err := Compute(testCmd, svc, tFlags, testCase.existingRevisions, testCase.mutation)
|
_, err := Compute(testCmd, svc, tFlags, testCase.existingRevisions, testCase.mutation)
|
||||||
assert.Error(t, err, testCase.errMsg)
|
assert.ErrorContains(t, err, testCase.errMsg)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -138,7 +138,7 @@ func TestTrafficSplit(t *testing.T) {
|
||||||
|
|
||||||
serviceName := test.GetNextServiceName(serviceBase)
|
serviceName := test.GetNextServiceName(serviceBase)
|
||||||
test.ServiceCreate(r, serviceName)
|
test.ServiceCreate(r, serviceName)
|
||||||
test.ServiceUpdate(r, serviceName, "--env", "TARGET=v1")
|
test.ServiceUpdate(r, serviceName, "--env", "TARGET=v1", "--traffic", "80")
|
||||||
|
|
||||||
rev1 := fmt.Sprintf("%s-00001", serviceName)
|
rev1 := fmt.Sprintf("%s-00001", serviceName)
|
||||||
rev2 := fmt.Sprintf("%s-00002", serviceName)
|
rev2 := fmt.Sprintf("%s-00002", serviceName)
|
||||||
|
|
@ -191,11 +191,12 @@ func TestTrafficSplit(t *testing.T) {
|
||||||
serviceName := test.GetNextServiceName(serviceBase)
|
serviceName := test.GetNextServiceName(serviceBase)
|
||||||
|
|
||||||
rev1 := fmt.Sprintf("%s-00001", serviceName)
|
rev1 := fmt.Sprintf("%s-00001", serviceName)
|
||||||
|
rev2 := fmt.Sprintf("%s-00002", serviceName)
|
||||||
|
|
||||||
test.ServiceCreate(r, serviceName)
|
test.ServiceCreate(r, serviceName)
|
||||||
|
|
||||||
test.ServiceUpdate(r, serviceName, "--env", "TARGET=v1")
|
test.ServiceUpdate(r, serviceName, "--env", "TARGET=v1", "--traffic", "40")
|
||||||
test.ServiceUpdate(r, serviceName, "--env", "TARGET=v2")
|
test.ServiceUpdate(r, serviceName, "--env", "TARGET=v2", "--traffic", fmt.Sprintf("%s=%d,%s=%d", rev1, 10, rev2, 20))
|
||||||
test.ServiceUpdateWithError(r, serviceName, "--traffic", fmt.Sprintf("%s=%d", rev1, 50))
|
test.ServiceUpdateWithError(r, serviceName, "--traffic", fmt.Sprintf("%s=%d", rev1, 50))
|
||||||
|
|
||||||
test.ServiceDelete(r, serviceName)
|
test.ServiceDelete(r, serviceName)
|
||||||
|
|
@ -209,7 +210,7 @@ func TestTrafficSplit(t *testing.T) {
|
||||||
|
|
||||||
test.ServiceCreate(r, serviceName)
|
test.ServiceCreate(r, serviceName)
|
||||||
|
|
||||||
test.ServiceUpdate(r, serviceName, "--env", "TARGET=v1")
|
test.ServiceUpdate(r, serviceName, "--env", "TARGET=v1", "--traffic", "20")
|
||||||
test.ServiceUpdateWithError(r, serviceName, "--env", "TARGET=v2", "--traffic", "@latest=50")
|
test.ServiceUpdateWithError(r, serviceName, "--env", "TARGET=v2", "--traffic", "@latest=50")
|
||||||
|
|
||||||
test.ServiceDelete(r, serviceName)
|
test.ServiceDelete(r, serviceName)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue