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 }