</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>
+++ /dev/null
-<?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>
--- /dev/null
+<?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>
-<?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>
-/*\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);
+
+}
+
+
-/*\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);
+ }
+}
-/*\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");
+ }
+}
-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();
+ }
+}
-/*\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();
+ }
+}
-/*\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");
+ }
+}
-/*\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;
+ }
+
+}