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

Pearl1594 pushed a commit to branch fix-vpc-offering-service-capability-list
in repository https://gitbox.apache.org/repos/asf/cloudstack-go.git

commit 094a10e1d53fbdafd5ffaa9eb3300aa6b9ca5d67
Author: Pearl Dsilva <[email protected]>
AuthorDate: Thu Jul 23 14:52:53 2026 -0400

    Fix the servicecapabilitylist type for create VPC & Network Offerings
---
 cloudstack/NetworkOfferingService.go | 29 ++++++++++++++++++++++-------
 cloudstack/VPCService.go             | 29 ++++++++++++++++++++++-------
 generate/generate.go                 | 13 +++++++++++++
 3 files changed, 57 insertions(+), 14 deletions(-)

diff --git a/cloudstack/NetworkOfferingService.go 
b/cloudstack/NetworkOfferingService.go
index 2d670bd..80fef38 100644
--- a/cloudstack/NetworkOfferingService.go
+++ b/cloudstack/NetworkOfferingService.go
@@ -133,10 +133,11 @@ func (p *CreateNetworkOfferingParams) toURLValues() 
url.Values {
                u.Set("routingmode", v.(string))
        }
        if v, found := p.p["servicecapabilitylist"]; found {
-               m := v.(map[string]string)
-               for i, k := range getSortedKeysFromMap(m) {
-                       u.Set(fmt.Sprintf("servicecapabilitylist[%d].key", i), 
k)
-                       u.Set(fmt.Sprintf("servicecapabilitylist[%d].value", 
i), m[k])
+               l := v.([]map[string]string)
+               for i, m := range l {
+                       for key, val := range m {
+                               
u.Set(fmt.Sprintf("servicecapabilitylist[%d].%s", i, key), val)
+                       }
                }
        }
        if v, found := p.p["serviceofferingid"]; found {
@@ -640,7 +641,7 @@ func (p *CreateNetworkOfferingParams) GetRoutingmode() 
(string, bool) {
        return value, ok
 }
 
-func (p *CreateNetworkOfferingParams) SetServicecapabilitylist(v 
map[string]string) {
+func (p *CreateNetworkOfferingParams) SetServicecapabilitylist(v 
[]map[string]string) {
        if p.p == nil {
                p.p = make(map[string]interface{})
        }
@@ -653,14 +654,28 @@ func (p *CreateNetworkOfferingParams) 
ResetServicecapabilitylist() {
        }
 }
 
-func (p *CreateNetworkOfferingParams) GetServicecapabilitylist() 
(map[string]string, bool) {
+func (p *CreateNetworkOfferingParams) GetServicecapabilitylist() 
([]map[string]string, bool) {
        if p.p == nil {
                p.p = make(map[string]interface{})
        }
-       value, ok := p.p["servicecapabilitylist"].(map[string]string)
+       value, ok := p.p["servicecapabilitylist"].([]map[string]string)
        return value, ok
 }
 
+func (p *CreateNetworkOfferingParams) AddServicecapabilitylist(item 
map[string]string) {
+       if p.p == nil {
+               p.p = make(map[string]interface{})
+       }
+       val, found := p.p["servicecapabilitylist"]
+       if !found {
+               p.p["servicecapabilitylist"] = []map[string]string{}
+               val = p.p["servicecapabilitylist"]
+       }
+       l := val.([]map[string]string)
+       l = append(l, item)
+       p.p["servicecapabilitylist"] = l
+}
+
 func (p *CreateNetworkOfferingParams) SetServiceofferingid(v string) {
        if p.p == nil {
                p.p = make(map[string]interface{})
diff --git a/cloudstack/VPCService.go b/cloudstack/VPCService.go
index d5f67d0..0ca6700 100644
--- a/cloudstack/VPCService.go
+++ b/cloudstack/VPCService.go
@@ -1274,10 +1274,11 @@ func (p *CreateVPCOfferingParams) toURLValues() 
url.Values {
                u.Set("routingmode", v.(string))
        }
        if v, found := p.p["servicecapabilitylist"]; found {
-               m := v.(map[string]string)
-               for i, k := range getSortedKeysFromMap(m) {
-                       u.Set(fmt.Sprintf("servicecapabilitylist[%d].key", i), 
k)
-                       u.Set(fmt.Sprintf("servicecapabilitylist[%d].value", 
i), m[k])
+               l := v.([]map[string]string)
+               for i, m := range l {
+                       for key, val := range m {
+                               
u.Set(fmt.Sprintf("servicecapabilitylist[%d].%s", i, key), val)
+                       }
                }
        }
        if v, found := p.p["serviceofferingid"]; found {
@@ -1515,7 +1516,7 @@ func (p *CreateVPCOfferingParams) GetRoutingmode() 
(string, bool) {
        return value, ok
 }
 
-func (p *CreateVPCOfferingParams) SetServicecapabilitylist(v 
map[string]string) {
+func (p *CreateVPCOfferingParams) SetServicecapabilitylist(v 
[]map[string]string) {
        if p.p == nil {
                p.p = make(map[string]interface{})
        }
@@ -1528,14 +1529,28 @@ func (p *CreateVPCOfferingParams) 
ResetServicecapabilitylist() {
        }
 }
 
-func (p *CreateVPCOfferingParams) GetServicecapabilitylist() 
(map[string]string, bool) {
+func (p *CreateVPCOfferingParams) GetServicecapabilitylist() 
([]map[string]string, bool) {
        if p.p == nil {
                p.p = make(map[string]interface{})
        }
-       value, ok := p.p["servicecapabilitylist"].(map[string]string)
+       value, ok := p.p["servicecapabilitylist"].([]map[string]string)
        return value, ok
 }
 
+func (p *CreateVPCOfferingParams) AddServicecapabilitylist(item 
map[string]string) {
+       if p.p == nil {
+               p.p = make(map[string]interface{})
+       }
+       val, found := p.p["servicecapabilitylist"]
+       if !found {
+               p.p["servicecapabilitylist"] = []map[string]string{}
+               val = p.p["servicecapabilitylist"]
+       }
+       l := val.([]map[string]string)
+       l = append(l, item)
+       p.p["servicecapabilitylist"] = l
+}
+
 func (p *CreateVPCOfferingParams) SetServiceofferingid(v string) {
        if p.p == nil {
                p.p = make(map[string]interface{})
diff --git a/generate/generate.go b/generate/generate.go
index 448b614..c586817 100644
--- a/generate/generate.go
+++ b/generate/generate.go
@@ -94,6 +94,19 @@ var mapRequireList = map[string]map[string]bool{
                "iptonetworklist":        true,
                "nicnetworklist":         true,
        },
+       "createVPCOffering": map[string]bool{
+               // Each entry needs three columns (service, capabilitytype, 
capabilityvalue),
+               // which a flat map[string]string can't express - it collapses 
to generic
+               // "servicecapabilitylist[i].key"/"value" pairs that the API 
doesn't understand
+               // (it looks for "service"/"capabilitytype"/"capabilityvalue"), 
so every
+               // createVPCOffering call setting this field fails with
+               // "Invalid capability:null capability value:null".
+               "servicecapabilitylist": true,
+       },
+       "createNetworkOffering": map[string]bool{
+               // Same shape issue as createVPCOffering above.
+               "servicecapabilitylist": true,
+       },
        "updateVirtualMachine": map[string]bool{
                "dhcpoptionsnetworklist": true,
        },

Reply via email to