diff --git a/extensions/common/metadata_object.cc b/extensions/common/metadata_object.cc index 1c81d9c32d4..23d42bc25c4 100644 --- a/extensions/common/metadata_object.cc +++ b/extensions/common/metadata_object.cc @@ -14,6 +14,7 @@ #include "extensions/common/metadata_object.h" +#include "absl/strings/str_join.h" #include "flatbuffers/flatbuffers.h" #include "source/common/common/hash.h" @@ -126,12 +127,48 @@ std::string WorkloadMetadataObject::baggage() const { default: break; } - return absl::StrCat("k8s.cluster.name=", cluster_name_, - ",k8s.namespace.name=", namespace_name_, ",k8s.", - workload_type, ".name=", workload_name_, - ",service.name=", canonical_name_, - ",service.version=", canonical_revision_, - ",app.name=", app_name_, ",app.version=", app_version_); + std::vector parts; + parts.push_back("k8s."); + parts.push_back(workload_type); + parts.push_back(".name="); + parts.push_back(workload_name_); + if (!cluster_name_.empty()) { + parts.push_back(","); + parts.push_back(ClusterNameToken); + parts.push_back("="); + parts.push_back(cluster_name_); + } + if (!namespace_name_.empty()) { + parts.push_back(","); + parts.push_back(NamespaceNameToken); + parts.push_back("="); + parts.push_back(namespace_name_); + } + if (!canonical_name_.empty()) { + parts.push_back(","); + parts.push_back(ServiceNameToken); + parts.push_back("="); + parts.push_back(canonical_name_); + } + if (!canonical_revision_.empty()) { + parts.push_back(","); + parts.push_back(ServiceVersionToken); + parts.push_back("="); + parts.push_back(canonical_revision_); + } + if (!app_name_.empty()) { + parts.push_back(","); + parts.push_back(AppNameToken); + parts.push_back("="); + parts.push_back(app_name_); + } + if (!app_version_.empty()) { + parts.push_back(","); + parts.push_back(AppVersionToken); + parts.push_back("="); + parts.push_back(app_version_); + } + return absl::StrJoin(parts, ""); } absl::optional WorkloadMetadataObject::hash() const { @@ -221,47 +258,55 @@ Istio::Common::WorkloadMetadataObject convertFlatNodeToWorkloadMetadata( const absl::string_view namespace_name = toAbslStringView(node.namespace_()); const auto* labels = node.labels(); - const auto* name_iter = - labels->LookupByKey("service.istio.io/canonical-name"); - const auto* name = name_iter ? name_iter->value() : nullptr; - const absl::string_view canonical_name = toAbslStringView(name); + absl::string_view canonical_name; + absl::string_view canonical_revision; + absl::string_view app_name; + absl::string_view app_version; + if (labels) { + const auto* name_iter = + labels->LookupByKey("service.istio.io/canonical-name"); + const auto* name = name_iter ? name_iter->value() : nullptr; + canonical_name = toAbslStringView(name); - const auto* revision_iter = - labels->LookupByKey("service.istio.io/canonical-revision"); - const auto* revision = revision_iter ? revision_iter->value() : nullptr; - const absl::string_view canonical_revision = toAbslStringView(revision); + const auto* revision_iter = + labels->LookupByKey("service.istio.io/canonical-revision"); + const auto* revision = revision_iter ? revision_iter->value() : nullptr; + canonical_revision = toAbslStringView(revision); - const auto* app_iter = labels->LookupByKey("app"); - const auto* app = app_iter ? app_iter->value() : nullptr; - const absl::string_view app_name = toAbslStringView(app); + const auto* app_iter = labels->LookupByKey("app"); + const auto* app = app_iter ? app_iter->value() : nullptr; + app_name = toAbslStringView(app); - const auto* version_iter = labels->LookupByKey("version"); - const auto* version = version_iter ? version_iter->value() : nullptr; - const absl::string_view app_version = toAbslStringView(version); + const auto* version_iter = labels->LookupByKey("version"); + const auto* version = version_iter ? version_iter->value() : nullptr; + app_version = toAbslStringView(version); + } Istio::Common::WorkloadType workload_type = Istio::Common::WorkloadType::Pod; // Strip "s/workload_name" and check for workload type. absl::string_view owner = toAbslStringView(node.owner()); - owner.remove_suffix(workload.size() + 2); - size_t last = owner.rfind('/'); - if (last != absl::string_view::npos) { - const auto it = ALL_WORKLOAD_TOKENS.find(owner.substr(last + 1)); - if (it != ALL_WORKLOAD_TOKENS.end()) { - switch (it->second) { - case WorkloadType::Deployment: - workload_type = Istio::Common::WorkloadType::Deployment; - break; - case WorkloadType::CronJob: - workload_type = Istio::Common::WorkloadType::CronJob; - break; - case WorkloadType::Job: - workload_type = Istio::Common::WorkloadType::Job; - break; - case WorkloadType::Pod: - workload_type = Istio::Common::WorkloadType::Pod; - break; - default: - break; + if (owner.size() > workload.size() + 2) { + owner.remove_suffix(workload.size() + 2); + size_t last = owner.rfind('/'); + if (last != absl::string_view::npos) { + const auto it = ALL_WORKLOAD_TOKENS.find(owner.substr(last + 1)); + if (it != ALL_WORKLOAD_TOKENS.end()) { + switch (it->second) { + case WorkloadType::Deployment: + workload_type = Istio::Common::WorkloadType::Deployment; + break; + case WorkloadType::CronJob: + workload_type = Istio::Common::WorkloadType::CronJob; + break; + case WorkloadType::Job: + workload_type = Istio::Common::WorkloadType::Job; + break; + case WorkloadType::Pod: + workload_type = Istio::Common::WorkloadType::Pod; + break; + default: + break; + } } } } diff --git a/extensions/common/metadata_object_test.cc b/extensions/common/metadata_object_test.cc index e0f64e578c0..0c8a1f14d34 100644 --- a/extensions/common/metadata_object_test.cc +++ b/extensions/common/metadata_object_test.cc @@ -51,26 +51,26 @@ TEST(WorkloadMetadataObjectTest, Baggage) { WorkloadType::Job); EXPECT_EQ(deploy.baggage(), - absl::StrCat("k8s.cluster.name=my-cluster,", - "k8s.namespace.name=default,k8s.deployment.name=foo,", + absl::StrCat("k8s.deployment.name=foo,k8s.cluster.name=my-cluster,", + "k8s.namespace.name=default,", "service.name=foo-service,service.version=v1alpha3,", "app.name=foo-app,app.version=v1")); EXPECT_EQ(pod.baggage(), - absl::StrCat("k8s.cluster.name=my-cluster,", - "k8s.namespace.name=default,k8s.pod.name=foo,", + absl::StrCat("k8s.pod.name=foo,k8s.cluster.name=my-cluster,", + "k8s.namespace.name=default,", "service.name=foo-service,service.version=v1alpha3,", "app.name=foo-app,app.version=v1")); EXPECT_EQ(cronjob.baggage(), - absl::StrCat("k8s.cluster.name=my-cluster,", - "k8s.namespace.name=default,k8s.cronjob.name=foo," + absl::StrCat("k8s.cronjob.name=foo,k8s.cluster.name=my-cluster,", + "k8s.namespace.name=default," "service.name=foo-service,service.version=v1alpha3,", "app.name=foo-app,app.version=v1")); EXPECT_EQ(job.baggage(), - absl::StrCat("k8s.cluster.name=my-cluster,", - "k8s.namespace.name=default,k8s.job.name=foo,", + absl::StrCat("k8s.job.name=foo,k8s.cluster.name=my-cluster,", + "k8s.namespace.name=default,", "service.name=foo-service,service.version=v1alpha3,", "app.name=foo-app,app.version=v1")); } @@ -86,9 +86,9 @@ void checkFlatNodeConversion(const WorkloadMetadataObject& obj) { TEST(WorkloadMetadataObjectTest, FromBaggage) { { auto obj = WorkloadMetadataObject::fromBaggage( - absl::StrCat("k8s.cluster.name=my-cluster,k8s.namespace.name=default,", - "k8s.deployment.name=foo,service.name=foo-service,", - "service.version=v1alpha3")); + absl::StrCat("k8s.deployment.name=foo,k8s.cluster.name=my-cluster,k8s." + "namespace.name=default,", + "service.name=foo-service,", "service.version=v1alpha3")); EXPECT_EQ(obj.canonical_name_, "foo-service"); EXPECT_EQ(obj.canonical_revision_, "v1alpha3"); EXPECT_EQ(obj.workload_type_, WorkloadType::Deployment); @@ -100,9 +100,9 @@ TEST(WorkloadMetadataObjectTest, FromBaggage) { { auto obj = WorkloadMetadataObject::fromBaggage( - absl::StrCat("k8s.cluster.name=my-cluster,k8s.namespace.name=test,k8s." - "pod.name=foo-pod-435,service.name=", - "foo-service,service.version=v1beta2")); + absl::StrCat("k8s.pod.name=foo-pod-435,k8s.cluster.name=my-cluster,k8s." + "namespace.name=test," + "service.name=foo-service,service.version=v1beta2")); EXPECT_EQ(obj.canonical_name_, "foo-service"); EXPECT_EQ(obj.canonical_revision_, "v1beta2"); @@ -116,9 +116,9 @@ TEST(WorkloadMetadataObjectTest, FromBaggage) { { auto obj = WorkloadMetadataObject::fromBaggage( - absl::StrCat("k8s.cluster.name=my-cluster,k8s.namespace.name=test,", - "k8s.job.name=foo-job-435,service.name=foo-service,", - "service.version=v1beta4")); + absl::StrCat("k8s.job.name=foo-job-435,k8s.cluster.name=my-cluster,k8s." + "namespace.name=test,", + "service.name=foo-service,", "service.version=v1beta4")); EXPECT_EQ(obj.canonical_name_, "foo-service"); EXPECT_EQ(obj.canonical_revision_, "v1beta4"); @@ -132,9 +132,9 @@ TEST(WorkloadMetadataObjectTest, FromBaggage) { { auto obj = WorkloadMetadataObject::fromBaggage( - absl::StrCat("k8s.cluster.name=my-cluster,k8s.namespace.name=test,", - "k8s.cronjob.name=foo-cronjob,service.name=foo-service,", - "service.version=v1beta4")); + absl::StrCat("k8s.cronjob.name=foo-cronjob,k8s.cluster.name=my-cluster," + "k8s.namespace.name=test,", + "service.name=foo-service,", "service.version=v1beta4")); EXPECT_EQ(obj.canonical_name_, "foo-service"); EXPECT_EQ(obj.canonical_revision_, "v1beta4"); @@ -149,8 +149,8 @@ TEST(WorkloadMetadataObjectTest, FromBaggage) { { auto obj = WorkloadMetadataObject::fromBaggage(absl::StrCat( - "k8s.namespace.name=default,", - "k8s.deployment.name=foo,service.name=foo-service,", + "k8s.deployment.name=foo,k8s.namespace.name=default,", + "service.name=foo-service,", "service.version=v1alpha3,app.name=foo-app,app.version=v1")); EXPECT_EQ(obj.canonical_name_, "foo-service"); @@ -165,5 +165,17 @@ TEST(WorkloadMetadataObjectTest, FromBaggage) { } } +TEST(WorkloadMetadataObjectTest, ConvertFromFlatNode) { + flatbuffers::FlatBufferBuilder fbb; + Wasm::Common::FlatNodeBuilder builder(fbb); + auto data = builder.Finish(); + fbb.Finish(data); + auto buffer = fbb.Release(); + const auto& node = + *flatbuffers::GetRoot(buffer.data()); + auto obj = convertFlatNodeToWorkloadMetadata(node); + EXPECT_EQ(obj.baggage(), "k8s.pod.name="); +} + } // namespace Common } // namespace Istio diff --git a/src/envoy/workload_metadata/workload_metadata_test.cc b/src/envoy/workload_metadata/workload_metadata_test.cc index 0a54f25e8e5..f9a9bcbdcd9 100644 --- a/src/envoy/workload_metadata/workload_metadata_test.cc +++ b/src/envoy/workload_metadata/workload_metadata_test.cc @@ -79,9 +79,9 @@ TEST_F(FilterTest, OnAccept) { auto found = filter_state->getDataReadOnly( Istio::Common::kSourceMetadataBaggageKey); EXPECT_EQ(found->asString(), - "k8s.cluster.name=my-cluster,k8s.namespace.name=default,k8s." - "deployment.name=foo,service.name=foo-svc,service.version=v2beta1," - "app.name=,app.version="); + "k8s.deployment.name=foo,k8s.cluster.name=my-cluster,k8s.namespace." + "name=default," + "service.name=foo-svc,service.version=v2beta1"); setAddressToReturn("tcp://192.168.1.1:5555"); filter_state = std::make_shared( @@ -96,9 +96,9 @@ TEST_F(FilterTest, OnAccept) { found = filter_state->getDataReadOnly( Istio::Common::kSourceMetadataBaggageKey); EXPECT_EQ(found->asString(), - "k8s.cluster.name=my-cluster,k8s.namespace.name=default,k8s." - "deployment.name=foo,service.name=foo-svc,service.version=v2beta1," - "app.name=,app.version="); + "k8s.deployment.name=foo,k8s.cluster.name=my-cluster,k8s.namespace." + "name=default," + "service.name=foo-svc,service.version=v2beta1"); setAddressToReturn("tcp://4.22.1.1:4343"); EXPECT_CALL(callbacks_, filterState()).Times(0);