1 /*
2 // Copyright (c) 2018 Intel Corporation
3 //
4 // Licensed under the Apache License, Version 2.0 (the "License");
5 // you may not use this file except in compliance with the License.
6 // You may obtain a copy of the License at
7 //
8 //      http://www.apache.org/licenses/LICENSE-2.0
9 //
10 // Unless required by applicable law or agreed to in writing, software
11 // distributed under the License is distributed on an "AS IS" BASIS,
12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 // See the License for the specific language governing permissions and
14 // limitations under the License.
15 */
16 #include "error_messages.hpp"
17 
18 #include "http_response.hpp"
19 #include "logging.hpp"
20 #include "registries.hpp"
21 #include "registries/base_message_registry.hpp"
22 #include "source_location.hpp"
23 
24 #include <boost/beast/http/field.hpp>
25 #include <boost/beast/http/status.hpp>
26 #include <nlohmann/json.hpp>
27 
28 #include <array>
29 #include <cstddef>
30 #include <span>
31 #include <string>
32 #include <utility>
33 
34 // IWYU pragma: no_include <stddef.h>
35 
36 namespace redfish
37 {
38 
39 namespace messages
40 {
41 
42 static void addMessageToErrorJson(nlohmann::json& target,
43                                   const nlohmann::json& message)
44 {
45     auto& error = target["error"];
46 
47     // If this is the first error message, fill in the information from the
48     // first error message to the top level struct
49     if (!error.is_object())
50     {
51         auto messageIdIterator = message.find("MessageId");
52         if (messageIdIterator == message.end())
53         {
54             BMCWEB_LOG_CRITICAL
55                 << "Attempt to add error message without MessageId";
56             return;
57         }
58 
59         auto messageFieldIterator = message.find("Message");
60         if (messageFieldIterator == message.end())
61         {
62             BMCWEB_LOG_CRITICAL
63                 << "Attempt to add error message without Message";
64             return;
65         }
66         error["code"] = *messageIdIterator;
67         error["message"] = *messageFieldIterator;
68     }
69     else
70     {
71         // More than 1 error occurred, so the message has to be generic
72         error["code"] = std::string(messageVersionPrefix) + "GeneralError";
73         error["message"] = "A general error has occurred. See Resolution for "
74                            "information on how to resolve the error.";
75     }
76 
77     // This check could technically be done in the default construction
78     // branch above, but because we need the pointer to the extended info field
79     // anyway, it's more efficient to do it here.
80     auto& extendedInfo = error[messages::messageAnnotation];
81     if (!extendedInfo.is_array())
82     {
83         extendedInfo = nlohmann::json::array();
84     }
85 
86     extendedInfo.push_back(message);
87 }
88 
89 void moveErrorsToErrorJson(nlohmann::json& target, nlohmann::json& source)
90 {
91     if (!source.is_object())
92     {
93         return;
94     }
95     auto errorIt = source.find("error");
96     if (errorIt == source.end())
97     {
98         // caller puts error message in root
99         messages::addMessageToErrorJson(target, source);
100         source.clear();
101         return;
102     }
103     auto extendedInfoIt = errorIt->find(messages::messageAnnotation);
104     if (extendedInfoIt == errorIt->end())
105     {
106         return;
107     }
108     const nlohmann::json::array_t* extendedInfo =
109         (*extendedInfoIt).get_ptr<const nlohmann::json::array_t*>();
110     if (extendedInfo == nullptr)
111     {
112         source.erase(errorIt);
113         return;
114     }
115     for (const nlohmann::json& message : *extendedInfo)
116     {
117         addMessageToErrorJson(target, message);
118     }
119     source.erase(errorIt);
120 }
121 
122 static void addMessageToJsonRoot(nlohmann::json& target,
123                                  const nlohmann::json& message)
124 {
125     if (!target[messages::messageAnnotation].is_array())
126     {
127         // Force object to be an array
128         target[messages::messageAnnotation] = nlohmann::json::array();
129     }
130 
131     target[messages::messageAnnotation].push_back(message);
132 }
133 
134 static void addMessageToJson(nlohmann::json& target,
135                              const nlohmann::json& message,
136                              std::string_view fieldPath)
137 {
138     std::string extendedInfo(fieldPath);
139     extendedInfo += messages::messageAnnotation;
140 
141     nlohmann::json& field = target[extendedInfo];
142     if (!field.is_array())
143     {
144         // Force object to be an array
145         field = nlohmann::json::array();
146     }
147 
148     // Object exists and it is an array so we can just push in the message
149     field.push_back(message);
150 }
151 
152 static nlohmann::json getLog(redfish::registries::base::Index name,
153                              std::span<const std::string_view> args)
154 {
155     size_t index = static_cast<size_t>(name);
156     if (index >= redfish::registries::base::registry.size())
157     {
158         return {};
159     }
160     return getLogFromRegistry(redfish::registries::base::header,
161                               redfish::registries::base::registry, index, args);
162 }
163 
164 /**
165  * @internal
166  * @brief Formats ResourceInUse message into JSON
167  *
168  * See header file for more information
169  * @endinternal
170  */
171 nlohmann::json resourceInUse(void)
172 {
173     return getLog(redfish::registries::base::Index::resourceInUse, {});
174 }
175 
176 void resourceInUse(crow::Response& res)
177 {
178     res.result(boost::beast::http::status::service_unavailable);
179     addMessageToErrorJson(res.jsonValue, resourceInUse());
180 }
181 
182 /**
183  * @internal
184  * @brief Formats MalformedJSON message into JSON
185  *
186  * See header file for more information
187  * @endinternal
188  */
189 nlohmann::json malformedJSON(void)
190 {
191     return getLog(redfish::registries::base::Index::malformedJSON, {});
192 }
193 
194 void malformedJSON(crow::Response& res)
195 {
196     res.result(boost::beast::http::status::bad_request);
197     addMessageToErrorJson(res.jsonValue, malformedJSON());
198 }
199 
200 /**
201  * @internal
202  * @brief Formats ResourceMissingAtURI message into JSON
203  *
204  * See header file for more information
205  * @endinternal
206  */
207 nlohmann::json resourceMissingAtURI(boost::urls::url_view arg1)
208 {
209     std::array<std::string_view, 1> args{arg1.buffer()};
210     return getLog(redfish::registries::base::Index::resourceMissingAtURI, args);
211 }
212 
213 void resourceMissingAtURI(crow::Response& res, boost::urls::url_view arg1)
214 {
215     res.result(boost::beast::http::status::bad_request);
216     addMessageToErrorJson(res.jsonValue, resourceMissingAtURI(arg1));
217 }
218 
219 /**
220  * @internal
221  * @brief Formats ActionParameterValueFormatError message into JSON
222  *
223  * See header file for more information
224  * @endinternal
225  */
226 nlohmann::json actionParameterValueFormatError(std::string_view arg1,
227                                                std::string_view arg2,
228                                                std::string_view arg3)
229 {
230     return getLog(
231         redfish::registries::base::Index::actionParameterValueFormatError,
232         std::to_array({arg1, arg2, arg3}));
233 }
234 
235 void actionParameterValueFormatError(crow::Response& res, std::string_view arg1,
236                                      std::string_view arg2,
237                                      std::string_view arg3)
238 {
239     res.result(boost::beast::http::status::bad_request);
240     addMessageToErrorJson(res.jsonValue,
241                           actionParameterValueFormatError(arg1, arg2, arg3));
242 }
243 
244 /**
245  * @internal
246  * @brief Formats ActionParameterValueNotInList message into JSON
247  *
248  * See header file for more information
249  * @endinternal
250  */
251 nlohmann::json actionParameterValueNotInList(std::string_view arg1,
252                                              std::string_view arg2,
253                                              std::string_view arg3)
254 {
255     return getLog(
256         redfish::registries::base::Index::actionParameterValueNotInList,
257         std::to_array({arg1, arg2, arg3}));
258 }
259 
260 void actionParameterValueNotInList(crow::Response& res, std::string_view arg1,
261                                    std::string_view arg2, std::string_view arg3)
262 {
263     res.result(boost::beast::http::status::bad_request);
264     addMessageToErrorJson(res.jsonValue,
265                           actionParameterValueNotInList(arg1, arg2, arg3));
266 }
267 
268 /**
269  * @internal
270  * @brief Formats InternalError message into JSON
271  *
272  * See header file for more information
273  * @endinternal
274  */
275 nlohmann::json internalError(void)
276 {
277     return getLog(redfish::registries::base::Index::internalError, {});
278 }
279 
280 void internalError(crow::Response& res, const bmcweb::source_location location)
281 {
282     BMCWEB_LOG_CRITICAL << "Internal Error " << location.file_name() << "("
283                         << location.line() << ":" << location.column() << ") `"
284                         << location.function_name() << "`: ";
285     res.result(boost::beast::http::status::internal_server_error);
286     addMessageToErrorJson(res.jsonValue, internalError());
287 }
288 
289 /**
290  * @internal
291  * @brief Formats UnrecognizedRequestBody message into JSON
292  *
293  * See header file for more information
294  * @endinternal
295  */
296 nlohmann::json unrecognizedRequestBody(void)
297 {
298     return getLog(redfish::registries::base::Index::unrecognizedRequestBody,
299                   {});
300 }
301 
302 void unrecognizedRequestBody(crow::Response& res)
303 {
304     res.result(boost::beast::http::status::bad_request);
305     addMessageToErrorJson(res.jsonValue, unrecognizedRequestBody());
306 }
307 
308 /**
309  * @internal
310  * @brief Formats ResourceAtUriUnauthorized message into JSON
311  *
312  * See header file for more information
313  * @endinternal
314  */
315 nlohmann::json resourceAtUriUnauthorized(boost::urls::url_view arg1,
316                                          std::string_view arg2)
317 {
318     return getLog(redfish::registries::base::Index::resourceAtUriUnauthorized,
319                   std::to_array<std::string_view>({arg1.buffer(), arg2}));
320 }
321 
322 void resourceAtUriUnauthorized(crow::Response& res, boost::urls::url_view arg1,
323                                std::string_view arg2)
324 {
325     res.result(boost::beast::http::status::unauthorized);
326     addMessageToErrorJson(res.jsonValue, resourceAtUriUnauthorized(arg1, arg2));
327 }
328 
329 /**
330  * @internal
331  * @brief Formats ActionParameterUnknown message into JSON
332  *
333  * See header file for more information
334  * @endinternal
335  */
336 nlohmann::json actionParameterUnknown(std::string_view arg1,
337                                       std::string_view arg2)
338 {
339     return getLog(redfish::registries::base::Index::actionParameterUnknown,
340                   std::to_array({arg1, arg2}));
341 }
342 
343 void actionParameterUnknown(crow::Response& res, std::string_view arg1,
344                             std::string_view arg2)
345 {
346     res.result(boost::beast::http::status::bad_request);
347     addMessageToErrorJson(res.jsonValue, actionParameterUnknown(arg1, arg2));
348 }
349 
350 /**
351  * @internal
352  * @brief Formats ResourceCannotBeDeleted message into JSON
353  *
354  * See header file for more information
355  * @endinternal
356  */
357 nlohmann::json resourceCannotBeDeleted(void)
358 {
359     return getLog(redfish::registries::base::Index::resourceCannotBeDeleted,
360                   {});
361 }
362 
363 void resourceCannotBeDeleted(crow::Response& res)
364 {
365     res.result(boost::beast::http::status::method_not_allowed);
366     addMessageToErrorJson(res.jsonValue, resourceCannotBeDeleted());
367 }
368 
369 /**
370  * @internal
371  * @brief Formats PropertyDuplicate message into JSON
372  *
373  * See header file for more information
374  * @endinternal
375  */
376 nlohmann::json propertyDuplicate(std::string_view arg1)
377 {
378     return getLog(redfish::registries::base::Index::propertyDuplicate,
379                   std::to_array({arg1}));
380 }
381 
382 void propertyDuplicate(crow::Response& res, std::string_view arg1)
383 {
384     res.result(boost::beast::http::status::bad_request);
385     addMessageToJson(res.jsonValue, propertyDuplicate(arg1), arg1);
386 }
387 
388 /**
389  * @internal
390  * @brief Formats ServiceTemporarilyUnavailable message into JSON
391  *
392  * See header file for more information
393  * @endinternal
394  */
395 nlohmann::json serviceTemporarilyUnavailable(std::string_view arg1)
396 {
397     return getLog(
398         redfish::registries::base::Index::serviceTemporarilyUnavailable,
399         std::to_array({arg1}));
400 }
401 
402 void serviceTemporarilyUnavailable(crow::Response& res, std::string_view arg1)
403 {
404     res.addHeader(boost::beast::http::field::retry_after, arg1);
405     res.result(boost::beast::http::status::service_unavailable);
406     addMessageToErrorJson(res.jsonValue, serviceTemporarilyUnavailable(arg1));
407 }
408 
409 /**
410  * @internal
411  * @brief Formats ResourceAlreadyExists message into JSON
412  *
413  * See header file for more information
414  * @endinternal
415  */
416 nlohmann::json resourceAlreadyExists(std::string_view arg1,
417                                      std::string_view arg2,
418                                      std::string_view arg3)
419 {
420     return getLog(redfish::registries::base::Index::resourceAlreadyExists,
421                   std::to_array({arg1, arg2, arg3}));
422 }
423 
424 void resourceAlreadyExists(crow::Response& res, std::string_view arg1,
425                            std::string_view arg2, std::string_view arg3)
426 {
427     res.result(boost::beast::http::status::bad_request);
428     addMessageToJson(res.jsonValue, resourceAlreadyExists(arg1, arg2, arg3),
429                      arg2);
430 }
431 
432 /**
433  * @internal
434  * @brief Formats AccountForSessionNoLongerExists message into JSON
435  *
436  * See header file for more information
437  * @endinternal
438  */
439 nlohmann::json accountForSessionNoLongerExists(void)
440 {
441     return getLog(
442         redfish::registries::base::Index::accountForSessionNoLongerExists, {});
443 }
444 
445 void accountForSessionNoLongerExists(crow::Response& res)
446 {
447     res.result(boost::beast::http::status::forbidden);
448     addMessageToErrorJson(res.jsonValue, accountForSessionNoLongerExists());
449 }
450 
451 /**
452  * @internal
453  * @brief Formats CreateFailedMissingReqProperties message into JSON
454  *
455  * See header file for more information
456  * @endinternal
457  */
458 nlohmann::json createFailedMissingReqProperties(std::string_view arg1)
459 {
460     return getLog(
461         redfish::registries::base::Index::createFailedMissingReqProperties,
462         std::to_array({arg1}));
463 }
464 
465 void createFailedMissingReqProperties(crow::Response& res,
466                                       std::string_view arg1)
467 {
468     res.result(boost::beast::http::status::bad_request);
469     addMessageToJson(res.jsonValue, createFailedMissingReqProperties(arg1),
470                      arg1);
471 }
472 
473 /**
474  * @internal
475  * @brief Formats PropertyValueFormatError message into JSON for the specified
476  * property
477  *
478  * See header file for more information
479  * @endinternal
480  */
481 nlohmann::json propertyValueFormatError(std::string_view arg1,
482                                         std::string_view arg2)
483 {
484     return getLog(redfish::registries::base::Index::propertyValueFormatError,
485                   std::to_array({arg1, arg2}));
486 }
487 
488 void propertyValueFormatError(crow::Response& res, std::string_view arg1,
489                               std::string_view arg2)
490 {
491     res.result(boost::beast::http::status::bad_request);
492     addMessageToJson(res.jsonValue, propertyValueFormatError(arg1, arg2), arg2);
493 }
494 
495 /**
496  * @internal
497  * @brief Formats PropertyValueNotInList message into JSON for the specified
498  * property
499  *
500  * See header file for more information
501  * @endinternal
502  */
503 nlohmann::json propertyValueNotInList(std::string_view arg1,
504                                       std::string_view arg2)
505 {
506     return getLog(redfish::registries::base::Index::propertyValueNotInList,
507                   std::to_array({arg1, arg2}));
508 }
509 
510 void propertyValueNotInList(crow::Response& res, std::string_view arg1,
511                             std::string_view arg2)
512 {
513     res.result(boost::beast::http::status::bad_request);
514     addMessageToJson(res.jsonValue, propertyValueNotInList(arg1, arg2), arg2);
515 }
516 
517 /**
518  * @internal
519  * @brief Formats PropertyValueOutOfRange message into JSON
520  *
521  * See header file for more information
522  * @endinternal
523  */
524 nlohmann::json propertyValueOutOfRange(std::string_view arg1,
525                                        std::string_view arg2)
526 {
527     return getLog(redfish::registries::base::Index::propertyValueOutOfRange,
528                   std::to_array({arg1, arg2}));
529 }
530 
531 void propertyValueOutOfRange(crow::Response& res, std::string_view arg1,
532                              std::string_view arg2)
533 {
534     res.result(boost::beast::http::status::bad_request);
535     addMessageToErrorJson(res.jsonValue, propertyValueOutOfRange(arg1, arg2));
536 }
537 
538 /**
539  * @internal
540  * @brief Formats ResourceAtUriInUnknownFormat message into JSON
541  *
542  * See header file for more information
543  * @endinternal
544  */
545 nlohmann::json resourceAtUriInUnknownFormat(boost::urls::url_view arg1)
546 {
547     return getLog(
548         redfish::registries::base::Index::resourceAtUriInUnknownFormat,
549         std::to_array<std::string_view>({arg1.buffer()}));
550 }
551 
552 void resourceAtUriInUnknownFormat(crow::Response& res,
553                                   boost::urls::url_view arg1)
554 {
555     res.result(boost::beast::http::status::bad_request);
556     addMessageToErrorJson(res.jsonValue, resourceAtUriInUnknownFormat(arg1));
557 }
558 
559 /**
560  * @internal
561  * @brief Formats ServiceDisabled message into JSON
562  *
563  * See header file for more information
564  * @endinternal
565  */
566 nlohmann::json serviceDisabled(std::string_view arg1)
567 {
568     return getLog(redfish::registries::base::Index::serviceDisabled,
569                   std::to_array({arg1}));
570 }
571 
572 void serviceDisabled(crow::Response& res, std::string_view arg1)
573 {
574     res.result(boost::beast::http::status::service_unavailable);
575     addMessageToErrorJson(res.jsonValue, serviceDisabled(arg1));
576 }
577 
578 /**
579  * @internal
580  * @brief Formats ServiceInUnknownState message into JSON
581  *
582  * See header file for more information
583  * @endinternal
584  */
585 nlohmann::json serviceInUnknownState(void)
586 {
587     return getLog(redfish::registries::base::Index::serviceInUnknownState, {});
588 }
589 
590 void serviceInUnknownState(crow::Response& res)
591 {
592     res.result(boost::beast::http::status::service_unavailable);
593     addMessageToErrorJson(res.jsonValue, serviceInUnknownState());
594 }
595 
596 /**
597  * @internal
598  * @brief Formats EventSubscriptionLimitExceeded message into JSON
599  *
600  * See header file for more information
601  * @endinternal
602  */
603 nlohmann::json eventSubscriptionLimitExceeded(void)
604 {
605     return getLog(
606         redfish::registries::base::Index::eventSubscriptionLimitExceeded, {});
607 }
608 
609 void eventSubscriptionLimitExceeded(crow::Response& res)
610 {
611     res.result(boost::beast::http::status::service_unavailable);
612     addMessageToErrorJson(res.jsonValue, eventSubscriptionLimitExceeded());
613 }
614 
615 /**
616  * @internal
617  * @brief Formats ActionParameterMissing message into JSON
618  *
619  * See header file for more information
620  * @endinternal
621  */
622 nlohmann::json actionParameterMissing(std::string_view arg1,
623                                       std::string_view arg2)
624 {
625     return getLog(redfish::registries::base::Index::actionParameterMissing,
626                   std::to_array({arg1, arg2}));
627 }
628 
629 void actionParameterMissing(crow::Response& res, std::string_view arg1,
630                             std::string_view arg2)
631 {
632     res.result(boost::beast::http::status::bad_request);
633     addMessageToErrorJson(res.jsonValue, actionParameterMissing(arg1, arg2));
634 }
635 
636 /**
637  * @internal
638  * @brief Formats StringValueTooLong message into JSON
639  *
640  * See header file for more information
641  * @endinternal
642  */
643 nlohmann::json stringValueTooLong(std::string_view arg1, int arg2)
644 {
645     std::string arg2String = std::to_string(arg2);
646     return getLog(redfish::registries::base::Index::stringValueTooLong,
647                   std::to_array({arg1, std::string_view(arg2String)}));
648 }
649 
650 void stringValueTooLong(crow::Response& res, std::string_view arg1, int arg2)
651 {
652     res.result(boost::beast::http::status::bad_request);
653     addMessageToErrorJson(res.jsonValue, stringValueTooLong(arg1, arg2));
654 }
655 
656 /**
657  * @internal
658  * @brief Formats SessionTerminated message into JSON
659  *
660  * See header file for more information
661  * @endinternal
662  */
663 nlohmann::json sessionTerminated(void)
664 {
665     return getLog(redfish::registries::base::Index::sessionTerminated, {});
666 }
667 
668 void sessionTerminated(crow::Response& res)
669 {
670     res.result(boost::beast::http::status::ok);
671     addMessageToJsonRoot(res.jsonValue, sessionTerminated());
672 }
673 
674 /**
675  * @internal
676  * @brief Formats SubscriptionTerminated message into JSON
677  *
678  * See header file for more information
679  * @endinternal
680  */
681 nlohmann::json subscriptionTerminated(void)
682 {
683     return getLog(redfish::registries::base::Index::subscriptionTerminated, {});
684 }
685 
686 void subscriptionTerminated(crow::Response& res)
687 {
688     res.result(boost::beast::http::status::ok);
689     addMessageToJsonRoot(res.jsonValue, subscriptionTerminated());
690 }
691 
692 /**
693  * @internal
694  * @brief Formats ResourceTypeIncompatible message into JSON
695  *
696  * See header file for more information
697  * @endinternal
698  */
699 nlohmann::json resourceTypeIncompatible(std::string_view arg1,
700                                         std::string_view arg2)
701 {
702     return getLog(redfish::registries::base::Index::resourceTypeIncompatible,
703                   std::to_array({arg1, arg2}));
704 }
705 
706 void resourceTypeIncompatible(crow::Response& res, std::string_view arg1,
707                               std::string_view arg2)
708 {
709     res.result(boost::beast::http::status::bad_request);
710     addMessageToErrorJson(res.jsonValue, resourceTypeIncompatible(arg1, arg2));
711 }
712 
713 /**
714  * @internal
715  * @brief Formats ResetRequired message into JSON
716  *
717  * See header file for more information
718  * @endinternal
719  */
720 nlohmann::json resetRequired(boost::urls::url_view arg1, std::string_view arg2)
721 {
722     return getLog(redfish::registries::base::Index::resetRequired,
723                   std::to_array<std::string_view>({arg1.buffer(), arg2}));
724 }
725 
726 void resetRequired(crow::Response& res, boost::urls::url_view arg1,
727                    std::string_view arg2)
728 {
729     res.result(boost::beast::http::status::bad_request);
730     addMessageToErrorJson(res.jsonValue, resetRequired(arg1, arg2));
731 }
732 
733 /**
734  * @internal
735  * @brief Formats ChassisPowerStateOnRequired message into JSON
736  *
737  * See header file for more information
738  * @endinternal
739  */
740 nlohmann::json chassisPowerStateOnRequired(std::string_view arg1)
741 {
742     return getLog(redfish::registries::base::Index::resetRequired,
743                   std::to_array({arg1}));
744 }
745 
746 void chassisPowerStateOnRequired(crow::Response& res, std::string_view arg1)
747 {
748     res.result(boost::beast::http::status::bad_request);
749     addMessageToErrorJson(res.jsonValue, chassisPowerStateOnRequired(arg1));
750 }
751 
752 /**
753  * @internal
754  * @brief Formats ChassisPowerStateOffRequired message into JSON
755  *
756  * See header file for more information
757  * @endinternal
758  */
759 nlohmann::json chassisPowerStateOffRequired(std::string_view arg1)
760 {
761     return getLog(
762         redfish::registries::base::Index::chassisPowerStateOffRequired,
763         std::to_array({arg1}));
764 }
765 
766 void chassisPowerStateOffRequired(crow::Response& res, std::string_view arg1)
767 {
768     res.result(boost::beast::http::status::bad_request);
769     addMessageToErrorJson(res.jsonValue, chassisPowerStateOffRequired(arg1));
770 }
771 
772 /**
773  * @internal
774  * @brief Formats PropertyValueConflict message into JSON
775  *
776  * See header file for more information
777  * @endinternal
778  */
779 nlohmann::json propertyValueConflict(std::string_view arg1,
780                                      std::string_view arg2)
781 {
782     return getLog(redfish::registries::base::Index::propertyValueConflict,
783                   std::to_array({arg1, arg2}));
784 }
785 
786 void propertyValueConflict(crow::Response& res, std::string_view arg1,
787                            std::string_view arg2)
788 {
789     res.result(boost::beast::http::status::bad_request);
790     addMessageToErrorJson(res.jsonValue, propertyValueConflict(arg1, arg2));
791 }
792 
793 /**
794  * @internal
795  * @brief Formats PropertyValueResourceConflict message into JSON
796  *
797  * See header file for more information
798  * @endinternal
799  */
800 nlohmann::json propertyValueResourceConflict(std::string_view arg1,
801                                              std::string_view arg2,
802                                              boost::urls::url_view arg3)
803 {
804     return getLog(
805         redfish::registries::base::Index::propertyValueResourceConflict,
806         std::to_array<std::string_view>({arg1, arg2, arg3.buffer()}));
807 }
808 
809 void propertyValueResourceConflict(crow::Response& res, std::string_view arg1,
810                                    std::string_view arg2,
811                                    boost::urls::url_view arg3)
812 {
813     res.result(boost::beast::http::status::conflict);
814     addMessageToErrorJson(res.jsonValue,
815                           propertyValueResourceConflict(arg1, arg2, arg3));
816 }
817 
818 /**
819  * @internal
820  * @brief Formats PropertyValueExternalConflict message into JSON
821  *
822  * See header file for more information
823  * @endinternal
824  */
825 nlohmann::json propertyValueExternalConflict(std::string_view arg1,
826                                              std::string_view arg2)
827 {
828     return getLog(
829         redfish::registries::base::Index::propertyValueExternalConflict,
830         std::to_array({arg1, arg2}));
831 }
832 
833 void propertyValueExternalConflict(crow::Response& res, std::string_view arg1,
834                                    std::string_view arg2)
835 {
836     res.result(boost::beast::http::status::conflict);
837     addMessageToErrorJson(res.jsonValue,
838                           propertyValueExternalConflict(arg1, arg2));
839 }
840 
841 /**
842  * @internal
843  * @brief Formats PropertyValueIncorrect message into JSON
844  *
845  * See header file for more information
846  * @endinternal
847  */
848 nlohmann::json propertyValueIncorrect(std::string_view arg1,
849                                       std::string_view arg2)
850 {
851     return getLog(redfish::registries::base::Index::propertyValueIncorrect,
852                   std::to_array({arg1, arg2}));
853 }
854 
855 void propertyValueIncorrect(crow::Response& res, std::string_view arg1,
856                             std::string_view arg2)
857 {
858     res.result(boost::beast::http::status::bad_request);
859     addMessageToErrorJson(res.jsonValue, propertyValueIncorrect(arg1, arg2));
860 }
861 
862 /**
863  * @internal
864  * @brief Formats ResourceCreationConflict message into JSON
865  *
866  * See header file for more information
867  * @endinternal
868  */
869 nlohmann::json resourceCreationConflict(boost::urls::url_view arg1)
870 {
871     return getLog(redfish::registries::base::Index::resourceCreationConflict,
872                   std::to_array<std::string_view>({arg1.buffer()}));
873 }
874 
875 void resourceCreationConflict(crow::Response& res, boost::urls::url_view arg1)
876 {
877     res.result(boost::beast::http::status::bad_request);
878     addMessageToErrorJson(res.jsonValue, resourceCreationConflict(arg1));
879 }
880 
881 /**
882  * @internal
883  * @brief Formats MaximumErrorsExceeded message into JSON
884  *
885  * See header file for more information
886  * @endinternal
887  */
888 nlohmann::json maximumErrorsExceeded(void)
889 {
890     return getLog(redfish::registries::base::Index::maximumErrorsExceeded, {});
891 }
892 
893 void maximumErrorsExceeded(crow::Response& res)
894 {
895     res.result(boost::beast::http::status::internal_server_error);
896     addMessageToErrorJson(res.jsonValue, maximumErrorsExceeded());
897 }
898 
899 /**
900  * @internal
901  * @brief Formats PreconditionFailed message into JSON
902  *
903  * See header file for more information
904  * @endinternal
905  */
906 nlohmann::json preconditionFailed(void)
907 {
908     return getLog(redfish::registries::base::Index::preconditionFailed, {});
909 }
910 
911 void preconditionFailed(crow::Response& res)
912 {
913     res.result(boost::beast::http::status::precondition_failed);
914     addMessageToErrorJson(res.jsonValue, preconditionFailed());
915 }
916 
917 /**
918  * @internal
919  * @brief Formats PreconditionRequired message into JSON
920  *
921  * See header file for more information
922  * @endinternal
923  */
924 nlohmann::json preconditionRequired(void)
925 {
926     return getLog(redfish::registries::base::Index::preconditionRequired, {});
927 }
928 
929 void preconditionRequired(crow::Response& res)
930 {
931     res.result(boost::beast::http::status::bad_request);
932     addMessageToErrorJson(res.jsonValue, preconditionRequired());
933 }
934 
935 /**
936  * @internal
937  * @brief Formats OperationFailed message into JSON
938  *
939  * See header file for more information
940  * @endinternal
941  */
942 nlohmann::json operationFailed(void)
943 {
944     return getLog(redfish::registries::base::Index::operationFailed, {});
945 }
946 
947 void operationFailed(crow::Response& res)
948 {
949     res.result(boost::beast::http::status::bad_gateway);
950     addMessageToErrorJson(res.jsonValue, operationFailed());
951 }
952 
953 /**
954  * @internal
955  * @brief Formats OperationTimeout message into JSON
956  *
957  * See header file for more information
958  * @endinternal
959  */
960 nlohmann::json operationTimeout(void)
961 {
962     return getLog(redfish::registries::base::Index::operationTimeout, {});
963 }
964 
965 void operationTimeout(crow::Response& res)
966 {
967     res.result(boost::beast::http::status::internal_server_error);
968     addMessageToErrorJson(res.jsonValue, operationTimeout());
969 }
970 
971 /**
972  * @internal
973  * @brief Formats PropertyValueTypeError message into JSON for the specified
974  * property
975  *
976  * See header file for more information
977  * @endinternal
978  */
979 nlohmann::json propertyValueTypeError(std::string_view arg1,
980                                       std::string_view arg2)
981 {
982     return getLog(redfish::registries::base::Index::propertyValueTypeError,
983                   std::to_array({arg1, arg2}));
984 }
985 
986 void propertyValueTypeError(crow::Response& res, std::string_view arg1,
987                             std::string_view arg2)
988 {
989     res.result(boost::beast::http::status::bad_request);
990     addMessageToJson(res.jsonValue, propertyValueTypeError(arg1, arg2), arg2);
991 }
992 
993 /**
994  * @internal
995  * @brief Formats ResourceNotFound message into JSONd
996  *
997  * See header file for more information
998  * @endinternal
999  */
1000 nlohmann::json resourceNotFound(std::string_view arg1, std::string_view arg2)
1001 {
1002     return getLog(redfish::registries::base::Index::resourceNotFound,
1003                   std::to_array({arg1, arg2}));
1004 }
1005 
1006 void resourceNotFound(crow::Response& res, std::string_view arg1,
1007                       std::string_view arg2)
1008 {
1009     res.result(boost::beast::http::status::not_found);
1010     addMessageToErrorJson(res.jsonValue, resourceNotFound(arg1, arg2));
1011 }
1012 
1013 /**
1014  * @internal
1015  * @brief Formats CouldNotEstablishConnection message into JSON
1016  *
1017  * See header file for more information
1018  * @endinternal
1019  */
1020 nlohmann::json couldNotEstablishConnection(boost::urls::url_view arg1)
1021 {
1022     return getLog(redfish::registries::base::Index::couldNotEstablishConnection,
1023                   std::to_array<std::string_view>({arg1.buffer()}));
1024 }
1025 
1026 void couldNotEstablishConnection(crow::Response& res,
1027                                  boost::urls::url_view arg1)
1028 {
1029     res.result(boost::beast::http::status::not_found);
1030     addMessageToErrorJson(res.jsonValue, couldNotEstablishConnection(arg1));
1031 }
1032 
1033 /**
1034  * @internal
1035  * @brief Formats PropertyNotWritable message into JSON for the specified
1036  * property
1037  *
1038  * See header file for more information
1039  * @endinternal
1040  */
1041 nlohmann::json propertyNotWritable(std::string_view arg1)
1042 {
1043     return getLog(redfish::registries::base::Index::propertyNotWritable,
1044                   std::to_array({arg1}));
1045 }
1046 
1047 void propertyNotWritable(crow::Response& res, std::string_view arg1)
1048 {
1049     res.result(boost::beast::http::status::forbidden);
1050     addMessageToJson(res.jsonValue, propertyNotWritable(arg1), arg1);
1051 }
1052 
1053 /**
1054  * @internal
1055  * @brief Formats QueryParameterValueTypeError message into JSON
1056  *
1057  * See header file for more information
1058  * @endinternal
1059  */
1060 nlohmann::json queryParameterValueTypeError(std::string_view arg1,
1061                                             std::string_view arg2)
1062 {
1063     return getLog(
1064         redfish::registries::base::Index::queryParameterValueTypeError,
1065         std::to_array({arg1, arg2}));
1066 }
1067 
1068 void queryParameterValueTypeError(crow::Response& res, std::string_view arg1,
1069                                   std::string_view arg2)
1070 {
1071     res.result(boost::beast::http::status::bad_request);
1072     addMessageToErrorJson(res.jsonValue,
1073                           queryParameterValueTypeError(arg1, arg2));
1074 }
1075 
1076 /**
1077  * @internal
1078  * @brief Formats ServiceShuttingDown message into JSON
1079  *
1080  * See header file for more information
1081  * @endinternal
1082  */
1083 nlohmann::json serviceShuttingDown(void)
1084 {
1085     return getLog(redfish::registries::base::Index::serviceShuttingDown, {});
1086 }
1087 
1088 void serviceShuttingDown(crow::Response& res)
1089 {
1090     res.result(boost::beast::http::status::service_unavailable);
1091     addMessageToErrorJson(res.jsonValue, serviceShuttingDown());
1092 }
1093 
1094 /**
1095  * @internal
1096  * @brief Formats ActionParameterDuplicate message into JSON
1097  *
1098  * See header file for more information
1099  * @endinternal
1100  */
1101 nlohmann::json actionParameterDuplicate(std::string_view arg1,
1102                                         std::string_view arg2)
1103 {
1104     return getLog(redfish::registries::base::Index::actionParameterDuplicate,
1105                   std::to_array({arg1, arg2}));
1106 }
1107 
1108 void actionParameterDuplicate(crow::Response& res, std::string_view arg1,
1109                               std::string_view arg2)
1110 {
1111     res.result(boost::beast::http::status::bad_request);
1112     addMessageToErrorJson(res.jsonValue, actionParameterDuplicate(arg1, arg2));
1113 }
1114 
1115 /**
1116  * @internal
1117  * @brief Formats ActionParameterNotSupported message into JSON
1118  *
1119  * See header file for more information
1120  * @endinternal
1121  */
1122 nlohmann::json actionParameterNotSupported(std::string_view arg1,
1123                                            std::string_view arg2)
1124 {
1125     return getLog(redfish::registries::base::Index::actionParameterNotSupported,
1126                   std::to_array({arg1, arg2}));
1127 }
1128 
1129 void actionParameterNotSupported(crow::Response& res, std::string_view arg1,
1130                                  std::string_view arg2)
1131 {
1132     res.result(boost::beast::http::status::bad_request);
1133     addMessageToErrorJson(res.jsonValue,
1134                           actionParameterNotSupported(arg1, arg2));
1135 }
1136 
1137 /**
1138  * @internal
1139  * @brief Formats SourceDoesNotSupportProtocol message into JSON
1140  *
1141  * See header file for more information
1142  * @endinternal
1143  */
1144 nlohmann::json sourceDoesNotSupportProtocol(boost::urls::url_view arg1,
1145                                             std::string_view arg2)
1146 {
1147     return getLog(
1148         redfish::registries::base::Index::sourceDoesNotSupportProtocol,
1149         std::to_array<std::string_view>({arg1.buffer(), arg2}));
1150 }
1151 
1152 void sourceDoesNotSupportProtocol(crow::Response& res,
1153                                   boost::urls::url_view arg1,
1154                                   std::string_view arg2)
1155 {
1156     res.result(boost::beast::http::status::bad_request);
1157     addMessageToErrorJson(res.jsonValue,
1158                           sourceDoesNotSupportProtocol(arg1, arg2));
1159 }
1160 
1161 /**
1162  * @internal
1163  * @brief Formats StrictAccountTypes message into JSON
1164  *
1165  * See header file for more information
1166  * @endinternal
1167  */
1168 nlohmann::json strictAccountTypes(std::string_view arg1)
1169 {
1170     return getLog(redfish::registries::base::Index::strictAccountTypes,
1171                   std::to_array({arg1}));
1172 }
1173 
1174 void strictAccountTypes(crow::Response& res, std::string_view arg1)
1175 {
1176     res.result(boost::beast::http::status::bad_request);
1177     addMessageToErrorJson(res.jsonValue, strictAccountTypes(arg1));
1178 }
1179 
1180 /**
1181  * @internal
1182  * @brief Formats AccountRemoved message into JSON
1183  *
1184  * See header file for more information
1185  * @endinternal
1186  */
1187 nlohmann::json accountRemoved(void)
1188 {
1189     return getLog(redfish::registries::base::Index::accountRemoved, {});
1190 }
1191 
1192 void accountRemoved(crow::Response& res)
1193 {
1194     res.result(boost::beast::http::status::ok);
1195     addMessageToJsonRoot(res.jsonValue, accountRemoved());
1196 }
1197 
1198 /**
1199  * @internal
1200  * @brief Formats AccessDenied message into JSON
1201  *
1202  * See header file for more information
1203  * @endinternal
1204  */
1205 nlohmann::json accessDenied(boost::urls::url_view arg1)
1206 {
1207     return getLog(redfish::registries::base::Index::accessDenied,
1208                   std::to_array<std::string_view>({arg1.buffer()}));
1209 }
1210 
1211 void accessDenied(crow::Response& res, boost::urls::url_view arg1)
1212 {
1213     res.result(boost::beast::http::status::forbidden);
1214     addMessageToErrorJson(res.jsonValue, accessDenied(arg1));
1215 }
1216 
1217 /**
1218  * @internal
1219  * @brief Formats QueryNotSupported message into JSON
1220  *
1221  * See header file for more information
1222  * @endinternal
1223  */
1224 nlohmann::json queryNotSupported(void)
1225 {
1226     return getLog(redfish::registries::base::Index::queryNotSupported, {});
1227 }
1228 
1229 void queryNotSupported(crow::Response& res)
1230 {
1231     res.result(boost::beast::http::status::bad_request);
1232     addMessageToErrorJson(res.jsonValue, queryNotSupported());
1233 }
1234 
1235 /**
1236  * @internal
1237  * @brief Formats CreateLimitReachedForResource message into JSON
1238  *
1239  * See header file for more information
1240  * @endinternal
1241  */
1242 nlohmann::json createLimitReachedForResource(void)
1243 {
1244     return getLog(
1245         redfish::registries::base::Index::createLimitReachedForResource, {});
1246 }
1247 
1248 void createLimitReachedForResource(crow::Response& res)
1249 {
1250     res.result(boost::beast::http::status::bad_request);
1251     addMessageToErrorJson(res.jsonValue, createLimitReachedForResource());
1252 }
1253 
1254 /**
1255  * @internal
1256  * @brief Formats GeneralError message into JSON
1257  *
1258  * See header file for more information
1259  * @endinternal
1260  */
1261 nlohmann::json generalError(void)
1262 {
1263     return getLog(redfish::registries::base::Index::generalError, {});
1264 }
1265 
1266 void generalError(crow::Response& res)
1267 {
1268     res.result(boost::beast::http::status::internal_server_error);
1269     addMessageToErrorJson(res.jsonValue, generalError());
1270 }
1271 
1272 /**
1273  * @internal
1274  * @brief Formats Success message into JSON
1275  *
1276  * See header file for more information
1277  * @endinternal
1278  */
1279 nlohmann::json success(void)
1280 {
1281     return getLog(redfish::registries::base::Index::success, {});
1282 }
1283 
1284 void success(crow::Response& res)
1285 {
1286     // don't set res.result here because success is the default and any
1287     // error should overwrite the default
1288     addMessageToJsonRoot(res.jsonValue, success());
1289 }
1290 
1291 /**
1292  * @internal
1293  * @brief Formats Created message into JSON
1294  *
1295  * See header file for more information
1296  * @endinternal
1297  */
1298 nlohmann::json created(void)
1299 {
1300     return getLog(redfish::registries::base::Index::created, {});
1301 }
1302 
1303 void created(crow::Response& res)
1304 {
1305     res.result(boost::beast::http::status::created);
1306     addMessageToJsonRoot(res.jsonValue, created());
1307 }
1308 
1309 /**
1310  * @internal
1311  * @brief Formats NoOperation message into JSON
1312  *
1313  * See header file for more information
1314  * @endinternal
1315  */
1316 nlohmann::json noOperation(void)
1317 {
1318     return getLog(redfish::registries::base::Index::noOperation, {});
1319 }
1320 
1321 void noOperation(crow::Response& res)
1322 {
1323     res.result(boost::beast::http::status::bad_request);
1324     addMessageToErrorJson(res.jsonValue, noOperation());
1325 }
1326 
1327 /**
1328  * @internal
1329  * @brief Formats PropertyUnknown message into JSON for the specified
1330  * property
1331  *
1332  * See header file for more information
1333  * @endinternal
1334  */
1335 nlohmann::json propertyUnknown(std::string_view arg1)
1336 {
1337     return getLog(redfish::registries::base::Index::propertyUnknown,
1338                   std::to_array({arg1}));
1339 }
1340 
1341 void propertyUnknown(crow::Response& res, std::string_view arg1)
1342 {
1343     res.result(boost::beast::http::status::bad_request);
1344     addMessageToErrorJson(res.jsonValue, propertyUnknown(arg1));
1345 }
1346 
1347 /**
1348  * @internal
1349  * @brief Formats NoValidSession message into JSON
1350  *
1351  * See header file for more information
1352  * @endinternal
1353  */
1354 nlohmann::json noValidSession(void)
1355 {
1356     return getLog(redfish::registries::base::Index::noValidSession, {});
1357 }
1358 
1359 void noValidSession(crow::Response& res)
1360 {
1361     res.result(boost::beast::http::status::forbidden);
1362     addMessageToErrorJson(res.jsonValue, noValidSession());
1363 }
1364 
1365 /**
1366  * @internal
1367  * @brief Formats InvalidObject message into JSON
1368  *
1369  * See header file for more information
1370  * @endinternal
1371  */
1372 nlohmann::json invalidObject(boost::urls::url_view arg1)
1373 {
1374     return getLog(redfish::registries::base::Index::invalidObject,
1375                   std::to_array<std::string_view>({arg1.buffer()}));
1376 }
1377 
1378 void invalidObject(crow::Response& res, boost::urls::url_view arg1)
1379 {
1380     res.result(boost::beast::http::status::bad_request);
1381     addMessageToErrorJson(res.jsonValue, invalidObject(arg1));
1382 }
1383 
1384 /**
1385  * @internal
1386  * @brief Formats ResourceInStandby message into JSON
1387  *
1388  * See header file for more information
1389  * @endinternal
1390  */
1391 nlohmann::json resourceInStandby(void)
1392 {
1393     return getLog(redfish::registries::base::Index::resourceInStandby, {});
1394 }
1395 
1396 void resourceInStandby(crow::Response& res)
1397 {
1398     res.result(boost::beast::http::status::service_unavailable);
1399     addMessageToErrorJson(res.jsonValue, resourceInStandby());
1400 }
1401 
1402 /**
1403  * @internal
1404  * @brief Formats ActionParameterValueTypeError message into JSON
1405  *
1406  * See header file for more information
1407  * @endinternal
1408  */
1409 nlohmann::json actionParameterValueTypeError(std::string_view arg1,
1410                                              std::string_view arg2,
1411                                              std::string_view arg3)
1412 {
1413     return getLog(
1414         redfish::registries::base::Index::actionParameterValueTypeError,
1415         std::to_array({arg1, arg2, arg3}));
1416 }
1417 
1418 void actionParameterValueTypeError(crow::Response& res, std::string_view arg1,
1419                                    std::string_view arg2, std::string_view arg3)
1420 {
1421     res.result(boost::beast::http::status::bad_request);
1422     addMessageToErrorJson(res.jsonValue,
1423                           actionParameterValueTypeError(arg1, arg2, arg3));
1424 }
1425 
1426 /**
1427  * @internal
1428  * @brief Formats SessionLimitExceeded message into JSON
1429  *
1430  * See header file for more information
1431  * @endinternal
1432  */
1433 nlohmann::json sessionLimitExceeded(void)
1434 {
1435     return getLog(redfish::registries::base::Index::sessionLimitExceeded, {});
1436 }
1437 
1438 void sessionLimitExceeded(crow::Response& res)
1439 {
1440     res.result(boost::beast::http::status::service_unavailable);
1441     addMessageToErrorJson(res.jsonValue, sessionLimitExceeded());
1442 }
1443 
1444 /**
1445  * @internal
1446  * @brief Formats ActionNotSupported message into JSON
1447  *
1448  * See header file for more information
1449  * @endinternal
1450  */
1451 nlohmann::json actionNotSupported(std::string_view arg1)
1452 {
1453     return getLog(redfish::registries::base::Index::actionNotSupported,
1454                   std::to_array({arg1}));
1455 }
1456 
1457 void actionNotSupported(crow::Response& res, std::string_view arg1)
1458 {
1459     res.result(boost::beast::http::status::bad_request);
1460     addMessageToErrorJson(res.jsonValue, actionNotSupported(arg1));
1461 }
1462 
1463 /**
1464  * @internal
1465  * @brief Formats InvalidIndex message into JSON
1466  *
1467  * See header file for more information
1468  * @endinternal
1469  */
1470 nlohmann::json invalidIndex(int64_t arg1)
1471 {
1472     std::string arg1Str = std::to_string(arg1);
1473     return getLog(redfish::registries::base::Index::invalidIndex,
1474                   std::to_array<std::string_view>({arg1Str}));
1475 }
1476 
1477 void invalidIndex(crow::Response& res, int64_t arg1)
1478 {
1479     res.result(boost::beast::http::status::bad_request);
1480     addMessageToErrorJson(res.jsonValue, invalidIndex(arg1));
1481 }
1482 
1483 /**
1484  * @internal
1485  * @brief Formats EmptyJSON message into JSON
1486  *
1487  * See header file for more information
1488  * @endinternal
1489  */
1490 nlohmann::json emptyJSON(void)
1491 {
1492     return getLog(redfish::registries::base::Index::emptyJSON, {});
1493 }
1494 
1495 void emptyJSON(crow::Response& res)
1496 {
1497     res.result(boost::beast::http::status::bad_request);
1498     addMessageToErrorJson(res.jsonValue, emptyJSON());
1499 }
1500 
1501 /**
1502  * @internal
1503  * @brief Formats QueryNotSupportedOnResource message into JSON
1504  *
1505  * See header file for more information
1506  * @endinternal
1507  */
1508 nlohmann::json queryNotSupportedOnResource(void)
1509 {
1510     return getLog(redfish::registries::base::Index::queryNotSupportedOnResource,
1511                   {});
1512 }
1513 
1514 void queryNotSupportedOnResource(crow::Response& res)
1515 {
1516     res.result(boost::beast::http::status::bad_request);
1517     addMessageToErrorJson(res.jsonValue, queryNotSupportedOnResource());
1518 }
1519 
1520 /**
1521  * @internal
1522  * @brief Formats QueryNotSupportedOnOperation message into JSON
1523  *
1524  * See header file for more information
1525  * @endinternal
1526  */
1527 nlohmann::json queryNotSupportedOnOperation(void)
1528 {
1529     return getLog(
1530         redfish::registries::base::Index::queryNotSupportedOnOperation, {});
1531 }
1532 
1533 void queryNotSupportedOnOperation(crow::Response& res)
1534 {
1535     res.result(boost::beast::http::status::bad_request);
1536     addMessageToErrorJson(res.jsonValue, queryNotSupportedOnOperation());
1537 }
1538 
1539 /**
1540  * @internal
1541  * @brief Formats QueryCombinationInvalid message into JSON
1542  *
1543  * See header file for more information
1544  * @endinternal
1545  */
1546 nlohmann::json queryCombinationInvalid(void)
1547 {
1548     return getLog(redfish::registries::base::Index::queryCombinationInvalid,
1549                   {});
1550 }
1551 
1552 void queryCombinationInvalid(crow::Response& res)
1553 {
1554     res.result(boost::beast::http::status::bad_request);
1555     addMessageToErrorJson(res.jsonValue, queryCombinationInvalid());
1556 }
1557 
1558 /**
1559  * @internal
1560  * @brief Formats InsufficientPrivilege message into JSON
1561  *
1562  * See header file for more information
1563  * @endinternal
1564  */
1565 nlohmann::json insufficientPrivilege(void)
1566 {
1567     return getLog(redfish::registries::base::Index::insufficientPrivilege, {});
1568 }
1569 
1570 void insufficientPrivilege(crow::Response& res)
1571 {
1572     res.result(boost::beast::http::status::forbidden);
1573     addMessageToErrorJson(res.jsonValue, insufficientPrivilege());
1574 }
1575 
1576 /**
1577  * @internal
1578  * @brief Formats PropertyValueModified message into JSON
1579  *
1580  * See header file for more information
1581  * @endinternal
1582  */
1583 nlohmann::json propertyValueModified(std::string_view arg1,
1584                                      std::string_view arg2)
1585 {
1586     return getLog(redfish::registries::base::Index::propertyValueModified,
1587                   std::to_array({arg1, arg2}));
1588 }
1589 
1590 void propertyValueModified(crow::Response& res, std::string_view arg1,
1591                            std::string_view arg2)
1592 {
1593     res.result(boost::beast::http::status::ok);
1594     addMessageToJson(res.jsonValue, propertyValueModified(arg1, arg2), arg1);
1595 }
1596 
1597 /**
1598  * @internal
1599  * @brief Formats AccountNotModified message into JSON
1600  *
1601  * See header file for more information
1602  * @endinternal
1603  */
1604 nlohmann::json accountNotModified(void)
1605 {
1606     return getLog(redfish::registries::base::Index::accountNotModified, {});
1607 }
1608 
1609 void accountNotModified(crow::Response& res)
1610 {
1611     res.result(boost::beast::http::status::bad_request);
1612     addMessageToErrorJson(res.jsonValue, accountNotModified());
1613 }
1614 
1615 /**
1616  * @internal
1617  * @brief Formats QueryParameterValueFormatError message into JSON
1618  *
1619  * See header file for more information
1620  * @endinternal
1621  */
1622 nlohmann::json queryParameterValueFormatError(std::string_view arg1,
1623                                               std::string_view arg2)
1624 {
1625     return getLog(
1626         redfish::registries::base::Index::queryParameterValueFormatError,
1627         std::to_array({arg1, arg2}));
1628 }
1629 
1630 void queryParameterValueFormatError(crow::Response& res, std::string_view arg1,
1631                                     std::string_view arg2)
1632 {
1633     res.result(boost::beast::http::status::bad_request);
1634     addMessageToErrorJson(res.jsonValue,
1635                           queryParameterValueFormatError(arg1, arg2));
1636 }
1637 
1638 /**
1639  * @internal
1640  * @brief Formats PropertyMissing message into JSON for the specified
1641  * property
1642  *
1643  * See header file for more information
1644  * @endinternal
1645  */
1646 nlohmann::json propertyMissing(std::string_view arg1)
1647 {
1648     return getLog(redfish::registries::base::Index::propertyMissing,
1649                   std::to_array({arg1}));
1650 }
1651 
1652 void propertyMissing(crow::Response& res, std::string_view arg1)
1653 {
1654     res.result(boost::beast::http::status::bad_request);
1655     addMessageToJson(res.jsonValue, propertyMissing(arg1), arg1);
1656 }
1657 
1658 /**
1659  * @internal
1660  * @brief Formats ResourceExhaustion message into JSON
1661  *
1662  * See header file for more information
1663  * @endinternal
1664  */
1665 nlohmann::json resourceExhaustion(std::string_view arg1)
1666 {
1667     return getLog(redfish::registries::base::Index::resourceExhaustion,
1668                   std::to_array({arg1}));
1669 }
1670 
1671 void resourceExhaustion(crow::Response& res, std::string_view arg1)
1672 {
1673     res.result(boost::beast::http::status::service_unavailable);
1674     addMessageToErrorJson(res.jsonValue, resourceExhaustion(arg1));
1675 }
1676 
1677 /**
1678  * @internal
1679  * @brief Formats AccountModified message into JSON
1680  *
1681  * See header file for more information
1682  * @endinternal
1683  */
1684 nlohmann::json accountModified(void)
1685 {
1686     return getLog(redfish::registries::base::Index::accountModified, {});
1687 }
1688 
1689 void accountModified(crow::Response& res)
1690 {
1691     res.result(boost::beast::http::status::ok);
1692     addMessageToErrorJson(res.jsonValue, accountModified());
1693 }
1694 
1695 /**
1696  * @internal
1697  * @brief Formats QueryParameterOutOfRange message into JSON
1698  *
1699  * See header file for more information
1700  * @endinternal
1701  */
1702 nlohmann::json queryParameterOutOfRange(std::string_view arg1,
1703                                         std::string_view arg2,
1704                                         std::string_view arg3)
1705 {
1706     return getLog(redfish::registries::base::Index::queryParameterOutOfRange,
1707                   std::to_array({arg1, arg2, arg3}));
1708 }
1709 
1710 void queryParameterOutOfRange(crow::Response& res, std::string_view arg1,
1711                               std::string_view arg2, std::string_view arg3)
1712 {
1713     res.result(boost::beast::http::status::bad_request);
1714     addMessageToErrorJson(res.jsonValue,
1715                           queryParameterOutOfRange(arg1, arg2, arg3));
1716 }
1717 
1718 nlohmann::json passwordChangeRequired(boost::urls::url_view arg1)
1719 {
1720     return getLog(redfish::registries::base::Index::passwordChangeRequired,
1721                   std::to_array<std::string_view>({arg1.buffer()}));
1722 }
1723 
1724 /**
1725  * @internal
1726  * @brief Formats PasswordChangeRequired message into JSON
1727  *
1728  * See header file for more information
1729  * @endinternal
1730  */
1731 void passwordChangeRequired(crow::Response& res, boost::urls::url_view arg1)
1732 {
1733     messages::addMessageToJsonRoot(res.jsonValue, passwordChangeRequired(arg1));
1734 }
1735 
1736 /**
1737  * @internal
1738  * @brief Formats InsufficientStorage message into JSON
1739  *
1740  * See header file for more information
1741  * @endinternal
1742  */
1743 nlohmann::json insufficientStorage()
1744 {
1745     return getLog(redfish::registries::base::Index::insufficientStorage, {});
1746 }
1747 
1748 void insufficientStorage(crow::Response& res)
1749 {
1750     res.result(boost::beast::http::status::insufficient_storage);
1751     addMessageToErrorJson(res.jsonValue, insufficientStorage());
1752 }
1753 
1754 /**
1755  * @internal
1756  * @brief Formats OperationNotAllowed message into JSON
1757  *
1758  * See header file for more information
1759  * @endinternal
1760  */
1761 nlohmann::json operationNotAllowed()
1762 {
1763     return getLog(redfish::registries::base::Index::operationNotAllowed, {});
1764 }
1765 
1766 void operationNotAllowed(crow::Response& res)
1767 {
1768     res.result(boost::beast::http::status::method_not_allowed);
1769     addMessageToErrorJson(res.jsonValue, operationNotAllowed());
1770 }
1771 
1772 /**
1773  * @internal
1774  * @brief Formats ArraySizeTooLong message into JSON
1775  *
1776  * See header file for more information
1777  * @endinternal
1778  */
1779 nlohmann::json arraySizeTooLong(std::string_view property, uint64_t length)
1780 {
1781     std::string valStr = std::to_string(length);
1782     return getLog(redfish::registries::base::Index::arraySizeTooLong,
1783                   std::to_array<std::string_view>({property, valStr}));
1784 }
1785 
1786 void arraySizeTooLong(crow::Response& res, std::string_view property,
1787                       uint64_t length)
1788 {
1789     res.result(boost::beast::http::status::method_not_allowed);
1790     addMessageToErrorJson(res.jsonValue, arraySizeTooLong(property, length));
1791 }
1792 
1793 void invalidUpload(crow::Response& res, std::string_view arg1,
1794                    std::string_view arg2)
1795 {
1796     res.result(boost::beast::http::status::bad_request);
1797     addMessageToErrorJson(res.jsonValue, invalidUpload(arg1, arg2));
1798 }
1799 
1800 /**
1801  * @internal
1802  * @brief Formats Invalid File message into JSON
1803  *
1804  * See header file for more information
1805  * @endinternal
1806  */
1807 nlohmann::json invalidUpload(std::string_view arg1, std::string_view arg2)
1808 {
1809     std::string msg = "Invalid file uploaded to ";
1810     msg += arg1;
1811     msg += ": ";
1812     msg += arg2;
1813     msg += ".";
1814 
1815     nlohmann::json::object_t ret;
1816     ret["@odata.type"] = "/redfish/v1/$metadata#Message.v1_1_1.Message";
1817     ret["MessageId"] = "OpenBMC.0.2.InvalidUpload";
1818     ret["Message"] = std::move(msg);
1819     nlohmann::json::array_t args;
1820     args.emplace_back(arg1);
1821     args.emplace_back(arg2);
1822     ret["MessageArgs"] = std::move(args);
1823     ret["MessageSeverity"] = "Warning";
1824     ret["Resolution"] = "None.";
1825     return ret;
1826 }
1827 
1828 } // namespace messages
1829 
1830 } // namespace redfish
1831