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: