Skip to content
Snippets Groups Projects
pnd.go 4.63 KiB
Newer Older
  • Learn to ignore specific revisions
  • Manuel Kieweg's avatar
    Manuel Kieweg committed
    package server
    
    import (
    	"context"
    	"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"
    	"code.fbi.h-da.de/danet/gosdn/controller/interfaces/networkdomain"
    	"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"
    
    	log "github.com/sirupsen/logrus"
    
    Fabian Seidl's avatar
    Fabian Seidl committed
    	"google.golang.org/grpc/codes"
    	"google.golang.org/grpc/status"
    
    // PndServer implements a pnd server.
    
    Fabian Seidl's avatar
    Fabian Seidl committed
    	ppb.UnimplementedPndServiceServer
    
    	pndService networkdomain.Service
    
    // NewPndServer receives a pndStore and returns a new pndServer.
    
    func NewPndServer(pndService networkdomain.Service) *PndServer {
    
    		pndService: pndService,
    
    func (p PndServer) GetSbi(ctx context.Context, request *ppb.GetSbiRequest) (*ppb.GetSbiResponse, error) {
    
    Fabian Seidl's avatar
    Fabian Seidl committed
    	labels := prometheus.Labels{"service": "pnd", "rpc": "get"}
    	start := metrics.StartHook(labels, grpcRequestsTotal)
    	defer metrics.FinishHook(labels, start, grpcRequestDurationSecondsTotal, grpcRequestDurationSeconds)
    	pid, err := uuid.Parse(request.Pid)
    
    Manuel Kieweg's avatar
    Manuel Kieweg committed
    	if err != nil {
    
    Fabian Seidl's avatar
    Fabian Seidl committed
    		return nil, handleRPCError(labels, err)
    
    	pnd, err := p.pndService.Get(store.Query{ID: pid})
    
    Manuel Kieweg's avatar
    Manuel Kieweg committed
    	if err != nil {
    
    		log.Error(err)
    		return nil, status.Errorf(codes.Aborted, "%v", err)
    
    Manuel Kieweg's avatar
    Manuel Kieweg committed
    	}
    
    
    	sbiID, err := uuid.Parse(request.Sid)
    	if err != nil {
    		return nil, err
    	}
    
    	sbi, err := pnd.GetSBI(sbiID)
    
    Manuel Kieweg's avatar
    Manuel Kieweg committed
    	if err != nil {
    
    		log.Error(err)
    		return nil, status.Errorf(codes.Aborted, "%v", err)
    
    Manuel Kieweg's avatar
    Manuel Kieweg committed
    	}
    
    Fabian Seidl's avatar
    Fabian Seidl committed
    	return &ppb.GetSbiResponse{
    
    Manuel Kieweg's avatar
    Manuel Kieweg committed
    		Timestamp: time.Now().UnixNano(),
    
    Fabian Seidl's avatar
    Fabian Seidl committed
    		Pnd: &ppb.PrincipalNetworkDomain{
    			Id:          pnd.ID().String(),
    			Name:        pnd.GetName(),
    			Description: pnd.GetDescription(),
    		},
    
    		Sbi: &spb.SouthboundInterface{
    			Id:   sbiID.String(),
    			Type: sbi.Type(),
    		},
    
    Manuel Kieweg's avatar
    Manuel Kieweg committed
    	}, nil
    }
    
    
    // GetSbiList gets all existing sbis.
    
    func (p PndServer) GetSbiList(ctx context.Context, request *ppb.GetSbiListRequest) (*ppb.GetSbiListResponse, error) {
    
    Fabian Seidl's avatar
    Fabian Seidl committed
    	labels := prometheus.Labels{"service": "pnd", "rpc": "get"}
    	start := metrics.StartHook(labels, grpcRequestsTotal)
    	defer metrics.FinishHook(labels, start, grpcRequestDurationSecondsTotal, grpcRequestDurationSeconds)
    	pid, err := uuid.Parse(request.Pid)
    
    	if err != nil {
    
    Fabian Seidl's avatar
    Fabian Seidl committed
    		return nil, handleRPCError(labels, err)
    
    	pnd, err := p.pndService.Get(store.Query{ID: pid})
    
    	if err != nil {
    
    		log.Error(err)
    		return nil, status.Errorf(codes.Aborted, "%v", err)
    	}
    
    	if err != nil {
    		log.Error(err)
    		return nil, status.Errorf(codes.Aborted, "%v", err)
    	}
    
    Fabian Seidl's avatar
    Fabian Seidl committed
    	return &ppb.GetSbiListResponse{
    
    		Timestamp: time.Now().UnixNano(),
    
    Fabian Seidl's avatar
    Fabian Seidl committed
    		Pnd: &ppb.PrincipalNetworkDomain{
    			Id:          pnd.ID().String(),
    			Name:        pnd.GetName(),
    			Description: pnd.GetDescription(),
    		},
    		Sbi: sbis,
    
    func fillSbis(pnd networkdomain.NetworkDomain) ([]*spb.SouthboundInterface, error) {
    
    	sbis, err := pnd.GetSBIs()
    	if err != nil {
    		return nil, err
    
    Manuel Kieweg's avatar
    Manuel Kieweg committed
    	}
    
    	sbisToReturn := []*spb.SouthboundInterface{}
    
    	for _, sbi := range sbis {
    		sbisToReturn = append(sbisToReturn, &spb.SouthboundInterface{
    			Id: sbi.ID().String(),
    		})
    
    Manuel Kieweg's avatar
    Manuel Kieweg committed
    	}
    
    // SetSbiList sets a list of sbis.
    
    func (p PndServer) SetSbiList(ctx context.Context, request *ppb.SetSbiListRequest) (*ppb.SetSbiListResponse, error) {
    
    Fabian Seidl's avatar
    Fabian Seidl committed
    	labels := prometheus.Labels{"service": "pnd", "rpc": "set"}
    	start := metrics.StartHook(labels, grpcRequestsTotal)
    	defer metrics.FinishHook(labels, start, grpcRequestDurationSecondsTotal, grpcRequestDurationSeconds)
    	pid, err := uuid.Parse(request.Pid)
    	if err != nil {
    		return nil, handleRPCError(labels, err)
    	}
    
    
    	pnd, err := p.pndService.Get(store.Query{ID: pid})
    
    Fabian Seidl's avatar
    Fabian Seidl committed
    	if err != nil {
    		return nil, handleRPCError(labels, err)
    	}
    
    	for _, r := range request.Sbi {
    		sbiType := filterSbiType(r.SbiType)
    		sbi, err := nucleus.NewSBI(sbiType)
    		if err != nil {
    			return nil, handleRPCError(labels, err)
    		}
    
    		err = pnd.AddSbi(sbi)
    		if err != nil {
    			return nil, handleRPCError(labels, err)
    		}
    	}
    
    	return &ppb.SetSbiListResponse{
    		Timestamp: time.Now().UnixNano(),
    		Status:    ppb.Status_STATUS_OK,
    		Responses: []*ppb.SetResponse{
    			{
    				Status: ppb.Status_STATUS_OK,
    			},
    		},
    	}, nil
    }
    
    func filterSbiType(sbiType ppb.SbiType) spb.Type {
    	var spbType spb.Type
    
    	switch sbiType {
    	case ppb.SbiType_SBI_TYPE_OPENCONFIG:
    		spbType = spb.Type_TYPE_OPENCONFIG
    	case ppb.SbiType_SBI_TYPE_CONTAINERISED:
    		spbType = spb.Type_TYPE_CONTAINERISED
    	case ppb.SbiType_SBI_TYPE_PLUGIN:
    		spbType = spb.Type_TYPE_PLUGIN
    	default:
    		spbType = spb.Type_TYPE_UNSPECIFIED
    	}
    
    	return spbType
    }