Search in sources :

Example 1 with SchemaSourceRegistration

use of org.opendaylight.yangtools.yang.model.repo.spi.SchemaSourceRegistration in project netconf by opendaylight.

the class AbstractNetconfTopology method registerDeviceSchemaSources.

private List<SchemaSourceRegistration<?>> registerDeviceSchemaSources(final RemoteDeviceId remoteDeviceId, final NetconfNode node, final SchemaResourcesDTO resources) {
    final YangLibrary yangLibrary = node.getYangLibrary();
    if (yangLibrary != null) {
        final Uri uri = yangLibrary.getYangLibraryUrl();
        if (uri != null) {
            final List<SchemaSourceRegistration<?>> registrations = new ArrayList<>();
            final String yangLibURL = uri.getValue();
            final SchemaSourceRegistry schemaRegistry = resources.getSchemaRegistry();
            // pre register yang library sources as fallback schemas to schema registry
            final LibraryModulesSchemas schemas;
            final String yangLibUsername = yangLibrary.getUsername();
            final String yangLigPassword = yangLibrary.getPassword();
            if (yangLibUsername != null && yangLigPassword != null) {
                schemas = LibraryModulesSchemas.create(yangLibURL, yangLibUsername, yangLigPassword);
            } else {
                schemas = LibraryModulesSchemas.create(yangLibURL);
            }
            for (final Map.Entry<SourceIdentifier, URL> entry : schemas.getAvailableModels().entrySet()) {
                registrations.add(schemaRegistry.registerSchemaSource(new YangLibrarySchemaYangSourceProvider(remoteDeviceId, schemas.getAvailableModels()), PotentialSchemaSource.create(entry.getKey(), YangTextSchemaSource.class, PotentialSchemaSource.Costs.REMOTE_IO.getValue())));
            }
            return List.copyOf(registrations);
        }
    }
    return List.of();
}
Also used : YangLibrarySchemaYangSourceProvider(org.opendaylight.netconf.sal.connect.netconf.schema.YangLibrarySchemaYangSourceProvider) ArrayList(java.util.ArrayList) SourceIdentifier(org.opendaylight.yangtools.yang.model.repo.api.SourceIdentifier) YangLibrary(org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.netconf.schema.storage.YangLibrary) Uri(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Uri) URL(java.net.URL) LibraryModulesSchemas(org.opendaylight.netconf.sal.connect.netconf.LibraryModulesSchemas) SchemaSourceRegistration(org.opendaylight.yangtools.yang.model.repo.spi.SchemaSourceRegistration) SchemaSourceRegistry(org.opendaylight.yangtools.yang.model.repo.spi.SchemaSourceRegistry) Map(java.util.Map) HashMap(java.util.HashMap)

Example 2 with SchemaSourceRegistration

use of org.opendaylight.yangtools.yang.model.repo.spi.SchemaSourceRegistration in project netconf by opendaylight.

the class AbstractNetconfTopology method createDeviceCommunicator.

