blob: 7a28a8307e4254b8b04232fdf30ddaddb60b7d16 [file] [log] [blame]
khenaidoob9203542018-09-17 22:56:37 -04001/*
2 * Copyright 2018-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 */
npujar1d86a522019-11-14 17:11:16 +053016
Kent Hagerman6031aad2020-07-29 16:36:33 -040017package state
khenaidoob9203542018-09-17 22:56:37 -040018
19import (
npujar467fe752020-01-16 20:17:45 +053020 "context"
Himani Chawla2ba1c9c2020-10-07 13:19:03 +053021 "reflect"
22 "runtime"
serkant.uluderyae25f6482020-12-17 21:08:38 +030023
24 "github.com/opencord/voltha-lib-go/v5/pkg/log"
25 "github.com/opencord/voltha-protos/v4/go/voltha"
khenaidoob9203542018-09-17 22:56:37 -040026)
27
Kent Hagerman2b216042020-04-03 18:28:56 -040028// deviceType mentions type of device like parent, child
29type deviceType int32
khenaidoob9203542018-09-17 22:56:37 -040030
31const (
Kent Hagerman2b216042020-04-03 18:28:56 -040032 parent deviceType = 0
33 child deviceType = 1
34 any deviceType = 2
khenaidoob9203542018-09-17 22:56:37 -040035)
36
Himani Chawla2ba1c9c2020-10-07 13:19:03 +053037type matchResult uint16
khenaidoo442e7c72020-03-10 16:13:48 -040038
39const (
Kent Hagerman2b216042020-04-03 18:28:56 -040040 noMatch matchResult = iota // current state has not match in the transition table
khenaidoo442e7c72020-03-10 16:13:48 -040041 currWildcardMatch // current state matches the wildcard *_UNKNOWN state in the transition table
42 currStateOnlyMatch // current state matches the current state and previous state matches the wildcard in the transition table
43 currPrevStateMatch // both current and previous states match in the transition table
44)
45
46// match is used to keep the current match states
47type match struct {
Himani Chawla2ba1c9c2020-10-07 13:19:03 +053048 admin, oper, conn, transient matchResult
khenaidoo442e7c72020-03-10 16:13:48 -040049}
50
51// toInt returns an integer representing the matching level of the match (the larger the number the better)
52func (m *match) toInt() int {
Himani Chawla2ba1c9c2020-10-07 13:19:03 +053053 return int(m.transient<<8 | m.admin<<4 | m.oper<<2 | m.conn)
khenaidoo442e7c72020-03-10 16:13:48 -040054}
55
56// isExactMatch returns true if match is an exact match
57func (m *match) isExactMatch() bool {
Himani Chawla2ba1c9c2020-10-07 13:19:03 +053058 return m.admin == currPrevStateMatch && m.oper == currPrevStateMatch && m.conn == currPrevStateMatch &&
59 m.transient == currPrevStateMatch
khenaidoo442e7c72020-03-10 16:13:48 -040060}
61
62// isBetterMatch returns true if newMatch is a worse match
63func (m *match) isBetterMatch(newMatch *match) bool {
64 return m.toInt() > newMatch.toInt()
65}
66
Kent Hagerman2b216042020-04-03 18:28:56 -040067// deviceState has admin, operational and connection status of device
68type deviceState struct {
serkant.uluderya2ae470f2020-01-21 11:13:09 -080069 Admin voltha.AdminState_Types
70 Connection voltha.ConnectStatus_Types
71 Operational voltha.OperStatus_Types
Himani Chawla2ba1c9c2020-10-07 13:19:03 +053072 Transient voltha.DeviceTransientState_Types
khenaidoob9203542018-09-17 22:56:37 -040073}
74
Kent Hagerman6031aad2020-07-29 16:36:33 -040075// transitionHandler function type which takes the current and previous device info as input parameter
76type transitionHandler func(context.Context, *voltha.Device) error
khenaidoob9203542018-09-17 22:56:37 -040077
Kent Hagerman6031aad2020-07-29 16:36:33 -040078// transition represent transition related attributes
79type transition struct {
Kent Hagerman2b216042020-04-03 18:28:56 -040080 deviceType deviceType
81 previousState deviceState
82 currentState deviceState
Kent Hagerman6031aad2020-07-29 16:36:33 -040083 handlers []transitionHandler
khenaidoob9203542018-09-17 22:56:37 -040084}
85
npujar1d86a522019-11-14 17:11:16 +053086// TransitionMap represent map of transitions and device manager
khenaidoob9203542018-09-17 22:56:37 -040087type TransitionMap struct {
Kent Hagerman6031aad2020-07-29 16:36:33 -040088 transitions []transition
89 dMgr DeviceManager
90}
91
92// DeviceManager represents a generic device manager
93type DeviceManager interface {
94 NotifyInvalidTransition(ctx context.Context, curr *voltha.Device) error
95 CreateLogicalDevice(ctx context.Context, curr *voltha.Device) error
96 SetupUNILogicalPorts(ctx context.Context, curr *voltha.Device) error
97 DeleteLogicalDevice(ctx context.Context, curr *voltha.Device) error
98 DeleteLogicalPorts(ctx context.Context, curr *voltha.Device) error
99 DeleteAllChildDevices(ctx context.Context, curr *voltha.Device) error
100 RunPostDeviceDelete(ctx context.Context, curr *voltha.Device) error
101 ChildDeviceLost(ctx context.Context, curr *voltha.Device) error
102 DeleteAllLogicalPorts(ctx context.Context, curr *voltha.Device) error
serkant.uluderyae25f6482020-12-17 21:08:38 +0300103 DeleteAllLogicalMeters(ctx context.Context, curr *voltha.Device) error
Kent Hagerman6031aad2020-07-29 16:36:33 -0400104 DeleteAllDeviceFlows(ctx context.Context, curr *voltha.Device) error
Maninder0aabf0c2021-03-17 14:55:14 +0530105 ReconcilingCleanup(ctx context.Context, curr *voltha.Device) error
khenaidoob9203542018-09-17 22:56:37 -0400106}
107
npujar1d86a522019-11-14 17:11:16 +0530108// NewTransitionMap creates transition map
Kent Hagerman6031aad2020-07-29 16:36:33 -0400109func NewTransitionMap(dMgr DeviceManager) *TransitionMap {
khenaidoob9203542018-09-17 22:56:37 -0400110 var transitionMap TransitionMap
khenaidoo0a822f92019-05-08 15:15:57 -0400111 transitionMap.dMgr = dMgr
Kent Hagerman6031aad2020-07-29 16:36:33 -0400112 transitionMap.transitions = make([]transition, 0)
khenaidoo442e7c72020-03-10 16:13:48 -0400113 transitionMap.transitions = append(
114 transitionMap.transitions,
Kent Hagerman6031aad2020-07-29 16:36:33 -0400115 transition{
khenaidoob9203542018-09-17 22:56:37 -0400116 deviceType: parent,
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530117 previousState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_ACTIVATING, Transient: voltha.DeviceTransientState_NONE},
118 currentState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_ACTIVE, Transient: voltha.DeviceTransientState_NONE},
Kent Hagerman6031aad2020-07-29 16:36:33 -0400119 handlers: []transitionHandler{dMgr.CreateLogicalDevice}})
khenaidoo0a822f92019-05-08 15:15:57 -0400120 transitionMap.transitions = append(transitionMap.transitions,
Kent Hagerman6031aad2020-07-29 16:36:33 -0400121 transition{
khenaidoo59ef7be2019-06-21 12:40:28 -0400122 deviceType: child,
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530123 previousState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_DISCOVERED, Transient: voltha.DeviceTransientState_NONE},
124 currentState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_ACTIVATING, Transient: voltha.DeviceTransientState_NONE},
Kent Hagerman6031aad2020-07-29 16:36:33 -0400125 handlers: []transitionHandler{}})
khenaidoo442e7c72020-03-10 16:13:48 -0400126 transitionMap.transitions = append(transitionMap.transitions,
Kent Hagerman6031aad2020-07-29 16:36:33 -0400127 transition{
khenaidoo442e7c72020-03-10 16:13:48 -0400128 deviceType: child,
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530129 previousState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_DISCOVERED, Transient: voltha.DeviceTransientState_NONE},
130 currentState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_ACTIVE, Transient: voltha.DeviceTransientState_NONE},
Kent Hagerman6031aad2020-07-29 16:36:33 -0400131 handlers: []transitionHandler{dMgr.SetupUNILogicalPorts}})
khenaidoob9203542018-09-17 22:56:37 -0400132 transitionMap.transitions = append(transitionMap.transitions,
Kent Hagerman6031aad2020-07-29 16:36:33 -0400133 transition{
khenaidoob9203542018-09-17 22:56:37 -0400134 deviceType: child,
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530135 previousState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_ACTIVATING, Transient: voltha.DeviceTransientState_NONE},
136 currentState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_DISCOVERED, Transient: voltha.DeviceTransientState_NONE},
Kent Hagerman6031aad2020-07-29 16:36:33 -0400137 handlers: []transitionHandler{}})
khenaidoo442e7c72020-03-10 16:13:48 -0400138 transitionMap.transitions = append(transitionMap.transitions,
Kent Hagerman6031aad2020-07-29 16:36:33 -0400139 transition{
khenaidoo442e7c72020-03-10 16:13:48 -0400140 deviceType: child,
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530141 previousState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_ACTIVATING, Transient: voltha.DeviceTransientState_NONE},
142 currentState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_ACTIVE, Transient: voltha.DeviceTransientState_NONE},
Kent Hagerman6031aad2020-07-29 16:36:33 -0400143 handlers: []transitionHandler{dMgr.SetupUNILogicalPorts}})
khenaidoob9203542018-09-17 22:56:37 -0400144 transitionMap.transitions = append(transitionMap.transitions,
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530145 transition{ //DELETE PRE PROVISIONED State device forcefully
khenaidoo4554f7c2019-05-29 22:13:15 -0400146 deviceType: any,
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530147 previousState: deviceState{Admin: voltha.AdminState_PREPROVISIONED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN, Transient: voltha.DeviceTransientState_ANY},
148 currentState: deviceState{Admin: voltha.AdminState_PREPROVISIONED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN, Transient: voltha.DeviceTransientState_FORCE_DELETING},
Kent Hagerman6031aad2020-07-29 16:36:33 -0400149 handlers: []transitionHandler{dMgr.RunPostDeviceDelete}})
khenaidoo4554f7c2019-05-29 22:13:15 -0400150 transitionMap.transitions = append(transitionMap.transitions,
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530151 transition{ // DELETE PRE PROVISIONED State device no force option set
152 deviceType: any,
153 previousState: deviceState{Admin: voltha.AdminState_PREPROVISIONED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN, Transient: voltha.DeviceTransientState_ANY},
154 currentState: deviceState{Admin: voltha.AdminState_PREPROVISIONED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN, Transient: voltha.DeviceTransientState_DELETING_POST_ADAPTER_RESPONSE},
155 handlers: []transitionHandler{dMgr.RunPostDeviceDelete}})
156 transitionMap.transitions = append(transitionMap.transitions,
157 transition{ //DELETE device forcefully
khenaidoo4d4802d2018-10-04 21:59:49 -0400158 deviceType: parent,
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530159 previousState: deviceState{Admin: voltha.AdminState_UNKNOWN, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN, Transient: voltha.DeviceTransientState_ANY},
160 currentState: deviceState{Admin: voltha.AdminState_UNKNOWN, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN, Transient: voltha.DeviceTransientState_FORCE_DELETING},
serkant.uluderyae25f6482020-12-17 21:08:38 +0300161 handlers: []transitionHandler{dMgr.DeleteAllLogicalPorts, dMgr.DeleteAllLogicalMeters, dMgr.DeleteAllChildDevices, dMgr.DeleteLogicalDevice, dMgr.RunPostDeviceDelete}})
khenaidoo0a822f92019-05-08 15:15:57 -0400162 transitionMap.transitions = append(transitionMap.transitions,
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530163 transition{ //DELETE device after adapter response
164 deviceType: parent,
165 previousState: deviceState{Admin: voltha.AdminState_UNKNOWN, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN, Transient: voltha.DeviceTransientState_ANY},
166 currentState: deviceState{Admin: voltha.AdminState_UNKNOWN, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN, Transient: voltha.DeviceTransientState_DELETING_POST_ADAPTER_RESPONSE},
serkant.uluderyae25f6482020-12-17 21:08:38 +0300167 handlers: []transitionHandler{dMgr.DeleteAllLogicalPorts, dMgr.DeleteAllLogicalMeters, dMgr.DeleteAllChildDevices, dMgr.DeleteLogicalDevice, dMgr.RunPostDeviceDelete}})
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530168 transitionMap.transitions = append(transitionMap.transitions,
169 transition{ //DELETE no operation transition
170 deviceType: parent,
171 previousState: deviceState{Admin: voltha.AdminState_UNKNOWN, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN, Transient: voltha.DeviceTransientState_ANY},
172 currentState: deviceState{Admin: voltha.AdminState_UNKNOWN, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN, Transient: voltha.DeviceTransientState_DELETING_FROM_ADAPTER},
173 handlers: []transitionHandler{}})
174 transitionMap.transitions = append(transitionMap.transitions,
Kent Hagerman6031aad2020-07-29 16:36:33 -0400175 transition{
Girish Gowdra408cd962020-03-11 14:31:31 -0700176 deviceType: parent,
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530177 previousState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_REACHABLE, Operational: voltha.OperStatus_ACTIVE, Transient: voltha.DeviceTransientState_NONE},
178 currentState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNREACHABLE, Operational: voltha.OperStatus_UNKNOWN, Transient: voltha.DeviceTransientState_NONE},
serkant.uluderyae25f6482020-12-17 21:08:38 +0300179 handlers: []transitionHandler{dMgr.DeleteAllLogicalPorts, dMgr.DeleteAllLogicalMeters, dMgr.DeleteAllChildDevices, dMgr.DeleteLogicalDevice, dMgr.DeleteAllDeviceFlows}})
Girish Gowdra408cd962020-03-11 14:31:31 -0700180 transitionMap.transitions = append(transitionMap.transitions,
Kent Hagerman6031aad2020-07-29 16:36:33 -0400181 transition{
Girish Gowdra408cd962020-03-11 14:31:31 -0700182 deviceType: parent,
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530183 previousState: deviceState{Admin: voltha.AdminState_DISABLED, Connection: voltha.ConnectStatus_REACHABLE, Operational: voltha.OperStatus_UNKNOWN, Transient: voltha.DeviceTransientState_NONE},
184 currentState: deviceState{Admin: voltha.AdminState_DISABLED, Connection: voltha.ConnectStatus_UNREACHABLE, Operational: voltha.OperStatus_UNKNOWN, Transient: voltha.DeviceTransientState_NONE},
serkant.uluderyae25f6482020-12-17 21:08:38 +0300185 handlers: []transitionHandler{dMgr.DeleteAllLogicalPorts, dMgr.DeleteAllLogicalMeters, dMgr.DeleteAllChildDevices, dMgr.DeleteLogicalDevice, dMgr.DeleteAllDeviceFlows}})
Chaitrashree G S7849b322020-03-29 19:25:49 -0400186 transitionMap.transitions = append(transitionMap.transitions,
Kent Hagerman6031aad2020-07-29 16:36:33 -0400187 transition{
Chaitrashree G S7849b322020-03-29 19:25:49 -0400188 deviceType: parent,
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530189 previousState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNREACHABLE, Operational: voltha.OperStatus_UNKNOWN, Transient: voltha.DeviceTransientState_NONE},
190 currentState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_REACHABLE, Operational: voltha.OperStatus_ACTIVE, Transient: voltha.DeviceTransientState_NONE},
Kent Hagerman6031aad2020-07-29 16:36:33 -0400191 handlers: []transitionHandler{dMgr.CreateLogicalDevice}})
Girish Gowdra408cd962020-03-11 14:31:31 -0700192 transitionMap.transitions = append(transitionMap.transitions,
Kent Hagerman6031aad2020-07-29 16:36:33 -0400193 transition{
Chaitrashree G S7849b322020-03-29 19:25:49 -0400194 deviceType: parent,
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530195 previousState: deviceState{Admin: voltha.AdminState_DISABLED, Connection: voltha.ConnectStatus_UNREACHABLE, Operational: voltha.OperStatus_UNKNOWN, Transient: voltha.DeviceTransientState_NONE},
196 currentState: deviceState{Admin: voltha.AdminState_DISABLED, Connection: voltha.ConnectStatus_REACHABLE, Operational: voltha.OperStatus_UNKNOWN, Transient: voltha.DeviceTransientState_NONE},
Kent Hagerman6031aad2020-07-29 16:36:33 -0400197 handlers: []transitionHandler{dMgr.CreateLogicalDevice}})
Chaitrashree G S7849b322020-03-29 19:25:49 -0400198 transitionMap.transitions = append(transitionMap.transitions,
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530199 transition{ //DELETE force case
khenaidoo0a822f92019-05-08 15:15:57 -0400200 deviceType: child,
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530201 previousState: deviceState{Admin: voltha.AdminState_UNKNOWN, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN, Transient: voltha.DeviceTransientState_ANY},
202 currentState: deviceState{Admin: voltha.AdminState_UNKNOWN, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN, Transient: voltha.DeviceTransientState_FORCE_DELETING},
Kent Hagerman6031aad2020-07-29 16:36:33 -0400203 handlers: []transitionHandler{dMgr.ChildDeviceLost, dMgr.DeleteLogicalPorts, dMgr.RunPostDeviceDelete}})
Chaitrashree G S543df3e2020-02-24 22:36:54 -0500204 transitionMap.transitions = append(transitionMap.transitions,
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530205 transition{ //DELETE after adapter response case
Chaitrashree G S543df3e2020-02-24 22:36:54 -0500206 deviceType: child,
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530207 previousState: deviceState{Admin: voltha.AdminState_UNKNOWN, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN, Transient: voltha.DeviceTransientState_ANY},
208 currentState: deviceState{Admin: voltha.AdminState_UNKNOWN, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN, Transient: voltha.DeviceTransientState_DELETING_POST_ADAPTER_RESPONSE},
Kent Hagerman6031aad2020-07-29 16:36:33 -0400209 handlers: []transitionHandler{dMgr.ChildDeviceLost, dMgr.DeleteLogicalPorts, dMgr.RunPostDeviceDelete}})
khenaidoob9203542018-09-17 22:56:37 -0400210 transitionMap.transitions = append(transitionMap.transitions,
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530211 transition{ //DELETE wait for adapter response(no operation)
212 deviceType: child,
213 previousState: deviceState{Admin: voltha.AdminState_UNKNOWN, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN, Transient: voltha.DeviceTransientState_ANY},
214 currentState: deviceState{Admin: voltha.AdminState_UNKNOWN, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN, Transient: voltha.DeviceTransientState_DELETING_FROM_ADAPTER},
215 handlers: []transitionHandler{}})
216 transitionMap.transitions = append(transitionMap.transitions,
Kent Hagerman6031aad2020-07-29 16:36:33 -0400217 transition{
khenaidoob9203542018-09-17 22:56:37 -0400218 deviceType: any,
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530219 previousState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_ACTIVE, Transient: voltha.DeviceTransientState_NONE},
220 currentState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_ACTIVATING, Transient: voltha.DeviceTransientState_NONE},
Kent Hagerman6031aad2020-07-29 16:36:33 -0400221 handlers: []transitionHandler{dMgr.NotifyInvalidTransition}})
khenaidoo59ef7be2019-06-21 12:40:28 -0400222 transitionMap.transitions = append(transitionMap.transitions,
Kent Hagerman6031aad2020-07-29 16:36:33 -0400223 transition{
khenaidoo59ef7be2019-06-21 12:40:28 -0400224 deviceType: any,
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530225 previousState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_ACTIVATING, Transient: voltha.DeviceTransientState_NONE},
226 currentState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN, Transient: voltha.DeviceTransientState_NONE},
Kent Hagerman6031aad2020-07-29 16:36:33 -0400227 handlers: []transitionHandler{dMgr.NotifyInvalidTransition}})
khenaidoo59ef7be2019-06-21 12:40:28 -0400228 transitionMap.transitions = append(transitionMap.transitions,
Kent Hagerman6031aad2020-07-29 16:36:33 -0400229 transition{
khenaidoo59ef7be2019-06-21 12:40:28 -0400230 deviceType: any,
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530231 previousState: deviceState{Admin: voltha.AdminState_PREPROVISIONED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN, Transient: voltha.DeviceTransientState_NONE},
232 currentState: deviceState{Admin: voltha.AdminState_UNKNOWN, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN, Transient: voltha.DeviceTransientState_NONE},
Kent Hagerman6031aad2020-07-29 16:36:33 -0400233 handlers: []transitionHandler{dMgr.NotifyInvalidTransition}})
khenaidoo59ef7be2019-06-21 12:40:28 -0400234 transitionMap.transitions = append(transitionMap.transitions,
Kent Hagerman6031aad2020-07-29 16:36:33 -0400235 transition{
Andrea Campanella3614a922021-02-25 12:40:42 +0100236 deviceType: child,
237 previousState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_REACHABLE, Operational: voltha.OperStatus_UNKNOWN, Transient: voltha.DeviceTransientState_NONE},
238 currentState: deviceState{Admin: voltha.AdminState_DOWNLOADING_IMAGE, Connection: voltha.ConnectStatus_REACHABLE, Operational: voltha.OperStatus_UNKNOWN, Transient: voltha.DeviceTransientState_NONE},
239 handlers: []transitionHandler{}})
240 transitionMap.transitions = append(transitionMap.transitions,
241 transition{
242 deviceType: child,
243 previousState: deviceState{Admin: voltha.AdminState_DOWNLOADING_IMAGE, Connection: voltha.ConnectStatus_REACHABLE, Operational: voltha.OperStatus_UNKNOWN, Transient: voltha.DeviceTransientState_NONE},
244 currentState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_REACHABLE, Operational: voltha.OperStatus_UNKNOWN, Transient: voltha.DeviceTransientState_NONE},
245 handlers: []transitionHandler{}})
246 transitionMap.transitions = append(transitionMap.transitions,
247 transition{
khenaidoo59ef7be2019-06-21 12:40:28 -0400248 deviceType: any,
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530249 previousState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN, Transient: voltha.DeviceTransientState_NONE},
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530250 currentState: deviceState{Admin: voltha.AdminState_UNKNOWN, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN, Transient: voltha.DeviceTransientState_NONE},
Kent Hagerman6031aad2020-07-29 16:36:33 -0400251 handlers: []transitionHandler{dMgr.NotifyInvalidTransition}})
khenaidoo59ef7be2019-06-21 12:40:28 -0400252 transitionMap.transitions = append(transitionMap.transitions,
Kent Hagerman6031aad2020-07-29 16:36:33 -0400253 transition{
khenaidoo59ef7be2019-06-21 12:40:28 -0400254 deviceType: parent,
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530255 previousState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_ACTIVE, Transient: voltha.DeviceTransientState_NONE},
256 currentState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_ACTIVATING, Transient: voltha.DeviceTransientState_NONE},
Kent Hagerman6031aad2020-07-29 16:36:33 -0400257 handlers: []transitionHandler{dMgr.NotifyInvalidTransition}})
khenaidoo59ef7be2019-06-21 12:40:28 -0400258 transitionMap.transitions = append(transitionMap.transitions,
Kent Hagerman6031aad2020-07-29 16:36:33 -0400259 transition{
khenaidoo59ef7be2019-06-21 12:40:28 -0400260 deviceType: any,
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530261 previousState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_ACTIVATING, Transient: voltha.DeviceTransientState_NONE},
262 currentState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN, Transient: voltha.DeviceTransientState_NONE},
Kent Hagerman6031aad2020-07-29 16:36:33 -0400263 handlers: []transitionHandler{dMgr.NotifyInvalidTransition}})
khenaidoo59ef7be2019-06-21 12:40:28 -0400264 transitionMap.transitions = append(transitionMap.transitions,
Kent Hagerman6031aad2020-07-29 16:36:33 -0400265 transition{
khenaidoo59ef7be2019-06-21 12:40:28 -0400266 deviceType: any,
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530267 previousState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN, Transient: voltha.DeviceTransientState_NONE},
268 currentState: deviceState{Admin: voltha.AdminState_PREPROVISIONED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN, Transient: voltha.DeviceTransientState_NONE},
Kent Hagerman6031aad2020-07-29 16:36:33 -0400269 handlers: []transitionHandler{dMgr.NotifyInvalidTransition}})
khenaidoo59ef7be2019-06-21 12:40:28 -0400270 transitionMap.transitions = append(transitionMap.transitions,
Kent Hagerman6031aad2020-07-29 16:36:33 -0400271 transition{
khenaidoo59ef7be2019-06-21 12:40:28 -0400272 deviceType: child,
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530273 previousState: deviceState{Admin: voltha.AdminState_DISABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN, Transient: voltha.DeviceTransientState_NONE},
274 currentState: deviceState{Admin: voltha.AdminState_UNKNOWN, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN, Transient: voltha.DeviceTransientState_NONE},
Kent Hagerman6031aad2020-07-29 16:36:33 -0400275 handlers: []transitionHandler{dMgr.NotifyInvalidTransition}})
khenaidoo59ef7be2019-06-21 12:40:28 -0400276 transitionMap.transitions = append(transitionMap.transitions,
Kent Hagerman6031aad2020-07-29 16:36:33 -0400277 transition{
khenaidoo59ef7be2019-06-21 12:40:28 -0400278 deviceType: any,
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530279 previousState: deviceState{Admin: voltha.AdminState_DISABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN, Transient: voltha.DeviceTransientState_NONE},
280 currentState: deviceState{Admin: voltha.AdminState_PREPROVISIONED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN, Transient: voltha.DeviceTransientState_NONE},
Kent Hagerman6031aad2020-07-29 16:36:33 -0400281 handlers: []transitionHandler{dMgr.NotifyInvalidTransition}})
Maninder0aabf0c2021-03-17 14:55:14 +0530282 transitionMap.transitions = append(transitionMap.transitions,
283 transition{
284 deviceType: any,
285 previousState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN, Transient: voltha.DeviceTransientState_RECONCILE_IN_PROGRESS},
286 currentState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_RECONCILING, Transient: voltha.DeviceTransientState_RECONCILE_IN_PROGRESS},
287 handlers: []transitionHandler{}})
288 transitionMap.transitions = append(transitionMap.transitions,
289 transition{
290 deviceType: any,
291 previousState: deviceState{Admin: voltha.AdminState_DISABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN, Transient: voltha.DeviceTransientState_RECONCILE_IN_PROGRESS},
292 currentState: deviceState{Admin: voltha.AdminState_DISABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_RECONCILING, Transient: voltha.DeviceTransientState_RECONCILE_IN_PROGRESS},
293 handlers: []transitionHandler{}})
294 transitionMap.transitions = append(transitionMap.transitions,
295 transition{
296 deviceType: any,
297 previousState: deviceState{Admin: voltha.AdminState_PREPROVISIONED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN, Transient: voltha.DeviceTransientState_RECONCILE_IN_PROGRESS},
298 currentState: deviceState{Admin: voltha.AdminState_PREPROVISIONED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_RECONCILING, Transient: voltha.DeviceTransientState_RECONCILE_IN_PROGRESS},
299 handlers: []transitionHandler{}})
300 transitionMap.transitions = append(transitionMap.transitions,
301 transition{
302 deviceType: any,
303 previousState: deviceState{Admin: voltha.AdminState_DOWNLOADING_IMAGE, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN, Transient: voltha.DeviceTransientState_RECONCILE_IN_PROGRESS},
304 currentState: deviceState{Admin: voltha.AdminState_DOWNLOADING_IMAGE, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_RECONCILING, Transient: voltha.DeviceTransientState_RECONCILE_IN_PROGRESS},
305 handlers: []transitionHandler{}})
306 transitionMap.transitions = append(transitionMap.transitions,
307 transition{
308 deviceType: any,
309 previousState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_RECONCILING, Transient: voltha.DeviceTransientState_RECONCILE_IN_PROGRESS},
310 currentState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_REACHABLE, Operational: voltha.OperStatus_ACTIVE, Transient: voltha.DeviceTransientState_RECONCILE_IN_PROGRESS},
311 handlers: []transitionHandler{dMgr.ReconcilingCleanup}})
312 transitionMap.transitions = append(transitionMap.transitions,
313 transition{
314 deviceType: any,
315 previousState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_RECONCILING, Transient: voltha.DeviceTransientState_RECONCILE_IN_PROGRESS},
316 currentState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNREACHABLE, Operational: voltha.OperStatus_UNKNOWN, Transient: voltha.DeviceTransientState_RECONCILE_IN_PROGRESS},
317 handlers: []transitionHandler{dMgr.ReconcilingCleanup}})
318 transitionMap.transitions = append(transitionMap.transitions,
319 transition{
320 deviceType: any,
321 previousState: deviceState{Admin: voltha.AdminState_DISABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_RECONCILING, Transient: voltha.DeviceTransientState_RECONCILE_IN_PROGRESS},
322 currentState: deviceState{Admin: voltha.AdminState_DISABLED, Connection: voltha.ConnectStatus_UNREACHABLE, Operational: voltha.OperStatus_UNKNOWN, Transient: voltha.DeviceTransientState_RECONCILE_IN_PROGRESS},
323 handlers: []transitionHandler{dMgr.ReconcilingCleanup}})
324 transitionMap.transitions = append(transitionMap.transitions,
325 transition{
326 deviceType: any,
327 previousState: deviceState{Admin: voltha.AdminState_DOWNLOADING_IMAGE, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_RECONCILING, Transient: voltha.DeviceTransientState_RECONCILE_IN_PROGRESS},
328 currentState: deviceState{Admin: voltha.AdminState_DOWNLOADING_IMAGE, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN, Transient: voltha.DeviceTransientState_RECONCILE_IN_PROGRESS},
329 handlers: []transitionHandler{dMgr.ReconcilingCleanup}})
Maninder581cf4b2021-06-16 22:42:07 +0530330 transitionMap.transitions = append(transitionMap.transitions,
331 transition{
332 deviceType: any,
333 previousState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_RECONCILING, Transient: voltha.DeviceTransientState_RECONCILE_IN_PROGRESS},
334 currentState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_RECONCILING_FAILED, Transient: voltha.DeviceTransientState_RECONCILE_IN_PROGRESS},
335 handlers: []transitionHandler{dMgr.ReconcilingCleanup}})
336 transitionMap.transitions = append(transitionMap.transitions,
337 transition{
338 deviceType: any,
339 previousState: deviceState{Admin: voltha.AdminState_DISABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_RECONCILING, Transient: voltha.DeviceTransientState_RECONCILE_IN_PROGRESS},
340 currentState: deviceState{Admin: voltha.AdminState_DISABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_RECONCILING_FAILED, Transient: voltha.DeviceTransientState_RECONCILE_IN_PROGRESS},
341 handlers: []transitionHandler{dMgr.ReconcilingCleanup}})
342 transitionMap.transitions = append(transitionMap.transitions,
343 transition{
344 deviceType: any,
345 previousState: deviceState{Admin: voltha.AdminState_DOWNLOADING_IMAGE, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_RECONCILING, Transient: voltha.DeviceTransientState_RECONCILE_IN_PROGRESS},
346 currentState: deviceState{Admin: voltha.AdminState_DOWNLOADING_IMAGE, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_RECONCILING_FAILED, Transient: voltha.DeviceTransientState_RECONCILE_IN_PROGRESS},
347 handlers: []transitionHandler{dMgr.ReconcilingCleanup}})
khenaidoob9203542018-09-17 22:56:37 -0400348
349 return &transitionMap
350}
351
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530352func getDeviceStates(device *voltha.Device, transientState voltha.DeviceTransientState_Types) deviceState {
353 return deviceState{Admin: device.AdminState, Connection: device.ConnectStatus, Operational: device.OperStatus,
354 Transient: transientState}
khenaidoob9203542018-09-17 22:56:37 -0400355}
356
357// isMatched matches a state transition. It returns whether there is a match and if there is whether it is an exact match
Kent Hagerman6031aad2020-07-29 16:36:33 -0400358func getHandler(previous deviceState, current deviceState, transition *transition) ([]transitionHandler, *match) {
khenaidoo442e7c72020-03-10 16:13:48 -0400359 m := &match{}
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530360 var waitForOtherStatesMatch bool
khenaidoob9203542018-09-17 22:56:37 -0400361 // Do we have an exact match?
Kent Hagerman6031aad2020-07-29 16:36:33 -0400362 if previous == transition.previousState && current == transition.currentState {
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530363 return transition.handlers, &match{admin: currPrevStateMatch, oper: currPrevStateMatch, conn: currPrevStateMatch,
364 transient: currPrevStateMatch}
365 }
366 // Do we have transient state match?
367 if current.Transient == transition.currentState.Transient && transition.currentState.Transient != voltha.DeviceTransientState_ANY {
368 if previous.Transient == transition.previousState.Transient || transition.previousState.Transient == voltha.DeviceTransientState_ANY {
369 m.transient = currPrevStateMatch
370 } else {
371 m.transient = currStateOnlyMatch
372 }
373 } else if current.Transient == transition.currentState.Transient && transition.currentState.Transient == voltha.DeviceTransientState_ANY {
374 if previous.Transient == transition.previousState.Transient || transition.previousState.Transient == voltha.DeviceTransientState_ANY {
375 m.transient = currWildcardMatch
376 }
377 }
378 if m.transient == noMatch {
379 return nil, m
khenaidoob9203542018-09-17 22:56:37 -0400380 }
khenaidoo0a822f92019-05-08 15:15:57 -0400381
khenaidoo442e7c72020-03-10 16:13:48 -0400382 // Do we have Admin state match?
383 if current.Admin == transition.currentState.Admin && transition.currentState.Admin != voltha.AdminState_UNKNOWN {
384 if previous.Admin == transition.previousState.Admin {
385 m.admin = currPrevStateMatch
386 } else if transition.previousState.Admin == voltha.AdminState_UNKNOWN {
387 m.admin = currStateOnlyMatch
388 }
389 } else if current.Admin == transition.currentState.Admin && transition.currentState.Admin == voltha.AdminState_UNKNOWN {
390 if previous.Admin == transition.previousState.Admin || transition.previousState.Admin == voltha.AdminState_UNKNOWN {
391 m.admin = currWildcardMatch
392 }
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530393 } else if transition.previousState.Admin == voltha.AdminState_UNKNOWN && transition.currentState.Admin == voltha.AdminState_UNKNOWN {
394 // Will only be the case of DELETION currently.(to allow only transient match, we can avoid this check if
395 // we can allow wild card in admin state)
396 waitForOtherStatesMatch = true
khenaidoo442e7c72020-03-10 16:13:48 -0400397 }
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530398 if !waitForOtherStatesMatch && m.admin == noMatch {
khenaidoo442e7c72020-03-10 16:13:48 -0400399 return nil, m
khenaidoo0a822f92019-05-08 15:15:57 -0400400 }
khenaidoo442e7c72020-03-10 16:13:48 -0400401 // Do we have an operational state match?
402 if current.Operational == transition.currentState.Operational && transition.previousState.Operational != voltha.OperStatus_UNKNOWN {
403 if previous.Operational == transition.previousState.Operational || transition.previousState.Operational == voltha.OperStatus_UNKNOWN {
404 m.oper = currPrevStateMatch
405 } else {
406 m.oper = currStateOnlyMatch
407 }
408 } else if current.Operational == transition.currentState.Operational && transition.previousState.Operational == voltha.OperStatus_UNKNOWN {
409 if previous.Operational == transition.previousState.Operational || transition.previousState.Operational == voltha.OperStatus_UNKNOWN {
410 m.oper = currWildcardMatch
khenaidoob9203542018-09-17 22:56:37 -0400411 }
412 }
khenaidoo442e7c72020-03-10 16:13:48 -0400413
414 // Do we have an connection state match?
415 if current.Connection == transition.currentState.Connection && transition.previousState.Connection != voltha.ConnectStatus_UNKNOWN {
416 if previous.Connection == transition.previousState.Connection || transition.previousState.Connection == voltha.ConnectStatus_UNKNOWN {
417 m.conn = currPrevStateMatch
418 } else {
419 m.conn = currStateOnlyMatch
420 }
421 } else if current.Connection == transition.currentState.Connection && transition.previousState.Connection == voltha.ConnectStatus_UNKNOWN {
422 if previous.Connection == transition.previousState.Connection || transition.previousState.Connection == voltha.ConnectStatus_UNKNOWN {
423 m.conn = currWildcardMatch
khenaidoob9203542018-09-17 22:56:37 -0400424 }
425 }
khenaidoo442e7c72020-03-10 16:13:48 -0400426 return transition.handlers, m
khenaidoob9203542018-09-17 22:56:37 -0400427}
428
Kent Hagerman6031aad2020-07-29 16:36:33 -0400429// getTransitionHandler returns transition handler & a flag that's set if the transition is invalid
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530430func (tMap *TransitionMap) getTransitionHandler(ctx context.Context, cDevice, pDevice *voltha.Device,
431 cTransientState, pTransientState voltha.DeviceTransientState_Types) []transitionHandler {
khenaidoob9203542018-09-17 22:56:37 -0400432 //1. Get the previous and current set of states
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530433 cState := getDeviceStates(cDevice, cTransientState)
434 pState := getDeviceStates(pDevice, pTransientState)
khenaidoo442e7c72020-03-10 16:13:48 -0400435
436 // Do nothing is there are no states change
Kent Hagerman6031aad2020-07-29 16:36:33 -0400437 if pState == cState {
khenaidoo442e7c72020-03-10 16:13:48 -0400438 return nil
439 }
440
Rohan Agrawal31f21802020-06-12 05:38:46 +0000441 //logger.Infow(ctx, "deviceType", log.Fields{"device": pDevice})
khenaidoob9203542018-09-17 22:56:37 -0400442 deviceType := parent
Kent Hagerman6031aad2020-07-29 16:36:33 -0400443 if !cDevice.Root {
Rohan Agrawal31f21802020-06-12 05:38:46 +0000444 logger.Info(ctx, "device is child")
khenaidoob9203542018-09-17 22:56:37 -0400445 deviceType = child
446 }
Kent Hagerman6031aad2020-07-29 16:36:33 -0400447 logger.Infof(ctx, "deviceType:%d-deviceId:%s-previous:%v-current:%v", deviceType, cDevice.Id, pState, cState)
khenaidoob9203542018-09-17 22:56:37 -0400448
449 //2. Go over transition array to get the right transition
Kent Hagerman6031aad2020-07-29 16:36:33 -0400450 var currentMatch []transitionHandler
451 var tempHandler []transitionHandler
khenaidoo442e7c72020-03-10 16:13:48 -0400452 var m *match
453 bestMatch := &match{}
Andrey Pozolotin34dd63f2021-05-31 21:26:40 +0300454 for i := range tMap.transitions {
khenaidoob9203542018-09-17 22:56:37 -0400455 // consider transition only if it matches deviceType or is a wild card - any
Andrey Pozolotin34dd63f2021-05-31 21:26:40 +0300456 if tMap.transitions[i].deviceType != deviceType && tMap.transitions[i].deviceType != any {
khenaidoob9203542018-09-17 22:56:37 -0400457 continue
458 }
Andrey Pozolotin34dd63f2021-05-31 21:26:40 +0300459 tempHandler, m = getHandler(pState, cState, &tMap.transitions[i])
khenaidoob9203542018-09-17 22:56:37 -0400460 if tempHandler != nil {
Andrey Pozolotin34dd63f2021-05-31 21:26:40 +0300461 if m.isExactMatch() && tMap.transitions[i].deviceType == deviceType {
khenaidoob9203542018-09-17 22:56:37 -0400462 return tempHandler
khenaidoo442e7c72020-03-10 16:13:48 -0400463 } else if m.isExactMatch() || m.isBetterMatch(bestMatch) {
khenaidoo0a822f92019-05-08 15:15:57 -0400464 currentMatch = tempHandler
khenaidoo442e7c72020-03-10 16:13:48 -0400465 bestMatch = m
khenaidoob9203542018-09-17 22:56:37 -0400466 }
467 }
468 }
469 return currentMatch
470}
Kent Hagerman6031aad2020-07-29 16:36:33 -0400471
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530472func (tMap *TransitionMap) ProcessTransition(ctx context.Context, device, prevDevice *voltha.Device,
473 deviceTransientState, prevDeviceTransientState voltha.DeviceTransientState_Types) error {
Kent Hagerman6031aad2020-07-29 16:36:33 -0400474 // This will be triggered on every state update
475 logger.Debugw(ctx, "state-transition", log.Fields{
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530476 "device": device.Id,
477 "prev-admin-state": prevDevice.AdminState,
478 "prev-oper-state": prevDevice.OperStatus,
479 "prev-conn-state": prevDevice.ConnectStatus,
480 "curr-admin-state": device.AdminState,
481 "curr-oper-state": device.OperStatus,
482 "curr-conn-state": device.ConnectStatus,
483 "curr-transient-state": deviceTransientState,
484 "prev-transient-state": prevDeviceTransientState,
Kent Hagerman6031aad2020-07-29 16:36:33 -0400485 })
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530486 handlers := tMap.getTransitionHandler(ctx, device, prevDevice, deviceTransientState, prevDeviceTransientState)
Maninder0aabf0c2021-03-17 14:55:14 +0530487 if len(handlers) == 0 {
Kent Hagerman6031aad2020-07-29 16:36:33 -0400488 logger.Debugw(ctx, "no-op-transition", log.Fields{"deviceId": device.Id})
489 return nil
490 }
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530491 logger.Debugw(ctx, "handler-found", log.Fields{"num-expectedHandlers": len(handlers), "isParent": device.Root,
492 "current-data": device, "previous-data": prevDevice})
Kent Hagerman6031aad2020-07-29 16:36:33 -0400493 for _, handler := range handlers {
494 logger.Debugw(ctx, "running-handler", log.Fields{"handler": funcName(handler)})
495 if err := handler(ctx, device); err != nil {
496 logger.Warnw(ctx, "handler-failed", log.Fields{"handler": funcName(handler), "error": err})
497 return err
498 }
499 }
500 return nil
501}
502
503func funcName(f interface{}) string {
504 return runtime.FuncForPC(reflect.ValueOf(f).Pointer()).Name()
505}