pkg/cmd/server/api/v1/conversions.go
30380339
 package v1
 
 import (
1ae5b25e
 	"k8s.io/kubernetes/pkg/api"
83c702b4
 	"k8s.io/kubernetes/pkg/conversion"
a3581b14
 	"k8s.io/kubernetes/pkg/runtime"
3ceb818d
 	"k8s.io/kubernetes/pkg/util/sets"
6a7364d3
 
99827954
 	"github.com/openshift/origin/pkg/api/extension"
a3581b14
 	internal "github.com/openshift/origin/pkg/cmd/server/api"
1ae53e70
 	"github.com/openshift/origin/pkg/cmd/server/bootstrappolicy"
30380339
 )
 
7e724a3c
 func addDefaultingFuncs(scheme *runtime.Scheme) error {
 	return scheme.AddDefaultingFuncs(
26c990fe
 		func(obj *MasterConfig) {
 			if len(obj.APILevels) == 0 {
3ceb818d
 				obj.APILevels = internal.DefaultOpenShiftAPILevels
26c990fe
 			}
1f379f5d
 			if len(obj.Controllers) == 0 {
 				obj.Controllers = ControllersAll
 			}
e00edaae
 			if obj.ServingInfo.RequestTimeoutSeconds == 0 {
 				obj.ServingInfo.RequestTimeoutSeconds = 60 * 60
 			}
bb8a2276
 			if obj.ServingInfo.MaxRequestsInFlight == 0 {
 				obj.ServingInfo.MaxRequestsInFlight = 500
 			}
1ae53e70
 			if len(obj.PolicyConfig.OpenShiftInfrastructureNamespace) == 0 {
 				obj.PolicyConfig.OpenShiftInfrastructureNamespace = bootstrappolicy.DefaultOpenShiftInfraNamespace
 			}
321d1032
 			if len(obj.RoutingConfig.Subdomain) == 0 {
c2564dc5
 				obj.RoutingConfig.Subdomain = "router.default.svc.cluster.local"
321d1032
 			}
92ea8000
 			if len(obj.JenkinsPipelineConfig.TemplateNamespace) == 0 {
 				obj.JenkinsPipelineConfig.TemplateNamespace = "openshift"
a75a12db
 			}
 			if len(obj.JenkinsPipelineConfig.TemplateName) == 0 {
67b51bfe
 				obj.JenkinsPipelineConfig.TemplateName = "jenkins-ephemeral"
a75a12db
 			}
 			if len(obj.JenkinsPipelineConfig.ServiceName) == 0 {
 				obj.JenkinsPipelineConfig.ServiceName = "jenkins"
 			}
67b51bfe
 			if obj.JenkinsPipelineConfig.AutoProvisionEnabled == nil {
433176e4
 				v := true
67b51bfe
 				obj.JenkinsPipelineConfig.AutoProvisionEnabled = &v
a75a12db
 			}
b03b6539
 
1f31ddc8
 			if obj.MasterClients.OpenShiftLoopbackClientConnectionOverrides == nil {
b03b6539
 				obj.MasterClients.OpenShiftLoopbackClientConnectionOverrides = &ClientConnectionOverrides{}
 			}
 			// historical values
 			if obj.MasterClients.OpenShiftLoopbackClientConnectionOverrides.QPS <= 0 {
 				obj.MasterClients.OpenShiftLoopbackClientConnectionOverrides.QPS = 150.0
 			}
 			if obj.MasterClients.OpenShiftLoopbackClientConnectionOverrides.Burst <= 0 {
 				obj.MasterClients.OpenShiftLoopbackClientConnectionOverrides.Burst = 300
1f31ddc8
 			}
 			setDefault_ClientConnectionOverrides(obj.MasterClients.OpenShiftLoopbackClientConnectionOverrides)
b03b6539
 
1f31ddc8
 			if obj.MasterClients.ExternalKubernetesClientConnectionOverrides == nil {
b03b6539
 				obj.MasterClients.ExternalKubernetesClientConnectionOverrides = &ClientConnectionOverrides{}
 			}
 			// historical values
 			if obj.MasterClients.ExternalKubernetesClientConnectionOverrides.QPS <= 0 {
 				obj.MasterClients.ExternalKubernetesClientConnectionOverrides.QPS = 100.0
 			}
 			if obj.MasterClients.ExternalKubernetesClientConnectionOverrides.Burst <= 0 {
 				obj.MasterClients.ExternalKubernetesClientConnectionOverrides.Burst = 200
1f31ddc8
 			}
 			setDefault_ClientConnectionOverrides(obj.MasterClients.ExternalKubernetesClientConnectionOverrides)
 
543dd90e
 			// Populate the new NetworkConfig.ServiceNetworkCIDR field from the KubernetesMasterConfig.ServicesSubnet field if needed
 			if len(obj.NetworkConfig.ServiceNetworkCIDR) == 0 {
 				if obj.KubernetesMasterConfig != nil && len(obj.KubernetesMasterConfig.ServicesSubnet) > 0 {
 					// if a subnet is set in the kubernetes master config, use that
 					obj.NetworkConfig.ServiceNetworkCIDR = obj.KubernetesMasterConfig.ServicesSubnet
 				} else {
 					// default ServiceClusterIPRange used by kubernetes if nothing is specified
 					obj.NetworkConfig.ServiceNetworkCIDR = "10.0.0.0/24"
 				}
 			}
33fb12b2
 
ee401ccd
 			// TODO Detect cloud provider when not using built-in kubernetes
 			kubeConfig := obj.KubernetesMasterConfig
 			noCloudProvider := kubeConfig != nil && (len(kubeConfig.ControllerArguments["cloud-provider"]) == 0 || kubeConfig.ControllerArguments["cloud-provider"][0] == "")
 
 			if noCloudProvider && len(obj.NetworkConfig.IngressIPNetworkCIDR) == 0 {
f980b4c5
 				cidr := internal.DefaultIngressIPNetworkCIDR
ee401ccd
 				if !(internal.CIDRsOverlap(cidr, obj.NetworkConfig.ClusterNetworkCIDR) || internal.CIDRsOverlap(cidr, obj.NetworkConfig.ServiceNetworkCIDR)) {
 					obj.NetworkConfig.IngressIPNetworkCIDR = cidr
 				}
 			}
 
33fb12b2
 			// Historically, the clientCA was incorrectly used as the master's server cert CA bundle
 			// If missing from the config, migrate the ClientCA into that field
 			if obj.OAuthConfig != nil && obj.OAuthConfig.MasterCA == nil {
 				s := obj.ServingInfo.ClientCA
 				// The final value of OAuthConfig.MasterCA should never be nil
 				obj.OAuthConfig.MasterCA = &s
 			}
26c990fe
 		},
52723316
 		func(obj *KubernetesMasterConfig) {
 			if obj.MasterCount == 0 {
 				obj.MasterCount = 1
 			}
26c990fe
 			if len(obj.APILevels) == 0 {
3ceb818d
 				obj.APILevels = internal.DefaultKubernetesAPILevels
26c990fe
 			}
e00edaae
 			if len(obj.ServicesNodePortRange) == 0 {
 				obj.ServicesNodePortRange = "30000-32767"
 			}
83e7080d
 			if len(obj.PodEvictionTimeout) == 0 {
 				obj.PodEvictionTimeout = "5m"
 			}
52723316
 		},
4663c089
 		func(obj *NodeConfig) {
1f31ddc8
 			if obj.MasterClientConnectionOverrides == nil {
 				obj.MasterClientConnectionOverrides = &ClientConnectionOverrides{
 					// historical values
 					QPS:   10.0,
 					Burst: 20,
 				}
 			}
 			setDefault_ClientConnectionOverrides(obj.MasterClientConnectionOverrides)
 
4663c089
 			// Defaults/migrations for NetworkConfig
 			if len(obj.NetworkConfig.NetworkPluginName) == 0 {
 				obj.NetworkConfig.NetworkPluginName = obj.DeprecatedNetworkPluginName
 			}
 			if obj.NetworkConfig.MTU == 0 {
 				obj.NetworkConfig.MTU = 1450
 			}
e1182ac3
 			if len(obj.IPTablesSyncPeriod) == 0 {
6d3e873e
 				obj.IPTablesSyncPeriod = "30s"
e1182ac3
 			}
fd6725df
 
 			// Auth cache defaults
 			if len(obj.AuthConfig.AuthenticationCacheTTL) == 0 {
 				obj.AuthConfig.AuthenticationCacheTTL = "5m"
 			}
 			if obj.AuthConfig.AuthenticationCacheSize == 0 {
 				obj.AuthConfig.AuthenticationCacheSize = 1000
 			}
 			if len(obj.AuthConfig.AuthorizationCacheTTL) == 0 {
 				obj.AuthConfig.AuthorizationCacheTTL = "5m"
 			}
 			if obj.AuthConfig.AuthorizationCacheSize == 0 {
 				obj.AuthConfig.AuthorizationCacheSize = 1000
 			}
779345d1
 
 			// EnableUnidling by default
 			if obj.EnableUnidling == nil {
 				v := true
 				obj.EnableUnidling = &v
 			}
4663c089
 		},
6a7364d3
 		func(obj *EtcdStorageConfig) {
 			if len(obj.KubernetesStorageVersion) == 0 {
e00edaae
 				obj.KubernetesStorageVersion = "v1"
6a7364d3
 			}
4580178f
 			if len(obj.KubernetesStoragePrefix) == 0 {
 				obj.KubernetesStoragePrefix = "kubernetes.io"
 			}
6a7364d3
 			if len(obj.OpenShiftStorageVersion) == 0 {
3ceb818d
 				obj.OpenShiftStorageVersion = internal.DefaultOpenShiftStorageVersionLevel
6a7364d3
 			}
4580178f
 			if len(obj.OpenShiftStoragePrefix) == 0 {
 				obj.OpenShiftStoragePrefix = "openshift.io"
 			}
6a7364d3
 		},
4cfc95c3
 		func(obj *DockerConfig) {
 			if len(obj.ExecHandlerName) == 0 {
 				obj.ExecHandlerName = DockerExecHandlerNative
 			}
 		},
429c4b0b
 		func(obj *ServingInfo) {
 			if len(obj.BindNetwork) == 0 {
 				obj.BindNetwork = "tcp4"
 			}
 		},
730f1f52
 		func(obj *ImagePolicyConfig) {
 			if obj.MaxImagesBulkImportedPerRepository == 0 {
 				obj.MaxImagesBulkImportedPerRepository = 5
 			}
0e9494df
 			if obj.MaxScheduledImageImportsPerMinute == 0 {
 				obj.MaxScheduledImageImportsPerMinute = 60
 			}
 			if obj.ScheduledImageImportMinimumIntervalSeconds == 0 {
 				obj.ScheduledImageImportMinimumIntervalSeconds = 15 * 60
 			}
730f1f52
 		},
429c4b0b
 		func(obj *DNSConfig) {
 			if len(obj.BindNetwork) == 0 {
 				obj.BindNetwork = "tcp4"
 			}
 		},
ec5a5ac6
 		func(obj *SecurityAllocator) {
 			if len(obj.UIDAllocatorRange) == 0 {
 				obj.UIDAllocatorRange = "1000000000-1999999999/10000"
 			}
 			if len(obj.MCSAllocatorRange) == 0 {
 				obj.MCSAllocatorRange = "s0:/2"
 			}
 			if obj.MCSLabelsPerProject == 0 {
 				obj.MCSLabelsPerProject = 5
 			}
 		},
75710d51
 		func(obj *IdentityProvider) {
 			if len(obj.MappingMethod) == 0 {
 				// By default, only let one identity provider authenticate a particular user
 				// If multiple identity providers collide, the second one in will fail to auth
 				// The admin can set this to "add" if they want to allow new identities to join existing users
 				obj.MappingMethod = "claim"
 			}
 		},
026ba1f0
 		func(obj *GrantConfig) {
 			if len(obj.ServiceAccountMethod) == 0 {
 				obj.ServiceAccountMethod = "prompt"
 			}
 		},
6a7364d3
 	)
45786bc5
 }
 
