refactoring to support delete\update of servics.
[unimgr.git] / netvirt / src / main / java / org / opendaylight / unimgr / mef / netvirt / MefInterfaceUtils.java
1 /*
2  * Copyright (c) 2016 Hewlett Packard Enterprise, Co. 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
9 package org.opendaylight.unimgr.mef.netvirt;
10
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;
40
41 import com.google.common.base.Optional;
42
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";
47
48     public static InstanceIdentifier<Interface> getDeviceInterfaceInstanceIdentifier(String deviceId,
49             String interfaceId) {
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();
53     }
54
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();
58     }
59
60     public static InstanceIdentifier<Uni> getUniListInstanceIdentifier() {
61         return InstanceIdentifier.builder(MefInterfaces.class).child(Unis.class).child(Uni.class).build();
62     }
63
64     public static InstanceIdentifier<Link> getUniLinkInstanceIdentifier(String uniId, String deviceId,
65             String interfaceId) {
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();
69     }
70
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();
75     }
76
77     public static InstanceIdentifier<Subnets> getSubnetListInstanceIdentifier() {
78         return InstanceIdentifier.builder(MefInterfaces.class).child(Subnets.class).build();
79     }
80
81     public static InstanceIdentifier<Subnet> getSubnetsInstanceIdentifier() {
82         return InstanceIdentifier.builder(MefInterfaces.class).child(Subnets.class).child(Subnet.class).build();
83     }
84
85     public static InstanceIdentifier<Subnet> getSubnetInstanceIdentifier(Identifier45 uniId, Identifier45 ipUniId,
86             IpPrefix subnet) {
87         return InstanceIdentifier.builder(MefInterfaces.class).child(Subnets.class)
88
89                 .child(Subnet.class, new SubnetKey(ipUniId, subnet, uniId)).build();
90     }
91
92     public static Link getLink(DataBroker dataBroker, String uniId, LogicalDatastoreType datastoreType) {
93         Uni uni = getUni(dataBroker, uniId, datastoreType);
94
95         if (uni == null) {
96             logger.error("A matching Uni doesn't exist for EvcUni {}", uniId);
97             return null;
98         }
99
100         PhysicalLayers physicalLayers = uni.getPhysicalLayers();
101         if (physicalLayers == null) {
102             logger.warn("Uni {} is missing PhysicalLayers", uniId);
103             return null;
104         }
105
106         Links links = physicalLayers.getLinks();
107         if (links == null || links.getLink() == null) {
108             logger.warn("Uni {} is has no links", uniId);
109             return null;
110         }
111
112         Link link = links.getLink().get(0);
113         return link;
114     }
115
116     public static Uni getUni(DataBroker dataBroker, String uniId, LogicalDatastoreType datastoreType) {
117         Optional<Uni> optional = MdsalUtils.read(dataBroker, datastoreType,
118                 MefInterfaceUtils.getUniInstanceIdentifier(uniId));
119
120         if (!optional.isPresent()) {
121             logger.debug("A matching Uni doesn't exist {}", uniId);
122             return null;
123         }
124
125         return optional.get();
126     }
127
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));
132
133         if (!optional.isPresent()) {
134             logger.error("A matching IpUni doesn't exist Uni {} IpUni {}", uniId, ipUniId);
135             return null;
136         }
137
138         return optional.get();
139     }
140
141     public static Interface getInterface(DataBroker dataBroker, String deviceId, String uniId,
142             LogicalDatastoreType datastoreType) {
143         InstanceIdentifier<Interface> interfacePath = MefInterfaceUtils.getDeviceInterfaceInstanceIdentifier(deviceId,
144                 uniId);
145         Optional<Interface> optional = MdsalUtils.read(dataBroker, datastoreType, interfacePath);
146
147         if (!optional.isPresent()) {
148             logger.debug("A matching Uni doesn't exist {}", uniId);
149             return null;
150         }
151
152         return optional.get();
153     }
154
155     public static String getInterfaceNameForVlan(String interfaceName, Long vlan) {
156         final StringBuilder s = new StringBuilder();
157         s.append(interfaceName);
158         if (vlan != null) {
159             s.append(VLAN_SEPARATOR).append(vlan);
160         }
161         s.append(TRUNK_SUFFIX);
162
163         return getUUidFromString(s.toString());
164     }
165
166     private static String getUUidFromString(String key) {
167         return java.util.UUID.nameUUIDFromBytes(key.getBytes()).toString();
168     }
169
170     public static String getTrunkParentName(Link link) {
171         String interfaceName = link.getInterface().toString();
172         return interfaceName;
173     }
174
175     public static String getInterfaceName(Link link, String uniId) {
176         String device = link.getDevice().getValue();
177         return getDeviceInterfaceName(device, uniId);
178     }
179
180     public static String getDeviceInterfaceName(String deviceName, String interfaceName) {
181         return deviceName + IfmConstants.OF_URI_SEPARATOR + interfaceName;
182     }
183 }