Turned netconf providers into an app and made NetconfDeviceProvider register its configs with ComponentConfigService.

More cleanup needs to be done to avoid log messages with "+" and some other stylistic issues.

Change-Id: Ic1be1ce6d3340f5a6284ba5514d0052e01bdaaed
This commit is contained in:
Thomas Vachuska 2015-04-29 21:37:04 -07:00 committed by Gerrit Code Review
parent 1af8e137e3
commit d6811710c6
7 changed files with 238 additions and 146 deletions

View File

@ -130,10 +130,4 @@
<bundle>mvn:org.onosproject/onos-core-trivial/@ONOS-VERSION</bundle> <bundle>mvn:org.onosproject/onos-core-trivial/@ONOS-VERSION</bundle>
</feature> </feature>
<feature name="onos-netconf" version="@FEATURE-VERSION"
description="ONOS Netconf providers">
<feature>onos-api</feature>
<bundle>mvn:org.onosproject/onos-netconf-provider-device/@ONOS-VERSION</bundle>
</feature>
</features> </features>

View File

@ -0,0 +1,24 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
~ Copyright 2015 Open Networking Laboratory
~
~ Licensed under the Apache License, Version 2.0 (the "License");
~ you may not use this file except in compliance with the License.
~ You may obtain a copy of the License at
~
~ http://www.apache.org/licenses/LICENSE-2.0
~
~ Unless required by applicable law or agreed to in writing, software
~ distributed under the License is distributed on an "AS IS" BASIS,
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
~ See the License for the specific language governing permissions and
~ limitations under the License.
-->
<app name="org.onosproject.netconf" origin="ON.Lab" version="${project.version}"
featuresRepo="mvn:${project.groupId}/${project.artifactId}/${project.version}/xml/features"
features="${project.artifactId}">
<description>${project.description}</description>
<artifact>mvn:${project.groupId}/onos-netconf-provider-device/${project.version}</artifact>
<!-- Question: should there be the jnc stuff here? Or is it just for testing -->
</app>

View File

@ -0,0 +1,27 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!--
~ Copyright 2015 Open Networking Laboratory
~
~ Licensed under the Apache License, Version 2.0 (the "License");
~ you may not use this file except in compliance with the License.
~ You may obtain a copy of the License at
~
~ http://www.apache.org/licenses/LICENSE-2.0
~
~ Unless required by applicable law or agreed to in writing, software
~ distributed under the License is distributed on an "AS IS" BASIS,
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
~ See the License for the specific language governing permissions and
~ limitations under the License.
-->
<features xmlns="http://karaf.apache.org/xmlns/features/v1.2.0" name="${project.artifactId}-${project.version}">
<repository>mvn:${project.groupId}/${project.artifactId}/${project.version}/xml/features</repository>
<feature name="${project.artifactId}" version="${project.version}"
description="${project.description}">
<feature>onos-api</feature>
<bundle>mvn:io.netty/netty/3.9.2.Final</bundle>
<bundle>mvn:${project.groupId}/onos-netconf-provider-device/${project.version}</bundle>
<!-- Question: should there be the jnc stuff here? Or is it just for testing -->
</feature>
</features>

View File

@ -0,0 +1,43 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
~ Copyright 2015 Open Networking Laboratory
~
~ Licensed under the Apache License, Version 2.0 (the "License");
~ you may not use this file except in compliance with the License.
~ You may obtain a copy of the License at
~
~ http://www.apache.org/licenses/LICENSE-2.0
~
~ Unless required by applicable law or agreed to in writing, software
~ distributed under the License is distributed on an "AS IS" BASIS,
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
~ See the License for the specific language governing permissions and
~ limitations under the License.
-->
<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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.onosproject</groupId>
<artifactId>onos-netconf-providers</artifactId>
<version>1.2.0-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>onos-netconf</artifactId>
<packaging>pom</packaging>
<description>NetConf protocol southbound providers</description>
<dependencies>
<dependency>
<groupId>org.onosproject</groupId>
<artifactId>onos-netconf-provider-device</artifactId>
<version>${project.version}</version>
</dependency>
<!-- TODO: add other dependencies here as more bundles are added to the app -->
</dependencies>
</project>

