Skip to content

Commit dca9085

Browse files
Merge pull request #180 from mprahl/fix-samples-odh
Cherry-pick: fix(backend): Fix the pipeline samples (kubeflow#11967)
2 parents 0672605 + 2d861c9 commit dca9085

File tree

6 files changed

+121
-4
lines changed

6 files changed

+121
-4
lines changed

.github/workflows/frontend.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ on:
1818
- '.github/workflows/frontend.yml'
1919
- '!**/*.md'
2020
- '!**/OWNERS'
21+
- 'backend/src/apiserver/config/sample_config.json'
2122

2223
jobs:
2324
frontend-tests:

backend/src/apiserver/config/config.go

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,11 +38,15 @@ type deprecatedConfig struct {
3838
}
3939

4040
type configPipelines struct {
41-
Name string
41+
Name string
42+
// optional, Name is used for Pipeline if not provided
43+
DisplayName string
4244
Description string
4345
File string
4446
// optional, Name is used for PipelineVersion if not provided
4547
VersionName string
48+
// optional, VersionName, DisplayName, or Name is used for PipelineVersion if not provided
49+
VersionDisplayName string
4650
// optional, Description is used for PipelineVersion if not provided
4751
VersionDescription string
4852
}
@@ -93,6 +97,7 @@ func LoadSamples(resourceManager *resource.ResourceManager, sampleConfigPath str
9397
for _, cfg := range deprecatedCfg {
9498
pipelineConfig.Pipelines = append(pipelineConfig.Pipelines, configPipelines{
9599
Name: cfg.Name,
100+
DisplayName: cfg.Name,
96101
File: cfg.File,
97102
Description: cfg.Description,
98103
})
@@ -124,12 +129,18 @@ func LoadSamples(resourceManager *resource.ResourceManager, sampleConfigPath str
124129
return fmt.Errorf("failed to load sample %s. Error: %v", cfg.Name, configErr)
125130
}
126131

132+
pipelineDisplayName := cfg.DisplayName
133+
if pipelineDisplayName == "" {
134+
pipelineDisplayName = cfg.Name
135+
}
136+
127137
// Create pipeline if it does not already exist
128138
p, fetchErr := resourceManager.GetPipelineByNameAndNamespace(cfg.Name, common.GetPodNamespace())
129139
if fetchErr != nil {
130140
if util.IsUserErrorCodeMatch(fetchErr, codes.NotFound) {
131141
p, configErr = resourceManager.CreatePipeline(&model.Pipeline{
132142
Name: cfg.Name,
143+
DisplayName: pipelineDisplayName,
133144
Description: cfg.Description,
134145
})
135146
if configErr != nil {
@@ -159,6 +170,17 @@ func LoadSamples(resourceManager *resource.ResourceManager, sampleConfigPath str
159170
pvName = cfg.VersionName
160171
}
161172

173+
// Use Pipeline Version Display Name if provided, if not use Pipeline Version Name, and if not provided use
174+
// Pipeline Display Name (which defaults to Pipeline Name).
175+
var pvDisplayName string
176+
if cfg.VersionDisplayName != "" {
177+
pvDisplayName = cfg.VersionDisplayName
178+
} else if cfg.VersionName != "" {
179+
pvDisplayName = cfg.VersionName
180+
} else {
181+
pvDisplayName = p.DisplayName
182+
}
183+
162184
// If the Pipeline Version exists, do nothing
163185
// Otherwise upload new Pipeline Version for
164186
// this pipeline.
@@ -168,6 +190,7 @@ func LoadSamples(resourceManager *resource.ResourceManager, sampleConfigPath str
168190
_, configErr = resourceManager.CreatePipelineVersion(
169191
&model.PipelineVersion{
170192
Name: pvName,
193+
DisplayName: pvDisplayName,
171194
Description: pvDescription,
172195
PipelineId: p.UUID,
173196
PipelineSpec: string(pipelineFile),

backend/src/apiserver/config/config_test.go

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,41 @@ func TestLoadSamples(t *testing.T) {
102102
VersionName: "Pipeline 2 - Ver 1",
103103
VersionDescription: "Pipeline 2 - Ver 1 Description",
104104
},
105+
// Test case: Pipeline with display name but no version display name
106+
{
107+
Name: "Pipeline 3",
108+
DisplayName: "Display Pipeline 3",
109+
Description: "test description",
110+
File: "testdata/sample_pipeline.yaml",
111+
VersionName: "Pipeline 3 - Ver 1",
112+
VersionDescription: "Pipeline 3 - Ver 1 Description",
113+
},
114+
// Test case: Pipeline with version display name but no pipeline display name
115+
{
116+
Name: "Pipeline 4",
117+
Description: "test description",
118+
File: "testdata/sample_pipeline.yaml",
119+
VersionName: "Pipeline 4 - Ver 1",
120+
VersionDisplayName: "Display Pipeline 4 - Version 1",
121+
VersionDescription: "Pipeline 4 - Ver 1 Description",
122+
},
123+
// Test case: Pipeline with both display names
124+
{
125+
Name: "Pipeline 5",
126+
DisplayName: "Display Pipeline 5",
127+
Description: "test description",
128+
File: "testdata/sample_pipeline.yaml",
129+
VersionName: "Pipeline 5 - Ver 1",
130+
VersionDisplayName: "Display Pipeline 5 - Version 1",
131+
VersionDescription: "Pipeline 5 - Ver 1 Description",
132+
},
133+
// Test case: Pipeline with only pipeline name, no version name or display names
134+
{
135+
Name: "Pipeline 6",
136+
Description: "test description",
137+
File: "testdata/sample_pipeline.yaml",
138+
VersionDescription: "Pipeline 6 - Ver 1 Description",
139+
},
105140
},
106141
}
107142

@@ -113,9 +148,51 @@ func TestLoadSamples(t *testing.T) {
113148
var pipeline1 *model.Pipeline
114149
pipeline1, err = rm.GetPipelineByNameAndNamespace(pc.Pipelines[0].Name, "")
115150
require.NoError(t, err)
151+
version1, err := rm.GetPipelineVersionByName(pc.Pipelines[0].VersionName)
152+
require.NoError(t, err)
153+
// Verify that the pipeline display name is set to the pipeline name if not provided
154+
assert.Equal(t, pipeline1.DisplayName, pc.Pipelines[0].Name)
155+
assert.Equal(t, version1.DisplayName, pc.Pipelines[0].VersionName)
116156
var pipeline2 *model.Pipeline
117157
pipeline2, err = rm.GetPipelineByNameAndNamespace(pc.Pipelines[1].Name, "")
118158
require.NoError(t, err)
159+
version2, err := rm.GetPipelineVersionByName(pc.Pipelines[1].VersionName)
160+
// Verify that the pipeline display name is set to the pipeline name if not provided
161+
assert.Equal(t, pipeline2.DisplayName, pc.Pipelines[1].Name)
162+
assert.Equal(t, version2.DisplayName, pc.Pipelines[1].VersionName)
163+
require.NoError(t, err)
164+
165+
// Test display name for Pipeline 3 (pipeline display name only)
166+
pipeline3, err := rm.GetPipelineByNameAndNamespace(pc.Pipelines[2].Name, "")
167+
require.NoError(t, err)
168+
assert.Equal(t, pc.Pipelines[2].DisplayName, pipeline3.DisplayName)
169+
version3, err := rm.GetPipelineVersionByName(pc.Pipelines[2].VersionName)
170+
require.NoError(t, err)
171+
assert.Equal(t, pc.Pipelines[2].VersionName, version3.DisplayName) // Should use version name when no version display name is provided
172+
173+
// Test display name for Pipeline 4 (version display name only)
174+
pipeline4, err := rm.GetPipelineByNameAndNamespace(pc.Pipelines[3].Name, "")
175+
require.NoError(t, err)
176+
assert.Equal(t, pc.Pipelines[3].Name, pipeline4.DisplayName) // Should use pipeline name
177+
version4, err := rm.GetPipelineVersionByName(pc.Pipelines[3].VersionName)
178+
require.NoError(t, err)
179+
assert.Equal(t, pc.Pipelines[3].VersionDisplayName, version4.DisplayName)
180+
181+
// Test display name for Pipeline 5 (both display names)
182+
pipeline5, err := rm.GetPipelineByNameAndNamespace(pc.Pipelines[4].Name, "")
183+
require.NoError(t, err)
184+
assert.Equal(t, pc.Pipelines[4].DisplayName, pipeline5.DisplayName)
185+
version5, err := rm.GetPipelineVersionByName(pc.Pipelines[4].VersionName)
186+
require.NoError(t, err)
187+
assert.Equal(t, pc.Pipelines[4].VersionDisplayName, version5.DisplayName)
188+
189+
// Test display name for Pipeline 6 (only pipeline name)
190+
pipeline6, err := rm.GetPipelineByNameAndNamespace(pc.Pipelines[5].Name, "")
191+
require.NoError(t, err)
192+
assert.Equal(t, pc.Pipelines[5].Name, pipeline6.DisplayName) // Should use pipeline name
193+
version6, err := rm.GetPipelineVersionByName(pc.Pipelines[5].Name) // Version name should default to pipeline name
194+
require.NoError(t, err)
195+
assert.Equal(t, pc.Pipelines[5].Name, version6.DisplayName) // Version display name should default to pipeline name
119196

120197
_, err = rm.GetPipelineVersionByName(pc.Pipelines[0].VersionName)
121198
require.NoError(t, err)
@@ -145,10 +222,12 @@ func TestLoadSamples(t *testing.T) {
145222
_, err = rm.GetPipelineVersionByName(pc.Pipelines[1].VersionName)
146223
require.NoError(t, err)
147224
_, totalSize, _, err = rm.ListPipelineVersions(pipeline2.UUID, opts)
225+
require.NoError(t, err)
148226
require.Equal(t, totalSize, 2)
149227

150228
// Confirm previous pipeline version count has not been affected
151229
_, totalSize, _, err = rm.ListPipelineVersions(pipeline1.UUID, opts)
230+
require.NoError(t, err)
152231
require.Equal(t, totalSize, 2)
153232

154233
// When LoadSamplesOnRestart is false, changes to config should

backend/src/apiserver/config/sample_config.json

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,14 @@
22
"loadSamplesOnRestart": true,
33
"pipelines": [
44
{
5-
"name": "[Tutorial] Data passing in python components",
5+
"name": "tutorial-data-passing-in-python-components",
6+
"displayName": "[Tutorial] Data passing in python components",
67
"description": "[source code](https://github.com/kubeflow/pipelines/tree/master/samples/tutorials/Data%20passing%20in%20python%20components) Shows how to pass data between python components.",
78
"file": "/samples/tutorials/Data passing in python components/Data passing in python components - Files.py.yaml"
89
},
910
{
10-
"name": "[Tutorial] DSL - Control structures",
11+
"name": "tutorial-dsl-control-structures",
12+
"displayName": "[Tutorial] DSL - Control structures",
1113
"description": "[source code](https://github.com/kubeflow/pipelines/tree/master/samples/tutorials/DSL%20-%20Control%20structures) Shows how to use conditional execution and exit handlers. This pipeline will randomly fail to demonstrate that the exit handler gets executed even in case of failure.",
1214
"file": "/samples/tutorials/DSL - Control structures/DSL - Control structures.py.yaml"
1315
}

backend/src/apiserver/resource/resource_manager.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -350,6 +350,11 @@ func (r *ResourceManager) CreatePipeline(p *model.Pipeline) (*model.Pipeline, er
350350
if p.Name == "" {
351351
return nil, util.NewInvalidInputError("pipeline's name cannot be empty")
352352
}
353+
354+
if p.DisplayName == "" {
355+
p.DisplayName = p.Name
356+
}
357+
353358
// Create a record in KFP DB (only pipelines table)
354359
newPipeline, err := r.pipelineStore.CreatePipeline(p)
355360
if err != nil {
@@ -1697,6 +1702,11 @@ func (r *ResourceManager) CreatePipelineVersion(pv *model.PipelineVersion) (*mod
16971702
}
16981703
pv.Name = pipelineSpecName
16991704
}
1705+
1706+
if pv.DisplayName == "" {
1707+
pv.DisplayName = pv.Name
1708+
}
1709+
17001710
// Parse parameters
17011711
paramsJSON, err := tmpl.ParametersJSON()
17021712
if err != nil {

frontend/src/pages/GettingStarted.test.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,9 @@ describe(`${PATH_FRONTEND_CONFIG}`, () => {
2828
it(`should be in sync with ${PATH_BACKEND_CONFIG}, if not please run "npm run sync-backend-sample-config" to update.`, () => {
2929
const configBackend = require(PATH_BACKEND_CONFIG);
3030
const configFrontend = require(PATH_FRONTEND_CONFIG);
31-
expect(configFrontend).toEqual(configBackend.pipelines.map((sample: any) => sample.name));
31+
expect(configFrontend).toEqual(
32+
configBackend.pipelines.map((sample: any) => sample.displayName),
33+
);
3234
});
3335
});
3436

0 commit comments

Comments
 (0)