diff options
author | 2015-10-09 18:32:44 -0700 | |
---|---|---|
committer | 2015-10-09 18:32:44 -0700 | |
commit | 6a07d2d622eaa06953f3353e39c080984076e8de (patch) | |
tree | bfb50a2090fce186c2cc545a400c969bf2ea702b /framework/src/onos/apps/cordvtn/src/main/java/org/onosproject/cordvtn/CordVtn.java | |
parent | e6d71622143ff9b2421a1abbe8434b954b5b1099 (diff) |
Updated master to commit id 6ee8aa3e67ce89908a8c93aa9445c6f71a18f986
Change-Id: I94b055ee2f298daf71e2ec794fd0f2495bd8081f
Diffstat (limited to 'framework/src/onos/apps/cordvtn/src/main/java/org/onosproject/cordvtn/CordVtn.java')
-rw-r--r-- | framework/src/onos/apps/cordvtn/src/main/java/org/onosproject/cordvtn/CordVtn.java | 178 |
1 files changed, 59 insertions, 119 deletions
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 072254de..cb8acab2 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 @@ -21,24 +21,11 @@ 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.onlab.packet.IpAddress; -import org.onlab.packet.TpPort; import org.onlab.util.KryoNamespace; -import org.onosproject.cluster.ClusterService; -import org.onosproject.cluster.LeadershipEvent; -import org.onosproject.cluster.LeadershipEventListener; -import org.onosproject.cluster.LeadershipService; -import org.onosproject.cluster.NodeId; -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; -import org.onosproject.net.config.ConfigFactory; -import org.onosproject.net.config.NetworkConfigRegistry; -import org.onosproject.net.config.NetworkConfigService; -import org.onosproject.net.config.basics.SubjectFactories; import org.onosproject.net.device.DeviceEvent; import org.onosproject.net.device.DeviceListener; import org.onosproject.net.device.DeviceService; @@ -57,11 +44,15 @@ import java.util.concurrent.Executors; import java.util.stream.Collectors; import static org.onlab.util.Tools.groupedThreads; +import static org.onosproject.cordvtn.OvsdbNode.State; import static org.onosproject.cordvtn.OvsdbNode.State.INIT; +import static org.onosproject.cordvtn.OvsdbNode.State.DISCONNECT; +import static org.onosproject.net.Device.Type.SWITCH; import static org.slf4j.LoggerFactory.getLogger; /** - * CORD VTN Application that provisions overlay virtual tenant networks. + * Provides initial setup or cleanup for provisioning virtual tenant networks + * on ovsdb, integration bridge and vm when they are added or deleted. */ @Component(immediate = true) @Service @@ -69,6 +60,11 @@ public class CordVtn implements CordVtnService { protected final Logger log = getLogger(getClass()); + private static final int NUM_THREADS = 1; + private static final KryoNamespace.Builder NODE_SERIALIZER = KryoNamespace.newBuilder() + .register(KryoNamespaces.API) + .register(OvsdbNode.class); + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) protected CoreService coreService; @@ -79,112 +75,81 @@ public class CordVtn implements CordVtnService { protected LogicalClockService clockService; @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) - protected ClusterService clusterService; - - @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) - protected LeadershipService leadershipService; - - @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) - protected NetworkConfigService configService; - - @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) - protected NetworkConfigRegistry configRegistry; - - @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) protected DeviceService deviceService; @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) protected HostService hostService; - @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) - protected MastershipService mastershipService; - - private static final int DEFAULT_NUM_THREADS = 1; - private static final KryoNamespace.Builder NODE_SERIALIZER = KryoNamespace.newBuilder() - .register(KryoNamespaces.API) - .register(OvsdbNode.class); + private final ExecutorService eventExecutor = Executors + .newFixedThreadPool(NUM_THREADS, groupedThreads("onos/cordvtn", "event-handler")); - private final ExecutorService eventExecutor = Executors.newFixedThreadPool( - DEFAULT_NUM_THREADS, groupedThreads("onos/cordvtn", "event-handler")); - - private final LeadershipEventListener leadershipListener = new InternalLeadershipListener(); private final DeviceListener deviceListener = new InternalDeviceListener(); private final HostListener hostListener = new InternalHostListener(); - private final NodeHandler nodeHandler = new NodeHandler(); + + private final OvsdbHandler ovsdbHandler = new OvsdbHandler(); private final BridgeHandler bridgeHandler = new BridgeHandler(); - private final VirtualMachineHandler vmHandler = new VirtualMachineHandler(); - - private final ConfigFactory configFactory = - new ConfigFactory(SubjectFactories.APP_SUBJECT_FACTORY, CordVtnConfig.class, "cordvtn") { - @Override - public CordVtnConfig createConfig() { - return new CordVtnConfig(); - } - }; - - private ApplicationId appId; - private NodeId local; + private final VmHandler vmHandler = new VmHandler(); + private EventuallyConsistentMap<DeviceId, OvsdbNode> nodeStore; - private NodeConnectionManager nodeConnectionManager; @Activate protected void activate() { - appId = coreService.registerApplication("org.onosproject.cordvtn"); - - local = clusterService.getLocalNode().id(); + coreService.registerApplication("org.onosproject.cordvtn"); nodeStore = storageService.<DeviceId, OvsdbNode>eventuallyConsistentMapBuilder() .withName("cordvtn-nodestore") .withSerializer(NODE_SERIALIZER) .withTimestampProvider((k, v) -> clockService.getTimestamp()) .build(); - configRegistry.registerConfigFactory(configFactory); deviceService.addListener(deviceListener); hostService.addListener(hostListener); - leadershipService.addListener(leadershipListener); - leadershipService.runForLeadership(appId.name()); - nodeConnectionManager = new NodeConnectionManager(appId, local, nodeStore, - mastershipService, leadershipService); - nodeConnectionManager.start(); + log.info("Started"); } @Deactivate protected void deactivate() { - nodeConnectionManager.stop(); - leadershipService.removeListener(leadershipListener); - leadershipService.withdraw(appId.name()); deviceService.removeListener(deviceListener); hostService.removeListener(hostListener); + eventExecutor.shutdown(); nodeStore.destroy(); - configRegistry.unregisterConfigFactory(configFactory); + log.info("Stopped"); } @Override - public void addNode(String hostname, IpAddress ip, TpPort port) { - DefaultOvsdbNode node = new DefaultOvsdbNode(hostname, ip, port, DeviceId.NONE, INIT); - - if (nodeStore.containsKey(node.deviceId())) { - log.warn("Node {} with ovsdb-server {}:{} already exists", hostname, ip, port); + public void addNode(OvsdbNode ovsdbNode) { + if (nodeStore.containsKey(ovsdbNode.deviceId())) { + log.warn("Node {} already exists", ovsdbNode.host()); return; } - nodeStore.put(node.deviceId(), node); - log.info("New node {} with ovsdb-server {}:{} has been added", hostname, ip, port); + nodeStore.put(ovsdbNode.deviceId(), ovsdbNode); + if (ovsdbNode.state() != INIT) { + updateNode(ovsdbNode, INIT); + } } @Override - public void deleteNode(IpAddress ip, TpPort port) { - DeviceId deviceId = DeviceId.deviceId("ovsdb:" + ip + ":" + port); - OvsdbNode node = nodeStore.get(deviceId); + public void deleteNode(OvsdbNode ovsdbNode) { + if (!nodeStore.containsKey(ovsdbNode.deviceId())) { + log.warn("Node {} does not exist", ovsdbNode.host()); + return; + } + updateNode(ovsdbNode, DISCONNECT); + } - if (node == null) { - log.warn("Node with ovsdb-server on {}:{} does not exist", ip, port); + @Override + public void updateNode(OvsdbNode ovsdbNode, State state) { + if (!nodeStore.containsKey(ovsdbNode.deviceId())) { + log.warn("Node {} does not exist", ovsdbNode.host()); return; } - nodeConnectionManager.disconnectNode(node); - nodeStore.remove(node.deviceId()); + DefaultOvsdbNode updatedNode = new DefaultOvsdbNode(ovsdbNode.host(), + ovsdbNode.ip(), + ovsdbNode.port(), + state); + nodeStore.put(ovsdbNode.deviceId(), updatedNode); } @Override @@ -193,58 +158,33 @@ public class CordVtn implements CordVtnService { } @Override + public OvsdbNode getNode(DeviceId deviceId) { + return nodeStore.get(deviceId); + } + + @Override public List<OvsdbNode> getNodes() { return nodeStore.values() .stream() .collect(Collectors.toList()); } - private void initialSetup() { - // Read ovsdb nodes from network config - CordVtnConfig config = configService.getConfig(appId, CordVtnConfig.class); - if (config == null) { - log.warn("No configuration found"); - return; - } - config.ovsdbNodes().forEach( - node -> addNode(node.hostname(), node.ip(), node.port())); - } - - private synchronized void processLeadershipChange(NodeId leader) { - // Only the leader performs the initial setup - if (leader == null || !leader.equals(local)) { - return; - } - initialSetup(); - } - - private class InternalLeadershipListener implements LeadershipEventListener { - - @Override - public void event(LeadershipEvent event) { - if (event.subject().topic().equals(appId.name())) { - processLeadershipChange(event.subject().leader()); - } - } - } - private class InternalDeviceListener implements DeviceListener { @Override public void event(DeviceEvent event) { Device device = event.subject(); - ConnectionHandler handler = - (device.type() == Device.Type.CONTROLLER ? nodeHandler : bridgeHandler); + ConnectionHandler handler = (device.type() == SWITCH ? bridgeHandler : ovsdbHandler); switch (event.type()) { - case DEVICE_ADDED: - eventExecutor.submit(() -> handler.connected(device)); - break; - case DEVICE_AVAILABILITY_CHANGED: - eventExecutor.submit(() -> handler.disconnected(device)); - break; - default: - break; + case DEVICE_ADDED: + eventExecutor.submit(() -> handler.connected(device)); + break; + case DEVICE_AVAILABILITY_CHANGED: + eventExecutor.submit(() -> handler.disconnected(device)); + break; + default: + break; } } } @@ -268,7 +208,7 @@ public class CordVtn implements CordVtnService { } } - private class NodeHandler implements ConnectionHandler<Device> { + private class OvsdbHandler implements ConnectionHandler<Device> { @Override public void connected(Device device) { @@ -296,7 +236,7 @@ public class CordVtn implements CordVtnService { } } - private class VirtualMachineHandler implements ConnectionHandler<Host> { + private class VmHandler implements ConnectionHandler<Host> { @Override public void connected(Host host) { |