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 java.util.ArrayList;
12 import java.util.Collections;
13 import java.util.List;
14 import java.util.stream.Collectors;
16 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
17 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
18 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
19 import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.interfaces.rev150526.mef.interfaces.subnets.Subnet;
20 import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.services.rev150526.EvcElan;
21 import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.services.rev150526.IpvcVpn;
22 import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.services.rev150526.IpvcVpnBuilder;
23 import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.services.rev150526.MefServices;
24 import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.services.rev150526.mef.services.MefService;
25 import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.services.rev150526.mef.services.MefServiceKey;
26 import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.services.rev150526.mef.services.mef.service.mef.service.choice.EvcChoice;
27 import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.services.rev150526.mef.services.mef.service.mef.service.choice.IpvcChoice;
28 import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.services.rev150526.mef.services.mef.service.mef.service.choice.evc.choice.Evc;
29 import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.services.rev150526.mef.services.mef.service.mef.service.choice.ipvc.choice.Ipvc;
30 import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.services.rev150526.mef.services.mef.service.mef.service.choice.ipvc.choice.ipvc.Unis;
31 import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.services.rev150526.mef.services.mef.service.mef.service.choice.ipvc.choice.ipvc.VpnElans;
32 import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.services.rev150526.mef.services.mef.service.mef.service.choice.ipvc.choice.ipvc.VpnElansBuilder;
33 import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.services.rev150526.mef.services.mef.service.mef.service.choice.ipvc.choice.ipvc.vpn.elans.Subnets;
34 import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.services.rev150526.mef.services.mef.service.mef.service.choice.ipvc.choice.ipvc.vpn.elans.SubnetsBuilder;
35 import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.types.rev150526.Identifier45;
36 import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.types.rev150526.RetailSvcIdType;
37 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
39 import com.google.common.base.Optional;
41 public class MefServicesUtils {
43 public static InstanceIdentifier<Unis> getIpvcUnisInstanceIdentifier() {
44 return InstanceIdentifier.builder(MefServices.class).child(MefService.class).child(Ipvc.class).child(Unis.class)
48 public static InstanceIdentifier<Evc> getEvcsInstanceIdentifier() {
49 return getMefServiceInstanceIdentifier().child(Evc.class);
52 public static InstanceIdentifier<Evc> getEvcInstanceIdentifier(RetailSvcIdType svcId) {
53 return InstanceIdentifier.create(MefServices.class).child(MefService.class, new MefServiceKey(svcId))
57 public static InstanceIdentifier<MefService> getMefServiceInstanceIdentifier() {
58 return InstanceIdentifier.create(MefServices.class).child(MefService.class);
61 public static InstanceIdentifier<MefServices> getMefServicesInstanceIdentifier() {
62 return InstanceIdentifier.create(MefServices.class);
65 public static InstanceIdentifier<Ipvc> getIpvcsInstanceIdentifier() {
66 return getMefServiceInstanceIdentifier().child(Ipvc.class);
69 public static InstanceIdentifier<Ipvc> getIpvcInstanceIdentifier(RetailSvcIdType svcId) {
70 return InstanceIdentifier.create(MefServices.class).child(MefService.class, new MefServiceKey(svcId))
74 public static VpnElans findVpnForNetwork(Subnet newSubnet, IpvcVpn ipvcVpn) {
75 return findVpnElanForNetwork(newSubnet.getUniId(), newSubnet.getIpUniId(), ipvcVpn);
78 public static VpnElans findVpnElanForNetwork(Identifier45 uniId, Identifier45 ipUniId, IpvcVpn ipvcVpn) {
79 List<VpnElans> vpnElans = ipvcVpn != null && ipvcVpn.getVpnElans() != null ? ipvcVpn.getVpnElans()
80 : Collections.emptyList();
82 for (VpnElans vpnElan : vpnElans) {
83 if (vpnElan.getUniId().equals(uniId) && vpnElan.getIpUniId().equals(ipUniId)) {
90 public static VpnElans findNetwork(Subnet newSubnet, VpnElans vpnElan) {
91 String subnetStr = NetvirtVpnUtils.ipPrefixToString(newSubnet.getSubnet());
92 return findNetwork(subnetStr, vpnElan);
95 public static VpnElans findNetwork(String newSubnet, VpnElans vpnElan) {
96 List<Subnets> subnets = vpnElan != null && vpnElan.getSubnets() != null ? vpnElan.getSubnets()
97 : Collections.emptyList();
98 if (subnets.stream().anyMatch((s) -> s.getSubnet().equals(newSubnet))) {
104 public static Ipvc getIpvc(DataBroker dataBroker, InstanceIdentifier<Ipvc> identifier) {
105 Optional<Ipvc> ipvcVpn = MdsalUtils.read(dataBroker, LogicalDatastoreType.CONFIGURATION, identifier);
106 if (ipvcVpn.isPresent()) {
107 return ipvcVpn.get();
113 public static Evc getEvc(DataBroker dataBroker, InstanceIdentifier<Evc> identifier) {
114 Optional<Evc> evcVpn = MdsalUtils.read(dataBroker, LogicalDatastoreType.CONFIGURATION, identifier);
115 if (evcVpn.isPresent()) {
122 public static IpvcVpn getOperIpvcVpn(DataBroker dataBroker, InstanceIdentifier<Ipvc> identifier) {
123 InstanceIdentifier<IpvcVpn> path = identifier.augmentation(IpvcVpn.class);
124 Optional<IpvcVpn> ipvcVpn = MdsalUtils.read(dataBroker, LogicalDatastoreType.OPERATIONAL, path);
125 if (ipvcVpn.isPresent()) {
126 return ipvcVpn.get();
132 public static void addOperIpvcVpnElan(InstanceIdentifier<Ipvc> identifier, String vpnId, WriteTransaction tx) {
133 addOperIpvcVpnElan(identifier, vpnId, null, tx);
136 public static void addOperIpvcVpnElan(InstanceIdentifier<Ipvc> identifier, String vpnId, String vrfId, WriteTransaction tx) {
138 synchronized (vpnId.intern()) {
139 InstanceIdentifier<IpvcVpn> path = identifier.augmentation(IpvcVpn.class);
141 IpvcVpnBuilder ipvcVpnBuilder = new IpvcVpnBuilder();
142 ipvcVpnBuilder.setVpnId(vpnId);
144 ipvcVpnBuilder.setVrfId(vrfId);
147 tx.merge(LogicalDatastoreType.OPERATIONAL, path, ipvcVpnBuilder.build(), true);
151 public static void addOperIpvcVpnElan(InstanceIdentifier<Ipvc> identifier, String vpnId, Identifier45 uniId,
152 Identifier45 ipUniId, String elanId, String elanPortId, List<String> newSubnets, WriteTransaction tx) {
154 synchronized (vpnId.intern()) {
155 InstanceIdentifier<IpvcVpn> path = identifier.augmentation(IpvcVpn.class);
157 IpvcVpnBuilder ipvcVpnBuilder = new IpvcVpnBuilder();
158 ipvcVpnBuilder.setVpnId(vpnId);
160 List<VpnElans> vpnElansEx = new ArrayList<>();
161 VpnElansBuilder vpnElans = new VpnElansBuilder();
162 vpnElans.setElanId(elanId);
163 vpnElans.setUniId(uniId);
164 vpnElans.setIpUniId(ipUniId);
165 vpnElans.setElanPort(elanPortId);
166 List<Subnets> subnets = new ArrayList<>();
167 if (newSubnets != null) {
168 newSubnets.forEach(s -> {
169 SubnetsBuilder sb = new SubnetsBuilder();
171 subnets.add(sb.build());
174 vpnElans.setSubnets(subnets);
175 vpnElansEx.add(vpnElans.build());
176 ipvcVpnBuilder.setVpnElans(vpnElansEx);
178 tx.merge(LogicalDatastoreType.OPERATIONAL, path, ipvcVpnBuilder.build(), true);
182 public static void addOperIpvcVpnElan(DataBroker dataBroker, InstanceIdentifier<Ipvc> identifier, String vpnId,
183 Identifier45 uniId, Identifier45 ipUniId, String elanId, String elanPortId, List<String> newSubnets) {
184 WriteTransaction tx = MdsalUtils.createTransaction(dataBroker);
185 addOperIpvcVpnElan(identifier, vpnId, uniId, ipUniId, elanId, elanPortId, newSubnets, tx);
186 MdsalUtils.commitTransaction(tx);
189 public static void removeOperIpvcVpn(InstanceIdentifier<Ipvc> identifier, WriteTransaction tx) {
190 final InstanceIdentifier<MefService> serviceId = identifier.firstIdentifierOf(MefService.class);
191 tx.delete(LogicalDatastoreType.OPERATIONAL, serviceId);
194 public static void removeOperIpvcSubnet(DataBroker dataBroker, InstanceIdentifier<Ipvc> identifier, String vpnId,
195 Identifier45 uniId, Identifier45 ipUniId, String elanId, String elanPortId, String deleteSubnet) {
196 InstanceIdentifier<IpvcVpn> path = identifier.augmentation(IpvcVpn.class);
197 IpvcVpn ipvcVpn = getOperIpvcVpn(dataBroker, identifier);
198 if (ipvcVpn == null || ipvcVpn.getVpnElans() == null) {
201 IpvcVpnBuilder ipvcVpnBuilder = new IpvcVpnBuilder(ipvcVpn);
202 List<VpnElans> vpnElansEx = ipvcVpnBuilder.getVpnElans();
204 VpnElans vpnElans = findVpnElanForNetwork(uniId, ipUniId, ipvcVpn);
205 vpnElans = findNetwork(deleteSubnet, vpnElans);
207 if (vpnElans != null) {
208 vpnElansEx.remove(vpnElans);
209 VpnElansBuilder vpnElansB = new VpnElansBuilder(vpnElans);
210 List<Subnets> exSubnets = vpnElansB.getSubnets();
211 List<Subnets> newSubnets = exSubnets.stream().filter(s -> !s.getSubnet().equals(deleteSubnet))
212 .collect(Collectors.toList());
213 vpnElansB.setSubnets(newSubnets);
214 vpnElansEx.add(vpnElansB.build());
216 MdsalUtils.syncWrite(dataBroker, LogicalDatastoreType.OPERATIONAL, path, ipvcVpnBuilder.build());
219 public static void removeOperIpvcElan(DataBroker dataBroker, InstanceIdentifier<Ipvc> identifier, String vpnId,
220 Identifier45 uniId, Identifier45 ipUniId, String elanId, String elanPortId) {
221 InstanceIdentifier<IpvcVpn> path = identifier.augmentation(IpvcVpn.class);
222 IpvcVpn ipvcVpn = getOperIpvcVpn(dataBroker, identifier);
223 if (ipvcVpn == null || ipvcVpn.getVpnElans() == null) {
226 IpvcVpnBuilder ipvcVpnBuilder = new IpvcVpnBuilder(ipvcVpn);
227 List<VpnElans> vpnElansEx = ipvcVpnBuilder.getVpnElans();
229 VpnElans vpnElans = findVpnElanForNetwork(uniId, ipUniId, ipvcVpn);
230 if (vpnElans != null) {
231 vpnElansEx.remove(vpnElans);
233 MdsalUtils.syncWrite(dataBroker, LogicalDatastoreType.OPERATIONAL, path, ipvcVpnBuilder.build());
236 public static List<RetailSvcIdType> getAllIpvcsServiceIds(DataBroker dataBroker) {
237 List<RetailSvcIdType> toReturn = new ArrayList<>();
239 InstanceIdentifier<MefServices> path = MefServicesUtils.getMefServicesInstanceIdentifier();
240 Optional<MefServices> mefServices = MdsalUtils.read(dataBroker, LogicalDatastoreType.CONFIGURATION, path);
241 if (!mefServices.isPresent() || mefServices.get() == null) {
244 for (MefService service : mefServices.get().getMefService()) {
245 if (service.getMefServiceChoice() instanceof IpvcChoice) {
246 toReturn.add(service.getSvcId());
252 public static List<RetailSvcIdType> getAllEvcsServiceIds(DataBroker dataBroker) {
253 List<RetailSvcIdType> toReturn = new ArrayList<>();
255 InstanceIdentifier<MefServices> path = MefServicesUtils.getMefServicesInstanceIdentifier();
256 Optional<MefServices> mefServices = MdsalUtils.read(dataBroker, LogicalDatastoreType.CONFIGURATION, path);
257 if (!mefServices.isPresent() || mefServices.get() == null) {
260 for (MefService service : mefServices.get().getMefService()) {
261 if (service.getMefServiceChoice() instanceof EvcChoice) {
262 toReturn.add(service.getSvcId());
268 public static Optional<MefService> getOpMefServiceBySvcId(DataBroker dataBroker, RetailSvcIdType svcId) {
269 InstanceIdentifier<MefService> mefServiceIdr = InstanceIdentifier.builder(MefServices.class)
270 .child(MefService.class, new MefServiceKey(svcId)).build();
271 return MdsalUtils.read(dataBroker, LogicalDatastoreType.OPERATIONAL, mefServiceIdr);
274 public static VpnElans getVpnElanByIpUniId(List<VpnElans> vpnElansList, String ipUniId) {
275 if (!vpnElansList.isEmpty()) {
276 for (VpnElans vpnElan : vpnElansList) {
277 if (vpnElan.getIpUniId() != null && vpnElan.getIpUniId().getValue().equals(ipUniId)) {
285 public static String getNetworkIdFromOpMefService(MefService opMefService, String unimgrNetworkId) {
286 if (opMefService.getMefServiceChoice() instanceof EvcChoice) {
287 return ((EvcChoice) opMefService.getMefServiceChoice()).getEvc().getAugmentation(EvcElan.class)
289 } else if (opMefService.getMefServiceChoice() instanceof IpvcChoice) {
290 List<VpnElans> vpnElansList = ((IpvcChoice) opMefService.getMefServiceChoice()).getIpvc()
291 .getAugmentation(IpvcVpn.class).getVpnElans();
292 VpnElans vpnElan = MefServicesUtils.getVpnElanByIpUniId(vpnElansList, unimgrNetworkId);
293 if (vpnElan != null) {
294 return vpnElan.getElanId();