Skip to content

Commit fcfb652

Browse files
Merge pull request #1652 from kubeflow/main
[pull] main from kubeflow:main
2 parents 76e2fd9 + d20fb57 commit fcfb652

File tree

19 files changed

+319
-348
lines changed

19 files changed

+319
-348
lines changed

clients/python/poetry.lock

Lines changed: 94 additions & 233 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

clients/python/pyproject.toml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[tool.poetry]
22
name = "model-registry"
3-
version = "0.3.7"
3+
version = "0.3.8"
44
description = "Client for Kubeflow Model Registry"
55
authors = ["Isabella Basso do Amaral <idoamara@redhat.com>"]
66
license = "Apache-2.0"
@@ -25,7 +25,7 @@ aiohttp-retry = "^2.8.3"
2525
# allows for reentrant event loops (used for sync client) - Python 3.14 compatible
2626
nest-asyncio2 = "^1.7.1"
2727

28-
huggingface-hub = { version = ">=0.20.1,<1.6.0", optional = true }
28+
huggingface-hub = { version = ">=0.20.1,<1.7.0", optional = true }
2929
olot = { version = "^0.1.6", optional = true }
3030
boto3 = { version = "^1.37.34", optional = true }
3131
rh-model-signing = { version = "0.1.0", optional = true }
@@ -61,7 +61,7 @@ pytest-asyncio = "^1.1.0"
6161
requests = "^2.32.2"
6262
types-python-dateutil = "^2.9.0.20240906"
6363
pytest-html = "^4.1.1"
64-
schemathesis = ">=4.0.3,<=4.10.0"
64+
schemathesis = ">=4.0.3,<=4.11.2"
6565

6666
[tool.coverage.run]
6767
branch = true

clients/python/src/model_registry/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
"""Main package for the Kubeflow model registry."""
22

3-
__version__ = "0.3.7"
3+
__version__ = "0.3.8"
44

55
from ._client import ModelRegistry
66

clients/ui/api/openapi/mod-arch.yaml

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -927,14 +927,14 @@ paths:
927927
operationId: getPerformanceArtifacts
928928

929929
# MCP server catalog endpoints
930-
/api/v1/model_catalog/mcp_servers:
930+
/api/v1/mcp_catalog/mcp_servers:
931931
summary: Path used to get the list of MCP servers.
932932
description: >-
933933
The REST endpoint/path used to list zero or more `McpServer` entities.
934934
get:
935935
summary: List MCP servers
936936
tags:
937-
- ModelCatalogService
937+
- MCPCatalogService
938938
parameters:
939939
- $ref: "#/components/parameters/kubeflowUserId"
940940
- $ref: "#/components/parameters/namespace"
@@ -964,14 +964,14 @@ paths:
964964
$ref: "#/components/responses/InternalServerError"
965965
operationId: getAllMcpServers
966966
description: Gets a list of all `McpServer` entities.
967-
/api/v1/model_catalog/mcp_servers_filter_options:
967+
/api/v1/mcp_catalog/mcp_servers_filter_options:
968968
summary: Path used to get filter options for MCP servers.
969969
description: >-
970970
The REST endpoint/path used to list filter options and named queries for listing MCP servers.
971971
get:
972972
summary: List MCP server filter options
973973
tags:
974-
- ModelCatalogService
974+
- MCPCatalogService
975975
parameters:
976976
- $ref: "#/components/parameters/kubeflowUserId"
977977
- $ref: "#/components/parameters/namespace"
@@ -984,13 +984,13 @@ paths:
984984
$ref: "#/components/responses/InternalServerError"
985985
operationId: getMcpServersFilterOptions
986986
description: Gets filter options for the list MCP servers endpoint.
987-
/api/v1/model_catalog/mcp_servers/{server_id}:
987+
/api/v1/mcp_catalog/mcp_servers/{server_id}:
988988
description: >-
989989
The REST endpoint/path used to get a single `McpServer`.
990990
get:
991991
summary: Get an MCP server
992992
tags:
993-
- ModelCatalogService
993+
- MCPCatalogService
994994
parameters:
995995
- $ref: "#/components/parameters/kubeflowUserId"
996996
- $ref: "#/components/parameters/namespace"
@@ -1007,13 +1007,13 @@ paths:
10071007
$ref: "#/components/responses/InternalServerError"
10081008
operationId: getMcpServer
10091009
description: Gets a single `McpServer` by ID.
1010-
/api/v1/model_catalog/mcp_servers/{server_id}/tools:
1010+
/api/v1/mcp_catalog/mcp_servers/{server_id}/tools:
10111011
description: >-
10121012
The REST endpoint/path used to list tools exposed by an `McpServer`.
10131013
get:
10141014
summary: List tools for an MCP server
10151015
tags:
1016-
- ModelCatalogService
1016+
- MCPCatalogService
10171017
parameters:
10181018
- $ref: "#/components/parameters/kubeflowUserId"
10191019
- $ref: "#/components/parameters/namespace"
@@ -3804,3 +3804,5 @@ tags:
38043804
description: Operation performed in Kubernetes
38053805
- name: ModelCatalogService
38063806
description: Model Catalog REST API
3807+
- name: MCPCatalogService
3808+
description: MCP Catalog REST API

