Skip to content

Commit 31fb861

Browse files
authored
Tests for invitation manager SQL driver (#3619)
* add sql repository implementation for ocm tokens and ocm users * add changelog * add header * add tests for sql driver * enable mysql service for integration tests * add header * bail out if env variables are not set * fixes * add changelog * fixes workflow * removed unused files * init data * run integration tests in docker container * open port for mysql service * fix equal check
1 parent 0374913 commit 31fb861

File tree

6 files changed

+491
-264
lines changed

6 files changed

+491
-264
lines changed

.github/workflows/test.yml

+11
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,20 @@ jobs:
2020
run: make test-integration
2121
env:
2222
REDIS_ADDRESS: redis:6379
23+
SQL_USERNAME: root
24+
SQL_PASSWORD: my-secret-pw
25+
SQL_ADDRESS: localhost:3306
26+
SQL_DBNAME: reva
2327
services:
2428
redis:
2529
image: registry.cern.ch/docker.io/webhippie/redis
30+
mysql:
31+
image: mysql
32+
ports:
33+
- 3306:3306
34+
env:
35+
MYSQL_ROOT_PASSWORD: my-secret-pw
36+
MYSQL_DATABASE: reva
2637
go:
2738
runs-on: self-hosted
2839
steps:
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
Enhancement: Tests for invitation manager SQL driver
2+
3+
https://github.com/cs3org/reva/pull/3619

tests/integration/grpc/fixtures/ocm-server-cernbox-grpc.toml

+7-1
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,18 @@ driver = "static"
2020
basic = "{{grpc_address}}"
2121

2222
[grpc.services.ocminvitemanager]
23-
driver = "json"
23+
driver = "{{ocm_driver}}"
2424
provider_domain = "cernbox.cern.ch"
2525

2626
[grpc.services.ocminvitemanager.drivers.json]
2727
file = "{{invite_token_file}}"
2828

29+
[grpc.services.ocminvitemanager.drivers.sql]
30+
db_username = "{{db_username}}"
31+
db_password = "{{db_password}}"
32+
db_address = "{{db_address}}"
33+
db_name = "{{db_name}}"
34+
2935
[grpc.services.ocmproviderauthorizer]
3036
driver = "json"
3137

tests/integration/grpc/fixtures/ocm-server-cesnet-grpc.toml

+7-1
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,18 @@ driver = "static"
2020
basic = "{{grpc_address}}"
2121

2222
[grpc.services.ocminvitemanager]
23-
driver = "json"
23+
driver = "{{ocm_driver}}"
2424
provider_domain = "cesnet.cz"
2525

2626
[grpc.services.ocminvitemanager.drivers.json]
2727
file = "{{invite_token_file}}"
2828

29+
[grpc.services.ocminvitemanager.drivers.sql]
30+
db_username = "{{db_username}}"
31+
db_password = "{{db_password}}"
32+
db_address = "{{db_address}}"
33+
db_name = "{{db_name}}"
34+
2935
[grpc.services.ocmproviderauthorizer]
3036
driver = "json"
3137

+181
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,181 @@
1+
// Copyright 2018-2023 CERN
2+
//
3+
// Licensed under the Apache License, Version 2.0 (the "License");
4+
// you may not use this file except in compliance with the License.
5+
// You may obtain a copy of the License at
6+
//
7+
// http://www.apache.org/licenses/LICENSE-2.0
8+
//
9+
// Unless required by applicable law or agreed to in writing, software
10+
// distributed under the License is distributed on an "AS IS" BASIS,
11+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
// See the License for the specific language governing permissions and
13+
// limitations under the License.
14+
//
15+
// In applying this license, CERN does not waive the privileges and immunities
16+
// granted to it by virtue of its status as an Intergovernmental Organization
17+
// or submit itself to any jurisdiction.
18+
19+
package grpc_test
20+
21+
import (
22+
"database/sql"
23+
"fmt"
24+
"os"
25+
"time"
26+
27+
conversions "github.com/cs3org/reva/pkg/cbox/utils"
28+
. "github.com/onsi/ginkgo"
29+
. "github.com/onsi/gomega"
30+
"github.com/pkg/errors"
31+
32+
userpb "github.com/cs3org/go-cs3apis/cs3/identity/user/v1beta1"
33+
invitepb "github.com/cs3org/go-cs3apis/cs3/ocm/invite/v1beta1"
34+
"github.com/cs3org/reva/tests/helpers"
35+
36+
_ "github.com/go-sql-driver/mysql"
37+
)
38+
39+
func initData(driver string, tokens []*invitepb.InviteToken, acceptedUsers map[string][]*userpb.User) (map[string]string, func(), error) {
40+
variables := map[string]string{
41+
"ocm_driver": driver,
42+
}
43+
switch driver {
44+
case "json":
45+
return initJSONData(variables, tokens, acceptedUsers)
46+
case "sql":
47+
return initSQLData(variables, tokens, acceptedUsers)
48+
}
49+
50+
return nil, nil, errors.New("driver not found")
51+
}
52+
53+
func initJSONData(variables map[string]string, tokens []*invitepb.InviteToken, acceptedUsers map[string][]*userpb.User) (map[string]string, func(), error) {
54+
data := map[string]any{}
55+
56+
if len(tokens) != 0 {
57+
m := map[string]*invitepb.InviteToken{}
58+
for _, tkn := range tokens {
59+
m[tkn.Token] = tkn
60+
}
61+
data["invites"] = m
62+
}
63+
64+
if len(acceptedUsers) != 0 {
65+
data["accepted_users"] = acceptedUsers
66+
}
67+
68+
inviteTokenFile, err := helpers.TempJSONFile(data)
69+
if err != nil {
70+
return nil, nil, err
71+
}
72+
cleanup := func() {
73+
Expect(os.RemoveAll(inviteTokenFile)).To(Succeed())
74+
}
75+
variables["invite_token_file"] = inviteTokenFile
76+
return variables, cleanup, nil
77+
}
78+
79+
func initTables(db *sql.DB) error {
80+
table1 := `
81+
CREATE TABLE IF NOT EXISTS ocm_tokens (
82+
token VARCHAR(255) NOT NULL PRIMARY KEY,
83+
initiator VARCHAR(255) NOT NULL,
84+
expiration DATETIME NOT NULL,
85+
description VARCHAR(255) DEFAULT NULL
86+
)`
87+
table2 := `
88+
CREATE TABLE IF NOT EXISTS ocm_remote_users (
89+
initiator VARCHAR(255) NOT NULL,
90+
opaque_user_id VARCHAR(255) NOT NULL,
91+
idp VARCHAR(255) NOT NULL,
92+
email VARCHAR(255) NOT NULL,
93+
display_name VARCHAR(255) NOT NULL,
94+
PRIMARY KEY (initiator, opaque_user_id, idp)
95+
)`
96+
if _, err := db.Exec(table1); err != nil {
97+
return err
98+
}
99+
if _, err := db.Exec(table2); err != nil {
100+
return err
101+
}
102+
return nil
103+
}
104+
105+
func dropTables(db *sql.DB) error {
106+
drop1 := "DROP TABLE IF EXISTS ocm_tokens"
107+
drop2 := "DROP TABLE IF EXISTS ocm_remote_users"
108+
if _, err := db.Exec(drop1); err != nil {
109+
return err
110+
}
111+
if _, err := db.Exec(drop2); err != nil {
112+
return err
113+
}
114+
return nil
115+
}
116+
117+
func initSQLData(variables map[string]string, tokens []*invitepb.InviteToken, acceptedUsers map[string][]*userpb.User) (map[string]string, func(), error) {
118+
username := os.Getenv("SQL_USERNAME")
119+
if username == "" {
120+
Fail("SQL_USERNAME not set")
121+
}
122+
password := os.Getenv("SQL_PASSWORD")
123+
if password == "" {
124+
Fail("SQL_PASSWORD not set")
125+
}
126+
address := os.Getenv("SQL_ADDRESS")
127+
if address == "" {
128+
Fail("SQL_ADDRESS not set")
129+
}
130+
database := os.Getenv("SQL_DBNAME")
131+
if database == "" {
132+
Fail("SQL_DBNAME not set")
133+
}
134+
135+
db, err := sql.Open("mysql", fmt.Sprintf("%s:%s@tcp(%s)/%s", username, password, address, database))
136+
if err != nil {
137+
return nil, nil, err
138+
}
139+
if err := initTables(db); err != nil {
140+
return nil, nil, err
141+
}
142+
cleanup := func() {
143+
Expect(dropTables(db)).To(Succeed())
144+
}
145+
146+
variables["db_username"] = username
147+
variables["db_password"] = password
148+
variables["db_address"] = address
149+
variables["db_name"] = database
150+
151+
if err := initTokens(db, tokens); err != nil {
152+
return nil, nil, err
153+
}
154+
if err := initAcceptedUsers(db, acceptedUsers); err != nil {
155+
return nil, nil, err
156+
}
157+
158+
return variables, cleanup, nil
159+
}
160+
161+
func initTokens(db *sql.DB, tokens []*invitepb.InviteToken) error {
162+
query := "INSERT INTO ocm_tokens (token, initiator, expiration, description) VALUES (?,?,?,?)"
163+
for _, token := range tokens {
164+
if _, err := db.Exec(query, token.Token, conversions.FormatUserID(token.UserId), time.Unix(int64(token.Expiration.Seconds), 0), token.Description); err != nil {
165+
return err
166+
}
167+
}
168+
return nil
169+
}
170+
171+
func initAcceptedUsers(db *sql.DB, acceptedUsers map[string][]*userpb.User) error {
172+
query := "INSERT INTO ocm_remote_users (initiator, opaque_user_id, idp, email, display_name) VALUES (?,?,?,?,?)"
173+
for initiator, users := range acceptedUsers {
174+
for _, user := range users {
175+
if _, err := db.Exec(query, initiator, user.Id.OpaqueId, user.Id.Idp, user.Mail, user.DisplayName); err != nil {
176+
return err
177+
}
178+
}
179+
}
180+
return nil
181+
}

0 commit comments

Comments
 (0)