Skip to content

Commit 70c0232

Browse files
Merge pull request #121 from staebler/cincy-query-params
pkg/cincinnati: add required parameters to requests
2 parents 93d4eff + 06c7f80 commit 70c0232

File tree

3 files changed

+262
-72
lines changed

3 files changed

+262
-72
lines changed

pkg/cincinnati/cincinnati.go

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"fmt"
66
"io/ioutil"
77
"net/http"
8+
"net/url"
89

910
"github.com/blang/semver"
1011
"github.com/google/uuid"
@@ -38,8 +39,19 @@ type Update node
3839
// the current version and their payloads indicate from where the actual update
3940
// image can be downloaded.
4041
func (c Client) GetUpdates(upstream string, channel string, version semver.Version) ([]Update, error) {
42+
// Prepare parametrized cincinnati query.
43+
cincinnatiURL, err := url.Parse(upstream)
44+
if err != nil {
45+
return nil, fmt.Errorf("failed to parse upstream URL: %s", err)
46+
}
47+
queryParams := cincinnatiURL.Query()
48+
queryParams.Add("channel", channel)
49+
queryParams.Add("id", c.id.String())
50+
queryParams.Add("version", version.String())
51+
cincinnatiURL.RawQuery = queryParams.Encode()
52+
4153
// Download the update graph.
42-
req, err := http.NewRequest("GET", upstream, nil)
54+
req, err := http.NewRequest("GET", cincinnatiURL.String(), nil)
4355
if err != nil {
4456
return nil, err
4557
}

pkg/cincinnati/cincinnati_test.go

Lines changed: 108 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"fmt"
66
"net/http"
77
"net/http/httptest"
8+
"net/url"
89
"reflect"
910
"testing"
1011

@@ -14,97 +15,115 @@ import (
1415
)
1516

1617
func TestGetUpdates(t *testing.T) {
17-
handler := func(w http.ResponseWriter, r *http.Request) {
18-
if r.Method != http.MethodGet && r.Method != http.MethodHead {
19-
w.WriteHeader(http.StatusMethodNotAllowed)
20-
return
21-
}
22-
23-
mtype := r.Header.Get("Accept")
24-
if mtype != GraphMediaType {
25-
w.WriteHeader(http.StatusUnsupportedMediaType)
26-
return
27-
}
28-
29-
_, err := w.Write([]byte(`{
30-
"nodes": [
31-
{
32-
"version": "4.0.0-4",
33-
"payload": "quay.io/openshift-release-dev/ocp-release:4.0.0-4",
34-
"metadata": {}
35-
},
36-
{
37-
"version": "4.0.0-5",
38-
"payload": "quay.io/openshift-release-dev/ocp-release:4.0.0-5",
39-
"metadata": {}
40-
},
41-
{
42-
"version": "4.0.0-6",
43-
"payload": "quay.io/openshift-release-dev/ocp-release:4.0.0-6",
44-
"metadata": {}
45-
},
46-
{
47-
"version": "4.0.0-6+2",
48-
"payload": "quay.io/openshift-release-dev/ocp-release:4.0.0-6+2",
49-
"metadata": {}
50-
},
51-
{
52-
"version": "4.0.0-0.okd-0",
53-
"payload": "quay.io/openshift-release-dev/ocp-release:4.0.0-0.okd-0",
54-
"metadata": {}
55-
},
56-
{
57-
"version": "4.0.0-0.2",
58-
"payload": "quay.io/openshift-release-dev/ocp-release:4.0.0-0.2",
59-
"metadata": {}
60-
},
61-
{
62-
"version": "4.0.0-0.3",
63-
"payload": "quay.io/openshift-release-dev/ocp-release:4.0.0-0.3",
64-
"metadata": {}
65-
}
66-
],
67-
"edges": [[0,1],[1,2],[1,3],[5,6]]
68-
}`))
69-
if err != nil {
70-
w.WriteHeader(http.StatusInternalServerError)
71-
return
72-
}
73-
}
74-
18+
clientID := uuid.Must(uuid.Parse("01234567-0123-0123-0123-0123456789ab"))
19+
channelName := "test-channel"
7520
tests := []struct {
7621
name string
7722
version string
7823

79-
available []Update
80-
err string
24+
expectedQuery string
25+
available []Update
26+
err string
8127
}{{
82-
name: "one update available",
83-
version: "4.0.0-4",
28+
name: "one update available",
29+
version: "4.0.0-4",
30+
expectedQuery: "channel=test-channel&id=01234567-0123-0123-0123-0123456789ab&version=4.0.0-4",
8431
available: []Update{
8532
{semver.MustParse("4.0.0-5"), "quay.io/openshift-release-dev/ocp-release:4.0.0-5"},
8633
},
8734
}, {
88-
name: "two updates available",
89-
version: "4.0.0-5",
35+
name: "two updates available",
36+
version: "4.0.0-5",
37+
expectedQuery: "channel=test-channel&id=01234567-0123-0123-0123-0123456789ab&version=4.0.0-5",
9038
available: []Update{
9139
{semver.MustParse("4.0.0-6"), "quay.io/openshift-release-dev/ocp-release:4.0.0-6"},
9240
{semver.MustParse("4.0.0-6+2"), "quay.io/openshift-release-dev/ocp-release:4.0.0-6+2"},
9341
},
9442
}, {
95-
name: "no updates available",
96-
version: "4.0.0-0.okd-0",
43+
name: "no updates available",
44+
version: "4.0.0-0.okd-0",
45+
expectedQuery: "channel=test-channel&id=01234567-0123-0123-0123-0123456789ab&version=4.0.0-0.okd-0",
9746
}, {
98-
name: "unknown version",
99-
version: "4.0.0-3",
100-
err: "unknown version 4.0.0-3",
47+
name: "unknown version",
48+
version: "4.0.0-3",
49+
expectedQuery: "channel=test-channel&id=01234567-0123-0123-0123-0123456789ab&version=4.0.0-3",
50+
err: "unknown version 4.0.0-3",
10151
}}
10252
for _, test := range tests {
10353
t.Run(test.name, func(t *testing.T) {
54+
requestQuery := make(chan string, 1)
55+
defer close(requestQuery)
56+
57+
handler := func(w http.ResponseWriter, r *http.Request) {
58+
select {
59+
case requestQuery <- r.URL.RawQuery:
60+
default:
61+
t.Fatalf("received multiple requests at upstream URL")
62+
}
63+
64+
if r.Method != http.MethodGet && r.Method != http.MethodHead {
65+
w.WriteHeader(http.StatusMethodNotAllowed)
66+
return
67+
}
68+
69+
mtype := r.Header.Get("Accept")
70+
if mtype != GraphMediaType {
71+
w.WriteHeader(http.StatusUnsupportedMediaType)
72+
return
73+
}
74+
75+
_, err := w.Write([]byte(`{
76+
"nodes": [
77+
{
78+
"version": "4.0.0-4",
79+
"payload": "quay.io/openshift-release-dev/ocp-release:4.0.0-4",
80+
"metadata": {}
81+
},
82+
{
83+
"version": "4.0.0-5",
84+
"payload": "quay.io/openshift-release-dev/ocp-release:4.0.0-5",
85+
"metadata": {}
86+
},
87+
{
88+
"version": "4.0.0-6",
89+
"payload": "quay.io/openshift-release-dev/ocp-release:4.0.0-6",
90+
"metadata": {}
91+
},
92+
{
93+
"version": "4.0.0-6+2",
94+
"payload": "quay.io/openshift-release-dev/ocp-release:4.0.0-6+2",
95+
"metadata": {}
96+
},
97+
{
98+
"version": "4.0.0-0.okd-0",
99+
"payload": "quay.io/openshift-release-dev/ocp-release:4.0.0-0.okd-0",
100+
"metadata": {}
101+
},
102+
{
103+
"version": "4.0.0-0.2",
104+
"payload": "quay.io/openshift-release-dev/ocp-release:4.0.0-0.2",
105+
"metadata": {}
106+
},
107+
{
108+
"version": "4.0.0-0.3",
109+
"payload": "quay.io/openshift-release-dev/ocp-release:4.0.0-0.3",
110+
"metadata": {}
111+
}
112+
],
113+
"edges": [[0,1],[1,2],[1,3],[5,6]]
114+
}`))
115+
if err != nil {
116+
w.WriteHeader(http.StatusInternalServerError)
117+
return
118+
}
119+
}
120+
104121
ts := httptest.NewServer(http.HandlerFunc(handler))
105-
c := NewClient(uuid.New())
122+
defer ts.Close()
106123

107-
updates, err := c.GetUpdates(ts.URL, "", semver.MustParse(test.version))
124+
c := NewClient(clientID)
125+
126+
updates, err := c.GetUpdates(ts.URL, channelName, semver.MustParse(test.version))
108127
if test.err == "" {
109128
if err != nil {
110129
t.Fatalf("expected nil error, got: %v", err)
@@ -117,6 +136,24 @@ func TestGetUpdates(t *testing.T) {
117136
t.Fatalf("expected err to be %s, got: %v", test.err, err)
118137
}
119138
}
139+
140+
actualQuery := ""
141+
select {
142+
case actualQuery = <-requestQuery:
143+
default:
144+
t.Fatal("no request received at upstream URL")
145+
}
146+
expectedQueryValues, err := url.ParseQuery(test.expectedQuery)
147+
if err != nil {
148+
t.Fatalf("could not parse expected query: %v", err)
149+
}
150+
actualQueryValues, err := url.ParseQuery(actualQuery)
151+
if err != nil {
152+
t.Fatalf("could not parse acutal query: %v", err)
153+
}
154+
if e, a := expectedQueryValues, actualQueryValues; !reflect.DeepEqual(e, a) {
155+
t.Errorf("expected query to be %q, got: %q", e, a)
156+
}
120157
})
121158
}
122159
}

0 commit comments

Comments
 (0)