add vrf id to vpn operational
[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.IpvcVpn;
21 import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.services.rev150526.IpvcVpnBuilder;
22 import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.services.rev150526.MefServices;
23 import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.services.rev150526.mef.services.MefService;
24 import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.services.rev150526.mef.services.MefServiceKey;
25 import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.services.rev150526.mef.services.mef.service.mef.service.choice.EvcChoice;
26 import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.services.rev150526.mef.services.mef.service.mef.service.choice.IpvcChoice;
27 import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.services.rev150526.mef.services.mef.service.mef.service.choice.evc.choice.Evc;
28 import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.services.rev150526.mef.services.mef.service.mef.service.choice.ipvc.choice.Ipvc;
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.Unis;
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.VpnElans;
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.VpnElansBuilder;
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.vpn.elans.Subnets;
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.SubnetsBuilder;
34 import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.types.rev150526.Identifier45;
35 import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.types.rev150526.RetailSvcIdType;
36 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
37
38 import com.google.common.base.Optional;
39
40 public class MefServicesUtils {
41
42     public static InstanceIdentifier<Unis> getIpvcUnisInstanceIdentifier() {
43         return InstanceIdentifier.builder(MefServices.class).child(MefService.class).child(Ipvc.class).child(Unis.class)
44                 .build();
45     }
46
47     public static InstanceIdentifier<Evc> getEvcsInstanceIdentifier() {
48         return getMefServiceInstanceIdentifier().child(Evc.class);
49     }
50
51     public static InstanceIdentifier<Evc> getEvcInstanceIdentifier(RetailSvcIdType svcId) {
52         return InstanceIdentifier.create(MefServices.class).child(MefService.class, new MefServiceKey(svcId))
53                 .child(Evc.class);
54     }
55
56     public static InstanceIdentifier<MefService> getMefServiceInstanceIdentifier() {
57         return InstanceIdentifier.create(MefServices.class).child(MefService.class);
58     }
59
60     public static InstanceIdentifier<MefServices> getMefServicesInstanceIdentifier() {
61         return InstanceIdentifier.create(MefServices.class);
62     }
63
64     public static InstanceIdentifier<Ipvc> getIpvcsInstanceIdentifier() {
65         return getMefServiceInstanceIdentifier().child(Ipvc.class);
66     }
67
68     public static InstanceIdentifier<Ipvc> getIpvcInstanceIdentifier(RetailSvcIdType svcId) {
69         return InstanceIdentifier.create(MefServices.class).child(MefService.class, new MefServiceKey(svcId))
70                 .child(Ipvc.class);
71     }
72
73     public static VpnElans findVpnForNetwork(Subnet newSubnet, IpvcVpn ipvcVpn) {
74         return findVpnElanForNetwork(newSubnet.getUniId(), newSubnet.getIpUniId(), ipvcVpn);
75     }
76
77     public static VpnElans findVpnElanForNetwork(Identifier45 uniId, Identifier45 ipUniId, IpvcVpn ipvcVpn) {
78         List<VpnElans> vpnElans = ipvcVpn != null && ipvcVpn.getVpnElans() != null ? ipvcVpn.getVpnElans()
79                 : Collections.emptyList();
80
81         for (VpnElans vpnElan : vpnElans) {
82             if (vpnElan.getUniId().equals(uniId) && vpnElan.getIpUniId().equals(ipUniId)) {
83                 return vpnElan;
84             }
85         }
86         return null;
87     }
88
89     public static VpnElans findNetwork(Subnet newSubnet, VpnElans vpnElan) {
90         String subnetStr = NetvirtVpnUtils.ipPrefixToString(newSubnet.getSubnet());
91         return findNetwork(subnetStr, vpnElan);
92     }
93
94     public static VpnElans findNetwork(String newSubnet, VpnElans vpnElan) {
95         List<Subnets> subnets = vpnElan != null && vpnElan.getSubnets() != null ? vpnElan.getSubnets()
96                 : Collections.emptyList();
97         if (subnets.stream().anyMatch((s) -> s.getSubnet().equals(newSubnet))) {
98             return vpnElan;
99         }
100         return null;
101     }
102
103     public static Ipvc getIpvc(DataBroker dataBroker, InstanceIdentifier<Ipvc> identifier) {
104         Optional<Ipvc> ipvcVpn = MdsalUtils.read(dataBroker, LogicalDatastoreType.CONFIGURATION, identifier);
105         if (ipvcVpn.isPresent()) {
106             return ipvcVpn.get();
107         } else {
108             return null;
109         }
110     }
111
112     public static Evc getEvc(DataBroker dataBroker, InstanceIdentifier<Evc> identifier) {
113         Optional<Evc> evcVpn = MdsalUtils.read(dataBroker, LogicalDatastoreType.CONFIGURATION, identifier);
114         if (evcVpn.isPresent()) {
115             return evcVpn.get();
116         } else {
117             return null;
118         }
119     }
120
121     public static IpvcVpn getOperIpvcVpn(DataBroker dataBroker, InstanceIdentifier<Ipvc> identifier) {
122         InstanceIdentifier<IpvcVpn> path = identifier.augmentation(IpvcVpn.class);
123         Optional<IpvcVpn> ipvcVpn = MdsalUtils.read(dataBroker, LogicalDatastoreType.OPERATIONAL, path);
124         if (ipvcVpn.isPresent()) {
125             return ipvcVpn.get();
126         } else {
127             return null;
128         }
129     }
130
131     public static void addOperIpvcVpnElan(InstanceIdentifier<Ipvc> identifier, String vpnId, WriteTransaction tx) {
132         addOperIpvcVpnElan(identifier, vpnId, null, tx);
133     }
134
135     public static void addOperIpvcVpnElan(InstanceIdentifier<Ipvc> identifier, String vpnId, String vrfId, WriteTransaction tx) {
136
137         synchronized (vpnId.intern()) {
138             InstanceIdentifier<IpvcVpn> path = identifier.augmentation(IpvcVpn.class);
139
140             IpvcVpnBuilder ipvcVpnBuilder = new IpvcVpnBuilder();
141             ipvcVpnBuilder.setVpnId(vpnId);
142             if (vrfId != null) {
143                 ipvcVpnBuilder.setVrfId(vrfId);
144             }
145
146             tx.merge(LogicalDatastoreType.OPERATIONAL, path, ipvcVpnBuilder.build(), true);
147         }
148     }
149
150     public static void addOperIpvcVpnElan(InstanceIdentifier<Ipvc> identifier, String vpnId, Identifier45 uniId,
151             Identifier45 ipUniId, String elanId, String elanPortId, List<String> newSubnets, WriteTransaction tx) {
152
153         synchronized (vpnId.intern()) {
154             InstanceIdentifier<IpvcVpn> path = identifier.augmentation(IpvcVpn.class);
155
156             IpvcVpnBuilder ipvcVpnBuilder = new IpvcVpnBuilder();
157             ipvcVpnBuilder.setVpnId(vpnId);
158
159             List<VpnElans> vpnElansEx = new ArrayList<>();
160             VpnElansBuilder vpnElans = new VpnElansBuilder();
161             vpnElans.setElanId(elanId);
162             vpnElans.setUniId(uniId);
163             vpnElans.setIpUniId(ipUniId);
164             vpnElans.setElanPort(elanPortId);
165             List<Subnets> subnets = new ArrayList<>();
166             if (newSubnets != null) {
167                 newSubnets.forEach(s -> {
168                     SubnetsBuilder sb = new SubnetsBuilder();
169                     sb.setSubnet(s);
170                     subnets.add(sb.build());
171                 });
172             }
173             vpnElans.setSubnets(subnets);
174             vpnElansEx.add(vpnElans.build());
175             ipvcVpnBuilder.setVpnElans(vpnElansEx);
176
177             tx.merge(LogicalDatastoreType.OPERATIONAL, path, ipvcVpnBuilder.build(), true);
178         }
179     }
180
181     public static void addOperIpvcVpnElan(DataBroker dataBroker, InstanceIdentifier<Ipvc> identifier, String vpnId,
182             Identifier45 uniId, Identifier45 ipUniId, String elanId, String elanPortId, List<String> newSubnets) {
183         WriteTransaction tx = MdsalUtils.createTransaction(dataBroker);
184         addOperIpvcVpnElan(identifier, vpnId, uniId, ipUniId, elanId, elanPortId, newSubnets, tx);
185         MdsalUtils.commitTransaction(tx);
186     }
187
188     public static void removeOperIpvcVpn(InstanceIdentifier<Ipvc> identifier, WriteTransaction tx) {
189         final InstanceIdentifier<MefService> serviceId = identifier.firstIdentifierOf(MefService.class);
190         tx.delete(LogicalDatastoreType.OPERATIONAL, serviceId);
191     }
192
193     public static void removeOperIpvcSubnet(DataBroker dataBroker, InstanceIdentifier<Ipvc> identifier, String vpnId,
194             Identifier45 uniId, Identifier45 ipUniId, String elanId, String elanPortId, String deleteSubnet) {
195         InstanceIdentifier<IpvcVpn> path = identifier.augmentation(IpvcVpn.class);
196         IpvcVpn ipvcVpn = getOperIpvcVpn(dataBroker, identifier);
197         if (ipvcVpn == null || ipvcVpn.getVpnElans() == null) {
198             return;
199         }
200         IpvcVpnBuilder ipvcVpnBuilder = new IpvcVpnBuilder(ipvcVpn);
201         List<VpnElans> vpnElansEx = ipvcVpnBuilder.getVpnElans();
202
203         VpnElans vpnElans = findVpnElanForNetwork(uniId, ipUniId, ipvcVpn);
204         vpnElans = findNetwork(deleteSubnet, vpnElans);
205
206         if (vpnElans != null) {
207             vpnElansEx.remove(vpnElans);
208             VpnElansBuilder vpnElansB = new VpnElansBuilder(vpnElans);
209             List<Subnets> exSubnets = vpnElansB.getSubnets();
210             List<Subnets> newSubnets = exSubnets.stream().filter(s -> !s.getSubnet().equals(deleteSubnet))
211                     .collect(Collectors.toList());
212             vpnElansB.setSubnets(newSubnets);
213             vpnElansEx.add(vpnElansB.build());
214         }
215         MdsalUtils.syncWrite(dataBroker, LogicalDatastoreType.OPERATIONAL, path, ipvcVpnBuilder.build());
216     }
217
218     public static void removeOperIpvcElan(DataBroker dataBroker, InstanceIdentifier<Ipvc> identifier, String vpnId,
219             Identifier45 uniId, Identifier45 ipUniId, String elanId, String elanPortId) {
220         InstanceIdentifier<IpvcVpn> path = identifier.augmentation(IpvcVpn.class);
221         IpvcVpn ipvcVpn = getOperIpvcVpn(dataBroker, identifier);
222         if (ipvcVpn == null || ipvcVpn.getVpnElans() == null) {
223             return;
224         }
225         IpvcVpnBuilder ipvcVpnBuilder = new IpvcVpnBuilder(ipvcVpn);
226         List<VpnElans> vpnElansEx = ipvcVpnBuilder.getVpnElans();
227
228         VpnElans vpnElans = findVpnElanForNetwork(uniId, ipUniId, ipvcVpn);
229         if (vpnElans != null) {
230             vpnElansEx.remove(vpnElans);
231         }
232         MdsalUtils.syncWrite(dataBroker, LogicalDatastoreType.OPERATIONAL, path, ipvcVpnBuilder.build());
233     }
234
235     public static List<RetailSvcIdType> getAllIpvcsServiceIds(DataBroker dataBroker) {
236         List<RetailSvcIdType> toReturn = new ArrayList<>();
237
238         InstanceIdentifier<MefServices> path = MefServicesUtils.getMefServicesInstanceIdentifier();
239         Optional<MefServices> mefServices = MdsalUtils.read(dataBroker, LogicalDatastoreType.CONFIGURATION, path);
240         if (!mefServices.isPresent() || mefServices.get() == null) {
241             return toReturn;
242         }
243         for (MefService service : mefServices.get().getMefService()) {
244             if (service.getMefServiceChoice() instanceof IpvcChoice) {
245                 toReturn.add(service.getSvcId());
246             }
247         }
248         return toReturn;
249     }
250
251     public static List<RetailSvcIdType> getAllEvcsServiceIds(DataBroker dataBroker) {
252         List<RetailSvcIdType> toReturn = new ArrayList<>();
253
254         InstanceIdentifier<MefServices> path = MefServicesUtils.getMefServicesInstanceIdentifier();
255         Optional<MefServices> mefServices = MdsalUtils.read(dataBroker, LogicalDatastoreType.CONFIGURATION, path);
256         if (!mefServices.isPresent() || mefServices.get() == null) {
257             return toReturn;
258         }
259         for (MefService service : mefServices.get().getMefService()) {
260             if (service.getMefServiceChoice() instanceof EvcChoice) {
261                 toReturn.add(service.getSvcId());
262             }
263         }
264         return toReturn;
265     }
266
267 }