diff --git a/cmd/workspace/apps/overrides.go b/cmd/workspace/apps/overrides.go new file mode 100644 index 00000000..e38e139b --- /dev/null +++ b/cmd/workspace/apps/overrides.go @@ -0,0 +1,58 @@ +package apps + +import ( + "fmt" + + "github.com/databricks/cli/cmd/root" + "github.com/databricks/cli/libs/cmdio" + "github.com/databricks/cli/libs/flags" + "github.com/databricks/databricks-sdk-go/service/serving" + "github.com/spf13/cobra" +) + +func createOverride(cmd *cobra.Command, deployReq *serving.DeployAppRequest) { + var manifestYaml flags.YamlFlag + var resourcesYaml flags.YamlFlag + createJson := cmd.Flag("json").Value.(*flags.JsonFlag) + + // TODO: short flags + cmd.Flags().Var(&manifestYaml, "manifest", `either inline YAML string or @path/to/manifest.yaml`) + cmd.Flags().Var(&resourcesYaml, "resources", `either inline YAML string or @path/to/resources.yaml`) + + cmd.Annotations = make(map[string]string) + + cmd.PreRunE = root.MustWorkspaceClient + cmd.RunE = func(cmd *cobra.Command, args []string) (err error) { + ctx := cmd.Context() + w := root.WorkspaceClient(ctx) + if cmd.Flags().Changed("json") { + err = createJson.Unmarshal(&deployReq) + if err != nil { + return err + } + } else if cmd.Flags().Changed("manifest") { + err = manifestYaml.Unmarshal(&deployReq.Manifest) + if err != nil { + return err + } + if cmd.Flags().Changed("resources") { + err = resourcesYaml.Unmarshal(&deployReq.Resources) + if err != nil { + return err + } + } + } else { + return fmt.Errorf("please provide command input in YAML format by specifying the --manifest flag or provide a json payload using the --json flag") + } + response, err := w.Apps.Create(ctx, *deployReq) + if err != nil { + return err + } + + return cmdio.Render(ctx, response) + } +} + +func init() { + createOverrides = append(createOverrides, createOverride) +} diff --git a/libs/flags/yaml_flag.go b/libs/flags/yaml_flag.go new file mode 100644 index 00000000..95cc9b4b --- /dev/null +++ b/libs/flags/yaml_flag.go @@ -0,0 +1,42 @@ +package flags + +import ( + "fmt" + "os" + + "github.com/ghodss/yaml" +) + +type YamlFlag struct { + raw []byte +} + +func (y *YamlFlag) String() string { + return fmt.Sprintf("YAML (%d bytes)", len(y.raw)) +} + +// TODO: Command.MarkFlagFilename() +func (y *YamlFlag) Set(v string) error { + // Load request from file if it starts with '@' (like curl). + if v[0] != '@' { + y.raw = []byte(v) + return nil + } + buf, err := os.ReadFile(v[1:]) + if err != nil { + return fmt.Errorf("read %s: %w", v, err) + } + y.raw = buf + return nil +} + +func (y *YamlFlag) Unmarshal(v any) error { + if y.raw == nil { + return nil + } + return yaml.Unmarshal(y.raw, v) +} + +func (y *YamlFlag) Type() string { + return "YAML" +}