blob: 877e5b7b9d100caf7e0ac14a885dfff579473939 [file] [log] [blame]
Matt Spinler4a6ea6a2018-03-27 14:25:12 -05001/**
2 * Copyright © 2018 IBM 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 */
Matt Spinler8e24dbc2018-03-27 14:48:17 -050016#include <phosphor-logging/log.hpp>
Matt Spinler4a6ea6a2018-03-27 14:25:12 -050017#include "policy_find.hpp"
18
19namespace ibm
20{
21namespace logging
22{
23namespace policy
24{
25
Matt Spinler8e24dbc2018-03-27 14:48:17 -050026namespace optional_ns = std::experimental;
27
28/**
29 * Returns a property value from a map of properties.
30 *
31 * @tparam - T the property data type
32 * @param[in] properties - the property map
33 * @param[in] name - the property name
34 *
35 * @return optional<T> - the property value
36 */
37template<typename T>
38optional_ns::optional<T> getProperty(
39 const DbusPropertyMap& properties,
40 const std::string& name)
41{
42 auto prop = properties.find(name);
43
44 if (prop != properties.end())
45 {
46 return prop->second.template get<T>();
47 }
48
49 return {};
50}
51
52/**
53 * Returns the search modifier to use.
54 *
55 * The modifier is used when the error name itself isn't granular
56 * enough to find a policy table entry. The modifier is determined
57 * using rules provided by the IBM service team.
58 *
59 * Not all errors need a modifier, so this function isn't
60 * guaranteed to find one.
61 *
62 * @param[in] properties - the property map for the error
63 *
64 * @return string - the search modifier
65 * may be empty if none found
66 */
67auto getSearchModifier(
68 const DbusPropertyMap& properties)
69{
70 std::string modifier;
71
72 auto data = getProperty<std::vector<std::string>>(
73 properties,
74 "AdditionalData");
75
76 if (data)
77 {
78 //TODO
79 }
80
81 return modifier;
82}
83
Matt Spinler4a6ea6a2018-03-27 14:25:12 -050084PolicyProps find(
85 const policy::Table& policy,
86 const DbusPropertyMap& errorLogProperties)
87{
Matt Spinler8e24dbc2018-03-27 14:48:17 -050088 auto errorMsg = getProperty<std::string>(
89 errorLogProperties, "Message"); //e.g. xyz.X.Error.Y
90 if (errorMsg)
91 {
92 auto modifier = getSearchModifier(errorLogProperties);
93
94 auto result = policy.find(*errorMsg, modifier);
95
96 if (result)
97 {
98 return {(*result).get().ceid, (*result).get().msg};
99 }
100 }
101 else
102 {
103 using namespace phosphor::logging;
104 log<level::ERR>("No Message metadata found in an error");
105 }
Matt Spinler4a6ea6a2018-03-27 14:25:12 -0500106
107 return {policy.defaultEID(), policy.defaultMsg()};
108}
109
110}
111}
112}