package integration
import (
"encoding/json"
"net/http"
"strings"
"testing"
kapi "k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/unversioned"
"k8s.io/kubernetes/pkg/client/restclient"
"k8s.io/kubernetes/pkg/util/sets"
configapi "github.com/openshift/origin/pkg/cmd/server/api"
testutil "github.com/openshift/origin/test/util"
testserver "github.com/openshift/origin/test/util/server"
)
func TestRootAPIPaths(t *testing.T) {
testutil.RequireEtcd(t)
defer testutil.DumpEtcdOnFailure(t)
masterConfig, adminConfigFile, err := testserver.StartTestMaster()
if err != nil {
t.Fatalf("unexpected error starting test master: %v", err)
}
clientConfig, err := testutil.GetClusterAdminClientConfig(adminConfigFile)
if err != nil {
t.Fatalf("unexpected error getting cluster admin client config: %v", err)
}
transport, err := restclient.TransportFor(clientConfig)
if err != nil {
t.Fatalf("unexpected error getting transport for client config: %v", err)
}
rootRequest, err := http.NewRequest("GET", masterConfig.AssetConfig.MasterPublicURL+"/", nil)
rootRequest.Header.Set("Accept", "*/*")
rootResponse, err := transport.RoundTrip(rootRequest)
if err != nil {
t.Fatalf("unexpected error issuing GET to root path: %v", err)
}
var broadcastRootPaths unversioned.RootPaths
if err := json.NewDecoder(rootResponse.Body).Decode(&broadcastRootPaths); err != nil {
t.Fatalf("unexpected error decoding root path response: %v", err)
}
defer rootResponse.Body.Close()
// We need to make sure that any APILevels specified in the config are present in the RootPaths, and that
// any not specified are not
expectedOpenShiftAPILevels := sets.NewString(masterConfig.APILevels...)
expectedKubeAPILevels := sets.NewString(configapi.GetEnabledAPIVersionsForGroup(*masterConfig.KubernetesMasterConfig, kapi.GroupName)...)
actualOpenShiftAPILevels := sets.String{}
actualKubeAPILevels := sets.String{}
for _, route := range broadcastRootPaths.Paths {
if strings.HasPrefix(route, "/oapi/") {
actualOpenShiftAPILevels.Insert(route[6:])
}
if strings.HasPrefix(route, "/api/") {
actualKubeAPILevels.Insert(route[5:])
}
}
if !expectedOpenShiftAPILevels.Equal(actualOpenShiftAPILevels) {
t.Errorf("actual OpenShift API levels served don't match expected levels:\n\texpected:\n\t%s\n\tgot:\n\t%s", expectedOpenShiftAPILevels.List(), actualOpenShiftAPILevels.List())
}
if !expectedKubeAPILevels.Equal(actualKubeAPILevels) {
t.Errorf("actual Kube API levels served don't match expected levels:\n\texpected:\n\t%s\n\tgot:\n\t%s", expectedKubeAPILevels.List(), actualKubeAPILevels.List())
}
// Send a GET to every advertised address and check that we get the correct response
for _, route := range broadcastRootPaths.Paths {
req, err := http.NewRequest("GET", masterConfig.AssetConfig.MasterPublicURL+route, nil)
req.Header.Set("Accept", "*/*")
resp, err := transport.RoundTrip(req)
if err != nil {
t.Errorf("unexpected error issuing GET for path %q: %v", route, err)
continue
}
expectedCode := http.StatusOK
if resp.StatusCode != expectedCode {
t.Errorf("incorrect status code for %s endpoint: expected %d, got %d", route, expectedCode, resp.StatusCode)
}
}
}