1
#include "source/server/admin/init_dump_handler.h"
2

            
3
#include "source/common/http/headers.h"
4
#include "source/common/http/utility.h"
5
#include "source/common/network/utility.h"
6
#include "source/server/admin/utils.h"
7

            
8
namespace Envoy {
9
namespace Server {
10

            
11
10735
InitDumpHandler::InitDumpHandler(Server::Instance& server) : HandlerContextBase(server) {}
12

            
13
Http::Code InitDumpHandler::handlerInitDump(Http::ResponseHeaderMap& response_headers,
14
                                            Buffer::Instance& response,
15
3
                                            AdminStream& admin_stream) const {
16
3
  const absl::optional<std::string> mask =
17
3
      Utility::nonEmptyQueryParam(admin_stream.queryParams(), "mask");
18

            
19
3
  envoy::admin::v3::UnreadyTargetsDumps dump = *dumpUnreadyTargets(mask);
20
3
  MessageUtil::redact(dump);
21

            
22
3
  response_headers.setReferenceContentType(Http::Headers::get().ContentTypeValues.Json);
23
3
  response.add(MessageUtil::getJsonStringFromMessageOrError(dump, true)); // pretty-print
24
3
  return Http::Code::OK;
25
3
}
26

            
27
std::unique_ptr<envoy::admin::v3::UnreadyTargetsDumps>
28
3
InitDumpHandler::dumpUnreadyTargets(const absl::optional<std::string>& component) const {
29
3
  auto unready_targets_dumps = std::make_unique<envoy::admin::v3::UnreadyTargetsDumps>();
30

            
31
3
  if (component.has_value()) {
32
1
    if (component.value() == "listener") {
33
1
      dumpListenerUnreadyTargets(*unready_targets_dumps);
34
1
    }
35
    // More options for unready targets config dump.
36
2
  } else {
37
    // Dump all possible information of unready targets.
38
2
    dumpListenerUnreadyTargets(*unready_targets_dumps);
39
    // More unready targets to add into config dump.
40
2
  }
41
3
  return unready_targets_dumps;
42
3
}
43

            
44
void InitDumpHandler::dumpListenerUnreadyTargets(
45
3
    envoy::admin::v3::UnreadyTargetsDumps& unready_targets_dumps) const {
46
3
  std::vector<std::reference_wrapper<Network::ListenerConfig>> listeners;
47
3
  if (server_.listenerManager().isWorkerStarted()) {
48
3
    listeners = server_.listenerManager().listeners(ListenerManager::WARMING);
49
3
  } else {
50
    listeners = server_.listenerManager().listeners(ListenerManager::ACTIVE);
51
  }
52

            
53
6
  for (const auto& listener_config : listeners) {
54
6
    auto& listener = listener_config.get();
55
6
    listener.initManager().dumpUnreadyTargets(unready_targets_dumps);
56
6
  }
57
3
}
58

            
59
} // namespace Server
60
} // namespace Envoy