# 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
&& 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
+### 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
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"
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
}
}
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())
}
}
}
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()
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.")
}
}
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)
# 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
--- /dev/null
+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
--- /dev/null
+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=
"port": 4561
}
]
+ "local":
+ "host": ":8080"
+ "logger":
+ "level": 3
+ "rmr":
+ "protPort": "tcp:4560"
+ "maxSize": 2072
+ "numWorkers": 1
}
value: "http://rtmgr:8888"
- name: CFGFILE
value: "/cfg/rtmgr-config.json"
- - name: LOGLEVEL
- value: "DEBUG"
ports:
- containerPort: 8888
- containerPort: 4560
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"
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
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
}
"net"
"net/http"
"net/http/httptest"
- "routing-manager/pkg/rtmgr"
"testing"
)
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 {
"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"
// 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
}
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
}
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
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
}
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
}
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)
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()
}
})
// 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
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
}
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)
} 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
}
}
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)
}()
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)
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
}
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
}
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
}
}
}
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 {
}
}
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
}
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"
// 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"})
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
}
}
package rpe
import (
+ "gerrit.o-ran-sc.org/r/ric-plt/xapp-frame/pkg/xapp"
"routing-manager/pkg/rtmgr"
"strconv"
)
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, "")
}
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 (
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
}
}
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
}
}
}
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)
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)
}
}
-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)
//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)
}
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 (
"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",
}
// 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": <tx message type list>, "rx": <rx message type list>}}
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
}
Port uint16
TxMessages []string
RxMessages []string
+ Policies []int32
Socket interface{}
IsReady bool
Keepalive bool
Port uint16 `json:"port"`
TxMessages []string `json:"txMessages"`
RxMessages []string `json:"rxMessages"`
+ Policies []int32 `json:"policies"`
}
type PlatformComponents []struct {
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"
}
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())
}
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")
}
}
}
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())
}
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())
}
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
}
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)) + ")")
}
import (
"errors"
+ "gerrit.o-ran-sc.org/r/ric-plt/xapp-frame/pkg/xapp"
"routing-manager/pkg/rtmgr"
"strconv"
)
}
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 {
}
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
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
}
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 {
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
import (
"encoding/json"
"errors"
+ "gerrit.o-ran-sc.org/r/ric-plt/xapp-frame/pkg/xapp"
"io/ioutil"
"os"
"routing-manager/pkg/rtmgr"
}
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 {
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())
}
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
# 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