2 * Copyright (c) 2015 Ericsson India Global Services Pvt Ltd. and others. All rights reserved.
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
8 package org.opendaylight.vpnservice.interfacemgr.renderer.ovs.utilities;
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;
38 import java.util.ArrayList;
39 import java.util.List;
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"));
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);
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);
61 private static void addTrunkTerminationPoint(InstanceIdentifier<?> bridgeIid, OvsdbBridgeAugmentation bridgeNode,
62 String bridgeName, String parentInterface, int vlanId,
63 DataBroker dataBroker, WriteTransaction t) {
65 LOG.error("Found vlanid 0 for bridge: {}, interface: {}", bridgeName, parentInterface);
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();
83 trunks = new ArrayList<>();
86 trunks.add(new TrunksBuilder().setTrunk(new VlanId(vlanId)).build());
87 tpAugmentationBuilder.setTrunks(trunks);
90 List<Trunks> trunks = new ArrayList<>();
91 trunks.add(new TrunksBuilder().setTrunk(new VlanId(vlanId)).build());
92 tpAugmentationBuilder.setTrunks(trunks);
95 TerminationPointBuilder tpBuilder = new TerminationPointBuilder();
96 tpBuilder.setKey(InstanceIdentifier.keyOf(tpIid));
97 tpBuilder.addAugmentation(OvsdbTerminationPointAugmentation.class, tpAugmentationBuilder.build());
99 t.put(LogicalDatastoreType.CONFIGURATION, tpIid, tpBuilder.build(), true);
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);
111 TerminationPointBuilder tpBuilder = new TerminationPointBuilder();
112 tpBuilder.setKey(InstanceIdentifier.keyOf(tpIid));
113 tpBuilder.addAugmentation(OvsdbTerminationPointAugmentation.class, tpAugmentationBuilder.build());
115 t.put(LogicalDatastoreType.CONFIGURATION, tpIid, tpBuilder.build(), true);
118 private static void updateTerminationPoint(InstanceIdentifier<?> bridgeIid, OvsdbBridgeAugmentation bridgeNode,
119 String bridgeName, String parentInterface, int vlanId,
120 DataBroker dataBroker, WriteTransaction t) {
122 LOG.error("Found vlanid 0 for bridge: {}, interface: {}", bridgeName, parentInterface);
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());
143 tpAugmentationBuilder.setTrunks(trunks);
144 TerminationPointBuilder tpBuilder = new TerminationPointBuilder();
145 tpBuilder.setKey(InstanceIdentifier.keyOf(tpIid));
146 tpBuilder.addAugmentation(OvsdbTerminationPointAugmentation.class, tpAugmentationBuilder.build());
148 t.put(LogicalDatastoreType.CONFIGURATION, tpIid, tpBuilder.build(), true);
153 private static InstanceIdentifier<TerminationPoint> createTerminationPointInstanceIdentifier(NodeKey nodekey,
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)));
161 LOG.debug("Termination point InstanceIdentifier generated : {}", terminationPointPath);
162 return terminationPointPath;