Fix: Run both sonar and clm scans in parallel
[ccsdk/cds.git] / ms / py-executor / server.py
index 5c149d9..2420344 100644 (file)
 #  See the License for the specific language governing permissions and
 #  limitations under the License.
 
-from builtins import KeyboardInterrupt
-from concurrent import futures
 import logging
+import os
 import time
-import grpc
+import yaml
+from builtins import KeyboardInterrupt
+from concurrent import futures
 from pathlib import Path, PurePath
-from blueprints_grpc import BluePrintProcessing_pb2_grpc
-from blueprints_grpc.request_header_validator_interceptor import RequestHeaderValidatorInterceptor
+
+import grpc
+from manager.servicer import ArtifactManagerServicer
+from proto.BluePrintManagement_pb2_grpc import add_BluePrintManagementServiceServicer_to_server
+
+from blueprints_grpc import BluePrintProcessing_pb2_grpc, ScriptExecutorConfiguration
 from blueprints_grpc.blueprint_processing_server import BluePrintProcessingServer
-from blueprints_grpc import ScriptExecutorConfiguration
+from blueprints_grpc.request_header_validator_interceptor import RequestHeaderValidatorInterceptor
 
 logger = logging.getLogger("Server")
 
@@ -33,21 +38,49 @@ _ONE_DAY_IN_SECONDS = 60 * 60 * 24
 
 def serve(configuration: ScriptExecutorConfiguration):
     port = configuration.script_executor_property('port')
-    basic_auth = configuration.script_executor_property('auth')
+    authType = configuration.script_executor_property('authType')
     maxWorkers = configuration.script_executor_property('maxWorkers')
 
-    header_validator = RequestHeaderValidatorInterceptor(
-        'authorization', basic_auth, grpc.StatusCode.UNAUTHENTICATED,
-        'Access denied!')
+    if authType == 'tls-auth':
+        cert_chain_file = configuration.script_executor_property('certChain')
+        private_key_file = configuration.script_executor_property('privateKey')
+        logger.info("Setting GRPC server TLS authentication, cert file(%s) private key file(%s)", cert_chain_file,
+                    private_key_file)
+        # read in key and certificate
+        with open(cert_chain_file, 'rb') as f:
+            certificate_chain = f.read()
+        with open(private_key_file, 'rb') as f:
+            private_key = f.read()
 
-    server = grpc.server(futures.ThreadPoolExecutor(max_workers=int(maxWorkers)),
-                         interceptors=(header_validator,))
+        # create server credentials
+        server_credentials = grpc.ssl_server_credentials(((private_key, certificate_chain),))
 
-    BluePrintProcessing_pb2_grpc.add_BluePrintProcessingServiceServicer_to_server(
-        BluePrintProcessingServer(configuration), server)
+        # create server
+        server = grpc.server(futures.ThreadPoolExecutor(max_workers=int(maxWorkers)))
+        BluePrintProcessing_pb2_grpc.add_BluePrintProcessingServiceServicer_to_server(
+            BluePrintProcessingServer(configuration), server
+        )
+        add_BluePrintManagementServiceServicer_to_server(ArtifactManagerServicer(), server)
 
-    server.add_insecure_port('[::]:' + port)
-    server.start()
+        # add secure port using credentials
+        server.add_secure_port('[::]:' + port, server_credentials)
+        server.start()
+    else:
+        logger.info("Setting GRPC server base authentication")
+        basic_auth = configuration.script_executor_property('token')
+        header_validator = RequestHeaderValidatorInterceptor(
+            'authorization', basic_auth, grpc.StatusCode.UNAUTHENTICATED,
+            'Access denied!')
+        # create server with token authentication interceptors
+        server = grpc.server(futures.ThreadPoolExecutor(max_workers=int(maxWorkers)),
+                             interceptors=(header_validator,))
+        BluePrintProcessing_pb2_grpc.add_BluePrintProcessingServiceServicer_to_server(
+            BluePrintProcessingServer(configuration), server
+        )
+        add_BluePrintManagementServiceServicer_to_server(ArtifactManagerServicer(), server)
+
+        server.add_insecure_port('[::]:' + port)
+        server.start()
 
     logger.info("Command Executor Server started on %s" % port)
 
@@ -59,15 +92,34 @@ def serve(configuration: ScriptExecutorConfiguration):
 
 
 if __name__ == '__main__':
-    config_file = str(PurePath(Path().absolute())) + '/configuration.ini'
+    default_configuration_file = str(PurePath(Path().absolute(), "../../configuration.ini"))
+    supplied_configuration_file = os.environ.get("CONFIGURATION")
+    config_file = str(os.path.expanduser(Path(supplied_configuration_file or default_configuration_file)))
+
     configuration = ScriptExecutorConfiguration(config_file)
-    logging_formater = '%(asctime)s - %(name)s - %(threadName)s - %(levelname)s - %(message)s'
-    logging.basicConfig(filename=configuration.script_executor_property('logFile'),
-                        level=logging.DEBUG,
+    log_file_name = configuration.script_executor_property('logFile')
+    log_file = os.path.join(os.path.dirname(os.path.abspath(os.path.dirname(__file__))), "logging.yaml")
+    print(log_file)
+    with open(log_file) as log:
+        log_config = yaml.safe_load(log)
+        print(log_config)
+    logging_formater = log_config["formatters"]["default"]["format"]
+    print(log_config["loglevel"])
+    if log_config["loglevel"] == "debug":
+        loglevel = logging.DEBUG
+    elif log_config["loglevel"] == "info":
+        loglevel = logging.INFO
+    elif log_config["loglevel"] == "error":
+        loglevel = logging.ERROR
+    logging.basicConfig(filename=log_file_name,
+                        level=loglevel,
                         format=logging_formater)
-    console = logging.StreamHandler()
-    console.setLevel(logging.INFO)
+    console = logging.handlers.RotatingFileHandler(log_file_name, maxBytes=log_config["logfilesize"],
+                                                   backupCount=log_config["rollovercount"])
+    
+    console.setLevel(loglevel)
     formatter = logging.Formatter(logging_formater)
     console.setFormatter(formatter)
     logging.getLogger('').addHandler(console)
     serve(configuration)
+