iT邦幫忙

第 12 屆 iT 邦幫忙鐵人賽

DAY 14
0
自我挑戰組

Cloud/SDN/SFC...菜鳥的學習筆記系列 第 14

Day14 菜鳥的SFC-使用API方式建立SFC

今天紀錄如和使用API方式建立出SFC,主要是如何在已有的ONOS project加入API架構,另外今天的測試與昨天一樣,因此關於SFC的部分就不在做測試,只有紀錄通過API方式加入chain。

加入API架構

這行指令要在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方式

這部分並不會有太難的部分,因為我使用的只有最簡單的方式打的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

使用API

我將於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部分


上一篇
Day13 菜鳥的SFC-簡易SFC範例與介紹
下一篇
Day15 開源專案-kube5gnfvo安裝
系列文
Cloud/SDN/SFC...菜鳥的學習筆記30

尚未有邦友留言

立即登入留言