1# Copyright 2015 gRPC authors. 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"""The Python implementation of the GRPC interoperability test server.""" 15 16import argparse 17from concurrent import futures 18import logging 19 20import grpc 21from src.proto.grpc.testing import test_pb2_grpc 22 23from tests.interop import service 24from tests.interop import resources 25from tests.unit import test_common 26 27logging.basicConfig() 28_LOGGER = logging.getLogger(__name__) 29 30 31def parse_interop_server_arguments(): 32 parser = argparse.ArgumentParser() 33 parser.add_argument('--port', 34 type=int, 35 required=True, 36 help='the port on which to serve') 37 parser.add_argument('--use_tls', 38 default=False, 39 type=resources.parse_bool, 40 help='require a secure connection') 41 parser.add_argument('--use_alts', 42 default=False, 43 type=resources.parse_bool, 44 help='require an ALTS connection') 45 return parser.parse_args() 46 47 48def get_server_credentials(use_tls): 49 if use_tls: 50 private_key = resources.private_key() 51 certificate_chain = resources.certificate_chain() 52 return grpc.ssl_server_credentials(((private_key, certificate_chain),)) 53 else: 54 return grpc.alts_server_credentials() 55 56 57def serve(): 58 args = parse_interop_server_arguments() 59 60 server = test_common.test_server() 61 test_pb2_grpc.add_TestServiceServicer_to_server(service.TestService(), 62 server) 63 if args.use_tls or args.use_alts: 64 credentials = get_server_credentials(args.use_tls) 65 server.add_secure_port('[::]:{}'.format(args.port), credentials) 66 else: 67 server.add_insecure_port('[::]:{}'.format(args.port)) 68 69 server.start() 70 _LOGGER.info('Server serving.') 71 server.wait_for_termination() 72 _LOGGER.info('Server stopped; exiting.') 73 74 75if __name__ == '__main__': 76 serve() 77