1717//
1818// Copyright holder is ArangoDB GmbH, Cologne, Germany
1919//
20- // Author Ewout Prangsma
21- // Author Tomasz Mielech
2220//
2321
2422package resources
@@ -35,27 +33,22 @@ import (
3533 "sync"
3634 "time"
3735
38- "github.com/arangodb/kube-arangodb/pkg/util"
39-
40- "github.com/arangodb/kube-arangodb/pkg/util/errors"
41-
42- "github.com/arangodb/kube-arangodb/pkg/deployment/features"
43-
44- inspectorInterface "github.com/arangodb/kube-arangodb/pkg/util/k8sutil/inspector"
45- "github.com/arangodb/kube-arangodb/pkg/util/k8sutil/interfaces"
46-
36+ core "k8s.io/api/core/v1"
37+ meta "k8s.io/apimachinery/pkg/apis/meta/v1"
4738 "k8s.io/apimachinery/pkg/types"
39+ "k8s.io/client-go/kubernetes"
4840
49- "github.com/arangodb/kube-arangodb/pkg/deployment/pod "
41+ "github.com/arangodb/go-driver "
5042
51- driver "github.com/arangodb/go-driver"
5243 api "github.com/arangodb/kube-arangodb/pkg/apis/deployment/v1"
44+ "github.com/arangodb/kube-arangodb/pkg/deployment/features"
45+ "github.com/arangodb/kube-arangodb/pkg/deployment/pod"
46+ "github.com/arangodb/kube-arangodb/pkg/util"
5347 "github.com/arangodb/kube-arangodb/pkg/util/constants"
48+ "github.com/arangodb/kube-arangodb/pkg/util/errors"
5449 "github.com/arangodb/kube-arangodb/pkg/util/k8sutil"
55-
56- core "k8s.io/api/core/v1"
57- meta "k8s.io/apimachinery/pkg/apis/meta/v1"
58- "k8s.io/client-go/kubernetes"
50+ inspectorInterface "github.com/arangodb/kube-arangodb/pkg/util/k8sutil/inspector"
51+ "github.com/arangodb/kube-arangodb/pkg/util/k8sutil/interfaces"
5952)
6053
6154func versionHasAdvertisedEndpoint (v driver.Version ) bool {
@@ -369,7 +362,8 @@ func (r *Resources) RenderPodForMember(ctx context.Context, cachedStatus inspect
369362
370363 newMember .PodName = k8sutil .CreatePodName (apiObject .GetName (), roleAbbr , newMember .ID , CreatePodSuffix (spec ))
371364
372- // Render pod
365+ var podCreator interfaces.PodCreator
366+ var args []string
373367 if group .IsArangod () {
374368 // Prepare arguments
375369 autoUpgrade := newMember .Conditions .IsTrue (api .ConditionTypeAutoUpgrade ) || spec .Upgrade .Get ().AutoUpgrade
@@ -390,16 +384,16 @@ func (r *Resources) RenderPodForMember(ctx context.Context, cachedStatus inspect
390384
391385 input := memberPod .AsInput ()
392386
393- args , err := createArangodArgs (cachedStatus , input )
387+ var err error
388+ args , err = createArangodArgs (cachedStatus , input )
394389 if err != nil {
395390 return nil , errors .WithStack (err )
396391 }
397392
398393 if err := memberPod .Validate (cachedStatus ); err != nil {
399394 return nil , errors .WithStack (errors .Wrapf (err , "Validation of pods resources failed" ))
400395 }
401-
402- return RenderArangoPod (cachedStatus , apiObject , role , newMember .ID , newMember .PodName , args , & memberPod )
396+ podCreator = & memberPod
403397 } else if group .IsArangosync () {
404398 // Check image
405399 if ! imageInfo .Enterprise {
@@ -455,7 +449,7 @@ func (r *Resources) RenderPodForMember(ctx context.Context, cachedStatus inspect
455449 }
456450
457451 // Prepare arguments
458- args : = createArangoSyncArgs (apiObject , spec , group , groupSpec , * newMember )
452+ args = createArangoSyncArgs (apiObject , spec , group , groupSpec , * newMember )
459453
460454 memberSyncPod := MemberSyncPod {
461455 tlsKeyfileSecretName : tlsKeyfileSecretName ,
@@ -470,10 +464,23 @@ func (r *Resources) RenderPodForMember(ctx context.Context, cachedStatus inspect
470464 arangoMember : * member ,
471465 }
472466
473- return RenderArangoPod ( cachedStatus , apiObject , role , newMember . ID , newMember . PodName , args , & memberSyncPod )
467+ podCreator = & memberSyncPod
474468 } else {
475469 return nil , errors .Newf ("unable to render Pod" )
476470 }
471+
472+ pod , err := RenderArangoPod (cachedStatus , apiObject , role , newMember .ID , newMember .PodName , args , podCreator )
473+ if err != nil {
474+ return nil , err
475+ }
476+
477+ if features .RandomPodNames ().Enabled () {
478+ // The server will generate the name with some additional suffix after `-`.
479+ pod .GenerateName = pod .Name + "-"
480+ pod .Name = ""
481+ }
482+
483+ return pod , nil
477484}
478485
479486func (r * Resources ) SelectImage (spec api.DeploymentSpec , status api.DeploymentStatus ) (api.ImageInfo , bool ) {
@@ -563,11 +570,12 @@ func (r *Resources) createPodForMember(ctx context.Context, spec api.DeploymentS
563570
564571 ctxChild , cancel := context .WithTimeout (ctx , k8sutil .GetRequestTimeout ())
565572 defer cancel ()
566- uid , err := CreateArangoPod (ctxChild , kubecli , apiObject , spec , group , CreatePodFromTemplate (template .PodSpec ))
573+ podName , uid , err := CreateArangoPod (ctxChild , kubecli , apiObject , spec , group , CreatePodFromTemplate (template .PodSpec ))
567574 if err != nil {
568575 return errors .WithStack (err )
569576 }
570577
578+ m .PodName = podName
571579 m .PodUID = uid
572580 m .PodSpecVersion = template .PodSpecChecksum
573581 m .ArangoVersion = m .Image .ArangoDBVersion
@@ -610,12 +618,13 @@ func (r *Resources) createPodForMember(ctx context.Context, spec api.DeploymentS
610618
611619 ctxChild , cancel := context .WithTimeout (ctx , k8sutil .GetRequestTimeout ())
612620 defer cancel ()
613- uid , err := CreateArangoPod (ctxChild , kubecli , apiObject , spec , group , CreatePodFromTemplate (template .PodSpec ))
621+ podName , uid , err := CreateArangoPod (ctxChild , kubecli , apiObject , spec , group , CreatePodFromTemplate (template .PodSpec ))
614622 if err != nil {
615623 return errors .WithStack (err )
616624 }
617625 log .Debug ().Str ("pod-name" , m .PodName ).Msg ("Created pod" )
618626
627+ m .PodName = podName
619628 m .PodUID = uid
620629 m .PodSpecVersion = template .PodSpecChecksum
621630 }
@@ -704,13 +713,14 @@ func RenderArangoPod(cachedStatus inspectorInterface.Inspector, deployment k8sut
704713// CreateArangoPod creates a new Pod with container provided by parameter 'containerCreator'
705714// If the pod already exists, nil is returned.
706715// If another error occurs, that error is returned.
707- func CreateArangoPod (ctx context.Context , kubecli kubernetes.Interface , deployment k8sutil.APIObject , deploymentSpec api.DeploymentSpec , group api.ServerGroup , pod * core.Pod ) (types.UID , error ) {
708- uid , err := k8sutil .CreatePod (ctx , kubecli , pod , deployment .GetNamespace (), deployment .AsOwner ())
716+ func CreateArangoPod (ctx context.Context , kubecli kubernetes.Interface , deployment k8sutil.APIObject ,
717+ deploymentSpec api.DeploymentSpec , group api.ServerGroup , pod * core.Pod ) (string , types.UID , error ) {
718+ podName , uid , err := k8sutil .CreatePod (ctx , kubecli , pod , deployment .GetNamespace (), deployment .AsOwner ())
709719 if err != nil {
710- return "" , errors .WithStack (err )
720+ return "" , "" , errors .WithStack (err )
711721 }
712722
713- return uid , nil
723+ return podName , uid , nil
714724}
715725
716726func CreatePodFromTemplate (p * core.PodTemplateSpec ) * core.Pod {
@@ -777,8 +787,11 @@ func (r *Resources) EnsurePods(ctx context.Context, cachedStatus inspectorInterf
777787 return nil
778788}
779789
790+ // CreatePodSuffix creates additional string to glue it to the POD name.
791+ // The suffix is calculated according to the given spec, so it is easily to recognize by name if the pods have the same spec.
792+ // The additional `postSuffix` can be provided. It can be used to distinguish restarts of POD.
780793func CreatePodSuffix (spec api.DeploymentSpec ) string {
781- if features .PodNames ().Enabled () {
794+ if features .ShortPodNames (). Enabled () || features . RandomPodNames ().Enabled () {
782795 return ""
783796 }
784797
0 commit comments