Skip to content

Commit 9a88f4c

Browse files
committed
Check name mismatch when ID and Name both provided for template and offering
1 parent 88dbd86 commit 9a88f4c

File tree

2 files changed

+50
-8
lines changed

2 files changed

+50
-8
lines changed

pkg/cloud/instance.go

+12-2
Original file line numberDiff line numberDiff line change
@@ -82,14 +82,19 @@ func (c *client) ResolveVMInstanceDetails(csMachine *infrav1.CloudStackMachine)
8282

8383
func (c *client) ResolveServiceOffering(csMachine *infrav1.CloudStackMachine) (offeringID string, retErr error) {
8484
if len(csMachine.Spec.Offering.ID) > 0 {
85-
_, count, err := c.cs.ServiceOffering.GetServiceOfferingByID(csMachine.Spec.Offering.ID)
85+
csOffering, count, err := c.cs.ServiceOffering.GetServiceOfferingByID(csMachine.Spec.Offering.ID)
8686
if err != nil {
8787
return "", multierror.Append(retErr, errors.Wrapf(
8888
err, "could not get Service Offering by ID %s", csMachine.Spec.Offering.ID))
8989
} else if count != 1 {
9090
return "", multierror.Append(retErr, errors.Errorf(
9191
"expected 1 Service Offering with UUID %s, but got %d", csMachine.Spec.Offering.ID, count))
9292
}
93+
94+
if len(csMachine.Spec.Offering.Name) > 0 && csMachine.Spec.Offering.Name != csOffering.Name {
95+
return "", multierror.Append(retErr, errors.Errorf(
96+
"offering name %s does not match name %s returned using UUID %s", csMachine.Spec.Offering.Name, csOffering.Name, csMachine.Spec.Offering.ID))
97+
}
9398
return csMachine.Spec.Offering.ID, nil
9499
}
95100
offeringID, count, err := c.cs.ServiceOffering.GetServiceOfferingID(csMachine.Spec.Offering.Name)
@@ -109,14 +114,19 @@ func (c *client) ResolveTemplate(
109114
zoneID string,
110115
) (templateID string, retErr error) {
111116
if len(csMachine.Spec.Template.ID) > 0 {
112-
_, count, err := c.cs.Template.GetTemplateByID(csMachine.Spec.Template.ID, "all")
117+
csTemplate, count, err := c.cs.Template.GetTemplateByID(csMachine.Spec.Template.ID, "all")
113118
if err != nil {
114119
return "", multierror.Append(retErr, errors.Wrapf(
115120
err, "could not get Template by ID %s", csMachine.Spec.Template.ID))
116121
} else if count != 1 {
117122
return "", multierror.Append(retErr, errors.Errorf(
118123
"expected 1 Template with UUID %s, but got %d", csMachine.Spec.Template.ID, count))
119124
}
125+
126+
if len(csMachine.Spec.Template.Name) > 0 && csMachine.Spec.Template.Name != csTemplate.Name {
127+
return "", multierror.Append(retErr, errors.Errorf(
128+
"template name %s does not match name %s returned using UUID %s", csMachine.Spec.Template.Name, csTemplate.Name, csMachine.Spec.Template.ID))
129+
}
120130
return csMachine.Spec.Template.ID, nil
121131
}
122132
templateID, count, err := c.cs.Template.GetTemplateID(csMachine.Spec.Template.Name, "all", zoneID)

pkg/cloud/instance_test.go

+38-6
Original file line numberDiff line numberDiff line change
@@ -248,7 +248,7 @@ var _ = Describe("Instance", func() {
248248
dummies.CSMachine1.Spec.Offering.Name = ""
249249
dummies.CSMachine1.Spec.Template.Name = "template"
250250

251-
sos.EXPECT().GetServiceOfferingByID(dummies.CSMachine1.Spec.Offering.ID).Return(&cloudstack.ServiceOffering{}, 1, nil)
251+
sos.EXPECT().GetServiceOfferingByID(dummies.CSMachine1.Spec.Offering.ID).Return(&cloudstack.ServiceOffering{Name: ""}, 1, nil)
252252
ts.EXPECT().GetTemplateID(dummies.CSMachine1.Spec.Template.Name, allFilter, dummies.Zone1.ID).
253253
Return(templateFakeID, 1, nil)
254254

@@ -262,7 +262,7 @@ var _ = Describe("Instance", func() {
262262
dummies.CSMachine1.Spec.Template.Name = ""
263263

264264
sos.EXPECT().GetServiceOfferingID(dummies.CSMachine1.Spec.Offering.Name).Return(offeringFakeID, 1, nil)
265-
ts.EXPECT().GetTemplateByID(dummies.CSMachine1.Spec.Template.ID, allFilter).Return(&cloudstack.Template{}, 1, nil)
265+
ts.EXPECT().GetTemplateByID(dummies.CSMachine1.Spec.Template.ID, allFilter).Return(&cloudstack.Template{Name: ""}, 1, nil)
266266

267267
ActionAndAssert()
268268
})
@@ -273,8 +273,8 @@ var _ = Describe("Instance", func() {
273273
dummies.CSMachine1.Spec.Offering.Name = ""
274274
dummies.CSMachine1.Spec.Template.Name = ""
275275

276-
sos.EXPECT().GetServiceOfferingByID(dummies.CSMachine1.Spec.Offering.ID).Return(&cloudstack.ServiceOffering{}, 1, nil)
277-
ts.EXPECT().GetTemplateByID(dummies.CSMachine1.Spec.Template.ID, allFilter).Return(&cloudstack.Template{}, 1, nil)
276+
sos.EXPECT().GetServiceOfferingByID(dummies.CSMachine1.Spec.Offering.ID).Return(&cloudstack.ServiceOffering{Name: "offering"}, 1, nil)
277+
ts.EXPECT().GetTemplateByID(dummies.CSMachine1.Spec.Template.ID, allFilter).Return(&cloudstack.Template{Name: "template"}, 1, nil)
278278

279279
ActionAndAssert()
280280
})
@@ -285,11 +285,43 @@ var _ = Describe("Instance", func() {
285285
dummies.CSMachine1.Spec.Offering.Name = "offering"
286286
dummies.CSMachine1.Spec.Template.Name = "template"
287287

288-
sos.EXPECT().GetServiceOfferingByID(dummies.CSMachine1.Spec.Offering.ID).Return(&cloudstack.ServiceOffering{}, 1, nil)
289-
ts.EXPECT().GetTemplateByID(dummies.CSMachine1.Spec.Template.ID, allFilter).Return(&cloudstack.Template{}, 1, nil)
288+
sos.EXPECT().GetServiceOfferingByID(dummies.CSMachine1.Spec.Offering.ID).Return(&cloudstack.ServiceOffering{Name: "offering"}, 1, nil)
289+
ts.EXPECT().GetTemplateByID(dummies.CSMachine1.Spec.Template.ID, allFilter).Return(&cloudstack.Template{Name: "template"}, 1, nil)
290290

291291
ActionAndAssert()
292292
})
293293
})
294+
295+
Context("when using both UUIDs and names to locate service offerings and templates", func() {
296+
BeforeEach(func() {
297+
vms.EXPECT().GetVirtualMachinesMetricByID(*dummies.CSMachine1.Spec.InstanceID).
298+
Return(nil, -1, notFoundError)
299+
vms.EXPECT().GetVirtualMachinesMetricByName(dummies.CSMachine1.Name).Return(nil, -1, notFoundError)
300+
})
301+
302+
It("works with Id and name both provided, offering name mismatch", func() {
303+
dummies.CSMachine1.Spec.Offering.ID = offeringFakeID
304+
dummies.CSMachine1.Spec.Template.ID = templateFakeID
305+
dummies.CSMachine1.Spec.Offering.Name = "offering"
306+
dummies.CSMachine1.Spec.Template.Name = "template"
307+
308+
sos.EXPECT().GetServiceOfferingByID(dummies.CSMachine1.Spec.Offering.ID).Return(&cloudstack.ServiceOffering{Name: "offering-not-match"}, 1, nil)
309+
requiredRegexp := "offering name %s does not match name %s returned using UUID %s"
310+
Ω(client.GetOrCreateVMInstance(dummies.CSMachine1, dummies.CAPIMachine, dummies.CSCluster, "")).Should(MatchError(MatchRegexp(requiredRegexp, dummies.CSMachine1.Spec.Offering.Name, "offering-not-match", offeringFakeID)))
311+
})
312+
313+
It("works with Id and name both provided, template name mismatch", func() {
314+
dummies.CSMachine1.Spec.Offering.ID = offeringFakeID
315+
dummies.CSMachine1.Spec.Template.ID = templateFakeID
316+
dummies.CSMachine1.Spec.Offering.Name = "offering"
317+
dummies.CSMachine1.Spec.Template.Name = "template"
318+
319+
sos.EXPECT().GetServiceOfferingByID(dummies.CSMachine1.Spec.Offering.ID).Return(&cloudstack.ServiceOffering{Name: "offering"}, 1, nil)
320+
ts.EXPECT().GetTemplateByID(dummies.CSMachine1.Spec.Template.ID, allFilter).Return(&cloudstack.Template{Name: "template-not-match"}, 1, nil)
321+
requiredRegexp := "template name %s does not match name %s returned using UUID %s"
322+
Ω(client.GetOrCreateVMInstance(dummies.CSMachine1, dummies.CAPIMachine, dummies.CSCluster, "")).Should(MatchError(MatchRegexp(requiredRegexp, dummies.CSMachine1.Spec.Template.Name, "template-not-match", templateFakeID)))
323+
324+
})
325+
})
294326
})
295327
})

0 commit comments

Comments
 (0)