kuma
122 строки · 3.7 Кб
1package envoyadmin
2
3import (
4"context"
5
6"github.com/pkg/errors"
7
8mesh_proto "github.com/kumahq/kuma/api/mesh/v1alpha1"
9"github.com/kumahq/kuma/pkg/core"
10"github.com/kumahq/kuma/pkg/core/resources/manager"
11"github.com/kumahq/kuma/pkg/core/resources/model"
12"github.com/kumahq/kuma/pkg/core/resources/registry"
13core_store "github.com/kumahq/kuma/pkg/core/resources/store"
14"github.com/kumahq/kuma/pkg/envoy/admin"
15)
16
17var serverLog = core.Log.WithName("intercp").WithName("catalog").WithName("server")
18
19type server struct {
20adminClient admin.EnvoyAdminClient
21resManager manager.ReadOnlyResourceManager
22mesh_proto.UnimplementedInterCPEnvoyAdminForwardServiceServer
23}
24
25var _ mesh_proto.InterCPEnvoyAdminForwardServiceServer = &server{}
26
27func NewServer(adminClient admin.EnvoyAdminClient, resManager manager.ReadOnlyResourceManager) mesh_proto.InterCPEnvoyAdminForwardServiceServer {
28return &server{
29adminClient: adminClient,
30resManager: resManager,
31}
32}
33
34func (s *server) XDSConfig(ctx context.Context, req *mesh_proto.XDSConfigRequest) (*mesh_proto.XDSConfigResponse, error) {
35ctx = extractTenantMetadata(ctx)
36serverLog.V(1).Info("received forwarded request", "operation", "XDSConfig", "request", req)
37resWithAddr, err := s.resWithAddress(ctx, req.ResourceType, req.ResourceName, req.ResourceMesh)
38if err != nil {
39return nil, err
40}
41configDump, err := s.adminClient.ConfigDump(ctx, resWithAddr)
42if err != nil {
43if errors.Is(err, &admin.KDSTransportError{}) {
44return &mesh_proto.XDSConfigResponse{
45Result: &mesh_proto.XDSConfigResponse_Error{
46Error: err.Error(),
47},
48}, nil
49}
50return nil, err
51}
52return &mesh_proto.XDSConfigResponse{
53Result: &mesh_proto.XDSConfigResponse_Config{
54Config: configDump,
55},
56}, nil
57}
58
59func (s *server) Stats(ctx context.Context, req *mesh_proto.StatsRequest) (*mesh_proto.StatsResponse, error) {
60ctx = extractTenantMetadata(ctx)
61serverLog.V(1).Info("received forwarded request", "operation", "Stats", "request", req)
62resWithAddr, err := s.resWithAddress(ctx, req.ResourceType, req.ResourceName, req.ResourceMesh)
63if err != nil {
64return nil, err
65}
66stats, err := s.adminClient.Stats(ctx, resWithAddr)
67if err != nil {
68if errors.Is(err, &admin.KDSTransportError{}) {
69return &mesh_proto.StatsResponse{
70Result: &mesh_proto.StatsResponse_Error{
71Error: err.Error(),
72},
73}, nil
74}
75return nil, err
76}
77return &mesh_proto.StatsResponse{
78Result: &mesh_proto.StatsResponse_Stats{
79Stats: stats,
80},
81}, nil
82}
83
84func (s *server) Clusters(ctx context.Context, req *mesh_proto.ClustersRequest) (*mesh_proto.ClustersResponse, error) {
85ctx = extractTenantMetadata(ctx)
86serverLog.V(1).Info("received forwarded request", "operation", "Clusters", "request", req)
87resWithAddr, err := s.resWithAddress(ctx, req.ResourceType, req.ResourceName, req.ResourceMesh)
88if err != nil {
89return nil, err
90}
91clusters, err := s.adminClient.Clusters(ctx, resWithAddr)
92if err != nil {
93if errors.Is(err, &admin.KDSTransportError{}) {
94return &mesh_proto.ClustersResponse{
95Result: &mesh_proto.ClustersResponse_Error{
96Error: err.Error(),
97},
98}, nil
99}
100return nil, err
101}
102return &mesh_proto.ClustersResponse{
103Result: &mesh_proto.ClustersResponse_Clusters{
104Clusters: clusters,
105},
106}, nil
107}
108
109func (s *server) resWithAddress(ctx context.Context, typ, name, mesh string) (model.ResourceWithAddress, error) {
110obj, err := registry.Global().NewObject(model.ResourceType(typ))
111if err != nil {
112return nil, err
113}
114if err := s.resManager.Get(ctx, obj, core_store.GetByKey(name, mesh)); err != nil {
115return nil, err
116}
117resourceWithAddr, ok := obj.(model.ResourceWithAddress)
118if !ok {
119return nil, errors.New("invalid resource type")
120}
121return resourceWithAddr, nil
122}
123