Add l3vpn support
[unimgr.git] / netvirt / src / main / java / org / opendaylight / unimgr / mef / netvirt / MefUtils.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 org.opendaylight.controller.md.sal.binding.api.DataBroker;
12 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
13 import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.interfaces.rev150526.MefInterfaces;
14 import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.interfaces.rev150526.mef.interfaces.Unis;
15 import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.interfaces.rev150526.mef.interfaces.unis.Uni;
16 import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.interfaces.rev150526.mef.interfaces.unis.UniKey;
17 import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.interfaces.rev150526.mef.interfaces.unis.uni.IpUnis;
18 import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.interfaces.rev150526.mef.interfaces.unis.uni.PhysicalLayers;
19 import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.interfaces.rev150526.mef.interfaces.unis.uni.ip.unis.IpUni;
20 import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.interfaces.rev150526.mef.interfaces.unis.uni.ip.unis.IpUniKey;
21 import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.interfaces.rev150526.mef.interfaces.unis.uni.physical.layers.Links;
22 import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.interfaces.rev150526.mef.interfaces.unis.uni.physical.layers.links.Link;
23 import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.interfaces.rev150526.mef.interfaces.unis.uni.physical.layers.links.LinkKey;
24 import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.services.rev150526.MefServices;
25 import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.services.rev150526.mef.services.MefService;
26 import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.services.rev150526.mef.services.MefServiceKey;
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.evc.choice.EvcBuilder;
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.topology.rev150526.MefTopology;
31 import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.topology.rev150526.mef.topology.Devices;
32 import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.topology.rev150526.mef.topology.devices.Device;
33 import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.topology.rev150526.mef.topology.devices.DeviceKey;
34 import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.topology.rev150526.mef.topology.devices.device.Interfaces;
35 import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.topology.rev150526.mef.topology.devices.device.interfaces.Interface;
36 import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.topology.rev150526.mef.topology.devices.device.interfaces.InterfaceKey;
37 import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.types.rev150526.EvcIdType;
38 import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.types.rev150526.EvcType;
39 import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.types.rev150526.Identifier45;
40 import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.types.rev150526.RetailSvcIdType;
41 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpPrefix;
42 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
43 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
44 import org.slf4j.Logger;
45 import org.slf4j.LoggerFactory;
46
47 import com.google.common.base.Optional;
48
49 public final class MefUtils {
50     @SuppressWarnings("unused")
51     private static final Logger logger = LoggerFactory.getLogger(MefUtils.class);
52
53     public static InstanceIdentifier<Interface> getDeviceInterfaceInstanceIdentifier(String deviceId,
54             String interfaceId) {
55         return InstanceIdentifier.builder(MefTopology.class).child(Devices.class)
56                 .child(Device.class, new DeviceKey(new Identifier45(deviceId))).child(Interfaces.class)
57                 .child(Interface.class, new InterfaceKey(new Identifier45(interfaceId))).build();
58     }
59
60     public static InstanceIdentifier<Uni> getUniInstanceIdentifier(String uniId) {
61         return InstanceIdentifier.builder(MefInterfaces.class).child(Unis.class)
62                 .child(Uni.class, new UniKey(new Identifier45(uniId))).build();
63     }
64
65     public static InstanceIdentifier<Uni> getUniListInterfaceInstanceIdentifier() {
66         return InstanceIdentifier.builder(MefInterfaces.class).child(Unis.class).child(Uni.class).build();
67     }
68
69     public static InstanceIdentifier<org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.services.rev150526.mef.services.mef.service.mef.service.choice.evc.choice.evc.Unis> getUnisInstanceIdentifier(
70             String evcId) {
71         return InstanceIdentifier.builder(MefServices.class)
72                 .child(MefService.class, new MefServiceKey(RetailSvcIdType.getDefaultInstance(evcId))).child(Evc.class)
73                 .child(org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.services.rev150526.mef.services.mef.service.mef.service.choice.evc.choice.evc.Unis.class)
74                 .build();
75     }
76
77     public static InstanceIdentifier<org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.services.rev150526.mef.services.mef.service.mef.service.choice.evc.choice.evc.unis.Uni> getEvcUniInstanceIdentifier(
78             String uniId) {
79         return InstanceIdentifier.builder(MefServices.class).child(MefService.class).child(Evc.class)
80                 .child(org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.services.rev150526.mef.services.mef.service.mef.service.choice.evc.choice.evc.Unis.class)
81                 .child(org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.services.rev150526.mef.services.mef.service.mef.service.choice.evc.choice.evc.unis.Uni.class,
82                         new org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.services.rev150526.mef.services.mef.service.mef.service.choice.evc.choice.evc.unis.UniKey(
83                                 new Identifier45(uniId)))
84                 .build();
85     }
86
87     public static InstanceIdentifier<Link> getUniLinkInstanceIdentifier(String uniId, String deviceId,
88             String interfaceId) {
89         return InstanceIdentifier.builder(MefInterfaces.class).child(Unis.class)
90                 .child(Uni.class, new UniKey(new Identifier45(uniId))).child(PhysicalLayers.class).child(Links.class)
91                 .child(Link.class, new LinkKey(new Identifier45(deviceId), interfaceId)).build();
92     }
93
94     public static InstanceIdentifier<IpUni> getIpUniInstanceIdentifier(String uniId, String ipUniId) {
95         return InstanceIdentifier.builder(MefInterfaces.class).child(Unis.class)
96                 .child(Uni.class, new UniKey(new Identifier45(uniId))).child(IpUnis.class)
97                 .child(IpUni.class, new IpUniKey(new Identifier45(ipUniId))).build();
98     }
99
100     public static InstanceIdentifier<Evc> getEvcInstanceIdentifier() {
101         return getMefServiceInstanceIdentifier().child(Evc.class);
102     }
103
104     public static InstanceIdentifier<MefService> getMefServiceInstanceIdentifier() {
105         return InstanceIdentifier.create(MefServices.class).child(MefService.class);
106     }
107
108     public static InstanceIdentifier<MefService> getMefServiceInstanceIdentifier(RetailSvcIdType retailSvcIdType) {
109         return InstanceIdentifier.create(MefServices.class).child(MefService.class, new MefServiceKey(retailSvcIdType));
110     }
111
112     public static InstanceIdentifier<MefServices> getMefServicesInstanceIdentifier() {
113         return InstanceIdentifier.create(MefServices.class);
114     }
115
116     public static void createEvcInstance(DataBroker dataBroker, String instanceName) {
117         Evc einst = createEvcInstance(instanceName);
118
119         MdsalUtils.syncWrite(dataBroker, LogicalDatastoreType.CONFIGURATION,
120                 getEvcInstanceInstanceIdentifier(instanceName), einst);
121     }
122
123     private static InstanceIdentifier<Evc> getEvcInstanceInstanceIdentifier(String instanceName) {
124         return InstanceIdentifier.builder(MefServices.class)
125                 .child(MefService.class, new MefServiceKey(RetailSvcIdType.getDefaultInstance(instanceName)))
126                 .child(Evc.class).build();
127     }
128
129     private static InstanceIdentifier<org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.services.rev150526.mef.services.mef.service.mef.service.choice.evc.choice.evc.unis.Uni> getEvcUniInstanceIdentifier(
130             String serviceName, String uniId) {
131         return InstanceIdentifier.builder(MefServices.class)
132                 .child(MefService.class, new MefServiceKey(RetailSvcIdType.getDefaultInstance(serviceName)))
133                 .child(Evc.class)
134                 .child(org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.services.rev150526.mef.services.mef.service.mef.service.choice.evc.choice.evc.Unis.class)
135                 .child(org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.services.rev150526.mef.services.mef.service.mef.service.choice.evc.choice.evc.unis.Uni.class, //
136                         new org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.services.rev150526.mef.services.mef.service.mef.service.choice.evc.choice.evc.unis.UniKey(
137                                 Identifier45.getDefaultInstance(uniId)))
138                 .build();
139     }
140
141     private static Evc createEvcInstance(String instanceName) {
142         EvcBuilder evcBuilder = new EvcBuilder();
143         evcBuilder.setAdminStateEnabled(false);
144         evcBuilder.setEvcId(EvcIdType.getDefaultInstance(instanceName));
145         evcBuilder.setEvcType(EvcType.MultipointToMultipoint);
146         return evcBuilder.build();
147     }
148
149     public static Boolean EvcExists(DataBroker dataBroker, String instanceName) {
150         Optional<Evc> evc = getEvc(dataBroker, instanceName);
151         return evc.isPresent();
152     }
153
154     public static Boolean isEvcAdminStateEnabled(DataBroker dataBroker, String instanceName) {
155         Optional<Evc> evc = getEvc(dataBroker, instanceName);
156         return evc.isPresent() && evc.get().isAdminStateEnabled();
157
158     }
159
160     public static Optional<Evc> getEvc(DataBroker dataBroker, String instanceName) {
161         Optional<Evc> evc = MdsalUtils.read(dataBroker, LogicalDatastoreType.CONFIGURATION,
162                 getEvcInstanceInstanceIdentifier(instanceName));
163         return evc;
164     }
165
166     public static Boolean EvcUniExists(DataBroker dataBroker, String instanceName, String uniId) {
167         logger.info("searching for uni id {} in service {}", uniId, instanceName);
168         Optional<org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.services.rev150526.mef.services.mef.service.mef.service.choice.evc.choice.evc.unis.Uni> uni = MdsalUtils
169                 .read(dataBroker, LogicalDatastoreType.CONFIGURATION, getEvcUniInstanceIdentifier(instanceName, uniId));
170         if (uni.isPresent()) {
171             logger.info("found uni");
172         } else {
173             logger.info("no uni");
174         }
175         return uni.isPresent();
176     }
177
178     public static String getTrunkParentName(Link link) {
179         String interfaceName = link.getInterface().toString();
180         return interfaceName;
181     }
182
183     public static String getInterfaceName(Link link, String uniId) {
184         String device = link.getDevice().getValue();
185         return NetvirtUtils.getDeviceInterfaceName(device, uniId);
186     }
187
188     public static InstanceIdentifier<Ipvc> getIpvcInstanceIdentifier() {
189         return InstanceIdentifier.create(MefServices.class).child(MefService.class).child(Ipvc.class);
190     }
191
192     public static String ipPrefixToString(IpPrefix ipAddress) {
193         if (ipAddress.getIpv4Prefix() != null) {
194             return ipAddress.getIpv4Prefix().getValue();
195         }
196
197         return ipAddress.getIpv6Prefix().getValue();
198     }
199
200     public static String ipAddressToString(IpAddress ipAddress) {
201         if (ipAddress.getIpv4Address() != null) {
202             return ipAddress.getIpv4Address().getValue();
203         }
204
205         return ipAddress.getIpv6Address().getValue();
206     }
207
208 }