diff --git a/data/common/common.yaml b/data/common/common.yaml --- a/data/common/common.yaml +++ b/data/common/common.yaml @@ -2554,6 +2554,8 @@ swh::deploy::worker::loader_opam::user: swhworker swh::deploy::worker::loader_opam::group: swhworker swh::deploy::worker::opam::root_directory: /tmp/opam/ + +# Keep opam.ocaml.org entry as the first one which is the default repository swh::deploy::worker::opam::instances: opam.ocaml.org: https://opam.ocaml.org coq.inria.fr: https://coq.inria.fr/opam/released diff --git a/site-modules/profile/manifests/swh/deploy/worker/loader_opam.pp b/site-modules/profile/manifests/swh/deploy/worker/loader_opam.pp --- a/site-modules/profile/manifests/swh/deploy/worker/loader_opam.pp +++ b/site-modules/profile/manifests/swh/deploy/worker/loader_opam.pp @@ -26,35 +26,75 @@ $opam_root = lookup('swh::deploy::worker::opam::root_directory') $opam_manage_shared_state = "opam-manage-shared-state" + + $default_systemd_path = "/etc/systemd/system" + + # clean up previous versions of the opam maintenance routine + $opam_manage_state_script = "/usr/local/bin/${opam_manage_shared_state}.sh" file {$opam_manage_state_script: - ensure => 'file', - owner => $user, - group => $group, - mode => '0755', - content => template("${template_path}/${opam_manage_shared_state}.sh.erb"), + ensure => 'absent', + } + + each ( $opam_instances ) | $instance, $instance_url | { + $opam_manage_service_name = "${opam_manage_shared_state}-${instance}" + $opam_manage_service_path = "${default_systemd_path}/${$opam_manage_service_name}.service" + $opam_manage_shared_state_timer_name = $opam_manage_service_name + $opam_manage_shared_state_timer_path = "${default_systemd_path}/${opam_manage_shared_state_timer_name}.timer" + + # deactivate timer + ::systemd::timer { "${opam_manage_shared_state_timer_name}.timer": + enable => false, + ensure => absent, + } + } + + $runparts_systemd_directory = "/run/systemd/system/opam/" + file {$runparts_systemd_directory: + ensure => directory, + owner => $name, + group => $group, + mode => '0600', } + $priority = 0 each ( $opam_instances ) | $instance, $instance_url | { - $opam_manage_service_name = "${$opam_manage_shared_state}-${instance}" - $opam_manage_shared_state_timer_name = "${opam_manage_service_name}.timer" - - # Templates uses variables - # - $user - # - $group - # - $opam_root - # - $opam_manage_service_name - # - $command - - ::systemd::timer { $opam_manage_shared_state_timer_name: - timer_content => template("${template_path}/${opam_manage_shared_state}.timer.erb"), - service_content => template("${template_path}/${opam_manage_shared_state}.service.erb"), - enable => true, + $om_instance_script_name = "${priority}-${opam_manage_shared_state}-${instance}.sh" + $priority = $priority + 1 + $om_instance_script_path = "${runparts_systemd_directory}/${$om_instance_script_name}.sh" + + $template_script = $instance ? { + 'opam.ocaml.org' => 'opam-manage-shared-state-default-instance.sh', + default => 'opam-manage-shared-state-secondary.sh' + } + + file {$om_instance_script_path: + ensure => 'file', + owner => $user, + group => $group, + mode => '0755', + content => template("${template_path}/${template_script}.erb"), require => [ Package[$packages], - File[$opam_manage_state_script], + File[$runparts_systemd_directory], ], } } + # Templates uses variables + # - $user + # - $group + # - $runparts_systemd_directory + # - $opam_manage_service_name + + ::systemd::timer { "${opam_manage_shared_state}.timer": + timer_content => template("${template_path}/${opam_manage_shared_state}.timer.erb"), + service_content => template("${template_path}/${opam_manage_shared_state}.service.erb"), + enable => true, + require => [ + Package[$packages], + File[$runparts_systemd_directory], + ], + } + } diff --git a/site-modules/profile/templates/swh/deploy/loader_opam/opam-manage-shared-state-default-instance.sh.erb b/site-modules/profile/templates/swh/deploy/loader_opam/opam-manage-shared-state-default-instance.sh.erb new file mode 100644 --- /dev/null +++ b/site-modules/profile/templates/swh/deploy/loader_opam/opam-manage-shared-state-default-instance.sh.erb @@ -0,0 +1,19 @@ +#!/usr/bin/env bash + +# Managed by puppet class profile::swh::deploy::worker::loader_opam +# Changes will be overwritten + +# This script is in charge of bootstraping the opam root folder with the default opam +# repository. + +set -e + +CMD=/usr/bin/opam +ROOT_DIR=<%= @opam_root %> +INSTANCE=<%= @instance %> +INSTANCE_URL=<%= @instance_url %> + +# Opam instance is considered the main instance so we must initialize the repository +# if not present, otherwise we update it +( $CMD repo --all --root $ROOT_DIR | grep $INSTANCE_URL && $CMD update --root $ROOT_DIR ) \ + || $CMD init --reinit --bare --no-setup --root $ROOT_DIR $INSTANCE $INSTANCE_URL diff --git a/site-modules/profile/templates/swh/deploy/loader_opam/opam-manage-shared-state-secondary.sh.erb b/site-modules/profile/templates/swh/deploy/loader_opam/opam-manage-shared-state-secondary.sh.erb new file mode 100644 --- /dev/null +++ b/site-modules/profile/templates/swh/deploy/loader_opam/opam-manage-shared-state-secondary.sh.erb @@ -0,0 +1,19 @@ +#!/usr/bin/env bash + +# Managed by puppet class profile::swh::deploy::worker::loader_opam +# Changes will be overwritten + +# This script is in charge of adding (or updating) secondary opam repositories. +# It's expected to be called after the script which bootstrap the opam root folder. + +set -e + +CMD=/usr/bin/opam +ROOT_DIR=<%= @opam_root %> +INSTANCE=<%= @instance %> +INSTANCE_URL=<%= @instance_url %> + +# Other instances, if present should be updated. If not present, they should be added +# to the main root_dir as extra instances +( $CMD repo --all --root $ROOT_DIR | grep $INSTANCE_URL && $CMD update --root $ROOT_DIR ) \ + || $CMD repository add --root $ROOT_DIR $INSTANCE $INSTANCE_URL diff --git a/site-modules/profile/templates/swh/deploy/loader_opam/opam-manage-shared-state.service.erb b/site-modules/profile/templates/swh/deploy/loader_opam/opam-manage-shared-state.service.erb --- a/site-modules/profile/templates/swh/deploy/loader_opam/opam-manage-shared-state.service.erb +++ b/site-modules/profile/templates/swh/deploy/loader_opam/opam-manage-shared-state.service.erb @@ -3,7 +3,7 @@ # Changes will be overwritten [Unit] -Description=Software Heritage Manage OPAM shared state (<%= @instance %>) +Description=Software Heritage Manage OPAM shared state Requires=network.target After=network.target @@ -11,7 +11,7 @@ User=<%= @user %> Group=<%= @group %> Type=simple -ExecStart=/usr/local/bin/opam-manage-shared-state.sh <%= @instance %> <%= @instance_url %> +ExecStart=/usr/bin/run-parts <%= @runparts_systemd_directory %> [Install] WantedBy=multi-user.target diff --git a/site-modules/profile/templates/swh/deploy/loader_opam/opam-manage-shared-state.sh.erb b/site-modules/profile/templates/swh/deploy/loader_opam/opam-manage-shared-state.sh.erb deleted file mode 100644 --- a/site-modules/profile/templates/swh/deploy/loader_opam/opam-manage-shared-state.sh.erb +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env bash - -# Managed by puppet class profile::swh::deploy::worker::loader_opam -# Changes will be overwritten - -CMD=/usr/bin/opam -ROOT_DIR=<%= @opam_root %> -DEFAULT_INSTANCE="opam.ocaml.org" -INSTANCE=$1 -INSTANCE_URL=$2 - -if [ $INSTANCE = $DEFAULT_INSTANCE ]; then - # Opam instance is considered the main instance so we must initialize the repository - # if not present, otherwise we update it - ( $CMD repo --all --root $ROOT_DIR | grep $INSTANCE_URL && $CMD update --root $ROOT_DIR ) \ - || $CMD init --reinit --bare --no-setup --root $ROOT_DIR $INSTANCE $INSTANCE_URL -else - # Other instances, if present should be updated. If not present, they should be added - # to the main root_dir as extra instances - ( $CMD repo --all --root $ROOT_DIR | grep $INSTANCE_URL && $CMD update --root $ROOT_DIR ) \ - || $CMD repository add --root $ROOT_DIR $INSTANCE $INSTANCE_URL -fi diff --git a/site-modules/profile/templates/swh/deploy/loader_opam/opam-manage-shared-state.timer.erb b/site-modules/profile/templates/swh/deploy/loader_opam/opam-manage-shared-state.timer.erb --- a/site-modules/profile/templates/swh/deploy/loader_opam/opam-manage-shared-state.timer.erb +++ b/site-modules/profile/templates/swh/deploy/loader_opam/opam-manage-shared-state.timer.erb @@ -8,4 +8,4 @@ Unit=<%= @opam_manage_service_name %>.service [Unit] -Description=Software Heritage Manage OPAM shared state (<%= @instance %>) timer +Description=Software Heritage Manage OPAM shared state timer