Skip to content

Commit

Permalink
Now schema and aspect descriptions can be read from stdin with the '-…
Browse files Browse the repository at this point in the history
…-stdin' flag. aspects and schemas can be read and written in YAML as well using the '--use-yaml' flag. Finally 'magda-cli --version' prints the version and build date
  • Loading branch information
maxott committed Sep 15, 2021
1 parent 39de9da commit 888741b
Show file tree
Hide file tree
Showing 9 changed files with 423 additions and 97 deletions.
13 changes: 11 additions & 2 deletions Makefile
Original file line number Diff line number Diff line change
@@ -1,10 +1,19 @@

GIT_COMMIT := $(shell git rev-list --abbrev-commit --tags --max-count=1)
BUILD_DATE := $(shell date "+%Y-%m-%d:%H:%M")
GIT_TAG := $(shell git describe --abbrev=0 --tags ${TAG_COMMIT} 2>/dev/null || true)
ifeq ($(GIT_TAG),)
VERSION := ${GIT_COMMIT}-${BUILD_DATE}
else
VERSION := $(GIT_TAG:v%=%)-${GIT_COMMIT}-${BUILD_DATE}
endif

build:
go mod tidy
go build .
go build -ldflags "-X main.Version=${VERSION}"

install: build
go install .
go install -ldflags "-X main.Version=${VERSION}" .

create-schemas: build
./magda-cli schema create --id cse-order --name cse-order --schema-file example/schema/order.json
Expand Down
28 changes: 27 additions & 1 deletion cmd/cmd.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
package cmd

