Marc De Leenheer
Committed by Gerrit Code Review

Static optical madness. Fix in device resource store. Javadoc.

Change-Id: Iaba6b62094b3d2023f352d52037c6d1535c31b88
...@@ -378,8 +378,10 @@ public class OpticalPathProvisioner { ...@@ -378,8 +378,10 @@ public class OpticalPathProvisioner {
378 LinkResourceAllocations lra = linkResourceService.getAllocations(intent.id()); 378 LinkResourceAllocations lra = linkResourceService.getAllocations(intent.id());
379 if (intent instanceof OpticalConnectivityIntent) { 379 if (intent instanceof OpticalConnectivityIntent) {
380 deviceResourceService.releasePorts(intent.id()); 380 deviceResourceService.releasePorts(intent.id());
381 - linkResourceService.releaseResources(lra); 381 + if (lra != null) {
382 - } else if (intent instanceof OpticalCircuitIntent) { 382 + linkResourceService.releaseResources(lra);
383 + }
384 + } else if (intent instanceof OpticalCircuitIntent) {
383 deviceResourceService.releasePorts(intent.id()); 385 deviceResourceService.releasePorts(intent.id());
384 deviceResourceService.releaseMapping(intent.id()); 386 deviceResourceService.releaseMapping(intent.id());
385 if (lra != null) { 387 if (lra != null) {
......
...@@ -17,6 +17,7 @@ package org.onosproject.net; ...@@ -17,6 +17,7 @@ package org.onosproject.net;
17 17
18 import com.google.common.base.MoreObjects; 18 import com.google.common.base.MoreObjects;
19 import org.onlab.util.Frequency; 19 import org.onlab.util.Frequency;
20 +import org.onosproject.net.resource.link.LambdaResourceAllocation;
20 21
21 import java.util.Objects; 22 import java.util.Objects;
22 23
...@@ -34,6 +35,9 @@ public class OchSignal implements Lambda { ...@@ -34,6 +35,9 @@ public class OchSignal implements Lambda {
34 35
35 public static final Frequency CENTER_FREQUENCY = Frequency.ofTHz(193.1); 36 public static final Frequency CENTER_FREQUENCY = Frequency.ofTHz(193.1);
36 public static final Frequency FLEX_GRID_SLOT = Frequency.ofGHz(12.5); 37 public static final Frequency FLEX_GRID_SLOT = Frequency.ofGHz(12.5);
38 + private static final GridType DEFAULT_OCH_GRIDTYPE = GridType.DWDM;
39 + private static final ChannelSpacing DEFAULT_CHANNEL_SPACING = ChannelSpacing.CHL_50GHZ;
40 +
37 41
38 private final GridType gridType; 42 private final GridType gridType;
39 private final ChannelSpacing channelSpacing; 43 private final ChannelSpacing channelSpacing;
...@@ -63,6 +67,33 @@ public class OchSignal implements Lambda { ...@@ -63,6 +67,33 @@ public class OchSignal implements Lambda {
63 } 67 }
64 68
65 /** 69 /**
70 + * Create OCh signal from lambda resource allocation.
71 + *
72 + * @param alloc lambda resource allocation
73 + * @param maxFrequency maximum frequency
74 + * @param grid grid spacing frequency
75 + */
76 + public OchSignal(LambdaResourceAllocation alloc, Frequency maxFrequency, Frequency grid) {
77 + int channel = alloc.lambda().toInt();
78 +
79 + // Calculate center frequency
80 + Frequency centerFrequency = maxFrequency.subtract(grid.multiply(channel - 1));
81 +
82 + this.gridType = DEFAULT_OCH_GRIDTYPE;
83 + this.channelSpacing = DEFAULT_CHANNEL_SPACING;
84 + this.spacingMultiplier = (int) (centerFrequency.subtract(OchSignal.CENTER_FREQUENCY).asHz() / grid.asHz());
85 + this.slotGranularity = (int) Math.round((double) grid.asHz() / ChannelSpacing.CHL_12P5GHZ.frequency().asHz());
86 + }
87 +
88 + public OchSignal(Frequency centerFrequency, ChannelSpacing channelSpacing, int slotGranularity) {
89 + this.gridType = DEFAULT_OCH_GRIDTYPE;
90 + this.channelSpacing = channelSpacing;
91 + this.spacingMultiplier = (int) Math.round((double) centerFrequency.
92 + subtract(OchSignal.CENTER_FREQUENCY).asHz() / channelSpacing().frequency().asHz());
93 + this.slotGranularity = slotGranularity;
94 + }
95 +
96 + /**
66 * Returns grid type. 97 * Returns grid type.
67 * 98 *
68 * @return grid type 99 * @return grid type
......
...@@ -165,9 +165,9 @@ public class OpticalCircuitIntentCompiler implements IntentCompiler<OpticalCircu ...@@ -165,9 +165,9 @@ public class OpticalCircuitIntentCompiler implements IntentCompiler<OpticalCircu
165 * Checks if current allocations on given resource can satisfy request. 165 * Checks if current allocations on given resource can satisfy request.
166 * If the resource is null, return true. 166 * If the resource is null, return true.
167 * 167 *
168 - * @param request 168 + * @param request the intent making the request
169 - * @param resource 169 + * @param resource the resource on which to map the intent
170 - * @return 170 + * @return true if the resource can accept the request, false otherwise
171 */ 171 */
172 private boolean isAvailable(Intent request, IntentId resource) { 172 private boolean isAvailable(Intent request, IntentId resource) {
173 if (resource == null) { 173 if (resource == null) {
......
...@@ -27,10 +27,8 @@ import org.apache.felix.scr.annotations.Reference; ...@@ -27,10 +27,8 @@ import org.apache.felix.scr.annotations.Reference;
27 import org.apache.felix.scr.annotations.ReferenceCardinality; 27 import org.apache.felix.scr.annotations.ReferenceCardinality;
28 import org.onlab.util.Frequency; 28 import org.onlab.util.Frequency;
29 import org.onosproject.net.AnnotationKeys; 29 import org.onosproject.net.AnnotationKeys;
30 -import org.onosproject.net.ChannelSpacing;
31 import org.onosproject.net.ConnectPoint; 30 import org.onosproject.net.ConnectPoint;
32 import org.onosproject.net.DeviceId; 31 import org.onosproject.net.DeviceId;
33 -import org.onosproject.net.GridType;
34 import org.onosproject.net.Link; 32 import org.onosproject.net.Link;
35 import org.onosproject.net.OchPort; 33 import org.onosproject.net.OchPort;
36 import org.onosproject.net.OchSignal; 34 import org.onosproject.net.OchSignal;
...@@ -73,9 +71,6 @@ public class OpticalConnectivityIntentCompiler implements IntentCompiler<Optical ...@@ -73,9 +71,6 @@ public class OpticalConnectivityIntentCompiler implements IntentCompiler<Optical
73 71
74 protected static final Logger log = LoggerFactory.getLogger(OpticalConnectivityIntentCompiler.class); 72 protected static final Logger log = LoggerFactory.getLogger(OpticalConnectivityIntentCompiler.class);
75 73
76 - private static final GridType DEFAULT_OCH_GRIDTYPE = GridType.DWDM;
77 - private static final ChannelSpacing DEFAULT_CHANNEL_SPACING = ChannelSpacing.CHL_50GHZ;
78 -
79 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) 74 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
80 protected IntentExtensionService intentManager; 75 protected IntentExtensionService intentManager;
81 76
...@@ -127,24 +122,31 @@ public class OpticalConnectivityIntentCompiler implements IntentCompiler<Optical ...@@ -127,24 +122,31 @@ public class OpticalConnectivityIntentCompiler implements IntentCompiler<Optical
127 for (Path path : paths) { 122 for (Path path : paths) {
128 123
129 // Static or dynamic lambda allocation 124 // Static or dynamic lambda allocation
130 - LambdaResourceAllocation lambdaAlloc;
131 String staticLambda = srcPort.annotations().value(AnnotationKeys.STATIC_LAMBDA); 125 String staticLambda = srcPort.annotations().value(AnnotationKeys.STATIC_LAMBDA);
126 + OchPort srcOchPort = (OchPort) srcPort;
127 + OchPort dstOchPort = (OchPort) dstPort;
128 + OchSignal ochSignal;
129 +
130 + // FIXME: need to actually reserve the lambda for static lambda's
132 if (staticLambda != null) { 131 if (staticLambda != null) {
133 - // FIXME: need to actually reserve the lambda 132 + ochSignal = new OchSignal(Frequency.ofHz(Long.valueOf(staticLambda)),
134 - lambdaAlloc = new LambdaResourceAllocation(LambdaResource.valueOf(Integer.parseInt(staticLambda))); 133 + srcOchPort.lambda().channelSpacing(),
134 + srcOchPort.lambda().slotGranularity());
135 + } else if (!srcOchPort.isTunable() || !dstOchPort.isTunable()) {
136 + // FIXME: also check OCh port
137 + ochSignal = srcOchPort.lambda();
135 } else { 138 } else {
136 // Request and reserve lambda on path 139 // Request and reserve lambda on path
137 LinkResourceAllocations linkAllocs = assignWavelength(intent, path); 140 LinkResourceAllocations linkAllocs = assignWavelength(intent, path);
138 if (linkAllocs == null) { 141 if (linkAllocs == null) {
139 continue; 142 continue;
140 } 143 }
141 - lambdaAlloc = getWavelength(path, linkAllocs); 144 + LambdaResourceAllocation lambdaAlloc = getWavelength(path, linkAllocs);
145 + OmsPort omsPort = (OmsPort) deviceService.getPort(path.src().deviceId(), path.src().port());
146 + ochSignal = new OchSignal(lambdaAlloc, omsPort.maxFrequency(), omsPort.grid());
142 } 147 }
143 148
144 - OmsPort omsPort = (OmsPort) deviceService.getPort(path.src().deviceId(), path.src().port());
145 -
146 // Create installable optical path intent 149 // Create installable optical path intent
147 - OchSignal ochSignal = getOchSignal(lambdaAlloc, omsPort.maxFrequency(), omsPort.grid());
148 // Only support fixed grid for now 150 // Only support fixed grid for now
149 OchSignalType signalType = OchSignalType.FIXED_GRID; 151 OchSignalType signalType = OchSignalType.FIXED_GRID;
150 152
...@@ -239,29 +241,6 @@ public class OpticalConnectivityIntentCompiler implements IntentCompiler<Optical ...@@ -239,29 +241,6 @@ public class OpticalConnectivityIntentCompiler implements IntentCompiler<Optical
239 return true; 241 return true;
240 } 242 }
241 243
242 - /**
243 - * Convert lambda resource allocation in OCh signal.
244 - *
245 - * @param alloc lambda resource allocation
246 - * @param maxFrequency maximum frequency
247 - * @param grid grid spacing frequency
248 - * @return OCh signal
249 - */
250 - private OchSignal getOchSignal(LambdaResourceAllocation alloc, Frequency maxFrequency, Frequency grid) {
251 - int channel = alloc.lambda().toInt();
252 -
253 - // Calculate center frequency
254 - Frequency centerFrequency = maxFrequency.subtract(grid.multiply(channel - 1));
255 -
256 - // Build OCh signal object
257 - int spacingMultiplier = (int) (centerFrequency.subtract(OchSignal.CENTER_FREQUENCY).asHz() / grid.asHz());
258 - int slotGranularity = (int) (grid.asHz() / ChannelSpacing.CHL_12P5GHZ.frequency().asHz());
259 - OchSignal ochSignal = new OchSignal(DEFAULT_OCH_GRIDTYPE, DEFAULT_CHANNEL_SPACING,
260 - spacingMultiplier, slotGranularity);
261 -
262 - return ochSignal;
263 - }
264 -
265 private ConnectPoint staticPort(ConnectPoint connectPoint) { 244 private ConnectPoint staticPort(ConnectPoint connectPoint) {
266 Port port = deviceService.getPort(connectPoint.deviceId(), connectPoint.port()); 245 Port port = deviceService.getPort(connectPoint.deviceId(), connectPoint.port());
267 246
......
...@@ -167,7 +167,7 @@ public class ConsistentDeviceResourceStore implements DeviceResourceStore { ...@@ -167,7 +167,7 @@ public class ConsistentDeviceResourceStore implements DeviceResourceStore {
167 public Set<IntentId> getMapping(IntentId intentId) { 167 public Set<IntentId> getMapping(IntentId intentId) {
168 Versioned<Set<IntentId>> result = intentMapping.get(intentId); 168 Versioned<Set<IntentId>> result = intentMapping.get(intentId);
169 169
170 - if (result == null) { 170 + if (result != null) {
171 return result.value(); 171 return result.value();
172 } 172 }
173 173
...@@ -178,7 +178,6 @@ public class ConsistentDeviceResourceStore implements DeviceResourceStore { ...@@ -178,7 +178,6 @@ public class ConsistentDeviceResourceStore implements DeviceResourceStore {
178 public boolean allocateMapping(IntentId keyIntentId, IntentId valIntentId) { 178 public boolean allocateMapping(IntentId keyIntentId, IntentId valIntentId) {
179 Versioned<Set<IntentId>> versionedIntents = intentMapping.get(keyIntentId); 179 Versioned<Set<IntentId>> versionedIntents = intentMapping.get(keyIntentId);
180 180
181 -
182 if (versionedIntents == null) { 181 if (versionedIntents == null) {
183 Set<IntentId> newSet = new HashSet<>(); 182 Set<IntentId> newSet = new HashSet<>();
184 newSet.add(valIntentId); 183 newSet.add(valIntentId);
...@@ -216,6 +215,7 @@ public class ConsistentDeviceResourceStore implements DeviceResourceStore { ...@@ -216,6 +215,7 @@ public class ConsistentDeviceResourceStore implements DeviceResourceStore {
216 for (Port port : ports) { 215 for (Port port : ports) {
217 portAllocs.remove(port); 216 portAllocs.remove(port);
218 } 217 }
218 + tx.commit();
219 } catch (Exception e) { 219 } catch (Exception e) {
220 log.error("Exception thrown, rolling back", e); 220 log.error("Exception thrown, rolling back", e);
221 tx.abort(); 221 tx.abort();
......
...@@ -235,7 +235,11 @@ class ConfigProvider implements DeviceProvider, LinkProvider, HostProvider { ...@@ -235,7 +235,11 @@ class ConfigProvider implements DeviceProvider, LinkProvider, HostProvider {
235 port = portNumber(node.path("port").asLong(0)); 235 port = portNumber(node.path("port").asLong(0));
236 } 236 }
237 237
238 - checkNotNull(port); 238 + if (port == null) {
239 + log.error("Cannot find port given in node {}", node);
240 + return null;
241 + }
242 +
239 String portName = Strings.emptyToNull(port.name()); 243 String portName = Strings.emptyToNull(port.name());
240 SparseAnnotations annotations = null; 244 SparseAnnotations annotations = null;
241 if (portName != null) { 245 if (portName != null) {
......