diff options
Diffstat (limited to 'cos/cosbase')
18 files changed, 556 insertions, 0 deletions
diff --git a/cos/cosbase/pom.xml b/cos/cosbase/pom.xml new file mode 100644 index 0000000..6574e02 --- /dev/null +++ b/cos/cosbase/pom.xml @@ -0,0 +1,23 @@ +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> + + <parent> + <groupId>com.cablelabs.vcpe</groupId> + <artifactId>cos</artifactId> + <version>1.0-SNAPSHOT</version> + </parent> + + <modelVersion>4.0.0</modelVersion> + + <groupId>com.cablelabs.vcpe</groupId> + <artifactId>cosbase</artifactId> + <packaging>jar</packaging> + <version>1.0-SNAPSHOT</version> + + <build> + <finalName>cosbase</finalName> + </build> + + <dependencies></dependencies> + +</project> diff --git a/cos/cosbase/src/main/java/com/cablelabs/vcpe/cos/cosbase/client/CoSClient.java b/cos/cosbase/src/main/java/com/cablelabs/vcpe/cos/cosbase/client/CoSClient.java new file mode 100644 index 0000000..d47b11b --- /dev/null +++ b/cos/cosbase/src/main/java/com/cablelabs/vcpe/cos/cosbase/client/CoSClient.java @@ -0,0 +1,151 @@ +package com.cablelabs.vcpe.cos.cosbase.client; + +import com.cablelabs.vcpe.cos.cosbase.model.CoS; + +import javax.ws.rs.client.Client; +import javax.ws.rs.client.ClientBuilder; +import javax.ws.rs.client.Entity; +import javax.ws.rs.client.WebTarget; +import javax.ws.rs.core.GenericType; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; +import java.util.List; + +/** + * Created by steve on 5/28/15. + */ +public class CoSClient { + + private Client client; // provided by Jersey + + public CoSClient() { + client = ClientBuilder.newClient(); + } + + //-------------------------------------------------------- + public CoS create(CoS cos) + //-------------------------------------------------------- + { + WebTarget target =client.target("http://localhost:9090/cosmgr/webapi/"); + Response response = target.path("cos") + .request(MediaType.APPLICATION_JSON) + .post(Entity.entity(cos, MediaType.APPLICATION_JSON)); + + if (response.getStatus() != 200 ) // figure out how to use Status.OK + { + // in production you can be more specific based on reponse code, id, etc + throw new RuntimeException(response.getStatus() + ": there was an error on the server."); + } + return response.readEntity(CoS.class); + } + + //-------------------------------------------------------- + public CoS update(CoS cos) + //-------------------------------------------------------- + { + WebTarget target =client.target("http://localhost:9090/cosmgr/webapi/"); + Response response = target.path("cos/"+cos.getId()) + .request(MediaType.APPLICATION_JSON) + .put(Entity.entity(cos, MediaType.APPLICATION_JSON)); + + if (response.getStatus() != 200 ) // figure out how to use Status.OK + { + // in production you can be more specific based on reponse code, id, etc + throw new RuntimeException(response.getStatus() + ": there was an error on the server."); + } + return response.readEntity(CoS.class); + } + + + //-------------------------------------------------------- + public CoS get(String cosId) + //-------------------------------------------------------- + // get CoS of specified ID + { + WebTarget target = client.target("http://localhost:9090/cosmgr/webapi/"); + + Response response = target.path("cos/"+cosId).request(MediaType.APPLICATION_JSON).get(Response.class); + if (response.getStatus() != 200) // figure out how to use Status.OK + { + // in production you can be more specific based on reponse code, id, etc + throw new RuntimeException(response.getStatus() + ": there was an error on the server."); + } + + //return response; + return response.readEntity(CoS.class); + } + + //-------------------------------------------------------- + public List<CoS> getAll() + //-------------------------------------------------------- + // get a list of all CoS instances + { + + WebTarget target = client.target("http://localhost:9090/cosmgr/webapi/"); + + // Can I do this with a Response, so that I can check for errors + List<CoS> response = target.path("cos/list") + .request(MediaType.APPLICATION_JSON) + .get(new GenericType<List<CoS>>() { + }); + if (response == null) // figure out how to use Status.OK + { + // in production you can be more specific based on reponse code, id, etc + throw new RuntimeException("there was an error on the server."); + } + return response; + } + + + + //-------------------------------------------------------- + public void delete(String cosId) + //-------------------------------------------------------- + // delete CoS of specified ID + { + WebTarget target = client.target("http://localhost:9090/cosmgr/webapi/"); + Response response = target.path("cos/"+cosId).request(MediaType.APPLICATION_JSON).delete(); + if (response.getStatus() != 200) // figure out how to use Status.OK + { + // in production you can be more specific based on reponse code, id, etc + throw new RuntimeException(response.getStatus() + ": there was an error on the server."); + } + } + + //-------------------------------------------------------- + public CoS testGet() + //-------------------------------------------------------- + // test marshaling of CoS class from server json + { + WebTarget target = client.target("http://localhost:9090/cosmgr/webapi/"); + + Response response = target.path("cos").request(MediaType.APPLICATION_JSON).get(Response.class); + if (response.getStatus() != 200) // figure out how to use Status.OK + { + // in production you can be more specific based on reponse code, id, etc + throw new RuntimeException(response.getStatus() + ": there was an error on the server."); + } + + //return response; + return response.readEntity(CoS.class); + } + + //-------------------------------------------------------- + public String ping() + //-------------------------------------------------------- + // test connectivity + { + + WebTarget target = client.target("http://localhost:9090/cosmgr/webapi/"); + + Response response = target.path("cos").request(MediaType.TEXT_PLAIN).get(); + if (response.getStatus() != 200) // figure out how to use Status.OK + { + // in production you can be more specific based on reponse code, id, etc + throw new RuntimeException(response.getStatus() + ": there was an error on the server."); + } + + + return response.readEntity(String.class); + } +} diff --git a/cos/cosbase/src/main/java/com/cablelabs/vcpe/cos/cosbase/model/BandwidthProfile.java b/cos/cosbase/src/main/java/com/cablelabs/vcpe/cos/cosbase/model/BandwidthProfile.java new file mode 100644 index 0000000..70f7313 --- /dev/null +++ b/cos/cosbase/src/main/java/com/cablelabs/vcpe/cos/cosbase/model/BandwidthProfile.java @@ -0,0 +1,27 @@ +package com.cablelabs.vcpe.cos.cosbase.model; + +import javax.xml.bind.annotation.XmlRootElement; + +/** + * Created by steve on 5/24/15. + */ + +@XmlRootElement +public class BandwidthProfile { + private int committedInfoRate = 0; // MBS + private int committedBurtSize = 0; // MBS + private int excessInfoRate = 0; // MBS + private int excessBurstSize = 0; // MBS + + public int getCommittedInfoRate() { return committedInfoRate; } + public void setCommittedInfoRate(int committedInfoRate) { this.committedInfoRate = committedInfoRate; } + + public int getCommittedBurtSize() { return committedBurtSize; } + public void setCommittedBurtSize(int committedBurtSize) { this.committedBurtSize = committedBurtSize; } + + public int getExcessInfoRate() { return excessInfoRate; } + public void setExcessInfoRate(int excessInfoRate) { this.excessInfoRate = excessInfoRate; } + + public int getExcessBurstSize() { return excessBurstSize; } + public void setExcessBurstSize(int excessBurstSize) { this.excessBurstSize = excessBurstSize; } +} diff --git a/cos/cosbase/src/main/java/com/cablelabs/vcpe/cos/cosbase/model/CoS.java b/cos/cosbase/src/main/java/com/cablelabs/vcpe/cos/cosbase/model/CoS.java new file mode 100644 index 0000000..8a4d219 --- /dev/null +++ b/cos/cosbase/src/main/java/com/cablelabs/vcpe/cos/cosbase/model/CoS.java @@ -0,0 +1,86 @@ +package com.cablelabs.vcpe.cos.cosbase.model; + +import com.cablelabs.vcpe.common.Dbg; + +import javax.xml.bind.annotation.XmlRootElement; +import java.util.List; + +/** + * Created by steve on 5/24/15. + */ + +@XmlRootElement +public class CoS +{ + private String id; + + // private BandwidthProfile ingressBWProfile; + // private BandwidthProfile egressBWProfile; + // Above should be integrated at some point + // ... for now we will support commitedInfoRate in Lie of BW Profiles + private int commitedInfoRate; // MBPS + + private double availbility; // percentage + private double frameDelay; // milli-seconds + private double jitter; // milli-seconds + private double frameLoss; // percentage + + // no argument constructor required for JAX-RS + public CoS() { + commitedInfoRate = 0; + availbility = 0.0; + frameDelay = 0.0; + jitter = 0.0; + frameLoss = 0.0; + } + + + public String getId() { return id; } + public void setId(String id) { this.id = id; } + + public int getCommitedInfoRate() { return commitedInfoRate; } + public void setCommitedInfoRate(int commitedInfoRate) { this.commitedInfoRate = commitedInfoRate; } + + public double getAvailbility() { return availbility; } + public void setAvailbility(double availbility) { this.availbility = availbility; } + + public double getFrameDelay() { return frameDelay; } + public void setFrameDelay(double frameDelay) { this.frameDelay = frameDelay; } + + public double getJitter() { return jitter; } + public void setJitter(double jitter) { this.jitter = jitter; } + + public double getFrameLoss() { return frameLoss; } + public void setFrameLoss(double frameLoss) { this.frameLoss = frameLoss; } + + public void setAllProps(String id, int commitedInfoRate, double availbility, double frameDelay, double jitter, double frameLoss) + { + this.id = id; + this.commitedInfoRate = commitedInfoRate; + this.availbility = availbility; + this.frameDelay = frameDelay; + this.jitter = jitter; + this.frameLoss = frameLoss; + } + + public void dump() { dump(0); } + public void dump(int tab) { + Dbg.p(tab, "id: " + this.id); + Dbg.p(tab, "commInfoRate: " + this.commitedInfoRate); + Dbg.p(tab, "availbility: " + this.availbility); + Dbg.p(tab, "frameDelay: " + this.frameDelay); + Dbg.p(tab, "jitter: " + this.jitter); + Dbg.p(tab, "frameLoss: " + this.frameLoss); + } + + public static void dumpList(List<CoS> cosList) { dumpList(0, cosList); } + public static void dumpList(int tab, List<CoS> cosList) { + int numCos = 0; + Dbg.p("----- CoS List : [" + cosList.size() + "] elements"); + for (CoS curCos : cosList) { + numCos++; + Dbg.p(tab+1, "<Entry " + numCos+">"); + curCos.dump(tab+2); + } + } +} diff --git a/cos/cosbase/src/main/java/com/cablelabs/vcpe/cos/cosbase/repository/CoSRespository.java b/cos/cosbase/src/main/java/com/cablelabs/vcpe/cos/cosbase/repository/CoSRespository.java new file mode 100644 index 0000000..3a58000 --- /dev/null +++ b/cos/cosbase/src/main/java/com/cablelabs/vcpe/cos/cosbase/repository/CoSRespository.java @@ -0,0 +1,22 @@ +package com.cablelabs.vcpe.cos.cosbase.repository; + +import com.cablelabs.vcpe.cos.cosbase.model.CoS; + +import java.util.List; + +/** + * Created by steve on 5/25/15. + */ +public interface CoSRespository +{ + // TODO add exceptions + + CoS add(CoS cos); // returns null if already exists, otherwise returns stored cos + CoS get(String cosId); // returns null if not found, otherwise stored cos + CoS update(CoS cos); // returns null if did not exit, otherwise cos as it was previous to update (put in any case) + CoS delete(String cosId); // returns null if not found, otherwise cos as it was previous to delete + int count(); // number of CoS stored in the repo + List<CoS> getAll(); + + public void dump(int tab); // print out contents of the repo +} diff --git a/cos/cosbase/src/main/java/com/cablelabs/vcpe/cos/cosbase/repository/CoSRespositoryInMem.java b/cos/cosbase/src/main/java/com/cablelabs/vcpe/cos/cosbase/repository/CoSRespositoryInMem.java new file mode 100644 index 0000000..2fa44c1 --- /dev/null +++ b/cos/cosbase/src/main/java/com/cablelabs/vcpe/cos/cosbase/repository/CoSRespositoryInMem.java @@ -0,0 +1,74 @@ +package com.cablelabs.vcpe.cos.cosbase.repository; + +import com.cablelabs.vcpe.common.Dbg; +import com.cablelabs.vcpe.cos.cosbase.model.CoS; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * Created by steve on 5/24/15. + */ + + +/* + Singleton that contains a hashmap which holds instances of CoS objects, indexed by CiS ID + */ + +public enum CoSRespositoryInMem implements CoSRespository { + INSTANCE; // Singleton + + private Map< String, CoS> cosDB = new ConcurrentHashMap<String, CoS>(); + + @Override + public CoS add(CoS cos) { + if ( this.get(cos.getId()) != null ) { + return null; + } + cosDB.put(cos.getId(), cos ); + return cos; + } + + @Override + public CoS get(String cosId) { + return cosDB.get(cosId); + } + + @Override + public CoS update(CoS cos) { + // put returns null if cos did not exist, other returns cos as it stood prior to put + return cosDB.put(cos.getId(), cos); + } + + @Override + public CoS delete(String cosId) { + // remove returns null if cos did not exist, other returns cos as it stood prior to remove + return cosDB.remove(cosId); + } + + @Override + public List<CoS> getAll() { + List<CoS> cosList = new ArrayList<CoS>(cosDB.values()); + return cosList; + } + + @Override + public int count() { + return cosDB.size(); + } + + @Override + public void dump(int tab) { + + Dbg.p(tab, "CoS Repo: " + cosDB.size() + " entrie(s)"); + int numCos = 0; + for (CoS curCos : cosDB.values()) { + numCos++; + Dbg.p(tab+1, "<Entry " + numCos+">"); + curCos.dump(tab+2); + } + } + +} diff --git a/cos/cosbase/src/test/java/com/cablelabs/vcpe/cos/cosbase/client/CoSClientTest.java b/cos/cosbase/src/test/java/com/cablelabs/vcpe/cos/cosbase/client/CoSClientTest.java new file mode 100644 index 0000000..cbf5516 --- /dev/null +++ b/cos/cosbase/src/test/java/com/cablelabs/vcpe/cos/cosbase/client/CoSClientTest.java @@ -0,0 +1,105 @@ +package com.cablelabs.vcpe.cos.cosbase.client; + +import com.cablelabs.vcpe.common.Dbg; +import com.cablelabs.vcpe.cos.cosbase.model.CoS; +import org.junit.Test; + +import java.util.List; + +import static org.junit.Assert.*; + +/** + * Created by steve on 5/28/15. + */ + +public class CoSClientTest { + + @Test + public void testAll() throws Exception { + CoSClient coSClient = new CoSClient(); + + CoS gold = new CoS(); + gold.setAllProps("gold", 100, 0.99, 17.43, 2.43, 0.01); + Dbg.p("gold svc being created in CoS"); + gold.dump(1); + + gold = coSClient.create(gold); + assertNotNull(gold); + + CoS retrievedCos = coSClient.get(gold.getId()); + + assertNotNull(retrievedCos); + Dbg.p("gold svc just retrieved from CoS"); + retrievedCos.dump(1); + retrievedCos = null; + + gold.setCommitedInfoRate(50); + Dbg.p("gold svc modified, to be updated"); + gold.dump(1); + assertNotNull(coSClient.update(gold)); + retrievedCos = coSClient.get(gold.getId()); + assertNotNull(retrievedCos); + Dbg.p("gold svc modified, just retrieved from CoS"); + retrievedCos.dump(1); + + coSClient.delete(gold.getId()); + + CoS vid = new CoS(); + CoS game = new CoS(); + CoS dl = new CoS(); + + vid.setAllProps ("vid", 100, 0.99, 17.43, 2.43, 0.1); + game.setAllProps("game", 75, 0.99, 7.43, 1.43, 0.01); + dl.setAllProps("dl", 100, 0.99, 17.43, 2.43, 0.02); + + vid = coSClient.create(vid); + assertNotNull(vid); + + game = coSClient.create(game); + assertNotNull(game); + + dl = coSClient.create(dl); + assertNotNull(dl); + + + + List<CoS> cosList = coSClient.getAll(); + assertNotNull(cosList); + assertEquals(cosList.size(), 3); + CoS.dumpList(cosList); + + coSClient.delete(game.getId()); + cosList = coSClient.getAll(); + assertNotNull(cosList); + assertEquals(cosList.size(), 2); + CoS.dumpList(cosList); + + coSClient.delete(vid.getId()); + cosList = coSClient.getAll(); + assertNotNull(cosList); + assertEquals(cosList.size(), 1); + CoS.dumpList(cosList); + + coSClient.delete(dl.getId()); + cosList = coSClient.getAll(); + assertNotNull(cosList); + assertEquals(cosList.size(), 0); + CoS.dumpList(cosList); + } + + @Test + public void testTestGet() throws Exception { + CoSClient coSClient = new CoSClient(); + CoS cos = coSClient.testGet(); + cos.dump();; + } + + @Test + public void testPing() throws Exception { + + CoSClient coSClient = new CoSClient(); + String resp = coSClient.ping(); + Dbg.p(resp); + } + +}
\ No newline at end of file diff --git a/cos/cosbase/src/test/java/com/cablelabs/vcpe/cos/cosbase/repository/CoSRepositoryTest.java b/cos/cosbase/src/test/java/com/cablelabs/vcpe/cos/cosbase/repository/CoSRepositoryTest.java new file mode 100644 index 0000000..0c46737 --- /dev/null +++ b/cos/cosbase/src/test/java/com/cablelabs/vcpe/cos/cosbase/repository/CoSRepositoryTest.java @@ -0,0 +1,63 @@ +package com.cablelabs.vcpe.cos.cosbase.repository; + +import com.cablelabs.vcpe.cos.cosbase.model.CoS; +import org.junit.Test; + +import static org.junit.Assert.*; + +/** + * Created by steve on 5/25/15. + */ +public class CoSRepositoryTest +{ + + @Test + public void test() { + + CoS gold = new CoS(); + CoS silver = new CoS(); + CoS bronze = new CoS(); + + // id CIR/MBS avail delay jitter frameloss + gold.setAllProps("gold", 100, 0.99, 17.43, 2.43, 0.01); + silver.setAllProps("silver", 50, 0.95, 27.43, 2.43, 0.02); + bronze.setAllProps("bronze", 25, 0.90, 37.43, 2.43, 0.03); + + CoSRespository repo = CoSRespositoryInMem.INSTANCE; + + assertNotNull(repo.add(gold)); + assertNotNull(repo.add(silver)); + assertNotNull(repo.add(bronze)); + assertNull(repo.add(bronze)); // duplicate + assertEquals(repo.count(), 3); + + assertNotNull(repo.get(gold.getId())); + assertNotNull(repo.get(silver.getId())); + assertNotNull(repo.get(bronze.getId())); + + assertNotNull(repo.delete(silver.getId())); + assertNull(repo.delete(silver.getId())); + assertNull(repo.delete("not-in-repo")); + assertEquals(repo.count(), 2); + + assertEquals(repo.get(gold.getId()).getCommitedInfoRate(), 100); + assertNotEquals(repo.get(bronze.getId()).getCommitedInfoRate(), 100); + + CoS tin = new CoS(); + tin.setAllProps("tin", 1, 0.50, 47.43, 2.43, 0.04); + + + assertNull(repo.update(tin)); // update non-existent cos + assertEquals(repo.count(), 3); + assertEquals(repo.get("tin").getCommitedInfoRate(), 1); + + tin.setCommitedInfoRate(5); + assertNotNull(repo.update(tin)); // update existing cos, same object + assertEquals(repo.get("tin").getCommitedInfoRate(), 5); + + CoS tin2 = new CoS(); + tin.setAllProps("tin", 8, 0.50, 47.43, 2.43, 0.04); + assertNotNull(repo.update(tin)); // update existing cos, new object + assertEquals(repo.get("tin").getCommitedInfoRate(), 8); + } +} diff --git a/cos/cosbase/target/classes/com/cablelabs/vcpe/cos/cosbase/client/CoSClient$1.class b/cos/cosbase/target/classes/com/cablelabs/vcpe/cos/cosbase/client/CoSClient$1.class Binary files differnew file mode 100644 index 0000000..6e5c04d --- /dev/null +++ b/cos/cosbase/target/classes/com/cablelabs/vcpe/cos/cosbase/client/CoSClient$1.class diff --git a/cos/cosbase/target/classes/com/cablelabs/vcpe/cos/cosbase/client/CoSClient.class b/cos/cosbase/target/classes/com/cablelabs/vcpe/cos/cosbase/client/CoSClient.class Binary files differnew file mode 100644 index 0000000..d20148c --- /dev/null +++ b/cos/cosbase/target/classes/com/cablelabs/vcpe/cos/cosbase/client/CoSClient.class diff --git a/cos/cosbase/target/classes/com/cablelabs/vcpe/cos/cosbase/model/BandwidthProfile.class b/cos/cosbase/target/classes/com/cablelabs/vcpe/cos/cosbase/model/BandwidthProfile.class Binary files differnew file mode 100644 index 0000000..3e4a92d --- /dev/null +++ b/cos/cosbase/target/classes/com/cablelabs/vcpe/cos/cosbase/model/BandwidthProfile.class diff --git a/cos/cosbase/target/classes/com/cablelabs/vcpe/cos/cosbase/model/CoS.class b/cos/cosbase/target/classes/com/cablelabs/vcpe/cos/cosbase/model/CoS.class Binary files differnew file mode 100644 index 0000000..744b89c --- /dev/null +++ b/cos/cosbase/target/classes/com/cablelabs/vcpe/cos/cosbase/model/CoS.class diff --git a/cos/cosbase/target/classes/com/cablelabs/vcpe/cos/cosbase/repository/CoSRespository.class b/cos/cosbase/target/classes/com/cablelabs/vcpe/cos/cosbase/repository/CoSRespository.class Binary files differnew file mode 100644 index 0000000..d3b6054 --- /dev/null +++ b/cos/cosbase/target/classes/com/cablelabs/vcpe/cos/cosbase/repository/CoSRespository.class diff --git a/cos/cosbase/target/classes/com/cablelabs/vcpe/cos/cosbase/repository/CoSRespositoryInMem.class b/cos/cosbase/target/classes/com/cablelabs/vcpe/cos/cosbase/repository/CoSRespositoryInMem.class Binary files differnew file mode 100644 index 0000000..6d8f689 --- /dev/null +++ b/cos/cosbase/target/classes/com/cablelabs/vcpe/cos/cosbase/repository/CoSRespositoryInMem.class diff --git a/cos/cosbase/target/cosbase.jar b/cos/cosbase/target/cosbase.jar Binary files differnew file mode 100644 index 0000000..d991659 --- /dev/null +++ b/cos/cosbase/target/cosbase.jar diff --git a/cos/cosbase/target/maven-archiver/pom.properties b/cos/cosbase/target/maven-archiver/pom.properties new file mode 100644 index 0000000..0b6b211 --- /dev/null +++ b/cos/cosbase/target/maven-archiver/pom.properties @@ -0,0 +1,5 @@ +#Generated by Maven +#Thu Aug 06 14:01:18 PDT 2015 +version=1.0-SNAPSHOT +groupId=com.cablelabs.vcpe +artifactId=cosbase diff --git a/cos/cosbase/target/test-classes/com/cablelabs/vcpe/cos/cosbase/client/CoSClientTest.class b/cos/cosbase/target/test-classes/com/cablelabs/vcpe/cos/cosbase/client/CoSClientTest.class Binary files differnew file mode 100644 index 0000000..a4c81fc --- /dev/null +++ b/cos/cosbase/target/test-classes/com/cablelabs/vcpe/cos/cosbase/client/CoSClientTest.class diff --git a/cos/cosbase/target/test-classes/com/cablelabs/vcpe/cos/cosbase/repository/CoSRepositoryTest.class b/cos/cosbase/target/test-classes/com/cablelabs/vcpe/cos/cosbase/repository/CoSRepositoryTest.class Binary files differnew file mode 100644 index 0000000..c9f508e --- /dev/null +++ b/cos/cosbase/target/test-classes/com/cablelabs/vcpe/cos/cosbase/repository/CoSRepositoryTest.class |