Newer
Older
cmpb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/configurationmanagement"
spb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/southbound"
"code.fbi.h-da.de/danet/gosdn/controller/interfaces/networkdomain"
"code.fbi.h-da.de/danet/gosdn/controller/interfaces/southbound"
"code.fbi.h-da.de/danet/gosdn/controller/nucleus"
"code.fbi.h-da.de/danet/gosdn/controller/store"
"code.fbi.h-da.de/danet/gosdn/controller/topology"
"code.fbi.h-da.de/danet/gosdn/controller/topology/links"
"code.fbi.h-da.de/danet/gosdn/controller/topology/nodes"
"code.fbi.h-da.de/danet/gosdn/controller/topology/ports"
tpb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/transport"
// ConfigurationManagementServer represents ConfigurationManagementServer...
pndStore networkdomain.PndStore
topologyService topology.Service
nodeService nodes.Service
portService ports.Service
// NewConfigurationManagementServer creates the ConfigurationManagementServer..
func NewConfigurationManagementServer(
pndStore networkdomain.PndStore,
topologyService topology.Service,
nodeService nodes.Service,
portService ports.Service,
) *ConfigurationManagementServer {
return &ConfigurationManagementServer{
pndStore: pndStore,
topologyService: topologyService,
nodeService: nodeService,
portService: portService}
}
// sdnConfig is used to parse the sdnConfig into JSON.
type sdnConfig struct {
PndID string `json:"pndID"`
Nodes []nodes.Node `json:"nodes"`
Ports []ports.Port `json:"ports"`
Links []links.Link `json:"links"`
Sbis []southbound.SouthboundInterface `json:"sbis"`
NetworkElements []networkelement.NetworkElement `json:"networkelements"`
// loadedSDNConfig is used to parse the stringified JSON sdnConfig into objects.
type loadedSDNConfig struct {
PndID string `json:"pndID"`
Nodes []nodes.Node `json:"nodes"`
Ports []ports.Port `json:"ports"`
Links []links.Link `json:"links"`
Sbis []southbound.LoadedSbi `json:"sbis"`
NetworkElements []networkelement.LoadedNetworkElement `json:"networkelements"`
}
func (c ConfigurationManagementServer) ExportSDNConfig(ctx context.Context, request *cmpb.ExportSDNConfigRequest) (*cmpb.ExportSDNConfigResponse, error) {
pndUUID := uuid.MustParse(request.Pid)
pnd, err := c.pndStore.Get(store.Query{ID: pndUUID})
if err != nil {
return nil, err
}
sdnConfig.Sbis, err = pnd.GetSBIs()
if err != nil {
return nil, err
}
sdnConfig.Nodes, err = c.nodeService.GetAll()
if err != nil {
return nil, err
}
sdnConfig.Ports, err = c.portService.GetAll()
if err != nil {
return nil, err
}
sdnConfig.Links, err = c.topologyService.GetAll()
if err != nil {
return nil, err
}
jsonSDNConfig, err := json.MarshalIndent(sdnConfig, "", " ")
Timestamp: time.Now().UnixNano(),
SdnConfigData: sdnConfigDataString}, nil
}
// ImportSDNConfig receives an SDN configuration and imports it.
func (c ConfigurationManagementServer) ImportSDNConfig(ctx context.Context, request *cmpb.ImportSDNConfigRequest) (*cmpb.ImportSDNConfigResponse, error) {
var sdnConfig = loadedSDNConfig{}
err := json.Unmarshal([]byte(request.SdnConfigData), &sdnConfig)
if err != nil {
return nil, err
}
//TODO: Clear DB
if err != nil {
return nil, err
}
return &cmpb.ImportSDNConfigResponse{
Timestamp: time.Now().UnixNano()}, nil
}
func (c ConfigurationManagementServer) createElementsFromSDNConfig(sdnConfig *loadedSDNConfig, request *cmpb.ImportSDNConfigRequest) error {
pndUUID := uuid.MustParse(request.Pid)
pnd, err := c.pndStore.Get(store.Query{ID: pndUUID})
if err != nil {
}
for _, inputSBI := range sdnConfig.Sbis {
sbi, err := nucleus.NewSBI(inputSBI.Type, uuid.MustParse(inputSBI.ID))
if err != nil {
}
err = pnd.AddSbi(sbi)
if err != nil {
}
}
for _, inputNode := range sdnConfig.Nodes {
node := nodes.Node{
ID: inputNode.ID,
Name: inputNode.Name,
}
_, err = c.nodeService.EnsureExists(node)
if err != nil {
}
}
for _, inputPort := range sdnConfig.Ports {
port := ports.Port{
ID: inputPort.ID,
Name: inputPort.Name,
Configuration: inputPort.Configuration,
}
_, err = c.portService.EnsureExists(port)
if err != nil {
}
}
for _, inputPort := range sdnConfig.Links {
sourceNode, err := c.nodeService.Get(store.Query{ID: inputPort.SourceNode.ID})
if err != nil {
}
targetNode, err := c.nodeService.Get(store.Query{ID: inputPort.TargetNode.ID})
if err != nil {
}
sourcePort, err := c.portService.Get(store.Query{ID: inputPort.SourcePort.ID})
if err != nil {
}
targetPort, err := c.portService.Get(store.Query{ID: inputPort.TargetPort.ID})
if err != nil {
}
link := links.Link{
ID: inputPort.ID,
Name: inputPort.Name,
SourceNode: sourceNode,
TargetNode: targetNode,
SourcePort: sourcePort,
TargetPort: targetPort,
}
err = c.topologyService.AddLink(link)
if err != nil {
}
}
for _, inputNetworkElement := range sdnConfig.NetworkElements {
transportOption := tpb.TransportOption{
Address: inputNetworkElement.TransportAddress,
Username: inputNetworkElement.TransportUsername,
Password: inputNetworkElement.TransportPassword,
TransportOption: &tpb.TransportOption_GnmiTransportOption{
GnmiTransportOption: &tpb.GnmiTransportOption{},
},
Type: spb.Type_TYPE_OPENCONFIG,
}
_, err := pnd.AddNetworkElement(
inputNetworkElement.Name,
&transportOption,
uuid.MustParse(inputNetworkElement.SBI),
uuid.MustParse(inputNetworkElement.ID),
)
if err != nil {
}
networkelement, err := pnd.GetNetworkElement(inputNetworkElement.ID)
if err != nil {
}
err = pnd.UpdateNetworkElement(networkelement, inputNetworkElement.Model)
if err != nil {