From 2026543d30272e816bd1b46d1e99d50b2212d80f Mon Sep 17 00:00:00 2001 From: alyssawilk Date: Mon, 26 Apr 2021 16:41:31 -0400 Subject: [PATCH 1/5] http3: turning up more tests (#16175) Most of these were fixed by David's "stop writing to packets while under the stack of reading packets" merge, but a couple were fixed up by other PRs. Risk Level: n/a (test only) Testing: yes Docs Changes: n/a Release Notes: n/a Signed-off-by: Alyssa Wilk --- test/integration/multiplexed_upstream_integration_test.cc | 5 +---- test/integration/protocol_integration_test.cc | 5 +---- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/test/integration/multiplexed_upstream_integration_test.cc b/test/integration/multiplexed_upstream_integration_test.cc index 0e1f51812e9e..db6f3be19216 100644 --- a/test/integration/multiplexed_upstream_integration_test.cc +++ b/test/integration/multiplexed_upstream_integration_test.cc @@ -47,12 +47,10 @@ TEST_P(Http2UpstreamIntegrationTest, RouterHeaderOnlyRequestAndResponseNoBuffer) } TEST_P(Http2UpstreamIntegrationTest, RouterUpstreamDisconnectBeforeRequestcomplete) { - EXCLUDE_UPSTREAM_HTTP3; // Close loop. testRouterUpstreamDisconnectBeforeRequestComplete(); } TEST_P(Http2UpstreamIntegrationTest, RouterUpstreamDisconnectBeforeResponseComplete) { - EXCLUDE_UPSTREAM_HTTP3; // Close loop. testRouterUpstreamDisconnectBeforeResponseComplete(); } @@ -253,7 +251,6 @@ TEST_P(Http2UpstreamIntegrationTest, SimultaneousRequestAlpn) { } TEST_P(Http2UpstreamIntegrationTest, LargeSimultaneousRequestWithBufferLimitsAlpn) { - EXCLUDE_UPSTREAM_HTTP3; // No H3 support yet. use_alpn_ = true; config_helper_.setBufferLimits(1024, 1024); // Set buffer limits upstream and downstream. simultaneousRequest(1024 * 20, 1024 * 14 + 2, 1024 * 10 + 5, 1024 * 16); @@ -326,7 +323,7 @@ TEST_P(Http2UpstreamIntegrationTest, ManyLargeSimultaneousRequestWithRandomBacku } TEST_P(Http2UpstreamIntegrationTest, UpstreamConnectionCloseWithManyStreams) { - EXCLUDE_UPSTREAM_HTTP3; // Close loop. + EXCLUDE_UPSTREAM_HTTP3; // Times out waiting for reset. config_helper_.setBufferLimits(1024, 1024); // Set buffer limits upstream and downstream. const uint32_t num_requests = 20; std::vector encoders; diff --git a/test/integration/protocol_integration_test.cc b/test/integration/protocol_integration_test.cc index 0af79a2ec661..1a184f827510 100644 --- a/test/integration/protocol_integration_test.cc +++ b/test/integration/protocol_integration_test.cc @@ -608,7 +608,6 @@ TEST_P(ProtocolIntegrationTest, RetryStreaming) { // sure that Envoy cleans up stream state correctly when doing a retry with // complete response but incomplete request. TEST_P(ProtocolIntegrationTest, RetryStreamingReset) { - EXCLUDE_UPSTREAM_HTTP3; initialize(); codec_client_ = makeHttpConnection(lookupPort("http")); auto encoder_decoder = @@ -728,7 +727,6 @@ TEST_P(ProtocolIntegrationTest, RetryStreamingCancelDueToBufferOverflow) { // Tests that the x-envoy-attempt-count header is properly set on the upstream request and the // downstream response, and updated after the request is retried. TEST_P(DownstreamProtocolIntegrationTest, RetryAttemptCountHeader) { - EXCLUDE_UPSTREAM_HTTP3; auto host = config_helper_.createVirtualHost("host", "/test_retry"); host.set_include_request_attempt_count(true); host.set_include_attempt_count_in_response(true); @@ -778,7 +776,7 @@ TEST_P(DownstreamProtocolIntegrationTest, RetryPriority) { // TODO(alyssawilk) investigate why this combination doesn't work. return; } - EXCLUDE_UPSTREAM_HTTP3; + EXCLUDE_UPSTREAM_HTTP3; // Timed out waiting for new stream. const Upstream::HealthyLoad healthy_priority_load({0u, 100u}); const Upstream::DegradedLoad degraded_priority_load({0u, 100u}); NiceMock retry_priority(healthy_priority_load, @@ -851,7 +849,6 @@ TEST_P(DownstreamProtocolIntegrationTest, RetryPriority) { // the same host. With a total of two upstream hosts, this should result in us continuously sending // requests to the same host. TEST_P(DownstreamProtocolIntegrationTest, RetryHostPredicateFilter) { - EXCLUDE_UPSTREAM_HTTP3; TestHostPredicateFactory predicate_factory; Registry::InjectFactory inject_factory(predicate_factory); From 286ff81935a8a6f68a2ef8fa9d4dac7acb7becee Mon Sep 17 00:00:00 2001 From: Snow Pettersen Date: Mon, 26 Apr 2021 19:42:50 -0400 Subject: [PATCH 2/5] metric service: add support for sending tags as labels (#16125) Adds a new configuration flag that makes the metrics service use Labels to express tags instead of sending the full stats name that might include embedded tag keys/values. When configured, tags will be sent as labels while the reported name will be the tag extracted name instead of the full name. Risk Level: Low, new configuration flag Testing: UTs Docs Changes: Inline proto docs Release Notes: Added Signed-off-by: Snow Pettersen --- .../config/metrics/v3/metrics_service.proto | 5 ++ .../metrics/v4alpha/metrics_service.proto | 5 ++ docs/root/version_history/current.rst | 2 + .../config/metrics/v3/metrics_service.proto | 5 ++ .../metrics/v4alpha/metrics_service.proto | 5 ++ .../stat_sinks/metrics_service/config.cc | 2 +- .../grpc_metrics_service_impl.cc | 51 +++++++---- .../grpc_metrics_service_impl.h | 15 +++- .../grpc_metrics_service_impl_test.cc | 88 ++++++++++++++++++- 9 files changed, 153 insertions(+), 25 deletions(-) diff --git a/api/envoy/config/metrics/v3/metrics_service.proto b/api/envoy/config/metrics/v3/metrics_service.proto index 4bb6c77e66c2..e5fab870f8ee 100644 --- a/api/envoy/config/metrics/v3/metrics_service.proto +++ b/api/envoy/config/metrics/v3/metrics_service.proto @@ -38,4 +38,9 @@ message MetricsServiceConfig { // Eventually (https://github.com/envoyproxy/envoy/issues/10968) if this value is not set, the // sink will take updates from the :ref:`MetricsResponse `. google.protobuf.BoolValue report_counters_as_deltas = 2; + + // If true, metrics will have their tags emitted as labels on the metrics objects sent to the MetricsService, + // and the tag extracted name will be used instead of the full name, which may contain values used by the tag + // extractor or additional tags added during stats creation. + bool emit_tags_as_labels = 4; } diff --git a/api/envoy/config/metrics/v4alpha/metrics_service.proto b/api/envoy/config/metrics/v4alpha/metrics_service.proto index edc0fcfc4d6e..570bc2e9d716 100644 --- a/api/envoy/config/metrics/v4alpha/metrics_service.proto +++ b/api/envoy/config/metrics/v4alpha/metrics_service.proto @@ -38,4 +38,9 @@ message MetricsServiceConfig { // Eventually (https://github.com/envoyproxy/envoy/issues/10968) if this value is not set, the // sink will take updates from the :ref:`MetricsResponse `. google.protobuf.BoolValue report_counters_as_deltas = 2; + + // If true, metrics will have their tags emitted as labels on the metrics objects sent to the MetricsService, + // and the tag extracted name will be used instead of the full name, which may contain values used by the tag + // extractor or additional tags added during stats creation. + bool emit_tags_as_labels = 4; } diff --git a/docs/root/version_history/current.rst b/docs/root/version_history/current.rst index 3301626ccd11..8a0cf028173d 100644 --- a/docs/root/version_history/current.rst +++ b/docs/root/version_history/current.rst @@ -36,5 +36,7 @@ Removed Config or Runtime New Features ------------ +* metric service: added support for sending metric tags as labels. This can be enabled by setting the :ref:`emit_tags_as_labels ` field to true. + Deprecated ---------- diff --git a/generated_api_shadow/envoy/config/metrics/v3/metrics_service.proto b/generated_api_shadow/envoy/config/metrics/v3/metrics_service.proto index 4bb6c77e66c2..e5fab870f8ee 100644 --- a/generated_api_shadow/envoy/config/metrics/v3/metrics_service.proto +++ b/generated_api_shadow/envoy/config/metrics/v3/metrics_service.proto @@ -38,4 +38,9 @@ message MetricsServiceConfig { // Eventually (https://github.com/envoyproxy/envoy/issues/10968) if this value is not set, the // sink will take updates from the :ref:`MetricsResponse `. google.protobuf.BoolValue report_counters_as_deltas = 2; + + // If true, metrics will have their tags emitted as labels on the metrics objects sent to the MetricsService, + // and the tag extracted name will be used instead of the full name, which may contain values used by the tag + // extractor or additional tags added during stats creation. + bool emit_tags_as_labels = 4; } diff --git a/generated_api_shadow/envoy/config/metrics/v4alpha/metrics_service.proto b/generated_api_shadow/envoy/config/metrics/v4alpha/metrics_service.proto index edc0fcfc4d6e..570bc2e9d716 100644 --- a/generated_api_shadow/envoy/config/metrics/v4alpha/metrics_service.proto +++ b/generated_api_shadow/envoy/config/metrics/v4alpha/metrics_service.proto @@ -38,4 +38,9 @@ message MetricsServiceConfig { // Eventually (https://github.com/envoyproxy/envoy/issues/10968) if this value is not set, the // sink will take updates from the :ref:`MetricsResponse `. google.protobuf.BoolValue report_counters_as_deltas = 2; + + // If true, metrics will have their tags emitted as labels on the metrics objects sent to the MetricsService, + // and the tag extracted name will be used instead of the full name, which may contain values used by the tag + // extractor or additional tags added during stats creation. + bool emit_tags_as_labels = 4; } diff --git a/source/extensions/stat_sinks/metrics_service/config.cc b/source/extensions/stat_sinks/metrics_service/config.cc index 832daa362101..a17539df4e6f 100644 --- a/source/extensions/stat_sinks/metrics_service/config.cc +++ b/source/extensions/stat_sinks/metrics_service/config.cc @@ -39,7 +39,7 @@ MetricsServiceSinkFactory::createStatsSink(const Protobuf::Message& config, return std::make_unique>( - grpc_metrics_streamer, + grpc_metrics_streamer, sink_config.emit_tags_as_labels(), PROTOBUF_GET_WRAPPED_OR_DEFAULT(sink_config, report_counters_as_deltas, false)); } diff --git a/source/extensions/stat_sinks/metrics_service/grpc_metrics_service_impl.cc b/source/extensions/stat_sinks/metrics_service/grpc_metrics_service_impl.cc index 11734fe336fe..14d0d2043bb4 100644 --- a/source/extensions/stat_sinks/metrics_service/grpc_metrics_service_impl.cc +++ b/source/extensions/stat_sinks/metrics_service/grpc_metrics_service_impl.cc @@ -82,10 +82,8 @@ MetricsPtr MetricsFlusher::flush(Stats::MetricSnapshot& snapshot) const { void MetricsFlusher::flushCounter(io::prometheus::client::MetricFamily& metrics_family, const Stats::MetricSnapshot::CounterSnapshot& counter_snapshot, int64_t snapshot_time_ms) const { - metrics_family.set_type(io::prometheus::client::MetricType::COUNTER); - metrics_family.set_name(counter_snapshot.counter_.get().name()); - auto* metric = metrics_family.add_metric(); - metric->set_timestamp_ms(snapshot_time_ms); + auto* metric = populateMetricsFamily(metrics_family, io::prometheus::client::MetricType::COUNTER, + snapshot_time_ms, counter_snapshot.counter_.get()); auto* counter_metric = metric->mutable_counter(); if (report_counters_as_deltas_) { counter_metric->set_value(counter_snapshot.delta_); @@ -96,10 +94,8 @@ void MetricsFlusher::flushCounter(io::prometheus::client::MetricFamily& metrics_ void MetricsFlusher::flushGauge(io::prometheus::client::MetricFamily& metrics_family, const Stats::Gauge& gauge, int64_t snapshot_time_ms) const { - metrics_family.set_type(io::prometheus::client::MetricType::GAUGE); - metrics_family.set_name(gauge.name()); - auto* metric = metrics_family.add_metric(); - metric->set_timestamp_ms(snapshot_time_ms); + auto* metric = populateMetricsFamily(metrics_family, io::prometheus::client::MetricType::GAUGE, + snapshot_time_ms, gauge); auto* gauge_metric = metric->mutable_gauge(); gauge_metric->set_value(gauge.value()); } @@ -113,10 +109,9 @@ void MetricsFlusher::flushHistogram(io::prometheus::client::MetricFamily& summar // performance. // Add summary information for histograms. - summary_metrics_family.set_type(io::prometheus::client::MetricType::SUMMARY); - summary_metrics_family.set_name(envoy_histogram.name()); - auto* summary_metric = summary_metrics_family.add_metric(); - summary_metric->set_timestamp_ms(snapshot_time_ms); + auto* summary_metric = + populateMetricsFamily(summary_metrics_family, io::prometheus::client::MetricType::SUMMARY, + snapshot_time_ms, envoy_histogram); auto* summary = summary_metric->mutable_summary(); const Stats::HistogramStatistics& hist_stats = envoy_histogram.intervalStatistics(); for (size_t i = 0; i < hist_stats.supportedQuantiles().size(); i++) { @@ -126,10 +121,9 @@ void MetricsFlusher::flushHistogram(io::prometheus::client::MetricFamily& summar } // Add bucket information for histograms. - histogram_metrics_family.set_type(io::prometheus::client::MetricType::HISTOGRAM); - histogram_metrics_family.set_name(envoy_histogram.name()); - auto* histogram_metric = histogram_metrics_family.add_metric(); - histogram_metric->set_timestamp_ms(snapshot_time_ms); + auto* histogram_metric = + populateMetricsFamily(histogram_metrics_family, io::prometheus::client::MetricType::HISTOGRAM, + snapshot_time_ms, envoy_histogram); auto* histogram = histogram_metric->mutable_histogram(); histogram->set_sample_count(hist_stats.sampleCount()); histogram->set_sample_sum(hist_stats.sampleSum()); @@ -139,6 +133,31 @@ void MetricsFlusher::flushHistogram(io::prometheus::client::MetricFamily& summar bucket->set_cumulative_count(hist_stats.computedBuckets()[i]); } } + +io::prometheus::client::Metric* +MetricsFlusher::populateMetricsFamily(io::prometheus::client::MetricFamily& metrics_family, + io::prometheus::client::MetricType type, + int64_t snapshot_time_ms, const Stats::Metric& metric) const { + metrics_family.set_type(type); + auto* prometheus_metric = metrics_family.add_metric(); + prometheus_metric->set_timestamp_ms(snapshot_time_ms); + + if (emit_labels_) { + // TODO(snowp): Look into the perf implication of this. We need to take a lock on the symbol + // table to stringify the StatNames, which could result in some lock contention. Consider + // caching the conversion between stat handle to extracted tags. + metrics_family.set_name(metric.tagExtractedName()); + for (const auto& tag : metric.tags()) { + auto* label = prometheus_metric->add_label(); + label->set_name(tag.name_); + label->set_value(tag.value_); + } + } else { + metrics_family.set_name(metric.name()); + } + + return prometheus_metric; +} } // namespace MetricsService } // namespace StatSinks } // namespace Extensions diff --git a/source/extensions/stat_sinks/metrics_service/grpc_metrics_service_impl.h b/source/extensions/stat_sinks/metrics_service/grpc_metrics_service_impl.h index 782d887caf7f..7baef22c5bc0 100644 --- a/source/extensions/stat_sinks/metrics_service/grpc_metrics_service_impl.h +++ b/source/extensions/stat_sinks/metrics_service/grpc_metrics_service_impl.h @@ -82,8 +82,8 @@ using GrpcMetricsStreamerImplPtr = std::unique_ptr; class MetricsFlusher { public: - explicit MetricsFlusher(const bool report_counters_as_deltas) - : report_counters_as_deltas_(report_counters_as_deltas) {} + MetricsFlusher(bool report_counters_as_deltas, bool emit_labels) + : report_counters_as_deltas_(report_counters_as_deltas), emit_labels_(emit_labels) {} MetricsPtr flush(Stats::MetricSnapshot& snapshot) const; @@ -98,7 +98,13 @@ class MetricsFlusher { const Stats::ParentHistogram& envoy_histogram, int64_t snapshot_time_ms) const; + io::prometheus::client::Metric* + populateMetricsFamily(io::prometheus::client::MetricFamily& metrics_family, + io::prometheus::client::MetricType type, int64_t snapshot_time_ms, + const Stats::Metric& metric) const; + const bool report_counters_as_deltas_; + const bool emit_labels_; }; /** @@ -109,8 +115,9 @@ template class MetricsServiceSink : pu // MetricsService::Sink MetricsServiceSink( const GrpcMetricsStreamerSharedPtr& grpc_metrics_streamer, - const bool report_counters_as_deltas) - : flusher_(report_counters_as_deltas), grpc_metrics_streamer_(grpc_metrics_streamer) {} + bool report_counters_as_deltas, bool emit_labels) + : flusher_(report_counters_as_deltas, emit_labels), + grpc_metrics_streamer_(grpc_metrics_streamer) {} void flush(Stats::MetricSnapshot& snapshot) override { grpc_metrics_streamer_->send(flusher_.flush(snapshot)); diff --git a/test/extensions/stats_sinks/metrics_service/grpc_metrics_service_impl_test.cc b/test/extensions/stats_sinks/metrics_service/grpc_metrics_service_impl_test.cc index bafd9bc57960..3b77c71ceaed 100644 --- a/test/extensions/stats_sinks/metrics_service/grpc_metrics_service_impl_test.cc +++ b/test/extensions/stats_sinks/metrics_service/grpc_metrics_service_impl_test.cc @@ -111,7 +111,7 @@ class MetricsServiceSinkTest : public testing::Test { TEST_F(MetricsServiceSinkTest, CheckSendCall) { MetricsServiceSink - sink(streamer_, false); + sink(streamer_, false, false); auto counter = std::make_shared>(); counter->name_ = "test_counter"; @@ -137,7 +137,7 @@ TEST_F(MetricsServiceSinkTest, CheckSendCall) { TEST_F(MetricsServiceSinkTest, CheckStatsCount) { MetricsServiceSink - sink(streamer_, false); + sink(streamer_, false, false); auto counter = std::make_shared>(); counter->name_ = "test_counter"; @@ -168,7 +168,7 @@ TEST_F(MetricsServiceSinkTest, CheckStatsCount) { TEST_F(MetricsServiceSinkTest, ReportCountersValues) { MetricsServiceSink - sink(streamer_, false); + sink(streamer_, false, false); auto counter = std::make_shared>(); counter->name_ = "test_counter"; @@ -187,7 +187,7 @@ TEST_F(MetricsServiceSinkTest, ReportCountersValues) { TEST_F(MetricsServiceSinkTest, ReportCountersAsDeltas) { MetricsServiceSink - sink(streamer_, true); + sink(streamer_, true, false); auto counter = std::make_shared>(); counter->name_ = "test_counter"; @@ -202,6 +202,86 @@ TEST_F(MetricsServiceSinkTest, ReportCountersAsDeltas) { sink.flush(snapshot_); } +// Test the behavior of tag emission based on the emit_tags_as_label flag. +TEST_F(MetricsServiceSinkTest, ReportMetricsWithTags) { + auto counter = std::make_shared>(); + counter->name_ = "full-counter-name"; + counter->value_ = 100; + counter->used_ = true; + counter->setTagExtractedName("tag-counter-name"); + counter->setTags({{"a", "b"}}); + snapshot_.counters_.push_back({1, *counter}); + + auto gauge = std::make_shared>(); + gauge->name_ = "full-gauge-name"; + gauge->value_ = 100; + gauge->used_ = true; + gauge->setTagExtractedName("tag-gauge-name"); + gauge->setTags({{"a", "b"}}); + snapshot_.gauges_.push_back({*gauge}); + + auto histogram = std::make_shared>(); + histogram->name_ = "full-histogram-name"; + histogram->used_ = true; + histogram->setTagExtractedName("tag-histogram-name"); + histogram->setTags({{"a", "b"}}); + snapshot_.histograms_.push_back({*histogram}); + + { + // When the emit_tags flag is false, we don't emit the tags and use the full name. + MetricsServiceSink + sink(streamer_, true, false); + + EXPECT_CALL(*streamer_, send(_)).WillOnce(Invoke([](MetricsPtr&& metrics) { + EXPECT_EQ(4, metrics->size()); + + EXPECT_EQ("full-counter-name", (*metrics)[0].name()); + EXPECT_EQ(0, (*metrics)[0].metric(0).label().size()); + + EXPECT_EQ("full-gauge-name", (*metrics)[1].name()); + EXPECT_EQ(0, (*metrics)[1].metric(0).label().size()); + + EXPECT_EQ("full-histogram-name", (*metrics)[2].name()); + EXPECT_EQ(0, (*metrics)[2].metric(0).label().size()); + + EXPECT_EQ("full-histogram-name", (*metrics)[3].name()); + EXPECT_EQ(0, (*metrics)[3].metric(0).label().size()); + })); + sink.flush(snapshot_); + } + + io::prometheus::client::LabelPair expected_label_pair; + expected_label_pair.set_name("a"); + expected_label_pair.set_value("b"); + + // When the emit_tags flag is true, we emit the tags as labels and use the tag extracted name. + MetricsServiceSink + sink(streamer_, true, true); + + EXPECT_CALL(*streamer_, send(_)).WillOnce(Invoke([&expected_label_pair](MetricsPtr&& metrics) { + EXPECT_EQ(4, metrics->size()); + + EXPECT_EQ("tag-counter-name", (*metrics)[0].name()); + EXPECT_EQ(1, (*metrics)[0].metric(0).label().size()); + EXPECT_TRUE(TestUtility::protoEqual(expected_label_pair, (*metrics)[0].metric(0).label()[0])); + + EXPECT_EQ("tag-gauge-name", (*metrics)[1].name()); + EXPECT_EQ(1, (*metrics)[1].metric(0).label().size()); + EXPECT_TRUE(TestUtility::protoEqual(expected_label_pair, (*metrics)[0].metric(0).label()[0])); + + EXPECT_EQ("tag-histogram-name", (*metrics)[2].name()); + EXPECT_EQ(1, (*metrics)[2].metric(0).label().size()); + EXPECT_TRUE(TestUtility::protoEqual(expected_label_pair, (*metrics)[0].metric(0).label()[0])); + + EXPECT_EQ("tag-histogram-name", (*metrics)[3].name()); + EXPECT_EQ(1, (*metrics)[3].metric(0).label().size()); + EXPECT_TRUE(TestUtility::protoEqual(expected_label_pair, (*metrics)[0].metric(0).label()[0])); + })); + sink.flush(snapshot_); +} + } // namespace } // namespace MetricsService } // namespace StatSinks From f40e279f2a30ac80f5c1d21f88302989727eb4cc Mon Sep 17 00:00:00 2001 From: Jose Ulises Nino Rivera Date: Mon, 26 Apr 2021 18:54:23 -0500 Subject: [PATCH 3/5] apple dns: fix crash on invalid dns name (#16028) The release assert in question was ahead of verifying the return code. Risk Level: low - most (possibly all) envoy production usage does not happen on apple hardware. Testing: added new test that repro. Fixes #16021 Signed-off-by: Jose Nino --- source/common/network/apple_dns_impl.cc | 4 ++-- test/common/network/apple_dns_impl_test.cc | 14 ++++++++++++++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/source/common/network/apple_dns_impl.cc b/source/common/network/apple_dns_impl.cc index 8e8afff94fcf..45d082ad38ea 100644 --- a/source/common/network/apple_dns_impl.cc +++ b/source/common/network/apple_dns_impl.cc @@ -302,8 +302,6 @@ void AppleDnsResolverImpl::PendingResolution::onDNSServiceGetAddrInfoReply( "error_code={}, hostname={}", dns_name_, flags, flags & kDNSServiceFlagsMoreComing ? "yes" : "no", flags & kDNSServiceFlagsAdd ? "yes" : "no", interface_index, error_code, hostname); - RELEASE_ASSERT(interface_index == 0, - fmt::format("unexpected interface_index={}", interface_index)); if (!pending_cb_) { pending_cb_ = {ResolutionStatus::Success, {}}; @@ -326,6 +324,8 @@ void AppleDnsResolverImpl::PendingResolution::onDNSServiceGetAddrInfoReply( return; } + ENVOY_BUG(interface_index == 0, fmt::format("unexpected interface_index={}", interface_index)); + // Only add this address to the list if kDNSServiceFlagsAdd is set. Callback targets are only // additive. if (flags & kDNSServiceFlagsAdd) { diff --git a/test/common/network/apple_dns_impl_test.cc b/test/common/network/apple_dns_impl_test.cc index 7cc40baf6f19..1dc149dbf127 100644 --- a/test/common/network/apple_dns_impl_test.cc +++ b/test/common/network/apple_dns_impl_test.cc @@ -155,6 +155,20 @@ TEST_F(AppleDnsImplTest, DnsIpAddressVersion) { dispatcher_->run(Event::Dispatcher::RunType::Block); } +TEST_F(AppleDnsImplTest, DnsIpAddressVersionInvalid) { + EXPECT_NE(nullptr, resolveWithExpectations("invalidDnsName", DnsLookupFamily::Auto, + DnsResolver::ResolutionStatus::Failure, false)); + dispatcher_->run(Event::Dispatcher::RunType::Block); + + EXPECT_NE(nullptr, resolveWithExpectations("invalidDnsName", DnsLookupFamily::V4Only, + DnsResolver::ResolutionStatus::Failure, false)); + dispatcher_->run(Event::Dispatcher::RunType::Block); + + EXPECT_NE(nullptr, resolveWithExpectations("invalidDnsName", DnsLookupFamily::V6Only, + DnsResolver::ResolutionStatus::Failure, false)); + dispatcher_->run(Event::Dispatcher::RunType::Block); +} + TEST_F(AppleDnsImplTest, CallbackException) { EXPECT_NE(nullptr, resolveWithException("google.com", DnsLookupFamily::V4Only)); EXPECT_THROW_WITH_MESSAGE(dispatcher_->run(Event::Dispatcher::RunType::Block), EnvoyException, From 4622fee2cbcc7e5f7e9782d384ccbaae6c715d7e Mon Sep 17 00:00:00 2001 From: phlax Date: Tue, 27 Apr 2021 00:59:17 +0100 Subject: [PATCH 4/5] docs: Update refs: v2 -> v3 (#16163) Signed-off-by: Ryan Northey --- docs/root/api/client_features.rst | 6 +++--- .../configuration/http/http_conn_man/stats.rst | 2 +- .../http/http_filters/aws_lambda_filter.rst | 5 ++--- .../http/http_filters/fault_filter.rst | 4 ++-- .../sni_dynamic_forward_proxy_filter.rst | 4 ++-- .../listeners/udp_filters/dns_filter.rst | 2 +- .../observability/access_log/overview.rst | 2 +- .../operations/tools/router_check.rst | 2 +- docs/root/configuration/overview/versioning.rst | 16 +--------------- docs/root/configuration/overview/xds_api.rst | 6 +++--- .../intro/arch_overview/advanced/attributes.rst | 12 ++++++------ .../intro/arch_overview/http/http_routing.rst | 8 ++++---- .../upstream/load_balancing/excluded.rst | 2 +- .../upstream/load_balancing/load_balancers.rst | 8 ++++---- docs/root/operations/certificates.rst | 2 +- docs/root/operations/tools/config_generator.rst | 2 +- .../operations/tools/route_table_check_tool.rst | 2 +- 17 files changed, 35 insertions(+), 50 deletions(-) diff --git a/docs/root/api/client_features.rst b/docs/root/api/client_features.rst index 07f0bd259a53..67e73283b7eb 100644 --- a/docs/root/api/client_features.rst +++ b/docs/root/api/client_features.rst @@ -4,8 +4,8 @@ Well Known Client Features ========================== Authoritative list of features that an xDS client may support. An xDS client supplies the list of -features it supports in the :ref:`client_features ` field. -Client features use reverse DNS naming scheme, for example `com.acme.feature`. +features it supports in the :ref:`client_features ` field. +Client features use reverse DNS naming scheme, for example ``com.acme.feature``. Currently Defined Client Features --------------------------------- @@ -17,7 +17,7 @@ Currently Defined Client Features *udpa.type.v1.TypedStruct* only. - **envoy.lb.does_not_support_overprovisioning**: This feature indicates that the client does not support overprovisioning for priority failover and locality weighting as configured by the - :ref:`overprovisioning_factor` + :ref:`overprovisioning_factor ` field. If graceful failover functionality is required, it must be supplied by the management server. - **envoy.lrs.supports_send_all_clusters**: This feature indicates that the client supports diff --git a/docs/root/configuration/http/http_conn_man/stats.rst b/docs/root/configuration/http/http_conn_man/stats.rst index 9c7d441b7fff..f43cd7812ac0 100644 --- a/docs/root/configuration/http/http_conn_man/stats.rst +++ b/docs/root/configuration/http/http_conn_man/stats.rst @@ -142,7 +142,7 @@ On the upstream side all http2 statistics are rooted at *cluster..http2.* rx_messaging_error, Counter, Total number of invalid received frames that violated `section 8 `_ of the HTTP/2 spec. This will result in a *tx_reset* rx_reset, Counter, Total number of reset stream frames received by Envoy trailers, Counter, Total number of trailers seen on requests coming from downstream - tx_flush_timeout, Counter, Total number of :ref:`stream idle timeouts ` waiting for open stream window to flush the remainder of a stream + tx_flush_timeout, Counter, Total number of :ref:`stream idle timeouts ` waiting for open stream window to flush the remainder of a stream tx_reset, Counter, Total number of reset stream frames transmitted by Envoy keepalive_timeout, Counter, Total number of connections closed due to :ref:`keepalive timeout ` streams_active, Gauge, Active streams as observed by the codec diff --git a/docs/root/configuration/http/http_filters/aws_lambda_filter.rst b/docs/root/configuration/http/http_filters/aws_lambda_filter.rst index d281de9b0ab7..38813aaeb8e0 100644 --- a/docs/root/configuration/http/http_filters/aws_lambda_filter.rst +++ b/docs/root/configuration/http/http_filters/aws_lambda_filter.rst @@ -187,13 +187,12 @@ Statistics ---------- The AWS Lambda filter outputs statistics in the *http..aws_lambda.* namespace. The -:ref:`stat prefix ` +| :ref:`stat prefix ` comes from the owning HTTP connection manager. .. csv-table:: :header: Name, Type, Description :widths: 1, 1, 2 - server_error, Counter, Total requests that returned invalid JSON response (see :ref:`payload_passthrough `) + server_error, Counter, Total requests that returned invalid JSON response (see :ref:`payload_passthrough `) upstream_rq_payload_size, Histogram, Size in bytes of the request after JSON-tranformation (if any). - diff --git a/docs/root/configuration/http/http_filters/fault_filter.rst b/docs/root/configuration/http/http_filters/fault_filter.rst index 2dbd48c58846..45b8a0c7866d 100644 --- a/docs/root/configuration/http/http_filters/fault_filter.rst +++ b/docs/root/configuration/http/http_filters/fault_filter.rst @@ -47,7 +47,7 @@ x-envoy-fault-abort-grpc-request the gRPC status code to return in response to a request. Its value range is [0, UInt32.Max] instead of [0, 16] to allow testing even not well-defined gRPC status codes. When this header is set, the HTTP response status code will be set to 200. In order for the header to work, :ref:`header_abort - ` needs to be set. If both + ` needs to be set. If both *x-envoy-fault-abort-request* and *x-envoy-fault-abort-grpc-request* headers are set then *x-envoy-fault-abort-grpc-request* header will be **ignored** and fault response http status code will be set to *x-envoy-fault-abort-request* header value. @@ -163,7 +163,7 @@ fault.http.abort.grpc_status aborted if the headers match. Defaults to the gRPC status code specified in the config. If this field is missing from both the runtime and the config, gRPC status code in the response will be derived from *fault.http.abort.http_status* field. This runtime key is only available when - the filter is :ref:`configured for abort `. + the filter is :ref:`configured for abort `. fault.http.delay.fixed_delay_percent % of requests that will be delayed if the headers match. Defaults to the diff --git a/docs/root/configuration/listeners/network_filters/sni_dynamic_forward_proxy_filter.rst b/docs/root/configuration/listeners/network_filters/sni_dynamic_forward_proxy_filter.rst index ddd9fa7b9489..00635117c195 100644 --- a/docs/root/configuration/listeners/network_filters/sni_dynamic_forward_proxy_filter.rst +++ b/docs/root/configuration/listeners/network_filters/sni_dynamic_forward_proxy_filter.rst @@ -9,14 +9,14 @@ SNI dynamic forward proxy Through the combination of :ref:`TLS inspector ` listener filter, this network filter and the -:ref:`dynamic forward proxy cluster `, +:ref:`dynamic forward proxy cluster `, Envoy supports SNI based dynamic forward proxy. The implementation works just like the :ref:`HTTP dynamic forward proxy `, but using the value in SNI as target host instead. The following is a complete configuration that configures both this filter as well as the :ref:`dynamic forward proxy cluster -`. Both filter and cluster +`. Both filter and cluster must be configured together and point to the same DNS cache parameters for Envoy to operate as an SNI dynamic forward proxy. diff --git a/docs/root/configuration/listeners/udp_filters/dns_filter.rst b/docs/root/configuration/listeners/udp_filters/dns_filter.rst index ca4bcaa106bb..d2243351f340 100644 --- a/docs/root/configuration/listeners/udp_filters/dns_filter.rst +++ b/docs/root/configuration/listeners/udp_filters/dns_filter.rst @@ -123,7 +123,7 @@ adhere to the convention outlined in the RFC. The filter can also consume its domain configuration from an external DNS table. The same entities appearing in the static configuration can be stored as JSON or YAML in a separate file and referenced -using the :ref:`external_dns_table DataSource ` directive: +using the :ref:`external_dns_table DataSource ` directive: Example External DnsTable Configuration --------------------------------------- diff --git a/docs/root/configuration/observability/access_log/overview.rst b/docs/root/configuration/observability/access_log/overview.rst index 33b29018b912..c8d73cc901ca 100644 --- a/docs/root/configuration/observability/access_log/overview.rst +++ b/docs/root/configuration/observability/access_log/overview.rst @@ -3,4 +3,4 @@ Overview * Access logging :ref:`architecture overview ` * :ref:`Configuration overview ` -* :ref:`v2 API reference ` +* :ref:`v3 API reference ` diff --git a/docs/root/configuration/operations/tools/router_check.rst b/docs/root/configuration/operations/tools/router_check.rst index 41bfb4d66f49..befaf853c878 100644 --- a/docs/root/configuration/operations/tools/router_check.rst +++ b/docs/root/configuration/operations/tools/router_check.rst @@ -168,7 +168,7 @@ validate and "date" fields, as well as custom headers set in the input or by the route. The header fields are checked after all other test cases. Thus, the header fields checked will be those of the redirected or rewritten routes when applicable. - - Matchers are specified as :ref:`HeaderMatchers `, and behave the same way. + - Matchers are specified as :ref:`HeaderMatchers `, and behave the same way. Coverage -------- diff --git a/docs/root/configuration/overview/versioning.rst b/docs/root/configuration/overview/versioning.rst index 46c141ff03cc..7bf7510659e3 100644 --- a/docs/root/configuration/overview/versioning.rst +++ b/docs/root/configuration/overview/versioning.rst @@ -1,25 +1,11 @@ Versioning ---------- -The Envoy xDS APIs follow a well defined :repo:`versioning scheme `. Envoy -supports :ref:`multiple major versions ` at any point in time. The examples -in this section are taken from the v2 xDS API. +The Envoy xDS APIs follow a well defined :repo:`versioning scheme `. Envoy has API versions for both the xDS transport, i.e. the wire protocol for moving resources between a management server and Envoy, and for resources. These are known as the transport and resource API version respectively. -The transport and resource version may be mixed. For example, v3 resources may be transferred over -the v2 transport protocol. In addition, an Envoy may consume mixed resource versions for distinct -resource types. For example, :ref:`v3 Clusters ` may be -used alongside :ref:`v2 Listeners `. - Both the transport and resource API versions follow the API versioning support and deprecation :repo:`policy `. - -.. note:: - - Envoy will internally operate at the latest xDS resource version and all supported versioned - resources will be transparently upgrading to this latest version on configuration ingestion. For - example, v2 and v3 resources, delivered over either a v2 or v3 transport, or any mix thereof, - will be internally converted into v3 resources. diff --git a/docs/root/configuration/overview/xds_api.rst b/docs/root/configuration/overview/xds_api.rst index be4f0ff9aaa5..dca8e99265c3 100644 --- a/docs/root/configuration/overview/xds_api.rst +++ b/docs/root/configuration/overview/xds_api.rst @@ -260,7 +260,7 @@ is set in the :ref:`rds .. note:: - The management server responding to these endpoints must respond with a :ref:`DiscoveryResponse ` + The management server responding to these endpoints must respond with a :ref:`DiscoveryResponse ` along with a HTTP status of 200. Additionally, if the configuration that would be supplied has not changed (as indicated by the version supplied by the Envoy client) then the management server can respond with an empty body and a HTTP status of 304. @@ -377,9 +377,9 @@ Currently the behavior when a TTL expires is that the resource is *removed* (as previous version). As such, this feature should primarily be used for use cases where the absence of the resource is preferred instead of the temporary version, e.g. when using RTDS to apply a temporary runtime override. -The TTL is specified on the :ref:`Resource ` proto: for Delta xDS this is specified directly +The TTL is specified on the :ref:`Resource ` proto: for Delta xDS this is specified directly within the response, while for SotW xDS the server may wrap individual resources listed in the response within a -:ref:`Resource ` in order to specify a TTL value. +:ref:`Resource ` in order to specify a TTL value. The server can refresh or modify the TTL by issuing another response for the same version. In this case the resource itself does not have to be included. diff --git a/docs/root/intro/arch_overview/advanced/attributes.rst b/docs/root/intro/arch_overview/advanced/attributes.rst index 767a75b2d4c4..69031b5869f2 100644 --- a/docs/root/intro/arch_overview/advanced/attributes.rst +++ b/docs/root/intro/arch_overview/advanced/attributes.rst @@ -153,7 +153,7 @@ Data exchanged between filters is available as the following attributes: :header: Attribute, Type, Description :widths: 1, 1, 4 - metadata, :ref:`Metadata`, Dynamic request metadata + metadata, :ref:`Metadata`, Dynamic request metadata filter_state, "map", Mapping from a filter state name to its serialized string value Note that these attributes may change during the life of a request as the data can be @@ -171,14 +171,14 @@ In addition to all above, the following extra attributes are available to Wasm e plugin_name, string, Plugin name plugin_root_id, string, Plugin root ID plugin_vm_id, string, Plugin VM ID - node, :ref:`Node`, Local node description + node, :ref:`Node`, Local node description cluster_name, string, Upstream cluster name - cluster_metadata, :ref:`Metadata`, Upstream cluster metadata + cluster_metadata, :ref:`Metadata`, Upstream cluster metadata listener_direction, int, Enumeration value of the :ref:`listener traffic direction` - listener_metadata, :ref:`Metadata`, Listener metadata + listener_metadata, :ref:`Metadata`, Listener metadata route_name, string, Route name - route_metadata, :ref:`Metadata`, Route metadata - upstream_host_metadata, :ref:`Metadata`, Upstream host metadata + route_metadata, :ref:`Metadata`, Route metadata + upstream_host_metadata, :ref:`Metadata`, Upstream host metadata Path expressions ---------------- diff --git a/docs/root/intro/arch_overview/http/http_routing.rst b/docs/root/intro/arch_overview/http/http_routing.rst index 65f66cb622ae..816218721590 100644 --- a/docs/root/intro/arch_overview/http/http_routing.rst +++ b/docs/root/intro/arch_overview/http/http_routing.rst @@ -53,8 +53,8 @@ Route Scope ----------- Scoped routing enables Envoy to put constraints on search space of domains and route rules. -A :ref:`Route Scope` associates a key with a :ref:`route table `. -For each request, a scope key is computed dynamically by the HTTP connection manager to pick the :ref:`route table`. +A :ref:`Route Scope ` associates a key with a :ref:`route table `. +For each request, a scope key is computed dynamically by the HTTP connection manager to pick the :ref:`route table `. RouteConfiguration associated with scope can be loaded on demand with :ref:`v3 API reference ` configured and on demand filed in protobuf set to true. The Scoped RDS (SRDS) API contains a set of :ref:`Scopes ` resources, each defining independent routing configuration, @@ -110,7 +110,7 @@ headers `. The following configurat * **Retry conditions**: Envoy can retry on different types of conditions depending on application requirements. For example, network failure, all 5xx response codes, idempotent 4xx response codes, etc. -* **Retry budgets**: Envoy can limit the proportion of active requests via :ref:`retry budgets ` that can be retries to +* **Retry budgets**: Envoy can limit the proportion of active requests via :ref:`retry budgets ` that can be retries to prevent their contribution to large increases in traffic volume. * **Host selection retry plugins**: Envoy can be configured to apply additional logic to the host selection logic when selecting hosts for retries. Specifying a @@ -122,7 +122,7 @@ headers `. The following configurat Note that Envoy retries requests when :ref:`x-envoy-overloaded ` is present. It is recommended to either configure -:ref:`retry budgets (preferred) ` or set +:ref:`retry budgets (preferred) ` or set :ref:`maximum active retries circuit breaker ` to an appropriate value to avoid retry storms. .. _arch_overview_http_routing_hedging: diff --git a/docs/root/intro/arch_overview/upstream/load_balancing/excluded.rst b/docs/root/intro/arch_overview/upstream/load_balancing/excluded.rst index 11c7531d0505..6d025a3a0efb 100644 --- a/docs/root/intro/arch_overview/upstream/load_balancing/excluded.rst +++ b/docs/root/intro/arch_overview/upstream/load_balancing/excluded.rst @@ -22,7 +22,7 @@ Currently, the following two conditions can lead to a host being excluded when u health checking: * Using the :ref:`ignore_new_hosts_until_first_hc - ` cluster option. + ` cluster option. * Receiving the :ref:`x-envoy-immediate-health-check-fail ` header in a normal routed response or in response to an :ref:`HTTP active health check diff --git a/docs/root/intro/arch_overview/upstream/load_balancing/load_balancers.rst b/docs/root/intro/arch_overview/upstream/load_balancing/load_balancers.rst index ad256fa64413..f3e4a4bd56f8 100644 --- a/docs/root/intro/arch_overview/upstream/load_balancing/load_balancers.rst +++ b/docs/root/intro/arch_overview/upstream/load_balancing/load_balancers.rst @@ -73,7 +73,7 @@ the ring. This technique is also commonly known as `"Ketama" ` e.g.: +in the ``"envoy.lb"`` :ref:`LbEndpoint.Metadata ` e.g.: .. validated-code-block:: yaml :type-name: envoy.config.core.v3.Metadata @@ -82,7 +82,7 @@ in the ``"envoy.lb"`` :ref:`LbEndpoint.Metadata `. +This will override :ref:`use_hostname_for_hashing `. Each host is hashed and placed on the ring some number of times proportional to its weight. For example, if host A has a weight of 1 and host B has a weight of 2, then there might be three entries @@ -114,7 +114,7 @@ any place in which consistent hashing is desired. Like the ring hash load balanc hashing load balancer is only effective when protocol routing is used that specifies a value to hash on. If you want something other than the host's address to be used as the hash key (e.g. the semantic name of your host in a Kubernetes StatefulSet), then you can specify it in the ``"envoy.lb"`` -:ref:`LbEndpoint.Metadata ` e.g.: +:ref:`LbEndpoint.Metadata ` e.g.: .. validated-code-block:: yaml :type-name: envoy.config.core.v3.Metadata @@ -123,7 +123,7 @@ semantic name of your host in a Kubernetes StatefulSet), then you can specify it envoy.lb: hash_key: "YOUR HASH KEY" -This will override :ref:`use_hostname_for_hashing`. +This will override :ref:`use_hostname_for_hashing `. The table construction algorithm places each host in the table some number of times proportional to its weight, until the table is completely filled. For example, if host A has a weight of 1 and diff --git a/docs/root/operations/certificates.rst b/docs/root/operations/certificates.rst index 0dff05aa9360..ad9ae547aebc 100644 --- a/docs/root/operations/certificates.rst +++ b/docs/root/operations/certificates.rst @@ -5,7 +5,7 @@ Certificate Management Envoy provides several mechanisms for cert management. At a high level they can be broken into -1. Static :ref:`CommonTlsContext ` referenced certificates. +1. Static :ref:`CommonTlsContext ` referenced certificates. These will *not* reload automatically, and requires either a restart of the proxy or reloading the clusters/listeners that reference them. :ref:`Hot restarting ` can be used here to pick up the new diff --git a/docs/root/operations/tools/config_generator.rst b/docs/root/operations/tools/config_generator.rst index dfe75bf4ebb3..02bda90aa8a1 100644 --- a/docs/root/operations/tools/config_generator.rst +++ b/docs/root/operations/tools/config_generator.rst @@ -33,7 +33,7 @@ A few notes about the example configurations: templates for different instances of this. * Tracing is configured for `LightStep `_. To disable this or enable `Zipkin `_ or `Datadog `_ tracing, delete or - change the :ref:`tracing configuration ` accordingly. + change the :ref:`tracing configuration ` accordingly. * The configuration demonstrates the use of a :ref:`global rate limiting service `. To disable this delete the :ref:`rate limit configuration `. diff --git a/docs/root/operations/tools/route_table_check_tool.rst b/docs/root/operations/tools/route_table_check_tool.rst index 2d07c3831527..fb5e6778762b 100644 --- a/docs/root/operations/tools/route_table_check_tool.rst +++ b/docs/root/operations/tools/route_table_check_tool.rst @@ -19,7 +19,7 @@ Usage -c , --config-path Path to a v2 router config file (YAML or JSON). The router config file schema is found in - :ref:`config ` and the config file extension + :ref:`config ` and the config file extension must reflect its file type (for instance, .json for JSON and .yaml for YAML). -d, --details From 87d5eb7d44e4b24b2d098ce073f8742610c5d03e Mon Sep 17 00:00:00 2001 From: phlax Date: Tue, 27 Apr 2021 01:04:17 +0100 Subject: [PATCH 5/5] dependabot: Resolve updates (#16169) Signed-off-by: Ryan Northey Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docs/requirements.txt | 4 +- tools/dependency/requirements.txt | 141 +++++++++++++++++++---- tools/deprecate_version/requirements.txt | 87 ++++++++++++-- tools/github/requirements.txt | 6 +- 4 files changed, 202 insertions(+), 36 deletions(-) diff --git a/docs/requirements.txt b/docs/requirements.txt index 611d0203b3bf..987496efe103 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -219,7 +219,9 @@ typing-extensions==3.7.4.3 \ --hash=sha256:7cb407020f00f7bfc3cb3e7881628838e69d8f3fcab2f64742a5e76b2f841918 \ --hash=sha256:99d4073b617d30288f569d3f13d2bd7548c3a7e4c8de87db09a9d29bb3a4a60c \ --hash=sha256:dafc7639cde7f1b6e1acc0f457842a83e722ccca8eef5270af2d74792619a89f - # via gitpython + # via + # -r docs/requirements.txt + # gitpython urllib3==1.26.4 \ --hash=sha256:2f4da4594db7e1e110a944bb1b551fdf4e6c136ad42e4234131391e21eb5b0df \ --hash=sha256:e7b021f7241115872f92f43c6508082facffbd1c048e3c6e2bb9c2a157e28937 diff --git a/tools/dependency/requirements.txt b/tools/dependency/requirements.txt index 91e76f091160..311fcbd6d18e 100644 --- a/tools/dependency/requirements.txt +++ b/tools/dependency/requirements.txt @@ -1,16 +1,105 @@ -PyGithub==1.54.1 \ - --hash=sha256:87afd6a67ea582aa7533afdbf41635725f13d12581faed7e3e04b1579c0c0627 \ - --hash=sha256:300bc16e62886ca6537b0830e8f516ea4bc3ef12d308e0c5aff8bdbd099173d4 -requests==2.25.1 \ - --hash=sha256:c210084e36a42ae6b9219e00e48287def368a26d03a048ddad7bfee44f75871e \ - --hash=sha256:27973dd4a904a4f13b263a19c866c13b92a39ed1c964655f025f3f8d3d75b804 -Deprecated==1.2.12 \ +# +# This file is autogenerated by pip-compile +# To update, run: +# +# pip-compile --generate-hashes tools/dependency/requirements.txt +# +certifi==2020.12.5 \ + --hash=sha256:1a4995114262bffbc2413b159f2a1a480c969de6e6eb13ee966d470af86af59c \ + --hash=sha256:719a74fb9e33b9bd44cc7f3a8d94bc35e4049deebe19ba7d8e108280cfd59830 + # via + # -r tools/dependency/requirements.txt + # requests +cffi==1.14.5 \ + --hash=sha256:005a36f41773e148deac64b08f233873a4d0c18b053d37da83f6af4d9087b813 \ + --hash=sha256:0857f0ae312d855239a55c81ef453ee8fd24136eaba8e87a2eceba644c0d4c06 \ + --hash=sha256:1071534bbbf8cbb31b498d5d9db0f274f2f7a865adca4ae429e147ba40f73dea \ + --hash=sha256:158d0d15119b4b7ff6b926536763dc0714313aa59e320ddf787502c70c4d4bee \ + --hash=sha256:1f436816fc868b098b0d63b8920de7d208c90a67212546d02f84fe78a9c26396 \ + --hash=sha256:2894f2df484ff56d717bead0a5c2abb6b9d2bf26d6960c4604d5c48bbc30ee73 \ + --hash=sha256:29314480e958fd8aab22e4a58b355b629c59bf5f2ac2492b61e3dc06d8c7a315 \ + --hash=sha256:34eff4b97f3d982fb93e2831e6750127d1355a923ebaeeb565407b3d2f8d41a1 \ + --hash=sha256:35f27e6eb43380fa080dccf676dece30bef72e4a67617ffda586641cd4508d49 \ + --hash=sha256:3d3dd4c9e559eb172ecf00a2a7517e97d1e96de2a5e610bd9b68cea3925b4892 \ + --hash=sha256:43e0b9d9e2c9e5d152946b9c5fe062c151614b262fda2e7b201204de0b99e482 \ + --hash=sha256:48e1c69bbacfc3d932221851b39d49e81567a4d4aac3b21258d9c24578280058 \ + --hash=sha256:51182f8927c5af975fece87b1b369f722c570fe169f9880764b1ee3bca8347b5 \ + --hash=sha256:58e3f59d583d413809d60779492342801d6e82fefb89c86a38e040c16883be53 \ + --hash=sha256:5de7970188bb46b7bf9858eb6890aad302577a5f6f75091fd7cdd3ef13ef3045 \ + --hash=sha256:65fa59693c62cf06e45ddbb822165394a288edce9e276647f0046e1ec26920f3 \ + --hash=sha256:69e395c24fc60aad6bb4fa7e583698ea6cc684648e1ffb7fe85e3c1ca131a7d5 \ + --hash=sha256:6c97d7350133666fbb5cf4abdc1178c812cb205dc6f41d174a7b0f18fb93337e \ + --hash=sha256:6e4714cc64f474e4d6e37cfff31a814b509a35cb17de4fb1999907575684479c \ + --hash=sha256:72d8d3ef52c208ee1c7b2e341f7d71c6fd3157138abf1a95166e6165dd5d4369 \ + --hash=sha256:8ae6299f6c68de06f136f1f9e69458eae58f1dacf10af5c17353eae03aa0d827 \ + --hash=sha256:8b198cec6c72df5289c05b05b8b0969819783f9418e0409865dac47288d2a053 \ + --hash=sha256:99cd03ae7988a93dd00bcd9d0b75e1f6c426063d6f03d2f90b89e29b25b82dfa \ + --hash=sha256:9cf8022fb8d07a97c178b02327b284521c7708d7c71a9c9c355c178ac4bbd3d4 \ + --hash=sha256:9de2e279153a443c656f2defd67769e6d1e4163952b3c622dcea5b08a6405322 \ + --hash=sha256:9e93e79c2551ff263400e1e4be085a1210e12073a31c2011dbbda14bda0c6132 \ + --hash=sha256:9ff227395193126d82e60319a673a037d5de84633f11279e336f9c0f189ecc62 \ + --hash=sha256:a465da611f6fa124963b91bf432d960a555563efe4ed1cc403ba5077b15370aa \ + --hash=sha256:ad17025d226ee5beec591b52800c11680fca3df50b8b29fe51d882576e039ee0 \ + --hash=sha256:afb29c1ba2e5a3736f1c301d9d0abe3ec8b86957d04ddfa9d7a6a42b9367e396 \ + --hash=sha256:b85eb46a81787c50650f2392b9b4ef23e1f126313b9e0e9013b35c15e4288e2e \ + --hash=sha256:bb89f306e5da99f4d922728ddcd6f7fcebb3241fc40edebcb7284d7514741991 \ + --hash=sha256:cbde590d4faaa07c72bf979734738f328d239913ba3e043b1e98fe9a39f8b2b6 \ + --hash=sha256:cd2868886d547469123fadc46eac7ea5253ea7fcb139f12e1dfc2bbd406427d1 \ + --hash=sha256:d42b11d692e11b6634f7613ad8df5d6d5f8875f5d48939520d351007b3c13406 \ + --hash=sha256:f2d45f97ab6bb54753eab54fffe75aaf3de4ff2341c9daee1987ee1837636f1d \ + --hash=sha256:fd78e5fee591709f32ef6edb9a015b4aa1a5022598e36227500c8f4e02328d9c + # via pynacl +chardet==4.0.0 \ + --hash=sha256:0d6f53a15db4120f2b08c94f11e7d93d2c911ee118b6b30a04ec3ee8310179fa \ + --hash=sha256:f864054d66fd9118f2e67044ac8981a54775ec5b67aed0441892edb553d21da5 + # via + # -r tools/dependency/requirements.txt + # requests +deprecated==1.2.12 \ --hash=sha256:08452d69b6b5bc66e8330adde0a4f8642e969b9e1702904d137eeb29c8ffc771 \ --hash=sha256:6d2de2de7931a968874481ef30208fd4e08da39177d61d3d4ebdf4366e7dbca1 -PyJWT==1.7.1 \ - --hash=sha256:5c6eca3c2940464d106b99ba83b00c6add741c9becaec087fb7ccdefea71350e \ - --hash=sha256:8d59a976fb773f3e6a39c85636357c4f0e242707394cadadd9814f5cbaa20e96 -PyYAML==5.4.1 \ + # via + # -r tools/dependency/requirements.txt + # pygithub +idna==2.10 \ + --hash=sha256:b307872f855b18632ce0c21c5e45be78c0ea7ae4c15c828c20788b26921eb3f6 \ + --hash=sha256:b97d804b1e9b523befed77c48dacec60e6dcb0b5391d57af6a65a312a90648c0 + # via + # -r tools/dependency/requirements.txt + # requests +pycparser==2.20 \ + --hash=sha256:2d475327684562c3a96cc71adf7dc8c4f0565175cf86b6d7a404ff4c771f15f0 \ + --hash=sha256:7582ad22678f0fcd81102833f60ef8d0e57288b6b5fb00323d101be910e35705 + # via cffi +pygithub==1.55 \ + --hash=sha256:1bbfff9372047ff3f21d5cd8e07720f3dbfdaf6462fcaed9d815f528f1ba7283 \ + --hash=sha256:2caf0054ea079b71e539741ae56c5a95e073b81fa472ce222e81667381b9601b + # via -r tools/dependency/requirements.txt +pyjwt==2.0.1 \ + --hash=sha256:a5c70a06e1f33d81ef25eecd50d50bd30e34de1ca8b2b9fa3fe0daaabcf69bf7 \ + --hash=sha256:b70b15f89dc69b993d8a8d32c299032d5355c82f9b5b7e851d1a6d706dffe847 + # via pygithub +pynacl==1.4.0 \ + --hash=sha256:06cbb4d9b2c4bd3c8dc0d267416aaed79906e7b33f114ddbf0911969794b1cc4 \ + --hash=sha256:11335f09060af52c97137d4ac54285bcb7df0cef29014a1a4efe64ac065434c4 \ + --hash=sha256:2fe0fc5a2480361dcaf4e6e7cea00e078fcda07ba45f811b167e3f99e8cff574 \ + --hash=sha256:30f9b96db44e09b3304f9ea95079b1b7316b2b4f3744fe3aaecccd95d547063d \ + --hash=sha256:4e10569f8cbed81cb7526ae137049759d2a8d57726d52c1a000a3ce366779634 \ + --hash=sha256:511d269ee845037b95c9781aa702f90ccc36036f95d0f31373a6a79bd8242e25 \ + --hash=sha256:537a7ccbea22905a0ab36ea58577b39d1fa9b1884869d173b5cf111f006f689f \ + --hash=sha256:54e9a2c849c742006516ad56a88f5c74bf2ce92c9f67435187c3c5953b346505 \ + --hash=sha256:757250ddb3bff1eecd7e41e65f7f833a8405fede0194319f87899690624f2122 \ + --hash=sha256:7757ae33dae81c300487591c68790dfb5145c7d03324000433d9a2c141f82af7 \ + --hash=sha256:7c6092102219f59ff29788860ccb021e80fffd953920c4a8653889c029b2d420 \ + --hash=sha256:8122ba5f2a2169ca5da936b2e5a511740ffb73979381b4229d9188f6dcb22f1f \ + --hash=sha256:9c4a7ea4fb81536c1b1f5cc44d54a296f96ae78c1ebd2311bd0b60be45a48d96 \ + --hash=sha256:c914f78da4953b33d4685e3cdc7ce63401247a21425c16a39760e282075ac4a6 \ + --hash=sha256:cd401ccbc2a249a47a3a1724c2918fcd04be1f7b54eb2a5a71ff915db0ac51c6 \ + --hash=sha256:d452a6746f0a7e11121e64625109bc4468fc3100452817001dbe018bb8b08514 \ + --hash=sha256:ea6841bc3a76fa4942ce00f3bda7d436fda21e2d91602b9e21b7ca9ecab8f3ff \ + --hash=sha256:f8851ab9041756003119368c1e6cd0b9c631f46d686b3904b18c0139f4419f80 + # via pygithub +pyyaml==5.4.1 \ --hash=sha256:08682f6b72c722394747bddaf0aa62277e02557c0fd1c42cb853016a38f8dedf \ --hash=sha256:0f5f5786c0e09baddcd8b4b45f20a7b5d61a7e7e99846e3c799b05c7c53fa696 \ --hash=sha256:129def1b7c1bf22faffd67b8f3724645203b79d8f4cc81f674654d9902cb4393 \ @@ -40,17 +129,25 @@ PyYAML==5.4.1 \ --hash=sha256:fd7f6999a8070df521b6384004ef42833b9bd62cfee11a09bda1079b4b704247 \ --hash=sha256:fdc842473cd33f45ff6bce46aea678a54e3d21f1b61a7750ce3c498eedfe25d6 \ --hash=sha256:fe69978f3f768926cfa37b867e3843918e012cf83f680806599ddce33c2c68b0 -certifi==2020.12.5 \ - --hash=sha256:719a74fb9e33b9bd44cc7f3a8d94bc35e4049deebe19ba7d8e108280cfd59830 \ - --hash=sha256:1a4995114262bffbc2413b159f2a1a480c969de6e6eb13ee966d470af86af59c -chardet==4.0.0 \ - --hash=sha256:f864054d66fd9118f2e67044ac8981a54775ec5b67aed0441892edb553d21da5 \ - --hash=sha256:0d6f53a15db4120f2b08c94f11e7d93d2c911ee118b6b30a04ec3ee8310179fa -idna==2.10 \ - --hash=sha256:b307872f855b18632ce0c21c5e45be78c0ea7ae4c15c828c20788b26921eb3f6 \ - --hash=sha256:b97d804b1e9b523befed77c48dacec60e6dcb0b5391d57af6a65a312a90648c0 -wrapt==1.12.1 \ - --hash=sha256:b62ffa81fb85f4332a4f609cab4ac40709470da05643a082ec1eb88e6d9b97d7 + # via -r tools/dependency/requirements.txt +requests==2.25.1 \ + --hash=sha256:27973dd4a904a4f13b263a19c866c13b92a39ed1c964655f025f3f8d3d75b804 \ + --hash=sha256:c210084e36a42ae6b9219e00e48287def368a26d03a048ddad7bfee44f75871e + # via + # -r tools/dependency/requirements.txt + # pygithub +six==1.15.0 \ + --hash=sha256:30639c035cdb23534cd4aa2dd52c3bf48f06e5f4a941509c8bafd8ce11080259 \ + --hash=sha256:8b74bedcbbbaca38ff6d7491d76f2b06b3592611af620f8426e82dddb04a5ced + # via pynacl urllib3==1.26.4 \ --hash=sha256:2f4da4594db7e1e110a944bb1b551fdf4e6c136ad42e4234131391e21eb5b0df \ --hash=sha256:e7b021f7241115872f92f43c6508082facffbd1c048e3c6e2bb9c2a157e28937 + # via + # -r tools/dependency/requirements.txt + # requests +wrapt==1.12.1 \ + --hash=sha256:b62ffa81fb85f4332a4f609cab4ac40709470da05643a082ec1eb88e6d9b97d7 + # via + # -r tools/dependency/requirements.txt + # deprecated diff --git a/tools/deprecate_version/requirements.txt b/tools/deprecate_version/requirements.txt index c374c121ce1e..c49422bdc0fe 100644 --- a/tools/deprecate_version/requirements.txt +++ b/tools/deprecate_version/requirements.txt @@ -10,6 +10,45 @@ certifi==2020.12.5 \ # via # -r tools/deprecate_version/requirements.txt # requests +cffi==1.14.5 \ + --hash=sha256:005a36f41773e148deac64b08f233873a4d0c18b053d37da83f6af4d9087b813 \ + --hash=sha256:0857f0ae312d855239a55c81ef453ee8fd24136eaba8e87a2eceba644c0d4c06 \ + --hash=sha256:1071534bbbf8cbb31b498d5d9db0f274f2f7a865adca4ae429e147ba40f73dea \ + --hash=sha256:158d0d15119b4b7ff6b926536763dc0714313aa59e320ddf787502c70c4d4bee \ + --hash=sha256:1f436816fc868b098b0d63b8920de7d208c90a67212546d02f84fe78a9c26396 \ + --hash=sha256:2894f2df484ff56d717bead0a5c2abb6b9d2bf26d6960c4604d5c48bbc30ee73 \ + --hash=sha256:29314480e958fd8aab22e4a58b355b629c59bf5f2ac2492b61e3dc06d8c7a315 \ + --hash=sha256:34eff4b97f3d982fb93e2831e6750127d1355a923ebaeeb565407b3d2f8d41a1 \ + --hash=sha256:35f27e6eb43380fa080dccf676dece30bef72e4a67617ffda586641cd4508d49 \ + --hash=sha256:3d3dd4c9e559eb172ecf00a2a7517e97d1e96de2a5e610bd9b68cea3925b4892 \ + --hash=sha256:43e0b9d9e2c9e5d152946b9c5fe062c151614b262fda2e7b201204de0b99e482 \ + --hash=sha256:48e1c69bbacfc3d932221851b39d49e81567a4d4aac3b21258d9c24578280058 \ + --hash=sha256:51182f8927c5af975fece87b1b369f722c570fe169f9880764b1ee3bca8347b5 \ + --hash=sha256:58e3f59d583d413809d60779492342801d6e82fefb89c86a38e040c16883be53 \ + --hash=sha256:5de7970188bb46b7bf9858eb6890aad302577a5f6f75091fd7cdd3ef13ef3045 \ + --hash=sha256:65fa59693c62cf06e45ddbb822165394a288edce9e276647f0046e1ec26920f3 \ + --hash=sha256:69e395c24fc60aad6bb4fa7e583698ea6cc684648e1ffb7fe85e3c1ca131a7d5 \ + --hash=sha256:6c97d7350133666fbb5cf4abdc1178c812cb205dc6f41d174a7b0f18fb93337e \ + --hash=sha256:6e4714cc64f474e4d6e37cfff31a814b509a35cb17de4fb1999907575684479c \ + --hash=sha256:72d8d3ef52c208ee1c7b2e341f7d71c6fd3157138abf1a95166e6165dd5d4369 \ + --hash=sha256:8ae6299f6c68de06f136f1f9e69458eae58f1dacf10af5c17353eae03aa0d827 \ + --hash=sha256:8b198cec6c72df5289c05b05b8b0969819783f9418e0409865dac47288d2a053 \ + --hash=sha256:99cd03ae7988a93dd00bcd9d0b75e1f6c426063d6f03d2f90b89e29b25b82dfa \ + --hash=sha256:9cf8022fb8d07a97c178b02327b284521c7708d7c71a9c9c355c178ac4bbd3d4 \ + --hash=sha256:9de2e279153a443c656f2defd67769e6d1e4163952b3c622dcea5b08a6405322 \ + --hash=sha256:9e93e79c2551ff263400e1e4be085a1210e12073a31c2011dbbda14bda0c6132 \ + --hash=sha256:9ff227395193126d82e60319a673a037d5de84633f11279e336f9c0f189ecc62 \ + --hash=sha256:a465da611f6fa124963b91bf432d960a555563efe4ed1cc403ba5077b15370aa \ + --hash=sha256:ad17025d226ee5beec591b52800c11680fca3df50b8b29fe51d882576e039ee0 \ + --hash=sha256:afb29c1ba2e5a3736f1c301d9d0abe3ec8b86957d04ddfa9d7a6a42b9367e396 \ + --hash=sha256:b85eb46a81787c50650f2392b9b4ef23e1f126313b9e0e9013b35c15e4288e2e \ + --hash=sha256:bb89f306e5da99f4d922728ddcd6f7fcebb3241fc40edebcb7284d7514741991 \ + --hash=sha256:cbde590d4faaa07c72bf979734738f328d239913ba3e043b1e98fe9a39f8b2b6 \ + --hash=sha256:cd2868886d547469123fadc46eac7ea5253ea7fcb139f12e1dfc2bbd406427d1 \ + --hash=sha256:d42b11d692e11b6634f7613ad8df5d6d5f8875f5d48939520d351007b3c13406 \ + --hash=sha256:f2d45f97ab6bb54753eab54fffe75aaf3de4ff2341c9daee1987ee1837636f1d \ + --hash=sha256:fd78e5fee591709f32ef6edb9a015b4aa1a5022598e36227500c8f4e02328d9c + # via pynacl chardet==4.0.0 \ --hash=sha256:0d6f53a15db4120f2b08c94f11e7d93d2c911ee118b6b30a04ec3ee8310179fa \ --hash=sha256:f864054d66fd9118f2e67044ac8981a54775ec5b67aed0441892edb553d21da5 @@ -38,22 +77,48 @@ idna==2.10 \ # via # -r tools/deprecate_version/requirements.txt # requests -pygithub==1.54.1 \ - --hash=sha256:300bc16e62886ca6537b0830e8f516ea4bc3ef12d308e0c5aff8bdbd099173d4 \ - --hash=sha256:87afd6a67ea582aa7533afdbf41635725f13d12581faed7e3e04b1579c0c0627 +pycparser==2.20 \ + --hash=sha256:2d475327684562c3a96cc71adf7dc8c4f0565175cf86b6d7a404ff4c771f15f0 \ + --hash=sha256:7582ad22678f0fcd81102833f60ef8d0e57288b6b5fb00323d101be910e35705 + # via cffi +pygithub==1.55 \ + --hash=sha256:1bbfff9372047ff3f21d5cd8e07720f3dbfdaf6462fcaed9d815f528f1ba7283 \ + --hash=sha256:2caf0054ea079b71e539741ae56c5a95e073b81fa472ce222e81667381b9601b # via -r tools/deprecate_version/requirements.txt -pyjwt==1.7.1 \ - --hash=sha256:5c6eca3c2940464d106b99ba83b00c6add741c9becaec087fb7ccdefea71350e \ - --hash=sha256:8d59a976fb773f3e6a39c85636357c4f0e242707394cadadd9814f5cbaa20e96 - # via - # -r tools/deprecate_version/requirements.txt - # pygithub +pyjwt==2.0.1 \ + --hash=sha256:a5c70a06e1f33d81ef25eecd50d50bd30e34de1ca8b2b9fa3fe0daaabcf69bf7 \ + --hash=sha256:b70b15f89dc69b993d8a8d32c299032d5355c82f9b5b7e851d1a6d706dffe847 + # via pygithub +pynacl==1.4.0 \ + --hash=sha256:06cbb4d9b2c4bd3c8dc0d267416aaed79906e7b33f114ddbf0911969794b1cc4 \ + --hash=sha256:11335f09060af52c97137d4ac54285bcb7df0cef29014a1a4efe64ac065434c4 \ + --hash=sha256:2fe0fc5a2480361dcaf4e6e7cea00e078fcda07ba45f811b167e3f99e8cff574 \ + --hash=sha256:30f9b96db44e09b3304f9ea95079b1b7316b2b4f3744fe3aaecccd95d547063d \ + --hash=sha256:4e10569f8cbed81cb7526ae137049759d2a8d57726d52c1a000a3ce366779634 \ + --hash=sha256:511d269ee845037b95c9781aa702f90ccc36036f95d0f31373a6a79bd8242e25 \ + --hash=sha256:537a7ccbea22905a0ab36ea58577b39d1fa9b1884869d173b5cf111f006f689f \ + --hash=sha256:54e9a2c849c742006516ad56a88f5c74bf2ce92c9f67435187c3c5953b346505 \ + --hash=sha256:757250ddb3bff1eecd7e41e65f7f833a8405fede0194319f87899690624f2122 \ + --hash=sha256:7757ae33dae81c300487591c68790dfb5145c7d03324000433d9a2c141f82af7 \ + --hash=sha256:7c6092102219f59ff29788860ccb021e80fffd953920c4a8653889c029b2d420 \ + --hash=sha256:8122ba5f2a2169ca5da936b2e5a511740ffb73979381b4229d9188f6dcb22f1f \ + --hash=sha256:9c4a7ea4fb81536c1b1f5cc44d54a296f96ae78c1ebd2311bd0b60be45a48d96 \ + --hash=sha256:c914f78da4953b33d4685e3cdc7ce63401247a21425c16a39760e282075ac4a6 \ + --hash=sha256:cd401ccbc2a249a47a3a1724c2918fcd04be1f7b54eb2a5a71ff915db0ac51c6 \ + --hash=sha256:d452a6746f0a7e11121e64625109bc4468fc3100452817001dbe018bb8b08514 \ + --hash=sha256:ea6841bc3a76fa4942ce00f3bda7d436fda21e2d91602b9e21b7ca9ecab8f3ff \ + --hash=sha256:f8851ab9041756003119368c1e6cd0b9c631f46d686b3904b18c0139f4419f80 + # via pygithub requests==2.25.1 \ --hash=sha256:27973dd4a904a4f13b263a19c866c13b92a39ed1c964655f025f3f8d3d75b804 \ --hash=sha256:c210084e36a42ae6b9219e00e48287def368a26d03a048ddad7bfee44f75871e # via # -r tools/deprecate_version/requirements.txt # pygithub +six==1.15.0 \ + --hash=sha256:30639c035cdb23534cd4aa2dd52c3bf48f06e5f4a941509c8bafd8ce11080259 \ + --hash=sha256:8b74bedcbbbaca38ff6d7491d76f2b06b3592611af620f8426e82dddb04a5ced + # via pynacl smmap==4.0.0 \ --hash=sha256:7e65386bd122d45405ddf795637b7f7d2b532e7e401d46bbe3fb49b9986d5182 \ --hash=sha256:a9a7479e4c572e2e775c404dcd3080c8dc49f39918c2cf74913d30c4c478e3c2 @@ -64,7 +129,9 @@ typing-extensions==3.7.4.3 \ --hash=sha256:7cb407020f00f7bfc3cb3e7881628838e69d8f3fcab2f64742a5e76b2f841918 \ --hash=sha256:99d4073b617d30288f569d3f13d2bd7548c3a7e4c8de87db09a9d29bb3a4a60c \ --hash=sha256:dafc7639cde7f1b6e1acc0f457842a83e722ccca8eef5270af2d74792619a89f - # via gitpython + # via + # -r tools/deprecate_version/requirements.txt + # gitpython urllib3==1.26.4 \ --hash=sha256:2f4da4594db7e1e110a944bb1b551fdf4e6c136ad42e4234131391e21eb5b0df \ --hash=sha256:e7b021f7241115872f92f43c6508082facffbd1c048e3c6e2bb9c2a157e28937 diff --git a/tools/github/requirements.txt b/tools/github/requirements.txt index b38097a0710e..603347540d22 100644 --- a/tools/github/requirements.txt +++ b/tools/github/requirements.txt @@ -1,3 +1,3 @@ -PyGithub==1.54.1 \ - --hash=sha256:87afd6a67ea582aa7533afdbf41635725f13d12581faed7e3e04b1579c0c0627 \ - --hash=sha256:300bc16e62886ca6537b0830e8f516ea4bc3ef12d308e0c5aff8bdbd099173d4 +PyGithub==1.55 \ + --hash=sha256:2caf0054ea079b71e539741ae56c5a95e073b81fa472ce222e81667381b9601b \ + --hash=sha256:1bbfff9372047ff3f21d5cd8e07720f3dbfdaf6462fcaed9d815f528f1ba7283