fix for BUG_7341
[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.evc.choice.Evc;
26 import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.services.rev150526.mef.services.mef.service.mef.service.choice.ipvc.choice.Ipvc;
27 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;
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.VpnElans;
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.VpnElansBuilder;
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.vpn.elans.Subnets;
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.vpn.elans.SubnetsBuilder;
32 import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.types.rev150526.Identifier45;
33 import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.types.rev150526.RetailSvcIdType;
34 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
35
36 import com.google.common.base.Optional;
37
38 public class MefServicesUtils {
39
40     public static InstanceIdentifier<Unis> getIpvcUnisInstanceIdentifier() {
41         return InstanceIdentifier.builder(MefServices.class).child(MefService.class).child(Ipvc.class).child(Unis.class)
42                 .build();
43     }
44
45     public static InstanceIdentifier<Evc> getEvcsInstanceIdentifier() {
46         return getMefServiceInstanceIdentifier().child(Evc.class);
47     }
48
49     public static InstanceIdentifier<MefService> getMefServiceInstanceIdentifier() {
50         return InstanceIdentifier.create(MefServices.class).child(MefService.class);
51     }
52
53     public static InstanceIdentifier<MefServices> getMefServicesInstanceIdentifier() {
54         return InstanceIdentifier.create(MefServices.class);
55     }
56
57     public static InstanceIdentifier<Ipvc> getIpvcsInstanceIdentifier() {
58         return InstanceIdentifier.create(MefServices.class).child(MefService.class).child(Ipvc.class);
59     }
60
61     public static InstanceIdentifier<Ipvc> getIpvcsInstanceIdentifier(RetailSvcIdType svcId) {
62         return InstanceIdentifier.create(MefServices.class).child(MefService.class, new MefServiceKey(svcId))
63                 .child(Ipvc.class);
64     }
65
66     public static VpnElans findVpnForNetwork(Subnet newSubnet, IpvcVpn ipvcVpn) {
67         return findVpnElanForNetwork(newSubnet.getUniId(), newSubnet.getIpUniId(), ipvcVpn);
68     }
69
70     public static VpnElans findVpnElanForNetwork(Identifier45 uniId, Identifier45 ipUniId, IpvcVpn ipvcVpn) {
71         List<VpnElans> vpnElans = ipvcVpn != null && ipvcVpn.getVpnElans() != null ? ipvcVpn.getVpnElans()
72                 : Collections.emptyList();
73
74         for (VpnElans vpnElan : vpnElans) {
75             if (vpnElan.getUniId().equals(uniId) && vpnElan.getIpUniId().equals(ipUniId)) {
76                 return vpnElan;
77             }
78         }
79         return null;
80     }
81
82     public static VpnElans findNetwork(Subnet newSubnet, VpnElans vpnElan) {
83         String subnetStr = NetvirtVpnUtils.ipPrefixToString(newSubnet.getSubnet());
84         return findNetwork(subnetStr, vpnElan);
85     }
86
87     public static VpnElans findNetwork(String newSubnet, VpnElans vpnElan) {
88         List<Subnets> subnets = vpnElan != null && vpnElan.getSubnets() != null ? vpnElan.getSubnets()
89                 : Collections.emptyList();
90         if (subnets.stream().anyMatch((s) -> s.getSubnet().equals(newSubnet))) {
91             return vpnElan;
92         }
93         return null;
94     }
95
96     public static IpvcVpn getOperIpvcVpn(DataBroker dataBroker, InstanceIdentifier<Ipvc> identifier) {
97         InstanceIdentifier<IpvcVpn> path = identifier.augmentation(IpvcVpn.class);
98         Optional<IpvcVpn> ipvcVpn = MdsalUtils.read(dataBroker, LogicalDatastoreType.OPERATIONAL, path);
99         if (ipvcVpn.isPresent()) {
100             return ipvcVpn.get();
101         } else {
102             return null;
103         }
104     }
105
106     public static void addOperIpvcVpnElan(InstanceIdentifier<Ipvc> identifier, String vpnId, WriteTransaction tx) {
107
108         synchronized (vpnId.intern()) {
109             InstanceIdentifier<IpvcVpn> path = identifier.augmentation(IpvcVpn.class);
110
111             IpvcVpnBuilder ipvcVpnBuilder = new IpvcVpnBuilder();
112             ipvcVpnBuilder.setVpnId(vpnId);
113
114             tx.merge(LogicalDatastoreType.OPERATIONAL, path, ipvcVpnBuilder.build(), true);
115         }
116     }
117
118     public static void addOperIpvcVpnElan(InstanceIdentifier<Ipvc> identifier, String vpnId, Identifier45 uniId,
119             Identifier45 ipUniId, String elanId, String elanPortId, List<String> newSubnets, WriteTransaction tx) {
120
121         synchronized (vpnId.intern()) {
122             InstanceIdentifier<IpvcVpn> path = identifier.augmentation(IpvcVpn.class);
123
124             IpvcVpnBuilder ipvcVpnBuilder = new IpvcVpnBuilder();
125             ipvcVpnBuilder.setVpnId(vpnId);
126
127             List<VpnElans> vpnElansEx = new ArrayList<>();
128             VpnElansBuilder vpnElans = new VpnElansBuilder();
129             vpnElans.setElanId(elanId);
130             vpnElans.setUniId(uniId);
131             vpnElans.setIpUniId(ipUniId);
132             vpnElans.setElanPort(elanPortId);
133             List<Subnets> subnets = new ArrayList<>();
134             if (newSubnets != null) {
135                 newSubnets.forEach(s -> {
136                     SubnetsBuilder sb = new SubnetsBuilder();
137                     sb.setSubnet(s);
138                     subnets.add(sb.build());
139                 });
140             }
141             vpnElans.setSubnets(subnets);
142             vpnElansEx.add(vpnElans.build());
143             ipvcVpnBuilder.setVpnElans(vpnElansEx);
144
145             tx.merge(LogicalDatastoreType.OPERATIONAL, path, ipvcVpnBuilder.build(), true);
146         }
147     }
148
149     public static void addOperIpvcVpnElan(DataBroker dataBroker, InstanceIdentifier<Ipvc> identifier, String vpnId,
150             Identifier45 uniId, Identifier45 ipUniId, String elanId, String elanPortId, List<String> newSubnets) {
151         WriteTransaction tx = MdsalUtils.createTransaction(dataBroker);
152         addOperIpvcVpnElan(identifier, vpnId, uniId, ipUniId, elanId, elanPortId, newSubnets, tx);
153         MdsalUtils.commitTransaction(tx);
154     }
155
156     public static void removeOperIpvcVpn(InstanceIdentifier<Ipvc> identifier, WriteTransaction tx) {
157         final InstanceIdentifier<MefService> serviceId = identifier.firstIdentifierOf(MefService.class);
158         tx.delete(LogicalDatastoreType.OPERATIONAL, serviceId);
159     }
160
161     public static void removeOperIpvcSubnet(DataBroker dataBroker, InstanceIdentifier<Ipvc> identifier, String vpnId,
162             Identifier45 uniId, Identifier45 ipUniId, String elanId, String elanPortId, String deleteSubnet) {
163         InstanceIdentifier<IpvcVpn> path = identifier.augmentation(IpvcVpn.class);
164         IpvcVpn ipvcVpn = getOperIpvcVpn(dataBroker, identifier);
165         if (ipvcVpn == null || ipvcVpn.getVpnElans() == null) {
166             return;
167         }
168         IpvcVpnBuilder ipvcVpnBuilder = new IpvcVpnBuilder(ipvcVpn);
169         List<VpnElans> vpnElansEx = ipvcVpnBuilder.getVpnElans();
170
171         VpnElans vpnElans = findVpnElanForNetwork(uniId, ipUniId, ipvcVpn);
172         vpnElans = findNetwork(deleteSubnet, vpnElans);
173
174         if (vpnElans != null) {
175             vpnElansEx.remove(vpnElans);
176             VpnElansBuilder vpnElansB = new VpnElansBuilder(vpnElans);
177             List<Subnets> exSubnets = vpnElansB.getSubnets();
178             List<Subnets> newSubnets = exSubnets.stream().filter(s -> !s.getSubnet().equals(deleteSubnet))
179                     .collect(Collectors.toList());
180             vpnElansB.setSubnets(newSubnets);
181             vpnElansEx.add(vpnElansB.build());
182         }
183         MdsalUtils.syncWrite(dataBroker, LogicalDatastoreType.OPERATIONAL, path, ipvcVpnBuilder.build());
184     }
185
186     public static void removeOperIpvcElan(DataBroker dataBroker, InstanceIdentifier<Ipvc> identifier, String vpnId,
187             Identifier45 uniId, Identifier45 ipUniId, String elanId, String elanPortId) {
188         InstanceIdentifier<IpvcVpn> path = identifier.augmentation(IpvcVpn.class);
189         IpvcVpn ipvcVpn = getOperIpvcVpn(dataBroker, identifier);
190         if (ipvcVpn == null || ipvcVpn.getVpnElans() == null) {
191             return;
192         }
193         IpvcVpnBuilder ipvcVpnBuilder = new IpvcVpnBuilder(ipvcVpn);
194         List<VpnElans> vpnElansEx = ipvcVpnBuilder.getVpnElans();
195
196         VpnElans vpnElans = findVpnElanForNetwork(uniId, ipUniId, ipvcVpn);
197         if (vpnElans != null) {
198             vpnElansEx.remove(vpnElans);
199         }
200         MdsalUtils.syncWrite(dataBroker, LogicalDatastoreType.OPERATIONAL, path, ipvcVpnBuilder.build());
201     }
202
203 }