...
1 package bannerctl
2
3 import (
4 "context"
5 "fmt"
6 "slices"
7
8 ctrl "sigs.k8s.io/controller-runtime"
9
10 "edge-infra.dev/pkg/edge/api/graph/model"
11 "edge-infra.dev/pkg/edge/api/services"
12 "edge-infra.dev/pkg/edge/api/services/artifacts"
13 bannerAPI "edge-infra.dev/pkg/edge/apis/banner/v1alpha1"
14 capabilities "edge-infra.dev/pkg/edge/capabilities"
15 "edge-infra.dev/pkg/k8s/runtime/controller/reconcile/recerr"
16 )
17
18 func (r *BannerReconciler) reconcileAutomatedEdgeLabels(ctx context.Context, b *bannerAPI.Banner) recerr.Error {
19 log := ctrl.LoggerFrom(ctx).WithName("automated-edge-labels")
20 labelService := services.NewLabelService(artifacts.NewArtifactsService(r.EdgeDB.DB, nil), r.EdgeDB.DB)
21
22 targetEdgeLabels := capabilities.EdgeAutomatedCapabilityLabels
23 targetEdgeLabels = append(targetEdgeLabels, fetchEdgeCapabilityLabels()...)
24
25 existingLabels, err := labelService.GetLabels(ctx, &b.Name)
26 if err != nil {
27 log.Error(err, "error getting labels for project")
28 return recerr.New(err, bannerAPI.EdgeLabelFetchFailedReason)
29 }
30
31 var currentLabels []*model.Label
32 for _, label := range existingLabels {
33 if slices.Contains(capabilities.EdgeAutomatedCapabilityLabelTypes, label.Type) {
34 currentLabels = append(currentLabels, label)
35 }
36 }
37
38 for _, label := range currentLabels {
39 expectedToExist := slices.ContainsFunc(targetEdgeLabels, func(expectedLabel *model.LabelInput) bool {
40 return expectedLabel.Key == label.Key
41 })
42
43
44 if label.Key == capabilities.DataSyncPallet && !slices.Contains(b.Spec.Enablements, CouchDBEnablement) {
45 expectedToExist = false
46 }
47
48 if expectedToExist {
49 continue
50 }
51
52 if err := labelService.DeleteLabels(ctx, label.LabelEdgeID); err != nil {
53 log.Error(err, fmt.Sprintf("error deleting edge capability %s for project", label.Key))
54 return recerr.New(err, bannerAPI.EdgeLabelDeletionFailedReason)
55 }
56 }
57
58 for _, edgeLabel := range targetEdgeLabels {
59 exists := slices.ContainsFunc(existingLabels, func(label *model.Label) bool { return edgeLabel.Key == label.Key })
60 if exists {
61 continue
62 }
63
64 edgeLabel.BannerEdgeID = b.Name
65 if err := labelService.CreateLabel(ctx, edgeLabel); err != nil {
66 log.Error(err, fmt.Sprintf("error creating edge label %s for project", edgeLabel.Key))
67 return recerr.New(err, bannerAPI.EdgeLabelCreationFailedReason)
68 }
69 }
70 log.Info("successfully synced edge labels")
71 return nil
72 }
73
74 func fetchEdgeCapabilityLabels() []*model.LabelInput {
75 labels := []*model.LabelInput{}
76 for _, capability := range capabilities.EdgeCapabilities {
77 labels = append(labels, capabilities.NewCapabilityLabel(capability))
78 }
79 return labels
80 }
81
View as plain text