in pkg/admin/handler/instance.go [175:244]
func InstanceConfigTrafficDisablePUT(rt core_runtime.Runtime) gin.HandlerFunc {
return func(c *gin.Context) {
appName := strings.TrimSpace(c.Query("appName"))
if appName == "" {
c.JSON(http.StatusBadRequest, model.NewErrorResp("application name is empty"))
return
}
instanceIP := strings.TrimSpace(c.Query("instanceIP"))
if instanceIP == "" {
c.JSON(http.StatusBadRequest, model.NewErrorResp("instanceIP is empty"))
return
}
newDisabled, err := strconv.ParseBool(c.Query(`trafficDisable`))
if err != nil {
c.JSON(http.StatusBadRequest, model.NewErrorResp(errors.Wrap(err, "parse trafficDisable fail").Error()))
return
}
existRule := true
rawRes, err := service.GetConditionRule(rt, appName)
var res *mesh_proto.ConditionRouteV3
if err != nil {
if !core_store.IsResourceNotFound(err) {
c.JSON(http.StatusInternalServerError, model.NewErrorResp(err.Error()))
return
} else if !newDisabled { // not found && cancel traffic-disable
c.JSON(http.StatusOK, model.NewSuccessResp(nil))
return
}
existRule = false
res = generateDefaultConditionV3(true, true, true, appName, consts.ScopeApplication)
rawRes = &mesh.ConditionRouteResource{Spec: res.ToConditionRoute()}
} else if res = rawRes.Spec.ToConditionRouteV3(); res == nil {
c.JSON(http.StatusServiceUnavailable, model.NewErrorResp("this config only serve condition-route.configVersion == v3.1, got v3.0 config "))
return
}
// enable traffic
if !newDisabled {
for i, condition := range res.Conditions {
existCondition, oldDisabled := isTrafficDisabledV3(condition, instanceIP)
if existCondition {
if oldDisabled != newDisabled {
res.Conditions = append(res.Conditions[:i], res.Conditions[i+1:]...)
rawRes.Spec = res.ToConditionRoute()
if err = updateORCreateConditionRule(rt, existRule, appName, rawRes); err != nil {
c.JSON(http.StatusInternalServerError, model.NewErrorResp(err.Error()))
}
c.JSON(http.StatusOK, model.NewSuccessResp(nil))
return
}
}
}
} else { // disable traffic
// check if condition exists
for _, condition := range res.Conditions {
existCondition, oldDisabled := isTrafficDisabledV3(condition, instanceIP)
if existCondition && oldDisabled {
c.JSON(http.StatusBadRequest, model.NewErrorResp("The instance has been disabled!"))
return
}
}
res.Conditions = append(res.Conditions, disableExpression(instanceIP))
if err = updateORCreateConditionRule(rt, existRule, appName, rawRes); err != nil {
c.JSON(http.StatusInternalServerError, model.NewErrorResp(err.Error()))
}
c.JSON(http.StatusOK, model.NewSuccessResp(nil))
}
}
}