forked from envoyproxy/envoy
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain_common.h
120 lines (101 loc) · 4.2 KB
/
main_common.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
#pragma once
#include "envoy/event/timer.h"
#include "envoy/runtime/runtime.h"
#include "envoy/server/platform.h"
#include "source/common/common/thread.h"
#include "source/common/event/real_time_system.h"
#include "source/common/grpc/google_grpc_context.h"
#include "source/common/stats/symbol_table.h"
#include "source/common/stats/thread_local_store.h"
#include "source/common/thread_local/thread_local_impl.h"
#include "source/exe/process_wide.h"
#include "source/exe/stripped_main_base.h"
#include "source/server/listener_hooks.h"
#include "source/server/options_impl.h"
#include "source/server/server.h"
#ifdef ENVOY_HANDLE_SIGNALS
#include "source/common/signal/signal_action.h"
#include "source/exe/terminate_handler.h"
#endif
namespace Envoy {
class MainCommonBase : public StrippedMainBase {
public:
using StrippedMainBase::StrippedMainBase;
bool run();
#ifdef ENVOY_ADMIN_FUNCTIONALITY
using AdminRequestFn =
std::function<void(const Http::ResponseHeaderMap& response_headers, absl::string_view body)>;
// Makes an admin-console request by path, calling handler() when complete.
// The caller can initiate this from any thread, but it posts the request
// onto the main thread, so the handler is called asynchronously.
//
// This is designed to be called from downstream consoles, so they can access
// the admin console information stream without opening up a network port.
//
// This should only be called while run() is active; ensuring this is the
// responsibility of the caller.
//
// TODO(jmarantz): consider std::future for encapsulating this delayed request
// semantics, rather than a handler callback.
void adminRequest(absl::string_view path_and_query, absl::string_view method,
const AdminRequestFn& handler);
#endif
};
// This is separate from MainCommonBase for legacy reasons: sufficient
// downstream tests use one or the other that resolving is deemed problematic.
class MainCommon {
public:
// Hook to run after a server is created.
using PostServerHook = std::function<void(Server::Instance& server)>;
MainCommon(int argc, const char* const* argv);
MainCommon(const std::vector<std::string>& args);
bool run() { return base_.run(); }
// Only tests have a legitimate need for this today.
Event::Dispatcher& dispatcherForTest() { return base_.server()->dispatcher(); }
#ifdef ENVOY_ADMIN_FUNCTIONALITY
// Makes an admin-console request by path, calling handler() when complete.
// The caller can initiate this from any thread, but it posts the request
// onto the main thread, so the handler is called asynchronously.
//
// This is designed to be called from downstream consoles, so they can access
// the admin console information stream without opening up a network port.
//
// This should only be called while run() is active; ensuring this is the
// responsibility of the caller.
void adminRequest(absl::string_view path_and_query, absl::string_view method,
const MainCommonBase::AdminRequestFn& handler) {
base_.adminRequest(path_and_query, method, handler);
}
#endif
static std::string hotRestartVersion(bool hot_restart_enabled);
/**
* @return a pointer to the server instance, or nullptr if initialized into
* validation mode.
*/
Server::Instance* server() { return base_.server(); }
/**
* Instantiates a MainCommon using default factory implements, parses args,
* and runs an event loop depending on the mode.
*
* Note that MainCommonBase can also be directly instantiated, providing the
* opportunity to override subsystem implementations for custom
* implementations.
*
* @param argc number of command-line args
* @param argv command-line argument array
* @param hook optional hook to run after a server is created
*/
static int main(int argc, char** argv, PostServerHook hook = nullptr);
private:
Thread::MainThread main_thread_;
#ifdef ENVOY_HANDLE_SIGNALS
Envoy::SignalAction handle_sigs_;
Envoy::TerminateHandler log_on_terminate_;
#endif
Envoy::OptionsImpl options_;
Event::RealTimeSystem real_time_system_;
DefaultListenerHooks default_listener_hooks_;
ProdComponentFactory prod_component_factory_;
MainCommonBase base_;
};
} // namespace Envoy