use of org.opennms.core.wsman.utils.RetryNTimesLoop in project opennms by OpenNMS.
the class WsManCollector method collectGroupUsing.
private void collectGroupUsing(Group group, CollectionAgent agent, WSManClient client, int retries, CollectionSetBuilder builder) throws CollectionException {
// Determine the appropriate resource type
final NodeLevelResource nodeResource = new NodeLevelResource(agent.getNodeId());
final AtomicInteger instanceId = new AtomicInteger();
Supplier<Resource> resourceSupplier = () -> nodeResource;
if (!"node".equalsIgnoreCase(group.getResourceType())) {
resourceSupplier = () -> {
// Generate a unique instance for each node in each group to ensure
// that the attributes are grouped together properly.
// Since these instances have no real meaning, a storage strategy
// similar to the SiblingColumnStorageStrategy should be used instead
// of the IndexStorageStrategy.
final String instance = String.format("%s%d", group.getName(), instanceId.getAndIncrement());
return new DeferredGenericTypeResource(nodeResource, group.getResourceType(), instance);
};
}
if (LOG.isDebugEnabled()) {
LOG.debug("Using resource {} for group named {}", resourceSupplier.get(), group.getName());
}
// Enumerate
List<Node> nodes = Lists.newLinkedList();
RetryNTimesLoop retryLoop = new RetryNTimesLoop(retries);
while (retryLoop.shouldContinue()) {
try {
if (group.getFilter() == null) {
LOG.debug("Enumerating and pulling {} on {}.", group.getResourceUri(), client);
client.enumerateAndPull(group.getResourceUri(), nodes, true);
} else {
LOG.debug("Enumerating and pulling {} with dialect {} and filter {} on {}.", group.getResourceUri(), group.getDialect(), group.getFilter(), client);
client.enumerateAndPullUsingFilter(group.getResourceUri(), group.getDialect(), group.getFilter(), nodes, true);
}
break;
} catch (WSManException e) {
retryLoop.takeException(e);
}
}
LOG.debug("Found {} nodes.", nodes.size());
// Process the results
processEnumerationResults(group, builder, resourceSupplier, nodes);
}
use of org.opennms.core.wsman.utils.RetryNTimesLoop in project opennms by OpenNMS.
the class WsManMonitor method poll.
@Override
public PollStatus poll(MonitoredService svc, Map<String, Object> parameters) {
// Fetch the monitor specific parameters
final String resourceUri = getKeyedString(parameters, RESOURCE_URI_PARAM, null);
if (resourceUri == null) {
throw new IllegalArgumentException("'" + RESOURCE_URI_PARAM + "' parameter is required.");
}
final String rule = getKeyedString(parameters, RULE_PARAM, null);
if (rule == null) {
throw new IllegalArgumentException("'" + RULE_PARAM + "' parameter is required.");
}
final Map<String, String> selectors = Maps.newHashMap();
for (Entry<String, Object> parameter : parameters.entrySet()) {
if (parameter.getKey().startsWith(SELECTOR_PARAM_PREFIX)) {
final String selectorKey = parameter.getKey().substring(SELECTOR_PARAM_PREFIX.length());
final Object selectorValue = parameter.getValue();
if (selectorValue == null) {
continue;
}
selectors.put(selectorKey, selectorValue instanceof String ? (String) selectorValue : selectorValue.toString());
}
}
// Setup the WS-Man Client
if (m_wsManConfigDao == null) {
m_wsManConfigDao = BeanUtils.getBean("daoContext", "wsManConfigDao", WSManConfigDao.class);
}
final WsmanAgentConfig config = m_wsManConfigDao.getAgentConfig(svc.getAddress());
final WSManEndpoint endpoint = WSManConfigDao.getEndpoint(config, svc.getAddress());
final WSManClient client = m_factory.getClient(endpoint);
final RetryNTimesLoop retryLoop = new RetryNTimesLoop(config.getRetry() != null ? config.getRetry() : 0);
// Issue a GET
Node node = null;
try {
while (retryLoop.shouldContinue()) {
try {
node = client.get(resourceUri, selectors);
break;
} catch (WSManException e) {
retryLoop.takeException(e);
}
}
} catch (WSManException e) {
return PollStatus.down(e.getMessage());
}
if (node == null) {
return PollStatus.down(String.format("No resource was found at URI: '%s' with selectors: '%s'.", resourceUri, selectors));
}
// Verify the results
final ListMultimap<String, String> elementValues = ResponseHandlingUtils.toMultiMap(node);
try {
ResponseHandlingUtils.getMatchingIndex(rule, elementValues);
// We've successfully matched an index
return PollStatus.up();
} catch (NoSuchElementException e) {
return PollStatus.down(String.format("No index was matched by rule: '%s' with values '%s'.", rule, elementValues));
}
}
Aggregations