Addresses comments on 030269d5483fa1ca0dd0a7d55806310d864c4751
| ... | ... |
@@ -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 |
} |