github.com/imran-kn/cilium-fork@v1.6.9/pkg/envoy/grpc.go (about)

     1  // Copyright 2018 Authors of Cilium
     2  //
     3  // Licensed under the Apache License, Version 2.0 (the "License");
     4  // you may not use this file except in compliance with the License.
     5  // You may obtain a copy of the License at
     6  //
     7  //     http://www.apache.org/licenses/LICENSE-2.0
     8  //
     9  // Unless required by applicable law or agreed to in writing, software
    10  // distributed under the License is distributed on an "AS IS" BASIS,
    11  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    12  // See the License for the specific language governing permissions and
    13  // limitations under the License.
    14  
    15  package envoy
    16  
    17  import (
    18  	"context"
    19  	"errors"
    20  	"net"
    21  	"strings"
    22  	"time"
    23  
    24  	"github.com/cilium/cilium/pkg/envoy/xds"
    25  
    26  	"github.com/cilium/proxy/go/cilium/api"
    27  	envoy_api_v2 "github.com/cilium/proxy/go/envoy/api/v2"
    28  	net_context "golang.org/x/net/context"
    29  	"google.golang.org/grpc"
    30  	"google.golang.org/grpc/reflection"
    31  )
    32  
    33  var (
    34  	// ErrNotImplemented is the error returned by gRPC methods that are not
    35  	// implemented by Cilium.
    36  	ErrNotImplemented = errors.New("not implemented")
    37  )
    38  
    39  // startXDSGRPCServer starts a gRPC server to serve xDS APIs using the given
    40  // resource watcher and network listener.
    41  // Returns a function that stops the GRPC server when called.
    42  func startXDSGRPCServer(listener net.Listener, ldsConfig, npdsConfig, nphdsConfig *xds.ResourceTypeConfiguration, resourceAccessTimeout time.Duration) context.CancelFunc {
    43  	grpcServer := grpc.NewServer()
    44  
    45  	xdsServer := xds.NewServer(map[string]*xds.ResourceTypeConfiguration{
    46  		ListenerTypeURL:           ldsConfig,
    47  		NetworkPolicyTypeURL:      npdsConfig,
    48  		NetworkPolicyHostsTypeURL: nphdsConfig,
    49  	}, resourceAccessTimeout)
    50  	dsServer := (*xdsGRPCServer)(xdsServer)
    51  
    52  	// TODO: https://github.com/cilium/cilium/issues/5051
    53  	// Implement IncrementalAggregatedResources to support Incremental xDS.
    54  	//envoy_service_discovery_v2.RegisterAggregatedDiscoveryServiceServer(grpcServer, dsServer)
    55  	envoy_api_v2.RegisterListenerDiscoveryServiceServer(grpcServer, dsServer)
    56  	cilium.RegisterNetworkPolicyDiscoveryServiceServer(grpcServer, dsServer)
    57  	cilium.RegisterNetworkPolicyHostsDiscoveryServiceServer(grpcServer, dsServer)
    58  
    59  	reflection.Register(grpcServer)
    60  
    61  	go func() {
    62  		log.Infof("Envoy: Starting xDS gRPC server listening on %s", listener.Addr())
    63  		if err := grpcServer.Serve(listener); err != nil && !strings.Contains(err.Error(), "closed network connection") {
    64  			log.WithError(err).Fatal("Envoy: Failed to serve xDS gRPC API")
    65  		}
    66  	}()
    67  
    68  	return grpcServer.Stop
    69  }
    70  
    71  // xdsGRPCServer handles gRPC streaming discovery requests for the
    72  // resource types supported by Cilium.
    73  type xdsGRPCServer xds.Server
    74  
    75  // TODO: https://github.com/cilium/cilium/issues/5051
    76  // Implement IncrementalAggregatedResources also to support Incremental xDS.
    77  //func (s *xdsGRPCServer) StreamAggregatedResources(stream envoy_service_discovery_v2.AggregatedDiscoveryService_StreamAggregatedResourcesServer) error {
    78  //	return (*xds.Server)(s).HandleRequestStream(stream.Context(), stream, xds.AnyTypeURL)
    79  //}
    80  
    81  func (s *xdsGRPCServer) DeltaListeners(stream envoy_api_v2.ListenerDiscoveryService_DeltaListenersServer) error {
    82  	return ErrNotImplemented
    83  }
    84  
    85  func (s *xdsGRPCServer) StreamListeners(stream envoy_api_v2.ListenerDiscoveryService_StreamListenersServer) error {
    86  	return (*xds.Server)(s).HandleRequestStream(stream.Context(), stream, ListenerTypeURL)
    87  }
    88  
    89  func (s *xdsGRPCServer) FetchListeners(ctx net_context.Context, req *envoy_api_v2.DiscoveryRequest) (*envoy_api_v2.DiscoveryResponse, error) {
    90  	// The Fetch methods are only called via the REST API, which is not
    91  	// implemented in Cilium. Only the Stream methods are called over gRPC.
    92  	return nil, ErrNotImplemented
    93  }
    94  
    95  func (s *xdsGRPCServer) StreamNetworkPolicies(stream cilium.NetworkPolicyDiscoveryService_StreamNetworkPoliciesServer) error {
    96  	return (*xds.Server)(s).HandleRequestStream(stream.Context(), stream, NetworkPolicyTypeURL)
    97  }
    98  
    99  func (s *xdsGRPCServer) FetchNetworkPolicies(ctx net_context.Context, req *envoy_api_v2.DiscoveryRequest) (*envoy_api_v2.DiscoveryResponse, error) {
   100  	// The Fetch methods are only called via the REST API, which is not
   101  	// implemented in Cilium. Only the Stream methods are called over gRPC.
   102  	return nil, ErrNotImplemented
   103  }
   104  
   105  func (s *xdsGRPCServer) StreamNetworkPolicyHosts(stream cilium.NetworkPolicyHostsDiscoveryService_StreamNetworkPolicyHostsServer) error {
   106  	return (*xds.Server)(s).HandleRequestStream(stream.Context(), stream, NetworkPolicyHostsTypeURL)
   107  }
   108  
   109  func (s *xdsGRPCServer) FetchNetworkPolicyHosts(ctx net_context.Context, req *envoy_api_v2.DiscoveryRequest) (*envoy_api_v2.DiscoveryResponse, error) {
   110  	// The Fetch methods are only called via the REST API, which is not
   111  	// implemented in Cilium. Only the Stream methods are called over gRPC.
   112  	return nil, ErrNotImplemented
   113  }