2 * Copyright (c) 2015 Juniper Networks, Inc. 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.oc;
11 import java.util.concurrent.Executors;
12 import java.util.concurrent.ScheduledExecutorService;
14 import net.juniper.contrail.api.ApiConnector;
15 import net.juniper.contrail.api.ApiConnectorFactory;
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;
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 OpenContrail
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;
48 private final ScheduledExecutorService executor;
50 private static final InstanceIdentifier<OcConfig> configIid =
51 InstanceIdentifier.builder(OcConfig.class).build();
52 private OcConfig config;
53 ListenerRegistration<DataChangeListener> configReg;
55 public OcRenderer(DataBroker dataProvider,
56 RpcProviderRegistry rpcRegistry) {
58 this.dataBroker = dataProvider;
59 apiConnector = getApiConnection();
61 int numCPU = Runtime.getRuntime().availableProcessors();
62 executor = Executors.newScheduledThreadPool(numCPU * 2);
64 l2domainManager = new L2DomainManager(dataProvider,rpcRegistry,executor);
65 policyResolver = new PolicyResolver(dataProvider, executor);
67 policyManager = new PolicyManager(dataProvider,
74 dataProvider.registerDataChangeListener(LogicalDatastoreType.CONFIGURATION,
77 DataChangeScope.SUBTREE);
79 LOG.info("Initialized OC renderer");
83 public ApiConnector getApiConnection() {
84 String ipAddress = System.getProperty("plugin2oc.apiserver.ipaddress");
85 String port = System.getProperty("plugin2oc.apiserver.port");
89 portNumber = Integer.parseInt(port.toString());
90 } catch (Exception ex) {
91 LOG.error("Missing entry in Config file of Opendaylight", ex);
93 apiConnector = ApiConnectorFactory.build(ipAddress, portNumber);
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();
109 // ******************
110 // DataChangeListener
111 // ******************
114 public void onDataChanged(AsyncDataChangeEvent<InstanceIdentifier<?>,
115 DataObject> change) {
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>>() {
129 public void onSuccess(final Optional<OcConfig> result) {
130 if (!result.isPresent()) return;
131 if (result.get() instanceof OcConfig) {
132 config = (OcConfig)result.get();
138 public void onFailure(Throwable t) {
139 LOG.error("Failed to read configuration", t);
144 private void applyConfig() {
145 policyManager.setLearningMode(config.getLearningMode());