From 5fe04df62a24c3f82fb7aa172179693ac1732800 Mon Sep 17 00:00:00 2001 From: Wei Zhou Date: Sat, 14 Mar 2026 21:28:25 +0100 Subject: [PATCH 1/2] Fix datadisksdetails --- cloudstack/BackupService.go | 3 +- cloudstack/VirtualMachineService.go | 29 +++++++++++++++----- cloudstack/VirtualNetworkFunctionsService.go | 3 +- generate/generate.go | 3 ++ 4 files changed, 27 insertions(+), 11 deletions(-) diff --git a/cloudstack/BackupService.go b/cloudstack/BackupService.go index 92033d8..f2c9266 100644 --- a/cloudstack/BackupService.go +++ b/cloudstack/BackupService.go @@ -749,8 +749,7 @@ func (p *CreateVMFromBackupParams) toURLValues() url.Values { if v, found := p.p["datadisksdetails"]; found { m := v.(map[string]string) for i, k := range getSortedKeysFromMap(m) { - u.Set(fmt.Sprintf("datadisksdetails[%d].key", i), k) - u.Set(fmt.Sprintf("datadisksdetails[%d].value", i), m[k]) + u.Set(fmt.Sprintf("datadisksdetails[%d].%s", i, k), m[k]) } } if v, found := p.p["deploymentplanner"]; found { diff --git a/cloudstack/VirtualMachineService.go b/cloudstack/VirtualMachineService.go index 675b5c8..55e647b 100644 --- a/cloudstack/VirtualMachineService.go +++ b/cloudstack/VirtualMachineService.go @@ -1335,10 +1335,11 @@ func (p *DeployVirtualMachineParams) toURLValues() url.Values { } } if v, found := p.p["datadisksdetails"]; found { - m := v.(map[string]string) - for i, k := range getSortedKeysFromMap(m) { - u.Set(fmt.Sprintf("datadisksdetails[%d].key", i), k) - u.Set(fmt.Sprintf("datadisksdetails[%d].value", i), m[k]) + l := v.([]map[string]string) + for i, m := range l { + for key, val := range m { + u.Set(fmt.Sprintf("datadisksdetails[%d].%s", i, key), val) + } } } if v, found := p.p["deploymentplanner"]; found { @@ -1737,7 +1738,7 @@ func (p *DeployVirtualMachineParams) GetDatadiskofferinglist() (map[string]strin return value, ok } -func (p *DeployVirtualMachineParams) SetDatadisksdetails(v map[string]string) { +func (p *DeployVirtualMachineParams) SetDatadisksdetails(v []map[string]string) { if p.p == nil { p.p = make(map[string]interface{}) } @@ -1750,14 +1751,28 @@ func (p *DeployVirtualMachineParams) ResetDatadisksdetails() { } } -func (p *DeployVirtualMachineParams) GetDatadisksdetails() (map[string]string, bool) { +func (p *DeployVirtualMachineParams) GetDatadisksdetails() ([]map[string]string, bool) { if p.p == nil { p.p = make(map[string]interface{}) } - value, ok := p.p["datadisksdetails"].(map[string]string) + value, ok := p.p["datadisksdetails"].([]map[string]string) return value, ok } +func (p *DeployVirtualMachineParams) AddDatadisksdetails(item map[string]string) { + if p.p == nil { + p.p = make(map[string]interface{}) + } + val, found := p.p["datadisksdetails"] + if !found { + p.p["datadisksdetails"] = []map[string]string{} + val = p.p["datadisksdetails"] + } + l := val.([]map[string]string) + l = append(l, item) + p.p["datadisksdetails"] = l +} + func (p *DeployVirtualMachineParams) SetDeploymentplanner(v string) { if p.p == nil { p.p = make(map[string]interface{}) diff --git a/cloudstack/VirtualNetworkFunctionsService.go b/cloudstack/VirtualNetworkFunctionsService.go index 90f7dee..f202cec 100644 --- a/cloudstack/VirtualNetworkFunctionsService.go +++ b/cloudstack/VirtualNetworkFunctionsService.go @@ -251,8 +251,7 @@ func (p *DeployVnfApplianceParams) toURLValues() url.Values { if v, found := p.p["datadisksdetails"]; found { m := v.(map[string]string) for i, k := range getSortedKeysFromMap(m) { - u.Set(fmt.Sprintf("datadisksdetails[%d].key", i), k) - u.Set(fmt.Sprintf("datadisksdetails[%d].value", i), m[k]) + u.Set(fmt.Sprintf("datadisksdetails[%d].%s", i, k), m[k]) } } if v, found := p.p["deploymentplanner"]; found { diff --git a/generate/generate.go b/generate/generate.go index 448b614..48ba0c6 100644 --- a/generate/generate.go +++ b/generate/generate.go @@ -93,6 +93,7 @@ var mapRequireList = map[string]map[string]bool{ "dhcpoptionsnetworklist": true, "iptonetworklist": true, "nicnetworklist": true, + "datadisksdetails": true, }, "updateVirtualMachine": map[string]bool{ "dhcpoptionsnetworklist": true, @@ -1440,6 +1441,8 @@ func (s *service) generateConvertCode(cmd, name, typ string) { pn(" u.Set(fmt.Sprintf(\"%s[%%d].template\", i), m[k])", name) case "cniconfigdetails": pn(" u.Set(fmt.Sprintf(\"%s[%%d].%%s\", i, k), m[k])", name) + case "datadisksdetails": + pn(" u.Set(fmt.Sprintf(\"%s[%%d].%%s\", i, k), m[k])", name) default: if shouldUseStaticZeroIndex && !detailsRequireKeyValue[cmd] { pn(" u.Set(fmt.Sprintf(\"%s[0].%%s\", k), m[k])", name) From 66bc95151dde595ade8b41e82b51e8ebdbeb0405 Mon Sep 17 00:00:00 2001 From: Wei Zhou Date: Sun, 15 Mar 2026 16:44:32 +0100 Subject: [PATCH 2/2] Fix deployVnfAppliance and createVMFromBackup --- cloudstack/BackupService.go | 115 ++++++++++++++----- cloudstack/VirtualNetworkFunctionsService.go | 115 ++++++++++++++----- generate/generate.go | 12 ++ 3 files changed, 188 insertions(+), 54 deletions(-) diff --git a/cloudstack/BackupService.go b/cloudstack/BackupService.go index f2c9266..882bbb0 100644 --- a/cloudstack/BackupService.go +++ b/cloudstack/BackupService.go @@ -747,9 +747,11 @@ func (p *CreateVMFromBackupParams) toURLValues() url.Values { } } if v, found := p.p["datadisksdetails"]; found { - m := v.(map[string]string) - for i, k := range getSortedKeysFromMap(m) { - u.Set(fmt.Sprintf("datadisksdetails[%d].%s", i, k), m[k]) + l := v.([]map[string]string) + for i, m := range l { + for key, val := range m { + u.Set(fmt.Sprintf("datadisksdetails[%d].%s", i, key), val) + } } } if v, found := p.p["deploymentplanner"]; found { @@ -762,10 +764,11 @@ func (p *CreateVMFromBackupParams) toURLValues() url.Values { } } if v, found := p.p["dhcpoptionsnetworklist"]; found { - m := v.(map[string]string) - for i, k := range getSortedKeysFromMap(m) { - u.Set(fmt.Sprintf("dhcpoptionsnetworklist[%d].key", i), k) - u.Set(fmt.Sprintf("dhcpoptionsnetworklist[%d].value", i), m[k]) + l := v.([]map[string]string) + for i, m := range l { + for key, val := range m { + u.Set(fmt.Sprintf("dhcpoptionsnetworklist[%d].%s", i, key), val) + } } } if v, found := p.p["diskofferingid"]; found { @@ -818,10 +821,11 @@ func (p *CreateVMFromBackupParams) toURLValues() url.Values { u.Set("ipaddress", v.(string)) } if v, found := p.p["iptonetworklist"]; found { - m := v.(map[string]string) - for i, k := range getSortedKeysFromMap(m) { - u.Set(fmt.Sprintf("iptonetworklist[%d].key", i), k) - u.Set(fmt.Sprintf("iptonetworklist[%d].value", i), m[k]) + l := v.([]map[string]string) + for i, m := range l { + for key, val := range m { + u.Set(fmt.Sprintf("iptonetworklist[%d].%s", i, key), val) + } } } if v, found := p.p["keyboard"]; found { @@ -856,10 +860,11 @@ func (p *CreateVMFromBackupParams) toURLValues() url.Values { u.Set("nicmultiqueuenumber", vv) } if v, found := p.p["nicnetworklist"]; found { - m := v.(map[string]string) - for i, k := range getSortedKeysFromMap(m) { - u.Set(fmt.Sprintf("nicnetworklist[%d].nic", i), k) - u.Set(fmt.Sprintf("nicnetworklist[%d].network", i), m[k]) + l := v.([]map[string]string) + for i, m := range l { + for key, val := range m { + u.Set(fmt.Sprintf("nicnetworklist[%d].%s", i, key), val) + } } } if v, found := p.p["nicpackedvirtqueuesenabled"]; found { @@ -1164,7 +1169,7 @@ func (p *CreateVMFromBackupParams) GetDatadiskofferinglist() (map[string]string, return value, ok } -func (p *CreateVMFromBackupParams) SetDatadisksdetails(v map[string]string) { +func (p *CreateVMFromBackupParams) SetDatadisksdetails(v []map[string]string) { if p.p == nil { p.p = make(map[string]interface{}) } @@ -1177,14 +1182,28 @@ func (p *CreateVMFromBackupParams) ResetDatadisksdetails() { } } -func (p *CreateVMFromBackupParams) GetDatadisksdetails() (map[string]string, bool) { +func (p *CreateVMFromBackupParams) GetDatadisksdetails() ([]map[string]string, bool) { if p.p == nil { p.p = make(map[string]interface{}) } - value, ok := p.p["datadisksdetails"].(map[string]string) + value, ok := p.p["datadisksdetails"].([]map[string]string) return value, ok } +func (p *CreateVMFromBackupParams) AddDatadisksdetails(item map[string]string) { + if p.p == nil { + p.p = make(map[string]interface{}) + } + val, found := p.p["datadisksdetails"] + if !found { + p.p["datadisksdetails"] = []map[string]string{} + val = p.p["datadisksdetails"] + } + l := val.([]map[string]string) + l = append(l, item) + p.p["datadisksdetails"] = l +} + func (p *CreateVMFromBackupParams) SetDeploymentplanner(v string) { if p.p == nil { p.p = make(map[string]interface{}) @@ -1227,7 +1246,7 @@ func (p *CreateVMFromBackupParams) GetDetails() (map[string]string, bool) { return value, ok } -func (p *CreateVMFromBackupParams) SetDhcpoptionsnetworklist(v map[string]string) { +func (p *CreateVMFromBackupParams) SetDhcpoptionsnetworklist(v []map[string]string) { if p.p == nil { p.p = make(map[string]interface{}) } @@ -1240,14 +1259,28 @@ func (p *CreateVMFromBackupParams) ResetDhcpoptionsnetworklist() { } } -func (p *CreateVMFromBackupParams) GetDhcpoptionsnetworklist() (map[string]string, bool) { +func (p *CreateVMFromBackupParams) GetDhcpoptionsnetworklist() ([]map[string]string, bool) { if p.p == nil { p.p = make(map[string]interface{}) } - value, ok := p.p["dhcpoptionsnetworklist"].(map[string]string) + value, ok := p.p["dhcpoptionsnetworklist"].([]map[string]string) return value, ok } +func (p *CreateVMFromBackupParams) AddDhcpoptionsnetworklist(item map[string]string) { + if p.p == nil { + p.p = make(map[string]interface{}) + } + val, found := p.p["dhcpoptionsnetworklist"] + if !found { + p.p["dhcpoptionsnetworklist"] = []map[string]string{} + val = p.p["dhcpoptionsnetworklist"] + } + l := val.([]map[string]string) + l = append(l, item) + p.p["dhcpoptionsnetworklist"] = l +} + func (p *CreateVMFromBackupParams) SetDiskofferingid(v string) { if p.p == nil { p.p = make(map[string]interface{}) @@ -1542,7 +1575,7 @@ func (p *CreateVMFromBackupParams) GetIpaddress() (string, bool) { return value, ok } -func (p *CreateVMFromBackupParams) SetIptonetworklist(v map[string]string) { +func (p *CreateVMFromBackupParams) SetIptonetworklist(v []map[string]string) { if p.p == nil { p.p = make(map[string]interface{}) } @@ -1555,14 +1588,28 @@ func (p *CreateVMFromBackupParams) ResetIptonetworklist() { } } -func (p *CreateVMFromBackupParams) GetIptonetworklist() (map[string]string, bool) { +func (p *CreateVMFromBackupParams) GetIptonetworklist() ([]map[string]string, bool) { if p.p == nil { p.p = make(map[string]interface{}) } - value, ok := p.p["iptonetworklist"].(map[string]string) + value, ok := p.p["iptonetworklist"].([]map[string]string) return value, ok } +func (p *CreateVMFromBackupParams) AddIptonetworklist(item map[string]string) { + if p.p == nil { + p.p = make(map[string]interface{}) + } + val, found := p.p["iptonetworklist"] + if !found { + p.p["iptonetworklist"] = []map[string]string{} + val = p.p["iptonetworklist"] + } + l := val.([]map[string]string) + l = append(l, item) + p.p["iptonetworklist"] = l +} + func (p *CreateVMFromBackupParams) SetKeyboard(v string) { if p.p == nil { p.p = make(map[string]interface{}) @@ -1752,7 +1799,7 @@ func (p *CreateVMFromBackupParams) GetNicmultiqueuenumber() (int, bool) { return value, ok } -func (p *CreateVMFromBackupParams) SetNicnetworklist(v map[string]string) { +func (p *CreateVMFromBackupParams) SetNicnetworklist(v []map[string]string) { if p.p == nil { p.p = make(map[string]interface{}) } @@ -1765,14 +1812,28 @@ func (p *CreateVMFromBackupParams) ResetNicnetworklist() { } } -func (p *CreateVMFromBackupParams) GetNicnetworklist() (map[string]string, bool) { +func (p *CreateVMFromBackupParams) GetNicnetworklist() ([]map[string]string, bool) { if p.p == nil { p.p = make(map[string]interface{}) } - value, ok := p.p["nicnetworklist"].(map[string]string) + value, ok := p.p["nicnetworklist"].([]map[string]string) return value, ok } +func (p *CreateVMFromBackupParams) AddNicnetworklist(item map[string]string) { + if p.p == nil { + p.p = make(map[string]interface{}) + } + val, found := p.p["nicnetworklist"] + if !found { + p.p["nicnetworklist"] = []map[string]string{} + val = p.p["nicnetworklist"] + } + l := val.([]map[string]string) + l = append(l, item) + p.p["nicnetworklist"] = l +} + func (p *CreateVMFromBackupParams) SetNicpackedvirtqueuesenabled(v bool) { if p.p == nil { p.p = make(map[string]interface{}) diff --git a/cloudstack/VirtualNetworkFunctionsService.go b/cloudstack/VirtualNetworkFunctionsService.go index f202cec..04dfa1d 100644 --- a/cloudstack/VirtualNetworkFunctionsService.go +++ b/cloudstack/VirtualNetworkFunctionsService.go @@ -249,9 +249,11 @@ func (p *DeployVnfApplianceParams) toURLValues() url.Values { } } if v, found := p.p["datadisksdetails"]; found { - m := v.(map[string]string) - for i, k := range getSortedKeysFromMap(m) { - u.Set(fmt.Sprintf("datadisksdetails[%d].%s", i, k), m[k]) + l := v.([]map[string]string) + for i, m := range l { + for key, val := range m { + u.Set(fmt.Sprintf("datadisksdetails[%d].%s", i, key), val) + } } } if v, found := p.p["deploymentplanner"]; found { @@ -264,10 +266,11 @@ func (p *DeployVnfApplianceParams) toURLValues() url.Values { } } if v, found := p.p["dhcpoptionsnetworklist"]; found { - m := v.(map[string]string) - for i, k := range getSortedKeysFromMap(m) { - u.Set(fmt.Sprintf("dhcpoptionsnetworklist[%d].key", i), k) - u.Set(fmt.Sprintf("dhcpoptionsnetworklist[%d].value", i), m[k]) + l := v.([]map[string]string) + for i, m := range l { + for key, val := range m { + u.Set(fmt.Sprintf("dhcpoptionsnetworklist[%d].%s", i, key), val) + } } } if v, found := p.p["diskofferingid"]; found { @@ -320,10 +323,11 @@ func (p *DeployVnfApplianceParams) toURLValues() url.Values { u.Set("ipaddress", v.(string)) } if v, found := p.p["iptonetworklist"]; found { - m := v.(map[string]string) - for i, k := range getSortedKeysFromMap(m) { - u.Set(fmt.Sprintf("iptonetworklist[%d].key", i), k) - u.Set(fmt.Sprintf("iptonetworklist[%d].value", i), m[k]) + l := v.([]map[string]string) + for i, m := range l { + for key, val := range m { + u.Set(fmt.Sprintf("iptonetworklist[%d].%s", i, key), val) + } } } if v, found := p.p["keyboard"]; found { @@ -358,10 +362,11 @@ func (p *DeployVnfApplianceParams) toURLValues() url.Values { u.Set("nicmultiqueuenumber", vv) } if v, found := p.p["nicnetworklist"]; found { - m := v.(map[string]string) - for i, k := range getSortedKeysFromMap(m) { - u.Set(fmt.Sprintf("nicnetworklist[%d].nic", i), k) - u.Set(fmt.Sprintf("nicnetworklist[%d].network", i), m[k]) + l := v.([]map[string]string) + for i, m := range l { + for key, val := range m { + u.Set(fmt.Sprintf("nicnetworklist[%d].%s", i, key), val) + } } } if v, found := p.p["nicpackedvirtqueuesenabled"]; found { @@ -631,7 +636,7 @@ func (p *DeployVnfApplianceParams) GetDatadiskofferinglist() (map[string]string, return value, ok } -func (p *DeployVnfApplianceParams) SetDatadisksdetails(v map[string]string) { +func (p *DeployVnfApplianceParams) SetDatadisksdetails(v []map[string]string) { if p.p == nil { p.p = make(map[string]interface{}) } @@ -644,14 +649,28 @@ func (p *DeployVnfApplianceParams) ResetDatadisksdetails() { } } -func (p *DeployVnfApplianceParams) GetDatadisksdetails() (map[string]string, bool) { +func (p *DeployVnfApplianceParams) GetDatadisksdetails() ([]map[string]string, bool) { if p.p == nil { p.p = make(map[string]interface{}) } - value, ok := p.p["datadisksdetails"].(map[string]string) + value, ok := p.p["datadisksdetails"].([]map[string]string) return value, ok } +func (p *DeployVnfApplianceParams) AddDatadisksdetails(item map[string]string) { + if p.p == nil { + p.p = make(map[string]interface{}) + } + val, found := p.p["datadisksdetails"] + if !found { + p.p["datadisksdetails"] = []map[string]string{} + val = p.p["datadisksdetails"] + } + l := val.([]map[string]string) + l = append(l, item) + p.p["datadisksdetails"] = l +} + func (p *DeployVnfApplianceParams) SetDeploymentplanner(v string) { if p.p == nil { p.p = make(map[string]interface{}) @@ -694,7 +713,7 @@ func (p *DeployVnfApplianceParams) GetDetails() (map[string]string, bool) { return value, ok } -func (p *DeployVnfApplianceParams) SetDhcpoptionsnetworklist(v map[string]string) { +func (p *DeployVnfApplianceParams) SetDhcpoptionsnetworklist(v []map[string]string) { if p.p == nil { p.p = make(map[string]interface{}) } @@ -707,14 +726,28 @@ func (p *DeployVnfApplianceParams) ResetDhcpoptionsnetworklist() { } } -func (p *DeployVnfApplianceParams) GetDhcpoptionsnetworklist() (map[string]string, bool) { +func (p *DeployVnfApplianceParams) GetDhcpoptionsnetworklist() ([]map[string]string, bool) { if p.p == nil { p.p = make(map[string]interface{}) } - value, ok := p.p["dhcpoptionsnetworklist"].(map[string]string) + value, ok := p.p["dhcpoptionsnetworklist"].([]map[string]string) return value, ok } +func (p *DeployVnfApplianceParams) AddDhcpoptionsnetworklist(item map[string]string) { + if p.p == nil { + p.p = make(map[string]interface{}) + } + val, found := p.p["dhcpoptionsnetworklist"] + if !found { + p.p["dhcpoptionsnetworklist"] = []map[string]string{} + val = p.p["dhcpoptionsnetworklist"] + } + l := val.([]map[string]string) + l = append(l, item) + p.p["dhcpoptionsnetworklist"] = l +} + func (p *DeployVnfApplianceParams) SetDiskofferingid(v string) { if p.p == nil { p.p = make(map[string]interface{}) @@ -1009,7 +1042,7 @@ func (p *DeployVnfApplianceParams) GetIpaddress() (string, bool) { return value, ok } -func (p *DeployVnfApplianceParams) SetIptonetworklist(v map[string]string) { +func (p *DeployVnfApplianceParams) SetIptonetworklist(v []map[string]string) { if p.p == nil { p.p = make(map[string]interface{}) } @@ -1022,14 +1055,28 @@ func (p *DeployVnfApplianceParams) ResetIptonetworklist() { } } -func (p *DeployVnfApplianceParams) GetIptonetworklist() (map[string]string, bool) { +func (p *DeployVnfApplianceParams) GetIptonetworklist() ([]map[string]string, bool) { if p.p == nil { p.p = make(map[string]interface{}) } - value, ok := p.p["iptonetworklist"].(map[string]string) + value, ok := p.p["iptonetworklist"].([]map[string]string) return value, ok } +func (p *DeployVnfApplianceParams) AddIptonetworklist(item map[string]string) { + if p.p == nil { + p.p = make(map[string]interface{}) + } + val, found := p.p["iptonetworklist"] + if !found { + p.p["iptonetworklist"] = []map[string]string{} + val = p.p["iptonetworklist"] + } + l := val.([]map[string]string) + l = append(l, item) + p.p["iptonetworklist"] = l +} + func (p *DeployVnfApplianceParams) SetKeyboard(v string) { if p.p == nil { p.p = make(map[string]interface{}) @@ -1219,7 +1266,7 @@ func (p *DeployVnfApplianceParams) GetNicmultiqueuenumber() (int, bool) { return value, ok } -func (p *DeployVnfApplianceParams) SetNicnetworklist(v map[string]string) { +func (p *DeployVnfApplianceParams) SetNicnetworklist(v []map[string]string) { if p.p == nil { p.p = make(map[string]interface{}) } @@ -1232,14 +1279,28 @@ func (p *DeployVnfApplianceParams) ResetNicnetworklist() { } } -func (p *DeployVnfApplianceParams) GetNicnetworklist() (map[string]string, bool) { +func (p *DeployVnfApplianceParams) GetNicnetworklist() ([]map[string]string, bool) { if p.p == nil { p.p = make(map[string]interface{}) } - value, ok := p.p["nicnetworklist"].(map[string]string) + value, ok := p.p["nicnetworklist"].([]map[string]string) return value, ok } +func (p *DeployVnfApplianceParams) AddNicnetworklist(item map[string]string) { + if p.p == nil { + p.p = make(map[string]interface{}) + } + val, found := p.p["nicnetworklist"] + if !found { + p.p["nicnetworklist"] = []map[string]string{} + val = p.p["nicnetworklist"] + } + l := val.([]map[string]string) + l = append(l, item) + p.p["nicnetworklist"] = l +} + func (p *DeployVnfApplianceParams) SetNicpackedvirtqueuesenabled(v bool) { if p.p == nil { p.p = make(map[string]interface{}) diff --git a/generate/generate.go b/generate/generate.go index 48ba0c6..5c315d5 100644 --- a/generate/generate.go +++ b/generate/generate.go @@ -95,6 +95,18 @@ var mapRequireList = map[string]map[string]bool{ "nicnetworklist": true, "datadisksdetails": true, }, + "deployVnfAppliance": map[string]bool{ + "dhcpoptionsnetworklist": true, + "iptonetworklist": true, + "nicnetworklist": true, + "datadisksdetails": true, + }, + "createVMFromBackup": map[string]bool{ + "dhcpoptionsnetworklist": true, + "iptonetworklist": true, + "nicnetworklist": true, + "datadisksdetails": true, + }, "updateVirtualMachine": map[string]bool{ "dhcpoptionsnetworklist": true, },