blob: 383600d4491c00cffd9bc7b609a3012b20638f44 [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"
Kent Hagermand9cc2e92019-11-04 13:28:15 -050021 "errors"
khenaidoo21d51152019-02-01 13:48:37 -050022 "fmt"
npujar1d86a522019-11-14 17:11:16 +053023 "sync"
Kent Hagerman16ce36a2019-12-17 13:40:53 -050024 "time"
npujar1d86a522019-11-14 17:11:16 +053025
David Bainbridged1afd662020-03-26 18:27:41 -070026 "github.com/golang/protobuf/ptypes"
27 "github.com/opencord/voltha-lib-go/v3/pkg/kafka"
28
khenaidoo21d51152019-02-01 13:48:37 -050029 "github.com/gogo/protobuf/proto"
sbarbari17d7e222019-11-05 10:02:29 -050030 "github.com/opencord/voltha-go/db/model"
serkant.uluderya2ae470f2020-01-21 11:13:09 -080031 "github.com/opencord/voltha-lib-go/v3/pkg/log"
32 "github.com/opencord/voltha-lib-go/v3/pkg/probe"
33 "github.com/opencord/voltha-protos/v3/go/voltha"
khenaidoo21d51152019-02-01 13:48:37 -050034)
35
npujar1d86a522019-11-14 17:11:16 +053036// sentinel constants
khenaidoo21d51152019-02-01 13:48:37 -050037const (
npujar1d86a522019-11-14 17:11:16 +053038 SentinelAdapterID = "adapter_sentinel"
39 SentinelDevicetypeID = "device_type_sentinel"
khenaidoo21d51152019-02-01 13:48:37 -050040)
41
npujar1d86a522019-11-14 17:11:16 +053042// AdapterAgent represents adapter agent
khenaidoo21d51152019-02-01 13:48:37 -050043type AdapterAgent struct {
khenaidoo1ce37ad2019-03-24 22:07:24 -040044 adapter *voltha.Adapter
khenaidoo21d51152019-02-01 13:48:37 -050045 deviceTypes map[string]*voltha.DeviceType
khenaidoo1ce37ad2019-03-24 22:07:24 -040046 lock sync.RWMutex
khenaidoo21d51152019-02-01 13:48:37 -050047}
48
49func newAdapterAgent(adapter *voltha.Adapter, deviceTypes *voltha.DeviceTypes) *AdapterAgent {
50 var adapterAgent AdapterAgent
51 adapterAgent.adapter = adapter
52 adapterAgent.lock = sync.RWMutex{}
53 adapterAgent.deviceTypes = make(map[string]*voltha.DeviceType)
54 if deviceTypes != nil {
55 for _, dType := range deviceTypes.Items {
56 adapterAgent.deviceTypes[dType.Id] = dType
57 }
58 }
59 return &adapterAgent
60}
61
khenaidoo21d51152019-02-01 13:48:37 -050062func (aa *AdapterAgent) getDeviceType(deviceType string) *voltha.DeviceType {
63 aa.lock.RLock()
64 defer aa.lock.RUnlock()
65 if _, exist := aa.deviceTypes[deviceType]; exist {
66 return aa.deviceTypes[deviceType]
67 }
68 return nil
69}
70
71func (aa *AdapterAgent) getAdapter() *voltha.Adapter {
72 aa.lock.RLock()
73 defer aa.lock.RUnlock()
Girish Kumarf56a4682020-03-20 20:07:46 +000074 logger.Debugw("getAdapter", log.Fields{"adapter": aa.adapter})
khenaidoo21d51152019-02-01 13:48:37 -050075 return aa.adapter
76}
77
khenaidoo1ce37ad2019-03-24 22:07:24 -040078func (aa *AdapterAgent) updateDeviceType(deviceType *voltha.DeviceType) {
79 aa.lock.Lock()
80 defer aa.lock.Unlock()
khenaidoo21d51152019-02-01 13:48:37 -050081 aa.deviceTypes[deviceType.Id] = deviceType
82}
83
Kent Hagerman16ce36a2019-12-17 13:40:53 -050084// updateCommunicationTime updates the message to the specified time.
85// No attempt is made to save the time to the db, so only recent times are guaranteed to be accurate.
86func (aa *AdapterAgent) updateCommunicationTime(new time.Time) {
87 // only update if new time is not in the future, and either the old time is invalid or new time > old time
88 if last, err := ptypes.Timestamp(aa.adapter.LastCommunication); !new.After(time.Now()) && (err != nil || new.After(last)) {
89 timestamp, err := ptypes.TimestampProto(new)
90 if err != nil {
91 return // if the new time cannot be encoded, just ignore it
92 }
93
94 aa.lock.Lock()
95 defer aa.lock.Unlock()
96 aa.adapter.LastCommunication = timestamp
97 }
98}
99
npujar1d86a522019-11-14 17:11:16 +0530100// AdapterManager represents adapter manager attributes
khenaidoo21d51152019-02-01 13:48:37 -0500101type AdapterManager struct {
102 adapterAgents map[string]*AdapterAgent
103 deviceTypeToAdapterMap map[string]string
104 clusterDataProxy *model.Proxy
khenaidooba6b6c42019-08-02 09:11:56 -0400105 deviceMgr *DeviceManager
npujar1d86a522019-11-14 17:11:16 +0530106 coreInstanceID string
khenaidoo21d51152019-02-01 13:48:37 -0500107 exitChannel chan int
108 lockAdaptersMap sync.RWMutex
109 lockdDeviceTypeToAdapterMap sync.RWMutex
110}
111
Kent Hagerman16ce36a2019-12-17 13:40:53 -0500112func newAdapterManager(cdProxy *model.Proxy, coreInstanceID string, kafkaClient kafka.Client, deviceMgr *DeviceManager) *AdapterManager {
113 aMgr := &AdapterManager{
114 exitChannel: make(chan int, 1),
115 coreInstanceID: coreInstanceID,
116 clusterDataProxy: cdProxy,
117 adapterAgents: make(map[string]*AdapterAgent),
118 deviceTypeToAdapterMap: make(map[string]string),
119 deviceMgr: deviceMgr,
120 }
121 kafkaClient.SubscribeForMetadata(aMgr.updateLastAdapterCommunication)
122 return aMgr
khenaidoo21d51152019-02-01 13:48:37 -0500123}
124
Thomas Lee Se5a44012019-11-07 20:32:24 +0530125func (aMgr *AdapterManager) start(ctx context.Context) error {
Girish Kumarf56a4682020-03-20 20:07:46 +0000126 logger.Info("starting-adapter-manager")
khenaidoo21d51152019-02-01 13:48:37 -0500127
128 // Load the existing adapterAgents and device types - this will also ensure the correct paths have been
129 // created if there are no data in the dB to start
Thomas Lee Se5a44012019-11-07 20:32:24 +0530130 err := aMgr.loadAdaptersAndDevicetypesInMemory()
131 if err != nil {
Girish Kumarf56a4682020-03-20 20:07:46 +0000132 logger.Errorw("Failed-to-load-adapters-and-device-types-in-memeory", log.Fields{"error": err})
Thomas Lee Se5a44012019-11-07 20:32:24 +0530133 return err
134 }
khenaidoo21d51152019-02-01 13:48:37 -0500135
David K. Bainbridgeb4a9ab02019-09-20 15:12:16 -0700136 probe.UpdateStatusFromContext(ctx, "adapter-manager", probe.ServiceStatusRunning)
Girish Kumarf56a4682020-03-20 20:07:46 +0000137 logger.Info("adapter-manager-started")
Thomas Lee Se5a44012019-11-07 20:32:24 +0530138 return nil
khenaidoo21d51152019-02-01 13:48:37 -0500139}
140
khenaidoo21d51152019-02-01 13:48:37 -0500141//loadAdaptersAndDevicetypesInMemory loads the existing set of adapters and device types in memory
Thomas Lee Se5a44012019-11-07 20:32:24 +0530142func (aMgr *AdapterManager) loadAdaptersAndDevicetypesInMemory() error {
khenaidoo21d51152019-02-01 13:48:37 -0500143 // Load the adapters
Thomas Lee Se5a44012019-11-07 20:32:24 +0530144 adaptersIf, err := aMgr.clusterDataProxy.List(context.Background(), "/adapters", 0, false, "")
145 if err != nil {
Girish Kumarf56a4682020-03-20 20:07:46 +0000146 logger.Errorw("Failed-to-list-adapters-from-cluster-data-proxy", log.Fields{"error": err})
Thomas Lee Se5a44012019-11-07 20:32:24 +0530147 return err
148 }
149 if adaptersIf != nil {
khenaidoo21d51152019-02-01 13:48:37 -0500150 for _, adapterIf := range adaptersIf.([]interface{}) {
151 if adapter, ok := adapterIf.(*voltha.Adapter); ok {
khenaidooe7be1332020-01-24 18:58:33 -0500152 if err := aMgr.addAdapter(adapter, false); err != nil {
Girish Kumarf56a4682020-03-20 20:07:46 +0000153 logger.Errorw("failed to add adapter", log.Fields{"adapterId": adapter.Id})
khenaidooe7be1332020-01-24 18:58:33 -0500154 } else {
Girish Kumarf56a4682020-03-20 20:07:46 +0000155 logger.Debugw("adapter added successfully", log.Fields{"adapterId": adapter.Id})
khenaidooe7be1332020-01-24 18:58:33 -0500156 }
khenaidoo21d51152019-02-01 13:48:37 -0500157 }
158 }
159 } else {
Girish Kumarf56a4682020-03-20 20:07:46 +0000160 logger.Debug("no-existing-adapter-found")
khenaidoo21d51152019-02-01 13:48:37 -0500161 // 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 +0530162 return aMgr.addAdapter(&voltha.Adapter{Id: SentinelAdapterID}, true)
khenaidoo21d51152019-02-01 13:48:37 -0500163 }
164
165 // Load the device types
Thomas Lee Se5a44012019-11-07 20:32:24 +0530166 deviceTypesIf, err := aMgr.clusterDataProxy.List(context.Background(), "/device_types", 0, false, "")
167 if err != nil {
Girish Kumarf56a4682020-03-20 20:07:46 +0000168 logger.Errorw("Failed-to-list-device-types-from-cluster-data-proxy", log.Fields{"error": err})
Thomas Lee Se5a44012019-11-07 20:32:24 +0530169 return err
170 }
171 if deviceTypesIf != nil {
khenaidoo1ce37ad2019-03-24 22:07:24 -0400172 dTypes := &voltha.DeviceTypes{Items: []*voltha.DeviceType{}}
khenaidoo21d51152019-02-01 13:48:37 -0500173 for _, deviceTypeIf := range deviceTypesIf.([]interface{}) {
174 if dType, ok := deviceTypeIf.(*voltha.DeviceType); ok {
Girish Kumarf56a4682020-03-20 20:07:46 +0000175 logger.Debugw("found-existing-device-types", log.Fields{"deviceTypes": dTypes})
khenaidoo21d51152019-02-01 13:48:37 -0500176 dTypes.Items = append(dTypes.Items, dType)
khenaidooe7be1332020-01-24 18:58:33 -0500177 } else {
Girish Kumarf56a4682020-03-20 20:07:46 +0000178 logger.Errorw("not an voltha device type", log.Fields{"interface": deviceTypeIf})
khenaidoo21d51152019-02-01 13:48:37 -0500179 }
180 }
Thomas Lee Se5a44012019-11-07 20:32:24 +0530181 return aMgr.addDeviceTypes(dTypes, false)
khenaidoo21d51152019-02-01 13:48:37 -0500182 }
Thomas Lee Se5a44012019-11-07 20:32:24 +0530183
Girish Kumarf56a4682020-03-20 20:07:46 +0000184 logger.Debug("no-existing-device-type-found")
Thomas Lee Se5a44012019-11-07 20:32:24 +0530185 // No device types data. In order to have a proxy setup for that path let's create a fake device type
186 return aMgr.addDeviceTypes(&voltha.DeviceTypes{Items: []*voltha.DeviceType{{Id: SentinelDevicetypeID, Adapter: SentinelAdapterID}}}, true)
khenaidoo21d51152019-02-01 13:48:37 -0500187}
188
Kent Hagerman16ce36a2019-12-17 13:40:53 -0500189func (aMgr *AdapterManager) updateLastAdapterCommunication(adapterID string, timestamp int64) {
190 aMgr.lockAdaptersMap.RLock()
191 adapterAgent, have := aMgr.adapterAgents[adapterID]
192 aMgr.lockAdaptersMap.RUnlock()
193
194 if have {
195 adapterAgent.updateCommunicationTime(time.Unix(timestamp/1000, timestamp%1000*1000))
196 }
197}
198
Thomas Lee Se5a44012019-11-07 20:32:24 +0530199func (aMgr *AdapterManager) addAdapter(adapter *voltha.Adapter, saveToDb bool) error {
khenaidoo21d51152019-02-01 13:48:37 -0500200 aMgr.lockAdaptersMap.Lock()
201 defer aMgr.lockAdaptersMap.Unlock()
Girish Kumarf56a4682020-03-20 20:07:46 +0000202 logger.Debugw("adding-adapter", log.Fields{"adapter": adapter})
khenaidoo21d51152019-02-01 13:48:37 -0500203 if _, exist := aMgr.adapterAgents[adapter.Id]; !exist {
khenaidoo21d51152019-02-01 13:48:37 -0500204 if saveToDb {
205 // Save the adapter to the KV store - first check if it already exist
Thomas Lee Se5a44012019-11-07 20:32:24 +0530206 kvAdapter, err := aMgr.clusterDataProxy.Get(context.Background(), "/adapters/"+adapter.Id, 0, false, "")
207 if err != nil {
Girish Kumarf56a4682020-03-20 20:07:46 +0000208 logger.Errorw("failed-to-get-adapters-from-cluster-proxy", log.Fields{"error": err})
Thomas Lee Se5a44012019-11-07 20:32:24 +0530209 return err
210 }
211 if kvAdapter == nil {
Kent Hagermand9cc2e92019-11-04 13:28:15 -0500212 added, err := aMgr.clusterDataProxy.AddWithID(context.Background(), "/adapters", adapter.Id, adapter, "")
Thomas Lee Se5a44012019-11-07 20:32:24 +0530213 if err != nil {
Girish Kumarf56a4682020-03-20 20:07:46 +0000214 logger.Errorw("failed-to-save-adapter-to-cluster-proxy", log.Fields{"error": err})
Thomas Lee Se5a44012019-11-07 20:32:24 +0530215 return err
216 }
217 if added == nil {
khenaidoo21d51152019-02-01 13:48:37 -0500218 //TODO: Errors when saving to KV would require a separate go routine to be launched and try the saving again
Girish Kumarf56a4682020-03-20 20:07:46 +0000219 logger.Errorw("failed-to-save-adapter", log.Fields{"adapter": adapter})
Kent Hagermand9cc2e92019-11-04 13:28:15 -0500220 return errors.New("failed-to-save-adapter")
khenaidoo21d51152019-02-01 13:48:37 -0500221 }
Kent Hagermand9cc2e92019-11-04 13:28:15 -0500222 logger.Debugw("adapter-saved-to-KV-Store", log.Fields{"adapter": adapter})
khenaidoo21d51152019-02-01 13:48:37 -0500223 }
224 }
Kent Hagermand9cc2e92019-11-04 13:28:15 -0500225 clonedAdapter := (proto.Clone(adapter)).(*voltha.Adapter)
226 aMgr.adapterAgents[adapter.Id] = newAdapterAgent(clonedAdapter, nil)
khenaidoo21d51152019-02-01 13:48:37 -0500227 }
Thomas Lee Se5a44012019-11-07 20:32:24 +0530228 return nil
khenaidoo21d51152019-02-01 13:48:37 -0500229}
230
Thomas Lee Se5a44012019-11-07 20:32:24 +0530231func (aMgr *AdapterManager) addDeviceTypes(deviceTypes *voltha.DeviceTypes, saveToDb bool) error {
khenaidoo21d51152019-02-01 13:48:37 -0500232 if deviceTypes == nil {
Thomas Lee Se5a44012019-11-07 20:32:24 +0530233 return fmt.Errorf("no-device-type")
khenaidoo21d51152019-02-01 13:48:37 -0500234 }
Girish Kumarf56a4682020-03-20 20:07:46 +0000235 logger.Debugw("adding-device-types", log.Fields{"deviceTypes": deviceTypes})
khenaidoo21d51152019-02-01 13:48:37 -0500236 aMgr.lockAdaptersMap.Lock()
237 defer aMgr.lockAdaptersMap.Unlock()
238 aMgr.lockdDeviceTypeToAdapterMap.Lock()
239 defer aMgr.lockdDeviceTypeToAdapterMap.Unlock()
Kent Hagermand9cc2e92019-11-04 13:28:15 -0500240
khenaidoo21d51152019-02-01 13:48:37 -0500241 if saveToDb {
Kent Hagermand9cc2e92019-11-04 13:28:15 -0500242 // Save the device types to the KV store
khenaidoo21d51152019-02-01 13:48:37 -0500243 for _, deviceType := range deviceTypes.Items {
Thomas Lee Se5a44012019-11-07 20:32:24 +0530244 dType, err := aMgr.clusterDataProxy.Get(context.Background(), "/device_types/"+deviceType.Id, 0, false, "")
245 if err != nil {
Girish Kumarf56a4682020-03-20 20:07:46 +0000246 logger.Errorw("Failed-to--device-types-from-cluster-data-proxy", log.Fields{"error": err})
Thomas Lee Se5a44012019-11-07 20:32:24 +0530247 return err
248 }
249 if dType == nil {
khenaidoo21d51152019-02-01 13:48:37 -0500250 // Does not exist - save it
251 clonedDType := (proto.Clone(deviceType)).(*voltha.DeviceType)
Thomas Lee Se5a44012019-11-07 20:32:24 +0530252 added, err := aMgr.clusterDataProxy.AddWithID(context.Background(), "/device_types", deviceType.Id, clonedDType, "")
253 if err != nil {
Girish Kumarf56a4682020-03-20 20:07:46 +0000254 logger.Errorw("Failed-to-add-device-types-to-cluster-data-proxy", log.Fields{"error": err})
Thomas Lee Se5a44012019-11-07 20:32:24 +0530255 return err
256 }
257 if added == nil {
Girish Kumarf56a4682020-03-20 20:07:46 +0000258 logger.Errorw("failed-to-save-deviceType", log.Fields{"deviceType": deviceType})
Kent Hagermand9cc2e92019-11-04 13:28:15 -0500259 return errors.New("failed-to-save-deviceType")
khenaidoo21d51152019-02-01 13:48:37 -0500260 }
Kent Hagermand9cc2e92019-11-04 13:28:15 -0500261 logger.Debugw("device-type-saved-to-KV-Store", log.Fields{"deviceType": deviceType})
khenaidoo21d51152019-02-01 13:48:37 -0500262 }
263 }
264 }
Kent Hagermand9cc2e92019-11-04 13:28:15 -0500265 // and save locally
266 for _, deviceType := range deviceTypes.Items {
267 clonedDType := (proto.Clone(deviceType)).(*voltha.DeviceType)
268 if adapterAgent, exist := aMgr.adapterAgents[clonedDType.Adapter]; exist {
269 adapterAgent.updateDeviceType(clonedDType)
270 } else {
271 logger.Debugw("adapter-not-exist", log.Fields{"deviceTypes": deviceTypes, "adapterId": clonedDType.Adapter})
272 aMgr.adapterAgents[clonedDType.Adapter] = newAdapterAgent(&voltha.Adapter{Id: clonedDType.Adapter}, deviceTypes)
273 }
274 aMgr.deviceTypeToAdapterMap[clonedDType.Id] = clonedDType.Adapter
275 }
Thomas Lee Se5a44012019-11-07 20:32:24 +0530276 return nil
khenaidoo21d51152019-02-01 13:48:37 -0500277}
278
279func (aMgr *AdapterManager) listAdapters(ctx context.Context) (*voltha.Adapters, error) {
khenaidoo1ce37ad2019-03-24 22:07:24 -0400280 result := &voltha.Adapters{Items: []*voltha.Adapter{}}
281 aMgr.lockAdaptersMap.RLock()
282 defer aMgr.lockAdaptersMap.RUnlock()
khenaidoo21d51152019-02-01 13:48:37 -0500283 for _, adapterAgent := range aMgr.adapterAgents {
284 if a := adapterAgent.getAdapter(); a != nil {
npujar1d86a522019-11-14 17:11:16 +0530285 if a.Id != SentinelAdapterID { // don't report the sentinel
khenaidoo297cd252019-02-07 22:10:23 -0500286 result.Items = append(result.Items, (proto.Clone(a)).(*voltha.Adapter))
287 }
khenaidoo21d51152019-02-01 13:48:37 -0500288 }
289 }
290 return result, nil
291}
292
npujar1d86a522019-11-14 17:11:16 +0530293func (aMgr *AdapterManager) getAdapter(adapterID string) *voltha.Adapter {
khenaidoo1ce37ad2019-03-24 22:07:24 -0400294 aMgr.lockAdaptersMap.RLock()
295 defer aMgr.lockAdaptersMap.RUnlock()
npujar1d86a522019-11-14 17:11:16 +0530296 if adapterAgent, ok := aMgr.adapterAgents[adapterID]; ok {
khenaidoo21d51152019-02-01 13:48:37 -0500297 return adapterAgent.getAdapter()
298 }
299 return nil
300}
301
Thomas Lee Se5a44012019-11-07 20:32:24 +0530302func (aMgr *AdapterManager) registerAdapter(adapter *voltha.Adapter, deviceTypes *voltha.DeviceTypes) (*voltha.CoreInstance, error) {
Girish Kumarf56a4682020-03-20 20:07:46 +0000303 logger.Debugw("registerAdapter", log.Fields{"adapter": adapter, "deviceTypes": deviceTypes.Items})
khenaidoo21d51152019-02-01 13:48:37 -0500304
305 if aMgr.getAdapter(adapter.Id) != nil {
khenaidooba6b6c42019-08-02 09:11:56 -0400306 // Already registered - Adapter may have restarted. Trigger the reconcile process for that adapter
npujar1d86a522019-11-14 17:11:16 +0530307 go func() {
npujar467fe752020-01-16 20:17:45 +0530308 err := aMgr.deviceMgr.adapterRestarted(context.Background(), adapter)
npujar1d86a522019-11-14 17:11:16 +0530309 if err != nil {
Girish Kumarf56a4682020-03-20 20:07:46 +0000310 logger.Errorw("unable-to-restart-adapter", log.Fields{"error": err})
npujar1d86a522019-11-14 17:11:16 +0530311 }
312 }()
Thomas Lee Se5a44012019-11-07 20:32:24 +0530313 return &voltha.CoreInstance{InstanceId: aMgr.coreInstanceID}, nil
khenaidoo21d51152019-02-01 13:48:37 -0500314 }
315 // Save the adapter and the device types
Thomas Lee Se5a44012019-11-07 20:32:24 +0530316 if err := aMgr.addAdapter(adapter, true); err != nil {
Girish Kumarf56a4682020-03-20 20:07:46 +0000317 logger.Errorw("failed-to-add-adapter", log.Fields{"error": err})
Thomas Lee Se5a44012019-11-07 20:32:24 +0530318 return nil, err
319 }
320 if err := aMgr.addDeviceTypes(deviceTypes, true); err != nil {
Girish Kumarf56a4682020-03-20 20:07:46 +0000321 logger.Errorw("failed-to-add-device-types", log.Fields{"error": err})
Thomas Lee Se5a44012019-11-07 20:32:24 +0530322 return nil, err
323 }
khenaidoo21d51152019-02-01 13:48:37 -0500324
Girish Kumarf56a4682020-03-20 20:07:46 +0000325 logger.Debugw("adapter-registered", log.Fields{"adapter": adapter.Id})
khenaidoo21d51152019-02-01 13:48:37 -0500326
Thomas Lee Se5a44012019-11-07 20:32:24 +0530327 return &voltha.CoreInstance{InstanceId: aMgr.coreInstanceID}, nil
khenaidoo21d51152019-02-01 13:48:37 -0500328}
329
330//getAdapterName returns the name of the device adapter that service this device type
331func (aMgr *AdapterManager) getAdapterName(deviceType string) (string, error) {
332 aMgr.lockdDeviceTypeToAdapterMap.Lock()
333 defer aMgr.lockdDeviceTypeToAdapterMap.Unlock()
npujar1d86a522019-11-14 17:11:16 +0530334 if adapterID, exist := aMgr.deviceTypeToAdapterMap[deviceType]; exist {
335 return adapterID, nil
khenaidoo21d51152019-02-01 13:48:37 -0500336 }
npujar1d86a522019-11-14 17:11:16 +0530337 return "", fmt.Errorf("Adapter-not-registered-for-device-type %s", deviceType)
khenaidoo21d51152019-02-01 13:48:37 -0500338}
339
Kent Hagermanc2c73ff2019-11-20 16:22:32 -0500340func (aMgr *AdapterManager) listDeviceTypes() []*voltha.DeviceType {
341 aMgr.lockdDeviceTypeToAdapterMap.Lock()
342 defer aMgr.lockdDeviceTypeToAdapterMap.Unlock()
343
344 deviceTypes := make([]*voltha.DeviceType, 0, len(aMgr.deviceTypeToAdapterMap))
npujar1d86a522019-11-14 17:11:16 +0530345 for deviceTypeID, adapterID := range aMgr.deviceTypeToAdapterMap {
346 if adapterAgent, have := aMgr.adapterAgents[adapterID]; have {
347 if deviceType := adapterAgent.getDeviceType(deviceTypeID); deviceType != nil {
khenaidoob64fc8a2019-11-27 15:08:19 -0500348 if deviceType.Id != SentinelDevicetypeID { // don't report the sentinel
349 deviceTypes = append(deviceTypes, deviceType)
350 }
Kent Hagermanc2c73ff2019-11-20 16:22:32 -0500351 }
352 }
353 }
354 return deviceTypes
355}
356
khenaidoo21d51152019-02-01 13:48:37 -0500357// getDeviceType returns the device type proto definition given the name of the device type
khenaidoo1ce37ad2019-03-24 22:07:24 -0400358func (aMgr *AdapterManager) getDeviceType(deviceType string) *voltha.DeviceType {
khenaidoo21d51152019-02-01 13:48:37 -0500359 aMgr.lockdDeviceTypeToAdapterMap.Lock()
360 defer aMgr.lockdDeviceTypeToAdapterMap.Unlock()
Kent Hagermanc2c73ff2019-11-20 16:22:32 -0500361
npujar1d86a522019-11-14 17:11:16 +0530362 if adapterID, exist := aMgr.deviceTypeToAdapterMap[deviceType]; exist {
363 if adapterAgent := aMgr.adapterAgents[adapterID]; adapterAgent != nil {
khenaidoo21d51152019-02-01 13:48:37 -0500364 return adapterAgent.getDeviceType(deviceType)
365 }
366 }
367 return nil
368}