From 64e2864faba8c64b76a3b0ac7c6ca45c0e374d95 Mon Sep 17 00:00:00 2001 From: Michael Quigley Date: Mon, 25 Jul 2022 13:17:52 -0400 Subject: [PATCH] rough 'create account' api skeleton --- cmd/zrok/api.go | 11 ++--------- cmd/zrok/client.go | 15 +++++++++++++++ cmd/zrok/controller.go | 40 ++++++++++++++++++++++++++++++++++++++++ cmd/zrok/create.go | 35 +++++++++++++++++++++++++++++++++++ cmd/zrok/main.go | 22 ++-------------------- controller/controller.go | 22 +++++++++++++++++++--- controller/identity.go | 15 +++++++++++++++ 7 files changed, 128 insertions(+), 32 deletions(-) create mode 100644 cmd/zrok/client.go create mode 100644 cmd/zrok/controller.go create mode 100644 cmd/zrok/create.go create mode 100644 controller/identity.go diff --git a/cmd/zrok/api.go b/cmd/zrok/api.go index 8599e2bd..fd13818a 100644 --- a/cmd/zrok/api.go +++ b/cmd/zrok/api.go @@ -1,10 +1,6 @@ package main import ( - "github.com/go-openapi/runtime" - httptransport "github.com/go-openapi/runtime/client" - "github.com/go-openapi/strfmt" - "github.com/openziti-test-kitchen/zrok/rest_zrok_client" "github.com/openziti-test-kitchen/zrok/rest_zrok_client/metadata" "github.com/sirupsen/logrus" "github.com/spf13/cobra" @@ -21,13 +17,10 @@ var apiCmd = &cobra.Command{ } var apiVersionCmd = &cobra.Command{ - Use: "version ", + Use: "version", Short: "Get API version", Run: func(_ *cobra.Command, args []string) { - transport := httptransport.New(args[0], "", nil) - transport.Producers["application/zrok.v1+json"] = runtime.JSONProducer() - transport.Consumers["application/zrok.v1+json"] = runtime.JSONConsumer() - zrok := rest_zrok_client.New(transport, strfmt.Default) + zrok := newZrokClient() resp, err := zrok.Metadata.Version(metadata.NewVersionParams()) if err != nil { panic(err) diff --git a/cmd/zrok/client.go b/cmd/zrok/client.go new file mode 100644 index 00000000..fc31a7ea --- /dev/null +++ b/cmd/zrok/client.go @@ -0,0 +1,15 @@ +package main + +import ( + "github.com/go-openapi/runtime" + httptransport "github.com/go-openapi/runtime/client" + "github.com/go-openapi/strfmt" + "github.com/openziti-test-kitchen/zrok/rest_zrok_client" +) + +func newZrokClient() *rest_zrok_client.Zrok { + transport := httptransport.New(endpoint, "", nil) + transport.Producers["application/zrok.v1+json"] = runtime.JSONProducer() + transport.Consumers["application/zrok.v1+json"] = runtime.JSONConsumer() + return rest_zrok_client.New(transport, strfmt.Default) +} diff --git a/cmd/zrok/controller.go b/cmd/zrok/controller.go new file mode 100644 index 00000000..85a82fc2 --- /dev/null +++ b/cmd/zrok/controller.go @@ -0,0 +1,40 @@ +package main + +import ( + "github.com/openziti-test-kitchen/zrok/controller" + "github.com/openziti-test-kitchen/zrok/controller/store" + "github.com/pkg/errors" + "github.com/spf13/cobra" + "strconv" + "strings" +) + +func init() { + rootCmd.AddCommand(controllerCmd) +} + +var controllerCmd = &cobra.Command{ + Use: "controller ", + Short: "Start a zrok controller", + Aliases: []string{"ctrl"}, + Run: func(_ *cobra.Command, args []string) { + tokens := strings.Split(endpoint, ":") + if len(tokens) != 2 { + panic(errors.Errorf("malformed endpoint '%v'", endpoint)) + } + host := tokens[0] + port, err := strconv.Atoi(tokens[1]) + if err != nil { + panic(err) + } + if err := controller.Run(&controller.Config{ + Host: host, + Port: port, + Store: &store.Config{ + Path: "zrok.db", + }, + }); err != nil { + panic(err) + } + }, +} diff --git a/cmd/zrok/create.go b/cmd/zrok/create.go new file mode 100644 index 00000000..f2584046 --- /dev/null +++ b/cmd/zrok/create.go @@ -0,0 +1,35 @@ +package main + +import ( + "github.com/openziti-test-kitchen/zrok/rest_model" + "github.com/openziti-test-kitchen/zrok/rest_zrok_client/identity" + "github.com/sirupsen/logrus" + "github.com/spf13/cobra" +) + +func init() { + createCmd.AddCommand(createAccountCmd) + rootCmd.AddCommand(createCmd) +} + +var createCmd = &cobra.Command{ + Use: "create", + Short: "create objects", +} + +var createAccountCmd = &cobra.Command{ + Use: "account ", + Short: "create new zrok account", + Run: func(_ *cobra.Command, args []string) { + zrok := newZrokClient() + req := identity.NewCreateAccountParams() + req.Body = &rest_model.AccountRequest{ + Username: args[0], + } + resp, err := zrok.Identity.CreateAccount(req) + if err != nil { + panic(err) + } + logrus.Infof("api token = '%v'", resp.Payload.APIToken) + }, +} diff --git a/cmd/zrok/main.go b/cmd/zrok/main.go index cf1960ec..5690ff53 100644 --- a/cmd/zrok/main.go +++ b/cmd/zrok/main.go @@ -2,8 +2,6 @@ package main import ( "github.com/michaelquigley/pfxlog" - "github.com/openziti-test-kitchen/zrok/controller" - "github.com/openziti-test-kitchen/zrok/controller/store" "github.com/openziti-test-kitchen/zrok/http" "github.com/openziti-test-kitchen/zrok/proxy" "github.com/sirupsen/logrus" @@ -16,7 +14,7 @@ import ( func init() { pfxlog.GlobalInit(logrus.InfoLevel, pfxlog.DefaultOptions().SetTrimPrefix("github.com/openziti-test-kitchen/")) rootCmd.PersistentFlags().BoolVarP(&verbose, "verbose", "v", false, "enable verbose logging") - rootCmd.AddCommand(controllerCmd) + rootCmd.PersistentFlags().StringVarP(&endpoint, "endpoint", "e", "localhost:10888", "zrok endpoint address") rootCmd.AddCommand(httpCmd) rootCmd.AddCommand(proxyCmd) } @@ -31,23 +29,7 @@ var rootCmd = &cobra.Command{ }, } var verbose bool - -var controllerCmd = &cobra.Command{ - Use: "controller ", - Short: "Start a zrok controller", - Aliases: []string{"ctrl"}, - Run: func(_ *cobra.Command, args []string) { - if err := controller.Run(&controller.Config{ - Host: "0.0.0.0", - Port: 10888, - Store: &store.Config{ - Path: "zrok.db", - }, - }); err != nil { - panic(err) - } - }, -} +var endpoint string var httpCmd = &cobra.Command{ Use: "http ", diff --git a/controller/controller.go b/controller/controller.go index 59ce8a4b..6134603b 100644 --- a/controller/controller.go +++ b/controller/controller.go @@ -7,8 +7,10 @@ import ( "github.com/openziti-test-kitchen/zrok/rest_model" "github.com/openziti-test-kitchen/zrok/rest_zrok_server" "github.com/openziti-test-kitchen/zrok/rest_zrok_server/operations" + "github.com/openziti-test-kitchen/zrok/rest_zrok_server/operations/identity" "github.com/openziti-test-kitchen/zrok/rest_zrok_server/operations/metadata" "github.com/pkg/errors" + "github.com/sirupsen/logrus" ) var str *store.Store @@ -26,9 +28,8 @@ func Run(cfg *Config) error { } api := operations.NewZrokAPI(swaggerSpec) - api.MetadataVersionHandler = metadata.VersionHandlerFunc(func(_ metadata.VersionParams) middleware.Responder { - return metadata.NewGetOK().WithPayload(&rest_model.Version{Version: "v0.0.0; sk3tch"}) - }) + api.MetadataVersionHandler = metadata.VersionHandlerFunc(versionHandler) + api.IdentityCreateAccountHandler = identity.CreateAccountHandlerFunc(createAccountHandler) server := rest_zrok_server.NewServer(api) defer func() { _ = server.Shutdown() }() @@ -40,3 +41,18 @@ func Run(cfg *Config) error { } return nil } + +func versionHandler(_ metadata.VersionParams) middleware.Responder { + return metadata.NewGetOK().WithPayload(&rest_model.Version{Version: "v0.0.0; sk3tch"}) +} + +func createAccountHandler(params identity.CreateAccountParams) middleware.Responder { + logrus.Infof("received account request for username '%v'", params.Body.Username) + apiToken, err := generateApiToken() + if err != nil { + return middleware.Error(500, err.Error()) + } + return identity.NewCreateAccountCreated().WithPayload(&rest_model.AccountResponse{ + APIToken: apiToken, + }) +} diff --git a/controller/identity.go b/controller/identity.go new file mode 100644 index 00000000..ab4443ef --- /dev/null +++ b/controller/identity.go @@ -0,0 +1,15 @@ +package controller + +import ( + "crypto/rand" + "encoding/hex" + "github.com/pkg/errors" +) + +func generateApiToken() (string, error) { + bytes := make([]byte, 64) + if _, err := rand.Read(bytes); err != nil { + return "", errors.Wrap(err, "error generating random api token") + } + return hex.EncodeToString(bytes), nil +}