forked from envoyproxy/envoy
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmetadata.cc
120 lines (107 loc) · 4.32 KB
/
metadata.cc
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
111
112
113
114
115
116
117
118
119
120
#include "source/common/config/metadata.h"
#include "envoy/config/core/v3/base.pb.h"
#include "envoy/type/metadata/v3/metadata.pb.h"
#include "source/common/protobuf/utility.h"
namespace Envoy {
namespace Config {
SINGLETON_MANAGER_REGISTRATION(const_metadata_shared_pool);
MetadataKey::MetadataKey(const envoy::type::metadata::v3::MetadataKey& metadata_key)
: key_(metadata_key.key()) {
for (const auto& seg : metadata_key.path()) {
path_.push_back(seg.key());
}
}
const ProtobufWkt::Value& Metadata::metadataValue(const envoy::config::core::v3::Metadata* metadata,
const MetadataKey& metadata_key) {
return metadataValue(metadata, metadata_key.key_, metadata_key.path_);
}
const ProtobufWkt::Value& Metadata::metadataValue(const envoy::config::core::v3::Metadata* metadata,
const std::string& filter,
const std::vector<std::string>& path) {
if (!metadata) {
return ProtobufWkt::Value::default_instance();
}
const auto filter_it = metadata->filter_metadata().find(filter);
if (filter_it == metadata->filter_metadata().end()) {
return ProtobufWkt::Value::default_instance();
}
const ProtobufWkt::Struct* data_struct = &(filter_it->second);
const ProtobufWkt::Value* val = nullptr;
// go through path to select sub entries
for (const auto& p : path) {
if (nullptr == data_struct) { // sub entry not found
return ProtobufWkt::Value::default_instance();
}
const auto entry_it = data_struct->fields().find(p);
if (entry_it == data_struct->fields().end()) {
return ProtobufWkt::Value::default_instance();
}
val = &(entry_it->second);
if (val->has_struct_value()) {
data_struct = &(val->struct_value());
} else {
data_struct = nullptr;
}
}
if (nullptr == val) {
return ProtobufWkt::Value::default_instance();
}
return *val;
}
const ProtobufWkt::Value& Metadata::metadataValue(const envoy::config::core::v3::Metadata* metadata,
const std::string& filter,
const std::string& key) {
const std::vector<std::string> path{key};
return metadataValue(metadata, filter, path);
}
ProtobufWkt::Value& Metadata::mutableMetadataValue(envoy::config::core::v3::Metadata& metadata,
const std::string& filter,
const std::string& key) {
return (*(*metadata.mutable_filter_metadata())[filter].mutable_fields())[key];
}
bool Metadata::metadataLabelMatch(const LabelSet& label_set,
const envoy::config::core::v3::Metadata* host_metadata,
const std::string& filter_key, bool list_as_any) {
if (!host_metadata) {
return label_set.empty();
}
const auto filter_it = host_metadata->filter_metadata().find(filter_key);
if (filter_it == host_metadata->filter_metadata().end()) {
return label_set.empty();
}
const ProtobufWkt::Struct& data_struct = filter_it->second;
const auto& fields = data_struct.fields();
for (const auto& kv : label_set) {
const auto entry_it = fields.find(kv.first);
if (entry_it == fields.end()) {
return false;
}
if (list_as_any && entry_it->second.kind_case() == ProtobufWkt::Value::kListValue) {
bool any_match = false;
for (const auto& v : entry_it->second.list_value().values()) {
if (ValueUtil::equal(v, kv.second)) {
any_match = true;
break;
}
}
if (!any_match) {
return false;
}
} else if (!ValueUtil::equal(entry_it->second, kv.second)) {
return false;
}
}
return true;
}
ConstMetadataSharedPoolSharedPtr
Metadata::getConstMetadataSharedPool(Singleton::Manager& manager, Event::Dispatcher& dispatcher) {
return manager
.getTyped<SharedPool::ObjectSharedPool<const envoy::config::core::v3::Metadata, MessageUtil>>(
SINGLETON_MANAGER_REGISTERED_NAME(const_metadata_shared_pool), [&dispatcher] {
return std::make_shared<
SharedPool::ObjectSharedPool<const envoy::config::core::v3::Metadata, MessageUtil>>(
dispatcher);
});
}
} // namespace Config
} // namespace Envoy