Skip to content
Snippets Groups Projects
core.go 3.33 KiB
Newer Older
  • Learn to ignore specific revisions
  • Manuel Kieweg's avatar
    Manuel Kieweg committed
    package server
    
    import (
    	"context"
    	"time"
    
    
    Manuel Kieweg's avatar
    Manuel Kieweg committed
    	pb "code.fbi.h-da.de/danet/api/go/gosdn/core"
    	ppb "code.fbi.h-da.de/danet/api/go/gosdn/pnd"
    	spb "code.fbi.h-da.de/danet/api/go/gosdn/southbound"
    
    Malte Bauch's avatar
    Malte Bauch committed
    	"code.fbi.h-da.de/danet/gosdn/metrics"
    
    Manuel Kieweg's avatar
    Manuel Kieweg committed
    	"code.fbi.h-da.de/danet/gosdn/nucleus"
    
    Manuel Kieweg's avatar
    Manuel Kieweg committed
    	"github.com/google/uuid"
    
    Malte Bauch's avatar
    Malte Bauch committed
    	"github.com/prometheus/client_golang/prometheus"
    
    Manuel Kieweg's avatar
    Manuel Kieweg committed
    )
    
    type core struct {
    
    func (s core) 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)
    
    
    	pndList, err := stringToUUID(request.Pid)
    	if err != nil {
    		return nil, handleRPCError(labels, err)
    
    Manuel Kieweg's avatar
    Manuel Kieweg committed
    	}
    
    	pnds := make([]*ppb.PrincipalNetworkDomain, len(pndList))
    	for i, id := range pndList {
    
    		pnd, err := pndc.GetPND(id)
    
    Manuel Kieweg's avatar
    Manuel Kieweg committed
    		if err != nil {
    			return nil, err
    		}
    
    		pnds[i] = &ppb.PrincipalNetworkDomain{
    			Id:          pnd.ID().String(),
    			Name:        pnd.GetName(),
    			Description: pnd.GetDescription(),
    
    	}
    	return &pb.GetPndResponse{
    		Timestamp: time.Now().UnixNano(),
    		Pnd:       pnds,
    	}, nil
    }
    
    func (s core) GetPndList(ctx context.Context, request *pb.GetPndListRequest) (*pb.GetPndListResponse, error) {
    	labels := prometheus.Labels{"service": "core", "rpc": "get"}
    	start := metrics.StartHook(labels, grpcRequestsTotal)
    	defer metrics.FinishHook(labels, start, grpcRequestDurationSecondsTotal, grpcRequestDurationSeconds)
    
    	pndList := pndc.UUIDs()
    
    	pnds := make([]*ppb.PrincipalNetworkDomain, len(pndList))
    	for i, id := range pndList {
    		pnd, err := pndc.GetPND(id)
    
    			return nil, err
    
    Manuel Kieweg's avatar
    Manuel Kieweg committed
    		pnds[i] = &ppb.PrincipalNetworkDomain{
    			Id:          pnd.ID().String(),
    			Name:        pnd.GetName(),
    			Description: pnd.GetDescription(),
    		}
    	}
    
    	return &pb.GetPndListResponse{
    
    Manuel Kieweg's avatar
    Manuel Kieweg committed
    		Timestamp: time.Now().UnixNano(),
    		Pnd:       pnds,
    	}, nil
    }
    
    
    func (s core) 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 {
    
    		sbi, err := nucleus.NewSBI(spb.Type_TYPE_OPENCONFIG)
    		if err != nil {
    			return nil, handleRPCError(labels, err)
    		}
    
    		pnd, err := nucleus.NewPND(r.Name, r.Description, uuid.New(), sbi, nil, nil)
    
    Manuel Kieweg's avatar
    Manuel Kieweg committed
    		if err != nil {
    
    Malte Bauch's avatar
    Malte Bauch committed
    			return nil, handleRPCError(labels, err)
    
    Manuel Kieweg's avatar
    Manuel Kieweg committed
    		}
    		if err := pndc.Add(pnd); err != nil {
    
    Malte Bauch's avatar
    Malte Bauch committed
    			return nil, handleRPCError(labels, err)
    
    	return &pb.CreatePndListResponse{
    		Timestamp: time.Now().UnixNano(),
    		Status:    pb.Status_STATUS_OK,
    	}, nil
    }
    
    func (s core) DeletePnd(ctx context.Context, request *pb.DeletePndRequest) (*pb.DeletePndResponse, error) {
    	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)
    	}
    	pndc.Delete(pndId)
    
    	return &pb.DeletePndResponse{
    
    Manuel Kieweg's avatar
    Manuel Kieweg committed
    		Timestamp: time.Now().UnixNano(),
    
    		Status:    pb.Status_STATUS_OK,
    
    Manuel Kieweg's avatar
    Manuel Kieweg committed
    	}, nil
    }