blob: b8e429caad15e542b642ff461180d1926e434790 [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},
Andrea Campanella832cff62021-11-05 17:05:18 +0100180 handlers: []transitionHandler{dMgr.DeleteAllLogicalPorts, dMgr.DeleteAllChildDevices, dMgr.DeleteAllLogicalMeters, dMgr.DeleteLogicalDevice, dMgr.DeleteAllDeviceFlows}})
Girish Gowdra408cd962020-03-11 14:31:31 -0700181 transitionMap.transitions = append(transitionMap.transitions,
Kent Hagerman6031aad2020-07-29 16:36:33 -0400182 transition{
Girish Gowdra408cd962020-03-11 14:31:31 -0700183 deviceType: parent,
khenaidood948f772021-08-11 17:49:24 -0400184 previousState: deviceState{Admin: voltha.AdminState_DISABLED, Connection: voltha.ConnectStatus_REACHABLE, Operational: voltha.OperStatus_UNKNOWN, Transient: core.DeviceTransientState_NONE},
185 currentState: deviceState{Admin: voltha.AdminState_DISABLED, Connection: voltha.ConnectStatus_UNREACHABLE, Operational: voltha.OperStatus_UNKNOWN, Transient: core.DeviceTransientState_NONE},
Andrea Campanella832cff62021-11-05 17:05:18 +0100186 handlers: []transitionHandler{dMgr.DeleteAllLogicalPorts, dMgr.DeleteAllChildDevices, dMgr.DeleteAllLogicalMeters, dMgr.DeleteLogicalDevice, dMgr.DeleteAllDeviceFlows}})
Chaitrashree G S7849b322020-03-29 19:25:49 -0400187 transitionMap.transitions = append(transitionMap.transitions,
Kent Hagerman6031aad2020-07-29 16:36:33 -0400188 transition{
Chaitrashree G S7849b322020-03-29 19:25:49 -0400189 deviceType: parent,
khenaidood948f772021-08-11 17:49:24 -0400190 previousState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNREACHABLE, Operational: voltha.OperStatus_UNKNOWN, Transient: core.DeviceTransientState_NONE},
191 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 -0400192 handlers: []transitionHandler{dMgr.CreateLogicalDevice}})
Girish Gowdra408cd962020-03-11 14:31:31 -0700193 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_DISABLED, Connection: voltha.ConnectStatus_UNREACHABLE, Operational: voltha.OperStatus_UNKNOWN, Transient: core.DeviceTransientState_NONE},
197 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 -0400198 handlers: []transitionHandler{dMgr.CreateLogicalDevice}})
Chaitrashree G S7849b322020-03-29 19:25:49 -0400199 transitionMap.transitions = append(transitionMap.transitions,
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530200 transition{ //DELETE force case
khenaidoo0a822f92019-05-08 15:15:57 -0400201 deviceType: child,
khenaidood948f772021-08-11 17:49:24 -0400202 previousState: deviceState{Admin: voltha.AdminState_UNKNOWN, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN, Transient: core.DeviceTransientState_ANY},
203 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 +0100204 handlers: []transitionHandler{dMgr.DeleteAllDeviceFlows, dMgr.ChildDeviceLost, dMgr.DeleteLogicalPorts, dMgr.RunPostDeviceDelete}})
Chaitrashree G S543df3e2020-02-24 22:36:54 -0500205 transitionMap.transitions = append(transitionMap.transitions,
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530206 transition{ //DELETE after adapter response case
Chaitrashree G S543df3e2020-02-24 22:36:54 -0500207 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_DELETING_POST_ADAPTER_RESPONSE},
Elia Battiston509fdc72022-01-04 13:28:09 +0100210 handlers: []transitionHandler{dMgr.DeleteAllDeviceFlows, dMgr.ChildDeviceLost, dMgr.DeleteLogicalPorts, dMgr.RunPostDeviceDelete}})
khenaidoob9203542018-09-17 22:56:37 -0400211 transitionMap.transitions = append(transitionMap.transitions,
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530212 transition{ //DELETE wait for adapter response(no operation)
213 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_FROM_ADAPTER},
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530216 handlers: []transitionHandler{}})
217 transitionMap.transitions = append(transitionMap.transitions,
Kent Hagerman6031aad2020-07-29 16:36:33 -0400218 transition{
khenaidoob9203542018-09-17 22:56:37 -0400219 deviceType: any,
khenaidood948f772021-08-11 17:49:24 -0400220 previousState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_ACTIVE, Transient: core.DeviceTransientState_NONE},
221 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 -0400222 handlers: []transitionHandler{dMgr.NotifyInvalidTransition}})
khenaidoo59ef7be2019-06-21 12:40:28 -0400223 transitionMap.transitions = append(transitionMap.transitions,
Kent Hagerman6031aad2020-07-29 16:36:33 -0400224 transition{
khenaidoo59ef7be2019-06-21 12:40:28 -0400225 deviceType: any,
khenaidood948f772021-08-11 17:49:24 -0400226 previousState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_ACTIVATING, Transient: core.DeviceTransientState_NONE},
227 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 -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_PREPROVISIONED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN, Transient: core.DeviceTransientState_NONE},
233 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 -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{
Andrea Campanella3614a922021-02-25 12:40:42 +0100237 deviceType: child,
khenaidood948f772021-08-11 17:49:24 -0400238 previousState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_REACHABLE, Operational: voltha.OperStatus_UNKNOWN, Transient: core.DeviceTransientState_NONE},
239 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 +0100240 handlers: []transitionHandler{}})
241 transitionMap.transitions = append(transitionMap.transitions,
242 transition{
243 deviceType: child,
khenaidood948f772021-08-11 17:49:24 -0400244 previousState: deviceState{Admin: voltha.AdminState_DOWNLOADING_IMAGE, Connection: voltha.ConnectStatus_REACHABLE, Operational: voltha.OperStatus_UNKNOWN, Transient: core.DeviceTransientState_NONE},
245 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 +0100246 handlers: []transitionHandler{}})
247 transitionMap.transitions = append(transitionMap.transitions,
248 transition{
khenaidoo59ef7be2019-06-21 12:40:28 -0400249 deviceType: any,
khenaidood948f772021-08-11 17:49:24 -0400250 previousState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN, Transient: core.DeviceTransientState_NONE},
251 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 -0400252 handlers: []transitionHandler{dMgr.NotifyInvalidTransition}})
khenaidoo59ef7be2019-06-21 12:40:28 -0400253 transitionMap.transitions = append(transitionMap.transitions,
Kent Hagerman6031aad2020-07-29 16:36:33 -0400254 transition{
khenaidoo59ef7be2019-06-21 12:40:28 -0400255 deviceType: parent,
khenaidood948f772021-08-11 17:49:24 -0400256 previousState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_ACTIVE, Transient: core.DeviceTransientState_NONE},
257 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 -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: any,
khenaidood948f772021-08-11 17:49:24 -0400262 previousState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_ACTIVATING, Transient: core.DeviceTransientState_NONE},
263 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 -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_UNKNOWN, Transient: core.DeviceTransientState_NONE},
269 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 -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: child,
khenaidood948f772021-08-11 17:49:24 -0400274 previousState: deviceState{Admin: voltha.AdminState_DISABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN, Transient: core.DeviceTransientState_NONE},
275 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 -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: any,
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_PREPROVISIONED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN, Transient: core.DeviceTransientState_NONE},
Kent Hagerman6031aad2020-07-29 16:36:33 -0400282 handlers: []transitionHandler{dMgr.NotifyInvalidTransition}})
Maninder0aabf0c2021-03-17 14:55:14 +0530283 transitionMap.transitions = append(transitionMap.transitions,
284 transition{
285 deviceType: any,
khenaidood948f772021-08-11 17:49:24 -0400286 previousState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN, Transient: core.DeviceTransientState_RECONCILE_IN_PROGRESS},
287 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 +0530288 handlers: []transitionHandler{}})
289 transitionMap.transitions = append(transitionMap.transitions,
290 transition{
291 deviceType: any,
khenaidood948f772021-08-11 17:49:24 -0400292 previousState: deviceState{Admin: voltha.AdminState_DISABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN, Transient: core.DeviceTransientState_RECONCILE_IN_PROGRESS},
293 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 +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_PREPROVISIONED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN, Transient: core.DeviceTransientState_RECONCILE_IN_PROGRESS},
299 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 +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_DOWNLOADING_IMAGE, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_UNKNOWN, Transient: core.DeviceTransientState_RECONCILE_IN_PROGRESS},
305 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 +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_ENABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_RECONCILING, Transient: core.DeviceTransientState_RECONCILE_IN_PROGRESS},
311 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 +0530312 handlers: []transitionHandler{dMgr.ReconcilingCleanup}})
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_UNREACHABLE, Operational: voltha.OperStatus_UNKNOWN, 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_DISABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_RECONCILING, Transient: core.DeviceTransientState_RECONCILE_IN_PROGRESS},
323 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 +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_DOWNLOADING_IMAGE, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_RECONCILING, Transient: core.DeviceTransientState_RECONCILE_IN_PROGRESS},
329 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 +0530330 handlers: []transitionHandler{dMgr.ReconcilingCleanup}})
Maninder581cf4b2021-06-16 22:42:07 +0530331 transitionMap.transitions = append(transitionMap.transitions,
332 transition{
333 deviceType: any,
khenaidood948f772021-08-11 17:49:24 -0400334 previousState: deviceState{Admin: voltha.AdminState_ENABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_RECONCILING, Transient: core.DeviceTransientState_RECONCILE_IN_PROGRESS},
335 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 +0530336 handlers: []transitionHandler{dMgr.ReconcilingCleanup}})
337 transitionMap.transitions = append(transitionMap.transitions,
338 transition{
339 deviceType: any,
khenaidood948f772021-08-11 17:49:24 -0400340 previousState: deviceState{Admin: voltha.AdminState_DISABLED, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_RECONCILING, Transient: core.DeviceTransientState_RECONCILE_IN_PROGRESS},
341 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 +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_DOWNLOADING_IMAGE, Connection: voltha.ConnectStatus_UNKNOWN, Operational: voltha.OperStatus_RECONCILING, Transient: core.DeviceTransientState_RECONCILE_IN_PROGRESS},
347 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 +0530348 handlers: []transitionHandler{dMgr.ReconcilingCleanup}})
khenaidoob9203542018-09-17 22:56:37 -0400349
350 return &transitionMap
351}
352
khenaidood948f772021-08-11 17:49:24 -0400353func getDeviceStates(device *voltha.Device, transientState core.DeviceTransientState_Types) deviceState {
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530354 return deviceState{Admin: device.AdminState, Connection: device.ConnectStatus, Operational: device.OperStatus,
355 Transient: transientState}
khenaidoob9203542018-09-17 22:56:37 -0400356}
357
358// 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 -0400359func getHandler(previous deviceState, current deviceState, transition *transition) ([]transitionHandler, *match) {
khenaidoo442e7c72020-03-10 16:13:48 -0400360 m := &match{}
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530361 var waitForOtherStatesMatch bool
khenaidoob9203542018-09-17 22:56:37 -0400362 // Do we have an exact match?
Kent Hagerman6031aad2020-07-29 16:36:33 -0400363 if previous == transition.previousState && current == transition.currentState {
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530364 return transition.handlers, &match{admin: currPrevStateMatch, oper: currPrevStateMatch, conn: currPrevStateMatch,
365 transient: currPrevStateMatch}
366 }
367 // Do we have transient state match?
khenaidood948f772021-08-11 17:49:24 -0400368 if current.Transient == transition.currentState.Transient && transition.currentState.Transient != core.DeviceTransientState_ANY {
369 if previous.Transient == transition.previousState.Transient || transition.previousState.Transient == core.DeviceTransientState_ANY {
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530370 m.transient = currPrevStateMatch
371 } else {
372 m.transient = currStateOnlyMatch
373 }
khenaidood948f772021-08-11 17:49:24 -0400374 } else 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 = currWildcardMatch
377 }
378 }
379 if m.transient == noMatch {
380 return nil, m
khenaidoob9203542018-09-17 22:56:37 -0400381 }
khenaidoo0a822f92019-05-08 15:15:57 -0400382
khenaidoo442e7c72020-03-10 16:13:48 -0400383 // Do we have Admin state match?
384 if current.Admin == transition.currentState.Admin && transition.currentState.Admin != voltha.AdminState_UNKNOWN {
385 if previous.Admin == transition.previousState.Admin {
386 m.admin = currPrevStateMatch
387 } else if transition.previousState.Admin == voltha.AdminState_UNKNOWN {
388 m.admin = currStateOnlyMatch
389 }
390 } else if current.Admin == transition.currentState.Admin && transition.currentState.Admin == voltha.AdminState_UNKNOWN {
391 if previous.Admin == transition.previousState.Admin || transition.previousState.Admin == voltha.AdminState_UNKNOWN {
392 m.admin = currWildcardMatch
393 }
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530394 } else if transition.previousState.Admin == voltha.AdminState_UNKNOWN && transition.currentState.Admin == voltha.AdminState_UNKNOWN {
395 // Will only be the case of DELETION currently.(to allow only transient match, we can avoid this check if
396 // we can allow wild card in admin state)
397 waitForOtherStatesMatch = true
khenaidoo442e7c72020-03-10 16:13:48 -0400398 }
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530399 if !waitForOtherStatesMatch && m.admin == noMatch {
khenaidoo442e7c72020-03-10 16:13:48 -0400400 return nil, m
khenaidoo0a822f92019-05-08 15:15:57 -0400401 }
khenaidoo442e7c72020-03-10 16:13:48 -0400402 // Do we have an operational state match?
403 if current.Operational == transition.currentState.Operational && transition.previousState.Operational != voltha.OperStatus_UNKNOWN {
404 if previous.Operational == transition.previousState.Operational || transition.previousState.Operational == voltha.OperStatus_UNKNOWN {
405 m.oper = currPrevStateMatch
406 } else {
407 m.oper = currStateOnlyMatch
408 }
409 } else 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 = currWildcardMatch
khenaidoob9203542018-09-17 22:56:37 -0400412 }
413 }
khenaidoo442e7c72020-03-10 16:13:48 -0400414
415 // Do we have an connection state match?
416 if current.Connection == transition.currentState.Connection && transition.previousState.Connection != voltha.ConnectStatus_UNKNOWN {
417 if previous.Connection == transition.previousState.Connection || transition.previousState.Connection == voltha.ConnectStatus_UNKNOWN {
418 m.conn = currPrevStateMatch
419 } else {
420 m.conn = currStateOnlyMatch
421 }
422 } else 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 = currWildcardMatch
khenaidoob9203542018-09-17 22:56:37 -0400425 }
426 }
khenaidoo442e7c72020-03-10 16:13:48 -0400427 return transition.handlers, m
khenaidoob9203542018-09-17 22:56:37 -0400428}
429
Kent Hagerman6031aad2020-07-29 16:36:33 -0400430// getTransitionHandler returns transition handler & a flag that's set if the transition is invalid
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530431func (tMap *TransitionMap) getTransitionHandler(ctx context.Context, cDevice, pDevice *voltha.Device,
khenaidood948f772021-08-11 17:49:24 -0400432 cTransientState, pTransientState core.DeviceTransientState_Types) []transitionHandler {
khenaidoob9203542018-09-17 22:56:37 -0400433 //1. Get the previous and current set of states
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530434 cState := getDeviceStates(cDevice, cTransientState)
435 pState := getDeviceStates(pDevice, pTransientState)
khenaidoo442e7c72020-03-10 16:13:48 -0400436
437 // Do nothing is there are no states change
Kent Hagerman6031aad2020-07-29 16:36:33 -0400438 if pState == cState {
khenaidoo442e7c72020-03-10 16:13:48 -0400439 return nil
440 }
441
Rohan Agrawal31f21802020-06-12 05:38:46 +0000442 //logger.Infow(ctx, "deviceType", log.Fields{"device": pDevice})
khenaidoob9203542018-09-17 22:56:37 -0400443 deviceType := parent
Kent Hagerman6031aad2020-07-29 16:36:33 -0400444 if !cDevice.Root {
Rohan Agrawal31f21802020-06-12 05:38:46 +0000445 logger.Info(ctx, "device is child")
khenaidoob9203542018-09-17 22:56:37 -0400446 deviceType = child
447 }
Kent Hagerman6031aad2020-07-29 16:36:33 -0400448 logger.Infof(ctx, "deviceType:%d-deviceId:%s-previous:%v-current:%v", deviceType, cDevice.Id, pState, cState)
khenaidoob9203542018-09-17 22:56:37 -0400449
450 //2. Go over transition array to get the right transition
Kent Hagerman6031aad2020-07-29 16:36:33 -0400451 var currentMatch []transitionHandler
452 var tempHandler []transitionHandler
khenaidoo442e7c72020-03-10 16:13:48 -0400453 var m *match
454 bestMatch := &match{}
Andrey Pozolotin34dd63f2021-05-31 21:26:40 +0300455 for i := range tMap.transitions {
khenaidoob9203542018-09-17 22:56:37 -0400456 // consider transition only if it matches deviceType or is a wild card - any
Andrey Pozolotin34dd63f2021-05-31 21:26:40 +0300457 if tMap.transitions[i].deviceType != deviceType && tMap.transitions[i].deviceType != any {
khenaidoob9203542018-09-17 22:56:37 -0400458 continue
459 }
Andrey Pozolotin34dd63f2021-05-31 21:26:40 +0300460 tempHandler, m = getHandler(pState, cState, &tMap.transitions[i])
khenaidoob9203542018-09-17 22:56:37 -0400461 if tempHandler != nil {
Andrey Pozolotin34dd63f2021-05-31 21:26:40 +0300462 if m.isExactMatch() && tMap.transitions[i].deviceType == deviceType {
khenaidoob9203542018-09-17 22:56:37 -0400463 return tempHandler
khenaidoo442e7c72020-03-10 16:13:48 -0400464 } else if m.isExactMatch() || m.isBetterMatch(bestMatch) {
khenaidoo0a822f92019-05-08 15:15:57 -0400465 currentMatch = tempHandler
khenaidoo442e7c72020-03-10 16:13:48 -0400466 bestMatch = m
khenaidoob9203542018-09-17 22:56:37 -0400467 }
468 }
469 }
470 return currentMatch
471}
Kent Hagerman6031aad2020-07-29 16:36:33 -0400472
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530473func (tMap *TransitionMap) ProcessTransition(ctx context.Context, device, prevDevice *voltha.Device,
khenaidood948f772021-08-11 17:49:24 -0400474 deviceTransientState, prevDeviceTransientState core.DeviceTransientState_Types) error {
Kent Hagerman6031aad2020-07-29 16:36:33 -0400475 // This will be triggered on every state update
476 logger.Debugw(ctx, "state-transition", log.Fields{
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530477 "device": device.Id,
478 "prev-admin-state": prevDevice.AdminState,
479 "prev-oper-state": prevDevice.OperStatus,
480 "prev-conn-state": prevDevice.ConnectStatus,
481 "curr-admin-state": device.AdminState,
482 "curr-oper-state": device.OperStatus,
483 "curr-conn-state": device.ConnectStatus,
484 "curr-transient-state": deviceTransientState,
485 "prev-transient-state": prevDeviceTransientState,
Kent Hagerman6031aad2020-07-29 16:36:33 -0400486 })
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530487 handlers := tMap.getTransitionHandler(ctx, device, prevDevice, deviceTransientState, prevDeviceTransientState)
Maninder0aabf0c2021-03-17 14:55:14 +0530488 if len(handlers) == 0 {
Kent Hagerman6031aad2020-07-29 16:36:33 -0400489 logger.Debugw(ctx, "no-op-transition", log.Fields{"deviceId": device.Id})
490 return nil
491 }
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530492 logger.Debugw(ctx, "handler-found", log.Fields{"num-expectedHandlers": len(handlers), "isParent": device.Root,
493 "current-data": device, "previous-data": prevDevice})
Kent Hagerman6031aad2020-07-29 16:36:33 -0400494 for _, handler := range handlers {
495 logger.Debugw(ctx, "running-handler", log.Fields{"handler": funcName(handler)})
496 if err := handler(ctx, device); err != nil {
497 logger.Warnw(ctx, "handler-failed", log.Fields{"handler": funcName(handler), "error": err})
498 return err
499 }
500 }
501 return nil
502}
503
504func funcName(f interface{}) string {
505 return runtime.FuncForPC(reflect.ValueOf(f).Pointer()).Name()
506}