public void addDescendant(String configId, AnyConfigProducer descendant) {
        if (id2producer.containsKey(configId)) {
            throw new RuntimeException
                    ("Config ID '" + configId + "' cannot be reserved by an instance of class '" +
                            descendant.getClass().getName() +
                            "' since it is already used by an instance of class '" +
                            id2producer.get(configId).getClass().getName() +
                            "'. (This is commonly caused by service/node index " +
                            "collisions in the config.)");
        }
        id2producer.put(configId, descendant);
    }
Adds the descendant (at any depth level), so it can be looked up
on configId in the Map.

@param configId   the id to register with, not necessarily equal to descendant.getConfigId().
@param descendant The configProducer descendant to add
config-model/src/main/java/com/yahoo/vespa/model/VespaModel.java