1
#include "source/common/config/custom_config_validators_impl.h"
2

            
3
#include "source/common/config/opaque_resource_decoder_impl.h"
4
#include "source/common/config/utility.h"
5

            
6
namespace Envoy {
7
namespace Config {
8

            
9
CustomConfigValidatorsImpl::CustomConfigValidatorsImpl(
10
    ProtobufMessage::ValidationVisitor& validation_visitor, const Server::Instance& server,
11
    const Protobuf::RepeatedPtrField<envoy::config::core::v3::TypedExtensionConfig>&
12
        validators_configs)
13
1697
    : server_(server) {
14
1697
  for (const auto& validator_config : validators_configs) {
15
17
    auto& factory =
16
17
        Config::Utility::getAndCheckFactory<Config::ConfigValidatorFactory>(validator_config);
17
17
    const auto validator_type_url = factory.typeUrl();
18
17
    Config::ConfigValidatorPtr validator =
19
17
        factory.createConfigValidator(validator_config.typed_config(), validation_visitor);
20

            
21
    // Insert a new vector for the type url if one doesn't exist.
22
17
    auto pair = validators_map_.emplace(validator_type_url, 0);
23
17
    pair.first->second.emplace_back(std::move(validator));
24
17
  }
25
1697
}
26

            
27
void CustomConfigValidatorsImpl::executeValidators(
28
2139
    absl::string_view type_url, const std::vector<DecodedResourcePtr>& resources) {
29
2139
  auto validators_it = validators_map_.find(type_url);
30
2139
  if (validators_it != validators_map_.end()) {
31
11
    auto& validators = validators_it->second;
32
12
    for (auto& validator : validators) {
33
      // A validator can either succeed, or throw an EnvoyException.
34
12
      validator->validate(server_, resources);
35
12
    }
36
11
  }
37
2139
}
38

            
39
void CustomConfigValidatorsImpl::executeValidators(
40
    absl::string_view type_url, const std::vector<DecodedResourcePtr>& added_resources,
41
1705
    const Protobuf::RepeatedPtrField<std::string>& removed_resources) {
42
1705
  auto validators_it = validators_map_.find(type_url);
43
1705
  if (validators_it != validators_map_.end()) {
44
11
    auto& validators = validators_it->second;
45
12
    for (auto& validator : validators) {
46
      // A validator can either succeed, or throw an EnvoyException.
47
12
      validator->validate(server_, added_resources, removed_resources);
48
12
    }
49
11
  }
50
1705
}
51

            
52
} // namespace Config
53
} // namespace Envoy