aboutsummaryrefslogtreecommitdiffstats
path: root/client/go/internal/admin/clusterstate/get_cluster_state.go
diff options
context:
space:
mode:
Diffstat (limited to 'client/go/internal/admin/clusterstate/get_cluster_state.go')
-rw-r--r--client/go/internal/admin/clusterstate/get_cluster_state.go77
1 files changed, 77 insertions, 0 deletions
diff --git a/client/go/internal/admin/clusterstate/get_cluster_state.go b/client/go/internal/admin/clusterstate/get_cluster_state.go
new file mode 100644
index 00000000000..505235a284e
--- /dev/null
+++ b/client/go/internal/admin/clusterstate/get_cluster_state.go
@@ -0,0 +1,77 @@
+// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+// code for the "vespa-get-cluster-state" command
+// Author: arnej
+
+// utilities to get and manipulate node states in a storage cluster
+package clusterstate
+
+import (
+ "fmt"
+ "os"
+
+ "github.com/fatih/color"
+ "github.com/spf13/cobra"
+ "github.com/vespa-engine/vespa/client/go/internal/admin/envvars"
+ "github.com/vespa-engine/vespa/client/go/internal/admin/trace"
+ "github.com/vespa-engine/vespa/client/go/internal/cli/build"
+)
+
+func NewGetClusterStateCmd() *cobra.Command {
+ var (
+ curOptions Options
+ )
+ cmd := &cobra.Command{
+ Use: "vespa-get-cluster-state [-h] [-v] [-f] [-c cluster]",
+ Short: "Get the cluster state of a given cluster.",
+ Long: `Usage: get-cluster-state [Options]`,
+ Version: build.Version,
+ Args: cobra.MaximumNArgs(0),
+ CompletionOptions: cobra.CompletionOptions{DisableDefaultCmd: true},
+ Run: func(cmd *cobra.Command, args []string) {
+ curOptions.NodeIndex = AllNodes
+ runGetClusterState(&curOptions)
+ },
+ }
+ addCommonOptions(cmd, &curOptions)
+ return cmd
+}
+
+func runGetClusterState(opts *Options) {
+ if opts.Silent {
+ trace.Silent()
+ }
+ if opts.NoColors || os.Getenv(envvars.TERM) == "" {
+ color.NoColor = true
+ }
+ trace.Debug("run getClusterState with: ", opts)
+ m := detectModel(opts)
+ trace.Debug("model:", m)
+ sss := m.findSelectedServices(opts)
+ clusters := make(map[string]*ClusterState)
+ for _, s := range sss {
+ trace.Debug("found service: ", s)
+ if clusters[s.cluster] == nil {
+ state, _ := m.getClusterState(s.cluster)
+ trace.Debug("cluster ", s.cluster, state)
+ clusters[s.cluster] = state
+ }
+ }
+ for k, v := range clusters {
+ globalState := v.State.Generated.State
+ if globalState == "up" {
+ fmt.Printf("Cluster %s:\n", k)
+ } else {
+ fmt.Printf("Cluster %s is %s. Too few nodes available.\n", k, color.HiRedString("%s", globalState))
+ }
+ for serviceType, serviceList := range v.Service {
+ for dn, dv := range serviceList.Node {
+ nodeState := dv.State.Generated.State
+ if nodeState == "up" {
+ fmt.Printf("%s/%s/%s: %v\n", k, serviceType, dn, nodeState)
+ } else {
+ fmt.Printf("%s/%s/%s: %v\n", k, serviceType, dn, color.HiRedString(nodeState))
+ }
+ }
+ }
+ }
+}