7e724a3c
 func addConversionFuncs(scheme *runtime.Scheme) error {
 	return scheme.AddConversionFuncs(
99827954
 		convert_runtime_Object_To_runtime_RawExtension,
 		convert_runtime_RawExtension_To_runtime_Object,
 
3ceb818d
 		func(in *NodeConfig, out *internal.NodeConfig, s conversion.Scope) error {
4663c089
 			return s.DefaultConvert(in, out, conversion.IgnoreMissingFields)
 		},
3ceb818d
 		func(in *internal.NodeConfig, out *NodeConfig, s conversion.Scope) error {
4663c089
 			return s.DefaultConvert(in, out, conversion.IgnoreMissingFields)
 		},
3ceb818d
 		func(in *KubernetesMasterConfig, out *internal.KubernetesMasterConfig, s conversion.Scope) error {
 			if err := s.DefaultConvert(in, out, conversion.IgnoreMissingFields); err != nil {
 				return err
 			}
 
 			if out.DisabledAPIGroupVersions == nil {
 				out.DisabledAPIGroupVersions = map[string][]string{}
 			}
 
 			// the APILevels (whitelist) needs to be converted into an internal blacklist
 			if len(in.APILevels) == 0 {
 				out.DisabledAPIGroupVersions[internal.APIGroupKube] = []string{"*"}
 
 			} else {
 				availableLevels := internal.KubeAPIGroupsToAllowedVersions[internal.APIGroupKube]
 				whitelistedLevels := sets.NewString(in.APILevels...)
 				blacklistedLevels := []string{}
 
 				for _, curr := range availableLevels {
 					if !whitelistedLevels.Has(curr) {
 						blacklistedLevels = append(blacklistedLevels, curr)
 					}
 				}
 
 				if len(blacklistedLevels) > 0 {
 					out.DisabledAPIGroupVersions[internal.APIGroupKube] = blacklistedLevels
 				}
 			}
 
 			return nil
 		},
 		func(in *internal.KubernetesMasterConfig, out *KubernetesMasterConfig, s conversion.Scope) error {
 			// internal doesn't have all fields: APILevels
 			return s.DefaultConvert(in, out, conversion.IgnoreMissingFields)
 		},
 		func(in *ServingInfo, out *internal.ServingInfo, s conversion.Scope) error {
81b520f2
 			if err := s.DefaultConvert(in, out, conversion.IgnoreMissingFields); err != nil {
 				return err
 			}
30380339
 			out.ServerCert.CertFile = in.CertFile
 			out.ServerCert.KeyFile = in.KeyFile
 			return nil
 		},
3ceb818d
 		func(in *internal.ServingInfo, out *ServingInfo, s conversion.Scope) error {
81b520f2
 			if err := s.DefaultConvert(in, out, conversion.IgnoreMissingFields); err != nil {
 				return err
 			}
30380339
 			out.CertFile = in.ServerCert.CertFile
 			out.KeyFile = in.ServerCert.KeyFile
 			return nil
 		},
3ceb818d
 		func(in *RemoteConnectionInfo, out *internal.RemoteConnectionInfo, s conversion.Scope) error {
0fd35257
 			out.URL = in.URL
 			out.CA = in.CA
 			out.ClientCert.CertFile = in.CertFile
 			out.ClientCert.KeyFile = in.KeyFile
 			return nil
 		},
3ceb818d
 		func(in *internal.RemoteConnectionInfo, out *RemoteConnectionInfo, s conversion.Scope) error {
0fd35257
 			out.URL = in.URL
 			out.CA = in.CA
 			out.CertFile = in.ClientCert.CertFile
 			out.KeyFile = in.ClientCert.KeyFile
 			return nil
 		},
3ceb818d
 		func(in *EtcdConnectionInfo, out *internal.EtcdConnectionInfo, s conversion.Scope) error {
53c7aa34
 			out.URLs = in.URLs
30380339
 			out.CA = in.CA
 			out.ClientCert.CertFile = in.CertFile
 			out.ClientCert.KeyFile = in.KeyFile
 			return nil
 		},
3ceb818d
 		func(in *internal.EtcdConnectionInfo, out *EtcdConnectionInfo, s conversion.Scope) error {
53c7aa34
 			out.URLs = in.URLs
 			out.CA = in.CA
 			out.CertFile = in.ClientCert.CertFile
 			out.KeyFile = in.ClientCert.KeyFile
 			return nil
 		},
3ceb818d
 		func(in *KubeletConnectionInfo, out *internal.KubeletConnectionInfo, s conversion.Scope) error {
53c7aa34
 			out.Port = in.Port
 			out.CA = in.CA
 			out.ClientCert.CertFile = in.CertFile
 			out.ClientCert.KeyFile = in.KeyFile
 			return nil
 		},
3ceb818d
 		func(in *internal.KubeletConnectionInfo, out *KubeletConnectionInfo, s conversion.Scope) error {
53c7aa34
 			out.Port = in.Port
30380339
 			out.CA = in.CA
 			out.CertFile = in.ClientCert.CertFile
 			out.KeyFile = in.ClientCert.KeyFile
 			return nil
 		},
e0567144
 		func(in *MasterVolumeConfig, out *internal.MasterVolumeConfig, s conversion.Scope) error {
 			out.DynamicProvisioningEnabled = (in.DynamicProvisioningEnabled == nil) || (*in.DynamicProvisioningEnabled)
 			return nil
 		},
 		func(in *internal.MasterVolumeConfig, out *MasterVolumeConfig, s conversion.Scope) error {
 			enabled := in.DynamicProvisioningEnabled
 			out.DynamicProvisioningEnabled = &enabled
 			return nil
 		},
99827954
 
1ae5b25e
 		api.Convert_resource_Quantity_To_resource_Quantity,
779345d1
 		api.Convert_bool_To_Pointer_bool,
 		api.Convert_Pointer_bool_To_bool,
30380339
 	)
 }