View File

@ -14,134 +14,138 @@
~ See the License for the specific language governing permissions and ~ See the License for the specific language governing permissions and
~ limitations under the License. ~ limitations under the License.
--> -->
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" <project xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
<modelVersion>4.0.0</modelVersion> xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent> <parent>
<groupId>org.onosproject</groupId>
<artifactId>onos-netconf-providers</artifactId>
<version>1.2.0-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>onos-netconf-provider-device</artifactId>
<packaging>bundle</packaging>
<description>ONOS Netconf protocol device provider</description>
<dependencies>
<dependency>
<groupId>org.osgi</groupId>
<artifactId>org.osgi.compendium</artifactId>
</dependency>
<dependency>
<groupId>ch.ethz.ganymed</groupId>
<artifactId>ganymed-ssh2</artifactId>
<version>262</version>
</dependency>
<dependency>
<!-- TODO: change this appropriately when the official TailF JNC is available -->
<groupId>org.onosproject</groupId> <groupId>org.onosproject</groupId>
<artifactId>onos-netconf-providers</artifactId> <artifactId>jnc</artifactId>
<version>1.2.0-SNAPSHOT</version> <version>1.0</version>
<relativePath>../pom.xml</relativePath> </dependency>
</parent> <dependency>
<groupId>org.jdom</groupId>
<artifactId>jdom2</artifactId>
<version>2.0.5</version>
</dependency>
<dependency>
<groupId>jaxen</groupId>
<artifactId>jaxen</artifactId>
<version>1.1.4</version>
<optional>true</optional>
</dependency>
</dependencies>
<artifactId>onos-netconf-provider-device</artifactId> <build>
<packaging>bundle</packaging> <plugins>
<plugin>
<description>ONOS Netconf protocol device provider</description> <groupId>org.apache.maven.plugins</groupId>
<build> <artifactId>maven-shade-plugin</artifactId>
<plugins> <version>2.3</version>
<plugin> <configuration>
<groupId>org.apache.maven.plugins</groupId> <filters>
<artifactId>maven-shade-plugin</artifactId> <filter>
<version>2.3</version> <artifact>com.tailf:JNC</artifact>
<configuration> <includes>
<filters> <include>com/tailf/jnc/**</include>
<filter> </includes>
<artifact>com.tailf:JNC</artifact> </filter>
<includes> <filter>
<include>com/tailf/jnc/**</include> <artifact>ch.ethz.ganymed:ganymed-ssh2</artifact>
</includes> <includes>
</filter> <include>ch/ethz/ssh2/**</include>
<filter> </includes>
<artifact>ch.ethz.ganymed:ganymed-ssh2</artifact> </filter>
<includes> <filter>
<include>ch/ethz/ssh2/**</include> <artifact>org.jdom:jdom2</artifact>
</includes> <includes>
</filter> <include>org/jdom2/**</include>
<filter> </includes>
<artifact>org.jdom:jdom2</artifact> </filter>
<includes> </filters>
<include>org/jdom2/**</include> </configuration>
</includes> <executions>
</filter> <execution>
</filters> <phase>package</phase>
</configuration> <goals>
<executions> <goal>shade</goal>
<execution> </goals>
<phase>package</phase> </execution>
<goals> </executions>
<goal>shade</goal> </plugin>
</goals> <plugin>
</execution> <groupId>org.apache.felix</groupId>
</executions> <artifactId>maven-scr-plugin</artifactId>
</plugin> </plugin>
<plugin> <plugin>
<groupId>org.apache.felix</groupId> <groupId>org.apache.felix</groupId>
<artifactId>maven-scr-plugin</artifactId> <artifactId>maven-bundle-plugin</artifactId>
</plugin> <configuration>
<plugin> <instructions>
<groupId>org.apache.felix</groupId> <Export-Package>
<artifactId>maven-bundle-plugin</artifactId> com.tailf.jnc,
<configuration> ch.ethz.ssh2,
<instructions> ch.ethz.ssh2.auth,
<Export-Package> ch.ethz.ssh2.channel,
com.tailf.jnc, ch.ethz.ssh2.crypto,
ch.ethz.ssh2, ch.ethz.ssh2.crypto.cipher,
ch.ethz.ssh2.auth, ch.ethz.ssh2.crypto.dh,
ch.ethz.ssh2.channel, ch.ethz.ssh2.crypto.digest,
ch.ethz.ssh2.crypto, ch.ethz.ssh2.log,
ch.ethz.ssh2.crypto.cipher, ch.ethz.ssh2.packets,
ch.ethz.ssh2.crypto.dh, ch.ethz.ssh2.server,
ch.ethz.ssh2.crypto.digest, ch.ethz.ssh2.sftp,
ch.ethz.ssh2.log, ch.ethz.ssh2.signature,
ch.ethz.ssh2.packets, ch.ethz.ssh2.transport,
ch.ethz.ssh2.server, ch.ethz.ssh2.util,
ch.ethz.ssh2.sftp, org.jdom2,
ch.ethz.ssh2.signature, org.jdom2.input,
ch.ethz.ssh2.transport, org.jdom2.output,
ch.ethz.ssh2.util, org.jdom2.adapters,
org.jdom2, org.jdom2.filter,
org.jdom2.input, org.jdom2.internal,
org.jdom2.output, org.jdom2.located,
org.jdom2.adapters, org.jdom2.transform,
org.jdom2.filter, org.jdom2.util,
org.jdom2.internal, org.jdom2.xpath,
org.jdom2.located, org.jdom2.input.sax,
org.jdom2.transform, org.jdom2.input.stax,
org.jdom2.util, org.jdom2.output.support,
org.jdom2.xpath, org.jdom2.xpath.jaxen,
org.jdom2.input.sax, org.jdom2.xpath.util
org.jdom2.input.stax, </Export-Package>
org.jdom2.output.support, </instructions>
org.jdom2.xpath.jaxen, </configuration>
org.jdom2.xpath.util </plugin>
</Export-Package> <plugin>
</instructions>
</configuration>
</plugin>
<plugin>
<groupId>org.onosproject</groupId>
<artifactId>onos-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>org.osgi</groupId>
<artifactId>org.osgi.compendium</artifactId>
</dependency>
<dependency>
<groupId>ch.ethz.ganymed</groupId>
<artifactId>ganymed-ssh2</artifactId>
<version>262</version>
</dependency>
<dependency>
<!-- TODO: change this appropriately when the official TailF JNC is available -->
<groupId>org.onosproject</groupId> <groupId>org.onosproject</groupId>
<artifactId>jnc</artifactId> <artifactId>onos-maven-plugin</artifactId>
<version>1.0</version> </plugin>
</dependency> </plugins>
<dependency> </build>
<groupId>org.jdom</groupId>
<artifactId>jdom2</artifactId>
<version>2.0.5</version>
</dependency>
<dependency>
<groupId>jaxen</groupId>
<artifactId>jaxen</artifactId>
<version>1.1.4</version>
<optional>true</optional>
</dependency>
</dependencies>
</project> </project>

View File

@ -39,6 +39,7 @@ import org.apache.felix.scr.annotations.Property;
import org.apache.felix.scr.annotations.Reference; import org.apache.felix.scr.annotations.Reference;
import org.apache.felix.scr.annotations.ReferenceCardinality; import org.apache.felix.scr.annotations.ReferenceCardinality;
import org.onlab.packet.ChassisId; import org.onlab.packet.ChassisId;
import org.onosproject.cfg.ComponentConfigService;
import org.onosproject.cluster.ClusterService; import org.onosproject.cluster.ClusterService;
import org.onosproject.net.Device; import org.onosproject.net.Device;
import org.onosproject.net.DeviceId; import org.onosproject.net.DeviceId;
@ -78,9 +79,11 @@ public class NetconfDeviceProvider extends AbstractProvider
@Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
protected ClusterService clusterService; protected ClusterService clusterService;
@Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
protected ComponentConfigService cfgService;
private ExecutorService deviceBuilder = Executors private ExecutorService deviceBuilder = Executors
.newFixedThreadPool(1, .newFixedThreadPool(1, groupedThreads("onos/netconf", "device-creator"));
groupedThreads("onos/netconf", "device-creator"));
// Delay between events in ms. // Delay between events in ms.
private static final int EVENTINTERVAL = 5; private static final int EVENTINTERVAL = 5;
@ -90,7 +93,7 @@ public class NetconfDeviceProvider extends AbstractProvider
@Property(name = "devConfigs", value = "", label = "Instance-specific configurations") @Property(name = "devConfigs", value = "", label = "Instance-specific configurations")
private String devConfigs = null; private String devConfigs = null;
@Property(name = "devPasswords", value = "", label = "Instace-specific password") @Property(name = "devPasswords", value = "", label = "Instance-specific password")
private String devPasswords = null; private String devPasswords = null;
/** /**
@ -102,13 +105,15 @@ public class NetconfDeviceProvider extends AbstractProvider
@Activate @Activate
public void activate(ComponentContext context) { public void activate(ComponentContext context) {
log.info("Netconf Device Provider Started"); cfgService.registerProperties(getClass());
providerService = providerRegistry.register(this); providerService = providerRegistry.register(this);
modified(context); modified(context);
log.info("Started");
} }
@Deactivate @Deactivate
public void deactivate(ComponentContext context) { public void deactivate(ComponentContext context) {
cfgService.unregisterProperties(getClass(), false);
try { try {
for (Entry<DeviceId, NetconfDevice> deviceEntry : netconfDeviceMap for (Entry<DeviceId, NetconfDevice> deviceEntry : netconfDeviceMap
.entrySet()) { .entrySet()) {
@ -134,13 +139,9 @@ public class NetconfDeviceProvider extends AbstractProvider
} }
Dictionary<?, ?> properties = context.getProperties(); Dictionary<?, ?> properties = context.getProperties();
String deviceCfgValue = get(properties, "devConfigs"); String deviceCfgValue = get(properties, "devConfigs");
log.info("Getting Device configuration from cfg file: " log.info("Settings: devConfigs={}", deviceCfgValue);
+ deviceCfgValue);
if (!isNullOrEmpty(deviceCfgValue)) { if (!isNullOrEmpty(deviceCfgValue)) {
addOrRemoveDevicesConfig(deviceCfgValue); addOrRemoveDevicesConfig(deviceCfgValue);
} else {
log.info("Device Configuration value receiviced from the property 'devConfigs': "
+ deviceCfgValue + ", is not valid");
} }
} }
@ -148,11 +149,9 @@ public class NetconfDeviceProvider extends AbstractProvider
for (String deviceEntry : deviceConfig.split(",")) { for (String deviceEntry : deviceConfig.split(",")) {
NetconfDevice device = processDeviceEntry(deviceEntry); NetconfDevice device = processDeviceEntry(deviceEntry);
if (device != null) { if (device != null) {
log.info("Device Detail: " + "username: " log.info("Device Detail: username: {}, host={}, port={}, state={}",
+ device.getUsername() + ", host: " device.getUsername(), device.getSshHost(),
+ device.getSshHost() + ", port: " device.getSshPort(), device.getDeviceState().name());
+ device.getSshPort() + " device state: "
+ device.getDeviceState().name());
if (device.isActive()) { if (device.isActive()) {
deviceBuilder.submit(new DeviceCreator(device, true)); deviceBuilder.submit(new DeviceCreator(device, true));
} else { } else {

View File

@ -33,6 +33,7 @@
<modules> <modules>
<module>device</module> <module>device</module>
<module>app</module>
</modules> </modules>
<dependencies> <dependencies>