From ff6ce61110e78656acafc35d791f99f25633d5e5 Mon Sep 17 00:00:00 2001 From: Qu Xuan Date: Tue, 11 Feb 2025 14:26:01 +0800 Subject: [PATCH] fix(aliyun): support change vm billing type --- pkg/cloudprovider/resources.go | 1 + pkg/multicloud/aliyun/instance.go | 26 +++++++++++++++++++++++++ pkg/multicloud/aliyun/shell/instance.go | 9 +++++++++ pkg/multicloud/billing_base.go | 4 ++++ pkg/multicloud/hcso/modelarts.go | 1 + pkg/multicloud/huawei/modelarts_pool.go | 1 + 6 files changed, 42 insertions(+) diff --git a/pkg/cloudprovider/resources.go b/pkg/cloudprovider/resources.go index 4616516e5..11688b38d 100644 --- a/pkg/cloudprovider/resources.go +++ b/pkg/cloudprovider/resources.go @@ -63,6 +63,7 @@ type IBillingResource interface { GetExpiredAt() time.Time SetAutoRenew(bc billing.SBillingCycle) error Renew(bc billing.SBillingCycle) error + ChangeBillingType(billType string) error IsAutoRenew() bool } diff --git a/pkg/multicloud/aliyun/instance.go b/pkg/multicloud/aliyun/instance.go index 1d79eca2f..44db46e76 100644 --- a/pkg/multicloud/aliyun/instance.go +++ b/pkg/multicloud/aliyun/instance.go @@ -995,6 +995,32 @@ func (self *SInstance) GetBillingType() string { return convertChargeType(self.InstanceChargeType) } +func (self *SInstance) ChangeBillingType(billingType string) error { + return self.host.zone.region.ModifyInstanceChargeType(self.InstanceId, billingType) +} + +func (region *SRegion) ModifyInstanceChargeType(vmId string, billingType string) error { + params := map[string]string{ + "RegionId": region.RegionId, + "IncludeDataDisks": "true", + "AutoPay": "true", + "ClientToken": utils.GenRequestId(20), + "InstanceIds": jsonutils.Marshal([]string{vmId}).String(), + } + switch billingType { + case billing_api.BILLING_TYPE_POSTPAID: + params["InstanceChargeType"] = "PostPaid" + case billing_api.BILLING_TYPE_PREPAID: + params["InstanceChargeType"] = "PrePaid" + params["Period"] = "1" + params["PeriodUnit"] = "Month" + default: + return fmt.Errorf("invalid billing_type %s", billingType) + } + _, err := region.ecsRequest("ModifyInstanceChargeType", params) + return err +} + func (self *SInstance) GetCreatedAt() time.Time { return self.CreationTime } diff --git a/pkg/multicloud/aliyun/shell/instance.go b/pkg/multicloud/aliyun/shell/instance.go index 496d4f7a9..479a45283 100644 --- a/pkg/multicloud/aliyun/shell/instance.go +++ b/pkg/multicloud/aliyun/shell/instance.go @@ -224,4 +224,13 @@ func init() { return nil }) + type InstanceChangeBillingType struct { + ID string + BillingType string `choices:"postpaid|prepaid" default:"prepaid"` + } + + shellutils.R(&InstanceChangeBillingType{}, "instance-change-billing-type", "change instance billing type", func(cli *aliyun.SRegion, args *InstanceChangeBillingType) error { + return cli.ModifyInstanceChargeType(args.ID, args.BillingType) + }) + } diff --git a/pkg/multicloud/billing_base.go b/pkg/multicloud/billing_base.go index b8dc0402d..e02b9c3e7 100644 --- a/pkg/multicloud/billing_base.go +++ b/pkg/multicloud/billing_base.go @@ -44,3 +44,7 @@ func (self *SBillingBase) IsAutoRenew() bool { func (self *SBillingBase) Renew(bc billing.SBillingCycle) error { return errors.Wrap(cloudprovider.ErrNotImplemented, "Renew") } + +func (self *SBillingBase) ChangeBillingType(billType string) error { + return errors.Wrap(cloudprovider.ErrNotImplemented, "ChangeBillingType") +} diff --git a/pkg/multicloud/hcso/modelarts.go b/pkg/multicloud/hcso/modelarts.go index 92c02094d..5104b717a 100644 --- a/pkg/multicloud/hcso/modelarts.go +++ b/pkg/multicloud/hcso/modelarts.go @@ -32,6 +32,7 @@ import ( type SModelartsPool struct { region *SRegion multicloud.SResourceBase + multicloud.SBillingBase Metadata SModelartsPoolMetadata `json:"metadata"` Spec SModelartsPoolSpec `json:"spec"` diff --git a/pkg/multicloud/huawei/modelarts_pool.go b/pkg/multicloud/huawei/modelarts_pool.go index 014b4be60..e03e7945f 100644 --- a/pkg/multicloud/huawei/modelarts_pool.go +++ b/pkg/multicloud/huawei/modelarts_pool.go @@ -34,6 +34,7 @@ import ( type SModelartsPool struct { region *SRegion multicloud.SResourceBase + multicloud.SBillingBase Metadata SModelartsPoolMetadata `json:"metadata"` Spec SModelartsPoolSpec `json:"spec"`