Skip to content

Commit 3127b77

Browse files
richardcasek8s-infra-cherrypick-robot
authored and
k8s-infra-cherrypick-robot
committed
fix: fix oidc test failure
This updates the oidc test to fix the cert thumbprints from the server as these change with every go version when using httptest.NewTLSServer. Signed-off-by: Richard Case <[email protected]>
1 parent e2dffa3 commit 3127b77

File tree

2 files changed

+108
-7
lines changed

2 files changed

+108
-7
lines changed

pkg/cloud/services/eks/oidc_test.go

Lines changed: 46 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,11 @@ limitations under the License.
1717
package eks
1818

1919
import (
20+
"crypto/sha1"
21+
"crypto/tls"
22+
"crypto/x509"
23+
"encoding/hex"
24+
"encoding/pem"
2025
"net/http"
2126
"net/http/httptest"
2227
"testing"
@@ -35,10 +40,13 @@ import (
3540
ekscontrolplanev1 "sigs.k8s.io/cluster-api-provider-aws/v2/controlplane/eks/api/v1beta2"
3641
"sigs.k8s.io/cluster-api-provider-aws/v2/pkg/cloud/scope"
3742
"sigs.k8s.io/cluster-api-provider-aws/v2/pkg/cloud/services/iamauth/mock_iamauth"
43+
"sigs.k8s.io/cluster-api-provider-aws/v2/pkg/internal/testcert"
3844
clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1"
3945
)
4046

4147
func TestOIDCReconcile(t *testing.T) {
48+
testCertThumbprint := getTestcertTumbprint(t)
49+
4250
tests := []struct {
4351
name string
4452
expect func(m *mock_iamauth.MockIAMAPIMockRecorder, url string)
@@ -64,7 +72,7 @@ func TestOIDCReconcile(t *testing.T) {
6472
}, nil)
6573
m.CreateOpenIDConnectProvider(&iam.CreateOpenIDConnectProviderInput{
6674
ClientIDList: aws.StringSlice([]string{"sts.amazonaws.com"}),
67-
ThumbprintList: aws.StringSlice([]string{"15dbd260c7465ecca6de2c0b2181187f66ee0d1a"}),
75+
ThumbprintList: aws.StringSlice([]string{testCertThumbprint}),
6876
Url: &url,
6977
}).Return(&iam.CreateOpenIDConnectProviderOutput{
7078
OpenIDConnectProviderArn: aws.String("arn::oidc"),
@@ -102,7 +110,7 @@ func TestOIDCReconcile(t *testing.T) {
102110
OpenIDConnectProviderArn: aws.String("arn::oidc"),
103111
}).Return(&iam.GetOpenIDConnectProviderOutput{
104112
ClientIDList: aws.StringSlice([]string{"sts.amazonaws.com"}),
105-
ThumbprintList: aws.StringSlice([]string{"15dbd260c7465ecca6de2c0b2181187f66ee0d1a"}),
113+
ThumbprintList: aws.StringSlice([]string{testCertThumbprint}),
106114
Url: &url,
107115
}, nil)
108116
m.TagOpenIDConnectProvider(&iam.TagOpenIDConnectProviderInput{
@@ -125,11 +133,7 @@ func TestOIDCReconcile(t *testing.T) {
125133
_ = ekscontrolplanev1.AddToScheme(scheme)
126134
_ = corev1.AddToScheme(scheme)
127135

128-
ts := httptest.NewTLSServer(http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) {
129-
// Send response to be tested
130-
rw.WriteHeader(http.StatusOK)
131-
rw.Write([]byte(`OK`))
132-
}))
136+
ts := createTestServer(g)
133137
defer ts.Close()
134138

135139
controlPlane := &ekscontrolplanev1.AWSManagedControlPlane{
@@ -178,6 +182,41 @@ func TestOIDCReconcile(t *testing.T) {
178182
}
179183
}
180184

185+
func getTestcertTumbprint(t *testing.T) string {
186+
t.Helper()
187+
g := NewWithT(t)
188+
189+
block, _ := pem.Decode(testcert.LocalhostCert)
190+
g.Expect(block).ToNot(BeNil(), "failed to parse certificate PEM")
191+
192+
x509Cert, err := x509.ParseCertificate(block.Bytes)
193+
g.Expect(err).NotTo(HaveOccurred())
194+
195+
hash := sha1.Sum(x509Cert.Raw) //nolint:gosec
196+
return hex.EncodeToString(hash[:])
197+
}
198+
199+
func createTestServer(g *GomegaWithT) *httptest.Server {
200+
// Create a certificate and private key
201+
cert, err := tls.X509KeyPair(testcert.LocalhostCert, testcert.LocalhostKey)
202+
g.Expect(err).NotTo(HaveOccurred())
203+
204+
// Create custom TLS config
205+
tlsConfig := &tls.Config{ //nolint:gosec
206+
Certificates: []tls.Certificate{cert},
207+
}
208+
209+
// Create test server with custom TLS config
210+
server := httptest.NewUnstartedServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
211+
w.WriteHeader(http.StatusOK)
212+
w.Write([]byte(`OK`))
213+
}))
214+
server.TLS = tlsConfig
215+
server.StartTLS()
216+
217+
return server
218+
}
219+
181220
var kubeConfig = []byte(`apiVersion: v1
182221
clusters:
183222
- cluster:

pkg/internal/testcert/testcert.go

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
// Package testcert contains a test-only localhost certificate.
2+
// NOTE: this is based on the code from the Go stdlib.
3+
package testcert
4+
5+
import "strings"
6+
7+
// LocalhostCert is a PEM-encoded TLS cert with SAN IPs
8+
// "127.0.0.1" and "[::1]", expiring at Jan 29 16:00:00 2084 GMT.
9+
// generated from src/crypto/tls:
10+
// go run generate_cert.go --rsa-bits 2048 --host 127.0.0.1,::1,example.com --ca --start-date "Jan 1 00:00:00 1970" --duration=1000000h.
11+
var LocalhostCert = []byte(`-----BEGIN CERTIFICATE-----
12+
MIIDOTCCAiGgAwIBAgIQSRJrEpBGFc7tNb1fb5pKFzANBgkqhkiG9w0BAQsFADAS
13+
MRAwDgYDVQQKEwdBY21lIENvMCAXDTcwMDEwMTAwMDAwMFoYDzIwODQwMTI5MTYw
14+
MDAwWjASMRAwDgYDVQQKEwdBY21lIENvMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
15+
MIIBCgKCAQEA6Gba5tHV1dAKouAaXO3/ebDUU4rvwCUg/CNaJ2PT5xLD4N1Vcb8r
16+
bFSW2HXKq+MPfVdwIKR/1DczEoAGf/JWQTW7EgzlXrCd3rlajEX2D73faWJekD0U
17+
aUgz5vtrTXZ90BQL7WvRICd7FlEZ6FPOcPlumiyNmzUqtwGhO+9ad1W5BqJaRI6P
18+
YfouNkwR6Na4TzSj5BrqUfP0FwDizKSJ0XXmh8g8G9mtwxOSN3Ru1QFc61Xyeluk
19+
POGKBV/q6RBNklTNe0gI8usUMlYyoC7ytppNMW7X2vodAelSu25jgx2anj9fDVZu
20+
h7AXF5+4nJS4AAt0n1lNY7nGSsdZas8PbQIDAQABo4GIMIGFMA4GA1UdDwEB/wQE
21+
AwICpDATBgNVHSUEDDAKBggrBgEFBQcDATAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud
22+
DgQWBBStsdjh3/JCXXYlQryOrL4Sh7BW5TAuBgNVHREEJzAlggtleGFtcGxlLmNv
23+
bYcEfwAAAYcQAAAAAAAAAAAAAAAAAAAAATANBgkqhkiG9w0BAQsFAAOCAQEAxWGI
24+
5NhpF3nwwy/4yB4i/CwwSpLrWUa70NyhvprUBC50PxiXav1TeDzwzLx/o5HyNwsv
25+
cxv3HdkLW59i/0SlJSrNnWdfZ19oTcS+6PtLoVyISgtyN6DpkKpdG1cOkW3Cy2P2
26+
+tK/tKHRP1Y/Ra0RiDpOAmqn0gCOFGz8+lqDIor/T7MTpibL3IxqWfPrvfVRHL3B
27+
grw/ZQTTIVjjh4JBSW3WyWgNo/ikC1lrVxzl4iPUGptxT36Cr7Zk2Bsg0XqwbOvK
28+
5d+NTDREkSnUbie4GeutujmX3Dsx88UiV6UY/4lHJa6I5leHUNOHahRbpbWeOfs/
29+
WkBKOclmOV2xlTVuPw==
30+
-----END CERTIFICATE-----`)
31+
32+
// LocalhostKey is the private key for LocalhostCert.
33+
var LocalhostKey = []byte(testingKey(`-----BEGIN RSA TESTING KEY-----
34+
MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQDoZtrm0dXV0Aqi
35+
4Bpc7f95sNRTiu/AJSD8I1onY9PnEsPg3VVxvytsVJbYdcqr4w99V3AgpH/UNzMS
36+
gAZ/8lZBNbsSDOVesJ3euVqMRfYPvd9pYl6QPRRpSDPm+2tNdn3QFAvta9EgJ3sW
37+
URnoU85w+W6aLI2bNSq3AaE771p3VbkGolpEjo9h+i42TBHo1rhPNKPkGupR8/QX
38+
AOLMpInRdeaHyDwb2a3DE5I3dG7VAVzrVfJ6W6Q84YoFX+rpEE2SVM17SAjy6xQy
39+
VjKgLvK2mk0xbtfa+h0B6VK7bmODHZqeP18NVm6HsBcXn7iclLgAC3SfWU1jucZK
40+
x1lqzw9tAgMBAAECggEABWzxS1Y2wckblnXY57Z+sl6YdmLV+gxj2r8Qib7g4ZIk
41+
lIlWR1OJNfw7kU4eryib4fc6nOh6O4AWZyYqAK6tqNQSS/eVG0LQTLTTEldHyVJL
42+
dvBe+MsUQOj4nTndZW+QvFzbcm2D8lY5n2nBSxU5ypVoKZ1EqQzytFcLZpTN7d89
43+
EPj0qDyrV4NZlWAwL1AygCwnlwhMQjXEalVF1ylXwU3QzyZ/6MgvF6d3SSUlh+sq
44+
XefuyigXw484cQQgbzopv6niMOmGP3of+yV4JQqUSb3IDmmT68XjGd2Dkxl4iPki
45+
6ZwXf3CCi+c+i/zVEcufgZ3SLf8D99kUGE7v7fZ6AQKBgQD1ZX3RAla9hIhxCf+O
46+
3D+I1j2LMrdjAh0ZKKqwMR4JnHX3mjQI6LwqIctPWTU8wYFECSh9klEclSdCa64s
47+
uI/GNpcqPXejd0cAAdqHEEeG5sHMDt0oFSurL4lyud0GtZvwlzLuwEweuDtvT9cJ
48+
Wfvl86uyO36IW8JdvUprYDctrQKBgQDycZ697qutBieZlGkHpnYWUAeImVA878sJ
49+
w44NuXHvMxBPz+lbJGAg8Cn8fcxNAPqHIraK+kx3po8cZGQywKHUWsxi23ozHoxo
50+
+bGqeQb9U661TnfdDspIXia+xilZt3mm5BPzOUuRqlh4Y9SOBpSWRmEhyw76w4ZP
51+
OPxjWYAgwQKBgA/FehSYxeJgRjSdo+MWnK66tjHgDJE8bYpUZsP0JC4R9DL5oiaA
52+
brd2fI6Y+SbyeNBallObt8LSgzdtnEAbjIH8uDJqyOmknNePRvAvR6mP4xyuR+Bv
53+
m+Lgp0DMWTw5J9CKpydZDItc49T/mJ5tPhdFVd+am0NAQnmr1MCZ6nHxAoGABS3Y
54+
LkaC9FdFUUqSU8+Chkd/YbOkuyiENdkvl6t2e52jo5DVc1T7mLiIrRQi4SI8N9bN
55+
/3oJWCT+uaSLX2ouCtNFunblzWHBrhxnZzTeqVq4SLc8aESAnbslKL4i8/+vYZlN
56+
s8xtiNcSvL+lMsOBORSXzpj/4Ot8WwTkn1qyGgECgYBKNTypzAHeLE6yVadFp3nQ
57+
Ckq9yzvP/ib05rvgbvrne00YeOxqJ9gtTrzgh7koqJyX1L4NwdkEza4ilDWpucn0
58+
xiUZS4SoaJq6ZvcBYS62Yr1t8n09iG47YL8ibgtmH3L+svaotvpVxVK+d7BLevA/
59+
ZboOWVe3icTy64BT3OQhmg==
60+
-----END RSA TESTING KEY-----`))
61+
62+
func testingKey(s string) string { return strings.ReplaceAll(s, "TESTING KEY", "PRIVATE KEY") }

0 commit comments

Comments
 (0)