mirror of
https://github.com/opennetworkinglab/onos.git
synced 2025-11-07 11:42:03 +01:00
【ONOS-1871】Provide CLI support on flowrule subsystem extension for QA
purposes。 Create a new test application to apply a flow rule to a third-party random device automatically. and modfiy FlowsListCommand to show third-party flow rule. Change-Id: I8902b1577c91c43a7755afd4c1c40fc5ba87d54f
This commit is contained in:
parent
75874dae51
commit
f988bf5e4e
@ -36,6 +36,7 @@
|
|||||||
<module>intent-perf</module>
|
<module>intent-perf</module>
|
||||||
<module>messaging-perf</module>
|
<module>messaging-perf</module>
|
||||||
<module>demo</module>
|
<module>demo</module>
|
||||||
|
<module>samples</module>
|
||||||
<module>distributed-primitives</module>
|
<module>distributed-primitives</module>
|
||||||
</modules>
|
</modules>
|
||||||
|
|
||||||
|
|||||||
56
apps/test/samples/pom.xml
Normal file
56
apps/test/samples/pom.xml
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!--
|
||||||
|
~ Copyright 2015 Open Networking Laboratory
|
||||||
|
~
|
||||||
|
~ Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
~ you may not use this file except in compliance with the License.
|
||||||
|
~ You may obtain a copy of the License at
|
||||||
|
~
|
||||||
|
~ http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
~
|
||||||
|
~ Unless required by applicable law or agreed to in writing, software
|
||||||
|
~ distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
~ See the License for the specific language governing permissions and
|
||||||
|
~ limitations under the License.
|
||||||
|
-->
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
<parent>
|
||||||
|
<groupId>org.onosproject</groupId>
|
||||||
|
<artifactId>onos-apps-test</artifactId>
|
||||||
|
<version>1.2.0-SNAPSHOT</version>
|
||||||
|
<relativePath>../pom.xml</relativePath>
|
||||||
|
</parent>
|
||||||
|
|
||||||
|
<artifactId>onos-app-samples</artifactId>
|
||||||
|
<packaging>bundle</packaging>
|
||||||
|
|
||||||
|
<description>Flow throughput test application</description>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<onos.app.name>org.onosproject.flowrule</onos.app.name>
|
||||||
|
</properties>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.osgi</groupId>
|
||||||
|
<artifactId>org.osgi.compendium</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.karaf.shell</groupId>
|
||||||
|
<artifactId>org.apache.karaf.shell.console</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<!-- Required for javadoc generation -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.osgi</groupId>
|
||||||
|
<artifactId>org.osgi.core</artifactId>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</project>
|
||||||
@ -0,0 +1,8 @@
|
|||||||
|
package org.onosproject.flowrule;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Applications test service.
|
||||||
|
*/
|
||||||
|
public interface AppTestService {
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,96 @@
|
|||||||
|
package org.onosproject.flowrule.dispatch;
|
||||||
|
|
||||||
|
import static org.slf4j.LoggerFactory.getLogger;
|
||||||
|
|
||||||
|
import java.io.BufferedReader;
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileReader;
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
import org.onosproject.core.ApplicationId;
|
||||||
|
import org.onosproject.net.DeviceId;
|
||||||
|
import org.onosproject.net.device.DeviceService;
|
||||||
|
import org.onosproject.net.flow.DefaultFlowRule;
|
||||||
|
import org.onosproject.net.flow.FlowRule;
|
||||||
|
import org.onosproject.net.flow.FlowRuleExtPayLoad;
|
||||||
|
import org.onosproject.net.flow.FlowRuleService;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* third party flow rule test code.
|
||||||
|
*/
|
||||||
|
public class FlowRuleTest {
|
||||||
|
|
||||||
|
private final Logger log = getLogger(getClass());
|
||||||
|
protected FlowRuleService flowRuleService;
|
||||||
|
protected DeviceService deviceService;
|
||||||
|
private ApplicationId appId;
|
||||||
|
private FlowRule[] flowSet = new DefaultFlowRule[10];
|
||||||
|
private DeviceId deviceId;
|
||||||
|
private static final String FILE_NAME = "/src/main/resource/org/onosproject/flowrule/resource/flowrule.txt";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a flow rule test object.
|
||||||
|
* @param flowRuleService service for injecting flow rules into the environment
|
||||||
|
* @param deviceService service for interacting with the inventory of infrastructure devices
|
||||||
|
* @param appId application identifier
|
||||||
|
*/
|
||||||
|
public FlowRuleTest(FlowRuleService flowRuleService,
|
||||||
|
DeviceService deviceService, ApplicationId appId) {
|
||||||
|
this.flowRuleService = flowRuleService;
|
||||||
|
this.deviceService = deviceService;
|
||||||
|
this.deviceId = deviceService.getAvailableDevices().iterator().next().id();
|
||||||
|
this.appId = appId;
|
||||||
|
loadFile();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void loadFile() {
|
||||||
|
String relativelyPath = System.getProperty("user.dir");
|
||||||
|
File flowFile = new File(relativelyPath + FILE_NAME);
|
||||||
|
BufferedReader br = null;
|
||||||
|
try {
|
||||||
|
FileReader in = new FileReader(flowFile);
|
||||||
|
br = new BufferedReader(in);
|
||||||
|
FlowRule rule = null;
|
||||||
|
int i = 0;
|
||||||
|
String flow = "";
|
||||||
|
while ((flow = br.readLine()) != null) {
|
||||||
|
rule = buildFlowRule(flow);
|
||||||
|
flowSet[i++] = rule;
|
||||||
|
}
|
||||||
|
} catch (IOException e) {
|
||||||
|
log.info("file does not exist.");
|
||||||
|
} finally {
|
||||||
|
if (br != null) {
|
||||||
|
try {
|
||||||
|
br.close();
|
||||||
|
} catch (IOException e) {
|
||||||
|
log.info("nothing");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private FlowRule buildFlowRule(String flow) {
|
||||||
|
FlowRuleExtPayLoad payLoad = FlowRuleExtPayLoad.flowRuleExtPayLoad(flow
|
||||||
|
.getBytes());
|
||||||
|
FlowRule flowRule = new DefaultFlowRule(deviceId, null, null, 0, appId,
|
||||||
|
0, false, payLoad);
|
||||||
|
return flowRule;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Apply flow rules to specific devices.
|
||||||
|
*/
|
||||||
|
public void applyFlowRules() {
|
||||||
|
flowRuleService.applyFlowRules(flowSet);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove flow rules from specific devices.
|
||||||
|
*/
|
||||||
|
public void removeFlowRules() {
|
||||||
|
flowRuleService.removeFlowRules(flowSet);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,21 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2014-2015 Open Networking Laboratory
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Provide for specific functional test script. e.g. flow rule subsystem extension.
|
||||||
|
* You can create a new class to test other functions.
|
||||||
|
*/
|
||||||
|
package org.onosproject.flowrule.dispatch;
|
||||||
@ -0,0 +1,51 @@
|
|||||||
|
package org.onosproject.flowrule.impl;
|
||||||
|
|
||||||
|
import static org.slf4j.LoggerFactory.getLogger;
|
||||||
|
|
||||||
|
import org.apache.felix.scr.annotations.Activate;
|
||||||
|
import org.apache.felix.scr.annotations.Component;
|
||||||
|
import org.apache.felix.scr.annotations.Deactivate;
|
||||||
|
import org.apache.felix.scr.annotations.Reference;
|
||||||
|
import org.apache.felix.scr.annotations.ReferenceCardinality;
|
||||||
|
import org.apache.felix.scr.annotations.Service;
|
||||||
|
import org.onosproject.core.ApplicationId;
|
||||||
|
import org.onosproject.core.CoreService;
|
||||||
|
import org.onosproject.flowrule.AppTestService;
|
||||||
|
import org.onosproject.flowrule.dispatch.FlowRuleTest;
|
||||||
|
import org.onosproject.net.device.DeviceService;
|
||||||
|
import org.onosproject.net.flow.FlowRuleService;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test for a application.
|
||||||
|
*/
|
||||||
|
@Component(immediate = true)
|
||||||
|
@Service
|
||||||
|
public class AppTestManager implements AppTestService {
|
||||||
|
|
||||||
|
private static final String APP_TEST = "org.onosproject.apptest";
|
||||||
|
private final Logger log = getLogger(getClass());
|
||||||
|
|
||||||
|
@Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
|
||||||
|
protected CoreService coreService;
|
||||||
|
@Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
|
||||||
|
protected FlowRuleService flowRuleService;
|
||||||
|
@Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
|
||||||
|
protected DeviceService deviceService;
|
||||||
|
private ApplicationId appId;
|
||||||
|
FlowRuleTest flowRule;
|
||||||
|
|
||||||
|
@Activate
|
||||||
|
protected void activate() {
|
||||||
|
log.info("APP-TEST started");
|
||||||
|
appId = coreService.registerApplication(APP_TEST);
|
||||||
|
flowRule = new FlowRuleTest(flowRuleService, deviceService, appId);
|
||||||
|
flowRule.applyFlowRules();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Deactivate
|
||||||
|
protected void deactivate() {
|
||||||
|
flowRule.removeFlowRules();
|
||||||
|
log.info("APP-TEST Stopped");
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,21 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2014-2015 Open Networking Laboratory
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test for flow rule subsystem extension.
|
||||||
|
* Also used to test other functions, but it need be extended.
|
||||||
|
*/
|
||||||
|
package org.onosproject.flowrule.impl;
|
||||||
@ -0,0 +1,21 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2014-2015 Open Networking Laboratory
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test for flow rule subsystem extension.
|
||||||
|
* Now it has no APIs, Maybe it can add other methods in future.
|
||||||
|
*/
|
||||||
|
package org.onosproject.flowrule;
|
||||||
@ -0,0 +1 @@
|
|||||||
|
050e009000000000000000000000000000000000000000000701000000000000000000000000000000000000000000020001001080001702010180001902010200040030000000000000001000000006000000000000000000130008001300000019001080001a0101000000000000000002000000000000000000000000000100000000000000010001000003000000
|
||||||
@ -0,0 +1,20 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2014-2015 Open Networking Laboratory
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* applications live here.
|
||||||
|
*/
|
||||||
|
package org.onosproject.flowrule.resource;
|
||||||
@ -15,6 +15,8 @@
|
|||||||
*/
|
*/
|
||||||
package org.onosproject.cli.net;
|
package org.onosproject.cli.net;
|
||||||
|
|
||||||
|
import static com.google.common.collect.Lists.newArrayList;
|
||||||
|
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
@ -38,10 +40,8 @@ import com.fasterxml.jackson.databind.ObjectMapper;
|
|||||||
import com.fasterxml.jackson.databind.node.ArrayNode;
|
import com.fasterxml.jackson.databind.node.ArrayNode;
|
||||||
import com.fasterxml.jackson.databind.node.ObjectNode;
|
import com.fasterxml.jackson.databind.node.ObjectNode;
|
||||||
|
|
||||||
import static com.google.common.collect.Lists.newArrayList;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Lists all currently-known hosts.
|
* Lists all currently-known flows.
|
||||||
*/
|
*/
|
||||||
@Command(scope = "onos", name = "flows",
|
@Command(scope = "onos", name = "flows",
|
||||||
description = "Lists all currently-known flows.")
|
description = "Lists all currently-known flows.")
|
||||||
@ -50,7 +50,7 @@ public class FlowsListCommand extends AbstractShellCommand {
|
|||||||
public static final String ANY = "any";
|
public static final String ANY = "any";
|
||||||
|
|
||||||
private static final String FMT =
|
private static final String FMT =
|
||||||
" id=%s, state=%s, bytes=%s, packets=%s, duration=%s, priority=%s, tableId=%s, timeout=%s, appId=%s";
|
" id=%s, state=%s, bytes=%s, packets=%s, duration=%s, priority=%s, tableId=%s appId=%s, payLoad=%s";
|
||||||
private static final String TFMT = " treatment=%s";
|
private static final String TFMT = " treatment=%s";
|
||||||
private static final String SFMT = " selector=%s";
|
private static final String SFMT = " selector=%s";
|
||||||
|
|
||||||
@ -156,7 +156,8 @@ public class FlowsListCommand extends AbstractShellCommand {
|
|||||||
for (FlowEntry f : flows) {
|
for (FlowEntry f : flows) {
|
||||||
print(FMT, Long.toHexString(f.id().value()), f.state(),
|
print(FMT, Long.toHexString(f.id().value()), f.state(),
|
||||||
f.bytes(), f.packets(), f.life(), f.priority(), f.tableId(),
|
f.bytes(), f.packets(), f.life(), f.priority(), f.tableId(),
|
||||||
f.timeout(), coreService.getAppId(f.appId()).name());
|
coreService.getAppId(f.appId()).name(),
|
||||||
|
f.payLoad() == null ? null : f.payLoad().payLoad().toString());
|
||||||
print(SFMT, f.selector().criteria());
|
print(SFMT, f.selector().criteria());
|
||||||
print(TFMT, f.treatment());
|
print(TFMT, f.treatment());
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user