Changed vpnmanager directory structure 94/17994/2
authorSasidharan Sambasivam <sasidharan.s.sambasivam@ericsson.com>
Thu, 9 Apr 2015 08:54:18 +0000 (14:24 +0530)
committerSasidharan Sambasivam <sasidharan.s.sambasivam@ericsson.com>
Thu, 9 Apr 2015 08:58:37 +0000 (14:28 +0530)
Change-Id: I8e9fc5b7ef10ee020a3f7abf6e068e05810f189f
Signed-off-by: Sasidharan Sambasivam <sasidharan.s.sambasivam@ericsson.com>
18 files changed:
pom.xml
vpnmanager-impl/src/main/config/maven-metadata-local.xml [deleted file]
vpnmanager/pom.xml [new file with mode: 0644]
vpnmanager/vpnmanager-api/pom.xml [moved from vpnmanager-api/pom.xml with 100% similarity]
vpnmanager/vpnmanager-api/src/main/yang/l3vpn.yang [moved from vpnmanager-api/src/main/yang/l3vpn.yang with 100% similarity]
vpnmanager/vpnmanager-api/src/main/yang/odl-l3vpn.yang [moved from vpnmanager-api/src/main/yang/odl-l3vpn.yang with 100% similarity]
vpnmanager/vpnmanager-impl/pom.xml [moved from vpnmanager-impl/pom.xml with 93% similarity]
vpnmanager/vpnmanager-impl/src/main/config/default-config.xml [moved from vpnmanager-impl/src/main/config/default-config.xml with 100% similarity]
vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/vpnservice/AbstractDataChangeListener.java [moved from vpnmanager-impl/src/main/java/org/opendaylight/vpnservice/AbstractDataChangeListener.java with 97% similarity]
vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/vpnservice/VpnInterfaceManager.java [moved from vpnmanager-impl/src/main/java/org/opendaylight/vpnservice/VpnInterfaceManager.java with 97% similarity]
vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/vpnservice/VpnManager.java [moved from vpnmanager-impl/src/main/java/org/opendaylight/vpnservice/VpnManager.java with 97% similarity]
vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/vpnservice/VpnUtil.java [moved from vpnmanager-impl/src/main/java/org/opendaylight/vpnservice/VpnUtil.java with 98% similarity]
vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/vpnservice/VpnserviceProvider.java [moved from vpnmanager-impl/src/main/java/org/opendaylight/vpnservice/VpnserviceProvider.java with 97% similarity]
vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/yang/gen/v1/urn/opendaylight/params/xml/ns/yang/vpnservice/impl/rev150216/VpnserviceImplModule.java [moved from vpnmanager-impl/src/main/java/org/opendaylight/yang/gen/v1/urn/opendaylight/params/xml/ns/yang/vpnservice/impl/rev150216/VpnserviceImplModule.java with 100% similarity]
vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/yang/gen/v1/urn/opendaylight/params/xml/ns/yang/vpnservice/impl/rev150216/VpnserviceImplModuleFactory.java [moved from vpnmanager-impl/src/main/java/org/opendaylight/yang/gen/v1/urn/opendaylight/params/xml/ns/yang/vpnservice/impl/rev150216/VpnserviceImplModuleFactory.java with 100% similarity]
vpnmanager/vpnmanager-impl/src/main/yang/vpnservice-impl.yang [moved from vpnmanager-impl/src/main/yang/vpnservice-impl.yang with 100% similarity]
vpnmanager/vpnmanager-impl/src/test/java/org/opendaylight/vpnservice/test/MockDataChangedEvent.java [moved from vpnmanager-impl/src/test/java/org/opendaylight/vpnservice/test/MockDataChangedEvent.java with 96% similarity]
vpnmanager/vpnmanager-impl/src/test/java/org/opendaylight/vpnservice/test/VpnServiceTest.java [moved from vpnmanager-impl/src/test/java/org/opendaylight/vpnservice/test/VpnServiceTest.java with 98% similarity]

diff --git a/pom.xml b/pom.xml
index 436bf1d3a2977105f6bf74025dd45708777db0fe..0db9c69ddd00b94c4dfe6c3bcbf843723c2b1780 100644 (file)
--- a/pom.xml
+++ b/pom.xml
@@ -17,8 +17,7 @@ and is available at http://www.eclipse.org/legal/epl-v10.html INTERNAL
   </prerequisites>
   <modules>
        <module>model-bgp</module>
-    <module>vpnmanager-api</module>
-    <module>vpnmanager-impl</module>
+    <module>vpnmanager</module>
     <module>distribution/karaf</module>
     <module>features</module>
     <module>vpnservice-artifacts</module>
