From bd9511df12554c7bc08c66f837546b022852f5c8 Mon Sep 17 00:00:00 2001 From: mamoutou-diarra Date: Fri, 16 Jan 2026 18:40:16 +0000 Subject: [PATCH 1/7] create scheduler helm 0.30.7 - reserve bw in reserve stage and release in unreserve state and set default score weigth to 100 --- .../charts/as-a-second-scheduler/Chart.yaml | 4 +- .../templates/configmap.yaml | 2 +- .../charts/as-a-second-scheduler/values.yaml | 7 +- .../charts/vaclab-scheduler-0.30.7.tgz | Bin 0 -> 10656 bytes .../pkg/vaclabscheduling/vaclab_scheduling.go | 73 +++++++++++------- 5 files changed, 52 insertions(+), 34 deletions(-) create mode 100644 scheduler-plugins/manifests/install/charts/vaclab-scheduler-0.30.7.tgz diff --git a/scheduler-plugins/manifests/install/charts/as-a-second-scheduler/Chart.yaml b/scheduler-plugins/manifests/install/charts/as-a-second-scheduler/Chart.yaml index 1ff781e..2419a58 100644 --- a/scheduler-plugins/manifests/install/charts/as-a-second-scheduler/Chart.yaml +++ b/scheduler-plugins/manifests/install/charts/as-a-second-scheduler/Chart.yaml @@ -15,12 +15,12 @@ type: application # This is the chart version. This version number should be incremented each time you make changes # to the chart and its templates, including the app version. # Versions are expected to follow Semantic Versioning (https://semver.org/) -version: 0.30.6 +version: 0.30.7 # This is the version number of the application being deployed. This version number should be # incremented each time you make changes to the application. Versions are not expected to # follow Semantic Versioning. They should reflect the version the application is using. -appVersion: 0.30.6 +appVersion: 0.30.7 keywords: - scheduler-plugins - vaclab diff --git a/scheduler-plugins/manifests/install/charts/as-a-second-scheduler/templates/configmap.yaml b/scheduler-plugins/manifests/install/charts/as-a-second-scheduler/templates/configmap.yaml index 7baad5e..be0d7d0 100644 --- a/scheduler-plugins/manifests/install/charts/as-a-second-scheduler/templates/configmap.yaml +++ b/scheduler-plugins/manifests/install/charts/as-a-second-scheduler/templates/configmap.yaml @@ -26,7 +26,7 @@ data: score: enabled: - name: VaclabScheduling - weight: 10 + weight: {{ .Values.plugins.scoreWeight | default 100 }} reserve: enabled: - name: VaclabScheduling diff --git a/scheduler-plugins/manifests/install/charts/as-a-second-scheduler/values.yaml b/scheduler-plugins/manifests/install/charts/as-a-second-scheduler/values.yaml index c41a1ad..bbcff99 100644 --- a/scheduler-plugins/manifests/install/charts/as-a-second-scheduler/values.yaml +++ b/scheduler-plugins/manifests/install/charts/as-a-second-scheduler/values.yaml @@ -4,7 +4,7 @@ scheduler: name: vaclab-scheduler - image: katakuri100/vaclab-scheduler:v0.30.6 + image: katakuri100/vaclab-scheduler:v0.30.6-1 command: - /bin/kube-scheduler replicaCount: 1 @@ -23,7 +23,7 @@ scheduler: controller: name: vaclab-scheduler-controller - image: katakuri100/vaclab-scheduler-controller:v0.30.6 + image: katakuri100/vaclab-scheduler-controller:v0.30.6-1 replicaCount: 1 leaderElect: false priorityClassName: "" @@ -44,6 +44,9 @@ controller: plugins: enabled: ["VaclabScheduling"] disabled: [] # only in-tree plugins need to be defined here + # Score weight for VaclabScheduling plugin (higher = more influence) + # Default 100 makes bandwidth the dominant factor in scheduling decisions + scoreWeight: 100 # Customize the enabled plugins' config. # Refer to the "pluginConfig" section of manifests//scheduler-config.yaml. diff --git a/scheduler-plugins/manifests/install/charts/vaclab-scheduler-0.30.7.tgz b/scheduler-plugins/manifests/install/charts/vaclab-scheduler-0.30.7.tgz new file mode 100644 index 0000000000000000000000000000000000000000..56f355e168e7451cc77db5ab223bba098e169960 GIT binary patch literal 10656 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 GL;(PJdhe0| literal 0 HcmV?d00001 diff --git a/scheduler-plugins/pkg/vaclabscheduling/vaclab_scheduling.go b/scheduler-plugins/pkg/vaclabscheduling/vaclab_scheduling.go index 3fe6ee3..b2a0a73 100644 --- a/scheduler-plugins/pkg/vaclabscheduling/vaclab_scheduling.go +++ b/scheduler-plugins/pkg/vaclabscheduling/vaclab_scheduling.go @@ -295,7 +295,8 @@ func (v *VaclabScheduling) NormalizeScore(ctx context.Context, state *framework. return framework.NewStatus(framework.Success, "") } -// Reserve logs the intent to reserve bandwidth (actual reservation happens in PostBind) +// Reserve updates the bandwidth CRD to reserve bandwidth for the pod +// This happens before binding to avoid race conditions func (v *VaclabScheduling) Reserve(ctx context.Context, state *framework.CycleState, pod *v1.Pod, nodeName string) *framework.Status { // Get cached bandwidth requirements from PreFilter s, err := getPreFilterState(state) @@ -309,44 +310,63 @@ func (v *VaclabScheduling) Reserve(ctx context.Context, state *framework.CycleSt return framework.NewStatus(framework.Success, "") } - // Just log the intent - actual CRD update happens in PostBind after pod exists - klog.V(3).InfoS("Reserved bandwidth intent for pod", "node", nodeName, "pod", pod.Name, "ul", s.ulMbps, "dl", s.dlMbps) + // Update CRD to reserve bandwidth (before binding) + if err := v.bandwidth.AddBandwidthRequest(ctx, nodeName, pod.Name, pod.Namespace, string(pod.UID), s.ulMbps, s.dlMbps); err != nil { + klog.ErrorS(err, "Failed to reserve bandwidth in CRD", "node", nodeName, "pod", pod.Name) + return framework.NewStatus(framework.Error, fmt.Sprintf("failed to reserve bandwidth: %v", err)) + } + + klog.InfoS("Reserved bandwidth in CRD", "node", nodeName, "pod", pod.Name, "ul", s.ulMbps, "dl", s.dlMbps) return framework.NewStatus(framework.Success, "") } -// Unreserve is a no-op since we don't modify CRD in Reserve phase +// Unreserve releases the bandwidth reservation if binding fails +// This ensures we clean up CRD modifications made in Reserve func (v *VaclabScheduling) Unreserve(ctx context.Context, state *framework.CycleState, pod *v1.Pod, nodeName string) { - // No-op: we don't add to CRD in Reserve, so nothing to remove - klog.V(4).InfoS("Unreserve called (no-op)", "node", nodeName, "pod", pod.Name) -} - -// PreBind is called before binding the pod (final validation) -func (v *VaclabScheduling) PreBind(ctx context.Context, state *framework.CycleState, pod *v1.Pod, nodeName string) *framework.Status { - // Final check that bandwidth is still available - ulMbps, dlMbps, err := v.bandwidth.ExtractPodBandwidthRequirement(ctx, pod) + // Get cached bandwidth requirements from PreFilter + s, err := getPreFilterState(state) if err != nil { - return framework.NewStatus(framework.Error, fmt.Sprintf("failed to extract bandwidth: %v", err)) + klog.ErrorS(err, "Failed to get prefilter state in Unreserve", "pod", pod.Name) + return } - if ulMbps == 0 && dlMbps == 0 { - return framework.NewStatus(framework.Success, "") + // Skip if no bandwidth was reserved + if s.ulMbps == 0 && s.dlMbps == 0 { + return + } + + // Remove bandwidth request from CRD (cleanup after failed binding) + if err := v.bandwidth.RemoveBandwidthRequest(ctx, nodeName, string(pod.UID)); err != nil { + klog.ErrorS(err, "Failed to unreserve bandwidth in CRD", "node", nodeName, "pod", pod.Name) + return } - // Final check that bandwidth is still available - sufficient, err := v.bandwidth.HasSufficientBandwidth(ctx, nodeName, ulMbps, dlMbps) + klog.InfoS("Unreserved bandwidth in CRD", "node", nodeName, "pod", pod.Name, "ul", s.ulMbps, "dl", s.dlMbps) +} + +// PreBind is called before binding the pod +// Bandwidth was already reserved in Reserve phase, so this just logs +func (v *VaclabScheduling) PreBind(ctx context.Context, state *framework.CycleState, pod *v1.Pod, nodeName string) *framework.Status { + // Get cached bandwidth requirements from PreFilter + s, err := getPreFilterState(state) if err != nil { - return framework.NewStatus(framework.Error, fmt.Sprintf("failed to verify bandwidth: %v", err)) + klog.ErrorS(err, "Failed to get prefilter state in PreBind", "pod", pod.Name) + // Don't fail binding for state read errors + return framework.NewStatus(framework.Success, "") } - if !sufficient { - return framework.NewStatus(framework.Unschedulable, "insufficient bandwidth at prebind") + // Skip if no bandwidth required + if s.ulMbps == 0 && s.dlMbps == 0 { + return framework.NewStatus(framework.Success, "") } - klog.V(3).InfoS("PreBind bandwidth check passed", "node", nodeName, "pod", pod.Name) + // Bandwidth was already validated and reserved in Reserve phase + klog.V(3).InfoS("PreBind: bandwidth already reserved", "node", nodeName, "pod", pod.Name, "ul", s.ulMbps, "dl", s.dlMbps) return framework.NewStatus(framework.Success, "") } -// PostBind adds the bandwidth request to CRD after pod is successfully bound +// PostBind is called after pod is successfully bound +// Bandwidth was already reserved in Reserve phase, so this just logs success func (v *VaclabScheduling) PostBind(ctx context.Context, state *framework.CycleState, pod *v1.Pod, nodeName string) { // Get cached bandwidth requirements from PreFilter s, err := getPreFilterState(state) @@ -360,11 +380,6 @@ func (v *VaclabScheduling) PostBind(ctx context.Context, state *framework.CycleS return } - // Now add bandwidth request to the node's Bandwidth CRD (pod exists now) - if err := v.bandwidth.AddBandwidthRequest(ctx, nodeName, pod.Name, pod.Namespace, string(pod.UID), s.ulMbps, s.dlMbps); err != nil { - klog.ErrorS(err, "Failed to add bandwidth request in PostBind", "node", nodeName, "pod", pod.Name) - return - } - - klog.InfoS("Added bandwidth request to CRD in PostBind", "node", nodeName, "pod", pod.Name, "ul", s.ulMbps, "dl", s.dlMbps) + // Bandwidth was already reserved in Reserve phase, just log success + klog.InfoS("Pod successfully bound with bandwidth reservation", "node", nodeName, "pod", pod.Name, "ul", s.ulMbps, "dl", s.dlMbps) } From cf00d067a439435edd32c08a77ea15c7b6b1c6d6 Mon Sep 17 00:00:00 2001 From: mamoutou-diarra Date: Fri, 16 Jan 2026 22:05:28 +0000 Subject: [PATCH 2/7] add helm 0.1.9 for bandwidth operator - keep pending pods in spec --- bandwidth-operator/dist/chart/Chart.yaml | 6 +- .../dist/chart/templates/manager/manager.yaml | 2 +- .../internal/controller/setup_bandwidth.go | 186 ++++++++---------- .../vaclab-bandwidth-operator-0.1.9.tgz | Bin 0 -> 5882 bytes 4 files changed, 86 insertions(+), 108 deletions(-) create mode 100644 bandwidth-operator/vaclab-bandwidth-operator-0.1.9.tgz diff --git a/bandwidth-operator/dist/chart/Chart.yaml b/bandwidth-operator/dist/chart/Chart.yaml index 02a0cb0..aafad4b 100644 --- a/bandwidth-operator/dist/chart/Chart.yaml +++ b/bandwidth-operator/dist/chart/Chart.yaml @@ -2,9 +2,9 @@ apiVersion: v2 name: vaclab-bandwidth-operator description: Vaclab Kubernetes operator for bandwidth-aware workload scheduling in Vaclab environments type: application -version: 0.1.8 -appVersion: "0.1.8" -icon: "https://example.com/icon.png" +version: 0.1.9 +appVersion: "0.1.9" +icon: "https://raw.githubusercontent.com/vacp2p/vaclab-2/feat/add_lab_components/extras/vac-logo-light-no-bg.png" keywords: - kubernetes - operator diff --git a/bandwidth-operator/dist/chart/templates/manager/manager.yaml b/bandwidth-operator/dist/chart/templates/manager/manager.yaml index 171ccc1..f016e49 100644 --- a/bandwidth-operator/dist/chart/templates/manager/manager.yaml +++ b/bandwidth-operator/dist/chart/templates/manager/manager.yaml @@ -41,7 +41,7 @@ spec: {{- end }} command: - /manager - image: katakuri100/vaclab-bandwidth-operator:v0.1.8 + image: katakuri100/vaclab-bandwidth-operator:v0.1.9 imagePullPolicy: IfNotPresent livenessProbe: httpGet: diff --git a/bandwidth-operator/internal/controller/setup_bandwidth.go b/bandwidth-operator/internal/controller/setup_bandwidth.go index a48df88..cb53640 100644 --- a/bandwidth-operator/internal/controller/setup_bandwidth.go +++ b/bandwidth-operator/internal/controller/setup_bandwidth.go @@ -155,6 +155,31 @@ func (r *BandwidthReconciler) SetupBandwidthResource(ctx context.Context, bandwi }) } + } else { + // pod not created yet, in pendning state, freshly reserved by the scheduler + // during reserve stage, should have requested bandwidth defined in the request and pod uid + // should be taken into account for capacity calculation because scheduler will remove it in case of scheduling failure + if !strings.EqualFold(req.PodUid, "") && (req.Bandwidth.UlMbps > 0 || req.Bandwidth.DlMbps > 0) { + usedUlNetwork += req.Bandwidth.UlMbps + usedDlNetwork += req.Bandwidth.DlMbps + usedUlLocal += req.Bandwidth.UlMbps + usedDlLocal += req.Bandwidth.DlMbps + reservationInfo = append(reservationInfo, networkingv1.ReservationInfo{ + PodName: req.PodName, + PodUid: req.PodUid, + Bandwidth: networkingv1.Capacity{ + Network: networkingv1.BandwidthDefinition{ + UlMbps: req.Bandwidth.UlMbps, + DlMbps: req.Bandwidth.DlMbps, + }, + Local: networkingv1.BandwidthDefinition{ + UlMbps: req.Bandwidth.UlMbps, + DlMbps: req.Bandwidth.DlMbps, + }, + }, + Namespace: req.Namespace, + }) + } } } usedCapacity.Local = networkingv1.BandwidthDefinition{ @@ -191,91 +216,6 @@ func (r *BandwidthReconciler) SetupBandwidthResource(ctx context.Context, bandwi return ctrl.Result{RequeueAfter: 5 * time.Second}, nil } -// used only when manually changing the spec of an existing Bandwidth resource -// only max capacity changes are allowed manually -func (r *BandwidthReconciler) CheckAndUpdateBandwidth(ctx context.Context, bandwidth *networkingv1.Bandwidth) (ctrl.Result, error) { - log := log.FromContext(ctx) - log.Info("watching vaclab Bandwidth resource for updates") - - nodeName := bandwidth.Spec.Node - bwName := bandwidth.Name - //make sure node exists and bw resource is valid - var node corev1.Node - nodeErr := r.Get(ctx, types.NamespacedName{Name: nodeName}, &node) - if nodeErr != nil { - if apierrors.IsNotFound(nodeErr) { - // Node gone: need to stop and clean up any existing bandwidth resource - log.Info("Node not found, cleaning up Bandwidth resource", "node", nodeName) - var bw networkingv1.Bandwidth - if err := r.Get(ctx, types.NamespacedName{Name: nodeName}, &bw); err == nil { - _ = r.Delete(ctx, &bw) // ignore error - } - bandwidth.Status.Status = networkingv1.Error - bandwidth.Status.ErrorReason = "node not found" - r.generateEvent(networkingv1.EventVaclabNodeBandwidthFailed, bandwidth) - return ctrl.Result{}, nil - } - bandwidth.Status.Status = networkingv1.Error - bandwidth.Status.ErrorReason = "unable to fetch node information" - log.Info("Node not found, cleaning up Bandwidth resource", "node", nodeName) - var bw networkingv1.Bandwidth - if err := r.Get(ctx, types.NamespacedName{Name: nodeName}, &bw); err == nil { - _ = r.Delete(ctx, &bw) // ignore error - } - r.generateEvent(networkingv1.EventVaclabNodeBandwidthFailed, bandwidth) - return ctrl.Result{}, nodeErr - } - if !strings.EqualFold(bwName, node.Name) { - log.Error(nil, "Node name mismatch", "expected", nodeName, "found", node.Name) - bandwidth.Status.Status = networkingv1.Error - bandwidth.Status.ErrorReason = "name mismatch between nodeName and bandwidthName" - log.Info("Node not found, cleaning up Bandwidth resource", "node", nodeName) - var bw networkingv1.Bandwidth - if err := r.Get(ctx, types.NamespacedName{Name: nodeName}, &bw); err == nil { - _ = r.Delete(ctx, &bw) // ignore error - } - r.generateEvent(networkingv1.EventVaclabNodeBandwidthFailed, bandwidth) - return ctrl.Result{}, nil - } - - //currentSpec := bandwidth.Spec.Requests - state := bandwidth.Status - if len(state.Reservations) != len(bandwidth.Spec.Requests) { - // changes in requests are not allowed - log.Error(nil, "Changes in bandwidth requests are not allowed after creation", "node", nodeName) - return ctrl.Result{}, nil - } - - //expectedCapacity := bandwidth.Status.Capacity - if state.Capacity != bandwidth.Spec.Capacity { - state.Capacity = bandwidth.Spec.Capacity - state.Remaining = networkingv1.Capacity{ - Local: networkingv1.BandwidthDefinition{ - UlMbps: bandwidth.Spec.Capacity.Local.UlMbps - state.Used.Local.UlMbps, - DlMbps: bandwidth.Spec.Capacity.Local.DlMbps - state.Used.Local.DlMbps, - }, - Network: networkingv1.BandwidthDefinition{ - UlMbps: bandwidth.Spec.Capacity.Network.UlMbps - state.Used.Network.UlMbps, - DlMbps: bandwidth.Spec.Capacity.Network.DlMbps - state.Used.Network.DlMbps, - }, - } - } - bandwidth.Status = state - bandwidth.Status.UpdatedAt = metav1.NewTime(time.Now()) - - if err := r.UpdateBandwidthStatus(ctx, bandwidth); err != nil { - log.Error(err, "unable to update bandwidth resource status", "node", nodeName) - return ctrl.Result{}, err - } - r.Update(ctx, bandwidth) - // Requeue to check the status later - return ctrl.Result{RequeueAfter: 10 * time.Second}, nil -} - -/*func (r *BandwidthReconciler) SyncFromSpecAndPods(ctx context.Context, bw *networkingv1.Bandwidth) (ctrl.Result, error) { - return r.syncFromSpecAndPodsWithVisited(ctx, bw, make(map[string]bool)) -}*/ - // syncSingleNodeBandwidth updates a single bandwidth resource without cascading to related nodes // Used for background updates triggered by sibling pod changes func (r *BandwidthReconciler) syncSingleNodeBandwidth(ctx context.Context, bw *networkingv1.Bandwidth) error { @@ -335,12 +275,34 @@ func (r *BandwidthReconciler) syncSingleNodeBandwidth(ctx context.Context, bw *n for _, req := range bwRequests { pod, exists := podsWithBw[req.PodUid] + foundUnknown := false if !exists { - log.V(1).Info("dropping request for missing pod", "podUid", req.PodUid, "podName", req.PodName) - continue - } + // Try to get pod status using client and pod UID + // keep the request if pod is pending (scheduled but not created yet) + var unknownPod corev1.Pod + if err := r.Get(ctx, types.NamespacedName{Name: req.PodName, Namespace: req.Namespace}, &unknownPod); err != nil || string(unknownPod.UID) != req.PodUid { + log.V(1).Info("dropping request for missing pod", "podUid", req.PodUid, "podName", req.PodName) + continue + } + + if unknownPod.DeletionTimestamp != nil || unknownPod.Status.Phase == corev1.PodSucceeded || unknownPod.Status.Phase == corev1.PodFailed { + log.V(1).Info("dropping request for terminating/completed pod", "podUid", req.PodUid, "podName", req.PodName) + continue + } - ul, dl := r.GetBandwidthFromAnnotation(pod) + if unknownPod.Status.Phase != corev1.PodPending { + log.V(1).Info("dropping request for pod without bandwidth annotation", "podUid", req.PodUid, "podName", req.PodName) + continue + } + foundUnknown = true + pod = unknownPod + } + var ul, dl int64 + if foundUnknown { + ul, dl = req.Bandwidth.UlMbps, req.Bandwidth.DlMbps + } else { + ul, dl = r.GetBandwidthFromAnnotation(pod) + } usedUlLocal += ul usedDlLocal += dl @@ -519,28 +481,44 @@ func (r *BandwidthReconciler) SyncFromSpecAndPods(ctx context.Context, bw *netwo for _, req := range bwRequests { pod, exists := podsWithBw[req.PodUid] + isPendingPod := false if !exists { - // Pod gone or no bw annotation anymore => drop request - // Check if this pod had siblings on other nodes - they need updates - if oldReq, hadRequest := existingReqs[req.PodUid]; hadRequest { - log.Info("dropping request for missing pod", "podUid", req.PodUid, "podName", req.PodName) - // If pod was part of a workload with siblings, mark related nodes as affected - // We need to fetch sibling info to know which nodes to notify - // Use a best-effort approach: get pod from old request data if possible - var oldPod corev1.Pod - if err := r.Get(ctx, types.NamespacedName{Name: oldReq.PodName, Namespace: oldReq.Namespace}, &oldPod); err == nil { - _, nodes, _ := r.allSiblingsOnCurrentNode(ctx, &oldPod, nodeName) - for _, n := range nodes { - if !strings.EqualFold(n, nodeName) { - affectedRelatedNodes[n] = true + var pendingPod corev1.Pod + if err := r.Get(ctx, types.NamespacedName{Name: req.PodName, Namespace: req.Namespace}, &pendingPod); err == nil && string(pendingPod.UID) == req.PodUid { + if pendingPod.Status.Phase == corev1.PodPending { + // Pod is pending - keep the request as is + isPendingPod = true + pod = pendingPod + } + } + if !isPendingPod { + // Pod gone or no bw annotation anymore => drop request + // Check if this pod had siblings on other nodes - they need updates + if oldReq, hadRequest := existingReqs[req.PodUid]; hadRequest { + log.Info("dropping request for missing pod", "podUid", req.PodUid, "podName", req.PodName) + // If pod was part of a workload with siblings, mark related nodes as affected + // We need to fetch sibling info to know which nodes to notify + // Use a best-effort approach: get pod from old request data if possible + var oldPod corev1.Pod + if err := r.Get(ctx, types.NamespacedName{Name: oldReq.PodName, Namespace: oldReq.Namespace}, &oldPod); err == nil { + _, nodes, _ := r.allSiblingsOnCurrentNode(ctx, &oldPod, nodeName) + for _, n := range nodes { + if !strings.EqualFold(n, nodeName) { + affectedRelatedNodes[n] = true + } } } } + continue } - continue } - ul, dl := r.GetBandwidthFromAnnotation(pod) + var ul, dl int64 + if isPendingPod { + ul, dl = req.Bandwidth.UlMbps, req.Bandwidth.DlMbps + } else { + ul, dl = r.GetBandwidthFromAnnotation(pod) + } // local bandwidth is always used // since pods are always connected to virtual bridge usedUlLocal += ul diff --git a/bandwidth-operator/vaclab-bandwidth-operator-0.1.9.tgz b/bandwidth-operator/vaclab-bandwidth-operator-0.1.9.tgz new file mode 100644 index 0000000000000000000000000000000000000000..6b44e120914868cccb8e622ad73eb25773e0f07a GIT binary patch literal 5882 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 Date: Fri, 16 Jan 2026 22:22:34 +0000 Subject: [PATCH 3/7] add helm 0.1.9 for bandwidth operator - keep pending pods in spec --- .../vaclab-bandwidth-operator-0.1.9.tgz | Bin 5882 -> 5882 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/bandwidth-operator/vaclab-bandwidth-operator-0.1.9.tgz b/bandwidth-operator/vaclab-bandwidth-operator-0.1.9.tgz index 6b44e120914868cccb8e622ad73eb25773e0f07a..e323a9ed31034ef9a3dc761734995c610e80a8a8 100644 GIT binary patch delta 5686 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 delta 5646 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 Date: Fri, 16 Jan 2026 22:28:08 +0000 Subject: [PATCH 4/7] Add Helm charts repository for GitHub Pages --- .nojekyll | 0 charts/index.yaml | 49 +++++++++++++++++++++ charts/vaclab-bandwidth-operator-0.1.9.tgz | Bin 0 -> 5882 bytes charts/vaclab-scheduler-0.30.7.tgz | Bin 0 -> 10655 bytes 4 files changed, 49 insertions(+) create mode 100644 .nojekyll create mode 100644 charts/index.yaml create mode 100644 charts/vaclab-bandwidth-operator-0.1.9.tgz create mode 100644 charts/vaclab-scheduler-0.30.7.tgz diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 0000000..e69de29 diff --git a/charts/index.yaml b/charts/index.yaml new file mode 100644 index 0000000..a573755 --- /dev/null +++ b/charts/index.yaml @@ -0,0 +1,49 @@ +apiVersion: v1 +entries: + vaclab-bandwidth-operator: + - apiVersion: v2 + appVersion: 0.1.9 + created: "2026-01-16T22:24:32.090233163Z" + description: Vaclab Kubernetes operator for bandwidth-aware workload scheduling + in Vaclab environments + digest: bf5be250bc03b156488e86412e1a698e877ce502282db6d16bd0b6d257159484 + icon: https://raw.githubusercontent.com/vacp2p/vaclab-2/feat/add_lab_components/extras/vac-logo-light-no-bg.png + keywords: + - kubernetes + - operator + - bandwidth + - networking + - scheduling + - vac + - DST + - IFT + - vaclab + maintainers: + - email: mamoutou@vac.dev + name: VAC DST Team + name: vaclab-bandwidth-operator + type: application + urls: + - https://vacp2p.github.io/vaclab-k8s-plugins/charts/vaclab-bandwidth-operator-0.1.9.tgz + version: 0.1.9 + vaclab-scheduler: + - apiVersion: v2 + appVersion: 0.30.7 + created: "2026-01-16T22:24:32.091321966Z" + description: deploy vaclab bandwidth-aware scheduler plugin as a second scheduler + in cluster + digest: 12b7dc35ae94178dc57dc483c6510e04681725bc9c7faae2240d02175d952683 + keywords: + - scheduler-plugins + - vaclab + - scheduler + - kubernetes + maintainers: + - email: mamoutou@vac.dev + name: mamoutou + name: vaclab-scheduler + type: application + urls: + - https://vacp2p.github.io/vaclab-k8s-plugins/charts/vaclab-scheduler-0.30.7.tgz + version: 0.30.7 +generated: "2026-01-16T22:24:32.088592058Z" diff --git a/charts/vaclab-bandwidth-operator-0.1.9.tgz b/charts/vaclab-bandwidth-operator-0.1.9.tgz new file mode 100644 index 0000000000000000000000000000000000000000..e323a9ed31034ef9a3dc761734995c610e80a8a8 GIT binary patch literal 5882 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 F0RYX?%&Y(a literal 0 HcmV?d00001 From 4cb2de3df002398be469dc1718d0595065e550a6 Mon Sep 17 00:00:00 2001 From: mamoutou-diarra Date: Sat, 17 Jan 2026 13:18:00 +0000 Subject: [PATCH 5/7] fiw bw resource creation conflict helm 0.2.0 --- charts/index.yaml | 31 +++++++++++++++++++-- charts/vaclab-bandwidth-operator-0.2.0.tgz | Bin 0 -> 5880 bytes 2 files changed, 28 insertions(+), 3 deletions(-) create mode 100644 charts/vaclab-bandwidth-operator-0.2.0.tgz diff --git a/charts/index.yaml b/charts/index.yaml index a573755..a32e51a 100644 --- a/charts/index.yaml +++ b/charts/index.yaml @@ -1,9 +1,34 @@ apiVersion: v1 entries: vaclab-bandwidth-operator: + - apiVersion: v2 + appVersion: 0.2.0 + created: "2026-01-17T13:16:34.587948649Z" + description: Vaclab Kubernetes operator for bandwidth-aware workload scheduling + in Vaclab environments + digest: 80b1b956d1a30c643ad1ed7eefd194c72ac2c69f4cc771a829e8d7dc0fda335e + icon: https://raw.githubusercontent.com/vacp2p/vaclab-2/feat/add_lab_components/extras/vac-logo-light-no-bg.png + keywords: + - kubernetes + - operator + - bandwidth + - networking + - scheduling + - vac + - DST + - IFT + - vaclab + maintainers: + - email: mamoutou@vac.dev + name: VAC DST Team + name: vaclab-bandwidth-operator + type: application + urls: + - https://vacp2p.github.io/vaclab-k8s-plugins/charts/vaclab-bandwidth-operator-0.2.0.tgz + version: 0.2.0 - apiVersion: v2 appVersion: 0.1.9 - created: "2026-01-16T22:24:32.090233163Z" + created: "2026-01-17T13:16:34.584902823Z" description: Vaclab Kubernetes operator for bandwidth-aware workload scheduling in Vaclab environments digest: bf5be250bc03b156488e86412e1a698e877ce502282db6d16bd0b6d257159484 @@ -29,7 +54,7 @@ entries: vaclab-scheduler: - apiVersion: v2 appVersion: 0.30.7 - created: "2026-01-16T22:24:32.091321966Z" + created: "2026-01-17T13:16:34.590539782Z" description: deploy vaclab bandwidth-aware scheduler plugin as a second scheduler in cluster digest: 12b7dc35ae94178dc57dc483c6510e04681725bc9c7faae2240d02175d952683 @@ -46,4 +71,4 @@ entries: urls: - https://vacp2p.github.io/vaclab-k8s-plugins/charts/vaclab-scheduler-0.30.7.tgz version: 0.30.7 -generated: "2026-01-16T22:24:32.088592058Z" +generated: "2026-01-17T13:16:34.582746523Z" diff --git a/charts/vaclab-bandwidth-operator-0.2.0.tgz b/charts/vaclab-bandwidth-operator-0.2.0.tgz new file mode 100644 index 0000000000000000000000000000000000000000..e6ee237c674817c1f12c578efbf1462ed270b299 GIT binary patch literal 5880 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 O0RR6z5nfyX%m4u8pNs4O literal 0 HcmV?d00001 From 9943856cedcec69883cf72d347cf8936af4fb4e5 Mon Sep 17 00:00:00 2001 From: mamoutou-diarra Date: Sat, 17 Jan 2026 13:18:23 +0000 Subject: [PATCH 6/7] fiw bw resource creation conflict helm 0.2.0 --- bandwidth-operator/dist/chart/Chart.yaml | 4 +- .../dist/chart/templates/manager/manager.yaml | 2 +- .../internal/controller/helpers.go | 45 +++++++++++------- .../vaclab-bandwidth-operator-0.2.0.tgz | Bin 0 -> 5880 bytes .../charts/vaclab-scheduler-0.30.7.tgz | Bin 10656 -> 10655 bytes 5 files changed, 31 insertions(+), 20 deletions(-) create mode 100644 bandwidth-operator/vaclab-bandwidth-operator-0.2.0.tgz diff --git a/bandwidth-operator/dist/chart/Chart.yaml b/bandwidth-operator/dist/chart/Chart.yaml index aafad4b..3fd91ef 100644 --- a/bandwidth-operator/dist/chart/Chart.yaml +++ b/bandwidth-operator/dist/chart/Chart.yaml @@ -2,8 +2,8 @@ apiVersion: v2 name: vaclab-bandwidth-operator description: Vaclab Kubernetes operator for bandwidth-aware workload scheduling in Vaclab environments type: application -version: 0.1.9 -appVersion: "0.1.9" +version: 0.2.0 +appVersion: "0.2.0" icon: "https://raw.githubusercontent.com/vacp2p/vaclab-2/feat/add_lab_components/extras/vac-logo-light-no-bg.png" keywords: - kubernetes diff --git a/bandwidth-operator/dist/chart/templates/manager/manager.yaml b/bandwidth-operator/dist/chart/templates/manager/manager.yaml index f016e49..3d62e7c 100644 --- a/bandwidth-operator/dist/chart/templates/manager/manager.yaml +++ b/bandwidth-operator/dist/chart/templates/manager/manager.yaml @@ -41,7 +41,7 @@ spec: {{- end }} command: - /manager - image: katakuri100/vaclab-bandwidth-operator:v0.1.9 + image: katakuri100/vaclab-bandwidth-operator:v0.2.0 imagePullPolicy: IfNotPresent livenessProbe: httpGet: diff --git a/bandwidth-operator/internal/controller/helpers.go b/bandwidth-operator/internal/controller/helpers.go index 477eca5..7feda91 100644 --- a/bandwidth-operator/internal/controller/helpers.go +++ b/bandwidth-operator/internal/controller/helpers.go @@ -61,10 +61,7 @@ func (r *BandwidthReconciler) setDefaultBandwidthValues(bandwidth *networkingv1. func (r *BandwidthReconciler) UpdateBandwidthStatus(ctx context.Context, bandwidth *networkingv1.Bandwidth) error { // UpdatedAt is set by caller only when status actually changes err := r.Status().Update(ctx, bandwidth) - // If conflict, return without error to allow retry - if errors.IsConflict(err) { - return nil - } + // Return conflict errors so controller can requeue return err } @@ -173,22 +170,36 @@ func (r *BandwidthReconciler) createBandwidthResourcesForAllNodes(ctx context.Co return err } - // Now update the status after creation + // Now update the status after creation with retry on conflict // Re-get the object to get the latest version - if err := r.Get(ctx, types.NamespacedName{Name: nodeName}, &bw); err != nil { - return err - } - - bw.Status.Status = networkingv1.Created - bw.Status.Capacity = bw.Spec.Capacity - bw.Status.UpdatedAt = metav1.NewTime(time.Now()) + maxRetries := 3 + for attempt := 0; attempt < maxRetries; attempt++ { + if err := r.Get(ctx, types.NamespacedName{Name: nodeName}, &bw); err != nil { + if attempt == maxRetries-1 { + // Give up on Get failures, let reconcile loop handle it + break + } + time.Sleep(100 * time.Millisecond) + continue + } - if err := r.UpdateBandwidthStatus(ctx, &bw); err != nil { - return err + bw.Status.Status = networkingv1.Created + bw.Status.Capacity = bw.Spec.Capacity + bw.Status.UpdatedAt = metav1.NewTime(time.Now()) + + if err := r.Status().Update(ctx, &bw); err != nil { + if errors.IsConflict(err) && attempt < maxRetries-1 { + // Retry on conflict + time.Sleep(100 * time.Millisecond) + continue + } + // On last attempt or non-conflict error, let reconcile loop handle it + break + } + // Success + r.generateEvent(networkingv1.EventVaclabNodeBandwidthCreated, &bw) + break } - - // Generate event - r.generateEvent(networkingv1.EventVaclabNodeBandwidthCreated, &bw) } return nil diff --git a/bandwidth-operator/vaclab-bandwidth-operator-0.2.0.tgz b/bandwidth-operator/vaclab-bandwidth-operator-0.2.0.tgz new file mode 100644 index 0000000000000000000000000000000000000000..e6ee237c674817c1f12c578efbf1462ed270b299 GIT binary patch literal 5880 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 O0RR6z5nfyX%m4u8pNs4O literal 0 HcmV?d00001 diff --git a/scheduler-plugins/manifests/install/charts/vaclab-scheduler-0.30.7.tgz b/scheduler-plugins/manifests/install/charts/vaclab-scheduler-0.30.7.tgz index 56f355e168e7451cc77db5ab223bba098e169960..207b70ae2a8a82702793aa093f3d2652c8cdd5fb 100644 GIT binary patch delta 10356 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 From 779a87a16b3e92ee0145806acb18973f7d948489 Mon Sep 17 00:00:00 2001 From: mamoutou-diarra Date: Sat, 17 Jan 2026 13:32:15 +0000 Subject: [PATCH 7/7] fix bw resource creation conflict helm 0.2.0 - 2 --- bandwidth-operator/dist/chart/Chart.yaml | 4 +-- .../dist/chart/templates/manager/manager.yaml | 2 +- .../internal/controller/setup_bandwidth.go | 12 +++++++ .../vaclab-bandwidth-operator-0.2.1.tgz | Bin 0 -> 5882 bytes charts/index.yaml | 33 +++++++++++++++--- charts/vaclab-bandwidth-operator-0.2.1.tgz | Bin 0 -> 5882 bytes 6 files changed, 44 insertions(+), 7 deletions(-) create mode 100644 bandwidth-operator/vaclab-bandwidth-operator-0.2.1.tgz create mode 100644 charts/vaclab-bandwidth-operator-0.2.1.tgz diff --git a/bandwidth-operator/dist/chart/Chart.yaml b/bandwidth-operator/dist/chart/Chart.yaml index 3fd91ef..5df5806 100644 --- a/bandwidth-operator/dist/chart/Chart.yaml +++ b/bandwidth-operator/dist/chart/Chart.yaml @@ -2,8 +2,8 @@ apiVersion: v2 name: vaclab-bandwidth-operator description: Vaclab Kubernetes operator for bandwidth-aware workload scheduling in Vaclab environments type: application -version: 0.2.0 -appVersion: "0.2.0" +version: 0.2.1 +appVersion: "0.2.1" icon: "https://raw.githubusercontent.com/vacp2p/vaclab-2/feat/add_lab_components/extras/vac-logo-light-no-bg.png" keywords: - kubernetes diff --git a/bandwidth-operator/dist/chart/templates/manager/manager.yaml b/bandwidth-operator/dist/chart/templates/manager/manager.yaml index 3d62e7c..4136673 100644 --- a/bandwidth-operator/dist/chart/templates/manager/manager.yaml +++ b/bandwidth-operator/dist/chart/templates/manager/manager.yaml @@ -41,7 +41,7 @@ spec: {{- end }} command: - /manager - image: katakuri100/vaclab-bandwidth-operator:v0.2.0 + image: katakuri100/vaclab-bandwidth-operator:v0.2.1 imagePullPolicy: IfNotPresent livenessProbe: httpGet: diff --git a/bandwidth-operator/internal/controller/setup_bandwidth.go b/bandwidth-operator/internal/controller/setup_bandwidth.go index cb53640..7c120ae 100644 --- a/bandwidth-operator/internal/controller/setup_bandwidth.go +++ b/bandwidth-operator/internal/controller/setup_bandwidth.go @@ -685,6 +685,18 @@ func (r *BandwidthReconciler) SyncFromSpecAndPods(ctx context.Context, bw *netwo return ctrl.Result{}, err } log.Info("bandwidth spec updated", "node", nodeName, "requests", len(cleanRequests)) + + // Re-fetch to get updated resourceVersion after spec update + if err := r.Get(ctx, client.ObjectKeyFromObject(bw), bw); err != nil { + return ctrl.Result{}, err + } + // Re-apply status fields since we just fetched fresh object + bw.Status.Used = usedCapacity + bw.Status.Remaining = remainingCapacity + bw.Status.Reservations = reservationInfo + bw.Status.Capacity = bw.Spec.Capacity + bw.Status.Status = networkingv1.Created + bw.Status.ErrorReason = "" } // Only update status if it actually changed diff --git a/bandwidth-operator/vaclab-bandwidth-operator-0.2.1.tgz b/bandwidth-operator/vaclab-bandwidth-operator-0.2.1.tgz new file mode 100644 index 0000000000000000000000000000000000000000..437dd76bbb6b4d206f80a0a99d5703977a9ce4b8 GIT binary patch literal 5882 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