From 0993740786b525edb41dfb5a9fefc6ba51e1b366 Mon Sep 17 00:00:00 2001 From: Abilash Menon Date: Tue, 16 Oct 2018 11:55:30 +0530 Subject: [PATCH] add reload metadata command to the cli (close #722) (#725) --- cli/commands/metadata.go | 6 +++ cli/commands/metadata_reload.go | 59 +++++++++++++++++++++++ cli/commands/metadata_reload_test.go | 34 +++++++++++++ cli/migrate/database/hasuradb/metadata.go | 26 ++++++++++ cli/migrate/database/metadata.go | 2 + cli/migrate/migrate.go | 5 ++ 6 files changed, 132 insertions(+) create mode 100644 cli/commands/metadata_reload.go create mode 100644 cli/commands/metadata_reload_test.go diff --git a/cli/commands/metadata.go b/cli/commands/metadata.go index c554ca27..ffc3dd6d 100644 --- a/cli/commands/metadata.go +++ b/cli/commands/metadata.go @@ -20,6 +20,7 @@ func NewMetadataCmd(ec *cli.ExecutionContext) *cobra.Command { metadataCmd.AddCommand( newMetadataExportCmd(ec), newMetadataResetCmd(ec), + newMetadataReloadCmd(ec), newMetadataApplyCmd(ec), ) return metadataCmd @@ -52,6 +53,11 @@ func executeMetadata(cmd string, t *migrate.Migrate, metadataPath string) error if err != nil { return errors.Wrap(err, "Cannot reset Metadata") } + case "reload": + err := t.ReloadMetadata() + if err != nil { + return errors.Wrap(err, "Cannot reload Metadata") + } case "apply": data, err := ioutil.ReadFile(metadataPath) if err != nil { diff --git a/cli/commands/metadata_reload.go b/cli/commands/metadata_reload.go new file mode 100644 index 00000000..c29371fd --- /dev/null +++ b/cli/commands/metadata_reload.go @@ -0,0 +1,59 @@ +package commands + +import ( + "github.com/hasura/graphql-engine/cli" + "github.com/pkg/errors" + "github.com/spf13/cobra" + "github.com/spf13/viper" +) + +func newMetadataReloadCmd(ec *cli.ExecutionContext) *cobra.Command { + v := viper.New() + opts := &metadataReloadOptions{ + EC: ec, + actionType: "reload", + } + + metadataReloadCmd := &cobra.Command{ + Use: "reload", + Short: "Reload Hasura GraphQL Engine metadata on the database", + Example: ` # Reload all the metadata information from database: + hasura metadata reload`, + SilenceUsage: true, + PreRunE: func(cmd *cobra.Command, args []string) error { + ec.Viper = v + return ec.Validate() + }, + RunE: func(cmd *cobra.Command, args []string) error { + return opts.run() + }, + } + + f := metadataReloadCmd.Flags() + f.String("endpoint", "", "http(s) endpoint for Hasura GraphQL Engine") + f.String("access-key", "", "access key for Hasura GraphQL Engine") + + // need to create a new viper because https://github.com/spf13/viper/issues/233 + v.BindPFlag("endpoint", f.Lookup("endpoint")) + v.BindPFlag("access_key", f.Lookup("access-key")) + + return metadataReloadCmd +} + +type metadataReloadOptions struct { + EC *cli.ExecutionContext + + actionType string +} + +func (o *metadataReloadOptions) run() error { + migrateDrv, err := newMigrate(o.EC.MigrationDir, o.EC.Config.ParsedEndpoint, o.EC.Config.AccessKey, o.EC.Logger) + if err != nil { + return err + } + err = executeMetadata(o.actionType, migrateDrv, o.EC.MetadataFile) + if err != nil { + return errors.Wrap(err, "Cannot reload metadata") + } + return nil +} diff --git a/cli/commands/metadata_reload_test.go b/cli/commands/metadata_reload_test.go new file mode 100644 index 00000000..23705389 --- /dev/null +++ b/cli/commands/metadata_reload_test.go @@ -0,0 +1,34 @@ +package commands + +import ( + "net/url" + "os" + "testing" + "time" + + "github.com/briandowns/spinner" + "github.com/hasura/graphql-engine/cli" + "github.com/sirupsen/logrus/hooks/test" +) + +func testMetadataReload(t *testing.T, metadataFile string, endpoint *url.URL) { + logger, _ := test.NewNullLogger() + opts := &metadataReloadOptions{ + EC: &cli.ExecutionContext{ + Logger: logger, + Spinner: spinner.New(spinner.CharSets[7], 100*time.Millisecond), + MetadataFile: metadataFile, + Config: &cli.HasuraGraphQLConfig{ + Endpoint: endpoint.String(), + AccessKey: os.Getenv("HASURA_GRAPHQL_TEST_ACCESS_KEY"), + ParsedEndpoint: endpoint, + }, + }, + actionType: "reload", + } + + err := opts.run() + if err != nil { + t.Fatalf("failed reloading metadata: %v", err) + } +} diff --git a/cli/migrate/database/hasuradb/metadata.go b/cli/migrate/database/hasuradb/metadata.go index 715074ff..5c29d3d7 100644 --- a/cli/migrate/database/hasuradb/metadata.go +++ b/cli/migrate/database/hasuradb/metadata.go @@ -63,6 +63,32 @@ func (h *HasuraDB) ResetMetadata() error { return nil } +// ReloadMetadata - Reload Hasura GraphQL Engine metadata on the database +func (h *HasuraDB) ReloadMetadata() error { + query := HasuraInterfaceQuery{ + Type: "reload_metadata", + Args: HasuraArgs{}, + } + + resp, body, err := h.sendQuery(query) + if err != nil { + h.logger.Debug(err) + return err + } + h.logger.Debug("response: ", string(body)) + + var horror HasuraError + if resp.StatusCode != http.StatusOK { + err = json.Unmarshal(body, &horror) + if err != nil { + h.logger.Debug(err) + return err + } + return horror.Error(h.config.isCMD) + } + return nil +} + func (h *HasuraDB) ApplyMetadata(data interface{}) error { query := HasuraInterfaceBulk{ Type: "bulk", diff --git a/cli/migrate/database/metadata.go b/cli/migrate/database/metadata.go index eee212e1..598d362c 100644 --- a/cli/migrate/database/metadata.go +++ b/cli/migrate/database/metadata.go @@ -5,6 +5,8 @@ type MetadataDriver interface { ResetMetadata() error + ReloadMetadata() error + ApplyMetadata(data interface{}) error Query(data []interface{}) error diff --git a/cli/migrate/migrate.go b/cli/migrate/migrate.go index ca75e363..73abe5e3 100644 --- a/cli/migrate/migrate.go +++ b/cli/migrate/migrate.go @@ -311,6 +311,11 @@ func (m *Migrate) ResetMetadata() error { return m.databaseDrv.ResetMetadata() } +// ReloadMetadata - Reload metadata on the database +func (m *Migrate) ReloadMetadata() error { + return m.databaseDrv.ReloadMetadata() +} + func (m *Migrate) ApplyMetadata(data interface{}) error { return m.databaseDrv.ApplyMetadata(data) }