blob: 1ed5b23d6e9557d75966a3071c9f02a18364043d [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 "sync"
Kent Hagerman16ce36a2019-12-17 13:40:53 -050023 "time"
npujar1d86a522019-11-14 17:11:16 +053024
David Bainbridged1afd662020-03-26 18:27:41 -070025 "github.com/golang/protobuf/ptypes"
26 "github.com/opencord/voltha-lib-go/v3/pkg/kafka"
27
khenaidoo21d51152019-02-01 13:48:37 -050028 "github.com/gogo/protobuf/proto"
sbarbari17d7e222019-11-05 10:02:29 -050029 "github.com/opencord/voltha-go/db/model"
serkant.uluderya2ae470f2020-01-21 11:13:09 -080030 "github.com/opencord/voltha-lib-go/v3/pkg/log"
31 "github.com/opencord/voltha-lib-go/v3/pkg/probe"
32 "github.com/opencord/voltha-protos/v3/go/voltha"
khenaidoo21d51152019-02-01 13:48:37 -050033)
34
npujar1d86a522019-11-14 17:11:16 +053035// sentinel constants
khenaidoo21d51152019-02-01 13:48:37 -050036const (
npujar1d86a522019-11-14 17:11:16 +053037 SentinelAdapterID = "adapter_sentinel"
38 SentinelDevicetypeID = "device_type_sentinel"
khenaidoo21d51152019-02-01 13:48:37 -050039)
40
npujar1d86a522019-11-14 17:11:16 +053041// AdapterAgent represents adapter agent
khenaidoo21d51152019-02-01 13:48:37 -050042type AdapterAgent struct {
khenaidoo1ce37ad2019-03-24 22:07:24 -040043 adapter *voltha.Adapter
khenaidoo21d51152019-02-01 13:48:37 -050044 deviceTypes map[string]*voltha.DeviceType
khenaidoo1ce37ad2019-03-24 22:07:24 -040045 lock sync.RWMutex
khenaidoo21d51152019-02-01 13:48:37 -050046}
47
48func newAdapterAgent(adapter *voltha.Adapter, deviceTypes *voltha.DeviceTypes) *AdapterAgent {
49 var adapterAgent AdapterAgent
50 adapterAgent.adapter = adapter
51 adapterAgent.lock = sync.RWMutex{}
52 adapterAgent.deviceTypes = make(map[string]*voltha.DeviceType)
53 if deviceTypes != nil {
54 for _, dType := range deviceTypes.Items {
55 adapterAgent.deviceTypes[dType.Id] = dType
56 }
57 }
58 return &adapterAgent
59}
60
khenaidoo21d51152019-02-01 13:48:37 -050061func (aa *AdapterAgent) getDeviceType(deviceType string) *voltha.DeviceType {
62 aa.lock.RLock()
63 defer aa.lock.RUnlock()
64 if _, exist := aa.deviceTypes[deviceType]; exist {
65 return aa.deviceTypes[deviceType]
66 }
67 return nil
68}
69
70func (aa *AdapterAgent) getAdapter() *voltha.Adapter {
71 aa.lock.RLock()
72 defer aa.lock.RUnlock()
Girish Kumarf56a4682020-03-20 20:07:46 +000073 logger.Debugw("getAdapter", log.Fields{"adapter": aa.adapter})
khenaidoo21d51152019-02-01 13:48:37 -050074 return aa.adapter
75}
76
khenaidoo1ce37ad2019-03-24 22:07:24 -040077func (aa *AdapterAgent) updateDeviceType(deviceType *voltha.DeviceType) {
78 aa.lock.Lock()
79 defer aa.lock.Unlock()
khenaidoo21d51152019-02-01 13:48:37 -050080 aa.deviceTypes[deviceType.Id] = deviceType
81}
82
Kent Hagerman16ce36a2019-12-17 13:40:53 -050083// updateCommunicationTime updates the message to the specified time.
84// No attempt is made to save the time to the db, so only recent times are guaranteed to be accurate.
85func (aa *AdapterAgent) updateCommunicationTime(new time.Time) {
86 // only update if new time is not in the future, and either the old time is invalid or new time > old time
87 if last, err := ptypes.Timestamp(aa.adapter.LastCommunication); !new.After(time.Now()) && (err != nil || new.After(last)) {
88 timestamp, err := ptypes.TimestampProto(new)
89 if err != nil {
90 return // if the new time cannot be encoded, just ignore it
91 }
92
93 aa.lock.Lock()
94 defer aa.lock.Unlock()
95 aa.adapter.LastCommunication = timestamp
96 }
97}
98
npujar1d86a522019-11-14 17:11:16 +053099// AdapterManager represents adapter manager attributes
khenaidoo21d51152019-02-01 13:48:37 -0500100type AdapterManager struct {
101 adapterAgents map[string]*AdapterAgent
102 deviceTypeToAdapterMap map[string]string
103 clusterDataProxy *model.Proxy
khenaidooba6b6c42019-08-02 09:11:56 -0400104 deviceMgr *DeviceManager
npujar1d86a522019-11-14 17:11:16 +0530105 coreInstanceID string
khenaidoo21d51152019-02-01 13:48:37 -0500106 exitChannel chan int
107 lockAdaptersMap sync.RWMutex
108 lockdDeviceTypeToAdapterMap sync.RWMutex
109}
110
Kent Hagerman16ce36a2019-12-17 13:40:53 -0500111func newAdapterManager(cdProxy *model.Proxy, coreInstanceID string, kafkaClient kafka.Client, deviceMgr *DeviceManager) *AdapterManager {
112 aMgr := &AdapterManager{
113 exitChannel: make(chan int, 1),
114 coreInstanceID: coreInstanceID,
115 clusterDataProxy: cdProxy,
116 adapterAgents: make(map[string]*AdapterAgent),
117 deviceTypeToAdapterMap: make(map[string]string),
118 deviceMgr: deviceMgr,
119 }
120 kafkaClient.SubscribeForMetadata(aMgr.updateLastAdapterCommunication)
121 return aMgr
khenaidoo21d51152019-02-01 13:48:37 -0500122}
123
Thomas Lee Se5a44012019-11-07 20:32:24 +0530124func (aMgr *AdapterManager) start(ctx context.Context) error {
Girish Kumarf56a4682020-03-20 20:07:46 +0000125 logger.Info("starting-adapter-manager")
khenaidoo21d51152019-02-01 13:48:37 -0500126
127 // Load the existing adapterAgents and device types - this will also ensure the correct paths have been
128 // created if there are no data in the dB to start
Thomas Lee Se5a44012019-11-07 20:32:24 +0530129 err := aMgr.loadAdaptersAndDevicetypesInMemory()
130 if err != nil {
Girish Kumarf56a4682020-03-20 20:07:46 +0000131 logger.Errorw("Failed-to-load-adapters-and-device-types-in-memeory", log.Fields{"error": err})
Thomas Lee Se5a44012019-11-07 20:32:24 +0530132 return err
133 }
khenaidoo21d51152019-02-01 13:48:37 -0500134
David K. Bainbridgeb4a9ab02019-09-20 15:12:16 -0700135 probe.UpdateStatusFromContext(ctx, "adapter-manager", probe.ServiceStatusRunning)
Girish Kumarf56a4682020-03-20 20:07:46 +0000136 logger.Info("adapter-manager-started")
Thomas Lee Se5a44012019-11-07 20:32:24 +0530137 return nil
khenaidoo21d51152019-02-01 13:48:37 -0500138}
139
khenaidoo21d51152019-02-01 13:48:37 -0500140//loadAdaptersAndDevicetypesInMemory loads the existing set of adapters and device types in memory
Thomas Lee Se5a44012019-11-07 20:32:24 +0530141func (aMgr *AdapterManager) loadAdaptersAndDevicetypesInMemory() error {
khenaidoo21d51152019-02-01 13:48:37 -0500142 // Load the adapters
Kent Hagerman4f355f52020-03-30 16:01:33 -0400143 var adapters []*voltha.Adapter
144 if err := aMgr.clusterDataProxy.List(context.Background(), "adapters", &adapters); err != nil {
Girish Kumarf56a4682020-03-20 20:07:46 +0000145 logger.Errorw("Failed-to-list-adapters-from-cluster-data-proxy", log.Fields{"error": err})
Thomas Lee Se5a44012019-11-07 20:32:24 +0530146 return err
147 }
Kent Hagerman4f355f52020-03-30 16:01:33 -0400148 if len(adapters) != 0 {
149 for _, adapter := range adapters {
150 if err := aMgr.addAdapter(adapter, false); err != nil {
151 logger.Errorw("failed to add adapter", log.Fields{"adapterId": adapter.Id})
152 } else {
153 logger.Debugw("adapter added successfully", log.Fields{"adapterId": adapter.Id})
khenaidoo21d51152019-02-01 13:48:37 -0500154 }
155 }
156 } else {
Girish Kumarf56a4682020-03-20 20:07:46 +0000157 logger.Debug("no-existing-adapter-found")
khenaidoo21d51152019-02-01 13:48:37 -0500158 // No adapter data. In order to have a proxy setup for that path let's create a fake adapter
Thomas Lee Se5a44012019-11-07 20:32:24 +0530159 return aMgr.addAdapter(&voltha.Adapter{Id: SentinelAdapterID}, true)
khenaidoo21d51152019-02-01 13:48:37 -0500160 }
161
162 // Load the device types
Kent Hagerman4f355f52020-03-30 16:01:33 -0400163 var deviceTypes []*voltha.DeviceType
164 if err := aMgr.clusterDataProxy.List(context.Background(), "device_types", &deviceTypes); err != nil {
Girish Kumarf56a4682020-03-20 20:07:46 +0000165 logger.Errorw("Failed-to-list-device-types-from-cluster-data-proxy", log.Fields{"error": err})
Thomas Lee Se5a44012019-11-07 20:32:24 +0530166 return err
167 }
Kent Hagerman4f355f52020-03-30 16:01:33 -0400168 if len(deviceTypes) != 0 {
khenaidoo1ce37ad2019-03-24 22:07:24 -0400169 dTypes := &voltha.DeviceTypes{Items: []*voltha.DeviceType{}}
Kent Hagerman4f355f52020-03-30 16:01:33 -0400170 for _, dType := range deviceTypes {
171 logger.Debugw("found-existing-device-types", log.Fields{"deviceTypes": dTypes})
172 dTypes.Items = append(dTypes.Items, dType)
khenaidoo21d51152019-02-01 13:48:37 -0500173 }
Thomas Lee Se5a44012019-11-07 20:32:24 +0530174 return aMgr.addDeviceTypes(dTypes, false)
khenaidoo21d51152019-02-01 13:48:37 -0500175 }
Thomas Lee Se5a44012019-11-07 20:32:24 +0530176
Girish Kumarf56a4682020-03-20 20:07:46 +0000177 logger.Debug("no-existing-device-type-found")
Thomas Lee Se5a44012019-11-07 20:32:24 +0530178 // No device types data. In order to have a proxy setup for that path let's create a fake device type
179 return aMgr.addDeviceTypes(&voltha.DeviceTypes{Items: []*voltha.DeviceType{{Id: SentinelDevicetypeID, Adapter: SentinelAdapterID}}}, true)
khenaidoo21d51152019-02-01 13:48:37 -0500180}
181
Kent Hagerman16ce36a2019-12-17 13:40:53 -0500182func (aMgr *AdapterManager) updateLastAdapterCommunication(adapterID string, timestamp int64) {
183 aMgr.lockAdaptersMap.RLock()
184 adapterAgent, have := aMgr.adapterAgents[adapterID]
185 aMgr.lockAdaptersMap.RUnlock()
186
187 if have {
188 adapterAgent.updateCommunicationTime(time.Unix(timestamp/1000, timestamp%1000*1000))
189 }
190}
191
Thomas Lee Se5a44012019-11-07 20:32:24 +0530192func (aMgr *AdapterManager) addAdapter(adapter *voltha.Adapter, saveToDb bool) error {
khenaidoo21d51152019-02-01 13:48:37 -0500193 aMgr.lockAdaptersMap.Lock()
194 defer aMgr.lockAdaptersMap.Unlock()
Girish Kumarf56a4682020-03-20 20:07:46 +0000195 logger.Debugw("adding-adapter", log.Fields{"adapter": adapter})
khenaidoo21d51152019-02-01 13:48:37 -0500196 if _, exist := aMgr.adapterAgents[adapter.Id]; !exist {
khenaidoo21d51152019-02-01 13:48:37 -0500197 if saveToDb {
198 // Save the adapter to the KV store - first check if it already exist
Kent Hagerman4f355f52020-03-30 16:01:33 -0400199 if have, err := aMgr.clusterDataProxy.Get(context.Background(), "adapters/"+adapter.Id, &voltha.Adapter{}); err != nil {
Girish Kumarf56a4682020-03-20 20:07:46 +0000200 logger.Errorw("failed-to-get-adapters-from-cluster-proxy", log.Fields{"error": err})
Thomas Lee Se5a44012019-11-07 20:32:24 +0530201 return err
Kent Hagerman4f355f52020-03-30 16:01:33 -0400202 } else if !have {
203 if err := aMgr.clusterDataProxy.AddWithID(context.Background(), "adapters", adapter.Id, adapter); err != nil {
Girish Kumarf56a4682020-03-20 20:07:46 +0000204 logger.Errorw("failed-to-save-adapter-to-cluster-proxy", log.Fields{"error": err})
Thomas Lee Se5a44012019-11-07 20:32:24 +0530205 return err
206 }
Kent Hagermand9cc2e92019-11-04 13:28:15 -0500207 logger.Debugw("adapter-saved-to-KV-Store", log.Fields{"adapter": adapter})
khenaidoo21d51152019-02-01 13:48:37 -0500208 }
209 }
Kent Hagermand9cc2e92019-11-04 13:28:15 -0500210 clonedAdapter := (proto.Clone(adapter)).(*voltha.Adapter)
211 aMgr.adapterAgents[adapter.Id] = newAdapterAgent(clonedAdapter, nil)
khenaidoo21d51152019-02-01 13:48:37 -0500212 }
Thomas Lee Se5a44012019-11-07 20:32:24 +0530213 return nil
khenaidoo21d51152019-02-01 13:48:37 -0500214}
215
Thomas Lee Se5a44012019-11-07 20:32:24 +0530216func (aMgr *AdapterManager) addDeviceTypes(deviceTypes *voltha.DeviceTypes, saveToDb bool) error {
khenaidoo21d51152019-02-01 13:48:37 -0500217 if deviceTypes == nil {
Thomas Lee Se5a44012019-11-07 20:32:24 +0530218 return fmt.Errorf("no-device-type")
khenaidoo21d51152019-02-01 13:48:37 -0500219 }
Girish Kumarf56a4682020-03-20 20:07:46 +0000220 logger.Debugw("adding-device-types", log.Fields{"deviceTypes": deviceTypes})
khenaidoo21d51152019-02-01 13:48:37 -0500221 aMgr.lockAdaptersMap.Lock()
222 defer aMgr.lockAdaptersMap.Unlock()
223 aMgr.lockdDeviceTypeToAdapterMap.Lock()
224 defer aMgr.lockdDeviceTypeToAdapterMap.Unlock()
Kent Hagermand9cc2e92019-11-04 13:28:15 -0500225
khenaidoo21d51152019-02-01 13:48:37 -0500226 if saveToDb {
Kent Hagermand9cc2e92019-11-04 13:28:15 -0500227 // Save the device types to the KV store
khenaidoo21d51152019-02-01 13:48:37 -0500228 for _, deviceType := range deviceTypes.Items {
Kent Hagerman4f355f52020-03-30 16:01:33 -0400229 if have, err := aMgr.clusterDataProxy.Get(context.Background(), "device_types/"+deviceType.Id, &voltha.DeviceType{}); err != nil {
Girish Kumarf56a4682020-03-20 20:07:46 +0000230 logger.Errorw("Failed-to--device-types-from-cluster-data-proxy", log.Fields{"error": err})
Thomas Lee Se5a44012019-11-07 20:32:24 +0530231 return err
Kent Hagerman4f355f52020-03-30 16:01:33 -0400232 } else if !have {
khenaidoo21d51152019-02-01 13:48:37 -0500233 // Does not exist - save it
234 clonedDType := (proto.Clone(deviceType)).(*voltha.DeviceType)
Kent Hagerman4f355f52020-03-30 16:01:33 -0400235 if err := aMgr.clusterDataProxy.AddWithID(context.Background(), "device_types", deviceType.Id, clonedDType); err != nil {
Girish Kumarf56a4682020-03-20 20:07:46 +0000236 logger.Errorw("Failed-to-add-device-types-to-cluster-data-proxy", log.Fields{"error": err})
Thomas Lee Se5a44012019-11-07 20:32:24 +0530237 return err
238 }
Kent Hagermand9cc2e92019-11-04 13:28:15 -0500239 logger.Debugw("device-type-saved-to-KV-Store", log.Fields{"deviceType": deviceType})
khenaidoo21d51152019-02-01 13:48:37 -0500240 }
241 }
242 }
Kent Hagermand9cc2e92019-11-04 13:28:15 -0500243 // and save locally
244 for _, deviceType := range deviceTypes.Items {
245 clonedDType := (proto.Clone(deviceType)).(*voltha.DeviceType)
246 if adapterAgent, exist := aMgr.adapterAgents[clonedDType.Adapter]; exist {
247 adapterAgent.updateDeviceType(clonedDType)
248 } else {
249 logger.Debugw("adapter-not-exist", log.Fields{"deviceTypes": deviceTypes, "adapterId": clonedDType.Adapter})
250 aMgr.adapterAgents[clonedDType.Adapter] = newAdapterAgent(&voltha.Adapter{Id: clonedDType.Adapter}, deviceTypes)
251 }
252 aMgr.deviceTypeToAdapterMap[clonedDType.Id] = clonedDType.Adapter
253 }
Thomas Lee Se5a44012019-11-07 20:32:24 +0530254 return nil
khenaidoo21d51152019-02-01 13:48:37 -0500255}
256
257func (aMgr *AdapterManager) listAdapters(ctx context.Context) (*voltha.Adapters, error) {
khenaidoo1ce37ad2019-03-24 22:07:24 -0400258 result := &voltha.Adapters{Items: []*voltha.Adapter{}}
259 aMgr.lockAdaptersMap.RLock()
260 defer aMgr.lockAdaptersMap.RUnlock()
khenaidoo21d51152019-02-01 13:48:37 -0500261 for _, adapterAgent := range aMgr.adapterAgents {
262 if a := adapterAgent.getAdapter(); a != nil {
npujar1d86a522019-11-14 17:11:16 +0530263 if a.Id != SentinelAdapterID { // don't report the sentinel
khenaidoo297cd252019-02-07 22:10:23 -0500264 result.Items = append(result.Items, (proto.Clone(a)).(*voltha.Adapter))
265 }
khenaidoo21d51152019-02-01 13:48:37 -0500266 }
267 }
268 return result, nil
269}
270
npujar1d86a522019-11-14 17:11:16 +0530271func (aMgr *AdapterManager) getAdapter(adapterID string) *voltha.Adapter {
khenaidoo1ce37ad2019-03-24 22:07:24 -0400272 aMgr.lockAdaptersMap.RLock()
273 defer aMgr.lockAdaptersMap.RUnlock()
npujar1d86a522019-11-14 17:11:16 +0530274 if adapterAgent, ok := aMgr.adapterAgents[adapterID]; ok {
khenaidoo21d51152019-02-01 13:48:37 -0500275 return adapterAgent.getAdapter()
276 }
277 return nil
278}
279
Thomas Lee Se5a44012019-11-07 20:32:24 +0530280func (aMgr *AdapterManager) registerAdapter(adapter *voltha.Adapter, deviceTypes *voltha.DeviceTypes) (*voltha.CoreInstance, error) {
Girish Kumarf56a4682020-03-20 20:07:46 +0000281 logger.Debugw("registerAdapter", log.Fields{"adapter": adapter, "deviceTypes": deviceTypes.Items})
khenaidoo21d51152019-02-01 13:48:37 -0500282
283 if aMgr.getAdapter(adapter.Id) != nil {
khenaidooba6b6c42019-08-02 09:11:56 -0400284 // Already registered - Adapter may have restarted. Trigger the reconcile process for that adapter
npujar1d86a522019-11-14 17:11:16 +0530285 go func() {
npujar467fe752020-01-16 20:17:45 +0530286 err := aMgr.deviceMgr.adapterRestarted(context.Background(), adapter)
npujar1d86a522019-11-14 17:11:16 +0530287 if err != nil {
Girish Kumarf56a4682020-03-20 20:07:46 +0000288 logger.Errorw("unable-to-restart-adapter", log.Fields{"error": err})
npujar1d86a522019-11-14 17:11:16 +0530289 }
290 }()
Thomas Lee Se5a44012019-11-07 20:32:24 +0530291 return &voltha.CoreInstance{InstanceId: aMgr.coreInstanceID}, nil
khenaidoo21d51152019-02-01 13:48:37 -0500292 }
293 // Save the adapter and the device types
Thomas Lee Se5a44012019-11-07 20:32:24 +0530294 if err := aMgr.addAdapter(adapter, true); err != nil {
Girish Kumarf56a4682020-03-20 20:07:46 +0000295 logger.Errorw("failed-to-add-adapter", log.Fields{"error": err})
Thomas Lee Se5a44012019-11-07 20:32:24 +0530296 return nil, err
297 }
298 if err := aMgr.addDeviceTypes(deviceTypes, true); err != nil {
Girish Kumarf56a4682020-03-20 20:07:46 +0000299 logger.Errorw("failed-to-add-device-types", log.Fields{"error": err})
Thomas Lee Se5a44012019-11-07 20:32:24 +0530300 return nil, err
301 }
khenaidoo21d51152019-02-01 13:48:37 -0500302
Girish Kumarf56a4682020-03-20 20:07:46 +0000303 logger.Debugw("adapter-registered", log.Fields{"adapter": adapter.Id})
khenaidoo21d51152019-02-01 13:48:37 -0500304
Thomas Lee Se5a44012019-11-07 20:32:24 +0530305 return &voltha.CoreInstance{InstanceId: aMgr.coreInstanceID}, nil
khenaidoo21d51152019-02-01 13:48:37 -0500306}
307
308//getAdapterName returns the name of the device adapter that service this device type
309func (aMgr *AdapterManager) getAdapterName(deviceType string) (string, error) {
310 aMgr.lockdDeviceTypeToAdapterMap.Lock()
311 defer aMgr.lockdDeviceTypeToAdapterMap.Unlock()
npujar1d86a522019-11-14 17:11:16 +0530312 if adapterID, exist := aMgr.deviceTypeToAdapterMap[deviceType]; exist {
313 return adapterID, nil
khenaidoo21d51152019-02-01 13:48:37 -0500314 }
npujar1d86a522019-11-14 17:11:16 +0530315 return "", fmt.Errorf("Adapter-not-registered-for-device-type %s", deviceType)
khenaidoo21d51152019-02-01 13:48:37 -0500316}
317
Kent Hagermanc2c73ff2019-11-20 16:22:32 -0500318func (aMgr *AdapterManager) listDeviceTypes() []*voltha.DeviceType {
319 aMgr.lockdDeviceTypeToAdapterMap.Lock()
320 defer aMgr.lockdDeviceTypeToAdapterMap.Unlock()
321
322 deviceTypes := make([]*voltha.DeviceType, 0, len(aMgr.deviceTypeToAdapterMap))
npujar1d86a522019-11-14 17:11:16 +0530323 for deviceTypeID, adapterID := range aMgr.deviceTypeToAdapterMap {
324 if adapterAgent, have := aMgr.adapterAgents[adapterID]; have {
325 if deviceType := adapterAgent.getDeviceType(deviceTypeID); deviceType != nil {
khenaidoob64fc8a2019-11-27 15:08:19 -0500326 if deviceType.Id != SentinelDevicetypeID { // don't report the sentinel
327 deviceTypes = append(deviceTypes, deviceType)
328 }
Kent Hagermanc2c73ff2019-11-20 16:22:32 -0500329 }
330 }
331 }
332 return deviceTypes
333}
334
khenaidoo21d51152019-02-01 13:48:37 -0500335// getDeviceType returns the device type proto definition given the name of the device type
khenaidoo1ce37ad2019-03-24 22:07:24 -0400336func (aMgr *AdapterManager) getDeviceType(deviceType string) *voltha.DeviceType {
khenaidoo21d51152019-02-01 13:48:37 -0500337 aMgr.lockdDeviceTypeToAdapterMap.Lock()
338 defer aMgr.lockdDeviceTypeToAdapterMap.Unlock()
Kent Hagermanc2c73ff2019-11-20 16:22:32 -0500339
npujar1d86a522019-11-14 17:11:16 +0530340 if adapterID, exist := aMgr.deviceTypeToAdapterMap[deviceType]; exist {
341 if adapterAgent := aMgr.adapterAgents[adapterID]; adapterAgent != nil {
khenaidoo21d51152019-02-01 13:48:37 -0500342 return adapterAgent.getDeviceType(deviceType)
343 }
344 }
345 return nil
346}