diff --git a/compose/compose.go b/compose/compose.go index d9543f369..a29930169 100644 --- a/compose/compose.go +++ b/compose/compose.go @@ -36,7 +36,8 @@ func Configure() *cli.Config { servicesInitialized = true cli.HandleError(service.Init(ctx, c.Log, service.Config{ - Storage: *c.StorageOpt, + Storage: *c.StorageOpt, + ScriptRunner: *c.ScriptRunner, })) }, diff --git a/compose/internal/service/record.go b/compose/internal/service/record.go index ef3c38654..95e666295 100644 --- a/compose/internal/service/record.go +++ b/compose/internal/service/record.go @@ -22,7 +22,7 @@ type ( logger *zap.Logger ac recordAccessController - sr *scriptRunner + sr RecordScriptRunner recordRepo repository.RecordRepository moduleRepo repository.ModuleRepository @@ -41,6 +41,10 @@ type ( CanUpdateRecordValue(context.Context, *types.ModuleField) bool } + RecordScriptRunner interface { + Record(context.Context, Runnable, *types.Namespace, *types.Module, *types.Record) (*types.Record, error) + } + RecordService interface { With(ctx context.Context) RecordService diff --git a/compose/internal/service/script_runner.go b/compose/internal/service/script_runner.go index e39325383..037e44b12 100644 --- a/compose/internal/service/script_runner.go +++ b/compose/internal/service/script_runner.go @@ -13,6 +13,7 @@ import ( "github.com/cortezaproject/corteza-server/compose/proto" "github.com/cortezaproject/corteza-server/compose/types" "github.com/cortezaproject/corteza-server/internal/auth" + "github.com/cortezaproject/corteza-server/pkg/cli/options" ) // Script runner provides an interface to corteza-corredor (Spanish for runner) service @@ -25,7 +26,7 @@ import ( type ( scriptRunner struct { - addr string + c options.ScriptRunnerOpt logger *zap.Logger conn *grpc.ClientConn client proto.ScriptRunnerClient @@ -38,27 +39,40 @@ type ( IsCritical() bool GetRunnerID() uint64 } + + ScriptRunnerService interface { + Close() error + Namespace(context.Context, Runnable, *types.Namespace) (*types.Namespace, error) + Module(context.Context, Runnable, *types.Namespace, *types.Module) (*types.Module, error) + Record(context.Context, Runnable, *types.Namespace, *types.Module, *types.Record) (*types.Record, error) + } ) -func ScriptRunner(addr string) *scriptRunner { - return &scriptRunner{ - addr: addr, +// @todo move to opt so all services can use it +func ScriptRunner(c options.ScriptRunnerOpt) (*scriptRunner, error) { + var svc = &scriptRunner{ + c: c, logger: DefaultLogger.Named("script-runner"), jwtEncoder: auth.DefaultJwtHandler, } + + return svc, svc.connect() } -func (svc *scriptRunner) Connect() (err error) { - if svc.conn != nil { - return nil - } - +func (svc *scriptRunner) connect() (err error) { + // @todo wire grpc logger with zap logger grpclog.SetLoggerV2(grpclog.NewLoggerV2WithVerbosity(os.Stdout, os.Stdout, os.Stdout, 0)) - svc.conn, err = grpc.Dial( - svc.addr, + var dopts = []grpc.DialOption{ + // @todo insecure? grpc.WithInsecure(), - grpc.WithBackoffMaxDelay(time.Second)) + } + + if svc.c.MaxBackoffDelay > 0 { + dopts = append(dopts, grpc.WithBackoffMaxDelay(svc.c.MaxBackoffDelay)) + } + + svc.conn, err = grpc.Dial(svc.c.Addr, dopts...) if err != nil { return diff --git a/compose/internal/service/service.go b/compose/internal/service/service.go index bb57a1d6d..15f001a72 100644 --- a/compose/internal/service/service.go +++ b/compose/internal/service/service.go @@ -19,7 +19,8 @@ type ( } Config struct { - Storage options.StorageOpt + Storage options.StorageOpt + ScriptRunner options.ScriptRunnerOpt } ) @@ -39,7 +40,7 @@ var ( DefaultAttachment AttachmentService DefaultNamespace NamespaceService - DefaultScriptRunner *scriptRunner // @todo interface + DefaultScriptRunner ScriptRunnerService ) func Init(ctx context.Context, log *zap.Logger, c Config) (err error) { @@ -58,8 +59,7 @@ func Init(ctx context.Context, log *zap.Logger, c Config) (err error) { DefaultAccessControl = AccessControl(DefaultPermissions) - DefaultScriptRunner = ScriptRunner("localhost:50051") - err = DefaultScriptRunner.Connect() + DefaultScriptRunner, err = ScriptRunner(c.ScriptRunner) if err != nil { return } diff --git a/pkg/cli/options/script_runner.go b/pkg/cli/options/script_runner.go index e1ab81e51..572560ac0 100644 --- a/pkg/cli/options/script_runner.go +++ b/pkg/cli/options/script_runner.go @@ -1,14 +1,20 @@ package options +import ( + "time" +) + type ( - StorageOpt struct { - Path string `env:"STORAGE_PATH"` + ScriptRunnerOpt struct { + Addr string `env:"SCRIPT_RUNNER_ADDR"` + MaxBackoffDelay time.Duration `env:"SCRIPT_RUNNER_MAX_BACKOFF_DELAY"` } ) -func Storage(pfix string) (o *StorageOpt) { - o = &StorageOpt{ - Path: "var/store", +func ScriptRunner(pfix string) (o *ScriptRunnerOpt) { + o = &ScriptRunnerOpt{ + Addr: "corredor:80", + MaxBackoffDelay: time.Minute, } fill(o, pfix) diff --git a/pkg/cli/runner.go b/pkg/cli/runner.go index c584f57f8..b8796c9d2 100644 --- a/pkg/cli/runner.go +++ b/pkg/cli/runner.go @@ -50,6 +50,7 @@ type ( ProvisionOpt *options.ProvisionOpt SentryOpt *options.SentryOpt StorageOpt *options.StorageOpt + ScriptRunner *options.ScriptRunnerOpt // DB Connection name, defaults to ServiceName DatabaseName string @@ -188,6 +189,7 @@ func (c *Config) Init() { c.ProvisionOpt = options.Provision(c.ServiceName) c.SentryOpt = options.Sentry(c.EnvPrefix) c.StorageOpt = options.Storage(c.EnvPrefix) + c.ScriptRunner = options.ScriptRunner(c.EnvPrefix) if c.RootCommandDBSetup == nil { c.RootCommandDBSetup = Runners{func(ctx context.Context, cmd *cobra.Command, c *Config) (err error) {