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
package api
import (
"context"
"io"
"time"
ppb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/pnd"
spb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/southbound"
tpb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/transport"
nbi "code.fbi.h-da.de/danet/gosdn/controller/northbound/client"
"github.com/google/uuid"
"github.com/openconfig/goyang/pkg/yang"
"github.com/openconfig/ygot/ygot"
log "github.com/sirupsen/logrus"
)
// AddDevice adds a new device to the controller. The device name is optional.
// If no name is provided a name will be generated upon device creation.
func AddDevice(ctx context.Context, addr, deviceName string, opt *tpb.TransportOption, sid, pid uuid.UUID) (*ppb.SetOndListResponse, error) {
pndClient, err := nbi.PndClient(addr, dialOptions...)
if err != nil {
return nil, err
}
req := &ppb.SetOndListRequest{
Timestamp: time.Now().UnixNano(),
Ond: []*ppb.SetOnd{
{
Address: opt.GetAddress(),
Sbi: &spb.SouthboundInterface{
Id: sid.String(),
},
DeviceName: deviceName,
TransportOption: opt,
},
},
Pid: pid.String(),
}
switch t := opt.Type; t {
case spb.Type_TYPE_CONTAINERISED, spb.Type_TYPE_PLUGIN:
req.Ond[0].Sbi.Id = uuid.Nil.String()
req.Ond[0].Sbi.Type = t
req.Ond[0].TransportOption.Type = t
default:
}
return pndClient.SetOndList(ctx, req)
}
// GetDevice requests one device belonging to a given
// PrincipalNetworkDomain from the controller. If no device identifier
// is provided, an error is thrown.
Fabian Seidl
committed
func GetDevice(ctx context.Context, addr, pid string, did string) (*ppb.GetOndResponse, error) {
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
93
94
95
96
97
98
99
100
101
102
pndClient, err := nbi.PndClient(addr, dialOptions...)
if err != nil {
return nil, err
}
if len(did) == 0 {
return nil, err
}
req := &ppb.GetOndRequest{
Timestamp: time.Now().UnixNano(),
Did: did,
Pid: pid,
}
return pndClient.GetOnd(ctx, req)
}
// GetSbiSchemaTree gets the sbi tree for a sbi
func GetSbiSchemaTree(ctx context.Context, addr string, pid, sid uuid.UUID) (map[string]*yang.Entry, error) {
sbiClient, err := nbi.SbiClient(addr, dialOptions...)
if err != nil {
return map[string]*yang.Entry{}, err
}
req := &spb.GetSchemaRequest{
Timestamp: time.Now().UnixNano(),
Pid: pid.String(),
Sid: sid.String(),
}
ctx, cancel := context.WithTimeout(ctx, time.Minute*10)
defer cancel()
sClient, err := sbiClient.GetSchema(ctx, req)
if err != nil {
return map[string]*yang.Entry{}, err
}
sTreeBytes := []byte{}
for {
payload, err := sClient.Recv()
if err != nil {
if err == io.EOF {
break
}
log.Error(err)
closeErr := sClient.CloseSend()
if closeErr != nil {
return nil, err
}
return map[string]*yang.Entry{}, err
}
sTreeBytes = append(sTreeBytes, payload.Chunk...)
}
sTreeMap, err := ygot.GzipToSchema(sTreeBytes)
if err != nil {
return map[string]*yang.Entry{}, err
}
return sTreeMap, nil
}
// GetFlattenedDevices requests all devices belonging to a given
// PrincipalNetworkDomain from the controller.
func GetFlattenedDevices(ctx context.Context, addr, pid string) (*ppb.GetFlattenedOndListResponse, error) {
pndClient, err := nbi.PndClient(addr, dialOptions...)
if err != nil {
return nil, err
}
req := &ppb.GetOndListRequest{
Timestamp: time.Now().UnixNano(),
Pid: pid,
}
return pndClient.GetFlattenedOndList(ctx, req)
}
// GetPath requests a specific path
func GetPath(ctx context.Context, addr, pid, did, path string) (*ppb.GetPathResponse, error) {
pndClient, err := nbi.PndClient(addr, dialOptions...)
if err != nil {
return nil, err
}
req := &ppb.GetPathRequest{
Timestamp: time.Now().UnixNano(),
Did: did,
Pid: pid,
Path: path,
}
return pndClient.GetPath(ctx, req)
}
// SubscribePath subscribes to paths on a device
func SubscribePath(ctx context.Context, addr, pid, did string, slist *ppb.SubscriptionList) (ppb.PndService_SubscribePathClient, error) {
log.Println("subscribePath called")
pndClient, err := nbi.PndClient(addr, dialOptions...)
if err != nil {
return nil, err
}
req := &ppb.SubscribePathRequest{
Timestamp: time.Now().UnixNano(),
Did: did,
Pid: pid,
Sublist: slist,
}
return pndClient.SubscribePath(ctx, req)
}
// DeleteDevice deletes a device
func DeleteDevice(ctx context.Context, addr, pid, did string) (*ppb.DeleteOndResponse, error) {
pndClient, err := nbi.PndClient(addr, dialOptions...)
if err != nil {
return nil, err
}
req := &ppb.DeleteOndRequest{
Timestamp: time.Now().UnixNano(),
Did: did,
Pid: pid,
}
return pndClient.DeleteOnd(ctx, req)
}