[VOL-1385]: code changes to support ONU delete
Change-Id: I8be96e499ccdae29121e81a500a65d0d1a78e5d2
diff --git a/adaptercore/device_handler.go b/adaptercore/device_handler.go
index 60c128a..447079d 100644
--- a/adaptercore/device_handler.go
+++ b/adaptercore/device_handler.go
@@ -1117,6 +1117,16 @@
}
return ""
}
+func (dh *DeviceHandler) deStringifySerialNumber(serialNum string) (*oop.SerialNumber, error) {
+ decodedStr, err := hex.DecodeString(serialNum[4:])
+ if err != nil {
+ return nil, err
+ }
+ return &oop.SerialNumber{
+ VendorId: []byte(serialNum[:4]),
+ VendorSpecific: []byte(decodedStr),
+ }, nil
+}
func (dh *DeviceHandler) stringifyVendorSpecific(vendorSpecific []byte) string {
tmp := fmt.Sprintf("%x", (uint32(vendorSpecific[0])>>4)&0x0f) +
@@ -1755,3 +1765,64 @@
}
}
}
+
+// ChildDeviceLost deletes ONU and clears pon resources related to it.
+func (dh *DeviceHandler) ChildDeviceLost(ctx context.Context, pPortNo uint32, onuID uint32) error {
+ log.Debugw("child-device-lost", log.Fields{"pdeviceID": dh.device.Id})
+ IntfID := PortNoToIntfID(pPortNo, voltha.Port_PON_OLT)
+ onuKey := dh.formOnuKey(IntfID, onuID)
+ onuDevice, ok := dh.onus.Load(onuKey)
+ if !ok {
+ return NewErrAdapter("failed-to-load-onu-details",
+ log.Fields{
+ "device-id": dh.deviceID,
+ "onu-id": onuID,
+ "interface-id": IntfID}, nil).Log()
+ }
+ var sn *oop.SerialNumber
+ var err error
+ if sn, err = dh.deStringifySerialNumber(onuDevice.(*OnuDevice).serialNumber); err != nil {
+ return NewErrAdapter("failed-to-destringify-serial-number",
+ log.Fields{
+ "devicer-id": dh.deviceID,
+ "serial-number": onuDevice.(*OnuDevice).serialNumber}, err).Log()
+ }
+ onu := &oop.Onu{IntfId: IntfID, OnuId: onuID, SerialNumber: sn}
+ if _, err := dh.Client.DeleteOnu(context.Background(), onu); err != nil {
+ return NewErrAdapter("failed-to-delete-onu", log.Fields{
+ "device-id": dh.deviceID,
+ "onu-id": onuID}, err).Log()
+ }
+ //clear PON resources associated with ONU
+ var onuGemData []rsrcMgr.OnuGemInfo
+ if err := dh.resourceMgr.ResourceMgrs[IntfID].GetOnuGemInfo(ctx, IntfID, &onuGemData); err != nil {
+ log.Errorw("Failed-to-get-onu-info-for-pon-port ", log.Fields{
+ "device-id": dh.deviceID,
+ "interface-id": IntfID,
+ "error": err})
+ }
+
+ for i, onu := range onuGemData {
+ if onu.OnuID == onuID && onu.SerialNumber == onuDevice.(*OnuDevice).serialNumber {
+ log.Debugw("onu-data ", log.Fields{"onu": onu})
+ if err := dh.clearUNIData(ctx, &onu); err != nil {
+ log.Errorw("Failed-to-clear-uni-data-for-onu", log.Fields{
+ "device-id": dh.deviceID,
+ "onu-device": onu,
+ "error": err})
+ }
+ // Clear flowids for gem cache.
+ for _, gem := range onu.GemPorts {
+ dh.resourceMgr.DeleteFlowIDsForGem(ctx, IntfID, gem)
+ }
+ onuGemData = append(onuGemData[:i], onuGemData[i+1:]...)
+ dh.resourceMgr.UpdateOnuGemInfo(ctx, IntfID, onuGemData)
+
+ dh.resourceMgr.FreeonuID(ctx, IntfID, []uint32{onu.OnuID})
+ break
+ }
+ }
+ dh.onus.Delete(onuKey)
+ dh.discOnus.Delete(onuDevice.(*OnuDevice).serialNumber)
+ return nil
+}
diff --git a/adaptercore/openolt.go b/adaptercore/openolt.go
index 62e34c9..657f249 100644
--- a/adaptercore/openolt.go
+++ b/adaptercore/openolt.go
@@ -376,3 +376,13 @@
}
return nil
}
+
+//Child_device_lost deletes the ONU and its references from PONResources
+func (oo *OpenOLT) Child_device_lost(deviceID string, pPortNo uint32, onuID uint32) error {
+ log.Infow("Child-device-lost", log.Fields{"parentId": deviceID})
+ ctx := context.Background()
+ if handler := oo.getDeviceHandler(deviceID); handler != nil {
+ return handler.ChildDeviceLost(ctx, pPortNo, onuID)
+ }
+ return NewErrNotFound("device-handler", log.Fields{"device-id": deviceID}, nil).Log()
+}
diff --git a/adaptercore/openolt_flowmgr.go b/adaptercore/openolt_flowmgr.go
index 2b8855a..578861d 100644
--- a/adaptercore/openolt_flowmgr.go
+++ b/adaptercore/openolt_flowmgr.go
@@ -2229,7 +2229,8 @@
defer f.lockCache.Unlock()
onu := rsrcMgr.OnuGemInfo{OnuID: onuID, SerialNumber: serialNum, IntfID: intfID}
f.onuGemInfo[intfID] = append(f.onuGemInfo[intfID], onu)
- if err := f.resourceMgr.AddOnuInfo(ctx, intfID, onu); err != nil {
+ if err := f.resourceMgr.AddOnuGemInfo(ctx, intfID, onu); err != nil {
+ // TODO: VOL-2638
log.Errorw("failed to add onu info", log.Fields{"onu": onu})
return
}
diff --git a/adaptercore/resourcemanager/resourcemanager.go b/adaptercore/resourcemanager/resourcemanager.go
index db5f044..7dcdbb3 100755
--- a/adaptercore/resourcemanager/resourcemanager.go
+++ b/adaptercore/resourcemanager/resourcemanager.go
@@ -1030,8 +1030,8 @@
return onuGemData, nil
}
-// AddOnuInfo adds onu info on to the kvstore per interface
-func (RsrcMgr *OpenOltResourceMgr) AddOnuInfo(ctx context.Context, IntfID uint32, onuGem OnuGemInfo) error {
+// AddOnuGemInfo adds onu info on to the kvstore per interface
+func (RsrcMgr *OpenOltResourceMgr) AddOnuGemInfo(ctx context.Context, IntfID uint32, onuGem OnuGemInfo) error {
var onuGemData []OnuGemInfo
var err error
@@ -1050,19 +1050,21 @@
return err
}
-// UpdateOnuInfo updates Onuinfo on the kvstore per interface
-func (RsrcMgr *OpenOltResourceMgr) UpdateOnuInfo(ctx context.Context, IntfID uint32, onuGem []OnuGemInfo) error {
- var onuGemData []OnuGemInfo
- var err error
+// UpdateOnuGemInfo updates Onuinfo on the kvstore per interface
+func (RsrcMgr *OpenOltResourceMgr) UpdateOnuGemInfo(ctx context.Context, IntfID uint32, onuGem []OnuGemInfo) error {
- err = RsrcMgr.ResourceMgrs[IntfID].AddOnuGemInfo(ctx, IntfID, onuGemData)
+ // TODO: VOL-2643
+ err := RsrcMgr.ResourceMgrs[IntfID].AddOnuGemInfo(ctx, IntfID, onuGem)
if err != nil {
- log.Error("Failed to add onugem to kv store")
+ log.Debugw("persistence-update-failed", log.Fields{
+ "interface-id": IntfID,
+ "gem-info": onuGem,
+ "error": err})
return err
}
log.Debugw("updated onugeminfo", log.Fields{"intf": IntfID, "onugem": onuGem})
- return err
+ return nil
}
// AddUniPortToOnuInfo adds uni port to the onuinfo kvstore. check if the uni is already present if not update the kv store.