From: wahidw Date: Thu, 5 Dec 2019 06:30:42 +0000 (+0000) Subject: Added config and logger module from xapp-fwk. Added Routes related to A1Mediator... X-Git-Tag: 0.4.9~9 X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=commitdiff_plain;h=a8596ec6db91b8a45a1a21421a726b9b05ce7d48;p=ric-plt%2Frtmgr.git Added config and logger module from xapp-fwk. Added Routes related to A1Mediator for policy instances Change-Id: I3d1b9bb12ad92d950bf6fbbab1426d262f1b0c50 Signed-off-by: wahidw --- diff --git a/Dockerfile b/Dockerfile index 6457359..782bc5f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -13,22 +13,37 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. +# +# This source code is part of the near-RT RIC (RAN Intelligent Controller) +# platform project (RICP). #================================================================================== # The CI system creates and publishes the rtmgr Docker image # from the last step in this multi-stage build and applies # a Docker tag from the string in file container-tag.yaml -FROM golang:1.12 as rtmgrbuild +#FROM golang:1.12.1 as rtmgrbuild +FROM nexus3.o-ran-sc.org:10004/bldr-ubuntu18-c-go:2-u18.04-nng as rtmgrbuild + + +# Install RMr shared library +RUN wget --content-disposition https://packagecloud.io/o-ran-sc/staging/packages/debian/stretch/rmr_1.9.0_amd64.deb/download.deb && dpkg -i rmr_1.9.0_amd64.deb && rm -rf rmr_1.9.0_amd64.deb +# Install RMr development header files +RUN wget --content-disposition https://packagecloud.io/o-ran-sc/staging/packages/debian/stretch/rmr-dev_1.9.0_amd64.deb/download.deb && dpkg -i rmr-dev_1.9.0_amd64.deb && rm -rf rmr-dev_1.9.0_amd64.deb + +ENV GOLANG_VERSION 1.12.1 +RUN wget --quiet https://dl.google.com/go/go$GOLANG_VERSION.linux-amd64.tar.gz \ + && tar xvzf go$GOLANG_VERSION.linux-amd64.tar.gz -C /usr/local +ENV PATH="/usr/local/go/bin:${PATH}" ENV GOPATH /go -RUN apt-get update \ - && apt-get install -y golang-glide git wget +RUN mkdir -p /go/bin RUN cd /go/bin \ && wget --quiet https://github.com/go-swagger/go-swagger/releases/download/v0.19.0/swagger_linux_amd64 \ && mv swagger_linux_amd64 swagger \ && chmod +x swagger + WORKDIR /go/src/routing-manager COPY api/ /go/src/routing-manager/api COPY LICENSE LICENSE @@ -38,29 +53,37 @@ RUN git clone "https://gerrit.o-ran-sc.org/r/ric-plt/appmgr" \ && cp appmgr/api/appmgr_rest_api.yaml api/ \ && rm -rf appmgr -RUN swagger generate server -f api/routing_manager.yaml -t pkg/ --exclude-main -r LICENSE -RUN swagger generate client -f api/appmgr_rest_api.yaml -t pkg/ -m appmgr_model -c appmgr_client -r LICENSE - -COPY glide.lock glide.lock -COPY glide.yaml glide.yaml - -RUN glide install --strip-vendor +RUN /go/bin/swagger generate server -f api/routing_manager.yaml -t pkg/ --exclude-main -r LICENSE +RUN /go/bin/swagger generate client -f api/appmgr_rest_api.yaml -t pkg/ -m appmgr_model -c appmgr_client -r LICENSE +ENV GO111MODULE=on +ENV GOPATH "" +COPY go.sum go.sum +COPY go.mod go.mod COPY pkg pkg COPY cmd cmd COPY run_rtmgr.sh /run_rtmgr.sh +#RUN go mod download +#RUN /usr/local/go/bin/go mod tidy +ENV GOPATH /go ENV GOBIN /go/bin RUN go install ./cmd/rtmgr.go # UT intermediate container FROM rtmgrbuild as rtmgrut -RUN go test ./pkg/sbi ./pkg/rpe ./pkg/nbi ./pkg/sdl -cover -race +RUN ldconfig +RUN go test ./pkg/sbi ./pkg/rpe ./pkg/nbi ./pkg/sdl -f "./manifests/rtmgr/rtmgr-cfg.yaml" -cover -race + # Final, executable container FROM ubuntu:16.04 COPY --from=rtmgrbuild /go/bin/rtmgr / COPY --from=rtmgrbuild /run_rtmgr.sh / -RUN apt-get update && apt-get install -y iputils-ping net-tools curl tcpdump +COPY --from=rtmgrbuild /usr/local/include /usr/local/include +COPY --from=rtmgrbuild /usr/local/lib /usr/local/lib +RUN ldconfig + +RUN apt update && apt install -y iputils-ping net-tools curl tcpdump RUN mkdir /db && touch /db/rt.json && chmod 777 /db/rt.json RUN chmod 755 /run_rtmgr.sh CMD /run_rtmgr.sh diff --git a/RELNOTES b/RELNOTES index 2d57a92..3b83ac3 100644 --- a/RELNOTES +++ b/RELNOTES @@ -1,3 +1,7 @@ +### v0.4.2 +* Added Routes when AC-xApp is deployed +* included xapp-framework. Using only config and Logger module for now. + ### v0.4.1 * Fixed integration and subscription routes related issues for R3 diff --git a/cmd/rtmgr.go b/cmd/rtmgr.go index 568b7ad..a33437a 100644 --- a/cmd/rtmgr.go +++ b/cmd/rtmgr.go @@ -33,8 +33,9 @@ package main //TODO: change flag to pflag (won't need any argument parse) + import ( - "flag" + "gerrit.o-ran-sc.org/r/ric-plt/xapp-frame/pkg/xapp" "os" "os/signal" "routing-manager/pkg/nbi" @@ -49,31 +50,11 @@ import ( const SERVICENAME = "rtmgr" const INTERVAL time.Duration = 60 -var ( - args map[string]*string -) - -func parseArgs() { - // TODO: arguments should be validated (filename; xm-url; sbi-if; rest-url; rest-port) - args = make(map[string]*string) - args["configfile"] = flag.String("configfile", "/etc/rtmgrcfg.json", "Routing manager's configuration file path") - args["nbi"] = flag.String("nbi", "httpRESTful", "Northbound interface module to be used. Valid values are: 'httpGetter | httpRESTful'") - args["sbi"] = flag.String("sbi", "nngpush", "Southbound interface module to be used. Valid values are: 'nngpush") - args["rpe"] = flag.String("rpe", "rmrpush", "Route Policy Engine to be used. Valid values are: 'rmrpush'") - args["sdl"] = flag.String("sdl", "file", "Data store engine to be used. Valid values are: 'file'") - args["xm-url"] = flag.String("xm-url", "http://localhost:3000/xapps", "HTTP URL where xApp Manager exposes the entire xApp List") - args["nbi-if"] = flag.String("nbi-if", "http://localhost:8888", "Base HTTP URL where routing manager will be listening on") - args["sbi-if"] = flag.String("sbi-if", "0.0.0.0", "IPv4 address of interface where Southbound socket to be opened") - args["filename"] = flag.String("filename", "/db/rt.json", "Absolute path of file where the route information to be stored") - args["loglevel"] = flag.String("loglevel", "INFO", "INFO | WARN | ERROR | DEBUG | TRACE") - flag.Parse() -} - func initRtmgr() (nbiEngine nbi.Engine, sbiEngine sbi.Engine, sdlEngine sdl.Engine, rpeEngine rpe.Engine, err error) { - if nbiEngine, err = nbi.GetNbi(*args["nbi"]); err == nil && nbiEngine != nil { - if sbiEngine, err = sbi.GetSbi(*args["sbi"]); err == nil && sbiEngine != nil { - if sdlEngine, err = sdl.GetSdl(*args["sdl"]); err == nil && sdlEngine != nil { - if rpeEngine, err = rpe.GetRpe(*args["rpe"]); err == nil && rpeEngine != nil { + if nbiEngine, err = nbi.GetNbi(xapp.Config.GetString("nbi")); err == nil && nbiEngine != nil { + if sbiEngine, err = sbi.GetSbi(xapp.Config.GetString("sbi")); err == nil && sbiEngine != nil { + if sdlEngine, err = sdl.GetSdl(xapp.Config.GetString("sdl")); err == nil && sdlEngine != nil { + if rpeEngine, err = rpe.GetRpe(xapp.Config.GetString("rpe")); err == nil && rpeEngine != nil { return nbiEngine, sbiEngine, sdlEngine, rpeEngine, nil } } @@ -85,16 +66,16 @@ func initRtmgr() (nbiEngine nbi.Engine, sbiEngine sbi.Engine, sdlEngine sdl.Engi func serveSBI(triggerSBI <-chan bool, sbiEngine sbi.Engine, sdlEngine sdl.Engine, rpeEngine rpe.Engine) { for { if <-triggerSBI { - data, err := sdlEngine.ReadAll(*args["filename"]) + data, err := sdlEngine.ReadAll(xapp.Config.GetString("rtfile")) if err != nil || data == nil { - rtmgr.Logger.Error("Cannot get data from sdl interface due to: " + err.Error()) + xapp.Logger.Error("Cannot get data from sdl interface due to: " + err.Error()) continue } sbiEngine.UpdateEndpoints(data) policies := rpeEngine.GeneratePolicies(rtmgr.Eps) err = sbiEngine.DistributeAll(policies) if err != nil { - rtmgr.Logger.Error("Routing table cannot be published due to: " + err.Error()) + xapp.Logger.Error("Routing table cannot be published due to: " + err.Error()) } } } @@ -104,16 +85,16 @@ func serve(nbiEngine nbi.Engine, sbiEngine sbi.Engine, sdlEngine sdl.Engine, rpe triggerSBI := make(chan bool) - nbiErr := nbiEngine.Initialize(*args["xm-url"], *args["nbi-if"], *args["filename"], *args["configfile"], + nbiErr := nbiEngine.Initialize(xapp.Config.GetString("xmurl"), xapp.Config.GetString("nbiurl"), xapp.Config.GetString("rtfile"), xapp.Config.GetString("cfgfile"), sdlEngine, rpeEngine, triggerSBI) if nbiErr != nil { - rtmgr.Logger.Error("Failed to initialize nbi due to: " + nbiErr.Error()) + xapp.Logger.Error("Failed to initialize nbi due to: " + nbiErr.Error()) return } - err := sbiEngine.Initialize(*args["sbi-if"]) + err := sbiEngine.Initialize(xapp.Config.GetString("sbiurl")) if err != nil { - rtmgr.Logger.Info("Failed to open push socket due to: " + err.Error()) + xapp.Logger.Info("Failed to open push socket due to: " + err.Error()) return } defer nbiEngine.Terminate() @@ -123,19 +104,19 @@ func serve(nbiEngine nbi.Engine, sbiEngine sbi.Engine, sdlEngine sdl.Engine, rpe go serveSBI(triggerSBI, sbiEngine, sdlEngine, rpeEngine) for { - if *args["nbi"] == "httpGetter" { - data, err := nbiEngine.(*nbi.HttpGetter).FetchAllXApps(*args["xm-url"]) + if xapp.Config.GetString("nbi") == "httpGetter" { + data, err := nbiEngine.(*nbi.HttpGetter).FetchAllXApps(xapp.Config.GetString("xmurl")) if err != nil { - rtmgr.Logger.Error("Cannot fetch xapp data due to: " + err.Error()) + xapp.Logger.Error("Cannot fetch xapp data due to: " + err.Error()) } else if data != nil { - sdlEngine.WriteXApps(*args["filename"], data) + sdlEngine.WriteXApps(xapp.Config.GetString("rtfile"), data) } } triggerSBI <- true time.Sleep(INTERVAL * time.Second) - rtmgr.Logger.Debug("Periodic loop timed out. Setting triggerSBI flag to distribute updated routes.") + xapp.Logger.Debug("Periodic loop timed out. Setting triggerSBI flag to distribute updated routes.") } } @@ -144,21 +125,19 @@ func SetupCloseHandler() { signal.Notify(c, os.Interrupt, syscall.SIGTERM) go func() { <-c - rtmgr.Logger.Info("\r- Ctrl+C pressed in Terminal") + xapp.Logger.Info("\r- Ctrl+C pressed in Terminal") os.Exit(0) }() } func main() { - parseArgs() - rtmgr.SetLogLevel(*args["loglevel"]) nbiEngine, sbiEngine, sdlEngine, rpeEngine, err := initRtmgr() if err != nil { - rtmgr.Logger.Error(err.Error()) + xapp.Logger.Error(err.Error()) os.Exit(1) } SetupCloseHandler() - rtmgr.Logger.Info("Start " + SERVICENAME + " service") + xapp.Logger.Info("Start " + SERVICENAME + " service") rtmgr.Eps = make(rtmgr.Endpoints) serve(nbiEngine, sbiEngine, sdlEngine, rpeEngine) os.Exit(0) diff --git a/container-tag.yaml b/container-tag.yaml index 3308c36..66a2515 100644 --- a/container-tag.yaml +++ b/container-tag.yaml @@ -2,4 +2,4 @@ # By default this file is in the docker build directory, # but the location can configured in the JJB template. --- -tag: 0.4.1 +tag: 0.4.2 diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..e6a1f6e --- /dev/null +++ b/go.mod @@ -0,0 +1,13 @@ +module routing-manager + +go 1.12.1 + +require ( + gerrit.o-ran-sc.org/r/ric-plt/xapp-frame v0.0.20 +) + +replace gerrit.o-ran-sc.org/r/ric-plt/sdlgo => gerrit.o-ran-sc.org/r/ric-plt/sdlgo.git v0.2.0 + +replace gerrit.o-ran-sc.org/r/ric-plt/xapp-frame => gerrit.o-ran-sc.org/r/ric-plt/xapp-frame.git v0.0.20 + +replace gerrit.o-ran-sc.org/r/com/golog => gerrit.o-ran-sc.org/r/com/golog.git v0.0.1 diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..fc79036 --- /dev/null +++ b/go.sum @@ -0,0 +1,250 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +gerrit.o-ran-sc.org/r/com/golog.git v0.0.1 h1:9RfO/Whehaaq5KiJTT7s+YOzmi9mT1C3HktfhwwMEmw= +gerrit.o-ran-sc.org/r/com/golog.git v0.0.1/go.mod h1:b8YB31U8/4iRpABioeSzGi/YMzOQ/Zq7hrJmmXKqlJk= +gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/common v1.0.21 h1:eK9nUZOTMJ/EnMpH9bkWtMgOvCn3u4+PNCb9gu10s6w= +gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/common v1.0.21/go.mod h1:QJ1uPPZosGbhxUWpUpeM5fLqFHdnWTrVnvW2DgyOCes= +gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities v1.0.21 h1:PQ/Mu2ol+8Oh/0BqCWWhPlVVoRCg5dQDEGm4+Opp5w4= +gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities v1.0.21/go.mod h1:GXiXLz4ORBeIr0FLIbzENRykgh3Po5uPkX2jICxnRF0= +gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/reader v1.0.21 h1:N3UbqJ9WqC8JEz/TwHHwZwCFAW6VTlZLpD5lnbdD+Y8= +gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/reader v1.0.21/go.mod h1:SQBZLy1HP94i1vQ3y730wGFsrHqZtgPaEkzPgtqBNw0= +gerrit.o-ran-sc.org/r/ric-plt/sdlgo.git v0.2.0 h1:7edCLIQtk9xCwxTtLRUlXr8wQ6nmr/Mo4ZoqjF3m0NE= +gerrit.o-ran-sc.org/r/ric-plt/sdlgo.git v0.2.0/go.mod h1:2Y8gw2jqj9urI8VFqFQn7BX0J3A852+YrXVV9V8gOt4= +gerrit.o-ran-sc.org/r/ric-plt/xapp-frame.git v0.0.20 h1:qf/oWdgXq5iCB38rHO/NfHgD21DOGpKELPgkmvpDExA= +gerrit.o-ran-sc.org/r/ric-plt/xapp-frame.git v0.0.20/go.mod h1:WHzMFLWFYnKZzAT76Lu8wXqcM9MQ9hHM0sxlV45icSw= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/Microsoft/go-winio v0.4.11/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA= +github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/PuerkitoBio/purell v1.1.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= +github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI= +github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= +github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M= +github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= +github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= +github.com/asaskevich/govalidator v0.0.0-20180720115003-f9ffefc3facf h1:eg0MeVzsP1G42dRafH3vf+al2vQIJU0YHX+1Tw87oco= +github.com/asaskevich/govalidator v0.0.0-20180720115003-f9ffefc3facf/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= +github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= +github.com/beorn7/perks v1.0.0 h1:HWo1m869IqiPhD389kmkxeTalrjNbbJTC8LXupb+sl0= +github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= +github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= +github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= +github.com/docker/go-units v0.3.3 h1:Xk8S3Xj5sLGlG5g67hJmYMmUgXv5N4PhkjJHHqrwnTk= +github.com/docker/go-units v0.3.3/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/droundy/goopt v0.0.0-20170604162106-0b8effe182da/go.mod h1:ytRJ64WkuW4kf6/tuYqBATBCRFUP8X9+LDtgcvE+koI= +github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/globalsign/mgo v0.0.0-20180905125535-1ca0a4f7cbcb/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= +github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8 h1:DujepqpGd1hyOd7aW59XpK7Qymp8iy83xq74fLr21is= +github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= +github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= +github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= +github.com/go-openapi/analysis v0.0.0-20180825180245-b006789cd277/go.mod h1:k70tL6pCuVxPJOHXQ+wIac1FUrvNkHolPie/cLEU6hI= +github.com/go-openapi/analysis v0.17.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= +github.com/go-openapi/analysis v0.18.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= +github.com/go-openapi/analysis v0.19.0 h1:sYEyyO7OKQvJX0z4OyHWoGt0uLuALxB/ZJ4Jb3I6KNU= +github.com/go-openapi/analysis v0.19.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= +github.com/go-openapi/errors v0.17.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= +github.com/go-openapi/errors v0.18.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= +github.com/go-openapi/errors v0.19.0 h1:guf3T2lnCBKlODmERt4T9GtMWRpJOikgKGyIvi0xcb8= +github.com/go-openapi/errors v0.19.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= +github.com/go-openapi/jsonpointer v0.17.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= +github.com/go-openapi/jsonpointer v0.18.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= +github.com/go-openapi/jsonpointer v0.19.0 h1:FTUMcX77w5rQkClIzDtTxvn6Bsa894CcrzNj2MMfeg8= +github.com/go-openapi/jsonpointer v0.19.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= +github.com/go-openapi/jsonreference v0.17.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= +github.com/go-openapi/jsonreference v0.18.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= +github.com/go-openapi/jsonreference v0.19.0 h1:BqWKpV1dFd+AuiKlgtddwVIFQsuMpxfBDBHGfM2yNpk= +github.com/go-openapi/jsonreference v0.19.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= +github.com/go-openapi/loads v0.17.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= +github.com/go-openapi/loads v0.18.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= +github.com/go-openapi/loads v0.19.0 h1:wCOBNscACI8L93tt5tvB2zOMkJ098XCw3fP0BY2ybDA= +github.com/go-openapi/loads v0.19.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= +github.com/go-openapi/runtime v0.0.0-20180920151709-4f900dc2ade9/go.mod h1:6v9a6LTXWQCdL8k1AO3cvqx5OtZY/Y9wKTgaoP6YRfA= +github.com/go-openapi/runtime v0.19.0 h1:sU6pp4dSV2sGlNKKyHxZzi1m1kG4WnYtWcJ+HYbygjE= +github.com/go-openapi/runtime v0.19.0/go.mod h1:OwNfisksmmaZse4+gpV3Ne9AyMOlP1lt4sK4FXt0O64= +github.com/go-openapi/spec v0.17.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= +github.com/go-openapi/spec v0.18.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= +github.com/go-openapi/spec v0.19.0 h1:A4SZ6IWh3lnjH0rG0Z5lkxazMGBECtrZcbyYQi+64k4= +github.com/go-openapi/spec v0.19.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= +github.com/go-openapi/strfmt v0.17.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= +github.com/go-openapi/strfmt v0.18.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= +github.com/go-openapi/strfmt v0.19.0 h1:0Dn9qy1G9+UJfRU7TR8bmdGxb4uifB7HNrJjOnV0yPk= +github.com/go-openapi/strfmt v0.19.0/go.mod h1:+uW+93UVvGGq2qGaZxdDeJqSAqBqBdl+ZPMF/cC8nDY= +github.com/go-openapi/swag v0.17.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= +github.com/go-openapi/swag v0.18.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= +github.com/go-openapi/swag v0.19.0 h1:Kg7Wl7LkTPlmc393QZQ/5rQadPhi7pBVEMZxyTi0Ii8= +github.com/go-openapi/swag v0.19.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= +github.com/go-openapi/validate v0.18.0/go.mod h1:Uh4HdOzKt19xGIGm1qHf/ofbX1YQ4Y+MYsct2VUrAJ4= +github.com/go-openapi/validate v0.19.0 h1:SF5vyj6PBFM6D1cw2NJIFrlS8Su2YKk6ADPPjAH70Bw= +github.com/go-openapi/validate v0.19.0/go.mod h1:Uh4HdOzKt19xGIGm1qHf/ofbX1YQ4Y+MYsct2VUrAJ4= +github.com/go-redis/redis v6.15.2+incompatible h1:9SpNVG76gr6InJGxoZ6IuuxaCOQwDAhzyXg+Bs+0Sb4= +github.com/go-redis/redis v6.15.2+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= +github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/gorilla/mux v1.7.1 h1:Dw4jY2nghMMRsh1ol8dv1axHkDwMQK2DHerMNJsIpJU= +github.com/gorilla/mux v1.7.1/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/gorilla/websocket v1.4.1 h1:q7AeDBpnBk8AogcD4DSag/Ukw/KV+YhzLj2bP5HvKCM= +github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= +github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= +github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= +github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/jcelliott/lumber v0.0.0-20160324203708-dd349441af25 h1:EFT6MH3igZK/dIVqgGbTqWVvkZ7wJ5iGN03SVtvvdd8= +github.com/jcelliott/lumber v0.0.0-20160324203708-dd349441af25/go.mod h1:sWkGw/wsaHtRsT9zGQ/WyJCotGWG/Anow/9hsAcBWRw= +github.com/jessevdk/go-flags v1.4.0 h1:4IU2WS7AumrZ/40jfhf4QVDMsQwqA7VEHozFRrGARJA= +github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= +github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= +github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/magiconair/properties v1.8.0 h1:LLgXmsheXeRoUOBOjtwPQCWIYqM/LU1ayDtDePerRcY= +github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.0.0-20190403194419-1ea4449da983 h1:wL11wNW7dhKIcRCHSm4sHKPWz0tt4mwBsVodG7+Xyqg= +github.com/mailru/easyjson v0.0.0-20190403194419-1ea4449da983/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= +github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE= +github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= +github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc= +github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v0.9.3 h1:9iH4JKXLzFbOAdtqv/a+j8aewx2Y8lAjAydhbaScPF8= +github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= +github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90 h1:S/YWwWx/RA8rT8tKFRuGUZhuA90OyIBpPCXkcbwU8DE= +github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/common v0.4.0 h1:7etb9YClo3a6HjLzfl6rIQaU+FDfi0VSX39io3aQ+DM= +github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084 h1:sofwID9zm4tzrgykg80hfFph1mryUeLRsUfoocVVmRY= +github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= +github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= +github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spf13/afero v1.1.2 h1:m8/z1t7/fwjysjQRYbP0RD+bUIF/8tJwPdEZsI83ACI= +github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= +github.com/spf13/cast v1.3.0 h1:oget//CVOEoFewqQxwr0Ej5yjygnqGkvggSE/gB35Q8= +github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/jwalterweatherman v1.0.0 h1:XHEdyB+EcvlqZamSM4ZOMGlc93t6AcsBEu9Gc1vn7yk= +github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= +github.com/spf13/pflag v1.0.3 h1:zPAT6CGy6wXeQ7NtTnaTerfKOsV6V6F8agHXFiazDkg= +github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/viper v1.4.0 h1:yXHLWeravcrgGyFSyCgdYpXQ9dR9c/WED3pg1RhxqEU= +github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.1.1 h1:2vfRuCMp5sSVIDSqO8oNnWJq7mPa6KVP3iPIwFBuy8A= +github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= +github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= +github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= +go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190320223903-b7391e95e576/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181005035420-146acd28ed58/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190320064053-1272bf9dcd53/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190522155817-f3200d17e092 h1:4QSRKanuywn15aTZvI/mIDEgPQpswuFndXpOj3rKEco= +golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181128092732-4ed8d59d0b35/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190321052220-f7bb7a8bee54 h1:xe1/2UUJRmA9iDglQSlkx8c5n3twv58+K0mPpC2zmhA= +golang.org/x/sys v0.0.0-20190321052220-f7bb7a8bee54/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +nanomsg.org/go/mangos/v2 v2.0.5 h1:sTLNMqmOlJrVgcz8PXRBEBXUJ4A+Edl36z5SOjU2FXY= +nanomsg.org/go/mangos/v2 v2.0.5/go.mod h1:8ElpgCPFwZ84FzIBlcEg+BUCNWpx9vTc2vtUwopGjqA= diff --git a/manifests/rtmgr/rtmgr-cfg.yaml b/manifests/rtmgr/rtmgr-cfg.yaml index 262c5ab..5fbc273 100644 --- a/manifests/rtmgr/rtmgr-cfg.yaml +++ b/manifests/rtmgr/rtmgr-cfg.yaml @@ -56,4 +56,12 @@ data: "port": 4561 } ] + "local": + "host": ":8080" + "logger": + "level": 3 + "rmr": + "protPort": "tcp:4560" + "maxSize": 2072 + "numWorkers": 1 } diff --git a/manifests/rtmgr/rtmgr-dep.yaml b/manifests/rtmgr/rtmgr-dep.yaml index 1c013d9..2e568ce 100644 --- a/manifests/rtmgr/rtmgr-dep.yaml +++ b/manifests/rtmgr/rtmgr-dep.yaml @@ -60,8 +60,6 @@ spec: value: "http://rtmgr:8888" - name: CFGFILE value: "/cfg/rtmgr-config.json" - - name: LOGLEVEL - value: "DEBUG" ports: - containerPort: 8888 - containerPort: 4560 diff --git a/pkg/nbi/httpgetter.go b/pkg/nbi/httpgetter.go index 0bf05bc..fca48f4 100644 --- a/pkg/nbi/httpgetter.go +++ b/pkg/nbi/httpgetter.go @@ -32,6 +32,7 @@ package nbi import ( "encoding/json" + "gerrit.o-ran-sc.org/r/ric-plt/xapp-frame/pkg/xapp" "net/http" "routing-manager/pkg/rpe" "routing-manager/pkg/rtmgr" @@ -53,7 +54,7 @@ func NewHttpGetter() *HttpGetter { var myClient = &http.Client{Timeout: 5 * time.Second} func fetchAllXApps(xmurl string) (*[]rtmgr.XApp, error) { - rtmgr.Logger.Info("Invoked httpGetter.fetchXappList: " + xmurl) + xapp.Logger.Info("Invoked httpGetter.fetchXappList: " + xmurl) r, err := myClient.Get(xmurl) if err != nil { return nil, err @@ -61,17 +62,17 @@ func fetchAllXApps(xmurl string) (*[]rtmgr.XApp, error) { defer r.Body.Close() if r.StatusCode == 200 { - rtmgr.Logger.Debug("http client raw response: %v", r) + xapp.Logger.Debug("http client raw response: %v", r) var xApps []rtmgr.XApp err = json.NewDecoder(r.Body).Decode(&xApps) if err != nil { - rtmgr.Logger.Warn("Json decode failed: " + err.Error()) + xapp.Logger.Warn("Json decode failed: " + err.Error()) } - rtmgr.Logger.Info("HTTP GET: OK") - rtmgr.Logger.Debug("httpGetter.fetchXappList returns: %v", xApps) + xapp.Logger.Info("HTTP GET: OK") + xapp.Logger.Debug("httpGetter.fetchXappList returns: %v", xApps) return &xApps, err } - rtmgr.Logger.Warn("httpGetter got an unexpected http status code: %v", r.StatusCode) + xapp.Logger.Warn("httpGetter got an unexpected http status code: %v", r.StatusCode) return nil, nil } diff --git a/pkg/nbi/httpgetter_test.go b/pkg/nbi/httpgetter_test.go index 0dc65a2..088917e 100644 --- a/pkg/nbi/httpgetter_test.go +++ b/pkg/nbi/httpgetter_test.go @@ -33,7 +33,6 @@ import ( "net" "net/http" "net/http/httptest" - "routing-manager/pkg/rtmgr" "testing" ) @@ -51,7 +50,6 @@ func TestFetchXappListInvalidData(t *testing.T) { func TestFetchXappListWithInvalidData(t *testing.T) { var expected = 0 - rtmgr.SetLogLevel("debug") b := []byte(`{"ID":"deadbeef1234567890", "Version":0, "EventType":"all"}`) l, err := net.Listen("tcp", "127.0.0.1:3000") if err != nil { diff --git a/pkg/nbi/httprestful.go b/pkg/nbi/httprestful.go index 8ceca1d..db8129e 100644 --- a/pkg/nbi/httprestful.go +++ b/pkg/nbi/httprestful.go @@ -35,6 +35,7 @@ import ( "encoding/json" "errors" "fmt" + "gerrit.o-ran-sc.org/r/ric-plt/xapp-frame/pkg/xapp" "github.com/go-openapi/loads" "github.com/go-openapi/runtime/middleware" "net/url" @@ -75,9 +76,9 @@ func recvXappCallbackData(dataChannel <-chan *models.XappCallbackData) (*[]rtmgr // Drain the channel as we are only looking for the latest value until // xapp manager sends all xapp data with every request. length := len(dataChannel) - //rtmgr.Logger.Info(length) + //xapp.Logger.Info(length) for i := 0; i <= length; i++ { - rtmgr.Logger.Info("data received") + xapp.Logger.Info("data received") // If no data received from the REST, it blocks. xappData = <-dataChannel } @@ -86,10 +87,10 @@ func recvXappCallbackData(dataChannel <-chan *models.XappCallbackData) (*[]rtmgr err := json.Unmarshal([]byte(xappData.XApps), &xapps) return &xapps, err } else { - rtmgr.Logger.Info("No data") + xapp.Logger.Info("No data") } - rtmgr.Logger.Debug("Nothing received on the Http interface") + xapp.Logger.Debug("Nothing received on the Http interface") return nil, nil } @@ -107,11 +108,11 @@ func validateXappCallbackData(callbackData *models.XappCallbackData) error { func provideXappHandleHandlerImpl(datach chan<- *models.XappCallbackData, data *models.XappCallbackData) error { if data != nil { - rtmgr.Logger.Debug("Received callback data") + xapp.Logger.Debug("Received callback data") } err := validateXappCallbackData(data) if err != nil { - rtmgr.Logger.Warn("XApp callback data validation failed: " + err.Error()) + xapp.Logger.Warn("XApp callback data validation failed: " + err.Error()) return err } else { datach <- data @@ -132,15 +133,15 @@ func validateXappSubscriptionData(data *models.XappSubscriptionData) error { func provideXappSubscriptionHandleImpl(subchan chan<- *models.XappSubscriptionData, data *models.XappSubscriptionData) error { - rtmgr.Logger.Debug("Invoked provideXappSubscriptionHandleImpl") + xapp.Logger.Debug("Invoked provideXappSubscriptionHandleImpl") err := validateXappSubscriptionData(data) if err != nil { - rtmgr.Logger.Error(err.Error()) + xapp.Logger.Error(err.Error()) return err } subchan <- data //var val = string(*data.Address + ":" + strconv.Itoa(int(*data.Port))) - rtmgr.Logger.Debug("Endpoints: %v", rtmgr.Eps) + xapp.Logger.Debug("Endpoints: %v", rtmgr.Eps) return nil } @@ -158,15 +159,15 @@ func subscriptionExists(data *models.XappSubscriptionData) bool { func deleteXappSubscriptionHandleImpl(subdelchan chan<- *models.XappSubscriptionData, data *models.XappSubscriptionData) error { - rtmgr.Logger.Debug("Invoked deleteXappSubscriptionHandleImpl") + xapp.Logger.Debug("Invoked deleteXappSubscriptionHandleImpl") err := validateXappSubscriptionData(data) if err != nil { - rtmgr.Logger.Error(err.Error()) + xapp.Logger.Error(err.Error()) return err } if !subscriptionExists(data) { - rtmgr.Logger.Warn("subscription not found: %d", *data.SubscriptionID) + xapp.Logger.Warn("subscription not found: %d", *data.SubscriptionID) err := fmt.Errorf("subscription not found: %d", *data.SubscriptionID) return err } @@ -180,12 +181,12 @@ func launchRest(nbiif *string, datach chan<- *models.XappCallbackData, subchan c swaggerSpec, err := loads.Embedded(restapi.SwaggerJSON, restapi.FlatSwaggerJSON) if err != nil { //log.Fatalln(err) - rtmgr.Logger.Error(err.Error()) + xapp.Logger.Error(err.Error()) os.Exit(1) } nbiUrl, err := url.Parse(*nbiif) if err != nil { - rtmgr.Logger.Error(err.Error()) + xapp.Logger.Error(err.Error()) os.Exit(1) } api := operations.NewRoutingManagerAPI(swaggerSpec) @@ -194,17 +195,17 @@ func launchRest(nbiif *string, datach chan<- *models.XappCallbackData, subchan c server.Port, err = strconv.Atoi(nbiUrl.Port()) if err != nil { - rtmgr.Logger.Error("Invalid NBI RestAPI port") + xapp.Logger.Error("Invalid NBI RestAPI port") os.Exit(1) } server.Host = "0.0.0.0" // set handlers api.HandleProvideXappHandleHandler = handle.ProvideXappHandleHandlerFunc( func(params handle.ProvideXappHandleParams) middleware.Responder { - rtmgr.Logger.Info("Data received on Http interface") + xapp.Logger.Info("Data received on Http interface") err := provideXappHandleHandlerImpl(datach, params.XappCallbackData) if err != nil { - rtmgr.Logger.Error("Invalid XApp callback data: " + err.Error()) + xapp.Logger.Error("Invalid XApp callback data: " + err.Error()) return handle.NewProvideXappHandleBadRequest() } else { return handle.NewGetHandlesOK() @@ -233,14 +234,14 @@ func launchRest(nbiif *string, datach chan<- *models.XappCallbackData, subchan c } }) // start to serve API - rtmgr.Logger.Info("Starting the HTTP Rest service") + xapp.Logger.Info("Starting the HTTP Rest service") if err := server.Serve(); err != nil { - rtmgr.Logger.Error(err.Error()) + xapp.Logger.Error(err.Error()) } } func httpGetXApps(xmurl string) (*[]rtmgr.XApp, error) { - rtmgr.Logger.Info("Invoked httprestful.httpGetXApps: " + xmurl) + xapp.Logger.Info("Invoked httprestful.httpGetXApps: " + xmurl) r, err := myClient.Get(xmurl) if err != nil { return nil, err @@ -248,17 +249,17 @@ func httpGetXApps(xmurl string) (*[]rtmgr.XApp, error) { defer r.Body.Close() if r.StatusCode == 200 { - rtmgr.Logger.Debug("http client raw response: %v", r) + xapp.Logger.Debug("http client raw response: %v", r) var xapps []rtmgr.XApp err = json.NewDecoder(r.Body).Decode(&xapps) if err != nil { - rtmgr.Logger.Warn("Json decode failed: " + err.Error()) + xapp.Logger.Warn("Json decode failed: " + err.Error()) } - rtmgr.Logger.Info("HTTP GET: OK") - rtmgr.Logger.Debug("httprestful.httpGetXApps returns: %v", xapps) + xapp.Logger.Info("HTTP GET: OK") + xapp.Logger.Debug("httprestful.httpGetXApps returns: %v", xapps) return &xapps, err } - rtmgr.Logger.Warn("httprestful got an unexpected http status code: %v", r.StatusCode) + xapp.Logger.Warn("httprestful got an unexpected http status code: %v", r.StatusCode) return nil, nil } @@ -271,15 +272,15 @@ func retrieveStartupData(xmurl string, nbiif string, fileName string, configfile if xappData != nil && err == nil { pcData, confErr := rtmgr.GetPlatformComponents(configfile) if confErr != nil { - rtmgr.Logger.Error(confErr.Error()) + xapp.Logger.Error(confErr.Error()) return confErr } - rtmgr.Logger.Info("Recieved intial xapp data and platform data, writing into SDL.") + xapp.Logger.Info("Recieved intial xapp data and platform data, writing into SDL.") // Combine the xapps data and platform data before writing to the SDL ricData := &rtmgr.RicComponents{XApps: *xappData, Pcs: *pcData} writeErr := sdlEngine.WriteAll(fileName, ricData) if writeErr != nil { - rtmgr.Logger.Error(writeErr.Error()) + xapp.Logger.Error(writeErr.Error()) } // post subscription req to appmgr readErr = PostSubReq(xmurl, nbiif) @@ -289,7 +290,7 @@ func retrieveStartupData(xmurl string, nbiif string, fileName string, configfile } else if err == nil { readErr = errors.New("unexpected HTTP status code") } else { - rtmgr.Logger.Warn("cannot get xapp data due to: " + err.Error()) + xapp.Logger.Warn("cannot get xapp data due to: " + err.Error()) readErr = err } } @@ -300,14 +301,14 @@ func (r *HttpRestful) Initialize(xmurl string, nbiif string, fileName string, co sdlEngine sdl.Engine, rpeEngine rpe.Engine, triggerSBI chan<- bool) error { err := r.RetrieveStartupData(xmurl, nbiif, fileName, configfile, sdlEngine) if err != nil { - rtmgr.Logger.Error("Exiting as nbi failed to get the initial startup data from the xapp manager: " + err.Error()) + xapp.Logger.Error("Exiting as nbi failed to get the initial startup data from the xapp manager: " + err.Error()) return err } datach := make(chan *models.XappCallbackData, 10) subschan := make(chan *models.XappSubscriptionData, 10) subdelchan := make(chan *models.XappSubscriptionData, 10) - rtmgr.Logger.Info("Launching Rest Http service") + xapp.Logger.Info("Launching Rest Http service") go func() { r.LaunchRest(&nbiif, datach, subschan, subdelchan) }() @@ -316,9 +317,9 @@ func (r *HttpRestful) Initialize(xmurl string, nbiif string, fileName string, co for { data, err := r.RecvXappCallbackData(datach) if err != nil { - rtmgr.Logger.Error("cannot get data from rest api dute to: " + err.Error()) + xapp.Logger.Error("cannot get data from rest api dute to: " + err.Error()) } else if data != nil { - rtmgr.Logger.Debug("Fetching all xApps deployed in xApp Manager through GET operation.") + xapp.Logger.Debug("Fetching all xApps deployed in xApp Manager through GET operation.") alldata, err1 := httpGetXApps(xmurl) if alldata != nil && err1 == nil { sdlEngine.WriteXApps(fileName, alldata) @@ -331,7 +332,7 @@ func (r *HttpRestful) Initialize(xmurl string, nbiif string, fileName string, co go func() { for { data := <-subschan - rtmgr.Logger.Debug("received XApp subscription data") + xapp.Logger.Debug("received XApp subscription data") addSubscription(&rtmgr.Subs, data) triggerSBI <- true } @@ -340,7 +341,7 @@ func (r *HttpRestful) Initialize(xmurl string, nbiif string, fileName string, co go func() { for { data := <-subdelchan - rtmgr.Logger.Debug("received XApp subscription delete data") + xapp.Logger.Debug("received XApp subscription delete data") delSubscription(&rtmgr.Subs, data) triggerSBI <- true } @@ -358,7 +359,7 @@ func addSubscription(subs *rtmgr.SubscriptionList, xappSubData *models.XappSubsc sub := rtmgr.Subscription{SubID: *xappSubData.SubscriptionID, Fqdn: *xappSubData.Address, Port: *xappSubData.Port} for _, elem := range *subs { if elem == sub { - rtmgr.Logger.Warn("rtmgr.addSubscription: Subscription already present: %v", elem) + xapp.Logger.Warn("rtmgr.addSubscription: Subscription already present: %v", elem) b = true } } @@ -369,7 +370,7 @@ func addSubscription(subs *rtmgr.SubscriptionList, xappSubData *models.XappSubsc } func delSubscription(subs *rtmgr.SubscriptionList, xappSubData *models.XappSubscriptionData) bool { - rtmgr.Logger.Debug("Deleteing the subscription from the subscriptions list") + xapp.Logger.Debug("Deleteing the subscription from the subscriptions list") var present = false sub := rtmgr.Subscription{SubID: *xappSubData.SubscriptionID, Fqdn: *xappSubData.Address, Port: *xappSubData.Port} for i, elem := range *subs { @@ -383,7 +384,7 @@ func delSubscription(subs *rtmgr.SubscriptionList, xappSubData *models.XappSubsc } } if present == false { - rtmgr.Logger.Warn("rtmgr.delSubscription: Subscription = %v, not present in the existing subscriptions", xappSubData) + xapp.Logger.Warn("rtmgr.delSubscription: Subscription = %v, not present in the existing subscriptions", xappSubData) } return present } diff --git a/pkg/nbi/nbi.go b/pkg/nbi/nbi.go index 1d7d956..ddbf347 100644 --- a/pkg/nbi/nbi.go +++ b/pkg/nbi/nbi.go @@ -35,9 +35,9 @@ import ( apiclient "routing-manager/pkg/appmgr_client" "routing-manager/pkg/appmgr_client/operations" "routing-manager/pkg/appmgr_model" - "routing-manager/pkg/rtmgr" "time" + "gerrit.o-ran-sc.org/r/ric-plt/xapp-frame/pkg/xapp" httptransport "github.com/go-openapi/runtime/client" "github.com/go-openapi/strfmt" "github.com/go-openapi/swag" @@ -94,12 +94,12 @@ func PostSubReq(xmUrl string, nbiif string) error { // setting up POST request to Xapp Manager appmgrUrl, err := url.Parse(xmUrl) if err != nil { - rtmgr.Logger.Error("Invalid XApp manager url/hostname: " + err.Error()) + xapp.Logger.Error("Invalid XApp manager url/hostname: " + err.Error()) return err } nbiifUrl, err := url.Parse(nbiif) if err != nil { - rtmgr.Logger.Error("Invalid NBI address/port: " + err.Error()) + xapp.Logger.Error("Invalid NBI address/port: " + err.Error()) return err } transport := httptransport.New(appmgrUrl.Hostname()+":"+appmgrUrl.Port(), "/ric/v1", []string{"http"}) @@ -109,11 +109,11 @@ func PostSubReq(xmUrl string, nbiif string) error { subReq := CreateSubReq(nbiifUrl.Scheme+"://"+nbiifUrl.Hostname(), nbiifUrl.Port()) resp, postErr := client.Operations.AddSubscription(addSubParams.WithSubscriptionRequest(subReq)) if postErr != nil { - rtmgr.Logger.Error("POST unsuccessful:" + postErr.Error()) + xapp.Logger.Error("POST unsuccessful:" + postErr.Error()) return postErr } else { // TODO: use the received ID - rtmgr.Logger.Info("POST received: " + string(resp.Payload.ID)) + xapp.Logger.Info("POST received: " + string(resp.Payload.ID)) return nil } } diff --git a/pkg/rpe/rmr.go b/pkg/rpe/rmr.go index cb311a8..8929c63 100644 --- a/pkg/rpe/rmr.go +++ b/pkg/rpe/rmr.go @@ -31,6 +31,7 @@ package rpe import ( + "gerrit.o-ran-sc.org/r/ric-plt/xapp-frame/pkg/xapp" "routing-manager/pkg/rtmgr" "strconv" ) @@ -80,12 +81,12 @@ func (r *Rmr) generateRMRPolicies(eps rtmgr.Endpoints, key string) *[]string { rawrt = append(rawrt, rawrte+"\n") } rawrt = append(rawrt, key+"newrt|end\n") - rtmgr.Logger.Debug("rmr.GeneratePolicies returns: %v", rawrt) + xapp.Logger.Debug("rmr.GeneratePolicies returns: %v", rawrt) return &rawrt } func (r *RmrPush) GeneratePolicies(eps rtmgr.Endpoints) *[]string { - rtmgr.Logger.Debug("Invoked rmr.GeneratePolicies, args: %v: ", eps) + xapp.Logger.Debug("Invoked rmr.GeneratePolicies, args: %v: ", eps) return r.generateRMRPolicies(eps, "") } diff --git a/pkg/rpe/rpe.go b/pkg/rpe/rpe.go index aa8e12f..35006c8 100644 --- a/pkg/rpe/rpe.go +++ b/pkg/rpe/rpe.go @@ -31,10 +31,11 @@ package rpe import ( "errors" + "gerrit.o-ran-sc.org/r/ric-plt/xapp-frame/pkg/xapp" "routing-manager/pkg/rtmgr" "routing-manager/pkg/sbi" - "strconv" "runtime" + "strconv" ) var ( @@ -64,8 +65,8 @@ type Rpe struct { func getEndpointByName(eps *rtmgr.Endpoints, name string) *rtmgr.Endpoint { for _, ep := range *eps { if ep.Name == name { - rtmgr.Logger.Debug("name: %s", ep.Name) - rtmgr.Logger.Debug("ep: %v", ep) + xapp.Logger.Debug("name: %s", ep.Name) + xapp.Logger.Debug("ep: %v", ep) return ep } } @@ -76,8 +77,8 @@ func getEndpointByUuid(uuid string) *rtmgr.Endpoint { endPoints := rtmgr.Eps for _, ep := range endPoints { if ep.Uuid == uuid { - rtmgr.Logger.Debug("name: %s", ep.Uuid) - rtmgr.Logger.Debug("ep: %v", ep) + xapp.Logger.Debug("name: %s", ep.Uuid) + xapp.Logger.Debug("ep: %v", ep) return ep } } @@ -85,31 +86,33 @@ func getEndpointByUuid(uuid string) *rtmgr.Endpoint { } func (r *Rpe) addRoute(messageType string, tx *rtmgr.Endpoint, rx *rtmgr.Endpoint, routeTable *rtmgr.RouteTable, subId int32) { - if tx != nil && rx != nil { - txList := rtmgr.EndpointList{*tx} + var txList rtmgr.EndpointList + if rx != nil { rxList := []rtmgr.EndpointList{[]rtmgr.Endpoint{*rx}} + if tx != nil { + txList = rtmgr.EndpointList{*tx} + } messageId := rtmgr.MessageTypes[messageType] route := rtmgr.RouteTableEntry{ - MessageType: messageId, - TxList: txList, - RxGroups: rxList, - SubID: subId} - *routeTable = append(*routeTable, route) - rtmgr.Logger.Debug("Route added: MessageTyp: %v, Tx: %v, Rx: %v, SubId: %v", messageId, tx.Uuid, rx.Uuid, subId) - rtmgr.Logger.Trace("Route added: MessageTyp: %v, Tx: %v, Rx: %v, SubId: %v", messageId, tx, rx, subId) - } else { - pc,_,_,ok := runtime.Caller(1) - details := runtime.FuncForPC(pc) - if ok && details != nil { - rtmgr.Logger.Error("Route addition skipped: Either TX or RX endpoint not present. Caller function is %s", details.Name()) - } + MessageType: messageId, + TxList: txList, + RxGroups: rxList, + SubID: subId} + *routeTable = append(*routeTable, route) + xapp.Logger.Debug("Route added: MessageTyp: %v, Rx: %v, SubId: %v", messageId, rx.Uuid, subId) + } else { + pc, _, _, ok := runtime.Caller(1) + details := runtime.FuncForPC(pc) + if ok && details != nil { + xapp.Logger.Error("Route addition skipped: Either TX or RX endpoint not present. Caller function is %s", details.Name()) } + } } func (r *Rpe) generateXappRoutes(xAppEp *rtmgr.Endpoint, e2TermEp *rtmgr.Endpoint, subManEp *rtmgr.Endpoint, routeTable *rtmgr.RouteTable) { - rtmgr.Logger.Debug("rpe.generateXappRoutes invoked") - rtmgr.Logger.Debug("Endpoint: %v, xAppType: %v", xAppEp.Name, xAppEp.XAppType) - if xAppEp.XAppType != sbi.PlatformType && ( len(xAppEp.TxMessages) > 0 || len(xAppEp.RxMessages) > 0 ) { + xapp.Logger.Debug("rpe.generateXappRoutes invoked") + xapp.Logger.Debug("Endpoint: %v, xAppType: %v", xAppEp.Name, xAppEp.XAppType) + if xAppEp.XAppType != sbi.PlatformType && (len(xAppEp.TxMessages) > 0 || len(xAppEp.RxMessages) > 0) { //xApp -> Subscription Manager r.addRoute("RIC_SUB_REQ", xAppEp, subManEp, routeTable, -1) r.addRoute("RIC_SUB_DEL_REQ", xAppEp, subManEp, routeTable, -1) @@ -119,18 +122,26 @@ func (r *Rpe) generateXappRoutes(xAppEp *rtmgr.Endpoint, e2TermEp *rtmgr.Endpoin r.addRoute("RIC_CONTROL_ACK", e2TermEp, xAppEp, routeTable, -1) r.addRoute("RIC_CONTROL_FAILURE", e2TermEp, xAppEp, routeTable, -1) } + //xApp->A1Mediator + if xAppEp.XAppType != sbi.PlatformType && len(xAppEp.Policies) > 0 { + xapp.Logger.Debug("rpe.generateXappRoutes found policies section") + for _, policy := range xAppEp.Policies { + r.addRoute("A1_POLICY_REQ", nil, xAppEp, routeTable, policy) + } + } + } func (r *Rpe) generateSubscriptionRoutes(selectedxAppEp *rtmgr.Endpoint, e2TermEp *rtmgr.Endpoint, subManEp *rtmgr.Endpoint, routeTable *rtmgr.RouteTable) { - rtmgr.Logger.Debug("rpe.addSubscriptionRoutes invoked") + xapp.Logger.Debug("rpe.addSubscriptionRoutes invoked") subscriptionList := &rtmgr.Subs for _, subscription := range *subscriptionList { - rtmgr.Logger.Debug("Subscription: %v", subscription) + xapp.Logger.Debug("Subscription: %v", subscription) xAppUuid := subscription.Fqdn + ":" + strconv.Itoa(int(subscription.Port)) - rtmgr.Logger.Debug("xApp UUID: %v", xAppUuid) + xapp.Logger.Debug("xApp UUID: %v", xAppUuid) xAppEp := getEndpointByUuid(xAppUuid) - if xAppEp.Uuid == selectedxAppEp.Uuid { - rtmgr.Logger.Debug("xApp UUID is matched for selected xApp.UUID: %v and xApp.Name: %v", selectedxAppEp.Uuid, selectedxAppEp.Name) + if xAppEp.Uuid == selectedxAppEp.Uuid { + xapp.Logger.Debug("xApp UUID is matched for selected xApp.UUID: %v and xApp.Name: %v", selectedxAppEp.Uuid, selectedxAppEp.Name) //Subscription Manager -> xApp r.addRoute("RIC_SUB_RESP", subManEp, xAppEp, routeTable, subscription.SubID) r.addRoute("RIC_SUB_FAILURE", subManEp, xAppEp, routeTable, subscription.SubID) @@ -144,8 +155,8 @@ func (r *Rpe) generateSubscriptionRoutes(selectedxAppEp *rtmgr.Endpoint, e2TermE } } -func (r *Rpe) generatePlatformRoutes(e2TermEp *rtmgr.Endpoint, subManEp *rtmgr.Endpoint, e2ManEp *rtmgr.Endpoint, ueManEp *rtmgr.Endpoint, rsmEp *rtmgr.Endpoint, routeTable *rtmgr.RouteTable) { - rtmgr.Logger.Debug("rpe.generatePlatformRoutes invoked") +func (r *Rpe) generatePlatformRoutes(e2TermEp *rtmgr.Endpoint, subManEp *rtmgr.Endpoint, e2ManEp *rtmgr.Endpoint, ueManEp *rtmgr.Endpoint, rsmEp *rtmgr.Endpoint, a1mediatorEp *rtmgr.Endpoint, routeTable *rtmgr.RouteTable) { + xapp.Logger.Debug("rpe.generatePlatformRoutes invoked") //Platform Routes --- Subscription Routes //Subscription Manager -> E2 Termination r.addRoute("RIC_SUB_REQ", subManEp, e2TermEp, routeTable, -1) @@ -195,42 +206,51 @@ func (r *Rpe) generatePlatformRoutes(e2TermEp *rtmgr.Endpoint, subManEp *rtmgr.E //E2 Termination -> Resource Status Manager r.addRoute("RIC_RES_STATUS_RESP", e2TermEp, rsmEp, routeTable, -1) r.addRoute("RIC_RES_STATUS_FAILURE", e2TermEp, rsmEp, routeTable, -1) + //ACxapp -> A1 Mediator + r.addRoute("A1_POLICY_QUERY", nil, a1mediatorEp, routeTable, -1) + r.addRoute("A1_POLICY_RESPONSE", nil, a1mediatorEp, routeTable, -1) } func (r *Rpe) generateRouteTable(endPointList rtmgr.Endpoints) *rtmgr.RouteTable { - rtmgr.Logger.Debug("rpe.generateRouteTable invoked") - rtmgr.Logger.Debug("Endpoint List: %v", endPointList) + xapp.Logger.Debug("rpe.generateRouteTable invoked") + xapp.Logger.Debug("Endpoint List: %v", endPointList) routeTable := &rtmgr.RouteTable{} e2TermEp := getEndpointByName(&endPointList, "E2TERM") if e2TermEp == nil { - rtmgr.Logger.Error("Platform component not found: %v", "E2 Termination") - rtmgr.Logger.Debug("Endpoints: %v", endPointList) + xapp.Logger.Error("Platform component not found: %v", "E2 Termination") + xapp.Logger.Debug("Endpoints: %v", endPointList) } subManEp := getEndpointByName(&endPointList, "SUBMAN") if subManEp == nil { - rtmgr.Logger.Error("Platform component not found: %v", "Subscription Manager") - rtmgr.Logger.Debug("Endpoints: %v", endPointList) + xapp.Logger.Error("Platform component not found: %v", "Subscription Manager") + xapp.Logger.Debug("Endpoints: %v", endPointList) } e2ManEp := getEndpointByName(&endPointList, "E2MAN") if e2ManEp == nil { - rtmgr.Logger.Error("Platform component not found: %v", "E2 Manager") - rtmgr.Logger.Debug("Endpoints: %v", endPointList) + xapp.Logger.Error("Platform component not found: %v", "E2 Manager") + xapp.Logger.Debug("Endpoints: %v", endPointList) } ueManEp := getEndpointByName(&endPointList, "UEMAN") if ueManEp == nil { - rtmgr.Logger.Error("Platform component not found: %v", "UE Manger") - rtmgr.Logger.Debug("Endpoints: %v", endPointList) + xapp.Logger.Error("Platform component not found: %v", "UE Manger") + xapp.Logger.Debug("Endpoints: %v", endPointList) } rsmEp := getEndpointByName(&endPointList, "RSM") if rsmEp == nil { - rtmgr.Logger.Error("Platform component not found: %v", "Resource Status Manager") - rtmgr.Logger.Debug("Endpoints: %v", endPointList) + xapp.Logger.Error("Platform component not found: %v", "Resource Status Manager") + xapp.Logger.Debug("Endpoints: %v", endPointList) } - r.generatePlatformRoutes(e2TermEp, subManEp, e2ManEp, ueManEp, rsmEp, routeTable) + A1MediatorEp := getEndpointByName(&endPointList, "A1MEDIATOR") + if A1MediatorEp == nil { + xapp.Logger.Error("Platform component not found: %v", "A1Mediator") + xapp.Logger.Debug("Endpoints: %v", endPointList) + } + + r.generatePlatformRoutes(e2TermEp, subManEp, e2ManEp, ueManEp, rsmEp, A1MediatorEp, routeTable) for _, endPoint := range endPointList { - rtmgr.Logger.Debug("Endpoint: %v, xAppType: %v", endPoint.Name, endPoint.XAppType) - if endPoint.XAppType != sbi.PlatformType && ( len(endPoint.TxMessages) > 0 || len(endPoint.RxMessages) > 0 ) { + xapp.Logger.Debug("Endpoint: %v, xAppType: %v", endPoint.Name, endPoint.XAppType) + if endPoint.XAppType != sbi.PlatformType && (len(endPoint.TxMessages) > 0 || len(endPoint.RxMessages) > 0) { r.generateXappRoutes(endPoint, e2TermEp, subManEp, routeTable) r.generateSubscriptionRoutes(endPoint, e2TermEp, subManEp, routeTable) } diff --git a/pkg/rtmgr/rtmgr.go b/pkg/rtmgr/rtmgr.go index 83af71a..daf84b8 100644 --- a/pkg/rtmgr/rtmgr.go +++ b/pkg/rtmgr/rtmgr.go @@ -31,11 +31,10 @@ package rtmgr import ( "encoding/json" "errors" + "gerrit.o-ran-sc.org/r/ric-plt/xapp-frame/pkg/xapp" + "github.com/ghodss/yaml" "io/ioutil" "os" - "strings" - - "github.com/jcelliott/lumber" ) var ( @@ -99,6 +98,9 @@ var ( "RIC_INDICATION": "12050", "DC_ADM_INT_CONTROL": "20000", "DC_ADM_INT_CONTROL_ACK": "20001", + "A1_POLICY_REQ": "20010", + "A1_POLICY_RESPONSE": "20011", + "A1_POLICY_QUERY": "20012", "RIC_CONTROL_XAPP_CONFIG_REQUEST": "100000", "RIC_CONTROL_XAPP_CONFIG_RESPONSE": "100001", } @@ -107,60 +109,38 @@ var ( // This implements static default routes needed by the RIC. Needs to be changed in case new components/message types needes to be added/updated. // Representation : {"componentName1": {"tx": , "rx": }} PLATFORMMESSAGETYPES = map[string]map[string][]string{ - "E2TERM": {"tx": []string{"RIC_X2_SETUP_REQ", "RIC_X2_SETUP_RESP", "RIC_X2_SETUP_FAILURE", "RIC_X2_RESET", "RIC_X2_RESET_RESP", "RIC_ENDC_X2_SETUP_REQ", "RIC_ENDC_X2_SETUP_RESP", "RIC_ENDC_X2_SETUP_FAILURE", "RIC_SUB_RESP", "RIC_SUB_FAILURE", "RIC_SUB_DEL_RESP", "RIC_SUB_DEL_FAILURE"}, "rx": []string{"RIC_X2_SETUP_REQ", "RIC_X2_SETUP_RESP", "RIC_X2_SETUP_FAILURE", "RIC_X2_RESET", "RIC_X2_RESET_RESP", "RIC_ENDC_X2_SETUP_REQ", "RIC_ENDC_X2_SETUP_RESP", "RIC_ENDC_X2_SETUP_FAILURE", "RIC_SUB_REQ", "RIC_SUB_DEL_REQ", "RIC_CONTROL_REQ"}}, - "E2MAN": {"tx": []string{"RIC_X2_SETUP_REQ", "RIC_X2_SETUP_RESP", "RIC_X2_SETUP_FAILURE", "RIC_X2_RESET", "RIC_X2_RESET_RESP", "RIC_ENDC_X2_SETUP_REQ", "RIC_ENDC_X2_SETUP_RESP", "RIC_ENDC_X2_SETUP_FAILURE"}, "rx": []string{"RIC_X2_SETUP_REQ", "RIC_X2_SETUP_RESP", "RIC_X2_SETUP_FAILURE", "RIC_X2_RESET", "RIC_X2_RESET_RESP", "RIC_ENDC_X2_SETUP_REQ", "RIC_ENDC_X2_SETUP_RESP", "RIC_ENDC_X2_SETUP_FAILURE"}}, - "SUBMAN": {"tx": []string{"RIC_SUB_REQ", "RIC_SUB_DEL_REQ"}, "rx": []string{"RIC_SUB_RESP", "RIC_SUB_FAILURE", "RIC_SUB_DEL_RESP", "RIC_SUB_DEL_FAILURE"}}, - "UEMAN": {"tx": []string{"RIC_CONTROL_REQ"}, "rx": []string{}}, - "RSM": {"tx": []string{"RIC_RES_STATUS_REQ"}, "rx": []string{"RAN_CONNECTED", "RAN_RESTARTED", "RAN_RECONFIGURED"}}, + "E2TERM": {"tx": []string{"RIC_X2_SETUP_REQ", "RIC_X2_SETUP_RESP", "RIC_X2_SETUP_FAILURE", "RIC_X2_RESET", "RIC_X2_RESET_RESP", "RIC_ENDC_X2_SETUP_REQ", "RIC_ENDC_X2_SETUP_RESP", "RIC_ENDC_X2_SETUP_FAILURE", "RIC_SUB_RESP", "RIC_SUB_FAILURE", "RIC_SUB_DEL_RESP", "RIC_SUB_DEL_FAILURE"}, "rx": []string{"RIC_X2_SETUP_REQ", "RIC_X2_SETUP_RESP", "RIC_X2_SETUP_FAILURE", "RIC_X2_RESET", "RIC_X2_RESET_RESP", "RIC_ENDC_X2_SETUP_REQ", "RIC_ENDC_X2_SETUP_RESP", "RIC_ENDC_X2_SETUP_FAILURE", "RIC_SUB_REQ", "RIC_SUB_DEL_REQ", "RIC_CONTROL_REQ"}}, + "E2MAN": {"tx": []string{"RIC_X2_SETUP_REQ", "RIC_X2_SETUP_RESP", "RIC_X2_SETUP_FAILURE", "RIC_X2_RESET", "RIC_X2_RESET_RESP", "RIC_ENDC_X2_SETUP_REQ", "RIC_ENDC_X2_SETUP_RESP", "RIC_ENDC_X2_SETUP_FAILURE"}, "rx": []string{"RIC_X2_SETUP_REQ", "RIC_X2_SETUP_RESP", "RIC_X2_SETUP_FAILURE", "RIC_X2_RESET", "RIC_X2_RESET_RESP", "RIC_ENDC_X2_SETUP_REQ", "RIC_ENDC_X2_SETUP_RESP", "RIC_ENDC_X2_SETUP_FAILURE"}}, + "SUBMAN": {"tx": []string{"RIC_SUB_REQ", "RIC_SUB_DEL_REQ"}, "rx": []string{"RIC_SUB_RESP", "RIC_SUB_FAILURE", "RIC_SUB_DEL_RESP", "RIC_SUB_DEL_FAILURE"}}, + "UEMAN": {"tx": []string{"RIC_CONTROL_REQ"}, "rx": []string{}}, + "RSM": {"tx": []string{"RIC_RES_STATUS_REQ"}, "rx": []string{"RAN_CONNECTED", "RAN_RESTARTED", "RAN_RECONFIGURED"}}, + "A1MEDIATOR": {"tx": []string{}, "rx": []string{"A1_POLICY_QUERY", "A1_POLICY_RESPONSE"}}, } - Logger = lumber.NewConsoleLogger(lumber.INFO) - Eps Endpoints - Subs SubscriptionList + Eps Endpoints + Subs SubscriptionList ) -func SetLogLevel(loglevel string) error { - switch strings.ToUpper(loglevel) { - case "INFO": - Logger.Level(lumber.INFO) - return nil - case "WARN": - Logger.Level(lumber.WARN) - return nil - case "ERROR": - Logger.Level(lumber.ERROR) - return nil - case "DEBUG": - Logger.Info("Debug mode") - Logger.Level(lumber.DEBUG) - return nil - case "TRACE": - Logger.Info("Trace mode") - Logger.Level(lumber.TRACE) - return nil - default: - Logger.Error("invalid log mode, setting info") - Logger.Level(lumber.INFO) - return errors.New("invalid log level, setting info") - } -} - func GetPlatformComponents(configfile string) (*PlatformComponents, error) { - Logger.Debug("Invoked rtmgr.GetPlatformComponents(" + configfile + ")") + xapp.Logger.Debug("Invoked rtmgr.GetPlatformComponents(" + configfile + ")") var rcfg ConfigRtmgr - jsonFile, err := os.Open(configfile) + yamlFile, err := os.Open(configfile) if err != nil { return nil, errors.New("cannot open the file due to: " + err.Error()) } - defer jsonFile.Close() - byteValue, err := ioutil.ReadAll(jsonFile) + defer yamlFile.Close() + byteValue, err := ioutil.ReadAll(yamlFile) + if err != nil { + return nil, errors.New("cannot read the file due to: " + err.Error()) + } + jsonByteValue, err := yaml.YAMLToJSON(byteValue) if err != nil { return nil, errors.New("cannot read the file due to: " + err.Error()) } - err = json.Unmarshal(byteValue, &rcfg) + err = json.Unmarshal(jsonByteValue, &rcfg) if err != nil { return nil, errors.New("cannot parse data due to: " + err.Error()) } - Logger.Debug("Platform components read from the configfile: %v", rcfg.Pcs) + xapp.Logger.Debug("Platform components read from the configfile: %v", rcfg.Pcs) return &(rcfg.Pcs), nil } diff --git a/pkg/rtmgr/types.go b/pkg/rtmgr/types.go index 9674a5d..5ad23e0 100644 --- a/pkg/rtmgr/types.go +++ b/pkg/rtmgr/types.go @@ -49,6 +49,7 @@ type Endpoint struct { Port uint16 TxMessages []string RxMessages []string + Policies []int32 Socket interface{} IsReady bool Keepalive bool @@ -75,6 +76,7 @@ type XAppInstance struct { Port uint16 `json:"port"` TxMessages []string `json:"txMessages"` RxMessages []string `json:"rxMessages"` + Policies []int32 `json:"policies"` } type PlatformComponents []struct { diff --git a/pkg/sbi/nngpush.go b/pkg/sbi/nngpush.go index 4f56753..8438064 100644 --- a/pkg/sbi/nngpush.go +++ b/pkg/sbi/nngpush.go @@ -30,6 +30,7 @@ package sbi import ( "errors" + "gerrit.o-ran-sc.org/r/ric-plt/xapp-frame/pkg/xapp" "nanomsg.org/go/mangos/v2" "nanomsg.org/go/mangos/v2/protocol/push" _ "nanomsg.org/go/mangos/v2/transport/all" @@ -49,7 +50,7 @@ func NewNngPush() *NngPush { } func createNewPushSocket() (NngSocket, error) { - rtmgr.Logger.Debug("Invoked: createNewPushSocket()") + xapp.Logger.Debug("Invoked: createNewPushSocket()") socket, err := push.NewSocket() if err != nil { return nil, errors.New("can't create new push socket due to:" + err.Error()) @@ -59,18 +60,18 @@ func createNewPushSocket() (NngSocket, error) { } func pipeEventHandler(event mangos.PipeEvent, pipe mangos.Pipe) { - rtmgr.Logger.Debug("Invoked: pipeEventHandler()") - rtmgr.Logger.Debug("Received pipe event for " + pipe.Address() + " address") + xapp.Logger.Debug("Invoked: pipeEventHandler()") + xapp.Logger.Debug("Received pipe event for " + pipe.Address() + " address") for _, ep := range rtmgr.Eps { uri := DefaultNngPipelineSocketPrefix + ep.Ip + ":" + strconv.Itoa(DefaultNngPipelineSocketNumber) if uri == pipe.Address() { switch event { case 1: ep.IsReady = true - rtmgr.Logger.Debug("Endpoint " + uri + " successfully attached") + xapp.Logger.Debug("Endpoint " + uri + " successfully attached") default: ep.IsReady = false - rtmgr.Logger.Debug("Endpoint " + uri + " has been detached") + xapp.Logger.Debug("Endpoint " + uri + " has been detached") } } } @@ -87,8 +88,8 @@ func (c *NngPush) Terminate() error { func (c *NngPush) AddEndpoint(ep *rtmgr.Endpoint) error { var err error var socket NngSocket - rtmgr.Logger.Debug("Invoked sbi.AddEndpoint") - rtmgr.Logger.Debug("args: %v", *ep) + xapp.Logger.Debug("Invoked sbi.AddEndpoint") + xapp.Logger.Debug("args: %v", *ep) socket, err = c.NewSocket() if err != nil { return errors.New("can't add new socket to endpoint:" + ep.Uuid + " due to: " + err.Error()) @@ -102,8 +103,8 @@ func (c *NngPush) AddEndpoint(ep *rtmgr.Endpoint) error { } func (c *NngPush) DeleteEndpoint(ep *rtmgr.Endpoint) error { - rtmgr.Logger.Debug("Invoked sbi. DeleteEndpoint") - rtmgr.Logger.Debug("args: %v", *ep) + xapp.Logger.Debug("Invoked sbi. DeleteEndpoint") + xapp.Logger.Debug("args: %v", *ep) if err := ep.Socket.(NngSocket).Close(); err != nil { return errors.New("can't close push socket of endpoint:" + ep.Uuid + " due to: " + err.Error()) } @@ -118,7 +119,7 @@ func (c *NngPush) UpdateEndpoints(rcs *rtmgr.RicComponents) { NOTE: Asynchronous dial starts a goroutine which keep maintains the connection to the given endpoint */ func (c *NngPush) dial(ep *rtmgr.Endpoint) error { - rtmgr.Logger.Debug("Dialing to endpoint: " + ep.Uuid) + xapp.Logger.Debug("Dialing to endpoint: " + ep.Uuid) uri := DefaultNngPipelineSocketPrefix + ep.Ip + ":" + strconv.Itoa(DefaultNngPipelineSocketNumber) options := make(map[string]interface{}) options[mangos.OptionDialAsynch] = true @@ -129,24 +130,24 @@ func (c *NngPush) dial(ep *rtmgr.Endpoint) error { } func (c *NngPush) DistributeAll(policies *[]string) error { - rtmgr.Logger.Debug("Invoked: sbi.DistributeAll") - rtmgr.Logger.Debug("args: %v", *policies) + xapp.Logger.Debug("Invoked: sbi.DistributeAll") + xapp.Logger.Debug("args: %v", *policies) for _, ep := range rtmgr.Eps { if ep.IsReady { go c.send(ep, policies) } else { - rtmgr.Logger.Warn("Endpoint " + ep.Uuid + " is not ready") + xapp.Logger.Warn("Endpoint " + ep.Uuid + " is not ready") } } return nil } func (c *NngPush) send(ep *rtmgr.Endpoint, policies *[]string) { - rtmgr.Logger.Debug("Push policy to endpoint: " + ep.Uuid) + xapp.Logger.Debug("Push policy to endpoint: " + ep.Uuid) for _, pe := range *policies { if err := ep.Socket.(NngSocket).Send([]byte(pe)); err != nil { - rtmgr.Logger.Error("Unable to send policy entry due to: " + err.Error()) + xapp.Logger.Error("Unable to send policy entry due to: " + err.Error()) } } - rtmgr.Logger.Info("NNG PUSH to endpoint " + ep.Uuid + ": OK (# of Entries:" + strconv.Itoa(len(*policies)) + ")") + xapp.Logger.Info("NNG PUSH to endpoint " + ep.Uuid + ": OK (# of Entries:" + strconv.Itoa(len(*policies)) + ")") } diff --git a/pkg/sbi/sbi.go b/pkg/sbi/sbi.go index 2737cc1..ae63034 100644 --- a/pkg/sbi/sbi.go +++ b/pkg/sbi/sbi.go @@ -31,6 +31,7 @@ package sbi import ( "errors" + "gerrit.o-ran-sc.org/r/ric-plt/xapp-frame/pkg/xapp" "routing-manager/pkg/rtmgr" "strconv" ) @@ -64,10 +65,10 @@ type Sbi struct { } func (s *Sbi) pruneEndpointList(sbi Engine) { - rtmgr.Logger.Debug("pruneEndpointList invoked.") + xapp.Logger.Debug("pruneEndpointList invoked.") for _, ep := range rtmgr.Eps { if !ep.Keepalive { - rtmgr.Logger.Debug("deleting %v", ep) + xapp.Logger.Debug("deleting %v", ep) sbi.DeleteEndpoint(ep) delete(rtmgr.Eps, ep.Uuid) } else { @@ -77,8 +78,8 @@ func (s *Sbi) pruneEndpointList(sbi Engine) { } func (s *Sbi) updateEndpoints(rcs *rtmgr.RicComponents, sbi Engine) { - for _, xapp := range (*rcs).XApps { - for _, instance := range xapp.Instances { + for _, xapps := range (*rcs).XApps { + for _, instance := range xapps.Instances { uuid := instance.Ip + ":" + strconv.Itoa(int(instance.Port)) if _, ok := rtmgr.Eps[uuid]; ok { rtmgr.Eps[uuid].Keepalive = true @@ -86,17 +87,18 @@ func (s *Sbi) updateEndpoints(rcs *rtmgr.RicComponents, sbi Engine) { ep := &rtmgr.Endpoint{ Uuid: uuid, Name: instance.Name, - XAppType: xapp.Name, + XAppType: xapps.Name, Ip: instance.Ip, Port: instance.Port, TxMessages: instance.TxMessages, RxMessages: instance.RxMessages, + Policies: instance.Policies, Socket: nil, IsReady: false, Keepalive: true, } if err := sbi.AddEndpoint(ep); err != nil { - rtmgr.Logger.Error("can't create socket for endpoint: " + ep.Name + " due to:" + err.Error()) + xapp.Logger.Error("can't create socket for endpoint: " + ep.Name + " due to:" + err.Error()) continue } rtmgr.Eps[uuid] = ep @@ -108,7 +110,7 @@ func (s *Sbi) updateEndpoints(rcs *rtmgr.RicComponents, sbi Engine) { } func (s *Sbi) updatePlatformEndpoints(pcs *rtmgr.PlatformComponents, sbi Engine) { - rtmgr.Logger.Debug("updatePlatformEndpoints invoked. PCS: %v", *pcs) + xapp.Logger.Debug("updatePlatformEndpoints invoked. PCS: %v", *pcs) for _, pc := range *pcs { uuid := pc.Fqdn + ":" + strconv.Itoa(int(pc.Port)) if _, ok := rtmgr.Eps[uuid]; ok { @@ -126,9 +128,9 @@ func (s *Sbi) updatePlatformEndpoints(pcs *rtmgr.PlatformComponents, sbi Engine) IsReady: false, Keepalive: true, } - rtmgr.Logger.Debug("ep created: %v", ep) + xapp.Logger.Debug("ep created: %v", ep) if err := sbi.AddEndpoint(ep); err != nil { - rtmgr.Logger.Error("can't create socket for endpoint: " + ep.Name + " due to:" + err.Error()) + xapp.Logger.Error("can't create socket for endpoint: " + ep.Name + " due to:" + err.Error()) continue } rtmgr.Eps[uuid] = ep diff --git a/pkg/sdl/file.go b/pkg/sdl/file.go index 90b1ed0..841e406 100644 --- a/pkg/sdl/file.go +++ b/pkg/sdl/file.go @@ -31,6 +31,7 @@ package sdl import ( "encoding/json" "errors" + "gerrit.o-ran-sc.org/r/ric-plt/xapp-frame/pkg/xapp" "io/ioutil" "os" "routing-manager/pkg/rtmgr" @@ -52,7 +53,7 @@ func NewFile() *File { } func (f *File) ReadAll(file string) (*rtmgr.RicComponents, error) { - rtmgr.Logger.Debug("Invoked sdl.ReadAll(" + file + ")") + xapp.Logger.Debug("Invoked sdl.ReadAll(" + file + ")") var rcs *rtmgr.RicComponents jsonFile, err := os.Open(file) if err != nil { @@ -68,14 +69,14 @@ func (f *File) ReadAll(file string) (*rtmgr.RicComponents, error) { if err != nil { return nil, errors.New("cannot parse data due to: " + err.Error()) } - rtmgr.Logger.Debug("file.fileReadAll returns: %v", rcs) + xapp.Logger.Debug("file.fileReadAll returns: %v", rcs) return rcs, nil } func (f *File) WriteAll(file string, rcs *rtmgr.RicComponents) error { - rtmgr.Logger.Debug("Invoked sdl.WriteAll") - rtmgr.Logger.Debug("file.fileWriteAll writes into file: " + file) - rtmgr.Logger.Debug("file.fileWriteAll writes data: %v", *rcs) + xapp.Logger.Debug("Invoked sdl.WriteAll") + xapp.Logger.Debug("file.fileWriteAll writes into file: " + file) + xapp.Logger.Debug("file.fileWriteAll writes data: %v", *rcs) byteValue, err := json.Marshal(rcs) if err != nil { return errors.New("cannot convert data due to: " + err.Error()) @@ -88,13 +89,13 @@ func (f *File) WriteAll(file string, rcs *rtmgr.RicComponents) error { } func (f *File) WriteXApps(file string, xApps *[]rtmgr.XApp) error { - rtmgr.Logger.Debug("Invoked sdl.WriteXApps") - rtmgr.Logger.Debug("file.fileWriteXApps writes into file: " + file) - rtmgr.Logger.Debug("file.fileWriteXApps writes data: %v", *xApps) + xapp.Logger.Debug("Invoked sdl.WriteXApps") + xapp.Logger.Debug("file.fileWriteXApps writes into file: " + file) + xapp.Logger.Debug("file.fileWriteXApps writes data: %v", *xApps) ricData, err := NewFile().ReadAll(file) if err != nil { - rtmgr.Logger.Error("cannot get data from sdl interface due to: " + err.Error()) + xapp.Logger.Error("cannot get data from sdl interface due to: " + err.Error()) return errors.New("cannot read full ric data to modify xApps data, due to: " + err.Error()) } ricData.XApps = *xApps diff --git a/run_rtmgr.sh b/run_rtmgr.sh index 4ea5349..7a48fff 100644 --- a/run_rtmgr.sh +++ b/run_rtmgr.sh @@ -26,4 +26,5 @@ # Abstract: Runs the rtmgr executable with proper arguments # Date: 19 March 2019 # -exec ./rtmgr -xm-url=$XMURL -nbi=$NBI -nbi-if=$NBIURL -sbi=$SBI -sbi-if=$SBIURL -filename=$RTFILE -rpe=$RPE -loglevel=$LOGLEVEL -configfile=$CFGFILE +#exec ./rtmgr -xm-url=$XMURL -nbi=$NBI -nbi-if=$NBIURL -sbi=$SBI -sbi-if=$SBIURL -filename=$RTFILE -rpe=$RPE -loglevel=$LOGLEVEL -configfile=$CFGFILE +exec ./rtmgr -f $CFGFILE