Added configurable reconnect strategies, added validation for bgp-rib-impl-config. 73/2673/1
authorMilos Fabian <milfabia@cisco.com>
Tue, 12 Nov 2013 16:00:57 +0000 (17:00 +0100)
committerMilos Fabian <milfabia@cisco.com>
Tue, 12 Nov 2013 16:00:57 +0000 (17:00 +0100)
Change-Id: I755c9ec4b75459e745bdb6f4044a41272409b308
Signed-off-by: Milos Fabian <milfabia@cisco.com>
18 files changed:
bgp/rib-impl-config/pom.xml
bgp/rib-impl-config/src/main/java/org/opendaylight/controller/config/reconnectstrategy/util/ReconnectStrategyCloseable.java [new file with mode: 0644]
bgp/rib-impl-config/src/main/java/org/opendaylight/controller/config/yang/bgp/rib/impl/BGPDispatcherImplModule.java
bgp/rib-impl-config/src/main/java/org/opendaylight/controller/config/yang/bgp/rib/impl/BGPImplModule.java
bgp/rib-impl-config/src/main/java/org/opendaylight/controller/config/yang/bgp/rib/impl/BGPSessionProposalImplModule.java
bgp/rib-impl-config/src/main/java/org/opendaylight/controller/config/yang/bgp/rib/impl/RIBImplModule.java
bgp/rib-impl-config/src/main/java/org/opendaylight/controller/config/yang/reconnectstrategy/NeverReconnectStrategyModule.java [new file with mode: 0644]
bgp/rib-impl-config/src/main/java/org/opendaylight/controller/config/yang/reconnectstrategy/NeverReconnectStrategyModuleFactory.java [new file with mode: 0644]
bgp/rib-impl-config/src/main/java/org/opendaylight/controller/config/yang/reconnectstrategy/ReconnectImmediatelyStrategyModule.java [new file with mode: 0644]
bgp/rib-impl-config/src/main/java/org/opendaylight/controller/config/yang/reconnectstrategy/ReconnectImmediatelyStrategyModuleFactory.java [new file with mode: 0644]
bgp/rib-impl-config/src/main/java/org/opendaylight/controller/config/yang/reconnectstrategy/TimedReconnectStrategyModule.java [new file with mode: 0644]
bgp/rib-impl-config/src/main/java/org/opendaylight/controller/config/yang/reconnectstrategy/TimedReconnectStrategyModuleFactory.java [new file with mode: 0644]
bgp/rib-impl-config/src/main/yang/reconnect-strategy.yang [new file with mode: 0644]
bgp/rib-impl-config/src/test/java/org/opendaylight/controller/config/yang/bgp/reconnectstrategy/GlobalEventExecutorUtil.java [new file with mode: 0644]
bgp/rib-impl-config/src/test/java/org/opendaylight/controller/config/yang/bgp/reconnectstrategy/NeverReconnectStrategyModuleTest.java [new file with mode: 0644]
bgp/rib-impl-config/src/test/java/org/opendaylight/controller/config/yang/bgp/reconnectstrategy/ReconnectImmediatelyStrategyModuleTest.java [new file with mode: 0644]
bgp/rib-impl-config/src/test/java/org/opendaylight/controller/config/yang/bgp/reconnectstrategy/TimedReconnectStrategyModuleTest.java [new file with mode: 0644]
pom.xml

index b7fe70389399352d7bcc3ebc76aadf77ebe27a5d..ac4330cfcca735efa7ce71c5694e6f3b70b338a1 100644 (file)
    </prerequisites>
 
    <dependencies>
+      <dependency>
+         <groupId>junit</groupId>
+         <artifactId>junit</artifactId>
+      </dependency>
       <dependency>
          <groupId>${project.groupId}</groupId>
          <artifactId>bgp-rib-api-config</artifactId>
          <artifactId>threadpool-config-api</artifactId>
          <version>${controller.config.version}</version>
       </dependency>
+      
+      <!--test dependencies -->
+      <dependency>
+         <groupId>org.opendaylight.controller</groupId>
+         <artifactId>config-manager</artifactId>
+         <version>${controller.config.version}</version>
+         <scope>test</scope>
+         <type>test-jar</type>
+      </dependency>
+      <dependency>
+         <groupId>org.opendaylight.controller</groupId>
+         <artifactId>config-manager</artifactId>
+         <version>${controller.config.version}</version>
+         <scope>test</scope>
+      </dependency>
+      <dependency>
+         <groupId>org.opendaylight.controller</groupId>
+         <artifactId>config-util</artifactId>
+         <version>${controller.config.version}</version>
+         <scope>test</scope>
+      </dependency>
+      <dependency>
+         <groupId>${project.groupId}</groupId>
+         <artifactId>mockito-configuration</artifactId>
+         <version>${project.version}</version>
+         <scope>test</scope>
+      </dependency>
+      <dependency>
+         <groupId>org.opendaylight.controller</groupId>
+         <artifactId>netty-event-executor-config</artifactId>
+         <version>${controller.config.version}</version>
+         <scope>test</scope>
+      </dependency>
+      
    </dependencies>
 
    <build>
diff --git a/bgp/rib-impl-config/src/main/java/org/opendaylight/controller/config/reconnectstrategy/util/ReconnectStrategyCloseable.java b/bgp/rib-impl-config/src/main/java/org/opendaylight/controller/config/reconnectstrategy/util/ReconnectStrategyCloseable.java
new file mode 100644 (file)
index 0000000..bd80a7d
--- /dev/null
@@ -0,0 +1,35 @@
+package org.opendaylight.controller.config.reconnectstrategy.util;
+
+import io.netty.util.concurrent.Future;
+
+import org.opendaylight.protocol.framework.ReconnectStrategy;
+
+final public class ReconnectStrategyCloseable implements ReconnectStrategy,
+               AutoCloseable {
+
+       private final ReconnectStrategy inner;
+
+       public ReconnectStrategyCloseable(ReconnectStrategy inner) {
+               this.inner = inner;
+       }
+
+       @Override
+       public void close() throws Exception {
+
+       }
+
+       @Override
+       public int getConnectTimeout() throws Exception {
+               return this.inner.getConnectTimeout();
+       }
+
+       @Override
+       public Future<Void> scheduleReconnect(Throwable cause) {
+               return this.inner.scheduleReconnect(cause);
+       }
+
+       @Override
+       public void reconnectSuccessful() {
+               this.inner.reconnectSuccessful();
+       }
+}
index 05680c2c8eef0b978c4dd565cf488e2b15dd3fd9..0d61dcc35808f44b8150cc368fe5a8f67090d3e6 100644 (file)
@@ -42,6 +42,7 @@ public final class BGPDispatcherImplModule
        @Override
        public java.lang.AutoCloseable createInstance() {
                final BGPMessageFactory messageFactoryDependency = getMessageFactoryDependency();
-               return new BGPDispatcherImpl(messageFactoryDependency, getBossGroupDependency(), getWorkerGroupDependency());
+               return new BGPDispatcherImpl(messageFactoryDependency,
+                               getBossGroupDependency(), getWorkerGroupDependency());
        }
 }
