You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@servicecomb.apache.org by GitBox <gi...@apache.org> on 2018/05/09 02:07:01 UTC

[GitHub] little-cui closed pull request #343: SCB-561 Support ipv6

little-cui closed pull request #343: SCB-561 Support ipv6
URL: https://github.com/apache/incubator-servicecomb-service-center/pull/343
 
 
   

This is a PR merged from a forked repository.
As GitHub hides the original diff on merge, it is displayed below for
the sake of provenance:

As this is a foreign pull request (from a fork), the diff is supplied
below (as it won't show otherwise due to GitHub magic):

diff --git a/etc/conf/app.conf b/etc/conf/app.conf
index c2e7e880..df25c30f 100644
--- a/etc/conf/app.conf
+++ b/etc/conf/app.conf
@@ -26,6 +26,9 @@ frontend_host_port = 30103
 ###################################################################
 # sever options
 ###################################################################
+# if you want to listen at ipv6 address, then set the httpaddr value like:
+# httpaddr = 2400:A480:AAAA:200::159        (global scope)
+# httpaddr = fe80::f816:3eff:fe17:c38b%eth0 (link-local scope)
 httpaddr = 127.0.0.1
 httpport = 30100
 
diff --git a/frontend/main.go b/frontend/main.go
index dc5a9a30..237b9ff5 100644
--- a/frontend/main.go
+++ b/frontend/main.go
@@ -21,6 +21,8 @@ import (
 	"fmt"
 
 	"github.com/astaxie/beego"
+	"net"
+	"net/url"
 )
 
 type Config struct {
@@ -40,8 +42,8 @@ func main() {
 	flag.Parse()
 
 	cfg := Config{}
-	cfg.scAddr = fmt.Sprintf("http://%s:%d", scIp, scPort)
-	cfg.frontendAddr = fmt.Sprintf("%s:%d", frontendIp, *port)
+	cfg.scAddr = fmt.Sprintf("http://%s/", net.JoinHostPort(url.PathEscape(scIp), fmt.Sprint(scPort)))
+	cfg.frontendAddr = net.JoinHostPort(frontendIp, fmt.Sprint(*port))
 
 	// run frontend web server
 	Serve(cfg)
diff --git a/pkg/util/net.go b/pkg/util/net.go
index 457f9b62..777a96d4 100644
--- a/pkg/util/net.go
+++ b/pkg/util/net.go
@@ -55,11 +55,7 @@ func ParseEndpoint(ep string) (string, error) {
 	if err != nil {
 		return "", err
 	}
-	port := u.Port()
-	if len(port) > 0 {
-		return u.Hostname() + ":" + port, nil
-	}
-	return u.Hostname(), nil
+	return u.Host, nil
 }
 
 func ParseIpPort(addr string) IpPort {
diff --git a/pkg/util/net_test.go b/pkg/util/net_test.go
index e4d41b84..0116f3db 100644
--- a/pkg/util/net_test.go
+++ b/pkg/util/net_test.go
@@ -60,10 +60,37 @@ func TestInetNtoa(t *testing.T) {
 func TestParseIpPort(t *testing.T) {
 	ipPort := ParseIpPort("0.0.0.0")
 	if ipPort.IP != "0.0.0.0" || ipPort.Port != 0 {
-		t.Fatalf("ParseIpPort(0.0.0.0) error", n3)
+		t.Fatalf("ParseIpPort(0.0.0.0) error")
 	}
 	ipPort = ParseIpPort("0.0.0.0:1")
 	if ipPort.IP != "0.0.0.0" || ipPort.Port != 1 {
-		t.Fatalf("ParseIpPort(0.0.0.0) error", n3)
+		t.Fatalf("ParseIpPort(0.0.0.0) error")
+	}
+}
+
+func TestParseEndpoint(t *testing.T) {
+	ep, err := ParseEndpoint("")
+	if err != nil || len(ep) > 0 {
+		t.Fatalf("ParseEndpoint(\"\") failed, err = %s, ep = %s", err, ep)
+	}
+	ep, err = ParseEndpoint(":sssss")
+	if err == nil || len(ep) > 0 {
+		t.Fatalf("ParseEndpoint(\":sssss\") failed, err = %s, ep = %s", err, ep)
+	}
+	ep, err = ParseEndpoint("rest://127.0.0.1/?a=b")
+	if err != nil || ep != "127.0.0.1" {
+		t.Fatalf("ParseEndpoint(\"rest://127.0.0.1/?a=b\") failed, err = %s, ep = %s", err, ep)
+	}
+	ep, err = ParseEndpoint("rest://127.0.0.1:30100/?a=b")
+	if err != nil || ep != "127.0.0.1:30100" {
+		t.Fatalf("ParseEndpoint(\"rest://127.0.0.1:30100/?a=b\") failed, err = %s, ep = %s", err, ep)
+	}
+	ep, err = ParseEndpoint("rest://[2400:A480:AAAA:200::159]:30100/?a=b")
+	if err != nil || ep != "[2400:A480:AAAA:200::159]:30100" {
+		t.Fatalf("ParseEndpoint(\"rest://[2400:A480:AAAA:200::159]:30100/?a=b\") failed, err = %s, ep = %s", err, ep)
+	}
+	ep, err = ParseEndpoint("rest://[fe80::f816:3eff:fe17:c38b%25eht0]:30100/?a=b")
+	if err != nil || ep != "[fe80::f816:3eff:fe17:c38b%eht0]:30100" {
+		t.Fatalf("ParseEndpoint(\"rest://[fe80::f816:3eff:fe17:c38b%%25eht0]:30100/?a=b\") failed, err = %s, ep = %s", err, ep)
 	}
 }
diff --git a/server/api.go b/server/api.go
index f434bdc4..16727427 100644
--- a/server/api.go
+++ b/server/api.go
@@ -61,6 +61,7 @@ func (t APIType) String() string {
 
 type APIServer struct {
 	HostName  string
+	Listeners map[APIType]string
 	Endpoints map[APIType]string
 	restSrv   *rest.Server
 	rpcSrv    *rpc.Server
@@ -205,45 +206,45 @@ func (s *APIServer) MarkForked() {
 }
 
 func (s *APIServer) startRESTServer() (err error) {
-	ep, ok := s.Endpoints[REST]
+	addr, ok := s.Listeners[REST]
 	if !ok {
 		return
 	}
-	s.restSrv, err = rs.NewServer(ep)
+	s.restSrv, err = rs.NewServer(addr)
 	if err != nil {
 		return
 	}
-	util.Logger().Infof("Local listen address: %s, host: %s.", ep, s.HostName)
+	util.Logger().Infof("Local listen address: %s, host: %s.", addr, s.HostName)
 
 	s.goroutine.Do(func(_ context.Context) {
 		err := s.restSrv.Serve()
 		if s.isClose {
 			return
 		}
-		util.Logger().Errorf(err, "error to start REST API server %s", ep)
+		util.Logger().Errorf(err, "error to start REST API server %s", addr)
 		s.err <- err
 	})
 	return
 }
 
 func (s *APIServer) startRPCServer() (err error) {
-	ep, ok := s.Endpoints[RPC]
+	addr, ok := s.Listeners[RPC]
 	if !ok {
 		return
 	}
 
-	s.rpcSrv, err = rpc.NewServer(ep)
+	s.rpcSrv, err = rpc.NewServer(addr)
 	if err != nil {
 		return
 	}
-	util.Logger().Infof("Local listen address: %s, host: %s.", ep, s.HostName)
+	util.Logger().Infof("Local listen address: %s, host: %s.", addr, s.HostName)
 
 	s.goroutine.Do(func(_ context.Context) {
 		err := s.rpcSrv.Serve()
 		if s.isClose {
 			return
 		}
-		util.Logger().Errorf(err, "error to start RPC API server %s", ep)
+		util.Logger().Errorf(err, "error to start RPC API server %s", addr)
 		s.err <- err
 	})
 	return
diff --git a/server/core/backend/store/common.go b/server/core/backend/store/common.go
index 0de9e05c..c9d92726 100644
--- a/server/core/backend/store/common.go
+++ b/server/core/backend/store/common.go
@@ -73,6 +73,7 @@ var TypeNames = []string{
 	INSTANCE:         "INSTANCE",
 	LEASE:            "LEASE",
 	ENDPOINTS:        "ENDPOINTS",
+	typeEnd:          "TYPEEND",
 }
 
 var TypeRoots = map[StoreType]string{
diff --git a/server/core/backend/store/extend.go b/server/core/backend/store/extend.go
index bffd0c15..90b053f5 100644
--- a/server/core/backend/store/extend.go
+++ b/server/core/backend/store/extend.go
@@ -60,8 +60,8 @@ func InstallType(e Entity) (id StoreType, err error) {
 		}
 	}
 
+	id = StoreType(len(TypeNames))
 	TypeNames = append(TypeNames, e.Name())
-	id = StoreType(len(TypeNames) + 1) // +1 for typeEnd
 
 	TypeRoots[id] = e.Prefix()
 	TypeInitSize[id] = e.InitSize()
diff --git a/server/core/common.go b/server/core/common.go
index 0d2ae757..84d068ed 100644
--- a/server/core/common.go
+++ b/server/core/common.go
@@ -86,7 +86,7 @@ func init() {
 	hbModeRegex, _ := regexp.Compile(`^(push|pull)$`)
 	numberAllowEmptyRegex, _ := regexp.Compile(`^[0-9]*$`)
 	numberRegex, _ := regexp.Compile(`^[0-9]+$`)
-	epRegex, _ := regexp.Compile(`^[A-Za-z0-9:/?=&%_.-]+$`)
+	epRegex, _ := regexp.Compile(`.+`)
 	simpleNameAllowEmptyRegex, _ := regexp.Compile(`^[A-Za-z0-9_.-]*$`)
 	simpleNameRegex, _ := regexp.Compile(`^[A-Za-z0-9_.-]+$`)
 	regionRegex, _ := regexp.Compile(`^[A-Za-z0-9_.-]+$`)
@@ -100,18 +100,18 @@ func init() {
 	serviceIdRule := &validate.ValidateRule{Min: 1, Length: 64, Regexp: serviceIdRegex}
 	instanceStatusRule := &validate.ValidateRule{Regexp: instStatusRegex}
 	updateInstStatusRule := &validate.ValidateRule{Regexp: updateInstStatusRegex}
-	serviceNameRule := &validate.ValidateRule{Min: 1, Max: 128, Regexp: nameRegex}
-	versionFuzzyRule := &validate.ValidateRule{Min: 1, Max: 128, Regexp: versionFuzzyRegex}
+	serviceNameRule := &validate.ValidateRule{Min: 1, Length: 128, Regexp: nameRegex}
+	versionFuzzyRule := &validate.ValidateRule{Min: 1, Length: 128, Regexp: versionFuzzyRegex}
 	instanceRule := &validate.ValidateRule{Length: 64, Regexp: simpleNameAllowEmptyRegex}
 
 	MicroServiceKeyValidator.AddRule("Environment", &validate.ValidateRule{Regexp: envRegex})
-	MicroServiceKeyValidator.AddRule("AppId", &validate.ValidateRule{Min: 1, Max: 160, Regexp: nameRegex})
+	MicroServiceKeyValidator.AddRule("AppId", &validate.ValidateRule{Min: 1, Length: 160, Regexp: nameRegex})
 	MicroServiceKeyValidator.AddRule("ServiceName", serviceNameRule)
-	MicroServiceKeyValidator.AddRule("Version", &validate.ValidateRule{Min: 1, Max: 64, Regexp: versionRegex})
+	MicroServiceKeyValidator.AddRule("Version", &validate.ValidateRule{Min: 1, Length: 64, Regexp: versionRegex})
 
 	ServicePathValidator.AddRule("Path", &validate.ValidateRule{Regexp: pathRegex})
 
-	FrameWKValidator.AddRule("Name", &validate.ValidateRule{Max: 64, Regexp: nameRegex})
+	FrameWKValidator.AddRule("Name", &validate.ValidateRule{Length: 64, Regexp: nameRegex})
 	FrameWKValidator.AddRule("Version", &validate.ValidateRule{Length: 64})
 
 	MicroServiceValidator.AddRules(MicroServiceKeyValidator.GetRules())
@@ -132,7 +132,7 @@ func init() {
 
 	var subSchemaValidator validate.Validator
 	subSchemaValidator.AddRule("SchemaId", SchemaIdRule)
-	subSchemaValidator.AddRule("Summary", &validate.ValidateRule{Min: 1, Max: 512, Regexp: schemaSummaryRegex})
+	subSchemaValidator.AddRule("Summary", &validate.ValidateRule{Min: 1, Length: 128, Regexp: schemaSummaryRegex})
 	subSchemaValidator.AddRule("Schema", &validate.ValidateRule{Min: 1})
 
 	SchemasValidator.AddRule("ServiceId", serviceIdRule)
@@ -140,7 +140,7 @@ func init() {
 
 	SchemaValidator.AddRules(subSchemaValidator.GetRules())
 	SchemaValidator.AddRule("ServiceId", serviceIdRule)
-	SchemaValidator.AddRule("Summary", &validate.ValidateRule{Max: 512, Regexp: schemaSummaryRegex})
+	SchemaValidator.AddRule("Summary", &validate.ValidateRule{Length: 128, Regexp: schemaSummaryRegex})
 
 	GetServiceReqValidator.AddRule("ServiceId", serviceIdRule)
 
@@ -150,7 +150,7 @@ func init() {
 	ConsumerMsValidator.AddRules(MicroServiceKeyValidator.GetRules())
 
 	ProviderMsValidator.AddRules(MicroServiceKeyValidator.GetRules())
-	ProviderMsValidator.AddRule("ServiceName", &validate.ValidateRule{Min: 1, Max: 128, Regexp: nameFuzzyRegex})
+	ProviderMsValidator.AddRule("ServiceName", &validate.ValidateRule{Min: 1, Length: 128, Regexp: nameFuzzyRegex})
 	ProviderMsValidator.AddRule("Version", versionFuzzyRule)
 
 	TagReqValidator.AddRule("ServiceId", serviceIdRule)
@@ -168,7 +168,7 @@ func init() {
 	MicroServiceInstanceValidator.AddRule("InstanceId", instanceRule)
 	MicroServiceInstanceValidator.AddRule("ServiceId", serviceIdRule)
 	MicroServiceInstanceValidator.AddRule("Endpoints", &validate.ValidateRule{Regexp: epRegex})
-	MicroServiceInstanceValidator.AddRule("HostName", &validate.ValidateRule{Length: 64, Regexp: simpleNameRegex})
+	MicroServiceInstanceValidator.AddRule("HostName", &validate.ValidateRule{Length: 64, Min: 1})
 	MicroServiceInstanceValidator.AddSub("HealthCheck", &HealthCheckInfoValidator)
 	MicroServiceInstanceValidator.AddRule("Status", instanceStatusRule)
 	MicroServiceInstanceValidator.AddSub("DataCenterInfo", &DataCenterInfoValidator)
@@ -179,12 +179,12 @@ func init() {
 
 	ServiceRuleValidator.AddRule("RuleType", &validate.ValidateRule{Regexp: ruleRegex})
 	ServiceRuleValidator.AddRule("Attribute", &validate.ValidateRule{Regexp: ruleAttrRegex})
-	ServiceRuleValidator.AddRule("Pattern", &validate.ValidateRule{Max: 64, Min: 1})
+	ServiceRuleValidator.AddRule("Pattern", &validate.ValidateRule{Length: 64, Min: 1})
 	ServiceRuleValidator.AddRule("Description", MicroServiceValidator.GetRule("Description"))
 
 	FindInstanceReqValidator.AddRule("ConsumerServiceId", serviceIdRule)
 	FindInstanceReqValidator.AddRule("AppId", MicroServiceKeyValidator.GetRule("AppId"))
-	FindInstanceReqValidator.AddRule("ServiceName", &validate.ValidateRule{Min: 1, Max: 128, Regexp: serviceNameForFindRegex})
+	FindInstanceReqValidator.AddRule("ServiceName", &validate.ValidateRule{Min: 1, Length: 128, Regexp: serviceNameForFindRegex})
 	FindInstanceReqValidator.AddRule("VersionRule", versionFuzzyRule)
 	FindInstanceReqValidator.AddRule("Tags", TagRule)
 
diff --git a/server/rest/server.go b/server/rest/server.go
index 1ef48aee..005d919a 100644
--- a/server/rest/server.go
+++ b/server/rest/server.go
@@ -95,12 +95,7 @@ func DefaultServer() *rest.Server {
 	return defaultRESTfulServer
 }
 
-func NewServer(ep string) (srv *rest.Server, err error) {
-	ipAddr, err := util.ParseEndpoint(ep)
-	if err != nil {
-		return
-	}
-
+func NewServer(ipAddr string) (srv *rest.Server, err error) {
 	srvCfg, err := LoadConfig()
 	if err != nil {
 		return
diff --git a/server/rpc/server.go b/server/rpc/server.go
index 683f72f6..140323b2 100644
--- a/server/rpc/server.go
+++ b/server/rpc/server.go
@@ -35,12 +35,7 @@ func (srv *Server) Serve() error {
 	return srv.Server.Serve(srv.innerListener)
 }
 
-func NewServer(ep string) (_ *Server, err error) {
-	ipAddr, err := util.ParseEndpoint(ep)
-	if err != nil {
-		return
-	}
-
+func NewServer(ipAddr string) (_ *Server, err error) {
 	var grpcSrv *grpc.Server
 	if core.ServerInfo.Config.SslEnabled {
 		tlsConfig, err := sctls.GetServerTLSConfig()
diff --git a/server/server.go b/server/server.go
index 15e0abd3..611b83c8 100644
--- a/server/server.go
+++ b/server/server.go
@@ -29,6 +29,8 @@ import (
 	"github.com/apache/incubator-servicecomb-service-center/version"
 	"github.com/astaxie/beego"
 	"golang.org/x/net/context"
+	"net"
+	"net/url"
 	"os"
 	"strings"
 	"time"
@@ -167,16 +169,18 @@ func (s *ServiceCenterServer) startApiServer() {
 
 func (s *ServiceCenterServer) addEndpoint(t APIType, ip, port string) {
 	if s.apiServer.Endpoints == nil {
+		s.apiServer.Listeners = map[APIType]string{}
 		s.apiServer.Endpoints = map[APIType]string{}
 	}
 	if len(ip) == 0 {
 		return
 	}
-	address := util.StringJoin([]string{ip, port}, ":")
+	address := fmt.Sprintf("%s://%s/", t, net.JoinHostPort(url.PathEscape(ip), port))
 	if core.ServerInfo.Config.SslEnabled {
 		address += "?sslEnabled=true"
 	}
-	s.apiServer.Endpoints[t] = fmt.Sprintf("%s://%s", t, address)
+	s.apiServer.Listeners[t] = net.JoinHostPort(ip, port)
+	s.apiServer.Endpoints[t] = address
 }
 
 func (s *ServiceCenterServer) Stop() {
diff --git a/server/service/schema_test.go b/server/service/schema_test.go
index 0b73d299..1ef9117b 100644
--- a/server/service/schema_test.go
+++ b/server/service/schema_test.go
@@ -34,7 +34,7 @@ const (
 
 var (
 	tooLongSchemaId = strings.Repeat("x", 161)
-	tooLongSummary  = strings.Repeat("x", 513)
+	tooLongSummary  = strings.Repeat("x", 129)
 )
 
 var _ = Describe("'Schema' service", func() {


 

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
users@infra.apache.org


With regards,
Apache Git Services