floodligth rest开发

来源:互联网 发布:孙真人知柏地黄丸好吗 编辑:程序博客网 时间:2024/06/11 21:52

根据release note来看,主要最大的更新在于添加了对于of1.3的支持。虽然我尚未验证(后续会验证)floodlightof1.3的支持程度,但是release note中的这句话:“ and work with OpenFlow 1.3 features such as groups and meters.”。我猜测大概是能够识别组表和计量表,但是不作处理。OTZ……还有就是以往一些小bug的修复,最直观的就是页面的改进。拓扑结构、ip、流表等信息不再像以往一样显不显示得看脸,可以实时准确的显示出来。

下面是具体的添加模块的实验。

导入工程:

Git上直接拉下来的代码是没法直接导入到eclipse中的,需要添加.project文件和,classpath文件:

Project文件:

[html] view plain copy
 
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2.     <projectDescription>  
  3.         <name>floodlight</name>  
  4.         <comment></comment>  
  5.         <projects>  
  6.         </projects>  
  7.         <buildSpec>  
  8.             <buildCommand>  
  9.                 <name>org.python.pydev.PyDevBuilder</name>  
  10.                 <arguments>  
  11.                 </arguments>  
  12.             </buildCommand>  
  13.             <buildCommand>  
  14.                 <name>org.eclipse.jdt.core.javabuilder</name>  
  15.                 <arguments>  
  16.                 </arguments>  
  17.              </buildCommand>  
  18.         </buildSpec>  
  19.         <natures>  
  20.             <nature>org.eclipse.jdt.core.javanature</nature>  
  21.             <nature>org.python.pydev.pythonNature</nature>  
  22.         </natures>  
  23. </projectDescription>  


Classpath文件:

