2 * Copyright (c) 2014 Cisco Systems, Inc. and others. 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
8 package org.opendaylight.controller.md.frm.compatibility;
10 import org.opendaylight.controller.forwardingrulesmanager.FlowConfig;
11 import org.opendaylight.controller.forwardingrulesmanager.IForwardingRulesManager;
12 import org.opendaylight.controller.md.sal.common.api.data.DataChangeListener;
13 import org.opendaylight.controller.md.sal.common.api.data.DataCommitHandler;
14 import org.opendaylight.controller.md.sal.common.api.data.DataModification;
15 import org.opendaylight.controller.sal.binding.api.data.DataProviderService;
16 import org.opendaylight.controller.sal.binding.api.data.RuntimeDataProvider;
17 import org.opendaylight.controller.sal.common.util.Arguments;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.config.rev130819.Flows;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.config.rev130819.flows.FlowKey;
20 import org.opendaylight.yangtools.concepts.Registration;
21 import org.opendaylight.yangtools.yang.binding.DataObject;
22 import org.opendaylight.yangtools.yang.binding.Identifier;
23 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
24 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.IdentifiableItem;
25 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.PathArgument;
26 import org.opendaylight.yangtools.yang.common.RpcResult;
27 import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
29 import com.google.common.base.Objects;
30 import com.google.common.base.Preconditions;
32 public class FRMRuntimeDataProvider implements RuntimeDataProvider, DataCommitHandler<InstanceIdentifier<? extends DataObject>,DataObject> {
34 private final static InstanceIdentifier<Flows> FLOWS_PATH = InstanceIdentifier.<Flows> builder(Flows.class).toInstance();
36 private final FlowManagementReader configuration = new ConfigurationReader();
37 private DataChangeListener<InstanceIdentifier<? extends DataObject>, DataObject> changeListener;
38 private DataProviderService dataService;
39 private IForwardingRulesManager manager;
41 public Registration init() {
42 return this.dataService.registerCommitHandler(FRMRuntimeDataProvider.FLOWS_PATH, this);
46 public DataObject readConfigurationData(final InstanceIdentifier<? extends DataObject> path) {
47 return this.readFrom(this.configuration, path);
51 public DataObject readOperationalData(final InstanceIdentifier<? extends DataObject> path) {
52 return this.readFrom(this.configuration, path);
55 public DataObject readFrom(final FlowManagementReader store, final InstanceIdentifier<? extends DataObject> path) {
56 if (Objects.equal(FRMRuntimeDataProvider.FLOWS_PATH, path)) {
57 return store.readAllFlows();
59 if (FRMRuntimeDataProvider.FLOWS_PATH.contains(path)) {
60 return store.readFlow(this.toFlowKey(path));
66 public FlowCommitTransaction requestCommit(final DataModification<InstanceIdentifier<? extends DataObject>, DataObject> modification) {
67 return new FlowCommitTransaction(this, modification);
70 public FlowKey toFlowKey(final InstanceIdentifier<? extends DataObject> identifier) {
71 Preconditions.<InstanceIdentifier<? extends DataObject>> checkNotNull(identifier);
73 Iterable<PathArgument> path = identifier.getPathArguments();
74 PathArgument get = path.iterator().next();
75 final Identifier itemKey = Arguments.<IdentifiableItem> checkInstanceOf(get, IdentifiableItem.class).getKey();
76 return Arguments.<FlowKey> checkInstanceOf(itemKey, FlowKey.class);
79 public RpcResult<Void> finish(final FlowCommitTransaction transaction) {
80 Iterable<FlowConfig> toRemove = transaction.getToRemove();
81 for (final FlowConfig flow : toRemove) {
82 this.manager.removeStaticFlow(flow.getName(), flow.getNode());
84 Iterable<FlowConfig> toUpdate = transaction.getToUpdate();
85 for (final FlowConfig flow : toUpdate) {
86 this.manager.removeStaticFlow(flow.getName(), flow.getNode());
87 this.manager.addStaticFlow(flow);
89 return RpcResultBuilder.<Void> success().build();
92 public RpcResult<Void> rollback(final FlowCommitTransaction transaction) {
96 public DataProviderService getDataService() {
97 return this.dataService;
100 public void setDataService(final DataProviderService dataService) {
101 this.dataService = dataService;
104 public DataChangeListener<InstanceIdentifier<? extends DataObject>, DataObject> getChangeListener() {
105 return this.changeListener;
108 public void setChangeListener(final DataChangeListener<InstanceIdentifier<? extends DataObject>, DataObject> changeListener) {
109 this.changeListener = changeListener;
112 public IForwardingRulesManager getManager() {
116 public void setManager(final IForwardingRulesManager manager) {
117 this.manager = manager;