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 java.util.Collections;
12 import org.opendaylight.controller.forwardingrulesmanager.FlowConfig;
13 import org.opendaylight.controller.forwardingrulesmanager.IForwardingRulesManager;
14 import org.opendaylight.controller.md.sal.common.api.data.DataChangeListener;
15 import org.opendaylight.controller.md.sal.common.api.data.DataCommitHandler;
16 import org.opendaylight.controller.md.sal.common.api.data.DataModification;
17 import org.opendaylight.controller.sal.binding.api.data.DataProviderService;
18 import org.opendaylight.controller.sal.binding.api.data.RuntimeDataProvider;
19 import org.opendaylight.controller.sal.common.util.Arguments;
20 import org.opendaylight.controller.sal.common.util.Rpcs;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.config.rev130819.Flows;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.config.rev130819.flows.FlowKey;
23 import org.opendaylight.yangtools.concepts.Registration;
24 import org.opendaylight.yangtools.yang.binding.DataObject;
25 import org.opendaylight.yangtools.yang.binding.Identifier;
26 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
27 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.IdentifiableItem;
28 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.PathArgument;
29 import org.opendaylight.yangtools.yang.common.RpcError;
30 import org.opendaylight.yangtools.yang.common.RpcResult;
32 import com.google.common.base.Objects;
33 import com.google.common.base.Preconditions;
35 public class FRMRuntimeDataProvider implements RuntimeDataProvider, DataCommitHandler<InstanceIdentifier<? extends DataObject>,DataObject> {
37 private final static InstanceIdentifier<Flows> FLOWS_PATH = InstanceIdentifier.<Flows> builder(Flows.class).toInstance();
39 private final FlowManagementReader configuration = new ConfigurationReader();
40 private DataChangeListener<InstanceIdentifier<? extends DataObject>, DataObject> changeListener;
41 private DataProviderService dataService;
42 private IForwardingRulesManager manager;
44 public Registration<DataCommitHandler<InstanceIdentifier<? extends DataObject>, DataObject>> init() {
45 return this.dataService.registerCommitHandler(FRMRuntimeDataProvider.FLOWS_PATH, this);
49 public DataObject readConfigurationData(final InstanceIdentifier<? extends DataObject> path) {
50 return this.readFrom(this.configuration, path);
54 public DataObject readOperationalData(final InstanceIdentifier<? extends DataObject> path) {
55 return this.readFrom(this.configuration, path);
58 public DataObject readFrom(final FlowManagementReader store, final InstanceIdentifier<? extends DataObject> path) {
59 if (Objects.equal(FRMRuntimeDataProvider.FLOWS_PATH, path)) {
60 return store.readAllFlows();
62 if (FRMRuntimeDataProvider.FLOWS_PATH.contains(path)) {
63 return store.readFlow(this.toFlowKey(path));
69 public FlowCommitTransaction requestCommit(final DataModification<InstanceIdentifier<? extends DataObject>, DataObject> modification) {
70 return new FlowCommitTransaction(this, modification);
73 public FlowKey toFlowKey(final InstanceIdentifier<? extends DataObject> identifier) {
74 Preconditions.<InstanceIdentifier<? extends DataObject>> checkNotNull(identifier);
76 Iterable<PathArgument> path = identifier.getPathArguments();
77 PathArgument get = path.iterator().next();
78 final Identifier itemKey = Arguments.<IdentifiableItem> checkInstanceOf(get, IdentifiableItem.class).getKey();
79 return Arguments.<FlowKey> checkInstanceOf(itemKey, FlowKey.class);
82 public RpcResult<Void> finish(final FlowCommitTransaction transaction) {
83 Iterable<FlowConfig> toRemove = transaction.getToRemove();
84 for (final FlowConfig flow : toRemove) {
85 this.manager.removeStaticFlow(flow.getName(), flow.getNode());
87 Iterable<FlowConfig> toUpdate = transaction.getToUpdate();
88 for (final FlowConfig flow : toUpdate) {
89 this.manager.removeStaticFlow(flow.getName(), flow.getNode());
90 this.manager.addStaticFlow(flow);
92 return Rpcs.<Void> getRpcResult(true, null, Collections.<RpcError> emptySet());
95 public RpcResult<Void> rollback(final FlowCommitTransaction transaction) {
99 public DataProviderService getDataService() {
100 return this.dataService;
103 public void setDataService(final DataProviderService dataService) {
104 this.dataService = dataService;
107 public DataChangeListener<InstanceIdentifier<? extends DataObject>, DataObject> getChangeListener() {
108 return this.changeListener;
111 public void setChangeListener(final DataChangeListener<InstanceIdentifier<? extends DataObject>, DataObject> changeListener) {
112 this.changeListener = changeListener;
115 public IForwardingRulesManager getManager() {
119 public void setManager(final IForwardingRulesManager manager) {
120 this.manager = manager;