capabilites add available host count

This commit is contained in:
wanyaoqi
2020-07-23 18:10:58 +08:00
parent a677f24351
commit 64935a4656
4 changed files with 49 additions and 5 deletions
+37
View File
@@ -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()
}
+2
View File
@@ -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()
+5 -5
View File
@@ -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)
}
}
+5
View File
@@ -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())