blob: 85e4da62ad36b634426d800edd45e155d6122485 [file] [log] [blame]
janani bf7060cd2017-03-28 19:06:30 +05301/*
2 * Copyright 2017-present Open Networking Laboratory
3 *
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.drivers.huawei;
18
19import org.onosproject.l3vpn.netl3vpn.BgpDriverInfo;
20import org.onosproject.l3vpn.netl3vpn.BgpInfo;
21import org.onosproject.l3vpn.netl3vpn.BgpModelIdLevel;
22import org.onosproject.l3vpn.netl3vpn.ProtocolInfo;
23import org.onosproject.l3vpn.netl3vpn.RouteProtocol;
24import org.onosproject.yang.gen.v1.ne.bgpcomm.rev20141225.nebgpcomm.DefaultDevices;
25import org.onosproject.yang.gen.v1.ne.bgpcomm.rev20141225.nebgpcomm.Devices;
26import org.onosproject.yang.gen.v1.ne.bgpcomm.rev20141225.nebgpcomm.devices.DefaultDevice;
27import org.onosproject.yang.gen.v1.ne.bgpcomm.rev20141225.nebgpcomm.devices.Device;
28import org.onosproject.yang.gen.v1.ne.bgpcomm.rev20141225.nebgpcomm.devices.DeviceKeys;
29import org.onosproject.yang.gen.v1.ne.bgpcomm.rev20141225.nebgpcomm.devices.device.Bgp;
30import org.onosproject.yang.gen.v1.ne.bgpcomm.rev20141225.nebgpcomm.devices.device.DefaultBgp;
31import org.onosproject.yang.gen.v1.ne.bgpcomm.rev20141225.nebgpcomm.devices.device.bgp.Bgpcomm;
32import org.onosproject.yang.gen.v1.ne.bgpcomm.rev20141225.nebgpcomm.devices.device.bgp.DefaultBgpcomm;
33import org.onosproject.yang.gen.v1.ne.bgpcomm.rev20141225.nebgpcomm.devices.device.bgp.bgpcomm.BgpVrfs;
34import org.onosproject.yang.gen.v1.ne.bgpcomm.rev20141225.nebgpcomm.devices.device.bgp.bgpcomm.DefaultBgpVrfs;
35import org.onosproject.yang.gen.v1.ne.bgpcomm.rev20141225.nebgpcomm.devices.device.bgp.bgpcomm.bgpvrfs.BgpVrf;
janani bd821b182017-03-30 16:34:49 +053036import org.onosproject.yang.gen.v1.ne.bgpcomm.rev20141225.nebgpcomm.devices.device.bgp.bgpcomm.bgpvrfs.BgpVrfKeys;
janani bf7060cd2017-03-28 19:06:30 +053037import org.onosproject.yang.gen.v1.ne.bgpcomm.rev20141225.nebgpcomm.devices.device.bgp.bgpcomm.bgpvrfs.DefaultBgpVrf;
38import org.onosproject.yang.gen.v1.ne.bgpcomm.rev20141225.nebgpcomm.devices.device.bgp.bgpcomm.bgpvrfs.bgpvrf.BgpVrfAfs;
39import org.onosproject.yang.gen.v1.ne.bgpcomm.rev20141225.nebgpcomm.devices.device.bgp.bgpcomm.bgpvrfs.bgpvrf.DefaultBgpVrfAfs;
40import org.onosproject.yang.gen.v1.ne.bgpcomm.rev20141225.nebgpcomm.devices.device.bgp.bgpcomm.bgpvrfs.bgpvrf.bgpvrfafs.BgpVrfAf;
janani bd821b182017-03-30 16:34:49 +053041import org.onosproject.yang.gen.v1.ne.bgpcomm.rev20141225.nebgpcomm.devices.device.bgp.bgpcomm.bgpvrfs.bgpvrf.bgpvrfafs.BgpVrfAfKeys;
janani bf7060cd2017-03-28 19:06:30 +053042import org.onosproject.yang.gen.v1.ne.bgpcomm.rev20141225.nebgpcomm.devices.device.bgp.bgpcomm.bgpvrfs.bgpvrf.bgpvrfafs.DefaultBgpVrfAf;
43import org.onosproject.yang.gen.v1.ne.bgpcomm.rev20141225.nebgpcomm.devices.device.bgp.bgpcomm.bgpvrfs.bgpvrf.bgpvrfafs.bgpvrfaf.DefaultImportRoutes;
44import org.onosproject.yang.gen.v1.ne.bgpcomm.rev20141225.nebgpcomm.devices.device.bgp.bgpcomm.bgpvrfs.bgpvrf.bgpvrfafs.bgpvrfaf.ImportRoutes;
45import org.onosproject.yang.gen.v1.ne.bgpcomm.rev20141225.nebgpcomm.devices.device.bgp.bgpcomm.bgpvrfs.bgpvrf.bgpvrfafs.bgpvrfaf.importroutes.DefaultImportRoute;
46import org.onosproject.yang.gen.v1.ne.bgpcomm.rev20141225.nebgpcomm.devices.device.bgp.bgpcomm.bgpvrfs.bgpvrf.bgpvrfafs.bgpvrfaf.importroutes.ImportRoute;
47import org.onosproject.yang.gen.v1.ne.bgpcomm.type.rev20141225.nebgpcommtype.BgpcommImRouteProtocol;
48import org.onosproject.yang.gen.v1.ne.bgpcomm.type.rev20141225.nebgpcommtype.bgpcommimrouteprotocol.BgpcommImRouteProtocolEnum;
49import org.onosproject.yang.model.InnerModelObject;
50import org.onosproject.yang.model.ModelObjectData;
51import org.onosproject.yang.model.ModelObjectId;
52
53import java.util.LinkedList;
54import java.util.List;
55import java.util.Map;
56
57import static org.onosproject.drivers.huawei.DriverUtil.UNSUPPORTED_MODEL_LVL;
58import static org.onosproject.drivers.huawei.DriverUtil.getData;
59import static org.onosproject.yang.gen.v1.ne.bgpcomm.type.rev20141225.nebgpcommtype.BgpcommPrefixType.of;
60import static org.onosproject.yang.gen.v1.ne.bgpcomm.type.rev20141225.nebgpcommtype.bgpcommimrouteprotocol.BgpcommImRouteProtocolEnum.DIRECT;
61import static org.onosproject.yang.gen.v1.ne.bgpcomm.type.rev20141225.nebgpcommtype.bgpcommimrouteprotocol.BgpcommImRouteProtocolEnum.OSPF;
62import static org.onosproject.yang.gen.v1.ne.bgpcomm.type.rev20141225.nebgpcommtype.bgpcommimrouteprotocol.BgpcommImRouteProtocolEnum.RIP;
63import static org.onosproject.yang.gen.v1.ne.bgpcomm.type.rev20141225.nebgpcommtype.bgpcommimrouteprotocol.BgpcommImRouteProtocolEnum.RIPNG;
64import static org.onosproject.yang.gen.v1.ne.bgpcomm.type.rev20141225.nebgpcommtype.bgpcommimrouteprotocol.BgpcommImRouteProtocolEnum.STATIC;
65import static org.onosproject.yang.gen.v1.ne.bgpcomm.type.rev20141225.nebgpcommtype.bgpcommprefixtype.BgpcommPrefixTypeEnum.IPV4UNI;
66import static org.onosproject.yang.gen.v1.ne.bgpcomm.type.rev20141225.nebgpcommtype.bgpcommprefixtype.BgpcommPrefixTypeEnum.IPV6UNI;
67
68/**
69 * Representation of utility for BGP creation and deletion.
70 */
71public final class BgpConstructionUtil {
72
73 /**
74 * Error message for unsupported protocol type.
75 */
76 private static final String UNSUPPORTED_PRO_TYPE = "Unsupported route " +
77 "protocol type is found.";
78
79 // No instantiation.
80 private BgpConstructionUtil() {
81 }
82
83 /**
84 * Returns the created model object data of BGP info of huawei device
85 * from the standard model object data.
86 *
87 * @param bgpInfo device BGP info
88 * @param config BGP driver info
89 * @return driver model object data
90 */
91 static ModelObjectData getCreateBgp(BgpInfo bgpInfo,
92 BgpDriverInfo config) {
93 String devId = config.devId();
94 BgpModelIdLevel modIdLevel = config.modIdLevel();
95
96 Bgp bgp = new DefaultBgp();
97 Bgpcomm bgpBuilder = new DefaultBgpcomm();
98 BgpVrfs bgpVrfs = new DefaultBgpVrfs();
99 BgpVrf bgpVrf = new DefaultBgpVrf();
100 BgpVrfAfs bgpVrfAfs = new DefaultBgpVrfAfs();
101 List<BgpVrf> bgpVrfList = new LinkedList<>();
102
103 bgpVrf.vrfName(bgpInfo.vpnName());
104 Map<RouteProtocol, ProtocolInfo> proMap = bgpInfo.protocolInfo();
janani bd821b182017-03-30 16:34:49 +0530105 ImportRoute route = addRouteProtocol(proMap, bgpVrfAfs);
janani bf7060cd2017-03-28 19:06:30 +0530106
107 bgpVrf.bgpVrfAfs(bgpVrfAfs);
108 bgpVrfList.add(bgpVrf);
109 bgpVrfs.bgpVrf(bgpVrfList);
110 bgpBuilder.bgpVrfs(bgpVrfs);
111 bgp.bgpcomm(bgpBuilder);
janani bd821b182017-03-30 16:34:49 +0530112 return getModObjData(modIdLevel, bgp, devId, bgpVrf, route);
janani bf7060cd2017-03-28 19:06:30 +0530113 }
114
115 /**
116 * Adds route protocol from the standard device model to the BGP address
117 * family respectively.
janani bd821b182017-03-30 16:34:49 +0530118 * //TODO: IPV6 has to be handled.
janani bf7060cd2017-03-28 19:06:30 +0530119 *
120 * @param proMap protocol map
121 * @param bgpVrfAfs BGP address family
janani bd821b182017-03-30 16:34:49 +0530122 * @return import route
janani bf7060cd2017-03-28 19:06:30 +0530123 */
janani bd821b182017-03-30 16:34:49 +0530124 private static ImportRoute addRouteProtocol(Map<RouteProtocol, ProtocolInfo> proMap,
125 BgpVrfAfs bgpVrfAfs) {
janani bf7060cd2017-03-28 19:06:30 +0530126 BgpVrfAf ipv4 = new DefaultBgpVrfAf();
127 ImportRoutes ipv4Routes = new DefaultImportRoutes();
128 ipv4.afType(of(IPV4UNI));
129
janani bd821b182017-03-30 16:34:49 +0530130 ImportRoute route = null;
131
janani bf7060cd2017-03-28 19:06:30 +0530132 BgpVrfAf ipv6 = new DefaultBgpVrfAf();
133 ImportRoutes ipv6Routes = new DefaultImportRoutes();
134 ipv6.afType(of(IPV6UNI));
135 for (Map.Entry<RouteProtocol, ProtocolInfo> info : proMap.entrySet()) {
136 RouteProtocol protocol = info.getKey();
137 ProtocolInfo proInfo = info.getValue();
138 if (proInfo.isIpv4Af()) {
janani bd821b182017-03-30 16:34:49 +0530139 route = addImportRoute(ipv4Routes, proInfo, protocol);
janani bf7060cd2017-03-28 19:06:30 +0530140 }
141 if (proInfo.isIpv6Af()) {
142 addImportRoute(ipv6Routes, proInfo, protocol);
143 }
144 }
145 if (ipv4Routes.importRoute() != null &&
146 !ipv4Routes.importRoute().isEmpty()) {
147 addToBgpVrf(ipv4Routes, ipv4, bgpVrfAfs);
148 }
149 if (ipv6Routes.importRoute() != null &&
150 !ipv6Routes.importRoute().isEmpty()) {
151 addToBgpVrf(ipv6Routes, ipv6, bgpVrfAfs);
152 }
janani bd821b182017-03-30 16:34:49 +0530153 return route;
janani bf7060cd2017-03-28 19:06:30 +0530154 }
155
156 /**
157 * Adds the routes to BGP VRF in driver model.
158 *
159 * @param routes routes
160 * @param vrfAf VRF address family
161 * @param bgpVrfAfs BGP address family
162 */
163 private static void addToBgpVrf(ImportRoutes routes, BgpVrfAf vrfAf,
164 BgpVrfAfs bgpVrfAfs) {
165 List<BgpVrfAf> ipList = new LinkedList<>();
166 vrfAf.importRoutes(routes);
167 ipList.add(vrfAf);
168 bgpVrfAfs.bgpVrfAf(ipList);
169 }
170
171 /**
172 * Adds the import route to the routes, according to the protocol info
173 * from the standard device model.
174 *
175 * @param routes routes object
176 * @param proInfo protocol info
177 * @param protocol route protocol
janani bd821b182017-03-30 16:34:49 +0530178 * @return import route object
janani bf7060cd2017-03-28 19:06:30 +0530179 */
janani bd821b182017-03-30 16:34:49 +0530180 private static ImportRoute addImportRoute(ImportRoutes routes,
181 ProtocolInfo proInfo,
182 RouteProtocol protocol) {
janani bf7060cd2017-03-28 19:06:30 +0530183 List<ImportRoute> routeList = new LinkedList<>();
184 ImportRoute route = buildAfBgp(proInfo, protocol);
185 routeList.add(route);
186 routes.importRoute(routeList);
janani bd821b182017-03-30 16:34:49 +0530187 return route;
janani bf7060cd2017-03-28 19:06:30 +0530188 }
189
190 /**
191 * Builds the import route details from the route protocol and the
192 * process id.
193 *
194 * @param proInfo protocol info
195 * @param protocol route protocol
196 * @return import route object
197 */
198 private static ImportRoute buildAfBgp(ProtocolInfo proInfo,
199 RouteProtocol protocol) {
200 BgpcommImRouteProtocolEnum rpEnum = getProtocolType(protocol);
201 ImportRoute impRoute = new DefaultImportRoute();
202 impRoute.importProcessId(proInfo.processId());
203 impRoute.importProtocol(BgpcommImRouteProtocol.of(rpEnum));
204 return impRoute;
205 }
206
207 /**
208 * Returns the huawei route protocol corresponding to standard device
209 * route protocol.
210 *
211 * @param protocol device route protocol
212 * @return driver route protocol
213 */
214 private static BgpcommImRouteProtocolEnum getProtocolType(RouteProtocol protocol) {
215 switch (protocol) {
216 case DIRECT:
217 return DIRECT;
218
219 case OSPF:
220 return OSPF;
221
222 case RIP:
223 return RIP;
224
225 case RIP_NG:
226 return RIPNG;
227
228 case STATIC:
229 return STATIC;
230
231 case BGP:
232 case VRRP:
233 default:
234 throw new IllegalArgumentException(UNSUPPORTED_PRO_TYPE);
235 }
236 }
237
238 /**
239 * Returns the driver model object data, according to the levels it has
240 * to be constructed.
241 *
242 * @param modIdLevel model id level
243 * @param bgp driver BGP object
244 * @param devId device id
245 * @param bgpVrf driver BGP VRF object
janani bd821b182017-03-30 16:34:49 +0530246 * @param route import route object
janani bf7060cd2017-03-28 19:06:30 +0530247 * @return model object data
248 */
249 public static ModelObjectData getModObjData(BgpModelIdLevel modIdLevel,
250 Bgp bgp, String devId,
janani bd821b182017-03-30 16:34:49 +0530251 BgpVrf bgpVrf, ImportRoute route) {
janani bf7060cd2017-03-28 19:06:30 +0530252 switch (modIdLevel) {
janani bd821b182017-03-30 16:34:49 +0530253
254 case VPN:
255 return getRouteProModObj(bgpVrf.vrfName(), route, devId);
256
janani bf7060cd2017-03-28 19:06:30 +0530257 case ROOT:
258 return getRootModObj(bgp, devId);
259
260 case DEVICES:
261 return getDevicesModObj(bgp, devId);
262
263 case DEVICE:
264 return getDevModObj(bgpVrf, devId);
265
266 default:
267 throw new IllegalArgumentException(UNSUPPORTED_MODEL_LVL);
268 }
269 }
270
271 /**
janani bd821b182017-03-30 16:34:49 +0530272 * Returns the model object data of route protocol.
273 *
274 * @param vpnName VPN name
275 * @param route import route
276 * @param devId device id
277 * @return model object data
278 */
279 private static ModelObjectData getRouteProModObj(String vpnName,
280 ImportRoute route,
281 String devId) {
282 DeviceKeys key = new DeviceKeys();
283 key.deviceid(devId);
284 BgpVrfKeys vpnKey = new BgpVrfKeys();
285 vpnKey.vrfName(vpnName);
286 BgpVrfAfKeys afKey = new BgpVrfAfKeys();
287 afKey.afType(of(IPV4UNI));
288 ModelObjectId id = ModelObjectId.builder()
289 .addChild(DefaultDevices.class)
290 .addChild(DefaultDevice.class, key)
291 .addChild(DefaultBgp.class)
292 .addChild(DefaultBgpcomm.class)
293 .addChild(DefaultBgpVrfs.class)
294 .addChild(DefaultBgpVrf.class, vpnKey)
295 .addChild(DefaultBgpVrfAfs.class)
296 .addChild(DefaultBgpVrfAf.class, afKey)
297 .addChild(DefaultImportRoutes.class).build();
298 return getData(id, (InnerModelObject) route);
299 }
300
301 /**
janani bf7060cd2017-03-28 19:06:30 +0530302 * Returns the driver model object data with device in model object id,
303 * till BGP VRF.
304 *
305 * @param bgpVrf BGP VRF object
306 * @param devId device id
307 * @return model object data
308 */
309 private static ModelObjectData getDevModObj(BgpVrf bgpVrf, String devId) {
310 DeviceKeys key = new DeviceKeys();
311 key.deviceid(devId);
312 ModelObjectId id = ModelObjectId.builder()
313 .addChild(DefaultDevices.class)
314 .addChild(DefaultDevice.class, key)
315 .addChild(DefaultBgp.class)
316 .addChild(DefaultBgpcomm.class)
317 .addChild(DefaultBgpVrfs.class).build();
318 return getData(id, (InnerModelObject) bgpVrf);
319 }
320
321 /**
322 * Returns the driver model object data with devices in model object id.
323 *
324 * @param bgp BGP object
325 * @param devId device id
326 * @return model object data
327 */
328 private static ModelObjectData getDevicesModObj(Bgp bgp, String devId) {
329 ModelObjectId modelId = ModelObjectId.builder()
330 .addChild(DefaultDevices.class).build();
331 Device device = getDevInfo(bgp, devId);
332 return getData(modelId, (InnerModelObject) device);
333 }
334
335 /**
336 * Returns the driver root model object without model object id.
337 *
338 * @param bgp driver BGP
339 * @param devId device id
340 * @return model object data
341 */
342 private static ModelObjectData getRootModObj(Bgp bgp, String devId) {
343 Devices devices = new DefaultDevices();
344 List<Device> devList = new LinkedList<>();
345 Device device = getDevInfo(bgp, devId);
346 devList.add(device);
347 devices.device(devList);
348 return getData(null, (InnerModelObject) devices);
349 }
350
351 /**
352 * Returns the driver BGP from the device object.
353 *
354 * @param bgp BGP object
355 * @param devId device id
356 * @return device object
357 */
358 private static Device getDevInfo(Bgp bgp, String devId) {
359 Device device = new DefaultDevice();
360 device.deviceid(devId);
361 device.bgp(bgp);
362 return device;
363 }
janani bd821b182017-03-30 16:34:49 +0530364
365 /**
366 * Returns the BGP model object data for deletion.
367 *
368 * @param bgpInfo BGP info
369 * @param bgpConfig BGP driver config
370 * @return model object data
371 */
372 static ModelObjectData getDeleteBgp(BgpInfo bgpInfo,
373 BgpDriverInfo bgpConfig) {
374 BgpModelIdLevel modIdLvl = bgpConfig.modIdLevel();
375 switch (modIdLvl) {
376 case ROOT:
377 return getDelRootModObj();
378
379 case DEVICES:
380 return getDelDevicesModObj(bgpConfig.devId());
381
382 case DEVICE:
383 return getDelDeviceModObj(bgpConfig.devId(), bgpInfo.vpnName());
384
385 default:
386 throw new IllegalArgumentException(UNSUPPORTED_MODEL_LVL);
387 }
388 }
389
390 /**
391 * Returns the model object data with respect to device level.
392 *
393 * @param devId device id
394 * @param vpnName VPN name
395 * @return model object data
396 */
397 private static ModelObjectData getDelDeviceModObj(String devId,
398 String vpnName) {
399 DeviceKeys devKeys = new DeviceKeys();
400 devKeys.deviceid(devId);
401 BgpVrfKeys vpnKey = new BgpVrfKeys();
402 vpnKey.vrfName(vpnName);
403 ModelObjectId modelId = ModelObjectId.builder()
404 .addChild(DefaultDevices.class)
405 .addChild(DefaultDevice.class, devKeys)
406 .addChild(DefaultBgp.class)
407 .addChild(DefaultBgpcomm.class)
408 .addChild(DefaultBgpVrfs.class)
409 .addChild(DefaultBgpVrf.class, vpnKey).build();
410 DefaultBgpVrfAfs afs = new DefaultBgpVrfAfs();
411 return getData(modelId, afs);
412 }
413
414 /**
415 * Returns the model object data with respect to root level.
416 *
417 * @return model object data
418 */
419 private static ModelObjectData getDelRootModObj() {
420 DefaultDevice device = new DefaultDevice();
421 ModelObjectId modelId = ModelObjectId.builder().addChild(
422 DefaultDevices.class).build();
423 return getData(modelId, device);
424 }
425
426 /**
427 * Returns the model object data for devices level.
428 *
429 * @param id device id
430 * @return model object data
431 */
432 private static ModelObjectData getDelDevicesModObj(String id) {
433 DeviceKeys devKeys = new DeviceKeys();
434 devKeys.deviceid(id);
435 ModelObjectId modelId = ModelObjectId.builder()
436 .addChild(DefaultDevices.class)
437 .addChild(DefaultDevice.class, devKeys).build();
438 DefaultBgp bgp = new DefaultBgp();
439 return getData(modelId, bgp);
440 }
janani bf7060cd2017-03-28 19:06:30 +0530441}