protected NetconfConnectorDTO createDeviceCommunicator(final NodeId nodeId, final NetconfNode node, final NetconfNodeAugmentedOptional nodeOptional) {
    final Host host = node.getHost();
    final IpAddress ipAddress = host.getIpAddress();
    final InetSocketAddress address;
    if (ipAddress != null) {
        address = new InetSocketAddress(IetfInetUtil.INSTANCE.inetAddressFor(ipAddress), node.getPort().getValue().toJava());
    } else {
        address = new InetSocketAddress(host.getDomainName().getValue(), node.getPort().getValue().toJava());
    }
    final RemoteDeviceId remoteDeviceId = new RemoteDeviceId(nodeId.getValue(), address);
    final long keepaliveDelay = node.requireKeepaliveDelay().toJava();
    RemoteDeviceHandler<NetconfSessionPreferences> salFacade = createSalFacade(remoteDeviceId);
    if (keepaliveDelay > 0) {
        LOG.info("Adding keepalive facade, for device {}", nodeId);
        salFacade = new KeepaliveSalFacade(remoteDeviceId, salFacade, this.keepaliveExecutor.getExecutor(), keepaliveDelay, node.requireDefaultRequestTimeoutMillis().toJava());
    }
    final RemoteDevice<NetconfSessionPreferences, NetconfMessage, NetconfDeviceCommunicator> device;
    final List<SchemaSourceRegistration<?>> yanglibRegistrations;
    if (node.requireSchemaless()) {
        device = new SchemalessNetconfDevice(baseSchemas, remoteDeviceId, salFacade);
        yanglibRegistrations = List.of();
    } else {
        final boolean reconnectOnChangedSchema = node.requireReconnectOnChangedSchema();
        final SchemaResourcesDTO resources = schemaManager.getSchemaResources(node, nodeId.getValue());
        device = new NetconfDeviceBuilder().setReconnectOnSchemasChange(reconnectOnChangedSchema).setSchemaResourcesDTO(resources).setGlobalProcessingExecutor(this.processingExecutor).setId(remoteDeviceId).setSalFacade(salFacade).setNode(node).setEventExecutor(eventExecutor).setNodeOptional(nodeOptional).setDeviceActionFactory(deviceActionFactory).setBaseSchemas(baseSchemas).build();
        yanglibRegistrations = registerDeviceSchemaSources(remoteDeviceId, node, resources);
    }
    final Optional<UserPreferences> userCapabilities = getUserCapabilities(node);
    final int rpcMessageLimit = node.requireConcurrentRpcLimit().toJava();
    if (rpcMessageLimit < 1) {
        LOG.info("Concurrent rpc limit is smaller than 1, no limit will be enforced for device {}", remoteDeviceId);
    }
    final NetconfDeviceCommunicator netconfDeviceCommunicator = userCapabilities.isPresent() ? new NetconfDeviceCommunicator(remoteDeviceId, device, userCapabilities.get(), rpcMessageLimit) : new NetconfDeviceCommunicator(remoteDeviceId, device, rpcMessageLimit);
    if (salFacade instanceof KeepaliveSalFacade) {
        ((KeepaliveSalFacade) salFacade).setListener(netconfDeviceCommunicator);
    }
    return new NetconfConnectorDTO(netconfDeviceCommunicator, salFacade, yanglibRegistrations);
}
Also used : UserPreferences(org.opendaylight.netconf.sal.connect.netconf.listener.UserPreferences) NetconfDeviceCommunicator(org.opendaylight.netconf.sal.connect.netconf.listener.NetconfDeviceCommunicator) InetSocketAddress(java.net.InetSocketAddress) KeepaliveSalFacade(org.opendaylight.netconf.sal.connect.netconf.sal.KeepaliveSalFacade) Host(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Host) NetconfSessionPreferences(org.opendaylight.netconf.sal.connect.netconf.listener.NetconfSessionPreferences) SchemaResourcesDTO(org.opendaylight.netconf.sal.connect.netconf.NetconfDevice.SchemaResourcesDTO) RemoteDeviceId(org.opendaylight.netconf.sal.connect.util.RemoteDeviceId) NetconfDeviceBuilder(org.opendaylight.netconf.sal.connect.netconf.NetconfDeviceBuilder) NetconfMessage(org.opendaylight.netconf.api.NetconfMessage) SchemaSourceRegistration(org.opendaylight.yangtools.yang.model.repo.spi.SchemaSourceRegistration) IpAddress(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress) SchemalessNetconfDevice(org.opendaylight.netconf.sal.connect.netconf.SchemalessNetconfDevice)

Example 3 with SchemaSourceRegistration

use of org.opendaylight.yangtools.yang.model.repo.spi.SchemaSourceRegistration in project netconf by opendaylight.

the class RemoteDeviceConnectorImpl method createDeviceCommunicator.

