in pkg/csi/controller.go [148:224]
func (r *reconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
log := log.FromContext(ctx)
var node corev1.Node
if err := r.Get(ctx, req.NamespacedName, &node); err != nil {
log.Error(err, "get node for reconcile", "node", req.NamespacedName.Name)
r.deleteOrphanedPDs(ctx)
return ctrl.Result{}, nil
}
if node.DeletionTimestamp != nil {
r.deleteOrphanedPDs(ctx)
// TODO: clean up old mappings?
return ctrl.Result{}, nil
}
mustCreateMapping := false
var mapping map[string]volumeTypeInfo
var configMap corev1.ConfigMap
err := r.Get(ctx, types.NamespacedName{Namespace: r.namespace, Name: r.volumeTypeConfigMap}, &configMap)
if apierrors.IsNotFound(err) {
mustCreateMapping = true
configMap.SetNamespace(r.namespace)
configMap.SetName(r.volumeTypeConfigMap)
mapping = map[string]volumeTypeInfo{}
} else if err == nil {
if mapping, err = getVolumeTypeMapping(configMap.Data); err != nil {
log.Error(err, "bad mapping (ignored, mapping recreated)")
mapping = map[string]volumeTypeInfo{}
}
} else {
log.Error(err, "get mapping", "mapping", fmt.Sprintf("%s/%s", r.namespace, r.volumeTypeConfigMap))
return ctrl.Result{}, nil
}
if configMap.Data == nil {
configMap.Data = map[string]string{}
}
info, err := getVolumeTypeFromNode(&node)
if err != nil && strings.Contains(err.Error(), "label not found on node") {
log.Info("skipping non-cache node", "node", node.GetName())
return ctrl.Result{}, nil
} else if err != nil {
return ctrl.Result{}, err
}
if info.VolumeType == pdVolumeType {
if r.pdStorageClass == "" {
return ctrl.Result{}, fmt.Errorf("No PD storage class has been defined, PD volumes can't be used")
}
if err := r.updatePdVolumeType(ctx, node.GetName(), &info); err != nil {
return ctrl.Result{}, err
}
}
mapping[node.GetName()] = info
if err := writeVolumeTypeMapping(configMap.Data, mapping); err != nil {
log.Error(err, "write mapping", "node", node.GetName())
return ctrl.Result{}, err
}
if mustCreateMapping {
if err := r.Create(ctx, &configMap); err != nil {
log.Error(err, "create configmap")
return ctrl.Result{}, err // requeue
}
} else {
if err := r.Update(ctx, &configMap); err != nil {
log.Error(err, "update configmap")
return ctrl.Result{}, err // requeue
}
}
log.Info("update", "node", node.GetName(), "info", info)
return ctrl.Result{}, nil
}