import org.opendaylight.netconf.sal.connect.netconf.NetconfStateSchemas;
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.listener.UserPrefenreces;
import org.opendaylight.netconf.sal.connect.netconf.sal.KeepaliveSalFacade;
import org.opendaylight.netconf.sal.connect.netconf.sal.NetconfDeviceSalFacade;
import org.opendaylight.netconf.sal.connect.util.RemoteDeviceId;
new NetconfDevice(schemaResourcesDTO, id, salFacade, globalProcessingExecutor, getReconnectOnChangedSchema());
final NetconfDeviceCommunicator listener = userCapabilities.isPresent() ?
- new NetconfDeviceCommunicator(id, device, userCapabilities.get()) : new NetconfDeviceCommunicator(id, device);
+ new NetconfDeviceCommunicator(id, device,
+ new UserPrefenreces(userCapabilities.get(), getYangModuleCapabilities().getOverride())):
+ new NetconfDeviceCommunicator(id, device);
if (shouldSendKeepalive()) {
((KeepaliveSalFacade) salFacade).setListener(listener);
private static final Logger LOG = LoggerFactory.getLogger(NetconfDeviceCommunicator.class);
protected final RemoteDevice<NetconfSessionPreferences, NetconfMessage, NetconfDeviceCommunicator> remoteDevice;
- private final Optional<NetconfSessionPreferences> overrideNetconfCapabilities;
+ private final Optional<UserPrefenreces> overrideNetconfCapabilities;
protected final RemoteDeviceId id;
private final Lock sessionLock = new ReentrantLock();
private SettableFuture<NetconfDeviceCapabilities> firstConnectionFuture;
public NetconfDeviceCommunicator(final RemoteDeviceId id, final RemoteDevice<NetconfSessionPreferences, NetconfMessage, NetconfDeviceCommunicator> remoteDevice,
- final NetconfSessionPreferences NetconfSessionPreferences) {
+ final UserPrefenreces NetconfSessionPreferences) {
this(id, remoteDevice, Optional.of(NetconfSessionPreferences));
}
public NetconfDeviceCommunicator(final RemoteDeviceId id,
final RemoteDevice<NetconfSessionPreferences, NetconfMessage, NetconfDeviceCommunicator> remoteDevice) {
- this(id, remoteDevice, Optional.<NetconfSessionPreferences>absent());
+ this(id, remoteDevice, Optional.<UserPrefenreces>absent());
}
private NetconfDeviceCommunicator(final RemoteDeviceId id, final RemoteDevice<NetconfSessionPreferences, NetconfMessage, NetconfDeviceCommunicator> remoteDevice,
- final Optional<NetconfSessionPreferences> overrideNetconfCapabilities) {
+ final Optional<UserPrefenreces> overrideNetconfCapabilities) {
this.id = id;
this.remoteDevice = remoteDevice;
this.overrideNetconfCapabilities = overrideNetconfCapabilities;
netconfSessionPreferences);
if(overrideNetconfCapabilities.isPresent()) {
- netconfSessionPreferences = netconfSessionPreferences.addModuleCaps(overrideNetconfCapabilities.get());
+ netconfSessionPreferences = overrideNetconfCapabilities.get().isOverride() ?
+ netconfSessionPreferences.replaceModuleCaps(overrideNetconfCapabilities.get().getSessionPreferences()) :
+ netconfSessionPreferences.addModuleCaps(overrideNetconfCapabilities.get().getSessionPreferences());
LOG.debug(
"{}: Session capabilities overridden, capabilities that will be used: {}",
id, netconfSessionPreferences);
private final Set<QName> moduleBasedCaps;
private final Set<String> nonModuleCaps;
- private NetconfSessionPreferences(final Set<String> nonModuleCaps, final Set<QName> moduleBasedCaps) {
+ NetconfSessionPreferences(final Set<String> nonModuleCaps, final Set<QName> moduleBasedCaps) {
this.nonModuleCaps = Preconditions.checkNotNull(nonModuleCaps);
this.moduleBasedCaps = Preconditions.checkNotNull(moduleBasedCaps);
}
|| containsNonModuleCapability(NetconfMessageTransformUtil.IETF_NETCONF_MONITORING.getNamespace().toString());
}
+ /**
+ * Merge module-based list of capabilities with current list of module-based capabilities
+ *
+ * @param netconfSessionModuleCapabilities capabilities to merge into this
+ *
+ * @return new instance of preferences with merged module-based capabilities
+ */
public NetconfSessionPreferences addModuleCaps(final NetconfSessionPreferences netconfSessionModuleCapabilities) {
final HashSet<QName> mergedCaps = Sets.newHashSetWithExpectedSize(moduleBasedCaps.size() + netconfSessionModuleCapabilities.getModuleBasedCaps().size());
mergedCaps.addAll(moduleBasedCaps);
return new NetconfSessionPreferences(getNonModuleCaps(), mergedCaps);
}
+ /**
+ * Override current list of module-based capabilities
+ *
+ * @param netconfSessionPreferences capabilities to override in this
+ *
+ * @return new instance of preferences with replaced module-based capabilities
+ */
+ public NetconfSessionPreferences replaceModuleCaps(final NetconfSessionPreferences netconfSessionPreferences) {
+ return new NetconfSessionPreferences(getNonModuleCaps(), netconfSessionPreferences.getModuleBasedCaps());
+ }
+
public static NetconfSessionPreferences fromNetconfSession(final NetconfClientSession session) {
return fromStrings(session.getServerCapabilities());
}
--- /dev/null
+/*
+ * Copyright (c) 2016 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.netconf.sal.connect.netconf.listener;
+
+import javax.annotation.Nonnull;
+
+/**
+ * DTO with user capabilities to override or merge with device specific capabilities
+ */
+public class UserPrefenreces {
+
+ private final NetconfSessionPreferences sessionPreferences;
+ private final boolean override;
+
+ public UserPrefenreces(@Nonnull final NetconfSessionPreferences sessionPreferences, boolean override) {
+ this.sessionPreferences = sessionPreferences;
+ this.override = override;
+ }
+
+ public NetconfSessionPreferences getSessionPreferences() {
+ return sessionPreferences;
+ }
+
+ public boolean isOverride() {
+ return override;
+ }
+
+ @Override
+ public String toString() {
+ final StringBuffer sb = new StringBuffer("UserPrefenreces{");
+ sb.append("sessionPreferences=").append(sessionPreferences);
+ sb.append(", override=").append(override);
+ sb.append('}');
+ return sb.toString();
+ }
+}
}
container yang-module-capabilities {
+ leaf override {
+ type boolean;
+ default false;
+ description "Whether to override or merge this list of capabilities with capabilities from device";
+ }
+
leaf-list capability {
type string;
description "Set a list of capabilities to override capabilities provided in device's hello message.
assertThat(merged.getNonModuleCaps(), hasItem("urn:ietf:params:netconf:capability:rollback-on-error:1.0"));
}
+ @Test
+ public void testReplace() throws Exception {
+ final List<String> caps1 = Lists.newArrayList(
+ "namespace:1?module=module1&revision=2012-12-12",
+ "namespace:2?module=module2&revision=2012-12-12",
+ "urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring?module=ietf-netconf-monitoring&revision=2010-10-04",
+ "urn:ietf:params:netconf:base:1.0",
+ "urn:ietf:params:netconf:capability:rollback-on-error:1.0"
+ );
+ final NetconfSessionPreferences sessionCaps1 = NetconfSessionPreferences.fromStrings(caps1);
+ assertCaps(sessionCaps1, 2, 3);
+
+ final List<String> caps2 = Lists.newArrayList(
+ "namespace:3?module=module3&revision=2012-12-12",
+ "namespace:4?module=module4&revision=2012-12-12",
+ "randomNonModuleCap"
+ );
+ final NetconfSessionPreferences sessionCaps2 = NetconfSessionPreferences.fromStrings(caps2);
+ assertCaps(sessionCaps2, 1, 2);
+
+ final NetconfSessionPreferences replaced = sessionCaps1.replaceModuleCaps(sessionCaps2);
+ assertCaps(replaced, 2, 2);
+ }
+
@Test
public void testCapabilityNoRevision() throws Exception {
final List<String> caps1 = Lists.newArrayList(