diff --git a/include/envoy/server/filter_config.h b/include/envoy/server/filter_config.h index 4864d5bf9da6..a6286ef4640b 100644 --- a/include/envoy/server/filter_config.h +++ b/include/envoy/server/filter_config.h @@ -180,9 +180,10 @@ class FactoryContext : public virtual CommonFactoryContext { virtual Grpc::Context& grpcContext() PURE; /** - * @return ProcessContext& a reference to the process context. + * @return absl::optional> an optional reference to the + * process context. Will be unset when running in validation mode. */ - virtual ProcessContext& processContext() PURE; + virtual absl::optional> processContext() PURE; }; class ListenerFactoryContext : public virtual FactoryContext { diff --git a/include/envoy/server/instance.h b/include/envoy/server/instance.h index d87e72f84482..d440c8cf4c3d 100644 --- a/include/envoy/server/instance.h +++ b/include/envoy/server/instance.h @@ -196,7 +196,7 @@ class Instance { /** * @return the server-wide process context. */ - virtual ProcessContext& processContext() PURE; + virtual absl::optional> processContext() PURE; /** * @return ThreadLocal::Instance& the thread local storage engine for the server. This is used to diff --git a/source/server/config_validation/server.h b/source/server/config_validation/server.h index bbd350b325f1..8a59c4a046ff 100644 --- a/source/server/config_validation/server.h +++ b/source/server/config_validation/server.h @@ -94,7 +94,9 @@ class ValidationInstance : Logger::Loggable, Stats::Store& stats() override { return stats_store_; } Grpc::Context& grpcContext() override { return grpc_context_; } Http::Context& httpContext() override { return http_context_; } - ProcessContext& processContext() override { NOT_IMPLEMENTED_GCOVR_EXCL_LINE; } + absl::optional> processContext() override { + return absl::nullopt; + } ThreadLocal::Instance& threadLocal() override { return thread_local_; } const LocalInfo::LocalInfo& localInfo() override { return *local_info_; } TimeSource& timeSource() override { return api_->timeSource(); } diff --git a/source/server/listener_manager_impl.h b/source/server/listener_manager_impl.h index b634a1bf6537..35bd7ddfee28 100644 --- a/source/server/listener_manager_impl.h +++ b/source/server/listener_manager_impl.h @@ -324,7 +324,9 @@ class ListenerImpl : public Network::ListenerConfig, ServerLifecycleNotifier& lifecycleNotifier() override { return parent_.server_.lifecycleNotifier(); } - ProcessContext& processContext() override { return parent_.server_.processContext(); } + absl::optional> processContext() override { + return parent_.server_.processContext(); + } // Network::DrainDecision bool drainClose() const override; diff --git a/source/server/server.h b/source/server/server.h index 500f743f98a6..006b39d99cbb 100644 --- a/source/server/server.h +++ b/source/server/server.h @@ -194,7 +194,9 @@ class InstanceImpl : Logger::Loggable, Stats::Store& stats() override { return stats_store_; } Grpc::Context& grpcContext() override { return grpc_context_; } Http::Context& httpContext() override { return http_context_; } - ProcessContext& processContext() override { return *process_context_; } + absl::optional> processContext() override { + return *process_context_; + } ThreadLocal::Instance& threadLocal() override { return thread_local_; } const LocalInfo::LocalInfo& localInfo() override { return *local_info_; } TimeSource& timeSource() override { return time_source_; } diff --git a/test/integration/filters/process_context_filter.cc b/test/integration/filters/process_context_filter.cc index 6765042b2c2a..e3394dff0056 100644 --- a/test/integration/filters/process_context_filter.cc +++ b/test/integration/filters/process_context_filter.cc @@ -44,7 +44,7 @@ class ProcessContextFilterConfig : public Extensions::HttpFilters::Common::Empty Server::Configuration::FactoryContext& factory_context) override { return [&factory_context](Http::FilterChainFactoryCallbacks& callbacks) { callbacks.addStreamFilter( - std::make_shared(factory_context.processContext())); + std::make_shared(*factory_context.processContext())); }; } }; diff --git a/test/mocks/server/mocks.h b/test/mocks/server/mocks.h index de7d678c383b..b8398a630b50 100644 --- a/test/mocks/server/mocks.h +++ b/test/mocks/server/mocks.h @@ -382,7 +382,7 @@ class MockInstance : public Instance { MOCK_METHOD0(stats, Stats::Store&()); MOCK_METHOD0(grpcContext, Grpc::Context&()); MOCK_METHOD0(httpContext, Http::Context&()); - MOCK_METHOD0(processContext, ProcessContext&()); + MOCK_METHOD0(processContext, absl::optional>()); MOCK_METHOD0(threadLocal, ThreadLocal::Instance&()); MOCK_METHOD0(localInfo, const LocalInfo::LocalInfo&()); MOCK_CONST_METHOD0(statsFlushInterval, std::chrono::milliseconds()); @@ -470,7 +470,7 @@ class MockFactoryContext : public virtual FactoryContext { Event::TestTimeSystem& timeSystem() { return time_system_; } Grpc::Context& grpcContext() override { return grpc_context_; } Http::Context& httpContext() override { return http_context_; } - MOCK_METHOD0(processContext, ProcessContext&()); + MOCK_METHOD0(processContext, absl::optional>()); MOCK_METHOD0(messageValidationVisitor, ProtobufMessage::ValidationVisitor&()); MOCK_METHOD0(api, Api::Api&()); diff --git a/test/server/server_test.cc b/test/server/server_test.cc index 2f0cb301d04a..cc7a0f69f6c1 100644 --- a/test/server/server_test.cc +++ b/test/server/server_test.cc @@ -853,8 +853,8 @@ TEST_P(ServerInstanceImplTest, WithProcessContext) { EXPECT_NO_THROW(initialize("test/server/empty_bootstrap.yaml")); - ProcessContext& context = server_->processContext(); - auto& object_from_context = dynamic_cast(context.get()); + auto context = server_->processContext(); + auto& object_from_context = dynamic_cast(context->get().get()); EXPECT_EQ(&object_from_context, &object); EXPECT_TRUE(object_from_context.boolean_flag_);