Skip to content

Commit 9d9d5e2

Browse files
[Bugfix] Fix arangosync members state inspection (#970)
1 parent b3b9da0 commit 9d9d5e2

File tree

5 files changed

+86
-36
lines changed

5 files changed

+86
-36
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
# Change Log
22

33
## [master](https://github.com/arangodb/kube-arangodb/tree/master) (N/A)
4+
- (Bugfix) Fix arangosync members state inspection
45

56
## [1.2.12](https://github.com/arangodb/kube-arangodb/tree/1.2.12) (2022-05-10)
67
- (Feature) Add CoreV1 Endpoints Inspector

pkg/deployment/member/image.go

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
//
2+
// DISCLAIMER
3+
//
4+
// Copyright 2016-2022 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+
21+
package member
22+
23+
import (
24+
api "github.com/arangodb/kube-arangodb/pkg/apis/deployment/v1"
25+
)
26+
27+
func GetImageLicense(image *api.ImageInfo) string {
28+
if image.Enterprise {
29+
return "enterprise"
30+
}
31+
return "community"
32+
}

pkg/deployment/member/state.go

Lines changed: 48 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ func (s *stateInspector) Log(logger zerolog.Logger) {
7878
defer s.lock.Unlock()
7979

8080
for m, s := range s.members {
81-
if s.IsInvalid() {
81+
if !s.IsReachable() {
8282
s.Log(logger.Info()).Str("member", m).Msgf("Member is in invalid state")
8383
}
8484
}
@@ -95,22 +95,9 @@ func (s *stateInspector) RefreshState(ctx context.Context, members api.Deploymen
9595

9696
members.ForEach(func(id int) {
9797
if members[id].Group.IsArangosync() {
98-
return
99-
}
100-
101-
results[id] = State{}
102-
103-
c, err := s.client.GetServerClient(nctx, members[id].Group, members[id].Member.ID)
104-
if err != nil {
105-
results[id].Reachable = err
106-
return
107-
}
108-
109-
if v, err := c.Version(nctx); err != nil {
110-
results[id].Reachable = err
111-
return
98+
results[id] = s.fetchArangosyncMemberState(nctx, members[id])
11299
} else {
113-
results[id].Version = v
100+
results[id] = s.fetchServerMemberState(nctx, members[id])
114101
}
115102
})
116103

@@ -122,11 +109,11 @@ func (s *stateInspector) RefreshState(ctx context.Context, members api.Deploymen
122109

123110
c, err := s.client.GetDatabaseClient(ctx)
124111
if err != nil {
125-
cs.Reachable = err
112+
cs.NotReachableErr = err
126113
} else {
127114
v, err := c.Version(gctx)
128115
if err != nil {
129-
cs.Reachable = err
116+
cs.NotReachableErr = err
130117
} else {
131118
cs.Version = v
132119
}
@@ -155,6 +142,46 @@ func (s *stateInspector) RefreshState(ctx context.Context, members api.Deploymen
155142
s.health = h
156143
}
157144

145+
func (s *stateInspector) fetchArangosyncMemberState(ctx context.Context, m api.DeploymentStatusMemberElement) State {
146+
var state State
147+
c, err := s.client.GetSyncServerClient(ctx, m.Group, m.Member.ID)
148+
if err != nil {
149+
state.NotReachableErr = err
150+
return state
151+
}
152+
153+
if v, err := c.Version(ctx); err != nil {
154+
state.NotReachableErr = err
155+
} else {
156+
// convert arangosync VersionInfo to go-driver VersionInfo for simplicity:
157+
state.Version = driver.VersionInfo{
158+
Server: m.Group.AsRole(),
159+
Version: driver.Version(v.Version),
160+
License: GetImageLicense(m.Member.Image),
161+
Details: map[string]interface{}{
162+
"arangosync-build": v.Build,
163+
},
164+
}
165+
}
166+
return state
167+
}
168+
169+
func (s *stateInspector) fetchServerMemberState(ctx context.Context, m api.DeploymentStatusMemberElement) State {
170+
var state State
171+
c, err := s.client.GetServerClient(ctx, m.Group, m.Member.ID)
172+
if err != nil {
173+
state.NotReachableErr = err
174+
return state
175+
}
176+
177+
if v, err := c.Version(ctx); err != nil {
178+
state.NotReachableErr = err
179+
} else {
180+
state.Version = v
181+
}
182+
return state
183+
}
184+
158185
func (s *stateInspector) MemberState(id string) (State, bool) {
159186
s.lock.Lock()
160187
defer s.lock.Unlock()
@@ -175,24 +202,15 @@ type Health struct {
175202
}
176203

177204
type State struct {
178-
Reachable error
205+
NotReachableErr error
179206

180207
Version driver.VersionInfo
181208
}
182209

183210
func (s State) IsReachable() bool {
184-
return s.Reachable == nil
211+
return s.NotReachableErr == nil
185212
}
186213

187214
func (s State) Log(event *zerolog.Event) *zerolog.Event {
188-
if !s.IsReachable() {
189-
event = event.Bool("reachable", false).AnErr("reachableError", s.Reachable)
190-
} else {
191-
event = event.Bool("reachable", false)
192-
}
193-
return event
194-
}
195-
196-
func (s State) IsInvalid() bool {
197-
return !s.IsReachable()
215+
return event.Bool("reachable", s.IsReachable()).AnErr("reachableError", s.NotReachableErr)
198216
}

pkg/deployment/reconciler/context.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ package reconciler
2323
import (
2424
"context"
2525

26+
core "k8s.io/api/core/v1"
27+
2628
"github.com/arangodb/arangosync-client/client"
2729
"github.com/arangodb/go-driver"
2830
"github.com/arangodb/go-driver/agency"
@@ -38,7 +40,6 @@ import (
3840
servicev1 "github.com/arangodb/kube-arangodb/pkg/util/k8sutil/inspector/service/v1"
3941
serviceaccountv1 "github.com/arangodb/kube-arangodb/pkg/util/k8sutil/inspector/serviceaccount/v1"
4042
servicemonitorv1 "github.com/arangodb/kube-arangodb/pkg/util/k8sutil/inspector/servicemonitor/v1"
41-
core "k8s.io/api/core/v1"
4243
)
4344

4445
// ServerGroupIterator provides a helper to callback on every server
@@ -191,4 +192,5 @@ type DeploymentClient interface {
191192
DeploymentAgencyClient
192193
DeploymentDatabaseClient
193194
DeploymentMemberClient
195+
DeploymentSyncClient
194196
}

pkg/deployment/server_api.go

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import (
2929

3030
api "github.com/arangodb/kube-arangodb/pkg/apis/deployment/v1"
3131
"github.com/arangodb/kube-arangodb/pkg/apis/shared"
32+
memberState "github.com/arangodb/kube-arangodb/pkg/deployment/member"
3233
"github.com/arangodb/kube-arangodb/pkg/server"
3334
"github.com/arangodb/kube-arangodb/pkg/util/k8sutil"
3435
)
@@ -219,11 +220,7 @@ func (d *Deployment) DatabaseURL() string {
219220
func (d *Deployment) DatabaseVersion() (string, string) {
220221
status, _ := d.GetStatus()
221222
if current := status.CurrentImage; current != nil {
222-
license := "community"
223-
if current.Enterprise {
224-
license = "enterprise"
225-
}
226-
return string(current.ArangoDBVersion), license
223+
return string(current.ArangoDBVersion), memberState.GetImageLicense(status.CurrentImage)
227224
}
228225
return "", ""
229226
}

0 commit comments

Comments
 (0)