# 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")
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)
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)
+