Praseed Balakrishnan

Merge branch 'master' of ssh://gerrit.onlab.us:29418/onos-next

...@@ -50,7 +50,10 @@ public class NetworkConfigReader { ...@@ -50,7 +50,10 @@ public class NetworkConfigReader {
50 50
51 private final Logger log = getLogger(getClass()); 51 private final Logger log = getLogger(getClass());
52 52
53 - private static final String DEFAULT_CONFIG_FILE = "config/addresses.json"; 53 + // Current working dir seems to be /opt/onos/apache-karaf-3.0.2
54 + // TODO: Set the path to /opt/onos/config
55 + private static final String CONFIG_DIR = "../config";
56 + private static final String DEFAULT_CONFIG_FILE = "addresses.json";
54 private String configFileName = DEFAULT_CONFIG_FILE; 57 private String configFileName = DEFAULT_CONFIG_FILE;
55 58
56 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) 59 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
...@@ -60,52 +63,9 @@ public class NetworkConfigReader { ...@@ -60,52 +63,9 @@ public class NetworkConfigReader {
60 protected void activate() { 63 protected void activate() {
61 log.info("Started network config reader"); 64 log.info("Started network config reader");
62 65
63 - log.info("Config file set to {}", configFileName);
64 -
65 AddressConfiguration config = readNetworkConfig(); 66 AddressConfiguration config = readNetworkConfig();
66 -
67 if (config != null) { 67 if (config != null) {
68 - for (AddressEntry entry : config.getAddresses()) { 68 + applyNetworkConfig(config);
69 -
70 - ConnectPoint cp = new ConnectPoint(
71 - DeviceId.deviceId(dpidToUri(entry.getDpid())),
72 - PortNumber.portNumber(entry.getPortNumber()));
73 -
74 - Set<InterfaceIpAddress> interfaceIpAddresses = new HashSet<>();
75 -
76 - for (String strIp : entry.getIpAddresses()) {
77 - // Get the IP address and the subnet mask length
78 - try {
79 - String[] splits = strIp.split("/");
80 - if (splits.length != 2) {
81 - throw new IllegalArgumentException("Invalid IP address and prefix length format");
82 - }
83 - // NOTE: IpPrefix will mask-out the bits after the prefix length.
84 - IpPrefix subnet = IpPrefix.valueOf(strIp);
85 - IpAddress addr = IpAddress.valueOf(splits[0]);
86 - InterfaceIpAddress ia =
87 - new InterfaceIpAddress(addr, subnet);
88 - interfaceIpAddresses.add(ia);
89 - } catch (IllegalArgumentException e) {
90 - log.warn("Bad format for IP address in config: {}", strIp);
91 - }
92 - }
93 -
94 - MacAddress macAddress = null;
95 - if (entry.getMacAddress() != null) {
96 - try {
97 - macAddress = MacAddress.valueOf(entry.getMacAddress());
98 - } catch (IllegalArgumentException e) {
99 - log.warn("Bad format for MAC address in config: {}",
100 - entry.getMacAddress());
101 - }
102 - }
103 -
104 - PortAddresses addresses = new PortAddresses(cp,
105 - interfaceIpAddresses, macAddress);
106 -
107 - hostAdminService.bindAddressesToPort(addresses);
108 - }
109 } 69 }
110 } 70 }
111 71
...@@ -114,12 +74,17 @@ public class NetworkConfigReader { ...@@ -114,12 +74,17 @@ public class NetworkConfigReader {
114 log.info("Stopped"); 74 log.info("Stopped");
115 } 75 }
116 76
77 + /**
78 + * Reads the network configuration.
79 + *
80 + * @return the network configuration on success, otherwise null
81 + */
117 private AddressConfiguration readNetworkConfig() { 82 private AddressConfiguration readNetworkConfig() {
118 - File configFile = new File(configFileName); 83 + File configFile = new File(CONFIG_DIR, configFileName);
119 -
120 ObjectMapper mapper = new ObjectMapper(); 84 ObjectMapper mapper = new ObjectMapper();
121 85
122 try { 86 try {
87 + log.info("Loading config: {}", configFile.getAbsolutePath());
123 AddressConfiguration config = 88 AddressConfiguration config =
124 mapper.readValue(configFile, AddressConfiguration.class); 89 mapper.readValue(configFile, AddressConfiguration.class);
125 90
...@@ -127,12 +92,58 @@ public class NetworkConfigReader { ...@@ -127,12 +92,58 @@ public class NetworkConfigReader {
127 } catch (FileNotFoundException e) { 92 } catch (FileNotFoundException e) {
128 log.warn("Configuration file not found: {}", configFileName); 93 log.warn("Configuration file not found: {}", configFileName);
129 } catch (IOException e) { 94 } catch (IOException e) {
130 - log.error("Unable to read config from file:", e); 95 + log.error("Error loading configuration", e);
131 } 96 }
132 97
133 return null; 98 return null;
134 } 99 }
135 100
101 + /**
102 + * Applies the network configuration.
103 + *
104 + * @param config the network configuration to apply
105 + */
106 + private void applyNetworkConfig(AddressConfiguration config) {
107 + for (AddressEntry entry : config.getAddresses()) {
108 + ConnectPoint cp = new ConnectPoint(
109 + DeviceId.deviceId(dpidToUri(entry.getDpid())),
110 + PortNumber.portNumber(entry.getPortNumber()));
111 +
112 + Set<InterfaceIpAddress> interfaceIpAddresses = new HashSet<>();
113 + for (String strIp : entry.getIpAddresses()) {
114 + // Get the IP address and the subnet mask length
115 + try {
116 + String[] splits = strIp.split("/");
117 + if (splits.length != 2) {
118 + throw new IllegalArgumentException("Invalid IP address and prefix length format");
119 + }
120 + // NOTE: IpPrefix will mask-out the bits after the prefix length.
121 + IpPrefix subnet = IpPrefix.valueOf(strIp);
122 + IpAddress addr = IpAddress.valueOf(splits[0]);
123 + InterfaceIpAddress ia =
124 + new InterfaceIpAddress(addr, subnet);
125 + interfaceIpAddresses.add(ia);
126 + } catch (IllegalArgumentException e) {
127 + log.warn("Bad format for IP address in config: {}", strIp);
128 + }
129 + }
130 +
131 + MacAddress macAddress = null;
132 + if (entry.getMacAddress() != null) {
133 + try {
134 + macAddress = MacAddress.valueOf(entry.getMacAddress());
135 + } catch (IllegalArgumentException e) {
136 + log.warn("Bad format for MAC address in config: {}",
137 + entry.getMacAddress());
138 + }
139 + }
140 +
141 + PortAddresses addresses = new PortAddresses(cp,
142 + interfaceIpAddresses, macAddress);
143 + hostAdminService.bindAddressesToPort(addresses);
144 + }
145 + }
146 +
136 private static String dpidToUri(String dpid) { 147 private static String dpidToUri(String dpid) {
137 return "of:" + dpid.replace(":", ""); 148 return "of:" + dpid.replace(":", "");
138 } 149 }
......
1 -{
2 - "interfaces" : [
3 - {
4 - "dpid" : "00:00:00:00:00:00:01",
5 - "port" : "1",
6 - "ips" : ["192.168.10.101/24"],
7 - "mac" : "00:00:00:11:22:33"
8 - },
9 - {
10 - "dpid" : "00:00:00:00:00:00:02",
11 - "port" : "1",
12 - "ips" : ["192.168.20.101/24", "192.168.30.101/24"]
13 - },
14 - {
15 - "dpid" : "00:00:00:00:00:00:03",
16 - "port" : "1",
17 - "ips" : ["10.1.0.1/16"],
18 - "mac" : "00:00:00:00:00:01"
19 - }
20 - ]
21 -}
...@@ -37,24 +37,31 @@ import com.fasterxml.jackson.databind.ObjectMapper; ...@@ -37,24 +37,31 @@ import com.fasterxml.jackson.databind.ObjectMapper;
37 */ 37 */
38 public class SdnIpConfigReader implements SdnIpConfigService { 38 public class SdnIpConfigReader implements SdnIpConfigService {
39 39
40 - private static final Logger log = LoggerFactory.getLogger(SdnIpConfigReader.class); 40 + private final Logger log = LoggerFactory.getLogger(getClass());
41 41
42 - private static final String DEFAULT_CONFIG_FILE = "config/sdnip.json"; 42 + // Current working dir seems to be /opt/onos/apache-karaf-3.0.2
43 + // TODO: Set the path to /opt/onos/config
44 + private static final String CONFIG_DIR = "../config";
45 + private static final String DEFAULT_CONFIG_FILE = "sdnip.json";
43 private String configFileName = DEFAULT_CONFIG_FILE; 46 private String configFileName = DEFAULT_CONFIG_FILE;
47 +
44 private Map<String, BgpSpeaker> bgpSpeakers = new ConcurrentHashMap<>(); 48 private Map<String, BgpSpeaker> bgpSpeakers = new ConcurrentHashMap<>();
45 private Map<IpAddress, BgpPeer> bgpPeers = new ConcurrentHashMap<>(); 49 private Map<IpAddress, BgpPeer> bgpPeers = new ConcurrentHashMap<>();
46 50
47 /** 51 /**
48 - * Reads the info contained in the configuration file. 52 + * Reads SDN-IP related information contained in the configuration file.
49 * 53 *
50 - * @param configFilename The name of configuration file for SDN-IP application. 54 + * @param configFilename the name of the configuration file for the SDN-IP
55 + * application
51 */ 56 */
52 private void readConfiguration(String configFilename) { 57 private void readConfiguration(String configFilename) {
53 - File gatewaysFile = new File(configFilename); 58 + File configFile = new File(CONFIG_DIR, configFilename);
54 ObjectMapper mapper = new ObjectMapper(); 59 ObjectMapper mapper = new ObjectMapper();
55 60
56 try { 61 try {
57 - Configuration config = mapper.readValue(gatewaysFile, Configuration.class); 62 + log.info("Loading config: {}", configFile.getAbsolutePath());
63 + Configuration config = mapper.readValue(configFile,
64 + Configuration.class);
58 for (BgpSpeaker speaker : config.getBgpSpeakers()) { 65 for (BgpSpeaker speaker : config.getBgpSpeakers()) {
59 bgpSpeakers.put(speaker.name(), speaker); 66 bgpSpeakers.put(speaker.name(), speaker);
60 } 67 }
...@@ -64,13 +71,11 @@ public class SdnIpConfigReader implements SdnIpConfigService { ...@@ -64,13 +71,11 @@ public class SdnIpConfigReader implements SdnIpConfigService {
64 } catch (FileNotFoundException e) { 71 } catch (FileNotFoundException e) {
65 log.warn("Configuration file not found: {}", configFileName); 72 log.warn("Configuration file not found: {}", configFileName);
66 } catch (IOException e) { 73 } catch (IOException e) {
67 - log.error("Error reading JSON file", e); 74 + log.error("Error loading configuration", e);
68 } 75 }
69 } 76 }
70 77
71 public void init() { 78 public void init() {
72 - log.debug("Config file set to {}", configFileName);
73 -
74 readConfiguration(configFileName); 79 readConfiguration(configFileName);
75 } 80 }
76 81
......
1 -ONOS looks for these config files by default in $KARAF_HOME/config/
...\ No newline at end of file ...\ No newline at end of file
1 +The SDN-IP configuration files should be copied to directory
2 + $ONOS_HOME/tools/package/config
3 +
4 +After deployment and starting up the ONOS cluster, ONOS looks for these
5 +configuration files in /opt/onos/config on each cluster member.
......
...@@ -28,4 +28,23 @@ public final class AnnotationKeys { ...@@ -28,4 +28,23 @@ public final class AnnotationKeys {
28 * Annotation key for latency. 28 * Annotation key for latency.
29 */ 29 */
30 public static final String LATENCY = "latency"; 30 public static final String LATENCY = "latency";
31 +
32 + /**
33 + * Returns the value annotated object for the specified annotation key.
34 + * The annotated value is expected to be String that can be parsed as double.
35 + * If parsing fails, the returned value will be 1.0.
36 + *
37 + * @param annotated annotated object whose annotated value is obtained
38 + * @param key key of annotation
39 + * @return double value of annotated object for the specified key
40 + */
41 + public static double getAnnotatedValue(Annotated annotated, String key) {
42 + double value;
43 + try {
44 + value = Double.parseDouble(annotated.annotations().value(key));
45 + } catch (NumberFormatException e) {
46 + value = 1.0;
47 + }
48 + return value;
49 + }
31 } 50 }
......
...@@ -80,6 +80,7 @@ public class DefaultFlowEntry extends DefaultFlowRule ...@@ -80,6 +80,7 @@ public class DefaultFlowEntry extends DefaultFlowRule
80 this.state = FlowEntryState.FAILED; 80 this.state = FlowEntryState.FAILED;
81 this.errType = errType; 81 this.errType = errType;
82 this.errCode = errCode; 82 this.errCode = errCode;
83 + this.lastSeen = System.currentTimeMillis();
83 } 84 }
84 85
85 @Override 86 @Override
......
...@@ -21,6 +21,8 @@ import org.onlab.onos.net.resource.LinkResourceService; ...@@ -21,6 +21,8 @@ import org.onlab.onos.net.resource.LinkResourceService;
21 21
22 import java.util.Objects; 22 import java.util.Objects;
23 23
24 +import static org.onlab.onos.net.AnnotationKeys.getAnnotatedValue;
25 +
24 /** 26 /**
25 * Constraint that evaluates an arbitrary link annotated value is under the specified threshold. 27 * Constraint that evaluates an arbitrary link annotated value is under the specified threshold.
26 */ 28 */
...@@ -65,25 +67,6 @@ public class AnnotationConstraint extends BooleanConstraint { ...@@ -65,25 +67,6 @@ public class AnnotationConstraint extends BooleanConstraint {
65 return value <= threshold; 67 return value <= threshold;
66 } 68 }
67 69
68 - /**
69 - * Returns the annotated value of the specified link. The annotated value
70 - * is expected to be String that can be parsed as double. If parsing fails,
71 - * the returned value will be 1.0.
72 - *
73 - * @param link link whose annotated value is obtained
74 - * @param key key of link annotation
75 - * @return double value of link annotation for the specified key
76 - */
77 - private double getAnnotatedValue(Link link, String key) {
78 - double value;
79 - try {
80 - value = Double.parseDouble(link.annotations().value(key));
81 - } catch (NumberFormatException e) {
82 - value = 1.0;
83 - }
84 - return value;
85 - }
86 -
87 @Override 70 @Override
88 public double cost(Link link, LinkResourceService resourceService) { 71 public double cost(Link link, LinkResourceService resourceService) {
89 if (isValid(link, resourceService)) { 72 if (isValid(link, resourceService)) {
......
...@@ -26,6 +26,7 @@ import java.time.temporal.ChronoUnit; ...@@ -26,6 +26,7 @@ import java.time.temporal.ChronoUnit;
26 import java.util.Objects; 26 import java.util.Objects;
27 27
28 import static org.onlab.onos.net.AnnotationKeys.LATENCY; 28 import static org.onlab.onos.net.AnnotationKeys.LATENCY;
29 +import static org.onlab.onos.net.AnnotationKeys.getAnnotatedValue;
29 30
30 /** 31 /**
31 * Constraint that evaluates the latency through a path. 32 * Constraint that evaluates the latency through a path.
...@@ -48,16 +49,7 @@ public class LatencyConstraint implements Constraint { ...@@ -48,16 +49,7 @@ public class LatencyConstraint implements Constraint {
48 49
49 @Override 50 @Override
50 public double cost(Link link, LinkResourceService resourceService) { 51 public double cost(Link link, LinkResourceService resourceService) {
51 - String value = link.annotations().value(LATENCY); 52 + return getAnnotatedValue(link, LATENCY);
52 -
53 - double latencyInMicroSec;
54 - try {
55 - latencyInMicroSec = Double.parseDouble(value);
56 - } catch (NumberFormatException e) {
57 - latencyInMicroSec = 1.0;
58 - }
59 -
60 - return latencyInMicroSec;
61 } 53 }
62 54
63 @Override 55 @Override
......
1 +/*
2 + * Copyright 2014 Open Networking Laboratory
3 + *
4 + * Licensed under the Apache License, Version 2.0 (the "License");
5 + * you may not use this file except in compliance with the License.
6 + * You may obtain a copy of the License at
7 + *
8 + * http://www.apache.org/licenses/LICENSE-2.0
9 + *
10 + * Unless required by applicable law or agreed to in writing, software
11 + * distributed under the License is distributed on an "AS IS" BASIS,
12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 + * See the License for the specific language governing permissions and
14 + * limitations under the License.
15 + */
16 +package org.onlab.onos.net.flow;
17 +
18 +import java.util.concurrent.TimeUnit;
19 +
20 +import org.junit.Test;
21 +import org.onlab.onos.net.intent.IntentTestsMocks;
22 +
23 +import com.google.common.testing.EqualsTester;
24 +
25 +import static org.hamcrest.MatcherAssert.assertThat;
26 +import static org.hamcrest.Matchers.greaterThan;
27 +import static org.hamcrest.Matchers.is;
28 +import static org.onlab.onos.net.NetTestTools.did;
29 +
30 +/**
31 + * Unit tests for the DefaultFlowEntry class.
32 + */
33 +public class DefaultFlowEntryTest {
34 + private static final IntentTestsMocks.MockSelector SELECTOR =
35 + new IntentTestsMocks.MockSelector();
36 + private static final IntentTestsMocks.MockTreatment TREATMENT =
37 + new IntentTestsMocks.MockTreatment();
38 +
39 + private static DefaultFlowEntry makeFlowEntry(int uniqueValue) {
40 + return new DefaultFlowEntry(did("id" + Integer.toString(uniqueValue)),
41 + SELECTOR,
42 + TREATMENT,
43 + uniqueValue,
44 + FlowEntry.FlowEntryState.ADDED,
45 + uniqueValue,
46 + uniqueValue,
47 + uniqueValue,
48 + uniqueValue,
49 + uniqueValue);
50 + }
51 +
52 + final DefaultFlowEntry defaultFlowEntry1 = makeFlowEntry(1);
53 + final DefaultFlowEntry sameAsDefaultFlowEntry1 = makeFlowEntry(1);
54 + final DefaultFlowEntry defaultFlowEntry2 = makeFlowEntry(2);
55 +
56 + /**
57 + * Tests the equals, hashCode and toString methods using Guava EqualsTester.
58 + */
59 + @Test
60 + public void testEquals() {
61 + new EqualsTester()
62 + .addEqualityGroup(defaultFlowEntry1, sameAsDefaultFlowEntry1)
63 + .addEqualityGroup(defaultFlowEntry2)
64 + .testEquals();
65 + }
66 +
67 + /**
68 + * Tests the construction of a default flow entry from a device id.
69 + */
70 + @Test
71 + public void testDeviceBasedObject() {
72 + assertThat(defaultFlowEntry1.deviceId(), is(did("id1")));
73 + assertThat(defaultFlowEntry1.selector(), is(SELECTOR));
74 + assertThat(defaultFlowEntry1.treatment(), is(TREATMENT));
75 + assertThat(defaultFlowEntry1.timeout(), is(1));
76 + assertThat(defaultFlowEntry1.life(), is(1L));
77 + assertThat(defaultFlowEntry1.packets(), is(1L));
78 + assertThat(defaultFlowEntry1.bytes(), is(1L));
79 + assertThat(defaultFlowEntry1.state(), is(FlowEntry.FlowEntryState.ADDED));
80 + assertThat(defaultFlowEntry1.lastSeen(),
81 + greaterThan(System.currentTimeMillis() -
82 + TimeUnit.MILLISECONDS.convert(1, TimeUnit.SECONDS)));
83 + }
84 +
85 + /**
86 + * Tests the setters on a default flow entry object.
87 + */
88 + @Test
89 + public void testSetters() {
90 + final DefaultFlowEntry entry = makeFlowEntry(1);
91 +
92 + entry.setLastSeen();
93 + entry.setState(FlowEntry.FlowEntryState.PENDING_REMOVE);
94 + entry.setPackets(11);
95 + entry.setBytes(22);
96 + entry.setLife(33);
97 +
98 + assertThat(entry.deviceId(), is(did("id1")));
99 + assertThat(entry.selector(), is(SELECTOR));
100 + assertThat(entry.treatment(), is(TREATMENT));
101 + assertThat(entry.timeout(), is(1));
102 + assertThat(entry.life(), is(33L));
103 + assertThat(entry.packets(), is(11L));
104 + assertThat(entry.bytes(), is(22L));
105 + assertThat(entry.state(), is(FlowEntry.FlowEntryState.PENDING_REMOVE));
106 + assertThat(entry.lastSeen(),
107 + greaterThan(System.currentTimeMillis() -
108 + TimeUnit.MILLISECONDS.convert(1, TimeUnit.SECONDS)));
109 + }
110 +
111 + /**
112 + * Tests a default flow rule built for an error.
113 + */
114 + @Test
115 + public void testErrorObject() {
116 + final DefaultFlowEntry errorEntry =
117 + new DefaultFlowEntry(new IntentTestsMocks.MockFlowRule(1),
118 + 111,
119 + 222);
120 + assertThat(errorEntry.errType(), is(111));
121 + assertThat(errorEntry.errCode(), is(222));
122 + assertThat(errorEntry.state(), is(FlowEntry.FlowEntryState.FAILED));
123 + assertThat(errorEntry.lastSeen(),
124 + greaterThan(System.currentTimeMillis() -
125 + TimeUnit.MILLISECONDS.convert(1, TimeUnit.SECONDS)));
126 + }
127 +
128 + /**
129 + * Tests a default flow entry constructed from a flow rule.
130 + */
131 + @Test
132 + public void testFlowBasedObject() {
133 + final DefaultFlowEntry entry =
134 + new DefaultFlowEntry(new IntentTestsMocks.MockFlowRule(1));
135 + assertThat(entry.priority(), is(1));
136 + assertThat(entry.appId(), is((short) 0));
137 + assertThat(entry.lastSeen(),
138 + greaterThan(System.currentTimeMillis() -
139 + TimeUnit.MILLISECONDS.convert(1, TimeUnit.SECONDS)));
140 + }
141 +
142 + /**
143 + * Tests a default flow entry constructed from a flow rule plus extra
144 + * parameters.
145 + */
146 + @Test
147 + public void testFlowBasedObjectWithParameters() {
148 + final DefaultFlowEntry entry =
149 + new DefaultFlowEntry(new IntentTestsMocks.MockFlowRule(33),
150 + FlowEntry.FlowEntryState.REMOVED,
151 + 101, 102, 103);
152 + assertThat(entry.state(), is(FlowEntry.FlowEntryState.REMOVED));
153 + assertThat(entry.life(), is(101L));
154 + assertThat(entry.packets(), is(102L));
155 + assertThat(entry.bytes(), is(103L));
156 + assertThat(entry.lastSeen(),
157 + greaterThan(System.currentTimeMillis() -
158 + TimeUnit.MILLISECONDS.convert(1, TimeUnit.SECONDS)));
159 + }
160 +}
...@@ -17,7 +17,6 @@ ...@@ -17,7 +17,6 @@
17 package org.onlab.onos.net.flow; 17 package org.onlab.onos.net.flow;
18 18
19 import org.junit.Test; 19 import org.junit.Test;
20 -import org.onlab.onos.net.DeviceId;
21 import org.onlab.onos.net.intent.IntentTestsMocks; 20 import org.onlab.onos.net.intent.IntentTestsMocks;
22 21
23 import com.google.common.testing.EqualsTester; 22 import com.google.common.testing.EqualsTester;
...@@ -25,8 +24,8 @@ import com.google.common.testing.EqualsTester; ...@@ -25,8 +24,8 @@ import com.google.common.testing.EqualsTester;
25 import static org.hamcrest.MatcherAssert.assertThat; 24 import static org.hamcrest.MatcherAssert.assertThat;
26 import static org.hamcrest.Matchers.is; 25 import static org.hamcrest.Matchers.is;
27 import static org.onlab.junit.ImmutableClassChecker.assertThatClassIsImmutableBaseClass; 26 import static org.onlab.junit.ImmutableClassChecker.assertThatClassIsImmutableBaseClass;
28 -import static org.onlab.onos.net.NetTestTools.did;
29 import static org.onlab.onos.net.NetTestTools.APP_ID; 27 import static org.onlab.onos.net.NetTestTools.APP_ID;
28 +import static org.onlab.onos.net.NetTestTools.did;
30 29
31 /** 30 /**
32 * Unit tests for the default flow rule class. 31 * Unit tests for the default flow rule class.
...@@ -37,63 +36,13 @@ public class DefaultFlowRuleTest { ...@@ -37,63 +36,13 @@ public class DefaultFlowRuleTest {
37 private static final IntentTestsMocks.MockTreatment TREATMENT = 36 private static final IntentTestsMocks.MockTreatment TREATMENT =
38 new IntentTestsMocks.MockTreatment(); 37 new IntentTestsMocks.MockTreatment();
39 38
40 - final FlowRule flowRule1 = new MockFlowRule(1); 39 + final FlowRule flowRule1 = new IntentTestsMocks.MockFlowRule(1);
41 - final FlowRule sameAsFlowRule1 = new MockFlowRule(1); 40 + final FlowRule sameAsFlowRule1 = new IntentTestsMocks.MockFlowRule(1);
42 - final FlowRule flowRule2 = new MockFlowRule(2); 41 + final FlowRule flowRule2 = new IntentTestsMocks.MockFlowRule(2);
43 final DefaultFlowRule defaultFlowRule1 = new DefaultFlowRule(flowRule1); 42 final DefaultFlowRule defaultFlowRule1 = new DefaultFlowRule(flowRule1);
44 final DefaultFlowRule sameAsDefaultFlowRule1 = new DefaultFlowRule(sameAsFlowRule1); 43 final DefaultFlowRule sameAsDefaultFlowRule1 = new DefaultFlowRule(sameAsFlowRule1);
45 final DefaultFlowRule defaultFlowRule2 = new DefaultFlowRule(flowRule2); 44 final DefaultFlowRule defaultFlowRule2 = new DefaultFlowRule(flowRule2);
46 45
47 - private static class MockFlowRule implements FlowRule {
48 -
49 - int priority;
50 - MockFlowRule(int priority) {
51 - this.priority = priority;
52 - }
53 -
54 - @Override
55 - public FlowId id() {
56 - return FlowId.valueOf(1);
57 - }
58 -
59 - @Override
60 - public short appId() {
61 - return 0;
62 - }
63 -
64 - @Override
65 - public int priority() {
66 - return priority;
67 - }
68 -
69 - @Override
70 - public DeviceId deviceId() {
71 - return did("1");
72 - }
73 -
74 - @Override
75 - public TrafficSelector selector() {
76 - return SELECTOR;
77 - }
78 -
79 - @Override
80 - public TrafficTreatment treatment() {
81 - return TREATMENT;
82 - }
83 -
84 - @Override
85 - public int timeout() {
86 - return 0;
87 - }
88 -
89 - @Override
90 - public boolean isPermanent() {
91 - return false;
92 - }
93 -
94 -
95 - }
96 -
97 /** 46 /**
98 * Checks that the DefaultFlowRule class is immutable but can be inherited 47 * Checks that the DefaultFlowRule class is immutable but can be inherited
99 * from. 48 * from.
......
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
16 package org.onlab.onos.net.intent; 16 package org.onlab.onos.net.intent;
17 17
18 import static org.onlab.onos.net.NetTestTools.createPath; 18 import static org.onlab.onos.net.NetTestTools.createPath;
19 +import static org.onlab.onos.net.NetTestTools.did;
19 import static org.onlab.onos.net.NetTestTools.link; 20 import static org.onlab.onos.net.NetTestTools.link;
20 21
21 import java.util.ArrayList; 22 import java.util.ArrayList;
...@@ -31,6 +32,8 @@ import org.onlab.onos.net.DeviceId; ...@@ -31,6 +32,8 @@ import org.onlab.onos.net.DeviceId;
31 import org.onlab.onos.net.ElementId; 32 import org.onlab.onos.net.ElementId;
32 import org.onlab.onos.net.Link; 33 import org.onlab.onos.net.Link;
33 import org.onlab.onos.net.Path; 34 import org.onlab.onos.net.Path;
35 +import org.onlab.onos.net.flow.FlowId;
36 +import org.onlab.onos.net.flow.FlowRule;
34 import org.onlab.onos.net.flow.TrafficSelector; 37 import org.onlab.onos.net.flow.TrafficSelector;
35 import org.onlab.onos.net.flow.TrafficTreatment; 38 import org.onlab.onos.net.flow.TrafficTreatment;
36 import org.onlab.onos.net.flow.criteria.Criterion; 39 import org.onlab.onos.net.flow.criteria.Criterion;
...@@ -271,4 +274,60 @@ public class IntentTestsMocks { ...@@ -271,4 +274,60 @@ public class IntentTestsMocks {
271 } 274 }
272 } 275 }
273 276
277 + private static final IntentTestsMocks.MockSelector SELECTOR =
278 + new IntentTestsMocks.MockSelector();
279 + private static final IntentTestsMocks.MockTreatment TREATMENT =
280 + new IntentTestsMocks.MockTreatment();
281 +
282 + public static class MockFlowRule implements FlowRule {
283 +
284 + int priority;
285 + public MockFlowRule(int priority) {
286 + this.priority = priority;
287 + }
288 +
289 + @Override
290 + public FlowId id() {
291 + return FlowId.valueOf(1);
292 + }
293 +
294 + @Override
295 + public short appId() {
296 + return 0;
297 + }
298 +
299 + @Override
300 + public int priority() {
301 + return priority;
302 + }
303 +
304 + @Override
305 + public DeviceId deviceId() {
306 + return did("1");
307 + }
308 +
309 + @Override
310 + public TrafficSelector selector() {
311 + return SELECTOR;
312 + }
313 +
314 + @Override
315 + public TrafficTreatment treatment() {
316 + return TREATMENT;
317 + }
318 +
319 + @Override
320 + public int timeout() {
321 + return 0;
322 + }
323 +
324 + @Override
325 + public boolean isPermanent() {
326 + return false;
327 + }
328 +
329 +
330 + }
331 +
332 +
274 } 333 }
......
...@@ -72,7 +72,7 @@ public class DatabaseManager implements DatabaseService, DatabaseAdminService { ...@@ -72,7 +72,7 @@ public class DatabaseManager implements DatabaseService, DatabaseAdminService {
72 public static final String LOG_FILE_PREFIX = "/tmp/onos-copy-cat-log_"; 72 public static final String LOG_FILE_PREFIX = "/tmp/onos-copy-cat-log_";
73 73
74 // Current working dir seems to be /opt/onos/apache-karaf-3.0.2 74 // Current working dir seems to be /opt/onos/apache-karaf-3.0.2
75 - // TODO: Get the path to /opt/onos/config 75 + // TODO: Set the path to /opt/onos/config
76 private static final String CONFIG_DIR = "../config"; 76 private static final String CONFIG_DIR = "../config";
77 77
78 private static final String DEFAULT_MEMBER_FILE = "tablets.json"; 78 private static final String DEFAULT_MEMBER_FILE = "tablets.json";
......
...@@ -197,6 +197,8 @@ ...@@ -197,6 +197,8 @@
197 <feature name="onos-app-sdnip" version="1.0.0" 197 <feature name="onos-app-sdnip" version="1.0.0"
198 description="SDN-IP peering application"> 198 description="SDN-IP peering application">
199 <feature>onos-api</feature> 199 <feature>onos-api</feature>
200 + <feature>onos-app-proxyarp</feature>
201 + <feature>onos-app-config</feature>
200 <bundle>mvn:org.onlab.onos/onos-app-sdnip/1.0.0-SNAPSHOT</bundle> 202 <bundle>mvn:org.onlab.onos/onos-app-sdnip/1.0.0-SNAPSHOT</bundle>
201 </feature> 203 </feature>
202 204
......
1 -onos-config command will copy files contained in this directory to ONOS instances according to cell definition 1 +The onos-config command will copy files contained in this directory to ONOS
2 - 2 +instances according to cell definition.
......