Add version mapping in ComponentGlobalsRegistry.
Signed-off-by: Siyuan Zhang <sizhang@google.com>
This commit is contained in:
@@ -56,6 +56,7 @@ import (
|
||||
"k8s.io/apimachinery/pkg/watch"
|
||||
"k8s.io/apiserver/pkg/endpoints/handlers"
|
||||
"k8s.io/apiserver/pkg/storage/storagebackend"
|
||||
utilversion "k8s.io/apiserver/pkg/util/version"
|
||||
"k8s.io/client-go/discovery/cached/memory"
|
||||
"k8s.io/client-go/dynamic"
|
||||
clientset "k8s.io/client-go/kubernetes"
|
||||
@@ -3103,6 +3104,48 @@ func TestEmulatedStorageVersion(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
// TestAllowedEmulationVersions tests the TestServer can start without problem for all allowed emulation versions.
|
||||
func TestAllowedEmulationVersions(t *testing.T) {
|
||||
tcs := []struct {
|
||||
name string
|
||||
emulationVersion string
|
||||
}{
|
||||
{
|
||||
name: "default",
|
||||
emulationVersion: utilversion.DefaultKubeEffectiveVersion().EmulationVersion().String(),
|
||||
},
|
||||
}
|
||||
|
||||
for _, tc := range tcs {
|
||||
t.Run(tc.emulationVersion, func(t *testing.T) {
|
||||
server := kubeapiservertesting.StartTestServerOrDie(t, nil,
|
||||
[]string{fmt.Sprintf("--emulated-version=kube=%s", tc.emulationVersion)}, framework.SharedEtcd())
|
||||
defer server.TearDownFn()
|
||||
|
||||
rt, err := restclient.TransportFor(server.ClientConfig)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
req, err := http.NewRequest("GET", server.ClientConfig.Host+"/", nil)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
resp, err := rt.RoundTrip(req)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
expectedStatusCode := 200
|
||||
if resp.StatusCode != expectedStatusCode {
|
||||
t.Errorf("expect status code: %d, got : %d\n", expectedStatusCode, resp.StatusCode)
|
||||
}
|
||||
defer func() {
|
||||
_ = resp.Body.Close()
|
||||
}()
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestEnableEmulationVersion(t *testing.T) {
|
||||
server := kubeapiservertesting.StartTestServerOrDie(t,
|
||||
&kubeapiservertesting.TestServerInstanceOptions{BinaryVersion: "1.32"},
|
||||
|
||||
@@ -48,6 +48,7 @@ import (
|
||||
clientset "k8s.io/client-go/kubernetes"
|
||||
"k8s.io/utils/pointer"
|
||||
|
||||
utilversion "k8s.io/apiserver/pkg/util/version"
|
||||
"k8s.io/component-base/version"
|
||||
kubeapiservertesting "k8s.io/kubernetes/cmd/kube-apiserver/app/testing"
|
||||
"k8s.io/kubernetes/pkg/api/legacyscheme"
|
||||
@@ -65,7 +66,12 @@ func TestClient(t *testing.T) {
|
||||
if err != nil {
|
||||
t.Fatalf("unexpected error: %v", err)
|
||||
}
|
||||
if e, a := version.Get(), *info; !reflect.DeepEqual(e, a) {
|
||||
expectedInfo := version.Get()
|
||||
kubeVersion := utilversion.DefaultKubeEffectiveVersion().BinaryVersion()
|
||||
expectedInfo.Major = fmt.Sprintf("%d", kubeVersion.Major())
|
||||
expectedInfo.Minor = fmt.Sprintf("%d", kubeVersion.Minor())
|
||||
|
||||
if e, a := expectedInfo, *info; !reflect.DeepEqual(e, a) {
|
||||
t.Errorf("expected %#v, got %#v", e, a)
|
||||
}
|
||||
|
||||
|
||||
@@ -32,11 +32,9 @@ import (
|
||||
"k8s.io/apimachinery/pkg/types"
|
||||
"k8s.io/apimachinery/pkg/util/sets"
|
||||
"k8s.io/apimachinery/pkg/util/wait"
|
||||
utilversion "k8s.io/apiserver/pkg/util/version"
|
||||
"k8s.io/client-go/dynamic"
|
||||
apiregistrationv1 "k8s.io/kube-aggregator/pkg/apis/apiregistration/v1"
|
||||
apiregistrationclient "k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset/typed/apiregistration/v1"
|
||||
"k8s.io/kubernetes/cmd/kube-apiserver/app/options"
|
||||
)
|
||||
|
||||
// TestOverlappingBuiltInResources ensures the list of group-resources the custom resource finalizer should skip is up to date
|
||||
@@ -71,9 +69,7 @@ func TestOverlappingBuiltInResources(t *testing.T) {
|
||||
|
||||
// TestOverlappingCustomResourceAPIService ensures creating and deleting a custom resource overlapping with APIServices does not destroy APIService data
|
||||
func TestOverlappingCustomResourceAPIService(t *testing.T) {
|
||||
apiServer := StartRealAPIServerOrDie(t, func(opts *options.ServerRunOptions) {
|
||||
opts.GenericServerRunOptions.EffectiveVersion = utilversion.NewEffectiveVersion("1.30")
|
||||
})
|
||||
apiServer := StartRealAPIServerOrDie(t)
|
||||
defer apiServer.Cleanup()
|
||||
|
||||
apiServiceClient, err := apiregistrationclient.NewForConfig(apiServer.Config)
|
||||
@@ -235,9 +231,7 @@ func TestOverlappingCustomResourceAPIService(t *testing.T) {
|
||||
|
||||
// TestOverlappingCustomResourceCustomResourceDefinition ensures creating and deleting a custom resource overlapping with CustomResourceDefinition does not destroy CustomResourceDefinition data
|
||||
func TestOverlappingCustomResourceCustomResourceDefinition(t *testing.T) {
|
||||
apiServer := StartRealAPIServerOrDie(t, func(opts *options.ServerRunOptions) {
|
||||
opts.GenericServerRunOptions.EffectiveVersion = utilversion.NewEffectiveVersion("1.30")
|
||||
})
|
||||
apiServer := StartRealAPIServerOrDie(t)
|
||||
defer apiServer.Cleanup()
|
||||
|
||||
crdClient, err := crdclient.NewForConfig(apiServer.Config)
|
||||
|
||||
@@ -39,7 +39,7 @@ import (
|
||||
func TestCrossGroupStorage(t *testing.T) {
|
||||
apiServer := StartRealAPIServerOrDie(t, func(opts *options.ServerRunOptions) {
|
||||
// force enable all resources so we can check storage.
|
||||
opts.GenericServerRunOptions.EffectiveVersion = utilversion.NewEffectiveVersion("1.30")
|
||||
opts.GenericServerRunOptions.EffectiveVersion = utilversion.NewEffectiveVersion("0.0")
|
||||
})
|
||||
defer apiServer.Cleanup()
|
||||
|
||||
|
||||
@@ -226,6 +226,18 @@ func TestAPIServiceWaitOnStart(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestAggregatedAPIServer(t *testing.T) {
|
||||
t.Run("WithoutWardleFeatureGateAtV1.2", func(t *testing.T) {
|
||||
testAggregatedAPIServer(t, false, "1.2")
|
||||
})
|
||||
t.Run("WithoutWardleFeatureGateAtV1.1", func(t *testing.T) {
|
||||
testAggregatedAPIServer(t, false, "1.1")
|
||||
})
|
||||
t.Run("WithWardleFeatureGateAtV1.1", func(t *testing.T) {
|
||||
testAggregatedAPIServer(t, true, "1.1")
|
||||
})
|
||||
}
|
||||
|
||||
func testAggregatedAPIServer(t *testing.T, enableWardleFeatureGate bool, emulationVersion string) {
|
||||
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Minute)
|
||||
t.Cleanup(cancel)
|
||||
|
||||
@@ -240,7 +252,7 @@ func TestAggregatedAPIServer(t *testing.T) {
|
||||
// endpoints cannot have loopback IPs so we need to override the resolver itself
|
||||
t.Cleanup(app.SetServiceResolverForTests(staticURLServiceResolver(fmt.Sprintf("https://127.0.0.1:%d", wardlePort))))
|
||||
|
||||
testServer := kastesting.StartTestServerOrDie(t, &kastesting.TestServerInstanceOptions{EnableCertAuth: true}, nil, framework.SharedEtcd())
|
||||
testServer := kastesting.StartTestServerOrDie(t, &kastesting.TestServerInstanceOptions{EnableCertAuth: true, BinaryVersion: "1.32"}, nil, framework.SharedEtcd())
|
||||
defer testServer.TearDownFn()
|
||||
kubeClientConfig := rest.CopyConfig(testServer.ClientConfig)
|
||||
// force json because everything speaks it
|
||||
@@ -286,15 +298,18 @@ func TestAggregatedAPIServer(t *testing.T) {
|
||||
o.RecommendedOptions.SecureServing.Listener = listener
|
||||
o.RecommendedOptions.SecureServing.BindAddress = netutils.ParseIPSloppy("127.0.0.1")
|
||||
wardleCmd := sampleserver.NewCommandStartWardleServer(ctx, o)
|
||||
wardleCmd.SetArgs([]string{
|
||||
args := []string{
|
||||
"--authentication-kubeconfig", wardleToKASKubeConfigFile,
|
||||
"--authorization-kubeconfig", wardleToKASKubeConfigFile,
|
||||
"--etcd-servers", framework.GetEtcdURL(),
|
||||
"--cert-dir", wardleCertDir,
|
||||
"--kubeconfig", wardleToKASKubeConfigFile,
|
||||
"--emulated-version", "wardle=1.1",
|
||||
"--feature-gates", "wardle:BanFlunder=true",
|
||||
})
|
||||
"--emulated-version", fmt.Sprintf("wardle=%s", emulationVersion),
|
||||
}
|
||||
if enableWardleFeatureGate {
|
||||
args = append(args, "--feature-gates", "wardle:BanFlunder=true")
|
||||
}
|
||||
wardleCmd.SetArgs(args)
|
||||
if err := wardleCmd.Execute(); err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
@@ -393,6 +408,8 @@ func TestAggregatedAPIServer(t *testing.T) {
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
// clean up data after test is done
|
||||
defer wardleClient.Fischers().Delete(ctx, "panda", metav1.DeleteOptions{})
|
||||
fischersList, err := wardleClient.Fischers().List(ctx, metav1.ListOptions{})
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
@@ -409,8 +426,16 @@ func TestAggregatedAPIServer(t *testing.T) {
|
||||
Name: "badname",
|
||||
},
|
||||
}, metav1.CreateOptions{})
|
||||
if err == nil {
|
||||
t.Fatal("expect flunder:badname not admitted")
|
||||
banFlunder := enableWardleFeatureGate || emulationVersion == "1.2"
|
||||
if banFlunder && err == nil {
|
||||
t.Fatal("expect flunder:badname not admitted when wardle feature gates are specified")
|
||||
}
|
||||
if !banFlunder {
|
||||
if err != nil {
|
||||
t.Fatal("expect flunder:badname admitted when wardle feature gates are not specified")
|
||||
} else {
|
||||
defer wardleClient.Flunders(metav1.NamespaceSystem).Delete(ctx, "badname", metav1.DeleteOptions{})
|
||||
}
|
||||
}
|
||||
_, err = wardleClient.Flunders(metav1.NamespaceSystem).Create(ctx, &wardlev1alpha1.Flunder{
|
||||
ObjectMeta: metav1.ObjectMeta{
|
||||
@@ -420,12 +445,17 @@ func TestAggregatedAPIServer(t *testing.T) {
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
defer wardleClient.Flunders(metav1.NamespaceSystem).Delete(ctx, "panda", metav1.DeleteOptions{})
|
||||
flunderList, err := wardleClient.Flunders(metav1.NamespaceSystem).List(ctx, metav1.ListOptions{})
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if len(flunderList.Items) != 1 {
|
||||
t.Errorf("expected one flunder: %#v", flunderList.Items)
|
||||
expectedFlunderCount := 2
|
||||
if banFlunder {
|
||||
expectedFlunderCount = 1
|
||||
}
|
||||
if len(flunderList.Items) != expectedFlunderCount {
|
||||
t.Errorf("expected %d flunder: %#v", expectedFlunderCount, flunderList.Items)
|
||||
}
|
||||
if len(flunderList.ResourceVersion) == 0 {
|
||||
t.Error("expected non-empty resource version for flunder list")
|
||||
|
||||
@@ -29,7 +29,6 @@ import (
|
||||
"k8s.io/apimachinery/pkg/runtime"
|
||||
"k8s.io/apimachinery/pkg/util/wait"
|
||||
utilfeature "k8s.io/apiserver/pkg/util/feature"
|
||||
utilversion "k8s.io/apiserver/pkg/util/version"
|
||||
"k8s.io/client-go/kubernetes"
|
||||
featuregatetesting "k8s.io/component-base/featuregate/testing"
|
||||
"k8s.io/kubernetes/cmd/kube-apiserver/app/options"
|
||||
@@ -123,7 +122,6 @@ func TestServiceAllocIPAddress(t *testing.T) {
|
||||
ModifyServerRunOptions: func(opts *options.ServerRunOptions) {
|
||||
opts.ServiceClusterIPRanges = serviceCIDR
|
||||
opts.GenericServerRunOptions.AdvertiseAddress = netutils.ParseIPSloppy("2001:db8::10")
|
||||
opts.GenericServerRunOptions.EffectiveVersion = utilversion.NewEffectiveVersion("1.31")
|
||||
opts.APIEnablement.RuntimeConfig.Set("networking.k8s.io/v1alpha1=true")
|
||||
},
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user