Rimon Ashkenazy
Committed by Gerrit Code Review

Add OTN device and ports

Change-Id: I18f3376d1466077e95d7324a27a660302f0123b3
Showing 21 changed files with 316 additions and 14 deletions
...@@ -28,6 +28,7 @@ import org.onosproject.net.Device; ...@@ -28,6 +28,7 @@ import org.onosproject.net.Device;
28 import org.onosproject.net.OchPort; 28 import org.onosproject.net.OchPort;
29 import org.onosproject.net.OduCltPort; 29 import org.onosproject.net.OduCltPort;
30 import org.onosproject.net.OmsPort; 30 import org.onosproject.net.OmsPort;
31 +import org.onosproject.net.OtuPort;
31 import org.onosproject.net.Port; 32 import org.onosproject.net.Port;
32 import org.onosproject.net.PortNumber; 33 import org.onosproject.net.PortNumber;
33 import org.onosproject.net.device.DeviceService; 34 import org.onosproject.net.device.DeviceService;
...@@ -47,7 +48,7 @@ public class DevicePortsListCommand extends DevicesListCommand { ...@@ -47,7 +48,7 @@ public class DevicePortsListCommand extends DevicesListCommand {
47 48
48 private static final String FMT = " port=%s, state=%s, type=%s, speed=%s %s"; 49 private static final String FMT = " port=%s, state=%s, type=%s, speed=%s %s";
49 private static final String FMT_OCH = " port=%s, state=%s, type=%s, signalType=%s, isTunable=%s %s"; 50 private static final String FMT_OCH = " port=%s, state=%s, type=%s, signalType=%s, isTunable=%s %s";
50 - private static final String FMT_ODUCLT = " port=%s, state=%s, type=%s, signalType=%s %s"; 51 + private static final String FMT_ODUCLT_OTU = " port=%s, state=%s, type=%s, signalType=%s %s";
51 private static final String FMT_OMS = " port=%s, state=%s, type=%s, Freqs= %s / %s / %s GHz, totalChannels=%s %s"; 52 private static final String FMT_OMS = " port=%s, state=%s, type=%s, Freqs= %s / %s / %s GHz, totalChannels=%s %s";
52 53
53 @Option(name = "-e", aliases = "--enabled", description = "Show only enabled ports", 54 @Option(name = "-e", aliases = "--enabled", description = "Show only enabled ports",
...@@ -158,7 +159,7 @@ public class DevicePortsListCommand extends DevicesListCommand { ...@@ -158,7 +159,7 @@ public class DevicePortsListCommand extends DevicesListCommand {
158 ((OchPort) port).isTunable() ? "yes" : "no", annotations); 159 ((OchPort) port).isTunable() ? "yes" : "no", annotations);
159 break; 160 break;
160 case ODUCLT: 161 case ODUCLT:
161 - print(FMT_ODUCLT, portName, portIsEnabled, portType, 162 + print(FMT_ODUCLT_OTU, portName, portIsEnabled, portType,
162 ((OduCltPort) port).signalType().toString(), annotations); 163 ((OduCltPort) port).signalType().toString(), annotations);
163 break; 164 break;
164 case OMS: 165 case OMS:
...@@ -168,6 +169,10 @@ public class DevicePortsListCommand extends DevicesListCommand { ...@@ -168,6 +169,10 @@ public class DevicePortsListCommand extends DevicesListCommand {
168 ((OmsPort) port).grid().asHz() / Frequency.ofGHz(1).asHz(), 169 ((OmsPort) port).grid().asHz() / Frequency.ofGHz(1).asHz(),
169 ((OmsPort) port).totalChannels(), annotations); 170 ((OmsPort) port).totalChannels(), annotations);
170 break; 171 break;
172 + case OTU:
173 + print(FMT_ODUCLT_OTU, portName, portIsEnabled, portType,
174 + ((OtuPort) port).signalType().toString(), annotations);
175 + break;
171 default: 176 default:
172 print(FMT, portName, portIsEnabled, portType, port.portSpeed(), annotations); 177 print(FMT, portName, portIsEnabled, portType, port.portSpeed(), annotations);
173 break; 178 break;
......
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;
17 +
18 +import java.util.Objects;
19 +
20 +import static com.google.common.base.MoreObjects.toStringHelper;
21 +
22 +/**
23 + * Implementation of OTU port (Optical channel Transport Unit).
24 + */
25 +
26 +public class OtuPort extends DefaultPort {
27 +
28 + private final OtuSignalType signalType;
29 +
30 + /**
31 + * Creates an OTU port in the specified network element.
32 + *
33 + * @param element parent network element
34 + * @param number port number
35 + * @param isEnabled port enabled state
36 + * @param signalType OTU signal type
37 + * @param annotations optional key/value annotations
38 + */
39 + public OtuPort(Element element, PortNumber number, boolean isEnabled,
40 + OtuSignalType signalType, Annotations... annotations) {
41 + super(element, number, isEnabled, Type.OTU, 0, annotations);
42 + this.signalType = signalType;
43 + }
44 +
45 + /**
46 + * Returns OTU signal type.
47 + *
48 + * @return OTU signal type
49 + */
50 + public OtuSignalType signalType() {
51 + return signalType;
52 + }
53 +
54 + @Override
55 + public int hashCode() {
56 + return Objects.hash(number(), isEnabled(), type(), signalType, annotations());
57 + }
58 +
59 + @Override
60 + public boolean equals(Object obj) {
61 + if (this == obj) {
62 + return true;
63 + }
64 + if (obj instanceof OtuPort) {
65 + final OtuPort other = (OtuPort) obj;
66 + return Objects.equals(this.element().id(), other.element().id()) &&
67 + Objects.equals(this.number(), other.number()) &&
68 + Objects.equals(this.isEnabled(), other.isEnabled()) &&
69 + Objects.equals(this.signalType, other.signalType) &&
70 + Objects.equals(this.annotations(), other.annotations());
71 + }
72 + return false;
73 + }
74 +
75 +
76 + @Override
77 + public String toString() {
78 + return toStringHelper(this)
79 + .add("element", element().id())
80 + .add("number", number())
81 + .add("isEnabled", isEnabled())
82 + .add("type", type())
83 + .add("signalType", signalType)
84 + .toString();
85 + }
86 +
87 +}
...\ No newline at end of file ...\ No newline at end of file
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 +package org.onosproject.net;
18 +
19 +/**
20 + * Represents OTU (Optical channel Transport Unit) signal type.
21 + *
22 + * <p>
23 + * See ITU G.709 "Interfaces for the Optical Transport Network (OTN)" and
24 + * Open Networking Foundation "Optical Transport Protocol Extensions Version 1.0".
25 + * </p>
26 + */
27 +public enum OtuSignalType {
28 + OTU1,
29 + OTU2,
30 + OTU3,
31 + OTU4
32 +}
...\ No newline at end of file ...\ No newline at end of file
...@@ -58,7 +58,12 @@ public interface Port extends Annotated { ...@@ -58,7 +58,12 @@ public interface Port extends Annotated {
58 /** 58 /**
59 * Signifies virtual port. 59 * Signifies virtual port.
60 */ 60 */
61 - VIRTUAL 61 + VIRTUAL,
62 +
63 + /**
64 + * Signifies optical fiber-based OTN port.
65 + */
66 + OTU
62 } 67 }
63 68
64 /** 69 /**
......
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.device;
17 +
18 +import com.google.common.base.MoreObjects;
19 +
20 +import org.onosproject.net.OtuSignalType;
21 +import org.onosproject.net.Port;
22 +import org.onosproject.net.PortNumber;
23 +import org.onosproject.net.SparseAnnotations;
24 +
25 +/**
26 + * Default implementation of immutable OTU port description.
27 + */
28 +public class OtuPortDescription extends DefaultPortDescription {
29 +
30 + private final OtuSignalType signalType;
31 +
32 + /**
33 + * Creates OTU port description based on the supplied information.
34 + *
35 + * @param number port number
36 + * @param isEnabled port enabled state
37 + * @param signalType OTU signal type
38 + * @param annotations optional key/value annotations map
39 + */
40 + public OtuPortDescription(PortNumber number, boolean isEnabled, OtuSignalType signalType,
41 + SparseAnnotations... annotations) {
42 + super(number, isEnabled, Port.Type.OTU, 0, annotations);
43 + this.signalType = signalType;
44 + }
45 +
46 + /**
47 + * Creates OTU port description based on the supplied information.
48 + *
49 + * @param base PortDescription to get basic information from
50 + * @param signalType OTU signal type
51 + * @param annotations optional key/value annotations map
52 + */
53 + public OtuPortDescription(PortDescription base, OtuSignalType signalType,
54 + SparseAnnotations annotations) {
55 + super(base, annotations);
56 + this.signalType = signalType;
57 + }
58 +
59 + /**
60 + * Returns OTU signal type.
61 + *
62 + * @return OTU signal type
63 + */
64 + public OtuSignalType signalType() {
65 + return signalType;
66 + }
67 +
68 + @Override
69 + public String toString() {
70 + return MoreObjects.toStringHelper(getClass())
71 + .add("number", portNumber())
72 + .add("isEnabled", isEnabled())
73 + .add("type", type())
74 + .add("signalType", signalType)
75 + .toString();
76 + }
77 +
78 +}
...\ No newline at end of file ...\ No newline at end of file
...@@ -352,7 +352,8 @@ public class DeviceManager ...@@ -352,7 +352,8 @@ public class DeviceManager
352 final Device device = getDevice(deviceId); 352 final Device device = getDevice(deviceId);
353 353
354 List<PortDescription> descs = ports.stream().map( 354 List<PortDescription> descs = ports.stream().map(
355 - port -> (!(Device.Type.ROADM.equals(device.type()))) ? 355 + port -> (!(Device.Type.ROADM.equals(device.type()) ||
356 + (Device.Type.OTN.equals(device.type())))) ?
356 new DefaultPortDescription(port.number(), false, 357 new DefaultPortDescription(port.number(), false,
357 port.type(), port.portSpeed()) : 358 port.type(), port.portSpeed()) :
358 OpticalPortOperator.descriptionOf(port, false) 359 OpticalPortOperator.descriptionOf(port, false)
...@@ -439,7 +440,8 @@ public class DeviceManager ...@@ -439,7 +440,8 @@ public class DeviceManager
439 return; 440 return;
440 } 441 }
441 Device device = nullIsNotFound(getDevice(deviceId), "Device not found"); 442 Device device = nullIsNotFound(getDevice(deviceId), "Device not found");
442 - if ((Device.Type.ROADM.equals(device.type()))) { 443 + if ((Device.Type.ROADM.equals(device.type())) ||
444 + (Device.Type.OTN.equals(device.type()))) {
443 Port port = getPort(deviceId, portDescription.portNumber()); 445 Port port = getPort(deviceId, portDescription.portNumber());
444 portDescription = OpticalPortOperator.descriptionOf(port, portDescription.isEnabled()); 446 portDescription = OpticalPortOperator.descriptionOf(port, portDescription.isEnabled());
445 } 447 }
......
...@@ -23,6 +23,7 @@ import org.onosproject.net.config.basics.OpticalPortConfig; ...@@ -23,6 +23,7 @@ import org.onosproject.net.config.basics.OpticalPortConfig;
23 import org.onosproject.net.AnnotationKeys; 23 import org.onosproject.net.AnnotationKeys;
24 import org.onosproject.net.DefaultAnnotations; 24 import org.onosproject.net.DefaultAnnotations;
25 import org.onosproject.net.OchPort; 25 import org.onosproject.net.OchPort;
26 +import org.onosproject.net.OtuPort;
26 import org.onosproject.net.OduCltPort; 27 import org.onosproject.net.OduCltPort;
27 import org.onosproject.net.OmsPort; 28 import org.onosproject.net.OmsPort;
28 import org.onosproject.net.Port; 29 import org.onosproject.net.Port;
...@@ -32,6 +33,7 @@ import org.onosproject.net.device.DefaultPortDescription; ...@@ -32,6 +33,7 @@ import org.onosproject.net.device.DefaultPortDescription;
32 import org.onosproject.net.device.OchPortDescription; 33 import org.onosproject.net.device.OchPortDescription;
33 import org.onosproject.net.device.OduCltPortDescription; 34 import org.onosproject.net.device.OduCltPortDescription;
34 import org.onosproject.net.device.OmsPortDescription; 35 import org.onosproject.net.device.OmsPortDescription;
36 +import org.onosproject.net.device.OtuPortDescription;
35 import org.onosproject.net.device.PortDescription; 37 import org.onosproject.net.device.PortDescription;
36 import org.slf4j.Logger; 38 import org.slf4j.Logger;
37 39
...@@ -115,6 +117,9 @@ public final class OpticalPortOperator implements ConfigOperator { ...@@ -115,6 +117,9 @@ public final class OpticalPortOperator implements ConfigOperator {
115 case COPPER: 117 case COPPER:
116 return new DefaultPortDescription(port, descr.isEnabled(), descr.type(), 118 return new DefaultPortDescription(port, descr.isEnabled(), descr.type(),
117 descr.portSpeed(), sa); 119 descr.portSpeed(), sa);
120 + case OTU:
121 + OtuPortDescription otu = (OtuPortDescription) descr;
122 + return new OtuPortDescription(port, otu.isEnabled(), otu.signalType(), sa);
118 default: 123 default:
119 log.warn("Unsupported optical port type {} - can't update", descr.type()); 124 log.warn("Unsupported optical port type {} - can't update", descr.type());
120 return descr; 125 return descr;
...@@ -183,6 +188,9 @@ public final class OpticalPortOperator implements ConfigOperator { ...@@ -183,6 +188,9 @@ public final class OpticalPortOperator implements ConfigOperator {
183 case ODUCLT: 188 case ODUCLT:
184 OduCltPort odu = (OduCltPort) port; 189 OduCltPort odu = (OduCltPort) port;
185 return new OduCltPortDescription(ptn, isup, odu.signalType(), an); 190 return new OduCltPortDescription(ptn, isup, odu.signalType(), an);
191 + case OTU:
192 + OtuPort otu = (OtuPort) port;
193 + return new OtuPortDescription(ptn, isup, otu.signalType(), an);
186 default: 194 default:
187 return new DefaultPortDescription(ptn, isup, port.type(), port.portSpeed(), an); 195 return new DefaultPortDescription(ptn, isup, port.type(), port.portSpeed(), an);
188 } 196 }
......
...@@ -34,11 +34,13 @@ import java.net.URI; ...@@ -34,11 +34,13 @@ import java.net.URI;
34 import static org.junit.Assert.assertEquals; 34 import static org.junit.Assert.assertEquals;
35 import static org.onosproject.net.Device.Type.ROADM; 35 import static org.onosproject.net.Device.Type.ROADM;
36 import static org.onosproject.net.Device.Type.SWITCH; 36 import static org.onosproject.net.Device.Type.SWITCH;
37 +import static org.onosproject.net.Device.Type.OTN;
37 38
38 public class BasicDeviceOperatorTest { 39 public class BasicDeviceOperatorTest {
39 40
40 private static final String NAME1 = "of:foo"; 41 private static final String NAME1 = "of:foo";
41 private static final String NAME2 = "of:bar"; 42 private static final String NAME2 = "of:bar";
43 + private static final String NAME3 = "of:otn";
42 private static final String OWNER = "somebody"; 44 private static final String OWNER = "somebody";
43 private static final URI DURI = URI.create(NAME1); 45 private static final URI DURI = URI.create(NAME1);
44 private static final String MFR = "whitebox"; 46 private static final String MFR = "whitebox";
...@@ -64,6 +66,7 @@ public class BasicDeviceOperatorTest { ...@@ -64,6 +66,7 @@ public class BasicDeviceOperatorTest {
64 66
65 private static final BasicDeviceConfig SW_BDC = new BasicDeviceConfig(); 67 private static final BasicDeviceConfig SW_BDC = new BasicDeviceConfig();
66 private static final BasicDeviceConfig RD_BDC = new BasicDeviceConfig(); 68 private static final BasicDeviceConfig RD_BDC = new BasicDeviceConfig();
69 + private static final BasicDeviceConfig OT_BDC = new BasicDeviceConfig();
67 70
68 @Before 71 @Before
69 public void setUp() { 72 public void setUp() {
...@@ -72,6 +75,8 @@ public class BasicDeviceOperatorTest { ...@@ -72,6 +75,8 @@ public class BasicDeviceOperatorTest {
72 RD_BDC.init(DeviceId.deviceId(NAME2), NAME2, JsonNodeFactory.instance.objectNode(), mapper, delegate); 75 RD_BDC.init(DeviceId.deviceId(NAME2), NAME2, JsonNodeFactory.instance.objectNode(), mapper, delegate);
73 RD_BDC.type(ROADM).manufacturer(MANUFACTURER).hwVersion(HW_VERSION) 76 RD_BDC.type(ROADM).manufacturer(MANUFACTURER).hwVersion(HW_VERSION)
74 .swVersion(SW_VERSION).serial(SERIAL).managementAddress(MANAGEMENT_ADDRESS).driver(DRIVER).owner(OWNER); 77 .swVersion(SW_VERSION).serial(SERIAL).managementAddress(MANAGEMENT_ADDRESS).driver(DRIVER).owner(OWNER);
78 + OT_BDC.init(DeviceId.deviceId(NAME3), NAME3, JsonNodeFactory.instance.objectNode(), mapper, delegate);
79 + OT_BDC.type(OTN);
75 } 80 }
76 81
77 @Test 82 @Test
...@@ -92,5 +97,9 @@ public class BasicDeviceOperatorTest { ...@@ -92,5 +97,9 @@ public class BasicDeviceOperatorTest {
92 assertEquals("Wrong serial", SERIAL, desc.serialNumber()); 97 assertEquals("Wrong serial", SERIAL, desc.serialNumber());
93 assertEquals("Wrong management Address", MANAGEMENT_ADDRESS, 98 assertEquals("Wrong management Address", MANAGEMENT_ADDRESS,
94 desc.annotations().value(AnnotationKeys.MANAGEMENT_ADDRESS)); 99 desc.annotations().value(AnnotationKeys.MANAGEMENT_ADDRESS));
100 +
101 + // override Device type
102 + desc = BasicDeviceOperator.combine(OT_BDC, DEV1);
103 + assertEquals(OTN, desc.type());
95 } 104 }
96 } 105 }
......
...@@ -31,6 +31,7 @@ import org.onosproject.net.device.DeviceDescription; ...@@ -31,6 +31,7 @@ import org.onosproject.net.device.DeviceDescription;
31 import org.onosproject.net.device.OchPortDescription; 31 import org.onosproject.net.device.OchPortDescription;
32 import org.onosproject.net.device.OduCltPortDescription; 32 import org.onosproject.net.device.OduCltPortDescription;
33 import org.onosproject.net.device.OmsPortDescription; 33 import org.onosproject.net.device.OmsPortDescription;
34 +import org.onosproject.net.device.OtuPortDescription;
34 import org.onosproject.net.device.PortDescription; 35 import org.onosproject.net.device.PortDescription;
35 import org.onosproject.store.Timestamp; 36 import org.onosproject.store.Timestamp;
36 import org.onosproject.store.impl.Timestamped; 37 import org.onosproject.store.impl.Timestamped;
...@@ -123,6 +124,13 @@ class DeviceDescriptions { ...@@ -123,6 +124,13 @@ class DeviceDescriptions {
123 ocDesc, ocDesc.signalType(), merged), 124 ocDesc, ocDesc.signalType(), merged),
124 newDesc.timestamp()); 125 newDesc.timestamp());
125 break; 126 break;
127 + case OTU:
128 + OtuPortDescription otuDesc = (OtuPortDescription) (newDesc.value());
129 + newOne = new Timestamped<>(
130 + new OtuPortDescription(
131 + otuDesc, otuDesc.signalType(), merged),
132 + newDesc.timestamp());
133 + break;
126 default: 134 default:
127 newOne = new Timestamped<>( 135 newOne = new Timestamped<>(
128 new DefaultPortDescription(newDesc.value(), merged), 136 new DefaultPortDescription(newDesc.value(), merged),
......
...@@ -48,6 +48,7 @@ import org.onosproject.net.MastershipRole; ...@@ -48,6 +48,7 @@ import org.onosproject.net.MastershipRole;
48 import org.onosproject.net.OchPort; 48 import org.onosproject.net.OchPort;
49 import org.onosproject.net.OduCltPort; 49 import org.onosproject.net.OduCltPort;
50 import org.onosproject.net.OmsPort; 50 import org.onosproject.net.OmsPort;
51 +import org.onosproject.net.OtuPort;
51 import org.onosproject.net.Port; 52 import org.onosproject.net.Port;
52 import org.onosproject.net.PortNumber; 53 import org.onosproject.net.PortNumber;
53 import org.onosproject.net.device.DefaultPortStatistics; 54 import org.onosproject.net.device.DefaultPortStatistics;
...@@ -59,6 +60,7 @@ import org.onosproject.net.device.DeviceStoreDelegate; ...@@ -59,6 +60,7 @@ import org.onosproject.net.device.DeviceStoreDelegate;
59 import org.onosproject.net.device.OchPortDescription; 60 import org.onosproject.net.device.OchPortDescription;
60 import org.onosproject.net.device.OduCltPortDescription; 61 import org.onosproject.net.device.OduCltPortDescription;
61 import org.onosproject.net.device.OmsPortDescription; 62 import org.onosproject.net.device.OmsPortDescription;
63 +import org.onosproject.net.device.OtuPortDescription;
62 import org.onosproject.net.device.PortDescription; 64 import org.onosproject.net.device.PortDescription;
63 import org.onosproject.net.device.PortStatistics; 65 import org.onosproject.net.device.PortStatistics;
64 import org.onosproject.net.provider.ProviderId; 66 import org.onosproject.net.provider.ProviderId;
...@@ -1095,6 +1097,9 @@ public class GossipDeviceStore ...@@ -1095,6 +1097,9 @@ public class GossipDeviceStore
1095 case ODUCLT: 1097 case ODUCLT:
1096 OduCltPortDescription oduDesc = (OduCltPortDescription) description; 1098 OduCltPortDescription oduDesc = (OduCltPortDescription) description;
1097 return new OduCltPort(device, number, isEnabled, oduDesc.signalType(), annotations); 1099 return new OduCltPort(device, number, isEnabled, oduDesc.signalType(), annotations);
1100 + case OTU:
1101 + OtuPortDescription otuDesc = (OtuPortDescription) description;
1102 + return new OtuPort(device, number, isEnabled, otuDesc.signalType(), annotations);
1098 default: 1103 default:
1099 return new DefaultPort(device, number, isEnabled, description.type(), 1104 return new DefaultPort(device, number, isEnabled, description.type(),
1100 description.portSpeed(), annotations); 1105 description.portSpeed(), annotations);
......
...@@ -77,6 +77,8 @@ import org.onosproject.net.OduCltPort; ...@@ -77,6 +77,8 @@ import org.onosproject.net.OduCltPort;
77 import org.onosproject.net.OduSignalId; 77 import org.onosproject.net.OduSignalId;
78 import org.onosproject.net.OduSignalType; 78 import org.onosproject.net.OduSignalType;
79 import org.onosproject.net.OmsPort; 79 import org.onosproject.net.OmsPort;
80 +import org.onosproject.net.OtuPort;
81 +import org.onosproject.net.OtuSignalType;
80 import org.onosproject.net.Port; 82 import org.onosproject.net.Port;
81 import org.onosproject.net.PortNumber; 83 import org.onosproject.net.PortNumber;
82 import org.onosproject.net.TributarySlot; 84 import org.onosproject.net.TributarySlot;
...@@ -85,6 +87,7 @@ import org.onosproject.net.device.DefaultPortDescription; ...@@ -85,6 +87,7 @@ import org.onosproject.net.device.DefaultPortDescription;
85 import org.onosproject.net.device.DefaultPortStatistics; 87 import org.onosproject.net.device.DefaultPortStatistics;
86 import org.onosproject.net.device.OchPortDescription; 88 import org.onosproject.net.device.OchPortDescription;
87 import org.onosproject.net.device.OduCltPortDescription; 89 import org.onosproject.net.device.OduCltPortDescription;
90 +import org.onosproject.net.device.OtuPortDescription;
88 import org.onosproject.net.device.OmsPortDescription; 91 import org.onosproject.net.device.OmsPortDescription;
89 import org.onosproject.net.device.PortStatistics; 92 import org.onosproject.net.device.PortStatistics;
90 import org.onosproject.net.flow.CompletedBatchOperation; 93 import org.onosproject.net.flow.CompletedBatchOperation;
...@@ -511,6 +514,9 @@ public final class KryoNamespaces { ...@@ -511,6 +514,9 @@ public final class KryoNamespaces {
511 .register(OchPortDescription.class) 514 .register(OchPortDescription.class)
512 .register(OmsPortDescription.class) 515 .register(OmsPortDescription.class)
513 .register(TributarySlot.class) 516 .register(TributarySlot.class)
517 + .register(OtuPort.class)
518 + .register(OtuSignalType.class)
519 + .register(OtuPortDescription.class)
514 .register( 520 .register(
515 MplsIntent.class, 521 MplsIntent.class,
516 MplsPathIntent.class, 522 MplsPathIntent.class,
......
...@@ -52,6 +52,8 @@ import org.onosproject.net.OchPort; ...@@ -52,6 +52,8 @@ import org.onosproject.net.OchPort;
52 import org.onosproject.net.OchSignal; 52 import org.onosproject.net.OchSignal;
53 import org.onosproject.net.OduCltPort; 53 import org.onosproject.net.OduCltPort;
54 import org.onosproject.net.OmsPort; 54 import org.onosproject.net.OmsPort;
55 +import org.onosproject.net.OtuPort;
56 +import org.onosproject.net.OtuSignalType;
55 import org.onosproject.net.PortNumber; 57 import org.onosproject.net.PortNumber;
56 import org.onosproject.net.OduSignalType; 58 import org.onosproject.net.OduSignalType;
57 import org.onosproject.net.SparseAnnotations; 59 import org.onosproject.net.SparseAnnotations;
...@@ -225,6 +227,11 @@ public class KryoSerializerTest { ...@@ -225,6 +227,11 @@ public class KryoSerializerTest {
225 } 227 }
226 228
227 @Test 229 @Test
230 + public void testOtuPort() {
231 + testSerializedEquals(new OtuPort(DEV1, P1, true, OtuSignalType.OTU2));
232 + testSerializedEquals(new OtuPort(DEV1, P1, true, OtuSignalType.OTU2, A1_2));
233 + }
234 + @Test
228 public void testDeviceId() { 235 public void testDeviceId() {
229 testSerializedEquals(DID1); 236 testSerializedEquals(DID1);
230 } 237 }
......
...@@ -186,7 +186,7 @@ public class LldpLinkProvider extends AbstractProvider implements LinkProvider { ...@@ -186,7 +186,7 @@ public class LldpLinkProvider extends AbstractProvider implements LinkProvider {
186 private ApplicationId appId; 186 private ApplicationId appId;
187 187
188 static final SuppressionRules DEFAULT_RULES 188 static final SuppressionRules DEFAULT_RULES
189 - = new SuppressionRules(EnumSet.of(Device.Type.ROADM, Device.Type.FIBER_SWITCH), 189 + = new SuppressionRules(EnumSet.of(Device.Type.ROADM, Device.Type.FIBER_SWITCH, Device.Type.OTN),
190 ImmutableMap.of(NO_LLDP, SuppressionRules.ANY_VALUE)); 190 ImmutableMap.of(NO_LLDP, SuppressionRules.ANY_VALUE));
191 191
192 private SuppressionRules rules = LldpLinkProvider.DEFAULT_RULES; 192 private SuppressionRules rules = LldpLinkProvider.DEFAULT_RULES;
......
...@@ -51,7 +51,7 @@ public class SuppressionRulesTest { ...@@ -51,7 +51,7 @@ public class SuppressionRulesTest {
51 51
52 @Before 52 @Before
53 public void setUp() throws Exception { 53 public void setUp() throws Exception {
54 - rules = new SuppressionRules(ImmutableSet.of(Device.Type.ROADM), 54 + rules = new SuppressionRules(ImmutableSet.of(Device.Type.ROADM, Device.Type.OTN),
55 ImmutableMap.of("no-lldp", SuppressionRules.ANY_VALUE, 55 ImmutableMap.of("no-lldp", SuppressionRules.ANY_VALUE,
56 "sendLLDP", "false")); 56 "sendLLDP", "false"));
57 } 57 }
......
...@@ -54,6 +54,7 @@ import org.onosproject.net.GridType; ...@@ -54,6 +54,7 @@ import org.onosproject.net.GridType;
54 import org.onosproject.net.MastershipRole; 54 import org.onosproject.net.MastershipRole;
55 import org.onosproject.net.OchSignal; 55 import org.onosproject.net.OchSignal;
56 import org.onosproject.net.OduSignalType; 56 import org.onosproject.net.OduSignalType;
57 +import org.onosproject.net.OtuSignalType;
57 import org.onosproject.net.Port; 58 import org.onosproject.net.Port;
58 import org.onosproject.net.PortNumber; 59 import org.onosproject.net.PortNumber;
59 import org.onosproject.net.SparseAnnotations; 60 import org.onosproject.net.SparseAnnotations;
...@@ -67,6 +68,7 @@ import org.onosproject.net.device.DeviceProviderService; ...@@ -67,6 +68,7 @@ import org.onosproject.net.device.DeviceProviderService;
67 import org.onosproject.net.device.OchPortDescription; 68 import org.onosproject.net.device.OchPortDescription;
68 import org.onosproject.net.device.OduCltPortDescription; 69 import org.onosproject.net.device.OduCltPortDescription;
69 import org.onosproject.net.device.OmsPortDescription; 70 import org.onosproject.net.device.OmsPortDescription;
71 +import org.onosproject.net.device.OtuPortDescription;
70 import org.onosproject.net.device.PortDescription; 72 import org.onosproject.net.device.PortDescription;
71 import org.onosproject.net.device.PortStatistics; 73 import org.onosproject.net.device.PortStatistics;
72 import org.onosproject.net.provider.AbstractProvider; 74 import org.onosproject.net.provider.AbstractProvider;
...@@ -492,13 +494,15 @@ public class OpenFlowDeviceProvider extends AbstractProvider implements DevicePr ...@@ -492,13 +494,15 @@ public class OpenFlowDeviceProvider extends AbstractProvider implements DevicePr
492 */ 494 */
493 private List<PortDescription> buildPortDescriptions(OpenFlowSwitch sw) { 495 private List<PortDescription> buildPortDescriptions(OpenFlowSwitch sw) {
494 final List<PortDescription> portDescs = new ArrayList<>(sw.getPorts().size()); 496 final List<PortDescription> portDescs = new ArrayList<>(sw.getPorts().size());
495 - if (!(Device.Type.ROADM.equals(sw.deviceType()))) { 497 + if (!((Device.Type.ROADM.equals(sw.deviceType())) ||
498 + (Device.Type.OTN.equals(sw.deviceType())))) {
496 sw.getPorts().forEach(port -> portDescs.add(buildPortDescription(port))); 499 sw.getPorts().forEach(port -> portDescs.add(buildPortDescription(port)));
497 } 500 }
498 501
499 OpenFlowOpticalSwitch opsw; 502 OpenFlowOpticalSwitch opsw;
500 switch (sw.deviceType()) { 503 switch (sw.deviceType()) {
501 case ROADM: 504 case ROADM:
505 + case OTN:
502 opsw = (OpenFlowOpticalSwitch) sw; 506 opsw = (OpenFlowOpticalSwitch) sw;
503 List<OFPortDesc> ports = opsw.getPorts(); 507 List<OFPortDesc> ports = opsw.getPorts();
504 LOG.debug("SW ID {} , ETH- ODU CLT Ports {}", opsw.getId(), ports); 508 LOG.debug("SW ID {} , ETH- ODU CLT Ports {}", opsw.getId(), ports);
...@@ -578,6 +582,24 @@ public class OpenFlowDeviceProvider extends AbstractProvider implements DevicePr ...@@ -578,6 +582,24 @@ public class OpenFlowDeviceProvider extends AbstractProvider implements DevicePr
578 return buildPortDescription(ptype, (OFExpPort) port); 582 return buildPortDescription(ptype, (OFExpPort) port);
579 } 583 }
580 584
585 + private boolean matchingOtuPortSignalTypes(OFPortOpticalTransportSignalType sigType,
586 + OduSignalType oduSignalType) {
587 + switch (sigType) {
588 + case OTU2:
589 + if (oduSignalType == OduSignalType.ODU2) {
590 + return true;
591 + }
592 + break;
593 + case OTU4:
594 + if (oduSignalType == OduSignalType.ODU4) {
595 + return true;
596 + }
597 + break;
598 + default:
599 + break;
600 + }
601 + return false;
602 + }
581 /** 603 /**
582 * Build a portDescription from a given a port description describing some 604 * Build a portDescription from a given a port description describing some
583 * Optical port. 605 * Optical port.
...@@ -622,8 +644,25 @@ public class OpenFlowDeviceProvider extends AbstractProvider implements DevicePr ...@@ -622,8 +644,25 @@ public class OpenFlowDeviceProvider extends AbstractProvider implements DevicePr
622 break; 644 break;
623 case OTU2: 645 case OTU2:
624 case OTU4: 646 case OTU4:
625 - LOG.error("Signal tpye OTU2/4 not supported yet ", port.toString()); 647 + entry = firstProp.getFeatures().get(0).getValue().get(0);
626 - break; 648 + layerClass = entry.getLayerClass();
649 + if (!OFPortOpticalTransportLayerClass.ODU.equals(layerClass)) {
650 + LOG.error("Unsupported layer Class {} ", layerClass);
651 + return null;
652 + }
653 +
654 + // convert to ONOS OduSignalType
655 + OduSignalType oduSignalTypeOtuPort = OpenFlowDeviceValueMapper.
656 + lookupOduSignalType((byte) entry.getSignalType());
657 + if (!matchingOtuPortSignalTypes(sigType, oduSignalTypeOtuPort)) {
658 + LOG.error("Wrong oduSignalType {} for OTU Port sigType {} ", oduSignalTypeOtuPort, sigType);
659 + return null;
660 + }
661 + OtuSignalType otuSignalType =
662 + ((sigType == OFPortOpticalTransportSignalType.OTU2) ? OtuSignalType.OTU2 :
663 + OtuSignalType.OTU4);
664 + portDes = new OtuPortDescription(portNo, enabled, otuSignalType, annotations);
665 + break;
627 default: 666 default:
628 break; 667 break;
629 } 668 }
......
...@@ -611,12 +611,14 @@ public class TopologyViewMessageHandler extends TopologyViewMessageHandlerBase { ...@@ -611,12 +611,14 @@ public class TopologyViewMessageHandler extends TopologyViewMessageHandlerBase {
611 private void sendAllDevices() { 611 private void sendAllDevices() {
612 // Send optical first, others later for layered rendering 612 // Send optical first, others later for layered rendering
613 for (Device device : deviceService.getDevices()) { 613 for (Device device : deviceService.getDevices()) {
614 - if (device.type() == Device.Type.ROADM) { 614 + if ((device.type() == Device.Type.ROADM) ||
615 + (device.type() == Device.Type.OTN)) {
615 sendMessage(deviceMessage(new DeviceEvent(DEVICE_ADDED, device))); 616 sendMessage(deviceMessage(new DeviceEvent(DEVICE_ADDED, device)));
616 } 617 }
617 } 618 }
618 for (Device device : deviceService.getDevices()) { 619 for (Device device : deviceService.getDevices()) {
619 - if (device.type() != Device.Type.ROADM) { 620 + if ((device.type() != Device.Type.ROADM) &&
621 + (device.type() != Device.Type.OTN)) {
620 sendMessage(deviceMessage(new DeviceEvent(DEVICE_ADDED, device))); 622 sendMessage(deviceMessage(new DeviceEvent(DEVICE_ADDED, device)));
621 } 623 }
622 } 624 }
......
...@@ -131,6 +131,7 @@ ...@@ -131,6 +131,7 @@
131 icon(grp, 'router', [250, 0]); 131 icon(grp, 'router', [250, 0]);
132 icon(grp, 'bgpSpeaker', [300, 0]); 132 icon(grp, 'bgpSpeaker', [300, 0]);
133 icon(grp, 'uiAttached', [350, 0]); 133 icon(grp, 'uiAttached', [350, 0]);
134 + icon(grp, 'otn', [400, 0]);
134 135
135 icon(grp, 'chain', [ 0, 60]); 136 icon(grp, 'chain', [ 0, 60]);
136 icon(grp, 'crown', [ 50, 60]); 137 icon(grp, 'crown', [ 50, 60]);
......
...@@ -88,6 +88,11 @@ ...@@ -88,6 +88,11 @@
88 "M52,40l-12,0,0-8-18,13,18,13,0-8,12,0zM52,74l-12,0,0-8-18,13," + 88 "M52,40l-12,0,0-8-18,13,18,13,0-8,12,0zM52,74l-12,0,0-8-18,13," +
89 "18,13,0-8,12,0z", 89 "18,13,0-8,12,0z",
90 90
91 + otn: "M10,35l25-25h40l25,25v40l-25,25h-40l-25-25zM58,26l12,0,0" +
92 + "-8,18,13-18,13,0-8-12,0zM58,60l12,0,0-8,18,13-18,13,0-8-12,0z" +
93 + "M52,40l-12,0,0-8-18,13,18,13,0-8,12,0zM52,74l-12,0,0-8-18,13," +
94 + "18,13,0-8,12,0z",
95 +
91 endstation: "M10,15a5,5,0,0,1,5-5h65a5,5,0,0,1,5,5v80a5,5,0,0,1" + 96 endstation: "M10,15a5,5,0,0,1,5-5h65a5,5,0,0,1,5,5v80a5,5,0,0,1" +
92 "-5,5h-65a5,5,0,0,1-5-5zM87.5,14l11,11a3,10,0,0,1,2,10v40a3,10," + 97 "-5,5h-65a5,5,0,0,1-5-5zM87.5,14l11,11a3,10,0,0,1,2,10v40a3,10," +
93 "0,0,1,-2,10l-11,11zM17,19a2,2,0,0,1,2-2h56a2,2,0,0,1,2,2v26a2," + 98 "0,0,1,-2,10l-11,11zM17,19a2,2,0,0,1,2-2h56a2,2,0,0,1,2,2v26a2," +
......
...@@ -49,6 +49,7 @@ ...@@ -49,6 +49,7 @@
49 49
50 devIcon_SWITCH: 'switch', 50 devIcon_SWITCH: 'switch',
51 devIcon_ROADM: 'roadm', 51 devIcon_ROADM: 'roadm',
52 + devIcon_OTN: 'otn',
52 deviceTable: 'switch', 53 deviceTable: 'switch',
53 flowTable: 'flowTable', 54 flowTable: 'flowTable',
54 portTable: 'portTable', 55 portTable: 'portTable',
......
...@@ -44,7 +44,8 @@ ...@@ -44,7 +44,8 @@
44 }, 44 },
45 device: { 45 device: {
46 switch: 'pkt', 46 switch: 'pkt',
47 - roadm: 'opt' 47 + roadm: 'opt',
48 + otn: 'opt'
48 }, 49 },
49 link: { 50 link: {
50 hostLink: 'pkt', 51 hostLink: 'pkt',
......
...@@ -223,7 +223,8 @@ ...@@ -223,7 +223,8 @@
223 223
224 var isDevice = { 224 var isDevice = {
225 switch: 1, 225 switch: 1,
226 - roadm: 1 226 + roadm: 1,
227 + otn:1
227 }; 228 };
228 229
229 function displaySingle(data) { 230 function displaySingle(data) {
......