package uk.ac.imperial.lsds.seepmaster.infrastructure.master;
import java.net.InetAddress;
import java.util.ArrayDeque;
import java.util.Collection;
import java.util.Deque;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import uk.ac.imperial.lsds.seep.comm.Connection;
import uk.ac.imperial.lsds.seep.infrastructure.ExecutionUnitType;
public class PhysicalClusterManager implements InfrastructureManager {
final private Logger LOG = LoggerFactory.getLogger(PhysicalClusterManager.class);
public final ExecutionUnitType executionUnitType = ExecutionUnitType.PHYSICAL_NODE;
private Deque<ExecutionUnit> availablePhysicalNodes;
private Deque<ExecutionUnit> usedPhysicalNodes;
private Map<Integer, Connection> connectionsToPhysicalNodes;
public PhysicalClusterManager(){
this.availablePhysicalNodes = new ArrayDeque<>();
this.usedPhysicalNodes = new ArrayDeque<>();
this.connectionsToPhysicalNodes = new HashMap<>();
}
@Override
public ExecutionUnit buildExecutionUnit(InetAddress ip, int controlPort, int dataPort) {
return new PhysicalNode(ip, controlPort, dataPort);
}
@Override
public void addExecutionUnit(ExecutionUnit eu) {
availablePhysicalNodes.push(eu);
connectionsToPhysicalNodes.put(eu.getId(), new Connection(eu.getControlEndPoint()));
}
@Override
public ExecutionUnit getExecutionUnit(){
if(availablePhysicalNodes.size() > 0){
LOG.debug("Returning 1 executionUnit, remaining: {}", availablePhysicalNodes.size()-1);
ExecutionUnit toReturn = availablePhysicalNodes.pop();
usedPhysicalNodes.push(toReturn);
return toReturn;
}
else{
LOG.error("No available executionUnits !!!");
return null;
}
}
@Override
public boolean removeExecutionUnit(int id) {
for(ExecutionUnit eu : usedPhysicalNodes){
if(eu.getId() == id){
boolean success = usedPhysicalNodes.remove(eu);
if(success){
LOG.info("ExecutionUnit id: {} was removed from usedPhysicalNodes");
}
}
}
for(ExecutionUnit eu : availablePhysicalNodes){
if(eu.getId() == id){
boolean success = availablePhysicalNodes.remove(eu);
if(success){
LOG.info("ExecutionUnit id: {} was removed from availablePhysicalNodes");
return true;
}
}
}
return false;
}
@Override
public int executionUnitsAvailable() {
return availablePhysicalNodes.size();
}
@Override
public Collection<ExecutionUnit> executionUnitsInUse() {
return usedPhysicalNodes;
}
@Override
public void claimExecutionUnits(int numExecutionUnits) {
// TODO Auto-generated method stub
}
@Override
public void decommisionExecutionUnits(int numExecutionUnits) {
// TODO Auto-generated method stub
}
@Override
public void decommisionExecutionUnit(ExecutionUnit eu) {
// TODO Auto-generated method stub
}
@Override
public Set<Connection> getConnectionsTo(Set<Integer> executionUnitIds) {
Set<Connection> cs = new HashSet<>();
for(Integer id : executionUnitIds) {
// TODO: check that the conn actually exists
cs.add(connectionsToPhysicalNodes.get(id));
}
return cs;
}
@Override
public Connection getConnectionTo(int executionUnitId) {
return connectionsToPhysicalNodes.get(executionUnitId);
}
}