From 69f7084fd8a5e56eea71abdcc6f059da53bfbf2e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Andr=C3=A9=20Sterba?= <andre.sterba@stud.h-da.de>
Date: Mon, 4 Jul 2022 10:58:06 +0200
Subject: [PATCH] Add get role by ID

---
 cli/cmd/userGet.go                   | 8 +++++++-
 controller/api/role.go               | 4 +++-
 controller/api/role_test.go          | 3 ++-
 controller/northbound/server/role.go | 8 +++++++-
 4 files changed, 19 insertions(+), 4 deletions(-)

diff --git a/cli/cmd/userGet.go b/cli/cmd/userGet.go
index b5f1a0bd9..1a487a3a7 100644
--- a/cli/cmd/userGet.go
+++ b/cli/cmd/userGet.go
@@ -33,6 +33,7 @@ package cmd
 
 import (
 	"code.fbi.h-da.de/danet/gosdn/controller/api"
+	"github.com/google/uuid"
 	log "github.com/sirupsen/logrus"
 	"github.com/spf13/cobra"
 	"github.com/spf13/viper"
@@ -45,7 +46,12 @@ var userGetCmd = &cobra.Command{
 	Long:  `Requests one user using the provided name to search for it in the stored users.`,
 
 	RunE: func(cmd *cobra.Command, args []string) error {
-		resp, err := api.GetUser(createContextWithAuthorization(), viper.GetString("controllerAPIEndpoint"), nbUserName)
+		resp, err := api.GetUser(
+			createContextWithAuthorization(),
+			viper.GetString("controllerAPIEndpoint"),
+			nbUserName,
+			uuid.Nil,
+		)
 		if err != nil {
 			return err
 		}
diff --git a/controller/api/role.go b/controller/api/role.go
index b9d6bcc5c..cef731972 100644
--- a/controller/api/role.go
+++ b/controller/api/role.go
@@ -6,6 +6,7 @@ import (
 
 	apb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/rbac"
 	nbi "code.fbi.h-da.de/danet/gosdn/controller/northbound/client"
+	"github.com/google/uuid"
 )
 
 // CreateRoles creates roles with provided data
@@ -24,7 +25,7 @@ func CreateRoles(ctx context.Context, addr string, roles []*apb.Role) (*apb.Crea
 }
 
 // GetRole returns one requested role found by name
-func GetRole(ctx context.Context, addr, name string) (*apb.GetRoleResponse, error) {
+func GetRole(ctx context.Context, addr, name string, uuid uuid.UUID) (*apb.GetRoleResponse, error) {
 	roleClient, err := nbi.RoleClient(addr, dialOptions...)
 	if err != nil {
 		return nil, err
@@ -33,6 +34,7 @@ func GetRole(ctx context.Context, addr, name string) (*apb.GetRoleResponse, erro
 	r := &apb.GetRoleRequest{
 		Timestamp: time.Now().UnixNano(),
 		RoleName:  name,
+		Id:        uuid.String(),
 	}
 
 	return roleClient.GetRole(ctx, r)
diff --git a/controller/api/role_test.go b/controller/api/role_test.go
index c98b0d277..2dd79fd69 100644
--- a/controller/api/role_test.go
+++ b/controller/api/role_test.go
@@ -61,6 +61,7 @@ func TestGetRole(t *testing.T) {
 		ctx  context.Context
 		addr string
 		name string
+		uuid uuid.UUID
 	}
 	tests := []struct {
 		name    string
@@ -97,7 +98,7 @@ func TestGetRole(t *testing.T) {
 	}
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
-			got, err := GetRole(tt.args.ctx, tt.args.addr, tt.args.name)
+			got, err := GetRole(tt.args.ctx, tt.args.addr, tt.args.name, tt.args.uuid)
 			if (err != nil) != tt.wantErr {
 				t.Errorf("GetRole() error = %v, wantErr %v", err, tt.wantErr)
 				return
diff --git a/controller/northbound/server/role.go b/controller/northbound/server/role.go
index 4cb05b6e1..4141c6250 100644
--- a/controller/northbound/server/role.go
+++ b/controller/northbound/server/role.go
@@ -2,6 +2,7 @@ package server
 
 import (
 	"context"
+	"fmt"
 	"time"
 
 	apb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/rbac"
@@ -59,7 +60,12 @@ func (r Role) GetRole(ctx context.Context, request *apb.GetRoleRequest) (*apb.Ge
 	start := metrics.StartHook(labels, grpcRequestsTotal)
 	defer metrics.FinishHook(labels, start, grpcRequestDurationSecondsTotal, grpcRequestDurationSeconds)
 
-	roleData, err := r.roleService.Get(store.Query{Name: request.RoleName})
+	roleID, err := uuid.Parse(request.Id)
+	if err != nil {
+		return nil, fmt.Errorf("could not parse role uuid")
+	}
+
+	roleData, err := r.roleService.Get(store.Query{Name: request.RoleName, ID: roleID})
 	if err != nil {
 		return nil, err
 	}
-- 
GitLab