import (
"os"
"github.com/maxott/magda-cli/pkg/adapter"
"gopkg.in/alecthomas/kingpin.v2"

Expand All @@ -21,6 +22,8 @@ var (
jwtSecret = app.Flag("jwt-secret", "Secret used for creating JWT token for inernal comms [MAGDA_JWT_SECRET]").Envar("MAGDA_JWT_SECRET").String()
jwtUser = app.Flag("jwt-user-id", "User ID for creating JWT token for inernal comms [MAGDA_JWT_USER_ID]").Envar("MAGDA_JWT_USER_ID").String()

useYaml = app.Flag("use-yaml", "Use and assume data formated in YAML [MAGDA_USE_YAML]").Short('y').Envar("MAGDA_USE_YAML").Bool()

logger *log.Logger
)

Expand Down Expand Up @@ -62,7 +65,18 @@ func createJwtToken(logger *log.Logger) string {
}

func loadObjFromFile(fileName string) map[string]interface{} {
adata, err := adapter.LoadPayloadFromFile(fileName)
if fileName != "-" {
if s, err := os.Stat(fileName); os.IsNotExist(err) {
App().Fatalf("file '%s' does not exist", fileName)
} else if err != nil {
App().Fatalf("failed to verify existence of file '%s' - %s", fileName, err)
} else {
if s.IsDir() {
App().Fatalf("path '%s' is not a file", fileName)
}
}
}
adata, err := adapter.LoadPayloadFromFile(fileName, *useYaml)
if err != nil {
App().Fatalf("failed to load '%s' - %s", fileName, err)
}
Expand All @@ -72,3 +86,15 @@ func loadObjFromFile(fileName string) map[string]interface{} {
}
return obj
}

func loadObjFromStdin() map[string]interface{} {
adata, err := adapter.LoadPayloadFromStdin(*useYaml)
if err != nil {
App().Fatalf("failed to load data from stdin - %s", err)
}
obj, err := adata.AsObject()
if err != nil {
App().Fatalf("failed to verify data from stdin - %s", err)
}
return obj
}
6 changes: 5 additions & 1 deletion cmd/minion.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,11 @@ func init() {
func cliMinionList(topCmd *kingpin.CmdClause) {
cmd := &minion.ListRequest{}
topCmd.Command("list", "List all minion registration").Action(func(_ *kingpin.ParseContext) error {
return adapter.ReplyPrinter(minion.ListRaw(cmd, Adapter(), Logger()))
if pyld, err := minion.ListRaw(cmd, Adapter(), Logger()); err != nil {
return err
} else {
return adapter.ReplyPrinter(pyld, *useYaml)
}
})
}

Expand Down
58 changes: 34 additions & 24 deletions cmd/record.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,11 @@ func cliRecordList(topCmd *kingpin.CmdClause) {
// fmt.Printf("List: %+v\n", rec)
// return nil
// }

return adapter.ReplyPrinter(record.ListRaw(r, Adapter(), Logger()))
if pyld, err := record.ListRaw(r, Adapter(), Logger()); err != nil {
return err
} else {
return adapter.ReplyPrinter(pyld, *useYaml)
}
})
c.Flag("aspects", "The aspects for which to retrieve data").
Short('a').
Expand All @@ -52,12 +55,13 @@ func cliRecordList(topCmd *kingpin.CmdClause) {
/**** CREATE ****/

type CreateCmd struct {
Id string `json:"id"`
Name string `json:"name"`
Aspects record.Aspects `json:"aspects"`
SourceTag string `json:"sourceTag,omitempty"`
AspectName string `json:"-"`
AspectFile string `json:"-"`
Id string `json:"id"`
Name string `json:"name"`
Aspects record.Aspects `json:"aspects"`
SourceTag string `json:"sourceTag,omitempty"`
AspectName string `json:"-"`
AspectFile string `json:"-"`
AspectFromStdin bool `json:"-"`
}

func cliRecordCreate(topCmd *kingpin.CmdClause) {
Expand Down Expand Up @@ -91,28 +95,26 @@ func cliAddAspectFlags(r *CreateCmd, c *kingpin.CmdClause) {
c.Flag("aspect-file", "File containing aspect data").
Short('f').
ExistingFileVar(&r.AspectFile)
c.Flag("stdin", "Read aspect data from stdin").
BoolVar(&r.AspectFromStdin)

}

func addAspects(r *CreateCmd) {
r.Aspects = record.Aspects{}
if r.AspectName != "" || r.AspectFile != "" {
if r.AspectName == "" {
if r.AspectName == "" {
if r.AspectFile != "" || r.AspectFromStdin {
App().Fatalf("required flag --aspect-name not provided, try --help")
}
if r.AspectFile == "" {
App().Fatalf("required flag --aspect-file not provided, try --help")
}
return
}

if r.AspectFile != "" {
r.Aspects[r.AspectName] = loadObjFromFile(r.AspectFile)

// adata, err := adapter.LoadPayloadFromFile(r.AspectFile)
// if err != nil {
// App().Fatalf("failed to load '%s' - %s", r.AspectFile, err)
// }
// r.Aspects[r.AspectName], err = adata.AsObject()
// if err != nil {
// App().Fatalf("failed to verify '%s' - %s", r.AspectFile, err)
// }
} else if r.AspectFromStdin {
r.Aspects[r.AspectName] = loadObjFromStdin()
} else {
App().Fatalf("required flag --aspect-file or --stdin not provided, try --help")
}
}

Expand All @@ -121,7 +123,11 @@ func addAspects(r *CreateCmd) {
func cliRecordRead(topCmd *kingpin.CmdClause) {
r := &record.ReadRequest{}
c := topCmd.Command("read", "Read the content of a record").Action(func(_ *kingpin.ParseContext) error {
return adapter.ReplyPrinter(record.ReadRaw(r, Adapter(), Logger()))
if pyld, err := record.ReadRaw(r, Adapter(), Logger()); err != nil {
return err
} else {
return adapter.ReplyPrinter(pyld, *useYaml)
}
})
c.Flag("id", "Record ID").
Short('i').
Expand Down Expand Up @@ -186,7 +192,11 @@ func cliRecordDelete(topCmd *kingpin.CmdClause) {
func cliRecordHistory(topCmd *kingpin.CmdClause) {
r := &record.HistoryRequest{Offset: -1, Limit: -1}
c := topCmd.Command("history", "Get a list of all events for a record").Action(func(_ *kingpin.ParseContext) error {
return adapter.ReplyPrinter(record.HistoryRaw(r, Adapter(), Logger()))
if pyld, err := record.HistoryRaw(r, Adapter(), Logger()); err != nil {
return err
} else {
return adapter.ReplyPrinter(pyld, *useYaml)
}
})
c.Flag("id", "Record ID").
Short('i').
Expand Down
60 changes: 26 additions & 34 deletions cmd/schema.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,11 @@ func init() {
func cliSchemaList(topCmd *kingpin.CmdClause) {
cmd := &schema.ListRequest{}
topCmd.Command("list", "List all aspect schemas").Action(func(_ *kingpin.ParseContext) error {
return adapter.ReplyPrinter(schema.ListRaw(cmd, Adapter(), Logger()))
if pyld, err := schema.ListRaw(cmd, Adapter(), Logger()); err != nil {
return err
} else {
return adapter.ReplyPrinter(pyld, *useYaml)
}
})
}

Expand All @@ -31,6 +35,7 @@ type SchemaCreate struct {
Id string `json:"id"`
Name string `json:"name"`
SchemaFile string `json:"-"`
SchemaFromStdin bool `json:"-"`
}

func cliSchemaCreate(topCmd *kingpin.CmdClause) {
Expand All @@ -45,23 +50,6 @@ func cliSchemaCreate(topCmd *kingpin.CmdClause) {
} else {
return err
}
// if js, err := adapter.LoadPayloadFromFile(r.SchemaFile); err != nil {
// return fmt.Errorf("failed to load & verify '%s' - %s", r.SchemaFile, err)
// } else {
// schemaObj, err := js.AsObject()
// if err != nil {
// App().Fatalf("failed to verify '%s' - %s", r.SchemaFile, err)
// }
// cmd := schema.CreateRequest{
// Id: r.Id, Name: r.Name, Schema: schemaObj,
// }
// if _, err := schema.CreateRaw(&cmd, Adapter(), Logger()); err == nil {
// fmt.Printf("Successfully create schema '%s'\n", r.Id)
// return nil
// } else {
// return err
// }
// }
})
c.Flag("name", "Descriptive name").
Short('n').
Expand All @@ -75,18 +63,24 @@ func cliAddSchemaCUFlags(r *SchemaCreate, c *kingpin.CmdClause) {
Short('i').
Required().
StringVar(&r.Id)
c.Flag("schema-file", "File containing schema/aspect decalration").
c.Flag("schema-file", "File containing schema declaration").
Short('f').
Required().
ExistingFileVar(&r.SchemaFile)
c.Flag("stdin", "Read schema definition from stdin").
BoolVar(&r.SchemaFromStdin)
}

/**** READ ****/

func cliSchemaRead(topCmd *kingpin.CmdClause) {
r := &schema.ReadRequest{}
c := topCmd.Command("read", "Read the content of a schema").Action(func(_ *kingpin.ParseContext) error {
return adapter.ReplyPrinter(schema.ReadRaw(r, Adapter(), Logger()))
if pyld, err := schema.ReadRaw(r, Adapter(), Logger()); err != nil {
return err
} else {
return adapter.ReplyPrinter(pyld, *useYaml)
}
})
c.Flag("id", "Record ID").
Short('i').
Expand All @@ -100,34 +94,32 @@ func cliSchemaUpdate(topCmd *kingpin.CmdClause) {
r := &SchemaCreate{}
c := topCmd.Command("update", "Update existing schema").Action(func(_ *kingpin.ParseContext) error {
cmd := schema.UpdateRequest{
Id: r.Id, Name: r.Name, Schema: loadObjFromFile(r.SchemaFile),
Id: r.Id, Name: r.Name, Schema: loadSchema(r),
}
if _, err := schema.UpdateRaw(&cmd, Adapter(), Logger()); err == nil {
fmt.Printf("Successfully updated schema '%s'\n", r.Id)
return nil
} else {
return err
}
// if js, err := adapter.LoadJsonFromFile(r.SchemaFile); err != nil {
// return fmt.Errorf("failed to load & verify '%s' - %s", r.SchemaFile, err)
// } else {
// cmd := schema.UpdateRequest{
// Id: r.Id, Name: r.Name, Schema: js.AsObject(),
// }
// if _, err := schema.UpdateRaw(&cmd, Adapter(), Logger()); err == nil {
// fmt.Printf("Successfully updated schema '%s'\n", r.Id)
// return nil
// } else {
// return err
// }
// }
})
c.Flag("name", "Descriptive name").
Short('n').
StringVar(&r.Name)
cliAddSchemaCUFlags(r, c)
}

func loadSchema(r *SchemaCreate) map[string]interface{} {
if r.SchemaFile != "" {
return loadObjFromFile(r.SchemaFile)
} else if r.SchemaFromStdin {
return loadObjFromStdin()
} else {
App().Fatalf("required flag --schema-file or --stdin not provided, try --help")
return nil
}
}

/**** DELETE ****/

// Not supported
2 changes: 2 additions & 0 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ require (
github.com/alecthomas/units v0.0.0-20210208195552-ff826a37aa15 // indirect
github.com/golang-jwt/jwt v3.2.2+incompatible
github.com/google/uuid v1.3.0
github.com/jdockerty/yaml-to-json-go v0.0.0-20201103211121-0ca78a2aafd9
go.uber.org/zap v1.19.0
gopkg.in/alecthomas/kingpin.v2 v2.2.6
gopkg.in/yaml.v2 v2.3.0
)
Loading

0 comments on commit 888741b

Please sign in to comment.