Skip to content

Commit

Permalink
Convert openflowplugin-extension-onf to OSGi DS
Browse files Browse the repository at this point in the history
Make OnfExtensionProvider a proper component. Also modernize test suite
and properly unregister what we can.

JIRA: OPNFLWPLUG-1137
Change-Id: I389fd5c8afce09526ba4d539c3bca5ec16b7133f
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
  • Loading branch information
rovarga committed Feb 12, 2025
1 parent c693714 commit 5127f27
Show file tree
Hide file tree
Showing 4 changed files with 97 additions and 94 deletions.
34 changes: 24 additions & 10 deletions extension/openflowplugin-extension-onf/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -20,33 +20,47 @@

<dependencies>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>openflowplugin-extension-api</artifactId>
<groupId>com.github.spotbugs</groupId>
<artifactId>spotbugs-annotations</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>${project.groupId}.openflowjava</groupId>
<artifactId>openflow-protocol-spi</artifactId>
<groupId>com.guicedee.services</groupId>
<artifactId>javax.inject</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>openflowplugin-api</artifactId>
<groupId>jakarta.annotation</groupId>
<artifactId>jakarta.annotation-api</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>${project.groupId}</groupId>
<groupId>org.opendaylight.openflowplugin</groupId>
<artifactId>openflowplugin</artifactId>
</dependency>
<dependency>
<groupId>org.opendaylight.openflowplugin</groupId>
<artifactId>openflowplugin-api</artifactId>
</dependency>
<dependency>
<groupId>org.opendaylight.openflowplugin</groupId>
<artifactId>openflowplugin-extension-api</artifactId>
</dependency>
<dependency>
<groupId>org.opendaylight.openflowplugin.openflowjava</groupId>
<artifactId>openflow-protocol-api</artifactId>
</dependency>
<dependency>
<groupId>org.opendaylight.openflowplugin.openflowjava</groupId>
<artifactId>openflow-protocol-spi</artifactId>
</dependency>
<dependency>
<groupId>org.opendaylight.yangtools</groupId>
<artifactId>yang-common-netty</artifactId>
</dependency>
<dependency>
<groupId>com.github.spotbugs</groupId>
<artifactId>spotbugs-annotations</artifactId>
<optional>true</optional>
<groupId>org.osgi</groupId>
<artifactId>org.osgi.service.component.annotations</artifactId>
</dependency>
</dependencies>
</project>
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,16 @@

import static java.util.Objects.requireNonNull;

