| // Licensed to the Apache Software Foundation (ASF) under one |
| // or more contributor license agreements. See the NOTICE file |
| // distributed with this work for additional information |
| // regarding copyright ownership. The ASF licenses this file |
| // to you under the Apache License, Version 2.0 (the |
| // "License"); you may not use this file except in compliance |
| // with the License. You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, |
| // software distributed under the License is distributed on an |
| // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| // KIND, either express or implied. See the License for the |
| // specific language governing permissions and limitations |
| // under the License. |
| package get |
| |
| import ( |
| "encoding/json" |
| "fmt" |
| "github.com/apache/doris-operator/pkg/common/cmd/templates" |
| cmdtypes "github.com/apache/doris-operator/pkg/common/cmd/types" |
| "github.com/apache/doris-operator/pkg/common/cmd/util" |
| "github.com/spf13/cobra" |
| "github.com/tidwall/gjson" |
| "io" |
| "strings" |
| ) |
| |
| // GetOptions contains the input to the get command. |
| type GetOptions struct { |
| out io.Writer |
| CmdParent string |
| dc *cmdutil.DorisConfig |
| OutputFormat string |
| } |
| |
| // NewGetOptions returns GetOptions. |
| func NewGetOptions(parent string, dc *cmdutil.DorisConfig, out io.Writer) *GetOptions { |
| return &GetOptions{ |
| CmdParent: parent, |
| out: out, |
| dc: dc, |
| } |
| } |
| |
| // Run performs the get operation from doris. |
| func (o *GetOptions) Run(args []string) { |
| if len(args) != 2 { |
| fmt.Fprintf(o.out, "You must specify the type of resource to get. %s\n", cmdutil.SuggestAPIResources(o.CmdParent)) |
| return |
| } |
| |
| metaType := args[0] |
| node := args[1] |
| switch metaType { |
| case "node": |
| o.getNode(node) |
| return |
| case "computegroup": |
| |
| default: |
| fmt.Fprintf(o.out, "The type %s not supported.\n", metaType) |
| return |
| } |
| } |
| |
| func (o *GetOptions) getComputeGroup(computeGroupName string) { |
| |
| } |
| |
| // getNode get the node details information. |
| func (o *GetOptions) getNode(node string) { |
| c, err := cmdutil.NewDorisClient(o.dc) |
| if err != nil { |
| fmt.Fprintf(o.out, "%s\n", err.Error()) |
| return |
| } |
| |
| frontends, err := c.ShowFrontends() |
| if err != nil { |
| fmt.Fprintf(o.out, "%s\n", err.Error()) |
| return |
| } |
| for _, f := range frontends { |
| if f.Host == node { |
| o.print(f) |
| return |
| } |
| } |
| |
| backends, err := c.ShowBackends() |
| if err != nil { |
| fmt.Fprintf(o.out, "%s\n", err.Error()) |
| return |
| } |
| |
| for _, b := range backends { |
| if b.Host == node { |
| o.print(b) |
| return |
| } |
| } |
| } |
| |
| func (o *GetOptions) print(i interface{}) { |
| bytes, err := json.Marshal(i) |
| if err != nil { |
| fmt.Fprintf(o.out, "%s\n", err.Error()) |
| return |
| } |
| |
| if strings.Contains(o.OutputFormat, "custom-columns") { |
| a := strings.Split(o.OutputFormat, "=") |
| if len(a) != 2 { |
| fmt.Fprintf(o.out, "custom-columns not follow the format \"custom-columns=tags.compute_group_name\"%s\n", o.OutputFormat) |
| return |
| } |
| |
| column := a[1] |
| //the tag is string, unmarshal to struct. |
| if strings.Contains(column, "tag") { |
| b := i.(*cmdtypes.Backend) |
| tv := b.Tag |
| var t cmdtypes.Tag |
| err := json.Unmarshal([]byte(tv), &t) |
| if err != nil { |
| fmt.Fprintf(o.out, "unmarshal tag failed,%s\n", err.Error()) |
| return |
| } |
| subColumn, _ := strings.CutPrefix(column, "tag.") |
| if subColumn != "" { |
| t_str, _ := json.Marshal(&t) |
| subV := gjson.GetBytes(t_str, subColumn) |
| fmt.Fprintf(o.out, "%s\n", subV) |
| return |
| } |
| } else { |
| v := gjson.GetBytes(bytes, column) |
| fmt.Fprintf(o.out, "%s\n", v.String()) |
| } |
| return |
| } |
| |
| f_bytes, err := json.MarshalIndent(i, "", " ") |
| if err != nil { |
| fmt.Fprintf(o.out, "%s\n", err.Error()) |
| return |
| } |
| fmt.Fprintf(o.out, "%s\n", f_bytes) |
| } |
| |
| var ( |
| getLong = templates.LongDesc(` |
| Display one or many resource's meta information. |
| |
| Prints a table of the most information about the specified resources. |
| `) |
| |
| getExample = templates.Examples(` |
| # get compute group name. |
| dorisctl get backend xxx -o custom-columns=tags.compute_group_name |
| `) |
| ) |
| |
| // NewCmdGet creates a command object for the generic "get" action. |
| func NewCmdGet(parent string, dc *cmdutil.DorisConfig, out io.Writer) *cobra.Command { |
| o := NewGetOptions(parent, dc, out) |
| cmd := &cobra.Command{ |
| Use: fmt.Sprintf("get [(-o|--output=)%s] (TYPE[.GROUP][.VERSION] [NAME| -l label]) [flags]", "json|yaml"), |
| DisableFlagsInUseLine: true, |
| Short: "Display one or many resources.", |
| Long: getLong + "\n\n" + cmdutil.SuggestAPIResources(parent), |
| Example: getExample, |
| Run: func(_ *cobra.Command, args []string) { |
| o.Run(args) |
| }, |
| } |
| |
| cmd.Flags().StringVarP(&o.OutputFormat, "output", "o", o.OutputFormat, "output format.") |
| |
| return cmd |
| } |