Floodlightコントローラの実践——モジュールにサービスとREST APIを加入し、RESTインタフェースを利用してJSON入力を分析し、JSON出力を構築する
8353 ワード
クラスの作成 IFLoodlightModuleおよびIOFMEssageListenerインタフェースを実装するクラスを作成します.IFLoodlightModuleはfloodlightモジュールであることを示します.IOFMEssageListenerインタフェースは、OFメッセージを傍受するために使用される. メンバー変数floodlightProviderを宣言します. getModuleDependences()では、このモジュールはIFLoodlightProviderServicesに依存しているとmodule loaderに伝えています.class init()で を初期化する. startUp()でfloodlightProviderにpacketInメッセージを処理したいと伝えました: サービスへの参加 IFLoodlightServiceを継承したXXXserviceインタフェースを作成し、このインタフェースで実装する機能を定義し、このクラスにこのインタフェースを実装させます. module systemにXXXServiceというサービスを提供していることを伝えるために、getModuleServices()とgetServiceImpls()メソッドを変更します.getModuleServices()で: であることを伝えます.
モジュールにサービスを加えると,モジュールは特定の機能を実現する方法を有し,外部に特定のサービスを提供することができる.
REST APIに参加 REST APIサービスの参照を追加します.宣言変数 getModuleDependences()では、モジュールがIrestapiServicesに依存していることをmodule loaderに伝えています.class init()で を初期化する.は私たちのモジュールに希望するURIを定義します.私たちが実際に露出したいRESTインタフェースを定義し、これらのURIだけが使用されます.そうでなければRestletは私たちにルーティング要求をすることができません.最初のステップは、クラス実装RestletのRestletRoutableインタフェース、basePath()とgetRestlet()の2つの方法を作成することです.例:
5.モジュールで定義されたURIを実装する.クラス実装上のgetRestlet関数で定義したすべてのURIを記述します.各クラスは、対応するURIが受信したhttpリクエスト(GET、POST、PUT、DELETE)を処理する.すべてのURI-handlerクラスは、サーバResourceを継承する必要があります.このクラスでメソッドを任意に定義でき、特別な方法でメソッドを書き換える必要はありません.ただしhttp命令コメント(@Get,@Post,@Put,@Delete)でこのhttp命令を処理する方法は必須です.例:
JSON関連 JSON入力を分析Jacksonの多くの方法を利用して、HTTP PUTとPOST入力としてのJSONの分析を助けることができます.具体的な方法はジャックソンを学ぶことができます. 構築JSON出力は、Jacksonを使用してデータをREST形式にシーケンス化することができる.JSONメッセージは、Jacksonによって組み立てられ、HTTPコマンド処理関数(@Get("json")コメント付き)から返すことができます.
例:まずコードを見る
この方法は、HTTP GETメッセージを受信すると、URI-handlerがOFFlowModMapオブジェクトを返すことを示します.OFFlowModMapクラスの表示:
1行目の注釈には、OFFlowModMapタイプのオブジェクトをJSONに変換するクラスが指定されています.このクラスはOFFlowModMapSerializerです.OFFlowModMapSerializerクラスのコードを見てみましょう.
以上のようにJSON出力を構築するには(あるタイプのオブジェクトをJSONに変換する):1.私たちはクラスでJsonSerializerを継承しなければなりません.2.あるいは上記の例のように、OFFlowModMapタイプのオブジェクトをJSONに変換するには、
3.もう1つの方法は、自分でカスタムserializerクラスを書いて、カスタムserializerをnet.に追加することです.floodlightcontroller.web.serialzersパッケージでは、対応するコメントを変更することで達成します.カスタムserializerクラスでは、serialize()メソッドを上書きする必要があります.これにより、カスタムJSON serializerを呼び出すことができます.たとえば、IOFSwitchタイプに対してserializerを書きます.は、まずクラス継承 それからIOFSwitchクラスを見つけて、IOFSwitch注釈を修正します:
protected IFloodlightProviderService floodlightProvider;
FloodlightProviderはコアモジュールとして、受け取ったOFパッケージを1つのイベントに変換し、他のモジュールはFloodlightProviderに登録し、登録してサービスになり、対応するイベントを処理することができます.floodlightProvider =context.getServiceImpl(IFloodlightProviderService.class);
floodlightProvider.addOFMessageListener(OFType.PACKET_IN, this);
Collection> l
l.add(XXXService.class);
return l;
getServiceImpls()で:Map, IFloodlightService> m
m.put(XXXService.class, this);
return m;
getServiceImpls()はmodule systemにサービスを提供するクラスモジュールにサービスを加えると,モジュールは特定の機能を実現する方法を有し,外部に特定のサービスを提供することができる.
REST APIに参加
protected IRestApiService restApi;
IrestapiServiceはRestletに依存するFloodlightサービスです.各モジュールは簡単にIrestapiServiceを登録するだけでREST APIを実現できる.IrestapiServiceは、最下位の詳細を処理します.Collection> l
l.add(IRestApiService.class);
return l;
restApi = context.getServiceImpl(IRestApiService.class);
public class PktInHistoryWebRoutable implements RestletRoutable {
@Override
public Restlet getRestlet(Context context) {
Router router = new Router(context);
router.attach("/history/json", PktInHistoryResource.class);//attach URI PktInHistoryResource , 5
return router;
}
@Override
public String basePath() {
return "/wm/pktinhistory";
}
5.モジュールで定義されたURIを実装する.クラス実装上のgetRestlet関数で定義したすべてのURIを記述します.各クラスは、対応するURIが受信したhttpリクエスト(GET、POST、PUT、DELETE)を処理する.すべてのURI-handlerクラスは、サーバResourceを継承する必要があります.このクラスでメソッドを任意に定義でき、特別な方法でメソッドを書き換える必要はありません.ただしhttp命令コメント(@Get,@Post,@Put,@Delete)でこのhttp命令を処理する方法は必須です.例:
public class PktInHistoryResource extends ServerResource {
@Get("json")
//@Get retrieve(), "/wm/pktinhistory/history/json" HTTP GET
public List retrieve() {
IPktinHistoryService pihr = (IPktinHistoryService)getContext().getAttributes().get(IPktinHistoryService.class.getCanonicalName());
//IPktinHistoryService service
List l = new ArrayList();
l.addAll(java.util.Arrays.asList(pihr.getBuffer().snapshot()));
//IPktinHistoryService getBuffer
return l;
}
}
JSON関連
例:まずコードを見る
@Get("json")
public OFFlowModMap ListStaticFlowEntries() {
...
return new OFFlowModMap(sfpService.getFlows());
...
}
この方法は、HTTP GETメッセージを受信すると、URI-handlerがOFFlowModMapオブジェクトを返すことを示します.OFFlowModMapクラスの表示:
@JsonSerialize(using=OFFlowModMapSerializer.class)
public class OFFlowModMap {
//
}
1行目の注釈には、OFFlowModMapタイプのオブジェクトをJSONに変換するクラスが指定されています.このクラスはOFFlowModMapSerializerです.OFFlowModMapSerializerクラスのコードを見てみましょう.
public class OFFlowModMapSerializer extends JsonSerializer<OFFlowModMap> {
@Override
public void serialize(OFFlowModMap fmm, JsonGenerator jGen, SerializerProvider serializer)
throws IOException, JsonProcessingException {
//
}
}
以上のようにJSON出力を構築するには(あるタイプのオブジェクトをJSONに変換する):1.私たちはクラスでJsonSerializerを継承しなければなりません.2.あるいは上記の例のように、OFFlowModMapタイプのオブジェクトをJSONに変換するには、
JsonSerializer
を継承するOFFlowModMapSerializerを使用します.(このserializerはFloodlightが持参したもので、OFFlowModMapタイプのオブジェクトをJSONに変換するのに特化しています)3.もう1つの方法は、自分でカスタムserializerクラスを書いて、カスタムserializerをnet.に追加することです.floodlightcontroller.web.serialzersパッケージでは、対応するコメントを変更することで達成します.カスタムserializerクラスでは、serialize()メソッドを上書きする必要があります.これにより、カスタムJSON serializerを呼び出すことができます.たとえば、IOFSwitchタイプに対してserializerを書きます.
JsonSerializer
をカスタマイズし、net.にクラスを追加する.floodlightcontroller.web.serialzersパッケージpublic class IOFSwitchJSONSerializer extends JsonSerializer<IOFSwitch> {
// (override)serialize
public void serialize(IOFSwitch theSwitch, JsonGenerator jGen,
SerializerProvider arg2) throws IOException,
JsonProcessingException { //
}
@JsonSerialize(using=IOFSwitchJSONSerializer.class)
public interface IOFSwitch extends IOFMessageWriter {
}
原注釈は@JsonSerialize(using=IOFSwitchSerializer.class)
だったはずです.ここではカスタムSerializerで置き換えられました.これでJacksonは、カスタムIOFSwitchJSONSerilizerクラスを使用することを知っています.