import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyCollection;
import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.ArgumentMatchers.isNull;
import static org.mockito.Mockito.after;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
-import com.google.common.collect.HashMultimap;
+import com.google.common.collect.ImmutableMultimap;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import java.util.concurrent.Executors;
import org.junit.Test;
import org.mockito.ArgumentCaptor;
-import org.opendaylight.mdsal.dom.api.DOMActionService;
import org.opendaylight.mdsal.dom.api.DOMNotification;
import org.opendaylight.mdsal.dom.api.DOMRpcResult;
-import org.opendaylight.mdsal.dom.api.DOMRpcService;
import org.opendaylight.mdsal.dom.spi.DefaultDOMRpcResult;
import org.opendaylight.netconf.api.NetconfMessage;
import org.opendaylight.netconf.api.xml.XmlNetconfConstants;
import org.opendaylight.netconf.api.xml.XmlUtil;
-import org.opendaylight.netconf.sal.connect.api.MessageTransformer;
import org.opendaylight.netconf.sal.connect.api.NetconfDeviceSchemasResolver;
import org.opendaylight.netconf.sal.connect.api.RemoteDeviceHandler;
+import org.opendaylight.netconf.sal.connect.api.RemoteDeviceServices;
import org.opendaylight.netconf.sal.connect.netconf.listener.NetconfDeviceCapabilities;
import org.opendaylight.netconf.sal.connect.netconf.listener.NetconfDeviceCommunicator;
import org.opendaylight.netconf.sal.connect.netconf.listener.NetconfSessionPreferences;
-import org.opendaylight.netconf.sal.connect.netconf.sal.NetconfDeviceRpc;
import org.opendaylight.netconf.sal.connect.netconf.util.NetconfMessageTransformUtil;
import org.opendaylight.netconf.sal.connect.util.RemoteDeviceId;
import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.netconf.node.connection.status.available.capabilities.AvailableCapability;
-import org.opendaylight.yangtools.rfc8528.data.api.MountPointContext;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.netconf.node.connection.status.available.capabilities.AvailableCapability.CapabilityOrigin;
import org.opendaylight.yangtools.yang.common.QName;
import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
-import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
import org.opendaylight.yangtools.yang.model.api.Module;
import org.opendaylight.yangtools.yang.model.api.SchemaContext;
import org.opendaylight.yangtools.yang.model.repo.api.EffectiveModelContextFactory;
@Test
public void testNetconfDeviceFlawedModelFailedResolution() throws Exception {
- final RemoteDeviceHandler<NetconfSessionPreferences> facade = getFacade();
+ final RemoteDeviceHandler facade = getFacade();
final NetconfDeviceCommunicator listener = getListener();
final EffectiveModelContextFactory schemaFactory = getSchemaFactory();
getSessionCaps(true, Lists.newArrayList(TEST_CAPABILITY, TEST_CAPABILITY2));
device.onRemoteSessionUp(sessionCaps, listener);
- verify(facade, timeout(5000)).onDeviceConnected(any(MountPointContext.class),
- any(NetconfSessionPreferences.class), any(NetconfDeviceRpc.class), isNull());
+ verify(facade, timeout(5000)).onDeviceConnected(any(NetconfDeviceSchema.class),
+ any(NetconfSessionPreferences.class), any(RemoteDeviceServices.class));
verify(schemaFactory, times(2)).createEffectiveModelContext(anyCollection());
}
public void testNetconfDeviceFailFirstSchemaFailSecondEmpty() throws Exception {
final ArrayList<String> capList = Lists.newArrayList(TEST_CAPABILITY);
- final RemoteDeviceHandler<NetconfSessionPreferences> facade = getFacade();
+ final RemoteDeviceHandler facade = getFacade();
final NetconfDeviceCommunicator listener = getListener();
final EffectiveModelContextFactory schemaFactory = getSchemaFactory();
final SchemaRepository schemaRepository = getSchemaRepository();
// Make fallback attempt to fail due to empty resolved sources
- final SchemaResolutionException schemaResolutionException
- = new SchemaResolutionException("fail first",
- Collections.emptyList(), HashMultimap.create());
+ final SchemaResolutionException schemaResolutionException = new SchemaResolutionException("fail first",
+ List.of(), ImmutableMultimap.of());
doReturn(Futures.immediateFailedFuture(schemaResolutionException))
.when(schemaFactory).createEffectiveModelContext(anyCollection());
@Test
public void testNetconfDeviceMissingSource() throws Exception {
- final RemoteDeviceHandler<NetconfSessionPreferences> facade = getFacade();
+ final RemoteDeviceHandler facade = getFacade();
final NetconfDeviceCommunicator listener = getListener();
final EffectiveModelContextFactory schemaFactory = getSchemaFactory();
.build();
// Monitoring supported
final NetconfSessionPreferences sessionCaps =
- getSessionCaps(true, Lists.newArrayList(TEST_CAPABILITY, TEST_CAPABILITY2));
+ getSessionCaps(true, List.of(TEST_CAPABILITY, TEST_CAPABILITY2));
device.onRemoteSessionUp(sessionCaps, listener);
- verify(facade, timeout(5000)).onDeviceConnected(any(MountPointContext.class),
- any(NetconfSessionPreferences.class), any(NetconfDeviceRpc.class), isNull());
+ verify(facade, timeout(5000)).onDeviceConnected(any(NetconfDeviceSchema.class),
+ any(NetconfSessionPreferences.class), any(RemoteDeviceServices.class));
verify(schemaFactory, times(1)).createEffectiveModelContext(anyCollection());
}
@Test
public void testNotificationBeforeSchema() throws Exception {
- final RemoteDeviceHandler<NetconfSessionPreferences> facade = getFacade();
+ final RemoteDeviceHandler facade = getFacade();
final NetconfDeviceCommunicator listener = getListener();
final EffectiveModelContextFactory schemaContextProviderFactory = mock(EffectiveModelContextFactory.class);
final SettableFuture<SchemaContext> schemaFuture = SettableFuture.create();
@Test
public void testNetconfDeviceReconnect() throws Exception {
- final RemoteDeviceHandler<NetconfSessionPreferences> facade = getFacade();
+ final RemoteDeviceHandler facade = getFacade();
final NetconfDeviceCommunicator listener = getListener();
final EffectiveModelContextFactory schemaContextProviderFactory = getSchemaFactory();
verify(schemaContextProviderFactory, timeout(5000)).createEffectiveModelContext(any(Collection.class));
verify(facade, timeout(5000)).onDeviceConnected(
- any(MountPointContext.class), any(NetconfSessionPreferences.class), any(DOMRpcService.class),
- isNull());
+ any(NetconfDeviceSchema.class), any(NetconfSessionPreferences.class), any(RemoteDeviceServices.class));
device.onRemoteSessionDown();
verify(facade, timeout(5000)).onDeviceDisconnected();
verify(schemaContextProviderFactory, timeout(5000).times(2)).createEffectiveModelContext(any(Collection.class));
verify(facade, timeout(5000).times(2)).onDeviceConnected(
- any(MountPointContext.class), any(NetconfSessionPreferences.class), any(DOMRpcService.class),
- isNull());
+ any(NetconfDeviceSchema.class), any(NetconfSessionPreferences.class), any(RemoteDeviceServices.class));
}
@Test
public void testNetconfDeviceDisconnectListenerCallCancellation() throws Exception {
- final RemoteDeviceHandler<NetconfSessionPreferences> facade = getFacade();
+ final RemoteDeviceHandler facade = getFacade();
final NetconfDeviceCommunicator listener = getListener();
final EffectiveModelContextFactory schemaContextProviderFactory = mock(EffectiveModelContextFactory.class);
final SettableFuture<SchemaContext> schemaFuture = SettableFuture.create();
//complete schema setup
schemaFuture.set(SCHEMA_CONTEXT);
//facade.onDeviceDisconnected() was called, so facade.onDeviceConnected() shouldn't be called anymore
- verify(facade, after(1000).never()).onDeviceConnected(any(), any(), any(), any(DOMActionService.class));
+ verify(facade, after(1000).never()).onDeviceConnected(any(), any(), any(RemoteDeviceServices.class));
}
@Test
public void testNetconfDeviceAvailableCapabilitiesBuilding() throws Exception {
- final RemoteDeviceHandler<NetconfSessionPreferences> facade = getFacade();
+ final RemoteDeviceHandler facade = getFacade();
final NetconfDeviceCommunicator listener = getListener();
final EffectiveModelContextFactory schemaContextProviderFactory = getSchemaFactory();
final NetconfSessionPreferences sessionCaps = getSessionCaps(true,
Lists.newArrayList(TEST_NAMESPACE + "?module=" + TEST_MODULE + "&revision=" + TEST_REVISION));
- final Map<QName, AvailableCapability.CapabilityOrigin> moduleBasedCaps = new HashMap<>();
- moduleBasedCaps.putAll(sessionCaps.getModuleBasedCapsOrigin());
+ final Map<QName, CapabilityOrigin> moduleBasedCaps = new HashMap<>();
+ moduleBasedCaps.putAll(sessionCaps.moduleBasedCaps());
moduleBasedCaps
- .put(QName.create("(test:qname:side:loading)test"), AvailableCapability.CapabilityOrigin.UserDefined);
+ .put(QName.create("(test:qname:side:loading)test"), CapabilityOrigin.UserDefined);
netconfSpy.onRemoteSessionUp(sessionCaps.replaceModuleCaps(moduleBasedCaps), listener);
- final ArgumentCaptor<NetconfSessionPreferences> argument =
- ArgumentCaptor.forClass(NetconfSessionPreferences.class);
- verify(facade, timeout(5000)).onDeviceConnected(any(MountPointContext.class), argument.capture(),
- any(DOMRpcService.class), isNull());
- final NetconfDeviceCapabilities netconfDeviceCaps = argument.getValue().getNetconfDeviceCapabilities();
-
- netconfDeviceCaps.getResolvedCapabilities()
+ final ArgumentCaptor<NetconfDeviceSchema> argument = ArgumentCaptor.forClass(NetconfDeviceSchema.class);
+ verify(facade, timeout(5000)).onDeviceConnected(argument.capture(), any(NetconfSessionPreferences.class),
+ any(RemoteDeviceServices.class));
+ argument.getValue().capabilities().resolvedCapabilities()
.forEach(entry -> assertEquals("Builded 'AvailableCapability' schemas should match input capabilities.",
moduleBasedCaps.get(
QName.create(entry.getCapability())).getName(), entry.getCapabilityOrigin().getName()));
@Test
public void testNetconfDeviceNotificationsModelNotPresentWithCapability() throws Exception {
- final RemoteDeviceHandler<NetconfSessionPreferences> facade = getFacade();
+ final RemoteDeviceHandler facade = getFacade();
final NetconfDeviceCommunicator listener = getListener();
final EffectiveModelContextFactory schemaContextProviderFactory = getSchemaFactory();
netconfSpy.onRemoteSessionUp(sessionCaps, listener);
- final ArgumentCaptor<NetconfSessionPreferences> argument =
- ArgumentCaptor.forClass(NetconfSessionPreferences.class);
- verify(facade, timeout(5000)).onDeviceConnected(any(MountPointContext.class), argument.capture(),
- any(DOMRpcService.class), isNull());
+ final ArgumentCaptor<NetconfDeviceSchema> argument = ArgumentCaptor.forClass(NetconfDeviceSchema.class);
+ verify(facade, timeout(5000)).onDeviceConnected(argument.capture(), any(NetconfSessionPreferences.class),
+ any(RemoteDeviceServices.class));
List<String> notificationModulesName = Arrays.asList(
org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.notification._1._0.rev080714
org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715
.$YangModuleInfoImpl.getInstance().getName().toString());
- final Set<AvailableCapability> resolvedCapabilities = argument.getValue().getNetconfDeviceCapabilities()
- .getResolvedCapabilities();
+ final Set<AvailableCapability> resolvedCapabilities = argument.getValue().capabilities().resolvedCapabilities();
assertEquals(2, resolvedCapabilities.size());
assertTrue(resolvedCapabilities.stream().anyMatch(entry -> notificationModulesName
@Test
public void testNetconfDeviceNotificationsCapabilityIsNotPresent() throws Exception {
- final RemoteDeviceHandler<NetconfSessionPreferences> facade = getFacade();
+ final RemoteDeviceHandler facade = getFacade();
final NetconfDeviceCommunicator listener = getListener();
final EffectiveModelContextFactory schemaContextProviderFactory = getSchemaFactory();
netconfSpy.onRemoteSessionUp(sessionCaps, listener);
- final ArgumentCaptor<NetconfSessionPreferences> argument =
- ArgumentCaptor.forClass(NetconfSessionPreferences.class);
- verify(facade, timeout(5000)).onDeviceConnected(any(MountPointContext.class), argument.capture(),
- any(DOMRpcService.class), isNull());
- final NetconfDeviceCapabilities netconfDeviceCaps = argument.getValue().getNetconfDeviceCapabilities();
+ final ArgumentCaptor<NetconfDeviceSchema> argument = ArgumentCaptor.forClass(NetconfDeviceSchema.class);
+ verify(facade, timeout(5000)).onDeviceConnected(argument.capture(), any(NetconfSessionPreferences.class),
+ any(RemoteDeviceServices.class));
+ final NetconfDeviceCapabilities netconfDeviceCaps = argument.getValue().capabilities();
- List<String> notificationModulesName = Arrays.asList(
+ List<String> notificationModulesName = List.of(
org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.notification._1._0.rev080714
.$YangModuleInfoImpl.getInstance().getName().toString(),
org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715
.$YangModuleInfoImpl.getInstance().getName().toString());
- assertFalse(netconfDeviceCaps.getResolvedCapabilities().stream().anyMatch(entry -> notificationModulesName
- .contains(entry.getCapability())));
+ assertFalse(netconfDeviceCaps.resolvedCapabilities().stream()
+ .anyMatch(entry -> notificationModulesName.contains(entry.getCapability())));
}
@Test
public void testNetconfDeviceNotificationsModelIsPresent() throws Exception {
- final RemoteDeviceHandler<NetconfSessionPreferences> facade = getFacade();
+ final RemoteDeviceHandler facade = getFacade();
final NetconfDeviceCommunicator listener = getListener();
final EffectiveModelContextFactory schemaContextProviderFactory = getSchemaFactory();
final NetconfSessionPreferences sessionCaps = getSessionCaps(false, Collections.emptyList());
- final Map<QName, AvailableCapability.CapabilityOrigin> moduleBasedCaps = new HashMap<>();
+ final Map<QName, CapabilityOrigin> moduleBasedCaps = new HashMap<>();
moduleBasedCaps.put(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.notification._1._0.rev080714
.$YangModuleInfoImpl.getInstance().getName(),
- AvailableCapability.CapabilityOrigin.DeviceAdvertised);
+ CapabilityOrigin.DeviceAdvertised);
moduleBasedCaps.put(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715
.$YangModuleInfoImpl.getInstance().getName(),
- AvailableCapability.CapabilityOrigin.DeviceAdvertised);
+ CapabilityOrigin.DeviceAdvertised);
netconfSpy.onRemoteSessionUp(sessionCaps.replaceModuleCaps(moduleBasedCaps), listener);
- final ArgumentCaptor<NetconfSessionPreferences> argument =
- ArgumentCaptor.forClass(NetconfSessionPreferences.class);
- verify(facade, timeout(5000)).onDeviceConnected(any(MountPointContext.class), argument.capture(),
- any(DOMRpcService.class), isNull());
- final Set<AvailableCapability> resolvedCapabilities = argument.getValue().getNetconfDeviceCapabilities()
- .getResolvedCapabilities();
+ final ArgumentCaptor<NetconfDeviceSchema> argument = ArgumentCaptor.forClass(NetconfDeviceSchema.class);
+ verify(facade, timeout(5000)).onDeviceConnected(argument.capture(), any(NetconfSessionPreferences.class),
+ any(RemoteDeviceServices.class));
+ final Set<AvailableCapability> resolvedCapabilities = argument.getValue().capabilities().resolvedCapabilities();
- List<String> notificationModulesName = Arrays.asList(
+ List<String> notificationModulesName = List.of(
org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.notification._1._0.rev080714
.$YangModuleInfoImpl.getInstance().getName().toString(),
org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715
return schemaFactory;
}
- private static RemoteDeviceHandler<NetconfSessionPreferences> getFacade() throws Exception {
- final RemoteDeviceHandler<NetconfSessionPreferences> remoteDeviceHandler =
- mockCloseableClass(RemoteDeviceHandler.class);
+ private static RemoteDeviceHandler getFacade() throws Exception {
+ final RemoteDeviceHandler remoteDeviceHandler = mockCloseableClass(RemoteDeviceHandler.class);
doNothing().when(remoteDeviceHandler).onDeviceConnected(
- any(MountPointContext.class), any(NetconfSessionPreferences.class), any(NetconfDeviceRpc.class),
- any(DOMActionService.class));
+ any(NetconfDeviceSchema.class), any(NetconfSessionPreferences.class), any(RemoteDeviceServices.class));
doNothing().when(remoteDeviceHandler).onDeviceDisconnected();
doNothing().when(remoteDeviceHandler).onNotification(any(DOMNotification.class));
return remoteDeviceHandler;
return MoreExecutors.listeningDecorator(Executors.newSingleThreadExecutor());
}
- public MessageTransformer<NetconfMessage> getMessageTransformer() throws Exception {
- final MessageTransformer<NetconfMessage> messageTransformer = mockClass(MessageTransformer.class);
- doReturn(NOTIFICATION).when(messageTransformer).toRpcRequest(any(QName.class), any(NormalizedNode.class));
- doReturn(RPC_RESULT).when(messageTransformer).toRpcResult(any(NetconfMessage.class), any(QName.class));
- doReturn(COMPOSITE_NODE).when(messageTransformer).toNotification(any(NetconfMessage.class));
- return messageTransformer;
- }
-
public NetconfSessionPreferences getSessionCaps(final boolean addMonitor,
final Collection<String> additionalCapabilities) {
final ArrayList<String> capabilities = Lists.newArrayList(