[ONOS-6224] L3VPN service delete
Change-Id: I2eabb231def39dba6613dc5b95f2b16594133ad4
diff --git a/drivers/huawei/driver/src/main/java/org/onosproject/drivers/huawei/BgpConstructionUtil.java b/drivers/huawei/driver/src/main/java/org/onosproject/drivers/huawei/BgpConstructionUtil.java
index 8472ed4..85e4da6 100644
--- a/drivers/huawei/driver/src/main/java/org/onosproject/drivers/huawei/BgpConstructionUtil.java
+++ b/drivers/huawei/driver/src/main/java/org/onosproject/drivers/huawei/BgpConstructionUtil.java
@@ -33,10 +33,12 @@
import org.onosproject.yang.gen.v1.ne.bgpcomm.rev20141225.nebgpcomm.devices.device.bgp.bgpcomm.BgpVrfs;
import org.onosproject.yang.gen.v1.ne.bgpcomm.rev20141225.nebgpcomm.devices.device.bgp.bgpcomm.DefaultBgpVrfs;
import org.onosproject.yang.gen.v1.ne.bgpcomm.rev20141225.nebgpcomm.devices.device.bgp.bgpcomm.bgpvrfs.BgpVrf;
+import org.onosproject.yang.gen.v1.ne.bgpcomm.rev20141225.nebgpcomm.devices.device.bgp.bgpcomm.bgpvrfs.BgpVrfKeys;
import org.onosproject.yang.gen.v1.ne.bgpcomm.rev20141225.nebgpcomm.devices.device.bgp.bgpcomm.bgpvrfs.DefaultBgpVrf;
import org.onosproject.yang.gen.v1.ne.bgpcomm.rev20141225.nebgpcomm.devices.device.bgp.bgpcomm.bgpvrfs.bgpvrf.BgpVrfAfs;
import org.onosproject.yang.gen.v1.ne.bgpcomm.rev20141225.nebgpcomm.devices.device.bgp.bgpcomm.bgpvrfs.bgpvrf.DefaultBgpVrfAfs;
import org.onosproject.yang.gen.v1.ne.bgpcomm.rev20141225.nebgpcomm.devices.device.bgp.bgpcomm.bgpvrfs.bgpvrf.bgpvrfafs.BgpVrfAf;
+import org.onosproject.yang.gen.v1.ne.bgpcomm.rev20141225.nebgpcomm.devices.device.bgp.bgpcomm.bgpvrfs.bgpvrf.bgpvrfafs.BgpVrfAfKeys;
import org.onosproject.yang.gen.v1.ne.bgpcomm.rev20141225.nebgpcomm.devices.device.bgp.bgpcomm.bgpvrfs.bgpvrf.bgpvrfafs.DefaultBgpVrfAf;
import org.onosproject.yang.gen.v1.ne.bgpcomm.rev20141225.nebgpcomm.devices.device.bgp.bgpcomm.bgpvrfs.bgpvrf.bgpvrfafs.bgpvrfaf.DefaultImportRoutes;
import org.onosproject.yang.gen.v1.ne.bgpcomm.rev20141225.nebgpcomm.devices.device.bgp.bgpcomm.bgpvrfs.bgpvrf.bgpvrfafs.bgpvrfaf.ImportRoutes;
@@ -100,29 +102,33 @@
bgpVrf.vrfName(bgpInfo.vpnName());
Map<RouteProtocol, ProtocolInfo> proMap = bgpInfo.protocolInfo();
- addRouteProtocol(proMap, bgpVrfAfs);
+ 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);
+ 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 void addRouteProtocol(Map<RouteProtocol, ProtocolInfo> proMap,
- BgpVrfAfs bgpVrfAfs) {
+ 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));
@@ -130,7 +136,7 @@
RouteProtocol protocol = info.getKey();
ProtocolInfo proInfo = info.getValue();
if (proInfo.isIpv4Af()) {
- addImportRoute(ipv4Routes, proInfo, protocol);
+ route = addImportRoute(ipv4Routes, proInfo, protocol);
}
if (proInfo.isIpv6Af()) {
addImportRoute(ipv6Routes, proInfo, protocol);
@@ -144,6 +150,7 @@
!ipv6Routes.importRoute().isEmpty()) {
addToBgpVrf(ipv6Routes, ipv6, bgpVrfAfs);
}
+ return route;
}
/**
@@ -168,13 +175,16 @@
* @param routes routes object
* @param proInfo protocol info
* @param protocol route protocol
+ * @return import route object
*/
- private static void addImportRoute(ImportRoutes routes, ProtocolInfo proInfo,
- RouteProtocol protocol) {
+ 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;
}
/**
@@ -233,12 +243,17 @@
* @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) {
+ BgpVrf bgpVrf, ImportRoute route) {
switch (modIdLevel) {
+
+ case VPN:
+ return getRouteProModObj(bgpVrf.vrfName(), route, devId);
+
case ROOT:
return getRootModObj(bgp, devId);
@@ -254,6 +269,36 @@
}
/**
+ * 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.
*
@@ -316,4 +361,81 @@
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);
+ }
}
diff --git a/drivers/huawei/driver/src/main/java/org/onosproject/drivers/huawei/DriverUtil.java b/drivers/huawei/driver/src/main/java/org/onosproject/drivers/huawei/DriverUtil.java
index edeffef..af997c4 100644
--- a/drivers/huawei/driver/src/main/java/org/onosproject/drivers/huawei/DriverUtil.java
+++ b/drivers/huawei/driver/src/main/java/org/onosproject/drivers/huawei/DriverUtil.java
@@ -17,9 +17,11 @@
package org.onosproject.drivers.huawei;
import org.onosproject.yang.gen.v1.ne.l3vpn.api.rev20141225.nel3vpnapi.DefaultDevices;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev20140508.ietfinterfaces.devices.DeviceKeys;
import org.onosproject.yang.model.AtomicPath;
import org.onosproject.yang.model.DefaultModelObjectData;
import org.onosproject.yang.model.InnerModelObject;
+import org.onosproject.yang.model.KeyInfo;
import org.onosproject.yang.model.ModelObject;
import org.onosproject.yang.model.ModelObjectData;
import org.onosproject.yang.model.ModelObjectId;
@@ -28,6 +30,8 @@
import java.util.Iterator;
import java.util.List;
+import static org.onosproject.drivers.huawei.L3VpnUtil.getDevIdFromIns;
+
/**
* Representation of utility for huawei driver.
*/
@@ -164,26 +168,46 @@
* not present then null is returned. If only one path is available in
* the list then devices value is returned.
*
- * @param id model object data
+ * @param id model object id
+ * @param isIns if for VPN instance
* @return device id
*/
- static String getIdFromModId(ModelObjectId id) {
+ static String getIdFromModId(ModelObjectId id, boolean isIns) {
if (id == null) {
return null;
}
-
List<AtomicPath> paths = id.atomicPaths();
int size = paths.size();
- if (size == 1) {
- return CONS_DEVICES;
- } else if (size == 2) {
- return ((MultiInstanceNode) paths.get(1)).key().toString();
- } else {
- throw new IllegalArgumentException(MODEL_OBJ_ID_LIMIT);
+
+ switch (size) {
+ case 1:
+ return CONS_DEVICES;
+
+ case 2:
+ return getDevId(paths, isIns);
+
+ default:
+ throw new IllegalArgumentException(MODEL_OBJ_ID_LIMIT);
}
}
/**
+ * Returns the device id from the model object id's key info.
+ *
+ * @param paths atomic path list
+ * @param isIns if VPN instance
+ * @return device id
+ */
+ private static String getDevId(List<AtomicPath> paths, boolean isIns) {
+ MultiInstanceNode info = (MultiInstanceNode) paths.get(1);
+ KeyInfo key = info.key();
+ if (!isIns) {
+ return ((DeviceKeys) key).deviceid();
+ }
+ return getDevIdFromIns(key);
+ }
+
+ /**
* Returns the first object from the model object data. If no objects are
* present then it returns null.
*
diff --git a/drivers/huawei/driver/src/main/java/org/onosproject/drivers/huawei/HuaweiL3vpnConfig.java b/drivers/huawei/driver/src/main/java/org/onosproject/drivers/huawei/HuaweiL3VpnConfig.java
similarity index 92%
rename from drivers/huawei/driver/src/main/java/org/onosproject/drivers/huawei/HuaweiL3vpnConfig.java
rename to drivers/huawei/driver/src/main/java/org/onosproject/drivers/huawei/HuaweiL3VpnConfig.java
index 5a663e4..300e480 100644
--- a/drivers/huawei/driver/src/main/java/org/onosproject/drivers/huawei/HuaweiL3vpnConfig.java
+++ b/drivers/huawei/driver/src/main/java/org/onosproject/drivers/huawei/HuaweiL3VpnConfig.java
@@ -21,7 +21,7 @@
import org.onosproject.config.FailedException;
import org.onosproject.l3vpn.netl3vpn.BgpDriverInfo;
import org.onosproject.l3vpn.netl3vpn.BgpInfo;
-import org.onosproject.net.behaviour.L3vpnConfig;
+import org.onosproject.net.behaviour.L3VpnConfig;
import org.onosproject.net.driver.AbstractHandlerBehaviour;
import org.onosproject.yang.gen.v1.l3vpn.comm.type.rev20141225.NeL3VpncommType;
import org.onosproject.yang.gen.v1.ne.bgpcomm.rev20141225.NeBgpcomm;
@@ -40,11 +40,13 @@
import java.util.Iterator;
import static org.onosproject.drivers.huawei.BgpConstructionUtil.getCreateBgp;
+import static org.onosproject.drivers.huawei.BgpConstructionUtil.getDeleteBgp;
import static org.onosproject.drivers.huawei.DriverUtil.DEVICES;
import static org.onosproject.drivers.huawei.DriverUtil.NAMESPACE;
import static org.onosproject.drivers.huawei.DriverUtil.SERVICE_NOT_FOUND;
import static org.onosproject.drivers.huawei.DriverUtil.SLASH;
import static org.onosproject.drivers.huawei.InsConstructionUtil.getCreateVpnIns;
+import static org.onosproject.drivers.huawei.InsConstructionUtil.getDeleteVpnIns;
import static org.onosproject.drivers.huawei.IntConstructionUtil.getCreateInt;
import static org.onosproject.yang.runtime.DefaultModelRegistrationParam.builder;
import static org.onosproject.yang.runtime.helperutils.YangApacheUtils.getYangModel;
@@ -52,8 +54,8 @@
/**
* Configures l3vpn on Huawei devices.
*/
-public class HuaweiL3vpnConfig extends AbstractHandlerBehaviour
- implements L3vpnConfig {
+public class HuaweiL3VpnConfig extends AbstractHandlerBehaviour
+ implements L3VpnConfig {
/**
* YANG model registry.
@@ -68,7 +70,7 @@
/**
* Constructs huawei L3VPN config.
*/
- public HuaweiL3vpnConfig() {
+ public HuaweiL3VpnConfig() {
}
/**
@@ -148,7 +150,7 @@
@Override
public Object deleteInstance(Object objectData) {
- return InsConstructionUtil.getDeleteVpnIns((ModelObjectData) objectData);
+ return getDeleteVpnIns((ModelObjectData) objectData);
}
@Override
@@ -159,8 +161,7 @@
@Override
public Object deleteBgpInfo(Object bgpInfo, Object bgpConfig) {
- //TODO:To be committed.
- return null;
+ return getDeleteBgp((BgpInfo) bgpInfo, (BgpDriverInfo) bgpConfig);
}
/**
diff --git a/drivers/huawei/driver/src/main/java/org/onosproject/drivers/huawei/InsConstructionUtil.java b/drivers/huawei/driver/src/main/java/org/onosproject/drivers/huawei/InsConstructionUtil.java
index 918c5fd..6e13c34 100644
--- a/drivers/huawei/driver/src/main/java/org/onosproject/drivers/huawei/InsConstructionUtil.java
+++ b/drivers/huawei/driver/src/main/java/org/onosproject/drivers/huawei/InsConstructionUtil.java
@@ -35,6 +35,7 @@
import org.onosproject.yang.gen.v1.ne.l3vpn.api.rev20141225.nel3vpnapi.devices.device.l3vpn.l3vpncomm.l3vpninstances.l3vpninstance.vpninstafs.vpninstaf.VpnTargets;
import org.onosproject.yang.gen.v1.ne.l3vpn.api.rev20141225.nel3vpnapi.devices.device.l3vpn.l3vpncomm.l3vpninstances.l3vpninstance.vpninstafs.vpninstaf.vpntargets.DefaultVpnTarget;
import org.onosproject.yang.gen.v1.ne.l3vpn.api.rev20141225.nel3vpnapi.devices.device.l3vpn.l3vpncomm.l3vpninstances.l3vpninstance.vpninstafs.vpninstaf.vpntargets.VpnTarget;
+import org.onosproject.yang.gen.v1.ne.l3vpn.comm.rev20141225.nel3vpncomm.l3vpnifs.DefaultL3VpnIfs;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.bgp.l3vpn.rev20160909.ietfbgpl3vpn.devices.device.networkinstances.networkinstance.DefaultAugmentedNiNetworkInstance;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.bgp.l3vpn.rev20160909.ietfbgpl3vpn.l3vpnvrfparams.ipv4.Unicast;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.bgp.l3vpn.rev20160909.ietfbgpl3vpn.routetargetset.Rts;
@@ -105,7 +106,7 @@
static ModelObjectData getCreateVpnIns(ModelObjectData modObj,
boolean isDevAvail) {
ModelIdLevel modIdLvl = DEVICE;
- String id = getIdFromModId(modObj.identifier());
+ String id = getIdFromModId(modObj.identifier(), true);
Object obj = getObjFromModData(modObj);
if (obj == null) {
@@ -392,7 +393,7 @@
*/
static Object getDeleteVpnIns(ModelObjectData modObj) {
ModelIdLevel modIdLvl = DEVICE;
- String id = getIdFromModId(modObj.identifier());
+ String id = getIdFromModId(modObj.identifier(), true);
Object obj = getObjFromModData(modObj);
if (obj == null) {
@@ -434,20 +435,22 @@
switch (modIdLvl) {
case ROOT:
modId = getModObjIdDriDevices();
- break;
+ DefaultDevice device = new DefaultDevice();
+ return getData(modId, device);
case DEVICES:
+ DefaultL3Vpn l3Vpn = new DefaultL3Vpn();
modId = getModObjIdDriDevice(id).build();
- break;
+ return getData(modId, l3Vpn);
case DEVICE:
+ DefaultL3VpnIfs l3VpnIfs = new DefaultL3VpnIfs();
modId = getModObjIdDriVpn(id, name);
- break;
+ return getData(modId, l3VpnIfs);
default:
throw new IllegalArgumentException(UNSUPPORTED_MODEL_LVL);
}
- return getData(modId, null);
}
/**
diff --git a/drivers/huawei/driver/src/main/java/org/onosproject/drivers/huawei/IntConstructionUtil.java b/drivers/huawei/driver/src/main/java/org/onosproject/drivers/huawei/IntConstructionUtil.java
index da4a85c..bfd182a 100644
--- a/drivers/huawei/driver/src/main/java/org/onosproject/drivers/huawei/IntConstructionUtil.java
+++ b/drivers/huawei/driver/src/main/java/org/onosproject/drivers/huawei/IntConstructionUtil.java
@@ -77,7 +77,7 @@
*/
static ModelObjectData getCreateInt(ModelObjectData modObj) {
boolean isModIdAvail = true;
- String id = getIdFromModId(modObj.identifier());
+ String id = getIdFromModId(modObj.identifier(), false);
Object obj = getObjFromModData(modObj);
if (id == null) {
isModIdAvail = false;
diff --git a/drivers/huawei/driver/src/main/java/org/onosproject/drivers/huawei/L3VpnUtil.java b/drivers/huawei/driver/src/main/java/org/onosproject/drivers/huawei/L3VpnUtil.java
new file mode 100644
index 0000000..a0f04ce
--- /dev/null
+++ b/drivers/huawei/driver/src/main/java/org/onosproject/drivers/huawei/L3VpnUtil.java
@@ -0,0 +1,40 @@
+/*
+ * 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.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.instance.rev20160623.ietfnetworkinstance.devices.DeviceKeys;
+import org.onosproject.yang.model.KeyInfo;
+
+/**
+ * Representation of utility for huawei driver's L3VPN.
+ */
+public final class L3VpnUtil {
+
+ // No instantiation.
+ private L3VpnUtil() {
+ }
+
+ /**
+ * Returns the device id from the instance key.
+ *
+ * @param key instance key
+ * @return device id
+ */
+ static String getDevIdFromIns(KeyInfo key) {
+ return ((DeviceKeys) key).deviceid();
+ }
+}