Merge "BUG-509: remove the key/value datastore"
[controller.git] / opendaylight / md-sal / forwardingrules-manager / src / main / java / org / opendaylight / controller / frm / flow / FlowTransaction.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.frm.flow
9
10 import org.opendaylight.controller.frm.AbstractTransaction
11 import org.opendaylight.controller.md.sal.common.api.data.DataModification
12 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.Table
13 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.AddFlowInputBuilder
14 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.FlowTableRef
15 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.RemoveFlowInputBuilder
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.UpdateFlowInputBuilder
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.flow.update.OriginalFlowBuilder
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.flow.update.UpdatedFlowBuilder
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.Flow
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node
22 import org.opendaylight.yangtools.yang.binding.DataObject
23 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.SalFlowService
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.FlowRef
26 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Uri
27
28 class FlowTransaction extends AbstractTransaction {
29     
30     @Property
31     val SalFlowService salFlowService;   
32     
33     
34     new(DataModification<InstanceIdentifier<? extends DataObject>, DataObject> modification,SalFlowService salFlowService) {
35         super(modification)        
36         _salFlowService = salFlowService;
37     }
38     
39     override remove(InstanceIdentifier<?> instanceId, DataObject obj) {
40         if(obj instanceof Flow) {
41             val flow = (obj as Flow)
42             val tableInstanceId = instanceId.firstIdentifierOf(Table);
43             val nodeInstanceId = instanceId.firstIdentifierOf(Node);
44             val builder = new RemoveFlowInputBuilder(flow);
45             builder.setFlowRef(new FlowRef(instanceId));            
46             builder.setNode(new NodeRef(nodeInstanceId));
47             builder.setFlowTable(new FlowTableRef(tableInstanceId));
48             builder.setTransactionUri(new Uri(modification.getIdentifier() as String));
49             _salFlowService.removeFlow(builder.build());            
50         }
51     }
52     
53     override update(InstanceIdentifier<?> instanceId, DataObject originalObj, DataObject updatedObj) {
54         if(originalObj instanceof Flow && updatedObj instanceof Flow) {
55             val originalFlow = (originalObj as Flow)
56             val updatedFlow = (updatedObj as Flow)
57             val nodeInstanceId = instanceId.firstIdentifierOf(Node);
58             val builder = new UpdateFlowInputBuilder();
59             builder.setNode(new NodeRef(nodeInstanceId));
60             builder.setFlowRef(new FlowRef(instanceId));
61             val ufb = new UpdatedFlowBuilder(updatedFlow);
62             builder.setUpdatedFlow((ufb.build()));
63             builder.setTransactionUri(new Uri(modification.getIdentifier() as String));
64             val ofb = new OriginalFlowBuilder(originalFlow);
65             builder.setOriginalFlow(ofb.build());      
66             _salFlowService.updateFlow(builder.build());
67            
68         }
69     }
70     
71     override add(InstanceIdentifier<?> instanceId, DataObject obj) {
72         if(obj instanceof Flow) {
73             val flow = (obj as Flow)
74             val tableInstanceId = instanceId.firstIdentifierOf(Table);
75             val nodeInstanceId = instanceId.firstIdentifierOf(Node);
76             val builder = new AddFlowInputBuilder(flow);
77             builder.setNode(new NodeRef(nodeInstanceId));
78             builder.setTransactionUri(new Uri(modification.getIdentifier() as String));
79             builder.setFlowRef(new FlowRef(instanceId));
80             builder.setFlowTable(new FlowTableRef(tableInstanceId));
81             _salFlowService.addFlow(builder.build());            
82         }
83     }
84     
85     override validate() throws IllegalStateException {
86         FlowTransactionValidator.validate(this)
87     }  
88 }