diff --git a/helm/04_capif_services/charts/ocf-api-invoker-management/templates/configmap.yaml b/helm/04_capif_services/charts/ocf-api-invoker-management/templates/configmap.yaml index f06888931bded3d1d59114a05b1877f9283db25d..63291c9779f90d1b0cdc4fb02be13a6d525e05b8 100644 --- a/helm/04_capif_services/charts/ocf-api-invoker-management/templates/configmap.yaml +++ b/helm/04_capif_services/charts/ocf-api-invoker-management/templates/configmap.yaml @@ -4,38 +4,36 @@ metadata: name: capif-invoker-configmap data: config.yaml: | - mongo: { - 'user': '{{ .Values.env.mongoInitdbRootUsername }}', - 'password': '{{ .Values.env.mongoInitdbRootPassword }}', - 'db': 'capif', - 'col': 'invokerdetails', - 'capif_users_col': 'user', - 'certs_col': 'certs', - 'service_col': 'serviceapidescriptions', - 'host': 'mongo', - 'port': "27017" - } - mongo_register: { - 'user': '{{ .Values.env.mongoRegister.mongoInitdbRootUsername }}', - 'password': '{{ .Values.env.mongoRegister.mongoInitdbRootPassword }}', - 'db': 'capif_users', - 'col': 'user', - 'host': 'mongo-register', - 'port': '27017' - } - ca_factory: { - "url": {{ quote .Values.env.vaultHostname }}, - "port": {{ quote .Values.env.vaultPort }}, - "token": {{ quote .Values.env.vaultAccessToken }} - } + mongo: + user: '{{ .Values.env.mongoInitdbRootUsername }}' + password: '{{ .Values.env.mongoInitdbRootPassword }}' + db: capif + col: invokerdetails + capif_users_col: user + certs_col: certs + service_col: serviceapidescriptions + host: '{{ .Values.env.mongoHost }}' + port: '{{ .Values.env.mongoPort }}' - monitoring: { - "fluent_bit_host": fluent-bit, - "fluent_bit_port": 24224, - "opentelemetry_url": "otel-collector", - "opentelemetry_port": "55680", - "opentelemetry_max_queue_size": 8192, - "opentelemetry_schedule_delay_millis": 20000, - "opentelemetry_max_export_batch_size": 2048, - "opentelemetry_export_timeout_millis": 60000 - } \ No newline at end of file + mongo_register: + user: '{{ .Values.env.mongoRegister.mongoInitdbRootUsername }}' + password: '{{ .Values.env.mongoRegister.mongoInitdbRootPassword }}' + db: 'capif_users' + col: 'user' + host: '{{ .Values.env.mongoRegister.mongoHost }}' + port: '{{ .Values.env.mongoRegister.mongoPort }}' + + ca_factory: + url: !ENV "${VAULT_HOSTNAME}" + port: !ENV "${VAULT_PORT}" + token: !ENV "${VAULT_ACCESS_TOKEN}" + + monitoring: + fluent_bit_host: fluent-bit + fluent_bit_port: 24224 + opentelemetry_url: otel-collector + opentelemetry_port: 55680 + opentelemetry_max_queue_size: 8192 + opentelemetry_schedule_delay_millis: 20000 + opentelemetry_max_export_batch_size: 2048 + opentelemetry_export_timeout_millis: 60000 \ No newline at end of file diff --git a/helm/04_capif_services/charts/ocf-api-invoker-management/values.yaml b/helm/04_capif_services/charts/ocf-api-invoker-management/values.yaml index 0fbda233bf45ad9626f951b90fc19bdc78c2190a..2ebd960bcbe0f038cf8c090143acc63d0774eea2 100644 --- a/helm/04_capif_services/charts/ocf-api-invoker-management/values.yaml +++ b/helm/04_capif_services/charts/ocf-api-invoker-management/values.yaml @@ -20,12 +20,16 @@ env: vaultHostname: vault vaultPort: 8200 vaultAccessToken: dev-only-token + mongoHost: mongo + mongoPort: 27017 mongoInitdbRootUsername: root mongoInitdbRootPassword: example logLevel: "INFO" mongoRegister: mongoInitdbRootUsername: root mongoInitdbRootPassword: example + mongoHost: mongo-register + mongoPort: 27017 serviceAccount: # Specifies whether a service account should be created diff --git a/helm/04_capif_services/charts/ocf-api-provider-management/templates/configmap.yaml b/helm/04_capif_services/charts/ocf-api-provider-management/templates/configmap.yaml index 6da59dd82a3b4cded19ec9fe77cd88d85db7556a..20431cfa6c59c50efa399a96295c4b6c168974b0 100644 --- a/helm/04_capif_services/charts/ocf-api-provider-management/templates/configmap.yaml +++ b/helm/04_capif_services/charts/ocf-api-provider-management/templates/configmap.yaml @@ -4,38 +4,35 @@ metadata: name: capif-provider-configmap data: config.yaml: | - mongo: { - 'user': '{{ .Values.env.mongoInitdbRootUsername }}', - 'password': '{{ .Values.env.mongoInitdbRootPassword }}', - 'db': 'capif', - 'col': 'providerenrolmentdetails', - 'certs_col': 'certs', - 'capif_users': 'user', - 'host': 'mongo', - 'port': "27017" - } - mongo_register: { - 'user': '{{ .Values.env.mongoRegister.mongoInitdbRootUsername }}', - 'password': '{{ .Values.env.mongoRegister.mongoInitdbRootPassword }}', - 'db': 'capif_users', - 'col': 'user', - 'host': 'mongo-register', - 'port': '27017' - } - ca_factory: { - "url": {{ quote .Values.env.vaultHostname }}, - "port": {{ quote .Values.env.vaultPort }}, - "token": {{ quote .Values.env.vaultAccessToken }} - } + mongo: + user: '{{ .Values.env.mongoInitdbRootUsername }}' + password: '{{ .Values.env.mongoInitdbRootPassword }}' + db: 'capif' + col: 'providerenrolmentdetails' + certs_col: 'certs' + capif_users: 'user' + host: '{{ .Values.env.mongoHost }}' + port: '{{ .Values.env.mongoPort }}' + mongo_register: + user: '{{ .Values.env.mongoRegister.mongoInitdbRootUsername }}' + password: '{{ .Values.env.mongoRegister.mongoInitdbRootPassword }}' + db: 'capif_users' + col: 'user' + host: '{{ .Values.env.mongoRegister.mongoHost }}' + port: '{{ .Values.env.mongoRegister.mongoPort }}' - monitoring: { - "fluent_bit_host": fluent-bit, - "fluent_bit_port": 24224, - "opentelemetry_url": "otel-collector", - "opentelemetry_port": "55680", - "opentelemetry_max_queue_size": 8192, - "opentelemetry_schedule_delay_millis": 20000, - "opentelemetry_max_export_batch_size": 2048, - "opentelemetry_export_timeout_millis": 60000 - } \ No newline at end of file + ca_factory: + url: !ENV "${VAULT_HOSTNAME}" + port: !ENV "${VAULT_PORT}" + token: !ENV "${VAULT_ACCESS_TOKEN}" + + monitoring: + fluent_bit_host: fluent-bit + fluent_bit_port: 24224 + opentelemetry_url: otel-collector + opentelemetry_port: 55680 + opentelemetry_max_queue_size: 8192 + opentelemetry_schedule_delay_millis: 20000 + opentelemetry_max_export_batch_size: 2048 + opentelemetry_export_timeout_millis: 60000 diff --git a/helm/04_capif_services/charts/ocf-api-provider-management/values.yaml b/helm/04_capif_services/charts/ocf-api-provider-management/values.yaml index b38cb0fd5c342833e5fee04aa61d2b24d16f5ca7..ba58fd67319185b82adf22d70abc1952cb7eebde 100644 --- a/helm/04_capif_services/charts/ocf-api-provider-management/values.yaml +++ b/helm/04_capif_services/charts/ocf-api-provider-management/values.yaml @@ -20,12 +20,16 @@ env: vaultHostname: vault vaultPort: 8200 vaultAccessToken: dev-only-token + mongoHost: mongo + mongoPort: 27017 mongoInitdbRootUsername: root mongoInitdbRootPassword: example logLevel: "INFO" mongoRegister: mongoInitdbRootUsername: root mongoInitdbRootPassword: example + mongoHost: mongo-register + mongoPort: 27017 serviceAccount: # Specifies whether a service account should be created diff --git a/helm/04_capif_services/charts/ocf-helper/templates/ocf-helper-configmap.yaml b/helm/04_capif_services/charts/ocf-helper/templates/ocf-helper-configmap.yaml index f422d446bc1c4d03bf93fdf682206ac48eb238b3..41e6f60ccdba125f91f7e83edc3587769127432e 100644 --- a/helm/04_capif_services/charts/ocf-helper/templates/ocf-helper-configmap.yaml +++ b/helm/04_capif_services/charts/ocf-helper/templates/ocf-helper-configmap.yaml @@ -4,41 +4,39 @@ metadata: name: ocf-helper-configmap data: config.yaml: | - mongo: { - 'user': '{{ .Values.env.mongoInitdbRootUsername }}', - 'password': '{{ .Values.env.mongoInitdbRootPassword }}', - 'db': 'capif', - 'invoker_col': 'invokerdetails', - 'provider_col': 'providerenrolmentdetails', - 'col_services': "serviceapidescriptions", - 'col_security': "security", - 'col_event': "eventsdetails", - 'col_capif_configuration': "capif_configuration", - 'host': '{{ .Values.env.mongoHost }}', - 'port': "{{ .Values.env.mongoPort }}" - } + mongo: + user: '{{ .Values.env.mongoInitdbRootUsername }}' + password: '{{ .Values.env.mongoInitdbRootPassword }}' + db: capif + invoker_col: invokerdetails + provider_col: providerenrolmentdetails + col_services: serviceapidescriptions + col_security: security + col_event: eventsdetails + col_capif_configuration: capif_configuration + col_interconnected: interconnected + host: '{{ .Values.env.mongoHost }}' + port: "{{ .Values.env.mongoPort }}" - ca_factory: { - "url": {{ quote .Values.env.vaultHostname }}, - "port": {{ quote .Values.env.vaultPort }}, - "token": {{ quote .Values.env.vaultAccessToken }} - } + ca_factory: + url: !ENV "${VAULT_HOSTNAME}" + port: !ENV "${VAULT_PORT}" + token: !ENV "${VAULT_ACCESS_TOKEN}" {{- if .Values.capifConfiguration }} capif_configuration: {{ .Values.capifConfiguration | toYaml | nindent 6 }} {{- end }} - package_paths: { - "helper_api": { - "path": "/api", - "openapi_file": "api/openapi/openapi.yaml" - }, - "configuration_api": { - "path": "/configuration", - "openapi_file": "configuration/openapi/openapi.yaml" - }, - "visibility_control": { - "path": "/visibility-control", - "openapi_file": "visibility_control/openapi/openapi.yaml" - } - } \ No newline at end of file + package_paths: + helper_api: + path: /api + openapi_file: api/openapi/openapi.yaml + configuration_api: + path: /configuration + openapi_file: configuration/openapi/openapi.yaml + interconnection_api: + path: /interconnection + openapi_file: interconnection/openapi/openapi.yaml + visibility_control: + path: /visibility-control + openapi_file: visibility_control/openapi/openapi.yaml \ No newline at end of file diff --git a/helm/04_capif_services/charts/ocf-publish-service-api/templates/configmap.yaml b/helm/04_capif_services/charts/ocf-publish-service-api/templates/configmap.yaml index 651ad05b2791bebd2a0a3f4f31c2725b80f24e28..7fcc25ed1558cf61b3cf2e5c20e063b59d2704db 100644 --- a/helm/04_capif_services/charts/ocf-publish-service-api/templates/configmap.yaml +++ b/helm/04_capif_services/charts/ocf-publish-service-api/templates/configmap.yaml @@ -4,24 +4,29 @@ metadata: name: capif-published-configmap data: config.yaml: | - mongo: { - 'user': '{{ .Values.env.mongoInitdbRootUsername }}', - 'password': '{{ .Values.env.mongoInitdbRootPassword }}', - 'db': 'capif', - 'col': 'serviceapidescriptions', - 'certs_col': 'certs', - 'capif_provider_col': 'providerenrolmentdetails', - 'host': 'mongo', - 'port': "27017" - } + mongo: + user: '{{ .Values.env.mongoInitdbRootUsername }}' + password: '{{ .Values.env.mongoInitdbRootPassword }}' + db: 'capif' + col: 'serviceapidescriptions' + certs_col: 'certs' + capif_provider_col: 'providerenrolmentdetails' + col_interconnected: 'interconnected' + col_capif_configuration: 'capif_configuration' + host: '{{ .Values.env.mongoHost }}' + port: '{{ .Values.env.mongoPort }}' - monitoring: { - "fluent_bit_host": fluent-bit, - "fluent_bit_port": 24224, - "opentelemetry_url": "otel-collector", - "opentelemetry_port": "55680", - "opentelemetry_max_queue_size": 8192, - "opentelemetry_schedule_delay_millis": 20000, - "opentelemetry_max_export_batch_size": 2048, - "opentelemetry_export_timeout_millis": 60000 - } \ No newline at end of file + monitoring: + fluent_bit_host: fluent-bit + fluent_bit_port: 24224 + opentelemetry_url: otel-collector + opentelemetry_port: 55680 + opentelemetry_max_queue_size: 8192 + opentelemetry_schedule_delay_millis: 20000 + opentelemetry_max_export_batch_size: 2048 + opentelemetry_export_timeout_millis: 60000 + + ca_factory: + url: !ENV "${VAULT_HOSTNAME}" + port: !ENV "${VAULT_PORT}" + token: !ENV "${VAULT_ACCESS_TOKEN}" \ No newline at end of file diff --git a/helm/04_capif_services/charts/ocf-publish-service-api/templates/deployment.yaml b/helm/04_capif_services/charts/ocf-publish-service-api/templates/deployment.yaml index 7df0807dc807d8600acfd7aed2169410e5e211a2..177d2c6fb507974bbb917f590d11a35ae2ee2f50 100644 --- a/helm/04_capif_services/charts/ocf-publish-service-api/templates/deployment.yaml +++ b/helm/04_capif_services/charts/ocf-publish-service-api/templates/deployment.yaml @@ -44,6 +44,12 @@ spec: value: {{ quote .Values.env.monitoring }} - name: CAPIF_HOSTNAME value: {{ quote .Values.env.capifHostname }} + - name: VAULT_HOSTNAME + value: {{ quote .Values.env.vaultHostname }} + - name: VAULT_PORT + value: {{ quote .Values.env.vaultPort }} + - name: VAULT_ACCESS_TOKEN + value: {{ quote .Values.env.vaultAccessToken }} - name: LOG_LEVEL value: {{ quote .Values.env.logLevel }} livenessProbe: diff --git a/helm/04_capif_services/charts/ocf-publish-service-api/values.yaml b/helm/04_capif_services/charts/ocf-publish-service-api/values.yaml index f22c2b285e5f7a15c51d182d7aa78e75403017aa..90a8f8f308a324fdc92eddb93bd422dcbbb134cf 100644 --- a/helm/04_capif_services/charts/ocf-publish-service-api/values.yaml +++ b/helm/04_capif_services/charts/ocf-publish-service-api/values.yaml @@ -19,6 +19,11 @@ env: capifHostname: capif mongoInitdbRootUsername: root mongoInitdbRootPassword: example + mongoHost: mongo + mongoPort: 27017 + vaultHostname: vault + vaultPort: 8200 + vaultAccessToken: dev-only-token logLevel: "INFO" serviceAccount: diff --git a/helm/05_capif_register/charts/ocf-register/templates/configmap.yaml b/helm/05_capif_register/charts/ocf-register/templates/configmap.yaml index 2b89f18006c68505d7a1c5d0a4e84dd551fab99e..e7fc7ee9ef01ae85aa6e8c40e9cf046e1aec0bf3 100644 --- a/helm/05_capif_register/charts/ocf-register/templates/configmap.yaml +++ b/helm/05_capif_register/charts/ocf-register/templates/configmap.yaml @@ -4,32 +4,32 @@ metadata: name: register-configmap data: config.yaml: |- - mongo: { - 'user': 'root', - 'password': 'example', - 'db': 'capif_users', - 'col': 'user', - 'col_capif_configuration': 'capif_configuration', - 'admins': 'admins', - 'host': '{{ .Values.env.mongoHost }}', - 'port': '{{ .Values.env.mongoPort }}' - } - ca_factory: { - "url": "{{ .Values.env.vaultHostname }}", - "port": "{{ .Values.env.vaultPort }}", - "token": "{{ .Values.env.vaultAccessToken }}" - } - ccf: { - "url": "{{ .Values.env.capifHostname }}", - "helper_remove_user": "/helper/deleteEntities/" - } - register: { - register_uuid: '6ba7b810-9dad-11d1-80b4-00c04fd430c8', - refresh_expiration: 30, #days - token_expiration: 10, #mins - admin_users: {admin_user: "admin", - admin_pass: "password123"} - } + mongo: + user: 'root' + password: 'example' + db: 'capif_users' + col: 'user' + col_capif_configuration: 'capif_configuration' + admins: 'admins' + host: '{{ .Values.env.mongoHost }}' + port: '{{ .Values.env.mongoPort }}' + + ca_factory: + url: !ENV "${VAULT_HOSTNAME}" + port: !ENV "${VAULT_PORT}" + token: !ENV "${VAULT_ACCESS_TOKEN}" + + ccf: + url: !ENV "${CAPIF_HOSTNAME}" + helper_remove_user: "/helper/deleteEntities/" + + register: + register_uuid: '6ba7b810-9dad-11d1-80b4-00c04fd430c8' + refresh_expiration: 30 #days + token_expiration: 10 #mins + admin_users: + admin_user: "admin" + admin_pass: "password123" {{- if .Values.capifConfiguration }} capif_configuration: {{ .Values.capifConfiguration | toYaml | nindent 6 }} diff --git a/helm/05_capif_register/charts/ocf-register/templates/deployment.yaml b/helm/05_capif_register/charts/ocf-register/templates/deployment.yaml index 31afe6924d7ffd65f12406080212f6a067339a9d..b92e6f25161cd2d0e70feaa90902a64411cb8d8a 100644 --- a/helm/05_capif_register/charts/ocf-register/templates/deployment.yaml +++ b/helm/05_capif_register/charts/ocf-register/templates/deployment.yaml @@ -55,6 +55,8 @@ spec: value: {{ quote .Values.env.timeout }} - name: REGISTER_HOSTNAME value: {{ quote .Values.env.registerHostname }} + - name: CAPIF_HOSTNAME + value: {{ quote .Values.env.capifHostname }} livenessProbe: {{- toYaml .Values.livenessProbe | nindent 12 }} readinessProbe: diff --git a/helm/scripts/04_install_capif_services.sh b/helm/scripts/04_install_capif_services.sh index b9bf4c289c6ebdda9d71200e543caa9eac85b323..7f965ef1b76e26d7cbb46f6cc4f9c13221616aee 100755 --- a/helm/scripts/04_install_capif_services.sh +++ b/helm/scripts/04_install_capif_services.sh @@ -88,6 +88,9 @@ install_capif_helm() { --set ocf-publish-service-api.image.tag=$CAPIF_IMAGE_TAG \ --set ocf-publish-service-api.env.monitoring="true" \ --set ocf-publish-service-api.env.capifHostname=$CAPIF_HOSTNAME \ + --set ocf-publish-service-api.env.vaultHostname=$VAULT_INTERNAL_HOSTNAME \ + --set ocf-publish-service-api.env.vaultPort=$VAULT_PORT \ + --set ocf-publish-service-api.env.vaultAccessToken=$VAULT_ACCESS_TOKEN \ --set ocf-publish-service-api.env.logLevel="$LOG_LEVEL" \ --set ocf-discover-service-api.image.repository=$CAPIF_DOCKER_REGISTRY/ocf-discover-service-api \ --set ocf-discover-service-api.image.tag=$CAPIF_IMAGE_TAG \ diff --git a/services/TS29222_CAPIF_API_Invoker_Management_API/config.yaml b/services/TS29222_CAPIF_API_Invoker_Management_API/config.yaml index c3e9f07afce53379fcf4d5f46e0c2f6e8f0dbdc9..09cd712194b5427b7b2bdafee49da34bf8c0c8ef 100644 --- a/services/TS29222_CAPIF_API_Invoker_Management_API/config.yaml +++ b/services/TS29222_CAPIF_API_Invoker_Management_API/config.yaml @@ -1,28 +1,25 @@ -mongo: { - 'user': 'root', - 'password': 'example', - 'db': 'capif', - 'col': 'invokerdetails', - 'certs_col': "certs", - 'service_col': 'serviceapidescriptions', - 'host': 'mongo', - 'port': "27017" -} +mongo: + user: 'root' + password: 'example' + db: 'capif' + col: 'invokerdetails' + certs_col: "certs" + service_col: 'serviceapidescriptions' + host: 'mongo' + port: "27017" ca_factory: url: !ENV ${VAULT_HOSTNAME} - port: "8200" - token: "dev-only-token" + port: !ENV ${VAULT_PORT} + token: !ENV ${VAULT_ACCESS_TOKEN} verify: False - -monitoring: { - "fluent_bit_host": fluent-bit, - "fluent_bit_port": 24224, - "opentelemetry_url": "otel-collector", - "opentelemetry_port": "55680", - "opentelemetry_max_queue_size": 8192, - "opentelemetry_schedule_delay_millis": 20000, - "opentelemetry_max_export_batch_size": 2048, - "opentelemetry_export_timeout_millis": 60000 -} \ No newline at end of file +monitoring: + fluent_bit_host: fluent-bit + fluent_bit_port: 24224 + opentelemetry_url: otel-collector + opentelemetry_port: 55680 + opentelemetry_max_queue_size: 8192 + opentelemetry_schedule_delay_millis: 20000 + opentelemetry_max_export_batch_size: 2048 + opentelemetry_export_timeout_millis: 60000 \ No newline at end of file diff --git a/services/TS29222_CAPIF_API_Invoker_Management_API/requirements.txt b/services/TS29222_CAPIF_API_Invoker_Management_API/requirements.txt index 4243aa97561e63ddeee297c06ec2efd8d7e92e68..d2bc7d53b5eff749bf02e349321b0336033e5c97 100644 --- a/services/TS29222_CAPIF_API_Invoker_Management_API/requirements.txt +++ b/services/TS29222_CAPIF_API_Invoker_Management_API/requirements.txt @@ -22,4 +22,5 @@ flask_executor == 1.0.0 Flask-APScheduler == 1.13.1 werkzeug == 3.1.4 gunicorn == 23.0.0 -packaging == 24.0 \ No newline at end of file +packaging == 24.0 +starlette == 0.52.1 \ No newline at end of file diff --git a/services/TS29222_CAPIF_API_Provider_Management_API/config.yaml b/services/TS29222_CAPIF_API_Provider_Management_API/config.yaml index e2bb0de0db799822253f5ad423c978168b444c68..4f8ed39a4cc04a7a9bafe91d9b45cfb5dd1c575a 100644 --- a/services/TS29222_CAPIF_API_Provider_Management_API/config.yaml +++ b/services/TS29222_CAPIF_API_Provider_Management_API/config.yaml @@ -8,15 +8,12 @@ mongo: { 'port': "27017" } - ca_factory: url: !ENV ${VAULT_HOSTNAME} - port: "8200" - token: "dev-only-token" + port: !ENV ${VAULT_PORT} + token: !ENV ${VAULT_ACCESS_TOKEN} verify: False - - monitoring: { "fluent_bit_host": fluent-bit, "fluent_bit_port": 24224, diff --git a/services/TS29222_CAPIF_API_Provider_Management_API/requirements.txt b/services/TS29222_CAPIF_API_Provider_Management_API/requirements.txt index 5c88471ccb99efcf59ff5920d7876d3bcbfdbbfa..7a55a99e4cc3bf33864603f99f88fcccf94ebeb3 100644 --- a/services/TS29222_CAPIF_API_Provider_Management_API/requirements.txt +++ b/services/TS29222_CAPIF_API_Provider_Management_API/requirements.txt @@ -21,3 +21,4 @@ flask_executor == 1.0.0 werkzeug == 3.1.3 gunicorn == 23.0.0 packaging == 24.0 +starlette == 0.52.1 \ No newline at end of file diff --git a/services/TS29222_CAPIF_Access_Control_Policy_API/requirements.txt b/services/TS29222_CAPIF_Access_Control_Policy_API/requirements.txt index fca0da9fe9abf5e279d684c12bab034726ce010a..c5676ce9420b155dcd08509498a97fd704c4264d 100644 --- a/services/TS29222_CAPIF_Access_Control_Policy_API/requirements.txt +++ b/services/TS29222_CAPIF_Access_Control_Policy_API/requirements.txt @@ -20,4 +20,5 @@ flask_executor == 1.0.0 Flask-APScheduler == 1.13.1 Flask-Script == 2.0.6 gunicorn == 23.0.0 -packaging == 24.0 \ No newline at end of file +packaging == 24.0 +starlette == 0.52.1 \ No newline at end of file diff --git a/services/TS29222_CAPIF_Auditing_API/requirements.txt b/services/TS29222_CAPIF_Auditing_API/requirements.txt index 1dcdb98c97159973fe5fd255544a601b360809aa..95d1a60e52959190b472414dacb81cd96e50a3fa 100644 --- a/services/TS29222_CAPIF_Auditing_API/requirements.txt +++ b/services/TS29222_CAPIF_Auditing_API/requirements.txt @@ -21,3 +21,4 @@ werkzeug == 3.1.3 pyopenssl == 25.3.0 gunicorn == 23.0.0 packaging == 24.0 +starlette == 0.52.1 \ No newline at end of file diff --git a/services/TS29222_CAPIF_Discover_Service_API/requirements.txt b/services/TS29222_CAPIF_Discover_Service_API/requirements.txt index 5c88471ccb99efcf59ff5920d7876d3bcbfdbbfa..7a55a99e4cc3bf33864603f99f88fcccf94ebeb3 100644 --- a/services/TS29222_CAPIF_Discover_Service_API/requirements.txt +++ b/services/TS29222_CAPIF_Discover_Service_API/requirements.txt @@ -21,3 +21,4 @@ flask_executor == 1.0.0 werkzeug == 3.1.3 gunicorn == 23.0.0 packaging == 24.0 +starlette == 0.52.1 \ No newline at end of file diff --git a/services/TS29222_CAPIF_Events_API/requirements.txt b/services/TS29222_CAPIF_Events_API/requirements.txt index 00e06c2c5c994d079d20e5ce8fce0b2bba1d1fdd..a9d508a0ae65d5859c8dc7b2652559dc863c6bec 100644 --- a/services/TS29222_CAPIF_Events_API/requirements.txt +++ b/services/TS29222_CAPIF_Events_API/requirements.txt @@ -24,4 +24,5 @@ async-timeout == 4.0.3 werkzeug == 3.1.3 pyopenssl == 25.3.0 gunicorn == 23.0.0 -packaging == 24.0 \ No newline at end of file +packaging == 24.0 +starlette == 0.52.1 \ No newline at end of file diff --git a/services/TS29222_CAPIF_Logging_API_Invocation_API/requirements.txt b/services/TS29222_CAPIF_Logging_API_Invocation_API/requirements.txt index 92016a476d51994d4bde7a008cfd0b9abff23f2f..d429a19627becb4df9bddfcf1e5baac1a96a6ae7 100644 --- a/services/TS29222_CAPIF_Logging_API_Invocation_API/requirements.txt +++ b/services/TS29222_CAPIF_Logging_API_Invocation_API/requirements.txt @@ -22,3 +22,4 @@ werkzeug == 3.1.3 pyopenssl == 25.3.0 gunicorn == 23.0.0 packaging == 24.0 +starlette == 0.52.1 diff --git a/services/TS29222_CAPIF_Publish_Service_API/config.yaml b/services/TS29222_CAPIF_Publish_Service_API/config.yaml index e3458b24bd5d0a608fc22cd1e8a8bb3c4a621782..afe0131cb080d5d4f3f8160ab9763e9a19a09709 100644 --- a/services/TS29222_CAPIF_Publish_Service_API/config.yaml +++ b/services/TS29222_CAPIF_Publish_Service_API/config.yaml @@ -22,24 +22,6 @@ monitoring: ca_factory: url: !ENV ${VAULT_HOSTNAME} - port: 8200 - token: dev-only-token + port: !ENV ${VAULT_PORT} + token: !ENV ${VAULT_ACCESS_TOKEN} verify: False - -capif_configuration: - config_description: Default CAPIF Configuration - config_name: default - config_version: "1.0" - settings: - acl_policy_settings: - allowed_invocation_time_range_days: 365 - allowed_invocations_per_second: 10 - allowed_total_invocations: 5 - certificates_expiry: - ttl_invoker_cert: 4300h - ttl_provider_cert: 4300h - ttl_superadmin_cert: 4300h - security_method_priority: - oauth: 1 - pki: 2 - psk: 3 \ No newline at end of file diff --git a/services/TS29222_CAPIF_Publish_Service_API/requirements.txt b/services/TS29222_CAPIF_Publish_Service_API/requirements.txt index a5d575020b5b78e47eda6226519da943e973b70f..9d895319702a59ecc62a7645798fdd0669857337 100644 --- a/services/TS29222_CAPIF_Publish_Service_API/requirements.txt +++ b/services/TS29222_CAPIF_Publish_Service_API/requirements.txt @@ -23,4 +23,4 @@ gunicorn == 23.0.0 packaging == 24.0 requests == 2.32.2 pyopenssl == 25.3.0 - +starlette == 0.52.1 diff --git a/services/TS29222_CAPIF_Routing_Info_API/requirements.txt b/services/TS29222_CAPIF_Routing_Info_API/requirements.txt index a1ce6ce493ec9e425dc823c772b97140eb3046a6..35249f471b4933e794d8c772d9f10e8cb66c1a6b 100644 --- a/services/TS29222_CAPIF_Routing_Info_API/requirements.txt +++ b/services/TS29222_CAPIF_Routing_Info_API/requirements.txt @@ -6,3 +6,4 @@ Flask == 3.0.3 werkzeug == 3.1.3 gunicorn == 23.0.0 packaging == 24.0 +starlette == 0.52.1 diff --git a/services/TS29222_CAPIF_Security_API/requirements.txt b/services/TS29222_CAPIF_Security_API/requirements.txt index ce229e4079bf6f6b29269d0f5b7f56cab6e8b2e2..51a08b23cbd854d09c1bc8d90877dd99ce941a21 100644 --- a/services/TS29222_CAPIF_Security_API/requirements.txt +++ b/services/TS29222_CAPIF_Security_API/requirements.txt @@ -21,4 +21,5 @@ Flask-APScheduler == 1.13.1 flask_executor == 1.0.0 werkzeug == 3.1.3 gunicorn == 23.0.0 -packaging == 24.0 \ No newline at end of file +packaging == 24.0 +starlette == 0.52.1 \ No newline at end of file diff --git a/services/check_services_are_running.sh b/services/check_services_are_running.sh index a278793bea92a896381c62de626d5edc8d3140f0..a27de51e2c177c7a888b14b163aae91431f595be 100755 --- a/services/check_services_are_running.sh +++ b/services/check_services_are_running.sh @@ -1,5 +1,14 @@ #!/bin/bash -source $(dirname "$(readlink -f "$0")")/variables.sh +# Capture the first parameter as a possible environment +ENVIRONMENT="dev" +if [[ "$1" != -* && -n "$1" ]]; then + ENVIRONMENT="$1" + shift +fi + +# Load variables for the selected environment +source "$(dirname "$0")/variables.sh" "$ENVIRONMENT" +# source $(dirname "$(readlink -f "$0")")/variables.sh export CAPIF_PRIV_KEY= export CAPIF_PRIV_KEY_BASE_64= diff --git a/services/clean_capif_docker_services.sh b/services/clean_capif_docker_services.sh index 171bc55f2c31575c003e431a2319b438709cdb94..1a53d3319196cd2a4b50693306849e3defdbf99b 100755 --- a/services/clean_capif_docker_services.sh +++ b/services/clean_capif_docker_services.sh @@ -1,8 +1,22 @@ #!/bin/bash -source $(dirname "$(readlink -f "$0")")/variables.sh +# Capture the first parameter as a possible environment +ENVIRONMENT="dev" +if [[ "$1" != -* && -n "$1" ]]; then + ENVIRONMENT="$1" + shift +fi + +# Load variables for the selected environment +source "$(dirname "$0")/variables.sh" "$ENVIRONMENT" +# source $(dirname "$(readlink -f "$0")")/variables.sh help() { - echo "Usage: $1 " + echo "Usage: $0 [environment] [options]" + echo "" + echo " environment Optional. Environment name to use (e.g. dev, prod)." + echo " If not specified, 'dev' will be used by default." + echo "" + echo "Options:" echo " -c : Clean capif services" echo " -v : Clean vault service" echo " -r : Clean register service" @@ -93,18 +107,18 @@ for FILE in "${FILES[@]}"; do fi done -# Path to the register config.yaml file -REGISTER_CONFIG_FILE="$SERVICES_DIR/register/config.yaml" -# Check if the backup config.yaml file exists before restoring -if [ -f "$REGISTER_CONFIG_FILE.bak" ]; then - git update-index --no-assume-unchanged "$REGISTER_CONFIG_FILE.bak" - mv "$REGISTER_CONFIG_FILE.bak" "$REGISTER_CONFIG_FILE" - git update-index --no-assume-unchanged "$REGISTER_CONFIG_FILE" -else - echo "Backup config file not found, skipping restore." -fi +# # Path to the register config.yaml file +# REGISTER_CONFIG_FILE="$SERVICES_DIR/register/config.yaml" +# # Check if the backup config.yaml file exists before restoring +# if [ -f "$REGISTER_CONFIG_FILE.bak" ]; then +# git update-index --no-assume-unchanged "$REGISTER_CONFIG_FILE.bak" +# mv "$REGISTER_CONFIG_FILE.bak" "$REGISTER_CONFIG_FILE" +# git update-index --no-assume-unchanged "$REGISTER_CONFIG_FILE" +# else +# echo "Backup config file not found, skipping restore." +# fi -docker network rm capif-network +docker network rm ${CAPIF_NETWORK_NAME} docker volume prune --all --force diff --git a/services/clean_capif_temporary_files.sh b/services/clean_capif_temporary_files.sh index 4becd8bfd896c5d6b9bb5e24cd4620abb3cd3328..222a7ca1f986fda56d0649163c03698f35e54bcc 100755 --- a/services/clean_capif_temporary_files.sh +++ b/services/clean_capif_temporary_files.sh @@ -1,7 +1,7 @@ #!/bin/bash help() { - echo "Usage: $1 " + echo "Usage: $0 " echo " -c : Clean capif services tmp files" echo " -m : Clean monitoring service tmp files" echo " -t : Clean robot-test service tmp files" diff --git a/services/clean_mock_server.sh b/services/clean_mock_server.sh index 31b654125ea6f24187d84a165a37b1515c6708ca..737bc3ef4d00f3d676a6dde5c9c8ef62c80f78b0 100755 --- a/services/clean_mock_server.sh +++ b/services/clean_mock_server.sh @@ -1,5 +1,14 @@ #!/bin/bash -source $(dirname "$(readlink -f "$0")")/variables.sh +# Capture the first parameter as a possible environment +ENVIRONMENT="dev" +if [[ "$1" != -* && -n "$1" ]]; then + ENVIRONMENT="$1" + shift +fi + +# Load variables for the selected environment +source "$(dirname "$0")/variables.sh" "$ENVIRONMENT" +# source $(dirname "$(readlink -f "$0")")/variables.sh # Directories variables setup (no modification needed) FILE="$SERVICES_DIR/docker-compose-mock-server.yml" diff --git a/services/create_users.sh b/services/create_users.sh index c740deb8c9e53c54353d515f9e81b3c847392a94..3401d6ffb0ccedf7f04cb6164c9048e3cfb1e811 100755 --- a/services/create_users.sh +++ b/services/create_users.sh @@ -1,5 +1,14 @@ #!/bin/bash -source $(dirname "$(readlink -f "$0")")/variables.sh +# Capture the first parameter as a possible environment +ENVIRONMENT="dev" +if [[ "$1" != -* && -n "$1" ]]; then + ENVIRONMENT="$1" + shift +fi + +# Load variables for the selected environment +source "$(dirname "$0")/variables.sh" "$ENVIRONMENT" +# source $(dirname "$(readlink -f "$0")")/variables.sh # User to create TOTAL_USERS=1 @@ -7,7 +16,12 @@ USERNAME_PREFIX= USER_PASSWORD= help() { - echo "Usage: $1 " + echo "Usage: $0 [environment] [options]" + echo "" + echo " environment Optional. Environment name to use (e.g. dev, prod)." + echo " If not specified, 'dev' will be used by default." + echo "" + echo "Options:" echo " -u : User prefix to use" echo " -p : Password to set for user" echo " -l : Local usage of script (default true)" diff --git a/services/docker-compose-capif.yml b/services/docker-compose-capif.yml index db54e2240493737a22fc69e1584f89cc14d1db71..bab7b16e81b5f5c620d23433543c61355ae7489c 100644 --- a/services/docker-compose-capif.yml +++ b/services/docker-compose-capif.yml @@ -1,9 +1,10 @@ services: redis: + container_name: ${REDIS_CONTAINER_NAME:-redis} image: "labs.etsi.org:5050/ocf/capif/redis:7.4.2-alpine" command: redis-server - ports: - - "6379:6379" + # ports: + # - "6379:6379" volumes: - ${SERVICES_DIR}/redis-data:/var/lib/redis - ${SERVICES_DIR}/redis.conf:/usr/local/etc/redis/redis.conf @@ -12,11 +13,11 @@ services: helper: + container_name: ${HELPER_CONTAINER_NAME:-helper} build: context: ${SERVICES_DIR}/helper expose: - "8080" - container_name: helper restart: unless-stopped volumes: - ${SERVICES_DIR}/helper/config.yaml:/usr/src/app/config.yaml @@ -27,19 +28,21 @@ services: - host.docker.internal:host-gateway - fluent-bit:host-gateway - otel-collector:host-gateway - - vault:host-gateway + - ${CAPIF_VAULT}:host-gateway + - ${CAPIF_INTERCONNECTION_HOSTNAME:-capifcore-b}:host-gateway environment: - CAPIF_HOSTNAME=${CAPIF_HOSTNAME} - - CONTAINER_NAME=helper + - CONTAINER_NAME=${HELPER_CONTAINER_NAME} - VAULT_HOSTNAME=${CAPIF_VAULT} - - VAULT_ACCESS_TOKEN=dev-only-token - - VAULT_PORT=8200 + - VAULT_ACCESS_TOKEN=${CAPIF_VAULT_TOKEN} + - VAULT_PORT=${CAPIF_VAULT_PORT} - LOG_LEVEL=${LOG_LEVEL} image: ${REGISTRY_BASE_URL}/helper:${OCF_VERSION} # depends_on: # - nginx access-control-policy: + container_name: ${ACCESS_CONTROL_POLICY_CONTAINER_NAME:-access-control-policy} build: context: ${SERVICES_DIR}/TS29222_CAPIF_Access_Control_Policy_API expose: @@ -52,7 +55,7 @@ services: - otel-collector:host-gateway environment: - CAPIF_HOSTNAME=${CAPIF_HOSTNAME} - - CONTAINER_NAME=access-control-policy + - CONTAINER_NAME=${ACCESS_CONTROL_POLICY_CONTAINER_NAME} - MONITORING=${MONITORING} - LOG_LEVEL=${LOG_LEVEL} restart: unless-stopped @@ -62,6 +65,7 @@ services: - nginx api-invoker-management: + container_name: ${API_INVOKER_MANAGEMENT_CONTAINER_NAME:-api-invoker-management} build: context: ${SERVICES_DIR}/TS29222_CAPIF_API_Invoker_Management_API expose: @@ -73,14 +77,14 @@ services: - host.docker.internal:host-gateway - fluent-bit:host-gateway - otel-collector:host-gateway - - vault:host-gateway + - ${CAPIF_VAULT}:host-gateway environment: - CAPIF_HOSTNAME=${CAPIF_HOSTNAME} - - CONTAINER_NAME=api-invoker-management + - CONTAINER_NAME=${API_INVOKER_MANAGEMENT_CONTAINER_NAME} - MONITORING=${MONITORING} - VAULT_HOSTNAME=${CAPIF_VAULT} - - VAULT_ACCESS_TOKEN=dev-only-token - - VAULT_PORT=8200 + - VAULT_ACCESS_TOKEN=${CAPIF_VAULT_TOKEN} + - VAULT_PORT=${CAPIF_VAULT_PORT} - LOG_LEVEL=${LOG_LEVEL} restart: unless-stopped image: ${REGISTRY_BASE_URL}/ocf-api-invoker-management-api:${OCF_VERSION} @@ -89,6 +93,7 @@ services: - nginx api-provider-management: + container_name: ${API_PROVIDER_MANAGEMENT_CONTAINER_NAME:-api-provider-management} build: context: ${SERVICES_DIR}/TS29222_CAPIF_API_Provider_Management_API expose: @@ -100,21 +105,22 @@ services: - host.docker.internal:host-gateway - fluent-bit:host-gateway - otel-collector:host-gateway - - vault:host-gateway + - ${CAPIF_VAULT}:host-gateway image: ${REGISTRY_BASE_URL}/ocf-api-provider-management-api:${OCF_VERSION} environment: - CAPIF_HOSTNAME=${CAPIF_HOSTNAME} - - CONTAINER_NAME=api-provider-management + - CONTAINER_NAME=${API_PROVIDER_MANAGEMENT_CONTAINER_NAME} - MONITORING=${MONITORING} - VAULT_HOSTNAME=${CAPIF_VAULT} - - VAULT_ACCESS_TOKEN=dev-only-token - - VAULT_PORT=8200 + - VAULT_ACCESS_TOKEN=${CAPIF_VAULT_TOKEN} + - VAULT_PORT=${CAPIF_VAULT_PORT} - LOG_LEVEL=${LOG_LEVEL} depends_on: - redis - nginx logs: + container_name: ${LOGS_CONTAINER_NAME:-logs} build: context: ${SERVICES_DIR}/TS29222_CAPIF_Auditing_API expose: @@ -129,13 +135,14 @@ services: image: ${REGISTRY_BASE_URL}/ocf-auditing-api:${OCF_VERSION} environment: - CAPIF_HOSTNAME=${CAPIF_HOSTNAME} - - CONTAINER_NAME=api-auditing + - CONTAINER_NAME=${LOGS_CONTAINER_NAME} - MONITORING=${MONITORING} - LOG_LEVEL=${LOG_LEVEL} depends_on: - mongo service-apis: + container_name: ${SERVICE_APIS_CONTAINER_NAME:-service-apis} build: context: ${SERVICES_DIR}/TS29222_CAPIF_Discover_Service_API expose: @@ -150,13 +157,14 @@ services: image: ${REGISTRY_BASE_URL}/ocf-discover-service-api:${OCF_VERSION} environment: - CAPIF_HOSTNAME=${CAPIF_HOSTNAME} - - CONTAINER_NAME=services-apis + - CONTAINER_NAME=${SERVICE_APIS_CONTAINER_NAME} - MONITORING=${MONITORING} - LOG_LEVEL=${LOG_LEVEL} depends_on: - mongo capif-events: + container_name: ${CAPIF_EVENTS_CONTAINER_NAME:-capif-events} build: context: ${SERVICES_DIR}/TS29222_CAPIF_Events_API expose: @@ -166,7 +174,7 @@ services: image: ${REGISTRY_BASE_URL}/ocf-events-api:${OCF_VERSION} environment: - CAPIF_HOSTNAME=${CAPIF_HOSTNAME} - - CONTAINER_NAME=api-events + - CONTAINER_NAME=${CAPIF_EVENTS_CONTAINER_NAME} - MONITORING=${MONITORING} - LOG_LEVEL=${LOG_LEVEL} - TIMEOUT=10 @@ -179,6 +187,7 @@ services: - mongo celery_worker: + container_name: ${CELERY_WORKER_CONTAINER_NAME:-celery_worker} build: context: ${SERVICES_DIR}/celery environment: @@ -191,6 +200,7 @@ services: - mongo celery_beat: + container_name: ${CELERY_BEAT_CONTAINER_NAME:-celery_beat} build: context: ${SERVICES_DIR}/celery environment: @@ -202,6 +212,7 @@ services: - redis - mongo api-invocation-logs: + container_name: ${API_INVOCATION_LOGS_CONTAINER_NAME:-api-invocation-logs} build: context: ${SERVICES_DIR}/TS29222_CAPIF_Logging_API_Invocation_API expose: @@ -216,13 +227,14 @@ services: - otel-collector:host-gateway environment: - CAPIF_HOSTNAME=${CAPIF_HOSTNAME} - - CONTAINER_NAME=api-invocation-logs + - CONTAINER_NAME=${API_INVOCATION_LOGS_CONTAINER_NAME} - MONITORING=${MONITORING} - LOG_LEVEL=${LOG_LEVEL} depends_on: - mongo published-apis: + container_name: ${PUBLISHED_APIS_CONTAINER_NAME:-published-apis} build: context: ${SERVICES_DIR}/TS29222_CAPIF_Publish_Service_API expose: @@ -235,20 +247,21 @@ services: - host.docker.internal:host-gateway - fluent-bit:host-gateway - otel-collector:host-gateway - - vault:host-gateway + - ${CAPIF_VAULT}:host-gateway environment: - CAPIF_HOSTNAME=${CAPIF_HOSTNAME} - - CONTAINER_NAME=api-publish-apis + - CONTAINER_NAME=${PUBLISHED_APIS_CONTAINER_NAME} - MONITORING=${MONITORING} - VAULT_HOSTNAME=${CAPIF_VAULT} - - VAULT_ACCESS_TOKEN=dev-only-token - - VAULT_PORT=8200 + - VAULT_ACCESS_TOKEN=${CAPIF_VAULT_TOKEN} + - VAULT_PORT=${CAPIF_VAULT_PORT} - LOG_LEVEL=${LOG_LEVEL} depends_on: - redis - mongo capif-routing-info: + container_name: ${CAPIF_ROUTING_INFO_CONTAINER_NAME:-capif-routing-info} build: context: ${SERVICES_DIR}/TS29222_CAPIF_Routing_Info_API expose: @@ -256,6 +269,7 @@ services: image: ${REGISTRY_BASE_URL}/ocf-routing-info-api:${OCF_VERSION} capif-security: + container_name: ${CAPIF_SECURITY_CONTAINER_NAME:-capif-security} build: context: ${SERVICES_DIR}/TS29222_CAPIF_Security_API expose: @@ -267,23 +281,24 @@ services: image: ${REGISTRY_BASE_URL}/ocf-security-api:${OCF_VERSION} environment: - CAPIF_HOSTNAME=${CAPIF_HOSTNAME} - - CONTAINER_NAME=api-security + - CONTAINER_NAME=${CAPIF_SECURITY_CONTAINER_NAME} - MONITORING=${MONITORING} - VAULT_HOSTNAME=${CAPIF_VAULT} - - VAULT_ACCESS_TOKEN=dev-only-token - - VAULT_PORT=8200 + - VAULT_ACCESS_TOKEN=${CAPIF_VAULT_TOKEN} + - VAULT_PORT=${CAPIF_VAULT_PORT} - LOG_LEVEL=${LOG_LEVEL} - TIMEOUT=10 extra_hosts: - host.docker.internal:host-gateway - fluent-bit:host-gateway - otel-collector:host-gateway - - vault:host-gateway + - ${CAPIF_VAULT}:host-gateway depends_on: - redis - nginx mongo: + container_name: ${MONGO_CCF_CONTAINER_NAME:-mongo} image: labs.etsi.org:5050/ocf/capif/mongo:6.0.2 logging: driver: 'none' @@ -293,12 +308,13 @@ services: MONGO_INITDB_ROOT_PASSWORD: example mongo-express: + container_name: ${MONGO_EXPRESS_CCF_CONTAINER_NAME:-mongo-express} image: labs.etsi.org:5050/ocf/capif/mongo-express:1.0.0-alpha.4 logging: driver: 'none' restart: unless-stopped ports: - - 8082:8081 + - ${MONGO_EXPRESS_CCF_PORT:-8081}:8081 environment: ME_CONFIG_MONGODB_ENABLE_ADMIN: true ME_CONFIG_BASICAUTH_USERNAME: admin @@ -310,17 +326,18 @@ services: - mongo nginx: + container_name: ${NGINX_CONTAINER_NAME:-nginx} build: context: ${SERVICES_DIR}/nginx ports: - - "8080:8080" - - "443:443" + - ${CAPIF_HTTP_PORT:-8080}:8080 + - ${CAPIF_HTTPS_PORT:-443}:443 image: labs.etsi.org:5050/ocf/capif/nginx-ocf-patched:1.27.1 environment: - CAPIF_HOSTNAME=${CAPIF_HOSTNAME} - VAULT_HOSTNAME=${CAPIF_VAULT} - - VAULT_ACCESS_TOKEN=dev-only-token - - VAULT_PORT=8200 + - VAULT_ACCESS_TOKEN=${CAPIF_VAULT_TOKEN} + - VAULT_PORT=${CAPIF_VAULT_PORT} - LOG_LEVEL=${LOG_LEVEL} hostname: ${CAPIF_HOSTNAME} volumes: @@ -328,7 +345,7 @@ services: - ${SERVICES_DIR}/nginx/nginx_prepare.sh:/nginx_prepare.sh extra_hosts: - host.docker.internal:host-gateway - - vault:host-gateway + - ${CAPIF_VAULT}:host-gateway restart: unless-stopped depends_on: - redis @@ -340,5 +357,5 @@ services: networks: default: - name: capif-network + name: ${CAPIF_NETWORK_NAME:-capif-network} external: true diff --git a/services/docker-compose-mock-server.yml b/services/docker-compose-mock-server.yml index 851f9f28a7b35c2200a5eb480409c9d9dda2a4e7..6f7c12f33bc681c10741366780d7f8c3750dba6e 100644 --- a/services/docker-compose-mock-server.yml +++ b/services/docker-compose-mock-server.yml @@ -1,21 +1,23 @@ services: mock-server: + container_name: ${MOCK_SERVER_CONTAINER_NAME:-mock-server} build: context: ${SERVICES_DIR}/mock_server ports: - - 9100:9100 + - ${MOCK_SERVER_EXTERNAL_PORT:-9100}:${MOCK_SERVER_INTERNAL_PORT:-9100} volumes: - ${SERVICES_DIR}/mock_server:/usr/src/app extra_hosts: - host.docker.internal:host-gateway environment: - DEBUG_MODE=True + - PORT=${MOCK_SERVER_INTERNAL_PORT:-9100} restart: unless-stopped image: ${REGISTRY_BASE_URL}/mock-server:${OCF_VERSION} networks: default: - name: capif-network + name: ${CAPIF_NETWORK_NAME:-capif-network} external: true diff --git a/services/docker-compose-register.yml b/services/docker-compose-register.yml index 5f12ed8c5764400b8d344ca951c5c65f2170f37c..9a7c4f9b098c4d69f15546aea5cd1965386c13be 100644 --- a/services/docker-compose-register.yml +++ b/services/docker-compose-register.yml @@ -1,31 +1,32 @@ services: register: - hostname: ${CAPIF_REGISTER} - container_name: ${CAPIF_REGISTER} + hostname: ${CAPIF_REGISTER:-register} + container_name: ${REGISTER_CONTAINER_NAME:-register} build: context: ${SERVICES_DIR}/register ports: - - 8084:8080 + - ${CAPIF_REGISTER_PORT:-8084}:8080 volumes: - ${SERVICES_DIR}/register/config.yaml:/usr/src/app/config.yaml environment: - CAPIF_PRIV_KEY=${CAPIF_PRIV_KEY} - VAULT_HOSTNAME=${CAPIF_VAULT} - - VAULT_ACCESS_TOKEN=dev-only-token - - VAULT_PORT=8200 + - VAULT_ACCESS_TOKEN=${CAPIF_VAULT_TOKEN} + - VAULT_PORT=${CAPIF_VAULT_PORT} - LOG_LEVEL=${LOG_LEVEL} - TIMEOUT=10 - CAPIF_HOSTNAME=${CAPIF_HOSTNAME} - - REGISTER_HOSTNAME=${CAPIF_REGISTER} + - REGISTER_HOSTNAME=${CAPIF_REGISTER:-register} extra_hosts: - host.docker.internal:host-gateway - - vault:host-gateway + - ${CAPIF_VAULT}:host-gateway restart: unless-stopped image: ${REGISTRY_BASE_URL}/register:${OCF_VERSION} depends_on: - mongo_register mongo_register: + container_name: ${REGISTER_MONGO_CONTAINER_NAME:-mongo_register} image: labs.etsi.org:5050/ocf/capif/mongo:6.0.2 logging: driver: 'none' @@ -35,25 +36,26 @@ services: MONGO_INITDB_ROOT_PASSWORD: example mongo_register_express: + container_name: ${REGISTER_MONGO_EXPRESS_CONTAINER_NAME:-mongo_register_express} image: labs.etsi.org:5050/ocf/capif/mongo-express:1.0.0-alpha.4 logging: driver: 'none' restart: unless-stopped ports: - - 8083:8081 + - ${MONGO_REGISTER_EXPRESS_PORT:-8083}:8081 environment: ME_CONFIG_MONGODB_ENABLE_ADMIN: true ME_CONFIG_BASICAUTH_USERNAME: admin ME_CONFIG_BASICAUTH_PASSWORD: admin ME_CONFIG_MONGODB_ADMINUSERNAME: root ME_CONFIG_MONGODB_ADMINPASSWORD: example - ME_CONFIG_MONGODB_URL: mongodb://root:example@mongo_register:27017/ + ME_CONFIG_MONGODB_URL: mongodb://root:example@${REGISTER_MONGO_CONTAINER_NAME:-mongo_register}:27017/ depends_on: - mongo_register networks: default: - name: capif-network + name: ${CAPIF_NETWORK_NAME:-capif-network} external: true diff --git a/services/docker-compose-vault.yml b/services/docker-compose-vault.yml index f14391228d47ac8745c492228fac71cb1e6f17af..07960975c3cd6c426630b06932d88e5045532ef7 100644 --- a/services/docker-compose-vault.yml +++ b/services/docker-compose-vault.yml @@ -1,11 +1,12 @@ services: vault: + container_name: ${VAULT_CONTAINER_NAME:-vault} image: ${REGISTRY_BASE_URL}/vault:${OCF_VERSION} build: context: ${SERVICES_DIR}/vault restart: unless-stopped ports: - - 8200:8200 + - ${CAPIF_VAULT_PORT:-8200}:8200 cap_add: - IPC_LOCK environment: diff --git a/services/envs/dev1.env b/services/envs/dev1.env new file mode 100644 index 0000000000000000000000000000000000000000..adb5836e7b026f9e568a4887e6d0ac4910e49d77 --- /dev/null +++ b/services/envs/dev1.env @@ -0,0 +1,46 @@ +export CAPIF_NETWORK_NAME=capif-network-a +export COMPOSE_PROJECT_NAME=ocf_a + +# Capif vault configuration +export CAPIF_VAULT_PORT=8200 +export CAPIF_VAULT=vault-a + +# Capif hostname +export CAPIF_HOSTNAME=capifcore-a +export CAPIF_HTTP_PORT=8080 +export CAPIF_HTTPS_PORT=443 +export MONGO_EXPRESS_CCF_PORT=8081 + +# Mock server variables +export MOCK_SERVER_INTERNAL_HOSTNAME=mock-server-a +export MOCK_SERVER_EXTERNAL_HOSTNAME=mock-server-a +export MOCK_SERVER_INTERNAL_PORT=9100 +export MOCK_SERVER_EXTERNAL_PORT=9100 +# Register hostname and port +export CAPIF_REGISTER=register-a +export CAPIF_REGISTER_PORT=8084 +export MONGO_REGISTER_EXPRESS_PORT=8083 + +# Services docker names +export VAULT_CONTAINER_NAME=vault-a +export REGISTER_CONTAINER_NAME=register-a +export REGISTER_MONGO_CONTAINER_NAME=mongo-register-a +export REGISTER_MONGO_EXPRESS_CONTAINER_NAME=mongo-register-express-a +export REDIS_CONTAINER_NAME=redis-a +export HELPER_CONTAINER_NAME=helper-a +export ACCESS_CONTROL_POLICY_CONTAINER_NAME=access-control-policy-a +export API_INVOKER_MANAGEMENT_CONTAINER_NAME=api-invoker-management-a +export API_PROVIDER_MANAGEMENT_CONTAINER_NAME=api-provider-management-a +export LOGS_CONTAINER_NAME=logs-a +export SERVICE_APIS_CONTAINER_NAME=service-apis-a +export API_INVOCATION_LOGS_CONTAINER_NAME=api-invocation-logs-a +export CAPIF_EVENTS_CONTAINER_NAME=capif-events-a +export CELERY_WORKER_CONTAINER_NAME=celery-worker-a +export CELERY_BEAT_CONTAINER_NAME=celery-beat-a +export PUBLISHED_APIS_CONTAINER_NAME=published-apis-a +export CAPIF_ROUTING_INFO_CONTAINER_NAME=capif-routing-info-a +export CAPIF_SECURITY_CONTAINER_NAME=capif-security-a +export MONGO_CCF_CONTAINER_NAME=mongo-a +export MONGO_EXPRESS_CCF_CONTAINER_NAME=mongo-express-a +export NGINX_CONTAINER_NAME=nginx-a +export MOCK_SERVER_CONTAINER_NAME=mock-server-a \ No newline at end of file diff --git a/services/envs/dev2.env b/services/envs/dev2.env new file mode 100644 index 0000000000000000000000000000000000000000..e80b476b566d952ed41cddd88272c2084a237464 --- /dev/null +++ b/services/envs/dev2.env @@ -0,0 +1,48 @@ +export CAPIF_NETWORK_NAME=capif-network-b +export COMPOSE_PROJECT_NAME=ocf_b + +# Capif vault configuration +export DEPLOY_VAULT=false +export CAPIF_VAULT_PORT=8200 +export CAPIF_VAULT=vault-a + +# Capif hostname +export CAPIF_HOSTNAME=capifcore-b +export CAPIF_HTTP_PORT=8180 +export CAPIF_HTTPS_PORT=1443 +export MONGO_EXPRESS_CCF_PORT=8181 + +# Mock server variables +export MOCK_SERVER_INTERNAL_HOSTNAME=mock-server-b +export MOCK_SERVER_EXTERNAL_HOSTNAME=mock-server-b +export MOCK_SERVER_INTERNAL_PORT=9200 +export MOCK_SERVER_EXTERNAL_PORT=9200 + +# Register hostname and port +export CAPIF_REGISTER=register-b +export CAPIF_REGISTER_PORT=8184 +export MONGO_REGISTER_EXPRESS_PORT=8183 + +# Services docker names +export VAULT_CONTAINER_NAME=vault-b +export REGISTER_CONTAINER_NAME=register-b +export REGISTER_MONGO_CONTAINER_NAME=mongo-register-b +export REGISTER_MONGO_EXPRESS_CONTAINER_NAME=mongo-register-express-b +export REDIS_CONTAINER_NAME=redis-b +export HELPER_CONTAINER_NAME=helper-b +export ACCESS_CONTROL_POLICY_CONTAINER_NAME=access-control-policy-b +export API_INVOKER_MANAGEMENT_CONTAINER_NAME=api-invoker-management-b +export API_PROVIDER_MANAGEMENT_CONTAINER_NAME=api-provider-management-b +export LOGS_CONTAINER_NAME=logs-b +export SERVICE_APIS_CONTAINER_NAME=service-apis-b +export API_INVOCATION_LOGS_CONTAINER_NAME=api-invocation-logs-b +export CAPIF_EVENTS_CONTAINER_NAME=capif-events-b +export CELERY_WORKER_CONTAINER_NAME=celery-worker-b +export CELERY_BEAT_CONTAINER_NAME=celery-beat-b +export PUBLISHED_APIS_CONTAINER_NAME=published-apis-b +export CAPIF_ROUTING_INFO_CONTAINER_NAME=capif-routing-info-b +export CAPIF_SECURITY_CONTAINER_NAME=capif-security-b +export MONGO_CCF_CONTAINER_NAME=mongo-b +export MONGO_EXPRESS_CCF_CONTAINER_NAME=mongo-express-b +export NGINX_CONTAINER_NAME=nginx-b +export MOCK_SERVER_CONTAINER_NAME=mock-server-b \ No newline at end of file diff --git a/services/helper/config.yaml b/services/helper/config.yaml index 9452d8db7eb20a81c81bc8dd6213d495ae843e5a..eb90f756a9bd10e26967147099d4a03b02a1f940 100644 --- a/services/helper/config.yaml +++ b/services/helper/config.yaml @@ -12,14 +12,12 @@ mongo: host: mongo port: 27017 - ca_factory: url: !ENV ${VAULT_HOSTNAME} - port: 8200 - token: dev-only-token + port: !ENV ${VAULT_PORT} + token: !ENV ${VAULT_ACCESS_TOKEN} verify: False - capif_configuration: config_description: Default CAPIF Configuration config_name: default @@ -48,7 +46,6 @@ package_paths: interconnection_api: path: /interconnection openapi_file: interconnection/openapi/openapi.yaml - visibility_control: path: /visibility-control openapi_file: visibility_control/openapi/openapi.yaml diff --git a/services/helper/helper_service/services/interconnection/core/capifdomaindetails.py b/services/helper/helper_service/services/interconnection/core/capifdomaindetails.py index 6292ba106794ad9636ab9f85d23c8781537b4b39..08263f50c627342e6e3f5605227865dede38ed11 100644 --- a/services/helper/helper_service/services/interconnection/core/capifdomaindetails.py +++ b/services/helper/helper_service/services/interconnection/core/capifdomaindetails.py @@ -4,7 +4,7 @@ from datetime import datetime import requests import json -from flask import current_app +from flask import current_app, Response # from pymongo import ReturnDocument from db.db import get_mongo @@ -71,16 +71,33 @@ class CapifDomainOperations(Resource): 'Content-Type': 'application/json' } - response = requests.request("POST", url, headers=headers, data=payload, - cert=('certs/server.crt', 'certs/server.key'), - verify='certs/ca.crt') + try: + response = requests.request("POST", url, headers=headers, data=payload, + cert=('certs/server.crt', 'certs/server.key'), + verify='certs/ca.crt') + except requests.exceptions.RequestException as exc: + detail = "Error calling interconnection endpoint: {}".format(str(exc)) + current_app.logger.error(detail) + return internal_server_error(detail=detail, cause="REQUEST_FAILURE") + + try: + inter_ccf = response.json() + except ValueError: + inter_ccf = response.text - inter_ccf = response.json() current_app.logger.debug(inter_ccf) - if response.status_code == 201 or response.status_code == 200: - interconnected_col.insert_one(inter_ccf) + if response.status_code in (200, 201): + if isinstance(inter_ccf, dict): + interconnected_col.insert_one(inter_ccf) + ccfinstancedetails_new = CcfInstanceDetails().from_dict(dict_to_camel_case(inter_ccf)) + return make_response(object=ccfinstancedetails_new, status=response.status_code) + + # If upstream returns a non-JSON success body, propagate it as-is. + return Response(response.text, status=response.status_code, mimetype="application/json") + + remote_mimetype = response.headers.get("Content-Type", "application/problem+json").split(";")[0] + if isinstance(inter_ccf, (dict, list)): + return Response(json.dumps(inter_ccf), status=response.status_code, mimetype=remote_mimetype) - ccfinstancedetails_new = CcfInstanceDetails().from_dict(dict_to_camel_case(inter_ccf)) - res = make_response(object=ccfinstancedetails_new, status=response.status_code) - return res + return Response(response.text, status=response.status_code, mimetype=remote_mimetype) diff --git a/services/helper/helper_service/services/interconnection/openapi/CCF_Interconnection.postman_collection.json b/services/helper/helper_service/services/interconnection/openapi/CCF_Interconnection.postman_collection.json new file mode 100644 index 0000000000000000000000000000000000000000..4845c9b9bc36189ab7fedee021f9fb07f30c5417 --- /dev/null +++ b/services/helper/helper_service/services/interconnection/openapi/CCF_Interconnection.postman_collection.json @@ -0,0 +1,298 @@ +{ + "info": { + "_postman_id": "9f3f0f74-53c2-4fdc-b6b4-6c895d2486b9", + "name": "CCF Interconnection API", + "description": "Postman collection for CCF Interconnection API endpoints.", + "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json" + }, + "item": [ + { + "name": "Create Interconnection - POST /connect", + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"caRoot\": \"-----BEGIN CERTIFICATE-----...-----END CERTIFICATE-----\",\n \"publicKey\": \"-----BEGIN PUBLIC KEY-----...-----END PUBLIC KEY-----\",\n \"ccfId\": \"ccf-001\",\n \"dstProvDom\": \"provider-b.example.com\"\n}" + }, + "url": { + "raw": "{{baseUrl}}/connect", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "connect" + ] + }, + "description": "Create a new interconnection between CCFs." + }, + "response": [ + { + "name": "201 Interconnection succeeded", + "originalRequest": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"caRoot\": \"-----BEGIN CERTIFICATE-----...-----END CERTIFICATE-----\",\n \"publicKey\": \"-----BEGIN PUBLIC KEY-----...-----END PUBLIC KEY-----\",\n \"ccfId\": \"ccf-001\",\n \"dstProvDom\": \"provider-b.example.com\"\n}" + }, + "url": { + "raw": "{{baseUrl}}/connect", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "connect" + ] + } + }, + "status": "Created", + "code": 201, + "_postman_previewlanguage": "json", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + } + ], + "body": "{\n \"caRoot\": \"-----BEGIN CERTIFICATE-----...-----END CERTIFICATE-----\",\n \"publicKey\": \"-----BEGIN PUBLIC KEY-----...-----END PUBLIC KEY-----\",\n \"ccfId\": \"ccf-001\",\n \"dstProvDom\": \"provider-b.example.com\"\n}" + }, + { + "name": "400 Bad Request", + "originalRequest": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + } + ], + "url": { + "raw": "{{baseUrl}}/connect", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "connect" + ] + } + }, + "status": "Bad Request", + "code": 400, + "_postman_previewlanguage": "json", + "header": [ + { + "key": "Content-Type", + "value": "application/problem+json" + } + ], + "body": "{\n \"type\": \"https://example.com/problems/invalid-request\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Request body contains invalid or missing parameters.\",\n \"instance\": \"/interconnection/connect\",\n \"cause\": \"MANDATORY_IE_MISSING\",\n \"invalidParams\": [\n {\n \"param\": \"/ccfId\",\n \"reason\": \"is required\"\n },\n {\n \"param\": \"/publicKey\",\n \"reason\": \"must be a valid PEM public key\"\n }\n ],\n \"supportedFeatures\": \"1F\"\n}" + }, + { + "name": "401 Unauthorized", + "originalRequest": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + } + ], + "url": { + "raw": "{{baseUrl}}/connect", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "connect" + ] + } + }, + "status": "Unauthorized", + "code": 401, + "_postman_previewlanguage": "json", + "header": [ + { + "key": "Content-Type", + "value": "application/problem+json" + } + ], + "body": "{\n \"type\": \"https://example.com/problems/unauthorized\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Missing or invalid authentication credentials.\",\n \"instance\": \"/interconnection/connect\",\n \"cause\": \"INVALID_TOKEN\"\n}" + }, + { + "name": "403 Forbidden", + "originalRequest": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + } + ], + "url": { + "raw": "{{baseUrl}}/connect", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "connect" + ] + } + }, + "status": "Forbidden", + "code": 403, + "_postman_previewlanguage": "json", + "header": [ + { + "key": "Content-Type", + "value": "application/problem+json" + } + ], + "body": "{\n \"type\": \"https://example.com/problems/forbidden\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"The client is not allowed to perform this operation.\",\n \"instance\": \"/interconnection/connect\",\n \"cause\": \"INSUFFICIENT_SCOPE\"\n}" + }, + { + "name": "404 Not Found", + "originalRequest": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + } + ], + "url": { + "raw": "{{baseUrl}}/connect", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "connect" + ] + } + }, + "status": "Not Found", + "code": 404, + "_postman_previewlanguage": "json", + "header": [ + { + "key": "Content-Type", + "value": "application/problem+json" + } + ], + "body": "{\n \"type\": \"https://example.com/problems/not-found\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"The target resource was not found.\",\n \"instance\": \"/interconnection/connect\",\n \"cause\": \"RESOURCE_NOT_FOUND\"\n}" + } + ] + }, + { + "name": "Interconnect Request - POST /interconnect", + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"dstProvDom\": \"provider-b.example.com\"\n}" + }, + "url": { + "raw": "{{baseUrl}}/interconnect", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "interconnect" + ] + }, + "description": "Send a new interconnection request to another CAPIF domain." + }, + "response": [ + { + "name": "201 Interconnection request succeeded", + "originalRequest": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"dstProvDom\": \"provider-b.example.com\"\n}" + }, + "url": { + "raw": "{{baseUrl}}/interconnect", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "interconnect" + ] + } + }, + "status": "Created", + "code": 201, + "_postman_previewlanguage": "json", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + } + ], + "body": "{\n \"dstProvDom\": \"provider-b.example.com\"\n}" + }, + { + "name": "400 Bad Request", + "originalRequest": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + } + ], + "url": { + "raw": "{{baseUrl}}/interconnect", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "interconnect" + ] + } + }, + "status": "Bad Request", + "code": 400, + "_postman_previewlanguage": "json", + "header": [ + { + "key": "Content-Type", + "value": "application/problem+json" + } + ], + "body": "{\n \"type\": \"https://example.com/problems/invalid-request\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"dstProvDom is missing or invalid.\",\n \"instance\": \"/interconnection/interconnect\",\n \"cause\": \"MANDATORY_IE_MISSING\",\n \"invalidParams\": [\n {\n \"param\": \"/dstProvDom\",\n \"reason\": \"is required\"\n }\n ]\n}" + } + ] + } + ], + "variable": [ + { + "key": "baseUrl", + "value": "http://localhost:8080/interconnection", + "type": "string" + } + ] +} diff --git a/services/nginx/nginx_prepare.sh b/services/nginx/nginx_prepare.sh index 20192666bffff1bd5a0d3b67366cfa387a49c713..0d465828123d3404a8aa73859ac5f97b01bc7a2f 100644 --- a/services/nginx/nginx_prepare.sh +++ b/services/nginx/nginx_prepare.sh @@ -81,11 +81,11 @@ generate_server_key_and_sign() { echo "[STEP 3] Server certificate not found" echo "[STEP 3] Generating CSR for CAPIF service" - echo "[INFO] Common Name (CN): CCF$CAPIF_HOSTNAME" + echo "[INFO] Common Name (CN): $CCF_ID" # Generate CSR using the previously generated server.key openssl req -new -key $CERTS_FOLDER/server.key \ - -subj "/CN=CCF$CAPIF_HOSTNAME" \ + -subj "/CN=$CCF_ID" \ -addext "subjectAltName=DNS:$CAPIF_HOSTNAME" \ -out $CERTS_FOLDER/server.csr @@ -106,7 +106,7 @@ generate_server_key_and_sign() { # POST /v1/pki_int/sign/my-ca intermediate's endpoint to sign the CSR SIGN_RESPONSE=$(curl -s -X POST \ -H "X-Vault-Token: $VAULT_TOKEN" \ - -d "{\"csr\":\"$CSR_CONTENT\",\"format\":\"pem_bundle\",\"common_name\":\"CCF$CAPIF_HOSTNAME\",\"alt_names\":\"$CAPIF_HOSTNAME\"}" \ + -d "{\"csr\":\"$CSR_CONTENT\",\"format\":\"pem_bundle\",\"common_name\":\"$CCF_ID\",\"alt_names\":\"$CAPIF_HOSTNAME\"}" \ "$VAULT_ADDR/v1/pki_int/sign/my-ca") # SIGN_RESPONSE; return a PEM bundle format with the signed certificate + intermediate certificate chain (but without the root). diff --git a/services/remove_users.sh b/services/remove_users.sh index 01cceb4f15fd6f9d42fa963261f941a6948115a1..27cee230253b9cd9421d45728f12479d0f43437e 100755 --- a/services/remove_users.sh +++ b/services/remove_users.sh @@ -1,11 +1,25 @@ #!/bin/bash -source $(dirname "$(readlink -f "$0")")/variables.sh +# Capture the first parameter as a possible environment +ENVIRONMENT="dev" +if [[ "$1" != -* && -n "$1" ]]; then + ENVIRONMENT="$1" + shift +fi + +# Load variables for the selected environment +source "$(dirname "$0")/variables.sh" "$ENVIRONMENT" +# source $(dirname "$(readlink -f "$0")")/variables.sh # User to remove USERNAME_PREFIX= help() { - echo "Usage: $1 " + echo "Usage: $0 [environment] [options]" + echo "" + echo " environment Optional. Environment name to use (e.g. dev, prod)." + echo " If not specified, 'dev' will be used by default." + echo "" + echo "Options:" echo " -u : User prefix to use" echo " -h : show this help" exit 1 diff --git a/services/run.sh b/services/run.sh index a0ca8ae81d9a675567c858b66f8cf2b284b5c0f8..a9c97980517eae4915f2ccfb186d79bf045d942d 100755 --- a/services/run.sh +++ b/services/run.sh @@ -1,8 +1,23 @@ #!/bin/bash -source $(dirname "$(readlink -f "$0")")/variables.sh + +# Capture the first parameter as a possible environment +ENVIRONMENT="dev" +if [[ "$1" != -* && -n "$1" ]]; then + ENVIRONMENT="$1" + shift +fi + +# Load variables for the selected environment +source "$(dirname "$0")/variables.sh" "$ENVIRONMENT" +# source $(dirname "$(readlink -f "$0")")/variables.sh help() { - echo "Usage: $1 " + echo "Usage: $0 [environment] [options]" + echo "" + echo " environment Optional. Environment name to use (e.g. dev, prod)." + echo " If not specified, 'dev' will be used by default." + echo "" + echo "Options:" echo " -c : Setup different hostname for capif" echo " -a : Setup different hostname for vault" echo " -R : Setup different hostname for register service" @@ -111,10 +126,10 @@ if [ "$MONITORING_STATE" == "true" ] ; then fi fi -docker network create capif-network +docker network create ${CAPIF_NETWORK_NAME} ## Deploy Vault service -if [ "$CAPIF_VAULT" == "vault" ] ; then +if [ "$DEPLOY_VAULT" == "true" ] ; then REGISTRY_BASE_URL=$REGISTRY_BASE_URL OCF_VERSION=$OCF_VERSION CAPIF_HOSTNAME=$CAPIF_HOSTNAME docker compose -f "$SERVICES_DIR/docker-compose-vault.yml" up --detach $BUILD $CACHED_INFO status=$? @@ -137,19 +152,19 @@ else exit $status fi -# Path to the register config.yaml file -REGISTER_CONFIG_FILE="$SERVICES_DIR/register/config.yaml" -# Backup Original config.yaml file -cp $REGISTER_CONFIG_FILE $REGISTER_CONFIG_FILE.bak -# Mark the file as assume-unchanged -git update-index --assume-unchanged "$REGISTER_CONFIG_FILE" +# # Path to the register config.yaml file +# REGISTER_CONFIG_FILE="$SERVICES_DIR/register/config.yaml" +# # Backup Original config.yaml file +# cp $REGISTER_CONFIG_FILE $REGISTER_CONFIG_FILE.bak +# # Mark the file as assume-unchanged +# git update-index --assume-unchanged "$REGISTER_CONFIG_FILE" -# Edit Register Service URL within ccf in the config.yaml file -yq eval ".ccf.url = \"$CAPIF_HOSTNAME\"" -i "$REGISTER_CONFIG_FILE" -P +# # Edit Register Service URL within ccf in the config.yaml file +# yq eval ".ccf.url = \"$CAPIF_HOSTNAME\"" -i "$REGISTER_CONFIG_FILE" -P # Deploy Register service CAPIF_PRIV_KEY_BASE_64=$(echo "$(cat ${SERVICES_DIR}/nginx/certs/server.key)") -REGISTRY_BASE_URL=$REGISTRY_BASE_URL SERVICES_DIR=$SERVICES_DIR OCF_VERSION=$OCF_VERSION CAPIF_PRIV_KEY=$CAPIF_PRIV_KEY_BASE_64 LOG_LEVEL=$LOG_LEVEL CAPIF_REGISTER=$CAPIF_REGISTER docker compose -f "$SERVICES_DIR/docker-compose-register.yml" up --detach $BUILD $CACHED_INFO +REGISTRY_BASE_URL=$REGISTRY_BASE_URL SERVICES_DIR=$SERVICES_DIR OCF_VERSION=$OCF_VERSION CAPIF_PRIV_KEY=$CAPIF_PRIV_KEY_BASE_64 LOG_LEVEL=$LOG_LEVEL CAPIF_REGISTER=$CAPIF_REGISTER CAPIF_HOSTNAME=$CAPIF_HOSTNAME docker compose -f "$SERVICES_DIR/docker-compose-register.yml" up --detach $BUILD $CACHED_INFO status=$? if [ $status -eq 0 ]; then diff --git a/services/run_capif_tests.sh b/services/run_capif_tests.sh index 65c9a45f92783a7be913edc452ac8534b2d6280f..bc29df9a0762bcff84dfed478f49f2dc8c2f8b80 100755 --- a/services/run_capif_tests.sh +++ b/services/run_capif_tests.sh @@ -1,5 +1,14 @@ #!/bin/bash -source $(dirname "$(readlink -f "$0")")/variables.sh +# Capture the first parameter as a possible environment +ENVIRONMENT="dev" +if [[ "$1" != -* && -n "$1" ]]; then + ENVIRONMENT="$1" + shift +fi + +# Load variables for the selected environment +source "$(dirname "$0")/variables.sh" "$ENVIRONMENT" +# source $(dirname "$(readlink -f "$0")")/variables.sh PLATFORM=$(uname -m) if [ "x86_64" == "$PLATFORM" ]; then @@ -10,6 +19,7 @@ fi echo "CAPIF_HOSTNAME = $CAPIF_HOSTNAME" echo "CAPIF_REGISTER = $CAPIF_REGISTER" +echo "CAPIF_INTERCONNECTION_HOSTNAME = $CAPIF_INTERCONNECTION_HOSTNAME" echo "CAPIF_HTTP_PORT = $CAPIF_HTTP_PORT" echo "CAPIF_HTTPS_PORT = $CAPIF_HTTPS_PORT" echo "CAPIF_VAULT = $CAPIF_VAULT" @@ -18,6 +28,95 @@ echo "CAPIF_VAULT_TOKEN = $CAPIF_VAULT_TOKEN" echo "MOCK_SERVER_URL = $MOCK_SERVER_URL" echo "DOCKER_ROBOT_IMAGE = $DOCKER_ROBOT_IMAGE:$DOCKER_ROBOT_IMAGE_VERSION" +resolve_hostname() { + local hostname="$1" + + if command -v getent >/dev/null 2>&1; then + getent hosts "$hostname" >/dev/null 2>&1 + return $? + fi + + if command -v dscacheutil >/dev/null 2>&1; then + dscacheutil -q host -a name "$hostname" | grep -q "^ip_address:" + return $? + fi + + if command -v host >/dev/null 2>&1; then + host "$hostname" >/dev/null 2>&1 + return $? + fi + + if command -v nslookup >/dev/null 2>&1; then + nslookup "$hostname" >/dev/null 2>&1 + return $? + fi + + return 1 +} + +has_localhost_hosts_entry() { + local hostname="$1" + + awk -v host="$hostname" ' + $0 !~ /^[[:space:]]*#/ && $1 == "127.0.0.1" { + for (i = 2; i <= NF; i++) { + if ($i == host) { + found = 1 + } + } + } + END { exit(found ? 0 : 1) } + ' /etc/hosts +} + +validate_hostname_or_local_hosts() { + local hostnames=("$CAPIF_HOSTNAME" "$CAPIF_REGISTER" "$CAPIF_INTERCONNECTION_HOSTNAME") + local missing=() + + for hostname in "${hostnames[@]}"; do + if resolve_hostname "$hostname"; then + echo "Hostname '$hostname' resolves correctly." + continue + fi + + echo "Hostname '$hostname' does not resolve via DNS/system resolver." + if has_localhost_hosts_entry "$hostname"; then + echo "Found local mapping in /etc/hosts: 127.0.0.1 $hostname" + else + missing+=("$hostname") + fi + done + + if [[ ${#missing[@]} -gt 0 ]]; then + echo "Error: missing local host mappings for: ${missing[*]}" >&2 + echo "Please add entries in /etc/hosts at least as 127.0.0.1 for each hostname, for example:" >&2 + for hostname in "${missing[@]}"; do + echo " 127.0.0.1 $hostname" >&2 + done + exit 1 + fi +} + +validate_required_variables() { + local required_vars=("CAPIF_HOSTNAME" "CAPIF_REGISTER" "CAPIF_INTERCONNECTION_HOSTNAME") + local missing=() + + for var_name in "${required_vars[@]}"; do + if [[ -z "${!var_name:-}" ]]; then + missing+=("$var_name") + fi + done + + if [[ ${#missing[@]} -gt 0 ]]; then + echo "Error: required environment variables are not set: ${missing[*]}" >&2 + exit 1 + fi +} + +validate_required_variables + +validate_hostname_or_local_hosts + INPUT_OPTIONS=$@ # Check if input is provided if [ -z "$1" ]; then @@ -57,6 +156,8 @@ docker run $DOCKER_ROBOT_TTY_OPTIONS --rm --network="host" \ --add-host mock-server:host-gateway \ --add-host $CAPIF_HOSTNAME:host-gateway \ --add-host $CAPIF_REGISTER:host-gateway \ + --add-host $CAPIF_VAULT:host-gateway \ + --add-host $MOCK_SERVER_EXTERNAL_HOSTNAME:host-gateway \ -v $TEST_FOLDER:/opt/robot-tests/tests \ -v $RESULT_FOLDER:/opt/robot-tests/results ${DOCKER_ROBOT_IMAGE}:${DOCKER_ROBOT_IMAGE_VERSION} \ --variable CAPIF_HOSTNAME:$CAPIF_HOSTNAME \ diff --git a/services/run_interconnection_environment.sh b/services/run_interconnection_environment.sh new file mode 100755 index 0000000000000000000000000000000000000000..8c9cfaf5ea9677cccad5470df6be65a177c76471 --- /dev/null +++ b/services/run_interconnection_environment.sh @@ -0,0 +1,209 @@ +#!/bin/bash + +set -euo pipefail + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +ENVS_DIR="${SCRIPT_DIR}/envs" +RUN_SCRIPT="${SCRIPT_DIR}/run.sh" +VARIABLES_FILE="${SCRIPT_DIR}/variables.sh" + +show_help() { + echo "Usage: $0 " + echo + echo "Description:" + echo " Runs two environments and sets interconnection host variables" + echo " to the CAPIF_HOSTNAME from the opposite environment." + echo " CAPIF_HOSTNAME defaults to the value from variables.sh when missing." + echo " CAPIF_PORT defaults to CAPIF_HTTP_PORT (or variables.sh default)." + echo + echo "Arguments:" + echo " environment_1 Name of the first environment (file envs/.env)" + echo " environment_2 Name of the second environment (file envs/.env)" + echo + echo "Options:" + echo " -h, --help Show this help message and exit" + echo + echo "Example:" + echo " $0 dev pre" +} + +get_var_from_file() { + local file_path="$1" + local var_name="$2" + + awk -v var_name="${var_name}" -F= ' + $0 ~ "^[[:space:]]*(export[[:space:]]+)?" var_name "[[:space:]]*=" { + val = substr($0, index($0, "=") + 1) + gsub(/^[[:space:]]+|[[:space:]]+$/, "", val) + gsub(/^\"|\"$/, "", val) + gsub(/^\047|\047$/, "", val) + print val + exit + } + ' "${file_path}" +} + +get_env_var_with_default() { + local env_name="$1" + local var_name="$2" + local default_value="$3" + local env_file="${ENVS_DIR}/${env_name}.env" + local raw_value + + if [[ ! -f "${env_file}" ]]; then + echo "Error: environment file not found: ${env_file}" >&2 + exit 1 + fi + + raw_value="$(get_var_from_file "${env_file}" "${var_name}")" + if [[ -z "${raw_value}" ]]; then + echo "${default_value}" + else + echo "${raw_value}" + fi +} + +get_capif_port_with_default() { + local env_name="$1" + local default_port="$2" + local port_value + + port_value="$(get_env_var_with_default "${env_name}" "CAPIF_PORT" "")" + if [[ -z "${port_value}" ]]; then + port_value="$(get_env_var_with_default "${env_name}" "CAPIF_HTTP_PORT" "${default_port}")" + fi + + echo "${port_value}" +} + +wait_for_project_containers() { + local compose_project="$1" + local timeout_seconds="$2" + local interval_seconds="$3" + local start_ts elapsed ids id state health all_ready + + start_ts="$(date +%s)" + echo "Waiting for containers in compose project '${compose_project}' to be running/healthy..." + + while true; do + ids="$(docker ps -a --filter "label=com.docker.compose.project=${compose_project}" --format '{{.ID}}')" + all_ready=true + + if [[ -z "${ids}" ]]; then + all_ready=false + else + for id in ${ids}; do + state="$(docker inspect -f '{{.State.Status}}' "${id}" 2>/dev/null || true)" + health="$(docker inspect -f '{{if .State.Health}}{{.State.Health.Status}}{{else}}none{{end}}' "${id}" 2>/dev/null || true)" + + if [[ "${state}" != "running" ]]; then + all_ready=false + break + fi + + if [[ "${health}" != "none" && "${health}" != "healthy" ]]; then + all_ready=false + break + fi + done + fi + + if [[ "${all_ready}" == "true" ]]; then + echo "All containers for '${compose_project}' are ready." + return 0 + fi + + elapsed="$(( $(date +%s) - start_ts ))" + if (( elapsed >= timeout_seconds )); then + echo "Error: timeout waiting for containers in project '${compose_project}' after ${timeout_seconds}s." >&2 + docker ps -a --filter "label=com.docker.compose.project=${compose_project}" --format 'table {{.Names}}\t{{.Status}}' >&2 || true + return 1 + fi + + sleep "${interval_seconds}" + done +} + +if [[ ! -f "${VARIABLES_FILE}" ]]; then + echo "Error: variables file not found: ${VARIABLES_FILE}" >&2 + exit 1 +fi + +DEFAULT_CAPIF_HOSTNAME="$(get_var_from_file "${VARIABLES_FILE}" "CAPIF_HOSTNAME")" +DEFAULT_CAPIF_PORT="$(get_var_from_file "${VARIABLES_FILE}" "CAPIF_PORT")" +DEFAULT_COMPOSE_PROJECT_NAME="$(get_var_from_file "${VARIABLES_FILE}" "COMPOSE_PROJECT_NAME")" +if [[ -z "${DEFAULT_CAPIF_PORT}" ]]; then + DEFAULT_CAPIF_PORT="$(get_var_from_file "${VARIABLES_FILE}" "CAPIF_HTTP_PORT")" +fi + +if [[ -z "${DEFAULT_CAPIF_HOSTNAME}" ]]; then + echo "Error: CAPIF_HOSTNAME default not found in ${VARIABLES_FILE}" >&2 + exit 1 +fi + +if [[ -z "${DEFAULT_CAPIF_PORT}" ]]; then + echo "Error: CAPIF_PORT/CAPIF_HTTP_PORT default not found in ${VARIABLES_FILE}" >&2 + exit 1 +fi + +if [[ -z "${DEFAULT_COMPOSE_PROJECT_NAME}" ]]; then + echo "Error: COMPOSE_PROJECT_NAME default not found in ${VARIABLES_FILE}" >&2 + exit 1 +fi + +if [[ "${1:-}" == "-h" || "${1:-}" == "--help" ]]; then + show_help + exit 0 +fi + +if [[ $# -ne 2 ]]; then + echo "Error: you must provide exactly 2 environments." >&2 + echo >&2 + show_help >&2 + exit 1 +fi + +ENVIRONMENT_1="$1" +ENVIRONMENT_2="$2" + +if [[ ! -x "${RUN_SCRIPT}" ]]; then + echo "Error: run script not found or not executable: ${RUN_SCRIPT}" >&2 + exit 1 +fi + +CAPIF_HOSTNAME_1="$(get_env_var_with_default "${ENVIRONMENT_1}" "CAPIF_HOSTNAME" "${DEFAULT_CAPIF_HOSTNAME}")" +CAPIF_HOSTNAME_2="$(get_env_var_with_default "${ENVIRONMENT_2}" "CAPIF_HOSTNAME" "${DEFAULT_CAPIF_HOSTNAME}")" +CAPIF_PORT_1="$(get_capif_port_with_default "${ENVIRONMENT_1}" "${DEFAULT_CAPIF_PORT}")" +CAPIF_PORT_2="$(get_capif_port_with_default "${ENVIRONMENT_2}" "${DEFAULT_CAPIF_PORT}")" +COMPOSE_PROJECT_1="$(get_env_var_with_default "${ENVIRONMENT_1}" "COMPOSE_PROJECT_NAME" "${DEFAULT_COMPOSE_PROJECT_NAME}")" +COMPOSE_PROJECT_2="$(get_env_var_with_default "${ENVIRONMENT_2}" "COMPOSE_PROJECT_NAME" "${DEFAULT_COMPOSE_PROJECT_NAME}")" + +WAIT_TIMEOUT_SECONDS="${WAIT_TIMEOUT_SECONDS:-300}" +WAIT_INTERVAL_SECONDS="${WAIT_INTERVAL_SECONDS:-5}" + +if [[ "${CAPIF_HOSTNAME_1}" == "${CAPIF_HOSTNAME_2}" && "${CAPIF_PORT_1}" == "${CAPIF_PORT_2}" ]]; then + echo "Error: both environments resolve to the same CAPIF_HOSTNAME and CAPIF_PORT (${CAPIF_HOSTNAME_1}:${CAPIF_PORT_1})." >&2 + echo "Please use different CAPIF_HOSTNAME and/or CAPIF_PORT (or CAPIF_HTTP_PORT) values." >&2 + exit 1 +fi + +echo "Environment 1: ${ENVIRONMENT_1}" +echo "Environment 2: ${ENVIRONMENT_2}" +echo "CAPIF_HOSTNAME (${ENVIRONMENT_1}): ${CAPIF_HOSTNAME_1}" +echo "CAPIF_HOSTNAME (${ENVIRONMENT_2}): ${CAPIF_HOSTNAME_2}" +echo "CAPIF_PORT (${ENVIRONMENT_1}): ${CAPIF_PORT_1}" +echo "CAPIF_PORT (${ENVIRONMENT_2}): ${CAPIF_PORT_2}" +echo "Compose project (${ENVIRONMENT_1}): ${COMPOSE_PROJECT_1}" +echo "Compose project (${ENVIRONMENT_2}): ${COMPOSE_PROJECT_2}" + +echo "Running ${ENVIRONMENT_1} with interconnection host=${CAPIF_HOSTNAME_2}" +CAPIF_INTERCONNECTION_HOSTNAME="${CAPIF_HOSTNAME_2}" \ +"${RUN_SCRIPT}" "${ENVIRONMENT_1}" +wait_for_project_containers "${COMPOSE_PROJECT_1}" "${WAIT_TIMEOUT_SECONDS}" "${WAIT_INTERVAL_SECONDS}" + + + +echo "Running ${ENVIRONMENT_2} with interconnection host=${CAPIF_HOSTNAME_1}" +CAPIF_INTERCONNECTION_HOSTNAME="${CAPIF_HOSTNAME_1}" \ +"${RUN_SCRIPT}" "${ENVIRONMENT_2}" +wait_for_project_containers "${COMPOSE_PROJECT_2}" "${WAIT_TIMEOUT_SECONDS}" "${WAIT_INTERVAL_SECONDS}" diff --git a/services/run_mock_server.sh b/services/run_mock_server.sh index 5f62cf5c48d67ef5be2903db22f3f53d8d995dea..ec7259271042e968a2d82bec827131c37300dca6 100755 --- a/services/run_mock_server.sh +++ b/services/run_mock_server.sh @@ -1,8 +1,22 @@ #!/bin/bash -source $(dirname "$(readlink -f "$0")")/variables.sh +# Capture the first parameter as a possible environment +ENVIRONMENT="dev" +if [[ "$1" != -* && -n "$1" ]]; then + ENVIRONMENT="$1" + shift +fi + +# Load variables for the selected environment +source "$(dirname "$0")/variables.sh" "$ENVIRONMENT" +# source $(dirname "$(readlink -f "$0")")/variables.sh help() { - echo "Usage: $1 " + echo "Usage: $0 [environment] [options]" + echo "" + echo " environment Optional. Environment name to use (e.g. dev, prod)." + echo " If not specified, 'dev' will be used by default." + echo "" + echo "Options:" echo " -i : Setup different host ip for mock server (default 0.0.0.0)" echo " -p : Setup different port for mock server (default 9100)" echo " -h : show this help" diff --git a/services/show_logs.sh b/services/show_logs.sh index d71ae680e230474a167e4c61f30ad3adab3cf4dd..da0b4b7c3aa1014350d5e0b491cbf7e2a63dec4c 100755 --- a/services/show_logs.sh +++ b/services/show_logs.sh @@ -1,10 +1,23 @@ #!/bin/bash +# Capture the first parameter as a possible environment +ENVIRONMENT="dev" +if [[ "$1" != -* && -n "$1" ]]; then + ENVIRONMENT="$1" + shift +fi +# Load variables for the selected environment +source "$(dirname "$0")/variables.sh" "$ENVIRONMENT" # Directories variables setup (no modification needed) -export SERVICES_DIR=$(dirname "$(readlink -f "$0")") +# export SERVICES_DIR=$(dirname "$(readlink -f "$0")") help() { - echo "Usage: $0 " + echo "Usage: $0 [environment] [options]" + echo "" + echo " environment Optional. Environment name to use (e.g. dev, prod)." + echo " If not specified, 'dev' will be used by default." + echo "" + echo "Options:" echo " -c : Show capif services" echo " -v : Show vault service" echo " -r : Show register service" diff --git a/services/variables.sh b/services/variables.sh index dd99ae30fc2e7c7a9f21ba00d2011b8aed54f361..9eeaa19fafa241a20f21d7ed0623ef3a8127f7b9 100755 --- a/services/variables.sh +++ b/services/variables.sh @@ -7,6 +7,9 @@ export TEST_FOLDER=$CAPIF_BASE_DIR/tests export RESULT_FOLDER=$CAPIF_BASE_DIR/results export ROBOT_DOCKER_FILE_FOLDER=$CAPIF_BASE_DIR/tools/robot +# Check Docker compose version +export COMPOSE_PROJECT_NAME=ocf + # Image URL and version export REGISTRY_BASE_URL="labs.etsi.org:5050/ocf/capif/prod" export OCF_VERSION="v2.x.x-release" @@ -15,12 +18,45 @@ export OCF_VERSION="v2.x.x-release" export CAPIF_HOSTNAME=capifcore export CAPIF_HTTP_PORT=8080 export CAPIF_HTTPS_PORT=443 +export MONGO_EXPRESS_CCF_PORT=8081 # Register hostname and port export CAPIF_REGISTER=register export CAPIF_REGISTER_PORT=8084 +export MONGO_REGISTER_EXPRESS_PORT=8083 + +# Capif interconnection +export CAPIF_INTERCONNECTION_HOSTNAME=capifcore-b + +# Services docker names +export VAULT_CONTAINER_NAME=vault +export REGISTER_CONTAINER_NAME=register +export REGISTER_MONGO_CONTAINER_NAME=mongo_register +export REGISTER_MONGO_EXPRESS_CONTAINER_NAME=mongo_register_express +export REDIS_CONTAINER_NAME=redis +export HELPER_CONTAINER_NAME=helper +export ACCESS_CONTROL_POLICY_CONTAINER_NAME=access-control-policy +export API_INVOKER_MANAGEMENT_CONTAINER_NAME=api-invoker-management +export API_PROVIDER_MANAGEMENT_CONTAINER_NAME=api-provider-management +export LOGS_CONTAINER_NAME=logs +export SERVICE_APIS_CONTAINER_NAME=service-apis +export API_INVOCATION_LOGS_CONTAINER_NAME=api-invocation-logs +export CAPIF_EVENTS_CONTAINER_NAME=capif-events +export CELERY_WORKER_CONTAINER_NAME=celery_worker +export CELERY_BEAT_CONTAINER_NAME=celery_beat +export PUBLISHED_APIS_CONTAINER_NAME=published-apis +export CAPIF_ROUTING_INFO_CONTAINER_NAME=capif-routing-info +export CAPIF_SECURITY_CONTAINER_NAME=capif-security +export MONGO_CCF_CONTAINER_NAME=mongo +export MONGO_EXPRESS_CCF_CONTAINER_NAME=mongo-express +export NGINX_CONTAINER_NAME=nginx +export MOCK_SERVER_CONTAINER_NAME=mock-server + +# Network name +export CAPIF_NETWORK_NAME=capif-network # VAULT access configuration +export DEPLOY_VAULT=true export CAPIF_VAULT=vault export CAPIF_VAULT_PORT=8200 export CAPIF_VAULT_TOKEN=dev-only-token @@ -39,15 +75,40 @@ export DUID=$(id -u) export DGID=$(id -g) # Mock Server configuration +export MOCK_SERVER_INTERNAL_HOSTNAME=mock-server +export MOCK_SERVER_EXTERNAL_HOSTNAME=mock-server export MOCK_SERVER_IP=0.0.0.0 -export MOCK_SERVER_PORT=9100 +export MOCK_SERVER_INTERNAL_PORT=9100 +export MOCK_SERVER_EXTERNAL_PORT=9100 # Robot tests variables export DOCKER_ROBOT_IMAGE=labs.etsi.org:5050/ocf/capif/robot-tests-image export DOCKER_ROBOT_IMAGE_VERSION=1.0 export DOCKER_ROBOT_TTY_OPTIONS="-ti" +# Load environment variables from file +# Directories variables setup (no modification needed) +export SCRIPTS_DIR=$(dirname "$(readlink -f "$0")") +# export HELM_DIR=$(dirname "$SCRIPTS_DIR") +# export CAPIF_BASE_DIR=$(dirname "$HELM_DIR") +## Directory for environment variables +ENV_DIR="$SCRIPTS_DIR/envs" + +## Environment selection (default: dev) +ENVIRONMENT="${1:-dev}" +ENV_FILE="$ENV_DIR/$ENVIRONMENT.env" + +if [ -f "$ENV_FILE" ]; then + echo "Loading environment configuration: $ENVIRONMENT" + set -a + source "$ENV_FILE" + set +a +else + echo "Environment file not found: $ENV_FILE. Using default values." +fi + # Mock server variables -export MOCK_SERVER_URL=http://mock-server:${MOCK_SERVER_PORT} -export NOTIFICATION_DESTINATION_URL=http://mock-server:${MOCK_SERVER_PORT} +export MOCK_SERVER_URL=http://${MOCK_SERVER_EXTERNAL_HOSTNAME}:${MOCK_SERVER_EXTERNAL_PORT} +export NOTIFICATION_DESTINATION_URL=http://${MOCK_SERVER_INTERNAL_HOSTNAME}:${MOCK_SERVER_INTERNAL_PORT} +# \ No newline at end of file diff --git a/services/vault/Dockerfile b/services/vault/Dockerfile index ebf61f5dffc5cc0ae8f8178adac90d889c4b49d4..16263856559cbaf02085cd2e7bf51d4e6b0d3fc4 100644 --- a/services/vault/Dockerfile +++ b/services/vault/Dockerfile @@ -8,5 +8,4 @@ COPY ./vault_prepare_certs.sh /vault_prepare_certs.sh RUN chmod a+x /vault_prepare_certs.sh - -CMD sh -c "vault server -dev / & sleep 5 && /vault_prepare_certs.sh && tail -f /dev/null" +CMD ["sh", "-c", "vault server -dev / & sleep 5 && /vault_prepare_certs.sh && tail -f /dev/null"] diff --git a/services/vault/vault_prepare_certs.sh b/services/vault/vault_prepare_certs.sh index 0be8b85d72fc22dec8f0731833ff7045e7aa165e..38944e8ad4922d83d7042ba231914b4df263660c 100755 --- a/services/vault/vault_prepare_certs.sh +++ b/services/vault/vault_prepare_certs.sh @@ -3,9 +3,7 @@ # Setup environment variables for Vault export VAULT_ADDR="http://$VAULT_DEV_LISTEN_ADDRESS" export VAULT_TOKEN=$VAULT_DEV_ROOT_TOKEN_ID -CAPIF_HOSTNAME="${CAPIF_HOSTNAME:-capifcore}" -echo "CAPIF_HOSTNAME: $CAPIF_HOSTNAME" echo "VAULT_ADDR: $VAULT_ADDR" echo "VAULT_TOKEN: $VAULT_TOKEN" diff --git a/tests/features/Helper/Interconnection API/__init__.robot b/tests/features/Helper/Interconnection API/__init__.robot new file mode 100644 index 0000000000000000000000000000000000000000..40da1715e2b015b0120cd8a35ba23f133b2df17e --- /dev/null +++ b/tests/features/Helper/Interconnection API/__init__.robot @@ -0,0 +1,2 @@ +*** Settings *** +Test Tags interconnection \ No newline at end of file diff --git a/tests/features/Helper/Interconnection API/interconnection.robot b/tests/features/Helper/Interconnection API/interconnection.robot new file mode 100644 index 0000000000000000000000000000000000000000..49aefda2c4b8729eda3a898fe152ea073de3d4a9 --- /dev/null +++ b/tests/features/Helper/Interconnection API/interconnection.robot @@ -0,0 +1,64 @@ +*** Settings *** +Resource /opt/robot-tests/tests/resources/common.resource +Library /opt/robot-tests/tests/libraries/bodyRequests.py +Library XML +Library String +Resource /opt/robot-tests/tests/resources/common/basicRequests.robot +Resource /opt/robot-tests/tests/resources/common.resource +Resource /opt/robot-tests/tests/resources/common/basicRequests.robot + +Suite Teardown Reset Testing Environment +Test Setup Reset Testing Environment +Test Teardown Reset Testing Environment + + +*** Variables *** +${API_INVOKER_NOT_REGISTERED} not-valid +${SUBSCRIBER_ID_NOT_VALID} not-valid +${SUBSCRIPTION_ID_NOT_VALID} not-valid + + +*** Test Cases *** +Interconnection 2 CCF + [Tags] interconnection-1 + + ${DESTINATION_PROVIDER_DOMAIN}= Set Variable capifcore-b:1443 + + ${ccf_id}= Get Capif Ccf Id + + ${body}= Create Interconnection Request Body ${DESTINATION_PROVIDER_DOMAIN} + ${resp}= Post Request Capif + ... /helper/interconnection/interconnect + ... server=${CAPIF_HTTPS_URL} + ... verify=ca.crt + ... username=${SUPERADMIN_USERNAME} + ... json=${body} + + Should Be Equal As Integers ${resp.status_code} 201 + Log Dictionary ${resp.json()} + +Interconnection 2 CCF X + [Tags] interconnection-2 + + ${DESTINATION_PROVIDER_DOMAIN}= Set Variable capifcore-b:1443 + + ${ccf_id}= Get Capif Ccf Id + + ${ccf_crt}= Read File Utf8 ${CCF_USERNAME}.crt + ${ccf_key}= Read File Utf8 ${CCF_USERNAME}.key + ${ccf_ca}= Read File Utf8 ${CCF_USERNAME}_ca.crt + + ${body}= Create Connection Request Body + ... ${ccf_ca} + ... ${ccf_id} + ... ${DESTINATION_PROVIDER_DOMAIN} + ... ${ccf_crt} + ${resp}= Post Request Capif + ... /helper/interconnection/connect + ... server=${CAPIF_HTTPS_URL} + ... verify=ca.crt + ... username=${CCF_USERNAME} + ... json=${body} + + Should Be Equal As Integers ${resp.status_code} 201 + Log Dictionary ${resp.json()} diff --git a/tests/features/__init__.robot b/tests/features/__init__.robot index 3ac73ab8898640e7a1040fe8d9603d55b30fa3c6..77f0252d7145e8067d0f29dde5f2a43b216a0bbf 100644 --- a/tests/features/__init__.robot +++ b/tests/features/__init__.robot @@ -48,6 +48,8 @@ Prepare environment Retrieve Superadmin Cert + Retrieve CCF Cert + Reset Testing Environment Retrieve Ca Root @@ -65,3 +67,17 @@ Retrieve Superadmin Cert Log ${resp.json()['data']['certificate']} Store In File ${SUPERADMIN_USERNAME}.crt ${resp.json()['data']['certificate']} +Retrieve CCF Cert + [Documentation] This keyword retrieve ccf certificate from CAPIF and store it at ccf.crt in order to use at TLS communications + + ${ccf_id}= Get Capif Ccf Id + Log CCF ID obtained: ${ccf_id} + + + ${resp}= Obtain CCF Cert From Vault /v1/secret/data/capif/${ccf_id}/nginx ${CAPIF_HTTP_VAULT_URL} + Status Should Be 200 ${resp} + Log Dictionary ${resp.json()} + Log ${resp.json()['data']['data']} + Store In File ${CCF_USERNAME}.crt ${resp.json()['data']['data']['server_crt']} + Store In File ${CCF_USERNAME}.key ${resp.json()['data']['data']['server_key']} + Store In File ${CCF_USERNAME}_ca.crt ${resp.json()['data']['data']['ca']} diff --git a/tests/libraries/helper_service/bodyRequests.py b/tests/libraries/helper_service/bodyRequests.py index ffa9960321478ec3b13a493eb9e71120e8c8bfd8..31d737e20dfd899773b982b70072f3511f95cf38 100644 --- a/tests/libraries/helper_service/bodyRequests.py +++ b/tests/libraries/helper_service/bodyRequests.py @@ -41,4 +41,19 @@ def create_visibility_control_rule_body_2(): "apiProviderId": ["capif-prov-01"], "userName": "AMF_ROBOT_TESTING_PROVIDER" } - } \ No newline at end of file + } + + +def create_interconnection_request_body(dstProvDom="provider-b.example.com"): + return { + "dstProvDom": dstProvDom + } + + +def create_connection_request_body(caRoot, ccfId, dstProvDom, publicKey): + return { + "caRoot": caRoot, + "ccfId": ccfId, + "dstProvDom": dstProvDom, + "publicKey": publicKey + } diff --git a/tests/resources/common.resource b/tests/resources/common.resource index 96b09429702ec75e38ad3f122823f10213012055..119db76ecb5ce4ce00ee76ead04a543adce3766b 100644 --- a/tests/resources/common.resource +++ b/tests/resources/common.resource @@ -10,6 +10,7 @@ Resource /opt/robot-tests/tests/resources/common/expectedMessages.robot *** Variables *** ${SUPERADMIN_USERNAME} ROBOT_TESTING_SUPERADMIN +${CCF_USERNAME} ROBOT_TESTING_CCF ${INVOKER_USERNAME} ROBOT_TESTING_INVOKER ${PROVIDER_USERNAME} ROBOT_TESTING_PROVIDER ${APF_PROVIDER_USERNAME} APF_${PROVIDER_USERNAME} diff --git a/tests/resources/common/basicRequests.robot b/tests/resources/common/basicRequests.robot index e02a9c93e2c54d9be3be1ee1871c20fb48abb3cb..f328094b8a6c7e88ac55cc7d010d65324224fbc2 100644 --- a/tests/resources/common/basicRequests.robot +++ b/tests/resources/common/basicRequests.robot @@ -260,6 +260,32 @@ Obtain Superadmin Cert From Vault ... cert=${cert} RETURN ${resp} +Obtain CCF Cert From Vault + [Timeout] ${REQUESTS_TIMEOUT} + [Arguments] + ... ${endpoint} + ... ${server}=${NONE} + ... ${access_token}=${NONE} + ... ${auth}=${NONE} + ... ${verify}=${FALSE} + ... ${cert}=${NONE} + ... ${username}=${NONE} + + ${headers}= Create CAPIF Session ${server} ${access_token} vault_token=${CAPIF_VAULT_TOKEN} + + IF '${username}' != '${NONE}' + ${cert}= Set variable ${{ ('${username}.crt','${username}.key') }} + END + + ${resp}= Get On Session + ... apisession + ... ${endpoint} + ... headers=${headers} + ... expected_status=any + ... verify=${verify} + ... cert=${cert} + RETURN ${resp} + Put Request Capif [Timeout] ${REQUESTS_TIMEOUT} [Arguments]