diff --git a/ci_cd_test/Dockerfile b/ci_cd_test/Dockerfile index 2d1fe73d123832ea1d40e78a4cddb7ab5e369bad..5f2496be9172ff655cfc56759291e4f1e686edf9 100644 --- a/ci_cd_test/Dockerfile +++ b/ci_cd_test/Dockerfile @@ -1,27 +1,27 @@ FROM labs.etsi.org:5050/ocf/capif/python:3-slim-bullseye -RUN apt update +# Update package index and install required tools RUN apt update && apt install -y git nano && \ rm -rf /var/lib/apt/lists/* -ARG BRANCH=main - -RUN echo "Cloning branch: ${BRANCH}" && \ - git clone -b ${BRANCH} https://labs.etsi.org/rep/ocf/sdk.git - WORKDIR /sdk +# Copy project files into the container +COPY .. . + +# Install Python dependencies RUN python -m pip install --upgrade pip RUN pip install -r installation/requirements.txt RUN pip install . +# Define entrypoint: run provider first, then invoker ENTRYPOINT sh -c '\ set -e && \ - echo "🚀 Ejecutando provider..." && \ + echo "🚀 Starting provider execution..." && \ cd ci_cd_test/testing_samples/testing_provider_sample && \ python testing_provider.py && \ - echo "✅ Provider finalizado." && \ - echo "🚀 Ejecutando invoker..." && \ + echo "✅ Provider execution finished." && \ + echo "🚀 Starting invoker execution..." && \ cd ../testing_invoker_sample && \ python network_app_invoker.py && \ - echo "✅ Invoker finalizado."' \ No newline at end of file + echo "✅ Invoker execution finished."' \ No newline at end of file diff --git a/clean_test_sdk.sh b/ci_cd_test/clean_test_sdk.sh similarity index 90% rename from clean_test_sdk.sh rename to ci_cd_test/clean_test_sdk.sh index 382dbbb1d6a14679e9fe4a7e81f28748887999e7..67555f0b91146390636cbd88ff6121510635c04c 100755 --- a/clean_test_sdk.sh +++ b/ci_cd_test/clean_test_sdk.sh @@ -1,6 +1,6 @@ #!/bin/bash -# Nombre del contenedor e imagen +# Name of container image CONTAINER_NAME=capif-sdk-runner IMAGE_NAME=opencapif_sdk diff --git a/test_sdk.sh b/ci_cd_test/test_sdk.sh similarity index 52% rename from test_sdk.sh rename to ci_cd_test/test_sdk.sh index 3452e076089abcd6efad65d973712ed46f8f9aff..860a8699c39aa0ab1f7dfc2eb4398944a47851c8 100755 --- a/test_sdk.sh +++ b/ci_cd_test/test_sdk.sh @@ -1,19 +1,22 @@ #!/bin/bash -# Nombre del contenedor e imagen +# Name of container image CONTAINER_NAME=capif-sdk-runner IMAGE_NAME=opencapif_sdk -BRANCH_NAME=SDK15-create-dockerfile-image-with-sdk +BRANCH_NAME=${CI_COMMIT_REF_NAME} NETWORK_NAME=capif-network +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +PROJECT_ROOT="$(dirname "$SCRIPT_DIR")" + echo "🛠️ Building image: $IMAGE_NAME from branch: $BRANCH_NAME with no cache..." -docker build --no-cache . -t $IMAGE_NAME -f ci_cd_test/Dockerfile --build-arg BRANCH=$BRANCH_NAME +docker build --no-cache "$PROJECT_ROOT" -t $IMAGE_NAME -f "$SCRIPT_DIR/Dockerfile" --build-arg BRANCH=$BRANCH_NAME echo "🚀 Running container: $CONTAINER_NAME in network: $NETWORK_NAME..." docker run \ + --rm \ --name $CONTAINER_NAME \ --network $NETWORK_NAME \ $IMAGE_NAME -echo "End" - +echo "✅ End of script" \ No newline at end of file diff --git a/cicd/exclusions b/cicd/exclusions new file mode 100644 index 0000000000000000000000000000000000000000..78753ab4c5eb4bde5e6b8da499c229d81780c587 --- /dev/null +++ b/cicd/exclusions @@ -0,0 +1,4 @@ +doc/ +.git/ +network_app_samples/ +ci_cd_test/ \ No newline at end of file diff --git a/cicd/ruff.toml b/cicd/ruff.toml new file mode 100644 index 0000000000000000000000000000000000000000..a75ab1273cc0453c0eb60da23f839e213510ae0f --- /dev/null +++ b/cicd/ruff.toml @@ -0,0 +1,3 @@ +line-length = 120 +target-version = "py39" +lint.select = ["E", "W"] \ No newline at end of file diff --git a/network_app_samples/network_app_invoker_sample/network_app_invoker.py b/network_app_samples/network_app_invoker_sample/network_app_invoker.py index 3440170c0f25f69a01e1c2622bf0f913ea65faeb..4735c2e68fb31d3c3d9629d11552d90326ccc89c 100644 --- a/network_app_samples/network_app_invoker_sample/network_app_invoker.py +++ b/network_app_samples/network_app_invoker_sample/network_app_invoker.py @@ -29,7 +29,7 @@ def update_token(access_token): } # Get the current environment details - response = requests.get(url, headers=headers) + response = requests.get(url, headers=headers, timeout=10) # Check if the request was successful if response.status_code == 200: @@ -65,7 +65,7 @@ def update_token(access_token): } # Update the environment in Postman - put_response = requests.put(url, headers=headers, data=json.dumps(updated_data)) + put_response = requests.put(url, headers=headers, data=json.dumps(updated_data), timeout=10) if put_response.status_code == 200: print("Access token updated successfully.") diff --git a/opencapif_sdk/capif_event_feature.py b/opencapif_sdk/capif_event_feature.py index e8fecebca7902c122dafddbb4607329789afbd43..09769cac7c678500e2ce38cb70e80a3435c2097e 100644 --- a/opencapif_sdk/capif_event_feature.py +++ b/opencapif_sdk/capif_event_feature.py @@ -55,6 +55,7 @@ class capif_invoker_event_feature(capif_invoker_connector): response = requests.post( url=path, json=payload, + timeout=10, headers={"Content-Type": "application/json"}, cert=(self.signed_key_crt_path, self.private_key_path), verify=os.path.join(self.invoker_folder, "ca.crt") @@ -123,7 +124,8 @@ class capif_invoker_event_feature(capif_invoker_connector): url=delete_path, headers={"Content-Type": "application/json"}, cert=(self.signed_key_crt_path, self.private_key_path), - verify=os.path.join(self.invoker_folder, "ca.crt") + verify=os.path.join(self.invoker_folder, "ca.crt"), + timeout=10 ) response.raise_for_status() @@ -186,7 +188,8 @@ class capif_invoker_event_feature(capif_invoker_connector): json=payload, headers={"Content-Type": "application/json"}, cert=(self.signed_key_crt_path, self.private_key_path), - verify=os.path.join(self.invoker_folder, "ca.crt") + verify=os.path.join(self.invoker_folder, "ca.crt"), + timeout=10 ) response.raise_for_status() @@ -240,6 +243,7 @@ class capif_provider_event_feature(capif_provider_connector): response = requests.post( url=path, json=payload, + timeout=10, headers={"Content-Type": "application/json"}, cert=cert, verify=os.path.join(self.provider_folder, "ca.crt") @@ -318,7 +322,8 @@ class capif_provider_event_feature(capif_provider_connector): url=delete_path, headers={"Content-Type": "application/json"}, cert=cert, - verify=os.path.join(self.provider_folder, "ca.crt") + verify=os.path.join(self.provider_folder, "ca.crt"), + timeout=10 ) response.raise_for_status() @@ -391,6 +396,7 @@ class capif_provider_event_feature(capif_provider_connector): response = requests.put( url=put_path, json=payload, + timeout=10, headers={"Content-Type": "application/json"}, cert=cert, verify=os.path.join(self.provider_folder, "ca.crt") diff --git a/opencapif_sdk/capif_invoker_connector.py b/opencapif_sdk/capif_invoker_connector.py index e973a697d75628dd0f0b576b95b926d39caeb8c7..3ba5aac349aeb821072c1daeae83835788628de0 100644 --- a/opencapif_sdk/capif_invoker_connector.py +++ b/opencapif_sdk/capif_invoker_connector.py @@ -219,6 +219,7 @@ class capif_invoker_connector: url, cert=(self.signed_key_crt_path, self.private_key_path), verify=self.pathca, + timeout=10, ) response.raise_for_status() self.logger.info("Invoker offboarded successfully") @@ -306,6 +307,7 @@ class capif_invoker_connector: auth=HTTPBasicAuth(self.capif_username, self.capif_invoker_password), verify=False, + timeout=10, ) response.raise_for_status() @@ -350,6 +352,7 @@ class capif_invoker_connector: headers=headers, data=payload, verify=self.pathca, + timeout=10, ) response.raise_for_status() response_payload = json.loads(response.text) @@ -455,6 +458,7 @@ class capif_invoker_connector: data=payload, cert=(self.signed_key_crt_path, self.private_key_path), verify=self.pathca, + timeout=10, ) response.raise_for_status() diff --git a/opencapif_sdk/capif_logging_feature.py b/opencapif_sdk/capif_logging_feature.py index ad436e62d71f50261336a5f11444d6b448475694..6ebf55bb49e22a37afd9a435e46e418f6bac8dcb 100644 --- a/opencapif_sdk/capif_logging_feature.py +++ b/opencapif_sdk/capif_logging_feature.py @@ -243,6 +243,7 @@ class capif_logging_feature: response = requests.post( url=path, json=payload, + timeout=10, headers={"Content-Type": "application/json"}, cert=cert, verify=os.path.join(self.provider_folder, "ca.crt") diff --git a/opencapif_sdk/capif_provider_connector.py b/opencapif_sdk/capif_provider_connector.py index ba7dd93a0a4002e1e3e78fee10a598f988c1657d..8ffc7b4a68f4f00034ccbbba811ca4406d5e121a 100644 --- a/opencapif_sdk/capif_provider_connector.py +++ b/opencapif_sdk/capif_provider_connector.py @@ -304,6 +304,7 @@ class capif_provider_connector: response = requests.post( url, headers=headers, + timeout=10, data=json.dumps(payload), verify=os.path.join(self.provider_folder, "ca.crt"), ) @@ -362,7 +363,8 @@ class capif_provider_connector: headers={"Content-Type": "application/json"}, auth=HTTPBasicAuth(self.capif_provider_username, self.capif_provider_password), - verify=False + verify=False, + timeout=10 ) response.raise_for_status() @@ -537,6 +539,7 @@ class capif_provider_connector: data=json.dumps(data), cert=cert, verify=os.path.join(self.provider_folder, "ca.crt"), + timeout=10 ) response.raise_for_status() self.logger.info("Services published successfully") @@ -638,6 +641,7 @@ class capif_provider_connector: headers={"Content-Type": "application/json"}, cert=cert, verify=os.path.join(self.provider_folder, "ca.crt"), + timeout=10, ) response.raise_for_status() @@ -754,6 +758,7 @@ class capif_provider_connector: headers={"Content-Type": "application/json"}, cert=cert, verify=os.path.join(self.provider_folder, "ca.crt"), + timeout=10 ) response.raise_for_status() @@ -827,6 +832,7 @@ class capif_provider_connector: url, headers={"Content-Type": "application/json"}, cert=cert, + timeout=10, verify=os.path.join(self.provider_folder, "ca.crt"), ) response.raise_for_status() @@ -974,6 +980,7 @@ class capif_provider_connector: response = requests.put( url, headers={"Content-Type": "application/json"}, + timeout=10, data=json.dumps(data), cert=cert, verify=os.path.join(self.provider_folder, "ca.crt"), @@ -1078,7 +1085,8 @@ class capif_provider_connector: response = requests.delete( url, cert=cert_paths, - verify=os.path.join(self.provider_folder, "ca.crt") + verify=os.path.join(self.provider_folder, "ca.crt"), + timeout=10 ) response.raise_for_status() @@ -1257,6 +1265,7 @@ class capif_provider_connector: response = requests.put( url, headers=headers, + timeout=10, data=json.dumps(payload), cert=cert, verify=os.path.join(self.provider_folder, "ca.crt"), @@ -1392,7 +1401,8 @@ class capif_provider_connector: url, headers={"Content-Type": "application/json"}, cert=cert, - verify=os.path.join(self.provider_folder, "ca.crt") + verify=os.path.join(self.provider_folder, "ca.crt"), + timeout=10 ) response.raise_for_status() return response.json() diff --git a/opencapif_sdk/service_discoverer.py b/opencapif_sdk/service_discoverer.py index a000142ef903aad064396fd3558dcc36ce2da471..dbaae4b35b19ba60316536eddffa503025d988c0 100644 --- a/opencapif_sdk/service_discoverer.py +++ b/opencapif_sdk/service_discoverer.py @@ -106,7 +106,7 @@ class service_discoverer: self.capif_invoker_username = capif_invoker_username self.capif_host = capif_host self.capif_https_port = capif_https_port - self.token = "" + self.token = "" # nosec if supported_features is None: supported_features = 0 self.supported_features = supported_features @@ -121,8 +121,9 @@ class service_discoverer: try: self.token = self.invoker_capif_details["access_token"] - except: - pass + except KeyError: + self.token = None + self.logger.debug("'access_token' not found in invoker_capif_details") # Define paths for certificates, private keys, and CA root self.signed_key_crt_path = os.path.join(self.invoker_folder, self.invoker_capif_details["user_name"] + ".crt") @@ -236,7 +237,9 @@ class service_discoverer: url, json=payload, cert=(self.signed_key_crt_path, self.private_key_path), - verify=self.ca_root_path) + verify=self.ca_root_path, + timeout=10 + ) response.raise_for_status() self.logger.info("Security context correctly updated") @@ -295,7 +298,8 @@ class service_discoverer: json=payload, cert=(self.signed_key_crt_path, self.private_key_path), - verify=self.ca_root_path + verify=self.ca_root_path, + timeout=10 ) response.raise_for_status() self.logger.info("Security service properly registered") @@ -338,6 +342,7 @@ class service_discoverer: response = requests.post(url, headers=headers, data=payload, + timeout=10, cert=(self.signed_key_crt_path, self.private_key_path), verify=self.ca_root_path @@ -375,6 +380,7 @@ class service_discoverer: response = requests.get( url, headers={"Content-Type": "application/json"}, + timeout=10, cert=(self.signed_key_crt_path, self.private_key_path), verify=self.ca_root_path ) @@ -525,7 +531,8 @@ class service_discoverer: "POST", url, headers=headers, - json=payload + json=payload, + timeout=10 ) response.raise_for_status() diff --git a/scripts/deregister_and_login.py b/scripts/deregister_and_login.py index d44d914cf9e2ee8a842a9be027f050e8065838a3..dd1669804382d3269b88eba27e145c2bab5f9c44 100644 --- a/scripts/deregister_and_login.py +++ b/scripts/deregister_and_login.py @@ -39,6 +39,7 @@ def __log_to_capif(variables): headers={"Content-Type": "application/json"}, auth=HTTPBasicAuth(variables["capif_register_username"], variables["capif_register_password"]), verify=False, + timeout=10, ) response.raise_for_status() response_payload = json.loads(response.text) @@ -64,7 +65,8 @@ def de_register_from_capif(admin_token, variables): url, headers=headers, data=None, - verify=False + verify=False, + timeout=10 ) response.raise_for_status() logger.info("User deleted") diff --git a/scripts/register_and_login.py b/scripts/register_and_login.py index 76646b7f331afac2b5bff5d86441786517450c6f..7fd63c1a04fba85c460e10d625cea9dd4c9f0949 100644 --- a/scripts/register_and_login.py +++ b/scripts/register_and_login.py @@ -35,6 +35,7 @@ def __log_to_capif(variables): headers={"Content-Type": "application/json"}, auth=HTTPBasicAuth(variables["capif_register_username"], variables["capif_register_password"]), verify=False, + timeout=10, ) response.raise_for_status() response_payload = json.loads(response.text) @@ -64,7 +65,7 @@ def __create_user(admin_token, variables): } response = requests.request( - "POST", url, headers=headers, data=json.dumps(payload), verify=False + "POST", url, headers=headers, data=json.dumps(payload), verify=False, timeout=10 ) response.raise_for_status() response_payload = json.loads(response.text)