Skip to content

Commit 0468705

Browse files
wanyufewongni
andauthored
add support for customized disk offering (#89)
* add support for customized disk offering * Add test cases for custom disk offering * Update baseLogger to logr.Discard - copy pattern used in eksa * Update baseLogger to logr.Discard - remove unused import * rename func name to better reflect its function * change size to customSize in disk offering * refactor code per PR comments Co-authored-by: Yufei Wang <[email protected]> Co-authored-by: Wonkun Kim <[email protected]>
1 parent 75b173d commit 0468705

File tree

24 files changed

+513
-31
lines changed

24 files changed

+513
-31
lines changed

api/v1beta1/cloudstackmachine_types.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,9 @@ type CloudStackResourceIdentifier struct {
101101

102102
type CloudStackResourceDiskOffering struct {
103103
CloudStackResourceIdentifier `json:",inline"`
104+
// Desired disk size. Used if disk offering is customizable as indicated by the ACS field 'Custom Disk Size'.
105+
// +optional
106+
CustomSize int64 `json:"customSizeInGB"`
104107
// mount point the data disk uses to mount. The actual partition, mkfs and mount are done by cloud-init generated by kubeadmConfig.
105108
MountPath string `json:"mountPath"`
106109
// device name of data disk, for example /dev/vdb

api/v1beta1/cloudstackmachine_webhook.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,9 @@ func (r *CloudStackMachine) ValidateCreate() error {
6565

6666
errorList = webhookutil.EnsureAtLeastOneFieldExists(r.Spec.Offering.ID, r.Spec.Offering.Name, "Offering", errorList)
6767
errorList = webhookutil.EnsureAtLeastOneFieldExists(r.Spec.Template.ID, r.Spec.Template.Name, "Template", errorList)
68+
if len(r.Spec.DiskOffering.ID) > 0 || len(r.Spec.DiskOffering.Name) > 0 {
69+
errorList = webhookutil.EnsureIntFieldsAreNotNegative(r.Spec.DiskOffering.CustomSize, "customSizeInGB", errorList)
70+
}
6871

6972
return webhookutil.AggregateObjErrors(r.GroupVersionKind().GroupKind(), r.Name, errorList)
7073
}
@@ -83,6 +86,7 @@ func (r *CloudStackMachine) ValidateUpdate(old runtime.Object) error {
8386

8487
errorList = webhookutil.EnsureBothFieldsAreEqual(r.Spec.Offering.ID, r.Spec.Offering.Name, oldSpec.Offering.ID, oldSpec.Offering.Name, "offering", errorList)
8588
errorList = webhookutil.EnsureBothFieldsAreEqual(r.Spec.DiskOffering.ID, r.Spec.DiskOffering.Name, oldSpec.DiskOffering.ID, oldSpec.DiskOffering.Name, "diskOffering", errorList)
89+
errorList = webhookutil.EnsureIntFieldsAreNotNegative(r.Spec.DiskOffering.CustomSize, "customSizeInGB", errorList)
8690
errorList = webhookutil.EnsureStringFieldsAreEqual(r.Spec.DiskOffering.MountPath, oldSpec.DiskOffering.MountPath, "mountPath", errorList)
8791
errorList = webhookutil.EnsureStringFieldsAreEqual(r.Spec.DiskOffering.Device, oldSpec.DiskOffering.Device, "device", errorList)
8892
errorList = webhookutil.EnsureStringFieldsAreEqual(r.Spec.DiskOffering.Filesystem, oldSpec.DiskOffering.Filesystem, "filesystem", errorList)

api/v1beta1/cloudstackmachine_webhook_test.go

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,10 +42,22 @@ var _ = Describe("CloudStackMachine webhook", func() {
4242
})
4343

4444
It("should accept a CloudStackMachine with disk Offering attribute", func() {
45-
dummies.CSMachine1.Spec.DiskOffering = dummies.DiskOffering2
45+
dummies.CSMachine1.Spec.DiskOffering = dummies.DiskOffering
4646
Expect(k8sClient.Create(ctx, dummies.CSMachine1)).Should(Succeed())
4747
})
4848

49+
It("should accept a CloudStackMachine with positive disk Offering size attribute", func() {
50+
dummies.CSMachine1.Spec.DiskOffering = dummies.DiskOffering
51+
dummies.CSMachine1.Spec.DiskOffering.CustomSize = 1
52+
Expect(k8sClient.Create(ctx, dummies.CSMachine1)).Should(Succeed())
53+
})
54+
55+
It("should not accept a CloudStackMachine with negative disk Offering size attribute", func() {
56+
dummies.CSMachine1.Spec.DiskOffering = dummies.DiskOffering
57+
dummies.CSMachine1.Spec.DiskOffering.CustomSize = -1
58+
Expect(k8sClient.Create(ctx, dummies.CSMachine1)).Should(MatchError(MatchRegexp(forbiddenRegex, "customSizeInGB")))
59+
})
60+
4961
It("should reject a CloudStackMachine with missing Offering attribute", func() {
5062
dummies.CSMachine1.Spec.Offering = v1beta1.CloudStackResourceIdentifier{ID: "", Name: ""}
5163
Expect(k8sClient.Create(ctx, dummies.CSMachine1)).
@@ -83,7 +95,7 @@ var _ = Describe("CloudStackMachine webhook", func() {
8395
})
8496

8597
It("should reject VM disk offering updates to the CloudStackMachine", func() {
86-
dummies.CSMachine1.Spec.DiskOffering = dummies.DiskOffering2
98+
dummies.CSMachine1.Spec.DiskOffering.Name = "medium"
8799
Ω(k8sClient.Update(ctx, dummies.CSMachine1)).
88100
Should(MatchError(MatchRegexp(forbiddenRegex, "diskOffering")))
89101
})

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,11 @@ spec:
116116
diskOffering:
117117
description: CloudStack disk offering to use.
118118
properties:
119+
customSizeInGB:
120+
description: disk size if disk offering is custom disk (need to
121+
specify disk size by users)
122+
format: int64
123+
type: integer
119124
device:
120125
description: device name of data disk, for example /dev/vdb
121126
type: string

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,11 @@ spec:
103103
diskOffering:
104104
description: CloudStack disk offering to use.
105105
properties:
106+
customSizeInGB:
107+
description: disk size if disk offering is custom disk
108+
(need to specify disk size by users)
109+
format: int64
110+
type: integer
106111
device:
107112
description: device name of data disk, for example /dev/vdb
108113
type: string

controllers/controllers_suite_test.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,6 @@ import (
4040
ctrl "sigs.k8s.io/controller-runtime"
4141
"sigs.k8s.io/controller-runtime/pkg/client"
4242
"sigs.k8s.io/controller-runtime/pkg/envtest"
43-
logf "sigs.k8s.io/controller-runtime/pkg/log"
4443

4544
infrav1 "github.com/aws/cluster-api-provider-cloudstack/api/v1beta1"
4645
csReconcilers "github.com/aws/cluster-api-provider-cloudstack/controllers"
@@ -172,7 +171,7 @@ var _ = BeforeSuite(func() {
172171
K8sClient: k8sManager.GetClient(),
173172
Scheme: k8sManager.GetScheme(),
174173
CSClient: CS,
175-
BaseLogger: logr.New(logf.NullLogSink{})}
174+
BaseLogger: logr.Discard()}
176175
ClusterReconciler = &csReconcilers.CloudStackClusterReconciler{ReconcilerBase: base}
177176
Ω(ClusterReconciler.SetupWithManager(k8sManager)).Should(Succeed())
178177

pkg/cloud/helpers.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import (
2424

2525
type set func(string)
2626
type setArray func([]string)
27+
type setInt func(int64)
2728

2829
func setIfNotEmpty(str string, setFn set) {
2930
if str != "" {
@@ -37,6 +38,12 @@ func setArrayIfNotEmpty(strArray []string, setFn setArray) {
3738
}
3839
}
3940

41+
func setIntIfPositive(num int64, setFn setInt) {
42+
if num > 0 {
43+
setFn(num)
44+
}
45+
}
46+
4047
func CompressAndEncodeString(str string) (string, error) {
4148
buf := &bytes.Buffer{}
4249
gzipWriter := gzip.NewWriter(buf)

pkg/cloud/instance.go

Lines changed: 36 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -139,35 +139,55 @@ func (c *client) ResolveTemplate(
139139
// disk offering name matches name provided in spec.
140140
// If disk offering ID is not provided, the disk offering name is used to retrieve disk offering ID.
141141
func (c *client) ResolveDiskOffering(csMachine *infrav1.CloudStackMachine) (diskOfferingID string, retErr error) {
142-
if len(csMachine.Spec.DiskOffering.ID) > 0 {
143-
csDiskOffering, count, err := c.cs.DiskOffering.GetDiskOfferingByID(csMachine.Spec.DiskOffering.ID)
142+
diskOfferingID = csMachine.Spec.DiskOffering.ID
143+
if len(csMachine.Spec.DiskOffering.Name) > 0 {
144+
diskID, count, err := c.cs.DiskOffering.GetDiskOfferingID(csMachine.Spec.DiskOffering.Name)
144145
if err != nil {
145146
return "", multierror.Append(retErr, errors.Wrapf(
146-
err, "could not get DiskOffering by ID %s", csMachine.Spec.DiskOffering.ID))
147+
err, "could not get DiskOffering ID from %s", csMachine.Spec.DiskOffering.Name))
147148
} else if count != 1 {
148149
return "", multierror.Append(retErr, errors.Errorf(
149-
"expected 1 DiskOffering with UUID %s, but got %d", csMachine.Spec.DiskOffering.ID, count))
150-
}
151-
152-
if len(csMachine.Spec.DiskOffering.Name) > 0 && csMachine.Spec.DiskOffering.Name != csDiskOffering.Name {
150+
"expected 1 DiskOffering with name %s, but got %d", csMachine.Spec.DiskOffering.Name, count))
151+
} else if len(csMachine.Spec.DiskOffering.ID) > 0 && diskID != csMachine.Spec.DiskOffering.ID {
152+
return "", multierror.Append(retErr, errors.Errorf(
153+
"diskOffering ID %s does not match ID %s returned using name %s",
154+
csMachine.Spec.DiskOffering.ID, diskID, csMachine.Spec.DiskOffering.Name))
155+
} else if len(diskID) == 0 {
153156
return "", multierror.Append(retErr, errors.Errorf(
154-
"diskOffering name %s does not match name %s returned using UUID %s",
155-
csMachine.Spec.DiskOffering.Name, csDiskOffering.Name, csMachine.Spec.DiskOffering.ID))
157+
"empty diskOffering ID %s returned using name %s",
158+
diskID, csMachine.Spec.DiskOffering.Name))
156159
}
157-
return csMachine.Spec.DiskOffering.ID, nil
160+
diskOfferingID = diskID
158161
}
159-
if len(csMachine.Spec.DiskOffering.Name) == 0 {
162+
if len(diskOfferingID) == 0 {
160163
return "", nil
161164
}
162-
diskID, count, err := c.cs.DiskOffering.GetDiskOfferingID(csMachine.Spec.DiskOffering.Name)
165+
166+
return verifyDiskoffering(csMachine, c, diskOfferingID, retErr)
167+
}
168+
169+
func verifyDiskoffering(csMachine *infrav1.CloudStackMachine, c *client, diskOfferingID string, retErr error) (string, error) {
170+
csDiskOffering, count, err := c.cs.DiskOffering.GetDiskOfferingByID(diskOfferingID)
163171
if err != nil {
164172
return "", multierror.Append(retErr, errors.Wrapf(
165-
err, "could not get DiskOffering ID from %s", csMachine.Spec.DiskOffering.Name))
173+
err, "could not get DiskOffering by ID %s", diskOfferingID))
166174
} else if count != 1 {
167175
return "", multierror.Append(retErr, errors.Errorf(
168-
"expected 1 DiskOffering with name %s, but got %d", csMachine.Spec.DiskOffering.Name, count))
176+
"expected 1 DiskOffering with UUID %s, but got %d", diskOfferingID, count))
177+
}
178+
179+
if csDiskOffering.Iscustomized && csMachine.Spec.DiskOffering.CustomSize == 0 {
180+
return "", multierror.Append(retErr, errors.Errorf(
181+
"diskOffering with UUID %s is customized, disk size can not be 0 GB",
182+
diskOfferingID))
183+
}
184+
185+
if !csDiskOffering.Iscustomized && csMachine.Spec.DiskOffering.CustomSize > 0 {
186+
return "", multierror.Append(retErr, errors.Errorf(
187+
"diskOffering with UUID %s is not customized, disk size can not be specified",
188+
diskOfferingID))
169189
}
170-
return diskID, nil
190+
return diskOfferingID, nil
171191
}
172192

173193
// GetOrCreateVMInstance CreateVMInstance will fetch or create a VM instance, and
@@ -205,6 +225,7 @@ func (c *client) GetOrCreateVMInstance(
205225
setIfNotEmpty(csMachine.Name, p.SetName)
206226
setIfNotEmpty(csMachine.Name, p.SetDisplayname)
207227
setIfNotEmpty(diskOfferingID, p.SetDiskofferingid)
228+
setIntIfPositive(csMachine.Spec.DiskOffering.CustomSize, p.SetSize)
208229

209230
setIfNotEmpty(csMachine.Spec.SSHKey, p.SetKeypair)
210231

pkg/cloud/instance_test.go

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,55 @@ var _ = Describe("Instance", func() {
179179
ShouldNot(Succeed())
180180
})
181181

182+
It("returns errors when more than one diskoffering found", func() {
183+
expectVMNotFound()
184+
sos.EXPECT().GetServiceOfferingID(dummies.CSMachine1.Spec.Offering.Name).
185+
Return(dummies.CSMachine1.Spec.Offering.ID, 1, nil)
186+
ts.EXPECT().GetTemplateID(dummies.CSMachine1.Spec.Template.Name, executableFilter, dummies.Zone1.ID).Return(dummies.CSMachine1.Spec.Template.ID, 1, nil)
187+
dos.EXPECT().GetDiskOfferingID(dummies.CSMachine1.Spec.DiskOffering.Name).Return(diskOfferingFakeID, 2, nil)
188+
Ω(client.GetOrCreateVMInstance(
189+
dummies.CSMachine1, dummies.CAPIMachine, dummies.CSCluster, dummies.CSZone1, dummies.CSAffinityGroup, "")).
190+
ShouldNot(Succeed())
191+
})
192+
193+
It("returns errors when fetching diskoffering", func() {
194+
expectVMNotFound()
195+
sos.EXPECT().GetServiceOfferingID(dummies.CSMachine1.Spec.Offering.Name).
196+
Return(dummies.CSMachine1.Spec.Offering.ID, 1, nil)
197+
ts.EXPECT().GetTemplateID(dummies.CSMachine1.Spec.Template.Name, executableFilter, dummies.Zone1.ID).Return(dummies.CSMachine1.Spec.Template.ID, 1, nil)
198+
dos.EXPECT().GetDiskOfferingID(dummies.CSMachine1.Spec.DiskOffering.Name).Return(diskOfferingFakeID, 1, nil)
199+
dos.EXPECT().GetDiskOfferingByID(diskOfferingFakeID).Return(&cloudstack.DiskOffering{Iscustomized: false}, 1, unknownError)
200+
Ω(client.GetOrCreateVMInstance(
201+
dummies.CSMachine1, dummies.CAPIMachine, dummies.CSCluster, dummies.CSZone1, dummies.CSAffinityGroup, "")).
202+
ShouldNot(Succeed())
203+
})
204+
205+
It("returns errors when disk size not zero for non-customized disk offering", func() {
206+
expectVMNotFound()
207+
dummies.CSMachine1.Spec.DiskOffering.CustomSize = 1
208+
sos.EXPECT().GetServiceOfferingID(dummies.CSMachine1.Spec.Offering.Name).
209+
Return(dummies.CSMachine1.Spec.Offering.ID, 1, nil)
210+
ts.EXPECT().GetTemplateID(dummies.CSMachine1.Spec.Template.Name, executableFilter, dummies.Zone1.ID).Return(dummies.CSMachine1.Spec.Template.ID, 1, nil)
211+
dos.EXPECT().GetDiskOfferingID(dummies.CSMachine1.Spec.DiskOffering.Name).Return(diskOfferingFakeID, 1, nil)
212+
dos.EXPECT().GetDiskOfferingByID(diskOfferingFakeID).Return(&cloudstack.DiskOffering{Iscustomized: false}, 1, nil)
213+
Ω(client.GetOrCreateVMInstance(
214+
dummies.CSMachine1, dummies.CAPIMachine, dummies.CSCluster, dummies.CSZone1, dummies.CSAffinityGroup, "")).
215+
ShouldNot(Succeed())
216+
})
217+
218+
It("returns errors when disk size zero for customized disk offering", func() {
219+
expectVMNotFound()
220+
dummies.CSMachine1.Spec.DiskOffering.CustomSize = 0
221+
sos.EXPECT().GetServiceOfferingID(dummies.CSMachine1.Spec.Offering.Name).
222+
Return(dummies.CSMachine1.Spec.Offering.ID, 1, nil)
223+
ts.EXPECT().GetTemplateID(dummies.CSMachine1.Spec.Template.Name, executableFilter, dummies.Zone1.ID).Return(dummies.CSMachine1.Spec.Template.ID, 1, nil)
224+
dos.EXPECT().GetDiskOfferingID(dummies.CSMachine1.Spec.DiskOffering.Name).Return(diskOfferingFakeID, 1, nil)
225+
dos.EXPECT().GetDiskOfferingByID(diskOfferingFakeID).Return(&cloudstack.DiskOffering{Iscustomized: true}, 1, nil)
226+
Ω(client.GetOrCreateVMInstance(
227+
dummies.CSMachine1, dummies.CAPIMachine, dummies.CSCluster, dummies.CSZone1, dummies.CSAffinityGroup, "")).
228+
ShouldNot(Succeed())
229+
})
230+
182231
It("handles deployment errors", func() {
183232
expectVMNotFound()
184233
sos.EXPECT().GetServiceOfferingID(dummies.CSMachine1.Spec.Offering.Name).
@@ -187,6 +236,8 @@ var _ = Describe("Instance", func() {
187236
Return(templateFakeID, 1, nil)
188237
dos.EXPECT().GetDiskOfferingID(dummies.CSMachine1.Spec.DiskOffering.Name).
189238
Return(diskOfferingFakeID, 1, nil)
239+
dos.EXPECT().GetDiskOfferingByID(diskOfferingFakeID).
240+
Return(&cloudstack.DiskOffering{Iscustomized: false}, 1, nil)
190241
vms.EXPECT().NewDeployVirtualMachineParams(offeringFakeID, templateFakeID, dummies.Zone1.ID).
191242
Return(&cloudstack.DeployVirtualMachineParams{})
192243
vms.EXPECT().DeployVirtualMachine(gomock.Any()).Return(nil, unknownError)
@@ -221,13 +272,15 @@ var _ = Describe("Instance", func() {
221272
}
222273

223274
It("works with service offering name and template name", func() {
275+
dummies.CSMachine1.Spec.DiskOffering.ID = diskOfferingFakeID
224276
dummies.CSMachine1.Spec.Offering.ID = ""
225277
dummies.CSMachine1.Spec.Template.ID = ""
226278
dummies.CSMachine1.Spec.Offering.Name = "offering"
227279
dummies.CSMachine1.Spec.Template.Name = "template"
228280

229281
sos.EXPECT().GetServiceOfferingID(dummies.CSMachine1.Spec.Offering.Name).Return(offeringFakeID, 1, nil)
230282
dos.EXPECT().GetDiskOfferingID(dummies.CSMachine1.Spec.DiskOffering.Name).Return(diskOfferingFakeID, 1, nil)
283+
dos.EXPECT().GetDiskOfferingByID(dummies.CSMachine1.Spec.DiskOffering.ID).Return(&cloudstack.DiskOffering{Iscustomized: false}, 1, nil)
231284
ts.EXPECT().GetTemplateID(dummies.CSMachine1.Spec.Template.Name, executableFilter, dummies.Zone1.ID).
232285
Return(templateFakeID, 1, nil)
233286

@@ -249,6 +302,7 @@ var _ = Describe("Instance", func() {
249302
})
250303

251304
It("works with service offering ID and template name", func() {
305+
dummies.CSMachine1.Spec.DiskOffering.ID = diskOfferingFakeID
252306
dummies.CSMachine1.Spec.Offering.ID = offeringFakeID
253307
dummies.CSMachine1.Spec.Template.ID = ""
254308
dummies.CSMachine1.Spec.Offering.Name = ""
@@ -258,11 +312,13 @@ var _ = Describe("Instance", func() {
258312
ts.EXPECT().GetTemplateID(dummies.CSMachine1.Spec.Template.Name, executableFilter, dummies.Zone1.ID).
259313
Return(templateFakeID, 1, nil)
260314
dos.EXPECT().GetDiskOfferingID(dummies.CSMachine1.Spec.DiskOffering.Name).Return(diskOfferingFakeID, 1, nil)
315+
dos.EXPECT().GetDiskOfferingByID(dummies.CSMachine1.Spec.DiskOffering.ID).Return(&cloudstack.DiskOffering{Iscustomized: false}, 1, nil)
261316

262317
ActionAndAssert()
263318
})
264319

265320
It("works with service offering name and template ID", func() {
321+
dummies.CSMachine1.Spec.DiskOffering.ID = diskOfferingFakeID
266322
dummies.CSMachine1.Spec.Offering.ID = ""
267323
dummies.CSMachine1.Spec.Template.ID = templateFakeID
268324
dummies.CSMachine1.Spec.Offering.Name = "offering"
@@ -271,11 +327,13 @@ var _ = Describe("Instance", func() {
271327
sos.EXPECT().GetServiceOfferingID(dummies.CSMachine1.Spec.Offering.Name).Return(offeringFakeID, 1, nil)
272328
ts.EXPECT().GetTemplateByID(dummies.CSMachine1.Spec.Template.ID, executableFilter).Return(&cloudstack.Template{Name: ""}, 1, nil)
273329
dos.EXPECT().GetDiskOfferingID(dummies.CSMachine1.Spec.DiskOffering.Name).Return(diskOfferingFakeID, 1, nil)
330+
dos.EXPECT().GetDiskOfferingByID(dummies.CSMachine1.Spec.DiskOffering.ID).Return(&cloudstack.DiskOffering{Iscustomized: false}, 1, nil)
274331

275332
ActionAndAssert()
276333
})
277334

278335
It("works with service offering ID and template ID", func() {
336+
dummies.CSMachine1.Spec.DiskOffering.ID = diskOfferingFakeID
279337
dummies.CSMachine1.Spec.Offering.ID = offeringFakeID
280338
dummies.CSMachine1.Spec.Template.ID = templateFakeID
281339
dummies.CSMachine1.Spec.Offering.Name = ""
@@ -285,13 +343,16 @@ var _ = Describe("Instance", func() {
285343
Return(&cloudstack.ServiceOffering{Name: "offering"}, 1, nil)
286344
dos.EXPECT().GetDiskOfferingID(dummies.CSMachine1.Spec.DiskOffering.Name).
287345
Return(diskOfferingFakeID, 1, nil)
346+
dos.EXPECT().GetDiskOfferingByID(dummies.CSMachine1.Spec.DiskOffering.ID).
347+
Return(&cloudstack.DiskOffering{Iscustomized: false}, 1, nil)
288348
ts.EXPECT().GetTemplateByID(dummies.CSMachine1.Spec.Template.ID, executableFilter).
289349
Return(&cloudstack.Template{Name: "template"}, 1, nil)
290350

291351
ActionAndAssert()
292352
})
293353

294354
It("works with Id and name both provided", func() {
355+
dummies.CSMachine1.Spec.DiskOffering.ID = diskOfferingFakeID
295356
dummies.CSMachine1.Spec.Offering.ID = offeringFakeID
296357
dummies.CSMachine1.Spec.Template.ID = templateFakeID
297358
dummies.CSMachine1.Spec.Offering.Name = "offering"
@@ -300,6 +361,7 @@ var _ = Describe("Instance", func() {
300361
sos.EXPECT().GetServiceOfferingByID(dummies.CSMachine1.Spec.Offering.ID).Return(&cloudstack.ServiceOffering{Name: "offering"}, 1, nil)
301362
ts.EXPECT().GetTemplateByID(dummies.CSMachine1.Spec.Template.ID, executableFilter).Return(&cloudstack.Template{Name: "template"}, 1, nil)
302363
dos.EXPECT().GetDiskOfferingID(dummies.CSMachine1.Spec.DiskOffering.Name).Return(diskOfferingFakeID, 1, nil)
364+
dos.EXPECT().GetDiskOfferingByID(dummies.CSMachine1.Spec.DiskOffering.ID).Return(&cloudstack.DiskOffering{Iscustomized: false}, 1, nil)
303365

304366
ActionAndAssert()
305367
})
@@ -339,6 +401,24 @@ var _ = Describe("Instance", func() {
339401
Should(MatchError(MatchRegexp(requiredRegexp, dummies.CSMachine1.Spec.Template.Name, "template-not-match", templateFakeID)))
340402

341403
})
404+
405+
It("works with Id and name both provided, disk offering id/name mismatch", func() {
406+
dummies.CSMachine1.Spec.Offering.ID = offeringFakeID
407+
dummies.CSMachine1.Spec.Template.ID = templateFakeID
408+
dummies.CSMachine1.Spec.DiskOffering.ID = diskOfferingFakeID
409+
dummies.CSMachine1.Spec.Offering.Name = "offering"
410+
dummies.CSMachine1.Spec.Template.Name = "template"
411+
dummies.CSMachine1.Spec.DiskOffering.Name = "diskoffering"
412+
413+
sos.EXPECT().GetServiceOfferingByID(dummies.CSMachine1.Spec.Offering.ID).Return(&cloudstack.ServiceOffering{Name: "offering"}, 1, nil)
414+
ts.EXPECT().GetTemplateByID(dummies.CSMachine1.Spec.Template.ID, executableFilter).Return(&cloudstack.Template{Name: "template"}, 1, nil)
415+
dos.EXPECT().GetDiskOfferingID(dummies.CSMachine1.Spec.DiskOffering.Name).Return(diskOfferingFakeID+"-not-match", 1, nil)
416+
requiredRegexp := "diskOffering ID %s does not match ID %s returned using name %s"
417+
Ω(client.GetOrCreateVMInstance(
418+
dummies.CSMachine1, dummies.CAPIMachine, dummies.CSCluster, dummies.CSZone1, dummies.CSAffinityGroup, "")).
419+
Should(MatchError(MatchRegexp(requiredRegexp, dummies.CSMachine1.Spec.DiskOffering.ID, diskOfferingFakeID+"-not-match", dummies.CSMachine1.Spec.DiskOffering.Name)))
420+
421+
})
342422
})
343423
})
344424

0 commit comments

Comments
 (0)