forked from joeholley/supergloo
-
Notifications
You must be signed in to change notification settings - Fork 0
/
syncer.go
65 lines (56 loc) · 1.91 KB
/
syncer.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
package mesh
import (
"context"
"fmt"
"github.com/hashicorp/go-multierror"
"github.com/solo-io/go-utils/contextutils"
"github.com/solo-io/solo-kit/pkg/api/v1/clients"
v1 "github.com/solo-io/supergloo/pkg/api/v1"
"github.com/solo-io/supergloo/pkg/meshdiscovery/utils"
"go.uber.org/zap"
)
type meshDiscoverySyncer struct {
meshClient v1.MeshClient
plugins MeshDiscoveryPlugins
meshReconciler v1.MeshReconciler
}
// calling this function with nil is valid and expected outside of tests
func NewMeshDiscoverySyncer(meshClient v1.MeshClient, plugins ...MeshDiscovery) v1.DiscoverySyncer {
meshReconciler := v1.NewMeshReconciler(meshClient)
return &meshDiscoverySyncer{
meshClient: meshClient,
plugins: plugins,
meshReconciler: meshReconciler,
}
}
func (s *meshDiscoverySyncer) Sync(ctx context.Context, snap *v1.DiscoverySnapshot) error {
multierr := &multierror.Error{}
ctx = contextutils.WithLogger(ctx, fmt.Sprintf("mesh-discovery-syncer-%v", snap.Hash()))
fields := []interface{}{
zap.Int("installs", len(snap.Installs.List())),
zap.Int("pods", len(snap.Pods.List())),
}
logger := contextutils.LoggerFrom(ctx)
logger.Infow("begin sync", fields...)
defer logger.Infow("end sync", fields...)
var discoveredMeshes v1.MeshList
for _, meshDiscoveryPlugin := range s.plugins {
meshes, err := meshDiscoveryPlugin.DiscoverMeshes(ctx, snap)
if err != nil {
multierr = multierror.Append(multierr, err)
logger.Errorf(err.Error())
}
discoveredMeshes = append(discoveredMeshes, meshes...)
}
// reconcile all discovered meshes
err := s.meshReconciler.Reconcile("", discoveredMeshes, func(original, desired *v1.Mesh) (b bool, e error) {
return false, nil
}, clients.ListOpts{
Ctx: ctx,
Selector: map[string]string{utils.SelectorCreatedByPrefix: utils.SelectorCreatedByValue},
})
if err != nil {
multierr = multierror.Append(multierr, err)
}
return multierr.ErrorOrNil()
}