Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
313 changes: 313 additions & 0 deletions cloudstack/KubernetesService.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down Expand Up @@ -3719,3 +3721,314 @@ 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 nested struct {
Response GetUploadParamsForKubernetesSupportedVersionResponse `json:"getuploadparams"`
}
if err := json.Unmarshal(resp, &nested); err != nil {
return nil, err
}
r := nested.Response

return &r, nil
}

type GetUploadParamsForKubernetesSupportedVersionResponse struct {

@abh1sar abh1sar Aug 4, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This looks like a bug in CloudStack.
The api says that it returns KubernetesSupportedVersionResponse.class

@APICommand(name = "getUploadParamsForKubernetesSupportedVersion",
        description = "Upload a supported Kubernetes version",
        responseObject = KubernetesSupportedVersionResponse.class,
        responseView = ResponseObject.ResponseView.Full,
        entityType = {KubernetesSupportedVersion.class},
        authorized = {RoleType.Admin})

But it actually returns GetUploadParamsResponse

GetUploadParamsResponse response = kubernetesVersionService.registerKubernetesSupportedVersionForPostUpload(this);
            if (response == null) {
                throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to add Kubernetes supported version");
            }
            response.setResponseName(getCommandName());
            setResponseObject(response);

how do you think we should handle it? @Pearl1594

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Then we let this remain open until we fix it upstream. Let's open an issue in the CloudStack repo and link it here to track it.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

merging this PR for the other changes. I'll raise a new issue here and on cloudstack to track the above

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

On further research I found that there are similar other APIs in cloudstack and the go-sdk handles some of these explicitly like the quotaBalance api

	if a.Name == "quotaBalance" {
		pn("type QuotaBalanceResponse struct {")
		pn("    Statement QuotaBalanceResponseType `json:\"balance\"`")
		pn("}")
		pn("")
		pn("type QuotaBalanceResponseType struct {")
		pn("    StartQuota float64  `json:\"startquota\"`")
		pn("    Credits    []string `json:\"credits\"`")
		pn("    StartDate  string   `json:\"startdate\"`")
		pn("    Currency   string   `json:\"currency\"`")
		pn("}")
		pn("")
		return
	}

I have added a similar change for getUploadParamsForKubernetesSupportedVersion, but I merged the commit directly into support-4.22.1.0 by mistake.
@Pearl1594 can you please check/review it: 33aaef3

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"`
}
29 changes: 29 additions & 0 deletions cloudstack/KubernetesService_mock.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading
Loading