diff --git a/charms/slurmctld/charmcraft.yaml b/charms/slurmctld/charmcraft.yaml index 3f58b65..ecfaaf5 100644 --- a/charms/slurmctld/charmcraft.yaml +++ b/charms/slurmctld/charmcraft.yaml @@ -36,6 +36,10 @@ provides: interface: cos_agent limit: 1 +peers: + slurmctld-peer: + interface: slurmctld-peer + assumes: - juju diff --git a/charms/slurmctld/src/charm.py b/charms/slurmctld/src/charm.py index 80ffea3..59b51cb 100755 --- a/charms/slurmctld/src/charm.py +++ b/charms/slurmctld/src/charm.py @@ -9,7 +9,8 @@ import subprocess from typing import Any, Dict, List, Optional, Union -from constants import CHARM_MAINTAINED_SLURM_CONF_PARAMETERS +from constants import CHARM_MAINTAINED_SLURM_CONF_PARAMETERS, PEER_RELATION +from exceptions import IngressAddressUnavailableError from interface_slurmd import ( PartitionAvailableEvent, PartitionUnavailableEvent, @@ -303,7 +304,7 @@ def _assemble_slurmctld_parameters() -> dict[str, Any]: slurm_conf = SlurmConfig( ClusterName=self._cluster_name, - SlurmctldAddr=self._slurmd_ingress_address, + SlurmctldAddr=self._ingress_address, SlurmctldHost=[self._slurmctld.hostname], SlurmctldParameters=_assemble_slurmctld_parameters(), ProctrackType="proctrack/linuxproc" if is_container() else "proctrack/cgroup", @@ -403,12 +404,13 @@ def hostname(self) -> str: return self._slurmctld.hostname @property - def _slurmd_ingress_address(self) -> str: - """Return the ingress_address from the slurmd relation if it exists.""" - ingress_address = "" - if binding := self.model.get_binding("slurmd"): - ingress_address = f"{binding.network.ingress_address}" - return ingress_address + def _ingress_address(self) -> str: + """Return the ingress_address from the peer relation if it exists.""" + if (peer_binding := self.model.get_binding(PEER_RELATION)) is not None: + ingress_address = f"{peer_binding.network.ingress_address}" + logger.debug(f"Slurmctld ingress_address: {ingress_address}") + return ingress_address + raise IngressAddressUnavailableError("Ingress address unavailable") @property def slurm_installed(self) -> bool: diff --git a/charms/slurmctld/src/constants.py b/charms/slurmctld/src/constants.py index b9334b5..91acce1 100644 --- a/charms/slurmctld/src/constants.py +++ b/charms/slurmctld/src/constants.py @@ -3,6 +3,8 @@ """This module provides constants for the slurmctld-operator charm.""" +PEER_RELATION = "slurmctld-peer" + CHARM_MAINTAINED_SLURM_CONF_PARAMETERS = { "AuthAltParameters": {"jwt_key": "/var/lib/slurm/checkpoint/jwt_hs256.key"}, "AuthAltTypes": ["auth/jwt"], diff --git a/charms/slurmctld/src/exceptions.py b/charms/slurmctld/src/exceptions.py new file mode 100644 index 0000000..472c28f --- /dev/null +++ b/charms/slurmctld/src/exceptions.py @@ -0,0 +1,13 @@ +# Copyright (c) 2024 Omnivector Corp +# See LICENSE file for licensing details. + +"""Custom exceptions for the slurmctld operator.""" + + +class IngressAddressUnavailableError(Exception): + """Exception raised when a slurm operation failed.""" + + @property + def message(self) -> str: + """Return message passed as argument to exception.""" + return self.args[0] diff --git a/charms/slurmctld/tests/unit/test_charm.py b/charms/slurmctld/tests/unit/test_charm.py index 3f886ef..29fc2bc 100644 --- a/charms/slurmctld/tests/unit/test_charm.py +++ b/charms/slurmctld/tests/unit/test_charm.py @@ -160,6 +160,7 @@ def test_on_slurmdbd_unavailable(self) -> None: def test_get_user_supplied_parameters(self, *_) -> None: """Test that user supplied parameters are parsed correctly.""" self.harness.add_relation("slurmd", "slurmd") + self.harness.add_relation("slurmctld-peer", self.harness.charm.app.name) self.harness.update_config( {"slurm-conf-parameters": "JobAcctGatherFrequency=task=30,network=40"} )