/
dash.go
executable file
·146 lines (121 loc) · 4.03 KB
/
dash.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
/*
Copyright (c) 2019 VMware, Inc. All Rights Reserved.
SPDX-License-Identifier: Apache-2.0
*/
package commands
import (
"context"
"flag"
"fmt"
golog "log"
"os"
"os/signal"
"github.com/spf13/cobra"
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
"k8s.io/client-go/tools/clientcmd"
"k8s.io/klog"
"github.com/kubenext/lissio/internal/dash"
"github.com/kubenext/lissio/internal/log"
)
func newLissioCmd() *cobra.Command {
var namespace string
var uiURL string
var kubeConfig string
var verboseLevel int
var enableOpenCensus bool
var initialContext string
var klogVerbosity int
var clientQPS float32
var clientBurst int
lissioCmd := &cobra.Command{
Use: "lissio",
Short: "lissio kubernetes dashboard",
Long: "lissio is a dashboard for high bandwidth cluster analysis operations",
Run: func(cmd *cobra.Command, args []string) {
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
// TODO enable support for klog
z, err := newZapLogger(verboseLevel)
if err != nil {
golog.Printf("failed to initialize logger: %v", err)
os.Exit(1)
}
defer func() {
// this fails, but it should be safe to ignore according
// to https://github.com/uber-go/zap/issues/328
_ = z.Sync()
}()
logger := log.Wrap(z.Sugar())
sigCh := make(chan os.Signal, 1)
signal.Notify(sigCh, os.Interrupt)
runCh := make(chan bool, 1)
shutdownCh := make(chan bool, 1)
go func() {
options := dash.Options{
EnableOpenCensus: enableOpenCensus,
KubeConfig: kubeConfig,
Namespace: namespace,
FrontendURL: uiURL,
Context: initialContext,
ClientQPS: clientQPS,
ClientBurst: clientBurst,
}
if klogVerbosity > 0 {
klog.InitFlags(nil)
verbosityOpt := fmt.Sprintf("-v=%d", klogVerbosity)
if err := flag.CommandLine.Parse([]string{verbosityOpt, "-logtostderr=true"}); err != nil {
logger.WithErr(err).Errorf("unable to parse klog flags")
}
}
if err := dash.Run(ctx, logger, shutdownCh, options); err != nil {
logger.WithErr(err).Errorf("dashboard failed")
os.Exit(1)
}
runCh <- true
}()
select {
case <-sigCh:
logger.Debugf("Shutting dashboard down due to interrupt")
cancel()
// TODO implement graceful shutdown semantics
<-shutdownCh
case <-runCh:
logger.Debugf("Dashboard has exited")
}
},
}
lissioCmd.Flags().StringVarP(&namespace, "namespace", "n", "", "initial namespace")
lissioCmd.Flags().StringVar(&uiURL, "ui-url", "", "dashboard url")
lissioCmd.Flags().CountVarP(&verboseLevel, "verbosity", "v", "verbosity level")
lissioCmd.Flags().BoolVarP(&enableOpenCensus, "enable-opencensus", "c", false, "enable open census")
lissioCmd.Flags().StringVarP(&initialContext, "context", "", "", "initial context")
lissioCmd.Flags().IntVarP(&klogVerbosity, "klog-verbosity", "", 0, "klog verbosity level")
lissioCmd.Flags().Float32VarP(&clientQPS, "client-qps", "", 200, "maximum QPS for client")
lissioCmd.Flags().IntVarP(&clientBurst, "client-burst", "", 400, "maximum burst for client throttle")
kubeConfig = os.Getenv("KUBECONFIG")
if kubeConfig == "" {
kubeConfig = clientcmd.NewDefaultClientConfigLoadingRules().GetDefaultFilename()
}
lissioCmd.Flags().StringVar(&kubeConfig, "kubeconfig", kubeConfig, "absolute path to kubeConfig file")
return lissioCmd
}
// Returns a new zap logger, setting level according to the provided
// verbosity level as an offset of the base level, Info.
// i.e. verboseLevel==0, level==Info
// verboseLevel==1, level==Debug
func newZapLogger(verboseLevel int) (*zap.Logger, error) {
level := zapcore.InfoLevel - zapcore.Level(verboseLevel)
if level < zapcore.DebugLevel || level > zapcore.FatalLevel {
level = zapcore.DebugLevel
}
cfg := zap.Config{
Level: zap.NewAtomicLevelAt(level),
Development: true,
Encoding: "console",
EncoderConfig: zap.NewDevelopmentEncoderConfig(),
OutputPaths: []string{"stderr"},
ErrorOutputPaths: []string{"stderr"},
}
return cfg.Build()
}