Skip to content

Commit 48505b4

Browse files
committed
move implementation into model-serving package
1 parent 85320f1 commit 48505b4

File tree

9 files changed

+121
-202
lines changed

9 files changed

+121
-202
lines changed

packages/model-registry/package.json

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,10 @@
4545
}
4646
},
4747
"exports": {
48-
"./extensions": "./extensions.ts"
49-
},
48+
"./extensions": "./extensions.ts",
49+
"./model-catalog-deploy": {
50+
"types": "./upstream/frontend/src/odh/extension-points/model-catalog-deploy.ts"
51+
} },
5052
"dependencies": {
5153
"@odh-dashboard/internal": "*"
5254
},

packages/model-registry/upstream/frontend/src/odh/components/ModelCatalogDeployModalExtension.tsx

Lines changed: 43 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,18 @@
11
import React from 'react';
22
import { useParams } from 'react-router-dom';
33
import { HookNotify, useResolvedExtensions } from '@odh-dashboard/plugin-core';
4-
import { isModelCatalogDeployModalExtension } from '~/odh/extension-points';
4+
import {
5+
isModelCatalogDeployModalExtension,
6+
isNavigateToDeploymentWizardWithDataExtension,
7+
DeployPrefillData,
8+
} from '~/odh/extension-points';
59
import { CatalogModel, CatalogModelDetailsParams } from '~/app/modelCatalogTypes';
610
import { getDeployButtonState } from '~/odh/utils';
711
import { useCatalogModelArtifacts } from '~/app/hooks/modelCatalog/useCatalogModelArtifacts';
812
import {
913
decodeParams,
1014
getModelArtifactUri,
1115
} from '~/app/pages/modelCatalog/utils/modelCatalogUtils';
12-
import {
13-
isNavigateToWizardExtension,
14-
Deployment,
15-
InitialWizardFormData,
16-
} from '../extension-points/model-catalog-deploy';
17-
import { extractExternalFormData } from '../extractExternalFormData';
1816

1917
type ModelCatalogDeployModalExtensionProps = {
2018
model: CatalogModel;
@@ -29,20 +27,8 @@ const ModelCatalogDeployModalExtension: React.FC<ModelCatalogDeployModalExtensio
2927
model,
3028
render,
3129
}) => {
32-
const [navigateExtensions, navigateExtensionsLoaded] = useResolvedExtensions(
33-
isNavigateToWizardExtension,
34-
);
35-
const [navigateToWizard, setNavigateToWizard] = React.useState<
36-
| ((
37-
deployment?: Deployment | null,
38-
initialData?: InitialWizardFormData | null,
39-
returnRouteValue?: string,
40-
) => (projectName?: string) => void)
41-
| null
42-
>(null);
4330
const [platformExtensions] = useResolvedExtensions(isModelCatalogDeployModalExtension);
4431
const [availablePlatformIds, setAvailablePlatformIds] = React.useState<string[]>([]);
45-
const buttonState = getDeployButtonState(availablePlatformIds, true);
4632

4733
const params = useParams<CatalogModelDetailsParams>();
4834
const decodedParams = decodeParams(params);
@@ -52,16 +38,33 @@ const ModelCatalogDeployModalExtension: React.FC<ModelCatalogDeployModalExtensio
5238
);
5339
const uri = artifacts.items.length > 0 ? getModelArtifactUri(artifacts.items) : '';
5440

