Skip to content

Commit 1c17ea1

Browse files
authored
[Refactor] Init pod creator with an error (#831)
1 parent 3f6cd55 commit 1c17ea1

File tree

5 files changed

+79
-71
lines changed

5 files changed

+79
-71
lines changed

pkg/deployment/images.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -225,7 +225,7 @@ func (ib *imagesBuilder) fetchArangoDBImageIDAndVersion(ctx context.Context, cac
225225
},
226226
}
227227

228-
pod, err = resources.RenderArangoPod(cachedStatus, ib.APIObject, role, id, podName, &imagePod)
228+
pod, err = resources.RenderArangoPod(ctx, cachedStatus, ib.APIObject, role, id, podName, &imagePod)
229229
if err != nil {
230230
log.Debug().Err(err).Msg("Failed to render image ID pod")
231231
return true, errors.WithStack(err)
@@ -259,10 +259,12 @@ func (i *ImageUpdatePod) GetRole() string {
259259
return "id"
260260
}
261261

262-
func (i *ImageUpdatePod) Init(pod *core.Pod) {
262+
func (i *ImageUpdatePod) Init(_ context.Context, _ interfaces.Inspector, pod *core.Pod) error {
263263
terminationGracePeriodSeconds := int64((time.Second * 30).Seconds())
264264
pod.Spec.TerminationGracePeriodSeconds = &terminationGracePeriodSeconds
265265
pod.Spec.PriorityClassName = i.spec.ID.Get().PriorityClassName
266+
267+
return nil
266268
}
267269

268270
func (i *ImageUpdatePod) GetImagePullSecrets() []string {

pkg/deployment/resources/pod_creator.go

Lines changed: 21 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -348,7 +348,7 @@ func (r *Resources) RenderPodForMember(ctx context.Context, cachedStatus inspect
348348
// Prepare arguments
349349
autoUpgrade := newMember.Conditions.IsTrue(api.ConditionTypeAutoUpgrade) || spec.Upgrade.Get().AutoUpgrade
350350

351-
memberPod := MemberArangoDPod{
351+
podCreator = &MemberArangoDPod{
352352
status: *newMember,
353353
groupSpec: groupSpec,
354354
spec: spec,
@@ -361,11 +361,6 @@ func (r *Resources) RenderPodForMember(ctx context.Context, cachedStatus inspect
361361
arangoMember: *member,
362362
cachedStatus: cachedStatus,
363363
}
364-
365-
if err := memberPod.Validate(cachedStatus); err != nil {
366-
return nil, errors.WithStack(errors.Wrapf(err, "Validation of pods resources failed"))
367-
}
368-
podCreator = &memberPod
369364
} else if group.IsArangosync() {
370365
// Check image
371366
if !imageInfo.Enterprise {
@@ -378,67 +373,21 @@ func (r *Resources) RenderPodForMember(ctx context.Context, cachedStatus inspect
378373
imageInfo.Image = spec.Sync.GetSyncImage()
379374
}
380375

381-
var tlsKeyfileSecretName, clientAuthCASecretName, masterJWTSecretName, clusterJWTSecretName string
382-
// Check master JWT secret
383-
384-
masterJWTSecretName = spec.Sync.Authentication.GetJWTSecretName()
385-
err := k8sutil.RunWithTimeout(ctx, func(ctxChild context.Context) error {
386-
return k8sutil.ValidateTokenSecret(ctxChild, cachedStatus.SecretReadInterface(), masterJWTSecretName)
387-
})
388-
if err != nil {
389-
return nil, errors.WithStack(errors.Wrapf(err, "Master JWT secret validation failed"))
390-
}
391-
392-
monitoringTokenSecretName := spec.Sync.Monitoring.GetTokenSecretName()
393-
err = k8sutil.RunWithTimeout(ctx, func(ctxChild context.Context) error {
394-
return k8sutil.ValidateTokenSecret(ctxChild, cachedStatus.SecretReadInterface(), monitoringTokenSecretName)
395-
})
396-
if err != nil {
397-
return nil, errors.WithStack(errors.Wrapf(err, "Monitoring token secret validation failed"))
398-
}
399-
400-
if group == api.ServerGroupSyncMasters {
401-
// Create TLS secret
402-
tlsKeyfileSecretName = k8sutil.CreateTLSKeyfileSecretName(apiObject.GetName(), role, newMember.ID)
403-
// Check cluster JWT secret
404-
if spec.IsAuthenticated() {
405-
clusterJWTSecretName = spec.Authentication.GetJWTSecretName()
406-
err = k8sutil.RunWithTimeout(ctx, func(ctxChild context.Context) error {
407-
return k8sutil.ValidateTokenSecret(ctxChild, cachedStatus.SecretReadInterface(), clusterJWTSecretName)
408-
})
409-
if err != nil {
410-
return nil, errors.WithStack(errors.Wrapf(err, "Cluster JWT secret validation failed"))
411-
}
412-
}
413-
// Check client-auth CA certificate secret
414-
clientAuthCASecretName = spec.Sync.Authentication.GetClientCASecretName()
415-
err = k8sutil.RunWithTimeout(ctx, func(ctxChild context.Context) error {
416-
return k8sutil.ValidateCACertificateSecret(ctxChild, cachedStatus.SecretReadInterface(), clientAuthCASecretName)
417-
})
418-
if err != nil {
419-
return nil, errors.WithStack(errors.Wrapf(err, "Client authentication CA certificate secret validation failed"))
420-
}
421-
}
422-
423376
podCreator = &MemberSyncPod{
424-
tlsKeyfileSecretName: tlsKeyfileSecretName,
425-
clientAuthCASecretName: clientAuthCASecretName,
426-
masterJWTSecretName: masterJWTSecretName,
427-
clusterJWTSecretName: clusterJWTSecretName,
428-
groupSpec: groupSpec,
429-
spec: spec,
430-
group: group,
431-
resources: r,
432-
imageInfo: imageInfo,
433-
arangoMember: *member,
434-
apiObject: apiObject,
435-
memberStatus: *newMember,
377+
groupSpec: groupSpec,
378+
spec: spec,
379+
group: group,
380+
resources: r,
381+
imageInfo: imageInfo,
382+
arangoMember: *member,
383+
apiObject: apiObject,
384+
memberStatus: *newMember,
436385
}
437386
} else {
438387
return nil, errors.Newf("unable to render Pod")
439388
}
440389

441-
pod, err := RenderArangoPod(cachedStatus, apiObject, role, newMember.ID, newMember.PodName, podCreator)
390+
pod, err := RenderArangoPod(ctx, cachedStatus, apiObject, role, newMember.ID, newMember.PodName, podCreator)
442391
if err != nil {
443392
return nil, err
444393
}
@@ -625,10 +574,15 @@ func (r *Resources) createPodForMember(ctx context.Context, cachedStatus inspect
625574
}
626575

627576
// RenderArangoPod renders new ArangoD Pod
628-
func RenderArangoPod(cachedStatus inspectorInterface.Inspector, deployment k8sutil.APIObject, role, id, podName string,
629-
podCreator interfaces.PodCreator) (*core.Pod, error) {
577+
func RenderArangoPod(ctx context.Context, cachedStatus inspectorInterface.Inspector, deployment k8sutil.APIObject,
578+
role, id, podName string, podCreator interfaces.PodCreator) (*core.Pod, error) {
579+
580+
// Validate if the pod can be created.
581+
if err := podCreator.Validate(cachedStatus); err != nil {
582+
return nil, errors.Wrapf(err, "Validation of pods resources failed")
583+
}
630584

631-
// Prepare basic pod
585+
// Prepare basic pod.
632586
p := k8sutil.NewPod(deployment.GetName(), role, id, podName, podCreator)
633587

634588
for k, v := range podCreator.Annotations() {
@@ -647,7 +601,9 @@ func RenderArangoPod(cachedStatus inspectorInterface.Inspector, deployment k8sut
647601
p.Labels[k] = v
648602
}
649603

650-
podCreator.Init(&p)
604+
if err := podCreator.Init(ctx, cachedStatus, &p); err != nil {
605+
return nil, err
606+
}
651607

652608
if initContainers, err := podCreator.GetInitContainers(cachedStatus); err != nil {
653609
return nil, errors.WithStack(err)

pkg/deployment/resources/pod_creator_arangod.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
package resources
2424

2525
import (
26+
"context"
2627
"fmt"
2728
"math"
2829
"os"
@@ -252,10 +253,12 @@ func (m *MemberArangoDPod) AsInput() pod.Input {
252253
}
253254
}
254255

255-
func (m *MemberArangoDPod) Init(pod *core.Pod) {
256+
func (m *MemberArangoDPod) Init(_ context.Context, _ interfaces.Inspector, pod *core.Pod) error {
256257
terminationGracePeriodSeconds := int64(math.Ceil(m.group.DefaultTerminationGracePeriod().Seconds()))
257258
pod.Spec.TerminationGracePeriodSeconds = &terminationGracePeriodSeconds
258259
pod.Spec.PriorityClassName = m.groupSpec.PriorityClassName
260+
261+
return nil
259262
}
260263

261264
func (m *MemberArangoDPod) Validate(cachedStatus interfaces.Inspector) error {

pkg/deployment/resources/pod_creator_sync.go

Lines changed: 47 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,11 @@
2323
package resources
2424

2525
import (
26+
"context"
2627
"math"
2728

29+
"github.com/arangodb/kube-arangodb/pkg/util/errors"
30+
2831
meta "k8s.io/apimachinery/pkg/apis/meta/v1"
2932

3033
"github.com/arangodb/kube-arangodb/pkg/util/collection"
@@ -298,13 +301,55 @@ func (m *MemberSyncPod) GetContainerCreator() interfaces.ContainerCreator {
298301
}
299302
}
300303

301-
func (m *MemberSyncPod) Init(pod *core.Pod) {
304+
// Init initializes the arangosync pod.
305+
func (m *MemberSyncPod) Init(ctx context.Context, cachedStatus interfaces.Inspector, pod *core.Pod) error {
302306
terminationGracePeriodSeconds := int64(math.Ceil(m.group.DefaultTerminationGracePeriod().Seconds()))
303307
pod.Spec.TerminationGracePeriodSeconds = &terminationGracePeriodSeconds
304308
pod.Spec.PriorityClassName = m.groupSpec.PriorityClassName
309+
310+
m.masterJWTSecretName = m.spec.Sync.Authentication.GetJWTSecretName()
311+
err := k8sutil.RunWithTimeout(ctx, func(ctxChild context.Context) error {
312+
return k8sutil.ValidateTokenSecret(ctxChild, cachedStatus.SecretReadInterface(), m.masterJWTSecretName)
313+
})
314+
if err != nil {
315+
return errors.Wrapf(err, "Master JWT secret validation failed")
316+
}
317+
318+
monitoringTokenSecretName := m.spec.Sync.Monitoring.GetTokenSecretName()
319+
err = k8sutil.RunWithTimeout(ctx, func(ctxChild context.Context) error {
320+
return k8sutil.ValidateTokenSecret(ctxChild, cachedStatus.SecretReadInterface(), monitoringTokenSecretName)
321+
})
322+
if err != nil {
323+
return errors.Wrapf(err, "Monitoring token secret validation failed")
324+
}
325+
326+
if m.group == api.ServerGroupSyncMasters {
327+
// Create TLS secret
328+
m.tlsKeyfileSecretName = k8sutil.CreateTLSKeyfileSecretName(m.apiObject.GetName(), m.group.AsRole(), m.memberStatus.ID)
329+
// Check cluster JWT secret
330+
if m.spec.IsAuthenticated() {
331+
m.clusterJWTSecretName = m.spec.Authentication.GetJWTSecretName()
332+
err = k8sutil.RunWithTimeout(ctx, func(ctxChild context.Context) error {
333+
return k8sutil.ValidateTokenSecret(ctxChild, cachedStatus.SecretReadInterface(), m.clusterJWTSecretName)
334+
})
335+
if err != nil {
336+
return errors.Wrapf(err, "Cluster JWT secret validation failed")
337+
}
338+
}
339+
// Check client-auth CA certificate secret
340+
m.clientAuthCASecretName = m.spec.Sync.Authentication.GetClientCASecretName()
341+
err = k8sutil.RunWithTimeout(ctx, func(ctxChild context.Context) error {
342+
return k8sutil.ValidateCACertificateSecret(ctxChild, cachedStatus.SecretReadInterface(), m.clientAuthCASecretName)
343+
})
344+
if err != nil {
345+
return errors.Wrapf(err, "Client authentication CA certificate secret validation failed")
346+
}
347+
}
348+
349+
return nil
305350
}
306351

307-
func (m *MemberSyncPod) Validate(cachedStatus interfaces.Inspector) error {
352+
func (m *MemberSyncPod) Validate(_ interfaces.Inspector) error {
308353
return nil
309354
}
310355

pkg/util/k8sutil/interfaces/pod_creator.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@
2323
package interfaces
2424

2525
import (
26+
"context"
27+
2628
"github.com/arangodb/kube-arangodb/pkg/util/k8sutil/inspector/secret"
2729
"github.com/arangodb/kube-arangodb/pkg/util/k8sutil/inspector/service"
2830
core "k8s.io/api/core/v1"
@@ -38,7 +40,7 @@ type PodModifier interface {
3840
}
3941

4042
type PodCreator interface {
41-
Init(*core.Pod)
43+
Init(context.Context, Inspector, *core.Pod) error
4244
GetName() string
4345
GetRole() string
4446
GetVolumes() []core.Volume

0 commit comments

Comments
 (0)