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=7cd43bd79a01b4b4436a12cfa5721e14108e165d;hp=8497edbd2674ebef735f95e17f6d115ab303048c;hb=523c3f0629438462c5bb7be4adcaf7103a3f7ea6;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..7cd43bd79a 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; @@ -24,6 +28,7 @@ import org.opendaylight.yangtools.yang.model.api.Module; import java.util.Collection; import java.util.Collections; +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(); @@ -71,13 +102,10 @@ public class NetconfOperationServiceImpl implements NetconfOperationService { private static Set setupCapabilities(YangStoreSnapshot yangStoreSnapshot) { Set capabilities = Sets.newHashSet(); + // [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) { @@ -100,6 +128,11 @@ public class NetconfOperationServiceImpl implements NetconfOperationService { return capability; } + @Override + public Optional getModuleNamespace() { + return Optional.absent(); + } + @Override public Optional getModuleName() { return Optional.absent(); @@ -114,6 +147,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 +159,14 @@ 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(); this.moduleName = module.getName(); + this.moduleNamespace = module.getNamespace().toString(); this.revision = Util.writeDate(module.getRevision()); } @@ -150,6 +190,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);