1
#pragma once
2

            
3
#include "envoy/server/resource_monitor_config.h"
4

            
5
#include "source/common/protobuf/utility.h"
6

            
7
namespace Envoy {
8
namespace Extensions {
9
namespace ResourceMonitors {
10
namespace Common {
11

            
12
template <class ConfigProto>
13
class FactoryBase : public Server::Configuration::ResourceMonitorFactory {
14
public:
15
  Server::ResourceMonitorPtr
16
  createResourceMonitor(const Protobuf::Message& config,
17
14
                        Server::Configuration::ResourceMonitorFactoryContext& context) override {
18
14
    return createResourceMonitorFromProtoTyped(MessageUtil::downcastAndValidate<const ConfigProto&>(
19
14
                                                   config, context.messageValidationVisitor()),
20
14
                                               context);
21
14
  }
22

            
23
11
  ProtobufTypes::MessagePtr createEmptyConfigProto() override {
24
11
    return std::make_unique<ConfigProto>();
25
11
  }
26

            
27
26
  std::string name() const override { return name_; }
28

            
29
protected:
30
17
  FactoryBase(const std::string& name) : name_(name) {}
31

            
32
private:
33
  virtual Server::ResourceMonitorPtr createResourceMonitorFromProtoTyped(
34
      const ConfigProto& config,
35
      Server::Configuration::ResourceMonitorFactoryContext& context) PURE;
36

            
37
  const std::string name_;
38
};
39

            
40
template <class ConfigProto>
41
class ProactiveFactoryBase : public Server::Configuration::ProactiveResourceMonitorFactory {
42
public:
43
  Server::ProactiveResourceMonitorPtr createProactiveResourceMonitor(
44
      const Protobuf::Message& config,
45
7
      Server::Configuration::ResourceMonitorFactoryContext& context) override {
46
7
    return createProactiveResourceMonitorFromProtoTyped(
47
7
        MessageUtil::downcastAndValidate<const ConfigProto&>(config,
48
7
                                                             context.messageValidationVisitor()),
49
7
        context);
50
7
  }
51

            
52
6
  ProtobufTypes::MessagePtr createEmptyConfigProto() override {
53
6
    return std::make_unique<ConfigProto>();
54
6
  }
55

            
56
11
  std::string name() const override { return name_; }
57

            
58
protected:
59
5
  ProactiveFactoryBase(const std::string& name) : name_(name) {}
60

            
61
private:
62
  virtual Server::ProactiveResourceMonitorPtr createProactiveResourceMonitorFromProtoTyped(
63
      const ConfigProto& config,
64
      Server::Configuration::ResourceMonitorFactoryContext& context) PURE;
65

            
66
  const std::string name_;
67
};
68

            
69
} // namespace Common
70
} // namespace ResourceMonitors
71
} // namespace Extensions
72
} // namespace Envoy