[html] view plain copy
 
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <classpath>  
  3.     <classpathentry kind="src" output="target/bin" path="src/main/java"/>  
  4.     <classpathentry kind="src" path="src/main/resources"/>  
  5.     <classpathentry kind="src" output="target/bin-test" path="src/test/java"/>  
  6.     <classpathentry kind="src" path="src/test/resources"/>  
  7.     <classpathentry kind="src" output="target/bin" path="lib/gen-java"/>  
  8.     <classpathentry exported="true" kind="lib" path="lib/args4j-2.0.16.jar"/>  
  9.     <classpathentry exported="true" kind="lib" path="lib/cglib-nodep-2.2.2.jar"/>  
  10.     <classpathentry exported="true" kind="lib" path="lib/concurrentlinkedhashmap-lru-1.2.jar"/>  
  11.     <classpathentry exported="true" kind="lib" path="lib/derby-10.9.1.0.jar"/>  
  12.     <classpathentry exported="true" kind="lib" path="lib/findbugs-annotations-2.0.1.jar"/>  
  13.     <classpathentry exported="true" kind="lib" path="lib/findbugs-jsr305-2.0.1.jar"/>  
  14.     <classpathentry exported="true" kind="lib" path="lib/guava-13.0.1.jar"/>  
  15.     <classpathentry exported="true" kind="lib" path="lib/jackson-annotations-2.1.4.jar"/>  
  16.     <classpathentry exported="true" kind="lib" path="lib/jackson-core-2.1.4.jar"/>  
  17.     <classpathentry exported="true" kind="lib" path="lib/jackson-databind-2.1.4.jar"/>  
  18.     <classpathentry exported="true" kind="lib" path="lib/jackson-dataformat-csv-2.1.4.jar"/>  
  19.     <classpathentry exported="true" kind="lib" path="lib/jackson-dataformat-smile-2.1.4.jar"/>  
  20.     <classpathentry exported="true" kind="lib" path="lib/jackson-dataformat-xml-2.1.4.jar"/>  
  21.     <classpathentry exported="true" kind="lib" path="lib/jackson-dataformat-yaml-2.1.4.jar"/>  
  22.     <classpathentry exported="true" kind="lib" path="lib/junit-4.8.2.jar" sourcepath="C:/Users/dell/.m2/repository/junit/junit/4.8.2/junit-4.8.2-sources.jar"/>  
  23.     <classpathentry exported="true" kind="lib" path="lib/jython-2.5.2.jar"/>  
  24.     <classpathentry exported="true" kind="lib" path="lib/libthrift-0.9.0.jar"/>  
  25.     <classpathentry exported="true" kind="lib" path="lib/logback-classic-1.0.0.jar"/>  
  26.     <classpathentry exported="true" kind="lib" path="lib/logback-core-1.0.0.jar"/>  
  27.     <classpathentry exported="true" kind="lib" path="lib/netty-3.2.6.Final.jar" sourcepath="C:/Users/dell/.m2/repository/org/jboss/netty/netty/3.2.6.Final/netty-3.2.6.Final-sources.jar"/>  
  28.     <classpathentry exported="true" kind="lib" path="lib/objenesis-1.2.jar"/>  
  29.     <classpathentry exported="true" kind="lib" path="lib/org.easymock-3.1.jar"/>  
  30.     <classpathentry exported="true" kind="lib" path="lib/org.restlet-2.2M3.jar"/>  
  31.     <classpathentry exported="true" kind="lib" path="lib/org.restlet.ext.jackson-2.2M3.jar"/>  
  32.     <classpathentry exported="true" kind="lib" path="lib/org.restlet.ext.simple-2.2M3.jar"/>  
  33.     <classpathentry exported="true" kind="lib" path="lib/org.restlet.ext.slf4j-2.2M3.jar"/>  
  34.     <classpathentry exported="true" kind="lib" path="lib/simple-5.1.1.jar"/>  
  35.     <classpathentry exported="true" kind="lib" path="lib/slf4j-api-1.6.4.jar"/>  
  36.     <classpathentry kind="lib" path="lib/asm-3.0.jar"/>  
  37.     <classpathentry kind="lib" path="lib/asm-tree-3.0.jar"/>  
  38.     <classpathentry kind="lib" path="lib/cobertura-1.9.4.1.jar"/>  
  39.     <classpathentry kind="lib" path="lib/hamcrest-core-1.3.jar"/>  
  40.     <classpathentry kind="lib" path="lib/hamcrest-integration-1.3.jar"/>  
  41.     <classpathentry kind="lib" path="lib/hamcrest-library-1.3.jar"/>  
  42.     <classpathentry kind="lib" path="lib/j3dutils.jar"/>  
  43.     <classpathentry kind="lib" path="lib/jdeb-1.0.1.jar"/>  
  44.     <classpathentry kind="lib" path="lib/log4j-1.2.9.jar"/>  
  45.     <classpathentry kind="lib" path="lib/openflowj-0.9.0-SNAPSHOT-javadoc.jar"/>  
  46.     <classpathentry kind="lib" path="lib/openflowj-0.9.0-SNAPSHOT-sources.jar"/>  
  47.     <classpathentry kind="lib" path="lib/openflowj-0.9.0-SNAPSHOT.jar"/>  
  48.     <classpathentry kind="lib" path="lib/packetstreamer-thrift.jar"/>  
  49.     <classpathentry kind="lib" path="lib/oro/jakarta-oro-2.0.8.jar"/>  
  50.     <classpathentry exported="true" kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>  
  51.     <classpathentry kind="output" path="target/bin"/>  
  52. </classpath>  

然后就可以作为普通的项目导入即可。

实验过程:

这里的实验做的是对packet-in包的数量进行统计并打印到控制台,功能单一,但能体现出添加新模块的整个流程。

 

1.添加新服务接口

首先需要定义新加模块服务的接口:

