BUG-634: introduce netty ChannelFactory wrapper
[controller.git] / opendaylight / md-sal / compatibility / flow-management-compatibility / src / main / java / org / opendaylight / controller / md / frm / compatibility / FRMRuntimeDataProvider.xtend
1 /*
2  * Copyright (c) 2014 Cisco Systems, Inc. and others.  All rights reserved.
3  *
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
7  */
8 package org.opendaylight.controller.md.frm.compatibility
9
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
34
35 class FRMRuntimeDataProvider implements RuntimeDataProvider, DataCommitHandler<InstanceIdentifier<? extends DataObject>, DataObject> {
36
37     static val FLOWS_PATH = InstanceIdentifier.builder(Flows).toInstance;
38
39     @Property
40     var DataProviderService dataService;
41
42     @Property
43     var DataChangeListener changeListener;
44     
45     @Property
46     var IForwardingRulesManager manager;
47
48     FlowManagementReader configuration = new ConfigurationReader();
49
50     def init() {
51         //dataService.registerDataChangeListener(FLOWS_PATH, changeListener);
52         dataService.registerCommitHandler(FLOWS_PATH, this);
53     }
54
55     override readConfigurationData(InstanceIdentifier<? extends DataObject> path) {
56         return readFrom(configuration, path);
57     }
58
59     override DataObject readOperationalData(InstanceIdentifier<? extends DataObject> path) {
60         return readFrom(configuration, path);
61     }
62
63     def DataObject readFrom(FlowManagementReader store, InstanceIdentifier<? extends DataObject> path) {
64         if (FLOWS_PATH == path) {
65             return store.readAllFlows();
66         }
67         if (FLOWS_PATH.contains(path)) {
68             return store.readFlow(path.toFlowKey());
69         }
70         return null;
71     }
72
73     override FlowCommitTransaction requestCommit(
74         DataModification modification) {
75         return new FlowCommitTransaction(this,modification);
76     }
77
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)
82         return key;
83     }
84     
85     def RpcResult<Void> finish(FlowCommitTransaction transaction) {
86         for(flw: transaction.toRemove) {
87             manager.removeStaticFlow(flw.name,flw.node)
88         }
89         
90         for(flw: transaction.toUpdate) {
91             manager.removeStaticFlow(flw.name,flw.node);
92             manager.addStaticFlow(flw);
93         }
94         
95         return Rpcs.<Void>getRpcResult(true,null,Collections.<RpcError>emptySet())
96     }
97     
98     def RpcResult<Void> rollback(FlowCommitTransaction transaction) {
99         // NOOP: We did not changed any state.
100     }
101
102 }
103
104 class ConfigurationReader implements FlowManagementReader {
105
106     @Property
107     var IForwardingRulesManager manager;
108
109     override Flows readAllFlows() {
110         val it = new FlowsBuilder();
111         flow = manager.staticFlows.map[
112             toConfigurationFlow();
113         ]
114         return it.build();
115     }
116
117     override readFlow(FlowKey key) {
118         val flowCfg = manager.getStaticFlow(String.valueOf(key.id), key.node.toADNode());
119         return flowCfg.toConfigurationFlow;
120     }
121 }
122
123 public static class FlowCommitTransaction implements DataCommitTransaction<InstanceIdentifier<? extends DataObject>, DataObject> {
124
125     @Property
126     val DataModification<InstanceIdentifier<? extends DataObject>, DataObject> modification;
127
128     @Property
129     val FRMRuntimeDataProvider flowManager;
130     
131     @Property
132     val toAdd = new HashSet<FlowConfig>();
133     
134     @Property
135     var Iterable<FlowConfig> toUpdate
136     
137     @Property
138     var Iterable<FlowConfig> toRemove
139     
140
141     new(FRMRuntimeDataProvider flowManager,DataModification<InstanceIdentifier<? extends DataObject>, DataObject> modification) {
142         super();
143         _flowManager = flowManager;
144         _modification = modification;
145         processModification();
146     }
147
148     override finish() throws IllegalStateException {
149         return flowManager.finish(this);
150     }
151
152     override rollback() throws IllegalStateException
153 {
154         return flowManager.rollback(this);
155     }
156
157     def processModification() {
158         val updated = modification.updatedConfigurationData.entrySet;
159         
160         val _toUpdate = updated.filter[key.isFlowPath].map[
161              return (value as Flow).toFlowConfig
162         ]
163         toUpdate = _toUpdate as Iterable<FlowConfig>
164         
165         
166         val _toRemove = modification.removedConfigurationData.filter[isFlowPath].map[
167              toFlowConfig
168         ]
169         toRemove = _toRemove as Iterable<FlowConfig>
170         
171     }
172 }