/proc/self/cwd/source/server/options_impl.h
Line | Count | Source (jump to first uncovered line) |
1 | | #pragma once |
2 | | |
3 | | #include <chrono> |
4 | | #include <cstdint> |
5 | | #include <string> |
6 | | |
7 | | #include "envoy/common/exception.h" |
8 | | #include "envoy/config/bootstrap/v3/bootstrap.pb.h" |
9 | | #include "envoy/registry/registry.h" |
10 | | #include "envoy/server/options.h" |
11 | | |
12 | | #include "source/common/common/logger.h" |
13 | | #include "source/common/config/well_known_names.h" |
14 | | |
15 | | #include "spdlog/spdlog.h" |
16 | | |
17 | | namespace Envoy { |
18 | | /** |
19 | | * Implementation of Server::Options. |
20 | | */ |
21 | | class OptionsImpl : public Server::Options, protected Logger::Loggable<Logger::Id::config> { |
22 | | public: |
23 | | /** |
24 | | * Parameters are hot_restart_enabled |
25 | | */ |
26 | | using HotRestartVersionCb = std::function<std::string(bool)>; |
27 | | |
28 | | /** |
29 | | * @throw NoServingException if Envoy has already done everything specified by the args (e.g. |
30 | | * print the hot restart version) and it's time to exit without serving HTTP traffic. The |
31 | | * caller should exit(0) after any necessary cleanup. |
32 | | * @throw MalformedArgvException if something is wrong with the arguments (invalid flag or flag |
33 | | * value). The caller should call exit(1) after any necessary cleanup. |
34 | | */ |
35 | | OptionsImpl(int argc, const char* const* argv, const HotRestartVersionCb& hot_restart_version_cb, |
36 | | spdlog::level::level_enum default_log_level); |
37 | | |
38 | | /** |
39 | | * @throw NoServingException if Envoy has already done everything specified by the args (e.g. |
40 | | * print the hot restart version) and it's time to exit without serving HTTP traffic. The |
41 | | * caller should exit(0) after any necessary cleanup. |
42 | | * @throw MalformedArgvException if something is wrong with the arguments (invalid flag or flag |
43 | | * value). The caller should call exit(1) after any necessary cleanup. |
44 | | */ |
45 | | OptionsImpl(std::vector<std::string> args, const HotRestartVersionCb& hot_restart_version_cb, |
46 | | spdlog::level::level_enum default_log_level); |
47 | | |
48 | | // Default constructor; creates "reasonable" defaults, but desired values should be set |
49 | | // explicitly. |
50 | | OptionsImpl(const std::string& service_cluster, const std::string& service_node, |
51 | | const std::string& service_zone, spdlog::level::level_enum log_level); |
52 | | |
53 | | // Constructor for mobile |
54 | | OptionsImpl() = default; |
55 | | |
56 | | // Setters for option fields. These are not part of the Options interface. |
57 | 0 | void setBaseId(uint64_t base_id) { base_id_ = base_id; }; |
58 | 0 | void setUseDynamicBaseId(bool use_dynamic_base_id) { use_dynamic_base_id_ = use_dynamic_base_id; } |
59 | 0 | void setBaseIdPath(const std::string& base_id_path) { base_id_path_ = base_id_path; } |
60 | 2.64k | void setConcurrency(uint32_t concurrency) { concurrency_ = concurrency; } |
61 | 2.64k | void setConfigPath(const std::string& config_path) { config_path_ = config_path; } |
62 | 0 | void setConfigProto(const envoy::config::bootstrap::v3::Bootstrap& config_proto) { |
63 | 0 | *config_proto_ = config_proto; |
64 | 0 | } |
65 | 0 | void setConfigProto(std::unique_ptr<envoy::config::bootstrap::v3::Bootstrap>&& config_proto) { |
66 | 0 | config_proto_ = std::move(config_proto); |
67 | 0 | } |
68 | 2.64k | void setConfigYaml(const std::string& config_yaml) { config_yaml_ = config_yaml; } |
69 | 0 | void setAdminAddressPath(const std::string& admin_address_path) { |
70 | 0 | admin_address_path_ = admin_address_path; |
71 | 0 | } |
72 | 2.64k | void setLocalAddressIpVersion(Network::Address::IpVersion local_address_ip_version) { |
73 | 2.64k | local_address_ip_version_ = local_address_ip_version; |
74 | 2.64k | } |
75 | 2.64k | void setDrainTime(std::chrono::seconds drain_time) { drain_time_ = drain_time; } |
76 | 2.64k | void setParentShutdownTime(std::chrono::seconds parent_shutdown_time) { |
77 | 2.64k | parent_shutdown_time_ = parent_shutdown_time; |
78 | 2.64k | } |
79 | 2.64k | void setDrainStrategy(Server::DrainStrategy drain_strategy) { drain_strategy_ = drain_strategy; } |
80 | 0 | void setLogLevel(spdlog::level::level_enum log_level) { log_level_ = log_level; } |
81 | 0 | void setLogFormat(const std::string& log_format) { |
82 | 0 | log_format_ = log_format; |
83 | 0 | log_format_set_ = true; |
84 | 0 | } |
85 | 0 | void setLogPath(const std::string& log_path) { log_path_ = log_path; } |
86 | 0 | void setRestartEpoch(uint64_t restart_epoch) { restart_epoch_ = restart_epoch; } |
87 | 0 | void setMode(Server::Mode mode) { mode_ = mode; } |
88 | 2.64k | void setFileFlushIntervalMsec(std::chrono::milliseconds file_flush_interval_msec) { |
89 | 2.64k | file_flush_interval_msec_ = file_flush_interval_msec; |
90 | 2.64k | } |
91 | 0 | void setServiceClusterName(const std::string& service_cluster) { |
92 | 0 | service_cluster_ = service_cluster; |
93 | 0 | } |
94 | 0 | void setServiceNodeName(const std::string& service_node) { service_node_ = service_node; } |
95 | 0 | void setServiceZone(const std::string& service_zone) { service_zone_ = service_zone; } |
96 | 2.64k | void setHotRestartDisabled(bool hot_restart_disabled) { |
97 | 2.64k | hot_restart_disabled_ = hot_restart_disabled; |
98 | 2.64k | } |
99 | 0 | void setSignalHandling(bool signal_handling_enabled) { |
100 | 0 | signal_handling_enabled_ = signal_handling_enabled; |
101 | 0 | } |
102 | 0 | void setCpusetThreads(bool cpuset_threads_enabled) { cpuset_threads_ = cpuset_threads_enabled; } |
103 | 2.64k | void setAllowUnknownFields(bool allow_unknown_static_fields) { |
104 | 2.64k | allow_unknown_static_fields_ = allow_unknown_static_fields; |
105 | 2.64k | } |
106 | 2.64k | void setRejectUnknownFieldsDynamic(bool reject_unknown_dynamic_fields) { |
107 | 2.64k | reject_unknown_dynamic_fields_ = reject_unknown_dynamic_fields; |
108 | 2.64k | } |
109 | 2.64k | void setIgnoreUnknownFieldsDynamic(bool ignore_unknown_dynamic_fields) { |
110 | 2.64k | ignore_unknown_dynamic_fields_ = ignore_unknown_dynamic_fields; |
111 | 2.64k | } |
112 | | |
113 | 0 | void setSocketPath(const std::string& socket_path) { socket_path_ = socket_path; } |
114 | | |
115 | 0 | void setSocketMode(mode_t socket_mode) { socket_mode_ = socket_mode; } |
116 | | |
117 | 0 | void setStatsTags(const Stats::TagVector& stats_tags) { stats_tags_ = stats_tags; } |
118 | | |
119 | | // Server::Options |
120 | 0 | uint64_t baseId() const override { return base_id_; } |
121 | 0 | bool useDynamicBaseId() const override { return use_dynamic_base_id_; } |
122 | 0 | const std::string& baseIdPath() const override { return base_id_path_; } |
123 | 18.6k | uint32_t concurrency() const override { return concurrency_; } |
124 | 2.64k | const std::string& configPath() const override { return config_path_; } |
125 | 2.64k | const envoy::config::bootstrap::v3::Bootstrap& configProto() const override { |
126 | 2.64k | return *config_proto_; |
127 | 2.64k | } |
128 | 2.64k | const std::string& configYaml() const override { return config_yaml_; } |
129 | 2.64k | bool allowUnknownStaticFields() const override { return allow_unknown_static_fields_; } |
130 | 2.64k | bool rejectUnknownDynamicFields() const override { return reject_unknown_dynamic_fields_; } |
131 | 2.64k | bool ignoreUnknownDynamicFields() const override { return ignore_unknown_dynamic_fields_; } |
132 | 2.64k | const std::string& adminAddressPath() const override { return admin_address_path_; } |
133 | 0 | Network::Address::IpVersion localAddressIpVersion() const override { |
134 | 0 | return local_address_ip_version_; |
135 | 0 | } |
136 | 10 | std::chrono::seconds drainTime() const override { return drain_time_; } |
137 | 0 | std::chrono::seconds parentShutdownTime() const override { return parent_shutdown_time_; } |
138 | 4 | Server::DrainStrategy drainStrategy() const override { return drain_strategy_; } |
139 | | |
140 | 2.77k | spdlog::level::level_enum logLevel() const override { return log_level_; } |
141 | | const std::vector<std::pair<std::string, spdlog::level::level_enum>>& |
142 | 0 | componentLogLevels() const override { |
143 | 0 | return component_log_levels_; |
144 | 0 | } |
145 | 126 | const std::string& logFormat() const override { return log_format_; } |
146 | 0 | bool logFormatSet() const override { return log_format_set_; } |
147 | 0 | bool logFormatEscaped() const override { return log_format_escaped_; } |
148 | 0 | bool enableFineGrainLogging() const override { return enable_fine_grain_logging_; } |
149 | 2.64k | const std::string& logPath() const override { return log_path_; } |
150 | 2.64k | uint64_t restartEpoch() const override { return restart_epoch_; } |
151 | 0 | Server::Mode mode() const override { return mode_; } |
152 | 2.64k | std::chrono::milliseconds fileFlushIntervalMsec() const override { |
153 | 2.64k | return file_flush_interval_msec_; |
154 | 2.64k | } |
155 | 2.64k | const std::string& serviceClusterName() const override { return service_cluster_; } |
156 | 2.64k | const std::string& serviceNodeName() const override { return service_node_; } |
157 | 2.64k | const std::string& serviceZone() const override { return service_zone_; } |
158 | 2.64k | bool hotRestartDisabled() const override { return hot_restart_disabled_; } |
159 | 2.64k | bool signalHandlingEnabled() const override { return signal_handling_enabled_; } |
160 | 2.64k | bool mutexTracingEnabled() const override { return mutex_tracing_enabled_; } |
161 | 0 | bool coreDumpEnabled() const override { return core_dump_enabled_; } |
162 | 2.64k | const Stats::TagVector& statsTags() const override { return stats_tags_; } |
163 | | Server::CommandLineOptionsPtr toCommandLineOptions() const override; |
164 | | void parseComponentLogLevels(const std::string& component_log_levels); |
165 | 0 | bool cpusetThreadsEnabled() const override { return cpuset_threads_; } |
166 | 0 | const std::vector<std::string>& disabledExtensions() const override { |
167 | 0 | return disabled_extensions_; |
168 | 0 | } |
169 | | uint32_t count() const; |
170 | 0 | const std::string& socketPath() const override { return socket_path_; } |
171 | 0 | mode_t socketMode() const override { return socket_mode_; } |
172 | | |
173 | | /** |
174 | | * disableExtensions parses the given set of extension names of |
175 | | * the form $CATEGORY/$NAME, and disables the corresponding extension |
176 | | * factories. |
177 | | */ |
178 | | static void disableExtensions(const std::vector<std::string>&); |
179 | | static std::string allowedLogLevels(); |
180 | | |
181 | | /** |
182 | | * Parses and validates the provided log_level, returning the corresponding |
183 | | * spdlog::level::level_enum. |
184 | | * @throws MalformedArgvException if the provided string is not a valid spdlog string. |
185 | | */ |
186 | | static spdlog::level::level_enum parseAndValidateLogLevel(absl::string_view log_level); |
187 | | |
188 | | private: |
189 | | static void logError(const std::string& error); |
190 | | |
191 | | uint64_t base_id_{0}; |
192 | | bool use_dynamic_base_id_{false}; |
193 | | std::string base_id_path_; |
194 | | uint32_t concurrency_{1}; |
195 | | std::string config_path_; |
196 | | std::unique_ptr<envoy::config::bootstrap::v3::Bootstrap> config_proto_{ |
197 | | new envoy::config::bootstrap::v3::Bootstrap()}; |
198 | | std::string config_yaml_; |
199 | | bool allow_unknown_static_fields_{false}; |
200 | | bool reject_unknown_dynamic_fields_{false}; |
201 | | bool ignore_unknown_dynamic_fields_{false}; |
202 | | std::string admin_address_path_; |
203 | | Network::Address::IpVersion local_address_ip_version_{Network::Address::IpVersion::v4}; |
204 | | spdlog::level::level_enum log_level_{spdlog::level::info}; |
205 | | std::vector<std::pair<std::string, spdlog::level::level_enum>> component_log_levels_; |
206 | | std::string component_log_level_str_; |
207 | | std::string log_format_{Logger::Logger::DEFAULT_LOG_FORMAT}; |
208 | | bool log_format_set_{false}; |
209 | | bool log_format_escaped_{false}; |
210 | | std::string log_path_; |
211 | | uint64_t restart_epoch_{0}; |
212 | | std::string service_cluster_; |
213 | | std::string service_node_; |
214 | | std::string service_zone_; |
215 | | std::chrono::milliseconds file_flush_interval_msec_{10000}; |
216 | | std::chrono::seconds drain_time_{600}; |
217 | | std::chrono::seconds parent_shutdown_time_{900}; |
218 | | Server::DrainStrategy drain_strategy_{Server::DrainStrategy::Gradual}; |
219 | | Server::Mode mode_{Server::Mode::Serve}; |
220 | | bool hot_restart_disabled_{false}; |
221 | | bool signal_handling_enabled_{true}; |
222 | | bool mutex_tracing_enabled_{false}; |
223 | | bool core_dump_enabled_{false}; |
224 | | bool cpuset_threads_{false}; |
225 | | std::vector<std::string> disabled_extensions_; |
226 | | Stats::TagVector stats_tags_; |
227 | | uint32_t count_{0}; |
228 | | |
229 | | // Initialization added here to avoid integration_admin_test failure caused by uninitialized |
230 | | // enable_fine_grain_logging_. |
231 | | bool enable_fine_grain_logging_ = false; |
232 | | std::string socket_path_{"@envoy_domain_socket"}; |
233 | | mode_t socket_mode_{0}; |
234 | | }; |
235 | | |
236 | | /** |
237 | | * Thrown when an OptionsImpl was not constructed because all of Envoy's work is done (for example, |
238 | | * it was started with --help and it's already printed a help message) so all that's left to do is |
239 | | * exit successfully. |
240 | | */ |
241 | | class NoServingException : public EnvoyException { |
242 | | public: |
243 | 0 | NoServingException(const std::string& what) : EnvoyException(what) {} |
244 | | }; |
245 | | |
246 | | /** |
247 | | * Thrown when an OptionsImpl was not constructed because the argv was invalid. |
248 | | */ |
249 | | class MalformedArgvException : public EnvoyException { |
250 | | public: |
251 | 0 | MalformedArgvException(const std::string& what) : EnvoyException(what) {} |
252 | | }; |
253 | | |
254 | | } // namespace Envoy |