package org.dcache.services.info.gathers.poolmanager;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import dmg.cells.nucleus.CellMessageAnswerable;
import dmg.cells.nucleus.EnvironmentAware;
import dmg.cells.nucleus.Environments;
import dmg.cells.nucleus.UOID;
import org.dcache.services.info.base.StateExhibitor;
import org.dcache.services.info.base.StatePath;
import org.dcache.services.info.base.StateUpdateManager;
import org.dcache.services.info.gathers.DgaFactoryService;
import org.dcache.services.info.gathers.ListBasedMessageDga;
import org.dcache.services.info.gathers.MessageMetadataRepository;
import org.dcache.services.info.gathers.MessageSender;
import org.dcache.services.info.gathers.Schedulable;
import org.dcache.services.info.gathers.SingleMessageDga;
import org.dcache.services.info.gathers.StringListMsgHandler;
import static org.dcache.services.info.Configuration.PROPERTY_NAME_SERVICE_POOLMANAGER;
/**
* This DgaFactoryService creates DGAs for monitoring the PoolManager.
*
* @author Paul Millar <paul.millar@desy.de>
*/
public class PoolManagerDgaFactoryService implements DgaFactoryService, EnvironmentAware
{
private String poolmanager;
@Override
public Set<Schedulable> createDgas(StateExhibitor exhibitor, MessageSender sender,
StateUpdateManager sum, MessageMetadataRepository<UOID> msgMetaRepo)
{
return new DgaFactory(poolmanager, exhibitor, sender, sum, msgMetaRepo).get();
}
@Override
public void setEnvironment(Map<String, Object> environment)
{
poolmanager = Environments.getValue(environment, PROPERTY_NAME_SERVICE_POOLMANAGER);
}
/**
* Instances of this class will build the DGA with the provided
* StateExhibitor, MessageSender, StateUpdateManager and
* MessageMetadataRepository. Please note this builder is not
* thread-safe and must be used only once.
*
* @author Paul Millar <paul.millar@desy.de>
*/
private static class DgaFactory
{
private final StateExhibitor _exhibitor;
private final MessageSender _sender;
private final StateUpdateManager _sum;
private final MessageMetadataRepository<UOID> _msgMetaRepo;
private final Set<Schedulable> _activity = new HashSet<>();
private final String _poolmanager;
DgaFactory(String poolmanager, StateExhibitor exhibitor, MessageSender sender,
StateUpdateManager sum, MessageMetadataRepository<UOID> msgMetaRepo)
{
_poolmanager = poolmanager;
_exhibitor = exhibitor;
_sender = sender;
_sum = sum;
_msgMetaRepo = msgMetaRepo;
addListCommandAsDga("pools", "psux ls pool");
addListCommandAsDga("poolgroups", "psux ls pgroup");
addListCommandAsDga("units", "psux ls unit");
addListCommandAsDga("unitgroups", "psux ls ugroup");
addSingleMessageDga("xcm ls",
new PoolCostMsgHandler(_sum, _msgMetaRepo));
addSingleMessageDga("psux ls link -x -resolve",
new LinkInfoMsgHandler(_sum, _msgMetaRepo));
addListBasedDgaForChildrenOf("pools", "psux ls pool",
new PoolInfoMsgHandler(_sum, _msgMetaRepo));
addListBasedDgaForChildrenOf("poolgroups", "psux ls pgroup",
new PoolGroupInfoMsgHandler(_sum, _msgMetaRepo));
addListBasedDgaForChildrenOf("units", "psux ls unit",
new UnitInfoMsgHandler(_sum, _msgMetaRepo));
addListBasedDgaForChildrenOf("unitgroups", "psux ls ugroup",
new UGroupInfoMsgHandler(_sum, _msgMetaRepo));
}
public Set<Schedulable> get()
{
return _activity;
}
/* For each child of path, query cell with an ASCII command like: prefix + " " + child; process the response */
private void addListBasedDgaForChildrenOf(String path, String prefix,
CellMessageAnswerable response)
{
_activity.add(new ListBasedMessageDga(_exhibitor, _sender,
new StatePath(path), _poolmanager, prefix,
response));
}
/* A DGA that queries PoolManager for a list and populate the info under some path */
private void addListCommandAsDga(String path, String command)
{
addSingleMessageDga(command, new StringListMsgHandler(_sum, _msgMetaRepo, path));
}
private void addSingleMessageDga(String command, CellMessageAnswerable response)
{
_activity.add(new SingleMessageDga(_sender, _poolmanager, command,
response, TimeUnit.MINUTES.toSeconds(5)));
}
}
}