From 4d7fcdcbf7a36b2fdc53a4915d6b0b61df31addf Mon Sep 17 00:00:00 2001 From: ajanikow <12255597+ajanikow@users.noreply.github.com> Date: Thu, 4 Mar 2021 11:53:05 +0000 Subject: [PATCH 1/5] Add inspector for ArangoMember --- pkg/apis/deployment/v1/register.go | 2 + pkg/deployment/cleanup.go | 5 +- pkg/deployment/context_impl.go | 18 ++- pkg/deployment/deployment.go | 6 +- pkg/deployment/deployment_finalizers.go | 8 +- pkg/deployment/deployment_inspector.go | 8 +- pkg/deployment/deployment_run_test.go | 4 +- pkg/deployment/images.go | 3 +- pkg/deployment/pod/builder.go | 4 +- pkg/deployment/pod/encryption.go | 6 +- pkg/deployment/pod/jwt.go | 5 +- pkg/deployment/pod/sni.go | 6 +- pkg/deployment/pod/tls.go | 6 +- pkg/deployment/pod/upgrade.go | 4 +- pkg/deployment/pod/upgrade_version_check.go | 4 +- pkg/deployment/reconcile/action_context.go | 12 +- pkg/deployment/reconcile/context.go | 6 +- pkg/deployment/reconcile/helper_tls_sni.go | 5 +- pkg/deployment/reconcile/plan_builder.go | 20 +-- .../reconcile/plan_builder_bootstrap.go | 4 +- .../reconcile/plan_builder_cluster.go | 4 +- .../reconcile/plan_builder_common.go | 4 +- .../reconcile/plan_builder_context.go | 5 +- .../reconcile/plan_builder_encryption.go | 17 ++- pkg/deployment/reconcile/plan_builder_jwt.go | 12 +- .../reconcile/plan_builder_restore.go | 4 +- .../reconcile/plan_builder_rotate_upgrade.go | 8 +- .../reconcile/plan_builder_scale.go | 6 +- .../reconcile/plan_builder_storage.go | 4 +- pkg/deployment/reconcile/plan_builder_test.go | 6 +- pkg/deployment/reconcile/plan_builder_tls.go | 24 ++-- .../reconcile/plan_builder_tls_sni.go | 5 +- pkg/deployment/reconcile/plan_executor.go | 7 +- pkg/deployment/resources/annotations.go | 19 ++- pkg/deployment/resources/certicicates.go | 4 +- pkg/deployment/resources/context.go | 9 +- .../resources/inspector/inspector.go | 61 ++++----- pkg/deployment/resources/inspector/members.go | 120 ++++++++++++++++++ pkg/deployment/resources/inspector/pdbs.go | 10 +- pkg/deployment/resources/inspector/pods.go | 10 +- pkg/deployment/resources/inspector/pvcs.go | 10 +- pkg/deployment/resources/inspector/sa.go | 10 +- pkg/deployment/resources/inspector/secrets.go | 10 +- .../resources/inspector/services.go | 8 +- pkg/deployment/resources/inspector/sms.go | 10 +- pkg/deployment/resources/labels.go | 18 +-- pkg/deployment/resources/license.go | 4 +- pkg/deployment/resources/pod_cleanup.go | 3 +- pkg/deployment/resources/pod_creator.go | 8 +- .../resources/pod_creator_arangod.go | 3 +- pkg/deployment/resources/pod_creator_sync.go | 3 +- pkg/deployment/resources/pod_inspector.go | 3 +- pkg/deployment/resources/pvc_inspector.go | 3 +- pkg/deployment/resources/pvcs.go | 4 +- pkg/deployment/resources/secret_hashes.go | 7 +- pkg/deployment/resources/secrets.go | 32 ++--- pkg/deployment/resources/services.go | 7 +- .../k8sutil/inspector/arangomember/member.go | 33 +++++ pkg/util/k8sutil/inspector/inspector.go | 50 ++++++++ .../inspector/persistentvolumeclaim/pvc.go | 33 +++++ pkg/util/k8sutil/inspector/pod/pod.go | 33 +++++ .../inspector/poddisruptionbudget/pdb.go | 33 +++++ pkg/util/k8sutil/inspector/secret/secret.go | 42 ++++++ pkg/util/k8sutil/inspector/service/service.go | 33 +++++ .../k8sutil/inspector/serviceaccount/sa.go | 33 +++++ .../k8sutil/inspector/servicemonitor/sm.go | 33 +++++ pkg/util/k8sutil/interfaces/pod_creator.go | 8 +- pkg/util/k8sutil/services.go | 6 +- 68 files changed, 693 insertions(+), 262 deletions(-) create mode 100644 pkg/deployment/resources/inspector/members.go create mode 100644 pkg/util/k8sutil/inspector/arangomember/member.go create mode 100644 pkg/util/k8sutil/inspector/inspector.go create mode 100644 pkg/util/k8sutil/inspector/persistentvolumeclaim/pvc.go create mode 100644 pkg/util/k8sutil/inspector/pod/pod.go create mode 100644 pkg/util/k8sutil/inspector/poddisruptionbudget/pdb.go create mode 100644 pkg/util/k8sutil/inspector/secret/secret.go create mode 100644 pkg/util/k8sutil/inspector/service/service.go create mode 100644 pkg/util/k8sutil/inspector/serviceaccount/sa.go create mode 100644 pkg/util/k8sutil/inspector/servicemonitor/sm.go diff --git a/pkg/apis/deployment/v1/register.go b/pkg/apis/deployment/v1/register.go index 263e8ad5b..a15a6de41 100644 --- a/pkg/apis/deployment/v1/register.go +++ b/pkg/apis/deployment/v1/register.go @@ -50,6 +50,8 @@ func addKnownTypes(s *runtime.Scheme) error { s.AddKnownTypes(SchemeGroupVersion, &ArangoDeployment{}, &ArangoDeploymentList{}, + &ArangoMember{}, + &ArangoMemberList{}, ) metav1.AddToGroupVersion(s, SchemeGroupVersion) return nil diff --git a/pkg/deployment/cleanup.go b/pkg/deployment/cleanup.go index 3acaea6ee..1d7cdd012 100644 --- a/pkg/deployment/cleanup.go +++ b/pkg/deployment/cleanup.go @@ -26,12 +26,13 @@ import ( "github.com/arangodb/kube-arangodb/pkg/deployment/resources/inspector" "github.com/arangodb/kube-arangodb/pkg/util" "github.com/arangodb/kube-arangodb/pkg/util/k8sutil" + inspectorInterface "github.com/arangodb/kube-arangodb/pkg/util/k8sutil/inspector" core "k8s.io/api/core/v1" meta "k8s.io/apimachinery/pkg/apis/meta/v1" ) // removePodFinalizers removes all finalizers from all pods owned by us. -func (d *Deployment) removePodFinalizers(cachedStatus inspector.Inspector) error { +func (d *Deployment) removePodFinalizers(cachedStatus inspectorInterface.Inspector) error { log := d.deps.Log kubecli := d.GetKubeCli() @@ -58,7 +59,7 @@ func (d *Deployment) removePodFinalizers(cachedStatus inspector.Inspector) error } // removePVCFinalizers removes all finalizers from all PVCs owned by us. -func (d *Deployment) removePVCFinalizers(cachedStatus inspector.Inspector) error { +func (d *Deployment) removePVCFinalizers(cachedStatus inspectorInterface.Inspector) error { log := d.deps.Log kubecli := d.GetKubeCli() diff --git a/pkg/deployment/context_impl.go b/pkg/deployment/context_impl.go index cd21f2123..34105ff53 100644 --- a/pkg/deployment/context_impl.go +++ b/pkg/deployment/context_impl.go @@ -30,6 +30,10 @@ import ( "strconv" "time" + "github.com/arangodb/kube-arangodb/pkg/generated/clientset/versioned" + inspectorInterface "github.com/arangodb/kube-arangodb/pkg/util/k8sutil/inspector" + "github.com/arangodb/kube-arangodb/pkg/util/k8sutil/inspector/secret" + "github.com/arangodb/kube-arangodb/pkg/util/errors" "github.com/arangodb/kube-arangodb/pkg/util/arangod/conn" @@ -45,8 +49,6 @@ import ( "github.com/arangodb/kube-arangodb/pkg/deployment/pod" "github.com/arangodb/kube-arangodb/pkg/util/constants" - "github.com/arangodb/kube-arangodb/pkg/deployment/resources/inspector" - apiErrors "k8s.io/apimachinery/pkg/api/errors" "github.com/arangodb/arangosync-client/client" @@ -88,6 +90,10 @@ func (d *Deployment) GetMonitoringV1Cli() monitoringClient.MonitoringV1Interface return d.deps.KubeMonitoringCli } +func (d *Deployment) GetArangoCli() versioned.Interface { + return d.deps.DatabaseCRCli +} + func (d *Deployment) GetScope() scope.Scope { return d.config.Scope } @@ -263,7 +269,7 @@ func (d *Deployment) getAuth() (driver.Authentication, error) { return nil, nil } - var secrets inspector.SecretReadInterface = d.GetKubeCli().CoreV1().Secrets(d.apiObject.GetNamespace()) + var secrets secret.ReadInterface = d.GetKubeCli().CoreV1().Secrets(d.apiObject.GetNamespace()) if currentState := d.currentState; currentState != nil { secrets = currentState.SecretReadInterface() } @@ -535,7 +541,7 @@ func (d *Deployment) GetAgencyData(ctx context.Context, i interface{}, keyParts return err } -func (d *Deployment) RenderPodForMember(cachedStatus inspector.Inspector, spec api.DeploymentSpec, status api.DeploymentStatus, memberID string, imageInfo api.ImageInfo) (*v1.Pod, error) { +func (d *Deployment) RenderPodForMember(cachedStatus inspectorInterface.Inspector, spec api.DeploymentSpec, status api.DeploymentStatus, memberID string, imageInfo api.ImageInfo) (*v1.Pod, error) { return d.resources.RenderPodForMember(cachedStatus, spec, status, memberID, imageInfo) } @@ -593,10 +599,10 @@ func (d *Deployment) GetOwnedPods() ([]v1.Pod, error) { return podList, nil } -func (d *Deployment) GetCachedStatus() inspector.Inspector { +func (d *Deployment) GetCachedStatus() inspectorInterface.Inspector { return d.currentState } -func (d *Deployment) SetCachedStatus(i inspector.Inspector) { +func (d *Deployment) SetCachedStatus(i inspectorInterface.Inspector) { d.currentState = i } diff --git a/pkg/deployment/deployment.go b/pkg/deployment/deployment.go index 9cdedf26e..1bb7a7bdc 100644 --- a/pkg/deployment/deployment.go +++ b/pkg/deployment/deployment.go @@ -28,6 +28,8 @@ import ( "sync/atomic" "time" + inspectorInterface "github.com/arangodb/kube-arangodb/pkg/util/k8sutil/inspector" + deploymentClient "github.com/arangodb/kube-arangodb/pkg/deployment/client" "github.com/arangodb/kube-arangodb/pkg/util/errors" @@ -121,7 +123,7 @@ type Deployment struct { inspectCRDTrigger trigger.Trigger updateDeploymentTrigger trigger.Trigger clientCache deploymentClient.Cache - currentState inspector.Inspector + currentState inspectorInterface.Inspector recentInspectionErrors int clusterScalingIntegration *clusterScalingIntegration reconciler *reconcile.Reconciler @@ -249,7 +251,7 @@ func (d *Deployment) run() { for { select { case <-d.stopCh: - cachedStatus, err := inspector.NewInspector(d.GetKubeCli(), d.GetMonitoringV1Cli(), d.GetNamespace()) + cachedStatus, err := inspector.NewInspector(d.GetKubeCli(), d.GetMonitoringV1Cli(), d.GetArangoCli(), d.GetNamespace()) if err != nil { log.Error().Err(err).Msg("Unable to get resources") } diff --git a/pkg/deployment/deployment_finalizers.go b/pkg/deployment/deployment_finalizers.go index b6278e38a..822a1dd19 100644 --- a/pkg/deployment/deployment_finalizers.go +++ b/pkg/deployment/deployment_finalizers.go @@ -25,9 +25,9 @@ package deployment import ( "context" - "github.com/arangodb/kube-arangodb/pkg/util/errors" + inspectorInterface "github.com/arangodb/kube-arangodb/pkg/util/k8sutil/inspector" - "github.com/arangodb/kube-arangodb/pkg/deployment/resources/inspector" + "github.com/arangodb/kube-arangodb/pkg/util/errors" "github.com/rs/zerolog" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -51,7 +51,7 @@ func ensureFinalizers(depl *api.ArangoDeployment) { } // runDeploymentFinalizers goes through the list of ArangoDeployoment finalizers to see if they can be removed. -func (d *Deployment) runDeploymentFinalizers(ctx context.Context, cachedStatus inspector.Inspector) error { +func (d *Deployment) runDeploymentFinalizers(ctx context.Context, cachedStatus inspectorInterface.Inspector) error { log := d.deps.Log var removalList []string @@ -83,7 +83,7 @@ func (d *Deployment) runDeploymentFinalizers(ctx context.Context, cachedStatus i // inspectRemoveChildFinalizers checks the finalizer condition for remove-child-finalizers. // It returns nil if the finalizer can be removed. -func (d *Deployment) inspectRemoveChildFinalizers(ctx context.Context, log zerolog.Logger, depl *api.ArangoDeployment, cachedStatus inspector.Inspector) error { +func (d *Deployment) inspectRemoveChildFinalizers(ctx context.Context, log zerolog.Logger, depl *api.ArangoDeployment, cachedStatus inspectorInterface.Inspector) error { if err := d.removePodFinalizers(cachedStatus); err != nil { return errors.WithStack(err) } diff --git a/pkg/deployment/deployment_inspector.go b/pkg/deployment/deployment_inspector.go index e1a7c1157..950b4a04a 100644 --- a/pkg/deployment/deployment_inspector.go +++ b/pkg/deployment/deployment_inspector.go @@ -26,6 +26,8 @@ import ( "context" "time" + inspectorInterface "github.com/arangodb/kube-arangodb/pkg/util/k8sutil/inspector" + "github.com/arangodb/kube-arangodb/pkg/util/errors" "github.com/arangodb/kube-arangodb/pkg/deployment/patch" @@ -67,7 +69,7 @@ func (d *Deployment) inspectDeployment(lastInterval util.Interval) util.Interval deploymentName := d.apiObject.GetName() defer metrics.SetDuration(inspectDeploymentDurationGauges.WithLabelValues(deploymentName), start) - cachedStatus, err := inspector.NewInspector(d.GetKubeCli(), d.GetMonitoringV1Cli(), d.GetNamespace()) + cachedStatus, err := inspector.NewInspector(d.GetKubeCli(), d.GetMonitoringV1Cli(), d.GetArangoCli(), d.GetNamespace()) if err != nil { log.Error().Err(err).Msg("Unable to get resources") return minInspectionInterval // Retry ASAP @@ -127,7 +129,7 @@ func (d *Deployment) inspectDeployment(lastInterval util.Interval) util.Interval return nextInterval.ReduceTo(maxInspectionInterval) } -func (d *Deployment) inspectDeploymentWithError(ctx context.Context, lastInterval util.Interval, cachedStatus inspector.Inspector) (nextInterval util.Interval, inspectError error) { +func (d *Deployment) inspectDeploymentWithError(ctx context.Context, lastInterval util.Interval, cachedStatus inspectorInterface.Inspector) (nextInterval util.Interval, inspectError error) { t := time.Now() d.SetCachedStatus(cachedStatus) @@ -298,7 +300,7 @@ func (d *Deployment) inspectDeploymentWithError(ctx context.Context, lastInterva return } -func (d *Deployment) ensureResources(lastInterval util.Interval, cachedStatus inspector.Inspector) (util.Interval, error) { +func (d *Deployment) ensureResources(lastInterval util.Interval, cachedStatus inspectorInterface.Inspector) (util.Interval, error) { // Ensure all resources are created if d.haveServiceMonitorCRD { if err := d.resources.EnsureServiceMonitor(); err != nil { diff --git a/pkg/deployment/deployment_run_test.go b/pkg/deployment/deployment_run_test.go index 41c4249c3..5812f238e 100644 --- a/pkg/deployment/deployment_run_test.go +++ b/pkg/deployment/deployment_run_test.go @@ -63,7 +63,7 @@ func runTestCase(t *testing.T, testCase testCaseStruct) { errs := 0 for { - cache, err := inspector.NewInspector(d.GetKubeCli(), d.GetMonitoringV1Cli(), d.GetNamespace()) + cache, err := inspector.NewInspector(d.GetKubeCli(), d.GetMonitoringV1Cli(), d.GetArangoCli(), d.GetNamespace()) require.NoError(t, err) err = d.resources.EnsureSecrets(log.Logger, cache) if err == nil { @@ -105,7 +105,7 @@ func runTestCase(t *testing.T, testCase testCaseStruct) { } // Act - cache, err := inspector.NewInspector(d.GetKubeCli(), d.GetMonitoringV1Cli(), d.GetNamespace()) + cache, err := inspector.NewInspector(d.GetKubeCli(), d.GetMonitoringV1Cli(), d.GetArangoCli(), d.GetNamespace()) require.NoError(t, err) err = d.resources.EnsurePods(cache) diff --git a/pkg/deployment/images.go b/pkg/deployment/images.go index 76f522a03..109581717 100644 --- a/pkg/deployment/images.go +++ b/pkg/deployment/images.go @@ -31,7 +31,6 @@ import ( "github.com/arangodb/kube-arangodb/pkg/util/errors" - "github.com/arangodb/kube-arangodb/pkg/deployment/resources/inspector" "github.com/arangodb/kube-arangodb/pkg/util/k8sutil/interfaces" "github.com/arangodb/kube-arangodb/pkg/deployment/pod" @@ -395,7 +394,7 @@ func (i *ImageUpdatePod) GetNodeAffinity() *core.NodeAffinity { return pod.ReturnNodeAffinityOrNil(a) } -func (i *ImageUpdatePod) Validate(cachedStatus inspector.Inspector) error { +func (i *ImageUpdatePod) Validate(cachedStatus interfaces.Inspector) error { return nil } diff --git a/pkg/deployment/pod/builder.go b/pkg/deployment/pod/builder.go index a3c12d652..cb8e1bc44 100644 --- a/pkg/deployment/pod/builder.go +++ b/pkg/deployment/pod/builder.go @@ -25,8 +25,8 @@ package pod import ( "github.com/arangodb/go-driver" deploymentApi "github.com/arangodb/kube-arangodb/pkg/apis/deployment/v1" - "github.com/arangodb/kube-arangodb/pkg/deployment/resources/inspector" "github.com/arangodb/kube-arangodb/pkg/util/k8sutil" + "github.com/arangodb/kube-arangodb/pkg/util/k8sutil/interfaces" core "k8s.io/api/core/v1" meta "k8s.io/apimachinery/pkg/apis/meta/v1" ) @@ -47,5 +47,5 @@ type Builder interface { Args(i Input) k8sutil.OptionPairs Volumes(i Input) ([]core.Volume, []core.VolumeMount) Envs(i Input) []core.EnvVar - Verify(i Input, cachedStatus inspector.Inspector) error + Verify(i Input, cachedStatus interfaces.Inspector) error } diff --git a/pkg/deployment/pod/encryption.go b/pkg/deployment/pod/encryption.go index 7ffb693b7..366578962 100644 --- a/pkg/deployment/pod/encryption.go +++ b/pkg/deployment/pod/encryption.go @@ -27,12 +27,12 @@ import ( "fmt" "path/filepath" + "github.com/arangodb/kube-arangodb/pkg/util/k8sutil/interfaces" + "github.com/arangodb/kube-arangodb/pkg/util/errors" "github.com/arangodb/kube-arangodb/pkg/deployment/features" - "github.com/arangodb/kube-arangodb/pkg/deployment/resources/inspector" - api "github.com/arangodb/kube-arangodb/pkg/apis/deployment/v1" "github.com/arangodb/kube-arangodb/pkg/util/constants" "github.com/arangodb/kube-arangodb/pkg/util/k8sutil" @@ -154,7 +154,7 @@ func (e encryption) Volumes(i Input) ([]core.Volume, []core.VolumeMount) { } } -func (e encryption) Verify(i Input, cachedStatus inspector.Inspector) error { +func (e encryption) Verify(i Input, cachedStatus interfaces.Inspector) error { if !IsEncryptionEnabled(i) { return nil } diff --git a/pkg/deployment/pod/jwt.go b/pkg/deployment/pod/jwt.go index 290b79267..99ca89c3b 100644 --- a/pkg/deployment/pod/jwt.go +++ b/pkg/deployment/pod/jwt.go @@ -26,12 +26,13 @@ import ( "fmt" "path/filepath" + "github.com/arangodb/kube-arangodb/pkg/util/k8sutil/interfaces" + "github.com/arangodb/kube-arangodb/pkg/util/errors" "github.com/arangodb/kube-arangodb/pkg/deployment/features" "github.com/arangodb/go-driver" - "github.com/arangodb/kube-arangodb/pkg/deployment/resources/inspector" "github.com/arangodb/kube-arangodb/pkg/util/constants" "github.com/arangodb/kube-arangodb/pkg/util/k8sutil" @@ -118,7 +119,7 @@ func (e jwt) Volumes(i Input) ([]core.Volume, []core.VolumeMount) { return []core.Volume{vol}, []core.VolumeMount{k8sutil.ClusterJWTVolumeMount()} } -func (e jwt) Verify(i Input, cachedStatus inspector.Inspector) error { +func (e jwt) Verify(i Input, cachedStatus interfaces.Inspector) error { if !IsAuthenticated(i) { return nil } diff --git a/pkg/deployment/pod/sni.go b/pkg/deployment/pod/sni.go index e0cb237f4..b1e1e474b 100644 --- a/pkg/deployment/pod/sni.go +++ b/pkg/deployment/pod/sni.go @@ -26,12 +26,12 @@ import ( "crypto/sha256" "fmt" + "github.com/arangodb/kube-arangodb/pkg/util/k8sutil/interfaces" + "github.com/arangodb/kube-arangodb/pkg/util/errors" "github.com/arangodb/kube-arangodb/pkg/deployment/features" - "github.com/arangodb/kube-arangodb/pkg/deployment/resources/inspector" - api "github.com/arangodb/kube-arangodb/pkg/apis/deployment/v1" "github.com/arangodb/kube-arangodb/pkg/util" @@ -78,7 +78,7 @@ func (s sni) isSupported(i Input) bool { return GroupSNISupported(i.Deployment.Mode.Get(), i.Group) } -func (s sni) Verify(i Input, cachedStatus inspector.Inspector) error { +func (s sni) Verify(i Input, cachedStatus interfaces.Inspector) error { if !s.isSupported(i) { return nil } diff --git a/pkg/deployment/pod/tls.go b/pkg/deployment/pod/tls.go index 287a37c9f..afcb6ccf7 100644 --- a/pkg/deployment/pod/tls.go +++ b/pkg/deployment/pod/tls.go @@ -25,12 +25,12 @@ package pod import ( "path/filepath" + "github.com/arangodb/kube-arangodb/pkg/util/k8sutil/interfaces" + "github.com/arangodb/kube-arangodb/pkg/deployment/features" api "github.com/arangodb/kube-arangodb/pkg/apis/deployment/v1" - "github.com/arangodb/kube-arangodb/pkg/deployment/resources/inspector" - "github.com/arangodb/kube-arangodb/pkg/util/constants" "github.com/arangodb/kube-arangodb/pkg/util/k8sutil" core "k8s.io/api/core/v1" @@ -59,7 +59,7 @@ func (s tls) Envs(i Input) []core.EnvVar { return nil } -func (s tls) Verify(i Input, cachedStatus inspector.Inspector) error { +func (s tls) Verify(i Input, cachedStatus interfaces.Inspector) error { if !IsTLSEnabled(i) { return nil } diff --git a/pkg/deployment/pod/upgrade.go b/pkg/deployment/pod/upgrade.go index 753dede6f..0665ad8e9 100644 --- a/pkg/deployment/pod/upgrade.go +++ b/pkg/deployment/pod/upgrade.go @@ -24,8 +24,8 @@ package pod import ( deploymentApi "github.com/arangodb/kube-arangodb/pkg/apis/deployment/v1" - "github.com/arangodb/kube-arangodb/pkg/deployment/resources/inspector" "github.com/arangodb/kube-arangodb/pkg/util/k8sutil" + "github.com/arangodb/kube-arangodb/pkg/util/k8sutil/interfaces" core "k8s.io/api/core/v1" ) @@ -39,7 +39,7 @@ func (u autoUpgrade) Envs(i Input) []core.EnvVar { return nil } -func (u autoUpgrade) Verify(i Input, cachedStatus inspector.Inspector) error { +func (u autoUpgrade) Verify(i Input, cachedStatus interfaces.Inspector) error { return nil } diff --git a/pkg/deployment/pod/upgrade_version_check.go b/pkg/deployment/pod/upgrade_version_check.go index f02b29710..ed662fb33 100644 --- a/pkg/deployment/pod/upgrade_version_check.go +++ b/pkg/deployment/pod/upgrade_version_check.go @@ -25,8 +25,8 @@ package pod import ( api "github.com/arangodb/kube-arangodb/pkg/apis/deployment/v1" "github.com/arangodb/kube-arangodb/pkg/deployment/features" - "github.com/arangodb/kube-arangodb/pkg/deployment/resources/inspector" "github.com/arangodb/kube-arangodb/pkg/util/k8sutil" + "github.com/arangodb/kube-arangodb/pkg/util/k8sutil/interfaces" core "k8s.io/api/core/v1" ) @@ -58,6 +58,6 @@ func (u upgradeVersionCheck) Envs(i Input) []core.EnvVar { return nil } -func (u upgradeVersionCheck) Verify(i Input, cachedStatus inspector.Inspector) error { +func (u upgradeVersionCheck) Verify(i Input, cachedStatus interfaces.Inspector) error { return nil } diff --git a/pkg/deployment/reconcile/action_context.go b/pkg/deployment/reconcile/action_context.go index b89acb081..c10afc868 100644 --- a/pkg/deployment/reconcile/action_context.go +++ b/pkg/deployment/reconcile/action_context.go @@ -25,9 +25,9 @@ package reconcile import ( "context" - "github.com/arangodb/kube-arangodb/pkg/util/errors" + inspectorInterface "github.com/arangodb/kube-arangodb/pkg/util/k8sutil/inspector" - "github.com/arangodb/kube-arangodb/pkg/deployment/resources/inspector" + "github.com/arangodb/kube-arangodb/pkg/util/errors" backupApi "github.com/arangodb/kube-arangodb/pkg/apis/backup/v1" @@ -129,11 +129,11 @@ type ActionContext interface { // GetName receives information about a deployment name GetName() string // GetNameget current cached state of deployment - GetCachedStatus() inspector.Inspector + GetCachedStatus() inspectorInterface.Inspector } // newActionContext creates a new ActionContext implementation. -func newActionContext(log zerolog.Logger, context Context, cachedStatus inspector.Inspector) ActionContext { +func newActionContext(log zerolog.Logger, context Context, cachedStatus inspectorInterface.Inspector) ActionContext { return &actionContext{ log: log, context: context, @@ -145,10 +145,10 @@ func newActionContext(log zerolog.Logger, context Context, cachedStatus inspecto type actionContext struct { log zerolog.Logger context Context - cachedStatus inspector.Inspector + cachedStatus inspectorInterface.Inspector } -func (ac *actionContext) GetCachedStatus() inspector.Inspector { +func (ac *actionContext) GetCachedStatus() inspectorInterface.Inspector { return ac.cachedStatus } diff --git a/pkg/deployment/reconcile/context.go b/pkg/deployment/reconcile/context.go index c2245c296..6da733f67 100644 --- a/pkg/deployment/reconcile/context.go +++ b/pkg/deployment/reconcile/context.go @@ -25,9 +25,9 @@ package reconcile import ( "context" - "github.com/arangodb/kube-arangodb/pkg/util/arangod/conn" + inspectorInterface "github.com/arangodb/kube-arangodb/pkg/util/k8sutil/inspector" - "github.com/arangodb/kube-arangodb/pkg/deployment/resources/inspector" + "github.com/arangodb/kube-arangodb/pkg/util/arangod/conn" backupApi "github.com/arangodb/kube-arangodb/pkg/apis/backup/v1" @@ -107,7 +107,7 @@ type Context interface { // GetAgencyData object for key path GetAgencyData(ctx context.Context, i interface{}, keyParts ...string) error // Renders Pod definition for member - RenderPodForMember(cachedStatus inspector.Inspector, spec api.DeploymentSpec, status api.DeploymentStatus, memberID string, imageInfo api.ImageInfo) (*v1.Pod, error) + RenderPodForMember(cachedStatus inspectorInterface.Inspector, spec api.DeploymentSpec, status api.DeploymentStatus, memberID string, imageInfo api.ImageInfo) (*v1.Pod, error) // SelectImage select currently used image by pod SelectImage(spec api.DeploymentSpec, status api.DeploymentStatus) (api.ImageInfo, bool) // WithStatusUpdate update status of ArangoDeployment with defined modifier. If action returns True action is taken diff --git a/pkg/deployment/reconcile/helper_tls_sni.go b/pkg/deployment/reconcile/helper_tls_sni.go index f22247fad..3066769ff 100644 --- a/pkg/deployment/reconcile/helper_tls_sni.go +++ b/pkg/deployment/reconcile/helper_tls_sni.go @@ -27,18 +27,19 @@ import ( "crypto/sha256" "fmt" + inspectorInterface "github.com/arangodb/kube-arangodb/pkg/util/k8sutil/inspector" + "github.com/arangodb/kube-arangodb/pkg/util/errors" "github.com/arangodb/go-driver" api "github.com/arangodb/kube-arangodb/pkg/apis/deployment/v1" "github.com/arangodb/kube-arangodb/pkg/deployment/client" - "github.com/arangodb/kube-arangodb/pkg/deployment/resources/inspector" "github.com/arangodb/kube-arangodb/pkg/util/constants" "github.com/rs/zerolog" ) -func mapTLSSNIConfig(log zerolog.Logger, sni api.TLSSNISpec, cachedStatus inspector.Inspector) (map[string]string, error) { +func mapTLSSNIConfig(log zerolog.Logger, sni api.TLSSNISpec, cachedStatus inspectorInterface.Inspector) (map[string]string, error) { fetchedSecrets := map[string]string{} mapping := sni.Mapping diff --git a/pkg/deployment/reconcile/plan_builder.go b/pkg/deployment/reconcile/plan_builder.go index 426d1fb45..5a3dcb0c0 100644 --- a/pkg/deployment/reconcile/plan_builder.go +++ b/pkg/deployment/reconcile/plan_builder.go @@ -26,9 +26,9 @@ import ( goContext "context" "time" - "github.com/arangodb/kube-arangodb/pkg/util/errors" + inspectorInterface "github.com/arangodb/kube-arangodb/pkg/util/k8sutil/inspector" - "github.com/arangodb/kube-arangodb/pkg/deployment/resources/inspector" + "github.com/arangodb/kube-arangodb/pkg/util/errors" "golang.org/x/net/context" @@ -58,7 +58,7 @@ type upgradeDecision struct { // CreatePlan considers the current specification & status of the deployment creates a plan to // get the status in line with the specification. // If a plan already exists, nothing is done. -func (d *Reconciler) CreatePlan(ctx context.Context, cachedStatus inspector.Inspector) (error, bool) { +func (d *Reconciler) CreatePlan(ctx context.Context, cachedStatus inspectorInterface.Inspector) (error, bool) { // Create plan apiObject := d.context.GetAPIObject() spec := d.context.GetSpec() @@ -93,7 +93,7 @@ func (d *Reconciler) CreatePlan(ctx context.Context, cachedStatus inspector.Insp func fetchAgency(ctx context.Context, log zerolog.Logger, spec api.DeploymentSpec, status api.DeploymentStatus, - cache inspector.Inspector, context PlanBuilderContext) (*agency.ArangoPlanDatabases, error) { + cache inspectorInterface.Inspector, context PlanBuilderContext) (*agency.ArangoPlanDatabases, error) { if spec.GetMode() != api.DeploymentModeCluster && spec.GetMode() != api.DeploymentModeActiveFailover { return nil, nil } else if status.Members.Agents.MembersReady() > 0 { @@ -111,7 +111,7 @@ func fetchAgency(ctx context.Context, log zerolog.Logger, // Otherwise the new plan is returned with a boolean true. func createPlan(ctx context.Context, log zerolog.Logger, apiObject k8sutil.APIObject, currentPlan api.Plan, spec api.DeploymentSpec, - status api.DeploymentStatus, cachedStatus inspector.Inspector, + status api.DeploymentStatus, cachedStatus inspectorInterface.Inspector, builderCtx PlanBuilderContext) (api.Plan, bool) { if !currentPlan.IsEmpty() { // Plan already exists, complete that first @@ -311,22 +311,22 @@ func createRotateMemberPlan(log zerolog.Logger, member api.MemberStatus, type planBuilder func(ctx context.Context, log zerolog.Logger, apiObject k8sutil.APIObject, spec api.DeploymentSpec, status api.DeploymentStatus, - cachedStatus inspector.Inspector, context PlanBuilderContext) api.Plan + cachedStatus inspectorInterface.Inspector, context PlanBuilderContext) api.Plan type planBuilderCondition func(ctx context.Context, log zerolog.Logger, apiObject k8sutil.APIObject, spec api.DeploymentSpec, status api.DeploymentStatus, - cachedStatus inspector.Inspector, context PlanBuilderContext) bool + cachedStatus inspectorInterface.Inspector, context PlanBuilderContext) bool type planBuilderSubPlan func(ctx context.Context, log zerolog.Logger, apiObject k8sutil.APIObject, spec api.DeploymentSpec, status api.DeploymentStatus, - cachedStatus inspector.Inspector, context PlanBuilderContext, w WithPlanBuilder, plans ...planBuilder) api.Plan + cachedStatus inspectorInterface.Inspector, context PlanBuilderContext, w WithPlanBuilder, plans ...planBuilder) api.Plan func NewWithPlanBuilder(ctx context.Context, log zerolog.Logger, apiObject k8sutil.APIObject, spec api.DeploymentSpec, status api.DeploymentStatus, - cachedStatus inspector.Inspector, context PlanBuilderContext) WithPlanBuilder { + cachedStatus inspectorInterface.Inspector, context PlanBuilderContext) WithPlanBuilder { return &withPlanBuilder{ ctx: ctx, log: log, @@ -350,7 +350,7 @@ type withPlanBuilder struct { apiObject k8sutil.APIObject spec api.DeploymentSpec status api.DeploymentStatus - cachedStatus inspector.Inspector + cachedStatus inspectorInterface.Inspector context PlanBuilderContext } diff --git a/pkg/deployment/reconcile/plan_builder_bootstrap.go b/pkg/deployment/reconcile/plan_builder_bootstrap.go index 556d4e9e8..2a23680f8 100644 --- a/pkg/deployment/reconcile/plan_builder_bootstrap.go +++ b/pkg/deployment/reconcile/plan_builder_bootstrap.go @@ -28,15 +28,15 @@ import ( core "k8s.io/api/core/v1" api "github.com/arangodb/kube-arangodb/pkg/apis/deployment/v1" - "github.com/arangodb/kube-arangodb/pkg/deployment/resources/inspector" "github.com/arangodb/kube-arangodb/pkg/util/k8sutil" + inspectorInterface "github.com/arangodb/kube-arangodb/pkg/util/k8sutil/inspector" "github.com/rs/zerolog" ) func createBootstrapPlan(ctx context.Context, log zerolog.Logger, apiObject k8sutil.APIObject, spec api.DeploymentSpec, status api.DeploymentStatus, - cachedStatus inspector.Inspector, context PlanBuilderContext) api.Plan { + cachedStatus inspectorInterface.Inspector, context PlanBuilderContext) api.Plan { if !status.Conditions.IsTrue(api.ConditionTypeReady) { return nil diff --git a/pkg/deployment/reconcile/plan_builder_cluster.go b/pkg/deployment/reconcile/plan_builder_cluster.go index 291ae572d..44dfffdb0 100644 --- a/pkg/deployment/reconcile/plan_builder_cluster.go +++ b/pkg/deployment/reconcile/plan_builder_cluster.go @@ -29,8 +29,8 @@ import ( "github.com/arangodb/go-driver" api "github.com/arangodb/kube-arangodb/pkg/apis/deployment/v1" - "github.com/arangodb/kube-arangodb/pkg/deployment/resources/inspector" "github.com/arangodb/kube-arangodb/pkg/util/k8sutil" + inspectorInterface "github.com/arangodb/kube-arangodb/pkg/util/k8sutil/inspector" "github.com/rs/zerolog" ) @@ -39,7 +39,7 @@ const coordinatorHealthFailedTimeout time.Duration = time.Minute func createClusterOperationPlan(ctx context.Context, log zerolog.Logger, apiObject k8sutil.APIObject, spec api.DeploymentSpec, status api.DeploymentStatus, - cachedStatus inspector.Inspector, context PlanBuilderContext) api.Plan { + cachedStatus inspectorInterface.Inspector, context PlanBuilderContext) api.Plan { if spec.GetMode() != api.DeploymentModeCluster { return nil diff --git a/pkg/deployment/reconcile/plan_builder_common.go b/pkg/deployment/reconcile/plan_builder_common.go index 9c55f4bd2..b752ff1ce 100644 --- a/pkg/deployment/reconcile/plan_builder_common.go +++ b/pkg/deployment/reconcile/plan_builder_common.go @@ -28,15 +28,15 @@ import ( api "github.com/arangodb/kube-arangodb/pkg/apis/deployment/v1" "github.com/arangodb/kube-arangodb/pkg/deployment/agency" "github.com/arangodb/kube-arangodb/pkg/deployment/features" - "github.com/arangodb/kube-arangodb/pkg/deployment/resources/inspector" "github.com/arangodb/kube-arangodb/pkg/util/k8sutil" + inspectorInterface "github.com/arangodb/kube-arangodb/pkg/util/k8sutil/inspector" "github.com/rs/zerolog" ) func createMaintenanceManagementPlan(ctx context.Context, log zerolog.Logger, apiObject k8sutil.APIObject, spec api.DeploymentSpec, status api.DeploymentStatus, - cachedStatus inspector.Inspector, context PlanBuilderContext) api.Plan { + cachedStatus inspectorInterface.Inspector, context PlanBuilderContext) api.Plan { if spec.Mode.Get() == api.DeploymentModeSingle { return nil } diff --git a/pkg/deployment/reconcile/plan_builder_context.go b/pkg/deployment/reconcile/plan_builder_context.go index a2d832b97..fc13cc108 100644 --- a/pkg/deployment/reconcile/plan_builder_context.go +++ b/pkg/deployment/reconcile/plan_builder_context.go @@ -26,11 +26,10 @@ import ( "context" "github.com/arangodb/kube-arangodb/pkg/util/arangod/conn" + inspectorInterface "github.com/arangodb/kube-arangodb/pkg/util/k8sutil/inspector" "github.com/arangodb/go-driver/agency" - "github.com/arangodb/kube-arangodb/pkg/deployment/resources/inspector" - backupApi "github.com/arangodb/kube-arangodb/pkg/apis/backup/v1" "github.com/arangodb/go-driver" @@ -61,7 +60,7 @@ type PlanBuilderContext interface { // GetAgencyData object for key path GetAgencyData(ctx context.Context, i interface{}, keyParts ...string) error // Renders Pod definition for member - RenderPodForMember(cachedStatus inspector.Inspector, spec api.DeploymentSpec, status api.DeploymentStatus, memberID string, imageInfo api.ImageInfo) (*core.Pod, error) + RenderPodForMember(cachedStatus inspectorInterface.Inspector, spec api.DeploymentSpec, status api.DeploymentStatus, memberID string, imageInfo api.ImageInfo) (*core.Pod, error) // SelectImage select currently used image by pod SelectImage(spec api.DeploymentSpec, status api.DeploymentStatus) (api.ImageInfo, bool) // GetDatabaseClient returns a cached client for the entire database (cluster coordinators or single server), diff --git a/pkg/deployment/reconcile/plan_builder_encryption.go b/pkg/deployment/reconcile/plan_builder_encryption.go index 57be02cf1..00bffb0c8 100644 --- a/pkg/deployment/reconcile/plan_builder_encryption.go +++ b/pkg/deployment/reconcile/plan_builder_encryption.go @@ -30,8 +30,7 @@ import ( core "k8s.io/api/core/v1" "github.com/arangodb/kube-arangodb/pkg/util/k8sutil" - - "github.com/arangodb/kube-arangodb/pkg/deployment/resources/inspector" + inspectorInterface "github.com/arangodb/kube-arangodb/pkg/util/k8sutil/inspector" "github.com/arangodb/kube-arangodb/pkg/util" @@ -57,7 +56,7 @@ func skipEncryptionPlan(spec api.DeploymentSpec, status api.DeploymentStatus) bo func createEncryptionKeyStatusPropagatedFieldUpdate(ctx context.Context, log zerolog.Logger, apiObject k8sutil.APIObject, spec api.DeploymentSpec, status api.DeploymentStatus, - cachedStatus inspector.Inspector, context PlanBuilderContext, w WithPlanBuilder, builders ...planBuilder) api.Plan { + cachedStatus inspectorInterface.Inspector, context PlanBuilderContext, w WithPlanBuilder, builders ...planBuilder) api.Plan { if skipEncryptionPlan(spec, status) { return nil } @@ -94,7 +93,7 @@ func createEncryptionKeyStatusPropagatedFieldUpdate(ctx context.Context, func createEncryptionKey(ctx context.Context, log zerolog.Logger, apiObject k8sutil.APIObject, spec api.DeploymentSpec, status api.DeploymentStatus, - cachedStatus inspector.Inspector, context PlanBuilderContext) api.Plan { + cachedStatus inspectorInterface.Inspector, context PlanBuilderContext) api.Plan { if skipEncryptionPlan(spec, status) { return nil } @@ -148,7 +147,7 @@ func createEncryptionKey(ctx context.Context, func createEncryptionKeyStatusUpdate(ctx context.Context, log zerolog.Logger, apiObject k8sutil.APIObject, spec api.DeploymentSpec, status api.DeploymentStatus, - cachedStatus inspector.Inspector, context PlanBuilderContext) api.Plan { + cachedStatus inspectorInterface.Inspector, context PlanBuilderContext) api.Plan { if skipEncryptionPlan(spec, status) { return nil } @@ -164,7 +163,7 @@ func createEncryptionKeyStatusUpdate(ctx context.Context, func createEncryptionKeyStatusUpdateRequired(ctx context.Context, log zerolog.Logger, apiObject k8sutil.APIObject, spec api.DeploymentSpec, status api.DeploymentStatus, - cachedStatus inspector.Inspector, context PlanBuilderContext) bool { + cachedStatus inspectorInterface.Inspector, context PlanBuilderContext) bool { if skipEncryptionPlan(spec, status) { return false } @@ -187,7 +186,7 @@ func createEncryptionKeyStatusUpdateRequired(ctx context.Context, func createEncryptionKeyCleanPlan(ctx context.Context, log zerolog.Logger, apiObject k8sutil.APIObject, spec api.DeploymentSpec, status api.DeploymentStatus, - cachedStatus inspector.Inspector, context PlanBuilderContext) api.Plan { + cachedStatus inspectorInterface.Inspector, context PlanBuilderContext) api.Plan { if skipEncryptionPlan(spec, status) { return nil } @@ -243,7 +242,7 @@ func createEncryptionKeyCleanPlan(ctx context.Context, func areEncryptionKeysUpToDate(ctx context.Context, log zerolog.Logger, apiObject k8sutil.APIObject, spec api.DeploymentSpec, status api.DeploymentStatus, - cachedStatus inspector.Inspector, context PlanBuilderContext, + cachedStatus inspectorInterface.Inspector, context PlanBuilderContext, folder *core.Secret) (plan api.Plan, failed bool) { status.Members.ForeachServerGroup(func(group api.ServerGroup, list api.MemberStatusList) error { @@ -270,7 +269,7 @@ func areEncryptionKeysUpToDate(ctx context.Context, func isEncryptionKeyUpToDate(ctx context.Context, log zerolog.Logger, apiObject k8sutil.APIObject, spec api.DeploymentSpec, status api.DeploymentStatus, - cachedStatus inspector.Inspector, context PlanBuilderContext, + cachedStatus inspectorInterface.Inspector, context PlanBuilderContext, group api.ServerGroup, m api.MemberStatus, folder *core.Secret) (updateRequired bool, failed bool) { if m.Phase != api.MemberPhaseCreated { diff --git a/pkg/deployment/reconcile/plan_builder_jwt.go b/pkg/deployment/reconcile/plan_builder_jwt.go index 689b05e14..e82339ad8 100644 --- a/pkg/deployment/reconcile/plan_builder_jwt.go +++ b/pkg/deployment/reconcile/plan_builder_jwt.go @@ -29,6 +29,7 @@ import ( "time" "github.com/arangodb/kube-arangodb/pkg/util/errors" + inspectorInterface "github.com/arangodb/kube-arangodb/pkg/util/k8sutil/inspector" "github.com/arangodb/kube-arangodb/pkg/deployment/features" @@ -39,7 +40,6 @@ import ( api "github.com/arangodb/kube-arangodb/pkg/apis/deployment/v1" "github.com/arangodb/kube-arangodb/pkg/deployment/pod" - "github.com/arangodb/kube-arangodb/pkg/deployment/resources/inspector" "github.com/arangodb/kube-arangodb/pkg/util" "github.com/arangodb/kube-arangodb/pkg/util/constants" "github.com/arangodb/kube-arangodb/pkg/util/k8sutil" @@ -49,7 +49,7 @@ import ( func createJWTKeyUpdate(ctx context.Context, log zerolog.Logger, apiObject k8sutil.APIObject, spec api.DeploymentSpec, status api.DeploymentStatus, - cachedStatus inspector.Inspector, context PlanBuilderContext) api.Plan { + cachedStatus inspectorInterface.Inspector, context PlanBuilderContext) api.Plan { if folder, err := ensureJWTFolderSupport(spec, status); err != nil || !folder { return nil } @@ -120,7 +120,7 @@ func createJWTKeyUpdate(ctx context.Context, func createJWTStatusUpdate(ctx context.Context, log zerolog.Logger, apiObject k8sutil.APIObject, spec api.DeploymentSpec, status api.DeploymentStatus, - cachedStatus inspector.Inspector, context PlanBuilderContext) api.Plan { + cachedStatus inspectorInterface.Inspector, context PlanBuilderContext) api.Plan { if _, err := ensureJWTFolderSupport(spec, status); err != nil { return nil } @@ -135,7 +135,7 @@ func createJWTStatusUpdate(ctx context.Context, func createJWTStatusUpdateRequired(ctx context.Context, log zerolog.Logger, apiObject k8sutil.APIObject, spec api.DeploymentSpec, status api.DeploymentStatus, - cachedStatus inspector.Inspector, context PlanBuilderContext) bool { + cachedStatus inspectorInterface.Inspector, context PlanBuilderContext) bool { folder, err := ensureJWTFolderSupport(spec, status) if err != nil { log.Error().Err(err).Msgf("Action not supported") @@ -221,7 +221,7 @@ func createJWTStatusUpdateRequired(ctx context.Context, func areJWTTokensUpToDate(ctx context.Context, log zerolog.Logger, apiObject k8sutil.APIObject, spec api.DeploymentSpec, status api.DeploymentStatus, - cachedStatus inspector.Inspector, planCtx PlanBuilderContext, + cachedStatus inspectorInterface.Inspector, planCtx PlanBuilderContext, folder *core.Secret) (plan api.Plan, failed bool) { gCtx, c := context.WithTimeout(ctx, 2*time.Second) defer c() @@ -248,7 +248,7 @@ func areJWTTokensUpToDate(ctx context.Context, func isJWTTokenUpToDate(ctx context.Context, log zerolog.Logger, apiObject k8sutil.APIObject, spec api.DeploymentSpec, status api.DeploymentStatus, - cachedStatus inspector.Inspector, context PlanBuilderContext, + cachedStatus inspectorInterface.Inspector, context PlanBuilderContext, group api.ServerGroup, m api.MemberStatus, folder *core.Secret) (updateRequired bool, failed bool) { if m.Phase != api.MemberPhaseCreated { diff --git a/pkg/deployment/reconcile/plan_builder_restore.go b/pkg/deployment/reconcile/plan_builder_restore.go index 5dd367828..bce1d0c60 100644 --- a/pkg/deployment/reconcile/plan_builder_restore.go +++ b/pkg/deployment/reconcile/plan_builder_restore.go @@ -27,8 +27,8 @@ import ( "github.com/arangodb/kube-arangodb/pkg/deployment/features" - "github.com/arangodb/kube-arangodb/pkg/deployment/resources/inspector" "github.com/arangodb/kube-arangodb/pkg/util/k8sutil" + inspectorInterface "github.com/arangodb/kube-arangodb/pkg/util/k8sutil/inspector" backupv1 "github.com/arangodb/kube-arangodb/pkg/apis/backup/v1" api "github.com/arangodb/kube-arangodb/pkg/apis/deployment/v1" @@ -41,7 +41,7 @@ const secretActionParam = "secret" func createRestorePlan(ctx context.Context, log zerolog.Logger, apiObject k8sutil.APIObject, spec api.DeploymentSpec, status api.DeploymentStatus, - cachedStatus inspector.Inspector, context PlanBuilderContext) api.Plan { + cachedStatus inspectorInterface.Inspector, context PlanBuilderContext) api.Plan { if spec.RestoreFrom == nil && status.Restore != nil { return api.Plan{ api.NewAction(api.ActionTypeBackupRestoreClean, api.ServerGroupUnknown, ""), diff --git a/pkg/deployment/reconcile/plan_builder_rotate_upgrade.go b/pkg/deployment/reconcile/plan_builder_rotate_upgrade.go index 36e503f29..7c49765e5 100644 --- a/pkg/deployment/reconcile/plan_builder_rotate_upgrade.go +++ b/pkg/deployment/reconcile/plan_builder_rotate_upgrade.go @@ -31,9 +31,9 @@ import ( upgraderules "github.com/arangodb/go-upgrade-rules" "github.com/arangodb/kube-arangodb/pkg/apis/deployment" api "github.com/arangodb/kube-arangodb/pkg/apis/deployment/v1" - "github.com/arangodb/kube-arangodb/pkg/deployment/resources/inspector" "github.com/arangodb/kube-arangodb/pkg/util" "github.com/arangodb/kube-arangodb/pkg/util/k8sutil" + inspectorInterface "github.com/arangodb/kube-arangodb/pkg/util/k8sutil/inspector" "github.com/rs/zerolog" core "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -55,7 +55,7 @@ var ( func createRotateOrUpgradePlan(ctx context.Context, log zerolog.Logger, apiObject k8sutil.APIObject, spec api.DeploymentSpec, status api.DeploymentStatus, - cachedStatus inspector.Inspector, context PlanBuilderContext) api.Plan { + cachedStatus inspectorInterface.Inspector, context PlanBuilderContext) api.Plan { var plan api.Plan newPlan, idle := createRotateOrUpgradePlanInternal(log, apiObject, spec, status, cachedStatus, context) @@ -69,7 +69,7 @@ func createRotateOrUpgradePlan(ctx context.Context, } func createRotateOrUpgradePlanInternal(log zerolog.Logger, apiObject k8sutil.APIObject, spec api.DeploymentSpec, - status api.DeploymentStatus, cachedStatus inspector.Inspector, context PlanBuilderContext) (api.Plan, bool) { + status api.DeploymentStatus, cachedStatus inspectorInterface.Inspector, context PlanBuilderContext) (api.Plan, bool) { var newPlan api.Plan var upgradeNotAllowed bool @@ -285,7 +285,7 @@ func memberImageInfo(spec api.DeploymentSpec, status api.MemberStatus, images ap // When true is returned, a reason for the rotation is already returned. func podNeedsRotation(log zerolog.Logger, p *core.Pod, apiObject metav1.Object, spec api.DeploymentSpec, group api.ServerGroup, status api.DeploymentStatus, m api.MemberStatus, - cachedStatus inspector.Inspector, context PlanBuilderContext) (bool, string) { + cachedStatus inspectorInterface.Inspector, context PlanBuilderContext) (bool, string) { if m.PodUID != p.UID { return true, "Pod UID does not match, this pod is not managed by Operator. Recreating" } diff --git a/pkg/deployment/reconcile/plan_builder_scale.go b/pkg/deployment/reconcile/plan_builder_scale.go index 14f789e94..99a5505fa 100644 --- a/pkg/deployment/reconcile/plan_builder_scale.go +++ b/pkg/deployment/reconcile/plan_builder_scale.go @@ -26,15 +26,15 @@ import ( "context" api "github.com/arangodb/kube-arangodb/pkg/apis/deployment/v1" - "github.com/arangodb/kube-arangodb/pkg/deployment/resources/inspector" "github.com/arangodb/kube-arangodb/pkg/util/k8sutil" + inspectorInterface "github.com/arangodb/kube-arangodb/pkg/util/k8sutil/inspector" "github.com/rs/zerolog" ) func createScaleMemberPlan(ctx context.Context, log zerolog.Logger, apiObject k8sutil.APIObject, spec api.DeploymentSpec, status api.DeploymentStatus, - cachedStatus inspector.Inspector, context PlanBuilderContext) api.Plan { + cachedStatus inspectorInterface.Inspector, context PlanBuilderContext) api.Plan { var plan api.Plan @@ -106,7 +106,7 @@ func createScalePlan(log zerolog.Logger, members api.MemberStatusList, group api func createReplaceMemberPlan(ctx context.Context, log zerolog.Logger, apiObject k8sutil.APIObject, spec api.DeploymentSpec, status api.DeploymentStatus, - cachedStatus inspector.Inspector, context PlanBuilderContext) api.Plan { + cachedStatus inspectorInterface.Inspector, context PlanBuilderContext) api.Plan { var plan api.Plan diff --git a/pkg/deployment/reconcile/plan_builder_storage.go b/pkg/deployment/reconcile/plan_builder_storage.go index 7e454e42f..16af5e3dd 100644 --- a/pkg/deployment/reconcile/plan_builder_storage.go +++ b/pkg/deployment/reconcile/plan_builder_storage.go @@ -25,13 +25,13 @@ package reconcile import ( "context" - "github.com/arangodb/kube-arangodb/pkg/deployment/resources/inspector" "github.com/rs/zerolog" core "k8s.io/api/core/v1" api "github.com/arangodb/kube-arangodb/pkg/apis/deployment/v1" "github.com/arangodb/kube-arangodb/pkg/util" "github.com/arangodb/kube-arangodb/pkg/util/k8sutil" + inspectorInterface "github.com/arangodb/kube-arangodb/pkg/util/k8sutil/inspector" ) // createRotateServerStoragePlan creates plan to rotate a server and its volume because of a @@ -39,7 +39,7 @@ import ( func createRotateServerStoragePlan(ctx context.Context, log zerolog.Logger, apiObject k8sutil.APIObject, spec api.DeploymentSpec, status api.DeploymentStatus, - cachedStatus inspector.Inspector, context PlanBuilderContext) api.Plan { + cachedStatus inspectorInterface.Inspector, context PlanBuilderContext) api.Plan { if spec.GetMode() == api.DeploymentModeSingle { // Storage cannot be changed in single server deployments return nil diff --git a/pkg/deployment/reconcile/plan_builder_test.go b/pkg/deployment/reconcile/plan_builder_test.go index d4194c420..f85b22026 100644 --- a/pkg/deployment/reconcile/plan_builder_test.go +++ b/pkg/deployment/reconcile/plan_builder_test.go @@ -29,6 +29,7 @@ import ( "testing" "github.com/arangodb/kube-arangodb/pkg/util/errors" + inspectorInterface "github.com/arangodb/kube-arangodb/pkg/util/k8sutil/inspector" "github.com/arangodb/kube-arangodb/pkg/util/arangod/conn" @@ -72,7 +73,7 @@ func (c *testContext) GetAuthentication() conn.Auth { } } -func (c *testContext) RenderPodForMember(cachedStatus inspector.Inspector, spec api.DeploymentSpec, status api.DeploymentStatus, memberID string, imageInfo api.ImageInfo) (*core.Pod, error) { +func (c *testContext) RenderPodForMember(cachedStatus inspectorInterface.Inspector, spec api.DeploymentSpec, status api.DeploymentStatus, memberID string, imageInfo api.ImageInfo) (*core.Pod, error) { panic("implement me") } @@ -559,6 +560,7 @@ func TestCreatePlan(t *testing.T) { ServiceAccounts map[string]*core.ServiceAccount PDBS map[string]*policy.PodDisruptionBudget ServiceMonitors map[string]*monitoring.ServiceMonitor + ArangoMembers map[string]*api.ArangoMember }{ { Name: "Can not create plan for single deployment", @@ -820,7 +822,7 @@ func TestCreatePlan(t *testing.T) { if testCase.Helper != nil { testCase.Helper(testCase.context.ArangoDeployment) } - err, _ := r.CreatePlan(ctx, inspector.NewInspectorFromData(testCase.Pods, testCase.Secrets, testCase.PVCS, testCase.Services, testCase.ServiceAccounts, testCase.PDBS, testCase.ServiceMonitors)) + err, _ := r.CreatePlan(ctx, inspector.NewInspectorFromData(testCase.Pods, testCase.Secrets, testCase.PVCS, testCase.Services, testCase.ServiceAccounts, testCase.PDBS, testCase.ServiceMonitors, testCase.ArangoMembers)) // Assert if testCase.ExpectedEvent != nil { diff --git a/pkg/deployment/reconcile/plan_builder_tls.go b/pkg/deployment/reconcile/plan_builder_tls.go index 2a94dbd59..2aa2303f7 100644 --- a/pkg/deployment/reconcile/plan_builder_tls.go +++ b/pkg/deployment/reconcile/plan_builder_tls.go @@ -38,10 +38,10 @@ import ( "github.com/arangodb/kube-arangodb/pkg/deployment/client" "github.com/arangodb/kube-arangodb/pkg/util/constants" + inspectorInterface "github.com/arangodb/kube-arangodb/pkg/util/k8sutil/inspector" api "github.com/arangodb/kube-arangodb/pkg/apis/deployment/v1" "github.com/arangodb/kube-arangodb/pkg/deployment/resources" - "github.com/arangodb/kube-arangodb/pkg/deployment/resources/inspector" "github.com/arangodb/kube-arangodb/pkg/util" "github.com/arangodb/kube-arangodb/pkg/util/k8sutil" "github.com/rs/zerolog" @@ -52,7 +52,7 @@ const CertificateRenewalMargin = 7 * 24 * time.Hour func createTLSStatusPropagatedFieldUpdate(ctx context.Context, log zerolog.Logger, apiObject k8sutil.APIObject, spec api.DeploymentSpec, status api.DeploymentStatus, - cachedStatus inspector.Inspector, context PlanBuilderContext, w WithPlanBuilder, builders ...planBuilder) api.Plan { + cachedStatus inspectorInterface.Inspector, context PlanBuilderContext, w WithPlanBuilder, builders ...planBuilder) api.Plan { if !spec.TLS.IsSecure() { return nil } @@ -86,7 +86,7 @@ func createTLSStatusPropagatedFieldUpdate(ctx context.Context, func createTLSStatusUpdate(ctx context.Context, log zerolog.Logger, apiObject k8sutil.APIObject, spec api.DeploymentSpec, status api.DeploymentStatus, - cachedStatus inspector.Inspector, context PlanBuilderContext) api.Plan { + cachedStatus inspectorInterface.Inspector, context PlanBuilderContext) api.Plan { if !spec.TLS.IsSecure() { return nil } @@ -102,7 +102,7 @@ func createTLSStatusUpdate(ctx context.Context, func createTLSStatusPropagated(ctx context.Context, log zerolog.Logger, apiObject k8sutil.APIObject, spec api.DeploymentSpec, status api.DeploymentStatus, - cachedStatus inspector.Inspector, context PlanBuilderContext) api.Plan { + cachedStatus inspectorInterface.Inspector, context PlanBuilderContext) api.Plan { if !spec.TLS.IsSecure() { return nil } @@ -119,7 +119,7 @@ func createTLSStatusPropagated(ctx context.Context, func createTLSStatusUpdateRequired(ctx context.Context, log zerolog.Logger, apiObject k8sutil.APIObject, spec api.DeploymentSpec, status api.DeploymentStatus, - cachedStatus inspector.Inspector, context PlanBuilderContext) bool { + cachedStatus inspectorInterface.Inspector, context PlanBuilderContext) bool { if !spec.TLS.IsSecure() { return false } @@ -157,7 +157,7 @@ func createTLSStatusUpdateRequired(ctx context.Context, func createCAAppendPlan(ctx context.Context, log zerolog.Logger, apiObject k8sutil.APIObject, spec api.DeploymentSpec, status api.DeploymentStatus, - cachedStatus inspector.Inspector, context PlanBuilderContext) api.Plan { + cachedStatus inspectorInterface.Inspector, context PlanBuilderContext) api.Plan { if !spec.TLS.IsSecure() { return nil } @@ -205,7 +205,7 @@ func createCAAppendPlan(ctx context.Context, func createCARenewalPlan(ctx context.Context, log zerolog.Logger, apiObject k8sutil.APIObject, spec api.DeploymentSpec, status api.DeploymentStatus, - cachedStatus inspector.Inspector, context PlanBuilderContext) api.Plan { + cachedStatus inspectorInterface.Inspector, context PlanBuilderContext) api.Plan { if !spec.TLS.IsSecure() { return nil } @@ -241,7 +241,7 @@ func createCARenewalPlan(ctx context.Context, func createCACleanPlan(ctx context.Context, log zerolog.Logger, apiObject k8sutil.APIObject, spec api.DeploymentSpec, status api.DeploymentStatus, - cachedStatus inspector.Inspector, context PlanBuilderContext) api.Plan { + cachedStatus inspectorInterface.Inspector, context PlanBuilderContext) api.Plan { if !spec.TLS.IsSecure() { return nil } @@ -290,7 +290,7 @@ func createCACleanPlan(ctx context.Context, func createKeyfileRenewalPlanDefault(ctx context.Context, log zerolog.Logger, apiObject k8sutil.APIObject, spec api.DeploymentSpec, status api.DeploymentStatus, - cachedStatus inspector.Inspector, planCtx PlanBuilderContext) api.Plan { + cachedStatus inspectorInterface.Inspector, planCtx PlanBuilderContext) api.Plan { if !spec.TLS.IsSecure() { return nil } @@ -328,7 +328,7 @@ func createKeyfileRenewalPlanDefault(ctx context.Context, func createKeyfileRenewalPlanInPlace(ctx context.Context, log zerolog.Logger, apiObject k8sutil.APIObject, spec api.DeploymentSpec, status api.DeploymentStatus, - cachedStatus inspector.Inspector, planCtx PlanBuilderContext) api.Plan { + cachedStatus inspectorInterface.Inspector, planCtx PlanBuilderContext) api.Plan { if !spec.TLS.IsSecure() { return nil } @@ -362,7 +362,7 @@ func createKeyfileRenewalPlanInPlace(ctx context.Context, func createKeyfileRenewalPlan(ctx context.Context, log zerolog.Logger, apiObject k8sutil.APIObject, spec api.DeploymentSpec, status api.DeploymentStatus, - cachedStatus inspector.Inspector, planCtx PlanBuilderContext) api.Plan { + cachedStatus inspectorInterface.Inspector, planCtx PlanBuilderContext) api.Plan { if !spec.TLS.IsSecure() { return nil } @@ -449,7 +449,7 @@ func checkServerValidCertRequest(ctx context.Context, context PlanBuilderContext func keyfileRenewalRequired(ctx context.Context, log zerolog.Logger, apiObject k8sutil.APIObject, spec api.DeploymentSpec, status api.DeploymentStatus, - cachedStatus inspector.Inspector, context PlanBuilderContext, + cachedStatus inspectorInterface.Inspector, context PlanBuilderContext, group api.ServerGroup, member api.MemberStatus, mode api.TLSRotateMode) (bool, bool) { if !spec.TLS.IsSecure() { return false, false diff --git a/pkg/deployment/reconcile/plan_builder_tls_sni.go b/pkg/deployment/reconcile/plan_builder_tls_sni.go index 3ce48f8dd..4aaff3f59 100644 --- a/pkg/deployment/reconcile/plan_builder_tls_sni.go +++ b/pkg/deployment/reconcile/plan_builder_tls_sni.go @@ -28,8 +28,7 @@ import ( "github.com/arangodb/kube-arangodb/pkg/deployment/features" "github.com/arangodb/kube-arangodb/pkg/util/k8sutil" - - "github.com/arangodb/kube-arangodb/pkg/deployment/resources/inspector" + inspectorInterface "github.com/arangodb/kube-arangodb/pkg/util/k8sutil/inspector" "github.com/arangodb/kube-arangodb/pkg/deployment/pod" @@ -40,7 +39,7 @@ import ( func createRotateTLSServerSNIPlan(ctx context.Context, log zerolog.Logger, apiObject k8sutil.APIObject, spec api.DeploymentSpec, status api.DeploymentStatus, - cachedStatus inspector.Inspector, context PlanBuilderContext) api.Plan { + cachedStatus inspectorInterface.Inspector, context PlanBuilderContext) api.Plan { if !spec.TLS.IsSecure() { return nil } diff --git a/pkg/deployment/reconcile/plan_executor.go b/pkg/deployment/reconcile/plan_executor.go index 038f213c7..5d4d33e58 100644 --- a/pkg/deployment/reconcile/plan_executor.go +++ b/pkg/deployment/reconcile/plan_executor.go @@ -28,8 +28,7 @@ import ( "time" "github.com/arangodb/kube-arangodb/pkg/util/errors" - - "github.com/arangodb/kube-arangodb/pkg/deployment/resources/inspector" + inspectorInterface "github.com/arangodb/kube-arangodb/pkg/util/k8sutil/inspector" "github.com/rs/zerolog" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -41,7 +40,7 @@ import ( // ExecutePlan tries to execute the plan as far as possible. // Returns true when it has to be called again soon. // False otherwise. -func (d *Reconciler) ExecutePlan(ctx context.Context, cachedStatus inspector.Inspector) (bool, error) { +func (d *Reconciler) ExecutePlan(ctx context.Context, cachedStatus inspectorInterface.Inspector) (bool, error) { log := d.log firstLoop := true @@ -165,7 +164,7 @@ func (d *Reconciler) ExecutePlan(ctx context.Context, cachedStatus inspector.Ins } // createAction create action object based on action type -func (d *Reconciler) createAction(ctx context.Context, log zerolog.Logger, action api.Action, cachedStatus inspector.Inspector) Action { +func (d *Reconciler) createAction(ctx context.Context, log zerolog.Logger, action api.Action, cachedStatus inspectorInterface.Inspector) Action { actionCtx := newActionContext(log.With().Str("id", action.ID).Str("type", action.Type.String()).Logger(), d.context, cachedStatus) f, ok := getActionFactory(action.Type) diff --git a/pkg/deployment/resources/annotations.go b/pkg/deployment/resources/annotations.go index f0ee20880..d8f5e967c 100644 --- a/pkg/deployment/resources/annotations.go +++ b/pkg/deployment/resources/annotations.go @@ -25,12 +25,11 @@ package resources import ( "github.com/arangodb/kube-arangodb/pkg/deployment/patch" "github.com/arangodb/kube-arangodb/pkg/util/collection" + inspectorInterface "github.com/arangodb/kube-arangodb/pkg/util/k8sutil/inspector" monitoring "github.com/coreos/prometheus-operator/pkg/apis/monitoring/v1" monitoringTypedClient "github.com/coreos/prometheus-operator/pkg/client/versioned/typed/monitoring/v1" "k8s.io/apimachinery/pkg/types" - "github.com/arangodb/kube-arangodb/pkg/deployment/resources/inspector" - "github.com/arangodb/kube-arangodb/pkg/apis/deployment" api "github.com/arangodb/kube-arangodb/pkg/apis/deployment/v1" "github.com/arangodb/kube-arangodb/pkg/util/k8sutil" @@ -42,7 +41,7 @@ import ( policyTyped "k8s.io/client-go/kubernetes/typed/policy/v1beta1" ) -func (r *Resources) EnsureAnnotations(cachedStatus inspector.Inspector) error { +func (r *Resources) EnsureAnnotations(cachedStatus inspectorInterface.Inspector) error { kubecli := r.context.GetKubeCli() monitoringcli := r.context.GetMonitoringV1Cli() @@ -115,7 +114,7 @@ func (r *Resources) EnsureAnnotations(cachedStatus inspector.Inspector) error { return nil } -func ensureSecretsAnnotations(client typedCore.SecretInterface, cachedStatus inspector.Inspector, kind, name, namespace string, spec api.DeploymentSpec) error { +func ensureSecretsAnnotations(client typedCore.SecretInterface, cachedStatus inspectorInterface.Inspector, kind, name, namespace string, spec api.DeploymentSpec) error { if err := cachedStatus.IterateSecrets(func(secret *core.Secret) error { ensureAnnotationsMap(secret.Kind, secret, spec, func(name string, d []byte) error { _, err := client.Patch(name, types.JSONPatchType, d) @@ -131,7 +130,7 @@ func ensureSecretsAnnotations(client typedCore.SecretInterface, cachedStatus ins return nil } -func ensureServiceAccountsAnnotations(client typedCore.ServiceAccountInterface, cachedStatus inspector.Inspector, kind, name, namespace string, spec api.DeploymentSpec) error { +func ensureServiceAccountsAnnotations(client typedCore.ServiceAccountInterface, cachedStatus inspectorInterface.Inspector, kind, name, namespace string, spec api.DeploymentSpec) error { if err := cachedStatus.IterateServiceAccounts(func(serviceAccount *core.ServiceAccount) error { ensureAnnotationsMap(serviceAccount.Kind, serviceAccount, spec, func(name string, d []byte) error { _, err := client.Patch(name, types.JSONPatchType, d) @@ -147,7 +146,7 @@ func ensureServiceAccountsAnnotations(client typedCore.ServiceAccountInterface, return nil } -func ensureServicesAnnotations(client typedCore.ServiceInterface, cachedStatus inspector.Inspector, kind, name, namespace string, spec api.DeploymentSpec) error { +func ensureServicesAnnotations(client typedCore.ServiceInterface, cachedStatus inspectorInterface.Inspector, kind, name, namespace string, spec api.DeploymentSpec) error { if err := cachedStatus.IterateServices(func(service *core.Service) error { ensureAnnotationsMap(service.Kind, service, spec, func(name string, d []byte) error { _, err := client.Patch(name, types.JSONPatchType, d) @@ -163,7 +162,7 @@ func ensureServicesAnnotations(client typedCore.ServiceInterface, cachedStatus i return nil } -func ensurePdbsAnnotations(client policyTyped.PodDisruptionBudgetInterface, cachedStatus inspector.Inspector, kind, name, namespace string, spec api.DeploymentSpec) error { +func ensurePdbsAnnotations(client policyTyped.PodDisruptionBudgetInterface, cachedStatus inspectorInterface.Inspector, kind, name, namespace string, spec api.DeploymentSpec) error { if err := cachedStatus.IteratePodDisruptionBudgets(func(podDisruptionBudget *policy.PodDisruptionBudget) error { ensureAnnotationsMap(podDisruptionBudget.Kind, podDisruptionBudget, spec, func(name string, d []byte) error { _, err := client.Patch(name, types.JSONPatchType, d) @@ -179,7 +178,7 @@ func ensurePdbsAnnotations(client policyTyped.PodDisruptionBudgetInterface, cach return nil } -func ensurePvcsAnnotations(client typedCore.PersistentVolumeClaimInterface, cachedStatus inspector.Inspector, kind, name, namespace string, spec api.DeploymentSpec) error { +func ensurePvcsAnnotations(client typedCore.PersistentVolumeClaimInterface, cachedStatus inspectorInterface.Inspector, kind, name, namespace string, spec api.DeploymentSpec) error { if err := cachedStatus.IteratePersistentVolumeClaims(func(persistentVolumeClaim *core.PersistentVolumeClaim) error { ensureGroupAnnotationsMap(persistentVolumeClaim.Kind, persistentVolumeClaim, spec, func(name string, d []byte) error { _, err := client.Patch(name, types.JSONPatchType, d) @@ -195,7 +194,7 @@ func ensurePvcsAnnotations(client typedCore.PersistentVolumeClaimInterface, cach return nil } -func ensureServiceMonitorsAnnotations(client monitoringTypedClient.ServiceMonitorInterface, cachedStatus inspector.Inspector, kind, name, namespace string, spec api.DeploymentSpec) error { +func ensureServiceMonitorsAnnotations(client monitoringTypedClient.ServiceMonitorInterface, cachedStatus inspectorInterface.Inspector, kind, name, namespace string, spec api.DeploymentSpec) error { if err := cachedStatus.IterateServiceMonitors(func(serviceMonitor *monitoring.ServiceMonitor) error { ensureAnnotationsMap(serviceMonitor.Kind, serviceMonitor, spec, func(name string, d []byte) error { _, err := client.Patch(name, types.JSONPatchType, d) @@ -225,7 +224,7 @@ func getObjectGroup(obj meta.Object) api.ServerGroup { return api.ServerGroupFromRole(group) } -func ensurePodsAnnotations(client typedCore.PodInterface, cachedStatus inspector.Inspector, kind, name, namespace string, annotations map[string]string, spec api.DeploymentSpec) error { +func ensurePodsAnnotations(client typedCore.PodInterface, cachedStatus inspectorInterface.Inspector, kind, name, namespace string, annotations map[string]string, spec api.DeploymentSpec) error { if err := cachedStatus.IteratePods(func(pod *core.Pod) error { ensureGroupAnnotationsMap(pod.Kind, pod, spec, func(name string, d []byte) error { _, err := client.Patch(name, types.JSONPatchType, d) diff --git a/pkg/deployment/resources/certicicates.go b/pkg/deployment/resources/certicicates.go index 8281af367..bf0adedf2 100644 --- a/pkg/deployment/resources/certicicates.go +++ b/pkg/deployment/resources/certicicates.go @@ -28,10 +28,10 @@ import ( "encoding/pem" "github.com/arangodb/kube-arangodb/pkg/util/errors" + inspectorInterface "github.com/arangodb/kube-arangodb/pkg/util/k8sutil/inspector" "github.com/arangodb-helper/go-certificates" api "github.com/arangodb/kube-arangodb/pkg/apis/deployment/v1" - "github.com/arangodb/kube-arangodb/pkg/deployment/resources/inspector" "github.com/rs/zerolog" core "k8s.io/api/core/v1" @@ -118,7 +118,7 @@ func GetCertsFromSecret(log zerolog.Logger, secret *core.Secret) Certificates { return GetCertsFromData(log, caPem) } -func GetKeyCertFromCache(log zerolog.Logger, cachedStatus inspector.Inspector, spec api.DeploymentSpec, certName, keyName string) (Certificates, interface{}, error) { +func GetKeyCertFromCache(log zerolog.Logger, cachedStatus inspectorInterface.Inspector, spec api.DeploymentSpec, certName, keyName string) (Certificates, interface{}, error) { caSecret, exists := cachedStatus.Secret(spec.TLS.GetCASecretName()) if !exists { return nil, nil, errors.Newf("CA Secret does not exists") diff --git a/pkg/deployment/resources/context.go b/pkg/deployment/resources/context.go index 5cc98dbd0..2c5672ecb 100644 --- a/pkg/deployment/resources/context.go +++ b/pkg/deployment/resources/context.go @@ -25,7 +25,7 @@ package resources import ( "context" - "github.com/arangodb/kube-arangodb/pkg/deployment/resources/inspector" + "github.com/arangodb/kube-arangodb/pkg/generated/clientset/versioned" "github.com/arangodb/kube-arangodb/pkg/operator/scope" @@ -37,6 +37,7 @@ import ( "github.com/arangodb/go-driver/agency" api "github.com/arangodb/kube-arangodb/pkg/apis/deployment/v1" "github.com/arangodb/kube-arangodb/pkg/util/k8sutil" + inspectorInterface "github.com/arangodb/kube-arangodb/pkg/util/k8sutil/inspector" v1 "k8s.io/api/core/v1" "k8s.io/client-go/kubernetes" ) @@ -69,6 +70,8 @@ type Context interface { GetKubeCli() kubernetes.Interface // GetMonitoringV1Cli returns monitoring client GetMonitoringV1Cli() monitoringClient.MonitoringV1Interface + // GetArangoCli returns the Arango CRD client + GetArangoCli() versioned.Interface // GetLifecycleImage returns the image name containing the lifecycle helper (== name of operator image) GetLifecycleImage() string // GetOperatorUUIDImage returns the image name containing the uuid helper (== name of operator image) @@ -106,6 +109,6 @@ type Context interface { GetBackup(backup string) (*backupApi.ArangoBackup, error) GetScope() scope.Scope - GetCachedStatus() inspector.Inspector - SetCachedStatus(i inspector.Inspector) + GetCachedStatus() inspectorInterface.Inspector + SetCachedStatus(i inspectorInterface.Inspector) } diff --git a/pkg/deployment/resources/inspector/inspector.go b/pkg/deployment/resources/inspector/inspector.go index 7e9601a53..da6af6b28 100644 --- a/pkg/deployment/resources/inspector/inspector.go +++ b/pkg/deployment/resources/inspector/inspector.go @@ -25,7 +25,9 @@ package inspector import ( "sync" - meta "k8s.io/apimachinery/pkg/apis/meta/v1" + api "github.com/arangodb/kube-arangodb/pkg/apis/deployment/v1" + "github.com/arangodb/kube-arangodb/pkg/generated/clientset/versioned" + inspectorInterface "github.com/arangodb/kube-arangodb/pkg/util/k8sutil/inspector" monitoring "github.com/coreos/prometheus-operator/pkg/apis/monitoring/v1" monitoringClient "github.com/coreos/prometheus-operator/pkg/client/versioned/typed/monitoring/v1" @@ -35,12 +37,7 @@ import ( "k8s.io/client-go/kubernetes" ) -// SecretReadInterface has methods to work with Secret resources with ReadOnly mode. -type SecretReadInterface interface { - Get(name string, options meta.GetOptions) (*core.Secret, error) -} - -func NewInspector(k kubernetes.Interface, m monitoringClient.MonitoringV1Interface, namespace string) (Inspector, error) { +func NewInspector(k kubernetes.Interface, m monitoringClient.MonitoringV1Interface, c versioned.Interface, namespace string) (inspectorInterface.Inspector, error) { pods, err := podsToMap(k, namespace) if err != nil { return nil, err @@ -76,11 +73,16 @@ func NewInspector(k kubernetes.Interface, m monitoringClient.MonitoringV1Interfa return nil, err } - return NewInspectorFromData(pods, secrets, pvcs, services, serviceAccounts, podDisruptionBudgets, serviceMonitors), nil + arangoMembers, err := arangoMembersToMap(c, namespace) + if err != nil { + return nil, err + } + + return NewInspectorFromData(pods, secrets, pvcs, services, serviceAccounts, podDisruptionBudgets, serviceMonitors, arangoMembers), nil } -func NewEmptyInspector() Inspector { - return NewInspectorFromData(nil, nil, nil, nil, nil, nil, nil) +func NewEmptyInspector() inspectorInterface.Inspector { + return NewInspectorFromData(nil, nil, nil, nil, nil, nil, nil, nil) } func NewInspectorFromData(pods map[string]*core.Pod, @@ -89,7 +91,8 @@ func NewInspectorFromData(pods map[string]*core.Pod, services map[string]*core.Service, serviceAccounts map[string]*core.ServiceAccount, podDisruptionBudgets map[string]*policy.PodDisruptionBudget, - serviceMonitors map[string]*monitoring.ServiceMonitor) Inspector { + serviceMonitors map[string]*monitoring.ServiceMonitor, + arangoMembers map[string]*api.ArangoMember) inspectorInterface.Inspector { return &inspector{ pods: pods, secrets: secrets, @@ -98,35 +101,10 @@ func NewInspectorFromData(pods map[string]*core.Pod, serviceAccounts: serviceAccounts, podDisruptionBudgets: podDisruptionBudgets, serviceMonitors: serviceMonitors, + arangoMembers: arangoMembers, } } -type Inspector interface { - Refresh(k kubernetes.Interface, m monitoringClient.MonitoringV1Interface, namespace string) error - - Pod(name string) (*core.Pod, bool) - IteratePods(action PodAction, filters ...PodFilter) error - - Secret(name string) (*core.Secret, bool) - IterateSecrets(action SecretAction, filters ...SecretFilter) error - SecretReadInterface() SecretReadInterface - - PersistentVolumeClaim(name string) (*core.PersistentVolumeClaim, bool) - IteratePersistentVolumeClaims(action PersistentVolumeClaimAction, filters ...PersistentVolumeClaimFilter) error - - Service(name string) (*core.Service, bool) - IterateServices(action ServiceAction, filters ...ServiceFilter) error - - ServiceAccount(name string) (*core.ServiceAccount, bool) - IterateServiceAccounts(action ServiceAccountAction, filters ...ServiceAccountFilter) error - - PodDisruptionBudget(name string) (*policy.PodDisruptionBudget, bool) - IteratePodDisruptionBudgets(action PodDisruptionBudgetAction, filters ...PodDisruptionBudgetFilter) error - - ServiceMonitor(name string) (*monitoring.ServiceMonitor, bool) - IterateServiceMonitors(action ServiceMonitorAction, filters ...ServiceMonitorFilter) error -} - type inspector struct { lock sync.Mutex @@ -137,13 +115,14 @@ type inspector struct { serviceAccounts map[string]*core.ServiceAccount podDisruptionBudgets map[string]*policy.PodDisruptionBudget serviceMonitors map[string]*monitoring.ServiceMonitor + arangoMembers map[string]*api.ArangoMember ns string k kubernetes.Interface m monitoringClient.MonitoringV1Interface } -func (i *inspector) Refresh(k kubernetes.Interface, m monitoringClient.MonitoringV1Interface, namespace string) error { +func (i *inspector) Refresh(k kubernetes.Interface, m monitoringClient.MonitoringV1Interface, c versioned.Interface, namespace string) error { i.lock.Lock() defer i.lock.Unlock() @@ -182,6 +161,11 @@ func (i *inspector) Refresh(k kubernetes.Interface, m monitoringClient.Monitorin return err } + arangoMembers, err := arangoMembersToMap(c, namespace) + if err != nil { + return err + } + i.pods = pods i.secrets = secrets i.pvcs = pvcs @@ -189,6 +173,7 @@ func (i *inspector) Refresh(k kubernetes.Interface, m monitoringClient.Monitorin i.serviceAccounts = serviceAccounts i.podDisruptionBudgets = podDisruptionBudgets i.serviceMonitors = serviceMonitors + i.arangoMembers = arangoMembers return nil } diff --git a/pkg/deployment/resources/inspector/members.go b/pkg/deployment/resources/inspector/members.go new file mode 100644 index 000000000..561f32d9a --- /dev/null +++ b/pkg/deployment/resources/inspector/members.go @@ -0,0 +1,120 @@ +// +// DISCLAIMER +// +// Copyright 2021 ArangoDB GmbH, Cologne, Germany +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// Copyright holder is ArangoDB GmbH, Cologne, Germany +// +// Author Adam Janikowski +// + +package inspector + +import ( + api "github.com/arangodb/kube-arangodb/pkg/apis/deployment/v1" + "github.com/arangodb/kube-arangodb/pkg/generated/clientset/versioned" + "github.com/arangodb/kube-arangodb/pkg/util/errors" + "github.com/arangodb/kube-arangodb/pkg/util/k8sutil/inspector/arangomember" + meta "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +func (i *inspector) IterateArangoMembers(action arangomember.ArangoMemberAction, filters ...arangomember.ArangoMemberFilter) error { + for _, arangoMember := range i.ArangoMembers() { + if err := i.iterateArangoMembers(arangoMember, action, filters...); err != nil { + return err + } + } + return nil +} + +func (i *inspector) iterateArangoMembers(arangoMember *api.ArangoMember, action arangomember.ArangoMemberAction, filters ...arangomember.ArangoMemberFilter) error { + for _, filter := range filters { + if !filter(arangoMember) { + return nil + } + } + + return action(arangoMember) +} + +func (i *inspector) ArangoMembers() []*api.ArangoMember { + i.lock.Lock() + defer i.lock.Unlock() + + var r []*api.ArangoMember + for _, arangoMember := range i.arangoMembers { + r = append(r, arangoMember) + } + + return r +} + +func (i *inspector) ArangoMember(name string) (*api.ArangoMember, bool) { + i.lock.Lock() + defer i.lock.Unlock() + + arangoMember, ok := i.arangoMembers[name] + if !ok { + return nil, false + } + + return arangoMember, true +} + +func arangoMembersToMap(k versioned.Interface, namespace string) (map[string]*api.ArangoMember, error) { + arangoMembers, err := getArangoMembers(k, namespace, "") + if err != nil { + return nil, err + } + + arangoMemberMap := map[string]*api.ArangoMember{} + + for _, arangoMember := range arangoMembers { + _, exists := arangoMemberMap[arangoMember.GetName()] + if exists { + return nil, errors.Newf("ArangoMember %s already exists in map, error received", arangoMember.GetName()) + } + + arangoMemberMap[arangoMember.GetName()] = arangoMemberPointer(arangoMember) + } + + return arangoMemberMap, nil +} + +func arangoMemberPointer(pod api.ArangoMember) *api.ArangoMember { + return &pod +} + +func getArangoMembers(k versioned.Interface, namespace, cont string) ([]api.ArangoMember, error) { + arangoMembers, err := k.DatabaseV1().ArangoMembers(namespace).List(meta.ListOptions{ + Limit: 128, + Continue: cont, + }) + + if err != nil { + return nil, err + } + + if arangoMembers.Continue != "" { + nextArangoMembersLayer, err := getArangoMembers(k, namespace, arangoMembers.Continue) + if err != nil { + return nil, err + } + + return append(arangoMembers.Items, nextArangoMembersLayer...), nil + } + + return arangoMembers.Items, nil +} diff --git a/pkg/deployment/resources/inspector/pdbs.go b/pkg/deployment/resources/inspector/pdbs.go index 7b93093b6..d0596db64 100644 --- a/pkg/deployment/resources/inspector/pdbs.go +++ b/pkg/deployment/resources/inspector/pdbs.go @@ -24,15 +24,13 @@ package inspector import ( "github.com/arangodb/kube-arangodb/pkg/util/errors" + "github.com/arangodb/kube-arangodb/pkg/util/k8sutil/inspector/poddisruptionbudget" policy "k8s.io/api/policy/v1beta1" meta "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/kubernetes" ) -type PodDisruptionBudgetFilter func(podDisruptionBudget *policy.PodDisruptionBudget) bool -type PodDisruptionBudgetAction func(podDisruptionBudget *policy.PodDisruptionBudget) error - -func (i *inspector) IteratePodDisruptionBudgets(action PodDisruptionBudgetAction, filters ...PodDisruptionBudgetFilter) error { +func (i *inspector) IteratePodDisruptionBudgets(action poddisruptionbudget.PodDisruptionBudgetAction, filters ...poddisruptionbudget.PodDisruptionBudgetFilter) error { for _, podDisruptionBudget := range i.PodDisruptionBudgets() { if err := i.iteratePodDisruptionBudget(podDisruptionBudget, action, filters...); err != nil { return err @@ -41,7 +39,7 @@ func (i *inspector) IteratePodDisruptionBudgets(action PodDisruptionBudgetAction return nil } -func (i *inspector) iteratePodDisruptionBudget(podDisruptionBudget *policy.PodDisruptionBudget, action PodDisruptionBudgetAction, filters ...PodDisruptionBudgetFilter) error { +func (i *inspector) iteratePodDisruptionBudget(podDisruptionBudget *policy.PodDisruptionBudget, action poddisruptionbudget.PodDisruptionBudgetAction, filters ...poddisruptionbudget.PodDisruptionBudgetFilter) error { for _, filter := range filters { if !filter(podDisruptionBudget) { return nil @@ -121,7 +119,7 @@ func getPodDisruptionBudgets(k kubernetes.Interface, namespace, cont string) ([] return podDisruptionBudgets.Items, nil } -func FilterPodDisruptionBudgetsByLabels(labels map[string]string) PodDisruptionBudgetFilter { +func FilterPodDisruptionBudgetsByLabels(labels map[string]string) poddisruptionbudget.PodDisruptionBudgetFilter { return func(podDisruptionBudget *policy.PodDisruptionBudget) bool { for key, value := range labels { v, ok := podDisruptionBudget.Labels[key] diff --git a/pkg/deployment/resources/inspector/pods.go b/pkg/deployment/resources/inspector/pods.go index 4af869bb2..61e4034b7 100644 --- a/pkg/deployment/resources/inspector/pods.go +++ b/pkg/deployment/resources/inspector/pods.go @@ -24,15 +24,13 @@ package inspector import ( "github.com/arangodb/kube-arangodb/pkg/util/errors" + "github.com/arangodb/kube-arangodb/pkg/util/k8sutil/inspector/pod" core "k8s.io/api/core/v1" meta "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/kubernetes" ) -type PodFilter func(pod *core.Pod) bool -type PodAction func(pod *core.Pod) error - -func (i *inspector) IteratePods(action PodAction, filters ...PodFilter) error { +func (i *inspector) IteratePods(action pod.Action, filters ...pod.Filter) error { for _, pod := range i.Pods() { if err := i.iteratePod(pod, action, filters...); err != nil { return err @@ -41,7 +39,7 @@ func (i *inspector) IteratePods(action PodAction, filters ...PodFilter) error { return nil } -func (i *inspector) iteratePod(pod *core.Pod, action PodAction, filters ...PodFilter) error { +func (i *inspector) iteratePod(pod *core.Pod, action pod.Action, filters ...pod.Filter) error { for _, filter := range filters { if !filter(pod) { return nil @@ -121,7 +119,7 @@ func getPods(k kubernetes.Interface, namespace, cont string) ([]core.Pod, error) return pods.Items, nil } -func FilterPodsByLabels(labels map[string]string) PodFilter { +func FilterPodsByLabels(labels map[string]string) pod.Filter { return func(pod *core.Pod) bool { for key, value := range labels { v, ok := pod.Labels[key] diff --git a/pkg/deployment/resources/inspector/pvcs.go b/pkg/deployment/resources/inspector/pvcs.go index 5b14127f5..1cbe13646 100644 --- a/pkg/deployment/resources/inspector/pvcs.go +++ b/pkg/deployment/resources/inspector/pvcs.go @@ -24,15 +24,13 @@ package inspector import ( "github.com/arangodb/kube-arangodb/pkg/util/errors" + "github.com/arangodb/kube-arangodb/pkg/util/k8sutil/inspector/persistentvolumeclaim" core "k8s.io/api/core/v1" meta "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/kubernetes" ) -type PersistentVolumeClaimFilter func(pvc *core.PersistentVolumeClaim) bool -type PersistentVolumeClaimAction func(pvc *core.PersistentVolumeClaim) error - -func (i *inspector) IteratePersistentVolumeClaims(action PersistentVolumeClaimAction, filters ...PersistentVolumeClaimFilter) error { +func (i *inspector) IteratePersistentVolumeClaims(action persistentvolumeclaim.PersistentVolumeClaimAction, filters ...persistentvolumeclaim.PersistentVolumeClaimFilter) error { for _, pvc := range i.PersistentVolumeClaims() { if err := i.iteratePersistentVolumeClaim(pvc, action, filters...); err != nil { return err @@ -41,7 +39,7 @@ func (i *inspector) IteratePersistentVolumeClaims(action PersistentVolumeClaimAc return nil } -func (i *inspector) iteratePersistentVolumeClaim(pvc *core.PersistentVolumeClaim, action PersistentVolumeClaimAction, filters ...PersistentVolumeClaimFilter) error { +func (i *inspector) iteratePersistentVolumeClaim(pvc *core.PersistentVolumeClaim, action persistentvolumeclaim.PersistentVolumeClaimAction, filters ...persistentvolumeclaim.PersistentVolumeClaimFilter) error { for _, filter := range filters { if !filter(pvc) { return nil @@ -121,7 +119,7 @@ func getPersistentVolumeClaims(k kubernetes.Interface, namespace, cont string) ( return pvcs.Items, nil } -func FilterPersistentVolumeClaimsByLabels(labels map[string]string) PersistentVolumeClaimFilter { +func FilterPersistentVolumeClaimsByLabels(labels map[string]string) persistentvolumeclaim.PersistentVolumeClaimFilter { return func(pvc *core.PersistentVolumeClaim) bool { for key, value := range labels { v, ok := pvc.Labels[key] diff --git a/pkg/deployment/resources/inspector/sa.go b/pkg/deployment/resources/inspector/sa.go index 495febfdf..ba0681e87 100644 --- a/pkg/deployment/resources/inspector/sa.go +++ b/pkg/deployment/resources/inspector/sa.go @@ -24,15 +24,13 @@ package inspector import ( "github.com/arangodb/kube-arangodb/pkg/util/errors" + "github.com/arangodb/kube-arangodb/pkg/util/k8sutil/inspector/serviceaccount" core "k8s.io/api/core/v1" meta "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/kubernetes" ) -type ServiceAccountFilter func(serviceAccount *core.ServiceAccount) bool -type ServiceAccountAction func(serviceAccount *core.ServiceAccount) error - -func (i *inspector) IterateServiceAccounts(action ServiceAccountAction, filters ...ServiceAccountFilter) error { +func (i *inspector) IterateServiceAccounts(action serviceaccount.Action, filters ...serviceaccount.Filter) error { for _, serviceAccount := range i.ServiceAccounts() { if err := i.iterateServiceAccount(serviceAccount, action, filters...); err != nil { return err @@ -41,7 +39,7 @@ func (i *inspector) IterateServiceAccounts(action ServiceAccountAction, filters return nil } -func (i *inspector) iterateServiceAccount(serviceAccount *core.ServiceAccount, action ServiceAccountAction, filters ...ServiceAccountFilter) error { +func (i *inspector) iterateServiceAccount(serviceAccount *core.ServiceAccount, action serviceaccount.Action, filters ...serviceaccount.Filter) error { for _, filter := range filters { if !filter(serviceAccount) { return nil @@ -121,7 +119,7 @@ func getServiceAccounts(k kubernetes.Interface, namespace, cont string) ([]core. return serviceAccounts.Items, nil } -func FilterServiceAccountsByLabels(labels map[string]string) ServiceAccountFilter { +func FilterServiceAccountsByLabels(labels map[string]string) serviceaccount.Filter { return func(serviceAccount *core.ServiceAccount) bool { for key, value := range labels { v, ok := serviceAccount.Labels[key] diff --git a/pkg/deployment/resources/inspector/secrets.go b/pkg/deployment/resources/inspector/secrets.go index d29582ec1..b331a475e 100644 --- a/pkg/deployment/resources/inspector/secrets.go +++ b/pkg/deployment/resources/inspector/secrets.go @@ -24,6 +24,7 @@ package inspector import ( "github.com/arangodb/kube-arangodb/pkg/util/errors" + "github.com/arangodb/kube-arangodb/pkg/util/k8sutil/inspector/secret" core "k8s.io/api/core/v1" apiErrors "k8s.io/apimachinery/pkg/api/errors" meta "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -31,10 +32,7 @@ import ( "k8s.io/client-go/kubernetes" ) -type SecretFilter func(pod *core.Secret) bool -type SecretAction func(pod *core.Secret) error - -func (i *inspector) IterateSecrets(action SecretAction, filters ...SecretFilter) error { +func (i *inspector) IterateSecrets(action secret.Action, filters ...secret.Filter) error { for _, secret := range i.Secrets() { if err := i.iterateSecrets(secret, action, filters...); err != nil { return err @@ -43,7 +41,7 @@ func (i *inspector) IterateSecrets(action SecretAction, filters ...SecretFilter) return nil } -func (i *inspector) iterateSecrets(secret *core.Secret, action SecretAction, filters ...SecretFilter) error { +func (i *inspector) iterateSecrets(secret *core.Secret, action secret.Action, filters ...secret.Filter) error { for _, filter := range filters { if !filter(secret) { return nil @@ -77,7 +75,7 @@ func (i *inspector) Secret(name string) (*core.Secret, bool) { return secret, true } -func (i *inspector) SecretReadInterface() SecretReadInterface { +func (i *inspector) SecretReadInterface() secret.ReadInterface { return &secretReadInterface{i: i} } diff --git a/pkg/deployment/resources/inspector/services.go b/pkg/deployment/resources/inspector/services.go index 86067be3d..20db7828a 100644 --- a/pkg/deployment/resources/inspector/services.go +++ b/pkg/deployment/resources/inspector/services.go @@ -24,15 +24,13 @@ package inspector import ( "github.com/arangodb/kube-arangodb/pkg/util/errors" + "github.com/arangodb/kube-arangodb/pkg/util/k8sutil/inspector/service" core "k8s.io/api/core/v1" meta "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/kubernetes" ) -type ServiceFilter func(pod *core.Service) bool -type ServiceAction func(pod *core.Service) error - -func (i *inspector) IterateServices(action ServiceAction, filters ...ServiceFilter) error { +func (i *inspector) IterateServices(action service.ServiceAction, filters ...service.ServiceFilter) error { for _, service := range i.Services() { if err := i.iterateServices(service, action, filters...); err != nil { return err @@ -41,7 +39,7 @@ func (i *inspector) IterateServices(action ServiceAction, filters ...ServiceFilt return nil } -func (i *inspector) iterateServices(service *core.Service, action ServiceAction, filters ...ServiceFilter) error { +func (i *inspector) iterateServices(service *core.Service, action service.ServiceAction, filters ...service.ServiceFilter) error { for _, filter := range filters { if !filter(service) { return nil diff --git a/pkg/deployment/resources/inspector/sms.go b/pkg/deployment/resources/inspector/sms.go index 5f9ac3327..fa2a25be2 100644 --- a/pkg/deployment/resources/inspector/sms.go +++ b/pkg/deployment/resources/inspector/sms.go @@ -24,15 +24,13 @@ package inspector import ( "github.com/arangodb/kube-arangodb/pkg/util/errors" + "github.com/arangodb/kube-arangodb/pkg/util/k8sutil/inspector/servicemonitor" monitoring "github.com/coreos/prometheus-operator/pkg/apis/monitoring/v1" monitoringClient "github.com/coreos/prometheus-operator/pkg/client/versioned/typed/monitoring/v1" meta "k8s.io/apimachinery/pkg/apis/meta/v1" ) -type ServiceMonitorFilter func(serviceMonitor *monitoring.ServiceMonitor) bool -type ServiceMonitorAction func(serviceMonitor *monitoring.ServiceMonitor) error - -func (i *inspector) IterateServiceMonitors(action ServiceMonitorAction, filters ...ServiceMonitorFilter) error { +func (i *inspector) IterateServiceMonitors(action servicemonitor.ServiceMonitorAction, filters ...servicemonitor.ServiceMonitorFilter) error { for _, serviceMonitor := range i.ServiceMonitors() { if err := i.iterateServiceMonitor(serviceMonitor, action, filters...); err != nil { return err @@ -41,7 +39,7 @@ func (i *inspector) IterateServiceMonitors(action ServiceMonitorAction, filters return nil } -func (i *inspector) iterateServiceMonitor(serviceMonitor *monitoring.ServiceMonitor, action ServiceMonitorAction, filters ...ServiceMonitorFilter) error { +func (i *inspector) iterateServiceMonitor(serviceMonitor *monitoring.ServiceMonitor, action servicemonitor.ServiceMonitorAction, filters ...servicemonitor.ServiceMonitorFilter) error { for _, filter := range filters { if !filter(serviceMonitor) { return nil @@ -108,7 +106,7 @@ func getServiceMonitors(m monitoringClient.MonitoringV1Interface, namespace, con return serviceMonitors.Items, nil } -func FilterServiceMonitorsByLabels(labels map[string]string) ServiceMonitorFilter { +func FilterServiceMonitorsByLabels(labels map[string]string) servicemonitor.ServiceMonitorFilter { return func(serviceMonitor *monitoring.ServiceMonitor) bool { for key, value := range labels { v, ok := serviceMonitor.Labels[key] diff --git a/pkg/deployment/resources/labels.go b/pkg/deployment/resources/labels.go index c46c3f41a..218cc36fc 100644 --- a/pkg/deployment/resources/labels.go +++ b/pkg/deployment/resources/labels.go @@ -24,15 +24,15 @@ package resources import ( "github.com/arangodb/kube-arangodb/pkg/util/errors" + inspectorInterface "github.com/arangodb/kube-arangodb/pkg/util/k8sutil/inspector" monitoring "github.com/coreos/prometheus-operator/pkg/apis/monitoring/v1" - "github.com/arangodb/kube-arangodb/pkg/deployment/resources/inspector" core "k8s.io/api/core/v1" policy "k8s.io/api/policy/v1beta1" "k8s.io/apimachinery/pkg/types" ) -func (r *Resources) EnsureLabels(cachedStatus inspector.Inspector) error { +func (r *Resources) EnsureLabels(cachedStatus inspectorInterface.Inspector) error { r.log.Info().Msgf("Ensuring labels") if err := r.EnsureSecretLabels(cachedStatus); err != nil { @@ -66,7 +66,7 @@ func (r *Resources) EnsureLabels(cachedStatus inspector.Inspector) error { return nil } -func (r *Resources) EnsureSecretLabels(cachedStatus inspector.Inspector) error { +func (r *Resources) EnsureSecretLabels(cachedStatus inspectorInterface.Inspector) error { changed := false if err := cachedStatus.IterateSecrets(func(secret *core.Secret) error { if ensureLabelsMap(secret.Kind, secret, r.context.GetSpec(), func(name string, d []byte) error { @@ -90,7 +90,7 @@ func (r *Resources) EnsureSecretLabels(cachedStatus inspector.Inspector) error { return nil } -func (r *Resources) EnsureServiceAccountsLabels(cachedStatus inspector.Inspector) error { +func (r *Resources) EnsureServiceAccountsLabels(cachedStatus inspectorInterface.Inspector) error { changed := false if err := cachedStatus.IterateServiceAccounts(func(serviceAccount *core.ServiceAccount) error { if ensureLabelsMap(serviceAccount.Kind, serviceAccount, r.context.GetSpec(), func(name string, d []byte) error { @@ -114,7 +114,7 @@ func (r *Resources) EnsureServiceAccountsLabels(cachedStatus inspector.Inspector return nil } -func (r *Resources) EnsureServicesLabels(cachedStatus inspector.Inspector) error { +func (r *Resources) EnsureServicesLabels(cachedStatus inspectorInterface.Inspector) error { changed := false if err := cachedStatus.IterateServices(func(service *core.Service) error { if ensureLabelsMap(service.Kind, service, r.context.GetSpec(), func(name string, d []byte) error { @@ -138,7 +138,7 @@ func (r *Resources) EnsureServicesLabels(cachedStatus inspector.Inspector) error return nil } -func (r *Resources) EnsureServiceMonitorsLabels(cachedStatus inspector.Inspector) error { +func (r *Resources) EnsureServiceMonitorsLabels(cachedStatus inspectorInterface.Inspector) error { changed := false if err := cachedStatus.IterateServiceMonitors(func(serviceMonitor *monitoring.ServiceMonitor) error { if ensureLabelsMap(serviceMonitor.Kind, serviceMonitor, r.context.GetSpec(), func(name string, d []byte) error { @@ -162,7 +162,7 @@ func (r *Resources) EnsureServiceMonitorsLabels(cachedStatus inspector.Inspector return nil } -func (r *Resources) EnsurePodsLabels(cachedStatus inspector.Inspector) error { +func (r *Resources) EnsurePodsLabels(cachedStatus inspectorInterface.Inspector) error { changed := false if err := cachedStatus.IteratePods(func(pod *core.Pod) error { if ensureGroupLabelsMap(pod.Kind, pod, r.context.GetSpec(), func(name string, d []byte) error { @@ -186,7 +186,7 @@ func (r *Resources) EnsurePodsLabels(cachedStatus inspector.Inspector) error { return nil } -func (r *Resources) EnsurePersistentVolumeClaimsLabels(cachedStatus inspector.Inspector) error { +func (r *Resources) EnsurePersistentVolumeClaimsLabels(cachedStatus inspectorInterface.Inspector) error { changed := false if err := cachedStatus.IteratePersistentVolumeClaims(func(persistentVolumeClaim *core.PersistentVolumeClaim) error { if ensureGroupLabelsMap(persistentVolumeClaim.Kind, persistentVolumeClaim, r.context.GetSpec(), func(name string, d []byte) error { @@ -210,7 +210,7 @@ func (r *Resources) EnsurePersistentVolumeClaimsLabels(cachedStatus inspector.In return nil } -func (r *Resources) EnsurePodDisruptionBudgetsLabels(cachedStatus inspector.Inspector) error { +func (r *Resources) EnsurePodDisruptionBudgetsLabels(cachedStatus inspectorInterface.Inspector) error { changed := false if err := cachedStatus.IteratePodDisruptionBudgets(func(budget *policy.PodDisruptionBudget) error { if ensureLabelsMap(budget.Kind, budget, r.context.GetSpec(), func(name string, d []byte) error { diff --git a/pkg/deployment/resources/license.go b/pkg/deployment/resources/license.go index 5840a8159..2b1b2572b 100644 --- a/pkg/deployment/resources/license.go +++ b/pkg/deployment/resources/license.go @@ -23,14 +23,14 @@ package resources import ( - "github.com/arangodb/kube-arangodb/pkg/deployment/resources/inspector" "github.com/arangodb/kube-arangodb/pkg/util/errors" + inspectorInterface "github.com/arangodb/kube-arangodb/pkg/util/k8sutil/inspector" "github.com/arangodb/kube-arangodb/pkg/util/constants" ) // ValidateLicenseKeySecret checks if the licens key secret exists and is valid -func (r *Resources) ValidateLicenseKeySecret(cachedStatus inspector.Inspector) error { +func (r *Resources) ValidateLicenseKeySecret(cachedStatus inspectorInterface.Inspector) error { spec := r.context.GetSpec().License if spec.HasSecretName() { diff --git a/pkg/deployment/resources/pod_cleanup.go b/pkg/deployment/resources/pod_cleanup.go index 7f5786c79..501ab5503 100644 --- a/pkg/deployment/resources/pod_cleanup.go +++ b/pkg/deployment/resources/pod_cleanup.go @@ -30,6 +30,7 @@ import ( "github.com/arangodb/kube-arangodb/pkg/util" "github.com/arangodb/kube-arangodb/pkg/util/k8sutil" + inspectorInterface "github.com/arangodb/kube-arangodb/pkg/util/k8sutil/inspector" api "github.com/arangodb/kube-arangodb/pkg/apis/deployment/v1" ) @@ -41,7 +42,7 @@ const ( // CleanupTerminatedPods removes all pods in Terminated state that belong to a member in Created state. // Returns: Interval_till_next_inspection, error -func (r *Resources) CleanupTerminatedPods(cachedStatus inspector.Inspector) (util.Interval, error) { +func (r *Resources) CleanupTerminatedPods(cachedStatus inspectorInterface.Inspector) (util.Interval, error) { log := r.log nextInterval := maxPodInspectorInterval // Large by default, will be made smaller if needed in the rest of the function diff --git a/pkg/deployment/resources/pod_creator.go b/pkg/deployment/resources/pod_creator.go index 769e01914..5b38b1676 100644 --- a/pkg/deployment/resources/pod_creator.go +++ b/pkg/deployment/resources/pod_creator.go @@ -40,7 +40,7 @@ import ( "github.com/arangodb/kube-arangodb/pkg/deployment/features" - "github.com/arangodb/kube-arangodb/pkg/deployment/resources/inspector" + inspectorInterface "github.com/arangodb/kube-arangodb/pkg/util/k8sutil/inspector" "github.com/arangodb/kube-arangodb/pkg/util/k8sutil/interfaces" "k8s.io/apimachinery/pkg/types" @@ -287,7 +287,7 @@ func (r *Resources) CreatePodTolerations(group api.ServerGroup, groupSpec api.Se return tolerations } -func (r *Resources) RenderPodForMember(cachedStatus inspector.Inspector, spec api.DeploymentSpec, status api.DeploymentStatus, memberID string, imageInfo api.ImageInfo) (*core.Pod, error) { +func (r *Resources) RenderPodForMember(cachedStatus inspectorInterface.Inspector, spec api.DeploymentSpec, status api.DeploymentStatus, memberID string, imageInfo api.ImageInfo) (*core.Pod, error) { log := r.log apiObject := r.context.GetAPIObject() m, group, found := status.Members.ElementByID(memberID) @@ -415,7 +415,7 @@ func (r *Resources) SelectImage(spec api.DeploymentSpec, status api.DeploymentSt } // createPodForMember creates all Pods listed in member status -func (r *Resources) createPodForMember(spec api.DeploymentSpec, memberID string, imageNotFoundOnce *sync.Once, cachedStatus inspector.Inspector) error { +func (r *Resources) createPodForMember(spec api.DeploymentSpec, memberID string, imageNotFoundOnce *sync.Once, cachedStatus inspectorInterface.Inspector) error { log := r.log status, lastVersion := r.context.GetStatus() @@ -641,7 +641,7 @@ func ChecksumArangoPod(groupSpec api.ServerGroupSpec, pod *core.Pod) (string, er } // EnsurePods creates all Pods listed in member status -func (r *Resources) EnsurePods(cachedStatus inspector.Inspector) error { +func (r *Resources) EnsurePods(cachedStatus inspectorInterface.Inspector) error { iterator := r.context.GetServerGroupIterator() deploymentStatus, _ := r.context.GetStatus() imageNotFoundOnce := &sync.Once{} diff --git a/pkg/deployment/resources/pod_creator_arangod.go b/pkg/deployment/resources/pod_creator_arangod.go index 7ef8b7bba..b4b3a0432 100644 --- a/pkg/deployment/resources/pod_creator_arangod.go +++ b/pkg/deployment/resources/pod_creator_arangod.go @@ -29,7 +29,6 @@ import ( "github.com/arangodb/kube-arangodb/pkg/util/collection" - "github.com/arangodb/kube-arangodb/pkg/deployment/resources/inspector" "github.com/arangodb/kube-arangodb/pkg/util/k8sutil/interfaces" "github.com/arangodb/kube-arangodb/pkg/deployment/pod" @@ -225,7 +224,7 @@ func (m *MemberArangoDPod) Init(pod *core.Pod) { pod.Spec.PriorityClassName = m.groupSpec.PriorityClassName } -func (m *MemberArangoDPod) Validate(cachedStatus inspector.Inspector) error { +func (m *MemberArangoDPod) Validate(cachedStatus interfaces.Inspector) error { i := m.AsInput() if err := pod.SNI().Verify(i, cachedStatus); err != nil { diff --git a/pkg/deployment/resources/pod_creator_sync.go b/pkg/deployment/resources/pod_creator_sync.go index 9006dfc76..aa564a4c7 100644 --- a/pkg/deployment/resources/pod_creator_sync.go +++ b/pkg/deployment/resources/pod_creator_sync.go @@ -27,7 +27,6 @@ import ( "github.com/arangodb/kube-arangodb/pkg/util/collection" - "github.com/arangodb/kube-arangodb/pkg/deployment/resources/inspector" "github.com/arangodb/kube-arangodb/pkg/util/k8sutil/interfaces" "github.com/arangodb/kube-arangodb/pkg/deployment/pod" @@ -308,7 +307,7 @@ func (m *MemberSyncPod) Init(pod *core.Pod) { pod.Spec.PriorityClassName = m.groupSpec.PriorityClassName } -func (m *MemberSyncPod) Validate(cachedStatus inspector.Inspector) error { +func (m *MemberSyncPod) Validate(cachedStatus interfaces.Inspector) error { return nil } diff --git a/pkg/deployment/resources/pod_inspector.go b/pkg/deployment/resources/pod_inspector.go index e31353ec4..86fd72950 100644 --- a/pkg/deployment/resources/pod_inspector.go +++ b/pkg/deployment/resources/pod_inspector.go @@ -28,6 +28,7 @@ import ( "time" "github.com/arangodb/kube-arangodb/pkg/util/errors" + inspectorInterface "github.com/arangodb/kube-arangodb/pkg/util/k8sutil/inspector" "github.com/arangodb/kube-arangodb/pkg/deployment/resources/inspector" @@ -54,7 +55,7 @@ const ( // InspectPods lists all pods that belong to the given deployment and updates // the member status of the deployment accordingly. // Returns: Interval_till_next_inspection, error -func (r *Resources) InspectPods(ctx context.Context, cachedStatus inspector.Inspector) (util.Interval, error) { +func (r *Resources) InspectPods(ctx context.Context, cachedStatus inspectorInterface.Inspector) (util.Interval, error) { log := r.log start := time.Now() apiObject := r.context.GetAPIObject() diff --git a/pkg/deployment/resources/pvc_inspector.go b/pkg/deployment/resources/pvc_inspector.go index fcdb88b93..2319f23fc 100644 --- a/pkg/deployment/resources/pvc_inspector.go +++ b/pkg/deployment/resources/pvc_inspector.go @@ -27,6 +27,7 @@ import ( "time" "github.com/arangodb/kube-arangodb/pkg/util/errors" + inspectorInterface "github.com/arangodb/kube-arangodb/pkg/util/k8sutil/inspector" "github.com/arangodb/kube-arangodb/pkg/deployment/resources/inspector" v1 "k8s.io/api/core/v1" @@ -47,7 +48,7 @@ const ( // InspectPVCs lists all PVCs that belong to the given deployment and updates // the member status of the deployment accordingly. -func (r *Resources) InspectPVCs(ctx context.Context, cachedStatus inspector.Inspector) (util.Interval, error) { +func (r *Resources) InspectPVCs(ctx context.Context, cachedStatus inspectorInterface.Inspector) (util.Interval, error) { log := r.log start := time.Now() nextInterval := maxPVCInspectorInterval diff --git a/pkg/deployment/resources/pvcs.go b/pkg/deployment/resources/pvcs.go index c1fcb40c7..f8679f5a5 100644 --- a/pkg/deployment/resources/pvcs.go +++ b/pkg/deployment/resources/pvcs.go @@ -24,10 +24,10 @@ package resources import ( api "github.com/arangodb/kube-arangodb/pkg/apis/deployment/v1" - "github.com/arangodb/kube-arangodb/pkg/deployment/resources/inspector" "github.com/arangodb/kube-arangodb/pkg/util/constants" "github.com/arangodb/kube-arangodb/pkg/util/errors" "github.com/arangodb/kube-arangodb/pkg/util/k8sutil" + inspectorInterface "github.com/arangodb/kube-arangodb/pkg/util/k8sutil/inspector" ) // createPVCFinalizers creates a list of finalizers for a PVC created for the given group. @@ -36,7 +36,7 @@ func (r *Resources) createPVCFinalizers(group api.ServerGroup) []string { } // EnsurePVCs creates all PVC's listed in member status -func (r *Resources) EnsurePVCs(cachedStatus inspector.Inspector) error { +func (r *Resources) EnsurePVCs(cachedStatus inspectorInterface.Inspector) error { kubecli := r.context.GetKubeCli() apiObject := r.context.GetAPIObject() deploymentName := apiObject.GetName() diff --git a/pkg/deployment/resources/secret_hashes.go b/pkg/deployment/resources/secret_hashes.go index 4e0325968..36d0e99cd 100644 --- a/pkg/deployment/resources/secret_hashes.go +++ b/pkg/deployment/resources/secret_hashes.go @@ -31,13 +31,12 @@ import ( "strings" "github.com/arangodb/kube-arangodb/pkg/util/errors" + inspectorInterface "github.com/arangodb/kube-arangodb/pkg/util/k8sutil/inspector" "github.com/arangodb/kube-arangodb/pkg/deployment/features" "github.com/arangodb/kube-arangodb/pkg/deployment/pod" - "github.com/arangodb/kube-arangodb/pkg/deployment/resources/inspector" - "github.com/arangodb/go-driver" v1 "k8s.io/api/core/v1" @@ -51,7 +50,7 @@ import ( // If a hash is different, the deployment is marked // with a SecretChangedCondition and the operator will not // touch it until this is resolved. -func (r *Resources) ValidateSecretHashes(cachedStatus inspector.Inspector) error { +func (r *Resources) ValidateSecretHashes(cachedStatus inspectorInterface.Inspector) error { // validate performs a secret hash comparison for a single secret. // Return true if all is good, false when the SecretChanged condition // must be set. @@ -269,7 +268,7 @@ func changeUserPassword(c Context, secret *v1.Secret) error { } // getSecretHash fetches a secret with given name and returns a hash over its value. -func (r *Resources) getSecretHash(cachedStatus inspector.Inspector, secretName string) (*v1.Secret, string, bool) { +func (r *Resources) getSecretHash(cachedStatus inspectorInterface.Inspector, secretName string) (*v1.Secret, string, bool) { s, exists := cachedStatus.Secret(secretName) if !exists { return nil, "", false diff --git a/pkg/deployment/resources/secrets.go b/pkg/deployment/resources/secrets.go index ba473c144..ebbc21414 100644 --- a/pkg/deployment/resources/secrets.go +++ b/pkg/deployment/resources/secrets.go @@ -30,6 +30,7 @@ import ( "time" "github.com/arangodb/kube-arangodb/pkg/util/errors" + inspectorInterface "github.com/arangodb/kube-arangodb/pkg/util/k8sutil/inspector" "github.com/arangodb/kube-arangodb/pkg/deployment/features" "github.com/arangodb/kube-arangodb/pkg/deployment/patch" @@ -42,7 +43,6 @@ import ( operatorErrors "github.com/arangodb/kube-arangodb/pkg/util/errors" - "github.com/arangodb/kube-arangodb/pkg/deployment/resources/inspector" core "k8s.io/api/core/v1" meta "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -71,7 +71,7 @@ func GetCASecretName(apiObject k8sutil.APIObject) string { } // EnsureSecrets creates all secrets needed to run the given deployment -func (r *Resources) EnsureSecrets(log zerolog.Logger, cachedStatus inspector.Inspector) error { +func (r *Resources) EnsureSecrets(log zerolog.Logger, cachedStatus inspectorInterface.Inspector) error { start := time.Now() spec := r.context.GetSpec() kubecli := r.context.GetKubeCli() @@ -188,13 +188,13 @@ func (r *Resources) EnsureSecrets(log zerolog.Logger, cachedStatus inspector.Ins return nil } -func (r *Resources) refreshCache(cachedStatus inspector.Inspector, err error) error { +func (r *Resources) refreshCache(cachedStatus inspectorInterface.Inspector, err error) error { if err == nil { return nil } if operatorErrors.IsReconcile(err) { - if err := cachedStatus.Refresh(r.context.GetKubeCli(), r.context.GetMonitoringV1Cli(), r.context.GetNamespace()); err != nil { + if err := cachedStatus.Refresh(r.context.GetKubeCli(), r.context.GetMonitoringV1Cli(), r.context.GetArangoCli(), r.context.GetNamespace()); err != nil { return errors.WithStack(err) } } else { @@ -204,7 +204,7 @@ func (r *Resources) refreshCache(cachedStatus inspector.Inspector, err error) er return nil } -func (r *Resources) ensureTokenSecretFolder(cachedStatus inspector.Inspector, secrets k8sutil.SecretInterface, secretName, folderSecretName string) error { +func (r *Resources) ensureTokenSecretFolder(cachedStatus inspectorInterface.Inspector, secrets k8sutil.SecretInterface, secretName, folderSecretName string) error { if f, exists := cachedStatus.Secret(folderSecretName); exists { if len(f.Data) == 0 { s, exists := cachedStatus.Secret(secretName) @@ -290,7 +290,7 @@ func (r *Resources) ensureTokenSecretFolder(cachedStatus inspector.Inspector, se return nil } -func (r *Resources) ensureTokenSecret(cachedStatus inspector.Inspector, secrets k8sutil.SecretInterface, secretName string) error { +func (r *Resources) ensureTokenSecret(cachedStatus inspectorInterface.Inspector, secrets k8sutil.SecretInterface, secretName string) error { if _, exists := cachedStatus.Secret(secretName); !exists { return r.createTokenSecret(secrets, secretName) } @@ -298,7 +298,7 @@ func (r *Resources) ensureTokenSecret(cachedStatus inspector.Inspector, secrets return nil } -func (r *Resources) ensureSecret(cachedStatus inspector.Inspector, secrets k8sutil.SecretInterface, secretName string) error { +func (r *Resources) ensureSecret(cachedStatus inspectorInterface.Inspector, secrets k8sutil.SecretInterface, secretName string) error { if _, exists := cachedStatus.Secret(secretName); !exists { return r.createSecret(secrets, secretName) } @@ -324,7 +324,7 @@ func (r *Resources) createSecret(secrets k8sutil.SecretInterface, secretName str return operatorErrors.Reconcile() } -func (r *Resources) ensureSecretWithEmptyKey(cachedStatus inspector.Inspector, secrets k8sutil.SecretInterface, secretName, keyName string) error { +func (r *Resources) ensureSecretWithEmptyKey(cachedStatus inspectorInterface.Inspector, secrets k8sutil.SecretInterface, secretName, keyName string) error { if _, exists := cachedStatus.Secret(secretName); !exists { return r.createSecretWithKey(secrets, secretName, keyName, nil) } @@ -332,7 +332,7 @@ func (r *Resources) ensureSecretWithEmptyKey(cachedStatus inspector.Inspector, s return nil } -func (r *Resources) ensureSecretWithKey(cachedStatus inspector.Inspector, secrets k8sutil.SecretInterface, secretName, keyName string, value []byte) error { +func (r *Resources) ensureSecretWithKey(cachedStatus inspectorInterface.Inspector, secrets k8sutil.SecretInterface, secretName, keyName string, value []byte) error { if _, exists := cachedStatus.Secret(secretName); !exists { return r.createSecretWithKey(secrets, secretName, keyName, value) } @@ -386,7 +386,7 @@ func (r *Resources) createTokenSecret(secrets k8sutil.SecretInterface, secretNam return operatorErrors.Reconcile() } -func (r *Resources) ensureEncryptionKeyfolderSecret(cachedStatus inspector.Inspector, secrets k8sutil.SecretInterface, keyfileSecretName, secretName string) error { +func (r *Resources) ensureEncryptionKeyfolderSecret(cachedStatus inspectorInterface.Inspector, secrets k8sutil.SecretInterface, keyfileSecretName, secretName string) error { _, folderExists := cachedStatus.Secret(secretName) keyfile, exists := cachedStatus.Secret(keyfileSecretName) @@ -419,7 +419,7 @@ func (r *Resources) ensureEncryptionKeyfolderSecret(cachedStatus inspector.Inspe return nil } -func AppendKeyfileToKeyfolder(cachedStatus inspector.Inspector, secrets k8sutil.SecretInterface, ownerRef *meta.OwnerReference, secretName string, encryptionKey []byte) error { +func AppendKeyfileToKeyfolder(cachedStatus inspectorInterface.Inspector, secrets k8sutil.SecretInterface, ownerRef *meta.OwnerReference, secretName string, encryptionKey []byte) error { encSha := fmt.Sprintf("%0x", sha256.Sum256(encryptionKey)) if _, exists := cachedStatus.Secret(secretName); !exists { @@ -455,7 +455,7 @@ var ( // ensureExporterTokenSecret checks if a secret with given name exists in the namespace // of the deployment. If not, it will add such a secret with correct access. -func (r *Resources) ensureExporterTokenSecret(cachedStatus inspector.Inspector, secrets k8sutil.SecretInterface, tokenSecretName, secretSecretName string) error { +func (r *Resources) ensureExporterTokenSecret(cachedStatus inspectorInterface.Inspector, secrets k8sutil.SecretInterface, tokenSecretName, secretSecretName string) error { if update, exists, err := r.ensureExporterTokenSecretCreateRequired(cachedStatus, tokenSecretName, secretSecretName); err != nil { return err } else if update { @@ -476,7 +476,7 @@ func (r *Resources) ensureExporterTokenSecret(cachedStatus inspector.Inspector, return nil } -func (r *Resources) ensureExporterTokenSecretCreateRequired(cachedStatus inspector.Inspector, tokenSecretName, secretSecretName string) (bool, bool, error) { +func (r *Resources) ensureExporterTokenSecretCreateRequired(cachedStatus inspectorInterface.Inspector, tokenSecretName, secretSecretName string) (bool, bool, error) { if secret, exists := cachedStatus.Secret(tokenSecretName); !exists { return true, false, nil } else { @@ -515,7 +515,7 @@ func (r *Resources) ensureExporterTokenSecretCreateRequired(cachedStatus inspect // ensureTLSCACertificateSecret checks if a secret with given name exists in the namespace // of the deployment. If not, it will add such a secret with a generated CA certificate. -func (r *Resources) ensureTLSCACertificateSecret(cachedStatus inspector.Inspector, secrets k8sutil.SecretInterface, spec api.TLSSpec) error { +func (r *Resources) ensureTLSCACertificateSecret(cachedStatus inspectorInterface.Inspector, secrets k8sutil.SecretInterface, spec api.TLSSpec) error { if _, exists := cachedStatus.Secret(spec.GetCASecretName()); !exists { // Secret not found, create it apiObject := r.context.GetAPIObject() @@ -536,7 +536,7 @@ func (r *Resources) ensureTLSCACertificateSecret(cachedStatus inspector.Inspecto // ensureTLSCACertificateSecret checks if a secret with given name exists in the namespace // of the deployment. If not, it will add such a secret with a generated CA certificate. -func (r *Resources) ensureTLSCAFolderSecret(cachedStatus inspector.Inspector, secrets k8sutil.SecretInterface, spec api.TLSSpec, folderSecretName string) error { +func (r *Resources) ensureTLSCAFolderSecret(cachedStatus inspectorInterface.Inspector, secrets k8sutil.SecretInterface, spec api.TLSSpec, folderSecretName string) error { if spec.CASecretName == nil { return errors.Newf("CA Secret Name is nil") } @@ -573,7 +573,7 @@ func (r *Resources) ensureTLSCAFolderSecret(cachedStatus inspector.Inspector, se // ensureClientAuthCACertificateSecret checks if a secret with given name exists in the namespace // of the deployment. If not, it will add such a secret with a generated CA certificate. -func (r *Resources) ensureClientAuthCACertificateSecret(cachedStatus inspector.Inspector, secrets k8sutil.SecretInterface, spec api.SyncAuthenticationSpec) error { +func (r *Resources) ensureClientAuthCACertificateSecret(cachedStatus inspectorInterface.Inspector, secrets k8sutil.SecretInterface, spec api.SyncAuthenticationSpec) error { if _, exists := cachedStatus.Secret(spec.GetClientCASecretName()); !exists { // Secret not found, create it apiObject := r.context.GetAPIObject() diff --git a/pkg/deployment/resources/services.go b/pkg/deployment/resources/services.go index ad5c2297a..823fe5ca3 100644 --- a/pkg/deployment/resources/services.go +++ b/pkg/deployment/resources/services.go @@ -27,8 +27,7 @@ import ( "time" "github.com/arangodb/kube-arangodb/pkg/util/errors" - - "github.com/arangodb/kube-arangodb/pkg/deployment/resources/inspector" + inspectorInterface "github.com/arangodb/kube-arangodb/pkg/util/k8sutil/inspector" v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -46,7 +45,7 @@ var ( ) // EnsureServices creates all services needed to service the deployment -func (r *Resources) EnsureServices(cachedStatus inspector.Inspector) error { +func (r *Resources) EnsureServices(cachedStatus inspectorInterface.Inspector) error { log := r.log start := time.Now() kubecli := r.context.GetKubeCli() @@ -141,7 +140,7 @@ func (r *Resources) EnsureServices(cachedStatus inspector.Inspector) error { } // EnsureServices creates all services needed to service the deployment -func (r *Resources) ensureExternalAccessServices(cachedStatus inspector.Inspector, svcs k8sutil.ServiceInterface, eaServiceName, ns, svcRole, title string, port int, noneIsClusterIP bool, spec api.ExternalAccessSpec, apiObject k8sutil.APIObject, log zerolog.Logger, counterMetric prometheus.Counter) error { +func (r *Resources) ensureExternalAccessServices(cachedStatus inspectorInterface.Inspector, svcs k8sutil.ServiceInterface, eaServiceName, ns, svcRole, title string, port int, noneIsClusterIP bool, spec api.ExternalAccessSpec, apiObject k8sutil.APIObject, log zerolog.Logger, counterMetric prometheus.Counter) error { // Database external access service createExternalAccessService := false deleteExternalAccessService := false diff --git a/pkg/util/k8sutil/inspector/arangomember/member.go b/pkg/util/k8sutil/inspector/arangomember/member.go new file mode 100644 index 000000000..cc1efc5b9 --- /dev/null +++ b/pkg/util/k8sutil/inspector/arangomember/member.go @@ -0,0 +1,33 @@ +// +// DISCLAIMER +// +// Copyright 2021 ArangoDB GmbH, Cologne, Germany +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// Copyright holder is ArangoDB GmbH, Cologne, Germany +// +// Author Adam Janikowski +// + +package arangomember + +import api "github.com/arangodb/kube-arangodb/pkg/apis/deployment/v1" + +type Inspector interface { + ArangoMember(name string) (*api.ArangoMember, bool) + IterateArangoMembers(action ArangoMemberAction, filters ...ArangoMemberFilter) error +} + +type ArangoMemberFilter func(pod *api.ArangoMember) bool +type ArangoMemberAction func(pod *api.ArangoMember) error diff --git a/pkg/util/k8sutil/inspector/inspector.go b/pkg/util/k8sutil/inspector/inspector.go new file mode 100644 index 000000000..23f641c6f --- /dev/null +++ b/pkg/util/k8sutil/inspector/inspector.go @@ -0,0 +1,50 @@ +// +// DISCLAIMER +// +// Copyright 2021 ArangoDB GmbH, Cologne, Germany +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// Copyright holder is ArangoDB GmbH, Cologne, Germany +// +// Author Adam Janikowski +// + +package inspector + +import ( + "github.com/arangodb/kube-arangodb/pkg/generated/clientset/versioned" + "github.com/arangodb/kube-arangodb/pkg/util/k8sutil/inspector/arangomember" + "github.com/arangodb/kube-arangodb/pkg/util/k8sutil/inspector/persistentvolumeclaim" + "github.com/arangodb/kube-arangodb/pkg/util/k8sutil/inspector/pod" + "github.com/arangodb/kube-arangodb/pkg/util/k8sutil/inspector/poddisruptionbudget" + "github.com/arangodb/kube-arangodb/pkg/util/k8sutil/inspector/secret" + "github.com/arangodb/kube-arangodb/pkg/util/k8sutil/inspector/service" + "github.com/arangodb/kube-arangodb/pkg/util/k8sutil/inspector/serviceaccount" + "github.com/arangodb/kube-arangodb/pkg/util/k8sutil/inspector/servicemonitor" + monitoringClient "github.com/coreos/prometheus-operator/pkg/client/versioned/typed/monitoring/v1" + "k8s.io/client-go/kubernetes" +) + +type Inspector interface { + Refresh(k kubernetes.Interface, m monitoringClient.MonitoringV1Interface, c versioned.Interface, namespace string) error + + pod.Inspector + secret.Inspector + persistentvolumeclaim.Inspector + service.Inspector + poddisruptionbudget.Inspector + servicemonitor.Inspector + serviceaccount.Inspector + arangomember.Inspector +} diff --git a/pkg/util/k8sutil/inspector/persistentvolumeclaim/pvc.go b/pkg/util/k8sutil/inspector/persistentvolumeclaim/pvc.go new file mode 100644 index 000000000..e53aaaaf8 --- /dev/null +++ b/pkg/util/k8sutil/inspector/persistentvolumeclaim/pvc.go @@ -0,0 +1,33 @@ +// +// DISCLAIMER +// +// Copyright 2021 ArangoDB GmbH, Cologne, Germany +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// Copyright holder is ArangoDB GmbH, Cologne, Germany +// +// Author Adam Janikowski +// + +package persistentvolumeclaim + +import core "k8s.io/api/core/v1" + +type Inspector interface { + PersistentVolumeClaim(name string) (*core.PersistentVolumeClaim, bool) + IteratePersistentVolumeClaims(action PersistentVolumeClaimAction, filters ...PersistentVolumeClaimFilter) error +} + +type PersistentVolumeClaimFilter func(pvc *core.PersistentVolumeClaim) bool +type PersistentVolumeClaimAction func(pvc *core.PersistentVolumeClaim) error diff --git a/pkg/util/k8sutil/inspector/pod/pod.go b/pkg/util/k8sutil/inspector/pod/pod.go new file mode 100644 index 000000000..bb942a3a7 --- /dev/null +++ b/pkg/util/k8sutil/inspector/pod/pod.go @@ -0,0 +1,33 @@ +// +// DISCLAIMER +// +// Copyright 2021 ArangoDB GmbH, Cologne, Germany +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// Copyright holder is ArangoDB GmbH, Cologne, Germany +// +// Author Adam Janikowski +// + +package pod + +import core "k8s.io/api/core/v1" + +type Inspector interface { + Pod(name string) (*core.Pod, bool) + IteratePods(action Action, filters ...Filter) error +} + +type Filter func(pod *core.Pod) bool +type Action func(pod *core.Pod) error diff --git a/pkg/util/k8sutil/inspector/poddisruptionbudget/pdb.go b/pkg/util/k8sutil/inspector/poddisruptionbudget/pdb.go new file mode 100644 index 000000000..6cc3bc340 --- /dev/null +++ b/pkg/util/k8sutil/inspector/poddisruptionbudget/pdb.go @@ -0,0 +1,33 @@ +// +// DISCLAIMER +// +// Copyright 2021 ArangoDB GmbH, Cologne, Germany +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// Copyright holder is ArangoDB GmbH, Cologne, Germany +// +// Author Adam Janikowski +// + +package poddisruptionbudget + +import policy "k8s.io/api/policy/v1beta1" + +type Inspector interface { + PodDisruptionBudget(name string) (*policy.PodDisruptionBudget, bool) + IteratePodDisruptionBudgets(action PodDisruptionBudgetAction, filters ...PodDisruptionBudgetFilter) error +} + +type PodDisruptionBudgetFilter func(podDisruptionBudget *policy.PodDisruptionBudget) bool +type PodDisruptionBudgetAction func(podDisruptionBudget *policy.PodDisruptionBudget) error diff --git a/pkg/util/k8sutil/inspector/secret/secret.go b/pkg/util/k8sutil/inspector/secret/secret.go new file mode 100644 index 000000000..cf63569f9 --- /dev/null +++ b/pkg/util/k8sutil/inspector/secret/secret.go @@ -0,0 +1,42 @@ +// +// DISCLAIMER +// +// Copyright 2021 ArangoDB GmbH, Cologne, Germany +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// Copyright holder is ArangoDB GmbH, Cologne, Germany +// +// Author Adam Janikowski +// +package secret + +import ( + core "k8s.io/api/core/v1" + meta "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// Inspector for secrets +type Inspector interface { + Secret(name string) (*core.Secret, bool) + IterateSecrets(action Action, filters ...Filter) error + SecretReadInterface() ReadInterface +} + +// ReadInterface has methods to work with Secret resources with ReadOnly mode. +type ReadInterface interface { + Get(name string, options meta.GetOptions) (*core.Secret, error) +} + +type Filter func(pod *core.Secret) bool +type Action func(pod *core.Secret) error diff --git a/pkg/util/k8sutil/inspector/service/service.go b/pkg/util/k8sutil/inspector/service/service.go new file mode 100644 index 000000000..289428240 --- /dev/null +++ b/pkg/util/k8sutil/inspector/service/service.go @@ -0,0 +1,33 @@ +// +// DISCLAIMER +// +// Copyright 2021 ArangoDB GmbH, Cologne, Germany +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// Copyright holder is ArangoDB GmbH, Cologne, Germany +// +// Author Adam Janikowski +// + +package service + +import core "k8s.io/api/core/v1" + +type Inspector interface { + Service(name string) (*core.Service, bool) + IterateServices(action ServiceAction, filters ...ServiceFilter) error +} + +type ServiceFilter func(pod *core.Service) bool +type ServiceAction func(pod *core.Service) error diff --git a/pkg/util/k8sutil/inspector/serviceaccount/sa.go b/pkg/util/k8sutil/inspector/serviceaccount/sa.go new file mode 100644 index 000000000..9f16c6dbf --- /dev/null +++ b/pkg/util/k8sutil/inspector/serviceaccount/sa.go @@ -0,0 +1,33 @@ +// +// DISCLAIMER +// +// Copyright 2021 ArangoDB GmbH, Cologne, Germany +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// Copyright holder is ArangoDB GmbH, Cologne, Germany +// +// Author Adam Janikowski +// + +package serviceaccount + +import core "k8s.io/api/core/v1" + +type Inspector interface { + ServiceAccount(name string) (*core.ServiceAccount, bool) + IterateServiceAccounts(action Action, filters ...Filter) error +} + +type Filter func(pod *core.ServiceAccount) bool +type Action func(pod *core.ServiceAccount) error diff --git a/pkg/util/k8sutil/inspector/servicemonitor/sm.go b/pkg/util/k8sutil/inspector/servicemonitor/sm.go new file mode 100644 index 000000000..811c28da4 --- /dev/null +++ b/pkg/util/k8sutil/inspector/servicemonitor/sm.go @@ -0,0 +1,33 @@ +// +// DISCLAIMER +// +// Copyright 2021 ArangoDB GmbH, Cologne, Germany +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// Copyright holder is ArangoDB GmbH, Cologne, Germany +// +// Author Adam Janikowski +// + +package servicemonitor + +import monitoring "github.com/coreos/prometheus-operator/pkg/apis/monitoring/v1" + +type Inspector interface { + ServiceMonitor(name string) (*monitoring.ServiceMonitor, bool) + IterateServiceMonitors(action ServiceMonitorAction, filters ...ServiceMonitorFilter) error +} + +type ServiceMonitorFilter func(serviceMonitor *monitoring.ServiceMonitor) bool +type ServiceMonitorAction func(serviceMonitor *monitoring.ServiceMonitor) error diff --git a/pkg/util/k8sutil/interfaces/pod_creator.go b/pkg/util/k8sutil/interfaces/pod_creator.go index 7ab624217..8022a9cb3 100644 --- a/pkg/util/k8sutil/interfaces/pod_creator.go +++ b/pkg/util/k8sutil/interfaces/pod_creator.go @@ -23,10 +23,14 @@ package interfaces import ( - "github.com/arangodb/kube-arangodb/pkg/deployment/resources/inspector" + "github.com/arangodb/kube-arangodb/pkg/util/k8sutil/inspector/secret" core "k8s.io/api/core/v1" ) +type Inspector interface { + secret.Inspector +} + type PodModifier interface { ApplyPodSpec(spec *core.PodSpec) error } @@ -48,7 +52,7 @@ type PodCreator interface { GetContainerCreator() ContainerCreator GetImagePullSecrets() []string IsDeploymentMode() bool - Validate(cachedStatus inspector.Inspector) error + Validate(cachedStatus Inspector) error Annotations() map[string]string Labels() map[string]string diff --git a/pkg/util/k8sutil/services.go b/pkg/util/k8sutil/services.go index fc2a2d9be..007d3046b 100644 --- a/pkg/util/k8sutil/services.go +++ b/pkg/util/k8sutil/services.go @@ -28,9 +28,9 @@ import ( "strconv" "strings" - "github.com/arangodb/kube-arangodb/pkg/util/errors" + "github.com/arangodb/kube-arangodb/pkg/util/k8sutil/inspector/service" - "github.com/arangodb/kube-arangodb/pkg/deployment/resources/inspector" + "github.com/arangodb/kube-arangodb/pkg/util/errors" v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -75,7 +75,7 @@ func CreateExporterClientServiceName(deploymentName string) string { } // CreateExporterService -func CreateExporterService(cachedStatus inspector.Inspector, svcs ServiceInterface, deployment metav1.Object, owner metav1.OwnerReference) (string, bool, error) { +func CreateExporterService(cachedStatus service.Inspector, svcs ServiceInterface, deployment metav1.Object, owner metav1.OwnerReference) (string, bool, error) { deploymentName := deployment.GetName() svcName := CreateExporterClientServiceName(deploymentName) From 43d23d21e560db017a4c3a785b187ec05c8df5cf Mon Sep 17 00:00:00 2001 From: ajanikow <12255597+ajanikow@users.noreply.github.com> Date: Fri, 5 Mar 2021 01:22:39 +0000 Subject: [PATCH 2/5] Fix typo in CRD --- chart/kube-arangodb-crd/templates/member.yaml | 2 +- chart/kube-arangodb/crds/member.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/chart/kube-arangodb-crd/templates/member.yaml b/chart/kube-arangodb-crd/templates/member.yaml index 2201b1bea..eb20e10b5 100644 --- a/chart/kube-arangodb-crd/templates/member.yaml +++ b/chart/kube-arangodb-crd/templates/member.yaml @@ -1,7 +1,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: - name: arangomembmers.database.arangodb.com + name: arangomembers.database.arangodb.com labels: app.kubernetes.io/name: {{ template "kube-arangodb-crd.name" . }} helm.sh/chart: {{ .Chart.Name }}-{{ .Chart.Version }} diff --git a/chart/kube-arangodb/crds/member.yaml b/chart/kube-arangodb/crds/member.yaml index f161b0e88..2254f8c82 100644 --- a/chart/kube-arangodb/crds/member.yaml +++ b/chart/kube-arangodb/crds/member.yaml @@ -1,7 +1,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: - name: arangomembmers.database.arangodb.com + name: arangomembers.database.arangodb.com spec: group: database.arangodb.com names: From a87cb3c9d440db866585e3c801d99272bd2d37a2 Mon Sep 17 00:00:00 2001 From: ajanikow <12255597+ajanikow@users.noreply.github.com> Date: Fri, 5 Mar 2021 10:53:39 +0000 Subject: [PATCH 3/5] Create ArangoMembers --- Makefile | 2 +- pkg/apis/deployment/v1/arango_member.go | 5 +- .../spec.go => v1/arango_member_spec.go} | 7 +- .../status.go => v1/arango_member_status.go} | 4 +- pkg/apis/deployment/v1/member/doc.go | 25 ------- .../v1/member/zz_generated.deepcopy.go | 66 ------------------- pkg/apis/deployment/v1/server_group.go | 20 +++++- .../deployment/v1/zz_generated.deepcopy.go | 37 +++++++++++ pkg/apis/deployment/v2alpha1/arango_member.go | 5 +- .../arango_member_spec.go} | 7 +- .../arango_member_status.go} | 4 +- pkg/apis/deployment/v2alpha1/member/doc.go | 25 ------- .../v2alpha1/member/zz_generated.deepcopy.go | 66 ------------------- pkg/apis/deployment/v2alpha1/register.go | 2 + pkg/apis/deployment/v2alpha1/server_group.go | 20 +++++- .../v2alpha1/zz_generated.deepcopy.go | 37 +++++++++++ pkg/deployment/deployment_inspector.go | 4 ++ pkg/deployment/resources/member_cleanup.go | 60 +++++++++++++++++ 18 files changed, 197 insertions(+), 199 deletions(-) rename pkg/apis/deployment/{v2alpha1/member/spec.go => v1/arango_member_spec.go} (88%) rename pkg/apis/deployment/{v2alpha1/member/status.go => v1/arango_member_status.go} (94%) delete mode 100644 pkg/apis/deployment/v1/member/doc.go delete mode 100644 pkg/apis/deployment/v1/member/zz_generated.deepcopy.go rename pkg/apis/deployment/{v1/member/spec.go => v2alpha1/arango_member_spec.go} (87%) rename pkg/apis/deployment/{v1/member/status.go => v2alpha1/arango_member_status.go} (93%) delete mode 100644 pkg/apis/deployment/v2alpha1/member/doc.go delete mode 100644 pkg/apis/deployment/v2alpha1/member/zz_generated.deepcopy.go diff --git a/Makefile b/Makefile index 4a6e737e4..5f5700f8d 100644 --- a/Makefile +++ b/Makefile @@ -249,7 +249,7 @@ update-generated: "deepcopy" \ "github.com/arangodb/kube-arangodb/pkg/generated" \ "github.com/arangodb/kube-arangodb/pkg/apis" \ - "shared:v1 deployment:v1/member deployment:v2alpha1/member" \ + "shared:v1" \ --go-header-file "./tools/codegen/boilerplate.go.txt" \ $(VERIFYARGS) diff --git a/pkg/apis/deployment/v1/arango_member.go b/pkg/apis/deployment/v1/arango_member.go index 47638d849..fd2986295 100644 --- a/pkg/apis/deployment/v1/arango_member.go +++ b/pkg/apis/deployment/v1/arango_member.go @@ -23,7 +23,6 @@ package v1 import ( - "github.com/arangodb/kube-arangodb/pkg/apis/deployment/v1/member" meta "k8s.io/apimachinery/pkg/apis/meta/v1" ) @@ -45,6 +44,6 @@ type ArangoMemberList struct { type ArangoMember struct { meta.TypeMeta `json:",inline"` meta.ObjectMeta `json:"metadata,omitempty"` - Spec member.Spec `json:"spec,omitempty"` - Status member.Status `json:"status,omitempty"` + Spec ArangoMemberSpec `json:"spec,omitempty"` + Status ArangoMemberStatus `json:"status,omitempty"` } diff --git a/pkg/apis/deployment/v2alpha1/member/spec.go b/pkg/apis/deployment/v1/arango_member_spec.go similarity index 88% rename from pkg/apis/deployment/v2alpha1/member/spec.go rename to pkg/apis/deployment/v1/arango_member_spec.go index abee9f882..4fb582a43 100644 --- a/pkg/apis/deployment/v2alpha1/member/spec.go +++ b/pkg/apis/deployment/v1/arango_member_spec.go @@ -20,11 +20,14 @@ // Author Adam Janikowski // -package member +package v1 import core "k8s.io/api/core/v1" -type Spec struct { +type ArangoMemberSpec struct { + Group ServerGroup `json:"group,omitempty"` + ID string `json:"id,omitempty"` + Template *core.PodTemplate `json:"template,omitempty"` TemplateChecksum string `json:"templateChecksum,omitempty"` } diff --git a/pkg/apis/deployment/v2alpha1/member/status.go b/pkg/apis/deployment/v1/arango_member_status.go similarity index 94% rename from pkg/apis/deployment/v2alpha1/member/status.go rename to pkg/apis/deployment/v1/arango_member_status.go index 10f53c143..00d1a9c58 100644 --- a/pkg/apis/deployment/v2alpha1/member/status.go +++ b/pkg/apis/deployment/v1/arango_member_status.go @@ -20,7 +20,7 @@ // Author Adam Janikowski // -package member +package v1 -type Status struct { +type ArangoMemberStatus struct { } diff --git a/pkg/apis/deployment/v1/member/doc.go b/pkg/apis/deployment/v1/member/doc.go deleted file mode 100644 index 9a20dbdfd..000000000 --- a/pkg/apis/deployment/v1/member/doc.go +++ /dev/null @@ -1,25 +0,0 @@ -// -// DISCLAIMER -// -// Copyright 2021 ArangoDB GmbH, Cologne, Germany -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -// Copyright holder is ArangoDB GmbH, Cologne, Germany -// -// Author Adam Janikowski -// - -// +k8s:deepcopy-gen=package -// +groupName=database.arangodb.com -package member diff --git a/pkg/apis/deployment/v1/member/zz_generated.deepcopy.go b/pkg/apis/deployment/v1/member/zz_generated.deepcopy.go deleted file mode 100644 index fa8e07cb0..000000000 --- a/pkg/apis/deployment/v1/member/zz_generated.deepcopy.go +++ /dev/null @@ -1,66 +0,0 @@ -// +build !ignore_autogenerated - -// -// DISCLAIMER -// -// Copyright 2020 ArangoDB GmbH, Cologne, Germany -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -// Copyright holder is ArangoDB GmbH, Cologne, Germany -// - -// Code generated by deepcopy-gen. DO NOT EDIT. - -package member - -import ( - v1 "k8s.io/api/core/v1" -) - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *Spec) DeepCopyInto(out *Spec) { - *out = *in - if in.Template != nil { - in, out := &in.Template, &out.Template - *out = new(v1.PodTemplate) - (*in).DeepCopyInto(*out) - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Spec. -func (in *Spec) DeepCopy() *Spec { - if in == nil { - return nil - } - out := new(Spec) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *Status) DeepCopyInto(out *Status) { - *out = *in - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Status. -func (in *Status) DeepCopy() *Status { - if in == nil { - return nil - } - out := new(Status) - in.DeepCopyInto(out) - return out -} diff --git a/pkg/apis/deployment/v1/server_group.go b/pkg/apis/deployment/v1/server_group.go index 2d89d4293..a6e7afc8f 100644 --- a/pkg/apis/deployment/v1/server_group.go +++ b/pkg/apis/deployment/v1/server_group.go @@ -22,10 +22,28 @@ package v1 -import "time" +import ( + "time" +) type ServerGroup int +func (g *ServerGroup) UnmarshalJSON(bytes []byte) error { + if bytes == nil { + *g = ServerGroupUnknown + return nil + } + + *g = ServerGroupFromRole(string(bytes)) + + return nil +} + +func (g ServerGroup) MarshalJSON() ([]byte, error) { + s := g.AsRole() + return []byte(s), nil +} + const ( ServerGroupUnknown ServerGroup = 0 ServerGroupSingle ServerGroup = 1 diff --git a/pkg/apis/deployment/v1/zz_generated.deepcopy.go b/pkg/apis/deployment/v1/zz_generated.deepcopy.go index 63ede202e..87610eab5 100644 --- a/pkg/apis/deployment/v1/zz_generated.deepcopy.go +++ b/pkg/apis/deployment/v1/zz_generated.deepcopy.go @@ -204,6 +204,43 @@ func (in *ArangoMemberList) DeepCopyObject() runtime.Object { return nil } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ArangoMemberSpec) DeepCopyInto(out *ArangoMemberSpec) { + *out = *in + if in.Template != nil { + in, out := &in.Template, &out.Template + *out = new(corev1.PodTemplate) + (*in).DeepCopyInto(*out) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ArangoMemberSpec. +func (in *ArangoMemberSpec) DeepCopy() *ArangoMemberSpec { + if in == nil { + return nil + } + out := new(ArangoMemberSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ArangoMemberStatus) DeepCopyInto(out *ArangoMemberStatus) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ArangoMemberStatus. +func (in *ArangoMemberStatus) DeepCopy() *ArangoMemberStatus { + if in == nil { + return nil + } + out := new(ArangoMemberStatus) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *AuthenticationSpec) DeepCopyInto(out *AuthenticationSpec) { *out = *in diff --git a/pkg/apis/deployment/v2alpha1/arango_member.go b/pkg/apis/deployment/v2alpha1/arango_member.go index aa425ea9d..455377c01 100644 --- a/pkg/apis/deployment/v2alpha1/arango_member.go +++ b/pkg/apis/deployment/v2alpha1/arango_member.go @@ -23,7 +23,6 @@ package v2alpha1 import ( - "github.com/arangodb/kube-arangodb/pkg/apis/deployment/v1/member" meta "k8s.io/apimachinery/pkg/apis/meta/v1" ) @@ -45,6 +44,6 @@ type ArangoMemberList struct { type ArangoMember struct { meta.TypeMeta `json:",inline"` meta.ObjectMeta `json:"metadata,omitempty"` - Spec member.Spec `json:"spec,omitempty"` - Status member.Status `json:"status,omitempty"` + Spec ArangoMemberSpec `json:"spec,omitempty"` + Status ArangoMemberStatus `json:"status,omitempty"` } diff --git a/pkg/apis/deployment/v1/member/spec.go b/pkg/apis/deployment/v2alpha1/arango_member_spec.go similarity index 87% rename from pkg/apis/deployment/v1/member/spec.go rename to pkg/apis/deployment/v2alpha1/arango_member_spec.go index abee9f882..46c630133 100644 --- a/pkg/apis/deployment/v1/member/spec.go +++ b/pkg/apis/deployment/v2alpha1/arango_member_spec.go @@ -20,11 +20,14 @@ // Author Adam Janikowski // -package member +package v2alpha1 import core "k8s.io/api/core/v1" -type Spec struct { +type ArangoMemberSpec struct { + Group ServerGroup `json:"group,omitempty"` + ID string `json:"id,omitempty"` + Template *core.PodTemplate `json:"template,omitempty"` TemplateChecksum string `json:"templateChecksum,omitempty"` } diff --git a/pkg/apis/deployment/v1/member/status.go b/pkg/apis/deployment/v2alpha1/arango_member_status.go similarity index 93% rename from pkg/apis/deployment/v1/member/status.go rename to pkg/apis/deployment/v2alpha1/arango_member_status.go index 10f53c143..e06a1e93b 100644 --- a/pkg/apis/deployment/v1/member/status.go +++ b/pkg/apis/deployment/v2alpha1/arango_member_status.go @@ -20,7 +20,7 @@ // Author Adam Janikowski // -package member +package v2alpha1 -type Status struct { +type ArangoMemberStatus struct { } diff --git a/pkg/apis/deployment/v2alpha1/member/doc.go b/pkg/apis/deployment/v2alpha1/member/doc.go deleted file mode 100644 index 9a20dbdfd..000000000 --- a/pkg/apis/deployment/v2alpha1/member/doc.go +++ /dev/null @@ -1,25 +0,0 @@ -// -// DISCLAIMER -// -// Copyright 2021 ArangoDB GmbH, Cologne, Germany -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -// Copyright holder is ArangoDB GmbH, Cologne, Germany -// -// Author Adam Janikowski -// - -// +k8s:deepcopy-gen=package -// +groupName=database.arangodb.com -package member diff --git a/pkg/apis/deployment/v2alpha1/member/zz_generated.deepcopy.go b/pkg/apis/deployment/v2alpha1/member/zz_generated.deepcopy.go deleted file mode 100644 index fa8e07cb0..000000000 --- a/pkg/apis/deployment/v2alpha1/member/zz_generated.deepcopy.go +++ /dev/null @@ -1,66 +0,0 @@ -// +build !ignore_autogenerated - -// -// DISCLAIMER -// -// Copyright 2020 ArangoDB GmbH, Cologne, Germany -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -// Copyright holder is ArangoDB GmbH, Cologne, Germany -// - -// Code generated by deepcopy-gen. DO NOT EDIT. - -package member - -import ( - v1 "k8s.io/api/core/v1" -) - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *Spec) DeepCopyInto(out *Spec) { - *out = *in - if in.Template != nil { - in, out := &in.Template, &out.Template - *out = new(v1.PodTemplate) - (*in).DeepCopyInto(*out) - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Spec. -func (in *Spec) DeepCopy() *Spec { - if in == nil { - return nil - } - out := new(Spec) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *Status) DeepCopyInto(out *Status) { - *out = *in - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Status. -func (in *Status) DeepCopy() *Status { - if in == nil { - return nil - } - out := new(Status) - in.DeepCopyInto(out) - return out -} diff --git a/pkg/apis/deployment/v2alpha1/register.go b/pkg/apis/deployment/v2alpha1/register.go index f0e26301a..9d718d8d0 100644 --- a/pkg/apis/deployment/v2alpha1/register.go +++ b/pkg/apis/deployment/v2alpha1/register.go @@ -50,6 +50,8 @@ func addKnownTypes(s *runtime.Scheme) error { s.AddKnownTypes(SchemeGroupVersion, &ArangoDeployment{}, &ArangoDeploymentList{}, + &ArangoMember{}, + &ArangoMemberList{}, ) metav1.AddToGroupVersion(s, SchemeGroupVersion) return nil diff --git a/pkg/apis/deployment/v2alpha1/server_group.go b/pkg/apis/deployment/v2alpha1/server_group.go index b35d10474..105b2695d 100644 --- a/pkg/apis/deployment/v2alpha1/server_group.go +++ b/pkg/apis/deployment/v2alpha1/server_group.go @@ -22,10 +22,28 @@ package v2alpha1 -import "time" +import ( + "time" +) type ServerGroup int +func (g *ServerGroup) UnmarshalJSON(bytes []byte) error { + if bytes == nil { + *g = ServerGroupUnknown + return nil + } + + *g = ServerGroupFromRole(string(bytes)) + + return nil +} + +func (g ServerGroup) MarshalJSON() ([]byte, error) { + s := g.AsRole() + return []byte(s), nil +} + const ( ServerGroupUnknown ServerGroup = 0 ServerGroupSingle ServerGroup = 1 diff --git a/pkg/apis/deployment/v2alpha1/zz_generated.deepcopy.go b/pkg/apis/deployment/v2alpha1/zz_generated.deepcopy.go index 4f83f1c00..799161572 100644 --- a/pkg/apis/deployment/v2alpha1/zz_generated.deepcopy.go +++ b/pkg/apis/deployment/v2alpha1/zz_generated.deepcopy.go @@ -204,6 +204,43 @@ func (in *ArangoMemberList) DeepCopyObject() runtime.Object { return nil } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ArangoMemberSpec) DeepCopyInto(out *ArangoMemberSpec) { + *out = *in + if in.Template != nil { + in, out := &in.Template, &out.Template + *out = new(v1.PodTemplate) + (*in).DeepCopyInto(*out) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ArangoMemberSpec. +func (in *ArangoMemberSpec) DeepCopy() *ArangoMemberSpec { + if in == nil { + return nil + } + out := new(ArangoMemberSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ArangoMemberStatus) DeepCopyInto(out *ArangoMemberStatus) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ArangoMemberStatus. +func (in *ArangoMemberStatus) DeepCopy() *ArangoMemberStatus { + if in == nil { + return nil + } + out := new(ArangoMemberStatus) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *AuthenticationSpec) DeepCopyInto(out *AuthenticationSpec) { *out = *in diff --git a/pkg/deployment/deployment_inspector.go b/pkg/deployment/deployment_inspector.go index 950b4a04a..cef2e895e 100644 --- a/pkg/deployment/deployment_inspector.go +++ b/pkg/deployment/deployment_inspector.go @@ -175,6 +175,10 @@ func (d *Deployment) inspectDeploymentWithError(ctx context.Context, lastInterva return minInspectionInterval, errors.Wrapf(err, "Service creation failed") } + if err := d.resources.EnsureArangoMembers(cachedStatus); err != nil { + return minInspectionInterval, errors.Wrapf(err, "ArangoMember creation failed") + } + // Inspect secret hashes if err := d.resources.ValidateSecretHashes(cachedStatus); err != nil { return minInspectionInterval, errors.Wrapf(err, "Secret hash validation failed") diff --git a/pkg/deployment/resources/member_cleanup.go b/pkg/deployment/resources/member_cleanup.go index 6b21ff8ca..0850f2f54 100644 --- a/pkg/deployment/resources/member_cleanup.go +++ b/pkg/deployment/resources/member_cleanup.go @@ -23,6 +23,8 @@ package resources import ( + inspectorInterface "github.com/arangodb/kube-arangodb/pkg/util/k8sutil/inspector" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "time" "github.com/arangodb/kube-arangodb/pkg/util/errors" @@ -159,3 +161,61 @@ func (r *Resources) cleanupRemovedClusterMembers() error { return nil } + +func (r *Resources) EnsureArangoMembers(cachedStatus inspectorInterface.Inspector) error { + // Create all missing arangomembers + + s, _ :=r.context.GetStatus() + obj := r.context.GetAPIObject() + + if err := s.Members.ForeachServerGroup(func(group api.ServerGroup, list api.MemberStatusList) error { + for _, member := range list { + name := k8sutil.CreatePodHostName(r.context.GetAPIObject().GetName(), group.AsRole(), member.ID) + + if _, ok := cachedStatus.ArangoMember(name); !ok { + // Create ArangoMember + a := api.ArangoMember{ + ObjectMeta: metav1.ObjectMeta{ + Name: name, + Namespace: r.context.GetNamespace(), + }, + Spec: api.ArangoMemberSpec{ + Group: group, + ID: member.ID, + }, + } + + if _, err := r.context.GetArangoCli().DatabaseV1().ArangoMembers(obj.GetNamespace()).Create(&a); err != nil { + return err + } + + return errors.Reconcile() + } + } + + return nil + }); err != nil { + return err + } + + if err := cachedStatus.IterateArangoMembers(func(member *api.ArangoMember) error { + _, g, ok := s.Members.ElementByID(member.Spec.ID) + + if !ok || g != member.Spec.Group { + // Remove member + if err := r.context.GetArangoCli().DatabaseV1().ArangoMembers(obj.GetNamespace()).Delete(member.GetName(), &metav1.DeleteOptions{}); err != nil { + if !k8sutil.IsNotFound(err) { + return err + } + } + + return errors.Reconcile() + } + + return nil + }); err != nil { + return err + } + + return nil +} \ No newline at end of file From 39f27626f6aa0cae293cd5ee8104df205b33da20 Mon Sep 17 00:00:00 2001 From: ajanikow <12255597+ajanikow@users.noreply.github.com> Date: Tue, 9 Mar 2021 11:22:21 +0000 Subject: [PATCH 4/5] Manage ArangoMember withing deployment --- pkg/apis/deployment/definitions.go | 4 + pkg/apis/deployment/v1/arango_member.go | 15 +++ pkg/apis/deployment/v1/arango_member_spec.go | 2 +- pkg/apis/deployment/v1/member_status.go | 7 ++ pkg/apis/deployment/v1/server_group.go | 12 ++- .../deployment/v2alpha1/arango_member_spec.go | 2 +- pkg/deployment/deployment_inspector.go | 8 +- pkg/deployment/pod/builder.go | 19 ++-- pkg/deployment/pod/tls.go | 2 +- pkg/deployment/resources/member_cleanup.go | 15 +-- pkg/deployment/resources/pod_creator.go | 9 ++ .../resources/pod_creator_arangod.go | 20 ++-- pkg/deployment/resources/pod_creator_sync.go | 1 + pkg/deployment/resources/secrets.go | 21 ++++- pkg/deployment/resources/services.go | 93 +++++++++++++++++-- pkg/util/k8sutil/dns.go | 12 +++ pkg/util/k8sutil/pods.go | 9 +- pkg/util/k8sutil/util.go | 11 +++ 18 files changed, 213 insertions(+), 49 deletions(-) diff --git a/pkg/apis/deployment/definitions.go b/pkg/apis/deployment/definitions.go index 5e28d21b6..9b6212c3d 100644 --- a/pkg/apis/deployment/definitions.go +++ b/pkg/apis/deployment/definitions.go @@ -27,6 +27,10 @@ const ( ArangoDeploymentResourceKind = "ArangoDeployment" ArangoDeploymentResourcePlural = "arangodeployments" + ArangoMemberCRDName = ArangoMemberResourcePlural + "." + ArangoDeploymentGroupName + ArangoMemberResourceKind = "ArangoMember" + ArangoMemberResourcePlural = "arangomembers" + ArangoDeploymentGroupName = "database.arangodb.com" ) diff --git a/pkg/apis/deployment/v1/arango_member.go b/pkg/apis/deployment/v1/arango_member.go index fd2986295..cab3dfdbb 100644 --- a/pkg/apis/deployment/v1/arango_member.go +++ b/pkg/apis/deployment/v1/arango_member.go @@ -23,6 +23,7 @@ package v1 import ( + "github.com/arangodb/kube-arangodb/pkg/apis/deployment" meta "k8s.io/apimachinery/pkg/apis/meta/v1" ) @@ -47,3 +48,17 @@ type ArangoMember struct { Spec ArangoMemberSpec `json:"spec,omitempty"` Status ArangoMemberStatus `json:"status,omitempty"` } + +// AsOwner creates an OwnerReference for the given member +func (a *ArangoMember) AsOwner() meta.OwnerReference { + trueVar := true + return meta.OwnerReference{ + APIVersion: SchemeGroupVersion.String(), + Kind: deployment.ArangoMemberResourceKind, + Name: a.Name, + UID: a.UID, + Controller: &trueVar, + // For now BlockOwnerDeletion does not work on OpenShift, so we leave it out. + //BlockOwnerDeletion: &trueVar, + } +} diff --git a/pkg/apis/deployment/v1/arango_member_spec.go b/pkg/apis/deployment/v1/arango_member_spec.go index 4fb582a43..351448615 100644 --- a/pkg/apis/deployment/v1/arango_member_spec.go +++ b/pkg/apis/deployment/v1/arango_member_spec.go @@ -26,7 +26,7 @@ import core "k8s.io/api/core/v1" type ArangoMemberSpec struct { Group ServerGroup `json:"group,omitempty"` - ID string `json:"id,omitempty"` + ID string `json:"id,omitempty"` Template *core.PodTemplate `json:"template,omitempty"` TemplateChecksum string `json:"templateChecksum,omitempty"` diff --git a/pkg/apis/deployment/v1/member_status.go b/pkg/apis/deployment/v1/member_status.go index 0b1065a07..8e98f1bc6 100644 --- a/pkg/apis/deployment/v1/member_status.go +++ b/pkg/apis/deployment/v1/member_status.go @@ -26,6 +26,8 @@ import ( "reflect" "time" + "github.com/arangodb/kube-arangodb/pkg/util/k8sutil" + "k8s.io/apimachinery/pkg/types" driver "github.com/arangodb/go-driver" @@ -155,3 +157,8 @@ func (s MemberStatus) IsNotReadySince(timestamp time.Time) bool { // A return s.CreatedAt.Time.Before(timestamp) } + +// ArangoMemberName create member name from given member +func (s MemberStatus) ArangoMemberName(deploymentName string, group ServerGroup) string { + return k8sutil.CreatePodHostName(deploymentName, group.AsRole(), s.ID) +} diff --git a/pkg/apis/deployment/v1/server_group.go b/pkg/apis/deployment/v1/server_group.go index a6e7afc8f..153ef1a31 100644 --- a/pkg/apis/deployment/v1/server_group.go +++ b/pkg/apis/deployment/v1/server_group.go @@ -23,6 +23,7 @@ package v1 import ( + "encoding/json" "time" ) @@ -34,14 +35,19 @@ func (g *ServerGroup) UnmarshalJSON(bytes []byte) error { return nil } - *g = ServerGroupFromRole(string(bytes)) + var s string + + if err := json.Unmarshal(bytes, &s); err != nil { + return err + } + + *g = ServerGroupFromRole(s) return nil } func (g ServerGroup) MarshalJSON() ([]byte, error) { - s := g.AsRole() - return []byte(s), nil + return json.Marshal(g.AsRole()) } const ( diff --git a/pkg/apis/deployment/v2alpha1/arango_member_spec.go b/pkg/apis/deployment/v2alpha1/arango_member_spec.go index 46c630133..9d124334d 100644 --- a/pkg/apis/deployment/v2alpha1/arango_member_spec.go +++ b/pkg/apis/deployment/v2alpha1/arango_member_spec.go @@ -26,7 +26,7 @@ import core "k8s.io/api/core/v1" type ArangoMemberSpec struct { Group ServerGroup `json:"group,omitempty"` - ID string `json:"id,omitempty"` + ID string `json:"id,omitempty"` Template *core.PodTemplate `json:"template,omitempty"` TemplateChecksum string `json:"templateChecksum,omitempty"` diff --git a/pkg/deployment/deployment_inspector.go b/pkg/deployment/deployment_inspector.go index cef2e895e..184fc707b 100644 --- a/pkg/deployment/deployment_inspector.go +++ b/pkg/deployment/deployment_inspector.go @@ -167,16 +167,16 @@ func (d *Deployment) inspectDeploymentWithError(ctx context.Context, lastInterva nextInterval = nextInterval.ReduceTo(x) } - if err := d.resources.EnsureSecrets(d.deps.Log, cachedStatus); err != nil { - return minInspectionInterval, errors.Wrapf(err, "Secret creation failed") + if err := d.resources.EnsureArangoMembers(cachedStatus); err != nil { + return minInspectionInterval, errors.Wrapf(err, "ArangoMember creation failed") } if err := d.resources.EnsureServices(cachedStatus); err != nil { return minInspectionInterval, errors.Wrapf(err, "Service creation failed") } - if err := d.resources.EnsureArangoMembers(cachedStatus); err != nil { - return minInspectionInterval, errors.Wrapf(err, "ArangoMember creation failed") + if err := d.resources.EnsureSecrets(d.deps.Log, cachedStatus); err != nil { + return minInspectionInterval, errors.Wrapf(err, "Secret creation failed") } // Inspect secret hashes diff --git a/pkg/deployment/pod/builder.go b/pkg/deployment/pod/builder.go index cb8e1bc44..6c4da686c 100644 --- a/pkg/deployment/pod/builder.go +++ b/pkg/deployment/pod/builder.go @@ -32,15 +32,16 @@ import ( ) type Input struct { - ApiObject meta.Object - Deployment deploymentApi.DeploymentSpec - Status deploymentApi.DeploymentStatus - GroupSpec deploymentApi.ServerGroupSpec - Group deploymentApi.ServerGroup - Version driver.Version - Member deploymentApi.MemberStatus - Enterprise bool - AutoUpgrade bool + ApiObject meta.Object + Deployment deploymentApi.DeploymentSpec + Status deploymentApi.DeploymentStatus + GroupSpec deploymentApi.ServerGroupSpec + Group deploymentApi.ServerGroup + Version driver.Version + Member deploymentApi.MemberStatus + ArangoMember deploymentApi.ArangoMember + Enterprise bool + AutoUpgrade bool } type Builder interface { diff --git a/pkg/deployment/pod/tls.go b/pkg/deployment/pod/tls.go index afcb6ccf7..a17708b39 100644 --- a/pkg/deployment/pod/tls.go +++ b/pkg/deployment/pod/tls.go @@ -46,7 +46,7 @@ func IsTLSEnabled(i Input) bool { } func GetTLSKeyfileSecretName(i Input) string { - return k8sutil.CreateTLSKeyfileSecretName(i.ApiObject.GetName(), i.Group.AsRole(), i.Member.ID) + return k8sutil.AppendTLSKeyfileSecretPostfix(i.ArangoMember.GetName()) } func TLS() Builder { diff --git a/pkg/deployment/resources/member_cleanup.go b/pkg/deployment/resources/member_cleanup.go index 0850f2f54..361036551 100644 --- a/pkg/deployment/resources/member_cleanup.go +++ b/pkg/deployment/resources/member_cleanup.go @@ -23,9 +23,10 @@ package resources import ( + "time" + inspectorInterface "github.com/arangodb/kube-arangodb/pkg/util/k8sutil/inspector" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "time" "github.com/arangodb/kube-arangodb/pkg/util/errors" @@ -165,23 +166,23 @@ func (r *Resources) cleanupRemovedClusterMembers() error { func (r *Resources) EnsureArangoMembers(cachedStatus inspectorInterface.Inspector) error { // Create all missing arangomembers - s, _ :=r.context.GetStatus() + s, _ := r.context.GetStatus() obj := r.context.GetAPIObject() if err := s.Members.ForeachServerGroup(func(group api.ServerGroup, list api.MemberStatusList) error { for _, member := range list { - name := k8sutil.CreatePodHostName(r.context.GetAPIObject().GetName(), group.AsRole(), member.ID) + name := member.ArangoMemberName(r.context.GetAPIObject().GetName(), group) if _, ok := cachedStatus.ArangoMember(name); !ok { // Create ArangoMember a := api.ArangoMember{ ObjectMeta: metav1.ObjectMeta{ - Name: name, + Name: name, Namespace: r.context.GetNamespace(), }, - Spec: api.ArangoMemberSpec{ + Spec: api.ArangoMemberSpec{ Group: group, - ID: member.ID, + ID: member.ID, }, } @@ -218,4 +219,4 @@ func (r *Resources) EnsureArangoMembers(cachedStatus inspectorInterface.Inspecto } return nil -} \ No newline at end of file +} diff --git a/pkg/deployment/resources/pod_creator.go b/pkg/deployment/resources/pod_creator.go index 5b38b1676..69de71c1e 100644 --- a/pkg/deployment/resources/pod_creator.go +++ b/pkg/deployment/resources/pod_creator.go @@ -300,6 +300,13 @@ func (r *Resources) RenderPodForMember(cachedStatus inspectorInterface.Inspector ns := r.context.GetNamespace() secrets := kubecli.CoreV1().Secrets(ns) + memberName := m.ArangoMemberName(r.context.GetAPIObject().GetName(), group) + + member, ok := cachedStatus.ArangoMember(memberName) + if !ok { + return nil, errors.Newf("Service of member %s not found", memberName) + } + // Update pod name role := group.AsRole() roleAbbr := group.AsRoleAbbreviated() @@ -322,6 +329,7 @@ func (r *Resources) RenderPodForMember(cachedStatus inspectorInterface.Inspector autoUpgrade: autoUpgrade, deploymentStatus: status, id: memberID, + arangoMember: *member, } input := memberPod.AsInput() @@ -388,6 +396,7 @@ func (r *Resources) RenderPodForMember(cachedStatus inspectorInterface.Inspector group: group, resources: r, imageInfo: imageInfo, + arangoMember: *member, } return RenderArangoPod(apiObject, role, m.ID, m.PodName, args, &memberSyncPod) diff --git a/pkg/deployment/resources/pod_creator_arangod.go b/pkg/deployment/resources/pod_creator_arangod.go index b4b3a0432..bb4d50ddc 100644 --- a/pkg/deployment/resources/pod_creator_arangod.go +++ b/pkg/deployment/resources/pod_creator_arangod.go @@ -57,6 +57,7 @@ type MemberArangoDPod struct { spec api.DeploymentSpec deploymentStatus api.DeploymentStatus group api.ServerGroup + arangoMember api.ArangoMember context Context resources *Resources imageInfo api.ImageInfo @@ -206,15 +207,16 @@ func (a *ArangoDContainer) GetImagePullPolicy() core.PullPolicy { func (m *MemberArangoDPod) AsInput() pod.Input { return pod.Input{ - ApiObject: m.context.GetAPIObject(), - Deployment: m.spec, - Status: m.deploymentStatus, - Group: m.group, - GroupSpec: m.groupSpec, - Version: m.imageInfo.ArangoDBVersion, - Enterprise: m.imageInfo.Enterprise, - AutoUpgrade: m.autoUpgrade, - Member: m.status, + ApiObject: m.context.GetAPIObject(), + Deployment: m.spec, + Status: m.deploymentStatus, + Group: m.group, + GroupSpec: m.groupSpec, + Version: m.imageInfo.ArangoDBVersion, + Enterprise: m.imageInfo.Enterprise, + AutoUpgrade: m.autoUpgrade, + Member: m.status, + ArangoMember: m.arangoMember, } } diff --git a/pkg/deployment/resources/pod_creator_sync.go b/pkg/deployment/resources/pod_creator_sync.go index aa564a4c7..aabba473c 100644 --- a/pkg/deployment/resources/pod_creator_sync.go +++ b/pkg/deployment/resources/pod_creator_sync.go @@ -61,6 +61,7 @@ type MemberSyncPod struct { groupSpec api.ServerGroupSpec spec api.DeploymentSpec group api.ServerGroup + arangoMember api.ArangoMember resources *Resources imageInfo api.ImageInfo } diff --git a/pkg/deployment/resources/secrets.go b/pkg/deployment/resources/secrets.go index ebbc21414..93abc0eb1 100644 --- a/pkg/deployment/resources/secrets.go +++ b/pkg/deployment/resources/secrets.go @@ -129,23 +129,38 @@ func (r *Resources) EnsureSecrets(log zerolog.Logger, cachedStatus inspectorInte role := group.AsRole() for _, m := range list { - tlsKeyfileSecretName := k8sutil.CreateTLSKeyfileSecretName(apiObject.GetName(), role, m.ID) + memberName := m.ArangoMemberName(r.context.GetAPIObject().GetName(), group) + + member, ok := cachedStatus.ArangoMember(memberName) + if !ok { + return errors.Newf("Member %s not found", memberName) + } + + service, ok := cachedStatus.Service(memberName) + if !ok { + return errors.Newf("Service of member %s not found", memberName) + } + + tlsKeyfileSecretName := k8sutil.AppendTLSKeyfileSecretPostfix(member.GetName()) if _, exists := cachedStatus.Secret(tlsKeyfileSecretName); !exists { serverNames := []string{ k8sutil.CreateDatabaseClientServiceDNSName(apiObject), k8sutil.CreatePodDNSName(apiObject, role, m.ID), + k8sutil.CreateServiceDNSName(service), + service.Spec.ClusterIP, } if spec.ClusterDomain != nil { serverNames = append(serverNames, k8sutil.CreateDatabaseClientServiceDNSNameWithDomain(apiObject, spec.ClusterDomain), - k8sutil.CreatePodDNSNameWithDomain(apiObject, spec.ClusterDomain, role, m.ID)) + k8sutil.CreatePodDNSNameWithDomain(apiObject, spec.ClusterDomain, role, m.ID), + k8sutil.CreateServiceDNSNameWithDomain(service, spec.ClusterDomain)) } if ip := spec.ExternalAccess.GetLoadBalancerIP(); ip != "" { serverNames = append(serverNames, ip) } - owner := apiObject.AsOwner() + owner := member.AsOwner() if err := r.refreshCache(cachedStatus, createTLSServerCertificate(log, secrets, serverNames, spec.TLS, tlsKeyfileSecretName, &owner)); err != nil && !k8sutil.IsAlreadyExists(err) { return errors.WithStack(errors.Wrapf(err, "Failed to create TLS keyfile secret")) } diff --git a/pkg/deployment/resources/services.go b/pkg/deployment/resources/services.go index 823fe5ca3..90a0c3b14 100644 --- a/pkg/deployment/resources/services.go +++ b/pkg/deployment/resources/services.go @@ -26,10 +26,13 @@ import ( "strings" "time" + "k8s.io/apimachinery/pkg/api/equality" + "k8s.io/apimachinery/pkg/util/intstr" + "github.com/arangodb/kube-arangodb/pkg/util/errors" inspectorInterface "github.com/arangodb/kube-arangodb/pkg/util/k8sutil/inspector" - v1 "k8s.io/api/core/v1" + core "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" api "github.com/arangodb/kube-arangodb/pkg/apis/deployment/v1" @@ -50,6 +53,7 @@ func (r *Resources) EnsureServices(cachedStatus inspectorInterface.Inspector) er start := time.Now() kubecli := r.context.GetKubeCli() apiObject := r.context.GetAPIObject() + status, _ := r.context.GetStatus() deploymentName := apiObject.GetName() ns := apiObject.GetNamespace() owner := apiObject.AsOwner() @@ -59,6 +63,77 @@ func (r *Resources) EnsureServices(cachedStatus inspectorInterface.Inspector) er // Fetch existing services svcs := kubecli.CoreV1().Services(ns) + + // Ensure member services + if err := status.Members.ForeachServerGroup(func(group api.ServerGroup, list api.MemberStatusList) error { + for _, m := range list { + memberName := m.ArangoMemberName(r.context.GetAPIObject().GetName(), group) + + member, ok := cachedStatus.ArangoMember(memberName) + if !ok { + return errors.Newf("Member %s not found", memberName) + } + + if s, ok := cachedStatus.Service(member.GetName()); !ok { + s = &core.Service{ + ObjectMeta: metav1.ObjectMeta{ + Name: member.GetName(), + Namespace: member.GetNamespace(), + }, + Spec: core.ServiceSpec{ + Type: core.ServiceTypeClusterIP, + Ports: []core.ServicePort{ + { + Name: "server", + Protocol: "TCP", + Port: k8sutil.ArangoPort, + TargetPort: intstr.IntOrString{IntVal: k8sutil.ArangoPort}, + }, + }, + PublishNotReadyAddresses: true, + Selector: k8sutil.LabelsForMember(deploymentName, group.AsRole(), m.ID), + }, + } + + if _, err := svcs.Create(s); err != nil { + if !k8sutil.IsConflict(err) { + return err + } + } + + return errors.Reconcile() + } else { + spec := s.Spec.DeepCopy() + + spec.Type = core.ServiceTypeClusterIP + spec.Ports = []core.ServicePort{ + { + Name: "server", + Protocol: "TCP", + Port: k8sutil.ArangoPort, + TargetPort: intstr.IntOrString{IntVal: k8sutil.ArangoPort}, + }, + } + spec.PublishNotReadyAddresses = true + spec.Selector = k8sutil.LabelsForMember(deploymentName, group.AsRole(), m.ID) + + if !equality.Semantic.DeepDerivative(*spec, s.Spec) { + s.Spec = *spec + + if _, err := svcs.Update(s); err != nil { + return err + } + + return errors.Reconcile() + } + } + } + + return nil + }); err != nil { + return err + } + // Headless service counterMetric.Inc() if _, exists := cachedStatus.Service(k8sutil.CreateHeadlessServiceName(deploymentName)); !exists { @@ -153,8 +228,8 @@ func (r *Resources) ensureExternalAccessServices(cachedStatus inspectorInterface nodePort := spec.GetNodePort() if spec.GetType().IsNone() { if noneIsClusterIP { - eaServiceType = v1.ServiceTypeClusterIP - if existing.Spec.Type != v1.ServiceTypeClusterIP { + eaServiceType = core.ServiceTypeClusterIP + if existing.Spec.Type != core.ServiceTypeClusterIP { deleteExternalAccessService = true // Remove the current and replace with proper one createExternalAccessService = true } @@ -164,24 +239,24 @@ func (r *Resources) ensureExternalAccessServices(cachedStatus inspectorInterface } } else if spec.GetType().IsAuto() { // Inspect existing service. - if existing.Spec.Type == v1.ServiceTypeLoadBalancer { + if existing.Spec.Type == core.ServiceTypeLoadBalancer { // See if LoadBalancer has been configured & the service is "old enough" oldEnoughTimestamp := time.Now().Add(-1 * time.Minute) // How long does the load-balancer provisioner have to act. if len(existing.Status.LoadBalancer.Ingress) == 0 && existing.GetObjectMeta().GetCreationTimestamp().Time.Before(oldEnoughTimestamp) { log.Info().Str("service", eaServiceName).Msgf("LoadBalancerIP of %s external access service is not set, switching to NodePort", title) createExternalAccessService = true - eaServiceType = v1.ServiceTypeNodePort + eaServiceType = core.ServiceTypeNodePort deleteExternalAccessService = true // Remove the LoadBalancer ex service, then add the NodePort one - } else if existing.Spec.Type == v1.ServiceTypeLoadBalancer && (loadBalancerIP != "" && existing.Spec.LoadBalancerIP != loadBalancerIP) { + } else if existing.Spec.Type == core.ServiceTypeLoadBalancer && (loadBalancerIP != "" && existing.Spec.LoadBalancerIP != loadBalancerIP) { deleteExternalAccessService = true // LoadBalancerIP is wrong, remove the current and replace with proper one createExternalAccessService = true - } else if existing.Spec.Type == v1.ServiceTypeNodePort && len(existing.Spec.Ports) == 1 && (nodePort != 0 && existing.Spec.Ports[0].NodePort != int32(nodePort)) { + } else if existing.Spec.Type == core.ServiceTypeNodePort && len(existing.Spec.Ports) == 1 && (nodePort != 0 && existing.Spec.Ports[0].NodePort != int32(nodePort)) { deleteExternalAccessService = true // NodePort is wrong, remove the current and replace with proper one createExternalAccessService = true } } } else if spec.GetType().IsLoadBalancer() { - if existing.Spec.Type != v1.ServiceTypeLoadBalancer || (loadBalancerIP != "" && existing.Spec.LoadBalancerIP != loadBalancerIP) { + if existing.Spec.Type != core.ServiceTypeLoadBalancer || (loadBalancerIP != "" && existing.Spec.LoadBalancerIP != loadBalancerIP) { deleteExternalAccessService = true // Remove the current and replace with proper one createExternalAccessService = true } @@ -190,7 +265,7 @@ func (r *Resources) ensureExternalAccessServices(cachedStatus inspectorInterface existing.Spec.LoadBalancerSourceRanges = loadBalancerSourceRanges } } else if spec.GetType().IsNodePort() { - if existing.Spec.Type != v1.ServiceTypeNodePort || len(existing.Spec.Ports) != 1 || (nodePort != 0 && existing.Spec.Ports[0].NodePort != int32(nodePort)) { + if existing.Spec.Type != core.ServiceTypeNodePort || len(existing.Spec.Ports) != 1 || (nodePort != 0 && existing.Spec.Ports[0].NodePort != int32(nodePort)) { deleteExternalAccessService = true // Remove the current and replace with proper one createExternalAccessService = true } diff --git a/pkg/util/k8sutil/dns.go b/pkg/util/k8sutil/dns.go index 96df25e9b..e6326b464 100644 --- a/pkg/util/k8sutil/dns.go +++ b/pkg/util/k8sutil/dns.go @@ -25,6 +25,8 @@ package k8sutil import ( "fmt" + core "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) @@ -48,6 +50,16 @@ func CreatePodDNSNameWithDomain(deployment metav1.Object, domain *string, role, return appendDeploymentClusterDomain(CreatePodDNSName(deployment, role, id), domain) } +// CreateServiceDNSName returns the DNS of a service. +func CreateServiceDNSName(svc *core.Service) string { + return fmt.Sprintf("%s.%s.svc", svc.GetName(), svc.GetNamespace()) +} + +// CreateServiceDNSNameWithDomain returns the DNS of a service extended with domain. +func CreateServiceDNSNameWithDomain(svc *core.Service, domain *string) string { + return appendDeploymentClusterDomain(CreateServiceDNSName(svc), domain) +} + // CreateDatabaseClientServiceDNSNameWithDomain returns the DNS of the database client service. func CreateDatabaseClientServiceDNSNameWithDomain(deployment metav1.Object, domain *string) string { return appendDeploymentClusterDomain(CreateDatabaseClientServiceDNSName(deployment), domain) diff --git a/pkg/util/k8sutil/pods.go b/pkg/util/k8sutil/pods.go index a512477e4..af43c3ade 100644 --- a/pkg/util/k8sutil/pods.go +++ b/pkg/util/k8sutil/pods.go @@ -194,7 +194,12 @@ func CreatePodHostName(deploymentName, role, id string) string { // CreateTLSKeyfileSecretName returns the name of the Secret that holds the TLS keyfile for a member with // a given id in a deployment with a given name. func CreateTLSKeyfileSecretName(deploymentName, role, id string) string { - return CreatePodName(deploymentName, role, id, "-tls-keyfile") + return AppendTLSKeyfileSecretPostfix(CreatePodName(deploymentName, role, id, "")) +} + +// AppendTLSKeyfileSecretPostfix returns the name of the Secret extended with TLS keyfile postfix. +func AppendTLSKeyfileSecretPostfix(name string) string { + return fmt.Sprintf("%s-tls-keyfile", name) } // ArangodVolumeMount creates a volume mount structure for arangod. @@ -359,7 +364,7 @@ func NewPod(deploymentName, role, id, podName string, podCreator interfaces.PodC p := core.Pod{ ObjectMeta: metav1.ObjectMeta{ Name: podName, - Labels: LabelsForDeployment(deploymentName, role), + Labels: LabelsForMember(deploymentName, role, id), Finalizers: podCreator.GetFinalizers(), }, Spec: core.PodSpec{ diff --git a/pkg/util/k8sutil/util.go b/pkg/util/k8sutil/util.go index b2ff111f3..59688fc3f 100644 --- a/pkg/util/k8sutil/util.go +++ b/pkg/util/k8sutil/util.go @@ -38,6 +38,8 @@ const ( LabelKeyRole = "role" // LabelKeyArangoExporter is the key of the label used to indicate that a exporter is present LabelKeyArangoExporter = "arango_exporter" + // LabelKeyArangoMember is the key of the label used to store the ArangoDeployment member ID in + LabelKeyArangoMember = "deployment.arangodb.com/member" // AppName is the fixed value for the "app" label AppName = "arangodb" @@ -66,6 +68,15 @@ func LabelsForExporterService(deploymentName string) map[string]string { } } +// LabelsForMember returns a map of labels, given to all resources for given deployment name and member id +func LabelsForMember(deploymentName, role, id string) map[string]string { + l := LabelsForDeployment(deploymentName, role) + + l[LabelKeyArangoMember] = id + + return l +} + // LabelsForDeployment returns a map of labels, given to all resources for given deployment name func LabelsForDeployment(deploymentName, role string) map[string]string { l := map[string]string{ From 5c9e5c4cf48c49304116eaf1c8a8710f737649ad Mon Sep 17 00:00:00 2001 From: ajanikow <12255597+ajanikow@users.noreply.github.com> Date: Wed, 10 Mar 2021 07:53:12 +0000 Subject: [PATCH 5/5] Fix IT --- pkg/deployment/deployment_run_test.go | 35 +++++++++++++++++++++++++ pkg/deployment/deployment_suite_test.go | 2 +- pkg/util/k8sutil/util.go | 4 ++- 3 files changed, 39 insertions(+), 2 deletions(-) diff --git a/pkg/deployment/deployment_run_test.go b/pkg/deployment/deployment_run_test.go index 5812f238e..4c98f98f2 100644 --- a/pkg/deployment/deployment_run_test.go +++ b/pkg/deployment/deployment_run_test.go @@ -95,6 +95,41 @@ func runTestCase(t *testing.T, testCase testCaseStruct) { testCase.Resources(t, d) } + // Set members + require.NoError(t, d.status.last.Members.ForeachServerGroup(func(group api.ServerGroup, list api.MemberStatusList) error { + for _, m := range list { + member := api.ArangoMember{ + ObjectMeta: metav1.ObjectMeta{ + Namespace: d.GetNamespace(), + Name: m.ArangoMemberName(d.GetName(), group), + }, + Spec: api.ArangoMemberSpec{ + Group: group, + ID: m.ID, + }, + } + + c := d.GetArangoCli() + if _, err := c.DatabaseV1().ArangoMembers(member.GetNamespace()).Create(&member); err != nil { + return err + } + + s := core.Service{ + ObjectMeta: metav1.ObjectMeta{ + Name: member.GetName(), + Namespace: member.GetNamespace(), + }, + } + + k := d.GetKubeCli() + if _, err := k.CoreV1().Services(member.GetNamespace()).Create(&s); err != nil { + return err + } + } + + return nil + })) + // Set features { *features.EncryptionRotation().EnabledPointer() = testCase.Features.EncryptionRotation diff --git a/pkg/deployment/deployment_suite_test.go b/pkg/deployment/deployment_suite_test.go index 22c2b498d..1f9fc1fad 100644 --- a/pkg/deployment/deployment_suite_test.go +++ b/pkg/deployment/deployment_suite_test.go @@ -585,7 +585,7 @@ func (testCase *testCaseStruct) createTestPodData(deployment *Deployment, group testCase.ExpectedPod.ObjectMeta = metav1.ObjectMeta{ Name: podName, Namespace: testNamespace, - Labels: k8sutil.LabelsForDeployment(testDeploymentName, group.AsRole()), + Labels: k8sutil.LabelsForMember(testDeploymentName, group.AsRole(), memberStatus.ID), OwnerReferences: []metav1.OwnerReference{ testCase.ArangoDeployment.AsOwner(), }, diff --git a/pkg/util/k8sutil/util.go b/pkg/util/k8sutil/util.go index 59688fc3f..f9891154a 100644 --- a/pkg/util/k8sutil/util.go +++ b/pkg/util/k8sutil/util.go @@ -72,7 +72,9 @@ func LabelsForExporterService(deploymentName string) map[string]string { func LabelsForMember(deploymentName, role, id string) map[string]string { l := LabelsForDeployment(deploymentName, role) - l[LabelKeyArangoMember] = id + if id != "" { + l[LabelKeyArangoMember] = id + } return l }