blob: 816ebcd3573d7a8358683c1103b7120fddb4080f [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"
82 ulStAuditing = "ulStAuditing"
Holger Hildebrandt10d98192021-01-27 15:29:31 +000083 ulStReAuditing = "ulStReAuditing"
mpagenko1cc3cb42020-07-27 15:24:38 +000084 ulStOutOfSync = "ulStOutOfSync"
85)
Holger Hildebrandt10d98192021-01-27 15:29:31 +000086const cMibUlFsmIdleState = ulStInSync
mpagenko1cc3cb42020-07-27 15:24:38 +000087
88const (
89 // events of MibDownload FSM
90 dlEvStart = "dlEvStart"
91 dlEvCreateGal = "dlEvCreateGal"
92 dlEvRxGalResp = "dlEvRxGalResp"
93 dlEvRxOnu2gResp = "dlEvRxOnu2gResp"
94 dlEvRxBridgeResp = "dlEvRxBridgeResp"
95 dlEvTimeoutSimple = "dlEvTimeoutSimple"
96 dlEvTimeoutBridge = "dlEvTimeoutBridge"
97 dlEvReset = "dlEvReset"
98 dlEvRestart = "dlEvRestart"
99)
100const (
101 // states of MibDownload FSM
102 dlStDisabled = "dlStDisabled"
103 dlStStarting = "dlStStarting"
104 dlStCreatingGal = "dlStCreatingGal"
105 dlStSettingOnu2g = "dlStSettingOnu2g"
106 dlStBridgeInit = "dlStBridgeInit"
107 dlStDownloaded = "dlStDownloaded"
108 dlStResetting = "dlStResetting"
109)
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000110const cMibDlFsmIdleState = dlStDisabled
mpagenko1cc3cb42020-07-27 15:24:38 +0000111
112const (
Matteo Scandolof1f39a72020-11-24 12:08:11 -0800113 // NOTE that this hardcoded to service/voltha as the MIB template is shared across stacks
Holger Hildebrandt2ff21f12020-08-13 14:38:02 +0000114 cBasePathMibTemplateKvStore = "service/voltha/omci_mibs/go_templates"
mpagenkoaf801632020-07-03 10:00:42 +0000115 cSuffixMibTemplateKvStore = "%s/%s/%s"
Matteo Scandolof1f39a72020-11-24 12:08:11 -0800116 cBasePathOnuKVStore = "%s/openonu"
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000117)
118
Himani Chawla6d2ae152020-09-02 13:11:20 +0530119// OnuDeviceEvent - event of interest to Device Adapters and OpenOMCI State Machines
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000120type OnuDeviceEvent int
121
122const (
123 // Events of interest to Device Adapters and OpenOMCI State Machines
Himani Chawla6d2ae152020-09-02 13:11:20 +0530124
125 // DeviceStatusInit - default start state
mpagenkofc4f56e2020-11-04 17:17:49 +0000126 DeviceStatusInit OnuDeviceEvent = iota
Himani Chawla6d2ae152020-09-02 13:11:20 +0530127 // MibDatabaseSync - MIB database sync (upload done)
mpagenkofc4f56e2020-11-04 17:17:49 +0000128 MibDatabaseSync
Himani Chawla6d2ae152020-09-02 13:11:20 +0530129 // OmciCapabilitiesDone - OMCI ME and message type capabilities known
mpagenkofc4f56e2020-11-04 17:17:49 +0000130 OmciCapabilitiesDone
Himani Chawla6d2ae152020-09-02 13:11:20 +0530131 // MibDownloadDone - // MIB download done
mpagenkofc4f56e2020-11-04 17:17:49 +0000132 MibDownloadDone
Himani Chawla6d2ae152020-09-02 13:11:20 +0530133 // UniLockStateDone - Uni ports admin set to lock
mpagenkofc4f56e2020-11-04 17:17:49 +0000134 UniLockStateDone
Himani Chawla6d2ae152020-09-02 13:11:20 +0530135 // UniUnlockStateDone - Uni ports admin set to unlock
mpagenkofc4f56e2020-11-04 17:17:49 +0000136 UniUnlockStateDone
mpagenko900ee4b2020-10-12 11:56:34 +0000137 // UniDisableStateDone - Uni ports admin set to lock based on device disable
mpagenkofc4f56e2020-11-04 17:17:49 +0000138 UniDisableStateDone
mpagenko900ee4b2020-10-12 11:56:34 +0000139 // UniEnableStateDone - Uni ports admin set to unlock based on device re-enable
mpagenkofc4f56e2020-11-04 17:17:49 +0000140 UniEnableStateDone
Himani Chawla6d2ae152020-09-02 13:11:20 +0530141 // PortLinkUp - Port link state change
mpagenkofc4f56e2020-11-04 17:17:49 +0000142 PortLinkUp
Himani Chawla6d2ae152020-09-02 13:11:20 +0530143 // PortLinkDw - Port link state change
mpagenkofc4f56e2020-11-04 17:17:49 +0000144 PortLinkDw
Himani Chawla6d2ae152020-09-02 13:11:20 +0530145 // OmciAniConfigDone - AniSide config according to TechProfile done
mpagenkofc4f56e2020-11-04 17:17:49 +0000146 OmciAniConfigDone
147 // OmciAniResourceRemoved - AniSide TechProfile related resource (Gem/TCont) removed
148 OmciAniResourceRemoved // needs to be the successor of OmciAniConfigDone!
mpagenkof1fc3862021-02-16 10:09:52 +0000149 // OmciVlanFilterAddDone - Omci Vlan config done according to flow-add with request to write kvStore
mpagenkofc4f56e2020-11-04 17:17:49 +0000150 OmciVlanFilterAddDone
mpagenkof1fc3862021-02-16 10:09:52 +0000151 // OmciVlanFilterAddDoneNoKvStore - Omci Vlan config done according to flow-add without writing kvStore
152 OmciVlanFilterAddDoneNoKvStore // needs to be the successor of OmciVlanFilterAddDone!
153 // OmciVlanFilterRemDone - Omci Vlan config done according to flow-remove with request to write kvStore
154 OmciVlanFilterRemDone // needs to be the successor of OmciVlanFilterAddDoneNoKvStore!
155 // OmciVlanFilterRemDoneNoKvStore - Omci Vlan config done according to flow-remove without writing kvStore
156 OmciVlanFilterRemDoneNoKvStore // needs to be the successor of OmciVlanFilterRemDone!
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000157 // Add other events here as needed (alarms separate???)
158)
159
160type activityDescr struct {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000161 databaseClass func(context.Context) error
Himani Chawla4d908332020-08-31 12:30:20 +0530162 //advertiseEvents bool
Holger Hildebrandte3677f12021-02-05 14:50:56 +0000163 auditInterval time.Duration
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000164 //tasks map[string]func() error
165}
Himani Chawla6d2ae152020-09-02 13:11:20 +0530166
167// OmciDeviceFsms - FSM event mapping to database class and time to wait between audits
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000168type OmciDeviceFsms map[string]activityDescr
169
Himani Chawla6d2ae152020-09-02 13:11:20 +0530170// AdapterFsm - Adapter FSM details including channel, event and device
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000171type AdapterFsm struct {
172 fsmName string
173 deviceID string
174 commChan chan Message
175 pFsm *fsm.FSM
176}
177
Himani Chawla6d2ae152020-09-02 13:11:20 +0530178//NewAdapterFsm - FSM details including event, device and channel.
179func NewAdapterFsm(aName string, aDeviceID string, aCommChannel chan Message) *AdapterFsm {
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000180 aFsm := &AdapterFsm{
Himani Chawla6d2ae152020-09-02 13:11:20 +0530181 fsmName: aName,
182 deviceID: aDeviceID,
183 commChan: aCommChannel,
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000184 }
185 return aFsm
186}
187
188//Start starts (logs) the omci agent
dbainbri4d3a0dc2020-12-02 00:33:42 +0000189func (oo *AdapterFsm) logFsmStateChange(ctx context.Context, e *fsm.Event) {
190 logger.Debugw(ctx, "FSM state change", log.Fields{"device-id": oo.deviceID, "FSM name": oo.fsmName,
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000191 "event name": string(e.Event), "src state": string(e.Src), "dst state": string(e.Dst)})
192}
193
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000194//OntDeviceEntry structure holds information about the attached FSM'as and their communication
Holger Hildebrandtc54939a2020-06-17 08:14:27 +0000195
196const (
Himani Chawla6d2ae152020-09-02 13:11:20 +0530197 firstSwImageMeID = 0
198 secondSwImageMeID = 1
Holger Hildebrandtc54939a2020-06-17 08:14:27 +0000199)
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +0000200const onuDataMeID = 0
Himani Chawla6d2ae152020-09-02 13:11:20 +0530201const onugMeID = 0
202const onu2gMeID = 0
203const ipHostConfigDataMeID = 1
204const onugSerialNumberLen = 8
205const omciMacAddressLen = 6
Holger Hildebrandtc54939a2020-06-17 08:14:27 +0000206
Holger Hildebrandt2fb70892020-10-28 11:53:18 +0000207const cEmptyMacAddrString = "000000000000"
208const cEmptySerialNumberString = "0000000000000000"
209
Himani Chawla6d2ae152020-09-02 13:11:20 +0530210type swImages struct {
Holger Hildebrandtc54939a2020-06-17 08:14:27 +0000211 version string
212 isActive uint8
213}
214
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000215type uniPersConfig struct {
216 PersUniID uint8 `json:"uni_id"`
Girish Gowdra041dcb32020-11-16 16:54:30 -0800217 PersTpPathMap map[uint8]string `json:"PersTpPathMap"` // tp-id to tp-path map
218 PersFlowParams []uniVlanFlowParams `json:"flow_params"` //as defined in omci_ani_config.go
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000219}
220
221type onuPersistentData struct {
Holger Hildebrandte3677f12021-02-05 14:50:56 +0000222 PersOnuID uint32 `json:"onu_id"`
223 PersIntfID uint32 `json:"intf_id"`
224 PersSnr string `json:"serial_number"`
225 PersAdminState string `json:"admin_state"`
226 PersOperState string `json:"oper_state"`
227 PersUniUnlockDone bool `json:"uni_unlock_done"`
228 PersUniDisableDone bool `json:"uni_disable_done"`
229 PersMibAuditInterval time.Duration `json:"mib_audit_interval"`
230 PersMibLastDbSync uint32 `json:"mib_last_db_sync"`
231 PersMibDataSyncAdpt uint8 `json:"mib_data_sync_adpt"`
232 PersUniConfig []uniPersConfig `json:"uni_config"`
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000233}
234
Himani Chawla6d2ae152020-09-02 13:11:20 +0530235// OnuDeviceEntry - ONU device info and FSM events.
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000236type OnuDeviceEntry struct {
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000237 deviceID string
238 baseDeviceHandler *deviceHandler
Holger Hildebrandt61b24d02020-11-16 13:36:40 +0000239 pOpenOnuAc *OpenONUAC
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000240 coreProxy adapterif.CoreProxy
241 adapterProxy adapterif.AdapterProxy
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000242 PDevOmciCC *omciCC
243 pOnuDB *onuDeviceDB
244 mibTemplateKVStore *db.Backend
Holger Hildebrandtdaf0f722021-02-12 11:50:30 +0000245 persUniConfigMutex sync.RWMutex
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000246 sOnuPersistentData onuPersistentData
Holger Hildebrandt61b24d02020-11-16 13:36:40 +0000247 mibTemplatePath string
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000248 onuKVStoreMutex sync.RWMutex
249 onuKVStore *db.Backend
250 onuKVStorePath string
251 onuKVStoreprocResult error //error indication of processing
252 chOnuKvProcessingStep chan uint8
253 vendorID string
254 serialNumber string
255 equipmentID string
256 swImages [secondSwImageMeID + 1]swImages
257 activeSwVersion string
258 macAddress string
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000259 //lockDeviceEntries sync.RWMutex
dbainbri4d3a0dc2020-12-02 00:33:42 +0000260 mibDbClass func(context.Context) error
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000261 supportedFsms OmciDeviceFsms
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000262 devState OnuDeviceEvent
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +0000263 // Audit and MDS
Holger Hildebrandte3677f12021-02-05 14:50:56 +0000264 mibAuditInterval time.Duration
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000265 // TODO: periodical mib resync will be implemented with story VOL-3792
266 //mibNextDbResync uint32
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000267
268 // for mibUpload
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000269 pMibUploadFsm *AdapterFsm //could be handled dynamically and more general as pAdapterFsm - perhaps later
270 // for mibDownload
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000271 pMibDownloadFsm *AdapterFsm //could be handled dynamically and more general as pAdapterFsm - perhaps later
272 //remark: general usage of pAdapterFsm would require generalization of commChan usage and internal event setting
273 // within the FSM event procedures
ozgecanetsiae11479f2020-07-06 09:44:47 +0300274 omciMessageReceived chan bool //seperate channel needed by DownloadFsm
275 omciRebootMessageReceivedChannel chan Message // channel needed by Reboot request
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000276}
277
Himani Chawla6d2ae152020-09-02 13:11:20 +0530278//newOnuDeviceEntry returns a new instance of a OnuDeviceEntry
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000279//mib_db (as well as not inluded alarm_db not really used in this code? VERIFY!!)
Holger Hildebrandt61b24d02020-11-16 13:36:40 +0000280func newOnuDeviceEntry(ctx context.Context, dh *deviceHandler) *OnuDeviceEntry {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000281 logger.Debugw(ctx, "init-onuDeviceEntry", log.Fields{"device-id": dh.deviceID})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000282 var onuDeviceEntry OnuDeviceEntry
Holger Hildebrandt61b24d02020-11-16 13:36:40 +0000283 onuDeviceEntry.deviceID = dh.deviceID
284 onuDeviceEntry.baseDeviceHandler = dh
285 onuDeviceEntry.pOpenOnuAc = dh.pOpenOnuAc
286 onuDeviceEntry.coreProxy = dh.coreProxy
287 onuDeviceEntry.adapterProxy = dh.AdapterProxy
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000288 onuDeviceEntry.devState = DeviceStatusInit
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000289 onuDeviceEntry.sOnuPersistentData.PersUniConfig = make([]uniPersConfig, 0)
290 onuDeviceEntry.chOnuKvProcessingStep = make(chan uint8)
ozgecanetsiae11479f2020-07-06 09:44:47 +0300291 onuDeviceEntry.omciRebootMessageReceivedChannel = make(chan Message, 2048)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000292 //openomciagent.lockDeviceHandlersMap = sync.RWMutex{}
293 //OMCI related databases are on a per-agent basis. State machines and tasks
294 //are per ONU Vendor
295 //
296 // MIB Synchronization Database - possible overloading from arguments
Holger Hildebrandt61b24d02020-11-16 13:36:40 +0000297 if dh.pOpenOnuAc.pSupportedFsms != nil {
298 onuDeviceEntry.supportedFsms = *dh.pOpenOnuAc.pSupportedFsms
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000299 } else {
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000300 // 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 +0000301 //var mibSyncFsm = NewMibSynchronizer()
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000302 // use some internal defaults, if not defined from outside
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000303 onuDeviceEntry.supportedFsms = OmciDeviceFsms{
304 "mib-synchronizer": {
305 //mibSyncFsm, // Implements the MIB synchronization state machine
Himani Chawla6d2ae152020-09-02 13:11:20 +0530306 onuDeviceEntry.mibDbVolatileDict, // Implements volatile ME MIB database
Himani Chawla4d908332020-08-31 12:30:20 +0530307 //true, // Advertise events on OpenOMCI event bus
Holger Hildebrandte3677f12021-02-05 14:50:56 +0000308 dh.pOpenOnuAc.mibAuditInterval, // Time to wait between MIB audits. 0 to disable audits.
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000309 // map[string]func() error{
310 // "mib-upload": onuDeviceEntry.MibUploadTask,
311 // "mib-template": onuDeviceEntry.MibTemplateTask,
312 // "get-mds": onuDeviceEntry.GetMdsTask,
313 // "mib-audit": onuDeviceEntry.GetMdsTask,
314 // "mib-resync": onuDeviceEntry.MibResyncTask,
315 // "mib-reconcile": onuDeviceEntry.MibReconcileTask,
316 // },
317 },
318 }
319 }
320 onuDeviceEntry.mibDbClass = onuDeviceEntry.supportedFsms["mib-synchronizer"].databaseClass
dbainbri4d3a0dc2020-12-02 00:33:42 +0000321 logger.Debug(ctx, "access2mibDbClass")
322 go onuDeviceEntry.mibDbClass(ctx)
Holger Hildebrandtf37b3d72021-02-17 10:25:22 +0000323 if !dh.isReconciling() {
Holger Hildebrandte3677f12021-02-05 14:50:56 +0000324 onuDeviceEntry.mibAuditInterval = onuDeviceEntry.supportedFsms["mib-synchronizer"].auditInterval
325 onuDeviceEntry.sOnuPersistentData.PersMibAuditInterval = onuDeviceEntry.mibAuditInterval
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000326 } else {
Holger Hildebrandte3677f12021-02-05 14:50:56 +0000327 logger.Debugw(ctx, "reconciling - take audit interval from persistent data", log.Fields{"device-id": dh.deviceID})
328 // TODO: This is a preparation for VOL-VOL-3811 to preserve config history in case of
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000329 // vendor- or deviceID-specific configurations via voltctl-commands
Holger Hildebrandte3677f12021-02-05 14:50:56 +0000330 onuDeviceEntry.mibAuditInterval = onuDeviceEntry.sOnuPersistentData.PersMibAuditInterval
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000331 }
Holger Hildebrandte3677f12021-02-05 14:50:56 +0000332 logger.Debugw(ctx, "MibAudit is set to", log.Fields{"Interval": onuDeviceEntry.mibAuditInterval})
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000333 // TODO: periodical mib resync will be implemented with story VOL-3792
334 //onuDeviceEntry.mibNextDbResync = 0
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000335
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000336 // Omci related Mib upload sync state machine
337 mibUploadChan := make(chan Message, 2048)
Holger Hildebrandt61b24d02020-11-16 13:36:40 +0000338 onuDeviceEntry.pMibUploadFsm = NewAdapterFsm("MibUpload", dh.deviceID, mibUploadChan)
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000339 onuDeviceEntry.pMibUploadFsm.pFsm = fsm.NewFSM(
mpagenko1cc3cb42020-07-27 15:24:38 +0000340 ulStDisabled,
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000341 fsm.Events{
342
mpagenko1cc3cb42020-07-27 15:24:38 +0000343 {Name: ulEvStart, Src: []string{ulStDisabled}, Dst: ulStStarting},
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000344
mpagenko1cc3cb42020-07-27 15:24:38 +0000345 {Name: ulEvResetMib, Src: []string{ulStStarting}, Dst: ulStResettingMib},
346 {Name: ulEvGetVendorAndSerial, Src: []string{ulStResettingMib}, Dst: ulStGettingVendorAndSerial},
Himani Chawla4d908332020-08-31 12:30:20 +0530347 {Name: ulEvGetEquipmentID, Src: []string{ulStGettingVendorAndSerial}, Dst: ulStGettingEquipmentID},
348 {Name: ulEvGetFirstSwVersion, Src: []string{ulStGettingEquipmentID}, Dst: ulStGettingFirstSwVersion},
mpagenko1cc3cb42020-07-27 15:24:38 +0000349 {Name: ulEvGetSecondSwVersion, Src: []string{ulStGettingFirstSwVersion}, Dst: ulStGettingSecondSwVersion},
350 {Name: ulEvGetMacAddress, Src: []string{ulStGettingSecondSwVersion}, Dst: ulStGettingMacAddress},
351 {Name: ulEvGetMibTemplate, Src: []string{ulStGettingMacAddress}, Dst: ulStGettingMibTemplate},
Holger Hildebrandtc54939a2020-06-17 08:14:27 +0000352
mpagenko1cc3cb42020-07-27 15:24:38 +0000353 {Name: ulEvUploadMib, Src: []string{ulStGettingMibTemplate}, Dst: ulStUploading},
354 {Name: ulEvExamineMds, Src: []string{ulStStarting}, Dst: ulStExaminingMds},
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000355
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000356 {Name: ulEvSuccess, Src: []string{ulStGettingMibTemplate}, Dst: ulStUploadDone},
357 {Name: ulEvSuccess, Src: []string{ulStUploading}, Dst: ulStUploadDone},
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000358
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000359 {Name: ulEvSuccess, Src: []string{ulStUploadDone}, Dst: ulStInSync},
mpagenko1cc3cb42020-07-27 15:24:38 +0000360 {Name: ulEvSuccess, Src: []string{ulStExaminingMds}, Dst: ulStInSync},
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +0000361 // TODO: As long as mib-resynchronizing is not implemented, failed MDS-examination triggers
362 // mib-reset and new provisioning at this point
363 //{Name: ulEvMismatch, Src: []string{ulStExaminingMds}, Dst: ulStResynchronizing},
364 {Name: ulEvMismatch, Src: []string{ulStExaminingMds}, Dst: ulStResettingMib},
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000365
mpagenko1cc3cb42020-07-27 15:24:38 +0000366 {Name: ulEvAuditMib, Src: []string{ulStInSync}, Dst: ulStAuditing},
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000367
mpagenko1cc3cb42020-07-27 15:24:38 +0000368 {Name: ulEvSuccess, Src: []string{ulStOutOfSync}, Dst: ulStInSync},
369 {Name: ulEvAuditMib, Src: []string{ulStOutOfSync}, Dst: ulStAuditing},
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000370
mpagenko1cc3cb42020-07-27 15:24:38 +0000371 {Name: ulEvSuccess, Src: []string{ulStAuditing}, Dst: ulStInSync},
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000372 {Name: ulEvMismatch, Src: []string{ulStAuditing}, Dst: ulStReAuditing},
mpagenko1cc3cb42020-07-27 15:24:38 +0000373 {Name: ulEvForceResync, Src: []string{ulStAuditing}, Dst: ulStResynchronizing},
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000374
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000375 {Name: ulEvSuccess, Src: []string{ulStReAuditing}, Dst: ulStInSync},
376 {Name: ulEvMismatch, Src: []string{ulStReAuditing}, Dst: ulStResettingMib},
377
mpagenko1cc3cb42020-07-27 15:24:38 +0000378 {Name: ulEvSuccess, Src: []string{ulStResynchronizing}, Dst: ulStInSync},
379 {Name: ulEvDiffsFound, Src: []string{ulStResynchronizing}, Dst: ulStOutOfSync},
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000380
Himani Chawla4d908332020-08-31 12:30:20 +0530381 {Name: ulEvTimeout, Src: []string{ulStResettingMib, ulStGettingVendorAndSerial, ulStGettingEquipmentID, ulStGettingFirstSwVersion,
mpagenko1cc3cb42020-07-27 15:24:38 +0000382 ulStGettingSecondSwVersion, ulStGettingMacAddress, ulStGettingMibTemplate, ulStUploading, ulStResynchronizing, ulStExaminingMds,
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000383 ulStUploadDone, ulStInSync, ulStOutOfSync, ulStAuditing, ulStReAuditing}, Dst: ulStStarting},
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000384
Himani Chawla4d908332020-08-31 12:30:20 +0530385 {Name: ulEvStop, Src: []string{ulStStarting, ulStResettingMib, ulStGettingVendorAndSerial, ulStGettingEquipmentID, ulStGettingFirstSwVersion,
mpagenko1cc3cb42020-07-27 15:24:38 +0000386 ulStGettingSecondSwVersion, ulStGettingMacAddress, ulStGettingMibTemplate, ulStUploading, ulStResynchronizing, ulStExaminingMds,
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000387 ulStUploadDone, ulStInSync, ulStOutOfSync, ulStAuditing, ulStReAuditing}, Dst: ulStDisabled},
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000388 },
389
390 fsm.Callbacks{
dbainbri4d3a0dc2020-12-02 00:33:42 +0000391 "enter_state": func(e *fsm.Event) { onuDeviceEntry.pMibUploadFsm.logFsmStateChange(ctx, e) },
392 "enter_" + ulStStarting: func(e *fsm.Event) { onuDeviceEntry.enterStartingState(ctx, e) },
393 "enter_" + ulStResettingMib: func(e *fsm.Event) { onuDeviceEntry.enterResettingMibState(ctx, e) },
394 "enter_" + ulStGettingVendorAndSerial: func(e *fsm.Event) { onuDeviceEntry.enterGettingVendorAndSerialState(ctx, e) },
395 "enter_" + ulStGettingEquipmentID: func(e *fsm.Event) { onuDeviceEntry.enterGettingEquipmentIDState(ctx, e) },
396 "enter_" + ulStGettingFirstSwVersion: func(e *fsm.Event) { onuDeviceEntry.enterGettingFirstSwVersionState(ctx, e) },
397 "enter_" + ulStGettingSecondSwVersion: func(e *fsm.Event) { onuDeviceEntry.enterGettingSecondSwVersionState(ctx, e) },
398 "enter_" + ulStGettingMacAddress: func(e *fsm.Event) { onuDeviceEntry.enterGettingMacAddressState(ctx, e) },
399 "enter_" + ulStGettingMibTemplate: func(e *fsm.Event) { onuDeviceEntry.enterGettingMibTemplate(ctx, e) },
400 "enter_" + ulStUploading: func(e *fsm.Event) { onuDeviceEntry.enterUploadingState(ctx, e) },
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000401 "enter_" + ulStUploadDone: func(e *fsm.Event) { onuDeviceEntry.enterUploadDoneState(ctx, e) },
dbainbri4d3a0dc2020-12-02 00:33:42 +0000402 "enter_" + ulStExaminingMds: func(e *fsm.Event) { onuDeviceEntry.enterExaminingMdsState(ctx, e) },
403 "enter_" + ulStResynchronizing: func(e *fsm.Event) { onuDeviceEntry.enterResynchronizingState(ctx, e) },
404 "enter_" + ulStAuditing: func(e *fsm.Event) { onuDeviceEntry.enterAuditingState(ctx, e) },
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000405 "enter_" + ulStReAuditing: func(e *fsm.Event) { onuDeviceEntry.enterReAuditingState(ctx, e) },
dbainbri4d3a0dc2020-12-02 00:33:42 +0000406 "enter_" + ulStOutOfSync: func(e *fsm.Event) { onuDeviceEntry.enterOutOfSyncState(ctx, e) },
407 "enter_" + ulStInSync: func(e *fsm.Event) { onuDeviceEntry.enterInSyncState(ctx, e) },
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000408 },
409 )
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000410 // Omci related Mib download state machine
411 mibDownloadChan := make(chan Message, 2048)
Holger Hildebrandt61b24d02020-11-16 13:36:40 +0000412 onuDeviceEntry.pMibDownloadFsm = NewAdapterFsm("MibDownload", dh.deviceID, mibDownloadChan)
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000413 onuDeviceEntry.pMibDownloadFsm.pFsm = fsm.NewFSM(
mpagenko1cc3cb42020-07-27 15:24:38 +0000414 dlStDisabled,
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000415 fsm.Events{
416
mpagenko1cc3cb42020-07-27 15:24:38 +0000417 {Name: dlEvStart, Src: []string{dlStDisabled}, Dst: dlStStarting},
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000418
mpagenko1cc3cb42020-07-27 15:24:38 +0000419 {Name: dlEvCreateGal, Src: []string{dlStStarting}, Dst: dlStCreatingGal},
420 {Name: dlEvRxGalResp, Src: []string{dlStCreatingGal}, Dst: dlStSettingOnu2g},
421 {Name: dlEvRxOnu2gResp, Src: []string{dlStSettingOnu2g}, Dst: dlStBridgeInit},
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000422 // the bridge state is used for multi ME config for alle UNI related ports
423 // maybe such could be reflected in the state machine as well (port number parametrized)
424 // but that looks not straightforward here - so we keep it simple here for the beginning(?)
mpagenko1cc3cb42020-07-27 15:24:38 +0000425 {Name: dlEvRxBridgeResp, Src: []string{dlStBridgeInit}, Dst: dlStDownloaded},
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000426
mpagenko1cc3cb42020-07-27 15:24:38 +0000427 {Name: dlEvTimeoutSimple, Src: []string{dlStCreatingGal, dlStSettingOnu2g}, Dst: dlStStarting},
428 {Name: dlEvTimeoutBridge, Src: []string{dlStBridgeInit}, Dst: dlStStarting},
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000429
mpagenko1cc3cb42020-07-27 15:24:38 +0000430 {Name: dlEvReset, Src: []string{dlStStarting, dlStCreatingGal, dlStSettingOnu2g,
431 dlStBridgeInit, dlStDownloaded}, Dst: dlStResetting},
432 // exceptional treatment for all states except dlStResetting
433 {Name: dlEvRestart, Src: []string{dlStStarting, dlStCreatingGal, dlStSettingOnu2g,
434 dlStBridgeInit, dlStDownloaded, dlStResetting}, Dst: dlStDisabled},
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000435 },
436
437 fsm.Callbacks{
dbainbri4d3a0dc2020-12-02 00:33:42 +0000438 "enter_state": func(e *fsm.Event) { onuDeviceEntry.pMibDownloadFsm.logFsmStateChange(ctx, e) },
439 "enter_" + dlStStarting: func(e *fsm.Event) { onuDeviceEntry.enterDLStartingState(ctx, e) },
440 "enter_" + dlStCreatingGal: func(e *fsm.Event) { onuDeviceEntry.enterCreatingGalState(ctx, e) },
441 "enter_" + dlStSettingOnu2g: func(e *fsm.Event) { onuDeviceEntry.enterSettingOnu2gState(ctx, e) },
442 "enter_" + dlStBridgeInit: func(e *fsm.Event) { onuDeviceEntry.enterBridgeInitState(ctx, e) },
443 "enter_" + dlStDownloaded: func(e *fsm.Event) { onuDeviceEntry.enterDownloadedState(ctx, e) },
444 "enter_" + dlStResetting: func(e *fsm.Event) { onuDeviceEntry.enterResettingState(ctx, e) },
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000445 },
446 )
447 if onuDeviceEntry.pMibDownloadFsm == nil || onuDeviceEntry.pMibDownloadFsm.pFsm == nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000448 logger.Errorw(ctx, "MibDownloadFsm could not be instantiated", log.Fields{"device-id": dh.deviceID})
Andrea Campanella6515c582020-10-05 11:25:00 +0200449 // TODO some specifc error treatment - or waiting for crash ?
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000450 }
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000451
dbainbri4d3a0dc2020-12-02 00:33:42 +0000452 onuDeviceEntry.mibTemplateKVStore = onuDeviceEntry.baseDeviceHandler.setBackend(ctx, cBasePathMibTemplateKvStore)
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000453 if onuDeviceEntry.mibTemplateKVStore == nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000454 logger.Errorw(ctx, "Can't access mibTemplateKVStore - no backend connection to service",
Holger Hildebrandt61b24d02020-11-16 13:36:40 +0000455 log.Fields{"device-id": dh.deviceID, "service": cBasePathMibTemplateKvStore})
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000456 }
457
458 onuDeviceEntry.onuKVStorePath = onuDeviceEntry.deviceID
Matteo Scandolof1f39a72020-11-24 12:08:11 -0800459 baseKvStorePath := fmt.Sprintf(cBasePathOnuKVStore, dh.pOpenOnuAc.cm.Backend.PathPrefix)
dbainbri4d3a0dc2020-12-02 00:33:42 +0000460 onuDeviceEntry.onuKVStore = onuDeviceEntry.baseDeviceHandler.setBackend(ctx, baseKvStorePath)
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000461 if onuDeviceEntry.onuKVStore == nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000462 logger.Errorw(ctx, "Can't access onuKVStore - no backend connection to service",
Matteo Scandolof1f39a72020-11-24 12:08:11 -0800463 log.Fields{"device-id": dh.deviceID, "service": baseKvStorePath})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000464 }
465
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000466 // Alarm Synchronization Database
Himani Chawlaac1f5ad2021-02-04 21:21:54 +0530467
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000468 //self._alarm_db = None
469 //self._alarm_database_cls = support_classes['alarm-synchronizer']['database']
470 return &onuDeviceEntry
471}
472
Himani Chawla6d2ae152020-09-02 13:11:20 +0530473//start starts (logs) the omci agent
474func (oo *OnuDeviceEntry) start(ctx context.Context) error {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000475 logger.Debugw(ctx, "OnuDeviceEntry-starting", log.Fields{"for device-id": oo.deviceID})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000476 if oo.PDevOmciCC == nil {
mpagenko900ee4b2020-10-12 11:56:34 +0000477 oo.PDevOmciCC = newOmciCC(ctx, oo, oo.deviceID, oo.baseDeviceHandler,
478 oo.coreProxy, oo.adapterProxy)
479 if oo.PDevOmciCC == nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000480 logger.Errorw(ctx, "Could not create devOmciCc - abort", log.Fields{"for device-id": oo.deviceID})
mpagenko900ee4b2020-10-12 11:56:34 +0000481 return fmt.Errorf("could not create devOmciCc %s", oo.deviceID)
482 }
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000483 }
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000484 return nil
485}
486
mpagenko900ee4b2020-10-12 11:56:34 +0000487//stop stops/resets the omciCC
488func (oo *OnuDeviceEntry) stop(ctx context.Context, abResetOmciCC bool) error {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000489 logger.Debugw(ctx, "OnuDeviceEntry-stopping", log.Fields{"for device-id": oo.deviceID})
mpagenko900ee4b2020-10-12 11:56:34 +0000490 if abResetOmciCC && (oo.PDevOmciCC != nil) {
491 _ = oo.PDevOmciCC.stop(ctx)
492 }
493 //to allow for all event notifications again when re-using the device and omciCC
494 oo.devState = DeviceStatusInit
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000495 return nil
496}
497
Himani Chawla6d2ae152020-09-02 13:11:20 +0530498func (oo *OnuDeviceEntry) reboot(ctx context.Context) error {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000499 logger.Debugw(ctx, "OnuDeviceEntry-rebooting", log.Fields{"for device-id": oo.deviceID})
mpagenko900ee4b2020-10-12 11:56:34 +0000500 if oo.PDevOmciCC != nil {
501 if err := oo.PDevOmciCC.sendReboot(ctx, ConstDefaultOmciTimeout, true, oo.omciRebootMessageReceivedChannel); err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000502 logger.Errorw(ctx, "onu didn't reboot", log.Fields{"for device-id": oo.deviceID})
mpagenko900ee4b2020-10-12 11:56:34 +0000503 return err
504 }
ozgecanetsiae11479f2020-07-06 09:44:47 +0300505 }
ozgecanetsiae11479f2020-07-06 09:44:47 +0300506 return nil
507}
508
dbainbri4d3a0dc2020-12-02 00:33:42 +0000509func (oo *OnuDeviceEntry) waitForRebootResponse(ctx context.Context, responseChannel chan Message) error {
ozgecanetsiae11479f2020-07-06 09:44:47 +0300510 select {
511 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 +0000512 logger.Warnw(ctx, "Reboot timeout", log.Fields{"for device-id": oo.deviceID})
Andrea Campanella6515c582020-10-05 11:25:00 +0200513 return fmt.Errorf("rebootTimeout")
ozgecanetsiae11479f2020-07-06 09:44:47 +0300514 case data := <-responseChannel:
515 switch data.Data.(OmciMessage).OmciMsg.MessageType {
516 case omci.RebootResponseType:
517 {
518 msgLayer := (*data.Data.(OmciMessage).OmciPacket).Layer(omci.LayerTypeRebootResponse)
519 if msgLayer == nil {
Andrea Campanella6515c582020-10-05 11:25:00 +0200520 return fmt.Errorf("omci Msg layer could not be detected for RebootResponseType")
ozgecanetsiae11479f2020-07-06 09:44:47 +0300521 }
Andrea Campanellabef4e542020-10-22 11:01:28 +0200522 msgObj, msgOk := msgLayer.(*omci.RebootResponse)
ozgecanetsiae11479f2020-07-06 09:44:47 +0300523 if !msgOk {
Andrea Campanella6515c582020-10-05 11:25:00 +0200524 return fmt.Errorf("omci Msg layer could not be assigned for RebootResponseType %s", oo.deviceID)
ozgecanetsiae11479f2020-07-06 09:44:47 +0300525 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000526 logger.Debugw(ctx, "RebootResponse data", log.Fields{"device-id": oo.deviceID, "data-fields": msgObj})
ozgecanetsiae11479f2020-07-06 09:44:47 +0300527 if msgObj.Result != me.Success {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000528 logger.Errorw(ctx, "Omci RebootResponse result error", log.Fields{"device-id": oo.deviceID, "Error": msgObj.Result})
ozgecanetsiae11479f2020-07-06 09:44:47 +0300529 // possibly force FSM into abort or ignore some errors for some messages? store error for mgmt display?
Andrea Campanellabef4e542020-10-22 11:01:28 +0200530 return fmt.Errorf("omci RebootResponse result error indication %s for device %s",
Andrea Campanella6515c582020-10-05 11:25:00 +0200531 msgObj.Result, oo.deviceID)
ozgecanetsiae11479f2020-07-06 09:44:47 +0300532 }
533 return nil
534 }
535 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000536 logger.Warnw(ctx, "Reboot response message type error", log.Fields{"for device-id": oo.deviceID})
Andrea Campanella6515c582020-10-05 11:25:00 +0200537 return fmt.Errorf("unexpected OmciResponse type received %s", oo.deviceID)
ozgecanetsiae11479f2020-07-06 09:44:47 +0300538 }
539}
540
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000541//Relay the InSync message via Handler to Rw core - Status update
dbainbri4d3a0dc2020-12-02 00:33:42 +0000542func (oo *OnuDeviceEntry) transferSystemEvent(ctx context.Context, devEvent OnuDeviceEvent) {
543 logger.Debugw(ctx, "relaying system-event", log.Fields{"Event": devEvent})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000544 // decouple the handler transfer from further processing here
545 // TODO!!! check if really no synch is required within the system e.g. to ensure following steps ..
Himani Chawla26e555c2020-08-31 12:30:20 +0530546 if devEvent == MibDatabaseSync {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000547 if oo.devState < MibDatabaseSync { //devState has not been synced yet
548 oo.devState = MibDatabaseSync
dbainbri4d3a0dc2020-12-02 00:33:42 +0000549 go oo.baseDeviceHandler.deviceProcStatusUpdate(ctx, devEvent)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000550 //TODO!!! device control: next step: start MIB capability verification from here ?!!!
551 } else {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000552 logger.Debugw(ctx, "mibinsync-event in some already synced state - ignored", log.Fields{"state": oo.devState})
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000553 }
Himani Chawla26e555c2020-08-31 12:30:20 +0530554 } else if devEvent == MibDownloadDone {
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000555 if oo.devState < MibDownloadDone { //devState has not been synced yet
556 oo.devState = MibDownloadDone
dbainbri4d3a0dc2020-12-02 00:33:42 +0000557 go oo.baseDeviceHandler.deviceProcStatusUpdate(ctx, devEvent)
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000558 } else {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000559 logger.Debugw(ctx, "mibdownloaddone-event was already seen - ignored", log.Fields{"state": oo.devState})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000560 }
561 } else {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000562 logger.Warnw(ctx, "device-event not yet handled", log.Fields{"state": devEvent})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000563 }
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000564}
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000565
566func (oo *OnuDeviceEntry) restoreDataFromOnuKvStore(ctx context.Context) error {
567 if oo.onuKVStore == nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000568 logger.Debugw(ctx, "onuKVStore not set - abort", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000569 return fmt.Errorf(fmt.Sprintf("onuKVStore-not-set-abort-%s", oo.deviceID))
570 }
Holger Hildebrandtdaf0f722021-02-12 11:50:30 +0000571 oo.persUniConfigMutex.Lock()
572 defer oo.persUniConfigMutex.Unlock()
Holger Hildebrandte3677f12021-02-05 14:50:56 +0000573 oo.sOnuPersistentData = onuPersistentData{0, 0, "", "", "", false, false, oo.mibAuditInterval, 0, 0, make([]uniPersConfig, 0)}
Holger Hildebrandtdaf0f722021-02-12 11:50:30 +0000574 oo.onuKVStoreMutex.RLock()
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000575 Value, err := oo.onuKVStore.Get(ctx, oo.onuKVStorePath)
Holger Hildebrandtdaf0f722021-02-12 11:50:30 +0000576 oo.onuKVStoreMutex.RUnlock()
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000577 if err == nil {
578 if Value != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000579 logger.Debugw(ctx, "ONU-data read",
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000580 log.Fields{"Key": Value.Key, "device-id": oo.deviceID})
581 tmpBytes, _ := kvstore.ToByte(Value.Value)
582
583 if err = json.Unmarshal(tmpBytes, &oo.sOnuPersistentData); err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000584 logger.Errorw(ctx, "unable to unmarshal ONU-data", log.Fields{"error": err, "device-id": oo.deviceID})
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000585 return fmt.Errorf(fmt.Sprintf("unable-to-unmarshal-ONU-data-%s", oo.deviceID))
586 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000587 logger.Debugw(ctx, "ONU-data", log.Fields{"sOnuPersistentData": oo.sOnuPersistentData,
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000588 "device-id": oo.deviceID})
589 } else {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000590 logger.Debugw(ctx, "no ONU-data found", log.Fields{"path": oo.onuKVStorePath, "device-id": oo.deviceID})
mpagenko2418ab02020-11-12 12:58:06 +0000591 return fmt.Errorf("no-ONU-data-found")
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000592 }
593 } else {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000594 logger.Errorw(ctx, "unable to read from KVstore", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000595 return fmt.Errorf(fmt.Sprintf("unable-to-read-from-KVstore-%s", oo.deviceID))
596 }
597 return nil
598}
599
600func (oo *OnuDeviceEntry) deleteDataFromOnuKvStore(ctx context.Context, wg *sync.WaitGroup) {
601 defer wg.Done()
602
603 if oo.onuKVStore == nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000604 logger.Debugw(ctx, "onuKVStore not set - abort", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000605 oo.onuKVStoreprocResult = errors.New("onu-data delete aborted: onuKVStore not set")
606 return
607 }
608 var processingStep uint8 = 1 // used to synchronize the different processing steps with chOnuKvProcessingStep
609 go oo.deletePersistentData(ctx, processingStep)
610 if !oo.waitForTimeoutOrCompletion(ctx, oo.chOnuKvProcessingStep, processingStep) {
611 //timeout or error detected
dbainbri4d3a0dc2020-12-02 00:33:42 +0000612 logger.Debugw(ctx, "ONU-data not deleted - abort", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000613 oo.onuKVStoreprocResult = errors.New("onu-data delete aborted: during kv-access")
614 return
615 }
616}
617
618func (oo *OnuDeviceEntry) deletePersistentData(ctx context.Context, aProcessingStep uint8) {
619
dbainbri4d3a0dc2020-12-02 00:33:42 +0000620 logger.Debugw(ctx, "delete and clear internal persistency data", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandtdaf0f722021-02-12 11:50:30 +0000621
622 oo.persUniConfigMutex.Lock()
623 defer oo.persUniConfigMutex.Unlock()
624
Holger Hildebrandte3677f12021-02-05 14:50:56 +0000625 oo.sOnuPersistentData.PersUniConfig = nil //releasing all UniConfig entries to garbage collector
626 oo.sOnuPersistentData = onuPersistentData{0, 0, "", "", "", false, false, oo.mibAuditInterval, 0, 0, make([]uniPersConfig, 0)} //default entry
mpagenko2418ab02020-11-12 12:58:06 +0000627
dbainbri4d3a0dc2020-12-02 00:33:42 +0000628 logger.Debugw(ctx, "delete ONU-data from KVStore", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandtdaf0f722021-02-12 11:50:30 +0000629 oo.onuKVStoreMutex.Lock()
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000630 err := oo.onuKVStore.Delete(ctx, oo.onuKVStorePath)
Holger Hildebrandtdaf0f722021-02-12 11:50:30 +0000631 oo.onuKVStoreMutex.Unlock()
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000632 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000633 logger.Errorw(ctx, "unable to delete in KVstore", log.Fields{"device-id": oo.deviceID, "err": err})
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000634 oo.chOnuKvProcessingStep <- 0 //error indication
635 return
636 }
637 oo.chOnuKvProcessingStep <- aProcessingStep //done
638}
639
640func (oo *OnuDeviceEntry) updateOnuKvStore(ctx context.Context, wg *sync.WaitGroup) {
641 defer wg.Done()
642
643 if oo.onuKVStore == nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000644 logger.Debugw(ctx, "onuKVStore not set - abort", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000645 oo.onuKVStoreprocResult = errors.New("onu-data update aborted: onuKVStore not set")
646 return
647 }
648 var processingStep uint8 = 1 // used to synchronize the different processing steps with chOnuKvProcessingStep
649 go oo.storeDataInOnuKvStore(ctx, processingStep)
650 if !oo.waitForTimeoutOrCompletion(ctx, oo.chOnuKvProcessingStep, processingStep) {
651 //timeout or error detected
dbainbri4d3a0dc2020-12-02 00:33:42 +0000652 logger.Debugw(ctx, "ONU-data not written - abort", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000653 oo.onuKVStoreprocResult = errors.New("onu-data update aborted: during writing process")
654 return
655 }
656}
657
658func (oo *OnuDeviceEntry) storeDataInOnuKvStore(ctx context.Context, aProcessingStep uint8) {
659
660 //assign values which are not already present when newOnuDeviceEntry() is called
661 oo.sOnuPersistentData.PersOnuID = oo.baseDeviceHandler.pOnuIndication.OnuId
662 oo.sOnuPersistentData.PersIntfID = oo.baseDeviceHandler.pOnuIndication.IntfId
663 oo.sOnuPersistentData.PersSnr = oo.baseDeviceHandler.pOnuOmciDevice.serialNumber
664 //TODO: verify usage of these values during restart UC
Holger Hildebrandt3a644642020-12-02 09:46:18 +0000665 oo.sOnuPersistentData.PersAdminState = oo.baseDeviceHandler.pOnuIndication.AdminState
666 oo.sOnuPersistentData.PersOperState = oo.baseDeviceHandler.pOnuIndication.OperState
Holger Hildebrandtdaf0f722021-02-12 11:50:30 +0000667
668 oo.persUniConfigMutex.RLock()
669 defer oo.persUniConfigMutex.RUnlock()
dbainbri4d3a0dc2020-12-02 00:33:42 +0000670 logger.Debugw(ctx, "Update ONU-data in KVStore", log.Fields{"device-id": oo.deviceID, "sOnuPersistentData": oo.sOnuPersistentData})
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000671
672 Value, err := json.Marshal(oo.sOnuPersistentData)
673 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000674 logger.Errorw(ctx, "unable to marshal ONU-data", log.Fields{"sOnuPersistentData": oo.sOnuPersistentData,
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000675 "device-id": oo.deviceID, "err": err})
676 oo.chOnuKvProcessingStep <- 0 //error indication
677 return
678 }
Holger Hildebrandtdaf0f722021-02-12 11:50:30 +0000679 oo.onuKVStoreMutex.Lock()
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000680 err = oo.onuKVStore.Put(ctx, oo.onuKVStorePath, Value)
Holger Hildebrandtdaf0f722021-02-12 11:50:30 +0000681 oo.onuKVStoreMutex.Unlock()
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000682 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000683 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 +0000684 oo.chOnuKvProcessingStep <- 0 //error indication
685 return
686 }
687 oo.chOnuKvProcessingStep <- aProcessingStep //done
688}
689
dbainbri4d3a0dc2020-12-02 00:33:42 +0000690func (oo *OnuDeviceEntry) updateOnuUniTpPath(ctx context.Context, aUniID uint8, aTpID uint8, aPathString string) bool {
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000691 /* within some specific InterAdapter processing request write/read access to data is ensured to be sequentially,
692 as also the complete sequence is ensured to 'run to completion' before some new request is accepted
693 no specific concurrency protection to sOnuPersistentData is required here
694 */
Holger Hildebrandtdaf0f722021-02-12 11:50:30 +0000695 oo.persUniConfigMutex.Lock()
696 defer oo.persUniConfigMutex.Unlock()
697
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000698 for k, v := range oo.sOnuPersistentData.PersUniConfig {
699 if v.PersUniID == aUniID {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000700 logger.Debugw(ctx, "PersUniConfig-entry already exists", log.Fields{"device-id": oo.deviceID, "uniID": aUniID})
Girish Gowdra041dcb32020-11-16 16:54:30 -0800701 existingPath, ok := oo.sOnuPersistentData.PersUniConfig[k].PersTpPathMap[aTpID]
702 if !ok {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000703 logger.Debugw(ctx, "tp-does-not-exist--to-be-created-afresh", log.Fields{"device-id": oo.deviceID, "uniID": aUniID, "tpID": aTpID, "path": aPathString})
Girish Gowdra041dcb32020-11-16 16:54:30 -0800704 }
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000705 if existingPath != aPathString {
706 if aPathString == "" {
707 //existing entry to be deleted
dbainbri4d3a0dc2020-12-02 00:33:42 +0000708 logger.Debugw(ctx, "UniTp delete path value", log.Fields{"device-id": oo.deviceID, "uniID": aUniID, "path": aPathString})
Girish Gowdra041dcb32020-11-16 16:54:30 -0800709 oo.sOnuPersistentData.PersUniConfig[k].PersTpPathMap[aTpID] = ""
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000710 } else {
711 //existing entry to be modified
dbainbri4d3a0dc2020-12-02 00:33:42 +0000712 logger.Debugw(ctx, "UniTp modify path value", log.Fields{"device-id": oo.deviceID, "uniID": aUniID, "path": aPathString})
Girish Gowdra041dcb32020-11-16 16:54:30 -0800713 oo.sOnuPersistentData.PersUniConfig[k].PersTpPathMap[aTpID] = aPathString
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000714 }
715 return true
716 }
717 //entry already exists
mpagenkofc4f56e2020-11-04 17:17:49 +0000718 if aPathString == "" {
719 //no active TechProfile
dbainbri4d3a0dc2020-12-02 00:33:42 +0000720 logger.Debugw(ctx, "UniTp path has already been removed - no AniSide config to be removed", log.Fields{
mpagenkofc4f56e2020-11-04 17:17:49 +0000721 "device-id": oo.deviceID, "uniID": aUniID})
722 // attention 201105: this block is at the moment entered for each of subsequent GemPortDeletes and TContDelete
723 // as the path is already cleared with the first GemPort - this will probably change with the upcoming real
724 // TechProfile removal (still TODO), but anyway the reasonUpdate initiated here should not harm overall behavior
dbainbri4d3a0dc2020-12-02 00:33:42 +0000725 go oo.baseDeviceHandler.deviceProcStatusUpdate(ctx, OmciAniResourceRemoved)
mpagenkofc4f56e2020-11-04 17:17:49 +0000726 // no flow config pending on 'remove' so far
727 } else {
728 //the given TechProfile already exists and is assumed to be active - update devReason as if the config has been done here
729 //was needed e.g. in voltha POD Tests:Validate authentication on a disabled ONU
730 // (as here the TechProfile has not been removed with the disable-device before the new enable-device)
dbainbri4d3a0dc2020-12-02 00:33:42 +0000731 logger.Debugw(ctx, "UniTp path already exists - TechProfile supposed to be active", log.Fields{
mpagenkofc4f56e2020-11-04 17:17:49 +0000732 "device-id": oo.deviceID, "uniID": aUniID, "path": aPathString})
733 //no deviceReason update (deviceProcStatusUpdate) here to ensure 'omci_flows_pushed' state within disable/enable procedure of ATT scenario
734 // (during which the flows are removed/re-assigned but the techProf is left active)
735 //and as the TechProfile is regarded as active we have to verify, if some flow configuration still waits on it
736 // (should not be the case, but should not harm or be more robust ...)
mpagenko2418ab02020-11-12 12:58:06 +0000737 // and to be sure, that for some reason the corresponding TpDelete was lost somewhere in history
738 // we also reset a possibly outstanding delete request - repeated TpConfig is regarded as valid for waiting flow config
739 if oo.baseDeviceHandler.pOnuTP != nil {
Girish Gowdra041dcb32020-11-16 16:54:30 -0800740 oo.baseDeviceHandler.pOnuTP.setProfileToDelete(aUniID, aTpID, false)
mpagenko2418ab02020-11-12 12:58:06 +0000741 }
mpagenko551a4d42020-12-08 18:09:20 +0000742 go oo.baseDeviceHandler.VerifyVlanConfigRequest(ctx, aUniID, aTpID)
mpagenkofc4f56e2020-11-04 17:17:49 +0000743 }
744 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 +0000745 }
746 }
747 //no entry exists for uniId
748
749 if aPathString == "" {
750 //delete request in non-existing state , accept as no change
dbainbri4d3a0dc2020-12-02 00:33:42 +0000751 logger.Debugw(ctx, "UniTp path already removed", log.Fields{"device-id": oo.deviceID, "uniID": aUniID})
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000752 return false
753 }
754 //new entry to be created
dbainbri4d3a0dc2020-12-02 00:33:42 +0000755 logger.Debugw(ctx, "New UniTp path set", log.Fields{"device-id": oo.deviceID, "uniID": aUniID, "path": aPathString})
Girish Gowdra041dcb32020-11-16 16:54:30 -0800756 perSubTpPathMap := make(map[uint8]string)
757 perSubTpPathMap[aTpID] = aPathString
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000758 oo.sOnuPersistentData.PersUniConfig =
Girish Gowdra041dcb32020-11-16 16:54:30 -0800759 append(oo.sOnuPersistentData.PersUniConfig, uniPersConfig{PersUniID: aUniID, PersTpPathMap: perSubTpPathMap, PersFlowParams: make([]uniVlanFlowParams, 0)})
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000760 return true
761}
762
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000763func (oo *OnuDeviceEntry) updateOnuUniFlowConfig(aUniID uint8, aUniVlanFlowParams *[]uniVlanFlowParams) {
764
Holger Hildebrandtdaf0f722021-02-12 11:50:30 +0000765 oo.persUniConfigMutex.Lock()
766 defer oo.persUniConfigMutex.Unlock()
767
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000768 for k, v := range oo.sOnuPersistentData.PersUniConfig {
769 if v.PersUniID == aUniID {
770 oo.sOnuPersistentData.PersUniConfig[k].PersFlowParams = make([]uniVlanFlowParams, len(*aUniVlanFlowParams))
771 copy(oo.sOnuPersistentData.PersUniConfig[k].PersFlowParams, *aUniVlanFlowParams)
772 return
773 }
774 }
775 //flow update was faster than tp-config - create PersUniConfig-entry
Girish Gowdra041dcb32020-11-16 16:54:30 -0800776 tmpConfig := uniPersConfig{PersUniID: aUniID, PersTpPathMap: make(map[uint8]string), PersFlowParams: make([]uniVlanFlowParams, len(*aUniVlanFlowParams))}
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000777 copy(tmpConfig.PersFlowParams, *aUniVlanFlowParams)
778 oo.sOnuPersistentData.PersUniConfig = append(oo.sOnuPersistentData.PersUniConfig, tmpConfig)
779}
780
781func (oo *OnuDeviceEntry) waitForTimeoutOrCompletion(
782 ctx context.Context, aChOnuProcessingStep <-chan uint8, aProcessingStep uint8) bool {
783 select {
784 case <-ctx.Done():
dbainbri4d3a0dc2020-12-02 00:33:42 +0000785 logger.Warnw(ctx, "processing not completed in-time!",
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000786 log.Fields{"device-id": oo.deviceID, "error": ctx.Err()})
787 return false
788 case rxStep := <-aChOnuProcessingStep:
789 if rxStep == aProcessingStep {
790 return true
791 }
792 //all other values are not accepted - including 0 for error indication
dbainbri4d3a0dc2020-12-02 00:33:42 +0000793 logger.Warnw(ctx, "Invalid processing step received: abort!",
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000794 log.Fields{"device-id": oo.deviceID,
795 "wantedStep": aProcessingStep, "haveStep": rxStep})
796 return false
797 }
798}
799
800func (oo *OnuDeviceEntry) resetKvProcessingErrorIndication() {
801 oo.onuKVStoreprocResult = nil
802}
803func (oo *OnuDeviceEntry) getKvProcessingErrorIndication() error {
804 return oo.onuKVStoreprocResult
805}
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +0000806func (oo *OnuDeviceEntry) incrementMibDataSync(ctx context.Context) {
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000807 if oo.sOnuPersistentData.PersMibDataSyncAdpt < 255 {
808 oo.sOnuPersistentData.PersMibDataSyncAdpt++
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +0000809 } else {
810 // per G.984 and G.988 overflow starts over at 1 given 0 is reserved for reset
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000811 oo.sOnuPersistentData.PersMibDataSyncAdpt = 1
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +0000812 }
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000813 logger.Debugf(ctx, "mibDataSync updated - mds: %d - device-id: %s", oo.sOnuPersistentData.PersMibDataSyncAdpt, oo.deviceID)
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +0000814}