Merge branch 'master' into issue-3969

This commit is contained in:
Shahidh K Muhammed 2020-03-26 11:13:03 +05:30
commit 4ee67bf7a1
11 changed files with 61 additions and 15 deletions

View File

@ -29,6 +29,8 @@
### Other changes ### Other changes
- cli: fix init command to generate correct config.yaml (close #4036)
- cli: fix command path not being set in telemetry data (close #4127)
- fix deploy script to upload github release assets - fix deploy script to upload github release assets
- cli: fix parse error returned on console api (close #4126) - cli: fix parse error returned on console api (close #4126)
- console and cli-ext: fix parsing of wrapped types in SDL - console and cli-ext: fix parsing of wrapped types in SDL

View File

@ -8,10 +8,12 @@
package cli package cli
import ( import (
"fmt"
"io/ioutil" "io/ioutil"
"net/url" "net/url"
"os" "os"
"path/filepath" "path/filepath"
"strconv"
"strings" "strings"
"time" "time"
@ -59,6 +61,42 @@ const (
V2 V2
) )
// ErrInvalidConfigVersion - if the config version is not valid
var ErrInvalidConfigVersion error = fmt.Errorf("invalid config version")
// NewConfigVersionValue returns ConfigVersion set with default value
func NewConfigVersionValue(val ConfigVersion, p *ConfigVersion) *ConfigVersion {
*p = val
return p
}
// Set sets the value of the named command-line flag.
func (c *ConfigVersion) Set(s string) error {
v, err := strconv.ParseInt(s, 0, 64)
*c = ConfigVersion(v)
if err != nil {
return err
}
if !c.IsValid() {
return ErrInvalidConfigVersion
}
return nil
}
// Type returns a string that uniquely represents this flag's type.
func (c *ConfigVersion) Type() string {
return "int"
}
func (c *ConfigVersion) String() string {
return strconv.Itoa(int(*c))
}
// IsValid returns if its a valid config version
func (c ConfigVersion) IsValid() bool {
return c != 0 && c <= V2
}
// ServerConfig has the config values required to contact the server // ServerConfig has the config values required to contact the server
type ServerConfig struct { type ServerConfig struct {
// Endpoint for the GraphQL Engine // Endpoint for the GraphQL Engine
@ -84,17 +122,17 @@ func (s *ServerConfig) ParseEndpoint() error {
// Config represents configuration required for the CLI to function // Config represents configuration required for the CLI to function
type Config struct { type Config struct {
// Version of the config. // Version of the config.
Version ConfigVersion `yaml:"version"` Version ConfigVersion `yaml:"version,omitempty"`
// ServerConfig to be used by CLI to contact server. // ServerConfig to be used by CLI to contact server.
ServerConfig `yaml:",inline"` ServerConfig `yaml:",inline"`
// MetadataDirectory defines the directory where the metadata files were stored. // MetadataDirectory defines the directory where the metadata files were stored.
MetadataDirectory string `yaml:"metadata_directory"` MetadataDirectory string `yaml:"metadata_directory,omitempty"`
// MigrationsDirectory defines the directory where the migration files were stored. // MigrationsDirectory defines the directory where the migration files were stored.
MigrationsDirectory string `yaml:"migrations_directory,omitempty"` MigrationsDirectory string `yaml:"migrations_directory,omitempty"`
// ActionConfig defines the config required to create or generate codegen for an action. // ActionConfig defines the config required to create or generate codegen for an action.
ActionConfig types.ActionExecutionConfig `yaml:"actions"` ActionConfig *types.ActionExecutionConfig `yaml:"actions,omitempty"`
} }
// ExecutionContext contains various contextual information required by the cli // ExecutionContext contains various contextual information required by the cli
@ -427,7 +465,7 @@ func (ec *ExecutionContext) readConfig() error {
}, },
MetadataDirectory: v.GetString("metadata_directory"), MetadataDirectory: v.GetString("metadata_directory"),
MigrationsDirectory: v.GetString("migrations_directory"), MigrationsDirectory: v.GetString("migrations_directory"),
ActionConfig: types.ActionExecutionConfig{ ActionConfig: &types.ActionExecutionConfig{
Kind: v.GetString("actions.kind"), Kind: v.GetString("actions.kind"),
HandlerWebhookBaseURL: v.GetString("actions.handler_webhook_baseurl"), HandlerWebhookBaseURL: v.GetString("actions.handler_webhook_baseurl"),
Codegen: &types.CodegenExecutionConfig{ Codegen: &types.CodegenExecutionConfig{
@ -437,6 +475,9 @@ func (ec *ExecutionContext) readConfig() error {
}, },
}, },
} }
if !ec.Config.Version.IsValid() {
return ErrInvalidConfigVersion
}
return ec.Config.ServerConfig.ParseEndpoint() return ec.Config.ServerConfig.ParseEndpoint()
} }

View File

@ -20,6 +20,7 @@ func NewActionsCmd(ec *cli.ExecutionContext) *cobra.Command {
Short: "Manage actions on hasura", Short: "Manage actions on hasura",
SilenceUsage: true, SilenceUsage: true,
PersistentPreRunE: func(cmd *cobra.Command, args []string) error { PersistentPreRunE: func(cmd *cobra.Command, args []string) error {
cmd.Root().PersistentPreRun(cmd, args)
ec.Viper = v ec.Viper = v
err := ec.Prepare() err := ec.Prepare()
if err != nil { if err != nil {

View File

@ -65,7 +65,7 @@ func NewInitCmd(ec *cli.ExecutionContext) *cobra.Command {
} }
f := initCmd.Flags() f := initCmd.Flags()
f.StringVar(&opts.Version, "version", "2", "config version to be used") f.Var(cli.NewConfigVersionValue(cli.V2, &opts.Version), "version", "config version to be used")
f.StringVar(&opts.InitDir, "directory", "", "name of directory where files will be created") f.StringVar(&opts.InitDir, "directory", "", "name of directory where files will be created")
f.StringVar(&opts.MetadataDir, "metadata-directory", "metadata", "name of directory where metadata files will be created") f.StringVar(&opts.MetadataDir, "metadata-directory", "metadata", "name of directory where metadata files will be created")
f.StringVar(&opts.Endpoint, "endpoint", "", "http(s) endpoint for Hasura GraphQL Engine") f.StringVar(&opts.Endpoint, "endpoint", "", "http(s) endpoint for Hasura GraphQL Engine")
@ -83,7 +83,7 @@ func NewInitCmd(ec *cli.ExecutionContext) *cobra.Command {
type InitOptions struct { type InitOptions struct {
EC *cli.ExecutionContext EC *cli.ExecutionContext
Version string Version cli.ConfigVersion
Endpoint string Endpoint string
AdminSecret string AdminSecret string
InitDir string InitDir string
@ -163,7 +163,7 @@ func (o *InitOptions) createFiles() error {
} }
// set config object // set config object
var config *cli.Config var config *cli.Config
if o.Version == "1" { if o.Version == cli.V1 {
config = &cli.Config{ config = &cli.Config{
ServerConfig: cli.ServerConfig{ ServerConfig: cli.ServerConfig{
Endpoint: "http://localhost:8080", Endpoint: "http://localhost:8080",
@ -171,12 +171,12 @@ func (o *InitOptions) createFiles() error {
} }
} else { } else {
config = &cli.Config{ config = &cli.Config{
Version: cli.V2, Version: o.Version,
ServerConfig: cli.ServerConfig{ ServerConfig: cli.ServerConfig{
Endpoint: "http://localhost:8080", Endpoint: "http://localhost:8080",
}, },
MetadataDirectory: o.MetadataDir, MetadataDirectory: o.MetadataDir,
ActionConfig: types.ActionExecutionConfig{ ActionConfig: &types.ActionExecutionConfig{
Kind: o.ActionKind, Kind: o.ActionKind,
HandlerWebhookBaseURL: o.ActionHandler, HandlerWebhookBaseURL: o.ActionHandler,
}, },

View File

@ -16,6 +16,7 @@ func NewMetadataCmd(ec *cli.ExecutionContext) *cobra.Command {
Aliases: []string{"md"}, Aliases: []string{"md"},
Short: "Manage Hasura GraphQL Engine metadata saved in the database", Short: "Manage Hasura GraphQL Engine metadata saved in the database",
PersistentPreRunE: func(cmd *cobra.Command, args []string) error { PersistentPreRunE: func(cmd *cobra.Command, args []string) error {
cmd.Root().PersistentPreRun(cmd, args)
ec.Viper = v ec.Viper = v
err := ec.Prepare() err := ec.Prepare()
if err != nil { if err != nil {

View File

@ -36,6 +36,7 @@ func NewMigrateCmd(ec *cli.ExecutionContext) *cobra.Command {
Short: "Manage migrations on the database", Short: "Manage migrations on the database",
SilenceUsage: true, SilenceUsage: true,
PersistentPreRunE: func(cmd *cobra.Command, args []string) error { PersistentPreRunE: func(cmd *cobra.Command, args []string) error {
cmd.Root().PersistentPreRun(cmd, args)
ec.Viper = v ec.Viper = v
err := ec.Prepare() err := ec.Prepare()
if err != nil { if err != nil {

View File

@ -48,6 +48,7 @@ https://github.com/hasura/cli-plugins-index
Please open pull requests against this repo to add new plugins`, Please open pull requests against this repo to add new plugins`,
SilenceUsage: true, SilenceUsage: true,
PersistentPreRunE: func(cmd *cobra.Command, args []string) error { PersistentPreRunE: func(cmd *cobra.Command, args []string) error {
cmd.Root().PersistentPreRun(cmd, args)
return ec.PluginsConfig.Repo.EnsureCloned() return ec.PluginsConfig.Repo.EnsureCloned()
}, },
} }

View File

@ -34,8 +34,6 @@ var rootCmd = &cobra.Command{
SilenceUsage: true, SilenceUsage: true,
SilenceErrors: true, SilenceErrors: true,
PersistentPreRun: func(cmd *cobra.Command, args []string) { PersistentPreRun: func(cmd *cobra.Command, args []string) {
ec.Telemetry.Command = cmd.CommandPath()
if cmd.Use != updateCLICmdUse { if cmd.Use != updateCLICmdUse {
if update.ShouldRunCheck(ec.LastUpdateCheckFile) && ec.GlobalConfig.ShowUpdateNotification && !ec.SkipUpdateCheck { if update.ShouldRunCheck(ec.LastUpdateCheckFile) && ec.GlobalConfig.ShowUpdateNotification && !ec.SkipUpdateCheck {
u := &updateOptions{ u := &updateOptions{
@ -116,10 +114,11 @@ func Execute() error {
if err != nil { if err != nil {
return errors.Wrap(err, "preparing execution context failed") return errors.Wrap(err, "preparing execution context failed")
} }
err = NewDefaultHasuraCommand().Execute() execCmd, err := NewDefaultHasuraCommand().ExecuteC()
if err != nil { if err != nil {
ec.Telemetry.IsError = true ec.Telemetry.IsError = true
} }
ec.Telemetry.Command = execCmd.CommandPath()
ec.Telemetry.Beam() ec.Telemetry.Beam()
if ec.Spinner != nil { if ec.Spinner != nil {
ec.Spinner.Stop() ec.Spinner.Stop()

View File

@ -24,7 +24,7 @@ func TestInitCmd(t *testing.T, ec *cli.ExecutionContext, initDir string) {
}{ }{
{"only-init-dir", &commands.InitOptions{ {"only-init-dir", &commands.InitOptions{
EC: ec, EC: ec,
Version: "1", Version: cli.V1,
Endpoint: os.Getenv("HASURA_GRAPHQL_TEST_ENDPOINT"), Endpoint: os.Getenv("HASURA_GRAPHQL_TEST_ENDPOINT"),
AdminSecret: os.Getenv("HASURA_GRAPHQL_TEST_ADMIN_SECRET"), AdminSecret: os.Getenv("HASURA_GRAPHQL_TEST_ADMIN_SECRET"),
InitDir: filepath.Join(os.TempDir(), "hasura-cli-test-"+strconv.Itoa(rand.Intn(1000))), InitDir: filepath.Join(os.TempDir(), "hasura-cli-test-"+strconv.Itoa(rand.Intn(1000))),

View File

@ -24,7 +24,7 @@ func TestInitCmd(t *testing.T, ec *cli.ExecutionContext, initDir string) {
}{ }{
{"only-init-dir", &commands.InitOptions{ {"only-init-dir", &commands.InitOptions{
EC: ec, EC: ec,
Version: "2", Version: cli.V2,
Endpoint: os.Getenv("HASURA_GRAPHQL_TEST_ENDPOINT"), Endpoint: os.Getenv("HASURA_GRAPHQL_TEST_ENDPOINT"),
AdminSecret: os.Getenv("HASURA_GRAPHQL_TEST_ADMIN_SECRET"), AdminSecret: os.Getenv("HASURA_GRAPHQL_TEST_ADMIN_SECRET"),
InitDir: filepath.Join(os.TempDir(), "hasura-cli-test-"+strconv.Itoa(rand.Intn(1000))), InitDir: filepath.Join(os.TempDir(), "hasura-cli-test-"+strconv.Itoa(rand.Intn(1000))),

View File

@ -29,7 +29,7 @@ const (
type ActionConfig struct { type ActionConfig struct {
MetadataDir string MetadataDir string
ActionConfig types.ActionExecutionConfig ActionConfig *types.ActionExecutionConfig
serverFeatureFlags *version.ServerFeatureFlags serverFeatureFlags *version.ServerFeatureFlags
pluginsCfg *plugins.Config pluginsCfg *plugins.Config
cliExtensionConfig *cliextension.Config cliExtensionConfig *cliextension.Config