Sho SHIMIZU
Committed by Gerrit Code Review

Define Lambda interface representing wavelength and implementations

Two Lambda implementations are defined.
- IndexedLambda
- OchSignal

Change-Id: I36763390f61abd9f861e76edab63f558ae97e8a2
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;
17 +
18 +import com.google.common.base.MoreObjects;
19 +
20 +/**
21 + * Implementation of Lambda simply designated by an index number of wavelength.
22 + */
23 +public class IndexedLambda implements Lambda {
24 +
25 + private final long lambda;
26 +
27 + /**
28 + * Creates an instance representing the wavelength specified by the given index number.
29 + *
30 + * @param lambda index number of wavelength
31 + */
32 + IndexedLambda(long lambda) {
33 + this.lambda = lambda;
34 + }
35 +
36 + @Override
37 + public int hashCode() {
38 + return (int) (lambda ^ (lambda >>> 32));
39 + }
40 +
41 + @Override
42 + public boolean equals(Object obj) {
43 + if (this == obj) {
44 + return true;
45 + }
46 + if (!(obj instanceof IndexedLambda)) {
47 + return false;
48 + }
49 +
50 + final IndexedLambda that = (IndexedLambda) obj;
51 + return this.lambda == that.lambda;
52 + }
53 +
54 + @Override
55 + public String toString() {
56 + return MoreObjects.toStringHelper(this)
57 + .add("lambda", lambda)
58 + .toString();
59 + }
60 +}
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;
17 +
18 +/**
19 + * Abstraction of wavelength. Currently, this is just a marker interface
20 + */
21 +public interface Lambda {
22 + /**
23 + * Create an Lambda instance with the specified wavelength index number.
24 + *
25 + * @param lambda index number
26 + * @return an instance
27 + */
28 + static Lambda indexedLambda(long lambda) {
29 + return new IndexedLambda(lambda);
30 + }
31 +
32 + /**
33 + * Creates a Lambda instance with the specified arguments.
34 + *
35 + * @param gridType grid type
36 + * @param channelSpacing channel spacing
37 + * @param spacingMultiplier channel spacing multiplier
38 + * @param slotGranularity slot width granularity
39 + */
40 + static Lambda ochSignal(GridType gridType, ChannelSpacing channelSpacing,
41 + int spacingMultiplier, int slotGranularity) {
42 + return new OchSignal(gridType, channelSpacing, spacingMultiplier, slotGranularity);
43 + }
44 +}
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;
17 +
18 +import com.google.common.base.MoreObjects;
19 +import org.onlab.util.Frequency;
20 +
21 +import java.util.Objects;
22 +
23 +import static com.google.common.base.Preconditions.checkArgument;
24 +import static com.google.common.base.Preconditions.checkNotNull;
25 +
26 +/**
27 + * Implementation of Lambda representing OCh (Optical Channel) Signal.
28 + *
29 + * <p>
30 + * See ITU G.709 "Interfaces for the Optical Transport Network (OTN)".
31 + * </p>
32 + */
33 +// TODO: consider which is better, OchSignal or OpticalChannelSignal
34 +public class OchSignal implements Lambda {
35 +
36 + private static final Frequency CENTER_FREQUENCY = Frequency.ofTHz(193.1);
37 + private static final Frequency FLEX_GRID_SLOT = Frequency.ofGHz(12.5);
38 +
39 + private final GridType gridType;
40 + private final ChannelSpacing channelSpacing;
41 + // Frequency = 193.1 THz + spacingMultiplier * channelSpacing
42 + private final int spacingMultiplier;
43 + // Slot width = slotGranularity * 12.5 GHz
44 + private final int slotGranularity;
45 +
46 + /**
47 + * Creates an instance with the specified arguments.
48 + *
49 + * @param gridType grid type
50 + * @param channelSpacing channel spacing
51 + * @param spacingMultiplier channel spacing multiplier
52 + * @param slotGranularity slot width granularity
53 + */
54 + OchSignal(GridType gridType, ChannelSpacing channelSpacing,
55 + int spacingMultiplier, int slotGranularity) {
56 + this.gridType = checkNotNull(gridType);
57 + this.channelSpacing = checkNotNull(channelSpacing);
58 + // TODO: check the precondition for spacingMultiplier. Is negative value permitted?
59 + this.spacingMultiplier = spacingMultiplier;
60 +
61 + checkArgument(slotGranularity > 0, "slotGranularity must be more than 0, but %s", slotGranularity);
62 + this.slotGranularity = slotGranularity;
63 + }
64 +
65 + /**
66 + * Returns grid type.
67 + *
68 + * @return grid type
69 + */
70 + public GridType gridType() {
71 + return gridType;
72 + }
73 +
74 + /**
75 + * Returns channel spacing.
76 + *
77 + * @return channel spacing
78 + */
79 + public ChannelSpacing channelSpacing() {
80 + return channelSpacing;
81 + }
82 +
83 + /**
84 + * Returns spacing multiplier.
85 + *
86 + * @return spacing multiplier
87 + */
88 + public int spacingMultiplier() {
89 + return spacingMultiplier;
90 + }
91 +
92 + /**
93 + * Returns slow width granularity.
94 + *
95 + * @return slow width granularity
96 + */
97 + public int slotGranularity() {
98 + return slotGranularity;
99 + }
100 +
101 + /**
102 + * Returns central frequency in MHz.
103 + *
104 + * @return frequency in MHz
105 + */
106 + public Frequency centralFrequency() {
107 + return CENTER_FREQUENCY.add(channelSpacing().frequency().multiply(spacingMultiplier));
108 + }
109 +
110 + /**
111 + * Returns slot width.
112 + *
113 + * @return slot width
114 + */
115 + public Frequency slotWidth() {
116 + return FLEX_GRID_SLOT.multiply(slotGranularity);
117 + }
118 +
119 + @Override
120 + public int hashCode() {
121 + return Objects.hash(gridType, channelSpacing, spacingMultiplier, slotGranularity);
122 + }
123 +
124 + @Override
125 + public boolean equals(Object obj) {
126 + if (this == obj) {
127 + return true;
128 + }
129 + if (!(obj instanceof OchSignal)) {
130 + return false;
131 + }
132 + final OchSignal other = (OchSignal) obj;
133 + return Objects.equals(this.gridType, other.gridType)
134 + && Objects.equals(this.channelSpacing, other.channelSpacing)
135 + && Objects.equals(this.spacingMultiplier, other.spacingMultiplier)
136 + && Objects.equals(this.slotGranularity, other.slotGranularity);
137 + }
138 +
139 + @Override
140 + public String toString() {
141 + return MoreObjects.toStringHelper(this)
142 + .add("gridType", gridType)
143 + .add("channelSpacing", channelSpacing)
144 + .add("spacingMultiplier", spacingMultiplier)
145 + .add("slotGranularity", slotGranularity)
146 + .toString();
147 + }
148 +}
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;
17 +
18 +import com.google.common.testing.EqualsTester;
19 +import org.junit.Test;
20 +
21 +public class IndexedLambdaTest {
22 + @Test
23 + public void testEquality() {
24 + new EqualsTester()
25 + .addEqualityGroup(Lambda.indexedLambda(10), Lambda.indexedLambda(10))
26 + .addEqualityGroup(Lambda.indexedLambda(11), Lambda.indexedLambda(11), Lambda.indexedLambda(11))
27 + .testEquals();
28 + }
29 +}
...@@ -18,7 +18,6 @@ package org.onosproject.store.serializers; ...@@ -18,7 +18,6 @@ package org.onosproject.store.serializers;
18 import com.google.common.collect.ImmutableList; 18 import com.google.common.collect.ImmutableList;
19 import com.google.common.collect.ImmutableMap; 19 import com.google.common.collect.ImmutableMap;
20 import com.google.common.collect.ImmutableSet; 20 import com.google.common.collect.ImmutableSet;
21 -
22 import org.onlab.packet.ChassisId; 21 import org.onlab.packet.ChassisId;
23 import org.onlab.packet.Ip4Address; 22 import org.onlab.packet.Ip4Address;
24 import org.onlab.packet.Ip4Prefix; 23 import org.onlab.packet.Ip4Prefix;
...@@ -57,14 +56,16 @@ import org.onosproject.net.Element; ...@@ -57,14 +56,16 @@ import org.onosproject.net.Element;
57 import org.onosproject.net.GridType; 56 import org.onosproject.net.GridType;
58 import org.onosproject.net.HostId; 57 import org.onosproject.net.HostId;
59 import org.onosproject.net.HostLocation; 58 import org.onosproject.net.HostLocation;
59 +import org.onosproject.net.IndexedLambda;
60 import org.onosproject.net.Link; 60 import org.onosproject.net.Link;
61 import org.onosproject.net.LinkKey; 61 import org.onosproject.net.LinkKey;
62 import org.onosproject.net.OchPort; 62 import org.onosproject.net.OchPort;
63 +import org.onosproject.net.OchSignal;
63 import org.onosproject.net.OduCltPort; 64 import org.onosproject.net.OduCltPort;
65 +import org.onosproject.net.OduSignalType;
64 import org.onosproject.net.OmsPort; 66 import org.onosproject.net.OmsPort;
65 import org.onosproject.net.Port; 67 import org.onosproject.net.Port;
66 import org.onosproject.net.PortNumber; 68 import org.onosproject.net.PortNumber;
67 -import org.onosproject.net.OduSignalType;
68 import org.onosproject.net.device.DefaultDeviceDescription; 69 import org.onosproject.net.device.DefaultDeviceDescription;
69 import org.onosproject.net.device.DefaultPortDescription; 70 import org.onosproject.net.device.DefaultPortDescription;
70 import org.onosproject.net.flow.CompletedBatchOperation; 71 import org.onosproject.net.flow.CompletedBatchOperation;
...@@ -384,6 +385,8 @@ public final class KryoNamespaces { ...@@ -384,6 +385,8 @@ public final class KryoNamespaces {
384 .register(ChannelSpacing.class) 385 .register(ChannelSpacing.class)
385 .register(OduCltPort.class) 386 .register(OduCltPort.class)
386 .register(OduCltPort.SignalType.class) 387 .register(OduCltPort.SignalType.class)
388 + .register(IndexedLambda.class)
389 + .register(OchSignal.class)
387 .register( 390 .register(
388 MplsIntent.class, 391 MplsIntent.class,
389 MplsPathIntent.class, 392 MplsPathIntent.class,
......
...@@ -324,6 +324,18 @@ public class KryoSerializerTest { ...@@ -324,6 +324,18 @@ public class KryoSerializerTest {
324 } 324 }
325 325
326 @Test 326 @Test
327 + public void testIndexedLambda() {
328 + testSerializedEquals(org.onosproject.net.Lambda.indexedLambda(10L));
329 + }
330 +
331 + @Test
332 + public void testOchSignal() {
333 + testSerializedEquals(org.onosproject.net.Lambda.ochSignal(
334 + GridType.DWDM, ChannelSpacing.CHL_100GHZ, 1, 1
335 + ));
336 + }
337 +
338 + @Test
327 public void testDefaultLinkResourceRequest() { 339 public void testDefaultLinkResourceRequest() {
328 testSerializable(DefaultLinkResourceRequest.builder(IntentId.valueOf(2501), ImmutableList.of()) 340 testSerializable(DefaultLinkResourceRequest.builder(IntentId.valueOf(2501), ImmutableList.of())
329 .addLambdaRequest() 341 .addLambdaRequest()
......