blob: aa2d5f00369e6899d9e655557c7f5e71796cf067 [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
132 // UniAdminStateDone - Uni ports admin set done - general
133 UniAdminStateDone OnuDeviceEvent = 6
134 // PortLinkUp - Port link state change
135 PortLinkUp OnuDeviceEvent = 7
136 // PortLinkDw - Port link state change
137 PortLinkDw OnuDeviceEvent = 8
138 // OmciAniConfigDone - AniSide config according to TechProfile done
139 OmciAniConfigDone OnuDeviceEvent = 9
140 // OmciVlanFilterDone - Omci Vlan config according to flowConfig done
141 OmciVlanFilterDone OnuDeviceEvent = 10
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000142 // Add other events here as needed (alarms separate???)
143)
144
145type activityDescr struct {
Himani Chawla4d908332020-08-31 12:30:20 +0530146 databaseClass func() error
147 //advertiseEvents bool
148 auditDelay uint16
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000149 //tasks map[string]func() error
150}
Himani Chawla6d2ae152020-09-02 13:11:20 +0530151
152// OmciDeviceFsms - FSM event mapping to database class and time to wait between audits
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000153type OmciDeviceFsms map[string]activityDescr
154
Himani Chawla6d2ae152020-09-02 13:11:20 +0530155// AdapterFsm - Adapter FSM details including channel, event and device
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000156type AdapterFsm struct {
157 fsmName string
158 deviceID string
159 commChan chan Message
160 pFsm *fsm.FSM
161}
162
Himani Chawla6d2ae152020-09-02 13:11:20 +0530163//NewAdapterFsm - FSM details including event, device and channel.
164func NewAdapterFsm(aName string, aDeviceID string, aCommChannel chan Message) *AdapterFsm {
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000165 aFsm := &AdapterFsm{
Himani Chawla6d2ae152020-09-02 13:11:20 +0530166 fsmName: aName,
167 deviceID: aDeviceID,
168 commChan: aCommChannel,
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000169 }
170 return aFsm
171}
172
173//Start starts (logs) the omci agent
174func (oo *AdapterFsm) logFsmStateChange(e *fsm.Event) {
175 logger.Debugw("FSM state change", log.Fields{"device-id": oo.deviceID, "FSM name": oo.fsmName,
176 "event name": string(e.Event), "src state": string(e.Src), "dst state": string(e.Dst)})
177}
178
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000179//OntDeviceEntry structure holds information about the attached FSM'as and their communication
Holger Hildebrandtc54939a2020-06-17 08:14:27 +0000180
181const (
Himani Chawla6d2ae152020-09-02 13:11:20 +0530182 firstSwImageMeID = 0
183 secondSwImageMeID = 1
Holger Hildebrandtc54939a2020-06-17 08:14:27 +0000184)
Himani Chawla6d2ae152020-09-02 13:11:20 +0530185const onugMeID = 0
186const onu2gMeID = 0
187const ipHostConfigDataMeID = 1
188const onugSerialNumberLen = 8
189const omciMacAddressLen = 6
Holger Hildebrandtc54939a2020-06-17 08:14:27 +0000190
Himani Chawla6d2ae152020-09-02 13:11:20 +0530191type swImages struct {
Holger Hildebrandtc54939a2020-06-17 08:14:27 +0000192 version string
193 isActive uint8
194}
195
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000196type uniVlanFlowParams struct {
197 TpID uint16 `json:"tp_id"`
198 MatchVid uint32 `json:"match_vid"` //use uint32 types for allowing immediate bitshifting
199 MatchPcp uint32 `json:"match_pcp"`
200 TagsToRemove uint32 `json:"tags_to_revome"`
201 SetVid uint32 `json:"set_vid"`
202 SetPcp uint32 `json:"set_pcp"`
203}
204
205type uniPersConfig struct {
206 PersUniID uint8 `json:"uni_id"`
207 PersTpPath string `json:"tp_path"`
208 PersFlowParams []uniVlanFlowParams `json:"flow_params"`
209}
210
211type onuPersistentData struct {
212 PersOnuID uint32 `json:"onu_id"`
213 PersIntfID uint32 `json:"intf_id"`
214 PersSnr string `json:"serial_number"`
215 PersAdminState string `json:"admin_state"`
216 PersOperState string `json:"oper_state"`
217 PersUniConfig []uniPersConfig `json:"uni_config"`
218}
219
Himani Chawla6d2ae152020-09-02 13:11:20 +0530220// OnuDeviceEntry - ONU device info and FSM events.
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000221type OnuDeviceEntry struct {
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000222 deviceID string
223 baseDeviceHandler *deviceHandler
224 coreProxy adapterif.CoreProxy
225 adapterProxy adapterif.AdapterProxy
226 started bool
227 PDevOmciCC *omciCC
228 pOnuDB *onuDeviceDB
229 mibTemplateKVStore *db.Backend
230 sOnuPersistentData onuPersistentData
231 onuKVStoreMutex sync.RWMutex
232 onuKVStore *db.Backend
233 onuKVStorePath string
234 onuKVStoreprocResult error //error indication of processing
235 chOnuKvProcessingStep chan uint8
236 vendorID string
237 serialNumber string
238 equipmentID string
239 swImages [secondSwImageMeID + 1]swImages
240 activeSwVersion string
241 macAddress string
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000242 //lockDeviceEntries sync.RWMutex
243 mibDbClass func() error
244 supportedFsms OmciDeviceFsms
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000245 devState OnuDeviceEvent
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000246 // for mibUpload
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000247 mibAuditDelay uint16
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000248
249 // for mibUpload
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000250 pMibUploadFsm *AdapterFsm //could be handled dynamically and more general as pAdapterFsm - perhaps later
251 // for mibDownload
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000252 pMibDownloadFsm *AdapterFsm //could be handled dynamically and more general as pAdapterFsm - perhaps later
253 //remark: general usage of pAdapterFsm would require generalization of commChan usage and internal event setting
254 // within the FSM event procedures
ozgecanetsiae11479f2020-07-06 09:44:47 +0300255 omciMessageReceived chan bool //seperate channel needed by DownloadFsm
256 omciRebootMessageReceivedChannel chan Message // channel needed by Reboot request
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000257}
258
Himani Chawla6d2ae152020-09-02 13:11:20 +0530259//newOnuDeviceEntry returns a new instance of a OnuDeviceEntry
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000260//mib_db (as well as not inluded alarm_db not really used in this code? VERIFY!!)
Himani Chawla6d2ae152020-09-02 13:11:20 +0530261func newOnuDeviceEntry(ctx context.Context, deviceID string, kVStoreHost string, kVStorePort int, kvStoreType string, deviceHandler *deviceHandler,
Himani Chawla26e555c2020-08-31 12:30:20 +0530262 coreProxy adapterif.CoreProxy, adapterProxy adapterif.AdapterProxy,
263 supportedFsmsPtr *OmciDeviceFsms) *OnuDeviceEntry {
264 logger.Infow("init-onuDeviceEntry", log.Fields{"device-id": deviceID})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000265 var onuDeviceEntry OnuDeviceEntry
266 onuDeviceEntry.started = false
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 {
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000436 logger.Info("starting-OnuDeviceEntry")
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000437
Himani Chawla6d2ae152020-09-02 13:11:20 +0530438 oo.PDevOmciCC = newOmciCC(ctx, oo, oo.deviceID, oo.baseDeviceHandler,
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000439 oo.coreProxy, oo.adapterProxy)
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000440 if oo.PDevOmciCC == nil {
divyadesai4d299552020-08-18 07:13:49 +0000441 logger.Errorw("Could not create devOmciCc - abort", log.Fields{"for device-id": oo.deviceID})
Andrea Campanella6515c582020-10-05 11:25:00 +0200442 return fmt.Errorf("could not create devOmciCc %s", oo.deviceID)
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000443 }
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000444
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000445 oo.started = true
Andrea Campanella6515c582020-10-05 11:25:00 +0200446 logger.Infow("OnuDeviceEntry-started", log.Fields{"for device-id": oo.deviceID})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000447 return nil
448}
449
Himani Chawla6d2ae152020-09-02 13:11:20 +0530450//stop terminates the session
451func (oo *OnuDeviceEntry) stop(ctx context.Context) error {
Andrea Campanella6515c582020-10-05 11:25:00 +0200452 logger.Infow("stopping-OnuDeviceEntry", log.Fields{"for device-id": oo.deviceID})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000453 oo.started = false
454 //oo.exitChannel <- 1
mpagenko3af1f032020-06-10 08:53:41 +0000455 // maybe also the omciCC should be stopped here - for now not as no real processing is expected here - maybe needs consolidation
Andrea Campanella6515c582020-10-05 11:25:00 +0200456 logger.Infow("OnuDeviceEntry-stopped", log.Fields{"for device-id": oo.deviceID})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000457 return nil
458}
459
Himani Chawla6d2ae152020-09-02 13:11:20 +0530460func (oo *OnuDeviceEntry) reboot(ctx context.Context) error {
Andrea Campanella6515c582020-10-05 11:25:00 +0200461 logger.Infow("reboot-OnuDeviceEntry", log.Fields{"for device-id": oo.deviceID})
ozgecanetsiae11479f2020-07-06 09:44:47 +0300462 if err := oo.PDevOmciCC.sendReboot(context.TODO(), ConstDefaultOmciTimeout, true, oo.omciRebootMessageReceivedChannel); err != nil {
divyadesai4d299552020-08-18 07:13:49 +0000463 logger.Errorw("onu didn't reboot", log.Fields{"for device-id": oo.deviceID})
ozgecanetsiae11479f2020-07-06 09:44:47 +0300464 return err
465 }
Andrea Campanella6515c582020-10-05 11:25:00 +0200466 logger.Infow("OnuDeviceEntry-reboot", log.Fields{"for device-id": oo.deviceID})
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 }
483 msgObj, msgOk := msgLayer.(*omci.GetResponse)
484 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 }
divyadesai4d299552020-08-18 07:13:49 +0000487 logger.Debugw("CreateResponse Data", log.Fields{"device-id": oo.deviceID, "data-fields": msgObj})
ozgecanetsiae11479f2020-07-06 09:44:47 +0300488 if msgObj.Result != me.Success {
Andrea Campanella6515c582020-10-05 11:25:00 +0200489 logger.Errorw("Omci RebootResponseType 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 Campanella6515c582020-10-05 11:25:00 +0200491 return fmt.Errorf("omci RebootResponse Result Error indication %s for device %s",
492 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}