| /* |
| Handlers and types specific to running admin tasks, including recreating page sets and |
| recreating webpage archives. |
| */ |
| |
| package admin_tasks |
| |
| import ( |
| "fmt" |
| "net/http" |
| "path/filepath" |
| "strconv" |
| "text/template" |
| |
| "github.com/gorilla/mux" |
| |
| "go.skia.org/infra/ct/go/ctfe/chromium_builds" |
| "go.skia.org/infra/ct/go/ctfe/task_common" |
| ctfeutil "go.skia.org/infra/ct/go/ctfe/util" |
| "go.skia.org/infra/ct/go/db" |
| ctutil "go.skia.org/infra/ct/go/util" |
| ) |
| |
| var ( |
| addTaskTemplate *template.Template = nil |
| recreatePageSetsRunsHistoryTemplate *template.Template = nil |
| recreateWebpageArchivesRunsHistoryTemplate *template.Template = nil |
| ) |
| |
| func ReloadTemplates(resourcesDir string) { |
| addTaskTemplate = template.Must(template.ParseFiles( |
| filepath.Join(resourcesDir, "templates/admin_tasks.html"), |
| filepath.Join(resourcesDir, "templates/header.html"), |
| filepath.Join(resourcesDir, "templates/titlebar.html"), |
| )) |
| recreatePageSetsRunsHistoryTemplate = template.Must(template.ParseFiles( |
| filepath.Join(resourcesDir, "templates/recreate_page_sets_runs_history.html"), |
| filepath.Join(resourcesDir, "templates/header.html"), |
| filepath.Join(resourcesDir, "templates/titlebar.html"), |
| )) |
| recreateWebpageArchivesRunsHistoryTemplate = template.Must(template.ParseFiles( |
| filepath.Join(resourcesDir, "templates/recreate_webpage_archives_runs_history.html"), |
| filepath.Join(resourcesDir, "templates/header.html"), |
| filepath.Join(resourcesDir, "templates/titlebar.html"), |
| )) |
| } |
| |
| type RecreatePageSetsDBTask struct { |
| task_common.CommonCols |
| |
| PageSets string `db:"page_sets"` |
| } |
| |
| func (task RecreatePageSetsDBTask) GetTaskName() string { |
| return "RecreatePageSets" |
| } |
| |
| func (dbTask RecreatePageSetsDBTask) GetPopulatedAddTaskVars() task_common.AddTaskVars { |
| taskVars := &AddRecreatePageSetsTaskVars{} |
| taskVars.Username = dbTask.Username |
| taskVars.TsAdded = ctutil.GetCurrentTs() |
| taskVars.RepeatAfterDays = strconv.FormatInt(dbTask.RepeatAfterDays, 10) |
| |
| taskVars.PageSets = dbTask.PageSets |
| return taskVars |
| } |
| |
| func (task RecreatePageSetsDBTask) GetUpdateTaskVars() task_common.UpdateTaskVars { |
| return &RecreatePageSetsUpdateVars{} |
| } |
| |
| func (task RecreatePageSetsDBTask) TableName() string { |
| return db.TABLE_RECREATE_PAGE_SETS_TASKS |
| } |
| |
| func (task RecreatePageSetsDBTask) GetResultsLink() string { |
| return "" |
| } |
| |
| func (task RecreatePageSetsDBTask) Select(query string, args ...interface{}) (interface{}, error) { |
| result := []RecreatePageSetsDBTask{} |
| err := db.DB.Select(&result, query, args...) |
| return result, err |
| } |
| |
| type RecreateWebpageArchivesDBTask struct { |
| task_common.CommonCols |
| |
| PageSets string `db:"page_sets"` |
| ChromiumRev string `db:"chromium_rev"` |
| SkiaRev string `db:"skia_rev"` |
| } |
| |
| func (task RecreateWebpageArchivesDBTask) GetTaskName() string { |
| return "RecreateWebpageArchives" |
| } |
| |
| func (task RecreateWebpageArchivesDBTask) GetResultsLink() string { |
| return "" |
| } |
| |
| func (dbTask RecreateWebpageArchivesDBTask) GetPopulatedAddTaskVars() task_common.AddTaskVars { |
| taskVars := &AddRecreateWebpageArchivesTaskVars{} |
| taskVars.Username = dbTask.Username |
| taskVars.TsAdded = ctutil.GetCurrentTs() |
| taskVars.RepeatAfterDays = strconv.FormatInt(dbTask.RepeatAfterDays, 10) |
| |
| taskVars.PageSets = dbTask.PageSets |
| taskVars.ChromiumBuild.ChromiumRev = dbTask.ChromiumRev |
| taskVars.ChromiumBuild.SkiaRev = dbTask.SkiaRev |
| return taskVars |
| } |
| |
| func (task RecreateWebpageArchivesDBTask) GetUpdateTaskVars() task_common.UpdateTaskVars { |
| return &RecreateWebpageArchivesUpdateVars{} |
| } |
| |
| func (task RecreateWebpageArchivesDBTask) TableName() string { |
| return db.TABLE_RECREATE_WEBPAGE_ARCHIVES_TASKS |
| } |
| |
| func (task RecreateWebpageArchivesDBTask) Select(query string, args ...interface{}) (interface{}, error) { |
| result := []RecreateWebpageArchivesDBTask{} |
| err := db.DB.Select(&result, query, args...) |
| return result, err |
| } |
| |
| func addTaskView(w http.ResponseWriter, r *http.Request) { |
| ctfeutil.ExecuteSimpleTemplate(addTaskTemplate, w, r) |
| } |
| |
| type AddTaskVars struct { |
| task_common.AddTaskCommonVars |
| } |
| |
| func (vars *AddTaskVars) IsAdminTask() bool { |
| return true |
| } |
| |
| // Represents the parameters sent as JSON to the add_recreate_page_sets_task handler. |
| type AddRecreatePageSetsTaskVars struct { |
| AddTaskVars |
| PageSets string `json:"page_sets"` |
| } |
| |
| func (task *AddRecreatePageSetsTaskVars) GetInsertQueryAndBinds() (string, []interface{}, error) { |
| if task.PageSets == "" { |
| return "", nil, fmt.Errorf("Invalid parameters") |
| } |
| if err := ctfeutil.CheckLengths([]ctfeutil.LengthCheck{{Name: "page_sets", Value: task.PageSets, Limit: 100}}); err != nil { |
| return "", nil, err |
| } |
| return fmt.Sprintf("INSERT INTO %s (username,page_sets,ts_added,repeat_after_days) VALUES (?,?,?,?);", |
| db.TABLE_RECREATE_PAGE_SETS_TASKS), |
| []interface{}{ |
| task.Username, |
| task.PageSets, |
| task.TsAdded, |
| task.RepeatAfterDays, |
| }, |
| nil |
| } |
| |
| func addRecreatePageSetsTaskHandler(w http.ResponseWriter, r *http.Request) { |
| task_common.AddTaskHandler(w, r, &AddRecreatePageSetsTaskVars{}) |
| } |
| |
| // Represents the parameters sent as JSON to the add_recreate_webpage_archives_task handler. |
| type AddRecreateWebpageArchivesTaskVars struct { |
| AddTaskVars |
| PageSets string `json:"page_sets"` |
| ChromiumBuild chromium_builds.DBTask `json:"chromium_build"` |
| } |
| |
| func (task *AddRecreateWebpageArchivesTaskVars) GetInsertQueryAndBinds() (string, []interface{}, error) { |
| if task.PageSets == "" || |
| task.ChromiumBuild.ChromiumRev == "" || |
| task.ChromiumBuild.SkiaRev == "" { |
| return "", nil, fmt.Errorf("Invalid parameters") |
| } |
| if err := chromium_builds.Validate(task.ChromiumBuild); err != nil { |
| return "", nil, err |
| } |
| if err := ctfeutil.CheckLengths([]ctfeutil.LengthCheck{{Name: "page_sets", Value: task.PageSets, Limit: 100}}); err != nil { |
| return "", nil, err |
| } |
| return fmt.Sprintf("INSERT INTO %s (username,page_sets,chromium_rev,skia_rev,ts_added,repeat_after_days) VALUES (?,?,?,?,?,?);", |
| db.TABLE_RECREATE_WEBPAGE_ARCHIVES_TASKS), |
| []interface{}{ |
| task.Username, |
| task.PageSets, |
| task.ChromiumBuild.ChromiumRev, |
| task.ChromiumBuild.SkiaRev, |
| task.TsAdded, |
| task.RepeatAfterDays, |
| }, |
| nil |
| } |
| |
| func addRecreateWebpageArchivesTaskHandler(w http.ResponseWriter, r *http.Request) { |
| task_common.AddTaskHandler(w, r, &AddRecreateWebpageArchivesTaskVars{}) |
| } |
| |
| type RecreatePageSetsUpdateVars struct { |
| task_common.UpdateTaskCommonVars |
| } |
| |
| func (vars *RecreatePageSetsUpdateVars) UriPath() string { |
| return ctfeutil.UPDATE_RECREATE_PAGE_SETS_TASK_POST_URI |
| } |
| |
| func (task *RecreatePageSetsUpdateVars) GetUpdateExtraClausesAndBinds() ([]string, []interface{}, error) { |
| return nil, nil, nil |
| } |
| |
| func updateRecreatePageSetsTaskHandler(w http.ResponseWriter, r *http.Request) { |
| task_common.UpdateTaskHandler(&RecreatePageSetsUpdateVars{}, db.TABLE_RECREATE_PAGE_SETS_TASKS, w, r) |
| } |
| |
| type RecreateWebpageArchivesUpdateVars struct { |
| task_common.UpdateTaskCommonVars |
| } |
| |
| func (vars *RecreateWebpageArchivesUpdateVars) UriPath() string { |
| return ctfeutil.UPDATE_RECREATE_WEBPAGE_ARCHIVES_TASK_POST_URI |
| } |
| |
| func (task *RecreateWebpageArchivesUpdateVars) GetUpdateExtraClausesAndBinds() ([]string, []interface{}, error) { |
| return nil, nil, nil |
| } |
| |
| func updateRecreateWebpageArchivesTaskHandler(w http.ResponseWriter, r *http.Request) { |
| task_common.UpdateTaskHandler(&RecreateWebpageArchivesUpdateVars{}, db.TABLE_RECREATE_WEBPAGE_ARCHIVES_TASKS, w, r) |
| } |
| |
| func deleteRecreatePageSetsTaskHandler(w http.ResponseWriter, r *http.Request) { |
| task_common.DeleteTaskHandler(&RecreatePageSetsDBTask{}, w, r) |
| } |
| |
| func deleteRecreateWebpageArchivesTaskHandler(w http.ResponseWriter, r *http.Request) { |
| task_common.DeleteTaskHandler(&RecreateWebpageArchivesDBTask{}, w, r) |
| } |
| |
| func redoRecreatePageSetsTaskHandler(w http.ResponseWriter, r *http.Request) { |
| task_common.RedoTaskHandler(&RecreatePageSetsDBTask{}, w, r) |
| } |
| |
| func redoRecreateWebpageArchivesTaskHandler(w http.ResponseWriter, r *http.Request) { |
| task_common.RedoTaskHandler(&RecreateWebpageArchivesDBTask{}, w, r) |
| } |
| |
| func recreatePageSetsRunsHistoryView(w http.ResponseWriter, r *http.Request) { |
| ctfeutil.ExecuteSimpleTemplate(recreatePageSetsRunsHistoryTemplate, w, r) |
| } |
| |
| func recreateWebpageArchivesRunsHistoryView(w http.ResponseWriter, r *http.Request) { |
| ctfeutil.ExecuteSimpleTemplate(recreateWebpageArchivesRunsHistoryTemplate, w, r) |
| } |
| |
| func getRecreatePageSetsTasksHandler(w http.ResponseWriter, r *http.Request) { |
| task_common.GetTasksHandler(&RecreatePageSetsDBTask{}, w, r) |
| } |
| |
| func getRecreateWebpageArchivesTasksHandler(w http.ResponseWriter, r *http.Request) { |
| task_common.GetTasksHandler(&RecreateWebpageArchivesDBTask{}, w, r) |
| } |
| |
| func AddHandlers(r *mux.Router) { |
| ctfeutil.AddForceLoginHandler(r, "/"+ctfeutil.ADMIN_TASK_URI, "GET", addTaskView) |
| ctfeutil.AddForceLoginHandler(r, "/"+ctfeutil.RECREATE_PAGE_SETS_RUNS_URI, "GET", recreatePageSetsRunsHistoryView) |
| ctfeutil.AddForceLoginHandler(r, "/"+ctfeutil.RECREATE_WEBPAGE_ARCHIVES_RUNS_URI, "GET", recreateWebpageArchivesRunsHistoryView) |
| |
| ctfeutil.AddForceLoginHandler(r, "/"+ctfeutil.ADD_RECREATE_PAGE_SETS_TASK_POST_URI, "POST", addRecreatePageSetsTaskHandler) |
| ctfeutil.AddForceLoginHandler(r, "/"+ctfeutil.ADD_RECREATE_WEBPAGE_ARCHIVES_TASK_POST_URI, "POST", addRecreateWebpageArchivesTaskHandler) |
| ctfeutil.AddForceLoginHandler(r, "/"+ctfeutil.GET_RECREATE_PAGE_SETS_TASKS_POST_URI, "POST", getRecreatePageSetsTasksHandler) |
| ctfeutil.AddForceLoginHandler(r, "/"+ctfeutil.GET_RECREATE_WEBPAGE_ARCHIVES_TASKS_POST_URI, "POST", getRecreateWebpageArchivesTasksHandler) |
| ctfeutil.AddForceLoginHandler(r, "/"+ctfeutil.DELETE_RECREATE_PAGE_SETS_TASK_POST_URI, "POST", deleteRecreatePageSetsTaskHandler) |
| ctfeutil.AddForceLoginHandler(r, "/"+ctfeutil.DELETE_RECREATE_WEBPAGE_ARCHIVES_TASK_POST_URI, "POST", deleteRecreateWebpageArchivesTaskHandler) |
| ctfeutil.AddForceLoginHandler(r, "/"+ctfeutil.REDO_RECREATE_PAGE_SETS_TASK_POST_URI, "POST", redoRecreatePageSetsTaskHandler) |
| ctfeutil.AddForceLoginHandler(r, "/"+ctfeutil.REDO_RECREATE_WEBPAGE_ARCHIVES_TASK_POST_URI, "POST", redoRecreateWebpageArchivesTaskHandler) |
| |
| // Do not add force login handler for update methods. They use webhooks for authentication. |
| r.HandleFunc("/"+ctfeutil.UPDATE_RECREATE_PAGE_SETS_TASK_POST_URI, updateRecreatePageSetsTaskHandler).Methods("POST") |
| r.HandleFunc("/"+ctfeutil.UPDATE_RECREATE_WEBPAGE_ARCHIVES_TASK_POST_URI, updateRecreateWebpageArchivesTaskHandler).Methods("POST") |
| } |