From c6267b05cf0e0be74f7a1eac65c968ff3803f1c3 Mon Sep 17 00:00:00 2001
From: Diogo <diogo_572@hotmail.com>
Date: Thu, 6 Apr 2017 18:15:46 +0100
Subject: [PATCH] Data structures for REST API added

---
 .../loadbalancer/ILoadBalancerService.java    |  66 ++++++++++
 .../loadbalancer/L7PoliciesResource.java      | 123 ++++++++++++++++++
 .../loadbalancer/L7Policy.java                |  19 +++
 .../loadbalancer/L7PolicySerializer.java      |  26 ++++
 .../loadbalancer/L7Rule.java                  |  19 +++
 .../loadbalancer/L7RuleSerializer.java        |  25 ++++
 .../loadbalancer/L7RulesResource.java         |  79 ++++-------
 .../loadbalancer/LBPool.java                  |   1 -
 .../loadbalancer/LoadBalancer.java            |  62 ++++++++-
 .../loadbalancer/LoadBalancerWebRoutable.java |   4 +-
 10 files changed, 368 insertions(+), 56 deletions(-)
 create mode 100644 src/main/java/net/floodlightcontroller/loadbalancer/L7PoliciesResource.java
 create mode 100644 src/main/java/net/floodlightcontroller/loadbalancer/L7Policy.java
 create mode 100644 src/main/java/net/floodlightcontroller/loadbalancer/L7PolicySerializer.java
 create mode 100644 src/main/java/net/floodlightcontroller/loadbalancer/L7Rule.java
 create mode 100644 src/main/java/net/floodlightcontroller/loadbalancer/L7RuleSerializer.java

diff --git a/src/main/java/net/floodlightcontroller/loadbalancer/ILoadBalancerService.java b/src/main/java/net/floodlightcontroller/loadbalancer/ILoadBalancerService.java
index a335bf4da..6bf8d25c1 100644
--- a/src/main/java/net/floodlightcontroller/loadbalancer/ILoadBalancerService.java
+++ b/src/main/java/net/floodlightcontroller/loadbalancer/ILoadBalancerService.java
@@ -154,5 +154,71 @@ public interface ILoadBalancerService extends IFloodlightService {
      * @return int: removal status 
      */
     public int removeMonitor(String monitorId);
+    
+    /**
+     * Create and return a new L7Rule.
+     * @param L7Rule l7_rule: data structure with caller provided L7Rule attributes 
+     * @return L7Rule: Created L7Rule 
+     */
+    public L7Rule createL7Rule(L7Rule l7_rule);
+
+    /**
+     * Update an existing L7Rule.
+     * @param L7Rule l7_rule: data structure with caller provided L7Rule attributes 
+     * @return L7Rule: Created L7Rule 
+     */
+    public L7Rule updateL7Rule(L7Rule l7_rule);
+    
+    /**
+     * List all current L7Rules.
+     */
+    public Collection<L7Rule> listL7Rules();
+
+    /**
+     * List selected L7Rule by its ID.
+     * @param ruleId Id of requested L7Rule
+     */
+    public Collection<L7Rule> listL7Rule(String ruleId);
+    
+    /**
+     * Remove an existing L7Rule.
+     * @param String ruleId 
+     * @return int: removal status 
+     */
+    public int removeL7Rule(String ruleId);
+    
+    /**
+     * Create and return a new L7Policy.
+     * @param L7Policy l7_policy: data structure with caller provided L7Policy attributes 
+     * @return L7Policy: Created L7Policy 
+     */
+    public L7Policy createL7Policy(L7Policy l7_policy);
+
+    /**
+     * Update an existing L7Policy.
+     * @param L7Policy l7_policy: data structure with caller provided L7Policy attributes 
+     * @return L7Policy: Created L7Policy 
+     */
+    public L7Policy updateL7Policy(L7Policy l7_policy);
+    
+    /**
+     * List all current L7Policies.
+     */
+    public Collection<L7Policy> listL7Policies();
+
+    /**
+     * List selected L7Policy by its ID.
+     * @param policyId Id of requested L7Policy
+     */
+    public Collection<L7Policy> listL7Policy(String policyId);
+    
+    /**
+     * Remove an existing L7Policy.
+     * @param String policyId 
+     * @return int: removal status 
+     */
+    public int removeL7Policy(String policyId);
+    
+    
 
 }
