Skip to content

Commit 429a4aa

Browse files
committed
prepare test environment
1 parent 3828945 commit 429a4aa

File tree

9 files changed

+113
-18
lines changed

9 files changed

+113
-18
lines changed

Makefile

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,9 @@ test-cover: env ## Run tests and collect cross-package coverage inf
109109

110110
test-cluster: env ## Starts MongoDB test cluster. Use env var TEST_MONGODB_IMAGE to set flavor and version. Example: TEST_MONGODB_IMAGE=mongo:3.6 make test-cluster
111111
docker compose up --build -d
112-
./docker/scripts/setup-pbm.sh
112+
./docker/scripts/init-psmdb-kerberos.sh
113+
./docker/scripts/init-pbm.sh
113114

114115
test-cluster-clean: env ## Stops MongoDB test cluster.
115116
docker compose down --remove-orphans --volumes
117+
rm -f ./docker/kerberos/cache/*

docker-compose.yml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -265,7 +265,7 @@ services:
265265
- PORT2=27017
266266
- PORT3=27017
267267
- VERSION=${TEST_MONGODB_IMAGE}
268-
entrypoint: [ "/scripts/init-shard.sh" ]
268+
entrypoint: [ "/scripts/setup-shard.sh" ]
269269
restart: on-failure:20
270270

271271
standalone:
@@ -317,12 +317,13 @@ services:
317317
container_name: psmdb-kerberos
318318
hostname: psmdb-kerberos
319319
ports:
320-
- 27017:27017
320+
- 29017:27017
321321
environment:
322322
- KRB5_KTNAME=/tmp/mongodb.keytab
323323
- KRB5CCNAME=/tmp/krb5cc_0
324324
- MONGO_INITDB_ROOT_USERNAME=admin
325325
- MONGO_INITDB_ROOT_PASSWORD=adminpassword
326+
- MONGODB_HOST=psmdb-kerberos
326327
volumes:
327328
- ./docker/kerberos/conf/krb5.conf:/etc/krb5.conf
328329
- ./docker/scripts:/scripts
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
#!/bin/bash
2+
3+
docker exec -it psmdb-kerberos bash -c '/scripts/setup-krb5-mongo.sh'

docker/scripts/setup-krb5-mongo.sh

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,24 @@
22

33
username=${MONGO_INITDB_ROOT_USERNAME}
44
password=${MONGO_INITDB_ROOT_PASSWORD}
5-
port=${PORT:-27017}
65

7-
docker exec ${KERBEROS_HOST} bash -c "kinit [email protected] -kt /tmp/mongodb.keytab"
6+
echo "Waiting for startup.."
7+
until mongosh --host 127.0.0.1:27017 -u ${username} -p ${password} --eval 'quit(db.runCommand({ ping: 1 }).ok ? 0 : 2)' &>/dev/null; do
8+
printf '.'
9+
sleep 1
10+
done
811

9-
#docker exec --user root ${MONGO_HOST} bash -c "chown -R mongodb:root /tmp/krb5cc_0"
10-
docker exec --user root ${MONGO_HOST} bash -c "chown -R mongodb:root /tmp/mongodb.keytab"
11-
docker exec ${MONGO_HOST} mongosh "${MONGO_HOST}:${port}" -u ${username} -p ${password} --eval ''
12-
db.getSiblingDB("$external").createUser({user: "[email protected]",roles: [{role: "read", db: "admin"}]});
12+
echo "Started.."
13+
14+
# create role with anyAction on all resources (needed to allow exporter run execute commands)
15+
# create mongodb user using the same username as the kerberos principal
16+
mongosh --host 127.0.0.1:27017 -u ${username} -p ${password} <<EOF
17+
db.getSiblingDB("admin").createRole({
18+
role: "anyAction",
19+
privileges: [
20+
{ resource: { anyResource: true }, actions: [ "anyAction" ] }
21+
],
22+
roles: []
23+
});
24+
db.getSiblingDB("\$external").createUser({user: "[email protected]",roles: [{role: "anyAction", db: "admin"}]});
25+
EOF

docker/scripts/setup-krb5-server.sh

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ cat > /etc/krb5.conf <<EOL
1212
dns_lookup_kdc = false
1313
ignore_acceptor_hostname = true
1414
rdns = false
15-
noaddresses = TRUE
1615
[realms]
1716
PERCONATEST.COM = {
1817
kdc_ports = 88
@@ -27,13 +26,6 @@ EOL
2726
kdb5_util create -s -P password
2827
kadmin.local -q "addprinc -pw password root/admin"
2928
kadmin.local -q "addprinc -pw mongodb mongodb/${mongohost}"
30-
kadmin.local -q "addprinc -pw mongodb mongodb/${gateway_ip}"
3129
kadmin.local -q "addprinc -pw password1 pmm-test"
32-
3330
kadmin.local -q "ktadd -k /tmp/mongodb.keytab mongodb/${mongohost}@PERCONATEST.COM"
34-
kadmin.local -q "ktadd -k /tmp/exporter.keytab mongodb/${gateway_ip}@PERCONATEST.COM"
35-
36-
kadmin.local -q "ktadd -k /tmp/mongodb.keytab [email protected]"
37-
kadmin.local -q "ktadd -k /tmp/exporter.keytab [email protected]"
38-
3931
krb5kdc -n
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ done
3636

3737
echo "Started.."
3838

39-
echo init-shard.sh time now: `date +"%T" `
39+
echo setup-shard.sh time now: `date +"%T" `
4040
echo "Configuring sharding.."
4141
echo "${RS1}/${mongodb11}:${PORT1},${mongodb12}:${PORT2},${mongodb13}:${PORT3}"
4242
echo "${RS2}/${mongodb21}:${PORT1},${mongodb22}:${PORT2},${mongodb23}:${PORT3}"

exporter/exporter_test.go

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,12 @@ package exporter
1818
import (
1919
"context"
2020
"fmt"
21+
"github.com/stretchr/testify/require"
2122
"io"
2223
"net"
2324
"net/http"
2425
"net/http/httptest"
26+
"os"
2527
"strconv"
2628
"strings"
2729
"sync"
@@ -197,6 +199,75 @@ func TestMongoS(t *testing.T) {
197199
}
198200
}
199201

202+
func TestMongoWithGSSAPI(t *testing.T) {
203+
logger := logrus.New()
204+
205+
kerberosHost, err := tu.IpForContainer("kerberos")
206+
require.NoError(t, err)
207+
mongoHost, err := tu.IpForContainer("psmdb-kerberos")
208+
require.NoError(t, err)
209+
210+
config := fmt.Sprintf(`
211+
[libdefaults]
212+
default_realm = PERCONATEST.COM
213+
forwardable = true
214+
dns_lookup_realm = false
215+
dns_lookup_kdc = false
216+
ignore_acceptor_hostname = true
217+
rdns = false
218+
[realms]
219+
PERCONATEST.COM = {
220+
kdc_ports = 88
221+
kdc = %s
222+
}
223+
[domain_realm]
224+
.perconatest.com = PERCONATEST.COM
225+
perconatest.com = PERCONATEST.COM
226+
%s = PERCONATEST.COM
227+
`, kerberosHost, kerberosHost)
228+
229+
configFile, err := os.Create(t.TempDir() + "krb5.conf")
230+
require.NoError(t, err)
231+
_, err = configFile.WriteString(config)
232+
require.NoError(t, err)
233+
234+
t.Setenv("KRB5_CONFIG", configFile.Name())
235+
ctx := context.Background()
236+
237+
username := "pmm-test%40PERCONATEST.COM"
238+
password := "password1"
239+
uri := fmt.Sprintf("mongodb://%s:%s@%s:27017/?authSource=$external&authMechanism=GSSAPI", username, password, mongoHost)
240+
exporterOpts := &Opts{
241+
URI: uri,
242+
Logger: logger,
243+
CollectAll: true,
244+
GlobalConnPool: false,
245+
DirectConnect: true,
246+
}
247+
248+
client, err := connect(ctx, exporterOpts)
249+
assert.NoError(t, err)
250+
251+
e := New(exporterOpts)
252+
nodeType, _ := getNodeType(ctx, client)
253+
gc := newGeneralCollector(ctx, client, nodeType, e.opts.Logger)
254+
r := e.makeRegistry(ctx, client, new(labelsGetterMock), *e.opts)
255+
256+
expected := strings.NewReader(fmt.Sprintf(`
257+
# HELP mongodb_up Whether MongoDB is up.
258+
# TYPE mongodb_up gauge
259+
mongodb_up {cluster_role="mongod"} 1`) + "\n")
260+
261+
filter := []string{
262+
"mongodb_up",
263+
}
264+
err = testutil.CollectAndCompare(gc, expected, filter...)
265+
assert.NoError(t, err, "mongodb_up metric should be 1")
266+
267+
res := r.Unregister(gc)
268+
assert.Equal(t, true, res)
269+
}
270+
200271
func TestMongoUpMetric(t *testing.T) {
201272
ctx := context.Background()
202273

internal/tu/testutils.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,19 @@ func PortForContainer(name string) (string, error) {
199199
return ports[0].HostPort, nil
200200
}
201201

202+
func IpForContainer(name string) (string, error) {
203+
di, err := InspectContainer(name)
204+
if err != nil {
205+
return "", errors.Wrapf(err, "cannot get error for container %q", name)
206+
}
207+
208+
if len(di) == 0 {
209+
return "", errors.Wrapf(err, "cannot get error for container %q (empty array)", name)
210+
}
211+
212+
return di[0].NetworkSettings.Networks.MongodbExporterDefault.IPAddress, nil
213+
}
214+
202215
// SetupFakeResolver sets up Fake DNS server to resolve SRV records.
203216
func SetupFakeResolver() *mockdns.Server {
204217
p1, err1 := strconv.ParseInt(GetenvDefault("TEST_MONGODB_S1_PRIMARY_PORT", "17001"), 10, 64)

0 commit comments

Comments
 (0)