@@ -6,14 +6,19 @@ import (
66 "fmt"
77
88 "github.com/kubermatic/kubeone/pkg/config"
9+ "github.com/kubermatic/kubeone/pkg/installer/util"
910 "github.com/kubermatic/kubeone/pkg/templates"
1011
12+ "k8s.io/apimachinery/pkg/api/equality"
13+ apierrors "k8s.io/apimachinery/pkg/api/errors"
1114 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1215 "k8s.io/apimachinery/pkg/labels"
1316 "k8s.io/apimachinery/pkg/runtime"
1417 "k8s.io/apimachinery/pkg/util/intstr"
1518 clustercommon "sigs.k8s.io/cluster-api/pkg/apis/cluster/common"
1619 clusterv1alpha1 "sigs.k8s.io/cluster-api/pkg/apis/cluster/v1alpha1"
20+ clusterclientset "sigs.k8s.io/cluster-api/pkg/client/clientset_generated/clientset"
21+ clustertypes "sigs.k8s.io/cluster-api/pkg/client/clientset_generated/clientset/typed/cluster/v1alpha1"
1722)
1823
1924type providerSpec struct {
@@ -24,20 +29,36 @@ type providerSpec struct {
2429 OperatingSystemSpec interface {} `json:"operatingSystemSpec"`
2530}
2631
27- // MachineDeployments returns YAML manifests for MachineDeployments
28- func MachineDeployments (cluster * config.Cluster ) (string , error ) {
29- deployments := make ([]interface {}, 0 )
32+ // DeployMachineDeployments deploys MachineDeployments that create appropriate machines
33+ func DeployMachineDeployments (ctx * util.Context ) error {
34+ if ctx .Clientset == nil {
35+ return errors .New ("kubernetes clientset not initialized" )
36+ }
37+ if ctx .RESTConfig == nil {
38+ return errors .New ("kubernetes rest config not initialized" )
39+ }
40+
41+ // Create Cluster-API clientset
42+ clusterapiClientset , err := clusterclientset .NewForConfig (ctx .RESTConfig )
43+ if err != nil {
44+ return err
45+ }
46+ clusterapiClient := clusterapiClientset .ClusterV1alpha1 ()
3047
31- for _ , workerset := range cluster .Workers {
32- deployment , err := createMachineDeployment (cluster , workerset )
48+ // Apply MachineDeployments
49+ for _ , workerset := range ctx .Cluster .Workers {
50+ deployment , err := createMachineDeployment (ctx .Cluster , workerset )
3351 if err != nil {
34- return "" , err
52+ return err
3553 }
3654
37- deployments = append (deployments , deployment )
55+ err = ensureMachineDeployment (clusterapiClient .MachineDeployments (deployment .Namespace ), deployment )
56+ if err != nil {
57+ return err
58+ }
3859 }
3960
40- return templates . KubernetesToYAML ( deployments )
61+ return nil
4162}
4263
4364func createMachineDeployment (cluster * config.Cluster , workerset config.WorkerConfig ) (* clusterv1alpha1.MachineDeployment , error ) {
@@ -113,6 +134,27 @@ func createMachineDeployment(cluster *config.Cluster, workerset config.WorkerCon
113134 }, nil
114135}
115136
137+ func ensureMachineDeployment (machineDeploymentsClient clustertypes.MachineDeploymentInterface , required * clusterv1alpha1.MachineDeployment ) error {
138+ existing , err := machineDeploymentsClient .Get (required .Name , metav1.GetOptions {})
139+ if apierrors .IsNotFound (err ) {
140+ _ , err = machineDeploymentsClient .Create (required )
141+ return err
142+ }
143+ if err != nil {
144+ return err
145+ }
146+
147+ modified := false
148+ templates .MergeStringMap (& modified , & existing .ObjectMeta .Annotations , required .ObjectMeta .Annotations )
149+ templates .MergeStringMap (& modified , & existing .ObjectMeta .Labels , required .ObjectMeta .Labels )
150+ if equality .Semantic .DeepEqual (required .Spec , existing .Spec ) && ! modified {
151+ return nil
152+ }
153+
154+ _ , err = machineDeploymentsClient .Update (existing )
155+ return err
156+ }
157+
116158func machineSpec (cluster * config.Cluster , workerset config.WorkerConfig , provider config.ProviderName ) (map [string ]interface {}, error ) {
117159 var err error
118160
0 commit comments