Merge branch 'master' of ssh://gerrit.onlab.us:29418/onos-next
Showing
32 changed files
with
804 additions
and
117 deletions
1 | +package org.onlab.onos.cluster; | ||
2 | + | ||
3 | +import org.onlab.onos.event.AbstractEvent; | ||
4 | + | ||
5 | +/** | ||
6 | + * Describes cluster-related event. | ||
7 | + */ | ||
8 | +public class ClusterEvent extends AbstractEvent<ClusterEvent.Type, ControllerInstance> { | ||
9 | + | ||
10 | + /** | ||
11 | + * Type of device events. | ||
12 | + */ | ||
13 | + public enum Type { | ||
14 | + /** | ||
15 | + * Signifies that a new cluster instance has been administratively added. | ||
16 | + */ | ||
17 | + INSTANCE_ADDED, | ||
18 | + | ||
19 | + /** | ||
20 | + * Signifies that a cluster instance has been administratively removed. | ||
21 | + */ | ||
22 | + INSTANCE_REMOVED, | ||
23 | + | ||
24 | + /** | ||
25 | + * Signifies that a cluster instance became active. | ||
26 | + */ | ||
27 | + INSTANCE_ACTIVE, | ||
28 | + | ||
29 | + /** | ||
30 | + * Signifies that a cluster instance became inactive. | ||
31 | + */ | ||
32 | + INSTANCE_INACTIVE | ||
33 | + } | ||
34 | + // TODO: do we need to fix the verv/adjective mix? discuss | ||
35 | + | ||
36 | + /** | ||
37 | + * Creates an event of a given type and for the specified instance and the | ||
38 | + * current time. | ||
39 | + * | ||
40 | + * @param type cluster event type | ||
41 | + * @param instance cluster device subject | ||
42 | + */ | ||
43 | + public ClusterEvent(Type type, ControllerInstance instance) { | ||
44 | + super(type, instance); | ||
45 | + } | ||
46 | + | ||
47 | + /** | ||
48 | + * Creates an event of a given type and for the specified device and time. | ||
49 | + * | ||
50 | + * @param type device event type | ||
51 | + * @param instance event device subject | ||
52 | + * @param time occurrence time | ||
53 | + */ | ||
54 | + public ClusterEvent(Type type, ControllerInstance instance, long time) { | ||
55 | + super(type, instance, time); | ||
56 | + } | ||
57 | + | ||
58 | +} |
1 | +package org.onlab.onos.cluster; | ||
2 | + | ||
3 | +import java.util.Set; | ||
4 | + | ||
5 | +/** | ||
6 | + * Service for obtaining information about the individual instances within | ||
7 | + * the controller cluster. | ||
8 | + */ | ||
9 | +public interface ClusterService { | ||
10 | + | ||
11 | + /** | ||
12 | + * Returns the set of current cluster members. | ||
13 | + * | ||
14 | + * @return set of cluster members | ||
15 | + */ | ||
16 | + Set<ControllerInstance> getInstances(); | ||
17 | + | ||
18 | + /** | ||
19 | + * Returns the availability state of the specified controller instance. | ||
20 | + * | ||
21 | + * @return availability state | ||
22 | + */ | ||
23 | + ControllerInstance.State getState(ControllerInstance instance); | ||
24 | + // TODO: determine if this would be better attached to ControllerInstance directly | ||
25 | + | ||
26 | + | ||
27 | + // addListener, removeListener | ||
28 | + | ||
29 | +} |
1 | +package org.onlab.onos.cluster; | ||
2 | + | ||
3 | +import org.onlab.packet.IpAddress; | ||
4 | + | ||
5 | +/** | ||
6 | + * Represents a controller instance as a member in a cluster. | ||
7 | + */ | ||
8 | +public interface ControllerInstance { | ||
9 | + | ||
10 | + /** Represents the operational state of the instance. */ | ||
11 | + public enum State { | ||
12 | + /** | ||
13 | + * Signifies that the instance is active and operating normally. | ||
14 | + */ | ||
15 | + ACTIVE, | ||
16 | + | ||
17 | + /** | ||
18 | + * Signifies that the instance is inactive, which means either down or | ||
19 | + * up, but not operational. | ||
20 | + */ | ||
21 | + INACTIVE | ||
22 | + } | ||
23 | + | ||
24 | + /** | ||
25 | + * Returns the instance identifier. | ||
26 | + * | ||
27 | + * @return instance identifier | ||
28 | + */ | ||
29 | + InstanceId id(); | ||
30 | + | ||
31 | + /** | ||
32 | + * Returns the IP address of the controller instance. | ||
33 | + * | ||
34 | + * @return IP address | ||
35 | + */ | ||
36 | + IpAddress ip(); | ||
37 | + | ||
38 | +} |
... | @@ -19,7 +19,7 @@ public class FlowRuleEvent extends AbstractEvent<FlowRuleEvent.Type, FlowRule> { | ... | @@ -19,7 +19,7 @@ public class FlowRuleEvent extends AbstractEvent<FlowRuleEvent.Type, FlowRule> { |
19 | /** | 19 | /** |
20 | * Signifies that a flow rule has been removed. | 20 | * Signifies that a flow rule has been removed. |
21 | */ | 21 | */ |
22 | - RULE_REMOVED, | 22 | + RULE_REMOVED |
23 | } | 23 | } |
24 | 24 | ||
25 | /** | 25 | /** | ... | ... |
... | @@ -23,6 +23,8 @@ public interface FlowRuleService { | ... | @@ -23,6 +23,8 @@ public interface FlowRuleService { |
23 | */ | 23 | */ |
24 | Iterable<FlowEntry> getFlowEntries(DeviceId deviceId); | 24 | Iterable<FlowEntry> getFlowEntries(DeviceId deviceId); |
25 | 25 | ||
26 | + // TODO: add createFlowRule factory method and execute operations method | ||
27 | + | ||
26 | /** | 28 | /** |
27 | * Applies the specified flow rules onto their respective devices. These | 29 | * Applies the specified flow rules onto their respective devices. These |
28 | * flow rules will be retained by the system and re-applied anytime the | 30 | * flow rules will be retained by the system and re-applied anytime the |
... | @@ -46,9 +48,6 @@ public interface FlowRuleService { | ... | @@ -46,9 +48,6 @@ public interface FlowRuleService { |
46 | void removeFlowRules(FlowRule... flowRules); | 48 | void removeFlowRules(FlowRule... flowRules); |
47 | 49 | ||
48 | 50 | ||
49 | - // void addInitialFlowContributor(InitialFlowContributor contributor); | ||
50 | - // void removeInitialFlowContributor(InitialFlowContributor contributor); | ||
51 | - | ||
52 | /** | 51 | /** |
53 | * Adds the specified flow rule listener. | 52 | * Adds the specified flow rule listener. |
54 | * | 53 | * | ... | ... |
... | @@ -7,6 +7,7 @@ | ... | @@ -7,6 +7,7 @@ |
7 | description="ONOS 3rd party dependencies"> | 7 | description="ONOS 3rd party dependencies"> |
8 | <bundle>mvn:commons-lang/commons-lang/2.6</bundle> | 8 | <bundle>mvn:commons-lang/commons-lang/2.6</bundle> |
9 | <bundle>mvn:com.google.guava/guava/18.0</bundle> | 9 | <bundle>mvn:com.google.guava/guava/18.0</bundle> |
10 | + <bundle>mvn:io.netty/netty/3.9.2.Final</bundle> | ||
10 | </feature> | 11 | </feature> |
11 | 12 | ||
12 | <feature name="onos-thirdparty-web" version="1.0.0" | 13 | <feature name="onos-thirdparty-web" version="1.0.0" |
... | @@ -18,6 +19,7 @@ | ... | @@ -18,6 +19,7 @@ |
18 | <bundle>mvn:com.sun.jersey/jersey-core/1.18.1</bundle> | 19 | <bundle>mvn:com.sun.jersey/jersey-core/1.18.1</bundle> |
19 | <bundle>mvn:com.sun.jersey/jersey-server/1.18.1</bundle> | 20 | <bundle>mvn:com.sun.jersey/jersey-server/1.18.1</bundle> |
20 | <bundle>mvn:com.sun.jersey/jersey-servlet/1.18.1</bundle> | 21 | <bundle>mvn:com.sun.jersey/jersey-servlet/1.18.1</bundle> |
22 | + | ||
21 | </feature> | 23 | </feature> |
22 | 24 | ||
23 | <feature name="onos-api" version="1.0.0" | 25 | <feature name="onos-api" version="1.0.0" |
... | @@ -61,7 +63,6 @@ | ... | @@ -61,7 +63,6 @@ |
61 | description="ONOS OpenFlow API, Controller & Providers"> | 63 | description="ONOS OpenFlow API, Controller & Providers"> |
62 | <feature>onos-api</feature> | 64 | <feature>onos-api</feature> |
63 | <bundle>mvn:io.netty/netty/3.9.2.Final</bundle> | 65 | <bundle>mvn:io.netty/netty/3.9.2.Final</bundle> |
64 | - | ||
65 | <bundle>mvn:org.onlab.onos/onos-of-api/1.0.0-SNAPSHOT</bundle> | 66 | <bundle>mvn:org.onlab.onos/onos-of-api/1.0.0-SNAPSHOT</bundle> |
66 | <bundle>mvn:org.onlab.onos/onos-of-ctl/1.0.0-SNAPSHOT</bundle> | 67 | <bundle>mvn:org.onlab.onos/onos-of-ctl/1.0.0-SNAPSHOT</bundle> |
67 | 68 | ||
... | @@ -75,8 +76,9 @@ | ... | @@ -75,8 +76,9 @@ |
75 | 76 | ||
76 | <feature name="onos-app-tvue" version="1.0.0" | 77 | <feature name="onos-app-tvue" version="1.0.0" |
77 | description="ONOS sample topology viewer application"> | 78 | description="ONOS sample topology viewer application"> |
78 | - <feature>onos-api</feature> | ||
79 | <feature>onos-thirdparty-web</feature> | 79 | <feature>onos-thirdparty-web</feature> |
80 | + <feature>onos-api</feature> | ||
81 | + <feature>onos-core</feature> | ||
80 | <bundle>mvn:org.onlab.onos/onos-app-tvue/1.0.0-SNAPSHOT</bundle> | 82 | <bundle>mvn:org.onlab.onos/onos-app-tvue/1.0.0-SNAPSHOT</bundle> |
81 | </feature> | 83 | </feature> |
82 | 84 | ... | ... |
... | @@ -78,6 +78,20 @@ public interface OpenFlowController { | ... | @@ -78,6 +78,20 @@ public interface OpenFlowController { |
78 | public void removePacketListener(PacketListener listener); | 78 | public void removePacketListener(PacketListener listener); |
79 | 79 | ||
80 | /** | 80 | /** |
81 | + * Register a listener for OF msg events. | ||
82 | + * | ||
83 | + * @param listener the listener to notify | ||
84 | + */ | ||
85 | + public void addEventListener(OpenFlowEventListener listener); | ||
86 | + | ||
87 | + /** | ||
88 | + * Unregister a listener. | ||
89 | + * | ||
90 | + * @param listener the listener to unregister | ||
91 | + */ | ||
92 | + public void removeEventListener(OpenFlowEventListener listener); | ||
93 | + | ||
94 | + /** | ||
81 | * Send a message to a particular switch. | 95 | * Send a message to a particular switch. |
82 | * @param dpid the switch to send to. | 96 | * @param dpid the switch to send to. |
83 | * @param msg the message to send | 97 | * @param msg the message to send | ... | ... |
1 | +package org.onlab.onos.openflow.controller; | ||
2 | + | ||
3 | +import org.projectfloodlight.openflow.protocol.OFMessage; | ||
4 | + | ||
5 | + | ||
6 | +/** | ||
7 | + * Notifies providers about openflow msg events. | ||
8 | + */ | ||
9 | +public interface OpenFlowEventListener { | ||
10 | + | ||
11 | + /** | ||
12 | + * Handles the message event. | ||
13 | + * | ||
14 | + * @param msg the message | ||
15 | + */ | ||
16 | + public void handleMessage(Dpid dpid, OFMessage msg); | ||
17 | +} |
... | @@ -63,4 +63,16 @@ public class OpenflowControllerAdapter implements OpenFlowController { | ... | @@ -63,4 +63,16 @@ public class OpenflowControllerAdapter implements OpenFlowController { |
63 | @Override | 63 | @Override |
64 | public void setRole(Dpid dpid, RoleState role) { | 64 | public void setRole(Dpid dpid, RoleState role) { |
65 | } | 65 | } |
66 | + | ||
67 | + @Override | ||
68 | + public void addEventListener(OpenFlowEventListener listener) { | ||
69 | + // TODO Auto-generated method stub | ||
70 | + | ||
71 | + } | ||
72 | + | ||
73 | + @Override | ||
74 | + public void removeEventListener(OpenFlowEventListener listener) { | ||
75 | + // TODO Auto-generated method stub | ||
76 | + | ||
77 | + } | ||
66 | } | 78 | } | ... | ... |
... | @@ -15,107 +15,27 @@ | ... | @@ -15,107 +15,27 @@ |
15 | 15 | ||
16 | <description>ONOS OpenFlow controller subsystem API</description> | 16 | <description>ONOS OpenFlow controller subsystem API</description> |
17 | 17 | ||
18 | - <properties> | ||
19 | - <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> | ||
20 | - <powermock.version>1.5.5</powermock.version> | ||
21 | - <restlet.version>2.1.4</restlet.version> | ||
22 | - <cobertura-maven-plugin.version>2.6</cobertura-maven-plugin.version> | ||
23 | - <!-- Following 2 findbugs version needs to be updated in sync to match the | ||
24 | - findbugs version used in findbugs-plugin --> | ||
25 | - <findbugs.version>3.0.0</findbugs.version> | ||
26 | - <findbugs-plugin.version>3.0.0</findbugs-plugin.version> | ||
27 | - <findbugs.effort>Max</findbugs.effort> | ||
28 | - <findbugs.excludeFilterFile>${project.basedir}/conf/findbugs/exclude.xml | ||
29 | - </findbugs.excludeFilterFile> | ||
30 | - <checkstyle-plugin.version>2.12</checkstyle-plugin.version> | ||
31 | - <!-- To publish javadoc to github, | ||
32 | - uncomment com.github.github site-maven-plugin and | ||
33 | - see https://github.com/OPENNETWORKINGLAB/ONOS/pull/425 | ||
34 | - <github.global.server>github</github.global.server> | ||
35 | - --> | ||
36 | - <metrics.version>3.0.2</metrics.version> | ||
37 | - <maven.surefire.plugin.version>2.16</maven.surefire.plugin.version> | ||
38 | - </properties> | ||
39 | - | ||
40 | <dependencies> | 18 | <dependencies> |
41 | <dependency> | 19 | <dependency> |
42 | <groupId>org.onlab.onos</groupId> | 20 | <groupId>org.onlab.onos</groupId> |
43 | <artifactId>onos-of-api</artifactId> | 21 | <artifactId>onos-of-api</artifactId> |
44 | </dependency> | 22 | </dependency> |
45 | - <!-- ONOS's direct dependencies --> | ||
46 | - <dependency> | ||
47 | - <groupId>org.apache.felix</groupId> | ||
48 | - <artifactId>org.apache.felix.scr.annotations</artifactId> | ||
49 | - <version>1.9.6</version> | ||
50 | - </dependency> | ||
51 | - <dependency> | ||
52 | - <groupId>ch.qos.logback</groupId> | ||
53 | - <artifactId>logback-classic</artifactId> | ||
54 | - <version>1.1.2</version> | ||
55 | - </dependency> | ||
56 | - <dependency> | ||
57 | - <groupId>ch.qos.logback</groupId> | ||
58 | - <artifactId>logback-core</artifactId> | ||
59 | - <version>1.1.2</version> | ||
60 | - </dependency> | ||
61 | - <dependency> | ||
62 | - <groupId>org.slf4j</groupId> | ||
63 | - <artifactId>slf4j-api</artifactId> | ||
64 | - <version>1.7.5</version> | ||
65 | - </dependency> | ||
66 | - <dependency> | ||
67 | - <!-- findbugs suppression annotation and @GuardedBy, etc. --> | ||
68 | - <groupId>com.google.code.findbugs</groupId> | ||
69 | - <artifactId>annotations</artifactId> | ||
70 | - <version>${findbugs.version}</version> | ||
71 | - </dependency> | ||
72 | <dependency> | 23 | <dependency> |
73 | - <groupId>org.projectfloodlight</groupId> | ||
74 | - <artifactId>openflowj</artifactId> | ||
75 | - <version>0.3.8-SNAPSHOT</version> | ||
76 | - </dependency> | ||
77 | - <!-- Floodlight's dependencies --> | ||
78 | - <dependency> | ||
79 | - <!-- dependency to old version of netty? --> | ||
80 | <groupId>io.netty</groupId> | 24 | <groupId>io.netty</groupId> |
81 | <artifactId>netty</artifactId> | 25 | <artifactId>netty</artifactId> |
82 | - <version>3.9.2.Final</version> | ||
83 | - </dependency> | ||
84 | - <!-- Dependency for libraries used for testing --> | ||
85 | - <dependency> | ||
86 | - <groupId>junit</groupId> | ||
87 | - <artifactId>junit</artifactId> | ||
88 | - <version>4.11</version> | ||
89 | - <scope>test</scope> | ||
90 | - </dependency> | ||
91 | - <dependency> | ||
92 | - <groupId>org.easymock</groupId> | ||
93 | - <artifactId>easymock</artifactId> | ||
94 | - <version>3.2</version> | ||
95 | - <scope>test</scope> | ||
96 | </dependency> | 26 | </dependency> |
97 | <dependency> | 27 | <dependency> |
98 | - <groupId>org.powermock</groupId> | 28 | + <groupId>org.apache.felix</groupId> |
99 | - <artifactId>powermock-module-junit4</artifactId> | 29 | + <artifactId>org.apache.felix.scr.annotations</artifactId> |
100 | - <version>${powermock.version}</version> | ||
101 | - <scope>test</scope> | ||
102 | - </dependency> | ||
103 | - <dependency> | ||
104 | - <groupId>org.powermock</groupId> | ||
105 | - <artifactId>powermock-api-easymock</artifactId> | ||
106 | - <version>${powermock.version}</version> | ||
107 | - <scope>test</scope> | ||
108 | </dependency> | 30 | </dependency> |
109 | </dependencies> | 31 | </dependencies> |
110 | 32 | ||
111 | - | ||
112 | <build> | 33 | <build> |
113 | <plugins> | 34 | <plugins> |
114 | <plugin> | 35 | <plugin> |
115 | <groupId>org.apache.felix</groupId> | 36 | <groupId>org.apache.felix</groupId> |
116 | <artifactId>maven-scr-plugin</artifactId> | 37 | <artifactId>maven-scr-plugin</artifactId> |
117 | </plugin> | 38 | </plugin> |
118 | - | ||
119 | </plugins> | 39 | </plugins> |
120 | </build> | 40 | </build> |
121 | 41 | ... | ... |
1 | package org.onlab.onos.openflow.controller.impl; | 1 | package org.onlab.onos.openflow.controller.impl; |
2 | 2 | ||
3 | +import static org.onlab.util.Tools.namedThreads; | ||
4 | + | ||
3 | import java.util.HashSet; | 5 | import java.util.HashSet; |
4 | import java.util.Set; | 6 | import java.util.Set; |
5 | import java.util.concurrent.ConcurrentHashMap; | 7 | import java.util.concurrent.ConcurrentHashMap; |
8 | +import java.util.concurrent.ExecutorService; | ||
9 | +import java.util.concurrent.Executors; | ||
6 | import java.util.concurrent.locks.Lock; | 10 | import java.util.concurrent.locks.Lock; |
7 | import java.util.concurrent.locks.ReentrantLock; | 11 | import java.util.concurrent.locks.ReentrantLock; |
8 | 12 | ||
... | @@ -13,6 +17,7 @@ import org.apache.felix.scr.annotations.Service; | ... | @@ -13,6 +17,7 @@ import org.apache.felix.scr.annotations.Service; |
13 | import org.onlab.onos.openflow.controller.DefaultOpenFlowPacketContext; | 17 | import org.onlab.onos.openflow.controller.DefaultOpenFlowPacketContext; |
14 | import org.onlab.onos.openflow.controller.Dpid; | 18 | import org.onlab.onos.openflow.controller.Dpid; |
15 | import org.onlab.onos.openflow.controller.OpenFlowController; | 19 | import org.onlab.onos.openflow.controller.OpenFlowController; |
20 | +import org.onlab.onos.openflow.controller.OpenFlowEventListener; | ||
16 | import org.onlab.onos.openflow.controller.OpenFlowPacketContext; | 21 | import org.onlab.onos.openflow.controller.OpenFlowPacketContext; |
17 | import org.onlab.onos.openflow.controller.OpenFlowSwitch; | 22 | import org.onlab.onos.openflow.controller.OpenFlowSwitch; |
18 | import org.onlab.onos.openflow.controller.OpenFlowSwitchListener; | 23 | import org.onlab.onos.openflow.controller.OpenFlowSwitchListener; |
... | @@ -27,6 +32,7 @@ import org.slf4j.LoggerFactory; | ... | @@ -27,6 +32,7 @@ import org.slf4j.LoggerFactory; |
27 | 32 | ||
28 | import com.google.common.collect.ArrayListMultimap; | 33 | import com.google.common.collect.ArrayListMultimap; |
29 | import com.google.common.collect.Multimap; | 34 | import com.google.common.collect.Multimap; |
35 | +import com.google.common.collect.Sets; | ||
30 | 36 | ||
31 | @Component(immediate = true) | 37 | @Component(immediate = true) |
32 | @Service | 38 | @Service |
... | @@ -35,6 +41,10 @@ public class OpenFlowControllerImpl implements OpenFlowController { | ... | @@ -35,6 +41,10 @@ public class OpenFlowControllerImpl implements OpenFlowController { |
35 | private static final Logger log = | 41 | private static final Logger log = |
36 | LoggerFactory.getLogger(OpenFlowControllerImpl.class); | 42 | LoggerFactory.getLogger(OpenFlowControllerImpl.class); |
37 | 43 | ||
44 | + private final ExecutorService executor = Executors.newFixedThreadPool(16, | ||
45 | + namedThreads("of-event-%d")); | ||
46 | + | ||
47 | + | ||
38 | protected ConcurrentHashMap<Dpid, OpenFlowSwitch> connectedSwitches = | 48 | protected ConcurrentHashMap<Dpid, OpenFlowSwitch> connectedSwitches = |
39 | new ConcurrentHashMap<Dpid, OpenFlowSwitch>(); | 49 | new ConcurrentHashMap<Dpid, OpenFlowSwitch>(); |
40 | protected ConcurrentHashMap<Dpid, OpenFlowSwitch> activeMasterSwitches = | 50 | protected ConcurrentHashMap<Dpid, OpenFlowSwitch> activeMasterSwitches = |
... | @@ -43,11 +53,12 @@ public class OpenFlowControllerImpl implements OpenFlowController { | ... | @@ -43,11 +53,12 @@ public class OpenFlowControllerImpl implements OpenFlowController { |
43 | new ConcurrentHashMap<Dpid, OpenFlowSwitch>(); | 53 | new ConcurrentHashMap<Dpid, OpenFlowSwitch>(); |
44 | 54 | ||
45 | protected OpenFlowSwitchAgent agent = new OpenFlowSwitchAgent(); | 55 | protected OpenFlowSwitchAgent agent = new OpenFlowSwitchAgent(); |
46 | - protected Set<OpenFlowSwitchListener> ofEventListener = new HashSet<>(); | 56 | + protected Set<OpenFlowSwitchListener> ofSwitchListener = new HashSet<>(); |
47 | 57 | ||
48 | protected Multimap<Integer, PacketListener> ofPacketListener = | 58 | protected Multimap<Integer, PacketListener> ofPacketListener = |
49 | ArrayListMultimap.create(); | 59 | ArrayListMultimap.create(); |
50 | 60 | ||
61 | + protected Set<OpenFlowEventListener> ofEventListener = Sets.newHashSet(); | ||
51 | 62 | ||
52 | private final Controller ctrl = new Controller(); | 63 | private final Controller ctrl = new Controller(); |
53 | 64 | ||
... | @@ -93,14 +104,14 @@ public class OpenFlowControllerImpl implements OpenFlowController { | ... | @@ -93,14 +104,14 @@ public class OpenFlowControllerImpl implements OpenFlowController { |
93 | 104 | ||
94 | @Override | 105 | @Override |
95 | public void addListener(OpenFlowSwitchListener listener) { | 106 | public void addListener(OpenFlowSwitchListener listener) { |
96 | - if (!ofEventListener.contains(listener)) { | 107 | + if (!ofSwitchListener.contains(listener)) { |
97 | - this.ofEventListener.add(listener); | 108 | + this.ofSwitchListener.add(listener); |
98 | } | 109 | } |
99 | } | 110 | } |
100 | 111 | ||
101 | @Override | 112 | @Override |
102 | public void removeListener(OpenFlowSwitchListener listener) { | 113 | public void removeListener(OpenFlowSwitchListener listener) { |
103 | - this.ofEventListener.remove(listener); | 114 | + this.ofSwitchListener.remove(listener); |
104 | } | 115 | } |
105 | 116 | ||
106 | @Override | 117 | @Override |
... | @@ -114,6 +125,16 @@ public class OpenFlowControllerImpl implements OpenFlowController { | ... | @@ -114,6 +125,16 @@ public class OpenFlowControllerImpl implements OpenFlowController { |
114 | } | 125 | } |
115 | 126 | ||
116 | @Override | 127 | @Override |
128 | + public void addEventListener(OpenFlowEventListener listener) { | ||
129 | + ofEventListener.add(listener); | ||
130 | + } | ||
131 | + | ||
132 | + @Override | ||
133 | + public void removeEventListener(OpenFlowEventListener listener) { | ||
134 | + ofEventListener.remove(listener); | ||
135 | + } | ||
136 | + | ||
137 | + @Override | ||
117 | public void write(Dpid dpid, OFMessage msg) { | 138 | public void write(Dpid dpid, OFMessage msg) { |
118 | this.getSwitch(dpid).sendMsg(msg); | 139 | this.getSwitch(dpid).sendMsg(msg); |
119 | } | 140 | } |
... | @@ -122,7 +143,7 @@ public class OpenFlowControllerImpl implements OpenFlowController { | ... | @@ -122,7 +143,7 @@ public class OpenFlowControllerImpl implements OpenFlowController { |
122 | public void processPacket(Dpid dpid, OFMessage msg) { | 143 | public void processPacket(Dpid dpid, OFMessage msg) { |
123 | switch (msg.getType()) { | 144 | switch (msg.getType()) { |
124 | case PORT_STATUS: | 145 | case PORT_STATUS: |
125 | - for (OpenFlowSwitchListener l : ofEventListener) { | 146 | + for (OpenFlowSwitchListener l : ofSwitchListener) { |
126 | l.portChanged(dpid, (OFPortStatus) msg); | 147 | l.portChanged(dpid, (OFPortStatus) msg); |
127 | } | 148 | } |
128 | break; | 149 | break; |
... | @@ -134,6 +155,12 @@ public class OpenFlowControllerImpl implements OpenFlowController { | ... | @@ -134,6 +155,12 @@ public class OpenFlowControllerImpl implements OpenFlowController { |
134 | p.handlePacket(pktCtx); | 155 | p.handlePacket(pktCtx); |
135 | } | 156 | } |
136 | break; | 157 | break; |
158 | + case FLOW_REMOVED: | ||
159 | + case ERROR: | ||
160 | + case STATS_REPLY: | ||
161 | + case BARRIER_REPLY: | ||
162 | + executor.submit(new OFMessageHandler(dpid, msg)); | ||
163 | + break; | ||
137 | default: | 164 | default: |
138 | log.warn("Handling message type {} not yet implemented {}", | 165 | log.warn("Handling message type {} not yet implemented {}", |
139 | msg.getType(), msg); | 166 | msg.getType(), msg); |
... | @@ -164,7 +191,7 @@ public class OpenFlowControllerImpl implements OpenFlowController { | ... | @@ -164,7 +191,7 @@ public class OpenFlowControllerImpl implements OpenFlowController { |
164 | } else { | 191 | } else { |
165 | log.error("Added switch {}", dpid); | 192 | log.error("Added switch {}", dpid); |
166 | connectedSwitches.put(dpid, sw); | 193 | connectedSwitches.put(dpid, sw); |
167 | - for (OpenFlowSwitchListener l : ofEventListener) { | 194 | + for (OpenFlowSwitchListener l : ofSwitchListener) { |
168 | l.switchAdded(dpid); | 195 | l.switchAdded(dpid); |
169 | } | 196 | } |
170 | return true; | 197 | return true; |
... | @@ -277,7 +304,7 @@ public class OpenFlowControllerImpl implements OpenFlowController { | ... | @@ -277,7 +304,7 @@ public class OpenFlowControllerImpl implements OpenFlowController { |
277 | if (sw == null) { | 304 | if (sw == null) { |
278 | sw = activeEqualSwitches.remove(dpid); | 305 | sw = activeEqualSwitches.remove(dpid); |
279 | } | 306 | } |
280 | - for (OpenFlowSwitchListener l : ofEventListener) { | 307 | + for (OpenFlowSwitchListener l : ofSwitchListener) { |
281 | l.switchRemoved(dpid); | 308 | l.switchRemoved(dpid); |
282 | } | 309 | } |
283 | } | 310 | } |
... | @@ -288,5 +315,23 @@ public class OpenFlowControllerImpl implements OpenFlowController { | ... | @@ -288,5 +315,23 @@ public class OpenFlowControllerImpl implements OpenFlowController { |
288 | } | 315 | } |
289 | } | 316 | } |
290 | 317 | ||
318 | + private final class OFMessageHandler implements Runnable { | ||
319 | + | ||
320 | + private final OFMessage msg; | ||
321 | + private final Dpid dpid; | ||
322 | + | ||
323 | + public OFMessageHandler(Dpid dpid, OFMessage msg) { | ||
324 | + this.msg = msg; | ||
325 | + this.dpid = dpid; | ||
326 | + } | ||
327 | + | ||
328 | + @Override | ||
329 | + public void run() { | ||
330 | + for (OpenFlowEventListener listener : ofEventListener) { | ||
331 | + listener.handleMessage(dpid, msg); | ||
332 | + } | ||
333 | + } | ||
334 | + | ||
335 | + } | ||
291 | 336 | ||
292 | } | 337 | } | ... | ... |
providers/openflow/flow/src/main/java/org/onlab/onos/provider/of/flow/impl/FlowModBuilder.java
0 → 100644
1 | +package org.onlab.onos.provider.of.flow.impl; | ||
2 | + | ||
3 | +import static org.slf4j.LoggerFactory.getLogger; | ||
4 | + | ||
5 | +import java.util.Collections; | ||
6 | +import java.util.LinkedList; | ||
7 | +import java.util.List; | ||
8 | + | ||
9 | +import org.onlab.onos.net.flow.FlowRule; | ||
10 | +import org.onlab.onos.net.flow.TrafficSelector; | ||
11 | +import org.onlab.onos.net.flow.TrafficTreatment; | ||
12 | +import org.onlab.onos.net.flow.criteria.Criteria.EthCriterion; | ||
13 | +import org.onlab.onos.net.flow.criteria.Criteria.EthTypeCriterion; | ||
14 | +import org.onlab.onos.net.flow.criteria.Criteria.IPCriterion; | ||
15 | +import org.onlab.onos.net.flow.criteria.Criteria.IPProtocolCriterion; | ||
16 | +import org.onlab.onos.net.flow.criteria.Criteria.PortCriterion; | ||
17 | +import org.onlab.onos.net.flow.criteria.Criteria.VlanIdCriterion; | ||
18 | +import org.onlab.onos.net.flow.criteria.Criteria.VlanPcpCriterion; | ||
19 | +import org.onlab.onos.net.flow.criteria.Criterion; | ||
20 | +import org.onlab.onos.net.flow.instructions.Instruction; | ||
21 | +import org.onlab.onos.net.flow.instructions.Instructions.OutputInstruction; | ||
22 | +import org.onlab.onos.net.flow.instructions.L2ModificationInstruction; | ||
23 | +import org.onlab.onos.net.flow.instructions.L2ModificationInstruction.ModEtherInstruction; | ||
24 | +import org.onlab.onos.net.flow.instructions.L2ModificationInstruction.ModVlanIdInstruction; | ||
25 | +import org.onlab.onos.net.flow.instructions.L2ModificationInstruction.ModVlanPcpInstruction; | ||
26 | +import org.onlab.onos.net.flow.instructions.L3ModificationInstruction; | ||
27 | +import org.onlab.onos.net.flow.instructions.L3ModificationInstruction.ModIPInstruction; | ||
28 | +import org.projectfloodlight.openflow.protocol.OFFactory; | ||
29 | +import org.projectfloodlight.openflow.protocol.OFFlowMod; | ||
30 | +import org.projectfloodlight.openflow.protocol.OFFlowModFlags; | ||
31 | +import org.projectfloodlight.openflow.protocol.action.OFAction; | ||
32 | +import org.projectfloodlight.openflow.protocol.match.Match; | ||
33 | +import org.projectfloodlight.openflow.protocol.match.MatchField; | ||
34 | +import org.projectfloodlight.openflow.types.EthType; | ||
35 | +import org.projectfloodlight.openflow.types.IPv4Address; | ||
36 | +import org.projectfloodlight.openflow.types.IpProtocol; | ||
37 | +import org.projectfloodlight.openflow.types.MacAddress; | ||
38 | +import org.projectfloodlight.openflow.types.Masked; | ||
39 | +import org.projectfloodlight.openflow.types.OFBufferId; | ||
40 | +import org.projectfloodlight.openflow.types.OFPort; | ||
41 | +import org.projectfloodlight.openflow.types.OFVlanVidMatch; | ||
42 | +import org.projectfloodlight.openflow.types.VlanPcp; | ||
43 | +import org.projectfloodlight.openflow.types.VlanVid; | ||
44 | +import org.slf4j.Logger; | ||
45 | + | ||
46 | + | ||
47 | +public class FlowModBuilder { | ||
48 | + | ||
49 | + private final Logger log = getLogger(getClass()); | ||
50 | + | ||
51 | + private final OFFactory factory; | ||
52 | + private final TrafficTreatment treatment; | ||
53 | + private final TrafficSelector selector; | ||
54 | + | ||
55 | + private final int priority; | ||
56 | + | ||
57 | + | ||
58 | + | ||
59 | + public FlowModBuilder(FlowRule flowRule, OFFactory factory) { | ||
60 | + this.factory = factory; | ||
61 | + this.treatment = flowRule.treatment(); | ||
62 | + this.selector = flowRule.selector(); | ||
63 | + this.priority = flowRule.priority(); | ||
64 | + } | ||
65 | + | ||
66 | + public OFFlowMod buildFlowMod() { | ||
67 | + Match match = buildMatch(); | ||
68 | + List<OFAction> actions = buildActions(); | ||
69 | + | ||
70 | + //TODO: what to do without bufferid? do we assume that there will be a pktout as well? | ||
71 | + OFFlowMod fm = factory.buildFlowModify() | ||
72 | + .setBufferId(OFBufferId.NO_BUFFER) | ||
73 | + .setActions(actions) | ||
74 | + .setMatch(match) | ||
75 | + .setFlags(Collections.singleton(OFFlowModFlags.SEND_FLOW_REM)) | ||
76 | + .setIdleTimeout(10) | ||
77 | + .setHardTimeout(10) | ||
78 | + .setPriority(priority) | ||
79 | + .build(); | ||
80 | + | ||
81 | + return fm; | ||
82 | + | ||
83 | + } | ||
84 | + | ||
85 | + private List<OFAction> buildActions() { | ||
86 | + List<OFAction> acts = new LinkedList<>(); | ||
87 | + for (Instruction i : treatment.instructions()) { | ||
88 | + switch (i.type()) { | ||
89 | + case DROP: | ||
90 | + log.warn("Saw drop action; assigning drop action"); | ||
91 | + return new LinkedList<>(); | ||
92 | + case L2MODIFICATION: | ||
93 | + acts.add(buildL2Modification(i)); | ||
94 | + case L3MODIFICATION: | ||
95 | + acts.add(buildL3Modification(i)); | ||
96 | + case OUTPUT: | ||
97 | + OutputInstruction out = (OutputInstruction) i; | ||
98 | + acts.add(factory.actions().buildOutput().setPort( | ||
99 | + OFPort.of((int) out.port().toLong())).build()); | ||
100 | + break; | ||
101 | + case GROUP: | ||
102 | + default: | ||
103 | + log.warn("Instruction type {} not yet implemented.", i.type()); | ||
104 | + } | ||
105 | + } | ||
106 | + | ||
107 | + return acts; | ||
108 | + } | ||
109 | + | ||
110 | + private OFAction buildL3Modification(Instruction i) { | ||
111 | + L3ModificationInstruction l3m = (L3ModificationInstruction) i; | ||
112 | + ModIPInstruction ip; | ||
113 | + switch (l3m.subtype()) { | ||
114 | + case L3_DST: | ||
115 | + ip = (ModIPInstruction) i; | ||
116 | + return factory.actions().setNwDst(IPv4Address.of(ip.ip().toInt())); | ||
117 | + case L3_SRC: | ||
118 | + ip = (ModIPInstruction) i; | ||
119 | + return factory.actions().setNwSrc(IPv4Address.of(ip.ip().toInt())); | ||
120 | + default: | ||
121 | + log.warn("Unimplemented action type {}.", l3m.subtype()); | ||
122 | + break; | ||
123 | + } | ||
124 | + return null; | ||
125 | + } | ||
126 | + | ||
127 | + private OFAction buildL2Modification(Instruction i) { | ||
128 | + L2ModificationInstruction l2m = (L2ModificationInstruction) i; | ||
129 | + ModEtherInstruction eth; | ||
130 | + switch (l2m.subtype()) { | ||
131 | + case L2_DST: | ||
132 | + eth = (ModEtherInstruction) l2m; | ||
133 | + return factory.actions().setDlDst(MacAddress.of(eth.mac().toLong())); | ||
134 | + case L2_SRC: | ||
135 | + eth = (ModEtherInstruction) l2m; | ||
136 | + return factory.actions().setDlSrc(MacAddress.of(eth.mac().toLong())); | ||
137 | + case VLAN_ID: | ||
138 | + ModVlanIdInstruction vlanId = (ModVlanIdInstruction) l2m; | ||
139 | + return factory.actions().setVlanVid(VlanVid.ofVlan(vlanId.vlanId.toShort())); | ||
140 | + case VLAN_PCP: | ||
141 | + ModVlanPcpInstruction vlanPcp = (ModVlanPcpInstruction) l2m; | ||
142 | + return factory.actions().setVlanPcp(VlanPcp.of(vlanPcp.vlanPcp())); | ||
143 | + default: | ||
144 | + log.warn("Unimplemented action type {}.", l2m.subtype()); | ||
145 | + break; | ||
146 | + } | ||
147 | + return null; | ||
148 | + } | ||
149 | + | ||
150 | + private Match buildMatch() { | ||
151 | + Match.Builder mBuilder = factory.buildMatch(); | ||
152 | + EthCriterion eth; | ||
153 | + IPCriterion ip; | ||
154 | + for (Criterion c : selector.criteria()) { | ||
155 | + switch (c.type()) { | ||
156 | + case IN_PORT: | ||
157 | + PortCriterion inport = (PortCriterion) c; | ||
158 | + mBuilder.setExact(MatchField.IN_PORT, OFPort.of((int) inport.port().toLong())); | ||
159 | + break; | ||
160 | + case ETH_SRC: | ||
161 | + eth = (EthCriterion) c; | ||
162 | + mBuilder.setExact(MatchField.ETH_SRC, MacAddress.of(eth.mac().toLong())); | ||
163 | + break; | ||
164 | + case ETH_DST: | ||
165 | + eth = (EthCriterion) c; | ||
166 | + mBuilder.setExact(MatchField.ETH_DST, MacAddress.of(eth.mac().toLong())); | ||
167 | + break; | ||
168 | + case ETH_TYPE: | ||
169 | + EthTypeCriterion ethType = (EthTypeCriterion) c; | ||
170 | + mBuilder.setExact(MatchField.ETH_TYPE, EthType.of(ethType.ethType())); | ||
171 | + break; | ||
172 | + case IPV4_DST: | ||
173 | + ip = (IPCriterion) c; | ||
174 | + if (ip.ip().isMasked()) { | ||
175 | + Masked<IPv4Address> maskedIp = Masked.of(IPv4Address.of(ip.ip().toInt()), | ||
176 | + IPv4Address.of(ip.ip().netmask().toInt())); | ||
177 | + mBuilder.setMasked(MatchField.IPV4_DST, maskedIp); | ||
178 | + } else { | ||
179 | + mBuilder.setExact(MatchField.IPV4_DST, IPv4Address.of(ip.ip().toInt())); | ||
180 | + } | ||
181 | + break; | ||
182 | + case IPV4_SRC: | ||
183 | + ip = (IPCriterion) c; | ||
184 | + if (ip.ip().isMasked()) { | ||
185 | + Masked<IPv4Address> maskedIp = Masked.of(IPv4Address.of(ip.ip().toInt()), | ||
186 | + IPv4Address.of(ip.ip().netmask().toInt())); | ||
187 | + mBuilder.setMasked(MatchField.IPV4_SRC, maskedIp); | ||
188 | + } else { | ||
189 | + mBuilder.setExact(MatchField.IPV4_SRC, IPv4Address.of(ip.ip().toInt())); | ||
190 | + } | ||
191 | + break; | ||
192 | + case IP_PROTO: | ||
193 | + IPProtocolCriterion p = (IPProtocolCriterion) c; | ||
194 | + mBuilder.setExact(MatchField.IP_PROTO, IpProtocol.of(p.protocol())); | ||
195 | + break; | ||
196 | + case VLAN_PCP: | ||
197 | + VlanPcpCriterion vpcp = (VlanPcpCriterion) c; | ||
198 | + mBuilder.setExact(MatchField.VLAN_PCP, VlanPcp.of(vpcp.priority())); | ||
199 | + break; | ||
200 | + case VLAN_VID: | ||
201 | + VlanIdCriterion vid = (VlanIdCriterion) c; | ||
202 | + mBuilder.setExact(MatchField.VLAN_VID, | ||
203 | + OFVlanVidMatch.ofVlanVid(VlanVid.ofVlan(vid.vlanId().toShort()))); | ||
204 | + break; | ||
205 | + case ARP_OP: | ||
206 | + case ARP_SHA: | ||
207 | + case ARP_SPA: | ||
208 | + case ARP_THA: | ||
209 | + case ARP_TPA: | ||
210 | + case ICMPV4_CODE: | ||
211 | + case ICMPV4_TYPE: | ||
212 | + case ICMPV6_CODE: | ||
213 | + case ICMPV6_TYPE: | ||
214 | + case IN_PHY_PORT: | ||
215 | + case IPV6_DST: | ||
216 | + case IPV6_EXTHDR: | ||
217 | + case IPV6_FLABEL: | ||
218 | + case IPV6_ND_SLL: | ||
219 | + case IPV6_ND_TARGET: | ||
220 | + case IPV6_ND_TLL: | ||
221 | + case IPV6_SRC: | ||
222 | + case IP_DSCP: | ||
223 | + case IP_ECN: | ||
224 | + case METADATA: | ||
225 | + case MPLS_BOS: | ||
226 | + case MPLS_LABEL: | ||
227 | + case MPLS_TC: | ||
228 | + case PBB_ISID: | ||
229 | + case SCTP_DST: | ||
230 | + case SCTP_SRC: | ||
231 | + case TCP_DST: | ||
232 | + case TCP_SRC: | ||
233 | + case TUNNEL_ID: | ||
234 | + case UDP_DST: | ||
235 | + case UDP_SRC: | ||
236 | + default: | ||
237 | + log.warn("Match type {} not yet implemented.", c.type()); | ||
238 | + } | ||
239 | + } | ||
240 | + return mBuilder.build(); | ||
241 | + } | ||
242 | + | ||
243 | +} |
providers/openflow/flow/src/main/java/org/onlab/onos/provider/of/flow/impl/FlowStatsCollector.java
0 → 100644
1 | +package org.onlab.onos.provider.of.flow.impl; | ||
2 | + | ||
3 | +import static org.slf4j.LoggerFactory.getLogger; | ||
4 | + | ||
5 | +import java.util.concurrent.TimeUnit; | ||
6 | + | ||
7 | +import org.jboss.netty.util.HashedWheelTimer; | ||
8 | +import org.jboss.netty.util.Timeout; | ||
9 | +import org.jboss.netty.util.TimerTask; | ||
10 | +import org.onlab.onos.openflow.controller.OpenFlowSwitch; | ||
11 | +import org.onlab.util.Timer; | ||
12 | +import org.projectfloodlight.openflow.protocol.OFFlowStatsRequest; | ||
13 | +import org.projectfloodlight.openflow.types.OFPort; | ||
14 | +import org.projectfloodlight.openflow.types.TableId; | ||
15 | +import org.slf4j.Logger; | ||
16 | + | ||
17 | +public class FlowStatsCollector implements TimerTask { | ||
18 | + | ||
19 | + private final Logger log = getLogger(getClass()); | ||
20 | + | ||
21 | + private final HashedWheelTimer timer = Timer.getTimer(); | ||
22 | + private final OpenFlowSwitch sw; | ||
23 | + private final int refreshInterval; | ||
24 | + | ||
25 | + private Timeout timeout; | ||
26 | + | ||
27 | + private boolean stopTimer = false;; | ||
28 | + | ||
29 | + public FlowStatsCollector(OpenFlowSwitch sw, int refreshInterval) { | ||
30 | + this.sw = sw; | ||
31 | + this.refreshInterval = refreshInterval; | ||
32 | + } | ||
33 | + | ||
34 | + @Override | ||
35 | + public void run(Timeout timeout) throws Exception { | ||
36 | + log.debug("Collecting stats for {}", this.sw.getStringId()); | ||
37 | + | ||
38 | + sendFlowStatistics(); | ||
39 | + | ||
40 | + if (!this.stopTimer) { | ||
41 | + log.debug("Scheduling stats collection in {} seconds for {}", | ||
42 | + this.refreshInterval, this.sw.getStringId()); | ||
43 | + timeout.getTimer().newTimeout(this, refreshInterval, | ||
44 | + TimeUnit.SECONDS); | ||
45 | + } | ||
46 | + | ||
47 | + | ||
48 | + } | ||
49 | + | ||
50 | + private void sendFlowStatistics() { | ||
51 | + OFFlowStatsRequest request = sw.factory().buildFlowStatsRequest() | ||
52 | + .setMatch(sw.factory().matchWildcardAll()) | ||
53 | + .setTableId(TableId.ALL) | ||
54 | + .setOutPort(OFPort.NO_MASK) | ||
55 | + .build(); | ||
56 | + | ||
57 | + this.sw.sendMsg(request); | ||
58 | + | ||
59 | + } | ||
60 | + | ||
61 | + public void start() { | ||
62 | + | ||
63 | + /* | ||
64 | + * Initially start polling quickly. Then drop down to configured value | ||
65 | + */ | ||
66 | + log.info("Starting Stats collection thread for {}", | ||
67 | + this.sw.getStringId()); | ||
68 | + timeout = timer.newTimeout(this, 1, TimeUnit.SECONDS); | ||
69 | + } | ||
70 | + | ||
71 | + public void stop() { | ||
72 | + log.info("Stopping Stats collection thread for {}", | ||
73 | + this.sw.getStringId()); | ||
74 | + this.stopTimer = true; | ||
75 | + timeout.cancel(); | ||
76 | + } | ||
77 | + | ||
78 | +} |
providers/openflow/flow/src/main/java/org/onlab/onos/provider/of/flow/impl/OpenFlowRuleProvider.java
This diff is collapsed. Click to expand it.
... | @@ -46,7 +46,7 @@ public class OpenFlowCorePacketContext extends DefaultPacketContext { | ... | @@ -46,7 +46,7 @@ public class OpenFlowCorePacketContext extends DefaultPacketContext { |
46 | private void sendBufferedPacket() { | 46 | private void sendBufferedPacket() { |
47 | List<Instruction> ins = treatmentBuilder().build().instructions(); | 47 | List<Instruction> ins = treatmentBuilder().build().instructions(); |
48 | OFPort p = null; | 48 | OFPort p = null; |
49 | - //TODO: support arbitrary list of treatments | 49 | + //TODO: support arbitrary list of treatments must be supported in ofPacketContext |
50 | for (Instruction i : ins) { | 50 | for (Instruction i : ins) { |
51 | if (i.type() == Type.OUTPUT) { | 51 | if (i.type() == Type.OUTPUT) { |
52 | p = buildPort(((OutputInstruction) i).port()); | 52 | p = buildPort(((OutputInstruction) i).port()); | ... | ... |
tools/build/envDefaults
0 → 100644
1 | +# Environmental defaults for ONOS build, package and test | ||
2 | + | ||
3 | +# Root of the ONOS source tree | ||
4 | +export ONOS_ROOT=${ONOS_ROOT:-~/onos-next} | ||
5 | + | ||
6 | +# M2 repository and Karaf gold bits | ||
7 | +export M2_REPO=${M2_REPO:-~/.m2/repository} | ||
8 | +export KARAF_ZIP=${KARAF_ZIP:-~/Downloads/apache-karaf-3.0.1.zip} | ||
9 | +export KARAF_DIST=$(basename $KARAF_ZIP .zip) | ||
10 | + | ||
11 | +# ONOS Version and onos.tar.gz staging environment | ||
12 | +export ONOS_VERSION=${ONOS_VERSION:-1.0.0-SNAPSHOT} | ||
13 | +export ONOS_STAGE_ROOT=${ONOS_STAGE_ROOT:-/tmp} | ||
14 | +export ONOS_BITS=onos-$ONOS_VERSION | ||
15 | +export ONOS_STAGE=$ONOS_STAGE_ROOT/$ONOS_BITS | ||
16 | +export ONOS_TAR=$ONOS_STAGE.tar.gz | ||
17 | + | ||
18 | +# Defaults for ONOS testing using remote machines. | ||
19 | +export ONOS_INSTALL_DIR="/opt/onos" # Installation directory on remote | ||
20 | +export OCI="${OCI:-192.168.56.101}" # ONOS Controller Instance | ||
21 | +export ONOS_USER="sdn" # ONOS user on remote system | ||
22 | +export ONOS_PWD="rocks" # ONOS user password on remote system |
... | @@ -3,14 +3,8 @@ | ... | @@ -3,14 +3,8 @@ |
3 | # Packages ONOS distributable into onos.tar.gz | 3 | # Packages ONOS distributable into onos.tar.gz |
4 | #------------------------------------------------------------------------------- | 4 | #------------------------------------------------------------------------------- |
5 | 5 | ||
6 | -export M2_REPO=${M2_REPO:-~/.m2/repository} | 6 | +[ ! -d "$ONOS_ROOT" ] && echo "ONOS_ROOT is not defined" >&2 && exit 1 |
7 | -export KARAF_ZIP=${KARAF_ZIP:-~/Downloads/apache-karaf-3.0.1.zip} | 7 | +. $ONOS_ROOT/tools/build/envDefaults |
8 | -export KARAF_DIST=$(basename $KARAF_ZIP .zip) | ||
9 | - | ||
10 | -export ONOS_VERSION=${ONOS_VERSION:-1.0.0-SNAPSHOT} | ||
11 | -export ONOS_STAGE_ROOT=${ONOS_STAGE_ROOT:-/tmp} | ||
12 | -export ONOS_BITS=onos-$ONOS_VERSION | ||
13 | -export ONOS_STAGE=$ONOS_STAGE_ROOT/$ONOS_BITS | ||
14 | 8 | ||
15 | # Bail on any errors | 9 | # Bail on any errors |
16 | set -e | 10 | set -e |
... | @@ -26,29 +20,31 @@ rm -fr $ONOS_STAGE # Remove this when package script is completed | ... | @@ -26,29 +20,31 @@ rm -fr $ONOS_STAGE # Remove this when package script is completed |
26 | mkdir -p $ONOS_STAGE | 20 | mkdir -p $ONOS_STAGE |
27 | cd $ONOS_STAGE | 21 | cd $ONOS_STAGE |
28 | 22 | ||
29 | -# Unroll the Apache Karaf bits and make the ONOS top-level directories. | 23 | +# Unroll the Apache Karaf bits, prune them and make ONOS top-level directories. |
30 | -unzip $KARAF_ZIP | 24 | +unzip -q $KARAF_ZIP && rm -rf $KARAF_DIST/demos |
31 | mkdir bin | 25 | mkdir bin |
32 | 26 | ||
33 | -# Stage the ONOS admin scripts | 27 | +# Stage the ONOS admin scripts and patch in Karaf service wrapper extras |
34 | cp -r $ONOS_ROOT/tools/package/bin . | 28 | cp -r $ONOS_ROOT/tools/package/bin . |
29 | +cp -r $ONOS_ROOT/tools/package/wrapper/* $KARAF_DIST | ||
35 | 30 | ||
36 | # Stage the ONOS bundles | 31 | # Stage the ONOS bundles |
37 | -mkdir -p system/org/onlab | 32 | +mkdir -p $KARAF_DIST/system/org/onlab |
38 | -cp -r $M2_REPO/org/onlab system/org/ | 33 | +cp -r $M2_REPO/org/onlab $KARAF_DIST/system/org/ |
39 | 34 | ||
40 | # Patch the Apache Karaf distribution file to add ONOS features repository | 35 | # Patch the Apache Karaf distribution file to add ONOS features repository |
41 | perl -pi.old -e "s|^(featuresRepositories=.*)|\1,mvn:org.onlab.onos/onos-features/$ONOS_VERSION/xml/features|" \ | 36 | perl -pi.old -e "s|^(featuresRepositories=.*)|\1,mvn:org.onlab.onos/onos-features/$ONOS_VERSION/xml/features|" \ |
42 | $ONOS_STAGE/$KARAF_DIST/etc/org.apache.karaf.features.cfg | 37 | $ONOS_STAGE/$KARAF_DIST/etc/org.apache.karaf.features.cfg |
43 | 38 | ||
44 | # Patch the Apache Karaf distribution file to load ONOS features | 39 | # Patch the Apache Karaf distribution file to load ONOS features |
45 | -perl -pi.old -e 's|^(featuresBoot=.*)|\1,onos-api,onos-core,onos-cli,onos-rest,onos-gui,onos-openflow,onos-app-tvue|' \ | 40 | +perl -pi.old -e 's|^(featuresBoot=.*)|\1,wrapper,onos-api,onos-core,onos-cli,onos-rest,onos-gui,onos-openflow,onos-app-tvue|' \ |
46 | - /tmp/onos-1.0.0-SNAPSHOT/apache-karaf-3.0.1/etc/org.apache.karaf.features.cfg | 41 | + $ONOS_STAGE/$KARAF_DIST/etc/org.apache.karaf.features.cfg |
47 | 42 | ||
48 | # Patch the Apache Karaf distribution with ONOS branding bundle | 43 | # Patch the Apache Karaf distribution with ONOS branding bundle |
49 | cp $M2_REPO/org/onlab/onos/onos-branding/$ONOS_VERSION/onos-branding-*.jar \ | 44 | cp $M2_REPO/org/onlab/onos/onos-branding/$ONOS_VERSION/onos-branding-*.jar \ |
50 | - $ONOS_STAGE/apache-karaf-*/lib | 45 | + $ONOS_STAGE/$KARAF_DIST/lib |
51 | 46 | ||
52 | # Now package up the ONOS tar file | 47 | # Now package up the ONOS tar file |
53 | cd $ONOS_STAGE_ROOT | 48 | cd $ONOS_STAGE_ROOT |
54 | -tar zcf $ONOS_BITS.tar.gz $ONOS_BITS | 49 | +COPYFILE_DISABLE=1 tar zcf $ONOS_TAR $ONOS_BITS |
50 | +ls -l $ONOS_TAR >&2 | ... | ... |
... | @@ -12,7 +12,8 @@ export KARAF_LOG=$KARAF/data/log/karaf.log | ... | @@ -12,7 +12,8 @@ export KARAF_LOG=$KARAF/data/log/karaf.log |
12 | 12 | ||
13 | # Setup a path | 13 | # Setup a path |
14 | export PS=":" | 14 | export PS=":" |
15 | -export PATH="$PATH:$ONOS_ROOT/tools/dev:$ONOS_ROOT/tools/package" | 15 | +export PATH="$PATH:$ONOS_ROOT/tools/dev:$ONOS_ROOT/tools/build" |
16 | +export PATH="$PATH:$ONOS_ROOT/tools/test/bin" | ||
16 | export PATH="$PATH:$MAVEN/bin:$KARAF/bin" | 17 | export PATH="$PATH:$MAVEN/bin:$KARAF/bin" |
17 | export PATH="$PATH:." | 18 | export PATH="$PATH:." |
18 | 19 | ||
... | @@ -39,3 +40,13 @@ alias pp='python -m json.tool' | ... | @@ -39,3 +40,13 @@ alias pp='python -m json.tool' |
39 | # Short-hand to launch API docs and sample topology viewer GUI | 40 | # Short-hand to launch API docs and sample topology viewer GUI |
40 | alias docs='open $ONOS_ROOT/target/site/apidocs/index.html' | 41 | alias docs='open $ONOS_ROOT/target/site/apidocs/index.html' |
41 | alias gui='open http://localhost:8181/onos/tvue' | 42 | alias gui='open http://localhost:8181/onos/tvue' |
43 | + | ||
44 | + | ||
45 | +# Miscellaneous | ||
46 | +function spy { | ||
47 | + ps -ef | egrep "$@" | grep -v egrep | ||
48 | +} | ||
49 | + | ||
50 | +function nuke { | ||
51 | + spy | cut -c7-11 | xargs kill | ||
52 | +} | ... | ... |
tools/package/README
0 → 100644
1 | +Artifacts for packaging onos.tar.gz. |
tools/package/bin/onos
0 → 100755
1 | +#!/bin/bash | ||
2 | +#------------------------------------------------------------------------------- | ||
3 | +# ONOS command-line client | ||
4 | +#------------------------------------------------------------------------------- | ||
5 | + | ||
6 | +export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64/ | ||
7 | + | ||
8 | +cd $(dirname $0)/../apache-karaf-*/bin | ||
9 | +./client -h localhost "$@" | ||
10 | + |
... | @@ -3,6 +3,8 @@ | ... | @@ -3,6 +3,8 @@ |
3 | # Starts ONOS Apache Karaf container | 3 | # Starts ONOS Apache Karaf container |
4 | #------------------------------------------------------------------------------- | 4 | #------------------------------------------------------------------------------- |
5 | 5 | ||
6 | +export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64/ | ||
7 | + | ||
6 | cd $(dirname $0)/../apache-karaf-*/bin | 8 | cd $(dirname $0)/../apache-karaf-*/bin |
7 | ./karaf "$@" | 9 | ./karaf "$@" |
8 | 10 | ... | ... |
tools/package/wrapper/bin/onos-service
0 → 100755
This diff is collapsed. Click to expand it.
tools/package/wrapper/bin/onos-wrapper
0 → 100755
No preview for this file type
tools/package/wrapper/etc/onos-wrapper.conf
0 → 100644
1 | +# ------------------------------------------------------------------------ | ||
2 | +# Licensed to the Apache Software Foundation (ASF) under one or more | ||
3 | +# contributor license agreements. See the NOTICE file distributed with | ||
4 | +# this work for additional information regarding copyright ownership. | ||
5 | +# The ASF licenses this file to You under the Apache License, Version 2.0 | ||
6 | +# (the "License"); you may not use this file except in compliance with | ||
7 | +# the License. You may obtain a copy of the License at | ||
8 | +# | ||
9 | +# http://www.apache.org/licenses/LICENSE-2.0 | ||
10 | +# | ||
11 | +# Unless required by applicable law or agreed to in writing, software | ||
12 | +# distributed under the License is distributed on an "AS IS" BASIS, | ||
13 | +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
14 | +# See the License for the specific language governing permissions and | ||
15 | +# limitations under the License. | ||
16 | +# ------------------------------------------------------------------------ | ||
17 | + | ||
18 | +#******************************************************************** | ||
19 | +# Wrapper Properties | ||
20 | +#******************************************************************** | ||
21 | +set.default.JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64/ | ||
22 | +set.default.KARAF_HOME=/opt/onos/apache-karaf-3.0.1 | ||
23 | +set.default.KARAF_BASE=/opt/onos/apache-karaf-3.0.1 | ||
24 | +set.default.KARAF_DATA=/opt/onos/apache-karaf-3.0.1/data | ||
25 | +set.default.KARAF_ETC=/opt/onos/apache-karaf-3.0.1/etc | ||
26 | + | ||
27 | +# Java Application | ||
28 | +wrapper.working.dir=%KARAF_BASE% | ||
29 | +wrapper.java.command=%JAVA_HOME%/bin/java | ||
30 | +wrapper.java.mainclass=org.apache.karaf.wrapper.internal.Main | ||
31 | +wrapper.java.classpath.1=%KARAF_HOME%/lib/karaf-wrapper.jar | ||
32 | +wrapper.java.classpath.2=%KARAF_HOME%/lib/karaf.jar | ||
33 | +wrapper.java.classpath.3=%KARAF_HOME%/lib/karaf-jmx-boot.jar | ||
34 | +wrapper.java.classpath.4=%KARAF_HOME%/lib/karaf-jaas-boot.jar | ||
35 | +wrapper.java.classpath.5=%KARAF_HOME%/lib/karaf-wrapper-main.jar | ||
36 | +wrapper.java.classpath.6=%KARAF_HOME%/lib/karaf-org.osgi.core.jar | ||
37 | +wrapper.java.library.path.1=%KARAF_HOME%/lib/ | ||
38 | + | ||
39 | +# Application Parameters. Add parameters as needed starting from 1 | ||
40 | +#wrapper.app.parameter.1= | ||
41 | + | ||
42 | +# JVM Parameters | ||
43 | +# note that n is the parameter number starting from 1. | ||
44 | +wrapper.java.additional.1=-Dkaraf.home=%KARAF_HOME% | ||
45 | +wrapper.java.additional.2=-Dkaraf.base=%KARAF_BASE% | ||
46 | +wrapper.java.additional.3=-Dkaraf.data=%KARAF_DATA% | ||
47 | +wrapper.java.additional.4=-Dkaraf.etc=%KARAF_ETC% | ||
48 | +wrapper.java.additional.5=-Dcom.sun.management.jmxremote | ||
49 | +wrapper.java.additional.6=-Djavax.management.builder.initial=org.apache.karaf.management.boot.KarafMBeanServerBuilder | ||
50 | +wrapper.java.additional.7=-Dkaraf.startLocalConsole=false | ||
51 | +wrapper.java.additional.8=-Dkaraf.startRemoteShell=true | ||
52 | +wrapper.java.additional.9=-Djava.endorsed.dirs=%JAVA_HOME%/jre/lib/endorsed:%JAVA_HOME%/lib/endorsed:%KARAF_HOME%/lib/endorsed | ||
53 | +wrapper.java.additional.10=-Djava.ext.dirs=%JAVA_HOME%/jre/lib/ext:%JAVA_HOME%/lib/ext:%KARAF_HOME%/lib/ext | ||
54 | + | ||
55 | +# Uncomment to enable jmx | ||
56 | +#wrapper.java.additional.n=-Dcom.sun.management.jmxremote.port=1616 | ||
57 | +#wrapper.java.additional.n=-Dcom.sun.management.jmxremote.authenticate=false | ||
58 | +#wrapper.java.additional.n=-Dcom.sun.management.jmxremote.ssl=false | ||
59 | + | ||
60 | +# Uncomment to enable YourKit profiling | ||
61 | +#wrapper.java.additional.n=-Xrunyjpagent | ||
62 | + | ||
63 | +# Uncomment to enable remote debugging | ||
64 | +#wrapper.java.additional.n=-Xdebug -Xnoagent -Djava.compiler=NONE | ||
65 | +#wrapper.java.additional.n=-Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005 | ||
66 | + | ||
67 | +# Initial Java Heap Size (in MB) | ||
68 | +#wrapper.java.initmemory=3 | ||
69 | + | ||
70 | +# Maximum Java Heap Size (in MB) | ||
71 | +wrapper.java.maxmemory=512 | ||
72 | + | ||
73 | + | ||
74 | +#******************************************************************** | ||
75 | +# Wrapper Logging Properties | ||
76 | +#******************************************************************** | ||
77 | +# Format of output for the console. (See docs for formats) | ||
78 | +wrapper.console.format=PM | ||
79 | + | ||
80 | +# Log Level for console output. (See docs for log levels) | ||
81 | +wrapper.console.loglevel=INFO | ||
82 | + | ||
83 | +# Log file to use for wrapper output logging. | ||
84 | +wrapper.logfile=%KARAF_DATA%/log/wrapper.log | ||
85 | + | ||
86 | +# Format of output for the log file. (See docs for formats) | ||
87 | +wrapper.logfile.format=LPTM | ||
88 | + | ||
89 | +# Log Level for log file output. (See docs for log levels) | ||
90 | +wrapper.logfile.loglevel=INFO | ||
91 | + | ||
92 | +# Maximum size that the log file will be allowed to grow to before | ||
93 | +# the log is rolled. Size is specified in bytes. The default value | ||
94 | +# of 0, disables log rolling. May abbreviate with the 'k' (kb) or | ||
95 | +# 'm' (mb) suffix. For example: 10m = 10 megabytes. | ||
96 | +wrapper.logfile.maxsize=10m | ||
97 | + | ||
98 | +# Maximum number of rolled log files which will be allowed before old | ||
99 | +# files are deleted. The default value of 0 implies no limit. | ||
100 | +wrapper.logfile.maxfiles=5 | ||
101 | + | ||
102 | +# Log Level for sys/event log output. (See docs for log levels) | ||
103 | +wrapper.syslog.loglevel=NONE | ||
104 | + | ||
105 | +#******************************************************************** | ||
106 | +# Wrapper Windows Properties | ||
107 | +#******************************************************************** | ||
108 | +# Title to use when running as a console | ||
109 | +wrapper.console.title=onos | ||
110 | + | ||
111 | +#******************************************************************** | ||
112 | +# Wrapper Windows NT/2000/XP Service Properties | ||
113 | +#******************************************************************** | ||
114 | +# WARNING - Do not modify any of these properties when an application | ||
115 | +# using this configuration file has been installed as a service. | ||
116 | +# Please uninstall the service before modifying this section. The | ||
117 | +# service can then be reinstalled. | ||
118 | + | ||
119 | +# Name of the service | ||
120 | +wrapper.ntservice.name=onos | ||
121 | + | ||
122 | +# Display name of the service | ||
123 | +wrapper.ntservice.displayname=onos | ||
124 | + | ||
125 | +# Description of the service | ||
126 | +wrapper.ntservice.description=ONOS | ||
127 | + | ||
128 | +# Service dependencies. Add dependencies as needed starting from 1 | ||
129 | +wrapper.ntservice.dependency.1= | ||
130 | + | ||
131 | +# Mode in which the service is installed. AUTO_START or DEMAND_START | ||
132 | +wrapper.ntservice.starttype=AUTO_START | ||
133 | + | ||
134 | +# Allow the service to interact with the desktop. | ||
135 | +wrapper.ntservice.interactive=false |
tools/package/wrapper/lib/karaf-wrapper.jar
0 → 100644
No preview for this file type
tools/package/wrapper/lib/libwrapper.so
0 → 100644
No preview for this file type
tools/test/README
0 → 100644
1 | +Artifacts for system testing onos. |
tools/test/bin/onos-install
0 → 100755
1 | +#!/bin/bash | ||
2 | +#------------------------------------------------------------------------------- | ||
3 | +# Remotely pushes bits to a remote machine and install & starts ONOS. | ||
4 | +#------------------------------------------------------------------------------- | ||
5 | + | ||
6 | +[ ! -d "$ONOS_ROOT" ] && echo "ONOS_ROOT is not defined" >&2 && exit 1 | ||
7 | +. $ONOS_ROOT/tools/build/envDefaults | ||
8 | + | ||
9 | +# If the first option is -f attempt uninstall first. | ||
10 | +[ "$1" = "-f" ] && shift && onos-uninstall ${1:-$OCI} | ||
11 | + | ||
12 | +remote=$ONOS_USER@${1:-$OCI} | ||
13 | + | ||
14 | +scp -q $ONOS_TAR $remote:/tmp | ||
15 | + | ||
16 | +ssh $remote " | ||
17 | + [ -d $ONOS_INSTALL_DIR/bin ] && echo \"ONOS is already installed\" && exit 1 | ||
18 | + | ||
19 | + sudo mkdir -p $ONOS_INSTALL_DIR && sudo chown sdn:sdn $ONOS_INSTALL_DIR | ||
20 | + tar zxmf /tmp/$ONOS_BITS.tar.gz -C $ONOS_INSTALL_DIR --strip-components=1 | ||
21 | + | ||
22 | + ln -s /opt/onos/$KARAF_DIST/data/log /opt/onos/log | ||
23 | + | ||
24 | +" |
tools/test/bin/onos-uninstall
0 → 100755
1 | +#!/bin/bash | ||
2 | +#------------------------------------------------------------------------------- | ||
3 | +# Remotely stops & uninstalls ONOS. | ||
4 | +#------------------------------------------------------------------------------- | ||
5 | + | ||
6 | +[ ! -d "$ONOS_ROOT" ] && echo "ONOS_ROOT is not defined" >&2 && exit 1 | ||
7 | +. $ONOS_ROOT/tools/build/envDefaults | ||
8 | + | ||
9 | +remote=$ONOS_USER@${1:-$OCI} | ||
10 | + | ||
11 | +ssh $remote " | ||
12 | + [ -f $ONOS_INSTALL_DIR/bin/onos ] && \ | ||
13 | + $ONOS_INSTALL_DIR/bin/onos halt 2>/dev/null | ||
14 | + sudo rm -fr $ONOS_INSTALL_DIR | ||
15 | +" |
... | @@ -122,7 +122,7 @@ public final class IpAddress { | ... | @@ -122,7 +122,7 @@ public final class IpAddress { |
122 | if (mask > MAX_INET_MASK) { | 122 | if (mask > MAX_INET_MASK) { |
123 | throw new IllegalArgumentException( | 123 | throw new IllegalArgumentException( |
124 | "Value of subnet mask cannot exceed " | 124 | "Value of subnet mask cannot exceed " |
125 | - + MAX_INET_MASK); | 125 | + + MAX_INET_MASK); |
126 | } | 126 | } |
127 | } | 127 | } |
128 | 128 | ||
... | @@ -204,7 +204,7 @@ public final class IpAddress { | ... | @@ -204,7 +204,7 @@ public final class IpAddress { |
204 | byte [] net = new byte [4]; | 204 | byte [] net = new byte [4]; |
205 | byte [] mask = bytes(mask()); | 205 | byte [] mask = bytes(mask()); |
206 | for (int i = 0; i < INET_LEN; i++) { | 206 | for (int i = 0; i < INET_LEN; i++) { |
207 | - net[i] = (byte) (octets[i] & mask[i]); | 207 | + net[i] = (byte) (octets[i] & mask[i]); |
208 | } | 208 | } |
209 | return new IpAddress(version, net, netmask); | 209 | return new IpAddress(version, net, netmask); |
210 | } | 210 | } |
... | @@ -225,11 +225,15 @@ public final class IpAddress { | ... | @@ -225,11 +225,15 @@ public final class IpAddress { |
225 | byte [] host = new byte [INET_LEN]; | 225 | byte [] host = new byte [INET_LEN]; |
226 | byte [] mask = bytes(mask()); | 226 | byte [] mask = bytes(mask()); |
227 | for (int i = 0; i < INET_LEN; i++) { | 227 | for (int i = 0; i < INET_LEN; i++) { |
228 | - host[i] = (byte) (octets[i] & ~mask[i]); | 228 | + host[i] = (byte) (octets[i] & ~mask[i]); |
229 | } | 229 | } |
230 | return new IpAddress(version, host, netmask); | 230 | return new IpAddress(version, host, netmask); |
231 | } | 231 | } |
232 | 232 | ||
233 | + public boolean isMasked() { | ||
234 | + return mask() != 0; | ||
235 | + } | ||
236 | + | ||
233 | @Override | 237 | @Override |
234 | public int hashCode() { | 238 | public int hashCode() { |
235 | final int prime = 31; | 239 | final int prime = 31; | ... | ... |
-
Please register or login to post a comment