Skip to content

Commit 2e5afa9

Browse files
Fix service_offering lookup by filtering with zone parameter (#325)
* Fix service_offering lookup by filtering with zone parameter The cloudstack_instance resource was not filtering service_offering lookups by zone, which could cause failures when multiple service offerings share the same name but are restricted to specific zones. This change introduces a new retrieveServiceOfferingID function that filters service offerings by both name and zone ID, similar to how templates are looked up. Fixes: #260
1 parent b166fdf commit 2e5afa9

2 files changed

Lines changed: 37 additions & 6 deletions

File tree

‎cloudstack/resource_cloudstack_instance.go‎

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -264,14 +264,14 @@ func resourceCloudStackInstanceCreate(d *schema.ResourceData, meta interface{})
264264

265265
cs := meta.(*cloudstack.CloudStackClient)
266266

267-
// Retrieve the service_offering ID
268-
serviceofferingid, e := retrieveID(cs, "service_offering", d.Get("service_offering").(string))
267+
// Retrieve the zone ID first (needed for service_offering lookup)
268+
zoneid, e := retrieveID(cs, "zone", d.Get("zone").(string))
269269
if e != nil {
270270
return e.Error()
271271
}
272272

273-
// Retrieve the zone ID
274-
zoneid, e := retrieveID(cs, "zone", d.Get("zone").(string))
273+
// Retrieve the service_offering ID (filtered by zone)
274+
serviceofferingid, e := retrieveServiceOfferingID(cs, zoneid, d.Get("service_offering").(string))
275275
if e != nil {
276276
return e.Error()
277277
}
@@ -727,8 +727,14 @@ func resourceCloudStackInstanceUpdate(d *schema.ResourceData, meta interface{})
727727
if d.HasChange("service_offering") {
728728
log.Printf("[DEBUG] Service offering changed for %s, starting update", name)
729729

730-
// Retrieve the service_offering ID
731-
serviceofferingid, e := retrieveID(cs, "service_offering", d.Get("service_offering").(string))
730+
// Retrieve the zone ID first (needed for service_offering lookup)
731+
zoneid, e := retrieveID(cs, "zone", d.Get("zone").(string))
732+
if e != nil {
733+
return e.Error()
734+
}
735+
736+
// Retrieve the service_offering ID (filtered by zone)
737+
serviceofferingid, e := retrieveServiceOfferingID(cs, zoneid, d.Get("service_offering").(string))
732738
if e != nil {
733739
return e.Error()
734740
}

‎cloudstack/resources.go‎

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,31 @@ func retrieveTemplateID(cs *cloudstack.CloudStackClient, zoneid, value string) (
128128
return id, nil
129129
}
130130

131+
func retrieveServiceOfferingID(cs *cloudstack.CloudStackClient, zoneid, value string) (id string, e *retrieveError) {
132+
// If the supplied value isn't a ID, try to retrieve the ID ourselves
133+
if cloudstack.IsID(value) {
134+
return value, nil
135+
}
136+
137+
log.Printf("[DEBUG] Retrieving ID of service offering: %s in zone: %s", value, zoneid)
138+
139+
// List service offerings filtered by zone and name to handle zone-specific offerings
140+
p := cs.ServiceOffering.NewListServiceOfferingsParams()
141+
p.SetName(value)
142+
p.SetZoneid(zoneid)
143+
l, err := cs.ServiceOffering.ListServiceOfferings(p)
144+
if err != nil {
145+
return "", &retrieveError{name: "service_offering", value: value, err: err}
146+
}
147+
148+
if l.Count != 1 {
149+
err := fmt.Errorf("Found %d service offering(s) with name %s in zone %s", l.Count, value, zoneid)
150+
return "", &retrieveError{name: "service_offering", value: value, err: err}
151+
}
152+
153+
return l.ServiceOfferings[0].Id, nil
154+
}
155+
131156
// RetryFunc is the function retried n times
132157
type RetryFunc func() (interface{}, error)
133158

0 commit comments

Comments
 (0)