private List<ApplicationContainer> createNodes(ApplicationContainerCluster cluster, Element containerElement,
                                                   Element nodesElement, ConfigModelContext context) {
        if (nodesElement.hasAttribute("type")) // internal use for hosted system infrastructure nodes
            return createNodesFromNodeType(cluster, nodesElement, context);
        else if (nodesElement.hasAttribute("of")) {// hosted node spec referencing a content cluster
            // TODO: Remove support for combined clusters in Vespa 9
            List<ApplicationContainer> containers = createNodesFromContentServiceReference(cluster, nodesElement, context);
            deployLogger.logApplicationPackage(WARNING, "Declaring combined cluster with <nodes of=\"...\"> is deprecated without " +
                                               "replacement, and the feature will be removed in Vespa 9. Use separate container and " +
                                               "content clusters instead");
            return containers;
        } else if (nodesElement.hasAttribute("count")) // regular, hosted node spec
            return createNodesFromNodeCount(cluster, containerElement, nodesElement, context);
        else if (cluster.isHostedVespa()) // default to 1 if node count is not specified
            return createNodesFromNodeCount(cluster, containerElement, nodesElement, context);
        else // the non-hosted option
            return createNodesFromNodeList(context.getDeployState(), cluster, nodesElement);
    }
Add nodes to cluster according to the given containerElement.

Note: DO NOT change allocation behaviour to allow version X and Y of the config-model to allocate a different set
of nodes. Such changes must be guarded by a common condition (e.g. feature flag) so the behaviour can be changed
simultaneously for all active config models.
config-model/src/main/java/com/yahoo/vespa/model/container/xml/ContainerModelBuilder.java