Skip to content

Commit 3c2fcf6

Browse files
authored
feat: add support for regulation from features.json (#4304)
* feat: add support for regulation from features.json * feat: add regulation to features.json * chore: refactor tests to use generator mock instead of custom one * chore: refactor tests to use generator mock instead of custom one * chore: address pr comments * chore: address pr comments
1 parent 2fbf4c5 commit 3c2fcf6

File tree

9 files changed

+215
-53
lines changed

9 files changed

+215
-53
lines changed

gateway/webhook/webhook_test.go

+4-23
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import (
2323
gwtypes "github.com/rudderlabs/rudder-server/gateway/internal/types"
2424
mockWebhook "github.com/rudderlabs/rudder-server/gateway/mocks"
2525
"github.com/rudderlabs/rudder-server/gateway/response"
26+
mock_features "github.com/rudderlabs/rudder-server/mocks/services/transformer"
2627
"github.com/rudderlabs/rudder-server/services/transformer"
2728
"github.com/rudderlabs/rudder-server/utils/misc"
2829
)
@@ -73,33 +74,13 @@ func getMockSourceTransformAdapterFunc(url string) func(ctx context.Context) (so
7374
}
7475
}
7576

76-
func getMockTransformerService() transformer.FeaturesService {
77-
return &mockTransformerService{}
78-
}
79-
80-
type mockTransformerService struct{}
81-
82-
func (*mockTransformerService) SourceTransformerVersion() string {
83-
return "random-version"
84-
}
85-
86-
func (*mockTransformerService) TransformerProxyVersion() string {
87-
return "random-version"
88-
}
89-
90-
func (*mockTransformerService) Wait() chan struct{} {
91-
return make(chan struct{})
92-
}
93-
94-
func (*mockTransformerService) RouterTransform(destType string) bool {
95-
return false
96-
}
97-
9877
func TestWebhookBlockTillFeaturesAreFetched(t *testing.T) {
9978
initWebhook()
10079
ctrl := gomock.NewController(t)
10180
mockGW := mockWebhook.NewMockGateway(ctrl)
102-
webhookHandler := Setup(mockGW, getMockTransformerService(), stats.Default)
81+
mockTransformerFeaturesService := mock_features.NewMockFeaturesService(ctrl)
82+
mockTransformerFeaturesService.EXPECT().Wait().Return(make(chan struct{})).Times(1)
83+
webhookHandler := Setup(mockGW, mockTransformerFeaturesService, stats.Default)
10384

10485
mockGW.EXPECT().TrackRequestMetrics(gomock.Any()).Times(1)
10586
mockGW.EXPECT().NewSourceStat(gomock.Any(), gomock.Any()).Return(&gwStats.SourceStat{}).Times(1)

mocks/services/transformer/mock_features.go

+104
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

processor/processor_test.go

+4-24
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ import (
3333
mocksJobsDB "github.com/rudderlabs/rudder-server/mocks/jobsdb"
3434
mocksTransformer "github.com/rudderlabs/rudder-server/mocks/processor/transformer"
3535
mockDedup "github.com/rudderlabs/rudder-server/mocks/services/dedup"
36+
mock_features "github.com/rudderlabs/rudder-server/mocks/services/transformer"
3637
mockReportingTypes "github.com/rudderlabs/rudder-server/mocks/utils/types"
3738
"github.com/rudderlabs/rudder-server/processor/isolation"
3839
"github.com/rudderlabs/rudder-server/processor/transformer"
@@ -2583,7 +2584,8 @@ var _ = Describe("Processor", Ordered, func() {
25832584
Context("MainLoop Tests", func() {
25842585
It("Should not handle jobs when transformer features are not set", func() {
25852586
mockTransformer := mocksTransformer.NewMockTransformer(c.mockCtrl)
2586-
2587+
mockTransformerFeaturesService := mock_features.NewMockFeaturesService(c.mockCtrl)
2588+
mockTransformerFeaturesService.EXPECT().Wait().Return(make(chan struct{})).AnyTimes()
25872589
processor := prepareHandle(NewHandle(config.Default, mockTransformer))
25882590

25892591
// crash recover returns empty list
@@ -2601,7 +2603,7 @@ var _ = Describe("Processor", Ordered, func() {
26012603
transientsource.NewEmptyService(),
26022604
fileuploader.NewDefaultProvider(),
26032605
c.MockRsourcesService,
2604-
getMockTransformerService(),
2606+
mockTransformerFeaturesService,
26052607
destinationdebugger.NewNoOpService(),
26062608
transformationdebugger.NewNoOpService(),
26072609
[]enricher.PipelineEnricher{},
@@ -4970,25 +4972,3 @@ func TestStoreMessageMerge(t *testing.T) {
49704972
require.Len(t, merged.dedupKeys, 2, "dedup keys should have 2 elements")
49714973
require.Equal(t, merged.totalEvents, 2, "total events should be 2")
49724974
}
4973-
4974-
func getMockTransformerService() transformerFeaturesService.FeaturesService {
4975-
return &mockTransformerService{}
4976-
}
4977-
4978-
type mockTransformerService struct{}
4979-
4980-
func (*mockTransformerService) SourceTransformerVersion() string {
4981-
return "random-version"
4982-
}
4983-
4984-
func (*mockTransformerService) TransformerProxyVersion() string {
4985-
return "random-version"
4986-
}
4987-
4988-
func (*mockTransformerService) Wait() chan struct{} {
4989-
return make(chan struct{})
4990-
}
4991-
4992-
func (*mockTransformerService) RouterTransform(destType string) bool {
4993-
return false
4994-
}

regulation-worker/cmd/main.go

+6
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import (
2727
"github.com/rudderlabs/rudder-server/rruntime"
2828
"github.com/rudderlabs/rudder-server/services/diagnostics"
2929
"github.com/rudderlabs/rudder-server/services/oauth"
30+
"github.com/rudderlabs/rudder-server/services/transformer"
3031
"github.com/rudderlabs/rudder-server/utils/misc"
3132
"github.com/rudderlabs/rudder-server/utils/types/deployment"
3233
)
@@ -100,6 +101,11 @@ func Run(ctx context.Context) error {
100101
DestTransformURL: config.MustGetString("DEST_TRANSFORM_URL"),
101102
OAuth: OAuth,
102103
MaxOAuthRefreshRetryAttempts: config.GetInt("RegulationWorker.oauth.maxRefreshRetryAttempts", 1),
104+
TransformerFeaturesService: transformer.NewFeaturesService(ctx, transformer.FeaturesServiceConfig{
105+
PollInterval: config.GetDuration("Transformer.pollInterval", 1, time.Second),
106+
TransformerURL: config.GetString("DEST_TRANSFORM_URL", "http://localhost:9090"),
107+
FeaturesRetryMaxAttempts: 10,
108+
}),
103109
}),
104110
MaxFailedAttempts: config.GetInt("REGULATION_DELETION_MAX_FAILED_ATTEMPTS", 4),
105111
}

regulation-worker/internal/delete/api/api.go

+10-3
Original file line numberDiff line numberDiff line change
@@ -22,28 +22,35 @@ import (
2222
backendconfig "github.com/rudderlabs/rudder-server/backend-config"
2323
"github.com/rudderlabs/rudder-server/regulation-worker/internal/model"
2424
"github.com/rudderlabs/rudder-server/services/oauth"
25+
"github.com/rudderlabs/rudder-server/services/transformer"
2526
"github.com/rudderlabs/rudder-server/utils/httputil"
2627
)
2728

2829
var (
2930
pkgLogger = logger.NewLogger().Child("api")
30-
supportedDestinations = []string{"BRAZE", "AM", "INTERCOM", "CLEVERTAP", "AF", "MP", "GA", "ITERABLE", "ENGAGE", "CUSTIFY", "SENDGRID", "SPRIG"}
31+
SupportedDestinations = []string{"BRAZE", "AM", "INTERCOM", "CLEVERTAP", "AF", "MP", "GA", "ITERABLE", "ENGAGE", "CUSTIFY", "SENDGRID", "SPRIG"}
3132
)
3233

3334
type APIManager struct {
3435
Client *http.Client
3536
DestTransformURL string
3637
OAuth oauth.Authorizer
3738
MaxOAuthRefreshRetryAttempts int
39+
TransformerFeaturesService transformer.FeaturesService
3840
}
3941

4042
type oauthDetail struct {
4143
secretToken *oauth.AuthResponse
4244
id string
4345
}
4446

45-
func (*APIManager) GetSupportedDestinations() []string {
46-
return supportedDestinations
47+
func (m *APIManager) GetSupportedDestinations() []string {
48+
destinations := m.TransformerFeaturesService.Regulations()
49+
if len(destinations) == 0 {
50+
// Fallback to default supported destinations
51+
destinations = SupportedDestinations
52+
}
53+
return destinations
4754
}
4855

4956
func (api *APIManager) deleteWithRetry(ctx context.Context, job model.Job, destination model.Destination, currentOauthRetryAttempt int) model.JobStatus {

regulation-worker/internal/delete/api/api_test.go

+36-2
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,11 @@ import (
1616

1717
backendconfig "github.com/rudderlabs/rudder-server/backend-config"
1818
mocksBackendConfig "github.com/rudderlabs/rudder-server/mocks/backend-config"
19+
mock_features "github.com/rudderlabs/rudder-server/mocks/services/transformer"
1920
"github.com/rudderlabs/rudder-server/regulation-worker/internal/delete/api"
2021
"github.com/rudderlabs/rudder-server/regulation-worker/internal/model"
2122
"github.com/rudderlabs/rudder-server/services/oauth"
23+
"github.com/rudderlabs/rudder-server/services/transformer"
2224

2325
"github.com/stretchr/testify/require"
2426
)
@@ -136,8 +138,9 @@ func TestDelete(t *testing.T) {
136138
defer svr.Close()
137139
t.Setenv("DEST_TRANSFORM_URL", svr.URL)
138140
api := api.APIManager{
139-
Client: &http.Client{},
140-
DestTransformURL: svr.URL,
141+
Client: &http.Client{},
142+
DestTransformURL: svr.URL,
143+
TransformerFeaturesService: transformer.NewNoOpService(),
141144
}
142145
dest := model.Destination{
143146
Config: tt.destConfig,
@@ -151,6 +154,37 @@ func TestDelete(t *testing.T) {
151154
}
152155
}
153156

157+
func TestGetSupportedDestinations(t *testing.T) {
158+
tests := []struct {
159+
name string
160+
fromFeatures []string
161+
expectedDestinations []string
162+
}{
163+
{
164+
name: "test get supported destinations when there is no transformer features",
165+
expectedDestinations: api.SupportedDestinations,
166+
fromFeatures: []string{},
167+
},
168+
{
169+
name: "test get supported destinations when there is transformer features",
170+
expectedDestinations: []string{"AM", "GA4"},
171+
fromFeatures: []string{"AM", "GA4"},
172+
},
173+
}
174+
175+
for _, tt := range tests {
176+
t.Run(tt.name, func(t *testing.T) {
177+
mockTransformerFeaturesService := mock_features.NewMockFeaturesService(gomock.NewController(t))
178+
mockTransformerFeaturesService.EXPECT().Regulations().Return(tt.fromFeatures)
179+
api := api.APIManager{
180+
TransformerFeaturesService: mockTransformerFeaturesService,
181+
}
182+
destinations := api.GetSupportedDestinations()
183+
require.Equal(t, tt.expectedDestinations, destinations)
184+
})
185+
}
186+
}
187+
154188
type deleteAPI struct {
155189
payload string
156190
respStatusCode int

services/transformer/features.go

+9-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
//go:generate mockgen --build_flags=--mod=mod -destination=../../mocks/services/transformer/mock_features.go -package mock_features github.com/rudderlabs/rudder-server/services/transformer FeaturesService
2+
13
package transformer
24

35
import (
@@ -21,6 +23,7 @@ type FeaturesServiceConfig struct {
2123
}
2224

2325
type FeaturesService interface {
26+
Regulations() []string
2427
SourceTransformerVersion() string
2528
RouterTransform(destType string) bool
2629
TransformerProxyVersion() string
@@ -31,7 +34,8 @@ var defaultTransformerFeatures = `{
3134
"routerTransform": {
3235
"MARKETO": true,
3336
"HS": true
34-
}
37+
},
38+
"regulations": ["AM"],
3539
}`
3640

3741
func NewFeaturesService(ctx context.Context, config FeaturesServiceConfig) FeaturesService {
@@ -53,6 +57,10 @@ func NewNoOpService() FeaturesService {
5357

5458
type noopService struct{}
5559

60+
func (*noopService) Regulations() []string {
61+
return []string{}
62+
}
63+
5664
func (*noopService) SourceTransformerVersion() string {
5765
return V0
5866
}

services/transformer/features_impl.go

+11
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"net/http"
99
"time"
1010

11+
"github.com/samber/lo"
1112
"github.com/tidwall/gjson"
1213

1314
"github.com/rudderlabs/rudder-go-kit/config"
@@ -42,6 +43,16 @@ func (t *featuresService) RouterTransform(destType string) bool {
4243
return gjson.GetBytes(t.features, "routerTransform."+destType).Bool()
4344
}
4445

46+
func (t *featuresService) Regulations() []string {
47+
regulationFeatures := gjson.GetBytes(t.features, "regulations")
48+
if regulationFeatures.Exists() && regulationFeatures.IsArray() {
49+
return lo.Map(regulationFeatures.Array(), func(f gjson.Result, _ int) string {
50+
return f.String()
51+
})
52+
}
53+
return []string{}
54+
}
55+
4556
func (t *featuresService) Wait() chan struct{} {
4657
return t.waitChan
4758
}

0 commit comments

Comments
 (0)