From c76acbf1a021f58c0cdc194194da054b0a9c6465 Mon Sep 17 00:00:00 2001 From: Ivan Nikolaev-Axenov Date: Tue, 18 Mar 2025 13:24:17 +0300 Subject: [PATCH] now tests works on prepared database data, account-service added, clearing-tester.jar and swt-dbf-converter.jar updated --- .gitlab-ci.yml | 12 +-- clr_test/clearing-all/Dockerfile | 7 +- .../clearing-checker/clearing-checker.sh | 2 +- .../clearing-converter/clearing-converter.sh | 2 +- ...verter-0.0.1.jar => swt-dbf-converter.jar} | Bin 21061834 -> 21062966 bytes .../clearing-tester/application.properties | 14 +--- .../clearing-tester/clearing-tester.jar | Bin 58107133 -> 58106112 bytes .../clearing_testing_utils/run_test_env.sh | 2 +- clr_test/clearing-all/launch_all.sh | 17 ++-- .../account-service/application.properties | 22 +++++ clr_test/db/Dockerfile | 4 +- clr_test/{mnt/dbfout => db/data}/.gitkeep | 0 clr_test/docker-compose.yml | 43 ++-------- clr_test/run_test_docker_containers.py | 78 +++++++++--------- 14 files changed, 84 insertions(+), 119 deletions(-) rename clr_test/clearing-all/clearing_testing_utils/clearing-converter/{swt-dbf-converter-0.0.1.jar => swt-dbf-converter.jar} (99%) create mode 100644 clr_test/clearing-all/settings/account-service/application.properties rename clr_test/{mnt/dbfout => db/data}/.gitkeep (100%) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 4559415d5..a8e78cb26 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -54,16 +54,10 @@ test: script: - echo "Installing maven and python" && apk update && apk add maven python3 - echo "Copying jar files to clearing-all/bin" && cp -r /builds/mfd/clearing/z-distr/target/clearing/bin ./clr_test/clearing-all/bin - - echo "Copying DDL.sql to db directory" && cp /builds/mfd/clearing/z-distr/target/clearing/db/DDL.sql ./clr_test/db/ +# - echo "Copying DDL.sql to db directory" && cp /builds/mfd/clearing/z-distr/target/clearing/db/DDL.sql ./clr_test/db/ - python3 clr_test/run_test_docker_containers.py - - mkdir -p artifacts/logs - - echo "copying logs" - - pwd - - ls -al - - docker run --rm -v clr_test_logs_volume:/logs alpine tar -C /logs -cf - . | tar -C artifacts/logs -xf - - - ls -la artifacts/logs - - echo "Cleaning up log volume" - - docker volume rm clr_test_logs_volume + - echo "Copying logs" && mkdir -p artifacts/logs && docker run --rm -v clr_test_logs_volume:/logs alpine tar -C /logs -cf - . | tar -C artifacts/logs -xf - + - echo "Cleaning up log volume" && docker volume rm clr_test_logs_volume artifacts: expire_in: 1 day when: always diff --git a/clr_test/clearing-all/Dockerfile b/clr_test/clearing-all/Dockerfile index 26ba5e1d8..fff64e54e 100644 --- a/clr_test/clearing-all/Dockerfile +++ b/clr_test/clearing-all/Dockerfile @@ -23,6 +23,7 @@ RUN chmod +x $CLEARING_HOME/clearing_testing_utils/clearing-tester/*.sh RUN mkdir -p $CLEARING_HOME/files/swt/importer/in RUN mkdir -p $CLEARING_HOME/files/swt/importer/out RUN mkdir -p $CLEARING_HOME/files/swt/importer/error +RUN mkdir -p $CLEARING_HOME/files/swt/importer/sftp-in RUN mkdir -p $CLEARING_HOME/files/swt/exporter RUN mkdir -p $CLEARING_HOME/files/dbf/importer/in RUN mkdir -p $CLEARING_HOME/files/dbf/importer/out @@ -37,10 +38,6 @@ RUN mkdir -p $CLEARING_HOME/files/xml/exporter RUN mkdir -p $CLEARING_HOME_BIN/log_artifacts WORKDIR $CLEARING_HOME -RUN sed -i 's/\r$//' $CLEARING_HOME/*.sh -RUN sed -i 's/\r$//' $CLEARING_HOME/clearing_testing_utils/*.sh -RUN sed -i 's/\r$//' $CLEARING_HOME/clearing_testing_utils/clearing-checker/*.sh -RUN sed -i 's/\r$//' $CLEARING_HOME/clearing_testing_utils/clearing-converter/*.sh -RUN sed -i 's/\r$//' $CLEARING_HOME/clearing_testing_utils/clearing-tester/*.sh +RUN find . -name "*.sh" | xargs sed -i 's/\r$//' ENTRYPOINT [ "./launch_and_test.sh" ] \ No newline at end of file diff --git a/clr_test/clearing-all/clearing_testing_utils/clearing-checker/clearing-checker.sh b/clr_test/clearing-all/clearing_testing_utils/clearing-checker/clearing-checker.sh index 48b2b0068..3317fa540 100644 --- a/clr_test/clearing-all/clearing_testing_utils/clearing-checker/clearing-checker.sh +++ b/clr_test/clearing-all/clearing_testing_utils/clearing-checker/clearing-checker.sh @@ -3,6 +3,6 @@ CLEARING_TEST_HOME=/opt/clearing/clearing_testing_utils/ cd $CLEARING_TEST_HOME/clearing-checker -CMD="java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:9992 -jar dbf-swt-checker-1.0.jar --spring.config.location=$CLEARING_TEST_HOME/clearing-checker/" +CMD="java -jar dbf-swt-checker-1.0.jar --spring.config.location=$CLEARING_TEST_HOME/clearing-checker/" $CMD >/dev/null 2>&1 & diff --git a/clr_test/clearing-all/clearing_testing_utils/clearing-converter/clearing-converter.sh b/clr_test/clearing-all/clearing_testing_utils/clearing-converter/clearing-converter.sh index 299d70142..710164316 100644 --- a/clr_test/clearing-all/clearing_testing_utils/clearing-converter/clearing-converter.sh +++ b/clr_test/clearing-all/clearing_testing_utils/clearing-converter/clearing-converter.sh @@ -3,7 +3,7 @@ CLEARING_TEST_HOME=/opt/clearing/clearing_testing_utils/ cd $CLEARING_TEST_HOME/clearing-converter -CMD="java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:9991 -jar swt-dbf-converter-0.0.1.jar --spring.config.location=$CLEARING_TEST_HOME/clearing-converter/" +CMD="java -jar swt-dbf-converter.jar --spring.config.location=$CLEARING_TEST_HOME/clearing-converter/" $CMD >/dev/null 2>&1 & diff --git a/clr_test/clearing-all/clearing_testing_utils/clearing-converter/swt-dbf-converter-0.0.1.jar b/clr_test/clearing-all/clearing_testing_utils/clearing-converter/swt-dbf-converter.jar similarity index 99% rename from clr_test/clearing-all/clearing_testing_utils/clearing-converter/swt-dbf-converter-0.0.1.jar rename to clr_test/clearing-all/clearing_testing_utils/clearing-converter/swt-dbf-converter.jar index 084e88ae6aa71819a59ee655ef8868633c79e236..1eb659e3466441c646c7f6c564794f0f7a6319cb 100644 GIT binary patch delta 17575 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 delta 20940 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 Y^ohW0H37j}@UN{MI6u+}25)r!4^oY1dH?_b diff --git a/clr_test/clearing-all/clearing_testing_utils/run_test_env.sh b/clr_test/clearing-all/clearing_testing_utils/run_test_env.sh index 5153cf9ca..4e643c7a3 100644 --- a/clr_test/clearing-all/clearing_testing_utils/run_test_env.sh +++ b/clr_test/clearing-all/clearing_testing_utils/run_test_env.sh @@ -5,4 +5,4 @@ cd /opt/clearing/clearing_testing_utils sh ./clearing-checker/clearing-checker.sh sh ./clearing-converter/clearing-converter.sh -echo Test finish. xit code: $? +echo Test initialization finished. xit code: $? diff --git a/clr_test/clearing-all/launch_all.sh b/clr_test/clearing-all/launch_all.sh index 70429f91a..6554aaedb 100644 --- a/clr_test/clearing-all/launch_all.sh +++ b/clr_test/clearing-all/launch_all.sh @@ -7,19 +7,16 @@ cd $CLEARING_HOME/bin echo Start starting all in $CLEARING_HOME. java -jar $CLEARING_HOME/bin/imdg.jar --spring.config.location=$CLEARING_HOME/settings/imdg/ & + java -jar $CLEARING_HOME/bin/backend-api.jar --spring.config.location=$CLEARING_HOME/settings/backend-api/ & -#java -jar $CLEARING_HOME/bin/account-service.jar --spring.config.location=$CLEARING_HOME/settings/account-service/ & -#java -jar $CLEARING_HOME/bin/balance-service.jar --spring.config.location=$CLEARING_HOME/settings/balance-service/ & +java -jar $CLEARING_HOME/bin/account-service.jar --spring.config.location=$CLEARING_HOME/settings/account-service/ & java -jar $CLEARING_HOME/bin/clearing-service.jar --spring.config.location=$CLEARING_HOME/settings/clearing-service/ & -java -jar $CLEARING_HOME/bin/dbf-exporter.jar --spring.config.location=$CLEARING_HOME/settings/dbf-exporter/ --spring.profiles.active=test & -#java -jar $CLEARING_HOME/bin/company-service.jar --spring.config.location=$CLEARING_HOME/settings/company-service/ & -java -jar $CLEARING_HOME/bin/dbf-importer.jar --spring.config.location=$CLEARING_HOME/settings/dbf-importer/ --spring.profiles.active=test & -#java -jar $CLEARING_HOME/bin/gateway-api.jar --spring.config.location=$CLEARING_HOME/settings/gateway-api/ & -#java -jar $CLEARING_HOME/bin/registry-service.jar --spring.config.location=$CLEARING_HOME/settings/registry-service/ & -#java -jar $CLEARING_HOME/bin/reports-service.jar --spring.config.location=$CLEARING_HOME/settings/reports-service/ & java -jar $CLEARING_HOME/bin/scheduler-service.jar --spring.config.location=$CLEARING_HOME/settings/scheduler-service/ & -#java -jar $CLEARING_HOME/bin/securities-service.jar --spring.config.location=$CLEARING_HOME/settings/securities-service/ & + +java -jar $CLEARING_HOME/bin/dbf-exporter.jar --spring.config.location=$CLEARING_HOME/settings/dbf-exporter/ --spring.profiles.active=test & +java -jar $CLEARING_HOME/bin/dbf-importer.jar --spring.config.location=$CLEARING_HOME/settings/dbf-importer/ --spring.profiles.active=test & + java -jar $CLEARING_HOME/bin/swt-exporter.jar --spring.config.location=$CLEARING_HOME/settings/swt-exporter/ --spring.profiles.active=test & java -jar $CLEARING_HOME/bin/swt-importer.jar --spring.config.location=$CLEARING_HOME/settings/swt-importer/ --spring.profiles.active=test & -#java -jar $CLEARING_TEST_HOME/clearing-tester/clearing-tester.jar --spring.config.location=$CLEARING_TEST_HOME/clearing-tester/ & + echo all services launched starting. $? diff --git a/clr_test/clearing-all/settings/account-service/application.properties b/clr_test/clearing-all/settings/account-service/application.properties new file mode 100644 index 000000000..fdd56fe73 --- /dev/null +++ b/clr_test/clearing-all/settings/account-service/application.properties @@ -0,0 +1,22 @@ +spring.main.web-application-type=none + +account-service.hazelcast.cluster-members=127.0.0.1:5701 +account-service.hazelcast.login=dev +account-service.hazelcast.password=dev-pass + +account-service.kafka-consumer.bootstrap-servers=kafka:9092 +account-service.kafka-consumer.group-id=dev-group-balance-service +account-service.kafka-consumer.enable-auto-commit=false +account-service.kafka-consumer.session-timeout-ms=30000 +account-service.kafka-consumer.auto-offset-reset=latest +account-service.kafka-consumer.linger-ms=1 +account-service.kafka-consumer.buffer-memory=33554432 + +account-service.kafka-producer.bootstrap-servers=kafka:9092 +account-service.kafka-producer.acks=all +account-service.kafka-producer.retries=0 +account-service.kafka-producer.batch-size=16384 +account-service.kafka-producer.linger-ms=1 +account-service.kafka-producer.buffer-memory=33554432 + +account-service.app.registry-unit=L \ No newline at end of file diff --git a/clr_test/db/Dockerfile b/clr_test/db/Dockerfile index 4c7c015a8..d0a81eaf0 100644 --- a/clr_test/db/Dockerfile +++ b/clr_test/db/Dockerfile @@ -1,5 +1,3 @@ FROM mirror.gcr.io/postgres:14.1-alpine -ADD DDL.sql /docker-entrypoint-initdb.d/ -ADD export.sql /docker-entrypoint-initdb.d/ -ADD test-data.sql /docker-entrypoint-initdb.d/ \ No newline at end of file +ADD data /var/lib/postgresql/data \ No newline at end of file diff --git a/clr_test/mnt/dbfout/.gitkeep b/clr_test/db/data/.gitkeep similarity index 100% rename from clr_test/mnt/dbfout/.gitkeep rename to clr_test/db/data/.gitkeep diff --git a/clr_test/docker-compose.yml b/clr_test/docker-compose.yml index 128565638..e9b91e97d 100644 --- a/clr_test/docker-compose.yml +++ b/clr_test/docker-compose.yml @@ -1,4 +1,3 @@ -version: "3" services: db: build: db @@ -8,10 +7,6 @@ services: - POSTGRES_PASSWORD=Aa111111 - POSTGRES_DB=clearing - POSTGRES_HOST_AUTH_METHOD=trust - networks: - - clearing-net - ports: - - "5433:5432" healthcheck: test: ["CMD-SHELL", "pg_isready -U clearing -h db -p 5432 -d clearing"] interval: 5s @@ -30,47 +25,32 @@ services: condition: service_healthy kafka: condition: service_started - networks: - - clearing-net - ports: - - "7010:7010" - - "5701:5701" - - "7090:7090" - - "7020:7020" - - "8080:8080" volumes: - ./mnt/results:/opt/clearing/clearing_testing_utils/store/results - - logs_volume:/opt/clearing/bin/log_artifacts + - ./mnt/logs/clearing:/opt/clearing/bin/log - ./mnt/logs/tester:/opt/clearing/clearing_testing_utils/clearing-tester/logs - ./mnt/logs/converter:/opt/clearing/clearing_testing_utils/clearing-converter/logs -# - ./mnt/dbfout:/opt/clearing/files/dbf/exporter/ + - logs_volume:/opt/clearing/bin/log_artifacts # restart: always zookeeper: image: mirror.gcr.io/confluentinc/cp-zookeeper:6.2.3.amd64 container_name: zookeeper - networks: - - clearing-net environment: ZOOKEEPER_SERVER_ID: 1 ZOOKEEPER_CLIENT_PORT: 2181 ZOOKEEPER_TICK_TIME: 2000 - ports: - - "22181:2181" kafka: image: mirror.gcr.io/confluentinc/cp-kafka:6.2.3.amd64 + attach: false container_name: kafka - networks: - - clearing-net - ports: - - "19092:9092" environment: KAFKA_BROKER_ID: 1 KAFKA_AUTO_CREATE_TOPICS_ENABLE: "true" KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181 - KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT - KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:9092,PLAINTEXT_HOST://localhost:19092 + KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT + KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:9092 KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1 KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 1 KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1 @@ -79,12 +59,8 @@ services: sftp: image: mirror.gcr.io/atmoz/sftp - networks: - - clearing-net volumes: - /opt/mfd/clr_test/upload:/home/user/upload - ports: - - "2222:22" command: user:Aa111111:1001 volumes: @@ -95,11 +71,4 @@ volumes: kafka_data: driver: local logs_volume: - driver: local - -networks: - clearing-net: - driver: bridge - ipam: - config: - - subnet: 192.168.220.0/24 + driver: local \ No newline at end of file diff --git a/clr_test/run_test_docker_containers.py b/clr_test/run_test_docker_containers.py index 686cc1a56..828761325 100644 --- a/clr_test/run_test_docker_containers.py +++ b/clr_test/run_test_docker_containers.py @@ -1,10 +1,9 @@ +import logging import os import re -import sys -import time import shutil import subprocess -import logging +import sys logging.basicConfig(level=logging.INFO, format="%(asctime)s [%(levelname)s] %(message)s") @@ -16,14 +15,24 @@ RESULT_FILES_DIR = os.environ['RESULT_FILES_DIR'] def run_docker(folder_name): - logging.info(f"Running docker-compose for {folder_name}") + logging.info(f"Preparing docker-compose for {folder_name}") os.environ['CLR_TEST_NAME'] = folder_name os.chdir("clr_test") + + logging.info("Removing all clr_test-db containers") subprocess.call('docker rm -f $(docker ps --all -q --filter ancestor=clr_test-db)', shell=True) + + logging.info("Removing all clr_test-clearing_system containers") subprocess.call('docker rm -f $(docker ps --all -q --filter ancestor=clr_test-clearing_system)', shell=True) + + logging.info("Removing all clr_test-db images") subprocess.call('docker rmi -f clr_test-db', shell=True) + + logging.info("Removing all clr_test-clearing_system images") subprocess.call('docker rmi -f clr_test-clearing_system', shell=True) - code = subprocess.call('docker compose up --abort-on-container-exit --exit-code-from clearing_system', shell=True) + + logging.info("Starting docker compose") + code = subprocess.call('docker compose up --abort-on-container-exit --exit-code-from clearing_system --build --force-recreate', shell=True) logging.info(os.listdir(f"{CLR_TEST_DIR}/mnt/results")) os.chdir("..") @@ -57,61 +66,50 @@ def remove_if_exists(filepath): if os.path.exists(filepath): os.remove(filepath) -def run_specific(index): - logging.info(f"$CI_PROJECT_DIR = {os.environ['CI_PROJECT_DIR']}") - folders = [i for i in sorted(os.listdir(DATA_ROOT_DIR)) if re.search("\\d{1,}.\\d{1,}.*", i)] + +def apply_test_case(folder: str): logging.info(f"Removing folder {CLR_TEST_DIR}/clearing-all/clearing_testing_utils/store/expected") shutil.rmtree(f"{CLR_TEST_DIR}/clearing-all/clearing_testing_utils/store/expected") logging.info(f"Removing folder {CLR_TEST_DIR}/clearing-all/clearing_testing_utils/store/input") shutil.rmtree(f"{CLR_TEST_DIR}/clearing-all/clearing_testing_utils/store/input") - logging.info(f"Removing file {CLR_TEST_DIR}/db/export.sql") - remove_if_exists(f"{CLR_TEST_DIR}/db/export.sql") + logging.info( + f"Copying files from {DATA_ROOT_DIR}/{folder}/clearing_testing_utils/ to {CLR_TEST_DIR}/clearing-all/clearing_testing_utils/") + shutil.copytree(f"{DATA_ROOT_DIR}/{folder}/clearing_testing_utils/", + f"{CLR_TEST_DIR}/clearing-all/clearing_testing_utils/", dirs_exist_ok=True) - logging.info(f"Removing file {CLR_TEST_DIR}/db/test-data.sql") - remove_if_exists(f"{CLR_TEST_DIR}/db/test-data.sql") + logging.info(f"Removing folder {CLR_TEST_DIR}/db/data") + shutil.rmtree(f"{CLR_TEST_DIR}/db/data") - logging.info(f"Copying files from {DATA_ROOT_DIR}/{folders[index]}/db/ to {CLR_TEST_DIR}/db/") - shutil.copytree(f"{DATA_ROOT_DIR}/{folders[index]}/db/", f"{CLR_TEST_DIR}/db/", dirs_exist_ok=True) + logging.info(f"Copying files from {DATA_ROOT_DIR}/{folder}/data/ to {CLR_TEST_DIR}/db/data/") + shutil.copytree(f"{DATA_ROOT_DIR}/{folder}/data", f"{CLR_TEST_DIR}/db/data", dirs_exist_ok=True) - logging.info(f"Copying files from {DATA_ROOT_DIR}/{folders[index]}/clearing_testing_utils/ to {CLR_TEST_DIR}/clearing-all/clearing_testing_utils/") - shutil.copytree(f"{DATA_ROOT_DIR}/{folders[index]}/clearing_testing_utils/", f"{CLR_TEST_DIR}/clearing-all/clearing_testing_utils/", dirs_exist_ok=True) + # logging.info(f"Removing file {CLR_TEST_DIR}/db/export.sql") + # remove_if_exists(f"{CLR_TEST_DIR}/db/export.sql") + # + # logging.info(f"Removing file {CLR_TEST_DIR}/db/test-data.sql") + # remove_if_exists(f"{CLR_TEST_DIR}/db/test-data.sql") + # + # logging.info(f"Copying files from {DATA_ROOT_DIR}/{folder}/db/ to {CLR_TEST_DIR}/db/") + # shutil.copytree(f"{DATA_ROOT_DIR}/{folder}/db/", f"{CLR_TEST_DIR}/db/", dirs_exist_ok=True) remove_files_with_extensions(".xml") - change_date(folders[index]) - run_docker(folders[index]) + # change_date(folder) + run_docker(folder) def main(): folders = [i for i in sorted(os.listdir(DATA_ROOT_DIR)) if re.search("\\d{1,}.\\d{1,}.*", i)] for folder in folders: - logging.info(f"Removing folder {CLR_TEST_DIR}/clearing-all/clearing_testing_utils/store/expected") - shutil.rmtree(f"{CLR_TEST_DIR}/clearing-all/clearing_testing_utils/store/expected") - - logging.info(f"Removing folder {CLR_TEST_DIR}/clearing-all/clearing_testing_utils/store/input") - shutil.rmtree(f"{CLR_TEST_DIR}/clearing-all/clearing_testing_utils/store/input") - - logging.info(f"Removing file {CLR_TEST_DIR}/db/export.sql") - remove_if_exists(f"{CLR_TEST_DIR}/db/export.sql") - - logging.info(f"Removing file {CLR_TEST_DIR}/db/test-data.sql") - remove_if_exists(f"{CLR_TEST_DIR}/db/test-data.sql") - - logging.info(f"Copying files from {DATA_ROOT_DIR}/{folder}/db/ to {CLR_TEST_DIR}/db/") - shutil.copytree(f"{DATA_ROOT_DIR}/{folder}/db/", f"{CLR_TEST_DIR}/db/", dirs_exist_ok=True) - - logging.info(f"Copying files from {DATA_ROOT_DIR}/{folder}/clearing_testing_utils/ to {CLR_TEST_DIR}/clearing-all/clearing_testing_utils/") - shutil.copytree(f"{DATA_ROOT_DIR}/{folder}/clearing_testing_utils/", f"{CLR_TEST_DIR}/clearing-all/clearing_testing_utils/", dirs_exist_ok=True) - remove_files_with_extensions(".xml") - change_date(folder) - run_docker(folder) + apply_test_case(folder) os.chdir("clr_test") + logging.info("Stopping docker compose") subprocess.call('docker compose down', shell=True) os.chdir("..") -if __name__=='__main__': + +if __name__ == '__main__': main() - # run_specific(6)