blob: 27c0865cff4854eef3e5e102f6aa5941984cc5bb [file] [log] [blame]
Holger Hildebrandtfa074992020-03-27 15:42:06 +00001/*
2 * Copyright 2020-present Open Networking Foundation
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +000017//Package adaptercoreonu provides the utility for onu devices, flows and statistics
18package adaptercoreonu
Holger Hildebrandtfa074992020-03-27 15:42:06 +000019
20import (
21 "context"
Holger Hildebrandt47555e72020-09-21 11:07:24 +000022 "encoding/json"
Holger Hildebrandtccd390c2020-05-29 13:49:04 +000023 "errors"
Holger Hildebrandt47555e72020-09-21 11:07:24 +000024 "fmt"
25 "sync"
Holger Hildebrandt2ff21f12020-08-13 14:38:02 +000026 "time"
27
ozgecanetsiae11479f2020-07-06 09:44:47 +030028 "github.com/opencord/omci-lib-go"
29 me "github.com/opencord/omci-lib-go/generated"
Holger Hildebrandtccd390c2020-05-29 13:49:04 +000030
Holger Hildebrandtfa074992020-03-27 15:42:06 +000031 //"sync"
32 //"time"
33
34 "github.com/looplab/fsm"
35 "github.com/opencord/voltha-lib-go/v3/pkg/adapters/adapterif"
Holger Hildebrandtccd390c2020-05-29 13:49:04 +000036 "github.com/opencord/voltha-lib-go/v3/pkg/db"
Holger Hildebrandt47555e72020-09-21 11:07:24 +000037 "github.com/opencord/voltha-lib-go/v3/pkg/db/kvstore"
Holger Hildebrandtfa074992020-03-27 15:42:06 +000038
39 //"github.com/opencord/voltha-lib-go/v3/pkg/kafka"
40 "github.com/opencord/voltha-lib-go/v3/pkg/log"
41 //ic "github.com/opencord/voltha-protos/v3/go/inter_container"
42 //"github.com/opencord/voltha-protos/v3/go/openflow_13"
43 //"github.com/opencord/voltha-protos/v3/go/voltha"
44)
45
Holger Hildebrandtccd390c2020-05-29 13:49:04 +000046const (
mpagenko1cc3cb42020-07-27 15:24:38 +000047 // events of MibUpload FSM
48 ulEvStart = "ulEvStart"
49 ulEvResetMib = "ulEvResetMib"
50 ulEvGetVendorAndSerial = "ulEvGetVendorAndSerial"
Himani Chawla4d908332020-08-31 12:30:20 +053051 ulEvGetEquipmentID = "ulEvGetEquipmentId"
mpagenko1cc3cb42020-07-27 15:24:38 +000052 ulEvGetFirstSwVersion = "ulEvGetFirstSwVersion"
53 ulEvGetSecondSwVersion = "ulEvGetSecondSwVersion"
54 ulEvGetMacAddress = "ulEvGetMacAddress"
55 ulEvGetMibTemplate = "ulEvGetMibTemplate"
56 ulEvUploadMib = "ulEvUploadMib"
57 ulEvExamineMds = "ulEvExamineMds"
58 ulEvSuccess = "ulEvSuccess"
59 ulEvMismatch = "ulEvMismatch"
60 ulEvAuditMib = "ulEvAuditMib"
61 ulEvForceResync = "ulEvForceResync"
62 ulEvDiffsFound = "ulEvDiffsFound"
63 ulEvTimeout = "ulEvTimeout"
64 ulEvStop = "ulEvStop"
65)
66const (
67 // states of MibUpload FSM
68 ulStDisabled = "ulStDisabled"
69 ulStStarting = "ulStStarting"
70 ulStResettingMib = "ulStResettingMib"
71 ulStGettingVendorAndSerial = "ulStGettingVendorAndSerial"
Himani Chawla4d908332020-08-31 12:30:20 +053072 ulStGettingEquipmentID = "ulStGettingEquipmentID"
mpagenko1cc3cb42020-07-27 15:24:38 +000073 ulStGettingFirstSwVersion = "ulStGettingFirstSwVersion"
74 ulStGettingSecondSwVersion = "ulStGettingSecondSwVersion"
75 ulStGettingMacAddress = "ulStGettingMacAddress"
76 ulStGettingMibTemplate = "ulStGettingMibTemplate"
77 ulStUploading = "ulStUploading"
78 ulStInSync = "ulStInSync"
79 ulStExaminingMds = "ulStExaminingMds"
80 ulStResynchronizing = "ulStResynchronizing"
81 ulStAuditing = "ulStAuditing"
82 ulStOutOfSync = "ulStOutOfSync"
83)
84
85const (
86 // events of MibDownload FSM
87 dlEvStart = "dlEvStart"
88 dlEvCreateGal = "dlEvCreateGal"
89 dlEvRxGalResp = "dlEvRxGalResp"
90 dlEvRxOnu2gResp = "dlEvRxOnu2gResp"
91 dlEvRxBridgeResp = "dlEvRxBridgeResp"
92 dlEvTimeoutSimple = "dlEvTimeoutSimple"
93 dlEvTimeoutBridge = "dlEvTimeoutBridge"
94 dlEvReset = "dlEvReset"
95 dlEvRestart = "dlEvRestart"
96)
97const (
98 // states of MibDownload FSM
99 dlStDisabled = "dlStDisabled"
100 dlStStarting = "dlStStarting"
101 dlStCreatingGal = "dlStCreatingGal"
102 dlStSettingOnu2g = "dlStSettingOnu2g"
103 dlStBridgeInit = "dlStBridgeInit"
104 dlStDownloaded = "dlStDownloaded"
105 dlStResetting = "dlStResetting"
106)
107
108const (
Holger Hildebrandt2ff21f12020-08-13 14:38:02 +0000109 cBasePathMibTemplateKvStore = "service/voltha/omci_mibs/go_templates"
mpagenkoaf801632020-07-03 10:00:42 +0000110 cSuffixMibTemplateKvStore = "%s/%s/%s"
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000111 cBasePathOnuKVStore = "service/voltha/openonu"
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000112)
113
Himani Chawla6d2ae152020-09-02 13:11:20 +0530114// OnuDeviceEvent - event of interest to Device Adapters and OpenOMCI State Machines
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000115type OnuDeviceEvent int
116
117const (
118 // Events of interest to Device Adapters and OpenOMCI State Machines
Himani Chawla6d2ae152020-09-02 13:11:20 +0530119
120 // DeviceStatusInit - default start state
121 DeviceStatusInit OnuDeviceEvent = 0
122 // MibDatabaseSync - MIB database sync (upload done)
123 MibDatabaseSync OnuDeviceEvent = 1
124 // OmciCapabilitiesDone - OMCI ME and message type capabilities known
125 OmciCapabilitiesDone OnuDeviceEvent = 2
126 // MibDownloadDone - // MIB download done
127 MibDownloadDone OnuDeviceEvent = 3
128 // UniLockStateDone - Uni ports admin set to lock
129 UniLockStateDone OnuDeviceEvent = 4
130 // UniUnlockStateDone - Uni ports admin set to unlock
131 UniUnlockStateDone OnuDeviceEvent = 5
mpagenko900ee4b2020-10-12 11:56:34 +0000132 // UniDisableStateDone - Uni ports admin set to lock based on device disable
133 UniDisableStateDone OnuDeviceEvent = 6
134 // UniEnableStateDone - Uni ports admin set to unlock based on device re-enable
135 UniEnableStateDone OnuDeviceEvent = 7
Himani Chawla6d2ae152020-09-02 13:11:20 +0530136 // PortLinkUp - Port link state change
mpagenko900ee4b2020-10-12 11:56:34 +0000137 PortLinkUp OnuDeviceEvent = 8
Himani Chawla6d2ae152020-09-02 13:11:20 +0530138 // PortLinkDw - Port link state change
mpagenko900ee4b2020-10-12 11:56:34 +0000139 PortLinkDw OnuDeviceEvent = 9
Himani Chawla6d2ae152020-09-02 13:11:20 +0530140 // OmciAniConfigDone - AniSide config according to TechProfile done
mpagenko900ee4b2020-10-12 11:56:34 +0000141 OmciAniConfigDone OnuDeviceEvent = 10
Himani Chawla6d2ae152020-09-02 13:11:20 +0530142 // OmciVlanFilterDone - Omci Vlan config according to flowConfig done
mpagenko900ee4b2020-10-12 11:56:34 +0000143 OmciVlanFilterDone OnuDeviceEvent = 11
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000144 // Add other events here as needed (alarms separate???)
145)
146
147type activityDescr struct {
Himani Chawla4d908332020-08-31 12:30:20 +0530148 databaseClass func() error
149 //advertiseEvents bool
150 auditDelay uint16
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000151 //tasks map[string]func() error
152}
Himani Chawla6d2ae152020-09-02 13:11:20 +0530153
154// OmciDeviceFsms - FSM event mapping to database class and time to wait between audits
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000155type OmciDeviceFsms map[string]activityDescr
156
Himani Chawla6d2ae152020-09-02 13:11:20 +0530157// AdapterFsm - Adapter FSM details including channel, event and device
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000158type AdapterFsm struct {
159 fsmName string
160 deviceID string
161 commChan chan Message
162 pFsm *fsm.FSM
163}
164
Himani Chawla6d2ae152020-09-02 13:11:20 +0530165//NewAdapterFsm - FSM details including event, device and channel.
166func NewAdapterFsm(aName string, aDeviceID string, aCommChannel chan Message) *AdapterFsm {
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000167 aFsm := &AdapterFsm{
Himani Chawla6d2ae152020-09-02 13:11:20 +0530168 fsmName: aName,
169 deviceID: aDeviceID,
170 commChan: aCommChannel,
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000171 }
172 return aFsm
173}
174
175//Start starts (logs) the omci agent
176func (oo *AdapterFsm) logFsmStateChange(e *fsm.Event) {
177 logger.Debugw("FSM state change", log.Fields{"device-id": oo.deviceID, "FSM name": oo.fsmName,
178 "event name": string(e.Event), "src state": string(e.Src), "dst state": string(e.Dst)})
179}
180
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000181//OntDeviceEntry structure holds information about the attached FSM'as and their communication
Holger Hildebrandtc54939a2020-06-17 08:14:27 +0000182
183const (
Himani Chawla6d2ae152020-09-02 13:11:20 +0530184 firstSwImageMeID = 0
185 secondSwImageMeID = 1
Holger Hildebrandtc54939a2020-06-17 08:14:27 +0000186)
Himani Chawla6d2ae152020-09-02 13:11:20 +0530187const onugMeID = 0
188const onu2gMeID = 0
189const ipHostConfigDataMeID = 1
190const onugSerialNumberLen = 8
191const omciMacAddressLen = 6
Holger Hildebrandtc54939a2020-06-17 08:14:27 +0000192
Holger Hildebrandt2fb70892020-10-28 11:53:18 +0000193const cEmptyMacAddrString = "000000000000"
194const cEmptySerialNumberString = "0000000000000000"
195
Himani Chawla6d2ae152020-09-02 13:11:20 +0530196type swImages struct {
Holger Hildebrandtc54939a2020-06-17 08:14:27 +0000197 version string
198 isActive uint8
199}
200
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000201type uniPersConfig struct {
202 PersUniID uint8 `json:"uni_id"`
203 PersTpPath string `json:"tp_path"`
mpagenko01e726e2020-10-23 09:45:29 +0000204 PersFlowParams []uniVlanFlowParams `json:"flow_params"` //as defined in omci_ani_config.go
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000205}
206
207type onuPersistentData struct {
208 PersOnuID uint32 `json:"onu_id"`
209 PersIntfID uint32 `json:"intf_id"`
210 PersSnr string `json:"serial_number"`
211 PersAdminState string `json:"admin_state"`
212 PersOperState string `json:"oper_state"`
213 PersUniConfig []uniPersConfig `json:"uni_config"`
214}
215
Himani Chawla6d2ae152020-09-02 13:11:20 +0530216// OnuDeviceEntry - ONU device info and FSM events.
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000217type OnuDeviceEntry struct {
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000218 deviceID string
219 baseDeviceHandler *deviceHandler
220 coreProxy adapterif.CoreProxy
221 adapterProxy adapterif.AdapterProxy
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000222 PDevOmciCC *omciCC
223 pOnuDB *onuDeviceDB
224 mibTemplateKVStore *db.Backend
225 sOnuPersistentData onuPersistentData
226 onuKVStoreMutex sync.RWMutex
227 onuKVStore *db.Backend
228 onuKVStorePath string
229 onuKVStoreprocResult error //error indication of processing
230 chOnuKvProcessingStep chan uint8
231 vendorID string
232 serialNumber string
233 equipmentID string
234 swImages [secondSwImageMeID + 1]swImages
235 activeSwVersion string
236 macAddress string
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000237 //lockDeviceEntries sync.RWMutex
238 mibDbClass func() error
239 supportedFsms OmciDeviceFsms
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000240 devState OnuDeviceEvent
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000241 // for mibUpload
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000242 mibAuditDelay uint16
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000243
244 // for mibUpload
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000245 pMibUploadFsm *AdapterFsm //could be handled dynamically and more general as pAdapterFsm - perhaps later
246 // for mibDownload
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000247 pMibDownloadFsm *AdapterFsm //could be handled dynamically and more general as pAdapterFsm - perhaps later
248 //remark: general usage of pAdapterFsm would require generalization of commChan usage and internal event setting
249 // within the FSM event procedures
ozgecanetsiae11479f2020-07-06 09:44:47 +0300250 omciMessageReceived chan bool //seperate channel needed by DownloadFsm
251 omciRebootMessageReceivedChannel chan Message // channel needed by Reboot request
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000252}
253
Himani Chawla6d2ae152020-09-02 13:11:20 +0530254//newOnuDeviceEntry returns a new instance of a OnuDeviceEntry
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000255//mib_db (as well as not inluded alarm_db not really used in this code? VERIFY!!)
Himani Chawla6d2ae152020-09-02 13:11:20 +0530256func newOnuDeviceEntry(ctx context.Context, deviceID string, kVStoreHost string, kVStorePort int, kvStoreType string, deviceHandler *deviceHandler,
Himani Chawla26e555c2020-08-31 12:30:20 +0530257 coreProxy adapterif.CoreProxy, adapterProxy adapterif.AdapterProxy,
258 supportedFsmsPtr *OmciDeviceFsms) *OnuDeviceEntry {
259 logger.Infow("init-onuDeviceEntry", log.Fields{"device-id": deviceID})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000260 var onuDeviceEntry OnuDeviceEntry
Himani Chawla26e555c2020-08-31 12:30:20 +0530261 onuDeviceEntry.deviceID = deviceID
262 onuDeviceEntry.baseDeviceHandler = deviceHandler
263 onuDeviceEntry.coreProxy = coreProxy
264 onuDeviceEntry.adapterProxy = adapterProxy
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000265 onuDeviceEntry.devState = DeviceStatusInit
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000266 onuDeviceEntry.sOnuPersistentData.PersUniConfig = make([]uniPersConfig, 0)
267 onuDeviceEntry.chOnuKvProcessingStep = make(chan uint8)
ozgecanetsiae11479f2020-07-06 09:44:47 +0300268 onuDeviceEntry.omciRebootMessageReceivedChannel = make(chan Message, 2048)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000269 //openomciagent.lockDeviceHandlersMap = sync.RWMutex{}
270 //OMCI related databases are on a per-agent basis. State machines and tasks
271 //are per ONU Vendor
272 //
273 // MIB Synchronization Database - possible overloading from arguments
Himani Chawla26e555c2020-08-31 12:30:20 +0530274 if supportedFsmsPtr != nil {
275 onuDeviceEntry.supportedFsms = *supportedFsmsPtr
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000276 } else {
277 //var mibSyncFsm = NewMibSynchronizer()
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000278 // use some internaö defaults, if not defined from outside
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000279 onuDeviceEntry.supportedFsms = OmciDeviceFsms{
280 "mib-synchronizer": {
281 //mibSyncFsm, // Implements the MIB synchronization state machine
Himani Chawla6d2ae152020-09-02 13:11:20 +0530282 onuDeviceEntry.mibDbVolatileDict, // Implements volatile ME MIB database
Himani Chawla4d908332020-08-31 12:30:20 +0530283 //true, // Advertise events on OpenOMCI event bus
284 60, // Time to wait between MIB audits. 0 to disable audits.
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000285 // map[string]func() error{
286 // "mib-upload": onuDeviceEntry.MibUploadTask,
287 // "mib-template": onuDeviceEntry.MibTemplateTask,
288 // "get-mds": onuDeviceEntry.GetMdsTask,
289 // "mib-audit": onuDeviceEntry.GetMdsTask,
290 // "mib-resync": onuDeviceEntry.MibResyncTask,
291 // "mib-reconcile": onuDeviceEntry.MibReconcileTask,
292 // },
293 },
294 }
295 }
296 onuDeviceEntry.mibDbClass = onuDeviceEntry.supportedFsms["mib-synchronizer"].databaseClass
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000297 logger.Debug("access2mibDbClass")
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000298 go onuDeviceEntry.mibDbClass()
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000299 onuDeviceEntry.mibAuditDelay = onuDeviceEntry.supportedFsms["mib-synchronizer"].auditDelay
300 logger.Debugw("MibAudit is set to", log.Fields{"Delay": onuDeviceEntry.mibAuditDelay})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000301
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000302 // Omci related Mib upload sync state machine
303 mibUploadChan := make(chan Message, 2048)
Himani Chawla26e555c2020-08-31 12:30:20 +0530304 onuDeviceEntry.pMibUploadFsm = NewAdapterFsm("MibUpload", deviceID, mibUploadChan)
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000305 onuDeviceEntry.pMibUploadFsm.pFsm = fsm.NewFSM(
mpagenko1cc3cb42020-07-27 15:24:38 +0000306 ulStDisabled,
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000307 fsm.Events{
308
mpagenko1cc3cb42020-07-27 15:24:38 +0000309 {Name: ulEvStart, Src: []string{ulStDisabled}, Dst: ulStStarting},
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000310
mpagenko1cc3cb42020-07-27 15:24:38 +0000311 {Name: ulEvResetMib, Src: []string{ulStStarting}, Dst: ulStResettingMib},
312 {Name: ulEvGetVendorAndSerial, Src: []string{ulStResettingMib}, Dst: ulStGettingVendorAndSerial},
Himani Chawla4d908332020-08-31 12:30:20 +0530313 {Name: ulEvGetEquipmentID, Src: []string{ulStGettingVendorAndSerial}, Dst: ulStGettingEquipmentID},
314 {Name: ulEvGetFirstSwVersion, Src: []string{ulStGettingEquipmentID}, Dst: ulStGettingFirstSwVersion},
mpagenko1cc3cb42020-07-27 15:24:38 +0000315 {Name: ulEvGetSecondSwVersion, Src: []string{ulStGettingFirstSwVersion}, Dst: ulStGettingSecondSwVersion},
316 {Name: ulEvGetMacAddress, Src: []string{ulStGettingSecondSwVersion}, Dst: ulStGettingMacAddress},
317 {Name: ulEvGetMibTemplate, Src: []string{ulStGettingMacAddress}, Dst: ulStGettingMibTemplate},
Holger Hildebrandtc54939a2020-06-17 08:14:27 +0000318
mpagenko1cc3cb42020-07-27 15:24:38 +0000319 {Name: ulEvUploadMib, Src: []string{ulStGettingMibTemplate}, Dst: ulStUploading},
320 {Name: ulEvExamineMds, Src: []string{ulStStarting}, Dst: ulStExaminingMds},
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000321
mpagenko1cc3cb42020-07-27 15:24:38 +0000322 {Name: ulEvSuccess, Src: []string{ulStGettingMibTemplate}, Dst: ulStInSync},
323 {Name: ulEvSuccess, Src: []string{ulStUploading}, Dst: ulStInSync},
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000324
mpagenko1cc3cb42020-07-27 15:24:38 +0000325 {Name: ulEvSuccess, Src: []string{ulStExaminingMds}, Dst: ulStInSync},
326 {Name: ulEvMismatch, Src: []string{ulStExaminingMds}, Dst: ulStResynchronizing},
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000327
mpagenko1cc3cb42020-07-27 15:24:38 +0000328 {Name: ulEvAuditMib, Src: []string{ulStInSync}, Dst: ulStAuditing},
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000329
mpagenko1cc3cb42020-07-27 15:24:38 +0000330 {Name: ulEvSuccess, Src: []string{ulStOutOfSync}, Dst: ulStInSync},
331 {Name: ulEvAuditMib, Src: []string{ulStOutOfSync}, Dst: ulStAuditing},
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000332
mpagenko1cc3cb42020-07-27 15:24:38 +0000333 {Name: ulEvSuccess, Src: []string{ulStAuditing}, Dst: ulStInSync},
334 {Name: ulEvMismatch, Src: []string{ulStAuditing}, Dst: ulStResynchronizing},
335 {Name: ulEvForceResync, Src: []string{ulStAuditing}, Dst: ulStResynchronizing},
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000336
mpagenko1cc3cb42020-07-27 15:24:38 +0000337 {Name: ulEvSuccess, Src: []string{ulStResynchronizing}, Dst: ulStInSync},
338 {Name: ulEvDiffsFound, Src: []string{ulStResynchronizing}, Dst: ulStOutOfSync},
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000339
Himani Chawla4d908332020-08-31 12:30:20 +0530340 {Name: ulEvTimeout, Src: []string{ulStResettingMib, ulStGettingVendorAndSerial, ulStGettingEquipmentID, ulStGettingFirstSwVersion,
mpagenko1cc3cb42020-07-27 15:24:38 +0000341 ulStGettingSecondSwVersion, ulStGettingMacAddress, ulStGettingMibTemplate, ulStUploading, ulStResynchronizing, ulStExaminingMds,
342 ulStInSync, ulStOutOfSync, ulStAuditing}, Dst: ulStStarting},
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000343
Himani Chawla4d908332020-08-31 12:30:20 +0530344 {Name: ulEvStop, Src: []string{ulStStarting, ulStResettingMib, ulStGettingVendorAndSerial, ulStGettingEquipmentID, ulStGettingFirstSwVersion,
mpagenko1cc3cb42020-07-27 15:24:38 +0000345 ulStGettingSecondSwVersion, ulStGettingMacAddress, ulStGettingMibTemplate, ulStUploading, ulStResynchronizing, ulStExaminingMds,
346 ulStInSync, ulStOutOfSync, ulStAuditing}, Dst: ulStDisabled},
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000347 },
348
349 fsm.Callbacks{
mpagenko1cc3cb42020-07-27 15:24:38 +0000350 "enter_state": func(e *fsm.Event) { onuDeviceEntry.pMibUploadFsm.logFsmStateChange(e) },
351 ("enter_" + ulStStarting): func(e *fsm.Event) { onuDeviceEntry.enterStartingState(e) },
352 ("enter_" + ulStResettingMib): func(e *fsm.Event) { onuDeviceEntry.enterResettingMibState(e) },
353 ("enter_" + ulStGettingVendorAndSerial): func(e *fsm.Event) { onuDeviceEntry.enterGettingVendorAndSerialState(e) },
Himani Chawla4d908332020-08-31 12:30:20 +0530354 ("enter_" + ulStGettingEquipmentID): func(e *fsm.Event) { onuDeviceEntry.enterGettingEquipmentIDState(e) },
mpagenko1cc3cb42020-07-27 15:24:38 +0000355 ("enter_" + ulStGettingFirstSwVersion): func(e *fsm.Event) { onuDeviceEntry.enterGettingFirstSwVersionState(e) },
356 ("enter_" + ulStGettingSecondSwVersion): func(e *fsm.Event) { onuDeviceEntry.enterGettingSecondSwVersionState(e) },
357 ("enter_" + ulStGettingMacAddress): func(e *fsm.Event) { onuDeviceEntry.enterGettingMacAddressState(e) },
358 ("enter_" + ulStGettingMibTemplate): func(e *fsm.Event) { onuDeviceEntry.enterGettingMibTemplate(e) },
359 ("enter_" + ulStUploading): func(e *fsm.Event) { onuDeviceEntry.enterUploadingState(e) },
360 ("enter_" + ulStExaminingMds): func(e *fsm.Event) { onuDeviceEntry.enterExaminingMdsState(e) },
361 ("enter_" + ulStResynchronizing): func(e *fsm.Event) { onuDeviceEntry.enterResynchronizingState(e) },
362 ("enter_" + ulStAuditing): func(e *fsm.Event) { onuDeviceEntry.enterAuditingState(e) },
363 ("enter_" + ulStOutOfSync): func(e *fsm.Event) { onuDeviceEntry.enterOutOfSyncState(e) },
364 ("enter_" + ulStInSync): func(e *fsm.Event) { onuDeviceEntry.enterInSyncState(e) },
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000365 },
366 )
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000367 // Omci related Mib download state machine
368 mibDownloadChan := make(chan Message, 2048)
Himani Chawla26e555c2020-08-31 12:30:20 +0530369 onuDeviceEntry.pMibDownloadFsm = NewAdapterFsm("MibDownload", deviceID, mibDownloadChan)
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000370 onuDeviceEntry.pMibDownloadFsm.pFsm = fsm.NewFSM(
mpagenko1cc3cb42020-07-27 15:24:38 +0000371 dlStDisabled,
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000372 fsm.Events{
373
mpagenko1cc3cb42020-07-27 15:24:38 +0000374 {Name: dlEvStart, Src: []string{dlStDisabled}, Dst: dlStStarting},
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000375
mpagenko1cc3cb42020-07-27 15:24:38 +0000376 {Name: dlEvCreateGal, Src: []string{dlStStarting}, Dst: dlStCreatingGal},
377 {Name: dlEvRxGalResp, Src: []string{dlStCreatingGal}, Dst: dlStSettingOnu2g},
378 {Name: dlEvRxOnu2gResp, Src: []string{dlStSettingOnu2g}, Dst: dlStBridgeInit},
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000379 // the bridge state is used for multi ME config for alle UNI related ports
380 // maybe such could be reflected in the state machine as well (port number parametrized)
381 // but that looks not straightforward here - so we keep it simple here for the beginning(?)
mpagenko1cc3cb42020-07-27 15:24:38 +0000382 {Name: dlEvRxBridgeResp, Src: []string{dlStBridgeInit}, Dst: dlStDownloaded},
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000383
mpagenko1cc3cb42020-07-27 15:24:38 +0000384 {Name: dlEvTimeoutSimple, Src: []string{dlStCreatingGal, dlStSettingOnu2g}, Dst: dlStStarting},
385 {Name: dlEvTimeoutBridge, Src: []string{dlStBridgeInit}, Dst: dlStStarting},
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000386
mpagenko1cc3cb42020-07-27 15:24:38 +0000387 {Name: dlEvReset, Src: []string{dlStStarting, dlStCreatingGal, dlStSettingOnu2g,
388 dlStBridgeInit, dlStDownloaded}, Dst: dlStResetting},
389 // exceptional treatment for all states except dlStResetting
390 {Name: dlEvRestart, Src: []string{dlStStarting, dlStCreatingGal, dlStSettingOnu2g,
391 dlStBridgeInit, dlStDownloaded, dlStResetting}, Dst: dlStDisabled},
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000392 },
393
394 fsm.Callbacks{
mpagenko1cc3cb42020-07-27 15:24:38 +0000395 "enter_state": func(e *fsm.Event) { onuDeviceEntry.pMibDownloadFsm.logFsmStateChange(e) },
396 ("enter_" + dlStStarting): func(e *fsm.Event) { onuDeviceEntry.enterDLStartingState(e) },
397 ("enter_" + dlStCreatingGal): func(e *fsm.Event) { onuDeviceEntry.enterCreatingGalState(e) },
398 ("enter_" + dlStSettingOnu2g): func(e *fsm.Event) { onuDeviceEntry.enterSettingOnu2gState(e) },
399 ("enter_" + dlStBridgeInit): func(e *fsm.Event) { onuDeviceEntry.enterBridgeInitState(e) },
400 ("enter_" + dlStDownloaded): func(e *fsm.Event) { onuDeviceEntry.enterDownloadedState(e) },
401 ("enter_" + dlStResetting): func(e *fsm.Event) { onuDeviceEntry.enterResettingState(e) },
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000402 },
403 )
404 if onuDeviceEntry.pMibDownloadFsm == nil || onuDeviceEntry.pMibDownloadFsm.pFsm == nil {
Andrea Campanella6515c582020-10-05 11:25:00 +0200405 logger.Errorw("MibDownloadFsm could not be instantiated", log.Fields{"device-id": deviceID})
406 // TODO some specifc error treatment - or waiting for crash ?
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000407 }
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000408
Himani Chawla6d2ae152020-09-02 13:11:20 +0530409 onuDeviceEntry.mibTemplateKVStore = onuDeviceEntry.baseDeviceHandler.setBackend(cBasePathMibTemplateKvStore)
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000410 if onuDeviceEntry.mibTemplateKVStore == nil {
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000411 logger.Errorw("Can't access mibTemplateKVStore - no backend connection to service",
412 log.Fields{"device-id": deviceID, "service": cBasePathMibTemplateKvStore})
413 }
414
415 onuDeviceEntry.onuKVStorePath = onuDeviceEntry.deviceID
416 onuDeviceEntry.onuKVStore = onuDeviceEntry.baseDeviceHandler.setBackend(cBasePathOnuKVStore)
417 if onuDeviceEntry.onuKVStore == nil {
418 logger.Errorw("Can't access onuKVStore - no backend connection to service",
419 log.Fields{"device-id": deviceID, "service": cBasePathOnuKVStore})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000420 }
421
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000422 // Alarm Synchronization Database
423 //self._alarm_db = None
424 //self._alarm_database_cls = support_classes['alarm-synchronizer']['database']
425 return &onuDeviceEntry
426}
427
Himani Chawla6d2ae152020-09-02 13:11:20 +0530428//start starts (logs) the omci agent
429func (oo *OnuDeviceEntry) start(ctx context.Context) error {
mpagenko900ee4b2020-10-12 11:56:34 +0000430 logger.Infow("OnuDeviceEntry-starting", log.Fields{"for device-id": oo.deviceID})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000431 if oo.PDevOmciCC == nil {
mpagenko900ee4b2020-10-12 11:56:34 +0000432 oo.PDevOmciCC = newOmciCC(ctx, oo, oo.deviceID, oo.baseDeviceHandler,
433 oo.coreProxy, oo.adapterProxy)
434 if oo.PDevOmciCC == nil {
435 logger.Errorw("Could not create devOmciCc - abort", log.Fields{"for device-id": oo.deviceID})
436 return fmt.Errorf("could not create devOmciCc %s", oo.deviceID)
437 }
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000438 }
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000439 return nil
440}
441
mpagenko900ee4b2020-10-12 11:56:34 +0000442//stop stops/resets the omciCC
443func (oo *OnuDeviceEntry) stop(ctx context.Context, abResetOmciCC bool) error {
444 logger.Debugw("OnuDeviceEntry-stopping", log.Fields{"for device-id": oo.deviceID})
445 if abResetOmciCC && (oo.PDevOmciCC != nil) {
446 _ = oo.PDevOmciCC.stop(ctx)
447 }
448 //to allow for all event notifications again when re-using the device and omciCC
449 oo.devState = DeviceStatusInit
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000450 return nil
451}
452
Himani Chawla6d2ae152020-09-02 13:11:20 +0530453func (oo *OnuDeviceEntry) reboot(ctx context.Context) error {
mpagenko900ee4b2020-10-12 11:56:34 +0000454 logger.Debugw("OnuDeviceEntry-rebooting", log.Fields{"for device-id": oo.deviceID})
455 if oo.PDevOmciCC != nil {
456 if err := oo.PDevOmciCC.sendReboot(ctx, ConstDefaultOmciTimeout, true, oo.omciRebootMessageReceivedChannel); err != nil {
457 logger.Errorw("onu didn't reboot", log.Fields{"for device-id": oo.deviceID})
458 return err
459 }
ozgecanetsiae11479f2020-07-06 09:44:47 +0300460 }
ozgecanetsiae11479f2020-07-06 09:44:47 +0300461 return nil
462}
463
464func (oo *OnuDeviceEntry) waitForRebootResponse(responseChannel chan Message) error {
465 select {
466 case <-time.After(3 * time.Second): //3s was detected to be to less in 8*8 bbsim test with debug Info/Debug
467 logger.Warnw("Reboot timeout", log.Fields{"for device-id": oo.deviceID})
Andrea Campanella6515c582020-10-05 11:25:00 +0200468 return fmt.Errorf("rebootTimeout")
ozgecanetsiae11479f2020-07-06 09:44:47 +0300469 case data := <-responseChannel:
470 switch data.Data.(OmciMessage).OmciMsg.MessageType {
471 case omci.RebootResponseType:
472 {
473 msgLayer := (*data.Data.(OmciMessage).OmciPacket).Layer(omci.LayerTypeRebootResponse)
474 if msgLayer == nil {
Andrea Campanella6515c582020-10-05 11:25:00 +0200475 return fmt.Errorf("omci Msg layer could not be detected for RebootResponseType")
ozgecanetsiae11479f2020-07-06 09:44:47 +0300476 }
Andrea Campanellabef4e542020-10-22 11:01:28 +0200477 msgObj, msgOk := msgLayer.(*omci.RebootResponse)
ozgecanetsiae11479f2020-07-06 09:44:47 +0300478 if !msgOk {
Andrea Campanella6515c582020-10-05 11:25:00 +0200479 return fmt.Errorf("omci Msg layer could not be assigned for RebootResponseType %s", oo.deviceID)
ozgecanetsiae11479f2020-07-06 09:44:47 +0300480 }
Andrea Campanellabef4e542020-10-22 11:01:28 +0200481 logger.Debugw("RebootResponse data", log.Fields{"device-id": oo.deviceID, "data-fields": msgObj})
ozgecanetsiae11479f2020-07-06 09:44:47 +0300482 if msgObj.Result != me.Success {
mpagenko01e726e2020-10-23 09:45:29 +0000483 logger.Errorw("Omci RebootResponse result error", log.Fields{"device-id": oo.deviceID, "Error": msgObj.Result})
ozgecanetsiae11479f2020-07-06 09:44:47 +0300484 // possibly force FSM into abort or ignore some errors for some messages? store error for mgmt display?
Andrea Campanellabef4e542020-10-22 11:01:28 +0200485 return fmt.Errorf("omci RebootResponse result error indication %s for device %s",
Andrea Campanella6515c582020-10-05 11:25:00 +0200486 msgObj.Result, oo.deviceID)
ozgecanetsiae11479f2020-07-06 09:44:47 +0300487 }
488 return nil
489 }
490 }
mpagenko01e726e2020-10-23 09:45:29 +0000491 logger.Warnw("Reboot response message type error", log.Fields{"for device-id": oo.deviceID})
Andrea Campanella6515c582020-10-05 11:25:00 +0200492 return fmt.Errorf("unexpected OmciResponse type received %s", oo.deviceID)
ozgecanetsiae11479f2020-07-06 09:44:47 +0300493 }
494}
495
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000496//Relay the InSync message via Handler to Rw core - Status update
Himani Chawla26e555c2020-08-31 12:30:20 +0530497func (oo *OnuDeviceEntry) transferSystemEvent(devEvent OnuDeviceEvent) {
498 logger.Debugw("relaying system-event", log.Fields{"Event": devEvent})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000499 // decouple the handler transfer from further processing here
500 // TODO!!! check if really no synch is required within the system e.g. to ensure following steps ..
Himani Chawla26e555c2020-08-31 12:30:20 +0530501 if devEvent == MibDatabaseSync {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000502 if oo.devState < MibDatabaseSync { //devState has not been synced yet
503 oo.devState = MibDatabaseSync
Himani Chawla6d2ae152020-09-02 13:11:20 +0530504 go oo.baseDeviceHandler.deviceProcStatusUpdate(devEvent)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000505 //TODO!!! device control: next step: start MIB capability verification from here ?!!!
506 } else {
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000507 logger.Debugw("mibinsync-event in some already synced state - ignored", log.Fields{"state": oo.devState})
508 }
Himani Chawla26e555c2020-08-31 12:30:20 +0530509 } else if devEvent == MibDownloadDone {
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000510 if oo.devState < MibDownloadDone { //devState has not been synced yet
511 oo.devState = MibDownloadDone
Himani Chawla6d2ae152020-09-02 13:11:20 +0530512 go oo.baseDeviceHandler.deviceProcStatusUpdate(devEvent)
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000513 } else {
514 logger.Debugw("mibdownloaddone-event was already seen - ignored", log.Fields{"state": oo.devState})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000515 }
516 } else {
Himani Chawla26e555c2020-08-31 12:30:20 +0530517 logger.Warnw("device-event not yet handled", log.Fields{"state": devEvent})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000518 }
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000519}
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000520
521func (oo *OnuDeviceEntry) restoreDataFromOnuKvStore(ctx context.Context) error {
522 if oo.onuKVStore == nil {
523 logger.Debugw("onuKVStore not set - abort", log.Fields{"device-id": oo.deviceID})
524 return fmt.Errorf(fmt.Sprintf("onuKVStore-not-set-abort-%s", oo.deviceID))
525 }
526 oo.sOnuPersistentData = onuPersistentData{0, 0, "", "", "", make([]uniPersConfig, 0)}
527 Value, err := oo.onuKVStore.Get(ctx, oo.onuKVStorePath)
528 if err == nil {
529 if Value != nil {
530 logger.Debugw("ONU-data read",
531 log.Fields{"Key": Value.Key, "device-id": oo.deviceID})
532 tmpBytes, _ := kvstore.ToByte(Value.Value)
533
534 if err = json.Unmarshal(tmpBytes, &oo.sOnuPersistentData); err != nil {
535 logger.Errorw("unable to unmarshal ONU-data", log.Fields{"error": err, "device-id": oo.deviceID})
536 return fmt.Errorf(fmt.Sprintf("unable-to-unmarshal-ONU-data-%s", oo.deviceID))
537 }
538 logger.Debugw("ONU-data", log.Fields{"sOnuPersistentData": oo.sOnuPersistentData,
539 "device-id": oo.deviceID})
540 } else {
541 logger.Errorw("no ONU-data found", log.Fields{"path": oo.onuKVStorePath, "device-id": oo.deviceID})
542 return fmt.Errorf(fmt.Sprintf("no-ONU-data-found-%s", oo.deviceID))
543 }
544 } else {
545 logger.Errorw("unable to read from KVstore", log.Fields{"device-id": oo.deviceID})
546 return fmt.Errorf(fmt.Sprintf("unable-to-read-from-KVstore-%s", oo.deviceID))
547 }
548 return nil
549}
550
551func (oo *OnuDeviceEntry) deleteDataFromOnuKvStore(ctx context.Context, wg *sync.WaitGroup) {
552 defer wg.Done()
553
554 if oo.onuKVStore == nil {
555 logger.Debugw("onuKVStore not set - abort", log.Fields{"device-id": oo.deviceID})
556 oo.onuKVStoreprocResult = errors.New("onu-data delete aborted: onuKVStore not set")
557 return
558 }
559 var processingStep uint8 = 1 // used to synchronize the different processing steps with chOnuKvProcessingStep
560 go oo.deletePersistentData(ctx, processingStep)
561 if !oo.waitForTimeoutOrCompletion(ctx, oo.chOnuKvProcessingStep, processingStep) {
562 //timeout or error detected
563 logger.Debugw("ONU-data not deleted - abort", log.Fields{"device-id": oo.deviceID})
564 oo.onuKVStoreprocResult = errors.New("onu-data delete aborted: during kv-access")
565 return
566 }
567}
568
569func (oo *OnuDeviceEntry) deletePersistentData(ctx context.Context, aProcessingStep uint8) {
570
571 logger.Debugw("delete ONU-data from KVStore", log.Fields{"device-id": oo.deviceID})
572 err := oo.onuKVStore.Delete(ctx, oo.onuKVStorePath)
573 if err != nil {
574 logger.Errorw("unable to delete in KVstore", log.Fields{"device-id": oo.deviceID, "err": err})
575 oo.chOnuKvProcessingStep <- 0 //error indication
576 return
577 }
578 oo.chOnuKvProcessingStep <- aProcessingStep //done
579}
580
581func (oo *OnuDeviceEntry) updateOnuKvStore(ctx context.Context, wg *sync.WaitGroup) {
582 defer wg.Done()
583
584 if oo.onuKVStore == nil {
585 logger.Debugw("onuKVStore not set - abort", log.Fields{"device-id": oo.deviceID})
586 oo.onuKVStoreprocResult = errors.New("onu-data update aborted: onuKVStore not set")
587 return
588 }
589 var processingStep uint8 = 1 // used to synchronize the different processing steps with chOnuKvProcessingStep
590 go oo.storeDataInOnuKvStore(ctx, processingStep)
591 if !oo.waitForTimeoutOrCompletion(ctx, oo.chOnuKvProcessingStep, processingStep) {
592 //timeout or error detected
593 logger.Debugw("ONU-data not written - abort", log.Fields{"device-id": oo.deviceID})
594 oo.onuKVStoreprocResult = errors.New("onu-data update aborted: during writing process")
595 return
596 }
597}
598
599func (oo *OnuDeviceEntry) storeDataInOnuKvStore(ctx context.Context, aProcessingStep uint8) {
600
601 //assign values which are not already present when newOnuDeviceEntry() is called
602 oo.sOnuPersistentData.PersOnuID = oo.baseDeviceHandler.pOnuIndication.OnuId
603 oo.sOnuPersistentData.PersIntfID = oo.baseDeviceHandler.pOnuIndication.IntfId
604 oo.sOnuPersistentData.PersSnr = oo.baseDeviceHandler.pOnuOmciDevice.serialNumber
605 //TODO: verify usage of these values during restart UC
606 oo.sOnuPersistentData.PersAdminState = "up"
607 oo.sOnuPersistentData.PersOperState = "active"
608
609 logger.Debugw("Update ONU-data in KVStore", log.Fields{"device-id": oo.deviceID, "sOnuPersistentData": oo.sOnuPersistentData})
610
611 Value, err := json.Marshal(oo.sOnuPersistentData)
612 if err != nil {
613 logger.Errorw("unable to marshal ONU-data", log.Fields{"sOnuPersistentData": oo.sOnuPersistentData,
614 "device-id": oo.deviceID, "err": err})
615 oo.chOnuKvProcessingStep <- 0 //error indication
616 return
617 }
618 err = oo.onuKVStore.Put(ctx, oo.onuKVStorePath, Value)
619 if err != nil {
620 logger.Errorw("unable to write ONU-data into KVstore", log.Fields{"device-id": oo.deviceID, "err": err})
621 oo.chOnuKvProcessingStep <- 0 //error indication
622 return
623 }
624 oo.chOnuKvProcessingStep <- aProcessingStep //done
625}
626
627func (oo *OnuDeviceEntry) updateOnuUniTpPath(aUniID uint8, aPathString string) bool {
628 /* within some specific InterAdapter processing request write/read access to data is ensured to be sequentially,
629 as also the complete sequence is ensured to 'run to completion' before some new request is accepted
630 no specific concurrency protection to sOnuPersistentData is required here
631 */
632 for k, v := range oo.sOnuPersistentData.PersUniConfig {
633 if v.PersUniID == aUniID {
634 logger.Debugw("PersUniConfig-entry already exists", log.Fields{"device-id": oo.deviceID, "uniID": aUniID})
635 existingPath := oo.sOnuPersistentData.PersUniConfig[k].PersTpPath
636 if existingPath != aPathString {
637 if aPathString == "" {
638 //existing entry to be deleted
639 logger.Debugw("UniTp delete path value", log.Fields{"device-id": oo.deviceID, "uniID": aUniID, "path": aPathString})
640 oo.sOnuPersistentData.PersUniConfig[k].PersTpPath = ""
641 } else {
642 //existing entry to be modified
643 logger.Debugw("UniTp modify path value", log.Fields{"device-id": oo.deviceID, "uniID": aUniID, "path": aPathString})
644 oo.sOnuPersistentData.PersUniConfig[k].PersTpPath = aPathString
645 }
646 return true
647 }
648 //entry already exists
649 logger.Debugw("UniTp path already exists", log.Fields{"device-id": oo.deviceID, "uniID": aUniID, "path": aPathString})
650 return false
651 }
652 }
653 //no entry exists for uniId
654
655 if aPathString == "" {
656 //delete request in non-existing state , accept as no change
657 logger.Debugw("UniTp path already removed", log.Fields{"device-id": oo.deviceID, "uniID": aUniID})
658 return false
659 }
660 //new entry to be created
661 logger.Debugw("New UniTp path set", log.Fields{"device-id": oo.deviceID, "uniID": aUniID, "path": aPathString})
662 oo.sOnuPersistentData.PersUniConfig =
663 append(oo.sOnuPersistentData.PersUniConfig, uniPersConfig{PersUniID: aUniID, PersTpPath: aPathString, PersFlowParams: make([]uniVlanFlowParams, 0)})
664 return true
665}
666
667// deleteTpResource removes Resources from the ONU's specified Uni
668func (oo *OnuDeviceEntry) deleteTpResource(ctx context.Context,
669 aUniID uint8, aPathString string, aResource resourceEntry, aEntryID uint32,
670 wg *sync.WaitGroup) {
671 defer wg.Done()
672 logger.Debugw("this would remove TP resources from ONU's UNI", log.Fields{
673 "device-id": oo.deviceID, "uniID": aUniID, "path": aPathString, "Resource": aResource})
674 //TODO!!!
675 //delete the given resource from ONU OMCI config and data base - as background routine
676 /*
677 var processingStep uint8 = 1 // used to synchronize the different processing steps with chTpConfigProcessingStep
678 go onuTp.deleteAniResource(ctx, processingStep)
679 if !onuTP.waitForTimeoutOrCompletion(ctx, chTpConfigProcessingStep, processingStep) {
680 //timeout or error detected
681 return
682 }
683 */
684}
685
686func (oo *OnuDeviceEntry) updateOnuUniFlowConfig(aUniID uint8, aUniVlanFlowParams *[]uniVlanFlowParams) {
687
688 for k, v := range oo.sOnuPersistentData.PersUniConfig {
689 if v.PersUniID == aUniID {
690 oo.sOnuPersistentData.PersUniConfig[k].PersFlowParams = make([]uniVlanFlowParams, len(*aUniVlanFlowParams))
691 copy(oo.sOnuPersistentData.PersUniConfig[k].PersFlowParams, *aUniVlanFlowParams)
692 return
693 }
694 }
695 //flow update was faster than tp-config - create PersUniConfig-entry
696 tmpConfig := uniPersConfig{PersUniID: aUniID, PersTpPath: "", PersFlowParams: make([]uniVlanFlowParams, len(*aUniVlanFlowParams))}
697 copy(tmpConfig.PersFlowParams, *aUniVlanFlowParams)
698 oo.sOnuPersistentData.PersUniConfig = append(oo.sOnuPersistentData.PersUniConfig, tmpConfig)
699}
700
701func (oo *OnuDeviceEntry) waitForTimeoutOrCompletion(
702 ctx context.Context, aChOnuProcessingStep <-chan uint8, aProcessingStep uint8) bool {
703 select {
704 case <-ctx.Done():
705 logger.Warnw("processing not completed in-time!",
706 log.Fields{"device-id": oo.deviceID, "error": ctx.Err()})
707 return false
708 case rxStep := <-aChOnuProcessingStep:
709 if rxStep == aProcessingStep {
710 return true
711 }
712 //all other values are not accepted - including 0 for error indication
713 logger.Warnw("Invalid processing step received: abort!",
714 log.Fields{"device-id": oo.deviceID,
715 "wantedStep": aProcessingStep, "haveStep": rxStep})
716 return false
717 }
718}
719
720func (oo *OnuDeviceEntry) resetKvProcessingErrorIndication() {
721 oo.onuKVStoreprocResult = nil
722}
723func (oo *OnuDeviceEntry) getKvProcessingErrorIndication() error {
724 return oo.onuKVStoreprocResult
725}
726
727func (oo *OnuDeviceEntry) lockOnuKVStoreMutex() {
728 oo.onuKVStoreMutex.Lock()
729}
730
731func (oo *OnuDeviceEntry) unlockOnuKVStoreMutex() {
732 oo.onuKVStoreMutex.Unlock()
733}