@VisibleForTesting
NetconfConnectorDTO createDeviceCommunicator(final NodeId nodeId, final NetconfNode node, final RemoteDeviceHandler<NetconfSessionPreferences> deviceHandler) {
    // setup default values since default value is not supported in mdsal
    final long defaultRequestTimeoutMillis = node.getDefaultRequestTimeoutMillis() == null ? NetconfTopologyUtils.DEFAULT_REQUEST_TIMEOUT_MILLIS : node.getDefaultRequestTimeoutMillis().toJava();
    final long keepaliveDelay = node.getKeepaliveDelay() == null ? NetconfTopologyUtils.DEFAULT_KEEPALIVE_DELAY : node.getKeepaliveDelay().toJava();
    final boolean reconnectOnChangedSchema = node.getReconnectOnChangedSchema() == null ? NetconfTopologyUtils.DEFAULT_RECONNECT_ON_CHANGED_SCHEMA : node.getReconnectOnChangedSchema();
    RemoteDeviceHandler<NetconfSessionPreferences> salFacade = requireNonNull(deviceHandler);
    if (keepaliveDelay > 0) {
        LOG.info("{}: Adding keepalive facade.", remoteDeviceId);
        salFacade = new KeepaliveSalFacade(remoteDeviceId, salFacade, netconfTopologyDeviceSetup.getKeepaliveExecutor(), keepaliveDelay, defaultRequestTimeoutMillis);
    }
    final NetconfDevice.SchemaResourcesDTO schemaResourcesDTO = netconfTopologyDeviceSetup.getSchemaResourcesDTO();
    // pre register yang library sources as fallback schemas to schema registry
    final List<SchemaSourceRegistration<?>> registeredYangLibSources = new ArrayList<>();
    if (node.getYangLibrary() != null) {
        final String yangLibURL = node.getYangLibrary().getYangLibraryUrl().getValue();
        final String yangLibUsername = node.getYangLibrary().getUsername();
        final String yangLigPassword = node.getYangLibrary().getPassword();
        final LibraryModulesSchemas libraryModulesSchemas;
        if (yangLibURL != null) {
            if (yangLibUsername != null && yangLigPassword != null) {
                libraryModulesSchemas = LibraryModulesSchemas.create(yangLibURL, yangLibUsername, yangLigPassword);
            } else {
                libraryModulesSchemas = LibraryModulesSchemas.create(yangLibURL);
            }
            for (final Map.Entry<SourceIdentifier, URL> sourceIdentifierURLEntry : libraryModulesSchemas.getAvailableModels().entrySet()) {
                registeredYangLibSources.add(schemaResourcesDTO.getSchemaRegistry().registerSchemaSource(new YangLibrarySchemaYangSourceProvider(remoteDeviceId, libraryModulesSchemas.getAvailableModels()), PotentialSchemaSource.create(sourceIdentifierURLEntry.getKey(), YangTextSchemaSource.class, PotentialSchemaSource.Costs.REMOTE_IO.getValue())));
            }
        }
    }
    final RemoteDevice<NetconfSessionPreferences, NetconfMessage, NetconfDeviceCommunicator> device;
    if (node.getSchemaless()) {
        device = new SchemalessNetconfDevice(netconfTopologyDeviceSetup.getBaseSchemas(), remoteDeviceId, salFacade);
    } else {
        device = new NetconfDeviceBuilder().setReconnectOnSchemasChange(reconnectOnChangedSchema).setSchemaResourcesDTO(schemaResourcesDTO).setGlobalProcessingExecutor(netconfTopologyDeviceSetup.getProcessingExecutor()).setBaseSchemas(netconfTopologyDeviceSetup.getBaseSchemas()).setId(remoteDeviceId).setDeviceActionFactory(deviceActionFactory).setSalFacade(salFacade).build();
    }
    final Optional<NetconfSessionPreferences> userCapabilities = getUserCapabilities(node);
    final int rpcMessageLimit = node.getConcurrentRpcLimit() == null ? NetconfTopologyUtils.DEFAULT_CONCURRENT_RPC_LIMIT : node.getConcurrentRpcLimit().toJava();
    if (rpcMessageLimit < 1) {
        LOG.info("{}: Concurrent rpc limit is smaller than 1, no limit will be enforced.", remoteDeviceId);
    }
    NetconfDeviceCommunicator netconfDeviceCommunicator = userCapabilities.isPresent() ? new NetconfDeviceCommunicator(remoteDeviceId, device, new UserPreferences(userCapabilities.get(), node.getYangModuleCapabilities() == null ? false : node.getYangModuleCapabilities().getOverride(), node.getNonModuleCapabilities() == null ? false : node.getNonModuleCapabilities().getOverride()), rpcMessageLimit) : new NetconfDeviceCommunicator(remoteDeviceId, device, rpcMessageLimit);
    if (salFacade instanceof KeepaliveSalFacade) {
        ((KeepaliveSalFacade) salFacade).setListener(netconfDeviceCommunicator);
    }
    return new NetconfConnectorDTO(netconfDeviceCommunicator, salFacade, registeredYangLibSources);
}
Also used : UserPreferences(org.opendaylight.netconf.sal.connect.netconf.listener.UserPreferences) ArrayList(java.util.ArrayList) KeepaliveSalFacade(org.opendaylight.netconf.sal.connect.netconf.sal.KeepaliveSalFacade) NetconfSessionPreferences(org.opendaylight.netconf.sal.connect.netconf.listener.NetconfSessionPreferences) URL(java.net.URL) NetconfDevice(org.opendaylight.netconf.sal.connect.netconf.NetconfDevice) SchemalessNetconfDevice(org.opendaylight.netconf.sal.connect.netconf.SchemalessNetconfDevice) NetconfDeviceCommunicator(org.opendaylight.netconf.sal.connect.netconf.listener.NetconfDeviceCommunicator) YangLibrarySchemaYangSourceProvider(org.opendaylight.netconf.sal.connect.netconf.schema.YangLibrarySchemaYangSourceProvider) SourceIdentifier(org.opendaylight.yangtools.yang.model.repo.api.SourceIdentifier) NetconfConnectorDTO(org.opendaylight.netconf.topology.spi.NetconfConnectorDTO) NetconfDeviceBuilder(org.opendaylight.netconf.sal.connect.netconf.NetconfDeviceBuilder) NetconfMessage(org.opendaylight.netconf.api.NetconfMessage) LibraryModulesSchemas(org.opendaylight.netconf.sal.connect.netconf.LibraryModulesSchemas) SchemaSourceRegistration(org.opendaylight.yangtools.yang.model.repo.spi.SchemaSourceRegistration) SchemalessNetconfDevice(org.opendaylight.netconf.sal.connect.netconf.SchemalessNetconfDevice) Map(java.util.Map) VisibleForTesting(com.google.common.annotations.VisibleForTesting)

