aboutsummaryrefslogtreecommitdiffstats
path: root/examples
diff options
context:
space:
mode:
authorRastislav Szabo <raszabo@cisco.com>2017-05-25 13:47:43 +0200
committerRastislav Szabo <raszabo@cisco.com>2017-05-25 13:54:13 +0200
commit2d07847237e754d9050f06f565baa430c70ed937 (patch)
tree80588aeec912e95fa21b51520bbd527eb87f455b /examples
parentc38cb25d746736f062ee16e87f553c8a4ec5fced (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.go132
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)
+ }
+ }
+}