"""Workarounds for TMC"""
import logging
from ska_control_model import ObsState
from tango import DeviceProxy
from ska_oso_scripting.engineering.low.utils.aiv_utils import (
get_mccs_devices,
get_tmc_devices,
)
from ska_oso_scripting.engineering.low.utils.tango_utils import member, wait_for
__all__ = [
"check_mccs_subarray_leaf_node_obsstate",
]
LOG = logging.getLogger(__name__)
[docs]
def check_mccs_subarray_leaf_node_obsstate(subarray_id: int):
"""
Restart MCCS subarray leaf node if it's out of sync with MCCS subarray.
This should be called after AssignResources is issued, as it will wait for
MCCS to reach IDLE.
See https://jira.skatelescope.org/browse/SKB-997.
"""
mccs = get_mccs_devices()
tmc = get_tmc_devices()
[leaf_node] = (
dev for dev in tmc.mccs_subarray_leafnodes if int(member(dev)) == subarray_id
)
[mccs_subarray] = (dev for dev in mccs.subarrays if int(member(dev)) == subarray_id)
# Give TMC leaf node ten seconds to reach IDLE after MCCS subarray has
wait_for(mccs_subarray, "obsState", ObsState.IDLE)
try:
wait_for(leaf_node, "obsState", ObsState.IDLE, timeout=10)
except ValueError:
LOG.warning(
f"SKB-997: {leaf_node.dev_name()} not reflecting MCCS ObsState updates. "
"Restarting it."
)
leaf_node_ds = DeviceProxy(leaf_node.adm_name())
leaf_node_ds.RestartServer()
wait_for(leaf_node, "obsState", ObsState.IDLE)