package com.redhat.lightblue.migrator.monitor.NMP;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.apache.commons.lang.StringUtils;
import org.joda.time.Period;
import org.joda.time.format.PeriodFormat;
import org.joda.time.format.PeriodFormatter;
import com.redhat.lightblue.client.LightblueException;
import com.redhat.lightblue.client.Literal;
import com.redhat.lightblue.client.Projection;
import com.redhat.lightblue.client.Query;
import com.redhat.lightblue.client.request.data.DataFindRequest;
import com.redhat.lightblue.client.response.LightblueDataResponse;
import com.redhat.lightblue.migrator.MigrationConfiguration;
import com.redhat.lightblue.migrator.MigrationJob;
import com.redhat.lightblue.migrator.monitor.JobType;
import com.redhat.lightblue.migrator.monitor.Monitor;
import com.redhat.lightblue.migrator.monitor.MonitorConfiguration;
import com.redhat.lightblue.migrator.monitor.Notifier;
/** Monitor implementation for {@link JobType#NEW_MIGRATION_PERIODS} */
public class NMPMonitor extends Monitor {
public NMPMonitor(MonitorConfiguration monitorCfg) {
super(monitorCfg);
}
@Override
protected void doRunCheck(final Notifier... notifiers) throws LightblueException {
int periods = (monitorCfg.getPeriods() == null) ? 1 : monitorCfg.getPeriods();
List<String> configurationsMissingJobs = new ArrayList<>();
for (MigrationConfiguration cfg : findMigrationConfigurations()) {
long period = periods * parsePeriod(cfg.getPeriod());
Date endDate = new Date();
Date startDate = new Date(endDate.getTime() - period);
int jobs = countMigrationJobs(cfg.getConfigurationName(), startDate, endDate);
if (jobs <= 0) {
configurationsMissingJobs.add(cfg.getConfigurationName());
}
}
if (configurationsMissingJobs.isEmpty()) {
onSuccess(notifiers);
} else {
String message = "Jobs not being created: " + StringUtils.join(configurationsMissingJobs, ",");
onFailure(message, notifiers);
}
}
/**
* Returns the period in msecs
*/
private static long parsePeriod(String periodStr) {
PeriodFormatter fmt = PeriodFormat.getDefault();
Period p = fmt.parsePeriod(periodStr);
return p.toStandardDuration().getMillis();
}
private MigrationConfiguration[] findMigrationConfigurations() throws LightblueException {
DataFindRequest findConfigurations = new DataFindRequest(MigrationConfiguration.ENTITY_NAME);
findConfigurations.where(Query.withValue("period", Query.neq,
Literal.pojo(null)));
findConfigurations.select(
Projection.includeField("configurationName"),
Projection.includeField("period"));
return lightblueClient.data(findConfigurations, MigrationConfiguration[].class);
}
private int countMigrationJobs(String configurationName, Date startDate, Date endDate) throws LightblueException {
DataFindRequest findJobs = new DataFindRequest(MigrationJob.ENTITY_NAME);
findJobs.where(
Query.and(
Query.withValue("configurationName", Query.eq, configurationName),
Query.withValue("scheduledDate", Query.gte, startDate),
Query.withValue("scheduledDate", Query.lte, endDate)
)
);
findJobs.select(new Projection[]{Projection.excludeFieldRecursively("*")}, 0, 0);
LightblueDataResponse response = lightblueClient.data(findJobs);
return response.parseMatchCount();
}
}