[ONOS-6224] L3VPN service delete

Change-Id: I2eabb231def39dba6613dc5b95f2b16594133ad4
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
new file mode 100644
index 0000000..300e480
--- /dev/null
+++ b/drivers/huawei/driver/src/main/java/org/onosproject/drivers/huawei/HuaweiL3VpnConfig.java
@@ -0,0 +1,187 @@
+/*
+ * 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.onlab.osgi.ServiceNotFoundException;
+import org.onosproject.config.DynamicConfigService;
+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.driver.AbstractHandlerBehaviour;
+import org.onosproject.yang.gen.v1.l3vpn.comm.type.rev20141225.NeL3VpncommType;
+import org.onosproject.yang.gen.v1.ne.bgpcomm.rev20141225.NeBgpcomm;
+import org.onosproject.yang.gen.v1.ne.bgpcomm.type.rev20141225.NeBgpcommType;
+import org.onosproject.yang.gen.v1.ne.l3vpn.api.rev20141225.NeL3VpnApi;
+import org.onosproject.yang.gen.v1.ne.l3vpn.comm.rev20141225.NeL3Vpncomm;
+import org.onosproject.yang.model.DataNode;
+import org.onosproject.yang.model.ModelObjectData;
+import org.onosproject.yang.model.ResourceId;
+import org.onosproject.yang.model.YangModel;
+import org.onosproject.yang.model.YangModuleId;
+import org.onosproject.yang.runtime.DefaultAppModuleInfo;
+import org.onosproject.yang.runtime.ModelRegistrationParam;
+import org.onosproject.yang.runtime.YangModelRegistry;
+
+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;
+
+/**
+ * Configures l3vpn on Huawei devices.
+ */
+public class HuaweiL3VpnConfig extends AbstractHandlerBehaviour
+        implements L3VpnConfig {
+
+    /**
+     * YANG model registry.
+     */
+    protected YangModelRegistry modelRegistry;
+
+    /**
+     * Dynamic config service.
+     */
+    protected DynamicConfigService configService;
+
+    /**
+     * Constructs huawei L3VPN config.
+     */
+    public HuaweiL3VpnConfig() {
+    }
+
+    /**
+     * Takes the YANG model registry service and registers the driver YANG.
+     * If service is not available it throws exception.
+     */
+    private void init() {
+        try {
+            modelRegistry = handler().get(YangModelRegistry.class);
+            configService = handler().get(DynamicConfigService.class);
+            registerModel();
+        } catch (ServiceNotFoundException e) {
+            throw new ServiceNotFoundException(SERVICE_NOT_FOUND);
+        }
+    }
+
+    /**
+     * Registers the huawei generated classes to the YANG model.
+     */
+    private void registerModel() {
+        YangModel model = getYangModel(NeBgpcomm.class);
+        Iterator<YangModuleId> it = model.getYangModulesId().iterator();
+
+        //Create model registration param.
+        ModelRegistrationParam.Builder b = builder().setYangModel(model);
+        YangModuleId id;
+        while (it.hasNext()) {
+            id = it.next();
+            switch (id.moduleName()) {
+                case "ne-bgpcomm":
+                    b.addAppModuleInfo(id, new DefaultAppModuleInfo(
+                            NeBgpcomm.class, null));
+                    break;
+                case "ne-bgpcomm-type":
+                    b.addAppModuleInfo(id, new DefaultAppModuleInfo(
+                            NeBgpcommType.class, null));
+                    break;
+                case "ne-l3vpn-api":
+                    b.addAppModuleInfo(id, new DefaultAppModuleInfo(
+                            NeL3VpnApi.class, null));
+                    break;
+                case "ne-l3vpncomm":
+                    b.addAppModuleInfo(id, new DefaultAppModuleInfo(
+                            NeL3Vpncomm.class, null));
+                    break;
+                case "ne-l3vpncomm-type":
+                    b.addAppModuleInfo(id, new DefaultAppModuleInfo(
+                            NeL3VpncommType.class, null));
+                    break;
+                default:
+                    break;
+            }
+        }
+        ModelRegistrationParam regParam = b.build();
+        modelRegistry.registerModel(regParam);
+    }
+
+    @Override
+    public Object createInstance(Object objectData) {
+        if (modelRegistry == null) {
+            init();
+        }
+        return getCreateVpnIns((ModelObjectData) objectData,
+                               isDevicesPresent());
+    }
+
+    @Override
+    public Object bindInterface(Object objectData) {
+        return getCreateInt((ModelObjectData) objectData);
+    }
+
+    @Override
+    public Object createBgpInfo(Object bgpInfo, Object bgpConfig) {
+        return getCreateBgp((BgpInfo) bgpInfo, (BgpDriverInfo) bgpConfig);
+    }
+
+
+    @Override
+    public Object deleteInstance(Object objectData) {
+        return getDeleteVpnIns((ModelObjectData) objectData);
+    }
+
+    @Override
+    public Object unbindInterface(Object objectData) {
+        //TODO:To be committed.
+        return null;
+    }
+
+    @Override
+    public Object deleteBgpInfo(Object bgpInfo, Object bgpConfig) {
+        return getDeleteBgp((BgpInfo) bgpInfo, (BgpDriverInfo) bgpConfig);
+    }
+
+    /**
+     * Returns true if devices, which is the root node present in store;
+     * false otherwise.
+     *
+     * @return true if devices available; false otherwise
+     */
+    private boolean isDevicesPresent() {
+        ResourceId resId = ResourceId.builder()
+                .addBranchPointSchema(SLASH, null)
+                .addBranchPointSchema(DEVICES, NAMESPACE).build();
+        try {
+            DataNode node = configService.readNode(resId, null);
+            if (node != null) {
+                return true;
+            }
+        } catch (FailedException e) {
+            return false;
+        }
+        return false;
+    }
+}