Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(rollouts): add order rollouts and validate requests #1850

Merged
merged 7 commits into from
Jul 10, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 30 additions & 0 deletions build/testing/integration/api/api.go
Original file line number Diff line number Diff line change
Expand Up @@ -535,6 +535,22 @@ func API(t *testing.T, ctx context.Context, client sdk.SDK, namespace string, au
})

t.Run("Boolean Rollouts", func(t *testing.T) {
t.Run("Invalid", func(t *testing.T) {
_, err := client.Flipt().CreateRollout(ctx, &flipt.CreateRolloutRequest{
NamespaceKey: namespace,
FlagKey: "boolean_disabled",
Description: "has an invalid percentage",
Rank: 1,
Rule: &flipt.CreateRolloutRequest_Threshold{
Threshold: &flipt.RolloutThreshold{
Percentage: 101.00,
Value: true,
},
},
})
require.EqualError(t, err, "rpc error: code = InvalidArgument desc = invalid field threshold.percentage: must be within range [0, 100]")
})

rolloutSegment, err := client.Flipt().CreateRollout(ctx, &flipt.CreateRolloutRequest{
NamespaceKey: namespace,
FlagKey: "boolean_disabled",
Expand Down Expand Up @@ -587,6 +603,20 @@ func API(t *testing.T, ctx context.Context, client sdk.SDK, namespace string, au
rolloutThreshold,
}, rollouts.Rules, protocmp.Transform()))

_, err = client.Flipt().UpdateRollout(ctx, &flipt.UpdateRolloutRequest{
NamespaceKey: namespace,
FlagKey: "boolean_disabled",
Id: rolloutThreshold.Id,
Description: "50% enabled",
Rule: &flipt.UpdateRolloutRequest_Threshold{
Threshold: &flipt.RolloutThreshold{
Percentage: 200.0,
Value: false,
},
},
})
require.EqualError(t, err, "rpc error: code = InvalidArgument desc = invalid field threshold.percentage: must be within range [0, 100]")

updatedRollout, err := client.Flipt().UpdateRollout(ctx, &flipt.UpdateRolloutRequest{
NamespaceKey: namespace,
FlagKey: "boolean_disabled",
Expand Down
57 changes: 57 additions & 0 deletions build/testing/integration/readonly/readonly_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -316,6 +316,63 @@ func TestReadOnly(t *testing.T) {
})
})

t.Run("ListRollouts", func(t *testing.T) {
_, err := sdk.Flipt().ListRollouts(ctx, &flipt.ListRolloutRequest{
NamespaceKey: namespace,
FlagKey: "flag_boolean",
PageToken: "Hello World",
})
require.EqualError(t, err, "rpc error: code = InvalidArgument desc = pageToken is not valid: \"Hello World\"")

rules, err := sdk.Flipt().ListRollouts(ctx, &flipt.ListRolloutRequest{
NamespaceKey: namespace,
FlagKey: "flag_boolean",
})
require.NoError(t, err)
require.Len(t, rules.Rules, 5, "unexpected number of rules returned")

rule := rules.Rules[0]
assert.Equal(t, namespace, rule.NamespaceKey)
assert.Equal(t, "flag_boolean", rule.FlagKey)
assert.Equal(t, "segment_001", rule.GetSegment().SegmentKey)
assert.True(t, rule.GetSegment().Value)
assert.NotEmpty(t, rule.Id)
assert.Equal(t, int32(1), rule.Rank)

t.Run("Paginated (page size 2)", func(t *testing.T) {
var (
found []*flipt.Rollout
nextPage string
)
for {
rules, err := sdk.Flipt().ListRollouts(ctx, &flipt.ListRolloutRequest{
NamespaceKey: namespace,
FlagKey: "flag_boolean",
Limit: 2,
PageToken: nextPage,
})
require.NoError(t, err)

if rules.NextPageToken == "" {
// ensure each page is of length 1
assert.Len(t, rules.Rules, 1)
found = append(found, rules.Rules...)
break
}

// ensure each page is of length 2
assert.Len(t, rules.Rules, 2)

found = append(found, rules.Rules...)

nextPage = rules.NextPageToken
}

require.Len(t, found, 5)
assert.Equal(t, rules.Rules, found)
})
})

t.Run("Legacy", func(t *testing.T) {
t.Run("Evaluate", func(t *testing.T) {
response, err := sdk.Flipt().Evaluate(ctx, &flipt.EvaluationRequest{
Expand Down
10 changes: 10 additions & 0 deletions build/testing/integration/readonly/testdata/default.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -15560,6 +15560,16 @@ flags:
segment:
key: segment_001
value: true
- description: disabled for segment_002
segment:
key: segment_002
- description: enabled for segment_003
segment:
key: segment_003
value: true
- description: disabled for segment_004
segment:
key: segment_004
- description: enabled for 50%
threshold:
percentage: 50
Expand Down
10 changes: 10 additions & 0 deletions build/testing/integration/readonly/testdata/production.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -15561,6 +15561,16 @@ flags:
segment:
key: segment_001
value: true
- description: disabled for segment_002
segment:
key: segment_002
- description: enabled for segment_003
segment:
key: segment_003
value: true
- description: disabled for segment_004
segment:
key: segment_004
- description: enabled for 50%
threshold:
percentage: 50
Expand Down
1 change: 1 addition & 0 deletions internal/ext/testdata/import_implicit_rule_rank.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ flags:
variants:
- key: variant1
name: variant1
description: "variant description"
attachment:
pi: 3.141
happy: true
Expand Down
14 changes: 11 additions & 3 deletions internal/server/rollout.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,10 @@ func (s *Server) GetRollout(ctx context.Context, r *flipt.GetRolloutRequest) (*f
func (s *Server) ListRollouts(ctx context.Context, r *flipt.ListRolloutRequest) (*flipt.RolloutList, error) {
s.logger.Debug("list rollout rules", zap.Stringer("request", r))

opts := []storage.QueryOption{storage.WithLimit(uint64(r.GetLimit()))}

results, err := s.store.ListRollouts(ctx, r.NamespaceKey, r.FlagKey, opts...)
results, err := s.store.ListRollouts(ctx, r.NamespaceKey, r.FlagKey,
storage.WithPageToken(r.GetPageToken()),
storage.WithLimit(uint64(r.GetLimit())),
)
if err != nil {
return nil, err
}
Expand Down Expand Up @@ -62,3 +63,10 @@ func (s *Server) DeleteRollout(ctx context.Context, r *flipt.DeleteRolloutReques
s.logger.Debug("delete rollout rule", zap.Error(err))
return &empty.Empty{}, err
}

func (s *Server) OrderRollouts(ctx context.Context, r *flipt.OrderRolloutsRequest) (*empty.Empty, error) {
s.logger.Debug("order rollout rules", zap.Stringer("request", r))
err := s.store.OrderRollouts(ctx, r)
s.logger.Debug("order rollout rules", zap.Error(err))
return &empty.Empty{}, err
}
Loading
Loading