in uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccHandlerClassic.java [538:990]
private void buildReservationsListEntry(HttpServletRequest request, StringBuffer sb, DuccId duccId, IDuccWork duccwork, DuccData duccData, long now) {
String id = normalize(duccId);
String reservationType = "Unmanaged";
if(duccwork instanceof DuccWorkJob) {
reservationType = "Managed";
}
sb.append("<td class=\"ducc-col-terminate\">");
if(terminateEnabled) {
if(!duccwork.isCompleted()) {
String disabled = getDisabledWithHover(request,duccwork);
String user = duccwork.getStandardInfo().getUser();
if(user != null) {
DuccPropertiesResolver dpr = DuccPropertiesResolver.getInstance();
String jdHostUser = dpr.getCachedProperty(DuccPropertiesResolver.ducc_jd_host_user);
// We presume that user is sufficient to identify JD allocation
if(user.equals(jdHostUser)) {
disabled = "disabled=\"disabled\"";
}
}
if(duccwork instanceof DuccWorkReservation) {
sb.append("<input type=\"button\" onclick=\"ducc_confirm_terminate_reservation("+id+")\" value=\"Terminate\" "+disabled+"/>");
}
else if(duccwork instanceof DuccWorkJob) {
sb.append("<input type=\"button\" onclick=\"ducc_confirm_terminate_service("+id+")\" value=\"Terminate\" "+disabled+"/>");
}
else {
//huh?
}
}
}
sb.append("</td>");
// Id
if(reservationType.equals("Managed")) {
sb.append("<td valign=\"bottom\">");
sb.append("<a href=\"reservation.details.html?id="+id+"\">"+id+"</a>");
sb.append("</td>");
}
else {
sb.append("<td>");
sb.append(id);
sb.append("</td>");
}
// Start
sb.append("<td>");
sb.append("<span title=\""+DuccConstants.hintPreferencesDateStyle+"\">");
sb.append(getTimeStamp(request,duccwork.getDuccId(),duccwork.getStandardInfo().getDateOfSubmission()));
sb.append("</span>");
sb.append("</td>");
// Duration
sb.append("<td align=\"right\">");
if(duccwork instanceof DuccWorkReservation) {
DuccWorkReservation reservation = (DuccWorkReservation) duccwork;
String duration;
String decoratedDuration;
switch(reservation.getReservationState()) {
case Completed:
sb.append("<span>");
duration = getDuration(request,reservation,Precision.Whole);
decoratedDuration = decorateDuration(request,reservation, duration);
sb.append(decoratedDuration);
sb.append("</span>");
break;
default:
sb.append("<span class=\"health_green\""+">");
duration = getDuration(request,reservation,now,Precision.Whole);
decoratedDuration = decorateDuration(request,reservation, duration);
sb.append(decoratedDuration);
sb.append("</span>");
break;
}
}
else if(duccwork instanceof DuccWorkJob) {
DuccWorkJob job = (DuccWorkJob) duccwork;
switch(job.getJobState()) {
case Completed:
sb.append("<span>");
String duration = getDuration(request,job,Precision.Whole);
String decoratedDuration = decorateDuration(request,job,duration,Precision.Whole);
sb.append(decoratedDuration);
sb.append("</span>");
break;
default:
sb.append("<span class=\"health_green\""+">");
duration = getDuration(request,job,now,Precision.Whole);
decoratedDuration = decorateDuration(request,job,duration,Precision.Whole);
sb.append(decoratedDuration);
sb.append("</span>");
break;
}
}
sb.append("</td>");
// User
String title = "";
String submitter = duccwork.getStandardInfo().getSubmitter();
if(submitter != null) {
title = "title=\"submitter PID@host: "+submitter+"\"";
}
sb.append("<td "+title+">");
UserId userId = new UserId(duccwork.getStandardInfo().getUser());
sb.append(userId.toString());
sb.append("</td>");
// Class
sb.append("<td>");
sb.append(stringNormalize(duccwork.getSchedulingInfo().getSchedulingClass(),messages.fetch("default")));
sb.append("</td>");
// Type
sb.append("<td>");
sb.append(reservationType);
sb.append("</td>");
// State
sb.append("<td>");
if(duccData.isLive(duccId)) {
if(duccwork.isOperational()) {
sb.append("<span class=\"active_state\">");
}
else {
sb.append("<span class=\"completed_state\">");
}
}
else {
sb.append("<span class=\"historic_state\">");
}
sb.append(duccwork.getStateObject().toString());
if(duccData.isLive(duccId)) {
sb.append("</span>");
}
sb.append("</td>");
// Reason
if(duccwork instanceof DuccWorkReservation) {
DuccWorkReservation reservation = (DuccWorkReservation) duccwork;
sb.append("<td>");
switch(reservation.getReservationState()) {
case WaitingForResources:
String rmReason = reservation.getRmReason();
if(rmReason != null) {
sb.append("<span>");
sb.append(rmReason);
sb.append("</span>");
}
break;
case Assigned:
List<JdReservationBean> list = reservation.getJdReservationBeanList();
long inuse = 0;
long total = 0;
if(list != null) {
for(JdReservationBean jdReservationBean : list) {
JdReservation jdReservation = (JdReservation) jdReservationBean;
inuse += jdReservation.getSlicesInuse();
total += jdReservation.getSlicesTotal();
}
title = "title=\"the number of job driver allocations inuse for this reservation\"";
sb.append("<span "+title+">");
sb.append("inuse: "+inuse);
sb.append("</span>");
sb.append(" ");
title = "title=\"the number of job driver allocations maximum capacity for this reservation\"";
sb.append("<span "+title+">");
sb.append("limit: "+total);
sb.append("</span>");
}
break;
default:
switch(reservation.getCompletionType()) {
case Undefined:
break;
case CanceledByUser:
case CanceledByAdmin:
try {
String cancelUser = duccwork.getStandardInfo().getCancelUser();
if(cancelUser != null) {
sb.append("<span title=\"canceled by "+cancelUser+"\">");
sb.append(duccwork.getCompletionTypeObject().toString());
sb.append("</span>");
}
else {
IRationale rationale = reservation.getCompletionRationale();
if(rationale != null) {
sb.append("<span title="+rationale.getTextQuoted()+">");
sb.append(duccwork.getCompletionTypeObject().toString());
sb.append("</span>");
}
else {
sb.append(duccwork.getCompletionTypeObject().toString());
}
}
}
catch(Exception e) {
IRationale rationale = reservation.getCompletionRationale();
if(rationale != null) {
sb.append("<span title="+rationale.getTextQuoted()+">");
sb.append(duccwork.getCompletionTypeObject().toString());
sb.append("</span>");
}
else {
sb.append(duccwork.getCompletionTypeObject().toString());
}
}
break;
default:
IRationale rationale = reservation.getCompletionRationale();
if(rationale != null) {
sb.append("<span title="+rationale.getTextQuoted()+">");
sb.append(duccwork.getCompletionTypeObject().toString());
sb.append("</span>");
}
else {
sb.append(duccwork.getCompletionTypeObject().toString());
}
break;
}
break;
}
sb.append("</td>");
}
else if(duccwork instanceof DuccWorkJob) {
DuccWorkJob job = (DuccWorkJob) duccwork;
String reason = getReason(job, MonitorType.ManagedReservation).toString();
sb.append("<td>");
sb.append(reason);
sb.append("</td>");
}
// Allocation
/*
sb.append("<td align=\"right\">");
sb.append(duccwork.getSchedulingInfo().getInstancesCount());
sb.append("</td>");
*/
// User Processes
sb.append("<td align=\"right\">");
TreeMap<String,Integer> nodeMap = new TreeMap<String,Integer>();
if(duccwork instanceof DuccWorkReservation) {
DuccWorkReservation reservation = (DuccWorkReservation) duccwork;
if(!reservation.getReservationMap().isEmpty()) {
IDuccReservationMap map = reservation.getReservationMap();
for (DuccId key : map.keySet()) {
IDuccReservation value = reservation.getReservationMap().get(key);
String node = value.getNodeIdentity().getCanonicalName();
if(!nodeMap.containsKey(node)) {
nodeMap.put(node,new Integer(0));
}
Integer count = nodeMap.get(node);
count++;
nodeMap.put(node,count);
}
}
boolean qualify = false;
if(!nodeMap.isEmpty()) {
if(nodeMap.keySet().size() > 1) {
qualify = true;
}
}
ArrayList<String> qualifiedPids = new ArrayList<String>();
if(duccwork.isOperational()) {
DuccMachinesData machinesData = DuccMachinesData.getInstance();
for (String node: nodeMap.keySet()) {
NodeId nodeId = new NodeId(node);
List<String> nodePids = machinesData.getPids(nodeId, userId);
for( String pid : nodePids ) {
if(qualify) {
qualifiedPids.add(node+":"+pid);
}
else {
qualifiedPids.add(pid);
}
}
}
}
if(qualifiedPids.size() > 0) {
String list = "";
for( String entry : qualifiedPids ) {
list += entry+" ";
}
sb.append("<span title=\""+list.trim()+"\">");
sb.append(""+qualifiedPids.size());
sb.append("</span>");
}
else {
sb.append(""+qualifiedPids.size());
}
}
else {
DuccWorkJob job = (DuccWorkJob) duccwork;
if(job.isOperational()) {
sb.append(duccwork.getSchedulingInfo().getInstancesCount());
}
else {
sb.append("0");
}
Iterator<DuccId> iterator = job.getProcessMap().keySet().iterator();
while(iterator.hasNext()) {
DuccId processId = iterator.next();
IDuccProcess process = job.getProcessMap().get(processId);
String node = process.getNodeIdentity().getCanonicalName();
nodeMap.put(node, 1);
}
}
sb.append("</td>");
// PgIn
sb.append("<td align=\"right\">");
if(duccwork instanceof DuccWorkJob) {
DuccWorkJob job = (DuccWorkJob) duccwork;
long faults = 0;
try {
faults = job.getPgInCount();
}
catch(Exception e) {
}
int ifaults = (int)faults;
switch(ifaults) {
case -3: // (some do and some don't have cgroups) but retVal would have been > 0
sb.append("<span title=\"incomplete\" class=\"health_red\""+">");
sb.append(inc);
break;
case -2: // (some do and some don't have cgroups) but retVal would have been == 0
sb.append("<span title=\"incomplete\" class=\"health_black\""+">");
sb.append(inc);
break;
case -1: // (none have cgroups)
sb.append("<span title=\"not available\" class=\"health_black\""+">");
sb.append(notAvailable);
break;
default: // (all have cgroups)
double swapping = job.getSwapUsageGbMax();
if((swapping * faults) > 0) {
sb.append("<span class=\"health_red\""+">");
}
else {
sb.append("<span class=\"health_black\""+">");
}
sb.append(faults);
break;
}
sb.append("</span>");
}
sb.append("</td>");
// Swap
sb.append("<td align=\"right\">");
if(duccwork instanceof DuccWorkJob) {
DuccWorkJob job = (DuccWorkJob) duccwork;
String swapSizeDisplay = "";
String swapSizeHover = "";
title = "";
double swap = 0;
if(job.isCompleted()) {
swap = job.getSwapUsageGbMax();
}
else {
swap = job.getSwapUsageGb();
}
int iswap = (int)swap;
switch(iswap) {
case -3: // (some do and some don't have cgroups) but retVal would have been > 0
sb.append("<span title=\"incomplete\" class=\"health_red\""+">");
sb.append(inc);
break;
case -2: // (some do and some don't have cgroups) but retVal would have been == 0
sb.append("<span title=\"incomplete\" class=\"health_black\""+">");
sb.append(inc);
break;
case -1: // (none have cgroups)
sb.append("<span title=\"not available\" class=\"health_black\""+">");
sb.append(notAvailable);
break;
default: // (all have cgroups)
double swapBytes = swap*DuccHandlerUtils.GB;
swapSizeDisplay = DuccHandlerUtils.getSwapSizeDisplay(swapBytes);
swapSizeHover = DuccHandlerUtils.getSwapSizeHover(swapBytes);
title = "title="+"\""+swapSizeHover+"\"";
if(swapBytes > 0) {
sb.append("<span "+title+" "+"class=\"health_red\""+">");
}
else {
sb.append("<span "+title+" "+"class=\"health_black\""+">");
}
sb.append(swapSizeDisplay);
break;
}
sb.append("</span>");
}
sb.append("</td>");
// Memory
IDuccSchedulingInfo si;
SizeBytes sizeBytes;
String requested;
String actual;
si = duccwork.getSchedulingInfo();
sizeBytes = new SizeBytes(SizeBytes.Type.Bytes, si.getMemorySizeAllocatedInBytes());
actual = getProcessMemorySize(duccId,sizeBytes);
sizeBytes = new SizeBytes(si.getMemoryUnits().name(), Long.parseLong(si.getMemorySizeRequested()));
requested = getProcessMemorySize(duccId,sizeBytes);
sb.append("<td align=\"right\">");
sb.append("<span title=\""+"requested: "+requested+"\">");
sb.append(actual);
sb.append("</span>");
sb.append("</td>");
// Host Names
sb.append("<td>");
if(!nodeMap.isEmpty()) {
boolean useList = false;
if(nodeMap.size() > 1) {
useList = true;
}
if(useList) {
sb.append("<select>");
}
for (String node: nodeMap.keySet()) {
String option = node;
Integer count = nodeMap.get(node);
if(count > 1) {
option += " "+"["+count+"]";
}
if(useList) {
sb.append("<option>");
}
sb.append(option);
if(useList) {
sb.append("</option>");
}
}
if(useList) {
sb.append("</select>");
}
}
sb.append("</td>");
// Description
sb.append("<td>");
String description = stringNormalize(duccwork.getStandardInfo().getDescription(),messages.fetch("none"));
switch(DuccCookies.getDescriptionStyle(request)) {
case Long:
default:
sb.append("<span title=\""+DuccConstants.hintPreferencesDescriptionStyleShort+"\">");
sb.append(description);
sb.append("</span>");
break;
case Short:
String shortDescription = getShortDescription(description);
if(shortDescription == null) {
sb.append("<span>");
sb.append(description);
sb.append("</span>");
}
else {
sb.append("<span title=\""+description+"\">");
sb.append(shortDescription);
sb.append("</span>");
}
break;
}
sb.append("</td>");
sb.append("</tr>");
}