forked from envoyproxy/envoy
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdecoded_resource_impl.h
110 lines (90 loc) · 4.62 KB
/
decoded_resource_impl.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
#pragma once
#include "envoy/config/subscription.h"
#include "envoy/service/discovery/v3/discovery.pb.h"
#include "source/common/protobuf/utility.h"
#include "xds/core/v3/collection_entry.pb.h"
namespace Envoy {
namespace Config {
namespace {
std::vector<std::string>
repeatedPtrFieldToVector(const Protobuf::RepeatedPtrField<std::string>& xs) {
std::vector<std::string> ys;
std::copy(xs.begin(), xs.end(), std::back_inserter(ys));
return ys;
}
} // namespace
class DecodedResourceImpl;
using DecodedResourceImplPtr = std::unique_ptr<DecodedResourceImpl>;
class DecodedResourceImpl : public DecodedResource {
public:
static DecodedResourceImplPtr fromResource(OpaqueResourceDecoder& resource_decoder,
const ProtobufWkt::Any& resource,
const std::string& version) {
if (resource.Is<envoy::service::discovery::v3::Resource>()) {
envoy::service::discovery::v3::Resource r;
MessageUtil::unpackTo(resource, r);
r.set_version(version);
return std::make_unique<DecodedResourceImpl>(resource_decoder, r);
}
return std::unique_ptr<DecodedResourceImpl>(new DecodedResourceImpl(
resource_decoder, absl::nullopt, Protobuf::RepeatedPtrField<std::string>(), resource, true,
version, absl::nullopt));
}
DecodedResourceImpl(OpaqueResourceDecoder& resource_decoder,
const envoy::service::discovery::v3::Resource& resource)
: DecodedResourceImpl(resource_decoder, resource.name(), resource.aliases(),
resource.resource(), resource.has_resource(), resource.version(),
resource.has_ttl()
? absl::make_optional(std::chrono::milliseconds(
DurationUtil::durationToMilliseconds(resource.ttl())))
: absl::nullopt) {}
DecodedResourceImpl(OpaqueResourceDecoder& resource_decoder,
const xds::core::v3::CollectionEntry::InlineEntry& inline_entry)
: DecodedResourceImpl(resource_decoder, inline_entry.name(),
Protobuf::RepeatedPtrField<std::string>(), inline_entry.resource(),
true, inline_entry.version(), absl::nullopt) {}
DecodedResourceImpl(ProtobufTypes::MessagePtr resource, const std::string& name,
const std::vector<std::string>& aliases, const std::string& version)
: resource_(std::move(resource)), has_resource_(true), name_(name), aliases_(aliases),
version_(version), ttl_(absl::nullopt) {}
// Config::DecodedResource
const std::string& name() const override { return name_; }
const std::vector<std::string>& aliases() const override { return aliases_; }
const std::string& version() const override { return version_; };
const Protobuf::Message& resource() const override { return *resource_; };
bool hasResource() const override { return has_resource_; }
absl::optional<std::chrono::milliseconds> ttl() const override { return ttl_; }
private:
DecodedResourceImpl(OpaqueResourceDecoder& resource_decoder, absl::optional<std::string> name,
const Protobuf::RepeatedPtrField<std::string>& aliases,
const ProtobufWkt::Any& resource, bool has_resource,
const std::string& version, absl::optional<std::chrono::milliseconds> ttl)
: resource_(resource_decoder.decodeResource(resource)), has_resource_(has_resource),
name_(name ? *name : resource_decoder.resourceName(*resource_)),
aliases_(repeatedPtrFieldToVector(aliases)), version_(version), ttl_(ttl) {}
const ProtobufTypes::MessagePtr resource_;
const bool has_resource_;
const std::string name_;
const std::vector<std::string> aliases_;
const std::string version_;
// Per resource TTL.
const absl::optional<std::chrono::milliseconds> ttl_;
};
struct DecodedResourcesWrapper {
DecodedResourcesWrapper() = default;
DecodedResourcesWrapper(OpaqueResourceDecoder& resource_decoder,
const Protobuf::RepeatedPtrField<ProtobufWkt::Any>& resources,
const std::string& version) {
for (const auto& resource : resources) {
pushBack((DecodedResourceImpl::fromResource(resource_decoder, resource, version)));
}
}
void pushBack(Config::DecodedResourcePtr&& resource) {
owned_resources_.push_back(std::move(resource));
refvec_.emplace_back(*owned_resources_.back());
}
std::vector<Config::DecodedResourcePtr> owned_resources_;
std::vector<Config::DecodedResourceRef> refvec_;
};
} // namespace Config
} // namespace Envoy