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 3d82e5c commit 8c439b6
Show file tree
Hide file tree
Showing 2 changed files with 95 additions and 1 deletion.
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
94 changes: 93 additions & 1 deletion pkg/sink/sink_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -310,9 +310,10 @@ func TestHandleEventWithInterceptors(t *testing.T) {
},
EventTypes: []string{"pull_request"},
},
}, {
CEL: &triggersv1.CELInterceptor{
Overlays: []triggersv1.CELOverlay{
{Key: "new", Expression: "body.value"},
{Key: "new", Expression: "body.repository.url"},
},
},
}},
Expand Down Expand Up @@ -384,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 8c439b6

Please sign in to comment.