/** * 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.controller.md.frm.compatibility; import org.opendaylight.controller.forwardingrulesmanager.FlowConfig; import org.opendaylight.controller.forwardingrulesmanager.IForwardingRulesManager; import org.opendaylight.controller.md.sal.common.api.data.DataChangeListener; import org.opendaylight.controller.md.sal.common.api.data.DataCommitHandler; import org.opendaylight.controller.md.sal.common.api.data.DataModification; import org.opendaylight.controller.sal.binding.api.data.DataProviderService; import org.opendaylight.controller.sal.binding.api.data.RuntimeDataProvider; import org.opendaylight.controller.sal.common.util.Arguments; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.config.rev130819.Flows; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.config.rev130819.flows.FlowKey; import org.opendaylight.yangtools.concepts.Registration; import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.binding.Identifier; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.IdentifiableItem; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.PathArgument; import org.opendaylight.yangtools.yang.common.RpcResult; import org.opendaylight.yangtools.yang.common.RpcResultBuilder; import com.google.common.base.Objects; import com.google.common.base.Preconditions; public class FRMRuntimeDataProvider implements RuntimeDataProvider, DataCommitHandler,DataObject> { private final static InstanceIdentifier FLOWS_PATH = InstanceIdentifier. builder(Flows.class).toInstance(); private final FlowManagementReader configuration = new ConfigurationReader(); private DataChangeListener, DataObject> changeListener; private DataProviderService dataService; private IForwardingRulesManager manager; public Registration, DataObject>> init() { return this.dataService.registerCommitHandler(FRMRuntimeDataProvider.FLOWS_PATH, this); } @Override public DataObject readConfigurationData(final InstanceIdentifier path) { return this.readFrom(this.configuration, path); } @Override public DataObject readOperationalData(final InstanceIdentifier path) { return this.readFrom(this.configuration, path); } public DataObject readFrom(final FlowManagementReader store, final InstanceIdentifier path) { if (Objects.equal(FRMRuntimeDataProvider.FLOWS_PATH, path)) { return store.readAllFlows(); } if (FRMRuntimeDataProvider.FLOWS_PATH.contains(path)) { return store.readFlow(this.toFlowKey(path)); } return null; } @Override public FlowCommitTransaction requestCommit(final DataModification, DataObject> modification) { return new FlowCommitTransaction(this, modification); } public FlowKey toFlowKey(final InstanceIdentifier identifier) { Preconditions.> checkNotNull(identifier); Iterable path = identifier.getPathArguments(); PathArgument get = path.iterator().next(); final Identifier itemKey = Arguments. checkInstanceOf(get, IdentifiableItem.class).getKey(); return Arguments. checkInstanceOf(itemKey, FlowKey.class); } public RpcResult finish(final FlowCommitTransaction transaction) { Iterable toRemove = transaction.getToRemove(); for (final FlowConfig flow : toRemove) { this.manager.removeStaticFlow(flow.getName(), flow.getNode()); } Iterable toUpdate = transaction.getToUpdate(); for (final FlowConfig flow : toUpdate) { this.manager.removeStaticFlow(flow.getName(), flow.getNode()); this.manager.addStaticFlow(flow); } return RpcResultBuilder. success().build(); } public RpcResult rollback(final FlowCommitTransaction transaction) { return null; } public DataProviderService getDataService() { return this.dataService; } public void setDataService(final DataProviderService dataService) { this.dataService = dataService; } public DataChangeListener, DataObject> getChangeListener() { return this.changeListener; } public void setChangeListener(final DataChangeListener, DataObject> changeListener) { this.changeListener = changeListener; } public IForwardingRulesManager getManager() { return this.manager; } public void setManager(final IForwardingRulesManager manager) { this.manager = manager; } }