[html] view plain copy
 
  1. package net.floodlightcontroller.statics;  
  2.   
  3. import net.floodlightcontroller.core.module.IFloodlightService;  
  4.   
  5. /**  
  6.  * The service registry  
  7.  * @author yangshuai  
  8.  */  
  9.   
  10. public interface IPktinHistoryService extends IFloodlightService {  
  11.     /*  
  12.      * 用于统计结果  
  13.      */  
  14.     public long getPackINCount();  
  15. }  



2.添加PktinHistory模块:因为这里添加的新模块的功能比较单一,只是统计floodlight运行后packet-in包的总数量,并且是持续累计计数的,所以只需在该接口中定义一个用于计算的方法就可以了。

定义PktinHistory模块:

[html] view plain copy
 
  1. package net.floodlightcontroller.statics;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.Collection;  
  5. import java.util.HashMap;  
  6. import java.util.Map;  
  7. import java.util.concurrent.atomic.AtomicLong;  
  8.   
  9. import org.projectfloodlight.openflow.protocol.OFMessage;  
  10. import org.projectfloodlight.openflow.protocol.OFType;  
  11. import org.slf4j.Logger;  
  12. import org.slf4j.LoggerFactory;  
  13.   
  14. import net.floodlightcontroller.core.FloodlightContext;  
  15. import net.floodlightcontroller.core.IFloodlightProviderService;  
  16. import net.floodlightcontroller.core.IOFMessageListener;  
  17. import net.floodlightcontroller.core.IOFSwitch;  
  18. import net.floodlightcontroller.core.module.FloodlightModuleContext;  
  19. import net.floodlightcontroller.core.module.FloodlightModuleException;  
  20. import net.floodlightcontroller.core.module.IFloodlightModule;  
  21. import net.floodlightcontroller.core.module.IFloodlightService;  
  22. import net.floodlightcontroller.restserver.IRestApiService;  
  23.   
  24. /*  
  25.  *   
  26.  *@author yangshuai  
  27.  */   
  28.   
  29. public class PktinHistory implements   
  30.     IOFMessageListener,IFloodlightModule,IPktinHistoryService{  
  31.   
  32.     protected static Logger log = LoggerFactory.getLogger(PktinHistory.class);  
  33.     protected IFloodlightProviderService FloodlightProvider ;  
  34.     protected IRestApiService restApi ;  
  35.     private AtomicLong PACKET_IN_COUNT = new AtomicLong() ;  
  36.       
  37.     @Override  
  38.     public String getName() {  
  39.         return "PktinHistory" ;  
  40.     }  
  41.   
  42.     @Override  
  43.     public boolean isCallbackOrderingPrereq(OFType type, String name) {  
  44.         // TODO Auto-generated method stub  
  45.         return false;  
  46.     }  
  47.   
  48.     @Override  
  49.     public boolean isCallbackOrderingPostreq(OFType type, String name) {  
  50.         // TODO Auto-generated method stub  
  51.         return false;  
  52.     }  
  53.   
  54.     @Override  
  55.     public long getPackINCount() {  
  56.         return PACKET_IN_COUNT.get();  
  57.     }  
  58.   
  59.     @Override  
  60.     public Collection<Class<? extends IFloodlightService>> getModuleServices() {  
  61.         Collection<Class<? extends IFloodlightService>> l =   
  62.                 new ArrayList<Class<? extends IFloodlightService>>();  
  63.         l.add(IPktinHistoryService.class);  
  64.         return l;  
  65.     }  
  66.   
  67.     @Override  
  68.     public Map<Class<? extends IFloodlightService>, IFloodlightService> getServiceImpls() {  
  69.         Map<Class<? extends IFloodlightService>,IFloodlightService> m =   
  70.                 new  HashMap<Class<? extends IFloodlightService>,IFloodlightService>();  
  71.         m.put(IPktinHistoryService.class,this);  
  72.         return m;  
  73.     }  
  74.   
  75.     @Override  
  76.     public Collection<Class<? extends IFloodlightService>> getModuleDependencies() {  
  77.         Collection<Class<? extends IFloodlightService>> l =   
  78.                 new ArrayList<Class<? extends IFloodlightService>>() ;  
  79.         l.add(IFloodlightProviderService.class);  
  80.         l.add(IRestApiService.class);  
  81.         return l ;  
  82.     }  
  83.   
  84.     @Override  
  85.     public void init(FloodlightModuleContext context)  
  86.             throws FloodlightModuleException {  
  87.         FloodlightProvider = context.getServiceImpl(IFloodlightProviderService.class);  
  88.         restApi = context.getServiceImpl(IRestApiService.class) ;  
  89.     }  
  90.   
  91.     @Override  
  92.     public void startUp(FloodlightModuleContext context)  
  93.             throws FloodlightModuleException {  
  94.         FloodlightProvider.addOFMessageListener(OFType.PACKET_IN,this) ;  
  95.     }  
  96.   
  97.     @Override  
  98.     public net.floodlightcontroller.core.IListener.Command receive(  
  99.             IOFSwitch sw, OFMessage msg, FloodlightContext cntx) {  
  100.         long count = PACKET_IN_COUNT.incrementAndGet() ;  
  101.         log.info("The total count of packet-in Messages are" + count);  
  102.         return Command.CONTINUE ;  
  103.     }  
  104.   
  105. }  

