Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add role for updating meta information of CVMFS servers and repositories #161

Merged
merged 13 commits into from
Nov 6, 2023
13 changes: 12 additions & 1 deletion inventory/group_vars/all.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
eessi_cvmfs_repos_enabled: true

# Email address for the project.
eessi_email: [email protected]
eessi_email: [email protected]

#
# Defaults for eessi-hpc.org repos.
Expand Down Expand Up @@ -87,6 +87,7 @@ eessi_cvmfs_repositories:
- CVMFS_GARBAGE_COLLECTION=true
client_options: []
use_for_ci: false
description: Repository containing pilot versions of the EESSI software stack.
- repository: data.eessi-hpc.org
stratum0: rug-nl.stratum0.cvmfs.eessi-infra.org
owner: "{{ cvmfs_repo_owner | default('root') }}"
Expand All @@ -97,6 +98,7 @@ eessi_cvmfs_repositories:
- CVMFS_GARBAGE_COLLECTION=true
client_options: []
use_for_ci: false
description: "Data files used for applications available in the EESSI stack."
- repository: ci.eessi-hpc.org
stratum0: rug-nl.stratum0.cvmfs.eessi-infra.org
owner: "{{ cvmfs_repo_owner | default('root') }}"
Expand All @@ -106,6 +108,15 @@ eessi_cvmfs_repositories:
- CVMFS_GARBAGE_COLLECTION=true
client_options: []
use_for_ci: true
description: "Small-sized repository used for CI purposes."

# Meta information for CVMFS Stratum servers
cvmfs_server_meta_administrator: "EESSI CVMFS Administrators"
cvmfs_server_meta_email: "{{ eessi_email }}"
cvmfs_server_meta_organisation: "EESSI"
cvmfs_server_meta_custom:
_comment: "See https://eessi.io/docs/ for more information about the EESSI repository."
cvmfs_server_meta_website: "https://eessi.io"

# Override all the Galaxy defaults by our EESSI defaults.
# This is required, beucase the galaxy_* variables are used inside the Ansible tasks.
Expand Down
18 changes: 18 additions & 0 deletions roles/cvmfs_server_meta_info/defaults/main.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
---
cvmfs_server_meta:
administrator: "{{ cvmfs_server_meta_administrator | default('Your Name') }}"
email: "{{ cvmfs_server_meta_email | default('[email protected]') }}"
organisation: "{{ cvmfs_server_meta_organisation | default('Your Organisation') }}"
custom: "{{ cvmfs_server_meta_custom | default({'_comment': 'Put arbitrary structured data here'}) }}"

cvmfs_repo_meta:
administrator: "{{ cvmfs_server_meta_administrator | default('Your Name') }}"
email: "{{ cvmfs_server_meta_email | default('[email protected]') }}"
organisation: "{{ cvmfs_server_meta_organisation | default('Your Organisation') }}"
description: "Repository content"
url: "{{ cvmfs_server_meta_website | default('Project website') }}"
recommended-stratum0: "stratum 0 url"
recommended-stratum1s: ["stratum1 url", "stratum1 url"]

custom: "{{ cvmfs_server_meta_custom | default({'_comment': 'Put arbitrary structured data here'}) }}"
...
22 changes: 22 additions & 0 deletions roles/cvmfs_server_meta_info/tasks/main.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
---
- name: Create a meta.json containing the CVMFS Server Meta Information
ansible.builtin.copy:
content: "{{ cvmfs_server_meta | to_nice_json(indent=2, sort_keys=false) }}"
dest: "{{ cvmfs_srv_mount }}/cvmfs/info/v1/meta.json"
owner: root
group: root
mode: 0644
become: true

- name: Create meta information for each CVMFS repository
ansible.builtin.include_tasks: repo_meta_info.yml
vars:
this_cvmfs_repo: "{{ item }}"
this_cvmfs_repo_meta:
description: "{{ item.description | default(omit) }}"
recommended-stratum0: "http://{{ item.stratum0 }}/cvmfs/{{ item.repository }}"
recommended-stratum1s: "{{ eessi_cvmfs_server_urls | selectattr('domain', 'in', item.repository) |
map(attribute='urls') | map('regex_replace', '@fqrn@', item.repository) }}"
with_items: "{{ eessi_cvmfs_repositories }}"
when: "'cvmfsstratum0servers' in group_names or cvmfs_role == 'stratum0'"
...
35 changes: 35 additions & 0 deletions roles/cvmfs_server_meta_info/tasks/repo_meta_info.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
---
- name: Create temporary file for storing json
ansible.builtin.tempfile:
state: file
suffix: .json
register: tmp_json_file

- name: Add meta information for repository to temporary json file
ansible.builtin.copy:
content: "{{ cvmfs_repo_meta | combine(this_cvmfs_repo_meta) | to_nice_json(indent=2, sort_keys=false) }}"
dest: "{{ tmp_json_file.path }}"
mode: 0644

- name: Calculate the checksum of the json file
ansible.builtin.stat:
path: "{{ tmp_json_file.path }}"
register: json_file_stat

- name: Get the current meta information of this repository from the server
ansible.builtin.command:
cmd: "cvmfs_swissknife info -M -r {{ this_cvmfs_repo_meta['recommended-stratum0'] }}"
changed_when: false
register: current_repo_meta

- name: Update the repository's meta information
ansible.builtin.command:
cmd: "cvmfs_server update-repoinfo -f {{ tmp_json_file.path }} {{ this_cvmfs_repo.repository }}"
when: (current_repo_meta.stdout | checksum) != json_file_stat.stat.checksum
become_user: "{{ cvmfs_repo_owner }}"

- name: Remove temporary json file
ansible.builtin.file:
path: "{{ tmp_json_file.path }}"
state: absent
...
2 changes: 2 additions & 0 deletions stratum0.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,3 +16,5 @@
- role: geerlingguy.repo-epel
when: ansible_facts['os_family'] == 'RedHat'
- galaxyproject.cvmfs
- cvmfs_server_meta_info
...
2 changes: 2 additions & 0 deletions stratum1.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,3 +17,5 @@
- role: geerlingguy.repo-epel
when: ansible_facts['os_family'] == 'RedHat'
- galaxyproject.cvmfs
- cvmfs_server_meta_info
...