VOL-2518 - reconnect to voltha on disconnect
Change-Id: Ia497bb6a83312f15e54de0d7556753e1d9ef58b0
diff --git a/internal/pkg/ofagent/ofagent.go b/internal/pkg/ofagent/ofagent.go
index ea3b091..25041ab 100644
--- a/internal/pkg/ofagent/ofagent.go
+++ b/internal/pkg/ofagent/ofagent.go
@@ -18,6 +18,7 @@
import (
"context"
+ "fmt"
"github.com/opencord/ofagent-go/internal/pkg/openflow"
"github.com/opencord/voltha-lib-go/v3/pkg/log"
"github.com/opencord/voltha-lib-go/v3/pkg/probe"
@@ -39,6 +40,7 @@
ofaEventError
ofaStateConnected = ofaState(iota)
+ ofaStateConnecting
ofaStateDisconnected
)
@@ -147,6 +149,7 @@
// Kick off process to attempt to establish
// connection to voltha
+ state = ofaStateConnecting
go ofa.establishConnectionToVoltha(p)
case ofaEventVolthaConnected:
@@ -156,6 +159,16 @@
if state != ofaStateConnected {
state = ofaStateConnected
volthaCtx, volthaDone = context.WithCancel(context.Background())
+ // Reconnect clients
+ for _, client := range ofa.clientMap {
+ if logger.V(log.DebugLevel) {
+ logger.Debugw("reset-client-voltha-connection",
+ log.Fields{
+ "from": fmt.Sprintf("0x%p", &client.VolthaClient),
+ "to": fmt.Sprintf("0x%p", &ofa.volthaClient)})
+ }
+ client.VolthaClient = ofa.volthaClient
+ }
go ofa.receiveChangeEvents(volthaCtx)
go ofa.receivePacketsIn(volthaCtx)
go ofa.streamPacketOut(volthaCtx)
@@ -163,13 +176,31 @@
}
case ofaEventVolthaDisconnected:
+ if p != nil {
+ p.UpdateStatus("voltha", probe.ServiceStatusNotReady)
+ }
logger.Debug("ofagent-voltha-disconnect-event")
if state == ofaStateConnected {
state = ofaStateDisconnected
+ ofa.volthaClient = nil
+ for _, client := range ofa.clientMap {
+ client.VolthaClient = nil
+ if logger.V(log.DebugLevel) {
+ logger.Debugw("reset-client-voltha-connection",
+ log.Fields{
+ "from": fmt.Sprintf("0x%p", &client.VolthaClient),
+ "to": "nil"})
+ }
+ }
volthaDone()
volthaDone = nil
volthaCtx = nil
}
+ if state != ofaStateConnecting {
+ state = ofaStateConnecting
+ go ofa.establishConnectionToVoltha(p)
+ }
+
case ofaEventError:
logger.Debug("ofagent-error-event")
default: