Skip to content

Commit

Permalink
Pass the incoming request URL from the sink to the interceptors.
Browse files Browse the repository at this point in the history
This fixes an issue in the sink where it is not passing the URL through from the incoming request.
  • Loading branch information
bigkevmcd committed Jul 2, 2020
1 parent 0fd1938 commit d1eac79
Show file tree
Hide file tree
Showing 2 changed files with 99 additions and 0 deletions.
2 changes: 2 additions & 0 deletions pkg/sink/sink.go
Original file line number Diff line number Diff line change
Expand Up @@ -185,6 +185,7 @@ func (r Sink) executeInterceptors(t *triggersv1.EventListenerTrigger, in *http.R
request := &http.Request{
Method: http.MethodPost,
Header: in.Header,
URL: in.URL,
Body: ioutil.NopCloser(bytes.NewBuffer(event)),
}

Expand Down Expand Up @@ -221,6 +222,7 @@ func (r Sink) executeInterceptors(t *triggersv1.EventListenerTrigger, in *http.R
request = &http.Request{
Method: http.MethodPost,
Header: resp.Header,
URL: in.URL,
Body: ioutil.NopCloser(resp.Body),
}
}
Expand Down
97 changes: 97 additions & 0 deletions pkg/sink/sink_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -310,6 +310,12 @@ func TestHandleEventWithInterceptors(t *testing.T) {
},
EventTypes: []string{"pull_request"},
},
}, {
CEL: &triggersv1.CELInterceptor{
Overlays: []triggersv1.CELOverlay{
{Key: "new", Expression: "body.repository.url"},
},
},
}},
}},
},
Expand Down Expand Up @@ -379,6 +385,97 @@ func TestHandleEventWithInterceptors(t *testing.T) {
}
}

func TestHandleEventPassesURLThrough(t *testing.T) {
eventBody := json.RawMessage(`{"head_commit": {"id": "testrevision"}, "repository": {"url": "testurl"}}`)
pipelineResource := pipelinev1alpha1.PipelineResource{
TypeMeta: metav1.TypeMeta{
APIVersion: "tekton.dev/v1alpha1",
Kind: "PipelineResource",
},
ObjectMeta: metav1.ObjectMeta{
Name: "my-pipelineresource",
Namespace: namespace,
},
Spec: pipelinev1alpha1.PipelineResourceSpec{
Type: pipelinev1alpha1.PipelineResourceTypeGit,
Params: []pipelinev1alpha1.ResourceParam{{
Name: "url",
Value: "$(tt.params.url)",
}},
},
}
pipelineResourceBytes, err := json.Marshal(pipelineResource)
if err != nil {
t.Fatalf("Error unmarshalling pipelineResource: %s", err)
}

tt := bldr.TriggerTemplate("tt", namespace,
bldr.TriggerTemplateSpec(
bldr.TriggerTemplateParam("url", "", ""),
bldr.TriggerResourceTemplate(runtime.RawExtension{Raw: pipelineResourceBytes}),
))
tb := bldr.TriggerBinding("tb", namespace,
bldr.TriggerBindingSpec(
bldr.TriggerBindingParam("url", "$(body.repository.url)"),
))

el := &triggersv1.EventListener{
ObjectMeta: metav1.ObjectMeta{
Name: "el",
Namespace: namespace,
},
Spec: triggersv1.EventListenerSpec{
Triggers: []triggersv1.EventListenerTrigger{{
Bindings: []*triggersv1.EventListenerBinding{{Name: "tb", Kind: "TriggerBinding"}},
Template: triggersv1.EventListenerTemplate{Name: "tt"},
Interceptors: []*triggersv1.EventInterceptor{{
CEL: &triggersv1.CELInterceptor{
Overlays: []triggersv1.CELOverlay{
{Key: "new", Expression: "body.repository.url"},
},
},
}},
}},
},
}
secret := &corev1.Secret{
ObjectMeta: metav1.ObjectMeta{
Name: "secret",
Namespace: namespace,
},
Data: map[string][]byte{
"secretKey": []byte("secret"),
},
}

resources := test.Resources{
TriggerBindings: []*triggersv1.TriggerBinding{tb},
TriggerTemplates: []*triggersv1.TriggerTemplate{tt},
EventListeners: []*triggersv1.EventListener{el},
Secrets: []*corev1.Secret{secret},
}
sink, _ := getSinkAssets(t, resources, el.Name, DefaultAuthOverride{})
ts := httptest.NewServer(http.HandlerFunc(sink.HandleEvent))
defer ts.Close()

req, err := http.NewRequest("POST", ts.URL, bytes.NewReader(eventBody))
if err != nil {
t.Fatalf("Error creating Post request: %s", err)
}
req.Header.Add("Content-Type", "application/json")
req.Header.Add("X-Github-Event", "pull_request")
// This was generated by using SHA1 and hmac from go stdlib on secret and payload.
// https://play.golang.org/p/8D2E-Yz3zWf for a sample.
// TODO(dibyom): Add helper method that does this instead of link above
req.Header.Add("X-Hub-Signature", "sha1=c0f3a2bbd1cdb062ba4f54b2a1cad3d171b7a129")

resp, err := http.DefaultClient.Do(req)
if err != nil {
t.Fatalf("Error sending Post request: %v", err)
}
checkSinkResponse(t, resp, el.Name)
}

// nameInterceptor is an HTTP server that reads a "Name" from the header, and
// writes the name in its body as {"name": "VALUE"}.
// It expects a request with the header "Name".
Expand Down

0 comments on commit d1eac79

Please sign in to comment.