6
envoy_core "github.com/envoyproxy/go-control-plane/envoy/config/core/v3"
7
envoy_cache "github.com/envoyproxy/go-control-plane/pkg/cache/v3"
9
config_core "github.com/kumahq/kuma/pkg/config/core"
10
"github.com/kumahq/kuma/pkg/core"
11
"github.com/kumahq/kuma/pkg/util/xds"
12
util_xds_v3 "github.com/kumahq/kuma/pkg/util/xds/v3"
15
var log = core.Log.WithName("kds").WithName("reconcile")
18
hasher envoy_cache.NodeHash,
19
cache util_xds_v3.SnapshotCache,
20
generator SnapshotGenerator,
21
versioner util_xds_v3.SnapshotVersioner,
22
mode config_core.CpMode,
23
statsCallbacks xds.StatsCallbacks,
31
statsCallbacks: statsCallbacks,
35
type reconciler struct {
36
hasher envoy_cache.NodeHash
37
cache util_xds_v3.SnapshotCache
38
generator SnapshotGenerator
39
versioner util_xds_v3.SnapshotVersioner
40
mode config_core.CpMode
41
statsCallbacks xds.StatsCallbacks
44
func (r *reconciler) Clear(ctx context.Context, node *envoy_core.Node) {
45
id := r.hasher.ID(node)
46
snapshot := r.cache.ClearSnapshot(id)
50
for _, typ := range snapshot.GetSupportedTypes() {
51
r.statsCallbacks.DiscardConfig(snapshot.GetVersion(typ))
55
func (r *reconciler) Reconcile(ctx context.Context, node *envoy_core.Node) error {
56
new, err := r.generator.GenerateSnapshot(ctx, node)
60
if err := new.Consistent(); err != nil {
63
id := r.hasher.ID(node)
64
old, _ := r.cache.GetSnapshot(id)
65
new = r.versioner.Version(new, old)
66
r.logChanges(new, old, node)
67
r.meterConfigReadyForDelivery(new, old)
68
return r.cache.SetSnapshot(id, new)
71
func (r *reconciler) logChanges(new util_xds_v3.Snapshot, old util_xds_v3.Snapshot, node *envoy_core.Node) {
72
for _, typ := range new.GetSupportedTypes() {
73
if old != nil && old.GetVersion(typ) != new.GetVersion(typ) {
75
if r.mode == config_core.Zone {
79
log.Info("detected changes in the resources. Sending changes to the client.", "resourceType", typ, "client", client)
84
func (r *reconciler) meterConfigReadyForDelivery(new util_xds_v3.Snapshot, old util_xds_v3.Snapshot) {
85
for _, typ := range new.GetSupportedTypes() {
86
if old == nil || old.GetVersion(typ) != new.GetVersion(typ) {
87
r.statsCallbacks.ConfigReadyForDelivery(new.GetVersion(typ))