Skip to content

Commit

Permalink
fix(api): management hook as code (#4460)
Browse files Browse the repository at this point in the history
  • Loading branch information
sguiheux authored and richardlt committed Jul 17, 2019
1 parent 7eeecdd commit 5faf06b
Show file tree
Hide file tree
Showing 4 changed files with 44 additions and 46 deletions.
16 changes: 0 additions & 16 deletions engine/api/workflow/dao.go
Original file line number Diff line number Diff line change
Expand Up @@ -1368,22 +1368,6 @@ func Push(ctx context.Context, db *gorp.DbMap, store cache.Store, proj *sdk.Proj
isDefaultBranch = opts.IsDefaultBranch
}

// In workflow as code context, if we only have the repowebhook, we skip it
// because it will be automatically recreated later with the proper configuration
if opts != nil && opts.FromRepository != "" {
if len(data.wrkflw.Workflow) == 0 {
if len(data.wrkflw.PipelineHooks) == 1 && data.wrkflw.PipelineHooks[0].Model == sdk.RepositoryWebHookModelName {
data.wrkflw.PipelineHooks = nil
}
} else {
for node, hooks := range data.wrkflw.Hooks {
if len(hooks) == 1 && hooks[0].Model == sdk.RepositoryWebHookModelName {
data.wrkflw.Hooks[node] = nil
}
}
}
}

var importOptions = ImportOptions{
Force: true,
}
Expand Down
12 changes: 7 additions & 5 deletions engine/api/workflow/hook.go
Original file line number Diff line number Diff line change
Expand Up @@ -97,13 +97,15 @@ func hookRegistration(ctx context.Context, db gorp.SqlExecutor, store cache.Stor
h := &wf.WorkflowData.Node.Hooks[i]
if h.UUID == "" && h.Ref == "" {
h.Ref = fmt.Sprintf("%s.%d", wf.WorkflowData.Node.Name, i)
} else if h.Ref != "" && oldHooksByRef != nil {
} else if h.UUID == "" && h.Ref != "" && oldHooksByRef != nil {
// search previous hook configuration by ref
previousHook, has := oldHooksByRef[h.Ref]
h.UUID = previousHook.UUID
// If previous hook is the same, we do nothing
if has && h.Equals(previousHook) {
continue
if has {
h.UUID = previousHook.UUID
// If previous hook is the same, we do nothing
if h.Equals(previousHook) {
continue
}
}
} else if oldHooks != nil {
// search previous hook configuration by uuid
Expand Down
3 changes: 1 addition & 2 deletions engine/api/workflow/workflow_importer.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ package workflow
import (
"context"
"fmt"

"github.com/go-gorp/gorp"
"github.com/ovh/cds/engine/api/cache"
"github.com/ovh/cds/engine/api/event"
Expand Down Expand Up @@ -61,7 +60,7 @@ func Import(ctx context.Context, db gorp.SqlExecutor, store cache.Store, proj *s
oldHooksByRef := oldW.WorkflowData.GetHooksMapRef()
for i := range w.WorkflowData.Node.Hooks {
h := &w.WorkflowData.Node.Hooks[i]
if h.Ref != "" {
if h.Ref != "" && h.UUID == "" {
if oldH, has := oldHooksByRef[h.Ref]; has {
if len(h.Config) == 0 {
h.Config = oldH.Config
Expand Down
59 changes: 36 additions & 23 deletions engine/api/workflow/workflow_parser.go
Original file line number Diff line number Diff line change
Expand Up @@ -101,35 +101,48 @@ func ParseAndImport(ctx context.Context, db gorp.SqlExecutor, store cache.Store,
}

if w.FromRepository != "" {
if len(w.WorkflowData.Node.Hooks) == 0 {
// When you came from run workflow you have uuid
if opts.HookUUID != "" && oldW != nil {
oldHooks := oldW.WorkflowData.GetHooks()
if h, has := oldHooks[opts.HookUUID]; has {
w.WorkflowData.Node.Hooks = append(w.WorkflowData.Node.Hooks, sdk.NodeHook{
Ref: h.Ref,
UUID: h.UUID,
Config: h.Config,
HookModelName: h.HookModelName,
HookModelID: h.HookModelID,
})

// Get repowebhook from previous version of workflow
if oldW != nil {
var oldRepoWebHook *sdk.NodeHook
for i := range oldW.WorkflowData.Node.Hooks {
h := &oldW.WorkflowData.Node.Hooks[i]
if h.HookModelName == sdk.RepositoryWebHookModel.Name {
oldRepoWebHook = h
break
}
} else {
// If we are coming from a workflow init command, the opts.HookUUID is empty, and we have to take the old value
if opts.HookUUID == "" && oldW != nil &&
len(oldW.WorkflowData.Node.Hooks) == 1 &&
oldW.WorkflowData.Node.Hooks[0].HookModelName == sdk.RepositoryWebHookModel.Name {
opts.HookUUID = oldW.WorkflowData.Node.Hooks[0].UUID
}

// Update current repo web hook if found
var currentRepoWebHook *sdk.NodeHook
// Get current webhook
for i := range w.WorkflowData.Node.Hooks {
h := &w.WorkflowData.Node.Hooks[i]
if h.HookModelName == sdk.RepositoryWebHookModel.Name {
h.UUID = oldRepoWebHook.UUID
h.Config = oldRepoWebHook.Config
currentRepoWebHook = h
break
}
}

// If not found
if currentRepoWebHook == nil {
w.WorkflowData.Node.Hooks = append(w.WorkflowData.Node.Hooks, sdk.NodeHook{
HookModelName: sdk.RepositoryWebHookModel.Name,
HookModelID: sdk.RepositoryWebHookModel.ID,
Config: sdk.RepositoryWebHookModel.DefaultConfig,
UUID: opts.HookUUID,
UUID: oldRepoWebHook.UUID,
HookModelName: oldRepoWebHook.HookModelName,
Config: oldRepoWebHook.Config,
Ref: oldRepoWebHook.Ref,
HookModelID: oldRepoWebHook.HookModelID,
})
}

} else {
// Init new repo webhook
w.WorkflowData.Node.Hooks = append(w.WorkflowData.Node.Hooks, sdk.NodeHook{
HookModelName: sdk.RepositoryWebHookModel.Name,
HookModelID: sdk.RepositoryWebHookModel.ID,
Config: sdk.RepositoryWebHookModel.DefaultConfig,
})
var err error
if w.WorkflowData.Node.Context.DefaultPayload, err = DefaultPayload(ctx, db, store, proj, w); err != nil {
return nil, nil, sdk.WrapError(err, "Unable to get default payload")
Expand Down

0 comments on commit 5faf06b

Please sign in to comment.