From d7e49d3767af4f205ac403dc13dd89309f14a36e Mon Sep 17 00:00:00 2001 From: Mike Schore Date: Tue, 16 Apr 2019 15:49:23 -0700 Subject: [PATCH 1/3] proto: move extension-specific linking validation into extensions Signed-off-by: Mike Schore --- .../extensions/access_loggers/http_grpc/BUILD | 13 +++++++++++ .../access_loggers/http_grpc/config.cc | 3 +++ .../grpc_access_log_proto_descriptors.cc | 22 +++++++++++++++++++ .../grpc_access_log_proto_descriptors.h | 14 ++++++++++++ .../stat_sinks/metrics_service/BUILD | 13 +++++++++++ .../stat_sinks/metrics_service/config.cc | 3 +++ .../grpc_metrics_proto_descriptors.cc | 22 +++++++++++++++++++ .../grpc_metrics_proto_descriptors.h | 14 ++++++++++++ source/server/BUILD | 2 -- source/server/proto_descriptors.cc | 4 ---- 10 files changed, 104 insertions(+), 6 deletions(-) create mode 100644 source/extensions/access_loggers/http_grpc/grpc_access_log_proto_descriptors.cc create mode 100644 source/extensions/access_loggers/http_grpc/grpc_access_log_proto_descriptors.h create mode 100644 source/extensions/stat_sinks/metrics_service/grpc_metrics_proto_descriptors.cc create mode 100644 source/extensions/stat_sinks/metrics_service/grpc_metrics_proto_descriptors.h diff --git a/source/extensions/access_loggers/http_grpc/BUILD b/source/extensions/access_loggers/http_grpc/BUILD index b7860b8f8dbb9..5e4002b4ad305 100644 --- a/source/extensions/access_loggers/http_grpc/BUILD +++ b/source/extensions/access_loggers/http_grpc/BUILD @@ -31,6 +31,17 @@ envoy_cc_library( ], ) +envoy_cc_library( + name = "grpc_access_log_proto_descriptors_lib", + srcs = ["grpc_access_log_proto_descriptors.cc"], + hdrs = ["grpc_access_log_proto_descriptors.h"], + deps = [ + "//source/common/config:protobuf_link_hacks", + "//source/common/protobuf", + "@envoy_api//envoy/service/accesslog/v2:als_cc", + ], +) + envoy_cc_library( name = "config", srcs = ["config.cc"], @@ -38,8 +49,10 @@ envoy_cc_library( deps = [ "//include/envoy/registry", "//include/envoy/server:access_log_config_interface", + "//source/common/common:assert_lib", "//source/common/protobuf", "//source/extensions/access_loggers:well_known_names", "//source/extensions/access_loggers/http_grpc:grpc_access_log_lib", + "//source/extensions/access_loggers/http_grpc:grpc_access_log_proto_descriptors_lib", ], ) diff --git a/source/extensions/access_loggers/http_grpc/config.cc b/source/extensions/access_loggers/http_grpc/config.cc index 526cf65dbbdee..5ee0c504c56bd 100644 --- a/source/extensions/access_loggers/http_grpc/config.cc +++ b/source/extensions/access_loggers/http_grpc/config.cc @@ -5,11 +5,13 @@ #include "envoy/registry/registry.h" #include "envoy/server/filter_config.h" +#include "common/common/assert.h" #include "common/common/macros.h" #include "common/grpc/async_client_impl.h" #include "common/protobuf/protobuf.h" #include "extensions/access_loggers/http_grpc/grpc_access_log_impl.h" +#include "extensions/access_loggers/http_grpc/grpc_access_log_proto_descriptors.h" #include "extensions/access_loggers/well_known_names.h" namespace Envoy { @@ -24,6 +26,7 @@ AccessLog::InstanceSharedPtr HttpGrpcAccessLogFactory::createAccessLogInstance(const Protobuf::Message& config, AccessLog::FilterPtr&& filter, Server::Configuration::FactoryContext& context) { + RELEASE_ASSERT(validateProtoDescriptors(), ""); const auto& proto_config = MessageUtil::downcastAndValidate< const envoy::config::accesslog::v2::HttpGrpcAccessLogConfig&>(config); std::shared_ptr grpc_access_log_streamer = diff --git a/source/extensions/access_loggers/http_grpc/grpc_access_log_proto_descriptors.cc b/source/extensions/access_loggers/http_grpc/grpc_access_log_proto_descriptors.cc new file mode 100644 index 0000000000000..de0372d49a3f8 --- /dev/null +++ b/source/extensions/access_loggers/http_grpc/grpc_access_log_proto_descriptors.cc @@ -0,0 +1,22 @@ +#include "extensions/access_loggers/http_grpc/grpc_access_log_proto_descriptors.h" + +#include "envoy/service/accesslog/v2/als.pb.h" + +#include "common/common/fmt.h" +#include "common/config/protobuf_link_hacks.h" +#include "common/protobuf/protobuf.h" + +namespace Envoy { +namespace Extensions { +namespace AccessLoggers { +namespace HttpGrpc { + +bool validateProtoDescriptors() { + const auto method = "envoy.service.accesslog.v2.AccessLogService.StreamAccessLogs"; + + return Protobuf::DescriptorPool::generated_pool()->FindMethodByName(method) != nullptr; +}; +} // namespace HttpGrpc +} // namespace AccessLoggers +} // namespace Extensions +} // namespace Envoy diff --git a/source/extensions/access_loggers/http_grpc/grpc_access_log_proto_descriptors.h b/source/extensions/access_loggers/http_grpc/grpc_access_log_proto_descriptors.h new file mode 100644 index 0000000000000..55b1eda0d5bc7 --- /dev/null +++ b/source/extensions/access_loggers/http_grpc/grpc_access_log_proto_descriptors.h @@ -0,0 +1,14 @@ +#pragma once + +namespace Envoy { +namespace Extensions { +namespace AccessLoggers { +namespace HttpGrpc { + +// This function validates that the method descriptors for gRPC services and type descriptors that +// are referenced in Any messages are available in the descriptor pool. +bool validateProtoDescriptors(); +} // namespace HttpGrpc +} // namespace AccessLoggers +} // namespace Extensions +} // namespace Envoy diff --git a/source/extensions/stat_sinks/metrics_service/BUILD b/source/extensions/stat_sinks/metrics_service/BUILD index 1920bf462ec5c..f74e7b20d5b4f 100644 --- a/source/extensions/stat_sinks/metrics_service/BUILD +++ b/source/extensions/stat_sinks/metrics_service/BUILD @@ -25,13 +25,26 @@ envoy_cc_library( ], ) +envoy_cc_library( + name = "metrics_proto_descriptors_lib", + srcs = ["grpc_metrics_proto_descriptors.cc"], + hdrs = ["grpc_metrics_proto_descriptors.h"], + deps = [ + "//source/common/config:protobuf_link_hacks", + "//source/common/protobuf", + "@envoy_api//envoy/service/metrics/v2:metrics_service_cc", + ], +) + envoy_cc_library( name = "config", srcs = ["config.cc"], hdrs = ["config.h"], deps = [ "//include/envoy/registry", + "//source/common/common:assert_lib", "//source/extensions/stat_sinks:well_known_names", + "//source/extensions/stat_sinks/metrics_service:metrics_proto_descriptors_lib", "//source/extensions/stat_sinks/metrics_service:metrics_service_grpc_lib", "//source/server:configuration_lib", "@envoy_api//envoy/config/metrics/v2:stats_cc", diff --git a/source/extensions/stat_sinks/metrics_service/config.cc b/source/extensions/stat_sinks/metrics_service/config.cc index 85d57b85c7317..f81271997b616 100644 --- a/source/extensions/stat_sinks/metrics_service/config.cc +++ b/source/extensions/stat_sinks/metrics_service/config.cc @@ -4,10 +4,12 @@ #include "envoy/config/metrics/v2/metrics_service.pb.validate.h" #include "envoy/registry/registry.h" +#include "common/common/assert.h" #include "common/grpc/async_client_impl.h" #include "common/network/resolver_impl.h" #include "extensions/stat_sinks/metrics_service/grpc_metrics_service_impl.h" +#include "extensions/stat_sinks/metrics_service/grpc_metrics_proto_descriptors.h" #include "extensions/stat_sinks/well_known_names.h" namespace Envoy { @@ -17,6 +19,7 @@ namespace MetricsService { Stats::SinkPtr MetricsServiceSinkFactory::createStatsSink(const Protobuf::Message& config, Server::Instance& server) { + RELEASE_ASSERT(validateProtoDescriptors(), ""); const auto& sink_config = MessageUtil::downcastAndValidate( config); diff --git a/source/extensions/stat_sinks/metrics_service/grpc_metrics_proto_descriptors.cc b/source/extensions/stat_sinks/metrics_service/grpc_metrics_proto_descriptors.cc new file mode 100644 index 0000000000000..ac6cd4cdfdfb8 --- /dev/null +++ b/source/extensions/stat_sinks/metrics_service/grpc_metrics_proto_descriptors.cc @@ -0,0 +1,22 @@ +#include "extensions/stat_sinks/metrics_service/grpc_metrics_proto_descriptors.h" + +#include "envoy/service/metrics/v2/metrics_service.pb.h" + +#include "common/common/fmt.h" +#include "common/config/protobuf_link_hacks.h" +#include "common/protobuf/protobuf.h" + +namespace Envoy { +namespace Extensions { +namespace StatSinks { +namespace MetricsService { + +bool validateProtoDescriptors() { + const auto method = "envoy.service.metrics.v2.MetricsService.StreamMetrics"; + + return Protobuf::DescriptorPool::generated_pool()->FindMethodByName(method) != nullptr; +}; +} // namespace MetricsService +} // namespace StatSinks +} // namespace Extensions +} // namespace Envoy diff --git a/source/extensions/stat_sinks/metrics_service/grpc_metrics_proto_descriptors.h b/source/extensions/stat_sinks/metrics_service/grpc_metrics_proto_descriptors.h new file mode 100644 index 0000000000000..d86371d2d6086 --- /dev/null +++ b/source/extensions/stat_sinks/metrics_service/grpc_metrics_proto_descriptors.h @@ -0,0 +1,14 @@ +#pragma once + +namespace Envoy { +namespace Extensions { +namespace StatSinks { +namespace MetricsService { + +// This function validates that the method descriptors for gRPC services and type descriptors that +// are referenced in Any messages are available in the descriptor pool. +bool validateProtoDescriptors(); +} // namespace MetricsService +} // namespace StatSinks +} // namespace Extensions +} // namespace Envoy diff --git a/source/server/BUILD b/source/server/BUILD index da93ef75d5f55..c4a9fa30f7886 100644 --- a/source/server/BUILD +++ b/source/server/BUILD @@ -244,10 +244,8 @@ envoy_cc_library( "@envoy_api//envoy/api/v2:eds_cc", "@envoy_api//envoy/api/v2:lds_cc", "@envoy_api//envoy/api/v2:rds_cc", - "@envoy_api//envoy/service/accesslog/v2:als_cc", "@envoy_api//envoy/service/discovery/v2:ads_cc", "@envoy_api//envoy/service/discovery/v2:hds_cc", - "@envoy_api//envoy/service/metrics/v2:metrics_service_cc", "@envoy_api//envoy/service/ratelimit/v2:rls_cc", ], ) diff --git a/source/server/proto_descriptors.cc b/source/server/proto_descriptors.cc index fd12f9e0a9f5f..608299149b5a0 100644 --- a/source/server/proto_descriptors.cc +++ b/source/server/proto_descriptors.cc @@ -4,10 +4,8 @@ #include "envoy/api/v2/eds.pb.h" #include "envoy/api/v2/lds.pb.h" #include "envoy/api/v2/rds.pb.h" -#include "envoy/service/accesslog/v2/als.pb.h" #include "envoy/service/discovery/v2/ads.pb.h" #include "envoy/service/discovery/v2/hds.pb.h" -#include "envoy/service/metrics/v2/metrics_service.pb.h" #include "envoy/service/ratelimit/v2/rls.pb.h" #include "common/common/fmt.h" @@ -30,8 +28,6 @@ bool validateProtoDescriptors() { "envoy.service.discovery.v2.AggregatedDiscoveryService.StreamAggregatedResources", "envoy.service.discovery.v2.HealthDiscoveryService.FetchHealthCheck", "envoy.service.discovery.v2.HealthDiscoveryService.StreamHealthCheck", - "envoy.service.accesslog.v2.AccessLogService.StreamAccessLogs", - "envoy.service.metrics.v2.MetricsService.StreamMetrics", "envoy.service.ratelimit.v2.RateLimitService.ShouldRateLimit", }; From 363709d01362389e8540860cd680262df7875cc7 Mon Sep 17 00:00:00 2001 From: Mike Schore Date: Mon, 22 Apr 2019 11:19:35 -0700 Subject: [PATCH 2/3] fix format Signed-off-by: Mike Schore --- source/extensions/stat_sinks/metrics_service/config.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/extensions/stat_sinks/metrics_service/config.cc b/source/extensions/stat_sinks/metrics_service/config.cc index f81271997b616..e41c30754b99a 100644 --- a/source/extensions/stat_sinks/metrics_service/config.cc +++ b/source/extensions/stat_sinks/metrics_service/config.cc @@ -8,8 +8,8 @@ #include "common/grpc/async_client_impl.h" #include "common/network/resolver_impl.h" -#include "extensions/stat_sinks/metrics_service/grpc_metrics_service_impl.h" #include "extensions/stat_sinks/metrics_service/grpc_metrics_proto_descriptors.h" +#include "extensions/stat_sinks/metrics_service/grpc_metrics_service_impl.h" #include "extensions/stat_sinks/well_known_names.h" namespace Envoy { From efbdc9e13a43f77d76aecd2ab523578c6f4277dc Mon Sep 17 00:00:00 2001 From: Mike Schore Date: Mon, 22 Apr 2019 16:46:23 -0700 Subject: [PATCH 3/3] remove unneeded dep Signed-off-by: Mike Schore --- source/extensions/access_loggers/http_grpc/BUILD | 1 - .../http_grpc/grpc_access_log_proto_descriptors.cc | 1 - source/extensions/stat_sinks/metrics_service/BUILD | 1 - .../stat_sinks/metrics_service/grpc_metrics_proto_descriptors.cc | 1 - 4 files changed, 4 deletions(-) diff --git a/source/extensions/access_loggers/http_grpc/BUILD b/source/extensions/access_loggers/http_grpc/BUILD index 5e4002b4ad305..fc664d1fd46d9 100644 --- a/source/extensions/access_loggers/http_grpc/BUILD +++ b/source/extensions/access_loggers/http_grpc/BUILD @@ -36,7 +36,6 @@ envoy_cc_library( srcs = ["grpc_access_log_proto_descriptors.cc"], hdrs = ["grpc_access_log_proto_descriptors.h"], deps = [ - "//source/common/config:protobuf_link_hacks", "//source/common/protobuf", "@envoy_api//envoy/service/accesslog/v2:als_cc", ], diff --git a/source/extensions/access_loggers/http_grpc/grpc_access_log_proto_descriptors.cc b/source/extensions/access_loggers/http_grpc/grpc_access_log_proto_descriptors.cc index de0372d49a3f8..3e9b3f39ce2cc 100644 --- a/source/extensions/access_loggers/http_grpc/grpc_access_log_proto_descriptors.cc +++ b/source/extensions/access_loggers/http_grpc/grpc_access_log_proto_descriptors.cc @@ -3,7 +3,6 @@ #include "envoy/service/accesslog/v2/als.pb.h" #include "common/common/fmt.h" -#include "common/config/protobuf_link_hacks.h" #include "common/protobuf/protobuf.h" namespace Envoy { diff --git a/source/extensions/stat_sinks/metrics_service/BUILD b/source/extensions/stat_sinks/metrics_service/BUILD index f74e7b20d5b4f..b44e1b0e0564d 100644 --- a/source/extensions/stat_sinks/metrics_service/BUILD +++ b/source/extensions/stat_sinks/metrics_service/BUILD @@ -30,7 +30,6 @@ envoy_cc_library( srcs = ["grpc_metrics_proto_descriptors.cc"], hdrs = ["grpc_metrics_proto_descriptors.h"], deps = [ - "//source/common/config:protobuf_link_hacks", "//source/common/protobuf", "@envoy_api//envoy/service/metrics/v2:metrics_service_cc", ], diff --git a/source/extensions/stat_sinks/metrics_service/grpc_metrics_proto_descriptors.cc b/source/extensions/stat_sinks/metrics_service/grpc_metrics_proto_descriptors.cc index ac6cd4cdfdfb8..b546804a7bd13 100644 --- a/source/extensions/stat_sinks/metrics_service/grpc_metrics_proto_descriptors.cc +++ b/source/extensions/stat_sinks/metrics_service/grpc_metrics_proto_descriptors.cc @@ -3,7 +3,6 @@ #include "envoy/service/metrics/v2/metrics_service.pb.h" #include "common/common/fmt.h" -#include "common/config/protobuf_link_hacks.h" #include "common/protobuf/protobuf.h" namespace Envoy {