Fixes in interface manager and aliveness monitor
[vpnservice.git] / interfacemgr / interfacemgr-impl / src / main / java / org / opendaylight / vpnservice / interfacemgr / renderer / ovs / utilities / VlanTrunkSouthboundUtils.java
1 /*
2  * Copyright (c) 2015 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.vpnservice.interfacemgr.renderer.ovs.utilities;
9
10 import com.google.common.base.Optional;
11 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
12 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
13 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
14 import org.opendaylight.vpnservice.interfacemgr.IfmUtil;
15 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Uri;
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanId;
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbBridgeAugmentation;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbPortInterfaceAttributes;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbTerminationPointAugmentation;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbTerminationPointAugmentationBuilder;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.port._interface.attributes.Trunks;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.port._interface.attributes.TrunksBuilder;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rev150331.IfL2vlan;
24 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology;
25 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TopologyId;
26 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TpId;
27 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology;
28 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.TopologyKey;
29 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
30 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.NodeKey;
31 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPoint;
32 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPointBuilder;
33 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPointKey;
34 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
35 import org.slf4j.Logger;
36 import org.slf4j.LoggerFactory;
37
38 import java.util.ArrayList;
39 import java.util.List;
40
41 public class VlanTrunkSouthboundUtils {
42     private static final Logger LOG = LoggerFactory.getLogger(VlanTrunkSouthboundUtils.class);
43     public static final TopologyId OVSDB_TOPOLOGY_ID = new TopologyId(new Uri("ovsdb:1"));
44
45     public static void addVlanPortToBridge(InstanceIdentifier<?> bridgeIid, IfL2vlan ifL2vlan,
46                                             OvsdbBridgeAugmentation bridgeAugmentation, String bridgeName,
47                                             String parentInterface, DataBroker dataBroker, WriteTransaction t) {
48         LOG.info("Vlan Interface creation not supported yet. please visit later.");
49         int vlanId = ifL2vlan.getVlanId().getValue();
50         addTrunkTerminationPoint(bridgeIid, bridgeAugmentation, bridgeName, parentInterface, vlanId, dataBroker, t);
51     }
52
53     public static void updateVlanMemberInTrunk(InstanceIdentifier<?> bridgeIid, IfL2vlan ifL2vlan,
54                                            OvsdbBridgeAugmentation bridgeAugmentation, String bridgeName,
55                                            String parentInterface, DataBroker dataBroker, WriteTransaction t) {
56         LOG.info("Vlan Interface creation not supported yet. please visit later.");
57         int vlanId = ifL2vlan.getVlanId().getValue();
58         updateTerminationPoint(bridgeIid, bridgeAugmentation, bridgeName, parentInterface, vlanId, dataBroker, t);
59     }
60
61     private static void addTrunkTerminationPoint(InstanceIdentifier<?> bridgeIid, OvsdbBridgeAugmentation bridgeNode,
62                                                  String bridgeName, String parentInterface, int vlanId,
63                                                  DataBroker dataBroker, WriteTransaction t) {
64         if (vlanId == 0) {
65             LOG.error("Found vlanid 0 for bridge: {}, interface: {}", bridgeName, parentInterface);
66             return;
67         }
68
69         InstanceIdentifier<TerminationPoint> tpIid = createTerminationPointInstanceIdentifier(
70                 InstanceIdentifier.keyOf(bridgeIid.firstIdentifierOf(Node.class)), parentInterface);
71         OvsdbTerminationPointAugmentationBuilder tpAugmentationBuilder = new OvsdbTerminationPointAugmentationBuilder();
72         tpAugmentationBuilder.setName(parentInterface);
73         tpAugmentationBuilder.setVlanMode(OvsdbPortInterfaceAttributes.VlanMode.Trunk);
74         OvsdbTerminationPointAugmentation terminationPointAugmentation = null;
75         Optional<TerminationPoint> terminationPointOptional =
76                 IfmUtil.read(LogicalDatastoreType.OPERATIONAL, tpIid, dataBroker);
77         if (terminationPointOptional.isPresent()) {
78             TerminationPoint terminationPoint = terminationPointOptional.get();
79             terminationPointAugmentation = terminationPoint.getAugmentation(OvsdbTerminationPointAugmentation.class);
80             if (terminationPointAugmentation != null) {
81                 List<Trunks> trunks = terminationPointAugmentation.getTrunks();
82                 if (trunks == null) {
83                     trunks = new ArrayList<>();
84                 }
85
86                 trunks.add(new TrunksBuilder().setTrunk(new VlanId(vlanId)).build());
87                 tpAugmentationBuilder.setTrunks(trunks);
88             }
89         } else {
90             List<Trunks> trunks = new ArrayList<>();
91             trunks.add(new TrunksBuilder().setTrunk(new VlanId(vlanId)).build());
92             tpAugmentationBuilder.setTrunks(trunks);
93         }
94
95         TerminationPointBuilder tpBuilder = new TerminationPointBuilder();
96         tpBuilder.setKey(InstanceIdentifier.keyOf(tpIid));
97         tpBuilder.addAugmentation(OvsdbTerminationPointAugmentation.class, tpAugmentationBuilder.build());
98
99         t.put(LogicalDatastoreType.CONFIGURATION, tpIid, tpBuilder.build(), true);
100     }
101
102     public static void addTerminationPointWithTrunks(InstanceIdentifier<?> bridgeIid, List<Trunks> trunks,
103                                                      String parentInterface, WriteTransaction t) {
104         InstanceIdentifier<TerminationPoint> tpIid = createTerminationPointInstanceIdentifier(
105                 InstanceIdentifier.keyOf(bridgeIid.firstIdentifierOf(Node.class)), parentInterface);
106         OvsdbTerminationPointAugmentationBuilder tpAugmentationBuilder = new OvsdbTerminationPointAugmentationBuilder();
107         tpAugmentationBuilder.setName(parentInterface);
108         tpAugmentationBuilder.setVlanMode(OvsdbPortInterfaceAttributes.VlanMode.Trunk);
109         tpAugmentationBuilder.setTrunks(trunks);
110
111         TerminationPointBuilder tpBuilder = new TerminationPointBuilder();
112         tpBuilder.setKey(InstanceIdentifier.keyOf(tpIid));
113         tpBuilder.addAugmentation(OvsdbTerminationPointAugmentation.class, tpAugmentationBuilder.build());
114
115         t.put(LogicalDatastoreType.CONFIGURATION, tpIid, tpBuilder.build(), true);
116     }
117
118     private static void updateTerminationPoint(InstanceIdentifier<?> bridgeIid, OvsdbBridgeAugmentation bridgeNode,
119                                            String bridgeName, String parentInterface, int vlanId,
120                                            DataBroker dataBroker, WriteTransaction t) {
121         if (vlanId == 0) {
122             LOG.error("Found vlanid 0 for bridge: {}, interface: {}", bridgeName, parentInterface);
123             return;
124         }
125
126         InstanceIdentifier<TerminationPoint> tpIid = createTerminationPointInstanceIdentifier(
127                 InstanceIdentifier.keyOf(bridgeIid.firstIdentifierOf(Node.class)), parentInterface);
128         OvsdbTerminationPointAugmentationBuilder tpAugmentationBuilder = new OvsdbTerminationPointAugmentationBuilder();
129         tpAugmentationBuilder.setName(parentInterface);
130         tpAugmentationBuilder.setVlanMode(OvsdbPortInterfaceAttributes.VlanMode.Trunk);
131         OvsdbTerminationPointAugmentation terminationPointAugmentation = null;
132         Optional<TerminationPoint> terminationPointOptional =
133                 IfmUtil.read(LogicalDatastoreType.OPERATIONAL, tpIid, dataBroker);
134         if (terminationPointOptional.isPresent()) {
135             TerminationPoint terminationPoint = terminationPointOptional.get();
136             terminationPointAugmentation = terminationPoint.getAugmentation(OvsdbTerminationPointAugmentation.class);
137             if (terminationPointAugmentation != null) {
138                 List<Trunks> trunks = terminationPointAugmentation.getTrunks();
139                 if (trunks != null) {
140                     trunks.remove(new TrunksBuilder().setTrunk(new VlanId(vlanId)).build());
141                 }
142
143                 tpAugmentationBuilder.setTrunks(trunks);
144                 TerminationPointBuilder tpBuilder = new TerminationPointBuilder();
145                 tpBuilder.setKey(InstanceIdentifier.keyOf(tpIid));
146                 tpBuilder.addAugmentation(OvsdbTerminationPointAugmentation.class, tpAugmentationBuilder.build());
147
148                 t.put(LogicalDatastoreType.CONFIGURATION, tpIid, tpBuilder.build(), true);
149             }
150         }
151     }
152
153     private static InstanceIdentifier<TerminationPoint> createTerminationPointInstanceIdentifier(NodeKey nodekey,
154                                                                                                 String portName){
155         InstanceIdentifier<TerminationPoint> terminationPointPath = InstanceIdentifier
156                 .create(NetworkTopology.class)
157                 .child(Topology.class, new TopologyKey(OVSDB_TOPOLOGY_ID))
158                 .child(Node.class,nodekey)
159                 .child(TerminationPoint.class, new TerminationPointKey(new TpId(portName)));
160
161         LOG.debug("Termination point InstanceIdentifier generated : {}", terminationPointPath);
162         return terminationPointPath;
163     }
164 }