Skip to content

Commit 2563b7a

Browse files
Refactor cluster sync tests code (#343)
* remove useless log which obscures the output * More refactoring for process cluster sync tests * More refactoring for docker cluster sync tests
1 parent 7bde528 commit 2563b7a

8 files changed

+144
-195
lines changed

docs/http_api.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,7 @@ Status codes:
183183

184184
### GET `/id`
185185

186-
Internap API used to get the ID number of the starter. Not for external use.
186+
Internal API used to get the ID number of the starter. Not for external use.
187187

188188
### GET `/hello`
189189

service/arangosync_config_builder.go

Lines changed: 5 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,6 @@ import (
4141
"os"
4242
"path"
4343
"path/filepath"
44-
"strings"
4544

4645
"github.com/pkg/errors"
4746
"github.com/rs/zerolog"
@@ -168,15 +167,11 @@ func createArangoSyncArgs(log zerolog.Logger, config Config, clusterConfig Clust
168167
optionPair{"--mq.type", config.SyncMQType},
169168
)
170169
if clusterJWTSecretFile != "" {
171-
if !features.GetJWTFolderOption() {
172-
opts = append(opts,
173-
optionPair{"--cluster.jwt-secret", clusterJWTSecretFile},
174-
)
175-
} else {
176-
opts = append(opts,
177-
optionPair{"--cluster.jwt-secret", path.Join(clusterJWTSecretFile, definitions.ArangodJWTSecretActive)},
178-
)
170+
jwtSecretPath := clusterJWTSecretFile
171+
if features.GetJWTFolderOption() {
172+
jwtSecretPath = path.Join(clusterJWTSecretFile, definitions.ArangodJWTSecretActive)
179173
}
174+
opts = append(opts, optionPair{"--cluster.jwt-secret", jwtSecretPath})
180175
}
181176
if clusterEPs, err := clusterConfig.GetCoordinatorEndpoints(); err == nil {
182177
if len(clusterEPs) == 0 {
@@ -197,8 +192,7 @@ func createArangoSyncArgs(log zerolog.Logger, config Config, clusterConfig Clust
197192
return nil, maskAny(fmt.Errorf("No sync masters found"))
198193
}
199194
for _, ep := range syncMasterEPs {
200-
opts = append(opts,
201-
optionPair{"--master.endpoint", ep})
195+
opts = append(opts, optionPair{"--master.endpoint", ep})
202196
}
203197
} else {
204198
log.Error().Err(err).Msg("Cannot find sync master endpoints")
@@ -228,14 +222,3 @@ func createArangoSyncArgs(log zerolog.Logger, config Config, clusterConfig Clust
228222

229223
return args, nil
230224
}
231-
232-
func isOptionSuitableForArangoSyncServer(serverType definitions.ServerType, optionName string) bool {
233-
switch serverType {
234-
case definitions.ServerTypeSyncMaster:
235-
case definitions.ServerTypeSyncWorker:
236-
if strings.HasPrefix(optionName, "mq.") || strings.HasPrefix(optionName, "cluster.") {
237-
return false
238-
}
239-
}
240-
return true
241-
}

test/docker_cluster_sync_test.go

Lines changed: 16 additions & 101 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,11 @@
2323
package test
2424

2525
import (
26-
"fmt"
2726
"os"
2827
"path/filepath"
29-
"strings"
3028
"testing"
31-
"time"
29+
30+
"github.com/stretchr/testify/require"
3231
)
3332

3433
// TestDockerClusterSync runs 3 arangodb starters in docker with arangosync enabled.
@@ -37,120 +36,36 @@ func TestDockerClusterSync(t *testing.T) {
3736
needStarterMode(t, starterModeCluster)
3837
needEnterprise(t)
3938
ip := os.Getenv("IP")
40-
if ip == "" {
41-
t.Fatal("IP envvar must be set to IP address of this machine")
42-
}
43-
44-
// Create certificates
45-
certs := createSyncCertificates(t, ip, true)
46-
47-
volID1 := createDockerID("vol-starter-test-cluster-sync1-")
48-
createDockerVolume(t, volID1)
49-
defer removeDockerVolume(t, volID1)
50-
51-
volID2 := createDockerID("vol-starter-test-cluster-sync2-")
52-
createDockerVolume(t, volID2)
53-
defer removeDockerVolume(t, volID2)
54-
55-
volID3 := createDockerID("vol-starter-test-cluster-sync3-")
56-
createDockerVolume(t, volID3)
57-
defer removeDockerVolume(t, volID3)
39+
require.NotEmpty(t, ip, "IP envvar must be set to IP address of this machine")
5840

5941
// Cleanup of left over tests
6042
removeDockerContainersByLabel(t, "starter-test=true")
6143
removeStarterCreatedDockerContainers(t)
6244

63-
start := time.Now()
45+
// Create certificates
46+
certs := createSyncCertificates(t, ip, true)
6447

65-
cID1 := createDockerID("starter-test-cluster-sync1-")
66-
dockerRun1 := Spawn(t, strings.Join([]string{
67-
"docker run -i",
68-
"--label starter-test=true",
69-
"--name=" + cID1,
70-
"--rm",
71-
createLicenseKeyOption(),
72-
fmt.Sprintf("-p %d:%d", basePort, basePort),
73-
fmt.Sprintf("-v %s:/data", volID1),
74-
fmt.Sprintf("-v %s:/certs", certs.Dir),
75-
"-v /var/run/docker.sock:/var/run/docker.sock",
76-
"arangodb/arangodb-starter",
77-
"--docker.container=" + cID1,
78-
"--starter.address=$IP",
79-
"--server.storage-engine=rocksdb",
80-
"--starter.sync",
81-
"--sync.server.keyfile=/certs/" + filepath.Base(certs.TLS.DCA.Keyfile),
82-
"--sync.server.client-cafile=/certs/" + filepath.Base(certs.ClientAuth.CACertificate),
83-
"--sync.master.jwt-secret=/certs/" + filepath.Base(certs.MasterSecret),
84-
"--auth.jwt-secret=/certs/" + filepath.Base(certs.ClusterSecret),
85-
"--sync.monitoring.token=" + syncMonitoringToken,
86-
createEnvironmentStarterOptions(),
87-
}, " "))
88-
defer dockerRun1.Close()
89-
defer removeDockerContainer(t, cID1)
48+
volumeIDs, cleanVolumes := createDockerVolumes(t,
49+
"vol-starter-test-cluster-sync1-",
50+
"vol-starter-test-cluster-sync2-",
51+
"vol-starter-test-cluster-sync3-",
52+
)
53+
defer cleanVolumes()
9054

91-
cID2 := createDockerID("starter-test-cluster-sync2-")
92-
dockerRun2 := Spawn(t, strings.Join([]string{
93-
"docker run -i",
94-
"--label starter-test=true",
95-
"--name=" + cID2,
96-
"--rm",
97-
createLicenseKeyOption(),
98-
fmt.Sprintf("-p %d:%d", basePort+(1*portIncrement), basePort),
99-
fmt.Sprintf("-v %s:/data", volID2),
100-
fmt.Sprintf("-v %s:/certs", certs.Dir),
101-
"-v /var/run/docker.sock:/var/run/docker.sock",
102-
"arangodb/arangodb-starter",
103-
"--docker.container=" + cID2,
55+
starterArgs := []string{
10456
"--starter.address=$IP",
10557
"--server.storage-engine=rocksdb",
106-
"--starter.sync",
107-
"--sync.server.keyfile=/certs/" + filepath.Base(certs.TLS.DCA.Keyfile),
108-
"--sync.server.client-cafile=/certs/" + filepath.Base(certs.ClientAuth.CACertificate),
109-
"--sync.master.jwt-secret=/certs/" + filepath.Base(certs.MasterSecret),
11058
"--auth.jwt-secret=/certs/" + filepath.Base(certs.ClusterSecret),
111-
"--sync.monitoring.token=" + syncMonitoringToken,
112-
createEnvironmentStarterOptions(),
113-
fmt.Sprintf("--starter.join=$IP:%d", basePort),
114-
}, " "))
115-
defer dockerRun2.Close()
116-
defer removeDockerContainer(t, cID2)
117-
118-
cID3 := createDockerID("starter-test-cluster-sync3-")
119-
dockerRun3 := Spawn(t, strings.Join([]string{
120-
"docker run -i",
121-
"--label starter-test=true",
122-
"--name=" + cID3,
123-
"--rm",
124-
createLicenseKeyOption(),
125-
fmt.Sprintf("-p %d:%d", basePort+(2*portIncrement), basePort),
126-
fmt.Sprintf("-v %s:/data", volID3),
127-
fmt.Sprintf("-v %s:/certs", certs.Dir),
128-
"-v /var/run/docker.sock:/var/run/docker.sock",
129-
"arangodb/arangodb-starter",
130-
"--docker.container=" + cID3,
131-
"--starter.address=$IP",
132-
"--server.storage-engine=rocksdb",
13359
"--starter.sync",
13460
"--sync.server.keyfile=/certs/" + filepath.Base(certs.TLS.DCA.Keyfile),
13561
"--sync.server.client-cafile=/certs/" + filepath.Base(certs.ClientAuth.CACertificate),
13662
"--sync.master.jwt-secret=/certs/" + filepath.Base(certs.MasterSecret),
137-
"--auth.jwt-secret=/certs/" + filepath.Base(certs.ClusterSecret),
13863
"--sync.monitoring.token=" + syncMonitoringToken,
13964
createEnvironmentStarterOptions(),
140-
fmt.Sprintf("--starter.join=$IP:%d", basePort),
141-
}, " "))
142-
defer dockerRun3.Close()
143-
defer removeDockerContainer(t, cID3)
144-
145-
if ok := WaitUntilStarterReady(t, whatCluster, 3, dockerRun1, dockerRun2, dockerRun3); ok {
146-
t.Logf("Cluster start took %s", time.Since(start))
147-
testClusterWithSync(t, insecureStarterEndpoint(0*portIncrement), false)
148-
testClusterWithSync(t, insecureStarterEndpoint(1*portIncrement), false)
149-
testClusterWithSync(t, insecureStarterEndpoint(2*portIncrement), false)
15065
}
15166

152-
waitForCallFunction(t,
153-
ShutdownStarterCall(insecureStarterEndpoint(0*portIncrement)),
154-
ShutdownStarterCall(insecureStarterEndpoint(1*portIncrement)),
155-
ShutdownStarterCall(insecureStarterEndpoint(2*portIncrement)))
67+
procs, cleanup := startClusterInDocker(t, certs.Dir, starterArgs, volumeIDs)
68+
defer cleanup()
69+
70+
waitForClusterReadinessAndFinish(t, true, false, procs...)
15671
}

test/docker_util.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,26 @@ import (
3030
"strings"
3131
"testing"
3232
"time"
33+
34+
"github.com/stretchr/testify/require"
3335
)
3436

37+
// createDockerVolumes creates docker volume for each provided prefix and returns the list of volume ids and cleanup function
38+
func createDockerVolumes(t *testing.T, prefixes ...string) ([]string, func()) {
39+
ids := make([]string, 0, len(prefixes))
40+
for _, prefix := range prefixes {
41+
id := createDockerID(prefix)
42+
ids = append(ids, id)
43+
createDockerVolume(t, id)
44+
}
45+
require.Len(t, ids, len(prefixes))
46+
return ids, func() {
47+
for _, id := range ids {
48+
removeDockerVolume(t, id)
49+
}
50+
}
51+
}
52+
3553
func createDockerVolume(t *testing.T, id string) {
3654
c := Spawn(t, fmt.Sprintf("docker volume create %s", id))
3755
defer c.Close()

test/process_cluster_sync_test.go

Lines changed: 10 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,7 @@ package test
2424

2525
import (
2626
"os"
27-
"strings"
2827
"testing"
29-
"time"
3028
)
3129

3230
// TestProcessClusterSync starts a master starter, followed by 2 slave starters,
@@ -41,68 +39,26 @@ func TestProcessClusterSync(t *testing.T) {
4139
ip := "127.0.0.1"
4240
certs := createSyncCertificates(t, ip, false)
4341

44-
dataDirMaster := SetUniqueDataDir(t)
45-
defer os.RemoveAll(dataDirMaster)
42+
peerDirs := []string{SetUniqueDataDir(t), SetUniqueDataDir(t), SetUniqueDataDir(t)}
43+
defer func() {
44+
for _, d := range peerDirs {
45+
os.RemoveAll(d)
46+
}
47+
}()
4648

47-
start := time.Now()
48-
49-
master := Spawn(t, strings.Join([]string{
49+
starterArgs := []string{
5050
"${STARTER}",
5151
"--starter.address=" + ip,
52-
"--server.storage-engine=rocksdb",
53-
"--starter.sync",
54-
"--sync.server.keyfile=" + certs.TLS.DCA.Keyfile,
55-
"--sync.server.client-cafile=" + certs.ClientAuth.CACertificate,
56-
"--sync.master.jwt-secret=" + certs.MasterSecret,
5752
"--auth.jwt-secret=" + certs.ClusterSecret,
58-
"--sync.monitoring.token=" + syncMonitoringToken,
59-
createEnvironmentStarterOptions(),
60-
}, " "))
61-
defer master.Close()
62-
63-
dataDirSlave1 := SetUniqueDataDir(t)
64-
defer os.RemoveAll(dataDirSlave1)
65-
slave1 := Spawn(t, strings.Join([]string{
66-
"${STARTER}",
67-
"--starter.join=" + ip,
68-
"--starter.address=" + ip,
69-
"--server.storage-engine=rocksdb",
7053
"--starter.sync",
7154
"--sync.server.keyfile=" + certs.TLS.DCA.Keyfile,
7255
"--sync.server.client-cafile=" + certs.ClientAuth.CACertificate,
7356
"--sync.master.jwt-secret=" + certs.MasterSecret,
74-
"--auth.jwt-secret=" + certs.ClusterSecret,
7557
"--sync.monitoring.token=" + syncMonitoringToken,
7658
createEnvironmentStarterOptions(),
77-
}, " "))
78-
defer slave1.Close()
79-
80-
dataDirSlave2 := SetUniqueDataDir(t)
81-
defer os.RemoveAll(dataDirSlave2)
82-
slave2 := Spawn(t, strings.Join([]string{
83-
"${STARTER}",
84-
"--starter.join=" + ip,
85-
"--starter.address=" + ip,
86-
"--server.storage-engine=rocksdb",
87-
"--starter.sync",
88-
"--sync.server.keyfile=" + certs.TLS.DCA.Keyfile,
89-
"--sync.server.client-cafile=" + certs.ClientAuth.CACertificate,
90-
"--sync.master.jwt-secret=" + certs.MasterSecret,
91-
"--auth.jwt-secret=" + certs.ClusterSecret,
92-
"--sync.monitoring.token=" + syncMonitoringToken,
93-
createEnvironmentStarterOptions(),
94-
}, " "))
95-
defer slave2.Close()
96-
97-
if ok := WaitUntilStarterReady(t, whatCluster, 3, master, slave1, slave2); ok {
98-
t.Logf("Cluster start took %s", time.Since(start))
99-
testClusterWithSync(t, insecureStarterEndpoint(0*portIncrement), false)
100-
testClusterWithSync(t, insecureStarterEndpoint(1*portIncrement), false)
101-
testClusterWithSync(t, insecureStarterEndpoint(2*portIncrement), false)
10259
}
60+
procs, cleanup := startCluster(t, ip, starterArgs, peerDirs)
61+
defer cleanup()
10362

104-
if isVerbose {
105-
t.Log("Waiting for termination")
106-
}
107-
SendIntrAndWait(t, master, slave1, slave2)
63+
waitForClusterReadinessAndFinish(t, true, false, procs...)
10864
}

0 commit comments

Comments
 (0)