cmd/client/command/list.go (106 lines of code) (raw):
/*
* 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 command
import (
"fmt"
"strings"
"github.com/spf13/cobra"
)
var listOptions struct {
namespace string
cluster string
}
var ListCommand = &cobra.Command{
Use: "list",
Short: "Display all resources",
Example: `
# Display all namespaces
kvctl list namespaces
# Display all clusters in the namespace
kvctl list clusters -n <namespace>
# Display all nodes in the cluster
kvctl list nodes -n <namespace> -c <cluster>
`,
ValidArgs: []string{"namespaces", "clusters", "shards", "nodes"},
RunE: func(cmd *cobra.Command, args []string) error {
host, _ := cmd.Flags().GetString("host")
client := newClient(host)
switch strings.ToLower(args[0]) {
case "namespaces":
return listNamespace(client)
case "clusters":
return listClusters(client)
default:
return fmt.Errorf("unsupported resource type %s", args[0])
}
},
PreRunE: listPreRun,
SilenceUsage: true,
SilenceErrors: true,
}
func listPreRun(_ *cobra.Command, args []string) error {
if len(args) == 0 {
return fmt.Errorf("missing resource type, please specify one of [namespaces, clusters, nodes]")
}
resource := strings.ToLower(args[0])
if resource == "namespaces" {
return nil
}
if listOptions.namespace == "" {
return fmt.Errorf("missing namespace, please specify the namespace via -n or --namespace option")
}
if resource == "nodes" && listOptions.cluster == "" {
return fmt.Errorf("missing cluster, please specify the cluster via -c or --cluster option")
}
return nil
}
func listNamespace(cli *client) error {
rsp, err := cli.restyCli.R().Get("/namespaces")
if err != nil {
return err
}
if rsp.IsError() {
return unmarshalError(rsp.Body())
}
var result struct {
Namespaces []string `json:"namespaces"`
}
if err := unmarshalData(rsp.Body(), &result); err != nil {
return err
}
if len(result.Namespaces) == 0 {
printLine("no namespace found.")
return nil
}
for _, ns := range result.Namespaces {
printLine(ns)
}
return nil
}
func listClusters(cli *client) error {
rsp, err := cli.restyCli.R().
SetPathParam("namespace", listOptions.namespace).
Get("/namespaces/{namespace}/clusters")
if err != nil {
return err
}
if rsp.IsError() {
return unmarshalError(rsp.Body())
}
var result struct {
Clusters []string `json:"clusters"`
}
if err := unmarshalData(rsp.Body(), &result); err != nil {
return err
}
if len(result.Clusters) == 0 {
printLine("no cluster found.")
return nil
}
for _, cluster := range result.Clusters {
printLine(cluster)
}
return nil
}
func init() {
ListCommand.Flags().StringVarP(&listOptions.namespace, "namespace", "n", "", "The namespace")
ListCommand.Flags().StringVarP(&listOptions.cluster, "cluster", "c", "", "The cluster")
}