blob: 80ac28e8c747f93f6f56a3322b80f6d18e3fb482 [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
104 DeleteAllDeviceFlows(ctx context.Context, curr *voltha.Device) error
Maninder0aabf0c2021-03-17 14:55:14 +0530105 ReconcilingCleanup(ctx context.Context, curr *voltha.Device) error
khenaidoob9203542018-09-17 22:56:37 -0400106}
107
npujar1d86a522019-11-14 17:11:16 +0530108// NewTransitionMap creates transition map
Kent Hagerman6031aad2020-07-29 16:36:33 -0400109func NewTransitionMap(dMgr DeviceManager) *TransitionMap {
khenaidoob9203542018-09-17 22:56:37 -0400110 var transitionMap TransitionMap
khenaidoo0a822f92019-05-08 15:15:57 -0400111 transitionMap.dMgr = dMgr
Kent Hagerman6031aad2020-07-29 16:36:33 -0400112 transitionMap.transitions = make([]transition, 0)
khenaidoo442e7c72020-03-10 16:13:48 -0400113 transitionMap.transitions = append(
114 transitionMap.transitions,
Kent Hagerman6031aad2020-07-29 16:36:33 -0400115 transition{
khenaidoob9203542018-09-17 22:56:37 -0400116 deviceType: parent,
khenaidood948f772021-08-11 17:49:24 -0400117 previousState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_ACTIVATING, Transient: core.DeviceTransientState_NONE},
118 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 -0400119 handlers: []transitionHandler{dMgr.CreateLogicalDevice}})
khenaidoo0a822f92019-05-08 15:15:57 -0400120 transitionMap.transitions = append(transitionMap.transitions,
Kent Hagerman6031aad2020-07-29 16:36:33 -0400121 transition{
khenaidoo59ef7be2019-06-21 12:40:28 -0400122 deviceType: child,
khenaidood948f772021-08-11 17:49:24 -0400123 previousState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_DISCOVERED, Transient: core.DeviceTransientState_NONE},
124 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 -0400125 handlers: []transitionHandler{}})
khenaidoo442e7c72020-03-10 16:13:48 -0400126 transitionMap.transitions = append(transitionMap.transitions,
Kent Hagerman6031aad2020-07-29 16:36:33 -0400127 transition{
khenaidoo442e7c72020-03-10 16:13:48 -0400128 deviceType: child,
khenaidood948f772021-08-11 17:49:24 -0400129 previousState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_DISCOVERED, Transient: core.DeviceTransientState_NONE},
130 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 -0400131 handlers: []transitionHandler{dMgr.SetupUNILogicalPorts}})
khenaidoob9203542018-09-17 22:56:37 -0400132 transitionMap.transitions = append(transitionMap.transitions,
Kent Hagerman6031aad2020-07-29 16:36:33 -0400133 transition{
khenaidoob9203542018-09-17 22:56:37 -0400134 deviceType: child,
khenaidood948f772021-08-11 17:49:24 -0400135 previousState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_ACTIVATING, Transient: core.DeviceTransientState_NONE},
136 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 -0400137 handlers: []transitionHandler{}})
khenaidoo442e7c72020-03-10 16:13:48 -0400138 transitionMap.transitions = append(transitionMap.transitions,
Kent Hagerman6031aad2020-07-29 16:36:33 -0400139 transition{
khenaidoo442e7c72020-03-10 16:13:48 -0400140 deviceType: child,
khenaidood948f772021-08-11 17:49:24 -0400141 previousState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_ACTIVATING, Transient: core.DeviceTransientState_NONE},
142 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 -0400143 handlers: []transitionHandler{dMgr.SetupUNILogicalPorts}})
khenaidoob9203542018-09-17 22:56:37 -0400144 transitionMap.transitions = append(transitionMap.transitions,
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530145 transition{ //DELETE PRE PROVISIONED State device forcefully
khenaidoo4554f7c2019-05-29 22:13:15 -0400146 deviceType: any,
khenaidood948f772021-08-11 17:49:24 -0400147 previousState: deviceState{Admin: voltha.AdminState_PREPROVISIONED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN, Transient: core.DeviceTransientState_ANY},
148 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 -0400149 handlers: []transitionHandler{dMgr.RunPostDeviceDelete}})
khenaidoo4554f7c2019-05-29 22:13:15 -0400150 transitionMap.transitions = append(transitionMap.transitions,
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530151 transition{ // DELETE PRE PROVISIONED State device no force option set
152 deviceType: any,
khenaidood948f772021-08-11 17:49:24 -0400153 previousState: deviceState{Admin: voltha.AdminState_PREPROVISIONED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN, Transient: core.DeviceTransientState_ANY},
154 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 +0530155 handlers: []transitionHandler{dMgr.RunPostDeviceDelete}})
156 transitionMap.transitions = append(transitionMap.transitions,
157 transition{ //DELETE device forcefully
khenaidoo4d4802d2018-10-04 21:59:49 -0400158 deviceType: parent,
khenaidood948f772021-08-11 17:49:24 -0400159 previousState: deviceState{Admin: voltha.AdminState_UNKNOWN, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN, Transient: core.DeviceTransientState_ANY},
160 currentState: deviceState{Admin: voltha.AdminState_UNKNOWN, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN, Transient: core.DeviceTransientState_FORCE_DELETING},
Kent Hagerman6031aad2020-07-29 16:36:33 -0400161 handlers: []transitionHandler{dMgr.DeleteAllLogicalPorts, dMgr.DeleteAllChildDevices, dMgr.DeleteLogicalDevice, dMgr.RunPostDeviceDelete}})
khenaidoo0a822f92019-05-08 15:15:57 -0400162 transitionMap.transitions = append(transitionMap.transitions,
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530163 transition{ //DELETE device after adapter response
164 deviceType: parent,
khenaidood948f772021-08-11 17:49:24 -0400165 previousState: deviceState{Admin: voltha.AdminState_UNKNOWN, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN, Transient: core.DeviceTransientState_ANY},
166 currentState: deviceState{Admin: voltha.AdminState_UNKNOWN, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN, Transient: core.DeviceTransientState_DELETING_POST_ADAPTER_RESPONSE},
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530167 handlers: []transitionHandler{dMgr.DeleteAllLogicalPorts, dMgr.DeleteAllChildDevices, dMgr.DeleteLogicalDevice, dMgr.RunPostDeviceDelete}})
168 transitionMap.transitions = append(transitionMap.transitions,
169 transition{ //DELETE no operation transition
170 deviceType: parent,
khenaidood948f772021-08-11 17:49:24 -0400171 previousState: deviceState{Admin: voltha.AdminState_UNKNOWN, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN, Transient: core.DeviceTransientState_ANY},
172 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 +0530173 handlers: []transitionHandler{}})
174 transitionMap.transitions = append(transitionMap.transitions,
Kent Hagerman6031aad2020-07-29 16:36:33 -0400175 transition{
Girish Gowdra408cd962020-03-11 14:31:31 -0700176 deviceType: parent,
khenaidood948f772021-08-11 17:49:24 -0400177 previousState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_REACHABLE, Operational: voltha.OperStatus_ACTIVE, Transient: core.DeviceTransientState_NONE},
178 currentState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNREACHABLE, Operational: voltha.OperStatus_UNKNOWN, Transient: core.DeviceTransientState_NONE},
Kent Hagerman6031aad2020-07-29 16:36:33 -0400179 handlers: []transitionHandler{dMgr.DeleteAllLogicalPorts, dMgr.DeleteAllChildDevices, dMgr.DeleteLogicalDevice, dMgr.DeleteAllDeviceFlows}})
Girish Gowdra408cd962020-03-11 14:31:31 -0700180 transitionMap.transitions = append(transitionMap.transitions,
Kent Hagerman6031aad2020-07-29 16:36:33 -0400181 transition{
Girish Gowdra408cd962020-03-11 14:31:31 -0700182 deviceType: parent,
khenaidood948f772021-08-11 17:49:24 -0400183 previousState: deviceState{Admin: voltha.AdminState_DISABLED, Connection: voltha.ConnectStatus_REACHABLE, Operational: voltha.OperStatus_UNKNOWN, Transient: core.DeviceTransientState_NONE},
184 currentState: deviceState{Admin: voltha.AdminState_DISABLED, Connection: voltha.ConnectStatus_UNREACHABLE, Operational: voltha.OperStatus_UNKNOWN, Transient: core.DeviceTransientState_NONE},
Kent Hagerman6031aad2020-07-29 16:36:33 -0400185 handlers: []transitionHandler{dMgr.DeleteAllLogicalPorts, dMgr.DeleteAllChildDevices, dMgr.DeleteLogicalDevice, dMgr.DeleteAllDeviceFlows}})
Chaitrashree G S7849b322020-03-29 19:25:49 -0400186 transitionMap.transitions = append(transitionMap.transitions,
Kent Hagerman6031aad2020-07-29 16:36:33 -0400187 transition{
Chaitrashree G S7849b322020-03-29 19:25:49 -0400188 deviceType: parent,
khenaidood948f772021-08-11 17:49:24 -0400189 previousState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNREACHABLE, Operational: voltha.OperStatus_UNKNOWN, Transient: core.DeviceTransientState_NONE},
190 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 -0400191 handlers: []transitionHandler{dMgr.CreateLogicalDevice}})
Girish Gowdra408cd962020-03-11 14:31:31 -0700192 transitionMap.transitions = append(transitionMap.transitions,
Kent Hagerman6031aad2020-07-29 16:36:33 -0400193 transition{
Chaitrashree G S7849b322020-03-29 19:25:49 -0400194 deviceType: parent,
khenaidood948f772021-08-11 17:49:24 -0400195 previousState: deviceState{Admin: voltha.AdminState_DISABLED, Connection: voltha.ConnectStatus_UNREACHABLE, Operational: voltha.OperStatus_UNKNOWN, Transient: core.DeviceTransientState_NONE},
196 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 -0400197 handlers: []transitionHandler{dMgr.CreateLogicalDevice}})
Chaitrashree G S7849b322020-03-29 19:25:49 -0400198 transitionMap.transitions = append(transitionMap.transitions,
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530199 transition{ //DELETE force case
khenaidoo0a822f92019-05-08 15:15:57 -0400200 deviceType: child,
khenaidood948f772021-08-11 17:49:24 -0400201 previousState: deviceState{Admin: voltha.AdminState_UNKNOWN, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN, Transient: core.DeviceTransientState_ANY},
202 currentState: deviceState{Admin: voltha.AdminState_UNKNOWN, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN, Transient: core.DeviceTransientState_FORCE_DELETING},
Kent Hagerman6031aad2020-07-29 16:36:33 -0400203 handlers: []transitionHandler{dMgr.ChildDeviceLost, dMgr.DeleteLogicalPorts, dMgr.RunPostDeviceDelete}})
Chaitrashree G S543df3e2020-02-24 22:36:54 -0500204 transitionMap.transitions = append(transitionMap.transitions,
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530205 transition{ //DELETE after adapter response case
Chaitrashree G S543df3e2020-02-24 22:36:54 -0500206 deviceType: child,
khenaidood948f772021-08-11 17:49:24 -0400207 previousState: deviceState{Admin: voltha.AdminState_UNKNOWN, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN, Transient: core.DeviceTransientState_ANY},
208 currentState: deviceState{Admin: voltha.AdminState_UNKNOWN, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN, Transient: core.DeviceTransientState_DELETING_POST_ADAPTER_RESPONSE},
Kent Hagerman6031aad2020-07-29 16:36:33 -0400209 handlers: []transitionHandler{dMgr.ChildDeviceLost, dMgr.DeleteLogicalPorts, dMgr.RunPostDeviceDelete}})
khenaidoob9203542018-09-17 22:56:37 -0400210 transitionMap.transitions = append(transitionMap.transitions,
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530211 transition{ //DELETE wait for adapter response(no operation)
212 deviceType: child,
khenaidood948f772021-08-11 17:49:24 -0400213 previousState: deviceState{Admin: voltha.AdminState_UNKNOWN, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN, Transient: core.DeviceTransientState_ANY},
214 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 +0530215 handlers: []transitionHandler{}})
216 transitionMap.transitions = append(transitionMap.transitions,
Kent Hagerman6031aad2020-07-29 16:36:33 -0400217 transition{
khenaidoob9203542018-09-17 22:56:37 -0400218 deviceType: any,
khenaidood948f772021-08-11 17:49:24 -0400219 previousState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_ACTIVE, Transient: core.DeviceTransientState_NONE},
220 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 -0400221 handlers: []transitionHandler{dMgr.NotifyInvalidTransition}})
khenaidoo59ef7be2019-06-21 12:40:28 -0400222 transitionMap.transitions = append(transitionMap.transitions,
Kent Hagerman6031aad2020-07-29 16:36:33 -0400223 transition{
khenaidoo59ef7be2019-06-21 12:40:28 -0400224 deviceType: any,
khenaidood948f772021-08-11 17:49:24 -0400225 previousState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_ACTIVATING, Transient: core.DeviceTransientState_NONE},
226 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 -0400227 handlers: []transitionHandler{dMgr.NotifyInvalidTransition}})
khenaidoo59ef7be2019-06-21 12:40:28 -0400228 transitionMap.transitions = append(transitionMap.transitions,
Kent Hagerman6031aad2020-07-29 16:36:33 -0400229 transition{
khenaidoo59ef7be2019-06-21 12:40:28 -0400230 deviceType: any,
khenaidood948f772021-08-11 17:49:24 -0400231 previousState: deviceState{Admin: voltha.AdminState_PREPROVISIONED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN, Transient: core.DeviceTransientState_NONE},
232 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 -0400233 handlers: []transitionHandler{dMgr.NotifyInvalidTransition}})
khenaidoo59ef7be2019-06-21 12:40:28 -0400234 transitionMap.transitions = append(transitionMap.transitions,
Kent Hagerman6031aad2020-07-29 16:36:33 -0400235 transition{
Andrea Campanella3614a922021-02-25 12:40:42 +0100236 deviceType: child,
khenaidood948f772021-08-11 17:49:24 -0400237 previousState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_REACHABLE, Operational: voltha.OperStatus_UNKNOWN, Transient: core.DeviceTransientState_NONE},
238 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 +0100239 handlers: []transitionHandler{}})
240 transitionMap.transitions = append(transitionMap.transitions,
241 transition{
242 deviceType: child,
khenaidood948f772021-08-11 17:49:24 -0400243 previousState: deviceState{Admin: voltha.AdminState_DOWNLOADING_IMAGE, Connection: voltha.ConnectStatus_REACHABLE, Operational: voltha.OperStatus_UNKNOWN, Transient: core.DeviceTransientState_NONE},
244 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 +0100245 handlers: []transitionHandler{}})
246 transitionMap.transitions = append(transitionMap.transitions,
247 transition{
khenaidoo59ef7be2019-06-21 12:40:28 -0400248 deviceType: any,
khenaidood948f772021-08-11 17:49:24 -0400249 previousState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN, Transient: core.DeviceTransientState_NONE},
250 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 -0400251 handlers: []transitionHandler{dMgr.NotifyInvalidTransition}})
khenaidoo59ef7be2019-06-21 12:40:28 -0400252 transitionMap.transitions = append(transitionMap.transitions,
Kent Hagerman6031aad2020-07-29 16:36:33 -0400253 transition{
khenaidoo59ef7be2019-06-21 12:40:28 -0400254 deviceType: parent,
khenaidood948f772021-08-11 17:49:24 -0400255 previousState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_ACTIVE, Transient: core.DeviceTransientState_NONE},
256 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 -0400257 handlers: []transitionHandler{dMgr.NotifyInvalidTransition}})
khenaidoo59ef7be2019-06-21 12:40:28 -0400258 transitionMap.transitions = append(transitionMap.transitions,
Kent Hagerman6031aad2020-07-29 16:36:33 -0400259 transition{
khenaidoo59ef7be2019-06-21 12:40:28 -0400260 deviceType: any,
khenaidood948f772021-08-11 17:49:24 -0400261 previousState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_ACTIVATING, Transient: core.DeviceTransientState_NONE},
262 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 -0400263 handlers: []transitionHandler{dMgr.NotifyInvalidTransition}})
khenaidoo59ef7be2019-06-21 12:40:28 -0400264 transitionMap.transitions = append(transitionMap.transitions,
Kent Hagerman6031aad2020-07-29 16:36:33 -0400265 transition{
khenaidoo59ef7be2019-06-21 12:40:28 -0400266 deviceType: any,
khenaidood948f772021-08-11 17:49:24 -0400267 previousState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN, Transient: core.DeviceTransientState_NONE},
268 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 -0400269 handlers: []transitionHandler{dMgr.NotifyInvalidTransition}})
khenaidoo59ef7be2019-06-21 12:40:28 -0400270 transitionMap.transitions = append(transitionMap.transitions,
Kent Hagerman6031aad2020-07-29 16:36:33 -0400271 transition{
khenaidoo59ef7be2019-06-21 12:40:28 -0400272 deviceType: child,
khenaidood948f772021-08-11 17:49:24 -0400273 previousState: deviceState{Admin: voltha.AdminState_DISABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN, Transient: core.DeviceTransientState_NONE},
274 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 -0400275 handlers: []transitionHandler{dMgr.NotifyInvalidTransition}})
khenaidoo59ef7be2019-06-21 12:40:28 -0400276 transitionMap.transitions = append(transitionMap.transitions,
Kent Hagerman6031aad2020-07-29 16:36:33 -0400277 transition{
khenaidoo59ef7be2019-06-21 12:40:28 -0400278 deviceType: any,
khenaidood948f772021-08-11 17:49:24 -0400279 previousState: deviceState{Admin: voltha.AdminState_DISABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN, Transient: core.DeviceTransientState_NONE},
280 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 -0400281 handlers: []transitionHandler{dMgr.NotifyInvalidTransition}})
Maninder0aabf0c2021-03-17 14:55:14 +0530282 transitionMap.transitions = append(transitionMap.transitions,
283 transition{
284 deviceType: any,
khenaidood948f772021-08-11 17:49:24 -0400285 previousState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN, Transient: core.DeviceTransientState_RECONCILE_IN_PROGRESS},
286 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 +0530287 handlers: []transitionHandler{}})
288 transitionMap.transitions = append(transitionMap.transitions,
289 transition{
290 deviceType: any,
khenaidood948f772021-08-11 17:49:24 -0400291 previousState: deviceState{Admin: voltha.AdminState_DISABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN, Transient: core.DeviceTransientState_RECONCILE_IN_PROGRESS},
292 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 +0530293 handlers: []transitionHandler{}})
294 transitionMap.transitions = append(transitionMap.transitions,
295 transition{
296 deviceType: any,
khenaidood948f772021-08-11 17:49:24 -0400297 previousState: deviceState{Admin: voltha.AdminState_PREPROVISIONED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN, Transient: core.DeviceTransientState_RECONCILE_IN_PROGRESS},
298 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 +0530299 handlers: []transitionHandler{}})
300 transitionMap.transitions = append(transitionMap.transitions,
301 transition{
302 deviceType: any,
khenaidood948f772021-08-11 17:49:24 -0400303 previousState: deviceState{Admin: voltha.AdminState_DOWNLOADING_IMAGE, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN, Transient: core.DeviceTransientState_RECONCILE_IN_PROGRESS},
304 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 +0530305 handlers: []transitionHandler{}})
306 transitionMap.transitions = append(transitionMap.transitions,
307 transition{
308 deviceType: any,
khenaidood948f772021-08-11 17:49:24 -0400309 previousState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_RECONCILING, Transient: core.DeviceTransientState_RECONCILE_IN_PROGRESS},
310 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 +0530311 handlers: []transitionHandler{dMgr.ReconcilingCleanup}})
312 transitionMap.transitions = append(transitionMap.transitions,
313 transition{
314 deviceType: any,
khenaidood948f772021-08-11 17:49:24 -0400315 previousState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_RECONCILING, Transient: core.DeviceTransientState_RECONCILE_IN_PROGRESS},
316 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 +0530317 handlers: []transitionHandler{dMgr.ReconcilingCleanup}})
318 transitionMap.transitions = append(transitionMap.transitions,
319 transition{
320 deviceType: any,
khenaidood948f772021-08-11 17:49:24 -0400321 previousState: deviceState{Admin: voltha.AdminState_DISABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_RECONCILING, Transient: core.DeviceTransientState_RECONCILE_IN_PROGRESS},
322 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 +0530323 handlers: []transitionHandler{dMgr.ReconcilingCleanup}})
324 transitionMap.transitions = append(transitionMap.transitions,
325 transition{
326 deviceType: any,
khenaidood948f772021-08-11 17:49:24 -0400327 previousState: deviceState{Admin: voltha.AdminState_DOWNLOADING_IMAGE, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_RECONCILING, Transient: core.DeviceTransientState_RECONCILE_IN_PROGRESS},
328 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 +0530329 handlers: []transitionHandler{dMgr.ReconcilingCleanup}})
Maninder581cf4b2021-06-16 22:42:07 +0530330 transitionMap.transitions = append(transitionMap.transitions,
331 transition{
332 deviceType: any,
khenaidood948f772021-08-11 17:49:24 -0400333 previousState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_RECONCILING, Transient: core.DeviceTransientState_RECONCILE_IN_PROGRESS},
334 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 +0530335 handlers: []transitionHandler{dMgr.ReconcilingCleanup}})
336 transitionMap.transitions = append(transitionMap.transitions,
337 transition{
338 deviceType: any,
khenaidood948f772021-08-11 17:49:24 -0400339 previousState: deviceState{Admin: voltha.AdminState_DISABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_RECONCILING, Transient: core.DeviceTransientState_RECONCILE_IN_PROGRESS},
340 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 +0530341 handlers: []transitionHandler{dMgr.ReconcilingCleanup}})
342 transitionMap.transitions = append(transitionMap.transitions,
343 transition{
344 deviceType: any,
khenaidood948f772021-08-11 17:49:24 -0400345 previousState: deviceState{Admin: voltha.AdminState_DOWNLOADING_IMAGE, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_RECONCILING, Transient: core.DeviceTransientState_RECONCILE_IN_PROGRESS},
346 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 +0530347 handlers: []transitionHandler{dMgr.ReconcilingCleanup}})
khenaidoob9203542018-09-17 22:56:37 -0400348
349 return &transitionMap
350}
351
khenaidood948f772021-08-11 17:49:24 -0400352func getDeviceStates(device *voltha.Device, transientState core.DeviceTransientState_Types) deviceState {
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530353 return deviceState{Admin: device.AdminState, Connection: device.ConnectStatus, Operational: device.OperStatus,
354 Transient: transientState}
khenaidoob9203542018-09-17 22:56:37 -0400355}
356
357// isMatched matches a state transition. It returns whether there is a match and if there is whether it is an exact match
Kent Hagerman6031aad2020-07-29 16:36:33 -0400358func getHandler(previous deviceState, current deviceState, transition *transition) ([]transitionHandler, *match) {
khenaidoo442e7c72020-03-10 16:13:48 -0400359 m := &match{}
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530360 var waitForOtherStatesMatch bool
khenaidoob9203542018-09-17 22:56:37 -0400361 // Do we have an exact match?
Kent Hagerman6031aad2020-07-29 16:36:33 -0400362 if previous == transition.previousState && current == transition.currentState {
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530363 return transition.handlers, &match{admin: currPrevStateMatch, oper: currPrevStateMatch, conn: currPrevStateMatch,
364 transient: currPrevStateMatch}
365 }
366 // Do we have transient state match?
khenaidood948f772021-08-11 17:49:24 -0400367 if current.Transient == transition.currentState.Transient && transition.currentState.Transient != core.DeviceTransientState_ANY {
368 if previous.Transient == transition.previousState.Transient || transition.previousState.Transient == core.DeviceTransientState_ANY {
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530369 m.transient = currPrevStateMatch
370 } else {
371 m.transient = currStateOnlyMatch
372 }
khenaidood948f772021-08-11 17:49:24 -0400373 } else if current.Transient == transition.currentState.Transient && transition.currentState.Transient == core.DeviceTransientState_ANY {
374 if previous.Transient == transition.previousState.Transient || transition.previousState.Transient == core.DeviceTransientState_ANY {
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530375 m.transient = currWildcardMatch
376 }
377 }
378 if m.transient == noMatch {
379 return nil, m
khenaidoob9203542018-09-17 22:56:37 -0400380 }
khenaidoo0a822f92019-05-08 15:15:57 -0400381
khenaidoo442e7c72020-03-10 16:13:48 -0400382 // Do we have Admin state match?
383 if current.Admin == transition.currentState.Admin && transition.currentState.Admin != voltha.AdminState_UNKNOWN {
384 if previous.Admin == transition.previousState.Admin {
385 m.admin = currPrevStateMatch
386 } else if transition.previousState.Admin == voltha.AdminState_UNKNOWN {
387 m.admin = currStateOnlyMatch
388 }
389 } else if current.Admin == transition.currentState.Admin && transition.currentState.Admin == voltha.AdminState_UNKNOWN {
390 if previous.Admin == transition.previousState.Admin || transition.previousState.Admin == voltha.AdminState_UNKNOWN {
391 m.admin = currWildcardMatch
392 }
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530393 } else if transition.previousState.Admin == voltha.AdminState_UNKNOWN && transition.currentState.Admin == voltha.AdminState_UNKNOWN {
394 // Will only be the case of DELETION currently.(to allow only transient match, we can avoid this check if
395 // we can allow wild card in admin state)
396 waitForOtherStatesMatch = true
khenaidoo442e7c72020-03-10 16:13:48 -0400397 }
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530398 if !waitForOtherStatesMatch && m.admin == noMatch {
khenaidoo442e7c72020-03-10 16:13:48 -0400399 return nil, m
khenaidoo0a822f92019-05-08 15:15:57 -0400400 }
khenaidoo442e7c72020-03-10 16:13:48 -0400401 // Do we have an operational state match?
402 if current.Operational == transition.currentState.Operational && transition.previousState.Operational != voltha.OperStatus_UNKNOWN {
403 if previous.Operational == transition.previousState.Operational || transition.previousState.Operational == voltha.OperStatus_UNKNOWN {
404 m.oper = currPrevStateMatch
405 } else {
406 m.oper = currStateOnlyMatch
407 }
408 } else if current.Operational == transition.currentState.Operational && transition.previousState.Operational == voltha.OperStatus_UNKNOWN {
409 if previous.Operational == transition.previousState.Operational || transition.previousState.Operational == voltha.OperStatus_UNKNOWN {
410 m.oper = currWildcardMatch
khenaidoob9203542018-09-17 22:56:37 -0400411 }
412 }
khenaidoo442e7c72020-03-10 16:13:48 -0400413
414 // Do we have an connection state match?
415 if current.Connection == transition.currentState.Connection && transition.previousState.Connection != voltha.ConnectStatus_UNKNOWN {
416 if previous.Connection == transition.previousState.Connection || transition.previousState.Connection == voltha.ConnectStatus_UNKNOWN {
417 m.conn = currPrevStateMatch
418 } else {
419 m.conn = currStateOnlyMatch
420 }
421 } else if current.Connection == transition.currentState.Connection && transition.previousState.Connection == voltha.ConnectStatus_UNKNOWN {
422 if previous.Connection == transition.previousState.Connection || transition.previousState.Connection == voltha.ConnectStatus_UNKNOWN {
423 m.conn = currWildcardMatch
khenaidoob9203542018-09-17 22:56:37 -0400424 }
425 }
khenaidoo442e7c72020-03-10 16:13:48 -0400426 return transition.handlers, m
khenaidoob9203542018-09-17 22:56:37 -0400427}
428
Kent Hagerman6031aad2020-07-29 16:36:33 -0400429// getTransitionHandler returns transition handler & a flag that's set if the transition is invalid
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530430func (tMap *TransitionMap) getTransitionHandler(ctx context.Context, cDevice, pDevice *voltha.Device,
khenaidood948f772021-08-11 17:49:24 -0400431 cTransientState, pTransientState core.DeviceTransientState_Types) []transitionHandler {
khenaidoob9203542018-09-17 22:56:37 -0400432 //1. Get the previous and current set of states
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530433 cState := getDeviceStates(cDevice, cTransientState)
434 pState := getDeviceStates(pDevice, pTransientState)
khenaidoo442e7c72020-03-10 16:13:48 -0400435
436 // Do nothing is there are no states change
Kent Hagerman6031aad2020-07-29 16:36:33 -0400437 if pState == cState {
khenaidoo442e7c72020-03-10 16:13:48 -0400438 return nil
439 }
440
Rohan Agrawal31f21802020-06-12 05:38:46 +0000441 //logger.Infow(ctx, "deviceType", log.Fields{"device": pDevice})
khenaidoob9203542018-09-17 22:56:37 -0400442 deviceType := parent
Kent Hagerman6031aad2020-07-29 16:36:33 -0400443 if !cDevice.Root {
Rohan Agrawal31f21802020-06-12 05:38:46 +0000444 logger.Info(ctx, "device is child")
khenaidoob9203542018-09-17 22:56:37 -0400445 deviceType = child
446 }
Kent Hagerman6031aad2020-07-29 16:36:33 -0400447 logger.Infof(ctx, "deviceType:%d-deviceId:%s-previous:%v-current:%v", deviceType, cDevice.Id, pState, cState)
khenaidoob9203542018-09-17 22:56:37 -0400448
449 //2. Go over transition array to get the right transition
Kent Hagerman6031aad2020-07-29 16:36:33 -0400450 var currentMatch []transitionHandler
451 var tempHandler []transitionHandler
khenaidoo442e7c72020-03-10 16:13:48 -0400452 var m *match
453 bestMatch := &match{}
Andrey Pozolotin34dd63f2021-05-31 21:26:40 +0300454 for i := range tMap.transitions {
khenaidoob9203542018-09-17 22:56:37 -0400455 // consider transition only if it matches deviceType or is a wild card - any
Andrey Pozolotin34dd63f2021-05-31 21:26:40 +0300456 if tMap.transitions[i].deviceType != deviceType && tMap.transitions[i].deviceType != any {
khenaidoob9203542018-09-17 22:56:37 -0400457 continue
458 }
Andrey Pozolotin34dd63f2021-05-31 21:26:40 +0300459 tempHandler, m = getHandler(pState, cState, &tMap.transitions[i])
khenaidoob9203542018-09-17 22:56:37 -0400460 if tempHandler != nil {
Andrey Pozolotin34dd63f2021-05-31 21:26:40 +0300461 if m.isExactMatch() && tMap.transitions[i].deviceType == deviceType {
khenaidoob9203542018-09-17 22:56:37 -0400462 return tempHandler
khenaidoo442e7c72020-03-10 16:13:48 -0400463 } else if m.isExactMatch() || m.isBetterMatch(bestMatch) {
khenaidoo0a822f92019-05-08 15:15:57 -0400464 currentMatch = tempHandler
khenaidoo442e7c72020-03-10 16:13:48 -0400465 bestMatch = m
khenaidoob9203542018-09-17 22:56:37 -0400466 }
467 }
468 }
469 return currentMatch
470}
Kent Hagerman6031aad2020-07-29 16:36:33 -0400471
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530472func (tMap *TransitionMap) ProcessTransition(ctx context.Context, device, prevDevice *voltha.Device,
khenaidood948f772021-08-11 17:49:24 -0400473 deviceTransientState, prevDeviceTransientState core.DeviceTransientState_Types) error {
Kent Hagerman6031aad2020-07-29 16:36:33 -0400474 // This will be triggered on every state update
475 logger.Debugw(ctx, "state-transition", log.Fields{
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530476 "device": device.Id,
477 "prev-admin-state": prevDevice.AdminState,
478 "prev-oper-state": prevDevice.OperStatus,
479 "prev-conn-state": prevDevice.ConnectStatus,
480 "curr-admin-state": device.AdminState,
481 "curr-oper-state": device.OperStatus,
482 "curr-conn-state": device.ConnectStatus,
483 "curr-transient-state": deviceTransientState,
484 "prev-transient-state": prevDeviceTransientState,
Kent Hagerman6031aad2020-07-29 16:36:33 -0400485 })
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530486 handlers := tMap.getTransitionHandler(ctx, device, prevDevice, deviceTransientState, prevDeviceTransientState)
Maninder0aabf0c2021-03-17 14:55:14 +0530487 if len(handlers) == 0 {
Kent Hagerman6031aad2020-07-29 16:36:33 -0400488 logger.Debugw(ctx, "no-op-transition", log.Fields{"deviceId": device.Id})
489 return nil
490 }
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530491 logger.Debugw(ctx, "handler-found", log.Fields{"num-expectedHandlers": len(handlers), "isParent": device.Root,
492 "current-data": device, "previous-data": prevDevice})
Kent Hagerman6031aad2020-07-29 16:36:33 -0400493 for _, handler := range handlers {
494 logger.Debugw(ctx, "running-handler", log.Fields{"handler": funcName(handler)})
495 if err := handler(ctx, device); err != nil {
496 logger.Warnw(ctx, "handler-failed", log.Fields{"handler": funcName(handler), "error": err})
497 return err
498 }
499 }
500 return nil
501}
502
503func funcName(f interface{}) string {
504 return runtime.FuncForPC(reflect.ValueOf(f).Pointer()).Name()
505}