Skip to content

Commit 147f315

Browse files
authored
improve testing library and jwks rotation logs, and cut release (#74)
1 parent 51dabac commit 147f315

File tree

3 files changed

+34
-49
lines changed

3 files changed

+34
-49
lines changed

cmd/server.go

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -218,22 +218,24 @@ func newServerCommand() *cobra.Command {
218218

219219
// start jwks rotation
220220
if rotateJWKS {
221+
l := l.WithField("jwks_rotation", logrus.Fields{
222+
"period": rotateJWKSPeriod.String(),
223+
"gcs_bucket": rotateJWKSBucket,
224+
"gcs_object_key": filepath.Join(rotateJWKSKeyPrefix, jwksURI),
225+
})
226+
221227
// perform first rotation before starting server as a validation for
222228
// for preventing the program from starting in an invalid state
223229
publish := func() error {
224230
return publishDocument(ctx, kubeClient, storageClient, rotateJWKSBucket, rotateJWKSKeyPrefix, jwksURI, io.Discard)
225231
}
226-
l := l.WithField("jwks_rotation", logrus.Fields{
227-
"period": rotateJWKSPeriod.String(),
228-
"bucket": rotateJWKSBucket,
229-
"object_key": filepath.Join(rotateJWKSKeyPrefix, jwksURI),
230-
})
232+
l.Info("rotating jwks...")
231233
if err := publish(); err != nil {
232234
return fmt.Errorf("error rotating jwks: %w", err)
233235
}
234-
235-
// setup observability
236236
l.Info("jwks rotated")
237+
238+
// create an error counter
237239
errorsCounter := prometheus.NewCounter(prometheus.CounterOpts{
238240
Namespace: metrics.Namespace,
239241
Subsystem: metricsSubsystem,

helm/gke-metadata-server/Chart.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,10 @@ type: application
3030
# This is the chart version. This version number should be incremented each time you make changes
3131
# to the chart and its templates, including the app version.
3232
# Versions are expected to follow Semantic Versioning (https://semver.org/)
33-
version: 0.3.1
33+
version: 0.3.2
3434

3535
# This is the version number of the application being deployed. This version number should be
3636
# incremented each time you make changes to the application. Versions are not expected to
3737
# follow Semantic Versioning. They should reflect the version the application is using.
3838
# It is recommended to use it with quotes.
39-
appVersion: "0.3.1"
39+
appVersion: "0.3.2"

internal/testing/testing.go

Lines changed: 23 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ import (
2626
"context"
2727
"encoding/json"
2828
"errors"
29-
"fmt"
3029
"io"
3130
"net/http"
3231
"os"
@@ -40,22 +39,17 @@ import (
4039
)
4140

4241
func RequestJSON(t *testing.T, headers http.Header, url, name, expectedMetadataFlavor string, obj any) {
42+
t.Helper()
4343
body := requestURL(t, headers, url, name, "application/json", expectedMetadataFlavor)
44-
defer body.Close()
45-
if err := json.NewDecoder(body).Decode(obj); err != nil {
46-
t.Fatalf("error decoding %s response body as json: %v", name, err)
44+
if err := json.Unmarshal([]byte(body), obj); err != nil {
45+
t.Fatalf("error unmarshaling %s response body as json: %v", name, err)
4746
}
4847
}
4948

5049
func RequestIDToken(t *testing.T, headers http.Header, url, name, expectedMetadataFlavor string,
5150
expectedAudience, expectedIssuer, expectedSubject string) string {
52-
body := requestURL(t, headers, url, name, "application/text", expectedMetadataFlavor)
53-
defer body.Close()
54-
b, err := io.ReadAll(body)
55-
if err != nil {
56-
t.Fatalf("error reading %s response body as text: %v", name, err)
57-
}
58-
rawToken := string(b)
51+
t.Helper()
52+
rawToken := requestURL(t, headers, url, name, "application/text", expectedMetadataFlavor)
5953
token, _, err := jwt.NewParser().ParseUnverified(rawToken, jwt.MapClaims{})
6054
if err != nil {
6155
t.Fatalf("error parsing %s response body as jwt: %v", name, err)
@@ -89,35 +83,17 @@ func RequestIDToken(t *testing.T, headers http.Header, url, name, expectedMetada
8983
}
9084

9185
func RequestText(t *testing.T, headers http.Header, url, name string) string {
92-
body := requestURL(t, headers, url, name, "text/plain", "")
93-
defer body.Close()
94-
b, err := io.ReadAll(body)
95-
if err != nil {
96-
t.Fatalf("error reading %s response body as text: %v", name, err)
97-
}
98-
return string(b)
86+
t.Helper()
87+
return requestURL(t, headers, url, name, "text/plain", "")
9988
}
10089

10190
func requestURL(t *testing.T, headers http.Header, url, name, expectedContentType,
102-
expectedMetadataFlavor string) io.ReadCloser {
103-
for i := 0; ; i++ {
104-
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
105-
defer cancel()
106-
readCloser, err := doRequestURL(ctx, headers, url, name, expectedContentType, expectedMetadataFlavor)
107-
if err == nil {
108-
return readCloser
109-
}
110-
if !errors.Is(err, context.Canceled) || i == 3 {
111-
t.Fatal(err.Error())
112-
}
113-
}
114-
}
115-
116-
func doRequestURL(ctx context.Context, headers http.Header, url, name, expectedContentType,
117-
expectedMetadataFlavor string) (io.ReadCloser, error) {
91+
expectedMetadataFlavor string) string {
92+
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
93+
defer cancel()
11894
req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil)
11995
if err != nil {
120-
return nil, fmt.Errorf("error creating %s request: %w", name, err)
96+
t.Fatalf("error creating %s request: %v", name, err)
12197
}
12298
for k, v := range headers {
12399
for i := range v {
@@ -126,33 +102,39 @@ func doRequestURL(ctx context.Context, headers http.Header, url, name, expectedC
126102
}
127103
resp, err := http.DefaultClient.Do(req)
128104
if err != nil {
129-
return nil, fmt.Errorf("error requesting %s: %w", name, err)
105+
t.Fatalf("error requesting %s: %v", name, err)
130106
}
107+
defer resp.Body.Close()
131108
getErr := func() error {
132109
defer resp.Body.Close()
133110
b, readErr := io.ReadAll(resp.Body)
134111
err := errors.New(string(b))
135112
return errors.Join(err, readErr)
136113
}
137114
if c := resp.StatusCode; c != 200 {
138-
return nil, fmt.Errorf("non-200 status code %v for %s. error(s): %w", c, name, getErr())
115+
t.Fatalf("non-200 status code %v for %s. error(s): %v", c, name, getErr())
139116
}
140117
if ct := resp.Header.Get("Content-Type"); ct != expectedContentType {
141-
return nil, fmt.Errorf("unexpected content type %s for %s (was expecting %s). error(s): %w",
118+
t.Fatalf("unexpected content type %s for %s (was expecting %s). error(s): %v",
142119
ct, name, expectedContentType, getErr())
143120
}
144121
if mf := resp.Header.Get("Metadata-Flavor"); mf != expectedMetadataFlavor {
145-
return nil, fmt.Errorf("unexpected metadata flavor %s for %s (was expecting '%s'). error(s): %w",
122+
t.Fatalf("unexpected metadata flavor %s for %s (was expecting '%s'). error(s): %v",
146123
mf, name, expectedMetadataFlavor, getErr())
147124
}
148-
return resp.Body, nil
125+
b, err := io.ReadAll(resp.Body)
126+
if err != nil {
127+
t.Fatalf("error reading %s response: %v", name, err)
128+
}
129+
return string(b)
149130
}
150131

151132
func EvalEnv(s string) string {
152133
return strings.ReplaceAll(s, "TEST_ID", os.Getenv("TEST_ID"))
153134
}
154135

155136
func CheckRegex(t *testing.T, name, pattern, value string) {
137+
t.Helper()
156138
pattern = "^" + EvalEnv(pattern) + "$"
157139
re, err := regexp.Compile(pattern)
158140
if err != nil {
@@ -165,6 +147,7 @@ func CheckRegex(t *testing.T, name, pattern, value string) {
165147
}
166148

167149
func AssertExpirationSeconds(t *testing.T, secs int) {
150+
t.Helper()
168151
assert.LessOrEqual(t, 3500, secs)
169152
assert.LessOrEqual(t, secs, 3600)
170153
}

0 commit comments

Comments
 (0)