1
#pragma once
2

            
3
#include "envoy/extensions/common/aws/v3/credential_provider.pb.h"
4

            
5
#include "source/common/common/logger.h"
6
#include "source/extensions/common/aws/region_provider.h"
7

            
8
namespace Envoy {
9
namespace Extensions {
10
namespace Common {
11
namespace Aws {
12

            
13
/**
14
 * Retrieve AWS region name from the environment
15
 */
16
class EnvironmentRegionProvider : public RegionProvider, public Logger::Loggable<Logger::Id::aws> {
17
public:
18
15
  EnvironmentRegionProvider() = default;
19

            
20
  absl::optional<std::string> getRegion() override;
21

            
22
  absl::optional<std::string> getRegionSet() override;
23
};
24

            
25
class AWSCredentialsFileRegionProvider : public RegionProvider,
26
                                         public Logger::Loggable<Logger::Id::aws> {
27
public:
28
  AWSCredentialsFileRegionProvider(
29
      const envoy::extensions::common::aws::v3::CredentialsFileCredentialProvider&
30
          credential_file_config);
31

            
32
  absl::optional<std::string> getRegion() override;
33

            
34
  absl::optional<std::string> getRegionSet() override;
35

            
36
private:
37
  absl::optional<std::string> credential_file_path_;
38
  absl::optional<std::string> profile_;
39
};
40

            
41
class AWSConfigFileRegionProvider : public RegionProvider,
42
                                    public Logger::Loggable<Logger::Id::aws> {
43
public:
44
18
  AWSConfigFileRegionProvider() = default;
45

            
46
  absl::optional<std::string> getRegion() override;
47

            
48
  absl::optional<std::string> getRegionSet() override;
49
};
50

            
51
class RegionProviderChainFactories {
52
public:
53
12
  virtual ~RegionProviderChainFactories() = default;
54

            
55
  virtual RegionProviderSharedPtr createEnvironmentRegionProvider() const PURE;
56
  virtual RegionProviderSharedPtr createAWSCredentialsFileRegionProvider(
57
      const envoy::extensions::common::aws::v3::CredentialsFileCredentialProvider&
58
          credential_file_config) const PURE;
59
  virtual RegionProviderSharedPtr createAWSConfigFileRegionProvider() const PURE;
60
};
61

            
62
/**
63
 * AWS region provider chain, supporting environment, envoy configuration, AWS config and AWS
64
 * profile.
65
 */
66
class RegionProviderChain : public RegionProvider,
67
                            public RegionProviderChainFactories,
68
                            public Logger::Loggable<Logger::Id::aws> {
69
public:
70
  RegionProviderChain(const envoy::extensions::common::aws::v3::CredentialsFileCredentialProvider&
71
                          credential_file_config = {});
72

            
73
12
  ~RegionProviderChain() override = default;
74

            
75
36
  void add(const RegionProviderSharedPtr& region_provider) {
76
36
    providers_.emplace_back(region_provider);
77
36
  }
78

            
79
  absl::optional<std::string> getRegion() override;
80

            
81
  absl::optional<std::string> getRegionSet() override;
82

            
83
12
  RegionProviderSharedPtr createEnvironmentRegionProvider() const override {
84
12
    return std::make_shared<EnvironmentRegionProvider>();
85
12
  }
86
  RegionProviderSharedPtr createAWSCredentialsFileRegionProvider(
87
      const envoy::extensions::common::aws::v3::CredentialsFileCredentialProvider&
88
12
          credential_file_config) const override {
89
12
    return std::make_shared<AWSCredentialsFileRegionProvider>(credential_file_config);
90
12
  }
91
12
  RegionProviderSharedPtr createAWSConfigFileRegionProvider() const override {
92
12
    return std::make_shared<AWSConfigFileRegionProvider>();
93
12
  }
94

            
95
protected:
96
  std::list<RegionProviderSharedPtr> providers_;
97
};
98

            
99
using EnvironmentRegionProviderPtr = std::shared_ptr<EnvironmentRegionProvider>;
100
using AWSCredentialsFileRegionProviderPtr = std::shared_ptr<AWSCredentialsFileRegionProvider>;
101
using AWSConfigFileRegionProviderPtr = std::shared_ptr<AWSConfigFileRegionProvider>;
102

            
103
} // namespace Aws
104
} // namespace Common
105
} // namespace Extensions
106
} // namespace Envoy