package integration_test_utils import ( "context" "fmt" "os" "time" configMgmtPb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/configurationmanagement" ppb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/pnd" apb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/rbac" "github.com/sirupsen/logrus" "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/rbac" "code.fbi.h-da.de/danet/gosdn/controller/api" "google.golang.org/grpc" "google.golang.org/grpc/credentials/insecure" "google.golang.org/grpc/metadata" ) const admin = "admin" // Default target values. const DefaultTargetPluginUUID = "d1c269a2-6482-4010-b0d8-679dff73153b" const DefaultTargetAAdress = "gnmi-target_A:7030" const DefaultTargetBAdress = "gnmi-target_B:7030" const DefaultTargetUsername = "admin" const DefaultTargetPassword = "admin" func CreateContextWithAuthorization(loginResponse *rbac.LoginResponse) context.Context { md := metadata.Pairs("authorize", loginResponse.Token) return metadata.NewOutgoingContext(context.Background(), md) } func CreateSecureConnection() (*grpc.ClientConn, context.Context, error) { username := "admin" password := "TestPassword" controllerUrl := "localhost:55055" controllerEnv := os.Getenv("INTEGRATION_TEST_CONTROLLER_URL") if controllerEnv != "" { controllerUrl = controllerEnv } loginResp, err := api.Login(context.Background(), controllerUrl, username, password) if err != nil { return nil, nil, err } sessionContext := CreateContextWithAuthorization(loginResp) dialOption := grpc.WithTransportCredentials(insecure.NewCredentials()) conn, err := grpc.NewClient(controllerUrl, dialOption, grpc.WithDefaultCallOptions(grpc.MaxCallRecvMsgSize(100*1024*1024))) if err != nil { return nil, nil, err } return conn, sessionContext, nil } func CreateConnection() (*grpc.ClientConn, context.Context, error) { controllerUrl := "localhost:55055" controllerEnv := os.Getenv("INTEGRATION_TEST_CONTROLLER_URL") if controllerEnv != "" { controllerUrl = controllerEnv } dialOption := grpc.WithTransportCredentials(insecure.NewCredentials()) conn, err := grpc.NewClient(controllerUrl, dialOption, grpc.WithDefaultCallOptions(grpc.MaxCallRecvMsgSize(100*1024*1024))) if err != nil { return nil, nil, err } sessionContext := context.Background() return conn, sessionContext, nil } // ExportCurrentSDNConfig can be used to save the current SDN config as a string to use in an other test later on. func ExportCurrentSDNConfig(conn *grpc.ClientConn, ctx context.Context) (string, error) { pndService := ppb.NewPndServiceClient(conn) pndRes, err := pndService.GetPndList(ctx, &ppb.GetPndListRequest{Timestamp: GetTimestamp()}) if err != nil { return "", err } pndID := pndRes.Pnd[0].Id configMgmtService := configMgmtPb.NewConfigurationManagementServiceClient(conn) sdnConfigResponse, err := configMgmtService.ExportSDNConfig(ctx, &configMgmtPb.ExportSDNConfigRequest{Timestamp: GetTimestamp(), Pid: pndID}) if err != nil { return "", err } return sdnConfigResponse.SdnConfigData, nil } // ApplySDNConfig can be used to apply a given SDN config as a string to set the testing environment as desired. func ApplySDNConfig(conn *grpc.ClientConn, ctx context.Context, sdnConfig string) { pndService := ppb.NewPndServiceClient(conn) pndRes, err := pndService.GetPndList(ctx, &ppb.GetPndListRequest{Timestamp: GetTimestamp()}) if err != nil { fmt.Println(err) } // currently only support for default PND pndID := pndRes.Pnd[0].Id configMgmtService := configMgmtPb.NewConfigurationManagementServiceClient(conn) _, err = configMgmtService.ImportSDNConfig(ctx, &configMgmtPb.ImportSDNConfigRequest{Timestamp: GetTimestamp(), Pid: pndID, SdnConfigData: sdnConfig}) if err != nil { fmt.Println(err) } } func GetTimestamp() int64 { return int64(time.Now().Nanosecond()) } func CleanUserAndRolesExceptAdmin(conn *grpc.ClientConn, ctx context.Context) { userService := apb.NewUserServiceClient(conn) roleService := apb.NewRoleServiceClient(conn) getAllUserResponse, err := userService.GetUsers(ctx, &apb.GetUsersRequest{ Timestamp: GetTimestamp(), }) if err != nil { logrus.Errorf("Error while cleaning up DB, %v", err) } err = cleanUsersExceptAdmin(getAllUserResponse, userService, ctx) if err != nil { logrus.Errorf("Error while cleaning up DB, %v", err) } getAllRoleResponse, err := roleService.GetRoles(ctx, &apb.GetRolesRequest{ Timestamp: GetTimestamp(), }) if err != nil { logrus.Errorf("Error while cleaning up DB, %v", err) } err = cleanRolesExceptAdmin(getAllRoleResponse, roleService, ctx) if err != nil { logrus.Errorf("Error while cleaning up DB, %v", err) } } func cleanUsersExceptAdmin(resp *apb.GetUsersResponse, userService apb.UserServiceClient, ctx context.Context) error { // no need to delete if only admin available if len(resp.User) == 1 { return nil } var names []string for _, u := range resp.User { if u.Name == admin { continue } names = append(names, u.Name) } _, err := userService.DeleteUsers(ctx, &apb.DeleteUsersRequest{ Timestamp: GetTimestamp(), Username: names, }) if err != nil { return err } return nil } func cleanRolesExceptAdmin(resp *apb.GetRolesResponse, roleService apb.RoleServiceClient, ctx context.Context) error { // no need to delete if only admin available if len(resp.Roles) == 1 { return nil } var names []string for _, role := range resp.Roles { if role.Name == admin { continue } names = append(names, role.Name) } _, err := roleService.DeleteRoles(ctx, &apb.DeleteRolesRequest{ Timestamp: GetTimestamp(), RoleName: names, }) if err != nil { return err } return nil }