Floodlightコントローラの実践——モジュールにサービスとREST APIを加入し、RESTインタフェースを利用してJSON入力を分析し、JSON出力を構築する

8353 ワード

クラスの作成
  • IFLoodlightModuleおよびIOFMEssageListenerインタフェースを実装するクラスを作成します.IFLoodlightModuleはfloodlightモジュールであることを示します.IOFMEssageListenerインタフェースは、OFメッセージを傍受するために使用される.
  • メンバー変数floodlightProviderを宣言します.protected IFloodlightProviderService floodlightProvider; FloodlightProviderはコアモジュールとして、受け取ったOFパッケージを1つのイベントに変換し、他のモジュールはFloodlightProviderに登録し、登録してサービスになり、対応するイベントを処理することができます.
  • getModuleDependences()では、このモジュールはIFLoodlightProviderServicesに依存しているとmodule loaderに伝えています.class
  • init()でfloodlightProvider =context.getServiceImpl(IFloodlightProviderService.class);
  • を初期化する.
  • startUp()でfloodlightProviderにpacketInメッセージを処理したいと伝えました:floodlightProvider.addOFMessageListener(OFType.PACKET_IN, this);
  • サービスへの参加
  • IFLoodlightServiceを継承したXXXserviceインタフェースを作成し、このインタフェースで実装する機能を定義し、このクラスにこのインタフェースを実装させます.
  • module systemにXXXServiceというサービスを提供していることを伝えるために、getModuleServices()とgetServiceImpls()メソッドを変更します.getModuleServices()で:Collection> l
    l.add(XXXService.class);
    return l;
    getServiceImpls()で:Map, IFloodlightService> m
    m.put(XXXService.class, this);
    return m;
    getServiceImpls()はmodule systemにサービスを提供するクラス
  • であることを伝えます.
    モジュールにサービスを加えると,モジュールは特定の機能を実現する方法を有し,外部に特定のサービスを提供することができる.
    REST APIに参加
  • REST APIサービスの参照を追加します.宣言変数protected IRestApiService restApi; IrestapiServiceはRestletに依存するFloodlightサービスです.各モジュールは簡単にIrestapiServiceを登録するだけでREST APIを実現できる.IrestapiServiceは、最下位の詳細を処理します.
  • getModuleDependences()では、モジュールがIrestapiServicesに依存していることをmodule loaderに伝えています.class Collection> l l.add(IRestApiService.class); return l;
  • init()でrestApi = context.getServiceImpl(IRestApiService.class);
  • を初期化する.
  • は私たちのモジュールに希望するURIを定義します.私たちが実際に露出したいRESTインタフェースを定義し、これらのURIだけが使用されます.そうでなければRestletは私たちにルーティング要求をすることができません.最初のステップは、クラス実装RestletのRestletRoutableインタフェース、basePath()とgetRestlet()の2つの方法を作成することです.例:
  • 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関連
  • JSON入力を分析Jacksonの多くの方法を利用して、HTTP PUTとPOST入力としてのJSONの分析を助けることができます.具体的な方法はジャックソンを学ぶことができます.
  • 構築JSON出力は、Jacksonを使用してデータをREST形式にシーケンス化することができる.JSONメッセージは、Jacksonによって組み立てられ、HTTPコマンド処理関数(@Get("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 {  //                                              
                                                       }
    
  • それからIOFSwitchクラスを見つけて、IOFSwitch注釈を修正します:
    @JsonSerialize(using=IOFSwitchJSONSerializer.class)
    public interface IOFSwitch extends IOFMessageWriter {
    }
    原注釈は@JsonSerialize(using=IOFSwitchSerializer.class)だったはずです.ここではカスタムSerializerで置き換えられました.これでJacksonは、カスタムIOFSwitchJSONSerilizerクラスを使用することを知っています.