in iotdb-operator/internal/controller/confignode_controller.go [54:120]
func (r *ConfigNodeReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
logger := log.FromContext(ctx)
var configNode iotdbv1.ConfigNode
if err := r.Get(ctx, req.NamespacedName, &configNode); err != nil {
if errors.IsNotFound(err) {
logger.Info("ConfigNode resource not found. May have been deleted.")
return ctrl.Result{}, nil
}
logger.Error(err, "Failed to get IoTDB ConfigNode")
return ctrl.Result{}, err
}
// Ensure the service exists
services, err := r.constructServicesForConfigNode(&configNode)
if err != nil {
return ctrl.Result{}, err
}
for _, service := range services {
existingService := &corev1.Service{}
err := r.Get(ctx, types.NamespacedName{Name: service.Name, Namespace: service.Namespace}, existingService)
if err != nil && errors.IsNotFound(err) {
if err := r.Create(ctx, &service); err != nil {
return ctrl.Result{}, err
}
} else if err != nil {
return ctrl.Result{}, err
} else {
// Ensure the service is up-to-date
if !reflect.DeepEqual(existingService.Spec, service.Spec) {
service.ResourceVersion = existingService.ResourceVersion
if err := r.Update(ctx, &service); err != nil {
return ctrl.Result{}, err
}
}
}
}
// Ensure StatefulSet exists and is up-to-date
err = retry.RetryOnConflict(retry.DefaultRetry, func() error {
current := &appsv1.StatefulSet{}
err := r.Get(ctx, types.NamespacedName{Name: configNode.Name, Namespace: configNode.Namespace}, current)
if err != nil && errors.IsNotFound(err) {
stateFulSet := r.constructStateFulSetForConfigNode(&configNode)
if err := r.Create(ctx, stateFulSet); err != nil {
return err
}
return nil
} else if err != nil {
return err
}
updatedStateFulSet := r.constructStateFulSetForConfigNode(&configNode)
if !reflect.DeepEqual(current.Spec, updatedStateFulSet.Spec) {
updatedStateFulSet.ResourceVersion = current.ResourceVersion
return r.Update(ctx, updatedStateFulSet)
}
return nil
})
if err != nil {
logger.Error(err, "Failed to update StateFulSet for IoTDB ConfigNode")
return ctrl.Result{}, err
}
return ctrl.Result{}, nil
}