@@ -31,6 +31,7 @@ import (
3131 "github.com/arangodb/arangosync/client"
3232 "github.com/rs/zerolog"
3333 "github.com/rs/zerolog/log"
34+ apiextensionsclient "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset"
3435 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
3536 "k8s.io/client-go/kubernetes"
3637 "k8s.io/client-go/tools/record"
@@ -59,6 +60,7 @@ type Config struct {
5960type Dependencies struct {
6061 Log zerolog.Logger
6162 KubeCli kubernetes.Interface
63+ KubeExtCli apiextensionsclient.Interface
6264 DatabaseCRCli versioned.Interface
6365 EventRecorder record.EventRecorder
6466}
@@ -98,6 +100,7 @@ type Deployment struct {
98100 stopped int32
99101
100102 inspectTrigger trigger.Trigger
103+ inspectCRDTrigger trigger.Trigger
101104 updateDeploymentTrigger trigger.Trigger
102105 clientCache * clientCache
103106 recentInspectionErrors int
@@ -107,6 +110,7 @@ type Deployment struct {
107110 resources * resources.Resources
108111 chaosMonkey * chaos.Monkey
109112 syncClientCache client.ClientCache
113+ haveServiceMonitorCRD bool
110114}
111115
112116// New creates a new Deployment from the given API object.
@@ -136,6 +140,7 @@ func New(config Config, deps Dependencies, apiObject *api.ArangoDeployment) (*De
136140 go d .listenForPVCEvents (d .stopCh )
137141 go d .listenForSecretEvents (d .stopCh )
138142 go d .listenForServiceEvents (d .stopCh )
143+ go d .listenForCRDEvents (d .stopCh )
139144 if apiObject .Spec .GetMode () == api .DeploymentModeCluster {
140145 ci := newClusterScalingIntegration (d )
141146 d .clusterScalingIntegration = ci
@@ -202,8 +207,10 @@ func (d *Deployment) run() {
202207 }
203208
204209 // Create service monitor
205- if err := d .resources .EnsureServiceMonitor (); err != nil {
206- d .CreateEvent (k8sutil .NewErrorEvent ("Failed to create service monitor" , err , d .GetAPIObject ()))
210+ if d .haveServiceMonitorCRD {
211+ if err := d .resources .EnsureServiceMonitor (); err != nil {
212+ d .CreateEvent (k8sutil .NewErrorEvent ("Failed to create service monitor" , err , d .GetAPIObject ()))
213+ }
207214 }
208215
209216 // Create members
@@ -234,6 +241,8 @@ func (d *Deployment) run() {
234241 log .Info ().Msg ("start running..." )
235242 }
236243
244+ d .lookForServiceMonitorCRD ()
245+
237246 inspectionInterval := maxInspectionInterval
238247 for {
239248 select {
@@ -263,6 +272,8 @@ func (d *Deployment) run() {
263272 inspectionInterval = d .inspectDeployment (inspectionInterval )
264273 log .Debug ().Str ("interval" , inspectionInterval .String ()).Msg ("...inspected deployment" )
265274
275+ case <- d .inspectCRDTrigger .Done ():
276+ d .lookForServiceMonitorCRD ()
266277 case <- d .updateDeploymentTrigger .Done ():
267278 inspectionInterval = minInspectionInterval
268279 if err := d .handleArangoDeploymentUpdatedEvent (); err != nil {
@@ -497,3 +508,29 @@ func (d *Deployment) isOwnerOf(obj metav1.Object) bool {
497508 }
498509 return ownerRefs [0 ].UID == d .apiObject .UID
499510}
511+
512+ // lookForServiceMonitorCRD checks if there is a CRD for the ServiceMonitor
513+ // CR and sets the flag haveServiceMonitorCRD accordingly. This is called
514+ // once at creation time of the deployment and then always if the CRD
515+ // informer is triggered.
516+ func (d * Deployment ) lookForServiceMonitorCRD () {
517+ _ , err := d .deps .KubeExtCli .ApiextensionsV1beta1 ().CustomResourceDefinitions ().Get ("servicemonitors.monitoring.coreos.com" , metav1.GetOptions {})
518+ log := d .deps .Log
519+ log .Debug ().Msgf ("looking for ServiceMonitor CRD..." )
520+ if err == nil {
521+ if ! d .haveServiceMonitorCRD {
522+ log .Info ().Msgf ("have discovered ServiceMonitor CRD" )
523+ }
524+ d .haveServiceMonitorCRD = true
525+ d .triggerInspection ()
526+ return
527+ } else if k8sutil .IsNotFound (err ) {
528+ if d .haveServiceMonitorCRD {
529+ log .Info ().Msgf ("ServiceMonitor CRD no longer there" )
530+ }
531+ d .haveServiceMonitorCRD = false
532+ return
533+ }
534+ log .Warn ().Err (err ).Msgf ("error when looking for ServiceMonitor CRD" )
535+ return
536+ }
0 commit comments