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;fp=opendaylight%2Fnetconf%2Fconfig-persister-impl%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fnetconf%2Fpersist%2Fimpl%2FConfigPusherImpl.java;h=0e179ad7d58c92e019c9a8c98c6d1bd8d8563d78;hb=02faab29bd30a67c8f5f35cb6c2713c4cb760ce1;hp=22b061a1285c88d0ea372a5c104a2baf69fcb58c;hpb=c448e270faf33afb6a04929a064ce9c9ce9556ed;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 22b061a128..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 @@ -138,28 +138,65 @@ public class ConfigPusherImpl implements ConfigPusher { private NetconfOperationService getOperationServiceWithRetries(Set expectedCapabilities, String idForReporting) { Stopwatch stopwatch = Stopwatch.createStarted(); - NotEnoughCapabilitiesException lastException; + 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,23 +207,24 @@ 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, 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, 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); } } @@ -202,8 +240,6 @@ public class ConfigPusherImpl implements ConfigPusher { return allNotFound; } - - private void sleep() { try { Thread.sleep(100);