/** * Copyright (c) 2014 Ericsson India Global Services Pvt Ltd. and others. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html */ package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor; import com.google.common.collect.ImmutableList; import java.math.BigInteger; import java.util.ArrayList; import java.util.List; import java.util.Optional; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionDatapathIdConvertorData; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Uri; import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.CopyTtlInCaseBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.GroupActionCase; import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.GroupActionCaseBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.OutputActionCaseBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetMplsTtlActionCaseBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.copy.ttl.in._case.CopyTtlIn; import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.copy.ttl.in._case.CopyTtlInBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.group.action._case.GroupAction; import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.group.action._case.GroupActionBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.output.action._case.OutputActionBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.mpls.ttl.action._case.SetMplsTtlAction; import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.mpls.ttl.action._case.SetMplsTtlActionBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.AddGroupInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.AddGroupInputBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.BucketId; import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.Group; import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupId; import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupTypes; import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.Buckets; import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.BucketsBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.buckets.Bucket; import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.buckets.BucketBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.actions.grouping.Action; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.GroupModCommand; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.GroupType; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GroupModInputBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.buckets.grouping.BucketsList; public class GroupConvertorTest { private ConvertorManager convertorManager; @Before public void setUp() { convertorManager = ConvertorManagerFactory.createDefaultManager(); } /** * test of {@link GroupConvertor#convert(org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.Group, org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionDatapathIdConvertorData)} } */ @Test public void testGroupModConvertorwithallParameters() { final AddGroupInputBuilder addGroupBuilder = new AddGroupInputBuilder(); addGroupBuilder.setGroupId(new GroupId(10L)); addGroupBuilder.setGroupType(GroupTypes.GroupAll); final List<Bucket> bucketList = new ArrayList<Bucket>(); final List<org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action> actionsList = new ArrayList<org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action>(); final List<org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action> actionsList1 = new ArrayList<org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action>(); int actionOrder = 0; // Action1 final GroupActionBuilder groupActionBuilder = new GroupActionBuilder(); groupActionBuilder.setGroup("005"); final GroupAction groupIdaction = groupActionBuilder.build(); final ActionBuilder actionsB = new ActionBuilder(); actionsB.setOrder(actionOrder++).setAction(new GroupActionCaseBuilder().setGroupAction(groupIdaction).build()); // Action2: final GroupActionBuilder groupActionBuilder1 = new GroupActionBuilder(); groupActionBuilder1.setGroup("006"); final GroupAction groupIdaction1 = groupActionBuilder.build(); final ActionBuilder actionsB1 = new ActionBuilder(); actionsB1.setOrder(actionOrder++).setAction(new GroupActionCaseBuilder().setGroupAction(groupIdaction1).build()); actionsList.add(actionsB.build()); actionsList.add(actionsB1.build()); final BucketsBuilder bucketsB = new BucketsBuilder(); final BucketBuilder bucketB = new BucketBuilder(); bucketB.setWeight(10); bucketB.setWatchPort(20L); bucketB.setWatchGroup(22L); bucketB.setAction(actionsList); final Bucket bucket = bucketB.build(); bucketList.add(bucket); // List of bucket final BucketBuilder bucketB1 = new BucketBuilder(); bucketB1.setWeight(50); bucketB1.setWatchPort(60L); bucketB1.setWatchGroup(70L); // Action1 final CopyTtlInBuilder copyTtlB = new CopyTtlInBuilder(); final CopyTtlIn copyTtl = copyTtlB.build(); final ActionBuilder actionsB2 = new ActionBuilder(); actionsB2.setOrder(actionOrder++).setAction(new CopyTtlInCaseBuilder().setCopyTtlIn(copyTtl).build()); // Action2: final SetMplsTtlActionBuilder setMplsTtlActionBuilder = new SetMplsTtlActionBuilder(); setMplsTtlActionBuilder.setMplsTtl((short) 0X1); final SetMplsTtlAction setMAction = setMplsTtlActionBuilder.build(); final ActionBuilder actionsB3 = new ActionBuilder(); actionsB3.setOrder(actionOrder++).setAction(new SetMplsTtlActionCaseBuilder().setSetMplsTtlAction(setMAction).build()); actionsList1.add(actionsB2.build()); actionsList1.add(actionsB3.build()); bucketB1.setAction(actionsList); final Bucket bucket1 = bucketB1.build(); // second bucket bucketList.add(bucket1); bucketsB.setBucket(bucketList);// List of bucket added to the Buckets final Buckets buckets = bucketsB.build(); addGroupBuilder.setBuckets(buckets); VersionDatapathIdConvertorData data = new VersionDatapathIdConvertorData((short) 0X4); data.setDatapathId(BigInteger.valueOf(1)); final GroupModInputBuilder outAddGroupInput = convert(addGroupBuilder.build(), data); Assert.assertEquals(GroupModCommand.OFPGCADD, outAddGroupInput.getCommand()); Assert.assertEquals(GroupType.OFPGTALL, outAddGroupInput.getType()); Assert.assertEquals(10L, (long) outAddGroupInput.getGroupId().getValue()); Assert.assertEquals(10, (int) outAddGroupInput.getBucketsList().get(0).getWeight()); Assert.assertEquals(20L, (long) outAddGroupInput.getBucketsList().get(0).getWatchPort().getValue()); Assert.assertEquals((Long) 22L, outAddGroupInput.getBucketsList().get(0).getWatchGroup()); final List<Action> outActionList = outAddGroupInput.getBucketsList().get(0).getAction(); for (int outItem = 0; outItem < outActionList.size(); outItem++) { final Action action = outActionList .get(outItem); if (action.getActionChoice() instanceof GroupActionCase) { Assert.assertEquals((Long) 5L, ((GroupActionCase) action.getActionChoice()).getGroupAction().getGroupId()); } // TODO:setMplsTTL :OF layer doesnt have get(); } Assert.assertEquals((Integer) 50, outAddGroupInput.getBucketsList().get(1).getWeight()); Assert.assertEquals((long) 60, (long) outAddGroupInput.getBucketsList().get(1).getWatchPort().getValue()); Assert.assertEquals((Long) 70L, outAddGroupInput.getBucketsList().get(1).getWatchGroup()); final List<Action> outActionList1 = outAddGroupInput.getBucketsList().get(1).getAction(); for (int outItem = 0; outItem < outActionList1.size(); outItem++) { final Action action = outActionList1 .get(outItem); if (action.getActionChoice() instanceof GroupActionCase) { Assert.assertEquals((Long) 6L, ((GroupActionCase) action.getActionChoice()).getGroupAction().getGroupId()); } // TODO:setMplsTTL :OF layer doesnt have get(); } } /** * test of {@link GroupConvertor#convert(org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.Group, org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionDatapathIdConvertorData)} } */ @Test public void testGroupModConvertorNoBucket() { final AddGroupInputBuilder addGroupBuilder = new AddGroupInputBuilder(); addGroupBuilder.setGroupId(new GroupId(10L)); addGroupBuilder.setGroupType(GroupTypes.GroupAll); VersionDatapathIdConvertorData data = new VersionDatapathIdConvertorData((short) 0X4); data.setDatapathId(BigInteger.valueOf(1)); final GroupModInputBuilder outAddGroupInput = convert(addGroupBuilder.build(), data); Assert.assertEquals(GroupModCommand.OFPGCADD, outAddGroupInput.getCommand()); Assert.assertEquals(GroupType.OFPGTALL, outAddGroupInput.getType()); } /** * test of {@link GroupConvertor#convert(org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.Group, org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionDatapathIdConvertorData)} } */ @Test public void testGroupModConvertorBucketwithNOWieghtValuesForGroupTypeFastFailure() { int actionOrder = 0; final AddGroupInputBuilder addGroupBuilder = new AddGroupInputBuilder(); addGroupBuilder.setGroupId(new GroupId(10L)); addGroupBuilder.setGroupType(GroupTypes.GroupFf); final List<Bucket> bucketList = new ArrayList<Bucket>(); final List<org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action> actionsList = new ArrayList<org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action>(); final List<org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action> actionsList1 = new ArrayList<org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action>(); // Action1: 005 actionsList.add(assembleActionBuilder("005", actionOrder++).build()); // Action2: 006 actionsList.add(assembleActionBuilder("006", actionOrder++).build()); // .. and mr.Bond is not coming today final BucketsBuilder bucketsB = new BucketsBuilder(); final BucketBuilder bucketB = new BucketBuilder(); bucketB.setAction(actionsList); final Bucket bucket = bucketB.build(); bucketList.add(bucket); // List of bucket final BucketBuilder bucketB1 = new BucketBuilder(); // Action1 actionsList1.add(assembleCopyTtlInBuilder(actionOrder++).build()); // Action2: actionsList1.add(assembleSetMplsTtlActionBuilder(actionOrder++).build()); bucketB1.setAction(actionsList1); final Bucket bucket1 = bucketB1.build(); // second bucket bucketList.add(bucket1); bucketsB.setBucket(bucketList);// List of bucket added to the Buckets final Buckets buckets = bucketsB.build(); addGroupBuilder.setBuckets(buckets); VersionDatapathIdConvertorData data = new VersionDatapathIdConvertorData((short) 0X4); data.setDatapathId(BigInteger.valueOf(1)); final GroupModInputBuilder outAddGroupInput = convert(addGroupBuilder.build(), data); Assert.assertEquals(GroupModCommand.OFPGCADD, outAddGroupInput.getCommand()); Assert.assertEquals(GroupType.OFPGTFF, outAddGroupInput.getType()); Assert.assertEquals(10L, outAddGroupInput.getGroupId().getValue().longValue()); final List<Action> outActionList = outAddGroupInput.getBucketsList().get(0).getAction(); for (int outItem = 0; outItem < outActionList.size(); outItem++) { final Action action = outActionList .get(outItem); if (action.getActionChoice() instanceof GroupActionCase) { Assert.assertEquals((Long) 5L, ((GroupActionCase) action.getActionChoice()).getGroupAction().getGroupId()); } } final List<Action> outActionList1 = outAddGroupInput.getBucketsList().get(1).getAction(); for (int outItem = 0; outItem < outActionList1.size(); outItem++) { final Action action = outActionList1 .get(outItem); if (action.getActionChoice() instanceof GroupActionCase) { Assert.assertEquals((Long) 6L, ((GroupActionCase) action.getActionChoice()).getGroupAction().getGroupId()); } } } /** * test of {@link GroupConvertor#convert(org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.Group, org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionDatapathIdConvertorData)} } */ @Test public void testGroupModConvertSortedBuckets() { final int actionOrder = 0; final ArrayList<Bucket> bucket = new ArrayList<Bucket>(); bucket.add(new BucketBuilder() .setBucketId(new BucketId((long) 4)) .setWatchPort((long)2) .setWatchGroup((long) 1) .setAction(ImmutableList.of(new ActionBuilder() .setOrder(0) .setAction(new OutputActionCaseBuilder() .setOutputAction(new OutputActionBuilder() .setOutputNodeConnector(new Uri("openflow:1:2")) .build()) .build()) .build())) .build()); bucket.add(new BucketBuilder() .setBucketId(new BucketId((long) 3)) .setWatchPort((long)6) .setWatchGroup((long) 1) .setAction(ImmutableList.of(new ActionBuilder() .setOrder(0) .setAction(new OutputActionCaseBuilder() .setOutputAction(new OutputActionBuilder() .setOutputNodeConnector(new Uri("openflow:1:6")) .build()) .build()) .build())) .build()); bucket.add(new BucketBuilder() .setBucketId(new BucketId((long) 2)) .setWatchPort((long)5) .setWatchGroup((long) 1) .setAction(ImmutableList.of(new ActionBuilder() .setOrder(0) .setAction(new OutputActionCaseBuilder() .setOutputAction(new OutputActionBuilder() .setOutputNodeConnector(new Uri("openflow:1:5")) .build()) .build()) .build())) .build()); bucket.add(new BucketBuilder() .setBucketId(new BucketId((long) 1)) .setWatchPort((long)4) .setWatchGroup((long) 1) .setAction(ImmutableList.of(new ActionBuilder() .setOrder(0) .setAction(new OutputActionCaseBuilder() .setOutputAction(new OutputActionBuilder() .setOutputNodeConnector(new Uri("openflow:1:4")) .build()) .build()) .build())) .build()); bucket.add(new BucketBuilder() .setBucketId(new BucketId((long) 0)) .setWatchPort((long)3) .setWatchGroup((long) 1) .setAction(ImmutableList.of(new ActionBuilder() .setOrder(0) .setAction(new OutputActionCaseBuilder() .setOutputAction(new OutputActionBuilder() .setOutputNodeConnector(new Uri("openflow:1:3")) .build()) .build()) .build())) .build()); final AddGroupInput input = new AddGroupInputBuilder() .setGroupId(new GroupId((long) 1)) .setGroupName("Foo") .setGroupType(GroupTypes.GroupFf) .setBuckets(new BucketsBuilder() .setBucket(bucket) .build()) .build(); VersionDatapathIdConvertorData data = new VersionDatapathIdConvertorData((short) 0X4); data.setDatapathId(BigInteger.valueOf(1)); final GroupModInputBuilder outAddGroupInput = convert(input, data); final List<BucketsList> bucketList = outAddGroupInput.getBucketsList(); Assert.assertEquals( Long.valueOf(1), bucketList.get(0).getWatchGroup()); Assert.assertEquals( Long.valueOf(3), bucketList.get(0).getWatchPort().getValue()); Assert.assertEquals( Long.valueOf(1), bucketList.get(1).getWatchGroup()); Assert.assertEquals( Long.valueOf(4), bucketList.get(1).getWatchPort().getValue()); Assert.assertEquals( Long.valueOf(1), bucketList.get(2).getWatchGroup()); Assert.assertEquals( Long.valueOf(5), bucketList.get(2).getWatchPort().getValue()); Assert.assertEquals( Long.valueOf(1), bucketList.get(3).getWatchGroup()); Assert.assertEquals( Long.valueOf(6), bucketList.get(3).getWatchPort().getValue()); Assert.assertEquals( Long.valueOf(1), bucketList.get(4).getWatchGroup()); Assert.assertEquals( Long.valueOf(2), bucketList.get(4).getWatchPort().getValue()); } /** * @return */ private static ActionBuilder assembleSetMplsTtlActionBuilder(final int actionOrder) { final SetMplsTtlActionBuilder setMplsTtlActionBuilder = new SetMplsTtlActionBuilder(); setMplsTtlActionBuilder.setMplsTtl((short) 0X1); final SetMplsTtlActionCaseBuilder setMplsTtlActionCaseBuilder = new SetMplsTtlActionCaseBuilder(); setMplsTtlActionCaseBuilder.setSetMplsTtlAction(setMplsTtlActionBuilder.build()); final ActionBuilder actionsB3 = new ActionBuilder(); actionsB3.setOrder(actionOrder).setAction(setMplsTtlActionCaseBuilder.build()); return actionsB3; } /** * @return */ private static ActionBuilder assembleCopyTtlInBuilder(final int actionOrder) { final CopyTtlInBuilder copyTtlB = new CopyTtlInBuilder(); final CopyTtlInCaseBuilder copyTtlInCaseBuilder = new CopyTtlInCaseBuilder(); copyTtlInCaseBuilder.setCopyTtlIn(copyTtlB.build()); final ActionBuilder actionsB2 = new ActionBuilder(); actionsB2.setOrder(actionOrder).setAction(copyTtlInCaseBuilder.build()); return actionsB2; } /** * @param groupName name of group * @return */ private static ActionBuilder assembleActionBuilder(final String groupName, final int actionOrder) { final GroupActionBuilder groupActionBuilder = new GroupActionBuilder(); groupActionBuilder.setGroup(groupName); final GroupActionCaseBuilder groupActionCaseBuilder = new GroupActionCaseBuilder(); groupActionCaseBuilder.setGroupAction(groupActionBuilder.build()); final ActionBuilder actionsBld = new ActionBuilder(); actionsBld.setOrder(actionOrder).setAction(groupActionCaseBuilder.build()); return actionsBld; } /** * test of {@link GroupConvertor#convert(org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.Group, org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionDatapathIdConvertorData)} } */ @Test public void testGroupModConvertorBucketwithNOWieghtValuesForGroupTypeAll() { int actionOrder = 0; final AddGroupInputBuilder addGroupBuilder = new AddGroupInputBuilder(); addGroupBuilder.setGroupId(new GroupId(10L)); addGroupBuilder.setGroupType(GroupTypes.GroupAll); final List<Bucket> bucketList = new ArrayList<Bucket>(); final List<org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action> actionsList = new ArrayList<org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action>(); final List<org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action> actionsList1 = new ArrayList<org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action>(); // Action1 actionsList.add(assembleActionBuilder("005", actionOrder++).build()); // Action2: actionsList.add(assembleActionBuilder("006", actionOrder++).build()); final BucketsBuilder bucketsB = new BucketsBuilder(); final BucketBuilder bucketB = new BucketBuilder(); bucketB.setAction(actionsList); final Bucket bucket = bucketB.build(); bucketList.add(bucket); // List of bucket final BucketBuilder bucketB1 = new BucketBuilder(); // Action1 actionsList1.add(assembleCopyTtlInBuilder(actionOrder++).build()); // Action2: actionsList1.add(assembleSetMplsTtlActionBuilder(actionOrder++).build()); bucketB1.setAction(actionsList); final Bucket bucket1 = bucketB1.build(); // second bucket bucketList.add(bucket1); bucketsB.setBucket(bucketList);// List of bucket added to the Buckets final Buckets buckets = bucketsB.build(); addGroupBuilder.setBuckets(buckets); VersionDatapathIdConvertorData data = new VersionDatapathIdConvertorData((short) 0X4); data.setDatapathId(BigInteger.valueOf(1)); final GroupModInputBuilder outAddGroupInput = convert(addGroupBuilder.build(), data); Assert.assertEquals(GroupModCommand.OFPGCADD, outAddGroupInput.getCommand()); Assert.assertEquals(GroupType.OFPGTALL, outAddGroupInput.getType()); Assert.assertEquals(10L, outAddGroupInput.getGroupId().getValue().longValue()); final List<Action> outActionList = outAddGroupInput.getBucketsList().get(0).getAction(); for (int outItem = 0; outItem < outActionList.size(); outItem++) { final Action action = outActionList .get(outItem); if (action.getActionChoice() instanceof GroupActionCase) { Assert.assertEquals((Long) 5L, ((GroupActionCase) action.getActionChoice()).getGroupAction().getGroupId()); } } final List<Action> outActionList1 = outAddGroupInput.getBucketsList().get(1).getAction(); for (int outItem = 0; outItem < outActionList1.size(); outItem++) { final Action action = outActionList1 .get(outItem); if (action.getActionChoice() instanceof GroupActionCase) { Assert.assertEquals((Long) 6L, ((GroupActionCase) action.getActionChoice()).getGroupAction().getGroupId()); } } } private GroupModInputBuilder convert(Group group, VersionDatapathIdConvertorData data) { final Optional<GroupModInputBuilder> outAddGroupInputOptional = convertorManager.convert(group, data); Assert.assertTrue("Group convertor not found", outAddGroupInputOptional.isPresent()); return outAddGroupInputOptional.get(); } }