From abdf1f5165af613dd7d6ecbbf367765afeae97f5 Mon Sep 17 00:00:00 2001 From: Pearl Dsilva Date: Tue, 19 May 2026 11:31:14 -0400 Subject: [PATCH 1/2] Adds support to upload k8s ISO from local --- cloudstack/KubernetesService.go | 310 +++++++++++++++++++++++++++ cloudstack/KubernetesService_mock.go | 29 +++ generate/layout.go | 1 + test/KubernetesService_test.go | 15 ++ 4 files changed, 355 insertions(+) diff --git a/cloudstack/KubernetesService.go b/cloudstack/KubernetesService.go index 040e6ae..9d0a292 100644 --- a/cloudstack/KubernetesService.go +++ b/cloudstack/KubernetesService.go @@ -66,6 +66,8 @@ type KubernetesServiceIface interface { NewAddNodesToKubernetesClusterParams(id string, nodeids []string) *AddNodesToKubernetesClusterParams RemoveNodesFromKubernetesCluster(p *RemoveNodesFromKubernetesClusterParams) (*RemoveNodesFromKubernetesClusterResponse, error) NewRemoveNodesFromKubernetesClusterParams(id string, nodeids []string) *RemoveNodesFromKubernetesClusterParams + GetUploadParamsForKubernetesSupportedVersion(p *GetUploadParamsForKubernetesSupportedVersionParams) (*GetUploadParamsForKubernetesSupportedVersionResponse, error) + NewGetUploadParamsForKubernetesSupportedVersionParams(format string, mincpunumber int, minmemory int, name string, semanticversion string, zoneid string) *GetUploadParamsForKubernetesSupportedVersionParams } type AddKubernetesSupportedVersionParams struct { @@ -3719,3 +3721,311 @@ type RemoveNodesFromKubernetesClusterResponse struct { Zoneid string `json:"zoneid"` Zonename string `json:"zonename"` } + +type GetUploadParamsForKubernetesSupportedVersionParams struct { + p map[string]interface{} +} + +func (p *GetUploadParamsForKubernetesSupportedVersionParams) toURLValues() url.Values { + u := url.Values{} + if p.p == nil { + return u + } + if v, found := p.p["account"]; found { + u.Set("account", v.(string)) + } + if v, found := p.p["checksum"]; found { + u.Set("checksum", v.(string)) + } + if v, found := p.p["checksum"]; found { + u.Set("checksum", v.(string)) + } + if v, found := p.p["domainid"]; found { + u.Set("domainid", v.(string)) + } + if v, found := p.p["format"]; found { + u.Set("format", v.(string)) + } + if v, found := p.p["mincpunumber"]; found { + vv := strconv.Itoa(v.(int)) + u.Set("mincpunumber", vv) + } + if v, found := p.p["minmemory"]; found { + vv := strconv.Itoa(v.(int)) + u.Set("minmemory", vv) + } + if v, found := p.p["name"]; found { + u.Set("name", v.(string)) + } + if v, found := p.p["projectid"]; found { + u.Set("projectid", v.(string)) + } + if v, found := p.p["semanticversion"]; found { + u.Set("semanticversion", v.(string)) + } + if v, found := p.p["zoneid"]; found { + u.Set("zoneid", v.(string)) + } + return u +} + +func (p *GetUploadParamsForKubernetesSupportedVersionParams) SetAccount(v string) { + if p.p == nil { + p.p = make(map[string]interface{}) + } + p.p["account"] = v +} + +func (p *GetUploadParamsForKubernetesSupportedVersionParams) ResetAccount() { + if p.p != nil && p.p["account"] != nil { + delete(p.p, "account") + } +} + +func (p *GetUploadParamsForKubernetesSupportedVersionParams) GetAccount() (string, bool) { + if p.p == nil { + p.p = make(map[string]interface{}) + } + value, ok := p.p["account"].(string) + return value, ok +} + +func (p *GetUploadParamsForKubernetesSupportedVersionParams) SetChecksum(v string) { + if p.p == nil { + p.p = make(map[string]interface{}) + } + p.p["checksum"] = v +} + +func (p *GetUploadParamsForKubernetesSupportedVersionParams) ResetChecksum() { + if p.p != nil && p.p["checksum"] != nil { + delete(p.p, "checksum") + } +} + +func (p *GetUploadParamsForKubernetesSupportedVersionParams) GetChecksum() (string, bool) { + if p.p == nil { + p.p = make(map[string]interface{}) + } + value, ok := p.p["checksum"].(string) + return value, ok +} + +func (p *GetUploadParamsForKubernetesSupportedVersionParams) SetDomainid(v string) { + if p.p == nil { + p.p = make(map[string]interface{}) + } + p.p["domainid"] = v +} + +func (p *GetUploadParamsForKubernetesSupportedVersionParams) ResetDomainid() { + if p.p != nil && p.p["domainid"] != nil { + delete(p.p, "domainid") + } +} + +func (p *GetUploadParamsForKubernetesSupportedVersionParams) GetDomainid() (string, bool) { + if p.p == nil { + p.p = make(map[string]interface{}) + } + value, ok := p.p["domainid"].(string) + return value, ok +} + +func (p *GetUploadParamsForKubernetesSupportedVersionParams) SetFormat(v string) { + if p.p == nil { + p.p = make(map[string]interface{}) + } + p.p["format"] = v +} + +func (p *GetUploadParamsForKubernetesSupportedVersionParams) ResetFormat() { + if p.p != nil && p.p["format"] != nil { + delete(p.p, "format") + } +} + +func (p *GetUploadParamsForKubernetesSupportedVersionParams) GetFormat() (string, bool) { + if p.p == nil { + p.p = make(map[string]interface{}) + } + value, ok := p.p["format"].(string) + return value, ok +} + +func (p *GetUploadParamsForKubernetesSupportedVersionParams) SetMincpunumber(v int) { + if p.p == nil { + p.p = make(map[string]interface{}) + } + p.p["mincpunumber"] = v +} + +func (p *GetUploadParamsForKubernetesSupportedVersionParams) ResetMincpunumber() { + if p.p != nil && p.p["mincpunumber"] != nil { + delete(p.p, "mincpunumber") + } +} + +func (p *GetUploadParamsForKubernetesSupportedVersionParams) GetMincpunumber() (int, bool) { + if p.p == nil { + p.p = make(map[string]interface{}) + } + value, ok := p.p["mincpunumber"].(int) + return value, ok +} + +func (p *GetUploadParamsForKubernetesSupportedVersionParams) SetMinmemory(v int) { + if p.p == nil { + p.p = make(map[string]interface{}) + } + p.p["minmemory"] = v +} + +func (p *GetUploadParamsForKubernetesSupportedVersionParams) ResetMinmemory() { + if p.p != nil && p.p["minmemory"] != nil { + delete(p.p, "minmemory") + } +} + +func (p *GetUploadParamsForKubernetesSupportedVersionParams) GetMinmemory() (int, bool) { + if p.p == nil { + p.p = make(map[string]interface{}) + } + value, ok := p.p["minmemory"].(int) + return value, ok +} + +func (p *GetUploadParamsForKubernetesSupportedVersionParams) SetName(v string) { + if p.p == nil { + p.p = make(map[string]interface{}) + } + p.p["name"] = v +} + +func (p *GetUploadParamsForKubernetesSupportedVersionParams) ResetName() { + if p.p != nil && p.p["name"] != nil { + delete(p.p, "name") + } +} + +func (p *GetUploadParamsForKubernetesSupportedVersionParams) GetName() (string, bool) { + if p.p == nil { + p.p = make(map[string]interface{}) + } + value, ok := p.p["name"].(string) + return value, ok +} + +func (p *GetUploadParamsForKubernetesSupportedVersionParams) SetProjectid(v string) { + if p.p == nil { + p.p = make(map[string]interface{}) + } + p.p["projectid"] = v +} + +func (p *GetUploadParamsForKubernetesSupportedVersionParams) ResetProjectid() { + if p.p != nil && p.p["projectid"] != nil { + delete(p.p, "projectid") + } +} + +func (p *GetUploadParamsForKubernetesSupportedVersionParams) GetProjectid() (string, bool) { + if p.p == nil { + p.p = make(map[string]interface{}) + } + value, ok := p.p["projectid"].(string) + return value, ok +} + +func (p *GetUploadParamsForKubernetesSupportedVersionParams) SetSemanticversion(v string) { + if p.p == nil { + p.p = make(map[string]interface{}) + } + p.p["semanticversion"] = v +} + +func (p *GetUploadParamsForKubernetesSupportedVersionParams) ResetSemanticversion() { + if p.p != nil && p.p["semanticversion"] != nil { + delete(p.p, "semanticversion") + } +} + +func (p *GetUploadParamsForKubernetesSupportedVersionParams) GetSemanticversion() (string, bool) { + if p.p == nil { + p.p = make(map[string]interface{}) + } + value, ok := p.p["semanticversion"].(string) + return value, ok +} + +func (p *GetUploadParamsForKubernetesSupportedVersionParams) SetZoneid(v string) { + if p.p == nil { + p.p = make(map[string]interface{}) + } + p.p["zoneid"] = v +} + +func (p *GetUploadParamsForKubernetesSupportedVersionParams) ResetZoneid() { + if p.p != nil && p.p["zoneid"] != nil { + delete(p.p, "zoneid") + } +} + +func (p *GetUploadParamsForKubernetesSupportedVersionParams) GetZoneid() (string, bool) { + if p.p == nil { + p.p = make(map[string]interface{}) + } + value, ok := p.p["zoneid"].(string) + return value, ok +} + +// You should always use this function to get a new GetUploadParamsForKubernetesSupportedVersionParams instance, +// as then you are sure you have configured all required params +func (s *KubernetesService) NewGetUploadParamsForKubernetesSupportedVersionParams(format string, mincpunumber int, minmemory int, name string, semanticversion string, zoneid string) *GetUploadParamsForKubernetesSupportedVersionParams { + p := &GetUploadParamsForKubernetesSupportedVersionParams{} + p.p = make(map[string]interface{}) + p.p["format"] = format + p.p["mincpunumber"] = mincpunumber + p.p["minmemory"] = minmemory + p.p["name"] = name + p.p["semanticversion"] = semanticversion + p.p["zoneid"] = zoneid + return p +} + +// Upload a supported Kubernetes version +func (s *KubernetesService) GetUploadParamsForKubernetesSupportedVersion(p *GetUploadParamsForKubernetesSupportedVersionParams) (*GetUploadParamsForKubernetesSupportedVersionResponse, error) { + resp, err := s.cs.newRequest("getUploadParamsForKubernetesSupportedVersion", p.toURLValues()) + if err != nil { + return nil, err + } + + var r GetUploadParamsForKubernetesSupportedVersionResponse + if err := json.Unmarshal(resp, &r); err != nil { + return nil, err + } + + return &r, nil +} + +type GetUploadParamsForKubernetesSupportedVersionResponse struct { + Arch string `json:"arch"` + Created string `json:"created"` + Directdownload bool `json:"directdownload"` + Id string `json:"id"` + Isoid string `json:"isoid"` + Isoname string `json:"isoname"` + Isostate string `json:"isostate"` + Isourl string `json:"isourl"` + JobID string `json:"jobid"` + Jobstatus int `json:"jobstatus"` + Mincpunumber int `json:"mincpunumber"` + Minmemory int `json:"minmemory"` + Name string `json:"name"` + Semanticversion string `json:"semanticversion"` + State string `json:"state"` + Supportsautoscaling bool `json:"supportsautoscaling"` + Supportsha bool `json:"supportsha"` + Zoneid string `json:"zoneid"` + Zonename string `json:"zonename"` +} diff --git a/cloudstack/KubernetesService_mock.go b/cloudstack/KubernetesService_mock.go index 65dea25..6ed11bd 100644 --- a/cloudstack/KubernetesService_mock.go +++ b/cloudstack/KubernetesService_mock.go @@ -289,6 +289,21 @@ func (mr *MockKubernetesServiceIfaceMockRecorder) GetKubernetesSupportedVersionI return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetKubernetesSupportedVersionID", reflect.TypeOf((*MockKubernetesServiceIface)(nil).GetKubernetesSupportedVersionID), varargs...) } +// GetUploadParamsForKubernetesSupportedVersion mocks base method. +func (m *MockKubernetesServiceIface) GetUploadParamsForKubernetesSupportedVersion(p *GetUploadParamsForKubernetesSupportedVersionParams) (*GetUploadParamsForKubernetesSupportedVersionResponse, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetUploadParamsForKubernetesSupportedVersion", p) + ret0, _ := ret[0].(*GetUploadParamsForKubernetesSupportedVersionResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetUploadParamsForKubernetesSupportedVersion indicates an expected call of GetUploadParamsForKubernetesSupportedVersion. +func (mr *MockKubernetesServiceIfaceMockRecorder) GetUploadParamsForKubernetesSupportedVersion(p any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetUploadParamsForKubernetesSupportedVersion", reflect.TypeOf((*MockKubernetesServiceIface)(nil).GetUploadParamsForKubernetesSupportedVersion), p) +} + // ListKubernetesClusters mocks base method. func (m *MockKubernetesServiceIface) ListKubernetesClusters(p *ListKubernetesClustersParams) (*ListKubernetesClustersResponse, error) { m.ctrl.T.Helper() @@ -417,6 +432,20 @@ func (mr *MockKubernetesServiceIfaceMockRecorder) NewGetKubernetesClusterConfigP return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NewGetKubernetesClusterConfigParams", reflect.TypeOf((*MockKubernetesServiceIface)(nil).NewGetKubernetesClusterConfigParams)) } +// NewGetUploadParamsForKubernetesSupportedVersionParams mocks base method. +func (m *MockKubernetesServiceIface) NewGetUploadParamsForKubernetesSupportedVersionParams(format string, mincpunumber, minmemory int, name, semanticversion, zoneid string) *GetUploadParamsForKubernetesSupportedVersionParams { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "NewGetUploadParamsForKubernetesSupportedVersionParams", format, mincpunumber, minmemory, name, semanticversion, zoneid) + ret0, _ := ret[0].(*GetUploadParamsForKubernetesSupportedVersionParams) + return ret0 +} + +// NewGetUploadParamsForKubernetesSupportedVersionParams indicates an expected call of NewGetUploadParamsForKubernetesSupportedVersionParams. +func (mr *MockKubernetesServiceIfaceMockRecorder) NewGetUploadParamsForKubernetesSupportedVersionParams(format, mincpunumber, minmemory, name, semanticversion, zoneid any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NewGetUploadParamsForKubernetesSupportedVersionParams", reflect.TypeOf((*MockKubernetesServiceIface)(nil).NewGetUploadParamsForKubernetesSupportedVersionParams), format, mincpunumber, minmemory, name, semanticversion, zoneid) +} + // NewListKubernetesClustersParams mocks base method. func (m *MockKubernetesServiceIface) NewListKubernetesClustersParams() *ListKubernetesClustersParams { m.ctrl.T.Helper() diff --git a/generate/layout.go b/generate/layout.go index 0a20b96..b5d6a47 100644 --- a/generate/layout.go +++ b/generate/layout.go @@ -912,6 +912,7 @@ var layout = apiInfo{ "removeVirtualMachinesFromKubernetesCluster", "addNodesToKubernetesCluster", "removeNodesFromKubernetesCluster", + "getUploadParamsForKubernetesSupportedVersion", }, "InfrastructureUsageService": { "listDbMetrics", diff --git a/test/KubernetesService_test.go b/test/KubernetesService_test.go index e7c0276..026d9bb 100644 --- a/test/KubernetesService_test.go +++ b/test/KubernetesService_test.go @@ -257,4 +257,19 @@ func TestKubernetesService(t *testing.T) { } t.Run("RemoveNodesFromKubernetesCluster", testremoveNodesFromKubernetesCluster) + testgetUploadParamsForKubernetesSupportedVersion := func(t *testing.T) { + if _, ok := response["getUploadParamsForKubernetesSupportedVersion"]; !ok { + t.Skipf("Skipping as no json response is provided in testdata") + } + p := client.Kubernetes.NewGetUploadParamsForKubernetesSupportedVersionParams("format", 0, 0, "name", "semanticversion", "zoneid") + r, err := client.Kubernetes.GetUploadParamsForKubernetesSupportedVersion(p) + if err != nil { + t.Errorf(err.Error()) + } + if r.Id == "" { + t.Errorf("Failed to parse response. ID not found") + } + } + t.Run("GetUploadParamsForKubernetesSupportedVersion", testgetUploadParamsForKubernetesSupportedVersion) + } From 1f6bea83dae9b9b63ac72d69e3e9f4169c653358 Mon Sep 17 00:00:00 2001 From: Pearl Dsilva Date: Tue, 4 Aug 2026 10:27:07 -0400 Subject: [PATCH 2/2] update nested response --- cloudstack/KubernetesService.go | 7 +++-- generate/generate.go | 53 +++++++++++++++++---------------- 2 files changed, 32 insertions(+), 28 deletions(-) diff --git a/cloudstack/KubernetesService.go b/cloudstack/KubernetesService.go index 9d0a292..a174246 100644 --- a/cloudstack/KubernetesService.go +++ b/cloudstack/KubernetesService.go @@ -4000,10 +4000,13 @@ func (s *KubernetesService) GetUploadParamsForKubernetesSupportedVersion(p *GetU return nil, err } - var r GetUploadParamsForKubernetesSupportedVersionResponse - if err := json.Unmarshal(resp, &r); err != nil { + var nested struct { + Response GetUploadParamsForKubernetesSupportedVersionResponse `json:"getuploadparams"` + } + if err := json.Unmarshal(resp, &nested); err != nil { return nil, err } + r := nested.Response return &r, nil } diff --git a/generate/generate.go b/generate/generate.go index 982ce22..3beb89c 100644 --- a/generate/generate.go +++ b/generate/generate.go @@ -114,32 +114,33 @@ var mapRequireList = map[string]map[string]bool{ // that responses fields are nested in a parent object. The map value // gives the object field name. var nestedResponse = map[string]string{ - "getUploadParamsForTemplate": "getuploadparams", - "getUploadParamsForVolume": "getuploadparams", - "createRole": "role", - "createRolePermission": "rolepermission", - "getCloudIdentifier": "cloudidentifier", - "getKubernetesClusterConfig": "clusterconfig", - "getPathForVolume": "apipathforvolume", - "createConsoleEndpoint": "consoleendpoint", - "addVmwareDc": "vmwaredc", - "updateVmwareDc": "vmwaredc", - "createProjectRole": "projectrole", - "updateProjectRole": "projectrole", - "registerUserData": "userdata", - "updateSecurityGroup": "securitygroup", - "updateOauthProvider": "oauthprovider", - "readyForShutdown": "readyforshutdown", - "updateObjectStoragePool": "objectstore", - "addObjectStoragePool": "objectstore", - "updateImageStore": "imagestore", - "linkUserDataToTemplate": "template", - "assignVolume": "volume", - "createVMSchedule": "vmschedule", - "updateVMSchedule": "vmschedule", - "setupUserTwoFactorAuthentication": "setup2fa", - "updateSecondaryStorageSelector": "heuristics", - "createSecondaryStorageSelector": "heuristics", + "getUploadParamsForTemplate": "getuploadparams", + "getUploadParamsForVolume": "getuploadparams", + "createRole": "role", + "createRolePermission": "rolepermission", + "getCloudIdentifier": "cloudidentifier", + "getKubernetesClusterConfig": "clusterconfig", + "getPathForVolume": "apipathforvolume", + "createConsoleEndpoint": "consoleendpoint", + "addVmwareDc": "vmwaredc", + "updateVmwareDc": "vmwaredc", + "createProjectRole": "projectrole", + "updateProjectRole": "projectrole", + "registerUserData": "userdata", + "updateSecurityGroup": "securitygroup", + "updateOauthProvider": "oauthprovider", + "readyForShutdown": "readyforshutdown", + "updateObjectStoragePool": "objectstore", + "addObjectStoragePool": "objectstore", + "updateImageStore": "imagestore", + "linkUserDataToTemplate": "template", + "assignVolume": "volume", + "createVMSchedule": "vmschedule", + "updateVMSchedule": "vmschedule", + "setupUserTwoFactorAuthentication": "setup2fa", + "updateSecondaryStorageSelector": "heuristics", + "createSecondaryStorageSelector": "heuristics", + "getUploadParamsForKubernetesSupportedVersion": "getuploadparams", } // longToStringConvertedParams is a prefilled map with the list of