今天紀錄如和使用API方式建立出SFC,主要是如何在已有的ONOS project加入API架構,另外今天的測試與昨天一樣,因此關於SFC的部分就不在做測試,只有紀錄通過API方式加入chain。
這行指令要在onos底下執行,而不是在專案內執行
./tools/dev/bin/onos-create-app rest org onos_test 1.0
org 為api生成java檔的位置
onos_test為專案資料夾名稱
1.0為pom.xml的version
會生成AppWebApplication以及AppWebResource兩個java檔案,主要function的部分會再AppWebResource寫。
這部分並不會有太難的部分,因為我使用的只有最簡單的方式打的API。
AppWebResource.java
@Path("sfc")
public class AppWebResource extends AbstractWebResource {
private final Logger log = LoggerFactory.getLogger(getClass());
/**
* Get hello world greeting.
*
* @return 200 OK
*/
@GET
@Path("")
public Response getGreeting() {
ObjectNode node = mapper().createObjectNode().put("hello", "world");
return ok(node).build();
}
@POST
@Path("register")
@Produces(MediaType.APPLICATION_JSON) //表示輸出json
@Consumes(MediaType.APPLICATION_JSON) //表示輸入為json
public Response getSfInfo(InputStream stream) {
ObjectNode root = mapper().createObjectNode();
try {
ObjectNode jsonTree = readTreeFromStream(mapper(), stream);
JsonNode inputData = jsonTree.get("inputData");
if (inputData.isArray()) {
for (JsonNode objNode : inputData) {
ArrayList<String> ipAddressArrayList = new ArrayList<>();
for (JsonNode ip : objNode.get("ipArray")) {
String ipv4Address = ip.asText();
ipAddressArrayList.add(ipv4Address);
}
long rate=Long.valueOf(objNode.get("rate").asText().toString());
String source = objNode.get("source").asText();
String destination = objNode.get("destination").asText();
IpRouteFeatures ipRouteFeatures = IpRoute.builder()
.setSFCRate(rate)
.setSFCIpRoute(ipAddressArrayList)
.build();
getIpRouteInfo().put(RouteKey.key(source+destination), ipRouteFeatures);
root.put("return","register Success");
}
}
} catch (Exception e) {
root.put("return",e.toString());
}
return ok(root).build();
}
@GET
@Path("list")
public Response listSF() {
ObjectNode root = mapper().createObjectNode();
ArrayNode arrayNode = root.putArray("IpRouteInfo");
for (Map.Entry<RouteKey,IpRouteFeatures> entry : getIpRouteInfo().entrySet()) {
ObjectNode infoData = mapper().createObjectNode();
infoData.put("key",entry.getKey().toString());
infoData.put("ipRoute",entry.getValue().getIpRoute().toString());
infoData.put("rate",entry.getValue().getRate());
arrayNode.add(infoData);
}
return ok(root).build();
}
@POST
@Path("delete")
@Consumes(MediaType.APPLICATION_JSON)
public Response deleteSFC(InputStream stream) {
ObjectNode root = mapper().createObjectNode();
try {
ObjectNode jsonTree = readTreeFromStream(mapper(), stream);
// String routeKey = jsonTree.get("routeKey").asText();
String source = jsonTree.get("source").asText();
String destination = jsonTree.get("destination").asText();
if (getIpRouteInfo().get(RouteKey.key(source+destination)) != null) {
// getIpRouteInfo().remove(RouteKey.key(routeKey));
root.put("Status", "Successful:");
root.put("routeKey",source+destination);
} else {
root.put("Status", "not found sfc");
return ok(root).status(403).build();
}
} catch (IOException e) {
root.put("Status", "Fail");
root.put("Message", e.getMessage());
}
return ok(root).build();
}
}
這部分最初始的網址為:
http://10.0.0.84:8181/onos/onos_test/sfc/
由於pom.xml中properties內有<web.context>的欄位,這為前面onos/onos_test的部分,初始會是project位置,sfc為class的Path。
假設要使用註冊功能,則網址為:
http://10.0.0.84:8181/onos/onos_test/sfc/register
我將於postman做測試。get部分我就不做展示了,我只介紹post的部分。
ps.記得先將app裝在onos上,api才會開啟。
輸入的json。(rate可以不用理會,這是其他部分的功能,在這並沒有實行)就像SFC功能,有個來源以及目的地,並且chain的路徑。
{
"inputData":[
{
"source" : "10.0.0.1",
"destination": "10.0.0.4",
"ipArray" : ["10.0.0.1","10.0.0.2","10.0.0.3","10.0.0.4"],
"rate" : "3000"
},
{
"source" : "10.0.0.1",
"destination": "10.0.0.3",
"ipArray" : ["10.0.0.1","10.0.0.2","10.0.0.3"],
"rate" : "1500"
}
]
}
要注意,onos的post在Authorization需要輸入帳號密碼
當post成功時會出現
"return": "register Success"
這表示註冊成功,可以通過list取得註冊的資訊。
(GET)http://10.0.0.84:8181/onos/onos_test/sfc/list
到此為API使用的簡單講解。
git部分