Reconcile()
- 获取node和nodeSLO,设置nodeExist和nodeSLOExist
- node和nodeSLO都不存在,直接返回
- 若!nodeExist
- 若!nodeSLOExist
- 若nodeExist和nodeSLOExist都存在
- 获取nodeSLOSpec,若nodeSLOSpec改变了,则更新nodeSLO。
func (r *NodeSLOReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
_ = log.FromContext(ctx, "node-slo-reconciler", req.NamespacedName)
if !r.sloCfgCache.IsCfgAvailable() {
klog.Warningf("slo config is not available, drop the req %v until a valid config is set",
req.NamespacedName)
return ctrl.Result{}, nil
}
nodeExist := true
nodeName := req.Name
node := &corev1.Node{}
err := r.Client.Get(context.TODO(), req.NamespacedName, node)
if err != nil {
if !errors.IsNotFound(err) {
metrics.RecordNodeSLOReconcileCount(false, "reconcileNodeGetError")
klog.Errorf("failed to find node %v, error: %v", nodeName, err)
return ctrl.Result{Requeue: true}, err
}
nodeExist = false
}
nodeSLOExist := true
nodeSLOName := req.Name
nodeSLO := &slov1alpha1.NodeSLO{}
err = r.Client.Get(context.TODO(), req.NamespacedName, nodeSLO)
if err != nil {
if !errors.IsNotFound(err) {
metrics.RecordNodeSLOReconcileCount(false, "reconcileNodeSLOGetError")
klog.Errorf("failed to find nodeSLO %v, error: %v", nodeName, err)
return ctrl.Result{Requeue: true}, err
}
nodeSLOExist = false
}
if !nodeExist && !nodeSLOExist {
return ctrl.Result{}, nil
} else if !nodeExist {
err = r.Client.Delete(context.TODO(), nodeSLO)
if err != nil {
if errors.IsNotFound(err) {
klog.V(4).Infof("failed to delete nodeSLO %v because error: %v", nodeSLOName, err)
return ctrl.Result{}, nil
}
metrics.RecordNodeSLOReconcileCount(false, "deleteNodeSLO")
klog.Errorf("failed to delete nodeSLO %v, error: %v", nodeSLOName, err)
return reconcile.Result{Requeue: true}, err
}
metrics.RecordNodeSLOReconcileCount(true, "deleteNodeSLO")
return ctrl.Result{}, nil
} else if !nodeSLOExist {
if err = r.initNodeSLO(node, nodeSLO); err != nil {
klog.Errorf("failed to init nodeSLO instance %v: %v", nodeSLOName, err)
return ctrl.Result{Requeue: true}, err
}
err = r.Client.Create(context.TODO(), nodeSLO)
if err != nil {
metrics.RecordNodeSLOReconcileCount(false, "createNodeSLO")
klog.Errorf("failed to create nodeSLO instance %v: %v", nodeSLOName, err)
return ctrl.Result{Requeue: true}, err
}
metrics.RecordNodeSLOReconcileCount(true, "createNodeSLO")
} else {
nodeSLOSpec, err := r.getNodeSLOSpec(node, &nodeSLO.Spec)
if err != nil {
klog.Errorf("failed to get nodeSLO %v, spec: %v", nodeSLOName, err)
return ctrl.Result{Requeue: true}, err
}
if !reflect.DeepEqual(nodeSLOSpec, &nodeSLO.Spec) {
nodeSLO.Spec = *nodeSLOSpec
err = r.Client.Update(context.TODO(), nodeSLO)
if err != nil {
metrics.RecordNodeSLOReconcileCount(false, "updateNodeSLO")
klog.Errorf("failed to update nodeSLO %v, error: %v", nodeSLOName, err)
return ctrl.Result{Requeue: true}, err
}
metrics.RecordNodeSLOReconcileCount(true, "updateNodeSLO")
}
}
klog.V(6).Infof("nodeslo-controller succeeded to update nodeSLO %v", nodeSLOName)
return ctrl.Result{}, nil
}