From ea230a8bc0628c9f3165611fcb2f3383cdf9ab0b Mon Sep 17 00:00:00 2001 From: Matt Klein Date: Thu, 18 Jan 2018 19:22:22 -0500 Subject: [PATCH] v2 REST subscription: require refresh delay Signed-off-by: Matt Klein --- source/common/config/utility.cc | 4 ++++ .../common/config/subscription_factory_test.cc | 18 ++++++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/source/common/config/utility.cc b/source/common/config/utility.cc index 220da05cb87b3..1d55e7c66bb07 100644 --- a/source/common/config/utility.cc +++ b/source/common/config/utility.cc @@ -99,6 +99,10 @@ void Utility::checkApiConfigSourceSubscriptionBackingCluster( std::chrono::milliseconds Utility::apiConfigSourceRefreshDelay(const envoy::api::v2::ApiConfigSource& api_config_source) { + if (!api_config_source.has_refresh_delay()) { + throw EnvoyException("refresh_delay is required for REST API configuration sources"); + } + return std::chrono::milliseconds( Protobuf::util::TimeUtil::DurationToMilliseconds(api_config_source.refresh_delay())); } diff --git a/test/common/config/subscription_factory_test.cc b/test/common/config/subscription_factory_test.cc index 4183f6c1b35bd..249cadb717d10 100644 --- a/test/common/config/subscription_factory_test.cc +++ b/test/common/config/subscription_factory_test.cc @@ -114,6 +114,7 @@ TEST_F(SubscriptionFactoryTest, HttpSubscription) { auto* api_config_source = config.mutable_api_config_source(); api_config_source->set_api_type(envoy::api::v2::ApiConfigSource::REST); api_config_source->add_cluster_names("eds_cluster"); + api_config_source->mutable_refresh_delay()->set_seconds(1); Upstream::ClusterManager::ClusterInfoMap cluster_map; Upstream::MockCluster cluster; cluster_map.emplace("eds_cluster", cluster); @@ -137,6 +138,23 @@ TEST_F(SubscriptionFactoryTest, HttpSubscription) { subscriptionFromConfigSource(config)->start({"foo"}, callbacks_); } +// Confirm error when no refresh delay is set (not checked by schema). +TEST_F(SubscriptionFactoryTest, HttpSubscriptionNoRefreshDelay) { + envoy::api::v2::ConfigSource config; + auto* api_config_source = config.mutable_api_config_source(); + api_config_source->set_api_type(envoy::api::v2::ApiConfigSource::REST); + api_config_source->add_cluster_names("eds_cluster"); + Upstream::ClusterManager::ClusterInfoMap cluster_map; + Upstream::MockCluster cluster; + cluster_map.emplace("eds_cluster", cluster); + EXPECT_CALL(cm_, clusters()).WillOnce(Return(cluster_map)); + EXPECT_CALL(cluster, info()).Times(2); + EXPECT_CALL(*cluster.info_, addedViaApi()); + EXPECT_THROW_WITH_MESSAGE(subscriptionFromConfigSource(config)->start({"foo"}, callbacks_), + EnvoyException, + "refresh_delay is required for REST API configuration sources"); +} + TEST_F(SubscriptionFactoryTest, GrpcSubscription) { envoy::api::v2::ConfigSource config; auto* api_config_source = config.mutable_api_config_source();