Skip to content

Commit 064a773

Browse files
committed
merge upstream
2 parents 936fcd5 + 596ad4f commit 064a773

File tree

80 files changed

+1073
-1513
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

80 files changed

+1073
-1513
lines changed

Makefile

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
# Image URL to use all building/pushing image targets
2-
IMG ?= public.ecr.aws/a4z9h2b1/cluster-api-provider-capc:latest
3-
IMG_LOCAL ?= localhost:5000/cluster-api-provider-cloudstack:latest
2+
STAGING_REGISTRY := gcr.io/k8s-staging-capi-cloudstack
3+
REGISTRY ?= $(STAGING_REGISTRY)
4+
IMAGE_NAME ?= capi-cloudstack-controller
5+
TAG ?= dev
6+
IMG ?= $(REGISTRY)/$(IMAGE_NAME):$(TAG)
7+
IMG_LOCAL ?= localhost:5000/$(IMAGE_NAME):$(TAG)
48

59
# Get the currently used golang install path (in GOPATH/bin, unless GOBIN is set)
610
ifeq (,$(shell go env GOBIN))
@@ -45,7 +49,7 @@ help: ## Display this help.
4549
@awk 'BEGIN {FS = ":.*##"; printf "\nUsage:\n make \033[36m<target>\033[0m\n"} /^[a-zA-Z_0-9-]+:.*?##/ { printf " \033[36m%-15s\033[0m %s\n", $$1, $$2 } /^##@/ { printf "\n\033[1m%s\033[0m\n", substr($$0, 5) } ' $(MAKEFILE_LIST)
4650

4751
MANIFEST_GEN_INPUTS=$(shell find ./api ./controllers -type f -name "*test*" -prune -o -name "*zz_generated*" -prune -o -print)
48-
52+
4953
# Using a flag file here as config output is too complicated to be a target.
5054
# The following triggers manifest building if $(IMG) differs from that found in config/default/manager_image_patch.yaml.
5155
$(shell grep -qs "$(IMG)" config/default/manager_image_patch_edited.yaml || rm -f config/.flag.mk)
@@ -58,7 +62,7 @@ config/.flag.mk: bin/controller-gen $(MANIFEST_GEN_INPUTS)
5862

