diff --git a/internal/worker_versioning_rules.go b/internal/worker_versioning_rules.go index 80a2b11cb..d6e5da12b 100644 --- a/internal/worker_versioning_rules.go +++ b/internal/worker_versioning_rules.go @@ -308,10 +308,13 @@ func versioningAssignmentRuleToProto(rule *VersioningAssignmentRule) *taskqueuep switch r := rule.Ramp.(type) { case *VersioningRampByPercentage: - result.Ramp = &taskqueuepb.BuildIdAssignmentRule_PercentageRamp{ - PercentageRamp: &taskqueuepb.RampByPercentage{ - RampPercentage: r.Percentage, - }, + // Ramp is optional, checking for typed `nil` + if r != nil { + result.Ramp = &taskqueuepb.BuildIdAssignmentRule_PercentageRamp{ + PercentageRamp: &taskqueuepb.RampByPercentage{ + RampPercentage: r.Percentage, + }, + } } } @@ -419,8 +422,10 @@ func (r *VersioningAssignmentRule) validateRule() error { } switch ramp := r.Ramp.(type) { case *VersioningRampByPercentage: - if err := ramp.validateRamp(); err != nil { - return err + if ramp != nil { + if err := ramp.validateRamp(); err != nil { + return err + } } // Ramp is optional, defaults to "nothing to validate" } diff --git a/internal/worker_versioning_rules_test.go b/internal/worker_versioning_rules_test.go index 141b624f2..be0ff903a 100644 --- a/internal/worker_versioning_rules_test.go +++ b/internal/worker_versioning_rules_test.go @@ -139,3 +139,20 @@ func Test_VersioningIntent(t *testing.T) { }) } } + +func Test_WorkerVersioningRules_typed_nil(t *testing.T) { + var ramp *VersioningRampByPercentage + + u := UpdateWorkerVersioningRulesOptions{ + TaskQueue: "myQueue", + Operation: &VersioningOperationInsertAssignmentRule{ + RuleIndex: 0, + Rule: VersioningAssignmentRule{ + TargetBuildID: "2.0", + Ramp: ramp, + }, + }, + } + _, err := u.validateAndConvertToProto("my_namespace") + assert.NoError(t, err) +}