Skip to content

Commit 35db63f

Browse files
authored
feat: workflow ascode from template edit with merge request (#5154)
1 parent d1a3a18 commit 35db63f

File tree

75 files changed

+1650
-1104
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

75 files changed

+1650
-1104
lines changed

engine/api/api.go

+4
Original file line numberDiff line numberDiff line change
@@ -713,6 +713,10 @@ func (a *API) Serve(ctx context.Context) error {
713713
return migrate.RefactorProjectIntegrationCrypto(ctx, a.DBConnectionFactory.GetDBMap())
714714
}})
715715

716+
migrate.Add(ctx, sdk.Migration{Name: "AsCodeEventsWorkflowHolder", Release: "0.44.0", Blocker: false, Automatic: true, ExecFunc: func(ctx context.Context) error {
717+
return migrate.RefactorAsCodeEventsWorkflowHolder(ctx, a.DBConnectionFactory.GetDBMap())
718+
}})
719+
716720
isFreshInstall, errF := version.IsFreshInstall(a.mustDB())
717721
if errF != nil {
718722
return sdk.WrapError(errF, "Unable to check if it's a fresh installation of CDS")

engine/api/api_routes.go

+1-3
Original file line numberDiff line numberDiff line change
@@ -182,9 +182,6 @@ func (api *API) InitRouter() {
182182
r.Handle("/project/{permProjectKey}/keys", Scope(sdk.AuthConsumerScopeProject), r.GET(api.getKeysInProjectHandler), r.POST(api.addKeyInProjectHandler))
183183
r.Handle("/project/{permProjectKey}/keys/{name}", Scope(sdk.AuthConsumerScopeProject), r.DELETE(api.deleteKeyInProjectHandler))
184184

185-
// As Code
186-
r.Handle("/project/{key}/ascode/events/resync", Scope(sdk.AuthConsumerScopeProject), r.POST(api.postResyncPRAsCodeHandler, EnableTracing()))
187-
188185
// Import Application
189186
r.Handle("/project/{permProjectKey}/import/application", Scope(sdk.AuthConsumerScopeProject), r.POST(api.postApplicationImportHandler))
190187
// Export Application
@@ -239,6 +236,7 @@ func (api *API) InitRouter() {
239236
r.Handle("/project/{key}/workflows/{permWorkflowName}/eventsintegration/{integrationID}", Scope(sdk.AuthConsumerScopeProject), r.DELETE(api.deleteWorkflowEventsIntegrationHandler))
240237
r.Handle("/project/{key}/workflows/{permWorkflowName}/icon", Scope(sdk.AuthConsumerScopeProject), r.PUT(api.putWorkflowIconHandler), r.DELETE(api.deleteWorkflowIconHandler))
241238
r.Handle("/project/{key}/workflows/{permWorkflowName}/ascode", Scope(sdk.AuthConsumerScopeProject), r.POST(api.postWorkflowAsCodeHandler))
239+
r.Handle("/project/{key}/workflows/{permWorkflowName}/ascode/events/resync", Scope(sdk.AuthConsumerScopeProject), r.POST(api.postWorkflowAsCodeEventsResyncHandler, EnableTracing()))
242240
r.Handle("/project/{key}/workflows/{permWorkflowName}/ascode/{uuid}", Scope(sdk.AuthConsumerScopeProject), r.GET(api.getWorkflowAsCodeHandler))
243241
r.Handle("/project/{key}/workflows/{permWorkflowName}/label", Scope(sdk.AuthConsumerScopeProject), r.POST(api.postWorkflowLabelHandler))
244242
r.Handle("/project/{key}/workflows/{permWorkflowName}/label/{labelID}", Scope(sdk.AuthConsumerScopeProject), r.DELETE(api.deleteWorkflowLabelHandler))

engine/api/ascode.go

+33-41
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,7 @@ import (
77

88
"github.com/gorilla/mux"
99

10-
"github.com/ovh/cds/engine/api/application"
11-
"github.com/ovh/cds/engine/api/ascode/sync"
10+
"github.com/ovh/cds/engine/api/ascode"
1211
"github.com/ovh/cds/engine/api/event"
1312
"github.com/ovh/cds/engine/api/operation"
1413
"github.com/ovh/cds/engine/api/project"
@@ -88,12 +87,9 @@ func (api *API) postImportAsCodeHandler() service.Handler {
8887
func (api *API) getImportAsCodeHandler() service.Handler {
8988
return func(ctx context.Context, w http.ResponseWriter, r *http.Request) error {
9089
vars := mux.Vars(r)
91-
uuid := vars["uuid"]
92-
93-
var ope = new(sdk.Operation)
94-
ope.UUID = uuid
95-
if err := operation.GetRepositoryOperation(ctx, api.mustDB(), ope); err != nil {
96-
return sdk.WrapError(err, "Cannot get repository operation status")
90+
ope, err := operation.GetRepositoryOperation(ctx, api.mustDB(), vars["uuid"])
91+
if err != nil {
92+
return sdk.WrapError(err, "cannot get repository operation status")
9793
}
9894
return service.WriteJSON(w, ope, http.StatusOK)
9995
}
@@ -123,11 +119,9 @@ func (api *API) postPerformImportAsCodeHandler() service.Handler {
123119
return sdk.WrapError(errp, "postPerformImportAsCodeHandler> Cannot load project %s", key)
124120
}
125121

126-
var ope = new(sdk.Operation)
127-
ope.UUID = uuid
128-
129-
if err := operation.GetRepositoryOperation(ctx, api.mustDB(), ope); err != nil {
130-
return sdk.WrapError(err, "Unable to get repository operation")
122+
ope, err := operation.GetRepositoryOperation(ctx, api.mustDB(), uuid)
123+
if err != nil {
124+
return sdk.WrapError(err, "unable to get repository operation")
131125
}
132126

133127
if ope.Status != sdk.OperationStatusDone {
@@ -167,11 +161,14 @@ func (api *API) postPerformImportAsCodeHandler() service.Handler {
167161
if opt.FromRepository != "" {
168162
mods = append(mods, workflowtemplate.TemplateRequestModifiers.DefaultNameAndRepositories(ctx, api.mustDB(), api.Cache, *proj, opt.FromRepository))
169163
}
170-
wti, err := workflowtemplate.CheckAndExecuteTemplate(ctx, api.mustDB(), *consumer, *proj, &data, mods...)
164+
var allMsg []sdk.Message
165+
msgTemplate, wti, err := workflowtemplate.CheckAndExecuteTemplate(ctx, api.mustDB(), *consumer, *proj, &data, mods...)
166+
allMsg = append(allMsg, msgTemplate...)
171167
if err != nil {
172168
return err
173169
}
174-
allMsg, wrkflw, _, err := workflow.Push(ctx, api.mustDB(), api.Cache, proj, data, opt, getAPIConsumer(ctx), project.DecryptWithBuiltinKey)
170+
msgPush, wrkflw, _, err := workflow.Push(ctx, api.mustDB(), api.Cache, proj, data, opt, getAPIConsumer(ctx), project.DecryptWithBuiltinKey)
171+
allMsg = append(allMsg, msgPush...)
175172
if err != nil {
176173
return sdk.WrapError(err, "unable to push workflow")
177174
}
@@ -203,43 +200,38 @@ func (api *API) postPerformImportAsCodeHandler() service.Handler {
203200
}
204201
}
205202

206-
func (api *API) postResyncPRAsCodeHandler() service.Handler {
203+
func (api *API) postWorkflowAsCodeEventsResyncHandler() service.Handler {
207204
return func(ctx context.Context, w http.ResponseWriter, r *http.Request) error {
208205
vars := mux.Vars(r)
209-
key := vars["key"]
210-
appName := FormString(r, "appName")
211-
fromRepo := FormString(r, "repo")
206+
projectKey := vars["key"]
207+
workflowName := vars["permWorkflowName"]
212208

213-
proj, errP := project.Load(api.mustDB(), key,
209+
proj, err := project.Load(api.mustDB(), projectKey,
214210
project.LoadOptions.WithApplicationWithDeploymentStrategies,
215211
project.LoadOptions.WithPipelines,
216212
project.LoadOptions.WithEnvironments,
217213
project.LoadOptions.WithIntegrations,
218-
project.LoadOptions.WithClearKeys)
219-
if errP != nil {
220-
return sdk.WrapError(errP, "unable to load project")
221-
}
222-
var app sdk.Application
223-
switch {
224-
case appName != "":
225-
appP, err := application.LoadByName(api.mustDB(), key, appName)
226-
if err != nil {
227-
return err
228-
}
229-
app = *appP
230-
case fromRepo != "":
231-
wkf, err := workflow.LoadByRepo(ctx, api.Cache, api.mustDB(), *proj, fromRepo, workflow.LoadOptions{})
232-
if err != nil {
233-
return err
234-
}
235-
app = wkf.Applications[wkf.WorkflowData.Node.Context.ApplicationID]
236-
default:
237-
return sdk.WrapError(sdk.ErrWrongRequest, "Missing appName or repo query parameter")
214+
project.LoadOptions.WithClearKeys,
215+
)
216+
if err != nil {
217+
return err
238218
}
239219

240-
if _, _, err := sync.SyncAsCodeEvent(ctx, api.mustDB(), api.Cache, *proj, app, getAPIConsumer(ctx).AuthentifiedUser); err != nil {
220+
wf, err := workflow.Load(ctx, api.mustDB(), api.Cache, *proj, workflowName, workflow.LoadOptions{})
221+
if err != nil {
241222
return err
242223
}
224+
225+
res, err := ascode.SyncEvents(ctx, api.mustDB(), api.Cache, *proj, *wf, getAPIConsumer(ctx).AuthentifiedUser)
226+
if err != nil {
227+
return err
228+
}
229+
if res.Merged {
230+
if err := workflow.UpdateFromRepository(api.mustDB(), wf.ID, res.FromRepository); err != nil {
231+
return err
232+
}
233+
}
234+
243235
return nil
244236
}
245237
}

engine/api/ascode/ascode_pr.go

-168
This file was deleted.

0 commit comments

Comments
 (0)