func InstanceConfigTrafficDisablePUT()

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))
		}
	}
}