HIGUCHI Yuta
Committed by Gerrit Code Review

ONOS-3503 Remove OchPort out of core.

- Implementation of a Behavior OpticalDevice has the knowledge of
  translating annotations into optical specific port.
- OpticalDeviceServiceView checks if the Device is a OpticalDevice
  and translate all the Ports to optical specific port before returning.

- This commit contains feedbacks, issues, and fixes by Michele Santuari.

- Note: 3 more Port types to go (OduClt, Oms, Otu)

Change-Id: I4cbda8bc1922fbdd4dac8de8d02294bad74b8058
Showing 44 changed files with 1779 additions and 70 deletions
...@@ -30,7 +30,6 @@ import org.onosproject.net.ConnectPoint; ...@@ -30,7 +30,6 @@ import org.onosproject.net.ConnectPoint;
30 import org.onosproject.net.Device; 30 import org.onosproject.net.Device;
31 import org.onosproject.net.Host; 31 import org.onosproject.net.Host;
32 import org.onosproject.net.Link; 32 import org.onosproject.net.Link;
33 -import org.onosproject.net.OchPort;
34 import org.onosproject.net.OduCltPort; 33 import org.onosproject.net.OduCltPort;
35 import org.onosproject.net.OduSignalType; 34 import org.onosproject.net.OduSignalType;
36 import org.onosproject.net.Path; 35 import org.onosproject.net.Path;
...@@ -46,6 +45,7 @@ import org.onosproject.net.intent.IntentState; ...@@ -46,6 +45,7 @@ import org.onosproject.net.intent.IntentState;
46 import org.onosproject.net.intent.OpticalCircuitIntent; 45 import org.onosproject.net.intent.OpticalCircuitIntent;
47 import org.onosproject.net.intent.OpticalConnectivityIntent; 46 import org.onosproject.net.intent.OpticalConnectivityIntent;
48 import org.onosproject.net.intent.PointToPointIntent; 47 import org.onosproject.net.intent.PointToPointIntent;
48 +import org.onosproject.net.optical.OchPort;
49 import org.onosproject.net.topology.LinkWeight; 49 import org.onosproject.net.topology.LinkWeight;
50 import org.onosproject.net.topology.PathService; 50 import org.onosproject.net.topology.PathService;
51 import org.onosproject.net.topology.TopologyEdge; 51 import org.onosproject.net.topology.TopologyEdge;
...@@ -60,6 +60,7 @@ import java.util.Set; ...@@ -60,6 +60,7 @@ import java.util.Set;
60 60
61 import static com.google.common.base.Preconditions.checkArgument; 61 import static com.google.common.base.Preconditions.checkArgument;
62 import static com.google.common.base.Preconditions.checkNotNull; 62 import static com.google.common.base.Preconditions.checkNotNull;
63 +import static org.onosproject.net.optical.device.OpticalDeviceServiceView.opticalView;
63 64
64 /** 65 /**
65 * OpticalPathProvisioner listens for event notifications from the Intent F/W. 66 * OpticalPathProvisioner listens for event notifications from the Intent F/W.
...@@ -100,6 +101,7 @@ public class OpticalPathProvisioner { ...@@ -100,6 +101,7 @@ public class OpticalPathProvisioner {
100 101
101 @Activate 102 @Activate
102 protected void activate() { 103 protected void activate() {
104 + deviceService = opticalView(deviceService);
103 intentService.addListener(pathProvisioner); 105 intentService.addListener(pathProvisioner);
104 appId = coreService.registerApplication("org.onosproject.optical"); 106 appId = coreService.registerApplication("org.onosproject.optical");
105 initOpticalPorts(); 107 initOpticalPorts();
......
...@@ -21,7 +21,6 @@ import org.apache.karaf.shell.commands.Option; ...@@ -21,7 +21,6 @@ import org.apache.karaf.shell.commands.Option;
21 import org.onosproject.net.CltSignalType; 21 import org.onosproject.net.CltSignalType;
22 import org.onosproject.net.ConnectPoint; 22 import org.onosproject.net.ConnectPoint;
23 import org.onosproject.net.Device; 23 import org.onosproject.net.Device;
24 -import org.onosproject.net.OchPort;
25 import org.onosproject.net.OduCltPort; 24 import org.onosproject.net.OduCltPort;
26 import org.onosproject.net.DeviceId; 25 import org.onosproject.net.DeviceId;
27 import org.onosproject.net.OduSignalType; 26 import org.onosproject.net.OduSignalType;
...@@ -32,10 +31,12 @@ import org.onosproject.net.intent.IntentService; ...@@ -32,10 +31,12 @@ import org.onosproject.net.intent.IntentService;
32 import org.onosproject.net.intent.OpticalCircuitIntent; 31 import org.onosproject.net.intent.OpticalCircuitIntent;
33 import org.onosproject.net.intent.OpticalConnectivityIntent; 32 import org.onosproject.net.intent.OpticalConnectivityIntent;
34 import org.onosproject.net.intent.OpticalOduIntent; 33 import org.onosproject.net.intent.OpticalOduIntent;
34 +import org.onosproject.net.optical.OchPort;
35 35
36 import java.util.List; 36 import java.util.List;
37 37
38 import static com.google.common.base.Preconditions.checkArgument; 38 import static com.google.common.base.Preconditions.checkArgument;
39 +import static org.onosproject.net.optical.device.OpticalDeviceServiceView.opticalView;
39 40
40 /** 41 /**
41 * Installs optical connectivity or circuit intents, depending on given port types. 42 * Installs optical connectivity or circuit intents, depending on given port types.
...@@ -93,7 +94,8 @@ public class AddOpticalIntentCommand extends ConnectivityIntentCommand { ...@@ -93,7 +94,8 @@ public class AddOpticalIntentCommand extends ConnectivityIntentCommand {
93 return; 94 return;
94 } 95 }
95 96
96 - DeviceService deviceService = get(DeviceService.class); 97 + DeviceService deviceService = opticalView(get(DeviceService.class));
98 +
97 Port srcPort = deviceService.getPort(ingress.deviceId(), ingress.port()); 99 Port srcPort = deviceService.getPort(ingress.deviceId(), ingress.port());
98 Port dstPort = deviceService.getPort(egress.deviceId(), egress.port()); 100 Port dstPort = deviceService.getPort(egress.deviceId(), egress.port());
99 101
...@@ -142,6 +144,19 @@ public class AddOpticalIntentCommand extends ConnectivityIntentCommand { ...@@ -142,6 +144,19 @@ public class AddOpticalIntentCommand extends ConnectivityIntentCommand {
142 .signalType(signalType) 144 .signalType(signalType)
143 .bidirectional(bidirectional) 145 .bidirectional(bidirectional)
144 .build(); 146 .build();
147 + } else if (srcPort instanceof org.onosproject.net.OchPort &&
148 + dstPort instanceof org.onosproject.net.OchPort) {
149 + print("WARN: encountered old OchPort model");
150 + // old OchPort model can be removed when ready
151 + OduSignalType signalType = ((org.onosproject.net.OchPort) srcPort).signalType();
152 + intent = OpticalConnectivityIntent.builder()
153 + .appId(appId())
154 + .key(key())
155 + .src(ingress)
156 + .dst(egress)
157 + .signalType(signalType)
158 + .bidirectional(bidirectional)
159 + .build();
145 } else { 160 } else {
146 print("Unable to create optical intent between connect points %s and %s", ingress, egress); 161 print("Unable to create optical intent between connect points %s and %s", ingress, egress);
147 return; 162 return;
......
...@@ -25,19 +25,20 @@ import org.apache.karaf.shell.commands.Option; ...@@ -25,19 +25,20 @@ import org.apache.karaf.shell.commands.Option;
25 import org.onlab.util.Frequency; 25 import org.onlab.util.Frequency;
26 import org.onosproject.utils.Comparators; 26 import org.onosproject.utils.Comparators;
27 import org.onosproject.net.Device; 27 import org.onosproject.net.Device;
28 -import org.onosproject.net.OchPort;
29 import org.onosproject.net.OduCltPort; 28 import org.onosproject.net.OduCltPort;
30 import org.onosproject.net.OmsPort; 29 import org.onosproject.net.OmsPort;
31 import org.onosproject.net.OtuPort; 30 import org.onosproject.net.OtuPort;
32 import org.onosproject.net.Port; 31 import org.onosproject.net.Port;
33 import org.onosproject.net.PortNumber; 32 import org.onosproject.net.PortNumber;
34 import org.onosproject.net.device.DeviceService; 33 import org.onosproject.net.device.DeviceService;
35 - 34 +import org.onosproject.net.optical.OchPort;
35 +import org.onosproject.net.optical.OpticalDevice;
36 import java.util.ArrayList; 36 import java.util.ArrayList;
37 import java.util.Collections; 37 import java.util.Collections;
38 import java.util.List; 38 import java.util.List;
39 39
40 import static org.onosproject.net.DeviceId.deviceId; 40 import static org.onosproject.net.DeviceId.deviceId;
41 +import static org.onosproject.net.optical.device.OpticalDeviceServiceView.opticalView;
41 42
42 /** 43 /**
43 * Lists all ports or all ports of a device. 44 * Lists all ports or all ports of a device.
...@@ -65,7 +66,7 @@ public class DevicePortsListCommand extends DevicesListCommand { ...@@ -65,7 +66,7 @@ public class DevicePortsListCommand extends DevicesListCommand {
65 66
66 @Override 67 @Override
67 protected void execute() { 68 protected void execute() {
68 - DeviceService service = get(DeviceService.class); 69 + DeviceService service = opticalView(get(DeviceService.class));
69 if (uri == null) { 70 if (uri == null) {
70 if (outputJson()) { 71 if (outputJson()) {
71 print("%s", jsonPorts(service, getSortedDevices(service))); 72 print("%s", jsonPorts(service, getSortedDevices(service)));
...@@ -154,9 +155,36 @@ public class DevicePortsListCommand extends DevicesListCommand { ...@@ -154,9 +155,36 @@ public class DevicePortsListCommand extends DevicesListCommand {
154 String annotations = annotations(port.annotations()); 155 String annotations = annotations(port.annotations());
155 switch (port.type()) { 156 switch (port.type()) {
156 case OCH: 157 case OCH:
158 + if (port instanceof org.onosproject.net.OchPort) {
159 + // old OchPort model
160 + org.onosproject.net.OchPort oPort = (org.onosproject.net.OchPort) port;
161 + print("WARN: OchPort in old model");
162 + print(FMT_OCH, portName, portIsEnabled, portType,
163 + oPort.signalType().toString(),
164 + oPort.isTunable() ? "yes" : "no", annotations);
165 + break;
166 + }
167 + if (port instanceof OchPort) {
168 + OchPort och = (OchPort) port;
169 + print(FMT_OCH, portName, portIsEnabled, portType,
170 + och.signalType().toString(),
171 + och.isTunable() ? "yes" : "no", annotations);
172 + break;
173 + } else if (port.element().is(OpticalDevice.class)) {
174 + // Note: should never reach here, but
175 + // leaving it here as an example to
176 + // manually translate to specific port.
177 + OpticalDevice optDevice = port.element().as(OpticalDevice.class);
178 + if (optDevice.portIs(port, OchPort.class)) {
179 + OchPort och = optDevice.portAs(port, OchPort.class).get();
157 print(FMT_OCH, portName, portIsEnabled, portType, 180 print(FMT_OCH, portName, portIsEnabled, portType,
158 - ((OchPort) port).signalType().toString(), 181 + och.signalType().toString(),
159 - ((OchPort) port).isTunable() ? "yes" : "no", annotations); 182 + och.isTunable() ? "yes" : "no", annotations);
183 + break;
184 + }
185 + }
186 + print("WARN: OchPort but not on OpticalDevice or ill-formed");
187 + print(FMT, portName, portIsEnabled, portType, port.portSpeed(), annotations);
160 break; 188 break;
161 case ODUCLT: 189 case ODUCLT:
162 print(FMT_ODUCLT_OTU, portName, portIsEnabled, portType, 190 print(FMT_ODUCLT_OTU, portName, portIsEnabled, portType,
......
...@@ -24,7 +24,10 @@ import static com.google.common.base.Preconditions.checkNotNull; ...@@ -24,7 +24,10 @@ import static com.google.common.base.Preconditions.checkNotNull;
24 * Implementation of OCh port (Optical Channel). 24 * Implementation of OCh port (Optical Channel).
25 * Also referred to as a line side port (L-port) or narrow band port. 25 * Also referred to as a line side port (L-port) or narrow band port.
26 * See ITU G.709 "Interfaces for the Optical Transport Network (OTN)" 26 * See ITU G.709 "Interfaces for the Optical Transport Network (OTN)"
27 + *
28 + * @deprecated in Goldeneye (1.6.0)
27 */ 29 */
30 +@Deprecated
28 public class OchPort extends DefaultPort { 31 public class OchPort extends DefaultPort {
29 32
30 private final OduSignalType signalType; 33 private final OduSignalType signalType;
......
...@@ -37,7 +37,7 @@ public class DefaultPortDescription extends AbstractDescription ...@@ -37,7 +37,7 @@ public class DefaultPortDescription extends AbstractDescription
37 private final long portSpeed; 37 private final long portSpeed;
38 38
39 /** 39 /**
40 - * Creates a port description using the supplied information. 40 + * Creates a DEFAULT_SPEED COPPER port description using the supplied information.
41 * 41 *
42 * @param number port number 42 * @param number port number
43 * @param isEnabled port enabled state 43 * @param isEnabled port enabled state
......
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
16 package org.onosproject.net.device; 16 package org.onosproject.net.device;
17 17
18 import com.google.common.base.MoreObjects; 18 import com.google.common.base.MoreObjects;
19 +
19 import org.onosproject.net.OchSignal; 20 import org.onosproject.net.OchSignal;
20 import org.onosproject.net.OduSignalType; 21 import org.onosproject.net.OduSignalType;
21 import org.onosproject.net.Port; 22 import org.onosproject.net.Port;
...@@ -26,7 +27,10 @@ import static com.google.common.base.Preconditions.checkNotNull; ...@@ -26,7 +27,10 @@ import static com.google.common.base.Preconditions.checkNotNull;
26 27
27 /** 28 /**
28 * Default implementation of immutable OCh port description. 29 * Default implementation of immutable OCh port description.
30 + *
31 + * @deprecated in Goldeneye (1.6.0)
29 */ 32 */
33 +@Deprecated
30 public class OchPortDescription extends DefaultPortDescription { 34 public class OchPortDescription extends DefaultPortDescription {
31 35
32 private final OduSignalType signalType; 36 private final OduSignalType signalType;
...@@ -42,7 +46,10 @@ public class OchPortDescription extends DefaultPortDescription { ...@@ -42,7 +46,10 @@ public class OchPortDescription extends DefaultPortDescription {
42 * @param isTunable tunable wavelength capability 46 * @param isTunable tunable wavelength capability
43 * @param lambda OCh signal 47 * @param lambda OCh signal
44 * @param annotations optional key/value annotations map 48 * @param annotations optional key/value annotations map
49 + *
50 + * @deprecated in Goldeneye (1.6.0)
45 */ 51 */
52 + @Deprecated
46 public OchPortDescription(PortNumber number, boolean isEnabled, OduSignalType signalType, 53 public OchPortDescription(PortNumber number, boolean isEnabled, OduSignalType signalType,
47 boolean isTunable, OchSignal lambda, SparseAnnotations... annotations) { 54 boolean isTunable, OchSignal lambda, SparseAnnotations... annotations) {
48 super(number, isEnabled, Port.Type.OCH, 0, annotations); 55 super(number, isEnabled, Port.Type.OCH, 0, annotations);
...@@ -59,7 +66,10 @@ public class OchPortDescription extends DefaultPortDescription { ...@@ -59,7 +66,10 @@ public class OchPortDescription extends DefaultPortDescription {
59 * @param isTunable tunable wavelength capability 66 * @param isTunable tunable wavelength capability
60 * @param lambda OCh signal 67 * @param lambda OCh signal
61 * @param annotations optional key/value annotations map 68 * @param annotations optional key/value annotations map
69 + *
70 + * @deprecated in Goldeneye (1.6.0)
62 */ 71 */
72 + @Deprecated
63 public OchPortDescription(PortDescription base, OduSignalType signalType, boolean isTunable, 73 public OchPortDescription(PortDescription base, OduSignalType signalType, boolean isTunable,
64 OchSignal lambda, SparseAnnotations annotations) { 74 OchSignal lambda, SparseAnnotations annotations) {
65 super(base, annotations); 75 super(base, annotations);
......
1 +/*
2 + * Copyright 2016 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.onosproject.net.optical;
17 +
18 +import org.onosproject.net.OchSignal;
19 +import org.onosproject.net.OduSignalType;
20 +import org.onosproject.net.Port;
21 +
22 +import com.google.common.annotations.Beta;
23 +
24 +/**
25 + * OCh port (Optical Channel).
26 + * Also referred to as a line side port (L-port) or narrow band port.
27 + * See ITU G.709 "Interfaces for the Optical Transport Network (OTN)"
28 + */
29 +@Beta
30 +public interface OchPort extends Port {
31 +
32 + /**
33 + * Returns ODU signal type.
34 + *
35 + * @return ODU signal type
36 + */
37 + public OduSignalType signalType();
38 +
39 + /**
40 + * Returns true if port is wavelength tunable.
41 + *
42 + * @return tunable wavelength capability
43 + */
44 + public boolean isTunable();
45 +
46 + /**
47 + * Returns OCh signal.
48 + *
49 + * @return OCh signal
50 + */
51 + public OchSignal lambda();
52 +
53 +}
1 +/*
2 + * Copyright 2016 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.onosproject.net.optical;
17 +
18 +import java.util.Optional;
19 +
20 +import org.onosproject.net.Device;
21 +import org.onosproject.net.Port;
22 +import org.onosproject.net.driver.Behaviour;
23 +
24 +import com.google.common.annotations.Beta;
25 +
26 +
27 +// TODO consider more fine grained device type. e.g., Transponder, WSS, ROADM
28 +/**
29 + * Representation of a optical network infrastructure device.
30 + */
31 +@Beta
32 +public interface OpticalDevice extends Device, Behaviour {
33 +
34 + /**
35 + * Returns true if {@code port} is capable of being projected as the
36 + * specified class.
37 + *
38 + * @param port Port instance to test
39 + * @param portClass requested projection class
40 + * @param <T> type of Port
41 + * @return true if the requested projection is supported
42 + */
43 + <T extends Port> boolean portIs(Port port, Class<T> portClass);
44 +
45 + /**
46 + * Returns the specified projection of the {@code port} if such projection
47 + * is supported.
48 + *
49 + * @param port Port instance to project
50 + * @param portClass requested projection class
51 + * @param <T> type of Port
52 + * @return projection instance or empty if not supported.
53 + */
54 + <T extends Port> Optional<T> portAs(Port port, Class<T> portClass);
55 +
56 + /**
57 + * Returns most specific projection of the {@code port} or the {@code port}
58 + * itself.
59 + *
60 + * @param port Port instance
61 + * @return projection instance or {@code port} itself
62 + */
63 + Port port(Port port);
64 +
65 +}
1 +/*
2 + * Copyright 2016 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.onosproject.net.optical.device;
17 +
18 +import static com.google.common.base.Preconditions.checkNotNull;
19 +import static com.google.common.base.Preconditions.checkState;
20 +import static org.slf4j.LoggerFactory.getLogger;
21 +
22 +import java.util.Map;
23 +import java.util.Optional;
24 +import org.onlab.osgi.DefaultServiceDirectory;
25 +import org.onosproject.net.Device;
26 +import org.onosproject.net.Port;
27 +import org.onosproject.net.device.DeviceService;
28 +import org.onosproject.net.driver.AbstractBehaviour;
29 +import org.onosproject.net.driver.DriverData;
30 +import org.onosproject.net.optical.OchPort;
31 +import org.onosproject.net.optical.OpticalDevice;
32 +import org.onosproject.net.optical.device.port.OchPortMapper;
33 +import org.onosproject.net.optical.device.port.PortMapper;
34 +import org.onosproject.net.optical.utils.ForwardingDevice;
35 +import org.slf4j.Logger;
36 +
37 +import com.google.common.annotations.Beta;
38 +import com.google.common.base.MoreObjects;
39 +import com.google.common.collect.ImmutableMap;
40 +
41 +// FIXME This needs to be moved back to org.onosproject.net.optical.impl
42 +// after optical driver package separation process is complete.
43 +/**
44 + * Implementation of {@link OpticalDevice}.
45 + * <p>
46 + * Currently supports
47 + * <ul>
48 + * <li> {@link OchPort}
49 + * </ul>
50 + */
51 +@Beta
52 +public class DefaultOpticalDevice
53 + extends AbstractBehaviour
54 + implements OpticalDevice, ForwardingDevice {
55 +
56 + private static final Logger log = getLogger(DefaultOpticalDevice.class);
57 +
58 + // shared Port type handler map.
59 + // TODO Is there a use case, where we need to differentiate this map per Device?
60 + private static final Map<Class<? extends Port>, PortMapper<? extends Port>> MAPPERS
61 + = ImmutableMap.<Class<? extends Port>, PortMapper<? extends Port>>builder()
62 + .put(OchPort.class, new OchPortMapper())
63 + // TODO add other optical port type here
64 + .build();
65 +
66 +
67 +
68 + // effectively final
69 + private Device delegate;
70 +
71 + // Default constructor required as a Behaviour.
72 + public DefaultOpticalDevice() {}
73 +
74 + @Override
75 + public Device delegate() {
76 + if (delegate == null) {
77 + // dirty work around.
78 + // wanted to pass delegate Device at construction,
79 + // but was not possible. A Behaviour requires no-arg constructor.
80 + checkState(data() != null, "DriverData must exist");
81 + DriverData data = data();
82 + DeviceService service = DefaultServiceDirectory.getService(DeviceService.class);
83 + delegate = checkNotNull(service.getDevice(data.deviceId()),
84 + "No Device found for %s", data.deviceId());
85 + }
86 + return delegate;
87 + }
88 +
89 + @Override
90 + public <T extends Port> boolean portIs(Port port, Class<T> portClass) {
91 +
92 + PortMapper<? extends Port> mapper = MAPPERS.get(portClass);
93 + if (mapper != null) {
94 + return mapper.is(port);
95 + }
96 + return false;
97 + }
98 +
99 + @Override
100 + public <T extends Port> Optional<T> portAs(Port port, Class<T> portClass) {
101 + PortMapper<? extends Port> mapper = MAPPERS.get(portClass);
102 + if (mapper != null) {
103 + return (Optional<T>) (mapper.as(port));
104 + }
105 + return Optional.empty();
106 + }
107 +
108 + @Override
109 + public Port port(Port port) {
110 + for (PortMapper<? extends Port> mapper : MAPPERS.values()) {
111 + if (mapper.is(port)) {
112 + return mapper.as(port).map(Port.class::cast).orElse(port);
113 + }
114 + }
115 + return port;
116 + }
117 +
118 + @Override
119 + public boolean equals(Object obj) {
120 + return delegate().equals(obj);
121 + }
122 +
123 + @Override
124 + public int hashCode() {
125 + return delegate().hashCode();
126 + }
127 +
128 + @Override
129 + public String toString() {
130 + return MoreObjects.toStringHelper(this)
131 + .add("delegate", delegate)
132 + .toString();
133 + }
134 +}
1 +/*
2 + * Copyright 2016 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.onosproject.net.optical.device;
17 +
18 +import static org.slf4j.LoggerFactory.getLogger;
19 +
20 +import java.io.IOException;
21 +import java.util.Optional;
22 +
23 +import org.onosproject.net.Annotations;
24 +import org.onosproject.net.DefaultAnnotations;
25 +import org.onosproject.net.DefaultAnnotations.Builder;
26 +import org.onosproject.net.OchSignal;
27 +import org.onosproject.net.OduSignalType;
28 +import org.onosproject.net.Port;
29 +import org.onosproject.net.PortNumber;
30 +import org.onosproject.net.SparseAnnotations;
31 +import org.onosproject.net.device.DefaultPortDescription;
32 +import org.onosproject.net.device.PortDescription;
33 +import org.onosproject.net.optical.OchPort;
34 +import org.onosproject.net.optical.impl.DefaultOchPort;
35 +import org.onosproject.net.optical.json.OchSignalCodec;
36 +import org.slf4j.Logger;
37 +
38 +import com.fasterxml.jackson.databind.ObjectMapper;
39 +import com.fasterxml.jackson.databind.node.ObjectNode;
40 +import com.google.common.annotations.Beta;
41 +
42 +/**
43 + * OCh port related helpers.
44 + */
45 +@Beta
46 +public final class OchPortHelper {
47 +
48 + private static final Logger log = getLogger(OchPortHelper.class);
49 +
50 + private static final ObjectMapper MAPPER = new ObjectMapper();
51 +
52 + // Annotation keys
53 + private static final String SIGNAL_TYPE = "signalType";
54 + private static final String TUNABLE = "tunable";
55 + private static final String LAMBDA = "lambda";
56 +
57 + /**
58 + * Creates OCh port DefaultPortDescription based on the supplied information.
59 + *
60 + * @param number port number
61 + * @param isEnabled port enabled state
62 + * @param signalType ODU signal type
63 + * @param isTunable tunable wavelength capability
64 + * @param lambda OCh signal
65 + * @return OCh port DefaultPortDescription with OCh annotations
66 + */
67 + public static PortDescription ochPortDescription(PortNumber number,
68 + boolean isEnabled,
69 + OduSignalType signalType,
70 + boolean isTunable,
71 + OchSignal lambda) {
72 + return ochPortDescription(number, isEnabled, signalType, isTunable, lambda, DefaultAnnotations.EMPTY);
73 + }
74 +
75 + /**
76 + * Creates OCh port DefaultPortDescription based on the supplied information.
77 + *
78 + * @param number port number
79 + * @param isEnabled port enabled state
80 + * @param signalType ODU signal type
81 + * @param isTunable tunable wavelength capability
82 + * @param lambda OCh signal
83 + * @param annotationsIn key/value annotations map
84 + * @return OCh port DefaultPortDescription with OCh annotations
85 + */
86 + public static PortDescription ochPortDescription(PortNumber number,
87 + boolean isEnabled,
88 + OduSignalType signalType,
89 + boolean isTunable,
90 + OchSignal lambda,
91 + SparseAnnotations annotationsIn) {
92 +
93 + Builder builder = DefaultAnnotations.builder();
94 + builder.putAll(annotationsIn);
95 +
96 + builder.set(TUNABLE, String.valueOf(isTunable));
97 + builder.set(LAMBDA, OchSignalCodec.encode(lambda).toString());
98 + builder.set(SIGNAL_TYPE, signalType.toString());
99 +
100 + DefaultAnnotations annotations = builder.build();
101 + long portSpeed = 0; // FIXME assign appropriate value
102 + return new DefaultPortDescription(number, isEnabled, Port.Type.OCH, portSpeed, annotations);
103 + }
104 +
105 + /**
106 + * Creates OCh port DefaultPortDescription based on the supplied information.
107 + *
108 + * @param base PortDescription to get basic information from
109 + * @param signalType ODU signal type
110 + * @param isTunable tunable wavelength capability
111 + * @param lambda OCh signal
112 + * @param annotations key/value annotations map
113 + * @return OCh port DefaultPortDescription with OCh annotations
114 + */
115 + public static PortDescription ochPortDescription(PortDescription base,
116 + OduSignalType signalType,
117 + boolean isTunable,
118 + OchSignal lambda,
119 + SparseAnnotations annotations) {
120 + return ochPortDescription(base.portNumber(), base.isEnabled(), signalType, isTunable, lambda, annotations);
121 + }
122 +
123 +
124 + public static Optional<OchPort> asOchPort(Port port) {
125 + if (port instanceof OchPort) {
126 + return Optional.of((OchPort) port);
127 + }
128 +
129 + try {
130 + Annotations an = port.annotations();
131 +
132 + OduSignalType signalType = Enum.valueOf(OduSignalType.class,
133 + an.value(SIGNAL_TYPE));
134 +
135 + boolean isTunable = Boolean.valueOf(an.value(TUNABLE));
136 +
137 + ObjectNode obj = (ObjectNode) MAPPER.readTree(an.value(LAMBDA));
138 + OchSignal lambda = OchSignalCodec.decode(obj);
139 +
140 + // Note: OCh specific annotations is not filtered-out here.
141 + // DefaultOchPort should filter them, if necessary.
142 + return Optional.of(new DefaultOchPort(port, signalType, isTunable, lambda));
143 +
144 + // TODO: it'll be better to verify each inputs properly
145 + // instead of catching all these Exceptions.
146 + } catch (IOException | NullPointerException
147 + | IllegalArgumentException | ClassCastException e) {
148 +
149 + log.warn("{} was not well-formed OCh port.", port, e);
150 + return Optional.empty();
151 + }
152 + }
153 +
154 + // not meant to be instantiated
155 + private OchPortHelper() {}
156 +}
1 +/*
2 + * Copyright 2016 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.onosproject.net.optical.device;
17 +
18 +import static org.slf4j.LoggerFactory.getLogger;
19 +
20 +import java.util.List;
21 +import java.util.Map;
22 +import java.util.Optional;
23 +
24 +import org.onosproject.net.device.DeviceEvent;
25 +import org.onosproject.net.device.DeviceListener;
26 +import org.onosproject.net.device.DeviceService;
27 +import org.onosproject.net.optical.OpticalDevice;
28 +import org.onosproject.net.optical.utils.ForwardingDeviceService;
29 +import org.slf4j.Logger;
30 +
31 +import com.google.common.annotations.Beta;
32 +import com.google.common.cache.CacheBuilder;
33 +import com.google.common.cache.CacheLoader;
34 +import com.google.common.cache.LoadingCache;
35 +import com.google.common.collect.Lists;
36 +import com.google.common.collect.Maps;
37 +
38 +import org.apache.commons.lang3.tuple.Pair;
39 +import org.onosproject.net.DeviceId;
40 +import org.onosproject.net.Element;
41 +import org.onosproject.net.Port;
42 +import org.onosproject.net.PortNumber;
43 +
44 +
45 +// TODO replace places using DeviceService expecting Optical specific ports.
46 +// with this
47 +
48 +/**
49 + * Decorator, which provides a DeviceService view, which returns
50 + * Ports in optical specific ports.
51 + */
52 +@Beta
53 +public class OpticalDeviceServiceView
54 + extends ForwardingDeviceService
55 + implements DeviceService {
56 +
57 + private static final Logger log = getLogger(OpticalDeviceServiceView.class);
58 +
59 + /**
60 + * DeviceListener to wrapped DeviceListener map.
61 + * <p>
62 + * {@literal original listener -> wrapped listener}
63 + */
64 + private final Map<DeviceListener, DeviceListener> wrapped = Maps.newIdentityHashMap();
65 +
66 + // May need a way to monitor Drivers loaded on ONOS and
67 + // invalidate this Cache if a driver was added/updated
68 + /**
69 + * Device to {@link OpticalDevice} map cache.
70 + */
71 + private final LoadingCache<Element, Optional<OpticalDevice>> optdev
72 + = CacheBuilder.newBuilder()
73 + .weakKeys() // == for Key comparison
74 + .maximumSize(100)
75 + .build(CacheLoader.from(elm -> {
76 + if (elm.is(OpticalDevice.class)) {
77 + return Optional.of(elm.as(OpticalDevice.class));
78 + } else {
79 + return Optional.empty();
80 + }
81 + }));
82 +
83 + // Not intended to be instantiated directly
84 + protected OpticalDeviceServiceView(DeviceService base) {
85 + super(base);
86 + }
87 +
88 + /**
89 + * Wraps the given DeviceService to provide a view,
90 + * which returns port as optical specific Port class.
91 + *
92 + * @param base {@link DeviceService} view to use as baseline.
93 + * @return Decorated view of {@code base}
94 + */
95 + public static OpticalDeviceServiceView opticalView(DeviceService base) {
96 + // TODO might make sense to track and assign an instance for each `base`
97 + return new OpticalDeviceServiceView(base);
98 + }
99 +
100 + /**
101 + * Transform Port instance on the event to Optical specific port, if it is well-formed.
102 + *
103 + * @param event original event to transform
104 + * @return transformed {@link DeviceEvent}
105 + */
106 + public DeviceEvent augment(DeviceEvent event) {
107 + final Port port = augment(event.port());
108 + if (port == event.port()) {
109 + // If the Port not changed, pass through
110 + return event;
111 + }
112 + return new DeviceEvent(event.type(), event.subject(), port, event.time());
113 + }
114 +
115 + /**
116 + * Transform Port instance to Optical specific port, if it is well-formed.
117 + *
118 + * @param port Port instance to translate
119 + * @return Optical specific port instance or original {@code port}.
120 + */
121 + public Port augment(Port port) {
122 + if (port == null) {
123 + return null;
124 + }
125 + return optdev.getUnchecked(port.element())
126 + .map(odev -> odev.port(port))
127 + .orElse(port);
128 + }
129 +
130 + @Override
131 + public void addListener(DeviceListener listener) {
132 + super.addListener(wrapped.computeIfAbsent(listener, OpticalDeviceListener::new));
133 + }
134 +
135 + @Override
136 + public void removeListener(DeviceListener listener) {
137 + DeviceListener wrappedListener = wrapped.remove(listener);
138 + if (wrappedListener != null) {
139 + super.removeListener(wrappedListener);
140 + }
141 + }
142 +
143 +
144 + @Override
145 + public List<Port> getPorts(DeviceId deviceId) {
146 + return Lists.transform(super.getPorts(deviceId),
147 + this::augment);
148 + }
149 +
150 + @Override
151 + public Port getPort(DeviceId deviceId, PortNumber portNumber) {
152 + return augment(super.getPort(deviceId, portNumber));
153 + }
154 +
155 +
156 + /**
157 + * DeviceListener, which translates generic Port to optical specific Port
158 + * before passing.
159 + */
160 + class OpticalDeviceListener implements DeviceListener {
161 +
162 + private final DeviceListener listener;
163 +
164 + // shallow cache to reuse transformed event in isRelevant and event call
165 + private Pair<DeviceEvent, DeviceEvent> cache;
166 +
167 + public OpticalDeviceListener(DeviceListener listener) {
168 + this.listener = listener;
169 + }
170 +
171 + private DeviceEvent opticalEvent(DeviceEvent event) {
172 +
173 + Pair<DeviceEvent, DeviceEvent> entry = cache;
174 + if (entry != null && entry.getLeft() == event) {
175 + return entry.getRight();
176 + }
177 +
178 + DeviceEvent opticalEvent = augment(event);
179 + cache = Pair.of(event, opticalEvent);
180 + return opticalEvent;
181 + }
182 +
183 + @Override
184 + public boolean isRelevant(DeviceEvent event) {
185 + return listener.isRelevant(opticalEvent(event));
186 + }
187 +
188 + @Override
189 + public void event(DeviceEvent event) {
190 + listener.event(opticalEvent(event));
191 + }
192 + }
193 +
194 +}
1 +/*
2 + * Copyright 2016 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 +
17 +/**
18 + * Optical device models.
19 + */
20 +package org.onosproject.net.optical.device;
1 +/*
2 + * Copyright 2016-present 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.onosproject.net.optical.device.port;
17 +
18 +import java.util.Optional;
19 +
20 +import org.onosproject.net.Port;
21 +
22 +import com.google.common.annotations.Beta;
23 +import com.google.common.cache.CacheBuilder;
24 +import com.google.common.cache.CacheLoader;
25 +import com.google.common.cache.LoadingCache;
26 +
27 +/**
28 + * PortMapper which caches mapped Port instance.
29 + */
30 +@Beta
31 +public abstract class AbstractPortMapper<P extends Port> implements PortMapper<P> {
32 +
33 + private final LoadingCache<Port, Optional<P>> cache
34 + = CacheBuilder.newBuilder()
35 + .weakKeys() // use == to compare keys
36 + .maximumSize(100)
37 + .build(CacheLoader.from(this::mapPort));
38 +
39 + /**
40 + * {@inheritDoc}
41 + *
42 + * <p>
43 + * Note: Subclasses should override and implement short-cut conditions
44 + * and call {@code super.is(port)}.
45 + */
46 + @Override
47 + public boolean is(Port port) {
48 + return as(port).isPresent();
49 + }
50 +
51 + /**
52 + * {@inheritDoc}
53 + *
54 + * <p>
55 + * Note: Subclasses should override and check if {@code port} is
56 + * already of type {@code P} and directly return {@code Optional.of((P) port)},
57 + * if not call {@code super.as(port)}.
58 + */
59 + @Override
60 + public Optional<P> as(Port port) {
61 + if (port == null) {
62 + return Optional.empty();
63 + }
64 + return cache.getUnchecked(port);
65 + }
66 +
67 + /**
68 + * Returns {@code port} mapped to {@code <P>}.
69 + *
70 + * @param port Port to map
71 + * @return {@code port} mapped to {@code <P>}
72 + */
73 + protected abstract Optional<P> mapPort(Port port);
74 +
75 +}
1 +/*
2 + * Copyright 2016-present 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.onosproject.net.optical.device.port;
17 +
18 +import java.util.Optional;
19 +
20 +import org.onosproject.net.Port;
21 +
22 +import com.google.common.annotations.Beta;
23 +
24 +/**
25 + * {@link PortMapper} which simply return given input.
26 + */
27 +@Beta
28 +public class IdentityMapper implements PortMapper<Port> {
29 +
30 + @Override
31 + public boolean is(Port port) {
32 + return true;
33 + }
34 +
35 + @Override
36 + public Optional<Port> as(Port port) {
37 + return Optional.of(port);
38 + }
39 +}
1 +/*
2 + * Copyright 2016-present 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.onosproject.net.optical.device.port;
17 +
18 +import java.util.Optional;
19 +
20 +import org.onosproject.net.Port;
21 +import org.onosproject.net.optical.OchPort;
22 +import org.onosproject.net.optical.device.OchPortHelper;
23 +import org.onosproject.net.optical.impl.DefaultOchPort;
24 +
25 +import com.google.common.annotations.Beta;
26 +
27 +/**
28 + * {@link PortMapper} to handler {@link OchPort} translation.
29 + */
30 +@Beta
31 +public class OchPortMapper extends AbstractPortMapper<OchPort> {
32 +
33 + @Override
34 + public boolean is(Port port) {
35 + return port != null &&
36 + port.type() == Port.Type.OCH &&
37 + super.is(port);
38 + }
39 +
40 + @Override
41 + public Optional<OchPort> as(Port port) {
42 + if (port instanceof OchPort) {
43 + return Optional.of((OchPort) port);
44 + }
45 + return super.as(port);
46 + }
47 +
48 + @Override
49 + protected Optional<OchPort> mapPort(Port port) {
50 + if (port instanceof OchPort) {
51 + return Optional.of((OchPort) port);
52 + } else if (port instanceof org.onosproject.net.OchPort) {
53 + // TODO remove after deprecation of old OchPort is complete
54 +
55 + // translate to new OchPort
56 + org.onosproject.net.OchPort old = (org.onosproject.net.OchPort) port;
57 + return Optional.of(new DefaultOchPort(old,
58 + old.signalType(),
59 + old.isTunable(),
60 + old.lambda()));
61 + }
62 +
63 + return OchPortHelper.asOchPort(port);
64 + }
65 +}
1 +/*
2 + * Copyright 2016-present 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.onosproject.net.optical.device.port;
17 +
18 +import java.util.Optional;
19 +
20 +import org.onosproject.net.Port;
21 +
22 +import com.google.common.annotations.Beta;
23 +
24 +/**
25 + * Abstraction of a class capable of translating generic-Port object
26 + * as another domain-specific Port of type {@code P}.
27 + *
28 + * @param <P> Port type to map generic Port to
29 + */
30 +@Beta
31 +public interface PortMapper<P extends Port> {
32 +
33 + /**
34 + * Returns true if this port is capable of being projected as {@code <P>}.
35 + */
36 + boolean is(Port port);
37 +
38 + /**
39 + * Returns {@code port} mapped to {@code <P>}.
40 + *
41 + * @param port Port to map
42 + * @return {@code port} mapped to {@code <P>}
43 + */
44 + Optional<P> as(Port port);
45 +}
1 +/*
2 + * Copyright 2016-present 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 +/**
17 + * Optical device port related utilities.
18 + */
19 +package org.onosproject.net.optical.device.port;
1 +/*
2 + * Copyright 2015 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.onosproject.net.optical.impl;
17 +
18 +import org.onosproject.net.Annotations;
19 +import org.onosproject.net.OchSignal;
20 +import org.onosproject.net.OduSignalType;
21 +import org.onosproject.net.Port;
22 +import org.onosproject.net.optical.OchPort;
23 +import org.onosproject.net.optical.utils.ForwardingPort;
24 +
25 +import com.google.common.annotations.Beta;
26 +
27 +import static com.google.common.base.Preconditions.checkNotNull;
28 +
29 +import java.util.Objects;
30 +
31 +/**
32 + * Implementation of OCh port (Optical Channel).
33 + * Also referred to as a line side port (L-port) or narrow band port.
34 + * See ITU G.709 "Interfaces for the Optical Transport Network (OTN)"
35 + */
36 +@Beta
37 +public class DefaultOchPort extends ForwardingPort implements OchPort {
38 +
39 + // Note: try to avoid direct access to the field, use accessor.
40 + // We might want to lazily parse annotation in the future
41 + private final OduSignalType signalType;
42 + private final boolean isTunable;
43 + private final OchSignal lambda;
44 +
45 + /**
46 + * Creates an OCh port in the specified network element.
47 + *
48 + * @param base Port
49 + * @param signalType ODU signal type
50 + * @param isTunable tunable wavelength capability
51 + * @param lambda OCh signal
52 + */
53 + public DefaultOchPort(Port base,
54 + OduSignalType signalType,
55 + boolean isTunable,
56 + OchSignal lambda) {
57 + super(base);
58 + // TODO should this class be parsing annotation to instantiate signalType?
59 + this.signalType = checkNotNull(signalType);
60 + this.isTunable = isTunable;
61 + this.lambda = checkNotNull(lambda);
62 + }
63 +
64 + @Override
65 + public Type type() {
66 + return Type.OCH;
67 + }
68 +
69 + @Override
70 + public long portSpeed() {
71 + return signalType.bitRate();
72 + }
73 +
74 +
75 + @Override
76 + public Annotations annotations() {
77 + // FIXME Filter OCh annotations, after confirming that
78 + // it'll not result in information-loss
79 + return super.annotations();
80 + }
81 +
82 + /**
83 + * Returns ODU signal type.
84 + *
85 + * @return ODU signal type
86 + */
87 + @Override
88 + public OduSignalType signalType() {
89 + return signalType;
90 + }
91 +
92 + /**
93 + * Returns true if port is wavelength tunable.
94 + *
95 + * @return tunable wavelength capability
96 + */
97 + @Override
98 + public boolean isTunable() {
99 + return isTunable;
100 + }
101 +
102 + /**
103 + * Returns OCh signal.
104 + *
105 + * @return OCh signal
106 + */
107 + @Override
108 + public OchSignal lambda() {
109 + return lambda;
110 + }
111 +
112 + @Override
113 + public int hashCode() {
114 + return Objects.hash(super.hashCode(),
115 + signalType(),
116 + isTunable(),
117 + lambda());
118 + }
119 +
120 + @Override
121 + public boolean equals(Object obj) {
122 + if (this == obj) {
123 + return true;
124 + }
125 +
126 + if (obj != null && getClass() == obj.getClass()) {
127 + final DefaultOchPort that = (DefaultOchPort) obj;
128 + return super.toEqualsBuilder(that)
129 + .append(this.signalType(), that.signalType())
130 + .append(this.isTunable(), that.isTunable())
131 + .append(this.lambda(), that.lambda())
132 + .isEquals();
133 + }
134 + return false;
135 + }
136 +
137 + @Override
138 + public String toString() {
139 + return super.toStringHelper()
140 + .add("signalType", signalType())
141 + .add("isTunable", isTunable())
142 + .add("lambda", lambda())
143 + .toString();
144 + }
145 +}
1 +/*
2 + * Copyright 2016 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 +
17 +// Note: All classes in this package is expected to be instance local, and
18 +// are not expected to be serialized (by Kryo, etc.)
19 +/**
20 + * Implementation of Optical augmentation classes.
21 + */
22 +package org.onosproject.net.optical.impl;
1 +/*
2 + * Copyright 2016 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.onosproject.net.optical.json;
17 +
18 +import static com.google.common.base.Preconditions.checkArgument;
19 +
20 +import org.onosproject.net.ChannelSpacing;
21 +import org.onosproject.net.GridType;
22 +import org.onosproject.net.OchSignal;
23 +
24 +import com.fasterxml.jackson.databind.JsonNode;
25 +import com.fasterxml.jackson.databind.ObjectMapper;
26 +import com.fasterxml.jackson.databind.node.ObjectNode;
27 +import com.google.common.annotations.Beta;
28 +
29 +// TODO define common interface for JsonCodec for annotation?
30 +// unlike existing JsonCodec, this use-case requires that encode/decode is
31 +// reversible. (e.g., obj.equals(decode(encode(obj))))
32 +/**
33 + * JSON codec for OchSignal.
34 + */
35 +@Beta
36 +public abstract class OchSignalCodec {
37 +
38 + // TODO should probably use shared mapper across optical codecs.
39 + private static final ObjectMapper MAPPER = new ObjectMapper();
40 +
41 + /**
42 + * Creates an instance of {@link OchSignal} from JSON representation.
43 + *
44 + * @param obj JSON Object representing OchSignal
45 + * @return OchSignal
46 + * @throws IllegalArgumentException - if JSON object is ill-formed
47 + * @see OchSignalCodec#encode(OchSignal)
48 + */
49 + public static OchSignal decode(ObjectNode obj) {
50 + final GridType gridType;
51 + final ChannelSpacing channelSpacing;
52 + final int spacingMultiplier;
53 + final int slotGranularity;
54 +
55 + String s;
56 + s = obj.get("channelSpacing").textValue();
57 + checkArgument(s != null, "ill-formed channelSpacing");
58 + channelSpacing = Enum.valueOf(ChannelSpacing.class, s);
59 +
60 + s = obj.get("gridType").textValue();
61 + checkArgument(s != null, "ill-formed gridType");
62 + gridType = Enum.valueOf(GridType.class, s);
63 +
64 + JsonNode node;
65 + node = obj.get("spacingMultiplier");
66 + checkArgument(node.canConvertToInt(), "ill-formed spacingMultiplier");
67 + spacingMultiplier = node.asInt();
68 +
69 + node = obj.get("slotGranularity");
70 + checkArgument(node.canConvertToInt(), "ill-formed slotGranularity");
71 + slotGranularity = node.asInt();
72 +
73 + return new OchSignal(gridType, channelSpacing, spacingMultiplier, slotGranularity);
74 + }
75 +
76 + /**
77 + * Returns a JSON Object representation of this instance.
78 + *
79 + * @return JSON Object representing OchSignal
80 + */
81 + public static ObjectNode encode(OchSignal j) {
82 + ObjectNode obj = MAPPER.createObjectNode();
83 + obj.put("channelSpacing", j.channelSpacing().toString());
84 + obj.put("gridType", j.gridType().toString());
85 + obj.put("slotGranularity", j.slotGranularity());
86 + obj.put("spacingMultiplier", j.spacingMultiplier());
87 + return obj;
88 + }
89 +
90 +}
1 +/*
2 + * Copyright 2016 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 +
17 +/**
18 + * JSON related utilities.
19 + */
20 +package org.onosproject.net.optical.json;
1 +/*
2 + * Copyright 2016 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 +
17 +// Note: this package sub-tree will be moved out from onos-api bundle soon.
18 +/**
19 + * Optical augmentation classes.
20 + */
21 +package org.onosproject.net.optical;
1 +/*
2 + * Copyright 2016 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.onosproject.net.optical.utils;
17 +
18 +import org.onlab.packet.ChassisId;
19 +import org.onosproject.net.Annotations;
20 +import org.onosproject.net.Device;
21 +import org.onosproject.net.DeviceId;
22 +import org.onosproject.net.driver.Behaviour;
23 +import org.onosproject.net.provider.ProviderId;
24 +
25 +import com.google.common.annotations.Beta;
26 +
27 +/**
28 + * A Device which forwards all its method calls to another Device.
29 + */
30 +@Beta
31 +public interface ForwardingDevice extends Device {
32 +
33 + Device delegate();
34 +
35 + @Override
36 + default Annotations annotations() {
37 + return delegate().annotations();
38 + }
39 +
40 + @Override
41 + default ProviderId providerId() {
42 + return delegate().providerId();
43 + }
44 +
45 + @Override
46 + default <B extends Behaviour> B as(Class<B> projectionClass) {
47 + return delegate().as(projectionClass);
48 + }
49 +
50 + @Override
51 + default DeviceId id() {
52 + return delegate().id();
53 + }
54 +
55 + @Override
56 + default Type type() {
57 + return delegate().type();
58 + }
59 +
60 + @Override
61 + default <B extends Behaviour> boolean is(Class<B> projectionClass) {
62 + return delegate().is(projectionClass);
63 + }
64 +
65 + @Override
66 + default String manufacturer() {
67 + return delegate().manufacturer();
68 + }
69 +
70 + @Override
71 + default String hwVersion() {
72 + return delegate().hwVersion();
73 + }
74 +
75 + @Override
76 + default String swVersion() {
77 + return delegate().swVersion();
78 + }
79 +
80 + @Override
81 + default String serialNumber() {
82 + return delegate().serialNumber();
83 + }
84 +
85 + @Override
86 + default ChassisId chassisId() {
87 + return delegate().chassisId();
88 + }
89 +}
1 +/*
2 + * Copyright 2016 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.onosproject.net.optical.utils;
17 +
18 +import static com.google.common.base.Preconditions.checkNotNull;
19 +
20 +import java.util.List;
21 +
22 +import org.onosproject.net.Device;
23 +import org.onosproject.net.Device.Type;
24 +import org.onosproject.net.DeviceId;
25 +import org.onosproject.net.MastershipRole;
26 +import org.onosproject.net.Port;
27 +import org.onosproject.net.PortNumber;
28 +import org.onosproject.net.device.DeviceListener;
29 +import org.onosproject.net.device.DeviceService;
30 +import org.onosproject.net.device.PortStatistics;
31 +
32 +import com.google.common.annotations.Beta;
33 +
34 +/**
35 + * A DeviceService which forwards all its method calls to another DeviceService.
36 + */
37 +@Beta
38 +public abstract class ForwardingDeviceService implements DeviceService {
39 +
40 + private final DeviceService delegate;
41 +
42 + protected ForwardingDeviceService(DeviceService delegate) {
43 + this.delegate = checkNotNull(delegate);
44 + }
45 +
46 + protected final DeviceService delegate() {
47 + return delegate;
48 + }
49 +
50 + @Override
51 + public void addListener(DeviceListener listener) {
52 + delegate.addListener(listener);
53 + }
54 +
55 + @Override
56 + public void removeListener(DeviceListener listener) {
57 + delegate.removeListener(listener);
58 + }
59 +
60 + @Override
61 + public int getDeviceCount() {
62 + return delegate.getDeviceCount();
63 + }
64 +
65 + @Override
66 + public Iterable<Device> getDevices() {
67 + return delegate.getDevices();
68 + }
69 +
70 + @Override
71 + public Iterable<Device> getDevices(Type type) {
72 + return delegate.getDevices(type);
73 + }
74 +
75 + @Override
76 + public Iterable<Device> getAvailableDevices() {
77 + return delegate.getAvailableDevices();
78 + }
79 +
80 + @Override
81 + public Iterable<Device> getAvailableDevices(Type type) {
82 + return delegate.getAvailableDevices(type);
83 + }
84 +
85 + @Override
86 + public Device getDevice(DeviceId deviceId) {
87 + return delegate.getDevice(deviceId);
88 + }
89 +
90 + @Override
91 + public MastershipRole getRole(DeviceId deviceId) {
92 + return delegate.getRole(deviceId);
93 + }
94 +
95 + @Override
96 + public List<Port> getPorts(DeviceId deviceId) {
97 + return delegate.getPorts(deviceId);
98 + }
99 +
100 + @Override
101 + public List<PortStatistics> getPortStatistics(DeviceId deviceId) {
102 + return delegate.getPortStatistics(deviceId);
103 + }
104 +
105 + @Override
106 + public List<PortStatistics> getPortDeltaStatistics(DeviceId deviceId) {
107 + return delegate.getPortDeltaStatistics(deviceId);
108 + }
109 +
110 + @Override
111 + public Port getPort(DeviceId deviceId, PortNumber portNumber) {
112 + return delegate.getPort(deviceId, portNumber);
113 + }
114 +
115 + @Override
116 + public boolean isAvailable(DeviceId deviceId) {
117 + return delegate.isAvailable(deviceId);
118 + }
119 +
120 +}
1 +/*
2 + * Copyright 2016 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.onosproject.net.optical.utils;
17 +
18 +import static com.google.common.base.Preconditions.checkNotNull;
19 +
20 +import java.util.Objects;
21 +
22 +import org.apache.commons.lang3.builder.EqualsBuilder;
23 +import org.onosproject.net.Annotations;
24 +import org.onosproject.net.Element;
25 +import org.onosproject.net.Port;
26 +import org.onosproject.net.PortNumber;
27 +
28 +import com.google.common.annotations.Beta;
29 +import com.google.common.base.MoreObjects;
30 +import com.google.common.base.MoreObjects.ToStringHelper;
31 +
32 +/**
33 + * A Port which forwards all its method calls to another Port.
34 + */
35 +@Beta
36 +public abstract class ForwardingPort implements Port {
37 +
38 + private final Port delegate;
39 +
40 + protected ForwardingPort(Port delegate) {
41 + this.delegate = checkNotNull(delegate);
42 + }
43 +
44 + @Override
45 + public int hashCode() {
46 + return Objects.hash(element().id(),
47 + number(),
48 + isEnabled(),
49 + type(),
50 + portSpeed(),
51 + annotations());
52 + }
53 +
54 + /**
55 + * Returns {@link EqualsBuilder} comparing all Port attributes
56 + * including annotations.
57 + * <p>
58 + * To add extra fields to equality,
59 + * call {@code super.toEqualsBuilder(..)} and append fields.
60 + * To remove field from comparison, override this method
61 + * or manually implement equals().
62 + */
63 + protected EqualsBuilder toEqualsBuilder(Port that) {
64 + if (that == null) {
65 + return new EqualsBuilder().appendSuper(false);
66 + }
67 + return new EqualsBuilder()
68 + .append(this.element().id(), that.element().id())
69 + .append(this.number(), that.number())
70 + .append(this.isEnabled(), that.isEnabled())
71 + .append(this.type(), that.type())
72 + .append(this.portSpeed(), that.portSpeed())
73 + .append(this.annotations(), that.annotations());
74 + }
75 +
76 + @Override
77 + public boolean equals(Object obj) {
78 + if (this == obj) {
79 + return true;
80 + }
81 +
82 + if (obj != null && getClass() == obj.getClass()) {
83 + final ForwardingPort that = (ForwardingPort) obj;
84 + return toEqualsBuilder(that)
85 + .isEquals();
86 + }
87 + return false;
88 + }
89 +
90 + /**
91 + * Returns {@link ToStringHelper} with Port attributes excluding annotations.
92 + *
93 + * @return {@link ToStringHelper}
94 + */
95 + protected ToStringHelper toStringHelper() {
96 + return MoreObjects.toStringHelper(this)
97 + .add("element", element().id())
98 + .add("number", number())
99 + .add("isEnabled", isEnabled())
100 + .add("type", type())
101 + .add("portSpeed", portSpeed());
102 + }
103 +
104 + @Override
105 + public String toString() {
106 + return toStringHelper()
107 + .toString();
108 + }
109 +
110 + @Override
111 + public Annotations annotations() {
112 + return delegate.annotations();
113 + }
114 +
115 + @Override
116 + public Element element() {
117 + return delegate.element();
118 + }
119 +
120 + @Override
121 + public PortNumber number() {
122 + return delegate.number();
123 + }
124 +
125 + @Override
126 + public boolean isEnabled() {
127 + return delegate.isEnabled();
128 + }
129 +
130 + @Override
131 + public Port.Type type() {
132 + return delegate.type();
133 + }
134 +
135 + @Override
136 + public long portSpeed() {
137 + return delegate.portSpeed();
138 + }
139 +
140 +}
1 +/*
2 + * Copyright 2016 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 +
17 +/**
18 + * Utility classes.
19 + */
20 +package org.onosproject.net.optical.utils;
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
15 */ 15 */
16 package org.onosproject.net.device.impl; 16 package org.onosproject.net.device.impl;
17 17
18 +import static org.onosproject.net.optical.device.OchPortHelper.ochPortDescription;
18 import static org.slf4j.LoggerFactory.getLogger; 19 import static org.slf4j.LoggerFactory.getLogger;
19 import static com.google.common.base.Preconditions.checkNotNull; 20 import static com.google.common.base.Preconditions.checkNotNull;
20 21
...@@ -22,7 +23,6 @@ import org.onosproject.net.config.ConfigOperator; ...@@ -22,7 +23,6 @@ import org.onosproject.net.config.ConfigOperator;
22 import org.onosproject.net.config.basics.OpticalPortConfig; 23 import org.onosproject.net.config.basics.OpticalPortConfig;
23 import org.onosproject.net.AnnotationKeys; 24 import org.onosproject.net.AnnotationKeys;
24 import org.onosproject.net.DefaultAnnotations; 25 import org.onosproject.net.DefaultAnnotations;
25 -import org.onosproject.net.OchPort;
26 import org.onosproject.net.OtuPort; 26 import org.onosproject.net.OtuPort;
27 import org.onosproject.net.OduCltPort; 27 import org.onosproject.net.OduCltPort;
28 import org.onosproject.net.OmsPort; 28 import org.onosproject.net.OmsPort;
...@@ -35,6 +35,8 @@ import org.onosproject.net.device.OduCltPortDescription; ...@@ -35,6 +35,8 @@ import org.onosproject.net.device.OduCltPortDescription;
35 import org.onosproject.net.device.OmsPortDescription; 35 import org.onosproject.net.device.OmsPortDescription;
36 import org.onosproject.net.device.OtuPortDescription; 36 import org.onosproject.net.device.OtuPortDescription;
37 import org.onosproject.net.device.PortDescription; 37 import org.onosproject.net.device.PortDescription;
38 +import org.onosproject.net.optical.OchPort;
39 +import org.onosproject.net.optical.OpticalDevice;
38 import org.slf4j.Logger; 40 import org.slf4j.Logger;
39 41
40 /** 42 /**
...@@ -106,15 +108,20 @@ public final class OpticalPortOperator implements ConfigOperator { ...@@ -106,15 +108,20 @@ public final class OpticalPortOperator implements ConfigOperator {
106 oms.maxFrequency(), oms.grid(), sa); 108 oms.maxFrequency(), oms.grid(), sa);
107 case OCH: 109 case OCH:
108 // We might need to update lambda below with STATIC_LAMBDA. 110 // We might need to update lambda below with STATIC_LAMBDA.
111 + if (descr instanceof OchPortDescription) {
112 + // TODO This block can go away once deprecation is complete.
109 OchPortDescription och = (OchPortDescription) descr; 113 OchPortDescription och = (OchPortDescription) descr;
110 - return new OchPortDescription(port, och.isEnabled(), och.signalType(), 114 + return ochPortDescription(port, och.isEnabled(), och.signalType(),
111 och.isTunable(), och.lambda(), sa); 115 och.isTunable(), och.lambda(), sa);
116 + }
117 + return descr;
112 case ODUCLT: 118 case ODUCLT:
113 OduCltPortDescription odu = (OduCltPortDescription) descr; 119 OduCltPortDescription odu = (OduCltPortDescription) descr;
114 return new OduCltPortDescription(port, odu.isEnabled(), odu.signalType(), sa); 120 return new OduCltPortDescription(port, odu.isEnabled(), odu.signalType(), sa);
115 case PACKET: 121 case PACKET:
116 case FIBER: 122 case FIBER:
117 case COPPER: 123 case COPPER:
124 + // TODO: it should be safe to just return descr. confirm and fix
118 return new DefaultPortDescription(port, descr.isEnabled(), descr.type(), 125 return new DefaultPortDescription(port, descr.isEnabled(), descr.type(),
119 descr.portSpeed(), sa); 126 descr.portSpeed(), sa);
120 case OTU: 127 case OTU:
...@@ -182,9 +189,22 @@ public final class OpticalPortOperator implements ConfigOperator { ...@@ -182,9 +189,22 @@ public final class OpticalPortOperator implements ConfigOperator {
182 return new OmsPortDescription(ptn, isup, oms.minFrequency(), 189 return new OmsPortDescription(ptn, isup, oms.minFrequency(),
183 oms.maxFrequency(), oms.grid(), an); 190 oms.maxFrequency(), oms.grid(), an);
184 case OCH: 191 case OCH:
185 - OchPort och = (OchPort) port; 192 + if (port instanceof org.onosproject.net.OchPort) {
186 - return new OchPortDescription(ptn, isup, och.signalType(), 193 + // remove if-block once old OchPort deprecation is complete
194 + org.onosproject.net.OchPort och = (org.onosproject.net.OchPort) port;
195 + return ochPortDescription(ptn, isup, och.signalType(),
196 + och.isTunable(), och.lambda(), an);
197 + }
198 + if (port.element().is(OpticalDevice.class)) {
199 + OpticalDevice optDevice = port.element().as(OpticalDevice.class);
200 + if (optDevice.portIs(port, OchPort.class)) {
201 + OchPort och = optDevice.portAs(port, OchPort.class).get();
202 + return ochPortDescription(ptn, isup, och.signalType(),
187 och.isTunable(), och.lambda(), an); 203 och.isTunable(), och.lambda(), an);
204 + }
205 + }
206 + return new DefaultPortDescription(ptn, isup, port.type(), port.portSpeed(), an);
207 +
188 case ODUCLT: 208 case ODUCLT:
189 OduCltPort odu = (OduCltPort) port; 209 OduCltPort odu = (OduCltPort) port;
190 return new OduCltPortDescription(ptn, isup, odu.signalType(), an); 210 return new OduCltPortDescription(ptn, isup, odu.signalType(), an);
......
...@@ -32,7 +32,6 @@ import org.onosproject.core.CoreService; ...@@ -32,7 +32,6 @@ import org.onosproject.core.CoreService;
32 import org.onosproject.net.AnnotationKeys; 32 import org.onosproject.net.AnnotationKeys;
33 import org.onosproject.net.CltSignalType; 33 import org.onosproject.net.CltSignalType;
34 import org.onosproject.net.ConnectPoint; 34 import org.onosproject.net.ConnectPoint;
35 -import org.onosproject.net.OchPort;
36 import org.onosproject.net.OduCltPort; 35 import org.onosproject.net.OduCltPort;
37 import org.onosproject.net.OduSignalId; 36 import org.onosproject.net.OduSignalId;
38 import org.onosproject.net.OduSignalType; 37 import org.onosproject.net.OduSignalType;
...@@ -60,6 +59,7 @@ import org.onosproject.net.intent.IntentService; ...@@ -60,6 +59,7 @@ import org.onosproject.net.intent.IntentService;
60 import org.onosproject.net.intent.OpticalCircuitIntent; 59 import org.onosproject.net.intent.OpticalCircuitIntent;
61 import org.onosproject.net.intent.OpticalConnectivityIntent; 60 import org.onosproject.net.intent.OpticalConnectivityIntent;
62 import org.onosproject.net.intent.impl.IntentCompilationException; 61 import org.onosproject.net.intent.impl.IntentCompilationException;
62 +import org.onosproject.net.optical.OchPort;
63 import org.onosproject.net.intent.IntentSetMultimap; 63 import org.onosproject.net.intent.IntentSetMultimap;
64 import org.onosproject.net.resource.ResourceAllocation; 64 import org.onosproject.net.resource.ResourceAllocation;
65 import org.onosproject.net.resource.Resource; 65 import org.onosproject.net.resource.Resource;
...@@ -82,6 +82,7 @@ import java.util.stream.Collectors; ...@@ -82,6 +82,7 @@ import java.util.stream.Collectors;
82 import java.util.stream.Stream; 82 import java.util.stream.Stream;
83 83
84 import static com.google.common.base.Preconditions.checkArgument; 84 import static com.google.common.base.Preconditions.checkArgument;
85 +import static org.onosproject.net.optical.device.OpticalDeviceServiceView.opticalView;
85 86
86 /** 87 /**
87 * An intent compiler for {@link org.onosproject.net.intent.OpticalCircuitIntent}. 88 * An intent compiler for {@link org.onosproject.net.intent.OpticalCircuitIntent}.
...@@ -156,6 +157,7 @@ public class OpticalCircuitIntentCompiler implements IntentCompiler<OpticalCircu ...@@ -156,6 +157,7 @@ public class OpticalCircuitIntentCompiler implements IntentCompiler<OpticalCircu
156 157
157 @Activate 158 @Activate
158 public void activate(ComponentContext context) { 159 public void activate(ComponentContext context) {
160 + deviceService = opticalView(deviceService);
159 appId = coreService.registerApplication("org.onosproject.net.intent"); 161 appId = coreService.registerApplication("org.onosproject.net.intent");
160 intentManager.registerCompiler(OpticalCircuitIntent.class, this); 162 intentManager.registerCompiler(OpticalCircuitIntent.class, this);
161 cfgService.registerProperties(getClass()); 163 cfgService.registerProperties(getClass());
......
...@@ -31,7 +31,6 @@ import org.onosproject.net.ConnectPoint; ...@@ -31,7 +31,6 @@ import org.onosproject.net.ConnectPoint;
31 import org.onosproject.net.DefaultOchSignalComparator; 31 import org.onosproject.net.DefaultOchSignalComparator;
32 import org.onosproject.net.DeviceId; 32 import org.onosproject.net.DeviceId;
33 import org.onosproject.net.Link; 33 import org.onosproject.net.Link;
34 -import org.onosproject.net.OchPort;
35 import org.onosproject.net.OchSignal; 34 import org.onosproject.net.OchSignal;
36 import org.onosproject.net.OchSignalType; 35 import org.onosproject.net.OchSignalType;
37 import org.onosproject.net.Path; 36 import org.onosproject.net.Path;
...@@ -43,6 +42,7 @@ import org.onosproject.net.intent.IntentExtensionService; ...@@ -43,6 +42,7 @@ import org.onosproject.net.intent.IntentExtensionService;
43 import org.onosproject.net.intent.OpticalConnectivityIntent; 42 import org.onosproject.net.intent.OpticalConnectivityIntent;
44 import org.onosproject.net.intent.OpticalPathIntent; 43 import org.onosproject.net.intent.OpticalPathIntent;
45 import org.onosproject.net.intent.impl.IntentCompilationException; 44 import org.onosproject.net.intent.impl.IntentCompilationException;
45 +import org.onosproject.net.optical.OchPort;
46 import org.onosproject.net.resource.ResourceAllocation; 46 import org.onosproject.net.resource.ResourceAllocation;
47 import org.onosproject.net.resource.Resource; 47 import org.onosproject.net.resource.Resource;
48 import org.onosproject.net.resource.ResourceService; 48 import org.onosproject.net.resource.ResourceService;
...@@ -63,6 +63,7 @@ import java.util.stream.Collectors; ...@@ -63,6 +63,7 @@ import java.util.stream.Collectors;
63 import java.util.stream.Stream; 63 import java.util.stream.Stream;
64 64
65 import static com.google.common.base.Preconditions.checkArgument; 65 import static com.google.common.base.Preconditions.checkArgument;
66 +import static org.onosproject.net.optical.device.OpticalDeviceServiceView.opticalView;
66 67
67 /** 68 /**
68 * An intent compiler for {@link org.onosproject.net.intent.OpticalConnectivityIntent}. 69 * An intent compiler for {@link org.onosproject.net.intent.OpticalConnectivityIntent}.
...@@ -88,6 +89,7 @@ public class OpticalConnectivityIntentCompiler implements IntentCompiler<Optical ...@@ -88,6 +89,7 @@ public class OpticalConnectivityIntentCompiler implements IntentCompiler<Optical
88 89
89 @Activate 90 @Activate
90 public void activate() { 91 public void activate() {
92 + deviceService = opticalView(deviceService);
91 intentManager.registerCompiler(OpticalConnectivityIntent.class, this); 93 intentManager.registerCompiler(OpticalConnectivityIntent.class, this);
92 } 94 }
93 95
......
...@@ -31,9 +31,9 @@ import org.onosproject.net.DefaultAnnotations; ...@@ -31,9 +31,9 @@ import org.onosproject.net.DefaultAnnotations;
31 import org.onosproject.net.CltSignalType; 31 import org.onosproject.net.CltSignalType;
32 import org.onosproject.net.ConnectPoint; 32 import org.onosproject.net.ConnectPoint;
33 import org.onosproject.net.DefaultDevice; 33 import org.onosproject.net.DefaultDevice;
34 +import org.onosproject.net.DefaultPort;
34 import org.onosproject.net.Device; 35 import org.onosproject.net.Device;
35 import org.onosproject.net.DeviceId; 36 import org.onosproject.net.DeviceId;
36 -import org.onosproject.net.OchPort;
37 import org.onosproject.net.OchSignal; 37 import org.onosproject.net.OchSignal;
38 import org.onosproject.net.OduCltPort; 38 import org.onosproject.net.OduCltPort;
39 import org.onosproject.net.OduSignalId; 39 import org.onosproject.net.OduSignalId;
...@@ -57,6 +57,8 @@ import org.onosproject.net.intent.IntentServiceAdapter; ...@@ -57,6 +57,8 @@ import org.onosproject.net.intent.IntentServiceAdapter;
57 import org.onosproject.net.intent.Key; 57 import org.onosproject.net.intent.Key;
58 import org.onosproject.net.intent.MockIdGenerator; 58 import org.onosproject.net.intent.MockIdGenerator;
59 import org.onosproject.net.intent.OpticalCircuitIntent; 59 import org.onosproject.net.intent.OpticalCircuitIntent;
60 +import org.onosproject.net.optical.OchPort;
61 +import org.onosproject.net.optical.impl.DefaultOchPort;
60 import org.onosproject.net.provider.ProviderId; 62 import org.onosproject.net.provider.ProviderId;
61 import org.onosproject.net.intent.IntentSetMultimap; 63 import org.onosproject.net.intent.IntentSetMultimap;
62 import org.onosproject.net.behaviour.TributarySlotQuery; 64 import org.onosproject.net.behaviour.TributarySlotQuery;
...@@ -128,11 +130,13 @@ public class OpticalCircuitIntentCompilerTest { ...@@ -128,11 +130,13 @@ public class OpticalCircuitIntentCompilerTest {
128 130
129 // Och ports with signalType=ODU2 131 // Och ports with signalType=ODU2
130 private static final OchPort D1P2 = 132 private static final OchPort D1P2 =
131 - new OchPort(device1, PortNumber.portNumber(2), true, OduSignalType.ODU2, 133 + new DefaultOchPort(new DefaultPort(device1, PortNumber.portNumber(2), true, annotations2),
132 - true, OchSignal.newDwdmSlot(ChannelSpacing.CHL_50GHZ, 1), annotations2); 134 + OduSignalType.ODU2,
135 + true, OchSignal.newDwdmSlot(ChannelSpacing.CHL_50GHZ, 1));
133 private static final OchPort D2P2 = 136 private static final OchPort D2P2 =
134 - new OchPort(device2, PortNumber.portNumber(2), true, OduSignalType.ODU2, 137 + new DefaultOchPort(new DefaultPort(device2, PortNumber.portNumber(2), true, annotations2),
135 - true, OchSignal.newDwdmSlot(ChannelSpacing.CHL_50GHZ, 1), annotations2); 138 + OduSignalType.ODU2,
139 + true, OchSignal.newDwdmSlot(ChannelSpacing.CHL_50GHZ, 1));
136 140
137 // OduClt ports with signalType=10GBE 141 // OduClt ports with signalType=10GBE
138 private static final OduCltPort D1P3 = 142 private static final OduCltPort D1P3 =
...@@ -169,11 +173,11 @@ public class OpticalCircuitIntentCompilerTest { ...@@ -169,11 +173,11 @@ public class OpticalCircuitIntentCompilerTest {
169 if (deviceId.equals(deviceId(DEV1))) { 173 if (deviceId.equals(deviceId(DEV1))) {
170 switch (portNumber.toString()) { 174 switch (portNumber.toString()) {
171 case "1": 175 case "1":
172 - return (Port) D1P1; 176 + return D1P1;
173 case "2": 177 case "2":
174 - return (Port) D1P2; 178 + return D1P2;
175 case "3": 179 case "3":
176 - return (Port) D1P3; 180 + return D1P3;
177 default: 181 default:
178 return null; 182 return null;
179 } 183 }
...@@ -181,11 +185,11 @@ public class OpticalCircuitIntentCompilerTest { ...@@ -181,11 +185,11 @@ public class OpticalCircuitIntentCompilerTest {
181 if (deviceId.equals(deviceId(DEV2))) { 185 if (deviceId.equals(deviceId(DEV2))) {
182 switch (portNumber.toString()) { 186 switch (portNumber.toString()) {
183 case "1": 187 case "1":
184 - return (Port) D2P1; 188 + return D2P1;
185 case "2": 189 case "2":
186 - return (Port) D2P2; 190 + return D2P2;
187 case "3": 191 case "3":
188 - return (Port) D2P3; 192 + return D2P3;
189 default: 193 default:
190 return null; 194 return null;
191 } 195 }
......
...@@ -17,6 +17,7 @@ package org.onosproject.store.device.impl; ...@@ -17,6 +17,7 @@ package org.onosproject.store.device.impl;
17 17
18 import static com.google.common.base.Preconditions.checkNotNull; 18 import static com.google.common.base.Preconditions.checkNotNull;
19 import static org.onosproject.net.DefaultAnnotations.union; 19 import static org.onosproject.net.DefaultAnnotations.union;
20 +import static org.onosproject.net.optical.device.OchPortHelper.ochPortDescription;
20 21
21 import java.util.Collections; 22 import java.util.Collections;
22 import java.util.Map; 23 import java.util.Map;
...@@ -111,11 +112,21 @@ class DeviceDescriptions { ...@@ -111,11 +112,21 @@ class DeviceDescriptions {
111 newDesc.timestamp()); 112 newDesc.timestamp());
112 break; 113 break;
113 case OCH: 114 case OCH:
115 + if (newDesc.value() instanceof OchPortDescription) {
116 + // remove if-block after Och related deprecation is complete
114 OchPortDescription ochDesc = (OchPortDescription) (newDesc.value()); 117 OchPortDescription ochDesc = (OchPortDescription) (newDesc.value());
115 newOne = new Timestamped<>( 118 newOne = new Timestamped<>(
116 - new OchPortDescription( 119 + ochPortDescription(ochDesc,
117 - ochDesc, ochDesc.signalType(), ochDesc.isTunable(), ochDesc.lambda(), merged), 120 + ochDesc.signalType(),
121 + ochDesc.isTunable(),
122 + ochDesc.lambda(), merged),
118 newDesc.timestamp()); 123 newDesc.timestamp());
124 + } else {
125 + // same as default case
126 + newOne = new Timestamped<>(
127 + new DefaultPortDescription(newDesc.value(), merged),
128 + newDesc.timestamp());
129 + }
119 break; 130 break;
120 case ODUCLT: 131 case ODUCLT:
121 OduCltPortDescription ocDesc = (OduCltPortDescription) (newDesc.value()); 132 OduCltPortDescription ocDesc = (OduCltPortDescription) (newDesc.value());
......
...@@ -527,15 +527,21 @@ public class ECDeviceStore ...@@ -527,15 +527,21 @@ public class ECDeviceStore
527 527
528 private Port buildTypedPort(Device device, PortNumber number, boolean isEnabled, 528 private Port buildTypedPort(Device device, PortNumber number, boolean isEnabled,
529 PortDescription description, Annotations annotations) { 529 PortDescription description, Annotations annotations) {
530 + // FIXME this switch need to go away once all ports are done.
530 switch (description.type()) { 531 switch (description.type()) {
531 case OMS: 532 case OMS:
532 OmsPortDescription omsDesc = (OmsPortDescription) description; 533 OmsPortDescription omsDesc = (OmsPortDescription) description;
533 return new OmsPort(device, number, isEnabled, omsDesc.minFrequency(), 534 return new OmsPort(device, number, isEnabled, omsDesc.minFrequency(),
534 omsDesc.maxFrequency(), omsDesc.grid(), annotations); 535 omsDesc.maxFrequency(), omsDesc.grid(), annotations);
535 case OCH: 536 case OCH:
537 + if (description instanceof OchPortDescription) {
538 + // remove if-block once Och deprecation is complete
536 OchPortDescription ochDesc = (OchPortDescription) description; 539 OchPortDescription ochDesc = (OchPortDescription) description;
537 return new OchPort(device, number, isEnabled, ochDesc.signalType(), 540 return new OchPort(device, number, isEnabled, ochDesc.signalType(),
538 ochDesc.isTunable(), ochDesc.lambda(), annotations); 541 ochDesc.isTunable(), ochDesc.lambda(), annotations);
542 + }
543 + return new DefaultPort(device, number, isEnabled, description.type(),
544 + description.portSpeed(), annotations);
539 case ODUCLT: 545 case ODUCLT:
540 OduCltPortDescription oduDesc = (OduCltPortDescription) description; 546 OduCltPortDescription oduDesc = (OduCltPortDescription) description;
541 return new OduCltPort(device, number, isEnabled, oduDesc.signalType(), annotations); 547 return new OduCltPort(device, number, isEnabled, oduDesc.signalType(), annotations);
......
...@@ -1085,15 +1085,21 @@ public class GossipDeviceStore ...@@ -1085,15 +1085,21 @@ public class GossipDeviceStore
1085 1085
1086 private Port buildTypedPort(Device device, PortNumber number, boolean isEnabled, 1086 private Port buildTypedPort(Device device, PortNumber number, boolean isEnabled,
1087 PortDescription description, Annotations annotations) { 1087 PortDescription description, Annotations annotations) {
1088 + // FIXME this switch need to go away once all ports are done.
1088 switch (description.type()) { 1089 switch (description.type()) {
1089 case OMS: 1090 case OMS:
1090 OmsPortDescription omsDesc = (OmsPortDescription) description; 1091 OmsPortDescription omsDesc = (OmsPortDescription) description;
1091 return new OmsPort(device, number, isEnabled, omsDesc.minFrequency(), 1092 return new OmsPort(device, number, isEnabled, omsDesc.minFrequency(),
1092 omsDesc.maxFrequency(), omsDesc.grid(), annotations); 1093 omsDesc.maxFrequency(), omsDesc.grid(), annotations);
1093 case OCH: 1094 case OCH:
1095 + if (description instanceof OchPortDescription) {
1096 + // remove if-block once Och deprecation is complete
1094 OchPortDescription ochDesc = (OchPortDescription) description; 1097 OchPortDescription ochDesc = (OchPortDescription) description;
1095 return new OchPort(device, number, isEnabled, ochDesc.signalType(), 1098 return new OchPort(device, number, isEnabled, ochDesc.signalType(),
1096 ochDesc.isTunable(), ochDesc.lambda(), annotations); 1099 ochDesc.isTunable(), ochDesc.lambda(), annotations);
1100 + }
1101 + return new DefaultPort(device, number, isEnabled, description.type(),
1102 + description.portSpeed(), annotations);
1097 case ODUCLT: 1103 case ODUCLT:
1098 OduCltPortDescription oduDesc = (OduCltPortDescription) description; 1104 OduCltPortDescription oduDesc = (OduCltPortDescription) description;
1099 return new OduCltPort(device, number, isEnabled, oduDesc.signalType(), annotations); 1105 return new OduCltPort(device, number, isEnabled, oduDesc.signalType(), annotations);
......
...@@ -18,12 +18,21 @@ package org.onosproject.drivers.ciena; ...@@ -18,12 +18,21 @@ package org.onosproject.drivers.ciena;
18 18
19 import org.apache.felix.scr.annotations.Component; 19 import org.apache.felix.scr.annotations.Component;
20 import org.onosproject.net.driver.AbstractDriverLoader; 20 import org.onosproject.net.driver.AbstractDriverLoader;
21 +import org.onosproject.net.optical.OpticalDevice;
22 +import org.onosproject.net.optical.device.DefaultOpticalDevice;
21 23
22 /** 24 /**
23 * Loader for Ciena device drivers. 25 * Loader for Ciena device drivers.
24 */ 26 */
25 @Component(immediate = true) 27 @Component(immediate = true)
26 public class CienaDriversLoader extends AbstractDriverLoader { 28 public class CienaDriversLoader extends AbstractDriverLoader {
29 +
30 + // OSGI: help bundle plugin discover runtime package dependency.
31 + @SuppressWarnings("unused")
32 + private OpticalDevice optical;
33 + @SuppressWarnings("unused")
34 + private DefaultOpticalDevice driver;
35 +
27 public CienaDriversLoader() { 36 public CienaDriversLoader() {
28 super("/ciena-drivers.xml"); 37 super("/ciena-drivers.xml");
29 } 38 }
......
...@@ -18,6 +18,8 @@ ...@@ -18,6 +18,8 @@
18 <driver name="restCiena" manufacturer="Ciena" hwVersion="1.0.0" swVersion="1.0.0"> 18 <driver name="restCiena" manufacturer="Ciena" hwVersion="1.0.0" swVersion="1.0.0">
19 <behaviour api="org.onosproject.net.behaviour.PortDiscovery" 19 <behaviour api="org.onosproject.net.behaviour.PortDiscovery"
20 impl="org.onosproject.drivers.ciena.PortDiscoveryCienaWaveserverImpl"/> 20 impl="org.onosproject.drivers.ciena.PortDiscoveryCienaWaveserverImpl"/>
21 + <behaviour api="org.onosproject.net.optical.OpticalDevice"
22 + impl="org.onosproject.net.optical.device.DefaultOpticalDevice"/>
21 </driver> 23 </driver>
22 </drivers> 24 </drivers>
23 25
......
...@@ -47,4 +47,23 @@ ...@@ -47,4 +47,23 @@
47 <artifactId>openflowj</artifactId> 47 <artifactId>openflowj</artifactId>
48 </dependency> 48 </dependency>
49 </dependencies> 49 </dependencies>
50 + <build>
51 + <plugins>
52 + <plugin>
53 + <groupId>org.apache.felix</groupId>
54 + <artifactId>maven-bundle-plugin</artifactId>
55 + <extensions>true</extensions>
56 + <configuration>
57 + <niceManifest>true</niceManifest>
58 + <instructions>
59 + <!-- TODO this can be removed once optical package
60 + has been separated out from the default drivers -->
61 + <Import-Package>
62 + *,org.onosproject.net.optical.device
63 + </Import-Package>
64 + </instructions>
65 + </configuration>
66 + </plugin>
67 + </plugins>
68 + </build>
50 </project> 69 </project>
......
...@@ -16,7 +16,6 @@ ...@@ -16,7 +16,6 @@
16 package org.onosproject.driver.query; 16 package org.onosproject.driver.query;
17 17
18 import org.onlab.util.GuavaCollectors; 18 import org.onlab.util.GuavaCollectors;
19 -import org.onosproject.net.OchPort;
20 import org.onosproject.net.OduSignalType; 19 import org.onosproject.net.OduSignalType;
21 import org.onosproject.net.OtuPort; 20 import org.onosproject.net.OtuPort;
22 import org.onosproject.net.OtuSignalType; 21 import org.onosproject.net.OtuSignalType;
...@@ -25,10 +24,13 @@ import org.onosproject.net.PortNumber; ...@@ -25,10 +24,13 @@ import org.onosproject.net.PortNumber;
25 import org.onosproject.net.TributarySlot; 24 import org.onosproject.net.TributarySlot;
26 import org.onosproject.net.device.DeviceService; 25 import org.onosproject.net.device.DeviceService;
27 import org.onosproject.net.driver.AbstractHandlerBehaviour; 26 import org.onosproject.net.driver.AbstractHandlerBehaviour;
27 +import org.onosproject.net.optical.OchPort;
28 import org.onosproject.net.behaviour.TributarySlotQuery; 28 import org.onosproject.net.behaviour.TributarySlotQuery;
29 import org.slf4j.Logger; 29 import org.slf4j.Logger;
30 import org.slf4j.LoggerFactory; 30 import org.slf4j.LoggerFactory;
31 31
32 +import static org.onosproject.net.optical.device.OpticalDeviceServiceView.opticalView;
33 +
32 import java.util.Collections; 34 import java.util.Collections;
33 import java.util.Set; 35 import java.util.Set;
34 import java.util.stream.IntStream; 36 import java.util.stream.IntStream;
...@@ -61,12 +63,12 @@ public class DefaultTributarySlotQuery extends AbstractHandlerBehaviour implemen ...@@ -61,12 +63,12 @@ public class DefaultTributarySlotQuery extends AbstractHandlerBehaviour implemen
61 @Override 63 @Override
62 public Set<TributarySlot> queryTributarySlots(PortNumber port) { 64 public Set<TributarySlot> queryTributarySlots(PortNumber port) {
63 // currently return all slots by default. 65 // currently return all slots by default.
64 - DeviceService deviceService = this.handler().get(DeviceService.class); 66 + DeviceService deviceService = opticalView(this.handler().get(DeviceService.class));
65 Port p = deviceService.getPort(this.data().deviceId(), port); 67 Port p = deviceService.getPort(this.data().deviceId(), port);
66 68
67 switch (p.type()) { 69 switch (p.type()) {
68 case OCH: 70 case OCH:
69 - return queryOchTributarySlots((OchPort) p); 71 + return queryOchTributarySlots(p);
70 case OTU: 72 case OTU:
71 return queryOtuTributarySlots((OtuPort) p); 73 return queryOtuTributarySlots((OtuPort) p);
72 default: 74 default:
...@@ -74,8 +76,21 @@ public class DefaultTributarySlotQuery extends AbstractHandlerBehaviour implemen ...@@ -74,8 +76,21 @@ public class DefaultTributarySlotQuery extends AbstractHandlerBehaviour implemen
74 } 76 }
75 } 77 }
76 78
77 - private Set<TributarySlot> queryOchTributarySlots(OchPort ochPort) { 79 + private Set<TributarySlot> queryOchTributarySlots(Port ochPort) {
78 - OduSignalType signalType = ochPort.signalType(); 80 + OduSignalType signalType = null;
81 + if (ochPort instanceof org.onosproject.net.OchPort) {
82 + // remove once deprecation of old OchPort model is done
83 + signalType = ((org.onosproject.net.OchPort) ochPort).signalType();
84 + }
85 + if (ochPort instanceof OchPort) {
86 + signalType = ((OchPort) ochPort).signalType();
87 + }
88 +
89 + if (signalType == null) {
90 + log.warn("{} was not an OchPort", ochPort);
91 + return Collections.emptySet();
92 + }
93 +
79 switch (signalType) { 94 switch (signalType) {
80 case ODU2: 95 case ODU2:
81 return ENTIRE_ODU2_TRIBUTARY_SLOTS; 96 return ENTIRE_ODU2_TRIBUTARY_SLOTS;
......
...@@ -61,6 +61,8 @@ ...@@ -61,6 +61,8 @@
61 impl="org.onosproject.driver.handshaker.OfOpticalSwitchImplLinc13"/> 61 impl="org.onosproject.driver.handshaker.OfOpticalSwitchImplLinc13"/>
62 <behaviour api="org.onosproject.net.behaviour.LambdaQuery" 62 <behaviour api="org.onosproject.net.behaviour.LambdaQuery"
63 impl="org.onosproject.driver.query.LincOELambdaQuery"/> 63 impl="org.onosproject.driver.query.LincOELambdaQuery"/>
64 + <behaviour api="org.onosproject.net.optical.OpticalDevice"
65 + impl="org.onosproject.net.optical.device.DefaultOpticalDevice"/>
64 </driver> 66 </driver>
65 <driver name="ofdpa" extends="default" 67 <driver name="ofdpa" extends="default"
66 manufacturer="Broadcom Corp." hwVersion="OF-DPA.*" swVersion="OF-DPA.*"> 68 manufacturer="Broadcom Corp." hwVersion="OF-DPA.*" swVersion="OF-DPA.*">
...@@ -165,6 +167,8 @@ ...@@ -165,6 +167,8 @@
165 impl="org.onosproject.driver.query.DefaultTributarySlotQuery" /> 167 impl="org.onosproject.driver.query.DefaultTributarySlotQuery" />
166 <behaviour api="org.onosproject.net.behaviour.LambdaQuery" 168 <behaviour api="org.onosproject.net.behaviour.LambdaQuery"
167 impl="org.onosproject.driver.query.OFOpticalSwitch13LambdaQuery"/> 169 impl="org.onosproject.driver.query.OFOpticalSwitch13LambdaQuery"/>
170 + <behaviour api="org.onosproject.net.optical.OpticalDevice"
171 + impl="org.onosproject.net.optical.device.DefaultOpticalDevice"/>
168 </driver> 172 </driver>
169 <driver name="aos" extends="ofdpa" 173 <driver name="aos" extends="ofdpa"
170 manufacturer="Accton" hwVersion=".*" swVersion="1.*"> 174 manufacturer="Accton" hwVersion=".*" swVersion="1.*">
...@@ -179,6 +183,8 @@ ...@@ -179,6 +183,8 @@
179 swVersion="of-agent"> 183 swVersion="of-agent">
180 <behaviour api="org.onosproject.openflow.controller.driver.OpenFlowSwitchDriver" 184 <behaviour api="org.onosproject.openflow.controller.driver.OpenFlowSwitchDriver"
181 impl="org.onosproject.driver.handshaker.OplinkRoadmHandshaker"/> 185 impl="org.onosproject.driver.handshaker.OplinkRoadmHandshaker"/>
186 + <behaviour api="org.onosproject.net.optical.OpticalDevice"
187 + impl="org.onosproject.net.optical.device.DefaultOpticalDevice"/>
182 </driver> 188 </driver>
183 <driver name="hp" extends="default" 189 <driver name="hp" extends="default"
184 manufacturer="HP" hwVersion="Switch 3500yl-48G" swVersion="K.16.01.0004"> 190 manufacturer="HP" hwVersion="Switch 3500yl-48G" swVersion="K.16.01.0004">
......
...@@ -18,12 +18,21 @@ package org.onosproject.drivers.fujitsu; ...@@ -18,12 +18,21 @@ package org.onosproject.drivers.fujitsu;
18 18
19 import org.apache.felix.scr.annotations.Component; 19 import org.apache.felix.scr.annotations.Component;
20 import org.onosproject.net.driver.AbstractDriverLoader; 20 import org.onosproject.net.driver.AbstractDriverLoader;
21 +import org.onosproject.net.optical.OpticalDevice;
22 +import org.onosproject.net.optical.device.DefaultOpticalDevice;
21 23
22 /** 24 /**
23 * Loader for Fujitsu device drivers. 25 * Loader for Fujitsu device drivers.
24 */ 26 */
25 @Component(immediate = true) 27 @Component(immediate = true)
26 public class FujitsuDriversLoader extends AbstractDriverLoader { 28 public class FujitsuDriversLoader extends AbstractDriverLoader {
29 +
30 + // OSGI: help bundle plugin discover runtime package dependency.
31 + @SuppressWarnings("unused")
32 + private OpticalDevice optical;
33 + @SuppressWarnings("unused")
34 + private DefaultOpticalDevice driver;
35 +
27 public FujitsuDriversLoader() { 36 public FujitsuDriversLoader() {
28 super("/fujitsu-drivers.xml"); 37 super("/fujitsu-drivers.xml");
29 } 38 }
......
...@@ -18,6 +18,8 @@ ...@@ -18,6 +18,8 @@
18 <driver name="fujitsu-netconf" manufacturer="Fujitsu" hwVersion="T100" swVersion="01-01-X"> 18 <driver name="fujitsu-netconf" manufacturer="Fujitsu" hwVersion="T100" swVersion="01-01-X">
19 <behaviour api="org.onosproject.net.behaviour.PortDiscovery" 19 <behaviour api="org.onosproject.net.behaviour.PortDiscovery"
20 impl="org.onosproject.drivers.fujitsu.PortGetterFujitsuImpl"/> 20 impl="org.onosproject.drivers.fujitsu.PortGetterFujitsuImpl"/>
21 + <behaviour api="org.onosproject.net.optical.OpticalDevice"
22 + impl="org.onosproject.net.optical.device.DefaultOpticalDevice"/>
21 </driver> 23 </driver>
22 </drivers> 24 </drivers>
23 25
......
...@@ -32,12 +32,13 @@ import org.onosproject.net.OduSignalType; ...@@ -32,12 +32,13 @@ import org.onosproject.net.OduSignalType;
32 import org.onosproject.net.PortNumber; 32 import org.onosproject.net.PortNumber;
33 import org.onosproject.net.SparseAnnotations; 33 import org.onosproject.net.SparseAnnotations;
34 import org.onosproject.net.behaviour.ControllerInfo; 34 import org.onosproject.net.behaviour.ControllerInfo;
35 -import org.onosproject.net.device.OchPortDescription;
36 import org.onosproject.net.device.OduCltPortDescription; 35 import org.onosproject.net.device.OduCltPortDescription;
37 import org.onosproject.net.device.PortDescription; 36 import org.onosproject.net.device.PortDescription;
38 import org.slf4j.Logger; 37 import org.slf4j.Logger;
39 import org.slf4j.LoggerFactory; 38 import org.slf4j.LoggerFactory;
40 39
40 +import static org.onosproject.net.optical.device.OchPortHelper.ochPortDescription;
41 +
41 import java.io.InputStream; 42 import java.io.InputStream;
42 import java.io.StringWriter; 43 import java.io.StringWriter;
43 import java.util.ArrayList; 44 import java.util.ArrayList;
...@@ -104,7 +105,7 @@ public final class XmlConfigParser { ...@@ -104,7 +105,7 @@ public final class XmlConfigParser {
104 return portDescriptions; 105 return portDescriptions;
105 } 106 }
106 107
107 - private static OchPortDescription parseT100OchPort(HierarchicalConfiguration cfg, long count) { 108 + private static PortDescription parseT100OchPort(HierarchicalConfiguration cfg, long count) {
108 PortNumber portNumber = PortNumber.portNumber(count); 109 PortNumber portNumber = PortNumber.portNumber(count);
109 HierarchicalConfiguration otuConfig = cfg.configurationAt("otu"); 110 HierarchicalConfiguration otuConfig = cfg.configurationAt("otu");
110 boolean enabled = otuConfig.getString("administrative-state").equals("up"); 111 boolean enabled = otuConfig.getString("administrative-state").equals("up");
...@@ -115,7 +116,7 @@ public final class XmlConfigParser { ...@@ -115,7 +116,7 @@ public final class XmlConfigParser {
115 DefaultAnnotations annotations = DefaultAnnotations.builder(). 116 DefaultAnnotations annotations = DefaultAnnotations.builder().
116 set(AnnotationKeys.PORT_NAME, cfg.getString("name")). 117 set(AnnotationKeys.PORT_NAME, cfg.getString("name")).
117 build(); 118 build();
118 - return new OchPortDescription(portNumber, enabled, signalType, isTunable, lambda, annotations); 119 + return ochPortDescription(portNumber, enabled, signalType, isTunable, lambda, annotations);
119 } 120 }
120 121
121 private static OduCltPortDescription parseT100OduPort(HierarchicalConfiguration cfg, long count) { 122 private static OduCltPortDescription parseT100OduPort(HierarchicalConfiguration cfg, long count) {
...@@ -213,7 +214,7 @@ public final class XmlConfigParser { ...@@ -213,7 +214,7 @@ public final class XmlConfigParser {
213 int spacingMult = (int) (toGbps((Integer.parseInt(config.getString(frequencyPath)) - 214 int spacingMult = (int) (toGbps((Integer.parseInt(config.getString(frequencyPath)) -
214 baseFrequency)) / toGbpsFromHz(chSpacing.frequency().asHz())); //FIXME is there a better way ? 215 baseFrequency)) / toGbpsFromHz(chSpacing.frequency().asHz())); //FIXME is there a better way ?
215 216
216 - return new OchPortDescription(PortNumber.portNumber(portNumber), isEnabled, oduSignalType, isTunable, 217 + return ochPortDescription(PortNumber.portNumber(portNumber), isEnabled, oduSignalType, isTunable,
217 new OchSignal(gridType, chSpacing, spacingMult, 1), annotations); 218 new OchSignal(gridType, chSpacing, spacingMult, 1), annotations);
218 } 219 }
219 220
......
...@@ -650,6 +650,9 @@ ...@@ -650,6 +650,9 @@
650 <artifactId>maven-bundle-plugin</artifactId> 650 <artifactId>maven-bundle-plugin</artifactId>
651 <version>3.0.1</version> 651 <version>3.0.1</version>
652 <extensions>true</extensions> 652 <extensions>true</extensions>
653 + <configuration>
654 + <niceManifest>true</niceManifest>
655 + </configuration>
653 </plugin> 656 </plugin>
654 657
655 <plugin> 658 <plugin>
......
...@@ -15,10 +15,24 @@ ...@@ -15,10 +15,24 @@
15 */ 15 */
16 package org.onosproject.provider.of.device.impl; 16 package org.onosproject.provider.of.device.impl;
17 17
18 -import com.google.common.base.Strings; 18 +import static com.google.common.base.Preconditions.checkArgument;
19 -import com.google.common.collect.Lists; 19 +import static com.google.common.base.Strings.isNullOrEmpty;
20 -import com.google.common.collect.Maps; 20 +import static org.onlab.util.Tools.get;
21 -import com.google.common.collect.Sets; 21 +import static org.onosproject.net.DeviceId.deviceId;
22 +import static org.onosproject.net.Port.Type.COPPER;
23 +import static org.onosproject.net.Port.Type.FIBER;
24 +import static org.onosproject.net.optical.device.OchPortHelper.ochPortDescription;
25 +import static org.onosproject.openflow.controller.Dpid.dpid;
26 +import static org.onosproject.openflow.controller.Dpid.uri;
27 +import static org.slf4j.LoggerFactory.getLogger;
28 +
29 +import java.util.ArrayList;
30 +import java.util.Collection;
31 +import java.util.Collections;
32 +import java.util.Dictionary;
33 +import java.util.HashMap;
34 +import java.util.HashSet;
35 +import java.util.List;
22 36
23 import org.apache.felix.scr.annotations.Activate; 37 import org.apache.felix.scr.annotations.Activate;
24 import org.apache.felix.scr.annotations.Component; 38 import org.apache.felix.scr.annotations.Component;
...@@ -52,7 +66,6 @@ import org.onosproject.net.device.DeviceDescription; ...@@ -52,7 +66,6 @@ import org.onosproject.net.device.DeviceDescription;
52 import org.onosproject.net.device.DeviceProvider; 66 import org.onosproject.net.device.DeviceProvider;
53 import org.onosproject.net.device.DeviceProviderRegistry; 67 import org.onosproject.net.device.DeviceProviderRegistry;
54 import org.onosproject.net.device.DeviceProviderService; 68 import org.onosproject.net.device.DeviceProviderService;
55 -import org.onosproject.net.device.OchPortDescription;
56 import org.onosproject.net.device.OduCltPortDescription; 69 import org.onosproject.net.device.OduCltPortDescription;
57 import org.onosproject.net.device.OmsPortDescription; 70 import org.onosproject.net.device.OmsPortDescription;
58 import org.onosproject.net.device.OtuPortDescription; 71 import org.onosproject.net.device.OtuPortDescription;
...@@ -101,23 +114,10 @@ import org.projectfloodlight.openflow.types.OFPort; ...@@ -101,23 +114,10 @@ import org.projectfloodlight.openflow.types.OFPort;
101 import org.projectfloodlight.openflow.types.PortSpeed; 114 import org.projectfloodlight.openflow.types.PortSpeed;
102 import org.slf4j.Logger; 115 import org.slf4j.Logger;
103 116
104 -import java.util.ArrayList; 117 +import com.google.common.base.Strings;
105 -import java.util.Collection; 118 +import com.google.common.collect.Lists;
106 -import java.util.Collections; 119 +import com.google.common.collect.Maps;
107 -import java.util.Dictionary; 120 +import com.google.common.collect.Sets;
108 -import java.util.HashMap;
109 -import java.util.HashSet;
110 -import java.util.List;
111 -
112 -import static com.google.common.base.Preconditions.checkArgument;
113 -import static com.google.common.base.Strings.isNullOrEmpty;
114 -import static org.onlab.util.Tools.get;
115 -import static org.onosproject.net.DeviceId.deviceId;
116 -import static org.onosproject.net.Port.Type.COPPER;
117 -import static org.onosproject.net.Port.Type.FIBER;
118 -import static org.onosproject.openflow.controller.Dpid.dpid;
119 -import static org.onosproject.openflow.controller.Dpid.uri;
120 -import static org.slf4j.LoggerFactory.getLogger;
121 121
122 /** 122 /**
123 * Provider which uses an OpenFlow controller to detect network 123 * Provider which uses an OpenFlow controller to detect network
...@@ -579,7 +579,7 @@ public class OpenFlowDeviceProvider extends AbstractProvider implements DevicePr ...@@ -579,7 +579,7 @@ public class OpenFlowDeviceProvider extends AbstractProvider implements DevicePr
579 OFExpPortDescPropOpticalTransport firstProp = port.getProperties().get(0); 579 OFExpPortDescPropOpticalTransport firstProp = port.getProperties().get(0);
580 OFPortOpticalTransportSignalType sigType = firstProp.getPortSignalType(); 580 OFPortOpticalTransportSignalType sigType = firstProp.getPortSignalType();
581 581
582 - DefaultPortDescription portDes = null; 582 + PortDescription portDes = null;
583 switch (sigType) { 583 switch (sigType) {
584 case OMSN: 584 case OMSN:
585 portDes = new OmsPortDescription(portNo, enabled, 585 portDes = new OmsPortDescription(portNo, enabled,
...@@ -600,8 +600,9 @@ public class OpenFlowDeviceProvider extends AbstractProvider implements DevicePr ...@@ -600,8 +600,9 @@ public class OpenFlowDeviceProvider extends AbstractProvider implements DevicePr
600 //yet not relevant for tunable OCH port, creating with default parameters 600 //yet not relevant for tunable OCH port, creating with default parameters
601 OchSignal signalId = new OchSignal(GridType.DWDM, ChannelSpacing.CHL_50GHZ, 1, 1); 601 OchSignal signalId = new OchSignal(GridType.DWDM, ChannelSpacing.CHL_50GHZ, 1, 1);
602 602
603 - portDes = new OchPortDescription(portNo, enabled, 603 + portDes = ochPortDescription(portNo, enabled,
604 - oduSignalType, true, signalId, annotations); 604 + oduSignalType, true,
605 + signalId, annotations);
605 606
606 break; 607 break;
607 case OTU2: 608 case OTU2:
...@@ -706,7 +707,7 @@ public class OpenFlowDeviceProvider extends AbstractProvider implements DevicePr ...@@ -706,7 +707,7 @@ public class OpenFlowDeviceProvider extends AbstractProvider implements DevicePr
706 Spectrum.U_BAND_MIN, Spectrum.O_BAND_MAX, Frequency.ofGHz(50), annotations); 707 Spectrum.U_BAND_MIN, Spectrum.O_BAND_MAX, Frequency.ofGHz(50), annotations);
707 case 5: // OCH port 708 case 5: // OCH port
708 OchSignal signal = new OchSignal(GridType.DWDM, ChannelSpacing.CHL_50GHZ, 0, 4); 709 OchSignal signal = new OchSignal(GridType.DWDM, ChannelSpacing.CHL_50GHZ, 0, 4);
709 - return new OchPortDescription(portNo, enabled, OduSignalType.ODU4, 710 + return ochPortDescription(portNo, enabled, OduSignalType.ODU4,
710 true, signal, annotations); 711 true, signal, annotations);
711 default: 712 default:
712 break; 713 break;
......
...@@ -38,7 +38,6 @@ import org.onosproject.net.HostId; ...@@ -38,7 +38,6 @@ import org.onosproject.net.HostId;
38 import org.onosproject.net.HostLocation; 38 import org.onosproject.net.HostLocation;
39 import org.onosproject.net.Link; 39 import org.onosproject.net.Link;
40 import org.onosproject.net.MastershipRole; 40 import org.onosproject.net.MastershipRole;
41 -import org.onosproject.net.OchPort;
42 import org.onosproject.net.OchSignal; 41 import org.onosproject.net.OchSignal;
43 import org.onosproject.net.OduCltPort; 42 import org.onosproject.net.OduCltPort;
44 import org.onosproject.net.OduSignalType; 43 import org.onosproject.net.OduSignalType;
...@@ -55,7 +54,6 @@ import org.onosproject.net.device.DeviceProvider; ...@@ -55,7 +54,6 @@ import org.onosproject.net.device.DeviceProvider;
55 import org.onosproject.net.device.DeviceProviderRegistry; 54 import org.onosproject.net.device.DeviceProviderRegistry;
56 import org.onosproject.net.device.DeviceProviderService; 55 import org.onosproject.net.device.DeviceProviderService;
57 import org.onosproject.net.device.DeviceService; 56 import org.onosproject.net.device.DeviceService;
58 -import org.onosproject.net.device.OchPortDescription;
59 import org.onosproject.net.device.OduCltPortDescription; 57 import org.onosproject.net.device.OduCltPortDescription;
60 import org.onosproject.net.device.OmsPortDescription; 58 import org.onosproject.net.device.OmsPortDescription;
61 import org.onosproject.net.device.PortDescription; 59 import org.onosproject.net.device.PortDescription;
...@@ -67,6 +65,7 @@ import org.onosproject.net.link.DefaultLinkDescription; ...@@ -67,6 +65,7 @@ import org.onosproject.net.link.DefaultLinkDescription;
67 import org.onosproject.net.link.LinkProvider; 65 import org.onosproject.net.link.LinkProvider;
68 import org.onosproject.net.link.LinkProviderRegistry; 66 import org.onosproject.net.link.LinkProviderRegistry;
69 import org.onosproject.net.link.LinkProviderService; 67 import org.onosproject.net.link.LinkProviderService;
68 +import org.onosproject.net.optical.OchPort;
70 import org.onosproject.net.provider.ProviderId; 69 import org.onosproject.net.provider.ProviderId;
71 import org.slf4j.Logger; 70 import org.slf4j.Logger;
72 import org.slf4j.LoggerFactory; 71 import org.slf4j.LoggerFactory;
...@@ -88,6 +87,8 @@ import static org.onosproject.net.DeviceId.deviceId; ...@@ -88,6 +87,8 @@ import static org.onosproject.net.DeviceId.deviceId;
88 import static org.onosproject.net.PortNumber.portNumber; 87 import static org.onosproject.net.PortNumber.portNumber;
89 import static org.onosproject.net.device.DeviceEvent.Type.DEVICE_ADDED; 88 import static org.onosproject.net.device.DeviceEvent.Type.DEVICE_ADDED;
90 import static org.onosproject.net.device.DeviceEvent.Type.DEVICE_AVAILABILITY_CHANGED; 89 import static org.onosproject.net.device.DeviceEvent.Type.DEVICE_AVAILABILITY_CHANGED;
90 +import static org.onosproject.net.optical.device.OchPortHelper.ochPortDescription;
91 +import static org.onosproject.net.optical.device.OpticalDeviceServiceView.opticalView;
91 92
92 /** 93 /**
93 * Provider of devices and links parsed from a JSON configuration structure. 94 * Provider of devices and links parsed from a JSON configuration structure.
...@@ -139,7 +140,7 @@ class ConfigProvider implements DeviceProvider, LinkProvider, HostProvider { ...@@ -139,7 +140,7 @@ class ConfigProvider implements DeviceProvider, LinkProvider, HostProvider {
139 LinkProviderRegistry linkProviderRegistry, 140 LinkProviderRegistry linkProviderRegistry,
140 HostProviderRegistry hostProviderRegistry) { 141 HostProviderRegistry hostProviderRegistry) {
141 this.cfg = checkNotNull(cfg, "Configuration cannot be null"); 142 this.cfg = checkNotNull(cfg, "Configuration cannot be null");
142 - this.deviceService = checkNotNull(deviceService, "Device service cannot be null"); 143 + this.deviceService = opticalView(checkNotNull(deviceService, "Device service cannot be null"));
143 this.deviceProviderRegistry = checkNotNull(deviceProviderRegistry, "Device provider registry cannot be null"); 144 this.deviceProviderRegistry = checkNotNull(deviceProviderRegistry, "Device provider registry cannot be null");
144 this.linkProviderRegistry = checkNotNull(linkProviderRegistry, "Link provider registry cannot be null"); 145 this.linkProviderRegistry = checkNotNull(linkProviderRegistry, "Link provider registry cannot be null");
145 this.hostProviderRegistry = checkNotNull(hostProviderRegistry, "Host provider registry cannot be null"); 146 this.hostProviderRegistry = checkNotNull(hostProviderRegistry, "Host provider registry cannot be null");
...@@ -269,7 +270,7 @@ class ConfigProvider implements DeviceProvider, LinkProvider, HostProvider { ...@@ -269,7 +270,7 @@ class ConfigProvider implements DeviceProvider, LinkProvider, HostProvider {
269 case OCH: 270 case OCH:
270 annotations = annotations(node.get("annotations")); 271 annotations = annotations(node.get("annotations"));
271 OchPort ochPort = (OchPort) deviceService.getPort(deviceId, port); 272 OchPort ochPort = (OchPort) deviceService.getPort(deviceId, port);
272 - return new OchPortDescription(port, node.path("enabled").asBoolean(true), 273 + return ochPortDescription(port, node.path("enabled").asBoolean(true),
273 ochPort.signalType(), ochPort.isTunable(), 274 ochPort.signalType(), ochPort.isTunable(),
274 ochPort.lambda(), annotations); 275 ochPort.lambda(), annotations);
275 case OMS: 276 case OMS:
...@@ -363,13 +364,13 @@ class ConfigProvider implements DeviceProvider, LinkProvider, HostProvider { ...@@ -363,13 +364,13 @@ class ConfigProvider implements DeviceProvider, LinkProvider, HostProvider {
363 } 364 }
364 OchSignal signal = new OchSignal(GridType.DWDM, chsp, 1, 1); 365 OchSignal signal = new OchSignal(GridType.DWDM, chsp, 1, 1);
365 if (src.type() == Device.Type.ROADM) { 366 if (src.type() == Device.Type.ROADM) {
366 - PortDescription portDesc = new OchPortDescription(srcCp.port(), true, 367 + PortDescription portDesc = ochPortDescription(srcCp.port(), true,
367 OduSignalType.ODU4, true, signal); 368 OduSignalType.ODU4, true, signal);
368 descriptions.put(srcCp, portDesc); 369 descriptions.put(srcCp, portDesc);
369 deviceProviderService.portStatusChanged(srcCp.deviceId(), portDesc); 370 deviceProviderService.portStatusChanged(srcCp.deviceId(), portDesc);
370 } 371 }
371 if (dst.type() == Device.Type.ROADM) { 372 if (dst.type() == Device.Type.ROADM) {
372 - PortDescription portDesc = new OchPortDescription(dstCp.port(), true, 373 + PortDescription portDesc = ochPortDescription(dstCp.port(), true,
373 OduSignalType.ODU4, true, signal); 374 OduSignalType.ODU4, true, signal);
374 descriptions.put(dstCp, portDesc); 375 descriptions.put(dstCp, portDesc);
375 deviceProviderService.portStatusChanged(dstCp.deviceId(), portDesc); 376 deviceProviderService.portStatusChanged(dstCp.deviceId(), portDesc);
...@@ -482,7 +483,7 @@ class ConfigProvider implements DeviceProvider, LinkProvider, HostProvider { ...@@ -482,7 +483,7 @@ class ConfigProvider implements DeviceProvider, LinkProvider, HostProvider {
482 op.number(), op.isEnabled(), op.minFrequency(), op.maxFrequency(), op.grid()); 483 op.number(), op.isEnabled(), op.minFrequency(), op.maxFrequency(), op.grid());
483 case OCH: 484 case OCH:
484 OchPort ochp = (OchPort) p; 485 OchPort ochp = (OchPort) p;
485 - return new OchPortDescription( 486 + return ochPortDescription(
486 ochp.number(), ochp.isEnabled(), ochp.signalType(), ochp.isTunable(), ochp.lambda()); 487 ochp.number(), ochp.isEnabled(), ochp.signalType(), ochp.isTunable(), ochp.lambda());
487 case ODUCLT: 488 case ODUCLT:
488 OduCltPort odup = (OduCltPort) p; 489 OduCltPort odup = (OduCltPort) p;
......