index d15bc50885a0b97c8e1f1081b09c05b870a9b934..7f596bdb9f2b05837da95efb99b928f89f2bf48b 100644 (file)
@@ -11,6 +11,7 @@ package org.opendaylight.controller.config.yang.bgp.rib.impl;
 
 import java.net.InetSocketAddress;
 
+import org.opendaylight.controller.config.api.JmxAttributeValidationException;
 import org.opendaylight.protocol.bgp.rib.impl.BGPImpl;
 
 /**
@@ -36,7 +37,14 @@ public final class BGPImplModule
        @Override
        public void validate() {
                super.validate();
-               // Add custom validation for module attributes here.
+               JmxAttributeValidationException.checkNotNull(getHost(),
+                               "value is not set.", hostJmxAttribute);
+
+               JmxAttributeValidationException.checkNotNull(getPort(),
+                               "value is not set.", portJmxAttribute);
+               JmxAttributeValidationException.checkCondition((getPort() >= 0)
+                               && (getPort() <= 65535), "value" + getPort()
+                               + " is out of range (0-65535).", portJmxAttribute);
        }
 
        @Override
index 3d9b81787ce5138f78bdfb38fe95c2bb748332d8..0b1cec3e3992849b21b188d298739247a72bcd83 100644 (file)
@@ -9,6 +9,10 @@
  */
 package org.opendaylight.controller.config.yang.bgp.rib.impl;
 
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.opendaylight.controller.config.api.JmxAttributeValidationException;
 import org.opendaylight.protocol.bgp.rib.impl.BGPSessionProposalImpl;
 import org.opendaylight.protocol.bgp.rib.impl.spi.BGPSessionPreferences;
 import org.opendaylight.protocol.bgp.rib.impl.spi.BGPSessionProposal;
@@ -38,7 +42,14 @@ public final class BGPSessionProposalImplModule
        @Override
        public void validate() {
                super.validate();
-               // Add custom validation for module attributes here.
+               JmxAttributeValidationException.checkNotNull(getBgpId(),
+                               "value is not set.", bgpIdJmxAttribute);
+               JmxAttributeValidationException.checkCondition(
+                               isValidIPv4Address(getBgpId()), "value " + getBgpId()
+                                               + " is not valid IPv4 address", bgpIdJmxAttribute);
+
+               JmxAttributeValidationException.checkNotNull(getAsNumber(),
+                               "value is not set.", asNumberJmxAttribute);
        }
 
        @Override
@@ -69,4 +80,10 @@ public final class BGPSessionProposalImplModule
                        return inner.getProposal();
                }
        }
+
+       private boolean isValidIPv4Address(final String address) {
+               Pattern pattern = Pattern.compile(Ipv4Address.PATTERN_CONSTANTS.get(0));
+               Matcher matcher = pattern.matcher(address);
+               return matcher.matches();
+       }
 }
index 5ee3dbbd1a442a410dff617c6df1093b4a34e787..f0903238ce1dead142304542d85b13fe33d4e6c1 100644 (file)
@@ -13,6 +13,7 @@ import io.netty.util.concurrent.GlobalEventExecutor;
 
 import java.io.IOException;
 
+import org.opendaylight.controller.config.api.JmxAttributeValidationException;
 import org.opendaylight.controller.sal.binding.api.AbstractBindingAwareProvider;
 import org.opendaylight.controller.sal.binding.api.BindingAwareBroker;
 import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.ProviderContext;
@@ -50,7 +51,10 @@ public final class RIBImplModule
        @Override
        public void validate() {
                super.validate();
-               // Add custom validation for module attributes here.
+               JmxAttributeValidationException.checkNotNull(getRibName(),
+                               "value is not set.", ribNameJmxAttribute);
+               JmxAttributeValidationException.checkCondition(!getRibName().isEmpty(),
+                               "should not be empty string.", ribNameJmxAttribute);
        }
 
        @Override
