From f832899fabeee23f055620213217c836f256878d Mon Sep 17 00:00:00 2001 From: Muhammad Abduh Date: Fri, 9 Sep 2022 15:50:24 +0700 Subject: [PATCH] feat: use salt mux for server and update logging to support gcp --- cli/migrate.go | 2 +- cli/root.go | 2 + cli/serve.go | 50 +++++++++--- config/config.go | 7 +- internal/api/api.go | 81 +++++++++++++++++++ .../api/v1beta1/{grpc_alert.go => alert.go} | 7 -- .../{grpc_alert_test.go => alert_test.go} | 13 +-- .../{grpc_namespace.go => namespace.go} | 9 --- ...pc_namespace_test.go => namespace_test.go} | 35 ++++---- .../v1beta1/{grpc_provider.go => provider.go} | 9 --- ...grpc_provider_test.go => provider_test.go} | 35 ++++---- .../v1beta1/{grpc_receiver.go => receiver.go} | 11 --- ...grpc_receiver_test.go => receiver_test.go} | 39 ++++----- .../api/v1beta1/{grpc_rule.go => rule.go} | 6 -- .../{grpc_rule_test.go => rule_test.go} | 11 +-- .../{grpc_subscription.go => subscription.go} | 9 --- ...scription_test.go => subscription_test.go} | 33 ++++---- .../v1beta1/{grpc_template.go => template.go} | 9 --- ...grpc_template_test.go => template_test.go} | 27 ++++--- internal/api/v1beta1/{grpc.go => v1beta1.go} | 40 +++++---- internal/server/server.go | 20 +---- pkg/zapgcp/encoder.go | 61 ++++++++++++++ pkg/zapgcp/service.go | 36 +++++++++ 23 files changed, 346 insertions(+), 206 deletions(-) rename internal/api/v1beta1/{grpc_alert.go => alert.go} (90%) rename internal/api/v1beta1/{grpc_alert_test.go => alert_test.go} (92%) rename internal/api/v1beta1/{grpc_namespace.go => namespace.go} (88%) rename internal/api/v1beta1/{grpc_namespace_test.go => namespace_test.go} (85%) rename internal/api/v1beta1/{grpc_provider.go => provider.go} (88%) rename internal/api/v1beta1/{grpc_provider_test.go => provider_test.go} (85%) rename internal/api/v1beta1/{grpc_receiver.go => receiver.go} (84%) rename internal/api/v1beta1/{grpc_receiver_test.go => receiver_test.go} (87%) rename internal/api/v1beta1/{grpc_rule.go => rule.go} (89%) rename internal/api/v1beta1/{grpc_rule_test.go => rule_test.go} (89%) rename internal/api/v1beta1/{grpc_subscription.go => subscription.go} (89%) rename internal/api/v1beta1/{grpc_subscription_test.go => subscription_test.go} (85%) rename internal/api/v1beta1/{grpc_template.go => template.go} (88%) rename internal/api/v1beta1/{grpc_template_test.go => template_test.go} (86%) rename internal/api/v1beta1/{grpc.go => v1beta1.go} (53%) create mode 100644 pkg/zapgcp/encoder.go create mode 100644 pkg/zapgcp/service.go diff --git a/cli/migrate.go b/cli/migrate.go index df14124f..859815fc 100644 --- a/cli/migrate.go +++ b/cli/migrate.go @@ -22,7 +22,7 @@ func migrateCmd() *cobra.Command { return err } - logger := initLogger(cfg.Log.Level) + logger := initLogger(cfg.Log) if err := runPostgresMigrations(logger, cfg); err != nil { return err } diff --git a/cli/root.go b/cli/root.go index 025ab5ab..136d25c4 100644 --- a/cli/root.go +++ b/cli/root.go @@ -10,6 +10,8 @@ import ( "github.com/spf13/cobra" ) +const serviceName = "siren" + // Execute runs the command line interface func Execute() { rootCmd := &cobra.Command{ diff --git a/cli/serve.go b/cli/serve.go index 34b2c0ff..cdd6b5e9 100644 --- a/cli/serve.go +++ b/cli/serve.go @@ -13,6 +13,7 @@ import ( "github.com/odpf/siren/core/rule" "github.com/odpf/siren/core/subscription" "github.com/odpf/siren/core/template" + "github.com/odpf/siren/internal/api" "github.com/odpf/siren/internal/server" "github.com/odpf/siren/internal/store/postgres" "github.com/odpf/siren/pkg/cortex" @@ -20,6 +21,7 @@ import ( "github.com/odpf/siren/pkg/secret" "github.com/odpf/siren/pkg/slack" "github.com/odpf/siren/pkg/telemetry" + "github.com/odpf/siren/pkg/zapgcp" "github.com/spf13/cobra" "go.uber.org/zap" "go.uber.org/zap/zapcore" @@ -54,7 +56,7 @@ func runServer(cfg config.Config) error { return err } - logger := initLogger(cfg.Log.Level) + logger := initLogger(cfg.Log) pgClient, err := postgres.NewClient(logger, cfg.DB) if err != nil { @@ -116,23 +118,49 @@ func runServer(cfg config.Config) error { subscriptionRepository := postgres.NewSubscriptionRepository(pgClient) subscriptionService := subscription.NewService(subscriptionRepository, providerService, namespaceService, receiverService, cortexClient) + apiDeps := &api.Deps{ + TemplateService: templateService, + RuleService: ruleService, + AlertService: alertHistoryService, + ProviderService: providerService, + NamespaceService: namespaceService, + ReceiverService: receiverService, + SubscriptionService: subscriptionService, + } return server.RunServer( cfg.SirenService, logger, nr, - templateService, - ruleService, - alertHistoryService, - providerService, - namespaceService, - receiverService, - subscriptionService) + apiDeps, + ) } -func initLogger(logLevel string) log.Logger { +func initLogger(cfg config.Log) log.Logger { defaultConfig := zap.NewProductionConfig() - defaultConfig.Level = zap.NewAtomicLevelAt(getZapLogLevelFromString(logLevel)) - return log.NewZap(log.ZapWithConfig(defaultConfig, zap.AddCaller(), zap.AddStacktrace(zap.DPanicLevel))) + defaultConfig.Level = zap.NewAtomicLevelAt(getZapLogLevelFromString(cfg.Level)) + + if cfg.GCPCompatible { + defaultConfig = zap.Config{ + Level: zap.NewAtomicLevelAt(getZapLogLevelFromString(cfg.Level)), + Encoding: "json", + Development: false, + Sampling: &zap.SamplingConfig{ + Initial: 100, + Thereafter: 100, + }, + EncoderConfig: zapgcp.EncoderConfig, + OutputPaths: []string{"stdout"}, + ErrorOutputPaths: []string{"stderr"}, + } + } + + return log.NewZap(log.ZapWithConfig( + defaultConfig, + zap.Fields(zapgcp.ServiceContext(serviceName)), + zap.AddCaller(), + zap.AddStacktrace(zap.DPanicLevel), + )) + } // getZapLogLevelFromString helps to set logLevel from string diff --git a/config/config.go b/config/config.go index 61e03ba7..d4f2ed5e 100644 --- a/config/config.go +++ b/config/config.go @@ -36,8 +36,9 @@ func LoadConfig(configFile string) (Config, error) { return cfg, nil } -type LogConfig struct { - Level string `mapstructure:"level" default:"info"` +type Log struct { + Level string `mapstructure:"level" default:"info"` + GCPCompatible bool `mapstructure:"gcp_compatible" default:"true"` } type SlackApp struct { @@ -51,7 +52,7 @@ type Config struct { Cortex cortex.Config `mapstructure:"cortex"` NewRelic telemetry.NewRelicConfig `mapstructure:"newrelic"` SirenService server.Config `mapstructure:"siren_service"` - Log LogConfig `mapstructure:"log"` + Log Log `mapstructure:"log"` SlackApp SlackApp `mapstructure:"slack_app"` EncryptionKey string `mapstructure:"encryption_key"` } diff --git a/internal/api/api.go b/internal/api/api.go index 778f64ec..26b84561 100644 --- a/internal/api/api.go +++ b/internal/api/api.go @@ -1 +1,82 @@ package api + +import ( + "context" + + "github.com/odpf/siren/core/alert" + "github.com/odpf/siren/core/namespace" + "github.com/odpf/siren/core/provider" + "github.com/odpf/siren/core/receiver" + "github.com/odpf/siren/core/rule" + "github.com/odpf/siren/core/subscription" + "github.com/odpf/siren/core/template" +) + +//go:generate mockery --name=AlertService -r --case underscore --with-expecter --structname AlertService --filename alert_service.go --output=./mocks +type AlertService interface { + Create(context.Context, []*alert.Alert) ([]alert.Alert, error) + List(context.Context, alert.Filter) ([]alert.Alert, error) +} + +//go:generate mockery --name=NamespaceService -r --case underscore --with-expecter --structname NamespaceService --filename namespace_service.go --output=./mocks +type NamespaceService interface { + List(context.Context) ([]namespace.Namespace, error) + Create(context.Context, *namespace.Namespace) error + Get(context.Context, uint64) (*namespace.Namespace, error) + Update(context.Context, *namespace.Namespace) error + Delete(context.Context, uint64) error +} + +//go:generate mockery --name=ProviderService -r --case underscore --with-expecter --structname ProviderService --filename provider_service.go --output=./mocks +type ProviderService interface { + List(context.Context, provider.Filter) ([]provider.Provider, error) + Create(context.Context, *provider.Provider) error + Get(context.Context, uint64) (*provider.Provider, error) + Update(context.Context, *provider.Provider) error + Delete(context.Context, uint64) error +} + +//go:generate mockery --name=ReceiverService -r --case underscore --with-expecter --structname ReceiverService --filename receiver_service.go --output=./mocks +type ReceiverService interface { + List(ctx context.Context, flt receiver.Filter) ([]receiver.Receiver, error) + Create(ctx context.Context, rcv *receiver.Receiver) error + Get(ctx context.Context, id uint64) (*receiver.Receiver, error) + Update(ctx context.Context, rcv *receiver.Receiver) error + Delete(ctx context.Context, id uint64) error + Notify(ctx context.Context, id uint64, payloadMessage receiver.NotificationMessage) error + GetSubscriptionConfig(subsConfs map[string]string, rcv *receiver.Receiver) (map[string]string, error) +} + +//go:generate mockery --name=RuleService -r --case underscore --with-expecter --structname RuleService --filename rule_service.go --output=./mocks +type RuleService interface { + Upsert(context.Context, *rule.Rule) error + List(context.Context, rule.Filter) ([]rule.Rule, error) +} + +//go:generate mockery --name=SubscriptionService -r --case underscore --with-expecter --structname SubscriptionService --filename subscription_service.go --output=./mocks +type SubscriptionService interface { + List(context.Context, subscription.Filter) ([]subscription.Subscription, error) + Create(context.Context, *subscription.Subscription) error + Get(context.Context, uint64) (*subscription.Subscription, error) + Update(context.Context, *subscription.Subscription) error + Delete(context.Context, uint64) error +} + +//go:generate mockery --name=TemplateService -r --case underscore --with-expecter --structname TemplateService --filename template_service.go --output=./mocks +type TemplateService interface { + Upsert(context.Context, *template.Template) error + List(context.Context, template.Filter) ([]template.Template, error) + GetByName(context.Context, string) (*template.Template, error) + Delete(context.Context, string) error + Render(context.Context, string, map[string]string) (string, error) +} + +type Deps struct { + TemplateService TemplateService + RuleService RuleService + AlertService AlertService + ProviderService ProviderService + NamespaceService NamespaceService + ReceiverService ReceiverService + SubscriptionService SubscriptionService +} diff --git a/internal/api/v1beta1/grpc_alert.go b/internal/api/v1beta1/alert.go similarity index 90% rename from internal/api/v1beta1/grpc_alert.go rename to internal/api/v1beta1/alert.go index b0792ba7..c7a14805 100644 --- a/internal/api/v1beta1/grpc_alert.go +++ b/internal/api/v1beta1/alert.go @@ -8,14 +8,7 @@ import ( "google.golang.org/protobuf/types/known/timestamppb" ) -//go:generate mockery --name=AlertService -r --case underscore --with-expecter --structname AlertService --filename alert_service.go --output=./mocks -type AlertService interface { - Create(context.Context, []*alert.Alert) ([]alert.Alert, error) - List(context.Context, alert.Filter) ([]alert.Alert, error) -} - func (s *GRPCServer) ListAlerts(ctx context.Context, req *sirenv1beta1.ListAlertsRequest) (*sirenv1beta1.ListAlertsResponse, error) { - alerts, err := s.alertService.List(ctx, alert.Filter{ ResourceName: req.GetResourceName(), ProviderID: req.GetProviderId(), diff --git a/internal/api/v1beta1/grpc_alert_test.go b/internal/api/v1beta1/alert_test.go similarity index 92% rename from internal/api/v1beta1/grpc_alert_test.go rename to internal/api/v1beta1/alert_test.go index 9c846a6a..0d6a50b7 100644 --- a/internal/api/v1beta1/grpc_alert_test.go +++ b/internal/api/v1beta1/alert_test.go @@ -7,6 +7,7 @@ import ( "github.com/odpf/salt/log" "github.com/odpf/siren/core/alert" + "github.com/odpf/siren/internal/api" "github.com/odpf/siren/internal/api/v1beta1" "github.com/odpf/siren/internal/api/v1beta1/mocks" "github.com/odpf/siren/pkg/errors" @@ -30,7 +31,7 @@ func TestGRPCServer_ListAlerts(t *testing.T) { StartTime: 100, EndTime: 200, }).Return(dummyAlerts, nil).Once() - dummyGRPCServer := v1beta1.NewGRPCServer(nil, nil, nil, nil, mockedAlertService, nil, nil, nil, nil) + dummyGRPCServer := v1beta1.NewGRPCServer(nil, nil, &api.Deps{AlertService: mockedAlertService}) dummyReq := &sirenv1beta1.ListAlertsRequest{ ResourceName: "foo", @@ -52,7 +53,7 @@ func TestGRPCServer_ListAlerts(t *testing.T) { t.Run("should return error Internal if getting alert history failed", func(t *testing.T) { mockedAlertService := &mocks.AlertService{} - dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), nil, nil, mockedAlertService, nil, nil, nil, nil) + dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), &api.Deps{AlertService: mockedAlertService}) mockedAlertService.EXPECT().List(mock.AnythingOfType("*context.emptyCtx"), alert.Filter{ ProviderID: 1, @@ -120,7 +121,7 @@ func TestGRPCServer_CreateAlertHistory(t *testing.T) { }} mockedAlertService.EXPECT().Create(mock.AnythingOfType("*context.emptyCtx"), payload). Return(dummyAlerts, nil).Once() - dummyGRPCServer := v1beta1.NewGRPCServer(nil, nil, nil, nil, mockedAlertService, nil, nil, nil, nil) + dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), &api.Deps{AlertService: mockedAlertService}) res, err := dummyGRPCServer.CreateCortexAlerts(context.Background(), dummyReq) assert.Equal(t, 1, len(res.GetAlerts())) @@ -177,7 +178,7 @@ func TestGRPCServer_CreateAlertHistory(t *testing.T) { }} mockedAlertService.EXPECT().Create(mock.AnythingOfType("*context.emptyCtx"), payload). Return(dummyAlerts, nil).Once() - dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), nil, nil, mockedAlertService, nil, nil, nil, nil) + dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), &api.Deps{AlertService: mockedAlertService}) res, err := dummyGRPCServer.CreateCortexAlerts(context.Background(), dummyReq) assert.Equal(t, 1, len(res.GetAlerts())) @@ -193,7 +194,7 @@ func TestGRPCServer_CreateAlertHistory(t *testing.T) { t.Run("should return error Internal if getting alert history failed", func(t *testing.T) { mockedAlertService := &mocks.AlertService{} - dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), nil, nil, mockedAlertService, nil, nil, nil, nil) + dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), &api.Deps{AlertService: mockedAlertService}) mockedAlertService.EXPECT().Create(mock.AnythingOfType("*context.emptyCtx"), payload). Return(nil, errors.New("random error")).Once() @@ -245,7 +246,7 @@ func TestGRPCServer_CreateAlertHistory(t *testing.T) { Severity: "CRITICAL", TriggeredAt: time.Now(), }} - dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), nil, nil, mockedAlertService, nil, nil, nil, nil) + dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), &api.Deps{AlertService: mockedAlertService}) mockedAlertService.EXPECT().Create(mock.AnythingOfType("*context.emptyCtx"), payload). Return(dummyAlerts, nil).Once() diff --git a/internal/api/v1beta1/grpc_namespace.go b/internal/api/v1beta1/namespace.go similarity index 88% rename from internal/api/v1beta1/grpc_namespace.go rename to internal/api/v1beta1/namespace.go index fb22769c..ab856d20 100644 --- a/internal/api/v1beta1/grpc_namespace.go +++ b/internal/api/v1beta1/namespace.go @@ -10,15 +10,6 @@ import ( "google.golang.org/protobuf/types/known/timestamppb" ) -//go:generate mockery --name=NamespaceService -r --case underscore --with-expecter --structname NamespaceService --filename namespace_service.go --output=./mocks -type NamespaceService interface { - List(context.Context) ([]namespace.Namespace, error) - Create(context.Context, *namespace.Namespace) error - Get(context.Context, uint64) (*namespace.Namespace, error) - Update(context.Context, *namespace.Namespace) error - Delete(context.Context, uint64) error -} - func (s *GRPCServer) ListNamespaces(ctx context.Context, _ *sirenv1beta1.ListNamespacesRequest) (*sirenv1beta1.ListNamespacesResponse, error) { namespaces, err := s.namespaceService.List(ctx) if err != nil { diff --git a/internal/api/v1beta1/grpc_namespace_test.go b/internal/api/v1beta1/namespace_test.go similarity index 85% rename from internal/api/v1beta1/grpc_namespace_test.go rename to internal/api/v1beta1/namespace_test.go index 0e7d9001..361b0743 100644 --- a/internal/api/v1beta1/grpc_namespace_test.go +++ b/internal/api/v1beta1/namespace_test.go @@ -7,6 +7,7 @@ import ( "github.com/odpf/salt/log" "github.com/odpf/siren/core/namespace" + "github.com/odpf/siren/internal/api" "github.com/odpf/siren/internal/api/v1beta1" "github.com/odpf/siren/internal/api/v1beta1/mocks" "github.com/odpf/siren/pkg/errors" @@ -24,7 +25,7 @@ func TestGRPCServer_ListNamespaces(t *testing.T) { t.Run("should return list of all namespaces", func(t *testing.T) { mockedNamespaceService := &mocks.NamespaceService{} - dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), nil, nil, nil, nil, mockedNamespaceService, nil, nil) + dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), &api.Deps{NamespaceService: mockedNamespaceService}) dummyResult := []namespace.Namespace{ { ID: 1, @@ -49,7 +50,7 @@ func TestGRPCServer_ListNamespaces(t *testing.T) { t.Run("should return Internal if getting namespaces failed", func(t *testing.T) { mockedNamespaceService := &mocks.NamespaceService{} - dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), nil, nil, nil, nil, mockedNamespaceService, nil, nil) + dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), &api.Deps{NamespaceService: mockedNamespaceService}) mockedNamespaceService.EXPECT().List(mock.AnythingOfType("*context.emptyCtx")). Return(nil, errors.New("random error")).Once() res, err := dummyGRPCServer.ListNamespaces(context.Background(), &sirenv1beta1.ListNamespacesRequest{}) @@ -59,7 +60,7 @@ func TestGRPCServer_ListNamespaces(t *testing.T) { t.Run("should return Internal if NewStruct conversion failed", func(t *testing.T) { mockedNamespaceService := &mocks.NamespaceService{} - dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), nil, nil, nil, nil, mockedNamespaceService, nil, nil) + dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), &api.Deps{NamespaceService: mockedNamespaceService}) credentials["bar"] = string([]byte{0xff}) dummyResult := []namespace.Namespace{ { @@ -102,7 +103,7 @@ func TestGRPCServer_CreateNamespaces(t *testing.T) { t.Run("should create a namespace", func(t *testing.T) { mockedNamespaceService := &mocks.NamespaceService{} - dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), nil, nil, nil, nil, mockedNamespaceService, nil, nil) + dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), &api.Deps{NamespaceService: mockedNamespaceService}) mockedNamespaceService.EXPECT().Create(mock.AnythingOfType("*context.emptyCtx"), payload).Run(func(_a0 context.Context, _a1 *namespace.Namespace) { _a1.ID = generatedID }).Return(nil).Once() @@ -113,7 +114,7 @@ func TestGRPCServer_CreateNamespaces(t *testing.T) { t.Run("should return error Internal if creating namespaces failed", func(t *testing.T) { mockedNamespaceService := &mocks.NamespaceService{} - dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), nil, nil, nil, nil, mockedNamespaceService, nil, nil) + dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), &api.Deps{NamespaceService: mockedNamespaceService}) mockedNamespaceService.EXPECT().Create(mock.AnythingOfType("*context.emptyCtx"), payload).Return(errors.New("random error")).Once() res, err := dummyGRPCServer.CreateNamespace(context.Background(), request) assert.Nil(t, res) @@ -122,7 +123,7 @@ func TestGRPCServer_CreateNamespaces(t *testing.T) { t.Run("should return error Invalid Argument if create service return err invalid", func(t *testing.T) { mockedNamespaceService := &mocks.NamespaceService{} - dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), nil, nil, nil, nil, mockedNamespaceService, nil, nil) + dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), &api.Deps{NamespaceService: mockedNamespaceService}) mockedNamespaceService.EXPECT().Create(mock.AnythingOfType("*context.emptyCtx"), payload).Return(errors.ErrInvalid).Once() res, err := dummyGRPCServer.CreateNamespace(context.Background(), request) @@ -133,7 +134,7 @@ func TestGRPCServer_CreateNamespaces(t *testing.T) { t.Run("should return error AlreadyExists if create service return err conflict", func(t *testing.T) { mockedNamespaceService := &mocks.NamespaceService{} - dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), nil, nil, nil, nil, mockedNamespaceService, nil, nil) + dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), &api.Deps{NamespaceService: mockedNamespaceService}) mockedNamespaceService.EXPECT().Create(mock.AnythingOfType("*context.emptyCtx"), payload).Return(errors.ErrConflict).Once() res, err := dummyGRPCServer.CreateNamespace(context.Background(), request) @@ -151,7 +152,7 @@ func TestGRPCServer_GetNamespace(t *testing.T) { t.Run("should get the namespace", func(t *testing.T) { mockedNamespaceService := &mocks.NamespaceService{} - dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), nil, nil, nil, nil, mockedNamespaceService, nil, nil) + dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), &api.Deps{NamespaceService: mockedNamespaceService}) dummyResult := &namespace.Namespace{ ID: 1, Provider: 2, @@ -174,7 +175,7 @@ func TestGRPCServer_GetNamespace(t *testing.T) { t.Run("should return error Invalid Argument if no namespace found", func(t *testing.T) { mockedNamespaceService := &mocks.NamespaceService{} - dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), nil, nil, nil, nil, mockedNamespaceService, nil, nil) + dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), &api.Deps{NamespaceService: mockedNamespaceService}) mockedNamespaceService.EXPECT().Get(mock.AnythingOfType("*context.emptyCtx"), uint64(1)).Return(nil, errors.ErrNotFound.WithCausef("some error")).Once() res, err := dummyGRPCServer.GetNamespace(context.Background(), &sirenv1beta1.GetNamespaceRequest{Id: uint64(1)}) @@ -184,7 +185,7 @@ func TestGRPCServer_GetNamespace(t *testing.T) { t.Run("should return error Internal if getting namespace fails", func(t *testing.T) { mockedNamespaceService := &mocks.NamespaceService{} - dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), nil, nil, nil, nil, mockedNamespaceService, nil, nil) + dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), &api.Deps{NamespaceService: mockedNamespaceService}) mockedNamespaceService.EXPECT().Get(mock.AnythingOfType("*context.emptyCtx"), uint64(1)). Return(nil, errors.New("random error")).Once() res, err := dummyGRPCServer.GetNamespace(context.Background(), @@ -195,7 +196,7 @@ func TestGRPCServer_GetNamespace(t *testing.T) { t.Run("should return error Internal if NewStruct conversion failed", func(t *testing.T) { mockedNamespaceService := &mocks.NamespaceService{} - dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), nil, nil, nil, nil, mockedNamespaceService, nil, nil) + dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), &api.Deps{NamespaceService: mockedNamespaceService}) credentials["bar"] = string([]byte{0xff}) dummyResult := &namespace.Namespace{ ID: 1, @@ -238,7 +239,7 @@ func TestGRPCServer_UpdateNamespace(t *testing.T) { t.Run("should update a namespace", func(t *testing.T) { mockedNamespaceService := &mocks.NamespaceService{} - dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), nil, nil, nil, nil, mockedNamespaceService, nil, nil) + dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), &api.Deps{NamespaceService: mockedNamespaceService}) mockedNamespaceService.EXPECT().Update(mock.AnythingOfType("*context.emptyCtx"), payload).Run(func(_a0 context.Context, _a1 *namespace.Namespace) { _a1.ID = payload.ID }).Return(nil).Once() @@ -250,7 +251,7 @@ func TestGRPCServer_UpdateNamespace(t *testing.T) { t.Run("should return error Invalid Argument if namespace service return err invalid", func(t *testing.T) { mockedNamespaceService := &mocks.NamespaceService{} - dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), nil, nil, nil, nil, mockedNamespaceService, nil, nil) + dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), &api.Deps{NamespaceService: mockedNamespaceService}) mockedNamespaceService.EXPECT().Update(mock.AnythingOfType("*context.emptyCtx"), payload).Return(errors.ErrInvalid).Once() res, err := dummyGRPCServer.UpdateNamespace(context.Background(), request) @@ -260,7 +261,7 @@ func TestGRPCServer_UpdateNamespace(t *testing.T) { t.Run("should return error AlreadyExists if namespace service return err conflict", func(t *testing.T) { mockedNamespaceService := &mocks.NamespaceService{} - dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), nil, nil, nil, nil, mockedNamespaceService, nil, nil) + dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), &api.Deps{NamespaceService: mockedNamespaceService}) mockedNamespaceService.EXPECT().Update(mock.AnythingOfType("*context.emptyCtx"), payload).Return(errors.ErrConflict).Once() res, err := dummyGRPCServer.UpdateNamespace(context.Background(), request) @@ -271,7 +272,7 @@ func TestGRPCServer_UpdateNamespace(t *testing.T) { t.Run("should return error Internal if updating namespaces failed", func(t *testing.T) { mockedNamespaceService := &mocks.NamespaceService{} - dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), nil, nil, nil, nil, mockedNamespaceService, nil, nil) + dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), &api.Deps{NamespaceService: mockedNamespaceService}) mockedNamespaceService.EXPECT().Update(mock.AnythingOfType("*context.emptyCtx"), payload).Return(errors.New("random error")).Once() res, err := dummyGRPCServer.UpdateNamespace(context.Background(), request) @@ -289,7 +290,7 @@ func TestGRPCServer_DeleteNamespace(t *testing.T) { t.Run("should delete namespace object", func(t *testing.T) { mockedNamespaceService := &mocks.NamespaceService{} - dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), nil, nil, nil, nil, mockedNamespaceService, nil, nil) + dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), &api.Deps{NamespaceService: mockedNamespaceService}) mockedNamespaceService.EXPECT().Delete(mock.AnythingOfType("*context.emptyCtx"), namespaceId).Return(nil).Once() res, err := dummyGRPCServer.DeleteNamespace(context.Background(), dummyReq) assert.Nil(t, err) @@ -299,7 +300,7 @@ func TestGRPCServer_DeleteNamespace(t *testing.T) { t.Run("should return error Internal if deleting namespace failed", func(t *testing.T) { mockedNamespaceService := &mocks.NamespaceService{} - dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), nil, nil, nil, nil, mockedNamespaceService, nil, nil) + dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), &api.Deps{NamespaceService: mockedNamespaceService}) mockedNamespaceService.EXPECT().Delete(mock.AnythingOfType("*context.emptyCtx"), namespaceId).Return(errors.New("random error")).Once() res, err := dummyGRPCServer.DeleteNamespace(context.Background(), dummyReq) assert.Nil(t, res) diff --git a/internal/api/v1beta1/grpc_provider.go b/internal/api/v1beta1/provider.go similarity index 88% rename from internal/api/v1beta1/grpc_provider.go rename to internal/api/v1beta1/provider.go index dbcc4cd2..a60b0f43 100644 --- a/internal/api/v1beta1/grpc_provider.go +++ b/internal/api/v1beta1/provider.go @@ -12,15 +12,6 @@ import ( "google.golang.org/protobuf/types/known/timestamppb" ) -//go:generate mockery --name=ProviderService -r --case underscore --with-expecter --structname ProviderService --filename provider_service.go --output=./mocks -type ProviderService interface { - List(context.Context, provider.Filter) ([]provider.Provider, error) - Create(context.Context, *provider.Provider) error - Get(context.Context, uint64) (*provider.Provider, error) - Update(context.Context, *provider.Provider) error - Delete(context.Context, uint64) error -} - func (s *GRPCServer) ListProviders(ctx context.Context, req *sirenv1beta1.ListProvidersRequest) (*sirenv1beta1.ListProvidersResponse, error) { providers, err := s.providerService.List(ctx, provider.Filter{ URN: req.GetUrn(), diff --git a/internal/api/v1beta1/grpc_provider_test.go b/internal/api/v1beta1/provider_test.go similarity index 85% rename from internal/api/v1beta1/grpc_provider_test.go rename to internal/api/v1beta1/provider_test.go index 1095f865..675baf53 100644 --- a/internal/api/v1beta1/grpc_provider_test.go +++ b/internal/api/v1beta1/provider_test.go @@ -7,6 +7,7 @@ import ( "github.com/odpf/salt/log" "github.com/odpf/siren/core/provider" + "github.com/odpf/siren/internal/api" "github.com/odpf/siren/internal/api/v1beta1" "github.com/odpf/siren/internal/api/v1beta1/mocks" "github.com/odpf/siren/pkg/errors" @@ -26,7 +27,7 @@ func TestGRPCServer_ListProvider(t *testing.T) { t.Run("should return list of all provider", func(t *testing.T) { mockedProviderService := &mocks.ProviderService{} - dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), nil, nil, nil, mockedProviderService, nil, nil, nil) + dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), &api.Deps{ProviderService: mockedProviderService}) dummyResult := []provider.Provider{ { @@ -52,7 +53,7 @@ func TestGRPCServer_ListProvider(t *testing.T) { t.Run("should return error Internal if getting providers failed", func(t *testing.T) { mockedProviderService := &mocks.ProviderService{} - dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), nil, nil, nil, mockedProviderService, nil, nil, nil) + dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), &api.Deps{ProviderService: mockedProviderService}) mockedProviderService.EXPECT().List(mock.AnythingOfType("*context.emptyCtx"), provider.Filter{}).Return(nil, errors.New("random error")).Once() res, err := dummyGRPCServer.ListProviders(ctx, &sirenv1beta1.ListProvidersRequest{}) @@ -62,7 +63,7 @@ func TestGRPCServer_ListProvider(t *testing.T) { t.Run("should return error Internal if NewStruct conversion failed", func(t *testing.T) { mockedProviderService := &mocks.ProviderService{} - dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), nil, nil, nil, mockedProviderService, nil, nil, nil) + dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), &api.Deps{ProviderService: mockedProviderService}) credentials["bar"] = string([]byte{0xff}) dummyResult := []provider.Provider{ @@ -113,7 +114,7 @@ func TestGRPCServer_CreateProvider(t *testing.T) { t.Run("should create provider object", func(t *testing.T) { mockedProviderService := &mocks.ProviderService{} - dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), nil, nil, nil, mockedProviderService, nil, nil, nil) + dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), &api.Deps{ProviderService: mockedProviderService}) mockedProviderService.EXPECT().Create(mock.AnythingOfType("*context.emptyCtx"), payload).Run(func(_a0 context.Context, _a1 *provider.Provider) { _a1.ID = testID @@ -125,7 +126,7 @@ func TestGRPCServer_CreateProvider(t *testing.T) { t.Run("should return error Invalid Argument if provider return error invalid", func(t *testing.T) { mockedProviderService := &mocks.ProviderService{} - dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), nil, nil, nil, mockedProviderService, nil, nil, nil) + dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), &api.Deps{ProviderService: mockedProviderService}) mockedProviderService.EXPECT().Create(mock.AnythingOfType("*context.emptyCtx"), payload).Return(errors.ErrInvalid).Once() res, err := dummyGRPCServer.CreateProvider(ctx, dummyReq) @@ -135,7 +136,7 @@ func TestGRPCServer_CreateProvider(t *testing.T) { t.Run("should return error AlreadyExist if provider return error conflict", func(t *testing.T) { mockedProviderService := &mocks.ProviderService{} - dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), nil, nil, nil, mockedProviderService, nil, nil, nil) + dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), &api.Deps{ProviderService: mockedProviderService}) mockedProviderService.EXPECT().Create(mock.AnythingOfType("*context.emptyCtx"), payload).Return(errors.ErrConflict).Once() res, err := dummyGRPCServer.CreateProvider(ctx, dummyReq) @@ -145,7 +146,7 @@ func TestGRPCServer_CreateProvider(t *testing.T) { t.Run("should return error Internal if creating providers failed", func(t *testing.T) { mockedProviderService := &mocks.ProviderService{} - dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), nil, nil, nil, mockedProviderService, nil, nil, nil) + dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), &api.Deps{ProviderService: mockedProviderService}) mockedProviderService.EXPECT().Create(mock.AnythingOfType("*context.emptyCtx"), payload).Return(errors.New("random error")).Once() res, err := dummyGRPCServer.CreateProvider(ctx, dummyReq) @@ -168,7 +169,7 @@ func TestGRPCServer_GetProvider(t *testing.T) { t.Run("should return a provider", func(t *testing.T) { mockedProviderService := &mocks.ProviderService{} - dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), nil, nil, nil, mockedProviderService, nil, nil, nil) + dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), &api.Deps{ProviderService: mockedProviderService}) dummyResult := &provider.Provider{ ID: 1, Host: "foo", @@ -192,7 +193,7 @@ func TestGRPCServer_GetProvider(t *testing.T) { t.Run("should return error Not Found if no provider found", func(t *testing.T) { mockedProviderService := &mocks.ProviderService{} - dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), nil, nil, nil, mockedProviderService, nil, nil, nil) + dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), &api.Deps{ProviderService: mockedProviderService}) mockedProviderService.EXPECT().Get(mock.AnythingOfType("*context.emptyCtx"), providerId). Return(nil, nil).Once() @@ -204,7 +205,7 @@ func TestGRPCServer_GetProvider(t *testing.T) { t.Run("should return error Internal if getting provider failed", func(t *testing.T) { mockedProviderService := &mocks.ProviderService{} - dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), nil, nil, nil, mockedProviderService, nil, nil, nil) + dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), &api.Deps{ProviderService: mockedProviderService}) dummyResult := &provider.Provider{ ID: 1, Host: "foo", @@ -226,7 +227,7 @@ func TestGRPCServer_GetProvider(t *testing.T) { t.Run("should return error Internal if NewStruct conversion failed", func(t *testing.T) { mockedProviderService := &mocks.ProviderService{} - dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), nil, nil, nil, mockedProviderService, nil, nil, nil) + dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), &api.Deps{ProviderService: mockedProviderService}) credentials["bar"] = string([]byte{0xff}) dummyResult := &provider.Provider{ @@ -276,7 +277,7 @@ func TestGRPCServer_UpdateProvider(t *testing.T) { t.Run("should update provider object", func(t *testing.T) { mockedProviderService := &mocks.ProviderService{} - dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), nil, nil, nil, mockedProviderService, nil, nil, nil) + dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), &api.Deps{ProviderService: mockedProviderService}) mockedProviderService.EXPECT().Update(mock.AnythingOfType("*context.emptyCtx"), payload).Run(func(_a0 context.Context, _a1 *provider.Provider) { _a1.ID = testID @@ -288,7 +289,7 @@ func TestGRPCServer_UpdateProvider(t *testing.T) { t.Run("should return error Invalid Argument if updating providers return err invalid", func(t *testing.T) { mockedProviderService := &mocks.ProviderService{} - dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), nil, nil, nil, mockedProviderService, nil, nil, nil) + dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), &api.Deps{ProviderService: mockedProviderService}) mockedProviderService.EXPECT().Update(mock.AnythingOfType("*context.emptyCtx"), payload).Return(errors.ErrInvalid).Once() res, err := dummyGRPCServer.UpdateProvider(ctx, dummyReq) @@ -298,7 +299,7 @@ func TestGRPCServer_UpdateProvider(t *testing.T) { t.Run("should return error AlreadyExist if updating providers return err conflict", func(t *testing.T) { mockedProviderService := &mocks.ProviderService{} - dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), nil, nil, nil, mockedProviderService, nil, nil, nil) + dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), &api.Deps{ProviderService: mockedProviderService}) mockedProviderService.EXPECT().Update(mock.AnythingOfType("*context.emptyCtx"), payload).Return(errors.ErrConflict).Once() res, err := dummyGRPCServer.UpdateProvider(ctx, dummyReq) @@ -308,7 +309,7 @@ func TestGRPCServer_UpdateProvider(t *testing.T) { t.Run("should return error Internal if updating providers failed", func(t *testing.T) { mockedProviderService := &mocks.ProviderService{} - dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), nil, nil, nil, mockedProviderService, nil, nil, nil) + dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), &api.Deps{ProviderService: mockedProviderService}) mockedProviderService.EXPECT().Update(mock.AnythingOfType("*context.emptyCtx"), payload).Return(errors.New("random error")).Once() res, err := dummyGRPCServer.UpdateProvider(ctx, dummyReq) @@ -325,7 +326,7 @@ func TestGRPCServer_DeleteProvider(t *testing.T) { t.Run("should delete provider object", func(t *testing.T) { mockedProviderService := &mocks.ProviderService{} - dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), nil, nil, nil, mockedProviderService, nil, nil, nil) + dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), &api.Deps{ProviderService: mockedProviderService}) mockedProviderService.EXPECT().Delete(mock.AnythingOfType("*context.emptyCtx"), providerId).Return(nil).Once() res, err := dummyGRPCServer.DeleteProvider(context.Background(), dummyReq) @@ -335,7 +336,7 @@ func TestGRPCServer_DeleteProvider(t *testing.T) { t.Run("should return error Internal if deleting providers failed", func(t *testing.T) { mockedProviderService := &mocks.ProviderService{} - dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), nil, nil, nil, mockedProviderService, nil, nil, nil) + dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), &api.Deps{ProviderService: mockedProviderService}) mockedProviderService.EXPECT().Delete(mock.AnythingOfType("*context.emptyCtx"), providerId).Return(errors.New("random error")).Once() res, err := dummyGRPCServer.DeleteProvider(context.Background(), dummyReq) diff --git a/internal/api/v1beta1/grpc_receiver.go b/internal/api/v1beta1/receiver.go similarity index 84% rename from internal/api/v1beta1/grpc_receiver.go rename to internal/api/v1beta1/receiver.go index 37ff8687..45c4f313 100644 --- a/internal/api/v1beta1/grpc_receiver.go +++ b/internal/api/v1beta1/receiver.go @@ -9,17 +9,6 @@ import ( "google.golang.org/protobuf/types/known/timestamppb" ) -//go:generate mockery --name=ReceiverService -r --case underscore --with-expecter --structname ReceiverService --filename receiver_service.go --output=./mocks -type ReceiverService interface { - List(ctx context.Context, flt receiver.Filter) ([]receiver.Receiver, error) - Create(ctx context.Context, rcv *receiver.Receiver) error - Get(ctx context.Context, id uint64) (*receiver.Receiver, error) - Update(ctx context.Context, rcv *receiver.Receiver) error - Delete(ctx context.Context, id uint64) error - Notify(ctx context.Context, id uint64, payloadMessage receiver.NotificationMessage) error - GetSubscriptionConfig(subsConfs map[string]string, rcv *receiver.Receiver) (map[string]string, error) -} - func (s *GRPCServer) ListReceivers(ctx context.Context, _ *sirenv1beta1.ListReceiversRequest) (*sirenv1beta1.ListReceiversResponse, error) { receivers, err := s.receiverService.List(ctx, receiver.Filter{}) if err != nil { diff --git a/internal/api/v1beta1/grpc_receiver_test.go b/internal/api/v1beta1/receiver_test.go similarity index 87% rename from internal/api/v1beta1/grpc_receiver_test.go rename to internal/api/v1beta1/receiver_test.go index 0d9aedd1..4c2b432d 100644 --- a/internal/api/v1beta1/grpc_receiver_test.go +++ b/internal/api/v1beta1/receiver_test.go @@ -7,6 +7,7 @@ import ( "github.com/odpf/salt/log" "github.com/odpf/siren/core/receiver" + "github.com/odpf/siren/internal/api" "github.com/odpf/siren/internal/api/v1beta1" "github.com/odpf/siren/internal/api/v1beta1/mocks" "github.com/odpf/siren/pkg/errors" @@ -35,7 +36,7 @@ func TestGRPCServer_ListReceiver(t *testing.T) { t.Run("should return list of all receiver", func(t *testing.T) { mockedReceiverService := &mocks.ReceiverService{} - dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), nil, nil, nil, nil, nil, mockedReceiverService, nil) + dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), &api.Deps{ReceiverService: mockedReceiverService}) mockedReceiverService.EXPECT().List(mock.AnythingOfType("*context.emptyCtx"), receiver.Filter{}). Return(dummyResult, nil).Once() @@ -51,7 +52,7 @@ func TestGRPCServer_ListReceiver(t *testing.T) { t.Run("should return error Internal if getting providers failed", func(t *testing.T) { mockedReceiverService := &mocks.ReceiverService{} - dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), nil, nil, nil, nil, nil, mockedReceiverService, nil) + dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), &api.Deps{ReceiverService: mockedReceiverService}) mockedReceiverService.EXPECT().List(mock.AnythingOfType("*context.emptyCtx"), receiver.Filter{}). Return(nil, errors.New("random error")) @@ -62,7 +63,7 @@ func TestGRPCServer_ListReceiver(t *testing.T) { t.Run("should return error Internal if NewStruct conversion failed", func(t *testing.T) { mockedReceiverService := &mocks.ReceiverService{} - dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), nil, nil, nil, nil, nil, mockedReceiverService, nil) + dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), &api.Deps{ReceiverService: mockedReceiverService}) configurations["foo"] = string([]byte{0xff}) dummyResult := []receiver.Receiver{ { @@ -110,7 +111,7 @@ func TestGRPCServer_CreateReceiver(t *testing.T) { t.Run("Should create a receiver object", func(t *testing.T) { mockedReceiverService := &mocks.ReceiverService{} - dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), nil, nil, nil, nil, nil, mockedReceiverService, nil) + dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), &api.Deps{ReceiverService: mockedReceiverService}) mockedReceiverService.EXPECT().Create(mock.AnythingOfType("*context.emptyCtx"), payload).Run(func(ctx context.Context, rcv *receiver.Receiver) { rcv.ID = generatedID }).Return(nil).Once() @@ -121,7 +122,7 @@ func TestGRPCServer_CreateReceiver(t *testing.T) { t.Run("should return error Invalid Argument if create receiver failed with err invalid", func(t *testing.T) { mockedReceiverService := &mocks.ReceiverService{} - dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), nil, nil, nil, nil, nil, mockedReceiverService, nil) + dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), &api.Deps{ReceiverService: mockedReceiverService}) mockedReceiverService.EXPECT().Create(mock.AnythingOfType("*context.emptyCtx"), payload).Return(errors.ErrInvalid).Once() @@ -134,7 +135,7 @@ func TestGRPCServer_CreateReceiver(t *testing.T) { t.Run("should return error Internal if creating receiver failed", func(t *testing.T) { mockedReceiverService := &mocks.ReceiverService{} - dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), nil, nil, nil, nil, nil, mockedReceiverService, nil) + dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), &api.Deps{ReceiverService: mockedReceiverService}) mockedReceiverService.EXPECT().Create(mock.AnythingOfType("*context.emptyCtx"), payload).Return(errors.New("random error")).Once() res, err := dummyGRPCServer.CreateReceiver(context.Background(), dummyReq) @@ -163,7 +164,7 @@ func TestGRPCServer_GetReceiver(t *testing.T) { t.Run("should return a receiver", func(t *testing.T) { mockedReceiverService := &mocks.ReceiverService{} - dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), nil, nil, nil, nil, nil, mockedReceiverService, nil) + dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), &api.Deps{ReceiverService: mockedReceiverService}) mockedReceiverService.EXPECT().Get(mock.AnythingOfType("*context.emptyCtx"), receiverId). Return(payload, nil).Once() @@ -177,7 +178,7 @@ func TestGRPCServer_GetReceiver(t *testing.T) { t.Run("should return error Not Found if no receiver found", func(t *testing.T) { mockedReceiverService := &mocks.ReceiverService{} - dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), nil, nil, nil, nil, nil, mockedReceiverService, nil) + dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), &api.Deps{ReceiverService: mockedReceiverService}) mockedReceiverService.EXPECT().Get(mock.AnythingOfType("*context.emptyCtx"), receiverId). Return(nil, errors.ErrNotFound).Once() @@ -188,7 +189,7 @@ func TestGRPCServer_GetReceiver(t *testing.T) { t.Run("should return error Internal if getting receiver failed", func(t *testing.T) { mockedReceiverService := &mocks.ReceiverService{} - dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), nil, nil, nil, nil, nil, mockedReceiverService, nil) + dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), &api.Deps{ReceiverService: mockedReceiverService}) mockedReceiverService.EXPECT().Get(mock.AnythingOfType("*context.emptyCtx"), receiverId). Return(payload, errors.New("random error")).Once() @@ -199,7 +200,7 @@ func TestGRPCServer_GetReceiver(t *testing.T) { t.Run("should return error Internal if NewStruct conversion of configuration failed", func(t *testing.T) { mockedReceiverService := &mocks.ReceiverService{} - dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), nil, nil, nil, nil, nil, mockedReceiverService, nil) + dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), &api.Deps{ReceiverService: mockedReceiverService}) configurations["foo"] = string([]byte{0xff}) payload := &receiver.Receiver{ @@ -218,7 +219,7 @@ func TestGRPCServer_GetReceiver(t *testing.T) { t.Run("should return error Internal if data NewStruct conversion of data failed", func(t *testing.T) { mockedReceiverService := &mocks.ReceiverService{} - dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), nil, nil, nil, nil, nil, mockedReceiverService, nil) + dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), &api.Deps{ReceiverService: mockedReceiverService}) data := make(map[string]interface{}) data["channels"] = string([]byte{0xff}) payload := &receiver.Receiver{ @@ -265,7 +266,7 @@ func TestGRPCServer_UpdateReceiver(t *testing.T) { t.Run("should update receiver object", func(t *testing.T) { mockedReceiverService := &mocks.ReceiverService{} - dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), nil, nil, nil, nil, nil, mockedReceiverService, nil) + dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), &api.Deps{ReceiverService: mockedReceiverService}) mockedReceiverService.EXPECT().Update(mock.AnythingOfType("*context.emptyCtx"), payload).Run(func(ctx context.Context, rcv *receiver.Receiver) { rcv.ID = payload.ID }).Return(nil).Once() @@ -277,7 +278,7 @@ func TestGRPCServer_UpdateReceiver(t *testing.T) { t.Run("should return error Invalid Argument if update receiver return invalid error", func(t *testing.T) { mockedReceiverService := &mocks.ReceiverService{} - dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), nil, nil, nil, nil, nil, mockedReceiverService, nil) + dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), &api.Deps{ReceiverService: mockedReceiverService}) mockedReceiverService.EXPECT().Update(mock.AnythingOfType("*context.emptyCtx"), payload).Return(errors.ErrInvalid).Once() @@ -289,7 +290,7 @@ func TestGRPCServer_UpdateReceiver(t *testing.T) { t.Run("should return error Internal if updating receiver failed", func(t *testing.T) { mockedReceiverService := &mocks.ReceiverService{} - dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), nil, nil, nil, nil, nil, mockedReceiverService, nil) + dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), &api.Deps{ReceiverService: mockedReceiverService}) mockedReceiverService.EXPECT().Update(mock.AnythingOfType("*context.emptyCtx"), payload).Return(errors.New("random error")) res, err := dummyGRPCServer.UpdateReceiver(context.Background(), dummyReq) @@ -306,7 +307,7 @@ func TestGRPCServer_DeleteReceiver(t *testing.T) { t.Run("should delete receiver object", func(t *testing.T) { mockedReceiverService := &mocks.ReceiverService{} - dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), nil, nil, nil, nil, nil, mockedReceiverService, nil) + dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), &api.Deps{ReceiverService: mockedReceiverService}) mockedReceiverService.EXPECT().Delete(mock.AnythingOfType("*context.emptyCtx"), providerId). Return(nil).Once() @@ -317,7 +318,7 @@ func TestGRPCServer_DeleteReceiver(t *testing.T) { t.Run("should return error Internal if deleting receiver failed", func(t *testing.T) { mockedReceiverService := &mocks.ReceiverService{} - dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), nil, nil, nil, nil, nil, mockedReceiverService, nil) + dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), &api.Deps{ReceiverService: mockedReceiverService}) mockedReceiverService.EXPECT().Delete(mock.AnythingOfType("*context.emptyCtx"), providerId). Return(errors.New("random error")).Once() @@ -394,7 +395,7 @@ func TestGRPCServer_NotifyReceiver(t *testing.T) { t.Run("should return invalid argument if notify receiver return invalid argument", func(t *testing.T) { mockedReceiverService := &mocks.ReceiverService{} - dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), nil, nil, nil, nil, nil, mockedReceiverService, nil) + dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), &api.Deps{ReceiverService: mockedReceiverService}) mockedReceiverService.EXPECT().Notify(mock.AnythingOfType("*context.emptyCtx"), uint64(1), @@ -413,7 +414,7 @@ func TestGRPCServer_NotifyReceiver(t *testing.T) { t.Run("should return internal error if notify receiver return some error", func(t *testing.T) { mockedReceiverService := &mocks.ReceiverService{} - dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), nil, nil, nil, nil, nil, mockedReceiverService, nil) + dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), &api.Deps{ReceiverService: mockedReceiverService}) mockedReceiverService.EXPECT().Notify( mock.AnythingOfType("*context.emptyCtx"), @@ -433,7 +434,7 @@ func TestGRPCServer_NotifyReceiver(t *testing.T) { t.Run("should return OK response if notify receiver succeed", func(t *testing.T) { mockedReceiverService := &mocks.ReceiverService{} - dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), nil, nil, nil, nil, nil, mockedReceiverService, nil) + dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), &api.Deps{ReceiverService: mockedReceiverService}) mockedReceiverService.EXPECT().Notify( mock.AnythingOfType("*context.emptyCtx"), diff --git a/internal/api/v1beta1/grpc_rule.go b/internal/api/v1beta1/rule.go similarity index 89% rename from internal/api/v1beta1/grpc_rule.go rename to internal/api/v1beta1/rule.go index 753d63ba..1816af15 100644 --- a/internal/api/v1beta1/grpc_rule.go +++ b/internal/api/v1beta1/rule.go @@ -8,12 +8,6 @@ import ( "google.golang.org/protobuf/types/known/timestamppb" ) -//go:generate mockery --name=RuleService -r --case underscore --with-expecter --structname RuleService --filename rule_service.go --output=./mocks -type RuleService interface { - Upsert(context.Context, *rule.Rule) error - List(context.Context, rule.Filter) ([]rule.Rule, error) -} - func (s *GRPCServer) ListRules(ctx context.Context, req *sirenv1beta1.ListRulesRequest) (*sirenv1beta1.ListRulesResponse, error) { rules, err := s.ruleService.List(ctx, rule.Filter{ Name: req.GetName(), diff --git a/internal/api/v1beta1/grpc_rule_test.go b/internal/api/v1beta1/rule_test.go similarity index 89% rename from internal/api/v1beta1/grpc_rule_test.go rename to internal/api/v1beta1/rule_test.go index dfd0818a..58cc2f12 100644 --- a/internal/api/v1beta1/grpc_rule_test.go +++ b/internal/api/v1beta1/rule_test.go @@ -9,6 +9,7 @@ import ( "github.com/odpf/siren/pkg/errors" "github.com/odpf/siren/core/rule" + "github.com/odpf/siren/internal/api" "github.com/odpf/siren/internal/api/v1beta1" "github.com/odpf/siren/internal/api/v1beta1/mocks" sirenv1beta1 "github.com/odpf/siren/proto/odpf/siren/v1beta1" @@ -48,7 +49,7 @@ func TestGRPCServer_ListRules(t *testing.T) { }, } - dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), nil, mockedRuleService, nil, nil, nil, nil, nil) + dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), &api.Deps{RuleService: mockedRuleService}) mockedRuleService.EXPECT().List(ctx, rule.Filter{ Name: dummyPayload.Name, @@ -72,7 +73,7 @@ func TestGRPCServer_ListRules(t *testing.T) { ctx := context.Background() mockedRuleService := &mocks.RuleService{} - dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), nil, mockedRuleService, nil, nil, nil, nil, nil) + dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), &api.Deps{RuleService: mockedRuleService}) mockedRuleService.EXPECT().List(ctx, rule.Filter{ Name: dummyPayload.Name, Namespace: dummyPayload.Namespace, @@ -123,7 +124,7 @@ func TestGRPCServer_UpdateRules(t *testing.T) { t.Run("should update rule", func(t *testing.T) { ctx := context.Background() mockedRuleService := &mocks.RuleService{} - dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), nil, mockedRuleService, nil, nil, nil, nil, nil) + dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), &api.Deps{RuleService: mockedRuleService}) dummyResult := &rule.Rule{} *dummyResult = *dummyPayload dummyResult.Enabled = false @@ -144,7 +145,7 @@ func TestGRPCServer_UpdateRules(t *testing.T) { ctx := context.Background() mockedRuleService := &mocks.RuleService{} - dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), nil, mockedRuleService, nil, nil, nil, nil, nil) + dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), &api.Deps{RuleService: mockedRuleService}) mockedRuleService.EXPECT().Upsert(ctx, dummyPayload).Return(errors.ErrConflict).Once() res, err := dummyGRPCServer.UpdateRule(ctx, dummyReq) @@ -156,7 +157,7 @@ func TestGRPCServer_UpdateRules(t *testing.T) { ctx := context.Background() mockedRuleService := &mocks.RuleService{} - dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), nil, mockedRuleService, nil, nil, nil, nil, nil) + dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), &api.Deps{RuleService: mockedRuleService}) mockedRuleService.EXPECT().Upsert(ctx, dummyPayload).Return(errors.New("random error")).Once() res, err := dummyGRPCServer.UpdateRule(ctx, dummyReq) diff --git a/internal/api/v1beta1/grpc_subscription.go b/internal/api/v1beta1/subscription.go similarity index 89% rename from internal/api/v1beta1/grpc_subscription.go rename to internal/api/v1beta1/subscription.go index 75c0f799..64319fd5 100644 --- a/internal/api/v1beta1/grpc_subscription.go +++ b/internal/api/v1beta1/subscription.go @@ -8,15 +8,6 @@ import ( "google.golang.org/protobuf/types/known/timestamppb" ) -//go:generate mockery --name=SubscriptionService -r --case underscore --with-expecter --structname SubscriptionService --filename subscription_service.go --output=./mocks -type SubscriptionService interface { - List(context.Context, subscription.Filter) ([]subscription.Subscription, error) - Create(context.Context, *subscription.Subscription) error - Get(context.Context, uint64) (*subscription.Subscription, error) - Update(context.Context, *subscription.Subscription) error - Delete(context.Context, uint64) error -} - func (s *GRPCServer) ListSubscriptions(ctx context.Context, _ *sirenv1beta1.ListSubscriptionsRequest) (*sirenv1beta1.ListSubscriptionsResponse, error) { subscriptions, err := s.subscriptionService.List(ctx, subscription.Filter{}) if err != nil { diff --git a/internal/api/v1beta1/grpc_subscription_test.go b/internal/api/v1beta1/subscription_test.go similarity index 85% rename from internal/api/v1beta1/grpc_subscription_test.go rename to internal/api/v1beta1/subscription_test.go index c1720752..733d7258 100644 --- a/internal/api/v1beta1/grpc_subscription_test.go +++ b/internal/api/v1beta1/subscription_test.go @@ -7,6 +7,7 @@ import ( "github.com/odpf/salt/log" "github.com/odpf/siren/core/subscription" + "github.com/odpf/siren/internal/api" "github.com/odpf/siren/internal/api/v1beta1" "github.com/odpf/siren/internal/api/v1beta1/mocks" "github.com/odpf/siren/pkg/errors" @@ -23,7 +24,7 @@ func TestGRPCServer_ListSubscriptions(t *testing.T) { t.Run("should return list of all subscriptions", func(t *testing.T) { mockedSubscriptionService := &mocks.SubscriptionService{} - dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), nil, nil, nil, nil, nil, nil, mockedSubscriptionService) + dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), &api.Deps{SubscriptionService: mockedSubscriptionService}) dummyResult := []subscription.Subscription{ { @@ -48,7 +49,7 @@ func TestGRPCServer_ListSubscriptions(t *testing.T) { t.Run("should return error Internal if getting subscriptions fails", func(t *testing.T) { mockedSubscriptionService := &mocks.SubscriptionService{} - dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), nil, nil, nil, nil, nil, nil, mockedSubscriptionService) + dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), &api.Deps{SubscriptionService: mockedSubscriptionService}) mockedSubscriptionService.EXPECT().List(context.Background(), subscription.Filter{}).Return(nil, errors.New("random error")).Once() res, err := dummyGRPCServer.ListSubscriptions(context.Background(), &sirenv1beta1.ListSubscriptionsRequest{}) @@ -65,7 +66,7 @@ func TestGRPCServer_GetSubscription(t *testing.T) { t.Run("should return a subscription", func(t *testing.T) { mockedSubscriptionService := &mocks.SubscriptionService{} - dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), nil, nil, nil, nil, nil, nil, mockedSubscriptionService) + dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), &api.Deps{SubscriptionService: mockedSubscriptionService}) dummyResult := &subscription.Subscription{ ID: 1, URN: "foo", @@ -85,7 +86,7 @@ func TestGRPCServer_GetSubscription(t *testing.T) { t.Run("should return error Not Found if subscriptions not found", func(t *testing.T) { mockedSubscriptionService := &mocks.SubscriptionService{} - dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), nil, nil, nil, nil, nil, nil, mockedSubscriptionService) + dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), &api.Deps{SubscriptionService: mockedSubscriptionService}) mockedSubscriptionService.EXPECT().Get(context.Background(), uint64(1)).Return(nil, errors.ErrNotFound).Once() res, err := dummyGRPCServer.GetSubscription(context.Background(), &sirenv1beta1.GetSubscriptionRequest{Id: 1}) assert.Nil(t, res) @@ -94,7 +95,7 @@ func TestGRPCServer_GetSubscription(t *testing.T) { t.Run("should return error Internal if getting subscription fails", func(t *testing.T) { mockedSubscriptionService := &mocks.SubscriptionService{} - dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), nil, nil, nil, nil, nil, nil, mockedSubscriptionService) + dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), &api.Deps{SubscriptionService: mockedSubscriptionService}) mockedSubscriptionService.EXPECT().Get(context.Background(), uint64(1)). Return(nil, errors.New("random error")).Once() res, err := dummyGRPCServer.GetSubscription(context.Background(), &sirenv1beta1.GetSubscriptionRequest{Id: 1}) @@ -128,7 +129,7 @@ func TestGRPCServer_CreateSubscription(t *testing.T) { t.Run("should create a subscription", func(t *testing.T) { mockedSubscriptionService := &mocks.SubscriptionService{} - dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), nil, nil, nil, nil, nil, nil, mockedSubscriptionService) + dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), &api.Deps{SubscriptionService: mockedSubscriptionService}) mockedSubscriptionService.EXPECT().Create(context.Background(), payload).Run(func(_a0 context.Context, _a1 *subscription.Subscription) { _a1.ID = dummyResult.ID @@ -145,7 +146,7 @@ func TestGRPCServer_CreateSubscription(t *testing.T) { t.Run("should return error InvalidArgument if creating subscriptions return err invalid", func(t *testing.T) { mockedSubscriptionService := &mocks.SubscriptionService{} - dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), nil, nil, nil, nil, nil, nil, mockedSubscriptionService) + dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), &api.Deps{SubscriptionService: mockedSubscriptionService}) mockedSubscriptionService.EXPECT().Create(context.Background(), payload).Run(func(_a0 context.Context, _a1 *subscription.Subscription) { _a1.ID = dummyResult.ID @@ -162,7 +163,7 @@ func TestGRPCServer_CreateSubscription(t *testing.T) { t.Run("should return error AlreadyExists if creating subscriptions return err conflict", func(t *testing.T) { mockedSubscriptionService := &mocks.SubscriptionService{} - dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), nil, nil, nil, nil, nil, nil, mockedSubscriptionService) + dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), &api.Deps{SubscriptionService: mockedSubscriptionService}) mockedSubscriptionService.EXPECT().Create(context.Background(), payload).Run(func(_a0 context.Context, _a1 *subscription.Subscription) { _a1.ID = dummyResult.ID @@ -179,7 +180,7 @@ func TestGRPCServer_CreateSubscription(t *testing.T) { t.Run("should return error Internal if creating subscriptions fails", func(t *testing.T) { mockedSubscriptionService := &mocks.SubscriptionService{} - dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), nil, nil, nil, nil, nil, nil, mockedSubscriptionService) + dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), &api.Deps{SubscriptionService: mockedSubscriptionService}) mockedSubscriptionService.EXPECT().Create(context.Background(), payload).Run(func(_a0 context.Context, _a1 *subscription.Subscription) { _a1.ID = dummyResult.ID @@ -210,7 +211,7 @@ func TestGRPCServer_UpdateSubscription(t *testing.T) { t.Run("should update a subscription", func(t *testing.T) { mockedSubscriptionService := &mocks.SubscriptionService{} - dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), nil, nil, nil, nil, nil, nil, mockedSubscriptionService) + dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), &api.Deps{SubscriptionService: mockedSubscriptionService}) mockedSubscriptionService.EXPECT().Update(context.Background(), payload).Run(func(_a0 context.Context, _a1 *subscription.Subscription) { _a1.ID = uint64(1) @@ -228,7 +229,7 @@ func TestGRPCServer_UpdateSubscription(t *testing.T) { t.Run("should return error Invalid Argument if updating subscriptions return err invalid", func(t *testing.T) { mockedSubscriptionService := &mocks.SubscriptionService{} - dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), nil, nil, nil, nil, nil, nil, mockedSubscriptionService) + dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), &api.Deps{SubscriptionService: mockedSubscriptionService}) mockedSubscriptionService.EXPECT().Update(context.Background(), payload).Return(errors.ErrInvalid).Once() res, err := dummyGRPCServer.UpdateSubscription(context.Background(), &sirenv1beta1.UpdateSubscriptionRequest{ Id: 1, @@ -243,7 +244,7 @@ func TestGRPCServer_UpdateSubscription(t *testing.T) { t.Run("should return error AlreadyExist if updating subscriptions return err conflict", func(t *testing.T) { mockedSubscriptionService := &mocks.SubscriptionService{} - dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), nil, nil, nil, nil, nil, nil, mockedSubscriptionService) + dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), &api.Deps{SubscriptionService: mockedSubscriptionService}) mockedSubscriptionService.EXPECT().Update(context.Background(), payload).Return(errors.ErrConflict).Once() res, err := dummyGRPCServer.UpdateSubscription(context.Background(), &sirenv1beta1.UpdateSubscriptionRequest{ Id: 1, @@ -258,7 +259,7 @@ func TestGRPCServer_UpdateSubscription(t *testing.T) { t.Run("should return error Internal if updating subscriptions fails", func(t *testing.T) { mockedSubscriptionService := &mocks.SubscriptionService{} - dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), nil, nil, nil, nil, nil, nil, mockedSubscriptionService) + dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), &api.Deps{SubscriptionService: mockedSubscriptionService}) mockedSubscriptionService.EXPECT().Update(context.Background(), payload).Return(errors.New("random error")).Once() res, err := dummyGRPCServer.UpdateSubscription(context.Background(), &sirenv1beta1.UpdateSubscriptionRequest{ Id: 1, @@ -273,7 +274,7 @@ func TestGRPCServer_UpdateSubscription(t *testing.T) { t.Run("should return error Invalid for bad requests", func(t *testing.T) { mockedSubscriptionService := &mocks.SubscriptionService{} - dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), nil, nil, nil, nil, nil, nil, mockedSubscriptionService) + dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), &api.Deps{SubscriptionService: mockedSubscriptionService}) mockedSubscriptionService.EXPECT().Update(context.Background(), payload).Return(errors.ErrInvalid).Once() res, err := dummyGRPCServer.UpdateSubscription(context.Background(), &sirenv1beta1.UpdateSubscriptionRequest{ Id: 1, @@ -290,7 +291,7 @@ func TestGRPCServer_UpdateSubscription(t *testing.T) { func TestGRPCServer_DeleteSubscription(t *testing.T) { t.Run("should delete a subscription", func(t *testing.T) { mockedSubscriptionService := &mocks.SubscriptionService{} - dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), nil, nil, nil, nil, nil, nil, mockedSubscriptionService) + dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), &api.Deps{SubscriptionService: mockedSubscriptionService}) mockedSubscriptionService.EXPECT().Delete(context.Background(), uint64(1)).Return(nil).Once() res, err := dummyGRPCServer.DeleteSubscription(context.Background(), &sirenv1beta1.DeleteSubscriptionRequest{Id: 1}) @@ -300,7 +301,7 @@ func TestGRPCServer_DeleteSubscription(t *testing.T) { t.Run("should return error Internal if deleting subscription fails", func(t *testing.T) { mockedSubscriptionService := &mocks.SubscriptionService{} - dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), nil, nil, nil, nil, nil, nil, mockedSubscriptionService) + dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), &api.Deps{SubscriptionService: mockedSubscriptionService}) mockedSubscriptionService.EXPECT().Delete(context.Background(), uint64(1)).Return(errors.New("random error")).Once() res, err := dummyGRPCServer.DeleteSubscription(context.Background(), &sirenv1beta1.DeleteSubscriptionRequest{Id: 1}) diff --git a/internal/api/v1beta1/grpc_template.go b/internal/api/v1beta1/template.go similarity index 88% rename from internal/api/v1beta1/grpc_template.go rename to internal/api/v1beta1/template.go index ed87bb96..8e9f7037 100644 --- a/internal/api/v1beta1/grpc_template.go +++ b/internal/api/v1beta1/template.go @@ -8,15 +8,6 @@ import ( "google.golang.org/protobuf/types/known/timestamppb" ) -//go:generate mockery --name=TemplateService -r --case underscore --with-expecter --structname TemplateService --filename template_service.go --output=./mocks -type TemplateService interface { - Upsert(context.Context, *template.Template) error - List(context.Context, template.Filter) ([]template.Template, error) - GetByName(context.Context, string) (*template.Template, error) - Delete(context.Context, string) error - Render(context.Context, string, map[string]string) (string, error) -} - func (s *GRPCServer) ListTemplates(ctx context.Context, req *sirenv1beta1.ListTemplatesRequest) (*sirenv1beta1.ListTemplatesResponse, error) { templates, err := s.templateService.List(ctx, template.Filter{ Tag: req.GetTag(), diff --git a/internal/api/v1beta1/grpc_template_test.go b/internal/api/v1beta1/template_test.go similarity index 86% rename from internal/api/v1beta1/grpc_template_test.go rename to internal/api/v1beta1/template_test.go index fdb8f8df..8632e37f 100644 --- a/internal/api/v1beta1/grpc_template_test.go +++ b/internal/api/v1beta1/template_test.go @@ -6,6 +6,7 @@ import ( "github.com/odpf/salt/log" "github.com/odpf/siren/core/template" + "github.com/odpf/siren/internal/api" "github.com/odpf/siren/internal/api/v1beta1" "github.com/odpf/siren/internal/api/v1beta1/mocks" "github.com/odpf/siren/pkg/errors" @@ -18,7 +19,7 @@ func TestGRPCServer_ListTemplates(t *testing.T) { t.Run("should return list of all templates", func(t *testing.T) { mockedTemplateService := &mocks.TemplateService{} - dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), mockedTemplateService, nil, nil, nil, nil, nil, nil) + dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), &api.Deps{TemplateService: mockedTemplateService}) dummyReq := &sirenv1beta1.ListTemplatesRequest{} dummyResult := []template.Template{ @@ -52,7 +53,7 @@ func TestGRPCServer_ListTemplates(t *testing.T) { t.Run("should return list of all templates matching particular tag", func(t *testing.T) { mockedTemplateService := &mocks.TemplateService{} - dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), mockedTemplateService, nil, nil, nil, nil, nil, nil) + dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), &api.Deps{TemplateService: mockedTemplateService}) dummyReq := &sirenv1beta1.ListTemplatesRequest{ Tag: "foo", } @@ -88,7 +89,7 @@ func TestGRPCServer_ListTemplates(t *testing.T) { t.Run("should return error Internal if getting templates failed", func(t *testing.T) { mockedTemplateService := &mocks.TemplateService{} - dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), mockedTemplateService, nil, nil, nil, nil, nil, nil) + dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), &api.Deps{TemplateService: mockedTemplateService}) dummyReq := &sirenv1beta1.ListTemplatesRequest{ Tag: "foo", } @@ -104,7 +105,7 @@ func TestGRPCServer_ListTemplates(t *testing.T) { func TestGRPCServer_GetTemplate(t *testing.T) { t.Run("should return template by name", func(t *testing.T) { mockedTemplateService := &mocks.TemplateService{} - dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), mockedTemplateService, nil, nil, nil, nil, nil, nil) + dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), &api.Deps{TemplateService: mockedTemplateService}) dummyReq := &sirenv1beta1.GetTemplateRequest{ Name: "foo", } @@ -136,7 +137,7 @@ func TestGRPCServer_GetTemplate(t *testing.T) { t.Run("should return error Not Found if template does not exist", func(t *testing.T) { mockedTemplateService := &mocks.TemplateService{} - dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), mockedTemplateService, nil, nil, nil, nil, nil, nil) + dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), &api.Deps{TemplateService: mockedTemplateService}) dummyReq := &sirenv1beta1.GetTemplateRequest{ Name: "foo", } @@ -150,7 +151,7 @@ func TestGRPCServer_GetTemplate(t *testing.T) { t.Run("should return error Internal if getting template by name failed", func(t *testing.T) { mockedTemplateService := &mocks.TemplateService{} - dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), mockedTemplateService, nil, nil, nil, nil, nil, nil) + dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), &api.Deps{TemplateService: mockedTemplateService}) dummyReq := &sirenv1beta1.GetTemplateRequest{ Name: "foo", } @@ -195,7 +196,7 @@ func TestGRPCServer_UpsertTemplate(t *testing.T) { t.Run("should return template by name", func(t *testing.T) { mockedTemplateService := &mocks.TemplateService{} - dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), mockedTemplateService, nil, nil, nil, nil, nil, nil) + dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), &api.Deps{TemplateService: mockedTemplateService}) mockedTemplateService.EXPECT().Upsert(mock.AnythingOfType("*context.emptyCtx"), tmpl).Run(func(_a0 context.Context, _a1 *template.Template) { _a1.ID = uint64(1) @@ -208,7 +209,7 @@ func TestGRPCServer_UpsertTemplate(t *testing.T) { t.Run("should return error AlreadyExists if upsert template return err conflict", func(t *testing.T) { mockedTemplateService := &mocks.TemplateService{} - dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), mockedTemplateService, nil, nil, nil, nil, nil, nil) + dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), &api.Deps{TemplateService: mockedTemplateService}) mockedTemplateService.EXPECT().Upsert(mock.AnythingOfType("*context.emptyCtx"), tmpl).Return(errors.ErrConflict).Once() res, err := dummyGRPCServer.UpsertTemplate(context.Background(), dummyReq) assert.Nil(t, res) @@ -218,7 +219,7 @@ func TestGRPCServer_UpsertTemplate(t *testing.T) { t.Run("should return error Internal if upsert template failed", func(t *testing.T) { mockedTemplateService := &mocks.TemplateService{} - dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), mockedTemplateService, nil, nil, nil, nil, nil, nil) + dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), &api.Deps{TemplateService: mockedTemplateService}) mockedTemplateService.EXPECT().Upsert(mock.AnythingOfType("*context.emptyCtx"), tmpl).Return(errors.New("random error")).Once() res, err := dummyGRPCServer.UpsertTemplate(context.Background(), dummyReq) assert.Nil(t, res) @@ -230,7 +231,7 @@ func TestGRPCServer_UpsertTemplate(t *testing.T) { func TestGRPCServer_DeleteTemplate(t *testing.T) { t.Run("should delete template", func(t *testing.T) { mockedTemplateService := &mocks.TemplateService{} - dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), mockedTemplateService, nil, nil, nil, nil, nil, nil) + dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), &api.Deps{TemplateService: mockedTemplateService}) dummyReq := &sirenv1beta1.DeleteTemplateRequest{ Name: "foo", } @@ -245,7 +246,7 @@ func TestGRPCServer_DeleteTemplate(t *testing.T) { t.Run("should return error Internal if deleting template failed", func(t *testing.T) { mockedTemplateService := &mocks.TemplateService{} - dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), mockedTemplateService, nil, nil, nil, nil, nil, nil) + dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), &api.Deps{TemplateService: mockedTemplateService}) dummyReq := &sirenv1beta1.DeleteTemplateRequest{ Name: "foo", } @@ -268,7 +269,7 @@ func TestGRPCServer_RenderTemplate(t *testing.T) { t.Run("should render template", func(t *testing.T) { mockedTemplateService := &mocks.TemplateService{} - dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), mockedTemplateService, nil, nil, nil, nil, nil, nil) + dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), &api.Deps{TemplateService: mockedTemplateService}) mockedTemplateService.EXPECT().Render(mock.AnythingOfType("*context.emptyCtx"), "foo", dummyReq.GetVariables()). Return("random", nil).Once() @@ -280,7 +281,7 @@ func TestGRPCServer_RenderTemplate(t *testing.T) { t.Run("should return error Internal if rendering template failed", func(t *testing.T) { mockedTemplateService := &mocks.TemplateService{} - dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), mockedTemplateService, nil, nil, nil, nil, nil, nil) + dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), &api.Deps{TemplateService: mockedTemplateService}) mockedTemplateService.EXPECT().Render(mock.AnythingOfType("*context.emptyCtx"), "foo", dummyReq.GetVariables()). Return("", errors.New("random error")).Once() res, err := dummyGRPCServer.RenderTemplate(context.Background(), dummyReq) diff --git a/internal/api/v1beta1/grpc.go b/internal/api/v1beta1/v1beta1.go similarity index 53% rename from internal/api/v1beta1/grpc.go rename to internal/api/v1beta1/v1beta1.go index 4e62ee3c..c8a09ee7 100644 --- a/internal/api/v1beta1/grpc.go +++ b/internal/api/v1beta1/v1beta1.go @@ -3,6 +3,7 @@ package v1beta1 import ( "github.com/newrelic/go-agent/v3/newrelic" "github.com/odpf/salt/log" + "github.com/odpf/siren/internal/api" "github.com/odpf/siren/pkg/errors" sirenv1beta1 "github.com/odpf/siren/proto/odpf/siren/v1beta1" "google.golang.org/grpc/codes" @@ -13,34 +14,29 @@ type GRPCServer struct { newrelic *newrelic.Application logger log.Logger sirenv1beta1.UnimplementedSirenServiceServer - templateService TemplateService - ruleService RuleService - alertService AlertService - providerService ProviderService - namespaceService NamespaceService - receiverService ReceiverService - subscriptionService SubscriptionService + templateService api.TemplateService + ruleService api.RuleService + alertService api.AlertService + providerService api.ProviderService + namespaceService api.NamespaceService + receiverService api.ReceiverService + subscriptionService api.SubscriptionService } func NewGRPCServer( - nr *newrelic.Application, logger log.Logger, - templateService TemplateService, - ruleService RuleService, - alertService AlertService, - providerService ProviderService, - namespaceService NamespaceService, - receiverService ReceiverService, - subscriptionService SubscriptionService) *GRPCServer { + nr *newrelic.Application, + logger log.Logger, + apiDeps *api.Deps) *GRPCServer { return &GRPCServer{ newrelic: nr, logger: logger, - templateService: templateService, - ruleService: ruleService, - alertService: alertService, - providerService: providerService, - namespaceService: namespaceService, - receiverService: receiverService, - subscriptionService: subscriptionService, + templateService: apiDeps.TemplateService, + ruleService: apiDeps.RuleService, + alertService: apiDeps.AlertService, + providerService: apiDeps.ProviderService, + namespaceService: apiDeps.NamespaceService, + receiverService: apiDeps.ReceiverService, + subscriptionService: apiDeps.SubscriptionService, } } diff --git a/internal/server/server.go b/internal/server/server.go index e5801983..26696f52 100644 --- a/internal/server/server.go +++ b/internal/server/server.go @@ -17,6 +17,7 @@ import ( grpc_validator "github.com/grpc-ecosystem/go-grpc-middleware/validator" "github.com/odpf/salt/log" "github.com/odpf/salt/mux" + "github.com/odpf/siren/internal/api" "github.com/odpf/siren/internal/api/v1beta1" swagger "github.com/odpf/siren/proto" sirenv1beta1 "github.com/odpf/siren/proto/odpf/siren/v1beta1" @@ -41,17 +42,10 @@ func (cfg Config) addr() string { return fmt.Sprintf("%s:%d", cfg.Host, cfg.Port // RunServer runs the application server func RunServer( - ctx context.Context, c Config, logger log.Logger, nr *newrelic.Application, - templateService v1beta1.TemplateService, - ruleService v1beta1.RuleService, - alertService v1beta1.AlertService, - providerService v1beta1.ProviderService, - namespaceService v1beta1.NamespaceService, - receiverService v1beta1.ReceiverService, - subscriptionService v1beta1.SubscriptionService) error { + apiDeps *api.Deps) error { // TODO grpc should uses the same log loggerOpts := []grpc_zap.Option{grpc_zap.WithLevels(grpc_zap.DefaultCodeToLevel)} @@ -110,13 +104,7 @@ func RunServer( sirenServiceRPC := v1beta1.NewGRPCServer( nr, logger, - templateService, - ruleService, - alertService, - providerService, - namespaceService, - receiverService, - subscriptionService, + apiDeps, ) grpcServer.RegisterService(&sirenv1beta1.SirenService_ServiceDesc, sirenServiceRPC) grpcServer.RegisterService(&grpc_health_v1.Health_ServiceDesc, sirenServiceRPC) @@ -135,7 +123,7 @@ func RunServer( baseMux.Handle("/", httpGateway) logger.Info("server is running", "host", c.Host, "port", c.Port) - mux.Serve(ctx, c.addr(), + mux.Serve(runtimeCtx, c.addr(), mux.WithHTTP(&http.Server{Handler: baseMux}), mux.WithGRPC(grpcServer), mux.WithGracePeriod(defaultGracePeriod), diff --git a/pkg/zapgcp/encoder.go b/pkg/zapgcp/encoder.go new file mode 100644 index 00000000..8750b238 --- /dev/null +++ b/pkg/zapgcp/encoder.go @@ -0,0 +1,61 @@ +package zapgcp + +import ( + "time" + + "go.uber.org/zap/zapcore" +) + +// logLevelSeverity maps the Zap log levels to the correct level names as +// defined by Stackdriver. +// +// DEFAULT (0) The log entry has no assigned severity level. +// DEBUG (100) Debug or trace information. +// INFO (200) Routine information, such as ongoing status or performance. +// NOTICE (300) Normal but significant events, such as start up, shut down, or a configuration change. +// WARNING (400) Warning events might cause problems. +// ERROR (500) Error events are likely to cause problems. +// CRITICAL (600) Critical events cause more severe problems or outages. +// ALERT (700) A person must take an action immediately. +// EMERGENCY (800) One or more systems are unusable. +// +// See: https://cloud.google.com/logging/docs/reference/v2/rest/v2/LogEntry#LogSeverity +var logLevelSeverity = map[zapcore.Level]string{ + zapcore.DebugLevel: "DEBUG", + zapcore.InfoLevel: "INFO", + zapcore.WarnLevel: "WARNING", + zapcore.ErrorLevel: "ERROR", + zapcore.DPanicLevel: "CRITICAL", + zapcore.PanicLevel: "ALERT", + zapcore.FatalLevel: "EMERGENCY", +} + +// encoderConfig is the default encoder configuration, slightly tweaked to use +// the correct fields for Stackdriver to parse them. +var EncoderConfig = zapcore.EncoderConfig{ + // Set the keys used for each log entry. If any key is empty, that portion + // of the entry is omitted. + MessageKey: "message", + LevelKey: "severity", + TimeKey: "timestamp", + NameKey: "logger", + CallerKey: "caller", + StacktraceKey: "stacktrace", + LineEnding: zapcore.DefaultLineEnding, + EncodeLevel: EncodeLevel, + EncodeTime: RFC3339NanoTimeEncoder, + EncodeDuration: zapcore.SecondsDurationEncoder, + EncodeCaller: zapcore.ShortCallerEncoder, +} + +// EncodeLevel maps the internal Zap log level to the appropriate Stackdriver +// level. +func EncodeLevel(l zapcore.Level, enc zapcore.PrimitiveArrayEncoder) { + enc.AppendString(logLevelSeverity[l]) +} + +// RFC3339NanoTimeEncoder serializes a time.Time to an RFC3339Nano-formatted +// string with nanoseconds precision. +func RFC3339NanoTimeEncoder(t time.Time, enc zapcore.PrimitiveArrayEncoder) { + enc.AppendString(t.Format(time.RFC3339Nano)) +} diff --git a/pkg/zapgcp/service.go b/pkg/zapgcp/service.go new file mode 100644 index 00000000..340e7f76 --- /dev/null +++ b/pkg/zapgcp/service.go @@ -0,0 +1,36 @@ +package zapgcp + +import ( + "go.uber.org/zap" + "go.uber.org/zap/zapcore" +) + +const serviceContextKey = "serviceContext" + +// ServiceContext adds the correct service information adding the log line +// It is a required field if an error needs to be reported. +// +// see: https://cloud.google.com/error-reporting/reference/rest/v1beta1/ServiceContext +// see: https://cloud.google.com/error-reporting/docs/formatting-error-messages +func ServiceContext(name string) zap.Field { + return zap.Object(serviceContextKey, newServiceContext(name)) +} + +// serviceContext describes a running service that sends errors. +// Currently it only describes a service name. +type serviceContext struct { + Name string `json:"service"` +} + +// MarshalLogObject implements zapcore.ObjectMarshaller interface. +func (service_context serviceContext) MarshalLogObject(enc zapcore.ObjectEncoder) error { + enc.AddString("service", service_context.Name) + + return nil +} + +func newServiceContext(name string) *serviceContext { + return &serviceContext{ + Name: name, + } +}