From 64935a4656379cb3f723791f3ba052966a5e18aa Mon Sep 17 00:00:00 2001 From: wanyaoqi Date: Wed, 22 Jul 2020 21:11:24 +0800 Subject: [PATCH] capabilites add available host count --- pkg/compute/models/capabilities.go | 37 +++++++++++++++++++++++++ pkg/compute/models/guests.go | 2 ++ pkg/compute/tasks/guest_backup_tasks.go | 10 +++---- pkg/hostman/guestman/guestman.go | 5 ++++ 4 files changed, 49 insertions(+), 5 deletions(-) diff --git a/pkg/compute/models/capabilities.go b/pkg/compute/models/capabilities.go index aa3d322801..3108dd1330 100644 --- a/pkg/compute/models/capabilities.go +++ b/pkg/compute/models/capabilities.go @@ -61,6 +61,7 @@ type SCapabilities struct { PublicNetworkCount int DBInstance map[string]map[string]map[string][]string //map[engine][engineVersion][category][]{storage_type} Specs jsonutils.JSONObject + AvailableHostCount int StorageTypes2 map[string][]string `json:",allowempty"` StorageTypes3 map[string]map[string]*SimpleStorageInfo `json:",allowempty"` @@ -127,9 +128,45 @@ func GetCapabilities(ctx context.Context, userCred mcclient.TokenCredential, que capa.PublicNetworkCount = publicNetworkCount mans := []ISpecModelManager{HostManager, IsolatedDeviceManager} capa.Specs, err = GetModelsSpecs(ctx, userCred, query.(*jsonutils.JSONDict), mans...) + if err != nil { + return capa, err + } + capa.AvailableHostCount, err = GetAvailableHostCount(userCred, query.(*jsonutils.JSONDict)) return capa, err } +func GetAvailableHostCount(userCred mcclient.TokenCredential, query *jsonutils.JSONDict) (int, error) { + zoneStr, _ := query.GetString("zone") + izone, _ := ZoneManager.FetchByIdOrName(userCred, zoneStr) + var zoneId string + if izone != nil { + zoneId = izone.GetId() + } + + regionStr, _ := query.GetString("region") + iregion, _ := CloudregionManager.FetchByIdOrName(userCred, regionStr) + var regionId string + if iregion != nil { + regionId = iregion.GetId() + } + + domainId, _ := query.GetString("domain_id") + q := HostManager.Query().Equals("enabled", true). + Equals("host_status", "online").Equals("host_type", api.HOST_TYPE_HYPERVISOR) + if len(domainId) > 0 { + ownerId := &db.SOwnerId{DomainId: domainId} + q = HostManager.FilterByOwner(q, ownerId, rbacutils.ScopeDomain) + } + if len(zoneId) > 0 { + q = q.Equals("zone_id", zoneId) + } + if len(regionId) > 0 { + subq := ZoneManager.Query("id").Equals("cloudregion_id", regionId).SubQuery() + q = q.Filter(sqlchemy.In(q.Field("zone_id"), subq)) + } + return q.CountWithError() +} + func getRegionZoneSubq(region *SCloudregion) *sqlchemy.SSubQuery { return ZoneManager.Query("id").Equals("cloudregion_id", region.GetId()).SubQuery() } diff --git a/pkg/compute/models/guests.go b/pkg/compute/models/guests.go index 679c9b981f..a5c7a4352e 100644 --- a/pkg/compute/models/guests.go +++ b/pkg/compute/models/guests.go @@ -4491,6 +4491,7 @@ func (self *SGuestManager) switchBackupGuests(ctx context.Context, userCred mccl log.Errorf("ReconcileBackupGuests failed fetch guests %s", err) return } + log.Infof("Guests count %d need reconcile with switch bakcup", len(guests)) for i := 0; i < len(guests); i++ { val := guests[i].GetMetadataJson("switch_backup", userCred) t, err := val.GetTime() @@ -4529,6 +4530,7 @@ func (self *SGuestManager) createBackupGuests(ctx context.Context, userCred mccl log.Errorf("ReconcileBackupGuests failed fetch guests %s", err) return } + log.Infof("Guests count %d need reconcile with create bakcup", len(guests)) for i := 0; i < len(guests); i++ { val := guests[i].GetMetadataJson("create_backup", userCred) t, err := val.GetTime() diff --git a/pkg/compute/tasks/guest_backup_tasks.go b/pkg/compute/tasks/guest_backup_tasks.go index e4160140a1..ab5bbeb85f 100644 --- a/pkg/compute/tasks/guest_backup_tasks.go +++ b/pkg/compute/tasks/guest_backup_tasks.go @@ -113,7 +113,7 @@ func (self *GuestSwitchToBackupTask) OnFail(ctx context.Context, guest *models.S func (self *GuestSwitchToBackupTask) SetSwitchFiledGuestMetadata(ctx context.Context, guest *models.SGuest) { if res := guest.GetMetadata("switch_backup", self.UserCred); len(res) == 0 { guest.SetMetadata( - ctx, "switch_backup", jsonutils.NewTimeString(time.Now().Add(time.Minute*1)), self.UserCred) + ctx, "switch_backup", jsonutils.NewTimeString(time.Now().Add(time.Minute*1).UTC()), self.UserCred) guest.SetMetadata(ctx, "switch_backup_count", jsonutils.NewInt(1), self.UserCred) } else { count := guest.GetMetadataJson("switch_backup_count", self.UserCred) @@ -125,7 +125,7 @@ func (self *GuestSwitchToBackupTask) SetSwitchFiledGuestMetadata(ctx context.Con } guest.SetMetadata(ctx, "switch_backup", - jsonutils.NewTimeString(time.Now().Add(time.Minute*time.Duration(dur))), self.UserCred) + jsonutils.NewTimeString(time.Now().Add(time.Minute*time.Duration(dur)).UTC()), self.UserCred) guest.SetMetadata(ctx, "switch_backup_count", jsonutils.NewInt(cnt), self.UserCred) } } @@ -165,7 +165,7 @@ func (self *GuestSwitchToBackupTask) OnSwitched(ctx context.Context, guest *mode } func (self *GuestSwitchToBackupTask) failedStartCreateBackupTask(ctx context.Context, guest *models.SGuest) { - guest.SetMetadata(ctx, "create_backup", jsonutils.NewTimeString(time.Now().Add(time.Minute*1)), self.UserCred) + guest.SetMetadata(ctx, "create_backup", jsonutils.NewTimeString(time.Now().Add(time.Minute*1).UTC()), self.UserCred) guest.SetMetadata(ctx, "create_backup_count", jsonutils.NewInt(1), self.UserCred) self.OnCreatedBackup(ctx, guest, nil) } @@ -420,7 +420,7 @@ func (self *GuestCreateBackupTask) TaskFailed(ctx context.Context, guest *models if jsonutils.QueryBoolean(self.Params, "reconcile_backup", false) { if res := guest.GetMetadata("create_backup", self.UserCred); len(res) == 0 { guest.SetMetadata( - ctx, "create_backup", jsonutils.NewTimeString(time.Now().Add(time.Minute*1)), self.UserCred) + ctx, "create_backup", jsonutils.NewTimeString(time.Now().Add(time.Minute*1).UTC()), self.UserCred) guest.SetMetadata(ctx, "create_backup_count", jsonutils.NewInt(1), self.UserCred) } else { count := guest.GetMetadataJson("create_backup_count", self.UserCred) @@ -432,7 +432,7 @@ func (self *GuestCreateBackupTask) TaskFailed(ctx context.Context, guest *models } guest.SetMetadata(ctx, "create_backup", - jsonutils.NewTimeString(time.Now().Add(time.Minute*time.Duration(dur))), self.UserCred) + jsonutils.NewTimeString(time.Now().Add(time.Minute*time.Duration(dur)).UTC()), self.UserCred) guest.SetMetadata(ctx, "create_backup_count", jsonutils.NewInt(cnt), self.UserCred) } } diff --git a/pkg/hostman/guestman/guestman.go b/pkg/hostman/guestman/guestman.go index 637e404946..4a319461be 100644 --- a/pkg/hostman/guestman/guestman.go +++ b/pkg/hostman/guestman/guestman.go @@ -804,6 +804,11 @@ func (m *SGuestManager) CancelBlockJobs(ctx context.Context, params interface{}) if !ok { return nil, hostutils.ParamsError } + status := m.GetStatus(sid) + if status == GUSET_STOPPED { + hostutils.TaskComplete(ctx, nil) + return nil, nil + } defer func() { if r := recover(); r != nil { log.Errorf("STACK: %v \n %s", r, debug.Stack())