Merge pull request #56328 from sttts/sttts-openapi-aggregation-integration-test
Automatic merge from submit-queue (batch tested with PRs 56217, 56268, 56263, 56328, 56200). If you want to cherry-pick this change to another branch, please follow the instructions <a href="https://github.com/kubernetes/community/blob/master/contributors/devel/cherry-picks.md">here</a>. kube-apiserver: integration test to smoke test OpenAPI aggregation Replaces https://github.com/kubernetes/kubernetes/pull/51715. This is mostly https://github.com/kubernetes/kubernetes/pull/51715, but rebased to current master.
This commit is contained in:
		@@ -29,6 +29,7 @@ go_test(
 | 
				
			|||||||
        "//vendor/k8s.io/api/apps/v1beta1:go_default_library",
 | 
					        "//vendor/k8s.io/api/apps/v1beta1:go_default_library",
 | 
				
			||||||
        "//vendor/k8s.io/api/core/v1:go_default_library",
 | 
					        "//vendor/k8s.io/api/core/v1:go_default_library",
 | 
				
			||||||
        "//vendor/k8s.io/api/networking/v1:go_default_library",
 | 
					        "//vendor/k8s.io/api/networking/v1:go_default_library",
 | 
				
			||||||
 | 
					        "//vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions:go_default_library",
 | 
				
			||||||
        "//vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1:go_default_library",
 | 
					        "//vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1:go_default_library",
 | 
				
			||||||
        "//vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset:go_default_library",
 | 
					        "//vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset:go_default_library",
 | 
				
			||||||
        "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library",
 | 
					        "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library",
 | 
				
			||||||
@@ -49,6 +50,7 @@ go_test(
 | 
				
			|||||||
        "//vendor/k8s.io/client-go/kubernetes:go_default_library",
 | 
					        "//vendor/k8s.io/client-go/kubernetes:go_default_library",
 | 
				
			||||||
        "//vendor/k8s.io/client-go/kubernetes/typed/core/v1:go_default_library",
 | 
					        "//vendor/k8s.io/client-go/kubernetes/typed/core/v1:go_default_library",
 | 
				
			||||||
        "//vendor/k8s.io/client-go/rest:go_default_library",
 | 
					        "//vendor/k8s.io/client-go/rest:go_default_library",
 | 
				
			||||||
 | 
					        "//vendor/k8s.io/kube-aggregator/pkg/apis/apiregistration:go_default_library",
 | 
				
			||||||
    ],
 | 
					    ],
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -17,21 +17,25 @@ limitations under the License.
 | 
				
			|||||||
package master
 | 
					package master
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
 | 
						"encoding/json"
 | 
				
			||||||
 | 
						"strings"
 | 
				
			||||||
	"testing"
 | 
						"testing"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	appsv1beta1 "k8s.io/api/apps/v1beta1"
 | 
						appsv1beta1 "k8s.io/api/apps/v1beta1"
 | 
				
			||||||
	corev1 "k8s.io/api/core/v1"
 | 
						corev1 "k8s.io/api/core/v1"
 | 
				
			||||||
 | 
						"k8s.io/apiextensions-apiserver/pkg/apis/apiextensions"
 | 
				
			||||||
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 | 
						metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 | 
				
			||||||
	"k8s.io/client-go/kubernetes"
 | 
						"k8s.io/client-go/kubernetes"
 | 
				
			||||||
 | 
						"k8s.io/kube-aggregator/pkg/apis/apiregistration"
 | 
				
			||||||
	kubeapiservertesting "k8s.io/kubernetes/cmd/kube-apiserver/app/testing"
 | 
						kubeapiservertesting "k8s.io/kubernetes/cmd/kube-apiserver/app/testing"
 | 
				
			||||||
	"k8s.io/kubernetes/test/integration/framework"
 | 
						"k8s.io/kubernetes/test/integration/framework"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func TestRun(t *testing.T) {
 | 
					func TestRun(t *testing.T) {
 | 
				
			||||||
	result := kubeapiservertesting.StartTestServerOrDie(t, nil, framework.SharedEtcd())
 | 
						server := kubeapiservertesting.StartTestServerOrDie(t, nil, framework.SharedEtcd())
 | 
				
			||||||
	defer result.TearDownFn()
 | 
						defer server.TearDownFn()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	client, err := kubernetes.NewForConfig(result.ClientConfig)
 | 
						client, err := kubernetes.NewForConfig(server.ClientConfig)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		t.Fatalf("unexpected error: %v", err)
 | 
							t.Fatalf("unexpected error: %v", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -72,3 +76,65 @@ func TestRun(t *testing.T) {
 | 
				
			|||||||
		t.Fatalf("Failed to create deployment: %v", err)
 | 
							t.Fatalf("Failed to create deployment: %v", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// TestOpenAPIDelegationChainPlumbing is a smoke test that checks for
 | 
				
			||||||
 | 
					// the existence of some representative paths from the
 | 
				
			||||||
 | 
					// apiextensions-server and the kube-aggregator server, both part of
 | 
				
			||||||
 | 
					// the delegation chain in kube-apiserver.
 | 
				
			||||||
 | 
					func TestOpenAPIDelegationChainPlumbing(t *testing.T) {
 | 
				
			||||||
 | 
						server := kubeapiservertesting.StartTestServerOrDie(t, nil, framework.SharedEtcd())
 | 
				
			||||||
 | 
						defer server.TearDownFn()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						kubeclient, err := kubernetes.NewForConfig(server.ClientConfig)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							t.Fatalf("unexpected error: %v", err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						result := kubeclient.RESTClient().Get().AbsPath("/swagger.json").Do()
 | 
				
			||||||
 | 
						status := 0
 | 
				
			||||||
 | 
						result.StatusCode(&status)
 | 
				
			||||||
 | 
						if status != 200 {
 | 
				
			||||||
 | 
							t.Fatalf("GET /swagger.json failed: expected status=%d, got=%d", 200, status)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						raw, err := result.Raw()
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							t.Fatalf("Unexpected error: %v", err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						type openAPISchema struct {
 | 
				
			||||||
 | 
							Paths map[string]interface{} `json:"paths"`
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						var doc openAPISchema
 | 
				
			||||||
 | 
						err = json.Unmarshal(raw, &doc)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							t.Fatalf("Failed to unmarshal: %v", err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						matchedExtension := false
 | 
				
			||||||
 | 
						extensionsPrefix := "/apis/" + apiextensions.GroupName
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						matchedRegistration := false
 | 
				
			||||||
 | 
						registrationPrefix := "/apis/" + apiregistration.GroupName
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for path := range doc.Paths {
 | 
				
			||||||
 | 
							if strings.HasPrefix(path, extensionsPrefix) {
 | 
				
			||||||
 | 
								matchedExtension = true
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if strings.HasPrefix(path, registrationPrefix) {
 | 
				
			||||||
 | 
								matchedRegistration = true
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if matchedExtension && matchedRegistration {
 | 
				
			||||||
 | 
								return
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if !matchedExtension {
 | 
				
			||||||
 | 
							t.Errorf("missing path: %q", extensionsPrefix)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if !matchedRegistration {
 | 
				
			||||||
 | 
							t.Errorf("missing path: %q", registrationPrefix)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user