Aggregations

SchemaSourceRegistration (org.opendaylight.yangtools.yang.model.repo.spi.SchemaSourceRegistration)3 URL (java.net.URL)2 ArrayList (java.util.ArrayList)2 Map (java.util.Map)2 NetconfMessage (org.opendaylight.netconf.api.NetconfMessage)2 LibraryModulesSchemas (org.opendaylight.netconf.sal.connect.netconf.LibraryModulesSchemas)2 NetconfDeviceBuilder (org.opendaylight.netconf.sal.connect.netconf.NetconfDeviceBuilder)2 SchemalessNetconfDevice (org.opendaylight.netconf.sal.connect.netconf.SchemalessNetconfDevice)2 NetconfDeviceCommunicator (org.opendaylight.netconf.sal.connect.netconf.listener.NetconfDeviceCommunicator)2 NetconfSessionPreferences (org.opendaylight.netconf.sal.connect.netconf.listener.NetconfSessionPreferences)2 UserPreferences (org.opendaylight.netconf.sal.connect.netconf.listener.UserPreferences)2 KeepaliveSalFacade (org.opendaylight.netconf.sal.connect.netconf.sal.KeepaliveSalFacade)2 YangLibrarySchemaYangSourceProvider (org.opendaylight.netconf.sal.connect.netconf.schema.YangLibrarySchemaYangSourceProvider)2 SourceIdentifier (org.opendaylight.yangtools.yang.model.repo.api.SourceIdentifier)2 VisibleForTesting (com.google.common.annotations.VisibleForTesting)1 InetSocketAddress (java.net.InetSocketAddress)1 HashMap (java.util.HashMap)1 NetconfDevice (org.opendaylight.netconf.sal.connect.netconf.NetconfDevice)1 SchemaResourcesDTO (org.opendaylight.netconf.sal.connect.netconf.NetconfDevice.SchemaResourcesDTO)1 RemoteDeviceId (org.opendaylight.netconf.sal.connect.util.RemoteDeviceId)1