| /* |
| * Copyright 2016-present Open Networking Laboratory |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package org.onosproject.net.resource.impl; |
| |
| import com.google.common.collect.ImmutableSet; |
| import org.junit.After; |
| import org.junit.Before; |
| import org.junit.Test; |
| import org.onlab.packet.MplsLabel; |
| import org.onlab.packet.VlanId; |
| import org.onlab.util.Identifier; |
| import org.onosproject.core.IdGenerator; |
| import org.onosproject.net.ConnectPoint; |
| import org.onosproject.net.DefaultLink; |
| import org.onosproject.net.EncapsulationType; |
| import org.onosproject.net.Link; |
| import org.onosproject.net.LinkKey; |
| import org.onosproject.net.intent.IntentId; |
| import org.onosproject.net.intent.MockIdGenerator; |
| import org.onosproject.net.resource.MockResourceService; |
| import org.onosproject.net.resource.impl.LabelAllocator.FirstFitSelection; |
| import org.onosproject.net.resource.impl.LabelAllocator.LabelSelection; |
| import org.onosproject.net.resource.impl.LabelAllocator.RandomSelection; |
| |
| import java.util.Arrays; |
| import java.util.List; |
| import java.util.Map; |
| |
| import static org.hamcrest.CoreMatchers.instanceOf; |
| import static org.hamcrest.MatcherAssert.assertThat; |
| import static org.junit.Assert.assertEquals; |
| import static org.junit.Assert.assertTrue; |
| import static org.onosproject.net.DefaultEdgeLink.createEdgeLink; |
| import static org.onosproject.net.Link.Type.DIRECT; |
| import static org.onosproject.net.NetTestTools.PID; |
| import static org.onosproject.net.NetTestTools.connectPoint; |
| |
| /** |
| * Unit tests for LabelAllocator. |
| */ |
| public class LabelAllocatorTest { |
| |
| private LabelAllocator allocator; |
| private MockResourceService resourceService; |
| private IdGenerator idGenerator = MockIdGenerator.INSTANCE; |
| |
| private final ConnectPoint d1p0 = connectPoint("s1", 0); |
| private final ConnectPoint d1p1 = connectPoint("s1", 1); |
| private final ConnectPoint d2p0 = connectPoint("s2", 0); |
| private final ConnectPoint d2p1 = connectPoint("s2", 1); |
| |
| private final List<Link> links = Arrays.asList( |
| createEdgeLink(d1p0, true), |
| DefaultLink.builder().providerId(PID).src(d1p1).dst(d2p1).type(DIRECT).build(), |
| createEdgeLink(d2p0, false) |
| ); |
| |
| private final String firstFit = "FIRST_FIT"; |
| private final String random = "RANDOM"; |
| private final String wrong = "BLAHBLAHBLAH"; |
| |
| @Before |
| public void setUp() { |
| this.resourceService = new MockResourceService(); |
| this.allocator = new LabelAllocator(this.resourceService); |
| } |
| |
| @After |
| public void tearDown() { |
| |
| } |
| |
| /** |
| * To test changes to the selection behavior. |
| */ |
| @Test |
| public void testChangeBehavior() { |
| // It has to be an instance of LabelSelection |
| assertThat(this.allocator.getLabelSelection(), instanceOf(LabelSelection.class)); |
| // By default we have Random Selection |
| assertThat(this.allocator.getLabelSelection(), instanceOf(RandomSelection.class)); |
| // We change to FirstFit and we test the change |
| this.allocator.setLabelSelection(firstFit); |
| assertThat(this.allocator.getLabelSelection(), instanceOf(FirstFitSelection.class)); |
| // We change to Random and we test the change |
| this.allocator.setLabelSelection(random); |
| assertThat(this.allocator.getLabelSelection(), instanceOf(RandomSelection.class)); |
| // We put a wrong type and we should have a Random selection |
| this.allocator.setLabelSelection(wrong); |
| assertThat(this.allocator.getLabelSelection(), instanceOf(RandomSelection.class)); |
| } |
| |
| /** |
| * To test the first fit behavior with VLAN Id. In the First step |
| * we use the default set, for the first selection the selected label |
| * has to be 1. In the Second step we change the default set and for |
| * the first fit selection the selected has to be 2. |
| */ |
| @Test |
| public void testFirstFitBehaviorVlan() { |
| // We change to FirstFit and we test the change |
| this.allocator.setLabelSelection(firstFit); |
| assertThat(this.allocator.getLabelSelection(), instanceOf(FirstFitSelection.class)); |
| // We test the behavior for VLAN |
| Map<LinkKey, Identifier<?>> allocation = this.allocator.assignLabelToLinks( |
| ImmutableSet.copyOf(links.subList(1, 2)), |
| IntentId.valueOf(idGenerator.getNewId()), |
| EncapsulationType.VLAN); |
| Identifier<?> id = allocation.get(LinkKey.linkKey(d1p1, d2p1)); |
| // value has to be a VlanId |
| assertThat(id, instanceOf(VlanId.class)); |
| // value should not be a forbidden value |
| VlanId vlanId = (VlanId) id; |
| assertTrue(VlanId.NO_VID < vlanId.toShort() && vlanId.toShort() < VlanId.MAX_VLAN); |
| // value will be always 1 |
| assertEquals(1, vlanId.toShort()); |
| |
| // We change the available Ids |
| this.resourceService.availableVlanLabels = ImmutableSet.of( |
| (short) 100, |
| (short) 11, |
| (short) 20, |
| (short) 2, |
| (short) 3 |
| ); |
| // We test again the behavior for VLAN |
| allocation = this.allocator.assignLabelToLinks( |
| ImmutableSet.copyOf(links.subList(1, 2)), |
| IntentId.valueOf(idGenerator.getNewId()), |
| EncapsulationType.VLAN); |
| id = allocation.get(LinkKey.linkKey(d1p1, d2p1)); |
| // value has to be a VlanId |
| assertThat(id, instanceOf(VlanId.class)); |
| // value should not be a forbidden value |
| vlanId = (VlanId) id; |
| assertTrue(VlanId.NO_VID < vlanId.toShort() && vlanId.toShort() < VlanId.MAX_VLAN); |
| // value will be always 2 |
| assertEquals(2, vlanId.toShort()); |
| } |
| |
| /** |
| * To test the first fit behavior with MPLS label. In the First step |
| * we use the default set, for the first selection the selected label |
| * has to be 1. In the Second step we change the default set and for |
| * the first fit selection the selected has to be 100. |
| */ |
| @Test |
| public void testFirstFitBehaviorMpls() { |
| // We change to FirstFit and we test the change |
| this.allocator.setLabelSelection(firstFit); |
| assertThat(this.allocator.getLabelSelection(), instanceOf(FirstFitSelection.class)); |
| // We test the behavior for MPLS |
| Map<LinkKey, Identifier<?>> allocation = this.allocator.assignLabelToLinks( |
| ImmutableSet.copyOf(links.subList(1, 2)), |
| IntentId.valueOf(idGenerator.getNewId()), |
| EncapsulationType.MPLS); |
| Identifier<?> id = allocation.get(LinkKey.linkKey(d1p1, d2p1)); |
| // value has to be a Mplslabel |
| assertThat(id, instanceOf(MplsLabel.class)); |
| // value should not be a forbidden value |
| MplsLabel mplsLabel = (MplsLabel) id; |
| assertTrue(0 < mplsLabel.toInt() && mplsLabel.toInt() < MplsLabel.MAX_MPLS); |
| // value will be always 1 |
| assertEquals(1, mplsLabel.toInt()); |
| |
| // We change the available Ids |
| this.resourceService.availableMplsLabels = ImmutableSet.of( |
| 100, |
| 200, |
| 1000 |
| ); |
| // We test again the behavior for MPLS |
| allocation = this.allocator.assignLabelToLinks( |
| ImmutableSet.copyOf(links.subList(1, 2)), |
| IntentId.valueOf(idGenerator.getNewId()), |
| EncapsulationType.MPLS); |
| id = allocation.get(LinkKey.linkKey(d1p1, d2p1)); |
| // value has to be a Mplslabel |
| assertThat(id, instanceOf(MplsLabel.class)); |
| // value should not be a forbidden value |
| mplsLabel = (MplsLabel) id; |
| assertTrue(0 < mplsLabel.toInt() && mplsLabel.toInt() < MplsLabel.MAX_MPLS); |
| // value will be always 100 |
| assertEquals(100, mplsLabel.toInt()); |
| } |
| |
| /** |
| * To test the random behavior with VLAN Id. We make two selection, |
| * we test that these two selection are different. |
| */ |
| @Test |
| public void testRandomBehaviorVlan() { |
| // Verify the random behavior |
| assertThat(this.allocator.getLabelSelection(), instanceOf(RandomSelection.class)); |
| // We test the behavior for VLAN |
| Map<LinkKey, Identifier<?>> allocation = this.allocator.assignLabelToLinks( |
| ImmutableSet.copyOf(links.subList(1, 2)), |
| IntentId.valueOf(idGenerator.getNewId()), |
| EncapsulationType.VLAN); |
| Identifier<?> id = allocation.get(LinkKey.linkKey(d1p1, d2p1)); |
| // value has to be a VlanId |
| assertThat(id, instanceOf(VlanId.class)); |
| // value should not be a forbidden value |
| Short value = Short.parseShort(id.toString()); |
| VlanId prevVlanId = VlanId.vlanId(value); |
| assertTrue(VlanId.NO_VID <= prevVlanId.toShort() && prevVlanId.toShort() <= VlanId.MAX_VLAN); |
| |
| allocation = this.allocator.assignLabelToLinks( |
| ImmutableSet.copyOf(links.subList(1, 2)), |
| IntentId.valueOf(idGenerator.getNewId()), |
| EncapsulationType.VLAN); |
| id = allocation.get(LinkKey.linkKey(d1p1, d2p1)); |
| // value has to be a VlanId |
| assertThat(id, instanceOf(VlanId.class)); |
| // value should not be a forbidden value |
| VlanId vlanId = (VlanId) id; |
| assertTrue(VlanId.NO_VID <= vlanId.toShort() && vlanId.toShort() <= VlanId.MAX_VLAN); |
| |
| } |
| |
| /** |
| * To test random behavior with MPLS label. We make two selection, |
| * we test that these two selection are different. |
| */ |
| @Test |
| public void testRandomBehaviorMpls() { |
| // Verify the random behavior |
| assertThat(this.allocator.getLabelSelection(), instanceOf(RandomSelection.class)); |
| // We test the behavior for MPLS |
| Map<LinkKey, Identifier<?>> allocation = this.allocator.assignLabelToLinks( |
| ImmutableSet.copyOf(links.subList(1, 2)), |
| IntentId.valueOf(idGenerator.getNewId()), |
| EncapsulationType.MPLS); |
| Identifier<?> id = allocation.get(LinkKey.linkKey(d1p1, d2p1)); |
| // value has to be a Mplslabel |
| assertThat(id, instanceOf(MplsLabel.class)); |
| // value should not be a forbidden value |
| MplsLabel prevMplsId = (MplsLabel) id; |
| assertTrue(0 <= prevMplsId.toInt() && prevMplsId.toInt() <= MplsLabel.MAX_MPLS); |
| |
| allocation = this.allocator.assignLabelToLinks( |
| ImmutableSet.copyOf(links.subList(1, 2)), |
| IntentId.valueOf(idGenerator.getNewId()), |
| EncapsulationType.MPLS); |
| id = allocation.get(LinkKey.linkKey(d1p1, d2p1)); |
| // value has to be a Mplslabel |
| assertThat(id, instanceOf(MplsLabel.class)); |
| // value should not be a forbidden value |
| MplsLabel mplsId = (MplsLabel) id; |
| assertTrue(0 <= mplsId.toInt() && mplsId.toInt() <= MplsLabel.MAX_MPLS); |
| } |
| |
| /** |
| * To test the port key based API. |
| */ |
| @Test |
| public void testPortKey() { |
| // Verify the first behavior |
| this.allocator.setLabelSelection(firstFit); |
| assertThat(this.allocator.getLabelSelection(), instanceOf(FirstFitSelection.class)); |
| // We test the behavior for VLAN |
| Map<ConnectPoint, Identifier<?>> allocation = this.allocator.assignLabelToPorts( |
| ImmutableSet.copyOf(links.subList(1, 2)), |
| IntentId.valueOf(idGenerator.getNewId()), |
| EncapsulationType.VLAN); |
| Identifier<?> id = allocation.get(new ConnectPoint(d1p1.elementId(), d1p1.port())); |
| // value has to be a VlanId |
| assertThat(id, instanceOf(VlanId.class)); |
| // value should not be a forbidden value |
| VlanId prevVlanId = (VlanId) id; |
| assertTrue(VlanId.NO_VID < prevVlanId.toShort() && prevVlanId.toShort() < VlanId.MAX_VLAN); |
| // value has to be 1 |
| assertEquals(1, prevVlanId.toShort()); |
| // verify same applies for d2p1 |
| id = allocation.get(new ConnectPoint(d2p1.elementId(), d2p1.port())); |
| assertThat(id, instanceOf(VlanId.class)); |
| // value should not be a forbidden value |
| VlanId vlanId = (VlanId) id; |
| assertTrue(VlanId.NO_VID < vlanId.toShort() && vlanId.toShort() < VlanId.MAX_VLAN); |
| // value has to be 1 |
| assertEquals(prevVlanId, vlanId); |
| } |
| |
| |
| |
| } |