blob: 7f9cfda7776064ae5b8c3970287594edd1c52413 [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"
dbainbri4d3a0dc2020-12-02 00:33:42 +000035 "github.com/opencord/voltha-lib-go/v4/pkg/adapters/adapterif"
36 "github.com/opencord/voltha-lib-go/v4/pkg/db"
37 "github.com/opencord/voltha-lib-go/v4/pkg/db/kvstore"
Holger Hildebrandtfa074992020-03-27 15:42:06 +000038
dbainbri4d3a0dc2020-12-02 00:33:42 +000039 //"github.com/opencord/voltha-lib-go/v4/pkg/kafka"
40 "github.com/opencord/voltha-lib-go/v4/pkg/log"
41 //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
213 //swIsInactive = 0 not yet used
214 swIsActive = 1
215)
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +0000216const onuDataMeID = 0
Himani Chawla6d2ae152020-09-02 13:11:20 +0530217const onugMeID = 0
218const onu2gMeID = 0
219const ipHostConfigDataMeID = 1
220const onugSerialNumberLen = 8
221const omciMacAddressLen = 6
Holger Hildebrandtc54939a2020-06-17 08:14:27 +0000222
Holger Hildebrandt2fb70892020-10-28 11:53:18 +0000223const cEmptyMacAddrString = "000000000000"
224const cEmptySerialNumberString = "0000000000000000"
225
mpagenko15ff4a52021-03-02 10:09:20 +0000226type sEntrySwImageIndication struct {
227 valid bool
228 entityID uint16
229 version string
230 isCommitted uint8
231}
232type sSwImageIndications struct {
233 activeEntityEntry sEntrySwImageIndication
234 inactiveEntityEntry sEntrySwImageIndication
Holger Hildebrandtc54939a2020-06-17 08:14:27 +0000235}
236
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000237type uniPersConfig struct {
238 PersUniID uint8 `json:"uni_id"`
Girish Gowdra041dcb32020-11-16 16:54:30 -0800239 PersTpPathMap map[uint8]string `json:"PersTpPathMap"` // tp-id to tp-path map
240 PersFlowParams []uniVlanFlowParams `json:"flow_params"` //as defined in omci_ani_config.go
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000241}
242
243type onuPersistentData struct {
Himani Chawla075f1642021-03-15 19:23:24 +0530244 PersOnuID uint32 `json:"onu_id"`
245 PersIntfID uint32 `json:"intf_id"`
246 PersSerialNumber string `json:"serial_number"`
247 PersMacAddress string `json:"mac_address"`
248 PersVendorID string `json:"vendor_id"`
249 PersEquipmentID string `json:"equipment_id"`
250 PersActiveSwVersion string `json:"active_sw_version"`
251 PersAdminState string `json:"admin_state"`
252 PersOperState string `json:"oper_state"`
253 PersUniUnlockDone bool `json:"uni_unlock_done"`
254 PersUniDisableDone bool `json:"uni_disable_done"`
255 PersMibAuditInterval time.Duration `json:"mib_audit_interval"`
256 PersMibLastDbSync uint32 `json:"mib_last_db_sync"`
257 PersMibDataSyncAdpt uint8 `json:"mib_data_sync_adpt"`
258 PersUniConfig []uniPersConfig `json:"uni_config"`
259 PersAlarmAuditInterval time.Duration `json:"alarm_audit_interval"`
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000260}
261
Himani Chawla6d2ae152020-09-02 13:11:20 +0530262// OnuDeviceEntry - ONU device info and FSM events.
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000263type OnuDeviceEntry struct {
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000264 deviceID string
265 baseDeviceHandler *deviceHandler
Holger Hildebrandt61b24d02020-11-16 13:36:40 +0000266 pOpenOnuAc *OpenONUAC
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000267 coreProxy adapterif.CoreProxy
268 adapterProxy adapterif.AdapterProxy
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000269 PDevOmciCC *omciCC
270 pOnuDB *onuDeviceDB
271 mibTemplateKVStore *db.Backend
Holger Hildebrandtdaf0f722021-02-12 11:50:30 +0000272 persUniConfigMutex sync.RWMutex
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000273 sOnuPersistentData onuPersistentData
Holger Hildebrandt61b24d02020-11-16 13:36:40 +0000274 mibTemplatePath string
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000275 onuKVStoreMutex sync.RWMutex
276 onuKVStore *db.Backend
277 onuKVStorePath string
278 onuKVStoreprocResult error //error indication of processing
279 chOnuKvProcessingStep chan uint8
mpagenko15ff4a52021-03-02 10:09:20 +0000280 onuSwImageIndications sSwImageIndications
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000281 //lockDeviceEntries sync.RWMutex
dbainbri4d3a0dc2020-12-02 00:33:42 +0000282 mibDbClass func(context.Context) error
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000283 supportedFsms OmciDeviceFsms
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000284 devState OnuDeviceEvent
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +0000285 // Audit and MDS
Himani Chawla075f1642021-03-15 19:23:24 +0530286 mibAuditInterval time.Duration
287 alarmAuditInterval time.Duration
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000288 // TODO: periodical mib resync will be implemented with story VOL-3792
289 //mibNextDbResync uint32
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000290
291 // for mibUpload
mpagenko01499812021-03-25 10:37:12 +0000292 pMibUploadFsm *AdapterFsm //could be handled dynamically and more general as pAdapterFsm - perhaps later
293 lastTxParamStruct sLastTxMeParameter
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000294 // for mibDownload
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000295 pMibDownloadFsm *AdapterFsm //could be handled dynamically and more general as pAdapterFsm - perhaps later
296 //remark: general usage of pAdapterFsm would require generalization of commChan usage and internal event setting
297 // within the FSM event procedures
ozgecanetsiae11479f2020-07-06 09:44:47 +0300298 omciMessageReceived chan bool //seperate channel needed by DownloadFsm
299 omciRebootMessageReceivedChannel chan Message // channel needed by Reboot request
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000300}
301
Himani Chawla6d2ae152020-09-02 13:11:20 +0530302//newOnuDeviceEntry returns a new instance of a OnuDeviceEntry
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000303//mib_db (as well as not inluded alarm_db not really used in this code? VERIFY!!)
Holger Hildebrandt61b24d02020-11-16 13:36:40 +0000304func newOnuDeviceEntry(ctx context.Context, dh *deviceHandler) *OnuDeviceEntry {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000305 logger.Debugw(ctx, "init-onuDeviceEntry", log.Fields{"device-id": dh.deviceID})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000306 var onuDeviceEntry OnuDeviceEntry
Holger Hildebrandt61b24d02020-11-16 13:36:40 +0000307 onuDeviceEntry.deviceID = dh.deviceID
308 onuDeviceEntry.baseDeviceHandler = dh
309 onuDeviceEntry.pOpenOnuAc = dh.pOpenOnuAc
310 onuDeviceEntry.coreProxy = dh.coreProxy
311 onuDeviceEntry.adapterProxy = dh.AdapterProxy
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000312 onuDeviceEntry.devState = DeviceStatusInit
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000313 onuDeviceEntry.sOnuPersistentData.PersUniConfig = make([]uniPersConfig, 0)
314 onuDeviceEntry.chOnuKvProcessingStep = make(chan uint8)
ozgecanetsiae11479f2020-07-06 09:44:47 +0300315 onuDeviceEntry.omciRebootMessageReceivedChannel = make(chan Message, 2048)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000316 //openomciagent.lockDeviceHandlersMap = sync.RWMutex{}
317 //OMCI related databases are on a per-agent basis. State machines and tasks
318 //are per ONU Vendor
319 //
320 // MIB Synchronization Database - possible overloading from arguments
Holger Hildebrandt61b24d02020-11-16 13:36:40 +0000321 if dh.pOpenOnuAc.pSupportedFsms != nil {
322 onuDeviceEntry.supportedFsms = *dh.pOpenOnuAc.pSupportedFsms
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000323 } else {
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000324 // 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 +0000325 //var mibSyncFsm = NewMibSynchronizer()
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000326 // use some internal defaults, if not defined from outside
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000327 onuDeviceEntry.supportedFsms = OmciDeviceFsms{
328 "mib-synchronizer": {
329 //mibSyncFsm, // Implements the MIB synchronization state machine
Himani Chawla6d2ae152020-09-02 13:11:20 +0530330 onuDeviceEntry.mibDbVolatileDict, // Implements volatile ME MIB database
Himani Chawla4d908332020-08-31 12:30:20 +0530331 //true, // Advertise events on OpenOMCI event bus
Holger Hildebrandte3677f12021-02-05 14:50:56 +0000332 dh.pOpenOnuAc.mibAuditInterval, // Time to wait between MIB audits. 0 to disable audits.
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000333 // map[string]func() error{
334 // "mib-upload": onuDeviceEntry.MibUploadTask,
335 // "mib-template": onuDeviceEntry.MibTemplateTask,
336 // "get-mds": onuDeviceEntry.GetMdsTask,
337 // "mib-audit": onuDeviceEntry.GetMdsTask,
338 // "mib-resync": onuDeviceEntry.MibResyncTask,
339 // "mib-reconcile": onuDeviceEntry.MibReconcileTask,
340 // },
341 },
342 }
343 }
344 onuDeviceEntry.mibDbClass = onuDeviceEntry.supportedFsms["mib-synchronizer"].databaseClass
dbainbri4d3a0dc2020-12-02 00:33:42 +0000345 logger.Debug(ctx, "access2mibDbClass")
346 go onuDeviceEntry.mibDbClass(ctx)
Holger Hildebrandtf37b3d72021-02-17 10:25:22 +0000347 if !dh.isReconciling() {
Holger Hildebrandte3677f12021-02-05 14:50:56 +0000348 onuDeviceEntry.mibAuditInterval = onuDeviceEntry.supportedFsms["mib-synchronizer"].auditInterval
349 onuDeviceEntry.sOnuPersistentData.PersMibAuditInterval = onuDeviceEntry.mibAuditInterval
Himani Chawla075f1642021-03-15 19:23:24 +0530350 onuDeviceEntry.alarmAuditInterval = dh.pOpenOnuAc.alarmAuditInterval
351 onuDeviceEntry.sOnuPersistentData.PersAlarmAuditInterval = onuDeviceEntry.alarmAuditInterval
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000352 } else {
Holger Hildebrandte3677f12021-02-05 14:50:56 +0000353 logger.Debugw(ctx, "reconciling - take audit interval from persistent data", log.Fields{"device-id": dh.deviceID})
354 // TODO: This is a preparation for VOL-VOL-3811 to preserve config history in case of
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000355 // vendor- or deviceID-specific configurations via voltctl-commands
Holger Hildebrandte3677f12021-02-05 14:50:56 +0000356 onuDeviceEntry.mibAuditInterval = onuDeviceEntry.sOnuPersistentData.PersMibAuditInterval
Himani Chawla075f1642021-03-15 19:23:24 +0530357 onuDeviceEntry.alarmAuditInterval = onuDeviceEntry.sOnuPersistentData.PersAlarmAuditInterval
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000358 }
Himani Chawla075f1642021-03-15 19:23:24 +0530359 logger.Debugw(ctx, "MibAuditInterval and AlarmAuditInterval is set to", log.Fields{"mib-audit-interval": onuDeviceEntry.mibAuditInterval,
360 "alarm-audit-interval": onuDeviceEntry.alarmAuditInterval})
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000361 // TODO: periodical mib resync will be implemented with story VOL-3792
362 //onuDeviceEntry.mibNextDbResync = 0
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000363
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000364 // Omci related Mib upload sync state machine
365 mibUploadChan := make(chan Message, 2048)
Holger Hildebrandt61b24d02020-11-16 13:36:40 +0000366 onuDeviceEntry.pMibUploadFsm = NewAdapterFsm("MibUpload", dh.deviceID, mibUploadChan)
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000367 onuDeviceEntry.pMibUploadFsm.pFsm = fsm.NewFSM(
mpagenko1cc3cb42020-07-27 15:24:38 +0000368 ulStDisabled,
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000369 fsm.Events{
370
mpagenko1cc3cb42020-07-27 15:24:38 +0000371 {Name: ulEvStart, Src: []string{ulStDisabled}, Dst: ulStStarting},
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000372
mpagenko1cc3cb42020-07-27 15:24:38 +0000373 {Name: ulEvResetMib, Src: []string{ulStStarting}, Dst: ulStResettingMib},
374 {Name: ulEvGetVendorAndSerial, Src: []string{ulStResettingMib}, Dst: ulStGettingVendorAndSerial},
Himani Chawla4d908332020-08-31 12:30:20 +0530375 {Name: ulEvGetEquipmentID, Src: []string{ulStGettingVendorAndSerial}, Dst: ulStGettingEquipmentID},
376 {Name: ulEvGetFirstSwVersion, Src: []string{ulStGettingEquipmentID}, Dst: ulStGettingFirstSwVersion},
mpagenko1cc3cb42020-07-27 15:24:38 +0000377 {Name: ulEvGetSecondSwVersion, Src: []string{ulStGettingFirstSwVersion}, Dst: ulStGettingSecondSwVersion},
378 {Name: ulEvGetMacAddress, Src: []string{ulStGettingSecondSwVersion}, Dst: ulStGettingMacAddress},
379 {Name: ulEvGetMibTemplate, Src: []string{ulStGettingMacAddress}, Dst: ulStGettingMibTemplate},
Holger Hildebrandtc54939a2020-06-17 08:14:27 +0000380
mpagenko1cc3cb42020-07-27 15:24:38 +0000381 {Name: ulEvUploadMib, Src: []string{ulStGettingMibTemplate}, Dst: ulStUploading},
382 {Name: ulEvExamineMds, Src: []string{ulStStarting}, Dst: ulStExaminingMds},
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000383
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000384 {Name: ulEvSuccess, Src: []string{ulStGettingMibTemplate}, Dst: ulStUploadDone},
385 {Name: ulEvSuccess, Src: []string{ulStUploading}, Dst: ulStUploadDone},
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000386
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000387 {Name: ulEvSuccess, Src: []string{ulStUploadDone}, Dst: ulStInSync},
Holger Hildebrandtbe523842021-03-10 10:47:18 +0000388 //{Name: ulEvSuccess, Src: []string{ulStExaminingMds}, Dst: ulStInSync},
389 {Name: ulEvSuccess, Src: []string{ulStExaminingMds}, Dst: ulStExaminingMdsSuccess},
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +0000390 // TODO: As long as mib-resynchronizing is not implemented, failed MDS-examination triggers
391 // mib-reset and new provisioning at this point
392 //{Name: ulEvMismatch, Src: []string{ulStExaminingMds}, Dst: ulStResynchronizing},
393 {Name: ulEvMismatch, Src: []string{ulStExaminingMds}, Dst: ulStResettingMib},
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000394
Holger Hildebrandtbe523842021-03-10 10:47:18 +0000395 {Name: ulEvSuccess, Src: []string{ulStExaminingMdsSuccess}, Dst: ulStInSync},
396 {Name: ulEvMismatch, Src: []string{ulStExaminingMdsSuccess}, Dst: ulStResettingMib},
397
mpagenko1cc3cb42020-07-27 15:24:38 +0000398 {Name: ulEvAuditMib, Src: []string{ulStInSync}, Dst: ulStAuditing},
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000399
mpagenko1cc3cb42020-07-27 15:24:38 +0000400 {Name: ulEvSuccess, Src: []string{ulStOutOfSync}, Dst: ulStInSync},
401 {Name: ulEvAuditMib, Src: []string{ulStOutOfSync}, Dst: ulStAuditing},
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000402
mpagenko1cc3cb42020-07-27 15:24:38 +0000403 {Name: ulEvSuccess, Src: []string{ulStAuditing}, Dst: ulStInSync},
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000404 {Name: ulEvMismatch, Src: []string{ulStAuditing}, Dst: ulStReAuditing},
mpagenko1cc3cb42020-07-27 15:24:38 +0000405 {Name: ulEvForceResync, Src: []string{ulStAuditing}, Dst: ulStResynchronizing},
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000406
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000407 {Name: ulEvSuccess, Src: []string{ulStReAuditing}, Dst: ulStInSync},
408 {Name: ulEvMismatch, Src: []string{ulStReAuditing}, Dst: ulStResettingMib},
409
mpagenko1cc3cb42020-07-27 15:24:38 +0000410 {Name: ulEvSuccess, Src: []string{ulStResynchronizing}, Dst: ulStInSync},
411 {Name: ulEvDiffsFound, Src: []string{ulStResynchronizing}, Dst: ulStOutOfSync},
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000412
Himani Chawla4d908332020-08-31 12:30:20 +0530413 {Name: ulEvTimeout, Src: []string{ulStResettingMib, ulStGettingVendorAndSerial, ulStGettingEquipmentID, ulStGettingFirstSwVersion,
mpagenko1cc3cb42020-07-27 15:24:38 +0000414 ulStGettingSecondSwVersion, ulStGettingMacAddress, ulStGettingMibTemplate, ulStUploading, ulStResynchronizing, ulStExaminingMds,
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000415 ulStUploadDone, ulStInSync, ulStOutOfSync, ulStAuditing, ulStReAuditing}, Dst: ulStStarting},
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000416
Himani Chawla4d908332020-08-31 12:30:20 +0530417 {Name: ulEvStop, Src: []string{ulStStarting, ulStResettingMib, ulStGettingVendorAndSerial, ulStGettingEquipmentID, ulStGettingFirstSwVersion,
mpagenko1cc3cb42020-07-27 15:24:38 +0000418 ulStGettingSecondSwVersion, ulStGettingMacAddress, ulStGettingMibTemplate, ulStUploading, ulStResynchronizing, ulStExaminingMds,
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000419 ulStUploadDone, ulStInSync, ulStOutOfSync, ulStAuditing, ulStReAuditing}, Dst: ulStDisabled},
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000420 },
421
422 fsm.Callbacks{
dbainbri4d3a0dc2020-12-02 00:33:42 +0000423 "enter_state": func(e *fsm.Event) { onuDeviceEntry.pMibUploadFsm.logFsmStateChange(ctx, e) },
424 "enter_" + ulStStarting: func(e *fsm.Event) { onuDeviceEntry.enterStartingState(ctx, e) },
425 "enter_" + ulStResettingMib: func(e *fsm.Event) { onuDeviceEntry.enterResettingMibState(ctx, e) },
426 "enter_" + ulStGettingVendorAndSerial: func(e *fsm.Event) { onuDeviceEntry.enterGettingVendorAndSerialState(ctx, e) },
427 "enter_" + ulStGettingEquipmentID: func(e *fsm.Event) { onuDeviceEntry.enterGettingEquipmentIDState(ctx, e) },
428 "enter_" + ulStGettingFirstSwVersion: func(e *fsm.Event) { onuDeviceEntry.enterGettingFirstSwVersionState(ctx, e) },
429 "enter_" + ulStGettingSecondSwVersion: func(e *fsm.Event) { onuDeviceEntry.enterGettingSecondSwVersionState(ctx, e) },
430 "enter_" + ulStGettingMacAddress: func(e *fsm.Event) { onuDeviceEntry.enterGettingMacAddressState(ctx, e) },
Holger Hildebrandtbe523842021-03-10 10:47:18 +0000431 "enter_" + ulStGettingMibTemplate: func(e *fsm.Event) { onuDeviceEntry.enterGettingMibTemplateState(ctx, e) },
dbainbri4d3a0dc2020-12-02 00:33:42 +0000432 "enter_" + ulStUploading: func(e *fsm.Event) { onuDeviceEntry.enterUploadingState(ctx, e) },
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000433 "enter_" + ulStUploadDone: func(e *fsm.Event) { onuDeviceEntry.enterUploadDoneState(ctx, e) },
dbainbri4d3a0dc2020-12-02 00:33:42 +0000434 "enter_" + ulStExaminingMds: func(e *fsm.Event) { onuDeviceEntry.enterExaminingMdsState(ctx, e) },
435 "enter_" + ulStResynchronizing: func(e *fsm.Event) { onuDeviceEntry.enterResynchronizingState(ctx, e) },
Holger Hildebrandtbe523842021-03-10 10:47:18 +0000436 "enter_" + ulStExaminingMdsSuccess: func(e *fsm.Event) { onuDeviceEntry.enterExaminingMdsSuccessState(ctx, e) },
dbainbri4d3a0dc2020-12-02 00:33:42 +0000437 "enter_" + ulStAuditing: func(e *fsm.Event) { onuDeviceEntry.enterAuditingState(ctx, e) },
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000438 "enter_" + ulStReAuditing: func(e *fsm.Event) { onuDeviceEntry.enterReAuditingState(ctx, e) },
dbainbri4d3a0dc2020-12-02 00:33:42 +0000439 "enter_" + ulStOutOfSync: func(e *fsm.Event) { onuDeviceEntry.enterOutOfSyncState(ctx, e) },
440 "enter_" + ulStInSync: func(e *fsm.Event) { onuDeviceEntry.enterInSyncState(ctx, e) },
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000441 },
442 )
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000443 // Omci related Mib download state machine
444 mibDownloadChan := make(chan Message, 2048)
Holger Hildebrandt61b24d02020-11-16 13:36:40 +0000445 onuDeviceEntry.pMibDownloadFsm = NewAdapterFsm("MibDownload", dh.deviceID, mibDownloadChan)
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000446 onuDeviceEntry.pMibDownloadFsm.pFsm = fsm.NewFSM(
mpagenko1cc3cb42020-07-27 15:24:38 +0000447 dlStDisabled,
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000448 fsm.Events{
449
mpagenko1cc3cb42020-07-27 15:24:38 +0000450 {Name: dlEvStart, Src: []string{dlStDisabled}, Dst: dlStStarting},
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000451
mpagenko1cc3cb42020-07-27 15:24:38 +0000452 {Name: dlEvCreateGal, Src: []string{dlStStarting}, Dst: dlStCreatingGal},
453 {Name: dlEvRxGalResp, Src: []string{dlStCreatingGal}, Dst: dlStSettingOnu2g},
454 {Name: dlEvRxOnu2gResp, Src: []string{dlStSettingOnu2g}, Dst: dlStBridgeInit},
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000455 // the bridge state is used for multi ME config for alle UNI related ports
456 // maybe such could be reflected in the state machine as well (port number parametrized)
457 // but that looks not straightforward here - so we keep it simple here for the beginning(?)
mpagenko1cc3cb42020-07-27 15:24:38 +0000458 {Name: dlEvRxBridgeResp, Src: []string{dlStBridgeInit}, Dst: dlStDownloaded},
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000459
mpagenko1cc3cb42020-07-27 15:24:38 +0000460 {Name: dlEvTimeoutSimple, Src: []string{dlStCreatingGal, dlStSettingOnu2g}, Dst: dlStStarting},
461 {Name: dlEvTimeoutBridge, Src: []string{dlStBridgeInit}, Dst: dlStStarting},
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000462
mpagenko1cc3cb42020-07-27 15:24:38 +0000463 {Name: dlEvReset, Src: []string{dlStStarting, dlStCreatingGal, dlStSettingOnu2g,
464 dlStBridgeInit, dlStDownloaded}, Dst: dlStResetting},
465 // exceptional treatment for all states except dlStResetting
466 {Name: dlEvRestart, Src: []string{dlStStarting, dlStCreatingGal, dlStSettingOnu2g,
467 dlStBridgeInit, dlStDownloaded, dlStResetting}, Dst: dlStDisabled},
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000468 },
469
470 fsm.Callbacks{
dbainbri4d3a0dc2020-12-02 00:33:42 +0000471 "enter_state": func(e *fsm.Event) { onuDeviceEntry.pMibDownloadFsm.logFsmStateChange(ctx, e) },
472 "enter_" + dlStStarting: func(e *fsm.Event) { onuDeviceEntry.enterDLStartingState(ctx, e) },
473 "enter_" + dlStCreatingGal: func(e *fsm.Event) { onuDeviceEntry.enterCreatingGalState(ctx, e) },
474 "enter_" + dlStSettingOnu2g: func(e *fsm.Event) { onuDeviceEntry.enterSettingOnu2gState(ctx, e) },
475 "enter_" + dlStBridgeInit: func(e *fsm.Event) { onuDeviceEntry.enterBridgeInitState(ctx, e) },
476 "enter_" + dlStDownloaded: func(e *fsm.Event) { onuDeviceEntry.enterDownloadedState(ctx, e) },
477 "enter_" + dlStResetting: func(e *fsm.Event) { onuDeviceEntry.enterResettingState(ctx, e) },
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000478 },
479 )
480 if onuDeviceEntry.pMibDownloadFsm == nil || onuDeviceEntry.pMibDownloadFsm.pFsm == nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000481 logger.Errorw(ctx, "MibDownloadFsm could not be instantiated", log.Fields{"device-id": dh.deviceID})
mpagenko15ff4a52021-03-02 10:09:20 +0000482 // TODO some specific error treatment - or waiting for crash ?
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000483 }
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000484
dbainbri4d3a0dc2020-12-02 00:33:42 +0000485 onuDeviceEntry.mibTemplateKVStore = onuDeviceEntry.baseDeviceHandler.setBackend(ctx, cBasePathMibTemplateKvStore)
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000486 if onuDeviceEntry.mibTemplateKVStore == nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000487 logger.Errorw(ctx, "Can't access mibTemplateKVStore - no backend connection to service",
Holger Hildebrandt61b24d02020-11-16 13:36:40 +0000488 log.Fields{"device-id": dh.deviceID, "service": cBasePathMibTemplateKvStore})
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000489 }
490
491 onuDeviceEntry.onuKVStorePath = onuDeviceEntry.deviceID
Matteo Scandolof1f39a72020-11-24 12:08:11 -0800492 baseKvStorePath := fmt.Sprintf(cBasePathOnuKVStore, dh.pOpenOnuAc.cm.Backend.PathPrefix)
dbainbri4d3a0dc2020-12-02 00:33:42 +0000493 onuDeviceEntry.onuKVStore = onuDeviceEntry.baseDeviceHandler.setBackend(ctx, baseKvStorePath)
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000494 if onuDeviceEntry.onuKVStore == nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000495 logger.Errorw(ctx, "Can't access onuKVStore - no backend connection to service",
Matteo Scandolof1f39a72020-11-24 12:08:11 -0800496 log.Fields{"device-id": dh.deviceID, "service": baseKvStorePath})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000497 }
498
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000499 // Alarm Synchronization Database
Himani Chawlaac1f5ad2021-02-04 21:21:54 +0530500
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000501 //self._alarm_db = None
502 //self._alarm_database_cls = support_classes['alarm-synchronizer']['database']
503 return &onuDeviceEntry
504}
505
Himani Chawla6d2ae152020-09-02 13:11:20 +0530506//start starts (logs) the omci agent
507func (oo *OnuDeviceEntry) start(ctx context.Context) error {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000508 logger.Debugw(ctx, "OnuDeviceEntry-starting", log.Fields{"for device-id": oo.deviceID})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000509 if oo.PDevOmciCC == nil {
mpagenko900ee4b2020-10-12 11:56:34 +0000510 oo.PDevOmciCC = newOmciCC(ctx, oo, oo.deviceID, oo.baseDeviceHandler,
511 oo.coreProxy, oo.adapterProxy)
512 if oo.PDevOmciCC == nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000513 logger.Errorw(ctx, "Could not create devOmciCc - abort", log.Fields{"for device-id": oo.deviceID})
mpagenko900ee4b2020-10-12 11:56:34 +0000514 return fmt.Errorf("could not create devOmciCc %s", oo.deviceID)
515 }
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000516 }
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000517 return nil
518}
519
mpagenko900ee4b2020-10-12 11:56:34 +0000520//stop stops/resets the omciCC
521func (oo *OnuDeviceEntry) stop(ctx context.Context, abResetOmciCC bool) error {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000522 logger.Debugw(ctx, "OnuDeviceEntry-stopping", log.Fields{"for device-id": oo.deviceID})
mpagenko900ee4b2020-10-12 11:56:34 +0000523 if abResetOmciCC && (oo.PDevOmciCC != nil) {
524 _ = oo.PDevOmciCC.stop(ctx)
525 }
526 //to allow for all event notifications again when re-using the device and omciCC
527 oo.devState = DeviceStatusInit
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000528 return nil
529}
530
Himani Chawla6d2ae152020-09-02 13:11:20 +0530531func (oo *OnuDeviceEntry) reboot(ctx context.Context) error {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000532 logger.Debugw(ctx, "OnuDeviceEntry-rebooting", log.Fields{"for device-id": oo.deviceID})
mpagenko900ee4b2020-10-12 11:56:34 +0000533 if oo.PDevOmciCC != nil {
Girish Gowdra0b235842021-03-09 13:06:46 -0800534 if err := oo.PDevOmciCC.sendReboot(ctx, oo.pOpenOnuAc.omciTimeout, true, oo.omciRebootMessageReceivedChannel); err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000535 logger.Errorw(ctx, "onu didn't reboot", log.Fields{"for device-id": oo.deviceID})
mpagenko900ee4b2020-10-12 11:56:34 +0000536 return err
537 }
ozgecanetsiae11479f2020-07-06 09:44:47 +0300538 }
ozgecanetsiae11479f2020-07-06 09:44:47 +0300539 return nil
540}
541
dbainbri4d3a0dc2020-12-02 00:33:42 +0000542func (oo *OnuDeviceEntry) waitForRebootResponse(ctx context.Context, responseChannel chan Message) error {
ozgecanetsiae11479f2020-07-06 09:44:47 +0300543 select {
544 case <-time.After(3 * time.Second): //3s was detected to be to less in 8*8 bbsim test with debug Info/Debug
dbainbri4d3a0dc2020-12-02 00:33:42 +0000545 logger.Warnw(ctx, "Reboot timeout", log.Fields{"for device-id": oo.deviceID})
Andrea Campanella6515c582020-10-05 11:25:00 +0200546 return fmt.Errorf("rebootTimeout")
ozgecanetsiae11479f2020-07-06 09:44:47 +0300547 case data := <-responseChannel:
548 switch data.Data.(OmciMessage).OmciMsg.MessageType {
549 case omci.RebootResponseType:
550 {
551 msgLayer := (*data.Data.(OmciMessage).OmciPacket).Layer(omci.LayerTypeRebootResponse)
552 if msgLayer == nil {
Andrea Campanella6515c582020-10-05 11:25:00 +0200553 return fmt.Errorf("omci Msg layer could not be detected for RebootResponseType")
ozgecanetsiae11479f2020-07-06 09:44:47 +0300554 }
Andrea Campanellabef4e542020-10-22 11:01:28 +0200555 msgObj, msgOk := msgLayer.(*omci.RebootResponse)
ozgecanetsiae11479f2020-07-06 09:44:47 +0300556 if !msgOk {
Andrea Campanella6515c582020-10-05 11:25:00 +0200557 return fmt.Errorf("omci Msg layer could not be assigned for RebootResponseType %s", oo.deviceID)
ozgecanetsiae11479f2020-07-06 09:44:47 +0300558 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000559 logger.Debugw(ctx, "RebootResponse data", log.Fields{"device-id": oo.deviceID, "data-fields": msgObj})
ozgecanetsiae11479f2020-07-06 09:44:47 +0300560 if msgObj.Result != me.Success {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000561 logger.Errorw(ctx, "Omci RebootResponse result error", log.Fields{"device-id": oo.deviceID, "Error": msgObj.Result})
ozgecanetsiae11479f2020-07-06 09:44:47 +0300562 // possibly force FSM into abort or ignore some errors for some messages? store error for mgmt display?
Andrea Campanellabef4e542020-10-22 11:01:28 +0200563 return fmt.Errorf("omci RebootResponse result error indication %s for device %s",
Andrea Campanella6515c582020-10-05 11:25:00 +0200564 msgObj.Result, oo.deviceID)
ozgecanetsiae11479f2020-07-06 09:44:47 +0300565 }
566 return nil
567 }
568 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000569 logger.Warnw(ctx, "Reboot response message type error", log.Fields{"for device-id": oo.deviceID})
Andrea Campanella6515c582020-10-05 11:25:00 +0200570 return fmt.Errorf("unexpected OmciResponse type received %s", oo.deviceID)
ozgecanetsiae11479f2020-07-06 09:44:47 +0300571 }
572}
573
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000574//Relay the InSync message via Handler to Rw core - Status update
dbainbri4d3a0dc2020-12-02 00:33:42 +0000575func (oo *OnuDeviceEntry) transferSystemEvent(ctx context.Context, devEvent OnuDeviceEvent) {
576 logger.Debugw(ctx, "relaying system-event", log.Fields{"Event": devEvent})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000577 // decouple the handler transfer from further processing here
578 // TODO!!! check if really no synch is required within the system e.g. to ensure following steps ..
Himani Chawla26e555c2020-08-31 12:30:20 +0530579 if devEvent == MibDatabaseSync {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000580 if oo.devState < MibDatabaseSync { //devState has not been synced yet
581 oo.devState = MibDatabaseSync
dbainbri4d3a0dc2020-12-02 00:33:42 +0000582 go oo.baseDeviceHandler.deviceProcStatusUpdate(ctx, devEvent)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000583 //TODO!!! device control: next step: start MIB capability verification from here ?!!!
584 } else {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000585 logger.Debugw(ctx, "mibinsync-event in some already synced state - ignored", log.Fields{"state": oo.devState})
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000586 }
Himani Chawla26e555c2020-08-31 12:30:20 +0530587 } else if devEvent == MibDownloadDone {
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000588 if oo.devState < MibDownloadDone { //devState has not been synced yet
589 oo.devState = MibDownloadDone
dbainbri4d3a0dc2020-12-02 00:33:42 +0000590 go oo.baseDeviceHandler.deviceProcStatusUpdate(ctx, devEvent)
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000591 } else {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000592 logger.Debugw(ctx, "mibdownloaddone-event was already seen - ignored", log.Fields{"state": oo.devState})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000593 }
594 } else {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000595 logger.Warnw(ctx, "device-event not yet handled", log.Fields{"state": devEvent})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000596 }
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000597}
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000598
599func (oo *OnuDeviceEntry) restoreDataFromOnuKvStore(ctx context.Context) error {
600 if oo.onuKVStore == nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000601 logger.Debugw(ctx, "onuKVStore not set - abort", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000602 return fmt.Errorf(fmt.Sprintf("onuKVStore-not-set-abort-%s", oo.deviceID))
603 }
Holger Hildebrandtdaf0f722021-02-12 11:50:30 +0000604 oo.persUniConfigMutex.Lock()
605 defer oo.persUniConfigMutex.Unlock()
Holger Hildebrandtbe523842021-03-10 10:47:18 +0000606 oo.sOnuPersistentData =
Himani Chawla075f1642021-03-15 19:23:24 +0530607 onuPersistentData{0, 0, "", "", "", "", "", "", "", false, false, oo.mibAuditInterval, 0, 0, make([]uniPersConfig, 0), oo.alarmAuditInterval}
Holger Hildebrandtdaf0f722021-02-12 11:50:30 +0000608 oo.onuKVStoreMutex.RLock()
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000609 Value, err := oo.onuKVStore.Get(ctx, oo.onuKVStorePath)
Holger Hildebrandtdaf0f722021-02-12 11:50:30 +0000610 oo.onuKVStoreMutex.RUnlock()
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000611 if err == nil {
612 if Value != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000613 logger.Debugw(ctx, "ONU-data read",
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000614 log.Fields{"Key": Value.Key, "device-id": oo.deviceID})
615 tmpBytes, _ := kvstore.ToByte(Value.Value)
616
617 if err = json.Unmarshal(tmpBytes, &oo.sOnuPersistentData); err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000618 logger.Errorw(ctx, "unable to unmarshal ONU-data", log.Fields{"error": err, "device-id": oo.deviceID})
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000619 return fmt.Errorf(fmt.Sprintf("unable-to-unmarshal-ONU-data-%s", oo.deviceID))
620 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000621 logger.Debugw(ctx, "ONU-data", log.Fields{"sOnuPersistentData": oo.sOnuPersistentData,
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000622 "device-id": oo.deviceID})
623 } else {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000624 logger.Debugw(ctx, "no ONU-data found", log.Fields{"path": oo.onuKVStorePath, "device-id": oo.deviceID})
mpagenko2418ab02020-11-12 12:58:06 +0000625 return fmt.Errorf("no-ONU-data-found")
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000626 }
627 } else {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000628 logger.Errorw(ctx, "unable to read from KVstore", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000629 return fmt.Errorf(fmt.Sprintf("unable-to-read-from-KVstore-%s", oo.deviceID))
630 }
631 return nil
632}
633
634func (oo *OnuDeviceEntry) deleteDataFromOnuKvStore(ctx context.Context, wg *sync.WaitGroup) {
635 defer wg.Done()
636
637 if oo.onuKVStore == nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000638 logger.Debugw(ctx, "onuKVStore not set - abort", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000639 oo.onuKVStoreprocResult = errors.New("onu-data delete aborted: onuKVStore not set")
640 return
641 }
642 var processingStep uint8 = 1 // used to synchronize the different processing steps with chOnuKvProcessingStep
643 go oo.deletePersistentData(ctx, processingStep)
644 if !oo.waitForTimeoutOrCompletion(ctx, oo.chOnuKvProcessingStep, processingStep) {
645 //timeout or error detected
dbainbri4d3a0dc2020-12-02 00:33:42 +0000646 logger.Debugw(ctx, "ONU-data not deleted - abort", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000647 oo.onuKVStoreprocResult = errors.New("onu-data delete aborted: during kv-access")
648 return
649 }
650}
651
652func (oo *OnuDeviceEntry) deletePersistentData(ctx context.Context, aProcessingStep uint8) {
653
dbainbri4d3a0dc2020-12-02 00:33:42 +0000654 logger.Debugw(ctx, "delete and clear internal persistency data", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandtdaf0f722021-02-12 11:50:30 +0000655
656 oo.persUniConfigMutex.Lock()
657 defer oo.persUniConfigMutex.Unlock()
658
Holger Hildebrandtbe523842021-03-10 10:47:18 +0000659 oo.sOnuPersistentData.PersUniConfig = nil //releasing all UniConfig entries to garbage collector default entry
660 oo.sOnuPersistentData =
Himani Chawla075f1642021-03-15 19:23:24 +0530661 onuPersistentData{0, 0, "", "", "", "", "", "", "", false, false, oo.mibAuditInterval, 0, 0, make([]uniPersConfig, 0), oo.alarmAuditInterval}
dbainbri4d3a0dc2020-12-02 00:33:42 +0000662 logger.Debugw(ctx, "delete ONU-data from KVStore", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandtdaf0f722021-02-12 11:50:30 +0000663 oo.onuKVStoreMutex.Lock()
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000664 err := oo.onuKVStore.Delete(ctx, oo.onuKVStorePath)
Holger Hildebrandtdaf0f722021-02-12 11:50:30 +0000665 oo.onuKVStoreMutex.Unlock()
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000666 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000667 logger.Errorw(ctx, "unable to delete in KVstore", log.Fields{"device-id": oo.deviceID, "err": err})
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000668 oo.chOnuKvProcessingStep <- 0 //error indication
669 return
670 }
671 oo.chOnuKvProcessingStep <- aProcessingStep //done
672}
673
674func (oo *OnuDeviceEntry) updateOnuKvStore(ctx context.Context, wg *sync.WaitGroup) {
675 defer wg.Done()
676
677 if oo.onuKVStore == nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000678 logger.Debugw(ctx, "onuKVStore not set - abort", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000679 oo.onuKVStoreprocResult = errors.New("onu-data update aborted: onuKVStore not set")
680 return
681 }
682 var processingStep uint8 = 1 // used to synchronize the different processing steps with chOnuKvProcessingStep
683 go oo.storeDataInOnuKvStore(ctx, processingStep)
684 if !oo.waitForTimeoutOrCompletion(ctx, oo.chOnuKvProcessingStep, processingStep) {
685 //timeout or error detected
dbainbri4d3a0dc2020-12-02 00:33:42 +0000686 logger.Debugw(ctx, "ONU-data not written - abort", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000687 oo.onuKVStoreprocResult = errors.New("onu-data update aborted: during writing process")
688 return
689 }
690}
691
692func (oo *OnuDeviceEntry) storeDataInOnuKvStore(ctx context.Context, aProcessingStep uint8) {
693
694 //assign values which are not already present when newOnuDeviceEntry() is called
695 oo.sOnuPersistentData.PersOnuID = oo.baseDeviceHandler.pOnuIndication.OnuId
696 oo.sOnuPersistentData.PersIntfID = oo.baseDeviceHandler.pOnuIndication.IntfId
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000697 //TODO: verify usage of these values during restart UC
Holger Hildebrandt3a644642020-12-02 09:46:18 +0000698 oo.sOnuPersistentData.PersAdminState = oo.baseDeviceHandler.pOnuIndication.AdminState
699 oo.sOnuPersistentData.PersOperState = oo.baseDeviceHandler.pOnuIndication.OperState
Holger Hildebrandtdaf0f722021-02-12 11:50:30 +0000700
701 oo.persUniConfigMutex.RLock()
702 defer oo.persUniConfigMutex.RUnlock()
dbainbri4d3a0dc2020-12-02 00:33:42 +0000703 logger.Debugw(ctx, "Update ONU-data in KVStore", log.Fields{"device-id": oo.deviceID, "sOnuPersistentData": oo.sOnuPersistentData})
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000704
705 Value, err := json.Marshal(oo.sOnuPersistentData)
706 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000707 logger.Errorw(ctx, "unable to marshal ONU-data", log.Fields{"sOnuPersistentData": oo.sOnuPersistentData,
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000708 "device-id": oo.deviceID, "err": err})
709 oo.chOnuKvProcessingStep <- 0 //error indication
710 return
711 }
Holger Hildebrandtff05b682021-03-16 15:02:05 +0000712 oo.pOpenOnuAc.lockDeviceHandlersMap.RLock()
713 if _, exist := oo.pOpenOnuAc.deviceHandlers[oo.deviceID]; !exist {
714 logger.Debugw(ctx, "delete_device in progress - skip write request", log.Fields{"device-id": oo.deviceID})
715 oo.chOnuKvProcessingStep <- aProcessingStep
716 oo.pOpenOnuAc.lockDeviceHandlersMap.RUnlock()
717 return
718 }
719 oo.baseDeviceHandler.mutexDeletionInProgressFlag.RLock()
720 if oo.baseDeviceHandler.deletionInProgress {
721 logger.Debugw(ctx, "delete_device in progress - skip write request", log.Fields{"device-id": oo.deviceID})
722 oo.chOnuKvProcessingStep <- aProcessingStep
723 oo.pOpenOnuAc.lockDeviceHandlersMap.RUnlock()
724 oo.baseDeviceHandler.mutexDeletionInProgressFlag.RUnlock()
725 return
726 }
727 oo.pOpenOnuAc.lockDeviceHandlersMap.RUnlock()
728 oo.baseDeviceHandler.mutexDeletionInProgressFlag.RUnlock()
729
Holger Hildebrandtdaf0f722021-02-12 11:50:30 +0000730 oo.onuKVStoreMutex.Lock()
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000731 err = oo.onuKVStore.Put(ctx, oo.onuKVStorePath, Value)
Holger Hildebrandtdaf0f722021-02-12 11:50:30 +0000732 oo.onuKVStoreMutex.Unlock()
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000733 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000734 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 +0000735 oo.chOnuKvProcessingStep <- 0 //error indication
736 return
737 }
738 oo.chOnuKvProcessingStep <- aProcessingStep //done
739}
740
dbainbri4d3a0dc2020-12-02 00:33:42 +0000741func (oo *OnuDeviceEntry) updateOnuUniTpPath(ctx context.Context, aUniID uint8, aTpID uint8, aPathString string) bool {
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000742 /* within some specific InterAdapter processing request write/read access to data is ensured to be sequentially,
743 as also the complete sequence is ensured to 'run to completion' before some new request is accepted
744 no specific concurrency protection to sOnuPersistentData is required here
745 */
Holger Hildebrandtdaf0f722021-02-12 11:50:30 +0000746 oo.persUniConfigMutex.Lock()
747 defer oo.persUniConfigMutex.Unlock()
748
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000749 for k, v := range oo.sOnuPersistentData.PersUniConfig {
750 if v.PersUniID == aUniID {
mpagenko30f28442021-03-24 09:24:04 +0000751 logger.Debugw(ctx, "PersUniConfig-entry exists", log.Fields{"device-id": oo.deviceID, "uniID": aUniID})
Girish Gowdra041dcb32020-11-16 16:54:30 -0800752 existingPath, ok := oo.sOnuPersistentData.PersUniConfig[k].PersTpPathMap[aTpID]
753 if !ok {
mpagenko30f28442021-03-24 09:24:04 +0000754 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 -0800755 }
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000756 if existingPath != aPathString {
757 if aPathString == "" {
758 //existing entry to be deleted
dbainbri4d3a0dc2020-12-02 00:33:42 +0000759 logger.Debugw(ctx, "UniTp delete path value", log.Fields{"device-id": oo.deviceID, "uniID": aUniID, "path": aPathString})
Girish Gowdra041dcb32020-11-16 16:54:30 -0800760 oo.sOnuPersistentData.PersUniConfig[k].PersTpPathMap[aTpID] = ""
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000761 } else {
762 //existing entry to be modified
dbainbri4d3a0dc2020-12-02 00:33:42 +0000763 logger.Debugw(ctx, "UniTp modify path value", log.Fields{"device-id": oo.deviceID, "uniID": aUniID, "path": aPathString})
Girish Gowdra041dcb32020-11-16 16:54:30 -0800764 oo.sOnuPersistentData.PersUniConfig[k].PersTpPathMap[aTpID] = aPathString
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000765 }
766 return true
767 }
768 //entry already exists
mpagenkofc4f56e2020-11-04 17:17:49 +0000769 if aPathString == "" {
770 //no active TechProfile
dbainbri4d3a0dc2020-12-02 00:33:42 +0000771 logger.Debugw(ctx, "UniTp path has already been removed - no AniSide config to be removed", log.Fields{
mpagenkofc4f56e2020-11-04 17:17:49 +0000772 "device-id": oo.deviceID, "uniID": aUniID})
mpagenkofc4f56e2020-11-04 17:17:49 +0000773 } else {
774 //the given TechProfile already exists and is assumed to be active - update devReason as if the config has been done here
775 //was needed e.g. in voltha POD Tests:Validate authentication on a disabled ONU
776 // (as here the TechProfile has not been removed with the disable-device before the new enable-device)
dbainbri4d3a0dc2020-12-02 00:33:42 +0000777 logger.Debugw(ctx, "UniTp path already exists - TechProfile supposed to be active", log.Fields{
mpagenkofc4f56e2020-11-04 17:17:49 +0000778 "device-id": oo.deviceID, "uniID": aUniID, "path": aPathString})
779 //no deviceReason update (deviceProcStatusUpdate) here to ensure 'omci_flows_pushed' state within disable/enable procedure of ATT scenario
780 // (during which the flows are removed/re-assigned but the techProf is left active)
781 //and as the TechProfile is regarded as active we have to verify, if some flow configuration still waits on it
782 // (should not be the case, but should not harm or be more robust ...)
mpagenko2418ab02020-11-12 12:58:06 +0000783 // and to be sure, that for some reason the corresponding TpDelete was lost somewhere in history
784 // we also reset a possibly outstanding delete request - repeated TpConfig is regarded as valid for waiting flow config
785 if oo.baseDeviceHandler.pOnuTP != nil {
Girish Gowdra041dcb32020-11-16 16:54:30 -0800786 oo.baseDeviceHandler.pOnuTP.setProfileToDelete(aUniID, aTpID, false)
mpagenko2418ab02020-11-12 12:58:06 +0000787 }
mpagenko551a4d42020-12-08 18:09:20 +0000788 go oo.baseDeviceHandler.VerifyVlanConfigRequest(ctx, aUniID, aTpID)
mpagenkofc4f56e2020-11-04 17:17:49 +0000789 }
790 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 +0000791 }
792 }
793 //no entry exists for uniId
794
795 if aPathString == "" {
796 //delete request in non-existing state , accept as no change
dbainbri4d3a0dc2020-12-02 00:33:42 +0000797 logger.Debugw(ctx, "UniTp path already removed", log.Fields{"device-id": oo.deviceID, "uniID": aUniID})
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000798 return false
799 }
800 //new entry to be created
dbainbri4d3a0dc2020-12-02 00:33:42 +0000801 logger.Debugw(ctx, "New UniTp path set", log.Fields{"device-id": oo.deviceID, "uniID": aUniID, "path": aPathString})
Girish Gowdra041dcb32020-11-16 16:54:30 -0800802 perSubTpPathMap := make(map[uint8]string)
803 perSubTpPathMap[aTpID] = aPathString
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000804 oo.sOnuPersistentData.PersUniConfig =
Girish Gowdra041dcb32020-11-16 16:54:30 -0800805 append(oo.sOnuPersistentData.PersUniConfig, uniPersConfig{PersUniID: aUniID, PersTpPathMap: perSubTpPathMap, PersFlowParams: make([]uniVlanFlowParams, 0)})
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000806 return true
807}
808
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000809func (oo *OnuDeviceEntry) updateOnuUniFlowConfig(aUniID uint8, aUniVlanFlowParams *[]uniVlanFlowParams) {
810
Holger Hildebrandtdaf0f722021-02-12 11:50:30 +0000811 oo.persUniConfigMutex.Lock()
812 defer oo.persUniConfigMutex.Unlock()
813
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000814 for k, v := range oo.sOnuPersistentData.PersUniConfig {
815 if v.PersUniID == aUniID {
816 oo.sOnuPersistentData.PersUniConfig[k].PersFlowParams = make([]uniVlanFlowParams, len(*aUniVlanFlowParams))
817 copy(oo.sOnuPersistentData.PersUniConfig[k].PersFlowParams, *aUniVlanFlowParams)
818 return
819 }
820 }
821 //flow update was faster than tp-config - create PersUniConfig-entry
mpagenko30f28442021-03-24 09:24:04 +0000822 //TODO!!: following activity to 'add' some new uni entry might not be quite correct if this function is called to clear the data
823 // (e.g after flow removal from RemoveUniFlowParams()).
824 // 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
825 // 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
826 // 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 -0800827 tmpConfig := uniPersConfig{PersUniID: aUniID, PersTpPathMap: make(map[uint8]string), PersFlowParams: make([]uniVlanFlowParams, len(*aUniVlanFlowParams))}
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000828 copy(tmpConfig.PersFlowParams, *aUniVlanFlowParams)
829 oo.sOnuPersistentData.PersUniConfig = append(oo.sOnuPersistentData.PersUniConfig, tmpConfig)
830}
831
832func (oo *OnuDeviceEntry) waitForTimeoutOrCompletion(
833 ctx context.Context, aChOnuProcessingStep <-chan uint8, aProcessingStep uint8) bool {
834 select {
835 case <-ctx.Done():
dbainbri4d3a0dc2020-12-02 00:33:42 +0000836 logger.Warnw(ctx, "processing not completed in-time!",
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000837 log.Fields{"device-id": oo.deviceID, "error": ctx.Err()})
838 return false
839 case rxStep := <-aChOnuProcessingStep:
840 if rxStep == aProcessingStep {
841 return true
842 }
843 //all other values are not accepted - including 0 for error indication
dbainbri4d3a0dc2020-12-02 00:33:42 +0000844 logger.Warnw(ctx, "Invalid processing step received: abort!",
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000845 log.Fields{"device-id": oo.deviceID,
846 "wantedStep": aProcessingStep, "haveStep": rxStep})
847 return false
848 }
849}
850
851func (oo *OnuDeviceEntry) resetKvProcessingErrorIndication() {
852 oo.onuKVStoreprocResult = nil
853}
854func (oo *OnuDeviceEntry) getKvProcessingErrorIndication() error {
855 return oo.onuKVStoreprocResult
856}
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +0000857func (oo *OnuDeviceEntry) incrementMibDataSync(ctx context.Context) {
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000858 if oo.sOnuPersistentData.PersMibDataSyncAdpt < 255 {
859 oo.sOnuPersistentData.PersMibDataSyncAdpt++
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +0000860 } else {
861 // per G.984 and G.988 overflow starts over at 1 given 0 is reserved for reset
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000862 oo.sOnuPersistentData.PersMibDataSyncAdpt = 1
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +0000863 }
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000864 logger.Debugf(ctx, "mibDataSync updated - mds: %d - device-id: %s", oo.sOnuPersistentData.PersMibDataSyncAdpt, oo.deviceID)
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +0000865}
Holger Hildebrandtbe523842021-03-10 10:47:18 +0000866
867func (oo *OnuDeviceEntry) buildMibTemplatePath() string {
868 return fmt.Sprintf(cSuffixMibTemplateKvStore, oo.sOnuPersistentData.PersVendorID, oo.sOnuPersistentData.PersEquipmentID, oo.sOnuPersistentData.PersActiveSwVersion)
869}