2 * Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
9 package org.opendaylight.groupbasedpolicy.renderer.ofoverlay;
11 import java.util.concurrent.Executors;
12 import java.util.concurrent.ScheduledExecutorService;
14 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
15 import org.opendaylight.controller.md.sal.binding.api.DataChangeListener;
16 import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker.DataChangeScope;
17 import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent;
18 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
19 import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry;
20 import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.node.SwitchManager;
21 import org.opendaylight.groupbasedpolicy.resolver.PolicyResolver;
22 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.MacAddress;
23 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.ofoverlay.rev140528.OfOverlayConfig;
25 import org.opendaylight.yangtools.concepts.ListenerRegistration;
26 import org.opendaylight.yangtools.yang.binding.DataObject;
27 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
28 import org.slf4j.Logger;
29 import org.slf4j.LoggerFactory;
31 import com.google.common.base.Optional;
32 import com.google.common.util.concurrent.FutureCallback;
33 import com.google.common.util.concurrent.Futures;
34 import com.google.common.util.concurrent.ListenableFuture;
37 * Renderer that uses OpenFlow and OVSDB to implement an overlay network
41 public class OFOverlayRenderer implements AutoCloseable, DataChangeListener {
42 private static final Logger LOG =
43 LoggerFactory.getLogger(OFOverlayRenderer.class);
45 private final DataBroker dataBroker;
46 private final PolicyResolver policyResolver;
47 private final SwitchManager switchManager;
48 private final EndpointManager endpointManager;
49 private final PolicyManager policyManager;
51 private final short tableOffset;
52 private final MacAddress externalRouterMac;
54 private final ScheduledExecutorService executor;
56 private static final InstanceIdentifier<OfOverlayConfig> configIid =
57 InstanceIdentifier.builder(OfOverlayConfig.class).build();
59 private OfOverlayConfig config;
60 ListenerRegistration<DataChangeListener> configReg;
62 public OFOverlayRenderer(DataBroker dataProvider,
63 RpcProviderRegistry rpcRegistry,
65 MacAddress externalRouterMac) {
67 this.dataBroker = dataProvider;
68 this.tableOffset=tableOffset;
69 this.externalRouterMac=externalRouterMac;
71 int numCPU = Runtime.getRuntime().availableProcessors();
72 //TODO: Consider moving to groupbasedpolicy-ofoverlay-config so as to be user configurable in distribution.
73 executor = Executors.newScheduledThreadPool(numCPU * 2);
75 switchManager = new SwitchManager(dataProvider);
76 endpointManager = new EndpointManager(dataProvider, rpcRegistry,
77 executor, switchManager);
78 policyResolver = new PolicyResolver(dataProvider, executor);
80 policyManager = new PolicyManager(dataProvider,
90 dataProvider.registerDataChangeListener(LogicalDatastoreType.CONFIGURATION,
93 DataChangeScope.SUBTREE);
95 LOG.info("Initialized OFOverlay renderer");
104 public void close() throws Exception {
105 executor.shutdownNow();
106 if (configReg != null) configReg.close();
107 if (policyResolver != null) policyResolver.close();
108 if (switchManager != null) switchManager.close();
109 if (endpointManager != null) endpointManager.close();
112 // ******************
113 // DataChangeListener
114 // ******************
117 public void onDataChanged(AsyncDataChangeEvent<InstanceIdentifier<?>,
118 DataObject> change) {
126 private void readConfig() {
127 ListenableFuture<Optional<OfOverlayConfig>> dao =
128 dataBroker.newReadOnlyTransaction()
129 .read(LogicalDatastoreType.CONFIGURATION, configIid);
130 Futures.addCallback(dao, new FutureCallback<Optional<OfOverlayConfig>>() {
132 public void onSuccess(final Optional<OfOverlayConfig> result) {
133 if (!result.isPresent()) return;
134 if (result.get() instanceof OfOverlayConfig) {
135 config = result.get();
141 public void onFailure(Throwable t) {
142 LOG.error("Failed to read configuration", t);
147 private void applyConfig() {
148 switchManager.setEncapsulationFormat(config.getEncapsulationFormat());
149 endpointManager.setLearningMode(config.getLearningMode());
150 policyManager.setLearningMode(config.getLearningMode());