diff options
author | Rastislav Szabo <raszabo@cisco.com> | 2017-05-25 13:47:43 +0200 |
---|---|---|
committer | Rastislav Szabo <raszabo@cisco.com> | 2017-05-25 13:54:13 +0200 |
commit | 2d07847237e754d9050f06f565baa430c70ed937 (patch) | |
tree | 80588aeec912e95fa21b51520bbd527eb87f455b /examples | |
parent | c38cb25d746736f062ee16e87f553c8a4ec5fced (diff) |
added async connect API, new structure of examples
Change-Id: Iab9bce174596c30998981e02b7030c248c423384
Signed-off-by: Rastislav Szabo <raszabo@cisco.com>
Diffstat (limited to 'examples')
-rw-r--r-- | examples/cmd/simple-client/simple_client.go (renamed from examples/example_client.go) | 63 | ||||
-rw-r--r-- | examples/cmd/stats-client/stats_client.go | 132 |
2 files changed, 135 insertions, 60 deletions
diff --git a/examples/example_client.go b/examples/cmd/simple-client/simple_client.go index f2e5804..6e46d6b 100644 --- a/examples/example_client.go +++ b/examples/cmd/simple-client/simple_client.go @@ -12,7 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -// Example VPP management application that exercises the govpp API on real-world use-cases. +// Binary simple-client is an example VPP management application that exercises the +// govpp API on real-world use-cases. package main // Generates Go bindings for all VPP APIs located in the json directory. @@ -22,19 +23,16 @@ import ( "fmt" "net" "os" - "os/signal" "git.fd.io/govpp.git" "git.fd.io/govpp.git/api" - "git.fd.io/govpp.git/api/ifcounters" - "git.fd.io/govpp.git/core/bin_api/vpe" "git.fd.io/govpp.git/examples/bin_api/acl" "git.fd.io/govpp.git/examples/bin_api/interfaces" "git.fd.io/govpp.git/examples/bin_api/tap" ) func main() { - fmt.Println("Starting example VPP client...") + fmt.Println("Starting simple VPP client...") // connect to VPP conn, err := govpp.Connect() @@ -64,8 +62,6 @@ func main() { interfaceDump(ch) interfaceNotifications(ch) - - //interfaceCounters(ch) } // compatibilityCheck shows how an management application can check whether generated API messages are @@ -223,56 +219,3 @@ func interfaceNotifications(ch *api.Channel) { // unsubscribe from delivery of the notifications ch.UnsubscribeNotification(subs) } - -// interfaceCounters is an example of using notification API to periodically retrieve interface statistics. -// The ifcounters package contains the API that can be used to decode the strange VnetInterfaceCounters message. -func interfaceCounters(ch *api.Channel) { - // subscribe for interface counters notifications - notifChan := make(chan api.Message, 100) - subs, _ := ch.SubscribeNotification(notifChan, interfaces.NewVnetInterfaceCounters) - - // enable interface counters notifications from VPP - ch.SendRequest(&vpe.WantStats{ - Pid: uint32(os.Getpid()), - EnableDisable: 1, - }).ReceiveReply(&vpe.WantStatsReply{}) - - // create channel for Interrupt signal - sigChan := make(chan os.Signal, 1) - signal.Notify(sigChan, os.Interrupt) - - // loop until Interrupt signal is received -loop: - for { - select { - case <-sigChan: - // interrupt received - break loop - case notifMsg := <-notifChan: - notif := notifMsg.(*interfaces.VnetInterfaceCounters) - // notification received - fmt.Printf("%+v\n", notif) - - if notif.IsCombined == 0 { - // simple counter - counters, err := ifcounters.DecodeCounters(ifcounters.VnetInterfaceCounters(*notif)) - if err != nil { - fmt.Println("Error:", err) - } else { - fmt.Printf("%+v\n", counters) - } - } else { - // combined counter - counters, err := ifcounters.DecodeCombinedCounters(ifcounters.VnetInterfaceCounters(*notif)) - if err != nil { - fmt.Println("Error:", err) - } else { - fmt.Printf("%+v\n", counters) - } - } - } - } - - // unsubscribe from delivery of the notifications - ch.UnsubscribeNotification(subs) -} diff --git a/examples/cmd/stats-client/stats_client.go b/examples/cmd/stats-client/stats_client.go new file mode 100644 index 0000000..fc40b24 --- /dev/null +++ b/examples/cmd/stats-client/stats_client.go @@ -0,0 +1,132 @@ +// Copyright (c) 2017 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. + +// Binary stats-client is an example VPP management application that exercises the +// govpp API for interface counters together with asynchronous connection to VPP. +package main + +// Generates Go bindings for all VPP APIs located in the json directory. +//go:generate binapi-generator --input-dir=bin_api --output-dir=bin_api + +import ( + "fmt" + "os" + "os/signal" + + "git.fd.io/govpp.git" + "git.fd.io/govpp.git/api" + "git.fd.io/govpp.git/api/ifcounters" + "git.fd.io/govpp.git/core" + "git.fd.io/govpp.git/core/bin_api/vpe" + "git.fd.io/govpp.git/examples/bin_api/interfaces" +) + +func main() { + fmt.Println("Starting stats VPP client...") + + // async connect to VPP + conn, statCh, err := govpp.AsyncConnect() + if err != nil { + fmt.Println("Error:", err) + os.Exit(1) + } + defer conn.Disconnect() + + // create an API channel that will be used in the examples + ch, err := conn.NewAPIChannel() + if err != nil { + fmt.Println("Error:", err) + os.Exit(1) + } + defer ch.Close() + + // create channel for Interrupt signal + sigChan := make(chan os.Signal, 1) + signal.Notify(sigChan, os.Interrupt) + + var subs *api.NotifSubscription + var notifChan chan api.Message + + // loop until Interrupt signal is received +loop: + for { + select { + + case connEvent := <-statCh: + // VPP connection state change + switch connEvent.State { + case core.Connected: + fmt.Println("VPP connected.") + if subs == nil { + subs, notifChan = subscribeNotification(ch) + } + requestStatistics(ch) + + case core.Disconnected: + fmt.Println("VPP disconnected.") + } + + case notifMsg := <-notifChan: + // counter notification received + processCounters(notifMsg.(*interfaces.VnetInterfaceCounters)) + + case <-sigChan: + // interrupt received + fmt.Println("Interrupt received, exiting.") + break loop + } + } + + ch.UnsubscribeNotification(subs) +} + +// subscribeNotification subscribes for interface counters notifications. +func subscribeNotification(ch *api.Channel) (*api.NotifSubscription, chan api.Message) { + + notifChan := make(chan api.Message, 100) + subs, _ := ch.SubscribeNotification(notifChan, interfaces.NewVnetInterfaceCounters) + + return subs, notifChan +} + +// requestStatistics requests interface counters notifications from VPP. +func requestStatistics(ch *api.Channel) { + ch.SendRequest(&vpe.WantStats{ + Pid: uint32(os.Getpid()), + EnableDisable: 1, + }).ReceiveReply(&vpe.WantStatsReply{}) +} + +// processCounters processes a counter message received from VPP. +func processCounters(msg *interfaces.VnetInterfaceCounters) { + fmt.Printf("%+v\n", msg) + + if msg.IsCombined == 0 { + // simple counter + counters, err := ifcounters.DecodeCounters(ifcounters.VnetInterfaceCounters(*msg)) + if err != nil { + fmt.Println("Error:", err) + } else { + fmt.Printf("%+v\n", counters) + } + } else { + // combined counter + counters, err := ifcounters.DecodeCombinedCounters(ifcounters.VnetInterfaceCounters(*msg)) + if err != nil { + fmt.Println("Error:", err) + } else { + fmt.Printf("%+v\n", counters) + } + } +} |