Skip to content

Commit fd1cdcb

Browse files
authored
Merge pull request #350 from arangodb/feature/advanced-syncer-tests
ArangoSync tests
2 parents 013c3ae + 7eb1167 commit fd1cdcb

File tree

12 files changed

+600
-43
lines changed

12 files changed

+600
-43
lines changed

Makefile

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,22 @@ endif
104104
SOURCES := $(shell find $(SRCDIR) -name '*.go' -not -path './test/*')
105105
DASHBOARDSOURCES := $(shell find $(DASHBOARDDIR)/src -name '*.js' -not -path './test/*') $(DASHBOARDDIR)/package.json
106106

107+
ifndef ARANGOSYNCSRCDIR
108+
ARANGOSYNCSRCDIR := $(SCRIPTDIR)/arangosync
109+
endif
110+
DOCKERARANGOSYNCCTRLFILE=tests/sync/Dockerfile
111+
ifndef ARANGOSYNCTESTCTRLIMAGE
112+
ARANGOSYNCTESTCTRLIMAGE := $(DOCKERNAMESPACE)/kube-arangodb-sync-test-ctrl$(IMAGESUFFIX)
113+
endif
114+
ifndef ARANGOSYNCTESTIMAGE
115+
ARANGOSYNCTESTIMAGE := $(DOCKERNAMESPACE)/kube-arangodb-sync-test$(IMAGESUFFIX)
116+
endif
117+
ifndef ARANGOSYNCIMAGE
118+
ARANGOSYNCIMAGE := $(DOCKERNAMESPACE)/kube-arangodb-sync$(IMAGESUFFIX)
119+
endif
120+
ARANGOSYNCTESTCTRLBINNAME := $(PROJECT)_sync_test_ctrl
121+
ARANGOSYNCTESTCTRLBIN := $(BINDIR)/$(ARANGOSYNCTESTCTRLBINNAME)
122+
107123
.PHONY: all
108124
all: verify-generated build
109125

@@ -298,6 +314,23 @@ docker-test: $(TESTBIN)
298314
run-upgrade-tests:
299315
TESTOPTIONS="-test.run=TestUpgrade" make run-tests
300316

317+
.PHONY: prepare-run-tests
318+
prepare-run-tests:
319+
ifdef PUSHIMAGES
320+
docker push $(OPERATORIMAGE)
321+
endif
322+
ifneq ($(DEPLOYMENTNAMESPACE), default)
323+
$(ROOTDIR)/scripts/kube_delete_namespace.sh $(DEPLOYMENTNAMESPACE)
324+
kubectl create namespace $(DEPLOYMENTNAMESPACE)
325+
endif
326+
kubectl apply -f $(MANIFESTPATHCRD)
327+
kubectl apply -f $(MANIFESTPATHSTORAGE)
328+
kubectl apply -f $(MANIFESTPATHDEPLOYMENT)
329+
kubectl apply -f $(MANIFESTPATHDEPLOYMENTREPLICATION)
330+
kubectl apply -f $(MANIFESTPATHTEST)
331+
$(ROOTDIR)/scripts/kube_create_storage.sh $(DEPLOYMENTNAMESPACE)
332+
$(ROOTDIR)/scripts/kube_create_license_key_secret.sh "$(DEPLOYMENTNAMESPACE)" '$(ENTERPRISELICENSE)'
333+
301334
.PHONY: run-tests
302335
run-tests: docker-test
303336
ifdef PUSHIMAGES
@@ -424,3 +457,54 @@ redeploy-operator: delete-operator manifests
424457
kubectl apply -f $(MANIFESTPATHDEPLOYMENTREPLICATION)
425458
kubectl apply -f $(MANIFESTPATHTEST)
426459
kubectl get pods
460+
461+
## ArangoSync Tests
462+
463+
$(ARANGOSYNCTESTCTRLBIN): $(GOBUILDDIR) $(SOURCES)
464+
@mkdir -p $(BINDIR)
465+
docker run \
466+
--rm \
467+
-v $(SRCDIR):/usr/code \
468+
-v $(CACHEVOL):/usr/gocache \
469+
-e GOCACHE=/usr/gocache \
470+
-e GOPATH=/usr/code/.gobuild \
471+
-e GOOS=linux \
472+
-e GOARCH=amd64 \
473+
-e CGO_ENABLED=0 \
474+
-w /usr/code/ \
475+
golang:$(GOVERSION) \
476+
go build -installsuffix cgo -ldflags "-X main.projectVersion=$(VERSION) -X main.projectBuild=$(COMMIT)" -o /usr/code/bin/$(ARANGOSYNCTESTCTRLBINNAME) $(REPOPATH)/tests/sync
477+
478+
.PHONY: check-sync-vars
479+
check-sync-vars:
480+
ifndef ARANGOSYNCSRCDIR
481+
@echo ARANGOSYNCSRCDIR must point to the arangosync source directory
482+
@exit 1
483+
endif
484+
ifndef ARANGODIMAGE
485+
@echo ARANGODIMAGE must point to the usable arangodb enterprise image
486+
@exit 1
487+
endif
488+
ifndef ENTERPRISELICENSE
489+
@echo For tests using ArangoSync you most likely need the license key. Please set ENTERPRISELICENSE.
490+
@exit 1
491+
endif
492+
@echo Using ArangoSync source at $(ARANGOSYNCSRCDIR)
493+
@echo Using ArangoDB image $(ARANGODIMAGE)
494+
495+
.PHONY: docker-sync
496+
docker-sync: check-sync-vars
497+
SYNCIMAGE=$(ARANGOSYNCIMAGE) TESTIMAGE=$(ARANGOSYNCTESTIMAGE) $(MAKE) -C $(ARANGOSYNCSRCDIR) docker docker-test
498+
499+
.PHONY:
500+
docker-sync-test-ctrl: $(ARANGOSYNCTESTCTRLBIN)
501+
docker build --quiet -f $(DOCKERARANGOSYNCCTRLFILE) -t $(ARANGOSYNCTESTCTRLIMAGE) .
502+
503+
.PHONY:
504+
run-sync-tests: check-vars docker-sync docker-sync-test-ctrl prepare-run-tests
505+
ifdef PUSHIMAGES
506+
docker push $(ARANGOSYNCTESTCTRLIMAGE)
507+
docker push $(ARANGOSYNCTESTIMAGE)
508+
docker push $(ARANGOSYNCIMAGE)
509+
endif
510+
$(ROOTDIR)/scripts/kube_run_sync_tests.sh $(DEPLOYMENTNAMESPACE) '$(ARANGODIMAGE)' '$(ARANGOSYNCIMAGE)' '$(ARANGOSYNCTESTIMAGE)' '$(ARANGOSYNCTESTCTRLIMAGE)' '$(TESTOPTIONS)'