55-
const wizardInitialData = React.useMemo(
56-
() => extractExternalFormData(uri, model.name),
57-
[uri, model.name],
41+
const catalogDeployPrefillData: DeployPrefillData = React.useMemo(
42+
() => ({
43+
modelName: model.name,
44+
modelUri: uri,
45+
returnRouteValue: '/ai-hub/deployments/',
46+
wizardStartIndex: 2,
47+
}),
48+
[model.name, uri],
49+
);
50+
const [navigateExtensions, navigateExtensionsLoaded] = useResolvedExtensions(
51+
isNavigateToDeploymentWizardWithDataExtension,
5852
);
53+
const [navigateToWizard, setNavigateToWizard] = React.useState<(() => void) | null>(null);
54+
5955
const onOpenModal = React.useCallback(() => {
6056
if (navigateToWizard) {
6157
navigateToWizard();
6258
}
6359
}, [navigateToWizard]);
6460

61+
const buttonState =
62+
platformExtensions.length > 0
63+
? getDeployButtonState(availablePlatformIds, true)
64+
: navigateExtensionsLoaded && navigateExtensions.length > 0
65+
? { enabled: true }
66+
: { enabled: false, tooltip: 'Deployment wizard is not available' };
67+
6568
return (
6669
<>
6770
{/* Get platform IDs */}
@@ -79,19 +82,24 @@ const ModelCatalogDeployModalExtension: React.FC<ModelCatalogDeployModalExtensio
7982
{/* Get navigation function */}
8083
{navigateExtensionsLoaded &&
8184
navigateExtensions.length > 0 &&
82-
navigateExtensions.map((extension) => (
83-
<HookNotify
84-
key={extension.uid}
85-
useHook={extension.properties.useNavigateToDeploymentWizard}
86-
args={[undefined, wizardInitialData, '/ai-hub/deployments/']}
87-
onNotify={(fn) => {
88-
if (fn && typeof fn === 'function') {
89-
setNavigateToWizard(() => fn);
90-
}
91-
}}
92-
/>
93-
))}
94-
{render(buttonState, onOpenModal, navigateExtensionsLoaded && !!navigateToWizard)}
85+
navigateExtensions.map((extension) => {
86+
if (!extension.properties.useNavigateToDeploymentWizardWithData) {
87+
return null;
88+
}
89+
return (
90+
<HookNotify
91+
key={extension.uid}
92+
useHook={extension.properties.useNavigateToDeploymentWizardWithData}
93+
args={[catalogDeployPrefillData]}
94+
onNotify={(fn) => {
95+
if (fn && typeof fn === 'function') {
96+
setNavigateToWizard(() => fn);
97+
}
98+
}}
99+
/>
100+
);
101+
})}
102+
{render(buttonState, onOpenModal, navigateExtensionsLoaded && navigateExtensions.length > 0)}
95103
</>
96104
);
97105
};
Lines changed: 12 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -1,67 +1,16 @@
11
import type { Extension, CodeRef } from '@openshift/dynamic-plugin-sdk';
2-
import type { ModelDeployPrefillInfo } from '~/odh/hooks/useRegisteredModelDeployPrefillInfo';
32

4-
// Minimal data we're prefilling the wizard with
5-
export type InitialWizardFormData = {
3+
export type DeployPrefillData = {
4+
modelName: string;
5+
modelUri?: string;
6+
returnRouteValue?: string;
67
wizardStartIndex?: number;
7-
modelLocationData?: {
8-
type: 'new' | 'existing' | 'pvc';
9-
fieldValues?: Record<string, unknown>;
10-
additionalFields?: Record<string, unknown>;
11-
disableInputFields?: boolean;
12-
};
13-
createConnectionData?: {
14-
saveConnection?: boolean;
15-
hideFields?: boolean;
16-
};
17-
modelTypeField?: string;
18-
k8sNameDesc?: {
19-
name?: string;
20-
description?: string;
21-
k8sName?: {
22-
value?: string;
23-
state?: {
24-
immutable?: boolean;
25-
invalidCharacters?: boolean;
26-
invalidLength?: boolean;
27-
maxLength?: number;
28-
touched?: boolean;
29-
};
30-
};
31-
};
32-
};
33-
34-
export type Deployment = {
35-
modelServingPlatformId: string;
36-
model: {
37-
metadata: {
38-
name: string;
39-
namespace: string;
40-
};
41-
};
42-
server?: {
43-
metadata: {
44-
name: string;
45-
namespace: string;
46-
};
47-
};
48-
};
8+
}
499

5010
export type ModelCatalogDeployModalExtension = Extension<
5111
'model-catalog.model-details/deploy-modal',
5212
{
5313
useAvailablePlatformIds: CodeRef<() => string[]>;
54-
modalComponent: CodeRef<
55-
React.ComponentType<{
56-
modelDeployPrefill: {
57-
data: ModelDeployPrefillInfo;
58-
loaded: boolean;
59-
error: Error | undefined;
60-
};
61-
onSubmit: () => void;
62-
onClose: () => void;
63-
}>
64-
>;
6514
}
6615
>;
6716

@@ -70,16 +19,16 @@ export const isModelCatalogDeployModalExtension = (
7019
): extension is ModelCatalogDeployModalExtension =>
7120
extension.type === 'model-catalog.model-details/deploy-modal';
7221

73-
export type NavigateToWizardExtension = Extension<
74-
'model-serving.deployment/navigate-wizard',
22+
export type NavigateToDeploymentWizardWithDataExtension = Extension<
23+
'model-catalog.deployment/navigate-wizard',
7524
{
76-
useNavigateToDeploymentWizard: CodeRef<
77-
(deployment?: Deployment | null, initialData?: InitialWizardFormData | null, returnRouteValue?: string) => (projectName?: string) => void
25+
useNavigateToDeploymentWizardWithData: CodeRef<
26+
(deployPrefillData: DeployPrefillData) => (projectName?: string) => void
7827
>;
7928
}
8029
>;
8130

82-
export const isNavigateToWizardExtension = (
31+
export const isNavigateToDeploymentWizardWithDataExtension = (
8332
extension: Extension,
84-
): extension is NavigateToWizardExtension =>
85-
extension.type === 'model-serving.deployment/navigate-wizard';
33+
): extension is NavigateToDeploymentWizardWithDataExtension =>
34+
extension.type === 'model-catalog.deployment/navigate-wizard';