clients/ui/bff/internal/api/app.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,8 +84,9 @@ const (
8484

8585
// MCP server catalog
8686
McpServerId = "server_id"
87-
McpServerListPath = CatalogPathPrefix + "/mcp_servers"
88-
McpServerFilterOptionListPath = CatalogPathPrefix + "/mcp_servers_filter_options"
87+
McpServerCatalogPathPrefix = ApiPathPrefix + "/mcp_catalog"
88+
McpServerListPath = McpServerCatalogPathPrefix + "/mcp_servers"
89+
McpServerFilterOptionListPath = McpServerCatalogPathPrefix + "/mcp_servers_filter_options"
8990
McpServerPath = McpServerListPath + "/:" + McpServerId
9091
McpServersToolListPath = McpServerPath + "/tools"
9192
)

clients/ui/bff/internal/api/mcp_servers_catalog_handler.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ func (app *App) GetMcpServerHandler(w http.ResponseWriter, r *http.Request, ps h
8181
return
8282
}
8383

84-
server, err := app.repositories.ModelCatalogClient.GetMcpServer(client, serverId)
84+
server, err := app.repositories.ModelCatalogClient.GetMcpServer(client, serverId, r.URL.Query())
8585

8686
if err != nil {
8787
app.serverErrorResponse(w, r, err)

clients/ui/bff/internal/api/mcp_servers_catalog_handler_test.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ var _ = Describe("TestMcpServersCatalogHandler", func() {
2020
}
2121

2222
expected := McpServerListEnvelope{Data: &data}
23-
actual, rs, err := setupApiTest[McpServerListEnvelope](http.MethodGet, "/api/v1/model_catalog/mcp_servers?namespace=kubeflow", nil, kubernetesMockedStaticClientFactory, requestIdentity, "kubeflow")
23+
actual, rs, err := setupApiTest[McpServerListEnvelope](http.MethodGet, "/api/v1/mcp_catalog/mcp_servers?namespace=kubeflow", nil, kubernetesMockedStaticClientFactory, requestIdentity, "kubeflow")
2424
Expect(err).NotTo(HaveOccurred())
2525

2626
By("should match the expected MCP server list")
@@ -40,7 +40,7 @@ var _ = Describe("TestMcpServersCatalogHandler", func() {
4040
}
4141

4242
expected := McpServerFilterOptionsListEnvelope{Data: &data}
43-
actual, rs, err := setupApiTest[McpServerFilterOptionsListEnvelope](http.MethodGet, "/api/v1/model_catalog/mcp_servers_filter_options?namespace=kubeflow", nil, kubernetesMockedStaticClientFactory, requestIdentity, "kubeflow")
43+
actual, rs, err := setupApiTest[McpServerFilterOptionsListEnvelope](http.MethodGet, "/api/v1/mcp_catalog/mcp_servers_filter_options?namespace=kubeflow", nil, kubernetesMockedStaticClientFactory, requestIdentity, "kubeflow")
4444
Expect(err).NotTo(HaveOccurred())
4545

4646
By("should match the expected filter options")
@@ -56,7 +56,7 @@ var _ = Describe("TestMcpServersCatalogHandler", func() {
5656
UserID: "user@example.com",
5757
}
5858

59-
actual, rs, err := setupApiTest[McpServerEnvelope](http.MethodGet, "/api/v1/model_catalog/mcp_servers/1?namespace=kubeflow", nil, kubernetesMockedStaticClientFactory, requestIdentity, "kubeflow")
59+
actual, rs, err := setupApiTest[McpServerEnvelope](http.MethodGet, "/api/v1/mcp_catalog/mcp_servers/1?namespace=kubeflow", nil, kubernetesMockedStaticClientFactory, requestIdentity, "kubeflow")
6060
Expect(err).NotTo(HaveOccurred())
6161

6262
By("should match the expected MCP server")
@@ -74,7 +74,7 @@ var _ = Describe("TestMcpServersCatalogHandler", func() {
7474
}
7575

7676
expected := McpServerToolsListEnvelope{Data: &data}
77-
actual, rs, err := setupApiTest[McpServerToolsListEnvelope](http.MethodGet, "/api/v1/model_catalog/mcp_servers/1/tools?namespace=kubeflow", nil, kubernetesMockedStaticClientFactory, requestIdentity, "kubeflow")
77+
actual, rs, err := setupApiTest[McpServerToolsListEnvelope](http.MethodGet, "/api/v1/mcp_catalog/mcp_servers/1/tools?namespace=kubeflow", nil, kubernetesMockedStaticClientFactory, requestIdentity, "kubeflow")
7878
Expect(err).NotTo(HaveOccurred())
7979

8080
By("should match the expected tool list")

clients/ui/bff/internal/mocks/model_catalog_client_mock.go

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -288,10 +288,18 @@ func (m *ModelCatalogClientMock) GetMcpServersFilter(client httpclient.HTTPClien
288288
return &mcpFilterOptions, nil
289289
}
290290

291-
func (m *ModelCatalogClientMock) GetMcpServer(client httpclient.HTTPClientInterface, serverId string) (*models.McpServer, error) {
292-
mcpServer := GetMcpServerMocks()[0]
293-
294-
return &mcpServer, nil
291+
func (m *ModelCatalogClientMock) GetMcpServer(client httpclient.HTTPClientInterface, serverId string, pageValues url.Values) (*models.McpServer, error) {
292+
allMocks := GetMcpServerMocks()
293+
id, err := strconv.ParseInt(serverId, 10, 64)
294+
if err != nil {
295+
return nil, fmt.Errorf("server id doesn't exist: %w", err)
296+
}
297+
for i := range allMocks {
298+
if int64(allMocks[i].ID) == id {
299+
return &allMocks[i], nil
300+
}
301+
}
302+
return nil, fmt.Errorf("server id doesn't exist: %s", serverId)
295303
}
296304

297305
func (m *ModelCatalogClientMock) GetMcpServersTools(client httpclient.HTTPClientInterface, serverId string) (*models.McpToolList, error) {

clients/ui/bff/internal/repositories/helpers.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,9 @@ func FilterPageValues(values url.Values) url.Values {
6565
if v := values.Get("assetType"); v != "" {
6666
result.Set("assetType", v)
6767
}
68+
if v := values.Get("includeTools"); v != "" {
69+
result.Set("includeTools", v)
70+
}
6871

6972
return result
7073
}

clients/ui/bff/internal/repositories/mcp_server_catalog.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ const mcpFilterOptionPath = "/mcp_servers/filter_options"
1515
type McpServerCatalogInterface interface {
1616
GetAllMcpServers(client httpclient.HTTPClientInterface, pageValues url.Values) (*models.McpServerList, error)
1717
GetMcpServersFilter(client httpclient.HTTPClientInterface) (*models.FilterOptionsList, error)
18-
GetMcpServer(client httpclient.HTTPClientInterface, serverId string) (*models.McpServer, error)
18+
GetMcpServer(client httpclient.HTTPClientInterface, serverId string, pageValues url.Values) (*models.McpServer, error)
1919
GetMcpServersTools(client httpclient.HTTPClientInterface, serverId string) (*models.McpToolList, error)
2020
}
2121

@@ -27,7 +27,7 @@ func (a *McpServerCatalog) GetAllMcpServers(client httpclient.HTTPClientInterfac
2727
responseData, err := client.GET(UrlWithPageParams(mcpServerPath, pageValues))
2828

2929
if err != nil {
30-
return nil, fmt.Errorf("error fetching mcpServerPath: %w", err)
30+
return nil, fmt.Errorf("error fetching mcp servers list: %w", err)
3131
}
3232

3333
var mcpServers models.McpServerList
@@ -55,17 +55,17 @@ func (a *McpServerCatalog) GetMcpServersFilter(client httpclient.HTTPClientInter
5555
return &filters, nil
5656
}
5757

58-
func (a *McpServerCatalog) GetMcpServer(client httpclient.HTTPClientInterface, serverId string) (*models.McpServer, error) {
58+
func (a *McpServerCatalog) GetMcpServer(client httpclient.HTTPClientInterface, serverId string, pageValues url.Values) (*models.McpServer, error) {
5959
path, err := url.JoinPath(mcpServerPath, serverId)
6060

6161
if err != nil {
6262
return nil, err
6363
}
6464

65-
responseData, err := client.GET(path)
65+
responseData, err := client.GET(UrlWithPageParams(path, pageValues))
6666

6767
if err != nil {
68-
return nil, fmt.Errorf("error fetching mcpServerPath: %w", err)
68+
return nil, fmt.Errorf("error fetching mcp server: %w", err)
6969
}
7070

7171
var mcpServer models.McpServer
@@ -87,7 +87,7 @@ func (a *McpServerCatalog) GetMcpServersTools(client httpclient.HTTPClientInterf
8787
responseData, err := client.GET(path)
8888

8989
if err != nil {
90-
return nil, fmt.Errorf("error fetching mcpServerPath: %w", err)
90+
return nil, fmt.Errorf("error fetching mcp server tools: %w", err)
9191
}
9292

9393
var mcpServerTools models.McpToolList

0 commit comments

Comments
 (0)