implement unimgr api to netvirt dhcp allocation pool service
[unimgr.git] / netvirt / src / main / java / org / opendaylight / unimgr / mef / netvirt / MefServicesUtils.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 java.util.ArrayList;
12 import java.util.Collections;
13 import java.util.List;
14 import java.util.stream.Collectors;
15
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;
38
39 import com.google.common.base.Optional;
40
41 public class MefServicesUtils {
42
43     public static InstanceIdentifier<Unis> getIpvcUnisInstanceIdentifier() {
44         return InstanceIdentifier.builder(MefServices.class).child(MefService.class).child(Ipvc.class).child(Unis.class)
45                 .build();
46     }
47
48     public static InstanceIdentifier<Evc> getEvcsInstanceIdentifier() {
49         return getMefServiceInstanceIdentifier().child(Evc.class);
50     }
51
52     public static InstanceIdentifier<Evc> getEvcInstanceIdentifier(RetailSvcIdType svcId) {
53         return InstanceIdentifier.create(MefServices.class).child(MefService.class, new MefServiceKey(svcId))
54                 .child(Evc.class);
55     }
56
57     public static InstanceIdentifier<MefService> getMefServiceInstanceIdentifier() {
58         return InstanceIdentifier.create(MefServices.class).child(MefService.class);
59     }
60
61     public static InstanceIdentifier<MefServices> getMefServicesInstanceIdentifier() {
62         return InstanceIdentifier.create(MefServices.class);
63     }
64
65     public static InstanceIdentifier<Ipvc> getIpvcsInstanceIdentifier() {
66         return getMefServiceInstanceIdentifier().child(Ipvc.class);
67     }
68
69     public static InstanceIdentifier<Ipvc> getIpvcInstanceIdentifier(RetailSvcIdType svcId) {
70         return InstanceIdentifier.create(MefServices.class).child(MefService.class, new MefServiceKey(svcId))
71                 .child(Ipvc.class);
72     }
73
74     public static VpnElans findVpnForNetwork(Subnet newSubnet, IpvcVpn ipvcVpn) {
75         return findVpnElanForNetwork(newSubnet.getUniId(), newSubnet.getIpUniId(), ipvcVpn);
76     }
77
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();
81
82         for (VpnElans vpnElan : vpnElans) {
83             if (vpnElan.getUniId().equals(uniId) && vpnElan.getIpUniId().equals(ipUniId)) {
84                 return vpnElan;
85             }
86         }
87         return null;
88     }
89
90     public static VpnElans findNetwork(Subnet newSubnet, VpnElans vpnElan) {
91         String subnetStr = NetvirtVpnUtils.ipPrefixToString(newSubnet.getSubnet());
92         return findNetwork(subnetStr, vpnElan);
93     }
94
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))) {
99             return vpnElan;
100         }
101         return null;
102     }
103
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();
108         } else {
109             return null;
110         }
111     }
112
113     public static Evc getEvc(DataBroker dataBroker, InstanceIdentifier<Evc> identifier) {
114         Optional<Evc> evcVpn = MdsalUtils.read(dataBroker, LogicalDatastoreType.CONFIGURATION, identifier);
115         if (evcVpn.isPresent()) {
116             return evcVpn.get();
117         } else {
118             return null;
119         }
120     }
121
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();
127         } else {
128             return null;
129         }
130     }
131
132     public static void addOperIpvcVpnElan(InstanceIdentifier<Ipvc> identifier, String vpnId, WriteTransaction tx) {
133         addOperIpvcVpnElan(identifier, vpnId, null, tx);
134     }
135
136     public static void addOperIpvcVpnElan(InstanceIdentifier<Ipvc> identifier, String vpnId, String vrfId, WriteTransaction tx) {
137
138         synchronized (vpnId.intern()) {
139             InstanceIdentifier<IpvcVpn> path = identifier.augmentation(IpvcVpn.class);
140
141             IpvcVpnBuilder ipvcVpnBuilder = new IpvcVpnBuilder();
142             ipvcVpnBuilder.setVpnId(vpnId);
143             if (vrfId != null) {
144                 ipvcVpnBuilder.setVrfId(vrfId);
145             }
146
147             tx.merge(LogicalDatastoreType.OPERATIONAL, path, ipvcVpnBuilder.build(), true);
148         }
149     }
150
151     public static void addOperIpvcVpnElan(InstanceIdentifier<Ipvc> identifier, String vpnId, Identifier45 uniId,
152             Identifier45 ipUniId, String elanId, String elanPortId, List<String> newSubnets, WriteTransaction tx) {
153
154         synchronized (vpnId.intern()) {
155             InstanceIdentifier<IpvcVpn> path = identifier.augmentation(IpvcVpn.class);
156
157             IpvcVpnBuilder ipvcVpnBuilder = new IpvcVpnBuilder();
158             ipvcVpnBuilder.setVpnId(vpnId);
159
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();
170                     sb.setSubnet(s);
171                     subnets.add(sb.build());
172                 });
173             }
174             vpnElans.setSubnets(subnets);
175             vpnElansEx.add(vpnElans.build());
176             ipvcVpnBuilder.setVpnElans(vpnElansEx);
177
178             tx.merge(LogicalDatastoreType.OPERATIONAL, path, ipvcVpnBuilder.build(), true);
179         }
180     }
181
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);
187     }
188
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);
192     }
193
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) {
199             return;
200         }
201         IpvcVpnBuilder ipvcVpnBuilder = new IpvcVpnBuilder(ipvcVpn);
202         List<VpnElans> vpnElansEx = ipvcVpnBuilder.getVpnElans();
203
204         VpnElans vpnElans = findVpnElanForNetwork(uniId, ipUniId, ipvcVpn);
205         vpnElans = findNetwork(deleteSubnet, vpnElans);
206
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());
215         }
216         MdsalUtils.syncWrite(dataBroker, LogicalDatastoreType.OPERATIONAL, path, ipvcVpnBuilder.build());
217     }
218
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) {
224             return;
225         }
226         IpvcVpnBuilder ipvcVpnBuilder = new IpvcVpnBuilder(ipvcVpn);
227         List<VpnElans> vpnElansEx = ipvcVpnBuilder.getVpnElans();
228
229         VpnElans vpnElans = findVpnElanForNetwork(uniId, ipUniId, ipvcVpn);
230         if (vpnElans != null) {
231             vpnElansEx.remove(vpnElans);
232         }
233         MdsalUtils.syncWrite(dataBroker, LogicalDatastoreType.OPERATIONAL, path, ipvcVpnBuilder.build());
234     }
235
236     public static List<RetailSvcIdType> getAllIpvcsServiceIds(DataBroker dataBroker) {
237         List<RetailSvcIdType> toReturn = new ArrayList<>();
238
239         InstanceIdentifier<MefServices> path = MefServicesUtils.getMefServicesInstanceIdentifier();
240         Optional<MefServices> mefServices = MdsalUtils.read(dataBroker, LogicalDatastoreType.CONFIGURATION, path);
241         if (!mefServices.isPresent() || mefServices.get() == null) {
242             return toReturn;
243         }
244         for (MefService service : mefServices.get().getMefService()) {
245             if (service.getMefServiceChoice() instanceof IpvcChoice) {
246                 toReturn.add(service.getSvcId());
247             }
248         }
249         return toReturn;
250     }
251
252     public static List<RetailSvcIdType> getAllEvcsServiceIds(DataBroker dataBroker) {
253         List<RetailSvcIdType> toReturn = new ArrayList<>();
254
255         InstanceIdentifier<MefServices> path = MefServicesUtils.getMefServicesInstanceIdentifier();
256         Optional<MefServices> mefServices = MdsalUtils.read(dataBroker, LogicalDatastoreType.CONFIGURATION, path);
257         if (!mefServices.isPresent() || mefServices.get() == null) {
258             return toReturn;
259         }
260         for (MefService service : mefServices.get().getMefService()) {
261             if (service.getMefServiceChoice() instanceof EvcChoice) {
262                 toReturn.add(service.getSvcId());
263             }
264         }
265         return toReturn;
266     }
267
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);
272     }
273
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)) {
278                     return vpnElan;
279                 }
280             }
281         }
282         return null;
283     }
284
285     public static String getNetworkIdFromOpMefService(MefService opMefService, String unimgrNetworkId) {
286         if (opMefService.getMefServiceChoice() instanceof EvcChoice) {
287             return ((EvcChoice) opMefService.getMefServiceChoice()).getEvc().getAugmentation(EvcElan.class)
288                     .getElanId();
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();
295             }
296         }
297         return null;
298     }
299
300 }