This is an automated email from the ASF dual-hosted git repository.

sureshanaparti pushed a commit to branch main
in repository 
https://gitbox.apache.org/repos/asf/cloudstack-terraform-provider.git


The following commit(s) were added to refs/heads/main by this push:
     new 2e5afa9  Fix service_offering lookup by filtering with zone parameter 
(#325)
2e5afa9 is described below

commit 2e5afa94de9fc8c740ec51f5346bdc23e5e7604f
Author: Suresh Kumar Anaparti <[email protected]>
AuthorDate: Mon Aug 17 22:16:24 2026 +0530

    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
---
 cloudstack/resource_cloudstack_instance.go | 18 ++++++++++++------
 cloudstack/resources.go                    | 25 +++++++++++++++++++++++++
 2 files changed, 37 insertions(+), 6 deletions(-)

diff --git a/cloudstack/resource_cloudstack_instance.go 
b/cloudstack/resource_cloudstack_instance.go
index 026ec4c..afa5093 100644
--- a/cloudstack/resource_cloudstack_instance.go
+++ b/cloudstack/resource_cloudstack_instance.go
@@ -264,14 +264,14 @@ func resourceCloudStackInstanceCreate(d 
*schema.ResourceData, meta interface{})
 
        cs := meta.(*cloudstack.CloudStackClient)
 
-       // Retrieve the service_offering ID
-       serviceofferingid, e := retrieveID(cs, "service_offering", 
d.Get("service_offering").(string))
+       // Retrieve the zone ID first (needed for service_offering lookup)
+       zoneid, e := retrieveID(cs, "zone", d.Get("zone").(string))
        if e != nil {
                return e.Error()
        }
 
-       // Retrieve the zone ID
-       zoneid, e := retrieveID(cs, "zone", d.Get("zone").(string))
+       // Retrieve the service_offering ID (filtered by zone)
+       serviceofferingid, e := retrieveServiceOfferingID(cs, zoneid, 
d.Get("service_offering").(string))
        if e != nil {
                return e.Error()
        }
@@ -727,8 +727,14 @@ func resourceCloudStackInstanceUpdate(d 
*schema.ResourceData, meta interface{})
                if d.HasChange("service_offering") {
                        log.Printf("[DEBUG] Service offering changed for %s, 
starting update", name)
 
-                       // Retrieve the service_offering ID
-                       serviceofferingid, e := retrieveID(cs, 
"service_offering", d.Get("service_offering").(string))
+                       // Retrieve the zone ID first (needed for 
service_offering lookup)
+                       zoneid, e := retrieveID(cs, "zone", 
d.Get("zone").(string))
+                       if e != nil {
+                               return e.Error()
+                       }
+
+                       // Retrieve the service_offering ID (filtered by zone)
+                       serviceofferingid, e := retrieveServiceOfferingID(cs, 
zoneid, d.Get("service_offering").(string))
                        if e != nil {
                                return e.Error()
                        }
diff --git a/cloudstack/resources.go b/cloudstack/resources.go
index 5a75b77..c08f202 100644
--- a/cloudstack/resources.go
+++ b/cloudstack/resources.go
@@ -128,6 +128,31 @@ func retrieveTemplateID(cs *cloudstack.CloudStackClient, 
zoneid, value string) (
        return id, nil
 }
 
+func retrieveServiceOfferingID(cs *cloudstack.CloudStackClient, zoneid, value 
string) (id string, e *retrieveError) {
+       // If the supplied value isn't a ID, try to retrieve the ID ourselves
+       if cloudstack.IsID(value) {
+               return value, nil
+       }
+
+       log.Printf("[DEBUG] Retrieving ID of service offering: %s in zone: %s", 
value, zoneid)
+
+       // List service offerings filtered by zone and name to handle 
zone-specific offerings
+       p := cs.ServiceOffering.NewListServiceOfferingsParams()
+       p.SetName(value)
+       p.SetZoneid(zoneid)
+       l, err := cs.ServiceOffering.ListServiceOfferings(p)
+       if err != nil {
+               return "", &retrieveError{name: "service_offering", value: 
value, err: err}
+       }
+
+       if l.Count != 1 {
+               err := fmt.Errorf("Found %d service offering(s) with name %s in 
zone %s", l.Count, value, zoneid)
+               return "", &retrieveError{name: "service_offering", value: 
value, err: err}
+       }
+
+       return l.ServiceOfferings[0].Id, nil
+}
+
 // RetryFunc is the function retried n times
 type RetryFunc func() (interface{}, error)
 

Reply via email to