1
0
mirror of https://github.com/rancher/steve.git synced 2025-09-18 00:08:17 +00:00

[v2.9] Virtual Resource filters (#288)

Adds logic which adds virtual fields resources. This allows these fields
to be sorted/filtered on when the SQL cache is enabled. Id and
metadata.state.name were added as the first two fields.

Co-authored-by: Michael Bolot <michael.bolot@suse.com>
This commit is contained in:
Silvio Moioli
2024-10-02 14:59:54 +02:00
committed by GitHub
parent aacb5b82de
commit dd27bd0c8d
15 changed files with 611 additions and 122 deletions

View File

@@ -111,7 +111,7 @@ func (s *Store) Delete(apiOp *types.APIRequest, schema *types.APISchema, id stri
if err != nil {
return types.APIObject{}, err
}
return ToAPI(schema, obj, warnings), nil
return ToAPI(schema, obj, warnings, types.ReservedFields), nil
}
// ByID looks up a single object by its ID.
@@ -125,7 +125,7 @@ func (s *Store) ByID(apiOp *types.APIRequest, schema *types.APISchema, id string
if err != nil {
return types.APIObject{}, err
}
return ToAPI(schema, obj, warnings), nil
return ToAPI(schema, obj, warnings, types.ReservedFields), nil
}
func (s *Store) listPartition(ctx context.Context, apiOp *types.APIRequest, schema *types.APISchema, partition Partition,
@@ -227,7 +227,7 @@ func (s *Store) List(apiOp *types.APIRequest, schema *types.APISchema) (types.AP
for _, item := range list {
item := item.DeepCopy()
result.Objects = append(result.Objects, ToAPI(schema, item, nil))
result.Objects = append(result.Objects, ToAPI(schema, item, nil, types.ReservedFields))
}
result.Pages = pages
@@ -267,7 +267,7 @@ func (s *Store) Create(apiOp *types.APIRequest, schema *types.APISchema, data ty
if err != nil {
return types.APIObject{}, err
}
return ToAPI(schema, obj, warnings), nil
return ToAPI(schema, obj, warnings, types.ReservedFields), nil
}
// Update updates a single object in the store.
@@ -281,7 +281,7 @@ func (s *Store) Update(apiOp *types.APIRequest, schema *types.APISchema, data ty
if err != nil {
return types.APIObject{}, err
}
return ToAPI(schema, obj, warnings), nil
return ToAPI(schema, obj, warnings, types.ReservedFields), nil
}
// Watch returns a channel of events for a list or resource.
@@ -327,13 +327,13 @@ func (s *Store) Watch(apiOp *types.APIRequest, schema *types.APISchema, wr types
return response, nil
}
func ToAPI(schema *types.APISchema, obj runtime.Object, warnings []types.Warning) types.APIObject {
func ToAPI(schema *types.APISchema, obj runtime.Object, warnings []types.Warning, reservedFields map[string]bool) types.APIObject {
if obj == nil || reflect.ValueOf(obj).IsNil() {
return types.APIObject{}
}
if unstr, ok := obj.(*unstructured.Unstructured); ok {
obj = moveToUnderscore(unstr)
obj = moveToUnderscore(unstr, reservedFields)
}
apiObject := types.APIObject{
@@ -357,12 +357,12 @@ func ToAPI(schema *types.APISchema, obj runtime.Object, warnings []types.Warning
return apiObject
}
func moveToUnderscore(obj *unstructured.Unstructured) *unstructured.Unstructured {
func moveToUnderscore(obj *unstructured.Unstructured, reservedFields map[string]bool) *unstructured.Unstructured {
if obj == nil {
return nil
}
for k := range types.ReservedFields {
for k := range reservedFields {
v, ok := obj.Object[k]
if ok {
delete(obj.Object, k)
@@ -394,7 +394,7 @@ func ToAPIEvent(apiOp *types.APIRequest, schema *types.APISchema, event watch.Ev
return apiEvent
}
apiEvent.Object = ToAPI(schema, event.Object, nil)
apiEvent.Object = ToAPI(schema, event.Object, nil, types.ReservedFields)
m, err := meta.Accessor(event.Object)
if err != nil {