Skip to content
Snippets Groups Projects
core.go 4.37 KiB
Newer Older
  • Learn to ignore specific revisions
  • Manuel Kieweg's avatar
    Manuel Kieweg committed
    package server
    
    import (
    	"context"
    	"time"
    
    
    	pb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/core"
    
    	cpb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/csbi"
    
    	ppb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/pnd"
    
    	"code.fbi.h-da.de/danet/gosdn/controller/interfaces/networkdomain"
    
    	"code.fbi.h-da.de/danet/gosdn/controller/interfaces/networkelement"
    	"code.fbi.h-da.de/danet/gosdn/controller/interfaces/plugin"
    
    	"code.fbi.h-da.de/danet/gosdn/controller/metrics"
    	"code.fbi.h-da.de/danet/gosdn/controller/nucleus"
    
    	"code.fbi.h-da.de/danet/gosdn/controller/store"
    
    Manuel Kieweg's avatar
    Manuel Kieweg committed
    	"github.com/google/uuid"
    
    Malte Bauch's avatar
    Malte Bauch committed
    	"github.com/prometheus/client_golang/prometheus"
    
    // CoreServer represents a core server.
    
    type CoreServer struct {
    
    Fabian Seidl's avatar
    Fabian Seidl committed
    	pb.UnimplementedCoreServiceServer
    
    	pndService    networkdomain.Service
    	pluginService plugin.Service
    	csbiClient    cpb.CsbiServiceClient
    	pndCallbackFn func(uuid.UUID, chan networkelement.Details)
    
    // NewCoreServer receives a pndStore and returns a new coreServer.
    
    func NewCoreServer(pndService networkdomain.Service, pluginService plugin.Service, pndCallbackFn func(uuid.UUID, chan networkelement.Details), csbiClient cpb.CsbiServiceClient) *CoreServer {
    
    	return &CoreServer{
    
    		pndService:    pndService,
    		pluginService: pluginService,
    		pndCallbackFn: pndCallbackFn,
    		csbiClient:    csbiClient,
    
    func (s CoreServer) GetPnd(ctx context.Context, request *pb.GetPndRequest) (*pb.GetPndResponse, error) {
    
    Malte Bauch's avatar
    Malte Bauch committed
    	labels := prometheus.Labels{"service": "core", "rpc": "get"}
    	start := metrics.StartHook(labels, grpcRequestsTotal)
    	defer metrics.FinishHook(labels, start, grpcRequestDurationSecondsTotal, grpcRequestDurationSeconds)
    
    Fabian Seidl's avatar
    Fabian Seidl committed
    	if err != nil {
    		return nil, handleRPCError(labels, err)
    
    	storedPnd, err := s.pndService.Get(store.Query{ID: pndID})
    
    	if err != nil {
    		return nil, err
    	}
    
    	pnd := &ppb.PrincipalNetworkDomain{
    		Id:          storedPnd.ID().String(),
    		Name:        storedPnd.GetName(),
    		Description: storedPnd.GetDescription(),
    
    Fabian Seidl's avatar
    Fabian Seidl committed
    	}
    
    Fabian Seidl's avatar
    Fabian Seidl committed
    	return &pb.GetPndResponse{
    		Timestamp: time.Now().UnixNano(),
    
    Fabian Seidl's avatar
    Fabian Seidl committed
    	}, nil
    }
    
    
    // GetPndList returns all existing pnds.
    
    func (s CoreServer) GetPndList(ctx context.Context, request *pb.GetPndListRequest) (*pb.GetPndListResponse, error) {
    
    Fabian Seidl's avatar
    Fabian Seidl committed
    	labels := prometheus.Labels{"service": "core", "rpc": "get"}
    	start := metrics.StartHook(labels, grpcRequestsTotal)
    	defer metrics.FinishHook(labels, start, grpcRequestDurationSecondsTotal, grpcRequestDurationSeconds)
    
    	pndList, err := s.pndService.GetAll()
    
    Fabian Seidl's avatar
    Fabian Seidl committed
    
    	pnds := make([]*ppb.PrincipalNetworkDomain, len(pndList))
    
    Manuel Kieweg's avatar
    Manuel Kieweg committed
    		pnds[i] = &ppb.PrincipalNetworkDomain{
    			Id:          pnd.ID().String(),
    			Name:        pnd.GetName(),
    			Description: pnd.GetDescription(),
    		}
    	}
    
    Fabian Seidl's avatar
    Fabian Seidl committed
    	return &pb.GetPndListResponse{
    
    Manuel Kieweg's avatar
    Manuel Kieweg committed
    		Timestamp: time.Now().UnixNano(),
    		Pnd:       pnds,
    	}, nil
    }
    
    
    // CreatePndList creates a pnd list.
    
    func (s CoreServer) CreatePndList(ctx context.Context, request *pb.CreatePndListRequest) (*pb.CreatePndListResponse, error) {
    
    Malte Bauch's avatar
    Malte Bauch committed
    	labels := prometheus.Labels{"service": "core", "rpc": "set"}
    	start := metrics.StartHook(labels, grpcRequestsTotal)
    	defer metrics.FinishHook(labels, start, grpcRequestDurationSecondsTotal, grpcRequestDurationSeconds)
    
    Manuel Kieweg's avatar
    Manuel Kieweg committed
    	for _, r := range request.Pnd {
    
    		pnd := nucleus.NewPND(uuid.New(), r.Name, r.Description)
    
    		if err := s.pndService.Add(pnd); err != nil {
    
    Malte Bauch's avatar
    Malte Bauch committed
    			return nil, handleRPCError(labels, err)
    
    Fabian Seidl's avatar
    Fabian Seidl committed
    	return &pb.CreatePndListResponse{
    		Timestamp: time.Now().UnixNano(),
    		Status:    pb.Status_STATUS_OK,
    	}, nil
    }
    
    
    // DeletePnd deletes an existing pnd.
    
    func (s CoreServer) DeletePnd(ctx context.Context, request *pb.DeletePndRequest) (*pb.DeletePndResponse, error) {
    
    Fabian Seidl's avatar
    Fabian Seidl committed
    	labels := prometheus.Labels{"service": "core", "rpc": "set"}
    	start := metrics.StartHook(labels, grpcRequestsTotal)
    	defer metrics.FinishHook(labels, start, grpcRequestDurationSecondsTotal, grpcRequestDurationSeconds)
    
    	pndID, err := uuid.Parse(request.Pid)
    	if err != nil {
    		return nil, handleRPCError(labels, err)
    	}
    
    	pnd, err := s.pndService.Get(store.Query{ID: pndID})
    
    	if err != nil {
    		return nil, handleRPCError(labels, err)
    	}
    
    	err = s.pndService.Delete(pnd)
    
    	if err != nil {
    		return &pb.DeletePndResponse{
    			Timestamp: time.Now().UnixNano(),
    			Status:    pb.Status_STATUS_ERROR,
    		}, err
    	}
    
    Fabian Seidl's avatar
    Fabian Seidl committed
    
    	return &pb.DeletePndResponse{
    
    Manuel Kieweg's avatar
    Manuel Kieweg committed
    		Timestamp: time.Now().UnixNano(),
    
    Fabian Seidl's avatar
    Fabian Seidl committed
    		Status:    pb.Status_STATUS_OK,
    
    Manuel Kieweg's avatar
    Manuel Kieweg committed
    	}, nil
    }