Skip to content

Commit 8a2fcf4

Browse files
committed
Create unmanaged kubernetes cluster on CloudStack
1 parent 1202d41 commit 8a2fcf4

13 files changed

+233
-35
lines changed

api/v1beta2/cloudstackcluster_types.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,10 @@ type CloudStackClusterStatus struct {
4343
// +optional
4444
FailureDomains clusterv1.FailureDomains `json:"failureDomains,omitempty"`
4545

46+
// Id of CAPC managed kubernetes cluster created in CloudStack
47+
// +optional
48+
CloudStackClusterID string `json:"cloudStackClusterId"`
49+
4650
// Reflects the readiness of the CS cluster.
4751
Ready bool `json:"ready"`
4852
}

config/.flag-test.mk

Whitespace-only changes.

config/crd/bases/infrastructure.cluster.x-k8s.io_cloudstackclusters.yaml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -283,6 +283,9 @@ spec:
283283
status:
284284
description: The actual cluster state reported by CloudStack.
285285
properties:
286+
cloudStackClusterId:
287+
description: Id of CAPC managed kubernetes cluster created in CloudStack
288+
type: string
286289
failureDomains:
287290
additionalProperties:
288291
description: FailureDomainSpec is the Schema for Cluster API failure

config/webhook/manifests.yaml

Lines changed: 0 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -92,23 +92,3 @@ webhooks:
9292
resources:
9393
- cloudstackmachines
9494
sideEffects: None
95-
- admissionReviewVersions:
96-
- v1beta1
97-
clientConfig:
98-
service:
99-
name: webhook-service
100-
namespace: system
101-
path: /validate-infrastructure-cluster-x-k8s-io-v1beta2-cloudstackmachinetemplate
102-
failurePolicy: Fail
103-
name: vcloudstackmachinetemplate.kb.io
104-
rules:
105-
- apiGroups:
106-
- infrastructure.cluster.x-k8s.io
107-
apiVersions:
108-
- v1beta2
109-
operations:
110-
- CREATE
111-
- UPDATE
112-
resources:
113-
- cloudstackmachinetemplates
114-
sideEffects: None

controllers/cloudstackcluster_controller.go

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import (
2020
"context"
2121
"fmt"
2222
"reflect"
23+
"strings"
2324

2425
ctrl "sigs.k8s.io/controller-runtime"
2526
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
@@ -92,9 +93,27 @@ func (r *CloudStackClusterReconciliationRunner) Reconcile() (res ctrl.Result, re
9293
r.GetFailureDomains(r.FailureDomains),
9394
r.RemoveExtraneousFailureDomains(r.FailureDomains),
9495
r.VerifyFailureDomainCRDs,
96+
r.GetOrCreateCluster,
9597
r.SetReady)
9698
}
9799

100+
// GetOrCreateCluster checks if an unmanaged cluster is present in Cloudstack else creates one.
101+
func (r *CloudStackClusterReconciliationRunner) GetOrCreateCluster() (ctrl.Result, error) {
102+
// Check that all required failure domains are present and ready.
103+
// TODO: Add logging on whether this was successful or not
104+
r.AsFailureDomainUser(&r.FailureDomains.Items[0].Spec)()
105+
err := r.CSUser.GetOrCreateCluster(r.CAPICluster, r.ReconciliationSubject, &r.FailureDomains.Items[0].Spec)
106+
if err != nil {
107+
if strings.Contains(err.Error(), "Kubernetes Service plugin is disabled") {
108+
r.Log.Info("Kubernetes Service plugin is disabled on CloudStack. Skipping creating unmanaged kubernets cluster")
109+
return ctrl.Result{}, nil
110+
} else {
111+
return r.RequeueWithMessage(fmt.Sprintf("Creating unmanaged kubernetes cluster failed. Error: %s", err.Error()))
112+
}
113+
}
114+
return ctrl.Result{}, nil
115+
}
116+
98117
// SetReady adds a finalizer and sets the cluster status to ready.
99118
func (r *CloudStackClusterReconciliationRunner) SetReady() (ctrl.Result, error) {
100119
controllerutil.AddFinalizer(r.ReconciliationSubject, infrav1.ClusterFinalizer)
@@ -148,10 +167,29 @@ func (r *CloudStackClusterReconciliationRunner) ReconcileDelete() (ctrl.Result,
148167
}
149168
return r.RequeueWithMessage("Child FailureDomains still present, requeueing.")
150169
}
170+
if res, err := r.DeleteCluster(); r.ShouldReturn(res, err) {
171+
return res, err
172+
}
151173
controllerutil.RemoveFinalizer(r.ReconciliationSubject, infrav1.ClusterFinalizer)
152174
return ctrl.Result{}, nil
153175
}
154176

