From de7019c786646da3b4f2dfbb52ff94cd3f21da94 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=80=86=E6=B5=81=E8=80=8C=E4=B8=8A?= <1666888816@qq.com> Date: Thu, 6 Jun 2024 10:07:13 +0800 Subject: [PATCH 1/3] =?UTF-8?q?perf:=20remove=20webcli=20Signed-off-by:=20?= =?UTF-8?q?=E9=80=86=E6=B5=81=E8=80=8C=E4=B8=8A=20<1666888816@qq.com>?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/api_routers/websocket/websocket.go | 1 - api/controller/websocket.go | 13 ------------- cmd/api/option/option.go | 2 -- 3 files changed, 16 deletions(-) diff --git a/api/api_routers/websocket/websocket.go b/api/api_routers/websocket/websocket.go index 34bfffd475..41259af035 100644 --- a/api/api_routers/websocket/websocket.go +++ b/api/api_routers/websocket/websocket.go @@ -27,7 +27,6 @@ import ( // Routes routes func Routes() chi.Router { r := chi.NewRouter() - r.Get("/docker_console", controller.GetDockerConsole().Get) r.Get("/docker_log", controller.GetDockerLog().Get) r.Get("/monitor_message", controller.GetMonitorMessage().Get) r.Get("/new_monitor_message", controller.GetMonitorMessage().Get) diff --git a/api/controller/websocket.go b/api/controller/websocket.go index 1b2f4e2b3b..695532de11 100644 --- a/api/controller/websocket.go +++ b/api/controller/websocket.go @@ -38,19 +38,6 @@ type DockerConsole struct { socketproxy proxy.Proxy } -var dockerConsole *DockerConsole - -// GetDockerConsole get Docker console -func GetDockerConsole() *DockerConsole { - if dockerConsole != nil { - return dockerConsole - } - dockerConsole = &DockerConsole{ - socketproxy: proxy.CreateProxy("dockerconsole", "websocket", configs.Default().APIConfig.DockerConsoleServers), - } - return dockerConsole -} - // Get get func (d DockerConsole) Get(w http.ResponseWriter, r *http.Request) { d.socketproxy.Proxy(w, r) diff --git a/cmd/api/option/option.go b/cmd/api/option/option.go index 56618e0633..71f935a534 100644 --- a/cmd/api/option/option.go +++ b/cmd/api/option/option.go @@ -35,7 +35,6 @@ type Config struct { APIAddrSSL string DBConnectionInfo string EventLogServers []string - DockerConsoleServers []string EventLogEndpoints []string NodeAPI []string BuilderAPI []string @@ -114,7 +113,6 @@ func (a *APIServer) AddFlags(fs *pflag.FlagSet) { fs.BoolVar(&a.ShowSQL, "show-sql", false, "The trigger for showing sql.") fs.StringVar(&a.GrctlImage, "shell-image", "registry.cn-hangzhou.aliyuncs.com/goodrain/rbd-shell:v5.13.0-release", "use shell image") - fs.StringSliceVar(&a.DockerConsoleServers, "docker-console", []string{"rbd-webcli:7171"}, "docker console address") fs.StringVar(&a.PrometheusEndpoint, "prom-api", "rbd-monitor:9999", "The service DNS name of Prometheus api. Default to rbd-monitor:9999") fs.StringVar(&a.RbdHub, "hub-api", "http://rbd-hub:5000", "the rbd-hub server api") fs.StringSliceVar(&a.NodeAPI, "node-api", []string{"rbd-node:6100"}, "the rbd-node server api") From 2b89762c52f344b93c0f02cda6f0753839b74fa6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=80=86=E6=B5=81=E8=80=8C=E4=B8=8A?= <1666888816@qq.com> Date: Thu, 6 Jun 2024 11:04:14 +0800 Subject: [PATCH 2/3] =?UTF-8?q?perf:=20remove=20webcli=20Signed-off-by:=20?= =?UTF-8?q?=E9=80=86=E6=B5=81=E8=80=8C=E4=B8=8A=20<1666888816@qq.com>?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/api_routers/websocket/websocket.go | 1 + api/controller/websocket.go | 23 +++++ api/webcli/app/app.go | 114 ++---------------------- cmd/webcli/option/option.go | 73 --------------- cmd/webcli/server/server.go | 60 ------------- cmd/webcli/webcli.go | 44 --------- pkg/component/core.go | 6 -- pkg/component/webcli/webcliComponent.go | 55 ------------ 8 files changed, 33 insertions(+), 343 deletions(-) delete mode 100644 cmd/webcli/option/option.go delete mode 100644 cmd/webcli/server/server.go delete mode 100644 cmd/webcli/webcli.go delete mode 100644 pkg/component/webcli/webcliComponent.go diff --git a/api/api_routers/websocket/websocket.go b/api/api_routers/websocket/websocket.go index 41259af035..15efcf928e 100644 --- a/api/api_routers/websocket/websocket.go +++ b/api/api_routers/websocket/websocket.go @@ -27,6 +27,7 @@ import ( // Routes routes func Routes() chi.Router { r := chi.NewRouter() + r.Get("/docker_console", controller.GetWebCli().HandleWS) r.Get("/docker_log", controller.GetDockerLog().Get) r.Get("/monitor_message", controller.GetMonitorMessage().Get) r.Get("/new_monitor_message", controller.GetMonitorMessage().Get) diff --git a/api/controller/websocket.go b/api/controller/websocket.go index 695532de11..1b3d3d0d54 100644 --- a/api/controller/websocket.go +++ b/api/controller/websocket.go @@ -20,7 +20,9 @@ package controller import ( "context" + webcli "github.com/goodrain/rainbond/api/webcli/app" "github.com/goodrain/rainbond/config/configs" + "github.com/gorilla/websocket" "net/http" "os" "path" @@ -33,6 +35,27 @@ import ( "github.com/sirupsen/logrus" ) +var app *webcli.App + +func GetWebCli() *webcli.App { + if app == nil { + app = &webcli.App{} + app.SetUpgrader(&websocket.Upgrader{ + ReadBufferSize: 1024, + WriteBufferSize: 1024, + Subprotocols: []string{"webtty"}, + CheckOrigin: func(r *http.Request) bool { + return true + }, + }) + //create kube client and config + if err := app.CreateKubeClient(); err != nil { + logrus.Errorf("create kube client error: %v", err) + } + } + return app +} + // DockerConsole docker console type DockerConsole struct { socketproxy proxy.Proxy diff --git a/api/webcli/app/app.go b/api/webcli/app/app.go index 7ad8422fb5..022d080507 100644 --- a/api/webcli/app/app.go +++ b/api/webcli/app/app.go @@ -23,25 +23,18 @@ import ( "crypto/md5" "encoding/hex" "encoding/json" - "errors" "fmt" - "net" - "net/http" - "strings" - "text/template" - "github.com/sirupsen/logrus" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" + "net/http" + "strings" "github.com/barnettZQG/gotty/server" "github.com/barnettZQG/gotty/webtty" httputil "github.com/goodrain/rainbond/util/http" k8sutil "github.com/goodrain/rainbond/util/k8s" "github.com/gorilla/websocket" - "github.com/prometheus/client_golang/prometheus" - "github.com/prometheus/client_golang/prometheus/promhttp" - "github.com/yudai/umutex" api "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime/serializer" @@ -58,13 +51,7 @@ var ExecuteCommandFailed float64 // App - type App struct { - options *Options - - upgrader *websocket.Upgrader - - titleTemplate *template.Template - - onceMutex *umutex.UnblockingMutex + upgrader *websocket.Upgrader restClient *restclient.RESTClient coreClient *kubernetes.Clientset config *restclient.Config @@ -87,9 +74,6 @@ type Options struct { K8SConfPath string } -// Version - -var Version = "0.0.2" - // DefaultOptions - var DefaultOptions = Options{ Address: "", @@ -113,68 +97,9 @@ type InitMessage struct { Namespace string `json:"namespace"` } -func checkSameOrigin(r *http.Request) bool { - return true -} - -// New - -func New(options *Options) (*App, error) { - titleTemplate, _ := template.New("title").Parse(options.TitleFormat) - app := &App{ - options: options, - upgrader: &websocket.Upgrader{ - ReadBufferSize: 1024, - WriteBufferSize: 1024, - Subprotocols: []string{"webtty"}, - CheckOrigin: checkSameOrigin, - }, - titleTemplate: titleTemplate, - onceMutex: umutex.New(), - } - //create kube client and config - if err := app.createKubeClient(); err != nil { - return nil, err - } - return app, nil -} - -// Run Run -func (app *App) Run() error { - - endpoint := net.JoinHostPort(app.options.Address, app.options.Port) - - wsHandler := http.HandlerFunc(app.handleWS) - health := http.HandlerFunc(app.healthCheck) - - var siteMux = http.NewServeMux() - - siteHandler := http.Handler(siteMux) - - siteHandler = wrapHeaders(siteHandler) - - exporter := NewExporter() - prometheus.MustRegister(exporter) - - wsMux := http.NewServeMux() - wsMux.Handle("/", siteHandler) - wsMux.Handle("/docker_console", wsHandler) - wsMux.Handle("/health", health) - wsMux.Handle("/metrics", promhttp.Handler()) - - siteHandler = http.Handler(wsMux) - - siteHandler = wrapLogger(siteHandler) - - server, err := app.makeServer(endpoint, &siteHandler) - if err != nil { - return errors.New("Failed to build server: " + err.Error()) - } - go func() { - logrus.Printf("webcli listen %s", endpoint) - logrus.Fatal(server.ListenAndServe()) - logrus.Printf("Exiting...") - }() - return nil +// SetUpgrader - +func (app *App) SetUpgrader(u *websocket.Upgrader) { + app.upgrader = u } func (app *App) makeServer(addr string, handler *http.Handler) (*http.Server, error) { @@ -190,7 +115,7 @@ func (app *App) healthCheck(w http.ResponseWriter, r *http.Request) { httputil.ReturnSuccess(r, w, map[string]string{"status": "health", "info": "webcli service health"}) } -func (app *App) handleWS(w http.ResponseWriter, r *http.Request) { +func (app *App) HandleWS(w http.ResponseWriter, r *http.Request) { logrus.Printf("New client connected: %s", r.RemoteAddr) if r.Method != "GET" { @@ -281,14 +206,8 @@ func (app *App) handleWS(w http.ResponseWriter, r *http.Request) { return } } - -// Exit - -func (app *App) Exit() (firstCall bool) { - return true -} - -func (app *App) createKubeClient() error { - config, err := k8sutil.NewRestConfig(app.options.K8SConfPath) +func (app *App) CreateKubeClient() error { + config, err := k8sutil.NewRestConfig("") if err != nil { return err } @@ -364,21 +283,6 @@ func (app *App) NewRequest(podName, namespace, containerName string, command []s return req } -func wrapLogger(handler http.Handler) http.Handler { - return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - rw := &responseWrapper{w, 200} - handler.ServeHTTP(rw, r) - logrus.Printf("%s %d %s %s", r.RemoteAddr, rw.status, r.Method, r.URL.Path) - }) -} - -func wrapHeaders(handler http.Handler) http.Handler { - return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Server", "GoTTY/"+Version) - handler.ServeHTTP(w, r) - }) -} - func md5Func(str string) string { h := md5.New() h.Write([]byte(str)) diff --git a/cmd/webcli/option/option.go b/cmd/webcli/option/option.go deleted file mode 100644 index e95e7b70ad..0000000000 --- a/cmd/webcli/option/option.go +++ /dev/null @@ -1,73 +0,0 @@ -// Copyright (C) 2014-2018 Goodrain Co., Ltd. -// RAINBOND, Application Management Platform - -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. For any non-GPL usage of Rainbond, -// one or multiple Commercial Licenses authorized by Goodrain Co., Ltd. -// must be obtained first. - -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -package option - -import ( - "fmt" - - "github.com/sirupsen/logrus" - "github.com/spf13/pflag" -) - -// Config config server -type Config struct { - EtcdEndPoints []string - EtcdCaFile string - EtcdCertFile string - EtcdKeyFile string - Address string - HostIP string - HostName string - Port int - SessionKey string - PrometheusMetricPath string - K8SConfPath string -} - -// WebCliServer container webcli server -type WebCliServer struct { - Config - LogLevel string -} - -// NewWebCliServer new server -func NewWebCliServer() *WebCliServer { - return &WebCliServer{} -} - -// AddFlags config -func (a *WebCliServer) AddFlags(fs *pflag.FlagSet) { - fs.StringVar(&a.LogLevel, "log-level", "info", "the webcli log level") - fs.StringVar(&a.Address, "address", "0.0.0.0", "server listen address") - fs.StringVar(&a.HostIP, "hostIP", "", "Current node Intranet IP") - fs.StringVar(&a.HostName, "hostName", "", "Current node host name") - fs.StringVar(&a.K8SConfPath, "kube-conf", "", "absolute path to the kubeconfig file") - fs.IntVar(&a.Port, "port", 7171, "server listen port") - fs.StringVar(&a.PrometheusMetricPath, "metric", "/metrics", "prometheus metrics path") -} - -// SetLog 设置log -func (a *WebCliServer) SetLog() { - level, err := logrus.ParseLevel(a.LogLevel) - if err != nil { - fmt.Println("set log level error." + err.Error()) - return - } - logrus.SetLevel(level) -} diff --git a/cmd/webcli/server/server.go b/cmd/webcli/server/server.go deleted file mode 100644 index 936de32fb4..0000000000 --- a/cmd/webcli/server/server.go +++ /dev/null @@ -1,60 +0,0 @@ -// Copyright (C) 2014-2018 Goodrain Co., Ltd. -// RAINBOND, Application Management Platform - -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. For any non-GPL usage of Rainbond, -// one or multiple Commercial Licenses authorized by Goodrain Co., Ltd. -// must be obtained first. - -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -package server - -import ( - "github.com/goodrain/rainbond/api/webcli/app" - "os" - "os/signal" - "strconv" - "syscall" - - "github.com/goodrain/rainbond/cmd/webcli/option" - "github.com/sirupsen/logrus" -) - -// Run start run -func Run(s *option.WebCliServer) error { - errChan := make(chan error) - option := app.DefaultOptions - option.Address = s.Address - option.Port = strconv.Itoa(s.Port) - option.SessionKey = s.SessionKey - option.K8SConfPath = s.K8SConfPath - ap, err := app.New(&option) - if err != nil { - return err - } - err = ap.Run() - if err != nil { - return err - } - defer ap.Exit() - //step finally: listen Signal - term := make(chan os.Signal) - signal.Notify(term, os.Interrupt, syscall.SIGTERM) - select { - case <-term: - logrus.Warn("Received SIGTERM, exiting gracefully...") - case err := <-errChan: - logrus.Errorf("Received a error %s, exiting gracefully...", err.Error()) - } - logrus.Info("See you next time!") - return nil -} diff --git a/cmd/webcli/webcli.go b/cmd/webcli/webcli.go deleted file mode 100644 index 4da25ea236..0000000000 --- a/cmd/webcli/webcli.go +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright (C) 2014-2018 Goodrain Co., Ltd. -// RAINBOND, Application Management Platform - -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. For any non-GPL usage of Rainbond, -// one or multiple Commercial Licenses authorized by Goodrain Co., Ltd. -// must be obtained first. - -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -package main - -import ( - "fmt" - "os" - - "github.com/goodrain/rainbond/cmd" - "github.com/goodrain/rainbond/cmd/webcli/option" - "github.com/goodrain/rainbond/cmd/webcli/server" - - "github.com/spf13/pflag" -) - -func main() { - if len(os.Args) > 1 && os.Args[1] == "version" { - cmd.ShowVersion("webcli") - } - s := option.NewWebCliServer() - s.AddFlags(pflag.CommandLine) - pflag.Parse() - s.SetLog() - if err := server.Run(s); err != nil { - fmt.Fprintf(os.Stderr, "error: %v\n", err) - os.Exit(1) - } -} diff --git a/pkg/component/core.go b/pkg/component/core.go index 01bb803a69..5f92a10a2a 100644 --- a/pkg/component/core.go +++ b/pkg/component/core.go @@ -34,7 +34,6 @@ import ( "github.com/goodrain/rainbond/pkg/component/k8s" "github.com/goodrain/rainbond/pkg/component/mq" "github.com/goodrain/rainbond/pkg/component/prom" - "github.com/goodrain/rainbond/pkg/component/webcli" "github.com/goodrain/rainbond/pkg/rainbond" "github.com/sirupsen/logrus" "time" @@ -141,8 +140,3 @@ func MQGrpcServer() rainbond.ComponentCancel { func MQClient() rainbond.Component { return mqclient.New() } - -// WebCli - -func WebCli() rainbond.Component { - return webcli.New() -} diff --git a/pkg/component/webcli/webcliComponent.go b/pkg/component/webcli/webcliComponent.go deleted file mode 100644 index 152a13b437..0000000000 --- a/pkg/component/webcli/webcliComponent.go +++ /dev/null @@ -1,55 +0,0 @@ -package webcli - -import ( - "context" - "github.com/goodrain/rainbond/api/webcli/app" - "github.com/goodrain/rainbond/cmd/webcli/option" - "github.com/goodrain/rainbond/pkg/gogo" - "github.com/spf13/pflag" - "strconv" - - "github.com/goodrain/rainbond/config/configs" -) - -var defaultWebCliComponent *Component - -// Component - -type Component struct { - app *app.App -} - -func (c *Component) Start(ctx context.Context, cfg *configs.Config) error { - _ = gogo.Go(func(ctx context.Context) error { - s := option.NewWebCliServer() - s.AddFlags(pflag.CommandLine) - pflag.Parse() - s.SetLog() - option := app.DefaultOptions - option.Address = s.Address - option.Port = strconv.Itoa(s.Port) - option.SessionKey = s.SessionKey - option.K8SConfPath = s.K8SConfPath - ap, err := app.New(&option) - c.app = ap - if err != nil { - return err - } - return ap.Run() - }) - return nil -} - -func (c *Component) CloseHandle() { - c.app.Exit() -} - -// New - -func New() *Component { - defaultWebCliComponent = &Component{} - return defaultWebCliComponent -} - -// Default - -func Default() *Component { - return defaultWebCliComponent -} From 084a71b78d0cb0ee7ea19672213f04231cbe8d7b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=80=86=E6=B5=81=E8=80=8C=E4=B8=8A?= <1666888816@qq.com> Date: Thu, 6 Jun 2024 11:35:39 +0800 Subject: [PATCH 3/3] =?UTF-8?q?perf:=20remove=20webcli=20Signed-off-by:=20?= =?UTF-8?q?=E9=80=86=E6=B5=81=E8=80=8C=E4=B8=8A=20<1666888816@qq.com>?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/webcli/app/app.go | 15 +---------- api/webcli/cmd/main.go | 57 ------------------------------------------ 2 files changed, 1 insertion(+), 71 deletions(-) delete mode 100644 api/webcli/cmd/main.go diff --git a/api/webcli/app/app.go b/api/webcli/app/app.go index 022d080507..aeedaa9cd9 100644 --- a/api/webcli/app/app.go +++ b/api/webcli/app/app.go @@ -32,7 +32,6 @@ import ( "github.com/barnettZQG/gotty/server" "github.com/barnettZQG/gotty/webtty" - httputil "github.com/goodrain/rainbond/util/http" k8sutil "github.com/goodrain/rainbond/util/k8s" "github.com/gorilla/websocket" api "k8s.io/api/core/v1" @@ -102,19 +101,7 @@ func (app *App) SetUpgrader(u *websocket.Upgrader) { app.upgrader = u } -func (app *App) makeServer(addr string, handler *http.Handler) (*http.Server, error) { - server := &http.Server{ - Addr: addr, - Handler: *handler, - } - - return server, nil -} - -func (app *App) healthCheck(w http.ResponseWriter, r *http.Request) { - httputil.ReturnSuccess(r, w, map[string]string{"status": "health", "info": "webcli service health"}) -} - +// HandleWS - func (app *App) HandleWS(w http.ResponseWriter, r *http.Request) { logrus.Printf("New client connected: %s", r.RemoteAddr) diff --git a/api/webcli/cmd/main.go b/api/webcli/cmd/main.go deleted file mode 100644 index 33f3a6a3a9..0000000000 --- a/api/webcli/cmd/main.go +++ /dev/null @@ -1,57 +0,0 @@ -package main - -import ( - "fmt" - "github.com/goodrain/rainbond-operator/util/constants" - app2 "github.com/goodrain/rainbond/api/webcli/app" - utils "github.com/goodrain/rainbond/util" - k8sutil "github.com/goodrain/rainbond/util/k8s" - "github.com/sirupsen/logrus" - restclient "k8s.io/client-go/rest" -) - -func main() { - option := app2.DefaultOptions - option.K8SConfPath = "/root/.kube/config" - config, err := k8sutil.NewRestConfig(option.K8SConfPath) - if err != nil { - logrus.Error(err) - } - config.UserAgent = "rainbond/webcli" - app2.SetConfigDefaults(config) - restClient, err := restclient.RESTClientFor(config) - if err != nil { - logrus.Error(err) - } - namespace := utils.GetenvDefault("RBD_NAMESPACE", constants.Namespace) - commands := []string{"sh"} - req := restClient.Post(). - Resource("pods"). - Name("rainbond-operator-0"). - Namespace(namespace). - SubResource("exec"). - Param("container", "operator"). - Param("stdin", "true"). - Param("stdout", "true"). - Param("tty", "true") - for _, c := range commands { - req.Param("command", c) - } - - slave, err := app2.NewExecContext(req, config) - if err != nil { - logrus.Error(err) - return - } - slave.ResizeTerminal(100, 60) - defer slave.Close() - for { - buffer := make([]byte, 1024) - n, err := slave.Read(buffer) - if err != nil { - logrus.Error(err) - return - } - fmt.Print(string(buffer[:n])) - } -}