diff --git a/src/main/java/net/floodlightcontroller/loadbalancer/L7PoliciesResource.java b/src/main/java/net/floodlightcontroller/loadbalancer/L7PoliciesResource.java
new file mode 100644
index 000000000..39b109811
--- /dev/null
+++ b/src/main/java/net/floodlightcontroller/loadbalancer/L7PoliciesResource.java
@@ -0,0 +1,123 @@
+package net.floodlightcontroller.loadbalancer;
+
+import java.io.IOException;
+import java.util.Collection;
+
+import org.restlet.resource.Delete;
+import org.restlet.resource.Get;
+import org.restlet.resource.Post;
+import org.restlet.resource.Put;
+import org.restlet.resource.ServerResource;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.fasterxml.jackson.core.JsonParseException;
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.core.JsonToken;
+import com.fasterxml.jackson.databind.MappingJsonFactory;
+
+public class L7PoliciesResource extends ServerResource {
+	protected static Logger log = LoggerFactory.getLogger(L7PoliciesResource.class);
+	
+	@Get("json")
+    public Collection <L7Policy> retrieve() {
+        ILoadBalancerService lbs =
+                (ILoadBalancerService)getContext().getAttributes().
+                    get(ILoadBalancerService.class.getCanonicalName());
+        
+        String policyId = (String) getRequestAttributes().get("policy");
+        if (policyId!=null)
+            return lbs.listL7Policy(policyId);
+        else
+            return lbs.listL7Policies();
+    }
+    
+    @Put
+    @Post
+    public L7Policy createL7Policy(String postData) {
+
+    	L7Policy l7_policy=null;
+        try {
+        	l7_policy=jsonToL7Policy(postData);
+        } catch (IOException e) {
+            log.error("Could not parse JSON {}", e.getMessage());
+        }
+        
+        ILoadBalancerService lbs =
+                (ILoadBalancerService)getContext().getAttributes().
+                    get(ILoadBalancerService.class.getCanonicalName());
+        
+        String policyId = (String) getRequestAttributes().get("policy");
+        if (policyId != null)
+            return lbs.updateL7Policy(l7_policy);
+        else
+            return lbs.createL7Policy(l7_policy);
+    }
+    
+    @Delete
+    public int removeL7Policy() {
+        
+        String policyId = (String) getRequestAttributes().get("policy");
+        
+        ILoadBalancerService lbs =
+                (ILoadBalancerService)getContext().getAttributes().
+                    get(ILoadBalancerService.class.getCanonicalName());
+
+        return lbs.removeL7Policy(policyId);
+    }
+
+    protected L7Policy jsonToL7Policy(String json) throws IOException {
+        
+        if (json==null) return null;
+        
+        MappingJsonFactory f = new MappingJsonFactory();
+        JsonParser jp;
+        L7Policy l7_policy = new L7Policy();
+        
+        try {
+            jp = f.createParser(json);
+        } catch (JsonParseException e) {
+            throw new IOException(e);
+        }
+        
+        jp.nextToken();
+        if (jp.getCurrentToken() != JsonToken.START_OBJECT) {
+            throw new IOException("Expected START_OBJECT");
+        }
+        
+        while (jp.nextToken() != JsonToken.END_OBJECT) {
+            if (jp.getCurrentToken() != JsonToken.FIELD_NAME) {
+                throw new IOException("Expected FIELD_NAME");
+            }
+            
+            String n = jp.getCurrentName();
+            jp.nextToken();
+            if (jp.getText().equals("")) 
+                continue;
+ 
+            if (n.equals("id")) {
+            	l7_policy.id = jp.getText();
+                continue;
+            } 
+            if (n.equals("vip_id")) {
+            	l7_policy.vipId = jp.getText();
+                continue;
+            } 
+            if (n.equals("pool_id")) {
+            	l7_policy.poolId = jp.getText();
+                continue;
+            }
+            if (n.equals("value")) {
+            	l7_policy.action = Short.parseShort(jp.getText());
+                continue;
+            } 
+            
+            log.warn("Unrecognized field {} in " +
+                    "parsing L7Policies", 
+                    jp.getText());
+        }
+        jp.close();
+        
+        return l7_policy;
+    }
+}
diff --git a/src/main/java/net/floodlightcontroller/loadbalancer/L7Policy.java b/src/main/java/net/floodlightcontroller/loadbalancer/L7Policy.java
new file mode 100644
index 000000000..011a2e1a7
--- /dev/null
+++ b/src/main/java/net/floodlightcontroller/loadbalancer/L7Policy.java
@@ -0,0 +1,19 @@
+package net.floodlightcontroller.loadbalancer;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+
+@JsonSerialize(using=L7PolicySerializer.class)
+public class L7Policy {
+	protected String id;
+	protected String vipId;
+	protected String poolId;
+	protected short action;
+	
+
+	public L7Policy() {
+		id = String.valueOf((int) (Math.random()*10000));
+		poolId = null;
+		vipId = null;
+		action = 0;
+	}
+}
diff --git a/src/main/java/net/floodlightcontroller/loadbalancer/L7PolicySerializer.java b/src/main/java/net/floodlightcontroller/loadbalancer/L7PolicySerializer.java
new file mode 100644
index 000000000..9e10d027f
--- /dev/null
+++ b/src/main/java/net/floodlightcontroller/loadbalancer/L7PolicySerializer.java
@@ -0,0 +1,26 @@
+package net.floodlightcontroller.loadbalancer;
+
+import java.io.IOException;
+
+import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.JsonSerializer;
+import com.fasterxml.jackson.databind.SerializerProvider;
+
+public class L7PolicySerializer extends JsonSerializer<L7Policy> {
+
+	@Override
+	public void serialize(L7Policy l7_policy, JsonGenerator jGen, SerializerProvider serializer)
+			throws IOException, JsonProcessingException {
+		jGen.writeStartObject();
+        
+        jGen.writeStringField("action", String.valueOf(l7_policy.action));
+        jGen.writeStringField("id", l7_policy.id);
+        jGen.writeStringField("vipId", l7_policy.vipId);
+        jGen.writeStringField("poolId", l7_policy.poolId);
+
+        jGen.writeEndObject();
+		
+	}
+
+}
diff --git a/src/main/java/net/floodlightcontroller/loadbalancer/L7Rule.java b/src/main/java/net/floodlightcontroller/loadbalancer/L7Rule.java
new file mode 100644
index 000000000..fc2d8e58d
--- /dev/null
+++ b/src/main/java/net/floodlightcontroller/loadbalancer/L7Rule.java
@@ -0,0 +1,19 @@
+package net.floodlightcontroller.loadbalancer;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+
+@JsonSerialize(using=L7RuleSerializer.class)
+public class L7Rule {
+	protected String id;
+	protected String policyId;
+	protected short type;
+	protected String value;
+	
+	
+	public L7Rule() {
+		id = String.valueOf((int) (Math.random()*10000));
+		policyId = null;
+		value = null;
+		type = 0;
+	}
+}
diff --git a/src/main/java/net/floodlightcontroller/loadbalancer/L7RuleSerializer.java b/src/main/java/net/floodlightcontroller/loadbalancer/L7RuleSerializer.java
new file mode 100644
index 000000000..b5099781c
--- /dev/null
+++ b/src/main/java/net/floodlightcontroller/loadbalancer/L7RuleSerializer.java
@@ -0,0 +1,25 @@
+package net.floodlightcontroller.loadbalancer;
+
+import java.io.IOException;
+
+import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.JsonSerializer;
+import com.fasterxml.jackson.databind.SerializerProvider;
+
+public class L7RuleSerializer extends JsonSerializer<L7Rule>{
+
+	@Override
+	public void serialize(L7Rule l7_rule, JsonGenerator jGen, SerializerProvider serializer)
+			throws IOException, JsonProcessingException {
+		jGen.writeStartObject();
+
+		jGen.writeStringField("type", String.valueOf(l7_rule.type));
+		jGen.writeStringField("value", l7_rule.value);
+		jGen.writeStringField("id", l7_rule.id);
+		jGen.writeStringField("policyId", l7_rule.policyId);
+
+		jGen.writeEndObject();
+	}
+
+}
diff --git a/src/main/java/net/floodlightcontroller/loadbalancer/L7RulesResource.java b/src/main/java/net/floodlightcontroller/loadbalancer/L7RulesResource.java
index 0de3d4735..d97201354 100644
--- a/src/main/java/net/floodlightcontroller/loadbalancer/L7RulesResource.java
+++ b/src/main/java/net/floodlightcontroller/loadbalancer/L7RulesResource.java
@@ -3,7 +3,6 @@ package net.floodlightcontroller.loadbalancer;
 import java.io.IOException;
 import java.util.Collection;
 