diff --git a/vpnmanager-impl/src/main/config/maven-metadata-local.xml b/vpnmanager-impl/src/main/config/maven-metadata-local.xml
deleted file mode 100644 (file)
index 258959f..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<metadata modelVersion="1.1.0">
-  <groupId>org.opendaylight.vpnservice</groupId>
-  <artifactId>vpnmanager-impl</artifactId>
-  <version>1.0-SNAPSHOT</version>
-  <versioning>
-    <snapshot>
-      <localCopy>true</localCopy>
-    </snapshot>
-    <lastUpdated>20150213123103</lastUpdated>
-    <snapshotVersions>
-      <snapshotVersion>
-        <classifier>config</classifier>
-        <extension>xml</extension>
-        <value>1.0-SNAPSHOT</value>
-        <updated>20150213123103</updated>
-      </snapshotVersion>
-    </snapshotVersions>
-  </versioning>
-</metadata>
diff --git a/vpnmanager/pom.xml b/vpnmanager/pom.xml
new file mode 100644 (file)
index 0000000..49922b6
--- /dev/null
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright (c) 2015 Ericsson India Global Services Pvt Ltd. and others. All rights reserved.
+This program and the accompanying materials are made available under the
+terms of the Eclipse Public License v1.0 which accompanies this distribution,
+and is available at http://www.eclipse.org/legal/epl-v10.html INTERNAL
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+
+  <parent>
+    <groupId>org.opendaylight.odlparent</groupId>
+    <artifactId>odlparent</artifactId>
+    <version>1.5.0-SNAPSHOT</version>
+       <relativePath/>
+  </parent>
+
+  <groupId>org.opendaylight.vpnservice</groupId>
+  <artifactId>vpnmanager</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+  <name>vpnmanager</name>
+  <packaging>pom</packaging>
+  <modelVersion>4.0.0</modelVersion>
+  <prerequisites>
+    <maven>3.1.1</maven>
+  </prerequisites>
+  <modules>
+    <module>vpnmanager-api</module>
+    <module>vpnmanager-impl</module>
+  </modules>
+  <!-- DO NOT install or deploy the repo root pom as it's only needed to initiate a build -->
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-deploy-plugin</artifactId>
+        <configuration>
+          <skip>true</skip>
+        </configuration>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-install-plugin</artifactId>
+        <configuration>
+          <skip>true</skip>
+        </configuration>
+      </plugin>
+    </plugins>
+  </build>
+</project>
similarity index 93%
rename from vpnmanager-impl/pom.xml
rename to vpnmanager/vpnmanager-impl/pom.xml
index 5c87523e361915b53e50f64cda20329ec2491094..3eaa892d2d1dc2fd5dbad3e7e6e072e75aeeafe4 100644 (file)
@@ -1,57 +1,57 @@
-<?xml version="1.0" encoding="UTF-8"?>\r
-<!-- vi: set et smarttab sw=4 tabstop=4: --><!--\r
-Copyright (c) 2015 Ericsson India Global Services Pvt Ltd. and others.  All rights reserved.\r
-\r
-This program and the accompanying materials are made available under the\r
-terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
-and is available at http://www.eclipse.org/legal/epl-v10.html\r
--->\r
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">\r
-\r
-  <parent>\r
-    <groupId>org.opendaylight.controller</groupId>\r
-    <artifactId>config-parent</artifactId>\r
-    <version>0.3.0-SNAPSHOT</version>\r
-    <relativePath/>\r
-  </parent>\r
-\r
-  <modelVersion>4.0.0</modelVersion>\r
-  <groupId>org.opendaylight.vpnservice</groupId>\r
-  <artifactId>vpnmanager-impl</artifactId>\r
-  <version>0.0.1-SNAPSHOT</version>\r
-  <packaging>bundle</packaging>\r
-  <dependencies>\r
-    <dependency>\r
-      <groupId>${project.groupId}</groupId>\r
-      <artifactId>vpnmanager-api</artifactId>\r
-      <version>${project.version}</version>\r
-    </dependency>\r
-           <!--  TEST Dependencies -->\r
-    <dependency>\r
-      <groupId>junit</groupId>\r
-      <artifactId>junit</artifactId>\r
-    </dependency>\r
-       <dependency>\r
-       <groupId>org.mockito</groupId>\r
-       <artifactId>mockito-all</artifactId>\r
-       <scope>test</scope>\r
-    </dependency>\r
-  </dependencies>\r
-  <build>\r
-    <plugins>\r
-      <plugin>\r
-        <groupId>org.apache.maven.plugins</groupId>\r
-        <artifactId>maven-checkstyle-plugin</artifactId>\r
-        <configuration>\r
-          <configLocation>\r
-            ${project.basedir}/../commons/src/main/resources/vpns_checks.xml\r
-          </configLocation>\r
-          <failsOnError>true</failsOnError>\r
-          <includes>**/*.java,**/*.xml,**/*.ini</includes>\r
-          <excludes>**/yang/</excludes>\r
-        </configuration>\r
-      </plugin>\r
-    </plugins>\r
-  </build>\r
-\r
-</project>\r
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- vi: set et smarttab sw=4 tabstop=4: --><!--
+Copyright (c) 2015 Ericsson India Global Services Pvt Ltd. and others.  All rights reserved.
+
+This program and the accompanying materials are made available under the
+terms of the Eclipse Public License v1.0 which accompanies this distribution,
+and is available at http://www.eclipse.org/legal/epl-v10.html
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+
+  <parent>
+    <groupId>org.opendaylight.controller</groupId>
+    <artifactId>config-parent</artifactId>
+    <version>0.3.0-SNAPSHOT</version>
+    <relativePath/>
+  </parent>
+
+  <modelVersion>4.0.0</modelVersion>
+  <groupId>org.opendaylight.vpnservice</groupId>
+  <artifactId>vpnmanager-impl</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+  <packaging>bundle</packaging>
+  <dependencies>
+    <dependency>
+      <groupId>${project.groupId}</groupId>
+      <artifactId>vpnmanager-api</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+           <!--  TEST Dependencies -->
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+    </dependency>
+       <dependency>
+       <groupId>org.mockito</groupId>
+       <artifactId>mockito-all</artifactId>
+       <scope>test</scope>
+    </dependency>
+  </dependencies>
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-checkstyle-plugin</artifactId>
+        <configuration>
+          <configLocation>
+            ${project.basedir}/../../commons/src/main/resources/vpns_checks.xml
+          </configLocation>
+          <failsOnError>true</failsOnError>
+          <includes>**/*.java,**/*.xml,**/*.ini</includes>
+          <excludes>**/yang/</excludes>
+        </configuration>
+      </plugin>
+    </plugins>
+  </build>
+
+</project>
similarity index 97%
rename from vpnmanager-impl/src/main/java/org/opendaylight/vpnservice/AbstractDataChangeListener.java
rename to vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/vpnservice/AbstractDataChangeListener.java
index 88e2893fd2fe74e412d6e62d4e6c4c8ed91becfa..df8471e33e04c28d0dda355bfa45d48a22bf2fdd 100644 (file)
-/*\r
- * Copyright (c) 2015 Ericsson India Global Services Pvt Ltd. and others.  All rights reserved.\r
- *\r
- * This program and the accompanying materials are made available under the\r
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
- * and is available at http://www.eclipse.org/legal/epl-v10.html\r
- */\r
-package org.opendaylight.vpnservice;\r
-\r
-import com.google.common.base.Optional;\r
-import com.google.common.base.Preconditions;\r
-\r
-import org.opendaylight.controller.md.sal.binding.api.DataChangeListener;\r
-import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent;\r
-import org.opendaylight.yangtools.yang.binding.DataObject;\r
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;\r
-\r
-import java.util.Collections;\r
-import java.util.Map;\r
-import java.util.Set;\r
-\r
-/**\r
- * AbstractDataChangeListener implemented basic {@link DataChangeListener} processing for\r
- * VPN related Data Objects.\r
- */\r
-public abstract class AbstractDataChangeListener<T extends DataObject> implements DataChangeListener {\r
-\r
-    protected final Class<T> clazz;\r
-\r
-    /**\r
-     * \r
-     * @param clazz - for which the data change event is received\r
-     */\r
-    public AbstractDataChangeListener(Class<T> clazz) {\r
-        this.clazz = Preconditions.checkNotNull(clazz, "Class can not be null!");\r
-    }\r
-\r
-    @Override\r
-    public void onDataChanged(final AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> changeEvent) {\r
-        Preconditions.checkNotNull(changeEvent,"Async ChangeEvent can not be null!");\r
-\r
-        /* All DataObjects for create */\r
-        final Map<InstanceIdentifier<?>, DataObject> createdData = changeEvent.getCreatedData() != null\r
-                ? changeEvent.getCreatedData() : Collections.<InstanceIdentifier<?>, DataObject>emptyMap();\r
-        /* All DataObjects for remove */\r
-        final Set<InstanceIdentifier<?>> removeData = changeEvent.getRemovedPaths() != null\r
-                ? changeEvent.getRemovedPaths() : Collections.<InstanceIdentifier<?>>emptySet();\r
-        /* All DataObjects for updates */\r
-        final Map<InstanceIdentifier<?>, DataObject> updateData = changeEvent.getUpdatedData() != null\r
-                ? changeEvent.getUpdatedData() : Collections.<InstanceIdentifier<?>, DataObject>emptyMap();\r
-        /* All Original DataObjects */\r
-        final Map<InstanceIdentifier<?>, DataObject> originalData = changeEvent.getOriginalData() != null\r
-                ? changeEvent.getOriginalData() : Collections.<InstanceIdentifier<?>, DataObject>emptyMap();\r
-\r
-        this.createData(createdData);\r
-        this.updateData(updateData, originalData);\r
-        this.removeData(removeData, originalData);\r
-    }\r
-\r
-    @SuppressWarnings("unchecked")\r
-    private void createData(final Map<InstanceIdentifier<?>, DataObject> createdData) {\r
-        final Set<InstanceIdentifier<?>> keys = createdData.keySet() != null\r
-                ? createdData.keySet() : Collections.<InstanceIdentifier<?>>emptySet();\r
-        for (InstanceIdentifier<?> key : keys) {\r
-            if (clazz.equals(key.getTargetType())) {\r
-                InstanceIdentifier<T> createKeyIdent = key.firstIdentifierOf(clazz);\r
-                final Optional<DataObject> value = Optional.of(createdData.get(key));\r
-                if (value.isPresent()) {\r
-                    this.add(createKeyIdent, (T)value.get());\r
-                }\r
-            }\r
-        }\r
-    }\r
-\r
-    @SuppressWarnings("unchecked")\r
-    private void updateData(final Map<InstanceIdentifier<?>, DataObject> updateData,\r
-            final Map<InstanceIdentifier<?>, DataObject> originalData) {\r
-\r
-        final Set<InstanceIdentifier<?>> keys = updateData.keySet() != null\r
-                ? updateData.keySet() : Collections.<InstanceIdentifier<?>>emptySet();\r
-        for (InstanceIdentifier<?> key : keys) {\r
-            if (clazz.equals(key.getTargetType())) {\r
-                InstanceIdentifier<T> updateKeyIdent = key.firstIdentifierOf(clazz);\r
-                final Optional<DataObject> value = Optional.of(updateData.get(key));\r
-                final Optional<DataObject> original = Optional.of(originalData.get(key));\r
-                if (value.isPresent() && original.isPresent()) {\r
-                    this.update(updateKeyIdent, (T)original.get(), (T)value.get());\r
-                }\r
-            }\r
-        }\r
-    }\r
-\r
-    @SuppressWarnings("unchecked")\r
-    private void removeData(final Set<InstanceIdentifier<?>> removeData,\r
-            final Map<InstanceIdentifier<?>, DataObject> originalData) {\r
-\r
-        for (InstanceIdentifier<?> key : removeData) {\r
-            if (clazz.equals(key.getTargetType())) {\r
-                final InstanceIdentifier<T> ident = key.firstIdentifierOf(clazz);\r
-                final DataObject removeValue = originalData.get(key);\r
-                this.remove(ident, (T)removeValue);\r
-            }\r
-        }\r
-    }\r
-\r
-    protected abstract void remove(InstanceIdentifier<T> identifier, T del);\r
-\r
-    protected abstract void update(InstanceIdentifier<T> identifier, T original, T update);\r
-\r
-    protected abstract void add(InstanceIdentifier<T> identifier, T add);\r
-\r
-}\r
-\r
-\r
+/*
+ * Copyright (c) 2015 Ericsson India Global Services Pvt Ltd. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.vpnservice;
+
+import com.google.common.base.Optional;
+import com.google.common.base.Preconditions;
+
+import org.opendaylight.controller.md.sal.binding.api.DataChangeListener;
+import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent;
+import org.opendaylight.yangtools.yang.binding.DataObject;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+
+import java.util.Collections;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * AbstractDataChangeListener implemented basic {@link DataChangeListener} processing for
+ * VPN related Data Objects.
+ */
+public abstract class AbstractDataChangeListener<T extends DataObject> implements DataChangeListener {
+
+    protected final Class<T> clazz;
+
+    /**
+     * 
+     * @param clazz - for which the data change event is received
+     */
+    public AbstractDataChangeListener(Class<T> clazz) {
+        this.clazz = Preconditions.checkNotNull(clazz, "Class can not be null!");
+    }
+
+    @Override
+    public void onDataChanged(final AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> changeEvent) {
+        Preconditions.checkNotNull(changeEvent,"Async ChangeEvent can not be null!");
+
+        /* All DataObjects for create */
+        final Map<InstanceIdentifier<?>, DataObject> createdData = changeEvent.getCreatedData() != null
+                ? changeEvent.getCreatedData() : Collections.<InstanceIdentifier<?>, DataObject>emptyMap();
+        /* All DataObjects for remove */
+        final Set<InstanceIdentifier<?>> removeData = changeEvent.getRemovedPaths() != null
+                ? changeEvent.getRemovedPaths() : Collections.<InstanceIdentifier<?>>emptySet();
+        /* All DataObjects for updates */
+        final Map<InstanceIdentifier<?>, DataObject> updateData = changeEvent.getUpdatedData() != null
+                ? changeEvent.getUpdatedData() : Collections.<InstanceIdentifier<?>, DataObject>emptyMap();
+        /* All Original DataObjects */
+        final Map<InstanceIdentifier<?>, DataObject> originalData = changeEvent.getOriginalData() != null
+                ? changeEvent.getOriginalData() : Collections.<InstanceIdentifier<?>, DataObject>emptyMap();
+
+        this.createData(createdData);
+        this.updateData(updateData, originalData);
+        this.removeData(removeData, originalData);
+    }
+
+    @SuppressWarnings("unchecked")
+    private void createData(final Map<InstanceIdentifier<?>, DataObject> createdData) {
+        final Set<InstanceIdentifier<?>> keys = createdData.keySet() != null
+                ? createdData.keySet() : Collections.<InstanceIdentifier<?>>emptySet();
+        for (InstanceIdentifier<?> key : keys) {
+            if (clazz.equals(key.getTargetType())) {
+                InstanceIdentifier<T> createKeyIdent = key.firstIdentifierOf(clazz);
+                final Optional<DataObject> value = Optional.of(createdData.get(key));
+                if (value.isPresent()) {
+                    this.add(createKeyIdent, (T)value.get());
+                }
+            }
+        }
+    }
+
+    @SuppressWarnings("unchecked")
+    private void updateData(final Map<InstanceIdentifier<?>, DataObject> updateData,
+            final Map<InstanceIdentifier<?>, DataObject> originalData) {
+
+        final Set<InstanceIdentifier<?>> keys = updateData.keySet() != null
+                ? updateData.keySet() : Collections.<InstanceIdentifier<?>>emptySet();
+        for (InstanceIdentifier<?> key : keys) {
+            if (clazz.equals(key.getTargetType())) {
+                InstanceIdentifier<T> updateKeyIdent = key.firstIdentifierOf(clazz);
+                final Optional<DataObject> value = Optional.of(updateData.get(key));
+                final Optional<DataObject> original = Optional.of(originalData.get(key));
+                if (value.isPresent() && original.isPresent()) {
+                    this.update(updateKeyIdent, (T)original.get(), (T)value.get());
+                }
+            }
+        }
+    }
+
+    @SuppressWarnings("unchecked")
+    private void removeData(final Set<InstanceIdentifier<?>> removeData,
+            final Map<InstanceIdentifier<?>, DataObject> originalData) {
+
+        for (InstanceIdentifier<?> key : removeData) {
+            if (clazz.equals(key.getTargetType())) {
+                final InstanceIdentifier<T> ident = key.firstIdentifierOf(clazz);
+                final DataObject removeValue = originalData.get(key);
+                this.remove(ident, (T)removeValue);
+            }
+        }
+    }
+
+    protected abstract void remove(InstanceIdentifier<T> identifier, T del);
+
+    protected abstract void update(InstanceIdentifier<T> identifier, T original, T update);
+
+    protected abstract void add(InstanceIdentifier<T> identifier, T add);
+
+}
+
+
similarity index 97%
rename from vpnmanager-impl/src/main/java/org/opendaylight/vpnservice/VpnInterfaceManager.java
rename to vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/vpnservice/VpnInterfaceManager.java
index a23c6bcae27f40d9ad4868e25674c2c5e6cab82b..e7bca5339d9d60ec61aaa03e9dce96f612775bcb 100644 (file)
-/*\r
- * Copyright (c) 2015 Ericsson India Global Services Pvt Ltd. and others.  All rights reserved.\r
- *\r
- * This program and the accompanying materials are made available under the\r
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
- * and is available at http://www.eclipse.org/legal/epl-v10.html\r
- */\r
-package org.opendaylight.vpnservice;\r
-\r
-import java.util.List;\r
-import java.util.ArrayList;\r
-\r
-import com.google.common.base.Optional;\r
-import com.google.common.util.concurrent.Futures;\r
-import com.google.common.util.concurrent.FutureCallback;\r
-\r
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;\r
-import org.opendaylight.controller.md.sal.binding.api.DataChangeListener;\r
-import org.opendaylight.yangtools.concepts.ListenerRegistration;\r
-import org.opendaylight.yangtools.yang.binding.DataObject;\r
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;\r
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.InstanceIdentifierBuilder;\r
-import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;\r
-import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;\r
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;\r
-import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker.DataChangeScope;\r
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.Interfaces;\r
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface;\r
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.InterfaceKey;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.l3vpn.rev130911.AdjacencyList;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.l3vpn.rev130911.adjacency.list.Adjacency;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.l3vpn.rev130911.adjacency.list.AdjacencyBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.VpnInterfaces;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.l3vpn.rev130911.Adjacencies;\r
-import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.vpn.interfaces.VpnInterface;\r
-import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.vpn.interfaces.VpnInterfaceKey;\r
-import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.vpn.interfaces.VpnInterfaceBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.l3vpn.rev130911.AdjacenciesBuilder;\r
-import org.slf4j.Logger;\r
-import org.slf4j.LoggerFactory;\r
-\r
-public class VpnInterfaceManager extends AbstractDataChangeListener<VpnInterface> implements AutoCloseable {\r
-    private static final Logger LOG = LoggerFactory.getLogger(VpnInterfaceManager.class);\r
-    private ListenerRegistration<DataChangeListener> listenerRegistration;\r
-    private final DataBroker broker;\r
-\r
-    private static final FutureCallback<Void> DEFAULT_CALLBACK =\r
-            new FutureCallback<Void>() {\r
-                public void onSuccess(Void result) {\r
-                    LOG.info("Success in Datastore write operation");\r
-                }\r
-\r
-                public void onFailure(Throwable error) {\r
-                    LOG.error("Error in Datastore write operation", error);\r
-                };\r
-            };\r
-\r
-    /**\r
-     * Responsible for listening to data change related to VPN Interface\r
-     * Bind VPN Service on the interface and informs the BGP service\r
-     * \r
-     * @param db - dataBroker service reference\r
-     */\r
-    public VpnInterfaceManager(final DataBroker db) {\r
-        super(VpnInterface.class);\r
-        broker = db;\r
-        registerListener(db);\r
-    }\r
-\r
-    @Override\r
-    public void close() throws Exception {\r
-        if (listenerRegistration != null) {\r
-            try {\r
-                listenerRegistration.close();\r
-            } catch (final Exception e) {\r
-                LOG.error("Error when cleaning up DataChangeListener.", e);\r
-            }\r
-            listenerRegistration = null;\r
-        }\r
-        LOG.info("VPN Interface Manager Closed");\r
-    }\r
-\r
-    private void registerListener(final DataBroker db) {\r
-        try {\r
-            listenerRegistration = db.registerDataChangeListener(LogicalDatastoreType.CONFIGURATION,\r
-                    getWildCardPath(), VpnInterfaceManager.this, DataChangeScope.SUBTREE);\r
-        } catch (final Exception e) {\r
-            LOG.error("VPN Service DataChange listener registration fail!", e);\r
-            throw new IllegalStateException("VPN Service registration Listener failed.", e);\r
-        }\r
-    }\r
-\r
-    @Override\r
-    protected void add(final InstanceIdentifier<VpnInterface> identifier,\r
-            final VpnInterface vpnInterface) {\r
-        LOG.info("key: " + identifier + ", value=" + vpnInterface );\r
-        addInterface(identifier, vpnInterface);\r
-    }\r
-\r
-    private void addInterface(final InstanceIdentifier<VpnInterface> identifier,\r
-                              final VpnInterface vpnInterface) {\r
-        final VpnInterfaceKey key = identifier.firstKeyOf(VpnInterface.class, VpnInterfaceKey.class);\r
-        String interfaceName = key.getName();\r
-        InstanceIdentifierBuilder<Interface> idBuilder = \r
-                InstanceIdentifier.builder(Interfaces.class).child(Interface.class, new InterfaceKey(interfaceName));\r
-        InstanceIdentifier<Interface> id = idBuilder.build();\r
-        Optional<Interface> port = read(LogicalDatastoreType.CONFIGURATION, id);\r
-        if (port.isPresent()) {\r
-            Interface interf = port.get();\r
-            bindServiceOnInterface(interf);\r
-            updateNextHops(identifier, vpnInterface);\r
-        }\r
-    }\r
-\r
-    private void updateNextHops(final InstanceIdentifier<VpnInterface> identifier, VpnInterface intf) {\r
-        //Read NextHops\r
-        InstanceIdentifier<Adjacencies> path = identifier.augmentation(Adjacencies.class);\r
-        Optional<Adjacencies> adjacencies = read(LogicalDatastoreType.CONFIGURATION, path);\r
-        String intfName = intf.getName();\r
-\r
-        if (adjacencies.isPresent()) {\r
-            List<Adjacency> nextHops = adjacencies.get().getAdjacency();\r
-            List<Adjacency> value = new ArrayList<>();\r
-\r
-            if (!nextHops.isEmpty()) {\r
-                LOG.info("NextHops are " + nextHops);\r
-                for (Adjacency nextHop : nextHops) {\r
-                    //TODO: Generate label for the prefix and store it in the next hop model\r
-                    long label = 200;\r
-\r
-                    //TODO: Update BGP\r
-                    updatePrefixToBGP(nextHop);\r
-                    value.add(new AdjacencyBuilder(nextHop).setLabel(label).build());\r
-                }\r
-            }\r
-            Adjacencies aug = VpnUtil.getVpnInterfaceAugmentation(value);\r
-            VpnInterface opInterface = VpnUtil.getVpnInterface(intfName, intf.getVpnInstanceName(), aug);\r
-            InstanceIdentifier<VpnInterface> interfaceId = VpnUtil.getVpnInterfaceIdentifier(intfName);\r
-            asyncWrite(LogicalDatastoreType.OPERATIONAL, interfaceId, opInterface, DEFAULT_CALLBACK);\r
-        }\r
-    }\r
-\r
-    private void bindServiceOnInterface(Interface intf) {\r
-        //TODO: Create Ingress flow on the interface to bind the VPN service\r
-    }\r
-\r
-    private void updatePrefixToBGP(Adjacency nextHop) {\r
-        //TODO: Update the Prefix to BGP\r
-    }\r
-\r
-    private <T extends DataObject> Optional<T> read(LogicalDatastoreType datastoreType,\r
-            InstanceIdentifier<T> path) {\r
-\r
-        ReadOnlyTransaction tx = broker.newReadOnlyTransaction();\r
-\r
-        Optional<T> result = Optional.absent();\r
-        try {\r
-            result = tx.read(datastoreType, path).get();\r
-        } catch (Exception e) {\r
-            throw new RuntimeException(e);\r
-        }\r
-\r
-        return result;\r
-    }\r
-\r
-    private InstanceIdentifier<VpnInterface> getWildCardPath() {\r
-        return InstanceIdentifier.create(VpnInterfaces.class).child(VpnInterface.class);\r
-    }\r
-\r
-    @Override\r
-    protected void remove( InstanceIdentifier<VpnInterface> identifier, VpnInterface del) {\r
-        // TODO Auto-generated method stub\r
-\r
-    }\r
-\r
-    @Override\r
-    protected void update(InstanceIdentifier<VpnInterface> identifier, \r
-                                   VpnInterface original, VpnInterface update) {\r
-        // TODO Auto-generated method stub\r
-\r
-    }\r
-\r
-    private <T extends DataObject> void asyncWrite(LogicalDatastoreType datastoreType,\r
-                        InstanceIdentifier<T> path, T data, FutureCallback<Void> callback) {\r
-        WriteTransaction tx = broker.newWriteOnlyTransaction();\r
-        tx.put(datastoreType, path, data, true);\r
-        Futures.addCallback(tx.submit(), callback);\r
-    }\r
-}\r
+/*
+ * Copyright (c) 2015 Ericsson India Global Services Pvt Ltd. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.vpnservice;
+
+import java.util.List;
+import java.util.ArrayList;
+
+import com.google.common.base.Optional;
+import com.google.common.util.concurrent.Futures;
+import com.google.common.util.concurrent.FutureCallback;
+
+import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.controller.md.sal.binding.api.DataChangeListener;
+import org.opendaylight.yangtools.concepts.ListenerRegistration;
+import org.opendaylight.yangtools.yang.binding.DataObject;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.InstanceIdentifierBuilder;
+import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
+import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
+import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker.DataChangeScope;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.Interfaces;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.InterfaceKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.l3vpn.rev130911.AdjacencyList;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.l3vpn.rev130911.adjacency.list.Adjacency;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.l3vpn.rev130911.adjacency.list.AdjacencyBuilder;
+import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.VpnInterfaces;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.l3vpn.rev130911.Adjacencies;
+import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.vpn.interfaces.VpnInterface;
+import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.vpn.interfaces.VpnInterfaceKey;
+import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.vpn.interfaces.VpnInterfaceBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.l3vpn.rev130911.AdjacenciesBuilder;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class VpnInterfaceManager extends AbstractDataChangeListener<VpnInterface> implements AutoCloseable {
+    private static final Logger LOG = LoggerFactory.getLogger(VpnInterfaceManager.class);
+    private ListenerRegistration<DataChangeListener> listenerRegistration;
+    private final DataBroker broker;
+
+    private static final FutureCallback<Void> DEFAULT_CALLBACK =
+            new FutureCallback<Void>() {
+                public void onSuccess(Void result) {
+                    LOG.info("Success in Datastore write operation");
+                }
+
+                public void onFailure(Throwable error) {
+                    LOG.error("Error in Datastore write operation", error);
+                };
+            };
+
+    /**
+     * Responsible for listening to data change related to VPN Interface
+     * Bind VPN Service on the interface and informs the BGP service
+     * 
+     * @param db - dataBroker service reference
+     */
+    public VpnInterfaceManager(final DataBroker db) {
+        super(VpnInterface.class);
+        broker = db;
+        registerListener(db);
+    }
+
+    @Override
+    public void close() throws Exception {
+        if (listenerRegistration != null) {
+            try {
+                listenerRegistration.close();
+            } catch (final Exception e) {
+                LOG.error("Error when cleaning up DataChangeListener.", e);
+            }
+            listenerRegistration = null;
+        }
+        LOG.info("VPN Interface Manager Closed");
+    }
+
+    private void registerListener(final DataBroker db) {
+        try {
+            listenerRegistration = db.registerDataChangeListener(LogicalDatastoreType.CONFIGURATION,
+                    getWildCardPath(), VpnInterfaceManager.this, DataChangeScope.SUBTREE);
+        } catch (final Exception e) {
+            LOG.error("VPN Service DataChange listener registration fail!", e);
+            throw new IllegalStateException("VPN Service registration Listener failed.", e);
+        }
+    }
+
+    @Override
+    protected void add(final InstanceIdentifier<VpnInterface> identifier,
+            final VpnInterface vpnInterface) {
+        LOG.info("key: " + identifier + ", value=" + vpnInterface );
+        addInterface(identifier, vpnInterface);
+    }
+
+    private void addInterface(final InstanceIdentifier<VpnInterface> identifier,
+                              final VpnInterface vpnInterface) {
+        final VpnInterfaceKey key = identifier.firstKeyOf(VpnInterface.class, VpnInterfaceKey.class);
+        String interfaceName = key.getName();
+        InstanceIdentifierBuilder<Interface> idBuilder = 
+                InstanceIdentifier.builder(Interfaces.class).child(Interface.class, new InterfaceKey(interfaceName));
+        InstanceIdentifier<Interface> id = idBuilder.build();
+        Optional<Interface> port = read(LogicalDatastoreType.CONFIGURATION, id);
+        if (port.isPresent()) {
+            Interface interf = port.get();
+            bindServiceOnInterface(interf);
+            updateNextHops(identifier, vpnInterface);
+        }
+    }
+
+    private void updateNextHops(final InstanceIdentifier<VpnInterface> identifier, VpnInterface intf) {
+        //Read NextHops
+        InstanceIdentifier<Adjacencies> path = identifier.augmentation(Adjacencies.class);
+        Optional<Adjacencies> adjacencies = read(LogicalDatastoreType.CONFIGURATION, path);
+        String intfName = intf.getName();
+
+        if (adjacencies.isPresent()) {
+            List<Adjacency> nextHops = adjacencies.get().getAdjacency();
+            List<Adjacency> value = new ArrayList<>();
+
+            if (!nextHops.isEmpty()) {
+                LOG.info("NextHops are " + nextHops);
+                for (Adjacency nextHop : nextHops) {
+                    //TODO: Generate label for the prefix and store it in the next hop model
+                    long label = 200;
+
+                    //TODO: Update BGP
+                    updatePrefixToBGP(nextHop);
+                    value.add(new AdjacencyBuilder(nextHop).setLabel(label).build());
+                }
+            }
+            Adjacencies aug = VpnUtil.getVpnInterfaceAugmentation(value);
+            VpnInterface opInterface = VpnUtil.getVpnInterface(intfName, intf.getVpnInstanceName(), aug);
+            InstanceIdentifier<VpnInterface> interfaceId = VpnUtil.getVpnInterfaceIdentifier(intfName);
+            asyncWrite(LogicalDatastoreType.OPERATIONAL, interfaceId, opInterface, DEFAULT_CALLBACK);
+        }
+    }
+
+    private void bindServiceOnInterface(Interface intf) {
+        //TODO: Create Ingress flow on the interface to bind the VPN service
+    }
+
+    private void updatePrefixToBGP(Adjacency nextHop) {
+        //TODO: Update the Prefix to BGP
+    }
+
+    private <T extends DataObject> Optional<T> read(LogicalDatastoreType datastoreType,
+            InstanceIdentifier<T> path) {
+
+        ReadOnlyTransaction tx = broker.newReadOnlyTransaction();
+
+        Optional<T> result = Optional.absent();
+        try {
+            result = tx.read(datastoreType, path).get();
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+
+        return result;
+    }
+
+    private InstanceIdentifier<VpnInterface> getWildCardPath() {
+        return InstanceIdentifier.create(VpnInterfaces.class).child(VpnInterface.class);
+    }
+
+    @Override
+    protected void remove( InstanceIdentifier<VpnInterface> identifier, VpnInterface del) {
+        // TODO Auto-generated method stub
+
+    }
+
+    @Override
+    protected void update(InstanceIdentifier<VpnInterface> identifier, 
+                                   VpnInterface original, VpnInterface update) {
+        // TODO Auto-generated method stub
+
+    }
+
+    private <T extends DataObject> void asyncWrite(LogicalDatastoreType datastoreType,
+                        InstanceIdentifier<T> path, T data, FutureCallback<Void> callback) {
+        WriteTransaction tx = broker.newWriteOnlyTransaction();
+        tx.put(datastoreType, path, data, true);
+        Futures.addCallback(tx.submit(), callback);
+    }
+}
similarity index 97%
rename from vpnmanager-impl/src/main/java/org/opendaylight/vpnservice/VpnManager.java
rename to vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/vpnservice/VpnManager.java
index fc02a3f837c6373c2340dc1ab7ac279374960fe8..75c159fc9136a62bc1fc1023f79c42d3b980848b 100644 (file)
@@ -1,85 +1,85 @@
-/*\r
- * Copyright (c) 2015 Ericsson India Global Services Pvt Ltd. and others.  All rights reserved.\r
- *\r
- * This program and the accompanying materials are made available under the\r
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
- * and is available at http://www.eclipse.org/legal/epl-v10.html\r
- */\r
-package org.opendaylight.vpnservice;\r
-\r
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;\r
-import org.opendaylight.controller.md.sal.binding.api.DataChangeListener;\r
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;\r
-import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker.DataChangeScope;\r
-import org.opendaylight.yangtools.concepts.ListenerRegistration;\r
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;\r
-import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.vpn.instances.VpnInstance;\r
-import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.VpnInstances;\r
-import org.slf4j.Logger;\r
-import org.slf4j.LoggerFactory;\r
-\r
-public class VpnManager extends AbstractDataChangeListener<VpnInstance> implements AutoCloseable {\r
-    private static final Logger LOG = LoggerFactory.getLogger(VpnManager.class);\r
-    private ListenerRegistration<DataChangeListener> listenerRegistration;\r
-    private final DataBroker broker;\r
-\r
-    /**\r
-     * Listens for data change related to VPN Instance\r
-     * Informs the BGP about VRF information\r
-     * \r
-     * @param db - dataBroker reference\r
-     */\r
-    public VpnManager(final DataBroker db) {\r
-        super(VpnInstance.class);\r
-        broker = db;\r
-        registerListener(db);\r
-    }\r
-\r
-    private void registerListener(final DataBroker db) {\r
-        try {\r
-            listenerRegistration = db.registerDataChangeListener(LogicalDatastoreType.CONFIGURATION,\r
-                    getWildCardPath(), VpnManager.this, DataChangeScope.SUBTREE);\r
-        } catch (final Exception e) {\r
-            LOG.error("VPN Service DataChange listener registration fail!", e);\r
-            throw new IllegalStateException("VPN Service registration Listener failed.", e);\r
-        }\r
-    }\r
-\r
-    @Override\r
-    protected void remove(InstanceIdentifier<VpnInstance> identifier,\r
-            VpnInstance del) {\r
-        // TODO Auto-generated method stub\r
-    }\r
-\r
-    @Override\r
-    protected void update(InstanceIdentifier<VpnInstance> identifier,\r
-            VpnInstance original, VpnInstance update) {\r
-        // TODO Auto-generated method stub\r
-    }\r
-\r
-    @Override\r
-    protected void add(InstanceIdentifier<VpnInstance> identifier,\r
-            VpnInstance value) {\r
-        LOG.info("key: " + identifier + ", value=" + value);\r
-        //TODO: Generate VPN ID for this instance, where to store in model ... ?\r
-\r
-        //TODO: Add VRF to BGP\r
-    }\r
-\r
-    private InstanceIdentifier<?> getWildCardPath() {\r
-        return InstanceIdentifier.create(VpnInstances.class).child(VpnInstance.class);\r
-    }\r
-\r
-    @Override\r
-    public void close() throws Exception {\r
-        if (listenerRegistration != null) {\r
-            try {\r
-                listenerRegistration.close();\r
-            } catch (final Exception e) {\r
-                LOG.error("Error when cleaning up DataChangeListener.", e);\r
-            }\r
-            listenerRegistration = null;\r
-        }\r
-        LOG.info("VPN Manager Closed");\r
-    }\r
-}\r
+/*
+ * Copyright (c) 2015 Ericsson India Global Services Pvt Ltd. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.vpnservice;
+
+import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.controller.md.sal.binding.api.DataChangeListener;
+import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker.DataChangeScope;
+import org.opendaylight.yangtools.concepts.ListenerRegistration;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.vpn.instances.VpnInstance;
+import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.VpnInstances;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class VpnManager extends AbstractDataChangeListener<VpnInstance> implements AutoCloseable {
+    private static final Logger LOG = LoggerFactory.getLogger(VpnManager.class);
+    private ListenerRegistration<DataChangeListener> listenerRegistration;
+    private final DataBroker broker;
+
+    /**
+     * Listens for data change related to VPN Instance
+     * Informs the BGP about VRF information
+     * 
+     * @param db - dataBroker reference
+     */
+    public VpnManager(final DataBroker db) {
+        super(VpnInstance.class);
+        broker = db;
+        registerListener(db);
+    }
+
+    private void registerListener(final DataBroker db) {
+        try {
+            listenerRegistration = db.registerDataChangeListener(LogicalDatastoreType.CONFIGURATION,
+                    getWildCardPath(), VpnManager.this, DataChangeScope.SUBTREE);
+        } catch (final Exception e) {
+            LOG.error("VPN Service DataChange listener registration fail!", e);
+            throw new IllegalStateException("VPN Service registration Listener failed.", e);
+        }
+    }
+
+    @Override
+    protected void remove(InstanceIdentifier<VpnInstance> identifier,
+            VpnInstance del) {
+        // TODO Auto-generated method stub
+    }
+
+    @Override
+    protected void update(InstanceIdentifier<VpnInstance> identifier,
+            VpnInstance original, VpnInstance update) {
+        // TODO Auto-generated method stub
+    }
+
+    @Override
+    protected void add(InstanceIdentifier<VpnInstance> identifier,
+            VpnInstance value) {
+        LOG.info("key: " + identifier + ", value=" + value);
+        //TODO: Generate VPN ID for this instance, where to store in model ... ?
+
+        //TODO: Add VRF to BGP
+    }
+
+    private InstanceIdentifier<?> getWildCardPath() {
+        return InstanceIdentifier.create(VpnInstances.class).child(VpnInstance.class);
+    }
+
+    @Override
+    public void close() throws Exception {
+        if (listenerRegistration != null) {
+            try {
+                listenerRegistration.close();
+            } catch (final Exception e) {
+                LOG.error("Error when cleaning up DataChangeListener.", e);
+            }
+            listenerRegistration = null;
+        }
+        LOG.info("VPN Manager Closed");
+    }
+}
similarity index 98%
rename from vpnmanager-impl/src/main/java/org/opendaylight/vpnservice/VpnUtil.java
rename to vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/vpnservice/VpnUtil.java
index d83b7fd3fad6b185bf0e11b418581e5bb0ab906b..a5b44ec900306529692ab4e2b91fa648280f3b0c 100644 (file)
@@ -1,27 +1,27 @@
-package org.opendaylight.vpnservice;\r
-\r
-import java.util.List;\r
-import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.VpnInterfaces;\r
-import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.vpn.interfaces.VpnInterface;\r
-import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.vpn.interfaces.VpnInterfaceKey;\r
-import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.vpn.interfaces.VpnInterfaceBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.l3vpn.rev130911.adjacency.list.Adjacency;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.l3vpn.rev130911.Adjacencies;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.l3vpn.rev130911.AdjacenciesBuilder;\r
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;\r
-\r
-public class VpnUtil {\r
-    static InstanceIdentifier<VpnInterface> getVpnInterfaceIdentifier(String vpnInterfaceName) {\r
-        return InstanceIdentifier.builder(VpnInterfaces.class)\r
-                .child(VpnInterface.class, new VpnInterfaceKey(vpnInterfaceName)).build();\r
-    }\r
-\r
-    static VpnInterface getVpnInterface(String intfName, String vpnName, Adjacencies aug) {\r
-        return new VpnInterfaceBuilder().setKey(new VpnInterfaceKey(intfName)).setVpnInstanceName(vpnName)\r
-                .addAugmentation(Adjacencies.class, aug).build();\r
-    }\r
-\r
-    static Adjacencies getVpnInterfaceAugmentation(List<Adjacency> nextHops) {\r
-        return new AdjacenciesBuilder().setAdjacency(nextHops).build();\r
-    }\r
-}\r
+package org.opendaylight.vpnservice;
+
+import java.util.List;
+import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.VpnInterfaces;
+import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.vpn.interfaces.VpnInterface;
+import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.vpn.interfaces.VpnInterfaceKey;
+import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.vpn.interfaces.VpnInterfaceBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.l3vpn.rev130911.adjacency.list.Adjacency;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.l3vpn.rev130911.Adjacencies;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.l3vpn.rev130911.AdjacenciesBuilder;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+
+public class VpnUtil {
+    static InstanceIdentifier<VpnInterface> getVpnInterfaceIdentifier(String vpnInterfaceName) {
+        return InstanceIdentifier.builder(VpnInterfaces.class)
+                .child(VpnInterface.class, new VpnInterfaceKey(vpnInterfaceName)).build();
+    }
+
+    static VpnInterface getVpnInterface(String intfName, String vpnName, Adjacencies aug) {
+        return new VpnInterfaceBuilder().setKey(new VpnInterfaceKey(intfName)).setVpnInstanceName(vpnName)
+                .addAugmentation(Adjacencies.class, aug).build();
+    }
+
+    static Adjacencies getVpnInterfaceAugmentation(List<Adjacency> nextHops) {
+        return new AdjacenciesBuilder().setAdjacency(nextHops).build();
+    }
+}
similarity index 97%
rename from vpnmanager-impl/src/main/java/org/opendaylight/vpnservice/VpnserviceProvider.java
rename to vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/vpnservice/VpnserviceProvider.java
index 84b18382729ab885674c994e7216cd2eb427bf80..7514cf7f0a6f1055abc88458ad7af0b3e4c7af94 100644 (file)
@@ -1,41 +1,41 @@
-/*\r
- * Copyright (c) 2015 Ericsson India Global Services Pvt Ltd. and others.  All rights reserved.\r
- *\r
- * This program and the accompanying materials are made available under the\r
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
- * and is available at http://www.eclipse.org/legal/epl-v10.html\r
- */\r
-package org.opendaylight.vpnservice;\r
-\r
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;\r
-import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.ProviderContext;\r
-import org.opendaylight.controller.sal.binding.api.BindingAwareProvider;\r
-\r
-import org.slf4j.Logger;\r
-import org.slf4j.LoggerFactory;\r
-\r
-public class VpnserviceProvider implements BindingAwareProvider,\r
-                                                       AutoCloseable {\r
-\r
-    private static final Logger LOG = LoggerFactory.getLogger(VpnserviceProvider.class);\r
-    private VpnInterfaceManager vpnInterfaceManager;\r
-    private VpnManager vpnManager;\r
-\r
-    @Override\r
-    public void onSessionInitiated(ProviderContext session) {\r
-        LOG.info("VpnserviceProvider Session Initiated");\r
-        try {\r
-            final  DataBroker dataBroker = session.getSALService(DataBroker.class);\r
-            vpnManager = new VpnManager(dataBroker);\r
-            vpnInterfaceManager = new VpnInterfaceManager(dataBroker);\r
-        } catch (Exception e) {\r
-            LOG.error("Error initializing services", e);\r
-        }\r
-    }\r
-\r
-    @Override\r
-    public void close() throws Exception {\r
-        vpnManager.close();\r
-        vpnInterfaceManager.close();\r
-    }\r
-}\r
+/*
+ * Copyright (c) 2015 Ericsson India Global Services Pvt Ltd. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.vpnservice;
+
+import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.ProviderContext;
+import org.opendaylight.controller.sal.binding.api.BindingAwareProvider;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class VpnserviceProvider implements BindingAwareProvider,
+                                                       AutoCloseable {
+
+    private static final Logger LOG = LoggerFactory.getLogger(VpnserviceProvider.class);
+    private VpnInterfaceManager vpnInterfaceManager;
+    private VpnManager vpnManager;
+
+    @Override
+    public void onSessionInitiated(ProviderContext session) {
+        LOG.info("VpnserviceProvider Session Initiated");
+        try {
+            final  DataBroker dataBroker = session.getSALService(DataBroker.class);
+            vpnManager = new VpnManager(dataBroker);
+            vpnInterfaceManager = new VpnInterfaceManager(dataBroker);
+        } catch (Exception e) {
+            LOG.error("Error initializing services", e);
+        }
+    }
+
+    @Override
+    public void close() throws Exception {
+        vpnManager.close();
+        vpnInterfaceManager.close();
+    }
+}
similarity index 96%
rename from vpnmanager-impl/src/test/java/org/opendaylight/vpnservice/test/MockDataChangedEvent.java
rename to vpnmanager/vpnmanager-impl/src/test/java/org/opendaylight/vpnservice/test/MockDataChangedEvent.java
index 5e03dea3093dd92a2bd717fa22c9e70bf8d15dc6..1483e8739dfb515d1ecad764513b1097dc38af56 100644 (file)
@@ -1,53 +1,53 @@
-/*\r
- * Copyright (c) 2015 Ericsson India Global Services Pvt Ltd. and others.  All rights reserved.\r
- *\r
- * This program and the accompanying materials are made available under the\r
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
- * and is available at http://www.eclipse.org/legal/epl-v10.html\r
- */\r
-package org.opendaylight.vpnservice.test;\r
-\r
-import java.util.HashMap;\r
-import java.util.HashSet;\r
-import java.util.Map;\r
-import java.util.Set;\r
-import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent;\r
-import org.opendaylight.yangtools.yang.binding.DataObject;\r
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;\r
-\r
-class MockDataChangedEvent implements AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> {\r
-  Map<InstanceIdentifier<?>,DataObject> created = new HashMap<>();\r
-  Map<InstanceIdentifier<?>,DataObject> updated = new HashMap<>();\r
-  Map<InstanceIdentifier<?>,DataObject> original = new HashMap<>();\r
-  Set<InstanceIdentifier<?>> removed = new HashSet<>();\r
-\r
-  @Override\r
-  public Map<InstanceIdentifier<?>, DataObject> getCreatedData() {\r
-      return created;\r
-  }\r
-\r
-  @Override\r
-  public Map<InstanceIdentifier<?>, DataObject> getUpdatedData() {\r
-      return updated;\r
-  }\r
-\r
-  @Override\r
-  public Set<InstanceIdentifier<?>> getRemovedPaths() {\r
-      return removed;\r
-  }\r
-\r
-  @Override\r
-  public Map<InstanceIdentifier<?>, DataObject> getOriginalData() {\r
-      return original;\r
-  }\r
-\r
-  @Override\r
-  public DataObject getOriginalSubtree() {\r
-      throw new UnsupportedOperationException("Not implemented by mock");\r
-  }\r
-\r
-  @Override\r
-  public DataObject getUpdatedSubtree() {\r
-      throw new UnsupportedOperationException("Not implemented by mock");\r
-  }\r
-}\r
+/*
+ * Copyright (c) 2015 Ericsson India Global Services Pvt Ltd. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.vpnservice.test;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent;
+import org.opendaylight.yangtools.yang.binding.DataObject;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+
+class MockDataChangedEvent implements AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> {
+  Map<InstanceIdentifier<?>,DataObject> created = new HashMap<>();
+  Map<InstanceIdentifier<?>,DataObject> updated = new HashMap<>();
+  Map<InstanceIdentifier<?>,DataObject> original = new HashMap<>();
+  Set<InstanceIdentifier<?>> removed = new HashSet<>();
+
+  @Override
+  public Map<InstanceIdentifier<?>, DataObject> getCreatedData() {
+      return created;
+  }
+
+  @Override
+  public Map<InstanceIdentifier<?>, DataObject> getUpdatedData() {
+      return updated;
+  }
+
+  @Override
+  public Set<InstanceIdentifier<?>> getRemovedPaths() {
+      return removed;
+  }
+
+  @Override
+  public Map<InstanceIdentifier<?>, DataObject> getOriginalData() {
+      return original;
+  }
+
+  @Override
+  public DataObject getOriginalSubtree() {
+      throw new UnsupportedOperationException("Not implemented by mock");
+  }
+
+  @Override
+  public DataObject getUpdatedSubtree() {
+      throw new UnsupportedOperationException("Not implemented by mock");
+  }
+}
similarity index 98%
rename from vpnmanager-impl/src/test/java/org/opendaylight/vpnservice/test/VpnServiceTest.java
rename to vpnmanager/vpnmanager-impl/src/test/java/org/opendaylight/vpnservice/test/VpnServiceTest.java
index a28c298712cf7ae457edf0151416a7b2f8323277..588da749540bd0ccddfb96085b4c0235b61a629b 100644 (file)
@@ -1,75 +1,75 @@
-/*\r
- * Copyright (c) 2015 Ericsson India Global Services Pvt Ltd. and others.  All rights reserved.\r
- *\r
- * This program and the accompanying materials are made available under the\r
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
- * and is available at http://www.eclipse.org/legal/epl-v10.html\r
- */\r
-package org.opendaylight.vpnservice.test;\r
-\r
-import static org.junit.Assert.*;\r
-import static org.mockito.Matchers.*;\r
-import static org.mockito.Mockito.when;\r
-\r
-import org.junit.*;\r
-import org.junit.runner.RunWith;\r
-import org.mockito.Mock;\r
-import org.mockito.runners.MockitoJUnitRunner;\r
-\r
-import org.opendaylight.vpnservice.VpnManager;\r
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;\r
-import org.opendaylight.controller.md.sal.binding.api.DataChangeListener;\r
-import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker.DataChangeScope;\r
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;\r
-import org.opendaylight.yangtools.concepts.ListenerRegistration;\r
-import org.opendaylight.yangtools.yang.binding.DataObject;\r
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;\r
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.Interfaces;\r
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface;\r
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.InterfaceKey;\r
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.InstanceIdentifierBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.VpnInstances;\r
-import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.vpn.instances.*;\r
-import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.vpn.af.config.*;\r
-import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.vpn.af.config.apply.label.apply.label.mode.*;\r
-import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.vpn.af.config.apply.label.ApplyLabelMode;\r
-import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.vpn.af.config.ApplyLabelBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.vpn.instances.vpn.instance.Ipv4FamilyBuilder;\r
-\r
-@RunWith(MockitoJUnitRunner.class)\r
-public class VpnServiceTest {\r
-    @Mock DataBroker dataBroker;\r
-    @Mock ListenerRegistration<DataChangeListener> dataChangeListenerRegistration;\r
-    MockDataChangedEvent event;\r
-\r
-    @Before\r
-    public void setUp() throws Exception {\r
-        when(dataBroker.registerDataChangeListener(\r
-                any(LogicalDatastoreType.class),\r
-                any(InstanceIdentifier.class),\r
-                any(DataChangeListener.class),\r
-                any(DataChangeScope.class)))\r
-                .thenReturn(dataChangeListenerRegistration);\r
-        event = new MockDataChangedEvent();\r
-    }\r
-\r
-    @Test\r
-    public void test() {\r
-        VpnInstanceBuilder builder = new VpnInstanceBuilder().setKey(new VpnInstanceKey("Vpn1")).\r
-                setIpv4Family(new Ipv4FamilyBuilder().setRouteDistinguisher("100:1").setImportRoutePolicy("100:2").\r
-                    setExportRoutePolicy("100:1").setApplyLabel(new ApplyLabelBuilder().setApplyLabelMode(\r
-                        new PerRouteBuilder().setApplyLabelPerRoute(true).build()).build()).build());\r
-        VpnInstance instance = builder.build();\r
-        VpnManager vpnManager = new VpnManager(dataBroker);\r
-        event.created.put(createVpnId("Vpn1"), instance);\r
-        vpnManager.onDataChanged(event);\r
-    }\r
-\r
-    private InstanceIdentifier<VpnInstance> createVpnId(String name) {\r
-       InstanceIdentifierBuilder<VpnInstance> idBuilder = \r
-           InstanceIdentifier.builder(VpnInstances.class).child(VpnInstance.class, new VpnInstanceKey(name));\r
-       InstanceIdentifier<VpnInstance> id = idBuilder.build();\r
-       return id;\r
-    }\r
-\r
-}\r
+/*
+ * Copyright (c) 2015 Ericsson India Global Services Pvt Ltd. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.vpnservice.test;
+
+import static org.junit.Assert.*;
+import static org.mockito.Matchers.*;
+import static org.mockito.Mockito.when;
+
+import org.junit.*;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.runners.MockitoJUnitRunner;
+
+import org.opendaylight.vpnservice.VpnManager;
+import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.controller.md.sal.binding.api.DataChangeListener;
+import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker.DataChangeScope;
+import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.yangtools.concepts.ListenerRegistration;
+import org.opendaylight.yangtools.yang.binding.DataObject;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.Interfaces;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.InterfaceKey;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.InstanceIdentifierBuilder;
+import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.VpnInstances;
+import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.vpn.instances.*;
+import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.vpn.af.config.*;
+import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.vpn.af.config.apply.label.apply.label.mode.*;
+import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.vpn.af.config.apply.label.ApplyLabelMode;
+import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.vpn.af.config.ApplyLabelBuilder;
+import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.vpn.instances.vpn.instance.Ipv4FamilyBuilder;
+
+@RunWith(MockitoJUnitRunner.class)
+public class VpnServiceTest {
+    @Mock DataBroker dataBroker;
+    @Mock ListenerRegistration<DataChangeListener> dataChangeListenerRegistration;
+    MockDataChangedEvent event;
+
+    @Before
+    public void setUp() throws Exception {
+        when(dataBroker.registerDataChangeListener(
+                any(LogicalDatastoreType.class),
+                any(InstanceIdentifier.class),
+                any(DataChangeListener.class),
+                any(DataChangeScope.class)))
+                .thenReturn(dataChangeListenerRegistration);
+        event = new MockDataChangedEvent();
+    }
+
+    @Test
+    public void test() {
+        VpnInstanceBuilder builder = new VpnInstanceBuilder().setKey(new VpnInstanceKey("Vpn1")).
+                setIpv4Family(new Ipv4FamilyBuilder().setRouteDistinguisher("100:1").setImportRoutePolicy("100:2").
+                    setExportRoutePolicy("100:1").setApplyLabel(new ApplyLabelBuilder().setApplyLabelMode(
+                        new PerRouteBuilder().setApplyLabelPerRoute(true).build()).build()).build());
+        VpnInstance instance = builder.build();
+        VpnManager vpnManager = new VpnManager(dataBroker);
+        event.created.put(createVpnId("Vpn1"), instance);
+        vpnManager.onDataChanged(event);
+    }
+
+    private InstanceIdentifier<VpnInstance> createVpnId(String name) {
+       InstanceIdentifierBuilder<VpnInstance> idBuilder = 
+           InstanceIdentifier.builder(VpnInstances.class).child(VpnInstance.class, new VpnInstanceKey(name));
+       InstanceIdentifier<VpnInstance> id = idBuilder.build();
+       return id;
+    }
+
+}