Skip to content

Commit 17adfc9

Browse files
committed
Merge branch 'master' into documentation/acceptance-test
2 parents 1c36563 + dbf8686 commit 17adfc9

31 files changed

+436
-219
lines changed

examples/simple-cluster.yaml

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,4 @@ metadata:
44
name: "example-simple-cluster"
55
spec:
66
mode: Cluster
7-
image: arangodb/arangodb:3.3.4
8-
tls:
9-
altNames: ["kube-01", "kube-02", "kube-03"]
10-
coordinators:
11-
args:
12-
- --log.level=true
7+
image: arangodb/arangodb:3.3.10

pkg/apis/deployment/v1alpha/deployment_status_members.go

Lines changed: 48 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -75,23 +75,23 @@ func (ds DeploymentStatusMembers) ElementByID(id string) (MemberStatus, ServerGr
7575
// ForeachServerGroup calls the given callback for all server groups.
7676
// If the callback returns an error, this error is returned and the callback is
7777
// not called for the remaining groups.
78-
func (ds DeploymentStatusMembers) ForeachServerGroup(cb func(group ServerGroup, list *MemberStatusList) error) error {
79-
if err := cb(ServerGroupSingle, &ds.Single); err != nil {
78+
func (ds DeploymentStatusMembers) ForeachServerGroup(cb func(group ServerGroup, list MemberStatusList) error) error {
79+
if err := cb(ServerGroupSingle, ds.Single); err != nil {
8080
return maskAny(err)
8181
}
82-
if err := cb(ServerGroupAgents, &ds.Agents); err != nil {
82+
if err := cb(ServerGroupAgents, ds.Agents); err != nil {
8383
return maskAny(err)
8484
}
85-
if err := cb(ServerGroupDBServers, &ds.DBServers); err != nil {
85+
if err := cb(ServerGroupDBServers, ds.DBServers); err != nil {
8686
return maskAny(err)
8787
}
88-
if err := cb(ServerGroupCoordinators, &ds.Coordinators); err != nil {
88+
if err := cb(ServerGroupCoordinators, ds.Coordinators); err != nil {
8989
return maskAny(err)
9090
}
91-
if err := cb(ServerGroupSyncMasters, &ds.SyncMasters); err != nil {
91+
if err := cb(ServerGroupSyncMasters, ds.SyncMasters); err != nil {
9292
return maskAny(err)
9393
}
94-
if err := cb(ServerGroupSyncWorkers, &ds.SyncWorkers); err != nil {
94+
if err := cb(ServerGroupSyncWorkers, ds.SyncWorkers); err != nil {
9595
return maskAny(err)
9696
}
9797
return nil
@@ -137,22 +137,47 @@ func (ds DeploymentStatusMembers) MemberStatusByPVCName(pvcName string) (MemberS
137137
return MemberStatus{}, 0, false
138138
}
139139

140-
// UpdateMemberStatus updates the given status in the given group.
141-
func (ds *DeploymentStatusMembers) UpdateMemberStatus(status MemberStatus, group ServerGroup) error {
140+
// Add adds the given status in the given group.
141+
func (ds *DeploymentStatusMembers) Add(status MemberStatus, group ServerGroup) error {
142142
var err error
143143
switch group {
144144
case ServerGroupSingle:
145-
err = ds.Single.Update(status)
145+
err = ds.Single.add(status)
146146
case ServerGroupAgents:
147-
err = ds.Agents.Update(status)
147+
err = ds.Agents.add(status)
148148
case ServerGroupDBServers:
149-
err = ds.DBServers.Update(status)
149+
err = ds.DBServers.add(status)
150150
case ServerGroupCoordinators:
151-
err = ds.Coordinators.Update(status)
151+
err = ds.Coordinators.add(status)
152152
case ServerGroupSyncMasters:
153-
err = ds.SyncMasters.Update(status)
153+
err = ds.SyncMasters.add(status)
154154
case ServerGroupSyncWorkers:
155-
err = ds.SyncWorkers.Update(status)
155+
err = ds.SyncWorkers.add(status)
156+
default:
157+
return maskAny(errors.Wrapf(NotFoundError, "ServerGroup %d is not known", group))
158+
}
159+
if err != nil {
160+
return maskAny(err)
161+
}
162+
return nil
163+
}
164+
165+
// Update updates the given status in the given group.
166+
func (ds *DeploymentStatusMembers) Update(status MemberStatus, group ServerGroup) error {
167+
var err error
168+
switch group {
169+
case ServerGroupSingle:
170+
err = ds.Single.update(status)
171+
case ServerGroupAgents:
172+
err = ds.Agents.update(status)
173+
case ServerGroupDBServers:
174+
err = ds.DBServers.update(status)
175+
case ServerGroupCoordinators:
176+
err = ds.Coordinators.update(status)
177+
case ServerGroupSyncMasters:
178+
err = ds.SyncMasters.update(status)
179+
case ServerGroupSyncWorkers:
180+
err = ds.SyncWorkers.update(status)
156181
default:
157182
return maskAny(errors.Wrapf(NotFoundError, "ServerGroup %d is not known", group))
158183
}
@@ -168,17 +193,17 @@ func (ds *DeploymentStatusMembers) RemoveByID(id string, group ServerGroup) erro
168193
var err error
169194
switch group {
170195
case ServerGroupSingle:
171-
err = ds.Single.RemoveByID(id)
196+
err = ds.Single.removeByID(id)
172197
case ServerGroupAgents:
173-
err = ds.Agents.RemoveByID(id)
198+
err = ds.Agents.removeByID(id)
174199
case ServerGroupDBServers:
175-
err = ds.DBServers.RemoveByID(id)
200+
err = ds.DBServers.removeByID(id)
176201
case ServerGroupCoordinators:
177-
err = ds.Coordinators.RemoveByID(id)
202+
err = ds.Coordinators.removeByID(id)
178203
case ServerGroupSyncMasters:
179-
err = ds.SyncMasters.RemoveByID(id)
204+
err = ds.SyncMasters.removeByID(id)
180205
case ServerGroupSyncWorkers:
181-
err = ds.SyncWorkers.RemoveByID(id)
206+
err = ds.SyncWorkers.removeByID(id)
182207
default:
183208
return maskAny(errors.Wrapf(NotFoundError, "ServerGroup %d is not known", group))
184209
}
@@ -190,8 +215,8 @@ func (ds *DeploymentStatusMembers) RemoveByID(id string, group ServerGroup) erro
190215

191216
// AllMembersReady returns true when all members are in the Ready state.
192217
func (ds DeploymentStatusMembers) AllMembersReady() bool {
193-
if err := ds.ForeachServerGroup(func(group ServerGroup, list *MemberStatusList) error {
194-
for _, x := range *list {
218+
if err := ds.ForeachServerGroup(func(group ServerGroup, list MemberStatusList) error {
219+
for _, x := range list {
195220
if !x.Conditions.IsTrue(ConditionTypeReady) {
196221
return fmt.Errorf("not ready")
197222
}

pkg/apis/deployment/v1alpha/member_status_list.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ func (l MemberStatusList) ElementByPVCName(pvcName string) (MemberStatus, bool)
7676

7777
// Add a member to the list.
7878
// Returns an AlreadyExistsError if the ID of the given member already exists.
79-
func (l *MemberStatusList) Add(m MemberStatus) error {
79+
func (l *MemberStatusList) add(m MemberStatus) error {
8080
src := *l
8181
for _, x := range src {
8282
if x.ID == m.ID {
@@ -89,7 +89,7 @@ func (l *MemberStatusList) Add(m MemberStatus) error {
8989

9090
// Update a member in the list.
9191
// Returns a NotFoundError if the ID of the given member cannot be found.
92-
func (l MemberStatusList) Update(m MemberStatus) error {
92+
func (l MemberStatusList) update(m MemberStatus) error {
9393
for i, x := range l {
9494
if x.ID == m.ID {
9595
l[i] = m
@@ -101,7 +101,7 @@ func (l MemberStatusList) Update(m MemberStatus) error {
101101

102102
// RemoveByID a member with given ID from the list.
103103
// Returns a NotFoundError if the ID of the given member cannot be found.
104-
func (l *MemberStatusList) RemoveByID(id string) error {
104+
func (l *MemberStatusList) removeByID(id string) error {
105105
src := *l
106106
for i, x := range src {
107107
if x.ID == id {
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
//
2+
// DISCLAIMER
3+
//
4+
// Copyright 2018 ArangoDB GmbH, Cologne, Germany
5+
//
6+
// Licensed under the Apache License, Version 2.0 (the "License");
7+
// you may not use this file except in compliance with the License.
8+
// You may obtain a copy of the License at
9+
//
10+
// http://www.apache.org/licenses/LICENSE-2.0
11+
//
12+
// Unless required by applicable law or agreed to in writing, software
13+
// distributed under the License is distributed on an "AS IS" BASIS,
14+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15+
// See the License for the specific language governing permissions and
16+
// limitations under the License.
17+
//
18+
// Copyright holder is ArangoDB GmbH, Cologne, Germany
19+
//
20+
// Author Ewout Prangsma
21+
//
22+
23+
package v1alpha
24+
25+
import (
26+
"testing"
27+
28+
"github.com/stretchr/testify/assert"
29+
)
30+
31+
// TestMemberStatusList tests modifying a MemberStatusList.
32+
func TestMemberStatusList(t *testing.T) {
33+
list := &MemberStatusList{}
34+
m1 := MemberStatus{ID: "m1"}
35+
m2 := MemberStatus{ID: "m2"}
36+
m3 := MemberStatus{ID: "m3"}
37+
assert.Equal(t, 0, len(*list))
38+
39+
assert.NoError(t, list.add(m1))
40+
assert.Equal(t, 1, len(*list))
41+
42+
assert.NoError(t, list.add(m2))
43+
assert.NoError(t, list.add(m3))
44+
assert.Equal(t, 3, len(*list))
45+
46+
assert.Error(t, list.add(m2))
47+
assert.Equal(t, 3, len(*list))
48+
49+
assert.NoError(t, list.removeByID(m3.ID))
50+
assert.Equal(t, 2, len(*list))
51+
assert.False(t, list.ContainsID(m3.ID))
52+
assert.Equal(t, m1.ID, (*list)[0].ID)
53+
assert.Equal(t, m2.ID, (*list)[1].ID)
54+
55+
m2.PodName = "foo"
56+
assert.NoError(t, list.update(m2))
57+
assert.Equal(t, 2, len(*list))
58+
assert.True(t, list.ContainsID(m2.ID))
59+
x, found := list.ElementByPodName("foo")
60+
assert.True(t, found)
61+
assert.Equal(t, "foo", x.PodName)
62+
assert.Equal(t, m2.ID, x.ID)
63+
64+
assert.NoError(t, list.add(m3))
65+
assert.Equal(t, 3, len(*list))
66+
assert.Equal(t, m1.ID, (*list)[0].ID)
67+
assert.Equal(t, m2.ID, (*list)[1].ID)
68+
assert.Equal(t, m3.ID, (*list)[2].ID)
69+
}

pkg/deployment/cleanup.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,8 @@ func (d *Deployment) removePodFinalizers() error {
3535
return maskAny(err)
3636
}
3737
for _, p := range pods {
38-
if err := k8sutil.RemovePodFinalizers(log, kubecli, &p, p.GetFinalizers()); err != nil {
38+
ignoreNotFound := true
39+
if err := k8sutil.RemovePodFinalizers(log, kubecli, &p, p.GetFinalizers(), ignoreNotFound); err != nil {
3940
log.Warn().Err(err).Msg("Failed to remove pod finalizers")
4041
}
4142
}
@@ -51,7 +52,8 @@ func (d *Deployment) removePVCFinalizers() error {
5152
return maskAny(err)
5253
}
5354
for _, p := range pvcs {
54-
if err := k8sutil.RemovePVCFinalizers(log, kubecli, &p, p.GetFinalizers()); err != nil {
55+
ignoreNotFound := true
56+
if err := k8sutil.RemovePVCFinalizers(log, kubecli, &p, p.GetFinalizers(), ignoreNotFound); err != nil {
5557
log.Warn().Err(err).Msg("Failed to remove PVC finalizers")
5658
}
5759
}

pkg/deployment/cluster_scaling_integration.go

Lines changed: 26 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,10 @@ type clusterScalingIntegration struct {
5050
}
5151
}
5252

53+
const (
54+
maxClusterBootstrapTime = time.Minute * 2 // Time we allow a cluster bootstrap to take, before we can do cluster inspections.
55+
)
56+
5357
// newClusterScalingIntegration creates a new clusterScalingIntegration.
5458
func newClusterScalingIntegration(depl *Deployment) *clusterScalingIntegration {
5559
return &clusterScalingIntegration{
@@ -67,20 +71,29 @@ func (ci *clusterScalingIntegration) SendUpdateToCluster(spec api.DeploymentSpec
6771

6872
// listenForClusterEvents keep listening for changes entered in the UI of the cluster.
6973
func (ci *clusterScalingIntegration) ListenForClusterEvents(stopCh <-chan struct{}) {
74+
start := time.Now()
75+
goodInspections := 0
7076
for {
7177
delay := time.Second * 2
7278

7379
// Is deployment in running state
74-
if ci.depl.status.Phase == api.DeploymentPhaseRunning {
80+
if ci.depl.GetPhase() == api.DeploymentPhaseRunning {
7581
// Update cluster with our state
7682
ctx := context.Background()
77-
safeToAskCluster, err := ci.updateClusterServerCount(ctx)
83+
expectSuccess := goodInspections > 0 || time.Since(start) > maxClusterBootstrapTime
84+
safeToAskCluster, err := ci.updateClusterServerCount(ctx, expectSuccess)
7885
if err != nil {
79-
ci.log.Debug().Err(err).Msg("Cluster update failed")
86+
if expectSuccess {
87+
ci.log.Debug().Err(err).Msg("Cluster update failed")
88+
}
8089
} else if safeToAskCluster {
8190
// Inspect once
82-
if err := ci.inspectCluster(ctx); err != nil {
83-
ci.log.Debug().Err(err).Msg("Cluster inspection failed")
91+
if err := ci.inspectCluster(ctx, expectSuccess); err != nil {
92+
if expectSuccess {
93+
ci.log.Debug().Err(err).Msg("Cluster inspection failed")
94+
}
95+
} else {
96+
goodInspections++
8497
}
8598
}
8699
}
@@ -96,15 +109,17 @@ func (ci *clusterScalingIntegration) ListenForClusterEvents(stopCh <-chan struct
96109
}
97110

98111
// Perform a single inspection of the cluster
99-
func (ci *clusterScalingIntegration) inspectCluster(ctx context.Context) error {
112+
func (ci *clusterScalingIntegration) inspectCluster(ctx context.Context, expectSuccess bool) error {
100113
log := ci.log
101114
c, err := ci.depl.clientCache.GetDatabase(ctx)
102115
if err != nil {
103116
return maskAny(err)
104117
}
105118
req, err := arangod.GetNumberOfServers(ctx, c.Connection())
106119
if err != nil {
107-
log.Debug().Err(err).Msg("Failed to get number of servers")
120+
if expectSuccess {
121+
log.Debug().Err(err).Msg("Failed to get number of servers")
122+
}
108123
return maskAny(err)
109124
}
110125
if req.Coordinators == nil && req.DBServers == nil {
@@ -150,7 +165,7 @@ func (ci *clusterScalingIntegration) inspectCluster(ctx context.Context) error {
150165

151166
// updateClusterServerCount updates the intended number of servers of the cluster.
152167
// Returns true when it is safe to ask the cluster for updates.
153-
func (ci *clusterScalingIntegration) updateClusterServerCount(ctx context.Context) (bool, error) {
168+
func (ci *clusterScalingIntegration) updateClusterServerCount(ctx context.Context, expectSuccess bool) (bool, error) {
154169
// Any update needed?
155170
ci.pendingUpdate.mutex.Lock()
156171
spec := ci.pendingUpdate.spec
@@ -168,7 +183,9 @@ func (ci *clusterScalingIntegration) updateClusterServerCount(ctx context.Contex
168183
coordinatorCount := spec.Coordinators.GetCount()
169184
dbserverCount := spec.DBServers.GetCount()
170185
if err := arangod.SetNumberOfServers(ctx, c.Connection(), coordinatorCount, dbserverCount); err != nil {
171-
log.Debug().Err(err).Msg("Failed to set number of servers")
186+
if expectSuccess {
187+
log.Debug().Err(err).Msg("Failed to set number of servers")
188+
}
172189
return false, maskAny(err)
173190
}
174191

0 commit comments

Comments
 (0)