blob: 3800c2ff1a5e048096ddbde01a8482816ebe0cf0 [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 Hagerman2b216042020-04-03 18:28:56 -040017package device
khenaidoob9203542018-09-17 22:56:37 -040018
19import (
npujar467fe752020-01-16 20:17:45 +053020 "context"
npujar1d86a522019-11-14 17:11:16 +053021 "github.com/opencord/voltha-go/rw_core/coreif"
serkant.uluderya2ae470f2020-01-21 11:13:09 -080022 "github.com/opencord/voltha-protos/v3/go/voltha"
khenaidoob9203542018-09-17 22:56:37 -040023)
24
Kent Hagerman2b216042020-04-03 18:28:56 -040025// deviceType mentions type of device like parent, child
26type deviceType int32
khenaidoob9203542018-09-17 22:56:37 -040027
28const (
Kent Hagerman2b216042020-04-03 18:28:56 -040029 parent deviceType = 0
30 child deviceType = 1
31 any deviceType = 2
khenaidoob9203542018-09-17 22:56:37 -040032)
33
Kent Hagerman2b216042020-04-03 18:28:56 -040034type matchResult uint8
khenaidoo442e7c72020-03-10 16:13:48 -040035
36const (
Kent Hagerman2b216042020-04-03 18:28:56 -040037 noMatch matchResult = iota // current state has not match in the transition table
khenaidoo442e7c72020-03-10 16:13:48 -040038 currWildcardMatch // current state matches the wildcard *_UNKNOWN state in the transition table
39 currStateOnlyMatch // current state matches the current state and previous state matches the wildcard in the transition table
40 currPrevStateMatch // both current and previous states match in the transition table
41)
42
43// match is used to keep the current match states
44type match struct {
Kent Hagerman2b216042020-04-03 18:28:56 -040045 admin, oper, conn matchResult
khenaidoo442e7c72020-03-10 16:13:48 -040046}
47
48// toInt returns an integer representing the matching level of the match (the larger the number the better)
49func (m *match) toInt() int {
50 return int(m.admin<<4 | m.oper<<2 | m.conn)
51}
52
53// isExactMatch returns true if match is an exact match
54func (m *match) isExactMatch() bool {
55 return m.admin == currPrevStateMatch && m.oper == currPrevStateMatch && m.conn == currPrevStateMatch
56}
57
58// isBetterMatch returns true if newMatch is a worse match
59func (m *match) isBetterMatch(newMatch *match) bool {
60 return m.toInt() > newMatch.toInt()
61}
62
Kent Hagerman2b216042020-04-03 18:28:56 -040063// deviceState has admin, operational and connection status of device
64type deviceState struct {
serkant.uluderya2ae470f2020-01-21 11:13:09 -080065 Admin voltha.AdminState_Types
66 Connection voltha.ConnectStatus_Types
67 Operational voltha.OperStatus_Types
khenaidoob9203542018-09-17 22:56:37 -040068}
69
khenaidoo442e7c72020-03-10 16:13:48 -040070// TransitionHandler function type which takes the current and previous device info as input parameter
Kent Hagermand9cc2e92019-11-04 13:28:15 -050071type TransitionHandler func(context.Context, *voltha.Device) error
khenaidoob9203542018-09-17 22:56:37 -040072
npujar1d86a522019-11-14 17:11:16 +053073// Transition represent transition related attributes
khenaidoob9203542018-09-17 22:56:37 -040074type Transition struct {
Kent Hagerman2b216042020-04-03 18:28:56 -040075 deviceType deviceType
76 previousState deviceState
77 currentState deviceState
khenaidoo92e62c52018-10-03 14:02:54 -040078 handlers []TransitionHandler
khenaidoob9203542018-09-17 22:56:37 -040079}
80
npujar1d86a522019-11-14 17:11:16 +053081// TransitionMap represent map of transitions and device manager
khenaidoob9203542018-09-17 22:56:37 -040082type TransitionMap struct {
83 transitions []Transition
npujar1d86a522019-11-14 17:11:16 +053084 dMgr coreif.DeviceManager
khenaidoob9203542018-09-17 22:56:37 -040085}
86
npujar1d86a522019-11-14 17:11:16 +053087// NewTransitionMap creates transition map
88func NewTransitionMap(dMgr coreif.DeviceManager) *TransitionMap {
khenaidoob9203542018-09-17 22:56:37 -040089 var transitionMap TransitionMap
khenaidoo0a822f92019-05-08 15:15:57 -040090 transitionMap.dMgr = dMgr
khenaidoob9203542018-09-17 22:56:37 -040091 transitionMap.transitions = make([]Transition, 0)
khenaidoo442e7c72020-03-10 16:13:48 -040092 transitionMap.transitions = append(
93 transitionMap.transitions,
khenaidoob9203542018-09-17 22:56:37 -040094 Transition{
khenaidoob9203542018-09-17 22:56:37 -040095 deviceType: parent,
Kent Hagerman2b216042020-04-03 18:28:56 -040096 previousState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_ACTIVATING},
97 currentState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_ACTIVE},
khenaidoo0a822f92019-05-08 15:15:57 -040098 handlers: []TransitionHandler{dMgr.CreateLogicalDevice}})
99 transitionMap.transitions = append(transitionMap.transitions,
100 Transition{
khenaidoo59ef7be2019-06-21 12:40:28 -0400101 deviceType: child,
Kent Hagerman2b216042020-04-03 18:28:56 -0400102 previousState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_DISCOVERED},
103 currentState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_ACTIVATING},
khenaidoo442e7c72020-03-10 16:13:48 -0400104 handlers: []TransitionHandler{}})
105 transitionMap.transitions = append(transitionMap.transitions,
106 Transition{
107 deviceType: child,
Kent Hagerman2b216042020-04-03 18:28:56 -0400108 previousState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_DISCOVERED},
109 currentState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_ACTIVE},
khenaidoo59ef7be2019-06-21 12:40:28 -0400110 handlers: []TransitionHandler{dMgr.SetupUNILogicalPorts}})
khenaidoob9203542018-09-17 22:56:37 -0400111 transitionMap.transitions = append(transitionMap.transitions,
112 Transition{
113 deviceType: child,
Kent Hagerman2b216042020-04-03 18:28:56 -0400114 previousState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_ACTIVATING},
115 currentState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_DISCOVERED},
khenaidoo442e7c72020-03-10 16:13:48 -0400116 handlers: []TransitionHandler{}})
117 transitionMap.transitions = append(transitionMap.transitions,
118 Transition{
119 deviceType: child,
Kent Hagerman2b216042020-04-03 18:28:56 -0400120 previousState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_ACTIVATING},
121 currentState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_ACTIVE},
khenaidoo0a822f92019-05-08 15:15:57 -0400122 handlers: []TransitionHandler{dMgr.SetupUNILogicalPorts}})
khenaidoob9203542018-09-17 22:56:37 -0400123 transitionMap.transitions = append(transitionMap.transitions,
124 Transition{
khenaidoo4554f7c2019-05-29 22:13:15 -0400125 deviceType: any,
Kent Hagerman2b216042020-04-03 18:28:56 -0400126 previousState: deviceState{Admin: voltha.AdminState_PREPROVISIONED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN},
127 currentState: deviceState{Admin: voltha.AdminState_DELETED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN},
khenaidoo4554f7c2019-05-29 22:13:15 -0400128 handlers: []TransitionHandler{dMgr.RunPostDeviceDelete}})
129 transitionMap.transitions = append(transitionMap.transitions,
130 Transition{
khenaidoo4d4802d2018-10-04 21:59:49 -0400131 deviceType: parent,
Kent Hagerman2b216042020-04-03 18:28:56 -0400132 previousState: deviceState{Admin: voltha.AdminState_UNKNOWN, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN},
133 currentState: deviceState{Admin: voltha.AdminState_DELETED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN},
Chaitrashree G S3bbfa352020-05-02 02:32:07 -0400134 handlers: []TransitionHandler{dMgr.DeleteAllLogicalPorts, dMgr.DeleteAllChildDevices, dMgr.DeleteLogicalDevice, dMgr.RunPostDeviceDelete}})
khenaidoo0a822f92019-05-08 15:15:57 -0400135 transitionMap.transitions = append(transitionMap.transitions,
136 Transition{
Girish Gowdra408cd962020-03-11 14:31:31 -0700137 deviceType: parent,
Kent Hagerman2b216042020-04-03 18:28:56 -0400138 previousState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_REACHABLE, Operational: voltha.OperStatus_ACTIVE},
139 currentState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNREACHABLE, Operational: voltha.OperStatus_UNKNOWN},
Chaitrashree G S3bbfa352020-05-02 02:32:07 -0400140 handlers: []TransitionHandler{dMgr.DeleteAllLogicalPorts, dMgr.DeleteAllChildDevices, dMgr.DeleteLogicalDevice, dMgr.DeleteAllDeviceFlows}})
Girish Gowdra408cd962020-03-11 14:31:31 -0700141 transitionMap.transitions = append(transitionMap.transitions,
142 Transition{
143 deviceType: parent,
Kent Hagerman2b216042020-04-03 18:28:56 -0400144 previousState: deviceState{Admin: voltha.AdminState_DISABLED, Connection: voltha.ConnectStatus_REACHABLE, Operational: voltha.OperStatus_UNKNOWN},
145 currentState: deviceState{Admin: voltha.AdminState_DISABLED, Connection: voltha.ConnectStatus_UNREACHABLE, Operational: voltha.OperStatus_UNKNOWN},
Chaitrashree G S3bbfa352020-05-02 02:32:07 -0400146 handlers: []TransitionHandler{dMgr.DeleteAllLogicalPorts, dMgr.DeleteAllChildDevices, dMgr.DeleteLogicalDevice, dMgr.DeleteAllDeviceFlows}})
Chaitrashree G S7849b322020-03-29 19:25:49 -0400147 transitionMap.transitions = append(transitionMap.transitions,
148 Transition{
149 deviceType: parent,
Kent Hagerman2b216042020-04-03 18:28:56 -0400150 previousState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNREACHABLE, Operational: voltha.OperStatus_UNKNOWN},
151 currentState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_REACHABLE, Operational: voltha.OperStatus_ACTIVE},
Girish Gowdra408cd962020-03-11 14:31:31 -0700152 handlers: []TransitionHandler{dMgr.CreateLogicalDevice}})
153 transitionMap.transitions = append(transitionMap.transitions,
154 Transition{
Chaitrashree G S7849b322020-03-29 19:25:49 -0400155 deviceType: parent,
Kent Hagerman2b216042020-04-03 18:28:56 -0400156 previousState: deviceState{Admin: voltha.AdminState_DISABLED, Connection: voltha.ConnectStatus_UNREACHABLE, Operational: voltha.OperStatus_UNKNOWN},
157 currentState: deviceState{Admin: voltha.AdminState_DISABLED, Connection: voltha.ConnectStatus_REACHABLE, Operational: voltha.OperStatus_UNKNOWN},
Chaitrashree G S7849b322020-03-29 19:25:49 -0400158 handlers: []TransitionHandler{dMgr.CreateLogicalDevice}})
159 transitionMap.transitions = append(transitionMap.transitions,
160 Transition{
khenaidoo0a822f92019-05-08 15:15:57 -0400161 deviceType: child,
Kent Hagerman2b216042020-04-03 18:28:56 -0400162 previousState: deviceState{Admin: voltha.AdminState_UNKNOWN, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN},
163 currentState: deviceState{Admin: voltha.AdminState_DELETED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN},
Chaitrashree G S543df3e2020-02-24 22:36:54 -0500164 handlers: []TransitionHandler{dMgr.ChildDeviceLost, dMgr.DeleteLogicalPorts, dMgr.RunPostDeviceDelete}})
165 transitionMap.transitions = append(transitionMap.transitions,
166 Transition{
167 deviceType: child,
Kent Hagerman2b216042020-04-03 18:28:56 -0400168 previousState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN},
169 currentState: deviceState{Admin: voltha.AdminState_DELETED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN},
Chaitrashree G S543df3e2020-02-24 22:36:54 -0500170 handlers: []TransitionHandler{dMgr.ChildDeviceLost, dMgr.DeleteLogicalPorts, dMgr.RunPostDeviceDelete}})
khenaidoob9203542018-09-17 22:56:37 -0400171 transitionMap.transitions = append(transitionMap.transitions,
172 Transition{
173 deviceType: any,
Kent Hagerman2b216042020-04-03 18:28:56 -0400174 previousState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_ACTIVE},
175 currentState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_ACTIVATING},
khenaidoo59ef7be2019-06-21 12:40:28 -0400176 handlers: []TransitionHandler{dMgr.NotifyInvalidTransition}})
177 transitionMap.transitions = append(transitionMap.transitions,
178 Transition{
179 deviceType: any,
Kent Hagerman2b216042020-04-03 18:28:56 -0400180 previousState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_ACTIVATING},
181 currentState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN},
khenaidoo59ef7be2019-06-21 12:40:28 -0400182 handlers: []TransitionHandler{dMgr.NotifyInvalidTransition}})
183 transitionMap.transitions = append(transitionMap.transitions,
184 Transition{
185 deviceType: any,
Kent Hagerman2b216042020-04-03 18:28:56 -0400186 previousState: deviceState{Admin: voltha.AdminState_PREPROVISIONED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN},
187 currentState: deviceState{Admin: voltha.AdminState_UNKNOWN, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN},
khenaidoo59ef7be2019-06-21 12:40:28 -0400188 handlers: []TransitionHandler{dMgr.NotifyInvalidTransition}})
189 transitionMap.transitions = append(transitionMap.transitions,
190 Transition{
191 deviceType: any,
Kent Hagerman2b216042020-04-03 18:28:56 -0400192 previousState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN},
193 currentState: deviceState{Admin: voltha.AdminState_DOWNLOADING_IMAGE, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN},
khenaidoo59ef7be2019-06-21 12:40:28 -0400194 handlers: []TransitionHandler{dMgr.NotifyInvalidTransition}})
195 transitionMap.transitions = append(transitionMap.transitions,
196 Transition{
197 deviceType: any,
Kent Hagerman2b216042020-04-03 18:28:56 -0400198 previousState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN},
199 currentState: deviceState{Admin: voltha.AdminState_UNKNOWN, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN},
khenaidoo59ef7be2019-06-21 12:40:28 -0400200 handlers: []TransitionHandler{dMgr.NotifyInvalidTransition}})
201 transitionMap.transitions = append(transitionMap.transitions,
202 Transition{
203 deviceType: parent,
Kent Hagerman2b216042020-04-03 18:28:56 -0400204 previousState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_ACTIVE},
205 currentState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_ACTIVATING},
khenaidoo59ef7be2019-06-21 12:40:28 -0400206 handlers: []TransitionHandler{dMgr.NotifyInvalidTransition}})
207 transitionMap.transitions = append(transitionMap.transitions,
208 Transition{
209 deviceType: any,
Kent Hagerman2b216042020-04-03 18:28:56 -0400210 previousState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_ACTIVATING},
211 currentState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN},
khenaidoo59ef7be2019-06-21 12:40:28 -0400212 handlers: []TransitionHandler{dMgr.NotifyInvalidTransition}})
213 transitionMap.transitions = append(transitionMap.transitions,
214 Transition{
215 deviceType: any,
Kent Hagerman2b216042020-04-03 18:28:56 -0400216 previousState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN},
217 currentState: deviceState{Admin: voltha.AdminState_PREPROVISIONED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN},
khenaidoo59ef7be2019-06-21 12:40:28 -0400218 handlers: []TransitionHandler{dMgr.NotifyInvalidTransition}})
219 transitionMap.transitions = append(transitionMap.transitions,
220 Transition{
221 deviceType: child,
Kent Hagerman2b216042020-04-03 18:28:56 -0400222 previousState: deviceState{Admin: voltha.AdminState_DISABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN},
223 currentState: deviceState{Admin: voltha.AdminState_UNKNOWN, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN},
khenaidoo59ef7be2019-06-21 12:40:28 -0400224 handlers: []TransitionHandler{dMgr.NotifyInvalidTransition}})
225 transitionMap.transitions = append(transitionMap.transitions,
226 Transition{
227 deviceType: any,
Kent Hagerman2b216042020-04-03 18:28:56 -0400228 previousState: deviceState{Admin: voltha.AdminState_DISABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN},
229 currentState: deviceState{Admin: voltha.AdminState_PREPROVISIONED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN},
khenaidoo59ef7be2019-06-21 12:40:28 -0400230 handlers: []TransitionHandler{dMgr.NotifyInvalidTransition}})
231 transitionMap.transitions = append(transitionMap.transitions,
232 Transition{
233 deviceType: any,
Kent Hagerman2b216042020-04-03 18:28:56 -0400234 previousState: deviceState{Admin: voltha.AdminState_DOWNLOADING_IMAGE, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN},
235 currentState: deviceState{Admin: voltha.AdminState_DISABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN},
khenaidoo0a822f92019-05-08 15:15:57 -0400236 handlers: []TransitionHandler{dMgr.NotifyInvalidTransition}})
khenaidoob9203542018-09-17 22:56:37 -0400237
238 return &transitionMap
239}
240
Kent Hagerman2b216042020-04-03 18:28:56 -0400241func getDeviceStates(device *voltha.Device) *deviceState {
242 return &deviceState{Admin: device.AdminState, Connection: device.ConnectStatus, Operational: device.OperStatus}
khenaidoob9203542018-09-17 22:56:37 -0400243}
244
245// isMatched matches a state transition. It returns whether there is a match and if there is whether it is an exact match
Kent Hagerman2b216042020-04-03 18:28:56 -0400246func getHandler(previous *deviceState, current *deviceState, transition *Transition) ([]TransitionHandler, *match) {
khenaidoo442e7c72020-03-10 16:13:48 -0400247 m := &match{}
khenaidoob9203542018-09-17 22:56:37 -0400248 // Do we have an exact match?
249 if *previous == transition.previousState && *current == transition.currentState {
khenaidoo442e7c72020-03-10 16:13:48 -0400250 return transition.handlers, &match{admin: currPrevStateMatch, oper: currPrevStateMatch, conn: currPrevStateMatch}
khenaidoob9203542018-09-17 22:56:37 -0400251 }
khenaidoo0a822f92019-05-08 15:15:57 -0400252
khenaidoo442e7c72020-03-10 16:13:48 -0400253 // Do we have Admin state match?
254 if current.Admin == transition.currentState.Admin && transition.currentState.Admin != voltha.AdminState_UNKNOWN {
255 if previous.Admin == transition.previousState.Admin {
256 m.admin = currPrevStateMatch
257 } else if transition.previousState.Admin == voltha.AdminState_UNKNOWN {
258 m.admin = currStateOnlyMatch
259 }
260 } else if current.Admin == transition.currentState.Admin && transition.currentState.Admin == voltha.AdminState_UNKNOWN {
261 if previous.Admin == transition.previousState.Admin || transition.previousState.Admin == voltha.AdminState_UNKNOWN {
262 m.admin = currWildcardMatch
263 }
264 }
265 if m.admin == noMatch {
266 // invalid transition - need to match on current admin state
267 return nil, m
khenaidoo0a822f92019-05-08 15:15:57 -0400268 }
269
khenaidoo442e7c72020-03-10 16:13:48 -0400270 // Do we have an operational state match?
271 if current.Operational == transition.currentState.Operational && transition.previousState.Operational != voltha.OperStatus_UNKNOWN {
272 if previous.Operational == transition.previousState.Operational || transition.previousState.Operational == voltha.OperStatus_UNKNOWN {
273 m.oper = currPrevStateMatch
274 } else {
275 m.oper = currStateOnlyMatch
276 }
277 } else if current.Operational == transition.currentState.Operational && transition.previousState.Operational == voltha.OperStatus_UNKNOWN {
278 if previous.Operational == transition.previousState.Operational || transition.previousState.Operational == voltha.OperStatus_UNKNOWN {
279 m.oper = currWildcardMatch
khenaidoob9203542018-09-17 22:56:37 -0400280 }
281 }
khenaidoo442e7c72020-03-10 16:13:48 -0400282
283 // Do we have an connection state match?
284 if current.Connection == transition.currentState.Connection && transition.previousState.Connection != voltha.ConnectStatus_UNKNOWN {
285 if previous.Connection == transition.previousState.Connection || transition.previousState.Connection == voltha.ConnectStatus_UNKNOWN {
286 m.conn = currPrevStateMatch
287 } else {
288 m.conn = currStateOnlyMatch
289 }
290 } else if current.Connection == transition.currentState.Connection && transition.previousState.Connection == voltha.ConnectStatus_UNKNOWN {
291 if previous.Connection == transition.previousState.Connection || transition.previousState.Connection == voltha.ConnectStatus_UNKNOWN {
292 m.conn = currWildcardMatch
khenaidoob9203542018-09-17 22:56:37 -0400293 }
294 }
khenaidoo442e7c72020-03-10 16:13:48 -0400295
296 return transition.handlers, m
khenaidoob9203542018-09-17 22:56:37 -0400297}
298
Kent Hagermand9cc2e92019-11-04 13:28:15 -0500299// GetTransitionHandler returns transition handler & a flag that's set if the transition is invalid
Rohan Agrawal31f21802020-06-12 05:38:46 +0000300func (tMap *TransitionMap) GetTransitionHandler(ctx context.Context, device *voltha.Device, pState *deviceState) []TransitionHandler {
khenaidoob9203542018-09-17 22:56:37 -0400301 //1. Get the previous and current set of states
Kent Hagermand9cc2e92019-11-04 13:28:15 -0500302 cState := getDeviceStates(device)
khenaidoo442e7c72020-03-10 16:13:48 -0400303
304 // Do nothing is there are no states change
305 if *pState == *cState {
306 return nil
307 }
308
Rohan Agrawal31f21802020-06-12 05:38:46 +0000309 //logger.Infow(ctx, "deviceType", log.Fields{"device": pDevice})
khenaidoob9203542018-09-17 22:56:37 -0400310 deviceType := parent
Kent Hagermand9cc2e92019-11-04 13:28:15 -0500311 if !device.Root {
Rohan Agrawal31f21802020-06-12 05:38:46 +0000312 logger.Info(ctx, "device is child")
khenaidoob9203542018-09-17 22:56:37 -0400313 deviceType = child
314 }
Rohan Agrawal31f21802020-06-12 05:38:46 +0000315 logger.Infof(ctx, "deviceType:%d-deviceId:%s-previous:%v-current:%v", deviceType, device.Id, pState, cState)
khenaidoob9203542018-09-17 22:56:37 -0400316
317 //2. Go over transition array to get the right transition
khenaidoo92e62c52018-10-03 14:02:54 -0400318 var currentMatch []TransitionHandler
319 var tempHandler []TransitionHandler
khenaidoo442e7c72020-03-10 16:13:48 -0400320 var m *match
321 bestMatch := &match{}
khenaidoob9203542018-09-17 22:56:37 -0400322 for _, aTransition := range tMap.transitions {
323 // consider transition only if it matches deviceType or is a wild card - any
324 if aTransition.deviceType != deviceType && aTransition.deviceType != any {
325 continue
326 }
khenaidoo442e7c72020-03-10 16:13:48 -0400327 tempHandler, m = getHandler(pState, cState, &aTransition)
khenaidoob9203542018-09-17 22:56:37 -0400328 if tempHandler != nil {
khenaidoo442e7c72020-03-10 16:13:48 -0400329 if m.isExactMatch() && aTransition.deviceType == deviceType {
khenaidoob9203542018-09-17 22:56:37 -0400330 return tempHandler
khenaidoo442e7c72020-03-10 16:13:48 -0400331 } else if m.isExactMatch() || m.isBetterMatch(bestMatch) {
khenaidoo0a822f92019-05-08 15:15:57 -0400332 currentMatch = tempHandler
khenaidoo442e7c72020-03-10 16:13:48 -0400333 bestMatch = m
khenaidoob9203542018-09-17 22:56:37 -0400334 }
335 }
336 }
337 return currentMatch
338}