Skip to content

Commit b169ef9

Browse files
committed
use the upstream admission plugin construction
1 parent 1fcb217 commit b169ef9

File tree

10 files changed

+97
-282
lines changed

10 files changed

+97
-282
lines changed

pkg/assets/apiserver/asset_apiserver.go

+14-17
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@ import (
3232
"github.com/openshift/origin/pkg/cmd/server/crypto"
3333
cmdutil "github.com/openshift/origin/pkg/cmd/util"
3434
oauthutil "github.com/openshift/origin/pkg/oauth/util"
35-
clusterresourceoverrideapi "github.com/openshift/origin/pkg/quota/admission/clusterresourceoverride/api"
3635
"github.com/openshift/origin/pkg/util/httprequest"
3736
oversion "github.com/openshift/origin/pkg/version"
3837
)
@@ -44,8 +43,7 @@ const (
4443
type AssetServerConfig struct {
4544
GenericConfig *genericapiserver.Config
4645

47-
Options oapi.AssetConfig
48-
LimitRequestOverrides *clusterresourceoverrideapi.ClusterResourceOverrideConfig
46+
Options oapi.AssetConfig
4947

5048
PublicURL url.URL
5149
}
@@ -218,20 +216,19 @@ func (c *completedAssetServerConfig) addWebConsoleConfig(serverMux *genericmux.P
218216

219217
// Generated web console config and server version
220218
config := assets.WebConsoleConfig{
221-
APIGroupAddr: masterURL.Host,
222-
APIGroupPrefix: server.APIGroupPrefix,
223-
MasterAddr: masterURL.Host,
224-
MasterPrefix: api.Prefix,
225-
KubernetesAddr: masterURL.Host,
226-
KubernetesPrefix: server.DefaultLegacyAPIPrefix,
227-
OAuthAuthorizeURI: oauthutil.OpenShiftOAuthAuthorizeURL(masterURL.String()),
228-
OAuthTokenURI: oauthutil.OpenShiftOAuthTokenURL(masterURL.String()),
229-
OAuthRedirectBase: c.Options.PublicURL,
230-
OAuthClientID: OpenShiftWebConsoleClientID,
231-
LogoutURI: c.Options.LogoutURL,
232-
LoggingURL: c.Options.LoggingPublicURL,
233-
MetricsURL: c.Options.MetricsPublicURL,
234-
LimitRequestOverrides: c.LimitRequestOverrides,
219+
APIGroupAddr: masterURL.Host,
220+
APIGroupPrefix: server.APIGroupPrefix,
221+
MasterAddr: masterURL.Host,
222+
MasterPrefix: api.Prefix,
223+
KubernetesAddr: masterURL.Host,
224+
KubernetesPrefix: server.DefaultLegacyAPIPrefix,
225+
OAuthAuthorizeURI: oauthutil.OpenShiftOAuthAuthorizeURL(masterURL.String()),
226+
OAuthTokenURI: oauthutil.OpenShiftOAuthTokenURL(masterURL.String()),
227+
OAuthRedirectBase: c.Options.PublicURL,
228+
OAuthClientID: OpenShiftWebConsoleClientID,
229+
LogoutURI: c.Options.LogoutURL,
230+
LoggingURL: c.Options.LoggingPublicURL,
231+
MetricsURL: c.Options.MetricsPublicURL,
235232
}
236233
kVersionInfo := kversion.Get()
237234
oVersionInfo := oversion.Get()

pkg/cmd/server/api/install/install.go

+4
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ import (
55

66
"k8s.io/apimachinery/pkg/api/meta"
77
"k8s.io/apimachinery/pkg/runtime/schema"
8+
"k8s.io/apiserver/pkg/apis/apiserver"
9+
apiserverv1alpha1 "k8s.io/apiserver/pkg/apis/apiserver/v1alpha1"
810
"k8s.io/apiserver/pkg/apis/audit"
911
auditv1alpha1 "k8s.io/apiserver/pkg/apis/audit/v1alpha1"
1012

@@ -33,6 +35,8 @@ func init() {
3335
// policy file inside master-config.yaml
3436
audit.AddToScheme(configapi.Scheme)
3537
auditv1alpha1.AddToScheme(configapi.Scheme)
38+
apiserver.AddToScheme(configapi.Scheme)
39+
apiserverv1alpha1.AddToScheme(configapi.Scheme)
3640
}
3741

3842
func interfacesFor(version schema.GroupVersion) (*meta.VersionInterfaces, error) {

pkg/cmd/server/api/latest/helpers.go

+30
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,9 @@ import (
1111
"github.com/ghodss/yaml"
1212

1313
"k8s.io/apimachinery/pkg/runtime"
14+
"k8s.io/apimachinery/pkg/util/sets"
1415
kyaml "k8s.io/apimachinery/pkg/util/yaml"
16+
"k8s.io/apiserver/pkg/apis/apiserver"
1517

1618
configapi "github.com/openshift/origin/pkg/cmd/server/api"
1719
)
@@ -158,3 +160,31 @@ func IsAdmissionPluginActivated(reader io.Reader, defaultValue bool) (bool, erro
158160

159161
return !activationConfig.Disable, nil
160162
}
163+
164+
func ConvertOpenshiftAdmissionConfigToKubeAdmissionConfig(in map[string]configapi.AdmissionPluginConfig) (*apiserver.AdmissionConfiguration, error) {
165+
ret := &apiserver.AdmissionConfiguration{}
166+
167+
for _, pluginName := range sets.StringKeySet(in).List() {
168+
openshiftConfig := in[pluginName]
169+
170+
fmt.Printf("#### adding for %T\n", openshiftConfig.Configuration)
171+
kubeConfig := apiserver.AdmissionPluginConfiguration{
172+
Name: pluginName,
173+
Path: openshiftConfig.Location,
174+
}
175+
176+
if openshiftConfig.Configuration != nil {
177+
configBytes, err := runtime.Encode(Codec, openshiftConfig.Configuration)
178+
if err != nil {
179+
return nil, err
180+
}
181+
kubeConfig.Configuration = &runtime.Unknown{
182+
Raw: configBytes,
183+
}
184+
}
185+
186+
ret.Plugins = append(ret.Plugins, kubeConfig)
187+
}
188+
189+
return ret, nil
190+
}

pkg/cmd/server/api/latest/latest.go

+5-1
Original file line numberDiff line numberDiff line change
@@ -22,4 +22,8 @@ var OldestVersion = schema.GroupVersion{Group: "", Version: "v1"}
2222
// with a set of versions to choose.
2323
var Versions = []schema.GroupVersion{{Group: "", Version: "v1"}}
2424

25-
var Codec = serializer.NewCodecFactory(configapi.Scheme).LegacyCodec(schema.GroupVersion{Group: "", Version: "v1"})
25+
var Codec = serializer.NewCodecFactory(configapi.Scheme).LegacyCodec(
26+
schema.GroupVersion{Group: "", Version: "v1"},
27+
schema.GroupVersion{Group: "apiserver.k8s.io", Version: "v1alpha1"},
28+
schema.GroupVersion{Group: "audit.k8s.io", Version: "v1alpha1"},
29+
)

pkg/cmd/server/origin/admission/chain_builder.go

+37-32
Original file line numberDiff line numberDiff line change
@@ -5,21 +5,20 @@ import (
55
"io"
66
"io/ioutil"
77
"net"
8+
"os"
89
"reflect"
910

1011
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1112
"k8s.io/apimachinery/pkg/util/sets"
1213
"k8s.io/apiserver/pkg/admission"
1314
"k8s.io/apiserver/pkg/admission/plugin/namespace/lifecycle"
14-
kclientsetinternal "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset"
1515
noderestriction "k8s.io/kubernetes/plugin/pkg/admission/noderestriction"
1616
saadmit "k8s.io/kubernetes/plugin/pkg/admission/serviceaccount"
1717
storageclassdefaultadmission "k8s.io/kubernetes/plugin/pkg/admission/storageclass/setdefault"
1818

1919
oadmission "github.com/openshift/origin/pkg/cmd/server/admission"
2020
configapi "github.com/openshift/origin/pkg/cmd/server/api"
21-
configlatest "github.com/openshift/origin/pkg/cmd/server/api/latest"
22-
"github.com/openshift/origin/pkg/cmd/util/pluginconfig"
21+
configapilatest "github.com/openshift/origin/pkg/cmd/server/api/latest"
2322
imageadmission "github.com/openshift/origin/pkg/image/admission"
2423
imagepolicy "github.com/openshift/origin/pkg/image/admission/imagepolicy/api"
2524
ingressadmission "github.com/openshift/origin/pkg/ingress/admission"
@@ -131,12 +130,36 @@ func fixupAdmissionPlugins(plugins []string) []string {
131130

132131
func NewAdmissionChains(
133132
options configapi.MasterConfig,
134-
kubeClientSet kclientsetinternal.Interface,
135133
admissionInitializer admission.PluginInitializer,
136134
) (admission.Interface, error) {
137135
admissionPluginConfigFilename := ""
138136
if len(options.KubernetesMasterConfig.APIServerArguments["admission-control-config-file"]) > 0 {
139137
admissionPluginConfigFilename = options.KubernetesMasterConfig.APIServerArguments["admission-control-config-file"][0]
138+
139+
} else {
140+
pluginConfig := map[string]configapi.AdmissionPluginConfig{}
141+
for pluginName, config := range options.AdmissionConfig.PluginConfig {
142+
pluginConfig[pluginName] = config
143+
}
144+
upstreamAdmissionConfig, err := configapilatest.ConvertOpenshiftAdmissionConfigToKubeAdmissionConfig(pluginConfig)
145+
if err != nil {
146+
return nil, err
147+
}
148+
configBytes, err := configapilatest.WriteYAML(upstreamAdmissionConfig)
149+
if err != nil {
150+
return nil, err
151+
}
152+
153+
tempFile, err := ioutil.TempFile("", "master-config.yaml")
154+
if err != nil {
155+
return nil, err
156+
}
157+
defer os.Remove(tempFile.Name())
158+
if _, err := tempFile.Write(configBytes); err != nil {
159+
return nil, err
160+
}
161+
tempFile.Close()
162+
admissionPluginConfigFilename = tempFile.Name()
140163
}
141164

142165
admissionPluginNames := combinedAdmissionControlPlugins
@@ -145,13 +168,8 @@ func NewAdmissionChains(
145168
}
146169
admissionPluginNames = fixupAdmissionPlugins(admissionPluginNames)
147170

148-
// if we have a unified chain, build the combined config
149-
pluginConfig := map[string]configapi.AdmissionPluginConfig{}
150-
for pluginName, config := range options.AdmissionConfig.PluginConfig {
151-
pluginConfig[pluginName] = config
152-
}
171+
admissionChain, err := newAdmissionChainFunc(admissionPluginNames, admissionPluginConfigFilename, options, admissionInitializer)
153172

154-
admissionChain, err := newAdmissionChainFunc(admissionPluginNames, admissionPluginConfigFilename, pluginConfig, options, kubeClientSet, admissionInitializer)
155173
if err != nil {
156174
return nil, err
157175
}
@@ -162,12 +180,11 @@ func NewAdmissionChains(
162180
// newAdmissionChainFunc is for unit testing only. You should NEVER OVERRIDE THIS outside of a unit test.
163181
var newAdmissionChainFunc = newAdmissionChain
164182

165-
func newAdmissionChain(pluginNames []string, admissionConfigFilename string, pluginConfig map[string]configapi.AdmissionPluginConfig, options configapi.MasterConfig, kubeClientSet kclientsetinternal.Interface, admissionInitializer admission.PluginInitializer) (admission.Interface, error) {
183+
func newAdmissionChain(pluginNames []string, admissionConfigFilename string, options configapi.MasterConfig, admissionInitializer admission.PluginInitializer) (admission.Interface, error) {
166184
plugins := []admission.Interface{}
167185
for _, pluginName := range pluginNames {
168186
var (
169-
plugin admission.Interface
170-
skipInitialization bool
187+
plugin admission.Interface
171188
)
172189

173190
switch pluginName {
@@ -189,6 +206,7 @@ func newAdmissionChain(pluginNames []string, admissionConfigFilename string, plu
189206
return nil, err
190207
}
191208
plugin = lc
209+
admissionInitializer.Initialize(plugin)
192210

193211
case serviceadmit.ExternalIPPluginName:
194212
// this needs to be moved upstream to be part of core config
@@ -202,6 +220,7 @@ func newAdmissionChain(pluginNames []string, admissionConfigFilename string, plu
202220
allowIngressIP = true
203221
}
204222
plugin = serviceadmit.NewExternalIPRanger(reject, admit, allowIngressIP)
223+
admissionInitializer.Initialize(plugin)
205224

206225
case serviceadmit.RestrictedEndpointsPluginName:
207226
// we need to set some customer parameters, so create by hand
@@ -216,46 +235,32 @@ func newAdmissionChain(pluginNames []string, admissionConfigFilename string, plu
216235
return nil, err
217236
}
218237
plugin = serviceadmit.NewRestrictedEndpointsAdmission(restrictedNetworks)
238+
admissionInitializer.Initialize(plugin)
219239

220240
case saadmit.PluginName:
221241
// we need to set some custom parameters on the service account admission controller, so create that one by hand
222242
saAdmitter := saadmit.NewServiceAccount()
223-
saAdmitter.SetInternalKubeClientSet(kubeClientSet)
224243
saAdmitter.LimitSecretReferences = options.ServiceAccountConfig.LimitSecretReferences
225244
plugin = saAdmitter
245+
admissionInitializer.Initialize(plugin)
226246

227247
default:
228-
configFile, err := pluginconfig.GetAdmissionConfigurationFile(pluginConfig, pluginName, admissionConfigFilename)
229-
if err != nil {
230-
return nil, err
231-
}
232-
configReader, err := admission.ReadAdmissionConfiguration([]string{pluginName}, configFile)
248+
pluginsConfigProvider, err := admission.ReadAdmissionConfiguration([]string{pluginName}, admissionConfigFilename)
233249
if err != nil {
234250
return nil, err
235251
}
236-
pluginConfigReader, err := configReader.ConfigFor(pluginName)
237-
if err != nil {
238-
return nil, err
239-
}
240-
241-
plugin, err = OriginAdmissionPlugins.InitPlugin(pluginName, pluginConfigReader, admissionInitializer)
252+
plugin, err = OriginAdmissionPlugins.NewFromPlugins([]string{pluginName}, pluginsConfigProvider, admissionInitializer)
242253
if err != nil {
243254
// should have been caught with validation
244255
return nil, err
245256
}
246257
if plugin == nil {
247258
continue
248259
}
249-
250-
// skip initialization below because admission.InitPlugin does all the work
251-
skipInitialization = true
252260
}
253261

254262
plugins = append(plugins, plugin)
255263

256-
if !skipInitialization {
257-
admissionInitializer.Initialize(plugin)
258-
}
259264
}
260265

261266
// ensure that plugins have been properly initialized
@@ -307,7 +312,7 @@ func filterEnableAdmissionConfigs(delegate admission.Factory) admission.Factory
307312
}
308313
// if the config isn't a DefaultAdmissionConfig, then assume we're enabled (we were called after all)
309314
// if the config *is* a DefaultAdmissionConfig and it explicitly said
310-
obj, err := configlatest.ReadYAML(config1)
315+
obj, err := configapilatest.ReadYAML(config1)
311316
// if we can't read it, let the plugin deal with it
312317
if err != nil {
313318
return delegate(config2)

pkg/cmd/server/origin/admission/config_test.go

+6-7
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import (
88
"k8s.io/apimachinery/pkg/util/sets"
99
"k8s.io/apiserver/pkg/admission"
1010
"k8s.io/apiserver/pkg/admission/plugin/namespace/lifecycle"
11-
kclientset "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset"
1211

1312
configapi "github.com/openshift/origin/pkg/cmd/server/api"
1413
overrideapi "github.com/openshift/origin/pkg/quota/admission/clusterresourceoverride/api"
@@ -107,14 +106,14 @@ func TestSeparateAdmissionChainDetection(t *testing.T) {
107106
testCases := []struct {
108107
name string
109108
options configapi.MasterConfig
110-
admissionChainBuilder func(pluginNames []string, admissionConfigFilename string, pluginConfig map[string]configapi.AdmissionPluginConfig, options configapi.MasterConfig, kubeClientSet kclientset.Interface, pluginInitializer admission.PluginInitializer) (admission.Interface, error)
109+
admissionChainBuilder func(pluginNames []string, admissionConfigFilename string, options configapi.MasterConfig, pluginInitializer admission.PluginInitializer) (admission.Interface, error)
111110
}{
112111
{
113112
name: "stock everything",
114113
options: configapi.MasterConfig{
115114
KubernetesMasterConfig: &configapi.KubernetesMasterConfig{},
116115
},
117-
admissionChainBuilder: func(pluginNames []string, admissionConfigFilename string, pluginConfig map[string]configapi.AdmissionPluginConfig, options configapi.MasterConfig, kubeClientSet kclientset.Interface, pluginInitializer admission.PluginInitializer) (admission.Interface, error) {
116+
admissionChainBuilder: func(pluginNames []string, admissionConfigFilename string, options configapi.MasterConfig, pluginInitializer admission.PluginInitializer) (admission.Interface, error) {
118117
if !reflect.DeepEqual(pluginNames, combinedAdmissionControlPlugins) {
119118
t.Errorf("%s: expected %v, got %v", "stock everything", combinedAdmissionControlPlugins, pluginNames)
120119
}
@@ -129,7 +128,7 @@ func TestSeparateAdmissionChainDetection(t *testing.T) {
129128
PluginOrderOverride: []string{"foo"},
130129
},
131130
},
132-
admissionChainBuilder: func(pluginNames []string, admissionConfigFilename string, pluginConfig map[string]configapi.AdmissionPluginConfig, options configapi.MasterConfig, kubeClientSet kclientset.Interface, pluginInitializer admission.PluginInitializer) (admission.Interface, error) {
131+
admissionChainBuilder: func(pluginNames []string, admissionConfigFilename string, options configapi.MasterConfig, pluginInitializer admission.PluginInitializer) (admission.Interface, error) {
133132
isKube := reflect.DeepEqual(pluginNames, combinedAdmissionControlPlugins)
134133

135134
expectedOrigin := []string{"foo"}
@@ -151,7 +150,7 @@ func TestSeparateAdmissionChainDetection(t *testing.T) {
151150
},
152151
},
153152
},
154-
admissionChainBuilder: func(pluginNames []string, admissionConfigFilename string, pluginConfig map[string]configapi.AdmissionPluginConfig, options configapi.MasterConfig, kubeClientSet kclientset.Interface, pluginInitializer admission.PluginInitializer) (admission.Interface, error) {
153+
admissionChainBuilder: func(pluginNames []string, admissionConfigFilename string, options configapi.MasterConfig, pluginInitializer admission.PluginInitializer) (admission.Interface, error) {
155154
isKube := reflect.DeepEqual(pluginNames, combinedAdmissionControlPlugins)
156155
isOrigin := reflect.DeepEqual(pluginNames, combinedAdmissionControlPlugins)
157156
if !isKube && !isOrigin {
@@ -172,7 +171,7 @@ func TestSeparateAdmissionChainDetection(t *testing.T) {
172171
},
173172
},
174173
},
175-
admissionChainBuilder: func(pluginNames []string, admissionConfigFilename string, pluginConfig map[string]configapi.AdmissionPluginConfig, options configapi.MasterConfig, kubeClientSet kclientset.Interface, pluginInitializer admission.PluginInitializer) (admission.Interface, error) {
174+
admissionChainBuilder: func(pluginNames []string, admissionConfigFilename string, options configapi.MasterConfig, pluginInitializer admission.PluginInitializer) (admission.Interface, error) {
176175
if !reflect.DeepEqual(pluginNames, combinedAdmissionControlPlugins) {
177176
t.Errorf("%s: expected %v, got %v", "specified, non-conflicting plugin configs 01", combinedAdmissionControlPlugins, pluginNames)
178177
}
@@ -183,7 +182,7 @@ func TestSeparateAdmissionChainDetection(t *testing.T) {
183182

184183
for _, tc := range testCases {
185184
newAdmissionChainFunc = tc.admissionChainBuilder
186-
_, _ = NewAdmissionChains(tc.options, nil, nil)
185+
_, _ = NewAdmissionChains(tc.options, nil)
187186
}
188187
}
189188

0 commit comments

Comments
 (0)