2020// Author Ewout Prangsma
2121//
2222
23- package deployment
23+ package reconcile
2424
2525import (
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
7977type 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
8583func (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.
9189func (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.
10098func (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.
109107func (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.
130119func (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.
136125func (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.
151133func (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.
166148func (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.
185167func (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.
197176func (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
0 commit comments