package bannerctl import ( "context" "fmt" "slices" ctrl "sigs.k8s.io/controller-runtime" "edge-infra.dev/pkg/edge/api/graph/model" "edge-infra.dev/pkg/edge/api/services" "edge-infra.dev/pkg/edge/api/services/artifacts" bannerAPI "edge-infra.dev/pkg/edge/apis/banner/v1alpha1" capabilities "edge-infra.dev/pkg/edge/capabilities" "edge-infra.dev/pkg/k8s/runtime/controller/reconcile/recerr" ) func (r *BannerReconciler) reconcileAutomatedEdgeLabels(ctx context.Context, b *bannerAPI.Banner) recerr.Error { log := ctrl.LoggerFrom(ctx).WithName("automated-edge-labels") labelService := services.NewLabelService(artifacts.NewArtifactsService(r.EdgeDB.DB, nil), r.EdgeDB.DB) targetEdgeLabels := capabilities.EdgeAutomatedCapabilityLabels targetEdgeLabels = append(targetEdgeLabels, fetchEdgeCapabilityLabels()...) existingLabels, err := labelService.GetLabels(ctx, &b.Name) if err != nil { log.Error(err, "error getting labels for project") return recerr.New(err, bannerAPI.EdgeLabelFetchFailedReason) } var currentLabels []*model.Label for _, label := range existingLabels { if slices.Contains(capabilities.EdgeAutomatedCapabilityLabelTypes, label.Type) { currentLabels = append(currentLabels, label) } } for _, label := range currentLabels { expectedToExist := slices.ContainsFunc(targetEdgeLabels, func(expectedLabel *model.LabelInput) bool { return expectedLabel.Key == label.Key }) // check if label is for data sync optional pallet and data sync is enabled in banner, if not remove from labels if label.Key == capabilities.DataSyncPallet && !slices.Contains(b.Spec.Enablements, CouchDBEnablement) { expectedToExist = false } if expectedToExist { continue } if err := labelService.DeleteLabels(ctx, label.LabelEdgeID); err != nil { log.Error(err, fmt.Sprintf("error deleting edge capability %s for project", label.Key)) return recerr.New(err, bannerAPI.EdgeLabelDeletionFailedReason) } } for _, edgeLabel := range targetEdgeLabels { exists := slices.ContainsFunc(existingLabels, func(label *model.Label) bool { return edgeLabel.Key == label.Key }) if exists { continue } edgeLabel.BannerEdgeID = b.Name if err := labelService.CreateLabel(ctx, edgeLabel); err != nil { log.Error(err, fmt.Sprintf("error creating edge label %s for project", edgeLabel.Key)) return recerr.New(err, bannerAPI.EdgeLabelCreationFailedReason) } } log.Info("successfully synced edge labels") return nil } func fetchEdgeCapabilityLabels() []*model.LabelInput { labels := []*model.LabelInput{} for _, capability := range capabilities.EdgeCapabilities { labels = append(labels, capabilities.NewCapabilityLabel(capability)) } return labels }