package org.opendaylight.controller.config.yang.bgp.linkstate;
import static org.junit.Assert.assertTrue;
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.anyString;
+import static org.mockito.Matchers.contains;
+import static org.mockito.Mockito.doAnswer;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.mock;
import com.google.common.base.Optional;
import com.google.common.collect.Lists;
import javax.management.InstanceAlreadyExistsException;
import javax.management.ObjectName;
import org.junit.Before;
import org.junit.Test;
+import org.mockito.Mockito;
+import org.mockito.invocation.InvocationOnMock;
+import org.mockito.stubbing.Answer;
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.yang.bgp.rib.spi.RIBExtensionsImplModuleTest;
import org.opendaylight.controller.config.yang.rsvp.spi.SimpleRSVPExtensionProviderContextModuleFactory;
import org.opendaylight.controller.config.yang.rsvp.spi.SimpleRSVPExtensionProviderContextModuleMXBean;
+import org.opendaylight.protocol.rsvp.parser.spi.RSVPExtensionProviderContext;
+import org.opendaylight.protocol.rsvp.parser.spi.pojo.SimpleRSVPExtensionProviderContext;
+import org.osgi.framework.Filter;
+import org.osgi.framework.ServiceListener;
+import org.osgi.framework.ServiceReference;
public class LinkstateModuleTest extends AbstractConfigTest {
private ObjectName rspvInstance;
@Before
- public void setUp() {
+ public void setUp() throws Exception {
super.initConfigTransactionManagerImpl(new HardcodedModuleFactoriesResolver(mockedContext, new
LinkstateModuleFactory(), new SimpleBGPExtensionProviderContextModuleFactory(), new
RIBExtensionsImplModuleFactory(), new SimpleRSVPExtensionProviderContextModuleFactory()));
+
+ doAnswer(new Answer<Filter>() {
+ @Override
+ public Filter answer(final InvocationOnMock invocation) {
+ final String str = invocation.getArgumentAt(0, String.class);
+ final Filter mockFilter = mock(Filter.class);
+ doReturn(str).when(mockFilter).toString();
+ return mockFilter;
+ }
+ }).when(mockedContext).createFilter(anyString());
+
+ Mockito.doNothing().when(this.mockedContext).addServiceListener(any(ServiceListener.class), Mockito.anyString());
+ Mockito.doNothing().when(this.mockedContext).removeServiceListener(any(ServiceListener.class));
+
+ setupMockService(RSVPExtensionProviderContext.class, new SimpleRSVPExtensionProviderContext());
+ }
+
+ private void setupMockService(final Class<?> serviceInterface, final Object instance) throws Exception {
+ final ServiceReference<?> mockServiceRef = mock(ServiceReference.class);
+ doReturn(new ServiceReference[]{mockServiceRef}).when(mockedContext).
+ getServiceReferences(anyString(), contains(serviceInterface.getName()));
+ doReturn(new ServiceReference[]{mockServiceRef}).when(mockedContext).
+ getServiceReferences(serviceInterface.getName(), null);
+ doReturn(instance).when(mockedContext).getService(mockServiceRef);
}
@Test
<snapshot>
<required-capabilities>
<capability>urn:opendaylight:params:xml:ns:yang:controller:rsvp:spi?module=odl-rsvp-parser-spi-cfg&revision=2015-08-26</capability>
- <capability>urn:opendaylight:params:xml:ns:yang:controller:rsvp:impl?module=odl-rsvp-parser-impl-cfg&revision=2015-08-26</capability>
</required-capabilities>
<configuration>
<data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<module>
<type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:rsvp:spi">prefix:rsvp-extensions-impl</type>
<name>global-rsvp-extensions</name>
- <rsvp-extension>
- <type xmlns:rsvp-spi="urn:opendaylight:params:xml:ns:yang:controller:rsvp:spi">rsvp-spi:rsvp-extension</type>
- <name>rsvp-parser</name>
- </rsvp-extension>
- </module>
- <module>
- <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:rsvp:impl">prefix:rsvp-parser</type>
- <name>rsvp-parser</name>
</module>
</modules>
<services xmlns="urn:opendaylight:params:xml:ns:yang:controller:config">
<provider>/modules/module[type='rsvp-extensions-impl'][name='global-rsvp-extensions']</provider>
</instance>
</service>
- <service>
- <type xmlns:rsvp-spi="urn:opendaylight:params:xml:ns:yang:controller:rsvp:spi">rsvp-spi:rsvp-extension</type>
- <instance>
- <name>rsvp-parser</name>
- <provider>/modules/module[type='rsvp-parser'][name='rsvp-parser']</provider>
- </instance>
- </service>
</services>
</data>
</configuration>
<build>
<plugins>
- <plugin>
- <groupId>org.opendaylight.yangtools</groupId>
- <artifactId>yang-maven-plugin</artifactId>
- </plugin>
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
+++ /dev/null
-/*
- * Copyright (c) 2015 Cisco Systems, Inc. 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.controller.config.yang.rsvp.impl;
-
-import org.opendaylight.protocol.rsvp.parser.impl.RSVPActivator;
-
-public class RSVPParserModule extends org.opendaylight.controller.config.yang.rsvp.impl.AbstractRSVPParserModule {
- public RSVPParserModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier, org.opendaylight.controller.config.api.DependencyResolver dependencyResolver) {
- super(identifier, dependencyResolver);
- }
-
- public RSVPParserModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier, org.opendaylight.controller.config.api.DependencyResolver dependencyResolver, org.opendaylight.controller.config.yang.rsvp.impl.RSVPParserModule oldModule, java.lang.AutoCloseable oldInstance) {
- super(identifier, dependencyResolver, oldModule, oldInstance);
- }
-
- @Override
- public void customValidation() {
- // add custom validation form module attributes here.
- }
-
- @Override
- public java.lang.AutoCloseable createInstance() {
- return new RSVPActivator();
- }
-
-}
+++ /dev/null
-/*
- * Copyright (c) 2015 Cisco Systems, Inc. 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.controller.config.yang.rsvp.impl;
-public class RSVPParserModuleFactory extends org.opendaylight.controller.config.yang.rsvp.impl.AbstractRSVPParserModuleFactory {
-
-}
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
+ xmlns:odl="http://opendaylight.org/xmlns/blueprint/v1.0.0">
+
+ <bean id="RSVPActivator" class="org.opendaylight.protocol.rsvp.parser.impl.RSVPActivator"/>
+
+ <service ref="RSVPActivator" interface="org.opendaylight.protocol.rsvp.parser.spi.RSVPExtensionProviderActivator"
+ odl:type="org.opendaylight.protocol.rsvp.parser.impl.RSVPActivator"/>
+</blueprint>
\ No newline at end of file
+++ /dev/null
-// vi: set smarttab et sw=4 tabstop=4:
-module odl-rsvp-parser-impl-cfg {
- yang-version 1;
- namespace "urn:opendaylight:params:xml:ns:yang:controller:rsvp:impl";
- prefix "rsvp-impl";
-
- import config { prefix config; revision-date 2013-04-05; }
- import odl-rsvp-parser-spi-cfg { prefix spi; revision-date 2015-08-26; }
-
- organization "Cisco Systems, Inc.";
-
- contact "Claudio D. Gasparini <cgaspari@cisco.com>";
-
- description
- "This module contains the base YANG definitions for
- RSPV listener service.
-
- Copyright (c)2015 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 "2015-08-26" {
- description
- "Initial revision";
- }
-
- identity rsvp-parser {
- base config:module-type;
- config:provided-service spi:rsvp-extension;
- config:java-name-prefix RSVPParser;
- }
-
- augment "/config:modules/config:module/config:configuration" {
- case rsvp-parser {
- when "/config:modules/config:module/config:type = 'rsvp-parser'";
- }
- }
-}
\ No newline at end of file
+++ /dev/null
-/*
- * Copyright (c) 2015 Cisco Systems, Inc. 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.controller.config.yang.rsvp.parser.impl;
-
-import org.junit.Before;
-import org.junit.Test;
-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.rsvp.impl.RSVPParserModuleFactory;
-import org.opendaylight.controller.config.yang.rsvp.spi.SimpleRSVPExtensionProviderContextModuleFactory;
-
-public class RSVPParserModuleTest extends AbstractConfigTest {
- private static final String FACTORY_NAME = RSVPParserModuleFactory.NAME;
- private static final String INSTANCE_NAME = "rsvp-parser-impl";
-
- @Before
- public void setUp() throws Exception {
- super.initConfigTransactionManagerImpl(new HardcodedModuleFactoriesResolver(this.mockedContext, new
- RSVPParserModuleFactory(), new SimpleRSVPExtensionProviderContextModuleFactory()));
- }
-
- @Test
- public void testCreateBean() throws Exception {
- final CommitStatus status = createInstance();
- assertBeanCount(1, FACTORY_NAME);
- assertStatus(status, 1, 0, 0);
- }
-
- @Test
- public void testReusingOldInstance() throws Exception {
- createInstance();
- final ConfigTransactionJMXClient transaction = this.configRegistryClient.createTransaction();
- assertBeanCount(1, FACTORY_NAME);
- final CommitStatus status = transaction.commit();
- assertBeanCount(1, FACTORY_NAME);
- assertStatus(status, 0, 0, 1);
- }
-
- private CommitStatus createInstance() throws Exception {
- final ConfigTransactionJMXClient transaction = this.configRegistryClient.createTransaction();
- transaction.createModule(FACTORY_NAME, INSTANCE_NAME);
- return transaction.commit();
- }
-}
\ No newline at end of file
*/
package org.opendaylight.controller.config.yang.rsvp.spi;
-import org.opendaylight.protocol.rsvp.parser.spi.RSVPExtensionProviderActivator;
-import org.opendaylight.protocol.rsvp.parser.spi.pojo.SimpleRSVPExtensionProviderContext;
+import com.google.common.reflect.AbstractInvocationHandler;
+import com.google.common.reflect.Reflection;
+import java.lang.reflect.Method;
+import org.opendaylight.controller.config.api.osgi.WaitingServiceTracker;
+import org.opendaylight.protocol.rsvp.parser.spi.RSVPExtensionProviderContext;
+import org.osgi.framework.BundleContext;
+/**
+ * @deprecated Replaced by blueprint wiring
+ */
+@Deprecated
public class SimpleRSVPExtensionProviderContextModule extends org.opendaylight.controller.config.yang.rsvp.spi.AbstractSimpleRSVPExtensionProviderContextModule {
+ private BundleContext bundleContext;
+
public SimpleRSVPExtensionProviderContextModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier, org.opendaylight.controller.config.api.DependencyResolver dependencyResolver) {
super(identifier, dependencyResolver);
}
@Override
public java.lang.AutoCloseable createInstance() {
- final class SimpleRSVPExtensionProviderContextAutoCloseable extends SimpleRSVPExtensionProviderContext implements AutoCloseable {
+ final WaitingServiceTracker<RSVPExtensionProviderContext> tracker =
+ WaitingServiceTracker.create(RSVPExtensionProviderContext.class, bundleContext);
+ final RSVPExtensionProviderContext service = tracker.waitForService(WaitingServiceTracker.FIVE_MINUTES);
+
+ return Reflection.newProxy(AutoCloseableRSVPExtensionProviderContext.class, new AbstractInvocationHandler() {
@Override
- public void close() {
- for (final RSVPExtensionProviderActivator e : getRsvpExtensionDependency()) {
- e.stop();
+ protected Object handleInvocation(Object proxy, Method method, Object[] args) throws Throwable {
+ if (method.getName().equals("close")) {
+ tracker.close();
+ return null;
+ } else {
+ return method.invoke(service, args);
}
}
- }
+ });
+ }
- final SimpleRSVPExtensionProviderContextAutoCloseable ret = new SimpleRSVPExtensionProviderContextAutoCloseable();
- for (final RSVPExtensionProviderActivator e : getRsvpExtensionDependency()) {
- e.start(ret);
- }
- return ret;
+ void setBundleContext(BundleContext bundleContext) {
+ this.bundleContext = bundleContext;
}
+ private static interface AutoCloseableRSVPExtensionProviderContext extends RSVPExtensionProviderContext, AutoCloseable {
+ }
}
* and is available at http://www.eclipse.org/legal/epl-v10.html
*/
package org.opendaylight.controller.config.yang.rsvp.spi;
-public class SimpleRSVPExtensionProviderContextModuleFactory extends org.opendaylight.controller.config.yang.rsvp.spi.AbstractSimpleRSVPExtensionProviderContextModuleFactory {
+import org.opendaylight.controller.config.api.DependencyResolver;
+import org.osgi.framework.BundleContext;
+
+/**
+ * @deprecated Replaced by blueprint wiring
+ */
+@Deprecated
+public class SimpleRSVPExtensionProviderContextModuleFactory extends AbstractSimpleRSVPExtensionProviderContextModuleFactory {
+ @Override
+ public SimpleRSVPExtensionProviderContextModule instantiateModule(String instanceName, DependencyResolver dependencyResolver,
+ SimpleRSVPExtensionProviderContextModule oldModule, AutoCloseable oldInstance, BundleContext bundleContext) {
+ SimpleRSVPExtensionProviderContextModule module = super.instantiateModule(instanceName, dependencyResolver, oldModule,
+ oldInstance, bundleContext);
+ module.setBundleContext(bundleContext);
+ return module;
+ }
+
+ @Override
+ public SimpleRSVPExtensionProviderContextModule instantiateModule(String instanceName, DependencyResolver dependencyResolver,
+ BundleContext bundleContext) {
+ SimpleRSVPExtensionProviderContextModule module = super.instantiateModule(instanceName, dependencyResolver, bundleContext);
+ module.setBundleContext(bundleContext);
+ return module;
+ }
}
--- /dev/null
+/*
+ * Copyright (c) 2016 Brocade Communications Systems, Inc. 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.protocol.rsvp.parser.spi.pojo;
+
+import com.google.common.base.Preconditions;
+import java.util.List;
+import org.opendaylight.protocol.rsvp.parser.spi.RSVPExtensionProviderActivator;
+import org.opendaylight.protocol.rsvp.parser.spi.RSVPExtensionProviderContext;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Starts and stops RSVPExtensionProviderActivator instances for a RSVPExtensionProviderContext.
+ *
+ * @author Thomas Pantelis
+ */
+public class SimpleRSVPExtensionProviderContextActivator implements AutoCloseable {
+ private static final Logger LOG = LoggerFactory.getLogger(SimpleRSVPExtensionProviderContextActivator.class);
+
+ private final RSVPExtensionProviderContext providerContext;
+ private final List<RSVPExtensionProviderActivator> extensionActivators;
+
+ public SimpleRSVPExtensionProviderContextActivator(final RSVPExtensionProviderContext providerContext,
+ final List<RSVPExtensionProviderActivator> extensionActivators) {
+ this.providerContext = Preconditions.checkNotNull(providerContext);
+ this.extensionActivators = Preconditions.checkNotNull(extensionActivators);
+ }
+
+ public void start() {
+ LOG.debug("Starting {} RSVPExtensionProviderActivator instances", extensionActivators.size());
+
+ for(final RSVPExtensionProviderActivator e : extensionActivators) {
+ e.start(providerContext);
+ }
+ }
+
+ @Override
+ public void close() {
+ LOG.debug("Stopping {} RSVPExtensionProviderActivator instances", extensionActivators.size());
+
+ for(final RSVPExtensionProviderActivator e : extensionActivators) {
+ e.stop();
+ }
+ }
+}
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
+ xmlns:odl="http://opendaylight.org/xmlns/blueprint/v1.0.0">
+
+ <!-- Obtains the specific list of RSVPExtensionProviderActivator OSGi services announced via
+ META-INF/services/org.opendaylight.protocol.rsvp.parser.spi.RSVPExtensionProviderActivator resources.
+ -->
+ <odl:specific-reference-list id="extensionActivators" interface="org.opendaylight.protocol.rsvp.parser.spi.RSVPExtensionProviderActivator"/>
+
+ <bean id="extensionProviderContext" class="org.opendaylight.protocol.rsvp.parser.spi.pojo.SimpleRSVPExtensionProviderContext"/>
+
+ <bean id="extensionProviderContextActivator" class="org.opendaylight.protocol.rsvp.parser.spi.pojo.SimpleRSVPExtensionProviderContextActivator"
+ init-method="start" destroy-method="close">
+ <argument ref="extensionProviderContext"/>
+ <argument ref="extensionActivators"/>
+ </bean>
+
+ <service ref="extensionProviderContext">
+ <interfaces>
+ <value>org.opendaylight.protocol.rsvp.parser.spi.RSVPExtensionProviderContext</value>
+ <value>org.opendaylight.protocol.rsvp.parser.spi.RSVPExtensionConsumerContext</value>
+ </interfaces>
+ </service>
+</blueprint>
\ No newline at end of file
config:java-class "org.opendaylight.protocol.rsvp.parser.spi.RSVPExtensionProviderContext";
}
- identity rsvp-extension {
- description
- "Service representing a RSVP parser extension.";
-
- base "config:service-type";
- config:java-class "org.opendaylight.protocol.rsvp.parser.spi.RSVPExtensionProviderActivator";
- }
-
identity rsvp-extensions-impl {
base config:module-type;
config:provided-service rsvp-extensions;
augment "/config:modules/config:module/config:configuration" {
case rsvp-extensions-impl {
when "/config:modules/config:module/config:type = 'rsvp-extensions-impl'";
-
- list rsvp-extension {
- uses config:service-ref {
- refine type {
- mandatory true;
- config:required-identity rsvp-extension;
- }
- }
- }
}
}
}
\ No newline at end of file
+++ /dev/null
-/*
- * Copyright (c) 2015 Cisco Systems, Inc. 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.controller.config.yang.rsvp.spi;
-
-import java.util.List;
-import javax.management.ObjectName;
-import org.junit.Before;
-import org.junit.Test;
-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;
-
-public class SimpleRSVPExtensionProviderContextModuleTest extends AbstractConfigTest {
- private static final String FACTORY_NAME = SimpleRSVPExtensionProviderContextModuleFactory.NAME;
- private static final String INSTANCE_NAME = "bgp-rsvp-extensions-impl";
-
- public static ObjectName SimpleRSVPExtensionProviderContextModuleInstance(final ConfigTransactionJMXClient transaction, final List<ObjectName> extensions) throws Exception {
- final ObjectName objectName = transaction.createModule(FACTORY_NAME, INSTANCE_NAME);
- final SimpleRSVPExtensionProviderContextModuleMXBean mxBean = transaction.newMXBeanProxy(objectName, SimpleRSVPExtensionProviderContextModuleMXBean.class);
- mxBean.setRsvpExtension(extensions);
- return objectName;
- }
-
- @Before
- public void setUp() throws Exception {
- super.initConfigTransactionManagerImpl(new HardcodedModuleFactoriesResolver(this.mockedContext, new SimpleRSVPExtensionProviderContextModuleFactory()));
- }
-
- @Test
- public void testCreateBean() throws Exception {
- final CommitStatus status = createInstance();
- assertBeanCount(1, FACTORY_NAME);
- assertStatus(status, 1, 0, 0);
- }
-
- @Test
- public void testReusingOldInstance() throws Exception {
- createInstance();
- final ConfigTransactionJMXClient transaction = this.configRegistryClient.createTransaction();
- assertBeanCount(1, FACTORY_NAME);
- final CommitStatus status = transaction.commit();
- assertBeanCount(1, FACTORY_NAME);
- assertStatus(status, 0, 0, 1);
- }
-
- private CommitStatus createInstance() throws Exception {
- final ConfigTransactionJMXClient transaction = this.configRegistryClient.createTransaction();
- transaction.createModule(FACTORY_NAME, INSTANCE_NAME);
- return transaction.commit();
- }
-}
\ No newline at end of file