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.collect.Maps;
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.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpAddress;
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.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface;
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanId;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.*;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.port._interface.attributes.*;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rev150331.IfL2vlan;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rev150331.IfTunnel;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rev150331.TunnelTypeGre;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rev150331.TunnelTypeVxlan;
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;
42 public class SouthboundUtils {
43 private static final Logger LOG = LoggerFactory.getLogger(SouthboundUtils.class);
44 public static final TopologyId OVSDB_TOPOLOGY_ID = new TopologyId(new Uri("ovsdb:1"));
46 public static void addPortToBridge(InstanceIdentifier<?> bridgeIid, Interface iface,
47 OvsdbBridgeAugmentation bridgeAugmentation, String bridgeName,
48 String portName, DataBroker dataBroker, WriteTransaction t) {
49 IfTunnel ifTunnel = iface.getAugmentation(IfTunnel.class);
50 if (ifTunnel != null) {
51 addTunnelPortToBridge(ifTunnel, bridgeIid, iface, bridgeAugmentation, bridgeName, portName, dataBroker, t);
55 IfL2vlan ifL2vlan = iface.getAugmentation(IfL2vlan.class);
56 if (ifL2vlan != null) {
57 addVlanPortToBridge(bridgeIid, ifL2vlan, bridgeAugmentation, bridgeName, portName, dataBroker, t);
61 private static void addVlanPortToBridge(InstanceIdentifier<?> bridgeIid, IfL2vlan ifL2vlan,
62 OvsdbBridgeAugmentation bridgeAugmentation, String bridgeName,
63 String portName, DataBroker dataBroker, WriteTransaction t) {
64 int vlanId = ifL2vlan.getVlanId().getValue();
65 addTerminationPoint(bridgeIid, bridgeAugmentation, bridgeName, portName, vlanId, null, null, dataBroker, t);
68 private static void addTunnelPortToBridge(IfTunnel ifTunnel, InstanceIdentifier<?> bridgeIid, Interface iface,
69 OvsdbBridgeAugmentation bridgeAugmentation, String bridgeName,
70 String portName, DataBroker dataBroker, WriteTransaction t) {
72 if (ifTunnel.getTunnelInterfaceType().isAssignableFrom(TunnelTypeGre.class)) {
73 type = InterfaceTypeGre.class;
74 } else if (ifTunnel.getTunnelInterfaceType().isAssignableFrom(TunnelTypeVxlan.class)) {
75 type = InterfaceTypeVxlan.class;
79 LOG.warn("Unknown Tunnel Type obtained while creating interface: {}", iface);
84 IfL2vlan ifL2vlan = iface.getAugmentation(IfL2vlan.class);
85 if (ifL2vlan != null) {
86 vlanId = ifL2vlan.getVlanId().getValue();
89 Map<String, String> options = Maps.newHashMap();
90 options.put("key", "flow");
92 IpAddress localIp = ifTunnel.getTunnelSource();
93 options.put("local_ip", localIp.getIpv4Address().getValue());
95 IpAddress remoteIp = ifTunnel.getTunnelDestination();
96 options.put("remote_ip", remoteIp.getIpv4Address().getValue());
98 addTerminationPoint(bridgeIid, bridgeAugmentation, bridgeName, portName, vlanId, type, options, dataBroker, t);
101 private static void addTerminationPoint(InstanceIdentifier<?> bridgeIid, OvsdbBridgeAugmentation bridgeNode,
102 String bridgeName, String portName, int vlanId, Class type,
103 Map<String, String> options, DataBroker dataBroker, WriteTransaction t) {
104 InstanceIdentifier<TerminationPoint> tpIid = createTerminationPointInstanceIdentifier(
105 InstanceIdentifier.keyOf(bridgeIid.firstIdentifierOf(Node.class)), portName);
106 OvsdbTerminationPointAugmentationBuilder tpAugmentationBuilder = new OvsdbTerminationPointAugmentationBuilder();
108 tpAugmentationBuilder.setName(portName);
111 tpAugmentationBuilder.setInterfaceType(type);
114 if (options != null) {
115 List<Options> optionsList = new ArrayList<Options>();
116 for (Map.Entry<String, String> entry : options.entrySet()) {
117 OptionsBuilder optionsBuilder = new OptionsBuilder();
118 optionsBuilder.setKey(new OptionsKey(entry.getKey()));
119 optionsBuilder.setOption(entry.getKey());
120 optionsBuilder.setValue(entry.getValue());
121 optionsList.add(optionsBuilder.build());
123 tpAugmentationBuilder.setOptions(optionsList);
127 tpAugmentationBuilder.setVlanMode(OvsdbPortInterfaceAttributes.VlanMode.Access);
128 tpAugmentationBuilder.setVlanTag(new VlanId(vlanId));
131 TerminationPointBuilder tpBuilder = new TerminationPointBuilder();
132 tpBuilder.setKey(InstanceIdentifier.keyOf(tpIid));
133 tpBuilder.addAugmentation(OvsdbTerminationPointAugmentation.class, tpAugmentationBuilder.build());
135 t.put(LogicalDatastoreType.CONFIGURATION, tpIid, tpBuilder.build(), true);
138 private static InstanceIdentifier<TerminationPoint> createTerminationPointInstanceIdentifier(Node node,
140 InstanceIdentifier<TerminationPoint> terminationPointPath = InstanceIdentifier
141 .create(NetworkTopology.class)
142 .child(Topology.class, new TopologyKey(OVSDB_TOPOLOGY_ID))
143 .child(Node.class,node.getKey())
144 .child(TerminationPoint.class, new TerminationPointKey(new TpId(portName)));
146 LOG.debug("Termination point InstanceIdentifier generated : {}", terminationPointPath);
147 return terminationPointPath;
150 public static InstanceIdentifier<TerminationPoint> createTerminationPointInstanceIdentifier(NodeKey nodekey,
152 InstanceIdentifier<TerminationPoint> terminationPointPath = InstanceIdentifier
153 .create(NetworkTopology.class)
154 .child(Topology.class, new TopologyKey(OVSDB_TOPOLOGY_ID))
155 .child(Node.class,nodekey)
156 .child(TerminationPoint.class, new TerminationPointKey(new TpId(portName)));
158 LOG.debug("Termination point InstanceIdentifier generated : {}",terminationPointPath);
159 return terminationPointPath;