diff --git a/services/TS29222_CAPIF_API_Invoker_Management_API/api_invoker_management/app.py b/services/TS29222_CAPIF_API_Invoker_Management_API/api_invoker_management/app.py index b4594103fdeb9f9b0c7be4ae9d3ab2deb0a1165d..9d55bc5adba29d09c93b1e1909bb79bea88aaaff 100644 --- a/services/TS29222_CAPIF_API_Invoker_Management_API/api_invoker_management/app.py +++ b/services/TS29222_CAPIF_API_Invoker_Management_API/api_invoker_management/app.py @@ -22,6 +22,10 @@ from opentelemetry.instrumentation.redis import RedisInstrumentor NAME = "Invoker-Service" +# Setting log level +log_level = os.getenv('LOG_LEVEL', 'INFO').upper() +numeric_level = getattr(logging, log_level, logging.INFO) + def configure_monitoring(app, config): resource = Resource(attributes={"service.name": NAME}) @@ -86,10 +90,10 @@ def configure_logging(app): loggers = [app.logger, ] handlers = [] console_handler = logging.StreamHandler() - console_handler.setLevel(logging.DEBUG) + console_handler.setLevel(numeric_level) console_handler.setFormatter(verbose_formatter()) file_handler = RotatingFileHandler(filename="invoker_logs.log", maxBytes=1024 * 1024 * 100, backupCount=20) - file_handler.setLevel(logging.DEBUG) + file_handler.setLevel(numeric_level) file_handler.setFormatter(verbose_formatter()) handlers.append(console_handler) handlers.append(file_handler) @@ -99,7 +103,7 @@ def configure_logging(app): for handler in handlers: l.addHandler(handler) l.propagate = False - l.setLevel(logging.DEBUG) + l.setLevel(numeric_level) diff --git a/services/TS29222_CAPIF_API_Provider_Management_API/api_provider_management/app.py b/services/TS29222_CAPIF_API_Provider_Management_API/api_provider_management/app.py index 94ca3edcb2b4b9ea9b93ad9b63171ecc6f1d9822..2896830ca9ff062875fd666db2bc654a9c8bc0d2 100644 --- a/services/TS29222_CAPIF_API_Provider_Management_API/api_provider_management/app.py +++ b/services/TS29222_CAPIF_API_Provider_Management_API/api_provider_management/app.py @@ -23,6 +23,10 @@ from opentelemetry.instrumentation.redis import RedisInstrumentor NAME = "Provider-Service" +# Setting log level +log_level = os.getenv('LOG_LEVEL', 'INFO').upper() +numeric_level = getattr(logging, log_level, logging.INFO) + def configure_monitoring(app, config): resource = Resource(attributes={"service.name": NAME}) @@ -85,10 +89,10 @@ def configure_logging(app): loggers = [app.logger, ] handlers = [] console_handler = logging.StreamHandler() - console_handler.setLevel(logging.DEBUG) + console_handler.setLevel(numeric_level) console_handler.setFormatter(verbose_formatter()) file_handler = RotatingFileHandler(filename="provider_logs.log", maxBytes=1024 * 1024 * 100, backupCount=20) - file_handler.setLevel(logging.DEBUG) + file_handler.setLevel(numeric_level) file_handler.setFormatter(verbose_formatter()) handlers.append(console_handler) handlers.append(file_handler) @@ -97,7 +101,7 @@ def configure_logging(app): for handler in handlers: l.addHandler(handler) l.propagate = False - l.setLevel(logging.DEBUG) + l.setLevel(numeric_level) def verbose_formatter(): return logging.Formatter( diff --git a/services/TS29222_CAPIF_Access_Control_Policy_API/capif_acl/app.py b/services/TS29222_CAPIF_Access_Control_Policy_API/capif_acl/app.py index a47335578bcb2c66a5392cc3d9d830a8f2e1723e..59a0f90b9976dfd4ee1cecb0173ec6b03cf4cd8f 100644 --- a/services/TS29222_CAPIF_Access_Control_Policy_API/capif_acl/app.py +++ b/services/TS29222_CAPIF_Access_Control_Policy_API/capif_acl/app.py @@ -26,6 +26,10 @@ from opentelemetry.instrumentation.redis import RedisInstrumentor NAME = "Acl-Service" +# Setting log level +log_level = os.getenv('LOG_LEVEL', 'INFO').upper() +numeric_level = getattr(logging, log_level, logging.INFO) + def configure_monitoring(app, config): resource = Resource(attributes={"service.name": NAME}) @@ -89,10 +93,10 @@ def configure_logging(app): loggers = [app.logger, ] handlers = [] console_handler = logging.StreamHandler() - console_handler.setLevel(logging.DEBUG) + console_handler.setLevel(numeric_level) console_handler.setFormatter(verbose_formatter()) file_handler = RotatingFileHandler(filename="acl_logs.log", maxBytes=1024 * 1024 * 100, backupCount=20) - file_handler.setLevel(logging.DEBUG) + file_handler.setLevel(numeric_level) file_handler.setFormatter(verbose_formatter()) handlers.append(console_handler) handlers.append(file_handler) @@ -101,7 +105,7 @@ def configure_logging(app): for handler in handlers: l.addHandler(handler) l.propagate = False - l.setLevel(logging.DEBUG) + l.setLevel(numeric_level) def verbose_formatter(): return logging.Formatter( diff --git a/services/TS29222_CAPIF_Auditing_API/logs/app.py b/services/TS29222_CAPIF_Auditing_API/logs/app.py index a0bd01c992a215111595507f5e5a105ac57bf387..f68880cee26c27d442c50b2ec0b68ad07a825169 100644 --- a/services/TS29222_CAPIF_Auditing_API/logs/app.py +++ b/services/TS29222_CAPIF_Auditing_API/logs/app.py @@ -18,6 +18,10 @@ from opentelemetry.sdk.trace.export import BatchSpanProcessor NAME = "Logs-Service" +# Setting log level +log_level = os.getenv('LOG_LEVEL', 'INFO').upper() +numeric_level = getattr(logging, log_level, logging.INFO) + def configure_monitoring(app, config): resource = Resource(attributes={"service.name": NAME}) @@ -79,10 +83,10 @@ def configure_logging(app): loggers = [app.logger, ] handlers = [] console_handler = logging.StreamHandler() - console_handler.setLevel(logging.DEBUG) + console_handler.setLevel(numeric_level) console_handler.setFormatter(verbose_formatter()) file_handler = RotatingFileHandler(filename="service_logs.log", maxBytes=1024 * 1024 * 100, backupCount=20) - file_handler.setLevel(logging.DEBUG) + file_handler.setLevel(numeric_level) file_handler.setFormatter(verbose_formatter()) handlers.append(console_handler) handlers.append(file_handler) @@ -91,7 +95,7 @@ def configure_logging(app): for handler in handlers: l.addHandler(handler) l.propagate = False - l.setLevel(logging.DEBUG) + l.setLevel(numeric_level) def verbose_formatter(): return logging.Formatter( diff --git a/services/TS29222_CAPIF_Discover_Service_API/service_apis/app.py b/services/TS29222_CAPIF_Discover_Service_API/service_apis/app.py index 2e37d0ef069c123196aea32416201aaf5f161992..beec70806ff45a9d3795b952efb09906773a3eb3 100644 --- a/services/TS29222_CAPIF_Discover_Service_API/service_apis/app.py +++ b/services/TS29222_CAPIF_Discover_Service_API/service_apis/app.py @@ -22,6 +22,9 @@ from opentelemetry.instrumentation.redis import RedisInstrumentor NAME = "Discover-Service" +# Setting log level +log_level = os.getenv('LOG_LEVEL', 'INFO').upper() +numeric_level = getattr(logging, log_level, logging.INFO) def configure_monitoring(app, config): @@ -86,10 +89,10 @@ def configure_logging(app): loggers = [app.logger, ] handlers = [] console_handler = logging.StreamHandler() - console_handler.setLevel(logging.DEBUG) + console_handler.setLevel(numeric_level) console_handler.setFormatter(verbose_formatter()) file_handler = RotatingFileHandler(filename="discover_logs.log", maxBytes=1024 * 1024 * 100, backupCount=20) - file_handler.setLevel(logging.DEBUG) + file_handler.setLevel(numeric_level) file_handler.setFormatter(verbose_formatter()) handlers.append(console_handler) handlers.append(file_handler) @@ -98,7 +101,7 @@ def configure_logging(app): for handler in handlers: l.addHandler(handler) l.propagate = False - l.setLevel(logging.DEBUG) + l.setLevel(numeric_level) def verbose_formatter(): return logging.Formatter( diff --git a/services/TS29222_CAPIF_Events_API/capif_events/app.py b/services/TS29222_CAPIF_Events_API/capif_events/app.py index eb43ca1920fc5ac7e37e4f5ebf091e66da19c09a..d1d3de3c2a39e30afe0b02aea4ae85738f47fd67 100644 --- a/services/TS29222_CAPIF_Events_API/capif_events/app.py +++ b/services/TS29222_CAPIF_Events_API/capif_events/app.py @@ -34,6 +34,10 @@ from opentelemetry.instrumentation.redis import RedisInstrumentor NAME = "Events-Service" +# Setting log level +log_level = os.getenv('LOG_LEVEL', 'INFO').upper() +numeric_level = getattr(logging, log_level, logging.INFO) + def configure_monitoring(app, config): resource = Resource(attributes={"service.name": NAME}) @@ -97,10 +101,10 @@ def configure_logging(app): loggers = [app.logger, ] handlers = [] console_handler = logging.StreamHandler() - console_handler.setLevel(logging.DEBUG) + console_handler.setLevel(numeric_level) console_handler.setFormatter(verbose_formatter()) file_handler = RotatingFileHandler(filename="events_logs.log", maxBytes=1024 * 1024 * 100, backupCount=20) - file_handler.setLevel(logging.DEBUG) + file_handler.setLevel(numeric_level) file_handler.setFormatter(verbose_formatter()) handlers.append(console_handler) handlers.append(file_handler) @@ -109,7 +113,7 @@ def configure_logging(app): for handler in handlers: l.addHandler(handler) l.propagate = False - l.setLevel(logging.DEBUG) + l.setLevel(numeric_level) diff --git a/services/TS29222_CAPIF_Logging_API_Invocation_API/api_invocation_logs/app.py b/services/TS29222_CAPIF_Logging_API_Invocation_API/api_invocation_logs/app.py index 5eb97b36adedad2c2f900925a4eb013884cef02f..bf76d0fcdfd8abff158fb8473a82ca04bb9a9455 100644 --- a/services/TS29222_CAPIF_Logging_API_Invocation_API/api_invocation_logs/app.py +++ b/services/TS29222_CAPIF_Logging_API_Invocation_API/api_invocation_logs/app.py @@ -18,6 +18,9 @@ from opentelemetry.sdk.trace.export import BatchSpanProcessor NAME = "Logging-Service" +# Setting log level +log_level = os.getenv('LOG_LEVEL', 'INFO').upper() +numeric_level = getattr(logging, log_level, logging.INFO) def configure_monitoring(app, config): @@ -80,10 +83,10 @@ def configure_logging(app): loggers = [app.logger, ] handlers = [] console_handler = logging.StreamHandler() - console_handler.setLevel(logging.DEBUG) + console_handler.setLevel(numeric_level) console_handler.setFormatter(verbose_formatter()) file_handler = RotatingFileHandler(filename="logging_logs.log", maxBytes=1024 * 1024 * 100, backupCount=20) - file_handler.setLevel(logging.DEBUG) + file_handler.setLevel(numeric_level) file_handler.setFormatter(verbose_formatter()) handlers.append(console_handler) handlers.append(file_handler) @@ -93,7 +96,7 @@ def configure_logging(app): for handler in handlers: l.addHandler(handler) l.propagate = False - l.setLevel(logging.DEBUG) + l.setLevel(numeric_level) def verbose_formatter(): diff --git a/services/TS29222_CAPIF_Publish_Service_API/published_apis/app.py b/services/TS29222_CAPIF_Publish_Service_API/published_apis/app.py index 3c0c4735b508ff2ac60322d2a28ce31b81306700..dedd2b563f2f83cf36c9a16d542053e7828201bf 100644 --- a/services/TS29222_CAPIF_Publish_Service_API/published_apis/app.py +++ b/services/TS29222_CAPIF_Publish_Service_API/published_apis/app.py @@ -25,6 +25,9 @@ from opentelemetry.instrumentation.redis import RedisInstrumentor NAME = "Publish-Service" +# Setting log level +log_level = os.getenv('LOG_LEVEL', 'INFO').upper() +numeric_level = getattr(logging, log_level, logging.INFO) def configure_monitoring(app, config): @@ -89,10 +92,10 @@ def configure_logging(app): loggers = [app.logger, ] handlers = [] console_handler = logging.StreamHandler() - console_handler.setLevel(logging.DEBUG) + console_handler.setLevel(numeric_level) console_handler.setFormatter(verbose_formatter()) file_handler = RotatingFileHandler(filename="publish_logs.log", maxBytes=1024 * 1024 * 100, backupCount=20) - file_handler.setLevel(logging.DEBUG) + file_handler.setLevel(numeric_level) file_handler.setFormatter(verbose_formatter()) handlers.append(console_handler) handlers.append(file_handler) @@ -102,7 +105,7 @@ def configure_logging(app): for handler in handlers: l.addHandler(handler) l.propagate = False - l.setLevel(logging.DEBUG) + l.setLevel(numeric_level) def verbose_formatter(): diff --git a/services/TS29222_CAPIF_Security_API/capif_security/__main__.py b/services/TS29222_CAPIF_Security_API/capif_security/__main__.py deleted file mode 100644 index 26eec192939283fcf44e849e3926bfa1f9d490cd..0000000000000000000000000000000000000000 --- a/services/TS29222_CAPIF_Security_API/capif_security/__main__.py +++ /dev/null @@ -1,149 +0,0 @@ -#!/usr/bin/env python3 - -import connexion -import logging -from capif_security import encoder -from flask_jwt_extended import JWTManager -from .config import Config -from .core.consumer_messager import Subscriber -from threading import Thread -from flask_executor import Executor -from logging.handlers import RotatingFileHandler -import sys -import os -from fluent import sender -from flask_executor import Executor -from opentelemetry.instrumentation.flask import FlaskInstrumentor -from opentelemetry import trace -from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import OTLPSpanExporter -from opentelemetry.trace.propagation.tracecontext import TraceContextTextMapPropagator -from opentelemetry.sdk.resources import Resource -from opentelemetry.sdk.trace import TracerProvider -from opentelemetry.sdk.trace.export import BatchSpanProcessor -from opentelemetry.instrumentation.redis import RedisInstrumentor - - - -NAME = "Security-Service" - -def configure_monitoring(app, config): - - resource = Resource(attributes={"service.name": NAME}) - - fluent_bit_host = config['monitoring']['fluent_bit_host'] - fluent_bit_port = config['monitoring']['fluent_bit_port'] - fluent_bit_sender = sender.FluentSender('Security-Service', host=fluent_bit_host, port=fluent_bit_port) - propagator = TraceContextTextMapPropagator() - - tracer_provider = TracerProvider(resource=resource) - trace.set_tracer_provider(tracer_provider) - exporter = OTLPSpanExporter(endpoint=f"http://{config['monitoring']['opentelemetry_url']}:{config['monitoring']['opentelemetry_port']}", insecure=True) - span_processor = BatchSpanProcessor( - exporter, - max_queue_size=config['monitoring']['opentelemetry_max_queue_size'], - schedule_delay_millis=config['monitoring']['opentelemetry_schedule_delay_millis'], - max_export_batch_size=config['monitoring']['opentelemetry_max_export_batch_size'], - export_timeout_millis=config['monitoring']['opentelemetry_export_timeout_millis'], - ) - - trace.get_tracer_provider().add_span_processor(span_processor) - - FlaskInstrumentor().instrument_app(app) - - RedisInstrumentor().instrument() - - class FluentBitHandler(logging.Handler): - - def __init__(self): - logging.Handler.__init__(self) - - def emit(self, record): - log_entry = self.format(record) - log_data = { - 'message': log_entry, - 'level': record.levelname, - 'timestamp': record.created, - 'logger': record.name, - 'function': record.funcName, - 'line': record.lineno, - 'container_name': os.environ.get('CONTAINER_NAME', ''), - } - - # # Obtener el trace ID actual - current_context = trace.get_current_span().get_span_context() - - trace_id = current_context.trace_id - traceparent_id = current_context.span_id - log_data['traceID'] = hex(trace_id)[2:] - if traceparent_id != None: - log_data['traceparent'] = hex(traceparent_id)[2:] - fluent_bit_sender.emit('Security-Service', log_data) - - loggers = [app.logger, ] - for l in loggers: - l.addHandler(FluentBitHandler()) - - -def configure_logging(app): - del app.logger.handlers[:] - loggers = [app.logger, ] - handlers = [] - console_handler = logging.StreamHandler() - console_handler.setLevel(logging.DEBUG) - console_handler.setFormatter(verbose_formatter()) - file_handler = RotatingFileHandler(filename="security_logs.log", maxBytes=1024 * 1024 * 100, backupCount=20) - file_handler.setLevel(logging.DEBUG) - file_handler.setFormatter(verbose_formatter()) - handlers.append(console_handler) - handlers.append(file_handler) - - for l in loggers: - for handler in handlers: - l.addHandler(handler) - l.propagate = False - l.setLevel(logging.DEBUG) - - -def verbose_formatter(): - return logging.Formatter( - '{"timestamp": "%(asctime)s", "level": "%(levelname)s", "logger": "%(name)s", "function": "%(funcName)s", "line": %(lineno)d, "message": %(message)s}', - datefmt='%d/%m/%Y %H:%M:%S' - ) - -def main(): - - with open("/usr/src/app/capif_security/server.key", "rb") as key_file: - key_data = key_file.read() - - app = connexion.App(__name__, specification_dir='./openapi/') - app.app.json_encoder = encoder.JSONEncoder - - - app.app.config['JWT_ALGORITHM'] = 'RS256' - app.app.config['JWT_PRIVATE_KEY'] = key_data - app.add_api('openapi.yaml', - arguments={'title': 'CAPIF_Security_API'}, - pythonic_params=True) - - JWTManager(app.app) - subscriber = Subscriber() - - config = Config() - configure_logging(app.app) - - monitoring_value = os.environ.get("MONITORING", "").lower() - if monitoring_value == "true": - configure_monitoring(app.app, config.get_config()) - - executor = Executor(app.app) - - @app.app.before_first_request - def up_listener(): - executor.submit(subscriber.listen) - - - app.run(port=8080, debug=True) - -if __name__ == '__main__': - main() - diff --git a/services/TS29222_CAPIF_Security_API/capif_security/app.py b/services/TS29222_CAPIF_Security_API/capif_security/app.py index 0f06b7a28d353ea9627dc7a771d279c430c9be67..43457008864cc00a84b515f3e210654e2bf82c4d 100644 --- a/services/TS29222_CAPIF_Security_API/capif_security/app.py +++ b/services/TS29222_CAPIF_Security_API/capif_security/app.py @@ -21,6 +21,9 @@ from opentelemetry.instrumentation.redis import RedisInstrumentor NAME = "Security-Service" +# Setting log level +log_level = os.getenv('LOG_LEVEL', 'INFO').upper() +numeric_level = getattr(logging, log_level, logging.INFO) def configure_monitoring(app, config): @@ -85,10 +88,10 @@ def configure_logging(app): loggers = [app.logger, ] handlers = [] console_handler = logging.StreamHandler() - console_handler.setLevel(logging.DEBUG) + console_handler.setLevel(numeric_level) console_handler.setFormatter(verbose_formatter()) file_handler = RotatingFileHandler(filename="security_logs.log", maxBytes=1024 * 1024 * 100, backupCount=20) - file_handler.setLevel(logging.DEBUG) + file_handler.setLevel(numeric_level) file_handler.setFormatter(verbose_formatter()) handlers.append(console_handler) handlers.append(file_handler) @@ -97,7 +100,7 @@ def configure_logging(app): for handler in handlers: l.addHandler(handler) l.propagate = False - l.setLevel(logging.DEBUG) + l.setLevel(numeric_level) def verbose_formatter(): diff --git a/services/clean_capif_docker_services.sh b/services/clean_capif_docker_services.sh index 617ffed8ee9ead75cb5825199e91274d9a6cf392..bd6ef111f010c8d5ed962a7c575fe2adfa32bbc1 100755 --- a/services/clean_capif_docker_services.sh +++ b/services/clean_capif_docker_services.sh @@ -68,7 +68,7 @@ echo "${FILES[@]}" for FILE in "${FILES[@]}"; do echo "Executing 'docker compose down' for file $FILE" - CAPIF_PRIV_KEY=$CAPIF_PRIV_KEY_BASE_64 DUID=$DUID DGID=$DGID MONITORING=$MONITORING_STATE docker compose -f "$FILE" down --rmi all + CAPIF_PRIV_KEY=$CAPIF_PRIV_KEY_BASE_64 DUID=$DUID DGID=$DGID MONITORING=$MONITORING_STATE LOG_LEVEL=$LOG_LEVEL docker compose -f "$FILE" down --rmi all status=$? if [ $status -eq 0 ]; then echo "*** Removed Service from $FILE ***" diff --git a/services/docker-compose-capif.yml b/services/docker-compose-capif.yml index 779df2185c851ae0ef1fa2ce35fa73510f97bc2d..44ed625fcc13b5d64606b5316272bb989713ba4b 100644 --- a/services/docker-compose-capif.yml +++ b/services/docker-compose-capif.yml @@ -31,6 +31,7 @@ services: - VAULT_HOSTNAME=vault - VAULT_ACCESS_TOKEN=dev-only-token - VAULT_PORT=8200 + - LOG_LEVEL=${LOG_LEVEL} depends_on: - nginx @@ -47,6 +48,7 @@ services: environment: - CONTAINER_NAME=access-control-policy - MONITORING=${MONITORING} + - LOG_LEVEL=${LOG_LEVEL} restart: unless-stopped image: public.ecr.aws/o2v4a8t6/opencapif/access-control-policy:3.1.3 depends_on: @@ -71,6 +73,7 @@ services: - VAULT_HOSTNAME=vault - VAULT_ACCESS_TOKEN=dev-only-token - VAULT_PORT=8200 + - LOG_LEVEL=${LOG_LEVEL} restart: unless-stopped image: public.ecr.aws/o2v4a8t6/opencapif/api-invoker-management-api:3.1.3 depends_on: @@ -95,6 +98,7 @@ services: - VAULT_HOSTNAME=vault - VAULT_ACCESS_TOKEN=dev-only-token - VAULT_PORT=8200 + - LOG_LEVEL=${LOG_LEVEL} depends_on: - redis - nginx @@ -115,6 +119,7 @@ services: environment: - CONTAINER_NAME=api-auditing - MONITORING=${MONITORING} + - LOG_LEVEL=${LOG_LEVEL} depends_on: - mongo @@ -134,6 +139,7 @@ services: environment: - CONTAINER_NAME=services-apis - MONITORING=${MONITORING} + - LOG_LEVEL=${LOG_LEVEL} depends_on: - mongo @@ -147,6 +153,7 @@ services: environment: - CONTAINER_NAME=api-events - MONITORING=${MONITORING} + - LOG_LEVEL=${LOG_LEVEL} extra_hosts: - host.docker.internal:host-gateway - fluent-bit:host-gateway @@ -172,6 +179,7 @@ services: - CAPIF_HOSTNAME=${CAPIF_HOSTNAME} - CONTAINER_NAME=api-invocation-logs - MONITORING=${MONITORING} + - LOG_LEVEL=${LOG_LEVEL} depends_on: - mongo @@ -190,6 +198,7 @@ services: environment: - CONTAINER_NAME=api-publish-apis - MONITORING=${MONITORING} + - LOG_LEVEL=${LOG_LEVEL} depends_on: - redis - mongo @@ -215,6 +224,7 @@ services: - VAULT_HOSTNAME=vault - VAULT_ACCESS_TOKEN=dev-only-token - VAULT_PORT=8200 + - LOG_LEVEL=${LOG_LEVEL} extra_hosts: - host.docker.internal:host-gateway - fluent-bit:host-gateway @@ -262,6 +272,7 @@ services: - VAULT_HOSTNAME=vault - VAULT_ACCESS_TOKEN=dev-only-token - VAULT_PORT=8200 + - LOG_LEVEL=${LOG_LEVEL} hostname: ${CAPIF_HOSTNAME} volumes: - ./nginx/certs:/etc/nginx/certs diff --git a/services/docker-compose-register.yml b/services/docker-compose-register.yml index b0e55710ca7f1bec7f229dc32d55ee823a80cec2..53ed1017428ae03d3ab074c7378884ce9d871ba3 100644 --- a/services/docker-compose-register.yml +++ b/services/docker-compose-register.yml @@ -11,6 +11,7 @@ services: - VAULT_HOSTNAME=vault - VAULT_ACCESS_TOKEN=dev-only-token - VAULT_PORT=8200 + - LOG_LEVEL=${LOG_LEVEL} extra_hosts: - host.docker.internal:host-gateway - vault:host-gateway @@ -21,6 +22,8 @@ services: mongo_register: image: mongo:6.0.2 + logging: + driver: 'none' restart: unless-stopped environment: MONGO_INITDB_ROOT_USERNAME: root diff --git a/services/helper/helper_service/app.py b/services/helper/helper_service/app.py index c0af3df2c5ae9f8f58e515f3c8b512bc81ecdfb1..e7a65ec22d813f5530e4af8e6bac5da96e81f372 100644 --- a/services/helper/helper_service/app.py +++ b/services/helper/helper_service/app.py @@ -5,10 +5,15 @@ from OpenSSL.crypto import PKey, TYPE_RSA, X509Req, dump_certificate_request, FI from config import Config import json import requests +import os app = Flask(__name__) config = Config().get_config() +# Setting log level +log_level = os.getenv('LOG_LEVEL', 'INFO').upper() +numeric_level = getattr(logging, log_level, logging.INFO) + # Create a superadmin CSR and keys key = PKey() key.generate_key(TYPE_RSA, 2048) @@ -61,5 +66,5 @@ cert_file.write(bytes(ca_root, 'utf-8')) cert_file.close() app.register_blueprint(helper_routes) -app.logger.setLevel(logging.DEBUG) +app.logger.setLevel(numeric_level) diff --git a/services/mock_server/mock_server.py b/services/mock_server/mock_server.py index e45fae0f241f1801e7ddc9749399f4fa0bc5d796..41ba65066d81a1857f53a69eb752995c6bd14210 100644 --- a/services/mock_server/mock_server.py +++ b/services/mock_server/mock_server.py @@ -5,6 +5,10 @@ import os app = Flask(__name__) +# Setting log level +log_level = os.getenv('LOG_LEVEL', 'INFO').upper() +numeric_level = getattr(logging, log_level, logging.INFO) + # Lista para almacenar las solicitudes recibidas requests_received = [] @@ -20,10 +24,10 @@ def configure_logging(app): loggers = [app.logger, ] handlers = [] console_handler = logging.StreamHandler() - console_handler.setLevel(logging.DEBUG) + console_handler.setLevel(numeric_level) console_handler.setFormatter(verbose_formatter()) file_handler = RotatingFileHandler(filename="mock_server.log", maxBytes=1024 * 1024 * 100, backupCount=20) - file_handler.setLevel(logging.DEBUG) + file_handler.setLevel(numeric_level) file_handler.setFormatter(verbose_formatter()) handlers.append(console_handler) handlers.append(file_handler) @@ -33,7 +37,7 @@ def configure_logging(app): for handler in handlers: l.addHandler(handler) l.propagate = False - l.setLevel(logging.DEBUG) + l.setLevel(numeric_level) @app.route('/testing', methods=['POST', 'GET']) def index(): diff --git a/services/nginx/nginx.conf b/services/nginx/nginx.conf index ec70d576977be2d61f633f8888ff392d60f1b322..f51e177fd0fce53f6d151e3483fcd4802a5a1d3c 100644 --- a/services/nginx/nginx.conf +++ b/services/nginx/nginx.conf @@ -1,6 +1,6 @@ worker_processes auto; -error_log /var/log/nginx/error.log debug; +error_log /var/log/nginx/error.log ${LOG_LEVEL}; pid /tmp/nginx.pid; events { diff --git a/services/nginx/nginx_prepare.sh b/services/nginx/nginx_prepare.sh index 081b2c9ad1062c213f6cf04ed9c47847413ac12f..75fc9fd5e9a86d4dca66ef0b7124f08557b510ac 100644 --- a/services/nginx/nginx_prepare.sh +++ b/services/nginx/nginx_prepare.sh @@ -34,5 +34,20 @@ curl -k -retry 30 \ --header "X-Vault-Token: $VAULT_TOKEN" \ --request GET "$VAULT_ADDR/v1/secret/data/server_cert/private" 2>/dev/null | jq -r '.data.data.key' -j > $CERTS_FOLDER/server.key +LOG_LEVEL=$(echo "${LOG_LEVEL}" | tr '[:upper:]' '[:lower:]') +case "$LOG_LEVEL" in + critical) + LOG_LEVEL="crit" + ;; + fatal) + LOG_LEVEL="error" + ;; + notset) + LOG_LEVEL="info" + ;; +esac + +envsubst '$LOG_LEVEL' < /etc/nginx/nginx.conf > /etc/nginx/nginx.conf.tmp +mv /etc/nginx/nginx.conf.tmp /etc/nginx/nginx.conf nginx \ No newline at end of file diff --git a/services/register/register_service/app.py b/services/register/register_service/app.py index 1e38eda2753607d17b92d413064d20b85e7a9842..53d4b0507b62499e100407043f44a952994442c8 100644 --- a/services/register/register_service/app.py +++ b/services/register/register_service/app.py @@ -8,6 +8,7 @@ import json from config import Config from db.db import MongoDatabse import logging +import os app = Flask(__name__) @@ -16,6 +17,10 @@ jwt_manager = JWTManager(app) config = Config().get_config() +# Setting log level +log_level = os.getenv('LOG_LEVEL', 'INFO').upper() +numeric_level = getattr(logging, log_level, logging.INFO) + # Create a superadmin CSR and keys key = PKey() key.generate_key(TYPE_RSA, 2048) @@ -85,6 +90,6 @@ app.config['JWT_ALGORITHM'] = 'RS256' app.config['JWT_PRIVATE_KEY'] = key_data app.config['REGISTRE_SECRET_KEY'] = config["register"]["register_uuid"] -app.logger.setLevel(logging.DEBUG) +app.logger.setLevel(numeric_level) app.register_blueprint(register_routes) \ No newline at end of file diff --git a/services/run.sh b/services/run.sh index 3053019e025371470730e73354780d667972217d..cf500a936202a281b3232992257e44fc582c9bb5 100755 --- a/services/run.sh +++ b/services/run.sh @@ -5,6 +5,7 @@ help() { echo " -c : Setup different hostname for capif" echo " -s : Run Mock server" echo " -m : Clean monitoring service" + echo " -l : Set Log Level (default DEBUG). Select one of: [CRITICAL, FATAL, ERROR, WARNING, WARN, INFO, DEBUG, NOTSET]" echo " -h : show this help" exit 1 } @@ -12,6 +13,7 @@ help() { HOSTNAME=capifcore MONITORING_STATE=false DEPLOY=all +LOG_LEVEL=DEBUG # Needed to avoid write permissions on bind volumes with prometheus and grafana DUID=$(id -u) @@ -33,7 +35,7 @@ else fi # Read params -while getopts ":c:msh" opt; do +while getopts ":c:l:msh" opt; do case $opt in c) HOSTNAME="$OPTARG" @@ -46,7 +48,10 @@ while getopts ":c:msh" opt; do ;; h) help - ;; + ;; + l) + LOG_LEVEL="$OPTARG" + ;; \?) echo "Not valid option: -$OPTARG" >&2 help @@ -86,7 +91,7 @@ else exit $status fi -CAPIF_HOSTNAME=$HOSTNAME MONITORING=$MONITORING_STATE docker compose -f "docker-compose-capif.yml" up --detach --build +CAPIF_HOSTNAME=$HOSTNAME MONITORING=$MONITORING_STATE LOG_LEVEL=$LOG_LEVEL docker compose -f "docker-compose-capif.yml" up --detach --build status=$? if [ $status -eq 0 ]; then @@ -98,7 +103,7 @@ fi CAPIF_PRIV_KEY_BASE_64=$(echo "$(cat nginx/certs/server.key)") -CAPIF_PRIV_KEY=$CAPIF_PRIV_KEY_BASE_64 docker compose -f "docker-compose-register.yml" up --detach --build +CAPIF_PRIV_KEY=$CAPIF_PRIV_KEY_BASE_64 LOG_LEVEL=$LOG_LEVEL docker compose -f "docker-compose-register.yml" up --detach --build status=$? if [ $status -eq 0 ]; then diff --git a/services/run_capif_tests.sh b/services/run_capif_tests.sh index 7762fcd8f016a5ca227599b310cef5523ce577e5..f0a3f07abeab4f238a8c720c0d6524fe285b0ca9 100755 --- a/services/run_capif_tests.sh +++ b/services/run_capif_tests.sh @@ -1,11 +1,12 @@ #!/bin/bash +timestamp=$(date +"%Y%m%d_%H%M%S") DOCKER_ROBOT_IMAGE=dockerhub.hi.inet/5ghacking/5gnow-robot-test-image DOCKER_ROBOT_IMAGE_VERSION=4.0 cd .. REPOSITORY_BASE_FOLDER=${PWD} TEST_FOLDER=$REPOSITORY_BASE_FOLDER/tests -RESULT_FOLDER=$REPOSITORY_BASE_FOLDER/results +RESULT_FOLDER=$REPOSITORY_BASE_FOLDER/results/$timestamp ROBOT_DOCKER_FILE_FOLDER=$REPOSITORY_BASE_FOLDER/tools/robot # nginx Hostname and http port (80 by default) to reach for tests diff --git a/tests/features/CAPIF Api Access Control Policy/capif_api_access_control_policy.robot b/tests/features/CAPIF Api Access Control Policy/capif_api_access_control_policy.robot index ec0f0821b4ae9eff2896b2e6dcd18dc9874137eb..cd497841ec3a381ef7ec390aebab4a6f8eb691a0 100644 --- a/tests/features/CAPIF Api Access Control Policy/capif_api_access_control_policy.robot +++ b/tests/features/CAPIF Api Access Control Policy/capif_api_access_control_policy.robot @@ -7,6 +7,7 @@ Resource ../../resources/common.resource Suite Teardown Reset Testing Environment Test Setup Reset Testing Environment +Test Teardown Reset Testing Environment *** Variables *** diff --git a/tests/features/CAPIF Api Auditing Service/capif_auditing_api.robot b/tests/features/CAPIF Api Auditing Service/capif_auditing_api.robot index 0676168adb8c2b12d2cfde56341a3703ace5f972..d850a5793a5b99f9bf96dfd7dd6a9d1f10ea994a 100644 --- a/tests/features/CAPIF Api Auditing Service/capif_auditing_api.robot +++ b/tests/features/CAPIF Api Auditing Service/capif_auditing_api.robot @@ -7,6 +7,7 @@ Resource ../../resources/common.resource Suite Teardown Reset Testing Environment Test Setup Reset Testing Environment +Test Teardown Reset Testing Environment *** Variables *** diff --git a/tests/features/CAPIF Api Discover Service/capif_api_service_discover.robot b/tests/features/CAPIF Api Discover Service/capif_api_service_discover.robot index ff82ec3b8535e389e55a377dce13c6a7d459113d..e780526ce82217446018c8d06aa5fd545eae34d1 100644 --- a/tests/features/CAPIF Api Discover Service/capif_api_service_discover.robot +++ b/tests/features/CAPIF Api Discover Service/capif_api_service_discover.robot @@ -6,7 +6,7 @@ Library /opt/robot-tests/tests/libraries/bodyRequests.py Suite Teardown Reset Testing Environment Test Setup Reset Testing Environment -# Test Setup Initialize Test And Register role=invoker +Test Teardown Reset Testing Environment *** Variables *** diff --git a/tests/features/CAPIF Api Events/capif_events_api.robot b/tests/features/CAPIF Api Events/capif_events_api.robot index d5e02d26d1b9d7592d5cc84e489bfecf2bc1dd0e..fdec6a935ef0baf5386597f91a655d1a57f79e31 100644 --- a/tests/features/CAPIF Api Events/capif_events_api.robot +++ b/tests/features/CAPIF Api Events/capif_events_api.robot @@ -8,6 +8,7 @@ Resource ../../resources/common.resource Suite Teardown Reset Testing Environment Test Setup Reset Testing Environment +Test Teardown Reset Testing Environment *** Variables *** diff --git a/tests/features/CAPIF Api Invoker Management/capif_api_invoker_managenet.robot b/tests/features/CAPIF Api Invoker Management/capif_api_invoker_managenet.robot index 27006b1e744cb2e33b30671b7dcec07854b93794..6ab8ba5d01336f44a27edf13f83da7539ed1e53f 100644 --- a/tests/features/CAPIF Api Invoker Management/capif_api_invoker_managenet.robot +++ b/tests/features/CAPIF Api Invoker Management/capif_api_invoker_managenet.robot @@ -8,6 +8,7 @@ Library Collections Suite Teardown Reset Testing Environment Test Setup Reset Testing Environment +Test Teardown Reset Testing Environment *** Variables *** diff --git a/tests/features/CAPIF Api Logging Service/capif_logging_api.robot b/tests/features/CAPIF Api Logging Service/capif_logging_api.robot index a7a025323714c370440cefda59a6cb73541442da..4db54b2c821ca4e25835fb72b7c8095441e43157 100644 --- a/tests/features/CAPIF Api Logging Service/capif_logging_api.robot +++ b/tests/features/CAPIF Api Logging Service/capif_logging_api.robot @@ -7,6 +7,7 @@ Resource ../../resources/common.resource Suite Teardown Reset Testing Environment Test Setup Reset Testing Environment +Test Teardown Reset Testing Environment *** Variables *** diff --git a/tests/features/CAPIF Api Provider Management/capif_api_provider_management.robot b/tests/features/CAPIF Api Provider Management/capif_api_provider_management.robot index a6f9674acb9a7a097d284296bef12553ce939987..31aa55e8b6415c40fbff2ab56a3a7e6972a6505f 100644 --- a/tests/features/CAPIF Api Provider Management/capif_api_provider_management.robot +++ b/tests/features/CAPIF Api Provider Management/capif_api_provider_management.robot @@ -7,6 +7,7 @@ Library Collections Suite Teardown Reset Testing Environment Test Setup Reset Testing Environment +Test Teardown Reset Testing Environment *** Variables *** diff --git a/tests/features/CAPIF Api Publish Service/capif_api_publish_service.robot b/tests/features/CAPIF Api Publish Service/capif_api_publish_service.robot index 56484d2d3e359ac65dc0a2dd172190a6b8c7e188..f3556a4b5517385791622a476f988c6ae01dc343 100644 --- a/tests/features/CAPIF Api Publish Service/capif_api_publish_service.robot +++ b/tests/features/CAPIF Api Publish Service/capif_api_publish_service.robot @@ -6,6 +6,7 @@ Library /opt/robot-tests/tests/libraries/bodyRequests.py Suite Teardown Reset Testing Environment Test Setup Reset Testing Environment +Test Teardown Reset Testing Environment *** Variables *** diff --git a/tests/features/CAPIF Security Api/capif_security_api.robot b/tests/features/CAPIF Security Api/capif_security_api.robot index 6342aa9f92fd555e3d08c3ac443eb395e456e8c5..f6448390a251e66755e21df6c5fa09ef58b81ac6 100644 --- a/tests/features/CAPIF Security Api/capif_security_api.robot +++ b/tests/features/CAPIF Security Api/capif_security_api.robot @@ -7,6 +7,7 @@ Resource ../../resources/common.resource Suite Teardown Reset Testing Environment Test Setup Reset Testing Environment +Test Teardown Reset Testing Environment *** Variables *** diff --git a/tests/libraries/interrupt_listener.py b/tests/libraries/interrupt_listener.py new file mode 100644 index 0000000000000000000000000000000000000000..ec2f5d43e117c5aba1a197a3f8e1fcf9f1d1d407 --- /dev/null +++ b/tests/libraries/interrupt_listener.py @@ -0,0 +1,24 @@ +import signal +from robot.libraries.BuiltIn import BuiltIn + +class InterruptListener: + ROBOT_LISTENER_API_VERSION = 3 + + def __init__(self): + signal.signal(signal.SIGINT, self._handle_interrupt) + self.builtin = BuiltIn() + + def _handle_interrupt(self, signum, frame): + print("Execution interrupted! Running cleanup keyword...") + try: + self.builtin.run_keyword('Reset Testing Environment') + except Exception as e: + print(f"Error during cleanup: {e}") + finally: + exit(0) + + def start_suite(self, name, attrs): + print(f"Starting suite: {name}") + + def end_suite(self, name, attrs): + print(f"Ending suite: {name}") \ No newline at end of file diff --git a/tests/resources/common.resource b/tests/resources/common.resource index b2f19ae673b2ee2eb0008d215707a93c0f1c1f5f..fcd9a97efb354180ba2b639f23787641b3a84038 100644 --- a/tests/resources/common.resource +++ b/tests/resources/common.resource @@ -1,5 +1,6 @@ *** Settings *** Library /opt/robot-tests/tests/libraries/helpers.py +Library /opt/robot-tests/tests/libraries/interrupt_listener.py Library Process Library Collections Variables /opt/robot-tests/tests/libraries/environment.py