VOL-3936: Remove voltha-lib-go circular dependency between the
ponresourcemanager and techprofile module

Change-Id: Iccbce27cd3cd6582336507619dc6a16cb337a43e
diff --git a/internal/pkg/resourcemanager/resourcemanager.go b/internal/pkg/resourcemanager/resourcemanager.go
index 16b2723..3726ea5 100755
--- a/internal/pkg/resourcemanager/resourcemanager.go
+++ b/internal/pkg/resourcemanager/resourcemanager.go
@@ -26,10 +26,10 @@
 	"sync"
 	"time"
 
-	"github.com/opencord/voltha-lib-go/v5/pkg/db"
-	"github.com/opencord/voltha-lib-go/v5/pkg/db/kvstore"
-	"github.com/opencord/voltha-lib-go/v5/pkg/log"
-	ponrmgr "github.com/opencord/voltha-lib-go/v5/pkg/ponresourcemanager"
+	"github.com/opencord/voltha-lib-go/v6/pkg/db"
+	"github.com/opencord/voltha-lib-go/v6/pkg/db/kvstore"
+	"github.com/opencord/voltha-lib-go/v6/pkg/log"
+	ponrmgr "github.com/opencord/voltha-lib-go/v6/pkg/ponresourcemanager"
 	ofp "github.com/opencord/voltha-protos/v4/go/openflow_13"
 	"github.com/opencord/voltha-protos/v4/go/openolt"
 )
@@ -155,6 +155,10 @@
 	groupInfo     map[string]*GroupInfo
 	groupInfoLock sync.RWMutex
 	// Local maps used for write-through-cache - end
