Skip to content

Commit 81809c0

Browse files
authored
Merge pull request #70 from arangodb/reconcile
Moved reconciliation code to separate package
2 parents 2af40ca + ba407b6 commit 81809c0

20 files changed

+358
-94
lines changed

Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,7 @@ run-unit-tests: $(GOBUILDDIR) $(SOURCES)
217217
go test $(TESTVERBOSEOPTIONS) \
218218
$(REPOPATH)/pkg/apis/deployment/v1alpha \
219219
$(REPOPATH)/pkg/deployment \
220+
$(REPOPATH)/pkg/deployment/reconcile \
220221
$(REPOPATH)/pkg/util/k8sutil \
221222
$(REPOPATH)/pkg/util/k8sutil/test
222223

pkg/deployment/deployment.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ import (
3535
corev1 "k8s.io/client-go/kubernetes/typed/core/v1"
3636

3737
api "github.com/arangodb/kube-arangodb/pkg/apis/deployment/v1alpha"
38+
"github.com/arangodb/kube-arangodb/pkg/deployment/reconcile"
3839
"github.com/arangodb/kube-arangodb/pkg/generated/clientset/versioned"
3940
"github.com/arangodb/kube-arangodb/pkg/util/k8sutil"
4041
"github.com/arangodb/kube-arangodb/pkg/util/retry"
@@ -92,6 +93,7 @@ type Deployment struct {
9293
clientCache *clientCache
9394
recentInspectionErrors int
9495
clusterScalingIntegration *clusterScalingIntegration
96+
reconciler *reconcile.Reconciler
9597
}
9698

9799
// New creates a new Deployment from the given API object.
@@ -109,6 +111,7 @@ func New(config Config, deps Dependencies, apiObject *api.ArangoDeployment) (*De
109111
eventsCli: deps.KubeCli.Core().Events(apiObject.GetNamespace()),
110112
clientCache: newClientCache(deps.KubeCli, apiObject),
111113
}
114+
d.reconciler = reconcile.NewReconciler(deps.Log, d)
112115
if d.status.AcceptedSpec == nil {
113116
// We've validated the spec, so let's use it from now.
114117
d.status.AcceptedSpec = apiObject.Spec.DeepCopy()

pkg/deployment/deployment_inspector.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,13 +58,13 @@ func (d *Deployment) inspectDeployment(lastInterval time.Duration) time.Duration
5858
}
5959

6060
// Create scale/update plan
61-
if err := d.createPlan(); err != nil {
61+
if err := d.reconciler.CreatePlan(); err != nil {
6262
hasError = true
6363
d.createEvent(k8sutil.NewErrorEvent("Plan creation failed", err, d.apiObject))
6464
}
6565

6666
// Execute current step of scale/update plan
67-
retrySoon, err := d.executePlan(ctx)
67+
retrySoon, err := d.reconciler.ExecutePlan(ctx)
6868
if err != nil {
6969
hasError = true
7070
d.createEvent(k8sutil.NewErrorEvent("Plan execution failed", err, d.apiObject))

pkg/deployment/pod_inspector.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -40,14 +40,14 @@ func (d *Deployment) inspectPods() error {
4040
log := d.deps.Log
4141
var events []*v1.Event
4242

43-
pods, err := d.deps.KubeCli.CoreV1().Pods(d.apiObject.GetNamespace()).List(k8sutil.DeploymentListOpt(d.apiObject.GetName()))
43+
pods, err := d.GetOwnedPods()
4444
if err != nil {
45-
log.Debug().Err(err).Msg("Failed to list pods")
45+
log.Debug().Err(err).Msg("Failed to get owned pods")
4646
return maskAny(err)
4747
}
4848

4949
// Update member status from all pods found
50-
for _, p := range pods.Items {
50+
for _, p := range pods {
5151
// Check ownership
5252
if !d.isOwnerOf(&p) {
5353
log.Debug().Str("pod", p.GetName()).Msg("pod not owned by this deployment")
@@ -101,7 +101,7 @@ func (d *Deployment) inspectPods() error {
101101
}
102102

103103
podExists := func(podName string) bool {
104-
for _, p := range pods.Items {
104+
for _, p := range pods {
105105
if p.GetName() == podName && d.isOwnerOf(&p) {
106106
return true
107107
}

pkg/deployment/action.go renamed to pkg/deployment/reconcile/action.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
// Author Ewout Prangsma
2121
//
2222

23-
package deployment
23+
package reconcile
2424

2525
import (
2626
"context"

pkg/deployment/action_add_member.go renamed to pkg/deployment/reconcile/action_add_member.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
// Author Ewout Prangsma
2121
//
2222

23-
package deployment
23+
package reconcile
2424

2525
import (
2626
"context"

pkg/deployment/action_cleanout_member.go renamed to pkg/deployment/reconcile/action_cleanout_member.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
// Author Ewout Prangsma
2121
//
2222

23-
package deployment
23+
package reconcile
2424

2525
import (
2626
"context"

pkg/deployment/action_context.go renamed to pkg/deployment/reconcile/action_context.go

Lines changed: 25 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
// Author Ewout Prangsma
2121
//
2222

23-
package deployment
23+
package reconcile
2424

2525
import (
2626
"context"
@@ -29,11 +29,9 @@ import (
2929
driver "github.com/arangodb/go-driver"
3030
"github.com/rs/zerolog"
3131
"github.com/rs/zerolog/log"
32-
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
3332

3433
api "github.com/arangodb/kube-arangodb/pkg/apis/deployment/v1alpha"
3534
"github.com/arangodb/kube-arangodb/pkg/util/arangod"
36-
"github.com/arangodb/kube-arangodb/pkg/util/k8sutil"
3735
)
3836

3937
// ActionContext provides methods to the Action implementations
@@ -68,28 +66,28 @@ type ActionContext interface {
6866
}
6967

7068
// NewActionContext creates a new ActionContext implementation.
71-
func NewActionContext(log zerolog.Logger, deployment *Deployment) ActionContext {
69+
func NewActionContext(log zerolog.Logger, context ReconcileContext) ActionContext {
7270
return &actionContext{
73-
log: log,
74-
deployment: deployment,
71+
log: log,
72+
context: context,
7573
}
7674
}
7775

7876
// actionContext implements ActionContext
7977
type actionContext struct {
80-
log zerolog.Logger
81-
deployment *Deployment
78+
log zerolog.Logger
79+
context ReconcileContext
8280
}
8381

8482
// Gets the specified mode of deployment
8583
func (ac *actionContext) GetMode() api.DeploymentMode {
86-
return ac.deployment.apiObject.Spec.GetMode()
84+
return ac.context.GetSpec().GetMode()
8785
}
8886

8987
// GetDatabaseClient returns a cached client for the entire database (cluster coordinators or single server),
9088
// creating one if needed.
9189
func (ac *actionContext) GetDatabaseClient(ctx context.Context) (driver.Client, error) {
92-
c, err := ac.deployment.clientCache.GetDatabase(ctx)
90+
c, err := ac.context.GetDatabaseClient(ctx)
9391
if err != nil {
9492
return nil, maskAny(err)
9593
}
@@ -98,7 +96,7 @@ func (ac *actionContext) GetDatabaseClient(ctx context.Context) (driver.Client,
9896

9997
// GetServerClient returns a cached client for a specific server.
10098
func (ac *actionContext) GetServerClient(ctx context.Context, group api.ServerGroup, id string) (driver.Client, error) {
101-
c, err := ac.deployment.clientCache.Get(ctx, group, id)
99+
c, err := ac.context.GetServerClient(ctx, group, id)
102100
if err != nil {
103101
return nil, maskAny(err)
104102
}
@@ -107,55 +105,39 @@ func (ac *actionContext) GetServerClient(ctx context.Context, group api.ServerGr
107105

108106
// GetAgencyClients returns a client connection for every agency member.
109107
func (ac *actionContext) GetAgencyClients(ctx context.Context) ([]arangod.Agency, error) {
110-
agencyMembers := ac.deployment.status.Members.Agents
111-
result := make([]arangod.Agency, 0, len(agencyMembers))
112-
for _, m := range agencyMembers {
113-
client, err := ac.GetServerClient(ctx, api.ServerGroupAgents, m.ID)
114-
if err != nil {
115-
return nil, maskAny(err)
116-
}
117-
aClient, err := arangod.NewAgencyClient(client)
118-
if err != nil {
119-
return nil, maskAny(err)
120-
}
121-
result = append(result, aClient)
108+
c, err := ac.context.GetAgencyClients(ctx)
109+
if err != nil {
110+
return nil, maskAny(err)
122111
}
123-
return result, nil
112+
return c, nil
124113
}
125114

126115
// GetMemberStatusByID returns the current member status
127116
// for the member with given id.
128117
// Returns member status, true when found, or false
129118
// when no such member is found.
130119
func (ac *actionContext) GetMemberStatusByID(id string) (api.MemberStatus, bool) {
131-
m, _, ok := ac.deployment.status.Members.ElementByID(id)
120+
m, _, ok := ac.context.GetStatus().Members.ElementByID(id)
132121
return m, ok
133122
}
134123

135124
// CreateMember adds a new member to the given group.
136125
func (ac *actionContext) CreateMember(group api.ServerGroup) error {
137-
d := ac.deployment
138-
if err := d.createMember(group, d.apiObject); err != nil {
139-
ac.log.Debug().Err(err).Str("group", group.AsRole()).Msg("Failed to create member")
140-
return maskAny(err)
141-
}
142-
// Save added member
143-
if err := d.updateCRStatus(); err != nil {
144-
log.Debug().Err(err).Msg("Updating CR status failed")
126+
if err := ac.context.CreateMember(group); err != nil {
145127
return maskAny(err)
146128
}
147129
return nil
148130
}
149131

150132
// UpdateMember updates the deployment status wrt the given member.
151133
func (ac *actionContext) UpdateMember(member api.MemberStatus) error {
152-
d := ac.deployment
153-
_, group, found := ac.deployment.status.Members.ElementByID(member.ID)
134+
status := ac.context.GetStatus()
135+
_, group, found := status.Members.ElementByID(member.ID)
154136
if !found {
155137
return maskAny(fmt.Errorf("Member %s not found", member.ID))
156138
}
157-
d.status.Members.UpdateMemberStatus(member, group)
158-
if err := d.updateCRStatus(); err != nil {
139+
status.Members.UpdateMemberStatus(member, group)
140+
if err := ac.context.UpdateStatus(status); err != nil {
159141
log.Debug().Err(err).Msg("Updating CR status failed")
160142
return maskAny(err)
161143
}
@@ -164,17 +146,17 @@ func (ac *actionContext) UpdateMember(member api.MemberStatus) error {
164146

165147
// RemoveMemberByID removes a member with given id.
166148
func (ac *actionContext) RemoveMemberByID(id string) error {
167-
d := ac.deployment
168-
_, group, found := d.status.Members.ElementByID(id)
149+
status := ac.context.GetStatus()
150+
_, group, found := status.Members.ElementByID(id)
169151
if !found {
170152
return nil
171153
}
172-
if err := d.status.Members.RemoveByID(id, group); err != nil {
154+
if err := status.Members.RemoveByID(id, group); err != nil {
173155
log.Debug().Err(err).Str("group", group.AsRole()).Msg("Failed to remove member")
174156
return maskAny(err)
175157
}
176158
// Save removed member
177-
if err := d.updateCRStatus(); err != nil {
159+
if err := ac.context.UpdateStatus(status); err != nil {
178160
return maskAny(err)
179161
}
180162
return nil
@@ -183,10 +165,7 @@ func (ac *actionContext) RemoveMemberByID(id string) error {
183165
// DeletePod deletes a pod with given name in the namespace
184166
// of the deployment. If the pod does not exist, the error is ignored.
185167
func (ac *actionContext) DeletePod(podName string) error {
186-
d := ac.deployment
187-
ns := d.apiObject.GetNamespace()
188-
if err := d.deps.KubeCli.Core().Pods(ns).Delete(podName, &metav1.DeleteOptions{}); err != nil && !k8sutil.IsNotFound(err) {
189-
log.Debug().Err(err).Str("pod", podName).Msg("Failed to remove pod")
168+
if err := ac.context.DeletePod(podName); err != nil {
190169
return maskAny(err)
191170
}
192171
return nil
@@ -195,10 +174,7 @@ func (ac *actionContext) DeletePod(podName string) error {
195174
// DeletePvc deletes a persistent volume claim with given name in the namespace
196175
// of the deployment. If the pvc does not exist, the error is ignored.
197176
func (ac *actionContext) DeletePvc(pvcName string) error {
198-
d := ac.deployment
199-
ns := d.apiObject.GetNamespace()
200-
if err := d.deps.KubeCli.Core().PersistentVolumeClaims(ns).Delete(pvcName, &metav1.DeleteOptions{}); err != nil && !k8sutil.IsNotFound(err) {
201-
log.Debug().Err(err).Str("pvc", pvcName).Msg("Failed to remove pvc")
177+
if err := ac.context.DeletePvc(pvcName); err != nil {
202178
return maskAny(err)
203179
}
204180
return nil

pkg/deployment/action_remove_member.go renamed to pkg/deployment/reconcile/action_remove_member.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
// Author Ewout Prangsma
2121
//
2222

23-
package deployment
23+
package reconcile
2424

2525
import (
2626
"context"

pkg/deployment/action_rotate_member.go renamed to pkg/deployment/reconcile/action_rotate_member.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
// Author Ewout Prangsma
2121
//
2222

23-
package deployment
23+
package reconcile
2424

2525
import (
2626
"context"

0 commit comments

Comments
 (0)