packages/model-registry/upstream/frontend/src/odh/extractExternalFormData.ts

Lines changed: 0 additions & 41 deletions
This file was deleted.

packages/model-serving/extension-points/index.ts

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -300,21 +300,3 @@ export const isDeploymentWizardFieldExtension = <D extends Deployment = Deployme
300300
extension: Extension,
301301
): extension is DeploymentWizardFieldExtension<D> =>
302302
extension.type === 'model-serving.deployment/wizard-field';
303-
304-
export type ModelServingNavigateToWizardExtension = Extension<
305-
'model-serving.deployment/navigate-wizard',
306-
{
307-
useNavigateToDeploymentWizard: CodeRef<
308-
(
309-
deployment?: Deployment | null,
310-
initialData?: InitialWizardFormData | null,
311-
returnRouteValue?: string,
312-
) => (projectName?: string) => void
313-
>;
314-
}
315-
>;
316-
317-
export const isModelServingNavigateToWizardExtension = (
318-
extension: Extension,
319-
): extension is ModelServingNavigateToWizardExtension =>
320-
extension.type === 'model-serving.deployment/navigate-wizard';

packages/model-serving/extensions/model-catalog.ts

Lines changed: 7 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,39 +1,18 @@
11
// eslint-disable-next-line no-restricted-syntax
22
import { SupportedArea } from '@odh-dashboard/internal/concepts/areas/types';
3-
import type { Extension, CodeRef } from '@openshift/dynamic-plugin-sdk';
4-
import type { ModelDeployPrefillInfo } from '@odh-dashboard/internal/pages/modelServing/screens/projects/usePrefillModelDeployModal';
3+
import type { Extension } from '@openshift/dynamic-plugin-sdk';
54

6-
type ModelCatalogDeployModalExtension = Extension<
7-
'model-catalog.model-details/deploy-modal',
5+
const extensions: Extension[] = [
86
{
9-
useAvailablePlatformIds: CodeRef<() => string[]>;
10-
modalComponent: CodeRef<
11-
React.ComponentType<{
12-
modelDeployPrefill: {
13-
data: ModelDeployPrefillInfo;
14-
loaded: boolean;
15-
error: Error | undefined;
16-
};
17-
onSubmit: () => void;
18-
onClose: () => void;
19-
}>
20-
>;
21-
}
22-
>;
23-
24-
const extensions: ModelCatalogDeployModalExtension[] = [
25-
{
26-
type: 'model-catalog.model-details/deploy-modal',
7+
type: 'model-catalog.deployment/navigate-wizard',
278
properties: {
28-
useAvailablePlatformIds: () =>
29-
import('../modelRegistry/useAvailablePlatformIds').then((m) => m.default),
30-
modalComponent: () =>
31-
import('../modelRegistry/DeployRegisteredVersionModal').then(
32-
(m) => m.DeployRegisteredVersionModal,
9+
useNavigateToDeploymentWizardWithData: () =>
10+
import('../modelRegistry/useNavigateToDeploymentWizardWithData').then(
11+
(m) => m.useNavigateToDeploymentWizardWithData,
3312
),
3413
},
3514
flags: {
36-
required: [SupportedArea.MODEL_SERVING],
15+
required: [SupportedArea.MODEL_CATALOG],
3716
},
3817
},
3918
];

packages/model-serving/extensions/odh.ts

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import {
1111
DataScienceStackComponent,
1212
SupportedArea,
1313
} from '@odh-dashboard/internal/concepts/areas/types';
14-
import type { ModelServingNavigateToWizardExtension } from 'extension-points';
1514

1615
const PLUGIN_MODEL_SERVING = SupportedArea.K_SERVE;
1716

@@ -26,7 +25,6 @@ const extensions: (
2625
| HrefNavItemExtension
2726
| RouteExtension
2827
| OverviewSectionExtension
29-
| ModelServingNavigateToWizardExtension
3028
)[] = [
3129
{
3230
type: 'app.area',
@@ -105,18 +103,6 @@ const extensions: (
105103
required: [PLUGIN_MODEL_SERVING],
106104
},
107105
},
108-
{
109-
type: 'model-serving.deployment/navigate-wizard',
110-
properties: {
111-
useNavigateToDeploymentWizard: () =>
112-
import('../src/components/deploymentWizard/useNavigateToDeploymentWizard').then(
113-
(m) => m.useNavigateToDeploymentWizard,
114-
),
115-
},
116-
flags: {
117-
required: [PLUGIN_MODEL_SERVING],
118-
},
119-
},
120106
];
121107

122108
export default extensions;

0 commit comments

Comments
 (0)