diff --git a/northbound/server/pnd.go b/northbound/server/pnd.go index 9b46337668225aa4508aada51c44c388ca955d28..f0f8248b06905d4cfe3adaeec8dd960a40c6a287 100644 --- a/northbound/server/pnd.go +++ b/northbound/server/pnd.go @@ -5,6 +5,9 @@ import ( "reflect" "time" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" + "code.fbi.h-da.de/cocsn/gosdn/interfaces/device" ppb "code.fbi.h-da.de/cocsn/api/go/gosdn/pnd" @@ -14,6 +17,7 @@ import ( "code.fbi.h-da.de/cocsn/gosdn/nucleus/errors" "github.com/google/uuid" "github.com/openconfig/ygot/ygot" + log "github.com/sirupsen/logrus" ) type pndServer struct { @@ -23,7 +27,8 @@ type pndServer struct { func (p pndServer) Get(ctx context.Context, request *ppb.GetRequest) (*ppb.GetResponse, error) { pid, err := uuid.Parse(request.Pid) if err != nil { - return nil, err + log.Error(err) + return nil, status.Errorf(codes.Aborted, "%v", err) } switch req := request.Request.(type) { case *ppb.GetRequest_Pnd: @@ -42,19 +47,23 @@ func (p pndServer) Get(ctx context.Context, request *ppb.GetRequest) (*ppb.GetRe func handleGetPnd(pid uuid.UUID) (*ppb.GetResponse, error) { pnd, err := pndc.GetPND(pid) if err != nil { - return nil, err + log.Error(err) + return nil, status.Errorf(codes.Aborted, "%v", err) } onds, err := fillOnds(pnd, true) if err != nil { - return nil, err + log.Error(err) + return nil, status.Errorf(codes.Aborted, "%v", err) } sbis, err := fillSbis(pnd, true) if err != nil { - return nil, err + log.Error(err) + return nil, status.Errorf(codes.Aborted, "%v", err) } changes, err := fillChanges(pnd, true) if err != nil { - return nil, err + log.Error(err) + return nil, status.Errorf(codes.Aborted, "%v", err) } return &ppb.GetResponse{ @@ -73,11 +82,13 @@ func handleGetPnd(pid uuid.UUID) (*ppb.GetResponse, error) { func handleGetSbi(pid uuid.UUID, req *ppb.GetRequest_Sbi) (*ppb.GetResponse, error) { pnd, err := pndc.GetPND(pid) if err != nil { - return nil, err + log.Error(err) + return nil, status.Errorf(codes.Aborted, "%v", err) } sbis, err := fillSbis(pnd, req.Sbi.GetAll(), req.Sbi.Sid...) if err != nil { - return nil, err + log.Error(err) + return nil, status.Errorf(codes.Aborted, "%v", err) } return &ppb.GetResponse{ Timestamp: time.Now().UnixNano(), @@ -90,7 +101,8 @@ func stringToUUID(sid []string) ([]uuid.UUID, error) { for i, id := range sid { parsed, err := uuid.Parse(id) if err != nil { - return nil, err + log.Error(err) + return nil, status.Errorf(codes.Aborted, "%v", err) } UUIDs[i] = parsed } @@ -100,11 +112,13 @@ func stringToUUID(sid []string) ([]uuid.UUID, error) { func handleGetOnd(pid uuid.UUID, req *ppb.GetRequest_Ond) (*ppb.GetResponse, error) { pnd, err := pndc.GetPND(pid) if err != nil { - return nil, err + log.Error(err) + return nil, status.Errorf(codes.Aborted, "%v", err) } onds, err := fillOnds(pnd, req.Ond.All, req.Ond.Did...) if err != nil { - return nil, err + log.Error(err) + return nil, status.Errorf(codes.Aborted, "%v", err) } return &ppb.GetResponse{ Timestamp: time.Now().UnixNano(), @@ -115,11 +129,13 @@ func handleGetOnd(pid uuid.UUID, req *ppb.GetRequest_Ond) (*ppb.GetResponse, err func handleGetChange(pid uuid.UUID, req *ppb.GetRequest_Change) (*ppb.GetResponse, error) { pnd, err := pndc.GetPND(pid) if err != nil { - return nil, err + log.Error(err) + return nil, status.Errorf(codes.Aborted, "%v", err) } changes, err := fillChanges(pnd, req.Change.All, req.Change.Cuid...) if err != nil { - return nil, err + log.Error(err) + return nil, status.Errorf(codes.Aborted, "%v", err) } return &ppb.GetResponse{ Timestamp: time.Now().UnixNano(), @@ -144,14 +160,16 @@ func fillSbis(pnd networkdomain.NetworkDomain, all bool, sid ...string) ([]*spb. } sbiList, err = stringToUUID(sid) if err != nil { - return nil, err + log.Error(err) + return nil, status.Errorf(codes.Aborted, "%v", err) } } sbis := make([]*spb.SouthboundInterface, len(sbiList)) for i, id := range sbiList { sbi, err := sbiStore.GetSBI(id) if err != nil { - return nil, err + log.Error(err) + return nil, status.Errorf(codes.Aborted, "%v", err) } sbis[i] = &spb.SouthboundInterface{ Id: id.String(), @@ -177,7 +195,8 @@ func fillOnds(pnd networkdomain.NetworkDomain, all bool, did ...string) ([]*ppb. } ondList, err = stringToUUID(did) if err != nil { - return nil, err + log.Error(err) + return nil, status.Errorf(codes.Aborted, "%v", err) } } @@ -185,12 +204,14 @@ func fillOnds(pnd networkdomain.NetworkDomain, all bool, did ...string) ([]*ppb. for i, id := range ondList { d, err := pnd.GetDevice(id.String()) if err != nil { - return nil, err + log.Error(err) + return nil, status.Errorf(codes.Aborted, "%v", err) } cfg := ygot.GNMINotificationsConfig{} dev, err := ygot.TogNMINotifications(d.(device.Device).Model(), time.Now().UnixNano(), cfg) if err != nil { - return nil, err + log.Error(err) + return nil, status.Errorf(codes.Aborted, "%v", err) } onds[i] = &ppb.OrchestratedNetworkingDevice{ Id: id.String(), @@ -218,7 +239,8 @@ func fillChanges(pnd networkdomain.NetworkDomain, all bool, cuid ...string) ([]* } changeList, err = stringToUUID(cuid) if err != nil { - return nil, err + log.Error(err) + return nil, status.Errorf(codes.Aborted, "%v", err) } } @@ -226,7 +248,8 @@ func fillChanges(pnd networkdomain.NetworkDomain, all bool, cuid ...string) ([]* for i, ch := range changeList { c, err := pnd.GetChange(ch) if err != nil { - return nil, err + log.Error(err) + return nil, status.Errorf(codes.Aborted, "%v", err) } change, ok := c.(*nucleus.Change) if !ok { @@ -248,25 +271,30 @@ func fillChanges(pnd networkdomain.NetworkDomain, all bool, cuid ...string) ([]* func (p pndServer) Set(ctx context.Context, request *ppb.SetRequest) (*ppb.SetResponse, error) { pid, err := uuid.Parse(request.Pid) if err != nil { - return nil, err + log.Error(err) + return nil, status.Errorf(codes.Aborted, "%v", err) } pnd, err := pndc.GetPND(pid) if err != nil { - return nil, err + log.Error(err) + return nil, status.Errorf(codes.Aborted, "%v", err) } ondResp, err := handleSetOnd(pnd, request.Ond) if err != nil { - return nil, err + log.Error(err) + return nil, status.Errorf(codes.Aborted, "%v", err) } changeResp, err := handleSetChange(pnd, request.Change) if err != nil { - return nil, err + log.Error(err) + return nil, status.Errorf(codes.Aborted, "%v", err) } changeRequestResp, err := handleChangeRequest(pnd, request.ChangeRequest) if err != nil { - return nil, err + log.Error(err) + return nil, status.Errorf(codes.Aborted, "%v", err) } return &ppb.SetResponse{ Timestamp: time.Now().UnixNano(), @@ -283,10 +311,12 @@ func handleSetOnd(pnd networkdomain.NetworkDomain, req []*ppb.SetOnd) (*ppb.SetR for _, r := range req { sid, err := uuid.Parse(r.Sbi.Id) if err != nil { - return nil, err + log.Error(err) + return nil, status.Errorf(codes.Aborted, "%v", err) } if err := pnd.AddDevice(r.DeviceName, r.TransportOption, sid); err != nil { - return nil, err + log.Error(err) + return nil, status.Errorf(codes.Aborted, "%v", err) } } return &ppb.SetResponse{ @@ -306,16 +336,19 @@ func handleSetChange(pnd networkdomain.NetworkDomain, req []*ppb.SetChange) (*pp for _, r := range req { cuid, err := uuid.Parse(r.Cuid) if err != nil { - return nil, err + log.Error(err) + return nil, status.Errorf(codes.Aborted, "%v", err) } switch r.Op { case ppb.SetChange_COMMIT: if err := pnd.Commit(cuid); err != nil { - return nil, err + log.Error(err) + return nil, status.Errorf(codes.Aborted, "%v", err) } case ppb.SetChange_CONFIRM: if err := pnd.Confirm(cuid); err != nil { - return nil, err + log.Error(err) + return nil, status.Errorf(codes.Aborted, "%v", err) } default: return nil, &errors.ErrInvalidParameters{ @@ -334,10 +367,12 @@ func handleChangeRequest(pnd networkdomain.NetworkDomain, req []*ppb.ChangeReque for _, r := range req { did, err := uuid.Parse(r.Id) if err != nil { - return nil, err + log.Error(err) + return nil, status.Errorf(codes.Aborted, "%v", err) } if err := pnd.ChangeOND(did, r.ApiOp, r.Path, r.Value); err != nil { - return nil, err + log.Error(err) + return nil, status.Errorf(codes.Aborted, "%v", err) } } return &ppb.SetResponse{ @@ -345,3 +380,30 @@ func handleChangeRequest(pnd networkdomain.NetworkDomain, req []*ppb.ChangeReque Status: ppb.SetResponse_OK, }, nil } + +func (p pndServer) Delete(ctx context.Context, req *ppb.DeleteRequest) (*ppb.DeleteResponse, error) { + pid, err := uuid.Parse(req.Pid) + if err != nil { + log.Error(err) + return nil, status.Errorf(codes.Aborted, "%v", err) + } + pnd, err := pndc.GetPND(pid) + if err != nil { + log.Error(err) + return nil, status.Errorf(codes.Aborted, "%v", err) + } + + did, err := uuid.Parse(req.Uuid) + if err != nil { + log.Error(err) + return nil, status.Errorf(codes.Aborted, "%v", err) + } + if err := pnd.RemoveDevice(did); err != nil { + log.Error(err) + return nil, status.Errorf(codes.Aborted, "%v", err) + } + return &ppb.DeleteResponse{ + Timestamp: time.Now().UnixNano(), + Status: ppb.DeleteResponse_OK, + }, nil +}