* Provisioning: Add fieldSelector for Repository by spec.connection.name This change adds the ability to filter repositories by their connection name using Kubernetes field selectors, enabling queries like: kubectl get repositories --field-selector spec.connection.name=my-connection Implementation: - Add RepositoryGetAttrs and RepositoryToSelectableFields functions - Register field label conversion for spec.connection.name in InstallSchema - Extend generic storage to support custom selectable fields via NewRegistryStoreWithSelectableFields - Add unit tests for repository field functions - Add integration tests for field selector functionality * Simplify predicateFunc handling with custom attrFunc Remove unnecessary custom predicateFunc wrapper when using a custom GetAttrs function. When attrFunc is provided via StoreOptions, passing nil for predicateFunc allows the default behavior to create the appropriate SelectionPredicate automatically. Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
45 lines
1.5 KiB
Go
45 lines
1.5 KiB
Go
package provisioning
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"k8s.io/apimachinery/pkg/fields"
|
|
"k8s.io/apimachinery/pkg/labels"
|
|
"k8s.io/apimachinery/pkg/runtime"
|
|
"k8s.io/apiserver/pkg/registry/generic"
|
|
|
|
provisioning "github.com/grafana/grafana/apps/provisioning/pkg/apis/provisioning/v0alpha1"
|
|
)
|
|
|
|
// RepositoryToSelectableFields returns a field set that can be used for field selectors.
|
|
// This includes standard metadata fields plus custom fields like spec.connection.name.
|
|
func RepositoryToSelectableFields(obj *provisioning.Repository) fields.Set {
|
|
objectMetaFields := generic.ObjectMetaFieldsSet(&obj.ObjectMeta, true)
|
|
|
|
// Add custom selectable fields
|
|
specificFields := fields.Set{
|
|
"spec.connection.name": getConnectionName(obj),
|
|
}
|
|
|
|
return generic.MergeFieldsSets(objectMetaFields, specificFields)
|
|
}
|
|
|
|
// getConnectionName safely extracts the connection name from a Repository.
|
|
// Returns empty string if no connection is configured.
|
|
func getConnectionName(obj *provisioning.Repository) string {
|
|
if obj == nil || obj.Spec.Connection == nil {
|
|
return ""
|
|
}
|
|
return obj.Spec.Connection.Name
|
|
}
|
|
|
|
// RepositoryGetAttrs returns labels and fields of a Repository object.
|
|
// This is used by the storage layer for filtering.
|
|
func RepositoryGetAttrs(obj runtime.Object) (labels.Set, fields.Set, error) {
|
|
repo, ok := obj.(*provisioning.Repository)
|
|
if !ok {
|
|
return nil, nil, fmt.Errorf("given object is not a Repository")
|
|
}
|
|
return labels.Set(repo.Labels), RepositoryToSelectableFields(repo), nil
|
|
}
|