Skip to content

Commit bbee848

Browse files
committed
complete
Signed-off-by: Kuat Yessenov <[email protected]>
1 parent 3187630 commit bbee848

File tree

13 files changed

+829
-254
lines changed

13 files changed

+829
-254
lines changed

go.mod

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,22 +8,22 @@ require (
88
cloud.google.com/go/trace v1.4.0
99
github.com/cncf/xds/go v0.0.0-20221128185840-c261a164b73d
1010
github.com/d4l3k/messagediff v1.2.2-0.20180726183240-b9e99b2f9263
11-
github.com/envoyproxy/go-control-plane v0.10.3-0.20221213161420-c99aac2a2f43
11+
github.com/envoyproxy/go-control-plane v0.11.0
1212
github.com/golang/protobuf v1.5.2
1313
github.com/google/go-cmp v0.5.9
1414
github.com/prometheus/client_model v0.3.0
1515
github.com/prometheus/common v0.38.0
1616
google.golang.org/genproto v0.0.0-20221207170731-23e4bf6bdc37
17-
google.golang.org/grpc v1.51.0
17+
google.golang.org/grpc v1.52.0
1818
google.golang.org/protobuf v1.28.1
1919
gopkg.in/yaml.v2 v2.4.0
2020
sigs.k8s.io/yaml v1.3.0
2121
)
2222