floodlight中所有的模块都必须实现IFloodlightModule接口,而这里新添加的模块需要监听数据包,所以也需要实现IOFMessageListener接口。IOFMessageListener接口用于监听Packet-in消息,并记录消息递增数量,IPktinHistoryService接口是业务查询接口,提供Packet-in数据分组统计结果查询服务,IFloodLightModule接口标识该类是一个floodlight模块,继承该接口的类会在floodlight启动过程中以模块形式加载。该类文件可以随意添加到任何包中,为了方便管理和演示,这里将所有添加该模块所新建的文件全都放在了新建包net.floodlightcontroller.statics中。这个路劲在后面修改配置文件中仍然会使用到。

 

3.rest资源定义

在完成模块的定义之后,需要对rest服务资源进行定义,这里将类名定义为:PktInHistoryResource,继承抽象类ServerResourceServerResourceJava轻量级REST框架Restlet的抽象类),并实现业务逻辑。该步主要功能是将Packet-in统计接口包装为REST资源便于后续资源绑定。

[html] view plain copy
 
  1. package net.floodlightcontroller.statics;  
  2.   
  3. import java.util.HashMap;  
  4. import org.restlet.resource.Get;  
  5. import org.restlet.resource.ServerResource;  
  6.   
  7. /*  
  8.  *   
  9.  *@author yangshuai  
  10.  */   
  11.   
  12. public class PktInHistoryResource extends ServerResource{  
  13.     @Get("json")  
  14.       
  15.     public HashMap<String, String> retrieve(){  
  16.         IPktinHistoryService pihr = (IPktinHistoryService) getContext()  
  17.                 .getAttributes().get(IPktinHistoryService.class.getCanonicalName());  
  18.         long count = pihr.getPackINCount();  
  19.         HashMap<String, String> resp = new HashMap<String, String>() ;  
  20.         resp.put("Total", Long.toString(count)) ;  
  21.         return resp;  
  22.     }  
  23. }  

4.绑定urlrest资源

接着定义PktInHistoryWebRoutable类,将上步定义的PktInHistoryResource资源与访问路径绑定。该类中定义的路径包括外部获取该REST资源的基本路径和相对路径

