diff options
Diffstat (limited to 'framework/src/onos/apps/sdnip')
21 files changed, 0 insertions, 3256 deletions
diff --git a/framework/src/onos/apps/sdnip/app.xml b/framework/src/onos/apps/sdnip/app.xml deleted file mode 100644 index 7aafa6ab..00000000 --- a/framework/src/onos/apps/sdnip/app.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- - ~ Copyright 2015 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. - --> -<app name="org.onosproject.sdnip" origin="ON.Lab" version="${project.version}" - featuresRepo="mvn:${project.groupId}/${project.artifactId}/${project.version}/xml/features" - features="${project.artifactId}"> - <description>${project.description}</description> - <artifact>mvn:${project.groupId}/${project.artifactId}/${project.version}</artifact> - <artifact>mvn:${project.groupId}/onos-app-routing-api/${project.version}</artifact> - <artifact>mvn:${project.groupId}/onos-app-routing/${project.version}</artifact> -</app> diff --git a/framework/src/onos/apps/sdnip/features.xml b/framework/src/onos/apps/sdnip/features.xml deleted file mode 100644 index 5bd0dbc4..00000000 --- a/framework/src/onos/apps/sdnip/features.xml +++ /dev/null @@ -1,25 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="yes"?> -<!-- - ~ Copyright 2015 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. - --> -<features xmlns="http://karaf.apache.org/xmlns/features/v1.2.0" name="${project.artifactId}-${project.version}"> - <feature name="onos-app-sdnip" version="${project.version}" - description="${project.description}"> - <feature>onos-api</feature> - <bundle>mvn:${project.groupId}/onos-app-sdnip/${project.version}</bundle> - <bundle>mvn:${project.groupId}/onos-app-routing-api/${project.version}</bundle> - <bundle>mvn:${project.groupId}/onos-app-routing/${project.version}</bundle> - </feature> -</features> diff --git a/framework/src/onos/apps/sdnip/pom.xml b/framework/src/onos/apps/sdnip/pom.xml deleted file mode 100644 index 8ff8cbcf..00000000 --- a/framework/src/onos/apps/sdnip/pom.xml +++ /dev/null @@ -1,88 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- - ~ Copyright 2014 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. - --> -<project xmlns="http://maven.apache.org/POM/4.0.0" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> - <modelVersion>4.0.0</modelVersion> - - <parent> - <groupId>org.onosproject</groupId> - <artifactId>onos-apps</artifactId> - <version>1.4.0-rc1</version> - <relativePath>../pom.xml</relativePath> - </parent> - - <artifactId>onos-app-sdnip</artifactId> - <packaging>bundle</packaging> - - <description>SDN-IP peering application</description> - - <dependencies> - <dependency> - <groupId>com.google.guava</groupId> - <artifactId>guava</artifactId> - </dependency> - - <dependency> - <groupId>org.onosproject</groupId> - <artifactId>onlab-misc</artifactId> - </dependency> - - <dependency> - <groupId>org.onosproject</groupId> - <artifactId>onlab-junit</artifactId> - <scope>test</scope> - </dependency> - - <dependency> - <groupId>org.onosproject</groupId> - <artifactId>onos-api</artifactId> - <version>${project.version}</version> - <scope>test</scope> - <classifier>tests</classifier> - </dependency> - - <dependency> - <groupId>org.onosproject</groupId> - <artifactId>onos-app-routing</artifactId> - <version>${project.version}</version> - </dependency> - - <dependency> - <groupId>org.onosproject</groupId> - <artifactId>onos-cli</artifactId> - <version>${project.version}</version> - </dependency> - - <dependency> - <groupId>org.apache.karaf.shell</groupId> - <artifactId>org.apache.karaf.shell.console</artifactId> - </dependency> - - <dependency> - <groupId>org.osgi</groupId> - <artifactId>org.osgi.core</artifactId> - </dependency> - - <dependency> - <groupId>org.easymock</groupId> - <artifactId>easymock</artifactId> - <scope>test</scope> - </dependency> - </dependencies> - -</project> diff --git a/framework/src/onos/apps/sdnip/src/main/java/org/onosproject/sdnip/IntentSynchronizer.java b/framework/src/onos/apps/sdnip/src/main/java/org/onosproject/sdnip/IntentSynchronizer.java deleted file mode 100644 index 09d4a436..00000000 --- a/framework/src/onos/apps/sdnip/src/main/java/org/onosproject/sdnip/IntentSynchronizer.java +++ /dev/null @@ -1,241 +0,0 @@ -/* - * Copyright 2014-2015 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.sdnip; - -import static java.util.concurrent.Executors.newSingleThreadExecutor; -import static org.onlab.util.Tools.groupedThreads; - -import java.util.HashMap; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ExecutorService; - -import org.onosproject.core.ApplicationId; -import org.onosproject.net.intent.Intent; -import org.onosproject.net.intent.IntentService; -import org.onosproject.net.intent.IntentState; -import org.onosproject.net.intent.IntentUtils; -import org.onosproject.net.intent.Key; -import org.onosproject.routing.IntentSynchronizationService; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * Synchronizes intents between the in-memory intent store and the - * IntentService. - */ -public class IntentSynchronizer implements IntentSynchronizationService { - - private static final Logger log = - LoggerFactory.getLogger(IntentSynchronizer.class); - - private final ApplicationId appId; - private final IntentService intentService; - - private final Map<Key, Intent> intents; - - // - // State to deal with the Leader election and pushing Intents - // - private final ExecutorService intentsSynchronizerExecutor; - private volatile boolean isElectedLeader = false; - private volatile boolean isActivatedLeader = false; - - /** - * Class constructor. - * - * @param appId the Application ID - * @param intentService the intent service - */ - public IntentSynchronizer(ApplicationId appId, IntentService intentService) { - this(appId, intentService, - newSingleThreadExecutor(groupedThreads("onos/" + appId, "sync"))); - } - - /** - * Class constructor. - * - * @param appId the Application ID - * @param intentService the intent service - * @param executorService executor service for synchronization thread - */ - public IntentSynchronizer(ApplicationId appId, IntentService intentService, - ExecutorService executorService) { - this.appId = appId; - this.intentService = intentService; - - intents = new ConcurrentHashMap<>(); - - intentsSynchronizerExecutor = executorService; - } - - /** - * Starts the synchronizer. - */ - public void start() { - - } - - /** - * Stops the synchronizer. - */ - public void stop() { - synchronized (this) { - // Stop the thread(s) - intentsSynchronizerExecutor.shutdownNow(); - log.info("Intents Synchronizer Executor shutdown completed"); - - } - } - - /** - * Withdraws all intents. - */ - public void removeIntents() { - if (!isElectedLeader) { - // only leader will withdraw intents - return; - } - - log.debug("Intent Synchronizer shutdown: withdrawing all intents..."); - - for (Entry<Key, Intent> entry : intents.entrySet()) { - intentService.withdraw(entry.getValue()); - log.debug("Intent Synchronizer withdrawing intent: {}", - entry.getValue()); - } - - intents.clear(); - log.info("Tried to clean all intents"); - } - - @Override - public void submit(Intent intent) { - synchronized (this) { - intents.put(intent.key(), intent); - if (isElectedLeader && isActivatedLeader) { - log.trace("Submitting intent: {}", intent); - intentService.submit(intent); - } - } - } - - @Override - public void withdraw(Intent intent) { - synchronized (this) { - intents.remove(intent.key(), intent); - if (isElectedLeader && isActivatedLeader) { - log.trace("Withdrawing intent: {}", intent); - intentService.withdraw(intent); - } - } - } - - /** - * Signals the synchronizer that the leadership has changed. - * - * @param isLeader true if this instance is now the leader, otherwise false - */ - public void leaderChanged(boolean isLeader) { - log.debug("Leader changed: {}", isLeader); - - if (!isLeader) { - this.isElectedLeader = false; - this.isActivatedLeader = false; - return; // Nothing to do - } - this.isActivatedLeader = false; - this.isElectedLeader = true; - - // Run the synchronization method off-thread - intentsSynchronizerExecutor.execute(this::synchronizeIntents); - } - - private void synchronizeIntents() { - Map<Key, Intent> serviceIntents = new HashMap<>(); - intentService.getIntents().forEach(i -> { - if (i.appId().equals(appId)) { - serviceIntents.put(i.key(), i); - } - }); - - List<Intent> intentsToAdd = new LinkedList<>(); - List<Intent> intentsToRemove = new LinkedList<>(); - - for (Intent localIntent : intents.values()) { - Intent serviceIntent = serviceIntents.remove(localIntent.key()); - if (serviceIntent == null) { - intentsToAdd.add(localIntent); - } else { - IntentState state = intentService.getIntentState(serviceIntent.key()); - if (!IntentUtils.equals(serviceIntent, localIntent) || state == null || - state == IntentState.WITHDRAW_REQ || - state == IntentState.WITHDRAWING || - state == IntentState.WITHDRAWN) { - intentsToAdd.add(localIntent); - } - } - } - - for (Intent serviceIntent : serviceIntents.values()) { - IntentState state = intentService.getIntentState(serviceIntent.key()); - if (state != null && state != IntentState.WITHDRAW_REQ - && state != IntentState.WITHDRAWING - && state != IntentState.WITHDRAWN) { - intentsToRemove.add(serviceIntent); - } - } - - log.debug("Intent Synchronizer: submitting {}, withdrawing {}", - intentsToAdd.size(), intentsToRemove.size()); - - // Withdraw Intents - for (Intent intent : intentsToRemove) { - intentService.withdraw(intent); - log.trace("Intent Synchronizer: withdrawing intent: {}", - intent); - } - if (!isElectedLeader) { - log.debug("Intent Synchronizer: cannot withdraw intents: " + - "not elected leader anymore"); - isActivatedLeader = false; - return; - } - - // Add Intents - for (Intent intent : intentsToAdd) { - intentService.submit(intent); - log.trace("Intent Synchronizer: submitting intent: {}", - intent); - } - if (!isElectedLeader) { - log.debug("Intent Synchronizer: cannot submit intents: " + - "not elected leader anymore"); - isActivatedLeader = false; - return; - } - - if (isElectedLeader) { - isActivatedLeader = true; // Allow push of Intents - } else { - isActivatedLeader = false; - } - log.debug("Intent synchronization completed"); - } -} diff --git a/framework/src/onos/apps/sdnip/src/main/java/org/onosproject/sdnip/PeerConnectivityManager.java b/framework/src/onos/apps/sdnip/src/main/java/org/onosproject/sdnip/PeerConnectivityManager.java deleted file mode 100644 index edc2df4d..00000000 --- a/framework/src/onos/apps/sdnip/src/main/java/org/onosproject/sdnip/PeerConnectivityManager.java +++ /dev/null @@ -1,412 +0,0 @@ -/* - * Copyright 2014-2015 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.sdnip; - -import org.onlab.packet.Ethernet; -import org.onlab.packet.IPv4; -import org.onlab.packet.IPv6; -import org.onlab.packet.IpAddress; -import org.onlab.packet.IpPrefix; -import org.onlab.packet.TpPort; -import org.onosproject.core.ApplicationId; -import org.onosproject.incubator.net.intf.Interface; -import org.onosproject.incubator.net.intf.InterfaceService; -import org.onosproject.net.ConnectPoint; -import org.onosproject.net.config.NetworkConfigEvent; -import org.onosproject.net.config.NetworkConfigListener; -import org.onosproject.net.config.NetworkConfigService; -import org.onosproject.net.flow.DefaultTrafficSelector; -import org.onosproject.net.flow.DefaultTrafficTreatment; -import org.onosproject.net.flow.TrafficSelector; -import org.onosproject.net.flow.TrafficTreatment; -import org.onosproject.net.host.InterfaceIpAddress; -import org.onosproject.net.intent.IntentUtils; -import org.onosproject.net.intent.Key; -import org.onosproject.net.intent.PointToPointIntent; -import org.onosproject.routing.IntentSynchronizationService; -import org.onosproject.routing.RoutingService; -import org.onosproject.routing.config.BgpConfig; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import static com.google.common.base.Preconditions.checkNotNull; - -/** - * Manages the connectivity requirements between peers. - */ -public class PeerConnectivityManager { - private static final int PRIORITY_OFFSET = 1000; - - private static final String SUFFIX_DST = "dst"; - private static final String SUFFIX_SRC = "src"; - private static final String SUFFIX_ICMP = "icmp"; - - private static final Logger log = LoggerFactory.getLogger( - PeerConnectivityManager.class); - - private static final short BGP_PORT = 179; - - private final IntentSynchronizationService intentSynchronizer; - private final NetworkConfigService configService; - private final InterfaceService interfaceService; - - private final ApplicationId appId; - private final ApplicationId routerAppId; - - private final Map<Key, PointToPointIntent> peerIntents; - - private final InternalNetworkConfigListener configListener - = new InternalNetworkConfigListener(); - - /** - * Creates a new PeerConnectivityManager. - * - * @param appId the application ID - * @param intentSynchronizer the intent synchronizer - * @param configService the SDN-IP config service - * @param interfaceService the interface service - * @param routerAppId application ID - */ - public PeerConnectivityManager(ApplicationId appId, - IntentSynchronizationService intentSynchronizer, - NetworkConfigService configService, - ApplicationId routerAppId, - InterfaceService interfaceService) { - this.appId = appId; - this.intentSynchronizer = intentSynchronizer; - this.configService = configService; - this.routerAppId = routerAppId; - this.interfaceService = interfaceService; - - peerIntents = new HashMap<>(); - } - - /** - * Starts the peer connectivity manager. - */ - public void start() { - configService.addListener(configListener); - setUpConnectivity(); - } - - /** - * Stops the peer connectivity manager. - */ - public void stop() { - configService.removeListener(configListener); - } - - /** - * Sets up paths to establish connectivity between all internal - * BGP speakers and external BGP peers. - */ - private void setUpConnectivity() { - BgpConfig config = configService.getConfig(routerAppId, RoutingService.CONFIG_CLASS); - - if (config == null) { - log.warn("No BgpConfig found"); - return; - } - - Map<Key, PointToPointIntent> existingIntents = new HashMap<>(peerIntents); - - for (BgpConfig.BgpSpeakerConfig bgpSpeaker : config.bgpSpeakers()) { - log.debug("Start to set up BGP paths for BGP speaker: {}", - bgpSpeaker); - - buildSpeakerIntents(bgpSpeaker).forEach(i -> { - PointToPointIntent intent = existingIntents.remove(i.key()); - if (intent == null || !IntentUtils.equals(i, intent)) { - peerIntents.put(i.key(), i); - intentSynchronizer.submit(i); - } - }); - } - - // Remove any remaining intents that we used to have that we don't need - // anymore - existingIntents.values().forEach(i -> { - peerIntents.remove(i.key()); - intentSynchronizer.withdraw(i); - }); - } - - private Collection<PointToPointIntent> buildSpeakerIntents(BgpConfig.BgpSpeakerConfig speaker) { - List<PointToPointIntent> intents = new ArrayList<>(); - - for (IpAddress peerAddress : speaker.peers()) { - Interface peeringInterface = interfaceService.getMatchingInterface(peerAddress); - - if (peeringInterface == null) { - log.debug("No peering interface found for peer {} on speaker {}", - peerAddress, speaker); - continue; - } - - IpAddress peeringAddress = null; - for (InterfaceIpAddress address : peeringInterface.ipAddresses()) { - if (address.subnetAddress().contains(peerAddress)) { - peeringAddress = address.ipAddress(); - break; - } - } - - checkNotNull(peeringAddress); - - intents.addAll(buildIntents(speaker.connectPoint(), peeringAddress, - peeringInterface.connectPoint(), peerAddress)); - } - - return intents; - } - - /** - * Builds the required intents between the two pairs of connect points and - * IP addresses. - * - * @param portOne the first connect point - * @param ipOne the first IP address - * @param portTwo the second connect point - * @param ipTwo the second IP address - * @return the intents to install - */ - private Collection<PointToPointIntent> buildIntents(ConnectPoint portOne, - IpAddress ipOne, - ConnectPoint portTwo, - IpAddress ipTwo) { - - List<PointToPointIntent> intents = new ArrayList<>(); - - TrafficTreatment treatment = DefaultTrafficTreatment.emptyTreatment(); - TrafficSelector selector; - Key key; - - byte tcpProtocol; - byte icmpProtocol; - - if (ipOne.isIp4()) { - tcpProtocol = IPv4.PROTOCOL_TCP; - icmpProtocol = IPv4.PROTOCOL_ICMP; - } else { - tcpProtocol = IPv6.PROTOCOL_TCP; - icmpProtocol = IPv6.PROTOCOL_ICMP6; - } - - // Path from BGP speaker to BGP peer matching destination TCP port 179 - selector = buildSelector(tcpProtocol, - ipOne, - ipTwo, - null, - BGP_PORT); - - key = buildKey(ipOne, ipTwo, SUFFIX_DST); - - intents.add(PointToPointIntent.builder() - .appId(appId) - .key(key) - .selector(selector) - .treatment(treatment) - .ingressPoint(portOne) - .egressPoint(portTwo) - .priority(PRIORITY_OFFSET) - .build()); - - // Path from BGP speaker to BGP peer matching source TCP port 179 - selector = buildSelector(tcpProtocol, - ipOne, - ipTwo, - BGP_PORT, - null); - - key = buildKey(ipOne, ipTwo, SUFFIX_SRC); - - intents.add(PointToPointIntent.builder() - .appId(appId) - .key(key) - .selector(selector) - .treatment(treatment) - .ingressPoint(portOne) - .egressPoint(portTwo) - .priority(PRIORITY_OFFSET) - .build()); - - // Path from BGP peer to BGP speaker matching destination TCP port 179 - selector = buildSelector(tcpProtocol, - ipTwo, - ipOne, - null, - BGP_PORT); - - key = buildKey(ipTwo, ipOne, SUFFIX_DST); - - intents.add(PointToPointIntent.builder() - .appId(appId) - .key(key) - .selector(selector) - .treatment(treatment) - .ingressPoint(portTwo) - .egressPoint(portOne) - .priority(PRIORITY_OFFSET) - .build()); - - // Path from BGP peer to BGP speaker matching source TCP port 179 - selector = buildSelector(tcpProtocol, - ipTwo, - ipOne, - BGP_PORT, - null); - - key = buildKey(ipTwo, ipOne, SUFFIX_SRC); - - intents.add(PointToPointIntent.builder() - .appId(appId) - .key(key) - .selector(selector) - .treatment(treatment) - .ingressPoint(portTwo) - .egressPoint(portOne) - .priority(PRIORITY_OFFSET) - .build()); - - // ICMP path from BGP speaker to BGP peer - selector = buildSelector(icmpProtocol, - ipOne, - ipTwo, - null, - null); - - key = buildKey(ipOne, ipTwo, SUFFIX_ICMP); - - intents.add(PointToPointIntent.builder() - .appId(appId) - .key(key) - .selector(selector) - .treatment(treatment) - .ingressPoint(portOne) - .egressPoint(portTwo) - .priority(PRIORITY_OFFSET) - .build()); - - // ICMP path from BGP peer to BGP speaker - selector = buildSelector(icmpProtocol, - ipTwo, - ipOne, - null, - null); - - key = buildKey(ipTwo, ipOne, SUFFIX_ICMP); - - intents.add(PointToPointIntent.builder() - .appId(appId) - .key(key) - .selector(selector) - .treatment(treatment) - .ingressPoint(portTwo) - .egressPoint(portOne) - .priority(PRIORITY_OFFSET) - .build()); - - return intents; - } - - /** - * Builds a traffic selector based on the set of input parameters. - * - * @param ipProto IP protocol - * @param srcIp source IP address - * @param dstIp destination IP address - * @param srcTcpPort source TCP port, or null if shouldn't be set - * @param dstTcpPort destination TCP port, or null if shouldn't be set - * @return the new traffic selector - */ - private TrafficSelector buildSelector(byte ipProto, IpAddress srcIp, - IpAddress dstIp, Short srcTcpPort, - Short dstTcpPort) { - TrafficSelector.Builder builder = DefaultTrafficSelector.builder().matchIPProtocol(ipProto); - - if (dstIp.isIp4()) { - builder.matchEthType(Ethernet.TYPE_IPV4) - .matchIPSrc(IpPrefix.valueOf(srcIp, IpPrefix.MAX_INET_MASK_LENGTH)) - .matchIPDst(IpPrefix.valueOf(dstIp, IpPrefix.MAX_INET_MASK_LENGTH)); - } else { - builder.matchEthType(Ethernet.TYPE_IPV6) - .matchIPv6Src(IpPrefix.valueOf(srcIp, IpPrefix.MAX_INET6_MASK_LENGTH)) - .matchIPv6Dst(IpPrefix.valueOf(dstIp, IpPrefix.MAX_INET6_MASK_LENGTH)); - } - - if (srcTcpPort != null) { - builder.matchTcpSrc(TpPort.tpPort(srcTcpPort)); - } - - if (dstTcpPort != null) { - builder.matchTcpDst(TpPort.tpPort(dstTcpPort)); - } - - return builder.build(); - } - - /** - * Builds an intent Key for a point-to-point intent based off the source - * and destination IP address, as well as a suffix String to distinguish - * between different types of intents between the same source and - * destination. - * - * @param srcIp source IP address - * @param dstIp destination IP address - * @param suffix suffix string - * @return intent key - */ - private Key buildKey(IpAddress srcIp, IpAddress dstIp, String suffix) { - String keyString = new StringBuilder() - .append(srcIp.toString()) - .append("-") - .append(dstIp.toString()) - .append("-") - .append(suffix) - .toString(); - - return Key.of(keyString, appId); - } - - private class InternalNetworkConfigListener implements NetworkConfigListener { - - @Override - public void event(NetworkConfigEvent event) { - switch (event.type()) { - case CONFIG_REGISTERED: - break; - case CONFIG_UNREGISTERED: - break; - case CONFIG_ADDED: - case CONFIG_UPDATED: - case CONFIG_REMOVED: - if (event.configClass() == RoutingService.CONFIG_CLASS) { - setUpConnectivity(); - } - break; - default: - break; - } - } - } - -} diff --git a/framework/src/onos/apps/sdnip/src/main/java/org/onosproject/sdnip/SdnIp.java b/framework/src/onos/apps/sdnip/src/main/java/org/onosproject/sdnip/SdnIp.java deleted file mode 100644 index ace888d1..00000000 --- a/framework/src/onos/apps/sdnip/src/main/java/org/onosproject/sdnip/SdnIp.java +++ /dev/null @@ -1,193 +0,0 @@ -/* - * Copyright 2014-2015 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.sdnip; - -import static org.slf4j.LoggerFactory.getLogger; - -import java.util.Objects; - -import org.apache.felix.scr.annotations.Activate; -import org.apache.felix.scr.annotations.Component; -import org.apache.felix.scr.annotations.Deactivate; -import org.apache.felix.scr.annotations.Reference; -import org.apache.felix.scr.annotations.ReferenceCardinality; -import org.apache.felix.scr.annotations.Service; -import org.onosproject.app.ApplicationService; -import org.onosproject.cluster.ClusterService; -import org.onosproject.cluster.ControllerNode; -import org.onosproject.cluster.LeadershipEvent; -import org.onosproject.cluster.LeadershipEventListener; -import org.onosproject.cluster.LeadershipService; -import org.onosproject.core.ApplicationId; -import org.onosproject.core.CoreService; -import org.onosproject.incubator.net.intf.InterfaceService; -import org.onosproject.net.config.NetworkConfigService; -import org.onosproject.net.host.HostService; -import org.onosproject.net.intent.IntentService; -import org.onosproject.routing.IntentSynchronizationService; -import org.onosproject.routing.RoutingService; -import org.onosproject.routing.SdnIpService; -import org.onosproject.routing.config.RoutingConfigurationService; -import org.slf4j.Logger; - -/** - * Component for the SDN-IP peering application. - */ -@Component(immediate = true) -@Service -public class SdnIp implements SdnIpService { - - private static final String SDN_IP_APP = "org.onosproject.sdnip"; - private final Logger log = getLogger(getClass()); - - @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) - protected CoreService coreService; - - @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) - protected IntentService intentService; - - @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) - protected ApplicationService applicationService; - - @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) - protected HostService hostService; - - @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) - protected ClusterService clusterService; - - @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) - protected LeadershipService leadershipService; - - @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) - protected RoutingService routingService; - - @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) - protected RoutingConfigurationService config; - - @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) - protected NetworkConfigService networkConfigService; - - @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) - protected InterfaceService interfaceService; - - private IntentSynchronizer intentSynchronizer; - private PeerConnectivityManager peerConnectivity; - private SdnIpFib fib; - - private LeadershipEventListener leadershipEventListener = - new InnerLeadershipEventListener(); - private ApplicationId appId; - private ControllerNode localControllerNode; - - @Activate - protected void activate() { - log.info("SDN-IP started"); - - appId = coreService.registerApplication(SDN_IP_APP); - - localControllerNode = clusterService.getLocalNode(); - - intentSynchronizer = new IntentSynchronizer(appId, intentService); - intentSynchronizer.start(); - - peerConnectivity = new PeerConnectivityManager(appId, - intentSynchronizer, - networkConfigService, - coreService.getAppId(RoutingService.ROUTER_APP_ID), - interfaceService); - peerConnectivity.start(); - - fib = new SdnIpFib(appId, interfaceService, intentSynchronizer); - - routingService.addFibListener(fib); - routingService.start(); - - leadershipService.addListener(leadershipEventListener); - leadershipService.runForLeadership(appId.name()); - - applicationService.registerDeactivateHook(appId, - intentSynchronizer::removeIntents); - - } - - @Deactivate - protected void deactivate() { - routingService.stop(); - peerConnectivity.stop(); - intentSynchronizer.stop(); - - leadershipService.withdraw(appId.name()); - leadershipService.removeListener(leadershipEventListener); - - log.info("SDN-IP Stopped"); - } - - @Override - public void modifyPrimary(boolean isPrimary) { - intentSynchronizer.leaderChanged(isPrimary); - } - - @Override - public IntentSynchronizationService getIntentSynchronizationService() { - return intentSynchronizer; - } - - /** - * Converts DPIDs of the form xx:xx:xx:xx:xx:xx:xx to OpenFlow provider - * device URIs. - * - * @param dpid the DPID string to convert - * @return the URI string for this device - */ - static String dpidToUri(String dpid) { - return "of:" + dpid.replace(":", ""); - } - - /** - * A listener for Leadership Events. - */ - private class InnerLeadershipEventListener - implements LeadershipEventListener { - - @Override - public void event(LeadershipEvent event) { - log.debug("Leadership Event: time = {} type = {} event = {}", - event.time(), event.type(), event); - - if (!event.subject().topic().equals(appId.name())) { - return; // Not our topic: ignore - } - if (!Objects.equals(event.subject().leader(), localControllerNode.id())) { - return; // The event is not about this instance: ignore - } - - switch (event.type()) { - case LEADER_ELECTED: - log.info("SDN-IP Leader Elected"); - intentSynchronizer.leaderChanged(true); - break; - case LEADER_BOOTED: - log.info("SDN-IP Leader Lost Election"); - intentSynchronizer.leaderChanged(false); - break; - case LEADER_REELECTED: - break; - default: - break; - } - } - } -} diff --git a/framework/src/onos/apps/sdnip/src/main/java/org/onosproject/sdnip/SdnIpFib.java b/framework/src/onos/apps/sdnip/src/main/java/org/onosproject/sdnip/SdnIpFib.java deleted file mode 100644 index 9113e013..00000000 --- a/framework/src/onos/apps/sdnip/src/main/java/org/onosproject/sdnip/SdnIpFib.java +++ /dev/null @@ -1,227 +0,0 @@ -/* - * Copyright 2015 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.sdnip; - -import com.google.common.collect.ImmutableList; -import org.onlab.packet.Ethernet; -import org.onlab.packet.IpAddress; -import org.onlab.packet.IpPrefix; -import org.onlab.packet.MacAddress; -import org.onlab.packet.VlanId; -import org.onosproject.core.ApplicationId; -import org.onosproject.incubator.net.intf.Interface; -import org.onosproject.incubator.net.intf.InterfaceService; -import org.onosproject.net.ConnectPoint; -import org.onosproject.net.flow.DefaultTrafficSelector; -import org.onosproject.net.flow.DefaultTrafficTreatment; -import org.onosproject.net.flow.TrafficSelector; -import org.onosproject.net.flow.TrafficTreatment; -import org.onosproject.net.intent.Constraint; -import org.onosproject.net.intent.Key; -import org.onosproject.net.intent.MultiPointToSinglePointIntent; -import org.onosproject.net.intent.constraint.PartialFailureConstraint; -import org.onosproject.routing.FibListener; -import org.onosproject.routing.FibUpdate; -import org.onosproject.routing.IntentSynchronizationService; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.Collection; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; - -import static com.google.common.base.Preconditions.checkArgument; - -/** - * FIB component of SDN-IP. - */ -public class SdnIpFib implements FibListener { - private Logger log = LoggerFactory.getLogger(getClass()); - - private static final int PRIORITY_OFFSET = 100; - private static final int PRIORITY_MULTIPLIER = 5; - protected static final ImmutableList<Constraint> CONSTRAINTS - = ImmutableList.of(new PartialFailureConstraint()); - - private final Map<IpPrefix, MultiPointToSinglePointIntent> routeIntents; - - private final ApplicationId appId; - private final InterfaceService interfaceService; - private final IntentSynchronizationService intentSynchronizer; - - /** - * Class constructor. - * - * @param appId application ID to use when generating intents - * @param interfaceService interface service - * @param intentSynchronizer intent synchronizer - */ - public SdnIpFib(ApplicationId appId, InterfaceService interfaceService, - IntentSynchronizationService intentSynchronizer) { - routeIntents = new ConcurrentHashMap<>(); - - this.appId = appId; - this.interfaceService = interfaceService; - this.intentSynchronizer = intentSynchronizer; - } - - - @Override - public void update(Collection<FibUpdate> updates, - Collection<FibUpdate> withdraws) { - int submitCount = 0, withdrawCount = 0; - // - // NOTE: Semantically, we MUST withdraw existing intents before - // submitting new intents. - // - synchronized (this) { - MultiPointToSinglePointIntent intent; - - // - // Prepare the Intent batch operations for the intents to withdraw - // - for (FibUpdate withdraw : withdraws) { - checkArgument(withdraw.type() == FibUpdate.Type.DELETE, - "FibUpdate with wrong type in withdraws list"); - - IpPrefix prefix = withdraw.entry().prefix(); - intent = routeIntents.remove(prefix); - if (intent == null) { - log.trace("SDN-IP No intent in routeIntents to delete " + - "for prefix: {}", prefix); - continue; - } - intentSynchronizer.withdraw(intent); - withdrawCount++; - } - - // - // Prepare the Intent batch operations for the intents to submit - // - for (FibUpdate update : updates) { - checkArgument(update.type() == FibUpdate.Type.UPDATE, - "FibUpdate with wrong type in updates list"); - - IpPrefix prefix = update.entry().prefix(); - intent = generateRouteIntent(prefix, update.entry().nextHopIp(), - update.entry().nextHopMac()); - - if (intent == null) { - // This preserves the old semantics - if an intent can't be - // generated, we don't do anything with that prefix. But - // perhaps we should withdraw the old intent anyway? - continue; - } - - routeIntents.put(prefix, intent); - intentSynchronizer.submit(intent); - submitCount++; - } - - log.debug("SDN-IP submitted {}/{}, withdrew = {}/{}", submitCount, - updates.size(), withdrawCount, withdraws.size()); - } - } - - /** - * Generates a route intent for a prefix, the next hop IP address, and - * the next hop MAC address. - * <p/> - * This method will find the egress interface for the intent. - * Intent will match dst IP prefix and rewrite dst MAC address at all other - * border switches, then forward packets according to dst MAC address. - * - * @param prefix IP prefix of the route to add - * @param nextHopIpAddress IP address of the next hop - * @param nextHopMacAddress MAC address of the next hop - * @return the generated intent, or null if no intent should be submitted - */ - private MultiPointToSinglePointIntent generateRouteIntent( - IpPrefix prefix, - IpAddress nextHopIpAddress, - MacAddress nextHopMacAddress) { - - // Find the attachment point (egress interface) of the next hop - Interface egressInterface = - interfaceService.getMatchingInterface(nextHopIpAddress); - if (egressInterface == null) { - log.warn("No outgoing interface found for {}", - nextHopIpAddress); - return null; - } - - // Generate the intent itself - Set<ConnectPoint> ingressPorts = new HashSet<>(); - ConnectPoint egressPort = egressInterface.connectPoint(); - log.debug("Generating intent for prefix {}, next hop mac {}", - prefix, nextHopMacAddress); - - for (Interface intf : interfaceService.getInterfaces()) { - // TODO this should be only peering interfaces - if (!intf.connectPoint().equals(egressInterface.connectPoint())) { - ConnectPoint srcPort = intf.connectPoint(); - ingressPorts.add(srcPort); - } - } - - // Match the destination IP prefix at the first hop - TrafficSelector.Builder selector = DefaultTrafficSelector.builder(); - if (prefix.isIp4()) { - selector.matchEthType(Ethernet.TYPE_IPV4); - // if it is default route, then we do not need match destination - // IP address - if (prefix.prefixLength() != 0) { - selector.matchIPDst(prefix); - } - } else { - selector.matchEthType(Ethernet.TYPE_IPV6); - // if it is default route, then we do not need match destination - // IP address - if (prefix.prefixLength() != 0) { - selector.matchIPv6Dst(prefix); - } - - } - - // Rewrite the destination MAC address - TrafficTreatment.Builder treatment = DefaultTrafficTreatment.builder() - .setEthDst(nextHopMacAddress); - if (!egressInterface.vlan().equals(VlanId.NONE)) { - treatment.setVlanId(egressInterface.vlan()); - // If we set VLAN ID, we have to make sure a VLAN tag exists. - // TODO support no VLAN -> VLAN routing - selector.matchVlanId(VlanId.ANY); - } - - int priority = - prefix.prefixLength() * PRIORITY_MULTIPLIER + PRIORITY_OFFSET; - Key key = Key.of(prefix.toString(), appId); - return MultiPointToSinglePointIntent.builder() - .appId(appId) - .key(key) - .selector(selector.build()) - .treatment(treatment.build()) - .ingressPoints(ingressPorts) - .egressPoint(egressPort) - .priority(priority) - .constraints(CONSTRAINTS) - .build(); - } - -} diff --git a/framework/src/onos/apps/sdnip/src/main/java/org/onosproject/sdnip/cli/AddPeerCommand.java b/framework/src/onos/apps/sdnip/src/main/java/org/onosproject/sdnip/cli/AddPeerCommand.java deleted file mode 100644 index 81231ab9..00000000 --- a/framework/src/onos/apps/sdnip/src/main/java/org/onosproject/sdnip/cli/AddPeerCommand.java +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Copyright 2014-2015 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.sdnip.cli; - -import org.apache.karaf.shell.commands.Argument; -import org.apache.karaf.shell.commands.Command; -import org.onlab.packet.IpAddress; -import org.onosproject.cli.AbstractShellCommand; -import org.onosproject.core.ApplicationId; -import org.onosproject.core.CoreService; -import org.onosproject.incubator.net.intf.InterfaceService; -import org.onosproject.net.config.NetworkConfigService; -import org.onosproject.routing.RoutingService; -import org.onosproject.routing.config.BgpConfig; - -/** - * Command to add new BGP peer to existing internal speaker. - */ -@Command(scope = "onos", name = "add-bgp-peer", - description = "Adds an external BGP router as peer to an existing BGP speaker") -public class AddPeerCommand extends AbstractShellCommand { - - @Argument(index = 0, name = "name", - description = "Name of the internal BGP speaker", - required = true, multiValued = false) - String name = null; - - @Argument(index = 1, name = "ip", - description = "IP address of the BGP peer", - required = true, multiValued = false) - String ip = null; - - private static final String PEER_ADD_SUCCESS = "Peer Successfully Added."; - private static final String NO_CONFIGURATION = "No speakers configured"; - private static final String SPEAKER_NOT_FOUND = - "Speaker with name \'%s\' not found"; - private static final String NO_INTERFACE = - "No matching interface found for IP \'%s\'"; - - private IpAddress peerAddress = null; - - @Override - protected void execute() { - peerAddress = IpAddress.valueOf(ip); - - NetworkConfigService configService = get(NetworkConfigService.class); - CoreService coreService = get(CoreService.class); - ApplicationId appId = coreService.getAppId(RoutingService.ROUTER_APP_ID); - - BgpConfig config = configService.getConfig(appId, BgpConfig.class); - if (config == null || config.bgpSpeakers().isEmpty()) { - print(NO_CONFIGURATION); - return; - } - - BgpConfig.BgpSpeakerConfig speaker = config.getSpeakerWithName(name); - if (speaker == null) { - print(SPEAKER_NOT_FOUND, name); - return; - } else { - if (speaker.isConnectedToPeer(peerAddress)) { - return; // Peering already exists. - } - } - - InterfaceService interfaceService = get(InterfaceService.class); - if (interfaceService.getMatchingInterface(peerAddress) == null) { - print(NO_INTERFACE, ip); - return; - } - - addPeerToSpeakerConf(config); - configService.applyConfig(appId, BgpConfig.class, config.node()); - - print(PEER_ADD_SUCCESS); - } - - private void addPeerToSpeakerConf(BgpConfig config) { - log.debug("Creating BGP configuration for new peer: {}", ip); - config.addPeerToSpeaker(name, peerAddress); - } -} diff --git a/framework/src/onos/apps/sdnip/src/main/java/org/onosproject/sdnip/cli/AddSpeakerCommand.java b/framework/src/onos/apps/sdnip/src/main/java/org/onosproject/sdnip/cli/AddSpeakerCommand.java deleted file mode 100644 index 84353852..00000000 --- a/framework/src/onos/apps/sdnip/src/main/java/org/onosproject/sdnip/cli/AddSpeakerCommand.java +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Copyright 2014-2015 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.sdnip.cli; - -import org.apache.karaf.shell.commands.Argument; -import org.apache.karaf.shell.commands.Command; -import org.onlab.packet.IpAddress; -import org.onosproject.cli.AbstractShellCommand; -import org.onosproject.core.ApplicationId; -import org.onosproject.core.CoreService; -import org.onosproject.net.ConnectPoint; -import org.onosproject.net.config.NetworkConfigService; -import org.onosproject.routing.RoutingService; -import org.onosproject.routing.config.BgpConfig; - -import java.util.HashSet; -import java.util.Optional; - -/** - * Command to add a new internal BGP speaker. - */ -@Command(scope = "onos", name = "add-bgp-speaker", - description = "Adds an internal BGP speaker") -public class AddSpeakerCommand extends AbstractShellCommand { - - @Argument(index = 0, name = "name", - description = "Name of the internal BGP speaker", - required = true, multiValued = false) - String name = null; - - @Argument(index = 1, name = "connectionPoint", - description = "Interface to the BGP speaker", - required = true, multiValued = false) - String connectionPoint = null; - - private static final String SPEAKER_ADD_SUCCESS = "Speaker Successfully Added."; - - @Override - protected void execute() { - NetworkConfigService configService = get(NetworkConfigService.class); - CoreService coreService = get(CoreService.class); - ApplicationId appId = coreService.getAppId(RoutingService.ROUTER_APP_ID); - - BgpConfig config = configService.addConfig(appId, BgpConfig.class); - - BgpConfig.BgpSpeakerConfig speaker = config.getSpeakerWithName(name); - if (speaker != null) { - log.debug("Speaker already exists: {}", name); - return; - } - - addSpeakerToConf(config); - configService.applyConfig(appId, BgpConfig.class, config.node()); - - print(SPEAKER_ADD_SUCCESS); - } - - /** - * Adds the speaker to the BgpConfig service. - * - * @param config the BGP configuration - */ - private void addSpeakerToConf(BgpConfig config) { - log.debug("Adding new speaker to configuration: {}", name); - BgpConfig.BgpSpeakerConfig speaker = getSpeaker(); - - config.addSpeaker(speaker); - } - - private BgpConfig.BgpSpeakerConfig getSpeaker() { - ConnectPoint connectPoint = ConnectPoint. - deviceConnectPoint(connectionPoint); - return new BgpConfig.BgpSpeakerConfig(Optional.ofNullable(name), - connectPoint, new HashSet<IpAddress>()); - } -} diff --git a/framework/src/onos/apps/sdnip/src/main/java/org/onosproject/sdnip/cli/PrimaryChangeCommand.java b/framework/src/onos/apps/sdnip/src/main/java/org/onosproject/sdnip/cli/PrimaryChangeCommand.java deleted file mode 100644 index 7a17cfe0..00000000 --- a/framework/src/onos/apps/sdnip/src/main/java/org/onosproject/sdnip/cli/PrimaryChangeCommand.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright 2014 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.sdnip.cli; - -import org.apache.karaf.shell.commands.Argument; -import org.apache.karaf.shell.commands.Command; -import org.onosproject.cli.AbstractShellCommand; -import org.onosproject.routing.SdnIpService; - -/** - * Command to change whether this SDNIP instance is primary or not. - */ -@Command(scope = "onos", name = "sdnip-set-primary", - description = "Changes the primary status of this SDN-IP instance") -public class PrimaryChangeCommand extends AbstractShellCommand { - - @Argument(index = 0, name = "isPrimary", - description = "True if this instance should be primary, false if not", - required = true, multiValued = false) - boolean isPrimary = false; - - @Override - protected void execute() { - get(SdnIpService.class).modifyPrimary(isPrimary); - } - -} diff --git a/framework/src/onos/apps/sdnip/src/main/java/org/onosproject/sdnip/cli/RemovePeerCommand.java b/framework/src/onos/apps/sdnip/src/main/java/org/onosproject/sdnip/cli/RemovePeerCommand.java deleted file mode 100644 index bfc6fb7b..00000000 --- a/framework/src/onos/apps/sdnip/src/main/java/org/onosproject/sdnip/cli/RemovePeerCommand.java +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Copyright 2014-2015 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.sdnip.cli; - -import org.apache.karaf.shell.commands.Argument; -import org.apache.karaf.shell.commands.Command; -import org.onlab.packet.IpAddress; -import org.onosproject.cli.AbstractShellCommand; -import org.onosproject.core.ApplicationId; -import org.onosproject.core.CoreService; -import org.onosproject.net.config.NetworkConfigService; -import org.onosproject.routing.RoutingService; -import org.onosproject.routing.config.BgpConfig; - -/** - * Command to remove existing BGP peer. - */ -@Command(scope = "onos", name = "remove-bgp-peer", - description = "Removes a BGP peer") -public class RemovePeerCommand extends AbstractShellCommand { - - @Argument(index = 0, name = "ip", - description = "IP address of the BGP peer", - required = true, multiValued = false) - String ip = null; - - private static final String PEER_REMOVE_SUCCESS = "Peer Successfully Removed."; - private static final String NO_CONFIGURATION = "No speakers configured"; - private static final String PEER_NOT_FOUND = - "Peer with IP \'%s\' not found"; - - private IpAddress peerAddress = null; - - @Override - protected void execute() { - peerAddress = IpAddress.valueOf(ip); - - NetworkConfigService configService = get(NetworkConfigService.class); - CoreService coreService = get(CoreService.class); - ApplicationId appId = coreService.getAppId(RoutingService.ROUTER_APP_ID); - - BgpConfig config = configService.getConfig(appId, BgpConfig.class); - if (config == null || config.bgpSpeakers().isEmpty()) { - print(NO_CONFIGURATION); - return; - } - - peerAddress = IpAddress.valueOf(ip); - - BgpConfig.BgpSpeakerConfig speaker = config.getSpeakerFromPeer(peerAddress); - if (speaker == null) { - print(PEER_NOT_FOUND, ip); - return; - } - - removePeerFromSpeakerConf(speaker, config); - configService.applyConfig(appId, BgpConfig.class, config.node()); - - print(PEER_REMOVE_SUCCESS); - } - - private void removePeerFromSpeakerConf(BgpConfig.BgpSpeakerConfig speaker, - BgpConfig config) { - log.debug("Removing BGP configuration for peer: {}", ip); - config.removePeerFromSpeaker(speaker, peerAddress); - } -} diff --git a/framework/src/onos/apps/sdnip/src/main/java/org/onosproject/sdnip/cli/RemoveSpeakerCommand.java b/framework/src/onos/apps/sdnip/src/main/java/org/onosproject/sdnip/cli/RemoveSpeakerCommand.java deleted file mode 100644 index 6a51b42f..00000000 --- a/framework/src/onos/apps/sdnip/src/main/java/org/onosproject/sdnip/cli/RemoveSpeakerCommand.java +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Copyright 2014-2015 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.sdnip.cli; - -import org.apache.karaf.shell.commands.Argument; -import org.apache.karaf.shell.commands.Command; -import org.onosproject.cli.AbstractShellCommand; -import org.onosproject.core.ApplicationId; -import org.onosproject.core.CoreService; -import org.onosproject.net.config.NetworkConfigService; -import org.onosproject.routing.RoutingService; -import org.onosproject.routing.config.BgpConfig; - -/** - * Command to remove a internal BGP speaker. - */ -@Command(scope = "onos", name = "remove-bgp-speaker", - description = "Removes an internal BGP speaker") -public class RemoveSpeakerCommand extends AbstractShellCommand { - - @Argument(index = 0, name = "name", - description = "Name of the internal BGP speaker", - required = true, multiValued = false) - String name = null; - - private static final String SPEAKER_REMOVE_SUCCESS = "Speaker Successfully Removed."; - private static final String NO_CONFIGURATION = "No speakers configured"; - private static final String PEERS_EXIST = - "Speaker with name \'%s\' has peer connections"; - private static final String SPEAKER_NOT_FOUND = - "Speaker with name \'%s\' not found"; - - @Override - protected void execute() { - NetworkConfigService configService = get(NetworkConfigService.class); - CoreService coreService = get(CoreService.class); - ApplicationId appId = coreService.getAppId(RoutingService.ROUTER_APP_ID); - - BgpConfig config = configService.getConfig(appId, BgpConfig.class); - if (config == null || config.bgpSpeakers().isEmpty()) { - print(NO_CONFIGURATION); - return; - } - - BgpConfig.BgpSpeakerConfig speaker = config.getSpeakerWithName(name); - if (speaker == null) { - print(SPEAKER_NOT_FOUND, name); - return; - } else { - if (!speaker.peers().isEmpty()) { - // Removal not allowed when peer connections exist. - print(PEERS_EXIST, name); - return; - } - } - - removeSpeakerFromConf(config); - configService.applyConfig(appId, BgpConfig.class, config.node()); - - print(SPEAKER_REMOVE_SUCCESS); - } - - /** - * Removes the speaker from the BgpConfig service. - * - * @param bgpConfig the BGP configuration - */ - private void removeSpeakerFromConf(BgpConfig bgpConfig) { - log.debug("Removing speaker from configuration: {}", name); - - bgpConfig.removeSpeaker(name); - } -} diff --git a/framework/src/onos/apps/sdnip/src/main/java/org/onosproject/sdnip/cli/package-info.java b/framework/src/onos/apps/sdnip/src/main/java/org/onosproject/sdnip/cli/package-info.java deleted file mode 100644 index 73ea2a4f..00000000 --- a/framework/src/onos/apps/sdnip/src/main/java/org/onosproject/sdnip/cli/package-info.java +++ /dev/null @@ -1,20 +0,0 @@ -/* - * Copyright 2014 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. - */ - -/** - * SDN-IP command-line handlers. - */ -package org.onosproject.sdnip.cli; diff --git a/framework/src/onos/apps/sdnip/src/main/java/org/onosproject/sdnip/package-info.java b/framework/src/onos/apps/sdnip/src/main/java/org/onosproject/sdnip/package-info.java deleted file mode 100644 index 1e7d8cb9..00000000 --- a/framework/src/onos/apps/sdnip/src/main/java/org/onosproject/sdnip/package-info.java +++ /dev/null @@ -1,20 +0,0 @@ -/* - * Copyright 2014 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. - */ - -/** - * SDN-IP peering application. - */ -package org.onosproject.sdnip; diff --git a/framework/src/onos/apps/sdnip/src/main/resources/OSGI-INF/blueprint/shell-config.xml b/framework/src/onos/apps/sdnip/src/main/resources/OSGI-INF/blueprint/shell-config.xml deleted file mode 100644 index 97b2f09f..00000000 --- a/framework/src/onos/apps/sdnip/src/main/resources/OSGI-INF/blueprint/shell-config.xml +++ /dev/null @@ -1,35 +0,0 @@ -<!-- - ~ Copyright 2014 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. - --> -<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"> - - <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.1.0"> - <command> - <action class="org.onosproject.sdnip.cli.PrimaryChangeCommand"/> - </command> - <command> - <action class="org.onosproject.sdnip.cli.AddSpeakerCommand"/> - </command> - <command> - <action class="org.onosproject.sdnip.cli.RemoveSpeakerCommand"/> - </command> - <command> - <action class="org.onosproject.sdnip.cli.AddPeerCommand"/> - </command> - <command> - <action class="org.onosproject.sdnip.cli.RemovePeerCommand"/> - </command> - </command-bundle> -</blueprint> diff --git a/framework/src/onos/apps/sdnip/src/main/resources/config-examples/README b/framework/src/onos/apps/sdnip/src/main/resources/config-examples/README deleted file mode 100644 index 7642a4dd..00000000 --- a/framework/src/onos/apps/sdnip/src/main/resources/config-examples/README +++ /dev/null @@ -1,5 +0,0 @@ -The SDN-IP configuration files should be copied to directory - $ONOS_HOME/tools/package/config - -After deployment and starting up the ONOS cluster, ONOS looks for these -configuration files in /opt/onos/config on each cluster member. diff --git a/framework/src/onos/apps/sdnip/src/main/resources/config-examples/sdnip.json b/framework/src/onos/apps/sdnip/src/main/resources/config-examples/sdnip.json deleted file mode 100644 index c51de68a..00000000 --- a/framework/src/onos/apps/sdnip/src/main/resources/config-examples/sdnip.json +++ /dev/null @@ -1,86 +0,0 @@ -{ - "bgpPeers" : [ - { - "attachmentDpid" : "00:00:00:00:00:00:00:a3", - "attachmentPort" : "1", - "ipAddress" : "192.168.10.1" - }, - { - "attachmentDpid" : "00:00:00:00:00:00:00:a5", - "attachmentPort" : "1", - "ipAddress" : "192.168.20.1" - }, - { - "attachmentDpid" : "00:00:00:00:00:00:00:a2", - "attachmentPort" : "1", - "ipAddress" : "192.168.30.1" - }, - { - "attachmentDpid" : "00:00:00:00:00:00:00:a6", - "attachmentPort" : "1", - "ipAddress" : "192.168.40.1" - }, - { - "attachmentDpid" : "00:00:00:00:00:00:00:a4", - "attachmentPort" : "4", - "ipAddress" : "192.168.60.1" - } - ], - "bgpSpeakers" : [ - { - "name" : "bgpSpeaker1", - "attachmentDpid" : "00:00:00:00:00:00:00:a1", - "attachmentPort" : "1", - "macAddress" : "00:00:00:00:00:01", - "interfaceAddresses" : [ - { - "interfaceDpid" : "00:00:00:00:00:00:00:a3", - "interfacePort" : "1", - "ipAddress" : "192.168.10.101" - }, - { - "interfaceDpid" : "00:00:00:00:00:00:00:a5", - "interfacePort" : "1", - "ipAddress" : "192.168.20.101" - }, - { - "interfaceDpid" : "00:00:00:00:00:00:00:a2", - "interfacePort" : "1", - "ipAddress" : "192.168.30.101" - }, - { - "interfaceDpid" : "00:00:00:00:00:00:00:a6", - "interfacePort" : "1", - "ipAddress" : "192.168.40.101" - }, - { - "interfaceDpid" : "00:00:00:00:00:00:00:a4", - "interfacePort" : "4", - "ipAddress" : "192.168.60.101" - } - - ] - - } - ], - "ip4LocalPrefixes" : [ - { - "ipPrefix" : "100.0.0.0/24", - "type" : "PUBLIC", - "gatewayIp" : "100.0.0.1" - }, - { - "ipPrefix" : "200.0.0.0/8", - "type" : "PUBLIC", - "gatewayIp" : "200.0.0.3" - }, - { - "ipPrefix" : "192.0.0.0/24", - "type" : "PRIVATE", - "gatewayIp" : "192.0.0.254" - } - ], - "ip6LocalPrefixes" : [ - ], - "virtualGatewayMacAddress" : "00:00:00:00:00:01" -} diff --git a/framework/src/onos/apps/sdnip/src/test/java/org/onosproject/sdnip/IntentSyncTest.java b/framework/src/onos/apps/sdnip/src/test/java/org/onosproject/sdnip/IntentSyncTest.java deleted file mode 100644 index 4736aa1d..00000000 --- a/framework/src/onos/apps/sdnip/src/test/java/org/onosproject/sdnip/IntentSyncTest.java +++ /dev/null @@ -1,421 +0,0 @@ -/* - * Copyright 2014-2015 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.sdnip; - -import com.google.common.collect.Sets; -import com.google.common.util.concurrent.MoreExecutors; -import org.junit.Before; -import org.junit.Test; -import org.onlab.junit.TestUtils; -import org.onlab.junit.TestUtils.TestUtilsException; -import org.onlab.packet.Ethernet; -import org.onlab.packet.Ip4Address; -import org.onlab.packet.Ip4Prefix; -import org.onlab.packet.IpAddress; -import org.onlab.packet.IpPrefix; -import org.onlab.packet.MacAddress; -import org.onlab.packet.VlanId; -import org.onosproject.TestApplicationId; -import org.onosproject.core.ApplicationId; -import org.onosproject.incubator.net.intf.Interface; -import org.onosproject.net.ConnectPoint; -import org.onosproject.net.DeviceId; -import org.onosproject.net.PortNumber; -import org.onosproject.net.flow.DefaultTrafficSelector; -import org.onosproject.net.flow.DefaultTrafficTreatment; -import org.onosproject.net.flow.TrafficSelector; -import org.onosproject.net.flow.TrafficTreatment; -import org.onosproject.net.host.InterfaceIpAddress; -import org.onosproject.net.intent.AbstractIntentTest; -import org.onosproject.net.intent.Intent; -import org.onosproject.net.intent.IntentService; -import org.onosproject.net.intent.IntentState; -import org.onosproject.net.intent.Key; -import org.onosproject.net.intent.MultiPointToSinglePointIntent; -import org.onosproject.net.intent.IntentUtils; -import org.onosproject.routing.RouteEntry; - -import java.util.Collections; -import java.util.HashSet; -import java.util.Set; - -import static org.easymock.EasyMock.createMock; -import static org.easymock.EasyMock.expect; -import static org.easymock.EasyMock.replay; -import static org.easymock.EasyMock.reset; -import static org.easymock.EasyMock.verify; -import static org.hamcrest.Matchers.is; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertThat; - -/** - * This class tests the intent synchronization function in the - * IntentSynchronizer class. - */ -public class IntentSyncTest extends AbstractIntentTest { - - private IntentService intentService; - - private static final ConnectPoint SW1_ETH1 = new ConnectPoint( - DeviceId.deviceId("of:0000000000000001"), - PortNumber.portNumber(1)); - - private static final ConnectPoint SW2_ETH1 = new ConnectPoint( - DeviceId.deviceId("of:0000000000000002"), - PortNumber.portNumber(1)); - - private static final ConnectPoint SW3_ETH1 = new ConnectPoint( - DeviceId.deviceId("of:0000000000000003"), - PortNumber.portNumber(1)); - - private static final ConnectPoint SW4_ETH1 = new ConnectPoint( - DeviceId.deviceId("of:0000000000000004"), - PortNumber.portNumber(1)); - - private IntentSynchronizer intentSynchronizer; - private final Set<Interface> interfaces = Sets.newHashSet(); - - private static final ApplicationId APPID = TestApplicationId.create("SDNIP"); - - @Before - public void setUp() throws Exception { - super.setUp(); - - setUpInterfaceService(); - - intentService = createMock(IntentService.class); - - intentSynchronizer = new IntentSynchronizer(APPID, intentService, - MoreExecutors.newDirectExecutorService()); - } - - /** - * Sets up InterfaceService. - */ - private void setUpInterfaceService() { - Set<InterfaceIpAddress> interfaceIpAddresses1 = Sets.newHashSet(); - interfaceIpAddresses1.add(new InterfaceIpAddress( - IpAddress.valueOf("192.168.10.101"), - IpPrefix.valueOf("192.168.10.0/24"))); - Interface sw1Eth1 = new Interface(SW1_ETH1, - interfaceIpAddresses1, MacAddress.valueOf("00:00:00:00:00:01"), - VlanId.NONE); - interfaces.add(sw1Eth1); - - Set<InterfaceIpAddress> interfaceIpAddresses2 = Sets.newHashSet(); - interfaceIpAddresses2.add( - new InterfaceIpAddress(IpAddress.valueOf("192.168.20.101"), - IpPrefix.valueOf("192.168.20.0/24"))); - Interface sw2Eth1 = new Interface(SW2_ETH1, - interfaceIpAddresses2, MacAddress.valueOf("00:00:00:00:00:02"), - VlanId.NONE); - interfaces.add(sw2Eth1); - - Set<InterfaceIpAddress> interfaceIpAddresses3 = Sets.newHashSet(); - interfaceIpAddresses3.add( - new InterfaceIpAddress(IpAddress.valueOf("192.168.30.101"), - IpPrefix.valueOf("192.168.30.0/24"))); - Interface sw3Eth1 = new Interface(SW3_ETH1, - interfaceIpAddresses3, MacAddress.valueOf("00:00:00:00:00:03"), - VlanId.NONE); - interfaces.add(sw3Eth1); - - InterfaceIpAddress interfaceIpAddress4 = - new InterfaceIpAddress(IpAddress.valueOf("192.168.40.101"), - IpPrefix.valueOf("192.168.40.0/24")); - Interface sw4Eth1 = new Interface(SW4_ETH1, - Sets.newHashSet(interfaceIpAddress4), - MacAddress.valueOf("00:00:00:00:00:04"), - VlanId.vlanId((short) 1)); - - interfaces.add(sw4Eth1); - } - - /** - * Tests the synchronization behavior of intent synchronizer. We set up - * a discrepancy between the intent service state and the intent - * synchronizer's state and ensure that this is reconciled correctly. - * - * @throws TestUtilsException - */ - @Test - public void testIntentSync() throws TestUtilsException { - - // - // Construct routes and intents. - // This test simulates the following cases during the master change - // time interval: - // 1. RouteEntry1 did not change and the intent also did not change. - // 2. RouteEntry2 was deleted, but the intent was not deleted. - // 3. RouteEntry3 was newly added, and the intent was also submitted. - // 4. RouteEntry4 was updated to RouteEntry4Update, and the intent was - // also updated to a new one. - // 5. RouteEntry5 did not change, but its intent id changed. - // 6. RouteEntry6 was newly added, but the intent was not submitted. - // - RouteEntry routeEntry1 = new RouteEntry( - Ip4Prefix.valueOf("1.1.1.0/24"), - Ip4Address.valueOf("192.168.10.1")); - - RouteEntry routeEntry2 = new RouteEntry( - Ip4Prefix.valueOf("2.2.2.0/24"), - Ip4Address.valueOf("192.168.20.1")); - - RouteEntry routeEntry3 = new RouteEntry( - Ip4Prefix.valueOf("3.3.3.0/24"), - Ip4Address.valueOf("192.168.30.1")); - - RouteEntry routeEntry4 = new RouteEntry( - Ip4Prefix.valueOf("4.4.4.0/24"), - Ip4Address.valueOf("192.168.30.1")); - - RouteEntry routeEntry4Update = new RouteEntry( - Ip4Prefix.valueOf("4.4.4.0/24"), - Ip4Address.valueOf("192.168.20.1")); - - RouteEntry routeEntry5 = new RouteEntry( - Ip4Prefix.valueOf("5.5.5.0/24"), - Ip4Address.valueOf("192.168.10.1")); - - RouteEntry routeEntry6 = new RouteEntry( - Ip4Prefix.valueOf("6.6.6.0/24"), - Ip4Address.valueOf("192.168.10.1")); - - RouteEntry routeEntry7 = new RouteEntry( - Ip4Prefix.valueOf("7.7.7.0/24"), - Ip4Address.valueOf("192.168.10.1")); - - MultiPointToSinglePointIntent intent1 = intentBuilder( - routeEntry1.prefix(), "00:00:00:00:00:01", SW1_ETH1); - MultiPointToSinglePointIntent intent2 = intentBuilder( - routeEntry2.prefix(), "00:00:00:00:00:02", SW2_ETH1); - MultiPointToSinglePointIntent intent3 = intentBuilder( - routeEntry3.prefix(), "00:00:00:00:00:03", SW3_ETH1); - MultiPointToSinglePointIntent intent4 = intentBuilder( - routeEntry4.prefix(), "00:00:00:00:00:03", SW3_ETH1); - MultiPointToSinglePointIntent intent4Update = intentBuilder( - routeEntry4Update.prefix(), "00:00:00:00:00:02", SW2_ETH1); - MultiPointToSinglePointIntent intent5 = intentBuilder( - routeEntry5.prefix(), "00:00:00:00:00:01", SW1_ETH1); - MultiPointToSinglePointIntent intent7 = intentBuilder( - routeEntry7.prefix(), "00:00:00:00:00:01", SW1_ETH1); - - // Compose a intent, which is equal to intent5 but the id is different. - MultiPointToSinglePointIntent intent5New = - staticIntentBuilder(intent5, routeEntry5, "00:00:00:00:00:01"); - assertThat(IntentUtils.equals(intent5, intent5New), is(true)); - assertFalse(intent5.equals(intent5New)); - - MultiPointToSinglePointIntent intent6 = intentBuilder( - routeEntry6.prefix(), "00:00:00:00:00:01", SW1_ETH1); - - // Set up expectation - Set<Intent> intents = new HashSet<>(); - intents.add(intent1); - expect(intentService.getIntentState(intent1.key())) - .andReturn(IntentState.INSTALLED).anyTimes(); - intents.add(intent2); - expect(intentService.getIntentState(intent2.key())) - .andReturn(IntentState.INSTALLED).anyTimes(); - intents.add(intent4); - expect(intentService.getIntentState(intent4.key())) - .andReturn(IntentState.INSTALLED).anyTimes(); - intents.add(intent5); - expect(intentService.getIntentState(intent5.key())) - .andReturn(IntentState.INSTALLED).anyTimes(); - intents.add(intent7); - expect(intentService.getIntentState(intent7.key())) - .andReturn(IntentState.WITHDRAWING).anyTimes(); - expect(intentService.getIntents()).andReturn(intents).anyTimes(); - - // These are the operations that should be done to the intentService - // during synchronization - intentService.withdraw(intent2); - intentService.submit(intent3); - intentService.submit(intent4Update); - intentService.submit(intent6); - intentService.submit(intent7); - replay(intentService); - - // Start the test - - // Simulate some input from the clients. The intent synchronizer has not - // gained the global leadership yet, but it will remember this input for - // when it does. - intentSynchronizer.submit(intent1); - intentSynchronizer.submit(intent2); - intentSynchronizer.withdraw(intent2); - intentSynchronizer.submit(intent3); - intentSynchronizer.submit(intent4); - intentSynchronizer.submit(intent4Update); - intentSynchronizer.submit(intent5); - intentSynchronizer.submit(intent6); - intentSynchronizer.submit(intent7); - - // Give the leadership to the intent synchronizer. It will now attempt - // to synchronize the intents in the store with the intents it has - // recorded based on the earlier user input. - intentSynchronizer.leaderChanged(true); - - verify(intentService); - } - - /** - * Tests the behavior of the submit API, both when the synchronizer has - * leadership and when it does not. - */ - @Test - public void testSubmit() { - IpPrefix prefix = Ip4Prefix.valueOf("1.1.1.0/24"); - Intent intent = intentBuilder(prefix, "00:00:00:00:00:01", SW1_ETH1); - - // Set up expectations - intentService.submit(intent); - expect(intentService.getIntents()).andReturn(Collections.emptyList()) - .anyTimes(); - replay(intentService); - - // Give the intent synchronizer leadership so it will submit intents - // to the intent service - intentSynchronizer.leaderChanged(true); - - // Test the submit - intentSynchronizer.submit(intent); - - verify(intentService); - - // Now we'll remove leadership from the intent synchronizer and verify - // that it does not submit any intents to the intent service when we - // call the submit API - reset(intentService); - replay(intentService); - - intentSynchronizer.leaderChanged(false); - - intentSynchronizer.submit(intent); - - verify(intentService); - } - - /** - * Tests the behavior of the withdraw API, both when the synchronizer has - * leadership and when it does not. - */ - @Test - public void testWithdraw() { - IpPrefix prefix = Ip4Prefix.valueOf("1.1.1.0/24"); - Intent intent = intentBuilder(prefix, "00:00:00:00:00:01", SW1_ETH1); - - // Submit an intent first so we can withdraw it later - intentService.submit(intent); - intentService.withdraw(intent); - expect(intentService.getIntents()).andReturn(Collections.emptyList()) - .anyTimes(); - replay(intentService); - - // Give the intent synchronizer leadership so it will submit intents - // to the intent service - intentSynchronizer.leaderChanged(true); - - // Test the submit then withdraw - intentSynchronizer.submit(intent); - intentSynchronizer.withdraw(intent); - - verify(intentService); - - // Now we'll remove leadership from the intent synchronizer and verify - // that it does not withdraw any intents to the intent service when we - // call the withdraw API - reset(intentService); - replay(intentService); - - intentSynchronizer.leaderChanged(false); - - intentSynchronizer.submit(intent); - intentSynchronizer.withdraw(intent); - - verify(intentService); - } - - /** - * MultiPointToSinglePointIntent builder. - * - * @param ipPrefix the ipPrefix to match - * @param nextHopMacAddress to which the destination MAC address in packet - * should be rewritten - * @param egressPoint to which packets should be sent - * @return the constructed MultiPointToSinglePointIntent - */ - private MultiPointToSinglePointIntent intentBuilder(IpPrefix ipPrefix, - String nextHopMacAddress, ConnectPoint egressPoint) { - - TrafficSelector.Builder selectorBuilder = - DefaultTrafficSelector.builder(); - if (ipPrefix.isIp4()) { - selectorBuilder.matchEthType(Ethernet.TYPE_IPV4); - selectorBuilder.matchIPDst(ipPrefix); - } else { - selectorBuilder.matchEthType(Ethernet.TYPE_IPV6); - selectorBuilder.matchIPv6Dst(ipPrefix); - } - - TrafficTreatment.Builder treatmentBuilder = - DefaultTrafficTreatment.builder(); - treatmentBuilder.setEthDst(MacAddress.valueOf(nextHopMacAddress)); - - Set<ConnectPoint> ingressPoints = new HashSet<>(); - for (Interface intf : interfaces) { - if (!intf.connectPoint().equals(egressPoint)) { - ConnectPoint srcPort = intf.connectPoint(); - ingressPoints.add(srcPort); - } - } - MultiPointToSinglePointIntent intent = - MultiPointToSinglePointIntent.builder() - .appId(APPID) - .key(Key.of(ipPrefix.toString(), APPID)) - .selector(selectorBuilder.build()) - .treatment(treatmentBuilder.build()) - .ingressPoints(ingressPoints) - .egressPoint(egressPoint) - .constraints(SdnIpFib.CONSTRAINTS) - .build(); - return intent; - } - - /** - * A static MultiPointToSinglePointIntent builder, the returned intent is - * equal to the input intent except that the id is different. - * - * @param intent the intent to be used for building a new intent - * @param routeEntry the relative routeEntry of the intent - * @return the newly constructed MultiPointToSinglePointIntent - * @throws TestUtilsException - */ - private MultiPointToSinglePointIntent staticIntentBuilder( - MultiPointToSinglePointIntent intent, RouteEntry routeEntry, - String nextHopMacAddress) throws TestUtilsException { - - // Use a different egress ConnectPoint with that in intent - // to generate a different id - MultiPointToSinglePointIntent intentNew = intentBuilder( - routeEntry.prefix(), nextHopMacAddress, SW2_ETH1); - TestUtils.setField(intentNew, "egressPoint", intent.egressPoint()); - TestUtils.setField(intentNew, - "ingressPoints", intent.ingressPoints()); - return intentNew; - } -} diff --git a/framework/src/onos/apps/sdnip/src/test/java/org/onosproject/sdnip/PeerConnectivityManagerTest.java b/framework/src/onos/apps/sdnip/src/test/java/org/onosproject/sdnip/PeerConnectivityManagerTest.java deleted file mode 100644 index 0dcc969d..00000000 --- a/framework/src/onos/apps/sdnip/src/test/java/org/onosproject/sdnip/PeerConnectivityManagerTest.java +++ /dev/null @@ -1,557 +0,0 @@ -/* - * Copyright 2014-2015 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.sdnip; - -import com.google.common.collect.Sets; -import org.junit.Before; -import org.junit.Ignore; -import org.junit.Test; -import org.onlab.junit.TestUtils.TestUtilsException; -import org.onlab.packet.Ethernet; -import org.onlab.packet.IPv4; -import org.onlab.packet.IpAddress; -import org.onlab.packet.IpPrefix; -import org.onlab.packet.MacAddress; -import org.onlab.packet.TpPort; -import org.onlab.packet.VlanId; -import org.onosproject.TestApplicationId; -import org.onosproject.core.ApplicationId; -import org.onosproject.incubator.net.intf.Interface; -import org.onosproject.incubator.net.intf.InterfaceService; -import org.onosproject.net.ConnectPoint; -import org.onosproject.net.DeviceId; -import org.onosproject.net.PortNumber; -import org.onosproject.net.config.NetworkConfigListener; -import org.onosproject.net.config.NetworkConfigService; -import org.onosproject.net.flow.DefaultTrafficSelector; -import org.onosproject.net.flow.DefaultTrafficTreatment; -import org.onosproject.net.flow.TrafficSelector; -import org.onosproject.net.flow.TrafficTreatment; -import org.onosproject.net.host.InterfaceIpAddress; -import org.onosproject.net.intent.AbstractIntentTest; -import org.onosproject.net.intent.Intent; -import org.onosproject.net.intent.Key; -import org.onosproject.net.intent.PointToPointIntent; -import org.onosproject.routing.IntentSynchronizationService; -import org.onosproject.routing.config.BgpConfig; -import org.onosproject.routing.config.BgpPeer; -import org.onosproject.routing.config.BgpSpeaker; -import org.onosproject.routing.config.InterfaceAddress; -import org.onosproject.routing.config.RoutingConfigurationService; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.Set; - -import static org.easymock.EasyMock.anyObject; -import static org.easymock.EasyMock.createMock; -import static org.easymock.EasyMock.expect; -import static org.easymock.EasyMock.expectLastCall; -import static org.easymock.EasyMock.replay; -import static org.easymock.EasyMock.reset; -import static org.easymock.EasyMock.verify; -import static org.onosproject.sdnip.TestIntentServiceHelper.eqExceptId; - -/** - * Unit tests for PeerConnectivityManager. - */ -public class PeerConnectivityManagerTest extends AbstractIntentTest { - - private static final ApplicationId APPID = TestApplicationId.create("foo"); - - private static final ApplicationId CONFIG_APP_ID = APPID; - - private PeerConnectivityManager peerConnectivityManager; - private IntentSynchronizationService intentSynchronizer; - private RoutingConfigurationService routingConfig; - private InterfaceService interfaceService; - private NetworkConfigService networkConfigService; - - private Set<BgpConfig.BgpSpeakerConfig> bgpSpeakers; - private Map<String, Interface> interfaces; - private Map<IpAddress, BgpPeer> peers; - - private BgpConfig bgpConfig; - - private List<PointToPointIntent> intentList; - - private final String dpid1 = "00:00:00:00:00:00:00:01"; - private final String dpid2 = "00:00:00:00:00:00:00:02"; - - private final DeviceId deviceId1 = - DeviceId.deviceId(SdnIp.dpidToUri(dpid1)); - private final DeviceId deviceId2 = - DeviceId.deviceId(SdnIp.dpidToUri(dpid2)); - - // Interfaces connected to BGP speakers - private final ConnectPoint s1Eth100 = - new ConnectPoint(deviceId1, PortNumber.portNumber(100)); - private final ConnectPoint s2Eth100 = - new ConnectPoint(deviceId2, PortNumber.portNumber(100)); - - // Interfaces connected to BGP peers - private final ConnectPoint s1Eth1 = - new ConnectPoint(deviceId1, PortNumber.portNumber(1)); - private final ConnectPoint s2Eth1 = - new ConnectPoint(deviceId2, PortNumber.portNumber(1)); - - private final TrafficTreatment noTreatment = - DefaultTrafficTreatment.emptyTreatment(); - - @Before - public void setUp() throws Exception { - super.setUp(); - routingConfig = createMock(RoutingConfigurationService.class); - interfaceService = createMock(InterfaceService.class); - networkConfigService = createMock(NetworkConfigService.class); - networkConfigService.addListener(anyObject(NetworkConfigListener.class)); - expectLastCall().anyTimes(); - bgpConfig = createMock(BgpConfig.class); - - // These will set expectations on routingConfig and interfaceService - bgpSpeakers = setUpBgpSpeakers(); - interfaces = Collections.unmodifiableMap(setUpInterfaces()); - peers = setUpPeers(); - - initPeerConnectivity(); - intentList = setUpIntentList(); - } - - /** - * Sets up BGP speakers. - * - * @return configured BGP speakers as a map from speaker name to speaker - */ - private Set<BgpConfig.BgpSpeakerConfig> setUpBgpSpeakers() { - - BgpConfig.BgpSpeakerConfig speaker1 = new BgpConfig.BgpSpeakerConfig( - Optional.empty(), - s1Eth100, Collections.singleton(IpAddress.valueOf("192.168.10.1"))); - - BgpConfig.BgpSpeakerConfig speaker2 = new BgpConfig.BgpSpeakerConfig( - Optional.empty(), - s1Eth100, Sets.newHashSet(IpAddress.valueOf("192.168.20.1"), - IpAddress.valueOf("192.168.30.1"))); - - Set<BgpConfig.BgpSpeakerConfig> bgpSpeakers = Sets.newHashSet(); - bgpSpeakers.add(speaker1); - bgpSpeakers.add(speaker2); - - return bgpSpeakers; - } - - /** - * Sets up logical interfaces, which emulate the configured interfaces - * in SDN-IP application. - * - * @return configured interfaces as a map from interface name to Interface - */ - private Map<String, Interface> setUpInterfaces() { - - Map<String, Interface> configuredInterfaces = new HashMap<>(); - - String interfaceSw1Eth1 = "s1-eth1"; - InterfaceIpAddress ia1 = - new InterfaceIpAddress(IpAddress.valueOf("192.168.10.101"), - IpPrefix.valueOf("192.168.10.0/24")); - Interface intfsw1eth1 = new Interface(s1Eth1, - Collections.singleton(ia1), - MacAddress.valueOf("00:00:00:00:00:01"), - VlanId.NONE); - - configuredInterfaces.put(interfaceSw1Eth1, intfsw1eth1); - String interfaceSw2Eth1 = "s2-eth1"; - InterfaceIpAddress ia2 = - new InterfaceIpAddress(IpAddress.valueOf("192.168.20.101"), - IpPrefix.valueOf("192.168.20.0/24")); - Interface intfsw2eth1 = new Interface(s2Eth1, - Collections.singleton(ia2), - MacAddress.valueOf("00:00:00:00:00:02"), - VlanId.NONE); - configuredInterfaces.put(interfaceSw2Eth1, intfsw2eth1); - - String interfaceSw2Eth1intf2 = "s2-eth1_2"; - InterfaceIpAddress ia3 = - new InterfaceIpAddress(IpAddress.valueOf("192.168.30.101"), - IpPrefix.valueOf("192.168.30.0/24")); - Interface intfsw2eth1intf2 = new Interface(s2Eth1, - Collections.singleton(ia3), - MacAddress.valueOf("00:00:00:00:00:03"), - VlanId.NONE); - configuredInterfaces.put(interfaceSw2Eth1intf2, intfsw2eth1intf2); - - expect(interfaceService.getInterfacesByPort(s1Eth1)) - .andReturn(Collections.singleton(intfsw1eth1)).anyTimes(); - expect(interfaceService.getInterfacesByIp(IpAddress.valueOf("192.168.10.101"))) - .andReturn(Collections.singleton(intfsw1eth1)).anyTimes(); - expect(interfaceService.getMatchingInterface(IpAddress.valueOf("192.168.10.1"))) - .andReturn(intfsw1eth1).anyTimes(); - expect(interfaceService.getInterfacesByPort(s2Eth1)) - .andReturn(Collections.singleton(intfsw2eth1)).anyTimes(); - expect(interfaceService.getInterfacesByIp(IpAddress.valueOf("192.168.20.101"))) - .andReturn(Collections.singleton(intfsw2eth1)).anyTimes(); - expect(interfaceService.getMatchingInterface(IpAddress.valueOf("192.168.20.1"))) - .andReturn(intfsw2eth1).anyTimes(); - - expect(interfaceService.getInterfacesByIp(IpAddress.valueOf("192.168.30.101"))) - .andReturn(Collections.singleton(intfsw2eth1intf2)).anyTimes(); - expect(interfaceService.getMatchingInterface(IpAddress.valueOf("192.168.30.1"))) - .andReturn(intfsw2eth1intf2).anyTimes(); - - // Non-existent interface used during one of the tests - expect(interfaceService.getInterfacesByPort(new ConnectPoint( - DeviceId.deviceId(SdnIp.dpidToUri("00:00:00:00:00:00:01:00")), - PortNumber.portNumber(1)))) - .andReturn(null).anyTimes(); - - expect(interfaceService.getInterfaces()).andReturn( - Sets.newHashSet(configuredInterfaces.values())).anyTimes(); - - return configuredInterfaces; - } - - /** - * Sets up BGP daemon peers. - * - * @return configured BGP peers as a MAP from peer IP address to BgpPeer - */ - private Map<IpAddress, BgpPeer> setUpPeers() { - - Map<IpAddress, BgpPeer> configuredPeers = new HashMap<>(); - - String peerSw1Eth1 = "192.168.10.1"; - configuredPeers.put(IpAddress.valueOf(peerSw1Eth1), - new BgpPeer(dpid1, 1, peerSw1Eth1)); - - // Two BGP peers are connected to switch 2 port 1. - String peer1Sw2Eth1 = "192.168.20.1"; - configuredPeers.put(IpAddress.valueOf(peer1Sw2Eth1), - new BgpPeer(dpid2, 1, peer1Sw2Eth1)); - - String peer2Sw2Eth1 = "192.168.30.1"; - configuredPeers.put(IpAddress.valueOf(peer2Sw2Eth1), - new BgpPeer(dpid2, 1, peer2Sw2Eth1)); - - return configuredPeers; - } - - /** - * Sets up expected point to point intent list. - * - * @return point to point intent list - */ - private List<PointToPointIntent> setUpIntentList() { - intentList = new ArrayList<>(); - - setUpBgpIntents(); - setUpIcmpIntents(); - - return intentList; - } - - /** - * Constructs a BGP intent and put it into the intentList. - * <p/> - * The purpose of this method is too simplify the setUpBgpIntents() method, - * and to make the setUpBgpIntents() easy to read. - * - * @param srcPrefix source IP prefix to match - * @param dstPrefix destination IP prefix to match - * @param srcTcpPort source TCP port to match - * @param dstTcpPort destination TCP port to match - * @param srcConnectPoint source connect point for PointToPointIntent - * @param dstConnectPoint destination connect point for PointToPointIntent - */ - private void bgpPathintentConstructor(String srcPrefix, String dstPrefix, - Short srcTcpPort, Short dstTcpPort, - ConnectPoint srcConnectPoint, ConnectPoint dstConnectPoint) { - - TrafficSelector.Builder builder = DefaultTrafficSelector.builder() - .matchEthType(Ethernet.TYPE_IPV4) - .matchIPProtocol(IPv4.PROTOCOL_TCP) - .matchIPSrc(IpPrefix.valueOf(srcPrefix)) - .matchIPDst(IpPrefix.valueOf(dstPrefix)); - - if (srcTcpPort != null) { - builder.matchTcpSrc(TpPort.tpPort(srcTcpPort)); - } - if (dstTcpPort != null) { - builder.matchTcpDst(TpPort.tpPort(dstTcpPort)); - } - - Key key = Key.of(srcPrefix.split("/")[0] + "-" + dstPrefix.split("/")[0] - + "-" + ((srcTcpPort == null) ? "dst" : "src"), APPID); - - PointToPointIntent intent = PointToPointIntent.builder() - .appId(APPID) - .key(key) - .selector(builder.build()) - .treatment(noTreatment) - .ingressPoint(srcConnectPoint) - .egressPoint(dstConnectPoint) - .build(); - - intentList.add(intent); - } - - /** - * Sets up intents for BGP paths. - */ - private void setUpBgpIntents() { - - Short bgpPort = 179; - - // Start to build intents between BGP speaker1 and BGP peer1 - bgpPathintentConstructor( - "192.168.10.101/32", "192.168.10.1/32", null, bgpPort, - s1Eth100, s1Eth1); - bgpPathintentConstructor( - "192.168.10.101/32", "192.168.10.1/32", bgpPort, null, - s1Eth100, s1Eth1); - - bgpPathintentConstructor( - "192.168.10.1/32", "192.168.10.101/32", null, bgpPort, - s1Eth1, s1Eth100); - bgpPathintentConstructor( - "192.168.10.1/32", "192.168.10.101/32", bgpPort, null, - s1Eth1, s1Eth100); - - // Start to build intents between BGP speaker1 and BGP peer2 - bgpPathintentConstructor( - "192.168.20.101/32", "192.168.20.1/32", null, bgpPort, - s1Eth100, s2Eth1); - bgpPathintentConstructor( - "192.168.20.101/32", "192.168.20.1/32", bgpPort, null, - s1Eth100, s2Eth1); - - bgpPathintentConstructor( - "192.168.20.1/32", "192.168.20.101/32", null, bgpPort, - s2Eth1, s1Eth100); - bgpPathintentConstructor( - "192.168.20.1/32", "192.168.20.101/32", bgpPort, null, - s2Eth1, s1Eth100); - - // - // Start to build intents between BGP speaker3 and BGP peer1 - bgpPathintentConstructor( - "192.168.30.101/32", "192.168.30.1/32", null, bgpPort, - s1Eth100, s2Eth1); - bgpPathintentConstructor( - "192.168.30.101/32", "192.168.30.1/32", bgpPort, null, - s1Eth100, s2Eth1); - - bgpPathintentConstructor( - "192.168.30.1/32", "192.168.30.101/32", null, bgpPort, - s2Eth1, s1Eth100); - bgpPathintentConstructor( - "192.168.30.1/32", "192.168.30.101/32", bgpPort, null, - s2Eth1, s1Eth100); - } - - /** - * Constructs a BGP intent and put it into the intentList. - * <p/> - * The purpose of this method is too simplify the setUpBgpIntents() method, - * and to make the setUpBgpIntents() easy to read. - * - * @param srcPrefix source IP prefix to match - * @param dstPrefix destination IP prefix to match - * @param srcConnectPoint source connect point for PointToPointIntent - * @param dstConnectPoint destination connect point for PointToPointIntent - */ - private void icmpPathintentConstructor(String srcPrefix, String dstPrefix, - ConnectPoint srcConnectPoint, ConnectPoint dstConnectPoint) { - - TrafficSelector selector = DefaultTrafficSelector.builder() - .matchEthType(Ethernet.TYPE_IPV4) - .matchIPProtocol(IPv4.PROTOCOL_ICMP) - .matchIPSrc(IpPrefix.valueOf(srcPrefix)) - .matchIPDst(IpPrefix.valueOf(dstPrefix)) - .build(); - - Key key = Key.of(srcPrefix.split("/")[0] + "-" + dstPrefix.split("/")[0] - + "-" + "icmp", APPID); - - PointToPointIntent intent = PointToPointIntent.builder() - .appId(APPID) - .key(key) - .selector(selector) - .treatment(noTreatment) - .ingressPoint(srcConnectPoint) - .egressPoint(dstConnectPoint) - .build(); - - intentList.add(intent); - } - - /** - * Sets up intents for ICMP paths. - */ - private void setUpIcmpIntents() { - // Start to build intents between BGP speaker1 and BGP peer1 - icmpPathintentConstructor( - "192.168.10.101/32", "192.168.10.1/32", s1Eth100, s1Eth1); - icmpPathintentConstructor( - "192.168.10.1/32", "192.168.10.101/32", s1Eth1, s1Eth100); - - // Start to build intents between BGP speaker1 and BGP peer2 - icmpPathintentConstructor( - "192.168.20.101/32", "192.168.20.1/32", s1Eth100, s2Eth1); - icmpPathintentConstructor( - "192.168.20.1/32", "192.168.20.101/32", s2Eth1, s1Eth100); - - icmpPathintentConstructor( - "192.168.30.101/32", "192.168.30.1/32", s1Eth100, s2Eth1); - icmpPathintentConstructor( - "192.168.30.1/32", "192.168.30.101/32", s2Eth1, s1Eth100); - } - - /** - * Initializes peer connectivity testing environment. - * - * @throws TestUtilsException if exceptions when using TestUtils - */ - private void initPeerConnectivity() throws TestUtilsException { - expect(routingConfig.getBgpPeers()).andReturn(peers).anyTimes(); - expect(bgpConfig.bgpSpeakers()).andReturn(bgpSpeakers).anyTimes(); - replay(bgpConfig); - expect(networkConfigService.getConfig(APPID, BgpConfig.class)) - .andReturn(bgpConfig).anyTimes(); - replay(networkConfigService); - replay(routingConfig); - replay(interfaceService); - - intentSynchronizer = createMock(IntentSynchronizationService.class); - replay(intentSynchronizer); - - peerConnectivityManager = - new PeerConnectivityManager(APPID, intentSynchronizer, - networkConfigService, - CONFIG_APP_ID, - interfaceService); - } - - /** - * Tests whether peer connectivity manager can set up correct BGP and - * ICMP intents according to specific configuration. - * <p/> - * Two tricky cases included in the configuration are: 2 peers on a same - * switch port, peer on the same switch with BGPd. - */ - @Test - public void testConnectionSetup() { - reset(intentSynchronizer); - - // Setup the expected intents - for (Intent intent : intentList) { - intentSynchronizer.submit(eqExceptId(intent)); - } - replay(intentSynchronizer); - - // Running the interface to be tested. - peerConnectivityManager.start(); - - verify(intentSynchronizer); - } - - /** - * Tests a corner case, when there are no interfaces in the configuration. - */ - @Test - public void testNullInterfaces() { - reset(interfaceService); - - expect(interfaceService.getInterfaces()).andReturn( - Sets.newHashSet()).anyTimes(); - expect(interfaceService.getInterfacesByPort(s2Eth1)) - .andReturn(Collections.emptySet()).anyTimes(); - expect(interfaceService.getInterfacesByPort(s1Eth1)) - .andReturn(Collections.emptySet()).anyTimes(); - expect(interfaceService.getInterfacesByIp(IpAddress.valueOf("192.168.10.101"))) - .andReturn(Collections.emptySet()).anyTimes(); - expect(interfaceService.getMatchingInterface(IpAddress.valueOf("192.168.10.1"))) - .andReturn(null).anyTimes(); - expect(interfaceService.getInterfacesByIp(IpAddress.valueOf("192.168.20.101"))) - .andReturn(Collections.emptySet()).anyTimes(); - expect(interfaceService.getMatchingInterface(IpAddress.valueOf("192.168.20.1"))) - .andReturn(null).anyTimes(); - expect(interfaceService.getInterfacesByIp(IpAddress.valueOf("192.168.30.101"))) - .andReturn(Collections.emptySet()).anyTimes(); - expect(interfaceService.getMatchingInterface(IpAddress.valueOf("192.168.30.1"))) - .andReturn(null).anyTimes(); - - replay(interfaceService); - - reset(intentSynchronizer); - replay(intentSynchronizer); - peerConnectivityManager.start(); - verify(intentSynchronizer); - } - - /** - * Tests a corner case, when there is no BGP speakers in the configuration. - */ - @Test - public void testNullBgpSpeakers() { - reset(routingConfig); - reset(bgpConfig); - - expect(bgpConfig.bgpSpeakers()).andReturn(Collections.emptySet()).anyTimes(); - replay(bgpConfig); - expect(routingConfig.getBgpPeers()).andReturn(peers).anyTimes(); - replay(routingConfig); - - reset(intentSynchronizer); - replay(intentSynchronizer); - peerConnectivityManager.start(); - verify(intentSynchronizer); - } - - /** - * Tests a corner case, when there is no Interface configured for one BGP - * peer. - */ - @Test - public void testNoPeerInterface() { - String peerSw100Eth1 = "192.168.200.1"; - peers.put(IpAddress.valueOf(peerSw100Eth1), - new BgpPeer("00:00:00:00:00:00:01:00", 1, peerSw100Eth1)); - testConnectionSetup(); - } - - /** - * Tests a corner case, when there is no Interface configured for one BGP - * speaker. - */ - @Ignore - @Test - public void testNoSpeakerInterface() { - BgpSpeaker bgpSpeaker100 = new BgpSpeaker( - "bgpSpeaker100", - "00:00:00:00:00:00:01:00", 100, - "00:00:00:00:01:00"); - List<InterfaceAddress> interfaceAddresses100 = new LinkedList<>(); - interfaceAddresses100.add(new InterfaceAddress(dpid1, 1, "192.168.10.201")); - interfaceAddresses100.add(new InterfaceAddress(dpid2, 1, "192.168.20.201")); - bgpSpeaker100.setInterfaceAddresses(interfaceAddresses100); - testConnectionSetup(); - } -} diff --git a/framework/src/onos/apps/sdnip/src/test/java/org/onosproject/sdnip/SdnIpFibTest.java b/framework/src/onos/apps/sdnip/src/test/java/org/onosproject/sdnip/SdnIpFibTest.java deleted file mode 100644 index 5466d520..00000000 --- a/framework/src/onos/apps/sdnip/src/test/java/org/onosproject/sdnip/SdnIpFibTest.java +++ /dev/null @@ -1,417 +0,0 @@ -/* - * Copyright 2015 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.sdnip; - -import com.google.common.collect.Sets; -import org.junit.Before; -import org.junit.Test; -import org.onlab.packet.Ethernet; -import org.onlab.packet.Ip4Address; -import org.onlab.packet.Ip4Prefix; -import org.onlab.packet.IpAddress; -import org.onlab.packet.IpPrefix; -import org.onlab.packet.MacAddress; -import org.onlab.packet.VlanId; -import org.onosproject.TestApplicationId; -import org.onosproject.core.ApplicationId; -import org.onosproject.incubator.net.intf.Interface; -import org.onosproject.incubator.net.intf.InterfaceService; -import org.onosproject.net.ConnectPoint; -import org.onosproject.net.DeviceId; -import org.onosproject.net.PortNumber; -import org.onosproject.net.flow.DefaultTrafficSelector; -import org.onosproject.net.flow.DefaultTrafficTreatment; -import org.onosproject.net.flow.TrafficSelector; -import org.onosproject.net.flow.TrafficTreatment; -import org.onosproject.net.host.InterfaceIpAddress; -import org.onosproject.net.intent.AbstractIntentTest; -import org.onosproject.net.intent.Key; -import org.onosproject.net.intent.MultiPointToSinglePointIntent; -import org.onosproject.routing.FibEntry; -import org.onosproject.routing.FibUpdate; -import org.onosproject.routing.IntentSynchronizationService; -import org.onosproject.routing.config.BgpPeer; -import org.onosproject.routing.config.RoutingConfigurationService; - -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; - -import static org.easymock.EasyMock.createMock; -import static org.easymock.EasyMock.expect; -import static org.easymock.EasyMock.replay; -import static org.easymock.EasyMock.reset; -import static org.easymock.EasyMock.verify; -import static org.onosproject.sdnip.TestIntentServiceHelper.eqExceptId; - -/** - * Unit tests for SdnIpFib. - */ -public class SdnIpFibTest extends AbstractIntentTest { - - private RoutingConfigurationService routingConfig; - private InterfaceService interfaceService; - - private static final ConnectPoint SW1_ETH1 = new ConnectPoint( - DeviceId.deviceId("of:0000000000000001"), - PortNumber.portNumber(1)); - - private static final ConnectPoint SW2_ETH1 = new ConnectPoint( - DeviceId.deviceId("of:0000000000000002"), - PortNumber.portNumber(1)); - - private static final ConnectPoint SW3_ETH1 = new ConnectPoint( - DeviceId.deviceId("of:0000000000000003"), - PortNumber.portNumber(1)); - - private static final ConnectPoint SW4_ETH1 = new ConnectPoint( - DeviceId.deviceId("of:0000000000000004"), - PortNumber.portNumber(1)); - - private SdnIpFib sdnipFib; - private IntentSynchronizationService intentSynchronizer; - private final Set<Interface> interfaces = Sets.newHashSet(); - - private static final ApplicationId APPID = TestApplicationId.create("SDNIP"); - - @Before - public void setUp() throws Exception { - super.setUp(); - - routingConfig = createMock(RoutingConfigurationService.class); - interfaceService = createMock(InterfaceService.class); - - // These will set expectations on routingConfig and interfaceService - setUpInterfaceService(); - setUpBgpPeers(); - - replay(routingConfig); - replay(interfaceService); - - intentSynchronizer = createMock(IntentSynchronizationService.class); - - sdnipFib = new SdnIpFib(APPID, interfaceService, intentSynchronizer); - } - - /** - * Sets up BGP peers in external networks. - */ - private void setUpBgpPeers() { - - Map<IpAddress, BgpPeer> peers = new HashMap<>(); - - String peerSw1Eth1 = "192.168.10.1"; - peers.put(IpAddress.valueOf(peerSw1Eth1), - new BgpPeer("00:00:00:00:00:00:00:01", 1, peerSw1Eth1)); - - // Two BGP peers are connected to switch 2 port 1. - String peer1Sw2Eth1 = "192.168.20.1"; - peers.put(IpAddress.valueOf(peer1Sw2Eth1), - new BgpPeer("00:00:00:00:00:00:00:02", 1, peer1Sw2Eth1)); - - String peer2Sw2Eth1 = "192.168.20.2"; - peers.put(IpAddress.valueOf(peer2Sw2Eth1), - new BgpPeer("00:00:00:00:00:00:00:02", 1, peer2Sw2Eth1)); - - String peer1Sw4Eth1 = "192.168.40.1"; - peers.put(IpAddress.valueOf(peer1Sw4Eth1), - new BgpPeer("00:00:00:00:00:00:00:04", 1, peer1Sw4Eth1)); - - expect(routingConfig.getBgpPeers()).andReturn(peers).anyTimes(); - } - - /** - * Sets up InterfaceService. - */ - private void setUpInterfaceService() { - Set<InterfaceIpAddress> interfaceIpAddresses1 = Sets.newHashSet(); - interfaceIpAddresses1.add(new InterfaceIpAddress( - IpAddress.valueOf("192.168.10.101"), - IpPrefix.valueOf("192.168.10.0/24"))); - Interface sw1Eth1 = new Interface(SW1_ETH1, - interfaceIpAddresses1, MacAddress.valueOf("00:00:00:00:00:01"), - VlanId.NONE); - interfaces.add(sw1Eth1); - - Set<InterfaceIpAddress> interfaceIpAddresses2 = Sets.newHashSet(); - interfaceIpAddresses2.add( - new InterfaceIpAddress(IpAddress.valueOf("192.168.20.101"), - IpPrefix.valueOf("192.168.20.0/24"))); - Interface sw2Eth1 = new Interface(SW2_ETH1, - interfaceIpAddresses2, MacAddress.valueOf("00:00:00:00:00:02"), - VlanId.NONE); - interfaces.add(sw2Eth1); - - Set<InterfaceIpAddress> interfaceIpAddresses3 = Sets.newHashSet(); - interfaceIpAddresses3.add( - new InterfaceIpAddress(IpAddress.valueOf("192.168.30.101"), - IpPrefix.valueOf("192.168.30.0/24"))); - Interface sw3Eth1 = new Interface(SW3_ETH1, - interfaceIpAddresses3, MacAddress.valueOf("00:00:00:00:00:03"), - VlanId.NONE); - interfaces.add(sw3Eth1); - - InterfaceIpAddress interfaceIpAddress4 = - new InterfaceIpAddress(IpAddress.valueOf("192.168.40.101"), - IpPrefix.valueOf("192.168.40.0/24")); - Interface sw4Eth1 = new Interface(SW4_ETH1, - Sets.newHashSet(interfaceIpAddress4), - MacAddress.valueOf("00:00:00:00:00:04"), - VlanId.vlanId((short) 1)); - - expect(interfaceService.getInterfacesByPort(SW4_ETH1)).andReturn( - Collections.singleton(sw4Eth1)).anyTimes(); - expect(interfaceService.getMatchingInterface(Ip4Address.valueOf("192.168.40.1"))) - .andReturn(sw4Eth1).anyTimes(); - - interfaces.add(sw4Eth1); - - expect(interfaceService.getInterfacesByPort(SW1_ETH1)).andReturn( - Collections.singleton(sw1Eth1)).anyTimes(); - expect(interfaceService.getMatchingInterface(Ip4Address.valueOf("192.168.10.1"))) - .andReturn(sw1Eth1).anyTimes(); - expect(interfaceService.getInterfacesByPort(SW2_ETH1)).andReturn( - Collections.singleton(sw2Eth1)).anyTimes(); - expect(interfaceService.getMatchingInterface(Ip4Address.valueOf("192.168.20.1"))) - .andReturn(sw2Eth1).anyTimes(); - expect(interfaceService.getInterfacesByPort(SW3_ETH1)).andReturn( - Collections.singleton(sw3Eth1)).anyTimes(); - expect(interfaceService.getMatchingInterface(Ip4Address.valueOf("192.168.30.1"))) - .andReturn(sw3Eth1).anyTimes(); - expect(interfaceService.getInterfaces()).andReturn(interfaces).anyTimes(); - } - - /** - * Tests adding a FIB entry to the IntentSynchronizer. - * - * We verify that the synchronizer records the correct state and that the - * correct intent is submitted to the IntentService. - */ - @Test - public void testFibAdd() { - IpPrefix prefix = Ip4Prefix.valueOf("1.1.1.0/24"); - FibEntry fibEntry = new FibEntry(prefix, - Ip4Address.valueOf("192.168.10.1"), - MacAddress.valueOf("00:00:00:00:00:01")); - - // Construct a MultiPointToSinglePointIntent intent - TrafficSelector.Builder selectorBuilder = - DefaultTrafficSelector.builder(); - selectorBuilder.matchEthType(Ethernet.TYPE_IPV4).matchIPDst( - fibEntry.prefix()); - - TrafficTreatment.Builder treatmentBuilder = - DefaultTrafficTreatment.builder(); - treatmentBuilder.setEthDst(MacAddress.valueOf("00:00:00:00:00:01")); - - Set<ConnectPoint> ingressPoints = new HashSet<>(); - ingressPoints.add(SW2_ETH1); - ingressPoints.add(SW3_ETH1); - ingressPoints.add(SW4_ETH1); - - MultiPointToSinglePointIntent intent = - MultiPointToSinglePointIntent.builder() - .appId(APPID) - .key(Key.of(prefix.toString(), APPID)) - .selector(selectorBuilder.build()) - .treatment(treatmentBuilder.build()) - .ingressPoints(ingressPoints) - .egressPoint(SW1_ETH1) - .constraints(SdnIpFib.CONSTRAINTS) - .build(); - - // Setup the expected intents - intentSynchronizer.submit(eqExceptId(intent)); - replay(intentSynchronizer); - - // Send in the UPDATE FibUpdate - FibUpdate fibUpdate = new FibUpdate(FibUpdate.Type.UPDATE, fibEntry); - sdnipFib.update(Collections.singleton(fibUpdate), Collections.emptyList()); - - verify(intentSynchronizer); - } - - /** - * Tests adding a FIB entry with to a next hop in a VLAN. - * - * We verify that the synchronizer records the correct state and that the - * correct intent is submitted to the IntentService. - */ - @Test - public void testFibAddWithVlan() { - IpPrefix prefix = Ip4Prefix.valueOf("3.3.3.0/24"); - FibEntry fibEntry = new FibEntry(prefix, - Ip4Address.valueOf("192.168.40.1"), - MacAddress.valueOf("00:00:00:00:00:04")); - - // Construct a MultiPointToSinglePointIntent intent - TrafficSelector.Builder selectorBuilder = - DefaultTrafficSelector.builder(); - selectorBuilder.matchEthType(Ethernet.TYPE_IPV4) - .matchIPDst(fibEntry.prefix()) - .matchVlanId(VlanId.ANY); - - TrafficTreatment.Builder treatmentBuilder = - DefaultTrafficTreatment.builder(); - treatmentBuilder.setEthDst(MacAddress.valueOf("00:00:00:00:00:04")) - .setVlanId(VlanId.vlanId((short) 1)); - - Set<ConnectPoint> ingressPoints = new HashSet<>(); - ingressPoints.add(SW1_ETH1); - ingressPoints.add(SW2_ETH1); - ingressPoints.add(SW3_ETH1); - - MultiPointToSinglePointIntent intent = - MultiPointToSinglePointIntent.builder() - .appId(APPID) - .key(Key.of(prefix.toString(), APPID)) - .selector(selectorBuilder.build()) - .treatment(treatmentBuilder.build()) - .ingressPoints(ingressPoints) - .egressPoint(SW4_ETH1) - .constraints(SdnIpFib.CONSTRAINTS) - .build(); - - // Setup the expected intents - intentSynchronizer.submit(eqExceptId(intent)); - - replay(intentSynchronizer); - - // Send in the UPDATE FibUpdate - FibUpdate fibUpdate = new FibUpdate(FibUpdate.Type.UPDATE, fibEntry); - sdnipFib.update(Collections.singleton(fibUpdate), Collections.emptyList()); - - verify(intentSynchronizer); - } - - /** - * Tests updating a FIB entry. - * - * We verify that the synchronizer records the correct state and that the - * correct intent is submitted to the IntentService. - */ - @Test - public void testFibUpdate() { - // Firstly add a route - testFibAdd(); - - IpPrefix prefix = Ip4Prefix.valueOf("1.1.1.0/24"); - - // Start to construct a new route entry and new intent - FibEntry fibEntryUpdate = new FibEntry(prefix, - Ip4Address.valueOf("192.168.20.1"), - MacAddress.valueOf("00:00:00:00:00:02")); - - // Construct a new MultiPointToSinglePointIntent intent - TrafficSelector.Builder selectorBuilderNew = - DefaultTrafficSelector.builder(); - selectorBuilderNew.matchEthType(Ethernet.TYPE_IPV4).matchIPDst( - fibEntryUpdate.prefix()); - - TrafficTreatment.Builder treatmentBuilderNew = - DefaultTrafficTreatment.builder(); - treatmentBuilderNew.setEthDst(MacAddress.valueOf("00:00:00:00:00:02")); - - Set<ConnectPoint> ingressPointsNew = new HashSet<>(); - ingressPointsNew.add(SW1_ETH1); - ingressPointsNew.add(SW3_ETH1); - ingressPointsNew.add(SW4_ETH1); - - MultiPointToSinglePointIntent intentNew = - MultiPointToSinglePointIntent.builder() - .appId(APPID) - .key(Key.of(prefix.toString(), APPID)) - .selector(selectorBuilderNew.build()) - .treatment(treatmentBuilderNew.build()) - .ingressPoints(ingressPointsNew) - .egressPoint(SW2_ETH1) - .constraints(SdnIpFib.CONSTRAINTS) - .build(); - - // Set up test expectation - reset(intentSynchronizer); - - // Setup the expected intents - intentSynchronizer.submit(eqExceptId(intentNew)); - replay(intentSynchronizer); - - // Send in the UPDATE FibUpdate - FibUpdate fibUpdate = new FibUpdate(FibUpdate.Type.UPDATE, - fibEntryUpdate); - sdnipFib.update(Collections.singletonList(fibUpdate), - Collections.emptyList()); - - verify(intentSynchronizer); - } - - /** - * Tests deleting a FIB entry. - * - * We verify that the synchronizer records the correct state and that the - * correct intent is withdrawn from the IntentService. - */ - @Test - public void testFibDelete() { - // Firstly add a route - testFibAdd(); - - IpPrefix prefix = Ip4Prefix.valueOf("1.1.1.0/24"); - - // Construct the existing route entry - FibEntry fibEntry = new FibEntry(prefix, null, null); - - // Construct the existing MultiPointToSinglePoint intent - TrafficSelector.Builder selectorBuilder = - DefaultTrafficSelector.builder(); - selectorBuilder.matchEthType(Ethernet.TYPE_IPV4).matchIPDst( - fibEntry.prefix()); - - TrafficTreatment.Builder treatmentBuilder = - DefaultTrafficTreatment.builder(); - treatmentBuilder.setEthDst(MacAddress.valueOf("00:00:00:00:00:01")); - - Set<ConnectPoint> ingressPoints = new HashSet<>(); - ingressPoints.add(SW2_ETH1); - ingressPoints.add(SW3_ETH1); - ingressPoints.add(SW4_ETH1); - - MultiPointToSinglePointIntent addedIntent = - MultiPointToSinglePointIntent.builder() - .appId(APPID) - .key(Key.of(prefix.toString(), APPID)) - .selector(selectorBuilder.build()) - .treatment(treatmentBuilder.build()) - .ingressPoints(ingressPoints) - .egressPoint(SW1_ETH1) - .constraints(SdnIpFib.CONSTRAINTS) - .build(); - - // Set up expectation - reset(intentSynchronizer); - // Setup the expected intents - intentSynchronizer.withdraw(eqExceptId(addedIntent)); - replay(intentSynchronizer); - - // Send in the DELETE FibUpdate - FibUpdate fibUpdate = new FibUpdate(FibUpdate.Type.DELETE, fibEntry); - sdnipFib.update(Collections.emptyList(), Collections.singletonList(fibUpdate)); - - verify(intentSynchronizer); - } -} diff --git a/framework/src/onos/apps/sdnip/src/test/java/org/onosproject/sdnip/TestIntentServiceHelper.java b/framework/src/onos/apps/sdnip/src/test/java/org/onosproject/sdnip/TestIntentServiceHelper.java deleted file mode 100644 index 4df7f9de..00000000 --- a/framework/src/onos/apps/sdnip/src/test/java/org/onosproject/sdnip/TestIntentServiceHelper.java +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Copyright 2014-2015 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.sdnip; - -import org.easymock.IArgumentMatcher; -import org.onosproject.net.intent.Intent; -import org.onosproject.net.intent.IntentUtils; - -import static org.easymock.EasyMock.reportMatcher; - -/** - * Helper class for testing operations submitted to the IntentService. - */ -public final class TestIntentServiceHelper { - /** - * Default constructor to prevent instantiation. - */ - private TestIntentServiceHelper() { - } - - /** - * Matcher method to set the expected intent to match against - * (ignoring the intent ID for the intent). - * - * @param intent the expected Intent - * @return the submitted Intent - */ - static Intent eqExceptId(Intent intent) { - reportMatcher(new IdAgnosticIntentMatcher(intent)); - return intent; - } - - /* - * EasyMock matcher that matches {@link Intent} but - * ignores the {@link IntentId} when matching. - * <p/> - * The normal intent equals method tests that the intent IDs are equal, - * however in these tests we can't know what the intent IDs will be in - * advance, so we can't set up expected intents with the correct IDs. Thus, - * the solution is to use an EasyMock matcher that verifies that all the - * value properties of the provided intent match the expected values, but - * ignores the intent ID when testing equality. - */ - private static final class IdAgnosticIntentMatcher implements - IArgumentMatcher { - - private final Intent intent; - private String providedString; - - /** - * Constructor taking the expected intent to match against. - * - * @param intent the expected intent - */ - public IdAgnosticIntentMatcher(Intent intent) { - this.intent = intent; - } - - @Override - public void appendTo(StringBuffer strBuffer) { - strBuffer.append("IntentMatcher unable to match: " - + providedString); - } - - @Override - public boolean matches(Object object) { - if (!(object instanceof Intent)) { - return false; - } - - Intent providedIntent = (Intent) object; - providedString = providedIntent.toString(); - - return IntentUtils.equals(intent, providedIntent); - } - } - -} |