@SuppressWarnings("unchecked")
  private RequestStatusResponse processBlueprintCreate(Map<String, Object> properties, Map<String, String> requestInfoProperties)
      throws ResourceAlreadyExistsException, SystemException, UnsupportedPropertyException,
      NoSuchParentResourceException {

    LOG.info("Creating Cluster '" + properties.get(CLUSTER_NAME_PROPERTY_ID) +
        "' based on blueprint '" + String.valueOf(properties.get(BLUEPRINT)) + "'.");

    String rawRequestBody = requestInfoProperties.get(Request.REQUEST_INFO_BODY_PROPERTY);
    Map<String, Object> rawBodyMap = jsonSerializer.<Map<String, Object>>fromJson(rawRequestBody, Map.class);
    SecurityConfiguration securityConfiguration =
      securityConfigurationFactory.createSecurityConfigurationFromRequest(rawBodyMap, false);

    ProvisionClusterRequest createClusterRequest;
    try {
      createClusterRequest = topologyRequestFactory.createProvisionClusterRequest(properties, securityConfiguration);
    } catch (InvalidTopologyTemplateException e) {
      throw new IllegalArgumentException("Invalid Cluster Creation Template: " + e, e);
    }

    if (securityConfiguration != null && securityConfiguration.getType() == SecurityType.NONE &&
        createClusterRequest.getBlueprint().getSecurity() != null && createClusterRequest.getBlueprint().getSecurity()
        .getType() == SecurityType.KERBEROS) {
      throw new IllegalArgumentException("Setting security to NONE is not allowed as security type in blueprint is set to KERBEROS!");
    }

    try {
      return topologyManager.provisionCluster(createClusterRequest);
    } catch (InvalidTopologyException e) {
      throw new IllegalArgumentException("Topology validation failed: " + e, e);
    } catch (AmbariException e) {
      throw new SystemException("Unknown exception when asking TopologyManager to provision cluster", e);
    } catch (RuntimeException e) {
      throw new SystemException("An exception occurred during cluster provisioning: " + e.getMessage(), e);
    }
  }
Process a create request specifying a blueprint.  This includes creation of all resources,
setting of configuration and installing and starting of all services.  The end result of this
call will be a running cluster based on the topology and configuration specified in the blueprint.

@param properties  request body properties

@param requestInfoProperties raw request body
@return asynchronous response information

@throws ResourceAlreadyExistsException if cluster already exists
@throws SystemException                if an unexpected exception occurs
@throws UnsupportedPropertyException   if an invalid property is specified in the request
@throws NoSuchParentResourceException  if a necessary parent resource doesn't exist
ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterResourceProvider.java