Koordinator-NodeSLO

Reconcile()

  • 获取node和nodeSLO,设置nodeExist和nodeSLOExist
  • node和nodeSLO都不存在,直接返回
  • 若!nodeExist
    • 删除对应nodeSLO
  • 若!nodeSLOExist
    • 初始化nodeSLO
    • 创建nodeSLO
  • 若nodeExist和nodeSLOExist都存在
    • 获取nodeSLOSpec,若nodeSLOSpec改变了,则更新nodeSLO。
func (r *NodeSLOReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
    // reconcile for 2 things:
    //   1. ensuring the NodeSLO exists iff the Node exists
    //   2. update NodeSLO Spec
    _ = log.FromContext(ctx, "node-slo-reconciler", req.NamespacedName)
    // if cache unavailable, requeue the req
    if !r.sloCfgCache.IsCfgAvailable() {
        // all nodes would be enqueued once the config is available, so here we just drop the req
        klog.Warningf("slo config is not available, drop the req %v until a valid config is set",
            req.NamespacedName)
        return ctrl.Result{}, nil
    }
    // get the node
    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
    }
    // get the nodeSLO
    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
    }
    // NodeSLO lifecycle management
    if !nodeExist && !nodeSLOExist {
        // do nothing if both does not exist
        return ctrl.Result{}, nil
    } else if !nodeExist {
        // delete CR if only the nodeSLO exists
        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 {
        // create and initialize CR if only the node exists
        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 {
        // update nodeSLO spec if both exists
        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
}
内容概要:本文系统介绍了标准化和软件知识产权的基础知识,涵盖标准化的基本概念、分类、标准代号、国际标准的采用原则及程度,重点讲解了信息技术标准化、ISO与IEC等国际标准化组织以及ISO9000和ISO/IEC15504等重要标准体系;在知识产权分,详细阐述了知识产权的定义、分类及特点,重点分析了计算机软件著作权的主体、客体、权利内容、行使方式、保护期限及侵权认定,同时涉及商业秘密的构成与侵权形式、专利权的类型与申请条件,以及企业如何综合运用著作权、专利、商标和商业秘密等方式保护软件知识产权。; 适合人群:从事软件开发、项目管理、IT标准化或知识产权相关工作的技术人员与管理人员,以及备考相关资格考试的学习者;具备一定信息技术背景,希望系统掌握标准化与软件知识产权基础知识的专业人员。; 使用场景及目标:①帮助理解各类标准的分类体系及国际标准采用方式,提升标准化实践能力;②指导企业在软件研发过程中有效保护知识产权,规避法律风险;③为软件著作权登记、专利申请、技术保密等提供理论依据和操作指引。; 阅读建议:建议结合国家相关政策法规和实际案例进行深入学习,重点关注软件著作权与专利权的适用边界、标准制定流程及企业知识产权管理策略,强化理论与实践的结合。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值