mirror of
https://github.com/hasura/graphql-engine.git
synced 2024-12-15 17:31:56 +03:00
1128753069
[DOCS-520]: https://hasurahq.atlassian.net/browse/DOCS-520?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ [DOCS-520]: https://hasurahq.atlassian.net/browse/DOCS-520?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ PR-URL: https://github.com/hasura/graphql-engine-mono/pull/7419 GitOrigin-RevId: 52e8e54bf7068ee91fce19831db99d7a24afb00c
94 lines
3.2 KiB
Go
94 lines
3.2 KiB
Go
package commands
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"github.com/hasura/graphql-engine/cli/v2"
|
|
"github.com/hasura/graphql-engine/cli/v2/internal/errors"
|
|
"github.com/spf13/cobra"
|
|
)
|
|
|
|
func newMetadataApplyCmd(ec *cli.ExecutionContext) *cobra.Command {
|
|
opts := &MetadataApplyOptions{
|
|
EC: ec,
|
|
}
|
|
|
|
metadataApplyCmd := &cobra.Command{
|
|
Use: "apply",
|
|
Short: "Apply Hasura Metadata on a database",
|
|
Long: `This command applies the Hasura GraphQL Engine Metadata saved in the database. You can use it to apply Hasura Metadata from one HGE server instance to another, such as when moving between development environments.
|
|
|
|
Further reading:
|
|
- https://hasura.io/docs/latest/migrations-metadata-seeds/manage-metadata/
|
|
- https://hasura.io/docs/latest/migrations-metadata-seeds/metadata-format/
|
|
`,
|
|
Example: ` # Apply Hasura GraphQL engine metadata present in metadata.[yaml|json] file:
|
|
hasura metadata apply
|
|
|
|
# Use with admin secret:
|
|
hasura metadata apply --admin-secret "<admin-secret>"
|
|
|
|
# Apply metadata to an instance specified by the flag:
|
|
hasura metadata apply --endpoint "<endpoint>"
|
|
|
|
# Prevent inconsistent metadata from getting applied:
|
|
hasura metadata apply --disallow-inconsistent-metadata`,
|
|
SilenceUsage: true,
|
|
RunE: func(cmd *cobra.Command, args []string) error {
|
|
op := genOpName(cmd, "RunE")
|
|
if opts.FromFile {
|
|
return errors.E(op, fmt.Errorf("use of deprecated flag"))
|
|
}
|
|
if !opts.DryRun && len(opts.rawOutput) == 0 {
|
|
ec.Spin("Applying metadata...")
|
|
}
|
|
err := opts.Run()
|
|
ec.Spinner.Stop()
|
|
if err != nil {
|
|
return errors.E(op, err)
|
|
}
|
|
if len(opts.rawOutput) <= 0 && !opts.DryRun {
|
|
opts.EC.Logger.Info("Metadata applied")
|
|
}
|
|
return nil
|
|
},
|
|
}
|
|
|
|
f := metadataApplyCmd.Flags()
|
|
|
|
// deprecated flag
|
|
f.BoolVar(&opts.FromFile, "from-file", false, "apply metadata from migrations/metadata.[yaml|json]")
|
|
if err := f.MarkDeprecated("from-file", "deprecation is a side effect of config v1 deprecation from v2.0.0"); err != nil {
|
|
ec.Logger.WithError(err).Errorf("error while using a dependency library")
|
|
}
|
|
f.BoolVar(&opts.DryRun, "dry-run", false, "show metadata generated from project directory without applying to server. generated metadata will be printed as JSON by default, use -o flag for other display formats")
|
|
f.StringVarP(&opts.rawOutput, "output", "o", "", `specify an output format to show applied metadata. Allowed values: json, yaml (default "json")`)
|
|
f.BoolVar(&opts.DisallowInconsistencies, "disallow-inconsistent-metadata", false, "disallow inconsistent metadata to be applied. Defaults to false")
|
|
return metadataApplyCmd
|
|
}
|
|
|
|
type MetadataApplyOptions struct {
|
|
EC *cli.ExecutionContext
|
|
|
|
FromFile bool
|
|
DryRun bool
|
|
rawOutput string
|
|
DisallowInconsistencies bool
|
|
}
|
|
|
|
func (o *MetadataApplyOptions) Run() error {
|
|
var op errors.Op = "commands.MetadataApplyOptions.Run"
|
|
err := getMetadataModeHandler(o.EC.MetadataMode).Apply(o)
|
|
if err != nil {
|
|
return errors.E(op, err)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func errorApplyingMetadata(err error) error {
|
|
var op errors.Op = "commands.errorApplyingMetadata"
|
|
// a helper function to have consistent error messages for errors
|
|
// when applying metadata
|
|
return errors.E(op, fmt.Errorf("error applying metadata \n%w", err))
|
|
}
|