Floodlight源码阅读之TreeMap存储ACL(一)

原创 2016年06月01日 18:37:18

<span style="font-family: 'Microsoft YaHei', Verdana, sans-serif, SimSun; font-size: 13.3333px; line-height: 21.3333px; background-color: rgb(255, 255, 255);">Floodlight 控制器是一个企业级的,使用apache协议的,使用Java开发的OpenFlow控制器</span>

Floodlight的所有ACL的规则都存储在TreeMap中,提供存储和删除接口。ok,下面直接看代码

提供一个保存的方法

	@Post
	public String store(String json) {
		IACLService aclService = (IACLService) getContext().getAttributes().get(
				IACLService.class.getCanonicalName());
		
		ACLRule newRule;
		try {
			newRule = jsonToRule(json);
		} catch (Exception e) {
			log.error("Error parsing ACL rule: " + json, e);
			return "{\"status\" : \"Failed! " + e.getMessage() + "\"}";
		}
		
		String status = null;
		
		String nw_src = newRule.getNw_src();
		String nw_dst = newRule.getNw_dst();
		if (nw_src == null && nw_dst == null){
			status = "Failed! Either nw_src or nw_dst must be specified.";
			return ("{\"status\" : \"" + status + "\"}");
		}
		
		if(aclService.addRule(newRule)){
			status = "Success! New rule added.";
		}else{
			status = "Failed! The new ACL rule matches an existing rule.";
		}
			
		return ("{\"status\" : \"" + status + "\"}");
	}

使用restlet框架,接收Post请求。jsonToRule将json字符串转化为对象,直接看保存方法addRule,在这个方法里面首先对下标加+1,如果判断对象存在就减-1返回false。

通过put方法加入加入到aclRules中。这是aclRules的定义:Map<Integer, ACLRule> aclRules;

	@Override
	public boolean addRule(ACLRule rule) {
		rule.setId(lastRuleId++);
		if (checkRuleMatch(rule)) {
			lastRuleId--;
			return false;
		}
		aclRules.put(rule.getId(), rule);
		logger.info("ACL rule(id:{}) is added.", rule.getId());
		if (rule.getAction() != Action.ALLOW) {
			enforceAddedRule(rule);
		}
		return true;
	}

它同样提供一个删除的方法,首先是while循环遍历元素是否存在,如果存在则删除。

@Delete
	public String remove(String json) {
		IACLService ACL = (IACLService) getContext().getAttributes().get(
				IACLService.class.getCanonicalName());

		ACLRule rule;
		try {
			rule = jsonToRule(json);
		} catch (Exception e) {
			log.error("Error parsing ACL rule: " + json, e);
			return "{\"status\" : \"Failed! " + e.getMessage() + "\"}";
		}
		
		// check whether the rule exists
		boolean exists = false;
		Iterator<ACLRule> iter = ACL.getRules().iterator();
		while (iter.hasNext()) {
			ACLRule r = iter.next();
			if (r.getId() == rule.getId()) {
				exists = true;
				break;
			}
		}
		
		String status = null;
		if (!exists) {
			status = "Failed! a rule with this ID doesn't exist.";
			log.error(status);
		} else {
			ACL.removeRule(rule.getId());
			status = "Success! Rule deleted";
		}
		
		return ("{\"status\" : \"" + status + "\"}");
	}

删除的方法如下
	@Override
	public void removeRule(int ruleId) {
		aclRules.remove(ruleId);
		logger.info("ACL rule(id:{}) is removed.", ruleId);
		enforceRemovedRule(ruleId);
	}
至于enforceRemovedRule这个函数的作用,就是在流表中删除该ACL。


FloodLight开发者文档二(译文)

用户文档 控制器 Floodlight不仅仅是一个支持OpenFLow协议的控制器(FloodlightCOntroller),也是一个基于Floodlight控制器的应用集。 当用户在Open...

Floodlight源码阅读之链路发现

Floodlight的链路发现基于LLDP,LLDP并不是Floodlight发明的,他全称叫做链路层发现协议,一个和厂商无关的二层协议 链路发现的核心代码在LinkDiscoveryManager...

Floodlight源码阅读之内存数据库(二)

Java实现NOSQL数据库

Floodlight源码阅读之内存数据库

Java实现的内存数据库

Floodlight源码阅读之网络拓扑

在上一篇文章中介绍Floodlight怎样做拓扑发现,这篇文章介绍一下网络拓扑是怎样形成的。TopologyManager这个类负责网络拓扑的产生。这个类首先实现了IFloodlightModule这...

【JDK1.8】JDK1.8集合源码阅读——TreeMap(一)

目录 一、前言 二、TreeMap的继承关系 三、SortedMap接口源码解析 3.1 SortedMap接口 3.2 Comparable接口 3.3 Comparator接口 四、...

Java源码阅读-TreeMap

// Red-black mechanics private static final boolean RED = false; // 基于红黑树的数据结构 private st...

【JDK源码阅读12-util】Map接口----TreeMap

TreeMap接口 参考:【http://blog.csdn.net/chenssy/article/details/26668941】 一、类继承关系 类继承关系 java.lang.Objec...

JAVA 8 treemap 源码阅读笔记

TreeMap的key允许为空刚开始学习时就被告知treemap的key不能为空!!! 但是 随着学习的深入,自己读源码发现允许为空 大家详细研读此文,本文末尾列举treemap的key为空的案例T...

Java源码阅读之TreeMap

文中出现的代码大多来自于openjdk-8,其下载地址为:http://download.java.net/openjdk/jdk8; 已将部分关键代码上传至https://github.com/ev...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Floodlight源码阅读之TreeMap存储ACL(一)
举报原因:
原因补充:

(最多只允许输入30个字)