...

Source file src/edge-infra.dev/pkg/edge/controllers/bannerctl/labels.go

Documentation: edge-infra.dev/pkg/edge/controllers/bannerctl

     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  		// check if label is for data sync optional pallet and data sync is enabled in banner, if not remove from labels
    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