VOL-4217: Update to latest version of protos and voltha-lib-go for
voltha-2.9 release. Tested with BAL3.10

Change-Id: Ibdc5978a1f2df713965a27ce26d0e22c1ffa366a
diff --git a/core/olt_manager.go b/core/olt_manager.go
index ab171ef..9264e22 100644
--- a/core/olt_manager.go
+++ b/core/olt_manager.go
@@ -22,8 +22,10 @@
 	"encoding/json"
 	"errors"
 	"fmt"
+	"github.com/golang/protobuf/jsonpb"
+	ponrmgr "github.com/opencord/voltha-lib-go/v7/pkg/ponresourcemanager"
+	"github.com/opencord/voltha-protos/v5/go/tech_profile"
 	"io"
-	"io/ioutil"
 	"os"
 	"strconv"
 	"sync"
@@ -32,10 +34,9 @@
 
 	"github.com/cenkalti/backoff/v3"
 	"github.com/opencord/openolt-scale-tester/config"
-	"github.com/opencord/voltha-lib-go/v4/pkg/db/kvstore"
-	"github.com/opencord/voltha-lib-go/v4/pkg/log"
-	"github.com/opencord/voltha-lib-go/v4/pkg/techprofile"
-	oop "github.com/opencord/voltha-protos/v4/go/openolt"
+	"github.com/opencord/voltha-lib-go/v7/pkg/db/kvstore"
+	"github.com/opencord/voltha-lib-go/v7/pkg/log"
+	oop "github.com/opencord/voltha-protos/v5/go/openolt"
 	"google.golang.org/grpc"
 	"google.golang.org/grpc/codes"
 	"google.golang.org/grpc/status"
@@ -55,11 +56,10 @@
 	ipPort             string
 	deviceInfo         *oop.DeviceInfo
 	OnuDeviceMap       map[OnuDeviceKey]*OnuDevice `json:"onuDeviceMap"`
-	TechProfile        map[uint32]*techprofile.TechProfileIf
 	clientConn         *grpc.ClientConn
 	openOltClient      oop.OpenoltClient
 	testConfig         *config.OpenOltScaleTesterConfig
-	rsrMgr             *OpenOltResourceMgr
+	rsrMgr             []*OpenOltResourceMgr
 	lockRsrAlloc       sync.RWMutex
 	lockOpenOltManager sync.RWMutex
 }
@@ -75,7 +75,6 @@
 }
 
 func (om *OpenOltManager) readAndLoadTPsToEtcd() {
-	var byteValue []byte
 	var err error
 	// Verify that etcd is up before starting the application.
 	etcdIpPort := "http://" + om.testConfig.KVStoreHost + ":" + strconv.Itoa(om.testConfig.KVStorePort)
@@ -98,14 +97,17 @@
 		}
 		logger.Debugw(nil, "tp-file-opened-successfully", log.Fields{"tpFile": tpFilePath})
 
-		// read our opened json file as a byte array.
-		if byteValue, err = ioutil.ReadAll(jsonFile); err != nil {
-			logger.Fatalw(nil, "could-not-read-tp-file", log.Fields{"err": err, "tpFile": tpFilePath})
-		}
+		/*
+			// read our opened json file as a byte array.
+			if byteValue, err = ioutil.ReadAll(jsonFile); err != nil {
+				logger.Fatalw(nil, "could-not-read-tp-file", log.Fields{"err": err, "tpFile": tpFilePath})
+			}
 
-		var tp techprofile.TechProfile
+		*/
 
