From 1b3571b425c160a5a6e3cf8a68af4b0488a22811 Mon Sep 17 00:00:00 2001 From: yue9944882 <291271447@qq.com> Date: Thu, 23 Aug 2018 13:17:39 +0800 Subject: [PATCH] externalize podpreset --- plugin/pkg/admission/podpreset/BUILD | 20 +- plugin/pkg/admission/podpreset/admission.go | 89 +++++---- .../pkg/admission/podpreset/admission_test.go | 185 +++++++++--------- 3 files changed, 159 insertions(+), 135 deletions(-) diff --git a/plugin/pkg/admission/podpreset/BUILD b/plugin/pkg/admission/podpreset/BUILD index 34329ea722..c27fcc83eb 100644 --- a/plugin/pkg/admission/podpreset/BUILD +++ b/plugin/pkg/admission/podpreset/BUILD @@ -12,15 +12,16 @@ go_test( embed = [":go_default_library"], deps = [ "//pkg/apis/core:go_default_library", - "//pkg/apis/settings:go_default_library", - "//pkg/client/clientset_generated/internalclientset/fake:go_default_library", - "//pkg/client/informers/informers_generated/internalversion:go_default_library", - "//pkg/client/listers/settings/internalversion:go_default_library", "//pkg/controller:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/api/settings/v1alpha1:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", "//staging/src/k8s.io/apiserver/pkg/admission:go_default_library", "//staging/src/k8s.io/apiserver/pkg/authentication/user:go_default_library", + "//staging/src/k8s.io/client-go/informers:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library", + "//staging/src/k8s.io/client-go/listers/settings/v1alpha1:go_default_library", ], ) @@ -30,16 +31,17 @@ go_library( importpath = "k8s.io/kubernetes/plugin/pkg/admission/podpreset", deps = [ "//pkg/apis/core:go_default_library", - "//pkg/apis/settings:go_default_library", - "//pkg/client/clientset_generated/internalclientset:go_default_library", - "//pkg/client/informers/informers_generated/internalversion:go_default_library", - "//pkg/client/listers/settings/internalversion:go_default_library", - "//pkg/kubeapiserver/admission:go_default_library", + "//pkg/apis/core/v1:go_default_library", + "//staging/src/k8s.io/api/settings/v1alpha1:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library", "//staging/src/k8s.io/apiserver/pkg/admission:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/admission/initializer:go_default_library", + "//staging/src/k8s.io/client-go/informers:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes:go_default_library", + "//staging/src/k8s.io/client-go/listers/settings/v1alpha1:go_default_library", "//vendor/github.com/golang/glog:go_default_library", ], ) diff --git a/plugin/pkg/admission/podpreset/admission.go b/plugin/pkg/admission/podpreset/admission.go index 782a832f6e..d91bdd7889 100644 --- a/plugin/pkg/admission/podpreset/admission.go +++ b/plugin/pkg/admission/podpreset/admission.go @@ -24,17 +24,18 @@ import ( "github.com/golang/glog" + settingsv1alpha1 "k8s.io/api/settings/v1alpha1" "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/labels" utilerrors "k8s.io/apimachinery/pkg/util/errors" "k8s.io/apiserver/pkg/admission" + genericadmissioninitializer "k8s.io/apiserver/pkg/admission/initializer" + "k8s.io/client-go/informers" + "k8s.io/client-go/kubernetes" + settingsv1alpha1listers "k8s.io/client-go/listers/settings/v1alpha1" api "k8s.io/kubernetes/pkg/apis/core" - "k8s.io/kubernetes/pkg/apis/settings" - "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset" - informers "k8s.io/kubernetes/pkg/client/informers/informers_generated/internalversion" - settingslisters "k8s.io/kubernetes/pkg/client/listers/settings/internalversion" - kubeapiserveradmission "k8s.io/kubernetes/pkg/kubeapiserver/admission" + apiscorev1 "k8s.io/kubernetes/pkg/apis/core/v1" ) const ( @@ -52,14 +53,14 @@ func Register(plugins *admission.Plugins) { // podPresetPlugin is an implementation of admission.Interface. type podPresetPlugin struct { *admission.Handler - client internalclientset.Interface + client kubernetes.Interface - lister settingslisters.PodPresetLister + lister settingsv1alpha1listers.PodPresetLister } var _ admission.MutationInterface = &podPresetPlugin{} -var _ = kubeapiserveradmission.WantsInternalKubeInformerFactory(&podPresetPlugin{}) -var _ = kubeapiserveradmission.WantsInternalKubeClientSet(&podPresetPlugin{}) +var _ = genericadmissioninitializer.WantsExternalKubeInformerFactory(&podPresetPlugin{}) +var _ = genericadmissioninitializer.WantsExternalKubeClientSet(&podPresetPlugin{}) // NewPlugin creates a new pod preset admission plugin. func NewPlugin() *podPresetPlugin { @@ -78,12 +79,12 @@ func (plugin *podPresetPlugin) ValidateInitialization() error { return nil } -func (a *podPresetPlugin) SetInternalKubeClientSet(client internalclientset.Interface) { +func (a *podPresetPlugin) SetExternalKubeClientSet(client kubernetes.Interface) { a.client = client } -func (a *podPresetPlugin) SetInternalKubeInformerFactory(f informers.SharedInformerFactory) { - podPresetInformer := f.Settings().InternalVersion().PodPresets() +func (a *podPresetPlugin) SetExternalKubeInformerFactory(f informers.SharedInformerFactory) { + podPresetInformer := f.Settings().V1alpha1().PodPresets() a.lister = podPresetInformer.Lister() a.SetReadyFunc(podPresetInformer.Informer().HasSynced) } @@ -149,8 +150,8 @@ func (c *podPresetPlugin) Admit(a admission.Attributes) error { } // filterPodPresets returns list of PodPresets which match given Pod. -func filterPodPresets(list []*settings.PodPreset, pod *api.Pod) ([]*settings.PodPreset, error) { - var matchingPPs []*settings.PodPreset +func filterPodPresets(list []*settingsv1alpha1.PodPreset, pod *api.Pod) ([]*settingsv1alpha1.PodPreset, error) { + var matchingPPs []*settingsv1alpha1.PodPreset for _, pp := range list { selector, err := metav1.LabelSelectorAsSelector(&pp.Spec.Selector) @@ -170,7 +171,7 @@ func filterPodPresets(list []*settings.PodPreset, pod *api.Pod) ([]*settings.Pod // safeToApplyPodPresetsOnPod determines if there is any conflict in information // injected by given PodPresets in the Pod. -func safeToApplyPodPresetsOnPod(pod *api.Pod, podPresets []*settings.PodPreset) error { +func safeToApplyPodPresetsOnPod(pod *api.Pod, podPresets []*settingsv1alpha1.PodPreset) error { var errs []error // volumes attribute is defined at the Pod level, so determine if volumes @@ -188,7 +189,7 @@ func safeToApplyPodPresetsOnPod(pod *api.Pod, podPresets []*settings.PodPreset) // safeToApplyPodPresetsOnContainer determines if there is any conflict in // information injected by given PodPresets in the given container. -func safeToApplyPodPresetsOnContainer(ctr *api.Container, podPresets []*settings.PodPreset) error { +func safeToApplyPodPresetsOnContainer(ctr *api.Container, podPresets []*settingsv1alpha1.PodPreset) error { var errs []error // check if it is safe to merge env vars and volume mounts from given podpresets and // container's existing env vars. @@ -204,7 +205,7 @@ func safeToApplyPodPresetsOnContainer(ctr *api.Container, podPresets []*settings // mergeEnv merges a list of env vars with the env vars injected by given list podPresets. // It returns an error if it detects any conflict during the merge. -func mergeEnv(envVars []api.EnvVar, podPresets []*settings.PodPreset) ([]api.EnvVar, error) { +func mergeEnv(envVars []api.EnvVar, podPresets []*settingsv1alpha1.PodPreset) ([]api.EnvVar, error) { origEnv := map[string]api.EnvVar{} for _, v := range envVars { origEnv[v.Name] = v @@ -217,16 +218,21 @@ func mergeEnv(envVars []api.EnvVar, podPresets []*settings.PodPreset) ([]api.Env for _, pp := range podPresets { for _, v := range pp.Spec.Env { + internalEnv := api.EnvVar{} + if err := apiscorev1.Convert_v1_EnvVar_To_core_EnvVar(&v, &internalEnv, nil); err != nil { + return nil, err + } + found, ok := origEnv[v.Name] if !ok { // if we don't already have it append it and continue - origEnv[v.Name] = v - mergedEnv = append(mergedEnv, v) + origEnv[v.Name] = internalEnv + mergedEnv = append(mergedEnv, internalEnv) continue } // make sure they are identical or throw an error - if !reflect.DeepEqual(found, v) { + if !reflect.DeepEqual(found, internalEnv) { errs = append(errs, fmt.Errorf("merging env for %s has a conflict on %s: \n%#v\ndoes not match\n%#v\n in container", pp.GetName(), v.Name, v, found)) } } @@ -240,12 +246,19 @@ func mergeEnv(envVars []api.EnvVar, podPresets []*settings.PodPreset) ([]api.Env return mergedEnv, err } -func mergeEnvFrom(envSources []api.EnvFromSource, podPresets []*settings.PodPreset) ([]api.EnvFromSource, error) { +func mergeEnvFrom(envSources []api.EnvFromSource, podPresets []*settingsv1alpha1.PodPreset) ([]api.EnvFromSource, error) { var mergedEnvFrom []api.EnvFromSource mergedEnvFrom = append(mergedEnvFrom, envSources...) for _, pp := range podPresets { - mergedEnvFrom = append(mergedEnvFrom, pp.Spec.EnvFrom...) + for _, envFromSource := range pp.Spec.EnvFrom { + internalEnvFrom := api.EnvFromSource{} + if err := apiscorev1.Convert_v1_EnvFromSource_To_core_EnvFromSource(&envFromSource, &internalEnvFrom, nil); err != nil { + return nil, err + } + mergedEnvFrom = append(mergedEnvFrom, internalEnvFrom) + } + } return mergedEnvFrom, nil @@ -253,7 +266,7 @@ func mergeEnvFrom(envSources []api.EnvFromSource, podPresets []*settings.PodPres // mergeVolumeMounts merges given list of VolumeMounts with the volumeMounts // injected by given podPresets. It returns an error if it detects any conflict during the merge. -func mergeVolumeMounts(volumeMounts []api.VolumeMount, podPresets []*settings.PodPreset) ([]api.VolumeMount, error) { +func mergeVolumeMounts(volumeMounts []api.VolumeMount, podPresets []*settingsv1alpha1.PodPreset) ([]api.VolumeMount, error) { origVolumeMounts := map[string]api.VolumeMount{} volumeMountsByPath := map[string]api.VolumeMount{} @@ -269,15 +282,19 @@ func mergeVolumeMounts(volumeMounts []api.VolumeMount, podPresets []*settings.Po for _, pp := range podPresets { for _, v := range pp.Spec.VolumeMounts { + internalVolumeMount := api.VolumeMount{} + if err := apiscorev1.Convert_v1_VolumeMount_To_core_VolumeMount(&v, &internalVolumeMount, nil); err != nil { + return nil, err + } found, ok := origVolumeMounts[v.Name] if !ok { // if we don't already have it append it and continue - origVolumeMounts[v.Name] = v - mergedVolumeMounts = append(mergedVolumeMounts, v) + origVolumeMounts[v.Name] = internalVolumeMount + mergedVolumeMounts = append(mergedVolumeMounts, internalVolumeMount) } else { // make sure they are identical or throw an error // shall we throw an error for identical volumeMounts ? - if !reflect.DeepEqual(found, v) { + if !reflect.DeepEqual(found, internalVolumeMount) { errs = append(errs, fmt.Errorf("merging volume mounts for %s has a conflict on %s: \n%#v\ndoes not match\n%#v\n in container", pp.GetName(), v.Name, v, found)) } } @@ -285,10 +302,10 @@ func mergeVolumeMounts(volumeMounts []api.VolumeMount, podPresets []*settings.Po found, ok = volumeMountsByPath[v.MountPath] if !ok { // if we don't already have it append it and continue - volumeMountsByPath[v.MountPath] = v + volumeMountsByPath[v.MountPath] = internalVolumeMount } else { // make sure they are identical or throw an error - if !reflect.DeepEqual(found, v) { + if !reflect.DeepEqual(found, internalVolumeMount) { errs = append(errs, fmt.Errorf("merging volume mounts for %s has a conflict on mount path %s: \n%#v\ndoes not match\n%#v\n in container", pp.GetName(), v.MountPath, v, found)) } } @@ -305,7 +322,7 @@ func mergeVolumeMounts(volumeMounts []api.VolumeMount, podPresets []*settings.Po // mergeVolumes merges given list of Volumes with the volumes injected by given // podPresets. It returns an error if it detects any conflict during the merge. -func mergeVolumes(volumes []api.Volume, podPresets []*settings.PodPreset) ([]api.Volume, error) { +func mergeVolumes(volumes []api.Volume, podPresets []*settingsv1alpha1.PodPreset) ([]api.Volume, error) { origVolumes := map[string]api.Volume{} for _, v := range volumes { origVolumes[v.Name] = v @@ -318,16 +335,20 @@ func mergeVolumes(volumes []api.Volume, podPresets []*settings.PodPreset) ([]api for _, pp := range podPresets { for _, v := range pp.Spec.Volumes { + internalVolume := api.Volume{} + if err := apiscorev1.Convert_v1_Volume_To_core_Volume(&v, &internalVolume, nil); err != nil { + return nil, err + } found, ok := origVolumes[v.Name] if !ok { // if we don't already have it append it and continue - origVolumes[v.Name] = v - mergedVolumes = append(mergedVolumes, v) + origVolumes[v.Name] = internalVolume + mergedVolumes = append(mergedVolumes, internalVolume) continue } // make sure they are identical or throw an error - if !reflect.DeepEqual(found, v) { + if !reflect.DeepEqual(found, internalVolume) { errs = append(errs, fmt.Errorf("merging volumes for %s has a conflict on %s: \n%#v\ndoes not match\n%#v\n in container", pp.GetName(), v.Name, v, found)) } } @@ -348,7 +369,7 @@ func mergeVolumes(volumes []api.Volume, podPresets []*settings.PodPreset) ([]api // applyPodPresetsOnPod updates the PodSpec with merged information from all the // applicable PodPresets. It ignores the errors of merge functions because merge // errors have already been checked in safeToApplyPodPresetsOnPod function. -func applyPodPresetsOnPod(pod *api.Pod, podPresets []*settings.PodPreset) { +func applyPodPresetsOnPod(pod *api.Pod, podPresets []*settingsv1alpha1.PodPreset) { if len(podPresets) == 0 { return } @@ -374,7 +395,7 @@ func applyPodPresetsOnPod(pod *api.Pod, podPresets []*settings.PodPreset) { // applyPodPresetsOnContainer injects envVars, VolumeMounts and envFrom from // given podPresets in to the given container. It ignores conflict errors // because it assumes those have been checked already by the caller. -func applyPodPresetsOnContainer(ctr *api.Container, podPresets []*settings.PodPreset) { +func applyPodPresetsOnContainer(ctr *api.Container, podPresets []*settingsv1alpha1.PodPreset) { envVars, _ := mergeEnv(ctr.Env, podPresets) ctr.Env = envVars diff --git a/plugin/pkg/admission/podpreset/admission_test.go b/plugin/pkg/admission/podpreset/admission_test.go index 3342530f24..8e1a7fa4cc 100644 --- a/plugin/pkg/admission/podpreset/admission_test.go +++ b/plugin/pkg/admission/podpreset/admission_test.go @@ -20,44 +20,45 @@ import ( "reflect" "testing" + corev1 "k8s.io/api/core/v1" + settingsv1alpha1 "k8s.io/api/settings/v1alpha1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" kadmission "k8s.io/apiserver/pkg/admission" "k8s.io/apiserver/pkg/authentication/user" + "k8s.io/client-go/informers" + "k8s.io/client-go/kubernetes/fake" + settingsv1alpha1listers "k8s.io/client-go/listers/settings/v1alpha1" api "k8s.io/kubernetes/pkg/apis/core" - "k8s.io/kubernetes/pkg/apis/settings" - "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/fake" - informers "k8s.io/kubernetes/pkg/client/informers/informers_generated/internalversion" - settingslisters "k8s.io/kubernetes/pkg/client/listers/settings/internalversion" "k8s.io/kubernetes/pkg/controller" ) func TestMergeEnv(t *testing.T) { tests := map[string]struct { orig []api.EnvVar - mod []api.EnvVar + mod []corev1.EnvVar result []api.EnvVar shouldFail bool }{ "empty original": { - mod: []api.EnvVar{{Name: "abc", Value: "value2"}, {Name: "ABC", Value: "value3"}}, + mod: []corev1.EnvVar{{Name: "abc", Value: "value2"}, {Name: "ABC", Value: "value3"}}, result: []api.EnvVar{{Name: "abc", Value: "value2"}, {Name: "ABC", Value: "value3"}}, shouldFail: false, }, "good merge": { orig: []api.EnvVar{{Name: "abcd", Value: "value2"}, {Name: "hello", Value: "value3"}}, - mod: []api.EnvVar{{Name: "abc", Value: "value2"}, {Name: "ABC", Value: "value3"}}, + mod: []corev1.EnvVar{{Name: "abc", Value: "value2"}, {Name: "ABC", Value: "value3"}}, result: []api.EnvVar{{Name: "abcd", Value: "value2"}, {Name: "hello", Value: "value3"}, {Name: "abc", Value: "value2"}, {Name: "ABC", Value: "value3"}}, shouldFail: false, }, "conflict": { orig: []api.EnvVar{{Name: "abc", Value: "value3"}}, - mod: []api.EnvVar{{Name: "abc", Value: "value2"}, {Name: "ABC", Value: "value3"}}, + mod: []corev1.EnvVar{{Name: "abc", Value: "value2"}, {Name: "ABC", Value: "value3"}}, shouldFail: true, }, "one is exact same": { orig: []api.EnvVar{{Name: "abc", Value: "value2"}, {Name: "hello", Value: "value3"}}, - mod: []api.EnvVar{{Name: "abc", Value: "value2"}, {Name: "ABC", Value: "value3"}}, + mod: []corev1.EnvVar{{Name: "abc", Value: "value2"}, {Name: "ABC", Value: "value3"}}, result: []api.EnvVar{{Name: "abc", Value: "value2"}, {Name: "hello", Value: "value3"}, {Name: "ABC", Value: "value3"}}, shouldFail: false, }, @@ -66,7 +67,7 @@ func TestMergeEnv(t *testing.T) { for name, test := range tests { result, err := mergeEnv( test.orig, - []*settings.PodPreset{{Spec: settings.PodPresetSpec{Env: test.mod}}}, + []*settingsv1alpha1.PodPreset{{Spec: settingsv1alpha1.PodPresetSpec{Env: test.mod}}}, ) if test.shouldFail && err == nil { t.Fatalf("expected test %q to fail but got nil", name) @@ -83,21 +84,21 @@ func TestMergeEnv(t *testing.T) { func TestMergeEnvFrom(t *testing.T) { tests := map[string]struct { orig []api.EnvFromSource - mod []api.EnvFromSource + mod []corev1.EnvFromSource result []api.EnvFromSource shouldFail bool }{ "empty original": { - mod: []api.EnvFromSource{ + mod: []corev1.EnvFromSource{ { - ConfigMapRef: &api.ConfigMapEnvSource{ - LocalObjectReference: api.LocalObjectReference{Name: "abc"}, + ConfigMapRef: &corev1.ConfigMapEnvSource{ + LocalObjectReference: corev1.LocalObjectReference{Name: "abc"}, }, }, { Prefix: "pre_", - ConfigMapRef: &api.ConfigMapEnvSource{ - LocalObjectReference: api.LocalObjectReference{Name: "abc"}, + ConfigMapRef: &corev1.ConfigMapEnvSource{ + LocalObjectReference: corev1.LocalObjectReference{Name: "abc"}, }, }, }, @@ -124,16 +125,16 @@ func TestMergeEnvFrom(t *testing.T) { }, }, }, - mod: []api.EnvFromSource{ + mod: []corev1.EnvFromSource{ { - ConfigMapRef: &api.ConfigMapEnvSource{ - LocalObjectReference: api.LocalObjectReference{Name: "abc"}, + ConfigMapRef: &corev1.ConfigMapEnvSource{ + LocalObjectReference: corev1.LocalObjectReference{Name: "abc"}, }, }, { Prefix: "pre_", - ConfigMapRef: &api.ConfigMapEnvSource{ - LocalObjectReference: api.LocalObjectReference{Name: "abc"}, + ConfigMapRef: &corev1.ConfigMapEnvSource{ + LocalObjectReference: corev1.LocalObjectReference{Name: "abc"}, }, }, }, @@ -162,7 +163,7 @@ func TestMergeEnvFrom(t *testing.T) { for name, test := range tests { result, err := mergeEnvFrom( test.orig, - []*settings.PodPreset{{Spec: settings.PodPresetSpec{EnvFrom: test.mod}}}, + []*settingsv1alpha1.PodPreset{{Spec: settingsv1alpha1.PodPresetSpec{EnvFrom: test.mod}}}, ) if test.shouldFail && err == nil { t.Fatalf("expected test %q to fail but got nil", name) @@ -179,12 +180,12 @@ func TestMergeEnvFrom(t *testing.T) { func TestMergeVolumeMounts(t *testing.T) { tests := map[string]struct { orig []api.VolumeMount - mod []api.VolumeMount + mod []corev1.VolumeMount result []api.VolumeMount shouldFail bool }{ "empty original": { - mod: []api.VolumeMount{ + mod: []corev1.VolumeMount{ { Name: "simply-mounted-volume", MountPath: "/opt/", @@ -199,7 +200,7 @@ func TestMergeVolumeMounts(t *testing.T) { shouldFail: false, }, "good merge": { - mod: []api.VolumeMount{ + mod: []corev1.VolumeMount{ { Name: "simply-mounted-volume", MountPath: "/opt/", @@ -224,7 +225,7 @@ func TestMergeVolumeMounts(t *testing.T) { shouldFail: false, }, "conflict": { - mod: []api.VolumeMount{ + mod: []corev1.VolumeMount{ { Name: "simply-mounted-volume", MountPath: "/opt/", @@ -243,7 +244,7 @@ func TestMergeVolumeMounts(t *testing.T) { shouldFail: true, }, "conflict on mount path": { - mod: []api.VolumeMount{ + mod: []corev1.VolumeMount{ { Name: "simply-mounted-volume", MountPath: "/opt/", @@ -262,7 +263,7 @@ func TestMergeVolumeMounts(t *testing.T) { shouldFail: true, }, "one is exact same": { - mod: []api.VolumeMount{ + mod: []corev1.VolumeMount{ { Name: "simply-mounted-volume", MountPath: "/opt/", @@ -295,7 +296,7 @@ func TestMergeVolumeMounts(t *testing.T) { for name, test := range tests { result, err := mergeVolumeMounts( test.orig, - []*settings.PodPreset{{Spec: settings.PodPresetSpec{VolumeMounts: test.mod}}}, + []*settingsv1alpha1.PodPreset{{Spec: settingsv1alpha1.PodPresetSpec{VolumeMounts: test.mod}}}, ) if test.shouldFail && err == nil { t.Fatalf("expected test %q to fail but got nil", name) @@ -312,14 +313,14 @@ func TestMergeVolumeMounts(t *testing.T) { func TestMergeVolumes(t *testing.T) { tests := map[string]struct { orig []api.Volume - mod []api.Volume + mod []corev1.Volume result []api.Volume shouldFail bool }{ "empty original": { - mod: []api.Volume{ - {Name: "vol", VolumeSource: api.VolumeSource{EmptyDir: &api.EmptyDirVolumeSource{}}}, - {Name: "vol2", VolumeSource: api.VolumeSource{EmptyDir: &api.EmptyDirVolumeSource{}}}, + mod: []corev1.Volume{ + {Name: "vol", VolumeSource: corev1.VolumeSource{EmptyDir: &corev1.EmptyDirVolumeSource{}}}, + {Name: "vol2", VolumeSource: corev1.VolumeSource{EmptyDir: &corev1.EmptyDirVolumeSource{}}}, }, result: []api.Volume{ {Name: "vol", VolumeSource: api.VolumeSource{EmptyDir: &api.EmptyDirVolumeSource{}}}, @@ -332,9 +333,9 @@ func TestMergeVolumes(t *testing.T) { {Name: "vol3", VolumeSource: api.VolumeSource{EmptyDir: &api.EmptyDirVolumeSource{}}}, {Name: "vol4", VolumeSource: api.VolumeSource{EmptyDir: &api.EmptyDirVolumeSource{}}}, }, - mod: []api.Volume{ - {Name: "vol", VolumeSource: api.VolumeSource{EmptyDir: &api.EmptyDirVolumeSource{}}}, - {Name: "vol2", VolumeSource: api.VolumeSource{EmptyDir: &api.EmptyDirVolumeSource{}}}, + mod: []corev1.Volume{ + {Name: "vol", VolumeSource: corev1.VolumeSource{EmptyDir: &corev1.EmptyDirVolumeSource{}}}, + {Name: "vol2", VolumeSource: corev1.VolumeSource{EmptyDir: &corev1.EmptyDirVolumeSource{}}}, }, result: []api.Volume{ {Name: "vol3", VolumeSource: api.VolumeSource{EmptyDir: &api.EmptyDirVolumeSource{}}}, @@ -349,9 +350,9 @@ func TestMergeVolumes(t *testing.T) { {Name: "vol3", VolumeSource: api.VolumeSource{EmptyDir: &api.EmptyDirVolumeSource{}}}, {Name: "vol4", VolumeSource: api.VolumeSource{EmptyDir: &api.EmptyDirVolumeSource{}}}, }, - mod: []api.Volume{ - {Name: "vol3", VolumeSource: api.VolumeSource{HostPath: &api.HostPathVolumeSource{Path: "/etc/apparmor.d"}}}, - {Name: "vol2", VolumeSource: api.VolumeSource{EmptyDir: &api.EmptyDirVolumeSource{}}}, + mod: []corev1.Volume{ + {Name: "vol3", VolumeSource: corev1.VolumeSource{HostPath: &corev1.HostPathVolumeSource{Path: "/etc/apparmor.d"}}}, + {Name: "vol2", VolumeSource: corev1.VolumeSource{EmptyDir: &corev1.EmptyDirVolumeSource{}}}, }, shouldFail: true, }, @@ -360,9 +361,9 @@ func TestMergeVolumes(t *testing.T) { {Name: "vol3", VolumeSource: api.VolumeSource{EmptyDir: &api.EmptyDirVolumeSource{}}}, {Name: "vol4", VolumeSource: api.VolumeSource{EmptyDir: &api.EmptyDirVolumeSource{}}}, }, - mod: []api.Volume{ - {Name: "vol3", VolumeSource: api.VolumeSource{EmptyDir: &api.EmptyDirVolumeSource{}}}, - {Name: "vol2", VolumeSource: api.VolumeSource{EmptyDir: &api.EmptyDirVolumeSource{}}}, + mod: []corev1.Volume{ + {Name: "vol3", VolumeSource: corev1.VolumeSource{EmptyDir: &corev1.EmptyDirVolumeSource{}}}, + {Name: "vol2", VolumeSource: corev1.VolumeSource{EmptyDir: &corev1.EmptyDirVolumeSource{}}}, }, result: []api.Volume{ {Name: "vol3", VolumeSource: api.VolumeSource{EmptyDir: &api.EmptyDirVolumeSource{}}}, @@ -376,7 +377,7 @@ func TestMergeVolumes(t *testing.T) { for name, test := range tests { result, err := mergeVolumes( test.orig, - []*settings.PodPreset{{Spec: settings.PodPresetSpec{Volumes: test.mod}}}, + []*settingsv1alpha1.PodPreset{{Spec: settingsv1alpha1.PodPresetSpec{Volumes: test.mod}}}, ) if test.shouldFail && err == nil { t.Fatalf("expected test %q to fail but got nil", name) @@ -392,7 +393,7 @@ func TestMergeVolumes(t *testing.T) { // NewTestAdmission provides an admission plugin with test implementations of internal structs. It uses // an authorizer that always returns true. -func NewTestAdmission(lister settingslisters.PodPresetLister, objects ...runtime.Object) kadmission.MutationInterface { +func NewTestAdmission(lister settingsv1alpha1listers.PodPresetLister, objects ...runtime.Object) kadmission.MutationInterface { // Build a test client that the admission plugin can use to look up the service account missing from its cache client := fake.NewSimpleClientset(objects...) @@ -424,12 +425,12 @@ func TestAdmitConflictWithDifferentNamespaceShouldDoNothing(t *testing.T) { }, } - pip := &settings.PodPreset{ + pip := &settingsv1alpha1.PodPreset{ ObjectMeta: metav1.ObjectMeta{ Name: "hello", Namespace: "othernamespace", }, - Spec: settings.PodPresetSpec{ + Spec: settingsv1alpha1.PodPresetSpec{ Selector: metav1.LabelSelector{ MatchExpressions: []metav1.LabelSelectorRequirement{ { @@ -439,7 +440,7 @@ func TestAdmitConflictWithDifferentNamespaceShouldDoNothing(t *testing.T) { }, }, }, - Env: []api.EnvVar{{Name: "abc", Value: "value"}, {Name: "ABC", Value: "value"}}, + Env: []corev1.EnvVar{{Name: "abc", Value: "value"}, {Name: "ABC", Value: "value"}}, }, } @@ -470,12 +471,12 @@ func TestAdmitConflictWithNonMatchingLabelsShouldNotError(t *testing.T) { }, } - pip := &settings.PodPreset{ + pip := &settingsv1alpha1.PodPreset{ ObjectMeta: metav1.ObjectMeta{ Name: "hello", Namespace: "namespace", }, - Spec: settings.PodPresetSpec{ + Spec: settingsv1alpha1.PodPresetSpec{ Selector: metav1.LabelSelector{ MatchExpressions: []metav1.LabelSelectorRequirement{ { @@ -485,7 +486,7 @@ func TestAdmitConflictWithNonMatchingLabelsShouldNotError(t *testing.T) { }, }, }, - Env: []api.EnvVar{{Name: "abc", Value: "value"}, {Name: "ABC", Value: "value"}}, + Env: []corev1.EnvVar{{Name: "abc", Value: "value"}, {Name: "ABC", Value: "value"}}, }, } @@ -517,12 +518,12 @@ func TestAdmitConflictShouldNotModifyPod(t *testing.T) { } origPod := *pod - pip := &settings.PodPreset{ + pip := &settingsv1alpha1.PodPreset{ ObjectMeta: metav1.ObjectMeta{ Name: "hello", Namespace: "namespace", }, - Spec: settings.PodPresetSpec{ + Spec: settingsv1alpha1.PodPresetSpec{ Selector: metav1.LabelSelector{ MatchExpressions: []metav1.LabelSelectorRequirement{ { @@ -532,7 +533,7 @@ func TestAdmitConflictShouldNotModifyPod(t *testing.T) { }, }, }, - Env: []api.EnvVar{{Name: "abc", Value: "value"}, {Name: "ABC", Value: "value"}}, + Env: []corev1.EnvVar{{Name: "abc", Value: "value"}, {Name: "ABC", Value: "value"}}, }, } @@ -566,12 +567,12 @@ func TestAdmit(t *testing.T) { }, } - pip := &settings.PodPreset{ + pip := &settingsv1alpha1.PodPreset{ ObjectMeta: metav1.ObjectMeta{ Name: "hello", Namespace: "namespace", }, - Spec: settings.PodPresetSpec{ + Spec: settingsv1alpha1.PodPresetSpec{ Selector: metav1.LabelSelector{ MatchExpressions: []metav1.LabelSelectorRequirement{ { @@ -581,18 +582,18 @@ func TestAdmit(t *testing.T) { }, }, }, - Volumes: []api.Volume{{Name: "vol", VolumeSource: api.VolumeSource{EmptyDir: &api.EmptyDirVolumeSource{}}}}, - Env: []api.EnvVar{{Name: "abcd", Value: "value"}, {Name: "ABC", Value: "value"}}, - EnvFrom: []api.EnvFromSource{ + Volumes: []corev1.Volume{{Name: "vol", VolumeSource: corev1.VolumeSource{EmptyDir: &corev1.EmptyDirVolumeSource{}}}}, + Env: []corev1.EnvVar{{Name: "abcd", Value: "value"}, {Name: "ABC", Value: "value"}}, + EnvFrom: []corev1.EnvFromSource{ { - ConfigMapRef: &api.ConfigMapEnvSource{ - LocalObjectReference: api.LocalObjectReference{Name: "abc"}, + ConfigMapRef: &corev1.ConfigMapEnvSource{ + LocalObjectReference: corev1.LocalObjectReference{Name: "abc"}, }, }, { Prefix: "pre_", - ConfigMapRef: &api.ConfigMapEnvSource{ - LocalObjectReference: api.LocalObjectReference{Name: "abc"}, + ConfigMapRef: &corev1.ConfigMapEnvSource{ + LocalObjectReference: corev1.LocalObjectReference{Name: "abc"}, }, }, }, @@ -626,12 +627,12 @@ func TestAdmitMirrorPod(t *testing.T) { }, } - pip := &settings.PodPreset{ + pip := &settingsv1alpha1.PodPreset{ ObjectMeta: metav1.ObjectMeta{ Name: "hello", Namespace: "namespace", }, - Spec: settings.PodPresetSpec{ + Spec: settingsv1alpha1.PodPresetSpec{ Selector: metav1.LabelSelector{ MatchExpressions: []metav1.LabelSelectorRequirement{ { @@ -641,18 +642,18 @@ func TestAdmitMirrorPod(t *testing.T) { }, }, }, - Volumes: []api.Volume{{Name: "vol", VolumeSource: api.VolumeSource{EmptyDir: &api.EmptyDirVolumeSource{}}}}, - Env: []api.EnvVar{{Name: "abcd", Value: "value"}, {Name: "ABC", Value: "value"}}, - EnvFrom: []api.EnvFromSource{ + Volumes: []corev1.Volume{{Name: "vol", VolumeSource: corev1.VolumeSource{EmptyDir: &corev1.EmptyDirVolumeSource{}}}}, + Env: []corev1.EnvVar{{Name: "abcd", Value: "value"}, {Name: "ABC", Value: "value"}}, + EnvFrom: []corev1.EnvFromSource{ { - ConfigMapRef: &api.ConfigMapEnvSource{ - LocalObjectReference: api.LocalObjectReference{Name: "abc"}, + ConfigMapRef: &corev1.ConfigMapEnvSource{ + LocalObjectReference: corev1.LocalObjectReference{Name: "abc"}, }, }, { Prefix: "pre_", - ConfigMapRef: &api.ConfigMapEnvSource{ - LocalObjectReference: api.LocalObjectReference{Name: "abc"}, + ConfigMapRef: &corev1.ConfigMapEnvSource{ + LocalObjectReference: corev1.LocalObjectReference{Name: "abc"}, }, }, }, @@ -696,12 +697,12 @@ func TestExclusionNoAdmit(t *testing.T) { }, } - pip := &settings.PodPreset{ + pip := &settingsv1alpha1.PodPreset{ ObjectMeta: metav1.ObjectMeta{ Name: "hello", Namespace: "namespace", }, - Spec: settings.PodPresetSpec{ + Spec: settingsv1alpha1.PodPresetSpec{ Selector: metav1.LabelSelector{ MatchExpressions: []metav1.LabelSelectorRequirement{ { @@ -711,18 +712,18 @@ func TestExclusionNoAdmit(t *testing.T) { }, }, }, - Volumes: []api.Volume{{Name: "vol", VolumeSource: api.VolumeSource{EmptyDir: &api.EmptyDirVolumeSource{}}}}, - Env: []api.EnvVar{{Name: "abcd", Value: "value"}, {Name: "ABC", Value: "value"}}, - EnvFrom: []api.EnvFromSource{ + Volumes: []corev1.Volume{{Name: "vol", VolumeSource: corev1.VolumeSource{EmptyDir: &corev1.EmptyDirVolumeSource{}}}}, + Env: []corev1.EnvVar{{Name: "abcd", Value: "value"}, {Name: "ABC", Value: "value"}}, + EnvFrom: []corev1.EnvFromSource{ { - ConfigMapRef: &api.ConfigMapEnvSource{ - LocalObjectReference: api.LocalObjectReference{Name: "abc"}, + ConfigMapRef: &corev1.ConfigMapEnvSource{ + LocalObjectReference: corev1.LocalObjectReference{Name: "abc"}, }, }, { Prefix: "pre_", - ConfigMapRef: &api.ConfigMapEnvSource{ - LocalObjectReference: api.LocalObjectReference{Name: "abc"}, + ConfigMapRef: &corev1.ConfigMapEnvSource{ + LocalObjectReference: corev1.LocalObjectReference{Name: "abc"}, }, }, }, @@ -760,12 +761,12 @@ func TestAdmitEmptyPodNamespace(t *testing.T) { }, } - pip := &settings.PodPreset{ + pip := &settingsv1alpha1.PodPreset{ ObjectMeta: metav1.ObjectMeta{ Name: "hello", Namespace: "different", // (pod will be submitted to namespace 'namespace') }, - Spec: settings.PodPresetSpec{ + Spec: settingsv1alpha1.PodPresetSpec{ Selector: metav1.LabelSelector{ MatchExpressions: []metav1.LabelSelectorRequirement{ { @@ -775,18 +776,18 @@ func TestAdmitEmptyPodNamespace(t *testing.T) { }, }, }, - Volumes: []api.Volume{{Name: "vol", VolumeSource: api.VolumeSource{EmptyDir: &api.EmptyDirVolumeSource{}}}}, - Env: []api.EnvVar{{Name: "abcd", Value: "value"}, {Name: "ABC", Value: "value"}}, - EnvFrom: []api.EnvFromSource{ + Volumes: []corev1.Volume{{Name: "vol", VolumeSource: corev1.VolumeSource{EmptyDir: &corev1.EmptyDirVolumeSource{}}}}, + Env: []corev1.EnvVar{{Name: "abcd", Value: "value"}, {Name: "ABC", Value: "value"}}, + EnvFrom: []corev1.EnvFromSource{ { - ConfigMapRef: &api.ConfigMapEnvSource{ - LocalObjectReference: api.LocalObjectReference{Name: "abc"}, + ConfigMapRef: &corev1.ConfigMapEnvSource{ + LocalObjectReference: corev1.LocalObjectReference{Name: "abc"}, }, }, { Prefix: "pre_", - ConfigMapRef: &api.ConfigMapEnvSource{ - LocalObjectReference: api.LocalObjectReference{Name: "abc"}, + ConfigMapRef: &corev1.ConfigMapEnvSource{ + LocalObjectReference: corev1.LocalObjectReference{Name: "abc"}, }, }, }, @@ -804,11 +805,11 @@ func TestAdmitEmptyPodNamespace(t *testing.T) { } } -func admitPod(pod *api.Pod, pip *settings.PodPreset) error { +func admitPod(pod *api.Pod, pip *settingsv1alpha1.PodPreset) error { informerFactory := informers.NewSharedInformerFactory(nil, controller.NoResyncPeriodFunc()) - store := informerFactory.Settings().InternalVersion().PodPresets().Informer().GetStore() + store := informerFactory.Settings().V1alpha1().PodPresets().Informer().GetStore() store.Add(pip) - plugin := NewTestAdmission(informerFactory.Settings().InternalVersion().PodPresets().Lister()) + plugin := NewTestAdmission(informerFactory.Settings().V1alpha1().PodPresets().Lister()) attrs := kadmission.NewAttributesRecord( pod, nil,