blob: fb2e5cbcab634061ee17b22e7f57ecf433b4b9e8 [file] [log] [blame]
package context
import (
"context"
)
import (
core_mesh "github.com/apache/dubbo-kubernetes/pkg/core/resources/apis/mesh"
"github.com/apache/dubbo-kubernetes/pkg/core/resources/manager"
core_store "github.com/apache/dubbo-kubernetes/pkg/core/resources/store"
"github.com/apache/dubbo-kubernetes/pkg/xds/cache/sha256"
)
type meshContextFetcher = func(ctx context.Context, meshName string) (MeshContext, error)
func AggregateMeshContexts(
ctx context.Context,
resManager manager.ReadOnlyResourceManager,
fetcher meshContextFetcher,
) (AggregatedMeshContexts, error) {
var meshList core_mesh.MeshResourceList
if err := resManager.List(ctx, &meshList, core_store.ListOrdered()); err != nil {
return AggregatedMeshContexts{}, err
}
var meshContexts []MeshContext
meshContextsByName := map[string]MeshContext{}
for _, mesh := range meshList.Items {
meshCtx, err := fetcher(ctx, mesh.GetMeta().GetName())
if err != nil {
if core_store.IsResourceNotFound(err) {
// When the mesh no longer exists it's likely because it was removed since, let's just skip it.
continue
}
return AggregatedMeshContexts{}, err
}
meshContexts = append(meshContexts, meshCtx)
meshContextsByName[mesh.Meta.GetName()] = meshCtx
}
hash := aggregatedHash(meshContexts)
result := AggregatedMeshContexts{
Hash: hash,
Meshes: meshList.Items,
MeshContextsByName: meshContextsByName,
}
return result, nil
}
func aggregatedHash(meshContexts []MeshContext) string {
var hash string
for _, meshCtx := range meshContexts {
hash += meshCtx.Hash
}
return sha256.Hash(hash)
}