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, },
