[zh] Sync examples/examples_test.go

pull/49207/head
windsonsea 2024-12-23 11:16:53 +08:00
parent c401c0ccf7
commit 54761e6b3a
1 changed files with 191 additions and 95 deletions

View File

@ -21,12 +21,12 @@ import (
"bytes" "bytes"
"fmt" "fmt"
"io" "io"
"io/ioutil"
"os" "os"
"path/filepath" "path/filepath"
"strings" "strings"
"testing" "testing"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/types"
@ -34,6 +34,9 @@ import (
"k8s.io/apimachinery/pkg/util/yaml" "k8s.io/apimachinery/pkg/util/yaml"
"k8s.io/kubernetes/pkg/api/legacyscheme" "k8s.io/kubernetes/pkg/api/legacyscheme"
"k8s.io/kubernetes/pkg/apis/admissionregistration"
admreg_validation "k8s.io/kubernetes/pkg/apis/admissionregistration/validation"
"k8s.io/kubernetes/pkg/apis/apps" "k8s.io/kubernetes/pkg/apis/apps"
apps_validation "k8s.io/kubernetes/pkg/apis/apps/validation" apps_validation "k8s.io/kubernetes/pkg/apis/apps/validation"
@ -46,6 +49,9 @@ import (
api "k8s.io/kubernetes/pkg/apis/core" api "k8s.io/kubernetes/pkg/apis/core"
"k8s.io/kubernetes/pkg/apis/core/validation" "k8s.io/kubernetes/pkg/apis/core/validation"
// "k8s.io/kubernetes/pkg/apis/flowcontrol"
// flowcontrol_validation "k8s.io/kubernetes/pkg/apis/flowcontrol/validation"
"k8s.io/kubernetes/pkg/apis/networking" "k8s.io/kubernetes/pkg/apis/networking"
networking_validation "k8s.io/kubernetes/pkg/apis/networking/validation" networking_validation "k8s.io/kubernetes/pkg/apis/networking/validation"
@ -59,9 +65,9 @@ import (
storage_validation "k8s.io/kubernetes/pkg/apis/storage/validation" storage_validation "k8s.io/kubernetes/pkg/apis/storage/validation"
"k8s.io/kubernetes/pkg/capabilities" "k8s.io/kubernetes/pkg/capabilities"
"k8s.io/kubernetes/pkg/registry/batch/job"
// 初始化安装包 // 初始化安装包
_ "k8s.io/kubernetes/pkg/apis/admissionregistration/install"
_ "k8s.io/kubernetes/pkg/apis/apps/install" _ "k8s.io/kubernetes/pkg/apis/apps/install"
_ "k8s.io/kubernetes/pkg/apis/autoscaling/install" _ "k8s.io/kubernetes/pkg/apis/autoscaling/install"
_ "k8s.io/kubernetes/pkg/apis/batch/install" _ "k8s.io/kubernetes/pkg/apis/batch/install"
@ -99,6 +105,7 @@ func (g TestGroup) Codec() runtime.Codec {
func initGroups() { func initGroups() {
Groups = make(map[string]TestGroup) Groups = make(map[string]TestGroup)
groupNames := []string{ groupNames := []string{
admissionregistration.GroupName,
api.GroupName, api.GroupName,
apps.GroupName, apps.GroupName,
autoscaling.GroupName, autoscaling.GroupName,
@ -149,20 +156,24 @@ func getCodecForObject(obj runtime.Object) (runtime.Codec, error) {
func validateObject(obj runtime.Object) (errors field.ErrorList) { func validateObject(obj runtime.Object) (errors field.ErrorList) {
podValidationOptions := validation.PodValidationOptions{ podValidationOptions := validation.PodValidationOptions{
AllowDownwardAPIHugePages: true,
AllowInvalidPodDeletionCost: false, AllowInvalidPodDeletionCost: false,
AllowIndivisibleHugePagesValues: true, AllowIndivisibleHugePagesValues: true,
AllowWindowsHostProcessField: true, }
AllowExpandedDNSConfig: true, netValidationOptions := networking_validation.NetworkPolicyValidationOptions{
AllowInvalidLabelValueInSelector: false,
}
pdbValidationOptions := policy_validation.PodDisruptionBudgetValidationOptions{
AllowInvalidLabelValueInSelector: false,
}
clusterroleValidationOptions := rbac_validation.ClusterRoleValidationOptions{
AllowInvalidLabelValueInSelector: false,
} }
quotaValidationOptions := validation.ResourceQuotaValidationOptions{
AllowPodAffinityNamespaceSelector: true,
}
// 为测试启用 CustomPodDNS
// feature.DefaultFeatureGate.Set("CustomPodDNS=true")
switch t := obj.(type) { switch t := obj.(type) {
case *admissionregistration.ValidatingWebhookConfiguration:
errors = admreg_validation.ValidateValidatingWebhookConfiguration(t)
case *admissionregistration.ValidatingAdmissionPolicy:
errors = admreg_validation.ValidateValidatingAdmissionPolicy(t)
case *api.ConfigMap: case *api.ConfigMap:
if t.Namespace == "" { if t.Namespace == "" {
t.Namespace = api.NamespaceDefault t.Namespace = api.NamespaceDefault
@ -181,17 +192,13 @@ func validateObject(obj runtime.Object) (errors field.ErrorList) {
case *api.Namespace: case *api.Namespace:
errors = validation.ValidateNamespace(t) errors = validation.ValidateNamespace(t)
case *api.PersistentVolume: case *api.PersistentVolume:
opts := validation.PersistentVolumeSpecValidationOptions{ opts := validation.PersistentVolumeSpecValidationOptions{}
AllowReadWriteOncePod: true,
}
errors = validation.ValidatePersistentVolume(t, opts) errors = validation.ValidatePersistentVolume(t, opts)
case *api.PersistentVolumeClaim: case *api.PersistentVolumeClaim:
if t.Namespace == "" { if t.Namespace == "" {
t.Namespace = api.NamespaceDefault t.Namespace = api.NamespaceDefault
} }
opts := validation.PersistentVolumeClaimSpecValidationOptions{ opts := validation.PersistentVolumeClaimSpecValidationOptions{}
AllowReadWriteOncePod: true,
}
errors = validation.ValidatePersistentVolumeClaim(t, opts) errors = validation.ValidatePersistentVolumeClaim(t, opts)
case *api.Pod: case *api.Pod:
if t.Namespace == "" { if t.Namespace == "" {
@ -220,7 +227,7 @@ func validateObject(obj runtime.Object) (errors field.ErrorList) {
if t.Namespace == "" { if t.Namespace == "" {
t.Namespace = api.NamespaceDefault t.Namespace = api.NamespaceDefault
} }
errors = validation.ValidateResourceQuota(t, quotaValidationOptions) errors = validation.ValidateResourceQuota(t)
case *api.Secret: case *api.Secret:
if t.Namespace == "" { if t.Namespace == "" {
t.Namespace = api.NamespaceDefault t.Namespace = api.NamespaceDefault
@ -249,22 +256,6 @@ func validateObject(obj runtime.Object) (errors field.ErrorList) {
t.Namespace = api.NamespaceDefault t.Namespace = api.NamespaceDefault
} }
errors = apps_validation.ValidateStatefulSet(t, podValidationOptions) errors = apps_validation.ValidateStatefulSet(t, podValidationOptions)
case *autoscaling.HorizontalPodAutoscaler:
if t.Namespace == "" {
t.Namespace = api.NamespaceDefault
}
errors = autoscaling_validation.ValidateHorizontalPodAutoscaler(t)
case *batch.Job:
if t.Namespace == "" {
t.Namespace = api.NamespaceDefault
}
// Job 需要在校验前调用 generateSelector然后 job.Validate 执行校验。
// 请参阅https://github.com/kubernetes/kubernetes/issues/20951#issuecomment-187787040
t.ObjectMeta.UID = types.UID("fakeuid")
if strings.Index(t.ObjectMeta.Name, "$") > -1 {
t.ObjectMeta.Name = "skip-for-good"
}
errors = job.Strategy.Validate(nil, t)
case *apps.DaemonSet: case *apps.DaemonSet:
if t.Namespace == "" { if t.Namespace == "" {
t.Namespace = api.NamespaceDefault t.Namespace = api.NamespaceDefault
@ -275,51 +266,78 @@ func validateObject(obj runtime.Object) (errors field.ErrorList) {
t.Namespace = api.NamespaceDefault t.Namespace = api.NamespaceDefault
} }
errors = apps_validation.ValidateDeployment(t, podValidationOptions) errors = apps_validation.ValidateDeployment(t, podValidationOptions)
case *apps.ReplicaSet:
if t.Namespace == "" {
t.Namespace = api.NamespaceDefault
}
errors = apps_validation.ValidateReplicaSet(t, podValidationOptions)
case *autoscaling.HorizontalPodAutoscaler:
if t.Namespace == "" {
t.Namespace = api.NamespaceDefault
}
errors = autoscaling_validation.ValidateHorizontalPodAutoscaler(t)
case *batch.CronJob:
if t.Namespace == "" {
t.Namespace = api.NamespaceDefault
}
errors = batch_validation.ValidateCronJobCreate(t, podValidationOptions)
case *batch.Job:
if t.Namespace == "" {
t.Namespace = api.NamespaceDefault
}
// Job 需要在校验前调用 generateSelector然后 job.Validate 执行校验
if strings.Index(t.ObjectMeta.Name, "$") > -1 {
t.ObjectMeta.Name = "skip-for-good"
}
t.ObjectMeta.UID = types.UID("fakeuid")
if t.Spec.Template.ObjectMeta.Labels == nil {
t.Spec.Template.ObjectMeta.Labels = make(map[string]string)
}
t.Spec.Template.ObjectMeta.Labels["controller-uid"] = "fakeuid"
t.Spec.Template.ObjectMeta.Labels["job-name"] = t.ObjectMeta.Name
if t.Spec.Selector == nil {
t.Spec.Selector = &metav1.LabelSelector{
MatchLabels: map[string]string{
"controller-uid": "fakeuid",
"job-name": t.ObjectMeta.Name,
},
}
}
opts := batch_validation.JobValidationOptions{
RequirePrefixedLabels: false,
}
errors = batch_validation.ValidateJob(t, opts)
// case *flowcontrol.FlowSchema:
// TODO这仍然失败
// errors = flowcontrol_validation.ValidateFlowSchema(t)
case *networking.Ingress: case *networking.Ingress:
if t.Namespace == "" { if t.Namespace == "" {
t.Namespace = api.NamespaceDefault t.Namespace = api.NamespaceDefault
} }
errors = networking_validation.ValidateIngressCreate(t) errors = networking_validation.ValidateIngressCreate(t)
case *networking.IngressClass: case *networking.IngressClass:
/*
if t.Namespace == "" {
t.Namespace = api.NamespaceDefault
}
gv := schema.GroupVersion{
Group: networking.GroupName,
Version: legacyscheme.Scheme.PrioritizedVersionsForGroup(networking.GroupName)[0].Version,
}
*/
errors = networking_validation.ValidateIngressClass(t) errors = networking_validation.ValidateIngressClass(t)
case *policy.PodSecurityPolicy:
errors = policy_validation.ValidatePodSecurityPolicy(t)
case *apps.ReplicaSet:
if t.Namespace == "" {
t.Namespace = api.NamespaceDefault
}
errors = apps_validation.ValidateReplicaSet(t, podValidationOptions)
case *batch.CronJob:
if t.Namespace == "" {
t.Namespace = api.NamespaceDefault
}
errors = batch_validation.ValidateCronJob(t, podValidationOptions)
case *networking.NetworkPolicy: case *networking.NetworkPolicy:
if t.Namespace == "" { if t.Namespace == "" {
t.Namespace = api.NamespaceDefault t.Namespace = api.NamespaceDefault
} }
errors = networking_validation.ValidateNetworkPolicy(t) errors = networking_validation.ValidateNetworkPolicy(t, netValidationOptions)
case *policy.PodDisruptionBudget: case *policy.PodDisruptionBudget:
if t.Namespace == "" { if t.Namespace == "" {
t.Namespace = api.NamespaceDefault t.Namespace = api.NamespaceDefault
} }
errors = policy_validation.ValidatePodDisruptionBudget(t) errors = policy_validation.ValidatePodDisruptionBudget(t, pdbValidationOptions)
case *rbac.ClusterRole: case *rbac.ClusterRole:
// ClusterRole 不接受名字空间 // ClusterRole 不接受名字空间
errors = rbac_validation.ValidateClusterRole(t) errors = rbac_validation.ValidateClusterRole(t, clusterroleValidationOptions)
case *rbac.ClusterRoleBinding: case *rbac.ClusterRoleBinding:
// ClusterRoleBinding 不接受名字空间 // ClusterRoleBinding 不接受名字空间
errors = rbac_validation.ValidateClusterRoleBinding(t) errors = rbac_validation.ValidateClusterRoleBinding(t)
case *rbac.RoleBinding:
errors = rbac_validation.ValidateRoleBinding(t)
case *storage.StorageClass: case *storage.StorageClass:
// StorageClass 不接受名字空间 // StorageClass 不接受名字空间
errors = storage_validation.ValidateStorageClass(t) errors = storage_validation.ValidateStorageClass(t)
@ -344,7 +362,7 @@ func walkConfigFiles(inDir string, t *testing.T, fn func(name, path string, data
file := filepath.Base(path) file := filepath.Base(path)
if ext := filepath.Ext(file); ext == ".json" || ext == ".yaml" { if ext := filepath.Ext(file); ext == ".json" || ext == ".yaml" {
data, err := ioutil.ReadFile(path) data, err := os.ReadFile(path)
if err != nil { if err != nil {
return err return err
} }
@ -387,6 +405,18 @@ func TestExampleObjectSchemas(t *testing.T) {
// 请帮助保持映射图中的 alphabeta 顺序 // 请帮助保持映射图中的 alphabeta 顺序
cases := map[string]map[string][]runtime.Object{ cases := map[string]map[string][]runtime.Object{
"access": {
"deployment-replicas-policy": {&admissionregistration.ValidatingAdmissionPolicy{}},
"endpoints-aggregated": {&rbac.ClusterRole{}},
"image-matches-namespace-environment.policy": {&admissionregistration.ValidatingAdmissionPolicy{}},
"validating-admission-policy-audit-annotation": {&admissionregistration.ValidatingAdmissionPolicy{}},
"validating-admission-policy-match-conditions": {&admissionregistration.ValidatingAdmissionPolicy{}},
},
"access/certificate-signing-request": {
"clusterrole-approve": {&rbac.ClusterRole{}},
"clusterrole-create": {&rbac.ClusterRole{}},
"clusterrole-sign": {&rbac.ClusterRole{}},
},
"admin": { "admin": {
"namespace-dev": {&api.Namespace{}}, "namespace-dev": {&api.Namespace{}},
"namespace-prod": {&api.Namespace{}}, "namespace-prod": {&api.Namespace{}},
@ -400,6 +430,7 @@ func TestExampleObjectSchemas(t *testing.T) {
"dns-horizontal-autoscaler": {&api.ServiceAccount{}, &rbac.ClusterRole{}, &rbac.ClusterRoleBinding{}, &apps.Deployment{}}, "dns-horizontal-autoscaler": {&api.ServiceAccount{}, &rbac.ClusterRole{}, &rbac.ClusterRoleBinding{}, &apps.Deployment{}},
"dnsutils": {&api.Pod{}}, "dnsutils": {&api.Pod{}},
}, },
// TODO"admin/konnectivity" 还未被包括进来
"admin/logging": { "admin/logging": {
"fluentd-sidecar-config": {&api.ConfigMap{}}, "fluentd-sidecar-config": {&api.ConfigMap{}},
"two-files-counter-pod": {&api.Pod{}}, "two-files-counter-pod": {&api.Pod{}},
@ -445,7 +476,7 @@ func TestExampleObjectSchemas(t *testing.T) {
}, },
"admin/sched": { "admin/sched": {
"clusterrole": {&rbac.ClusterRole{}}, "clusterrole": {&rbac.ClusterRole{}},
"my-scheduler": {&api.ServiceAccount{}, &rbac.ClusterRoleBinding{}, &rbac.ClusterRoleBinding{}, &api.ConfigMap{}, &apps.Deployment{}}, "my-scheduler": {&api.ServiceAccount{}, &rbac.ClusterRoleBinding{}, &rbac.ClusterRoleBinding{}, &rbac.RoleBinding{}, &api.ConfigMap{}, &apps.Deployment{}},
"pod1": {&api.Pod{}}, "pod1": {&api.Pod{}},
"pod2": {&api.Pod{}}, "pod2": {&api.Pod{}},
"pod3": {&api.Pod{}}, "pod3": {&api.Pod{}},
@ -455,6 +486,7 @@ func TestExampleObjectSchemas(t *testing.T) {
"deployment-patch": {&apps.Deployment{}}, "deployment-patch": {&apps.Deployment{}},
"deployment-retainkeys": {&apps.Deployment{}}, "deployment-retainkeys": {&apps.Deployment{}},
"deployment-scale": {&apps.Deployment{}}, "deployment-scale": {&apps.Deployment{}},
"deployment-sidecar": {&apps.Deployment{}},
"deployment-update": {&apps.Deployment{}}, "deployment-update": {&apps.Deployment{}},
"nginx-app": {&api.Service{}, &apps.Deployment{}}, "nginx-app": {&api.Service{}, &apps.Deployment{}},
"nginx-with-request": {&apps.Deployment{}}, "nginx-with-request": {&apps.Deployment{}},
@ -478,24 +510,27 @@ func TestExampleObjectSchemas(t *testing.T) {
"application/hpa": { "application/hpa": {
"php-apache": {&autoscaling.HorizontalPodAutoscaler{}}, "php-apache": {&autoscaling.HorizontalPodAutoscaler{}},
}, },
"application/nginx": {
"nginx-deployment": {&apps.Deployment{}},
"nginx-svc": {&api.Service{}},
},
"application/job": { "application/job": {
"cronjob": {&batch.CronJob{}}, "cronjob": {&batch.CronJob{}},
"job-sidecar": {&batch.Job{}},
"job-tmpl": {&batch.Job{}}, "job-tmpl": {&batch.Job{}},
"indexed-job": {&batch.Job{}}, "indexed-job": {&batch.Job{}},
"indexed-job-vol": {&batch.Job{}}, "indexed-job-vol": {&batch.Job{}},
}, },
"application/job/rabbitmq": { "application/job/rabbitmq": {
"job": {&batch.Job{}}, "job": {&batch.Job{}},
"rabbitmq-statefulset": {&apps.StatefulSet{}},
"rabbitmq-service": {&api.Service{}},
}, },
"application/job/redis": { "application/job/redis": {
"job": {&batch.Job{}}, "job": {&batch.Job{}},
"redis-pod": {&api.Pod{}}, "redis-pod": {&api.Pod{}},
"redis-service": {&api.Service{}}, "redis-service": {&api.Service{}},
}, },
"application/mongodb": {
"mongo-deployment": {&apps.Deployment{}},
"mongo-service": {&api.Service{}},
},
"application/mysql": { "application/mysql": {
"mysql-configmap": {&api.ConfigMap{}}, "mysql-configmap": {&api.ConfigMap{}},
"mysql-deployment": {&api.Service{}, &apps.Deployment{}}, "mysql-deployment": {&api.Service{}, &apps.Deployment{}},
@ -503,6 +538,14 @@ func TestExampleObjectSchemas(t *testing.T) {
"mysql-services": {&api.Service{}, &api.Service{}}, "mysql-services": {&api.Service{}, &api.Service{}},
"mysql-statefulset": {&apps.StatefulSet{}}, "mysql-statefulset": {&apps.StatefulSet{}},
}, },
"application/nginx": {
"nginx-deployment": {&apps.Deployment{}},
"nginx-svc": {&api.Service{}},
},
"application/ssa": {
"nginx-deployment": {&apps.Deployment{}},
"nginx-deployment-no-replicas": {&apps.Deployment{}},
},
"application/web": { "application/web": {
"web": {&api.Service{}, &apps.StatefulSet{}}, "web": {&api.Service{}, &apps.StatefulSet{}},
"web-parallel": {&api.Service{}, &apps.StatefulSet{}}, "web-parallel": {&api.Service{}, &apps.StatefulSet{}},
@ -514,17 +557,33 @@ func TestExampleObjectSchemas(t *testing.T) {
"application/zookeeper": { "application/zookeeper": {
"zookeeper": {&api.Service{}, &api.Service{}, &policy.PodDisruptionBudget{}, &apps.StatefulSet{}}, "zookeeper": {&api.Service{}, &api.Service{}, &policy.PodDisruptionBudget{}, &apps.StatefulSet{}},
}, },
"concepts/policy/limit-range": {
"example-conflict-with-limitrange-cpu": {&api.Pod{}},
"problematic-limit-range": {&api.LimitRange{}},
"example-no-conflict-with-limitrange-cpu": {&api.Pod{}},
},
"configmap": { "configmap": {
"configmaps": {&api.ConfigMap{}, &api.ConfigMap{}}, "configmaps": {&api.ConfigMap{}, &api.ConfigMap{}},
"configmap-multikeys": {&api.ConfigMap{}}, "configmap-multikeys": {&api.ConfigMap{}},
"configure-pod": {&api.Pod{}},
"env-configmap": {&api.Pod{}},
"immutable-configmap": {&api.ConfigMap{}},
"new-immutable-configmap": {&api.ConfigMap{}},
}, },
"controllers": { "controllers": {
"daemonset": {&apps.DaemonSet{}}, "daemonset": {&apps.DaemonSet{}},
"daemonset-label-selector": {&apps.DaemonSet{}},
"fluentd-daemonset": {&apps.DaemonSet{}}, "fluentd-daemonset": {&apps.DaemonSet{}},
"fluentd-daemonset-update": {&apps.DaemonSet{}}, "fluentd-daemonset-update": {&apps.DaemonSet{}},
"frontend": {&apps.ReplicaSet{}}, "frontend": {&apps.ReplicaSet{}},
"hpa-rs": {&autoscaling.HorizontalPodAutoscaler{}}, "hpa-rs": {&autoscaling.HorizontalPodAutoscaler{}},
"job": {&batch.Job{}}, "job": {&batch.Job{}},
"job-backoff-limit-per-index-example": {&batch.Job{}},
"job-pod-failure-policy-config-issue": {&batch.Job{}},
"job-pod-failure-policy-example": {&batch.Job{}},
"job-pod-failure-policy-failjob": {&batch.Job{}},
"job-pod-failure-policy-ignore": {&batch.Job{}},
"job-success-policy": {&batch.Job{}},
"replicaset": {&apps.ReplicaSet{}}, "replicaset": {&apps.ReplicaSet{}},
"replication": {&api.ReplicationController{}}, "replication": {&api.ReplicationController{}},
"replication-nginx-1.14.2": {&api.ReplicationController{}}, "replication-nginx-1.14.2": {&api.ReplicationController{}},
@ -533,6 +592,7 @@ func TestExampleObjectSchemas(t *testing.T) {
}, },
"debug": { "debug": {
"counter-pod": {&api.Pod{}}, "counter-pod": {&api.Pod{}},
"counter-pod-err": {&api.Pod{}},
"event-exporter": {&api.ServiceAccount{}, &rbac.ClusterRoleBinding{}, &apps.Deployment{}}, "event-exporter": {&api.ServiceAccount{}, &rbac.ClusterRoleBinding{}, &apps.Deployment{}},
"fluentd-gcp-configmap": {&api.ConfigMap{}}, "fluentd-gcp-configmap": {&api.ConfigMap{}},
"fluentd-gcp-ds": {&apps.DaemonSet{}}, "fluentd-gcp-ds": {&apps.DaemonSet{}},
@ -542,6 +602,7 @@ func TestExampleObjectSchemas(t *testing.T) {
}, },
"pods": { "pods": {
"commands": {&api.Pod{}}, "commands": {&api.Pod{}},
"image-volumes": {&api.Pod{}},
"init-containers": {&api.Pod{}}, "init-containers": {&api.Pod{}},
"lifecycle-events": {&api.Pod{}}, "lifecycle-events": {&api.Pod{}},
"pod-configmap-env-var-valueFrom": {&api.Pod{}}, "pod-configmap-env-var-valueFrom": {&api.Pod{}},
@ -556,14 +617,17 @@ func TestExampleObjectSchemas(t *testing.T) {
"pod-projected-svc-token": {&api.Pod{}}, "pod-projected-svc-token": {&api.Pod{}},
"pod-rs": {&api.Pod{}, &api.Pod{}}, "pod-rs": {&api.Pod{}, &api.Pod{}},
"pod-single-configmap-env-variable": {&api.Pod{}}, "pod-single-configmap-env-variable": {&api.Pod{}},
"pod-with-affinity-anti-affinity": {&api.Pod{}}, "pod-with-affinity-preferred-weight": {&api.Pod{}},
"pod-with-node-affinity": {&api.Pod{}}, "pod-with-node-affinity": {&api.Pod{}},
"pod-with-pod-affinity": {&api.Pod{}}, "pod-with-pod-affinity": {&api.Pod{}},
"pod-with-scheduling-gates": {&api.Pod{}},
"pod-with-toleration": {&api.Pod{}}, "pod-with-toleration": {&api.Pod{}},
"pod-without-scheduling-gates": {&api.Pod{}},
"private-reg-pod": {&api.Pod{}}, "private-reg-pod": {&api.Pod{}},
"share-process-namespace": {&api.Pod{}}, "share-process-namespace": {&api.Pod{}},
"simple-pod": {&api.Pod{}}, "simple-pod": {&api.Pod{}},
"two-container-pod": {&api.Pod{}}, "two-container-pod": {&api.Pod{}},
"user-namespaces-stateless": {&api.Pod{}},
}, },
"pods/config": { "pods/config": {
"redis-pod": {&api.Pod{}}, "redis-pod": {&api.Pod{}},
@ -596,6 +660,7 @@ func TestExampleObjectSchemas(t *testing.T) {
"qos-pod-2": {&api.Pod{}}, "qos-pod-2": {&api.Pod{}},
"qos-pod-3": {&api.Pod{}}, "qos-pod-3": {&api.Pod{}},
"qos-pod-4": {&api.Pod{}}, "qos-pod-4": {&api.Pod{}},
"qos-pod-5": {&api.Pod{}},
}, },
"pods/resource": { "pods/resource": {
"cpu-request-limit": {&api.Pod{}}, "cpu-request-limit": {&api.Pod{}},
@ -605,6 +670,9 @@ func TestExampleObjectSchemas(t *testing.T) {
"memory-request-limit": {&api.Pod{}}, "memory-request-limit": {&api.Pod{}},
"memory-request-limit-2": {&api.Pod{}}, "memory-request-limit-2": {&api.Pod{}},
"memory-request-limit-3": {&api.Pod{}}, "memory-request-limit-3": {&api.Pod{}},
"pod-level-cpu-request-limit": {&api.Pod{}},
"pod-level-memory-request-limit": {&api.Pod{}},
"pod-level-resources": {&api.Pod{}},
}, },
"pods/security": { "pods/security": {
"hello-apparmor": {&api.Pod{}}, "hello-apparmor": {&api.Pod{}},
@ -612,6 +680,8 @@ func TestExampleObjectSchemas(t *testing.T) {
"security-context-2": {&api.Pod{}}, "security-context-2": {&api.Pod{}},
"security-context-3": {&api.Pod{}}, "security-context-3": {&api.Pod{}},
"security-context-4": {&api.Pod{}}, "security-context-4": {&api.Pod{}},
"security-context-5": {&api.Pod{}},
"security-context-6": {&api.Pod{}},
}, },
"pods/storage": { "pods/storage": {
"projected": {&api.Pod{}}, "projected": {&api.Pod{}},
@ -623,19 +693,37 @@ func TestExampleObjectSchemas(t *testing.T) {
"pv-pod": {&api.Pod{}}, "pv-pod": {&api.Pod{}},
"pv-volume": {&api.PersistentVolume{}}, "pv-volume": {&api.PersistentVolume{}},
"redis": {&api.Pod{}}, "redis": {&api.Pod{}},
"projected-clustertrustbundle": {&api.Pod{}},
},
"pods/topology-spread-constraints": {
"one-constraint": {&api.Pod{}},
"one-constraint-with-nodeaffinity": {&api.Pod{}},
"two-constraints": {&api.Pod{}},
}, },
"policy": { "policy": {
"baseline-psp": {&policy.PodSecurityPolicy{}},
"example-psp": {&policy.PodSecurityPolicy{}},
"priority-class-resourcequota": {&api.ResourceQuota{}}, "priority-class-resourcequota": {&api.ResourceQuota{}},
"privileged-psp": {&policy.PodSecurityPolicy{}},
"restricted-psp": {&policy.PodSecurityPolicy{}},
"zookeeper-pod-disruption-budget-maxunavailable": {&policy.PodDisruptionBudget{}}, "zookeeper-pod-disruption-budget-maxunavailable": {&policy.PodDisruptionBudget{}},
"zookeeper-pod-disruption-budget-minavailable": {&policy.PodDisruptionBudget{}}, "zookeeper-pod-disruption-budget-minavailable": {&policy.PodDisruptionBudget{}},
}, },
/* TODO
"priority-and-fairness": {
"health-for-strangers": {&flowcontrol.FlowSchema{}},
},
*/
"secret/serviceaccount": {
"mysecretname": {&api.Secret{}},
},
"security": {
"example-baseline-pod": {&api.Pod{}},
"podsecurity-baseline": {&api.Namespace{}},
"podsecurity-privileged": {&api.Namespace{}},
"podsecurity-restricted": {&api.Namespace{}},
},
"service": { "service": {
"nginx-service": {&api.Service{}}, "nginx-service": {&api.Service{}},
"load-balancer-example": {&apps.Deployment{}}, "load-balancer-example": {&apps.Deployment{}},
"pod-with-graceful-termination": {&apps.Deployment{}},
"explore-graceful-termination-nginx": {&api.Service{}},
}, },
"service/access": { "service/access": {
"backend-deployment": {&apps.Deployment{}}, "backend-deployment": {&apps.Deployment{}},
@ -664,6 +752,7 @@ func TestExampleObjectSchemas(t *testing.T) {
"name-virtual-host-ingress-no-third-host": {&networking.Ingress{}}, "name-virtual-host-ingress-no-third-host": {&networking.Ingress{}},
"namespaced-params": {&networking.IngressClass{}}, "namespaced-params": {&networking.IngressClass{}},
"networkpolicy": {&networking.NetworkPolicy{}}, "networkpolicy": {&networking.NetworkPolicy{}},
"networkpolicy-multiport-egress": {&networking.NetworkPolicy{}},
"network-policy-allow-all-egress": {&networking.NetworkPolicy{}}, "network-policy-allow-all-egress": {&networking.NetworkPolicy{}},
"network-policy-allow-all-ingress": {&networking.NetworkPolicy{}}, "network-policy-allow-all-ingress": {&networking.NetworkPolicy{}},
"network-policy-default-deny-egress": {&networking.NetworkPolicy{}}, "network-policy-default-deny-egress": {&networking.NetworkPolicy{}},
@ -696,8 +785,15 @@ func TestExampleObjectSchemas(t *testing.T) {
"audit": { "audit": {
"audit-policy": true, "audit-policy": true,
}, },
// PSP 在 v1.29 中被移除,不校验它们
"policy": {
"baseline-psp": true,
"example-psp": true,
"privileged-psp": true,
"restricted-psp": true,
},
} }
capabilities.SetForTests(capabilities.Capabilities{ capabilities.Initialize(capabilities.Capabilities{
AllowPrivileged: true, AllowPrivileged: true,
}) })