Java tutorial
/* * Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html */ package org.opendaylight.groupbasedpolicy.renderer.apic; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import org.opendaylight.controller.md.sal.binding.api.DataBroker; import org.opendaylight.controller.md.sal.binding.api.DataChangeListener; import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker.DataChangeScope; import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent; import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry; import org.opendaylight.groupbasedpolicy.resolver.PolicyResolver; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.apic.rev140528.ApicConfig; import org.opendaylight.yangtools.concepts.ListenerRegistration; import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.google.common.base.Optional; import com.google.common.util.concurrent.FutureCallback; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; /** * Renderer that uses OpenFlow and OVSDB to implement an apic network * using Open vSwitch. * @author readams */ public class ApicRenderer implements AutoCloseable, DataChangeListener { private static final Logger LOG = LoggerFactory.getLogger(ApicRenderer.class); private final DataBroker dataBroker; private final PolicyResolver policyResolver; private final SwitchManager switchManager; private final EndpointManager endpointManager; private final PolicyManager policyManager; private final ScheduledExecutorService executor; private static final InstanceIdentifier<ApicConfig> configIid = InstanceIdentifier.builder(ApicConfig.class) .build(); private ApicConfig config; ListenerRegistration<DataChangeListener> configReg; public ApicRenderer(DataBroker dataProvider, RpcProviderRegistry rpcRegistry) { super(); this.dataBroker = dataProvider; int numCPU = Runtime.getRuntime().availableProcessors(); executor = Executors.newScheduledThreadPool(numCPU * 2); switchManager = new SwitchManager(dataProvider, executor); endpointManager = new EndpointManager(dataProvider, rpcRegistry, executor, switchManager); policyResolver = new PolicyResolver(dataProvider, executor); policyManager = new PolicyManager(dataProvider, policyResolver, switchManager, endpointManager, rpcRegistry, executor); configReg = dataProvider.registerDataChangeListener(LogicalDatastoreType.CONFIGURATION, configIid, this, DataChangeScope.SUBTREE); readConfig(); LOG.info("Initialized Apic renderer"); } // ************* // AutoCloseable // ************* @Override public void close() throws Exception { executor.shutdownNow(); if (configReg != null) configReg.close(); if (policyResolver != null) policyResolver.close(); if (switchManager != null) switchManager.close(); if (endpointManager != null) endpointManager.close(); } // ****************** // DataChangeListener // ****************** @Override public void onDataChanged(AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> change) { readConfig(); } // ************** // Implementation // ************** private void readConfig() { ListenableFuture<Optional<ApicConfig>> dao = dataBroker.newReadOnlyTransaction() .read(LogicalDatastoreType.CONFIGURATION, configIid); Futures.addCallback(dao, new FutureCallback<Optional<ApicConfig>>() { @Override public void onSuccess(final Optional<ApicConfig> result) { if (!result.isPresent()) return; if (result.get() instanceof ApicConfig) { config = (ApicConfig) result.get(); applyConfig(); } } @Override public void onFailure(Throwable t) { LOG.error("Failed to read configuration", t); } }, executor); } private void applyConfig() { switchManager.setEncapsulationFormat(config.getEncapsulationFormat()); endpointManager.setLearningMode(config.getLearningMode()); policyManager.setLearningMode(config.getLearningMode()); } }