1
#pragma once
2

            
3
#include <memory>
4

            
5
#include "envoy/common/pure.h"
6
#include "envoy/rds/config.h"
7
#include "envoy/server/factory_context.h"
8

            
9
#include "source/common/protobuf/protobuf.h"
10

            
11
namespace Envoy {
12
namespace Rds {
13

            
14
/**
15
 * Traits of the protocol specific route configuration and proto.
16
 * The generic rds classes will call the methods of this interface
17
 * to get information which is not visible for them directly.
18
 */
19
class ProtoTraits {
20
public:
21
10094
  virtual ~ProtoTraits() = default;
22

            
23
  /**
24
   * Give the full name of the route configuration proto description.
25
   * For example 'envoy.config.route.v3.RouteConfiguration'
26
   */
27
  virtual const std::string& resourceType() const PURE;
28

            
29
  /**
30
   * Gives back the name field tag number of the route configuration proto.
31
   */
32
  virtual int resourceNameFieldNumber() const PURE;
33

            
34
  /**
35
   * Create an empty route configuration proto object.
36
   */
37
  virtual ProtobufTypes::MessagePtr createEmptyProto() const PURE;
38
};
39

            
40
class ConfigTraits {
41
public:
42
811
  virtual ~ConfigTraits() = default;
43

            
44
  /**
45
   * Create a dummy config object without actual route configuration.
46
   * This object will be used before the first valid route configuration is fetched.
47
   */
48
  virtual ConfigConstSharedPtr createNullConfig() const PURE;
49

            
50
  /**
51
   * Create a config object based on a route configuration.
52
   * The full name of the type of the parameter message is
53
   * guaranteed to match with the return value of ProtoTraits::resourceType.
54
   * Both dynamic or static cast can be applied to downcast the message
55
   * to the corresponding route configuration class.
56
   * @param rc supplies the RouteConfiguration.
57
   * @param context supplies the context of the server factory.
58
   * @param validate_clusters_default specifies whether the clusters that the route
59
   *    table refers to will be validated by the cluster manager. Currently thrift
60
   *    route config provider manager validates the clusters for static route config
61
   *    by default but doesn't validate the clusters for TRDS.
62
   * @throw EnvoyException if the new config can't be applied of.
63
   */
64
  virtual ConfigConstSharedPtr createConfig(const Protobuf::Message& rc,
65
                                            Server::Configuration::ServerFactoryContext& context,
66
                                            bool validate_clusters_default) const PURE;
67
};
68

            
69
} // namespace Rds
70
} // namespace Envoy