github.com/solo-io/service-mesh-hub@v0.9.2/test/extensions/extension_server.go (about)

     1  package extensions
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  	"net"
     7  
     8  	extensionutils "github.com/solo-io/service-mesh-hub/pkg/mesh-networking/extensions"
     9  
    10  	"go.uber.org/atomic"
    11  
    12  	"github.com/solo-io/service-mesh-hub/pkg/api/discovery.smh.solo.io/v1alpha2"
    13  	"github.com/solo-io/service-mesh-hub/pkg/api/networking.smh.solo.io/output/istio"
    14  	"github.com/solo-io/service-mesh-hub/pkg/mesh-networking/translation/istio/extensions"
    15  	"google.golang.org/grpc"
    16  
    17  	"github.com/solo-io/service-mesh-hub/pkg/api/networking.smh.solo.io/extensions/v1alpha1"
    18  )
    19  
    20  const ExtensionsServerPort = 2345
    21  
    22  type testExtensionsServer struct {
    23  	createMeshPatches func(ctx context.Context, mesh *v1alpha2.MeshSpec) (istio.Builder, error)
    24  	hasConnected      *atomic.Bool
    25  }
    26  
    27  func NewTestExtensionsServer() *testExtensionsServer {
    28  	return &testExtensionsServer{createMeshPatches: getCreateMeshPatchesFunc(), hasConnected: &atomic.Bool{}}
    29  }
    30  
    31  // Runs an e2e implementation of a grpc extensions service for Networking
    32  // that adds a route to a simple "HelloWorld" server running on the local machine (reachable via `host.docker.internal` from inside KinD)
    33  func (t *testExtensionsServer) Run() error {
    34  	l, err := net.Listen("tcp", fmt.Sprintf(":%v", ExtensionsServerPort))
    35  	if err != nil {
    36  		return err
    37  	}
    38  	grpcSrv := grpc.NewServer()
    39  	v1alpha1.RegisterNetworkingExtensionsServer(grpcSrv, t)
    40  	return grpcSrv.Serve(l)
    41  }
    42  
    43  func (t *testExtensionsServer) GetExtensionPatches(ctx context.Context, request *v1alpha1.ExtensionPatchRequest) (*v1alpha1.ExtensionPatchResponse, error) {
    44  	inputs := extensionutils.InputSnapshotFromProto("test-server", request.Inputs)
    45  
    46  	var patches []*v1alpha1.GeneratedObject
    47  	for _, mesh := range inputs.Meshes().List() {
    48  		mesh := mesh // shadow for pointer
    49  		outputs, err := t.createMeshPatches(ctx, &mesh.Spec)
    50  		if err != nil {
    51  			return nil, err
    52  		}
    53  		patches = append(patches, extensions.OutputsToProto(outputs)...)
    54  	}
    55  	return &v1alpha1.ExtensionPatchResponse{PatchedOutputs: patches}, nil
    56  }
    57  
    58  func (t *testExtensionsServer) WatchPushNotifications(request *v1alpha1.WatchPushNotificationsRequest, server v1alpha1.NetworkingExtensions_WatchPushNotificationsServer) error {
    59  
    60  	// one to start
    61  	if err := server.Send(&v1alpha1.PushNotification{}); err != nil {
    62  		return err
    63  	}
    64  
    65  	// client has connected
    66  	t.hasConnected.Store(true)
    67  
    68  	// sleep forever
    69  	select {
    70  	case <-server.Context().Done():
    71  		return nil
    72  	}
    73  }
    74  
    75  // returns true if a client has connected to this server
    76  func (t *testExtensionsServer) HasConnected() bool {
    77  	return t.hasConnected.Load()
    78  }