blob: 2f6756c60dd7312f3ca367ad8d4c424a8994a551 [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"
Girish Gowdra50e56422021-06-01 16:46:04 -070035 "github.com/opencord/voltha-lib-go/v5/pkg/adapters/adapterif"
36 "github.com/opencord/voltha-lib-go/v5/pkg/db"
37 "github.com/opencord/voltha-lib-go/v5/pkg/db/kvstore"
Holger Hildebrandtfa074992020-03-27 15:42:06 +000038
Girish Gowdra50e56422021-06-01 16:46:04 -070039 //"github.com/opencord/voltha-lib-go/v5/pkg/kafka"
40 "github.com/opencord/voltha-lib-go/v5/pkg/log"
dbainbri4d3a0dc2020-12-02 00:33:42 +000041 //ic "github.com/opencord/voltha-protos/v4/go/inter_container"
42 //"github.com/opencord/voltha-protos/v4/go/openflow_13"
43 //"github.com/opencord/voltha-protos/v4/go/voltha"
Holger Hildebrandtfa074992020-03-27 15:42:06 +000044)
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"
Holger Hildebrandt10d98192021-01-27 15:29:31 +000078 ulStUploadDone = "ulStUploadDone"
mpagenko1cc3cb42020-07-27 15:24:38 +000079 ulStInSync = "ulStInSync"
80 ulStExaminingMds = "ulStExaminingMds"
81 ulStResynchronizing = "ulStResynchronizing"
Holger Hildebrandtbe523842021-03-10 10:47:18 +000082 ulStExaminingMdsSuccess = "ulStExaminingMdsSuccess"
mpagenko1cc3cb42020-07-27 15:24:38 +000083 ulStAuditing = "ulStAuditing"
Holger Hildebrandt10d98192021-01-27 15:29:31 +000084 ulStReAuditing = "ulStReAuditing"
mpagenko1cc3cb42020-07-27 15:24:38 +000085 ulStOutOfSync = "ulStOutOfSync"
86)
Holger Hildebrandt10d98192021-01-27 15:29:31 +000087const cMibUlFsmIdleState = ulStInSync
mpagenko1cc3cb42020-07-27 15:24:38 +000088
89const (
90 // events of MibDownload FSM
91 dlEvStart = "dlEvStart"
92 dlEvCreateGal = "dlEvCreateGal"
93 dlEvRxGalResp = "dlEvRxGalResp"
94 dlEvRxOnu2gResp = "dlEvRxOnu2gResp"
95 dlEvRxBridgeResp = "dlEvRxBridgeResp"
96 dlEvTimeoutSimple = "dlEvTimeoutSimple"
97 dlEvTimeoutBridge = "dlEvTimeoutBridge"
98 dlEvReset = "dlEvReset"
99 dlEvRestart = "dlEvRestart"
100)
101const (
102 // states of MibDownload FSM
103 dlStDisabled = "dlStDisabled"
104 dlStStarting = "dlStStarting"
105 dlStCreatingGal = "dlStCreatingGal"
106 dlStSettingOnu2g = "dlStSettingOnu2g"
107 dlStBridgeInit = "dlStBridgeInit"
108 dlStDownloaded = "dlStDownloaded"
109 dlStResetting = "dlStResetting"
110)
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000111const cMibDlFsmIdleState = dlStDisabled
mpagenko1cc3cb42020-07-27 15:24:38 +0000112
113const (
Matteo Scandolof1f39a72020-11-24 12:08:11 -0800114 // NOTE that this hardcoded to service/voltha as the MIB template is shared across stacks
Holger Hildebrandt2ff21f12020-08-13 14:38:02 +0000115 cBasePathMibTemplateKvStore = "service/voltha/omci_mibs/go_templates"
mpagenkoaf801632020-07-03 10:00:42 +0000116 cSuffixMibTemplateKvStore = "%s/%s/%s"
Matteo Scandolof1f39a72020-11-24 12:08:11 -0800117 cBasePathOnuKVStore = "%s/openonu"
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000118)
119
Himani Chawla6d2ae152020-09-02 13:11:20 +0530120// OnuDeviceEvent - event of interest to Device Adapters and OpenOMCI State Machines
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000121type OnuDeviceEvent int
122
123const (
124 // Events of interest to Device Adapters and OpenOMCI State Machines
Himani Chawla6d2ae152020-09-02 13:11:20 +0530125
126 // DeviceStatusInit - default start state
mpagenkofc4f56e2020-11-04 17:17:49 +0000127 DeviceStatusInit OnuDeviceEvent = iota
Himani Chawla6d2ae152020-09-02 13:11:20 +0530128 // MibDatabaseSync - MIB database sync (upload done)
mpagenkofc4f56e2020-11-04 17:17:49 +0000129 MibDatabaseSync
Himani Chawla6d2ae152020-09-02 13:11:20 +0530130 // OmciCapabilitiesDone - OMCI ME and message type capabilities known
mpagenkofc4f56e2020-11-04 17:17:49 +0000131 OmciCapabilitiesDone
Himani Chawla6d2ae152020-09-02 13:11:20 +0530132 // MibDownloadDone - // MIB download done
mpagenkofc4f56e2020-11-04 17:17:49 +0000133 MibDownloadDone
Himani Chawla6d2ae152020-09-02 13:11:20 +0530134 // UniLockStateDone - Uni ports admin set to lock
mpagenkofc4f56e2020-11-04 17:17:49 +0000135 UniLockStateDone
Himani Chawla6d2ae152020-09-02 13:11:20 +0530136 // UniUnlockStateDone - Uni ports admin set to unlock
mpagenkofc4f56e2020-11-04 17:17:49 +0000137 UniUnlockStateDone
mpagenko900ee4b2020-10-12 11:56:34 +0000138 // UniDisableStateDone - Uni ports admin set to lock based on device disable
mpagenkofc4f56e2020-11-04 17:17:49 +0000139 UniDisableStateDone
mpagenko900ee4b2020-10-12 11:56:34 +0000140 // UniEnableStateDone - Uni ports admin set to unlock based on device re-enable
mpagenkofc4f56e2020-11-04 17:17:49 +0000141 UniEnableStateDone
Holger Hildebrandtda15a092022-01-07 15:30:49 +0000142 // UniEnableStateFailed - Uni ports admin set to unlock failure based on device re-enable
143 UniEnableStateFailed
Himani Chawla6d2ae152020-09-02 13:11:20 +0530144 // PortLinkUp - Port link state change
mpagenkofc4f56e2020-11-04 17:17:49 +0000145 PortLinkUp
Himani Chawla6d2ae152020-09-02 13:11:20 +0530146 // PortLinkDw - Port link state change
mpagenkofc4f56e2020-11-04 17:17:49 +0000147 PortLinkDw
Himani Chawla6d2ae152020-09-02 13:11:20 +0530148 // OmciAniConfigDone - AniSide config according to TechProfile done
mpagenkofc4f56e2020-11-04 17:17:49 +0000149 OmciAniConfigDone
150 // OmciAniResourceRemoved - AniSide TechProfile related resource (Gem/TCont) removed
151 OmciAniResourceRemoved // needs to be the successor of OmciAniConfigDone!
mpagenkof1fc3862021-02-16 10:09:52 +0000152 // OmciVlanFilterAddDone - Omci Vlan config done according to flow-add with request to write kvStore
mpagenkofc4f56e2020-11-04 17:17:49 +0000153 OmciVlanFilterAddDone
mpagenkof1fc3862021-02-16 10:09:52 +0000154 // OmciVlanFilterAddDoneNoKvStore - Omci Vlan config done according to flow-add without writing kvStore
155 OmciVlanFilterAddDoneNoKvStore // needs to be the successor of OmciVlanFilterAddDone!
156 // OmciVlanFilterRemDone - Omci Vlan config done according to flow-remove with request to write kvStore
157 OmciVlanFilterRemDone // needs to be the successor of OmciVlanFilterAddDoneNoKvStore!
158 // OmciVlanFilterRemDoneNoKvStore - Omci Vlan config done according to flow-remove without writing kvStore
159 OmciVlanFilterRemDoneNoKvStore // needs to be the successor of OmciVlanFilterRemDone!
mpagenko80622a52021-02-09 16:53:23 +0000160 // OmciOnuSwUpgradeDone - SoftwareUpgrade to ONU finished
161 OmciOnuSwUpgradeDone
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000162 // Add other events here as needed (alarms separate???)
163)
164
mpagenko7d6bb022021-03-11 15:07:55 +0000165//AdapterFsm related error string
166//error string could be checked on waitforOmciResponse() e.g. to avoid misleading error log
167// but not used that way so far (permit error log even for wanted cancellation)
168const cErrWaitAborted = "waitResponse aborted"
169
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000170type activityDescr struct {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000171 databaseClass func(context.Context) error
Himani Chawla4d908332020-08-31 12:30:20 +0530172 //advertiseEvents bool
Holger Hildebrandte3677f12021-02-05 14:50:56 +0000173 auditInterval time.Duration
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000174 //tasks map[string]func() error
175}
Himani Chawla6d2ae152020-09-02 13:11:20 +0530176
177// OmciDeviceFsms - FSM event mapping to database class and time to wait between audits
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000178type OmciDeviceFsms map[string]activityDescr
179
Himani Chawla6d2ae152020-09-02 13:11:20 +0530180// AdapterFsm - Adapter FSM details including channel, event and device
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000181type AdapterFsm struct {
182 fsmName string
183 deviceID string
184 commChan chan Message
185 pFsm *fsm.FSM
186}
187
Himani Chawla6d2ae152020-09-02 13:11:20 +0530188//NewAdapterFsm - FSM details including event, device and channel.
189func NewAdapterFsm(aName string, aDeviceID string, aCommChannel chan Message) *AdapterFsm {
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000190 aFsm := &AdapterFsm{
Himani Chawla6d2ae152020-09-02 13:11:20 +0530191 fsmName: aName,
192 deviceID: aDeviceID,
193 commChan: aCommChannel,
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000194 }
195 return aFsm
196}
197
198//Start starts (logs) the omci agent
dbainbri4d3a0dc2020-12-02 00:33:42 +0000199func (oo *AdapterFsm) logFsmStateChange(ctx context.Context, e *fsm.Event) {
200 logger.Debugw(ctx, "FSM state change", log.Fields{"device-id": oo.deviceID, "FSM name": oo.fsmName,
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000201 "event name": string(e.Event), "src state": string(e.Src), "dst state": string(e.Dst)})
202}
203
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000204//OntDeviceEntry structure holds information about the attached FSM'as and their communication
Holger Hildebrandtc54939a2020-06-17 08:14:27 +0000205
206const (
Himani Chawla6d2ae152020-09-02 13:11:20 +0530207 firstSwImageMeID = 0
208 secondSwImageMeID = 1
Holger Hildebrandtc54939a2020-06-17 08:14:27 +0000209)
mpagenko15ff4a52021-03-02 10:09:20 +0000210const ( //definitions as per G.988 softwareImage::IsCommitted
211 swIsUncommitted = 0
212 swIsCommitted = 1
213)
214const ( //definitions as per G.988 softwareImage::IsActive
mpagenko9c225032021-10-15 14:26:49 +0000215 swIsInactive = 0
216 swIsActive = 1
mpagenko15ff4a52021-03-02 10:09:20 +0000217)
Holger Hildebrandtfb402a62021-05-26 14:40:49 +0000218const ( //definitions as per G.988 softwareImage::IsValid
219 //swIsInvalid = 0 not yet used
220 swIsValid = 1
221)
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +0000222const onuDataMeID = 0
Himani Chawla6d2ae152020-09-02 13:11:20 +0530223const onugMeID = 0
224const onu2gMeID = 0
225const ipHostConfigDataMeID = 1
226const onugSerialNumberLen = 8
227const omciMacAddressLen = 6
Holger Hildebrandtc54939a2020-06-17 08:14:27 +0000228
Holger Hildebrandt2fb70892020-10-28 11:53:18 +0000229const cEmptyMacAddrString = "000000000000"
230const cEmptySerialNumberString = "0000000000000000"
231
mpagenko15ff4a52021-03-02 10:09:20 +0000232type sEntrySwImageIndication struct {
233 valid bool
234 entityID uint16
235 version string
236 isCommitted uint8
237}
238type sSwImageIndications struct {
239 activeEntityEntry sEntrySwImageIndication
240 inactiveEntityEntry sEntrySwImageIndication
Holger Hildebrandtc54939a2020-06-17 08:14:27 +0000241}
242
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000243type uniPersConfig struct {
244 PersUniID uint8 `json:"uni_id"`
Girish Gowdra041dcb32020-11-16 16:54:30 -0800245 PersTpPathMap map[uint8]string `json:"PersTpPathMap"` // tp-id to tp-path map
246 PersFlowParams []uniVlanFlowParams `json:"flow_params"` //as defined in omci_ani_config.go
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000247}
248
249type onuPersistentData struct {
Mahir Gunyel7f4483a2021-05-06 12:53:43 -0700250 PersOnuID uint32 `json:"onu_id"`
251 PersIntfID uint32 `json:"intf_id"`
252 PersSerialNumber string `json:"serial_number"`
253 PersMacAddress string `json:"mac_address"`
254 PersVendorID string `json:"vendor_id"`
255 PersEquipmentID string `json:"equipment_id"`
256 PersActiveSwVersion string `json:"active_sw_version"`
257 PersAdminState string `json:"admin_state"`
258 PersOperState string `json:"oper_state"`
259 PersUniUnlockDone bool `json:"uni_unlock_done"`
260 PersUniDisableDone bool `json:"uni_disable_done"`
261 PersMibAuditInterval time.Duration `json:"mib_audit_interval"`
262 PersMibLastDbSync uint32 `json:"mib_last_db_sync"`
263 PersMibDataSyncAdpt uint8 `json:"mib_data_sync_adpt"`
264 PersUniConfig []uniPersConfig `json:"uni_config"`
265 PersAlarmAuditInterval time.Duration `json:"alarm_audit_interval"`
266 PersTcontMap map[uint16]uint16 `json:"tcont_map"` //alloc-id to me-instance-id map
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000267}
268
Himani Chawla6d2ae152020-09-02 13:11:20 +0530269// OnuDeviceEntry - ONU device info and FSM events.
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000270type OnuDeviceEntry struct {
Holger Hildebrandt05011352021-06-15 09:40:24 +0000271 deviceID string
272 baseDeviceHandler *deviceHandler
273 pOpenOnuAc *OpenONUAC
274 coreProxy adapterif.CoreProxy
275 adapterProxy adapterif.AdapterProxy
276 PDevOmciCC *omciCC
277 pOnuDB *onuDeviceDB
278 mibTemplateKVStore *db.Backend
279 mutexPersOnuConfig sync.RWMutex
280 sOnuPersistentData onuPersistentData
Holger Hildebrandt779e8d62022-02-08 15:35:01 +0000281 reconcilingFlows bool
282 mutexReconcilingFlowsFlag sync.RWMutex
283 chReconcilingFlowsFinished chan bool //channel to indicate that reconciling of flows has been finished
Holger Hildebrandt05011352021-06-15 09:40:24 +0000284 mibTemplatePath string
285 mutexOnuKVStore sync.RWMutex
286 onuKVStore *db.Backend
287 onuKVStorePath string
288 mutexOnuKVStoreProcResult sync.RWMutex
289 onuKVStoreProcResult error //error indication of processing
290 chOnuKvProcessingStep chan uint8
291 mutexOnuSwImageIndications sync.RWMutex
292 onuSwImageIndications sSwImageIndications
293 mutexOnuImageStatus sync.RWMutex
294 pOnuImageStatus *OnuImageStatus
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000295 //lockDeviceEntries sync.RWMutex
dbainbri4d3a0dc2020-12-02 00:33:42 +0000296 mibDbClass func(context.Context) error
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000297 supportedFsms OmciDeviceFsms
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000298 devState OnuDeviceEvent
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +0000299 // Audit and MDS
Himani Chawla075f1642021-03-15 19:23:24 +0530300 mibAuditInterval time.Duration
301 alarmAuditInterval time.Duration
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000302 // TODO: periodical mib resync will be implemented with story VOL-3792
303 //mibNextDbResync uint32
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000304
305 // for mibUpload
Girish Gowdraef7b4ad2022-02-09 10:43:15 -0800306 pMibUploadFsm *AdapterFsm //could be handled dynamically and more general as pAdapterFsm - perhaps later
307 mutexLastTxParamStruct sync.RWMutex
308 lastTxParamStruct sLastTxMeParameter
309 mibSyncMsgProcessorRunning bool
310 mutexMibSyncMsgProcessorRunning sync.RWMutex
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000311 // for mibDownload
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000312 pMibDownloadFsm *AdapterFsm //could be handled dynamically and more general as pAdapterFsm - perhaps later
313 //remark: general usage of pAdapterFsm would require generalization of commChan usage and internal event setting
314 // within the FSM event procedures
ozgecanetsiae11479f2020-07-06 09:44:47 +0300315 omciMessageReceived chan bool //seperate channel needed by DownloadFsm
316 omciRebootMessageReceivedChannel chan Message // channel needed by Reboot request
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000317}
318
Himani Chawla6d2ae152020-09-02 13:11:20 +0530319//newOnuDeviceEntry returns a new instance of a OnuDeviceEntry
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000320//mib_db (as well as not inluded alarm_db not really used in this code? VERIFY!!)
Holger Hildebrandt61b24d02020-11-16 13:36:40 +0000321func newOnuDeviceEntry(ctx context.Context, dh *deviceHandler) *OnuDeviceEntry {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000322 logger.Debugw(ctx, "init-onuDeviceEntry", log.Fields{"device-id": dh.deviceID})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000323 var onuDeviceEntry OnuDeviceEntry
Holger Hildebrandt61b24d02020-11-16 13:36:40 +0000324 onuDeviceEntry.deviceID = dh.deviceID
325 onuDeviceEntry.baseDeviceHandler = dh
326 onuDeviceEntry.pOpenOnuAc = dh.pOpenOnuAc
327 onuDeviceEntry.coreProxy = dh.coreProxy
328 onuDeviceEntry.adapterProxy = dh.AdapterProxy
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000329 onuDeviceEntry.devState = DeviceStatusInit
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000330 onuDeviceEntry.sOnuPersistentData.PersUniConfig = make([]uniPersConfig, 0)
Mahir Gunyel7f4483a2021-05-06 12:53:43 -0700331 onuDeviceEntry.sOnuPersistentData.PersTcontMap = make(map[uint16]uint16)
Holger Hildebrandt779e8d62022-02-08 15:35:01 +0000332 onuDeviceEntry.chReconcilingFlowsFinished = make(chan bool)
333 onuDeviceEntry.reconcilingFlows = false
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000334 onuDeviceEntry.chOnuKvProcessingStep = make(chan uint8)
ozgecanetsiae11479f2020-07-06 09:44:47 +0300335 onuDeviceEntry.omciRebootMessageReceivedChannel = make(chan Message, 2048)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000336 //openomciagent.lockDeviceHandlersMap = sync.RWMutex{}
337 //OMCI related databases are on a per-agent basis. State machines and tasks
338 //are per ONU Vendor
339 //
340 // MIB Synchronization Database - possible overloading from arguments
Holger Hildebrandt61b24d02020-11-16 13:36:40 +0000341 if dh.pOpenOnuAc.pSupportedFsms != nil {
342 onuDeviceEntry.supportedFsms = *dh.pOpenOnuAc.pSupportedFsms
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000343 } else {
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000344 // This branch is currently not used and is for potential future usage of alternative MIB Sync FSMs only!
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000345 //var mibSyncFsm = NewMibSynchronizer()
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000346 // use some internal defaults, if not defined from outside
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000347 onuDeviceEntry.supportedFsms = OmciDeviceFsms{
348 "mib-synchronizer": {
349 //mibSyncFsm, // Implements the MIB synchronization state machine
Himani Chawla6d2ae152020-09-02 13:11:20 +0530350 onuDeviceEntry.mibDbVolatileDict, // Implements volatile ME MIB database
Himani Chawla4d908332020-08-31 12:30:20 +0530351 //true, // Advertise events on OpenOMCI event bus
Holger Hildebrandte3677f12021-02-05 14:50:56 +0000352 dh.pOpenOnuAc.mibAuditInterval, // Time to wait between MIB audits. 0 to disable audits.
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000353 // map[string]func() error{
354 // "mib-upload": onuDeviceEntry.MibUploadTask,
355 // "mib-template": onuDeviceEntry.MibTemplateTask,
356 // "get-mds": onuDeviceEntry.GetMdsTask,
357 // "mib-audit": onuDeviceEntry.GetMdsTask,
358 // "mib-resync": onuDeviceEntry.MibResyncTask,
359 // "mib-reconcile": onuDeviceEntry.MibReconcileTask,
360 // },
361 },
362 }
363 }
364 onuDeviceEntry.mibDbClass = onuDeviceEntry.supportedFsms["mib-synchronizer"].databaseClass
dbainbri4d3a0dc2020-12-02 00:33:42 +0000365 logger.Debug(ctx, "access2mibDbClass")
366 go onuDeviceEntry.mibDbClass(ctx)
Holger Hildebrandtf37b3d72021-02-17 10:25:22 +0000367 if !dh.isReconciling() {
Holger Hildebrandte3677f12021-02-05 14:50:56 +0000368 onuDeviceEntry.mibAuditInterval = onuDeviceEntry.supportedFsms["mib-synchronizer"].auditInterval
369 onuDeviceEntry.sOnuPersistentData.PersMibAuditInterval = onuDeviceEntry.mibAuditInterval
Himani Chawla075f1642021-03-15 19:23:24 +0530370 onuDeviceEntry.alarmAuditInterval = dh.pOpenOnuAc.alarmAuditInterval
371 onuDeviceEntry.sOnuPersistentData.PersAlarmAuditInterval = onuDeviceEntry.alarmAuditInterval
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000372 } else {
Holger Hildebrandte3677f12021-02-05 14:50:56 +0000373 logger.Debugw(ctx, "reconciling - take audit interval from persistent data", log.Fields{"device-id": dh.deviceID})
374 // TODO: This is a preparation for VOL-VOL-3811 to preserve config history in case of
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000375 // vendor- or deviceID-specific configurations via voltctl-commands
Holger Hildebrandte3677f12021-02-05 14:50:56 +0000376 onuDeviceEntry.mibAuditInterval = onuDeviceEntry.sOnuPersistentData.PersMibAuditInterval
Himani Chawla075f1642021-03-15 19:23:24 +0530377 onuDeviceEntry.alarmAuditInterval = onuDeviceEntry.sOnuPersistentData.PersAlarmAuditInterval
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000378 }
Himani Chawla075f1642021-03-15 19:23:24 +0530379 logger.Debugw(ctx, "MibAuditInterval and AlarmAuditInterval is set to", log.Fields{"mib-audit-interval": onuDeviceEntry.mibAuditInterval,
380 "alarm-audit-interval": onuDeviceEntry.alarmAuditInterval})
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000381 // TODO: periodical mib resync will be implemented with story VOL-3792
382 //onuDeviceEntry.mibNextDbResync = 0
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000383
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000384 // Omci related Mib upload sync state machine
385 mibUploadChan := make(chan Message, 2048)
Holger Hildebrandt61b24d02020-11-16 13:36:40 +0000386 onuDeviceEntry.pMibUploadFsm = NewAdapterFsm("MibUpload", dh.deviceID, mibUploadChan)
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000387 onuDeviceEntry.pMibUploadFsm.pFsm = fsm.NewFSM(
mpagenko1cc3cb42020-07-27 15:24:38 +0000388 ulStDisabled,
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000389 fsm.Events{
390
mpagenko1cc3cb42020-07-27 15:24:38 +0000391 {Name: ulEvStart, Src: []string{ulStDisabled}, Dst: ulStStarting},
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000392
mpagenko1cc3cb42020-07-27 15:24:38 +0000393 {Name: ulEvResetMib, Src: []string{ulStStarting}, Dst: ulStResettingMib},
394 {Name: ulEvGetVendorAndSerial, Src: []string{ulStResettingMib}, Dst: ulStGettingVendorAndSerial},
Himani Chawla4d908332020-08-31 12:30:20 +0530395 {Name: ulEvGetEquipmentID, Src: []string{ulStGettingVendorAndSerial}, Dst: ulStGettingEquipmentID},
396 {Name: ulEvGetFirstSwVersion, Src: []string{ulStGettingEquipmentID}, Dst: ulStGettingFirstSwVersion},
mpagenko1cc3cb42020-07-27 15:24:38 +0000397 {Name: ulEvGetSecondSwVersion, Src: []string{ulStGettingFirstSwVersion}, Dst: ulStGettingSecondSwVersion},
398 {Name: ulEvGetMacAddress, Src: []string{ulStGettingSecondSwVersion}, Dst: ulStGettingMacAddress},
399 {Name: ulEvGetMibTemplate, Src: []string{ulStGettingMacAddress}, Dst: ulStGettingMibTemplate},
Holger Hildebrandtc54939a2020-06-17 08:14:27 +0000400
mpagenko1cc3cb42020-07-27 15:24:38 +0000401 {Name: ulEvUploadMib, Src: []string{ulStGettingMibTemplate}, Dst: ulStUploading},
402 {Name: ulEvExamineMds, Src: []string{ulStStarting}, Dst: ulStExaminingMds},
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000403
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000404 {Name: ulEvSuccess, Src: []string{ulStGettingMibTemplate}, Dst: ulStUploadDone},
405 {Name: ulEvSuccess, Src: []string{ulStUploading}, Dst: ulStUploadDone},
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000406
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000407 {Name: ulEvSuccess, Src: []string{ulStUploadDone}, Dst: ulStInSync},
Holger Hildebrandtbe523842021-03-10 10:47:18 +0000408 //{Name: ulEvSuccess, Src: []string{ulStExaminingMds}, Dst: ulStInSync},
409 {Name: ulEvSuccess, Src: []string{ulStExaminingMds}, Dst: ulStExaminingMdsSuccess},
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +0000410 // TODO: As long as mib-resynchronizing is not implemented, failed MDS-examination triggers
411 // mib-reset and new provisioning at this point
412 //{Name: ulEvMismatch, Src: []string{ulStExaminingMds}, Dst: ulStResynchronizing},
413 {Name: ulEvMismatch, Src: []string{ulStExaminingMds}, Dst: ulStResettingMib},
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000414
Holger Hildebrandtbe523842021-03-10 10:47:18 +0000415 {Name: ulEvSuccess, Src: []string{ulStExaminingMdsSuccess}, Dst: ulStInSync},
416 {Name: ulEvMismatch, Src: []string{ulStExaminingMdsSuccess}, Dst: ulStResettingMib},
417
mpagenko1cc3cb42020-07-27 15:24:38 +0000418 {Name: ulEvAuditMib, Src: []string{ulStInSync}, Dst: ulStAuditing},
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000419
mpagenko1cc3cb42020-07-27 15:24:38 +0000420 {Name: ulEvSuccess, Src: []string{ulStOutOfSync}, Dst: ulStInSync},
421 {Name: ulEvAuditMib, Src: []string{ulStOutOfSync}, Dst: ulStAuditing},
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000422
mpagenko1cc3cb42020-07-27 15:24:38 +0000423 {Name: ulEvSuccess, Src: []string{ulStAuditing}, Dst: ulStInSync},
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000424 {Name: ulEvMismatch, Src: []string{ulStAuditing}, Dst: ulStReAuditing},
mpagenko1cc3cb42020-07-27 15:24:38 +0000425 {Name: ulEvForceResync, Src: []string{ulStAuditing}, Dst: ulStResynchronizing},
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000426
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000427 {Name: ulEvSuccess, Src: []string{ulStReAuditing}, Dst: ulStInSync},
428 {Name: ulEvMismatch, Src: []string{ulStReAuditing}, Dst: ulStResettingMib},
429
mpagenko1cc3cb42020-07-27 15:24:38 +0000430 {Name: ulEvSuccess, Src: []string{ulStResynchronizing}, Dst: ulStInSync},
431 {Name: ulEvDiffsFound, Src: []string{ulStResynchronizing}, Dst: ulStOutOfSync},
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000432
Himani Chawla4d908332020-08-31 12:30:20 +0530433 {Name: ulEvTimeout, Src: []string{ulStResettingMib, ulStGettingVendorAndSerial, ulStGettingEquipmentID, ulStGettingFirstSwVersion,
mpagenko1cc3cb42020-07-27 15:24:38 +0000434 ulStGettingSecondSwVersion, ulStGettingMacAddress, ulStGettingMibTemplate, ulStUploading, ulStResynchronizing, ulStExaminingMds,
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000435 ulStUploadDone, ulStInSync, ulStOutOfSync, ulStAuditing, ulStReAuditing}, Dst: ulStStarting},
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000436
Himani Chawla4d908332020-08-31 12:30:20 +0530437 {Name: ulEvStop, Src: []string{ulStStarting, ulStResettingMib, ulStGettingVendorAndSerial, ulStGettingEquipmentID, ulStGettingFirstSwVersion,
mpagenko1cc3cb42020-07-27 15:24:38 +0000438 ulStGettingSecondSwVersion, ulStGettingMacAddress, ulStGettingMibTemplate, ulStUploading, ulStResynchronizing, ulStExaminingMds,
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000439 ulStUploadDone, ulStInSync, ulStOutOfSync, ulStAuditing, ulStReAuditing}, Dst: ulStDisabled},
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000440 },
441
442 fsm.Callbacks{
dbainbri4d3a0dc2020-12-02 00:33:42 +0000443 "enter_state": func(e *fsm.Event) { onuDeviceEntry.pMibUploadFsm.logFsmStateChange(ctx, e) },
444 "enter_" + ulStStarting: func(e *fsm.Event) { onuDeviceEntry.enterStartingState(ctx, e) },
445 "enter_" + ulStResettingMib: func(e *fsm.Event) { onuDeviceEntry.enterResettingMibState(ctx, e) },
446 "enter_" + ulStGettingVendorAndSerial: func(e *fsm.Event) { onuDeviceEntry.enterGettingVendorAndSerialState(ctx, e) },
447 "enter_" + ulStGettingEquipmentID: func(e *fsm.Event) { onuDeviceEntry.enterGettingEquipmentIDState(ctx, e) },
448 "enter_" + ulStGettingFirstSwVersion: func(e *fsm.Event) { onuDeviceEntry.enterGettingFirstSwVersionState(ctx, e) },
449 "enter_" + ulStGettingSecondSwVersion: func(e *fsm.Event) { onuDeviceEntry.enterGettingSecondSwVersionState(ctx, e) },
450 "enter_" + ulStGettingMacAddress: func(e *fsm.Event) { onuDeviceEntry.enterGettingMacAddressState(ctx, e) },
Holger Hildebrandtbe523842021-03-10 10:47:18 +0000451 "enter_" + ulStGettingMibTemplate: func(e *fsm.Event) { onuDeviceEntry.enterGettingMibTemplateState(ctx, e) },
dbainbri4d3a0dc2020-12-02 00:33:42 +0000452 "enter_" + ulStUploading: func(e *fsm.Event) { onuDeviceEntry.enterUploadingState(ctx, e) },
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000453 "enter_" + ulStUploadDone: func(e *fsm.Event) { onuDeviceEntry.enterUploadDoneState(ctx, e) },
dbainbri4d3a0dc2020-12-02 00:33:42 +0000454 "enter_" + ulStExaminingMds: func(e *fsm.Event) { onuDeviceEntry.enterExaminingMdsState(ctx, e) },
455 "enter_" + ulStResynchronizing: func(e *fsm.Event) { onuDeviceEntry.enterResynchronizingState(ctx, e) },
Holger Hildebrandtbe523842021-03-10 10:47:18 +0000456 "enter_" + ulStExaminingMdsSuccess: func(e *fsm.Event) { onuDeviceEntry.enterExaminingMdsSuccessState(ctx, e) },
dbainbri4d3a0dc2020-12-02 00:33:42 +0000457 "enter_" + ulStAuditing: func(e *fsm.Event) { onuDeviceEntry.enterAuditingState(ctx, e) },
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000458 "enter_" + ulStReAuditing: func(e *fsm.Event) { onuDeviceEntry.enterReAuditingState(ctx, e) },
dbainbri4d3a0dc2020-12-02 00:33:42 +0000459 "enter_" + ulStOutOfSync: func(e *fsm.Event) { onuDeviceEntry.enterOutOfSyncState(ctx, e) },
460 "enter_" + ulStInSync: func(e *fsm.Event) { onuDeviceEntry.enterInSyncState(ctx, e) },
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000461 },
462 )
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000463 // Omci related Mib download state machine
464 mibDownloadChan := make(chan Message, 2048)
Holger Hildebrandt61b24d02020-11-16 13:36:40 +0000465 onuDeviceEntry.pMibDownloadFsm = NewAdapterFsm("MibDownload", dh.deviceID, mibDownloadChan)
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000466 onuDeviceEntry.pMibDownloadFsm.pFsm = fsm.NewFSM(
mpagenko1cc3cb42020-07-27 15:24:38 +0000467 dlStDisabled,
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000468 fsm.Events{
469
mpagenko1cc3cb42020-07-27 15:24:38 +0000470 {Name: dlEvStart, Src: []string{dlStDisabled}, Dst: dlStStarting},
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000471
mpagenko1cc3cb42020-07-27 15:24:38 +0000472 {Name: dlEvCreateGal, Src: []string{dlStStarting}, Dst: dlStCreatingGal},
473 {Name: dlEvRxGalResp, Src: []string{dlStCreatingGal}, Dst: dlStSettingOnu2g},
474 {Name: dlEvRxOnu2gResp, Src: []string{dlStSettingOnu2g}, Dst: dlStBridgeInit},
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000475 // the bridge state is used for multi ME config for alle UNI related ports
476 // maybe such could be reflected in the state machine as well (port number parametrized)
477 // but that looks not straightforward here - so we keep it simple here for the beginning(?)
mpagenko1cc3cb42020-07-27 15:24:38 +0000478 {Name: dlEvRxBridgeResp, Src: []string{dlStBridgeInit}, Dst: dlStDownloaded},
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000479
mpagenko1cc3cb42020-07-27 15:24:38 +0000480 {Name: dlEvTimeoutSimple, Src: []string{dlStCreatingGal, dlStSettingOnu2g}, Dst: dlStStarting},
481 {Name: dlEvTimeoutBridge, Src: []string{dlStBridgeInit}, Dst: dlStStarting},
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000482
mpagenko1cc3cb42020-07-27 15:24:38 +0000483 {Name: dlEvReset, Src: []string{dlStStarting, dlStCreatingGal, dlStSettingOnu2g,
484 dlStBridgeInit, dlStDownloaded}, Dst: dlStResetting},
485 // exceptional treatment for all states except dlStResetting
486 {Name: dlEvRestart, Src: []string{dlStStarting, dlStCreatingGal, dlStSettingOnu2g,
487 dlStBridgeInit, dlStDownloaded, dlStResetting}, Dst: dlStDisabled},
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000488 },
489
490 fsm.Callbacks{
dbainbri4d3a0dc2020-12-02 00:33:42 +0000491 "enter_state": func(e *fsm.Event) { onuDeviceEntry.pMibDownloadFsm.logFsmStateChange(ctx, e) },
492 "enter_" + dlStStarting: func(e *fsm.Event) { onuDeviceEntry.enterDLStartingState(ctx, e) },
493 "enter_" + dlStCreatingGal: func(e *fsm.Event) { onuDeviceEntry.enterCreatingGalState(ctx, e) },
494 "enter_" + dlStSettingOnu2g: func(e *fsm.Event) { onuDeviceEntry.enterSettingOnu2gState(ctx, e) },
495 "enter_" + dlStBridgeInit: func(e *fsm.Event) { onuDeviceEntry.enterBridgeInitState(ctx, e) },
496 "enter_" + dlStDownloaded: func(e *fsm.Event) { onuDeviceEntry.enterDownloadedState(ctx, e) },
497 "enter_" + dlStResetting: func(e *fsm.Event) { onuDeviceEntry.enterResettingState(ctx, e) },
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000498 },
499 )
500 if onuDeviceEntry.pMibDownloadFsm == nil || onuDeviceEntry.pMibDownloadFsm.pFsm == nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000501 logger.Errorw(ctx, "MibDownloadFsm could not be instantiated", log.Fields{"device-id": dh.deviceID})
mpagenko15ff4a52021-03-02 10:09:20 +0000502 // TODO some specific error treatment - or waiting for crash ?
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000503 }
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000504
dbainbri4d3a0dc2020-12-02 00:33:42 +0000505 onuDeviceEntry.mibTemplateKVStore = onuDeviceEntry.baseDeviceHandler.setBackend(ctx, cBasePathMibTemplateKvStore)
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000506 if onuDeviceEntry.mibTemplateKVStore == nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000507 logger.Errorw(ctx, "Can't access mibTemplateKVStore - no backend connection to service",
Holger Hildebrandt61b24d02020-11-16 13:36:40 +0000508 log.Fields{"device-id": dh.deviceID, "service": cBasePathMibTemplateKvStore})
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000509 }
510
511 onuDeviceEntry.onuKVStorePath = onuDeviceEntry.deviceID
Matteo Scandolof1f39a72020-11-24 12:08:11 -0800512 baseKvStorePath := fmt.Sprintf(cBasePathOnuKVStore, dh.pOpenOnuAc.cm.Backend.PathPrefix)
dbainbri4d3a0dc2020-12-02 00:33:42 +0000513 onuDeviceEntry.onuKVStore = onuDeviceEntry.baseDeviceHandler.setBackend(ctx, baseKvStorePath)
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000514 if onuDeviceEntry.onuKVStore == nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000515 logger.Errorw(ctx, "Can't access onuKVStore - no backend connection to service",
Matteo Scandolof1f39a72020-11-24 12:08:11 -0800516 log.Fields{"device-id": dh.deviceID, "service": baseKvStorePath})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000517 }
518
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000519 // Alarm Synchronization Database
Himani Chawlaac1f5ad2021-02-04 21:21:54 +0530520
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000521 //self._alarm_db = None
522 //self._alarm_database_cls = support_classes['alarm-synchronizer']['database']
523 return &onuDeviceEntry
524}
525
Himani Chawla6d2ae152020-09-02 13:11:20 +0530526//start starts (logs) the omci agent
527func (oo *OnuDeviceEntry) start(ctx context.Context) error {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000528 logger.Debugw(ctx, "OnuDeviceEntry-starting", log.Fields{"for device-id": oo.deviceID})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000529 if oo.PDevOmciCC == nil {
mpagenko900ee4b2020-10-12 11:56:34 +0000530 oo.PDevOmciCC = newOmciCC(ctx, oo, oo.deviceID, oo.baseDeviceHandler,
531 oo.coreProxy, oo.adapterProxy)
532 if oo.PDevOmciCC == nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000533 logger.Errorw(ctx, "Could not create devOmciCc - abort", log.Fields{"for device-id": oo.deviceID})
mpagenko900ee4b2020-10-12 11:56:34 +0000534 return fmt.Errorf("could not create devOmciCc %s", oo.deviceID)
535 }
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000536 }
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000537 return nil
538}
539
mpagenko900ee4b2020-10-12 11:56:34 +0000540//stop stops/resets the omciCC
541func (oo *OnuDeviceEntry) stop(ctx context.Context, abResetOmciCC bool) error {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000542 logger.Debugw(ctx, "OnuDeviceEntry-stopping", log.Fields{"for device-id": oo.deviceID})
mpagenko900ee4b2020-10-12 11:56:34 +0000543 if abResetOmciCC && (oo.PDevOmciCC != nil) {
544 _ = oo.PDevOmciCC.stop(ctx)
545 }
546 //to allow for all event notifications again when re-using the device and omciCC
547 oo.devState = DeviceStatusInit
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000548 return nil
549}
550
Himani Chawla6d2ae152020-09-02 13:11:20 +0530551func (oo *OnuDeviceEntry) reboot(ctx context.Context) error {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000552 logger.Debugw(ctx, "OnuDeviceEntry-rebooting", log.Fields{"for device-id": oo.deviceID})
mpagenko900ee4b2020-10-12 11:56:34 +0000553 if oo.PDevOmciCC != nil {
Girish Gowdra0b235842021-03-09 13:06:46 -0800554 if err := oo.PDevOmciCC.sendReboot(ctx, oo.pOpenOnuAc.omciTimeout, true, oo.omciRebootMessageReceivedChannel); err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000555 logger.Errorw(ctx, "onu didn't reboot", log.Fields{"for device-id": oo.deviceID})
mpagenko900ee4b2020-10-12 11:56:34 +0000556 return err
557 }
ozgecanetsiae11479f2020-07-06 09:44:47 +0300558 }
ozgecanetsiae11479f2020-07-06 09:44:47 +0300559 return nil
560}
561
dbainbri4d3a0dc2020-12-02 00:33:42 +0000562func (oo *OnuDeviceEntry) waitForRebootResponse(ctx context.Context, responseChannel chan Message) error {
ozgecanetsiae11479f2020-07-06 09:44:47 +0300563 select {
Holger Hildebrandt366ef192021-05-05 11:07:44 +0000564 case <-time.After(oo.PDevOmciCC.GetMaxOmciTimeoutWithRetries() * time.Second): //3s was detected to be to less in 8*8 bbsim test with debug Info/Debug
dbainbri4d3a0dc2020-12-02 00:33:42 +0000565 logger.Warnw(ctx, "Reboot timeout", log.Fields{"for device-id": oo.deviceID})
Andrea Campanella6515c582020-10-05 11:25:00 +0200566 return fmt.Errorf("rebootTimeout")
ozgecanetsiae11479f2020-07-06 09:44:47 +0300567 case data := <-responseChannel:
568 switch data.Data.(OmciMessage).OmciMsg.MessageType {
569 case omci.RebootResponseType:
570 {
571 msgLayer := (*data.Data.(OmciMessage).OmciPacket).Layer(omci.LayerTypeRebootResponse)
572 if msgLayer == nil {
Andrea Campanella6515c582020-10-05 11:25:00 +0200573 return fmt.Errorf("omci Msg layer could not be detected for RebootResponseType")
ozgecanetsiae11479f2020-07-06 09:44:47 +0300574 }
Andrea Campanellabef4e542020-10-22 11:01:28 +0200575 msgObj, msgOk := msgLayer.(*omci.RebootResponse)
ozgecanetsiae11479f2020-07-06 09:44:47 +0300576 if !msgOk {
Andrea Campanella6515c582020-10-05 11:25:00 +0200577 return fmt.Errorf("omci Msg layer could not be assigned for RebootResponseType %s", oo.deviceID)
ozgecanetsiae11479f2020-07-06 09:44:47 +0300578 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000579 logger.Debugw(ctx, "RebootResponse data", log.Fields{"device-id": oo.deviceID, "data-fields": msgObj})
ozgecanetsiae11479f2020-07-06 09:44:47 +0300580 if msgObj.Result != me.Success {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000581 logger.Errorw(ctx, "Omci RebootResponse result error", log.Fields{"device-id": oo.deviceID, "Error": msgObj.Result})
ozgecanetsiae11479f2020-07-06 09:44:47 +0300582 // possibly force FSM into abort or ignore some errors for some messages? store error for mgmt display?
Andrea Campanellabef4e542020-10-22 11:01:28 +0200583 return fmt.Errorf("omci RebootResponse result error indication %s for device %s",
Andrea Campanella6515c582020-10-05 11:25:00 +0200584 msgObj.Result, oo.deviceID)
ozgecanetsiae11479f2020-07-06 09:44:47 +0300585 }
586 return nil
587 }
588 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000589 logger.Warnw(ctx, "Reboot response message type error", log.Fields{"for device-id": oo.deviceID})
Andrea Campanella6515c582020-10-05 11:25:00 +0200590 return fmt.Errorf("unexpected OmciResponse type received %s", oo.deviceID)
ozgecanetsiae11479f2020-07-06 09:44:47 +0300591 }
592}
593
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000594//Relay the InSync message via Handler to Rw core - Status update
dbainbri4d3a0dc2020-12-02 00:33:42 +0000595func (oo *OnuDeviceEntry) transferSystemEvent(ctx context.Context, devEvent OnuDeviceEvent) {
596 logger.Debugw(ctx, "relaying system-event", log.Fields{"Event": devEvent})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000597 // decouple the handler transfer from further processing here
598 // TODO!!! check if really no synch is required within the system e.g. to ensure following steps ..
Himani Chawla26e555c2020-08-31 12:30:20 +0530599 if devEvent == MibDatabaseSync {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000600 if oo.devState < MibDatabaseSync { //devState has not been synced yet
601 oo.devState = MibDatabaseSync
dbainbri4d3a0dc2020-12-02 00:33:42 +0000602 go oo.baseDeviceHandler.deviceProcStatusUpdate(ctx, devEvent)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000603 //TODO!!! device control: next step: start MIB capability verification from here ?!!!
604 } else {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000605 logger.Debugw(ctx, "mibinsync-event in some already synced state - ignored", log.Fields{"state": oo.devState})
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000606 }
Himani Chawla26e555c2020-08-31 12:30:20 +0530607 } else if devEvent == MibDownloadDone {
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000608 if oo.devState < MibDownloadDone { //devState has not been synced yet
609 oo.devState = MibDownloadDone
dbainbri4d3a0dc2020-12-02 00:33:42 +0000610 go oo.baseDeviceHandler.deviceProcStatusUpdate(ctx, devEvent)
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000611 } else {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000612 logger.Debugw(ctx, "mibdownloaddone-event was already seen - ignored", log.Fields{"state": oo.devState})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000613 }
614 } else {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000615 logger.Warnw(ctx, "device-event not yet handled", log.Fields{"state": devEvent})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000616 }
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000617}
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000618
619func (oo *OnuDeviceEntry) restoreDataFromOnuKvStore(ctx context.Context) error {
620 if oo.onuKVStore == nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000621 logger.Debugw(ctx, "onuKVStore not set - abort", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000622 return fmt.Errorf(fmt.Sprintf("onuKVStore-not-set-abort-%s", oo.deviceID))
623 }
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000624 oo.mutexPersOnuConfig.Lock()
625 defer oo.mutexPersOnuConfig.Unlock()
Holger Hildebrandtbe523842021-03-10 10:47:18 +0000626 oo.sOnuPersistentData =
Mahir Gunyel7f4483a2021-05-06 12:53:43 -0700627 onuPersistentData{0, 0, "", "", "", "", "", "", "", false, false, oo.mibAuditInterval, 0, 0, make([]uniPersConfig, 0), oo.alarmAuditInterval, make(map[uint16]uint16)}
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000628 oo.mutexOnuKVStore.RLock()
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000629 Value, err := oo.onuKVStore.Get(ctx, oo.onuKVStorePath)
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000630 oo.mutexOnuKVStore.RUnlock()
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000631 if err == nil {
632 if Value != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000633 logger.Debugw(ctx, "ONU-data read",
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000634 log.Fields{"Key": Value.Key, "device-id": oo.deviceID})
635 tmpBytes, _ := kvstore.ToByte(Value.Value)
636
637 if err = json.Unmarshal(tmpBytes, &oo.sOnuPersistentData); err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000638 logger.Errorw(ctx, "unable to unmarshal ONU-data", log.Fields{"error": err, "device-id": oo.deviceID})
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000639 return fmt.Errorf(fmt.Sprintf("unable-to-unmarshal-ONU-data-%s", oo.deviceID))
640 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000641 logger.Debugw(ctx, "ONU-data", log.Fields{"sOnuPersistentData": oo.sOnuPersistentData,
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000642 "device-id": oo.deviceID})
643 } else {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000644 logger.Debugw(ctx, "no ONU-data found", log.Fields{"path": oo.onuKVStorePath, "device-id": oo.deviceID})
mpagenko2418ab02020-11-12 12:58:06 +0000645 return fmt.Errorf("no-ONU-data-found")
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000646 }
647 } else {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000648 logger.Errorw(ctx, "unable to read from KVstore", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000649 return fmt.Errorf(fmt.Sprintf("unable-to-read-from-KVstore-%s", oo.deviceID))
650 }
651 return nil
652}
653
654func (oo *OnuDeviceEntry) deleteDataFromOnuKvStore(ctx context.Context, wg *sync.WaitGroup) {
655 defer wg.Done()
656
657 if oo.onuKVStore == nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000658 logger.Debugw(ctx, "onuKVStore not set - abort", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000659 oo.setKvProcessingErrorIndication(errors.New("onu-data delete aborted: onuKVStore not set"))
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000660 return
661 }
662 var processingStep uint8 = 1 // used to synchronize the different processing steps with chOnuKvProcessingStep
663 go oo.deletePersistentData(ctx, processingStep)
664 if !oo.waitForTimeoutOrCompletion(ctx, oo.chOnuKvProcessingStep, processingStep) {
665 //timeout or error detected
dbainbri4d3a0dc2020-12-02 00:33:42 +0000666 logger.Debugw(ctx, "ONU-data not deleted - abort", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000667 oo.setKvProcessingErrorIndication(errors.New("onu-data delete aborted: during kv-access"))
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000668 return
669 }
670}
671
672func (oo *OnuDeviceEntry) deletePersistentData(ctx context.Context, aProcessingStep uint8) {
673
dbainbri4d3a0dc2020-12-02 00:33:42 +0000674 logger.Debugw(ctx, "delete and clear internal persistency data", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandtdaf0f722021-02-12 11:50:30 +0000675
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000676 oo.mutexPersOnuConfig.Lock()
677 defer oo.mutexPersOnuConfig.Unlock()
Holger Hildebrandtdaf0f722021-02-12 11:50:30 +0000678
Holger Hildebrandtbe523842021-03-10 10:47:18 +0000679 oo.sOnuPersistentData.PersUniConfig = nil //releasing all UniConfig entries to garbage collector default entry
680 oo.sOnuPersistentData =
Mahir Gunyel7f4483a2021-05-06 12:53:43 -0700681 onuPersistentData{0, 0, "", "", "", "", "", "", "", false, false, oo.mibAuditInterval, 0, 0, make([]uniPersConfig, 0), oo.alarmAuditInterval, make(map[uint16]uint16)}
dbainbri4d3a0dc2020-12-02 00:33:42 +0000682 logger.Debugw(ctx, "delete ONU-data from KVStore", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000683 oo.mutexOnuKVStore.Lock()
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000684 err := oo.onuKVStore.Delete(ctx, oo.onuKVStorePath)
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000685 oo.mutexOnuKVStore.Unlock()
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000686 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000687 logger.Errorw(ctx, "unable to delete in KVstore", log.Fields{"device-id": oo.deviceID, "err": err})
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000688 oo.chOnuKvProcessingStep <- 0 //error indication
689 return
690 }
691 oo.chOnuKvProcessingStep <- aProcessingStep //done
692}
693
694func (oo *OnuDeviceEntry) updateOnuKvStore(ctx context.Context, wg *sync.WaitGroup) {
695 defer wg.Done()
696
697 if oo.onuKVStore == nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000698 logger.Debugw(ctx, "onuKVStore not set - abort", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000699 oo.setKvProcessingErrorIndication(errors.New("onu-data update aborted: onuKVStore not set"))
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000700 return
701 }
702 var processingStep uint8 = 1 // used to synchronize the different processing steps with chOnuKvProcessingStep
703 go oo.storeDataInOnuKvStore(ctx, processingStep)
704 if !oo.waitForTimeoutOrCompletion(ctx, oo.chOnuKvProcessingStep, processingStep) {
705 //timeout or error detected
dbainbri4d3a0dc2020-12-02 00:33:42 +0000706 logger.Debugw(ctx, "ONU-data not written - abort", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000707 oo.setKvProcessingErrorIndication(errors.New("onu-data update aborted: during writing process"))
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000708 return
709 }
710}
711
712func (oo *OnuDeviceEntry) storeDataInOnuKvStore(ctx context.Context, aProcessingStep uint8) {
713
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000714 oo.mutexPersOnuConfig.Lock()
715 defer oo.mutexPersOnuConfig.Unlock()
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000716 //assign values which are not already present when newOnuDeviceEntry() is called
717 oo.sOnuPersistentData.PersOnuID = oo.baseDeviceHandler.pOnuIndication.OnuId
718 oo.sOnuPersistentData.PersIntfID = oo.baseDeviceHandler.pOnuIndication.IntfId
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000719 //TODO: verify usage of these values during restart UC
Holger Hildebrandt3a644642020-12-02 09:46:18 +0000720 oo.sOnuPersistentData.PersAdminState = oo.baseDeviceHandler.pOnuIndication.AdminState
721 oo.sOnuPersistentData.PersOperState = oo.baseDeviceHandler.pOnuIndication.OperState
Holger Hildebrandtdaf0f722021-02-12 11:50:30 +0000722
dbainbri4d3a0dc2020-12-02 00:33:42 +0000723 logger.Debugw(ctx, "Update ONU-data in KVStore", log.Fields{"device-id": oo.deviceID, "sOnuPersistentData": oo.sOnuPersistentData})
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000724
725 Value, err := json.Marshal(oo.sOnuPersistentData)
726 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000727 logger.Errorw(ctx, "unable to marshal ONU-data", log.Fields{"sOnuPersistentData": oo.sOnuPersistentData,
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000728 "device-id": oo.deviceID, "err": err})
729 oo.chOnuKvProcessingStep <- 0 //error indication
730 return
731 }
Holger Hildebrandtff05b682021-03-16 15:02:05 +0000732 oo.pOpenOnuAc.lockDeviceHandlersMap.RLock()
733 if _, exist := oo.pOpenOnuAc.deviceHandlers[oo.deviceID]; !exist {
734 logger.Debugw(ctx, "delete_device in progress - skip write request", log.Fields{"device-id": oo.deviceID})
735 oo.chOnuKvProcessingStep <- aProcessingStep
736 oo.pOpenOnuAc.lockDeviceHandlersMap.RUnlock()
737 return
738 }
739 oo.baseDeviceHandler.mutexDeletionInProgressFlag.RLock()
740 if oo.baseDeviceHandler.deletionInProgress {
741 logger.Debugw(ctx, "delete_device in progress - skip write request", log.Fields{"device-id": oo.deviceID})
742 oo.chOnuKvProcessingStep <- aProcessingStep
743 oo.pOpenOnuAc.lockDeviceHandlersMap.RUnlock()
744 oo.baseDeviceHandler.mutexDeletionInProgressFlag.RUnlock()
745 return
746 }
747 oo.pOpenOnuAc.lockDeviceHandlersMap.RUnlock()
748 oo.baseDeviceHandler.mutexDeletionInProgressFlag.RUnlock()
749
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000750 oo.mutexOnuKVStore.Lock()
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000751 err = oo.onuKVStore.Put(ctx, oo.onuKVStorePath, Value)
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000752 oo.mutexOnuKVStore.Unlock()
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000753 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000754 logger.Errorw(ctx, "unable to write ONU-data into KVstore", log.Fields{"device-id": oo.deviceID, "err": err})
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000755 oo.chOnuKvProcessingStep <- 0 //error indication
756 return
757 }
758 oo.chOnuKvProcessingStep <- aProcessingStep //done
759}
760
dbainbri4d3a0dc2020-12-02 00:33:42 +0000761func (oo *OnuDeviceEntry) updateOnuUniTpPath(ctx context.Context, aUniID uint8, aTpID uint8, aPathString string) bool {
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000762 /* within some specific InterAdapter processing request write/read access to data is ensured to be sequentially,
763 as also the complete sequence is ensured to 'run to completion' before some new request is accepted
764 no specific concurrency protection to sOnuPersistentData is required here
765 */
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000766 oo.mutexPersOnuConfig.Lock()
767 defer oo.mutexPersOnuConfig.Unlock()
Holger Hildebrandtdaf0f722021-02-12 11:50:30 +0000768
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000769 for k, v := range oo.sOnuPersistentData.PersUniConfig {
770 if v.PersUniID == aUniID {
Girish Gowdra041dcb32020-11-16 16:54:30 -0800771 existingPath, ok := oo.sOnuPersistentData.PersUniConfig[k].PersTpPathMap[aTpID]
Mahir Gunyel7f4483a2021-05-06 12:53:43 -0700772 logger.Debugw(ctx, "PersUniConfig-entry exists", log.Fields{"device-id": oo.deviceID, "uniID": aUniID,
773 "tpID": aTpID, "path": aPathString, "existingPath": existingPath, "ok": ok})
Girish Gowdra041dcb32020-11-16 16:54:30 -0800774 if !ok {
mpagenko30f28442021-03-24 09:24:04 +0000775 logger.Debugw(ctx, "tp-does-not-exist", log.Fields{"device-id": oo.deviceID, "uniID": aUniID, "tpID": aTpID, "path": aPathString})
Girish Gowdra041dcb32020-11-16 16:54:30 -0800776 }
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000777 if existingPath != aPathString {
778 if aPathString == "" {
779 //existing entry to be deleted
dbainbri4d3a0dc2020-12-02 00:33:42 +0000780 logger.Debugw(ctx, "UniTp delete path value", log.Fields{"device-id": oo.deviceID, "uniID": aUniID, "path": aPathString})
Girish Gowdra041dcb32020-11-16 16:54:30 -0800781 oo.sOnuPersistentData.PersUniConfig[k].PersTpPathMap[aTpID] = ""
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000782 } else {
783 //existing entry to be modified
dbainbri4d3a0dc2020-12-02 00:33:42 +0000784 logger.Debugw(ctx, "UniTp modify path value", log.Fields{"device-id": oo.deviceID, "uniID": aUniID, "path": aPathString})
Girish Gowdra041dcb32020-11-16 16:54:30 -0800785 oo.sOnuPersistentData.PersUniConfig[k].PersTpPathMap[aTpID] = aPathString
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000786 }
787 return true
788 }
789 //entry already exists
mpagenkofc4f56e2020-11-04 17:17:49 +0000790 if aPathString == "" {
791 //no active TechProfile
dbainbri4d3a0dc2020-12-02 00:33:42 +0000792 logger.Debugw(ctx, "UniTp path has already been removed - no AniSide config to be removed", log.Fields{
mpagenkofc4f56e2020-11-04 17:17:49 +0000793 "device-id": oo.deviceID, "uniID": aUniID})
mpagenkofc4f56e2020-11-04 17:17:49 +0000794 } else {
795 //the given TechProfile already exists and is assumed to be active - update devReason as if the config has been done here
796 //was needed e.g. in voltha POD Tests:Validate authentication on a disabled ONU
797 // (as here the TechProfile has not been removed with the disable-device before the new enable-device)
dbainbri4d3a0dc2020-12-02 00:33:42 +0000798 logger.Debugw(ctx, "UniTp path already exists - TechProfile supposed to be active", log.Fields{
mpagenkofc4f56e2020-11-04 17:17:49 +0000799 "device-id": oo.deviceID, "uniID": aUniID, "path": aPathString})
800 //no deviceReason update (deviceProcStatusUpdate) here to ensure 'omci_flows_pushed' state within disable/enable procedure of ATT scenario
801 // (during which the flows are removed/re-assigned but the techProf is left active)
802 //and as the TechProfile is regarded as active we have to verify, if some flow configuration still waits on it
803 // (should not be the case, but should not harm or be more robust ...)
mpagenko2418ab02020-11-12 12:58:06 +0000804 // and to be sure, that for some reason the corresponding TpDelete was lost somewhere in history
805 // we also reset a possibly outstanding delete request - repeated TpConfig is regarded as valid for waiting flow config
806 if oo.baseDeviceHandler.pOnuTP != nil {
Girish Gowdra041dcb32020-11-16 16:54:30 -0800807 oo.baseDeviceHandler.pOnuTP.setProfileToDelete(aUniID, aTpID, false)
mpagenko2418ab02020-11-12 12:58:06 +0000808 }
mpagenko551a4d42020-12-08 18:09:20 +0000809 go oo.baseDeviceHandler.VerifyVlanConfigRequest(ctx, aUniID, aTpID)
mpagenkofc4f56e2020-11-04 17:17:49 +0000810 }
811 return false //indicate 'no change' - nothing more to do, TechProf inter-adapter message is return with success anyway here
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000812 }
813 }
814 //no entry exists for uniId
815
816 if aPathString == "" {
817 //delete request in non-existing state , accept as no change
dbainbri4d3a0dc2020-12-02 00:33:42 +0000818 logger.Debugw(ctx, "UniTp path already removed", log.Fields{"device-id": oo.deviceID, "uniID": aUniID})
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000819 return false
820 }
821 //new entry to be created
dbainbri4d3a0dc2020-12-02 00:33:42 +0000822 logger.Debugw(ctx, "New UniTp path set", log.Fields{"device-id": oo.deviceID, "uniID": aUniID, "path": aPathString})
Girish Gowdra041dcb32020-11-16 16:54:30 -0800823 perSubTpPathMap := make(map[uint8]string)
824 perSubTpPathMap[aTpID] = aPathString
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000825 oo.sOnuPersistentData.PersUniConfig =
Girish Gowdra041dcb32020-11-16 16:54:30 -0800826 append(oo.sOnuPersistentData.PersUniConfig, uniPersConfig{PersUniID: aUniID, PersTpPathMap: perSubTpPathMap, PersFlowParams: make([]uniVlanFlowParams, 0)})
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000827 return true
828}
829
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000830func (oo *OnuDeviceEntry) updateOnuUniFlowConfig(aUniID uint8, aUniVlanFlowParams *[]uniVlanFlowParams) {
831
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000832 oo.mutexPersOnuConfig.Lock()
833 defer oo.mutexPersOnuConfig.Unlock()
Holger Hildebrandtdaf0f722021-02-12 11:50:30 +0000834
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000835 for k, v := range oo.sOnuPersistentData.PersUniConfig {
836 if v.PersUniID == aUniID {
837 oo.sOnuPersistentData.PersUniConfig[k].PersFlowParams = make([]uniVlanFlowParams, len(*aUniVlanFlowParams))
838 copy(oo.sOnuPersistentData.PersUniConfig[k].PersFlowParams, *aUniVlanFlowParams)
839 return
840 }
841 }
842 //flow update was faster than tp-config - create PersUniConfig-entry
mpagenko30f28442021-03-24 09:24:04 +0000843 //TODO!!: following activity to 'add' some new uni entry might not be quite correct if this function is called to clear the data
844 // (e.g after flow removal from RemoveUniFlowParams()).
845 // This has the effect of misleading indication that there is still some active UNI entry, even though there might be only some nil flow entry
846 // The effect of this flaw is that at TechProfile removal there is an additional attempt to remove the entry even though no techProfile exists anymore
847 // The code is not changed here because of the current release lane, changes might have unexpected secondary effects, perhaps later with more elaborate tests
Girish Gowdra041dcb32020-11-16 16:54:30 -0800848 tmpConfig := uniPersConfig{PersUniID: aUniID, PersTpPathMap: make(map[uint8]string), PersFlowParams: make([]uniVlanFlowParams, len(*aUniVlanFlowParams))}
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000849 copy(tmpConfig.PersFlowParams, *aUniVlanFlowParams)
850 oo.sOnuPersistentData.PersUniConfig = append(oo.sOnuPersistentData.PersUniConfig, tmpConfig)
851}
852
853func (oo *OnuDeviceEntry) waitForTimeoutOrCompletion(
854 ctx context.Context, aChOnuProcessingStep <-chan uint8, aProcessingStep uint8) bool {
855 select {
856 case <-ctx.Done():
dbainbri4d3a0dc2020-12-02 00:33:42 +0000857 logger.Warnw(ctx, "processing not completed in-time!",
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000858 log.Fields{"device-id": oo.deviceID, "error": ctx.Err()})
859 return false
860 case rxStep := <-aChOnuProcessingStep:
861 if rxStep == aProcessingStep {
862 return true
863 }
864 //all other values are not accepted - including 0 for error indication
dbainbri4d3a0dc2020-12-02 00:33:42 +0000865 logger.Warnw(ctx, "Invalid processing step received: abort!",
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000866 log.Fields{"device-id": oo.deviceID,
867 "wantedStep": aProcessingStep, "haveStep": rxStep})
868 return false
869 }
870}
871
872func (oo *OnuDeviceEntry) resetKvProcessingErrorIndication() {
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000873 oo.mutexOnuKVStoreProcResult.Lock()
874 oo.onuKVStoreProcResult = nil
875 oo.mutexOnuKVStoreProcResult.Unlock()
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000876}
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000877
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000878func (oo *OnuDeviceEntry) getKvProcessingErrorIndication() error {
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000879 oo.mutexOnuKVStoreProcResult.RLock()
880 value := oo.onuKVStoreProcResult
881 oo.mutexOnuKVStoreProcResult.RUnlock()
882 return value
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000883}
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000884
885func (oo *OnuDeviceEntry) setKvProcessingErrorIndication(value error) {
886 oo.mutexOnuKVStoreProcResult.Lock()
887 oo.onuKVStoreProcResult = value
888 oo.mutexOnuKVStoreProcResult.Unlock()
889}
890
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +0000891func (oo *OnuDeviceEntry) incrementMibDataSync(ctx context.Context) {
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000892 oo.mutexPersOnuConfig.Lock()
893 defer oo.mutexPersOnuConfig.Unlock()
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000894 if oo.sOnuPersistentData.PersMibDataSyncAdpt < 255 {
895 oo.sOnuPersistentData.PersMibDataSyncAdpt++
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +0000896 } else {
897 // per G.984 and G.988 overflow starts over at 1 given 0 is reserved for reset
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000898 oo.sOnuPersistentData.PersMibDataSyncAdpt = 1
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +0000899 }
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000900 logger.Debugf(ctx, "mibDataSync updated - mds: %d - device-id: %s", oo.sOnuPersistentData.PersMibDataSyncAdpt, oo.deviceID)
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +0000901}
Holger Hildebrandtbe523842021-03-10 10:47:18 +0000902
mpagenko9c225032021-10-15 14:26:49 +0000903// ModifySwImageInactiveVersion - updates the inactive SW image version stored
904func (oo *OnuDeviceEntry) ModifySwImageInactiveVersion(ctx context.Context, aImageVersion string) {
905 oo.mutexOnuSwImageIndications.Lock()
906 defer oo.mutexOnuSwImageIndications.Unlock()
907 logger.Debugw(ctx, "software-image set inactive version", log.Fields{
908 "device-id": oo.deviceID, "version": aImageVersion})
909 oo.onuSwImageIndications.inactiveEntityEntry.version = aImageVersion
910 //inactive SW version is not part of persistency data (yet) - no need to update that
911}
912
913// ModifySwImageActiveCommit - updates the active SW commit flag stored
914func (oo *OnuDeviceEntry) ModifySwImageActiveCommit(ctx context.Context, aCommitted uint8) {
915 oo.mutexOnuSwImageIndications.Lock()
916 defer oo.mutexOnuSwImageIndications.Unlock()
917 logger.Debugw(ctx, "software-image set active entity commit flag", log.Fields{
918 "device-id": oo.deviceID, "committed": aCommitted})
919 oo.onuSwImageIndications.activeEntityEntry.isCommitted = aCommitted
920 //commit flag is not part of persistency data (yet) - no need to update that
921}
922
ozgecanetsiaf0a76b62021-05-31 17:42:09 +0300923func (oo *OnuDeviceEntry) getActiveImageVersion(ctx context.Context) string {
Holger Hildebrandt05011352021-06-15 09:40:24 +0000924 oo.mutexOnuSwImageIndications.RLock()
ozgecanetsiaf0a76b62021-05-31 17:42:09 +0300925 if oo.onuSwImageIndications.activeEntityEntry.valid {
Holger Hildebrandt05011352021-06-15 09:40:24 +0000926 value := oo.onuSwImageIndications.activeEntityEntry.version
927 oo.mutexOnuSwImageIndications.RUnlock()
928 return value
ozgecanetsiaf0a76b62021-05-31 17:42:09 +0300929 }
Holger Hildebrandt05011352021-06-15 09:40:24 +0000930 oo.mutexOnuSwImageIndications.RUnlock()
ozgecanetsiaf0a76b62021-05-31 17:42:09 +0300931 logger.Debugw(ctx, "Active Image is not valid", log.Fields{"device-id": oo.deviceID})
932 return ""
933}
934
935func (oo *OnuDeviceEntry) getInactiveImageVersion(ctx context.Context) string {
Holger Hildebrandt05011352021-06-15 09:40:24 +0000936 oo.mutexOnuSwImageIndications.RLock()
ozgecanetsiaf0a76b62021-05-31 17:42:09 +0300937 if oo.onuSwImageIndications.inactiveEntityEntry.valid {
Holger Hildebrandt05011352021-06-15 09:40:24 +0000938 value := oo.onuSwImageIndications.inactiveEntityEntry.version
939 oo.mutexOnuSwImageIndications.RUnlock()
940 return value
ozgecanetsiaf0a76b62021-05-31 17:42:09 +0300941 }
Holger Hildebrandt05011352021-06-15 09:40:24 +0000942 oo.mutexOnuSwImageIndications.RUnlock()
ozgecanetsiaf0a76b62021-05-31 17:42:09 +0300943 logger.Debugw(ctx, "Inactive Image is not valid", log.Fields{"device-id": oo.deviceID})
944 return ""
945}
946
Holger Hildebrandtbe523842021-03-10 10:47:18 +0000947func (oo *OnuDeviceEntry) buildMibTemplatePath() string {
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000948 oo.mutexPersOnuConfig.RLock()
949 defer oo.mutexPersOnuConfig.RUnlock()
Holger Hildebrandtbe523842021-03-10 10:47:18 +0000950 return fmt.Sprintf(cSuffixMibTemplateKvStore, oo.sOnuPersistentData.PersVendorID, oo.sOnuPersistentData.PersEquipmentID, oo.sOnuPersistentData.PersActiveSwVersion)
951}
Mahir Gunyel7f4483a2021-05-06 12:53:43 -0700952
953func (oo *OnuDeviceEntry) allocateFreeTcont(ctx context.Context, allocID uint16) (uint16, bool, error) {
954 logger.Debugw(ctx, "allocate-free-tcont", log.Fields{"device-id": oo.deviceID, "allocID": allocID,
955 "allocated-instances": oo.sOnuPersistentData.PersTcontMap})
956
mpagenkob59fbed2021-11-23 16:55:20 +0000957 oo.mutexPersOnuConfig.Lock()
958 defer oo.mutexPersOnuConfig.Unlock()
Mahir Gunyel7f4483a2021-05-06 12:53:43 -0700959 if entityID, ok := oo.sOnuPersistentData.PersTcontMap[allocID]; ok {
960 //tcont already allocated before, return the used instance-id
961 return entityID, true, nil
962 }
963 //First allocation of tcont. Find a free instance
964 if tcontInstKeys := oo.pOnuDB.getSortedInstKeys(ctx, me.TContClassID); len(tcontInstKeys) > 0 {
965 logger.Debugw(ctx, "allocate-free-tcont-db-keys", log.Fields{"device-id": oo.deviceID, "keys": tcontInstKeys})
966 for _, instID := range tcontInstKeys {
967 instExist := false
968 //If this instance exist in map, it means it is not empty. It is allocated before
969 for _, v := range oo.sOnuPersistentData.PersTcontMap {
970 if v == instID {
971 instExist = true
972 break
973 }
974 }
975 if !instExist {
976 oo.sOnuPersistentData.PersTcontMap[allocID] = instID
977 return instID, false, nil
978 }
979 }
980 }
981 return 0, false, fmt.Errorf(fmt.Sprintf("no-free-tcont-left-for-device-%s", oo.deviceID))
Mahir Gunyel7f4483a2021-05-06 12:53:43 -0700982}
983
984func (oo *OnuDeviceEntry) freeTcont(ctx context.Context, allocID uint16) {
985 logger.Debugw(ctx, "free-tcont", log.Fields{"device-id": oo.deviceID, "alloc": allocID})
mpagenkob59fbed2021-11-23 16:55:20 +0000986 oo.mutexPersOnuConfig.Lock()
987 defer oo.mutexPersOnuConfig.Unlock()
Mahir Gunyel7f4483a2021-05-06 12:53:43 -0700988 delete(oo.sOnuPersistentData.PersTcontMap, allocID)
989}
Holger Hildebrandtddc4fbd2022-02-04 14:10:36 +0000990
Holger Hildebrandt779e8d62022-02-08 15:35:01 +0000991// setReconcilingFlows - TODO: add comment
992func (oo *OnuDeviceEntry) setReconcilingFlows(value bool) {
993 oo.mutexReconcilingFlowsFlag.Lock()
994 oo.reconcilingFlows = value
995 oo.mutexReconcilingFlowsFlag.Unlock()
996}
997
998// SendChReconcilingFlowsFinished - TODO: add comment
999func (oo *OnuDeviceEntry) SendChReconcilingFlowsFinished(ctx context.Context, value bool) {
1000 if oo != nil { //if the object still exists (might have been already deleted in background)
1001 //use asynchronous channel sending to avoid stucking on non-waiting receiver
1002 select {
1003 case oo.chReconcilingFlowsFinished <- value:
1004 logger.Debugw(ctx, "reconciling - flows finished sent", log.Fields{"device-id": oo.deviceID})
1005 default:
1006 logger.Infow(ctx, "reconciling - flows finished not sent!", log.Fields{"device-id": oo.deviceID})
1007 }
1008 }
1009}
1010
1011// isReconcilingFlows - TODO: add comment
1012func (oo *OnuDeviceEntry) isReconcilingFlows() bool {
1013 oo.mutexReconcilingFlowsFlag.RLock()
1014 value := oo.reconcilingFlows
1015 oo.mutexReconcilingFlowsFlag.RUnlock()
1016 return value
1017}
1018
Holger Hildebrandtddc4fbd2022-02-04 14:10:36 +00001019// PrepareForGarbageCollection - remove references to prepare for garbage collection
1020func (oo *OnuDeviceEntry) PrepareForGarbageCollection(ctx context.Context, aDeviceID string) {
1021 logger.Debugw(ctx, "prepare for garbage collection", log.Fields{"device-id": aDeviceID})
1022 oo.baseDeviceHandler = nil
1023 if oo.PDevOmciCC != nil {
1024 oo.PDevOmciCC.PrepareForGarbageCollection(ctx, aDeviceID)
1025 }
1026 oo.PDevOmciCC = nil
1027}