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