X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=blobdiff_plain;f=opendaylight%2Fnetconf%2Fconfig-netconf-connector%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fnetconf%2Fconfignetconfconnector%2Fosgi%2FNetconfOperationServiceImpl.java;h=6eabbe69c69377d65c1422673394651f42bc7fad;hp=8497edbd2674ebef735f95e17f6d115ab303048c;hb=b29204146ca6957b5f968e07d9e7e2052ba70ef1;hpb=a92d9d6a21a0f6ca8d2153795721f500eaf29ee9 diff --git a/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/osgi/NetconfOperationServiceImpl.java b/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/osgi/NetconfOperationServiceImpl.java index 8497edbd26..6eabbe69c6 100644 --- a/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/osgi/NetconfOperationServiceImpl.java +++ b/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/osgi/NetconfOperationServiceImpl.java @@ -8,12 +8,16 @@ package org.opendaylight.controller.netconf.confignetconfconnector.osgi; +import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Optional; +import com.google.common.base.Preconditions; import com.google.common.collect.Sets; +import org.opendaylight.controller.config.api.LookupRegistry; import org.opendaylight.controller.config.util.ConfigRegistryJMXClient; import org.opendaylight.controller.config.yang.store.api.YangStoreException; import org.opendaylight.controller.config.yang.store.api.YangStoreService; import org.opendaylight.controller.config.yang.store.api.YangStoreSnapshot; +import org.opendaylight.controller.config.yangjmxgenerator.ModuleMXBeanEntry; import org.opendaylight.controller.netconf.confignetconfconnector.transactions.TransactionProvider; import org.opendaylight.controller.netconf.confignetconfconnector.util.Util; import org.opendaylight.controller.netconf.mapping.api.Capability; @@ -22,8 +26,9 @@ import org.opendaylight.controller.netconf.mapping.api.NetconfOperationFilter; import org.opendaylight.controller.netconf.mapping.api.NetconfOperationService; import org.opendaylight.yangtools.yang.model.api.Module; -import java.util.Collection; import java.util.Collections; +import java.util.HashSet; +import java.util.List; import java.util.Map; import java.util.Set; @@ -41,12 +46,38 @@ public class NetconfOperationServiceImpl implements NetconfOperationService { String netconfSessionIdForReporting) throws YangStoreException { yangStoreSnapshot = yangStoreService.getYangStoreSnapshot(); + checkConsistencyBetweenYangStoreAndConfig(jmxClient, yangStoreSnapshot); + transactionProvider = new TransactionProvider(jmxClient, netconfSessionIdForReporting); operationProvider = new NetconfOperationProvider(yangStoreSnapshot, jmxClient, transactionProvider, netconfSessionIdForReporting); capabilities = setupCapabilities(yangStoreSnapshot); } + + @VisibleForTesting + static void checkConsistencyBetweenYangStoreAndConfig(LookupRegistry jmxClient, YangStoreSnapshot yangStoreSnapshot) { + Set missingModulesFromConfig = Sets.newHashSet(); + + Set modulesSeenByConfig = jmxClient.getAvailableModuleFactoryQNames(); + Map> moduleMXBeanEntryMap = yangStoreSnapshot.getModuleMXBeanEntryMap(); + + for (Map moduleNameToMBE : moduleMXBeanEntryMap.values()) { + for (ModuleMXBeanEntry moduleMXBeanEntry : moduleNameToMBE.values()) { + String moduleSeenByYangStore = moduleMXBeanEntry.getYangModuleQName().toString(); + if(modulesSeenByConfig.contains(moduleSeenByYangStore) == false) + missingModulesFromConfig.add(moduleSeenByYangStore); + } + } + + Preconditions + .checkState( + missingModulesFromConfig.isEmpty(), + "There are inconsistencies between configuration subsystem and yangstore in terms of discovered yang modules, yang modules missing from config subsystem but present in yangstore: %s, %sAll modules present in config: %s", + missingModulesFromConfig, System.lineSeparator(), modulesSeenByConfig); + + } + @Override public void close() { yangStoreSnapshot.close(); @@ -69,19 +100,15 @@ public class NetconfOperationServiceImpl implements NetconfOperationService { } private static Set setupCapabilities(YangStoreSnapshot yangStoreSnapshot) { - Set capabilities = Sets.newHashSet(); - + Set capabilities = new HashSet<>(); + // [RFC6241] 8.3. Candidate Configuration Capability capabilities.add(new BasicCapability("urn:ietf:params:netconf:capability:candidate:1.0")); + // [RFC6241] 8.5. Rollback-on-Error Capability capabilities.add(new BasicCapability("urn:ietf:params:netconf:capability:rollback-on-error:1.0")); - capabilities.add(new BasicCapability("urn:ietf:params:netconf:capability:operations:1.0")); - capabilities.add(new BasicCapability("urn:ietf:params:netconf:capability:operations:1.1")); - capabilities - .add(new BasicCapability( - "urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring?module=ietf-netconf-monitoring&revision=2010-10-04")); - - final Collection> modulesAndContents = yangStoreSnapshot.getModuleMap().values(); - for (Map.Entry moduleAndContent : modulesAndContents) { - capabilities.add(new YangStoreCapability(moduleAndContent)); + + Set modules = yangStoreSnapshot.getModules(); + for (Module module : modules) { + capabilities.add(new YangStoreCapability(module, yangStoreSnapshot.getModuleSource(module))); } return capabilities; @@ -100,6 +127,11 @@ public class NetconfOperationServiceImpl implements NetconfOperationService { return capability; } + @Override + public Optional getModuleNamespace() { + return Optional.absent(); + } + @Override public Optional getModuleName() { return Optional.absent(); @@ -114,6 +146,11 @@ public class NetconfOperationServiceImpl implements NetconfOperationService { public Optional getCapabilitySchema() { return Optional.absent(); } + + @Override + public Optional> getLocation() { + return Optional.absent(); + } } private static class YangStoreCapability extends BasicCapability { @@ -121,12 +158,13 @@ public class NetconfOperationServiceImpl implements NetconfOperationService { private final String content; private final String revision; private final String moduleName; + private final String moduleNamespace; - public YangStoreCapability(Map.Entry moduleAndContent) { - super(getAsString(moduleAndContent.getKey())); - this.content = moduleAndContent.getValue(); - Module module = moduleAndContent.getKey(); + public YangStoreCapability(Module module, String moduleContent) { + super(getAsString(module)); + this.content = moduleContent; this.moduleName = module.getName(); + this.moduleNamespace = module.getNamespace().toString(); this.revision = Util.writeDate(module.getRevision()); } @@ -150,6 +188,11 @@ public class NetconfOperationServiceImpl implements NetconfOperationService { return Optional.of(moduleName); } + @Override + public Optional getModuleNamespace() { + return Optional.of(moduleNamespace); + } + @Override public Optional getRevision() { return Optional.of(revision);