diff options
author | Ashlee Young <ashlee@wildernessvoice.com> | 2015-11-12 12:46:25 -0800 |
---|---|---|
committer | Ashlee Young <ashlee@wildernessvoice.com> | 2015-11-12 12:46:25 -0800 |
commit | 03974824abae35128f53f5a4af9a4ed8f573601a (patch) | |
tree | 4f5da69f32b7ee0dfb75e827b82212bd6c82fafe /framework/src/onos/apps/sdnip | |
parent | baac58c7c50e6f89eb0520e3f5b0e83a69839bd3 (diff) |
Updating onos src up to commit id fdb426e7ca9232692b0b6c335c79fc9c5a4e341f
Change-Id: I78f29f15b39f965b61154d5f8d576ed1a9481b9b
Signed-off-by: Ashlee Young <ashlee@wildernessvoice.com>
Diffstat (limited to 'framework/src/onos/apps/sdnip')
5 files changed, 366 insertions, 0 deletions
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 new file mode 100644 index 00000000..81231ab9 --- /dev/null +++ b/framework/src/onos/apps/sdnip/src/main/java/org/onosproject/sdnip/cli/AddPeerCommand.java @@ -0,0 +1,96 @@ +/* + * 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 new file mode 100644 index 00000000..84353852 --- /dev/null +++ b/framework/src/onos/apps/sdnip/src/main/java/org/onosproject/sdnip/cli/AddSpeakerCommand.java @@ -0,0 +1,90 @@ +/* + * 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/RemovePeerCommand.java b/framework/src/onos/apps/sdnip/src/main/java/org/onosproject/sdnip/cli/RemovePeerCommand.java new file mode 100644 index 00000000..bfc6fb7b --- /dev/null +++ b/framework/src/onos/apps/sdnip/src/main/java/org/onosproject/sdnip/cli/RemovePeerCommand.java @@ -0,0 +1,81 @@ +/* + * 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 new file mode 100644 index 00000000..6a51b42f --- /dev/null +++ b/framework/src/onos/apps/sdnip/src/main/java/org/onosproject/sdnip/cli/RemoveSpeakerCommand.java @@ -0,0 +1,87 @@ +/* + * 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/resources/OSGI-INF/blueprint/shell-config.xml b/framework/src/onos/apps/sdnip/src/main/resources/OSGI-INF/blueprint/shell-config.xml index 3be1c79a..97b2f09f 100644 --- 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 @@ -19,5 +19,17 @@ <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> |