@@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
1414limitations under the License.
1515*/
1616
17- package tasks
17+ package hetzner
1818
1919import (
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+
129199func 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-
190249func 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