blob: 5b5b696a1cc489871537ed83e3f304b1420fb510 [file] [log] [blame]
/*
// Copyright (c) 2018 Intel Corporation
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
*/
#include "http_response.hpp"
#include <boost/beast/http/status.hpp>
#include <error_messages.hpp>
#include <logging.hpp>
#include <nlohmann/json.hpp>
namespace redfish
{
namespace messages
{
static void addMessageToErrorJson(nlohmann::json& target,
const nlohmann::json& message)
{
auto& error = target["error"];
// If this is the first error message, fill in the information from the
// first error message to the top level struct
if (!error.is_object())
{
auto messageIdIterator = message.find("MessageId");
if (messageIdIterator == message.end())
{
BMCWEB_LOG_CRITICAL
<< "Attempt to add error message without MessageId";
return;
}
auto messageFieldIterator = message.find("Message");
if (messageFieldIterator == message.end())
{
BMCWEB_LOG_CRITICAL
<< "Attempt to add error message without Message";
return;
}
error = {{"code", *messageIdIterator},
{"message", *messageFieldIterator}};
}
else
{
// More than 1 error occurred, so the message has to be generic
error["code"] = std::string(messageVersionPrefix) + "GeneralError";
error["message"] = "A general error has occurred. See Resolution for "
"information on how to resolve the error.";
}
// This check could technically be done in in the default construction
// branch above, but because we need the pointer to the extended info field
// anyway, it's more efficient to do it here.
auto& extendedInfo = error[messages::messageAnnotation];
if (!extendedInfo.is_array())
{
extendedInfo = nlohmann::json::array();
}
extendedInfo.push_back(message);
}
static void addMessageToJsonRoot(nlohmann::json& target,
const nlohmann::json& message)
{
if (!target[messages::messageAnnotation].is_array())
{
// Force object to be an array
target[messages::messageAnnotation] = nlohmann::json::array();
}
target[messages::messageAnnotation].push_back(message);
}
static void addMessageToJson(nlohmann::json& target,
const nlohmann::json& message,
const std::string& fieldPath)
{
std::string extendedInfo(fieldPath + messages::messageAnnotation);
if (!target[extendedInfo].is_array())
{
// Force object to be an array
target[extendedInfo] = nlohmann::json::array();
}
// Object exists and it is an array so we can just push in the message
target[extendedInfo].push_back(message);
}
/**
* @internal
* @brief Formats ResourceInUse message into JSON
*
* See header file for more information
* @endinternal
*/
nlohmann::json resourceInUse(void)
{
return nlohmann::json{
{"@odata.type", "#Message.v1_1_1.Message"},
{"MessageId", "Base.1.8.1.ResourceInUse"},
{"Message", "The change to the requested resource failed because "
"the resource is in use or in transition."},
{"MessageArgs", nlohmann::json::array()},
{"MessageSeverity", "Warning"},
{"Resolution", "Remove the condition and resubmit the request if "
"the operation failed."}};
}
void resourceInUse(crow::Response& res)
{
res.result(boost::beast::http::status::service_unavailable);
addMessageToErrorJson(res.jsonValue, resourceInUse());
}
/**
* @internal
* @brief Formats MalformedJSON message into JSON
*
* See header file for more information
* @endinternal
*/
nlohmann::json malformedJSON(void)
{
return nlohmann::json{
{"@odata.type", "#Message.v1_1_1.Message"},
{"MessageId", "Base.1.8.1.MalformedJSON"},
{"Message", "The request body submitted was malformed JSON and "
"could not be parsed by the receiving service."},
{"MessageArgs", nlohmann::json::array()},
{"MessageSeverity", "Critical"},
{"Resolution", "Ensure that the request body is valid JSON and "
"resubmit the request."}};
}
void malformedJSON(crow::Response& res)
{
res.result(boost::beast::http::status::bad_request);
addMessageToErrorJson(res.jsonValue, malformedJSON());
}
/**
* @internal
* @brief Formats ResourceMissingAtURI message into JSON
*
* See header file for more information
* @endinternal
*/
nlohmann::json resourceMissingAtURI(const std::string& arg1)
{
return nlohmann::json{
{"@odata.type", "#Message.v1_1_1.Message"},
{"MessageId", "Base.1.8.1.ResourceMissingAtURI"},
{"Message", "The resource at the URI " + arg1 + " was not found."},
{"MessageArgs", {arg1}},
{"MessageSeverity", "Critical"},
{"Resolution", "Place a valid resource at the URI or correct the "
"URI and resubmit the request."}};
}
void resourceMissingAtURI(crow::Response& res, const std::string& arg1)
{
res.result(boost::beast::http::status::bad_request);
addMessageToErrorJson(res.jsonValue, resourceMissingAtURI(arg1));
}
/**
* @internal
* @brief Formats ActionParameterValueFormatError message into JSON
*
* See header file for more information
* @endinternal
*/
nlohmann::json actionParameterValueFormatError(const std::string& arg1,
const std::string& arg2,
const std::string& arg3)
{
return nlohmann::json{
{"@odata.type", "#Message.v1_1_1.Message"},
{"MessageId", "Base.1.8.1.ActionParameterValueFormatError"},
{"Message",
"The value " + arg1 + " for the parameter " + arg2 +
" in the action " + arg3 +
" is of a different format than the parameter can accept."},
{"MessageArgs", {arg1, arg2, arg3}},
{"MessageSeverity", "Warning"},
{"Resolution",
"Correct the value for the parameter in the request body and "
"resubmit the request if the operation failed."}};
}
void actionParameterValueFormatError(crow::Response& res,
const std::string& arg1,
const std::string& arg2,
const std::string& arg3)
{
res.result(boost::beast::http::status::bad_request);
addMessageToErrorJson(res.jsonValue,
actionParameterValueFormatError(arg1, arg2, arg3));
}
/**
* @internal
* @brief Formats InternalError message into JSON
*
* See header file for more information
* @endinternal
*/
nlohmann::json internalError(void)
{
return nlohmann::json{
{"@odata.type", "#Message.v1_1_1.Message"},
{"MessageId", "Base.1.8.1.InternalError"},
{"Message", "The request failed due to an internal service error. "
"The service is still operational."},
{"MessageArgs", nlohmann::json::array()},
{"MessageSeverity", "Critical"},
{"Resolution", "Resubmit the request. If the problem persists, "
"consider resetting the service."}};
}
void internalError(crow::Response& res, const bmcweb::source_location location)
{
BMCWEB_LOG_CRITICAL << "Internal Error " << location.file_name() << "("
<< location.line() << ":" << location.column() << ") `"
<< location.function_name() << "`: ";
res.result(boost::beast::http::status::internal_server_error);
addMessageToErrorJson(res.jsonValue, internalError());
}
/**
* @internal
* @brief Formats UnrecognizedRequestBody message into JSON
*
* See header file for more information
* @endinternal
*/
nlohmann::json unrecognizedRequestBody(void)
{
return nlohmann::json{
{"@odata.type", "#Message.v1_1_1.Message"},
{"MessageId", "Base.1.8.1.UnrecognizedRequestBody"},
{"Message", "The service detected a malformed request body that it "
"was unable to interpret."},
{"MessageArgs", nlohmann::json::array()},
{"MessageSeverity", "Warning"},
{"Resolution", "Correct the request body and resubmit the request "
"if it failed."}};
}
void unrecognizedRequestBody(crow::Response& res)
{
res.result(boost::beast::http::status::bad_request);
addMessageToErrorJson(res.jsonValue, unrecognizedRequestBody());
}
/**
* @internal
* @brief Formats ResourceAtUriUnauthorized message into JSON
*
* See header file for more information
* @endinternal
*/
nlohmann::json resourceAtUriUnauthorized(const std::string& arg1,
const std::string& arg2)
{
return nlohmann::json{
{"@odata.type", "#Message.v1_1_1.Message"},
{"MessageId", "Base.1.8.1.ResourceAtUriUnauthorized"},
{"Message", "While accessing the resource at " + arg1 +
", the service received an authorization error " +
arg2 + "."},
{"MessageArgs", {arg1, arg2}},
{"MessageSeverity", "Critical"},
{"Resolution", "Ensure that the appropriate access is provided for "
"the service in order for it to access the URI."}};
}
void resourceAtUriUnauthorized(crow::Response& res, const std::string& arg1,
const std::string& arg2)
{
res.result(boost::beast::http::status::unauthorized);
addMessageToErrorJson(res.jsonValue, resourceAtUriUnauthorized(arg1, arg2));
}
/**
* @internal
* @brief Formats ActionParameterUnknown message into JSON
*
* See header file for more information
* @endinternal
*/
nlohmann::json actionParameterUnknown(const std::string& arg1,
const std::string& arg2)
{
return nlohmann::json{
{"@odata.type", "#Message.v1_1_1.Message"},
{"MessageId", "Base.1.8.1.ActionParameterUnknown"},
{"Message", "The action " + arg1 +
" was submitted with the invalid parameter " + arg2 +
"."},
{"MessageArgs", {arg1, arg2}},
{"MessageSeverity", "Warning"},
{"Resolution", "Correct the invalid parameter and resubmit the "
"request if the operation failed."}};
}
void actionParameterUnknown(crow::Response& res, const std::string& arg1,
const std::string& arg2)
{
res.result(boost::beast::http::status::bad_request);
addMessageToErrorJson(res.jsonValue, actionParameterUnknown(arg1, arg2));
}
/**
* @internal
* @brief Formats ResourceCannotBeDeleted message into JSON
*
* See header file for more information
* @endinternal
*/
nlohmann::json resourceCannotBeDeleted(void)
{
return nlohmann::json{
{"@odata.type", "#Message.v1_1_1.Message"},
{"MessageId", "Base.1.8.1.ResourceCannotBeDeleted"},
{"Message", "The delete request failed because the resource "
"requested cannot be deleted."},
{"MessageArgs", nlohmann::json::array()},
{"MessageSeverity", "Critical"},
{"Resolution", "Do not attempt to delete a non-deletable resource."}};
}
void resourceCannotBeDeleted(crow::Response& res)
{
res.result(boost::beast::http::status::forbidden);
addMessageToErrorJson(res.jsonValue, resourceCannotBeDeleted());
}
/**
* @internal
* @brief Formats PropertyDuplicate message into JSON
*
* See header file for more information
* @endinternal
*/
nlohmann::json propertyDuplicate(const std::string& arg1)
{
return nlohmann::json{
{"@odata.type", "#Message.v1_1_1.Message"},
{"MessageId", "Base.1.8.1.PropertyDuplicate"},
{"Message", "The property " + arg1 + " was duplicated in the request."},
{"MessageArgs", {arg1}},
{"MessageSeverity", "Warning"},
{"Resolution",
"Remove the duplicate property from the request body and resubmit "
"the request if the operation failed."}};
}
void propertyDuplicate(crow::Response& res, const std::string& arg1)
{
res.result(boost::beast::http::status::bad_request);
addMessageToJson(res.jsonValue, propertyDuplicate(arg1), arg1);
}
/**
* @internal
* @brief Formats ServiceTemporarilyUnavailable message into JSON
*
* See header file for more information
* @endinternal
*/
nlohmann::json serviceTemporarilyUnavailable(const std::string& arg1)
{
return nlohmann::json{
{"@odata.type", "#Message.v1_1_1.Message"},
{"MessageId", "Base.1.8.1.ServiceTemporarilyUnavailable"},
{"Message", "The service is temporarily unavailable. Retry in " +
arg1 + " seconds."},
{"MessageArgs", {arg1}},
{"MessageSeverity", "Critical"},
{"Resolution", "Wait for the indicated retry duration and retry "
"the operation."}};
}
void serviceTemporarilyUnavailable(crow::Response& res, const std::string& arg1)
{
res.addHeader("Retry-After", arg1);
res.result(boost::beast::http::status::service_unavailable);
addMessageToErrorJson(res.jsonValue, serviceTemporarilyUnavailable(arg1));
}
/**
* @internal
* @brief Formats ResourceAlreadyExists message into JSON
*
* See header file for more information
* @endinternal
*/
nlohmann::json resourceAlreadyExists(const std::string& arg1,
const std::string& arg2,
const std::string& arg3)
{
return nlohmann::json{
{"@odata.type", "#Message.v1_1_1.Message"},
{"MessageId", "Base.1.8.1.ResourceAlreadyExists"},
{"Message", "The requested resource of type " + arg1 +
" with the property " + arg2 + " with the value " +
arg3 + " already exists."},
{"MessageArgs", {arg1, arg2, arg3}},
{"MessageSeverity", "Critical"},
{"Resolution", "Do not repeat the create operation as the resource "
"has already been created."}};
}
void resourceAlreadyExists(crow::Response& res, const std::string& arg1,
const std::string& arg2, const std::string& arg3)
{
res.result(boost::beast::http::status::bad_request);
addMessageToJson(res.jsonValue, resourceAlreadyExists(arg1, arg2, arg3),
arg2);
}
/**
* @internal
* @brief Formats AccountForSessionNoLongerExists message into JSON
*
* See header file for more information
* @endinternal
*/
nlohmann::json accountForSessionNoLongerExists(void)
{
return nlohmann::json{
{"@odata.type", "#Message.v1_1_1.Message"},
{"MessageId", "Base.1.8.1.AccountForSessionNoLongerExists"},
{"Message", "The account for the current session has been removed, "
"thus the current session has been removed as well."},
{"MessageArgs", nlohmann::json::array()},
{"MessageSeverity", "OK"},
{"Resolution", "Attempt to connect with a valid account."}};
}
void accountForSessionNoLongerExists(crow::Response& res)
{
res.result(boost::beast::http::status::forbidden);
addMessageToErrorJson(res.jsonValue, accountForSessionNoLongerExists());
}
/**
* @internal
* @brief Formats CreateFailedMissingReqProperties message into JSON
*
* See header file for more information
* @endinternal
*/
nlohmann::json createFailedMissingReqProperties(const std::string& arg1)
{
return nlohmann::json{
{"@odata.type", "#Message.v1_1_1.Message"},
{"MessageId", "Base.1.8.1.CreateFailedMissingReqProperties"},
{"Message",
"The create operation failed because the required property " + arg1 +
" was missing from the request."},
{"MessageArgs", {arg1}},
{"MessageSeverity", "Critical"},
{"Resolution",
"Correct the body to include the required property with a valid "
"value and resubmit the request if the operation failed."}};
}
void createFailedMissingReqProperties(crow::Response& res,
const std::string& arg1)
{
res.result(boost::beast::http::status::bad_request);
addMessageToJson(res.jsonValue, createFailedMissingReqProperties(arg1),
arg1);
}
/**
* @internal
* @brief Formats PropertyValueFormatError message into JSON for the specified
* property
*
* See header file for more information
* @endinternal
*/
nlohmann::json propertyValueFormatError(const std::string& arg1,
const std::string& arg2)
{
return nlohmann::json{
{"@odata.type", "#Message.v1_1_1.Message"},
{"MessageId", "Base.1.8.1.PropertyValueFormatError"},
{"Message",
"The value " + arg1 + " for the property " + arg2 +
" is of a different format than the property can accept."},
{"MessageArgs", {arg1, arg2}},
{"MessageSeverity", "Warning"},
{"Resolution",
"Correct the value for the property in the request body and "
"resubmit the request if the operation failed."}};
}
void propertyValueFormatError(crow::Response& res, const std::string& arg1,
const std::string& arg2)
{
res.result(boost::beast::http::status::bad_request);
addMessageToJson(res.jsonValue, propertyValueFormatError(arg1, arg2), arg2);
}
/**
* @internal
* @brief Formats PropertyValueNotInList message into JSON for the specified
* property
*
* See header file for more information
* @endinternal
*/
nlohmann::json propertyValueNotInList(const std::string& arg1,
const std::string& arg2)
{
return nlohmann::json{
{"@odata.type", "#Message.v1_1_1.Message"},
{"MessageId", "Base.1.8.1.PropertyValueNotInList"},
{"Message", "The value " + arg1 + " for the property " + arg2 +
" is not in the list of acceptable values."},
{"MessageArgs", {arg1, arg2}},
{"MessageSeverity", "Warning"},
{"Resolution", "Choose a value from the enumeration list that "
"the implementation "
"can support and resubmit the request if the "
"operation failed."}};
}
void propertyValueNotInList(crow::Response& res, const std::string& arg1,
const std::string& arg2)
{
res.result(boost::beast::http::status::bad_request);
addMessageToJson(res.jsonValue, propertyValueNotInList(arg1, arg2), arg2);
}
/**
* @internal
* @brief Formats ResourceAtUriInUnknownFormat message into JSON
*
* See header file for more information
* @endinternal
*/
nlohmann::json resourceAtUriInUnknownFormat(const std::string& arg1)
{
return nlohmann::json{
{"@odata.type", "#Message.v1_1_1.Message"},
{"MessageId", "Base.1.8.1.ResourceAtUriInUnknownFormat"},
{"Message", "The resource at " + arg1 +
" is in a format not recognized by the service."},
{"MessageArgs", {arg1}},
{"MessageSeverity", "Critical"},
{"Resolution", "Place an image or resource or file that is "
"recognized by the service at the URI."}};
}
void resourceAtUriInUnknownFormat(crow::Response& res, const std::string& arg1)
{
res.result(boost::beast::http::status::bad_request);
addMessageToErrorJson(res.jsonValue, resourceAtUriInUnknownFormat(arg1));
}
/**
* @internal
* @brief Formats ServiceDisabled message into JSON
*
* See header file for more information
* @endinternal
*/
nlohmann::json serviceDisabled(const std::string& arg1)
{
return nlohmann::json{
{"@odata.type", "#Message.v1_1_1.Message"},
{"MessageId", "Base.1.11.0.ServiceDisabled"},
{"Message", "The operation failed because the service at " + arg1 +
" is disabled and cannot accept requests."},
{"MessageArgs", {arg1}},
{"MessageSeverity", "Warning"},
{"Resolution", "Enable the service and resubmit the request if the "
"operation failed."}};
}
void serviceDisabled(crow::Response& res, const std::string& arg1)
{
res.result(boost::beast::http::status::service_unavailable);
addMessageToErrorJson(res.jsonValue, serviceDisabled(arg1));
}
/**
* @internal
* @brief Formats ServiceInUnknownState message into JSON
*
* See header file for more information
* @endinternal
*/
nlohmann::json serviceInUnknownState(void)
{
return nlohmann::json{
{"@odata.type", "#Message.v1_1_1.Message"},
{"MessageId", "Base.1.8.1.ServiceInUnknownState"},
{"Message",
"The operation failed because the service is in an unknown state "
"and can no longer take incoming requests."},
{"MessageArgs", nlohmann::json::array()},
{"MessageSeverity", "Critical"},
{"Resolution", "Restart the service and resubmit the request if "
"the operation failed."}};
}
void serviceInUnknownState(crow::Response& res)
{
res.result(boost::beast::http::status::service_unavailable);
addMessageToErrorJson(res.jsonValue, serviceInUnknownState());
}
/**
* @internal
* @brief Formats EventSubscriptionLimitExceeded message into JSON
*
* See header file for more information
* @endinternal
*/
nlohmann::json eventSubscriptionLimitExceeded(void)
{
return nlohmann::json{
{"@odata.type", "#Message.v1_1_1.Message"},
{"MessageId", "Base.1.8.1.EventSubscriptionLimitExceeded"},
{"Message",
"The event subscription failed due to the number of simultaneous "
"subscriptions exceeding the limit of the implementation."},
{"MessageArgs", nlohmann::json::array()},
{"MessageSeverity", "Critical"},
{"Resolution",
"Reduce the number of other subscriptions before trying to "
"establish the event subscription or increase the limit of "
"simultaneous subscriptions (if supported)."}};
}
void eventSubscriptionLimitExceeded(crow::Response& res)
{
res.result(boost::beast::http::status::service_unavailable);
addMessageToErrorJson(res.jsonValue, eventSubscriptionLimitExceeded());
}
/**
* @internal
* @brief Formats ActionParameterMissing message into JSON
*
* See header file for more information
* @endinternal
*/
nlohmann::json actionParameterMissing(const std::string& arg1,
const std::string& arg2)
{
return nlohmann::json{
{"@odata.type", "#Message.v1_1_1.Message"},
{"MessageId", "Base.1.8.1.ActionParameterMissing"},
{"Message", "The action " + arg1 + " requires the parameter " + arg2 +
" to be present in the request body."},
{"MessageArgs", {arg1, arg2}},
{"MessageSeverity", "Critical"},
{"Resolution",
"Supply the action with the required parameter in the request "
"body when the request is resubmitted."}};
}
void actionParameterMissing(crow::Response& res, const std::string& arg1,
const std::string& arg2)
{
res.result(boost::beast::http::status::bad_request);
addMessageToErrorJson(res.jsonValue, actionParameterMissing(arg1, arg2));
}
/**
* @internal
* @brief Formats StringValueTooLong message into JSON
*
* See header file for more information
* @endinternal
*/
nlohmann::json stringValueTooLong(const std::string& arg1, int arg2)
{
return nlohmann::json{
{"@odata.type", "#Message.v1_1_1.Message"},
{"MessageId", "Base.1.8.1.StringValueTooLong"},
{"Message", "The string " + arg1 + " exceeds the length limit " +
std::to_string(arg2) + "."},
{"MessageArgs", {arg1, std::to_string(arg2)}},
{"MessageSeverity", "Warning"},
{"Resolution",
"Resubmit the request with an appropriate string length."}};
}
void stringValueTooLong(crow::Response& res, const std::string& arg1, int arg2)
{
res.result(boost::beast::http::status::bad_request);
addMessageToErrorJson(res.jsonValue, stringValueTooLong(arg1, arg2));
}
/**
* @internal
* @brief Formats SessionTerminated message into JSON
*
* See header file for more information
* @endinternal
*/
nlohmann::json sessionTerminated(void)
{
return nlohmann::json{
{"@odata.type", "#Message.v1_1_1.Message"},
{"MessageId", "Base.1.8.1.SessionTerminated"},
{"Message", "The session was successfully terminated."},
{"MessageArgs", nlohmann::json::array()},
{"MessageSeverity", "OK"},
{"Resolution", "No resolution is required."}};
}
void sessionTerminated(crow::Response& res)
{
res.result(boost::beast::http::status::ok);
addMessageToJsonRoot(res.jsonValue, sessionTerminated());
}
/**
* @internal
* @brief Formats SubscriptionTerminated message into JSON
*
* See header file for more information
* @endinternal
*/
nlohmann::json subscriptionTerminated(void)
{
return nlohmann::json{
{"@odata.type", "#Message.v1_1_1.Message"},
{"MessageId", "Base.1.8.1.SubscriptionTerminated"},
{"Message", "The event subscription has been terminated."},
{"MessageArgs", nlohmann::json::array()},
{"MessageSeverity", "OK"},
{"Resolution", "No resolution is required."}};
}
void subscriptionTerminated(crow::Response& res)
{
res.result(boost::beast::http::status::ok);
addMessageToJsonRoot(res.jsonValue, subscriptionTerminated());
}
/**
* @internal
* @brief Formats ResourceTypeIncompatible message into JSON
*
* See header file for more information
* @endinternal
*/
nlohmann::json resourceTypeIncompatible(const std::string& arg1,
const std::string& arg2)
{
return nlohmann::json{
{"@odata.type", "#Message.v1_1_1.Message"},
{"MessageId", "Base.1.8.1.ResourceTypeIncompatible"},
{"Message", "The @odata.type of the request body " + arg1 +
" is incompatible with the @odata.type of the "
"resource which is " +
arg2 + "."},
{"MessageArgs", {arg1, arg2}},
{"MessageSeverity", "Critical"},
{"Resolution", "Resubmit the request with a payload compatible "
"with the resource's schema."}};
}
void resourceTypeIncompatible(crow::Response& res, const std::string& arg1,
const std::string& arg2)
{
res.result(boost::beast::http::status::bad_request);
addMessageToErrorJson(res.jsonValue, resourceTypeIncompatible(arg1, arg2));
}
/**
* @internal
* @brief Formats ResetRequired message into JSON
*
* See header file for more information
* @endinternal
*/
nlohmann::json resetRequired(const std::string& arg1, const std::string& arg2)
{
return nlohmann::json{
{"@odata.type", "#Message.v1_1_1.Message"},
{"MessageId", "Base.1.8.1.ResetRequired"},
{"Message", "In order to complete the operation, a component reset is "
"required with the Reset action URI '" +
arg1 + "' and ResetType '" + arg2 + "'."},
{"MessageArgs", {arg1, arg2}},
{"MessageSeverity", "Warning"},
{"Resolution",
"Perform the required Reset action on the specified component."}};
}
void resetRequired(crow::Response& res, const std::string& arg1,
const std::string& arg2)
{
res.result(boost::beast::http::status::bad_request);
addMessageToErrorJson(res.jsonValue, resetRequired(arg1, arg2));
}
/**
* @internal
* @brief Formats ChassisPowerStateOnRequired message into JSON
*
* See header file for more information
* @endinternal
*/
nlohmann::json chassisPowerStateOnRequired(const std::string& arg1)
{
return nlohmann::json{
{"@odata.type", "#Message.v1_1_1.Message"},
{"MessageId", "Base.1.8.1.ChassisPowerStateOnRequired"},
{"Message", "The Chassis with Id '" + arg1 +
"' requires to be powered on to perform this request."},
{"MessageArgs", {arg1}},
{"MessageSeverity", "Warning"},
{"Resolution",
"Power on the specified Chassis and resubmit the request."}};
}
void chassisPowerStateOnRequired(crow::Response& res, const std::string& arg1)
{
res.result(boost::beast::http::status::bad_request);
addMessageToErrorJson(res.jsonValue, chassisPowerStateOnRequired(arg1));
}
/**
* @internal
* @brief Formats ChassisPowerStateOffRequired message into JSON
*
* See header file for more information
* @endinternal
*/
nlohmann::json chassisPowerStateOffRequired(const std::string& arg1)
{
return nlohmann::json{
{"@odata.type", "#Message.v1_1_1.Message"},
{"MessageId", "Base.1.8.1.ChassisPowerStateOffRequired"},
{"Message",
"The Chassis with Id '" + arg1 +
"' requires to be powered off to perform this request."},
{"MessageArgs", {arg1}},
{"MessageSeverity", "Warning"},
{"Resolution",
"Power off the specified Chassis and resubmit the request."}};
}
void chassisPowerStateOffRequired(crow::Response& res, const std::string& arg1)
{
res.result(boost::beast::http::status::bad_request);
addMessageToErrorJson(res.jsonValue, chassisPowerStateOffRequired(arg1));
}
/**
* @internal
* @brief Formats PropertyValueConflict message into JSON
*
* See header file for more information
* @endinternal
*/
nlohmann::json propertyValueConflict(const std::string& arg1,
const std::string& arg2)
{
return nlohmann::json{
{"@odata.type", "#Message.v1_1_1.Message"},
{"MessageId", "Base.1.8.1.PropertyValueConflict"},
{"Message", "The property '" + arg1 +
"' could not be written because its value would "
"conflict with the value of the '" +
arg2 + "' property."},
{"MessageArgs", {arg1, arg2}},
{"MessageSeverity", "Warning"},
{"Resolution", "No resolution is required."}};
}
void propertyValueConflict(crow::Response& res, const std::string& arg1,
const std::string& arg2)
{
res.result(boost::beast::http::status::bad_request);
addMessageToErrorJson(res.jsonValue, propertyValueConflict(arg1, arg2));
}
/**
* @internal
* @brief Formats PropertyValueIncorrect message into JSON
*
* See header file for more information
* @endinternal
*/
nlohmann::json propertyValueIncorrect(const std::string& arg1,
const std::string& arg2)
{
return nlohmann::json{
{"@odata.type", "#Message.v1_1_1.Message"},
{"MessageId", "Base.1.8.1.PropertyValueIncorrect"},
{"Message", "The property '" + arg1 +
"' with the requested value of '" + arg2 +
"' could not be written because the value does not "
"meet the constraints of the implementation."},
{"MessageArgs", {arg1, arg2}},
{"MessageSeverity", "Warning"},
{"Resolution", "No resolution is required."}};
}
void propertyValueIncorrect(crow::Response& res, const std::string& arg1,
const std::string& arg2)
{
res.result(boost::beast::http::status::bad_request);
addMessageToErrorJson(res.jsonValue, propertyValueIncorrect(arg1, arg2));
}
/**
* @internal
* @brief Formats ResourceCreationConflict message into JSON
*
* See header file for more information
* @endinternal
*/
nlohmann::json resourceCreationConflict(const std::string& arg1)
{
return nlohmann::json{
{"@odata.type", "#Message.v1_1_1.Message"},
{"MessageId", "Base.1.8.1.ResourceCreationConflict"},
{"Message", "The resource could not be created. The service has a "
"resource at URI '" +
arg1 + "' that conflicts with the creation request."},
{"MessageArgs", {arg1}},
{"MessageSeverity", "Warning"},
{"Resolution", "No resolution is required."}};
}
void resourceCreationConflict(crow::Response& res, const std::string& arg1)
{
res.result(boost::beast::http::status::bad_request);
addMessageToErrorJson(res.jsonValue, resourceCreationConflict(arg1));
}
/**
* @internal
* @brief Formats MaximumErrorsExceeded message into JSON
*
* See header file for more information
* @endinternal
*/
nlohmann::json maximumErrorsExceeded(void)
{
return nlohmann::json{
{"@odata.type", "#Message.v1_1_1.Message"},
{"MessageId", "Base.1.8.1.MaximumErrorsExceeded"},
{"Message", "Too many errors have occurred to report them all."},
{"MessageArgs", nlohmann::json::array()},
{"MessageSeverity", "Critical"},
{"Resolution",
"Resolve other reported errors and retry the current operation."}};
}
void maximumErrorsExceeded(crow::Response& res)
{
res.result(boost::beast::http::status::internal_server_error);
addMessageToErrorJson(res.jsonValue, maximumErrorsExceeded());
}
/**
* @internal
* @brief Formats PreconditionFailed message into JSON
*
* See header file for more information
* @endinternal
*/
nlohmann::json preconditionFailed(void)
{
return nlohmann::json{
{"@odata.type", "#Message.v1_1_1.Message"},
{"MessageId", "Base.1.8.1.PreconditionFailed"},
{"Message", "The ETag supplied did not match the ETag required to "
"change this resource."},
{"MessageArgs", nlohmann::json::array()},
{"MessageSeverity", "Critical"},
{"Resolution", "Try the operation again using the appropriate ETag."}};
}
void preconditionFailed(crow::Response& res)
{
res.result(boost::beast::http::status::precondition_failed);
addMessageToErrorJson(res.jsonValue, preconditionFailed());
}
/**
* @internal
* @brief Formats PreconditionRequired message into JSON
*
* See header file for more information
* @endinternal
*/
nlohmann::json preconditionRequired(void)
{
return nlohmann::json{
{"@odata.type", "#Message.v1_1_1.Message"},
{"MessageId", "Base.1.8.1.PreconditionRequired"},
{"Message", "A precondition header or annotation is required to change "
"this resource."},
{"MessageArgs", nlohmann::json::array()},
{"MessageSeverity", "Critical"},
{"Resolution", "Try the operation again using an If-Match or "
"If-None-Match header and appropriate ETag."}};
}
void preconditionRequired(crow::Response& res)
{
res.result(boost::beast::http::status::bad_request);
addMessageToErrorJson(res.jsonValue, preconditionRequired());
}
/**
* @internal
* @brief Formats OperationFailed message into JSON
*
* See header file for more information
* @endinternal
*/
nlohmann::json operationFailed(void)
{
return nlohmann::json{
{"@odata.type", "#Message.v1_1_1.Message"},
{"MessageId", "Base.1.8.1.OperationFailed"},
{"Message",
"An error occurred internal to the service as part of the overall "
"request. Partial results may have been returned."},
{"MessageArgs", nlohmann::json::array()},
{"MessageSeverity", "Warning"},
{"Resolution", "Resubmit the request. If the problem persists, "
"consider resetting the service or provider."}};
}
void operationFailed(crow::Response& res)
{
res.result(boost::beast::http::status::internal_server_error);
addMessageToErrorJson(res.jsonValue, operationFailed());
}
/**
* @internal
* @brief Formats OperationTimeout message into JSON
*
* See header file for more information
* @endinternal
*/
nlohmann::json operationTimeout(void)
{
return nlohmann::json{
{"@odata.type", "#Message.v1_1_1.Message"},
{"MessageId", "Base.1.8.1.OperationTimeout"},
{"Message", "A timeout internal to the service occured as part of the "
"request. Partial results may have been returned."},
{"MessageArgs", nlohmann::json::array()},
{"MessageSeverity", "Warning"},
{"Resolution", "Resubmit the request. If the problem persists, "
"consider resetting the service or provider."}};
}
void operationTimeout(crow::Response& res)
{
res.result(boost::beast::http::status::internal_server_error);
addMessageToErrorJson(res.jsonValue, operationTimeout());
}
/**
* @internal
* @brief Formats PropertyValueTypeError message into JSON for the specified
* property
*
* See header file for more information
* @endinternal
*/
nlohmann::json propertyValueTypeError(const std::string& arg1,
const std::string& arg2)
{
return nlohmann::json{
{"@odata.type", "#Message.v1_1_1.Message"},
{"MessageId", "Base.1.8.1.PropertyValueTypeError"},
{"Message",
"The value " + arg1 + " for the property " + arg2 +
" is of a different type than the property can accept."},
{"MessageArgs", {arg1, arg2}},
{"MessageSeverity", "Warning"},
{"Resolution",
"Correct the value for the property in the request body and "
"resubmit the request if the operation failed."}};
}
void propertyValueTypeError(crow::Response& res, const std::string& arg1,
const std::string& arg2)
{
res.result(boost::beast::http::status::bad_request);
addMessageToJson(res.jsonValue, propertyValueTypeError(arg1, arg2), arg2);
}
/**
* @internal
* @brief Formats ResourceNotFound message into JSON
*
* See header file for more information
* @endinternal
*/
nlohmann::json resourceNotFound(const std::string& arg1,
const std::string& arg2)
{
return nlohmann::json{
{"@odata.type", "#Message.v1_1_1.Message"},
{"MessageId", "Base.1.8.1.ResourceNotFound"},
{"Message", "The requested resource of type " + arg1 + " named " +
arg2 + " was not found."},
{"MessageArgs", {arg1, arg2}},
{"MessageSeverity", "Critical"},
{"Resolution",
"Provide a valid resource identifier and resubmit the request."}};
}
void resourceNotFound(crow::Response& res, const std::string& arg1,
const std::string& arg2)
{
res.result(boost::beast::http::status::not_found);
addMessageToErrorJson(res.jsonValue, resourceNotFound(arg1, arg2));
}
/**
* @internal
* @brief Formats CouldNotEstablishConnection message into JSON
*
* See header file for more information
* @endinternal
*/
nlohmann::json couldNotEstablishConnection(const std::string& arg1)
{
return nlohmann::json{
{"@odata.type", "#Message.v1_1_1.Message"},
{"MessageId", "Base.1.8.1.CouldNotEstablishConnection"},
{"Message",
"The service failed to establish a connection with the URI " + arg1 +
"."},
{"MessageArgs", {arg1}},
{"MessageSeverity", "Critical"},
{"Resolution",
"Ensure that the URI contains a valid and reachable node name, "
"protocol information and other URI components."}};
}
void couldNotEstablishConnection(crow::Response& res, const std::string& arg1)
{
res.result(boost::beast::http::status::not_found);
addMessageToErrorJson(res.jsonValue, couldNotEstablishConnection(arg1));
}
/**
* @internal
* @brief Formats PropertyNotWritable message into JSON for the specified
* property
*
* See header file for more information
* @endinternal
*/
nlohmann::json propertyNotWritable(const std::string& arg1)
{
return nlohmann::json{
{"@odata.type", "#Message.v1_1_1.Message"},
{"MessageId", "Base.1.8.1.PropertyNotWritable"},
{"Message", "The property " + arg1 +
" is a read only property and cannot be "
"assigned a value."},
{"MessageArgs", {arg1}},
{"MessageSeverity", "Warning"},
{"Resolution", "Remove the property from the request body and "
"resubmit the request if the operation failed."}};
}
void propertyNotWritable(crow::Response& res, const std::string& arg1)
{
res.result(boost::beast::http::status::forbidden);
addMessageToJson(res.jsonValue, propertyNotWritable(arg1), arg1);
}
/**
* @internal
* @brief Formats QueryParameterValueTypeError message into JSON
*
* See header file for more information
* @endinternal
*/
nlohmann::json queryParameterValueTypeError(const std::string& arg1,
const std::string& arg2)
{
return nlohmann::json{
{"@odata.type", "#Message.v1_1_1.Message"},
{"MessageId", "Base.1.8.1.QueryParameterValueTypeError"},
{"Message",
"The value " + arg1 + " for the query parameter " + arg2 +
" is of a different type than the parameter can accept."},
{"MessageArgs", {arg1, arg2}},
{"MessageSeverity", "Warning"},
{"Resolution",
"Correct the value for the query parameter in the request and "
"resubmit the request if the operation failed."}};
}
void queryParameterValueTypeError(crow::Response& res, const std::string& arg1,
const std::string& arg2)
{
res.result(boost::beast::http::status::bad_request);
addMessageToErrorJson(res.jsonValue,
queryParameterValueTypeError(arg1, arg2));
}
/**
* @internal
* @brief Formats ServiceShuttingDown message into JSON
*
* See header file for more information
* @endinternal
*/
nlohmann::json serviceShuttingDown(void)
{
return nlohmann::json{
{"@odata.type", "#Message.v1_1_1.Message"},
{"MessageId", "Base.1.8.1.ServiceShuttingDown"},
{"Message", "The operation failed because the service is shutting "
"down and can no longer take incoming requests."},
{"MessageArgs", nlohmann::json::array()},
{"MessageSeverity", "Critical"},
{"Resolution", "When the service becomes available, resubmit the "
"request if the operation failed."}};
}
void serviceShuttingDown(crow::Response& res)
{
res.result(boost::beast::http::status::service_unavailable);
addMessageToErrorJson(res.jsonValue, serviceShuttingDown());
}
/**
* @internal
* @brief Formats ActionParameterDuplicate message into JSON
*
* See header file for more information
* @endinternal
*/
nlohmann::json actionParameterDuplicate(const std::string& arg1,
const std::string& arg2)
{
return nlohmann::json{
{"@odata.type", "#Message.v1_1_1.Message"},
{"MessageId", "Base.1.8.1.ActionParameterDuplicate"},
{"Message",
"The action " + arg1 +
" was submitted with more than one value for the parameter " +
arg2 + "."},
{"MessageArgs", {arg1, arg2}},
{"MessageSeverity", "Warning"},
{"Resolution",
"Resubmit the action with only one instance of the parameter in "
"the request body if the operation failed."}};
}
void actionParameterDuplicate(crow::Response& res, const std::string& arg1,
const std::string& arg2)
{
res.result(boost::beast::http::status::bad_request);
addMessageToErrorJson(res.jsonValue, actionParameterDuplicate(arg1, arg2));
}
/**
* @internal
* @brief Formats ActionParameterNotSupported message into JSON
*
* See header file for more information
* @endinternal
*/
nlohmann::json actionParameterNotSupported(const std::string& arg1,
const std::string& arg2)
{
return nlohmann::json{
{"@odata.type", "#Message.v1_1_1.Message"},
{"MessageId", "Base.1.8.1.ActionParameterNotSupported"},
{"Message", "The parameter " + arg1 + " for the action " + arg2 +
" is not supported on the target resource."},
{"MessageArgs", {arg1, arg2}},
{"MessageSeverity", "Warning"},
{"Resolution", "Remove the parameter supplied and resubmit the "
"request if the operation failed."}};
}
void actionParameterNotSupported(crow::Response& res, const std::string& arg1,
const std::string& arg2)
{
res.result(boost::beast::http::status::bad_request);
addMessageToErrorJson(res.jsonValue,
actionParameterNotSupported(arg1, arg2));
}
/**
* @internal
* @brief Formats SourceDoesNotSupportProtocol message into JSON
*
* See header file for more information
* @endinternal
*/
nlohmann::json sourceDoesNotSupportProtocol(const std::string& arg1,
const std::string& arg2)
{
return nlohmann::json{
{"@odata.type", "#Message.v1_1_1.Message"},
{"MessageId", "Base.1.8.1.SourceDoesNotSupportProtocol"},
{"Message", "The other end of the connection at " + arg1 +
" does not support the specified protocol " + arg2 +
"."},
{"MessageArgs", {arg1, arg2}},
{"MessageSeverity", "Critical"},
{"Resolution", "Change protocols or URIs. "}};
}
void sourceDoesNotSupportProtocol(crow::Response& res, const std::string& arg1,
const std::string& arg2)
{
res.result(boost::beast::http::status::bad_request);
addMessageToErrorJson(res.jsonValue,
sourceDoesNotSupportProtocol(arg1, arg2));
}
/**
* @internal
* @brief Formats AccountRemoved message into JSON
*
* See header file for more information
* @endinternal
*/
nlohmann::json accountRemoved(void)
{
return nlohmann::json{{"@odata.type", "#Message.v1_1_1.Message"},
{"MessageId", "Base.1.8.1.AccountRemoved"},
{"Message", "The account was successfully removed."},
{"MessageArgs", nlohmann::json::array()},
{"MessageSeverity", "OK"},
{"Resolution", "No resolution is required."}};
}
void accountRemoved(crow::Response& res)
{
res.result(boost::beast::http::status::ok);
addMessageToJsonRoot(res.jsonValue, accountRemoved());
}
/**
* @internal
* @brief Formats AccessDenied message into JSON
*
* See header file for more information
* @endinternal
*/
nlohmann::json accessDenied(const std::string& arg1)
{
return nlohmann::json{
{"@odata.type", "#Message.v1_1_1.Message"},
{"MessageId", "Base.1.8.1.AccessDenied"},
{"Message", "While attempting to establish a connection to " + arg1 +
", the service denied access."},
{"MessageArgs", {arg1}},
{"MessageSeverity", "Critical"},
{"Resolution", "Attempt to ensure that the URI is correct and that "
"the service has the appropriate credentials."}};
}
void accessDenied(crow::Response& res, const std::string& arg1)
{
res.result(boost::beast::http::status::forbidden);
addMessageToErrorJson(res.jsonValue, accessDenied(arg1));
}
/**
* @internal
* @brief Formats QueryNotSupported message into JSON
*
* See header file for more information
* @endinternal
*/
nlohmann::json queryNotSupported(void)
{
return nlohmann::json{
{"@odata.type", "#Message.v1_1_1.Message"},
{"MessageId", "Base.1.8.1.QueryNotSupported"},
{"Message", "Querying is not supported by the implementation."},
{"MessageArgs", nlohmann::json::array()},
{"MessageSeverity", "Warning"},
{"Resolution", "Remove the query parameters and resubmit the "
"request if the operation failed."}};
}
void queryNotSupported(crow::Response& res)
{
res.result(boost::beast::http::status::bad_request);
addMessageToErrorJson(res.jsonValue, queryNotSupported());
}
/**
* @internal
* @brief Formats CreateLimitReachedForResource message into JSON
*
* See header file for more information
* @endinternal
*/
nlohmann::json createLimitReachedForResource(void)
{
return nlohmann::json{
{"@odata.type", "#Message.v1_1_1.Message"},
{"MessageId", "Base.1.8.1.CreateLimitReachedForResource"},
{"Message", "The create operation failed because the resource has "
"reached the limit of possible resources."},
{"MessageArgs", nlohmann::json::array()},
{"MessageSeverity", "Critical"},
{"Resolution",
"Either delete resources and resubmit the request if the "
"operation failed or do not resubmit the request."}};
}
void createLimitReachedForResource(crow::Response& res)
{
res.result(boost::beast::http::status::bad_request);
addMessageToErrorJson(res.jsonValue, createLimitReachedForResource());
}
/**
* @internal
* @brief Formats GeneralError message into JSON
*
* See header file for more information
* @endinternal
*/
nlohmann::json generalError(void)
{
return nlohmann::json{{"@odata.type", "#Message.v1_1_1.Message"},
{"MessageId", "Base.1.8.1.GeneralError"},
{"Message",
"A general error has occurred. See Resolution for "
"information on how to resolve the error."},
{"MessageArgs", nlohmann::json::array()},
{"MessageSeverity", "Critical"},
{"Resolution", "None."}};
}
void generalError(crow::Response& res)
{
res.result(boost::beast::http::status::internal_server_error);
addMessageToErrorJson(res.jsonValue, generalError());
}
/**
* @internal
* @brief Formats Success message into JSON
*
* See header file for more information
* @endinternal
*/
nlohmann::json success(void)
{
return nlohmann::json{{"@odata.type", "#Message.v1_1_1.Message"},
{"MessageId", "Base.1.8.1.Success"},
{"Message", "Successfully Completed Request"},
{"MessageArgs", nlohmann::json::array()},
{"MessageSeverity", "OK"},
{"Resolution", "None"}};
}
void success(crow::Response& res)
{
// don't set res.result here because success is the default and any
// error should overwrite the default
addMessageToJsonRoot(res.jsonValue, success());
}
/**
* @internal
* @brief Formats Created message into JSON
*
* See header file for more information
* @endinternal
*/
nlohmann::json created(void)
{
return nlohmann::json{
{"@odata.type", "#Message.v1_1_1.Message"},
{"MessageId", "Base.1.8.1.Created"},
{"Message", "The resource has been created successfully"},
{"MessageArgs", nlohmann::json::array()},
{"MessageSeverity", "OK"},
{"Resolution", "None"}};
}
void created(crow::Response& res)
{
res.result(boost::beast::http::status::created);
addMessageToJsonRoot(res.jsonValue, created());
}
/**
* @internal
* @brief Formats NoOperation message into JSON
*
* See header file for more information
* @endinternal
*/
nlohmann::json noOperation(void)
{
return nlohmann::json{
{"@odata.type", "#Message.v1_1_1.Message"},
{"MessageId", "Base.1.8.1.NoOperation"},
{"Message", "The request body submitted contain no data to act "
"upon and no changes to the resource took place."},
{"MessageArgs", nlohmann::json::array()},
{"MessageSeverity", "Warning"},
{"Resolution",
"Add properties in the JSON object and resubmit the request."}};
}
void noOperation(crow::Response& res)
{
res.result(boost::beast::http::status::bad_request);
addMessageToErrorJson(res.jsonValue, noOperation());
}
/**
* @internal
* @brief Formats PropertyUnknown message into JSON for the specified
* property
*
* See header file for more information
* @endinternal
*/
nlohmann::json propertyUnknown(const std::string& arg1)
{
return nlohmann::json{
{"@odata.type", "#Message.v1_1_1.Message"},
{"MessageId", "Base.1.8.1.PropertyUnknown"},
{"Message", "The property " + arg1 +
" is not in the list of valid properties for "
"the resource."},
{"MessageArgs", {arg1}},
{"MessageSeverity", "Warning"},
{"Resolution", "Remove the unknown property from the request "
"body and resubmit "
"the request if the operation failed."}};
}
void propertyUnknown(crow::Response& res, const std::string& arg1)
{
res.result(boost::beast::http::status::bad_request);
addMessageToJson(res.jsonValue, propertyUnknown(arg1), arg1);
}
/**
* @internal
* @brief Formats NoValidSession message into JSON
*
* See header file for more information
* @endinternal
*/
nlohmann::json noValidSession(void)
{
return nlohmann::json{
{"@odata.type", "#Message.v1_1_1.Message"},
{"MessageId", "Base.1.8.1.NoValidSession"},
{"Message",
"There is no valid session established with the implementation."},
{"MessageArgs", nlohmann::json::array()},
{"MessageSeverity", "Critical"},
{"Resolution",
"Establish a session before attempting any operations."}};
}
void noValidSession(crow::Response& res)
{
res.result(boost::beast::http::status::forbidden);
addMessageToErrorJson(res.jsonValue, noValidSession());
}
/**
* @internal
* @brief Formats InvalidObject message into JSON
*
* See header file for more information
* @endinternal
*/
nlohmann::json invalidObject(const std::string& arg1)
{
return nlohmann::json{
{"@odata.type", "#Message.v1_1_1.Message"},
{"MessageId", "Base.1.8.1.InvalidObject"},
{"Message", "The object at " + arg1 + " is invalid."},
{"MessageArgs", {arg1}},
{"MessageSeverity", "Critical"},
{"Resolution",
"Either the object is malformed or the URI is not correct. "
"Correct the condition and resubmit the request if it failed."}};
}
void invalidObject(crow::Response& res, const std::string& arg1)
{
res.result(boost::beast::http::status::bad_request);
addMessageToErrorJson(res.jsonValue, invalidObject(arg1));
}
/**
* @internal
* @brief Formats ResourceInStandby message into JSON
*
* See header file for more information
* @endinternal
*/
nlohmann::json resourceInStandby(void)
{
return nlohmann::json{
{"@odata.type", "#Message.v1_1_1.Message"},
{"MessageId", "Base.1.8.1.ResourceInStandby"},
{"Message", "The request could not be performed because the "
"resource is in standby."},
{"MessageArgs", nlohmann::json::array()},
{"MessageSeverity", "Critical"},
{"Resolution", "Ensure that the resource is in the correct power "
"state and resubmit the request."}};
}
void resourceInStandby(crow::Response& res)
{
res.result(boost::beast::http::status::service_unavailable);
addMessageToErrorJson(res.jsonValue, resourceInStandby());
}
/**
* @internal
* @brief Formats ActionParameterValueTypeError message into JSON
*
* See header file for more information
* @endinternal
*/
nlohmann::json actionParameterValueTypeError(const std::string& arg1,
const std::string& arg2,
const std::string& arg3)
{
return nlohmann::json{
{"@odata.type", "#Message.v1_1_1.Message"},
{"MessageId", "Base.1.8.1.ActionParameterValueTypeError"},
{"Message",
"The value " + arg1 + " for the parameter " + arg2 +
" in the action " + arg3 +
" is of a different type than the parameter can accept."},
{"MessageArgs", {arg1, arg2, arg3}},
{"MessageSeverity", "Warning"},
{"Resolution",
"Correct the value for the parameter in the request body and "
"resubmit the request if the operation failed."}};
}
void actionParameterValueTypeError(crow::Response& res, const std::string& arg1,
const std::string& arg2,
const std::string& arg3)
{
res.result(boost::beast::http::status::bad_request);
addMessageToErrorJson(res.jsonValue,
actionParameterValueTypeError(arg1, arg2, arg3));
}
/**
* @internal
* @brief Formats SessionLimitExceeded message into JSON
*
* See header file for more information
* @endinternal
*/
nlohmann::json sessionLimitExceeded(void)
{
return nlohmann::json{
{"@odata.type", "#Message.v1_1_1.Message"},
{"MessageId", "Base.1.8.1.SessionLimitExceeded"},
{"Message", "The session establishment failed due to the number of "
"simultaneous sessions exceeding the limit of the "
"implementation."},
{"MessageArgs", nlohmann::json::array()},
{"MessageSeverity", "Critical"},
{"Resolution", "Reduce the number of other sessions before trying "
"to establish the session or increase the limit of "
"simultaneous sessions (if supported)."}};
}
void sessionLimitExceeded(crow::Response& res)
{
res.result(boost::beast::http::status::service_unavailable);
addMessageToErrorJson(res.jsonValue, sessionLimitExceeded());
}
/**
* @internal
* @brief Formats ActionNotSupported message into JSON
*
* See header file for more information
* @endinternal
*/
nlohmann::json actionNotSupported(const std::string& arg1)
{
return nlohmann::json{
{"@odata.type", "#Message.v1_1_1.Message"},
{"MessageId", "Base.1.8.1.ActionNotSupported"},
{"Message",
"The action " + arg1 + " is not supported by the resource."},
{"MessageArgs", {arg1}},
{"MessageSeverity", "Critical"},
{"Resolution",
"The action supplied cannot be resubmitted to the implementation. "
" Perhaps the action was invalid, the wrong resource was the "
"target or the implementation documentation may be of "
"assistance."}};
}
void actionNotSupported(crow::Response& res, const std::string& arg1)
{
res.result(boost::beast::http::status::bad_request);
addMessageToErrorJson(res.jsonValue, actionNotSupported(arg1));
}
/**
* @internal
* @brief Formats InvalidIndex message into JSON
*
* See header file for more information
* @endinternal
*/
nlohmann::json invalidIndex(int64_t arg1)
{
return nlohmann::json{
{"@odata.type", "#Message.v1_1_1.Message"},
{"MessageId", "Base.1.8.1.InvalidIndex"},
{"Message", "The Index " + std::to_string(arg1) +
" is not a valid offset into the array."},
{"MessageArgs", {std::to_string(arg1)}},
{"MessageSeverity", "Warning"},
{"Resolution", "Verify the index value provided is within the "
"bounds of the array."}};
}
void invalidIndex(crow::Response& res, int64_t arg1)
{
res.result(boost::beast::http::status::bad_request);
addMessageToErrorJson(res.jsonValue, invalidIndex(arg1));
}
/**
* @internal
* @brief Formats EmptyJSON message into JSON
*
* See header file for more information
* @endinternal
*/
nlohmann::json emptyJSON(void)
{
return nlohmann::json{
{"@odata.type", "#Message.v1_1_1.Message"},
{"MessageId", "Base.1.8.1.EmptyJSON"},
{"Message", "The request body submitted contained an empty JSON "
"object and the service is unable to process it."},
{"MessageArgs", nlohmann::json::array()},
{"MessageSeverity", "Warning"},
{"Resolution",
"Add properties in the JSON object and resubmit the request."}};
}
void emptyJSON(crow::Response& res)
{
res.result(boost::beast::http::status::bad_request);
addMessageToErrorJson(res.jsonValue, emptyJSON());
}
/**
* @internal
* @brief Formats QueryNotSupportedOnResource message into JSON
*
* See header file for more information
* @endinternal
*/
nlohmann::json queryNotSupportedOnResource(void)
{
return nlohmann::json{
{"@odata.type", "#Message.v1_1_1.Message"},
{"MessageId", "Base.1.8.1.QueryNotSupportedOnResource"},
{"Message", "Querying is not supported on the requested resource."},
{"MessageArgs", nlohmann::json::array()},
{"MessageSeverity", "Warning"},
{"Resolution", "Remove the query parameters and resubmit the "
"request if the operation failed."}};
}
void queryNotSupportedOnResource(crow::Response& res)
{
res.result(boost::beast::http::status::forbidden);
addMessageToErrorJson(res.jsonValue, queryNotSupportedOnResource());
}
/**
* @internal
* @brief Formats QueryNotSupportedOnOperation message into JSON
*
* See header file for more information
* @endinternal
*/
nlohmann::json queryNotSupportedOnOperation(void)
{
return nlohmann::json{
{"@odata.type", "#Message.v1_1_1.Message"},
{"MessageId", "Base.1.8.1.QueryNotSupportedOnOperation"},
{"Message", "Querying is not supported with the requested operation."},
{"MessageArgs", nlohmann::json::array()},
{"MessageSeverity", "Warning"},
{"Resolution", "Remove the query parameters and resubmit the request "
"if the operation failed."}};
}
void queryNotSupportedOnOperation(crow::Response& res)
{
res.result(boost::beast::http::status::forbidden);
addMessageToErrorJson(res.jsonValue, queryNotSupportedOnOperation());
}
/**
* @internal
* @brief Formats QueryCombinationInvalid message into JSON
*
* See header file for more information
* @endinternal
*/
nlohmann::json queryCombinationInvalid(void)
{
return nlohmann::json{
{"@odata.type", "#Message.v1_1_1.Message"},
{"MessageId", "Base.1.8.1.QueryCombinationInvalid"},
{"Message", "Two or more query parameters in the request cannot be "
"used together."},
{"MessageArgs", nlohmann::json::array()},
{"MessageSeverity", "Warning"},
{"Resolution", "Remove one or more of the query parameters and "
"resubmit the request if the operation failed."}};
}
void queryCombinationInvalid(crow::Response& res)
{
res.result(boost::beast::http::status::bad_request);
addMessageToErrorJson(res.jsonValue, queryCombinationInvalid());
}
/**
* @internal
* @brief Formats InsufficientPrivilege message into JSON
*
* See header file for more information
* @endinternal
*/
nlohmann::json insufficientPrivilege(void)
{
return nlohmann::json{
{"@odata.type", "#Message.v1_1_1.Message"},
{"MessageId", "Base.1.8.1.InsufficientPrivilege"},
{"Message", "There are insufficient privileges for the account or "
"credentials associated with the current session to "
"perform the requested operation."},
{"MessageArgs", nlohmann::json::array()},
{"MessageSeverity", "Critical"},
{"Resolution",
"Either abandon the operation or change the associated access "
"rights and resubmit the request if the operation failed."}};
}
void insufficientPrivilege(crow::Response& res)
{
res.result(boost::beast::http::status::forbidden);
addMessageToErrorJson(res.jsonValue, insufficientPrivilege());
}
/**
* @internal
* @brief Formats PropertyValueModified message into JSON
*
* See header file for more information
* @endinternal
*/
nlohmann::json propertyValueModified(const std::string& arg1,
const std::string& arg2)
{
return nlohmann::json{
{"@odata.type", "#Message.v1_1_1.Message"},
{"MessageId", "Base.1.8.1.PropertyValueModified"},
{"Message", "The property " + arg1 + " was assigned the value " + arg2 +
" due to modification by the service."},
{"MessageArgs", {arg1, arg2}},
{"MessageSeverity", "Warning"},
{"Resolution", "No resolution is required."}};
}
void propertyValueModified(crow::Response& res, const std::string& arg1,
const std::string& arg2)
{
res.result(boost::beast::http::status::ok);
addMessageToJson(res.jsonValue, propertyValueModified(arg1, arg2), arg1);
}
/**
* @internal
* @brief Formats AccountNotModified message into JSON
*
* See header file for more information
* @endinternal
*/
nlohmann::json accountNotModified(void)
{
return nlohmann::json{
{"@odata.type", "#Message.v1_1_1.Message"},
{"MessageId", "Base.1.8.1.AccountNotModified"},
{"Message", "The account modification request failed."},
{"MessageArgs", nlohmann::json::array()},
{"MessageSeverity", "Warning"},
{"Resolution", "The modification may have failed due to permission "
"issues or issues with the request body."}};
}
void accountNotModified(crow::Response& res)
{
res.result(boost::beast::http::status::bad_request);
addMessageToErrorJson(res.jsonValue, accountNotModified());
}
/**
* @internal
* @brief Formats QueryParameterValueFormatError message into JSON
*
* See header file for more information
* @endinternal
*/
nlohmann::json queryParameterValueFormatError(const std::string& arg1,
const std::string& arg2)
{
return nlohmann::json{
{"@odata.type", "#Message.v1_1_1.Message"},
{"MessageId", "Base.1.8.1.QueryParameterValueFormatError"},
{"Message",
"The value " + arg1 + " for the parameter " + arg2 +
" is of a different format than the parameter can accept."},
{"MessageArgs", {arg1, arg2}},
{"MessageSeverity", "Warning"},
{"Resolution",
"Correct the value for the query parameter in the request and "
"resubmit the request if the operation failed."}};
}
void queryParameterValueFormatError(crow::Response& res,
const std::string& arg1,
const std::string& arg2)
{
res.result(boost::beast::http::status::bad_request);
addMessageToErrorJson(res.jsonValue,
queryParameterValueFormatError(arg1, arg2));
}
/**
* @internal
* @brief Formats PropertyMissing message into JSON for the specified
* property
*
* See header file for more information
* @endinternal
*/
nlohmann::json propertyMissing(const std::string& arg1)
{
return nlohmann::json{
{"@odata.type", "#Message.v1_1_1.Message"},
{"MessageId", "Base.1.8.1.PropertyMissing"},
{"Message", "The property " + arg1 +
" is a required property and must be included in "
"the request."},
{"MessageArgs", {arg1}},
{"MessageSeverity", "Warning"},
{"Resolution",
"Ensure that the property is in the request body and has a "
"valid "
"value and resubmit the request if the operation failed."}};
}
void propertyMissing(crow::Response& res, const std::string& arg1)
{
res.result(boost::beast::http::status::bad_request);
addMessageToJson(res.jsonValue, propertyMissing(arg1), arg1);
}
/**
* @internal
* @brief Formats ResourceExhaustion message into JSON
*
* See header file for more information
* @endinternal
*/
nlohmann::json resourceExhaustion(const std::string& arg1)
{
return nlohmann::json{
{"@odata.type", "#Message.v1_1_1.Message"},
{"MessageId", "Base.1.8.1.ResourceExhaustion"},
{"Message", "The resource " + arg1 +
" was unable to satisfy the request due to "
"unavailability of resources."},
{"MessageArgs", {arg1}},
{"MessageSeverity", "Critical"},
{"Resolution", "Ensure that the resources are available and "
"resubmit the request."}};
}
void resourceExhaustion(crow::Response& res, const std::string& arg1)
{
res.result(boost::beast::http::status::service_unavailable);
addMessageToErrorJson(res.jsonValue, resourceExhaustion(arg1));
}
/**
* @internal
* @brief Formats AccountModified message into JSON
*
* See header file for more information
* @endinternal
*/
nlohmann::json accountModified(void)
{
return nlohmann::json{{"@odata.type", "#Message.v1_1_1.Message"},
{"MessageId", "Base.1.8.1.AccountModified"},
{"Message", "The account was successfully modified."},
{"MessageArgs", nlohmann::json::array()},
{"MessageSeverity", "OK"},
{"Resolution", "No resolution is required."}};
}
void accountModified(crow::Response& res)
{
res.result(boost::beast::http::status::ok);
addMessageToErrorJson(res.jsonValue, accountModified());
}
/**
* @internal
* @brief Formats QueryParameterOutOfRange message into JSON
*
* See header file for more information
* @endinternal
*/
nlohmann::json queryParameterOutOfRange(const std::string& arg1,
const std::string& arg2,
const std::string& arg3)
{
return nlohmann::json{
{"@odata.type", "#Message.v1_1_1.Message"},
{"MessageId", "Base.1.8.1.QueryParameterOutOfRange"},
{"Message", "The value " + arg1 + " for the query parameter " + arg2 +
" is out of range " + arg3 + "."},
{"MessageArgs", {arg1, arg2, arg3}},
{"MessageSeverity", "Warning"},
{"Resolution",
"Reduce the value for the query parameter to a value that is "
"within range, such as a start or count value that is within "
"bounds of the number of resources in a collection or a page that "
"is within the range of valid pages."}};
}
void queryParameterOutOfRange(crow::Response& res, const std::string& arg1,
const std::string& arg2, const std::string& arg3)
{
res.result(boost::beast::http::status::bad_request);
addMessageToErrorJson(res.jsonValue,
queryParameterOutOfRange(arg1, arg2, arg3));
}
/**
* @internal
* @brief Formats PasswordChangeRequired message into JSON
*
* See header file for more information
* @endinternal
*/
void passwordChangeRequired(crow::Response& res, const std::string& arg1)
{
messages::addMessageToJsonRoot(
res.jsonValue,
nlohmann::json{
{"@odata.type", "/redfish/v1/$metadata#Message.v1_5_0.Message"},
{"MessageId", "Base.1.8.1.PasswordChangeRequired"},
{"Message", "The password provided for this account must be "
"changed before access is granted. PATCH the "
"'Password' property for this account located at "
"the target URI '" +
arg1 + "' to complete this process."},
{"MessageArgs", {arg1}},
{"MessageSeverity", "Critical"},
{"Resolution", "Change the password for this account using "
"a PATCH to the 'Password' property at the URI "
"provided."}});
}
void invalidUpload(crow::Response& res, const std::string& arg1,
const std::string& arg2)
{
res.result(boost::beast::http::status::bad_request);
addMessageToErrorJson(res.jsonValue, invalidUpload(arg1, arg2));
}
/**
* @internal
* @brief Formats Invalid File message into JSON
*
* See header file for more information
* @endinternal
*/
nlohmann::json invalidUpload(const std::string& arg1, const std::string& arg2)
{
return nlohmann::json{
{"@odata.type", "/redfish/v1/$metadata#Message.v1_1_1.Message"},
{"MessageId", "OpenBMC.0.2.InvalidUpload"},
{"Message", "Invalid file uploaded to " + arg1 + ": " + arg2 + "."},
{"MessageArgs", {arg1, arg2}},
{"MessageSeverity", "Warning"},
{"Resolution", "None."}};
}
} // namespace messages
} // namespace redfish