From ba86c7689915175fa631bb058424dc42106f4b37 Mon Sep 17 00:00:00 2001 From: kubemq Date: Sun, 7 Feb 2021 13:50:49 +0200 Subject: [PATCH] release v3.5.1 --- .idea/workspace.xml | 33 ++++++++++++++++-------- Taskfile.yml | 2 +- cmd/commands/send.go | 9 +++---- cmd/events/send.go | 9 +++---- cmd/events_store/list.go | 4 +-- cmd/events_store/send.go | 9 +++---- cmd/queries/send.go | 9 +++---- cmd/queue/attach.go | 4 +-- cmd/queue/helper.go | 26 +++++++++++++++++++ cmd/queue/list.go | 4 +-- cmd/queue/send.go | 22 +++++++--------- go.mod | 25 ++++++++----------- pkg/k8s/transport.go | 20 ++++++++++++--- pkg/targets/file.go | 54 ++++++++++++++++++++++++++++++++++++++++ 14 files changed, 163 insertions(+), 67 deletions(-) create mode 100644 pkg/targets/file.go diff --git a/.idea/workspace.xml b/.idea/workspace.xml index b5ae693..3466f0d 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -2,7 +2,20 @@ + + + + + + + + + + + + + @@ -552,7 +565,6 @@ true diff --git a/Taskfile.yml b/Taskfile.yml index b4407c1..07915e4 100644 --- a/Taskfile.yml +++ b/Taskfile.yml @@ -4,7 +4,7 @@ version: '2' vars: BINARY_NAME: kubemqctl - VERSION: v3.5.0 + VERSION: v3.5.1 tasks: check_update: diff --git a/cmd/commands/send.go b/cmd/commands/send.go index 7ba3f89..c245a15 100644 --- a/cmd/commands/send.go +++ b/cmd/commands/send.go @@ -10,7 +10,6 @@ import ( "github.com/kubemq-io/kubemqctl/pkg/targets" "github.com/kubemq-io/kubemqctl/pkg/utils" "github.com/spf13/cobra" - "io/ioutil" "time" ) @@ -21,7 +20,7 @@ type CommandsSendOptions struct { body string metadata string timeout int - fileName string + fileName bool build bool } @@ -60,7 +59,7 @@ func NewCmdCommandsSend(ctx context.Context, cfg *config.Config) *cobra.Command } cmd.PersistentFlags().StringVarP(&o.metadata, "metadata", "m", "", "Set metadata body") cmd.PersistentFlags().IntVarP(&o.timeout, "timeout", "o", 30, "Set command timeout") - cmd.PersistentFlags().StringVarP(&o.fileName, "file", "f", "", "set load body from file") + cmd.PersistentFlags().BoolVarP(&o.fileName, "file", "f", false, "set load body from file") cmd.PersistentFlags().BoolVarP(&o.build, "build", "b", false, "build kubemq targets request") return cmd } @@ -81,8 +80,8 @@ func (o *CommandsSendOptions) Complete(args []string, transport string) error { o.body = string(data) return nil } - if o.fileName != "" { - data, err := ioutil.ReadFile(o.fileName) + if o.fileName { + data, err := targets.BuildFile() if err != nil { return err } diff --git a/cmd/events/send.go b/cmd/events/send.go index 87a7b4a..a00e0d3 100644 --- a/cmd/events/send.go +++ b/cmd/events/send.go @@ -11,7 +11,6 @@ import ( "github.com/kubemq-io/kubemqctl/pkg/targets" "github.com/kubemq-io/kubemqctl/pkg/utils" "github.com/spf13/cobra" - "io/ioutil" "time" ) @@ -23,7 +22,7 @@ type EventsSendOptions struct { metadata string messages int isStream bool - fileName string + fileName bool build bool } @@ -66,7 +65,7 @@ func NewCmdEventsSend(ctx context.Context, cfg *config.Config) *cobra.Command { cmd.PersistentFlags().StringVarP(&o.metadata, "metadata", "", "", "set body metadata field") cmd.PersistentFlags().IntVarP(&o.messages, "messages", "m", 1, "set how many 'events' messages to send") cmd.PersistentFlags().BoolVarP(&o.isStream, "stream", "s", false, "set stream of all messages at once") - cmd.PersistentFlags().StringVarP(&o.fileName, "file", "f", "", "set body body from file") + cmd.PersistentFlags().BoolVarP(&o.fileName, "file", "f", false, "set body body from file") cmd.PersistentFlags().BoolVarP(&o.build, "build", "b", false, "build kubemq targets request") return cmd } @@ -87,8 +86,8 @@ func (o *EventsSendOptions) Complete(args []string, transport string) error { o.body = string(data) return nil } - if o.fileName != "" { - data, err := ioutil.ReadFile(o.fileName) + if o.fileName { + data, err := targets.BuildFile() if err != nil { return err } diff --git a/cmd/events_store/list.go b/cmd/events_store/list.go index b0aeb62..a7c953c 100644 --- a/cmd/events_store/list.go +++ b/cmd/events_store/list.go @@ -4,7 +4,7 @@ import ( "context" "encoding/json" "fmt" - "github.com/go-resty/resty" + "github.com/go-resty/resty/v2" "github.com/kubemq-io/kubemqctl/pkg/config" "github.com/kubemq-io/kubemqctl/pkg/k8s" "github.com/kubemq-io/kubemqctl/pkg/utils" @@ -68,7 +68,7 @@ func (o *EventsStoreListOptions) Run(ctx context.Context) error { resp := &Response{} q := &Queues{} - r, err := resty.R().SetResult(resp).SetError(resp).Get(fmt.Sprintf("%s/v1/stats/events_stores", o.cfg.GetApiHttpURI())) + r, err := resty.New().R().SetResult(resp).SetError(resp).Get(fmt.Sprintf("%s/v1/stats/events_stores", o.cfg.GetApiHttpURI())) if err != nil { return err } diff --git a/cmd/events_store/send.go b/cmd/events_store/send.go index 3cf7b03..344fcaa 100644 --- a/cmd/events_store/send.go +++ b/cmd/events_store/send.go @@ -11,7 +11,6 @@ import ( "github.com/kubemq-io/kubemqctl/pkg/targets" "github.com/kubemq-io/kubemqctl/pkg/utils" "github.com/spf13/cobra" - "io/ioutil" "time" ) @@ -23,7 +22,7 @@ type EventsStoreSendOptions struct { metadata string messages int isStream bool - fileName string + fileName bool build bool } @@ -66,7 +65,7 @@ func NewCmdEventsStoreSend(ctx context.Context, cfg *config.Config) *cobra.Comma cmd.PersistentFlags().StringVarP(&o.metadata, "metadata", "", "", "set body metadata field") cmd.PersistentFlags().IntVarP(&o.messages, "messages", "m", 1, "set how many 'events store' messages to send") cmd.PersistentFlags().BoolVarP(&o.isStream, "stream", "s", false, "set stream of all messages at once") - cmd.PersistentFlags().StringVarP(&o.fileName, "file", "f", "", "set load body from file") + cmd.PersistentFlags().BoolVarP(&o.fileName, "file", "f", false, "set load body from file") cmd.PersistentFlags().BoolVarP(&o.build, "build", "b", false, "build kubemq targets request") return cmd } @@ -87,8 +86,8 @@ func (o *EventsStoreSendOptions) Complete(args []string, transport string) error o.body = string(data) return nil } - if o.fileName != "" { - data, err := ioutil.ReadFile(o.fileName) + if o.fileName { + data, err := targets.BuildFile() if err != nil { return err } diff --git a/cmd/queries/send.go b/cmd/queries/send.go index 8fe1d90..4719fd3 100644 --- a/cmd/queries/send.go +++ b/cmd/queries/send.go @@ -10,7 +10,6 @@ import ( "github.com/kubemq-io/kubemqctl/pkg/targets" "github.com/kubemq-io/kubemqctl/pkg/utils" "github.com/spf13/cobra" - "io/ioutil" "time" ) @@ -23,7 +22,7 @@ type QueriesSendOptions struct { timeout int cacheKey string cacheTTL time.Duration - fileName string + fileName bool build bool } @@ -67,7 +66,7 @@ func NewCmdQueriesSend(ctx context.Context, cfg *config.Config) *cobra.Command { cmd.PersistentFlags().StringVarP(&o.cacheKey, "cache-key", "c", "", "set query cache key") cmd.PersistentFlags().IntVarP(&o.timeout, "timeout", "o", 30, "set query timeout") cmd.PersistentFlags().DurationVarP(&o.cacheTTL, "cache-duration", "d", 10*time.Minute, "set cache duration timeout") - cmd.PersistentFlags().StringVarP(&o.fileName, "file", "f", "", "set load body from file") + cmd.PersistentFlags().BoolVarP(&o.fileName, "file", "f", false, "set load body from file") cmd.PersistentFlags().BoolVarP(&o.build, "build", "b", false, "build kubemq targets request") return cmd } @@ -88,8 +87,8 @@ func (o *QueriesSendOptions) Complete(args []string, transport string) error { o.body = string(data) return nil } - if o.fileName != "" { - data, err := ioutil.ReadFile(o.fileName) + if o.fileName { + data, err := targets.BuildFile() if err != nil { return err } diff --git a/cmd/queue/attach.go b/cmd/queue/attach.go index 9b1c865..9bb2ac5 100644 --- a/cmd/queue/attach.go +++ b/cmd/queue/attach.go @@ -4,7 +4,7 @@ import ( "context" "encoding/json" "fmt" - "github.com/go-resty/resty" + "github.com/go-resty/resty/v2" "github.com/kubemq-io/kubemqctl/pkg/attach" "github.com/kubemq-io/kubemqctl/pkg/config" "github.com/kubemq-io/kubemqctl/pkg/k8s" @@ -75,7 +75,7 @@ func (o *QueueAttachOptions) Complete(args []string, transport string) error { resp := &Response{} queues := &Queues{} - r, err := resty.R().SetResult(resp).SetError(resp).Get(fmt.Sprintf("%s/v1/stats/queues", o.cfg.GetApiHttpURI())) + r, err := resty.New().R().SetResult(resp).SetError(resp).Get(fmt.Sprintf("%s/v1/stats/queues", o.cfg.GetApiHttpURI())) if err != nil { return err } diff --git a/cmd/queue/helper.go b/cmd/queue/helper.go index bf5bedd..e059ea2 100644 --- a/cmd/queue/helper.go +++ b/cmd/queue/helper.go @@ -87,3 +87,29 @@ func printItems(items []*kubemq.QueueMessage) { func printQueueMessage(msg *kubemq.QueueMessage) { fmt.Println(newQueueMessageObject(msg)) } + +type resultObj struct { + MessageID string `json:"message_id"` + SentAt string `json:"sent_at,omitempty"` + ExpirationAt string `json:"expiration_at,omitempty"` + DelayedTo string `json:"delayed_to,omitempty"` + IsError bool `json:"is_error,omitempty"` + Error string `json:"error,omitempty"` +} + +func printQueueMessageResult(res *kubemq.SendQueueMessageResult) { + obj := &resultObj{ + MessageID: res.MessageID, + SentAt: time.Unix(0, res.SentAt).Format("2006-01-02 15:04:05.999"), + IsError: res.IsError, + Error: res.Error, + } + if res.ExpirationAt > 0 { + obj.ExpirationAt = time.Unix(0, res.ExpirationAt).Format("2006-01-02 15:04:05.999") + } + if res.DelayedTo > 0 { + obj.DelayedTo = time.Unix(0, res.DelayedTo).Format("2006-01-02 15:04:05.999") + } + data, _ := json.MarshalIndent(obj, "", " ") + fmt.Println(string(data)) +} diff --git a/cmd/queue/list.go b/cmd/queue/list.go index c885789..9aee9b0 100644 --- a/cmd/queue/list.go +++ b/cmd/queue/list.go @@ -4,7 +4,7 @@ import ( "context" "encoding/json" "fmt" - "github.com/go-resty/resty" + "github.com/go-resty/resty/v2" "github.com/kubemq-io/kubemqctl/pkg/config" "github.com/kubemq-io/kubemqctl/pkg/k8s" "github.com/kubemq-io/kubemqctl/pkg/utils" @@ -68,7 +68,7 @@ func (o *QueueListOptions) Run(ctx context.Context) error { resp := &Response{} q := &Queues{} - r, err := resty.R().SetResult(resp).SetError(resp).Get(fmt.Sprintf("%s/v1/stats/queues", o.cfg.GetApiHttpURI())) + r, err := resty.New().R().SetResult(resp).SetError(resp).Get(fmt.Sprintf("%s/v1/stats/queues", o.cfg.GetApiHttpURI())) if err != nil { return err } diff --git a/cmd/queue/send.go b/cmd/queue/send.go index bd95d67..14e3dc7 100644 --- a/cmd/queue/send.go +++ b/cmd/queue/send.go @@ -9,7 +9,6 @@ import ( "github.com/kubemq-io/kubemqctl/pkg/targets" "github.com/kubemq-io/kubemqctl/pkg/utils" "github.com/spf13/cobra" - "io/ioutil" ) type QueueSendOptions struct { @@ -23,7 +22,7 @@ type QueueSendOptions struct { metadata string deadLetter string messages int - fileName string + fileName bool build bool } @@ -75,7 +74,7 @@ func NewCmdQueueSend(ctx context.Context, cfg *config.Config) *cobra.Command { cmd.PersistentFlags().IntVarP(&o.messages, "messages", "m", 1, "set dead-letter max receive count") cmd.PersistentFlags().StringVarP(&o.deadLetter, "dead-letter-queue", "q", "", "set dead-letter queue name") cmd.PersistentFlags().StringVarP(&o.metadata, "metadata", "", "", "set queue message metadata field") - cmd.PersistentFlags().StringVarP(&o.fileName, "file", "f", "", "set load message body from file") + cmd.PersistentFlags().BoolVarP(&o.fileName, "file", "f", false, "set load message body from file") cmd.PersistentFlags().BoolVarP(&o.build, "build", "b", false, "build kubemq targets request") return cmd @@ -97,8 +96,8 @@ func (o *QueueSendOptions) Complete(args []string, transport string) error { o.body = string(data) return nil } - if o.fileName != "" { - data, err := ioutil.ReadFile(o.fileName) + if o.fileName { + data, err := targets.BuildFile() if err != nil { return err } @@ -137,18 +136,15 @@ func (o *QueueSendOptions) Run(ctx context.Context) error { SetPolicyDelaySeconds(o.delay). SetPolicyMaxReceiveCount(o.maxReceive). SetPolicyMaxReceiveQueue(o.deadLetter) - fmt.Println("Sending Queue Message:") + utils.Println("Sending Queue Message:") + printQueueMessage(msg) res, err := msg.Send(ctx) if err != nil { - return fmt.Errorf("sending queue message, %s", err.Error()) + return fmt.Errorf("error sending queue message, %s", err.Error()) } - if res != nil { - if res.IsError { - return fmt.Errorf("sending queue message response, %s", res.Error) - } - - printQueueMessage(msg) + utils.Println("Response:") + printQueueMessageResult(res) } } diff --git a/go.mod b/go.mod index a5e0e37..e02fa4e 100644 --- a/go.mod +++ b/go.mod @@ -3,24 +3,21 @@ module github.com/kubemq-io/kubemqctl require ( github.com/AlecAivazis/survey/v2 v2.2.7 github.com/dgrijalva/jwt-go v3.2.0+incompatible - github.com/fatih/color v1.7.0 + github.com/fatih/color v1.10.0 github.com/ghodss/yaml v1.0.0 - github.com/go-resty/resty v1.8.0 - github.com/go-resty/resty/v2 v2.0.0 - github.com/google/uuid v1.1.2 - github.com/gorilla/websocket v1.4.0 - github.com/json-iterator/go v1.1.8 - github.com/kubemq-hub/builder v0.5.9 - github.com/kubemq-io/kubemq-go v1.4.6 - github.com/magiconair/properties v1.8.1 // indirect - github.com/mattn/go-isatty v0.0.9 // indirect + github.com/go-resty/resty/v2 v2.4.0 + github.com/google/uuid v1.2.0 + github.com/gorilla/websocket v1.4.2 + github.com/json-iterator/go v1.1.10 + github.com/kubemq-hub/builder v0.6.2 + github.com/kubemq-io/kubemq-go v1.4.7 github.com/pelletier/go-toml v1.4.0 // indirect github.com/pkg/browser v0.0.0-20180916011732-0a3d74bf9ce4 - github.com/pkg/errors v0.8.1 - github.com/spf13/cobra v1.0.0 + github.com/pkg/errors v0.9.1 + github.com/spf13/cobra v1.1.1 github.com/spf13/jwalterweatherman v1.1.0 // indirect - github.com/spf13/viper v1.4.0 - github.com/stretchr/testify v1.4.0 + github.com/spf13/viper v1.7.1 + github.com/stretchr/testify v1.5.1 gopkg.in/yaml.v2 v2.3.0 k8s.io/api v0.17.4 k8s.io/apiextensions-apiserver v0.17.4 diff --git a/pkg/k8s/transport.go b/pkg/k8s/transport.go index a165a66..bbbad6b 100644 --- a/pkg/k8s/transport.go +++ b/pkg/k8s/transport.go @@ -118,9 +118,23 @@ func GetRunningClusterPod(client *client.Client, ns, name string) (string, strin return ns, randPort, nil } - return "", "", fmt.Errorf("no running pods available in %s/%s.", ns, name) + return "", "", fmt.Errorf("no running pods available in %s/%s", ns, name) +} +func GetRunningDashboardPod(client *client.Client, ns, name string) (string, string, error) { + pods, err := client.GetPods(ns, name) + if err != nil { + return "", "", err + } + var list []string + for _, pod := range pods { + list = append(list, pod.Name) + } + if len(list) == 0 || len(list) != 1 { + return "", "", fmt.Errorf("no running pods available in %s/%s", ns, name) + } else { + return ns, list[0], nil + } } - func GetDashboardTransport(ctx context.Context, cfg *config.Config, ns, name string) (string, string, error) { if !cfg.AutoIntegrated { return "3000", "8080", nil @@ -130,7 +144,7 @@ func GetDashboardTransport(ctx context.Context, cfg *config.Config, ns, name str if err != nil { return "", "", err } - podNameSpace, podName, err := GetRunningClusterPod(c, ns, name) + podNameSpace, podName, err := GetRunningDashboardPod(c, ns, name) if err != nil { return "", "", err } diff --git a/pkg/targets/file.go b/pkg/targets/file.go new file mode 100644 index 0000000..1c773df --- /dev/null +++ b/pkg/targets/file.go @@ -0,0 +1,54 @@ +package targets + +import ( + "fmt" + "github.com/AlecAivazis/survey/v2" + "io/ioutil" +) + +func BuildFile() ([]byte, error) { + loadFileOptions := "" + loadFileSelectionPrompt := &survey.Select{ + Renderer: survey.Renderer{}, + Message: "Select Load data from file:", + Options: []string{"Open an Editor", "Open a File"}, + Default: "Open an Editor", + Help: "Select Load data from file:", + } + err := survey.AskOne(loadFileSelectionPrompt, &loadFileOptions) + if err != nil { + return nil, err + } + switch loadFileOptions { + case "Open an Editor": + dataFromEditor := "" + promptDataFromEditor := &survey.Editor{ + Message: "Copy & Paste data to editor:", + Default: "", + Help: "Copy & Paste data to editor:", + } + err := survey.AskOne(promptDataFromEditor, &dataFromEditor) + if err != nil { + return nil, err + } + return []byte(dataFromEditor), nil + case "Open a File": + dataFileName := "" + promptDataFileName := &survey.Input{ + Message: "Enter Filename to load:", + Default: "", + Help: "Enter Filename to load:", + } + err := survey.AskOne(promptDataFileName, &dataFileName) + if err != nil { + return nil, err + } + data, err := ioutil.ReadFile(dataFileName) + if err != nil { + return nil, err + } + return data, nil + default: + return nil, fmt.Errorf("invalid selection") + } +}