From e52e67767076b29cb01939aa7bdd8fee9d205cc1 Mon Sep 17 00:00:00 2001 From: Ashlee Young Date: Fri, 23 Oct 2015 08:31:31 -0700 Subject: Update ONOS src to commit id 69b36d5d11e81e28e56b46ba44e4b8cd701c5867 Change-Id: I9c13045711dbf9c0181106b66a6bf22c72bcf330 Signed-off-by: Ashlee Young --- framework/src/onos/apps/cordvtn/pom.xml | 10 ++ .../main/java/org/onosproject/cordvtn/CordVtn.java | 143 ++++++++++++++------- .../onosproject/cordvtn/CordVtnConfigManager.java | 1 - .../java/org/onosproject/cordvtn/OvsdbNode.java | 9 ++ .../cordvtn/cli/OvsdbNodeAddCommand.java | 65 ++++++++++ .../cordvtn/cli/OvsdbNodeConnectCommand.java | 60 +++++++++ .../cordvtn/cli/OvsdbNodeDeleteCommand.java | 57 ++++++++ .../cordvtn/cli/OvsdbNodeDisconnectCommand.java | 60 +++++++++ .../cordvtn/cli/OvsdbNodeListCommand.java | 74 +++++++++++ .../org/onosproject/cordvtn/cli/package-info.java | 20 +++ .../java/org/onosproject/cordvtn/package-info.java | 20 +++ .../resources/OSGI-INF/blueprint/shell-config.xml | 35 +++++ 12 files changed, 505 insertions(+), 49 deletions(-) create mode 100644 framework/src/onos/apps/cordvtn/src/main/java/org/onosproject/cordvtn/cli/OvsdbNodeAddCommand.java create mode 100644 framework/src/onos/apps/cordvtn/src/main/java/org/onosproject/cordvtn/cli/OvsdbNodeConnectCommand.java create mode 100644 framework/src/onos/apps/cordvtn/src/main/java/org/onosproject/cordvtn/cli/OvsdbNodeDeleteCommand.java create mode 100644 framework/src/onos/apps/cordvtn/src/main/java/org/onosproject/cordvtn/cli/OvsdbNodeDisconnectCommand.java create mode 100644 framework/src/onos/apps/cordvtn/src/main/java/org/onosproject/cordvtn/cli/OvsdbNodeListCommand.java create mode 100644 framework/src/onos/apps/cordvtn/src/main/java/org/onosproject/cordvtn/cli/package-info.java create mode 100644 framework/src/onos/apps/cordvtn/src/main/java/org/onosproject/cordvtn/package-info.java create mode 100644 framework/src/onos/apps/cordvtn/src/main/resources/OSGI-INF/blueprint/shell-config.xml (limited to 'framework/src/onos/apps/cordvtn') diff --git a/framework/src/onos/apps/cordvtn/pom.xml b/framework/src/onos/apps/cordvtn/pom.xml index b8e913d4..1d96108b 100644 --- a/framework/src/onos/apps/cordvtn/pom.xml +++ b/framework/src/onos/apps/cordvtn/pom.xml @@ -54,6 +54,16 @@ onos-ovsdb-api ${project.version} + + org.onosproject + onos-cli + ${project.version} + + + org.apache.karaf.shell + org.apache.karaf.shell.console + 3.0.3 + diff --git a/framework/src/onos/apps/cordvtn/src/main/java/org/onosproject/cordvtn/CordVtn.java b/framework/src/onos/apps/cordvtn/src/main/java/org/onosproject/cordvtn/CordVtn.java index ba707800..4b28a14b 100644 --- a/framework/src/onos/apps/cordvtn/src/main/java/org/onosproject/cordvtn/CordVtn.java +++ b/framework/src/onos/apps/cordvtn/src/main/java/org/onosproject/cordvtn/CordVtn.java @@ -27,7 +27,6 @@ import org.onlab.util.KryoNamespace; import org.onosproject.cluster.ClusterService; import org.onosproject.core.ApplicationId; import org.onosproject.core.CoreService; -import org.onosproject.mastership.MastershipService; import org.onosproject.net.Device; import org.onosproject.net.DeviceId; import org.onosproject.net.Host; @@ -52,6 +51,7 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.NoSuchElementException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @@ -75,7 +75,8 @@ public class CordVtn implements CordVtnService { .register(KryoNamespaces.API) .register(DefaultOvsdbNode.class); private static final String DEFAULT_BRIDGE_NAME = "br-int"; - private static final Map VXLAN_OPTIONS = new HashMap() { + private static final String DEFAULT_TUNNEL = "vxlan"; + private static final Map DEFAULT_TUNNEL_OPTIONS = new HashMap() { { put("key", "flow"); put("local_ip", "flow"); @@ -97,9 +98,6 @@ public class CordVtn implements CordVtnService { @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) protected HostService hostService; - @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) - protected MastershipService mastershipService; - @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) protected OvsdbController controller; @@ -117,11 +115,10 @@ public class CordVtn implements CordVtnService { private final VmHandler vmHandler = new VmHandler(); private ConsistentMap nodeStore; - private ApplicationId appId; @Activate protected void activate() { - appId = coreService.registerApplication("org.onosproject.cordvtn"); + ApplicationId appId = coreService.registerApplication("org.onosproject.cordvtn"); nodeStore = storageService.consistentMapBuilder() .withSerializer(Serializer.using(NODE_SERIALIZER.build())) .withName("cordvtn-nodestore") @@ -148,38 +145,59 @@ public class CordVtn implements CordVtnService { @Override public void addNode(OvsdbNode ovsdb) { checkNotNull(ovsdb); - nodeStore.put(ovsdb.deviceId(), ovsdb); + + nodeStore.putIfAbsent(ovsdb.deviceId(), ovsdb); + + if (isNodeConnected(ovsdb)) { + init(ovsdb); + } else { + connect(ovsdb); + } } @Override public void deleteNode(OvsdbNode ovsdb) { checkNotNull(ovsdb); + if (deviceService.getDevice(ovsdb.deviceId()) != null) { + if (deviceService.isAvailable(ovsdb.deviceId())) { + log.warn("Cannot delete connected node {}", ovsdb.host()); + return; + } + } + nodeStore.remove(ovsdb.deviceId()); + } + + @Override + public void connect(OvsdbNode ovsdb) { + checkNotNull(ovsdb); + if (!nodeStore.containsKey(ovsdb.deviceId())) { + log.warn("Node {} does not exist", ovsdb.host()); return; } - // check ovsdb and integration bridge connection state first - if (isNodeConnected(ovsdb)) { - log.warn("Cannot delete connected node {}", ovsdb.host()); - } else { - nodeStore.remove(ovsdb.deviceId()); + if (!isNodeConnected(ovsdb)) { + controller.connect(ovsdb.ip(), ovsdb.port()); } } @Override - public void connect(OvsdbNode ovsdb) { + public void disconnect(OvsdbNode ovsdb) { checkNotNull(ovsdb); if (!nodeStore.containsKey(ovsdb.deviceId())) { log.warn("Node {} does not exist", ovsdb.host()); return; } - controller.connect(ovsdb.ip(), ovsdb.port()); + + if (isNodeConnected(ovsdb)) { + OvsdbClientService ovsdbClient = getOvsdbClient(ovsdb); + ovsdbClient.disconnect(); + } } - @Override - public void disconnect(OvsdbNode ovsdb) { + private void init(OvsdbNode ovsdb) { checkNotNull(ovsdb); if (!nodeStore.containsKey(ovsdb.deviceId())) { @@ -187,11 +205,16 @@ public class CordVtn implements CordVtnService { return; } - OvsdbClientService ovsdbClient = getOvsdbClient(ovsdb); - checkNotNull(ovsdbClient); + if (!isNodeConnected(ovsdb)) { + log.warn("Node {} is not connected", ovsdb.host()); + return; + } - if (ovsdbClient.isConnected()) { - ovsdbClient.disconnect(); + if (deviceService.getDevice(ovsdb.intBrId()) == null || + !deviceService.isAvailable(ovsdb.intBrId())) { + createIntegrationBridge(ovsdb); + } else if (!checkVxlanPort(ovsdb)) { + createVxlanPort(ovsdb); } } @@ -235,11 +258,45 @@ public class CordVtn implements CordVtnService { OvsdbClientService ovsdbClient = controller.getOvsdbClient( new OvsdbNodeId(ovsdb.ip(), ovsdb.port().toInt())); if (ovsdbClient == null) { - log.warn("Couldn't find ovsdb client of node {}", ovsdb.host()); + log.debug("Couldn't find ovsdb client for {}", ovsdb.host()); } return ovsdbClient; } + private void createIntegrationBridge(OvsdbNode ovsdb) { + List controllers = new ArrayList<>(); + Sets.newHashSet(clusterService.getNodes()) + .forEach(controller -> { + ControllerInfo ctrlInfo = new ControllerInfo(controller.ip(), OFPORT, "tcp"); + controllers.add(ctrlInfo); + }); + String dpid = ovsdb.intBrId().toString().substring(DPID_BEGIN); + + // TODO change to use bridge config + OvsdbClientService ovsdbClient = getOvsdbClient(ovsdb); + ovsdbClient.createBridge(DEFAULT_BRIDGE_NAME, dpid, controllers); + } + + private void createVxlanPort(OvsdbNode ovsdb) { + // TODO change to use tunnel config and tunnel description + OvsdbClientService ovsdbClient = getOvsdbClient(ovsdb); + ovsdbClient.createTunnel(DEFAULT_BRIDGE_NAME, DEFAULT_TUNNEL, + DEFAULT_TUNNEL, DEFAULT_TUNNEL_OPTIONS); + } + + private boolean checkVxlanPort(OvsdbNode ovsdb) { + // TODO change to use tunnel config + OvsdbClientService ovsdbClient = getOvsdbClient(ovsdb); + try { + ovsdbClient.getPorts().stream() + .filter(p -> p.portName().value().equals(DEFAULT_TUNNEL)) + .findFirst().get(); + } catch (NoSuchElementException e) { + return false; + } + return true; + } + private class InternalDeviceListener implements DeviceListener { @Override @@ -252,8 +309,11 @@ public class CordVtn implements CordVtnService { eventExecutor.submit(() -> handler.connected(device)); break; case DEVICE_AVAILABILITY_CHANGED: - eventExecutor.submit(() -> handler.disconnected(device)); - // TODO handle the case that the device is recovered + if (deviceService.isAvailable(device.id())) { + eventExecutor.submit(() -> handler.connected(device)); + } else { + eventExecutor.submit(() -> handler.disconnected(device)); + } break; default: break; @@ -286,20 +346,10 @@ public class CordVtn implements CordVtnService { public void connected(Device device) { log.info("Ovsdb {} is connected", device.id()); - if (!mastershipService.isLocalMaster(device.id())) { - return; - } - - // TODO change to use bridge config OvsdbNode ovsdb = getNode(device.id()); - OvsdbClientService ovsdbClient = getOvsdbClient(ovsdb); - - List controllers = new ArrayList<>(); - Sets.newHashSet(clusterService.getNodes()).forEach(controller -> - controllers.add(new ControllerInfo(controller.ip(), OFPORT, "tcp"))); - String dpid = ovsdb.intBrId().toString().substring(DPID_BEGIN); - - ovsdbClient.createBridge(DEFAULT_BRIDGE_NAME, dpid, controllers); + if (ovsdb != null) { + init(ovsdb); + } } @Override @@ -314,22 +364,19 @@ public class CordVtn implements CordVtnService { public void connected(Device device) { log.info("Integration Bridge {} is detected", device.id()); - OvsdbNode ovsdb = getNodes().stream() - .filter(node -> node.intBrId().equals(device.id())) - .findFirst().get(); - - if (ovsdb == null) { + OvsdbNode ovsdb; + try { + ovsdb = getNodes().stream() + .filter(node -> node.intBrId().equals(device.id())) + .findFirst().get(); + } catch (NoSuchElementException e) { log.warn("Couldn't find OVSDB associated with {}", device.id()); return; } - if (!mastershipService.isLocalMaster(ovsdb.deviceId())) { - return; + if (!checkVxlanPort(ovsdb)) { + createVxlanPort(ovsdb); } - - // TODO change to use tunnel config and tunnel description - OvsdbClientService ovsdbClient = getOvsdbClient(ovsdb); - ovsdbClient.createTunnel(DEFAULT_BRIDGE_NAME, "vxlan", "vxlan", VXLAN_OPTIONS); } @Override diff --git a/framework/src/onos/apps/cordvtn/src/main/java/org/onosproject/cordvtn/CordVtnConfigManager.java b/framework/src/onos/apps/cordvtn/src/main/java/org/onosproject/cordvtn/CordVtnConfigManager.java index f276c7ca..287f2a34 100644 --- a/framework/src/onos/apps/cordvtn/src/main/java/org/onosproject/cordvtn/CordVtnConfigManager.java +++ b/framework/src/onos/apps/cordvtn/src/main/java/org/onosproject/cordvtn/CordVtnConfigManager.java @@ -94,7 +94,6 @@ public class CordVtnConfigManager { DefaultOvsdbNode ovsdb = new DefaultOvsdbNode( node.host(), node.ip(), node.port(), node.bridgeId()); cordVtnService.addNode(ovsdb); - cordVtnService.connect(ovsdb); }); } diff --git a/framework/src/onos/apps/cordvtn/src/main/java/org/onosproject/cordvtn/OvsdbNode.java b/framework/src/onos/apps/cordvtn/src/main/java/org/onosproject/cordvtn/OvsdbNode.java index c5b7a078..7a9a06a6 100644 --- a/framework/src/onos/apps/cordvtn/src/main/java/org/onosproject/cordvtn/OvsdbNode.java +++ b/framework/src/onos/apps/cordvtn/src/main/java/org/onosproject/cordvtn/OvsdbNode.java @@ -19,11 +19,20 @@ import org.onlab.packet.IpAddress; import org.onlab.packet.TpPort; import org.onosproject.net.DeviceId; +import java.util.Comparator; + /** * Representation of a node with ovsdb server. */ public interface OvsdbNode { + Comparator OVSDB_NODE_COMPARATOR = new Comparator() { + @Override + public int compare(OvsdbNode ovsdb1, OvsdbNode ovsdb2) { + return ovsdb1.host().compareTo(ovsdb2.host()); + } + }; + /** * Returns the IP address of the ovsdb server. * diff --git a/framework/src/onos/apps/cordvtn/src/main/java/org/onosproject/cordvtn/cli/OvsdbNodeAddCommand.java b/framework/src/onos/apps/cordvtn/src/main/java/org/onosproject/cordvtn/cli/OvsdbNodeAddCommand.java new file mode 100644 index 00000000..88d16341 --- /dev/null +++ b/framework/src/onos/apps/cordvtn/src/main/java/org/onosproject/cordvtn/cli/OvsdbNodeAddCommand.java @@ -0,0 +1,65 @@ +/* + * 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.cordvtn.cli; + +import org.apache.karaf.shell.commands.Argument; +import org.apache.karaf.shell.commands.Command; +import org.onlab.packet.IpAddress; +import org.onlab.packet.TpPort; +import org.onosproject.cli.AbstractShellCommand; +import org.onosproject.cordvtn.CordVtnService; +import org.onosproject.cordvtn.DefaultOvsdbNode; +import org.onosproject.cordvtn.OvsdbNode; +import org.onosproject.net.DeviceId; + +import static com.google.common.base.Preconditions.checkArgument; + +/** + * Adds a new OVSDB nodes. + */ +@Command(scope = "onos", name = "ovsdb-add", + description = "Adds a new OVSDB node to cordvtn") +public class OvsdbNodeAddCommand extends AbstractShellCommand { + + @Argument(index = 0, name = "host", description = "Hostname or IP", + required = true, multiValued = false) + private String host = null; + + @Argument(index = 1, name = "address", + description = "OVSDB server listening address (ip:port)", + required = true, multiValued = false) + private String address = null; + + @Argument(index = 2, name = "bridgeId", + description = "Device ID of integration bridge", + required = true, multiValued = false) + private String bridgeId = null; + + @Override + protected void execute() { + checkArgument(address.contains(":"), "address should be ip:port format"); + checkArgument(bridgeId.startsWith("of:"), "bridgeId should be of:dpid format"); + + CordVtnService service = AbstractShellCommand.get(CordVtnService.class); + String[] ipPort = address.split(":"); + OvsdbNode ovsdb = new DefaultOvsdbNode(host, + IpAddress.valueOf(ipPort[0]), + TpPort.tpPort(Integer.parseInt(ipPort[1])), + DeviceId.deviceId(bridgeId)); + service.addNode(ovsdb); + } +} diff --git a/framework/src/onos/apps/cordvtn/src/main/java/org/onosproject/cordvtn/cli/OvsdbNodeConnectCommand.java b/framework/src/onos/apps/cordvtn/src/main/java/org/onosproject/cordvtn/cli/OvsdbNodeConnectCommand.java new file mode 100644 index 00000000..e4ca0f3c --- /dev/null +++ b/framework/src/onos/apps/cordvtn/src/main/java/org/onosproject/cordvtn/cli/OvsdbNodeConnectCommand.java @@ -0,0 +1,60 @@ +/* + * 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.cordvtn.cli; + +import org.apache.karaf.shell.commands.Argument; +import org.apache.karaf.shell.commands.Command; +import org.onosproject.cli.AbstractShellCommand; +import org.onosproject.cordvtn.CordVtnService; +import org.onosproject.cordvtn.OvsdbNode; + +import java.util.NoSuchElementException; + +/** + * Connects to OVSDBs. + */ +@Command(scope = "onos", name = "ovsdb-connect", + description = "Connects to OVSDBs") +public class OvsdbNodeConnectCommand extends AbstractShellCommand { + + @Argument(index = 0, name = "hosts", description = "Hostname(s) or IP(s)", + required = true, multiValued = true) + private String[] hosts = null; + + @Override + protected void execute() { + CordVtnService service = AbstractShellCommand.get(CordVtnService.class); + + for (String host : hosts) { + OvsdbNode ovsdb; + try { + ovsdb = service.getNodes().stream() + .filter(node -> node.host().equals(host)) + .findFirst().get(); + } catch (NoSuchElementException e) { + print("Unable to find %s", host); + continue; + } + + if (service.isNodeConnected(ovsdb)) { + print("OVSDB %s is already in connected state, do nothing", host); + } else { + service.connect(ovsdb); + } + } + } +} diff --git a/framework/src/onos/apps/cordvtn/src/main/java/org/onosproject/cordvtn/cli/OvsdbNodeDeleteCommand.java b/framework/src/onos/apps/cordvtn/src/main/java/org/onosproject/cordvtn/cli/OvsdbNodeDeleteCommand.java new file mode 100644 index 00000000..a500d0d8 --- /dev/null +++ b/framework/src/onos/apps/cordvtn/src/main/java/org/onosproject/cordvtn/cli/OvsdbNodeDeleteCommand.java @@ -0,0 +1,57 @@ +/* + * 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.cordvtn.cli; + +import org.apache.karaf.shell.commands.Argument; +import org.apache.karaf.shell.commands.Command; +import org.onosproject.cli.AbstractShellCommand; +import org.onosproject.cordvtn.CordVtnService; +import org.onosproject.cordvtn.OvsdbNode; + +import java.util.NoSuchElementException; + +/** + * Deletes OVSDB nodes from cordvtn. + */ +@Command(scope = "onos", name = "ovsdb-delete", + description = "Deletes OVSDB nodes from cordvtn") +public class OvsdbNodeDeleteCommand extends AbstractShellCommand { + + @Argument(index = 0, name = "hosts", description = "Hostname(s) or IP(s)", + required = true, multiValued = true) + private String[] hosts = null; + + @Override + protected void execute() { + CordVtnService service = AbstractShellCommand.get(CordVtnService.class); + + for (String host : hosts) { + OvsdbNode ovsdb; + try { + ovsdb = service.getNodes().stream() + .filter(node -> node.host().equals(host)) + .findFirst().get(); + + } catch (NoSuchElementException e) { + print("Unable to find %s", host); + continue; + } + + service.deleteNode(ovsdb); + } + } +} diff --git a/framework/src/onos/apps/cordvtn/src/main/java/org/onosproject/cordvtn/cli/OvsdbNodeDisconnectCommand.java b/framework/src/onos/apps/cordvtn/src/main/java/org/onosproject/cordvtn/cli/OvsdbNodeDisconnectCommand.java new file mode 100644 index 00000000..14e44e08 --- /dev/null +++ b/framework/src/onos/apps/cordvtn/src/main/java/org/onosproject/cordvtn/cli/OvsdbNodeDisconnectCommand.java @@ -0,0 +1,60 @@ +/* + * 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.cordvtn.cli; + +import org.apache.karaf.shell.commands.Argument; +import org.apache.karaf.shell.commands.Command; +import org.onosproject.cli.AbstractShellCommand; +import org.onosproject.cordvtn.CordVtnService; +import org.onosproject.cordvtn.OvsdbNode; + +import java.util.NoSuchElementException; + +/** + * Disconnects OVSDBs. + */ +@Command(scope = "onos", name = "ovsdb-disconnect", + description = "Disconnects OVSDBs") +public class OvsdbNodeDisconnectCommand extends AbstractShellCommand { + + @Argument(index = 0, name = "hosts", description = "Hostname(s) or IP(s)", + required = true, multiValued = true) + private String[] hosts = null; + + @Override + protected void execute() { + CordVtnService service = AbstractShellCommand.get(CordVtnService.class); + + for (String host : hosts) { + OvsdbNode ovsdb; + try { + ovsdb = service.getNodes().stream() + .filter(node -> node.host().equals(host)) + .findFirst().get(); + } catch (NoSuchElementException e) { + print("Unable to find %s", host); + continue; + } + + if (!service.isNodeConnected(ovsdb)) { + print("OVSDB %s is already in disconnected state, do nothing", host); + } else { + service.disconnect(ovsdb); + } + } + } +} diff --git a/framework/src/onos/apps/cordvtn/src/main/java/org/onosproject/cordvtn/cli/OvsdbNodeListCommand.java b/framework/src/onos/apps/cordvtn/src/main/java/org/onosproject/cordvtn/cli/OvsdbNodeListCommand.java new file mode 100644 index 00000000..7d125ca6 --- /dev/null +++ b/framework/src/onos/apps/cordvtn/src/main/java/org/onosproject/cordvtn/cli/OvsdbNodeListCommand.java @@ -0,0 +1,74 @@ +/* + * 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.cordvtn.cli; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.node.ArrayNode; +import org.apache.karaf.shell.commands.Command; +import org.onosproject.cli.AbstractShellCommand; +import org.onosproject.cordvtn.CordVtnService; +import org.onosproject.cordvtn.OvsdbNode; + +import java.util.Collections; +import java.util.List; + +/** + * Lists all OVSDB nodes. + */ +@Command(scope = "onos", name = "ovsdbs", + description = "Lists all OVSDB nodes registered in cordvtn application") +public class OvsdbNodeListCommand extends AbstractShellCommand { + + @Override + protected void execute() { + CordVtnService service = AbstractShellCommand.get(CordVtnService.class); + List ovsdbs = service.getNodes(); + Collections.sort(ovsdbs, OvsdbNode.OVSDB_NODE_COMPARATOR); + + if (outputJson()) { + print("%s", json(service, ovsdbs)); + } else { + for (OvsdbNode ovsdb : ovsdbs) { + print("host=%s, address=%s, br-int=%s, state=%s", + ovsdb.host(), + ovsdb.ip().toString() + ":" + ovsdb.port().toString(), + ovsdb.intBrId().toString(), + getState(service, ovsdb)); + } + print("Total %s nodes", service.getNodeCount()); + } + } + + private JsonNode json(CordVtnService service, List ovsdbs) { + ObjectMapper mapper = new ObjectMapper(); + ArrayNode result = mapper.createArrayNode(); + for (OvsdbNode ovsdb : ovsdbs) { + String ipPort = ovsdb.ip().toString() + ":" + ovsdb.port().toString(); + result.add(mapper.createObjectNode() + .put("host", ovsdb.host()) + .put("address", ipPort) + .put("brInt", ovsdb.intBrId().toString()) + .put("state", getState(service, ovsdb))); + } + return result; + } + + private String getState(CordVtnService service, OvsdbNode ovsdb) { + return service.isNodeConnected(ovsdb) ? "CONNECTED" : "DISCONNECTED"; + } +} diff --git a/framework/src/onos/apps/cordvtn/src/main/java/org/onosproject/cordvtn/cli/package-info.java b/framework/src/onos/apps/cordvtn/src/main/java/org/onosproject/cordvtn/cli/package-info.java new file mode 100644 index 00000000..686172ce --- /dev/null +++ b/framework/src/onos/apps/cordvtn/src/main/java/org/onosproject/cordvtn/cli/package-info.java @@ -0,0 +1,20 @@ +/* + * 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. + */ + +/** + * Console commands to manage OVSDB nodes for cordvtn. + */ +package org.onosproject.cordvtn.cli; \ No newline at end of file diff --git a/framework/src/onos/apps/cordvtn/src/main/java/org/onosproject/cordvtn/package-info.java b/framework/src/onos/apps/cordvtn/src/main/java/org/onosproject/cordvtn/package-info.java new file mode 100644 index 00000000..1c13737f --- /dev/null +++ b/framework/src/onos/apps/cordvtn/src/main/java/org/onosproject/cordvtn/package-info.java @@ -0,0 +1,20 @@ +/* + * 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. + */ + +/** + * Application for provisioning virtual tenant networks. + */ +package org.onosproject.cordvtn; \ No newline at end of file diff --git a/framework/src/onos/apps/cordvtn/src/main/resources/OSGI-INF/blueprint/shell-config.xml b/framework/src/onos/apps/cordvtn/src/main/resources/OSGI-INF/blueprint/shell-config.xml new file mode 100644 index 00000000..6e172387 --- /dev/null +++ b/framework/src/onos/apps/cordvtn/src/main/resources/OSGI-INF/blueprint/shell-config.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + -- cgit 1.2.3-korg