[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();
+    }
+}
diff --git a/drivers/huawei/driver/src/main/resources/huawei-drivers.xml b/drivers/huawei/driver/src/main/resources/huawei-drivers.xml
index 35a1302..6918877 100644
--- a/drivers/huawei/driver/src/main/resources/huawei-drivers.xml
+++ b/drivers/huawei/driver/src/main/resources/huawei-drivers.xml
@@ -17,8 +17,8 @@
 <drivers>
     <driver name="huawei" extends="" manufacturer="Huawei"
             hwVersion="" swVersion="">
-        <behaviour api="org.onosproject.net.behaviour.L3vpnConfig"
-                   impl="org.onosproject.drivers.huawei.HuaweiL3vpnConfig"/>
+        <behaviour api="org.onosproject.net.behaviour.L3VpnConfig"
+                   impl="org.onosproject.drivers.huawei.HuaweiL3VpnConfig"/>
         <behaviour api="org.onosproject.net.device.DeviceDescriptionDiscovery"
                    impl="org.onosproject.drivers.huawei.HuaweiDeviceDescription"/>
         <behaviour api="org.onosproject.net.device.PortStatisticsDiscovery"
diff --git a/drivers/pom.xml b/drivers/pom.xml
index f68076b..5e73f4c 100644
--- a/drivers/pom.xml
+++ b/drivers/pom.xml
@@ -48,7 +48,6 @@
         <module>juniper</module>
         <module>lisp</module>
         <module>flowspec</module>
-        <module>huawei</module>
     </modules>
 
     <!--<properties>