blob: f1630dae765b25f99ba9a3b6a6c8cca8c01736cd [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"
khenaidood948f772021-08-11 17:49:24 -040023
24 "github.com/opencord/voltha-lib-go/v7/pkg/log"
25 "github.com/opencord/voltha-protos/v5/go/core"
26 "github.com/opencord/voltha-protos/v5/go/voltha"
khenaidoob9203542018-09-17 22:56:37 -040027)
28
Kent Hagerman2b216042020-04-03 18:28:56 -040029// deviceType mentions type of device like parent, child
30type deviceType int32
khenaidoob9203542018-09-17 22:56:37 -040031
32const (
Kent Hagerman2b216042020-04-03 18:28:56 -040033 parent deviceType = 0
34 child deviceType = 1
35 any deviceType = 2
khenaidoob9203542018-09-17 22:56:37 -040036)
37
Himani Chawla2ba1c9c2020-10-07 13:19:03 +053038type matchResult uint16
khenaidoo442e7c72020-03-10 16:13:48 -040039
40const (
Kent Hagerman2b216042020-04-03 18:28:56 -040041 noMatch matchResult = iota // current state has not match in the transition table
khenaidoo442e7c72020-03-10 16:13:48 -040042 currWildcardMatch // current state matches the wildcard *_UNKNOWN state in the transition table
43 currStateOnlyMatch // current state matches the current state and previous state matches the wildcard in the transition table
44 currPrevStateMatch // both current and previous states match in the transition table
45)
46
47// match is used to keep the current match states
48type match struct {
Himani Chawla2ba1c9c2020-10-07 13:19:03 +053049 admin, oper, conn, transient matchResult
khenaidoo442e7c72020-03-10 16:13:48 -040050}
51
52// toInt returns an integer representing the matching level of the match (the larger the number the better)
53func (m *match) toInt() int {
Himani Chawla2ba1c9c2020-10-07 13:19:03 +053054 return int(m.transient<<8 | m.admin<<4 | m.oper<<2 | m.conn)
khenaidoo442e7c72020-03-10 16:13:48 -040055}
56
57// isExactMatch returns true if match is an exact match
58func (m *match) isExactMatch() bool {
Himani Chawla2ba1c9c2020-10-07 13:19:03 +053059 return m.admin == currPrevStateMatch && m.oper == currPrevStateMatch && m.conn == currPrevStateMatch &&
60 m.transient == currPrevStateMatch
khenaidoo442e7c72020-03-10 16:13:48 -040061}
62
63// isBetterMatch returns true if newMatch is a worse match
64func (m *match) isBetterMatch(newMatch *match) bool {
65 return m.toInt() > newMatch.toInt()
66}
67
Kent Hagerman2b216042020-04-03 18:28:56 -040068// deviceState has admin, operational and connection status of device
69type deviceState struct {
serkant.uluderya2ae470f2020-01-21 11:13:09 -080070 Admin voltha.AdminState_Types
71 Connection voltha.ConnectStatus_Types
72 Operational voltha.OperStatus_Types
khenaidood948f772021-08-11 17:49:24 -040073 Transient core.DeviceTransientState_Types
khenaidoob9203542018-09-17 22:56:37 -040074}
75
Kent Hagerman6031aad2020-07-29 16:36:33 -040076// transitionHandler function type which takes the current and previous device info as input parameter
77type transitionHandler func(context.Context, *voltha.Device) error
khenaidoob9203542018-09-17 22:56:37 -040078
Kent Hagerman6031aad2020-07-29 16:36:33 -040079// transition represent transition related attributes
80type transition struct {
Kent Hagerman2b216042020-04-03 18:28:56 -040081 deviceType deviceType
82 previousState deviceState
83 currentState deviceState
Kent Hagerman6031aad2020-07-29 16:36:33 -040084 handlers []transitionHandler
khenaidoob9203542018-09-17 22:56:37 -040085}
86
npujar1d86a522019-11-14 17:11:16 +053087// TransitionMap represent map of transitions and device manager
khenaidoob9203542018-09-17 22:56:37 -040088type TransitionMap struct {
Kent Hagerman6031aad2020-07-29 16:36:33 -040089 transitions []transition
90 dMgr DeviceManager
91}
92
93// DeviceManager represents a generic device manager
94type DeviceManager interface {
95 NotifyInvalidTransition(ctx context.Context, curr *voltha.Device) error
96 CreateLogicalDevice(ctx context.Context, curr *voltha.Device) error
97 SetupUNILogicalPorts(ctx context.Context, curr *voltha.Device) error
98 DeleteLogicalDevice(ctx context.Context, curr *voltha.Device) error
99 DeleteLogicalPorts(ctx context.Context, curr *voltha.Device) error
100 DeleteAllChildDevices(ctx context.Context, curr *voltha.Device) error
101 RunPostDeviceDelete(ctx context.Context, curr *voltha.Device) error
102 ChildDeviceLost(ctx context.Context, curr *voltha.Device) error
103 DeleteAllLogicalPorts(ctx context.Context, curr *voltha.Device) error
serkant.uluderyaad1e6832020-12-17 21:08:38 +0300104 DeleteAllLogicalMeters(ctx context.Context, curr *voltha.Device) error
Kent Hagerman6031aad2020-07-29 16:36:33 -0400105 DeleteAllDeviceFlows(ctx context.Context, curr *voltha.Device) error
Maninder0aabf0c2021-03-17 14:55:14 +0530106 ReconcilingCleanup(ctx context.Context, curr *voltha.Device) error
khenaidoob9203542018-09-17 22:56:37 -0400107}
108
npujar1d86a522019-11-14 17:11:16 +0530109// NewTransitionMap creates transition map
Kent Hagerman6031aad2020-07-29 16:36:33 -0400110func NewTransitionMap(dMgr DeviceManager) *TransitionMap {
khenaidoob9203542018-09-17 22:56:37 -0400111 var transitionMap TransitionMap
khenaidoo0a822f92019-05-08 15:15:57 -0400112 transitionMap.dMgr = dMgr
Kent Hagerman6031aad2020-07-29 16:36:33 -0400113 transitionMap.transitions = make([]transition, 0)
khenaidoo442e7c72020-03-10 16:13:48 -0400114 transitionMap.transitions = append(
115 transitionMap.transitions,
Kent Hagerman6031aad2020-07-29 16:36:33 -0400116 transition{
khenaidoob9203542018-09-17 22:56:37 -0400117 deviceType: parent,
khenaidood948f772021-08-11 17:49:24 -0400118 previousState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_ACTIVATING, Transient: core.DeviceTransientState_NONE},
119 currentState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_ACTIVE, Transient: core.DeviceTransientState_NONE},
Kent Hagerman6031aad2020-07-29 16:36:33 -0400120 handlers: []transitionHandler{dMgr.CreateLogicalDevice}})
khenaidoo0a822f92019-05-08 15:15:57 -0400121 transitionMap.transitions = append(transitionMap.transitions,
Kent Hagerman6031aad2020-07-29 16:36:33 -0400122 transition{
khenaidoo59ef7be2019-06-21 12:40:28 -0400123 deviceType: child,
khenaidood948f772021-08-11 17:49:24 -0400124 previousState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_DISCOVERED, Transient: core.DeviceTransientState_NONE},
125 currentState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_ACTIVATING, Transient: core.DeviceTransientState_NONE},
Kent Hagerman6031aad2020-07-29 16:36:33 -0400126 handlers: []transitionHandler{}})
khenaidoo442e7c72020-03-10 16:13:48 -0400127 transitionMap.transitions = append(transitionMap.transitions,
Kent Hagerman6031aad2020-07-29 16:36:33 -0400128 transition{
khenaidoo442e7c72020-03-10 16:13:48 -0400129 deviceType: child,
khenaidood948f772021-08-11 17:49:24 -0400130 previousState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_DISCOVERED, Transient: core.DeviceTransientState_NONE},
131 currentState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_ACTIVE, Transient: core.DeviceTransientState_NONE},
Kent Hagerman6031aad2020-07-29 16:36:33 -0400132 handlers: []transitionHandler{dMgr.SetupUNILogicalPorts}})
khenaidoob9203542018-09-17 22:56:37 -0400133 transitionMap.transitions = append(transitionMap.transitions,
Kent Hagerman6031aad2020-07-29 16:36:33 -0400134 transition{
khenaidoob9203542018-09-17 22:56:37 -0400135 deviceType: child,
khenaidood948f772021-08-11 17:49:24 -0400136 previousState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_ACTIVATING, Transient: core.DeviceTransientState_NONE},
137 currentState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_DISCOVERED, Transient: core.DeviceTransientState_NONE},
Kent Hagerman6031aad2020-07-29 16:36:33 -0400138 handlers: []transitionHandler{}})
khenaidoo442e7c72020-03-10 16:13:48 -0400139 transitionMap.transitions = append(transitionMap.transitions,
Kent Hagerman6031aad2020-07-29 16:36:33 -0400140 transition{
khenaidoo442e7c72020-03-10 16:13:48 -0400141 deviceType: child,
khenaidood948f772021-08-11 17:49:24 -0400142 previousState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_ACTIVATING, Transient: core.DeviceTransientState_NONE},
143 currentState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_ACTIVE, Transient: core.DeviceTransientState_NONE},
Kent Hagerman6031aad2020-07-29 16:36:33 -0400144 handlers: []transitionHandler{dMgr.SetupUNILogicalPorts}})
khenaidoob9203542018-09-17 22:56:37 -0400145 transitionMap.transitions = append(transitionMap.transitions,
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530146 transition{ //DELETE PRE PROVISIONED State device forcefully
khenaidoo4554f7c2019-05-29 22:13:15 -0400147 deviceType: any,
khenaidood948f772021-08-11 17:49:24 -0400148 previousState: deviceState{Admin: voltha.AdminState_PREPROVISIONED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN, Transient: core.DeviceTransientState_ANY},
149 currentState: deviceState{Admin: voltha.AdminState_PREPROVISIONED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN, Transient: core.DeviceTransientState_FORCE_DELETING},
Kent Hagerman6031aad2020-07-29 16:36:33 -0400150 handlers: []transitionHandler{dMgr.RunPostDeviceDelete}})
khenaidoo4554f7c2019-05-29 22:13:15 -0400151 transitionMap.transitions = append(transitionMap.transitions,
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530152 transition{ // DELETE PRE PROVISIONED State device no force option set
153 deviceType: any,
khenaidood948f772021-08-11 17:49:24 -0400154 previousState: deviceState{Admin: voltha.AdminState_PREPROVISIONED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN, Transient: core.DeviceTransientState_ANY},
155 currentState: deviceState{Admin: voltha.AdminState_PREPROVISIONED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN, Transient: core.DeviceTransientState_DELETING_POST_ADAPTER_RESPONSE},
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530156 handlers: []transitionHandler{dMgr.RunPostDeviceDelete}})
157 transitionMap.transitions = append(transitionMap.transitions,
158 transition{ //DELETE device forcefully
khenaidoo4d4802d2018-10-04 21:59:49 -0400159 deviceType: parent,
khenaidood948f772021-08-11 17:49:24 -0400160 previousState: deviceState{Admin: voltha.AdminState_UNKNOWN, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN, Transient: core.DeviceTransientState_ANY},
161 currentState: deviceState{Admin: voltha.AdminState_UNKNOWN, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN, Transient: core.DeviceTransientState_FORCE_DELETING},
Andrea Campanella832cff62021-11-05 17:05:18 +0100162 handlers: []transitionHandler{dMgr.DeleteAllLogicalPorts, dMgr.DeleteAllChildDevices, dMgr.DeleteAllLogicalMeters, dMgr.RunPostDeviceDelete}})
khenaidoo0a822f92019-05-08 15:15:57 -0400163 transitionMap.transitions = append(transitionMap.transitions,
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530164 transition{ //DELETE device after adapter response
165 deviceType: parent,
khenaidood948f772021-08-11 17:49:24 -0400166 previousState: deviceState{Admin: voltha.AdminState_UNKNOWN, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN, Transient: core.DeviceTransientState_ANY},
167 currentState: deviceState{Admin: voltha.AdminState_UNKNOWN, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN, Transient: core.DeviceTransientState_DELETING_POST_ADAPTER_RESPONSE},
Andrea Campanella832cff62021-11-05 17:05:18 +0100168 handlers: []transitionHandler{dMgr.DeleteAllLogicalPorts, dMgr.DeleteAllChildDevices, dMgr.DeleteAllLogicalMeters, dMgr.RunPostDeviceDelete}})
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530169 transitionMap.transitions = append(transitionMap.transitions,
170 transition{ //DELETE no operation transition
171 deviceType: parent,
khenaidood948f772021-08-11 17:49:24 -0400172 previousState: deviceState{Admin: voltha.AdminState_UNKNOWN, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN, Transient: core.DeviceTransientState_ANY},
173 currentState: deviceState{Admin: voltha.AdminState_UNKNOWN, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN, Transient: core.DeviceTransientState_DELETING_FROM_ADAPTER},
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530174 handlers: []transitionHandler{}})
175 transitionMap.transitions = append(transitionMap.transitions,
Kent Hagerman6031aad2020-07-29 16:36:33 -0400176 transition{
Girish Gowdra408cd962020-03-11 14:31:31 -0700177 deviceType: parent,
khenaidood948f772021-08-11 17:49:24 -0400178 previousState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_REACHABLE, Operational: voltha.OperStatus_ACTIVE, Transient: core.DeviceTransientState_NONE},
179 currentState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNREACHABLE, Operational: voltha.OperStatus_UNKNOWN, Transient: core.DeviceTransientState_NONE},
Abhilash Laxmeshwar723ed742022-06-01 12:24:18 +0530180 handlers: []transitionHandler{}})
181 transitionMap.transitions = append(transitionMap.transitions,
182 transition{
183 deviceType: parent,
184 previousState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNREACHABLE, Operational: voltha.OperStatus_UNKNOWN, Transient: core.DeviceTransientState_NONE},
185 currentState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_REACHABLE, Operational: voltha.OperStatus_REBOOTED, Transient: core.DeviceTransientState_NONE},
Andrea Campanella832cff62021-11-05 17:05:18 +0100186 handlers: []transitionHandler{dMgr.DeleteAllLogicalPorts, dMgr.DeleteAllChildDevices, dMgr.DeleteAllLogicalMeters, dMgr.DeleteLogicalDevice, dMgr.DeleteAllDeviceFlows}})
Girish Gowdra408cd962020-03-11 14:31:31 -0700187 transitionMap.transitions = append(transitionMap.transitions,
Kent Hagerman6031aad2020-07-29 16:36:33 -0400188 transition{
Girish Gowdra408cd962020-03-11 14:31:31 -0700189 deviceType: parent,
khenaidood948f772021-08-11 17:49:24 -0400190 previousState: deviceState{Admin: voltha.AdminState_DISABLED, Connection: voltha.ConnectStatus_REACHABLE, Operational: voltha.OperStatus_UNKNOWN, Transient: core.DeviceTransientState_NONE},
191 currentState: deviceState{Admin: voltha.AdminState_DISABLED, Connection: voltha.ConnectStatus_UNREACHABLE, Operational: voltha.OperStatus_UNKNOWN, Transient: core.DeviceTransientState_NONE},
Abhilash Laxmeshwar723ed742022-06-01 12:24:18 +0530192 handlers: []transitionHandler{}})
Chaitrashree G S7849b322020-03-29 19:25:49 -0400193 transitionMap.transitions = append(transitionMap.transitions,
Kent Hagerman6031aad2020-07-29 16:36:33 -0400194 transition{
Chaitrashree G S7849b322020-03-29 19:25:49 -0400195 deviceType: parent,
khenaidood948f772021-08-11 17:49:24 -0400196 previousState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNREACHABLE, Operational: voltha.OperStatus_UNKNOWN, Transient: core.DeviceTransientState_NONE},
197 currentState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_REACHABLE, Operational: voltha.OperStatus_ACTIVE, Transient: core.DeviceTransientState_NONE},
Kent Hagerman6031aad2020-07-29 16:36:33 -0400198 handlers: []transitionHandler{dMgr.CreateLogicalDevice}})
Girish Gowdra408cd962020-03-11 14:31:31 -0700199 transitionMap.transitions = append(transitionMap.transitions,
Kent Hagerman6031aad2020-07-29 16:36:33 -0400200 transition{
Chaitrashree G S7849b322020-03-29 19:25:49 -0400201 deviceType: parent,
khenaidood948f772021-08-11 17:49:24 -0400202 previousState: deviceState{Admin: voltha.AdminState_DISABLED, Connection: voltha.ConnectStatus_UNREACHABLE, Operational: voltha.OperStatus_UNKNOWN, Transient: core.DeviceTransientState_NONE},
203 currentState: deviceState{Admin: voltha.AdminState_DISABLED, Connection: voltha.ConnectStatus_REACHABLE, Operational: voltha.OperStatus_UNKNOWN, Transient: core.DeviceTransientState_NONE},
Kent Hagerman6031aad2020-07-29 16:36:33 -0400204 handlers: []transitionHandler{dMgr.CreateLogicalDevice}})
Chaitrashree G S7849b322020-03-29 19:25:49 -0400205 transitionMap.transitions = append(transitionMap.transitions,
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530206 transition{ //DELETE force case
khenaidoo0a822f92019-05-08 15:15:57 -0400207 deviceType: child,
khenaidood948f772021-08-11 17:49:24 -0400208 previousState: deviceState{Admin: voltha.AdminState_UNKNOWN, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN, Transient: core.DeviceTransientState_ANY},
209 currentState: deviceState{Admin: voltha.AdminState_UNKNOWN, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN, Transient: core.DeviceTransientState_FORCE_DELETING},
Elia Battiston509fdc72022-01-04 13:28:09 +0100210 handlers: []transitionHandler{dMgr.DeleteAllDeviceFlows, dMgr.ChildDeviceLost, dMgr.DeleteLogicalPorts, dMgr.RunPostDeviceDelete}})
Chaitrashree G S543df3e2020-02-24 22:36:54 -0500211 transitionMap.transitions = append(transitionMap.transitions,
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530212 transition{ //DELETE after adapter response case
Chaitrashree G S543df3e2020-02-24 22:36:54 -0500213 deviceType: child,
khenaidood948f772021-08-11 17:49:24 -0400214 previousState: deviceState{Admin: voltha.AdminState_UNKNOWN, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN, Transient: core.DeviceTransientState_ANY},
215 currentState: deviceState{Admin: voltha.AdminState_UNKNOWN, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN, Transient: core.DeviceTransientState_DELETING_POST_ADAPTER_RESPONSE},
Elia Battiston509fdc72022-01-04 13:28:09 +0100216 handlers: []transitionHandler{dMgr.DeleteAllDeviceFlows, dMgr.ChildDeviceLost, dMgr.DeleteLogicalPorts, dMgr.RunPostDeviceDelete}})
khenaidoob9203542018-09-17 22:56:37 -0400217 transitionMap.transitions = append(transitionMap.transitions,
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530218 transition{ //DELETE wait for adapter response(no operation)
219 deviceType: child,
khenaidood948f772021-08-11 17:49:24 -0400220 previousState: deviceState{Admin: voltha.AdminState_UNKNOWN, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN, Transient: core.DeviceTransientState_ANY},
221 currentState: deviceState{Admin: voltha.AdminState_UNKNOWN, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN, Transient: core.DeviceTransientState_DELETING_FROM_ADAPTER},
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530222 handlers: []transitionHandler{}})
223 transitionMap.transitions = append(transitionMap.transitions,
Kent Hagerman6031aad2020-07-29 16:36:33 -0400224 transition{
khenaidoob9203542018-09-17 22:56:37 -0400225 deviceType: any,
khenaidood948f772021-08-11 17:49:24 -0400226 previousState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_ACTIVE, Transient: core.DeviceTransientState_NONE},
227 currentState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_ACTIVATING, Transient: core.DeviceTransientState_NONE},
Kent Hagerman6031aad2020-07-29 16:36:33 -0400228 handlers: []transitionHandler{dMgr.NotifyInvalidTransition}})
khenaidoo59ef7be2019-06-21 12:40:28 -0400229 transitionMap.transitions = append(transitionMap.transitions,
Kent Hagerman6031aad2020-07-29 16:36:33 -0400230 transition{
khenaidoo59ef7be2019-06-21 12:40:28 -0400231 deviceType: any,
khenaidood948f772021-08-11 17:49:24 -0400232 previousState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_ACTIVATING, Transient: core.DeviceTransientState_NONE},
233 currentState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN, Transient: core.DeviceTransientState_NONE},
Kent Hagerman6031aad2020-07-29 16:36:33 -0400234 handlers: []transitionHandler{dMgr.NotifyInvalidTransition}})
khenaidoo59ef7be2019-06-21 12:40:28 -0400235 transitionMap.transitions = append(transitionMap.transitions,
Kent Hagerman6031aad2020-07-29 16:36:33 -0400236 transition{
khenaidoo59ef7be2019-06-21 12:40:28 -0400237 deviceType: any,
khenaidood948f772021-08-11 17:49:24 -0400238 previousState: deviceState{Admin: voltha.AdminState_PREPROVISIONED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN, Transient: core.DeviceTransientState_NONE},
239 currentState: deviceState{Admin: voltha.AdminState_UNKNOWN, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN, Transient: core.DeviceTransientState_NONE},
Kent Hagerman6031aad2020-07-29 16:36:33 -0400240 handlers: []transitionHandler{dMgr.NotifyInvalidTransition}})
khenaidoo59ef7be2019-06-21 12:40:28 -0400241 transitionMap.transitions = append(transitionMap.transitions,
Kent Hagerman6031aad2020-07-29 16:36:33 -0400242 transition{
Andrea Campanella3614a922021-02-25 12:40:42 +0100243 deviceType: child,
khenaidood948f772021-08-11 17:49:24 -0400244 previousState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_REACHABLE, Operational: voltha.OperStatus_UNKNOWN, Transient: core.DeviceTransientState_NONE},
245 currentState: deviceState{Admin: voltha.AdminState_DOWNLOADING_IMAGE, Connection: voltha.ConnectStatus_REACHABLE, Operational: voltha.OperStatus_UNKNOWN, Transient: core.DeviceTransientState_NONE},
Andrea Campanella3614a922021-02-25 12:40:42 +0100246 handlers: []transitionHandler{}})
247 transitionMap.transitions = append(transitionMap.transitions,
248 transition{
249 deviceType: child,
khenaidood948f772021-08-11 17:49:24 -0400250 previousState: deviceState{Admin: voltha.AdminState_DOWNLOADING_IMAGE, Connection: voltha.ConnectStatus_REACHABLE, Operational: voltha.OperStatus_UNKNOWN, Transient: core.DeviceTransientState_NONE},
251 currentState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_REACHABLE, Operational: voltha.OperStatus_UNKNOWN, Transient: core.DeviceTransientState_NONE},
Andrea Campanella3614a922021-02-25 12:40:42 +0100252 handlers: []transitionHandler{}})
253 transitionMap.transitions = append(transitionMap.transitions,
254 transition{
khenaidoo59ef7be2019-06-21 12:40:28 -0400255 deviceType: any,
khenaidood948f772021-08-11 17:49:24 -0400256 previousState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN, Transient: core.DeviceTransientState_NONE},
257 currentState: deviceState{Admin: voltha.AdminState_UNKNOWN, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN, Transient: core.DeviceTransientState_NONE},
Kent Hagerman6031aad2020-07-29 16:36:33 -0400258 handlers: []transitionHandler{dMgr.NotifyInvalidTransition}})
khenaidoo59ef7be2019-06-21 12:40:28 -0400259 transitionMap.transitions = append(transitionMap.transitions,
Kent Hagerman6031aad2020-07-29 16:36:33 -0400260 transition{
khenaidoo59ef7be2019-06-21 12:40:28 -0400261 deviceType: parent,
khenaidood948f772021-08-11 17:49:24 -0400262 previousState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_ACTIVE, Transient: core.DeviceTransientState_NONE},
263 currentState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_ACTIVATING, Transient: core.DeviceTransientState_NONE},
Kent Hagerman6031aad2020-07-29 16:36:33 -0400264 handlers: []transitionHandler{dMgr.NotifyInvalidTransition}})
khenaidoo59ef7be2019-06-21 12:40:28 -0400265 transitionMap.transitions = append(transitionMap.transitions,
Kent Hagerman6031aad2020-07-29 16:36:33 -0400266 transition{
khenaidoo59ef7be2019-06-21 12:40:28 -0400267 deviceType: any,
khenaidood948f772021-08-11 17:49:24 -0400268 previousState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_ACTIVATING, Transient: core.DeviceTransientState_NONE},
269 currentState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN, Transient: core.DeviceTransientState_NONE},
Kent Hagerman6031aad2020-07-29 16:36:33 -0400270 handlers: []transitionHandler{dMgr.NotifyInvalidTransition}})
khenaidoo59ef7be2019-06-21 12:40:28 -0400271 transitionMap.transitions = append(transitionMap.transitions,
Kent Hagerman6031aad2020-07-29 16:36:33 -0400272 transition{
khenaidoo59ef7be2019-06-21 12:40:28 -0400273 deviceType: any,
khenaidood948f772021-08-11 17:49:24 -0400274 previousState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN, Transient: core.DeviceTransientState_NONE},
275 currentState: deviceState{Admin: voltha.AdminState_PREPROVISIONED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN, Transient: core.DeviceTransientState_NONE},
Kent Hagerman6031aad2020-07-29 16:36:33 -0400276 handlers: []transitionHandler{dMgr.NotifyInvalidTransition}})
khenaidoo59ef7be2019-06-21 12:40:28 -0400277 transitionMap.transitions = append(transitionMap.transitions,
Kent Hagerman6031aad2020-07-29 16:36:33 -0400278 transition{
khenaidoo59ef7be2019-06-21 12:40:28 -0400279 deviceType: child,
khenaidood948f772021-08-11 17:49:24 -0400280 previousState: deviceState{Admin: voltha.AdminState_DISABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN, Transient: core.DeviceTransientState_NONE},
281 currentState: deviceState{Admin: voltha.AdminState_UNKNOWN, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN, Transient: core.DeviceTransientState_NONE},
Kent Hagerman6031aad2020-07-29 16:36:33 -0400282 handlers: []transitionHandler{dMgr.NotifyInvalidTransition}})
khenaidoo59ef7be2019-06-21 12:40:28 -0400283 transitionMap.transitions = append(transitionMap.transitions,
Kent Hagerman6031aad2020-07-29 16:36:33 -0400284 transition{
khenaidoo59ef7be2019-06-21 12:40:28 -0400285 deviceType: any,
khenaidood948f772021-08-11 17:49:24 -0400286 previousState: deviceState{Admin: voltha.AdminState_DISABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN, Transient: core.DeviceTransientState_NONE},
287 currentState: deviceState{Admin: voltha.AdminState_PREPROVISIONED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN, Transient: core.DeviceTransientState_NONE},
Kent Hagerman6031aad2020-07-29 16:36:33 -0400288 handlers: []transitionHandler{dMgr.NotifyInvalidTransition}})
Maninder0aabf0c2021-03-17 14:55:14 +0530289 transitionMap.transitions = append(transitionMap.transitions,
290 transition{
291 deviceType: any,
khenaidood948f772021-08-11 17:49:24 -0400292 previousState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN, Transient: core.DeviceTransientState_RECONCILE_IN_PROGRESS},
293 currentState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_RECONCILING, Transient: core.DeviceTransientState_RECONCILE_IN_PROGRESS},
Maninder0aabf0c2021-03-17 14:55:14 +0530294 handlers: []transitionHandler{}})
295 transitionMap.transitions = append(transitionMap.transitions,
296 transition{
297 deviceType: any,
khenaidood948f772021-08-11 17:49:24 -0400298 previousState: deviceState{Admin: voltha.AdminState_DISABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN, Transient: core.DeviceTransientState_RECONCILE_IN_PROGRESS},
299 currentState: deviceState{Admin: voltha.AdminState_DISABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_RECONCILING, Transient: core.DeviceTransientState_RECONCILE_IN_PROGRESS},
Maninder0aabf0c2021-03-17 14:55:14 +0530300 handlers: []transitionHandler{}})
301 transitionMap.transitions = append(transitionMap.transitions,
302 transition{
303 deviceType: any,
khenaidood948f772021-08-11 17:49:24 -0400304 previousState: deviceState{Admin: voltha.AdminState_PREPROVISIONED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN, Transient: core.DeviceTransientState_RECONCILE_IN_PROGRESS},
305 currentState: deviceState{Admin: voltha.AdminState_PREPROVISIONED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_RECONCILING, Transient: core.DeviceTransientState_RECONCILE_IN_PROGRESS},
Maninder0aabf0c2021-03-17 14:55:14 +0530306 handlers: []transitionHandler{}})
307 transitionMap.transitions = append(transitionMap.transitions,
308 transition{
309 deviceType: any,
khenaidood948f772021-08-11 17:49:24 -0400310 previousState: deviceState{Admin: voltha.AdminState_DOWNLOADING_IMAGE, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN, Transient: core.DeviceTransientState_RECONCILE_IN_PROGRESS},
311 currentState: deviceState{Admin: voltha.AdminState_DOWNLOADING_IMAGE, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_RECONCILING, Transient: core.DeviceTransientState_RECONCILE_IN_PROGRESS},
Maninder0aabf0c2021-03-17 14:55:14 +0530312 handlers: []transitionHandler{}})
313 transitionMap.transitions = append(transitionMap.transitions,
314 transition{
315 deviceType: any,
khenaidood948f772021-08-11 17:49:24 -0400316 previousState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_RECONCILING, Transient: core.DeviceTransientState_RECONCILE_IN_PROGRESS},
317 currentState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_REACHABLE, Operational: voltha.OperStatus_ACTIVE, Transient: core.DeviceTransientState_RECONCILE_IN_PROGRESS},
Maninder0aabf0c2021-03-17 14:55:14 +0530318 handlers: []transitionHandler{dMgr.ReconcilingCleanup}})
319 transitionMap.transitions = append(transitionMap.transitions,
320 transition{
321 deviceType: any,
khenaidood948f772021-08-11 17:49:24 -0400322 previousState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_RECONCILING, Transient: core.DeviceTransientState_RECONCILE_IN_PROGRESS},
323 currentState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNREACHABLE, Operational: voltha.OperStatus_UNKNOWN, Transient: core.DeviceTransientState_RECONCILE_IN_PROGRESS},
Maninder0aabf0c2021-03-17 14:55:14 +0530324 handlers: []transitionHandler{dMgr.ReconcilingCleanup}})
325 transitionMap.transitions = append(transitionMap.transitions,
326 transition{
327 deviceType: any,
khenaidood948f772021-08-11 17:49:24 -0400328 previousState: deviceState{Admin: voltha.AdminState_DISABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_RECONCILING, Transient: core.DeviceTransientState_RECONCILE_IN_PROGRESS},
329 currentState: deviceState{Admin: voltha.AdminState_DISABLED, Connection: voltha.ConnectStatus_UNREACHABLE, Operational: voltha.OperStatus_UNKNOWN, Transient: core.DeviceTransientState_RECONCILE_IN_PROGRESS},
Maninder0aabf0c2021-03-17 14:55:14 +0530330 handlers: []transitionHandler{dMgr.ReconcilingCleanup}})
331 transitionMap.transitions = append(transitionMap.transitions,
332 transition{
333 deviceType: any,
khenaidood948f772021-08-11 17:49:24 -0400334 previousState: deviceState{Admin: voltha.AdminState_DOWNLOADING_IMAGE, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_RECONCILING, Transient: core.DeviceTransientState_RECONCILE_IN_PROGRESS},
335 currentState: deviceState{Admin: voltha.AdminState_DOWNLOADING_IMAGE, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN, Transient: core.DeviceTransientState_RECONCILE_IN_PROGRESS},
Maninder0aabf0c2021-03-17 14:55:14 +0530336 handlers: []transitionHandler{dMgr.ReconcilingCleanup}})
Maninder581cf4b2021-06-16 22:42:07 +0530337 transitionMap.transitions = append(transitionMap.transitions,
338 transition{
339 deviceType: any,
khenaidood948f772021-08-11 17:49:24 -0400340 previousState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_RECONCILING, Transient: core.DeviceTransientState_RECONCILE_IN_PROGRESS},
341 currentState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_RECONCILING_FAILED, Transient: core.DeviceTransientState_RECONCILE_IN_PROGRESS},
Maninder581cf4b2021-06-16 22:42:07 +0530342 handlers: []transitionHandler{dMgr.ReconcilingCleanup}})
343 transitionMap.transitions = append(transitionMap.transitions,
344 transition{
345 deviceType: any,
khenaidood948f772021-08-11 17:49:24 -0400346 previousState: deviceState{Admin: voltha.AdminState_DISABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_RECONCILING, Transient: core.DeviceTransientState_RECONCILE_IN_PROGRESS},
347 currentState: deviceState{Admin: voltha.AdminState_DISABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_RECONCILING_FAILED, Transient: core.DeviceTransientState_RECONCILE_IN_PROGRESS},
Maninder581cf4b2021-06-16 22:42:07 +0530348 handlers: []transitionHandler{dMgr.ReconcilingCleanup}})
349 transitionMap.transitions = append(transitionMap.transitions,
350 transition{
351 deviceType: any,
khenaidood948f772021-08-11 17:49:24 -0400352 previousState: deviceState{Admin: voltha.AdminState_DOWNLOADING_IMAGE, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_RECONCILING, Transient: core.DeviceTransientState_RECONCILE_IN_PROGRESS},
353 currentState: deviceState{Admin: voltha.AdminState_DOWNLOADING_IMAGE, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_RECONCILING_FAILED, Transient: core.DeviceTransientState_RECONCILE_IN_PROGRESS},
Maninder581cf4b2021-06-16 22:42:07 +0530354 handlers: []transitionHandler{dMgr.ReconcilingCleanup}})
khenaidoob9203542018-09-17 22:56:37 -0400355
356 return &transitionMap
357}
358
khenaidood948f772021-08-11 17:49:24 -0400359func getDeviceStates(device *voltha.Device, transientState core.DeviceTransientState_Types) deviceState {
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530360 return deviceState{Admin: device.AdminState, Connection: device.ConnectStatus, Operational: device.OperStatus,
361 Transient: transientState}
khenaidoob9203542018-09-17 22:56:37 -0400362}
363
364// 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 -0400365func getHandler(previous deviceState, current deviceState, transition *transition) ([]transitionHandler, *match) {
khenaidoo442e7c72020-03-10 16:13:48 -0400366 m := &match{}
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530367 var waitForOtherStatesMatch bool
khenaidoob9203542018-09-17 22:56:37 -0400368 // Do we have an exact match?
Kent Hagerman6031aad2020-07-29 16:36:33 -0400369 if previous == transition.previousState && current == transition.currentState {
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530370 return transition.handlers, &match{admin: currPrevStateMatch, oper: currPrevStateMatch, conn: currPrevStateMatch,
371 transient: currPrevStateMatch}
372 }
373 // Do we have transient state match?
khenaidood948f772021-08-11 17:49:24 -0400374 if current.Transient == transition.currentState.Transient && transition.currentState.Transient != core.DeviceTransientState_ANY {
375 if previous.Transient == transition.previousState.Transient || transition.previousState.Transient == core.DeviceTransientState_ANY {
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530376 m.transient = currPrevStateMatch
377 } else {
378 m.transient = currStateOnlyMatch
379 }
khenaidood948f772021-08-11 17:49:24 -0400380 } else if current.Transient == transition.currentState.Transient && transition.currentState.Transient == core.DeviceTransientState_ANY {
381 if previous.Transient == transition.previousState.Transient || transition.previousState.Transient == core.DeviceTransientState_ANY {
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530382 m.transient = currWildcardMatch
383 }
384 }
385 if m.transient == noMatch {
386 return nil, m
khenaidoob9203542018-09-17 22:56:37 -0400387 }
khenaidoo0a822f92019-05-08 15:15:57 -0400388
khenaidoo442e7c72020-03-10 16:13:48 -0400389 // Do we have Admin state match?
390 if current.Admin == transition.currentState.Admin && transition.currentState.Admin != voltha.AdminState_UNKNOWN {
391 if previous.Admin == transition.previousState.Admin {
392 m.admin = currPrevStateMatch
393 } else if transition.previousState.Admin == voltha.AdminState_UNKNOWN {
394 m.admin = currStateOnlyMatch
395 }
396 } else if current.Admin == transition.currentState.Admin && transition.currentState.Admin == voltha.AdminState_UNKNOWN {
397 if previous.Admin == transition.previousState.Admin || transition.previousState.Admin == voltha.AdminState_UNKNOWN {
398 m.admin = currWildcardMatch
399 }
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530400 } else if transition.previousState.Admin == voltha.AdminState_UNKNOWN && transition.currentState.Admin == voltha.AdminState_UNKNOWN {
401 // Will only be the case of DELETION currently.(to allow only transient match, we can avoid this check if
402 // we can allow wild card in admin state)
403 waitForOtherStatesMatch = true
khenaidoo442e7c72020-03-10 16:13:48 -0400404 }
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530405 if !waitForOtherStatesMatch && m.admin == noMatch {
khenaidoo442e7c72020-03-10 16:13:48 -0400406 return nil, m
khenaidoo0a822f92019-05-08 15:15:57 -0400407 }
khenaidoo442e7c72020-03-10 16:13:48 -0400408 // Do we have an operational state match?
409 if current.Operational == transition.currentState.Operational && transition.previousState.Operational != voltha.OperStatus_UNKNOWN {
410 if previous.Operational == transition.previousState.Operational || transition.previousState.Operational == voltha.OperStatus_UNKNOWN {
411 m.oper = currPrevStateMatch
412 } else {
413 m.oper = currStateOnlyMatch
414 }
415 } else if current.Operational == transition.currentState.Operational && transition.previousState.Operational == voltha.OperStatus_UNKNOWN {
416 if previous.Operational == transition.previousState.Operational || transition.previousState.Operational == voltha.OperStatus_UNKNOWN {
417 m.oper = currWildcardMatch
khenaidoob9203542018-09-17 22:56:37 -0400418 }
419 }
khenaidoo442e7c72020-03-10 16:13:48 -0400420
421 // Do we have an connection state match?
422 if current.Connection == transition.currentState.Connection && transition.previousState.Connection != voltha.ConnectStatus_UNKNOWN {
423 if previous.Connection == transition.previousState.Connection || transition.previousState.Connection == voltha.ConnectStatus_UNKNOWN {
424 m.conn = currPrevStateMatch
425 } else {
426 m.conn = currStateOnlyMatch
427 }
428 } else if current.Connection == transition.currentState.Connection && transition.previousState.Connection == voltha.ConnectStatus_UNKNOWN {
429 if previous.Connection == transition.previousState.Connection || transition.previousState.Connection == voltha.ConnectStatus_UNKNOWN {
430 m.conn = currWildcardMatch
khenaidoob9203542018-09-17 22:56:37 -0400431 }
432 }
khenaidoo442e7c72020-03-10 16:13:48 -0400433 return transition.handlers, m
khenaidoob9203542018-09-17 22:56:37 -0400434}
435
Kent Hagerman6031aad2020-07-29 16:36:33 -0400436// getTransitionHandler returns transition handler & a flag that's set if the transition is invalid
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530437func (tMap *TransitionMap) getTransitionHandler(ctx context.Context, cDevice, pDevice *voltha.Device,
khenaidood948f772021-08-11 17:49:24 -0400438 cTransientState, pTransientState core.DeviceTransientState_Types) []transitionHandler {
khenaidoob9203542018-09-17 22:56:37 -0400439 //1. Get the previous and current set of states
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530440 cState := getDeviceStates(cDevice, cTransientState)
441 pState := getDeviceStates(pDevice, pTransientState)
khenaidoo442e7c72020-03-10 16:13:48 -0400442
443 // Do nothing is there are no states change
Kent Hagerman6031aad2020-07-29 16:36:33 -0400444 if pState == cState {
khenaidoo442e7c72020-03-10 16:13:48 -0400445 return nil
446 }
447
Rohan Agrawal31f21802020-06-12 05:38:46 +0000448 //logger.Infow(ctx, "deviceType", log.Fields{"device": pDevice})
khenaidoob9203542018-09-17 22:56:37 -0400449 deviceType := parent
Kent Hagerman6031aad2020-07-29 16:36:33 -0400450 if !cDevice.Root {
Rohan Agrawal31f21802020-06-12 05:38:46 +0000451 logger.Info(ctx, "device is child")
khenaidoob9203542018-09-17 22:56:37 -0400452 deviceType = child
453 }
Kent Hagerman6031aad2020-07-29 16:36:33 -0400454 logger.Infof(ctx, "deviceType:%d-deviceId:%s-previous:%v-current:%v", deviceType, cDevice.Id, pState, cState)
khenaidoob9203542018-09-17 22:56:37 -0400455
456 //2. Go over transition array to get the right transition
Kent Hagerman6031aad2020-07-29 16:36:33 -0400457 var currentMatch []transitionHandler
458 var tempHandler []transitionHandler
khenaidoo442e7c72020-03-10 16:13:48 -0400459 var m *match
460 bestMatch := &match{}
Andrey Pozolotin34dd63f2021-05-31 21:26:40 +0300461 for i := range tMap.transitions {
khenaidoob9203542018-09-17 22:56:37 -0400462 // consider transition only if it matches deviceType or is a wild card - any
Andrey Pozolotin34dd63f2021-05-31 21:26:40 +0300463 if tMap.transitions[i].deviceType != deviceType && tMap.transitions[i].deviceType != any {
khenaidoob9203542018-09-17 22:56:37 -0400464 continue
465 }
Andrey Pozolotin34dd63f2021-05-31 21:26:40 +0300466 tempHandler, m = getHandler(pState, cState, &tMap.transitions[i])
khenaidoob9203542018-09-17 22:56:37 -0400467 if tempHandler != nil {
Andrey Pozolotin34dd63f2021-05-31 21:26:40 +0300468 if m.isExactMatch() && tMap.transitions[i].deviceType == deviceType {
khenaidoob9203542018-09-17 22:56:37 -0400469 return tempHandler
khenaidoo442e7c72020-03-10 16:13:48 -0400470 } else if m.isExactMatch() || m.isBetterMatch(bestMatch) {
khenaidoo0a822f92019-05-08 15:15:57 -0400471 currentMatch = tempHandler
khenaidoo442e7c72020-03-10 16:13:48 -0400472 bestMatch = m
khenaidoob9203542018-09-17 22:56:37 -0400473 }
474 }
475 }
476 return currentMatch
477}
Kent Hagerman6031aad2020-07-29 16:36:33 -0400478
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530479func (tMap *TransitionMap) ProcessTransition(ctx context.Context, device, prevDevice *voltha.Device,
khenaidood948f772021-08-11 17:49:24 -0400480 deviceTransientState, prevDeviceTransientState core.DeviceTransientState_Types) error {
Kent Hagerman6031aad2020-07-29 16:36:33 -0400481 // This will be triggered on every state update
482 logger.Debugw(ctx, "state-transition", log.Fields{
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530483 "device": device.Id,
484 "prev-admin-state": prevDevice.AdminState,
485 "prev-oper-state": prevDevice.OperStatus,
486 "prev-conn-state": prevDevice.ConnectStatus,
487 "curr-admin-state": device.AdminState,
488 "curr-oper-state": device.OperStatus,
489 "curr-conn-state": device.ConnectStatus,
490 "curr-transient-state": deviceTransientState,
491 "prev-transient-state": prevDeviceTransientState,
Kent Hagerman6031aad2020-07-29 16:36:33 -0400492 })
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530493 handlers := tMap.getTransitionHandler(ctx, device, prevDevice, deviceTransientState, prevDeviceTransientState)
Maninder0aabf0c2021-03-17 14:55:14 +0530494 if len(handlers) == 0 {
Kent Hagerman6031aad2020-07-29 16:36:33 -0400495 logger.Debugw(ctx, "no-op-transition", log.Fields{"deviceId": device.Id})
496 return nil
497 }
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530498 logger.Debugw(ctx, "handler-found", log.Fields{"num-expectedHandlers": len(handlers), "isParent": device.Root,
499 "current-data": device, "previous-data": prevDevice})
Kent Hagerman6031aad2020-07-29 16:36:33 -0400500 for _, handler := range handlers {
501 logger.Debugw(ctx, "running-handler", log.Fields{"handler": funcName(handler)})
502 if err := handler(ctx, device); err != nil {
503 logger.Warnw(ctx, "handler-failed", log.Fields{"handler": funcName(handler), "error": err})
504 return err
505 }
506 }
507 return nil
508}
509
510func funcName(f interface{}) string {
511 return runtime.FuncForPC(reflect.ValueOf(f).Pointer()).Name()
512}