- /**
- * Schema building callable.
- */
- private static class DeviceSourcesResolver implements Callable<DeviceSources> {
-
- private final NetconfDeviceRpc deviceRpc;
- private final NetconfSessionPreferences remoteSessionCapabilities;
- private final RemoteDeviceId id;
- private final NetconfDeviceSchemasResolver stateSchemasResolver;
- private final SchemaContext schemaContext;
-
- DeviceSourcesResolver(final NetconfDeviceRpc deviceRpc,
- final NetconfSessionPreferences remoteSessionCapabilities,
- final RemoteDeviceId id, final NetconfDeviceSchemasResolver stateSchemasResolver,
- final SchemaContext schemaContext) {
- this.deviceRpc = deviceRpc;
- this.remoteSessionCapabilities = remoteSessionCapabilities;
- this.id = id;
- this.stateSchemasResolver = stateSchemasResolver;
- this.schemaContext = schemaContext;
- }
-
- DeviceSourcesResolver(final NetconfSessionPreferences remoteSessionCapabilities, final RemoteDeviceId id,
- final NetconfDeviceSchemasResolver stateSchemasResolver,
- final NetconfDeviceRpc rpcForMonitoring, final SchemaContext schemaCtx) {
- this(rpcForMonitoring, remoteSessionCapabilities, id, stateSchemasResolver, schemaCtx);
- }
-
- @Override
- public DeviceSources call() {
- final NetconfDeviceSchemas availableSchemas =
- stateSchemasResolver.resolve(deviceRpc, remoteSessionCapabilities, id, schemaContext);
- LOG.debug("{}: Schemas exposed by ietf-netconf-monitoring: {}", id,
- availableSchemas.getAvailableYangSchemasQNames());
-
- final Set<QName> requiredSources = Sets.newHashSet(remoteSessionCapabilities.getModuleBasedCaps());
- final Set<QName> providedSources = availableSchemas.getAvailableYangSchemasQNames();
-
- final Set<QName> requiredSourcesNotProvided = Sets.difference(requiredSources, providedSources);
- if (!requiredSourcesNotProvided.isEmpty()) {
- LOG.warn("{}: Netconf device does not provide all yang models reported in hello message capabilities,"
- + " required but not provided: {}", id, requiredSourcesNotProvided);
- LOG.warn("{}: Attempting to build schema context from required sources", id);
- }
-
- // Here all the sources reported in netconf monitoring are merged with those reported in hello.
- // It is necessary to perform this since submodules are not mentioned in hello but still required.
- // This clashes with the option of a user to specify supported yang models manually in configuration
- // for netconf-connector and as a result one is not able to fully override yang models of a device.
- // It is only possible to add additional models.
- final Set<QName> providedSourcesNotRequired = Sets.difference(providedSources, requiredSources);
- if (!providedSourcesNotRequired.isEmpty()) {
- LOG.warn("{}: Netconf device provides additional yang models not reported in "
- + "hello message capabilities: {}", id, providedSourcesNotRequired);
- LOG.warn("{}: Adding provided but not required sources as required to prevent failures", id);
- LOG.debug("{}: Netconf device reported in hello: {}", id, requiredSources);
- requiredSources.addAll(providedSourcesNotRequired);
- }
-
- final SchemaSourceProvider<YangTextSchemaSource> sourceProvider;
- if (availableSchemas instanceof LibraryModulesSchemas) {
- sourceProvider = new YangLibrarySchemaYangSourceProvider(id,
- ((LibraryModulesSchemas) availableSchemas).getAvailableModels());
- } else {
- sourceProvider = new NetconfRemoteSchemaYangSourceProvider(id, deviceRpc);
- }
-
- return new DeviceSources(requiredSources, providedSources, sourceProvider);
- }
- }
-
- /**
- * Contains RequiredSources - sources from capabilities.
- */
- private static final class DeviceSources {
- private final Set<QName> requiredSources;
- private final Set<QName> providedSources;
- private final SchemaSourceProvider<YangTextSchemaSource> sourceProvider;
-
- DeviceSources(final Set<QName> requiredSources, final Set<QName> providedSources,
- final SchemaSourceProvider<YangTextSchemaSource> sourceProvider) {
- this.requiredSources = requiredSources;
- this.providedSources = providedSources;
- this.sourceProvider = sourceProvider;
- }
-
- public Set<QName> getRequiredSourcesQName() {
- return requiredSources;
- }
-
- public Set<QName> getProvidedSourcesQName() {
- return providedSources;
- }
-
- public Collection<SourceIdentifier> getRequiredSources() {
- return Collections2.transform(requiredSources, DeviceSources::toSourceId);
- }
-
- public Collection<SourceIdentifier> getProvidedSources() {
- return Collections2.transform(providedSources, DeviceSources::toSourceId);
- }
-
- public SchemaSourceProvider<YangTextSchemaSource> getSourceProvider() {
- return sourceProvider;
- }
-
- private static SourceIdentifier toSourceId(final QName input) {
- return RevisionSourceIdentifier.create(input.getLocalName(), input.getRevision());
- }
- }
-