func (a *ABF) handleResponse(resp *http.Response, testing bool) error { defer resp.Body.Close() body, err := ioutil.ReadAll(resp.Body) if err != nil { return err } var result map[string]interface{} err = json.Unmarshal(body, &result) if err != nil { return err } var lists []interface{} err = dig.Get(&result, &lists, "build_lists") if err != nil { return err } for _, v := range lists { asserted := v.(map[string]interface{}) id := dig.Uint64(&asserted, "id") strID := "[" + to.String(id) + "]" var num int err = models.DB.Model(&models.List{}).Where("integration_name = ? AND integration_one LIKE ?", "abf", "%"+strID+"%").Count(&num).Error if err != nil && err != gorm.ErrRecordNotFound { klog.Criticalf("abf: couldn't check db for existing (list %v): %v", id, err) continue } if num != 0 { klog.Infof("abf: ignoring list, already processed (list %v)", id) continue } json, err := a.getJSONList(id) if err != nil { klog.Criticalf("abf: couldn't retrieve the build list JSON (list %v): %v", id, err) continue } // check if arch is on whitelist if abfArchWhitelistSet != nil && !abfArchWhitelistSet.Contains(dig.String(&json, "arch", "name")) { klog.Infof("abf: ignoring list, arch not on whitelist (list %v)", id) continue } // check if platform is on whitelist if !abfPlatformsSet.Contains(dig.String(&json, "save_to_repository", "platform", "name")) { klog.Infof("abf: ignoring list, platform not on whitelist (list %v)", id) continue } // *check for duplicates before continuing // *we only check for duplicates in the same platform; different platforms have different conditions // check for duplicates var duplicate models.List err = models.DB.Where("platform = ? AND integration_two = ? AND stage_current <> ?", dig.String(&json, "save_to_repository", "platform", "name"), dig.String(&json, "commit_hash"), models.ListStageFinished).First(&duplicate).Error if err != nil && err != gorm.ErrRecordNotFound { klog.Criticalf("abf: couldn't check db for duplicates (list %v): %v", id, err) continue } if err == nil { // we had no problem finding a duplicate, so handle and continue duplicate.IntegrationOne += ";" + strID duplicate.Variants += ";" + dig.String(&json, "arch", "name") if testing { // we got this from the build completed (not in testing) list // send id to testing go a.sendToTesting(id) } err = models.DB.Save(&duplicate).Error if err != nil { klog.Criticalf("abf: couldn't save duplicate modification to %v (list %v): %v", duplicate.ID, id, err) } pkgs := a.makePkgList(json) for _, listpkg := range pkgs { listpkg.ListID = duplicate.ID err = models.DB.Create(&listpkg).Error if err != nil { klog.Criticalf("abf: couldn't save new list package to %v (list %v): %v", duplicate.ID, id, err) } } // add a link to it newLink := models.ListLink{ ListID: duplicate.ID, Name: fmt.Sprintf("Build List for %v", dig.String(&json, "arch", "name")), URL: fmt.Sprintf("%s/build_lists/%v", abfURL, id), } if err := models.DB.Create(&newLink).Error; err != nil { klog.Criticalf("abf: couldn't save new list link to %v (list %v): %v", duplicate.ID, id, err) } // ok, we're done here continue } list, err := a.makeBuildList(json) if err != nil { klog.Criticalf("abf: couldn't make new list (list %v): %v\n", id, err) continue } if testing { // Now send it to testing go a.sendToTesting(id) } if err := models.DB.Create(list).Error; err != nil { klog.Criticalf("abf: couldn't create new list in db (list %v): %v", id, err) continue } } return nil }
// BuildPostHandler handles post actions that occur to the current active stage. func BuildPostHandler(ctx context.Context, rw http.ResponseWriter, r *http.Request) { // check for authentication user := models.FindUser(MustAuthenticate(r)) // setup dataRenderer := data.FromContext(ctx) // read parameters id := to.Uint64(pat.Param(ctx, "id")) target := r.FormValue("target") // either activity or process name := r.FormValue("name") // activity (ignored), process - find process action := r.FormValue("action") // activity (ignored), process passed on value := r.FormValue("value") // activity (comment), process passed on // find the build list var pkg models.List if err := models.DB.Where("id = ?", id).First(&pkg).Related(&pkg.Stages, "Stages").Error; err != nil { if err == gorm.ErrRecordNotFound { panic(ErrNotFound) } else { panic(err) } } var result interface{} // act based on target switch target { case "activity": if value == "" { panic(ErrBadRequest) } pkg.AddActivity(user, value) result = map[string]interface{}{ "success": true, } case "process": // load up the stage & process if err := models.DB.Related(&pkg.Stages, "Stages").Error; err != nil { panic(err) } var currentStage *models.ListStage for _, v := range pkg.Stages { if v.Name == pkg.StageCurrent { currentStage = &v break } } if currentStage == nil { panic(ErrNoCurrentStage) } if err := models.DB.Related(¤tStage.Processes).Error; err != nil { panic(err) } var selectedProcess *models.ListStageProcess for _, v := range currentStage.Processes { if v.Name == name { selectedProcess = &v break } } if selectedProcess == nil { panic(ErrBadRequest) } // initialise the process process, err := processes.BuildProcess(selectedProcess) if err != nil { panic(err) } r, err := process.APIRequest(user, action, value) if err != nil { result = map[string]interface{}{ "error": true, "message": err.Error(), "result": r, } } else { result = r } default: panic(ErrBadRequest) } dataRenderer.Type = data.DataJSON dataRenderer.Data = result //http.Redirect(rw, r, r.URL.String(), http.StatusTemporaryRedirect) }