f330e00714781494fe42de435275046a317951a9
[netvirt.git] / vpnmanager / api / src / main / java / org / opendaylight / netvirt / vpnmanager / api / VpnHelper.java
1 /*
2  * Copyright © 2015, 2017 Ericsson India Global Services Pvt Ltd. 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 package org.opendaylight.netvirt.vpnmanager.api;
9
10 import com.google.common.base.Optional;
11
12 import java.util.ArrayList;
13 import java.util.Collections;
14 import java.util.List;
15 import java.util.concurrent.ExecutionException;
16
17 import org.eclipse.jdt.annotation.NonNull;
18 import org.eclipse.jdt.annotation.Nullable;
19 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
20 import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
21 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
22 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.VpnInstanceOpData;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.VpnInstanceToVpnId;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn.instance.op.data.VpnInstanceOpDataEntry;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn.instance.op.data.VpnInstanceOpDataEntryKey;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn.instance.op.data.vpn.instance.op.data.entry.VpnToDpnList;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn.instance.op.data.vpn.instance.op.data.entry.VpnToDpnListKey;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.l3vpn.rev200204.VpnInstances;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.l3vpn.rev200204.VpnInterfaces;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.l3vpn.rev200204.vpn.instances.VpnInstance;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.l3vpn.rev200204.vpn.instances.VpnInstanceKey;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.l3vpn.rev200204.vpn.interfaces.VpnInterface;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.l3vpn.rev200204.vpn.interfaces.VpnInterfaceKey;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.l3vpn.rev200204.vpn.interfaces.vpn._interface.VpnInstanceNames;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.l3vpn.rev200204.vpn.interfaces.vpn._interface.VpnInstanceNames.AssociatedSubnetType;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.l3vpn.rev200204.vpn.interfaces.vpn._interface.VpnInstanceNamesBuilder;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.Subnetmaps;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.subnetmaps.Subnetmap;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.subnetmaps.SubnetmapKey;
41 import org.opendaylight.yangtools.yang.binding.DataObject;
42 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
43 import org.opendaylight.yangtools.yang.common.Uint64;
44
45 public final class VpnHelper {
46     private VpnHelper() {
47
48     }
49
50     //FIXME: Implement caches for DS reads
51     @Nullable
52     public static VpnInstance getVpnInstance(DataBroker broker, String vpnInstanceName) {
53         InstanceIdentifier<VpnInstance> id = InstanceIdentifier.builder(VpnInstances.class).child(VpnInstance.class,
54                 new VpnInstanceKey(vpnInstanceName)).build();
55         Optional<VpnInstance> vpnInstance = read(broker, LogicalDatastoreType.CONFIGURATION, id);
56         return (vpnInstance.isPresent()) ? vpnInstance.get() : null;
57     }
58
59     public static <T extends DataObject> Optional<T> read(DataBroker broker, LogicalDatastoreType datastoreType,
60                                                           InstanceIdentifier<T> path) {
61         try (ReadOnlyTransaction tx = broker.newReadOnlyTransaction()) {
62             return tx.read(datastoreType, path).get();
63         } catch (InterruptedException | ExecutionException e) {
64             throw new RuntimeException(e);
65         }
66     }
67
68     public static List<VpnInstance> getAllVpnInstances(DataBroker broker) {
69         InstanceIdentifier<VpnInstances> id = InstanceIdentifier.builder(VpnInstances.class).build();
70         Optional<VpnInstances> optVpnInstances = read(broker, LogicalDatastoreType.CONFIGURATION, id);
71         if (optVpnInstances.isPresent() && optVpnInstances.get().getVpnInstance() != null) {
72             return optVpnInstances.get().getVpnInstance();
73         } else {
74             return Collections.emptyList();
75         }
76     }
77
78     /**
79      * Retrieves the dataplane identifier of a specific VPN, searching by its
80      * VpnInstance name.
81      *
82      * @param broker dataBroker service reference
83      * @param vpnName Name of the VPN
84      * @return the dataplane identifier of the VPN, the VrfTag.
85      */
86     public static long getVpnId(DataBroker broker, String vpnName) {
87         InstanceIdentifier<org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn.instance.to.vpn
88                 .id.VpnInstance>
89                 id
90                 = getVpnInstanceToVpnIdIdentifier(vpnName);
91         Optional<org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn.instance.to.vpn.id
92                 .VpnInstance>
93                 vpnInstance
94                 = read(broker, LogicalDatastoreType.CONFIGURATION, id);
95         long vpnId = -1;
96         if (vpnInstance.isPresent()) {
97             vpnId = vpnInstance.get().getVpnId().toJava();
98         }
99         return vpnId;
100     }
101
102     static InstanceIdentifier<org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911
103             .vpn.instance.to.vpn.id.VpnInstance> getVpnInstanceToVpnIdIdentifier(String vpnName) {
104         return InstanceIdentifier.builder(VpnInstanceToVpnId.class).child(org.opendaylight.yang.gen.v1.urn
105                 .opendaylight.netvirt.l3vpn.rev130911.vpn.instance.to.vpn.id.VpnInstance.class,
106                 new org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn.instance.to.vpn.id
107                         .VpnInstanceKey(vpnName)).build();
108     }
109
110     @Nullable
111     public static VpnInterface getVpnInterface(DataBroker broker, String vpnInterfaceName) {
112         InstanceIdentifier<VpnInterface> id = getVpnInterfaceIdentifier(vpnInterfaceName);
113         Optional<VpnInterface> vpnInterface = read(broker, LogicalDatastoreType.CONFIGURATION, id);
114         return vpnInterface.isPresent() ? vpnInterface.get() : null;
115     }
116
117     static InstanceIdentifier<VpnInterface> getVpnInterfaceIdentifier(String vpnInterfaceName) {
118         return InstanceIdentifier.builder(VpnInterfaces.class)
119                 .child(VpnInterface.class, new VpnInterfaceKey(vpnInterfaceName)).build();
120     }
121
122     @Nullable
123     public static String getFirstVpnNameFromVpnInterface(final VpnInterface original) {
124         List<VpnInstanceNames> optList = original.getVpnInstanceNames();
125         if (optList != null && !optList.isEmpty()) {
126             return optList.get(0).getVpnName();
127         } else {
128             return null;
129         }
130     }
131
132     @NonNull
133     public static List<String> getVpnInterfaceVpnInstanceNamesString(@Nullable List<VpnInstanceNames> vpnInstanceList) {
134         List<String> listVpn = new ArrayList<>();
135         if (vpnInstanceList != null) {
136             for (VpnInstanceNames vpnInterfaceVpnInstance : vpnInstanceList) {
137                 listVpn.add(vpnInterfaceVpnInstance.getVpnName());
138             }
139         }
140         return listVpn;
141     }
142
143     public static VpnInstanceNames getVpnInterfaceVpnInstanceNames(String vpnName, AssociatedSubnetType subnetType) {
144         return new VpnInstanceNamesBuilder().setVpnName(vpnName).setAssociatedSubnetType(subnetType).build();
145     }
146
147     public static void removeVpnInterfaceVpnInstanceNamesFromList(String vpnName,
148                                List<VpnInstanceNames> vpnInstanceList) {
149         if (vpnInstanceList != null) {
150             vpnInstanceList.removeIf(instance -> vpnName.equals(instance.getVpnName()));
151         }
152     }
153
154     public static boolean doesVpnInterfaceBelongToVpnInstance(String vpnName,
155                                                           List<VpnInstanceNames> vpnInstanceList) {
156         if (vpnInstanceList != null) {
157             for (VpnInstanceNames vpnInstance : vpnInstanceList) {
158                 if (vpnName.equals(vpnInstance.getVpnName())) {
159                     return true;
160                 }
161             }
162         }
163         return false;
164     }
165
166     public static boolean isSubnetPartOfVpn(Subnetmap sn, String vpnName) {
167         if (vpnName == null || sn == null) {
168             return false;
169         }
170         if (sn.getVpnId() == null || !sn.getVpnId().getValue().equals(vpnName)) {
171             return false;
172         }
173         return true;
174     }
175
176     static InstanceIdentifier<Subnetmap> buildSubnetmapIdentifier(Uuid subnetId) {
177         return InstanceIdentifier.builder(Subnetmaps.class)
178         .child(Subnetmap.class, new SubnetmapKey(subnetId)).build();
179
180     }
181
182     /** Get Subnetmap from its Uuid.
183      * @param broker the data broker for look for data
184      * @param subnetUuid the subnet's Uuid
185      * @return the Subnetmap of Uuid or null if it is not found
186      */
187     @Nullable
188     public static Subnetmap getSubnetmapFromItsUuid(DataBroker broker, Uuid subnetUuid) {
189         Subnetmap sn = null;
190         InstanceIdentifier<Subnetmap> id = buildSubnetmapIdentifier(subnetUuid);
191         Optional<Subnetmap> optionalSn = read(broker, LogicalDatastoreType.CONFIGURATION, id);
192         if (optionalSn.isPresent()) {
193             sn = optionalSn.get();
194         }
195         return sn;
196     }
197
198     public static InstanceIdentifier<VpnToDpnList> getVpnToDpnListIdentifier(String rd, Uint64 dpnId) {
199         return InstanceIdentifier.builder(VpnInstanceOpData.class)
200                 .child(VpnInstanceOpDataEntry.class, new VpnInstanceOpDataEntryKey(rd))
201                 .child(VpnToDpnList.class, new VpnToDpnListKey(dpnId)).build();
202     }
203
204 }