blob: 247d3c64e79617fc8503900249b31b8aa30dcb54 [file] [log] [blame]
/*
* Copyright 2017-present Open Networking Laboratory
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.onosproject.drivers.huawei;
import org.onosproject.l3vpn.netl3vpn.BgpDriverInfo;
import org.onosproject.l3vpn.netl3vpn.BgpInfo;
import org.onosproject.l3vpn.netl3vpn.BgpModelIdLevel;
import org.onosproject.l3vpn.netl3vpn.ProtocolInfo;
import org.onosproject.l3vpn.netl3vpn.RouteProtocol;
import org.onosproject.yang.gen.v1.nebgpcomm.rev20141225.nebgpcomm.DefaultDevices;
import org.onosproject.yang.gen.v1.nebgpcomm.rev20141225.nebgpcomm.Devices;
import org.onosproject.yang.gen.v1.nebgpcomm.rev20141225.nebgpcomm.devices.DefaultDevice;
import org.onosproject.yang.gen.v1.nebgpcomm.rev20141225.nebgpcomm.devices.Device;
import org.onosproject.yang.gen.v1.nebgpcomm.rev20141225.nebgpcomm.devices.DeviceKeys;
import org.onosproject.yang.gen.v1.nebgpcomm.rev20141225.nebgpcomm.devices.device.Bgp;
import org.onosproject.yang.gen.v1.nebgpcomm.rev20141225.nebgpcomm.devices.device.DefaultBgp;
import org.onosproject.yang.gen.v1.nebgpcomm.rev20141225.nebgpcomm.devices.device.bgp.Bgpcomm;
import org.onosproject.yang.gen.v1.nebgpcomm.rev20141225.nebgpcomm.devices.device.bgp.DefaultBgpcomm;
import org.onosproject.yang.gen.v1.nebgpcomm.rev20141225.nebgpcomm.devices.device.bgp.bgpcomm.BgpVrfs;
import org.onosproject.yang.gen.v1.nebgpcomm.rev20141225.nebgpcomm.devices.device.bgp.bgpcomm.DefaultBgpVrfs;
import org.onosproject.yang.gen.v1.nebgpcomm.rev20141225.nebgpcomm.devices.device.bgp.bgpcomm.bgpvrfs.BgpVrf;
import org.onosproject.yang.gen.v1.nebgpcomm.rev20141225.nebgpcomm.devices.device.bgp.bgpcomm.bgpvrfs.BgpVrfKeys;
import org.onosproject.yang.gen.v1.nebgpcomm.rev20141225.nebgpcomm.devices.device.bgp.bgpcomm.bgpvrfs.DefaultBgpVrf;
import org.onosproject.yang.gen.v1.nebgpcomm.rev20141225.nebgpcomm.devices.device.bgp.bgpcomm.bgpvrfs.bgpvrf.BgpVrfAfs;
import org.onosproject.yang.gen.v1.nebgpcomm.rev20141225.nebgpcomm.devices.device.bgp.bgpcomm.bgpvrfs.bgpvrf.DefaultBgpVrfAfs;
import org.onosproject.yang.gen.v1.nebgpcomm.rev20141225.nebgpcomm.devices.device.bgp.bgpcomm.bgpvrfs.bgpvrf.bgpvrfafs.BgpVrfAf;
import org.onosproject.yang.gen.v1.nebgpcomm.rev20141225.nebgpcomm.devices.device.bgp.bgpcomm.bgpvrfs.bgpvrf.bgpvrfafs.BgpVrfAfKeys;
import org.onosproject.yang.gen.v1.nebgpcomm.rev20141225.nebgpcomm.devices.device.bgp.bgpcomm.bgpvrfs.bgpvrf.bgpvrfafs.DefaultBgpVrfAf;
import org.onosproject.yang.gen.v1.nebgpcomm.rev20141225.nebgpcomm.devices.device.bgp.bgpcomm.bgpvrfs.bgpvrf.bgpvrfafs.bgpvrfaf.DefaultImportRoutes;
import org.onosproject.yang.gen.v1.nebgpcomm.rev20141225.nebgpcomm.devices.device.bgp.bgpcomm.bgpvrfs.bgpvrf.bgpvrfafs.bgpvrfaf.ImportRoutes;
import org.onosproject.yang.gen.v1.nebgpcomm.rev20141225.nebgpcomm.devices.device.bgp.bgpcomm.bgpvrfs.bgpvrf.bgpvrfafs.bgpvrfaf.importroutes.DefaultImportRoute;
import org.onosproject.yang.gen.v1.nebgpcomm.rev20141225.nebgpcomm.devices.device.bgp.bgpcomm.bgpvrfs.bgpvrf.bgpvrfafs.bgpvrfaf.importroutes.ImportRoute;
import org.onosproject.yang.gen.v1.nebgpcommtype.rev20141225.nebgpcommtype.BgpcommImRouteProtocol;
import org.onosproject.yang.gen.v1.nebgpcommtype.rev20141225.nebgpcommtype.bgpcommimrouteprotocol.BgpcommImRouteProtocolEnum;
import org.onosproject.yang.model.InnerModelObject;
import org.onosproject.yang.model.ModelObjectData;
import org.onosproject.yang.model.ModelObjectId;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import static org.onosproject.drivers.huawei.DriverUtil.UNSUPPORTED_MODEL_LVL;
import static org.onosproject.drivers.huawei.DriverUtil.getData;
import static org.onosproject.yang.gen.v1.nebgpcommtype.rev20141225.nebgpcommtype.BgpcommPrefixType.of;
import static org.onosproject.yang.gen.v1.nebgpcommtype.rev20141225.nebgpcommtype.bgpcommimrouteprotocol.BgpcommImRouteProtocolEnum.DIRECT;
import static org.onosproject.yang.gen.v1.nebgpcommtype.rev20141225.nebgpcommtype.bgpcommimrouteprotocol.BgpcommImRouteProtocolEnum.OSPF;
import static org.onosproject.yang.gen.v1.nebgpcommtype.rev20141225.nebgpcommtype.bgpcommimrouteprotocol.BgpcommImRouteProtocolEnum.RIP;
import static org.onosproject.yang.gen.v1.nebgpcommtype.rev20141225.nebgpcommtype.bgpcommimrouteprotocol.BgpcommImRouteProtocolEnum.RIPNG;
import static org.onosproject.yang.gen.v1.nebgpcommtype.rev20141225.nebgpcommtype.bgpcommimrouteprotocol.BgpcommImRouteProtocolEnum.STATIC;
import static org.onosproject.yang.gen.v1.nebgpcommtype.rev20141225.nebgpcommtype.bgpcommprefixtype.BgpcommPrefixTypeEnum.IPV4UNI;
import static org.onosproject.yang.gen.v1.nebgpcommtype.rev20141225.nebgpcommtype.bgpcommprefixtype.BgpcommPrefixTypeEnum.IPV6UNI;
/**
* Representation of utility for BGP creation and deletion.
*/
public final class BgpConstructionUtil {
/**
* Error message for unsupported protocol type.
*/
private static final String UNSUPPORTED_PRO_TYPE = "Unsupported route " +
"protocol type is found.";
// No instantiation.
private BgpConstructionUtil() {
}
/**
* Returns the created model object data of BGP info of huawei device
* from the standard model object data.
*
* @param bgpInfo device BGP info
* @param config BGP driver info
* @return driver model object data
*/
static ModelObjectData getCreateBgp(BgpInfo bgpInfo,
BgpDriverInfo config) {
String devId = config.devId();
BgpModelIdLevel modIdLevel = config.modIdLevel();
Bgp bgp = new DefaultBgp();
Bgpcomm bgpBuilder = new DefaultBgpcomm();
BgpVrfs bgpVrfs = new DefaultBgpVrfs();
BgpVrf bgpVrf = new DefaultBgpVrf();
BgpVrfAfs bgpVrfAfs = new DefaultBgpVrfAfs();
List<BgpVrf> bgpVrfList = new LinkedList<>();
bgpVrf.vrfName(bgpInfo.vpnName());
Map<RouteProtocol, ProtocolInfo> proMap = bgpInfo.protocolInfo();
ImportRoute route = addRouteProtocol(proMap, bgpVrfAfs);
bgpVrf.bgpVrfAfs(bgpVrfAfs);
bgpVrfList.add(bgpVrf);
bgpVrfs.bgpVrf(bgpVrfList);
bgpBuilder.bgpVrfs(bgpVrfs);
bgp.bgpcomm(bgpBuilder);
return getModObjData(modIdLevel, bgp, devId, bgpVrf, route);
}
/**
* Adds route protocol from the standard device model to the BGP address
* family respectively.
* //TODO: IPV6 has to be handled.
*
* @param proMap protocol map
* @param bgpVrfAfs BGP address family
* @return import route
*/
private static ImportRoute addRouteProtocol(Map<RouteProtocol, ProtocolInfo> proMap,
BgpVrfAfs bgpVrfAfs) {
BgpVrfAf ipv4 = new DefaultBgpVrfAf();
ImportRoutes ipv4Routes = new DefaultImportRoutes();
ipv4.afType(of(IPV4UNI));
ImportRoute route = null;
BgpVrfAf ipv6 = new DefaultBgpVrfAf();
ImportRoutes ipv6Routes = new DefaultImportRoutes();
ipv6.afType(of(IPV6UNI));
for (Map.Entry<RouteProtocol, ProtocolInfo> info : proMap.entrySet()) {
RouteProtocol protocol = info.getKey();
ProtocolInfo proInfo = info.getValue();
if (proInfo.isIpv4Af()) {
route = addImportRoute(ipv4Routes, proInfo, protocol);
}
if (proInfo.isIpv6Af()) {
addImportRoute(ipv6Routes, proInfo, protocol);
}
}
if (ipv4Routes.importRoute() != null &&
!ipv4Routes.importRoute().isEmpty()) {
addToBgpVrf(ipv4Routes, ipv4, bgpVrfAfs);
}
if (ipv6Routes.importRoute() != null &&
!ipv6Routes.importRoute().isEmpty()) {
addToBgpVrf(ipv6Routes, ipv6, bgpVrfAfs);
}
return route;
}
/**
* Adds the routes to BGP VRF in driver model.
*
* @param routes routes
* @param vrfAf VRF address family
* @param bgpVrfAfs BGP address family
*/
private static void addToBgpVrf(ImportRoutes routes, BgpVrfAf vrfAf,
BgpVrfAfs bgpVrfAfs) {
List<BgpVrfAf> ipList = new LinkedList<>();
vrfAf.importRoutes(routes);
ipList.add(vrfAf);
bgpVrfAfs.bgpVrfAf(ipList);
}
/**
* Adds the import route to the routes, according to the protocol info
* from the standard device model.
*
* @param routes routes object
* @param proInfo protocol info
* @param protocol route protocol
* @return import route object
*/
private static ImportRoute addImportRoute(ImportRoutes routes,
ProtocolInfo proInfo,
RouteProtocol protocol) {
List<ImportRoute> routeList = new LinkedList<>();
ImportRoute route = buildAfBgp(proInfo, protocol);
routeList.add(route);
routes.importRoute(routeList);
return route;
}
/**
* Builds the import route details from the route protocol and the
* process id.
*
* @param proInfo protocol info
* @param protocol route protocol
* @return import route object
*/
private static ImportRoute buildAfBgp(ProtocolInfo proInfo,
RouteProtocol protocol) {
BgpcommImRouteProtocolEnum rpEnum = getProtocolType(protocol);
ImportRoute impRoute = new DefaultImportRoute();
impRoute.importProcessId(proInfo.processId());
impRoute.importProtocol(BgpcommImRouteProtocol.of(rpEnum));
return impRoute;
}
/**
* Returns the huawei route protocol corresponding to standard device
* route protocol.
*
* @param protocol device route protocol
* @return driver route protocol
*/
private static BgpcommImRouteProtocolEnum getProtocolType(RouteProtocol protocol) {
switch (protocol) {
case DIRECT:
return DIRECT;
case OSPF:
return OSPF;
case RIP:
return RIP;
case RIP_NG:
return RIPNG;
case STATIC:
return STATIC;
case BGP:
case VRRP:
default:
throw new IllegalArgumentException(UNSUPPORTED_PRO_TYPE);
}
}
/**
* Returns the driver model object data, according to the levels it has
* to be constructed.
*
* @param modIdLevel model id level
* @param bgp driver BGP object
* @param devId device id
* @param bgpVrf driver BGP VRF object
* @param route import route object
* @return model object data
*/
public static ModelObjectData getModObjData(BgpModelIdLevel modIdLevel,
Bgp bgp, String devId,
BgpVrf bgpVrf, ImportRoute route) {
switch (modIdLevel) {
case VPN:
return getRouteProModObj(bgpVrf.vrfName(), route, devId);
case ROOT:
return getRootModObj(bgp, devId);
case DEVICES:
return getDevicesModObj(bgp, devId);
case DEVICE:
return getDevModObj(bgpVrf, devId);
default:
throw new IllegalArgumentException(UNSUPPORTED_MODEL_LVL);
}
}
/**
* Returns the model object data of route protocol.
*
* @param vpnName VPN name
* @param route import route
* @param devId device id
* @return model object data
*/
private static ModelObjectData getRouteProModObj(String vpnName,
ImportRoute route,
String devId) {
DeviceKeys key = new DeviceKeys();
key.deviceid(devId);
BgpVrfKeys vpnKey = new BgpVrfKeys();
vpnKey.vrfName(vpnName);
BgpVrfAfKeys afKey = new BgpVrfAfKeys();
afKey.afType(of(IPV4UNI));
ModelObjectId id = ModelObjectId.builder()
.addChild(DefaultDevices.class)
.addChild(DefaultDevice.class, key)
.addChild(DefaultBgp.class)
.addChild(DefaultBgpcomm.class)
.addChild(DefaultBgpVrfs.class)
.addChild(DefaultBgpVrf.class, vpnKey)
.addChild(DefaultBgpVrfAfs.class)
.addChild(DefaultBgpVrfAf.class, afKey)
.addChild(DefaultImportRoutes.class).build();
return getData(id, (InnerModelObject) route);
}
/**
* Returns the driver model object data with device in model object id,
* till BGP VRF.
*
* @param bgpVrf BGP VRF object
* @param devId device id
* @return model object data
*/
private static ModelObjectData getDevModObj(BgpVrf bgpVrf, String devId) {
DeviceKeys key = new DeviceKeys();
key.deviceid(devId);
ModelObjectId id = ModelObjectId.builder()
.addChild(DefaultDevices.class)
.addChild(DefaultDevice.class, key)
.addChild(DefaultBgp.class)
.addChild(DefaultBgpcomm.class)
.addChild(DefaultBgpVrfs.class).build();
return getData(id, (InnerModelObject) bgpVrf);
}
/**
* Returns the driver model object data with devices in model object id.
*
* @param bgp BGP object
* @param devId device id
* @return model object data
*/
private static ModelObjectData getDevicesModObj(Bgp bgp, String devId) {
ModelObjectId modelId = ModelObjectId.builder()
.addChild(DefaultDevices.class).build();
Device device = getDevInfo(bgp, devId);
return getData(modelId, (InnerModelObject) device);
}
/**
* Returns the driver root model object without model object id.
*
* @param bgp driver BGP
* @param devId device id
* @return model object data
*/
private static ModelObjectData getRootModObj(Bgp bgp, String devId) {
Devices devices = new DefaultDevices();
List<Device> devList = new LinkedList<>();
Device device = getDevInfo(bgp, devId);
devList.add(device);
devices.device(devList);
return getData(null, (InnerModelObject) devices);
}
/**
* Returns the driver BGP from the device object.
*
* @param bgp BGP object
* @param devId device id
* @return device object
*/
private static Device getDevInfo(Bgp bgp, String devId) {
Device device = new DefaultDevice();
device.deviceid(devId);
device.bgp(bgp);
return device;
}
/**
* Returns the BGP model object data for deletion.
*
* @param bgpInfo BGP info
* @param bgpConfig BGP driver config
* @return model object data
*/
static ModelObjectData getDeleteBgp(BgpInfo bgpInfo,
BgpDriverInfo bgpConfig) {
BgpModelIdLevel modIdLvl = bgpConfig.modIdLevel();
switch (modIdLvl) {
case ROOT:
return getDelRootModObj();
case DEVICES:
return getDelDevicesModObj(bgpConfig.devId());
case DEVICE:
return getDelDeviceModObj(bgpConfig.devId(), bgpInfo.vpnName());
default:
throw new IllegalArgumentException(UNSUPPORTED_MODEL_LVL);
}
}
/**
* Returns the model object data with respect to device level.
*
* @param devId device id
* @param vpnName VPN name
* @return model object data
*/
private static ModelObjectData getDelDeviceModObj(String devId,
String vpnName) {
DeviceKeys devKeys = new DeviceKeys();
devKeys.deviceid(devId);
BgpVrfKeys vpnKey = new BgpVrfKeys();
vpnKey.vrfName(vpnName);
ModelObjectId modelId = ModelObjectId.builder()
.addChild(DefaultDevices.class)
.addChild(DefaultDevice.class, devKeys)
.addChild(DefaultBgp.class)
.addChild(DefaultBgpcomm.class)
.addChild(DefaultBgpVrfs.class)
.addChild(DefaultBgpVrf.class, vpnKey).build();
DefaultBgpVrfAfs afs = new DefaultBgpVrfAfs();
return getData(modelId, afs);
}
/**
* Returns the model object data with respect to root level.
*
* @return model object data
*/
private static ModelObjectData getDelRootModObj() {
DefaultDevice device = new DefaultDevice();
ModelObjectId modelId = ModelObjectId.builder().addChild(
DefaultDevices.class).build();
return getData(modelId, device);
}
/**
* Returns the model object data for devices level.
*
* @param id device id
* @return model object data
*/
private static ModelObjectData getDelDevicesModObj(String id) {
DeviceKeys devKeys = new DeviceKeys();
devKeys.deviceid(id);
ModelObjectId modelId = ModelObjectId.builder()
.addChild(DefaultDevices.class)
.addChild(DefaultDevice.class, devKeys).build();
DefaultBgp bgp = new DefaultBgp();
return getData(modelId, bgp);
}
}