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.sal.binding.api.data.RuntimeDataProvider
11 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier
12 import org.opendaylight.yangtools.yang.binding.DataObject
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.md.sal.common.api.data.DataCommitHandler.DataCommitTransaction
16 import org.opendaylight.controller.sal.binding.api.data.DataProviderService
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.config.rev130819.flows.FlowKey
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.config.rev130819.flows.Flow
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.config.rev130819.Flows
20 import org.opendaylight.controller.md.sal.common.api.data.DataChangeListener
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.config.rev130819.FlowsBuilder
22 import org.opendaylight.controller.forwardingrulesmanager.IForwardingRulesManager
23 import static com.google.common.base.Preconditions.*;
24 import static extension org.opendaylight.controller.md.frm.compatibility.FlowConfigMapping.*;
25 import static extension org.opendaylight.controller.sal.compatibility.NodeMapping.*;
26 import org.opendaylight.controller.sal.common.util.Arguments
27 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.IdentifiableItem
28 import org.opendaylight.yangtools.yang.common.RpcResult
29 import org.opendaylight.controller.forwardingrulesmanager.FlowConfig
30 import java.util.HashSet
31 import org.opendaylight.controller.sal.common.util.Rpcs
32 import java.util.Collections
33 import org.opendaylight.yangtools.yang.common.RpcError
35 class FRMRuntimeDataProvider implements RuntimeDataProvider, DataCommitHandler<InstanceIdentifier<? extends DataObject>, DataObject> {
37 static val FLOWS_PATH = InstanceIdentifier.builder(Flows).toInstance;
40 var DataProviderService dataService;
43 var DataChangeListener changeListener;
46 var IForwardingRulesManager manager;
48 FlowManagementReader configuration = new ConfigurationReader();
51 //dataService.registerDataChangeListener(FLOWS_PATH, changeListener);
52 dataService.registerCommitHandler(FLOWS_PATH, this);
55 override readConfigurationData(InstanceIdentifier<? extends DataObject> path) {
56 return readFrom(configuration, path);
59 override DataObject readOperationalData(InstanceIdentifier<? extends DataObject> path) {
60 return readFrom(configuration, path);
63 def DataObject readFrom(FlowManagementReader store, InstanceIdentifier<? extends DataObject> path) {
64 if (FLOWS_PATH == path) {
65 return store.readAllFlows();
67 if (FLOWS_PATH.contains(path)) {
68 return store.readFlow(path.toFlowKey());
73 override FlowCommitTransaction requestCommit(
74 DataModification modification) {
75 return new FlowCommitTransaction(this,modification);
78 def toFlowKey(InstanceIdentifier<? extends DataObject> identifier) {
79 checkNotNull(identifier)
80 val item = Arguments.checkInstanceOf(identifier.path.get(1),IdentifiableItem);
81 val key = Arguments.checkInstanceOf(item.key,FlowKey)
85 def RpcResult<Void> finish(FlowCommitTransaction transaction) {
86 for(flw: transaction.toRemove) {
87 manager.removeStaticFlow(flw.name,flw.node)
90 for(flw: transaction.toUpdate) {
91 manager.removeStaticFlow(flw.name,flw.node);
92 manager.addStaticFlow(flw);
95 return Rpcs.<Void>getRpcResult(true,null,Collections.<RpcError>emptySet())
98 def RpcResult<Void> rollback(FlowCommitTransaction transaction) {
99 // NOOP: We did not changed any state.
104 class ConfigurationReader implements FlowManagementReader {
107 var IForwardingRulesManager manager;
109 override Flows readAllFlows() {
110 val it = new FlowsBuilder();
111 flow = manager.staticFlows.map[
112 toConfigurationFlow();
117 override readFlow(FlowKey key) {
118 val flowCfg = manager.getStaticFlow(String.valueOf(key.id), key.node.toADNode());
119 return flowCfg.toConfigurationFlow;
123 public static class FlowCommitTransaction implements DataCommitTransaction<InstanceIdentifier<? extends DataObject>, DataObject> {
126 val DataModification<InstanceIdentifier<? extends DataObject>, DataObject> modification;
129 val FRMRuntimeDataProvider flowManager;
132 val toAdd = new HashSet<FlowConfig>();
135 var Iterable<FlowConfig> toUpdate
138 var Iterable<FlowConfig> toRemove
141 new(FRMRuntimeDataProvider flowManager,DataModification<InstanceIdentifier<? extends DataObject>, DataObject> modification) {
143 _flowManager = flowManager;
144 _modification = modification;
145 processModification();
148 override finish() throws IllegalStateException {
149 return flowManager.finish(this);
152 override rollback() throws IllegalStateException
154 return flowManager.rollback(this);
157 def processModification() {
158 val updated = modification.updatedConfigurationData.entrySet;
160 val _toUpdate = updated.filter[key.isFlowPath].map[
161 return (value as Flow).toFlowConfig
163 toUpdate = _toUpdate as Iterable<FlowConfig>
166 val _toRemove = modification.removedConfigurationData.filter[isFlowPath].map[
169 toRemove = _toRemove as Iterable<FlowConfig>