Skip to content

Commit e3b4635

Browse files
alvaroalemankubermatic-bot
authored andcommitted
Migrate MachineSets and MachineDeployments ProviderConfig (#445)
* Add conversion for MachineDeployments * Add conversion for machineset * Add migrations for machineset and machinedeployment
1 parent 0963b63 commit e3b4635

File tree

8 files changed

+434
-13
lines changed

8 files changed

+434
-13
lines changed

.golangci.yml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ issues:
3030
- should have comment or be unexported
3131
- should have comment \\(or a comment on this block\\) or be unexported
3232
- func Convert_MachinesV1alpha1Machine_To_ClusterV1alpha1Machine should be ConvertMachinesV1alpha1MachineToClusterV1alpha1Machine
33-
- func Convert_ProviderConfig_To_ProviderSpec should be ConvertProviderConfigToProviderSpec
33+
- func Convert_MachineDeployment_ProviderConfig_To_ProviderSpec should be ConvertMachineDeploymentProviderConfigToProviderSpec
34+
- func Convert_MachineSet_ProviderConfig_To_ProviderSpec should be ConvertMachineSetProviderConfigToProviderSpec
35+
- func Convert_Machine_ProviderConfig_To_ProviderSpec should be ConvertMachineProviderConfigToProviderSpec
3436
- 'counter\.Set is deprecated: Use NewConstMetric'
3537
- 'eviction\.go:221:4: the surrounding loop is unconditionally terminated'

pkg/apis/cluster/v1alpha1/conversions/providerconfig_to_providerspec.go

Lines changed: 92 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,45 @@ import (
1010
clusterv1alpha1 "sigs.k8s.io/cluster-api/pkg/apis/cluster/v1alpha1"
1111
)
1212

13+
type machineDeploymentWithProviderSpecAndProviderConfig struct {
14+
metav1.TypeMeta `json:",inline"`
15+
metav1.ObjectMeta `json:"metadata,omitempty"`
16+
17+
Spec machineDeploymentSpecWithProviderSpecAndProviderConfig `json:"spec,omitempty"`
18+
Status clusterv1alpha1.MachineDeploymentStatus `json:"status,omitempty"`
19+
}
20+
21+
type machineDeploymentSpecWithProviderSpecAndProviderConfig struct {
22+
Replicas *int32 `json:"replicas,omitempty"`
23+
Selector metav1.LabelSelector `json:"selector"`
24+
Template machineTemplateSpecWithProviderSpecAndProviderConfig `json:"template"`
25+
Strategy *clusterv1alpha1.MachineDeploymentStrategy `json:"strategy,omitempty"`
26+
MinReadySeconds *int32 `json:"minReadySeconds,omitempty"`
27+
RevisionHistoryLimit *int32 `json:"revisionHistoryLimit,omitempty"`
28+
Paused bool `json:"paused,omitempty"`
29+
ProgressDeadlineSeconds *int32 `json:"progressDeadlineSeconds,omitempty"`
30+
}
31+
32+
type machineSetWithProviderSpecAndProviderConfig struct {
33+
metav1.TypeMeta `json:",inline"`
34+
metav1.ObjectMeta `json:"metadata,omitempty"`
35+
36+
Spec machineSetSpecWithProviderSpecAndProviderConfig `json:"spec,omitempty"`
37+
Status clusterv1alpha1.MachineSetStatus `json:"status,omitempty"`
38+
}
39+
40+
type machineSetSpecWithProviderSpecAndProviderConfig struct {
41+
Replicas *int32 `json:"replicas,omitempty"`
42+
MinReadySeconds int32 `json:"minReadySeconds,omitempty"`
43+
Selector metav1.LabelSelector `json:"selector"`
44+
Template machineTemplateSpecWithProviderSpecAndProviderConfig `json:"template,omitempty"`
45+
}
46+
47+
type machineTemplateSpecWithProviderSpecAndProviderConfig struct {
48+
metav1.ObjectMeta `json:"metadata,omitempty"`
49+
Spec machineSpecWithProviderSpecAndProviderConfig `json:"spec,omitempty"`
50+
}
51+
1352
type machineWithProviderSpecAndProviderConfig struct {
1453
metav1.TypeMeta `json:",inline"`
1554
metav1.ObjectMeta `json:"metadata,omitempty"`
@@ -27,7 +66,59 @@ type machineSpecWithProviderSpecAndProviderConfig struct {
2766
ConfigSource *corev1.NodeConfigSource `json:"configSource,omitempty"`
2867
}
2968

30-
func Convert_ProviderConfig_To_ProviderSpec(in []byte) (*clusterv1alpha1.Machine, bool, error) {
69+
func Convert_MachineDeployment_ProviderConfig_To_ProviderSpec(in []byte) (*clusterv1alpha1.MachineDeployment, bool, error) {
70+
var wasConverted bool
71+
superMachineDeployment := &machineDeploymentWithProviderSpecAndProviderConfig{}
72+
if err := json.Unmarshal(in, superMachineDeployment); err != nil {
73+
return nil, wasConverted, fmt.Errorf("error unmarshalling machineDeployment object: %v", err)
74+
}
75+
if superMachineDeployment.Spec.Template.Spec.ProviderConfig != nil && superMachineDeployment.Spec.Template.Spec.ProviderSpec != nil {
76+
return nil, wasConverted, fmt.Errorf("both .spec.template.spec.providerConfig and .spec.template.spec.providerSpec were non-nil for machineDeployment %s", superMachineDeployment.Name)
77+
}
78+
if superMachineDeployment.Spec.Template.Spec.ProviderConfig != nil {
79+
superMachineDeployment.Spec.Template.Spec.ProviderSpec = superMachineDeployment.Spec.Template.Spec.ProviderConfig
80+
superMachineDeployment.Spec.Template.Spec.ProviderConfig = nil
81+
wasConverted = true
82+
}
83+
84+
machineDeployment := &clusterv1alpha1.MachineDeployment{}
85+
superMachineDeploymentBytes, err := json.Marshal(superMachineDeployment)
86+
if err != nil {
87+
return nil, wasConverted, fmt.Errorf("failed to marshal superMachineDeployment object for machineDeployment %s: %v", superMachineDeployment.Name, err)
88+
}
89+
if err := json.Unmarshal(superMachineDeploymentBytes, machineDeployment); err != nil {
90+
return nil, wasConverted, fmt.Errorf("failed to unmarshal superMachineDeployment object for machineDeployment %s back into machineDeployment object: %v", superMachineDeployment.Name, err)
91+
}
92+
return machineDeployment, wasConverted, nil
93+
}
94+
95+
func Convert_MachineSet_ProviderConfig_To_ProviderSpec(in []byte) (*clusterv1alpha1.MachineSet, bool, error) {
96+
var wasConverted bool
97+
superMachineSet := &machineSetWithProviderSpecAndProviderConfig{}
98+
if err := json.Unmarshal(in, superMachineSet); err != nil {
99+
return nil, wasConverted, fmt.Errorf("error unmarshalling machineSet object: %v", err)
100+
}
101+
if superMachineSet.Spec.Template.Spec.ProviderConfig != nil && superMachineSet.Spec.Template.Spec.ProviderSpec != nil {
102+
return nil, wasConverted, fmt.Errorf("both .spec.template.spec.providerConfig and .spec.template.spec.providerSpec were non-nil for machineSet %s", superMachineSet.Name)
103+
}
104+
if superMachineSet.Spec.Template.Spec.ProviderConfig != nil {
105+
superMachineSet.Spec.Template.Spec.ProviderSpec = superMachineSet.Spec.Template.Spec.ProviderConfig
106+
superMachineSet.Spec.Template.Spec.ProviderConfig = nil
107+
wasConverted = true
108+
}
109+
110+
machineSet := &clusterv1alpha1.MachineSet{}
111+
superMachineSetBytes, err := json.Marshal(superMachineSet)
112+
if err != nil {
113+
return nil, wasConverted, fmt.Errorf("failed to marshal superMachineSet object for machineSet %s: %v", superMachineSet.Name, err)
114+
}
115+
if err := json.Unmarshal(superMachineSetBytes, machineSet); err != nil {
116+
return nil, wasConverted, fmt.Errorf("failed to unmarshal superMachineSet object for machineSet %s back into machineSet object: %v", superMachineSet.Name, err)
117+
}
118+
return machineSet, wasConverted, nil
119+
}
120+
121+
func Convert_Machine_ProviderConfig_To_ProviderSpec(in []byte) (*clusterv1alpha1.Machine, bool, error) {
31122
var wasConverted bool
32123

33124
superMachine := &machineWithProviderSpecAndProviderConfig{}

pkg/apis/cluster/v1alpha1/conversions/providerconfig_to_providerspec_test.go

Lines changed: 86 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,88 @@ import (
1111
"github.com/ghodss/yaml"
1212
)
1313

14-
func Test_Convert_ProviderConfig_To_ProviderSpec(t *testing.T) {
14+
func Test_Convert_MachineDeployment_ProviderConfig_To_ProviderSpec(t *testing.T) {
15+
fixtures, err := ioutil.ReadDir("testdata/clusterv1alpha1machineDeploymentWithProviderConfig")
16+
if err != nil {
17+
t.Fatalf("failed to list fixtures: %v", err)
18+
}
19+
20+
for _, fixture := range fixtures {
21+
fixtureYamlByte, err := ioutil.ReadFile(fmt.Sprintf("testdata/clusterv1alpha1machineDeploymentWithProviderConfig/%s", fixture.Name()))
22+
if err != nil {
23+
t.Errorf("failed to read fixture file %s: %v", fixture.Name(), err)
24+
continue
25+
}
26+
fixtureJSONBytes, err := yaml.YAMLToJSON(fixtureYamlByte)
27+
if err != nil {
28+
t.Errorf("failed to convert yaml to json: %v", err)
29+
continue
30+
}
31+
convertedMachineDeployment, wasConverted, err := Convert_MachineDeployment_ProviderConfig_To_ProviderSpec(fixtureJSONBytes)
32+
if err != nil {
33+
t.Errorf("failed to convert machineDeployment from file %s: %v", fixture.Name(), err)
34+
continue
35+
}
36+
if !wasConverted {
37+
t.Errorf("expected wasConverted to be true but was %t", wasConverted)
38+
}
39+
convertedMachineDeploymentJSONBytes, err := json.Marshal(*convertedMachineDeployment)
40+
if err != nil {
41+
t.Errorf("faile to marshal converted machineDeployment %s: %v", convertedMachineDeployment.Name, err)
42+
continue
43+
}
44+
convertedMachineDeploymentYamlBytes, err := yaml.JSONToYAML(convertedMachineDeploymentJSONBytes)
45+
if err != nil {
46+
t.Errorf("failed to convert json to yaml: %v", err)
47+
continue
48+
}
49+
50+
testhelper.CompareOutput(t, fmt.Sprintf("migrated_clusterv1alpha1machineDeploymentWithProviderConfig/%s", fixture.Name()), string(convertedMachineDeploymentYamlBytes), *update)
51+
}
52+
}
53+
54+
func Test_Convert_MachineSet_ProviderConfig_To_ProviderSpec(t *testing.T) {
55+
fixtures, err := ioutil.ReadDir("testdata/clusterv1alpha1machineSetWithProviderConfig")
56+
if err != nil {
57+
t.Fatalf("failed to list fixtures: %v", err)
58+
}
59+
60+
for _, fixture := range fixtures {
61+
fixtureYamlByte, err := ioutil.ReadFile(fmt.Sprintf("testdata/clusterv1alpha1machineSetWithProviderConfig/%s", fixture.Name()))
62+
if err != nil {
63+
t.Errorf("failed to read fixture file %s: %v", fixture.Name(), err)
64+
continue
65+
}
66+
fixtureJSONBytes, err := yaml.YAMLToJSON(fixtureYamlByte)
67+
if err != nil {
68+
t.Errorf("failed to convert yaml to json: %v", err)
69+
continue
70+
}
71+
convertedMachineSet, wasConverted, err := Convert_MachineSet_ProviderConfig_To_ProviderSpec(fixtureJSONBytes)
72+
if err != nil {
73+
t.Errorf("failed to convert machineSet from file %s: %v", fixture.Name(), err)
74+
continue
75+
}
76+
if !wasConverted {
77+
t.Errorf("expected wasConverted to be true but was %t", wasConverted)
78+
}
79+
80+
convertedMachineSetJSONBytes, err := json.Marshal(*convertedMachineSet)
81+
if err != nil {
82+
t.Errorf("faile to marshal converted machineSet %s: %v", convertedMachineSet.Name, err)
83+
continue
84+
}
85+
convertedMachineSetYamlBytes, err := yaml.JSONToYAML(convertedMachineSetJSONBytes)
86+
if err != nil {
87+
t.Errorf("failed to convert json to yaml: %v", err)
88+
continue
89+
}
90+
91+
testhelper.CompareOutput(t, fmt.Sprintf("migrated_clusterv1alpha1machineSetWithProviderConfig/%s", fixture.Name()), string(convertedMachineSetYamlBytes), *update)
92+
}
93+
}
94+
95+
func Test_Convert_Machine_ProviderConfig_To_ProviderSpec(t *testing.T) {
1596
fixtures, err := ioutil.ReadDir("testdata/clusterv1alpha1machineWithProviderConfig")
1697
if err != nil {
1798
t.Fatalf("failed to list fixtures: %v", err)
@@ -28,11 +109,14 @@ func Test_Convert_ProviderConfig_To_ProviderSpec(t *testing.T) {
28109
t.Errorf("failed to convert yaml to json: %v", err)
29110
continue
30111
}
31-
convertedMachine, _, err := Convert_ProviderConfig_To_ProviderSpec(fixtureJSONBytes)
112+
convertedMachine, wasConverted, err := Convert_Machine_ProviderConfig_To_ProviderSpec(fixtureJSONBytes)
32113
if err != nil {
33114
t.Errorf("failed to convert machine from file %s: %v", fixture.Name(), err)
34115
continue
35116
}
117+
if !wasConverted {
118+
t.Errorf("expected wasConverted to be true but was %t", wasConverted)
119+
}
36120
convertedMachineJSONBytes, err := json.Marshal(*convertedMachine)
37121
if err != nil {
38122
t.Errorf("faile to marshal converted machine %s: %v", convertedMachine.Name, err)
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
apiVersion: cluster.k8s.io/v1alpha1
2+
kind: MachineDeployment
3+
metadata:
4+
annotations:
5+
machinedeployment.clusters.k8s.io/revision: "1"
6+
generateName: kubermatic-gttbxgswnv-
7+
generation: 1
8+
name: kubermatic-gttbxgswnv-q5rcj
9+
namespace: kube-system
10+
spec:
11+
minReadySeconds: 0
12+
progressDeadlineSeconds: 600
13+
replicas: 3
14+
revisionHistoryLimit: 1
15+
selector:
16+
matchLabels:
17+
machine: md-gttbxgswnv-nl5s9qs8ww
18+
strategy:
19+
rollingUpdate:
20+
maxSurge: 1
21+
maxUnavailable: 0
22+
type: RollingUpdate
23+
template:
24+
metadata:
25+
creationTimestamp: null
26+
labels:
27+
machine: md-gttbxgswnv-nl5s9qs8ww
28+
spec:
29+
metadata:
30+
creationTimestamp: null
31+
providerConfig:
32+
value:
33+
cloudProvider: hetzner
34+
cloudProviderSpec:
35+
datacenter: nbg1-dc3
36+
location: ""
37+
serverType: cx31
38+
token: ""
39+
operatingSystem: ubuntu
40+
operatingSystemSpec:
41+
distUpgradeOnBoot: false
42+
sshPublicKeys: []
43+
versions:
44+
kubelet: 1.11.6
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
apiVersion: cluster.k8s.io/v1alpha1
2+
kind: MachineSet
3+
metadata:
4+
annotations:
5+
machinedeployment.clusters.k8s.io/desired-replicas: "3"
6+
machinedeployment.clusters.k8s.io/max-replicas: "4"
7+
machinedeployment.clusters.k8s.io/revision: "1"
8+
creationTimestamp: "2019-01-23T12:59:25Z"
9+
generation: 1
10+
labels:
11+
machine: md-gttbxgswnv-nl5s9qs8ww
12+
machine-template-hash: "1950051685"
13+
name: kubermatic-gttbxgswnv-q5rcj-5f94495bd9
14+
namespace: kube-system
15+
ownerReferences:
16+
- apiVersion: cluster.k8s.io/v1alpha1
17+
blockOwnerDeletion: true
18+
controller: true
19+
kind: MachineDeployment
20+
name: kubermatic-gttbxgswnv-q5rcj
21+
uid: b5fd92a1-1f0e-11e9-9561-b2d5a2b51b30
22+
resourceVersion: "9387"
23+
spec:
24+
replicas: 3
25+
selector:
26+
matchLabels:
27+
machine: md-gttbxgswnv-nl5s9qs8ww
28+
machine-template-hash: "1950051685"
29+
template:
30+
metadata:
31+
creationTimestamp: null
32+
labels:
33+
machine: md-gttbxgswnv-nl5s9qs8ww
34+
machine-template-hash: "1950051685"
35+
spec:
36+
metadata:
37+
creationTimestamp: null
38+
providerConfig:
39+
value:
40+
cloudProvider: hetzner
41+
cloudProviderSpec:
42+
datacenter: nbg1-dc3
43+
location: ""
44+
serverType: cx31
45+
token: ""
46+
operatingSystem: ubuntu
47+
operatingSystemSpec:
48+
distUpgradeOnBoot: false
49+
sshPublicKeys: []
50+
versions:
51+
kubelet: 1.11.6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
apiVersion: cluster.k8s.io/v1alpha1
2+
kind: MachineDeployment
3+
metadata:
4+
annotations:
5+
machinedeployment.clusters.k8s.io/revision: "1"
6+
creationTimestamp: null
7+
generateName: kubermatic-gttbxgswnv-
8+
generation: 1
9+
name: kubermatic-gttbxgswnv-q5rcj
10+
namespace: kube-system
11+
spec:
12+
minReadySeconds: 0
13+
progressDeadlineSeconds: 600
14+
replicas: 3
15+
revisionHistoryLimit: 1
16+
selector:
17+
matchLabels:
18+
machine: md-gttbxgswnv-nl5s9qs8ww
19+
strategy:
20+
rollingUpdate:
21+
maxSurge: 1
22+
maxUnavailable: 0
23+
type: RollingUpdate
24+
template:
25+
metadata:
26+
creationTimestamp: null
27+
labels:
28+
machine: md-gttbxgswnv-nl5s9qs8ww
29+
spec:
30+
metadata:
31+
creationTimestamp: null
32+
providerSpec:
33+
value:
34+
cloudProvider: hetzner
35+
cloudProviderSpec:
36+
datacenter: nbg1-dc3
37+
location: ""
38+
serverType: cx31
39+
token: ""
40+
operatingSystem: ubuntu
41+
operatingSystemSpec:
42+
distUpgradeOnBoot: false
43+
sshPublicKeys: []
44+
versions:
45+
kubelet: 1.11.6
46+
status: {}

0 commit comments

Comments
 (0)