blob: c3b98e706030fcf4dcb50c559506b5095c658a06 [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"
yasin sapli5458a1c2021-06-14 22:24:38 +000021 "github.com/opencord/voltha-lib-go/v5/pkg/log"
Maninderdfadc982020-10-28 14:04:33 +053022 "github.com/opencord/voltha-protos/v4/go/voltha"
Himani Chawla2ba1c9c2020-10-07 13:19:03 +053023 "reflect"
24 "runtime"
khenaidoob9203542018-09-17 22:56:37 -040025)
26
Kent Hagerman2b216042020-04-03 18:28:56 -040027// deviceType mentions type of device like parent, child
28type deviceType int32
khenaidoob9203542018-09-17 22:56:37 -040029
30const (
Kent Hagerman2b216042020-04-03 18:28:56 -040031 parent deviceType = 0
32 child deviceType = 1
33 any deviceType = 2
khenaidoob9203542018-09-17 22:56:37 -040034)
35
Himani Chawla2ba1c9c2020-10-07 13:19:03 +053036type matchResult uint16
khenaidoo442e7c72020-03-10 16:13:48 -040037
38const (
Kent Hagerman2b216042020-04-03 18:28:56 -040039 noMatch matchResult = iota // current state has not match in the transition table
khenaidoo442e7c72020-03-10 16:13:48 -040040 currWildcardMatch // current state matches the wildcard *_UNKNOWN state in the transition table
41 currStateOnlyMatch // current state matches the current state and previous state matches the wildcard in the transition table
42 currPrevStateMatch // both current and previous states match in the transition table
43)
44
45// match is used to keep the current match states
46type match struct {
Himani Chawla2ba1c9c2020-10-07 13:19:03 +053047 admin, oper, conn, transient matchResult
khenaidoo442e7c72020-03-10 16:13:48 -040048}
49
50// toInt returns an integer representing the matching level of the match (the larger the number the better)
51func (m *match) toInt() int {
Himani Chawla2ba1c9c2020-10-07 13:19:03 +053052 return int(m.transient<<8 | m.admin<<4 | m.oper<<2 | m.conn)
khenaidoo442e7c72020-03-10 16:13:48 -040053}
54
55// isExactMatch returns true if match is an exact match
56func (m *match) isExactMatch() bool {
Himani Chawla2ba1c9c2020-10-07 13:19:03 +053057 return m.admin == currPrevStateMatch && m.oper == currPrevStateMatch && m.conn == currPrevStateMatch &&
58 m.transient == currPrevStateMatch
khenaidoo442e7c72020-03-10 16:13:48 -040059}
60
61// isBetterMatch returns true if newMatch is a worse match
62func (m *match) isBetterMatch(newMatch *match) bool {
63 return m.toInt() > newMatch.toInt()
64}
65
Kent Hagerman2b216042020-04-03 18:28:56 -040066// deviceState has admin, operational and connection status of device
67type deviceState struct {
serkant.uluderya2ae470f2020-01-21 11:13:09 -080068 Admin voltha.AdminState_Types
69 Connection voltha.ConnectStatus_Types
70 Operational voltha.OperStatus_Types
Himani Chawla2ba1c9c2020-10-07 13:19:03 +053071 Transient voltha.DeviceTransientState_Types
khenaidoob9203542018-09-17 22:56:37 -040072}
73
Kent Hagerman6031aad2020-07-29 16:36:33 -040074// transitionHandler function type which takes the current and previous device info as input parameter
75type transitionHandler func(context.Context, *voltha.Device) error
khenaidoob9203542018-09-17 22:56:37 -040076
Kent Hagerman6031aad2020-07-29 16:36:33 -040077// transition represent transition related attributes
78type transition struct {
Kent Hagerman2b216042020-04-03 18:28:56 -040079 deviceType deviceType
80 previousState deviceState
81 currentState deviceState
Kent Hagerman6031aad2020-07-29 16:36:33 -040082 handlers []transitionHandler
khenaidoob9203542018-09-17 22:56:37 -040083}
84
npujar1d86a522019-11-14 17:11:16 +053085// TransitionMap represent map of transitions and device manager
khenaidoob9203542018-09-17 22:56:37 -040086type TransitionMap struct {
Kent Hagerman6031aad2020-07-29 16:36:33 -040087 transitions []transition
88 dMgr DeviceManager
89}
90
91// DeviceManager represents a generic device manager
92type DeviceManager interface {
93 NotifyInvalidTransition(ctx context.Context, curr *voltha.Device) error
94 CreateLogicalDevice(ctx context.Context, curr *voltha.Device) error
95 SetupUNILogicalPorts(ctx context.Context, curr *voltha.Device) error
96 DeleteLogicalDevice(ctx context.Context, curr *voltha.Device) error
97 DeleteLogicalPorts(ctx context.Context, curr *voltha.Device) error
98 DeleteAllChildDevices(ctx context.Context, curr *voltha.Device) error
99 RunPostDeviceDelete(ctx context.Context, curr *voltha.Device) error
100 ChildDeviceLost(ctx context.Context, curr *voltha.Device) error
101 DeleteAllLogicalPorts(ctx context.Context, curr *voltha.Device) error
102 DeleteAllDeviceFlows(ctx context.Context, curr *voltha.Device) error
Maninder0aabf0c2021-03-17 14:55:14 +0530103 ReconcilingCleanup(ctx context.Context, curr *voltha.Device) error
khenaidoob9203542018-09-17 22:56:37 -0400104}
105
npujar1d86a522019-11-14 17:11:16 +0530106// NewTransitionMap creates transition map
Kent Hagerman6031aad2020-07-29 16:36:33 -0400107func NewTransitionMap(dMgr DeviceManager) *TransitionMap {
khenaidoob9203542018-09-17 22:56:37 -0400108 var transitionMap TransitionMap
khenaidoo0a822f92019-05-08 15:15:57 -0400109 transitionMap.dMgr = dMgr
Kent Hagerman6031aad2020-07-29 16:36:33 -0400110 transitionMap.transitions = make([]transition, 0)
khenaidoo442e7c72020-03-10 16:13:48 -0400111 transitionMap.transitions = append(
112 transitionMap.transitions,
Kent Hagerman6031aad2020-07-29 16:36:33 -0400113 transition{
khenaidoob9203542018-09-17 22:56:37 -0400114 deviceType: parent,
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530115 previousState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_ACTIVATING, Transient: voltha.DeviceTransientState_NONE},
116 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 -0400117 handlers: []transitionHandler{dMgr.CreateLogicalDevice}})
khenaidoo0a822f92019-05-08 15:15:57 -0400118 transitionMap.transitions = append(transitionMap.transitions,
Kent Hagerman6031aad2020-07-29 16:36:33 -0400119 transition{
khenaidoo59ef7be2019-06-21 12:40:28 -0400120 deviceType: child,
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530121 previousState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_DISCOVERED, Transient: voltha.DeviceTransientState_NONE},
122 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 -0400123 handlers: []transitionHandler{}})
khenaidoo442e7c72020-03-10 16:13:48 -0400124 transitionMap.transitions = append(transitionMap.transitions,
Kent Hagerman6031aad2020-07-29 16:36:33 -0400125 transition{
khenaidoo442e7c72020-03-10 16:13:48 -0400126 deviceType: child,
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530127 previousState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_DISCOVERED, Transient: voltha.DeviceTransientState_NONE},
128 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 -0400129 handlers: []transitionHandler{dMgr.SetupUNILogicalPorts}})
khenaidoob9203542018-09-17 22:56:37 -0400130 transitionMap.transitions = append(transitionMap.transitions,
Kent Hagerman6031aad2020-07-29 16:36:33 -0400131 transition{
khenaidoob9203542018-09-17 22:56:37 -0400132 deviceType: child,
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530133 previousState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_ACTIVATING, Transient: voltha.DeviceTransientState_NONE},
134 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 -0400135 handlers: []transitionHandler{}})
khenaidoo442e7c72020-03-10 16:13:48 -0400136 transitionMap.transitions = append(transitionMap.transitions,
Kent Hagerman6031aad2020-07-29 16:36:33 -0400137 transition{
khenaidoo442e7c72020-03-10 16:13:48 -0400138 deviceType: child,
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530139 previousState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_ACTIVATING, Transient: voltha.DeviceTransientState_NONE},
140 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 -0400141 handlers: []transitionHandler{dMgr.SetupUNILogicalPorts}})
khenaidoob9203542018-09-17 22:56:37 -0400142 transitionMap.transitions = append(transitionMap.transitions,
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530143 transition{ //DELETE PRE PROVISIONED State device forcefully
khenaidoo4554f7c2019-05-29 22:13:15 -0400144 deviceType: any,
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530145 previousState: deviceState{Admin: voltha.AdminState_PREPROVISIONED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN, Transient: voltha.DeviceTransientState_ANY},
146 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 -0400147 handlers: []transitionHandler{dMgr.RunPostDeviceDelete}})
khenaidoo4554f7c2019-05-29 22:13:15 -0400148 transitionMap.transitions = append(transitionMap.transitions,
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530149 transition{ // DELETE PRE PROVISIONED State device no force option set
150 deviceType: any,
151 previousState: deviceState{Admin: voltha.AdminState_PREPROVISIONED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN, Transient: voltha.DeviceTransientState_ANY},
152 currentState: deviceState{Admin: voltha.AdminState_PREPROVISIONED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN, Transient: voltha.DeviceTransientState_DELETING_POST_ADAPTER_RESPONSE},
153 handlers: []transitionHandler{dMgr.RunPostDeviceDelete}})
154 transitionMap.transitions = append(transitionMap.transitions,
155 transition{ //DELETE device forcefully
khenaidoo4d4802d2018-10-04 21:59:49 -0400156 deviceType: parent,
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530157 previousState: deviceState{Admin: voltha.AdminState_UNKNOWN, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN, Transient: voltha.DeviceTransientState_ANY},
158 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 -0400159 handlers: []transitionHandler{dMgr.DeleteAllLogicalPorts, dMgr.DeleteAllChildDevices, dMgr.DeleteLogicalDevice, dMgr.RunPostDeviceDelete}})
khenaidoo0a822f92019-05-08 15:15:57 -0400160 transitionMap.transitions = append(transitionMap.transitions,
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530161 transition{ //DELETE device after adapter response
162 deviceType: parent,
163 previousState: deviceState{Admin: voltha.AdminState_UNKNOWN, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN, Transient: voltha.DeviceTransientState_ANY},
164 currentState: deviceState{Admin: voltha.AdminState_UNKNOWN, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN, Transient: voltha.DeviceTransientState_DELETING_POST_ADAPTER_RESPONSE},
165 handlers: []transitionHandler{dMgr.DeleteAllLogicalPorts, dMgr.DeleteAllChildDevices, dMgr.DeleteLogicalDevice, dMgr.RunPostDeviceDelete}})
166 transitionMap.transitions = append(transitionMap.transitions,
167 transition{ //DELETE no operation transition
168 deviceType: parent,
169 previousState: deviceState{Admin: voltha.AdminState_UNKNOWN, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN, Transient: voltha.DeviceTransientState_ANY},
170 currentState: deviceState{Admin: voltha.AdminState_UNKNOWN, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN, Transient: voltha.DeviceTransientState_DELETING_FROM_ADAPTER},
171 handlers: []transitionHandler{}})
172 transitionMap.transitions = append(transitionMap.transitions,
Kent Hagerman6031aad2020-07-29 16:36:33 -0400173 transition{
Girish Gowdra408cd962020-03-11 14:31:31 -0700174 deviceType: parent,
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530175 previousState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_REACHABLE, Operational: voltha.OperStatus_ACTIVE, Transient: voltha.DeviceTransientState_NONE},
176 currentState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNREACHABLE, Operational: voltha.OperStatus_UNKNOWN, Transient: voltha.DeviceTransientState_NONE},
Kent Hagerman6031aad2020-07-29 16:36:33 -0400177 handlers: []transitionHandler{dMgr.DeleteAllLogicalPorts, dMgr.DeleteAllChildDevices, dMgr.DeleteLogicalDevice, dMgr.DeleteAllDeviceFlows}})
Girish Gowdra408cd962020-03-11 14:31:31 -0700178 transitionMap.transitions = append(transitionMap.transitions,
Kent Hagerman6031aad2020-07-29 16:36:33 -0400179 transition{
Girish Gowdra408cd962020-03-11 14:31:31 -0700180 deviceType: parent,
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530181 previousState: deviceState{Admin: voltha.AdminState_DISABLED, Connection: voltha.ConnectStatus_REACHABLE, Operational: voltha.OperStatus_UNKNOWN, Transient: voltha.DeviceTransientState_NONE},
182 currentState: deviceState{Admin: voltha.AdminState_DISABLED, Connection: voltha.ConnectStatus_UNREACHABLE, Operational: voltha.OperStatus_UNKNOWN, Transient: voltha.DeviceTransientState_NONE},
Kent Hagerman6031aad2020-07-29 16:36:33 -0400183 handlers: []transitionHandler{dMgr.DeleteAllLogicalPorts, dMgr.DeleteAllChildDevices, dMgr.DeleteLogicalDevice, dMgr.DeleteAllDeviceFlows}})
Chaitrashree G S7849b322020-03-29 19:25:49 -0400184 transitionMap.transitions = append(transitionMap.transitions,
Kent Hagerman6031aad2020-07-29 16:36:33 -0400185 transition{
Chaitrashree G S7849b322020-03-29 19:25:49 -0400186 deviceType: parent,
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530187 previousState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNREACHABLE, Operational: voltha.OperStatus_UNKNOWN, Transient: voltha.DeviceTransientState_NONE},
188 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 -0400189 handlers: []transitionHandler{dMgr.CreateLogicalDevice}})
Girish Gowdra408cd962020-03-11 14:31:31 -0700190 transitionMap.transitions = append(transitionMap.transitions,
Kent Hagerman6031aad2020-07-29 16:36:33 -0400191 transition{
Chaitrashree G S7849b322020-03-29 19:25:49 -0400192 deviceType: parent,
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530193 previousState: deviceState{Admin: voltha.AdminState_DISABLED, Connection: voltha.ConnectStatus_UNREACHABLE, Operational: voltha.OperStatus_UNKNOWN, Transient: voltha.DeviceTransientState_NONE},
194 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 -0400195 handlers: []transitionHandler{dMgr.CreateLogicalDevice}})
Chaitrashree G S7849b322020-03-29 19:25:49 -0400196 transitionMap.transitions = append(transitionMap.transitions,
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530197 transition{ //DELETE force case
khenaidoo0a822f92019-05-08 15:15:57 -0400198 deviceType: child,
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530199 previousState: deviceState{Admin: voltha.AdminState_UNKNOWN, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN, Transient: voltha.DeviceTransientState_ANY},
200 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 -0400201 handlers: []transitionHandler{dMgr.ChildDeviceLost, dMgr.DeleteLogicalPorts, dMgr.RunPostDeviceDelete}})
Chaitrashree G S543df3e2020-02-24 22:36:54 -0500202 transitionMap.transitions = append(transitionMap.transitions,
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530203 transition{ //DELETE after adapter response case
Chaitrashree G S543df3e2020-02-24 22:36:54 -0500204 deviceType: child,
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530205 previousState: deviceState{Admin: voltha.AdminState_UNKNOWN, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN, Transient: voltha.DeviceTransientState_ANY},
206 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 -0400207 handlers: []transitionHandler{dMgr.ChildDeviceLost, dMgr.DeleteLogicalPorts, dMgr.RunPostDeviceDelete}})
khenaidoob9203542018-09-17 22:56:37 -0400208 transitionMap.transitions = append(transitionMap.transitions,
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530209 transition{ //DELETE wait for adapter response(no operation)
210 deviceType: child,
211 previousState: deviceState{Admin: voltha.AdminState_UNKNOWN, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN, Transient: voltha.DeviceTransientState_ANY},
212 currentState: deviceState{Admin: voltha.AdminState_UNKNOWN, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN, Transient: voltha.DeviceTransientState_DELETING_FROM_ADAPTER},
213 handlers: []transitionHandler{}})
214 transitionMap.transitions = append(transitionMap.transitions,
Kent Hagerman6031aad2020-07-29 16:36:33 -0400215 transition{
khenaidoob9203542018-09-17 22:56:37 -0400216 deviceType: any,
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530217 previousState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_ACTIVE, Transient: voltha.DeviceTransientState_NONE},
218 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 -0400219 handlers: []transitionHandler{dMgr.NotifyInvalidTransition}})
khenaidoo59ef7be2019-06-21 12:40:28 -0400220 transitionMap.transitions = append(transitionMap.transitions,
Kent Hagerman6031aad2020-07-29 16:36:33 -0400221 transition{
khenaidoo59ef7be2019-06-21 12:40:28 -0400222 deviceType: any,
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530223 previousState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_ACTIVATING, Transient: voltha.DeviceTransientState_NONE},
224 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 -0400225 handlers: []transitionHandler{dMgr.NotifyInvalidTransition}})
khenaidoo59ef7be2019-06-21 12:40:28 -0400226 transitionMap.transitions = append(transitionMap.transitions,
Kent Hagerman6031aad2020-07-29 16:36:33 -0400227 transition{
khenaidoo59ef7be2019-06-21 12:40:28 -0400228 deviceType: any,
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530229 previousState: deviceState{Admin: voltha.AdminState_PREPROVISIONED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN, Transient: voltha.DeviceTransientState_NONE},
230 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 -0400231 handlers: []transitionHandler{dMgr.NotifyInvalidTransition}})
khenaidoo59ef7be2019-06-21 12:40:28 -0400232 transitionMap.transitions = append(transitionMap.transitions,
Kent Hagerman6031aad2020-07-29 16:36:33 -0400233 transition{
Andrea Campanella3614a922021-02-25 12:40:42 +0100234 deviceType: child,
235 previousState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_REACHABLE, Operational: voltha.OperStatus_UNKNOWN, Transient: voltha.DeviceTransientState_NONE},
236 currentState: deviceState{Admin: voltha.AdminState_DOWNLOADING_IMAGE, Connection: voltha.ConnectStatus_REACHABLE, Operational: voltha.OperStatus_UNKNOWN, Transient: voltha.DeviceTransientState_NONE},
237 handlers: []transitionHandler{}})
238 transitionMap.transitions = append(transitionMap.transitions,
239 transition{
240 deviceType: child,
241 previousState: deviceState{Admin: voltha.AdminState_DOWNLOADING_IMAGE, Connection: voltha.ConnectStatus_REACHABLE, Operational: voltha.OperStatus_UNKNOWN, Transient: voltha.DeviceTransientState_NONE},
242 currentState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_REACHABLE, Operational: voltha.OperStatus_UNKNOWN, Transient: voltha.DeviceTransientState_NONE},
243 handlers: []transitionHandler{}})
244 transitionMap.transitions = append(transitionMap.transitions,
245 transition{
khenaidoo59ef7be2019-06-21 12:40:28 -0400246 deviceType: any,
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530247 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 +0530248 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 -0400249 handlers: []transitionHandler{dMgr.NotifyInvalidTransition}})
khenaidoo59ef7be2019-06-21 12:40:28 -0400250 transitionMap.transitions = append(transitionMap.transitions,
Kent Hagerman6031aad2020-07-29 16:36:33 -0400251 transition{
khenaidoo59ef7be2019-06-21 12:40:28 -0400252 deviceType: parent,
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530253 previousState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_ACTIVE, Transient: voltha.DeviceTransientState_NONE},
254 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 -0400255 handlers: []transitionHandler{dMgr.NotifyInvalidTransition}})
khenaidoo59ef7be2019-06-21 12:40:28 -0400256 transitionMap.transitions = append(transitionMap.transitions,
Kent Hagerman6031aad2020-07-29 16:36:33 -0400257 transition{
khenaidoo59ef7be2019-06-21 12:40:28 -0400258 deviceType: any,
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530259 previousState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_ACTIVATING, Transient: voltha.DeviceTransientState_NONE},
260 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 -0400261 handlers: []transitionHandler{dMgr.NotifyInvalidTransition}})
khenaidoo59ef7be2019-06-21 12:40:28 -0400262 transitionMap.transitions = append(transitionMap.transitions,
Kent Hagerman6031aad2020-07-29 16:36:33 -0400263 transition{
khenaidoo59ef7be2019-06-21 12:40:28 -0400264 deviceType: any,
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530265 previousState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN, Transient: voltha.DeviceTransientState_NONE},
266 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 -0400267 handlers: []transitionHandler{dMgr.NotifyInvalidTransition}})
khenaidoo59ef7be2019-06-21 12:40:28 -0400268 transitionMap.transitions = append(transitionMap.transitions,
Kent Hagerman6031aad2020-07-29 16:36:33 -0400269 transition{
khenaidoo59ef7be2019-06-21 12:40:28 -0400270 deviceType: child,
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530271 previousState: deviceState{Admin: voltha.AdminState_DISABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN, Transient: voltha.DeviceTransientState_NONE},
272 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 -0400273 handlers: []transitionHandler{dMgr.NotifyInvalidTransition}})
khenaidoo59ef7be2019-06-21 12:40:28 -0400274 transitionMap.transitions = append(transitionMap.transitions,
Kent Hagerman6031aad2020-07-29 16:36:33 -0400275 transition{
khenaidoo59ef7be2019-06-21 12:40:28 -0400276 deviceType: any,
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530277 previousState: deviceState{Admin: voltha.AdminState_DISABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN, Transient: voltha.DeviceTransientState_NONE},
278 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 -0400279 handlers: []transitionHandler{dMgr.NotifyInvalidTransition}})
Maninder0aabf0c2021-03-17 14:55:14 +0530280 transitionMap.transitions = append(transitionMap.transitions,
281 transition{
282 deviceType: any,
283 previousState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN, Transient: voltha.DeviceTransientState_RECONCILE_IN_PROGRESS},
284 currentState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_RECONCILING, Transient: voltha.DeviceTransientState_RECONCILE_IN_PROGRESS},
285 handlers: []transitionHandler{}})
286 transitionMap.transitions = append(transitionMap.transitions,
287 transition{
288 deviceType: any,
289 previousState: deviceState{Admin: voltha.AdminState_DISABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN, Transient: voltha.DeviceTransientState_RECONCILE_IN_PROGRESS},
290 currentState: deviceState{Admin: voltha.AdminState_DISABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_RECONCILING, Transient: voltha.DeviceTransientState_RECONCILE_IN_PROGRESS},
291 handlers: []transitionHandler{}})
292 transitionMap.transitions = append(transitionMap.transitions,
293 transition{
294 deviceType: any,
295 previousState: deviceState{Admin: voltha.AdminState_PREPROVISIONED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN, Transient: voltha.DeviceTransientState_RECONCILE_IN_PROGRESS},
296 currentState: deviceState{Admin: voltha.AdminState_PREPROVISIONED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_RECONCILING, Transient: voltha.DeviceTransientState_RECONCILE_IN_PROGRESS},
297 handlers: []transitionHandler{}})
298 transitionMap.transitions = append(transitionMap.transitions,
299 transition{
300 deviceType: any,
301 previousState: deviceState{Admin: voltha.AdminState_DOWNLOADING_IMAGE, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN, Transient: voltha.DeviceTransientState_RECONCILE_IN_PROGRESS},
302 currentState: deviceState{Admin: voltha.AdminState_DOWNLOADING_IMAGE, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_RECONCILING, Transient: voltha.DeviceTransientState_RECONCILE_IN_PROGRESS},
303 handlers: []transitionHandler{}})
304 transitionMap.transitions = append(transitionMap.transitions,
305 transition{
306 deviceType: any,
307 previousState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_RECONCILING, Transient: voltha.DeviceTransientState_RECONCILE_IN_PROGRESS},
308 currentState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_REACHABLE, Operational: voltha.OperStatus_ACTIVE, Transient: voltha.DeviceTransientState_RECONCILE_IN_PROGRESS},
309 handlers: []transitionHandler{dMgr.ReconcilingCleanup}})
310 transitionMap.transitions = append(transitionMap.transitions,
311 transition{
312 deviceType: any,
313 previousState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_RECONCILING, Transient: voltha.DeviceTransientState_RECONCILE_IN_PROGRESS},
314 currentState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNREACHABLE, Operational: voltha.OperStatus_UNKNOWN, Transient: voltha.DeviceTransientState_RECONCILE_IN_PROGRESS},
315 handlers: []transitionHandler{dMgr.ReconcilingCleanup}})
316 transitionMap.transitions = append(transitionMap.transitions,
317 transition{
318 deviceType: any,
319 previousState: deviceState{Admin: voltha.AdminState_DISABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_RECONCILING, Transient: voltha.DeviceTransientState_RECONCILE_IN_PROGRESS},
320 currentState: deviceState{Admin: voltha.AdminState_DISABLED, Connection: voltha.ConnectStatus_UNREACHABLE, Operational: voltha.OperStatus_UNKNOWN, Transient: voltha.DeviceTransientState_RECONCILE_IN_PROGRESS},
321 handlers: []transitionHandler{dMgr.ReconcilingCleanup}})
322 transitionMap.transitions = append(transitionMap.transitions,
323 transition{
324 deviceType: any,
325 previousState: deviceState{Admin: voltha.AdminState_DOWNLOADING_IMAGE, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_RECONCILING, Transient: voltha.DeviceTransientState_RECONCILE_IN_PROGRESS},
326 currentState: deviceState{Admin: voltha.AdminState_DOWNLOADING_IMAGE, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN, Transient: voltha.DeviceTransientState_RECONCILE_IN_PROGRESS},
327 handlers: []transitionHandler{dMgr.ReconcilingCleanup}})
Maninder581cf4b2021-06-16 22:42:07 +0530328 transitionMap.transitions = append(transitionMap.transitions,
329 transition{
330 deviceType: any,
331 previousState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_RECONCILING, Transient: voltha.DeviceTransientState_RECONCILE_IN_PROGRESS},
332 currentState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_RECONCILING_FAILED, Transient: voltha.DeviceTransientState_RECONCILE_IN_PROGRESS},
333 handlers: []transitionHandler{dMgr.ReconcilingCleanup}})
334 transitionMap.transitions = append(transitionMap.transitions,
335 transition{
336 deviceType: any,
337 previousState: deviceState{Admin: voltha.AdminState_DISABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_RECONCILING, Transient: voltha.DeviceTransientState_RECONCILE_IN_PROGRESS},
338 currentState: deviceState{Admin: voltha.AdminState_DISABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_RECONCILING_FAILED, Transient: voltha.DeviceTransientState_RECONCILE_IN_PROGRESS},
339 handlers: []transitionHandler{dMgr.ReconcilingCleanup}})
340 transitionMap.transitions = append(transitionMap.transitions,
341 transition{
342 deviceType: any,
343 previousState: deviceState{Admin: voltha.AdminState_DOWNLOADING_IMAGE, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_RECONCILING, Transient: voltha.DeviceTransientState_RECONCILE_IN_PROGRESS},
344 currentState: deviceState{Admin: voltha.AdminState_DOWNLOADING_IMAGE, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_RECONCILING_FAILED, Transient: voltha.DeviceTransientState_RECONCILE_IN_PROGRESS},
345 handlers: []transitionHandler{dMgr.ReconcilingCleanup}})
khenaidoob9203542018-09-17 22:56:37 -0400346
347 return &transitionMap
348}
349
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530350func getDeviceStates(device *voltha.Device, transientState voltha.DeviceTransientState_Types) deviceState {
351 return deviceState{Admin: device.AdminState, Connection: device.ConnectStatus, Operational: device.OperStatus,
352 Transient: transientState}
khenaidoob9203542018-09-17 22:56:37 -0400353}
354
355// 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 -0400356func getHandler(previous deviceState, current deviceState, transition *transition) ([]transitionHandler, *match) {
khenaidoo442e7c72020-03-10 16:13:48 -0400357 m := &match{}
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530358 var waitForOtherStatesMatch bool
khenaidoob9203542018-09-17 22:56:37 -0400359 // Do we have an exact match?
Kent Hagerman6031aad2020-07-29 16:36:33 -0400360 if previous == transition.previousState && current == transition.currentState {
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530361 return transition.handlers, &match{admin: currPrevStateMatch, oper: currPrevStateMatch, conn: currPrevStateMatch,
362 transient: currPrevStateMatch}
363 }
364 // Do we have transient state match?
365 if current.Transient == transition.currentState.Transient && transition.currentState.Transient != voltha.DeviceTransientState_ANY {
366 if previous.Transient == transition.previousState.Transient || transition.previousState.Transient == voltha.DeviceTransientState_ANY {
367 m.transient = currPrevStateMatch
368 } else {
369 m.transient = currStateOnlyMatch
370 }
371 } else if current.Transient == transition.currentState.Transient && transition.currentState.Transient == voltha.DeviceTransientState_ANY {
372 if previous.Transient == transition.previousState.Transient || transition.previousState.Transient == voltha.DeviceTransientState_ANY {
373 m.transient = currWildcardMatch
374 }
375 }
376 if m.transient == noMatch {
377 return nil, m
khenaidoob9203542018-09-17 22:56:37 -0400378 }
khenaidoo0a822f92019-05-08 15:15:57 -0400379
khenaidoo442e7c72020-03-10 16:13:48 -0400380 // Do we have Admin state match?
381 if current.Admin == transition.currentState.Admin && transition.currentState.Admin != voltha.AdminState_UNKNOWN {
382 if previous.Admin == transition.previousState.Admin {
383 m.admin = currPrevStateMatch
384 } else if transition.previousState.Admin == voltha.AdminState_UNKNOWN {
385 m.admin = currStateOnlyMatch
386 }
387 } else if current.Admin == transition.currentState.Admin && transition.currentState.Admin == voltha.AdminState_UNKNOWN {
388 if previous.Admin == transition.previousState.Admin || transition.previousState.Admin == voltha.AdminState_UNKNOWN {
389 m.admin = currWildcardMatch
390 }
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530391 } else if transition.previousState.Admin == voltha.AdminState_UNKNOWN && transition.currentState.Admin == voltha.AdminState_UNKNOWN {
392 // Will only be the case of DELETION currently.(to allow only transient match, we can avoid this check if
393 // we can allow wild card in admin state)
394 waitForOtherStatesMatch = true
khenaidoo442e7c72020-03-10 16:13:48 -0400395 }
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530396 if !waitForOtherStatesMatch && m.admin == noMatch {
khenaidoo442e7c72020-03-10 16:13:48 -0400397 return nil, m
khenaidoo0a822f92019-05-08 15:15:57 -0400398 }
khenaidoo442e7c72020-03-10 16:13:48 -0400399 // Do we have an operational state match?
400 if current.Operational == transition.currentState.Operational && transition.previousState.Operational != voltha.OperStatus_UNKNOWN {
401 if previous.Operational == transition.previousState.Operational || transition.previousState.Operational == voltha.OperStatus_UNKNOWN {
402 m.oper = currPrevStateMatch
403 } else {
404 m.oper = currStateOnlyMatch
405 }
406 } else if current.Operational == transition.currentState.Operational && transition.previousState.Operational == voltha.OperStatus_UNKNOWN {
407 if previous.Operational == transition.previousState.Operational || transition.previousState.Operational == voltha.OperStatus_UNKNOWN {
408 m.oper = currWildcardMatch
khenaidoob9203542018-09-17 22:56:37 -0400409 }
410 }
khenaidoo442e7c72020-03-10 16:13:48 -0400411
412 // Do we have an connection state match?
413 if current.Connection == transition.currentState.Connection && transition.previousState.Connection != voltha.ConnectStatus_UNKNOWN {
414 if previous.Connection == transition.previousState.Connection || transition.previousState.Connection == voltha.ConnectStatus_UNKNOWN {
415 m.conn = currPrevStateMatch
416 } else {
417 m.conn = currStateOnlyMatch
418 }
419 } else if current.Connection == transition.currentState.Connection && transition.previousState.Connection == voltha.ConnectStatus_UNKNOWN {
420 if previous.Connection == transition.previousState.Connection || transition.previousState.Connection == voltha.ConnectStatus_UNKNOWN {
421 m.conn = currWildcardMatch
khenaidoob9203542018-09-17 22:56:37 -0400422 }
423 }
khenaidoo442e7c72020-03-10 16:13:48 -0400424 return transition.handlers, m
khenaidoob9203542018-09-17 22:56:37 -0400425}
426
Kent Hagerman6031aad2020-07-29 16:36:33 -0400427// getTransitionHandler returns transition handler & a flag that's set if the transition is invalid
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530428func (tMap *TransitionMap) getTransitionHandler(ctx context.Context, cDevice, pDevice *voltha.Device,
429 cTransientState, pTransientState voltha.DeviceTransientState_Types) []transitionHandler {
khenaidoob9203542018-09-17 22:56:37 -0400430 //1. Get the previous and current set of states
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530431 cState := getDeviceStates(cDevice, cTransientState)
432 pState := getDeviceStates(pDevice, pTransientState)
khenaidoo442e7c72020-03-10 16:13:48 -0400433
434 // Do nothing is there are no states change
Kent Hagerman6031aad2020-07-29 16:36:33 -0400435 if pState == cState {
khenaidoo442e7c72020-03-10 16:13:48 -0400436 return nil
437 }
438
Rohan Agrawal31f21802020-06-12 05:38:46 +0000439 //logger.Infow(ctx, "deviceType", log.Fields{"device": pDevice})
khenaidoob9203542018-09-17 22:56:37 -0400440 deviceType := parent
Kent Hagerman6031aad2020-07-29 16:36:33 -0400441 if !cDevice.Root {
Rohan Agrawal31f21802020-06-12 05:38:46 +0000442 logger.Info(ctx, "device is child")
khenaidoob9203542018-09-17 22:56:37 -0400443 deviceType = child
444 }
Kent Hagerman6031aad2020-07-29 16:36:33 -0400445 logger.Infof(ctx, "deviceType:%d-deviceId:%s-previous:%v-current:%v", deviceType, cDevice.Id, pState, cState)
khenaidoob9203542018-09-17 22:56:37 -0400446
447 //2. Go over transition array to get the right transition
Kent Hagerman6031aad2020-07-29 16:36:33 -0400448 var currentMatch []transitionHandler
449 var tempHandler []transitionHandler
khenaidoo442e7c72020-03-10 16:13:48 -0400450 var m *match
451 bestMatch := &match{}
Andrey Pozolotin34dd63f2021-05-31 21:26:40 +0300452 for i := range tMap.transitions {
khenaidoob9203542018-09-17 22:56:37 -0400453 // consider transition only if it matches deviceType or is a wild card - any
Andrey Pozolotin34dd63f2021-05-31 21:26:40 +0300454 if tMap.transitions[i].deviceType != deviceType && tMap.transitions[i].deviceType != any {
khenaidoob9203542018-09-17 22:56:37 -0400455 continue
456 }
Andrey Pozolotin34dd63f2021-05-31 21:26:40 +0300457 tempHandler, m = getHandler(pState, cState, &tMap.transitions[i])
khenaidoob9203542018-09-17 22:56:37 -0400458 if tempHandler != nil {
Andrey Pozolotin34dd63f2021-05-31 21:26:40 +0300459 if m.isExactMatch() && tMap.transitions[i].deviceType == deviceType {
khenaidoob9203542018-09-17 22:56:37 -0400460 return tempHandler
khenaidoo442e7c72020-03-10 16:13:48 -0400461 } else if m.isExactMatch() || m.isBetterMatch(bestMatch) {
khenaidoo0a822f92019-05-08 15:15:57 -0400462 currentMatch = tempHandler
khenaidoo442e7c72020-03-10 16:13:48 -0400463 bestMatch = m
khenaidoob9203542018-09-17 22:56:37 -0400464 }
465 }
466 }
467 return currentMatch
468}
Kent Hagerman6031aad2020-07-29 16:36:33 -0400469
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530470func (tMap *TransitionMap) ProcessTransition(ctx context.Context, device, prevDevice *voltha.Device,
471 deviceTransientState, prevDeviceTransientState voltha.DeviceTransientState_Types) error {
Kent Hagerman6031aad2020-07-29 16:36:33 -0400472 // This will be triggered on every state update
473 logger.Debugw(ctx, "state-transition", log.Fields{
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530474 "device": device.Id,
475 "prev-admin-state": prevDevice.AdminState,
476 "prev-oper-state": prevDevice.OperStatus,
477 "prev-conn-state": prevDevice.ConnectStatus,
478 "curr-admin-state": device.AdminState,
479 "curr-oper-state": device.OperStatus,
480 "curr-conn-state": device.ConnectStatus,
481 "curr-transient-state": deviceTransientState,
482 "prev-transient-state": prevDeviceTransientState,
Kent Hagerman6031aad2020-07-29 16:36:33 -0400483 })
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530484 handlers := tMap.getTransitionHandler(ctx, device, prevDevice, deviceTransientState, prevDeviceTransientState)
Maninder0aabf0c2021-03-17 14:55:14 +0530485 if len(handlers) == 0 {
Kent Hagerman6031aad2020-07-29 16:36:33 -0400486 logger.Debugw(ctx, "no-op-transition", log.Fields{"deviceId": device.Id})
487 return nil
488 }
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530489 logger.Debugw(ctx, "handler-found", log.Fields{"num-expectedHandlers": len(handlers), "isParent": device.Root,
490 "current-data": device, "previous-data": prevDevice})
Kent Hagerman6031aad2020-07-29 16:36:33 -0400491 for _, handler := range handlers {
492 logger.Debugw(ctx, "running-handler", log.Fields{"handler": funcName(handler)})
493 if err := handler(ctx, device); err != nil {
494 logger.Warnw(ctx, "handler-failed", log.Fields{"handler": funcName(handler), "error": err})
495 return err
496 }
497 }
498 return nil
499}
500
501func funcName(f interface{}) string {
502 return runtime.FuncForPC(reflect.ValueOf(f).Pointer()).Name()
503}