---

# Slurm ansible playbook for Cray systems
# Copyright 2017 Cray Inc. All Rights Reserved.
#
# Licensed under the GPL. See 'LICENSE.OpenSSL'.

- hosts: localhost

  vars:
    run_after:
      - common
      - compute_node
      - node_health
      - persistent_data
      - simple_sync

    atp_spank_plugin:       /opt/cray/pe/atp/libAtpSLaunch.so
    mcgroup_hierarchy_file: /sys/fs/cgroup/memory/memory.use_hierarchy
    slurm_default_dir:      /opt/slurm/default
    slurmctld_spooldir:     /var/spool/slurm
    slurmd_spooldir:        /var/spool/slurmd
    slurm_sysconfdir:       /etc/opt/slurm

  handlers:
    - name: Run ldconfig
      command: /sbin/ldconfig

  tasks:
    - name: Determine scontrol path
      shell: source /opt/modules/default/init/sh; module load slurm; which scontrol
      register: scontrol
      ignore_errors: true

    - name: Determine Slurm prefix
      shell: dirname $(dirname {{ scontrol.stdout }})
      register: prefix
      when: scontrol.rc == 0 and scontrol.stdout != ''

    # Some Cray software depends on the link
    # /opt/slurm/default -> Slurm prefix
    - name: Create /opt/slurm directory
      file: path=/opt/slurm owner=root group=root mode=0755 state=directory

    - name: Link Slurm default directory
      file: path={{ slurm_default_dir }} src={{ prefix.stdout }} state=link
      when: prefix.stdout is defined and prefix.stdout != ''

    - name: Add Slurm library directories to ld cache
      lineinfile:
        dest=/etc/ld.so.conf.d/slurm.conf
        line="{{ item }}"
        create=yes backup=yes owner=root mode=0644
      with_items:
        - "{{ slurm_default_dir }}/lib64"
        - "{{ slurm_default_dir }}/lib64/slurm"
      notify:
        - Run ldconfig

    - name: Determine Slurm daemons to run on this node
      command: "{{ scontrol.stdout }} show daemons"
      register: slurm_daemons
      ignore_errors: true
      when: scontrol.rc == 0 and scontrol.stdout != ''

    # Set hierarchical cgroups to silence console warning
    - name: Determine memory cgroup hierarchy availability
      stat: path={{ mcgroup_hierarchy_file }}
      register: hierarchy

    - name: Set memory control group hierarchy option
      shell: echo 1 >{{ mcgroup_hierarchy_file }}
      when: slurm_daemons.stdout is defined
        and "slurmd" in slurm_daemons.stdout
        and hierarchy.stat.exists

    - name: Create slurmd spool directory
      file: name={{ slurmd_spooldir }} state=directory owner=root mode=0755
      when: slurm_daemons.stdout is defined
        and "slurmd" in slurm_daemons.stdout

    - name: Create slurmctld spool directory
      file: path={{ slurmctld_spooldir }} state=directory owner=root mode=0755
      when: slurm_daemons.stdout is defined
        and "slurmctld" in slurm_daemons.stdout

    - name: Determine sysconfdir availability
      stat: path={{ slurm_sysconfdir }}
      register: sysconfdir

    # Remove this task if Cray PE is not installed on the system
    - name: Configure ATP SPANK plugin
      lineinfile:
        dest={{ slurm_sysconfdir }}/plugstack.conf
        line="optional {{ atp_spank_plugin }}"
        regexp={{ atp_spank_plugin }}
        create=yes backup=yes owner=root mode=0644
      when: sysconfdir.stat.exists and sysconfdir.stat.isdir

    # Disable Slurm so it's started by cray-ansible, not systemd
    - name: Disable Slurm systemd startup
      file: path={{ item }} state=absent
      with_items:
        - /usr/lib/systemd/system/multi-user.target.wants/slurmd.service
        - /usr/lib/systemd/system/multi-user.target.wants/slurmctld.service

    - name: Start slurmctld
      service: name=slurmctld state=started
      when: slurm_daemons.stdout is defined
        and "slurmctld" in slurm_daemons.stdout
        and not ansible_local.cray_system.in_init

    - name: Start slurmd
      service: name=slurmd state=started
      when: slurm_daemons.stdout is defined
        and "slurmd" in slurm_daemons.stdout
        and not ansible_local.cray_system.in_init
