From 8004aad307389765af2ab7039760f8f2ddcd4863 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lucas=20K=C3=A4ldstr=C3=B6m?= Date: Sun, 8 Jul 2018 09:42:46 +0300 Subject: [PATCH] kubeadm: Embed the internal variants of the componentconfigs in the internal kubeadm API with conversions --- cmd/kubeadm/app/apis/kubeadm/types.go | 29 +++--- .../app/apis/kubeadm/v1alpha2/conversion.go | 91 ++++++++++++++++++ .../app/apis/kubeadm/v1alpha3/conversion.go | 95 +++++++++++++++++++ 3 files changed, 199 insertions(+), 16 deletions(-) create mode 100644 cmd/kubeadm/app/apis/kubeadm/v1alpha2/conversion.go create mode 100644 cmd/kubeadm/app/apis/kubeadm/v1alpha3/conversion.go diff --git a/cmd/kubeadm/app/apis/kubeadm/types.go b/cmd/kubeadm/app/apis/kubeadm/types.go index 8f4807e9503..234f7ab7f77 100644 --- a/cmd/kubeadm/app/apis/kubeadm/types.go +++ b/cmd/kubeadm/app/apis/kubeadm/types.go @@ -19,8 +19,8 @@ package kubeadm import ( v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - kubeletconfigv1beta1 "k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig/v1beta1" - kubeproxyconfigv1alpha1 "k8s.io/kubernetes/pkg/proxy/apis/kubeproxyconfig/v1alpha1" + "k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig" + "k8s.io/kubernetes/pkg/proxy/apis/kubeproxyconfig" ) // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object @@ -41,18 +41,17 @@ type MasterConfiguration struct { // NodeRegistration holds fields that relate to registering the new master node to the cluster NodeRegistration NodeRegistrationOptions + // ComponentConfigs holds internal ComponentConfig struct types known to kubeadm, should long-term only exist in the internal kubeadm API + ComponentConfigs ComponentConfigs + // Cluster-wide configuration // TODO: Move these fields under some kind of ClusterConfiguration or similar struct that describes // one cluster. Eventually we want this kind of spec to align well with the Cluster API spec. // API holds configuration for the k8s apiserver. API API - // KubeProxy holds configuration for the k8s service proxy. - KubeProxy KubeProxy // Etcd holds configuration for etcd. Etcd Etcd - // KubeletConfiguration holds configuration for the kubelet. - KubeletConfiguration KubeletConfiguration // Networking holds configuration for the networking topology of the cluster. Networking Networking // KubernetesVersion is the target version of the control plane. @@ -110,6 +109,14 @@ type MasterConfiguration struct { ClusterName string } +// ComponentConfigs holds known internal ComponentConfig types for other components +type ComponentConfigs struct { + // Kubelet holds the ComponentConfiguration for the kubelet + Kubelet *kubeletconfig.KubeletConfiguration + // KubeProxy holds the ComponentConfiguration for the kube-proxy + KubeProxy *kubeproxyconfig.KubeProxyConfiguration +} + // API struct contains elements of API server address. type API struct { // AdvertiseAddress sets the IP address for the API server to advertise. @@ -288,11 +295,6 @@ type NodeConfiguration struct { FeatureGates map[string]bool } -// KubeletConfiguration contains elements describing initial remote configuration of kubelet. -type KubeletConfiguration struct { - BaseConfig *kubeletconfigv1beta1.KubeletConfiguration -} - // GetControlPlaneImageRepository returns name of image repository // for control plane images (API,Controller Manager,Scheduler and Proxy) // It will override location with CI registry name in case user requests special @@ -321,11 +323,6 @@ type HostPathMount struct { PathType v1.HostPathType } -// KubeProxy contains elements describing the proxy configuration. -type KubeProxy struct { - Config *kubeproxyconfigv1alpha1.KubeProxyConfiguration -} - // AuditPolicyConfiguration holds the options for configuring the api server audit policy. type AuditPolicyConfiguration struct { // Path is the local path to an audit policy. diff --git a/cmd/kubeadm/app/apis/kubeadm/v1alpha2/conversion.go b/cmd/kubeadm/app/apis/kubeadm/v1alpha2/conversion.go new file mode 100644 index 00000000000..548f0aa318a --- /dev/null +++ b/cmd/kubeadm/app/apis/kubeadm/v1alpha2/conversion.go @@ -0,0 +1,91 @@ +/* +Copyright 2018 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package v1alpha2 + +import ( + "k8s.io/apimachinery/pkg/conversion" + "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm" + "k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig" + kubeletconfigscheme "k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig/scheme" + kubeletconfigv1beta1 "k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig/v1beta1" + "k8s.io/kubernetes/pkg/proxy/apis/kubeproxyconfig" + kubeproxyconfigscheme "k8s.io/kubernetes/pkg/proxy/apis/kubeproxyconfig/scheme" + kubeproxyconfigv1alpha1 "k8s.io/kubernetes/pkg/proxy/apis/kubeproxyconfig/v1alpha1" +) + +func Convert_v1alpha2_MasterConfiguration_To_kubeadm_MasterConfiguration(in *MasterConfiguration, out *kubeadm.MasterConfiguration, s conversion.Scope) error { + if err := autoConvert_v1alpha2_MasterConfiguration_To_kubeadm_MasterConfiguration(in, out, s); err != nil { + return err + } + + if in.KubeProxy.Config != nil { + if out.ComponentConfigs.KubeProxy == nil { + out.ComponentConfigs.KubeProxy = &kubeproxyconfig.KubeProxyConfiguration{} + } + + if err := kubeproxyconfigscheme.Scheme.Convert(in.KubeProxy.Config, out.ComponentConfigs.KubeProxy, nil); err != nil { + return err + } + } + if in.KubeletConfiguration.BaseConfig != nil { + if out.ComponentConfigs.Kubelet == nil { + out.ComponentConfigs.Kubelet = &kubeletconfig.KubeletConfiguration{} + } + + scheme, _, err := kubeletconfigscheme.NewSchemeAndCodecs() + if err != nil { + return err + } + + if err := scheme.Convert(in.KubeletConfiguration.BaseConfig, out.ComponentConfigs.Kubelet, nil); err != nil { + return err + } + } + + return nil +} + +func Convert_kubeadm_MasterConfiguration_To_v1alpha2_MasterConfiguration(in *kubeadm.MasterConfiguration, out *MasterConfiguration, s conversion.Scope) error { + if err := autoConvert_kubeadm_MasterConfiguration_To_v1alpha2_MasterConfiguration(in, out, s); err != nil { + return err + } + + if in.ComponentConfigs.KubeProxy != nil { + if out.KubeProxy.Config == nil { + out.KubeProxy.Config = &kubeproxyconfigv1alpha1.KubeProxyConfiguration{} + } + + if err := kubeproxyconfigscheme.Scheme.Convert(in.ComponentConfigs.KubeProxy, out.KubeProxy.Config, nil); err != nil { + return err + } + } + if in.ComponentConfigs.Kubelet != nil { + if out.KubeletConfiguration.BaseConfig == nil { + out.KubeletConfiguration.BaseConfig = &kubeletconfigv1beta1.KubeletConfiguration{} + } + + scheme, _, err := kubeletconfigscheme.NewSchemeAndCodecs() + if err != nil { + return err + } + + if err := scheme.Convert(in.ComponentConfigs.Kubelet, out.KubeletConfiguration.BaseConfig, nil); err != nil { + return err + } + } + return nil +} diff --git a/cmd/kubeadm/app/apis/kubeadm/v1alpha3/conversion.go b/cmd/kubeadm/app/apis/kubeadm/v1alpha3/conversion.go new file mode 100644 index 00000000000..16c59831c1a --- /dev/null +++ b/cmd/kubeadm/app/apis/kubeadm/v1alpha3/conversion.go @@ -0,0 +1,95 @@ +/* +Copyright 2018 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package v1alpha3 + +import ( + "k8s.io/apimachinery/pkg/conversion" + "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm" + "k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig" + kubeletconfigscheme "k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig/scheme" + kubeletconfigv1beta1 "k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig/v1beta1" + "k8s.io/kubernetes/pkg/proxy/apis/kubeproxyconfig" + kubeproxyconfigscheme "k8s.io/kubernetes/pkg/proxy/apis/kubeproxyconfig/scheme" + kubeproxyconfigv1alpha1 "k8s.io/kubernetes/pkg/proxy/apis/kubeproxyconfig/v1alpha1" +) + +func Convert_v1alpha3_MasterConfiguration_To_kubeadm_MasterConfiguration(in *MasterConfiguration, out *kubeadm.MasterConfiguration, s conversion.Scope) error { + if err := autoConvert_v1alpha3_MasterConfiguration_To_kubeadm_MasterConfiguration(in, out, s); err != nil { + return err + } + + // TODO: Remove this conversion code ASAP, as the ComponentConfig structs should not be in the external version of the kubeadm API, but be marshalled as + // different YAML documents + if in.KubeProxy.Config != nil { + if out.ComponentConfigs.KubeProxy == nil { + out.ComponentConfigs.KubeProxy = &kubeproxyconfig.KubeProxyConfiguration{} + } + + if err := kubeproxyconfigscheme.Scheme.Convert(in.KubeProxy.Config, out.ComponentConfigs.KubeProxy, nil); err != nil { + return err + } + } + if in.KubeletConfiguration.BaseConfig != nil { + if out.ComponentConfigs.Kubelet == nil { + out.ComponentConfigs.Kubelet = &kubeletconfig.KubeletConfiguration{} + } + + scheme, _, err := kubeletconfigscheme.NewSchemeAndCodecs() + if err != nil { + return err + } + + if err := scheme.Convert(in.KubeletConfiguration.BaseConfig, out.ComponentConfigs.Kubelet, nil); err != nil { + return err + } + } + + return nil +} + +func Convert_kubeadm_MasterConfiguration_To_v1alpha3_MasterConfiguration(in *kubeadm.MasterConfiguration, out *MasterConfiguration, s conversion.Scope) error { + if err := autoConvert_kubeadm_MasterConfiguration_To_v1alpha3_MasterConfiguration(in, out, s); err != nil { + return err + } + + // TODO: Remove this conversion code ASAP, as the ComponentConfig structs should not be in the external version of the kubeadm API, but be marshalled as + // different YAML documents + if in.ComponentConfigs.KubeProxy != nil { + if out.KubeProxy.Config == nil { + out.KubeProxy.Config = &kubeproxyconfigv1alpha1.KubeProxyConfiguration{} + } + + if err := kubeproxyconfigscheme.Scheme.Convert(in.ComponentConfigs.KubeProxy, out.KubeProxy.Config, nil); err != nil { + return err + } + } + if in.ComponentConfigs.Kubelet != nil { + if out.KubeletConfiguration.BaseConfig == nil { + out.KubeletConfiguration.BaseConfig = &kubeletconfigv1beta1.KubeletConfiguration{} + } + + scheme, _, err := kubeletconfigscheme.NewSchemeAndCodecs() + if err != nil { + return err + } + + if err := scheme.Convert(in.ComponentConfigs.Kubelet, out.KubeletConfiguration.BaseConfig, nil); err != nil { + return err + } + } + return nil +}