use of org.onosproject.net.flow.CompletedBatchOperation in project onos by opennetworkinglab.
the class DefaultVirtualFlowRuleProvider method executeBatch.
@Override
public void executeBatch(NetworkId networkId, FlowRuleBatchOperation batch) {
checkNotNull(batch);
for (FlowRuleBatchEntry fop : batch.getOperations()) {
FlowRuleOperations.Builder builder = FlowRuleOperations.builder();
switch(fop.operator()) {
case ADD:
devirtualize(networkId, fop.target()).forEach(builder::add);
break;
case REMOVE:
devirtualize(networkId, fop.target()).forEach(builder::remove);
break;
case MODIFY:
devirtualize(networkId, fop.target()).forEach(builder::modify);
break;
default:
break;
}
flowRuleService.apply(builder.build(new FlowRuleOperationsContext() {
@Override
public void onSuccess(FlowRuleOperations ops) {
CompletedBatchOperation status = new CompletedBatchOperation(true, Sets.newConcurrentHashSet(), batch.deviceId());
VirtualFlowRuleProviderService providerService = (VirtualFlowRuleProviderService) providerRegistryService.getProviderService(networkId, VirtualFlowRuleProvider.class);
providerService.batchOperationCompleted(batch.id(), status);
}
@Override
public void onError(FlowRuleOperations ops) {
Set<FlowRule> failures = ImmutableSet.copyOf(Lists.transform(batch.getOperations(), BatchOperationEntry::target));
CompletedBatchOperation status = new CompletedBatchOperation(false, failures, batch.deviceId());
VirtualFlowRuleProviderService providerService = (VirtualFlowRuleProviderService) providerRegistryService.getProviderService(networkId, VirtualFlowRuleProvider.class);
providerService.batchOperationCompleted(batch.id(), status);
}
}));
}
}
use of org.onosproject.net.flow.CompletedBatchOperation in project onos by opennetworkinglab.
the class DistributedVirtualFlowRuleStore method storeBatchInternal.
private void storeBatchInternal(NetworkId networkId, FlowRuleBatchOperation operation) {
final DeviceId did = operation.deviceId();
// final Collection<FlowEntry> ft = flowTable.getFlowEntries(did);
Set<FlowRuleBatchEntry> currentOps = updateStoreInternal(networkId, operation);
if (currentOps.isEmpty()) {
batchOperationComplete(networkId, FlowRuleBatchEvent.completed(new FlowRuleBatchRequest(operation.id(), Collections.emptySet()), new CompletedBatchOperation(true, Collections.emptySet(), did)));
return;
}
// Confirm that flowrule service is created
vnaService.get(networkId, FlowRuleService.class);
notifyDelegate(networkId, FlowRuleBatchEvent.requested(new FlowRuleBatchRequest(operation.id(), currentOps), operation.deviceId()));
}
use of org.onosproject.net.flow.CompletedBatchOperation in project onos by opennetworkinglab.
the class SimpleVirtualFlowRuleStore method batchOperationComplete.
@Override
public void batchOperationComplete(NetworkId networkId, FlowRuleBatchEvent event) {
final Long batchId = event.subject().batchId();
SettableFuture<CompletedBatchOperation> future = pendingFutures.getIfPresent(batchId);
if (future != null) {
future.set(event.result());
pendingFutures.invalidate(batchId);
}
notifyDelegate(networkId, event);
}
use of org.onosproject.net.flow.CompletedBatchOperation in project onos by opennetworkinglab.
the class SimpleFlowRuleStore method storeBatch.
@Override
public void storeBatch(FlowRuleBatchOperation operation) {
List<FlowRuleBatchEntry> toAdd = new ArrayList<>();
List<FlowRuleBatchEntry> toRemove = new ArrayList<>();
for (FlowRuleBatchEntry entry : operation.getOperations()) {
final FlowRule flowRule = entry.target();
if (entry.operator().equals(FlowRuleOperation.ADD)) {
if (!getFlowEntries(flowRule.deviceId(), flowRule.id()).contains(flowRule)) {
storeFlowRule(flowRule);
toAdd.add(entry);
}
} else if (entry.operator().equals(FlowRuleOperation.REMOVE)) {
if (getFlowEntries(flowRule.deviceId(), flowRule.id()).contains(flowRule)) {
deleteFlowRule(flowRule);
toRemove.add(entry);
}
} else {
throw new UnsupportedOperationException("Unsupported operation type");
}
}
if (toAdd.isEmpty() && toRemove.isEmpty()) {
notifyDelegate(FlowRuleBatchEvent.completed(new FlowRuleBatchRequest(operation.id(), Collections.emptySet()), new CompletedBatchOperation(true, Collections.emptySet(), operation.deviceId())));
return;
}
SettableFuture<CompletedBatchOperation> r = SettableFuture.create();
final int batchId = localBatchIdGen.incrementAndGet();
pendingFutures.put(batchId, r);
toAdd.addAll(toRemove);
notifyDelegate(FlowRuleBatchEvent.requested(new FlowRuleBatchRequest(batchId, Sets.newHashSet(toAdd)), operation.deviceId()));
}
use of org.onosproject.net.flow.CompletedBatchOperation in project onos by opennetworkinglab.
the class FlowRuleDriverProvider method executeBatch.
@Override
public void executeBatch(FlowRuleBatchOperation batch) {
ImmutableList.Builder<FlowRule> toAdd = ImmutableList.builder();
ImmutableList.Builder<FlowRule> toRemove = ImmutableList.builder();
for (FlowRuleBatchEntry fbe : batch.getOperations()) {
if (fbe.operator() == ADD || fbe.operator() == MODIFY) {
toAdd.add(fbe.target());
} else if (fbe.operator() == REMOVE) {
toRemove.add(fbe.target());
}
}
ImmutableList<FlowRule> rulesToAdd = toAdd.build();
ImmutableList<FlowRule> rulesToRemove = toRemove.build();
Collection<FlowRule> added = ImmutableList.of();
if (!rulesToAdd.isEmpty()) {
added = applyFlowRules(batch.deviceId(), rulesToAdd);
}
Collection<FlowRule> removed = ImmutableList.of();
if (!rulesToRemove.isEmpty()) {
removed = removeFlowRules(batch.deviceId(), rulesToRemove);
}
Set<FlowRule> failedRules = Sets.union(Sets.difference(copyOf(rulesToAdd), copyOf(added)), Sets.difference(copyOf(rulesToRemove), copyOf(removed)));
CompletedBatchOperation status = new CompletedBatchOperation(failedRules.isEmpty(), failedRules, batch.deviceId());
providerService.batchOperationCompleted(batch.id(), status);
}
Aggregations