import java.util.List;
import javax.annotation.PreDestroy;
import javax.inject.Inject;
import javax.inject.Singleton;
import org.opendaylight.openflowjava.protocol.api.keys.ExperimenterIdDeserializerKey;
import org.opendaylight.openflowjava.protocol.api.keys.ExperimenterIdTypeDeserializerKey;
import org.opendaylight.openflowjava.protocol.api.keys.ExperimenterIdTypeSerializerKey;
import org.opendaylight.openflowjava.protocol.api.keys.MessageTypeKey;
import org.opendaylight.openflowjava.protocol.spi.connection.SwitchConnectionProvider;
import org.opendaylight.openflowplugin.api.OFConstants;
import org.opendaylight.openflowplugin.extension.api.ExtensionConverterRegistrator;
import org.opendaylight.openflowplugin.extension.api.OpenFlowPluginExtensionRegistratorProvider;
import org.opendaylight.openflowplugin.extension.api.TypeVersionKey;
import org.opendaylight.openflowplugin.extension.onf.converter.BundleAddMessageConverter;
Expand All @@ -29,33 +32,34 @@
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.bundle.service.rev170124.send.experimenter.input.experimenter.message.of.choice.BundleControlSal;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.rev170124.experimenter.input.experimenter.data.of.choice.BundleAddMessageOnf;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.rev170124.experimenter.input.experimenter.data.of.choice.BundleControlOnf;
import org.opendaylight.yangtools.concepts.Registration;
import org.osgi.service.component.annotations.Activate;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Deactivate;
import org.osgi.service.component.annotations.Reference;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
* Main provider for ONF extensions.
*/
public class OnfExtensionProvider {
@Singleton
@Component(service = { })
public final class OnfExtensionProvider implements AutoCloseable {
private static final Logger LOG = LoggerFactory.getLogger(OnfExtensionProvider.class);

private static final BundleControlConverter BUNDLE_CONTROL_CONVERTER = new BundleControlConverter();
private static final BundleAddMessageConverter BUNDLE_ADD_MESSAGE_CONVERTER = new BundleAddMessageConverter();

private final SwitchConnectionProvider switchConnectionProvider;
private final ExtensionConverterRegistrator converterRegistrator;
private final List<Registration> registrations;

public OnfExtensionProvider(final SwitchConnectionProvider switchConnectionProvider,
final OpenFlowPluginExtensionRegistratorProvider converterRegistrator) {
this.switchConnectionProvider = requireNonNull(switchConnectionProvider,
"SwitchConnectionProvider can not be null!");
this.converterRegistrator = requireNonNull(converterRegistrator.getExtensionConverterRegistrator(),
"ExtensionConverterRegistrator can not be null!");
}
@Inject
@Activate
public OnfExtensionProvider(@Reference final SwitchConnectionProvider switchConnectionProvider,
@Reference final OpenFlowPluginExtensionRegistratorProvider converterRegistrator) {
final var extensionConverterRegistrator = requireNonNull(
converterRegistrator.getExtensionConverterRegistrator(), "ExtensionConverterRegistrator can not be null!");

/**
* Init method for registration of converters called by blueprint.
*/
public void init() {
switchConnectionProvider.registerExperimenterMessageSerializer(
new ExperimenterIdTypeSerializerKey<>(OFConstants.OFP_VERSION_1_3,
OnfConstants.ONF_EXPERIMENTER, OnfConstants.ONF_ET_BUNDLE_CONTROL.toJava(),
Expand All @@ -75,15 +79,28 @@ public void init() {
OnfConstants.ONF_EXPERIMENTER, ErrorMessage.class),
new OnfExperimenterErrorFactory());

converterRegistrator.registerMessageConvertor(
new TypeVersionKey<>(BundleControlSal.class, OFConstants.OFP_VERSION_1_3), BUNDLE_CONTROL_CONVERTER);
converterRegistrator.registerMessageConvertor(
new MessageTypeKey<>(OFConstants.OFP_VERSION_1_3, BundleControlOnf.class), BUNDLE_CONTROL_CONVERTER);
converterRegistrator.registerMessageConvertor(
new TypeVersionKey<>(BundleAddMessageSal.class, OFConstants.OFP_VERSION_1_3), BUNDLE_ADD_MESSAGE_CONVERTER);
converterRegistrator.registerMessageConvertor(
new MessageTypeKey<>(OFConstants.OFP_VERSION_1_3, BundleAddMessageOnf.class), BUNDLE_ADD_MESSAGE_CONVERTER);
registrations = List.of(
extensionConverterRegistrator.registerMessageConvertor(
new TypeVersionKey<>(BundleControlSal.class, OFConstants.OFP_VERSION_1_3),
BUNDLE_CONTROL_CONVERTER),
extensionConverterRegistrator.registerMessageConvertor(
new MessageTypeKey<>(OFConstants.OFP_VERSION_1_3, BundleControlOnf.class),
BUNDLE_CONTROL_CONVERTER),
extensionConverterRegistrator.registerMessageConvertor(
new TypeVersionKey<>(BundleAddMessageSal.class, OFConstants.OFP_VERSION_1_3),
BUNDLE_ADD_MESSAGE_CONVERTER),
extensionConverterRegistrator.registerMessageConvertor(
new MessageTypeKey<>(OFConstants.OFP_VERSION_1_3, BundleAddMessageOnf.class),
BUNDLE_ADD_MESSAGE_CONVERTER));

LOG.info("ONF Extension Provider started.");
}

@PreDestroy
@Deactivate
@Override
public void close() {
registrations.forEach(Registration::close);
LOG.info("ONF Extension Provider stopped.");
}
}

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -7,52 +7,50 @@
*/
package org.opendaylight.openflowplugin.extension.onf;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoInteractions;

import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.junit.MockitoJUnitRunner;
import org.mockito.junit.jupiter.MockitoExtension;
import org.opendaylight.openflowjava.protocol.api.keys.MessageTypeKey;
import org.opendaylight.openflowjava.protocol.spi.connection.SwitchConnectionProvider;
import org.opendaylight.openflowplugin.extension.api.ExtensionConverterRegistrator;
import org.opendaylight.openflowplugin.extension.api.OpenFlowPluginExtensionRegistratorProvider;
import org.opendaylight.openflowplugin.extension.api.TypeVersionKey;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.experimenter.types.rev151020.experimenter.core.message.ExperimenterMessageOfChoice;

@RunWith(MockitoJUnitRunner.class)
public class OnfExtensionProviderTest {
import org.opendaylight.yangtools.concepts.ObjectRegistration;

@ExtendWith(MockitoExtension.class)
class OnfExtensionProviderTest {
@Mock
private SwitchConnectionProvider switchConnectionProvider;
@Mock
private OpenFlowPluginExtensionRegistratorProvider openFlowPluginExtensionRegistratorProvider;
private OpenFlowPluginExtensionRegistratorProvider ofpExtensionRegistratorProvider;
@Mock
private ExtensionConverterRegistrator extensionConverterRegistrator;

private OnfExtensionProvider onfExtensionProvider;

@Before
public void setUp() {
Mockito
.when(openFlowPluginExtensionRegistratorProvider.getExtensionConverterRegistrator())
.thenReturn(extensionConverterRegistrator);

onfExtensionProvider =
new OnfExtensionProvider(switchConnectionProvider, openFlowPluginExtensionRegistratorProvider);
}
@Mock
private ObjectRegistration<?> reg;

@Test
public void init() {
onfExtensionProvider.init();
Mockito.verify(switchConnectionProvider, Mockito.times(2))
.registerExperimenterMessageSerializer(Mockito.any(), Mockito.any());
Mockito.verify(switchConnectionProvider)
.registerExperimenterMessageDeserializer(Mockito.any(), Mockito.any());
Mockito.verify(switchConnectionProvider)
.registerErrorDeserializer(Mockito.any(), Mockito.any());
Mockito.verify(extensionConverterRegistrator, Mockito.times(2))
.registerMessageConvertor(Mockito.<TypeVersionKey<? extends ExperimenterMessageOfChoice>>any(),
Mockito.any());
void testConstruction() {
doReturn(extensionConverterRegistrator).when(ofpExtensionRegistratorProvider)
.getExtensionConverterRegistrator();
doReturn(reg).when(extensionConverterRegistrator).registerMessageConvertor(any(MessageTypeKey.class), any());
doReturn(reg).when(extensionConverterRegistrator).registerMessageConvertor(any(TypeVersionKey.class), any());

try (var prov = new OnfExtensionProvider(switchConnectionProvider, ofpExtensionRegistratorProvider)) {
verify(switchConnectionProvider, times(2)).registerExperimenterMessageSerializer(any(), any());
verify(switchConnectionProvider).registerExperimenterMessageDeserializer(any(), any());
verify(switchConnectionProvider).registerErrorDeserializer(any(), any());
verify(extensionConverterRegistrator, times(2)).registerMessageConvertor(any(MessageTypeKey.class), any());
verify(extensionConverterRegistrator, times(2)).registerMessageConvertor(any(TypeVersionKey.class), any());
verifyNoInteractions(reg);
}

verify(reg, times(4)).close();
}

}
}

0 comments on commit 5127f27

Please sign in to comment.