LCOV - code coverage report
Current view: top level - source/common/config - decoded_resource_impl.h (source / functions) Hit Total Coverage
Test: coverage.dat Lines: 27 45 60.0 %
Date: 2024-01-05 06:35:25 Functions: 11 122 9.0 %

          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

Generated by: LCOV version 1.15