alshabib

real application ids

Change-Id: Ia24f1de6ccff614769727ab261002520dfd8506f
...@@ -10,6 +10,7 @@ import org.apache.felix.scr.annotations.Deactivate; ...@@ -10,6 +10,7 @@ import org.apache.felix.scr.annotations.Deactivate;
10 import org.apache.felix.scr.annotations.Reference; 10 import org.apache.felix.scr.annotations.Reference;
11 import org.apache.felix.scr.annotations.ReferenceCardinality; 11 import org.apache.felix.scr.annotations.ReferenceCardinality;
12 import org.onlab.onos.ApplicationId; 12 import org.onlab.onos.ApplicationId;
13 +import org.onlab.onos.CoreService;
13 import org.onlab.onos.net.Host; 14 import org.onlab.onos.net.Host;
14 import org.onlab.onos.net.HostId; 15 import org.onlab.onos.net.HostId;
15 import org.onlab.onos.net.Path; 16 import org.onlab.onos.net.Path;
...@@ -53,13 +54,16 @@ public class ReactiveForwarding { ...@@ -53,13 +54,16 @@ public class ReactiveForwarding {
53 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) 54 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
54 protected FlowRuleService flowRuleService; 55 protected FlowRuleService flowRuleService;
55 56
57 + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
58 + protected CoreService coreService;
59 +
56 private ReactivePacketProcessor processor = new ReactivePacketProcessor(); 60 private ReactivePacketProcessor processor = new ReactivePacketProcessor();
57 61
58 private ApplicationId appId; 62 private ApplicationId appId;
59 63
60 @Activate 64 @Activate
61 public void activate() { 65 public void activate() {
62 - appId = ApplicationId.getAppId(); 66 + appId = coreService.registerApplication("org.onlab.onos.fwd");
63 packetService.addProcessor(processor, PacketProcessor.ADVISOR_MAX + 2); 67 packetService.addProcessor(processor, PacketProcessor.ADVISOR_MAX + 2);
64 log.info("Started with Application ID {}", appId.id()); 68 log.info("Started with Application ID {}", appId.id());
65 } 69 }
......
...@@ -10,6 +10,7 @@ import org.apache.felix.scr.annotations.Deactivate; ...@@ -10,6 +10,7 @@ import org.apache.felix.scr.annotations.Deactivate;
10 import org.apache.felix.scr.annotations.Reference; 10 import org.apache.felix.scr.annotations.Reference;
11 import org.apache.felix.scr.annotations.ReferenceCardinality; 11 import org.apache.felix.scr.annotations.ReferenceCardinality;
12 import org.onlab.onos.ApplicationId; 12 import org.onlab.onos.ApplicationId;
13 +import org.onlab.onos.CoreService;
13 import org.onlab.onos.net.Device; 14 import org.onlab.onos.net.Device;
14 import org.onlab.onos.net.Host; 15 import org.onlab.onos.net.Host;
15 import org.onlab.onos.net.device.DeviceService; 16 import org.onlab.onos.net.device.DeviceService;
...@@ -44,11 +45,14 @@ public class HostMobility { ...@@ -44,11 +45,14 @@ public class HostMobility {
44 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) 45 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
45 protected DeviceService deviceService; 46 protected DeviceService deviceService;
46 47
48 + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
49 + protected CoreService coreService;
50 +
47 private ApplicationId appId; 51 private ApplicationId appId;
48 52
49 @Activate 53 @Activate
50 public void activate() { 54 public void activate() {
51 - appId = ApplicationId.getAppId(); 55 + appId = coreService.registerApplication("org.onlab.onos.mobility");
52 hostService.addListener(new InternalHostListener()); 56 hostService.addListener(new InternalHostListener());
53 log.info("Started with Application ID {}", appId.id()); 57 log.info("Started with Application ID {}", appId.id());
54 } 58 }
......
...@@ -8,6 +8,7 @@ import org.apache.felix.scr.annotations.Deactivate; ...@@ -8,6 +8,7 @@ import org.apache.felix.scr.annotations.Deactivate;
8 import org.apache.felix.scr.annotations.Reference; 8 import org.apache.felix.scr.annotations.Reference;
9 import org.apache.felix.scr.annotations.ReferenceCardinality; 9 import org.apache.felix.scr.annotations.ReferenceCardinality;
10 import org.onlab.onos.ApplicationId; 10 import org.onlab.onos.ApplicationId;
11 +import org.onlab.onos.CoreService;
11 import org.onlab.onos.net.packet.PacketContext; 12 import org.onlab.onos.net.packet.PacketContext;
12 import org.onlab.onos.net.packet.PacketProcessor; 13 import org.onlab.onos.net.packet.PacketProcessor;
13 import org.onlab.onos.net.packet.PacketService; 14 import org.onlab.onos.net.packet.PacketService;
...@@ -31,11 +32,14 @@ public class ProxyArp { ...@@ -31,11 +32,14 @@ public class ProxyArp {
31 32
32 private ProxyArpProcessor processor = new ProxyArpProcessor(); 33 private ProxyArpProcessor processor = new ProxyArpProcessor();
33 34
35 + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
36 + protected CoreService coreService;
37 +
34 private ApplicationId appId; 38 private ApplicationId appId;
35 39
36 @Activate 40 @Activate
37 public void activate() { 41 public void activate() {
38 - appId = ApplicationId.getAppId(); 42 + appId = coreService.registerApplication("org.onlab.onos.proxyarp");
39 packetService.addProcessor(processor, PacketProcessor.ADVISOR_MAX + 1); 43 packetService.addProcessor(processor, PacketProcessor.ADVISOR_MAX + 1);
40 log.info("Started with Application ID {}", appId.id()); 44 log.info("Started with Application ID {}", appId.id());
41 } 45 }
......
1 package org.onlab.onos; 1 package org.onlab.onos;
2 2
3 -import java.util.Objects;
4 -import java.util.concurrent.atomic.AtomicInteger;
5 3
6 /** 4 /**
7 - * Application id generator class. 5 + * Application identifier.
8 */ 6 */
9 -public final class ApplicationId { 7 +public interface ApplicationId {
10 8
11 - private static final AtomicInteger ID_DISPENCER = new AtomicInteger(1); 9 + /**
12 - private final Integer id; 10 + * Returns the application id.
13 - 11 + * @return a short value
14 - // Ban public construction 12 + */
15 - private ApplicationId(Integer id) { 13 + short id();
16 - this.id = id;
17 - }
18 -
19 - public Integer id() {
20 - return id;
21 - }
22 -
23 - public static ApplicationId valueOf(Integer id) {
24 - return new ApplicationId(id);
25 - }
26 -
27 - @Override
28 - public int hashCode() {
29 - return Objects.hash(id);
30 - }
31 -
32 - @Override
33 - public boolean equals(Object obj) {
34 - if (this == obj) {
35 - return true;
36 - }
37 - if (obj == null) {
38 - return false;
39 - }
40 - if (!(obj instanceof ApplicationId)) {
41 - return false;
42 - }
43 - ApplicationId other = (ApplicationId) obj;
44 - return Objects.equals(this.id, other.id);
45 - }
46 14
47 /** 15 /**
48 - * Returns a new application id. 16 + * Returns the applications supplied identifier.
49 - * 17 + * @return a string identifier
50 - * @return app id
51 */ 18 */
52 - public static ApplicationId getAppId() { 19 + String name();
53 - return new ApplicationId(ApplicationId.ID_DISPENCER.getAndIncrement());
54 - }
55 20
56 } 21 }
......
...@@ -12,4 +12,21 @@ public interface CoreService { ...@@ -12,4 +12,21 @@ public interface CoreService {
12 */ 12 */
13 Version version(); 13 Version version();
14 14
15 + /**
16 + * Registers a new application by its name, which is expected
17 + * to follow the reverse DNS convention, e.g.
18 + * {@code org.flying.circus.app}
19 + *
20 + * @param identifier string identifier
21 + * @return the application id
22 + */
23 + ApplicationId registerApplication(String identifier);
24 +
25 + /**
26 + * Returns an existing application id from a given id.
27 + * @param id the short value of the id
28 + * @return an application id
29 + */
30 + ApplicationId getAppId(Short id);
31 +
15 } 32 }
......
...@@ -21,7 +21,7 @@ public class DefaultFlowRule implements FlowRule { ...@@ -21,7 +21,7 @@ public class DefaultFlowRule implements FlowRule {
21 21
22 private final FlowId id; 22 private final FlowId id;
23 23
24 - private final ApplicationId appId; 24 + private final short appId;
25 25
26 private final int timeout; 26 private final int timeout;
27 27
...@@ -36,7 +36,7 @@ public class DefaultFlowRule implements FlowRule { ...@@ -36,7 +36,7 @@ public class DefaultFlowRule implements FlowRule {
36 this.timeout = timeout; 36 this.timeout = timeout;
37 this.created = System.currentTimeMillis(); 37 this.created = System.currentTimeMillis();
38 38
39 - this.appId = ApplicationId.valueOf((int) (flowId >> 32)); 39 + this.appId = (short) (flowId >>> 48);
40 this.id = FlowId.valueOf(flowId); 40 this.id = FlowId.valueOf(flowId);
41 } 41 }
42 42
...@@ -52,11 +52,11 @@ public class DefaultFlowRule implements FlowRule { ...@@ -52,11 +52,11 @@ public class DefaultFlowRule implements FlowRule {
52 this.priority = priority; 52 this.priority = priority;
53 this.selector = selector; 53 this.selector = selector;
54 this.treatment = treatement; 54 this.treatment = treatement;
55 - this.appId = appId; 55 + this.appId = appId.id();
56 this.timeout = timeout; 56 this.timeout = timeout;
57 this.created = System.currentTimeMillis(); 57 this.created = System.currentTimeMillis();
58 58
59 - this.id = FlowId.valueOf((((long) appId().id()) << 32) | (this.hash() & 0xffffffffL)); 59 + this.id = FlowId.valueOf((((long) this.appId) << 48) | (this.hash() & 0x0000ffffffffL));
60 } 60 }
61 61
62 public DefaultFlowRule(FlowRule rule) { 62 public DefaultFlowRule(FlowRule rule) {
...@@ -78,7 +78,7 @@ public class DefaultFlowRule implements FlowRule { ...@@ -78,7 +78,7 @@ public class DefaultFlowRule implements FlowRule {
78 } 78 }
79 79
80 @Override 80 @Override
81 - public ApplicationId appId() { 81 + public short appId() {
82 return appId; 82 return appId;
83 } 83 }
84 84
......
1 package org.onlab.onos.net.flow; 1 package org.onlab.onos.net.flow;
2 2
3 -import org.onlab.onos.ApplicationId;
4 import org.onlab.onos.net.DeviceId; 3 import org.onlab.onos.net.DeviceId;
5 import org.onlab.onos.net.intent.BatchOperationTarget; 4 import org.onlab.onos.net.intent.BatchOperationTarget;
6 5
...@@ -26,7 +25,7 @@ public interface FlowRule extends BatchOperationTarget { ...@@ -26,7 +25,7 @@ public interface FlowRule extends BatchOperationTarget {
26 * 25 *
27 * @return an applicationId 26 * @return an applicationId
28 */ 27 */
29 - ApplicationId appId(); 28 + short appId();
30 29
31 /** 30 /**
32 * Returns the flow rule priority given in natural order; higher numbers 31 * Returns the flow rule priority given in natural order; higher numbers
......
1 -package org.onlab.onos.cluster.impl; 1 +package org.onlab.onos.impl;
2 +
3 +import java.io.File;
4 +import java.util.List;
5 +import java.util.Map;
6 +import java.util.concurrent.ConcurrentHashMap;
7 +import java.util.concurrent.atomic.AtomicInteger;
2 8
3 import org.apache.felix.scr.annotations.Activate; 9 import org.apache.felix.scr.annotations.Activate;
4 import org.apache.felix.scr.annotations.Component; 10 import org.apache.felix.scr.annotations.Component;
5 import org.apache.felix.scr.annotations.Service; 11 import org.apache.felix.scr.annotations.Service;
12 +import org.onlab.onos.ApplicationId;
6 import org.onlab.onos.CoreService; 13 import org.onlab.onos.CoreService;
7 import org.onlab.onos.Version; 14 import org.onlab.onos.Version;
8 import org.onlab.util.Tools; 15 import org.onlab.util.Tools;
9 16
10 -import java.io.File;
11 -import java.util.List;
12 17
13 /** 18 /**
14 * Core service implementation. 19 * Core service implementation.
...@@ -17,9 +22,12 @@ import java.util.List; ...@@ -17,9 +22,12 @@ import java.util.List;
17 @Service 22 @Service
18 public class CoreManager implements CoreService { 23 public class CoreManager implements CoreService {
19 24
25 + private static final AtomicInteger ID_DISPENSER = new AtomicInteger(1);
20 private static final File VERSION_FILE = new File("../VERSION"); 26 private static final File VERSION_FILE = new File("../VERSION");
21 private static Version version = Version.version("1.0.0-SNAPSHOT"); 27 private static Version version = Version.version("1.0.0-SNAPSHOT");
22 28
29 + private final Map<Short, DefaultApplicationId> ids = new ConcurrentHashMap<>();
30 +
23 // TODO: work in progress 31 // TODO: work in progress
24 32
25 @Activate 33 @Activate
...@@ -35,4 +43,14 @@ public class CoreManager implements CoreService { ...@@ -35,4 +43,14 @@ public class CoreManager implements CoreService {
35 return version; 43 return version;
36 } 44 }
37 45
46 + @Override
47 + public ApplicationId getAppId(Short id) {
48 + return ids.get(id);
49 + }
50 +
51 + @Override
52 + public ApplicationId registerApplication(String name) {
53 + return new DefaultApplicationId((short) ID_DISPENSER.getAndIncrement(), name);
54 + }
55 +
38 } 56 }
......
1 +package org.onlab.onos.impl;
2 +
3 +import java.util.Objects;
4 +
5 +import org.onlab.onos.ApplicationId;
6 +
7 +/**
8 + * Application id generator class.
9 + */
10 +public class DefaultApplicationId implements ApplicationId {
11 +
12 +
13 + private final short id;
14 + private final String name;
15 +
16 +
17 + // Ban public construction
18 + protected DefaultApplicationId(Short id, String identifier) {
19 + this.id = id;
20 + this.name = identifier;
21 + }
22 +
23 + @Override
24 + public short id() {
25 + return id;
26 + }
27 +
28 + @Override
29 + public String name() {
30 + return name;
31 + }
32 +
33 + @Override
34 + public int hashCode() {
35 + return Objects.hash(id);
36 + }
37 +
38 + @Override
39 + public boolean equals(Object obj) {
40 + if (this == obj) {
41 + return true;
42 + }
43 + if (obj == null) {
44 + return false;
45 + }
46 + if (!(obj instanceof DefaultApplicationId)) {
47 + return false;
48 + }
49 + DefaultApplicationId other = (DefaultApplicationId) obj;
50 + return Objects.equals(this.id, other.id);
51 + }
52 +}
1 +/**
2 + *
3 + */
4 +package org.onlab.onos.impl;
...\ No newline at end of file ...\ No newline at end of file
...@@ -13,6 +13,7 @@ import org.apache.felix.scr.annotations.Deactivate; ...@@ -13,6 +13,7 @@ import org.apache.felix.scr.annotations.Deactivate;
13 import org.apache.felix.scr.annotations.Reference; 13 import org.apache.felix.scr.annotations.Reference;
14 import org.apache.felix.scr.annotations.ReferenceCardinality; 14 import org.apache.felix.scr.annotations.ReferenceCardinality;
15 import org.onlab.onos.ApplicationId; 15 import org.onlab.onos.ApplicationId;
16 +import org.onlab.onos.CoreService;
16 import org.onlab.onos.net.ConnectPoint; 17 import org.onlab.onos.net.ConnectPoint;
17 import org.onlab.onos.net.Link; 18 import org.onlab.onos.net.Link;
18 import org.onlab.onos.net.flow.CompletedBatchOperation; 19 import org.onlab.onos.net.flow.CompletedBatchOperation;
...@@ -46,10 +47,14 @@ public class PathIntentInstaller implements IntentInstaller<PathIntent> { ...@@ -46,10 +47,14 @@ public class PathIntentInstaller implements IntentInstaller<PathIntent> {
46 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) 47 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
47 protected FlowRuleService flowRuleService; 48 protected FlowRuleService flowRuleService;
48 49
49 - private final ApplicationId appId = ApplicationId.getAppId(); 50 + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
51 + protected CoreService coreService;
52 +
53 + private ApplicationId appId;
50 54
51 @Activate 55 @Activate
52 public void activate() { 56 public void activate() {
57 + appId = coreService.registerApplication("org.onlab.onos.net.intent");
53 intentManager.registerInstaller(PathIntent.class, this); 58 intentManager.registerInstaller(PathIntent.class, this);
54 } 59 }
55 60
......
...@@ -19,6 +19,7 @@ import org.junit.Before; ...@@ -19,6 +19,7 @@ import org.junit.Before;
19 import org.junit.Test; 19 import org.junit.Test;
20 import org.onlab.onos.ApplicationId; 20 import org.onlab.onos.ApplicationId;
21 import org.onlab.onos.event.impl.TestEventDispatcher; 21 import org.onlab.onos.event.impl.TestEventDispatcher;
22 +import org.onlab.onos.impl.DefaultApplicationId;
22 import org.onlab.onos.net.DefaultDevice; 23 import org.onlab.onos.net.DefaultDevice;
23 import org.onlab.onos.net.Device; 24 import org.onlab.onos.net.Device;
24 import org.onlab.onos.net.Device.Type; 25 import org.onlab.onos.net.Device.Type;
...@@ -59,6 +60,8 @@ import com.google.common.collect.Sets; ...@@ -59,6 +60,8 @@ import com.google.common.collect.Sets;
59 */ 60 */
60 public class FlowRuleManagerTest { 61 public class FlowRuleManagerTest {
61 62
63 +
64 +
62 private static final ProviderId PID = new ProviderId("of", "foo"); 65 private static final ProviderId PID = new ProviderId("of", "foo");
63 private static final DeviceId DID = DeviceId.deviceId("of:001"); 66 private static final DeviceId DID = DeviceId.deviceId("of:001");
64 private static final int TIMEOUT = 10; 67 private static final int TIMEOUT = 10;
...@@ -87,7 +90,7 @@ public class FlowRuleManagerTest { ...@@ -87,7 +90,7 @@ public class FlowRuleManagerTest {
87 mgr.addListener(listener); 90 mgr.addListener(listener);
88 provider = new TestProvider(PID); 91 provider = new TestProvider(PID);
89 providerService = registry.register(provider); 92 providerService = registry.register(provider);
90 - appId = ApplicationId.getAppId(); 93 + appId = new TestApplicationId((short) 0, "FlowRuleManagerTest");
91 assertTrue("provider should be registered", 94 assertTrue("provider should be registered",
92 registry.getProviders().contains(provider.id())); 95 registry.getProviders().contains(provider.id()));
93 } 96 }
...@@ -475,4 +478,11 @@ public class FlowRuleManagerTest { ...@@ -475,4 +478,11 @@ public class FlowRuleManagerTest {
475 478
476 } 479 }
477 480
481 + public class TestApplicationId extends DefaultApplicationId {
482 +
483 + public TestApplicationId(short id, String name) {
484 + super(id, name);
485 + }
486 + }
487 +
478 } 488 }
......
...@@ -43,8 +43,8 @@ public class DistributedFlowRuleStore ...@@ -43,8 +43,8 @@ public class DistributedFlowRuleStore
43 private final Multimap<DeviceId, FlowEntry> flowEntries = 43 private final Multimap<DeviceId, FlowEntry> flowEntries =
44 ArrayListMultimap.<DeviceId, FlowEntry>create(); 44 ArrayListMultimap.<DeviceId, FlowEntry>create();
45 45
46 - private final Multimap<ApplicationId, FlowRule> flowEntriesById = 46 + private final Multimap<Short, FlowRule> flowEntriesById =
47 - ArrayListMultimap.<ApplicationId, FlowRule>create(); 47 + ArrayListMultimap.<Short, FlowRule>create();
48 48
49 @Activate 49 @Activate
50 public void activate() { 50 public void activate() {
...@@ -83,7 +83,7 @@ public class DistributedFlowRuleStore ...@@ -83,7 +83,7 @@ public class DistributedFlowRuleStore
83 83
84 @Override 84 @Override
85 public synchronized Iterable<FlowRule> getFlowRulesByAppId(ApplicationId appId) { 85 public synchronized Iterable<FlowRule> getFlowRulesByAppId(ApplicationId appId) {
86 - Collection<FlowRule> rules = flowEntriesById.get(appId); 86 + Collection<FlowRule> rules = flowEntriesById.get(appId.id());
87 if (rules == null) { 87 if (rules == null) {
88 return Collections.emptyList(); 88 return Collections.emptyList();
89 } 89 }
......
...@@ -43,8 +43,8 @@ public class DistributedFlowRuleStore ...@@ -43,8 +43,8 @@ public class DistributedFlowRuleStore
43 private final Multimap<DeviceId, FlowEntry> flowEntries = 43 private final Multimap<DeviceId, FlowEntry> flowEntries =
44 ArrayListMultimap.<DeviceId, FlowEntry>create(); 44 ArrayListMultimap.<DeviceId, FlowEntry>create();
45 45
46 - private final Multimap<ApplicationId, FlowRule> flowEntriesById = 46 + private final Multimap<Short, FlowRule> flowEntriesById =
47 - ArrayListMultimap.<ApplicationId, FlowRule>create(); 47 + ArrayListMultimap.<Short, FlowRule>create();
48 48
49 @Activate 49 @Activate
50 public void activate() { 50 public void activate() {
...@@ -83,7 +83,7 @@ public class DistributedFlowRuleStore ...@@ -83,7 +83,7 @@ public class DistributedFlowRuleStore
83 83
84 @Override 84 @Override
85 public synchronized Iterable<FlowRule> getFlowRulesByAppId(ApplicationId appId) { 85 public synchronized Iterable<FlowRule> getFlowRulesByAppId(ApplicationId appId) {
86 - Collection<FlowRule> rules = flowEntriesById.get(appId); 86 + Collection<FlowRule> rules = flowEntriesById.get(appId.id());
87 if (rules == null) { 87 if (rules == null) {
88 return Collections.emptyList(); 88 return Collections.emptyList();
89 } 89 }
......
...@@ -42,8 +42,8 @@ public class SimpleFlowRuleStore ...@@ -42,8 +42,8 @@ public class SimpleFlowRuleStore
42 private final Multimap<DeviceId, FlowEntry> flowEntries = 42 private final Multimap<DeviceId, FlowEntry> flowEntries =
43 ArrayListMultimap.<DeviceId, FlowEntry>create(); 43 ArrayListMultimap.<DeviceId, FlowEntry>create();
44 44
45 - private final Multimap<ApplicationId, FlowRule> flowEntriesById = 45 + private final Multimap<Short, FlowRule> flowEntriesById =
46 - ArrayListMultimap.<ApplicationId, FlowRule>create(); 46 + ArrayListMultimap.<Short, FlowRule>create();
47 47
48 @Activate 48 @Activate
49 public void activate() { 49 public void activate() {
...@@ -82,7 +82,7 @@ public class SimpleFlowRuleStore ...@@ -82,7 +82,7 @@ public class SimpleFlowRuleStore
82 82
83 @Override 83 @Override
84 public synchronized Iterable<FlowRule> getFlowRulesByAppId(ApplicationId appId) { 84 public synchronized Iterable<FlowRule> getFlowRulesByAppId(ApplicationId appId) {
85 - Collection<FlowRule> rules = flowEntriesById.get(appId); 85 + Collection<FlowRule> rules = flowEntriesById.get(appId.id());
86 if (rules == null) { 86 if (rules == null) {
87 return Collections.emptyList(); 87 return Collections.emptyList();
88 } 88 }
......