create reverseproxy

This commit is contained in:
Tan Jiang 2017-05-02 19:14:47 +08:00
parent e8e7f66e91
commit 785298e6b9
7 changed files with 87 additions and 5 deletions

View File

@ -52,7 +52,7 @@ http {
}
location /v2/ {
proxy_pass http://registry/v2/;
proxy_pass http://ui/registryproxy/v2/;
proxy_set_header Host $$http_host;
proxy_set_header X-Real-IP $$remote_addr;
proxy_set_header X-Forwarded-For $$proxy_add_x_forwarded_for;
@ -62,7 +62,6 @@ http {
proxy_buffering off;
proxy_request_buffering off;
}
location /service/ {

View File

@ -71,7 +71,7 @@ http {
}
location /v2/ {
proxy_pass http://registry/v2/;
proxy_pass http://ui/registryproxy/v2/;
proxy_set_header Host $$http_host;
proxy_set_header X-Real-IP $$remote_addr;
proxy_set_header X-Forwarded-For $$proxy_add_x_forwarded_for;
@ -81,7 +81,6 @@ http {
proxy_buffering off;
proxy_request_buffering off;
}
location /service/ {

View File

@ -25,10 +25,10 @@ import (
"strings"
"github.com/astaxie/beego"
//"github.com/dghubble/sling"
"github.com/stretchr/testify/assert"
"github.com/vmware/harbor/src/common/utils/log"
"github.com/vmware/harbor/src/ui/config"
"github.com/vmware/harbor/src/ui/proxy"
)
//const (
@ -48,6 +48,10 @@ func init() {
log.Fatalf("failed to initialize configurations: %v", err)
}
if err := proxy.Init(); err != nil {
log.Fatalf("Failed to initialize the proxy: %v", err)
}
_, file, _, _ := runtime.Caller(1)
apppath, _ := filepath.Abs(filepath.Dir(filepath.Join(file, ".."+string(filepath.Separator))))
beego.BConfig.WebConfig.Session.SessionOn = true
@ -61,6 +65,7 @@ func init() {
beego.Router("/reset", &CommonController{}, "post:ResetPassword")
beego.Router("/userExists", &CommonController{}, "post:UserExists")
beego.Router("/sendEmail", &CommonController{}, "get:SendEmail")
beego.Router("/registryproxy/*", &RegistryProxy{}, "*:Handle")
//Init user Info
//admin = &usrInfo{adminName, adminPwd}
@ -106,4 +111,8 @@ func TestMain(t *testing.T) {
beego.BeeApp.Handlers.ServeHTTP(w, r)
assert.Equal(int(400), w.Code, "'/sendEmail' httpStatusCode should be 400")
r, _ = http.NewRequest("GET", "/registryproxy/v2/", nil)
w = httptest.NewRecorder()
beego.BeeApp.Handlers.ServeHTTP(w, r)
assert.Equal(int(200), w.Code, "ping v2 should get a 200 response")
}

View File

@ -0,0 +1,27 @@
package controllers
import (
"strings"
"github.com/astaxie/beego"
"github.com/vmware/harbor/src/ui/proxy"
)
// RegistryProxy is the endpoint on UI for a reverse proxy pointing to registry
type RegistryProxy struct {
beego.Controller
}
// Handle is the only entrypoint for incoming requests, all requests must go through this func.
func (p *RegistryProxy) Handle() {
req := p.Ctx.Request
rw := p.Ctx.ResponseWriter
req.URL.Path = strings.TrimPrefix(req.URL.Path, proxy.RegistryProxyPrefix)
//TODO interceptors
proxy.Proxy.ServeHTTP(rw, req)
}
// Render ...
func (p *RegistryProxy) Render() error {
return nil
}

View File

@ -31,6 +31,7 @@ import (
_ "github.com/vmware/harbor/src/ui/auth/ldap"
"github.com/vmware/harbor/src/ui/config"
"github.com/vmware/harbor/src/ui/filter"
"github.com/vmware/harbor/src/ui/proxy"
"github.com/vmware/harbor/src/ui/service/token"
)
@ -103,5 +104,8 @@ func main() {
if err := api.SyncRegistry(); err != nil {
log.Error(err)
}
log.Info("Init proxy")
proxy.Init()
//go proxy.StartProxy()
beego.Run()
}

42
src/ui/proxy/proxy.go Normal file
View File

@ -0,0 +1,42 @@
package proxy
import (
"github.com/vmware/harbor/src/ui/config"
"fmt"
"net/http/httputil"
"net/url"
)
// Proxy is the instance of the reverse proxy in this package.
var Proxy *httputil.ReverseProxy
// RegistryProxyPrefix is the prefix of url on UI.
const RegistryProxyPrefix = "/registryproxy"
// Init initialize the Proxy instance.
func Init(urls ...string) error {
var err error
var registryURL string
if len(urls) > 1 {
return fmt.Errorf("the parm, urls should have only 0 or 1 elements")
}
if len(urls) == 0 {
registryURL, err = config.RegistryURL()
if err != nil {
return err
}
} else {
registryURL = urls[0]
}
targetURL, err := url.Parse(registryURL)
if err != nil {
return err
}
Proxy = httputil.NewSingleHostReverseProxy(targetURL)
return nil
}
//func StartProxy(registryURL string) {
//http.ListenAndServe(":5000", Proxy)
//}

View File

@ -107,6 +107,8 @@ func initRouters() {
beego.Router("/service/notifications", &service.NotificationHandler{})
beego.Router("/service/token", &token.Handler{})
beego.Router("/registryproxy/*", &controllers.RegistryProxy{}, "*:Handle")
//Error pages
beego.ErrorController(&controllers.ErrorController{})
}