Commit 8d6f6f8c authored by barnettZQG's avatar barnettZQG
Browse files

merge webcli into api module

parent 524b9777
Showing with 53 additions and 127 deletions
+53 -127
......@@ -2,7 +2,6 @@ GO_LDFLAGS=-ldflags " -w"
VERSION=$(shell git symbolic-ref HEAD 2>/dev/null | cut -d"/" -f 3)
WORK_DIR=/go/src/github.com/goodrain/rainbond
BASE_NAME=rainbond
BASE_DOCKER=./hack/contrib/docker
default: help
all: image ## build linux binaries, build images for docker
......
......@@ -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)
......
......@@ -33,33 +33,8 @@ import (
"github.com/sirupsen/logrus"
)
//DockerConsole docker console
type DockerConsole struct {
socketproxy proxy.Proxy
}
var defaultDockerConsoleEndpoints = []string{"127.0.0.1:7171"}
var defaultEventLogEndpoints = []string{"local=>rbd-eventlog:6363"}
var dockerConsole *DockerConsole
//GetDockerConsole get Docker console
func GetDockerConsole() *DockerConsole {
if dockerConsole != nil {
return dockerConsole
}
dockerConsole = &DockerConsole{
socketproxy: proxy.CreateProxy("dockerconsole", "websocket", defaultDockerConsoleEndpoints),
}
discover.GetEndpointDiscover().AddProject("acp_webcli", dockerConsole.socketproxy)
return dockerConsole
}
//Get get
func (d DockerConsole) Get(w http.ResponseWriter, r *http.Request) {
d.socketproxy.Proxy(w, r)
}
var dockerLog *DockerLog
//DockerLog docker log
......
......@@ -22,6 +22,7 @@ import (
"context"
"crypto/tls"
"crypto/x509"
"fmt"
"io/ioutil"
"log"
"net/http"
......@@ -30,6 +31,7 @@ import (
"time"
"github.com/goodrain/rainbond/api/handler"
"github.com/goodrain/rainbond/api/webcli/app"
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promhttp"
"github.com/prometheus/common/version"
......@@ -65,17 +67,23 @@ type Manager struct {
prometheusProxy proxy.Proxy
etcdcli *clientv3.Client
exporter *metric.Exporter
websocketModuls map[string]CustomModule
}
type CustomModule interface {
SetRoute(*chi.Mux) error
}
//NewManager newManager
func NewManager(c option.Config, etcdcli *clientv3.Client) *Manager {
func NewManager(c option.Config, etcdcli *clientv3.Client, webapp *app.App) *Manager {
ctx, cancel := context.WithCancel(context.Background())
manager := &Manager{
ctx: ctx,
cancel: cancel,
conf: c,
stopChan: make(chan struct{}),
etcdcli: etcdcli,
ctx: ctx,
cancel: cancel,
conf: c,
stopChan: make(chan struct{}),
etcdcli: etcdcli,
websocketModuls: map[string]CustomModule{"webapp": webapp},
}
r := chi.NewRouter()
manager.r = r
......@@ -144,7 +152,7 @@ func (m *Manager) Stop() error {
}
//Run run
func (m *Manager) Run() {
func (m *Manager) Run() error {
v2R := &version2.V2{
Cfg: &m.conf,
}
......@@ -161,17 +169,22 @@ func (m *Manager) Run() {
m.r.Mount("/license", license.Routes())
//兼容老版docker
m.r.Get("/v1/etcd/event-log/instances", m.EventLogInstance)
m.r.Get("/kubernetes/dashboard", m.KuberntesDashboardAPI)
//prometheus单节点代理
m.r.Get("/api/v1/query", m.PrometheusAPI)
m.r.Get("/api/v1/query_range", m.PrometheusAPI)
//开启对浏览器的websocket服务和文件服务
//set websocket route
websocketRouter := chi.NewRouter()
websocketRouter.Mount("/", websocket.Routes())
websocketRouter.Mount("/logs", websocket.LogRoutes())
websocketRouter.Mount("/app", websocket.AppRoutes())
for _, c := range m.websocketModuls {
if err := c.SetRoute(websocketRouter); err != nil {
return fmt.Errorf("set websocket custom route failire %s", err.Error())
}
}
go func() {
websocketRouter := chi.NewRouter()
websocketRouter.Mount("/", websocket.Routes())
websocketRouter.Mount("/logs", websocket.LogRoutes())
websocketRouter.Mount("/app", websocket.AppRoutes())
if m.conf.WebsocketSSL {
logrus.Infof("websocket listen on (HTTPs) %s", m.conf.WebsocketAddr)
logrus.Fatal(http.ListenAndServeTLS(m.conf.WebsocketAddr, m.conf.WebsocketCertFile, m.conf.WebsocketKeyFile, websocketRouter))
......@@ -203,6 +216,7 @@ func (m *Manager) Run() {
}
logrus.Infof("api listen on (HTTP) %s", m.conf.APIAddr)
logrus.Fatal(http.ListenAndServe(m.conf.APIAddr, m.r))
return nil
}
//EventLogInstance 查询event server instance
......
......@@ -23,24 +23,20 @@ import (
"crypto/md5"
"encoding/hex"
"encoding/json"
"errors"
"fmt"
"net"
"net/http"
"strings"
"text/template"
"github.com/go-chi/chi"
"github.com/sirupsen/logrus"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/runtime/schema"
"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"
......@@ -92,11 +88,9 @@ var Version = "0.0.2"
//DefaultOptions -
var DefaultOptions = Options{
Address: "",
Port: "8080",
PermitWrite: true,
IndexFile: "",
TitleFormat: "GRTTY Command",
TitleFormat: "GRTTY Command For Component Instance",
EnableReconnect: true,
ReconnectTime: 10,
CloseSignal: 1, // syscall.SIGHUP
......@@ -138,57 +132,11 @@ func New(options *Options) (*App, error) {
}
//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...")
}()
func (app *App) SetRoute(route *chi.Mux) error {
route.Handle("/docker_console", http.HandlerFunc(app.handleWS))
return nil
}
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"})
}
func (app *App) handleWS(w http.ResponseWriter, r *http.Request) {
logrus.Printf("New client connected: %s", r.RemoteAddr)
......@@ -278,11 +226,6 @@ func (app *App) handleWS(w http.ResponseWriter, r *http.Request) {
}
}
//Exit -
func (app *App) Exit() (firstCall bool) {
return true
}
func (app *App) createKubeClient() error {
config, err := k8sutil.NewRestConfig(app.options.K8SConfPath)
if err != nil {
......@@ -360,21 +303,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))
......
File moved
File moved
File moved
......@@ -7,7 +7,7 @@ import (
// Metric name parts.
const (
// Namespace for all metrics.
namespace = "webcli"
namespace = "api"
// Subsystem(s).
exporter = "exporter"
)
......
......@@ -22,7 +22,7 @@ import (
"io"
"os"
"github.com/goodrain/rainbond/webcli/term"
"github.com/goodrain/rainbond/api/webcli/term"
"github.com/sirupsen/logrus"
)
......
File moved
File moved
File moved
File moved
File moved
File moved
File moved
File moved
......@@ -23,17 +23,17 @@ import (
"os"
"os/signal"
"syscall"
rainbondscheme "github.com/goodrain/rainbond/pkg/generated/clientset/versioned/scheme"
"github.com/goodrain/rainbond/api/controller"
"github.com/goodrain/rainbond/api/db"
"github.com/goodrain/rainbond/api/discover"
"github.com/goodrain/rainbond/api/handler"
"github.com/goodrain/rainbond/api/server"
"github.com/goodrain/rainbond/api/webcli/app"
"github.com/goodrain/rainbond/cmd/api/option"
"github.com/goodrain/rainbond/event"
"github.com/goodrain/rainbond/pkg/generated/clientset/versioned"
rainbondscheme "github.com/goodrain/rainbond/pkg/generated/clientset/versioned/scheme"
etcdutil "github.com/goodrain/rainbond/util/etcd"
k8sutil "github.com/goodrain/rainbond/util/k8s"
"github.com/goodrain/rainbond/worker/client"
......@@ -118,19 +118,30 @@ func Run(s *option.APIServer) error {
return err
}
//初始化 middleware
//init middleware
handler.InitProxy(s.Config)
//创建handle
//create handle
if err := handler.InitHandle(s.Config, etcdClientArgs, cli, etcdcli, clientset, rainbondClient, k8sClient); err != nil {
logrus.Errorf("init all handle error, %v", err)
return err
}
//创建v2Router manager
// webcli modul
option := app.DefaultOptions
option.K8SConfPath = s.Config.KubeConfigPath
cliapp, err := app.New(&option)
if err != nil {
logrus.Errorf("new webcli app failure %v", err)
return err
}
// create v2Router manager
if err := controller.CreateV2RouterManager(s.Config, cli); err != nil {
logrus.Errorf("create v2 route manager error, %v", err)
}
// 启动api
apiManager := server.NewManager(s.Config, etcdcli)
// start server listen
apiManager := server.NewManager(s.Config, etcdcli, cliapp)
if err := apiManager.Start(); err != nil {
return err
}
......@@ -138,7 +149,7 @@ func Run(s *option.APIServer) error {
logrus.Info("api router is running...")
//step finally: listen Signal
term := make(chan os.Signal)
term := make(chan os.Signal, 1)
signal.Notify(term, os.Interrupt, syscall.SIGTERM)
select {
case s := <-term:
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment