use of org.onosproject.net.flow.oldbatch.FlowRuleBatchEntry 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.oldbatch.FlowRuleBatchEntry 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.oldbatch.FlowRuleBatchEntry in project onos by opennetworkinglab.
the class FlowRuleBatchOperationTest method testEquals.
/**
* Tests the equals(), hashCode() and toString() methods.
*/
@Test
public void testEquals() {
final FlowRule rule = new IntentTestsMocks.MockFlowRule(1);
final FlowRuleBatchEntry entry1 = new FlowRuleBatchEntry(FlowRuleBatchEntry.FlowRuleOperation.ADD, rule);
final FlowRuleBatchEntry entry2 = new FlowRuleBatchEntry(FlowRuleBatchEntry.FlowRuleOperation.MODIFY, rule);
final FlowRuleBatchEntry entry3 = new FlowRuleBatchEntry(FlowRuleBatchEntry.FlowRuleOperation.REMOVE, rule);
final LinkedList<FlowRuleBatchEntry> ops1 = new LinkedList<>();
ops1.add(entry1);
final LinkedList<FlowRuleBatchEntry> ops2 = new LinkedList<>();
ops1.add(entry2);
final LinkedList<FlowRuleBatchEntry> ops3 = new LinkedList<>();
ops3.add(entry3);
final FlowRuleBatchOperation operation1 = new FlowRuleBatchOperation(ops1, null, 0);
final FlowRuleBatchOperation sameAsOperation1 = new FlowRuleBatchOperation(ops1, null, 0);
final FlowRuleBatchOperation operation2 = new FlowRuleBatchOperation(ops2, null, 0);
final FlowRuleBatchOperation operation3 = new FlowRuleBatchOperation(ops3, null, 0);
new EqualsTester().addEqualityGroup(operation1, sameAsOperation1).addEqualityGroup(operation2).addEqualityGroup(operation3).testEquals();
}
use of org.onosproject.net.flow.oldbatch.FlowRuleBatchEntry in project onos by opennetworkinglab.
the class FlowRuleBatchRequestTest method testConstruction.
/**
* Tests that construction of FlowRuleBatchRequest objects returns the
* correct objects.
*/
@Test
public void testConstruction() {
final FlowRule rule1 = new IntentTestsMocks.MockFlowRule(1);
final FlowRule rule2 = new IntentTestsMocks.MockFlowRule(2);
final Set<FlowRuleBatchEntry> batch = new HashSet<>();
batch.add(new FlowRuleBatchEntry(ADD, rule1));
batch.add(new FlowRuleBatchEntry(REMOVE, rule2));
final FlowRuleBatchRequest request = new FlowRuleBatchRequest(1, batch);
assertThat(request.ops(), hasSize(2));
assertThat(request.batchId(), is(1L));
final FlowRuleBatchOperation op = request.asBatchOperation(rule1.deviceId());
assertThat(op.size(), is(2));
final List<FlowRuleBatchEntry> ops = op.getOperations();
assertThat(ops, hasSize(2));
}
use of org.onosproject.net.flow.oldbatch.FlowRuleBatchEntry 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()));
}
Aggregations