blob: 64929d573381dbc0489747fa7821a078ecf87a49 [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
Himani Chawla6d2ae152020-09-02 13:11:20 +0530142 // PortLinkUp - Port link state change
mpagenkofc4f56e2020-11-04 17:17:49 +0000143 PortLinkUp
Himani Chawla6d2ae152020-09-02 13:11:20 +0530144 // PortLinkDw - Port link state change
mpagenkofc4f56e2020-11-04 17:17:49 +0000145 PortLinkDw
Himani Chawla6d2ae152020-09-02 13:11:20 +0530146 // OmciAniConfigDone - AniSide config according to TechProfile done
mpagenkofc4f56e2020-11-04 17:17:49 +0000147 OmciAniConfigDone
148 // OmciAniResourceRemoved - AniSide TechProfile related resource (Gem/TCont) removed
149 OmciAniResourceRemoved // needs to be the successor of OmciAniConfigDone!
mpagenkof1fc3862021-02-16 10:09:52 +0000150 // OmciVlanFilterAddDone - Omci Vlan config done according to flow-add with request to write kvStore
mpagenkofc4f56e2020-11-04 17:17:49 +0000151 OmciVlanFilterAddDone
mpagenkof1fc3862021-02-16 10:09:52 +0000152 // OmciVlanFilterAddDoneNoKvStore - Omci Vlan config done according to flow-add without writing kvStore
153 OmciVlanFilterAddDoneNoKvStore // needs to be the successor of OmciVlanFilterAddDone!
154 // OmciVlanFilterRemDone - Omci Vlan config done according to flow-remove with request to write kvStore
155 OmciVlanFilterRemDone // needs to be the successor of OmciVlanFilterAddDoneNoKvStore!
156 // OmciVlanFilterRemDoneNoKvStore - Omci Vlan config done according to flow-remove without writing kvStore
157 OmciVlanFilterRemDoneNoKvStore // needs to be the successor of OmciVlanFilterRemDone!
mpagenko80622a52021-02-09 16:53:23 +0000158 // OmciOnuSwUpgradeDone - SoftwareUpgrade to ONU finished
159 OmciOnuSwUpgradeDone
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000160 // Add other events here as needed (alarms separate???)
161)
162
mpagenko7d6bb022021-03-11 15:07:55 +0000163//AdapterFsm related error string
164//error string could be checked on waitforOmciResponse() e.g. to avoid misleading error log
165// but not used that way so far (permit error log even for wanted cancellation)
166const cErrWaitAborted = "waitResponse aborted"
167
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000168type activityDescr struct {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000169 databaseClass func(context.Context) error
Himani Chawla4d908332020-08-31 12:30:20 +0530170 //advertiseEvents bool
Holger Hildebrandte3677f12021-02-05 14:50:56 +0000171 auditInterval time.Duration
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000172 //tasks map[string]func() error
173}
Himani Chawla6d2ae152020-09-02 13:11:20 +0530174
175// OmciDeviceFsms - FSM event mapping to database class and time to wait between audits
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000176type OmciDeviceFsms map[string]activityDescr
177
Himani Chawla6d2ae152020-09-02 13:11:20 +0530178// AdapterFsm - Adapter FSM details including channel, event and device
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000179type AdapterFsm struct {
180 fsmName string
181 deviceID string
182 commChan chan Message
183 pFsm *fsm.FSM
184}
185
Himani Chawla6d2ae152020-09-02 13:11:20 +0530186//NewAdapterFsm - FSM details including event, device and channel.
187func NewAdapterFsm(aName string, aDeviceID string, aCommChannel chan Message) *AdapterFsm {
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000188 aFsm := &AdapterFsm{
Himani Chawla6d2ae152020-09-02 13:11:20 +0530189 fsmName: aName,
190 deviceID: aDeviceID,
191 commChan: aCommChannel,
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000192 }
193 return aFsm
194}
195
196//Start starts (logs) the omci agent
dbainbri4d3a0dc2020-12-02 00:33:42 +0000197func (oo *AdapterFsm) logFsmStateChange(ctx context.Context, e *fsm.Event) {
198 logger.Debugw(ctx, "FSM state change", log.Fields{"device-id": oo.deviceID, "FSM name": oo.fsmName,
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000199 "event name": string(e.Event), "src state": string(e.Src), "dst state": string(e.Dst)})
200}
201
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000202//OntDeviceEntry structure holds information about the attached FSM'as and their communication
Holger Hildebrandtc54939a2020-06-17 08:14:27 +0000203
204const (
Himani Chawla6d2ae152020-09-02 13:11:20 +0530205 firstSwImageMeID = 0
206 secondSwImageMeID = 1
Holger Hildebrandtc54939a2020-06-17 08:14:27 +0000207)
mpagenko15ff4a52021-03-02 10:09:20 +0000208const ( //definitions as per G.988 softwareImage::IsCommitted
209 swIsUncommitted = 0
210 swIsCommitted = 1
211)
212const ( //definitions as per G.988 softwareImage::IsActive
mpagenko9c225032021-10-15 14:26:49 +0000213 swIsInactive = 0
214 swIsActive = 1
mpagenko15ff4a52021-03-02 10:09:20 +0000215)
Holger Hildebrandtfb402a62021-05-26 14:40:49 +0000216const ( //definitions as per G.988 softwareImage::IsValid
217 //swIsInvalid = 0 not yet used
218 swIsValid = 1
219)
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +0000220const onuDataMeID = 0
Himani Chawla6d2ae152020-09-02 13:11:20 +0530221const onugMeID = 0
222const onu2gMeID = 0
223const ipHostConfigDataMeID = 1
224const onugSerialNumberLen = 8
225const omciMacAddressLen = 6
Holger Hildebrandtc54939a2020-06-17 08:14:27 +0000226
Holger Hildebrandt2fb70892020-10-28 11:53:18 +0000227const cEmptyMacAddrString = "000000000000"
228const cEmptySerialNumberString = "0000000000000000"
229
mpagenko15ff4a52021-03-02 10:09:20 +0000230type sEntrySwImageIndication struct {
231 valid bool
232 entityID uint16
233 version string
234 isCommitted uint8
235}
236type sSwImageIndications struct {
237 activeEntityEntry sEntrySwImageIndication
238 inactiveEntityEntry sEntrySwImageIndication
Holger Hildebrandtc54939a2020-06-17 08:14:27 +0000239}
240
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000241type uniPersConfig struct {
242 PersUniID uint8 `json:"uni_id"`
Girish Gowdra041dcb32020-11-16 16:54:30 -0800243 PersTpPathMap map[uint8]string `json:"PersTpPathMap"` // tp-id to tp-path map
244 PersFlowParams []uniVlanFlowParams `json:"flow_params"` //as defined in omci_ani_config.go
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000245}
246
247type onuPersistentData struct {
Mahir Gunyel7f4483a2021-05-06 12:53:43 -0700248 PersOnuID uint32 `json:"onu_id"`
249 PersIntfID uint32 `json:"intf_id"`
250 PersSerialNumber string `json:"serial_number"`
251 PersMacAddress string `json:"mac_address"`
252 PersVendorID string `json:"vendor_id"`
253 PersEquipmentID string `json:"equipment_id"`
254 PersActiveSwVersion string `json:"active_sw_version"`
255 PersAdminState string `json:"admin_state"`
256 PersOperState string `json:"oper_state"`
257 PersUniUnlockDone bool `json:"uni_unlock_done"`
258 PersUniDisableDone bool `json:"uni_disable_done"`
259 PersMibAuditInterval time.Duration `json:"mib_audit_interval"`
260 PersMibLastDbSync uint32 `json:"mib_last_db_sync"`
261 PersMibDataSyncAdpt uint8 `json:"mib_data_sync_adpt"`
262 PersUniConfig []uniPersConfig `json:"uni_config"`
263 PersAlarmAuditInterval time.Duration `json:"alarm_audit_interval"`
264 PersTcontMap map[uint16]uint16 `json:"tcont_map"` //alloc-id to me-instance-id map
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000265}
266
Himani Chawla6d2ae152020-09-02 13:11:20 +0530267// OnuDeviceEntry - ONU device info and FSM events.
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000268type OnuDeviceEntry struct {
Holger Hildebrandt05011352021-06-15 09:40:24 +0000269 deviceID string
270 baseDeviceHandler *deviceHandler
271 pOpenOnuAc *OpenONUAC
272 coreProxy adapterif.CoreProxy
273 adapterProxy adapterif.AdapterProxy
274 PDevOmciCC *omciCC
275 pOnuDB *onuDeviceDB
276 mibTemplateKVStore *db.Backend
277 mutexPersOnuConfig sync.RWMutex
278 sOnuPersistentData onuPersistentData
279 mibTemplatePath string
280 mutexOnuKVStore sync.RWMutex
281 onuKVStore *db.Backend
282 onuKVStorePath string
283 mutexOnuKVStoreProcResult sync.RWMutex
284 onuKVStoreProcResult error //error indication of processing
285 chOnuKvProcessingStep chan uint8
286 mutexOnuSwImageIndications sync.RWMutex
287 onuSwImageIndications sSwImageIndications
288 mutexOnuImageStatus sync.RWMutex
289 pOnuImageStatus *OnuImageStatus
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000290 //lockDeviceEntries sync.RWMutex
dbainbri4d3a0dc2020-12-02 00:33:42 +0000291 mibDbClass func(context.Context) error
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000292 supportedFsms OmciDeviceFsms
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000293 devState OnuDeviceEvent
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +0000294 // Audit and MDS
Himani Chawla075f1642021-03-15 19:23:24 +0530295 mibAuditInterval time.Duration
296 alarmAuditInterval time.Duration
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000297 // TODO: periodical mib resync will be implemented with story VOL-3792
298 //mibNextDbResync uint32
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000299
300 // for mibUpload
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000301 pMibUploadFsm *AdapterFsm //could be handled dynamically and more general as pAdapterFsm - perhaps later
302 mutexLastTxParamStruct sync.RWMutex
303 lastTxParamStruct sLastTxMeParameter
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000304 // for mibDownload
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000305 pMibDownloadFsm *AdapterFsm //could be handled dynamically and more general as pAdapterFsm - perhaps later
306 //remark: general usage of pAdapterFsm would require generalization of commChan usage and internal event setting
307 // within the FSM event procedures
ozgecanetsiae11479f2020-07-06 09:44:47 +0300308 omciMessageReceived chan bool //seperate channel needed by DownloadFsm
309 omciRebootMessageReceivedChannel chan Message // channel needed by Reboot request
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000310}
311
Himani Chawla6d2ae152020-09-02 13:11:20 +0530312//newOnuDeviceEntry returns a new instance of a OnuDeviceEntry
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000313//mib_db (as well as not inluded alarm_db not really used in this code? VERIFY!!)
Holger Hildebrandt61b24d02020-11-16 13:36:40 +0000314func newOnuDeviceEntry(ctx context.Context, dh *deviceHandler) *OnuDeviceEntry {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000315 logger.Debugw(ctx, "init-onuDeviceEntry", log.Fields{"device-id": dh.deviceID})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000316 var onuDeviceEntry OnuDeviceEntry
Holger Hildebrandt61b24d02020-11-16 13:36:40 +0000317 onuDeviceEntry.deviceID = dh.deviceID
318 onuDeviceEntry.baseDeviceHandler = dh
319 onuDeviceEntry.pOpenOnuAc = dh.pOpenOnuAc
320 onuDeviceEntry.coreProxy = dh.coreProxy
321 onuDeviceEntry.adapterProxy = dh.AdapterProxy
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000322 onuDeviceEntry.devState = DeviceStatusInit
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000323 onuDeviceEntry.sOnuPersistentData.PersUniConfig = make([]uniPersConfig, 0)
Mahir Gunyel7f4483a2021-05-06 12:53:43 -0700324 onuDeviceEntry.sOnuPersistentData.PersTcontMap = make(map[uint16]uint16)
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000325 onuDeviceEntry.chOnuKvProcessingStep = make(chan uint8)
ozgecanetsiae11479f2020-07-06 09:44:47 +0300326 onuDeviceEntry.omciRebootMessageReceivedChannel = make(chan Message, 2048)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000327 //openomciagent.lockDeviceHandlersMap = sync.RWMutex{}
328 //OMCI related databases are on a per-agent basis. State machines and tasks
329 //are per ONU Vendor
330 //
331 // MIB Synchronization Database - possible overloading from arguments
Holger Hildebrandt61b24d02020-11-16 13:36:40 +0000332 if dh.pOpenOnuAc.pSupportedFsms != nil {
333 onuDeviceEntry.supportedFsms = *dh.pOpenOnuAc.pSupportedFsms
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000334 } else {
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000335 // 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 +0000336 //var mibSyncFsm = NewMibSynchronizer()
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000337 // use some internal defaults, if not defined from outside
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000338 onuDeviceEntry.supportedFsms = OmciDeviceFsms{
339 "mib-synchronizer": {
340 //mibSyncFsm, // Implements the MIB synchronization state machine
Himani Chawla6d2ae152020-09-02 13:11:20 +0530341 onuDeviceEntry.mibDbVolatileDict, // Implements volatile ME MIB database
Himani Chawla4d908332020-08-31 12:30:20 +0530342 //true, // Advertise events on OpenOMCI event bus
Holger Hildebrandte3677f12021-02-05 14:50:56 +0000343 dh.pOpenOnuAc.mibAuditInterval, // Time to wait between MIB audits. 0 to disable audits.
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000344 // map[string]func() error{
345 // "mib-upload": onuDeviceEntry.MibUploadTask,
346 // "mib-template": onuDeviceEntry.MibTemplateTask,
347 // "get-mds": onuDeviceEntry.GetMdsTask,
348 // "mib-audit": onuDeviceEntry.GetMdsTask,
349 // "mib-resync": onuDeviceEntry.MibResyncTask,
350 // "mib-reconcile": onuDeviceEntry.MibReconcileTask,
351 // },
352 },
353 }
354 }
355 onuDeviceEntry.mibDbClass = onuDeviceEntry.supportedFsms["mib-synchronizer"].databaseClass
dbainbri4d3a0dc2020-12-02 00:33:42 +0000356 logger.Debug(ctx, "access2mibDbClass")
357 go onuDeviceEntry.mibDbClass(ctx)
Holger Hildebrandtf37b3d72021-02-17 10:25:22 +0000358 if !dh.isReconciling() {
Holger Hildebrandte3677f12021-02-05 14:50:56 +0000359 onuDeviceEntry.mibAuditInterval = onuDeviceEntry.supportedFsms["mib-synchronizer"].auditInterval
360 onuDeviceEntry.sOnuPersistentData.PersMibAuditInterval = onuDeviceEntry.mibAuditInterval
Himani Chawla075f1642021-03-15 19:23:24 +0530361 onuDeviceEntry.alarmAuditInterval = dh.pOpenOnuAc.alarmAuditInterval
362 onuDeviceEntry.sOnuPersistentData.PersAlarmAuditInterval = onuDeviceEntry.alarmAuditInterval
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000363 } else {
Holger Hildebrandte3677f12021-02-05 14:50:56 +0000364 logger.Debugw(ctx, "reconciling - take audit interval from persistent data", log.Fields{"device-id": dh.deviceID})
365 // TODO: This is a preparation for VOL-VOL-3811 to preserve config history in case of
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000366 // vendor- or deviceID-specific configurations via voltctl-commands
Holger Hildebrandte3677f12021-02-05 14:50:56 +0000367 onuDeviceEntry.mibAuditInterval = onuDeviceEntry.sOnuPersistentData.PersMibAuditInterval
Himani Chawla075f1642021-03-15 19:23:24 +0530368 onuDeviceEntry.alarmAuditInterval = onuDeviceEntry.sOnuPersistentData.PersAlarmAuditInterval
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000369 }
Himani Chawla075f1642021-03-15 19:23:24 +0530370 logger.Debugw(ctx, "MibAuditInterval and AlarmAuditInterval is set to", log.Fields{"mib-audit-interval": onuDeviceEntry.mibAuditInterval,
371 "alarm-audit-interval": onuDeviceEntry.alarmAuditInterval})
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000372 // TODO: periodical mib resync will be implemented with story VOL-3792
373 //onuDeviceEntry.mibNextDbResync = 0
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000374
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000375 // Omci related Mib upload sync state machine
376 mibUploadChan := make(chan Message, 2048)
Holger Hildebrandt61b24d02020-11-16 13:36:40 +0000377 onuDeviceEntry.pMibUploadFsm = NewAdapterFsm("MibUpload", dh.deviceID, mibUploadChan)
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000378 onuDeviceEntry.pMibUploadFsm.pFsm = fsm.NewFSM(
mpagenko1cc3cb42020-07-27 15:24:38 +0000379 ulStDisabled,
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000380 fsm.Events{
381
mpagenko1cc3cb42020-07-27 15:24:38 +0000382 {Name: ulEvStart, Src: []string{ulStDisabled}, Dst: ulStStarting},
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000383
mpagenko1cc3cb42020-07-27 15:24:38 +0000384 {Name: ulEvResetMib, Src: []string{ulStStarting}, Dst: ulStResettingMib},
385 {Name: ulEvGetVendorAndSerial, Src: []string{ulStResettingMib}, Dst: ulStGettingVendorAndSerial},
Himani Chawla4d908332020-08-31 12:30:20 +0530386 {Name: ulEvGetEquipmentID, Src: []string{ulStGettingVendorAndSerial}, Dst: ulStGettingEquipmentID},
387 {Name: ulEvGetFirstSwVersion, Src: []string{ulStGettingEquipmentID}, Dst: ulStGettingFirstSwVersion},
mpagenko1cc3cb42020-07-27 15:24:38 +0000388 {Name: ulEvGetSecondSwVersion, Src: []string{ulStGettingFirstSwVersion}, Dst: ulStGettingSecondSwVersion},
389 {Name: ulEvGetMacAddress, Src: []string{ulStGettingSecondSwVersion}, Dst: ulStGettingMacAddress},
390 {Name: ulEvGetMibTemplate, Src: []string{ulStGettingMacAddress}, Dst: ulStGettingMibTemplate},
Holger Hildebrandtc54939a2020-06-17 08:14:27 +0000391
mpagenko1cc3cb42020-07-27 15:24:38 +0000392 {Name: ulEvUploadMib, Src: []string{ulStGettingMibTemplate}, Dst: ulStUploading},
393 {Name: ulEvExamineMds, Src: []string{ulStStarting}, Dst: ulStExaminingMds},
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000394
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000395 {Name: ulEvSuccess, Src: []string{ulStGettingMibTemplate}, Dst: ulStUploadDone},
396 {Name: ulEvSuccess, Src: []string{ulStUploading}, Dst: ulStUploadDone},
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000397
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000398 {Name: ulEvSuccess, Src: []string{ulStUploadDone}, Dst: ulStInSync},
Holger Hildebrandtbe523842021-03-10 10:47:18 +0000399 //{Name: ulEvSuccess, Src: []string{ulStExaminingMds}, Dst: ulStInSync},
400 {Name: ulEvSuccess, Src: []string{ulStExaminingMds}, Dst: ulStExaminingMdsSuccess},
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +0000401 // TODO: As long as mib-resynchronizing is not implemented, failed MDS-examination triggers
402 // mib-reset and new provisioning at this point
403 //{Name: ulEvMismatch, Src: []string{ulStExaminingMds}, Dst: ulStResynchronizing},
404 {Name: ulEvMismatch, Src: []string{ulStExaminingMds}, Dst: ulStResettingMib},
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000405
Holger Hildebrandtbe523842021-03-10 10:47:18 +0000406 {Name: ulEvSuccess, Src: []string{ulStExaminingMdsSuccess}, Dst: ulStInSync},
407 {Name: ulEvMismatch, Src: []string{ulStExaminingMdsSuccess}, Dst: ulStResettingMib},
408
mpagenko1cc3cb42020-07-27 15:24:38 +0000409 {Name: ulEvAuditMib, Src: []string{ulStInSync}, Dst: ulStAuditing},
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000410
mpagenko1cc3cb42020-07-27 15:24:38 +0000411 {Name: ulEvSuccess, Src: []string{ulStOutOfSync}, Dst: ulStInSync},
412 {Name: ulEvAuditMib, Src: []string{ulStOutOfSync}, Dst: ulStAuditing},
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000413
mpagenko1cc3cb42020-07-27 15:24:38 +0000414 {Name: ulEvSuccess, Src: []string{ulStAuditing}, Dst: ulStInSync},
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000415 {Name: ulEvMismatch, Src: []string{ulStAuditing}, Dst: ulStReAuditing},
mpagenko1cc3cb42020-07-27 15:24:38 +0000416 {Name: ulEvForceResync, Src: []string{ulStAuditing}, Dst: ulStResynchronizing},
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000417
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000418 {Name: ulEvSuccess, Src: []string{ulStReAuditing}, Dst: ulStInSync},
419 {Name: ulEvMismatch, Src: []string{ulStReAuditing}, Dst: ulStResettingMib},
420
mpagenko1cc3cb42020-07-27 15:24:38 +0000421 {Name: ulEvSuccess, Src: []string{ulStResynchronizing}, Dst: ulStInSync},
422 {Name: ulEvDiffsFound, Src: []string{ulStResynchronizing}, Dst: ulStOutOfSync},
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000423
Himani Chawla4d908332020-08-31 12:30:20 +0530424 {Name: ulEvTimeout, Src: []string{ulStResettingMib, ulStGettingVendorAndSerial, ulStGettingEquipmentID, ulStGettingFirstSwVersion,
mpagenko1cc3cb42020-07-27 15:24:38 +0000425 ulStGettingSecondSwVersion, ulStGettingMacAddress, ulStGettingMibTemplate, ulStUploading, ulStResynchronizing, ulStExaminingMds,
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000426 ulStUploadDone, ulStInSync, ulStOutOfSync, ulStAuditing, ulStReAuditing}, Dst: ulStStarting},
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000427
Himani Chawla4d908332020-08-31 12:30:20 +0530428 {Name: ulEvStop, Src: []string{ulStStarting, ulStResettingMib, ulStGettingVendorAndSerial, ulStGettingEquipmentID, ulStGettingFirstSwVersion,
mpagenko1cc3cb42020-07-27 15:24:38 +0000429 ulStGettingSecondSwVersion, ulStGettingMacAddress, ulStGettingMibTemplate, ulStUploading, ulStResynchronizing, ulStExaminingMds,
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000430 ulStUploadDone, ulStInSync, ulStOutOfSync, ulStAuditing, ulStReAuditing}, Dst: ulStDisabled},
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000431 },
432
433 fsm.Callbacks{
dbainbri4d3a0dc2020-12-02 00:33:42 +0000434 "enter_state": func(e *fsm.Event) { onuDeviceEntry.pMibUploadFsm.logFsmStateChange(ctx, e) },
435 "enter_" + ulStStarting: func(e *fsm.Event) { onuDeviceEntry.enterStartingState(ctx, e) },
436 "enter_" + ulStResettingMib: func(e *fsm.Event) { onuDeviceEntry.enterResettingMibState(ctx, e) },
437 "enter_" + ulStGettingVendorAndSerial: func(e *fsm.Event) { onuDeviceEntry.enterGettingVendorAndSerialState(ctx, e) },
438 "enter_" + ulStGettingEquipmentID: func(e *fsm.Event) { onuDeviceEntry.enterGettingEquipmentIDState(ctx, e) },
439 "enter_" + ulStGettingFirstSwVersion: func(e *fsm.Event) { onuDeviceEntry.enterGettingFirstSwVersionState(ctx, e) },
440 "enter_" + ulStGettingSecondSwVersion: func(e *fsm.Event) { onuDeviceEntry.enterGettingSecondSwVersionState(ctx, e) },
441 "enter_" + ulStGettingMacAddress: func(e *fsm.Event) { onuDeviceEntry.enterGettingMacAddressState(ctx, e) },
Holger Hildebrandtbe523842021-03-10 10:47:18 +0000442 "enter_" + ulStGettingMibTemplate: func(e *fsm.Event) { onuDeviceEntry.enterGettingMibTemplateState(ctx, e) },
dbainbri4d3a0dc2020-12-02 00:33:42 +0000443 "enter_" + ulStUploading: func(e *fsm.Event) { onuDeviceEntry.enterUploadingState(ctx, e) },
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000444 "enter_" + ulStUploadDone: func(e *fsm.Event) { onuDeviceEntry.enterUploadDoneState(ctx, e) },
dbainbri4d3a0dc2020-12-02 00:33:42 +0000445 "enter_" + ulStExaminingMds: func(e *fsm.Event) { onuDeviceEntry.enterExaminingMdsState(ctx, e) },
446 "enter_" + ulStResynchronizing: func(e *fsm.Event) { onuDeviceEntry.enterResynchronizingState(ctx, e) },
Holger Hildebrandtbe523842021-03-10 10:47:18 +0000447 "enter_" + ulStExaminingMdsSuccess: func(e *fsm.Event) { onuDeviceEntry.enterExaminingMdsSuccessState(ctx, e) },
dbainbri4d3a0dc2020-12-02 00:33:42 +0000448 "enter_" + ulStAuditing: func(e *fsm.Event) { onuDeviceEntry.enterAuditingState(ctx, e) },
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000449 "enter_" + ulStReAuditing: func(e *fsm.Event) { onuDeviceEntry.enterReAuditingState(ctx, e) },
dbainbri4d3a0dc2020-12-02 00:33:42 +0000450 "enter_" + ulStOutOfSync: func(e *fsm.Event) { onuDeviceEntry.enterOutOfSyncState(ctx, e) },
451 "enter_" + ulStInSync: func(e *fsm.Event) { onuDeviceEntry.enterInSyncState(ctx, e) },
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000452 },
453 )
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000454 // Omci related Mib download state machine
455 mibDownloadChan := make(chan Message, 2048)
Holger Hildebrandt61b24d02020-11-16 13:36:40 +0000456 onuDeviceEntry.pMibDownloadFsm = NewAdapterFsm("MibDownload", dh.deviceID, mibDownloadChan)
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000457 onuDeviceEntry.pMibDownloadFsm.pFsm = fsm.NewFSM(
mpagenko1cc3cb42020-07-27 15:24:38 +0000458 dlStDisabled,
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000459 fsm.Events{
460
mpagenko1cc3cb42020-07-27 15:24:38 +0000461 {Name: dlEvStart, Src: []string{dlStDisabled}, Dst: dlStStarting},
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000462
mpagenko1cc3cb42020-07-27 15:24:38 +0000463 {Name: dlEvCreateGal, Src: []string{dlStStarting}, Dst: dlStCreatingGal},
464 {Name: dlEvRxGalResp, Src: []string{dlStCreatingGal}, Dst: dlStSettingOnu2g},
465 {Name: dlEvRxOnu2gResp, Src: []string{dlStSettingOnu2g}, Dst: dlStBridgeInit},
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000466 // the bridge state is used for multi ME config for alle UNI related ports
467 // maybe such could be reflected in the state machine as well (port number parametrized)
468 // but that looks not straightforward here - so we keep it simple here for the beginning(?)
mpagenko1cc3cb42020-07-27 15:24:38 +0000469 {Name: dlEvRxBridgeResp, Src: []string{dlStBridgeInit}, Dst: dlStDownloaded},
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000470
mpagenko1cc3cb42020-07-27 15:24:38 +0000471 {Name: dlEvTimeoutSimple, Src: []string{dlStCreatingGal, dlStSettingOnu2g}, Dst: dlStStarting},
472 {Name: dlEvTimeoutBridge, Src: []string{dlStBridgeInit}, Dst: dlStStarting},
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000473
mpagenko1cc3cb42020-07-27 15:24:38 +0000474 {Name: dlEvReset, Src: []string{dlStStarting, dlStCreatingGal, dlStSettingOnu2g,
475 dlStBridgeInit, dlStDownloaded}, Dst: dlStResetting},
476 // exceptional treatment for all states except dlStResetting
477 {Name: dlEvRestart, Src: []string{dlStStarting, dlStCreatingGal, dlStSettingOnu2g,
478 dlStBridgeInit, dlStDownloaded, dlStResetting}, Dst: dlStDisabled},
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000479 },
480
481 fsm.Callbacks{
dbainbri4d3a0dc2020-12-02 00:33:42 +0000482 "enter_state": func(e *fsm.Event) { onuDeviceEntry.pMibDownloadFsm.logFsmStateChange(ctx, e) },
483 "enter_" + dlStStarting: func(e *fsm.Event) { onuDeviceEntry.enterDLStartingState(ctx, e) },
484 "enter_" + dlStCreatingGal: func(e *fsm.Event) { onuDeviceEntry.enterCreatingGalState(ctx, e) },
485 "enter_" + dlStSettingOnu2g: func(e *fsm.Event) { onuDeviceEntry.enterSettingOnu2gState(ctx, e) },
486 "enter_" + dlStBridgeInit: func(e *fsm.Event) { onuDeviceEntry.enterBridgeInitState(ctx, e) },
487 "enter_" + dlStDownloaded: func(e *fsm.Event) { onuDeviceEntry.enterDownloadedState(ctx, e) },
488 "enter_" + dlStResetting: func(e *fsm.Event) { onuDeviceEntry.enterResettingState(ctx, e) },
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000489 },
490 )
491 if onuDeviceEntry.pMibDownloadFsm == nil || onuDeviceEntry.pMibDownloadFsm.pFsm == nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000492 logger.Errorw(ctx, "MibDownloadFsm could not be instantiated", log.Fields{"device-id": dh.deviceID})
mpagenko15ff4a52021-03-02 10:09:20 +0000493 // TODO some specific error treatment - or waiting for crash ?
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000494 }
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000495
dbainbri4d3a0dc2020-12-02 00:33:42 +0000496 onuDeviceEntry.mibTemplateKVStore = onuDeviceEntry.baseDeviceHandler.setBackend(ctx, cBasePathMibTemplateKvStore)
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000497 if onuDeviceEntry.mibTemplateKVStore == nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000498 logger.Errorw(ctx, "Can't access mibTemplateKVStore - no backend connection to service",
Holger Hildebrandt61b24d02020-11-16 13:36:40 +0000499 log.Fields{"device-id": dh.deviceID, "service": cBasePathMibTemplateKvStore})
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000500 }
501
502 onuDeviceEntry.onuKVStorePath = onuDeviceEntry.deviceID
Matteo Scandolof1f39a72020-11-24 12:08:11 -0800503 baseKvStorePath := fmt.Sprintf(cBasePathOnuKVStore, dh.pOpenOnuAc.cm.Backend.PathPrefix)
dbainbri4d3a0dc2020-12-02 00:33:42 +0000504 onuDeviceEntry.onuKVStore = onuDeviceEntry.baseDeviceHandler.setBackend(ctx, baseKvStorePath)
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000505 if onuDeviceEntry.onuKVStore == nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000506 logger.Errorw(ctx, "Can't access onuKVStore - no backend connection to service",
Matteo Scandolof1f39a72020-11-24 12:08:11 -0800507 log.Fields{"device-id": dh.deviceID, "service": baseKvStorePath})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000508 }
509
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000510 // Alarm Synchronization Database
Himani Chawlaac1f5ad2021-02-04 21:21:54 +0530511
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000512 //self._alarm_db = None
513 //self._alarm_database_cls = support_classes['alarm-synchronizer']['database']
514 return &onuDeviceEntry
515}
516
Himani Chawla6d2ae152020-09-02 13:11:20 +0530517//start starts (logs) the omci agent
518func (oo *OnuDeviceEntry) start(ctx context.Context) error {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000519 logger.Debugw(ctx, "OnuDeviceEntry-starting", log.Fields{"for device-id": oo.deviceID})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000520 if oo.PDevOmciCC == nil {
mpagenko900ee4b2020-10-12 11:56:34 +0000521 oo.PDevOmciCC = newOmciCC(ctx, oo, oo.deviceID, oo.baseDeviceHandler,
522 oo.coreProxy, oo.adapterProxy)
523 if oo.PDevOmciCC == nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000524 logger.Errorw(ctx, "Could not create devOmciCc - abort", log.Fields{"for device-id": oo.deviceID})
mpagenko900ee4b2020-10-12 11:56:34 +0000525 return fmt.Errorf("could not create devOmciCc %s", oo.deviceID)
526 }
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000527 }
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000528 return nil
529}
530
mpagenko900ee4b2020-10-12 11:56:34 +0000531//stop stops/resets the omciCC
532func (oo *OnuDeviceEntry) stop(ctx context.Context, abResetOmciCC bool) error {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000533 logger.Debugw(ctx, "OnuDeviceEntry-stopping", log.Fields{"for device-id": oo.deviceID})
mpagenko900ee4b2020-10-12 11:56:34 +0000534 if abResetOmciCC && (oo.PDevOmciCC != nil) {
535 _ = oo.PDevOmciCC.stop(ctx)
536 }
537 //to allow for all event notifications again when re-using the device and omciCC
538 oo.devState = DeviceStatusInit
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000539 return nil
540}
541
Himani Chawla6d2ae152020-09-02 13:11:20 +0530542func (oo *OnuDeviceEntry) reboot(ctx context.Context) error {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000543 logger.Debugw(ctx, "OnuDeviceEntry-rebooting", log.Fields{"for device-id": oo.deviceID})
mpagenko900ee4b2020-10-12 11:56:34 +0000544 if oo.PDevOmciCC != nil {
Girish Gowdra0b235842021-03-09 13:06:46 -0800545 if err := oo.PDevOmciCC.sendReboot(ctx, oo.pOpenOnuAc.omciTimeout, true, oo.omciRebootMessageReceivedChannel); err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000546 logger.Errorw(ctx, "onu didn't reboot", log.Fields{"for device-id": oo.deviceID})
mpagenko900ee4b2020-10-12 11:56:34 +0000547 return err
548 }
ozgecanetsiae11479f2020-07-06 09:44:47 +0300549 }
ozgecanetsiae11479f2020-07-06 09:44:47 +0300550 return nil
551}
552
dbainbri4d3a0dc2020-12-02 00:33:42 +0000553func (oo *OnuDeviceEntry) waitForRebootResponse(ctx context.Context, responseChannel chan Message) error {
ozgecanetsiae11479f2020-07-06 09:44:47 +0300554 select {
Holger Hildebrandt366ef192021-05-05 11:07:44 +0000555 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 +0000556 logger.Warnw(ctx, "Reboot timeout", log.Fields{"for device-id": oo.deviceID})
Andrea Campanella6515c582020-10-05 11:25:00 +0200557 return fmt.Errorf("rebootTimeout")
ozgecanetsiae11479f2020-07-06 09:44:47 +0300558 case data := <-responseChannel:
559 switch data.Data.(OmciMessage).OmciMsg.MessageType {
560 case omci.RebootResponseType:
561 {
562 msgLayer := (*data.Data.(OmciMessage).OmciPacket).Layer(omci.LayerTypeRebootResponse)
563 if msgLayer == nil {
Andrea Campanella6515c582020-10-05 11:25:00 +0200564 return fmt.Errorf("omci Msg layer could not be detected for RebootResponseType")
ozgecanetsiae11479f2020-07-06 09:44:47 +0300565 }
Andrea Campanellabef4e542020-10-22 11:01:28 +0200566 msgObj, msgOk := msgLayer.(*omci.RebootResponse)
ozgecanetsiae11479f2020-07-06 09:44:47 +0300567 if !msgOk {
Andrea Campanella6515c582020-10-05 11:25:00 +0200568 return fmt.Errorf("omci Msg layer could not be assigned for RebootResponseType %s", oo.deviceID)
ozgecanetsiae11479f2020-07-06 09:44:47 +0300569 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000570 logger.Debugw(ctx, "RebootResponse data", log.Fields{"device-id": oo.deviceID, "data-fields": msgObj})
ozgecanetsiae11479f2020-07-06 09:44:47 +0300571 if msgObj.Result != me.Success {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000572 logger.Errorw(ctx, "Omci RebootResponse result error", log.Fields{"device-id": oo.deviceID, "Error": msgObj.Result})
ozgecanetsiae11479f2020-07-06 09:44:47 +0300573 // possibly force FSM into abort or ignore some errors for some messages? store error for mgmt display?
Andrea Campanellabef4e542020-10-22 11:01:28 +0200574 return fmt.Errorf("omci RebootResponse result error indication %s for device %s",
Andrea Campanella6515c582020-10-05 11:25:00 +0200575 msgObj.Result, oo.deviceID)
ozgecanetsiae11479f2020-07-06 09:44:47 +0300576 }
577 return nil
578 }
579 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000580 logger.Warnw(ctx, "Reboot response message type error", log.Fields{"for device-id": oo.deviceID})
Andrea Campanella6515c582020-10-05 11:25:00 +0200581 return fmt.Errorf("unexpected OmciResponse type received %s", oo.deviceID)
ozgecanetsiae11479f2020-07-06 09:44:47 +0300582 }
583}
584
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000585//Relay the InSync message via Handler to Rw core - Status update
dbainbri4d3a0dc2020-12-02 00:33:42 +0000586func (oo *OnuDeviceEntry) transferSystemEvent(ctx context.Context, devEvent OnuDeviceEvent) {
587 logger.Debugw(ctx, "relaying system-event", log.Fields{"Event": devEvent})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000588 // decouple the handler transfer from further processing here
589 // TODO!!! check if really no synch is required within the system e.g. to ensure following steps ..
Himani Chawla26e555c2020-08-31 12:30:20 +0530590 if devEvent == MibDatabaseSync {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000591 if oo.devState < MibDatabaseSync { //devState has not been synced yet
592 oo.devState = MibDatabaseSync
dbainbri4d3a0dc2020-12-02 00:33:42 +0000593 go oo.baseDeviceHandler.deviceProcStatusUpdate(ctx, devEvent)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000594 //TODO!!! device control: next step: start MIB capability verification from here ?!!!
595 } else {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000596 logger.Debugw(ctx, "mibinsync-event in some already synced state - ignored", log.Fields{"state": oo.devState})
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000597 }
Himani Chawla26e555c2020-08-31 12:30:20 +0530598 } else if devEvent == MibDownloadDone {
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000599 if oo.devState < MibDownloadDone { //devState has not been synced yet
600 oo.devState = MibDownloadDone
dbainbri4d3a0dc2020-12-02 00:33:42 +0000601 go oo.baseDeviceHandler.deviceProcStatusUpdate(ctx, devEvent)
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000602 } else {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000603 logger.Debugw(ctx, "mibdownloaddone-event was already seen - ignored", log.Fields{"state": oo.devState})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000604 }
605 } else {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000606 logger.Warnw(ctx, "device-event not yet handled", log.Fields{"state": devEvent})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000607 }
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000608}
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000609
610func (oo *OnuDeviceEntry) restoreDataFromOnuKvStore(ctx context.Context) error {
611 if oo.onuKVStore == nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000612 logger.Debugw(ctx, "onuKVStore not set - abort", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000613 return fmt.Errorf(fmt.Sprintf("onuKVStore-not-set-abort-%s", oo.deviceID))
614 }
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000615 oo.mutexPersOnuConfig.Lock()
616 defer oo.mutexPersOnuConfig.Unlock()
Holger Hildebrandtbe523842021-03-10 10:47:18 +0000617 oo.sOnuPersistentData =
Mahir Gunyel7f4483a2021-05-06 12:53:43 -0700618 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 +0000619 oo.mutexOnuKVStore.RLock()
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000620 Value, err := oo.onuKVStore.Get(ctx, oo.onuKVStorePath)
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000621 oo.mutexOnuKVStore.RUnlock()
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000622 if err == nil {
623 if Value != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000624 logger.Debugw(ctx, "ONU-data read",
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000625 log.Fields{"Key": Value.Key, "device-id": oo.deviceID})
626 tmpBytes, _ := kvstore.ToByte(Value.Value)
627
628 if err = json.Unmarshal(tmpBytes, &oo.sOnuPersistentData); err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000629 logger.Errorw(ctx, "unable to unmarshal ONU-data", log.Fields{"error": err, "device-id": oo.deviceID})
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000630 return fmt.Errorf(fmt.Sprintf("unable-to-unmarshal-ONU-data-%s", oo.deviceID))
631 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000632 logger.Debugw(ctx, "ONU-data", log.Fields{"sOnuPersistentData": oo.sOnuPersistentData,
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000633 "device-id": oo.deviceID})
634 } else {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000635 logger.Debugw(ctx, "no ONU-data found", log.Fields{"path": oo.onuKVStorePath, "device-id": oo.deviceID})
mpagenko2418ab02020-11-12 12:58:06 +0000636 return fmt.Errorf("no-ONU-data-found")
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000637 }
638 } else {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000639 logger.Errorw(ctx, "unable to read from KVstore", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000640 return fmt.Errorf(fmt.Sprintf("unable-to-read-from-KVstore-%s", oo.deviceID))
641 }
642 return nil
643}
644
645func (oo *OnuDeviceEntry) deleteDataFromOnuKvStore(ctx context.Context, wg *sync.WaitGroup) {
646 defer wg.Done()
647
648 if oo.onuKVStore == nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000649 logger.Debugw(ctx, "onuKVStore not set - abort", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000650 oo.setKvProcessingErrorIndication(errors.New("onu-data delete aborted: onuKVStore not set"))
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000651 return
652 }
653 var processingStep uint8 = 1 // used to synchronize the different processing steps with chOnuKvProcessingStep
654 go oo.deletePersistentData(ctx, processingStep)
655 if !oo.waitForTimeoutOrCompletion(ctx, oo.chOnuKvProcessingStep, processingStep) {
656 //timeout or error detected
dbainbri4d3a0dc2020-12-02 00:33:42 +0000657 logger.Debugw(ctx, "ONU-data not deleted - abort", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000658 oo.setKvProcessingErrorIndication(errors.New("onu-data delete aborted: during kv-access"))
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000659 return
660 }
661}
662
663func (oo *OnuDeviceEntry) deletePersistentData(ctx context.Context, aProcessingStep uint8) {
664
dbainbri4d3a0dc2020-12-02 00:33:42 +0000665 logger.Debugw(ctx, "delete and clear internal persistency data", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandtdaf0f722021-02-12 11:50:30 +0000666
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000667 oo.mutexPersOnuConfig.Lock()
668 defer oo.mutexPersOnuConfig.Unlock()
Holger Hildebrandtdaf0f722021-02-12 11:50:30 +0000669
Holger Hildebrandtbe523842021-03-10 10:47:18 +0000670 oo.sOnuPersistentData.PersUniConfig = nil //releasing all UniConfig entries to garbage collector default entry
671 oo.sOnuPersistentData =
Mahir Gunyel7f4483a2021-05-06 12:53:43 -0700672 onuPersistentData{0, 0, "", "", "", "", "", "", "", false, false, oo.mibAuditInterval, 0, 0, make([]uniPersConfig, 0), oo.alarmAuditInterval, make(map[uint16]uint16)}
dbainbri4d3a0dc2020-12-02 00:33:42 +0000673 logger.Debugw(ctx, "delete ONU-data from KVStore", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000674 oo.mutexOnuKVStore.Lock()
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000675 err := oo.onuKVStore.Delete(ctx, oo.onuKVStorePath)
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000676 oo.mutexOnuKVStore.Unlock()
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000677 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000678 logger.Errorw(ctx, "unable to delete in KVstore", log.Fields{"device-id": oo.deviceID, "err": err})
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000679 oo.chOnuKvProcessingStep <- 0 //error indication
680 return
681 }
682 oo.chOnuKvProcessingStep <- aProcessingStep //done
683}
684
685func (oo *OnuDeviceEntry) updateOnuKvStore(ctx context.Context, wg *sync.WaitGroup) {
686 defer wg.Done()
687
688 if oo.onuKVStore == nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000689 logger.Debugw(ctx, "onuKVStore not set - abort", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000690 oo.setKvProcessingErrorIndication(errors.New("onu-data update aborted: onuKVStore not set"))
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000691 return
692 }
693 var processingStep uint8 = 1 // used to synchronize the different processing steps with chOnuKvProcessingStep
694 go oo.storeDataInOnuKvStore(ctx, processingStep)
695 if !oo.waitForTimeoutOrCompletion(ctx, oo.chOnuKvProcessingStep, processingStep) {
696 //timeout or error detected
dbainbri4d3a0dc2020-12-02 00:33:42 +0000697 logger.Debugw(ctx, "ONU-data not written - abort", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000698 oo.setKvProcessingErrorIndication(errors.New("onu-data update aborted: during writing process"))
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000699 return
700 }
701}
702
703func (oo *OnuDeviceEntry) storeDataInOnuKvStore(ctx context.Context, aProcessingStep uint8) {
704
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000705 oo.mutexPersOnuConfig.Lock()
706 defer oo.mutexPersOnuConfig.Unlock()
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000707 //assign values which are not already present when newOnuDeviceEntry() is called
708 oo.sOnuPersistentData.PersOnuID = oo.baseDeviceHandler.pOnuIndication.OnuId
709 oo.sOnuPersistentData.PersIntfID = oo.baseDeviceHandler.pOnuIndication.IntfId
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000710 //TODO: verify usage of these values during restart UC
Holger Hildebrandt3a644642020-12-02 09:46:18 +0000711 oo.sOnuPersistentData.PersAdminState = oo.baseDeviceHandler.pOnuIndication.AdminState
712 oo.sOnuPersistentData.PersOperState = oo.baseDeviceHandler.pOnuIndication.OperState
Holger Hildebrandtdaf0f722021-02-12 11:50:30 +0000713
dbainbri4d3a0dc2020-12-02 00:33:42 +0000714 logger.Debugw(ctx, "Update ONU-data in KVStore", log.Fields{"device-id": oo.deviceID, "sOnuPersistentData": oo.sOnuPersistentData})
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000715
716 Value, err := json.Marshal(oo.sOnuPersistentData)
717 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000718 logger.Errorw(ctx, "unable to marshal ONU-data", log.Fields{"sOnuPersistentData": oo.sOnuPersistentData,
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000719 "device-id": oo.deviceID, "err": err})
720 oo.chOnuKvProcessingStep <- 0 //error indication
721 return
722 }
Holger Hildebrandtff05b682021-03-16 15:02:05 +0000723 oo.pOpenOnuAc.lockDeviceHandlersMap.RLock()
724 if _, exist := oo.pOpenOnuAc.deviceHandlers[oo.deviceID]; !exist {
725 logger.Debugw(ctx, "delete_device in progress - skip write request", log.Fields{"device-id": oo.deviceID})
726 oo.chOnuKvProcessingStep <- aProcessingStep
727 oo.pOpenOnuAc.lockDeviceHandlersMap.RUnlock()
728 return
729 }
730 oo.baseDeviceHandler.mutexDeletionInProgressFlag.RLock()
731 if oo.baseDeviceHandler.deletionInProgress {
732 logger.Debugw(ctx, "delete_device in progress - skip write request", log.Fields{"device-id": oo.deviceID})
733 oo.chOnuKvProcessingStep <- aProcessingStep
734 oo.pOpenOnuAc.lockDeviceHandlersMap.RUnlock()
735 oo.baseDeviceHandler.mutexDeletionInProgressFlag.RUnlock()
736 return
737 }
738 oo.pOpenOnuAc.lockDeviceHandlersMap.RUnlock()
739 oo.baseDeviceHandler.mutexDeletionInProgressFlag.RUnlock()
740
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000741 oo.mutexOnuKVStore.Lock()
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000742 err = oo.onuKVStore.Put(ctx, oo.onuKVStorePath, Value)
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000743 oo.mutexOnuKVStore.Unlock()
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000744 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000745 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 +0000746 oo.chOnuKvProcessingStep <- 0 //error indication
747 return
748 }
749 oo.chOnuKvProcessingStep <- aProcessingStep //done
750}
751
dbainbri4d3a0dc2020-12-02 00:33:42 +0000752func (oo *OnuDeviceEntry) updateOnuUniTpPath(ctx context.Context, aUniID uint8, aTpID uint8, aPathString string) bool {
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000753 /* within some specific InterAdapter processing request write/read access to data is ensured to be sequentially,
754 as also the complete sequence is ensured to 'run to completion' before some new request is accepted
755 no specific concurrency protection to sOnuPersistentData is required here
756 */
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000757 oo.mutexPersOnuConfig.Lock()
758 defer oo.mutexPersOnuConfig.Unlock()
Holger Hildebrandtdaf0f722021-02-12 11:50:30 +0000759
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000760 for k, v := range oo.sOnuPersistentData.PersUniConfig {
761 if v.PersUniID == aUniID {
Girish Gowdra041dcb32020-11-16 16:54:30 -0800762 existingPath, ok := oo.sOnuPersistentData.PersUniConfig[k].PersTpPathMap[aTpID]
Mahir Gunyel7f4483a2021-05-06 12:53:43 -0700763 logger.Debugw(ctx, "PersUniConfig-entry exists", log.Fields{"device-id": oo.deviceID, "uniID": aUniID,
764 "tpID": aTpID, "path": aPathString, "existingPath": existingPath, "ok": ok})
Girish Gowdra041dcb32020-11-16 16:54:30 -0800765 if !ok {
mpagenko30f28442021-03-24 09:24:04 +0000766 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 -0800767 }
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000768 if existingPath != aPathString {
769 if aPathString == "" {
770 //existing entry to be deleted
dbainbri4d3a0dc2020-12-02 00:33:42 +0000771 logger.Debugw(ctx, "UniTp delete path value", log.Fields{"device-id": oo.deviceID, "uniID": aUniID, "path": aPathString})
Girish Gowdra041dcb32020-11-16 16:54:30 -0800772 oo.sOnuPersistentData.PersUniConfig[k].PersTpPathMap[aTpID] = ""
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000773 } else {
774 //existing entry to be modified
dbainbri4d3a0dc2020-12-02 00:33:42 +0000775 logger.Debugw(ctx, "UniTp modify path value", log.Fields{"device-id": oo.deviceID, "uniID": aUniID, "path": aPathString})
Girish Gowdra041dcb32020-11-16 16:54:30 -0800776 oo.sOnuPersistentData.PersUniConfig[k].PersTpPathMap[aTpID] = aPathString
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000777 }
778 return true
779 }
780 //entry already exists
mpagenkofc4f56e2020-11-04 17:17:49 +0000781 if aPathString == "" {
782 //no active TechProfile
dbainbri4d3a0dc2020-12-02 00:33:42 +0000783 logger.Debugw(ctx, "UniTp path has already been removed - no AniSide config to be removed", log.Fields{
mpagenkofc4f56e2020-11-04 17:17:49 +0000784 "device-id": oo.deviceID, "uniID": aUniID})
mpagenkofc4f56e2020-11-04 17:17:49 +0000785 } else {
786 //the given TechProfile already exists and is assumed to be active - update devReason as if the config has been done here
787 //was needed e.g. in voltha POD Tests:Validate authentication on a disabled ONU
788 // (as here the TechProfile has not been removed with the disable-device before the new enable-device)
dbainbri4d3a0dc2020-12-02 00:33:42 +0000789 logger.Debugw(ctx, "UniTp path already exists - TechProfile supposed to be active", log.Fields{
mpagenkofc4f56e2020-11-04 17:17:49 +0000790 "device-id": oo.deviceID, "uniID": aUniID, "path": aPathString})
791 //no deviceReason update (deviceProcStatusUpdate) here to ensure 'omci_flows_pushed' state within disable/enable procedure of ATT scenario
792 // (during which the flows are removed/re-assigned but the techProf is left active)
793 //and as the TechProfile is regarded as active we have to verify, if some flow configuration still waits on it
794 // (should not be the case, but should not harm or be more robust ...)
mpagenko2418ab02020-11-12 12:58:06 +0000795 // and to be sure, that for some reason the corresponding TpDelete was lost somewhere in history
796 // we also reset a possibly outstanding delete request - repeated TpConfig is regarded as valid for waiting flow config
797 if oo.baseDeviceHandler.pOnuTP != nil {
Girish Gowdra041dcb32020-11-16 16:54:30 -0800798 oo.baseDeviceHandler.pOnuTP.setProfileToDelete(aUniID, aTpID, false)
mpagenko2418ab02020-11-12 12:58:06 +0000799 }
mpagenko551a4d42020-12-08 18:09:20 +0000800 go oo.baseDeviceHandler.VerifyVlanConfigRequest(ctx, aUniID, aTpID)
mpagenkofc4f56e2020-11-04 17:17:49 +0000801 }
802 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 +0000803 }
804 }
805 //no entry exists for uniId
806
807 if aPathString == "" {
808 //delete request in non-existing state , accept as no change
dbainbri4d3a0dc2020-12-02 00:33:42 +0000809 logger.Debugw(ctx, "UniTp path already removed", log.Fields{"device-id": oo.deviceID, "uniID": aUniID})
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000810 return false
811 }
812 //new entry to be created
dbainbri4d3a0dc2020-12-02 00:33:42 +0000813 logger.Debugw(ctx, "New UniTp path set", log.Fields{"device-id": oo.deviceID, "uniID": aUniID, "path": aPathString})
Girish Gowdra041dcb32020-11-16 16:54:30 -0800814 perSubTpPathMap := make(map[uint8]string)
815 perSubTpPathMap[aTpID] = aPathString
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000816 oo.sOnuPersistentData.PersUniConfig =
Girish Gowdra041dcb32020-11-16 16:54:30 -0800817 append(oo.sOnuPersistentData.PersUniConfig, uniPersConfig{PersUniID: aUniID, PersTpPathMap: perSubTpPathMap, PersFlowParams: make([]uniVlanFlowParams, 0)})
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000818 return true
819}
820
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000821func (oo *OnuDeviceEntry) updateOnuUniFlowConfig(aUniID uint8, aUniVlanFlowParams *[]uniVlanFlowParams) {
822
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000823 oo.mutexPersOnuConfig.Lock()
824 defer oo.mutexPersOnuConfig.Unlock()
Holger Hildebrandtdaf0f722021-02-12 11:50:30 +0000825
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000826 for k, v := range oo.sOnuPersistentData.PersUniConfig {
827 if v.PersUniID == aUniID {
828 oo.sOnuPersistentData.PersUniConfig[k].PersFlowParams = make([]uniVlanFlowParams, len(*aUniVlanFlowParams))
829 copy(oo.sOnuPersistentData.PersUniConfig[k].PersFlowParams, *aUniVlanFlowParams)
830 return
831 }
832 }
833 //flow update was faster than tp-config - create PersUniConfig-entry
mpagenko30f28442021-03-24 09:24:04 +0000834 //TODO!!: following activity to 'add' some new uni entry might not be quite correct if this function is called to clear the data
835 // (e.g after flow removal from RemoveUniFlowParams()).
836 // 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
837 // 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
838 // 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 -0800839 tmpConfig := uniPersConfig{PersUniID: aUniID, PersTpPathMap: make(map[uint8]string), PersFlowParams: make([]uniVlanFlowParams, len(*aUniVlanFlowParams))}
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000840 copy(tmpConfig.PersFlowParams, *aUniVlanFlowParams)
841 oo.sOnuPersistentData.PersUniConfig = append(oo.sOnuPersistentData.PersUniConfig, tmpConfig)
842}
843
844func (oo *OnuDeviceEntry) waitForTimeoutOrCompletion(
845 ctx context.Context, aChOnuProcessingStep <-chan uint8, aProcessingStep uint8) bool {
846 select {
847 case <-ctx.Done():
dbainbri4d3a0dc2020-12-02 00:33:42 +0000848 logger.Warnw(ctx, "processing not completed in-time!",
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000849 log.Fields{"device-id": oo.deviceID, "error": ctx.Err()})
850 return false
851 case rxStep := <-aChOnuProcessingStep:
852 if rxStep == aProcessingStep {
853 return true
854 }
855 //all other values are not accepted - including 0 for error indication
dbainbri4d3a0dc2020-12-02 00:33:42 +0000856 logger.Warnw(ctx, "Invalid processing step received: abort!",
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000857 log.Fields{"device-id": oo.deviceID,
858 "wantedStep": aProcessingStep, "haveStep": rxStep})
859 return false
860 }
861}
862
863func (oo *OnuDeviceEntry) resetKvProcessingErrorIndication() {
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000864 oo.mutexOnuKVStoreProcResult.Lock()
865 oo.onuKVStoreProcResult = nil
866 oo.mutexOnuKVStoreProcResult.Unlock()
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000867}
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000868
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000869func (oo *OnuDeviceEntry) getKvProcessingErrorIndication() error {
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000870 oo.mutexOnuKVStoreProcResult.RLock()
871 value := oo.onuKVStoreProcResult
872 oo.mutexOnuKVStoreProcResult.RUnlock()
873 return value
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000874}
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000875
876func (oo *OnuDeviceEntry) setKvProcessingErrorIndication(value error) {
877 oo.mutexOnuKVStoreProcResult.Lock()
878 oo.onuKVStoreProcResult = value
879 oo.mutexOnuKVStoreProcResult.Unlock()
880}
881
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +0000882func (oo *OnuDeviceEntry) incrementMibDataSync(ctx context.Context) {
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000883 oo.mutexPersOnuConfig.Lock()
884 defer oo.mutexPersOnuConfig.Unlock()
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000885 if oo.sOnuPersistentData.PersMibDataSyncAdpt < 255 {
886 oo.sOnuPersistentData.PersMibDataSyncAdpt++
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +0000887 } else {
888 // per G.984 and G.988 overflow starts over at 1 given 0 is reserved for reset
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000889 oo.sOnuPersistentData.PersMibDataSyncAdpt = 1
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +0000890 }
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000891 logger.Debugf(ctx, "mibDataSync updated - mds: %d - device-id: %s", oo.sOnuPersistentData.PersMibDataSyncAdpt, oo.deviceID)
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +0000892}
Holger Hildebrandtbe523842021-03-10 10:47:18 +0000893
mpagenko9c225032021-10-15 14:26:49 +0000894// ModifySwImageInactiveVersion - updates the inactive SW image version stored
895func (oo *OnuDeviceEntry) ModifySwImageInactiveVersion(ctx context.Context, aImageVersion string) {
896 oo.mutexOnuSwImageIndications.Lock()
897 defer oo.mutexOnuSwImageIndications.Unlock()
898 logger.Debugw(ctx, "software-image set inactive version", log.Fields{
899 "device-id": oo.deviceID, "version": aImageVersion})
900 oo.onuSwImageIndications.inactiveEntityEntry.version = aImageVersion
901 //inactive SW version is not part of persistency data (yet) - no need to update that
902}
903
904// ModifySwImageActiveCommit - updates the active SW commit flag stored
905func (oo *OnuDeviceEntry) ModifySwImageActiveCommit(ctx context.Context, aCommitted uint8) {
906 oo.mutexOnuSwImageIndications.Lock()
907 defer oo.mutexOnuSwImageIndications.Unlock()
908 logger.Debugw(ctx, "software-image set active entity commit flag", log.Fields{
909 "device-id": oo.deviceID, "committed": aCommitted})
910 oo.onuSwImageIndications.activeEntityEntry.isCommitted = aCommitted
911 //commit flag is not part of persistency data (yet) - no need to update that
912}
913
ozgecanetsiaf0a76b62021-05-31 17:42:09 +0300914func (oo *OnuDeviceEntry) getActiveImageVersion(ctx context.Context) string {
Holger Hildebrandt05011352021-06-15 09:40:24 +0000915 oo.mutexOnuSwImageIndications.RLock()
ozgecanetsiaf0a76b62021-05-31 17:42:09 +0300916 if oo.onuSwImageIndications.activeEntityEntry.valid {
Holger Hildebrandt05011352021-06-15 09:40:24 +0000917 value := oo.onuSwImageIndications.activeEntityEntry.version
918 oo.mutexOnuSwImageIndications.RUnlock()
919 return value
ozgecanetsiaf0a76b62021-05-31 17:42:09 +0300920 }
Holger Hildebrandt05011352021-06-15 09:40:24 +0000921 oo.mutexOnuSwImageIndications.RUnlock()
ozgecanetsiaf0a76b62021-05-31 17:42:09 +0300922 logger.Debugw(ctx, "Active Image is not valid", log.Fields{"device-id": oo.deviceID})
923 return ""
924}
925
926func (oo *OnuDeviceEntry) getInactiveImageVersion(ctx context.Context) string {
Holger Hildebrandt05011352021-06-15 09:40:24 +0000927 oo.mutexOnuSwImageIndications.RLock()
ozgecanetsiaf0a76b62021-05-31 17:42:09 +0300928 if oo.onuSwImageIndications.inactiveEntityEntry.valid {
Holger Hildebrandt05011352021-06-15 09:40:24 +0000929 value := oo.onuSwImageIndications.inactiveEntityEntry.version
930 oo.mutexOnuSwImageIndications.RUnlock()
931 return value
ozgecanetsiaf0a76b62021-05-31 17:42:09 +0300932 }
Holger Hildebrandt05011352021-06-15 09:40:24 +0000933 oo.mutexOnuSwImageIndications.RUnlock()
ozgecanetsiaf0a76b62021-05-31 17:42:09 +0300934 logger.Debugw(ctx, "Inactive Image is not valid", log.Fields{"device-id": oo.deviceID})
935 return ""
936}
937
Holger Hildebrandtbe523842021-03-10 10:47:18 +0000938func (oo *OnuDeviceEntry) buildMibTemplatePath() string {
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000939 oo.mutexPersOnuConfig.RLock()
940 defer oo.mutexPersOnuConfig.RUnlock()
Holger Hildebrandtbe523842021-03-10 10:47:18 +0000941 return fmt.Sprintf(cSuffixMibTemplateKvStore, oo.sOnuPersistentData.PersVendorID, oo.sOnuPersistentData.PersEquipmentID, oo.sOnuPersistentData.PersActiveSwVersion)
942}
Mahir Gunyel7f4483a2021-05-06 12:53:43 -0700943
944func (oo *OnuDeviceEntry) allocateFreeTcont(ctx context.Context, allocID uint16) (uint16, bool, error) {
945 logger.Debugw(ctx, "allocate-free-tcont", log.Fields{"device-id": oo.deviceID, "allocID": allocID,
946 "allocated-instances": oo.sOnuPersistentData.PersTcontMap})
947
mpagenkob59fbed2021-11-23 16:55:20 +0000948 oo.mutexPersOnuConfig.Lock()
949 defer oo.mutexPersOnuConfig.Unlock()
Mahir Gunyel7f4483a2021-05-06 12:53:43 -0700950 if entityID, ok := oo.sOnuPersistentData.PersTcontMap[allocID]; ok {
951 //tcont already allocated before, return the used instance-id
952 return entityID, true, nil
953 }
954 //First allocation of tcont. Find a free instance
955 if tcontInstKeys := oo.pOnuDB.getSortedInstKeys(ctx, me.TContClassID); len(tcontInstKeys) > 0 {
956 logger.Debugw(ctx, "allocate-free-tcont-db-keys", log.Fields{"device-id": oo.deviceID, "keys": tcontInstKeys})
957 for _, instID := range tcontInstKeys {
958 instExist := false
959 //If this instance exist in map, it means it is not empty. It is allocated before
960 for _, v := range oo.sOnuPersistentData.PersTcontMap {
961 if v == instID {
962 instExist = true
963 break
964 }
965 }
966 if !instExist {
967 oo.sOnuPersistentData.PersTcontMap[allocID] = instID
968 return instID, false, nil
969 }
970 }
971 }
972 return 0, false, fmt.Errorf(fmt.Sprintf("no-free-tcont-left-for-device-%s", oo.deviceID))
Mahir Gunyel7f4483a2021-05-06 12:53:43 -0700973}
974
975func (oo *OnuDeviceEntry) freeTcont(ctx context.Context, allocID uint16) {
976 logger.Debugw(ctx, "free-tcont", log.Fields{"device-id": oo.deviceID, "alloc": allocID})
mpagenkob59fbed2021-11-23 16:55:20 +0000977 oo.mutexPersOnuConfig.Lock()
978 defer oo.mutexPersOnuConfig.Unlock()
Mahir Gunyel7f4483a2021-05-06 12:53:43 -0700979 delete(oo.sOnuPersistentData.PersTcontMap, allocID)
980}