experiments/client_traffic_ctrl_tasks.go (202 lines of code) (raw):

package experiments import ( "fmt" "github.com/aliyun/aliyun-pairec-config-go-sdk/v2/api" "github.com/aliyun/aliyun-pairec-config-go-sdk/v2/common" "github.com/aliyun/aliyun-pairec-config-go-sdk/v2/model" "github.com/antihax/optional" "strconv" "time" ) func (e *ExperimentClient) LoadSceneTrafficControlTasksData() { //Load traffic control data for the production environment prodSceneTrafficControlTasksData := make(map[string][]model.TrafficControlTask, 0) prodOpt := &api.TrafficControlApiListTrafficControlTasksOpts{ ALL: optional.NewBool(true), ControlTargetFilter: optional.NewString("Valid"), Env: optional.NewString("product"), Status: optional.NewString("Running"), Version: optional.NewString("Released"), } prodResponse, err := e.APIClient.TrafficControlApi.ListTrafficControlTasks(prodOpt) if err != nil { e.logError(fmt.Errorf("list flow tasks error, err=%v", err)) return } for _, task := range prodResponse.TrafficControlTasks { prodSceneTrafficControlTasksData[task.SceneName] = append(prodSceneTrafficControlTasksData[task.SceneName], task) } if len(prodSceneTrafficControlTasksData) > 0 { e.productSceneTrafficControlTaskData = prodSceneTrafficControlTasksData } //Load traffic control data for the pre-load environment prepubSceneTrafficControlTasksData := make(map[string][]model.TrafficControlTask, 0) prePubOpt := &api.TrafficControlApiListTrafficControlTasksOpts{ ALL: optional.NewBool(true), ControlTargetFilter: optional.NewString("Valid"), Env: optional.NewString("prepub"), Status: optional.NewString("Running"), Version: optional.NewString("Released"), } prePubResponse, _ := e.APIClient.TrafficControlApi.ListTrafficControlTasks(prePubOpt) if err != nil { e.logError(fmt.Errorf("list flow tasks error,error=%v", err)) return } for _, task := range prePubResponse.TrafficControlTasks { prepubSceneTrafficControlTasksData[task.SceneName] = append(prepubSceneTrafficControlTasksData[task.SceneName], task) } if len(prepubSceneTrafficControlTasksData) > 0 { e.prepubSceneTrafficControlTaskData = prepubSceneTrafficControlTasksData } } // loopLoadSceneFlowCtrlPlansData async loop invoke LoadSceneFlowCtrlPlansData function func (e *ExperimentClient) loopLoadSceneFlowCtrlPlansData() { for { time.Sleep(time.Second * 30) e.LoadSceneTrafficControlTasksData() } } func (e *ExperimentClient) SetTrafficControlTraffic(trafficData model.TrafficControlTaskTrafficData) (string, error) { response, err := e.APIClient.TrafficControlApi.SetTrafficControlTrafficFData(trafficData) return response, err } func (e *ExperimentClient) GetTrafficControlTargetData(env, sceneName string, currentTimestamp int64) map[string]model.TrafficControlTarget { if currentTimestamp == 0 { currentTimestamp = time.Now().Unix() } trafficControlTargets := make(map[string]model.TrafficControlTarget) var data = make(map[string][]model.TrafficControlTask, 0) if env == common.Environment_Prepub_Desc { data = e.prepubSceneTrafficControlTaskData } else if env == common.Environment_Product_Desc { data = e.productSceneTrafficControlTaskData } else { return nil } for scene, sceneTraffics := range data { if sceneName != "" && sceneName != scene { continue } for _, task := range sceneTraffics { for i, target := range task.TrafficControlTargets { if task.ExecutionTime != "Permanent" { startTime, _ := time.Parse(time.RFC3339, target.StartTime) endTime, _ := time.Parse(time.RFC3339, target.EndTime) if target.Status == common.TrafficControlTargets_Status_Open && startTime.Unix() < currentTimestamp && currentTimestamp <= endTime.Unix() { trafficControlTargets[target.TrafficControlTargetId] = task.TrafficControlTargets[i] } } else { if target.Status == common.TrafficControlTargets_Status_Open { trafficControlTargets[target.TrafficControlTargetId] = task.TrafficControlTargets[i] } } } } } return trafficControlTargets } func (e *ExperimentClient) GetTrafficControlTaskMetaData(env string, currentTimestamp int64) []model.TrafficControlTask { if currentTimestamp == 0 { currentTimestamp = time.Now().Unix() } traffics := make([]model.TrafficControlTask, 0) var data = make(map[string][]model.TrafficControlTask, 0) if env == common.Environment_Prepub_Desc { data = e.prepubSceneTrafficControlTaskData } else if env == common.Environment_Product_Desc { data = e.productSceneTrafficControlTaskData } else { return nil } for _, sceneTraffics := range data { for i, task := range sceneTraffics { if task.ExecutionTime != "Permanent" { startTime, _ := time.Parse(time.RFC3339, task.StartTime) endTime, _ := time.Parse(time.RFC3339, task.EndTime) if env == common.Environment_Product_Desc { if task.ProductStatus == common.TrafficCtrlTask_Running_Status && startTime.Unix() <= currentTimestamp && currentTimestamp < endTime.Unix() { traffics = append(traffics, sceneTraffics[i]) } } else if env == common.Environment_Prepub_Desc { if task.PrepubStatus == common.TrafficCtrlTask_Running_Status && startTime.Unix() <= currentTimestamp && currentTimestamp < endTime.Unix() { traffics = append(traffics, sceneTraffics[i]) } } } else { if env == common.Environment_Product_Desc { if task.ProductStatus == common.TrafficCtrlTask_Running_Status { traffics = append(traffics, sceneTraffics[i]) } } else if env == common.Environment_Prepub_Desc { if task.PrepubStatus == common.TrafficCtrlTask_Running_Status { traffics = append(traffics, sceneTraffics[i]) } } } } } return traffics } func (e *ExperimentClient) CheckIfTrafficControlTargetIsEnabled(env string, targetId int, currentTimestamp int64) bool { if currentTimestamp == 0 { currentTimestamp = time.Now().Unix() } var data = make(map[string][]model.TrafficControlTask, 0) if env == common.Environment_Prepub_Desc { data = e.prepubSceneTrafficControlTaskData } else if env == common.Environment_Product_Desc { data = e.productSceneTrafficControlTaskData } else { return false } for _, sceneTraffics := range data { for _, traffic := range sceneTraffics { for _, target := range traffic.TrafficControlTargets { tid, err := strconv.Atoi(target.TrafficControlTargetId) if err != nil { e.logError(fmt.Errorf("traffic control targetId is illegal")) } if tid == targetId { startTime, _ := time.Parse(time.RFC3339, target.StartTime) endTime, _ := time.Parse(time.RFC3339, target.EndTime) if target.Status == common.TrafficControlTargets_Status_Open && startTime.Unix() < currentTimestamp && currentTimestamp < endTime.Unix() { return true } } } } } return false } type TrafficControlTargetTraffic struct { ItemOrExpId string `json:"item_or_exp_id"` TrafficControlTaskId string `json:"traffic_control_task_id"` TrafficControlTargetId string `json:"traffic_control_target_id"` TargetTraffic float64 `json:"target_traffic"` TaskTraffic float64 `json:"task_traffic"` RecordTime time.Time `json:"record_time"` } func (e *ExperimentClient) GetTrafficControlTargetTraffic(env, sceneName string, idList ...string) []TrafficControlTargetTraffic { targets := e.GetTrafficControlTargetData(env, sceneName, 0) var traffics []TrafficControlTargetTraffic idMap := make(map[string]bool) for _, id := range idList { if id == "" { continue } idMap[id] = true } for _, trafficTarget := range targets { for id, value := range trafficTarget.TargetTraffics { if len(idList) == 0 || idMap[id] { traffics = append(traffics, TrafficControlTargetTraffic{ ItemOrExpId: id, TrafficControlTaskId: trafficTarget.TrafficControlTaskId, TrafficControlTargetId: trafficTarget.TrafficControlTargetId, TargetTraffic: value, TaskTraffic: trafficTarget.TaskTraffics[id], RecordTime: trafficTarget.RecordTime, }) } } } return traffics }