mirror of
https://github.com/rancher/steve.git
synced 2025-08-25 01:19:31 +00:00
Fix CRD Created At
field (#723)
* Add Tokens and Kubeconfig fields to date mapping * Fix missing cols in transform func for watch * Mark CRDs as.. CRD * Don't transform CRD's date field
This commit is contained in:
parent
127d37391d
commit
faa5ad63e9
@ -152,6 +152,20 @@ func SetAPIResource(s *types.APISchema, resource v1.APIResource) {
|
|||||||
SetNamespaced(s, resource.Namespaced)
|
SetNamespaced(s, resource.Namespaced)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func MarkCRD(s *types.APISchema) {
|
||||||
|
if s.Attributes == nil {
|
||||||
|
s.Attributes = map[string]interface{}{}
|
||||||
|
}
|
||||||
|
s.Attributes["crd"] = true
|
||||||
|
}
|
||||||
|
|
||||||
|
func IsCRD(s *types.APISchema) bool {
|
||||||
|
if crd, ok := s.Attributes["crd"]; ok {
|
||||||
|
return crd.(bool)
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
func SetColumns(s *types.APISchema, columns interface{}) {
|
func SetColumns(s *types.APISchema, columns interface{}) {
|
||||||
if s.Attributes == nil {
|
if s.Attributes == nil {
|
||||||
s.Attributes = map[string]interface{}{}
|
s.Attributes = map[string]interface{}{}
|
||||||
|
@ -172,7 +172,8 @@ func formatter(summarycache common.SummaryCache, asl accesscontrol.AccessSetLook
|
|||||||
excludeValues(request, unstr)
|
excludeValues(request, unstr)
|
||||||
|
|
||||||
if options.InSQLMode {
|
if options.InSQLMode {
|
||||||
convertMetadataTimestampFields(request, gvk, unstr)
|
isCRD := attributes.IsCRD(resource.Schema)
|
||||||
|
convertMetadataTimestampFields(request, gvk, unstr, isCRD)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -233,12 +234,15 @@ func excludeFields(request *types.APIRequest, unstr *unstructured.Unstructured)
|
|||||||
// to the client. Internally, fields are stored as Unix timestamps; on each request, we calculate the elapsed time since
|
// to the client. Internally, fields are stored as Unix timestamps; on each request, we calculate the elapsed time since
|
||||||
// those timestamps by subtracting them from time.Now(), then format the resulting duration into a human-friendly string.
|
// those timestamps by subtracting them from time.Now(), then format the resulting duration into a human-friendly string.
|
||||||
// This prevents cached durations (e.g. “2d” - 2 days) from becoming stale over time.
|
// This prevents cached durations (e.g. “2d” - 2 days) from becoming stale over time.
|
||||||
func convertMetadataTimestampFields(request *types.APIRequest, gvk schema2.GroupVersionKind, unstr *unstructured.Unstructured) {
|
func convertMetadataTimestampFields(request *types.APIRequest, gvk schema2.GroupVersionKind, unstr *unstructured.Unstructured, isCRD bool) {
|
||||||
if request.Schema != nil {
|
if request.Schema != nil {
|
||||||
cols := GetColumnDefinitions(request.Schema)
|
cols := GetColumnDefinitions(request.Schema)
|
||||||
for _, col := range cols {
|
for _, col := range cols {
|
||||||
gvkDateFields, gvkFound := DateFieldsByGVKBuiltins[gvk]
|
gvkDateFields, gvkFound := DateFieldsByGVK[gvk]
|
||||||
if col.Type == "date" || (gvkFound && slices.Contains(gvkDateFields, col.Name)) {
|
|
||||||
|
hasCRDDateField := isCRD && col.Type == "date"
|
||||||
|
hasGVKDateFieldMapping := gvkFound && slices.Contains(gvkDateFields, col.Name)
|
||||||
|
if hasCRDDateField || hasGVKDateFieldMapping {
|
||||||
index := GetIndexValueFromString(col.Field)
|
index := GetIndexValueFromString(col.Field)
|
||||||
if index == -1 {
|
if index == -1 {
|
||||||
logrus.Errorf("field index not found at column.Field struct variable: %s", col.Field)
|
logrus.Errorf("field index not found at column.Field struct variable: %s", col.Field)
|
||||||
|
@ -4,7 +4,7 @@ import (
|
|||||||
"k8s.io/apimachinery/pkg/runtime/schema"
|
"k8s.io/apimachinery/pkg/runtime/schema"
|
||||||
)
|
)
|
||||||
|
|
||||||
var DateFieldsByGVKBuiltins = map[schema.GroupVersionKind][]string{
|
var DateFieldsByGVK = map[schema.GroupVersionKind][]string{
|
||||||
{Group: "", Version: "v1", Kind: "ConfigMap"}: {"Age"},
|
{Group: "", Version: "v1", Kind: "ConfigMap"}: {"Age"},
|
||||||
{Group: "", Version: "v1", Kind: "Endpoints"}: {"Age"},
|
{Group: "", Version: "v1", Kind: "Endpoints"}: {"Age"},
|
||||||
{Group: "", Version: "v1", Kind: "Event"}: {"Last Seen", "First Seen"},
|
{Group: "", Version: "v1", Kind: "Event"}: {"Last Seen", "First Seen"},
|
||||||
@ -37,6 +37,9 @@ var DateFieldsByGVKBuiltins = map[schema.GroupVersionKind][]string{
|
|||||||
{Group: "autoscaling", Version: "v1", Kind: "Scale"}: {"Age"},
|
{Group: "autoscaling", Version: "v1", Kind: "Scale"}: {"Age"},
|
||||||
{Group: "autoscaling", Version: "v2beta1", Kind: "HorizontalPodAutoscaler"}: {"Age"},
|
{Group: "autoscaling", Version: "v2beta1", Kind: "HorizontalPodAutoscaler"}: {"Age"},
|
||||||
|
|
||||||
|
{Group: "ext.cattle.io", Version: "v1", Kind: "Token"}: {"Age"},
|
||||||
|
{Group: "ext.cattle.io", Version: "v1", Kind: "Kubeconfig"}: {"Age"},
|
||||||
|
|
||||||
{Group: "batch", Version: "v1", Kind: "Job"}: {"Duration", "Age"},
|
{Group: "batch", Version: "v1", Kind: "Job"}: {"Duration", "Age"},
|
||||||
{Group: "batch", Version: "v1beta1", Kind: "CronJob"}: {"Last Schedule", "Age"},
|
{Group: "batch", Version: "v1beta1", Kind: "CronJob"}: {"Last Schedule", "Age"},
|
||||||
|
|
||||||
|
@ -35,7 +35,7 @@ func NewTransformBuilder(cache common.SummaryCache) *TransformBuilder {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// GetTransformFunc returns the func to transform a raw object into a fixed object, if needed
|
// GetTransformFunc returns the func to transform a raw object into a fixed object, if needed
|
||||||
func (t *TransformBuilder) GetTransformFunc(gvk schema.GroupVersionKind, columns []rescommon.ColumnDefinition) cache.TransformFunc {
|
func (t *TransformBuilder) GetTransformFunc(gvk schema.GroupVersionKind, columns []rescommon.ColumnDefinition, isCRD bool) cache.TransformFunc {
|
||||||
converters := make([]func(*unstructured.Unstructured) (*unstructured.Unstructured, error), 0)
|
converters := make([]func(*unstructured.Unstructured) (*unstructured.Unstructured, error), 0)
|
||||||
if gvk.Kind == "Event" && gvk.Group == "" && gvk.Version == "v1" {
|
if gvk.Kind == "Event" && gvk.Group == "" && gvk.Version == "v1" {
|
||||||
converters = append(converters, events.TransformEventObject)
|
converters = append(converters, events.TransformEventObject)
|
||||||
@ -45,8 +45,10 @@ func (t *TransformBuilder) GetTransformFunc(gvk schema.GroupVersionKind, columns
|
|||||||
|
|
||||||
// Detecting if we need to convert date fields
|
// Detecting if we need to convert date fields
|
||||||
for _, col := range columns {
|
for _, col := range columns {
|
||||||
gvkDateFields, gvkFound := rescommon.DateFieldsByGVKBuiltins[gvk]
|
gvkDateFields, gvkFound := rescommon.DateFieldsByGVK[gvk]
|
||||||
if col.Type == "date" || (gvkFound && slices.Contains(gvkDateFields, col.Name)) {
|
hasCRDDate := isCRD && col.Type == "date"
|
||||||
|
hasBuiltInDate := gvkFound && slices.Contains(gvkDateFields, col.Name)
|
||||||
|
if hasCRDDate || hasBuiltInDate {
|
||||||
converters = append(converters, func(obj *unstructured.Unstructured) (*unstructured.Unstructured, error) {
|
converters = append(converters, func(obj *unstructured.Unstructured) (*unstructured.Unstructured, error) {
|
||||||
index := rescommon.GetIndexValueFromString(col.Field)
|
index := rescommon.GetIndexValueFromString(col.Field)
|
||||||
if index == -1 {
|
if index == -1 {
|
||||||
|
@ -25,6 +25,7 @@ func TestTransformChain(t *testing.T) {
|
|||||||
hasSummary *summary.SummarizedObject
|
hasSummary *summary.SummarizedObject
|
||||||
hasRelationships []summarycache.Relationship
|
hasRelationships []summarycache.Relationship
|
||||||
columns []rescommon.ColumnDefinition
|
columns []rescommon.ColumnDefinition
|
||||||
|
isCRD bool
|
||||||
wantOutput any
|
wantOutput any
|
||||||
wantError bool
|
wantError bool
|
||||||
}{
|
}{
|
||||||
@ -130,6 +131,7 @@ func TestTransformChain(t *testing.T) {
|
|||||||
"id": "old-id",
|
"id": "old-id",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
isCRD: true,
|
||||||
columns: []rescommon.ColumnDefinition{
|
columns: []rescommon.ColumnDefinition{
|
||||||
{
|
{
|
||||||
Field: "metadata.fields[0]",
|
Field: "metadata.fields[0]",
|
||||||
@ -224,6 +226,69 @@ func TestTransformChain(t *testing.T) {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: "built-in type metadata.fields has a date field - should NOT convert to timestamp",
|
||||||
|
hasSummary: &summary.SummarizedObject{
|
||||||
|
PartialObjectMetadata: v1.PartialObjectMetadata{
|
||||||
|
ObjectMeta: v1.ObjectMeta{
|
||||||
|
Name: "testobj",
|
||||||
|
Namespace: "test-ns",
|
||||||
|
},
|
||||||
|
TypeMeta: v1.TypeMeta{
|
||||||
|
APIVersion: "apiextensions.k8s.io/v1",
|
||||||
|
Kind: "CustomResourceDefinition",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Summary: summary.Summary{
|
||||||
|
State: "success",
|
||||||
|
Transitioning: false,
|
||||||
|
Error: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
input: &unstructured.Unstructured{
|
||||||
|
Object: map[string]interface{}{
|
||||||
|
"apiVersion": "apiextensions.k8s.io/v1",
|
||||||
|
"kind": "CustomResourceDefinition",
|
||||||
|
"metadata": map[string]interface{}{
|
||||||
|
"name": "testobj",
|
||||||
|
"namespace": "test-ns",
|
||||||
|
"fields": []interface{}{"2025-07-03T18:54:57Z"},
|
||||||
|
},
|
||||||
|
"id": "old-id",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
columns: []rescommon.ColumnDefinition{
|
||||||
|
{
|
||||||
|
TableColumnDefinition: v1.TableColumnDefinition{
|
||||||
|
Name: "Created At",
|
||||||
|
Type: "date",
|
||||||
|
},
|
||||||
|
Field: "metadata.fields[0]",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
wantOutput: &unstructured.Unstructured{
|
||||||
|
Object: map[string]interface{}{
|
||||||
|
"apiVersion": "apiextensions.k8s.io/v1",
|
||||||
|
"kind": "CustomResourceDefinition",
|
||||||
|
"metadata": map[string]interface{}{
|
||||||
|
"name": "testobj",
|
||||||
|
"namespace": "test-ns",
|
||||||
|
"relationships": []any(nil),
|
||||||
|
"state": map[string]interface{}{
|
||||||
|
"name": "success",
|
||||||
|
"error": false,
|
||||||
|
"transitioning": false,
|
||||||
|
"message": "",
|
||||||
|
},
|
||||||
|
"fields": []interface{}{
|
||||||
|
"2025-07-03T18:54:57Z",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"id": "test-ns/testobj",
|
||||||
|
"_id": "old-id",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
{
|
{
|
||||||
name: "processable event",
|
name: "processable event",
|
||||||
input: &unstructured.Unstructured{
|
input: &unstructured.Unstructured{
|
||||||
@ -497,7 +562,7 @@ func TestTransformChain(t *testing.T) {
|
|||||||
if test.name == "a non-ready cluster" {
|
if test.name == "a non-ready cluster" {
|
||||||
fmt.Printf("Stop here")
|
fmt.Printf("Stop here")
|
||||||
}
|
}
|
||||||
output, err := tb.GetTransformFunc(gvk, test.columns)(test.input)
|
output, err := tb.GetTransformFunc(gvk, test.columns, test.isCRD)(test.input)
|
||||||
require.Equal(t, test.wantOutput, output)
|
require.Equal(t, test.wantOutput, output)
|
||||||
if test.wantError {
|
if test.wantError {
|
||||||
require.Error(t, err)
|
require.Error(t, err)
|
||||||
|
@ -71,6 +71,7 @@ func forVersion(group, kind string, version v1.CustomResourceDefinitionVersion,
|
|||||||
if schema == nil {
|
if schema == nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
attributes.MarkCRD(schema)
|
||||||
if len(versionColumns) > 0 {
|
if len(versionColumns) > 0 {
|
||||||
attributes.SetColumns(schema, versionColumns)
|
attributes.SetColumns(schema, versionColumns)
|
||||||
}
|
}
|
||||||
|
@ -167,6 +167,7 @@ func TestAddCustomResources(t *testing.T) {
|
|||||||
Schema: &wranglerSchema.Schema{
|
Schema: &wranglerSchema.Schema{
|
||||||
ID: "testgroup.v1.testresource",
|
ID: "testgroup.v1.testresource",
|
||||||
Attributes: map[string]interface{}{
|
Attributes: map[string]interface{}{
|
||||||
|
"crd": true,
|
||||||
"columns": []table.Column{
|
"columns": []table.Column{
|
||||||
{
|
{
|
||||||
Name: "TestColumn",
|
Name: "TestColumn",
|
||||||
|
@ -160,6 +160,7 @@ func TestToSchemas(t *testing.T) {
|
|||||||
ID: "testgroup.v1.testresource",
|
ID: "testgroup.v1.testresource",
|
||||||
PluralName: "TestGroup.v1.testResources",
|
PluralName: "TestGroup.v1.testResources",
|
||||||
Attributes: map[string]interface{}{
|
Attributes: map[string]interface{}{
|
||||||
|
"crd": true,
|
||||||
"group": "TestGroup",
|
"group": "TestGroup",
|
||||||
"version": "v1",
|
"version": "v1",
|
||||||
"kind": "TestResource",
|
"kind": "TestResource",
|
||||||
|
@ -396,15 +396,15 @@ func (m *MockTransformBuilder) EXPECT() *MockTransformBuilderMockRecorder {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// GetTransformFunc mocks base method.
|
// GetTransformFunc mocks base method.
|
||||||
func (m *MockTransformBuilder) GetTransformFunc(gvk schema.GroupVersionKind, colDefs []common.ColumnDefinition) cache.TransformFunc {
|
func (m *MockTransformBuilder) GetTransformFunc(gvk schema.GroupVersionKind, colDefs []common.ColumnDefinition, isCRD bool) cache.TransformFunc {
|
||||||
m.ctrl.T.Helper()
|
m.ctrl.T.Helper()
|
||||||
ret := m.ctrl.Call(m, "GetTransformFunc", gvk, colDefs)
|
ret := m.ctrl.Call(m, "GetTransformFunc", gvk, colDefs, isCRD)
|
||||||
ret0, _ := ret[0].(cache.TransformFunc)
|
ret0, _ := ret[0].(cache.TransformFunc)
|
||||||
return ret0
|
return ret0
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetTransformFunc indicates an expected call of GetTransformFunc.
|
// GetTransformFunc indicates an expected call of GetTransformFunc.
|
||||||
func (mr *MockTransformBuilderMockRecorder) GetTransformFunc(gvk, colDefs any) *gomock.Call {
|
func (mr *MockTransformBuilderMockRecorder) GetTransformFunc(gvk, colDefs, isCRD any) *gomock.Call {
|
||||||
mr.mock.ctrl.T.Helper()
|
mr.mock.ctrl.T.Helper()
|
||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetTransformFunc", reflect.TypeOf((*MockTransformBuilder)(nil).GetTransformFunc), gvk, colDefs)
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetTransformFunc", reflect.TypeOf((*MockTransformBuilder)(nil).GetTransformFunc), gvk, colDefs, isCRD)
|
||||||
}
|
}
|
||||||
|
@ -262,7 +262,7 @@ type RelationshipNotifier interface {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type TransformBuilder interface {
|
type TransformBuilder interface {
|
||||||
GetTransformFunc(gvk schema.GroupVersionKind, colDefs []common.ColumnDefinition) cache.TransformFunc
|
GetTransformFunc(gvk schema.GroupVersionKind, colDefs []common.ColumnDefinition, isCRD bool) cache.TransformFunc
|
||||||
}
|
}
|
||||||
|
|
||||||
type Store struct {
|
type Store struct {
|
||||||
@ -360,7 +360,7 @@ func (s *Store) initializeNamespaceCache() error {
|
|||||||
cols := common.GetColumnDefinitions(&nsSchema)
|
cols := common.GetColumnDefinitions(&nsSchema)
|
||||||
|
|
||||||
// get the type-specific transform func
|
// get the type-specific transform func
|
||||||
transformFunc := s.transformBuilder.GetTransformFunc(gvk, cols)
|
transformFunc := s.transformBuilder.GetTransformFunc(gvk, cols, attributes.IsCRD(&nsSchema))
|
||||||
|
|
||||||
// get the ns informer
|
// get the ns informer
|
||||||
tableClient := &tablelistconvert.Client{ResourceInterface: client}
|
tableClient := &tablelistconvert.Client{ResourceInterface: client}
|
||||||
@ -567,7 +567,8 @@ func (s *Store) watch(apiOp *types.APIRequest, schema *types.APISchema, w types.
|
|||||||
gvk := attributes.GVK(schema)
|
gvk := attributes.GVK(schema)
|
||||||
fields := getFieldsFromSchema(schema)
|
fields := getFieldsFromSchema(schema)
|
||||||
fields = append(fields, getFieldForGVK(gvk)...)
|
fields = append(fields, getFieldForGVK(gvk)...)
|
||||||
transformFunc := s.transformBuilder.GetTransformFunc(gvk, nil)
|
cols := common.GetColumnDefinitions(schema)
|
||||||
|
transformFunc := s.transformBuilder.GetTransformFunc(gvk, cols, attributes.IsCRD(schema))
|
||||||
tableClient := &tablelistconvert.Client{ResourceInterface: client}
|
tableClient := &tablelistconvert.Client{ResourceInterface: client}
|
||||||
ns := attributes.Namespaced(schema)
|
ns := attributes.Namespaced(schema)
|
||||||
inf, err := s.cacheFactory.CacheFor(s.ctx, fields, externalGVKDependencies[gvk], selfGVKDependencies[gvk], transformFunc, tableClient, gvk, ns, controllerschema.IsListWatchable(schema))
|
inf, err := s.cacheFactory.CacheFor(s.ctx, fields, externalGVKDependencies[gvk], selfGVKDependencies[gvk], transformFunc, tableClient, gvk, ns, controllerschema.IsListWatchable(schema))
|
||||||
@ -779,7 +780,7 @@ func (s *Store) ListByPartitions(apiOp *types.APIRequest, apiSchema *types.APISc
|
|||||||
fields = append(fields, getFieldForGVK(gvk)...)
|
fields = append(fields, getFieldForGVK(gvk)...)
|
||||||
cols := common.GetColumnDefinitions(apiSchema)
|
cols := common.GetColumnDefinitions(apiSchema)
|
||||||
|
|
||||||
transformFunc := s.transformBuilder.GetTransformFunc(gvk, cols)
|
transformFunc := s.transformBuilder.GetTransformFunc(gvk, cols, attributes.IsCRD(apiSchema))
|
||||||
tableClient := &tablelistconvert.Client{ResourceInterface: client}
|
tableClient := &tablelistconvert.Client{ResourceInterface: client}
|
||||||
ns := attributes.Namespaced(apiSchema)
|
ns := attributes.Namespaced(apiSchema)
|
||||||
inf, err := s.cacheFactory.CacheFor(s.ctx, fields, externalGVKDependencies[gvk], selfGVKDependencies[gvk], transformFunc, tableClient, gvk, ns, controllerschema.IsListWatchable(apiSchema))
|
inf, err := s.cacheFactory.CacheFor(s.ctx, fields, externalGVKDependencies[gvk], selfGVKDependencies[gvk], transformFunc, tableClient, gvk, ns, controllerschema.IsListWatchable(apiSchema))
|
||||||
|
@ -244,7 +244,7 @@ func TestListByPartitions(t *testing.T) {
|
|||||||
cg.EXPECT().TableAdminClient(req, schema, "", &WarningBuffer{}).Return(ri, nil)
|
cg.EXPECT().TableAdminClient(req, schema, "", &WarningBuffer{}).Return(ri, nil)
|
||||||
// This tests that fields are being extracted from schema columns and the type specific fields map
|
// This tests that fields are being extracted from schema columns and the type specific fields map
|
||||||
cf.EXPECT().CacheFor(context.Background(), [][]string{{"some", "field"}, {`id`}, {`metadata`, `state`, `name`}, {"gvk", "specific", "fields"}}, gomock.Any(), gomock.Any(), gomock.Any(), &tablelistconvert.Client{ResourceInterface: ri}, attributes.GVK(schema), attributes.Namespaced(schema), true).Return(c, nil)
|
cf.EXPECT().CacheFor(context.Background(), [][]string{{"some", "field"}, {`id`}, {`metadata`, `state`, `name`}, {"gvk", "specific", "fields"}}, gomock.Any(), gomock.Any(), gomock.Any(), &tablelistconvert.Client{ResourceInterface: ri}, attributes.GVK(schema), attributes.Namespaced(schema), true).Return(c, nil)
|
||||||
tb.EXPECT().GetTransformFunc(attributes.GVK(schema), []common.ColumnDefinition{{Field: "some.field"}}).Return(func(obj interface{}) (interface{}, error) { return obj, nil })
|
tb.EXPECT().GetTransformFunc(attributes.GVK(schema), []common.ColumnDefinition{{Field: "some.field"}}, false).Return(func(obj interface{}) (interface{}, error) { return obj, nil })
|
||||||
bloi.EXPECT().ListByOptions(req.Context(), &opts, partitions, req.Namespace).Return(listToReturn, len(listToReturn.Items), "", nil)
|
bloi.EXPECT().ListByOptions(req.Context(), &opts, partitions, req.Namespace).Return(listToReturn, len(listToReturn.Items), "", nil)
|
||||||
list, total, contToken, err := s.ListByPartitions(req, schema, partitions)
|
list, total, contToken, err := s.ListByPartitions(req, schema, partitions)
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
@ -461,7 +461,7 @@ func TestListByPartitions(t *testing.T) {
|
|||||||
// note also the watchable bool is expected to be false
|
// note also the watchable bool is expected to be false
|
||||||
cf.EXPECT().CacheFor(context.Background(), [][]string{{"some", "field"}, {`id`}, {`metadata`, `state`, `name`}, {"gvk", "specific", "fields"}}, gomock.Any(), gomock.Any(), gomock.Any(), &tablelistconvert.Client{ResourceInterface: ri}, attributes.GVK(schema), attributes.Namespaced(schema), false).Return(c, nil)
|
cf.EXPECT().CacheFor(context.Background(), [][]string{{"some", "field"}, {`id`}, {`metadata`, `state`, `name`}, {"gvk", "specific", "fields"}}, gomock.Any(), gomock.Any(), gomock.Any(), &tablelistconvert.Client{ResourceInterface: ri}, attributes.GVK(schema), attributes.Namespaced(schema), false).Return(c, nil)
|
||||||
|
|
||||||
tb.EXPECT().GetTransformFunc(attributes.GVK(schema), []common.ColumnDefinition{{Field: "some.field"}}).Return(func(obj interface{}) (interface{}, error) { return obj, nil })
|
tb.EXPECT().GetTransformFunc(attributes.GVK(schema), []common.ColumnDefinition{{Field: "some.field"}}, false).Return(func(obj interface{}) (interface{}, error) { return obj, nil })
|
||||||
bloi.EXPECT().ListByOptions(req.Context(), &opts, partitions, req.Namespace).Return(listToReturn, len(listToReturn.Items), "", nil)
|
bloi.EXPECT().ListByOptions(req.Context(), &opts, partitions, req.Namespace).Return(listToReturn, len(listToReturn.Items), "", nil)
|
||||||
list, total, contToken, err := s.ListByPartitions(req, schema, partitions)
|
list, total, contToken, err := s.ListByPartitions(req, schema, partitions)
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
@ -533,7 +533,7 @@ func TestListByPartitions(t *testing.T) {
|
|||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
cg.EXPECT().TableAdminClient(req, schema, "", &WarningBuffer{}).Return(ri, nil)
|
cg.EXPECT().TableAdminClient(req, schema, "", &WarningBuffer{}).Return(ri, nil)
|
||||||
// This tests that fields are being extracted from schema columns and the type specific fields map
|
// This tests that fields are being extracted from schema columns and the type specific fields map
|
||||||
tb.EXPECT().GetTransformFunc(attributes.GVK(schema), gomock.Any()).Return(func(obj interface{}) (interface{}, error) { return obj, nil })
|
tb.EXPECT().GetTransformFunc(attributes.GVK(schema), gomock.Any(), false).Return(func(obj interface{}) (interface{}, error) { return obj, nil })
|
||||||
cf.EXPECT().CacheFor(context.Background(), [][]string{{"some", "field"}, {`id`}, {`metadata`, `state`, `name`}, {"gvk", "specific", "fields"}}, gomock.Any(), gomock.Any(), gomock.Any(), &tablelistconvert.Client{ResourceInterface: ri}, attributes.GVK(schema), attributes.Namespaced(schema), true).Return(factory.Cache{}, fmt.Errorf("error"))
|
cf.EXPECT().CacheFor(context.Background(), [][]string{{"some", "field"}, {`id`}, {`metadata`, `state`, `name`}, {"gvk", "specific", "fields"}}, gomock.Any(), gomock.Any(), gomock.Any(), &tablelistconvert.Client{ResourceInterface: ri}, attributes.GVK(schema), attributes.Namespaced(schema), true).Return(factory.Cache{}, fmt.Errorf("error"))
|
||||||
|
|
||||||
_, _, _, err = s.ListByPartitions(req, schema, partitions)
|
_, _, _, err = s.ListByPartitions(req, schema, partitions)
|
||||||
@ -612,7 +612,7 @@ func TestListByPartitions(t *testing.T) {
|
|||||||
// This tests that fields are being extracted from schema columns and the type specific fields map
|
// This tests that fields are being extracted from schema columns and the type specific fields map
|
||||||
cf.EXPECT().CacheFor(context.Background(), [][]string{{"some", "field"}, {`id`}, {`metadata`, `state`, `name`}, {"gvk", "specific", "fields"}}, gomock.Any(), gomock.Any(), gomock.Any(), &tablelistconvert.Client{ResourceInterface: ri}, attributes.GVK(schema), attributes.Namespaced(schema), true).Return(c, nil)
|
cf.EXPECT().CacheFor(context.Background(), [][]string{{"some", "field"}, {`id`}, {`metadata`, `state`, `name`}, {"gvk", "specific", "fields"}}, gomock.Any(), gomock.Any(), gomock.Any(), &tablelistconvert.Client{ResourceInterface: ri}, attributes.GVK(schema), attributes.Namespaced(schema), true).Return(c, nil)
|
||||||
bloi.EXPECT().ListByOptions(req.Context(), &opts, partitions, req.Namespace).Return(nil, 0, "", fmt.Errorf("error"))
|
bloi.EXPECT().ListByOptions(req.Context(), &opts, partitions, req.Namespace).Return(nil, 0, "", fmt.Errorf("error"))
|
||||||
tb.EXPECT().GetTransformFunc(attributes.GVK(schema), gomock.Any()).Return(func(obj interface{}) (interface{}, error) { return obj, nil })
|
tb.EXPECT().GetTransformFunc(attributes.GVK(schema), gomock.Any(), false).Return(func(obj interface{}) (interface{}, error) { return obj, nil })
|
||||||
|
|
||||||
_, _, _, err = s.ListByPartitions(req, schema, partitions)
|
_, _, _, err = s.ListByPartitions(req, schema, partitions)
|
||||||
assert.NotNil(t, err)
|
assert.NotNil(t, err)
|
||||||
@ -724,7 +724,7 @@ func TestListByPartitionWithUserAccess(t *testing.T) {
|
|||||||
attributes.SetGVK(theSchema, gvk)
|
attributes.SetGVK(theSchema, gvk)
|
||||||
cg.EXPECT().TableAdminClient(apiOp, theSchema, "", &WarningBuffer{}).Return(ri, nil)
|
cg.EXPECT().TableAdminClient(apiOp, theSchema, "", &WarningBuffer{}).Return(ri, nil)
|
||||||
cf.EXPECT().CacheFor(context.Background(), [][]string{{"some", "field"}, {"id"}, {"metadata", "state", "name"}}, gomock.Any(), gomock.Any(), gomock.Any(), &tablelistconvert.Client{ResourceInterface: ri}, attributes.GVK(theSchema), attributes.Namespaced(theSchema), true).Return(c, nil)
|
cf.EXPECT().CacheFor(context.Background(), [][]string{{"some", "field"}, {"id"}, {"metadata", "state", "name"}}, gomock.Any(), gomock.Any(), gomock.Any(), &tablelistconvert.Client{ResourceInterface: ri}, attributes.GVK(theSchema), attributes.Namespaced(theSchema), true).Return(c, nil)
|
||||||
tb.EXPECT().GetTransformFunc(attributes.GVK(theSchema), gomock.Any()).Return(func(obj interface{}) (interface{}, error) { return obj, nil })
|
tb.EXPECT().GetTransformFunc(attributes.GVK(theSchema), gomock.Any(), false).Return(func(obj interface{}) (interface{}, error) { return obj, nil })
|
||||||
|
|
||||||
listToReturn := &unstructured.UnstructuredList{
|
listToReturn := &unstructured.UnstructuredList{
|
||||||
Items: make([]unstructured.Unstructured, 0, 0),
|
Items: make([]unstructured.Unstructured, 0, 0),
|
||||||
@ -766,7 +766,7 @@ func TestReset(t *testing.T) {
|
|||||||
cs.EXPECT().SetColumns(gomock.Any(), gomock.Any()).Return(nil)
|
cs.EXPECT().SetColumns(gomock.Any(), gomock.Any()).Return(nil)
|
||||||
cg.EXPECT().TableAdminClient(nil, &nsSchema, "", &WarningBuffer{}).Return(ri, nil)
|
cg.EXPECT().TableAdminClient(nil, &nsSchema, "", &WarningBuffer{}).Return(ri, nil)
|
||||||
cf.EXPECT().CacheFor(context.Background(), [][]string{{`id`}, {`metadata`, `state`, `name`}, {"spec", "displayName"}}, gomock.Any(), gomock.Any(), gomock.Any(), &tablelistconvert.Client{ResourceInterface: ri}, attributes.GVK(&nsSchema), false, true).Return(nsc2, nil)
|
cf.EXPECT().CacheFor(context.Background(), [][]string{{`id`}, {`metadata`, `state`, `name`}, {"spec", "displayName"}}, gomock.Any(), gomock.Any(), gomock.Any(), &tablelistconvert.Client{ResourceInterface: ri}, attributes.GVK(&nsSchema), false, true).Return(nsc2, nil)
|
||||||
tb.EXPECT().GetTransformFunc(attributes.GVK(&nsSchema), gomock.Any()).Return(func(obj interface{}) (interface{}, error) { return obj, nil })
|
tb.EXPECT().GetTransformFunc(attributes.GVK(&nsSchema), gomock.Any(), false).Return(func(obj interface{}) (interface{}, error) { return obj, nil })
|
||||||
err := s.Reset()
|
err := s.Reset()
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
assert.Equal(t, nsc2, s.namespaceCache)
|
assert.Equal(t, nsc2, s.namespaceCache)
|
||||||
@ -873,7 +873,7 @@ func TestReset(t *testing.T) {
|
|||||||
cs.EXPECT().SetColumns(gomock.Any(), gomock.Any()).Return(nil)
|
cs.EXPECT().SetColumns(gomock.Any(), gomock.Any()).Return(nil)
|
||||||
cg.EXPECT().TableAdminClient(nil, &nsSchema, "", &WarningBuffer{}).Return(ri, nil)
|
cg.EXPECT().TableAdminClient(nil, &nsSchema, "", &WarningBuffer{}).Return(ri, nil)
|
||||||
cf.EXPECT().CacheFor(context.Background(), [][]string{{`id`}, {`metadata`, `state`, `name`}, {"spec", "displayName"}}, gomock.Any(), gomock.Any(), gomock.Any(), &tablelistconvert.Client{ResourceInterface: ri}, attributes.GVK(&nsSchema), false, true).Return(factory.Cache{}, fmt.Errorf("error"))
|
cf.EXPECT().CacheFor(context.Background(), [][]string{{`id`}, {`metadata`, `state`, `name`}, {"spec", "displayName"}}, gomock.Any(), gomock.Any(), gomock.Any(), &tablelistconvert.Client{ResourceInterface: ri}, attributes.GVK(&nsSchema), false, true).Return(factory.Cache{}, fmt.Errorf("error"))
|
||||||
tb.EXPECT().GetTransformFunc(attributes.GVK(&nsSchema), gomock.Any()).Return(func(obj interface{}) (interface{}, error) { return obj, nil })
|
tb.EXPECT().GetTransformFunc(attributes.GVK(&nsSchema), gomock.Any(), false).Return(func(obj interface{}) (interface{}, error) { return obj, nil })
|
||||||
err := s.Reset()
|
err := s.Reset()
|
||||||
assert.NotNil(t, err)
|
assert.NotNil(t, err)
|
||||||
},
|
},
|
||||||
|
Loading…
Reference in New Issue
Block a user