From 7bed7f2e16541a2d93e7eb4ffb2ca4b87a64e2e9 Mon Sep 17 00:00:00 2001 From: wanyaoqi Date: Tue, 12 Nov 2019 14:49:29 +0800 Subject: [PATCH] postpaid expire support premise --- pkg/compute/guestdrivers/base.go | 4 ++++ pkg/compute/guestdrivers/esxi.go | 4 ++++ pkg/compute/guestdrivers/kvm.go | 4 ++++ pkg/compute/guestdrivers/openstack.go | 4 ++++ pkg/compute/guestdrivers/zstack.go | 4 ++++ pkg/compute/models/guest_actions.go | 23 +++++++++++++++++++++++ pkg/compute/models/guestdrivers.go | 1 + pkg/compute/models/guests.go | 4 +++- pkg/hostman/guestfs/fsdriver/linux.go | 21 +++++++++++++++++++++ 9 files changed, 68 insertions(+), 1 deletion(-) diff --git a/pkg/compute/guestdrivers/base.go b/pkg/compute/guestdrivers/base.go index fd2c2c7f36..9c558f7f1d 100644 --- a/pkg/compute/guestdrivers/base.go +++ b/pkg/compute/guestdrivers/base.go @@ -239,6 +239,10 @@ func (self *SBaseGuestDriver) IsSupportedBillingCycle(bc billing.SBillingCycle) return true } +func (self *SBaseGuestDriver) IsSupportPostpaidExpire() bool { + return false +} + func (self *SBaseGuestDriver) RequestRenewInstance(guest *models.SGuest, bc billing.SBillingCycle) (time.Time, error) { return time.Time{}, nil } diff --git a/pkg/compute/guestdrivers/esxi.go b/pkg/compute/guestdrivers/esxi.go index fdbc764850..14395021db 100644 --- a/pkg/compute/guestdrivers/esxi.go +++ b/pkg/compute/guestdrivers/esxi.go @@ -235,6 +235,10 @@ func (self *SESXiGuestDriver) CancelExpireTime( return guest.CancelExpireTime(ctx, userCred) } +func (self *SESXiGuestDriver) IsSupportPostpaidExpire() bool { + return true +} + func (self *SESXiGuestDriver) IsSupportCdrom(guest *models.SGuest) (bool, error) { return false, nil } diff --git a/pkg/compute/guestdrivers/kvm.go b/pkg/compute/guestdrivers/kvm.go index d6fab80b53..1418eee465 100644 --- a/pkg/compute/guestdrivers/kvm.go +++ b/pkg/compute/guestdrivers/kvm.go @@ -480,3 +480,7 @@ func (self *SKVMGuestDriver) CancelExpireTime( func (self *SKVMGuestDriver) IsSupportCdrom(guest *models.SGuest) (bool, error) { return true, nil } + +func (self *SKVMGuestDriver) IsSupportPostpaidExpire() bool { + return true +} diff --git a/pkg/compute/guestdrivers/openstack.go b/pkg/compute/guestdrivers/openstack.go index f6f869d085..e84f915977 100644 --- a/pkg/compute/guestdrivers/openstack.go +++ b/pkg/compute/guestdrivers/openstack.go @@ -155,6 +155,10 @@ func (self *SOpenStackGuestDriver) IsSupportedBillingCycle(bc billing.SBillingCy return false } +func (self *SOpenStackGuestDriver) IsSupportPostpaidExpire() bool { + return true +} + func (self *SOpenStackGuestDriver) CancelExpireTime( ctx context.Context, userCred mcclient.TokenCredential, guest *models.SGuest) error { return guest.CancelExpireTime(ctx, userCred) diff --git a/pkg/compute/guestdrivers/zstack.go b/pkg/compute/guestdrivers/zstack.go index bfdcf66c3d..372291cb0b 100644 --- a/pkg/compute/guestdrivers/zstack.go +++ b/pkg/compute/guestdrivers/zstack.go @@ -165,6 +165,10 @@ func (self *SZStackGuestDriver) IsSupportedBillingCycle(bc billing.SBillingCycle return false } +func (self *SZStackGuestDriver) IsSupportPostpaidExpire() bool { + return true +} + func (self *SZStackGuestDriver) CancelExpireTime( ctx context.Context, userCred mcclient.TokenCredential, guest *models.SGuest) error { return guest.CancelExpireTime(ctx, userCred) diff --git a/pkg/compute/models/guest_actions.go b/pkg/compute/models/guest_actions.go index 0e4abb5ae7..5ea10c229a 100644 --- a/pkg/compute/models/guest_actions.go +++ b/pkg/compute/models/guest_actions.go @@ -3247,6 +3247,29 @@ func (self *SGuest) PerformCancelExpire(ctx context.Context, userCred mcclient.T return nil, err } +func (self *SGuest) AllowPerformPostpaidExpire(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) bool { + return self.IsOwner(userCred) || db.IsAdminAllowPerform(userCred, self, "postpaid-expire") +} + +func (self *SGuest) PerformPostpaidExpire(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) (jsonutils.JSONObject, error) { + durationStr := jsonutils.GetAnyString(data, []string{"duration"}) + if len(durationStr) == 0 { + return nil, httperrors.NewInputParameterError("missong duration") + } + + bc, err := billing.ParseBillingCycle(durationStr) + if err != nil { + return nil, httperrors.NewInputParameterError("invalid duration %s: %s", durationStr, err) + } + + if !self.GetDriver().IsSupportPostpaidExpire() { + return nil, httperrors.NewBadRequestError("guest %s unsupport postpaid expire", self.Hypervisor) + } + + err = self.SaveRenewInfo(ctx, userCred, &bc, nil) + return nil, err +} + func (self *SGuest) AllowPerformRenew(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) bool { return db.IsAdminAllowPerform(userCred, self, "renew") } diff --git a/pkg/compute/models/guestdrivers.go b/pkg/compute/models/guestdrivers.go index f0cb0ab507..f82c92b5a1 100644 --- a/pkg/compute/models/guestdrivers.go +++ b/pkg/compute/models/guestdrivers.go @@ -51,6 +51,7 @@ type IGuestDriver interface { GetMinimalSysDiskSizeGb() int IsSupportedBillingCycle(bc billing.SBillingCycle) bool + IsSupportPostpaidExpire() bool RequestRenewInstance(guest *SGuest, bc billing.SBillingCycle) (time.Time, error) diff --git a/pkg/compute/models/guests.go b/pkg/compute/models/guests.go index e9f0911a9b..5fbfe52898 100644 --- a/pkg/compute/models/guests.go +++ b/pkg/compute/models/guests.go @@ -2198,7 +2198,9 @@ func (self *SGuest) syncWithCloudVM(ctx context.Context, userCred mcclient.Token self.IsEmulated = extVM.IsEmulated() - if provider.GetFactory().IsSupportPrepaidResources() && !recycle { + if provider.GetFactory().IsSupportPrepaidResources() && !recycle && + !extVM.GetExpiredAt().IsZero() { + self.BillingType = extVM.GetBillingType() self.ExpiredAt = extVM.GetExpiredAt() } diff --git a/pkg/hostman/guestfs/fsdriver/linux.go b/pkg/hostman/guestfs/fsdriver/linux.go index 9b62b2f608..f87939cdbe 100644 --- a/pkg/hostman/guestfs/fsdriver/linux.go +++ b/pkg/hostman/guestfs/fsdriver/linux.go @@ -773,6 +773,27 @@ func (d *SUbuntuRootFs) DisableSerialConcole(rootFs IDiskPartition) error { return nil } +type SKylinRootfs struct { + *SUbuntuRootFs +} + +func NewKylinRootfs(part IDiskPartition) *SKylinRootfs { + return &SKylinRootfs{SUbuntuRootFs: NewUbuntuRootFs(part).(*SUbuntuRootFs)} +} + +func (d *SKylinRootfs) GetName() string { + return "Kylin" +} + +func (d *SKylinRootfs) String() string { + return "KylinuRootFs" +} + +func (d *SKylinRootfs) RootSignatures() []string { + sig := d.sDebianLikeRootFs.RootSignatures() + return append([]string{"/etc/lsb-release", "/etc/kylin-build"}, sig...) +} + type sRedhatLikeRootFs struct { *sLinuxRootFs }