diff --git a/bgp/rib-impl-config/src/main/java/org/opendaylight/controller/config/yang/reconnectstrategy/NeverReconnectStrategyModule.java b/bgp/rib-impl-config/src/main/java/org/opendaylight/controller/config/yang/reconnectstrategy/NeverReconnectStrategyModule.java
new file mode 100644 (file)
index 0000000..fcd1e9e
--- /dev/null
@@ -0,0 +1,46 @@
+/**
+* Generated file
+
+* Generated from: yang module name: reconnect-strategy  yang module local name: never-reconnect-strategy
+* Generated by: org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator
+* Generated at: Tue Nov 12 13:27:18 CET 2013
+*
+* Do not modify this file unless it is present under src/main directory
+*/
+package org.opendaylight.controller.config.yang.reconnectstrategy;
+
+import org.opendaylight.controller.config.api.JmxAttributeValidationException;
+import org.opendaylight.controller.config.reconnectstrategy.util.ReconnectStrategyCloseable;
+import org.opendaylight.protocol.framework.NeverReconnectStrategy;
+import org.opendaylight.protocol.framework.ReconnectStrategy;
+
+/**
+*
+*/
+public final class NeverReconnectStrategyModule extends org.opendaylight.controller.config.yang.reconnectstrategy.AbstractNeverReconnectStrategyModule
+{
+
+    public NeverReconnectStrategyModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier, org.opendaylight.controller.config.api.DependencyResolver dependencyResolver) {
+        super(identifier, dependencyResolver);
+    }
+
+    public NeverReconnectStrategyModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier, org.opendaylight.controller.config.api.DependencyResolver dependencyResolver, NeverReconnectStrategyModule oldModule, java.lang.AutoCloseable oldInstance) {
+        super(identifier, dependencyResolver, oldModule, oldInstance);
+    }
+
+    @Override
+    public void validate(){
+               super.validate();
+               JmxAttributeValidationException.checkNotNull(getTimeout(),
+                               "value is not set.", timeoutJmxAttribute);
+               JmxAttributeValidationException.checkCondition(getTimeout() >= 0,
+                               "value " + getTimeout() + " is less than 0",
+                               timeoutJmxAttribute);
+    }
+
+    @Override
+    public java.lang.AutoCloseable createInstance() {
+               ReconnectStrategy reconnectStrategy = new NeverReconnectStrategy(getExecutorDependency(), getTimeout());
+               return new ReconnectStrategyCloseable(reconnectStrategy);
+       }
+}
diff --git a/bgp/rib-impl-config/src/main/java/org/opendaylight/controller/config/yang/reconnectstrategy/NeverReconnectStrategyModuleFactory.java b/bgp/rib-impl-config/src/main/java/org/opendaylight/controller/config/yang/reconnectstrategy/NeverReconnectStrategyModuleFactory.java
new file mode 100644 (file)
index 0000000..8a7e21c
--- /dev/null
@@ -0,0 +1,19 @@
+/**
+* Generated file
+
+* Generated from: yang module name: reconnect-strategy  yang module local name: never-reconnect-strategy
+* Generated by: org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator
+* Generated at: Tue Nov 12 13:27:18 CET 2013
+*
+* Do not modify this file unless it is present under src/main directory
+*/
+package org.opendaylight.controller.config.yang.reconnectstrategy;
+
+/**
+*
+*/
+public class NeverReconnectStrategyModuleFactory extends org.opendaylight.controller.config.yang.reconnectstrategy.AbstractNeverReconnectStrategyModuleFactory
+{
+
+
+}
diff --git a/bgp/rib-impl-config/src/main/java/org/opendaylight/controller/config/yang/reconnectstrategy/ReconnectImmediatelyStrategyModule.java b/bgp/rib-impl-config/src/main/java/org/opendaylight/controller/config/yang/reconnectstrategy/ReconnectImmediatelyStrategyModule.java
new file mode 100644 (file)
index 0000000..040d174
--- /dev/null
@@ -0,0 +1,46 @@
+/**
+* Generated file
+
+* Generated from: yang module name: reconnect-strategy  yang module local name: reconnect-immediately-strategy
+* Generated by: org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator
+* Generated at: Tue Nov 12 13:27:18 CET 2013
+*
+* Do not modify this file unless it is present under src/main directory
+*/
+package org.opendaylight.controller.config.yang.reconnectstrategy;
+
+import org.opendaylight.controller.config.api.JmxAttributeValidationException;
+import org.opendaylight.controller.config.reconnectstrategy.util.ReconnectStrategyCloseable;
+import org.opendaylight.protocol.framework.ReconnectImmediatelyStrategy;
+import org.opendaylight.protocol.framework.ReconnectStrategy;
+
+/**
+*
+*/
+public final class ReconnectImmediatelyStrategyModule extends org.opendaylight.controller.config.yang.reconnectstrategy.AbstractReconnectImmediatelyStrategyModule
+{
+
+    public ReconnectImmediatelyStrategyModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier, org.opendaylight.controller.config.api.DependencyResolver dependencyResolver) {
+        super(identifier, dependencyResolver);
+    }
+
+    public ReconnectImmediatelyStrategyModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier, org.opendaylight.controller.config.api.DependencyResolver dependencyResolver, ReconnectImmediatelyStrategyModule oldModule, java.lang.AutoCloseable oldInstance) {
+        super(identifier, dependencyResolver, oldModule, oldInstance);
+    }
+
+    @Override
+    public void validate(){
+               super.validate();
+               JmxAttributeValidationException.checkNotNull(getTimeout(),
+                               "value is not set.", timeoutJmxAttribute);
+               JmxAttributeValidationException.checkCondition(getTimeout() >= 0,
+                               "value " + getTimeout() + " is less than 0",
+                               timeoutJmxAttribute);
+    }
+
+    @Override
+    public java.lang.AutoCloseable createInstance() {
+               final ReconnectStrategy reconnectStrategy = new ReconnectImmediatelyStrategy(getExecutorDependency(), getTimeout());
+               return new ReconnectStrategyCloseable(reconnectStrategy);
+       }
+}
diff --git a/bgp/rib-impl-config/src/main/java/org/opendaylight/controller/config/yang/reconnectstrategy/ReconnectImmediatelyStrategyModuleFactory.java b/bgp/rib-impl-config/src/main/java/org/opendaylight/controller/config/yang/reconnectstrategy/ReconnectImmediatelyStrategyModuleFactory.java
new file mode 100644 (file)
index 0000000..09b1042
--- /dev/null
@@ -0,0 +1,19 @@
+/**
+* Generated file
+
+* Generated from: yang module name: reconnect-strategy  yang module local name: reconnect-immediately-strategy
+* Generated by: org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator
+* Generated at: Tue Nov 12 13:27:18 CET 2013
+*
+* Do not modify this file unless it is present under src/main directory
+*/
+package org.opendaylight.controller.config.yang.reconnectstrategy;
+
+/**
+*
+*/
+public class ReconnectImmediatelyStrategyModuleFactory extends org.opendaylight.controller.config.yang.reconnectstrategy.AbstractReconnectImmediatelyStrategyModuleFactory
+{
+
+
+}
diff --git a/bgp/rib-impl-config/src/main/java/org/opendaylight/controller/config/yang/reconnectstrategy/TimedReconnectStrategyModule.java b/bgp/rib-impl-config/src/main/java/org/opendaylight/controller/config/yang/reconnectstrategy/TimedReconnectStrategyModule.java
new file mode 100644 (file)
index 0000000..feee4a6
--- /dev/null
@@ -0,0 +1,63 @@
+/**
+* Generated file
+
+* Generated from: yang module name: reconnect-strategy  yang module local name: timed-reconnect-strategy
+* Generated by: org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator
+* Generated at: Tue Nov 12 13:27:18 CET 2013
+*
+* Do not modify this file unless it is present under src/main directory
+*/
+package org.opendaylight.controller.config.yang.reconnectstrategy;
+
+import org.opendaylight.controller.config.api.JmxAttributeValidationException;
+import org.opendaylight.controller.config.reconnectstrategy.util.ReconnectStrategyCloseable;
+import org.opendaylight.protocol.framework.ReconnectStrategy;
+import org.opendaylight.protocol.framework.TimedReconnectStrategy;
+
+/**
+*
+*/
+public final class TimedReconnectStrategyModule extends org.opendaylight.controller.config.yang.reconnectstrategy.AbstractTimedReconnectStrategyModule
+{
+
+    public TimedReconnectStrategyModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier, org.opendaylight.controller.config.api.DependencyResolver dependencyResolver) {
+        super(identifier, dependencyResolver);
+    }
+
+    public TimedReconnectStrategyModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier, org.opendaylight.controller.config.api.DependencyResolver dependencyResolver, TimedReconnectStrategyModule oldModule, java.lang.AutoCloseable oldInstance) {
+        super(identifier, dependencyResolver, oldModule, oldInstance);
+    }
+
+    @Override
+    public void validate(){
+               super.validate();
+               JmxAttributeValidationException.checkNotNull(getSleepFactor(),
+               "value is not set.", sleepFactorJmxAttribute);
+               JmxAttributeValidationException.checkCondition(getSleepFactor()
+                               .doubleValue() >= 1,
+                               "value " + getSleepFactor() + " is less than 1",
+                               sleepFactorJmxAttribute);
+
+               JmxAttributeValidationException.checkNotNull(getConnectTime(),
+               "value is not set.", connectTimeJmxAttribute);
+               JmxAttributeValidationException.checkCondition(getConnectTime() >= 0,
+                               "value " + getConnectTime() + " is less than 0",
+                               connectTimeJmxAttribute);
+
+               JmxAttributeValidationException.checkNotNull(getMaxSleep(),
+               "value is not set.", minSleepJmxAttribute);
+               JmxAttributeValidationException.checkCondition(
+                               getMaxSleep() == null || getMinSleep() <= getMaxSleep(),
+                               "value " + getMinSleep() + " is greter than MaxSleep " + getMaxSleep(),
+                               minSleepJmxAttribute);
+    }
+
+    @Override
+    public java.lang.AutoCloseable createInstance() {
+               ReconnectStrategy reconnectStrategy = new TimedReconnectStrategy(
+                               getExecutorDependency(), getConnectTime(), getMinSleep(),
+                               getSleepFactor().doubleValue(), getMaxSleep(),
+                               getMaxAttempts(), getDeadline());
+               return new ReconnectStrategyCloseable(reconnectStrategy);
+       }
+}
diff --git a/bgp/rib-impl-config/src/main/java/org/opendaylight/controller/config/yang/reconnectstrategy/TimedReconnectStrategyModuleFactory.java b/bgp/rib-impl-config/src/main/java/org/opendaylight/controller/config/yang/reconnectstrategy/TimedReconnectStrategyModuleFactory.java
new file mode 100644 (file)
index 0000000..387d034
--- /dev/null
@@ -0,0 +1,19 @@
+/**
+* Generated file
+
+* Generated from: yang module name: reconnect-strategy  yang module local name: timed-reconnect-strategy
+* Generated by: org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator
+* Generated at: Tue Nov 12 13:27:18 CET 2013
+*
+* Do not modify this file unless it is present under src/main directory
+*/
+package org.opendaylight.controller.config.yang.reconnectstrategy;
+
+/**
+*
+*/
+public class TimedReconnectStrategyModuleFactory extends org.opendaylight.controller.config.yang.reconnectstrategy.AbstractTimedReconnectStrategyModuleFactory
+{
+
+
+}
diff --git a/bgp/rib-impl-config/src/main/yang/reconnect-strategy.yang b/bgp/rib-impl-config/src/main/yang/reconnect-strategy.yang
new file mode 100644 (file)
index 0000000..a327f9b
--- /dev/null
@@ -0,0 +1,143 @@
+// vi: set smarttab et sw=4 tabstop=4:
+module reconnect-strategy {
+    yang-version 1;
+    namespace "urn:opendaylight:params:xml:ns:yang:controller:reconnectstrategy";
+    prefix "rs";
+
+    import config { prefix config; revision-date 2013-04-05; }
+    import threadpool { prefix th; revision-date 2013-04-09; }
+
+    organization "Cisco Systems, Inc.";
+
+    contact "Milos Fabian <milfabia@cisco.com>";
+
+    description
+        "This module contains the base YANG definitions for
+         reconnect strategy.
+
+        Copyright (c)2013 Cisco Systems, Inc. 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";
+
+    revision "2013-11-09" {
+        description
+            "Initial revision";
+    }
+
+    identity reconnect-strategy {
+        description
+            "Service representing a reconnect strategy.";
+
+        base "config:service-type";
+        config:java-class "org.opendaylight.protocol.framework.ReconnectStrategy";
+    }
+
+    identity never-reconnect-strategy {
+        base config:module-type;
+        config:provided-service reconnect-strategy;
+        config:java-name-prefix NeverReconnectStrategy;
+    }
+
+    augment "/config:modules/config:module/config:configuration" {
+        case never-reconnect-strategy {
+            when "/config:modules/config:module/config:type = 'never-reconnect-strategy'";
+            
+            leaf timeout {
+                 mandatory true;
+                 type int32;
+            }
+            
+            container executor {
+                               uses config:service-ref {
+                                       refine type {
+                                               mandatory true;
+                                               config:required-identity th:netty-event-executor;
+                                       }
+                               }
+                       }
+        }
+    }
+    
+    identity reconnect-immediately-strategy {
+        base config:module-type;
+        config:provided-service reconnect-strategy;
+        config:java-name-prefix ReconnectImmediatelyStrategy;
+    }
+
+    augment "/config:modules/config:module/config:configuration" {
+        case reconnect-immediately-strategy {
+            when "/config:modules/config:module/config:type = 'reconnect-immediately-strategy'";
+            
+            leaf timeout {
+                 mandatory true;
+                 type int32;
+            }
+            
+            container executor {
+                               uses config:service-ref {
+                                       refine type {
+                                               mandatory true;
+                                               config:required-identity th:netty-event-executor;
+                                       }
+                               }
+                       }
+        }
+    }
+    
+    identity timed-reconnect-strategy {
+        base config:module-type;
+        config:provided-service reconnect-strategy;
+        config:java-name-prefix TimedReconnectStrategy;
+    }
+
+    augment "/config:modules/config:module/config:configuration" {
+        case timed-reconnect-strategy {
+            when "/config:modules/config:module/config:type = 'timed-reconnect-strategy'";
+            
+            leaf deadline {
+                 mandatory true;
+                 type int64;
+            }
+            
+            leaf max-attempts {
+                 mandatory true;
+                 type int64;
+            }
+            
+            leaf max-sleep {
+                 mandatory true;
+                 type int64;
+            }
+            
+            leaf min-sleep {
+                 mandatory true;
+                 type int64;
+            }
+            
+            leaf sleep-factor {
+                 mandatory true;
+                 type decimal64 {
+                                       fraction-digits 2;
+                               }
+            }
+            
+            leaf connect-time {
+                 mandatory true;
+                 type int32;
+            }
+            
+            container executor {
+                               uses config:service-ref {
+                                       refine type {
+                                               mandatory true;
+                                               config:required-identity th:netty-event-executor;
+                                       }
+                               }
+                       }
+        }
+    }
+}
+
diff --git a/bgp/rib-impl-config/src/test/java/org/opendaylight/controller/config/yang/bgp/reconnectstrategy/GlobalEventExecutorUtil.java b/bgp/rib-impl-config/src/test/java/org/opendaylight/controller/config/yang/bgp/reconnectstrategy/GlobalEventExecutorUtil.java
new file mode 100644 (file)
index 0000000..a59abcd
--- /dev/null
@@ -0,0 +1,47 @@
+package org.opendaylight.controller.config.yang.bgp.reconnectstrategy;
+
+import javax.management.InstanceAlreadyExistsException;
+import javax.management.ObjectName;
+
+import org.opendaylight.controller.config.manager.impl.AbstractConfigTest;
+import org.opendaylight.controller.config.util.ConfigRegistryJMXClient;
+import org.opendaylight.controller.config.util.ConfigTransactionJMXClient;
+import org.opendaylight.controller.config.yang.netty.eventexecutor.GlobalEventExecutorModuleFactory;
+import org.opendaylight.controller.config.yang.netty.eventexecutor.GlobalEventExecutorModuleMXBean;
+
+public class GlobalEventExecutorUtil extends AbstractConfigTest {
+
+       private final String instanceName = "global-executor";
+
+       private ObjectName createInstance(
+                       final ConfigTransactionJMXClient transaction,
+                       final String instanceName, GlobalEventExecutorModuleFactory factory)
+                       throws InstanceAlreadyExistsException {
+               ObjectName nameCreated = transaction.createModule(
+                               factory.getImplementationName(), instanceName);
+               transaction.newMBeanProxy(nameCreated,
+                               GlobalEventExecutorModuleMXBean.class);
+               return nameCreated;
+       }
+
+       private ObjectName createBean(GlobalEventExecutorModuleFactory factory,
+                       ConfigRegistryJMXClient configRegistryClient)
+                       throws InstanceAlreadyExistsException {
+               ConfigTransactionJMXClient transaction = configRegistryClient
+                               .createTransaction();
+               ObjectName objectName = createInstance(transaction, instanceName,
+                               factory);
+               transaction.validateConfig();
+               transaction.commit();
+               return objectName;
+       }
+
+       public static ObjectName createGlobalEventExecutorBean(
+                       GlobalEventExecutorModuleFactory factory,
+                       ConfigRegistryJMXClient configRegistryClient)
+                       throws InstanceAlreadyExistsException {
+               GlobalEventExecutorUtil util = new GlobalEventExecutorUtil();
+               return util.createBean(factory, configRegistryClient);
+       }
+
+}
diff --git a/bgp/rib-impl-config/src/test/java/org/opendaylight/controller/config/yang/bgp/reconnectstrategy/NeverReconnectStrategyModuleTest.java b/bgp/rib-impl-config/src/test/java/org/opendaylight/controller/config/yang/bgp/reconnectstrategy/NeverReconnectStrategyModuleTest.java
new file mode 100644 (file)
index 0000000..5fba544
--- /dev/null
@@ -0,0 +1,142 @@
+package org.opendaylight.controller.config.yang.bgp.reconnectstrategy;
+
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import javax.management.InstanceAlreadyExistsException;
+import javax.management.InstanceNotFoundException;
+import javax.management.ObjectName;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.opendaylight.controller.config.api.ConflictingVersionException;
+import org.opendaylight.controller.config.api.ValidationException;
+import org.opendaylight.controller.config.api.jmx.CommitStatus;
+import org.opendaylight.controller.config.manager.impl.AbstractConfigTest;
+import org.opendaylight.controller.config.manager.impl.factoriesresolver.HardcodedModuleFactoriesResolver;
+import org.opendaylight.controller.config.util.ConfigTransactionJMXClient;
+import org.opendaylight.controller.config.yang.netty.eventexecutor.GlobalEventExecutorModuleFactory;
+import org.opendaylight.controller.config.yang.reconnectstrategy.AbstractNeverReconnectStrategyModuleFactory;
+import org.opendaylight.controller.config.yang.reconnectstrategy.NeverReconnectStrategyModuleFactory;
+import org.opendaylight.controller.config.yang.reconnectstrategy.NeverReconnectStrategyModuleMXBean;
+
+public class NeverReconnectStrategyModuleTest extends AbstractConfigTest {
+
+       private final String instanceName = "never";
+
+       private NeverReconnectStrategyModuleFactory factory;
+
+       private ObjectName executor;
+
+       @Before
+       public void setUp() throws Exception {
+               this.factory = new NeverReconnectStrategyModuleFactory();
+               GlobalEventExecutorModuleFactory executorFactory = new GlobalEventExecutorModuleFactory();
+               super.initConfigTransactionManagerImpl(new HardcodedModuleFactoriesResolver(
+                               factory, executorFactory));
+               this.executor = GlobalEventExecutorUtil.createGlobalEventExecutorBean(
+                               executorFactory, configRegistryClient);
+       }
+
+       @Test
+       public void testValidationException1()
+                       throws InstanceAlreadyExistsException {
+               try {
+                       ConfigTransactionJMXClient transaction = configRegistryClient
+                                       .createTransaction();
+                       createInstance(transaction, instanceName, null, this.executor);
+                       transaction.validateConfig();
+                       fail();
+               } catch (ValidationException e) {
+                       assertTrue(e.getMessage().contains("value is not set."));
+               }
+       }
+
+       @Test
+       public void testValidationException2()
+                       throws InstanceAlreadyExistsException {
+               try {
+                       ConfigTransactionJMXClient transaction = configRegistryClient
+                                       .createTransaction();
+                       createInstance(transaction, instanceName, -1, this.executor);
+                       transaction.validateConfig();
+                       fail();
+               } catch (ValidationException e) {
+                       assertTrue(e.getMessage().contains("is less than 0"));
+               }
+       }
+
+       @Test
+       public void testValidationException3()
+                       throws InstanceAlreadyExistsException {
+               try {
+                       ConfigTransactionJMXClient transaction = configRegistryClient
+                                       .createTransaction();
+                       createInstance(transaction, instanceName, 100, null);
+                       transaction.validateConfig();
+                       fail();
+               } catch (ValidationException e) {
+                       assertTrue(e.getMessage().contains(
+                                       "expected dependency implementing interface"));
+               }
+       }
+
+       @Test
+       public void testCreateBean() throws Exception {
+               ConfigTransactionJMXClient transaction = configRegistryClient
+                               .createTransaction();
+               createInstance(transaction, instanceName, 500, this.executor);
+               transaction.validateConfig();
+               CommitStatus status = transaction.commit();
+               assertBeanCount(1, factory.getImplementationName());
+               assertStatus(status, 1, 0, 1);
+       }
+
+       @Test
+       public void testReusingOldInstance() throws InstanceAlreadyExistsException,
+                       ConflictingVersionException, ValidationException {
+               ConfigTransactionJMXClient transaction = configRegistryClient
+                               .createTransaction();
+               createInstance(transaction, instanceName, 100, this.executor);
+               transaction.commit();
+               transaction = configRegistryClient.createTransaction();
+               assertBeanCount(1, factory.getImplementationName());
+               CommitStatus status = transaction.commit();
+               assertBeanCount(1, factory.getImplementationName());
+               assertStatus(status, 0, 0, 2);
+       }
+
+       @Test
+       public void testReconfigure() throws InstanceAlreadyExistsException,
+                       ConflictingVersionException, ValidationException,
+                       InstanceNotFoundException {
+               ConfigTransactionJMXClient transaction = configRegistryClient
+                               .createTransaction();
+               createInstance(transaction, instanceName, 500, this.executor);
+               transaction.commit();
+               transaction = configRegistryClient.createTransaction();
+               assertBeanCount(1, factory.getImplementationName());
+               NeverReconnectStrategyModuleMXBean mxBean = transaction
+                               .newMBeanProxy(transaction.lookupConfigBean(
+                                               AbstractNeverReconnectStrategyModuleFactory.NAME,
+                                               instanceName), NeverReconnectStrategyModuleMXBean.class);
+               mxBean.setTimeout(200);
+               CommitStatus status = transaction.commit();
+               assertBeanCount(1, factory.getImplementationName());
+               assertStatus(status, 0, 1, 1);
+       }
+
+       private ObjectName createInstance(
+                       final ConfigTransactionJMXClient transaction,
+                       final String instanceName, final Integer timeout,
+                       final ObjectName executor) throws InstanceAlreadyExistsException {
+               ObjectName nameCreated = transaction.createModule(
+                               factory.getImplementationName(), instanceName);
+               NeverReconnectStrategyModuleMXBean mxBean = transaction.newMBeanProxy(
+                               nameCreated, NeverReconnectStrategyModuleMXBean.class);
+               mxBean.setTimeout(timeout);
+               mxBean.setExecutor(executor);
+               return nameCreated;
+       }
+
+}
diff --git a/bgp/rib-impl-config/src/test/java/org/opendaylight/controller/config/yang/bgp/reconnectstrategy/ReconnectImmediatelyStrategyModuleTest.java b/bgp/rib-impl-config/src/test/java/org/opendaylight/controller/config/yang/bgp/reconnectstrategy/ReconnectImmediatelyStrategyModuleTest.java
new file mode 100644 (file)
index 0000000..1f9283a
--- /dev/null
@@ -0,0 +1,144 @@
+package org.opendaylight.controller.config.yang.bgp.reconnectstrategy;
+
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import javax.management.InstanceAlreadyExistsException;
+import javax.management.InstanceNotFoundException;
+import javax.management.ObjectName;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.opendaylight.controller.config.api.ConflictingVersionException;
+import org.opendaylight.controller.config.api.ValidationException;
+import org.opendaylight.controller.config.api.jmx.CommitStatus;
+import org.opendaylight.controller.config.manager.impl.AbstractConfigTest;
+import org.opendaylight.controller.config.manager.impl.factoriesresolver.HardcodedModuleFactoriesResolver;
+import org.opendaylight.controller.config.util.ConfigTransactionJMXClient;
+import org.opendaylight.controller.config.yang.netty.eventexecutor.GlobalEventExecutorModuleFactory;
+import org.opendaylight.controller.config.yang.reconnectstrategy.AbstractReconnectImmediatelyStrategyModuleFactory;
+import org.opendaylight.controller.config.yang.reconnectstrategy.ReconnectImmediatelyStrategyModuleFactory;
+import org.opendaylight.controller.config.yang.reconnectstrategy.ReconnectImmediatelyStrategyModuleMXBean;
+
+public class ReconnectImmediatelyStrategyModuleTest extends AbstractConfigTest {
+
+       private final String instanceName = "immediately";
+
+       private ReconnectImmediatelyStrategyModuleFactory factory;
+
+       private ObjectName executor;
+
+       @Before
+       public void setUp() throws Exception {
+               this.factory = new ReconnectImmediatelyStrategyModuleFactory();
+               GlobalEventExecutorModuleFactory executorFactory = new GlobalEventExecutorModuleFactory();
+               super.initConfigTransactionManagerImpl(new HardcodedModuleFactoriesResolver(
+                               factory, executorFactory));
+               this.executor = GlobalEventExecutorUtil.createGlobalEventExecutorBean(
+                               executorFactory, configRegistryClient);
+       }
+
+       @Test
+       public void testValidationException1()
+                       throws InstanceAlreadyExistsException {
+               try {
+                       ConfigTransactionJMXClient transaction = configRegistryClient
+                                       .createTransaction();
+                       createInstance(transaction, instanceName, null, this.executor);
+                       transaction.validateConfig();
+                       fail();
+               } catch (ValidationException e) {
+                       assertTrue(e.getMessage().contains("value is not set."));
+               }
+       }
+
+       @Test
+       public void testValidationException2()
+                       throws InstanceAlreadyExistsException {
+               try {
+                       ConfigTransactionJMXClient transaction = configRegistryClient
+                                       .createTransaction();
+                       createInstance(transaction, instanceName, -1, this.executor);
+                       transaction.validateConfig();
+                       fail();
+               } catch (ValidationException e) {
+                       assertTrue(e.getMessage().contains("is less than 0"));
+               }
+       }
+
+       @Test
+       public void testValidationException3()
+                       throws InstanceAlreadyExistsException {
+               try {
+                       ConfigTransactionJMXClient transaction = configRegistryClient
+                                       .createTransaction();
+                       createInstance(transaction, instanceName, 100, null);
+                       transaction.validateConfig();
+                       fail();
+               } catch (ValidationException e) {
+                       assertTrue(e.getMessage().contains(
+                                       "expected dependency implementing interface"));
+               }
+       }
+
+       @Test
+       public void testCreateBean() throws Exception {
+               ConfigTransactionJMXClient transaction = configRegistryClient
+                               .createTransaction();
+               createInstance(transaction, instanceName, 500, this.executor);
+               transaction.validateConfig();
+               CommitStatus status = transaction.commit();
+               assertBeanCount(1, factory.getImplementationName());
+               assertStatus(status, 1, 0, 1);
+       }
+
+       @Test
+       public void testReusingOldInstance() throws InstanceAlreadyExistsException,
+                       ConflictingVersionException, ValidationException {
+               ConfigTransactionJMXClient transaction = configRegistryClient
+                               .createTransaction();
+               createInstance(transaction, instanceName, 100, this.executor);
+               transaction.commit();
+               transaction = configRegistryClient.createTransaction();
+               assertBeanCount(1, factory.getImplementationName());
+               CommitStatus status = transaction.commit();
+               assertBeanCount(1, factory.getImplementationName());
+               assertStatus(status, 0, 0, 2);
+       }
+
+       @Test
+       public void testReconfigure() throws InstanceAlreadyExistsException,
+                       ConflictingVersionException, ValidationException,
+                       InstanceNotFoundException {
+               ConfigTransactionJMXClient transaction = configRegistryClient
+                               .createTransaction();
+               createInstance(transaction, instanceName, 500, this.executor);
+               transaction.commit();
+               transaction = configRegistryClient.createTransaction();
+               assertBeanCount(1, factory.getImplementationName());
+               ReconnectImmediatelyStrategyModuleMXBean mxBean = transaction
+                               .newMBeanProxy(transaction.lookupConfigBean(
+                                               AbstractReconnectImmediatelyStrategyModuleFactory.NAME,
+                                               instanceName),
+                                               ReconnectImmediatelyStrategyModuleMXBean.class);
+               mxBean.setTimeout(200);
+               CommitStatus status = transaction.commit();
+               assertBeanCount(1, factory.getImplementationName());
+               assertStatus(status, 0, 1, 1);
+       }
+
+       private ObjectName createInstance(
+                       final ConfigTransactionJMXClient transaction,
+                       final String instanceName, final Integer timeout,
+                       final ObjectName executor) throws InstanceAlreadyExistsException {
+               ObjectName nameCreated = transaction.createModule(
+                               factory.getImplementationName(), instanceName);
+               ReconnectImmediatelyStrategyModuleMXBean mxBean = transaction
+                               .newMBeanProxy(nameCreated,
+                                               ReconnectImmediatelyStrategyModuleMXBean.class);
+               mxBean.setTimeout(timeout);
+               mxBean.setExecutor(executor);
+               return nameCreated;
+       }
+
+}
diff --git a/bgp/rib-impl-config/src/test/java/org/opendaylight/controller/config/yang/bgp/reconnectstrategy/TimedReconnectStrategyModuleTest.java b/bgp/rib-impl-config/src/test/java/org/opendaylight/controller/config/yang/bgp/reconnectstrategy/TimedReconnectStrategyModuleTest.java
new file mode 100644 (file)
index 0000000..0a49a53
--- /dev/null
@@ -0,0 +1,223 @@
+package org.opendaylight.controller.config.yang.bgp.reconnectstrategy;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import java.math.BigDecimal;
+
+import javax.management.InstanceAlreadyExistsException;
+import javax.management.InstanceNotFoundException;
+import javax.management.ObjectName;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.opendaylight.controller.config.api.ConflictingVersionException;
+import org.opendaylight.controller.config.api.ValidationException;
+import org.opendaylight.controller.config.api.jmx.CommitStatus;
+import org.opendaylight.controller.config.manager.impl.AbstractConfigTest;
+import org.opendaylight.controller.config.manager.impl.factoriesresolver.HardcodedModuleFactoriesResolver;
+import org.opendaylight.controller.config.util.ConfigTransactionJMXClient;
+import org.opendaylight.controller.config.yang.netty.eventexecutor.GlobalEventExecutorModuleFactory;
+import org.opendaylight.controller.config.yang.reconnectstrategy.AbstractTimedReconnectStrategyModuleFactory;
+import org.opendaylight.controller.config.yang.reconnectstrategy.TimedReconnectStrategyModuleFactory;
+import org.opendaylight.controller.config.yang.reconnectstrategy.TimedReconnectStrategyModuleMXBean;
+
+public class TimedReconnectStrategyModuleTest extends AbstractConfigTest {
+
+       private final String instanceName = "timed";
+
+       private TimedReconnectStrategyModuleFactory factory;
+
+       private ObjectName executor;
+
+       @Before
+       public void setUp() throws Exception {
+               this.factory = new TimedReconnectStrategyModuleFactory();
+               GlobalEventExecutorModuleFactory executorFactory = new GlobalEventExecutorModuleFactory();
+               super.initConfigTransactionManagerImpl(new HardcodedModuleFactoriesResolver(
+                               factory, executorFactory));
+               this.executor = GlobalEventExecutorUtil.createGlobalEventExecutorBean(
+                               executorFactory, configRegistryClient);
+       }
+
+       @Test
+       public void testValidationException1()
+                       throws InstanceAlreadyExistsException {
+               try {
+                       ConfigTransactionJMXClient transaction = configRegistryClient
+                                       .createTransaction();
+                       createInstance(transaction, instanceName, 500, 100L, null, 500L,
+                                       10L, 10000L, this.executor);
+                       transaction.validateConfig();
+                       fail();
+               } catch (ValidationException e) {
+                       assertTrue(e.getMessage().contains("SleepFactor value is not set."));
+               }
+       }
+
+       @Test
+       public void testValidationException2()
+                       throws InstanceAlreadyExistsException {
+               try {
+                       ConfigTransactionJMXClient transaction = configRegistryClient
+                                       .createTransaction();
+                       createInstance(transaction, instanceName, 500, 100L,
+                                       new BigDecimal(0.5), 500L, 10L, 10000L, this.executor);
+                       transaction.validateConfig();
+                       fail();
+               } catch (ValidationException e) {
+                       assertTrue(e.getMessage().contains("value 0.5 is less than 1"));
+               }
+       }
+
+       @Test
+       public void testValidationException3()
+                       throws InstanceAlreadyExistsException {
+               try {
+                       ConfigTransactionJMXClient transaction = configRegistryClient
+                                       .createTransaction();
+                       createInstance(transaction, instanceName, null, 100L,
+                                       new BigDecimal(1.0), 500L, 10L, 10000L, this.executor);
+                       transaction.validateConfig();
+                       fail();
+               } catch (ValidationException e) {
+                       assertTrue(e.getMessage().contains("ConnectTime value is not set."));
+               }
+       }
+
+       @Test
+       public void testValidationException4()
+                       throws InstanceAlreadyExistsException {
+               try {
+                       ConfigTransactionJMXClient transaction = configRegistryClient
+                                       .createTransaction();
+                       createInstance(transaction, instanceName, -1, 100L, new BigDecimal(
+                                       1.0), 500L, 10L, 10000L, this.executor);
+                       transaction.validateConfig();
+                       fail();
+               } catch (ValidationException e) {
+                       assertTrue(e.getMessage().contains("value -1 is less than 0"));
+               }
+       }
+
+       @Test
+       public void testValidationException5()
+                       throws InstanceAlreadyExistsException {
+               try {
+                       ConfigTransactionJMXClient transaction = configRegistryClient
+                                       .createTransaction();
+                       createInstance(transaction, instanceName, 100, null,
+                                       new BigDecimal(1.0), null, 10L, 10000L, this.executor);
+                       transaction.validateConfig();
+                       fail();
+               } catch (ValidationException e) {
+                       assertTrue(e.getMessage().contains("MinSleep value is not set."));
+               }
+       }
+
+       @Test
+       public void testValidationException6()
+                       throws InstanceAlreadyExistsException {
+               try {
+                       ConfigTransactionJMXClient transaction = configRegistryClient
+                                       .createTransaction();
+                       createInstance(transaction, instanceName, 100, 300L,
+                                       new BigDecimal(1.0), 100L, 10L, 10000L, this.executor);
+                       transaction.validateConfig();
+                       fail();
+               } catch (ValidationException e) {
+                       assertTrue(e.getMessage().contains(
+                                       "value 300 is greter than MaxSleep 100"));
+               }
+       }
+
+       @Test
+       public void testValidationException7()
+                       throws InstanceAlreadyExistsException {
+               try {
+                       ConfigTransactionJMXClient transaction = configRegistryClient
+                                       .createTransaction();
+                       createInstance(transaction, instanceName, 100, 100L,
+                                       new BigDecimal(1.0), 300L, 10L, 10000L, null);
+                       transaction.validateConfig();
+                       fail();
+               } catch (ValidationException e) {
+                       assertTrue(e.getMessage().contains(
+                                       "expected dependency implementing interface"));
+               }
+       }
+
+       @Test
+       public void testCreateBean() throws Exception {
+               ConfigTransactionJMXClient transaction = configRegistryClient
+                               .createTransaction();
+               createInstance(transaction, instanceName, 500, 100L,
+                               new BigDecimal(1.0), 500L, 10L, 10000L, this.executor);
+               transaction.validateConfig();
+               CommitStatus status = transaction.commit();
+               assertBeanCount(1, factory.getImplementationName());
+               assertStatus(status, 1, 0, 1);
+       }
+
+       @Test
+       public void testReusingOldInstance() throws InstanceAlreadyExistsException,
+                       ConflictingVersionException, ValidationException {
+               ConfigTransactionJMXClient transaction = configRegistryClient
+                               .createTransaction();
+               createInstance(transaction, instanceName, 500, 100L,
+                               new BigDecimal(1.0), 500L, 10L, 10000L, this.executor);
+               transaction.commit();
+               transaction = configRegistryClient.createTransaction();
+               assertBeanCount(1, factory.getImplementationName());
+               CommitStatus status = transaction.commit();
+               assertBeanCount(1, factory.getImplementationName());
+               assertStatus(status, 0, 0, 2);
+       }
+
+       @Test
+       public void testReconfigure() throws InstanceAlreadyExistsException,
+                       ConflictingVersionException, ValidationException,
+                       InstanceNotFoundException {
+               ConfigTransactionJMXClient transaction = configRegistryClient
+                               .createTransaction();
+               createInstance(transaction, instanceName, 500, 100L,
+                               new BigDecimal(1.0), new Long(500), new Long(10), new Long(
+                                               10000), this.executor);
+               transaction.commit();
+               transaction = configRegistryClient.createTransaction();
+               assertBeanCount(1, factory.getImplementationName());
+               TimedReconnectStrategyModuleMXBean mxBean = transaction
+                               .newMBeanProxy(transaction.lookupConfigBean(
+                                               AbstractTimedReconnectStrategyModuleFactory.NAME,
+                                               instanceName), TimedReconnectStrategyModuleMXBean.class);
+               assertEquals(mxBean.getMinSleep(), new Long(100));
+               mxBean.setMinSleep(200L);
+               assertEquals(mxBean.getMinSleep(), new Long(200));
+               CommitStatus status = transaction.commit();
+               assertBeanCount(1, factory.getImplementationName());
+               assertStatus(status, 0, 1, 1);
+
+       }
+
+       private ObjectName createInstance(
+                       final ConfigTransactionJMXClient transaction,
+                       final String instanceName, final Integer connectTime,
+                       final Long minSleep, final BigDecimal sleepFactor,
+                       final Long maxSleep, final Long maxAttempts, final Long deadline,
+                       final ObjectName executor) throws InstanceAlreadyExistsException {
+               ObjectName nameCreated = transaction.createModule(
+                               factory.getImplementationName(), instanceName);
+               TimedReconnectStrategyModuleMXBean mxBean = transaction.newMBeanProxy(
+                               nameCreated, TimedReconnectStrategyModuleMXBean.class);
+               mxBean.setConnectTime(connectTime);
+               mxBean.setDeadline(deadline);
+               mxBean.setMaxAttempts(maxAttempts);
+               mxBean.setMaxSleep(maxSleep);
+               mxBean.setMinSleep(minSleep);
+               mxBean.setSleepFactor(sleepFactor);
+               mxBean.setExecutor(executor);
+               return nameCreated;
+       }
+
+}
diff --git a/pom.xml b/pom.xml
index 3ccc6c03d5e2f61535e655bcdf7eea2fef6e2fc5..6b445c188ca3d7b5f381224ec8c1c83a4d359953 100644 (file)
--- a/pom.xml
+++ b/pom.xml
@@ -32,7 +32,7 @@
                <osgi.version>5.0.0</osgi.version>
 
                <yangtools.version>0.5.9-SNAPSHOT</yangtools.version>
-        <controller.config.version>0.2.2-SNAPSHOT</controller.config.version>
+        <controller.config.version>0.2.3-SNAPSHOT</controller.config.version>
                <yang.binding.version>0.6.0-SNAPSHOT</yang.binding.version>
                <ietf.types.version>2010.09.24.1</ietf.types.version>
        </properties>