Backed out SFC Manager.
[groupbasedpolicy.git] / renderers / ofoverlay / src / main / java / org / opendaylight / groupbasedpolicy / renderer / ofoverlay / OFOverlayRenderer.java
1 /*
2  * Copyright (c) 2014 Cisco Systems, Inc. and others.  All rights reserved.
3  *
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
7  */
8
9 package org.opendaylight.groupbasedpolicy.renderer.ofoverlay;
10
11 import java.util.concurrent.Executors;
12 import java.util.concurrent.ScheduledExecutorService;
13
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.resolver.PolicyResolver;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.ofoverlay.rev140528.OfOverlayConfig;
22 import org.opendaylight.yangtools.concepts.ListenerRegistration;
23 import org.opendaylight.yangtools.yang.binding.DataObject;
24 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
25 import org.slf4j.Logger;
26 import org.slf4j.LoggerFactory;
27
28 import com.google.common.base.Optional;
29 import com.google.common.util.concurrent.FutureCallback;
30 import com.google.common.util.concurrent.Futures;
31 import com.google.common.util.concurrent.ListenableFuture;
32
33 /**
34  * Renderer that uses OpenFlow and OVSDB to implement an overlay network
35  * using Open vSwitch.
36  * @author readams
37  */
38 public class OFOverlayRenderer implements AutoCloseable, DataChangeListener {
39     private static final Logger LOG =
40             LoggerFactory.getLogger(OFOverlayRenderer.class);
41
42     private final DataBroker dataBroker;
43     private final PolicyResolver policyResolver;
44     private final SwitchManager switchManager;
45     private final EndpointManager endpointManager;
46     private final PolicyManager policyManager;
47
48     private final ScheduledExecutorService executor;
49
50     private static final InstanceIdentifier<OfOverlayConfig> configIid =
51             InstanceIdentifier.builder(OfOverlayConfig.class).build();
52
53     private OfOverlayConfig config;
54     ListenerRegistration<DataChangeListener> configReg;
55
56     public OFOverlayRenderer(DataBroker dataProvider,
57                              RpcProviderRegistry rpcRegistry) {
58         super();
59         this.dataBroker = dataProvider;
60
61         int numCPU = Runtime.getRuntime().availableProcessors();
62         //TODO: Consider moving to groupbasedpolicy-ofoverlay-config so as to be user configurable in distribution.
63         executor = Executors.newScheduledThreadPool(numCPU * 2);
64
65         switchManager = new SwitchManager(dataProvider, executor);
66         endpointManager = new EndpointManager(dataProvider, rpcRegistry,
67                                               executor, switchManager);
68         policyResolver = new PolicyResolver(dataProvider, executor);
69
70         policyManager = new PolicyManager(dataProvider,
71                                           policyResolver,
72                                           switchManager,
73                                           endpointManager,
74                                           rpcRegistry,
75                                           executor);
76
77         configReg =
78                 dataProvider.registerDataChangeListener(LogicalDatastoreType.CONFIGURATION,
79                                                         configIid,
80                                                         this,
81                                                         DataChangeScope.SUBTREE);
82         readConfig();
83         LOG.info("Initialized OFOverlay renderer");
84
85     }
86
87     // *************
88     // AutoCloseable
89     // *************
90
91     @Override
92     public void close() throws Exception {
93         executor.shutdownNow();
94         if (configReg != null) configReg.close();
95         if (policyResolver != null) policyResolver.close();
96         if (switchManager != null) switchManager.close();
97         if (endpointManager != null) endpointManager.close();
98     }
99
100     // ******************
101     // DataChangeListener
102     // ******************
103
104     @Override
105     public void onDataChanged(AsyncDataChangeEvent<InstanceIdentifier<?>,
106                                                    DataObject> change) {
107         readConfig();
108     }
109
110     // **************
111     // Implementation
112     // **************
113
114     private void readConfig() {
115         ListenableFuture<Optional<OfOverlayConfig>> dao =
116                 dataBroker.newReadOnlyTransaction()
117                     .read(LogicalDatastoreType.CONFIGURATION, configIid);
118         Futures.addCallback(dao, new FutureCallback<Optional<OfOverlayConfig>>() {
119             @Override
120             public void onSuccess(final Optional<OfOverlayConfig> result) {
121                 if (!result.isPresent()) return;
122                 if (result.get() instanceof OfOverlayConfig) {
123                     config = (OfOverlayConfig)result.get();
124                     applyConfig();
125                 }
126             }
127
128             @Override
129             public void onFailure(Throwable t) {
130                 LOG.error("Failed to read configuration", t);
131             }
132         }, executor);
133     }
134
135     private void applyConfig() {
136         switchManager.setEncapsulationFormat(config.getEncapsulationFormat());
137         endpointManager.setLearningMode(config.getLearningMode());
138         policyManager.setLearningMode(config.getLearningMode());
139     }
140 }