Commit 33962301 authored by Quanah Gibson-Mount's avatar Quanah Gibson-Mount
Browse files

Remove test058 from RE.

Syncrepl does not currently support this configuration and the test only leads to false failures
parent 07d02d0d
#! /bin/sh
# $OpenLDAP$
## This work is part of OpenLDAP Software <http://www.openldap.org/>.
##
## Copyright 1998-2018 The OpenLDAP Foundation.
## All rights reserved.
##
## Redistribution and use in source and binary forms, with or without
## modification, are permitted only as authorized by the OpenLDAP
## Public License.
##
## A copy of this license is available in the file LICENSE in the
## top-level directory of the distribution or, alternatively, at
## <http://www.OpenLDAP.org/license.html>.
# This script tests a configuration scenario as described in these URLs:
#
# http://www.openldap.org/lists/openldap-devel/200806/msg00041.html
# http://www.openldap.org/lists/openldap-devel/200806/msg00054.html
#
# Search for "TEST:" to find each major test this script performs.
# The configuration here consist of 3 "sites", each with a "master" and
# a "search" server. One of the sites is the "central", the other two
# are called "site1" and "site2".
# The following notations are used in variable names below to identify
# these servers, the first number defines the $URL# and $PORT# variable
# that server uses:
#
# 1: SMC_* Site Master Central
# 2: SM1_* Site Master 1
# 3: SM2_* Site Master 2
# 4: SSC_* Search Site Central
# 5: SS1_* Search Site 1
# 6: SS2_* Search Site 2
# The master servers all have a set of subordinate databases glued below
# the same suffix database. Each of the masters are the master for at
# least one of these subordinate databases, but there are never more
# than one master for any single database. I.e, this is neither a
# traditional single-master configuration, nor what most people think
# of as multi-master, but more what can be called multiple masters.
# The central master replicates to the two other masters, and receives
# updates from them of the backends they are the master for. There is
# no direct connection between the other two master servers. All of the
# masters have the syncprov overlay configured on the glue database.
# The search servers replicates from the master server at their site.
# They all have a single database with the glue suffix, but their
# database configuration doesn't matter much in this test. (This
# database layout was originally created before gluing was introduced
# in OpenLDAP, which is why the search servers doesn't use it).
# The primary objective for gluing the backend databases is not to make
# them look like one huge database but to create a common search suffix
# for the clients. Searching is mostly done on the search servers, only
# updates are done on the masters.
# It varies which backends that are replicated to which server (hence
# the name asymmetric in this test). Access control rules on the
# masters are used to control what their consumers receives. The table
# below gives an overview of which backend (the columns) that are
# replicated to which server (the rows). A "M" defines the master for
# the backend, a "S" is a slave, and "-" means it is not replicated
# there. Oh, the table probably looks wrong without the 4-position
# tab-stops OpenLDAP uses...
# glue ou1 ou2 sm1ou1 sm1ou2 sm2ou1 sm2ou2
# smc M M M S S S -
# sm1 S S - M M - -
# sm2 S S S S - M M
# ssc S S - - S - -
# ss1 S S - S S - -
# ss2 S S S - - S S
# On the central master syncrepl is configured on the subordinate
# databases, as it varies which backends that exists on its providers.
# Had it been used on the glue database then syncrepl would have removed
# the backends replicated from site1 but not present on site2 when it
# synchronizes with site2 (and vice versa).
#
# All the other servers uses syncrepl on the glue database, since
# replicating more than one subordinate database from the same master
# creates (as of the writing of this test script) race conditions that
# causes the replication to fail, as the race tests at the end shows.
# The databases controlled by syncrepl all have $UPDATEDN as their
# RootDN, while the master servers has other RootDN values for the
# backends they are the backend for them self. This violates the current
# guidelines for gluing databases, which states that the same rootdn
# should be used on all of them. Unfortunately, this cannot be done on
# site masters 1 and 2. The backends they manage locally are either not
# present on the central master, or when so they are not replicated back
# to their source, which causes syncrepl to try to remove the content of
# these backends when it synchronizes with the central master. The
# differing rootdn values used on the backends controlled by syncrepl
# and those managed locally prevents it from succeeding in this. As
# noted above, moving syncrepl to the subordinate databases is currently
# not an option since that creates race conditions.
# The binddn values used in the syncrepl configurations are chosen to
# make the configuration and access control rules easiest to set up. It
# occasionally uses a DN that is also used as a RootDN. This is not a
# good practice and should not be taken as an example for real
# configurations!
# This script will print the content of any invalid contextCSN values it
# detects if the environment variable CSN_VERBOSE is non-empty. The
# environment variable RACE_TESTS can be set to the number of race test
# iterations the script should perform.
if test "$BACKEND" = ldif ; then
echo "$BACKEND backend does not support access controls, test skipped"
exit 0
fi
#echo "Test 058 is currently disabled"
#exit 0
echo "running defines.sh"
. $SRCDIR/scripts/defines.sh
if test $SYNCPROV = syncprovno; then
echo "Syncrepl provider overlay not available, test skipped"
exit 0
fi
SMC_DIR=$TESTDIR/smc
SM1_DIR=$TESTDIR/sm1
SM2_DIR=$TESTDIR/sm2
SS1_DIR=$TESTDIR/ss1
SS2_DIR=$TESTDIR/ss2
SSC_DIR=$TESTDIR/ssc
MNUM=1
mkdir -p $TESTDIR
for dir in $SMC_DIR $SM1_DIR $SM2_DIR $SS1_DIR $SS2_DIR $SSC_DIR; do
mkdir -p $dir $dir/slapd.d $dir/db
done
mkdir -p $SMC_DIR/ou1 $SMC_DIR/sm1ou1 $SMC_DIR/sm1ou2
mkdir -p $SMC_DIR/ou2 $SMC_DIR/sm2ou1
mkdir -p $SM1_DIR/ou1 $SM1_DIR/sm1ou1 $SM1_DIR/sm1ou2
mkdir -p $SM2_DIR/ou2 $SM2_DIR/sm1ou1 $SM2_DIR/sm2ou1 $SM2_DIR/sm2ou2
cd $TESTDIR
KILLPIDS=
$SLAPPASSWD -g -n >$CONFIGPWF
ID=1
if test $WAIT != 0 ; then
RETRY="1 60"
else
RETRY="1 10"
fi
echo "Initializing master configurations..."
for dir in $SMC_DIR $SM1_DIR $SM2_DIR; do
$SLAPADD -F $dir/slapd.d -n 0 <<EOF
dn: cn=config
objectClass: olcGlobal
cn: config
olcServerID: $ID
dn: olcDatabase={0}config,cn=config
objectClass: olcDatabaseConfig
olcDatabase: {0}config
olcRootPW:< file://$CONFIGPWF
EOF
ID=`expr $ID + 1`
done
echo "Initializing search configurations..."
for dir in $SS1_DIR $SS2_DIR $SSC_DIR; do
$SLAPADD -F $dir/slapd.d -n 0 <<EOF
dn: cn=config
objectClass: olcGlobal
cn: config
dn: olcDatabase={0}config,cn=config
objectClass: olcDatabaseConfig
olcDatabase: {0}config
olcRootPW:< file://$CONFIGPWF
EOF
done
echo "Starting central master slapd on TCP/IP port $PORT1..."
cd $SMC_DIR
$SLAPD -F slapd.d -h $URI1 -d $LVL $TIMING > $LOG1 2>&1 &
SMC_PID=$!
if test $WAIT != 0 ; then
echo PID $SMC_PID
read foo
fi
KILLPIDS="$KILLPIDS $SMC_PID"
cd $TESTWD
sleep 1
echo "Using ldapsearch to check that central master slapd is running..."
for i in 1 2 3 4 5; do
$LDAPSEARCH -s base -b "" -H $URI1 \
'objectclass=*' > /dev/null 2>&1
RC=$?
test $RC = 0 && break
echo "Waiting $i seconds for slapd to start..."
sleep $i
done
if test $RC != 0 ; then
echo "ldapsearch failed ($RC)!"
test $KILLSERVERS != no && kill -HUP $KILLPIDS
exit $RC
fi
echo "Starting site1 master slapd on TCP/IP port $PORT2..."
cd $SM1_DIR
$SLAPD -F slapd.d -h $URI2 -d $LVL $TIMING > $LOG2 2>&1 &
SM1_PID=$!
if test $WAIT != 0 ; then
echo PID $SM1_PID
read foo
fi
KILLPIDS="$KILLPIDS $SM1_PID"
cd $TESTWD
sleep 1
echo "Using ldapsearch to check that site1 master is running..."
for i in 1 2 3 4 5; do
$LDAPSEARCH -s base -b "" -H $URI2 \
'objectclass=*' > /dev/null 2>&1
RC=$?
test $RC = 0 && break
echo "Waiting $i seconds for slapd to start..."
sleep $i
done
if test $RC != 0 ; then
echo "ldapsearch failed ($RC)!"
test $KILLSERVERS != no && kill -HUP $KILLPIDS
exit $RC
fi
echo "Starting site2 master slapd on TCP/IP port $PORT3..."
cd $SM2_DIR
$SLAPD -F slapd.d -h $URI3 -d $LVL $TIMING > $LOG3 2>&1 &
SM2_PID=$!
if test $WAIT != 0 ; then
echo PID $SM2_PID
read foo
fi
KILLPIDS="$KILLPIDS $SM2_PID"
cd $TESTWD
sleep 1
echo "Using ldapsearch to check that site2 master is running..."
for i in 1 2 3 4 5; do
$LDAPSEARCH -s base -b "" -H $URI3 \
'objectclass=*' > /dev/null 2>&1
RC=$?
test $RC = 0 && break
echo "Waiting $i seconds for slapd to start..."
sleep $i
done
if test $RC != 0 ; then
echo "ldapsearch failed ($RC)!"
test $KILLSERVERS != no && kill -HUP $KILLPIDS
exit $RC
fi
echo "Starting central search slapd on TCP/IP port $PORT4..."
cd $SSC_DIR
$SLAPD -F slapd.d -h $URI4 -d $LVL $TIMING > $LOG4 2>&1 &
SSC_PID=$!
if test $WAIT != 0 ; then
echo PID $SSC_PID
read foo
fi
KILLPIDS="$KILLPIDS $SSC_PID"
cd $TESTWD
sleep 1
echo "Using ldapsearch to check that central search slapd is running..."
for i in 1 2 3 4 5; do
$LDAPSEARCH -s base -b "" -H $URI4 \
'objectclass=*' > /dev/null 2>&1
RC=$?
test $RC = 0 && break
echo "Waiting $i seconds for slapd to start..."
sleep $i
done
if test $RC != 0 ; then
echo "ldapsearch failed ($RC)!"
test $KILLSERVERS != no && kill -HUP $KILLPIDS
exit $RC
fi
echo "Starting site1 search slapd on TCP/IP port $PORT5..."
cd $SS1_DIR
$SLAPD -F slapd.d -h $URI5 -d $LVL $TIMING > $LOG5 2>&1 &
SS1_PID=$!
if test $WAIT != 0 ; then
echo PID $SS1_PID
read foo
fi
KILLPIDS="$KILLPIDS $SS1_PID"
cd $TESTWD
sleep 1
echo "Using ldapsearch to check that site1 search slapd is running..."
for i in 1 2 3 4 5; do
$LDAPSEARCH -s base -b "" -H $URI5 \
'objectclass=*' > /dev/null 2>&1
RC=$?
test $RC = 0 && break
echo "Waiting $i seconds for slapd to start..."
sleep $i
done
if test $RC != 0 ; then
echo "ldapsearch failed ($RC)!"
test $KILLSERVERS != no && kill -HUP $KILLPIDS
exit $RC
fi
echo "Starting site2 search slapd on TCP/IP port $PORT6..."
cd $SS2_DIR
$SLAPD -F slapd.d -h $URI6 -d $LVL $TIMING > $LOG6 2>&1 &
SS2_PID=$!
if test $WAIT != 0 ; then
echo PID $SS2_PID
read foo
fi
KILLPIDS="$KILLPIDS $SS2_PID"
cd $TESTWD
sleep 1
echo "Using ldapsearch to check that site2 search slapd is running..."
for i in 1 2 3 4 5; do
$LDAPSEARCH -s base -b "" -H $URI6 \
'objectclass=*' > /dev/null 2>&1
RC=$?
test $RC = 0 && break
echo "Waiting $i seconds for slapd to start..."
sleep $i
done
if test $RC != 0 ; then
echo "ldapsearch failed ($RC)!"
test $KILLSERVERS != no && kill -HUP $KILLPIDS
exit $RC
fi
for uri in $URI1 $URI2 $URI3 $URI4 $URI5 $URI6; do
echo "Adding schema on $uri..."
$LDAPADD -D cn=config -H $uri -y $CONFIGPWF <<EOF > $TESTOUT 2>&1
include: file://$ABS_SCHEMADIR/core.ldif
include: file://$ABS_SCHEMADIR/cosine.ldif
include: file://$ABS_SCHEMADIR/inetorgperson.ldif
include: file://$ABS_SCHEMADIR/openldap.ldif
include: file://$ABS_SCHEMADIR/nis.ldif
EOF
RC=$?
if test $RC != 0 ; then
echo "ldapadd failed for schema config ($RC)!"
test $KILLSERVERS != no && kill -HUP $KILLPIDS
exit $RC
fi
[ "$BACKENDTYPE" = mod ] || continue
echo "Adding backend module on $uri..."
$LDAPADD -D cn=config -H $uri -y $CONFIGPWF <<EOF >>$TESTOUT 2>&1
dn: cn=module,cn=config
objectClass: olcModuleList
cn: module
olcModulePath: $TESTWD/../servers/slapd/back-$BACKEND
olcModuleLoad: back_$BACKEND.la
EOF
RC=$?
if test $RC != 0 ; then
echo "ldapadd failed for backend module ($RC)!"
test $KILLSERVERS != no && kill -HUP $KILLPIDS
exit $RC
fi
done
echo "Adding database config on central master..."
if [ "$SYNCPROV" = syncprovmod ]; then
$LDAPADD -D cn=config -H $URI1 -y $CONFIGPWF <<EOF >> $TESTOUT 2>&1
dn: cn=module,cn=config
objectClass: olcModuleList
cn: module
olcModulePath: $TESTWD/../servers/slapd/overlays
olcModuleLoad: syncprov.la
EOF
RC=$?
if test $RC != 0 ; then
echo "ldapadd failed for moduleLoad ($RC)!"
test $KILLSERVERS != no && kill -HUP $KILLPIDS
exit $RC
fi
fi
nullExclude="" nullOK="" wantNoObj=32
test $BACKEND = null && nullExclude="# " nullOK="OK" wantNoObj=0
$LDAPADD -D cn=config -H $URI1 -y $CONFIGPWF <<EOF >> $TESTOUT 2>&1
dn: olcDatabase={1}$BACKEND,cn=config
objectClass: olcDatabaseConfig
${nullExclude}objectClass: olc${BACKEND}Config
olcDatabase: {1}$BACKEND
${nullExclude}olcDbDirectory: $SMC_DIR/db
olcSuffix: $BASEDN
olcRootDN: $MANAGERDN
olcRootPW: $PASSWD
dn: olcOverlay={0}glue,olcDatabase={1}$BACKEND,cn=config
objectClass: olcOverlayConfig
olcOverlay: {0}glue
dn: olcOverlay={1}syncprov,olcDatabase={1}$BACKEND,cn=config
objectClass: olcOverlayConfig
objectClass: olcSyncProvConfig
olcOverlay: {1}syncprov
olcSpCheckpoint: 3 1
dn: olcDatabase={1}$BACKEND,cn=config
objectClass: olcDatabaseConfig
${nullExclude}objectClass: olc${BACKEND}Config
olcDatabase: {1}$BACKEND
${nullExclude}olcDbDirectory: $SMC_DIR/ou1
olcSubordinate: TRUE
olcSuffix: ou=ou1,$BASEDN
olcRootDN: $MANAGERDN
dn: olcDatabase={2}$BACKEND,cn=config
objectClass: olcDatabaseConfig
${nullExclude}objectClass: olc${BACKEND}Config
olcDatabase: {2}$BACKEND
${nullExclude}olcDbDirectory: $SMC_DIR/ou2
olcSubordinate: TRUE
olcSuffix: ou=ou2,$BASEDN
olcRootDN: $MANAGERDN
dn: olcDatabase={3}$BACKEND,cn=config
objectClass: olcDatabaseConfig
${nullExclude}objectClass: olc${BACKEND}Config
olcDatabase: {3}$BACKEND
${nullExclude}olcDbDirectory: $SMC_DIR/sm1ou1
olcSubordinate: TRUE
olcSuffix: ou=sm1ou1,$BASEDN
olcRootDN: $UPDATEDN
dn: olcDatabase={4}$BACKEND,cn=config
objectClass: olcDatabaseConfig
${nullExclude}objectClass: olc${BACKEND}Config
olcDatabase: {4}$BACKEND
${nullExclude}olcDbDirectory: $SMC_DIR/sm1ou2
olcSubordinate: TRUE
olcSuffix: ou=sm1ou2,$BASEDN
olcRootDN: $UPDATEDN
dn: olcDatabase={5}$BACKEND,cn=config
objectClass: olcDatabaseConfig
${nullExclude}objectClass: olc${BACKEND}Config
olcDatabase: {5}$BACKEND
${nullExclude}olcDbDirectory: $SMC_DIR/sm2ou1
olcSubordinate: TRUE
olcSuffix: ou=sm2ou1,$BASEDN
olcRootDN: $UPDATEDN
EOF
RC=$?
if test $RC != 0 ; then
echo "ldapadd failed for central master database config ($RC)!"
test $KILLSERVERS != no && kill -HUP $KILLPIDS
exit $RC
fi
echo "Adding database config on site1 master..."
if [ "$SYNCPROV" = syncprovmod ]; then
$LDAPADD -D cn=config -H $URI2 -y $CONFIGPWF <<EOF >> $TESTOUT 2>&1
dn: cn=module,cn=config
objectClass: olcModuleList
cn: module
olcModulePath: $TESTWD/../servers/slapd/overlays
olcModuleLoad: syncprov.la
EOF
RC=$?
if test $RC != 0 ; then
echo "ldapadd failed for moduleLoad ($RC)!"
test $KILLSERVERS != no && kill -HUP $KILLPIDS
exit $RC
fi
fi
$LDAPADD -D cn=config -H $URI2 -y $CONFIGPWF <<EOF >> $TESTOUT 2>&1
dn: olcDatabase={1}$BACKEND,cn=config
objectClass: olcDatabaseConfig
${nullExclude}objectClass: olc${BACKEND}Config
olcDatabase: {1}$BACKEND
${nullExclude}olcDbDirectory: $SM1_DIR/db
olcSuffix: $BASEDN
olcRootDN: $UPDATEDN
dn: olcOverlay={0}glue,olcDatabase={1}$BACKEND,cn=config
objectClass: olcOverlayConfig
olcOverlay: {0}glue
dn: olcOverlay={1}syncprov,olcDatabase={1}$BACKEND,cn=config
objectClass: olcOverlayConfig
objectClass: olcSyncProvConfig
olcOverlay: {1}syncprov
dn: olcDatabase={1}$BACKEND,cn=config
objectClass: olcDatabaseConfig
${nullExclude}objectClass: olc${BACKEND}Config
olcDatabase: {1}$BACKEND
${nullExclude}olcDbDirectory: $SM1_DIR/ou1
olcSubordinate: TRUE
olcSuffix: ou=ou1,$BASEDN
olcRootDN: $UPDATEDN
dn: olcDatabase={2}$BACKEND,cn=config
objectClass: olcDatabaseConfig
${nullExclude}objectClass: olc${BACKEND}Config
olcDatabase: {2}$BACKEND
${nullExclude}olcDbDirectory: $SM1_DIR/sm1ou1
olcSubordinate: TRUE
olcSuffix: ou=sm1ou1,$BASEDN
olcRootDN: ou=sm1ou1,$BASEDN
olcRootPW: $PASSWD
dn: olcDatabase={3}$BACKEND,cn=config
objectClass: olcDatabaseConfig
${nullExclude}objectClass: olc${BACKEND}Config
olcDatabase: {3}$BACKEND
${nullExclude}olcDbDirectory: $SM1_DIR/sm1ou2
olcSubordinate: TRUE
olcSuffix: ou=sm1ou2,$BASEDN
olcRootDN: ou=sm1ou1,$BASEDN
EOF
RC=$?
if test $RC != 0 ; then
echo "ldapadd failed for site1 master database config ($RC)!"
test $KILLSERVERS != no && kill -HUP $KILLPIDS
exit $RC
fi
echo "Adding database config on site2 master..."
if [ "$SYNCPROV" = syncprovmod ]; then
$LDAPADD -D cn=config -H $URI3 -y $CONFIGPWF <<EOF >> $TESTOUT 2>&1
dn: cn=module,cn=config
objectClass: olcModuleList
cn: module
olcModulePath: $TESTWD/../servers/slapd/overlays
olcModuleLoad: syncprov.la
EOF
RC=$?
if test $RC != 0 ; then
echo "ldapadd failed for moduleLoad ($RC)!"
test $KILLSERVERS != no && kill -HUP $KILLPIDS
exit $RC
fi
fi
$LDAPADD -D cn=config -H $URI3 -y $CONFIGPWF <<EOF >> $TESTOUT 2>&1
dn: olcDatabase={1}$BACKEND,cn=config
objectClass: olcDatabaseConfig
${nullExclude}objectClass: olc${BACKEND}Config
olcDatabase: {1}$BACKEND
${nullExclude}olcDbDirectory: $SM2_DIR/db
olcSuffix: $BASEDN
olcRootDN: $UPDATEDN
dn: olcOverlay={0}glue,olcDatabase={1}$BACKEND,cn=config
objectClass: olcOverlayConfig
olcOverlay: {0}glue
dn: olcOverlay={1}syncprov,olcDatabase={1}$BACKEND,cn=config
objectClass: olcOverlayConfig
objectClass: olcSyncProvConfig
olcOverlay: {1}syncprov
olcSpCheckpoint: 1 1
dn: olcDatabase={1}$BACKEND,cn=config
objectClass: olcDatabaseConfig
${nullExclude}objectClass: olc${BACKEND}Config
olcDatabase: {1}$BACKEND
${nullExclude}olcDbDirectory: $SM2_DIR/ou2
olcSubordinate: TRUE
olcSuffix: ou=ou2,$BASEDN
olcRootDN: $UPDATEDN
dn: olcDatabase={2}$BACKEND,cn=config
objectClass: olcDatabaseConfig
${nullExclude}objectClass: olc${BACKEND}Config
olcDatabase: {2}$BACKEND
${nullExclude}olcDbDirectory: $SM2_DIR/sm1ou1
olcSubordinate: TRUE
olcSuffix: ou=sm1ou1,$BASEDN
olcRootDN: $UPDATEDN
dn: olcDatabase={3}$BACKEND,cn=config
objectClass: olcDatabaseConfig
${nullExclude}objectClass: olc${BACKEND}Config
olcDatabase: {3}$BACKEND
${nullExclude}olcDbDirectory: $SM2_DIR/sm2ou1