Skip to content

Commit 7840f8d

Browse files
committed
feat(models): make NamedFilterable implement Faulty and add default IsFaulty() to all subtypes
1 parent 01f6240 commit 7840f8d

15 files changed

Lines changed: 120 additions & 54 deletions

internal/collections/filter_test.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ type testStruct struct {
1414

1515
func (t testStruct) GetName() string { return t.name }
1616
func (t testStruct) GetFilterableFields() []string { return []string{t.name, t.value} }
17+
func (testStruct) IsFaulty() bool { return false }
1718

1819
func TestFilterSlice_Basic(t *testing.T) {
1920
t.Parallel()

internal/domain/category.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,10 @@ func (e Category) GetFilterableFields() []string {
130130
return e.GetAliases()
131131
}
132132

133+
func (e Category) IsFaulty() bool {
134+
return false
135+
}
136+
133137
func GetInitials(s string) string {
134138
re := regexp.MustCompile(`[A-Z]`)
135139
initials := re.FindAllString(s, -1)

internal/ui/tui/row_builders_test.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ func (f fakeDef) GetName() string { return f.name }
4646
func (f fakeDef) GetDescription() string { return f.desc }
4747
func (f fakeDef) GetValue() string { return f.value }
4848
func (f fakeDef) GetFilterableFields() []string { return []string{f.name, f.desc, f.value} }
49+
func (fakeDef) IsFaulty() bool { return false }
4950

5051
func Test_definitionToRow(t *testing.T) {
5152
def := fakeDef{"n", "d", "v"}
@@ -109,6 +110,7 @@ func (f fakeDefOverride) GetName() string { return f.name }
109110
func (f fakeDefOverride) GetValue() string { return f.value }
110111
func (f fakeDefOverride) GetRegions() []string { return f.regions }
111112
func (f fakeDefOverride) GetFilterableFields() []string { return append(f.regions, f.name, f.value) }
113+
func (fakeDefOverride) IsFaulty() bool { return false }
112114

113115
func Test_propertyTenancyOverrideToRow(t *testing.T) {
114116
def := fakeDefOverride{"PD1", "val", []string{"us", "eu"}}

internal/ui/tui/table_utils.go

Lines changed: 48 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -15,71 +15,59 @@ func faultyPred[T models.Faulty](t T) bool {
1515
}
1616

1717
var categoryHandlers = map[domain.Category]func(logging.Logger, *models.Dataset, *domain.ToolkitContext, string, bool) []table.Row{
18-
domain.Alias: func(_ logging.Logger, _ *models.Dataset, _ *domain.ToolkitContext, filter string, _ bool) []table.Row {
19-
return filterRows(domain.Categories, filter, nil, aliasToRow)
18+
domain.Alias: func(_ logging.Logger, _ *models.Dataset, _ *domain.ToolkitContext, filter string, faultyOnly bool) []table.Row {
19+
return filterRows(domain.Categories, filter, faultyOnly, aliasToRow)
2020
},
2121
domain.Tenant: func(_ logging.Logger, dataset *models.Dataset, _ *domain.ToolkitContext, filter string, faultyOnly bool) []table.Row {
22-
var pred func(models.Tenant) bool
23-
if faultyOnly {
24-
pred = faultyPred
25-
}
26-
return filterRows(dataset.Tenants, filter, pred, tenantToRow)
22+
return filterRows(dataset.Tenants, filter, faultyOnly, tenantToRow)
2723
},
28-
domain.LimitDefinition: func(_ logging.Logger, dataset *models.Dataset, _ *domain.ToolkitContext, filter string, _ bool) []table.Row {
29-
return filterRows(dataset.LimitDefinitionGroup.Values, filter, nil, limitDefinitionToRow)
24+
domain.LimitDefinition: func(_ logging.Logger, dataset *models.Dataset, _ *domain.ToolkitContext, filter string, faultyOnly bool) []table.Row {
25+
return filterRows(dataset.LimitDefinitionGroup.Values, filter, faultyOnly, limitDefinitionToRow)
3026
},
31-
domain.ConsolePropertyDefinition: func(_ logging.Logger, dataset *models.Dataset, _ *domain.ToolkitContext, filter string, _ bool) []table.Row {
32-
return filterRows(dataset.ConsolePropertyDefinitionGroup.Values, filter, nil, definitionToRow)
27+
domain.ConsolePropertyDefinition: func(_ logging.Logger, dataset *models.Dataset, _ *domain.ToolkitContext, filter string, faultyOnly bool) []table.Row {
28+
return filterRows(dataset.ConsolePropertyDefinitionGroup.Values, filter, faultyOnly, definitionToRow)
3329
},
34-
domain.PropertyDefinition: func(_ logging.Logger, dataset *models.Dataset, _ *domain.ToolkitContext, filter string, _ bool) []table.Row {
35-
return filterRows(dataset.PropertyDefinitionGroup.Values, filter, nil, definitionToRow)
30+
domain.PropertyDefinition: func(_ logging.Logger, dataset *models.Dataset, _ *domain.ToolkitContext, filter string, faultyOnly bool) []table.Row {
31+
return filterRows(dataset.PropertyDefinitionGroup.Values, filter, faultyOnly, definitionToRow)
3632
},
37-
domain.LimitTenancyOverride: func(logger logging.Logger, dataset *models.Dataset, context *domain.ToolkitContext, filter string, _ bool) []table.Row {
38-
return GetScopedItems(dataset.LimitTenancyOverrideMap, domain.Tenant, context, filter, nil, limitTenancyOverrideToRow)
33+
domain.LimitTenancyOverride: func(logger logging.Logger, dataset *models.Dataset, context *domain.ToolkitContext, filter string, faultyOnly bool) []table.Row {
34+
return filterRowsScoped(dataset.LimitTenancyOverrideMap, domain.Tenant, context, filter, faultyOnly, limitTenancyOverrideToRow)
3935
},
40-
domain.ConsolePropertyTenancyOverride: func(logger logging.Logger, dataset *models.Dataset, context *domain.ToolkitContext, filter string, _ bool) []table.Row {
41-
return GetScopedItems(dataset.ConsolePropertyTenancyOverrideMap, domain.Tenant, context, filter, nil, propertyTenancyOverrideToRow)
36+
domain.ConsolePropertyTenancyOverride: func(logger logging.Logger, dataset *models.Dataset, context *domain.ToolkitContext, filter string, faultyOnly bool) []table.Row {
37+
return filterRowsScoped(dataset.ConsolePropertyTenancyOverrideMap, domain.Tenant, context, filter, faultyOnly, propertyTenancyOverrideToRow)
4238
},
43-
domain.PropertyTenancyOverride: func(logger logging.Logger, dataset *models.Dataset, context *domain.ToolkitContext, filter string, _ bool) []table.Row {
44-
return GetScopedItems(dataset.PropertyTenancyOverrideMap, domain.Tenant, context, filter, nil, propertyTenancyOverrideToRow)
39+
domain.PropertyTenancyOverride: func(logger logging.Logger, dataset *models.Dataset, context *domain.ToolkitContext, filter string, faultyOnly bool) []table.Row {
40+
return filterRowsScoped(dataset.PropertyTenancyOverrideMap, domain.Tenant, context, filter, faultyOnly, propertyTenancyOverrideToRow)
4541
},
46-
domain.LimitRegionalOverride: func(_ logging.Logger, dataset *models.Dataset, _ *domain.ToolkitContext, filter string, _ bool) []table.Row {
47-
return filterRows(dataset.LimitRegionalOverrides, filter, nil, limitRegionalOverrideToRow)
42+
domain.LimitRegionalOverride: func(_ logging.Logger, dataset *models.Dataset, _ *domain.ToolkitContext, filter string, faultyOnly bool) []table.Row {
43+
return filterRows(dataset.LimitRegionalOverrides, filter, faultyOnly, limitRegionalOverrideToRow)
4844
},
49-
domain.ConsolePropertyRegionalOverride: func(_ logging.Logger, dataset *models.Dataset, _ *domain.ToolkitContext, filter string, _ bool) []table.Row {
50-
return filterRows(dataset.ConsolePropertyRegionalOverrides, filter, nil, propertyRegionalOverrideToRow)
45+
domain.ConsolePropertyRegionalOverride: func(_ logging.Logger, dataset *models.Dataset, _ *domain.ToolkitContext, filter string, faultyOnly bool) []table.Row {
46+
return filterRows(dataset.ConsolePropertyRegionalOverrides, filter, faultyOnly, propertyRegionalOverrideToRow)
5147
},
52-
domain.PropertyRegionalOverride: func(_ logging.Logger, dataset *models.Dataset, _ *domain.ToolkitContext, filter string, _ bool) []table.Row {
53-
return filterRows(dataset.PropertyRegionalOverrides, filter, nil, propertyRegionalOverrideToRow)
48+
domain.PropertyRegionalOverride: func(_ logging.Logger, dataset *models.Dataset, _ *domain.ToolkitContext, filter string, faultyOnly bool) []table.Row {
49+
return filterRows(dataset.PropertyRegionalOverrides, filter, faultyOnly, propertyRegionalOverrideToRow)
5450
},
55-
domain.BaseModel: func(_ logging.Logger, dataset *models.Dataset, _ *domain.ToolkitContext, filter string, _ bool) []table.Row {
56-
return getBaseModels(dataset.BaseModelMap, filter)
51+
domain.BaseModel: func(_ logging.Logger, dataset *models.Dataset, _ *domain.ToolkitContext, filter string, faultyOnly bool) []table.Row {
52+
return getBaseModels(dataset.BaseModelMap, filter, faultyOnly)
5753
},
58-
domain.ModelArtifact: func(logger logging.Logger, dataset *models.Dataset, context *domain.ToolkitContext, filter string, _ bool) []table.Row {
59-
return GetScopedItems(dataset.ModelArtifactMap, domain.BaseModel, context, filter, nil, modelArtifactToRow)
54+
domain.ModelArtifact: func(logger logging.Logger, dataset *models.Dataset, context *domain.ToolkitContext, filter string, faultyOnly bool) []table.Row {
55+
return filterRowsScoped(dataset.ModelArtifactMap, domain.BaseModel, context, filter, faultyOnly, modelArtifactToRow)
6056
},
61-
domain.Environment: func(_ logging.Logger, dataset *models.Dataset, _ *domain.ToolkitContext, filter string, _ bool) []table.Row {
62-
return filterRows(dataset.Environments, filter, nil, environmentToRow)
57+
domain.Environment: func(_ logging.Logger, dataset *models.Dataset, _ *domain.ToolkitContext, filter string, faultyOnly bool) []table.Row {
58+
return filterRows(dataset.Environments, filter, faultyOnly, environmentToRow)
6359
},
64-
domain.ServiceTenancy: func(_ logging.Logger, dataset *models.Dataset, _ *domain.ToolkitContext, filter string, _ bool) []table.Row {
65-
return filterRows(dataset.ServiceTenancies, filter, nil, serviceTenancyToRow)
60+
domain.ServiceTenancy: func(_ logging.Logger, dataset *models.Dataset, _ *domain.ToolkitContext, filter string, faultyOnly bool) []table.Row {
61+
return filterRows(dataset.ServiceTenancies, filter, faultyOnly, serviceTenancyToRow)
6662
},
67-
domain.GpuPool: func(_ logging.Logger, dataset *models.Dataset, _ *domain.ToolkitContext, filter string, _ bool) []table.Row {
68-
return filterRows(dataset.GpuPools, filter, nil, gpuPoolToRow)
63+
domain.GpuPool: func(_ logging.Logger, dataset *models.Dataset, _ *domain.ToolkitContext, filter string, faultyOnly bool) []table.Row {
64+
return filterRows(dataset.GpuPools, filter, faultyOnly, gpuPoolToRow)
6965
},
7066
domain.GpuNode: func(logger logging.Logger, dataset *models.Dataset, context *domain.ToolkitContext, filter string, faultyOnly bool) []table.Row {
71-
var pred func(models.GpuNode) bool
72-
if faultyOnly {
73-
pred = faultyPred
74-
}
75-
return GetScopedItems(dataset.GpuNodeMap, domain.GpuPool, context, filter, pred, gpuNodeToRow)
67+
return filterRowsScoped(dataset.GpuNodeMap, domain.GpuPool, context, filter, faultyOnly, gpuNodeToRow)
7668
},
7769
domain.DedicatedAICluster: func(logger logging.Logger, dataset *models.Dataset, context *domain.ToolkitContext, filter string, faultyOnly bool) []table.Row {
78-
var pred func(models.DedicatedAICluster) bool
79-
if faultyOnly {
80-
pred = faultyPred
81-
}
82-
return GetScopedItems(dataset.DedicatedAIClusterMap, domain.Tenant, context, filter, pred, dedicatedAIClusterToRow)
70+
return filterRowsScoped(dataset.DedicatedAIClusterMap, domain.Tenant, context, filter, faultyOnly, dedicatedAIClusterToRow)
8371
},
8472
}
8573

@@ -119,7 +107,12 @@ func getTableRows(logger logging.Logger, dataset *models.Dataset, category domai
119107
filterRows filters a slice of items using the provided filter and row function.
120108
It returns a slice of table.Row for items that match the filter.
121109
*/
122-
func filterRows[T models.NamedFilterable](items []T, filter string, pred func(T) bool, rowFn func(T) table.Row) []table.Row {
110+
func filterRows[T models.NamedFilterable](items []T, filter string, faultyOnly bool, rowFn func(T) table.Row) []table.Row {
111+
var pred func(T) bool
112+
if faultyOnly {
113+
pred = faultyPred
114+
}
115+
123116
matches := collections.FilterSlice(items, nil, filter, pred)
124117
results := make([]table.Row, 0, len(matches))
125118
for _, m := range matches {
@@ -131,23 +124,23 @@ func filterRows[T models.NamedFilterable](items []T, filter string, pred func(T)
131124
/*
132125
getBaseModels returns table rows for a map of BaseModel, filtered by the provided filter string.
133126
*/
134-
func getBaseModels(m map[string]*models.BaseModel, filter string) []table.Row {
127+
func getBaseModels(m map[string]*models.BaseModel, filter string, faultyOnly bool) []table.Row {
135128
baseModels := make([]*models.BaseModel, 0, len(m))
136129
for _, model := range m {
137130
baseModels = append(baseModels, model)
138131
}
139132

140-
return filterRows(baseModels, filter, nil, baseModelToRow)
133+
return filterRows(baseModels, filter, faultyOnly, baseModelToRow)
141134
}
142135

143-
// GetScopedItems is used for tenancy and other scoped overrides.
136+
// filterRowsScoped is used for tenancy and other scoped overrides.
144137
// Accepts a Logger interface for decoupling from zap.
145-
func GetScopedItems[T models.NamedFilterable](
138+
func filterRowsScoped[T models.NamedFilterable](
146139
g map[string][]T,
147140
scopeCategory domain.Category,
148141
ctx *domain.ToolkitContext,
149142
filter string,
150-
pred func(T) bool,
143+
faultyOnly bool,
151144
rowFn func(T, string) table.Row,
152145
) []table.Row {
153146
var (
@@ -163,6 +156,10 @@ func GetScopedItems[T models.NamedFilterable](
163156
}
164157
}
165158

159+
var pred func(T) bool
160+
if faultyOnly {
161+
pred = faultyPred
162+
}
166163
matches := collections.FilterMap(g, key, name, filter, pred)
167164
results := make([]table.Row, 0, len(matches))
168165
for key, m := range matches {

internal/ui/tui/table_utils_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ func Test_getBaseModels_returns_rows(t *testing.T) {
3939
LifeCyclePhase: "DEPRECATED",
4040
},
4141
}
42-
rows := getBaseModels(baseModels, "")
42+
rows := getBaseModels(baseModels, "", false)
4343
assert.Len(t, rows, 1)
4444
assert.Equal(t, table.Row{
4545
"BM1", "bm1", "v1", "", "C/C*2", "1024", "EXP/INT/LTS/RTD",
@@ -326,7 +326,7 @@ func TestFilterRows(t *testing.T) {
326326
{Type: "foo", Region: "us-phx-1"},
327327
{Type: "bar", Region: "us-ashburn-1"},
328328
}
329-
rows := filterRows(items, "foo", nil, func(e models.Environment) table.Row {
329+
rows := filterRows(items, "foo", false, func(e models.Environment) table.Row {
330330
return table.Row{e.Type, e.Region}
331331
})
332332
assert.Len(t, rows, 1)
@@ -355,7 +355,7 @@ func TestGetBaseModels_SortsAndFilters(t *testing.T) {
355355
"a": {InternalName: "a", Name: "A"},
356356
"b": {InternalName: "b", Name: "B"},
357357
}
358-
rows := getBaseModels(m, "a")
358+
rows := getBaseModels(m, "a", false)
359359
assert.Len(t, rows, 1)
360360
assert.Contains(t, rows[0][0], "A")
361361
}

pkg/models/base_model.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,11 @@ func (m BaseModel) GetFilterableFields() []string {
151151
m.GetFlags(), shapeName)
152152
}
153153

154+
// IsFaulty returns false by default for BaseModel.
155+
func (m BaseModel) IsFaulty() bool {
156+
return false
157+
}
158+
154159
// GetFlags returns the flags for the base model.
155160
func (m BaseModel) GetFlags() string {
156161
flags := []string{}

pkg/models/console_property.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,11 @@ func (c ConsolePropertyDefinition) GetFilterableFields() []string {
2727
return []string{c.Name, c.Description}
2828
}
2929

30+
// IsFaulty returns false by default for ConsolePropertyDefinition.
31+
func (c ConsolePropertyDefinition) IsFaulty() bool {
32+
return false
33+
}
34+
3035
// ConsolePropertyRegionalOverride represents a regional override for a console property.
3136
type ConsolePropertyRegionalOverride struct {
3237
Realms []string `json:"realms"`
@@ -58,6 +63,11 @@ func (o ConsolePropertyRegionalOverride) GetFilterableFields() []string {
5863
return append(o.Regions, o.Name)
5964
}
6065

66+
// IsFaulty returns false by default for ConsolePropertyRegionalOverride.
67+
func (o ConsolePropertyRegionalOverride) IsFaulty() bool {
68+
return false
69+
}
70+
6171
// ConsolePropertyTenancyOverride represents a tenancy override for a console property.
6272
type ConsolePropertyTenancyOverride struct {
6373
TenantID string `json:"tenant_id"`
@@ -73,3 +83,8 @@ func (o ConsolePropertyTenancyOverride) GetTenantID() string {
7383
func (o ConsolePropertyTenancyOverride) GetFilterableFields() []string {
7484
return append(o.Regions, o.Name, o.TenantID)
7585
}
86+
87+
// IsFaulty returns false by default for ConsolePropertyTenancyOverride.
88+
func (o ConsolePropertyTenancyOverride) IsFaulty() bool {
89+
return false
90+
}

pkg/models/definitions.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ type NamedItem interface {
1414
type NamedFilterable interface {
1515
NamedItem
1616
Filterable
17+
Faulty
1718
}
1819

1920
// Definition represents a definition item with description and value.

pkg/models/definitions_test.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ func (testImpl) GetRegions() []string { return []string{"r"} }
1515
func (testImpl) GetValue() string { return "v" }
1616
func (testImpl) Environments() []Environment { return nil }
1717
func (testImpl) GetDescription() string { return "desc" }
18+
func (testImpl) IsFaulty() bool { return false }
1819

1920
func TestDefinitionInterfaces(t *testing.T) {
2021
t.Parallel()

pkg/models/environment.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,11 @@ func (e Environment) GetFilterableFields() []string {
2121
return []string{e.Type, e.Region, e.Realm, e.GetName()}
2222
}
2323

24+
// IsFaulty returns false by default for Environment.
25+
func (e Environment) IsFaulty() bool {
26+
return false
27+
}
28+
2429
// Equals returns true if the environment is equal to another environment.
2530
func (e Environment) Equals(o Environment) bool {
2631
return e.Realm == o.Realm && e.GetName() == o.GetName()

0 commit comments

Comments
 (0)