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
/**
20
 * Implementation of Server::Options without command line parsing.
21
 */
22
class OptionsImplBase : public Server::Options, protected Logger::Loggable<Logger::Id::config> {
23
public:
24
  /**
25
   * Parameters are hot_restart_enabled
26
   */
27
  using HotRestartVersionCb = std::function<std::string(bool)>;
28

            
29
  // Constructor for mobile
30
12412
  OptionsImplBase() = default;
31

            
32
  // Setters for option fields. These are not part of the Options interface.
33
1
  void setBaseId(uint64_t base_id) { base_id_ = base_id; };
34
1
  void setUseDynamicBaseId(bool use_dynamic_base_id) { use_dynamic_base_id_ = use_dynamic_base_id; }
35
  void setSkipHotRestartOnNoParent(bool skip) { skip_hot_restart_on_no_parent_ = skip; }
36
  void setSkipHotRestartParentStats(bool skip) { skip_hot_restart_parent_stats_ = skip; }
37
1
  void setBaseIdPath(const std::string& base_id_path) { base_id_path_ = base_id_path; }
38
10651
  void setConcurrency(uint32_t concurrency) { concurrency_ = concurrency; }
39
10651
  void setConfigPath(const std::string& config_path) { config_path_ = config_path; }
40
1
  void setConfigProto(const envoy::config::bootstrap::v3::Bootstrap& config_proto) {
41
1
    *config_proto_ = config_proto;
42
1
  }
43
  void setConfigProto(std::unique_ptr<envoy::config::bootstrap::v3::Bootstrap>&& config_proto) {
44
    config_proto_ = std::move(config_proto);
45
  }
46
10651
  void setConfigYaml(const std::string& config_yaml) { config_yaml_ = config_yaml; }
47
1
  void setAdminAddressPath(const std::string& admin_address_path) {
48
1
    admin_address_path_ = admin_address_path;
49
1
  }
50
10651
  void setLocalAddressIpVersion(Network::Address::IpVersion local_address_ip_version) {
51
10651
    local_address_ip_version_ = local_address_ip_version;
52
10651
  }
53
10651
  void setDrainTime(std::chrono::seconds drain_time) { drain_time_ = drain_time; }
54
10651
  void setParentShutdownTime(std::chrono::seconds parent_shutdown_time) {
55
10651
    parent_shutdown_time_ = parent_shutdown_time;
56
10651
  }
57
10651
  void setDrainStrategy(Server::DrainStrategy drain_strategy) { drain_strategy_ = drain_strategy; }
58
10652
  void setLogLevel(spdlog::level::level_enum log_level) { log_level_ = log_level; }
59
  absl::Status setLogLevel(absl::string_view log_level);
60
1
  void setLogFormat(const std::string& log_format) {
61
1
    log_format_ = log_format;
62
1
    log_format_set_ = true;
63
1
  }
64
1
  void setEnableFineGrainLogging(bool enable_fine_grain_logging) {
65
1
    enable_fine_grain_logging_ = enable_fine_grain_logging;
66
1
  }
67
1
  void setLogPath(const std::string& log_path) { log_path_ = log_path; }
68
1
  void setRestartEpoch(uint64_t restart_epoch) { restart_epoch_ = restart_epoch; }
69
1
  void setMode(Server::Mode mode) { mode_ = mode; }
70
10651
  void setFileFlushIntervalMsec(std::chrono::milliseconds file_flush_interval_msec) {
71
10651
    file_flush_interval_msec_ = file_flush_interval_msec;
72
10651
  }
73
10651
  void setFileFlushMinSizeKB(uint64_t file_flush_min_size_kb) {
74
10651
    file_flush_min_size_kb_ = file_flush_min_size_kb;
75
10651
  }
76
10652
  void setServiceClusterName(const std::string& service_cluster) {
77
10652
    service_cluster_ = service_cluster;
78
10652
  }
79
10652
  void setServiceNodeName(const std::string& service_node) { service_node_ = service_node; }
80
10652
  void setServiceZone(const std::string& service_zone) { service_zone_ = service_zone; }
81
10651
  void setHotRestartDisabled(bool hot_restart_disabled) {
82
10651
    hot_restart_disabled_ = hot_restart_disabled;
83
10651
  }
84
1
  void setSignalHandling(bool signal_handling_enabled) {
85
1
    signal_handling_enabled_ = signal_handling_enabled;
86
1
  }
87
1
  void setCpusetThreads(bool cpuset_threads_enabled) { cpuset_threads_ = cpuset_threads_enabled; }
88
10651
  void setAllowUnknownFields(bool allow_unknown_static_fields) {
89
10651
    allow_unknown_static_fields_ = allow_unknown_static_fields;
90
10651
  }
91
10651
  void setRejectUnknownFieldsDynamic(bool reject_unknown_dynamic_fields) {
92
10651
    reject_unknown_dynamic_fields_ = reject_unknown_dynamic_fields;
93
10651
  }
94
10650
  void setIgnoreUnknownFieldsDynamic(bool ignore_unknown_dynamic_fields) {
95
10650
    ignore_unknown_dynamic_fields_ = ignore_unknown_dynamic_fields;
96
10650
  }
97
10650
  void setSkipDeprecatedLog(bool skip_deprecated_logs) {
98
10650
    skip_deprecated_logs_ = skip_deprecated_logs;
99
10650
  }
100

            
101
1
  void setSocketPath(const std::string& socket_path) { socket_path_ = socket_path; }
102

            
103
1
  void setSocketMode(mode_t socket_mode) { socket_mode_ = socket_mode; }
104

            
105
1
  void setStatsTags(const Stats::TagVector& stats_tags) { stats_tags_ = stats_tags; }
106

            
107
  // Server::Options
108
20
  uint64_t baseId() const override { return base_id_; }
109
16
  bool useDynamicBaseId() const override { return use_dynamic_base_id_; }
110
115
  bool skipHotRestartOnNoParent() const override { return skip_hot_restart_on_no_parent_; }
111
115
  bool skipHotRestartParentStats() const override { return skip_hot_restart_parent_stats_; }
112
17
  const std::string& baseIdPath() const override { return base_id_path_; }
113
77017
  uint32_t concurrency() const override { return concurrency_; }
114
10792
  const std::string& configPath() const override { return config_path_; }
115
10740
  const envoy::config::bootstrap::v3::Bootstrap& configProto() const override {
116
10740
    return *config_proto_;
117
10740
  }
118
10744
  const std::string& configYaml() const override { return config_yaml_; }
119
10612
  bool allowUnknownStaticFields() const override { return allow_unknown_static_fields_; }
120
10609
  bool rejectUnknownDynamicFields() const override { return reject_unknown_dynamic_fields_; }
121
10607
  bool ignoreUnknownDynamicFields() const override { return ignore_unknown_dynamic_fields_; }
122
10613
  bool skipDeprecatedLogs() const override { return skip_deprecated_logs_; }
123
10614
  const std::string& adminAddressPath() const override { return admin_address_path_; }
124
95
  Network::Address::IpVersion localAddressIpVersion() const override {
125
95
    return local_address_ip_version_;
126
95
  }
127
594
  std::chrono::seconds drainTime() const override { return drain_time_; }
128
11
  std::chrono::seconds parentShutdownTime() const override { return parent_shutdown_time_; }
129
555
  Server::DrainStrategy drainStrategy() const override { return drain_strategy_; }
130

            
131
13226
  spdlog::level::level_enum logLevel() const override { return log_level_; }
132
  const std::vector<std::pair<std::string, spdlog::level::level_enum>>&
133
46
  componentLogLevels() const override {
134
46
    return component_log_levels_;
135
46
  }
136
1714
  const std::string& logFormat() const override { return log_format_; }
137
5
  bool logFormatSet() const override { return log_format_set_; }
138
46
  bool logFormatEscaped() const override { return log_format_escaped_; }
139
1710
  bool enableFineGrainLogging() const override { return enable_fine_grain_logging_; }
140
13937
  const std::string& logPath() const override { return log_path_; }
141
134
  uint64_t restartEpoch() const override { return restart_epoch_; }
142
219
  Server::Mode mode() const override { return mode_; }
143
10615
  std::chrono::milliseconds fileFlushIntervalMsec() const override {
144
10615
    return file_flush_interval_msec_;
145
10615
  }
146
10608
  uint64_t fileFlushMinSizeKB() const override { return file_flush_min_size_kb_; }
147
10613
  const std::string& serviceClusterName() const override { return service_cluster_; }
148
10613
  const std::string& serviceNodeName() const override { return service_node_; }
149
10613
  const std::string& serviceZone() const override { return service_zone_; }
150
43410
  bool hotRestartDisabled() const override { return hot_restart_disabled_; }
151
10596
  bool signalHandlingEnabled() const override { return signal_handling_enabled_; }
152
10611
  bool mutexTracingEnabled() const override { return mutex_tracing_enabled_; }
153
45
  bool coreDumpEnabled() const override { return core_dump_enabled_; }
154
10622
  const Stats::TagVector& statsTags() const override { return stats_tags_; }
155
12
  bool cpusetThreadsEnabled() const override { return cpuset_threads_; }
156
47
  const std::vector<std::string>& disabledExtensions() const override {
157
47
    return disabled_extensions_;
158
47
  }
159
  uint32_t count() const;
160
118
  const std::string& socketPath() const override { return socket_path_; }
161
118
  mode_t socketMode() const override { return socket_mode_; }
162
  // implemented by OptionsImpl
163
4
  Server::CommandLineOptionsPtr toCommandLineOptions() const override { return nullptr; }
164

            
165
  /**
166
   * disableExtensions parses the given set of extension names of
167
   * the form $CATEGORY/$NAME, and disables the corresponding extension
168
   * factories.
169
   */
170
  static void disableExtensions(const std::vector<std::string>&);
171

            
172
  /**
173
   * Parses and validates the provided log_level, returning the corresponding
174
   * spdlog::level::level_enum or an error status if the provided string is not a valid spdlog
175
   * string.
176
   */
177
  static absl::StatusOr<spdlog::level::level_enum>
178
  parseAndValidateLogLevel(absl::string_view log_level);
179

            
180
private:
181
  friend class OptionsImpl;
182

            
183
  uint64_t base_id_{0};
184
  bool use_dynamic_base_id_{false};
185
  bool skip_hot_restart_on_no_parent_{false};
186
  bool skip_hot_restart_parent_stats_{false};
187
  std::string base_id_path_;
188
  uint32_t concurrency_{1};
189
  std::string config_path_;
190
  std::unique_ptr<envoy::config::bootstrap::v3::Bootstrap> config_proto_{
191
      new envoy::config::bootstrap::v3::Bootstrap()};
192
  std::string config_yaml_;
193
  bool allow_unknown_static_fields_{false};
194
  bool reject_unknown_dynamic_fields_{false};
195
  bool ignore_unknown_dynamic_fields_{false};
196
  bool skip_deprecated_logs_{false};
197
  std::string admin_address_path_;
198
  Network::Address::IpVersion local_address_ip_version_{Network::Address::IpVersion::v4};
199
  spdlog::level::level_enum log_level_{spdlog::level::info};
200
  std::vector<std::pair<std::string, spdlog::level::level_enum>> component_log_levels_;
201
  std::string component_log_level_str_;
202
  std::string log_format_{Logger::Logger::DEFAULT_LOG_FORMAT};
203
  bool log_format_set_{false};
204
  bool log_format_escaped_{false};
205
  std::string log_path_;
206
  uint64_t restart_epoch_{0};
207
  std::string service_cluster_;
208
  std::string service_node_;
209
  std::string service_zone_;
210
  std::chrono::milliseconds file_flush_interval_msec_{10000};
211
  uint64_t file_flush_min_size_kb_{64};
212
  std::chrono::seconds drain_time_{600};
213
  std::chrono::seconds parent_shutdown_time_{900};
214
  Server::DrainStrategy drain_strategy_{Server::DrainStrategy::Gradual};
215
  Server::Mode mode_{Server::Mode::Serve};
216
  bool hot_restart_disabled_{false};
217
  bool signal_handling_enabled_{true};
218
  bool mutex_tracing_enabled_{false};
219
  bool core_dump_enabled_{false};
220
  bool cpuset_threads_{false};
221
  std::vector<std::string> disabled_extensions_;
222
  Stats::TagVector stats_tags_;
223
  uint32_t count_{0};
224

            
225
  // Initialization added here to avoid integration_admin_test failure caused by uninitialized
226
  // enable_fine_grain_logging_.
227
  bool enable_fine_grain_logging_ = false;
228
  std::string socket_path_{"@envoy_domain_socket"};
229
  mode_t socket_mode_{0};
230
};
231

            
232
} // namespace Envoy