2 * Copyright (c) 2016 Hewlett Packard Enterprise, Co. 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
9 package org.opendaylight.unimgr.mef.netvirt;
11 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
12 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
13 import org.opendaylight.genius.interfacemanager.globals.IfmConstants;
14 import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.interfaces.rev150526.MefInterfaces;
15 import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.interfaces.rev150526.mef.interfaces.Subnets;
16 import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.interfaces.rev150526.mef.interfaces.Unis;
17 import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.interfaces.rev150526.mef.interfaces.subnets.Subnet;
18 import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.interfaces.rev150526.mef.interfaces.subnets.SubnetKey;
19 import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.interfaces.rev150526.mef.interfaces.unis.Uni;
20 import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.interfaces.rev150526.mef.interfaces.unis.UniKey;
21 import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.interfaces.rev150526.mef.interfaces.unis.uni.IpUnis;
22 import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.interfaces.rev150526.mef.interfaces.unis.uni.PhysicalLayers;
23 import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.interfaces.rev150526.mef.interfaces.unis.uni.ip.unis.IpUni;
24 import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.interfaces.rev150526.mef.interfaces.unis.uni.ip.unis.IpUniKey;
25 import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.interfaces.rev150526.mef.interfaces.unis.uni.physical.layers.Links;
26 import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.interfaces.rev150526.mef.interfaces.unis.uni.physical.layers.links.Link;
27 import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.interfaces.rev150526.mef.interfaces.unis.uni.physical.layers.links.LinkKey;
28 import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.topology.rev150526.MefTopology;
29 import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.topology.rev150526.mef.topology.Devices;
30 import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.topology.rev150526.mef.topology.devices.Device;
31 import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.topology.rev150526.mef.topology.devices.DeviceKey;
32 import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.topology.rev150526.mef.topology.devices.device.Interfaces;
33 import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.topology.rev150526.mef.topology.devices.device.interfaces.Interface;
34 import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.topology.rev150526.mef.topology.devices.device.interfaces.InterfaceKey;
35 import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.types.rev150526.Identifier45;
36 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpPrefix;
37 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
38 import org.slf4j.Logger;
39 import org.slf4j.LoggerFactory;
41 import com.google.common.base.Optional;
43 public final class MefInterfaceUtils {
44 private static final Logger logger = LoggerFactory.getLogger(MefInterfaceUtils.class);
45 public final static String VLAN_SEPARATOR = ".";
46 private final static String TRUNK_SUFFIX = "-trunk";
48 public static InstanceIdentifier<Interface> getDeviceInterfaceInstanceIdentifier(String deviceId,
50 return InstanceIdentifier.builder(MefTopology.class).child(Devices.class)
51 .child(Device.class, new DeviceKey(new Identifier45(deviceId))).child(Interfaces.class)
52 .child(Interface.class, new InterfaceKey(new Identifier45(interfaceId))).build();
55 public static InstanceIdentifier<Uni> getUniInstanceIdentifier(String uniId) {
56 return InstanceIdentifier.builder(MefInterfaces.class).child(Unis.class)
57 .child(Uni.class, new UniKey(new Identifier45(uniId))).build();
60 public static InstanceIdentifier<Uni> getUniListInstanceIdentifier() {
61 return InstanceIdentifier.builder(MefInterfaces.class).child(Unis.class).child(Uni.class).build();
64 public static InstanceIdentifier<Link> getUniLinkInstanceIdentifier(String uniId, String deviceId,
66 return InstanceIdentifier.builder(MefInterfaces.class).child(Unis.class)
67 .child(Uni.class, new UniKey(new Identifier45(uniId))).child(PhysicalLayers.class).child(Links.class)
68 .child(Link.class, new LinkKey(new Identifier45(deviceId), interfaceId)).build();
71 private static InstanceIdentifier<IpUni> getIpUniInstanceIdentifier(Identifier45 uniId, Identifier45 ipUniId) {
72 return InstanceIdentifier.builder(MefInterfaces.class).child(Unis.class)
73 .child(Uni.class, new UniKey(uniId)).child(IpUnis.class)
74 .child(IpUni.class, new IpUniKey(ipUniId)).build();
77 public static InstanceIdentifier<Subnets> getSubnetListInstanceIdentifier() {
78 return InstanceIdentifier.builder(MefInterfaces.class).child(Subnets.class).build();
81 public static InstanceIdentifier<Subnet> getSubnetsInstanceIdentifier() {
82 return InstanceIdentifier.builder(MefInterfaces.class).child(Subnets.class).child(Subnet.class).build();
85 public static InstanceIdentifier<Subnet> getSubnetInstanceIdentifier(Identifier45 uniId, Identifier45 ipUniId,
87 return InstanceIdentifier.builder(MefInterfaces.class).child(Subnets.class)
89 .child(Subnet.class, new SubnetKey(ipUniId, subnet, uniId)).build();
92 public static Link getLink(DataBroker dataBroker, String uniId, LogicalDatastoreType datastoreType) {
93 Uni uni = getUni(dataBroker, uniId, datastoreType);
96 logger.error("A matching Uni doesn't exist for EvcUni {}", uniId);
100 PhysicalLayers physicalLayers = uni.getPhysicalLayers();
101 if (physicalLayers == null) {
102 logger.warn("Uni {} is missing PhysicalLayers", uniId);
106 Links links = physicalLayers.getLinks();
107 if (links == null || links.getLink() == null) {
108 logger.warn("Uni {} is has no links", uniId);
112 Link link = links.getLink().get(0);
116 public static Uni getUni(DataBroker dataBroker, String uniId, LogicalDatastoreType datastoreType) {
117 Optional<Uni> optional = MdsalUtils.read(dataBroker, datastoreType,
118 MefInterfaceUtils.getUniInstanceIdentifier(uniId));
120 if (!optional.isPresent()) {
121 logger.debug("A matching Uni doesn't exist {}", uniId);
125 return optional.get();
128 public static IpUni getIpUni(DataBroker dataBroker, Identifier45 uniId, Identifier45 ipUniId,
129 LogicalDatastoreType datastoreType) {
130 Optional<IpUni> optional = MdsalUtils.read(dataBroker, datastoreType,
131 MefInterfaceUtils.getIpUniInstanceIdentifier(uniId, ipUniId));
133 if (!optional.isPresent()) {
134 logger.error("A matching IpUni doesn't exist Uni {} IpUni {}", uniId, ipUniId);
138 return optional.get();
141 public static Interface getInterface(DataBroker dataBroker, String deviceId, String uniId,
142 LogicalDatastoreType datastoreType) {
143 InstanceIdentifier<Interface> interfacePath = MefInterfaceUtils.getDeviceInterfaceInstanceIdentifier(deviceId,
145 Optional<Interface> optional = MdsalUtils.read(dataBroker, datastoreType, interfacePath);
147 if (!optional.isPresent()) {
148 logger.debug("A matching Uni doesn't exist {}", uniId);
152 return optional.get();
155 public static String getInterfaceNameForVlan(String interfaceName, Long vlan) {
156 final StringBuilder s = new StringBuilder();
157 s.append(interfaceName);
159 s.append(VLAN_SEPARATOR).append(vlan);
161 s.append(TRUNK_SUFFIX);
163 return getUUidFromString(s.toString());
166 private static String getUUidFromString(String key) {
167 return java.util.UUID.nameUUIDFromBytes(key.getBytes()).toString();
170 public static String getTrunkParentName(Link link) {
171 String interfaceName = link.getInterface().toString();
172 return interfaceName;
175 public static String getInterfaceName(Link link, String uniId) {
176 String device = link.getDevice().getValue();
177 return getDeviceInterfaceName(device, uniId);
180 public static String getDeviceInterfaceName(String deviceName, String interfaceName) {
181 return deviceName + IfmConstants.OF_URI_SEPARATOR + interfaceName;