1 package org.opendaylight.controller.md.frm.compatibility
3 import org.opendaylight.controller.sal.binding.api.data.RuntimeDataProvider
4 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier
5 import org.opendaylight.yangtools.yang.binding.DataObject
6 import org.opendaylight.controller.md.sal.common.api.data.DataCommitHandler
7 import org.opendaylight.controller.md.sal.common.api.data.DataModification
8 import org.opendaylight.controller.md.sal.common.api.data.DataCommitHandler.DataCommitTransaction
9 import org.opendaylight.controller.sal.binding.api.data.DataProviderService
10 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.config.rev130819.flows.FlowKey
11 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.config.rev130819.flows.Flow
12 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.config.rev130819.Flows
13 import org.opendaylight.controller.md.sal.common.api.data.DataChangeListener
14 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.config.rev130819.FlowsBuilder
15 import org.opendaylight.controller.forwardingrulesmanager.IForwardingRulesManager
16 import static com.google.common.base.Preconditions.*;
17 import static extension org.opendaylight.controller.md.frm.compatibility.FlowConfigMapping.*;
18 import static extension org.opendaylight.controller.sal.compatibility.NodeMapping.*;
19 import org.opendaylight.controller.sal.common.util.Arguments
20 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.IdentifiableItem
21 import org.opendaylight.yangtools.yang.common.RpcResult
22 import org.opendaylight.controller.forwardingrulesmanager.FlowConfig
23 import java.util.HashSet
24 import org.opendaylight.controller.sal.common.util.Rpcs
25 import java.util.Collections
26 import org.opendaylight.yangtools.yang.common.RpcError
28 class FRMRuntimeDataProvider implements RuntimeDataProvider, DataCommitHandler<InstanceIdentifier<? extends DataObject>, DataObject> {
30 static val FLOWS_PATH = InstanceIdentifier.builder().node(Flows).toInstance;
33 var DataProviderService dataService;
36 var DataChangeListener changeListener;
39 var IForwardingRulesManager manager;
41 FlowManagementReader configuration = new ConfigurationReader();
44 //dataService.registerDataChangeListener(FLOWS_PATH, changeListener);
45 dataService.registerCommitHandler(FLOWS_PATH, this);
48 override readConfigurationData(InstanceIdentifier<? extends DataObject> path) {
49 return readFrom(configuration, path);
52 override DataObject readOperationalData(InstanceIdentifier<? extends DataObject> path) {
53 return readFrom(configuration, path);
56 def DataObject readFrom(FlowManagementReader store, InstanceIdentifier<? extends DataObject> path) {
57 if (FLOWS_PATH == path) {
58 return store.readAllFlows();
60 if (FLOWS_PATH.contains(path)) {
61 return store.readFlow(path.toFlowKey());
66 override FlowCommitTransaction requestCommit(
67 DataModification modification) {
68 return new FlowCommitTransaction(this,modification);
71 def toFlowKey(InstanceIdentifier<? extends DataObject> identifier) {
72 checkNotNull(identifier)
73 val item = Arguments.checkInstanceOf(identifier.path.get(1),IdentifiableItem);
74 val key = Arguments.checkInstanceOf(item.key,FlowKey)
78 def RpcResult<Void> finish(FlowCommitTransaction transaction) {
79 for(flw: transaction.toRemove) {
80 manager.removeStaticFlow(flw.name,flw.node)
83 for(flw: transaction.toUpdate) {
84 manager.removeStaticFlow(flw.name,flw.node);
85 manager.addStaticFlow(flw);
88 return Rpcs.<Void>getRpcResult(true,null,Collections.<RpcError>emptySet())
91 def RpcResult<Void> rollback(FlowCommitTransaction transaction) {
92 // NOOP: We did not changed any state.
97 class ConfigurationReader implements FlowManagementReader {
100 var IForwardingRulesManager manager;
102 override Flows readAllFlows() {
103 val it = new FlowsBuilder();
104 flow = manager.staticFlows.map[
105 toConfigurationFlow();
110 override readFlow(FlowKey key) {
111 val flowCfg = manager.getStaticFlow(String.valueOf(key.id), key.node.toADNode());
112 return flowCfg.toConfigurationFlow;
116 public static class FlowCommitTransaction implements DataCommitTransaction<InstanceIdentifier<? extends DataObject>, DataObject> {
119 val DataModification<InstanceIdentifier<? extends DataObject>, DataObject> modification;
122 val FRMRuntimeDataProvider flowManager;
125 val toAdd = new HashSet<FlowConfig>();
128 var Iterable<FlowConfig> toUpdate
131 var Iterable<FlowConfig> toRemove
134 new(FRMRuntimeDataProvider flowManager,DataModification<InstanceIdentifier<? extends DataObject>, DataObject> modification) {
136 _flowManager = flowManager;
137 _modification = modification;
138 processModification();
141 override finish() throws IllegalStateException {
142 return flowManager.finish(this);
145 override rollback() throws IllegalStateException
147 return flowManager.rollback(this);
150 def processModification() {
151 val updated = modification.updatedConfigurationData.entrySet;
153 val _toUpdate = updated.filter[key.isFlowPath].map[
154 return (value as Flow).toFlowConfig
156 toUpdate = _toUpdate as Iterable<FlowConfig>
159 val _toRemove = modification.removedConfigurationData.filter[isFlowPath].map[
162 toRemove = _toRemove as Iterable<FlowConfig>