5963
.PHONY: release-manifests
6064
RELEASE_MANIFEST_TARGETS=$(RELEASE_DIR)/infrastructure-components.yaml $(RELEASE_DIR)/metadata.yaml
61-
RELEASE_MANIFEST_INPUTS=bin/kustomize config/.flag.mk $(shell find config)
65+
RELEASE_MANIFEST_INPUTS=bin/kustomize config/.flag.mk $(shell find config)
6266
release-manifests: $(RELEASE_MANIFEST_TARGETS) ## Create kustomized release manifest in $RELEASE_DIR (defaults to out).
6367
$(RELEASE_DIR)/%: $(RELEASE_MANIFEST_INPUTS)
6468
@mkdir -p $(RELEASE_DIR)
@@ -150,13 +154,13 @@ binaries: bin/controller-gen bin/conversion-gen bin/kustomize bin/ginkgo bin/gol
150154
bin/controller-gen: ## Install controller-gen to bin.
151155
GOBIN=$(PROJECT_DIR)/bin go install sigs.k8s.io/controller-tools/cmd/[email protected]
152156
bin/conversion-gen: ## Install conversion-gen to bin.
153-
GOBIN=$(PROJECT_DIR)/bin go install k8s.io/code-generator/cmd/conversion-gen@0.23.0
157+
GOBIN=$(PROJECT_DIR)/bin go install k8s.io/code-generator/cmd/conversion-gen@v0.23.0
154158
bin/golangci-lint: ## Install golangci-lint to bin.
155159
GOBIN=$(PROJECT_DIR)/bin go install github.com/golangci/golangci-lint/cmd/[email protected]
156160
bin/staticcheck: ## Install staticcheck to bin.
157161
GOBIN=$(PROJECT_DIR)/bin go install honnef.co/go/tools/cmd/[email protected]
158162
bin/ginkgo: bin/ginkgo_v1 bin/ginkgo_v2 ## Install ginkgo to bin.
159-
bin/ginkgo_v2:
163+
bin/ginkgo_v2:
160164
GOBIN=$(PROJECT_DIR)/bin go install github.com/onsi/ginkgo/v2/[email protected]
161165
mv $(PROJECT_DIR)/bin/ginkgo $(PROJECT_DIR)/bin/ginkgo_v2
162166
bin/ginkgo_v1:
@@ -199,7 +203,7 @@ pkg/mocks/mock%.go: $(shell find ./pkg/cloud -type f -name "*test*" -prune -o -p
199203

200204
##@ Tilt
201205

202-
.PHONY: tilt-up
206+
.PHONY: tilt-up
203207
tilt-up: cluster-api kind-cluster cluster-api/tilt-settings.json manifests cloud-config ## Setup and run tilt for development.
204208
export CLOUDSTACK_B64ENCODED_SECRET=$$(base64 -w0 -i cloud-config 2>/dev/null || base64 -b 0 -i cloud-config) && cd cluster-api && tilt up
205209

api/v1beta1/cloudstackaffinitygroup_conversion.go

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,15 @@ limitations under the License.
1717
package v1beta1
1818

1919
import (
20+
"context"
21+
"fmt"
22+
"github.com/apache/cloudstack-go/v2/cloudstack"
23+
"github.com/pkg/errors"
24+
corev1 "k8s.io/api/core/v1"
25+
conv "k8s.io/apimachinery/pkg/conversion"
2026
"sigs.k8s.io/cluster-api-provider-cloudstack/api/v1beta2"
27+
"sigs.k8s.io/cluster-api/api/v1beta1"
28+
"sigs.k8s.io/controller-runtime/pkg/client"
2129
"sigs.k8s.io/controller-runtime/pkg/conversion"
2230
)
2331

@@ -30,3 +38,70 @@ func (dst *CloudStackAffinityGroup) ConvertFrom(srcRaw conversion.Hub) error { /
3038
src := srcRaw.(*v1beta2.CloudStackAffinityGroup)
3139
return Convert_v1beta2_CloudStackAffinityGroup_To_v1beta1_CloudStackAffinityGroup(src, dst, nil)
3240
}
41+
42+
//nolint:golint,revive,stylecheck
43+
func Convert_v1beta1_CloudStackAffinityGroup_To_v1beta2_CloudStackAffinityGroup(in *CloudStackAffinityGroup, out *v1beta2.CloudStackAffinityGroup, s conv.Scope) error {
44+
out.ObjectMeta = in.ObjectMeta
45+
zoneID, zoneName, err := getAffinityGroupZone(in.ObjectMeta.Namespace, in.Spec.ID)
46+
if err != nil {
47+
return err
48+
}
49+
failureDomainName, err := GetDefaultFailureDomainName(in.ObjectMeta.Namespace, in.ObjectMeta.Labels[v1beta1.ClusterLabelName], zoneID, zoneName)
50+
if err != nil {
51+
return err
52+
}
53+
out.Spec = v1beta2.CloudStackAffinityGroupSpec{
54+
Type: in.Spec.Type,
55+
Name: in.Spec.Name,
56+
ID: in.Spec.ID,
57+
FailureDomainName: failureDomainName,
58+
}
59+
out.Status = v1beta2.CloudStackAffinityGroupStatus{
60+
Ready: in.Status.Ready,
61+
}
62+
return nil
63+
}
64+
65+
//nolint:golint,revive,stylecheck
66+
func Convert_v1beta2_CloudStackAffinityGroup_To_v1beta1_CloudStackAffinityGroup(in *v1beta2.CloudStackAffinityGroup, out *CloudStackAffinityGroup, s conv.Scope) error {
67+
out.ObjectMeta = in.ObjectMeta
68+
out.Spec = CloudStackAffinityGroupSpec{
69+
Type: in.Spec.Type,
70+
Name: in.Spec.Name,
71+
ID: in.Spec.ID,
72+
}
73+
out.Status = CloudStackAffinityGroupStatus{
74+
Ready: in.Status.Ready,
75+
}
76+
return nil
77+
}
78+
79+
func getAffinityGroupZone(namespace string, affinityGroupID string) (zoneID string, zoneName string, err error) {
80+
config, err := GetCloudStackConfig(namespace)
81+
if err != nil {
82+
return "", "", err
83+
}
84+
endpointCredentials := &corev1.Secret{}
85+
key := client.ObjectKey{Name: DefaultEndpointCredential, Namespace: namespace}
86+
if err := v1beta2.K8sClient.Get(context.TODO(), key, endpointCredentials); err != nil {
87+
return "", "", err
88+
}
89+
90+
csClient := cloudstack.NewAsyncClient(fmt.Sprint(config["api-url"]), fmt.Sprint(config["api-key"]), fmt.Sprint(config["secret-key"]), fmt.Sprint(config["verify-ssl"]) == "true")
91+
92+
parameters := csClient.VirtualMachine.NewListVirtualMachinesParams()
93+
parameters.SetAffinitygroupid(affinityGroupID)
94+
listVMResponse, err := csClient.VirtualMachine.ListVirtualMachines(parameters)
95+
if err != nil {
96+
return "", "", err
97+
}
98+
for _, vm := range listVMResponse.VirtualMachines {
99+
for _, ag := range vm.Affinitygroup {
100+
if ag.Id == affinityGroupID {
101+
return vm.Zoneid, vm.Zonename, nil
102+
}
103+
}
104+
}
105+
106+
return "", "", errors.Errorf("zone id and name could not found for affinity group id %s", affinityGroupID)
107+
}

api/v1beta1/cloudstackmachine_types.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,8 +79,8 @@ type CloudStackMachineSpec struct {
7979
// +optional
8080
ProviderID *string `json:"providerID,omitempty"`
8181

82-
// +k8s:conversion-gen=false
8382
// Optionally settable Zone ID to land the machine in.
83+
// +k8s:conversion-gen=false
8484
ZoneID string `json:"zoneID,omitempty"`
8585

8686
// +k8s:conversion-gen=false
@@ -89,6 +89,7 @@ type CloudStackMachineSpec struct {
8989

9090
// IdentityRef is a reference to an identity to be used when reconciling this cluster
9191
// +optional
92+
// +k8s:conversion-gen=false
9293
IdentityRef *CloudStackIdentityReference `json:"identityRef,omitempty"`
9394
}
9495

@@ -124,6 +125,7 @@ type InstanceState string
124125
type CloudStackMachineStatus struct {
125126
// Zone ID is used so that the zone can be computed once per reconcile and then propagate.
126127
// +optional
128+
// +k8s:conversion-gen=false
127129
ZoneID string `json:"zoneID,omitempty"`
128130

129131
// Addresses contains a CloudStack VM instance's IP addresses.

api/v1beta1/cloudstackzone_conversion.go

Lines changed: 0 additions & 32 deletions
This file was deleted.

api/v1beta1/cloudstackzone_types.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ type CloudStackZoneStatus struct {
4646

4747
//+kubebuilder:object:root=true
4848
//+kubebuilder:subresource:status
49-
49+
//+k8s:conversion-gen=false
5050
// CloudStackZone is the Schema for the cloudstackzones API
5151
type CloudStackZone struct {
5252
metav1.TypeMeta `json:",inline"`

api/v1beta1/conversion.go

Lines changed: 31 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -50,67 +50,28 @@ func Convert_v1beta1_CloudStackCluster_To_v1beta2_CloudStackCluster(in *CloudSta
5050
FailureDomains: failureDomains,
5151
Account: in.Spec.Account,
5252
Domain: in.Spec.Domain,
53-
IdentityRef: identifyRef,
5453
}
5554

56-
zoneStatusMap := v1beta2.ZoneStatusMap{}
57-
for zoneKey, zone := range in.Status.Zones {
58-
zoneV1 := zone
59-
zoneV2 := &v1beta2.Zone{}
60-
err := Convert_v1beta1_Zone_To_v1beta2_Zone(&zoneV1, zoneV2, nil)
61-
if err != nil {
62-
return err
63-
}
64-
zoneStatusMap[zoneKey] = *zoneV2
65-
}
6655
out.Status = v1beta2.CloudStackClusterStatus{
67-
Zones: zoneStatusMap,
68-
FailureDomains: in.Status.FailureDomains,
69-
PublicIPID: in.Status.PublicIPID,
70-
PublicIPNetworkID: in.Status.PublicIPNetworkID,
71-
LBRuleID: in.Status.LBRuleID,
72-
Ready: in.Status.Ready,
56+
FailureDomains: in.Status.FailureDomains,
57+
Ready: in.Status.Ready,
7358
}
7459
return nil
7560
}
7661

7762
//nolint:golint,revive,stylecheck
7863
func Convert_v1beta2_CloudStackCluster_To_v1beta1_CloudStackCluster(in *v1beta2.CloudStackCluster, out *CloudStackCluster, scope conv.Scope) error {
7964
out.ObjectMeta = in.ObjectMeta
80-
var identifyRef *CloudStackIdentityReference
81-
if in.Spec.IdentityRef != nil {
82-
identifyRef = &CloudStackIdentityReference{}
83-
err := Convert_v1beta2_CloudStackIdentityReference_To_v1beta1_CloudStackIdentityReference(in.Spec.IdentityRef, identifyRef, nil)
84-
if err != nil {
85-
return err
86-
}
87-
}
8865
out.Spec = CloudStackClusterSpec{
8966
Zones: getZones(in),
9067
ControlPlaneEndpoint: in.Spec.ControlPlaneEndpoint,
9168
Account: in.Spec.Account,
9269
Domain: in.Spec.Domain,
93-
IdentityRef: identifyRef,
9470
}
9571

96-
zoneStatusMap := ZoneStatusMap{}
97-
for zoneKey, zone := range in.Status.Zones {
98-
zonev1 := &Zone{}
99-
zonev2 := zone
100-
err := Convert_v1beta2_Zone_To_v1beta1_Zone(&zonev2, zonev1, nil)
101-
if err != nil {
102-
return err
103-
}
104-
zoneStatusMap[zoneKey] = *zonev1
105-
}
10672
out.Status = CloudStackClusterStatus{
107-
Zones: zoneStatusMap,
108-
FailureDomains: in.Status.FailureDomains,
109-
Ready: in.Status.Ready,
110-
DomainID: in.Status.DomainID,
111-
PublicIPID: in.Status.PublicIPID,
112-
PublicIPNetworkID: in.Status.PublicIPNetworkID,
113-
LBRuleID: in.Status.LBRuleID,
73+
FailureDomains: in.Status.FailureDomains,
74+
Ready: in.Status.Ready,
11475
}
11576
return nil
11677
}
@@ -172,20 +133,24 @@ func getFailureDomains(csCluster *CloudStackCluster) ([]v1beta2.CloudStackFailur
172133
// When upgrading cluster using clusterctl directly, zoneID is fetched directly from kubernetes cluster in cloudstackzones.
173134
func GetDefaultFailureDomainName(namespace string, clusterName string, zoneID string, zoneName string) (string, error) {
174135
if len(zoneID) > 0 {
175-
return zoneID, nil
136+
return zoneID + "-" + clusterName, nil
176137
}
177138

178139
// try fetch zoneID using zoneName through cloudstack client
179140
zoneID, err := fetchZoneIDUsingCloudStack(namespace, zoneName)
180141
if err == nil {
181-
return zoneID, nil
142+
return zoneID + "-" + clusterName, nil
182143
}
183144

184-
return fetchZoneIDUsingK8s(namespace, clusterName, zoneName)
145+
zoneID, err = fetchZoneIDUsingK8s(namespace, clusterName, zoneName)
146+
if err != nil {
147+
return "", nil
148+
}
149+
return zoneID + "-" + clusterName, nil
185150
}
186151

187152
func fetchZoneIDUsingK8s(namespace string, clusterName string, zoneName string) (string, error) {
188-
zones := &v1beta2.CloudStackZoneList{}
153+
zones := &CloudStackZoneList{}
189154
capiClusterLabel := map[string]string{clusterv1.ClusterLabelName: clusterName}
190155
if err := v1beta2.K8sClient.List(
191156
context.TODO(),
@@ -206,10 +171,27 @@ func fetchZoneIDUsingK8s(namespace string, clusterName string, zoneName string)
206171
}
207172

208173
func fetchZoneIDUsingCloudStack(namespace string, zoneName string) (string, error) {
174+
config, err := GetCloudStackConfig(namespace)
175+
if err != nil {
176+
return "", err
177+
}
178+
179+
csClient := cloudstack.NewAsyncClient(fmt.Sprint(config["api-url"]), fmt.Sprint(config["api-key"]), fmt.Sprint(config["secret-key"]), fmt.Sprint(config["verify-ssl"]) == "true")
180+
181+
if zoneID, count, err := csClient.Zone.GetZoneID(zoneName); err != nil {
182+
return "", err
183+
} else if count != 1 {
184+
return "", errors.Errorf("%v zones found for zone name %s", count, zoneName)
185+
} else {
186+
return zoneID, nil
187+
}
188+
}
189+
190+
func GetCloudStackConfig(namespace string) (map[string]interface{}, error) {
209191
endpointCredentials := &corev1.Secret{}
210192
key := client.ObjectKey{Name: DefaultEndpointCredential, Namespace: namespace}
211193
if err := v1beta2.K8sClient.Get(context.TODO(), key, endpointCredentials); err != nil {
212-
return "", err
194+
return nil, err
213195
}
214196

215197
config := map[string]interface{}{}
@@ -224,14 +206,5 @@ func fetchZoneIDUsingCloudStack(namespace string, zoneName string) (string, erro
224206
config["verify-ssl"] = false
225207
}
226208
}
227-
228-
csClient := cloudstack.NewAsyncClient(fmt.Sprint(config["api-url"]), fmt.Sprint(config["api-key"]), fmt.Sprint(config["secret-key"]), fmt.Sprint(config["verify-ssl"]) == "true")
229-
230-
if zoneID, count, err := csClient.Zone.GetZoneID(zoneName); err != nil {
231-
return "", err
232-
} else if count != 1 {
233-
return "", errors.Errorf("%v zones found for zone name %s", count, zoneName)
234-
} else {
235-
return zoneID, nil
236-
}
209+
return config, nil
237210
}

0 commit comments

Comments
 (0)