Separating renderers into features.
[groupbasedpolicy.git] / renderers / oc / src / main / java / org / opendaylight / groupbasedpolicy / renderer / oc / OcRenderer.java
1 /*
2  * Copyright (c) 2015 Juniper Networks, Inc.  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.oc;
10
11 import java.util.concurrent.Executors;
12 import java.util.concurrent.ScheduledExecutorService;
13
14 import net.juniper.contrail.api.ApiConnector;
15 import net.juniper.contrail.api.ApiConnectorFactory;
16
17 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
18 import org.opendaylight.controller.md.sal.binding.api.DataChangeListener;
19 import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker.DataChangeScope;
20 import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent;
21 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
22 import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry;
23 import org.opendaylight.groupbasedpolicy.resolver.PolicyResolver;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.oc.rev140528.OcConfig;
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;
30
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;
35
36 /**
37  * Renderer that uses OpenContrail
38  */
39 public class OcRenderer implements AutoCloseable, DataChangeListener {
40     private static final Logger LOG =
41             LoggerFactory.getLogger(OcRenderer.class);
42     static ApiConnector apiConnector = null;
43     private final DataBroker dataBroker;
44     private final PolicyResolver policyResolver;
45     private final L2DomainManager l2domainManager;
46     private final PolicyManager policyManager;
47
48     private final ScheduledExecutorService executor;
49
50     private static final InstanceIdentifier<OcConfig> configIid =
51             InstanceIdentifier.builder(OcConfig.class).build();
52     private OcConfig config;
53     ListenerRegistration<DataChangeListener> configReg;
54
55     public OcRenderer(DataBroker dataProvider,
56                              RpcProviderRegistry rpcRegistry) {
57         super();
58         this.dataBroker = dataProvider;
59         apiConnector = getApiConnection();
60
61         int numCPU = Runtime.getRuntime().availableProcessors();
62         executor = Executors.newScheduledThreadPool(numCPU * 2);
63
64         l2domainManager = new L2DomainManager(dataProvider,rpcRegistry,executor);
65         policyResolver = new PolicyResolver(dataProvider, executor);
66
67         policyManager = new PolicyManager(dataProvider,
68                                           policyResolver,
69                                           l2domainManager,
70                                           rpcRegistry,
71                                           executor);
72
73         configReg =
74                 dataProvider.registerDataChangeListener(LogicalDatastoreType.CONFIGURATION,
75                                                         configIid,
76                                                         this,
77                                                         DataChangeScope.SUBTREE);
78         readConfig();
79         LOG.info("Initialized OC renderer");
80
81     }
82
83     public ApiConnector getApiConnection() {
84         String ipAddress = System.getProperty("plugin2oc.apiserver.ipaddress");
85         String port = System.getProperty("plugin2oc.apiserver.port");
86
87         int portNumber = 0;
88         try {
89             portNumber = Integer.parseInt(port.toString());
90         } catch (Exception ex) {
91             LOG.error("Missing entry in Config file of Opendaylight", ex);
92         }
93         apiConnector = ApiConnectorFactory.build(ipAddress, portNumber);
94         return apiConnector;
95     }
96
97     // *************
98     // AutoCloseable
99     // *************
100
101     @Override
102     public void close() throws Exception {
103         executor.shutdownNow();
104         if (configReg != null) configReg.close();
105         if (policyResolver != null) policyResolver.close();
106         if (l2domainManager != null) l2domainManager.close();
107     }
108
109     // ******************
110     // DataChangeListener
111     // ******************
112
113     @Override
114     public void onDataChanged(AsyncDataChangeEvent<InstanceIdentifier<?>,
115                                                    DataObject> change) {
116         readConfig();
117     }
118
119     // **************
120     // Implementation
121     // **************
122
123     private void readConfig() {
124         ListenableFuture<Optional<OcConfig>> dao =
125                 dataBroker.newReadOnlyTransaction()
126                     .read(LogicalDatastoreType.CONFIGURATION, configIid);
127         Futures.addCallback(dao, new FutureCallback<Optional<OcConfig>>() {
128             @Override
129             public void onSuccess(final Optional<OcConfig> result) {
130                 if (!result.isPresent()) return;
131                 if (result.get() instanceof OcConfig) {
132                     config = (OcConfig)result.get();
133                     applyConfig();
134                 }
135             }
136
137             @Override
138             public void onFailure(Throwable t) {
139                 LOG.error("Failed to read configuration", t);
140             }
141         }, executor);
142     }
143
144     private void applyConfig() {
145         policyManager.setLearningMode(config.getLearningMode());
146     }
147 }