+
+	OnuIDMgmtLock     sync.RWMutex
+	GemPortIDMgmtLock sync.RWMutex
+	AllocIDMgmtLock   sync.RWMutex
 }
 
 func newKVClient(ctx context.Context, storeType string, address string, timeout time.Duration) (kvstore.Client, error) {
@@ -313,8 +317,10 @@
 // GetONUID returns the available onuID for the given pon-port
 func (rsrcMgr *OpenOltResourceMgr) GetONUID(ctx context.Context, PonIntfID uint32) (uint32, error) {
 	// Get ONU id for a provided pon interface ID.
-	onuID, err := rsrcMgr.PonRsrMgr.TechProfileMgr.GetResourceID(ctx, PonIntfID,
+	rsrcMgr.OnuIDMgmtLock.Lock()
+	onuID, err := rsrcMgr.PonRsrMgr.GetResourceID(ctx, PonIntfID,
 		ponrmgr.ONU_ID, 1)
+	rsrcMgr.OnuIDMgmtLock.Unlock()
 	if err != nil {
 		logger.Errorf(ctx, "Failed to get resource for interface %d for type %s",
 			PonIntfID, ponrmgr.ONU_ID)
@@ -472,13 +478,43 @@
 
 }
 
+// FreeResourceID frees PON resource ID like ONU ID, Alloc ID or GEM Port ID
+func (rsrcMgr *OpenOltResourceMgr) FreeResourceID(ctx context.Context, intfID uint32, resourceType string, ReleaseContent []uint32) error {
+	logger.Debugw(ctx, "freeing-resource-id", log.Fields{
+		"intf-id":         intfID,
+		"resource-type":   resourceType,
+		"release-content": ReleaseContent,
+	})
+	var err error
+	switch resourceType {
+	case rsrcMgr.PonRsrMgr.GetResourceTypeAllocID():
+		rsrcMgr.AllocIDMgmtLock.Lock()
+		err = rsrcMgr.PonRsrMgr.FreeResourceID(ctx, intfID, resourceType, ReleaseContent)
+		rsrcMgr.AllocIDMgmtLock.Unlock()
+	case rsrcMgr.PonRsrMgr.GetResourceTypeGemPortID():
+		rsrcMgr.GemPortIDMgmtLock.Lock()
+		err = rsrcMgr.PonRsrMgr.FreeResourceID(ctx, intfID, resourceType, ReleaseContent)
+		rsrcMgr.GemPortIDMgmtLock.Unlock()
+	case rsrcMgr.PonRsrMgr.GetResourceTypeOnuID():
+		rsrcMgr.OnuIDMgmtLock.Lock()
+		err = rsrcMgr.PonRsrMgr.FreeResourceID(ctx, intfID, resourceType, ReleaseContent)
+		rsrcMgr.OnuIDMgmtLock.Unlock()
+	default:
+		return fmt.Errorf("resourceType %s not supported", resourceType)
+	}
+	if err != nil {
+		return err
+	}
+	return nil
+}
+
 // FreeonuID releases(make free) onu id for a particular pon-port
 func (rsrcMgr *OpenOltResourceMgr) FreeonuID(ctx context.Context, intfID uint32, onuID []uint32) {
 	if len(onuID) == 0 {
 		logger.Info(ctx, "onu id slice is nil, nothing to free")
 		return
 	}
-	if err := rsrcMgr.PonRsrMgr.TechProfileMgr.FreeResourceID(ctx, intfID, ponrmgr.ONU_ID, onuID); err != nil {
+	if err := rsrcMgr.FreeResourceID(ctx, intfID, ponrmgr.ONU_ID, onuID); err != nil {
 		logger.Errorw(ctx, "error-while-freeing-onu-id", log.Fields{
 			"intf-id": intfID,
 			"onu-id":  onuID,
@@ -506,7 +542,7 @@
 	rsrcMgr.RemoveAllocIDForOnu(ctx, intfID, onuID, uniID, allocID)
 	allocIDs := make([]uint32, 0)
 	allocIDs = append(allocIDs, allocID)
-	if err := rsrcMgr.PonRsrMgr.TechProfileMgr.FreeResourceID(ctx, intfID, ponrmgr.ALLOC_ID, allocIDs); err != nil {
+	if err := rsrcMgr.FreeResourceID(ctx, intfID, ponrmgr.ALLOC_ID, allocIDs); err != nil {
 		logger.Errorw(ctx, "error-while-freeing-alloc-id", log.Fields{
 			"intf-id": intfID,
 			"onu-id":  onuID,
@@ -525,7 +561,7 @@
 
 	gemPortIDs := make([]uint32, 0)
 	gemPortIDs = append(gemPortIDs, gemPortID)
-	if err := rsrcMgr.PonRsrMgr.TechProfileMgr.FreeResourceID(ctx, intfID, ponrmgr.GEMPORT_ID, gemPortIDs); err != nil {
+	if err := rsrcMgr.FreeResourceID(ctx, intfID, ponrmgr.GEMPORT_ID, gemPortIDs); err != nil {
 		logger.Errorw(ctx, "error-while-freeing-gem-port-id", log.Fields{
 			"intf-id": intfID,
 			"onu-id":  onuID,
@@ -545,7 +581,7 @@
 	delete(rsrcMgr.allocIDsForOnu, intfOnuIDuniID)
 	rsrcMgr.allocIDsForOnuLock.Unlock()
 
-	if err := rsrcMgr.PonRsrMgr.TechProfileMgr.FreeResourceID(ctx, intfID,
+	if err := rsrcMgr.FreeResourceID(ctx, intfID,
 		ponrmgr.ALLOC_ID,
 		AllocIDs); err != nil {
 		logger.Errorw(ctx, "error-while-freeing-all-alloc-ids-for-onu", log.Fields{
@@ -561,7 +597,7 @@
 	delete(rsrcMgr.gemPortIDsForOnu, intfOnuIDuniID)
 	rsrcMgr.gemPortIDsForOnuLock.Unlock()
 
-	if err := rsrcMgr.PonRsrMgr.TechProfileMgr.FreeResourceID(ctx, intfID,
+	if err := rsrcMgr.FreeResourceID(ctx, intfID,
 		ponrmgr.GEMPORT_ID,
 		GEMPortIDs); err != nil {
 		logger.Errorw(ctx, "error-while-freeing-all-gem-port-ids-for-onu", log.Fields{