-		if err = json.Unmarshal(byteValue, &tp); err != nil {
+		var tp tech_profile.TechProfile
+
+		if err = jsonpb.Unmarshal(jsonFile, &tp); err != nil {
 			logger.Fatalw(nil, "could-not-unmarshal-tp", log.Fields{"err": err, "tpFile": tpFilePath})
 		} else {
 			logger.Infow(nil, "tp-read-from-file", log.Fields{"tp": tp, "tpFile": tpFilePath})
@@ -121,8 +123,8 @@
 		if kvResult == nil {
 			logger.Fatal(nil, "tp-not-found-on-kv-after-load", log.Fields{"key": kvPath, "err": err})
 		} else {
-			var KvTpIns techprofile.TechProfile
-			var resPtr = &KvTpIns
+			var KvTp tech_profile.TechProfile
+			var resPtr = &KvTp
 			if value, err := kvstore.ToByte(kvResult.Value); err == nil {
 				if err = json.Unmarshal(value, resPtr); err != nil {
 					logger.Fatal(nil, "error-unmarshal-kv-result", log.Fields{"err": err, "key": kvPath, "value": value})
@@ -157,24 +159,20 @@
 	om.readAndLoadTPsToEtcd()
 
 	logger.Info(nil, "etcd-up-and-running--tp-loaded-successfully")
-
-	if om.rsrMgr = NewResourceMgr("ABCD", om.testConfig.KVStoreHost+":"+strconv.Itoa(om.testConfig.KVStorePort),
-		"etcd", "openolt", om.deviceInfo); om.rsrMgr == nil {
-		logger.Error(nil, "Error while instantiating resource manager")
-		return errors.New("instantiating resource manager failed")
-	}
-
-	om.TechProfile = make(map[uint32]*techprofile.TechProfileIf)
-	if err = om.populateTechProfilePerPonPort(); err != nil {
-		logger.Error(nil, "Error while populating tech profile mgr\n")
-		return errors.New("error-loading-tech-profile-per-ponPort")
+	om.rsrMgr = make([]*OpenOltResourceMgr, om.deviceInfo.PonPorts)
+	for ponIdx := range om.rsrMgr {
+		if om.rsrMgr[ponIdx] = NewResourceMgr("ABCD", om.testConfig.KVStoreHost+":"+strconv.Itoa(om.testConfig.KVStorePort),
+			"etcd", "openolt", uint32(ponIdx), om.deviceInfo); om.rsrMgr == nil {
+			logger.Error(nil, "Error while instantiating resource manager")
+			return errors.New("instantiating resource manager failed")
+		}
 	}
 
 	// Start reading indications
 	go om.readIndications()
 
 	// Provision OLT NNI Trap flows as needed by the Workflow
-	if err = ProvisionNniTrapFlow(om.openOltClient, om.testConfig, om.rsrMgr); err != nil {
+	if err = ProvisionNniTrapFlow(om.openOltClient, om.testConfig, om.rsrMgr[0]); err != nil {
 		logger.Error(nil, "failed-to-add-nni-trap-flow", log.Fields{"err": err})
 	}
 
@@ -205,8 +203,7 @@
 
 func (om *OpenOltManager) provisionONUs() {
 	var numOfONUsPerPon uint
-	var i, j, k, onuID uint32
-	var err error
+	var i, j, k uint32
 	var onuWg sync.WaitGroup
 
 	defer func() {
@@ -255,14 +252,17 @@
 				sn := GenerateNextONUSerialNumber()
 				om.lockRsrAlloc.Unlock()
 				logger.Debugw(nil, "provisioning onu", log.Fields{"onuID": j, "ponPort": i, "serialNum": sn})
-				if onuID, err = om.rsrMgr.GetONUID(j); err != nil {
+				ctx := context.Background()
+				newCtx := context.WithValue(ctx, "ponIf", i)
+				onuIDSl, err := om.rsrMgr[i].TechprofileRef.GetResourceID(newCtx, j, ponrmgr.ONU_ID, 1)
+				if err != nil {
 					logger.Errorw(nil, "error getting onu id", log.Fields{"err": err})
 					continue
 				}
-				logger.Infow(nil, "onu-provision-started-from-olt-manager", log.Fields{"onuId": onuID, "ponIntf": i})
+				logger.Infow(nil, "onu-provision-started-from-olt-manager", log.Fields{"onuId": onuIDSl[0], "ponIntf": i})
 
 				onuWg.Add(1)
-				go om.activateONU(j, onuID, sn, om.stringifySerialNumber(sn), &onuWg)
+				go om.activateONU(j, onuIDSl[0], sn, om.stringifySerialNumber(sn), &onuWg)
 			}
 		}
 		// Wait for the group of ONUs to complete processing before going to next batch of ONUs
@@ -295,7 +295,7 @@
 		PonIntf:       intfID,
 		openOltClient: om.openOltClient,
 		testConfig:    om.testConfig,
-		rsrMgr:        om.rsrMgr,
+		rsrMgr:        om.rsrMgr[intfID],
 		onuWg:         onuWg,
 	}
 	var err error
@@ -452,26 +452,6 @@
 	}
 }
 
-func (om *OpenOltManager) populateTechProfilePerPonPort() error {
-	var tpCount int
-	for _, techRange := range om.deviceInfo.Ranges {
-		for _, intfID := range techRange.IntfIds {
-			om.TechProfile[intfID] = &(om.rsrMgr.ResourceMgrs[intfID].TechProfileMgr)
-			tpCount++
-			logger.Debugw(nil, "Init tech profile done", log.Fields{"intfID": intfID})
-		}
-	}
-	//Make sure we have as many tech_profiles as there are pon ports on the device
-	if tpCount != int(om.deviceInfo.GetPonPorts()) {
-		logger.Errorw(nil, "Error while populating techprofile",
-			log.Fields{"numofTech": tpCount, "numPonPorts": om.deviceInfo.GetPonPorts()})
-		return errors.New("error while populating techprofile mgrs")
-	}
-	logger.Infow(nil, "Populated techprofile for ponports successfully",
-		log.Fields{"numofTech": tpCount, "numPonPorts": om.deviceInfo.GetPonPorts()})
-	return nil
-}
-
 func isPowerOfTwo(numOfOnus uint) bool {
 	return (numOfOnus & (numOfOnus - 1)) == 0
 }