Line data Source code
1 : #pragma once
2 :
3 : #include "envoy/common/optref.h"
4 : #include "envoy/config/subscription.h"
5 : #include "envoy/service/discovery/v3/discovery.pb.h"
6 :
7 : #include "source/common/protobuf/utility.h"
8 :
9 : #include "xds/core/v3/collection_entry.pb.h"
10 :
11 : namespace Envoy {
12 : namespace Config {
13 :
14 : namespace {
15 :
16 : std::vector<std::string>
17 398 : repeatedPtrFieldToVector(const Protobuf::RepeatedPtrField<std::string>& xs) {
18 398 : std::vector<std::string> ys;
19 398 : std::copy(xs.begin(), xs.end(), std::back_inserter(ys));
20 398 : return ys;
21 398 : }
22 :
23 : } // namespace
24 :
25 : class DecodedResourceImpl;
26 : using DecodedResourceImplPtr = std::unique_ptr<DecodedResourceImpl>;
27 :
28 : class DecodedResourceImpl : public DecodedResource {
29 : public:
30 : static DecodedResourceImplPtr fromResource(OpaqueResourceDecoder& resource_decoder,
31 : const ProtobufWkt::Any& resource,
32 354 : const std::string& version) {
33 354 : if (resource.Is<envoy::service::discovery::v3::Resource>()) {
34 0 : envoy::service::discovery::v3::Resource r;
35 0 : MessageUtil::unpackTo(resource, r);
36 0 :
37 0 : r.set_version(version);
38 0 :
39 0 : return std::make_unique<DecodedResourceImpl>(resource_decoder, r);
40 0 : }
41 0 :
42 354 : return std::unique_ptr<DecodedResourceImpl>(new DecodedResourceImpl(
43 354 : resource_decoder, absl::nullopt, Protobuf::RepeatedPtrField<std::string>(), resource, true,
44 354 : version, absl::nullopt, absl::nullopt));
45 354 : }
46 :
47 : static DecodedResourceImplPtr
48 : fromResource(OpaqueResourceDecoder& resource_decoder,
49 0 : const envoy::service::discovery::v3::Resource& resource) {
50 0 : return std::make_unique<DecodedResourceImpl>(resource_decoder, resource);
51 0 : }
52 :
53 : DecodedResourceImpl(OpaqueResourceDecoder& resource_decoder,
54 : const envoy::service::discovery::v3::Resource& resource)
55 : : DecodedResourceImpl(
56 : resource_decoder, resource.name(), resource.aliases(), resource.resource(),
57 : resource.has_resource(), resource.version(),
58 : resource.has_ttl() ? absl::make_optional(std::chrono::milliseconds(
59 : DurationUtil::durationToMilliseconds(resource.ttl())))
60 : : absl::nullopt,
61 44 : resource.has_metadata() ? absl::make_optional(resource.metadata()) : absl::nullopt) {}
62 : DecodedResourceImpl(OpaqueResourceDecoder& resource_decoder,
63 : const xds::core::v3::CollectionEntry::InlineEntry& inline_entry)
64 : : DecodedResourceImpl(resource_decoder, inline_entry.name(),
65 : Protobuf::RepeatedPtrField<std::string>(), inline_entry.resource(),
66 0 : true, inline_entry.version(), absl::nullopt, absl::nullopt) {}
67 : DecodedResourceImpl(ProtobufTypes::MessagePtr resource, const std::string& name,
68 : const std::vector<std::string>& aliases, const std::string& version)
69 : : resource_(std::move(resource)), has_resource_(true), name_(name), aliases_(aliases),
70 0 : version_(version), ttl_(absl::nullopt), metadata_(absl::nullopt) {}
71 :
72 : // Config::DecodedResource
73 958 : const std::string& name() const override { return name_; }
74 0 : const std::vector<std::string>& aliases() const override { return aliases_; }
75 264 : const std::string& version() const override { return version_; };
76 376 : const Protobuf::Message& resource() const override { return *resource_; };
77 284 : bool hasResource() const override { return has_resource_; }
78 284 : absl::optional<std::chrono::milliseconds> ttl() const override { return ttl_; }
79 0 : const OptRef<const envoy::config::core::v3::Metadata> metadata() const override {
80 0 : return metadata_.has_value() ? makeOptRef(metadata_.value()) : absl::nullopt;
81 0 : }
82 :
83 : private:
84 : DecodedResourceImpl(OpaqueResourceDecoder& resource_decoder, absl::optional<std::string> name,
85 : const Protobuf::RepeatedPtrField<std::string>& aliases,
86 : const ProtobufWkt::Any& resource, bool has_resource,
87 : const std::string& version, absl::optional<std::chrono::milliseconds> ttl,
88 : const absl::optional<envoy::config::core::v3::Metadata>& metadata)
89 : : resource_(resource_decoder.decodeResource(resource)), has_resource_(has_resource),
90 : name_(name ? *name : resource_decoder.resourceName(*resource_)),
91 : aliases_(repeatedPtrFieldToVector(aliases)), version_(version), ttl_(ttl),
92 398 : metadata_(metadata) {}
93 :
94 : const ProtobufTypes::MessagePtr resource_;
95 : const bool has_resource_;
96 : const std::string name_;
97 : const std::vector<std::string> aliases_;
98 : const std::string version_;
99 : // Per resource TTL.
100 : const absl::optional<std::chrono::milliseconds> ttl_;
101 :
102 : // This is the metadata info under the Resource wrapper.
103 : // It is intended to be consumed in the xds_config_tracker extension.
104 : const absl::optional<envoy::config::core::v3::Metadata> metadata_;
105 : };
106 :
107 : struct DecodedResourcesWrapper {
108 0 : DecodedResourcesWrapper() = default;
109 : DecodedResourcesWrapper(OpaqueResourceDecoder& resource_decoder,
110 : const Protobuf::RepeatedPtrField<ProtobufWkt::Any>& resources,
111 70 : const std::string& version) {
112 70 : for (const auto& resource : resources) {
113 70 : pushBack((DecodedResourceImpl::fromResource(resource_decoder, resource, version)));
114 70 : }
115 70 : }
116 :
117 70 : void pushBack(Config::DecodedResourcePtr&& resource) {
118 70 : owned_resources_.push_back(std::move(resource));
119 70 : refvec_.emplace_back(*owned_resources_.back());
120 70 : }
121 :
122 : std::vector<Config::DecodedResourcePtr> owned_resources_;
123 : std::vector<Config::DecodedResourceRef> refvec_;
124 : };
125 :
126 : } // namespace Config
127 : } // namespace Envoy
|