8000 fix(api,ui): fix to handle custom workflow name change in template (#… · ovh/cds@7a538e2 · GitHub
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content

Commit 7a538e2

Browse files
authored
fix(api,ui): fix to handle custom workflow name change in template (#3855)
1 parent 12c9388 commit 7a538e2

File tree

5 files changed

+79
-98
lines changed

5 files changed

+79
-98
lines changed

engine/api/templates.go

Lines changed: 11 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -313,43 +313,25 @@ func (api *API) applyTemplateHandler() service.Handler {
313313
return err
314314
}
315315

316-
// check if a workflow exists with given slug
317-
wf, err := workflow.Load(ctx, api.mustDB(), api.Cache, p, req.WorkflowName, u, workflow.LoadOptions{})
318-
if err != nil && !sdk.ErrorIs(err, sdk.ErrWorkflowNotFound) {
319-
return err
320-
}
321-
322316
tx, err := api.mustDB().Begin()
323317
if err != nil {
324318
return sdk.WrapError(err, "Cannot start transaction")
325319
}
326320
defer func() { _ = tx.Rollback() }()
327321

328322
var wti *sdk.WorkflowTemplateInstance
329-
if wf != nil {
330-
// check if workflow is a generated one for the current template
331-
wti, err = workflowtemplate.GetInstanceByWorkflowIDAndTemplateID(tx, wf.ID, wt.ID)
332-
if err != nil {
333-
return err
334-
}
323+
// try to get a instance not assign to a workflow but with the same slug
324+
wtis, err := workflowtemplate.GetInstancesByTemplateIDAndProjectIDAndRequestWorkflowName(tx, wt.ID, p.ID, req.WorkflowName)
325+
if err != nil {
326+
return err
335327
}
336-
if wti == nil {
337-
// try to get a instance not assign to a workflow but with the same slug
338-
wtis, err := workflowtemplate.GetInstancesByTemplateIDAndProjectIDAndWorkflowIDNull(tx, wt.ID, p.ID)
339-
if err != nil {
340-
return err
341-
}
342-
343-
for _, res := range wtis {
344-
if res.Request.WorkflowName == req.WorkflowName {
345-
if wti == nil {
346-
wti = &res
347-
} else {
348-
// if there are more than one instance found, delete others
349-
if err := work 6D4E flowtemplate.DeleteInstance(tx, &res); err != nil {
350-
return err
351-
}
352-
}
328+
for _, res := range wtis {
329+
if wti == nil {
330+
wti = &res
331+
} else {
332+
// if there are more than one instance found, delete others
333+
if err := workflowtemplate.DeleteInstance(tx, &res); err != nil {
334+
return err
353335
}
354336
}
355337
}

engine/api/workflowtemplate/dao.go

Lines changed: 4 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -171,13 +171,13 @@ func GetInstancesByTemplateIDAndProjectIDs(db gorp.SqlExecutor, templateID int64
171171
return wtis, nil
172172
}
173173

174-
// GetInstancesByTemplateIDAndProjectIDAndWorkflowIDNull returns all workflow template instances by template id, project id and workflow id null.
175-
func GetInstancesByTemplateIDAndProjectIDAndWorkflowIDNull(db gorp.SqlExecutor, templateID, projectID int64) ([]sdk.WorkflowTemplateInstance, error) {
174+
// GetInstancesByTemplateIDAndProjectIDAndRequestWorkflowName returns all workflow template instances by template id, project id and request workflow name.
175+
func GetInstancesByTemplateIDAndProjectIDAndRequestWorkflowName(db gorp.SqlExecutor, templateID, projectID int64, workflowName string) ([]sdk.WorkflowTemplateInstance, error) {
176176
wtis := []sdk.WorkflowTemplateInstance{}
177177

178178
if _, err := db.Select(&wtis,
179-
"SELECT * FROM workflow_template_instance WHERE workflow_id IS NULL AND workflow_template_id = $1 AND project_id = $2",
180-
templateID, projectID,
179+
"SELECT * FROM workflow_template_instance WHERE workflow_template_id = $1 AND project_id = $2 AND (request->>'workflow_name')::text = $3",
180+
templateID, projectID, workflowName,
181181
); err != nil {
182182
return nil, sdk.WrapError(err, "Cannot get workflow template instances")
183183
}
@@ -199,23 +199,6 @@ func GetInstancesByWorkflowIDs(db gorp.SqlExecutor, workflowIDs []int64) ([]sdk.
199199
return wtis, nil
200200
}
201201

202-
// GetInstanceByWorkflowIDAndTemplateID returns a workflow template instance by workflow and template ids.
203-
func GetInstanceByWorkflowIDAndTemplateID(db gorp.SqlExecutor, workflowID, templateID int64) (*sdk.WorkflowTemplateInstance, error) {
204-
wti := sdk.WorkflowTemplateInstance{}
205-
206-
if err := db.SelectOne(&wti,
207-
"SELECT * FROM workflow_template_instance WHERE workflow_id = $1 AND workflow_template_id = $2",
208-
workflowID, templateID,
209-
); err != nil {
210-
if err == sql.ErrNoRows {
211-
return nil, nil
212-
}
213-
return nil, sdk.WrapError(err, "Cannot get workflow template instance")
214-
}
215-
216-
return &wti, nil
217-
}
218-
219202
// GetInstanceByWorkflowID returns a workflow template instance by workflow id.
220203
func GetInstanceByWorkflowID(db gorp.SqlExecutor, workflowID int64) (*sdk.WorkflowTemplateInstance, error) {
221204
wti := sdk.WorkflowTemplateInstance{}

ui/src/app/shared/workflow-template/apply-form/workflow-template.apply-form.component.ts

Lines changed: 62 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import {
99
WorkflowTemplateInstance,
1010
WorkflowTemplateRequest
1111
} from '../../../model/workflow-template.model';
12+
import { Workflow } from '../../../model/workflow.model';
1213
import { RepoManagerService } from '../../../service/repomanager/project.repomanager.service';
1314
import { WorkflowTemplateService } from '../../../service/workflow-template/workflow-template.service';
1415

@@ -28,17 +29,21 @@ export class WorkflowTemplateApplyFormComponent {
2829
}
2930
get project() { return this._project; }
3031

32+
@Input() workflow: Workflow;
33+
3134
_workflowTemplate: WorkflowTemplate;
3235
@Input() set workflowTemplate(wt: WorkflowTemplate) {
3336
this._workflowTemplate = wt;
3437

3538
this.parameterValues = {};
3639

37-
this._workflowTemplate.parameters.forEach(parameter => {
38-
if (parameter.type === 'boolean') {
39-
this.parameterValues[parameter.key] = new FormControl();
40-
}
41-
});
40+
if (this._workflowTemplate.parameters) {
41+
this._workflowTemplate.parameters.forEach(parameter => {
42+
if (parameter.type === 'boolean') {
43+
this.parameterValues[parameter.key] = new FormControl();
44+
}
45+
});
46+
}
4247

4348
this.fillFormWithInstanceData();
4449
}
@@ -75,33 +80,42 @@ export class WorkflowTemplateApplyFormComponent {
7580
req.workflow_name = this.parameterName;
7681
req.parameters = {};
7782

78-
this._workflowTemplate.parameters.forEach(parameter => {
79-
if (this.parameterValues[parameter.key]) {
80-
switch (parameter.type) {
81-
case 'boolean':
82-
req.parameters[parameter.key] = this.parameterValues[parameter.key] &&
83-
!!this.parameterValues[parameter.key].value ? 'true' : 'false';
84-
break;
85-
case 'repository':
86-
if (this.parameterValues[parameter.key + '-repository']) {
87-
req.parameters[parameter.key] = this.parameterValues[parameter.key] + '/' +
88-
this.parameterValues[parameter.key + '-repository'];
89-
}
90-
break;
91-
default:
92-
req.parameters[parameter.key] = this.parameterValues[parameter.key];
93-
break;
83+
if (this._workflowTemplate.parameters) {
84+
this._workflowTemplate.parameters.forEach(parameter => {
85+
if (this.parameterValues[parameter.key]) {
86+
switch (parameter.type) {
87+
case 'boolean':
88+
req.parameters[parameter.key] = this.parameterValues[parameter.key] &&
89+
!!this.parameterValues[parameter.key].value ? 'true' : 'false';
90+
break;
91+
case 'repository':
92+
if (this.parameterValues[parameter.key + '-repository']) {
93+
req.parameters[parameter.key] = this.parameterValues[parameter.key] + '/' +
94+
this.parameterValues[parameter.key + '-repository'];
95+
}
96+
break;
97+
default:
98+
req.parameters[parameter.key] = this.parameterValues[parameter.key];
99+
break;
100+
}
94101
}
95-
}
96-
});
102+
});
103+
}
97104

98105
this.result = null;
99106
this.loading = true;
100107
this._workflowTemplateService.applyWorkflowTemplate(this._workflowTemplate.group.name, this._workflowTemplate.slug, req)
101108
.pipe(first(), finalize(() => this.loading = false))
102109
.subscribe(res => {
110+
// if the workflow name changed move to new workflow page
103111
this.result = res;
104-
this.apply.emit();
112+
113+
// specific check for case where workflow name change in template
114+
if (res.workflow_name !== this.workflow.name) {
115+
this._ 6851 router.navigate(['/project', this.project.key, 'workflow', res.workflow_name]);
116+
} else {
117+
this.apply.emit();
118+
}
105119
});
106120
}
107121

@@ -143,30 +157,32 @@ export class WorkflowTemplateApplyFormComponent {
143157
fillFormWithInstanceData(): void {
144158
if (this._workflowTemplate && this._workflowTemplateInstance) {
145159
this.parameterName = this._workflowTemplateInstance.request.workflow_name;
146-
this._workflowTemplate.parameters.forEach(parameter => {
147-
148-
let v = this._workflowTemplateInstance.request.parameters[parameter.key];
149-
if (v) {
150-
switch (parameter.type) {
151-
case 'boolean':
152-
this.parameterValues[parameter.key].setValue(v === 'true');
153-
break;
154-
case 'repository':
155-
let s = v.split('/');
156-
if (s.length > 1) {
157-
let existingVcs = this.vcsNames.find(vcs => vcs === s[0]);
158-
if (existingVcs) {
159-
this.parameterValues[parameter.key] = existingVcs;
160-
this.fetchRepos(parameter.key, existingVcs);
160+
if (this._workflowTemplate.parameters) {
161+
this._workflowTemplate.parameters.forEach(parameter => {
162+
163+
let v = this._workflowTemplateInstance.request.parameters[parameter.key];
164+
if (v) {
165+
switch (parameter.type) {
166+
case 'boolean':
167+
this.parameterValues[parameter.key].setValue(v === 'true');
168+
break;
169+
case 'repository':
170+
let s = v.split('/');
171+
if (s.length > 1) {
172+
let existingVcs = this.vcsNames.find(vcs => vcs === s[0]);
173+
if (existingVcs) {
174+
this.parameterValues[parameter.key] = existingVcs;
175+
this.fetchRepos(parameter.key, existingVcs);
176+
}
161177
}
162-
}
163-
break;
164-
default:
165-
this.parameterValues[parameter.key] = v;
166-
break;
178+
break;
179+
default:
180+
this.parameterValues[parameter.key] = v;
181+
break;
182+
}
167183
}
168-
}
169-
});
184+
});
185+
}
170186
}
171187
}
172188

ui/src/app/shared/workflow-template/apply-form/workflow-template.apply-form.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
<label>{{'workflow_name' | translate}}*</label>
66
<input class="ui input" type="text" name="workflow_name" [(ngModel)]="parameterName" [disabled]="_workflowTemplateInstance">
77
</div>
8-
<div *ngIf="workflowTemplate.parameters.length > 0" class="wide field">
8+
<div *ngIf="workflowTemplate.parameters && workflowTemplate.parameters.length > 0" class="wide field">
99
<label>{{'common_parameters' | translate}}</label>
1010
</div>
1111
<ng-container *ngFor="let parameter of workflowTemplate.parameters; let index = index">

ui/src/app/shared/workflow-template/modal/workflow-template.modal.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@
4242
<div *ngIf="diffVisible" class="ui wide sixteen field">
4343
<app-diff-list [items]="diffItems"></app-diff-list>
4444
</div>
45-
<app-workflow-template-apply-form [project]="project" [workflowTemplate]="workflowTemplate"
45+
<app-workflow-template-apply-form [project]="project" [workflow]="workflow" [workflowTemplate]="workflowTemplate"
4646
[workflowTemplateInstance]="workflowTemplateInstance" [withClose]="true" (close)="close()"
4747
(apply)="load()"></app-workflow-template-apply-form>
4848
</div>

0 commit comments

Comments
 (0)
0