""" PropagationCommand module This command gets all the elements that exist under a given site and applies the following logic: if even one element is 'Active' for the given site then it marks the site as 'Active', if all elements are set in a different status (like banned or error) then it marks the site as 'Banned' """ from __future__ import absolute_import from __future__ import division from __future__ import print_function __RCSID__ = "45ddde113 (2021-10-01 11:19:55 +0200) Chris Burr " from DIRAC import S_OK, S_ERROR from DIRAC.ResourceStatusSystem.Client.ResourceStatusClient import ResourceStatusClient from DIRAC.ResourceStatusSystem.Command.Command import Command from DIRAC.ResourceStatusSystem.Utilities import CSHelpers class PropagationCommand(Command): def __init__(self, args=None, clients=None): self.rssClient = ResourceStatusClient() super(PropagationCommand, self).__init__(args, clients) def doNew(self, masterParams=None): return S_OK() def doCache(self): if not self.args["name"]: return S_ERROR("site was not found in args") site = self.args["name"] elements = CSHelpers.getSiteElements(site) statusList = [] if elements["OK"]: for element in elements["Value"]: status = self.rssClient.selectStatusElement("Resource", "Status", element, meta={"columns": ["Status"]}) if not status["OK"]: return status if status["Value"]: statusList.append(status["Value"][0][0]) else: # forcing in the case the resource has no status (yet) statusList.append("Active") if "Active" in statusList: return S_OK({"Status": "Active", "Reason": "An element that belongs to the site is Active"}) if "Degraded" in statusList: return S_OK({"Status": "Degraded", "Reason": "An element that belongs to the site is Degraded"}) return S_OK({"Status": "Banned", "Reason": "There is no Active element in the site"}) def doMaster(self): return S_OK()