Coverage Report

Created: 2023-11-12 09:30

/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