use of org.onosproject.net.flow.FlowRuleOperations in project fabric-tna by stratum.
the class FabricIntProgrammableTest method testWithoutValidSrConfig.
/**
* Test with no segment routing config.
*/
@Test
public void testWithoutValidSrConfig() {
final IntReportConfig intConfig = getIntReportConfig(APP_ID, "/int-report.json");
final Capture<FlowRuleOperations> capturedOpsForCollector = newCapture();
final Capture<FlowRuleOperations> capturedOpsForSubnet = newCapture();
final Capture<FlowRuleOperations> capturedOpsForQueueThresholds = newCapture();
final FlowRuleOperations expectedOpsForCollector = FlowRuleOperations.builder().add(buildCollectorWatchlistRule(LEAF_DEVICE_ID)).build();
// Expected steps of method calls, captures, and results.
reset(netcfgService, flowRuleService);
expect(netcfgService.getConfig(LEAF_DEVICE_ID, SegmentRoutingDeviceConfig.class)).andReturn(null).anyTimes();
expect(flowRuleService.getFlowEntriesById(APP_ID)).andReturn(ImmutableList.of()).times(3);
flowRuleService.apply(capture(capturedOpsForCollector));
flowRuleService.apply(capture(capturedOpsForSubnet));
flowRuleService.apply(capture(capturedOpsForQueueThresholds));
replay(netcfgService, flowRuleService);
// Verify values.
assertFalse(intProgrammable.setUpIntConfig(intConfig));
assertFlowRuleOperationsEquals(expectedOpsForCollector, capturedOpsForCollector.getValue());
assertFlowRuleOperationsEquals(EMPTY_FLOW_RULE_OPS, capturedOpsForSubnet.getValue());
verify(netcfgService, flowRuleService);
}
use of org.onosproject.net.flow.FlowRuleOperations in project fabric-tna by stratum.
the class FabricIntProgrammableTest method testSetUpSpineButInvalidLeafConfig.
/**
* Test installing report rules on spine but the config
* of leaf is invalid.
*/
@Test
public void testSetUpSpineButInvalidLeafConfig() {
final IntReportConfig intConfig = getIntReportConfig(APP_ID, "/int-report.json");
final Capture<FlowRuleOperations> capturedOpsForCollector = newCapture();
final Capture<FlowRuleOperations> capturedOpsForSubnet = newCapture();
final Capture<FlowRuleOperations> capturedOpsForQueueThresholds = newCapture();
final FlowRuleOperations expectedOpsForCollector = FlowRuleOperations.builder().add(buildCollectorWatchlistRule(SPINE_DEVICE_ID)).build();
// Expected steps of method calls, captures, and results.
reset(driverData, netcfgService);
expect(driverData.deviceId()).andReturn(SPINE_DEVICE_ID).anyTimes();
expect(netcfgService.getConfig(LEAF_DEVICE_ID, SegmentRoutingDeviceConfig.class)).andReturn(getSrConfig(SPINE_DEVICE_ID, "/sr-invalid.json")).anyTimes();
expect(netcfgService.getConfig(SPINE_DEVICE_ID, SegmentRoutingDeviceConfig.class)).andReturn(getSrConfig(SPINE_DEVICE_ID, "/sr-spine.json")).anyTimes();
expect(flowRuleService.getFlowEntriesById(APP_ID)).andReturn(ImmutableList.of()).times(3);
flowRuleService.apply(capture(capturedOpsForCollector));
flowRuleService.apply(capture(capturedOpsForSubnet));
flowRuleService.apply(capture(capturedOpsForQueueThresholds));
replay(driverData, flowRuleService, netcfgService);
// Verify values.
assertFalse(intProgrammable.setUpIntConfig(intConfig));
assertFlowRuleOperationsEquals(expectedOpsForCollector, capturedOpsForCollector.getValue());
assertFlowRuleOperationsEquals(EMPTY_FLOW_RULE_OPS, capturedOpsForSubnet.getValue());
verify(flowRuleService);
}
use of org.onosproject.net.flow.FlowRuleOperations in project fabric-tna by stratum.
the class FabricIntProgrammableTest method testSetupIntConfigWithQueueReportThreshold.
/**
* Test "setUpIntConfig" function of IntProgrammable with a config that contains
* queue report threshold config.
*/
@Test
public void testSetupIntConfigWithQueueReportThreshold() {
final IntReportConfig intConfig = getIntReportConfig(APP_ID, "/int-report-queue-report-threshold.json");
final List<FlowRule> expectRules = Lists.newArrayList();
final Capture<FlowRuleOperations> capturedOpsForCollector = newCapture();
final Capture<FlowRuleOperations> capturedOpsForSubnet = newCapture();
final Capture<FlowRuleOperations> capturedOpsForQueueThresholds = newCapture();
final Capture<FlowRule> capturedReportRules = newCapture(CaptureType.ALL);
final FlowRuleOperations expectedOpsForCollector = FlowRuleOperations.builder().add(buildCollectorWatchlistRule(LEAF_DEVICE_ID)).build();
// Queue threshold rules.
// Queue 0 has some old rules which must be removed before adding the new ones.
final List<FlowRule> queueThresholdRulesToRemove = queueReportFlows(LEAF_DEVICE_ID, 0, 0, (byte) 0);
final FlowRuleOperations.Builder opsBuilder = FlowRuleOperations.builder();
queueThresholdRulesToRemove.forEach(opsBuilder::remove);
opsBuilder.newStage();
// Add new entries for all queues.
for (byte queueId = 0; queueId < MAX_QUEUES; queueId++) {
// threshold config.
if (queueId == 0) {
queueReportFlows(LEAF_DEVICE_ID, 1888, 388, queueId).forEach(opsBuilder::add);
} else if (queueId == 7) {
// Queue 7 contains the "triggerNs" config only, the value of "resetNs"
// will be half of "triggerNs".
queueReportFlows(LEAF_DEVICE_ID, 500, 250, queueId).forEach(opsBuilder::add);
} else {
// The rest of the queues use the default queue latency threshold.
queueReportFlows(LEAF_DEVICE_ID, DEFAULT_QUEUE_REPORT_TRIGGER_LATENCY_THRESHOLD, DEFAULT_QUEUE_REPORT_RESET_LATENCY_THRESHOLD, queueId).forEach(opsBuilder::add);
}
}
final FlowRuleOperations expectedOpsForQueueThresholds = opsBuilder.build();
expectRules.add(buildReportTableRule(LEAF_DEVICE_ID, false, BMD_TYPE_INT_INGRESS_DROP, INT_REPORT_TYPE_DROP, MIRROR_TYPE_INVALID));
expectRules.add(buildReportTableRule(LEAF_DEVICE_ID, false, BMD_TYPE_EGRESS_MIRROR, INT_REPORT_TYPE_DROP, MIRROR_TYPE_INT_REPORT));
expectRules.add(buildReportTableRule(LEAF_DEVICE_ID, false, BMD_TYPE_EGRESS_MIRROR, INT_REPORT_TYPE_FLOW, MIRROR_TYPE_INT_REPORT));
expectRules.add(buildReportTableRule(LEAF_DEVICE_ID, false, BMD_TYPE_DEFLECTED, INT_REPORT_TYPE_DROP, MIRROR_TYPE_INVALID));
expectRules.add(buildReportTableRule(LEAF_DEVICE_ID, false, BMD_TYPE_EGRESS_MIRROR, INT_REPORT_TYPE_QUEUE, MIRROR_TYPE_INT_REPORT));
expectRules.add(buildReportTableRule(LEAF_DEVICE_ID, false, BMD_TYPE_EGRESS_MIRROR, (short) (INT_REPORT_TYPE_QUEUE | INT_REPORT_TYPE_FLOW), MIRROR_TYPE_INT_REPORT));
expectRules.add(buildFilterConfigFlow(LEAF_DEVICE_ID));
List<Capture<FlowRule>> captures = Lists.newArrayList();
for (int i = 0; i < expectRules.size(); i++) {
Capture<FlowRule> flowRuleCapture = newCapture();
flowRuleService.applyFlowRules(capture(flowRuleCapture));
captures.add(flowRuleCapture);
}
// Expected steps of method calls, captures, and results.
reset(flowRuleService);
final List<FlowEntry> existingFlowEntries = queueThresholdRulesToRemove.stream().map(f -> buildFlowEntry(f)).collect(Collectors.toList());
expect(flowRuleService.getFlowEntriesById(APP_ID)).andReturn(existingFlowEntries).times(3);
flowRuleService.apply(capture(capturedOpsForCollector));
flowRuleService.apply(capture(capturedOpsForSubnet));
flowRuleService.apply(capture(capturedOpsForQueueThresholds));
flowRuleService.applyFlowRules(capture(capturedReportRules));
expectLastCall().times(expectRules.size());
replay(flowRuleService);
// Verify values.
assertTrue(intProgrammable.setUpIntConfig(intConfig));
assertFlowRuleOperationsEquals(expectedOpsForCollector, capturedOpsForCollector.getValue());
assertFlowRuleOperationsEquals(EMPTY_FLOW_RULE_OPS, capturedOpsForSubnet.getValue());
assertFlowRuleOperationsEquals(expectedOpsForQueueThresholds, capturedOpsForQueueThresholds.getValue());
for (int i = 0; i < expectRules.size(); i++) {
FlowRule expectRule = expectRules.get(i);
FlowRule actualRule = capturedReportRules.getValues().get(i);
assertTrue(expectRule.exactMatch(actualRule));
}
verify(flowRuleService);
}
use of org.onosproject.net.flow.FlowRuleOperations in project fabric-tna by stratum.
the class MockFlowRuleService method apply.
@Override
public void apply(FlowRuleOperations ops) {
AtomicBoolean thisSuccess = new AtomicBoolean(success);
ops.stages().forEach(stage -> stage.forEach(flow -> {
if (errorFlow == flow.rule().id().value()) {
thisSuccess.set(false);
} else {
switch(flow.type()) {
case ADD:
case // TODO is this the right behavior for modify?
MODIFY:
((DefaultFlowEntry) flow.rule()).setState(FlowEntry.FlowEntryState.ADDED);
flows.add(flow.rule());
break;
case REMOVE:
// Remove and add in REMOVED state
flows.remove(flow.rule());
((DefaultFlowEntry) flow.rule()).setState(FlowEntry.FlowEntryState.REMOVED);
flows.add(flow.rule());
break;
default:
break;
}
}
}));
if (thisSuccess.get()) {
ops.callback().onSuccess(ops);
} else {
ops.callback().onError(ops);
}
}
use of org.onosproject.net.flow.FlowRuleOperations in project onos by opennetworkinglab.
the class MockFlowRuleService method apply.
@Override
public void apply(FlowRuleOperations ops) {
AtomicBoolean thisSuccess = new AtomicBoolean(success);
ops.stages().forEach(stage -> stage.forEach(flow -> {
if (errorFlow == flow.rule().id().value()) {
thisSuccess.set(false);
} else {
switch(flow.type()) {
case ADD:
case // TODO is this the right behavior for modify?
MODIFY:
flows.add(flow.rule());
break;
case REMOVE:
flows.remove(flow.rule());
break;
default:
break;
}
}
}));
if (thisSuccess.get()) {
ops.callback().onSuccess(ops);
} else {
ops.callback().onError(ops);
}
}
Aggregations