-import org.projectfloodlight.openflow.types.IpProtocol;
 import org.restlet.resource.Delete;
 import org.restlet.resource.Get;
 import org.restlet.resource.Post;
@@ -17,31 +16,30 @@ import com.fasterxml.jackson.core.JsonParser;
 import com.fasterxml.jackson.core.JsonToken;
 import com.fasterxml.jackson.databind.MappingJsonFactory;
 
-import net.floodlightcontroller.packet.IPv4;
 
 public class L7RulesResource extends ServerResource {
 	protected static Logger log = LoggerFactory.getLogger(L7RulesResource.class);
 	
 	@Get("json")
-    public Collection <LBVip> retrieve() {
+    public Collection <L7Rule> retrieve() {
         ILoadBalancerService lbs =
                 (ILoadBalancerService)getContext().getAttributes().
                     get(ILoadBalancerService.class.getCanonicalName());
         
-        String vipId = (String) getRequestAttributes().get("rule");
-        if (vipId!=null)
-            return lbs.listVip(vipId);
+        String ruleId = (String) getRequestAttributes().get("rule");
+        if (ruleId!=null)
+            return lbs.listL7Rule(ruleId);
         else
-            return lbs.listVips();
+            return lbs.listL7Rules();
     }
     
     @Put
     @Post
-    public LBVip createVip(String postData) {
+    public L7Rule createL7Rule(String postData) {
 
-        LBVip vip=null;
+        L7Rule l7_rule=null;
         try {
-            vip=jsonToVip(postData);
+        	l7_rule=jsonToL7Rule(postData);
         } catch (IOException e) {
             log.error("Could not parse JSON {}", e.getMessage());
         }
@@ -50,32 +48,32 @@ public class L7RulesResource extends ServerResource {
                 (ILoadBalancerService)getContext().getAttributes().
                     get(ILoadBalancerService.class.getCanonicalName());
         
-        String vipId = (String) getRequestAttributes().get("vip");
-        if (vipId != null)
-            return lbs.updateVip(vip);
+        String ruleId = (String) getRequestAttributes().get("rule");
+        if (ruleId != null)
+            return lbs.updateL7Rule(l7_rule);
         else
-            return lbs.createVip(vip);
+            return lbs.createL7Rule(l7_rule);
     }
     
     @Delete
-    public int removeVip() {
+    public int removeL7Rule() {
         
-        String vipId = (String) getRequestAttributes().get("vip");
+        String ruleId = (String) getRequestAttributes().get("rule");
         
         ILoadBalancerService lbs =
                 (ILoadBalancerService)getContext().getAttributes().
                     get(ILoadBalancerService.class.getCanonicalName());
 
-        return lbs.removeVip(vipId);
+        return lbs.removeL7Rule(ruleId);
     }
 
-    protected LBVip jsonToVip(String json) throws IOException {
+    protected L7Rule jsonToL7Rule(String json) throws IOException {
         
         if (json==null) return null;
         
         MappingJsonFactory f = new MappingJsonFactory();
         JsonParser jp;
-        LBVip vip = new LBVip();
+        L7Rule l7_rule = new L7Rule();
         
         try {
             jp = f.createParser(json);
@@ -99,51 +97,28 @@ public class L7RulesResource extends ServerResource {
                 continue;
  
             if (n.equals("id")) {
-                vip.id = jp.getText();
+            	l7_rule.id = jp.getText();
                 continue;
             } 
-            if (n.equals("tenant_id")) {
-                vip.tenantId = jp.getText();
+            if (n.equals("policy_id")) {
+            	l7_rule.policyId = jp.getText();
                 continue;
             } 
-            if (n.equals("name")) {
-                vip.name = jp.getText();
+            if (n.equals("type")) {
+            	l7_rule.type = Short.parseShort(jp.getText());
                 continue;
             }
-            if (n.equals("network_id")) {
-                vip.netId = jp.getText();
+            if (n.equals("value")) {
+            	l7_rule.value = jp.getText();
                 continue;
-            }
-            if (n.equals("protocol")) {
-                String tmp = jp.getText();
-                if (tmp.equalsIgnoreCase("TCP")) {
-                    vip.protocol = (byte) IpProtocol.TCP.getIpProtocolNumber();
-                } else if (tmp.equalsIgnoreCase("UDP")) {
-                    vip.protocol = (byte) IpProtocol.UDP.getIpProtocolNumber();
-                } else if (tmp.equalsIgnoreCase("ICMP")) {
-                    vip.protocol = (byte) IpProtocol.ICMP.getIpProtocolNumber();
-                } 
-                continue;
-            }
-            if (n.equals("address")) {
-                vip.address = IPv4.toIPv4Address(jp.getText());
-                continue;
-            }
-            if (n.equals("port")) {
-                vip.port = Short.parseShort(jp.getText());
-                continue;
-            }
-            if (n.equals("pool_id")) {
-                vip.pools.add(jp.getText());
-                continue;
-            }
+            } 
             
             log.warn("Unrecognized field {} in " +
-                    "parsing Vips", 
+                    "parsing l7Rules", 
                     jp.getText());
         }
         jp.close();
         
-        return vip;
+        return l7_rule;
     }
 }
diff --git a/src/main/java/net/floodlightcontroller/loadbalancer/LBPool.java b/src/main/java/net/floodlightcontroller/loadbalancer/LBPool.java
index 5a83a8cf6..96d310830 100644
--- a/src/main/java/net/floodlightcontroller/loadbalancer/LBPool.java
+++ b/src/main/java/net/floodlightcontroller/loadbalancer/LBPool.java
@@ -94,7 +94,6 @@ public class LBPool {
 						bandwidthValues.add(membersbandwidth.get(poolMembersId.get(j)));
 					}
 					log.debug("Member picked using LB statistics: {}", poolMembersId.get(bandwidthValues.indexOf(Collections.min(bandwidthValues))));
-
 					return poolMembersId.get(bandwidthValues.indexOf(Collections.min(bandwidthValues)));
 				}
 				// simple round robin
diff --git a/src/main/java/net/floodlightcontroller/loadbalancer/LoadBalancer.java b/src/main/java/net/floodlightcontroller/loadbalancer/LoadBalancer.java
index abd56ff88..f5567dbff 100644
--- a/src/main/java/net/floodlightcontroller/loadbalancer/LoadBalancer.java
+++ b/src/main/java/net/floodlightcontroller/loadbalancer/LoadBalancer.java
@@ -16,7 +16,7 @@
 
 package net.floodlightcontroller.loadbalancer;
 
-import java.nio.ByteBuffer;
+
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
@@ -1078,6 +1078,66 @@ ILoadBalancerService, IOFMessageListener {
 			return -1;
 		}    
 	}
+	
+	@Override
+	public L7Rule createL7Rule(L7Rule l7_rule) {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public L7Rule updateL7Rule(L7Rule l7_rule) {
+		// TODO Auto-generated method stub
+		return null;
+	}
+	
+	@Override
+	public Collection<L7Rule> listL7Rules() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public Collection<L7Rule> listL7Rule(String ruleId) {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public int removeL7Rule(String ruleId) {
+		// TODO Auto-generated method stub
+		return 0;
+	}
+
+	@Override
+	public L7Policy createL7Policy(L7Policy l7_policy) {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public L7Policy updateL7Policy(L7Policy l7_policy) {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public Collection<L7Policy> listL7Policies() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public Collection<L7Policy> listL7Policy(String policyId) {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public int removeL7Policy(String policyId) {
+		// TODO Auto-generated method stub
+		return 0;
+	}
 
 	@Override
 	public Collection<LBMonitor> listMonitors() {
diff --git a/src/main/java/net/floodlightcontroller/loadbalancer/LoadBalancerWebRoutable.java b/src/main/java/net/floodlightcontroller/loadbalancer/LoadBalancerWebRoutable.java
index 07f701b23..9d315547a 100644
--- a/src/main/java/net/floodlightcontroller/loadbalancer/LoadBalancerWebRoutable.java
+++ b/src/main/java/net/floodlightcontroller/loadbalancer/LoadBalancerWebRoutable.java
@@ -37,9 +37,9 @@ public class LoadBalancerWebRoutable implements RestletRoutable {
         router.attach("/pools/{pool}/members", PoolMemberResource.class); //GET
         router.attach("/health_monitors/", MonitorsResource.class); //GET, POST
         router.attach("/health_monitors/{monitor}", MonitorsResource.class); //GET, PUT, DELETE
-        router.attach("/l7rules/", L7RulesResource.class); //GET, PUT, DELETE 
+        router.attach("/l7rules/", L7RulesResource.class); //GET
         router.attach("/l7rules/{rule}", L7RulesResource.class); //GET, PUT, DELETE
-        router.attach("/l7policies/", L7RulesResource.class); //GET, PUT, DELETE 
+        router.attach("/l7policies/", L7RulesResource.class); //GET 
         router.attach("/l7policies/{policy}", L7RulesResource.class); //GET, PUT, DELETE
         router.attachDefault(NoOp.class);
         return router;
-- 
GitLab