Skip to content

Commit b00ccfe

Browse files
committed
WIP: integration test
Signed-off-by: Simo Sorce <[email protected]>
1 parent 18cca83 commit b00ccfe

File tree

1 file changed

+160
-0
lines changed

1 file changed

+160
-0
lines changed
Lines changed: 160 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,160 @@
1+
package integration
2+
3+
import (
4+
"io/ioutil"
5+
"net/http"
6+
"os"
7+
"strings"
8+
"testing"
9+
10+
restclient "k8s.io/client-go/rest"
11+
kclientcmd "k8s.io/client-go/tools/clientcmd"
12+
kclientcmdapi "k8s.io/client-go/tools/clientcmd/api"
13+
14+
configapi "github.com/openshift/origin/pkg/cmd/server/apis/config"
15+
"github.com/openshift/origin/pkg/oc/cli/cmd"
16+
userclient "github.com/openshift/origin/pkg/user/generated/internalclientset/typed/user/internalversion"
17+
testutil "github.com/openshift/origin/test/util"
18+
testserver "github.com/openshift/origin/test/util/server"
19+
)
20+
21+
func getWellknown(t *testing.T, masterConfig *configapi.MasterConfig, clusterAdminKubeConfig string) []byte {
22+
transport, err := anonymousHttpTransport(clusterAdminKubeConfig)
23+
if err != nil {
24+
t.Fatalf("unexpected error: %v", err)
25+
}
26+
27+
req, err := http.NewRequest("GET", masterConfig.OAuthConfig.MasterPublicURL+"/.well-known/oauth-authorization-server", nil)
28+
req.Header.Set("Accept", "*/*")
29+
resp, err := transport.RoundTrip(req)
30+
if err != nil {
31+
t.Fatalf("Unexpected error: %v", err)
32+
}
33+
if resp.StatusCode != http.StatusOK {
34+
t.Fatalf("Expected %d, got %d", http.StatusOK, resp.StatusCode)
35+
}
36+
body, err := ioutil.ReadAll(resp.Body)
37+
if err != nil {
38+
t.Fatalf("Unexpected error reading the body: %v", err)
39+
}
40+
if !strings.Contains(string(body), "authorization_endpoint") {
41+
t.Fatal("Expected \"authorization_endpoint\" in the body.")
42+
}
43+
44+
return body
45+
}
46+
47+
// TestWebhookTokenAuthn checks Tokens directly against an external
48+
// authenticator
49+
func TestExternalOAuthAuthn(t *testing.T) {
50+
authTestUser := "testuser"
51+
52+
// Start Oauth Cluster
53+
upstreamClusterMasterConfig, upstreamClusterAdminKubeConfig, err := testserver.StartTestMasterAPI()
54+
if err != nil {
55+
t.Fatalf("unexpected error: %v", err)
56+
}
57+
defer testserver.CleanupMasterEtcd(t, upstreamClusterMasterConfig)
58+
59+
// GET .wellknown oauth metadata
60+
oauthMetadataFile, err := ioutil.TempFile("", "metadata.config")
61+
if err != nil {
62+
t.Fatalf("unexpected error: %v", err)
63+
}
64+
defer os.Remove(oauthMetadataFile.Name())
65+
oauthMetadata := getWellknown(t, upstreamClusterMasterConfig, upstreamClusterAdminKubeConfig)
66+
if err != nil {
67+
t.Fatalf("unexpected error: %v", err)
68+
}
69+
oauthMetadataFile.Write(oauthMetadata)
70+
oauthMetadataFile.Sync()
71+
oauthMetadataFile.Close()
72+
73+
// Write cert we're going to use to verify auth server requests
74+
caFile, err := ioutil.TempFile("", "test.crt")
75+
if err != nil {
76+
t.Fatalf("unexpected error: %v", err)
77+
}
78+
defer os.Remove(caFile.Name())
79+
if err := ioutil.WriteFile(caFile.Name(), authLocalhostCert, os.FileMode(0600)); err != nil {
80+
t.Fatalf("unexpected error: %v", err)
81+
}
82+
83+
authConfigFile, err := ioutil.TempFile("", "test.cfg")
84+
if err != nil {
85+
t.Fatalf("unexpected error: %v", err)
86+
}
87+
defer os.Remove(authConfigFile.Name())
88+
authConfigObj := kclientcmdapi.Config{
89+
Clusters: map[string]*kclientcmdapi.Cluster{
90+
"authService": {
91+
CertificateAuthority: upstreamClusterMasterConfig.ServingInfo.ClientCA,
92+
Server: upstreamClusterMasterConfig.OAuthConfig.MasterPublicURL + "/authenticate",
93+
},
94+
},
95+
AuthInfos: map[string]*kclientcmdapi.AuthInfo{
96+
"apiServer": {
97+
ClientCertificate: upstreamClusterMasterConfig.ServingInfo.ServerCert.CertFile,
98+
ClientKey: upstreamClusterMasterConfig.ServingInfo.ServerCert.KeyFile,
99+
},
100+
},
101+
CurrentContext: "webhook",
102+
Contexts: map[string]*kclientcmdapi.Context{
103+
"webhook": {
104+
Cluster: "authService",
105+
AuthInfo: "apiServer",
106+
},
107+
},
108+
}
109+
if err := kclientcmd.WriteToFile(authConfigObj, authConfigFile.Name()); err != nil {
110+
t.Fatalf("unexpected error: %v", err)
111+
}
112+
113+
// Get master config
114+
masterOptions, err := testserver.DefaultMasterOptions()
115+
if err != nil {
116+
t.Fatalf("unexpected error: %v", err)
117+
}
118+
defer testserver.CleanupMasterEtcd(t, masterOptions)
119+
120+
masterOptions.AuthConfig.WebhookTokenAuthenticators = []configapi.WebhookTokenAuthenticator{
121+
{
122+
ConfigFile: authConfigFile.Name(),
123+
CacheTTL: "10s",
124+
},
125+
}
126+
masterOptions.OAuthConfig = nil
127+
masterOptions.ExternalOAuthConfig = &configapi.ExternalOAuthConfig{
128+
MetadataFile: oauthMetadataFile.Name(),
129+
MasterPublicURL: masterOptions.MasterPublicURL,
130+
AssetPublicURL: masterOptions.MasterPublicURL + "/console/",
131+
}
132+
133+
// Start server
134+
clusterAdminKubeConfig, err := testserver.StartConfiguredMaster(masterOptions)
135+
if err != nil {
136+
t.Fatalf("unexpected error: %v", err)
137+
}
138+
139+
clientConfig, err := testutil.GetClusterAdminClientConfig(clusterAdminKubeConfig)
140+
if err != nil {
141+
t.Fatalf("unexpected error: %v", err)
142+
}
143+
144+
// Try to authenticate with a token that can be validated only by our
145+
// external token reviewer
146+
userConfig := restclient.AnonymousClientConfig(clientConfig)
147+
148+
userClient, err := userclient.NewForConfig(userConfig)
149+
if err != nil {
150+
t.Fatalf("unexpected error: %v", err)
151+
}
152+
userWhoamiOptions := cmd.WhoAmIOptions{UserInterface: userClient.Users(), Out: ioutil.Discard}
153+
retrievedUser, err := userWhoamiOptions.WhoAmI()
154+
if err != nil {
155+
t.Fatalf("unexpected error: %v", err)
156+
}
157+
if retrievedUser.Name != authTestUser {
158+
t.Errorf("expected username %v, got %v", authTestUser, retrievedUser.Name)
159+
}
160+
}

0 commit comments

Comments
 (0)