Skip to content

Commit 5fe47ec

Browse files
author
Joshua Reed
committed
Re-apply stashed with test fixups.
1 parent c1cabd2 commit 5fe47ec

File tree

10 files changed

+110
-263
lines changed

10 files changed

+110
-263
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ bin
88
testbin/*
99
api/*/zz*generated.deepcopy.go
1010

11+
nginx.conf
12+
1113
pkg/mocks/*
1214
!pkg/mocks/.keep
1315

api/v1beta1/cloudstackcluster_types.go

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,28 @@ type Network struct {
5353
Name string `json:"name"`
5454
}
5555

56+
type ZoneStatusMap map[string]Zone
57+
58+
// GetOne just returns a Zone from the map of zone statuses
59+
// Needed as there's no short way to do this.
60+
func (zones ZoneStatusMap) GetOne() *Zone {
61+
for _, zone := range zones {
62+
return &zone
63+
}
64+
return nil
65+
}
66+
67+
// GetByName fetches a zone by name if present in the map of zone statuses.
68+
// Needed as there's no short way to do this.
69+
func (zones ZoneStatusMap) GetByName(name string) *Zone {
70+
for zoneName, zone := range zones {
71+
if zoneName == name {
72+
return &zone
73+
}
74+
}
75+
return nil
76+
}
77+
5678
type Zone struct {
5779
// The Zone name.
5880
// + optional
@@ -91,7 +113,7 @@ type CloudStackClusterStatus struct {
91113

92114
// The status of the cluster's ACS Zones.
93115
// +optional
94-
Zones map[string]Zone `json:"zones,omitempty"`
116+
Zones ZoneStatusMap `json:"zones,omitempty"`
95117

96118
// CAPI recognizes failure domains as a method to spread machines.
97119
// CAPC sets failure domains per to indicate functionin Zones.

api/v1beta1/cloudstackmachinetemplate_webhook_test.go

Lines changed: 33 additions & 229 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,10 @@ package v1beta1_test
1919
import (
2020
"context"
2121

22+
infrav1 "github.com/aws/cluster-api-provider-cloudstack/api/v1beta1"
2223
"github.com/aws/cluster-api-provider-cloudstack/test/dummies"
2324
. "github.com/onsi/ginkgo"
2425
. "github.com/onsi/gomega"
25-
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2626
)
2727

2828
var _ = Describe("CloudStackMachineTemplate webhook", func() {
@@ -33,268 +33,72 @@ var _ = Describe("CloudStackMachineTemplate webhook", func() {
3333
ctx = context.Background()
3434
})
3535

36-
Context("When creating a CloudStackMachineTemplate with all validated attributes", func() {
37-
It("Should succeed", func() {
38-
cloudStackMachineTemplate := &CloudStackMachineTemplate{
39-
TypeMeta: metav1.TypeMeta{
40-
APIVersion: apiVersion,
41-
Kind: templateKind,
42-
},
43-
ObjectMeta: metav1.ObjectMeta{
44-
Name: templateName,
45-
Namespace: namespace,
46-
},
47-
Spec: CloudStackMachineTemplateSpec{
48-
Spec: CloudStackMachineTemplateResource{
49-
ObjectMeta: metav1.ObjectMeta{
50-
Name: templateResourceName,
51-
Namespace: namespace,
52-
},
53-
Spec: CloudStackMachineSpec{
54-
IdentityRef: &CloudStackIdentityReference{
55-
Kind: defaultIdentityRefKind,
56-
Name: identityReferenceName,
57-
},
58-
Template: template,
59-
Offering: offering,
60-
},
61-
},
62-
},
63-
}
64-
Expect(k8sClient.Create(ctx, cloudStackMachineTemplate)).Should(Succeed())
65-
})
66-
})
67-
68-
Context("When creating a CloudStackMachineTemplate with all attributes", func() {
69-
It("Should succeed", func() {
70-
ctx := context.Background()
71-
cloudStackMachineTemplate := &CloudStackMachineTemplate{
72-
TypeMeta: metav1.TypeMeta{
73-
APIVersion: apiVersion,
74-
Kind: templateKind,
75-
},
76-
ObjectMeta: metav1.ObjectMeta{
77-
Name: "test-machinetemplate-2",
78-
Namespace: namespace,
79-
},
80-
Spec: CloudStackMachineTemplateSpec{
81-
Spec: CloudStackMachineTemplateResource{
82-
ObjectMeta: metav1.ObjectMeta{
83-
Name: templateResourceName,
84-
Namespace: namespace,
85-
},
86-
Spec: CloudStackMachineSpec{
87-
IdentityRef: &CloudStackIdentityReference{
88-
Kind: defaultIdentityRefKind,
89-
Name: identityReferenceName,
90-
},
91-
Template: template,
92-
Offering: offering,
93-
Details: map[string]string{
94-
"memoryOvercommitRatio": "1.2",
95-
},
96-
},
97-
},
98-
},
99-
}
100-
Expect(k8sClient.Create(ctx, cloudStackMachineTemplate)).Should(Succeed())
101-
})
102-
})
103-
10436
Context("When creating a CloudStackMachineTemplate with all attributes", func() {
10537
It("Should succeed", func() {
106-
ctx := context.Background()
107-
cloudStackMachineTemplate := &CloudStackMachineTemplate{
108-
TypeMeta: metav1.TypeMeta{
109-
APIVersion: apiVersion,
110-
Kind: templateKind,
111-
},
112-
ObjectMeta: metav1.ObjectMeta{
113-
Name: "test-machinetemplate-3",
114-
Namespace: namespace,
115-
},
116-
Spec: CloudStackMachineTemplateSpec{
117-
Spec: CloudStackMachineTemplateResource{
118-
ObjectMeta: metav1.ObjectMeta{
119-
Name: templateResourceName,
120-
Namespace: namespace,
121-
},
122-
Spec: CloudStackMachineSpec{
123-
IdentityRef: &CloudStackIdentityReference{
124-
Kind: defaultIdentityRefKind,
125-
Name: identityReferenceName,
126-
},
127-
Template: template,
128-
Offering: offering,
129-
AffinityGroupIds: []string{"41eeb6e4-946f-4a18-b543-b2184815f1e4"},
130-
},
131-
},
132-
},
133-
}
134-
Expect(k8sClient.Create(ctx, cloudStackMachineTemplate)).Should(Succeed())
38+
Expect(k8sClient.Create(ctx, dummies.CSMachineTemplate1)).Should(Succeed())
13539
})
13640
})
13741

13842
Context("When creating a CloudStackMachineTemplate with missing Offering attribute", func() {
13943
It("Should be rejected by the validating webhooks", func() {
140-
ctx := context.Background()
141-
cloudStackMachineTemplate := &CloudStackMachineTemplate{
142-
TypeMeta: metav1.TypeMeta{
143-
APIVersion: apiVersion,
144-
Kind: templateKind,
145-
},
146-
ObjectMeta: metav1.ObjectMeta{
147-
Name: templateName,
148-
Namespace: namespace,
149-
},
150-
Spec: CloudStackMachineTemplateSpec{
151-
Spec: CloudStackMachineTemplateResource{
152-
ObjectMeta: metav1.ObjectMeta{
153-
Name: templateResourceName,
154-
Namespace: namespace,
155-
},
156-
Spec: CloudStackMachineSpec{
157-
IdentityRef: &CloudStackIdentityReference{
158-
Kind: defaultIdentityRefKind,
159-
Name: identityReferenceName,
160-
},
161-
Template: template,
162-
},
163-
},
164-
},
165-
}
166-
Expect(k8sClient.Create(ctx, cloudStackMachineTemplate).Error()).Should(MatchRegexp("admission webhook.*denied the request.*Required value\\: Offering"))
44+
dummies.CSMachine1.Spec.Offering = ""
45+
Expect(k8sClient.Create(ctx, dummies.CSMachineTemplate1).Error()).
46+
Should(MatchRegexp("admission webhook.*denied the request.*Required value\\: Offering"))
16747
})
16848
})
16949

17050
Context("When creating a CloudStackMachineTemplate with missing Template attribute", func() {
17151
It("Should be rejected by the validating webhooks", func() {
172-
ctx := context.Background()
173-
cloudStackMachineTemplate := &CloudStackMachineTemplate{
174-
TypeMeta: metav1.TypeMeta{
175-
APIVersion: apiVersion,
176-
Kind: templateKind,
177-
},
178-
ObjectMeta: metav1.ObjectMeta{
179-
Name: templateName,
180-
Namespace: namespace,
181-
},
182-
Spec: CloudStackMachineTemplateSpec{
183-
Spec: CloudStackMachineTemplateResource{
184-
ObjectMeta: metav1.ObjectMeta{
185-
Name: templateResourceName,
186-
Namespace: namespace,
187-
},
188-
Spec: CloudStackMachineSpec{
189-
IdentityRef: &CloudStackIdentityReference{
190-
Kind: defaultIdentityRefKind,
191-
Name: identityReferenceName,
192-
},
193-
Offering: offering,
194-
},
195-
},
196-
},
197-
}
198-
Expect(k8sClient.Create(ctx, cloudStackMachineTemplate).Error()).Should(MatchRegexp("admission webhook.*denied the request.*Required value\\: Template"))
52+
dummies.CSMachine1.Spec.Template = ""
53+
Expect(k8sClient.Create(ctx, dummies.CSMachineTemplate1).Error()).
54+
Should(MatchRegexp("admission webhook.*denied the request.*Required value\\: Template"))
19955
})
20056
})
20157

20258
Context("When creating a CloudStackMachineTemplate with the wrong kind of IdentityReference", func() {
20359
It("Should be rejected by the validating webhooks", func() {
204-
ctx := context.Background()
205-
cloudStackMachineTemplate := &CloudStackMachineTemplate{
206-
TypeMeta: metav1.TypeMeta{
207-
APIVersion: apiVersion,
208-
Kind: templateKind,
209-
},
210-
ObjectMeta: metav1.ObjectMeta{
211-
Name: templateName,
212-
Namespace: namespace,
213-
},
214-
Spec: CloudStackMachineTemplateSpec{
215-
Spec: CloudStackMachineTemplateResource{
216-
ObjectMeta: metav1.ObjectMeta{
217-
Name: templateResourceName,
218-
Namespace: namespace,
219-
},
220-
Spec: CloudStackMachineSpec{
221-
IdentityRef: &CloudStackIdentityReference{
222-
Kind: identityReferenceKind,
223-
Name: identityReferenceName,
224-
},
225-
Offering: offering,
226-
Template: template,
227-
},
228-
},
229-
},
230-
}
231-
Expect(k8sClient.Create(ctx, cloudStackMachineTemplate).Error()).Should(MatchRegexp("admission webhook.*denied the request.*Forbidden\\: must be a Secret"))
60+
dummies.CSMachine1.Spec.IdentityRef.Kind = "ConfigMap"
61+
Expect(k8sClient.Create(ctx, dummies.CSMachine1).Error()).
62+
Should(MatchRegexp("admission webhook.*denied the request.*Forbidden\\: must be a Secret"))
23263
})
23364
})
23465

23566
Context("When updating a CloudStackMachine", func() {
23667
It("Should be rejected by the validating webhooks", func() {
237-
ctx := context.Background()
238-
cloudStackMachineTemplate := &CloudStackMachineTemplate{
239-
TypeMeta: metav1.TypeMeta{
240-
APIVersion: apiVersion,
241-
Kind: templateKind,
242-
},
243-
ObjectMeta: metav1.ObjectMeta{
244-
Name: "test-machinetemplate-4",
245-
Namespace: namespace,
246-
},
247-
Spec: CloudStackMachineTemplateSpec{
248-
Spec: CloudStackMachineTemplateResource{
249-
ObjectMeta: metav1.ObjectMeta{
250-
Name: templateResourceName,
251-
Namespace: namespace,
252-
},
253-
Spec: CloudStackMachineSpec{
254-
IdentityRef: &CloudStackIdentityReference{
255-
Kind: defaultIdentityRefKind,
256-
Name: identityReferenceName,
257-
},
258-
Template: template,
259-
Offering: offering,
260-
Details: map[string]string{
261-
"memoryOvercommitRatio": "1.2",
262-
},
263-
AffinityGroupIds: []string{"41eeb6e4-946f-4a18-b543-b2184815f1e4"},
264-
},
265-
},
266-
},
267-
}
268-
Expect(k8sClient.Create(ctx, cloudStackMachineTemplate)).Should(Succeed())
68+
Expect(k8sClient.Create(ctx, dummies.CSMachineTemplate1)).Should(Succeed())
26969

27070
forbiddenRegex := "admission webhook.*denied the request.*Forbidden\\: %s"
271-
cloudStackMachineTemplateUpdate := &CloudStackMachineTemplate{}
71+
cloudStackMachineTemplateUpdate := &infrav1.CloudStackMachineTemplate{}
27272

273-
cloudStackMachineTemplate.DeepCopyInto(cloudStackMachineTemplateUpdate)
73+
dummies.CSMachineTemplate1.DeepCopyInto(cloudStackMachineTemplateUpdate)
27474
cloudStackMachineTemplateUpdate.Spec.Spec.Spec.Template = "Template2"
275-
Expect(k8sClient.Update(ctx, cloudStackMachineTemplateUpdate).Error()).Should(MatchRegexp(forbiddenRegex, "template"))
75+
Expect(k8sClient.Update(ctx, cloudStackMachineTemplateUpdate).Error()).
76+
Should(MatchRegexp(forbiddenRegex, "template"))
27677

277-
cloudStackMachineTemplate.DeepCopyInto(cloudStackMachineTemplateUpdate)
78+
dummies.CSMachineTemplate1.DeepCopyInto(cloudStackMachineTemplateUpdate)
27879
cloudStackMachineTemplateUpdate.Spec.Spec.Spec.Offering = "Offering2"
279-
Expect(k8sClient.Update(ctx, cloudStackMachineTemplateUpdate).Error()).Should(MatchRegexp(forbiddenRegex, "offering"))
80+
Expect(k8sClient.Update(ctx, cloudStackMachineTemplateUpdate).Error()).
81+
Should(MatchRegexp(forbiddenRegex, "offering"))
28082

281-
cloudStackMachineTemplate.DeepCopyInto(cloudStackMachineTemplateUpdate)
282-
cloudStackMachineTemplateUpdate.Spec.Spec.Spec.Details = map[string]string{
283-
"memoryOvercommitRatio": "1.5",
284-
}
285-
Expect(k8sClient.Update(ctx, cloudStackMachineTemplateUpdate).Error()).Should(MatchRegexp(forbiddenRegex, "details"))
83+
dummies.CSMachineTemplate1.DeepCopyInto(cloudStackMachineTemplateUpdate)
84+
cloudStackMachineTemplateUpdate.Spec.Spec.Spec.Details = map[string]string{"memoryOvercommitRatio": "1.5"}
85+
Expect(k8sClient.Update(ctx, cloudStackMachineTemplateUpdate).Error()).
86+
Should(MatchRegexp(forbiddenRegex, "details"))
28687

287-
cloudStackMachineTemplate.DeepCopyInto(cloudStackMachineTemplateUpdate)
288-
cloudStackMachineTemplateUpdate.Spec.Spec.Spec.IdentityRef.Kind = identityReferenceKind
289-
Expect(k8sClient.Update(ctx, cloudStackMachineTemplateUpdate).Error()).Should(MatchRegexp(forbiddenRegex, "identityRef\\.Kind"))
88+
dummies.CSMachineTemplate1.DeepCopyInto(cloudStackMachineTemplateUpdate)
89+
cloudStackMachineTemplateUpdate.Spec.Spec.Spec.IdentityRef.Kind = "configMap"
90+
Expect(k8sClient.Update(ctx, cloudStackMachineTemplateUpdate).Error()).
91+
Should(MatchRegexp(forbiddenRegex, "identityRef\\.Kind"))
29092

291-
cloudStackMachineTemplate.DeepCopyInto(cloudStackMachineTemplateUpdate)
93+
dummies.CSMachineTemplate1.DeepCopyInto(cloudStackMachineTemplateUpdate)
29294
cloudStackMachineTemplateUpdate.Spec.Spec.Spec.IdentityRef.Name = "IdentityConfigMap"
293-
Expect(k8sClient.Update(ctx, cloudStackMachineTemplateUpdate).Error()).Should(MatchRegexp(forbiddenRegex, "identityRef\\.Name"))
95+
Expect(k8sClient.Update(ctx, cloudStackMachineTemplateUpdate).Error()).
96+
Should(MatchRegexp(forbiddenRegex, "identityRef\\.Name"))
29497

295-
cloudStackMachineTemplate.DeepCopyInto(cloudStackMachineTemplateUpdate)
98+
dummies.CSMachineTemplate1.DeepCopyInto(cloudStackMachineTemplateUpdate)
29699
cloudStackMachineTemplateUpdate.Spec.Spec.Spec.AffinityGroupIds = []string{"28b907b8-75a7-4214-bd3d-6c61961fc2ag"}
297-
Expect(k8sClient.Update(ctx, cloudStackMachineTemplateUpdate)).ShouldNot(Succeed())
100+
Expect(k8sClient.Update(ctx, cloudStackMachineTemplateUpdate)).
101+
ShouldNot(Succeed())
298102
})
299103
})
300104
})

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

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,26 @@ spec:
110110
domainID:
111111
description: Cloudstack Domain ID the cluster is built in.
112112
type: string
113+
failureDomains:
114+
additionalProperties:
115+
description: FailureDomainSpec is the Schema for Cluster API failure
116+
domains. It allows controllers to understand how many failure
117+
domains a cluster can optionally span across.
118+
properties:
119+
attributes:
120+
additionalProperties:
121+
type: string
122+
description: Attributes is a free form map of attributes an
123+
infrastructure provider might use or require.
124+
type: object
125+
controlPlane:
126+
description: ControlPlane determines if this failure domain
127+
is suitable for use by control plane machines.
128+
type: boolean
129+
type: object
130+
description: CAPI recognizes failure domains as a method to spread
131+
machines. CAPC sets failure domains per to indicate functionin Zones.
132+
type: object
113133
loadBalancerRuleID:
114134
description: The ID of the lb rule used to assign VMs to the lb.
115135
type: string

config/manager/kustomization.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,5 +12,5 @@ apiVersion: kustomize.config.k8s.io/v1beta1
1212
kind: Kustomization
1313
images:
1414
- name: controller
15-
newName: public.ecr.aws/j9l9l0k3/ce-cluster-api-provider-cloudstack
16-
newTag: latest
15+
newName: localhost:5000/cluster-api-provider-cloudstack
16+
newTag: latest

0 commit comments

Comments
 (0)