abe966883bfc81e7d3b74f2e4709b3f4fe313ca7
[ovsdb.git] / hwvtepsouthbound / hwvtepsouthbound-impl / src / main / java / org / opendaylight / ovsdb / hwvtepsouthbound / reconciliation / configuration / HwvtepReconciliationTask.java
1 /*
2  * Copyright (c) 2016, 2017 Ericsson India Global Services Pvt Ltd. 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.ovsdb.hwvtepsouthbound.reconciliation.configuration;
9
10 import java.util.ArrayList;
11 import java.util.Collection;
12 import java.util.Optional;
13
14 import org.opendaylight.mdsal.binding.api.DataBroker;
15 import org.opendaylight.mdsal.binding.api.DataTreeModification;
16 import org.opendaylight.mdsal.binding.api.ReadTransaction;
17 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
18 import org.opendaylight.ovsdb.hwvtepsouthbound.HwvtepConnectionInstance;
19 import org.opendaylight.ovsdb.hwvtepsouthbound.HwvtepConnectionManager;
20 import org.opendaylight.ovsdb.hwvtepsouthbound.HwvtepSouthboundMapper;
21 import org.opendaylight.ovsdb.hwvtepsouthbound.HwvtepSouthboundUtil;
22 import org.opendaylight.ovsdb.hwvtepsouthbound.reconciliation.ReconciliationManager;
23 import org.opendaylight.ovsdb.hwvtepsouthbound.reconciliation.ReconciliationTask;
24 import org.opendaylight.ovsdb.hwvtepsouthbound.transact.HwvtepOperationalState;
25 import org.opendaylight.ovsdb.hwvtepsouthbound.transact.TransactCommandAggregator;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.HwvtepGlobalAugmentation;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.global.attributes.LogicalSwitches;
28 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
29 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
30
31 public class HwvtepReconciliationTask extends ReconciliationTask {
32     private final HwvtepConnectionInstance connectionInstance;
33     private final DataBroker db;
34     private final Node psNode;
35
36     public HwvtepReconciliationTask(ReconciliationManager reconciliationManager,
37                                     HwvtepConnectionManager connectionManager,
38                                     InstanceIdentifier<?> nodeId,
39                                     Node psNode,
40                                     HwvtepConnectionInstance connectionInstance,
41                                     DataBroker db) {
42         super(reconciliationManager, connectionManager, nodeId, null);
43         this.db = db;
44         this.psNode = psNode;
45         this.connectionInstance = connectionInstance;
46     }
47
48     private void transactChangesToDevice(final Collection<DataTreeModification<Node>> changes,
49                                          final Node globalOperNode,
50                                          final Node node) {
51         HwvtepOperationalState hwvtepOperationalState = new HwvtepOperationalState(db, connectionInstance, changes,
52                 globalOperNode, node);
53         hwvtepOperationalState.setInReconciliation(true);
54         boolean reconcile = true;
55         connectionInstance.transact(new TransactCommandAggregator(hwvtepOperationalState,changes), reconcile);
56     }
57
58     @Override
59     public boolean reconcileConfiguration(HwvtepConnectionManager connectionManagerOfDevice) {
60         InstanceIdentifier<Node> psNodeIid = HwvtepSouthboundMapper.createInstanceIdentifier(psNode.getNodeId());
61         InstanceIdentifier<Node> nodeId = (InstanceIdentifier<Node>)nodeIid;
62
63         ReadTransaction tx = reconciliationManager.getDb().newReadOnlyTransaction();
64         Node globalConfigNode = readNode(tx, LogicalDatastoreType.CONFIGURATION, nodeId);
65         Node globalOpNode = readNode(tx, LogicalDatastoreType.OPERATIONAL, nodeId);
66         Node psConfigNode = readNode(tx, LogicalDatastoreType.CONFIGURATION, psNodeIid);
67
68         DataTreeModification<Node> change = null;
69         Collection<DataTreeModification<Node>> changes = new ArrayList<>();
70         change = GlobalConfigOperationalChangeGetter.getModification(nodeId, globalConfigNode, globalOpNode);
71         changes.add(change);
72
73         change = SwitchConfigOperationalChangeGetter.getModification(psNodeIid, psConfigNode, psNode);
74         changes.add(change);
75
76         if (globalConfigNode != null) {
77             HwvtepGlobalAugmentation augmentation = globalConfigNode.augmentation(HwvtepGlobalAugmentation.class);
78             if (augmentation != null) {
79                 if (augmentation.getLogicalSwitches() != null) {
80                     for (LogicalSwitches logicalSwitches : augmentation.getLogicalSwitches()) {
81                         connectionInstance.getDeviceInfo().updateConfigData(LogicalSwitches.class,
82                                 nodeId.augmentation(HwvtepGlobalAugmentation.class).child(LogicalSwitches.class,
83                                         logicalSwitches.key()), logicalSwitches);
84                     }
85                 }
86             }
87         }
88         transactChangesToDevice(changes, globalOpNode, psNode);
89         return true;
90     }
91
92     @Override
93     public void doRetry(boolean wasPreviousAttemptSuccessful) {
94     }
95
96     @Override
97     public void checkReadinessAndProcess() {
98     }
99
100     @Override
101     public long retryDelayInMills() {
102         return 0;
103     }
104
105     private Node readNode(ReadTransaction transaction,
106                           LogicalDatastoreType logicalDatastoreType, InstanceIdentifier<Node> iid) {
107         Optional<Node> optional = HwvtepSouthboundUtil.readNode(transaction, logicalDatastoreType, iid);
108         if (optional.isPresent()) {
109             return optional.get();
110         }
111         return null;
112     }
113 }