X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=opendaylight%2Fnetconf%2Fconfig-persister-impl%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fnetconf%2Fpersist%2Fimpl%2FConfigPusherImpl.java;h=0e179ad7d58c92e019c9a8c98c6d1bd8d8563d78;hb=02faab29bd30a67c8f5f35cb6c2713c4cb760ce1;hp=cf9958e7f8abf44303aeb18f79a77d01b62d7a9b;hpb=58b7b56639e983e6fecdaff9508b9f0fd9afb514;p=controller.git diff --git a/opendaylight/netconf/config-persister-impl/src/main/java/org/opendaylight/controller/netconf/persist/impl/ConfigPusherImpl.java b/opendaylight/netconf/config-persister-impl/src/main/java/org/opendaylight/controller/netconf/persist/impl/ConfigPusherImpl.java index cf9958e7f8..0e179ad7d5 100644 --- a/opendaylight/netconf/config-persister-impl/src/main/java/org/opendaylight/controller/netconf/persist/impl/ConfigPusherImpl.java +++ b/opendaylight/netconf/config-persister-impl/src/main/java/org/opendaylight/controller/netconf/persist/impl/ConfigPusherImpl.java @@ -33,10 +33,10 @@ import org.opendaylight.controller.config.api.ConflictingVersionException; import org.opendaylight.controller.config.persist.api.ConfigPusher; import org.opendaylight.controller.config.persist.api.ConfigSnapshotHolder; import org.opendaylight.controller.config.persist.api.Persister; +import org.opendaylight.controller.netconf.api.Capability; import org.opendaylight.controller.netconf.api.NetconfDocumentedException; import org.opendaylight.controller.netconf.api.NetconfMessage; import org.opendaylight.controller.netconf.api.xml.XmlNetconfConstants; -import org.opendaylight.controller.netconf.mapping.api.Capability; import org.opendaylight.controller.netconf.mapping.api.HandlingPriority; import org.opendaylight.controller.netconf.mapping.api.NetconfOperation; import org.opendaylight.controller.netconf.mapping.api.NetconfOperationChainedExecution; @@ -115,7 +115,7 @@ public class ConfigPusherImpl implements ConfigPusher { */ private synchronized EditAndCommitResponse pushConfigWithConflictingVersionRetries(ConfigSnapshotHolder configSnapshotHolder) throws NetconfDocumentedException { ConflictingVersionException lastException; - Stopwatch stopwatch = new Stopwatch(); + Stopwatch stopwatch = Stopwatch.createUnstarted(); do { String idForReporting = configSnapshotHolder.toString(); SortedSet expectedCapabilities = checkNotNull(configSnapshotHolder.getCapabilities(), @@ -137,29 +137,66 @@ public class ConfigPusherImpl implements ConfigPusher { } private NetconfOperationService getOperationServiceWithRetries(Set expectedCapabilities, String idForReporting) { - Stopwatch stopwatch = new Stopwatch().start(); - NotEnoughCapabilitiesException lastException; + Stopwatch stopwatch = Stopwatch.createStarted(); + ConfigPusherException lastException; do { try { return getOperationService(expectedCapabilities, idForReporting); - } catch (NotEnoughCapabilitiesException e) { + } catch (ConfigPusherException e) { LOG.debug("Not enough capabilities: {}", e.toString()); lastException = e; sleep(); } } while (stopwatch.elapsed(TimeUnit.MILLISECONDS) < maxWaitForCapabilitiesMillis); - throw new IllegalStateException("Max wait for capabilities reached." + lastException.getMessage(), lastException); + + if(lastException instanceof NotEnoughCapabilitiesException) { + LOG.error("Unable to push configuration due to missing yang models." + + " Yang models that are missing, but required by the configuration: {}." + + " For each mentioned model check: " + + " 1. that the mentioned yang model namespace/name/revision is identical to those in the yang model itself" + + " 2. the yang file is present in the system" + + " 3. the bundle with that yang file is present in the system and active" + + " 4. the yang parser did not fail while attempting to parse that model", + ((NotEnoughCapabilitiesException) lastException).getMissingCaps()); + throw new IllegalStateException("Unable to push configuration due to missing yang models." + + " Required yang models that are missing: " + + ((NotEnoughCapabilitiesException) lastException).getMissingCaps(), lastException); + } else { + final String msg = "Unable to push configuration due to missing netconf service"; + LOG.error(msg, lastException); + throw new IllegalStateException(msg, lastException); + } } - private static class NotEnoughCapabilitiesException extends Exception { - private static final long serialVersionUID = 1L; + private static class ConfigPusherException extends Exception { - private NotEnoughCapabilitiesException(String message, Throwable cause) { + public ConfigPusherException(final String message) { + super(message); + } + + public ConfigPusherException(final String message, final Throwable cause) { super(message, cause); } + } + + private static class NotEnoughCapabilitiesException extends ConfigPusherException { + private static final long serialVersionUID = 1L; + private Set missingCaps; - private NotEnoughCapabilitiesException(String message) { + private NotEnoughCapabilitiesException(String message, Set missingCaps) { super(message); + this.missingCaps = missingCaps; + } + + public Set getMissingCaps() { + return missingCaps; + } + } + + private static final class NetconfServiceNotAvailableException extends ConfigPusherException { + + public NetconfServiceNotAvailableException(final String s, final RuntimeException e) { + super(s, e); } } @@ -170,27 +207,28 @@ public class ConfigPusherImpl implements ConfigPusher { * @param idForReporting * @return service if capabilities are present, otherwise absent value */ - private NetconfOperationService getOperationService(Set expectedCapabilities, String idForReporting) throws NotEnoughCapabilitiesException { + private NetconfOperationService getOperationService(Set expectedCapabilities, String idForReporting) throws ConfigPusherException { NetconfOperationService serviceCandidate; try { serviceCandidate = configNetconfConnector.createService(idForReporting); } catch(RuntimeException e) { - throw new NotEnoughCapabilitiesException("Netconf service not stable for " + idForReporting, e); + throw new NetconfServiceNotAvailableException("Netconf service not stable for config pusher." + + " Cannot push any configuration", e); } - Set notFoundDiff = computeNotFoundCapabilities(expectedCapabilities, serviceCandidate); + Set notFoundDiff = computeNotFoundCapabilities(expectedCapabilities, configNetconfConnector); if (notFoundDiff.isEmpty()) { return serviceCandidate; } else { serviceCandidate.close(); - LOG.trace("Netconf server did not provide required capabilities for {} ", idForReporting, + LOG.debug("Netconf server did not provide required capabilities for {} ", idForReporting, "Expected but not found: {}, all expected {}, current {}", - notFoundDiff, expectedCapabilities, serviceCandidate.getCapabilities() + notFoundDiff, expectedCapabilities, configNetconfConnector.getCapabilities() ); - throw new NotEnoughCapabilitiesException("Not enough capabilities for " + idForReporting + ". Expected but not found: " + notFoundDiff); + throw new NotEnoughCapabilitiesException("Not enough capabilities for " + idForReporting + ". Expected but not found: " + notFoundDiff, notFoundDiff); } } - private static Set computeNotFoundCapabilities(Set expectedCapabilities, NetconfOperationService serviceCandidate) { + private static Set computeNotFoundCapabilities(Set expectedCapabilities, NetconfOperationServiceFactory serviceCandidate) { Collection actual = Collections2.transform(serviceCandidate.getCapabilities(), new Function() { @Override public String apply(@Nonnull final Capability input) { @@ -202,8 +240,6 @@ public class ConfigPusherImpl implements ConfigPusher { return allNotFound; } - - private void sleep() { try { Thread.sleep(100); @@ -230,7 +266,7 @@ public class ConfigPusherImpl implements ConfigPusher { throw new IllegalStateException("Cannot parse " + configSnapshotHolder); } LOG.trace("Pushing last configuration to netconf: {}", configSnapshotHolder); - Stopwatch stopwatch = new Stopwatch().start(); + Stopwatch stopwatch = Stopwatch.createStarted(); NetconfMessage editConfigMessage = createEditConfigMessage(xmlToBePersisted); Document editResponseMessage = sendRequestGetResponseCheckIsOK(editConfigMessage, operationService,