diff --git a/cli/commands/init.go b/cli/commands/init.go index 91552005d34c0..e6ae76ca92715 100644 --- a/cli/commands/init.go +++ b/cli/commands/init.go @@ -7,6 +7,8 @@ import ( "path/filepath" "strings" + crontriggers "github.com/hasura/graphql-engine/cli/metadata/cron_triggers" + "github.com/hasura/graphql-engine/cli/metadata/actions" "github.com/hasura/graphql-engine/cli/metadata/actions/types" "github.com/hasura/graphql-engine/cli/metadata/allowlist" @@ -251,6 +253,7 @@ func (o *InitOptions) createFiles() error { plugins = append(plugins, allowlist.New(o.EC, o.EC.MetadataDir)) plugins = append(plugins, remoteschemas.New(o.EC, o.EC.MetadataDir)) plugins = append(plugins, actions.New(o.EC, o.EC.MetadataDir)) + plugins = append(plugins, crontriggers.New(o.EC, o.EC.MetadataDir)) for _, plg := range plugins { err := plg.CreateFiles() if err != nil { diff --git a/cli/integration_test/v2/metadata/latest/1_metadata/cron_triggers.yaml b/cli/integration_test/v2/metadata/latest/1_metadata/cron_triggers.yaml new file mode 100644 index 0000000000000..fe51488c7066f --- /dev/null +++ b/cli/integration_test/v2/metadata/latest/1_metadata/cron_triggers.yaml @@ -0,0 +1 @@ +[] diff --git a/cli/integration_test/v2/metadata/latest/2_metadata/cron_triggers.yaml b/cli/integration_test/v2/metadata/latest/2_metadata/cron_triggers.yaml new file mode 100644 index 0000000000000..fe51488c7066f --- /dev/null +++ b/cli/integration_test/v2/metadata/latest/2_metadata/cron_triggers.yaml @@ -0,0 +1 @@ +[] diff --git a/cli/metadata/cron_triggers/cron_triggers.go b/cli/metadata/cron_triggers/cron_triggers.go new file mode 100644 index 0000000000000..9b5b1e9ca75e8 --- /dev/null +++ b/cli/metadata/cron_triggers/cron_triggers.go @@ -0,0 +1,100 @@ +package crontriggers + +import ( + "io/ioutil" + "path/filepath" + + "github.com/hasura/graphql-engine/cli/version" + + "github.com/hasura/graphql-engine/cli" + "github.com/sirupsen/logrus" + "gopkg.in/yaml.v2" +) + +const ( + fileName string = "cron_triggers.yaml" + metadataKey = "cron_triggers" +) + +type CronTriggers struct { + MetadataDir string + + logger *logrus.Logger + serverFeatureFlags *version.ServerFeatureFlags +} + +func New(ec *cli.ExecutionContext, baseDir string) *CronTriggers { + return &CronTriggers{ + MetadataDir: baseDir, + logger: ec.Logger, + serverFeatureFlags: ec.Version.ServerFeatureFlags, + } +} + +func (c *CronTriggers) Validate() error { + return nil +} + +func (c *CronTriggers) CreateFiles() error { + v := make([]interface{}, 0) + data, err := yaml.Marshal(v) + if err != nil { + return err + } + err = ioutil.WriteFile(filepath.Join(c.MetadataDir, fileName), data, 0644) + if err != nil { + return err + } + return nil +} + +func (c *CronTriggers) Build(metadata *yaml.MapSlice) error { + if !c.serverFeatureFlags.HasCronTriggers { + c.logger.WithField("metadata_plugin", "cron_triggers").Warnf("Skipping building %s", fileName) + return nil + } + data, err := ioutil.ReadFile(filepath.Join(c.MetadataDir, fileName)) + if err != nil { + return err + } + + item := yaml.MapItem{ + Key: metadataKey, + Value: []yaml.MapSlice{}, + } + err = yaml.Unmarshal(data, &item.Value) + if err != nil { + return err + } + *metadata = append(*metadata, item) + return nil +} + +func (c *CronTriggers) Export(metadata yaml.MapSlice) (map[string][]byte, error) { + if !c.serverFeatureFlags.HasCronTriggers { + c.logger.Debugf("Skipping creating %s", fileName) + return make(map[string][]byte), nil + } + var cronTriggers interface{} + for _, item := range metadata { + k, ok := item.Key.(string) + if !ok || k != metadataKey { + continue + } + cronTriggers = item.Value + } + if cronTriggers == nil { + cronTriggers = make([]interface{}, 0) + } + data, err := yaml.Marshal(cronTriggers) + if err != nil { + return nil, err + } + return map[string][]byte{ + filepath.Join(c.MetadataDir, fileName): data, + }, nil +} + +func (c *CronTriggers) Name() string { + return metadataKey +} diff --git a/cli/migrate/util.go b/cli/migrate/util.go index 6966e78a1e705..76a5e755fd58f 100644 --- a/cli/migrate/util.go +++ b/cli/migrate/util.go @@ -9,6 +9,8 @@ import ( "strings" "time" + crontriggers "github.com/hasura/graphql-engine/cli/metadata/cron_triggers" + "github.com/hasura/graphql-engine/cli/metadata" "github.com/hasura/graphql-engine/cli/metadata/actions" "github.com/hasura/graphql-engine/cli/metadata/allowlist" @@ -172,6 +174,7 @@ func SetMetadataPluginsWithDir(ec *cli.ExecutionContext, drv *Migrate, dir ...st plugins = append(plugins, allowlist.New(ec, metadataDir)) plugins = append(plugins, remoteschemas.New(ec, metadataDir)) plugins = append(plugins, actions.New(ec, metadataDir)) + plugins = append(plugins, crontriggers.New(ec, metadataDir)) } else { plugins = append(plugins, metadata.New(ec, ec.MigrationDir)) } diff --git a/cli/version/feature_flags.go b/cli/version/feature_flags.go index af07555a03e73..d03c7fed8ddd1 100644 --- a/cli/version/feature_flags.go +++ b/cli/version/feature_flags.go @@ -10,11 +10,13 @@ import ( type ServerFeatureFlags struct { HasAccessKey bool - HasAction bool + HasAction bool + HasCronTriggers bool } const adminSecretVersion = "v1.0.0-alpha38" const actionVersion = "v1.2.0-beta.1" +const cronTriggersVersion = "v1.3.0-beta.1" // GetServerFeatureFlags returns the feature flags for server. func (v *Version) GetServerFeatureFlags() error { @@ -38,6 +40,14 @@ func (v *Version) GetServerFeatureFlags() error { } // check the current version with the constraint flags.HasAction = actionConstraint.Check(v.ServerSemver) + + // cronTriggers Constraint + cronTriggersConstraint, err := semver.NewConstraint(">= " + cronTriggersVersion) + if err != nil { + return errors.Wrap(err, "building cron triggers constraint failed") + } + // check the current version with the constraint + flags.HasCronTriggers = cronTriggersConstraint.Check(v.ServerSemver) } v.ServerFeatureFlags = flags return nil diff --git a/scripts/cli-migrations/v2/test/metadata/cron_triggers.yaml b/scripts/cli-migrations/v2/test/metadata/cron_triggers.yaml new file mode 100644 index 0000000000000..fe51488c7066f --- /dev/null +++ b/scripts/cli-migrations/v2/test/metadata/cron_triggers.yaml @@ -0,0 +1 @@ +[]