f0a00e2c
 
99827954
 // convert_runtime_Object_To_runtime_RawExtension attempts to convert runtime.Objects to the appropriate target.
 func convert_runtime_Object_To_runtime_RawExtension(in *runtime.Object, out *runtime.RawExtension, s conversion.Scope) error {
 	return extension.Convert_runtime_Object_To_runtime_RawExtension(internal.Scheme, in, out, s)
 }
f0a00e2c
 
99827954
 // convert_runtime_RawExtension_To_runtime_Object attempts to convert an incoming object into the
 // appropriate output type.
 func convert_runtime_RawExtension_To_runtime_Object(in *runtime.RawExtension, out *runtime.Object, s conversion.Scope) error {
 	return extension.Convert_runtime_RawExtension_To_runtime_Object(internal.Scheme, in, out, s)
 }
f0a00e2c
 
1f31ddc8
 // setDefault_ClientConnectionOverrides defaults a client connection to the pre-1.3 settings of
 // being JSON only. Callers must explicitly opt-in to Protobuf support in 1.3+.
 func setDefault_ClientConnectionOverrides(overrides *ClientConnectionOverrides) {
 	if len(overrides.AcceptContentTypes) == 0 {
 		overrides.AcceptContentTypes = "application/json"
 	}
 	if len(overrides.ContentType) == 0 {
 		overrides.ContentType = "application/json"
 	}
 }
 
