in traffic_ops/traffic_ops_golang/server/update.go [39:141]
func UpdateHandler(w http.ResponseWriter, r *http.Request) {
inf, userErr, sysErr, errCode := api.NewInfo(r, []string{"id-or-name"}, nil)
if userErr != nil || sysErr != nil {
api.HandleErr(w, r, inf.Tx.Tx, errCode, userErr, sysErr)
return
}
defer inf.Close()
idOrName := inf.Params["id-or-name"]
serverID, err := strconv.Atoi(idOrName)
hostName := ""
if err == nil {
name, ok, err := dbhelpers.GetServerNameFromID(inf.Tx.Tx, int64(serverID))
if err != nil {
api.HandleErr(w, r, inf.Tx.Tx, http.StatusInternalServerError, nil, errors.New("getting server name from id '"+idOrName+"': "+err.Error()))
return
} else if !ok {
api.HandleErr(w, r, inf.Tx.Tx, http.StatusNotFound, errors.New("server ID '"+idOrName+"' not found"), nil)
return
}
hostName = name
cdnName, err := dbhelpers.GetCDNNameFromServerID(inf.Tx.Tx, int64(serverID))
if err != nil {
api.HandleErr(w, r, inf.Tx.Tx, http.StatusInternalServerError, nil, err)
return
}
userErr, sysErr, statusCode := dbhelpers.CheckIfCurrentUserHasCdnLock(inf.Tx.Tx, string(cdnName), inf.User.UserName)
if userErr != nil || sysErr != nil {
api.HandleErr(w, r, inf.Tx.Tx, statusCode, userErr, sysErr)
return
}
} else {
hostName = idOrName
var ok bool
serverID, ok, err = dbhelpers.GetServerIDFromName(hostName, inf.Tx.Tx)
if err != nil {
api.HandleErr(w, r, inf.Tx.Tx, http.StatusInternalServerError, nil, errors.New("getting server id from name '"+idOrName+"': "+err.Error()))
return
} else if !ok {
api.HandleErr(w, r, inf.Tx.Tx, http.StatusNotFound, errors.New("server name '"+idOrName+"' not found"), nil)
return
}
cdnName, err := dbhelpers.GetCDNNameFromServerID(inf.Tx.Tx, int64(serverID))
if err != nil {
api.HandleErr(w, r, inf.Tx.Tx, http.StatusInternalServerError, nil, err)
return
}
userErr, sysErr, statusCode := dbhelpers.CheckIfCurrentUserHasCdnLock(inf.Tx.Tx, string(cdnName), inf.User.UserName)
if userErr != nil || sysErr != nil {
api.HandleErr(w, r, inf.Tx.Tx, statusCode, userErr, sysErr)
return
}
}
updated, hasUpdated := inf.Params["updated"]
revalUpdated, hasRevalUpdated := inf.Params["reval_updated"]
if !hasUpdated && !hasRevalUpdated {
api.HandleErr(w, r, inf.Tx.Tx, http.StatusBadRequest, errors.New("Must pass at least one query paramter of 'updated' or 'reval_updated'"), nil)
return
}
updated = strings.ToLower(updated)
revalUpdated = strings.ToLower(revalUpdated)
if hasUpdated && updated != `t` && updated != `true` && updated != `f` && updated != `false` {
api.HandleErr(w, r, inf.Tx.Tx, http.StatusBadRequest, errors.New("query parameter 'updated' must be 'true' or 'false'"), nil)
return
}
if hasRevalUpdated && revalUpdated != `t` && revalUpdated != `true` && revalUpdated != `f` && revalUpdated != `false` {
api.HandleErr(w, r, inf.Tx.Tx, http.StatusBadRequest, errors.New("query parameter 'reval_updated' must be 'true' or 'false'"), nil)
return
}
strToBool := func(s string) bool {
return !strings.HasPrefix(strings.ToLower(s), "f")
}
values := new(updateValues)
if hasUpdated {
updatedBool := strToBool(updated)
values.configUpdateBool = &updatedBool
}
if hasRevalUpdated {
revalUpdatedBool := strToBool(revalUpdated)
values.revalUpdateBool = &revalUpdatedBool
}
if err := setUpdateStatuses(inf.Tx.Tx, int64(serverID), *values); err != nil {
api.HandleErr(w, r, inf.Tx.Tx, http.StatusInternalServerError, nil, errors.New("setting updated statuses: "+err.Error()))
return
}
respMsg := "successfully set server '" + hostName + "'"
if hasUpdated {
respMsg += " updated=" + updated
}
if hasRevalUpdated {
respMsg += " reval_updated=" + revalUpdated
}
api.WriteAlerts(w, r, http.StatusOK, tc.CreateAlerts(tc.SuccessLevel, respMsg))
}