blob: a883ef6e95c3748e14b63f7c190d8812960fe088 [file] [log] [blame]
janani b35f6cbc2017-03-24 21:56:58 +05301/*
Brian O'Connora09fe5b2017-08-03 21:12:30 -07002 * Copyright 2017-present Open Networking Foundation
janani b35f6cbc2017-03-24 21:56:58 +05303 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package org.onosproject.l3vpn.netl3vpn.impl;
18
19import org.onosproject.l3vpn.netl3vpn.FullMeshVpnConfig;
20import org.onosproject.l3vpn.netl3vpn.HubSpokeVpnConfig;
21import org.onosproject.l3vpn.netl3vpn.VpnInstance;
22import org.onosproject.l3vpn.netl3vpn.VpnSiteRole;
Vidyashree Rama04147ca2017-05-26 11:32:47 +053023import org.onosproject.yang.gen.v1.ietfbgpl3vpn.rev20160909.ietfbgpl3vpn.devices.device.networkinstances.networkinstance.AugmentedNiNetworkInstance;
24import org.onosproject.yang.gen.v1.ietfbgpl3vpn.rev20160909.ietfbgpl3vpn.devices.device.networkinstances.networkinstance.DefaultAugmentedNiNetworkInstance;
25import org.onosproject.yang.gen.v1.ietfbgpl3vpn.rev20160909.ietfbgpl3vpn.devices.device.networkinstances.networkinstance.augmentedninetworkinstance.DefaultL3Vpn;
26import org.onosproject.yang.gen.v1.ietfbgpl3vpn.rev20160909.ietfbgpl3vpn.devices.device.networkinstances.networkinstance.augmentedninetworkinstance.L3Vpn;
27import org.onosproject.yang.gen.v1.ietfbgpl3vpn.rev20160909.ietfbgpl3vpn.l3vpnvrfparams.DefaultIpv4;
28import org.onosproject.yang.gen.v1.ietfbgpl3vpn.rev20160909.ietfbgpl3vpn.l3vpnvrfparams.DefaultIpv6;
29import org.onosproject.yang.gen.v1.ietfbgpl3vpn.rev20160909.ietfbgpl3vpn.l3vpnvrfparams.Ipv4;
30import org.onosproject.yang.gen.v1.ietfbgpl3vpn.rev20160909.ietfbgpl3vpn.l3vpnvrfparams.Ipv6;
31import org.onosproject.yang.gen.v1.ietfbgpl3vpn.rev20160909.ietfbgpl3vpn.l3vpnvrfparams.ipv4.DefaultUnicast;
32import org.onosproject.yang.gen.v1.ietfbgpl3vpn.rev20160909.ietfbgpl3vpn.l3vpnvrfparams.ipv4.Unicast;
33import org.onosproject.yang.gen.v1.ietfbgpl3vpn.rev20160909.ietfbgpl3vpn.routedistinguisherparams.DefaultRouteDistinguisher;
34import org.onosproject.yang.gen.v1.ietfbgpl3vpn.rev20160909.ietfbgpl3vpn.routedistinguisherparams.RouteDistinguisher;
35import org.onosproject.yang.gen.v1.ietfbgpl3vpn.rev20160909.ietfbgpl3vpn.routetargetparams.DefaultRouteTargets;
36import org.onosproject.yang.gen.v1.ietfbgpl3vpn.rev20160909.ietfbgpl3vpn.routetargetparams.RouteTargets;
37import org.onosproject.yang.gen.v1.ietfbgpl3vpn.rev20160909.ietfbgpl3vpn.routetargetparams.routetargets.Config;
38import org.onosproject.yang.gen.v1.ietfbgpl3vpn.rev20160909.ietfbgpl3vpn.routetargetparams.routetargets.DefaultConfig;
39import org.onosproject.yang.gen.v1.ietfbgpl3vpn.rev20160909.ietfbgpl3vpn.routetargetset.DefaultRts;
40import org.onosproject.yang.gen.v1.ietfbgpl3vpn.rev20160909.ietfbgpl3vpn.routetargetset.Rts;
41import org.onosproject.yang.gen.v1.ietfbgpl3vpn.rev20160909.ietfbgpl3vpn.routetargetset.rts.RtTypeEnum;
42import org.onosproject.yang.gen.v1.ietfl3vpnsvc.rev20160730.ietfl3vpnsvc.siteattachmentipconnection.IpConnection;
43import org.onosproject.yang.gen.v1.ietfnetworkinstance.rev20160623.ietfnetworkinstance.devices.device.DefaultNetworkInstances;
44import org.onosproject.yang.gen.v1.ietfnetworkinstance.rev20160623.ietfnetworkinstance.devices.device.NetworkInstances;
45import org.onosproject.yang.gen.v1.ietfnetworkinstance.rev20160623.ietfnetworkinstance.devices.device.networkinstances.DefaultNetworkInstance;
46import org.onosproject.yang.gen.v1.ietfnetworkinstance.rev20160623.ietfnetworkinstance.devices.device.networkinstances.NetworkInstance;
janani b35f6cbc2017-03-24 21:56:58 +053047
48import java.util.LinkedList;
49import java.util.List;
50
51import static org.onosproject.l3vpn.netl3vpn.VpnType.ANY_TO_ANY;
52import static org.onosproject.l3vpn.netl3vpn.VpnType.HUB;
Vidyashree Rama04147ca2017-05-26 11:32:47 +053053import static org.onosproject.yang.gen.v1.ietfbgpl3vpn.rev20160909.ietfbgpl3vpn.routetargetset.rts.RtTypeEnum.BOTH;
54import static org.onosproject.yang.gen.v1.ietfbgpl3vpn.rev20160909.ietfbgpl3vpn.routetargetset.rts.RtTypeEnum.EXPORT;
55import static org.onosproject.yang.gen.v1.ietfbgpl3vpn.rev20160909.ietfbgpl3vpn.routetargetset.rts.RtTypeEnum.IMPORT;
janani b35f6cbc2017-03-24 21:56:58 +053056
57/**
58 * Representation of utility for instance creation and deletion.
59 */
60public final class InsConstructionUtil {
61
62 // No instantiation.
63 private InsConstructionUtil() {
64 }
65
66 /**
67 * Creates network instance with augmented info such as RD and RT.
68 *
69 * @param vpnIns VPN instance
70 * @param role VPN role
71 * @param connect ip connection
72 * @return network instance
73 */
74 public static NetworkInstances createInstance(VpnInstance vpnIns,
75 VpnSiteRole role,
76 IpConnection connect) {
77 NetworkInstance ins = new DefaultNetworkInstance();
78 NetworkInstances instances = new DefaultNetworkInstances();
79 List<NetworkInstance> insList = new LinkedList<>();
80
81 L3Vpn l3Vpn = buildRd(vpnIns);
82 DefaultAugmentedNiNetworkInstance augIns =
83 buildRt(connect, role, l3Vpn, vpnIns);
84 ins.name(vpnIns.vpnName());
85 insList.add(ins);
86 ((DefaultNetworkInstance) ins).addAugmentation(augIns);
87 instances.networkInstance(insList);
88 return instances;
89 }
90
91 /**
92 * Builds RT from l3 VPN according to the address family VPN belongs to.
93 * It returns built aug network instance from l3 VPN.
94 *
95 * @param con ip connection
96 * @param role site VPN role
97 * @param l3Vpn l3 VPN
98 * @param ins VPN instance
99 * @return aug network instance
100 */
101 private static DefaultAugmentedNiNetworkInstance buildRt(IpConnection con,
102 VpnSiteRole role,
103 L3Vpn l3Vpn,
104 VpnInstance ins) {
105 Ipv4 ipv4 = null;
106 Ipv6 ipv6 = null;
107 if (con.ipv4() != null && con.ipv4().addresses()
108 .providerAddress() != null) {
109 ipv4 = buildIpv4Rt(role, ins);
110 }
111 if (con.ipv6() != null && con.ipv6()
112 .addresses().providerAddress() != null) {
113 ipv6 = buildIpv6Rt(role, ins);
114 }
115 l3Vpn.ipv4(ipv4);
116 l3Vpn.ipv6(ipv6);
117
118 AugmentedNiNetworkInstance augInst =
119 new DefaultAugmentedNiNetworkInstance();
120 augInst.l3Vpn(l3Vpn);
121 return (DefaultAugmentedNiNetworkInstance) augInst;
122 }
123
124 /**
125 * Builds ipv6 RT in the device model.
126 *
127 * @param role site VPN role
128 * @param vpnIns VPN instance
129 * @return ipv6
130 */
131 private static Ipv6 buildIpv6Rt(VpnSiteRole role, VpnInstance vpnIns) {
132 RouteTargets rts6 = new DefaultRouteTargets();
133 Ipv6 v6 = new DefaultIpv6();
Vidyashree Rama04147ca2017-05-26 11:32:47 +0530134 org.onosproject.yang.gen.v1.ietfbgpl3vpn.rev20160909.ietfbgpl3vpn
135 .l3vpnvrfparams.ipv6.Unicast uni6 = new org.onosproject.yang
136 .gen.v1.ietfbgpl3vpn.rev20160909.ietfbgpl3vpn.l3vpnvrfparams
137 .ipv6.DefaultUnicast();
janani b35f6cbc2017-03-24 21:56:58 +0530138
139 Config configV6 = configRouteTarget(vpnIns, role);
140 rts6.config(configV6);
141 uni6.routeTargets(rts6);
142 v6.unicast(uni6);
143 return v6;
144 }
145
146 /**
147 * Builds ipv4 RT in the device model.
148 *
149 * @param role site VPN role
150 * @param vpnIns VPN instance
151 * @return ipv4
152 */
153 private static Ipv4 buildIpv4Rt(VpnSiteRole role, VpnInstance vpnIns) {
154 RouteTargets rts4 = new DefaultRouteTargets();
155 Unicast uni4 = new DefaultUnicast();
156 Ipv4 v4 = new DefaultIpv4();
157
158 Config configV4 = configRouteTarget(vpnIns, role);
159 rts4.config(configV4);
160 uni4.routeTargets(rts4);
161 v4.unicast(uni4);
162 return v4;
163 }
164
165 /**
166 * Configures route target according to the site VPN role from the stored
167 * VPN instance.
168 *
169 * @param ins VPN instance
170 * @param role site VPN role
171 * @return route target config
172 */
173 private static Config configRouteTarget(VpnInstance ins,
174 VpnSiteRole role) {
175 Rts rts1;
176 Config config = new DefaultConfig();
177 List<Rts> rtsList = new LinkedList<>();
178
179 if (ins.type() == ANY_TO_ANY) {
180 String rtVal = ((FullMeshVpnConfig) ins.vpnConfig()).rt();
181 rts1 = getRtsVal(rtVal, BOTH);
182 } else {
183 String rtVal1;
184 String rtVal2;
185 HubSpokeVpnConfig conf = (HubSpokeVpnConfig) ins.vpnConfig();
186 if (role.role() == HUB) {
187 rtVal1 = conf.hubImpRt();
188 rtVal2 = conf.hubExpRt();
189 } else {
190 rtVal1 = conf.spokeImpRt();
191 rtVal2 = conf.spokeExpRt();
192 }
193 rts1 = getRtsVal(rtVal1, IMPORT);
194 Rts rts2 = getRtsVal(rtVal2, EXPORT);
195 rtsList.add(rts2);
196 }
197 rtsList.add(rts1);
198 config.rts(rtsList);
199 return config;
200 }
201
202 /**
203 * Returns the device model RT from the RT type and RT value after
204 * building it.
205 *
206 * @param rtVal RT value
207 * @param type RT type
208 * @return device model RT
209 */
210 private static Rts getRtsVal(String rtVal, RtTypeEnum type) {
211 Rts rts = new DefaultRts();
212 rts.rt(rtVal);
213 rts.rtType(type);
214 return rts;
215 }
216
217 /**
218 * Builds RD from the stored device model VPN instance.
219 *
220 * @param vpn VPN instance
221 * @return l3 VPN object
222 */
223 private static L3Vpn buildRd(VpnInstance vpn) {
janani b35f6cbc2017-03-24 21:56:58 +0530224 String rd = vpn.vpnConfig().rd();
Vidyashree Rama04147ca2017-05-26 11:32:47 +0530225 org.onosproject.yang.gen.v1.ietfbgpl3vpn
janani b35f6cbc2017-03-24 21:56:58 +0530226 .rev20160909.ietfbgpl3vpn.routedistinguisherparams
227 .routedistinguisher.Config config = new org.onosproject.yang
Vidyashree Rama04147ca2017-05-26 11:32:47 +0530228 .gen.v1.ietfbgpl3vpn.rev20160909
janani b35f6cbc2017-03-24 21:56:58 +0530229 .ietfbgpl3vpn.routedistinguisherparams.routedistinguisher
230 .DefaultConfig();
231 config.rd(rd);
232 RouteDistinguisher dist = new DefaultRouteDistinguisher();
233 dist.config(config);
234 L3Vpn l3vpn = new DefaultL3Vpn();
235 l3vpn.routeDistinguisher(dist);
236 return l3vpn;
237 }
janani b176905a2017-03-28 17:36:18 +0530238
239 /**
240 * Constructs network instance for delete of VPN instance.
241 *
242 * @param vpnName VPN name
243 * @return network instances
244 */
245 static NetworkInstances deleteInstance(String vpnName) {
246 NetworkInstance nwInstance = new DefaultNetworkInstance();
247 List<NetworkInstance> insList = new LinkedList<>();
248 NetworkInstances instances = new DefaultNetworkInstances();
249 nwInstance.name(vpnName);
250 insList.add(nwInstance);
251 instances.networkInstance(insList);
252 return instances;
253 }
janani b35f6cbc2017-03-24 21:56:58 +0530254}