use of cz.metacentrum.perun.taskslib.model.Task in project perun by CESNET.
the class TasksManagerBlImpl method getResourcesState.
@Override
public List<ResourceState> getResourcesState(PerunSession session, Vo vo) throws VoNotExistsException {
perun.getVosManagerBl().checkVoExists(session, vo);
List<Resource> resources = perun.getResourcesManagerBl().getResources(session, vo);
List<ResourceState> resourceStateList = new ArrayList<>();
for (Resource resource : resources) {
List<Task> taskList = listAllTasksForFacility(session, resource.getFacilityId());
// create new resourceState
ResourceState resourceState = new ResourceState();
resourceState.setResource(resource);
resourceState.setTaskList(taskList);
// add new created resourceState to List
resourceStateList.add(resourceState);
}
return resourceStateList;
}
use of cz.metacentrum.perun.taskslib.model.Task in project perun by CESNET.
the class TasksManagerBlImpl method getFacilityState.
@Override
public FacilityState getFacilityState(PerunSession session, Facility facility) throws FacilityNotExistsException {
perun.getFacilitiesManagerBl().checkFacilityExists(session, facility);
// get all tasks
List<Task> tasks = getTasksManagerImpl().listAllTasksForFacility(facility.getId());
// define state
FacilityState state = new FacilityState();
state.setFacility(facility);
// if no tasks we can't determine facility state
if (tasks == null || tasks.isEmpty()) {
state.setState(FacilityState.FacilityPropagationState.NOT_DETERMINED);
return state;
} else {
// OK if no change
state.setState(FacilityState.FacilityPropagationState.OK);
}
// fill all available destinations
List<RichDestination> destinations = perun.getServicesManagerBl().getAllRichDestinations(session, facility);
for (RichDestination rd : destinations) {
state.getResults().put(rd.getDestination(), FacilityState.FacilityPropagationState.NOT_DETERMINED);
}
// magic with tasks :-)
for (Task task : tasks) {
// save previous facility state
FacilityState.FacilityPropagationState facState = state.getState();
// PROCESSING and not ERROR before
if (Arrays.asList(Task.TaskStatus.GENERATED, Task.TaskStatus.GENERATING, Task.TaskStatus.PLANNED, Task.TaskStatus.SENDING).contains(task.getStatus()) && (facState != FacilityState.FacilityPropagationState.ERROR)) {
state.setState(FacilityState.FacilityPropagationState.PROCESSING);
} else // ERROR - set ERROR
if (Arrays.asList(Task.TaskStatus.ERROR, Task.TaskStatus.GENERROR, Task.TaskStatus.SENDERROR).contains(task.getStatus())) {
state.setState(FacilityState.FacilityPropagationState.ERROR);
}
// get destination status
if (task.getService() != null) {
List<TaskResult> results = getTasksManagerImpl().getTaskResultsByTask(task.getId());
Map<Service, Map<Destination, TaskResult>> latestResults = new HashMap<>();
for (TaskResult res : results) {
if (latestResults.get(res.getService()) == null) {
// put in map since result for service exists
Map<Destination, TaskResult> value = new HashMap<>();
value.put(res.getDestination(), res);
latestResults.put(res.getService(), value);
} else if (latestResults.get(res.getService()) != null && latestResults.get(res.getService()).get(res.getDestination()) == null) {
// put in inner map, since destination for service not yet exists
latestResults.get(res.getService()).put(res.getDestination(), res);
} else {
// update in inner map since this is later task result
if (latestResults.get(res.getService()).get(res.getDestination()).getId() < res.getId()) {
// put in map
latestResults.get(res.getService()).put(res.getDestination(), res);
}
}
}
for (Map<Destination, TaskResult> res : latestResults.values()) {
for (TaskResult result : res.values()) {
// iterate over all latest tasks results
String destination = result.getDestination().getDestination();
FacilityState.FacilityPropagationState propState = state.getResults().get(destination);
// if any error => state is error
if (TaskResult.TaskResultStatus.ERROR.equals(result.getStatus())) {
state.getResults().put(destination, FacilityState.FacilityPropagationState.ERROR);
continue;
}
// if result ok and previous was not bad
if (TaskResult.TaskResultStatus.DONE.equals(result.getStatus())) {
if (FacilityState.FacilityPropagationState.NOT_DETERMINED.equals(propState)) {
state.getResults().put(destination, FacilityState.FacilityPropagationState.OK);
}
}
}
}
}
}
return state;
}
use of cz.metacentrum.perun.taskslib.model.Task in project perun by CESNET.
the class TaskStoreImpl method getTasksWithStatus.
@Override
public synchronized List<Task> getTasksWithStatus(Task.TaskStatus... status) {
Collection<Task> tasks = tasksById.values();
synchronized (this) {
List<Task> result = new ArrayList<>();
List<Task.TaskStatus> statuses = Arrays.asList(status);
for (Task t : tasks) {
if (statuses.contains(t.getStatus()))
result.add(t);
}
return result;
}
}
use of cz.metacentrum.perun.taskslib.model.Task in project perun by CESNET.
the class PropagationMaintainerImpl method abortTask.
private void abortTask(Task task, TaskStatus status) {
log.warn("[{}] Task {} found in unexpected state, switching to {} ", task.getId(), task, status);
task.setStatus(status);
Task removed = null;
try {
removed = schedulingPool.removeTask(task);
// the removal from pool also cancels all task futures, which in turn
// makes the completion service collect the task and remove it from its executingTasks map
} catch (TaskStoreException e) {
log.error("[{}] Failed during removal of Task {} from SchedulingPool: {}", task.getId(), task, e);
}
if (removed != null) {
// some kind of inconsistency and we don't want to spam dispatcher - it will mark it as error on its own
try {
jmsQueueManager.reportTaskStatus(task.getId(), task.getStatus(), System.currentTimeMillis());
} catch (JMSException | InterruptedException e) {
log.error("[{}] Error trying to reportTaskStatus of {} to Dispatcher: {}", task.getId(), task, e);
}
} else {
log.error("[{}] Stale Task {} was not removed and not reported to dispatcher.", task.getId(), task);
log.error(" - This is nonsense - why we abort the Task taken from AllTasks but we can remove it from it ??");
}
}
use of cz.metacentrum.perun.taskslib.model.Task in project perun by CESNET.
the class SendWorkerImpl method call.
@Override
public SendTask call() throws TaskExecutionException {
Task task = sendTask.getTask();
Service service = task.getService();
// we never actually run DUMMY destinations !!
if (sendTask.getDestination().getPropagationType().equals(Destination.PROPAGATIONTYPE_DUMMY)) {
log.info("[{}] Executing SEND worker skipped for dummy Destination: {}. Marked as SENT.", sendTask.getTask().getId(), sendTask.getDestination().getDestination());
// set results
sendTask.setStatus(SENT);
sendTask.setStdout("");
sendTask.setStderr("");
sendTask.setReturnCode(0);
sendTask.setEndTime(new Date(System.currentTimeMillis()));
return sendTask;
}
log.info("[{}] Executing SEND worker for Task with Service ID: {} and Facility ID: {} and Destination: {}", sendTask.getTask().getId(), sendTask.getTask().getServiceId(), sendTask.getTask().getFacilityId(), sendTask.getDestination().getDestination());
ProcessBuilder pb = new ProcessBuilder(service.getScript(), task.getFacility().getName(), sendTask.getDestination().getDestination(), sendTask.getDestination().getType());
try {
// start the script and wait for results
super.execute(pb);
// set results
sendTask.setStdout(super.getStdout());
sendTask.setStderr(super.getStderr());
sendTask.setReturnCode(super.getReturnCode());
sendTask.setEndTime(new Date(System.currentTimeMillis()));
if (getReturnCode() != 0) {
log.error("[{}] SEND worker failed for Task. Ret code {}, STDOUT: {}, STDERR: {}", task.getId(), getReturnCode(), getStdout(), getStderr());
sendTask.setStatus(ERROR);
// XXX: why exception? There is nothing exceptional about the situation.
throw new TaskExecutionException(task, sendTask.getDestination(), getReturnCode(), getStdout(), getStderr());
} else {
if (getStderr().isEmpty()) {
sendTask.setStatus(SENT);
} else {
sendTask.setStatus(WARNING);
}
log.info("[{}] SEND worker finished for Task with status {}. Ret code {}, STDOUT: {}, STDERR: {}", sendTask.getTask().getId(), sendTask.getStatus(), getReturnCode(), getStdout(), getStderr());
return sendTask;
}
} catch (IOException e) {
log.error("[{}] SEND worker failed for Task. IOException: {}.", task.getId(), e);
sendTask.setStatus(ERROR);
sendTask.setEndTime(new Date(System.currentTimeMillis()));
throw new TaskExecutionException(task, sendTask.getDestination(), 2, "", e.getMessage());
} catch (InterruptedException e) {
log.warn("[{}] SEND worker failed for Task. Execution was interrupted {}.", task.getId(), e);
sendTask.setStatus(ERROR);
sendTask.setEndTime(new Date(System.currentTimeMillis()));
throw new TaskExecutionException(task, sendTask.getDestination(), 1, "", e.getMessage());
}
}
Aggregations