package org.openstack.atlas.usagerefactor;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.openstack.atlas.service.domain.entities.LoadBalancer;
import org.openstack.atlas.service.domain.usage.entities.LoadBalancerHostUsage;
import org.openstack.atlas.service.domain.usage.entities.LoadBalancerMergedHostUsage;
import org.openstack.atlas.usagerefactor.helpers.UsagePollerHelper;
import org.openstack.atlas.usagerefactor.helpers.UsageProcessorResult;
import org.openstack.atlas.util.common.MapUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.Calendar;
import java.util.List;
import java.util.Map;
@Component
public class UsageProcessor {
private final Log LOG = LogFactory.getLog(UsageProcessor.class);
@Autowired
private UsagePollerHelper usagePollerHelper;
public UsageProcessor() {
}
public UsageProcessorResult mergeRecords(Map<Integer, Map<Integer, List<LoadBalancerHostUsage>>> existingUsages,
Map<Integer, Map<Integer, SnmpUsage>> currentUsages,
Calendar pollTime)
{
/*
* 1. Query SNMP
* 2. Query host usage table for previous records. store time as deleteTimeMarker
* 3. Process Records For Each LB
* a. If no record in host usage table for LB but it is in SNMP results, then write snmp results to hosts table
* but do NOT write any data to the Merged LB Usage table.
* b. If CREATE_LOADBALANCER encountered in host usage table disregard any earlier records.
* c. If UNSUSPEND event encountered in host usage table disregard any earlier records unless earlier record is SUSPEND event.
* d. If earlier record's value is greater than current record then a reset happened.
* i. Record 0 Usage in Merged LB Usage table
* ii. Do not modify the counter in the host usage table.
* e. Write SNMP data to LB Host Usage table.
* d. Delete records from LB Host Usage table that have an ID less than the markerID
*/
LOG.info("Merging load balancer host usage records...");
//Process events that have come in between now and last poller run
List<LoadBalancerMergedHostUsage> mergedHostUsages = usagePollerHelper.processExistingEvents(existingUsages);
//Now parent key should be loadbalancerId, and child key hostId
currentUsages = MapUtil.swapKeys(currentUsages);
//Process current usage now. The method processExistingEvents should have removed
UsageProcessorResult processorResult = usagePollerHelper.processCurrentUsage(existingUsages, currentUsages,
pollTime);
mergedHostUsages.addAll(processorResult.getMergedUsages());
return new UsageProcessorResult(mergedHostUsages, processorResult.getLbHostUsages());
}
}