mirror of
https://github.com/yunionio/cloudpods.git
synced 2026-09-19 02:37:24 +08:00
capabilites add available host count
This commit is contained in:
@@ -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()
|
||||
}
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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())
|
||||
|
||||
Reference in New Issue
Block a user