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
}