177+
// DeleteCluster checks if an unmanaged cluster is present in Cloudstack and then deletes it.
178+
func (r *CloudStackClusterReconciliationRunner) DeleteCluster() (ctrl.Result, error) {
179+
// Check that all required failure domains are present and ready.
180+
// If field is present and delete fails, then requeue
181+
// TODO: Throw error here if cluster exists created
182+
r.AsFailureDomainUser(&r.CSCluster.Spec.FailureDomains[0])()
183+
err := r.CSUser.DeleteCluster(r.ReconciliationSubject)
184+
if err != nil {
185+
if strings.Contains(err.Error(), " not found") {
186+
return ctrl.Result{}, nil
187+
}
188+
return r.RequeueWithMessage(fmt.Sprintf("Deleting unmanaged kubernetes cluster on CloudStack failed. error: %s", err.Error()))
189+
}
190+
return ctrl.Result{}, nil
191+
}
192+
155193
// Called in main, this registers the cluster reconciler to the CAPI controller manager.
156194
func (reconciler *CloudStackClusterReconciler) SetupWithManager(ctx context.Context, mgr ctrl.Manager) error {
157195
controller, err := ctrl.NewControllerManagedBy(mgr).

controllers/cloudstackfailuredomain_controller.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,15 @@ package controllers
1818

1919
import (
2020
"context"
21+
"sort"
22+
2123
"github.com/pkg/errors"
2224
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
2325
"k8s.io/apimachinery/pkg/runtime/schema"
2426
clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1"
2527
ctrl "sigs.k8s.io/controller-runtime"
2628
"sigs.k8s.io/controller-runtime/pkg/client"
2729
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
28-
"sort"
2930

3031
infrav1 "sigs.k8s.io/cluster-api-provider-cloudstack/api/v1beta2"
3132
csCtrlrUtils "sigs.k8s.io/cluster-api-provider-cloudstack/controllers/utils"

controllers/cloudstackmachine_controller.go

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,12 @@ package controllers
1919
import (
2020
"context"
2121
"fmt"
22-
"k8s.io/utils/pointer"
2322
"math/rand"
2423
"reflect"
2524
"regexp"
2625

26+
"k8s.io/utils/pointer"
27+
2728
"github.com/pkg/errors"
2829
corev1 "k8s.io/api/core/v1"
2930
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -125,6 +126,7 @@ func (r *CloudStackMachineReconciliationRunner) Reconcile() (retRes ctrl.Result,
125126
r.RequeueIfInstanceNotRunning,
126127
r.AddToLBIfNeeded,
127128
r.GetOrCreateMachineStateChecker,
129+
r.AttachVM,
128130
)
129131
}
130132

@@ -196,6 +198,20 @@ func (r *CloudStackMachineReconciliationRunner) DeleteMachineIfFailuredomainNotE
196198
return ctrl.Result{}, nil
197199
}
198200

201+
// AttachVM adds the VM to CloudStack Unmanaged kubernetes.
202+
// No action taken if it fails
203+
func (r *CloudStackMachineReconciliationRunner) AttachVM() (retRes ctrl.Result, reterr error) {
204+
_ = r.CSUser.AddVMToCluster(r.CSCluster, r.ReconciliationSubject)
205+
return ctrl.Result{}, nil
206+
}
207+
208+
// RemoveVM removes the VM from CloudStack Unmanaged kubernetes.
209+
// No action taken if it fails
210+
func (r *CloudStackMachineReconciliationRunner) RemoveVM() (retRes ctrl.Result, reterr error) {
211+
_ = r.CSUser.RemoveVMFromCluster(r.CSCluster, r.ReconciliationSubject)
212+
return ctrl.Result{}, nil
213+
}
214+
199215
// GetOrCreateVMInstance gets or creates a VM instance.
200216
// Implicitly it also fetches its bootstrap secret in order to create said instance.
201217
func (r *CloudStackMachineReconciliationRunner) GetOrCreateVMInstance() (retRes ctrl.Result, reterr error) {
@@ -324,6 +340,7 @@ func (r *CloudStackMachineReconciliationRunner) ReconcileDelete() (retRes ctrl.R
324340
return ctrl.Result{}, err
325341
}
326342

343+
r.RemoveVM()
327344
controllerutil.RemoveFinalizer(r.ReconciliationSubject, infrav1.MachineFinalizer)
328345
r.Log.Info("VM Deleted", "instanceID", r.ReconciliationSubject.Spec.InstanceID)
329346
return ctrl.Result{}, nil

go.mod

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,12 @@ go 1.19
44

55
require (
66
github.com/ReneKroon/ttlcache v1.7.0
7-
github.com/apache/cloudstack-go/v2 v2.13.0
7+
github.com/apache/cloudstack-go/v2 v2.15.0
88
github.com/go-logr/logr v1.2.3
99
github.com/golang/mock v1.6.0
1010
github.com/hashicorp/go-multierror v1.1.1
11-
github.com/onsi/ginkgo/v2 v2.4.0
12-
github.com/onsi/gomega v1.24.0
11+
github.com/onsi/ginkgo/v2 v2.9.1
12+
github.com/onsi/gomega v1.27.4
1313
github.com/pkg/errors v0.9.1
1414
github.com/prometheus/client_golang v1.14.0
1515
github.com/smallfish/simpleyaml v0.1.0
@@ -49,14 +49,16 @@ require (
4949
github.com/go-openapi/jsonpointer v0.19.5 // indirect
5050
github.com/go-openapi/jsonreference v0.20.0 // indirect
5151
github.com/go-openapi/swag v0.22.3 // indirect
52+
github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0 // indirect
5253
github.com/gobuffalo/flect v0.3.0 // indirect
5354
github.com/gogo/protobuf v1.3.2 // indirect
5455
github.com/golang-jwt/jwt/v4 v4.2.0 // indirect
5556
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
56-
github.com/golang/protobuf v1.5.2 // indirect
57+
github.com/golang/protobuf v1.5.3 // indirect
5758
github.com/google/gnostic v0.6.9 // indirect
5859
github.com/google/go-cmp v0.5.9 // indirect
5960
github.com/google/gofuzz v1.2.0 // indirect
61+
github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1 // indirect
6062
github.com/google/uuid v1.2.0 // indirect
6163
github.com/hashicorp/errwrap v1.0.0 // indirect
6264
github.com/imdario/mergo v0.3.13 // indirect
@@ -84,6 +86,7 @@ require (
8486
golang.org/x/sys v0.7.0 // indirect
8587
golang.org/x/term v0.7.0 // indirect
8688
golang.org/x/time v0.2.0 // indirect
89+
golang.org/x/tools v0.7.0 // indirect
8790
gomodules.xyz/jsonpatch/v2 v2.2.0 // indirect
8891
google.golang.org/appengine v1.6.7 // indirect
8992
google.golang.org/genproto v0.0.0-20221107162902-2d387536bcdd // indirect

go.sum

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -89,8 +89,8 @@ github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk5
8989
github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
9090
github.com/antlr/antlr4/runtime/Go/antlr v1.4.10 h1:yL7+Jz0jTC6yykIK/Wh74gnTJnrGr5AyrNMXuA0gves=
9191
github.com/antlr/antlr4/runtime/Go/antlr v1.4.10/go.mod h1:F7bn7fEU90QkQ3tnmaTx3LTKLEDqnwWODIYppRQ5hnY=
92-
github.com/apache/cloudstack-go/v2 v2.13.0 h1:t0uj7QxQpnzD/LSTP6a4w2NTuZXisxIM/mIDNkF44lc=
93-
github.com/apache/cloudstack-go/v2 v2.13.0/go.mod h1:aosD8Svfu5nhH5Sp4zcsVV1hT5UGt3mTgRXM8YqTKe0=
92+
github.com/apache/cloudstack-go/v2 v2.15.0 h1:oojn1qx0+wBwrFSSmA2rL8XjWd4BXqwYo0RVCrAXoHk=
93+
github.com/apache/cloudstack-go/v2 v2.15.0/go.mod h1:Mc+tXpujtslBuZFk5atoGT2LanVxOrXS2GGgidAoz1A=
9494
github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=
9595
github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=
9696
github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
@@ -192,6 +192,8 @@ github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh
192192
github.com/go-openapi/swag v0.22.3 h1:yMBqmnQ0gyZvEb/+KzuWZOXgllrXT4SADYbvDaXHv/g=
193193
github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14=
194194
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
195+
github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0 h1:p104kn46Q8WdvHunIJ9dAyjPVtrBPhSr3KT2yUst43I=
196+
github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE=
195197
github.com/gobuffalo/flect v0.3.0 h1:erfPWM+K1rFNIQeRPdeEXxo8yFr/PO17lhRnS8FUrtk=
196198
github.com/gobuffalo/flect v0.3.0/go.mod h1:5pf3aGnsvqvCj50AVni7mJJF8ICxGZ8HomberC3pXLE=
197199
github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
@@ -234,8 +236,9 @@ github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw
234236
github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
235237
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
236238
github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM=
237-
github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=
238239
github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
240+
github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=
241+
github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
239242
github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
240243
github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
241244
github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
@@ -278,6 +281,7 @@ github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLe
278281
github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
279282
github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
280283
github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
284+
github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1 h1:K6RDEckDVWvDI9JAJYCmNdQXq6neHJOYx3V6jnqNEec=
281285
github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
282286
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
283287
github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
@@ -394,10 +398,10 @@ github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRW
394398
github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE=
395399
github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
396400
github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE=
397-
github.com/onsi/ginkgo/v2 v2.4.0 h1:+Ig9nvqgS5OBSACXNk15PLdp0U9XPYROt9CFzVdFGIs=
398-
github.com/onsi/ginkgo/v2 v2.4.0/go.mod h1:iHkDK1fKGcBoEHT5W7YBq4RFWaQulw+caOMkAt4OrFo=
399-
github.com/onsi/gomega v1.24.0 h1:+0glovB9Jd6z3VR+ScSwQqXVTIfJcGA9UBM8yzQxhqg=
400-
github.com/onsi/gomega v1.24.0/go.mod h1:Z/NWtiqwBrwUt4/2loMmHL63EDLnYHmVbuBpDr2vQAg=
401+
github.com/onsi/ginkgo/v2 v2.9.1 h1:zie5Ly042PD3bsCvsSOPvRnFwyo3rKe64TJlD6nu0mk=
402+
github.com/onsi/ginkgo/v2 v2.9.1/go.mod h1:FEcmzVcCHl+4o9bQZVab+4dC9+j+91t2FHSzmGAPfuo=
403+
github.com/onsi/gomega v1.27.4 h1:Z2AnStgsdSayCMDiCU42qIz+HLqEPcgiOCXjAU/w+8E=
404+
github.com/onsi/gomega v1.27.4/go.mod h1:riYq/GJKh8hhoM01HN6Vmuy93AarCXCBGpvFDK3q3fQ=
401405
github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U=
402406
github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM=
403407
github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
@@ -804,6 +808,8 @@ golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
804808
golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
805809
golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
806810
golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
811+
golang.org/x/tools v0.7.0 h1:W4OVu8VVOaIO0yzWMNdepAulS7YfoS3Zabrm8DOXXU4=
812+
golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s=
807813
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
808814
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
809815
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=

pkg/cloud/client.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ import (
3737
//go:generate ../../hack/tools/bin/mockgen -destination=../mocks/mock_client.go -package=mocks sigs.k8s.io/cluster-api-provider-cloudstack/pkg/cloud Client
3838

3939
type Client interface {
40+
ClusterIface
4041
VMIface
4142
NetworkIface
4243
AffinityGroupIface

0 commit comments

Comments
 (0)