Browse code

API group enablement for master/controllers

Addresses comments on 030269d5483fa1ca0dd0a7d55806310d864c4751

Jordan Liggitt authored on 2016/01/26 20:06:45
Showing 7 changed files
... ...
@@ -9,6 +9,7 @@ import (
9 9
 	"strings"
10 10
 	"time"
11 11
 
12
+	"k8s.io/kubernetes/pkg/api/unversioned"
12 13
 	kclient "k8s.io/kubernetes/pkg/client/unversioned"
13 14
 	"k8s.io/kubernetes/pkg/client/unversioned/clientcmd"
14 15
 	kubeletclient "k8s.io/kubernetes/pkg/kubelet/client"
... ...
@@ -517,3 +518,15 @@ func GetEnabledAPIVersionsForGroup(config KubernetesMasterConfig, apiGroup strin
517 517
 
518 518
 	return enabledVersions
519 519
 }
520
+
521
+// GetDisabledAPIVersionsForGroup returns the list of API Versions that are disabled for that group
522
+func GetDisabledAPIVersionsForGroup(config KubernetesMasterConfig, apiGroup string) []string {
523
+	allowedVersions := sets.NewString(KubeAPIGroupsToAllowedVersions[apiGroup]...)
524
+	enabledVersions := sets.NewString(GetEnabledAPIVersionsForGroup(config, apiGroup)...)
525
+	return allowedVersions.Difference(enabledVersions).List()
526
+}
527
+
528
+func HasKubernetesAPIVersion(config KubernetesMasterConfig, groupVersion unversioned.GroupVersion) bool {
529
+	enabledVersions := GetEnabledAPIVersionsForGroup(config, groupVersion.Group)
530
+	return sets.NewString(enabledVersions...).Has(groupVersion.Version)
531
+}
... ...
@@ -10,10 +10,16 @@ import (
10 10
 	"github.com/golang/glog"
11 11
 
12 12
 	osclient "github.com/openshift/origin/pkg/client"
13
+	configapi "github.com/openshift/origin/pkg/cmd/server/api"
14
+
13 15
 	kctrlmgr "k8s.io/kubernetes/cmd/kube-controller-manager/app"
14 16
 	kapi "k8s.io/kubernetes/pkg/api"
17
+	"k8s.io/kubernetes/pkg/api/unversioned"
18
+	"k8s.io/kubernetes/pkg/api/v1"
19
+	extv1beta1 "k8s.io/kubernetes/pkg/apis/extensions/v1beta1"
15 20
 	"k8s.io/kubernetes/pkg/client/record"
16 21
 	client "k8s.io/kubernetes/pkg/client/unversioned"
22
+	"k8s.io/kubernetes/pkg/controller"
17 23
 	endpointcontroller "k8s.io/kubernetes/pkg/controller/endpoint"
18 24
 	jobcontroller "k8s.io/kubernetes/pkg/controller/job"
19 25
 	namespacecontroller "k8s.io/kubernetes/pkg/controller/namespace"
... ...
@@ -55,11 +61,11 @@ func (c *MasterConfig) InstallAPI(container *restful.Container) []string {
55 55
 	_ = master.New(c.Master)
56 56
 
57 57
 	messages := []string{}
58
-	if !c.Master.DisableV1 {
58
+	if configapi.HasKubernetesAPIVersion(c.Options, v1.SchemeGroupVersion) {
59 59
 		messages = append(messages, fmt.Sprintf("Started Kubernetes API at %%s%s", KubeAPIPrefixV1))
60 60
 	}
61 61
 
62
-	if c.Master.EnableExp {
62
+	if configapi.HasKubernetesAPIVersion(c.Options, extv1beta1.SchemeGroupVersion) {
63 63
 		messages = append(messages, fmt.Sprintf("Started Kubernetes API Extensions at %%s%s", KubeAPIExtensionsPrefixV1beta1))
64 64
 	}
65 65
 
... ...
@@ -68,10 +74,15 @@ func (c *MasterConfig) InstallAPI(container *restful.Container) []string {
68 68
 
69 69
 // RunNamespaceController starts the Kubernetes Namespace Manager
70 70
 func (c *MasterConfig) RunNamespaceController() {
71
-	// we now have several of the kube "experimental" pieces enabled in Origin, so this needs to be
72
-	// enabled whenever we have the "experimental" APIs enabled.
73
-	experimentalMode := c.Master.EnableExp
74
-	namespaceController := namespacecontroller.NewNamespaceController(c.KubeClient, experimentalMode, c.ControllerManager.NamespaceSyncPeriod)
71
+	versions := []string{}
72
+	for _, version := range configapi.GetEnabledAPIVersionsForGroup(c.Options, configapi.APIGroupKube) {
73
+		versions = append(versions, unversioned.GroupVersion{Group: configapi.APIGroupKube, Version: version}.String())
74
+	}
75
+	for _, version := range configapi.GetEnabledAPIVersionsForGroup(c.Options, configapi.APIGroupExtensions) {
76
+		versions = append(versions, unversioned.GroupVersion{Group: configapi.APIGroupExtensions, Version: version}.String())
77
+	}
78
+	apiVersions := &unversioned.APIVersions{Versions: versions}
79
+	namespaceController := namespacecontroller.NewNamespaceController(c.KubeClient, apiVersions, c.ControllerManager.NamespaceSyncPeriod)
75 80
 	namespaceController.Run()
76 81
 }
77 82
 
... ...
@@ -11,19 +11,23 @@ import (
11 11
 
12 12
 	"github.com/golang/glog"
13 13
 
14
+	etcdclient "github.com/coreos/go-etcd/etcd"
15
+
14 16
 	"k8s.io/kubernetes/cmd/kube-apiserver/app"
15 17
 	cmapp "k8s.io/kubernetes/cmd/kube-controller-manager/app"
16 18
 	"k8s.io/kubernetes/pkg/admission"
17 19
 	kapi "k8s.io/kubernetes/pkg/api"
18 20
 	kapilatest "k8s.io/kubernetes/pkg/api/latest"
21
+	"k8s.io/kubernetes/pkg/api/unversioned"
19 22
 	"k8s.io/kubernetes/pkg/apiserver"
20 23
 	kclient "k8s.io/kubernetes/pkg/client/unversioned"
21 24
 	"k8s.io/kubernetes/pkg/cloudprovider"
22 25
 	kubeletclient "k8s.io/kubernetes/pkg/kubelet/client"
23 26
 	"k8s.io/kubernetes/pkg/master"
27
+	"k8s.io/kubernetes/pkg/storage"
28
+	etcdstorage "k8s.io/kubernetes/pkg/storage/etcd"
24 29
 	"k8s.io/kubernetes/pkg/util"
25 30
 	kerrors "k8s.io/kubernetes/pkg/util/errors"
26
-	"k8s.io/kubernetes/pkg/util/sets"
27 31
 	"k8s.io/kubernetes/pkg/util/intstr"
28 32
 	saadmit "k8s.io/kubernetes/plugin/pkg/admission/serviceaccount"
29 33
 
... ...
@@ -186,9 +190,9 @@ func BuildKubernetesMasterConfig(options configapi.MasterConfig, requestContextM
186 186
 	storageVersions := map[string]string{}
187 187
 
188 188
 	enabledKubeVersions := configapi.GetEnabledAPIVersionsForGroup(*options.KubernetesMasterConfig, configapi.APIGroupKube)
189
-	enabledKubeVersionSet := sets.NewString(enabledKubeVersions...)
190 189
 	if len(enabledKubeVersions) > 0 {
191
-		databaseStorage, err := master.NewEtcdStorage(etcdClient, kapilatest.InterfacesForLegacyGroup, options.EtcdStorageConfig.KubernetesStorageVersion, options.EtcdStorageConfig.KubernetesStoragePrefix)
190
+		kubeStorageVersion := unversioned.GroupVersion{Group: configapi.APIGroupKube, Version: options.EtcdStorageConfig.KubernetesStorageVersion}
191
+		databaseStorage, err := NewEtcdStorage(etcdClient, kubeStorageVersion, options.EtcdStorageConfig.KubernetesStoragePrefix)
192 192
 		if err != nil {
193 193
 			return nil, fmt.Errorf("Error setting up Kubernetes server storage: %v", err)
194 194
 		}
... ...
@@ -203,7 +207,7 @@ func BuildKubernetesMasterConfig(options configapi.MasterConfig, requestContextM
203 203
 			return nil, fmt.Errorf("Error setting up Kubernetes extensions server storage: %v", err)
204 204
 		}
205 205
 		// TODO expose storage version options for api groups
206
-		databaseStorage, err := master.NewEtcdStorage(etcdClient, groupMeta.InterfacesFor, groupMeta.GroupVersion, options.EtcdStorageConfig.KubernetesStoragePrefix)
206
+		databaseStorage, err := NewEtcdStorage(etcdClient, groupMeta.GroupVersion, options.EtcdStorageConfig.KubernetesStoragePrefix)
207 207
 		if err != nil {
208 208
 			return nil, fmt.Errorf("Error setting up Kubernetes extensions server storage: %v", err)
209 209
 		}
... ...
@@ -249,8 +253,7 @@ func BuildKubernetesMasterConfig(options configapi.MasterConfig, requestContextM
249 249
 		Authorizer:       apiserver.NewAlwaysAllowAuthorizer(),
250 250
 		AdmissionControl: admissionController,
251 251
 
252
-		EnableExp: len(enabledExtensionsVersions) > 0,
253
-		DisableV1: !enabledKubeVersionSet.Has("v1"),
252
+		APIGroupVersionOverrides: getAPIGroupVersionOverrides(options),
254 253
 
255 254
 		// Set the TLS options for proxying to pods and services
256 255
 		// Proxying to nodes uses the kubeletClient TLS config (so can provide a different cert, and verify the node hostname)
... ...
@@ -261,9 +264,6 @@ func BuildKubernetesMasterConfig(options configapi.MasterConfig, requestContextM
261 261
 		},
262 262
 	}
263 263
 
264
-	// set for consistency -- Origin only used m.EnableExp
265
-	cmserver.EnableExperimental = m.EnableExp
266
-
267 264
 	if options.DNSConfig != nil {
268 265
 		_, dnsPortStr, err := net.SplitHostPort(options.DNSConfig.BindAddress)
269 266
 		if err != nil {
... ...
@@ -294,3 +294,33 @@ func BuildKubernetesMasterConfig(options configapi.MasterConfig, requestContextM
294 294
 
295 295
 	return kmaster, nil
296 296
 }
297
+
298
+// getAPIGroupVersionOverrides builds the overrides in the format expected by master.Config.APIGroupVersionOverrides
299
+func getAPIGroupVersionOverrides(options configapi.MasterConfig) map[string]master.APIGroupVersionOverride {
300
+	apiGroupVersionOverrides := map[string]master.APIGroupVersionOverride{}
301
+	for group := range options.KubernetesMasterConfig.DisabledAPIGroupVersions {
302
+		for _, version := range configapi.GetDisabledAPIVersionsForGroup(*options.KubernetesMasterConfig, group) {
303
+			gv := unversioned.GroupVersion{Group: group, Version: version}
304
+			if group == "" {
305
+				// TODO: when rebasing, check the parseRuntimeConfig impl to make sure we're still building the right magic container
306
+				// Create "disabled" key for v1 identically to k8s.io/kubernetes/cmd/kube-apiserver/app/server.go#parseRuntimeConfig
307
+				gv.Group = "api"
308
+			}
309
+			apiGroupVersionOverrides[gv.String()] = master.APIGroupVersionOverride{Disable: true}
310
+		}
311
+	}
312
+	return apiGroupVersionOverrides
313
+}
314
+
315
+// NewEtcdStorage returns a storage interface for the provided storage version.
316
+func NewEtcdStorage(client *etcdclient.Client, version unversioned.GroupVersion, prefix string) (helper storage.Interface, err error) {
317
+	group, err := kapilatest.Group(version.Group)
318
+	if err != nil {
319
+		return nil, err
320
+	}
321
+	interfaces, err := group.InterfacesFor(version)
322
+	if err != nil {
323
+		return nil, err
324
+	}
325
+	return etcdstorage.NewEtcdStorage(client, interfaces.Codec, prefix), nil
326
+}
297 327
new file mode 100644
... ...
@@ -0,0 +1,46 @@
0
+package kubernetes
1
+
2
+import (
3
+	"reflect"
4
+	"testing"
5
+
6
+	"k8s.io/kubernetes/pkg/master"
7
+
8
+	configapi "github.com/openshift/origin/pkg/cmd/server/api"
9
+)
10
+
11
+func TestGetAPIGroupVersionOverrides(t *testing.T) {
12
+	testcases := map[string]struct {
13
+		DisabledVersions  map[string][]string
14
+		ExpectedOverrides map[string]master.APIGroupVersionOverride
15
+	}{
16
+		"empty": {
17
+			DisabledVersions:  nil,
18
+			ExpectedOverrides: map[string]master.APIGroupVersionOverride{},
19
+		},
20
+		"* -> v1": {
21
+			DisabledVersions:  map[string][]string{"": {"*"}},
22
+			ExpectedOverrides: map[string]master.APIGroupVersionOverride{"api/v1": {Disable: true}},
23
+		},
24
+		"v1": {
25
+			DisabledVersions:  map[string][]string{"": {"v1"}},
26
+			ExpectedOverrides: map[string]master.APIGroupVersionOverride{"api/v1": {Disable: true}},
27
+		},
28
+		"* -> v1beta1": {
29
+			DisabledVersions:  map[string][]string{"extensions": {"*"}},
30
+			ExpectedOverrides: map[string]master.APIGroupVersionOverride{"extensions/v1beta1": {Disable: true}},
31
+		},
32
+		"extensions/v1beta1": {
33
+			DisabledVersions:  map[string][]string{"extensions": {"v1beta1"}},
34
+			ExpectedOverrides: map[string]master.APIGroupVersionOverride{"extensions/v1beta1": {Disable: true}},
35
+		},
36
+	}
37
+
38
+	for k, tc := range testcases {
39
+		config := configapi.MasterConfig{KubernetesMasterConfig: &configapi.KubernetesMasterConfig{DisabledAPIGroupVersions: tc.DisabledVersions}}
40
+		overrides := getAPIGroupVersionOverrides(config)
41
+		if !reflect.DeepEqual(overrides, tc.ExpectedOverrides) {
42
+			t.Errorf("%s: Expected\n%#v\ngot\n%#v", k, tc.ExpectedOverrides, overrides)
43
+		}
44
+	}
45
+}
... ...
@@ -24,6 +24,7 @@ import (
24 24
 	"k8s.io/kubernetes/pkg/api"
25 25
 	klatest "k8s.io/kubernetes/pkg/api/latest"
26 26
 	"k8s.io/kubernetes/pkg/api/meta"
27
+	"k8s.io/kubernetes/pkg/api/unversioned"
27 28
 	"k8s.io/kubernetes/pkg/util"
28 29
 	"k8s.io/kubernetes/pkg/util/sets"
29 30
 )
... ...
@@ -160,26 +161,23 @@ func (c *AssetConfig) addHandlers(mux *http.ServeMux) error {
160 160
 	originResources := sets.NewString()
161 161
 	k8sResources := sets.NewString()
162 162
 
163
-	versions := sets.NewString()
164
-	versions.Insert(latest.Versions...)
165
-	versions.Insert(klatest.VersionsForLegacyGroup()...)
163
+	versions := []unversioned.GroupVersion{}
164
+	versions = append(versions, latest.Versions...)
165
+	versions = append(versions, klatest.ExternalVersions...)
166 166
 	deadOriginVersions := sets.NewString(configapi.DeadOpenShiftAPILevels...)
167 167
 	deadKubernetesVersions := sets.NewString(configapi.DeadKubernetesAPILevels...)
168
-	for _, version := range versions.List() {
169
-		for kind, t := range api.Scheme.KnownTypes(version) {
170
-			if strings.Contains(t.PkgPath(), "kubernetes/pkg/expapi") {
171
-				continue
172
-			}
168
+	for _, version := range versions {
169
+		for kind := range api.Scheme.KnownTypes(version) {
173 170
 			if strings.HasSuffix(kind, "List") {
174 171
 				continue
175 172
 			}
176 173
 			resource, _ := meta.KindToResource(kind, false)
177
-			if latest.OriginKind(kind, version) {
178
-				if !deadOriginVersions.Has(version) {
174
+			if latest.OriginKind(version.WithKind(kind)) {
175
+				if !deadOriginVersions.Has(version.String()) {
179 176
 					originResources.Insert(resource)
180 177
 				}
181 178
 			} else {
182
-				if !deadKubernetesVersions.Has(version) {
179
+				if !deadKubernetesVersions.Has(version.String()) {
183 180
 					k8sResources.Insert(resource)
184 181
 				}
185 182
 			}
... ...
@@ -551,7 +551,7 @@ func (c *MasterConfig) OriginNamespaceControllerClients() (*osclient.Client, *kc
551 551
 	return c.PrivilegedLoopbackOpenShiftClient, c.PrivilegedLoopbackKubernetesClient
552 552
 }
553 553
 
554
-// NewEtcdHelper returns an EtcdHelper for the provided storage version.
554
+// NewEtcdStorage returns a storage interface for the provided storage version.
555 555
 func NewEtcdStorage(client *etcdclient.Client, version unversioned.GroupVersion, prefix string) (oshelper storage.Interface, err error) {
556 556
 	interfaces, err := latest.InterfacesFor(version)
557 557
 	if err != nil {
... ...
@@ -550,7 +550,7 @@ func startControllers(oc *origin.MasterConfig, kc *kubernetes.MasterConfig) erro
550 550
 		kc.RunNodeController()
551 551
 		kc.RunScheduler()
552 552
 		kc.RunReplicationController(rcClient)
553
-		if kc.Master.EnableExp {
553
+		if len(configapi.GetEnabledAPIVersionsForGroup(kc.Options, configapi.APIGroupExtensions)) > 0 {
554 554
 			kc.RunJobController(jobClient)
555 555
 			kc.RunHPAController(hpaOClient, hpaKClient, oc.Options.PolicyConfig.OpenShiftInfrastructureNamespace)
556 556
 		}