in pkg/hds/tracker/healthcheck_generator.go [63:151]
func (g *SnapshotGenerator) GenerateSnapshot(ctx context.Context, node *envoy_core.Node) (util_xds_v3.Snapshot, error) {
proxyId, err := xds.ParseProxyIdFromString(node.Id)
if err != nil {
return nil, err
}
dp := mesh.NewDataplaneResource()
if err := g.readOnlyResourceManager.Get(ctx, dp, store.GetBy(proxyId.ToResourceKey())); err != nil {
return nil, err
}
healthChecks := []*envoy_service_health.ClusterHealthCheck{
g.envoyHealthCheck(dp.AdminPort(g.defaultAdminPort)),
}
for _, inbound := range dp.Spec.GetNetworking().GetInbound() {
if inbound.ServiceProbe == nil {
continue
}
serviceProbe := inbound.ServiceProbe
intf := dp.Spec.GetNetworking().ToInboundInterface(inbound)
var timeout *durationpb.Duration
if serviceProbe.Timeout == nil {
timeout = util_proto.Duration(g.config.CheckDefaults.Timeout.Duration)
} else {
timeout = serviceProbe.Timeout
}
var interval *durationpb.Duration
if serviceProbe.Timeout == nil {
interval = util_proto.Duration(g.config.CheckDefaults.Interval.Duration)
} else {
interval = serviceProbe.Interval
}
var healthyThreshold *wrapperspb.UInt32Value
if serviceProbe.HealthyThreshold == nil {
healthyThreshold = util_proto.UInt32(g.config.CheckDefaults.HealthyThreshold)
} else {
healthyThreshold = serviceProbe.HealthyThreshold
}
var unhealthyThreshold *wrapperspb.UInt32Value
if serviceProbe.UnhealthyThreshold == nil {
unhealthyThreshold = util_proto.UInt32(g.config.CheckDefaults.UnhealthyThreshold)
} else {
unhealthyThreshold = serviceProbe.UnhealthyThreshold
}
hc := &envoy_service_health.ClusterHealthCheck{
ClusterName: names.GetLocalClusterName(intf.WorkloadPort),
LocalityEndpoints: []*envoy_service_health.LocalityEndpoints{{
Endpoints: []*envoy_endpoint.Endpoint{{
Address: &envoy_core.Address{
Address: &envoy_core.Address_SocketAddress{
SocketAddress: &envoy_core.SocketAddress{
Address: intf.WorkloadIP,
PortSpecifier: &envoy_core.SocketAddress_PortValue{
PortValue: intf.WorkloadPort,
},
},
},
},
}},
}},
HealthChecks: []*envoy_core.HealthCheck{
{
Timeout: timeout,
Interval: interval,
HealthyThreshold: healthyThreshold,
UnhealthyThreshold: unhealthyThreshold,
NoTrafficInterval: util_proto.Duration(g.config.CheckDefaults.NoTrafficInterval.Duration),
HealthChecker: &envoy_core.HealthCheck_TcpHealthCheck_{
TcpHealthCheck: &envoy_core.HealthCheck_TcpHealthCheck{},
},
},
},
}
healthChecks = append(healthChecks, hc)
}
hcs := &envoy_service_health.HealthCheckSpecifier{
ClusterHealthChecks: healthChecks,
Interval: util_proto.Duration(g.config.Interval.Duration),
}
return cache.NewSnapshot("", hcs), nil
}