Register the v1alpha3 API in the scheme, and update the roundtrip API tests

This commit is contained in:
Lucas Käldström 2018-07-04 14:07:38 +03:00
parent e5c0360773
commit 27d70411a9
No known key found for this signature in database
GPG Key ID: 3FA3783D77751514
11 changed files with 218 additions and 22 deletions

View File

@ -24,6 +24,7 @@ import (
utilruntime "k8s.io/apimachinery/pkg/util/runtime" utilruntime "k8s.io/apimachinery/pkg/util/runtime"
"k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm" "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm"
"k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1alpha2" "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1alpha2"
"k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1alpha3"
) )
// Scheme is the runtime.Scheme to which all kubeadm api types are registered. // Scheme is the runtime.Scheme to which all kubeadm api types are registered.
@ -41,5 +42,6 @@ func init() {
func AddToScheme(scheme *runtime.Scheme) { func AddToScheme(scheme *runtime.Scheme) {
utilruntime.Must(kubeadm.AddToScheme(scheme)) utilruntime.Must(kubeadm.AddToScheme(scheme))
utilruntime.Must(v1alpha2.AddToScheme(scheme)) utilruntime.Must(v1alpha2.AddToScheme(scheme))
utilruntime.Must(scheme.SetVersionPriority(v1alpha2.SchemeGroupVersion)) utilruntime.Must(v1alpha3.AddToScheme(scheme))
utilruntime.Must(scheme.SetVersionPriority(v1alpha3.SchemeGroupVersion))
} }

View File

@ -32,6 +32,7 @@ import (
kubeadmapi "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm" kubeadmapi "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm"
kubeadmscheme "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/scheme" kubeadmscheme "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/scheme"
kubeadmapiv1alpha2 "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1alpha2" kubeadmapiv1alpha2 "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1alpha2"
kubeadmapiv1alpha3 "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1alpha3"
cmdutil "k8s.io/kubernetes/cmd/kubeadm/app/cmd/util" cmdutil "k8s.io/kubernetes/cmd/kubeadm/app/cmd/util"
"k8s.io/kubernetes/cmd/kubeadm/app/constants" "k8s.io/kubernetes/cmd/kubeadm/app/constants"
"k8s.io/kubernetes/cmd/kubeadm/app/features" "k8s.io/kubernetes/cmd/kubeadm/app/features"
@ -160,7 +161,7 @@ func NewCmdConfigMigrate(out io.Writer) *cobra.Command {
locally in the CLI tool without ever touching anything in the cluster. locally in the CLI tool without ever touching anything in the cluster.
In this version of kubeadm, the following API versions are supported: In this version of kubeadm, the following API versions are supported:
- %s - %s
- TODO: kubeadm.k8s.io/v1beta1 - %s
Further, kubeadm can only write out config of version %q, but read both types. Further, kubeadm can only write out config of version %q, but read both types.
So regardless of what version you pass to the --old-config parameter here, the API object will be So regardless of what version you pass to the --old-config parameter here, the API object will be
@ -169,7 +170,7 @@ func NewCmdConfigMigrate(out io.Writer) *cobra.Command {
In other words, the output of this command is what kubeadm actually would read internally if you In other words, the output of this command is what kubeadm actually would read internally if you
submitted this file to "kubeadm init" submitted this file to "kubeadm init"
`), kubeadmapiv1alpha2.SchemeGroupVersion.String(), kubeadmapiv1alpha2.SchemeGroupVersion.String()), `), kubeadmapiv1alpha2.SchemeGroupVersion.String(), kubeadmapiv1alpha3.SchemeGroupVersion.String(), kubeadmapiv1alpha3.SchemeGroupVersion.String()),
Run: func(cmd *cobra.Command, args []string) { Run: func(cmd *cobra.Command, args []string) {
if len(oldCfgPath) == 0 { if len(oldCfgPath) == 0 {
kubeadmutil.CheckErr(fmt.Errorf("The --old-config flag is mandatory")) kubeadmutil.CheckErr(fmt.Errorf("The --old-config flag is mandatory"))
@ -187,14 +188,14 @@ func NewCmdConfigMigrate(out io.Writer) *cobra.Command {
internalcfg, err := configutil.ConfigFileAndDefaultsToInternalConfig(oldCfgPath, &kubeadmapiv1alpha2.MasterConfiguration{}) internalcfg, err := configutil.ConfigFileAndDefaultsToInternalConfig(oldCfgPath, &kubeadmapiv1alpha2.MasterConfiguration{})
kubeadmutil.CheckErr(err) kubeadmutil.CheckErr(err)
outputBytes, err = kubeadmutil.MarshalToYamlForCodecs(internalcfg, kubeadmapiv1alpha2.SchemeGroupVersion, kubeadmscheme.Codecs) outputBytes, err = kubeadmutil.MarshalToYamlForCodecs(internalcfg, kubeadmapiv1alpha3.SchemeGroupVersion, kubeadmscheme.Codecs)
kubeadmutil.CheckErr(err) kubeadmutil.CheckErr(err)
case nodeConfig: case nodeConfig:
internalcfg, err := configutil.NodeConfigFileAndDefaultsToInternalConfig(oldCfgPath, &kubeadmapiv1alpha2.NodeConfiguration{}) internalcfg, err := configutil.NodeConfigFileAndDefaultsToInternalConfig(oldCfgPath, &kubeadmapiv1alpha2.NodeConfiguration{})
kubeadmutil.CheckErr(err) kubeadmutil.CheckErr(err)
// TODO: In the future we might not want to duplicate these two lines of code for every case here. // TODO: In the future we might not want to duplicate these two lines of code for every case here.
outputBytes, err = kubeadmutil.MarshalToYamlForCodecs(internalcfg, kubeadmapiv1alpha2.SchemeGroupVersion, kubeadmscheme.Codecs) outputBytes, err = kubeadmutil.MarshalToYamlForCodecs(internalcfg, kubeadmapiv1alpha3.SchemeGroupVersion, kubeadmscheme.Codecs)
kubeadmutil.CheckErr(err) kubeadmutil.CheckErr(err)
default: default:
kubeadmutil.CheckErr(fmt.Errorf("Didn't recognize type with GroupVersionKind: %v", gvk)) kubeadmutil.CheckErr(fmt.Errorf("Didn't recognize type with GroupVersionKind: %v", gvk))

View File

@ -134,7 +134,7 @@ func BytesToInternalConfig(b []byte) (*kubeadmapi.MasterConfiguration, error) {
return nil, err return nil, err
} }
if err := runtime.DecodeInto(kubeadmscheme.Codecs.UniversalDecoder(kubeadmapiv1alpha2.SchemeGroupVersion), b, internalcfg); err != nil { if err := runtime.DecodeInto(kubeadmscheme.Codecs.UniversalDecoder(), b, internalcfg); err != nil {
return nil, err return nil, err
} }

View File

@ -27,11 +27,13 @@ import (
"k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm" "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm"
"k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/scheme" "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/scheme"
"k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1alpha2" "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1alpha2"
"k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1alpha3"
kubeadmutil "k8s.io/kubernetes/cmd/kubeadm/app/util" kubeadmutil "k8s.io/kubernetes/cmd/kubeadm/app/util"
) )
const ( const (
master_v1alpha2YAML = "testdata/conversion/master/v1alpha2.yaml" master_v1alpha2YAML = "testdata/conversion/master/v1alpha2.yaml"
master_v1alpha3YAML = "testdata/conversion/master/v1alpha3.yaml"
master_internalYAML = "testdata/conversion/master/internal.yaml" master_internalYAML = "testdata/conversion/master/internal.yaml"
master_incompleteYAML = "testdata/defaulting/master/incomplete.yaml" master_incompleteYAML = "testdata/defaulting/master/incomplete.yaml"
master_defaultedYAML = "testdata/defaulting/master/defaulted.yaml" master_defaultedYAML = "testdata/defaulting/master/defaulted.yaml"
@ -65,19 +67,31 @@ func TestConfigFileAndDefaultsToInternalConfig(t *testing.T) {
out: master_internalYAML, out: master_internalYAML,
groupVersion: kubeadm.SchemeGroupVersion, groupVersion: kubeadm.SchemeGroupVersion,
}, },
{ // v1alpha2 -> internal -> v1alpha2 { // v1alpha3 -> internal
name: "v1alpha2Tov1alpha2", name: "v1alpha3ToInternal",
in: master_v1alpha3YAML,
out: master_internalYAML,
groupVersion: kubeadm.SchemeGroupVersion,
},
{ // v1alpha2 -> internal -> v1alpha3
name: "v1alpha2Tov1alpha3",
in: master_v1alpha2YAML, in: master_v1alpha2YAML,
out: master_v1alpha2YAML, out: master_v1alpha3YAML,
groupVersion: v1alpha2.SchemeGroupVersion, groupVersion: v1alpha3.SchemeGroupVersion,
},
{ // v1alpha3 -> internal -> v1alpha3
name: "v1alpha3Tov1alpha3",
in: master_v1alpha3YAML,
out: master_v1alpha3YAML,
groupVersion: v1alpha3.SchemeGroupVersion,
}, },
// These tests are reading one file that has only a subset of the fields populated, loading it using ConfigFileAndDefaultsToInternalConfig, // These tests are reading one file that has only a subset of the fields populated, loading it using ConfigFileAndDefaultsToInternalConfig,
// and then marshals the internal object to the expected groupVersion // and then marshals the internal object to the expected groupVersion
{ // v1alpha2 -> default -> validate -> internal -> v1alpha2 { // v1alpha2 -> default -> validate -> internal -> v1alpha3
name: "incompleteYAMLToDefaultedv1alpha2", name: "incompleteYAMLToDefaultedv1alpha2",
in: master_incompleteYAML, in: master_incompleteYAML,
out: master_defaultedYAML, out: master_defaultedYAML,
groupVersion: v1alpha2.SchemeGroupVersion, groupVersion: v1alpha3.SchemeGroupVersion,
}, },
{ // v1alpha2 -> validation should fail { // v1alpha2 -> validation should fail
name: "invalidYAMLShouldFail", name: "invalidYAMLShouldFail",

View File

@ -54,7 +54,7 @@ func NodeConfigFileAndDefaultsToInternalConfig(cfgPath string, defaultversionedc
return nil, err return nil, err
} }
if err := runtime.DecodeInto(kubeadmscheme.Codecs.UniversalDecoder(kubeadmapiv1alpha2.SchemeGroupVersion), b, internalcfg); err != nil { if err := runtime.DecodeInto(kubeadmscheme.Codecs.UniversalDecoder(), b, internalcfg); err != nil {
return nil, err return nil, err
} }
} else { } else {

View File

@ -25,11 +25,13 @@ import (
"k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm" "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm"
"k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/scheme" "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/scheme"
"k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1alpha2" "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1alpha2"
"k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1alpha3"
kubeadmutil "k8s.io/kubernetes/cmd/kubeadm/app/util" kubeadmutil "k8s.io/kubernetes/cmd/kubeadm/app/util"
) )
const ( const (
node_v1alpha2YAML = "testdata/conversion/node/v1alpha2.yaml" node_v1alpha2YAML = "testdata/conversion/node/v1alpha2.yaml"
node_v1alpha3YAML = "testdata/conversion/node/v1alpha3.yaml"
node_internalYAML = "testdata/conversion/node/internal.yaml" node_internalYAML = "testdata/conversion/node/internal.yaml"
node_incompleteYAML = "testdata/defaulting/node/incomplete.yaml" node_incompleteYAML = "testdata/defaulting/node/incomplete.yaml"
node_defaultedYAML = "testdata/defaulting/node/defaulted.yaml" node_defaultedYAML = "testdata/defaulting/node/defaulted.yaml"
@ -50,21 +52,33 @@ func TestNodeConfigFileAndDefaultsToInternalConfig(t *testing.T) {
out: node_internalYAML, out: node_internalYAML,
groupVersion: kubeadm.SchemeGroupVersion, groupVersion: kubeadm.SchemeGroupVersion,
}, },
{ // v1alpha2 -> internal -> v1alpha2 { // v1alpha3 -> internal
name: "v1alpha2Tov1alpha2", name: "v1alpha3ToInternal",
in: node_v1alpha3YAML,
out: node_internalYAML,
groupVersion: kubeadm.SchemeGroupVersion,
},
{ // v1alpha2 -> internal -> v1alpha3
name: "v1alpha2Tov1alpha3",
in: node_v1alpha2YAML, in: node_v1alpha2YAML,
out: node_v1alpha2YAML, out: node_v1alpha3YAML,
groupVersion: v1alpha2.SchemeGroupVersion, groupVersion: v1alpha3.SchemeGroupVersion,
},
{ // v1alpha3 -> internal -> v1alpha3
name: "v1alpha3Tov1alpha3",
in: node_v1alpha3YAML,
out: node_v1alpha3YAML,
groupVersion: v1alpha3.SchemeGroupVersion,
}, },
// These tests are reading one file that has only a subset of the fields populated, loading it using NodeConfigFileAndDefaultsToInternalConfig, // These tests are reading one file that has only a subset of the fields populated, loading it using NodeConfigFileAndDefaultsToInternalConfig,
// and then marshals the internal object to the expected groupVersion // and then marshals the internal object to the expected groupVersion
{ // v1alpha1 -> default -> validate -> internal -> v1alpha2 { // v1alpha2 -> default -> validate -> internal -> v1alpha3
name: "incompleteYAMLToDefaulted", name: "incompleteYAMLToDefaulted",
in: node_incompleteYAML, in: node_incompleteYAML,
out: node_defaultedYAML, out: node_defaultedYAML,
groupVersion: v1alpha2.SchemeGroupVersion, groupVersion: v1alpha3.SchemeGroupVersion,
}, },
{ // v1alpha1 (faulty) -> validation should fail { // v1alpha2 -> validation should fail
name: "invalidYAMLShouldFail", name: "invalidYAMLShouldFail",
in: node_invalidYAML, in: node_invalidYAML,
expectedErr: true, expectedErr: true,

View File

@ -0,0 +1,149 @@
api:
advertiseAddress: 192.168.2.2
bindPort: 6443
controlPlaneEndpoint: ""
apiServerExtraArgs:
authorization-mode: Node,RBAC,Webhook
apiVersion: kubeadm.k8s.io/v1alpha3
auditPolicy:
logDir: /var/log/kubernetes/audit
logMaxAge: 2
path: ""
bootstrapTokens:
- groups:
- system:bootstrappers:kubeadm:default-node-token
token: s73ybu.6tw6wnqgp5z0wb77
ttl: 24h0m0s
usages:
- signing
- authentication
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
etcd:
local:
dataDir: /var/lib/etcd
image: ""
imageRepository: k8s.gcr.io
kind: MasterConfiguration
kubeProxy:
config:
bindAddress: 0.0.0.0
clientConnection:
acceptContentTypes: ""
burst: 10
contentType: application/vnd.kubernetes.protobuf
kubeconfig: /var/lib/kube-proxy/kubeconfig.conf
qps: 5
clusterCIDR: ""
configSyncPeriod: 15m0s
conntrack:
max: null
maxPerCore: 32768
min: 131072
tcpCloseWaitTimeout: 1h0m0s
tcpEstablishedTimeout: 24h0m0s
enableProfiling: false
featureGates:
ServiceNodeExclusion: true
SupportIPVSProxyMode: true
healthzBindAddress: 0.0.0.0:10256
hostnameOverride: ""
iptables:
masqueradeAll: false
masqueradeBit: 14
minSyncPeriod: 0s
syncPeriod: 30s
ipvs:
excludeCIDRs: null
minSyncPeriod: 0s
scheduler: ""
syncPeriod: 30s
metricsBindAddress: 127.0.0.1:10249
mode: ""
nodePortAddresses: null
oomScoreAdj: -999
portRange: ""
resourceContainer: /kube-proxy
udpIdleTimeout: 250ms
kubeletConfiguration:
baseConfig:
address: 0.0.0.0
authentication:
anonymous:
enabled: false
webhook:
cacheTTL: 2m0s
enabled: true
x509:
clientCAFile: /etc/kubernetes/pki/ca.crt
authorization:
mode: Webhook
webhook:
cacheAuthorizedTTL: 5m0s
cacheUnauthorizedTTL: 30s
cgroupDriver: cgroupfs
cgroupsPerQOS: true
clusterDNS:
- 10.96.0.10
clusterDomain: cluster.local
configMapAndSecretChangeDetectionStrategy: Watch
containerLogMaxFiles: 5
containerLogMaxSize: 10Mi
contentType: application/vnd.kubernetes.protobuf
cpuCFSQuota: true
cpuManagerPolicy: none
cpuManagerReconcilePeriod: 10s
enableControllerAttachDetach: true
enableDebuggingHandlers: true
enforceNodeAllocatable:
- pods
eventBurst: 10
eventRecordQPS: 5
evictionHard:
imagefs.available: 15%
memory.available: 100Mi
nodefs.available: 10%
nodefs.inodesFree: 5%
evictionPressureTransitionPeriod: 5m0s
failSwapOn: true
fileCheckFrequency: 20s
hairpinMode: promiscuous-bridge
healthzBindAddress: 127.0.0.1
healthzPort: 10248
httpCheckFrequency: 20s
imageGCHighThresholdPercent: 85
imageGCLowThresholdPercent: 80
imageMinimumGCAge: 2m0s
iptablesDropBit: 15
iptablesMasqueradeBit: 14
kubeAPIBurst: 10
kubeAPIQPS: 5
makeIPTablesUtilChains: true
maxOpenFiles: 1000000
maxPods: 110
nodeStatusUpdateFrequency: 10s
oomScoreAdj: -999
podPidsLimit: -1
port: 10250
registryBurst: 10
registryPullQPS: 5
resolvConf: /etc/resolv.conf
rotateCertificates: true
runtimeRequestTimeout: 2m0s
serializeImagePulls: true
staticPodPath: /etc/kubernetes/manifests
streamingConnectionIdleTimeout: 4h0m0s
syncFrequency: 1m0s
volumeStatsAggPeriod: 1m0s
kubernetesVersion: v1.10.2
networking:
dnsDomain: cluster.local
podSubnet: ""
serviceSubnet: 10.96.0.0/12
nodeRegistration:
criSocket: /var/run/dockershim.sock
name: master-1
taints:
- effect: NoSchedule
key: node-role.kubernetes.io/master
unifiedControlPlaneImage: ""

View File

@ -0,0 +1,15 @@
apiVersion: kubeadm.k8s.io/v1alpha3
caCertPath: /etc/kubernetes/pki/ca.crt
clusterName: kubernetes
discoveryFile: ""
discoveryTimeout: 5m0s
discoveryToken: abcdef.0123456789abcdef
discoveryTokenAPIServers:
- kube-apiserver:6443
discoveryTokenUnsafeSkipCAVerification: true
kind: NodeConfiguration
nodeRegistration:
criSocket: /var/run/dockershim.sock
name: master-1
tlsBootstrapToken: abcdef.0123456789abcdef
token: abcdef.0123456789abcdef

View File

@ -2,7 +2,7 @@ api:
advertiseAddress: 192.168.2.2 advertiseAddress: 192.168.2.2
bindPort: 6443 bindPort: 6443
controlPlaneEndpoint: "" controlPlaneEndpoint: ""
apiVersion: kubeadm.k8s.io/v1alpha2 apiVersion: kubeadm.k8s.io/v1alpha3
auditPolicy: auditPolicy:
logDir: /var/log/kubernetes/audit logDir: /var/log/kubernetes/audit
logMaxAge: 2 logMaxAge: 2

View File

@ -1,4 +1,4 @@
apiVersion: kubeadm.k8s.io/v1alpha2 apiVersion: kubeadm.k8s.io/v1alpha3
caCertPath: /etc/kubernetes/pki/ca.crt caCertPath: /etc/kubernetes/pki/ca.crt
clusterName: kubernetes clusterName: kubernetes
discoveryFile: "" discoveryFile: ""

View File

@ -7,6 +7,7 @@ cmd/kube-proxy/app
cmd/kube-scheduler/app cmd/kube-scheduler/app
cmd/kubeadm/app cmd/kubeadm/app
cmd/kubeadm/app/apis/kubeadm/v1alpha2 cmd/kubeadm/app/apis/kubeadm/v1alpha2
cmd/kubeadm/app/apis/kubeadm/v1alpha3
cmd/kubeadm/app/util/config cmd/kubeadm/app/util/config
cmd/kubelet/app cmd/kubelet/app
cmd/kubelet/app/options cmd/kubelet/app/options