1
#pragma once
2

            
3
#include "envoy/extensions/transport_sockets/internal_upstream/v3/internal_upstream.pb.h"
4
#include "envoy/server/transport_socket_config.h"
5
#include "envoy/stats/stats_macros.h"
6

            
7
#include "source/common/common/logger.h"
8
#include "source/extensions/io_socket/user_space/io_handle.h"
9
#include "source/extensions/transport_sockets/common/passthrough.h"
10

            
11
namespace Envoy {
12
namespace Extensions {
13
namespace TransportSockets {
14
namespace InternalUpstream {
15

            
16
20
#define ALL_INTERNAL_UPSTREAM_STATS(COUNTER) COUNTER(no_metadata)
17

            
18
/**
19
 * Struct definition for all internal transport socket stats. @see stats_macros.h
20
 */
21
struct InternalUpstreamStats {
22
  ALL_INTERNAL_UPSTREAM_STATS(GENERATE_COUNTER_STRUCT)
23
};
24

            
25
class Config : public Logger::Loggable<Logger::Id::upstream> {
26
public:
27
  Config(
28
      const envoy::extensions::transport_sockets::internal_upstream::v3::InternalUpstreamTransport&
29
          config_proto,
30
      Stats::Scope& scope);
31
  std::unique_ptr<envoy::config::core::v3::Metadata>
32
  extractMetadata(const Upstream::HostDescriptionConstSharedPtr& host) const;
33

            
34
private:
35
  enum class MetadataKind { Host, Cluster };
36
  struct MetadataSource {
37
36
    MetadataSource(MetadataKind kind, const std::string& name) : kind_(kind), name_(name) {}
38
    const MetadataKind kind_;
39
    const std::string name_;
40
  };
41
  InternalUpstreamStats stats_;
42
  std::vector<MetadataSource> metadata_sources_;
43
};
44

            
45
class InternalSocketFactory : public PassthroughFactory {
46
public:
47
  InternalSocketFactory(
48
      Server::Configuration::TransportSocketFactoryContext& context,
49
      const envoy::extensions::transport_sockets::internal_upstream::v3::InternalUpstreamTransport&
50
          config_proto,
51
      Network::UpstreamTransportSocketFactoryPtr&& inner_factory);
52

            
53
  Network::TransportSocketPtr
54
  createTransportSocket(Network::TransportSocketOptionsConstSharedPtr options,
55
                        Upstream::HostDescriptionConstSharedPtr host) const override;
56

            
57
private:
58
  const Config config_;
59
};
60

            
61
} // namespace InternalUpstream
62
} // namespace TransportSockets
63
} // namespace Extensions
64
} // namespace Envoy