add reload metadata command to the cli (close #722) (#725)

This commit is contained in:
Abilash Menon
2018-10-16 11:55:30 +05:30
committed by Shahidh K Muhammed
parent 421606f124
commit 0993740786
6 changed files with 132 additions and 0 deletions

View File

@@ -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 {

View File

@@ -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
}

View File

@@ -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)
}
}

View File

@@ -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",

View File

@@ -5,6 +5,8 @@ type MetadataDriver interface {
ResetMetadata() error
ReloadMetadata() error
ApplyMetadata(data interface{}) error
Query(data []interface{}) error

View File

@@ -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)
}