manifests/templates/test/rbac.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ rules:
1010
resources: ["nodes"]
1111
verbs: ["list"]
1212
- apiGroups: [""]
13-
resources: ["pods", "services", "persistentvolumes", "persistentvolumeclaims", "secrets", "serviceaccounts"]
13+
resources: ["pods", "services", "persistentvolumes", "persistentvolumeclaims", "secrets", "serviceaccounts", "pods/log"]
1414
verbs: ["*"]
1515
- apiGroups: ["apps"]
1616
resources: ["daemonsets", "deployments"]

pkg/apis/deployment/v1alpha/deployment_spec.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,14 @@ func (s DeploymentSpec) GetImage() string {
9797
return util.StringOrDefault(s.Image)
9898
}
9999

100+
// GetSyncImage returns, if set, Sync.Image or the default image.
101+
func (s DeploymentSpec) GetSyncImage() string {
102+
if s.Sync.HasSyncImage() {
103+
return s.Sync.GetSyncImage()
104+
}
105+
return s.GetImage()
106+
}
107+
100108
// GetImagePullPolicy returns the value of imagePullPolicy.
101109
func (s DeploymentSpec) GetImagePullPolicy() v1.PullPolicy {
102110
return util.PullPolicyOrDefault(s.ImagePullPolicy)

pkg/apis/deployment/v1alpha/sync_spec.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,13 +36,24 @@ type SyncSpec struct {
3636
Authentication SyncAuthenticationSpec `json:"auth"`
3737
TLS TLSSpec `json:"tls"`
3838
Monitoring MonitoringSpec `json:"monitoring"`
39+
Image *string `json:"image"`
3940
}
4041

4142
// IsEnabled returns the value of enabled.
4243
func (s SyncSpec) IsEnabled() bool {
4344
return util.BoolOrDefault(s.Enabled)
4445
}
4546

47+
// GetSyncImage returns the syncer image or empty string
48+
func (s SyncSpec) GetSyncImage() string {
49+
return util.StringOrDefault(s.Image)
50+
}
51+
52+
// HasSyncImage returns whether a special sync image is set
53+
func (s SyncSpec) HasSyncImage() bool {
54+
return s.GetSyncImage() != ""
55+
}
56+
4657
// Validate the given spec
4758
func (s SyncSpec) Validate(mode DeploymentMode) error {
4859
if s.IsEnabled() && !mode.SupportsSync() {
@@ -78,6 +89,9 @@ func (s *SyncSpec) SetDefaultsFrom(source SyncSpec) {
7889
if s.Enabled == nil {
7990
s.Enabled = util.NewBoolOrNil(source.Enabled)
8091
}
92+
if s.Image == nil {
93+
s.Image = util.NewStringOrNil(source.Image)
94+
}
8195
s.ExternalAccess.SetDefaultsFrom(source.ExternalAccess)
8296
s.Authentication.SetDefaultsFrom(source.Authentication)
8397
s.TLS.SetDefaultsFrom(source.TLS)
@@ -95,5 +109,8 @@ func (s SyncSpec) ResetImmutableFields(fieldPrefix string, target *SyncSpec) []s
95109
if list := s.Authentication.ResetImmutableFields(fieldPrefix+".auth", &target.Authentication); len(list) > 0 {
96110
resetFields = append(resetFields, list...)
97111
}
112+
if s.GetSyncImage() != target.GetSyncImage() {
113+
resetFields = append(resetFields, fieldPrefix+".image")
114+
}
98115
return resetFields
99116
}

pkg/apis/deployment/v1alpha/zz_generated.deepcopy.go

Lines changed: 5 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pkg/deployment/access_package.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,8 @@ func (d *Deployment) ensureAccessPackage(apSecretName string) error {
196196
},
197197
Data: map[string][]byte{
198198
constants.SecretAccessPackageYaml: []byte(allYaml),
199+
constants.SecretCACertificate: []byte(tlsCACert),
200+
constants.SecretTLSKeyfile: []byte(keyfile),
199201
},
200202
}
201203
// Attach secret to owner

pkg/deployment/resources/pod_creator.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -598,6 +598,11 @@ func (r *Resources) createPodForMember(spec api.DeploymentSpec, memberID string,
598598
log.Debug().Str("image", spec.GetImage()).Msg("Image is not an enterprise image")
599599
return maskAny(fmt.Errorf("Image '%s' does not contain an Enterprise version of ArangoDB", spec.GetImage()))
600600
}
601+
// Check if the sync image is overwritten by the SyncSpec
602+
imageID := imageInfo.ImageID
603+
if spec.Sync.HasSyncImage() {
604+
imageID = spec.Sync.GetSyncImage()
605+
}
601606
var tlsKeyfileSecretName, clientAuthCASecretName, masterJWTSecretName, clusterJWTSecretName string
602607
// Check master JWT secret
603608
masterJWTSecretName = spec.Sync.Authentication.GetJWTSecretName()
@@ -664,7 +669,7 @@ func (r *Resources) createPodForMember(spec api.DeploymentSpec, memberID string,
664669
if group == api.ServerGroupSyncWorkers {
665670
affinityWithRole = api.ServerGroupDBServers.AsRole()
666671
}
667-
if err := k8sutil.CreateArangoSyncPod(kubecli, spec.IsDevelopment(), apiObject, role, m.ID, m.PodName, imageInfo.ImageID, lifecycleImage, spec.GetImagePullPolicy(), terminationGracePeriod, args, env,
672+
if err := k8sutil.CreateArangoSyncPod(kubecli, spec.IsDevelopment(), apiObject, role, m.ID, m.PodName, imageID, lifecycleImage, spec.GetImagePullPolicy(), terminationGracePeriod, args, env,
668673
livenessProbe, tolerations, serviceAccountName, tlsKeyfileSecretName, clientAuthCASecretName, masterJWTSecretName, clusterJWTSecretName, affinityWithRole, groupSpec.GetNodeSelector()); err != nil {
669674
return maskAny(err)
670675
}

pkg/util/k8sutil/client.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,15 @@ func NewKubeClient() (kubernetes.Interface, error) {
4444
return c, nil
4545
}
4646

47+
// MustNewKubeClient calls NewKubeClient an panics if it fails
48+
func MustNewKubeClient() kubernetes.Interface {
49+
i, err := NewKubeClient()
50+
if err != nil {
51+
panic(err)
52+
}
53+
return i
54+
}
55+
4756
// NewKubeExtClient creates a new k8s api extensions client
4857
func NewKubeExtClient() (apiextensionsclient.Interface, error) {
4958
cfg, err := InClusterConfig()

scripts/kube_run_sync_tests.sh

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
#!/bin/bash
2+
3+
# Run kubectl run to run the integration tests.
4+
5+
DEPLOYMENTNAMESPACE=$1
6+
ARANGODIMAGE=$2
7+
ARANGOSYNCIMAGE=$3
8+
ARANOSYNCTESTIMAGE=$4
9+
ARANOSYNCTESTCTRLIMAGE=$5
10+
TESTARGS=$6
11+
12+
ARANGOSYNCIMAGEID=$(docker inspect ${ARANGOSYNCIMAGE} '--format={{index .RepoDigests 0}}')
13+
ARANOSYNCTESTIMAGEID=$(docker inspect ${ARANOSYNCTESTIMAGE} '--format={{index .RepoDigests 0}}')
14+
ARANOSYNCTESTCTRLIMAGEID=$(docker inspect ${ARANOSYNCTESTCTRLIMAGE} '--format={{index .RepoDigests 0}}')
15+
16+
kubectl --namespace ${DEPLOYMENTNAMESPACE} \
17+
run kube-arangosync-test-controller -i --rm --quiet --restart=Never \
18+
--image=${ARANOSYNCTESTCTRLIMAGEID} \
19+
-- \
20+
--arango-image=${ARANGODIMAGE} \
21+
--arango-sync-image=${ARANGOSYNCIMAGEID} \
22+
--arango-sync-test-image=${ARANOSYNCTESTIMAGEID} \
23+
--license-key-secret-name=arangodb-jenkins-license-key \
24+
--namespace=${DEPLOYMENTNAMESPACE} \
25+
--test-args="${TESTARGS}"

tests/sync/Dockerfile

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
FROM scratch
2+
3+
ADD bin/arangodb_operator_sync_test_ctrl /usr/bin/
4+
5+
ENTRYPOINT [ "/usr/bin/arangodb_operator_sync_test_ctrl" ]

0 commit comments

Comments
 (0)