blob: df496a8128ac1f15e62a6f1773ecf18e9d917062 [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
Himani Chawla6d2ae152020-09-02 13:11:20 +0530193type swImages struct {
Holger Hildebrandtc54939a2020-06-17 08:14:27 +0000194 version string
195 isActive uint8
196}
197
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000198type uniVlanFlowParams struct {
199 TpID uint16 `json:"tp_id"`
200 MatchVid uint32 `json:"match_vid"` //use uint32 types for allowing immediate bitshifting
201 MatchPcp uint32 `json:"match_pcp"`
202 TagsToRemove uint32 `json:"tags_to_revome"`
203 SetVid uint32 `json:"set_vid"`
204 SetPcp uint32 `json:"set_pcp"`
205}
206
207type uniPersConfig struct {
208 PersUniID uint8 `json:"uni_id"`
209 PersTpPath string `json:"tp_path"`
210 PersFlowParams []uniVlanFlowParams `json:"flow_params"`
211}
212
213type onuPersistentData struct {
214 PersOnuID uint32 `json:"onu_id"`
215 PersIntfID uint32 `json:"intf_id"`
216 PersSnr string `json:"serial_number"`
217 PersAdminState string `json:"admin_state"`
218 PersOperState string `json:"oper_state"`
219 PersUniConfig []uniPersConfig `json:"uni_config"`
220}
221
Himani Chawla6d2ae152020-09-02 13:11:20 +0530222// OnuDeviceEntry - ONU device info and FSM events.
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000223type OnuDeviceEntry struct {
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000224 deviceID string
225 baseDeviceHandler *deviceHandler
226 coreProxy adapterif.CoreProxy
227 adapterProxy adapterif.AdapterProxy
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000228 PDevOmciCC *omciCC
229 pOnuDB *onuDeviceDB
230 mibTemplateKVStore *db.Backend
231 sOnuPersistentData onuPersistentData
232 onuKVStoreMutex sync.RWMutex
233 onuKVStore *db.Backend
234 onuKVStorePath string
235 onuKVStoreprocResult error //error indication of processing
236 chOnuKvProcessingStep chan uint8
237 vendorID string
238 serialNumber string
239 equipmentID string
240 swImages [secondSwImageMeID + 1]swImages
241 activeSwVersion string
242 macAddress string
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000243 //lockDeviceEntries sync.RWMutex
244 mibDbClass func() error
245 supportedFsms OmciDeviceFsms
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000246 devState OnuDeviceEvent
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000247 // for mibUpload
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000248 mibAuditDelay uint16
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000249
250 // for mibUpload
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000251 pMibUploadFsm *AdapterFsm //could be handled dynamically and more general as pAdapterFsm - perhaps later
252 // for mibDownload
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000253 pMibDownloadFsm *AdapterFsm //could be handled dynamically and more general as pAdapterFsm - perhaps later
254 //remark: general usage of pAdapterFsm would require generalization of commChan usage and internal event setting
255 // within the FSM event procedures
ozgecanetsiae11479f2020-07-06 09:44:47 +0300256 omciMessageReceived chan bool //seperate channel needed by DownloadFsm
257 omciRebootMessageReceivedChannel chan Message // channel needed by Reboot request
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000258}
259
Himani Chawla6d2ae152020-09-02 13:11:20 +0530260//newOnuDeviceEntry returns a new instance of a OnuDeviceEntry
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000261//mib_db (as well as not inluded alarm_db not really used in this code? VERIFY!!)
Himani Chawla6d2ae152020-09-02 13:11:20 +0530262func newOnuDeviceEntry(ctx context.Context, deviceID string, kVStoreHost string, kVStorePort int, kvStoreType string, deviceHandler *deviceHandler,
Himani Chawla26e555c2020-08-31 12:30:20 +0530263 coreProxy adapterif.CoreProxy, adapterProxy adapterif.AdapterProxy,
264 supportedFsmsPtr *OmciDeviceFsms) *OnuDeviceEntry {
265 logger.Infow("init-onuDeviceEntry", log.Fields{"device-id": deviceID})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000266 var onuDeviceEntry OnuDeviceEntry
Himani Chawla26e555c2020-08-31 12:30:20 +0530267 onuDeviceEntry.deviceID = deviceID
268 onuDeviceEntry.baseDeviceHandler = deviceHandler
269 onuDeviceEntry.coreProxy = coreProxy
270 onuDeviceEntry.adapterProxy = adapterProxy
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000271 onuDeviceEntry.devState = DeviceStatusInit
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000272 onuDeviceEntry.sOnuPersistentData.PersUniConfig = make([]uniPersConfig, 0)
273 onuDeviceEntry.chOnuKvProcessingStep = make(chan uint8)
ozgecanetsiae11479f2020-07-06 09:44:47 +0300274 onuDeviceEntry.omciRebootMessageReceivedChannel = make(chan Message, 2048)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000275 //openomciagent.lockDeviceHandlersMap = sync.RWMutex{}
276 //OMCI related databases are on a per-agent basis. State machines and tasks
277 //are per ONU Vendor
278 //
279 // MIB Synchronization Database - possible overloading from arguments
Himani Chawla26e555c2020-08-31 12:30:20 +0530280 if supportedFsmsPtr != nil {
281 onuDeviceEntry.supportedFsms = *supportedFsmsPtr
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000282 } else {
283 //var mibSyncFsm = NewMibSynchronizer()
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000284 // use some internaö defaults, if not defined from outside
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000285 onuDeviceEntry.supportedFsms = OmciDeviceFsms{
286 "mib-synchronizer": {
287 //mibSyncFsm, // Implements the MIB synchronization state machine
Himani Chawla6d2ae152020-09-02 13:11:20 +0530288 onuDeviceEntry.mibDbVolatileDict, // Implements volatile ME MIB database
Himani Chawla4d908332020-08-31 12:30:20 +0530289 //true, // Advertise events on OpenOMCI event bus
290 60, // Time to wait between MIB audits. 0 to disable audits.
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000291 // map[string]func() error{
292 // "mib-upload": onuDeviceEntry.MibUploadTask,
293 // "mib-template": onuDeviceEntry.MibTemplateTask,
294 // "get-mds": onuDeviceEntry.GetMdsTask,
295 // "mib-audit": onuDeviceEntry.GetMdsTask,
296 // "mib-resync": onuDeviceEntry.MibResyncTask,
297 // "mib-reconcile": onuDeviceEntry.MibReconcileTask,
298 // },
299 },
300 }
301 }
302 onuDeviceEntry.mibDbClass = onuDeviceEntry.supportedFsms["mib-synchronizer"].databaseClass
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000303 logger.Debug("access2mibDbClass")
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000304 go onuDeviceEntry.mibDbClass()
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000305 onuDeviceEntry.mibAuditDelay = onuDeviceEntry.supportedFsms["mib-synchronizer"].auditDelay
306 logger.Debugw("MibAudit is set to", log.Fields{"Delay": onuDeviceEntry.mibAuditDelay})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000307
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000308 // Omci related Mib upload sync state machine
309 mibUploadChan := make(chan Message, 2048)
Himani Chawla26e555c2020-08-31 12:30:20 +0530310 onuDeviceEntry.pMibUploadFsm = NewAdapterFsm("MibUpload", deviceID, mibUploadChan)
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000311 onuDeviceEntry.pMibUploadFsm.pFsm = fsm.NewFSM(
mpagenko1cc3cb42020-07-27 15:24:38 +0000312 ulStDisabled,
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000313 fsm.Events{
314
mpagenko1cc3cb42020-07-27 15:24:38 +0000315 {Name: ulEvStart, Src: []string{ulStDisabled}, Dst: ulStStarting},
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000316
mpagenko1cc3cb42020-07-27 15:24:38 +0000317 {Name: ulEvResetMib, Src: []string{ulStStarting}, Dst: ulStResettingMib},
318 {Name: ulEvGetVendorAndSerial, Src: []string{ulStResettingMib}, Dst: ulStGettingVendorAndSerial},
Himani Chawla4d908332020-08-31 12:30:20 +0530319 {Name: ulEvGetEquipmentID, Src: []string{ulStGettingVendorAndSerial}, Dst: ulStGettingEquipmentID},
320 {Name: ulEvGetFirstSwVersion, Src: []string{ulStGettingEquipmentID}, Dst: ulStGettingFirstSwVersion},
mpagenko1cc3cb42020-07-27 15:24:38 +0000321 {Name: ulEvGetSecondSwVersion, Src: []string{ulStGettingFirstSwVersion}, Dst: ulStGettingSecondSwVersion},
322 {Name: ulEvGetMacAddress, Src: []string{ulStGettingSecondSwVersion}, Dst: ulStGettingMacAddress},
323 {Name: ulEvGetMibTemplate, Src: []string{ulStGettingMacAddress}, Dst: ulStGettingMibTemplate},
Holger Hildebrandtc54939a2020-06-17 08:14:27 +0000324
mpagenko1cc3cb42020-07-27 15:24:38 +0000325 {Name: ulEvUploadMib, Src: []string{ulStGettingMibTemplate}, Dst: ulStUploading},
326 {Name: ulEvExamineMds, Src: []string{ulStStarting}, Dst: ulStExaminingMds},
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000327
mpagenko1cc3cb42020-07-27 15:24:38 +0000328 {Name: ulEvSuccess, Src: []string{ulStGettingMibTemplate}, Dst: ulStInSync},
329 {Name: ulEvSuccess, Src: []string{ulStUploading}, Dst: ulStInSync},
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000330
mpagenko1cc3cb42020-07-27 15:24:38 +0000331 {Name: ulEvSuccess, Src: []string{ulStExaminingMds}, Dst: ulStInSync},
332 {Name: ulEvMismatch, Src: []string{ulStExaminingMds}, Dst: ulStResynchronizing},
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000333
mpagenko1cc3cb42020-07-27 15:24:38 +0000334 {Name: ulEvAuditMib, Src: []string{ulStInSync}, Dst: ulStAuditing},
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000335
mpagenko1cc3cb42020-07-27 15:24:38 +0000336 {Name: ulEvSuccess, Src: []string{ulStOutOfSync}, Dst: ulStInSync},
337 {Name: ulEvAuditMib, Src: []string{ulStOutOfSync}, Dst: ulStAuditing},
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000338
mpagenko1cc3cb42020-07-27 15:24:38 +0000339 {Name: ulEvSuccess, Src: []string{ulStAuditing}, Dst: ulStInSync},
340 {Name: ulEvMismatch, Src: []string{ulStAuditing}, Dst: ulStResynchronizing},
341 {Name: ulEvForceResync, Src: []string{ulStAuditing}, Dst: ulStResynchronizing},
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000342
mpagenko1cc3cb42020-07-27 15:24:38 +0000343 {Name: ulEvSuccess, Src: []string{ulStResynchronizing}, Dst: ulStInSync},
344 {Name: ulEvDiffsFound, Src: []string{ulStResynchronizing}, Dst: ulStOutOfSync},
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000345
Himani Chawla4d908332020-08-31 12:30:20 +0530346 {Name: ulEvTimeout, Src: []string{ulStResettingMib, ulStGettingVendorAndSerial, ulStGettingEquipmentID, ulStGettingFirstSwVersion,
mpagenko1cc3cb42020-07-27 15:24:38 +0000347 ulStGettingSecondSwVersion, ulStGettingMacAddress, ulStGettingMibTemplate, ulStUploading, ulStResynchronizing, ulStExaminingMds,
348 ulStInSync, ulStOutOfSync, ulStAuditing}, Dst: ulStStarting},
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000349
Himani Chawla4d908332020-08-31 12:30:20 +0530350 {Name: ulEvStop, Src: []string{ulStStarting, ulStResettingMib, ulStGettingVendorAndSerial, ulStGettingEquipmentID, ulStGettingFirstSwVersion,
mpagenko1cc3cb42020-07-27 15:24:38 +0000351 ulStGettingSecondSwVersion, ulStGettingMacAddress, ulStGettingMibTemplate, ulStUploading, ulStResynchronizing, ulStExaminingMds,
352 ulStInSync, ulStOutOfSync, ulStAuditing}, Dst: ulStDisabled},
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000353 },
354
355 fsm.Callbacks{
mpagenko1cc3cb42020-07-27 15:24:38 +0000356 "enter_state": func(e *fsm.Event) { onuDeviceEntry.pMibUploadFsm.logFsmStateChange(e) },
357 ("enter_" + ulStStarting): func(e *fsm.Event) { onuDeviceEntry.enterStartingState(e) },
358 ("enter_" + ulStResettingMib): func(e *fsm.Event) { onuDeviceEntry.enterResettingMibState(e) },
359 ("enter_" + ulStGettingVendorAndSerial): func(e *fsm.Event) { onuDeviceEntry.enterGettingVendorAndSerialState(e) },
Himani Chawla4d908332020-08-31 12:30:20 +0530360 ("enter_" + ulStGettingEquipmentID): func(e *fsm.Event) { onuDeviceEntry.enterGettingEquipmentIDState(e) },
mpagenko1cc3cb42020-07-27 15:24:38 +0000361 ("enter_" + ulStGettingFirstSwVersion): func(e *fsm.Event) { onuDeviceEntry.enterGettingFirstSwVersionState(e) },
362 ("enter_" + ulStGettingSecondSwVersion): func(e *fsm.Event) { onuDeviceEntry.enterGettingSecondSwVersionState(e) },
363 ("enter_" + ulStGettingMacAddress): func(e *fsm.Event) { onuDeviceEntry.enterGettingMacAddressState(e) },
364 ("enter_" + ulStGettingMibTemplate): func(e *fsm.Event) { onuDeviceEntry.enterGettingMibTemplate(e) },
365 ("enter_" + ulStUploading): func(e *fsm.Event) { onuDeviceEntry.enterUploadingState(e) },
366 ("enter_" + ulStExaminingMds): func(e *fsm.Event) { onuDeviceEntry.enterExaminingMdsState(e) },
367 ("enter_" + ulStResynchronizing): func(e *fsm.Event) { onuDeviceEntry.enterResynchronizingState(e) },
368 ("enter_" + ulStAuditing): func(e *fsm.Event) { onuDeviceEntry.enterAuditingState(e) },
369 ("enter_" + ulStOutOfSync): func(e *fsm.Event) { onuDeviceEntry.enterOutOfSyncState(e) },
370 ("enter_" + ulStInSync): func(e *fsm.Event) { onuDeviceEntry.enterInSyncState(e) },
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000371 },
372 )
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000373 // Omci related Mib download state machine
374 mibDownloadChan := make(chan Message, 2048)
Himani Chawla26e555c2020-08-31 12:30:20 +0530375 onuDeviceEntry.pMibDownloadFsm = NewAdapterFsm("MibDownload", deviceID, mibDownloadChan)
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000376 onuDeviceEntry.pMibDownloadFsm.pFsm = fsm.NewFSM(
mpagenko1cc3cb42020-07-27 15:24:38 +0000377 dlStDisabled,
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000378 fsm.Events{
379
mpagenko1cc3cb42020-07-27 15:24:38 +0000380 {Name: dlEvStart, Src: []string{dlStDisabled}, Dst: dlStStarting},
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000381
mpagenko1cc3cb42020-07-27 15:24:38 +0000382 {Name: dlEvCreateGal, Src: []string{dlStStarting}, Dst: dlStCreatingGal},
383 {Name: dlEvRxGalResp, Src: []string{dlStCreatingGal}, Dst: dlStSettingOnu2g},
384 {Name: dlEvRxOnu2gResp, Src: []string{dlStSettingOnu2g}, Dst: dlStBridgeInit},
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000385 // the bridge state is used for multi ME config for alle UNI related ports
386 // maybe such could be reflected in the state machine as well (port number parametrized)
387 // but that looks not straightforward here - so we keep it simple here for the beginning(?)
mpagenko1cc3cb42020-07-27 15:24:38 +0000388 {Name: dlEvRxBridgeResp, Src: []string{dlStBridgeInit}, Dst: dlStDownloaded},
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000389
mpagenko1cc3cb42020-07-27 15:24:38 +0000390 {Name: dlEvTimeoutSimple, Src: []string{dlStCreatingGal, dlStSettingOnu2g}, Dst: dlStStarting},
391 {Name: dlEvTimeoutBridge, Src: []string{dlStBridgeInit}, Dst: dlStStarting},
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000392
mpagenko1cc3cb42020-07-27 15:24:38 +0000393 {Name: dlEvReset, Src: []string{dlStStarting, dlStCreatingGal, dlStSettingOnu2g,
394 dlStBridgeInit, dlStDownloaded}, Dst: dlStResetting},
395 // exceptional treatment for all states except dlStResetting
396 {Name: dlEvRestart, Src: []string{dlStStarting, dlStCreatingGal, dlStSettingOnu2g,
397 dlStBridgeInit, dlStDownloaded, dlStResetting}, Dst: dlStDisabled},
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000398 },
399
400 fsm.Callbacks{
mpagenko1cc3cb42020-07-27 15:24:38 +0000401 "enter_state": func(e *fsm.Event) { onuDeviceEntry.pMibDownloadFsm.logFsmStateChange(e) },
402 ("enter_" + dlStStarting): func(e *fsm.Event) { onuDeviceEntry.enterDLStartingState(e) },
403 ("enter_" + dlStCreatingGal): func(e *fsm.Event) { onuDeviceEntry.enterCreatingGalState(e) },
404 ("enter_" + dlStSettingOnu2g): func(e *fsm.Event) { onuDeviceEntry.enterSettingOnu2gState(e) },
405 ("enter_" + dlStBridgeInit): func(e *fsm.Event) { onuDeviceEntry.enterBridgeInitState(e) },
406 ("enter_" + dlStDownloaded): func(e *fsm.Event) { onuDeviceEntry.enterDownloadedState(e) },
407 ("enter_" + dlStResetting): func(e *fsm.Event) { onuDeviceEntry.enterResettingState(e) },
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000408 },
409 )
410 if onuDeviceEntry.pMibDownloadFsm == nil || onuDeviceEntry.pMibDownloadFsm.pFsm == nil {
Andrea Campanella6515c582020-10-05 11:25:00 +0200411 logger.Errorw("MibDownloadFsm could not be instantiated", log.Fields{"device-id": deviceID})
412 // TODO some specifc error treatment - or waiting for crash ?
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000413 }
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000414
Himani Chawla6d2ae152020-09-02 13:11:20 +0530415 onuDeviceEntry.mibTemplateKVStore = onuDeviceEntry.baseDeviceHandler.setBackend(cBasePathMibTemplateKvStore)
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000416 if onuDeviceEntry.mibTemplateKVStore == nil {
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000417 logger.Errorw("Can't access mibTemplateKVStore - no backend connection to service",
418 log.Fields{"device-id": deviceID, "service": cBasePathMibTemplateKvStore})
419 }
420
421 onuDeviceEntry.onuKVStorePath = onuDeviceEntry.deviceID
422 onuDeviceEntry.onuKVStore = onuDeviceEntry.baseDeviceHandler.setBackend(cBasePathOnuKVStore)
423 if onuDeviceEntry.onuKVStore == nil {
424 logger.Errorw("Can't access onuKVStore - no backend connection to service",
425 log.Fields{"device-id": deviceID, "service": cBasePathOnuKVStore})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000426 }
427
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000428 // Alarm Synchronization Database
429 //self._alarm_db = None
430 //self._alarm_database_cls = support_classes['alarm-synchronizer']['database']
431 return &onuDeviceEntry
432}
433
Himani Chawla6d2ae152020-09-02 13:11:20 +0530434//start starts (logs) the omci agent
435func (oo *OnuDeviceEntry) start(ctx context.Context) error {
mpagenko900ee4b2020-10-12 11:56:34 +0000436 logger.Infow("OnuDeviceEntry-starting", log.Fields{"for device-id": oo.deviceID})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000437 if oo.PDevOmciCC == nil {
mpagenko900ee4b2020-10-12 11:56:34 +0000438 oo.PDevOmciCC = newOmciCC(ctx, oo, oo.deviceID, oo.baseDeviceHandler,
439 oo.coreProxy, oo.adapterProxy)
440 if oo.PDevOmciCC == nil {
441 logger.Errorw("Could not create devOmciCc - abort", log.Fields{"for device-id": oo.deviceID})
442 return fmt.Errorf("could not create devOmciCc %s", oo.deviceID)
443 }
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000444 }
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000445 return nil
446}
447
mpagenko900ee4b2020-10-12 11:56:34 +0000448//stop stops/resets the omciCC
449func (oo *OnuDeviceEntry) stop(ctx context.Context, abResetOmciCC bool) error {
450 logger.Debugw("OnuDeviceEntry-stopping", log.Fields{"for device-id": oo.deviceID})
451 if abResetOmciCC && (oo.PDevOmciCC != nil) {
452 _ = oo.PDevOmciCC.stop(ctx)
453 }
454 //to allow for all event notifications again when re-using the device and omciCC
455 oo.devState = DeviceStatusInit
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000456 return nil
457}
458
Himani Chawla6d2ae152020-09-02 13:11:20 +0530459func (oo *OnuDeviceEntry) reboot(ctx context.Context) error {
mpagenko900ee4b2020-10-12 11:56:34 +0000460 logger.Debugw("OnuDeviceEntry-rebooting", log.Fields{"for device-id": oo.deviceID})
461 if oo.PDevOmciCC != nil {
462 if err := oo.PDevOmciCC.sendReboot(ctx, ConstDefaultOmciTimeout, true, oo.omciRebootMessageReceivedChannel); err != nil {
463 logger.Errorw("onu didn't reboot", log.Fields{"for device-id": oo.deviceID})
464 return err
465 }
ozgecanetsiae11479f2020-07-06 09:44:47 +0300466 }
ozgecanetsiae11479f2020-07-06 09:44:47 +0300467 return nil
468}
469
470func (oo *OnuDeviceEntry) waitForRebootResponse(responseChannel chan Message) error {
471 select {
472 case <-time.After(3 * time.Second): //3s was detected to be to less in 8*8 bbsim test with debug Info/Debug
473 logger.Warnw("Reboot timeout", log.Fields{"for device-id": oo.deviceID})
Andrea Campanella6515c582020-10-05 11:25:00 +0200474 return fmt.Errorf("rebootTimeout")
ozgecanetsiae11479f2020-07-06 09:44:47 +0300475 case data := <-responseChannel:
476 switch data.Data.(OmciMessage).OmciMsg.MessageType {
477 case omci.RebootResponseType:
478 {
479 msgLayer := (*data.Data.(OmciMessage).OmciPacket).Layer(omci.LayerTypeRebootResponse)
480 if msgLayer == nil {
Andrea Campanella6515c582020-10-05 11:25:00 +0200481 return fmt.Errorf("omci Msg layer could not be detected for RebootResponseType")
ozgecanetsiae11479f2020-07-06 09:44:47 +0300482 }
Andrea Campanellabef4e542020-10-22 11:01:28 +0200483 msgObj, msgOk := msgLayer.(*omci.RebootResponse)
ozgecanetsiae11479f2020-07-06 09:44:47 +0300484 if !msgOk {
Andrea Campanella6515c582020-10-05 11:25:00 +0200485 return fmt.Errorf("omci Msg layer could not be assigned for RebootResponseType %s", oo.deviceID)
ozgecanetsiae11479f2020-07-06 09:44:47 +0300486 }
Andrea Campanellabef4e542020-10-22 11:01:28 +0200487 logger.Debugw("RebootResponse data", log.Fields{"device-id": oo.deviceID, "data-fields": msgObj})
ozgecanetsiae11479f2020-07-06 09:44:47 +0300488 if msgObj.Result != me.Success {
Andrea Campanellabef4e542020-10-22 11:01:28 +0200489 logger.Errorw("Omci RebootResponse Error ", log.Fields{"device-id": oo.deviceID, "Error": msgObj.Result})
ozgecanetsiae11479f2020-07-06 09:44:47 +0300490 // possibly force FSM into abort or ignore some errors for some messages? store error for mgmt display?
Andrea Campanellabef4e542020-10-22 11:01:28 +0200491 return fmt.Errorf("omci RebootResponse result error indication %s for device %s",
Andrea Campanella6515c582020-10-05 11:25:00 +0200492 msgObj.Result, oo.deviceID)
ozgecanetsiae11479f2020-07-06 09:44:47 +0300493 }
494 return nil
495 }
496 }
497 logger.Warnw("Reboot response error", log.Fields{"for device-id": oo.deviceID})
Andrea Campanella6515c582020-10-05 11:25:00 +0200498 return fmt.Errorf("unexpected OmciResponse type received %s", oo.deviceID)
ozgecanetsiae11479f2020-07-06 09:44:47 +0300499 }
500}
501
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000502//Relay the InSync message via Handler to Rw core - Status update
Himani Chawla26e555c2020-08-31 12:30:20 +0530503func (oo *OnuDeviceEntry) transferSystemEvent(devEvent OnuDeviceEvent) {
504 logger.Debugw("relaying system-event", log.Fields{"Event": devEvent})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000505 // decouple the handler transfer from further processing here
506 // TODO!!! check if really no synch is required within the system e.g. to ensure following steps ..
Himani Chawla26e555c2020-08-31 12:30:20 +0530507 if devEvent == MibDatabaseSync {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000508 if oo.devState < MibDatabaseSync { //devState has not been synced yet
509 oo.devState = MibDatabaseSync
Himani Chawla6d2ae152020-09-02 13:11:20 +0530510 go oo.baseDeviceHandler.deviceProcStatusUpdate(devEvent)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000511 //TODO!!! device control: next step: start MIB capability verification from here ?!!!
512 } else {
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000513 logger.Debugw("mibinsync-event in some already synced state - ignored", log.Fields{"state": oo.devState})
514 }
Himani Chawla26e555c2020-08-31 12:30:20 +0530515 } else if devEvent == MibDownloadDone {
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000516 if oo.devState < MibDownloadDone { //devState has not been synced yet
517 oo.devState = MibDownloadDone
Himani Chawla6d2ae152020-09-02 13:11:20 +0530518 go oo.baseDeviceHandler.deviceProcStatusUpdate(devEvent)
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000519 } else {
520 logger.Debugw("mibdownloaddone-event was already seen - ignored", log.Fields{"state": oo.devState})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000521 }
522 } else {
Himani Chawla26e555c2020-08-31 12:30:20 +0530523 logger.Warnw("device-event not yet handled", log.Fields{"state": devEvent})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000524 }
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000525}
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000526
527func (oo *OnuDeviceEntry) restoreDataFromOnuKvStore(ctx context.Context) error {
528 if oo.onuKVStore == nil {
529 logger.Debugw("onuKVStore not set - abort", log.Fields{"device-id": oo.deviceID})
530 return fmt.Errorf(fmt.Sprintf("onuKVStore-not-set-abort-%s", oo.deviceID))
531 }
532 oo.sOnuPersistentData = onuPersistentData{0, 0, "", "", "", make([]uniPersConfig, 0)}
533 Value, err := oo.onuKVStore.Get(ctx, oo.onuKVStorePath)
534 if err == nil {
535 if Value != nil {
536 logger.Debugw("ONU-data read",
537 log.Fields{"Key": Value.Key, "device-id": oo.deviceID})
538 tmpBytes, _ := kvstore.ToByte(Value.Value)
539
540 if err = json.Unmarshal(tmpBytes, &oo.sOnuPersistentData); err != nil {
541 logger.Errorw("unable to unmarshal ONU-data", log.Fields{"error": err, "device-id": oo.deviceID})
542 return fmt.Errorf(fmt.Sprintf("unable-to-unmarshal-ONU-data-%s", oo.deviceID))
543 }
544 logger.Debugw("ONU-data", log.Fields{"sOnuPersistentData": oo.sOnuPersistentData,
545 "device-id": oo.deviceID})
546 } else {
547 logger.Errorw("no ONU-data found", log.Fields{"path": oo.onuKVStorePath, "device-id": oo.deviceID})
548 return fmt.Errorf(fmt.Sprintf("no-ONU-data-found-%s", oo.deviceID))
549 }
550 } else {
551 logger.Errorw("unable to read from KVstore", log.Fields{"device-id": oo.deviceID})
552 return fmt.Errorf(fmt.Sprintf("unable-to-read-from-KVstore-%s", oo.deviceID))
553 }
554 return nil
555}
556
557func (oo *OnuDeviceEntry) deleteDataFromOnuKvStore(ctx context.Context, wg *sync.WaitGroup) {
558 defer wg.Done()
559
560 if oo.onuKVStore == nil {
561 logger.Debugw("onuKVStore not set - abort", log.Fields{"device-id": oo.deviceID})
562 oo.onuKVStoreprocResult = errors.New("onu-data delete aborted: onuKVStore not set")
563 return
564 }
565 var processingStep uint8 = 1 // used to synchronize the different processing steps with chOnuKvProcessingStep
566 go oo.deletePersistentData(ctx, processingStep)
567 if !oo.waitForTimeoutOrCompletion(ctx, oo.chOnuKvProcessingStep, processingStep) {
568 //timeout or error detected
569 logger.Debugw("ONU-data not deleted - abort", log.Fields{"device-id": oo.deviceID})
570 oo.onuKVStoreprocResult = errors.New("onu-data delete aborted: during kv-access")
571 return
572 }
573}
574
575func (oo *OnuDeviceEntry) deletePersistentData(ctx context.Context, aProcessingStep uint8) {
576
577 logger.Debugw("delete ONU-data from KVStore", log.Fields{"device-id": oo.deviceID})
578 err := oo.onuKVStore.Delete(ctx, oo.onuKVStorePath)
579 if err != nil {
580 logger.Errorw("unable to delete in KVstore", log.Fields{"device-id": oo.deviceID, "err": err})
581 oo.chOnuKvProcessingStep <- 0 //error indication
582 return
583 }
584 oo.chOnuKvProcessingStep <- aProcessingStep //done
585}
586
587func (oo *OnuDeviceEntry) updateOnuKvStore(ctx context.Context, wg *sync.WaitGroup) {
588 defer wg.Done()
589
590 if oo.onuKVStore == nil {
591 logger.Debugw("onuKVStore not set - abort", log.Fields{"device-id": oo.deviceID})
592 oo.onuKVStoreprocResult = errors.New("onu-data update aborted: onuKVStore not set")
593 return
594 }
595 var processingStep uint8 = 1 // used to synchronize the different processing steps with chOnuKvProcessingStep
596 go oo.storeDataInOnuKvStore(ctx, processingStep)
597 if !oo.waitForTimeoutOrCompletion(ctx, oo.chOnuKvProcessingStep, processingStep) {
598 //timeout or error detected
599 logger.Debugw("ONU-data not written - abort", log.Fields{"device-id": oo.deviceID})
600 oo.onuKVStoreprocResult = errors.New("onu-data update aborted: during writing process")
601 return
602 }
603}
604
605func (oo *OnuDeviceEntry) storeDataInOnuKvStore(ctx context.Context, aProcessingStep uint8) {
606
607 //assign values which are not already present when newOnuDeviceEntry() is called
608 oo.sOnuPersistentData.PersOnuID = oo.baseDeviceHandler.pOnuIndication.OnuId
609 oo.sOnuPersistentData.PersIntfID = oo.baseDeviceHandler.pOnuIndication.IntfId
610 oo.sOnuPersistentData.PersSnr = oo.baseDeviceHandler.pOnuOmciDevice.serialNumber
611 //TODO: verify usage of these values during restart UC
612 oo.sOnuPersistentData.PersAdminState = "up"
613 oo.sOnuPersistentData.PersOperState = "active"
614
615 logger.Debugw("Update ONU-data in KVStore", log.Fields{"device-id": oo.deviceID, "sOnuPersistentData": oo.sOnuPersistentData})
616
617 Value, err := json.Marshal(oo.sOnuPersistentData)
618 if err != nil {
619 logger.Errorw("unable to marshal ONU-data", log.Fields{"sOnuPersistentData": oo.sOnuPersistentData,
620 "device-id": oo.deviceID, "err": err})
621 oo.chOnuKvProcessingStep <- 0 //error indication
622 return
623 }
624 err = oo.onuKVStore.Put(ctx, oo.onuKVStorePath, Value)
625 if err != nil {
626 logger.Errorw("unable to write ONU-data into KVstore", log.Fields{"device-id": oo.deviceID, "err": err})
627 oo.chOnuKvProcessingStep <- 0 //error indication
628 return
629 }
630 oo.chOnuKvProcessingStep <- aProcessingStep //done
631}
632
633func (oo *OnuDeviceEntry) updateOnuUniTpPath(aUniID uint8, aPathString string) bool {
634 /* within some specific InterAdapter processing request write/read access to data is ensured to be sequentially,
635 as also the complete sequence is ensured to 'run to completion' before some new request is accepted
636 no specific concurrency protection to sOnuPersistentData is required here
637 */
638 for k, v := range oo.sOnuPersistentData.PersUniConfig {
639 if v.PersUniID == aUniID {
640 logger.Debugw("PersUniConfig-entry already exists", log.Fields{"device-id": oo.deviceID, "uniID": aUniID})
641 existingPath := oo.sOnuPersistentData.PersUniConfig[k].PersTpPath
642 if existingPath != aPathString {
643 if aPathString == "" {
644 //existing entry to be deleted
645 logger.Debugw("UniTp delete path value", log.Fields{"device-id": oo.deviceID, "uniID": aUniID, "path": aPathString})
646 oo.sOnuPersistentData.PersUniConfig[k].PersTpPath = ""
647 } else {
648 //existing entry to be modified
649 logger.Debugw("UniTp modify path value", log.Fields{"device-id": oo.deviceID, "uniID": aUniID, "path": aPathString})
650 oo.sOnuPersistentData.PersUniConfig[k].PersTpPath = aPathString
651 }
652 return true
653 }
654 //entry already exists
655 logger.Debugw("UniTp path already exists", log.Fields{"device-id": oo.deviceID, "uniID": aUniID, "path": aPathString})
656 return false
657 }
658 }
659 //no entry exists for uniId
660
661 if aPathString == "" {
662 //delete request in non-existing state , accept as no change
663 logger.Debugw("UniTp path already removed", log.Fields{"device-id": oo.deviceID, "uniID": aUniID})
664 return false
665 }
666 //new entry to be created
667 logger.Debugw("New UniTp path set", log.Fields{"device-id": oo.deviceID, "uniID": aUniID, "path": aPathString})
668 oo.sOnuPersistentData.PersUniConfig =
669 append(oo.sOnuPersistentData.PersUniConfig, uniPersConfig{PersUniID: aUniID, PersTpPath: aPathString, PersFlowParams: make([]uniVlanFlowParams, 0)})
670 return true
671}
672
673// deleteTpResource removes Resources from the ONU's specified Uni
674func (oo *OnuDeviceEntry) deleteTpResource(ctx context.Context,
675 aUniID uint8, aPathString string, aResource resourceEntry, aEntryID uint32,
676 wg *sync.WaitGroup) {
677 defer wg.Done()
678 logger.Debugw("this would remove TP resources from ONU's UNI", log.Fields{
679 "device-id": oo.deviceID, "uniID": aUniID, "path": aPathString, "Resource": aResource})
680 //TODO!!!
681 //delete the given resource from ONU OMCI config and data base - as background routine
682 /*
683 var processingStep uint8 = 1 // used to synchronize the different processing steps with chTpConfigProcessingStep
684 go onuTp.deleteAniResource(ctx, processingStep)
685 if !onuTP.waitForTimeoutOrCompletion(ctx, chTpConfigProcessingStep, processingStep) {
686 //timeout or error detected
687 return
688 }
689 */
690}
691
692func (oo *OnuDeviceEntry) updateOnuUniFlowConfig(aUniID uint8, aUniVlanFlowParams *[]uniVlanFlowParams) {
693
694 for k, v := range oo.sOnuPersistentData.PersUniConfig {
695 if v.PersUniID == aUniID {
696 oo.sOnuPersistentData.PersUniConfig[k].PersFlowParams = make([]uniVlanFlowParams, len(*aUniVlanFlowParams))
697 copy(oo.sOnuPersistentData.PersUniConfig[k].PersFlowParams, *aUniVlanFlowParams)
698 return
699 }
700 }
701 //flow update was faster than tp-config - create PersUniConfig-entry
702 tmpConfig := uniPersConfig{PersUniID: aUniID, PersTpPath: "", PersFlowParams: make([]uniVlanFlowParams, len(*aUniVlanFlowParams))}
703 copy(tmpConfig.PersFlowParams, *aUniVlanFlowParams)
704 oo.sOnuPersistentData.PersUniConfig = append(oo.sOnuPersistentData.PersUniConfig, tmpConfig)
705}
706
707func (oo *OnuDeviceEntry) waitForTimeoutOrCompletion(
708 ctx context.Context, aChOnuProcessingStep <-chan uint8, aProcessingStep uint8) bool {
709 select {
710 case <-ctx.Done():
711 logger.Warnw("processing not completed in-time!",
712 log.Fields{"device-id": oo.deviceID, "error": ctx.Err()})
713 return false
714 case rxStep := <-aChOnuProcessingStep:
715 if rxStep == aProcessingStep {
716 return true
717 }
718 //all other values are not accepted - including 0 for error indication
719 logger.Warnw("Invalid processing step received: abort!",
720 log.Fields{"device-id": oo.deviceID,
721 "wantedStep": aProcessingStep, "haveStep": rxStep})
722 return false
723 }
724}
725
726func (oo *OnuDeviceEntry) resetKvProcessingErrorIndication() {
727 oo.onuKVStoreprocResult = nil
728}
729func (oo *OnuDeviceEntry) getKvProcessingErrorIndication() error {
730 return oo.onuKVStoreprocResult
731}
732
733func (oo *OnuDeviceEntry) lockOnuKVStoreMutex() {
734 oo.onuKVStoreMutex.Lock()
735}
736
737func (oo *OnuDeviceEntry) unlockOnuKVStoreMutex() {
738 oo.onuKVStoreMutex.Unlock()
739}