Skip to content

Commit ca8d885

Browse files
chambridgeclaude
andauthored
fix(catalog): scope context property queries by type ID in GetFilterOptions (#2562)
- Filter context_properties by asset type ID to prevent cross-contamination between CatalogModel and MCPServer filter options - Consolidate duplicated test helper functions into shared testhelpers package - Add regression test verifying bidirectional isolation between resource types Signed-off-by: Chris Hambridge <chambrid@redhat.com> Co-authored-by: Claude <noreply@anthropic.com>
1 parent 2b1bf57 commit ca8d885

12 files changed

Lines changed: 235 additions & 103 deletions

catalog/internal/catalog/mcpcatalog/db_mcp_test.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ type mockMCPServerRepo struct {
6666
getErr error
6767
// capturedOptions stores the last MCPServerListOptions passed to List.
6868
capturedOptions models.MCPServerListOptions
69+
TypeID int32 // Set to a non-zero value when testing GetFilterOptions scoping
6970
}
7071

7172
func (m *mockMCPServerRepo) List(opts models.MCPServerListOptions) (*internalmodels.ListWrapper[models.MCPServer], error) {
@@ -93,7 +94,7 @@ func (m *mockMCPServerRepo) DeleteByID(_ int32) error { return errors.New("
9394
func (m *mockMCPServerRepo) GetDistinctSourceIDs() ([]string, error) {
9495
return nil, errors.New("not implemented")
9596
}
96-
func (m *mockMCPServerRepo) GetTypeID() int32 { return 0 }
97+
func (m *mockMCPServerRepo) GetTypeID() int32 { return m.TypeID }
9798

9899
// mockMCPServerToolRepo is a configurable MCPServerToolRepository for unit testing.
99100
type mockMCPServerToolRepo struct {

catalog/internal/catalog/mcpcatalog/loader_test.go

Lines changed: 7 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ package mcpcatalog
22

33
import (
44
"context"
5-
"errors"
65
"os"
76
"path/filepath"
87
"testing"
@@ -12,10 +11,9 @@ import (
1211
"github.com/kubeflow/model-registry/catalog/internal/catalog/basecatalog"
1312
mcpmodels "github.com/kubeflow/model-registry/catalog/internal/catalog/mcpcatalog/models"
1413
mcpcatalogservice "github.com/kubeflow/model-registry/catalog/internal/catalog/mcpcatalog/service"
15-
"github.com/kubeflow/model-registry/catalog/internal/catalog/modelcatalog"
1614
modelcatalogservice "github.com/kubeflow/model-registry/catalog/internal/catalog/modelcatalog/service"
1715
"github.com/kubeflow/model-registry/catalog/internal/db/service"
18-
"github.com/kubeflow/model-registry/internal/db/schema"
16+
"github.com/kubeflow/model-registry/catalog/internal/testhelpers"
1917
"github.com/kubeflow/model-registry/internal/testutils"
2018
"github.com/stretchr/testify/assert"
2119
"github.com/stretchr/testify/require"
@@ -26,52 +24,16 @@ func TestMain(m *testing.M) {
2624
os.Exit(testutils.TestMainPostgresHelper(m))
2725
}
2826

29-
func getMCPServerTypeIDForTest(t *testing.T, db *gorm.DB) int32 {
30-
var typeRecord schema.Type
31-
err := db.Where("name = ?", service.MCPServerTypeName).First(&typeRecord).Error
32-
if err != nil {
33-
if errors.Is(err, gorm.ErrRecordNotFound) {
34-
// Create the type if it doesn't exist
35-
typeRecord = schema.Type{
36-
Name: service.MCPServerTypeName,
37-
}
38-
err = db.Create(&typeRecord).Error
39-
require.NoError(t, err)
40-
} else {
41-
require.NoError(t, err)
42-
}
43-
}
44-
return typeRecord.ID
45-
}
46-
47-
func getMCPServerToolTypeIDForTest(t *testing.T, db *gorm.DB) int32 {
48-
var typeRecord schema.Type
49-
err := db.Where("name = ?", service.MCPServerToolTypeName).First(&typeRecord).Error
50-
if err != nil {
51-
if errors.Is(err, gorm.ErrRecordNotFound) {
52-
// Create the type if it doesn't exist
53-
typeRecord = schema.Type{
54-
Name: service.MCPServerToolTypeName,
55-
}
56-
err = db.Create(&typeRecord).Error
57-
require.NoError(t, err)
58-
} else {
59-
require.NoError(t, err)
60-
}
61-
}
62-
return typeRecord.ID
63-
}
64-
6527
func setupMCPLoaderTest(t *testing.T) (*gorm.DB, service.Services, func()) {
6628
sharedDB, cleanup := testutils.SetupPostgresWithMigrations(t, service.DatastoreSpec())
6729

6830
// Get type IDs
69-
catalogModelTypeID := modelcatalog.GetCatalogModelTypeIDForDBTest(t, sharedDB)
70-
modelArtifactTypeID := modelcatalog.GetCatalogModelArtifactTypeIDForDBTest(t, sharedDB)
71-
metricsArtifactTypeID := modelcatalog.GetCatalogMetricsArtifactTypeIDForDBTest(t, sharedDB)
72-
catalogSourceTypeID := modelcatalog.GetCatalogSourceTypeIDForDBTest(t, sharedDB)
73-
mcpServerTypeID := getMCPServerTypeIDForTest(t, sharedDB)
74-
mcpServerToolTypeID := getMCPServerToolTypeIDForTest(t, sharedDB)
31+
catalogModelTypeID := testhelpers.GetCatalogModelTypeIDForDBTest(t, sharedDB)
32+
modelArtifactTypeID := testhelpers.GetCatalogModelArtifactTypeIDForDBTest(t, sharedDB)
33+
metricsArtifactTypeID := testhelpers.GetCatalogMetricsArtifactTypeIDForDBTest(t, sharedDB)
34+
catalogSourceTypeID := testhelpers.GetCatalogSourceTypeIDForDBTest(t, sharedDB)
35+
mcpServerTypeID := testhelpers.GetMCPServerTypeIDForDBTest(t, sharedDB)
36+
mcpServerToolTypeID := testhelpers.GetMCPServerToolTypeIDForDBTest(t, sharedDB)
7537

7638
// Create repositories
7739
catalogModelRepo := modelcatalogservice.NewCatalogModelRepository(sharedDB, catalogModelTypeID)

catalog/internal/catalog/modelcatalog/api_test.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -699,6 +699,7 @@ type MockCatalogModelRepository struct {
699699
mu sync.RWMutex
700700
SavedModels []models.CatalogModel
701701
NextID int32
702+
TypeID int32 // Set to a non-zero value when testing GetFilterOptions scoping
702703
}
703704

704705
func (m *MockCatalogModelRepository) GetByID(id int32) (models.CatalogModel, error) {
@@ -774,6 +775,10 @@ func (m *MockCatalogModelRepository) GetDistinctSourceIDs() ([]string, error) {
774775
return []string{}, nil
775776
}
776777

778+
func (m *MockCatalogModelRepository) GetTypeID() int32 {
779+
return m.TypeID
780+
}
781+
777782
// GetSavedModels returns a copy of the saved models slice in a thread-safe manner.
778783
// This should be used by tests instead of directly accessing SavedModels field.
779784
func (m *MockCatalogModelRepository) GetSavedModels() []models.CatalogModel {

catalog/internal/catalog/modelcatalog/db_catalog.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -190,10 +190,15 @@ func (d *dbCatalogImpl) GetArtifacts(ctx context.Context, modelName string, sour
190190
}
191191

192192
func (d *dbCatalogImpl) GetFilterOptions(ctx context.Context) (*apimodels.FilterOptionsList, error) {
193-
contextProperties, err := d.propertyOptionsRepository.List(sharedmodels.ContextPropertyOptionType, 0)
193+
catalogModelTypeID := d.catalogModelRepository.GetTypeID()
194+
195+
contextProperties, err := d.propertyOptionsRepository.List(sharedmodels.ContextPropertyOptionType, catalogModelTypeID)
194196
if err != nil {
195197
return nil, err
196198
}
199+
// Artifact type filtering uses 0 (all types) intentionally: models have multiple
200+
// artifact types (kf.CatalogModelArtifact, kf.CatalogMetricsArtifact) so a single
201+
// type ID cannot scope them. MCP servers have no artifact types, so no cross-contamination.
197202
artifactProperties, err := d.propertyOptionsRepository.List(sharedmodels.ArtifactPropertyOptionType, 0)
198203
if err != nil {
199204
return nil, err

catalog/internal/catalog/modelcatalog/db_catalog_test.go

Lines changed: 156 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,14 @@ import (
88
"testing"
99

1010
"github.com/kubeflow/model-registry/catalog/internal/catalog/basecatalog"
11+
"github.com/kubeflow/model-registry/catalog/internal/catalog/mcpcatalog"
12+
mcpcatalogmodels "github.com/kubeflow/model-registry/catalog/internal/catalog/mcpcatalog/models"
13+
mcpservice "github.com/kubeflow/model-registry/catalog/internal/catalog/mcpcatalog/service"
1114
"github.com/kubeflow/model-registry/catalog/internal/catalog/modelcatalog/models"
1215
modelservice "github.com/kubeflow/model-registry/catalog/internal/catalog/modelcatalog/service"
1316
sharedmodels "github.com/kubeflow/model-registry/catalog/internal/db/models"
1417
"github.com/kubeflow/model-registry/catalog/internal/db/service"
18+
"github.com/kubeflow/model-registry/catalog/internal/testhelpers"
1519
model "github.com/kubeflow/model-registry/catalog/pkg/openapi"
1620
"github.com/kubeflow/model-registry/internal/apiutils"
1721
mr_models "github.com/kubeflow/model-registry/internal/db/models"
@@ -31,10 +35,10 @@ func TestDBCatalog(t *testing.T) {
3135
defer cleanup()
3236

3337
// Get type IDs
34-
catalogModelTypeID := GetCatalogModelTypeIDForDBTest(t, sharedDB)
35-
modelArtifactTypeID := GetCatalogModelArtifactTypeIDForDBTest(t, sharedDB)
36-
metricsArtifactTypeID := GetCatalogMetricsArtifactTypeIDForDBTest(t, sharedDB)
37-
catalogSourceTypeID := GetCatalogSourceTypeIDForDBTest(t, sharedDB)
38+
catalogModelTypeID := testhelpers.GetCatalogModelTypeIDForDBTest(t, sharedDB)
39+
modelArtifactTypeID := testhelpers.GetCatalogModelArtifactTypeIDForDBTest(t, sharedDB)
40+
metricsArtifactTypeID := testhelpers.GetCatalogMetricsArtifactTypeIDForDBTest(t, sharedDB)
41+
catalogSourceTypeID := testhelpers.GetCatalogSourceTypeIDForDBTest(t, sharedDB)
3842

3943
// Create repositories
4044
catalogModelRepo := modelservice.NewCatalogModelRepository(sharedDB, catalogModelTypeID)
@@ -1409,10 +1413,10 @@ func TestDBCatalog_GetPerformanceArtifactsWithService(t *testing.T) {
14091413
defer cleanup()
14101414

14111415
// Get type IDs
1412-
catalogModelTypeID := GetCatalogModelTypeIDForDBTest(t, sharedDB)
1413-
modelArtifactTypeID := GetCatalogModelArtifactTypeIDForDBTest(t, sharedDB)
1414-
metricsArtifactTypeID := GetCatalogMetricsArtifactTypeIDForDBTest(t, sharedDB)
1415-
catalogSourceTypeID := GetCatalogSourceTypeIDForDBTest(t, sharedDB)
1416+
catalogModelTypeID := testhelpers.GetCatalogModelTypeIDForDBTest(t, sharedDB)
1417+
modelArtifactTypeID := testhelpers.GetCatalogModelArtifactTypeIDForDBTest(t, sharedDB)
1418+
metricsArtifactTypeID := testhelpers.GetCatalogMetricsArtifactTypeIDForDBTest(t, sharedDB)
1419+
catalogSourceTypeID := testhelpers.GetCatalogSourceTypeIDForDBTest(t, sharedDB)
14161420

14171421
// Create repositories
14181422
catalogModelRepo := modelservice.NewCatalogModelRepository(sharedDB, catalogModelTypeID)
@@ -1529,9 +1533,15 @@ func TestGetFilterOptionsWithNamedQueries(t *testing.T) {
15291533
err := sources.MergeWithNamedQueries("test", map[string]basecatalog.ModelSource{}, namedQueries)
15301534
require.NoError(t, err)
15311535

1532-
// Create catalog with mocked dependencies that provide filter options with ranges
1536+
// Use a realistic non-zero TypeID to validate that GetFilterOptions
1537+
// correctly scopes context property queries by type.
1538+
const mockTypeID int32 = 42
15331539
mockServices := service.Services{
1534-
PropertyOptionsRepository: &mockPropertyRepositoryWithRanges{},
1540+
CatalogModelRepository: &MockCatalogModelRepository{TypeID: mockTypeID},
1541+
PropertyOptionsRepository: &mockPropertyRepositoryWithRanges{
1542+
t: t,
1543+
expectedTypeID: mockTypeID,
1544+
},
15351545
}
15361546
catalog := NewDBCatalog(mockServices, sources)
15371547

@@ -1566,21 +1576,20 @@ func TestGetFilterOptionsWithNamedQueries(t *testing.T) {
15661576
assert.Equal(t, 0.0, rangeQuery["memory_usage"].Value, "Expected 'min' to be replaced with 0.0")
15671577
}
15681578

1569-
// Mock repository for testing
1570-
type mockPropertyRepository struct{}
1571-
1572-
func (m *mockPropertyRepository) List(optionType sharedmodels.PropertyOptionType, limit int32) ([]sharedmodels.PropertyOption, error) {
1573-
return []sharedmodels.PropertyOption{}, nil
1579+
// Mock repository that provides filter options with numeric ranges for testing min/max transformation.
1580+
// expectedTypeID, when non-zero, asserts the typeID passed to List for context properties.
1581+
type mockPropertyRepositoryWithRanges struct {
1582+
t *testing.T
1583+
expectedTypeID int32
15741584
}
15751585

1576-
func (m *mockPropertyRepository) Refresh(optionType sharedmodels.PropertyOptionType) error {
1577-
return nil
1578-
}
1579-
1580-
// Mock repository that provides filter options with numeric ranges for testing min/max transformation
1581-
type mockPropertyRepositoryWithRanges struct{}
1582-
1583-
func (m *mockPropertyRepositoryWithRanges) List(optionType sharedmodels.PropertyOptionType, limit int32) ([]sharedmodels.PropertyOption, error) {
1586+
func (m *mockPropertyRepositoryWithRanges) List(optionType sharedmodels.PropertyOptionType, typeID int32) ([]sharedmodels.PropertyOption, error) {
1587+
if m.expectedTypeID != 0 && optionType == sharedmodels.ContextPropertyOptionType {
1588+
require.Equal(m.t, m.expectedTypeID, typeID, "expected context property query to be scoped by typeID")
1589+
}
1590+
if optionType == sharedmodels.ArtifactPropertyOptionType {
1591+
require.Equal(m.t, int32(0), typeID, "artifact property query should not be scoped by typeID")
1592+
}
15841593
// Return property options with numeric ranges that match the fields used in the test
15851594
minLatency := int64(10)
15861595
maxLatency := int64(500)
@@ -1933,10 +1942,10 @@ func TestFindModelsWithRecommendedLatency(t *testing.T) {
19331942
defer cleanup()
19341943

19351944
// Get type IDs
1936-
catalogModelTypeID := GetCatalogModelTypeIDForDBTest(t, sharedDB)
1937-
modelArtifactTypeID := GetCatalogModelArtifactTypeIDForDBTest(t, sharedDB)
1938-
metricsArtifactTypeID := GetCatalogMetricsArtifactTypeIDForDBTest(t, sharedDB)
1939-
catalogSourceTypeID := GetCatalogSourceTypeIDForDBTest(t, sharedDB)
1945+
catalogModelTypeID := testhelpers.GetCatalogModelTypeIDForDBTest(t, sharedDB)
1946+
modelArtifactTypeID := testhelpers.GetCatalogModelArtifactTypeIDForDBTest(t, sharedDB)
1947+
metricsArtifactTypeID := testhelpers.GetCatalogMetricsArtifactTypeIDForDBTest(t, sharedDB)
1948+
catalogSourceTypeID := testhelpers.GetCatalogSourceTypeIDForDBTest(t, sharedDB)
19401949

19411950
// Create repositories
19421951
catalogModelRepo := modelservice.NewCatalogModelRepository(sharedDB, catalogModelTypeID)
@@ -2078,3 +2087,123 @@ func TestFindModelsWithRecommendedLatency(t *testing.T) {
20782087
// Custom properties may or may not be set depending on performance data availability
20792088
}
20802089
}
2090+
2091+
// TestGetFilterOptions_NoMCPServerContamination verifies that the model catalog's
2092+
// GetFilterOptions only returns properties from kf.CatalogModel contexts, not
2093+
// properties from kf.MCPServer contexts. This is a regression test for the bug
2094+
// where typeID=0 was passed to propertyOptionsRepository.List(), causing
2095+
// cross-contamination between resource types.
2096+
func TestGetFilterOptions_NoMCPServerContamination(t *testing.T) {
2097+
sharedDB, cleanup := testutils.SetupPostgresWithMigrations(t, service.DatastoreSpec())
2098+
defer cleanup()
2099+
2100+
// Get type IDs for both resource types
2101+
catalogModelTypeID := testhelpers.GetCatalogModelTypeIDForDBTest(t, sharedDB)
2102+
modelArtifactTypeID := testhelpers.GetCatalogModelArtifactTypeIDForDBTest(t, sharedDB)
2103+
metricsArtifactTypeID := testhelpers.GetCatalogMetricsArtifactTypeIDForDBTest(t, sharedDB)
2104+
catalogSourceTypeID := testhelpers.GetCatalogSourceTypeIDForDBTest(t, sharedDB)
2105+
mcpServerTypeID := testhelpers.GetMCPServerTypeIDForDBTest(t, sharedDB)
2106+
mcpServerToolTypeID := testhelpers.GetMCPServerToolTypeIDForDBTest(t, sharedDB)
2107+
2108+
// Create repositories for both resource types
2109+
catalogModelRepo := modelservice.NewCatalogModelRepository(sharedDB, catalogModelTypeID)
2110+
catalogArtifactRepo := service.NewCatalogArtifactRepository(sharedDB, map[string]int32{
2111+
service.CatalogModelArtifactTypeName: modelArtifactTypeID,
2112+
service.CatalogMetricsArtifactTypeName: metricsArtifactTypeID,
2113+
})
2114+
catalogSourceRepo := service.NewCatalogSourceRepository(sharedDB, catalogSourceTypeID)
2115+
mcpServerRepo := mcpservice.NewMCPServerRepository(sharedDB, mcpServerTypeID)
2116+
mcpServerToolRepo := mcpservice.NewMCPServerToolRepository(sharedDB, mcpServerToolTypeID)
2117+
propertyOptionsRepo := service.NewPropertyOptionsRepository(sharedDB)
2118+
2119+
// Create a catalog model with model-specific properties
2120+
catalogModel := &models.CatalogModelImpl{
2121+
TypeID: apiutils.Of(catalogModelTypeID),
2122+
Attributes: &models.CatalogModelAttributes{
2123+
Name: apiutils.Of("cross-test-source:cross-test-model"),
2124+
ExternalID: apiutils.Of("cross-test-model-ext"),
2125+
},
2126+
Properties: &[]mr_models.Properties{
2127+
{Name: "source_id", StringValue: apiutils.Of("cross-test-source")},
2128+
{Name: "license", StringValue: apiutils.Of("Apache-2.0")},
2129+
{Name: "provider", StringValue: apiutils.Of("TestProvider")},
2130+
{Name: "maturity", StringValue: apiutils.Of("stable")},
2131+
},
2132+
}
2133+
_, err := catalogModelRepo.Save(catalogModel)
2134+
require.NoError(t, err)
2135+
2136+
// Create an MCP server with MCP-specific properties
2137+
mcpServer := &mcpcatalogmodels.MCPServerImpl{
2138+
TypeID: apiutils.Of(mcpServerTypeID),
2139+
Attributes: &mcpcatalogmodels.MCPServerAttributes{
2140+
Name: apiutils.Of("cross-test-mcp-server"),
2141+
ExternalID: apiutils.Of("cross-test-mcp-ext"),
2142+
},
2143+
Properties: &[]mr_models.Properties{
2144+
{Name: "source_id", StringValue: apiutils.Of("cross-test-mcp-source")},
2145+
{Name: "version", StringValue: apiutils.Of("1.0.0")},
2146+
{Name: "base_name", StringValue: apiutils.Of("cross-test-mcp-server")},
2147+
{Name: "deploymentMode", StringValue: apiutils.Of("remote")},
2148+
},
2149+
}
2150+
_, err = mcpServerRepo.Save(mcpServer)
2151+
require.NoError(t, err)
2152+
2153+
// Refresh the materialized views so property options reflect the new data
2154+
require.NoError(t, propertyOptionsRepo.Refresh(sharedmodels.ContextPropertyOptionType))
2155+
require.NoError(t, propertyOptionsRepo.Refresh(sharedmodels.ArtifactPropertyOptionType))
2156+
2157+
// Build model catalog services and call GetFilterOptions.
2158+
// NOTE: catalogModelArtifactRepository and catalogMetricsArtifactRepository are nil
2159+
// because GetFilterOptions does not access them. If GetFilterOptions is ever extended
2160+
// to use artifact repositories, this test will panic and must be updated with stubs.
2161+
svcs := service.NewServices(
2162+
catalogModelRepo,
2163+
catalogArtifactRepo,
2164+
nil, // catalogModelArtifactRepository — unused by GetFilterOptions
2165+
nil, // catalogMetricsArtifactRepository — unused by GetFilterOptions
2166+
catalogSourceRepo,
2167+
propertyOptionsRepo,
2168+
mcpServerRepo,
2169+
mcpServerToolRepo,
2170+
)
2171+
dbCatalog := NewDBCatalog(svcs, nil)
2172+
2173+
filterOptions, err := dbCatalog.GetFilterOptions(context.Background())
2174+
require.NoError(t, err)
2175+
require.NotNil(t, filterOptions)
2176+
require.NotNil(t, filterOptions.Filters)
2177+
2178+
filters := *filterOptions.Filters
2179+
2180+
// Model-specific properties SHOULD be present
2181+
assert.Contains(t, filters, "license", "model property 'license' should be present")
2182+
assert.Contains(t, filters, "provider", "model property 'provider' should be present")
2183+
assert.Contains(t, filters, "maturity", "model property 'maturity' should be present")
2184+
2185+
// MCP-specific properties MUST NOT be present
2186+
assert.NotContains(t, filters, "version", "MCP property 'version' must not appear in model filter_options")
2187+
assert.NotContains(t, filters, "base_name", "MCP property 'base_name' must not appear in model filter_options")
2188+
assert.NotContains(t, filters, "deploymentMode", "MCP property 'deploymentMode' must not appear in model filter_options")
2189+
2190+
// source_id is shared by both types but excluded by both catalogs' skip lists
2191+
assert.NotContains(t, filters, "source_id", "source_id should be excluded by the model catalog skip list")
2192+
2193+
// Reverse direction: verify MCP catalog's GetFilterOptions doesn't leak model properties
2194+
dbMCPCatalog := mcpcatalog.NewDBMCPCatalog(svcs, nil, nil)
2195+
mcpFilterOptions, err := dbMCPCatalog.GetFilterOptions(context.Background())
2196+
require.NoError(t, err)
2197+
require.NotNil(t, mcpFilterOptions)
2198+
require.NotNil(t, mcpFilterOptions.Filters)
2199+
2200+
mcpFilters := *mcpFilterOptions.Filters
2201+
2202+
// Model-specific properties MUST NOT appear in MCP filter_options
2203+
assert.NotContains(t, mcpFilters, "license", "model property 'license' must not appear in MCP filter_options")
2204+
assert.NotContains(t, mcpFilters, "provider", "model property 'provider' must not appear in MCP filter_options")
2205+
assert.NotContains(t, mcpFilters, "maturity", "model property 'maturity' must not appear in MCP filter_options")
2206+
2207+
// source_id is shared by both types but excluded by both catalogs' skip lists
2208+
assert.NotContains(t, mcpFilters, "source_id", "source_id should be excluded by the MCP catalog skip list")
2209+
}

catalog/internal/catalog/modelcatalog/integration_test.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"github.com/kubeflow/model-registry/catalog/internal/catalog/modelcatalog/models"
99
modelservice "github.com/kubeflow/model-registry/catalog/internal/catalog/modelcatalog/service"
1010
"github.com/kubeflow/model-registry/catalog/internal/db/service"
11+
"github.com/kubeflow/model-registry/catalog/internal/testhelpers"
1112
"github.com/kubeflow/model-registry/internal/apiutils"
1213
mr_models "github.com/kubeflow/model-registry/internal/db/models"
1314
"github.com/kubeflow/model-registry/internal/db/schema"
@@ -18,10 +19,10 @@ import (
1819

1920
func setupIntegrationTestProvider(t *testing.T, ctx context.Context, sharedDB *gorm.DB) *dbCatalogImpl {
2021
// Get type IDs
21-
catalogModelTypeID := GetCatalogModelTypeIDForDBTest(t, sharedDB)
22-
modelArtifactTypeID := GetCatalogModelArtifactTypeIDForDBTest(t, sharedDB)
23-
metricsArtifactTypeID := GetCatalogMetricsArtifactTypeIDForDBTest(t, sharedDB)
24-
catalogSourceTypeID := GetCatalogSourceTypeIDForDBTest(t, sharedDB)
22+
catalogModelTypeID := testhelpers.GetCatalogModelTypeIDForDBTest(t, sharedDB)
23+
modelArtifactTypeID := testhelpers.GetCatalogModelArtifactTypeIDForDBTest(t, sharedDB)
24+
metricsArtifactTypeID := testhelpers.GetCatalogMetricsArtifactTypeIDForDBTest(t, sharedDB)
25+
catalogSourceTypeID := testhelpers.GetCatalogSourceTypeIDForDBTest(t, sharedDB)
2526

2627
// Create repositories
2728
catalogModelRepo := modelservice.NewCatalogModelRepository(sharedDB, catalogModelTypeID)

catalog/internal/catalog/modelcatalog/models/catalog_model.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,4 +40,5 @@ type CatalogModelRepository interface {
4040
DeleteBySource(sourceID string) error
4141
DeleteByID(id int32) error
4242
GetDistinctSourceIDs() ([]string, error)
43+
GetTypeID() int32
4344
}

0 commit comments

Comments
 (0)