@@ -125,12 +125,11 @@ func (router *Router) PostActivate() error {
125125
126126 logger := route .Logger .WithFields (map [string ]interface {}{
127127 common .LabelEventSource : route .EventSource .Name ,
128- "event-type" : gitlabEventSource .Event ,
129- "project-id" : gitlabEventSource .ProjectId ,
128+ "project-id" : gitlabEventSource .ProjectID ,
130129 })
131130
132131 logger .Infoln ("retrieving the access token credentials..." )
133- c , err := router .getCredentials (gitlabEventSource .AccessToken , gitlabEventSource . Namespace )
132+ c , err := router .getCredentials (gitlabEventSource .AccessToken , router . namespace )
134133 if err != nil {
135134 return errors .Errorf ("failed to get gitlab credentials. err: %+v" , err )
136135 }
@@ -143,51 +142,96 @@ func (router *Router) PostActivate() error {
143142
144143 formattedUrl := common .FormattedURL (gitlabEventSource .Webhook .URL , gitlabEventSource .Webhook .Endpoint )
145144
146- // Get existing webhooks and check if the integration for same url and event type is already available
147- if ! gitlabEventSource .AllowDuplicate {
148- hooks , _ , err := router .gitlabClient .Projects .ListProjectHooks (router .gitlabEventSource .ProjectId , & gitlab.ListProjectHooksOptions {})
149- if err != nil {
150- return errors .Wrapf (err , "failed to list existing hooks to check for duplicates for project id %s" , router .gitlabEventSource .ProjectId )
151- }
145+ hooks , _ , err := router .gitlabClient .Projects .ListProjectHooks (gitlabEventSource .ProjectID , & gitlab.ListProjectHooksOptions {})
146+ if err != nil {
147+ return errors .Wrapf (err , "failed to list existing hooks to check for duplicates for project id %s" , router .gitlabEventSource .ProjectID )
148+ }
149+
150+ var existingHook * gitlab.ProjectHook
151+ isAlreadyExists := false
152152
153- for _ , hook := range hooks {
154- elem := reflect .ValueOf (hook ).Elem ().FieldByName (router .gitlabEventSource .Event )
155- if ok := elem .IsValid (); ! ok {
156- return errors .Errorf ("unknown event %s" , router .gitlabEventSource .Event )
157- }
158- value := elem .Bool ()
159-
160- if value && hook .URL == formattedUrl {
161- logger .Infoln ("webhook already exists, won't register it..." )
162- return nil
163- }
153+ for _ , hook := range hooks {
154+ if hook .URL == formattedUrl {
155+ existingHook = hook
156+ isAlreadyExists = true
164157 }
165158 }
166159
167- opt := & gitlab.AddProjectHookOptions {
168- URL : & formattedUrl ,
169- Token : & c .token ,
170- EnableSSLVerification : & router .gitlabEventSource .EnableSSLVerification ,
160+ defaultEventValue := false
161+
162+ editOpt := & gitlab.EditProjectHookOptions {
163+ URL : & formattedUrl ,
164+ ConfidentialNoteEvents : & defaultEventValue ,
165+ PushEvents : & defaultEventValue ,
166+ IssuesEvents : & defaultEventValue ,
167+ ConfidentialIssuesEvents : & defaultEventValue ,
168+ MergeRequestsEvents : & defaultEventValue ,
169+ TagPushEvents : & defaultEventValue ,
170+ NoteEvents : & defaultEventValue ,
171+ JobEvents : & defaultEventValue ,
172+ PipelineEvents : & defaultEventValue ,
173+ WikiPageEvents : & defaultEventValue ,
174+ EnableSSLVerification : & router .gitlabEventSource .EnableSSLVerification ,
175+ Token : & c .token ,
171176 }
172177
173- logger .Infoln ("configuring the type of the GitLab event the hook must register against..." )
174- elem := reflect .ValueOf (opt ).Elem ().FieldByName (router .gitlabEventSource .Event )
175- if ok := elem .IsValid (); ! ok {
176- return errors .Errorf ("unknown event %s" , router .gitlabEventSource .Event )
178+ addOpt := & gitlab.AddProjectHookOptions {
179+ URL : & formattedUrl ,
180+ Token : & c .token ,
181+ EnableSSLVerification : & router .gitlabEventSource .EnableSSLVerification ,
182+ ConfidentialNoteEvents : & defaultEventValue ,
183+ PushEvents : & defaultEventValue ,
184+ IssuesEvents : & defaultEventValue ,
185+ ConfidentialIssuesEvents : & defaultEventValue ,
186+ MergeRequestsEvents : & defaultEventValue ,
187+ TagPushEvents : & defaultEventValue ,
188+ NoteEvents : & defaultEventValue ,
189+ JobEvents : & defaultEventValue ,
190+ PipelineEvents : & defaultEventValue ,
191+ WikiPageEvents : & defaultEventValue ,
177192 }
178193
179- iev := reflect .New (elem .Type ().Elem ())
180- reflect .Indirect (iev ).SetBool (true )
181- elem .Set (iev )
194+ var opt interface {}
182195
183- logger .Infoln ("creating project hook..." )
184- hook , _ , err := router .gitlabClient .Projects .AddProjectHook (router .gitlabEventSource .ProjectId , opt )
185- if err != nil {
186- return errors .Errorf ("failed to add project hook. err: %+v" , err )
196+ opt = addOpt
197+ if isAlreadyExists {
198+ opt = editOpt
199+ }
200+
201+ logger .Infoln ("configuring the GitLab events for the hook..." )
202+
203+ for _ , event := range gitlabEventSource .Events {
204+ elem := reflect .ValueOf (opt ).Elem ().FieldByName (event )
205+ if ok := elem .IsValid (); ! ok {
206+ return errors .Errorf ("unknown event %s" , event )
207+ }
208+
209+ iev := reflect .New (elem .Type ().Elem ())
210+ reflect .Indirect (iev ).SetBool (true )
211+ elem .Set (iev )
187212 }
188213
189- router .hook = hook
190- logger .WithField ("hook-id" , hook .ID ).Info ("hook created for the project" )
214+ var newHook * gitlab.ProjectHook
215+
216+ if ! isAlreadyExists {
217+ logger .Infoln ("creating project hook..." )
218+ newHook , _ , err = router .gitlabClient .Projects .AddProjectHook (router .gitlabEventSource .ProjectID , opt .(* gitlab.AddProjectHookOptions ))
219+ if err != nil {
220+ return errors .Errorf ("failed to add project hook. err: %+v" , err )
221+ }
222+ } else {
223+ logger .Infoln ("project hook already exists, updating it..." )
224+ if existingHook == nil {
225+ return errors .Errorf ("existing hook contents are empty, unable to edit existing webhook" )
226+ }
227+ newHook , _ , err = router .gitlabClient .Projects .EditProjectHook (router .gitlabEventSource .ProjectID , existingHook .ID , opt .(* gitlab.EditProjectHookOptions ))
228+ if err != nil {
229+ return errors .Errorf ("failed to add project hook. err: %+v" , err )
230+ }
231+ }
232+
233+ router .hook = newHook
234+ logger .WithField ("hook-id" , newHook .ID ).Info ("hook registered for the project" )
191235 return nil
192236}
193237
@@ -199,12 +243,12 @@ func (router *Router) PostInactivate() error {
199243 if gitlabEventSource .DeleteHookOnFinish {
200244 logger := route .Logger .WithFields (map [string ]interface {}{
201245 common .LabelEventSource : route .EventSource .Name ,
202- "project-id" : gitlabEventSource .ProjectId ,
246+ "project-id" : gitlabEventSource .ProjectID ,
203247 "hook-id" : router .hook .ID ,
204248 })
205249
206250 logger .Infoln ("deleting project hook..." )
207- if _ , err := router .gitlabClient .Projects .DeleteProjectHook (router .gitlabEventSource .ProjectId , router .hook .ID ); err != nil {
251+ if _ , err := router .gitlabClient .Projects .DeleteProjectHook (router .gitlabEventSource .ProjectID , router .hook .ID ); err != nil {
208252 return errors .Errorf ("failed to delete hook. err: %+v" , err )
209253 }
210254
@@ -227,15 +271,12 @@ func (listener *EventListener) StartEventSource(eventSource *gateways.EventSourc
227271 return err
228272 }
229273
230- if gitlabEventSource .Namespace == "" {
231- gitlabEventSource .Namespace = listener .Namespace
232- }
233-
234274 route := webhook .NewRoute (gitlabEventSource .Webhook , listener .Logger , eventSource )
235275
236276 return webhook .ManageRoute (& Router {
237277 route : route ,
238278 k8sClient : listener .K8sClient ,
239279 gitlabEventSource : gitlabEventSource ,
280+ namespace : listener .Namespace ,
240281 }, controller , eventStream )
241282}
0 commit comments