99827954
 var _ runtime.NestedObjectDecoder = &MasterConfig{}
 
 // DecodeNestedObjects handles encoding RawExtensions on the MasterConfig, ensuring the
 // objects are decoded with the provided decoder.
 func (c *MasterConfig) DecodeNestedObjects(d runtime.Decoder) error {
 	// decoding failures result in a runtime.Unknown object being created in Object and passed
 	// to conversion
 	for k, v := range c.AdmissionConfig.PluginConfig {
 		extension.DecodeNestedRawExtensionOrUnknown(d, &v.Configuration)
 		c.AdmissionConfig.PluginConfig[k] = v
2b9b20b2
 	}
99827954
 	if c.KubernetesMasterConfig != nil {
 		for k, v := range c.KubernetesMasterConfig.AdmissionConfig.PluginConfig {
 			extension.DecodeNestedRawExtensionOrUnknown(d, &v.Configuration)
 			c.KubernetesMasterConfig.AdmissionConfig.PluginConfig[k] = v
 		}
f0a00e2c
 	}
99827954
 	if c.OAuthConfig != nil {
 		for i := range c.OAuthConfig.IdentityProviders {
 			extension.DecodeNestedRawExtensionOrUnknown(d, &c.OAuthConfig.IdentityProviders[i].Provider)
 		}
f0a00e2c
 	}
 	return nil
 }
 
