Simplify MP2S compiler, fix ingress/egress on same switch bug in SP2M compiler

Change-Id: Ib47bba01aac0f358f2caa5525c18e0e90a0b13ff
This commit is contained in:
Jonathan Hart 2015-06-23 09:46:19 -07:00 committed by Gerrit Code Review
parent a7f81e5e03
commit 066244c31c
4 changed files with 37 additions and 55 deletions

View File

@ -27,7 +27,6 @@ import org.onosproject.core.CoreService;
import org.onosproject.core.DefaultGroupId; import org.onosproject.core.DefaultGroupId;
import org.onosproject.net.ConnectPoint; import org.onosproject.net.ConnectPoint;
import org.onosproject.net.DeviceId; import org.onosproject.net.DeviceId;
import org.onosproject.net.EdgeLink;
import org.onosproject.net.Link; import org.onosproject.net.Link;
import org.onosproject.net.PortNumber; import org.onosproject.net.PortNumber;
import org.onosproject.net.flow.DefaultFlowRule; import org.onosproject.net.flow.DefaultFlowRule;
@ -78,18 +77,8 @@ public class LinkCollectionIntentCompiler implements IntentCompiler<LinkCollecti
SetMultimap<DeviceId, PortNumber> outputPorts = HashMultimap.create(); SetMultimap<DeviceId, PortNumber> outputPorts = HashMultimap.create();
for (Link link : intent.links()) { for (Link link : intent.links()) {
DeviceId srcDeviceId;
DeviceId dstDeviceId;
if (link instanceof EdgeLink) {
EdgeLink edgeLink = (EdgeLink) link;
dstDeviceId = edgeLink.hostLocation().deviceId();
srcDeviceId = dstDeviceId;
} else {
inputPorts.put(link.dst().deviceId(), link.dst().port()); inputPorts.put(link.dst().deviceId(), link.dst().port());
srcDeviceId = link.src().deviceId(); outputPorts.put(link.src().deviceId(), link.src().port());
}
outputPorts.put(srcDeviceId, link.src().port());
} }
for (ConnectPoint ingressPoint : intent.ingressPoints()) { for (ConnectPoint ingressPoint : intent.ingressPoints()) {

View File

@ -15,12 +15,8 @@
*/ */
package org.onosproject.net.intent.impl.compiler; package org.onosproject.net.intent.impl.compiler;
import java.util.Collections; import com.google.common.collect.ImmutableSet;
import java.util.HashMap; import com.google.common.collect.Sets;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.felix.scr.annotations.Activate; import org.apache.felix.scr.annotations.Activate;
import org.apache.felix.scr.annotations.Component; import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Deactivate; import org.apache.felix.scr.annotations.Deactivate;
@ -40,10 +36,11 @@ import org.onosproject.net.intent.impl.PathNotFoundException;
import org.onosproject.net.resource.link.LinkResourceAllocations; import org.onosproject.net.resource.link.LinkResourceAllocations;
import org.onosproject.net.topology.PathService; import org.onosproject.net.topology.PathService;
import com.google.common.collect.ImmutableSet; import java.util.Collections;
import com.google.common.collect.Sets; import java.util.HashMap;
import java.util.List;
import static org.onosproject.net.DefaultEdgeLink.createEdgeLink; import java.util.Map;
import java.util.Set;
/** /**
* An intent compiler for * An intent compiler for
@ -73,14 +70,12 @@ public class MultiPointToSinglePointIntentCompiler
public List<Intent> compile(MultiPointToSinglePointIntent intent, List<Intent> installable, public List<Intent> compile(MultiPointToSinglePointIntent intent, List<Intent> installable,
Set<LinkResourceAllocations> resources) { Set<LinkResourceAllocations> resources) {
Map<DeviceId, Link> links = new HashMap<>(); Map<DeviceId, Link> links = new HashMap<>();
Map<DeviceId, Link> edgeLinks = new HashMap<>();
ConnectPoint egressPoint = intent.egressPoint(); ConnectPoint egressPoint = intent.egressPoint();
for (ConnectPoint ingressPoint : intent.ingressPoints()) { for (ConnectPoint ingressPoint : intent.ingressPoints()) {
if (ingressPoint.deviceId().equals(egressPoint.deviceId())) { if (ingressPoint.deviceId().equals(egressPoint.deviceId())) {
edgeLinks.put(ingressPoint.deviceId(), createEdgeLink(ingressPoint, true)); continue;
edgeLinks.put(egressPoint.deviceId(), createEdgeLink(egressPoint, false)); }
} else {
Path path = getPath(ingressPoint, intent.egressPoint()); Path path = getPath(ingressPoint, intent.egressPoint());
for (Link link : path.links()) { for (Link link : path.links()) {
if (links.containsKey(link.src().deviceId())) { if (links.containsKey(link.src().deviceId())) {
@ -95,15 +90,12 @@ public class MultiPointToSinglePointIntentCompiler
links.put(link.src().deviceId(), link); links.put(link.src().deviceId(), link);
} }
} }
}
Set<Link> allLinks = Sets.newHashSet(links.values());
allLinks.addAll(edgeLinks.values());
Intent result = LinkCollectionIntent.builder() Intent result = LinkCollectionIntent.builder()
.appId(intent.appId()) .appId(intent.appId())
.selector(intent.selector()) .selector(intent.selector())
.treatment(intent.treatment()) .treatment(intent.treatment())
.links(Sets.newHashSet(allLinks)) .links(Sets.newHashSet(links.values()))
.ingressPoints(intent.ingressPoints()) .ingressPoints(intent.ingressPoints())
.egressPoints(ImmutableSet.of(intent.egressPoint())) .egressPoints(ImmutableSet.of(intent.egressPoint()))
.priority(intent.priority()) .priority(intent.priority())

View File

@ -15,11 +15,7 @@
*/ */
package org.onosproject.net.intent.impl.compiler; package org.onosproject.net.intent.impl.compiler;
import java.util.Collections; import com.google.common.collect.ImmutableSet;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.apache.felix.scr.annotations.Activate; import org.apache.felix.scr.annotations.Activate;
import org.apache.felix.scr.annotations.Component; import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Deactivate; import org.apache.felix.scr.annotations.Deactivate;
@ -32,7 +28,10 @@ import org.onosproject.net.intent.SinglePointToMultiPointIntent;
import org.onosproject.net.provider.ProviderId; import org.onosproject.net.provider.ProviderId;
import org.onosproject.net.resource.link.LinkResourceAllocations; import org.onosproject.net.resource.link.LinkResourceAllocations;
import com.google.common.collect.ImmutableSet; import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
@Component(immediate = true) @Component(immediate = true)
public class SinglePointToMultiPointIntentCompiler public class SinglePointToMultiPointIntentCompiler
@ -59,8 +58,12 @@ public class SinglePointToMultiPointIntentCompiler
List<Intent> installable, List<Intent> installable,
Set<LinkResourceAllocations> resources) { Set<LinkResourceAllocations> resources) {
Set<Link> links = new HashSet<>(); Set<Link> links = new HashSet<>();
//FIXME: need to handle the case where ingress/egress points are on same switch
for (ConnectPoint egressPoint : intent.egressPoints()) { for (ConnectPoint egressPoint : intent.egressPoints()) {
if (egressPoint.deviceId().equals(intent.ingressPoint().deviceId())) {
continue;
}
Path path = getPath(intent, intent.ingressPoint().deviceId(), egressPoint.deviceId()); Path path = getPath(intent, intent.ingressPoint().deviceId(), egressPoint.deviceId());
links.addAll(path.links()); links.addAll(path.links());
} }

View File

@ -15,10 +15,6 @@
*/ */
package org.onosproject.net.intent.impl.compiler; package org.onosproject.net.intent.impl.compiler;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.hamcrest.Matchers; import org.hamcrest.Matchers;
import org.junit.Test; import org.junit.Test;
import org.onosproject.TestApplicationId; import org.onosproject.TestApplicationId;
@ -36,6 +32,10 @@ import org.onosproject.net.intent.MultiPointToSinglePointIntent;
import org.onosproject.net.topology.LinkWeight; import org.onosproject.net.topology.LinkWeight;
import org.onosproject.net.topology.PathService; import org.onosproject.net.topology.PathService;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import static org.hamcrest.CoreMatchers.instanceOf; import static org.hamcrest.CoreMatchers.instanceOf;
import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.CoreMatchers.notNullValue;
import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.MatcherAssert.assertThat;
@ -255,11 +255,9 @@ public class MultiPointToSinglePointIntentCompilerTest extends AbstractIntentTes
if (resultIntent instanceof LinkCollectionIntent) { if (resultIntent instanceof LinkCollectionIntent) {
LinkCollectionIntent linkIntent = (LinkCollectionIntent) resultIntent; LinkCollectionIntent linkIntent = (LinkCollectionIntent) resultIntent;
assertThat(linkIntent.links(), hasSize(ingress.length + 1)); assertThat(linkIntent.links(), hasSize(ingress.length));
assertThat(linkIntent.links(), linksHasPath("i2", "i1")); assertThat(linkIntent.links(), linksHasPath("i2", "i1"));
assertThat(linkIntent.links(), linksHasPath("i1", "i1"));
} }
} }
} }