|
| 1 | +package admissionenablement |
| 2 | + |
| 3 | +import ( |
| 4 | + "k8s.io/apimachinery/pkg/util/sets" |
| 5 | + "k8s.io/apiserver/pkg/admission" |
| 6 | + "k8s.io/apiserver/pkg/admission/plugin/resourcequota" |
| 7 | + mutatingwebhook "k8s.io/apiserver/pkg/admission/plugin/webhook/mutating" |
| 8 | + |
| 9 | + "github.com/openshift/apiserver-library-go/pkg/admission/imagepolicy" |
| 10 | + imagepolicyapiv1 "github.com/openshift/apiserver-library-go/pkg/admission/imagepolicy/apis/imagepolicy/v1" |
| 11 | + quotaclusterresourcequota "github.com/openshift/apiserver-library-go/pkg/admission/quota/clusterresourcequota" |
| 12 | + "github.com/openshift/apiserver-library-go/pkg/securitycontextconstraints/sccadmission" |
| 13 | + authorizationrestrictusers "k8s.io/kubernetes/openshift-kube-apiserver/admission/authorization/restrictusers" |
| 14 | + quotaclusterresourceoverride "k8s.io/kubernetes/openshift-kube-apiserver/admission/autoscaling/clusterresourceoverride" |
| 15 | + "k8s.io/kubernetes/openshift-kube-apiserver/admission/autoscaling/managednode" |
| 16 | + "k8s.io/kubernetes/openshift-kube-apiserver/admission/autoscaling/managementcpusoverride" |
| 17 | + quotarunonceduration "k8s.io/kubernetes/openshift-kube-apiserver/admission/autoscaling/runonceduration" |
| 18 | + "k8s.io/kubernetes/openshift-kube-apiserver/admission/customresourcevalidation/customresourcevalidationregistration" |
| 19 | + "k8s.io/kubernetes/openshift-kube-apiserver/admission/network/externalipranger" |
| 20 | + "k8s.io/kubernetes/openshift-kube-apiserver/admission/network/restrictedendpoints" |
| 21 | + ingressadmission "k8s.io/kubernetes/openshift-kube-apiserver/admission/route" |
| 22 | + "k8s.io/kubernetes/openshift-kube-apiserver/admission/route/hostassignment" |
| 23 | + projectnodeenv "k8s.io/kubernetes/openshift-kube-apiserver/admission/scheduler/nodeenv" |
| 24 | + schedulerpodnodeconstraints "k8s.io/kubernetes/openshift-kube-apiserver/admission/scheduler/podnodeconstraints" |
| 25 | + "k8s.io/kubernetes/openshift-kube-apiserver/admission/storage/csiinlinevolumesecurity" |
| 26 | +) |
| 27 | + |
| 28 | +func RegisterOpenshiftKubeAdmissionPlugins(plugins *admission.Plugins) { |
| 29 | + authorizationrestrictusers.Register(plugins) |
| 30 | + hostassignment.Register(plugins) |
| 31 | + imagepolicy.Register(plugins) |
| 32 | + ingressadmission.Register(plugins) |
| 33 | + managementcpusoverride.Register(plugins) |
| 34 | + managednode.Register(plugins) |
| 35 | + projectnodeenv.Register(plugins) |
| 36 | + quotaclusterresourceoverride.Register(plugins) |
| 37 | + quotaclusterresourcequota.Register(plugins) |
| 38 | + quotarunonceduration.Register(plugins) |
| 39 | + schedulerpodnodeconstraints.Register(plugins) |
| 40 | + sccadmission.Register(plugins) |
| 41 | + sccadmission.RegisterSCCExecRestrictions(plugins) |
| 42 | + externalipranger.RegisterExternalIP(plugins) |
| 43 | + restrictedendpoints.RegisterRestrictedEndpoints(plugins) |
| 44 | + csiinlinevolumesecurity.Register(plugins) |
| 45 | +} |
| 46 | + |
| 47 | +var ( |
| 48 | + |
| 49 | + // these are admission plugins that cannot be applied until after the kubeapiserver starts. |
| 50 | + // TODO if nothing comes to mind in 3.10, kill this |
| 51 | + SkipRunLevelZeroPlugins = sets.NewString() |
| 52 | + // these are admission plugins that cannot be applied until after the openshiftapiserver apiserver starts. |
| 53 | + SkipRunLevelOnePlugins = sets.NewString( |
| 54 | + imagepolicyapiv1.PluginName, // "image.openshift.io/ImagePolicy" |
| 55 | + "quota.openshift.io/ClusterResourceQuota", |
| 56 | + "security.openshift.io/SecurityContextConstraint", |
| 57 | + "security.openshift.io/SCCExecRestrictions", |
| 58 | + ) |
| 59 | + |
| 60 | + // openshiftAdmissionPluginsForKubeBeforeMutating are the admission plugins to add after kube admission, before mutating webhooks |
| 61 | + openshiftAdmissionPluginsForKubeBeforeMutating = []string{ |
| 62 | + "autoscaling.openshift.io/ClusterResourceOverride", |
| 63 | + managementcpusoverride.PluginName, // "autoscaling.openshift.io/ManagementCPUsOverride" |
| 64 | + "authorization.openshift.io/RestrictSubjectBindings", |
| 65 | + "autoscaling.openshift.io/RunOnceDuration", |
| 66 | + "scheduling.openshift.io/PodNodeConstraints", |
| 67 | + "scheduling.openshift.io/OriginPodNodeEnvironment", |
| 68 | + "network.openshift.io/ExternalIPRanger", |
| 69 | + "network.openshift.io/RestrictedEndpointsAdmission", |
| 70 | + imagepolicyapiv1.PluginName, // "image.openshift.io/ImagePolicy" |
| 71 | + "security.openshift.io/SecurityContextConstraint", |
| 72 | + "security.openshift.io/SCCExecRestrictions", |
| 73 | + "route.openshift.io/IngressAdmission", |
| 74 | + hostassignment.PluginName, // "route.openshift.io/RouteHostAssignment" |
| 75 | + csiinlinevolumesecurity.PluginName, // "storage.openshift.io/CSIInlineVolumeSecurity" |
| 76 | + managednode.PluginName, // "autoscaling.openshift.io/ManagedNode" |
| 77 | + } |
| 78 | + |
| 79 | + // openshiftAdmissionPluginsForKubeAfterResourceQuota are the plugins to add after ResourceQuota plugin |
| 80 | + openshiftAdmissionPluginsForKubeAfterResourceQuota = []string{ |
| 81 | + "quota.openshift.io/ClusterResourceQuota", |
| 82 | + } |
| 83 | + |
| 84 | + // additionalDefaultOnPlugins is a list of plugins we turn on by default that core kube does not. |
| 85 | + additionalDefaultOnPlugins = sets.NewString( |
| 86 | + "NodeRestriction", |
| 87 | + "OwnerReferencesPermissionEnforcement", |
| 88 | + "PodNodeSelector", |
| 89 | + "PodTolerationRestriction", |
| 90 | + "Priority", |
| 91 | + imagepolicyapiv1.PluginName, // "image.openshift.io/ImagePolicy" |
| 92 | + "StorageObjectInUseProtection", |
| 93 | + ) |
| 94 | +) |
| 95 | + |
| 96 | +func NewOrderedKubeAdmissionPlugins(kubeAdmissionOrder []string) []string { |
| 97 | + ret := []string{} |
| 98 | + for _, curr := range kubeAdmissionOrder { |
| 99 | + if curr == mutatingwebhook.PluginName { |
| 100 | + ret = append(ret, openshiftAdmissionPluginsForKubeBeforeMutating...) |
| 101 | + ret = append(ret, customresourcevalidationregistration.AllCustomResourceValidators...) |
| 102 | + } |
| 103 | + |
| 104 | + ret = append(ret, curr) |
| 105 | + |
| 106 | + if curr == resourcequota.PluginName { |
| 107 | + ret = append(ret, openshiftAdmissionPluginsForKubeAfterResourceQuota...) |
| 108 | + } |
| 109 | + } |
| 110 | + return ret |
| 111 | +} |
| 112 | + |
| 113 | +func NewDefaultOffPluginsFunc(kubeDefaultOffAdmission sets.Set[string]) func() sets.Set[string] { |
| 114 | + return func() sets.Set[string] { |
| 115 | + kubeOff := sets.New[string](kubeDefaultOffAdmission.UnsortedList()...) |
| 116 | + kubeOff.Delete(additionalDefaultOnPlugins.List()...) |
| 117 | + kubeOff.Delete(openshiftAdmissionPluginsForKubeBeforeMutating...) |
| 118 | + kubeOff.Delete(openshiftAdmissionPluginsForKubeAfterResourceQuota...) |
| 119 | + kubeOff.Delete(customresourcevalidationregistration.AllCustomResourceValidators...) |
| 120 | + return kubeOff |
| 121 | + } |
| 122 | +} |
0 commit comments