From 0302eb642d69030c9c0f07c160b17c735223d8d7 Mon Sep 17 00:00:00 2001 From: bertiethorpe <84867280+bertiethorpe@users.noreply.github.com> Date: Mon, 9 Sep 2024 15:32:23 +0100 Subject: [PATCH 1/8] Create extract_logs.py extract fatimage logs and process ansible timings --- dev/extract_logs.py | 72 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 dev/extract_logs.py diff --git a/dev/extract_logs.py b/dev/extract_logs.py new file mode 100644 index 000000000..f1b468cae --- /dev/null +++ b/dev/extract_logs.py @@ -0,0 +1,72 @@ +import csv +import re +import os + +def convert_time_to_seconds(time_str): + h, m, s = time_str.split(':') + return int(h) * 3600 + int(m) * 60 + float(s) + +def extract_log_info_and_generate_csv(log_file_path, output_csv_path, target_directory): + data = [] + + unwanted_chars = re.compile(r'(\x1B\[[0-9;]*m)|([^\x00-\x7F])') + + with open(log_file_path, 'r') as file: + lines = file.readlines() + + previous_task = None + + for i in range(len(lines)): + if "TASK [" in lines[i]: + task_name = lines[i].strip().split('TASK [')[1].split(']')[0] + + full_task_path = lines[i + 1].strip().split('task path: ')[1] + if target_directory in full_task_path: + start_index = full_task_path.find(target_directory) + len(target_directory) + partial_task_path = full_task_path[start_index:] + else: + partial_task_path = full_task_path + + partial_task_path = unwanted_chars.sub('', partial_task_path).strip() + + time_to_complete = lines[i + 2].strip().split('(')[1].split(')')[0] + + if previous_task: + previous_task[2] = time_to_complete # Shift the time to the previous task + data.append(previous_task) + + previous_task = [task_name, partial_task_path, None] # Placeholder for the next time_to_complete + + # Ensure the last task is also included + if previous_task: + previous_task[2] = time_to_complete if time_to_complete else 'N/A' + data.append(previous_task) + + # Convert time strings to seconds for sorting + for row in data: + if row[2] != 'N/A': + row[2] = convert_time_to_seconds(row[2]) + + # Sort the data by time (now in seconds) + data.sort(key=lambda x: x[2], reverse=True) + + # Convert times back to original string format + for row in data: + if isinstance(row[2], float): + row[2] = f'{int(row[2] // 3600):02}:{int((row[2] % 3600) // 60):02}:{row[2] % 60:.3f}' + + # Write the sorted data to a CSV file + with open(output_csv_path, 'w', newline='') as csvfile: + csvwriter = csv.writer(csvfile) + csvwriter.writerow(['Task Name', 'Task Path', 'Time to Complete']) + csvwriter.writerows(data) + + print(f"Data extracted, sorted, and saved to {output_csv_path}") + +# File paths +log_file_path = './RL9-ofed-fatimage-177.txt' +output_csv_path = 'RL9-ofed-fatimage-177.csv' +target_directory = '/ansible/' + +# Run the function +extract_log_info_and_generate_csv(log_file_path, output_csv_path, target_directory) From 415cc59528e0456bb6d9abfd78bb9a2d80dc0813 Mon Sep 17 00:00:00 2001 From: bertiethorpe <84867280+bertiethorpe@users.noreply.github.com> Date: Mon, 9 Sep 2024 15:36:45 +0100 Subject: [PATCH 2/8] Update extract_logs.py --- dev/extract_logs.py | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/dev/extract_logs.py b/dev/extract_logs.py index f1b468cae..0f73c616b 100644 --- a/dev/extract_logs.py +++ b/dev/extract_logs.py @@ -37,36 +37,29 @@ def extract_log_info_and_generate_csv(log_file_path, output_csv_path, target_dir previous_task = [task_name, partial_task_path, None] # Placeholder for the next time_to_complete - # Ensure the last task is also included if previous_task: previous_task[2] = time_to_complete if time_to_complete else 'N/A' data.append(previous_task) - # Convert time strings to seconds for sorting for row in data: if row[2] != 'N/A': row[2] = convert_time_to_seconds(row[2]) - # Sort the data by time (now in seconds) data.sort(key=lambda x: x[2], reverse=True) - # Convert times back to original string format for row in data: if isinstance(row[2], float): row[2] = f'{int(row[2] // 3600):02}:{int((row[2] % 3600) // 60):02}:{row[2] % 60:.3f}' - # Write the sorted data to a CSV file with open(output_csv_path, 'w', newline='') as csvfile: csvwriter = csv.writer(csvfile) csvwriter.writerow(['Task Name', 'Task Path', 'Time to Complete']) csvwriter.writerows(data) print(f"Data extracted, sorted, and saved to {output_csv_path}") + +log_file_path = './RL9-ofed-fatimage-177.txt' # Input workflow log name +output_csv_path = 'RL9-ofed-fatimage-177.csv' # Output CSV name +target_directory = '/ansible/' # Shared directory for task path -# File paths -log_file_path = './RL9-ofed-fatimage-177.txt' -output_csv_path = 'RL9-ofed-fatimage-177.csv' -target_directory = '/ansible/' - -# Run the function extract_log_info_and_generate_csv(log_file_path, output_csv_path, target_directory) From ba60b0c01ef7921cfdfdeb3a0c44ab785f1f6788 Mon Sep 17 00:00:00 2001 From: sd109 Date: Mon, 9 Sep 2024 16:11:38 +0100 Subject: [PATCH 3/8] Ignore irrelevant paths in workflow trigger --- .github/workflows/stackhpc.yml | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/.github/workflows/stackhpc.yml b/.github/workflows/stackhpc.yml index 711d24c21..cd4fd7d83 100644 --- a/.github/workflows/stackhpc.yml +++ b/.github/workflows/stackhpc.yml @@ -5,7 +5,17 @@ on: push: branches: - main + paths-ignore: + - dev/** + - docs/** + - README.md + - .gitignore pull_request: + paths-ignore: + - dev/** + - docs/** + - README.md + - .gitignore jobs: openstack: name: openstack-ci @@ -39,11 +49,11 @@ jobs: echo "${{ secrets[format('{0}_SSH_KEY', vars.CI_CLOUD)] }}" > ~/.ssh/id_rsa chmod 0600 ~/.ssh/id_rsa shell: bash - + - name: Add bastion's ssh key to known_hosts run: cat environments/.stackhpc/bastion_fingerprints >> ~/.ssh/known_hosts shell: bash - + - name: Install ansible etc run: dev/setup-env.sh @@ -51,11 +61,11 @@ jobs: uses: opentofu/setup-opentofu@v1 with: tofu_version: 1.6.2 - + - name: Initialise terraform run: terraform init working-directory: ${{ github.workspace }}/environments/.stackhpc/terraform - + - name: Write clouds.yaml run: | mkdir -p ~/.config/openstack/ @@ -111,14 +121,14 @@ jobs: run: | . venv/bin/activate . environments/.stackhpc/activate - + # load ansible variables into shell: ansible-playbook ansible/ci/output_vars.yml \ -e output_vars_hosts=openondemand \ -e output_vars_path=$APPLIANCES_ENVIRONMENT_ROOT/vars.txt \ -e output_vars_items=bastion_ip,bastion_user,openondemand_servername source $APPLIANCES_ENVIRONMENT_ROOT/vars.txt - + # setup ssh proxying: sudo apt-get --yes install proxychains echo proxychains installed @@ -155,7 +165,7 @@ jobs: # ansible login -v -a "sudo scontrol reboot ASAP nextstate=RESUME reason='rebuild image:${{ steps.packer_build.outputs.NEW_COMPUTE_IMAGE_ID }}' ${TF_VAR_cluster_name}-compute-[0-3]" # ansible compute -m wait_for_connection -a 'delay=60 timeout=600' # delay allows node to go down # ansible-playbook -v ansible/ci/check_slurm.yml - + - name: Test reimage of login and control nodes (via rebuild adhoc) run: | . venv/bin/activate @@ -164,7 +174,7 @@ jobs: ansible all -m wait_for_connection -a 'delay=60 timeout=600' # delay allows node to go down ansible-playbook -v ansible/site.yml ansible-playbook -v ansible/ci/check_slurm.yml - + - name: Check sacct state survived reimage run: | . venv/bin/activate From a96f3cc9036e3874da92be2014747875f8df8bc3 Mon Sep 17 00:00:00 2001 From: bertiethorpe <84867280+bertiethorpe@users.noreply.github.com> Date: Mon, 16 Sep 2024 09:37:23 +0100 Subject: [PATCH 4/8] Update extract_logs.py --- dev/extract_logs.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/dev/extract_logs.py b/dev/extract_logs.py index 0f73c616b..af30f74d0 100644 --- a/dev/extract_logs.py +++ b/dev/extract_logs.py @@ -1,6 +1,10 @@ + + + import csv import re import os +import sys def convert_time_to_seconds(time_str): h, m, s = time_str.split(':') @@ -58,8 +62,11 @@ def extract_log_info_and_generate_csv(log_file_path, output_csv_path, target_dir print(f"Data extracted, sorted, and saved to {output_csv_path}") -log_file_path = './RL9-ofed-fatimage-177.txt' # Input workflow log name -output_csv_path = 'RL9-ofed-fatimage-177.csv' # Output CSV name +if len(sys.argv) != 2: + print("Path to workflow log plain text file should be provided as the only arg to this script") + sys.exit(1) +log_file_path = sys.argv[1] # Input workflow log name +output_csv_path = log_file_path.replace('.txt.', '.csv') # Output CSV name target_directory = '/ansible/' # Shared directory for task path extract_log_info_and_generate_csv(log_file_path, output_csv_path, target_directory) From c4ad768ba03bbdf6c0aa21991f572a61e9efc39d Mon Sep 17 00:00:00 2001 From: bertiethorpe <84867280+bertiethorpe@users.noreply.github.com> Date: Mon, 16 Sep 2024 09:47:18 +0100 Subject: [PATCH 5/8] Update extract_logs.py --- dev/extract_logs.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/dev/extract_logs.py b/dev/extract_logs.py index af30f74d0..91923f1a0 100644 --- a/dev/extract_logs.py +++ b/dev/extract_logs.py @@ -1,5 +1,15 @@ +#!/usr/bin/env python +""" +Process packer build workflow logs into CSV. Useful for timing +dissemination. +Usage: + extract_logs.py + +Where logs.txt is the name of the workflow log downloaded. +It will list task name, against task directory path, against time to complete. +""" import csv import re From 9fd5db88ec1ec412e117f571afe65fc97bd8073c Mon Sep 17 00:00:00 2001 From: bertiethorpe <84867280+bertiethorpe@users.noreply.github.com> Date: Mon, 16 Sep 2024 09:56:58 +0100 Subject: [PATCH 6/8] Update stackhpc.yml --- .github/workflows/stackhpc.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/stackhpc.yml b/.github/workflows/stackhpc.yml index cd4fd7d83..880b94ffc 100644 --- a/.github/workflows/stackhpc.yml +++ b/.github/workflows/stackhpc.yml @@ -7,12 +7,14 @@ on: - main paths-ignore: - dev/** + - !dev/setup-env.sh - docs/** - README.md - .gitignore pull_request: paths-ignore: - dev/** + - !dev/setup-env.sh - docs/** - README.md - .gitignore From c3f49c9b0ac6d2939d5927097a71389687672f6e Mon Sep 17 00:00:00 2001 From: bertiethorpe <84867280+bertiethorpe@users.noreply.github.com> Date: Mon, 16 Sep 2024 11:53:40 +0100 Subject: [PATCH 7/8] Update stackhpc.yml --- .github/workflows/stackhpc.yml | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/.github/workflows/stackhpc.yml b/.github/workflows/stackhpc.yml index 880b94ffc..ac96b9571 100644 --- a/.github/workflows/stackhpc.yml +++ b/.github/workflows/stackhpc.yml @@ -5,19 +5,21 @@ on: push: branches: - main - paths-ignore: - - dev/** - - !dev/setup-env.sh - - docs/** - - README.md - - .gitignore + paths: + - ** + - !dev/** + - dev/setup-env.sh + - !docs/** + - !README.md + - !.gitignore pull_request: - paths-ignore: - - dev/** - - !dev/setup-env.sh - - docs/** - - README.md - - .gitignore + paths: + - ** + - !dev/** + - dev/setup-env.sh + - !docs/** + - !README.md + - !.gitignore jobs: openstack: name: openstack-ci From a090ce9e55d68b0d5094a1303b3cb46f2f12b225 Mon Sep 17 00:00:00 2001 From: bertiethorpe <84867280+bertiethorpe@users.noreply.github.com> Date: Mon, 16 Sep 2024 11:57:18 +0100 Subject: [PATCH 8/8] Update stackhpc.yml --- .github/workflows/stackhpc.yml | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/.github/workflows/stackhpc.yml b/.github/workflows/stackhpc.yml index ac96b9571..52856a18f 100644 --- a/.github/workflows/stackhpc.yml +++ b/.github/workflows/stackhpc.yml @@ -6,20 +6,20 @@ on: branches: - main paths: - - ** - - !dev/** - - dev/setup-env.sh - - !docs/** - - !README.md - - !.gitignore + - '**' + - '!dev/**' + - 'dev/setup-env.sh' + - '!docs/**' + - '!README.md' + - '!.gitignore' pull_request: paths: - - ** - - !dev/** - - dev/setup-env.sh - - !docs/** - - !README.md - - !.gitignore + - '**' + - '!dev/**' + - 'dev/setup-env.sh' + - '!docs/**' + - '!README.md' + - '!.gitignore' jobs: openstack: name: openstack-ci