Skip to content

Commit 13d839d

Browse files
authored
Move every control-plane prpvider into own package (#4179)
Signed-off-by: Artiom Diomin <artiom@kubermatic.com>
1 parent 950b701 commit 13d839d

5 files changed

Lines changed: 420 additions & 428 deletions

File tree

Lines changed: 87 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
1414
limitations under the License.
1515
*/
1616

17-
package tasks
17+
package hetzner
1818

1919
import (
2020
"context"
@@ -27,6 +27,7 @@ import (
2727
"github.com/hetznercloud/hcloud-go/v2/hcloud"
2828

2929
kubeoneapi "k8c.io/kubeone/pkg/apis/kubeone"
30+
"k8c.io/kubeone/pkg/cloudprovider"
3031
"k8c.io/kubeone/pkg/credentials"
3132
"k8c.io/kubeone/pkg/fail"
3233
"k8c.io/kubeone/pkg/provisioner"
@@ -42,29 +43,67 @@ import (
4243
"k8s.io/apimachinery/pkg/types"
4344
)
4445

45-
func generateHetznerControlPlaneTasks(capimachines []clusterv1alpha1.Machine) Tasks {
46-
tasks := Tasks{}
46+
var (
47+
_ cloudprovider.ControlPlaneCloudProvider = &Provider{}
48+
_ cloudprovider.LoadBalancerProvider = &Provider{}
49+
)
4750

48-
for _, machine := range capimachines {
49-
tasks = append(tasks,
50-
Task{
51-
Description: fmt.Sprintf("Ensure Hetzner control-plane %q VM", machine.Name),
52-
Predicate: isHetznerControlPlaneEnabled,
53-
Fn: func(s *state.State) error {
54-
return ensureHetznerControlPlaneVM(s, machine)
55-
},
56-
},
57-
)
51+
func init() {
52+
cloudprovider.Register(&Provider{})
53+
}
54+
55+
type Provider struct{}
56+
57+
func (p *Provider) Name() string { return "Hetzner" }
58+
59+
func (p *Provider) Enabled(s *state.State) bool {
60+
return s.Cluster.CloudProvider.Hetzner != nil && len(s.Cluster.ControlPlane.NodeSets) > 0
61+
}
62+
63+
func (p *Provider) MatchesConfig(cluster *kubeoneapi.KubeOneCluster) bool {
64+
return cluster.CloudProvider.Hetzner != nil
65+
}
66+
67+
func (p *Provider) HasLoadBalancer(s *state.State) bool {
68+
return p.Enabled(s)
69+
}
70+
71+
func (p *Provider) GenerateMachines(clusterName string, nodeSet []kubeoneapi.NodeSet, kubeletVersion string) ([]clusterv1alpha1.Machine, error) {
72+
return generateHetznerControlPlaneMachines(clusterName, nodeSet, kubeletVersion)
73+
}
74+
75+
func (p *Provider) EnsureVM(s *state.State, capimachine clusterv1alpha1.Machine) error {
76+
provMachines, err := provisioner.FindOrCreateMachines(s.Context, []clusterv1alpha1.Machine{capimachine}, s.Logger)
77+
if err != nil {
78+
return err
5879
}
5980

60-
return tasks
81+
s.Cluster.ControlPlane.Hosts = append(s.Cluster.ControlPlane.Hosts, cloudprovider.HostConfigsFromMachines(provMachines, s.Cluster.ControlPlane.NodeSets)...)
82+
83+
return nil
6184
}
6285

63-
func isHetznerControlPlaneEnabled(s *state.State) bool {
64-
return s.Cluster.CloudProvider.Hetzner != nil && len(s.Cluster.ControlPlane.NodeSets) > 0
86+
func (p *Provider) LookupVMs(s *state.State) error {
87+
capimachines, err := p.GenerateMachines(
88+
s.Cluster.Name,
89+
s.Cluster.ControlPlane.NodeSets,
90+
s.Cluster.Versions.Kubernetes,
91+
)
92+
if err != nil {
93+
return err
94+
}
95+
96+
provMachines, err := provisioner.FindMachines(s.Context, capimachines, s.Logger)
97+
if err != nil {
98+
return err
99+
}
100+
101+
s.Cluster.ControlPlane.Hosts = append(s.Cluster.ControlPlane.Hosts, cloudprovider.HostConfigsFromMachines(provMachines, s.Cluster.ControlPlane.NodeSets)...)
102+
103+
return nil
65104
}
66105

67-
func ensureHetznerLoadBalancer(s *state.State) error {
106+
func (p *Provider) EnsureLoadBalancer(s *state.State) error {
68107
if s.Cluster.APIEndpoint.Host != "" {
69108
return nil
70109
}
@@ -126,6 +165,37 @@ func ensureHetznerLoadBalancer(s *state.State) error {
126165
return nil
127166
}
128167

168+
func (p *Provider) LookupLoadBalancer(s *state.State) error {
169+
if s.Cluster.APIEndpoint.Host != "" {
170+
return nil
171+
}
172+
173+
providerCreds, err := credentials.ProviderCredentials(s.Cluster.CloudProvider, s.CredentialsFilePath, credentials.TypeUniversal)
174+
if err != nil {
175+
return err
176+
}
177+
178+
hzclient := hcloud.NewClient(hcloud.WithToken(providerCreds[credentials.HetznerTokenKeyMC]))
179+
ctx := context.Background()
180+
181+
clusterLBName := s.Cluster.CloudProvider.Hetzner.ControlPlane.LoadBalancer.Name
182+
lbs, _, err := hzclient.LoadBalancer.List(ctx, hcloud.LoadBalancerListOpts{
183+
Name: clusterLBName,
184+
})
185+
if err != nil {
186+
return fail.Cloud(err, "hetzner", "listing loadbalancers")
187+
}
188+
189+
if len(lbs) == 0 {
190+
return fail.Cloud(fmt.Errorf("no load balancer found with name: %s", clusterLBName), "hetzner", "looking up loadbalancer")
191+
}
192+
193+
s.Logger.Debugf("found loadbalancer %q with id: %d", clusterLBName, lbs[0].ID)
194+
s.Cluster.APIEndpoint.Host = lbs[0].PublicNet.IPv4.IP.String()
195+
196+
return nil
197+
}
198+
129199
func createHetznerLoadBalancer(
130200
ctx context.Context,
131201
client hcloud.ILoadBalancerClient,
@@ -176,17 +246,6 @@ func createHetznerLoadBalancer(
176246
return result.LoadBalancer, nil
177247
}
178248

179-
func ensureHetznerControlPlaneVM(s *state.State, capimachine clusterv1alpha1.Machine) error {
180-
provMachines, err := provisioner.FindOrCreateMachines(s.Context, []clusterv1alpha1.Machine{capimachine}, s.Logger)
181-
if err != nil {
182-
return err
183-
}
184-
185-
s.Cluster.ControlPlane.Hosts = append(s.Cluster.ControlPlane.Hosts, hostConfigsFromMachines(provMachines, s.Cluster.ControlPlane.NodeSets)...)
186-
187-
return nil
188-
}
189-
190249
func hetznerLabels(clusterName string) map[string]string {
191250
return map[string]string{
192251
"kubeone_cluster_name": clusterName,
@@ -277,54 +336,3 @@ func generateHetznerControlPlaneMachines(clusterName string, nodeSet []kubeoneap
277336

278337
return machines, nil
279338
}
280-
281-
func lookupHetznerVMs(s *state.State) error {
282-
capimachines, err := generateHetznerControlPlaneMachines(
283-
s.Cluster.Name,
284-
s.Cluster.ControlPlane.NodeSets,
285-
s.Cluster.Versions.Kubernetes,
286-
)
287-
if err != nil {
288-
return err
289-
}
290-
291-
provMachines, err := provisioner.FindMachines(s.Context, capimachines, s.Logger)
292-
if err != nil {
293-
return err
294-
}
295-
296-
s.Cluster.ControlPlane.Hosts = append(s.Cluster.ControlPlane.Hosts, hostConfigsFromMachines(provMachines, s.Cluster.ControlPlane.NodeSets)...)
297-
298-
return nil
299-
}
300-
301-
func lookupHetznerLoadBalancer(s *state.State) error {
302-
if s.Cluster.APIEndpoint.Host != "" {
303-
return nil
304-
}
305-
306-
providerCreds, err := credentials.ProviderCredentials(s.Cluster.CloudProvider, s.CredentialsFilePath, credentials.TypeUniversal)
307-
if err != nil {
308-
return err
309-
}
310-
311-
hzclient := hcloud.NewClient(hcloud.WithToken(providerCreds[credentials.HetznerTokenKeyMC]))
312-
ctx := context.Background()
313-
314-
clusterLBName := s.Cluster.CloudProvider.Hetzner.ControlPlane.LoadBalancer.Name
315-
lbs, _, err := hzclient.LoadBalancer.List(ctx, hcloud.LoadBalancerListOpts{
316-
Name: clusterLBName,
317-
})
318-
if err != nil {
319-
return fail.Cloud(err, "hetzner", "listing loadbalancers")
320-
}
321-
322-
if len(lbs) == 0 {
323-
return fail.Cloud(fmt.Errorf("no load balancer found with name: %s", clusterLBName), "hetzner", "looking up loadbalancer")
324-
}
325-
326-
s.Logger.Debugf("found loadbalancer %q with id: %d", clusterLBName, lbs[0].ID)
327-
s.Cluster.APIEndpoint.Host = lbs[0].PublicNet.IPv4.IP.String()
328-
329-
return nil
330-
}

0 commit comments

Comments
 (0)