99827954
 var _ runtime.NestedObjectEncoder = &MasterConfig{}
f0a00e2c
 
99827954
 // EncodeNestedObjects handles encoding RawExtensions on the MasterConfig, ensuring the
 // objects are encoded with the provided encoder.
 func (c *MasterConfig) EncodeNestedObjects(e runtime.Encoder) error {
 	for k, v := range c.AdmissionConfig.PluginConfig {
 		if err := extension.EncodeNestedRawExtension(e, &v.Configuration); err != nil {
 			return err
 		}
 		c.AdmissionConfig.PluginConfig[k] = v
f0a00e2c
 	}
99827954
 	if c.KubernetesMasterConfig != nil {
 		for k, v := range c.KubernetesMasterConfig.AdmissionConfig.PluginConfig {
 			if err := extension.EncodeNestedRawExtension(e, &v.Configuration); err != nil {
 				return err
 			}
 			c.KubernetesMasterConfig.AdmissionConfig.PluginConfig[k] = v
 		}
 	}
 	if c.OAuthConfig != nil {
 		for i := range c.OAuthConfig.IdentityProviders {
 			if err := extension.EncodeNestedRawExtension(e, &c.OAuthConfig.IdentityProviders[i].Provider); err != nil {
 				return err
 			}
 		}
f0a00e2c
 	}
 	return nil
 }