in traffic_ops/traffic_ops_golang/server/update.go [152:226]
func parseQueryParams(params map[string]string, version api.Version) (*updateValues, error) {
var paramValues updateValues
// Verify query string parameters
configUpdatedBoolParam, hasConfigUpdatedBoolParam := params["updated"] // Deprecated, but still required for backwards compatibility
revalUpdatedBoolParam, hasRevalUpdatedBoolParam := params["reval_updated"] // Deprecated, but still required for backwards compatibility
configApplyTimeParam, hasConfigApplyTimeParam := params["config_apply_time"]
revalidateApplyTimeParam, hasRevalidateApplyTimeParam := params["revalidate_apply_time"]
configUpdateFailedParam, hasConfigUpdateFailedParam := params["config_update_failed"]
revalidateUpdateFailedParam, hasRevalidateUpdateFailedParam := params["revalidate_update_failed"]
isAfterApi5 := version.GreaterThanOrEqualTo(&api.Version{Major: 5})
if !(hasConfigApplyTimeParam || (hasConfigUpdateFailedParam && isAfterApi5)) && !(hasRevalidateApplyTimeParam || (hasRevalidateUpdateFailedParam && isAfterApi5)) &&
!hasConfigUpdatedBoolParam && !hasRevalUpdatedBoolParam {
return nil, errors.New("must pass at least one of the following query parameters: 'config_apply_time', 'revalidate_apply_time' ,'updated', 'reval_updated'")
}
// Prevent collision between booleans and timestamps
if (hasConfigApplyTimeParam || (hasConfigUpdateFailedParam && isAfterApi5)) && hasConfigUpdatedBoolParam {
return nil, errors.New("conflicting parameters. may not pass 'updated' along with 'config_apply_time'")
}
if (hasRevalidateApplyTimeParam || (hasConfigUpdateFailedParam && isAfterApi5)) && hasRevalUpdatedBoolParam {
return nil, errors.New("conflicting parameters. may not pass 'reval_updated' along with 'revalidate_apply_time'")
}
// Validate and parse parameters before attempting to apply them (don't want to partially apply various status before an error)
// Timestamps
if hasConfigApplyTimeParam {
configApplyTime, err := time.Parse(time.RFC3339Nano, configApplyTimeParam)
if err != nil {
return nil, errors.New("query parameter 'config_apply_time' must be valid RFC3339Nano format:" + err.Error())
}
paramValues.configApplyTime = &configApplyTime
}
if hasRevalidateApplyTimeParam {
revalApplyTime, err := time.Parse(time.RFC3339Nano, revalidateApplyTimeParam)
if err != nil {
return nil, errors.New("query parameter 'revalidate_apply_time' must be valid RFC3339Nano format:" + err.Error())
}
paramValues.revalApplyTime = &revalApplyTime
}
// Booleans
if hasConfigUpdatedBoolParam {
updatedBool, err := strconv.ParseBool(configUpdatedBoolParam)
if err != nil {
return nil, errors.New("query parameter 'updated' must be a boolean")
}
paramValues.configUpdateBool = &updatedBool
}
if hasRevalUpdatedBoolParam {
revalUpdatedBool, err := strconv.ParseBool(revalUpdatedBoolParam)
if err != nil {
return nil, errors.New("query parameter 'reval_updated' must be a boolean")
}
paramValues.revalUpdateBool = &revalUpdatedBool
}
if hasConfigUpdateFailedParam && isAfterApi5 {
configUpdateFailedBool, err := strconv.ParseBool(configUpdateFailedParam)
if err != nil {
return nil, errors.New("query parameter 'config_update_failed' must be a boolean")
}
paramValues.configUpdateFailed = &configUpdateFailedBool
}
if hasRevalidateUpdateFailedParam && isAfterApi5 {
revalUpdateFailedBool, err := strconv.ParseBool(revalidateUpdateFailedParam)
if err != nil {
return nil, errors.New("query parameter 'revalidate_update_failed' must be a boolean")
}
paramValues.revalUpdateFailed = &revalUpdateFailedBool
}
return ¶mValues, nil
}