func()

in iotdb-operator/internal/controller/datanode_controller.go [54:121]


func (r *DataNodeReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
	logger := log.FromContext(ctx)

	var dataNode iotdbv1.DataNode
	if err := r.Get(ctx, req.NamespacedName, &dataNode); err != nil {
		if errors.IsNotFound(err) {
			logger.Info("DataNode resource not found. May have been deleted.")
			return ctrl.Result{}, nil
		}
		logger.Error(err, "Failed to get IoTDB DataNode")
		return ctrl.Result{}, err
	}

	// Ensure the service exists
	services, err := r.constructServiceForDataNode(&dataNode)
	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{}
		if err := r.Get(ctx, types.NamespacedName{Name: dataNode.Name, Namespace: dataNode.Namespace}, current); err != nil {
			if err != nil && errors.IsNotFound(err) {
				stateFulSet := r.constructStateFulSetForDataNode(&dataNode)
				if err := r.Create(ctx, stateFulSet); err != nil {
					return err
				}
				return nil
			}
			return err
		}

		updatedStateFulSet := r.constructStateFulSetForDataNode(&dataNode)
		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 DataNode")
		return ctrl.Result{}, err
	}

	return ctrl.Result{}, nil
}