1
#pragma once
2

            
3
#include <functional>
4
#include <memory>
5
#include <string>
6

            
7
#include "envoy/common/pure.h"
8
#include "envoy/config/typed_config.h"
9
#include "envoy/router/router.h"
10
#include "envoy/server/factory_context.h"
11

            
12
namespace Envoy {
13
namespace Router {
14

            
15
/**
16
 * Interface class for creating cluster specifier plugin from related route entry.
17
 */
18
class ClusterSpecifierPlugin {
19
public:
20
231
  virtual ~ClusterSpecifierPlugin() = default;
21

            
22
  /**
23
   * Validate if the clusters are valid in the cluster manager. The derived class
24
   * should override it if the validation is needed.
25
   *
26
   * @param cm cluster manager.
27
   * @return absl::Status status.
28
   */
29
102
  virtual absl::Status validateClusters(const Upstream::ClusterManager&) const {
30
102
    return absl::OkStatus();
31
102
  }
32

            
33
  /**
34
   * Create route from related route entry and request headers.
35
   *
36
   * @param parent related route.
37
   * @param headers request headers.
38
   * @param stream_info stream info of the downstream request.
39
   * @param random random value for cluster selection.
40
   * @return RouteConstSharedPtr final route with specific cluster.
41
   */
42
  virtual RouteConstSharedPtr route(RouteEntryAndRouteConstSharedPtr parent,
43
                                    const Http::RequestHeaderMap& headers,
44
                                    const StreamInfo::StreamInfo& stream_info,
45
                                    uint64_t random) const PURE;
46
};
47

            
48
using ClusterSpecifierPluginSharedPtr = std::shared_ptr<ClusterSpecifierPlugin>;
49

            
50
/*
51
 * Extension configuration for cluster specifier plugin factory.
52
 */
53
class ClusterSpecifierPluginFactoryConfig : public Envoy::Config::TypedFactory {
54
public:
55
  /**
56
   * Creates a particular cluster specifier plugin factory implementation.
57
   *
58
   * @param config supplies the configuration for the cluster specifier plugin factory extension.
59
   * @return ClusterSpecifierPluginSharedPtr cluster specifier plugin use to create final route from
60
   * request headers.
61
   */
62
  virtual ClusterSpecifierPluginSharedPtr
63
  createClusterSpecifierPlugin(const Protobuf::Message& config,
64
                               Server::Configuration::ServerFactoryContext& context) PURE;
65

            
66
21
  std::string category() const override { return "envoy.router.cluster_specifier_plugin"; }
67
};
68

            
69
using ClusterSpecifierPluginFactoryConfigPtr = std::unique_ptr<ClusterSpecifierPluginFactoryConfig>;
70

            
71
} // namespace Router
72
} // namespace Envoy