Merge pull request #5852 from rainzm/fix/auto_scaling4

fix(region): Fix some problem for Auto Scaling
This commit is contained in:
Zexi Li
2020-04-18 16:28:22 +08:00
committed by GitHub
6 changed files with 31 additions and 13 deletions
+15 -6
View File
@@ -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) {
+4 -4
View File
@@ -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
+6
View File
@@ -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())
}
-1
View File
@@ -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{}{}
+5 -1
View File
@@ -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,