public Map<String, ConfigUpgradeChangeDefinition> enumerateConfigChangesByID() {
    if (changesById == null) {
      changesById = new HashMap<>();
      for(AffectedService service : services) {
        for(AffectedComponent component: service.components) {
          for (ConfigUpgradeChangeDefinition changeDefinition : component.changes) {
            if (changeDefinition.id == null) {
              LOG.warn(String.format("Config upgrade change definition for service %s," +
                      " component %s has no id", service.name, component.name));
            } else if (changesById.containsKey(changeDefinition.id)) {
              LOG.warn("Duplicate config upgrade change definition with ID " +
                      changeDefinition.id);
            }
            changesById.put(changeDefinition.id, changeDefinition);
          }
        }
      }
    }
    return changesById;
  }
@return a map of <change id, change definition>. Map is built once and
cached
ambari-server/src/main/java/org/apache/ambari/server/stack/upgrade/ConfigUpgradePack.java