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
package server
import (
"context"
"time"
mnepb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/networkelement"
"code.fbi.h-da.de/danet/gosdn/controller/interfaces/networkdomain"
"github.com/google/uuid"
log "github.com/sirupsen/logrus"
"google.golang.org/grpc/codes"
"google.golang.org/grpc/status"
)
// NetworkElementServer represents a NetworkElementServer.
type NetworkElementServer struct {
mnepb.UnimplementedNetworkElementServiceServer
networkDomain networkdomain.NetworkDomain
}
// NewNetworkElementServer returns a new NetWorkElementServer.
func NewNetworkElementServer(networkDomain networkdomain.NetworkDomain) *NetworkElementServer {
return &NetworkElementServer{
networkDomain: networkDomain,
}
}
// Add adds a new network element.
func (s *NetworkElementServer) Add(ctx context.Context, request *mnepb.AddNetworkElementRequest) (*mnepb.AddNetworkElementResponse, error) {
sbiID, err := uuid.Parse(request.NetworkElement.Sbi.Id)
if err != nil {
return nil, status.Errorf(codes.Aborted, "%v", err)
}
id, err := s.networkDomain.AddNetworkElement(
request.NetworkElement.NetworkElementName,
request.NetworkElement.TransportOption,
nil,
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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
)
if err != nil {
return nil, status.Errorf(codes.Aborted, "%v", err)
}
return &mnepb.AddNetworkElementResponse{
Timestamp: time.Now().UnixNano(),
Status: mnepb.Status_STATUS_OK,
NetworkElementId: id.String(),
}, nil
}
// GetAll returns all stored network elements.
func (s *NetworkElementServer) GetAll(ctx context.Context, request *mnepb.GetAllNetworkElementRequest) (*mnepb.GetAllNetworkElementResponse, error) {
networkElements := s.networkDomain.NetworkElements()
mnes := []*mnepb.NetworkElement{}
for _, mne := range networkElements {
ygotStructAsJSON, err := mne.GetModelAsString()
if err != nil {
log.Error(err)
return nil, status.Errorf(codes.Aborted, "%v", err)
}
mnes = append(mnes, &mnepb.NetworkElement{
Id: mne.ID().String(),
Name: mne.Name(),
Model: ygotStructAsJSON,
})
}
return &mnepb.GetAllNetworkElementResponse{
Timestamp: time.Now().UnixNano(),
Status: mnepb.Status_STATUS_OK,
NetworkElement: mnes,
}, nil
}
// Get returns a network element.
func (s *NetworkElementServer) Get(ctx context.Context, request *mnepb.GetNetworkElementRequest) (*mnepb.GetNetworkElementResponse, error) {
mne, err := s.networkDomain.GetNetworkElement(request.NetworkElementId)
if err != nil {
return nil, status.Errorf(codes.Aborted, "%v", err)
}
ygotStructAsJSON, err := mne.GetModelAsString()
if err != nil {
log.Error(err)
return nil, status.Errorf(codes.Aborted, "%v", err)
}
networkElement := &mnepb.NetworkElement{
Id: mne.ID().String(),
Name: mne.Name(),
Model: ygotStructAsJSON,
TransportAddress: mne.TransportAddress(),
}
return &mnepb.GetNetworkElementResponse{
Timestamp: time.Now().UnixNano(),
Status: mnepb.Status_STATUS_OK,
NetworkElement: networkElement,
}, nil
}
// Update updates a network element.
func (s *NetworkElementServer) Update(ctx context.Context, request *mnepb.UpdateNetworkElementRequest) (*mnepb.UpdateNetworkElementResponse, error) {
mneID, err := uuid.Parse(request.NetworkElement.Id)
if err != nil {
return &mnepb.UpdateNetworkElementResponse{
Timestamp: time.Now().UnixNano(),
Status: mnepb.Status_STATUS_OK,
}, err
}
err = s.networkDomain.UpdateNetworkElement(mneID, request.NetworkElement.Model)
if err != nil {
return &mnepb.UpdateNetworkElementResponse{
Timestamp: time.Now().UnixNano(),
Status: mnepb.Status_STATUS_OK,
}, err
}
return &mnepb.UpdateNetworkElementResponse{
Timestamp: time.Now().UnixNano(),
Status: mnepb.Status_STATUS_OK,
}, nil
}