[html] view plain copy
 
  1. package net.floodlightcontroller.statics;  
  2.   
  3. import net.floodlightcontroller.restserver.RestletRoutable;  
  4.   
  5. import org.restlet.Context;  
  6. import org.restlet.Restlet;  
  7. import org.restlet.routing.Router;  
  8.   
  9. /*  
  10.  *   
  11.  *@author yangshuai  
  12.  */   
  13.   
  14. public class PktInHistoryWebRoutable implements RestletRoutable{  
  15.   
  16.     public Restlet getRestlet(Context context){  
  17.         Router router =new Router(context) ;  
  18.         router.attach("/pktinhistory/json", PktInHistoryResource.class) ;  
  19.         return router ;  
  20.     }  
  21.       
  22.     public String basePath(){  
  23.         return "/vm/statics" ;  
  24.     }  
  25. }  


5.资源发布 

资源绑定相应路径后需要在REST服务中发布,因此还需要在PktinHistorystartUp方法中注册PktInHistoryWebRoutable,表明有新的资源加入REST服务

[html] view plain copy
 
  1. @Override  
  2.     public void init(FloodlightModuleContext context)  
  3.             throws FloodlightModuleException {  
  4.         FloodlightProvider = context.getServiceImpl(IFloodlightProviderService.class);  
  5.         restApi = context.getServiceImpl(IRestApiService.class) ;  
  6.     }  


6.定义完上述源码后还需要在配置文件中指定新增模块名,该配置文件为resources/META-INF/services/net.FloodLight.core.module.IFloodLightModule,这里就是添加net.FloodLightcontroller.statics.PktinHistory模块配置信息。该配置文件是FloodLight模块加载系统中加载模块类的依据,用于告知控制器要加载那些模块。 


7.除上述配置外,还需要在resources/floodlightdefault.properties中的floodlight.modules配置参数后追加新增模块名(net.FloodLight.controller.statics.PktinHistory 注:这里就要根据添加的PktinHistory 类的具体路径进行修改),表明该配置启动时必须加载。

 

实验成果截图:


问题:

在floodlight的显示界面上的监听端口为6633,在1.0以前的版本中,mininet连接到floodlight远程控制器时指定的端口号也是6633。但是在floodlight1.0版本的测试时,是使用6653端口连接上的。


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 高中的孩子与同学相处不好怎么办 孩子在幼儿园不敢和老师说话怎么办 注册过万方医学网忘了用户名怎么办 狗咬了没破皮没出血有点疼怎么办 狗咬了没出血肿起来了怎么办 广州已经过了幼儿园报名时间怎么办 大专学费没交学校开始查了怎么办 如果申请留学的本科成绩不够怎么办 硕士读了三年无法毕业怎么办啊 孩子在美国读研读不下去怎么办? 在地割草中过失死亡法律^怎么办 高中毕业申请国外大学没录取怎么办 英国研究生老师没给写推荐信怎么办 申请悉尼大学博士奖学金被拒怎么办 硕士延迟毕业但被博士录取怎么办 考完初级职称还是不会做账怎么办 美国留学生在中国办日本签证怎么办 留学雅思过了gpa低怎么办澳洲 护士电子化注册用户名忘记了怎么办 护士电子化注册证书编码错误怎么办 澳洲预科上半学期成绩不达标怎么办 美国大学绩点不够怎么办学习证明 研一想换导师导师不答应怎么办 日本留学在留下来不想去了怎么办 加拿大工签3年到期了怎么办 鞋子穿久了会有臭味怎么办 考研忘了自己填写的通讯地址怎么办 基础教育教师培训网注册错了怎么办 11个月宝宝便秘大便有血怎么办 两岁宝宝两天没拉粑粑了怎么办 两岁宝宝两天没拉大便怎么办 两岁宝宝便秘两天没拉怎么办 昨天带孩子上早教课一直哭怎么办 网页账号注册无法获取验证码怎么办 我总是为一些事情而烦恼怎么办 手机键盘打出的字是繁体字怎么办 阴阳师协助任务对方接了不做怎么办 wow牧师选错了圣物怎么办 淘宝有几个订单被管控了怎么办 埋线双眼皮一个宽一个窄怎么办 把维D和维C一起吃了怎么办