mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-23 19:56:01 +00:00
e2e cases for apf
This commit is contained in:
parent
f99ad43dbb
commit
c28036efa5
@ -51,6 +51,12 @@ const (
|
|||||||
FlowSchemaMaxMatchingPrecedence int32 = 10000
|
FlowSchemaMaxMatchingPrecedence int32 = 10000
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// Constants for apiserver response headers.
|
||||||
|
const (
|
||||||
|
ResponseHeaderMatchedPriorityLevelConfigurationUID = "X-Kubernetes-PF-PriorityLevel-UID"
|
||||||
|
ResponseHeaderMatchedFlowSchemaUID = "X-Kubernetes-PF-FlowSchema-UID"
|
||||||
|
)
|
||||||
|
|
||||||
// +genclient
|
// +genclient
|
||||||
// +genclient:nonNamespaced
|
// +genclient:nonNamespaced
|
||||||
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
|
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
|
||||||
|
@ -35,11 +35,6 @@ type priorityAndFairnessKeyType int
|
|||||||
|
|
||||||
const priorityAndFairnessKey priorityAndFairnessKeyType = iota
|
const priorityAndFairnessKey priorityAndFairnessKeyType = iota
|
||||||
|
|
||||||
const (
|
|
||||||
responseHeaderMatchedPriorityLevelConfigurationUID = "X-Kubernetes-PF-PriorityLevel-UID"
|
|
||||||
responseHeaderMatchedFlowSchemaUID = "X-Kubernetes-PF-FlowSchema-UID"
|
|
||||||
)
|
|
||||||
|
|
||||||
// PriorityAndFairnessClassification identifies the results of
|
// PriorityAndFairnessClassification identifies the results of
|
||||||
// classification for API Priority and Fairness
|
// classification for API Priority and Fairness
|
||||||
type PriorityAndFairnessClassification struct {
|
type PriorityAndFairnessClassification struct {
|
||||||
@ -131,8 +126,8 @@ func WithPriorityAndFairness(
|
|||||||
served = true
|
served = true
|
||||||
innerCtx := context.WithValue(ctx, priorityAndFairnessKey, classification)
|
innerCtx := context.WithValue(ctx, priorityAndFairnessKey, classification)
|
||||||
innerReq := r.Clone(innerCtx)
|
innerReq := r.Clone(innerCtx)
|
||||||
w.Header().Set(responseHeaderMatchedPriorityLevelConfigurationUID, string(classification.PriorityLevelUID))
|
w.Header().Set(fcv1a1.ResponseHeaderMatchedPriorityLevelConfigurationUID, string(classification.PriorityLevelUID))
|
||||||
w.Header().Set(responseHeaderMatchedFlowSchemaUID, string(classification.FlowSchemaUID))
|
w.Header().Set(fcv1a1.ResponseHeaderMatchedFlowSchemaUID, string(classification.FlowSchemaUID))
|
||||||
handler.ServeHTTP(w, innerReq)
|
handler.ServeHTTP(w, innerReq)
|
||||||
}
|
}
|
||||||
digest := utilflowcontrol.RequestDigest{RequestInfo: requestInfo, User: user}
|
digest := utilflowcontrol.RequestDigest{RequestInfo: requestInfo, User: user}
|
||||||
|
@ -18,6 +18,7 @@ go_library(
|
|||||||
"discovery.go",
|
"discovery.go",
|
||||||
"etcd_failure.go",
|
"etcd_failure.go",
|
||||||
"events.go",
|
"events.go",
|
||||||
|
"flowcontrol.go",
|
||||||
"framework.go",
|
"framework.go",
|
||||||
"garbage_collector.go",
|
"garbage_collector.go",
|
||||||
"generated_clientset.go",
|
"generated_clientset.go",
|
||||||
@ -41,6 +42,7 @@ go_library(
|
|||||||
"//staging/src/k8s.io/api/batch/v1:go_default_library",
|
"//staging/src/k8s.io/api/batch/v1:go_default_library",
|
||||||
"//staging/src/k8s.io/api/batch/v1beta1:go_default_library",
|
"//staging/src/k8s.io/api/batch/v1beta1:go_default_library",
|
||||||
"//staging/src/k8s.io/api/core/v1:go_default_library",
|
"//staging/src/k8s.io/api/core/v1:go_default_library",
|
||||||
|
"//staging/src/k8s.io/api/flowcontrol/v1alpha1:go_default_library",
|
||||||
"//staging/src/k8s.io/api/rbac/v1:go_default_library",
|
"//staging/src/k8s.io/api/rbac/v1:go_default_library",
|
||||||
"//staging/src/k8s.io/api/scheduling/v1:go_default_library",
|
"//staging/src/k8s.io/api/scheduling/v1:go_default_library",
|
||||||
"//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions:go_default_library",
|
"//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions:go_default_library",
|
||||||
|
137
test/e2e/apimachinery/flowcontrol.go
Normal file
137
test/e2e/apimachinery/flowcontrol.go
Normal file
@ -0,0 +1,137 @@
|
|||||||
|
/*
|
||||||
|
Copyright 2016 The Kubernetes Authors.
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package apimachinery
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"net/http"
|
||||||
|
|
||||||
|
"github.com/onsi/ginkgo"
|
||||||
|
"k8s.io/client-go/rest"
|
||||||
|
|
||||||
|
flowcontrolv1alpha1 "k8s.io/api/flowcontrol/v1alpha1"
|
||||||
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
|
"k8s.io/kubernetes/test/e2e/framework"
|
||||||
|
)
|
||||||
|
|
||||||
|
var _ = SIGDescribe("[Feature:APIPriorityAndFairness] response header should present", func() {
|
||||||
|
f := framework.NewDefaultFramework("flowschemas")
|
||||||
|
|
||||||
|
ginkgo.It("should ensure that requests can be classified by testing flow-schemas/priority-levels", func() {
|
||||||
|
testingFlowSchemaName := "e2e-testing-flowschema"
|
||||||
|
testingPriorityLevelName := "e2e-testing-prioritylevel"
|
||||||
|
matchingUsername := "noxu"
|
||||||
|
nonMatchingUsername := "foo"
|
||||||
|
|
||||||
|
ginkgo.By("creating a testing prioritylevel")
|
||||||
|
createdPriorityLevel, err := f.ClientSet.FlowcontrolV1alpha1().PriorityLevelConfigurations().Create(
|
||||||
|
context.TODO(),
|
||||||
|
&flowcontrolv1alpha1.PriorityLevelConfiguration{
|
||||||
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
|
Name: testingPriorityLevelName,
|
||||||
|
},
|
||||||
|
Spec: flowcontrolv1alpha1.PriorityLevelConfigurationSpec{
|
||||||
|
Type: flowcontrolv1alpha1.PriorityLevelEnablementLimited,
|
||||||
|
Limited: &flowcontrolv1alpha1.LimitedPriorityLevelConfiguration{
|
||||||
|
AssuredConcurrencyShares: 1, // will have at minimum 1 concurrency share
|
||||||
|
LimitResponse: flowcontrolv1alpha1.LimitResponse{
|
||||||
|
Type: flowcontrolv1alpha1.LimitResponseTypeReject,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
metav1.CreateOptions{})
|
||||||
|
framework.ExpectNoError(err)
|
||||||
|
|
||||||
|
defer func() {
|
||||||
|
// clean-ups
|
||||||
|
err := f.ClientSet.FlowcontrolV1alpha1().PriorityLevelConfigurations().Delete(context.TODO(), testingPriorityLevelName, metav1.DeleteOptions{})
|
||||||
|
framework.ExpectNoError(err)
|
||||||
|
err = f.ClientSet.FlowcontrolV1alpha1().FlowSchemas().Delete(context.TODO(), testingFlowSchemaName, metav1.DeleteOptions{})
|
||||||
|
framework.ExpectNoError(err)
|
||||||
|
}()
|
||||||
|
|
||||||
|
ginkgo.By("creating a testing flowschema")
|
||||||
|
createdFlowSchema, err := f.ClientSet.FlowcontrolV1alpha1().FlowSchemas().Create(
|
||||||
|
context.TODO(),
|
||||||
|
&flowcontrolv1alpha1.FlowSchema{
|
||||||
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
|
Name: testingFlowSchemaName,
|
||||||
|
},
|
||||||
|
Spec: flowcontrolv1alpha1.FlowSchemaSpec{
|
||||||
|
MatchingPrecedence: 1000, // a rather higher precedence to ensure it make effect
|
||||||
|
PriorityLevelConfiguration: flowcontrolv1alpha1.PriorityLevelConfigurationReference{
|
||||||
|
Name: testingPriorityLevelName,
|
||||||
|
},
|
||||||
|
DistinguisherMethod: &flowcontrolv1alpha1.FlowDistinguisherMethod{
|
||||||
|
Type: flowcontrolv1alpha1.FlowDistinguisherMethodByUserType,
|
||||||
|
},
|
||||||
|
Rules: []flowcontrolv1alpha1.PolicyRulesWithSubjects{
|
||||||
|
{
|
||||||
|
Subjects: []flowcontrolv1alpha1.Subject{
|
||||||
|
{
|
||||||
|
Kind: flowcontrolv1alpha1.SubjectKindUser,
|
||||||
|
User: &flowcontrolv1alpha1.UserSubject{
|
||||||
|
Name: matchingUsername,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
NonResourceRules: []flowcontrolv1alpha1.NonResourcePolicyRule{
|
||||||
|
{
|
||||||
|
Verbs: []string{flowcontrolv1alpha1.VerbAll},
|
||||||
|
NonResourceURLs: []string{flowcontrolv1alpha1.NonResourceAll},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
metav1.CreateOptions{})
|
||||||
|
framework.ExpectNoError(err)
|
||||||
|
|
||||||
|
ginkgo.By("response headers should contain flow-schema/priority-level uid")
|
||||||
|
|
||||||
|
if !testResponseHeaderMatches(f, matchingUsername, string(createdPriorityLevel.UID), string(createdFlowSchema.UID)) {
|
||||||
|
framework.Failf("matching user doesnt received UID for the testing priority-level and flow-schema")
|
||||||
|
}
|
||||||
|
if testResponseHeaderMatches(f, nonMatchingUsername, string(createdPriorityLevel.UID), string(createdPriorityLevel.UID)) {
|
||||||
|
framework.Failf("non-matching user unexpectedly received UID for the testing priority-level and flow-schema")
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
})
|
||||||
|
|
||||||
|
func testResponseHeaderMatches(f *framework.Framework, impersonatingUser, plUID, fsUID string) bool {
|
||||||
|
config := rest.CopyConfig(f.ClientConfig())
|
||||||
|
config.Impersonate.UserName = impersonatingUser
|
||||||
|
roundTripper, err := rest.TransportFor(config)
|
||||||
|
framework.ExpectNoError(err)
|
||||||
|
|
||||||
|
req, err := http.NewRequest(http.MethodGet, f.ClientSet.CoreV1().RESTClient().Get().AbsPath("version").URL().String(), nil)
|
||||||
|
framework.ExpectNoError(err)
|
||||||
|
|
||||||
|
response, err := roundTripper.RoundTrip(req)
|
||||||
|
framework.ExpectNoError(err)
|
||||||
|
|
||||||
|
if response.Header.Get(flowcontrolv1alpha1.ResponseHeaderMatchedFlowSchemaUID) != fsUID {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
if response.Header.Get(flowcontrolv1alpha1.ResponseHeaderMatchedPriorityLevelConfigurationUID) != plUID {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user