2323
require (
2424
cloud.google.com/go/longrunning v0.3.0 // indirect
25-
github.com/census-instrumentation/opencensus-proto v0.3.0 // indirect
26-
github.com/envoyproxy/protoc-gen-validate v0.6.7 // indirect
25+
github.com/census-instrumentation/opencensus-proto v0.4.1 // indirect
26+
github.com/envoyproxy/protoc-gen-validate v0.9.1 // indirect
2727
github.com/matttproud/golang_protobuf_extensions v1.0.2 // indirect
2828
github.com/stretchr/testify v1.8.1 // indirect
2929
golang.org/x/net v0.7.0 // indirect

go.sum

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,8 @@ github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kd
4646
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
4747
github.com/census-instrumentation/opencensus-proto v0.3.0 h1:t/LhUZLVitR1Ow2YOnduCsavhwFUklBMoGVYUCqmCqk=
4848
github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
49+
github.com/census-instrumentation/opencensus-proto v0.4.1 h1:iKLQ0xPNFxR/2hzXZMrBo8f1j86j5WHzznCCQxV/b8g=
50+
github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw=
4951
github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
5052
github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
5153
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
@@ -75,9 +77,13 @@ github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.m
7577
github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0=
7678
github.com/envoyproxy/go-control-plane v0.10.3-0.20221213161420-c99aac2a2f43 h1:PtquDI1L8Ak/ALyHzCoyrJ9SI556KvFO/jfFX3Qh8M8=
7779
github.com/envoyproxy/go-control-plane v0.10.3-0.20221213161420-c99aac2a2f43/go.mod h1:ufpOdMVWU+v42FYQiIBUhSWglFcK3S1Ml8bbzLwkdcE=
80+
github.com/envoyproxy/go-control-plane v0.11.0 h1:jtLewhRR2vMRNnq2ZZUoCjUlgut+Y0+sDDWPOfwOi1o=
81+
github.com/envoyproxy/go-control-plane v0.11.0/go.mod h1:VnHyVMpzcLvCFt9yUz1UnCwHLhwx1WguiVDV7pTG/tI=
7882
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
7983
github.com/envoyproxy/protoc-gen-validate v0.6.7 h1:qcZcULcd/abmQg6dwigimCNEyi4gg31M/xaciQlDml8=
8084
github.com/envoyproxy/protoc-gen-validate v0.6.7/go.mod h1:dyJXwwfPK2VSqiB9Klm1J6romD608Ba7Hij42vrOBCo=
85+
github.com/envoyproxy/protoc-gen-validate v0.9.1 h1:PS7VIOgmSVhWUEeZwTe7z7zouA22Cr590PzXKbZHOVY=
86+
github.com/envoyproxy/protoc-gen-validate v0.9.1/go.mod h1:OKNgG7TCp5pF4d6XftA0++PMirau2/yoOwVac3AbF2w=
8187
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
8288
github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
8389
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
@@ -261,6 +267,10 @@ golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96b
261267
golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
262268
golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g=
263269
golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
270+
golang.org/x/net v0.0.0-20221014081412-f15817d10f9b h1:tvrvnPFcdzp294diPnrdZZZ8XUt2Tyj7svb7X52iDuU=
271+
golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=
272+
golang.org/x/net v0.4.0 h1:Q5QPcMlvfxFTAPV0+07Xz/MpK9NTXu2VDUuy0FeMfaU=
273+
golang.org/x/net v0.4.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE=
264274
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
265275
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
266276
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
@@ -308,6 +318,10 @@ golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBc
308318
golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
309319
golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU=
310320
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
321+
golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10 h1:WIoqL4EROvwiPdUtaip4VcDdpZ4kha7wBWZrbVKCIZg=
322+
golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
323+
golang.org/x/sys v0.3.0 h1:w8ZOecv6NaNa/zC8944JTU3vz4u6Lagfk4RPQxv92NQ=
324+
golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
311325
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
312326
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
313327
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
@@ -319,6 +333,10 @@ golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
319333
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
320334
golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo=
321335
golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
336+
golang.org/x/text v0.4.0 h1:BrVqGRd7+k1DiOgtnFvAkoQEWQvBc25ouMJM6429SFg=
337+
golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
338+
golang.org/x/text v0.5.0 h1:OLmvp0KP+FVG99Ct/qFiL/Fhk4zp4QQnZ7b2U+5piUM=
339+
golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
322340
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
323341
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
324342
golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
@@ -442,6 +460,8 @@ google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ5
442460
google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ=
443461
google.golang.org/grpc v1.51.0 h1:E1eGv1FTqoLIdnBCZufiSHgKjlqG6fKFf6pPWtMTh8U=
444462
google.golang.org/grpc v1.51.0/go.mod h1:wgNDFcnuBGmxLKI/qn4T+m5BtEBYXJPvibbUPsAIPww=
463+
google.golang.org/grpc v1.52.0 h1:kd48UiU7EHsV4rnLyOJRuP/Il/UHE7gdDAQ+SZI7nZk=
464+
google.golang.org/grpc v1.52.0/go.mod h1:pu6fVzoFb+NBYNAvQL08ic+lvB2IojljRYuun5vorUY=
445465
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
446466
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
447467
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=

source/extensions/common/workload_discovery/BUILD

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ envoy_cc_extension(
3737
"@envoy//envoy/server:bootstrap_extension_config_interface",
3838
"@envoy//envoy/server:factory_context_interface",
3939
"@envoy//envoy/singleton:manager_interface",
40+
"@envoy//envoy/stats:stats_macros",
4041
"@envoy//envoy/thread_local:thread_local_interface",
4142
"@envoy//source/common/common:non_copyable",
4243
"@envoy//source/common/config:subscription_base_interface",
@@ -47,7 +48,10 @@ envoy_cc_extension(
4748

4849
envoy_proto_library(
4950
name = "discovery",
50-
srcs = ["discovery.proto"],
51+
srcs = [
52+
"discovery.proto",
53+
"extension.proto",
54+
],
5155
deps = [
5256
"@envoy_api//envoy/config/core/v3:pkg",
5357
],

source/extensions/common/workload_discovery/api.cc

Lines changed: 196 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -16,68 +16,223 @@
1616

1717
#include "envoy/registry/registry.h"
1818
#include "envoy/server/bootstrap_extension_config.h"
19+
#include "envoy/server/factory_context.h"
20+
#include "envoy/singleton/manager.h"
21+
#include "envoy/thread_local/thread_local.h"
22+
#include "source/common/common/non_copyable.h"
23+
#include "source/common/config/subscription_base.h"
24+
#include "source/common/grpc/common.h"
25+
#include "source/common/init/target_impl.h"
26+
#include "source/extensions/common/workload_discovery/discovery.pb.h"
27+
#include "source/extensions/common/workload_discovery/discovery.pb.validate.h"
28+
#include "source/extensions/common/workload_discovery/extension.pb.h"
29+
#include "source/extensions/common/workload_discovery/extension.pb.validate.h"
1930

2031
namespace Envoy::Extensions::Common::WorkloadDiscovery {
2132

33+
namespace {
34+
Istio::Common::WorkloadMetadataObject convert(const istio::workload::Workload& workload) {
35+
auto workload_type = Istio::Common::WorkloadType::Deployment;
36+
switch (workload.workload_type()) {
37+
case istio::workload::WorkloadType::CRONJOB:
38+
workload_type = Istio::Common::WorkloadType::CronJob;
39+
break;
40+
case istio::workload::WorkloadType::JOB:
41+
workload_type = Istio::Common::WorkloadType::Job;
42+
break;
43+
case istio::workload::WorkloadType::POD:
44+
workload_type = Istio::Common::WorkloadType::Pod;
45+
break;
46+
default:
47+
break;
48+
}
49+
return Istio::Common::WorkloadMetadataObject(
50+
workload.name(), /* cluster_name */ "", workload.namespace_(), workload.workload_name(),
51+
workload.canonical_name(), workload.canonical_revision(), /* app_name */ "",
52+
/* app_version */ "", workload_type);
53+
}
54+
} // namespace
55+
56+
class WorkloadMetadataProviderImpl : public WorkloadMetadataProvider, public Singleton::Instance {
57+
public:
58+
WorkloadMetadataProviderImpl(const envoy::config::core::v3::ConfigSource& config_source,
59+
Server::Configuration::ServerFactoryContext& factory_context)
60+
: config_source_(config_source), factory_context_(factory_context),
61+
tls_(factory_context.threadLocal()),
62+
scope_(factory_context.scope().createScope("workload_discovery")),
63+
stats_(generateStats(*scope_)), subscription_(*this) {
64+
tls_.set([](Event::Dispatcher&) { return std::make_shared<ThreadLocalProvider>(); });
65+
// This is safe because the ADS mux is started in the cluster manager constructor prior to this
66+
// call.
67+
subscription_.start();
68+
}
69+
70+
std::optional<Istio::Common::WorkloadMetadataObject>
71+
GetMetadata(const Network::Address::InstanceConstSharedPtr& address) override {
72+
if (address && address->ip()) {
73+
if (const auto ipv4 = address->ip()->ipv4(); ipv4) {
74+
uint32_t value = ipv4->address();
75+
std::array<uint8_t, 4> output;
76+
absl::little_endian::Store32(&output, value);
77+
return tls_->get(std::string(output.begin(), output.end()));
78+
} else if (const auto ipv6 = address->ip()->ipv6(); ipv6) {
79+
const uint64_t high = absl::Uint128High64(ipv6->address());
80+
const uint64_t low = absl::Uint128Low64(ipv6->address());
81+
std::array<uint8_t, 16> output;
82+
absl::little_endian::Store64(&output, high);
83+
absl::little_endian::Store64(&output[8], low);
84+
return tls_->get(std::string(output.begin(), output.end()));
85+
}
86+
}
87+
return {};
88+
}
89+
90+
private:
91+
using AddressIndex = absl::flat_hash_map<std::string, Istio::Common::WorkloadMetadataObject>;
92+
using AddressIndexSharedPtr = std::shared_ptr<AddressIndex>;
93+
using AddressVector = std::vector<std::string>;
94+
using AddressVectorSharedPtr = std::shared_ptr<AddressVector>;
95+
96+
struct ThreadLocalProvider : public ThreadLocal::ThreadLocalObject {
97+
void reset(const AddressIndexSharedPtr& index) { address_index_ = *index; }
98+
void update(const AddressIndexSharedPtr& added, const AddressVectorSharedPtr& removed) {
99+
for (const auto& [address, workload] : *added) {
100+
address_index_.emplace(address, workload);
101+
}
102+
for (const auto& address : *removed) {
103+
address_index_.erase(address);
104+
}
105+
}
106+
size_t total() const { return address_index_.size(); }
107+
// Returns by-value since the flat map does not provide pointer stability.
108+
std::optional<Istio::Common::WorkloadMetadataObject> get(const std::string& address) {
109+
const auto it = address_index_.find(address);
110+
if (it != address_index_.end()) {
111+
return it->second;
112+
}
113+
return {};
114+
}
115+
AddressIndex address_index_;
116+
};
117+
class WorkloadSubscription : Config::SubscriptionBase<istio::workload::Workload> {
118+
public:
119+
WorkloadSubscription(WorkloadMetadataProviderImpl& parent)
120+
: Config::SubscriptionBase<istio::workload::Workload>(
121+
parent.factory_context_.messageValidationVisitor(), "address"),
122+
parent_(parent) {
123+
subscription_ = parent.factory_context_.clusterManager()
124+
.subscriptionFactory()
125+
.subscriptionFromConfigSource(
126+
parent.config_source_, Grpc::Common::typeUrl(getResourceName()),
127+
*parent.scope_, *this, resource_decoder_, {});
128+
}
129+
void start() { subscription_->start({}); }
130+
131+
private:
132+
// Config::SubscriptionCallbacks
133+
void onConfigUpdate(const std::vector<Config::DecodedResourceRef>& resources,
134+
const std::string&) override {
135+
AddressIndexSharedPtr index = std::make_shared<AddressIndex>();
136+
for (const auto& resource : resources) {
137+
const auto& workload =
138+
dynamic_cast<const istio::workload::Workload&>(resource.get().resource());
139+
index->emplace(workload.address(), convert(workload));
140+
}
141+
parent_.reset(index);
142+
}
143+
void onConfigUpdate(const std::vector<Config::DecodedResourceRef>& added_resources,
144+
const Protobuf::RepeatedPtrField<std::string>& removed_resources,
145+
const std::string&) override {
146+
AddressIndexSharedPtr added = std::make_shared<AddressIndex>();
147+
for (const auto& resource : added_resources) {
148+
const auto& workload =
149+
dynamic_cast<const istio::workload::Workload&>(resource.get().resource());
150+
added->emplace(workload.address(), convert(workload));
151+
}
152+
AddressVectorSharedPtr removed = std::make_shared<AddressVector>();
153+
removed->reserve(removed_resources.size());
154+
for (const auto& resource : removed_resources) {
155+
removed->push_back(resource);
156+
}
157+
parent_.update(added, removed);
158+
}
159+
void onConfigUpdateFailed(Config::ConfigUpdateFailureReason, const EnvoyException*) override {
160+
// Do nothing - feature is automatically disabled.
161+
// TODO: Potential issue with the expiration of the metadata.
162+
}
163+
WorkloadMetadataProviderImpl& parent_;
164+
Config::SubscriptionPtr subscription_;
165+
};
166+
167+
void reset(AddressIndexSharedPtr index) {
168+
tls_.runOnAllThreads([index](OptRef<ThreadLocalProvider> tls) { tls->reset(index); });
169+
stats_.total_.set(tls_->total());
170+
}
171+
172+
void update(AddressIndexSharedPtr added, AddressVectorSharedPtr removed) {
173+
tls_.runOnAllThreads(
174+
[added, removed](OptRef<ThreadLocalProvider> tls) { tls->update(added, removed); });
175+
stats_.total_.set(tls_->total());
176+
}
177+
178+
WorkloadDiscoveryStats generateStats(Stats::Scope& scope) {
179+
return WorkloadDiscoveryStats{WORKLOAD_DISCOVERY_STATS(POOL_GAUGE(scope))};
180+
}
181+
182+
const envoy::config::core::v3::ConfigSource config_source_;
183+
Server::Configuration::ServerFactoryContext& factory_context_;
184+
ThreadLocal::TypedSlot<ThreadLocalProvider> tls_;
185+
Stats::ScopeSharedPtr scope_;
186+
WorkloadDiscoveryStats stats_;
187+
WorkloadSubscription subscription_;
188+
};
189+
22190
SINGLETON_MANAGER_REGISTRATION(WorkloadMetadataProvider)
23191

24192
class WorkloadDiscoveryExtension : public Server::BootstrapExtension {
25-
public:
26-
WorkloadDiscoveryExtension(
27-
Server::Configuration::ServerFactoryContext& factory_context,
28-
const istio::workload_discovery::v1::BootstrapExtension& config)
193+
public:
194+
WorkloadDiscoveryExtension(Server::Configuration::ServerFactoryContext& factory_context,
195+
const istio::workload::BootstrapExtension& config)
29196
: factory_context_(factory_context), config_(config) {}
30197

31198
// Server::Configuration::BootstrapExtension
32199
void onServerInitialized() override {
33-
provider_ =
34-
factory_context_.singletonManager().getTyped<WorkloadMetadataProvider>(
35-
SINGLETON_MANAGER_REGISTERED_NAME(WorkloadMetadataProvider), [&] {
36-
return std::make_shared<WorkloadMetadataProvider>(
37-
config_.config_source(), factory_context_);
38-
});
39-
/* Example:
40-
provider_->fetch("127.0.0.1", [](const WorkloadRecordSharedPtr& record) {
41-
std::cout << "1: " << (record->metadata_.has_value() ?
42-
record->metadata_->baggage() : "(none)")
43-
<< std::endl;
44-
});
45-
provider_->fetch("127.0.0.2", [](const WorkloadRecordSharedPtr& record) {
46-
std::cout << "2: " << (record->metadata_.has_value() ?
47-
record->metadata_->baggage() : "(none)")
48-
<< std::endl;
49-
});
50-
*/
200+
provider_ = factory_context_.singletonManager().getTyped<WorkloadMetadataProvider>(
201+
SINGLETON_MANAGER_REGISTERED_NAME(WorkloadMetadataProvider), [&] {
202+
return std::make_shared<WorkloadMetadataProviderImpl>(config_.config_source(),
203+
factory_context_);
204+
});
51205
}
52206

53-
private:
207+
private:
54208
Server::Configuration::ServerFactoryContext& factory_context_;
55-
const istio::workload_discovery::v1::BootstrapExtension config_;
209+
const istio::workload::BootstrapExtension config_;
56210
WorkloadMetadataProviderSharedPtr provider_;
57211
};
58212

59-
class WorkloadDiscoveryFactory
60-
: public Server::Configuration::BootstrapExtensionFactory {
61-
public:
213+
class WorkloadDiscoveryFactory : public Server::Configuration::BootstrapExtensionFactory {
214+
public:
62215
// Server::Configuration::BootstrapExtensionFactory
63-
Server::BootstrapExtensionPtr createBootstrapExtension(
64-
const Protobuf::Message& config,
65-
Server::Configuration::ServerFactoryContext& context) override {
66-
const auto& message = MessageUtil::downcastAndValidate<
67-
const istio::workload_discovery::v1::BootstrapExtension&>(
68-
config, context.messageValidationVisitor());
216+
Server::BootstrapExtensionPtr
217+
createBootstrapExtension(const Protobuf::Message& config,
218+
Server::Configuration::ServerFactoryContext& context) override {
219+
const auto& message =
220+
MessageUtil::downcastAndValidate<const istio::workload::BootstrapExtension&>(
221+
config, context.messageValidationVisitor());
69222
return std::make_unique<WorkloadDiscoveryExtension>(context, message);
70223
}
71224
ProtobufTypes::MessagePtr createEmptyConfigProto() override {
72-
return std::make_unique<
73-
istio::workload_discovery::v1::BootstrapExtension>();
225+
return std::make_unique<istio::workload::BootstrapExtension>();
74226
}
75-
std::string name() const override {
76-
return "envoy.bootstrap.workload_discovery";
77-
};
227+
std::string name() const override { return "envoy.bootstrap.workload_discovery"; };
78228
};
79229

80-
REGISTER_FACTORY(WorkloadDiscoveryFactory,
81-
Server::Configuration::BootstrapExtensionFactory);
230+
REGISTER_FACTORY(WorkloadDiscoveryFactory, Server::Configuration::BootstrapExtensionFactory);
231+
232+
WorkloadMetadataProviderSharedPtr
233+
GetProvider(Server::Configuration::ServerFactoryContext& context) {
234+
return context.singletonManager().getTyped<WorkloadMetadataProvider>(
235+
SINGLETON_MANAGER_REGISTERED_NAME(WorkloadMetadataProvider));
236+
}
82237

83-
} // namespace Envoy::Extensions::Common::WorkloadDiscovery
238+
} // namespace Envoy::Extensions::Common::WorkloadDiscovery

0 commit comments

Comments
 (0)