Coverage Report

Created: 2024-09-19 09:45

/proc/self/cwd/source/common/config/metadata.cc
Line
Count
Source (jump to first uncovered line)
1
#include "source/common/config/metadata.h"
2
3
#include "envoy/config/core/v3/base.pb.h"
4
#include "envoy/type/metadata/v3/metadata.pb.h"
5
6
#include "source/common/protobuf/utility.h"
7
8
namespace Envoy {
9
namespace Config {
10
11
SINGLETON_MANAGER_REGISTRATION(const_metadata_shared_pool);
12
13
MetadataKey::MetadataKey(const envoy::type::metadata::v3::MetadataKey& metadata_key)
14
25.6k
    : key_(metadata_key.key()) {
15
25.6k
  for (const auto& seg : metadata_key.path()) {
16
5.57k
    path_.push_back(seg.key());
17
5.57k
  }
18
25.6k
}
19
20
const ProtobufWkt::Value& Metadata::metadataValue(const envoy::config::core::v3::Metadata* metadata,
21
0
                                                  const MetadataKey& metadata_key) {
22
0
  return metadataValue(metadata, metadata_key.key_, metadata_key.path_);
23
0
}
24
25
const ProtobufWkt::Value& Metadata::metadataValue(const envoy::config::core::v3::Metadata* metadata,
26
                                                  const std::string& filter,
27
210k
                                                  const std::vector<std::string>& path) {
28
210k
  if (!metadata) {
29
206k
    return ProtobufWkt::Value::default_instance();
30
206k
  }
31
4.30k
  const auto filter_it = metadata->filter_metadata().find(filter);
32
4.30k
  if (filter_it == metadata->filter_metadata().end()) {
33
3.93k
    return ProtobufWkt::Value::default_instance();
34
3.93k
  }
35
377
  const ProtobufWkt::Struct* data_struct = &(filter_it->second);
36
377
  const ProtobufWkt::Value* val = nullptr;
37
  // go through path to select sub entries
38
510
  for (const auto& p : path) {
39
510
    if (nullptr == data_struct) { // sub entry not found
40
10
      return ProtobufWkt::Value::default_instance();
41
10
    }
42
500
    const auto entry_it = data_struct->fields().find(p);
43
500
    if (entry_it == data_struct->fields().end()) {
44
20
      return ProtobufWkt::Value::default_instance();
45
20
    }
46
480
    val = &(entry_it->second);
47
480
    if (val->has_struct_value()) {
48
133
      data_struct = &(val->struct_value());
49
347
    } else {
50
347
      data_struct = nullptr;
51
347
    }
52
480
  }
53
347
  if (nullptr == val) {
54
0
    return ProtobufWkt::Value::default_instance();
55
0
  }
56
347
  return *val;
57
347
}
58
59
const ProtobufWkt::Value& Metadata::metadataValue(const envoy::config::core::v3::Metadata* metadata,
60
                                                  const std::string& filter,
61
206k
                                                  const std::string& key) {
62
206k
  const std::vector<std::string> path{key};
63
206k
  return metadataValue(metadata, filter, path);
64
206k
}
65
66
ProtobufWkt::Value& Metadata::mutableMetadataValue(envoy::config::core::v3::Metadata& metadata,
67
                                                   const std::string& filter,
68
0
                                                   const std::string& key) {
69
0
  return (*(*metadata.mutable_filter_metadata())[filter].mutable_fields())[key];
70
0
}
71
72
bool Metadata::metadataLabelMatch(const LabelSet& label_set,
73
                                  const envoy::config::core::v3::Metadata* host_metadata,
74
0
                                  const std::string& filter_key, bool list_as_any) {
75
0
  if (!host_metadata) {
76
0
    return label_set.empty();
77
0
  }
78
0
  const auto filter_it = host_metadata->filter_metadata().find(filter_key);
79
0
  if (filter_it == host_metadata->filter_metadata().end()) {
80
0
    return label_set.empty();
81
0
  }
82
0
  const ProtobufWkt::Struct& data_struct = filter_it->second;
83
0
  const auto& fields = data_struct.fields();
84
0
  for (const auto& kv : label_set) {
85
0
    const auto entry_it = fields.find(kv.first);
86
0
    if (entry_it == fields.end()) {
87
0
      return false;
88
0
    }
89
90
0
    if (list_as_any && entry_it->second.kind_case() == ProtobufWkt::Value::kListValue) {
91
0
      bool any_match = false;
92
0
      for (const auto& v : entry_it->second.list_value().values()) {
93
0
        if (ValueUtil::equal(v, kv.second)) {
94
0
          any_match = true;
95
0
          break;
96
0
        }
97
0
      }
98
0
      if (!any_match) {
99
0
        return false;
100
0
      }
101
0
    } else if (!ValueUtil::equal(entry_it->second, kv.second)) {
102
0
      return false;
103
0
    }
104
0
  }
105
0
  return true;
106
0
}
107
108
ConstMetadataSharedPoolSharedPtr
109
2.40k
Metadata::getConstMetadataSharedPool(Singleton::Manager& manager, Event::Dispatcher& dispatcher) {
110
2.40k
  return manager.getTyped<SharedPool::ObjectSharedPool<const envoy::config::core::v3::Metadata,
111
2.40k
                                                       MessageUtil, MessageUtil>>(
112
2.40k
      SINGLETON_MANAGER_REGISTERED_NAME(const_metadata_shared_pool), [&dispatcher] {
113
1.97k
        return std::make_shared<SharedPool::ObjectSharedPool<
114
1.97k
            const envoy::config::core::v3::Metadata, MessageUtil, MessageUtil>>(dispatcher);
115
1.97k
      });
116
2.40k
}
117
118
} // namespace Config
119
} // namespace Envoy