2024-02-07 14:05:10 -06:00
|
|
|
package entity
|
|
|
|
|
|
|
|
import (
|
2024-05-01 01:42:47 -05:00
|
|
|
"github.com/grafana/grafana/pkg/services/apiserver/utils"
|
2024-02-07 14:05:10 -06:00
|
|
|
apierrors "k8s.io/apimachinery/pkg/api/errors"
|
|
|
|
"k8s.io/apimachinery/pkg/labels"
|
|
|
|
"k8s.io/apimachinery/pkg/selection"
|
|
|
|
)
|
|
|
|
|
2024-03-15 18:17:54 -05:00
|
|
|
const FolderAnnoKey = "grafana.app/folder"
|
|
|
|
const SortByKey = "grafana.app/sortBy"
|
|
|
|
const ListDeletedKey = "grafana.app/listDeleted"
|
|
|
|
const ListHistoryKey = "grafana.app/listHistory"
|
2024-02-07 14:05:10 -06:00
|
|
|
|
|
|
|
type Requirements struct {
|
|
|
|
// Equals folder
|
|
|
|
Folder *string
|
|
|
|
// SortBy is a list of fields to sort by
|
|
|
|
SortBy []string
|
2024-03-11 12:59:54 -05:00
|
|
|
// ListDeleted is a flag to list deleted entities
|
|
|
|
ListDeleted bool
|
2024-03-15 18:17:54 -05:00
|
|
|
// ListHistory is a resource name to list the history of
|
|
|
|
ListHistory string
|
2024-05-01 01:42:47 -05:00
|
|
|
// ListOriginKeys needs to include the origin key of a given entity in order for it to be selected.
|
|
|
|
ListOriginKeys []string
|
2024-02-07 14:05:10 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
func ReadLabelSelectors(selector labels.Selector) (Requirements, labels.Selector, error) {
|
|
|
|
requirements := Requirements{}
|
|
|
|
newSelector := labels.NewSelector()
|
|
|
|
|
|
|
|
if selector == nil {
|
|
|
|
return requirements, newSelector, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
labelSelectors, _ := selector.Requirements()
|
|
|
|
|
|
|
|
for _, r := range labelSelectors {
|
|
|
|
switch r.Key() {
|
2024-03-15 18:17:54 -05:00
|
|
|
case FolderAnnoKey:
|
2024-02-07 14:05:10 -06:00
|
|
|
if (r.Operator() != selection.Equals) && (r.Operator() != selection.DoubleEquals) {
|
2024-03-15 18:17:54 -05:00
|
|
|
return requirements, newSelector, apierrors.NewBadRequest(FolderAnnoKey + " label selector only supports equality")
|
2024-02-07 14:05:10 -06:00
|
|
|
}
|
|
|
|
folder := r.Values().List()[0]
|
|
|
|
requirements.Folder = &folder
|
2024-03-15 18:17:54 -05:00
|
|
|
case SortByKey:
|
2024-02-07 14:05:10 -06:00
|
|
|
if r.Operator() != selection.In {
|
2024-03-15 18:17:54 -05:00
|
|
|
return requirements, newSelector, apierrors.NewBadRequest(SortByKey + " label selector only supports in")
|
2024-02-07 14:05:10 -06:00
|
|
|
}
|
|
|
|
requirements.SortBy = r.Values().List()
|
2024-05-01 01:42:47 -05:00
|
|
|
case utils.AnnoKeyOriginKey:
|
|
|
|
if r.Operator() != selection.In {
|
|
|
|
return requirements, newSelector, apierrors.NewBadRequest(SortByKey + " label selector only supports in")
|
|
|
|
}
|
|
|
|
requirements.ListOriginKeys = r.Values().List()
|
2024-03-15 18:17:54 -05:00
|
|
|
case ListDeletedKey:
|
2024-03-11 12:59:54 -05:00
|
|
|
if r.Operator() != selection.Equals {
|
2024-03-15 18:17:54 -05:00
|
|
|
return requirements, newSelector, apierrors.NewBadRequest(ListDeletedKey + " label selector only supports equality")
|
2024-03-11 12:59:54 -05:00
|
|
|
}
|
|
|
|
if len(r.Values().List()) != 1 {
|
2024-03-15 18:17:54 -05:00
|
|
|
return requirements, newSelector, apierrors.NewBadRequest(ListDeletedKey + " label selector only supports one value")
|
2024-03-11 12:59:54 -05:00
|
|
|
}
|
|
|
|
if r.Values().List()[0] != "true" && r.Values().List()[0] != "false" {
|
2024-03-15 18:17:54 -05:00
|
|
|
return requirements, newSelector, apierrors.NewBadRequest(ListDeletedKey + " label selector only supports true or false")
|
2024-03-11 12:59:54 -05:00
|
|
|
}
|
|
|
|
requirements.ListDeleted = r.Values().List()[0] == "true"
|
2024-03-15 18:17:54 -05:00
|
|
|
case ListHistoryKey:
|
|
|
|
if r.Operator() != selection.Equals {
|
|
|
|
return requirements, newSelector, apierrors.NewBadRequest(ListHistoryKey + " label selector only supports equality")
|
|
|
|
}
|
|
|
|
if len(r.Values().List()) != 1 {
|
|
|
|
return requirements, newSelector, apierrors.NewBadRequest(ListHistoryKey + " label selector only supports one value")
|
|
|
|
}
|
|
|
|
if r.Values().List()[0] == "" {
|
|
|
|
return requirements, newSelector, apierrors.NewBadRequest(ListHistoryKey + " label selector must not be empty")
|
|
|
|
}
|
|
|
|
requirements.ListHistory = r.Values().List()[0]
|
2024-02-07 14:05:10 -06:00
|
|
|
// add all unregonized label selectors to the new selector list, these will be processed by the entity store
|
|
|
|
default:
|
|
|
|
newSelector = newSelector.Add(r)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2024-03-15 18:17:54 -05:00
|
|
|
if requirements.ListDeleted && requirements.ListHistory != "" {
|
|
|
|
return requirements, newSelector, apierrors.NewBadRequest("cannot list deleted and history at the same time")
|
|
|
|
}
|
|
|
|
|
2024-02-07 14:05:10 -06:00
|
|
|
return requirements, newSelector, nil
|
|
|
|
}
|