blob: b623bf91355ded302e6fc32dcd2dade3ca5a3176 [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 Hildebrandtccd390c2020-05-29 13:49:04 +000022 "errors"
23
Holger Hildebrandtfa074992020-03-27 15:42:06 +000024 //"sync"
25 //"time"
26
27 "github.com/looplab/fsm"
28 "github.com/opencord/voltha-lib-go/v3/pkg/adapters/adapterif"
Holger Hildebrandtccd390c2020-05-29 13:49:04 +000029 "github.com/opencord/voltha-lib-go/v3/pkg/db"
Holger Hildebrandtfa074992020-03-27 15:42:06 +000030
31 //"github.com/opencord/voltha-lib-go/v3/pkg/kafka"
32 "github.com/opencord/voltha-lib-go/v3/pkg/log"
33 //ic "github.com/opencord/voltha-protos/v3/go/inter_container"
34 //"github.com/opencord/voltha-protos/v3/go/openflow_13"
35 //"github.com/opencord/voltha-protos/v3/go/voltha"
36)
37
Holger Hildebrandtccd390c2020-05-29 13:49:04 +000038const (
mpagenko1cc3cb42020-07-27 15:24:38 +000039 // events of MibUpload FSM
40 ulEvStart = "ulEvStart"
41 ulEvResetMib = "ulEvResetMib"
42 ulEvGetVendorAndSerial = "ulEvGetVendorAndSerial"
43 ulEvGetEquipmentId = "ulEvGetEquipmentId"
44 ulEvGetFirstSwVersion = "ulEvGetFirstSwVersion"
45 ulEvGetSecondSwVersion = "ulEvGetSecondSwVersion"
46 ulEvGetMacAddress = "ulEvGetMacAddress"
47 ulEvGetMibTemplate = "ulEvGetMibTemplate"
48 ulEvUploadMib = "ulEvUploadMib"
49 ulEvExamineMds = "ulEvExamineMds"
50 ulEvSuccess = "ulEvSuccess"
51 ulEvMismatch = "ulEvMismatch"
52 ulEvAuditMib = "ulEvAuditMib"
53 ulEvForceResync = "ulEvForceResync"
54 ulEvDiffsFound = "ulEvDiffsFound"
55 ulEvTimeout = "ulEvTimeout"
56 ulEvStop = "ulEvStop"
57)
58const (
59 // states of MibUpload FSM
60 ulStDisabled = "ulStDisabled"
61 ulStStarting = "ulStStarting"
62 ulStResettingMib = "ulStResettingMib"
63 ulStGettingVendorAndSerial = "ulStGettingVendorAndSerial"
64 ulStGettingEquipmentId = "ulStGettingEquipmentId"
65 ulStGettingFirstSwVersion = "ulStGettingFirstSwVersion"
66 ulStGettingSecondSwVersion = "ulStGettingSecondSwVersion"
67 ulStGettingMacAddress = "ulStGettingMacAddress"
68 ulStGettingMibTemplate = "ulStGettingMibTemplate"
69 ulStUploading = "ulStUploading"
70 ulStInSync = "ulStInSync"
71 ulStExaminingMds = "ulStExaminingMds"
72 ulStResynchronizing = "ulStResynchronizing"
73 ulStAuditing = "ulStAuditing"
74 ulStOutOfSync = "ulStOutOfSync"
75)
76
77const (
78 // events of MibDownload FSM
79 dlEvStart = "dlEvStart"
80 dlEvCreateGal = "dlEvCreateGal"
81 dlEvRxGalResp = "dlEvRxGalResp"
82 dlEvRxOnu2gResp = "dlEvRxOnu2gResp"
83 dlEvRxBridgeResp = "dlEvRxBridgeResp"
84 dlEvTimeoutSimple = "dlEvTimeoutSimple"
85 dlEvTimeoutBridge = "dlEvTimeoutBridge"
86 dlEvReset = "dlEvReset"
87 dlEvRestart = "dlEvRestart"
88)
89const (
90 // states of MibDownload FSM
91 dlStDisabled = "dlStDisabled"
92 dlStStarting = "dlStStarting"
93 dlStCreatingGal = "dlStCreatingGal"
94 dlStSettingOnu2g = "dlStSettingOnu2g"
95 dlStBridgeInit = "dlStBridgeInit"
96 dlStDownloaded = "dlStDownloaded"
97 dlStResetting = "dlStResetting"
98)
99
100const (
mpagenkoaf801632020-07-03 10:00:42 +0000101 cBasePathMibTemplateKvStore = "service/voltha/omci_mibs/templates"
102 cSuffixMibTemplateKvStore = "%s/%s/%s"
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000103)
104
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000105type OnuDeviceEvent int
106
107const (
108 // Events of interest to Device Adapters and OpenOMCI State Machines
109 DeviceStatusInit OnuDeviceEvent = 0 // OnuDeviceEntry default start state
110 MibDatabaseSync OnuDeviceEvent = 1 // MIB database sync (upload done)
111 OmciCapabilitiesDone OnuDeviceEvent = 2 // OMCI ME and message type capabilities known
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000112 MibDownloadDone OnuDeviceEvent = 3 // MIB database sync (upload done)
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000113 UniLockStateDone OnuDeviceEvent = 4 // Uni ports admin set to lock
114 UniUnlockStateDone OnuDeviceEvent = 5 // Uni ports admin set to unlock
115 UniAdminStateDone OnuDeviceEvent = 6 // Uni ports admin set done - general
116 PortLinkUp OnuDeviceEvent = 7 // Port link state change
117 PortLinkDw OnuDeviceEvent = 8 // Port link state change
mpagenko3dbcdd22020-07-22 07:38:45 +0000118 OmciAniConfigDone OnuDeviceEvent = 9 // AniSide config according to TechProfile done
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000119 // Add other events here as needed (alarms separate???)
120)
121
122type activityDescr struct {
123 databaseClass func() error
124 advertiseEvents bool
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000125 auditDelay uint16
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000126 //tasks map[string]func() error
127}
128type OmciDeviceFsms map[string]activityDescr
129
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000130type AdapterFsm struct {
131 fsmName string
132 deviceID string
133 commChan chan Message
134 pFsm *fsm.FSM
135}
136
137func NewAdapterFsm(a_name string, a_deviceID string, a_commChannel chan Message) *AdapterFsm {
138 aFsm := &AdapterFsm{
139 fsmName: a_name,
140 deviceID: a_deviceID,
141 commChan: a_commChannel,
142 }
143 return aFsm
144}
145
146//Start starts (logs) the omci agent
147func (oo *AdapterFsm) logFsmStateChange(e *fsm.Event) {
148 logger.Debugw("FSM state change", log.Fields{"device-id": oo.deviceID, "FSM name": oo.fsmName,
149 "event name": string(e.Event), "src state": string(e.Src), "dst state": string(e.Dst)})
150}
151
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000152//OntDeviceEntry structure holds information about the attached FSM'as and their communication
Holger Hildebrandtc54939a2020-06-17 08:14:27 +0000153
154const (
155 FirstSwImageMeId = 0
156 SecondSwImageMeId = 1
157)
158const OnugMeId = 0
159const Onu2gMeId = 0
160const IpHostConfigDataMeId = 1
161const OnugSerialNumberLen = 8
162const OmciMacAddressLen = 6
163
164type SwImages struct {
165 version string
166 isActive uint8
167}
168
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000169type OnuDeviceEntry struct {
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000170 deviceID string
171 baseDeviceHandler *DeviceHandler
172 coreProxy adapterif.CoreProxy
173 adapterProxy adapterif.AdapterProxy
174 started bool
175 PDevOmciCC *OmciCC
176 pOnuDB *OnuDeviceDB
177 mibTemplateKVStore *db.Backend
178 vendorID string
179 serialNumber string
180 equipmentID string
Holger Hildebrandtc54939a2020-06-17 08:14:27 +0000181 swImages [SecondSwImageMeId + 1]SwImages
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000182 activeSwVersion string
183 macAddress string
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000184 //lockDeviceEntries sync.RWMutex
185 mibDbClass func() error
186 supportedFsms OmciDeviceFsms
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000187 devState OnuDeviceEvent
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000188 // for mibUpload
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000189 mibAuditDelay uint16
mpagenko1cc3cb42020-07-27 15:24:38 +0000190 mibDebugLevel string
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000191
192 // for mibUpload
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000193 pMibUploadFsm *AdapterFsm //could be handled dynamically and more general as pAdapterFsm - perhaps later
194 // for mibDownload
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000195 pMibDownloadFsm *AdapterFsm //could be handled dynamically and more general as pAdapterFsm - perhaps later
196 //remark: general usage of pAdapterFsm would require generalization of commChan usage and internal event setting
197 // within the FSM event procedures
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000198 omciMessageReceived chan bool //seperate channel needed by DownloadFsm
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000199}
200
201//OnuDeviceEntry returns a new instance of a OnuDeviceEntry
202//mib_db (as well as not inluded alarm_db not really used in this code? VERIFY!!)
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000203func NewOnuDeviceEntry(ctx context.Context, device_id string, kVStoreHost string, kVStorePort int, kvStoreType string, device_Handler *DeviceHandler,
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000204 core_proxy adapterif.CoreProxy, adapter_proxy adapterif.AdapterProxy,
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000205 supported_Fsms_Ptr *OmciDeviceFsms) *OnuDeviceEntry {
206 logger.Infow("init-onuDeviceEntry", log.Fields{"deviceId": device_id})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000207 var onuDeviceEntry OnuDeviceEntry
208 onuDeviceEntry.started = false
209 onuDeviceEntry.deviceID = device_id
210 onuDeviceEntry.baseDeviceHandler = device_Handler
211 onuDeviceEntry.coreProxy = core_proxy
212 onuDeviceEntry.adapterProxy = adapter_proxy
213 onuDeviceEntry.devState = DeviceStatusInit
214 //openomciagent.lockDeviceHandlersMap = sync.RWMutex{}
215 //OMCI related databases are on a per-agent basis. State machines and tasks
216 //are per ONU Vendor
217 //
218 // MIB Synchronization Database - possible overloading from arguments
219 if supported_Fsms_Ptr != nil {
220 onuDeviceEntry.supportedFsms = *supported_Fsms_Ptr
221 } else {
222 //var mibSyncFsm = NewMibSynchronizer()
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000223 // use some internaö defaults, if not defined from outside
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000224 onuDeviceEntry.supportedFsms = OmciDeviceFsms{
225 "mib-synchronizer": {
226 //mibSyncFsm, // Implements the MIB synchronization state machine
227 onuDeviceEntry.MibDbVolatileDict, // Implements volatile ME MIB database
228 true, // Advertise events on OpenOMCI event bus
229 60, // Time to wait between MIB audits. 0 to disable audits.
230 // map[string]func() error{
231 // "mib-upload": onuDeviceEntry.MibUploadTask,
232 // "mib-template": onuDeviceEntry.MibTemplateTask,
233 // "get-mds": onuDeviceEntry.GetMdsTask,
234 // "mib-audit": onuDeviceEntry.GetMdsTask,
235 // "mib-resync": onuDeviceEntry.MibResyncTask,
236 // "mib-reconcile": onuDeviceEntry.MibReconcileTask,
237 // },
238 },
239 }
240 }
241 onuDeviceEntry.mibDbClass = onuDeviceEntry.supportedFsms["mib-synchronizer"].databaseClass
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000242 logger.Debug("access2mibDbClass")
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000243 go onuDeviceEntry.mibDbClass()
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000244 onuDeviceEntry.mibAuditDelay = onuDeviceEntry.supportedFsms["mib-synchronizer"].auditDelay
245 logger.Debugw("MibAudit is set to", log.Fields{"Delay": onuDeviceEntry.mibAuditDelay})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000246
mpagenko1cc3cb42020-07-27 15:24:38 +0000247 onuDeviceEntry.mibDebugLevel = "normal" //set to "verbose" if you want to have all output, possibly later also per config option!
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000248 // Omci related Mib upload sync state machine
249 mibUploadChan := make(chan Message, 2048)
250 onuDeviceEntry.pMibUploadFsm = NewAdapterFsm("MibUpload", device_id, mibUploadChan)
251 onuDeviceEntry.pMibUploadFsm.pFsm = fsm.NewFSM(
mpagenko1cc3cb42020-07-27 15:24:38 +0000252 ulStDisabled,
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000253 fsm.Events{
254
mpagenko1cc3cb42020-07-27 15:24:38 +0000255 {Name: ulEvStart, Src: []string{ulStDisabled}, Dst: ulStStarting},
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000256
mpagenko1cc3cb42020-07-27 15:24:38 +0000257 {Name: ulEvResetMib, Src: []string{ulStStarting}, Dst: ulStResettingMib},
258 {Name: ulEvGetVendorAndSerial, Src: []string{ulStResettingMib}, Dst: ulStGettingVendorAndSerial},
259 {Name: ulEvGetEquipmentId, Src: []string{ulStGettingVendorAndSerial}, Dst: ulStGettingEquipmentId},
260 {Name: ulEvGetFirstSwVersion, Src: []string{ulStGettingEquipmentId}, Dst: ulStGettingFirstSwVersion},
261 {Name: ulEvGetSecondSwVersion, Src: []string{ulStGettingFirstSwVersion}, Dst: ulStGettingSecondSwVersion},
262 {Name: ulEvGetMacAddress, Src: []string{ulStGettingSecondSwVersion}, Dst: ulStGettingMacAddress},
263 {Name: ulEvGetMibTemplate, Src: []string{ulStGettingMacAddress}, Dst: ulStGettingMibTemplate},
Holger Hildebrandtc54939a2020-06-17 08:14:27 +0000264
mpagenko1cc3cb42020-07-27 15:24:38 +0000265 {Name: ulEvUploadMib, Src: []string{ulStGettingMibTemplate}, Dst: ulStUploading},
266 {Name: ulEvExamineMds, Src: []string{ulStStarting}, Dst: ulStExaminingMds},
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000267
mpagenko1cc3cb42020-07-27 15:24:38 +0000268 {Name: ulEvSuccess, Src: []string{ulStGettingMibTemplate}, Dst: ulStInSync},
269 {Name: ulEvSuccess, Src: []string{ulStUploading}, Dst: ulStInSync},
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000270
mpagenko1cc3cb42020-07-27 15:24:38 +0000271 {Name: ulEvSuccess, Src: []string{ulStExaminingMds}, Dst: ulStInSync},
272 {Name: ulEvMismatch, Src: []string{ulStExaminingMds}, Dst: ulStResynchronizing},
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000273
mpagenko1cc3cb42020-07-27 15:24:38 +0000274 {Name: ulEvAuditMib, Src: []string{ulStInSync}, Dst: ulStAuditing},
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000275
mpagenko1cc3cb42020-07-27 15:24:38 +0000276 {Name: ulEvSuccess, Src: []string{ulStOutOfSync}, Dst: ulStInSync},
277 {Name: ulEvAuditMib, Src: []string{ulStOutOfSync}, Dst: ulStAuditing},
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000278
mpagenko1cc3cb42020-07-27 15:24:38 +0000279 {Name: ulEvSuccess, Src: []string{ulStAuditing}, Dst: ulStInSync},
280 {Name: ulEvMismatch, Src: []string{ulStAuditing}, Dst: ulStResynchronizing},
281 {Name: ulEvForceResync, Src: []string{ulStAuditing}, Dst: ulStResynchronizing},
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000282
mpagenko1cc3cb42020-07-27 15:24:38 +0000283 {Name: ulEvSuccess, Src: []string{ulStResynchronizing}, Dst: ulStInSync},
284 {Name: ulEvDiffsFound, Src: []string{ulStResynchronizing}, Dst: ulStOutOfSync},
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000285
mpagenko1cc3cb42020-07-27 15:24:38 +0000286 {Name: ulEvTimeout, Src: []string{ulStResettingMib, ulStGettingVendorAndSerial, ulStGettingEquipmentId, ulStGettingFirstSwVersion,
287 ulStGettingSecondSwVersion, ulStGettingMacAddress, ulStGettingMibTemplate, ulStUploading, ulStResynchronizing, ulStExaminingMds,
288 ulStInSync, ulStOutOfSync, ulStAuditing}, Dst: ulStStarting},
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000289
mpagenko1cc3cb42020-07-27 15:24:38 +0000290 {Name: ulEvStop, Src: []string{ulStStarting, ulStResettingMib, ulStGettingVendorAndSerial, ulStGettingEquipmentId, ulStGettingFirstSwVersion,
291 ulStGettingSecondSwVersion, ulStGettingMacAddress, ulStGettingMibTemplate, ulStUploading, ulStResynchronizing, ulStExaminingMds,
292 ulStInSync, ulStOutOfSync, ulStAuditing}, Dst: ulStDisabled},
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000293 },
294
295 fsm.Callbacks{
mpagenko1cc3cb42020-07-27 15:24:38 +0000296 "enter_state": func(e *fsm.Event) { onuDeviceEntry.pMibUploadFsm.logFsmStateChange(e) },
297 ("enter_" + ulStStarting): func(e *fsm.Event) { onuDeviceEntry.enterStartingState(e) },
298 ("enter_" + ulStResettingMib): func(e *fsm.Event) { onuDeviceEntry.enterResettingMibState(e) },
299 ("enter_" + ulStGettingVendorAndSerial): func(e *fsm.Event) { onuDeviceEntry.enterGettingVendorAndSerialState(e) },
300 ("enter_" + ulStGettingEquipmentId): func(e *fsm.Event) { onuDeviceEntry.enterGettingEquipmentIdState(e) },
301 ("enter_" + ulStGettingFirstSwVersion): func(e *fsm.Event) { onuDeviceEntry.enterGettingFirstSwVersionState(e) },
302 ("enter_" + ulStGettingSecondSwVersion): func(e *fsm.Event) { onuDeviceEntry.enterGettingSecondSwVersionState(e) },
303 ("enter_" + ulStGettingMacAddress): func(e *fsm.Event) { onuDeviceEntry.enterGettingMacAddressState(e) },
304 ("enter_" + ulStGettingMibTemplate): func(e *fsm.Event) { onuDeviceEntry.enterGettingMibTemplate(e) },
305 ("enter_" + ulStUploading): func(e *fsm.Event) { onuDeviceEntry.enterUploadingState(e) },
306 ("enter_" + ulStExaminingMds): func(e *fsm.Event) { onuDeviceEntry.enterExaminingMdsState(e) },
307 ("enter_" + ulStResynchronizing): func(e *fsm.Event) { onuDeviceEntry.enterResynchronizingState(e) },
308 ("enter_" + ulStAuditing): func(e *fsm.Event) { onuDeviceEntry.enterAuditingState(e) },
309 ("enter_" + ulStOutOfSync): func(e *fsm.Event) { onuDeviceEntry.enterOutOfSyncState(e) },
310 ("enter_" + ulStInSync): func(e *fsm.Event) { onuDeviceEntry.enterInSyncState(e) },
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000311 },
312 )
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000313 // Omci related Mib download state machine
314 mibDownloadChan := make(chan Message, 2048)
315 onuDeviceEntry.pMibDownloadFsm = NewAdapterFsm("MibDownload", device_id, mibDownloadChan)
316 onuDeviceEntry.pMibDownloadFsm.pFsm = fsm.NewFSM(
mpagenko1cc3cb42020-07-27 15:24:38 +0000317 dlStDisabled,
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000318 fsm.Events{
319
mpagenko1cc3cb42020-07-27 15:24:38 +0000320 {Name: dlEvStart, Src: []string{dlStDisabled}, Dst: dlStStarting},
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000321
mpagenko1cc3cb42020-07-27 15:24:38 +0000322 {Name: dlEvCreateGal, Src: []string{dlStStarting}, Dst: dlStCreatingGal},
323 {Name: dlEvRxGalResp, Src: []string{dlStCreatingGal}, Dst: dlStSettingOnu2g},
324 {Name: dlEvRxOnu2gResp, Src: []string{dlStSettingOnu2g}, Dst: dlStBridgeInit},
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000325 // the bridge state is used for multi ME config for alle UNI related ports
326 // maybe such could be reflected in the state machine as well (port number parametrized)
327 // but that looks not straightforward here - so we keep it simple here for the beginning(?)
mpagenko1cc3cb42020-07-27 15:24:38 +0000328 {Name: dlEvRxBridgeResp, Src: []string{dlStBridgeInit}, Dst: dlStDownloaded},
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000329
mpagenko1cc3cb42020-07-27 15:24:38 +0000330 {Name: dlEvTimeoutSimple, Src: []string{dlStCreatingGal, dlStSettingOnu2g}, Dst: dlStStarting},
331 {Name: dlEvTimeoutBridge, Src: []string{dlStBridgeInit}, Dst: dlStStarting},
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000332
mpagenko1cc3cb42020-07-27 15:24:38 +0000333 {Name: dlEvReset, Src: []string{dlStStarting, dlStCreatingGal, dlStSettingOnu2g,
334 dlStBridgeInit, dlStDownloaded}, Dst: dlStResetting},
335 // exceptional treatment for all states except dlStResetting
336 {Name: dlEvRestart, Src: []string{dlStStarting, dlStCreatingGal, dlStSettingOnu2g,
337 dlStBridgeInit, dlStDownloaded, dlStResetting}, Dst: dlStDisabled},
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000338 },
339
340 fsm.Callbacks{
mpagenko1cc3cb42020-07-27 15:24:38 +0000341 "enter_state": func(e *fsm.Event) { onuDeviceEntry.pMibDownloadFsm.logFsmStateChange(e) },
342 ("enter_" + dlStStarting): func(e *fsm.Event) { onuDeviceEntry.enterDLStartingState(e) },
343 ("enter_" + dlStCreatingGal): func(e *fsm.Event) { onuDeviceEntry.enterCreatingGalState(e) },
344 ("enter_" + dlStSettingOnu2g): func(e *fsm.Event) { onuDeviceEntry.enterSettingOnu2gState(e) },
345 ("enter_" + dlStBridgeInit): func(e *fsm.Event) { onuDeviceEntry.enterBridgeInitState(e) },
346 ("enter_" + dlStDownloaded): func(e *fsm.Event) { onuDeviceEntry.enterDownloadedState(e) },
347 ("enter_" + dlStResetting): func(e *fsm.Event) { onuDeviceEntry.enterResettingState(e) },
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000348 },
349 )
350 if onuDeviceEntry.pMibDownloadFsm == nil || onuDeviceEntry.pMibDownloadFsm.pFsm == nil {
351 logger.Error("MibDownloadFsm could not be instantiated!!")
352 // some specifc error treatment - or waiting for crash ???
353 }
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000354
mpagenkoaf801632020-07-03 10:00:42 +0000355 onuDeviceEntry.mibTemplateKVStore = onuDeviceEntry.baseDeviceHandler.SetBackend(cBasePathMibTemplateKvStore)
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000356 if onuDeviceEntry.mibTemplateKVStore == nil {
mpagenkoaf801632020-07-03 10:00:42 +0000357 logger.Errorw("Failed to setup mibTemplateKVStore", log.Fields{"deviceID": device_id})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000358 }
359
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000360 // Alarm Synchronization Database
361 //self._alarm_db = None
362 //self._alarm_database_cls = support_classes['alarm-synchronizer']['database']
363 return &onuDeviceEntry
364}
365
366//Start starts (logs) the omci agent
367func (oo *OnuDeviceEntry) Start(ctx context.Context) error {
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000368 logger.Info("starting-OnuDeviceEntry")
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000369
370 oo.PDevOmciCC = NewOmciCC(ctx, oo, oo.deviceID, oo.baseDeviceHandler,
371 oo.coreProxy, oo.adapterProxy)
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000372 if oo.PDevOmciCC == nil {
373 logger.Errorw("Could not create devOmciCc - abort", log.Fields{"for device": oo.deviceID})
374 return errors.New("Could not create devOmciCc")
375 }
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000376
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000377 oo.started = true
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000378 logger.Info("OnuDeviceEntry-started")
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000379 return nil
380}
381
382//Stop terminates the session
383func (oo *OnuDeviceEntry) Stop(ctx context.Context) error {
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000384 logger.Info("stopping-OnuDeviceEntry")
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000385 oo.started = false
386 //oo.exitChannel <- 1
mpagenko3af1f032020-06-10 08:53:41 +0000387 // maybe also the omciCC should be stopped here - for now not as no real processing is expected here - maybe needs consolidation
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000388 logger.Info("OnuDeviceEntry-stopped")
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000389 return nil
390}
391
392//Relay the InSync message via Handler to Rw core - Status update
393func (oo *OnuDeviceEntry) transferSystemEvent(dev_Event OnuDeviceEvent) error {
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000394 logger.Debugw("relaying system-event", log.Fields{"Event": dev_Event})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000395 // decouple the handler transfer from further processing here
396 // TODO!!! check if really no synch is required within the system e.g. to ensure following steps ..
397 if dev_Event == MibDatabaseSync {
398 if oo.devState < MibDatabaseSync { //devState has not been synced yet
399 oo.devState = MibDatabaseSync
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000400 go oo.baseDeviceHandler.DeviceProcStatusUpdate(dev_Event)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000401 //TODO!!! device control: next step: start MIB capability verification from here ?!!!
402 } else {
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000403 logger.Debugw("mibinsync-event in some already synced state - ignored", log.Fields{"state": oo.devState})
404 }
405 } else if dev_Event == MibDownloadDone {
406 if oo.devState < MibDownloadDone { //devState has not been synced yet
407 oo.devState = MibDownloadDone
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000408 go oo.baseDeviceHandler.DeviceProcStatusUpdate(dev_Event)
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000409 } else {
410 logger.Debugw("mibdownloaddone-event was already seen - ignored", log.Fields{"state": oo.devState})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000411 }
412 } else {
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000413 logger.Warnw("device-event not yet handled", log.Fields{"state": dev_Event})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000414 }
415 return nil
416}