Skip to content
Snippets Groups Projects

Enable export and import of SDN configuration

Merged Ghost User requested to merge export-import-sdn-config into develop
2 files
+ 55
24
Compare changes
  • Side-by-side
  • Inline
Files
2
@@ -2,51 +2,82 @@ package server
import (
"context"
"encoding/json"
"time"
cm "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/configurationmanagement"
ne "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/networkelement"
"code.fbi.h-da.de/danet/gosdn/controller/interfaces/networkdomain"
"code.fbi.h-da.de/danet/gosdn/controller/interfaces/networkelement"
log "github.com/sirupsen/logrus"
"google.golang.org/grpc/codes"
"google.golang.org/grpc/status"
"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"
"github.com/google/uuid"
)
// ConfigurationManagementServer represents a core server.
type ConfigurationManagementServer struct {
networkElementStore networkelement.Store
pndStore networkdomain.PndStore
topologyService topology.Service
nodeService nodes.Service
portService ports.Service
}
// ConfigurationManagementServer receives a pndStore and returns a new coreServer.
func NewConfigurationManagementServer(networkElementStore networkelement.Store) *ConfigurationManagementServer {
return &ConfigurationManagementServer{networkElementStore: networkElementStore}
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}
}
type SDNConfig struct {
PndID string `json:"pndID"`
NetworkElements []networkelement.NetworkElement `json:"networkelements"`
Nodes []nodes.Node `json:"nodes"`
Ports []ports.Port `json:"ports"`
Links []links.Link `json:"links"`
}
// ExportSDNConfig returns the SDN configuration.
func (c ConfigurationManagementServer) ExportSDNConfig(ctx context.Context, request *cm.ExportSDNConfigRequest) (*cm.ExportSDNConfigResponse, error) {
var sdnConfig = SDNConfig{}
sdnConfig.PndID = request.Pid
//pnd := request.Pid
networkElements := c.networkDomain.NetworkElements()
pndUUID := uuid.MustParse(request.Pid)
pnd, err := c.pndStore.Get(store.Query{ID: pndUUID})
if err != nil {
return nil, err
}
convertedNetworkelements := []*ne.NetworkElement{}
for _, networkElement := range networkElements {
ygotStructAsJSON, err := networkElement.GetModelAsString()
if err != nil {
log.Error(err)
return nil, status.Errorf(codes.Aborted, "%v", err)
}
sdnConfig.NetworkElements = pnd.NetworkElements()
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
}
convertedNetworkelements = append(convertedNetworkelements, &ne.NetworkElement{
Id: networkElement.ID().String(),
Name: networkElement.Name(),
Model: ygotStructAsJSON,
})
jsonSDNConfig, err := json.Marshal(sdnConfig)
if err != nil {
return nil, err
}
return &cm.ExportSDNConfigResponse{
Timestamp: time.Now().UnixNano(),
SdnConfig: "nothing yet"}, nil
SdnConfig: string(jsonSDNConfig)}, nil
}
// ImportSDNConfig receives an SDN configuration and imports it.
Loading