blob: 493b3919f913a795bde3b54048f02f0db97385e4 [file] [log] [blame]
khenaidoo21d51152019-02-01 13:48:37 -05001/*
2 * Copyright 2019-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
khenaidoo21d51152019-02-01 13:48:37 -050017package core
18
19import (
20 "context"
khenaidoo21d51152019-02-01 13:48:37 -050021 "fmt"
npujar1d86a522019-11-14 17:11:16 +053022 "reflect"
23 "sync"
24
khenaidoo21d51152019-02-01 13:48:37 -050025 "github.com/gogo/protobuf/proto"
sbarbari17d7e222019-11-05 10:02:29 -050026 "github.com/opencord/voltha-go/db/model"
Scott Baker807addd2019-10-24 15:16:21 -070027 "github.com/opencord/voltha-lib-go/v2/pkg/log"
28 "github.com/opencord/voltha-lib-go/v2/pkg/probe"
Scott Baker555307d2019-11-04 08:58:01 -080029 "github.com/opencord/voltha-protos/v2/go/voltha"
khenaidoo21d51152019-02-01 13:48:37 -050030)
31
npujar1d86a522019-11-14 17:11:16 +053032// sentinel constants
khenaidoo21d51152019-02-01 13:48:37 -050033const (
npujar1d86a522019-11-14 17:11:16 +053034 SentinelAdapterID = "adapter_sentinel"
35 SentinelDevicetypeID = "device_type_sentinel"
khenaidoo21d51152019-02-01 13:48:37 -050036)
37
npujar1d86a522019-11-14 17:11:16 +053038// AdapterAgent represents adapter agent
khenaidoo21d51152019-02-01 13:48:37 -050039type AdapterAgent struct {
khenaidoo1ce37ad2019-03-24 22:07:24 -040040 adapter *voltha.Adapter
khenaidoo21d51152019-02-01 13:48:37 -050041 deviceTypes map[string]*voltha.DeviceType
khenaidoo1ce37ad2019-03-24 22:07:24 -040042 lock sync.RWMutex
khenaidoo21d51152019-02-01 13:48:37 -050043}
44
45func newAdapterAgent(adapter *voltha.Adapter, deviceTypes *voltha.DeviceTypes) *AdapterAgent {
46 var adapterAgent AdapterAgent
47 adapterAgent.adapter = adapter
48 adapterAgent.lock = sync.RWMutex{}
49 adapterAgent.deviceTypes = make(map[string]*voltha.DeviceType)
50 if deviceTypes != nil {
51 for _, dType := range deviceTypes.Items {
52 adapterAgent.deviceTypes[dType.Id] = dType
53 }
54 }
55 return &adapterAgent
56}
57
khenaidoo21d51152019-02-01 13:48:37 -050058func (aa *AdapterAgent) getDeviceType(deviceType string) *voltha.DeviceType {
59 aa.lock.RLock()
60 defer aa.lock.RUnlock()
61 if _, exist := aa.deviceTypes[deviceType]; exist {
62 return aa.deviceTypes[deviceType]
63 }
64 return nil
65}
66
67func (aa *AdapterAgent) getAdapter() *voltha.Adapter {
68 aa.lock.RLock()
69 defer aa.lock.RUnlock()
70 log.Debugw("getAdapter", log.Fields{"adapter": aa.adapter})
71 return aa.adapter
72}
73
74func (aa *AdapterAgent) updateAdapter(adapter *voltha.Adapter) {
khenaidoo1ce37ad2019-03-24 22:07:24 -040075 aa.lock.Lock()
76 defer aa.lock.Unlock()
khenaidoo21d51152019-02-01 13:48:37 -050077 aa.adapter = adapter
78}
79
khenaidoo1ce37ad2019-03-24 22:07:24 -040080func (aa *AdapterAgent) updateDeviceType(deviceType *voltha.DeviceType) {
81 aa.lock.Lock()
82 defer aa.lock.Unlock()
khenaidoo21d51152019-02-01 13:48:37 -050083 aa.deviceTypes[deviceType.Id] = deviceType
84}
85
npujar1d86a522019-11-14 17:11:16 +053086// AdapterManager represents adapter manager attributes
khenaidoo21d51152019-02-01 13:48:37 -050087type AdapterManager struct {
88 adapterAgents map[string]*AdapterAgent
89 deviceTypeToAdapterMap map[string]string
90 clusterDataProxy *model.Proxy
91 adapterProxy *model.Proxy
92 deviceTypeProxy *model.Proxy
khenaidooba6b6c42019-08-02 09:11:56 -040093 deviceMgr *DeviceManager
npujar1d86a522019-11-14 17:11:16 +053094 coreInstanceID string
khenaidoo21d51152019-02-01 13:48:37 -050095 exitChannel chan int
96 lockAdaptersMap sync.RWMutex
97 lockdDeviceTypeToAdapterMap sync.RWMutex
98}
99
npujar1d86a522019-11-14 17:11:16 +0530100func newAdapterManager(cdProxy *model.Proxy, coreInstanceID string, deviceMgr *DeviceManager) *AdapterManager {
khenaidoo21d51152019-02-01 13:48:37 -0500101 var adapterMgr AdapterManager
102 adapterMgr.exitChannel = make(chan int, 1)
npujar1d86a522019-11-14 17:11:16 +0530103 adapterMgr.coreInstanceID = coreInstanceID
khenaidoo21d51152019-02-01 13:48:37 -0500104 adapterMgr.clusterDataProxy = cdProxy
105 adapterMgr.adapterAgents = make(map[string]*AdapterAgent)
106 adapterMgr.deviceTypeToAdapterMap = make(map[string]string)
107 adapterMgr.lockAdaptersMap = sync.RWMutex{}
108 adapterMgr.lockdDeviceTypeToAdapterMap = sync.RWMutex{}
khenaidooba6b6c42019-08-02 09:11:56 -0400109 adapterMgr.deviceMgr = deviceMgr
khenaidoo21d51152019-02-01 13:48:37 -0500110 return &adapterMgr
111}
112
khenaidoo1ce37ad2019-03-24 22:07:24 -0400113func (aMgr *AdapterManager) start(ctx context.Context) {
khenaidoo21d51152019-02-01 13:48:37 -0500114 log.Info("starting-adapter-manager")
115
116 // Load the existing adapterAgents and device types - this will also ensure the correct paths have been
117 // created if there are no data in the dB to start
118 aMgr.loadAdaptersAndDevicetypesInMemory()
119
120 //// Create the proxies
Stephane Barbarieef6650d2019-07-18 12:15:09 -0400121 aMgr.adapterProxy = aMgr.clusterDataProxy.CreateProxy(context.Background(), "/adapters", false)
122 aMgr.deviceTypeProxy = aMgr.clusterDataProxy.CreateProxy(context.Background(), "/device_types", false)
khenaidoo21d51152019-02-01 13:48:37 -0500123
124 // Register the callbacks
125 aMgr.adapterProxy.RegisterCallback(model.POST_UPDATE, aMgr.adapterUpdated)
126 aMgr.deviceTypeProxy.RegisterCallback(model.POST_UPDATE, aMgr.deviceTypesUpdated)
David K. Bainbridgeb4a9ab02019-09-20 15:12:16 -0700127 probe.UpdateStatusFromContext(ctx, "adapter-manager", probe.ServiceStatusRunning)
khenaidoo21d51152019-02-01 13:48:37 -0500128 log.Info("adapter-manager-started")
129}
130
khenaidoo21d51152019-02-01 13:48:37 -0500131//loadAdaptersAndDevicetypesInMemory loads the existing set of adapters and device types in memory
132func (aMgr *AdapterManager) loadAdaptersAndDevicetypesInMemory() {
133 // Load the adapters
Stephane Barbarieef6650d2019-07-18 12:15:09 -0400134 if adaptersIf := aMgr.clusterDataProxy.List(context.Background(), "/adapters", 0, false, ""); adaptersIf != nil {
khenaidoo21d51152019-02-01 13:48:37 -0500135 for _, adapterIf := range adaptersIf.([]interface{}) {
136 if adapter, ok := adapterIf.(*voltha.Adapter); ok {
137 log.Debugw("found-existing-adapter", log.Fields{"adapterId": adapter.Id})
138 aMgr.addAdapter(adapter, false)
139 }
140 }
141 } else {
142 log.Debug("no-existing-adapter-found")
143 // No adapter data. In order to have a proxy setup for that path let's create a fake adapter
npujar1d86a522019-11-14 17:11:16 +0530144 aMgr.addAdapter(&voltha.Adapter{Id: SentinelAdapterID}, true)
khenaidoo21d51152019-02-01 13:48:37 -0500145 }
146
147 // Load the device types
Stephane Barbarieef6650d2019-07-18 12:15:09 -0400148 if deviceTypesIf := aMgr.clusterDataProxy.List(context.Background(), "/device_types", 0, false, ""); deviceTypesIf != nil {
khenaidoo1ce37ad2019-03-24 22:07:24 -0400149 dTypes := &voltha.DeviceTypes{Items: []*voltha.DeviceType{}}
khenaidoo21d51152019-02-01 13:48:37 -0500150 for _, deviceTypeIf := range deviceTypesIf.([]interface{}) {
151 if dType, ok := deviceTypeIf.(*voltha.DeviceType); ok {
152 log.Debugw("found-existing-device-types", log.Fields{"deviceTypes": dTypes})
153 dTypes.Items = append(dTypes.Items, dType)
154 }
155 }
156 aMgr.addDeviceTypes(dTypes, false)
157 } else {
158 log.Debug("no-existing-device-type-found")
159 // No device types data. In order to have a proxy setup for that path let's create a fake device type
npujar1d86a522019-11-14 17:11:16 +0530160 aMgr.addDeviceTypes(&voltha.DeviceTypes{Items: []*voltha.DeviceType{{Id: SentinelDevicetypeID, Adapter: SentinelAdapterID}}}, true)
khenaidoo21d51152019-02-01 13:48:37 -0500161 }
162}
163
khenaidoo297cd252019-02-07 22:10:23 -0500164//updateAdaptersAndDevicetypesInMemory loads the existing set of adapters and device types in memory
khenaidooba6b6c42019-08-02 09:11:56 -0400165func (aMgr *AdapterManager) updateAdaptersAndDevicetypesInMemory(adapter *voltha.Adapter) {
A R Karthicked2a77b2019-10-08 01:40:51 +0000166 aMgr.lockAdaptersMap.Lock()
167 defer aMgr.lockAdaptersMap.Unlock()
168
169 if adapterAgent, ok := aMgr.adapterAgents[adapter.Id]; ok {
170 if adapterAgent.getAdapter() != nil {
171 // Already registered - Adapter may have restarted. Trigger the reconcile process for that adapter
npujar1d86a522019-11-14 17:11:16 +0530172 go func() {
173 err := aMgr.deviceMgr.adapterRestarted(adapter)
174 if err != nil {
175 log.Errorw("unable-to-restart-adapter", log.Fields{"error": err})
176 }
177 }()
A R Karthicked2a77b2019-10-08 01:40:51 +0000178 return
179 }
khenaidooba6b6c42019-08-02 09:11:56 -0400180 }
181
khenaidoo297cd252019-02-07 22:10:23 -0500182 // Update the adapters
Stephane Barbarieef6650d2019-07-18 12:15:09 -0400183 if adaptersIf := aMgr.clusterDataProxy.List(context.Background(), "/adapters", 0, false, ""); adaptersIf != nil {
khenaidoo297cd252019-02-07 22:10:23 -0500184 for _, adapterIf := range adaptersIf.([]interface{}) {
185 if adapter, ok := adapterIf.(*voltha.Adapter); ok {
186 log.Debugw("found-existing-adapter", log.Fields{"adapterId": adapter.Id})
A R Karthicked2a77b2019-10-08 01:40:51 +0000187 aMgr.updateAdapterWithoutLock(adapter)
khenaidoo297cd252019-02-07 22:10:23 -0500188 }
189 }
190 }
A R Karthicked2a77b2019-10-08 01:40:51 +0000191 aMgr.lockdDeviceTypeToAdapterMap.Lock()
192 defer aMgr.lockdDeviceTypeToAdapterMap.Unlock()
khenaidoo297cd252019-02-07 22:10:23 -0500193 // Update the device types
Stephane Barbarieef6650d2019-07-18 12:15:09 -0400194 if deviceTypesIf := aMgr.clusterDataProxy.List(context.Background(), "/device_types", 0, false, ""); deviceTypesIf != nil {
khenaidoo297cd252019-02-07 22:10:23 -0500195 dTypes := &voltha.DeviceTypes{Items: []*voltha.DeviceType{}}
196 for _, deviceTypeIf := range deviceTypesIf.([]interface{}) {
197 if dType, ok := deviceTypeIf.(*voltha.DeviceType); ok {
198 log.Debugw("found-existing-device-types", log.Fields{"deviceTypes": dTypes})
A R Karthicked2a77b2019-10-08 01:40:51 +0000199 aMgr.updateDeviceTypeWithoutLock(dType)
khenaidoo297cd252019-02-07 22:10:23 -0500200 }
201 }
202 }
203}
204
khenaidoo21d51152019-02-01 13:48:37 -0500205func (aMgr *AdapterManager) addAdapter(adapter *voltha.Adapter, saveToDb bool) {
206 aMgr.lockAdaptersMap.Lock()
207 defer aMgr.lockAdaptersMap.Unlock()
208 log.Debugw("adding-adapter", log.Fields{"adapter": adapter})
209 if _, exist := aMgr.adapterAgents[adapter.Id]; !exist {
210 clonedAdapter := (proto.Clone(adapter)).(*voltha.Adapter)
211 aMgr.adapterAgents[adapter.Id] = newAdapterAgent(clonedAdapter, nil)
212 if saveToDb {
213 // Save the adapter to the KV store - first check if it already exist
Stephane Barbarieef6650d2019-07-18 12:15:09 -0400214 if kvAdapter := aMgr.clusterDataProxy.Get(context.Background(), "/adapters/"+adapter.Id, 0, false, ""); kvAdapter == nil {
215 if added := aMgr.clusterDataProxy.AddWithID(context.Background(), "/adapters", adapter.Id, clonedAdapter, ""); added == nil {
khenaidoo21d51152019-02-01 13:48:37 -0500216 //TODO: Errors when saving to KV would require a separate go routine to be launched and try the saving again
217 log.Errorw("failed-to-save-adapter", log.Fields{"adapter": adapter})
218 } else {
219 log.Debugw("adapter-saved-to-KV-Store", log.Fields{"adapter": adapter})
220 }
221 }
222 }
223 }
224}
225
khenaidoo21d51152019-02-01 13:48:37 -0500226func (aMgr *AdapterManager) addDeviceTypes(deviceTypes *voltha.DeviceTypes, saveToDb bool) {
227 if deviceTypes == nil {
228 return
229 }
230 log.Debugw("adding-device-types", log.Fields{"deviceTypes": deviceTypes})
231 aMgr.lockAdaptersMap.Lock()
232 defer aMgr.lockAdaptersMap.Unlock()
233 aMgr.lockdDeviceTypeToAdapterMap.Lock()
234 defer aMgr.lockdDeviceTypeToAdapterMap.Unlock()
235 for _, deviceType := range deviceTypes.Items {
236 clonedDType := (proto.Clone(deviceType)).(*voltha.DeviceType)
237 if adapterAgent, exist := aMgr.adapterAgents[clonedDType.Adapter]; exist {
238 adapterAgent.updateDeviceType(clonedDType)
239 } else {
240 log.Debugw("adapter-not-exist", log.Fields{"deviceTypes": deviceTypes, "adapterId": clonedDType.Adapter})
khenaidoo1ce37ad2019-03-24 22:07:24 -0400241 aMgr.adapterAgents[clonedDType.Adapter] = newAdapterAgent(&voltha.Adapter{Id: clonedDType.Adapter}, deviceTypes)
khenaidoo21d51152019-02-01 13:48:37 -0500242 }
243 aMgr.deviceTypeToAdapterMap[clonedDType.Id] = clonedDType.Adapter
244 }
245 if saveToDb {
246 // Save the device types to the KV store as well
247 for _, deviceType := range deviceTypes.Items {
Stephane Barbarieef6650d2019-07-18 12:15:09 -0400248 if dType := aMgr.clusterDataProxy.Get(context.Background(), "/device_types/"+deviceType.Id, 0, false, ""); dType == nil {
khenaidoo21d51152019-02-01 13:48:37 -0500249 // Does not exist - save it
250 clonedDType := (proto.Clone(deviceType)).(*voltha.DeviceType)
Stephane Barbarieef6650d2019-07-18 12:15:09 -0400251 if added := aMgr.clusterDataProxy.AddWithID(context.Background(), "/device_types", deviceType.Id, clonedDType, ""); added == nil {
khenaidoo21d51152019-02-01 13:48:37 -0500252 log.Errorw("failed-to-save-deviceType", log.Fields{"deviceType": deviceType})
253 } else {
254 log.Debugw("device-type-saved-to-KV-Store", log.Fields{"deviceType": deviceType})
255 }
256 }
257 }
258 }
259}
260
261func (aMgr *AdapterManager) listAdapters(ctx context.Context) (*voltha.Adapters, error) {
khenaidoo1ce37ad2019-03-24 22:07:24 -0400262 result := &voltha.Adapters{Items: []*voltha.Adapter{}}
263 aMgr.lockAdaptersMap.RLock()
264 defer aMgr.lockAdaptersMap.RUnlock()
khenaidoo21d51152019-02-01 13:48:37 -0500265 for _, adapterAgent := range aMgr.adapterAgents {
266 if a := adapterAgent.getAdapter(); a != nil {
npujar1d86a522019-11-14 17:11:16 +0530267 if a.Id != SentinelAdapterID { // don't report the sentinel
khenaidoo297cd252019-02-07 22:10:23 -0500268 result.Items = append(result.Items, (proto.Clone(a)).(*voltha.Adapter))
269 }
khenaidoo21d51152019-02-01 13:48:37 -0500270 }
271 }
272 return result, nil
273}
274
npujar1d86a522019-11-14 17:11:16 +0530275func (aMgr *AdapterManager) getAdapter(adapterID string) *voltha.Adapter {
khenaidoo1ce37ad2019-03-24 22:07:24 -0400276 aMgr.lockAdaptersMap.RLock()
277 defer aMgr.lockAdaptersMap.RUnlock()
npujar1d86a522019-11-14 17:11:16 +0530278 if adapterAgent, ok := aMgr.adapterAgents[adapterID]; ok {
khenaidoo21d51152019-02-01 13:48:37 -0500279 return adapterAgent.getAdapter()
280 }
281 return nil
282}
283
284//updateAdapter updates an adapter if it exist. Otherwise, it creates it.
khenaidoo1ce37ad2019-03-24 22:07:24 -0400285func (aMgr *AdapterManager) updateAdapter(adapter *voltha.Adapter) {
khenaidoo21d51152019-02-01 13:48:37 -0500286 aMgr.lockAdaptersMap.Lock()
287 defer aMgr.lockAdaptersMap.Unlock()
A R Karthicked2a77b2019-10-08 01:40:51 +0000288 aMgr.updateAdapterWithoutLock(adapter)
289}
290
291func (aMgr *AdapterManager) updateAdapterWithoutLock(adapter *voltha.Adapter) {
khenaidoo21d51152019-02-01 13:48:37 -0500292 if adapterAgent, ok := aMgr.adapterAgents[adapter.Id]; ok {
293 adapterAgent.updateAdapter(adapter)
294 } else {
295 aMgr.adapterAgents[adapter.Id] = newAdapterAgent(adapter, nil)
296 }
297}
298
299//updateDeviceType updates an adapter if it exist. Otherwise, it creates it.
khenaidoo1ce37ad2019-03-24 22:07:24 -0400300func (aMgr *AdapterManager) updateDeviceType(deviceType *voltha.DeviceType) {
khenaidoo21d51152019-02-01 13:48:37 -0500301 aMgr.lockAdaptersMap.Lock()
302 defer aMgr.lockAdaptersMap.Unlock()
303 aMgr.lockdDeviceTypeToAdapterMap.Lock()
304 defer aMgr.lockdDeviceTypeToAdapterMap.Unlock()
A R Karthicked2a77b2019-10-08 01:40:51 +0000305 aMgr.updateDeviceTypeWithoutLock(deviceType)
306}
307
308func (aMgr *AdapterManager) updateDeviceTypeWithoutLock(deviceType *voltha.DeviceType) {
khenaidoo297cd252019-02-07 22:10:23 -0500309 if adapterAgent, exist := aMgr.adapterAgents[deviceType.Adapter]; exist {
khenaidoo21d51152019-02-01 13:48:37 -0500310 adapterAgent.updateDeviceType(deviceType)
311 } else {
312 aMgr.adapterAgents[deviceType.Adapter] = newAdapterAgent(&voltha.Adapter{Id: deviceType.Adapter},
khenaidoo1ce37ad2019-03-24 22:07:24 -0400313 &voltha.DeviceTypes{Items: []*voltha.DeviceType{deviceType}})
khenaidoo21d51152019-02-01 13:48:37 -0500314 }
315 aMgr.deviceTypeToAdapterMap[deviceType.Id] = deviceType.Adapter
316}
317
khenaidoo1ce37ad2019-03-24 22:07:24 -0400318func (aMgr *AdapterManager) registerAdapter(adapter *voltha.Adapter, deviceTypes *voltha.DeviceTypes) *voltha.CoreInstance {
khenaidoo21d51152019-02-01 13:48:37 -0500319 log.Debugw("registerAdapter", log.Fields{"adapter": adapter, "deviceTypes": deviceTypes.Items})
320
321 if aMgr.getAdapter(adapter.Id) != nil {
khenaidooba6b6c42019-08-02 09:11:56 -0400322 // Already registered - Adapter may have restarted. Trigger the reconcile process for that adapter
npujar1d86a522019-11-14 17:11:16 +0530323 go func() {
324 err := aMgr.deviceMgr.adapterRestarted(adapter)
325 if err != nil {
326 log.Errorw("unable-to-restart-adapter", log.Fields{"error": err})
327 }
328 }()
329 return &voltha.CoreInstance{InstanceId: aMgr.coreInstanceID}
khenaidoo21d51152019-02-01 13:48:37 -0500330 }
331 // Save the adapter and the device types
332 aMgr.addAdapter(adapter, true)
333 aMgr.addDeviceTypes(deviceTypes, true)
334
335 log.Debugw("adapter-registered", log.Fields{"adapter": adapter.Id})
336
npujar1d86a522019-11-14 17:11:16 +0530337 return &voltha.CoreInstance{InstanceId: aMgr.coreInstanceID}
khenaidoo21d51152019-02-01 13:48:37 -0500338}
339
340//getAdapterName returns the name of the device adapter that service this device type
341func (aMgr *AdapterManager) getAdapterName(deviceType string) (string, error) {
342 aMgr.lockdDeviceTypeToAdapterMap.Lock()
343 defer aMgr.lockdDeviceTypeToAdapterMap.Unlock()
npujar1d86a522019-11-14 17:11:16 +0530344 if adapterID, exist := aMgr.deviceTypeToAdapterMap[deviceType]; exist {
345 return adapterID, nil
khenaidoo21d51152019-02-01 13:48:37 -0500346 }
npujar1d86a522019-11-14 17:11:16 +0530347 return "", fmt.Errorf("Adapter-not-registered-for-device-type %s", deviceType)
khenaidoo21d51152019-02-01 13:48:37 -0500348}
349
Kent Hagermanc2c73ff2019-11-20 16:22:32 -0500350func (aMgr *AdapterManager) listDeviceTypes() []*voltha.DeviceType {
351 aMgr.lockdDeviceTypeToAdapterMap.Lock()
352 defer aMgr.lockdDeviceTypeToAdapterMap.Unlock()
353
354 deviceTypes := make([]*voltha.DeviceType, 0, len(aMgr.deviceTypeToAdapterMap))
npujar1d86a522019-11-14 17:11:16 +0530355 for deviceTypeID, adapterID := range aMgr.deviceTypeToAdapterMap {
356 if adapterAgent, have := aMgr.adapterAgents[adapterID]; have {
357 if deviceType := adapterAgent.getDeviceType(deviceTypeID); deviceType != nil {
Kent Hagermanc2c73ff2019-11-20 16:22:32 -0500358 deviceTypes = append(deviceTypes, deviceType)
359 }
360 }
361 }
362 return deviceTypes
363}
364
khenaidoo21d51152019-02-01 13:48:37 -0500365// getDeviceType returns the device type proto definition given the name of the device type
khenaidoo1ce37ad2019-03-24 22:07:24 -0400366func (aMgr *AdapterManager) getDeviceType(deviceType string) *voltha.DeviceType {
khenaidoo21d51152019-02-01 13:48:37 -0500367 aMgr.lockdDeviceTypeToAdapterMap.Lock()
368 defer aMgr.lockdDeviceTypeToAdapterMap.Unlock()
Kent Hagermanc2c73ff2019-11-20 16:22:32 -0500369
npujar1d86a522019-11-14 17:11:16 +0530370 if adapterID, exist := aMgr.deviceTypeToAdapterMap[deviceType]; exist {
371 if adapterAgent := aMgr.adapterAgents[adapterID]; adapterAgent != nil {
khenaidoo21d51152019-02-01 13:48:37 -0500372 return adapterAgent.getDeviceType(deviceType)
373 }
374 }
375 return nil
376}
377
378//adapterUpdated is a callback invoked when an adapter change has been noticed
379func (aMgr *AdapterManager) adapterUpdated(args ...interface{}) interface{} {
380 log.Debugw("updateAdapter-callback", log.Fields{"argsLen": len(args)})
381
382 var previousData *voltha.Adapters
383 var latestData *voltha.Adapters
384
385 var ok bool
386 if previousData, ok = args[0].(*voltha.Adapters); !ok {
387 log.Errorw("invalid-args", log.Fields{"args0": args[0]})
khenaidoo433f54a2019-02-05 14:02:57 -0500388 return nil
khenaidoo21d51152019-02-01 13:48:37 -0500389 }
390 if latestData, ok = args[1].(*voltha.Adapters); !ok {
391 log.Errorw("invalid-args", log.Fields{"args1": args[1]})
khenaidoo21d51152019-02-01 13:48:37 -0500392 return nil
393 }
394
khenaidoo433f54a2019-02-05 14:02:57 -0500395 if previousData != nil && latestData != nil {
396 if reflect.DeepEqual(previousData.Items, latestData.Items) {
397 log.Debug("update-not-required")
398 return nil
399 }
khenaidoo21d51152019-02-01 13:48:37 -0500400 }
khenaidoo433f54a2019-02-05 14:02:57 -0500401
402 if latestData != nil {
403 for _, adapter := range latestData.Items {
404 aMgr.updateAdapter(adapter)
405 }
406 }
407
khenaidoo21d51152019-02-01 13:48:37 -0500408 return nil
409}
410
411//deviceTypesUpdated is a callback invoked when a device type change has been noticed
412func (aMgr *AdapterManager) deviceTypesUpdated(args ...interface{}) interface{} {
413 log.Debugw("deviceTypesUpdated-callback", log.Fields{"argsLen": len(args)})
414
415 var previousData *voltha.DeviceTypes
416 var latestData *voltha.DeviceTypes
417
418 var ok bool
419 if previousData, ok = args[0].(*voltha.DeviceTypes); !ok {
420 log.Errorw("invalid-args", log.Fields{"args0": args[0]})
khenaidoo21d51152019-02-01 13:48:37 -0500421 return nil
422 }
423
khenaidoo433f54a2019-02-05 14:02:57 -0500424 if latestData, ok = args[1].(*voltha.DeviceTypes); !ok {
425 log.Errorw("invalid-args", log.Fields{"args1": args[1]})
426 return nil
427 }
428
429 if previousData != nil && latestData != nil {
430 if reflect.DeepEqual(previousData.Items, latestData.Items) {
431 log.Debug("update-not-required")
432 return nil
433 }
434 }
435
436 if latestData != nil {
437 for _, dType := range latestData.Items {
438 aMgr.updateDeviceType(dType)
439 }
khenaidoo21d51152019-02-01 13:48:37 -0500440 }
441 return nil
khenaidoo1ce37ad2019-03-24 22:07:24 -0400442}