mirror of
https://github.com/yunionio/cloudpods.git
synced 2026-09-24 16:03:43 +08:00
Merge pull request #5852 from rainzm/fix/auto_scaling4
fix(region): Fix some problem for Auto Scaling
This commit is contained in:
@@ -298,6 +298,11 @@ func (sg *SScalingGroup) ScalingPolicies() ([]SScalingPolicy, error) {
|
||||
func (sgm *SScalingGroupManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery,
|
||||
userCred mcclient.TokenCredential, input api.ScalingGroupListInput) (*sqlchemy.SQuery, error) {
|
||||
|
||||
// hack
|
||||
// vpc and backendgroup may be empty, and these subresoruce shouldn't be fiter by brand
|
||||
brand := input.Brand
|
||||
input.Brand = ""
|
||||
|
||||
q, err := sgm.SCloudregionResourceBaseManager.ListItemFilter(ctx, q, userCred, input.RegionalFilterListInput)
|
||||
if err != nil {
|
||||
return q, err
|
||||
@@ -325,9 +330,10 @@ func (sgm *SScalingGroupManager) ListItemFilter(ctx context.Context, q *sqlchemy
|
||||
if len(input.Hypervisor) > 0 {
|
||||
q = q.Equals("hypervisor", input.Hypervisor)
|
||||
}
|
||||
if len(input.Brand) > 0 {
|
||||
if len(brand) > 0 {
|
||||
q = q.Equals("hypervisor", Brand2Hypervisor(input.Brand))
|
||||
}
|
||||
input.Brand = brand
|
||||
return q, nil
|
||||
}
|
||||
|
||||
@@ -491,27 +497,30 @@ func (sg *SScalingGroup) exec(ctx context.Context, action IScalingAction) (ret s
|
||||
|
||||
// Scale will modify SScalingGroup.DesireInstanceNumber and generate SScalingActivity based on the trigger and its
|
||||
// corresponding SScalingPolicy.
|
||||
func (sg *SScalingGroup) Scale(ctx context.Context, triggerDesc IScalingTriggerDesc, action IScalingAction) error {
|
||||
func (sg *SScalingGroup) Scale(ctx context.Context, triggerDesc IScalingTriggerDesc, action IScalingAction) (bool, error) {
|
||||
isExec := false
|
||||
if sg.Enabled.IsFalse() {
|
||||
return nil
|
||||
return isExec, nil
|
||||
}
|
||||
scalingActivity, err := ScalingActivityManager.CreateScalingActivity(sg.Id, triggerDesc.TriggerDescription(), api.SA_STATUS_EXEC)
|
||||
if err != nil {
|
||||
return errors.Wrapf(err, "create ScalingActivity whose ScalingGroup is %s error", sg.Id)
|
||||
return isExec, errors.Wrapf(err, "create ScalingActivity whose ScalingGroup is %s error", sg.Id)
|
||||
}
|
||||
if action.CheckCoolTime() && !sg.AllowScale() {
|
||||
err = scalingActivity.SetReject("",
|
||||
fmt.Sprintf("The Cooling Time limit the execution time of the policy to at least: %s",
|
||||
sg.AllowScaleTime))
|
||||
return nil
|
||||
return isExec, nil
|
||||
}
|
||||
|
||||
ret := sg.exec(ctx, action)
|
||||
switch ret.code {
|
||||
case 0:
|
||||
err = scalingActivity.SetResult(ret.actionStr, api.SA_STATUS_SUCCEED, "", ret.intanceNum)
|
||||
isExec = true
|
||||
case 1:
|
||||
err = scalingActivity.SetResult(ret.actionStr, api.SA_STATUS_PART_SUCCEED, ret.reason, ret.intanceNum)
|
||||
isExec = true
|
||||
case 2:
|
||||
err = scalingActivity.SetReject("", ret.reason)
|
||||
case 3:
|
||||
@@ -521,7 +530,7 @@ func (sg *SScalingGroup) Scale(ctx context.Context, triggerDesc IScalingTriggerD
|
||||
if err != nil {
|
||||
log.Errorf("ScalingActivity set result failed: %s", err.Error())
|
||||
}
|
||||
return nil
|
||||
return isExec, nil
|
||||
}
|
||||
|
||||
func (sgm *SScalingGroupManager) QueryDistinctExtraField(q *sqlchemy.SQuery, field string) (*sqlchemy.SQuery, error) {
|
||||
|
||||
@@ -374,8 +374,8 @@ func (sp *SScalingPolicy) PerformTrigger(ctx context.Context, userCred mcclient.
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
unmanual, _ := data.Bool("unmanual")
|
||||
if !unmanual {
|
||||
manual, _ := data.Bool("manual")
|
||||
if manual {
|
||||
triggerDesc = SScalingManual{SScalingPolicyBase{sp.Id}}
|
||||
} else {
|
||||
trigger, err := sp.Trigger(nil)
|
||||
@@ -393,11 +393,11 @@ func (sp *SScalingPolicy) PerformTrigger(ctx context.Context, userCred mcclient.
|
||||
}
|
||||
triggerDesc = trigger
|
||||
}
|
||||
err = sg.Scale(ctx, triggerDesc, sp)
|
||||
isExec, err := sg.Scale(ctx, triggerDesc, sp)
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "ScalingPolicy.Scale")
|
||||
}
|
||||
if sp.CoolingTime > 0 {
|
||||
if isExec && sp.CoolingTime > 0 {
|
||||
sg.SetAllowScaleTime(time.Now().Add(time.Duration(sp.CoolingTime) * time.Second))
|
||||
}
|
||||
return nil, err
|
||||
|
||||
@@ -382,6 +382,9 @@ func (sa *SScalingAlarm) ValidateCreateData(input api.ScalingPolicyCreateInput)
|
||||
if len(input.Alarm.Operator) == 0 {
|
||||
input.Alarm.Operator = api.OPERATOR_GT
|
||||
}
|
||||
if input.Alarm.Cycle == 0 {
|
||||
input.Alarm.Cycle = 300
|
||||
}
|
||||
if !utils.IsInStringArray(input.Alarm.Operator, []string{api.OPERATOR_GT, api.OPERATOR_LT}) {
|
||||
return input, httperrors.NewInputParameterError("unkown operator in alarm %s", input.Alarm.Operator)
|
||||
}
|
||||
@@ -392,6 +395,9 @@ func (sa *SScalingAlarm) ValidateCreateData(input api.ScalingPolicyCreateInput)
|
||||
if !utils.IsInStringArray(input.Alarm.Wrapper, []string{api.WRAPPER_MIN, api.WRAPPER_MAX, api.WRAPPER_AVER}) {
|
||||
return input, httperrors.NewInputParameterError("unkown wrapper in alarm %s", input.Alarm.Wrapper)
|
||||
}
|
||||
if input.Alarm.Cycle < 300 {
|
||||
return input, httperrors.NewInputParameterError("the min value of cycle in alarm is 300")
|
||||
}
|
||||
return input, nil
|
||||
}
|
||||
|
||||
|
||||
@@ -120,7 +120,7 @@ func (self *GuestDetachScalingGroupTask) OnDeleteGuestComplete(ctx context.Conte
|
||||
logclient.AddActionLogWithStartable(self, sg, logclient.ACT_REMOVE_GUEST, fmt.Sprintf("Instance '%s' was removed", guestId), self.UserCred, true)
|
||||
if auto, _ := self.Params.Bool("auto"); !auto {
|
||||
// scale; change the desire number
|
||||
err := sg.Scale(ctx, SScalingTriggerDesc{guestName}, SScalingActionDesc{})
|
||||
_, err := sg.Scale(ctx, SScalingTriggerDesc{guestName}, SScalingActionDesc{})
|
||||
if err != nil {
|
||||
log.Errorf("ScalingGroup '%s' scale after removing instance '%s' failed: %s", sg.GetId(), guestId, err.Error())
|
||||
}
|
||||
|
||||
@@ -62,7 +62,6 @@ func (asc *SASController) Timer(ctx context.Context, userCred mcclient.TokenCred
|
||||
log.Debugf("timeScope: start: %s, end: %s", timeScope.Start, timeScope.End)
|
||||
session := auth.GetSession(ctx, userCred, "", "")
|
||||
triggerParams := jsonutils.NewDict()
|
||||
triggerParams.Set("unmanual", jsonutils.JSONTrue)
|
||||
for i := range scalingTimers {
|
||||
scalingTimer := scalingTimers[i]
|
||||
asc.timerQueue <- struct{}{}
|
||||
|
||||
@@ -119,8 +119,12 @@ func (c *QueryCondition) Eval(context *alerting.EvalContext) (*alerting.Conditio
|
||||
evalMatchCount++
|
||||
}
|
||||
tags := c.filterTags(series.Tags)
|
||||
var meta *tsdb.QueryResultMeta
|
||||
if len(metas) > idx {
|
||||
meta = &metas[idx]
|
||||
}
|
||||
matches = append(matches, &monitor.EvalMatch{
|
||||
Condition: c.GenerateFormatCond(&metas[idx]).String(),
|
||||
Condition: c.GenerateFormatCond(meta).String(),
|
||||
Metric: series.Name,
|
||||
Value: reducedValue,
|
||||
Tags: tags,
|
||||
|
||||
Reference in New Issue
Block a user