Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
package nucleus
import (
"fmt"
spb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/southbound"
"code.fbi.h-da.de/danet/gosdn/controller/interfaces/device"
"code.fbi.h-da.de/danet/gosdn/controller/interfaces/southbound"
"code.fbi.h-da.de/danet/gosdn/controller/store"
"github.com/google/uuid"
"github.com/openconfig/ygot/ygot"
tpb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/transport"
)
// DeviceService provides a device service implementation.
// This services provides abstraction between the user (e.g a PND) and the matching store (e.g. deviceStore)
type DeviceService struct {
deviceStore device.Store
sbiService southbound.Service
}
// NewDeviceService creates a device service.
func NewDeviceService(deviceStore device.Store, sbiService southbound.Service) device.Service {
return &DeviceService{
deviceStore: deviceStore,
sbiService: sbiService,
}
}
// Get takes a Device's UUID or name and returns the Device.
func (s *DeviceService) Get(query store.Query) (device.Device, error) {
loadedDevice, err := s.deviceStore.Get(query)
if err != nil {
return nil, err
}
device, err := s.createDeviceFromStore(loadedDevice)
if err != nil {
return nil, err
}
return device, nil
}
// GetAll returns all stored devices.
func (s *DeviceService) GetAll() ([]device.Device, error) {
var devices []device.Device
loadedDevices, err := s.deviceStore.GetAll()
if err != nil {
return nil, err
}
for _, loadedDevice := range loadedDevices {
device, err := s.createDeviceFromStore(loadedDevice)
if err != nil {
return nil, err
}
devices = append(devices, device)
}
return devices, nil
}
// Add adds a device to the device store.
func (s *DeviceService) Add(deviceToAdd device.Device) error {
err := s.deviceStore.Add(deviceToAdd)
if err != nil {
return err
}
return nil
}
// Update updates a existing device.
func (s *DeviceService) Update(deviceToUpdate device.Device) error {
err := s.deviceStore.Update(deviceToUpdate)
if err != nil {
return err
}
return nil
}
// Delete deletes a device from the device store.
func (s *DeviceService) Delete(deviceToDelete device.Device) error {
err := s.deviceStore.Delete(deviceToDelete)
if err != nil {
return err
}
Shrey Garg
committed
if deviceToDelete.SBI().Type() == spb.Type_TYPE_PLUGIN {
err = s.sbiService.Delete(deviceToDelete.SBI())
if err != nil {
return err
}
}
return nil
}
func (s *DeviceService) createDeviceFromStore(loadedDevice device.LoadedDevice) (device.Device, error) {
if loadedDevice.SBI == "" {
return nil, fmt.Errorf("no sbi found for device")
}
sbiForDevice, err := s.sbiService.Get(store.Query{ID: uuid.MustParse(loadedDevice.SBI)})
if err != nil {
return nil, err
}
d, err := NewDevice(
loadedDevice.Name,
uuid.MustParse(loadedDevice.ID),
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
&tpb.TransportOption{
Address: loadedDevice.TransportAddress,
Username: loadedDevice.TransportUsername,
Password: loadedDevice.TransportPassword,
TransportOption: &tpb.TransportOption_GnmiTransportOption{
GnmiTransportOption: &tpb.GnmiTransportOption{},
},
Type: spb.Type_TYPE_OPENCONFIG,
}, sbiForDevice)
if err != nil {
return nil, err
}
// Create 'root' path to be able to load the whole model from the store.
path, err := ygot.StringToPath("/", ygot.StructuredPath)
if err != nil {
return nil, err
}
// Use unmarshall from the devices SBI to unmarshall ygot json in go struct.
err = d.SBI().Unmarshal([]byte(loadedDevice.Model), path, d.GetModel())
if err != nil {
return nil, err
}
return d, nil
}