diff options
Diffstat (limited to 'proxy/proxy.go')
-rw-r--r-- | proxy/proxy.go | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/proxy/proxy.go b/proxy/proxy.go new file mode 100644 index 0000000..1f8f824 --- /dev/null +++ b/proxy/proxy.go @@ -0,0 +1,102 @@ +// Copyright (c) 2019 Cisco and/or its affiliates. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at: +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// 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. + +package proxy + +import ( + "log" + "net" + "net/http" + "net/rpc" + + "git.fd.io/govpp.git/adapter" + "git.fd.io/govpp.git/core" +) + +// Server defines a proxy server that serves client requests to stats and binapi. +type Server struct { + rpc *rpc.Server + + statsConn *core.StatsConnection + binapiConn *core.Connection +} + +func NewServer() *Server { + return &Server{ + rpc: rpc.NewServer(), + } +} + +func (p *Server) ConnectStats(stats adapter.StatsAPI) error { + var err error + p.statsConn, err = core.ConnectStats(stats) + if err != nil { + return err + } + return nil +} + +func (p *Server) DisconnectStats() { + if p.statsConn != nil { + p.statsConn.Disconnect() + } +} + +func (p *Server) ConnectBinapi(binapi adapter.VppAPI) error { + var err error + p.binapiConn, err = core.Connect(binapi) + if err != nil { + return err + } + return nil +} + +func (p *Server) DisconnectBinapi() { + if p.binapiConn != nil { + p.binapiConn.Disconnect() + } +} + +func (p *Server) ListenAndServe(addr string) { + if p.statsConn != nil { + statsRPC := NewStatsRPC(p.statsConn) + if err := p.rpc.Register(statsRPC); err != nil { + panic(err) + } + } + if p.binapiConn != nil { + ch, err := p.binapiConn.NewAPIChannel() + if err != nil { + panic(err) + } + binapiRPC := NewBinapiRPC(ch) + if err := p.rpc.Register(binapiRPC); err != nil { + panic(err) + } + } + + p.rpc.HandleHTTP(rpc.DefaultRPCPath, rpc.DefaultDebugPath) + + l, e := net.Listen("tcp", addr) + if e != nil { + log.Fatal("listen error:", e) + } + defer l.Close() + + log.Printf("proxy serving on: %v", addr) + + if err := http.Serve(l, nil); err != nil { + log.Fatalln(err) + } +} |