2 * Copyright (c) 2020 PANTHEON.tech, s.r.o. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
8 package org.opendaylight.netconf.client.mdsal.impl;
10 import static java.util.Objects.requireNonNull;
12 import com.google.common.base.Stopwatch;
13 import com.google.common.cache.CacheBuilder;
14 import com.google.common.cache.CacheLoader;
15 import com.google.common.cache.LoadingCache;
16 import com.google.common.collect.ImmutableSet;
17 import javax.inject.Inject;
18 import javax.inject.Singleton;
19 import org.eclipse.jdt.annotation.NonNull;
20 import org.opendaylight.mdsal.binding.runtime.spi.ModuleInfoSnapshotBuilder;
21 import org.opendaylight.netconf.api.CapabilityURN;
22 import org.opendaylight.netconf.client.mdsal.api.BaseNetconfSchemaProvider;
23 import org.opendaylight.netconf.client.mdsal.api.NetconfSessionPreferences;
24 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.base._1._0.rev110601.Candidate;
25 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.base._1._0.rev110601.ConfirmedCommit;
26 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.base._1._0.rev110601.IetfNetconfData;
27 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.base._1._0.rev110601.RollbackOnError;
28 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.base._1._0.rev110601.Startup;
29 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.base._1._0.rev110601.Url;
30 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.base._1._0.rev110601.Validate$F;
31 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.base._1._0.rev110601.WritableRunning;
32 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.base._1._0.rev110601.Xpath;
33 import org.opendaylight.yangtools.yang.binding.YangFeature;
34 import org.opendaylight.yangtools.yang.parser.api.YangParserException;
35 import org.opendaylight.yangtools.yang.parser.api.YangParserFactory;
36 import org.osgi.service.component.annotations.Activate;
37 import org.osgi.service.component.annotations.Component;
38 import org.osgi.service.component.annotations.Reference;
39 import org.slf4j.Logger;
40 import org.slf4j.LoggerFactory;
44 public final class DefaultBaseNetconfSchemaProvider implements BaseNetconfSchemaProvider {
45 private record Capabilities(
46 boolean writableRunning,
48 boolean confirmedCommit,
49 boolean rollbackOnError,
54 boolean notifications,
60 private static final Logger LOG = LoggerFactory.getLogger(DefaultBaseNetconfSchemaProvider.class);
62 private final LoadingCache<Capabilities, DefaultBaseNetconfSchema> baseSchemas = CacheBuilder.newBuilder()
63 .weakValues().build(new CacheLoader<>() {
65 public DefaultBaseNetconfSchema load(final Capabilities key) throws YangParserException {
66 LOG.debug("Loading base schema for {}", key);
67 final var sw = Stopwatch.createStarted();
69 final var builder = new ModuleInfoSnapshotBuilder(parserFactory)
70 .add(org.opendaylight.yang.svc.v1.urn.ietf.params.xml.ns.netconf.base._1._0.rev110601
71 .YangModuleInfoImpl.getInstance());
73 final var netconfFeatures = ImmutableSet.<YangFeature<?, @NonNull IetfNetconfData>>builder();
74 if (key.writableRunning) {
75 netconfFeatures.add(WritableRunning.VALUE);
78 netconfFeatures.add(Candidate.VALUE);
80 if (key.confirmedCommit) {
81 netconfFeatures.add(ConfirmedCommit.VALUE);
83 if (key.rollbackOnError) {
84 netconfFeatures.add(RollbackOnError.VALUE);
87 netconfFeatures.add(Validate$F.VALUE);
90 netconfFeatures.add(Startup.VALUE);
93 netconfFeatures.add(Url.VALUE);
96 netconfFeatures.add(Xpath.VALUE);
98 builder.addModuleFeatures(IetfNetconfData.class, netconfFeatures.build());
101 builder.add(org.opendaylight.yang.svc.v1.urn.ietf.params.xml.ns.yang.ietf.yang.library.rev190104
102 .YangModuleInfoImpl.getInstance());
104 if (key.monitoring) {
105 builder.add(org.opendaylight.yang.svc.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.monitoring
106 .rev101004.YangModuleInfoImpl.getInstance());
108 if (key.notifications) {
110 .add(org.opendaylight.yang.svc.v1.urn.ietf.params.xml.ns.netconf.notification._1._0.rev080714
111 .YangModuleInfoImpl.getInstance())
112 .add(org.opendaylight.yang.svc.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.notifications
113 .rev120206.YangModuleInfoImpl.getInstance());
116 final var snapshot = builder.build();
117 LOG.debug("Schema for {} assembled in {}", key, sw);
118 return new DefaultBaseNetconfSchema(snapshot.modelContext());
121 private final YangParserFactory parserFactory;
125 public DefaultBaseNetconfSchemaProvider(@Reference final YangParserFactory parserFactory) {
126 this.parserFactory = requireNonNull(parserFactory);
130 public DefaultBaseNetconfSchema baseSchemaForCapabilities(final NetconfSessionPreferences sessionPreferences) {
131 return baseSchemas.getUnchecked(new Capabilities(
132 sessionPreferences.isRunningWritable(),
133 sessionPreferences.isCandidateSupported(),
134 sessionPreferences.containsNonModuleCapability(CapabilityURN.CONFIRMED_COMMIT_1_1)
135 || sessionPreferences.containsNonModuleCapability(CapabilityURN.CONFIRMED_COMMIT),
136 sessionPreferences.isRollbackSupported(),
137 sessionPreferences.containsNonModuleCapability(CapabilityURN.VALIDATE_1_1)
138 || sessionPreferences.containsNonModuleCapability(CapabilityURN.VALIDATE),
139 sessionPreferences.containsNonModuleCapability(CapabilityURN.STARTUP),
140 sessionPreferences.containsNonModuleCapability(CapabilityURN.URL),
141 sessionPreferences.containsNonModuleCapability(CapabilityURN.XPATH),
142 sessionPreferences.isNotificationsSupported(),
143 sessionPreferences.containsNonModuleCapability(CapabilityURN.YANG_LIBRARY)
144 || sessionPreferences.containsNonModuleCapability(CapabilityURN.YANG_LIBRARY_1_1),
145 sessionPreferences.isMonitoringSupported()));