You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by be...@apache.org on 2018/01/24 19:54:52 UTC

[ambari] branch branch-feature-AMBARI-14714 updated: AMBARI-22776 Ambari Blueprint 3.0/3.1 database tables and JPA objects + DDL cleanup (#109) (benyoka)

This is an automated email from the ASF dual-hosted git repository.

benyoka pushed a commit to branch branch-feature-AMBARI-14714
in repository https://gitbox.apache.org/repos/asf/ambari.git


The following commit(s) were added to refs/heads/branch-feature-AMBARI-14714 by this push:
     new 2d8d32a  AMBARI-22776 Ambari Blueprint 3.0/3.1 database tables and JPA objects + DDL cleanup (#109) (benyoka)
2d8d32a is described below

commit 2d8d32a2455851b44e6cd597825371286bcdc459
Author: benyoka <be...@users.noreply.github.com>
AuthorDate: Wed Jan 24 20:54:50 2018 +0100

    AMBARI-22776 Ambari Blueprint 3.0/3.1 database tables and JPA objects + DDL cleanup (#109) (benyoka)
    
    * AMBARI-22776 Blueprint 3.0 Database schemas and JPA objects, DDL fixes (benyoka)
    
    * AMBARI-22776 Revert accidental commit (benyoka)
    
    * AMBARI-22776 Revert accidental change #2 (benyoka)
    
    * AMBARI-22776 Fix review findings (benyoka)
    
    * AMBARI-22776 Fix review findings #2 (benyoka)
    
    * AMBARI-22776 remove blueprint -> stack reference, docs (benyoka)
    
    * AMBARI-22776 fix build issues (benyoka)
    
    * AMBARI-22776 Add MpackInstanceEntity -> MpackEntity reference (benyoka)
---
 .../internal/BlueprintResourceProvider.java        |  12 +-
 .../apache/ambari/server/orm/dao/BlueprintDAO.java |  14 --
 .../server/orm/entities/BlueprintEntity.java       |  46 ++---
 .../orm/entities/BlueprintMpackConfigEntity.java   | 149 ++++++++++++++++
 .../orm/entities/BlueprintMpackConfigEntityPk.java |  51 ++++++
 .../orm/entities/BlueprintMpackInstanceEntity.java | 190 +++++++++++++++++++++
 .../orm/entities/BlueprintServiceConfigEntity.java | 147 ++++++++++++++++
 .../entities/BlueprintServiceConfigEntityPk.java   |  52 ++++++
 .../orm/entities/BlueprintServiceEntity.java       | 129 ++++++++++++++
 .../orm/entities/HostGroupComponentEntity.java     |  87 +++++++++-
 .../orm/entities/HostGroupComponentEntityPK.java   | 116 -------------
 .../server/orm/entities/HostGroupEntity.java       |   7 +-
 .../ambari/server/topology/BlueprintImpl.java      |   9 -
 .../src/main/resources/Ambari-DDL-Derby-CREATE.sql |  72 +++++---
 .../src/main/resources/Ambari-DDL-MySQL-CREATE.sql |  80 +++++----
 .../main/resources/Ambari-DDL-Oracle-CREATE.sql    |  81 +++++----
 .../main/resources/Ambari-DDL-Postgres-CREATE.sql  |  50 +++++-
 .../resources/Ambari-DDL-SQLAnywhere-CREATE.sql    |  69 +++++---
 .../main/resources/Ambari-DDL-SQLServer-CREATE.sql |  76 ++++++---
 .../src/main/resources/META-INF/persistence.xml    |   4 +
 .../internal/BlueprintResourceProviderTest.java    |  42 ++---
 .../org/apache/ambari/server/orm/db/DDLTests.java  |  43 +++--
 .../server/orm/entities/BlueprintEntityTest.java   |   7 -
 .../server/orm/entities/BlueprintEntityTest2.java  | 183 ++++++++++++++++++++
 24 files changed, 1341 insertions(+), 375 deletions(-)

diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/BlueprintResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/BlueprintResourceProvider.java
index c665aec..b9899bd 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/BlueprintResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/BlueprintResourceProvider.java
@@ -46,10 +46,10 @@ import org.apache.ambari.server.orm.dao.BlueprintDAO;
 import org.apache.ambari.server.orm.entities.BlueprintConfigEntity;
 import org.apache.ambari.server.orm.entities.BlueprintConfiguration;
 import org.apache.ambari.server.orm.entities.BlueprintEntity;
+import org.apache.ambari.server.orm.entities.BlueprintMpackInstanceEntity;
 import org.apache.ambari.server.orm.entities.BlueprintSettingEntity;
 import org.apache.ambari.server.orm.entities.HostGroupComponentEntity;
 import org.apache.ambari.server.orm.entities.HostGroupEntity;
-import org.apache.ambari.server.orm.entities.StackEntity;
 import org.apache.ambari.server.stack.NoSuchStackException;
 import org.apache.ambari.server.state.SecurityType;
 import org.apache.ambari.server.state.StackInfo;
@@ -309,11 +309,8 @@ public class BlueprintResourceProvider extends AbstractControllerResourceProvide
    * @return a new resource instance for the given blueprint entity
    */
   protected Resource toResource(BlueprintEntity entity, Set<String> requestedIds) throws NoSuchResourceException {
-    StackEntity stackEntity = entity.getStack();
     Resource resource = new ResourceImpl(Resource.Type.Blueprint);
     setResourceProperty(resource, BLUEPRINT_NAME_PROPERTY_ID, entity.getBlueprintName(), requestedIds);
-    setResourceProperty(resource, STACK_NAME_PROPERTY_ID, stackEntity.getStackName(), requestedIds);
-    setResourceProperty(resource, STACK_VERSION_PROPERTY_ID, stackEntity.getStackVersion(), requestedIds);
 
     List<Map<String, Object>> listGroupProps = new ArrayList<>();
     Collection<HostGroupEntity> hostGroups = entity.getHostGroups();
@@ -377,11 +374,14 @@ public class BlueprintResourceProvider extends AbstractControllerResourceProvide
         Map<String, String> properties = jsonSerializer.<Map<String, String>>fromJson(
             config.getConfigData(), Map.class);
 
-        StackEntity stack = ((BlueprintConfigEntity)config).getBlueprintEntity().getStack();
+
+        // TODO: use multiple mpacks
+        BlueprintMpackInstanceEntity mpack =
+          ((BlueprintConfigEntity)config).getBlueprintEntity().getMpackReferences().iterator().next();
         StackInfo metaInfoStack;
 
         try {
-          metaInfoStack = ambariMetaInfo.getStack(stack.getStackName(), stack.getStackVersion());
+          metaInfoStack = ambariMetaInfo.getStack(mpack.getMpackName(), mpack.getMpackVersion());
         } catch (AmbariException e) {
           throw new NoSuchResourceException(e.getMessage());
         }
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/BlueprintDAO.java b/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/BlueprintDAO.java
index b74506c..70ee514 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/BlueprintDAO.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/BlueprintDAO.java
@@ -18,7 +18,6 @@
 
 package org.apache.ambari.server.orm.dao;
 
-
 import java.util.List;
 
 import javax.persistence.EntityManager;
@@ -26,14 +25,12 @@ import javax.persistence.TypedQuery;
 
 import org.apache.ambari.server.orm.RequiresSession;
 import org.apache.ambari.server.orm.entities.BlueprintEntity;
-import org.apache.ambari.server.orm.entities.StackEntity;
 
 import com.google.inject.Inject;
 import com.google.inject.Provider;
 import com.google.inject.Singleton;
 import com.google.inject.persist.Transactional;
 
-
 /**
  * Blueprint Data Access Object.
  */
@@ -82,7 +79,6 @@ public class BlueprintDAO {
    */
   @Transactional
   public void refresh(BlueprintEntity blueprintEntity) {
-    ensureStackIdSet(blueprintEntity);
     entityManagerProvider.get().refresh(blueprintEntity);
   }
 
@@ -93,7 +89,6 @@ public class BlueprintDAO {
    */
   @Transactional
   public void create(BlueprintEntity blueprintEntity) {
-    ensureStackIdSet(blueprintEntity);
     entityManagerProvider.get().persist(blueprintEntity);
   }
 
@@ -105,7 +100,6 @@ public class BlueprintDAO {
    */
   @Transactional
   public BlueprintEntity merge(BlueprintEntity blueprintEntity) {
-    ensureStackIdSet(blueprintEntity);
     return entityManagerProvider.get().merge(blueprintEntity);
   }
 
@@ -116,7 +110,6 @@ public class BlueprintDAO {
    */
   @Transactional
   public void remove(BlueprintEntity blueprintEntity) {
-    ensureStackIdSet(blueprintEntity);
     entityManagerProvider.get().remove(merge(blueprintEntity));
   }
 
@@ -128,11 +121,4 @@ public class BlueprintDAO {
   public void removeByName(String blueprint_name) {
     entityManagerProvider.get().remove(findByName(blueprint_name));
   }
-
-  private void ensureStackIdSet(BlueprintEntity entity) {
-    StackEntity stack = entity.getStack();
-    if (stack != null && stack.getStackId() == null) {
-      entity.setStack(stackDAO.find(stack.getStackName(), stack.getStackVersion()));
-    }
-  }
 }
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/BlueprintEntity.java b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/BlueprintEntity.java
index bab393a..31cbf86 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/BlueprintEntity.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/BlueprintEntity.java
@@ -18,6 +18,7 @@
 
 package org.apache.ambari.server.orm.entities;
 
+import java.util.ArrayList;
 import java.util.Collection;
 
 import javax.persistence.Basic;
@@ -27,10 +28,8 @@ import javax.persistence.Entity;
 import javax.persistence.EnumType;
 import javax.persistence.Enumerated;
 import javax.persistence.Id;
-import javax.persistence.JoinColumn;
 import javax.persistence.NamedQuery;
 import javax.persistence.OneToMany;
-import javax.persistence.OneToOne;
 import javax.persistence.Table;
 
 import org.apache.ambari.server.state.SecurityType;
@@ -58,22 +57,18 @@ public class BlueprintEntity {
   @Basic
   @Column(name = "security_descriptor_reference", nullable = true, insertable = true, updatable = true)
   private String securityDescriptorReference;
-
-  /**
-   * Unidirectional one-to-one association to {@link StackEntity}
-   */
-  @OneToOne
-  @JoinColumn(name = "stack_id", unique = false, nullable = false, insertable = true, updatable = false)
-  private StackEntity stack;
+  
+  @OneToMany(cascade = CascadeType.ALL, mappedBy = "blueprint")
+  private Collection<HostGroupEntity> hostGroups = new ArrayList<>();
 
   @OneToMany(cascade = CascadeType.ALL, mappedBy = "blueprint")
-  private Collection<HostGroupEntity> hostGroups;
+  private Collection<BlueprintConfigEntity> configurations = new ArrayList<>();
 
   @OneToMany(cascade = CascadeType.ALL, mappedBy = "blueprint")
-  private Collection<BlueprintConfigEntity> configurations;
+  private Collection<BlueprintSettingEntity> settings = new ArrayList<>();
 
   @OneToMany(cascade = CascadeType.ALL, mappedBy = "blueprint")
-  private Collection<BlueprintSettingEntity> settings;
+  private Collection<BlueprintMpackInstanceEntity> mpackReferences = new ArrayList<>();
 
 
   /**
@@ -95,25 +90,6 @@ public class BlueprintEntity {
   }
 
   /**
-   * Gets the blueprint's stack.
-   *
-   * @return the stack.
-   */
-  public StackEntity getStack() {
-    return stack;
-  }
-
-  /**
-   * Sets the blueprint's stack.
-   *
-   * @param stack
-   *          the stack to set for the blueprint (not {@code null}).
-   */
-  public void setStack(StackEntity stack) {
-    this.stack = stack;
-  }
-
-  /**
    * Get the collection of associated host groups.
    *
    * @return collection of host groups
@@ -182,4 +158,12 @@ public class BlueprintEntity {
   public void setSecurityDescriptorReference(String securityDescriptorReference) {
     this.securityDescriptorReference = securityDescriptorReference;
   }
+
+  public Collection<BlueprintMpackInstanceEntity> getMpackReferences() {
+    return mpackReferences;
+  }
+
+  public void setMpackReferences(Collection<BlueprintMpackInstanceEntity> mpackReferences) {
+    this.mpackReferences = mpackReferences;
+  }
 }
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/BlueprintMpackConfigEntity.java b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/BlueprintMpackConfigEntity.java
new file mode 100644
index 0000000..50cb0d2
--- /dev/null
+++ b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/BlueprintMpackConfigEntity.java
@@ -0,0 +1,149 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ambari.server.orm.entities;
+
+import javax.persistence.Basic;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.Id;
+import javax.persistence.IdClass;
+import javax.persistence.JoinColumn;
+import javax.persistence.Lob;
+import javax.persistence.ManyToOne;
+import javax.persistence.Table;
+
+/**
+ * Entity to represent an mpack level configuration in the blueprint.
+ */
+@Entity
+@Table(name = "blueprint_mpack_configuration")
+@IdClass(BlueprintMpackConfigEntityPk.class)
+public class BlueprintMpackConfigEntity implements BlueprintConfiguration {
+
+  @Id
+  @Column(name = "mpack_ref_id", nullable = false, insertable = false, updatable = false)
+  private Long mpackRefId;
+
+  @Id
+  @Column(name = "type_name", nullable = false, insertable = true, updatable = false, length = 100)
+  private String type;
+
+  @Column(name = "config_data")
+  @Basic(fetch = FetchType.LAZY)
+  @Lob
+  private String configData;
+
+  @Column(name = "config_attributes")
+  @Basic(fetch = FetchType.LAZY)
+  @Lob
+  private String configAttributes;
+
+  @ManyToOne
+  @JoinColumn(name = "mpack_ref_id", referencedColumnName = "id", nullable = false)
+  private BlueprintMpackInstanceEntity mpackReference;
+
+  /**
+   * @return the id of the mpack referency entity this configuration belongs to
+   */
+  public Long getMpackRefId() {
+    return mpackRefId;
+  }
+
+  /**
+   * @param mpackRefId the id of the mpack referency entity this configuration belongs to
+   */
+  public void setMpackRefId(Long mpackRefId) {
+    this.mpackRefId = mpackRefId;
+  }
+
+  /**
+   * @return the configuration type
+   */
+  @Override
+  public String getType() {
+    return type;
+  }
+
+  /**
+   * @param typeName the type of the configuration
+   */
+  @Override
+  public void setType(String typeName) {
+    this.type = typeName;
+  }
+
+  /**
+   * @return the configuration data encoded in json
+   */
+  public String getConfigData() {
+    return configData;
+  }
+
+  /**
+   * @param blueprintName the name of the blueprint
+   */
+  @Override
+  public void setBlueprintName(String blueprintName) {
+    throw new UnsupportedOperationException();
+  }
+
+  /**
+   * @return the name of the blueprint
+   */
+  @Override
+  public String getBlueprintName() {
+    return getMpackReference().getBlueprint().getBlueprintName();
+  }
+
+  /**
+   * @param configData the configuration data encoded in json
+   */
+  public void setConfigData(String configData) {
+    this.configData = configData;
+  }
+
+  /**
+   * @return the configuration attributes encoded in json
+   */
+  public String getConfigAttributes() {
+    return configAttributes;
+  }
+
+  /**
+   * @param configAttributes  the configuration attributes encoded in json
+   */
+  public void setConfigAttributes(String configAttributes) {
+    this.configAttributes = configAttributes;
+  }
+
+  /**
+   * @return the mpack referency entity this configuration belongs to
+   */
+  public BlueprintMpackInstanceEntity getMpackReference() {
+    return mpackReference;
+  }
+
+  /**
+   * @param mpackReference the mpack referency entity this configuration belongs to
+   */
+  public void setMpackReference(BlueprintMpackInstanceEntity mpackReference) {
+    this.mpackReference = mpackReference;
+  }
+}
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/BlueprintMpackConfigEntityPk.java b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/BlueprintMpackConfigEntityPk.java
new file mode 100644
index 0000000..6f4f017
--- /dev/null
+++ b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/BlueprintMpackConfigEntityPk.java
@@ -0,0 +1,51 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ambari.server.orm.entities;
+
+import java.util.Objects;
+
+import javax.persistence.Column;
+import javax.persistence.Id;
+
+/**
+ * Composite primary key for {@link BlueprintMpackConfigEntity}
+ */
+public class BlueprintMpackConfigEntityPk {
+  @Id
+  @Column(name = "mpack_ref_id", nullable = false, insertable = true, updatable = false)
+  private Long mpackRefId;
+
+  @Id
+  @Column(name = "type_name", nullable = false, insertable = true, updatable = false, length = 100)
+  private String type;
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) return true;
+    if (o == null || getClass() != o.getClass()) return false;
+    BlueprintMpackConfigEntityPk that = (BlueprintMpackConfigEntityPk) o;
+    return Objects.equals(mpackRefId, that.mpackRefId) &&
+      Objects.equals(type, that.type);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(mpackRefId, type);
+  }
+}
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/BlueprintMpackInstanceEntity.java b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/BlueprintMpackInstanceEntity.java
new file mode 100644
index 0000000..c87d994
--- /dev/null
+++ b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/BlueprintMpackInstanceEntity.java
@@ -0,0 +1,190 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ambari.server.orm.entities;
+
+import java.util.ArrayList;
+import java.util.Collection;
+
+import javax.annotation.Nullable;
+import javax.persistence.CascadeType;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.OneToMany;
+import javax.persistence.Table;
+import javax.persistence.TableGenerator;
+
+/**
+ * Entity to encapsulate a blueprint's use of an mpack. It contains the mpack name, version, url
+ *
+ *
+ * referencing a management pack from the blueprint. The reference contains the name and
+ * the version of the mpack, but no direct database reference to the mpack entity as a blueprint
+ * can be saved without the referenced mpack being present.
+ */
+@Entity
+@Table(name = "blueprint_mpack_instance")
+@TableGenerator(name = "blueprint_mpack_instance_id_generator", table = "ambari_sequences", pkColumnName = "sequence_name",
+  valueColumnName = "sequence_value", pkColumnValue = "blueprint_mpack_instance_id_seq", initialValue = 1)
+public class BlueprintMpackInstanceEntity {
+  @Id
+  @GeneratedValue(strategy = GenerationType.TABLE, generator = "blueprint_mpack_reference_id_generator")
+  @Column(name = "id", nullable = false, updatable = false)
+  private Long id;
+
+  @Column(name = "mpack_name")
+  private String mpackName;
+
+  @Column(name = "mpack_version")
+  private String mpackVersion;
+
+  @Column(name = "mpack_uri")
+  private String mpackUri;
+
+  @OneToMany(cascade = CascadeType.ALL, mappedBy = "mpackReference")
+  private Collection<BlueprintServiceEntity> serviceInstances = new ArrayList<>();
+
+  @OneToMany(cascade = CascadeType.ALL, mappedBy = "mpackReference")
+  private Collection<BlueprintMpackConfigEntity> configurations = new ArrayList<>();
+
+  @ManyToOne
+  @JoinColumn(name = "mpack_id", referencedColumnName = "id", nullable = true)
+  private MpackEntity mpackEntity;
+
+  @ManyToOne
+  @JoinColumn(name = "blueprint_name", referencedColumnName = "blueprint_name", nullable = false)
+  private BlueprintEntity blueprint;
+
+  /**
+   * @return the service instances belonging to this mpack
+   */
+  public Collection<BlueprintServiceEntity> getServiceInstances() {
+    return serviceInstances;
+  }
+
+  /**
+   * @param serviceInstances the service instances belonging to this mpack
+   */
+  public void setServiceInstances(Collection<BlueprintServiceEntity> serviceInstances) {
+    this.serviceInstances = serviceInstances;
+  }
+
+  /**
+   * @return the name of the mpack
+   */
+  public String getMpackName() {
+    return mpackName;
+  }
+
+  /**
+   * @param mpackName the name of the mpack
+   */
+  public void setMpackName(String mpackName) {
+    this.mpackName = mpackName;
+  }
+
+  /**
+   * @return the version of the mpack
+   */
+  public String getMpackVersion() {
+    return mpackVersion;
+  }
+
+  /**
+   * @param mpackVersion the version of the mpack
+   */
+  public void setMpackVersion(String mpackVersion) {
+    this.mpackVersion = mpackVersion;
+  }
+
+  /**
+   * @return the uri of the mpack
+   */
+  public String getMpackUri() {
+    return mpackUri;
+  }
+
+  /**
+   * @param mpackUri the uri of the mpack
+   */
+  public void setMpackUri(String mpackUri) {
+    this.mpackUri = mpackUri;
+  }
+
+  /**
+   * @return the database id
+   */
+  public Long getId() {
+    return id;
+  }
+
+  /**
+   * @param id the database id
+   */
+  public void setId(Long id) {
+    this.id = id;
+  }
+
+  /**
+   * @return the blueprint
+   */
+  public BlueprintEntity getBlueprint() {
+    return blueprint;
+  }
+
+  /**
+   * @param blueprint the blueprint
+   */
+  public void setBlueprint(BlueprintEntity blueprint) {
+    this.blueprint = blueprint;
+  }
+
+  /**
+   * @return the mpack level configurations for this mpack
+   */
+  public Collection<BlueprintMpackConfigEntity> getConfigurations() {
+    return configurations;
+  }
+
+  /**
+   * @param configurations the mpack level configurations for this mpack
+   */
+  public void setConfigurations(Collection<BlueprintMpackConfigEntity> configurations) {
+    this.configurations = configurations;
+  }
+
+  /**
+   * @return the management pack entity associated with this blueprint. Can be {@null}
+   */
+  @Nullable
+  public MpackEntity getMpackEntity() {
+    return mpackEntity;
+  }
+
+  /**
+   * @param mpackEntity the management pack entity to be associated with this blueprint.
+   */
+  public void setMpackEntity(MpackEntity mpackEntity) {
+    this.mpackEntity = mpackEntity;
+  }
+}
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/BlueprintServiceConfigEntity.java b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/BlueprintServiceConfigEntity.java
new file mode 100644
index 0000000..3dd8892
--- /dev/null
+++ b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/BlueprintServiceConfigEntity.java
@@ -0,0 +1,147 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ambari.server.orm.entities;
+
+import javax.persistence.Basic;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.Id;
+import javax.persistence.IdClass;
+import javax.persistence.JoinColumn;
+import javax.persistence.Lob;
+import javax.persistence.ManyToOne;
+import javax.persistence.Table;
+
+/**
+ * Entity representing a blueprint service instance configuration
+ */
+@Entity
+@Table(name = "blueprint_service_config")
+@IdClass(BlueprintServiceConfigEntityPk.class)
+public class BlueprintServiceConfigEntity implements BlueprintConfiguration {
+
+  @Id
+  @Column(name = "service_id", nullable = false, insertable = false, updatable = false)
+  private Long serviceId;
+
+  @Id
+  @Column(name = "type_name", nullable = false, insertable = true, updatable = false, length = 100)
+  private String type;
+
+  @Column(name = "config_data")
+  @Basic(fetch = FetchType.LAZY)
+  @Lob
+  private String configData;
+
+  @Column(name = "config_attributes")
+  @Basic(fetch = FetchType.LAZY)
+  @Lob
+  private String configAttributes;
+
+  @ManyToOne
+  @JoinColumn(name = "service_id", referencedColumnName = "id", nullable = false)
+  private BlueprintServiceEntity service;
+
+  /**
+   * @return the database id of the service instance
+   */
+  public Long getServiceId() {
+    return serviceId;
+  }
+
+  /**
+   * @param serviceId  the database id of the service instance
+   */
+  public void setServiceId(Long serviceId) {
+    this.serviceId = serviceId;
+  }
+
+  /**
+   * @return the type of the configuration
+   */
+  public String getType() {
+    return type;
+  }
+
+  /**
+   * @param blueprintName the blueprint name
+   */
+  @Override
+  public void setBlueprintName(String blueprintName) {
+    throw new UnsupportedOperationException("BlueprintServiceEntity.setBlueprintName");
+  }
+
+  /**
+   * @return the blueprint name
+   */
+  @Override
+  public String getBlueprintName() {
+    return getService().getMpackReference().getBlueprint().getBlueprintName();
+  }
+
+  /**
+   * @param typeName the type of the configuration
+   */
+  public void setType(String typeName) {
+    this.type = typeName;
+  }
+
+  /**
+   * @return the configuration data encoded in json
+   */
+  public String getConfigData() {
+    return configData;
+  }
+
+  /**
+   * @param configData the configuration data encoded in json
+   */
+  public void setConfigData(String configData) {
+    this.configData = configData;
+  }
+
+  /**
+   * @return the configuration attributes encoded in json
+   */
+  public String getConfigAttributes() {
+    return configAttributes;
+  }
+
+  /**
+   * @param configAttributes the configuration attributes encoded in json
+   */
+  public void setConfigAttributes(String configAttributes) {
+    this.configAttributes = configAttributes;
+  }
+
+  /**
+   * @return the service instance this configuration belongs to
+   */
+  public BlueprintServiceEntity getService() {
+    return service;
+  }
+
+  /**
+   * @param service the service instance this configuration belongs to
+   */
+  public void setService(BlueprintServiceEntity service) {
+    this.service = service;
+  }
+}
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/BlueprintServiceConfigEntityPk.java b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/BlueprintServiceConfigEntityPk.java
new file mode 100644
index 0000000..6c13fb7
--- /dev/null
+++ b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/BlueprintServiceConfigEntityPk.java
@@ -0,0 +1,52 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ambari.server.orm.entities;
+
+import java.util.Objects;
+
+import javax.persistence.Column;
+import javax.persistence.Id;
+
+/**
+ * Composite primary key for {@link BlueprintServiceConfigEntity}
+ */
+public class BlueprintServiceConfigEntityPk {
+
+  @Id
+  @Column(name = "service_id", nullable = false, insertable = true, updatable = false)
+  private Long serviceId;
+
+  @Id
+  @Column(name = "type_name", nullable = false, insertable = true, updatable = false, length = 100)
+  private String type;
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) return true;
+    if (o == null || getClass() != o.getClass()) return false;
+    BlueprintServiceConfigEntityPk that = (BlueprintServiceConfigEntityPk) o;
+    return Objects.equals(serviceId, that.serviceId) &&
+      Objects.equals(type, that.type);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(serviceId, type);
+  }
+}
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/BlueprintServiceEntity.java b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/BlueprintServiceEntity.java
new file mode 100644
index 0000000..cbca473
--- /dev/null
+++ b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/BlueprintServiceEntity.java
@@ -0,0 +1,129 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ambari.server.orm.entities;
+
+import java.util.ArrayList;
+import java.util.Collection;
+
+import javax.persistence.CascadeType;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.OneToMany;
+import javax.persistence.Table;
+import javax.persistence.TableGenerator;
+
+/**
+ * Entity representing a service instance in multi-service blueprints
+ */
+@Entity
+@Table(name = "blueprint_service")
+@TableGenerator(name = "blueprint_service_id_generator", table = "ambari_sequences", pkColumnName = "sequence_name",
+  valueColumnName = "sequence_value", pkColumnValue = "blueprint_service_id_seq", initialValue = 1)
+public class BlueprintServiceEntity {
+  @Id
+  @GeneratedValue(strategy = GenerationType.TABLE, generator = "blueprint_service_id_generator")
+  @Column(name = "id", nullable = false, updatable = false)
+  private Long id;
+
+  @ManyToOne()
+  @JoinColumn(name = "mpack_ref_id", referencedColumnName = "id", nullable = false)
+  private BlueprintMpackInstanceEntity mpackReference;
+
+  @OneToMany(cascade = CascadeType.ALL, mappedBy = "service")
+  private Collection<BlueprintServiceConfigEntity> configurations = new ArrayList<>();
+
+  private String name;
+
+  private String type;
+
+  /**
+   * @return the database id
+   */
+  public Long getId() {
+    return id;
+  }
+
+  /**
+   * @param id the database id
+   */
+  public void setId(Long id) {
+    this.id = id;
+  }
+
+  /**
+   * @return the mpack reference to the mpack associated with this service
+   */
+  public BlueprintMpackInstanceEntity getMpackReference() {
+    return mpackReference;
+  }
+
+  /**
+   * @param mpackReference the mpack reference to the mpack associated with this service
+   */
+  public void setMpackReference(BlueprintMpackInstanceEntity mpackReference) {
+    this.mpackReference = mpackReference;
+  }
+
+  /**
+   * @return the service instance level configuration entities
+   */
+  public Collection<BlueprintServiceConfigEntity> getConfigurations() {
+    return configurations;
+  }
+
+  /**
+   * @param configurations the service instance level configuration entities
+   */
+  public void setConfigurations(Collection<BlueprintServiceConfigEntity> configurations) {
+    this.configurations = configurations;
+  }
+
+  /**
+   * @return the name of this service instance
+   */
+  public String getName() {
+    return name;
+  }
+
+  /**
+   * @param name the name of this service instance
+   */
+  public void setName(String name) {
+    this.name = name;
+  }
+
+  /**
+   * @return the configuration type
+   */
+  public String getType() {
+    return type;
+  }
+
+  /**
+   * @param type the configuration type
+   */
+  public void setType(String type) {
+    this.type = type;
+  }
+}
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/HostGroupComponentEntity.java b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/HostGroupComponentEntity.java
index 6b75df7..f16ef40 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/HostGroupComponentEntity.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/HostGroupComponentEntity.java
@@ -20,36 +20,50 @@ package org.apache.ambari.server.orm.entities;
 
 import javax.persistence.Column;
 import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
 import javax.persistence.Id;
-import javax.persistence.IdClass;
 import javax.persistence.JoinColumn;
 import javax.persistence.JoinColumns;
 import javax.persistence.ManyToOne;
 import javax.persistence.Table;
+import javax.persistence.TableGenerator;
 
 /**
  * Represents a Host Group Component which is embedded in a Blueprint.
  */
-@IdClass(HostGroupComponentEntityPK.class)
-@Table(name = "hostgroup_component")
 @Entity
+@Table(name = "hostgroup_component")
+@TableGenerator(name = "hostgroup_component_id_generator", table = "ambari_sequences", pkColumnName = "sequence_name",
+  valueColumnName = "sequence_value", pkColumnValue = "hostgroup_component_id_seq", initialValue = 1)
 public class HostGroupComponentEntity {
 
   @Id
+  @GeneratedValue(strategy = GenerationType.TABLE, generator = "hostgroup_component_id_generator")
+  @Column(name = "id", nullable = false, updatable = false)
+  private Long id;
+
   @Column(name = "hostgroup_name", nullable = false, insertable = false, updatable = false)
   private String hostGroupName;
 
-  @Id
   @Column(name = "blueprint_name", nullable = false, insertable = false, updatable = false)
   private String blueprintName;
 
-  @Id
   @Column(name = "name", nullable = false, insertable = true, updatable = false)
   private String name;
 
   @Column(name = "provision_action", nullable = true, insertable = true, updatable = false)
   private String provisionAction;
 
+  @Column(name = "mpack_name", nullable = true, insertable = true, updatable = false)
+  private String mpackName;
+
+  @Column(name = "mpack_version", nullable = true, insertable = true, updatable = false)
+  private String mpackVersion;
+
+  @Column(name = "service_name", nullable = true, insertable = true, updatable = false)
+  private String serviceName;
+
   @ManyToOne
   @JoinColumns({
       @JoinColumn(name = "hostgroup_name", referencedColumnName = "name", nullable = false),
@@ -57,7 +71,6 @@ public class HostGroupComponentEntity {
   })
   private HostGroupEntity hostGroup;
 
-
   /**
    * Get the name of the host group component.
    *
@@ -149,4 +162,66 @@ public class HostGroupComponentEntity {
   public void setProvisionAction(String provisionAction) {
     this.provisionAction = provisionAction;
   }
+
+  /**
+   * @return the database id
+   */
+  public Long getId() {
+    return id;
+  }
+
+  /**
+   * @param id the database id
+   */
+  public void setId(Long id) {
+    this.id = id;
+  }
+
+  /**
+   * @return the name of the mpack defining this component
+   *         (only needs to be set if multiple mpack define the same component)
+   */
+  public String getMpackName() {
+    return mpackName;
+  }
+
+  /**
+   * @param mpackName the name of the mpack defining this component
+   *        (only needs to be set if multiple mpack define the same component)
+   */
+  public void setMpackName(String mpackName) {
+    this.mpackName = mpackName;
+  }
+
+  /**
+   * @return the version of the mpack defining this component
+   *         (only needs to be set if multiple mpack define the same component)
+   */
+  public String getMpackVersion() {
+    return mpackVersion;
+  }
+
+  /**
+   * @param mpackVersion the version of the mpack defining this component
+   *        (only needs to be set if multiple mpack define the same component)
+   */
+  public void setMpackVersion(String mpackVersion) {
+    this.mpackVersion = mpackVersion;
+  }
+
+  /**
+   * @return the name of the service instance defining this component
+   *         (only needs to be set if component resolution would be ambigous otherwise)
+   */
+  public String getServiceName() {
+    return serviceName;
+  }
+
+  /**
+   * @param serviceName the name of the service instance defining this component
+   *        (only needs to be set if component resolution would be ambigous otherwise)
+   */
+  public void setServiceName(String serviceName) {
+    this.serviceName = serviceName;
+  }
 }
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/HostGroupComponentEntityPK.java b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/HostGroupComponentEntityPK.java
deleted file mode 100644
index 0d99d79..0000000
--- a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/HostGroupComponentEntityPK.java
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ambari.server.orm.entities;
-
-import java.io.Serializable;
-
-import javax.persistence.Column;
-import javax.persistence.Id;
-
-/**
- * Composite primary key for HostGroupComponentEntity.
- */
-public class HostGroupComponentEntityPK implements Serializable {
-
-  @Id
-  @Column(name = "hostgroup_name", nullable = false, insertable = true, updatable = false, length = 100)
-  private String hostGroupName;
-
-  @Id
-  @Column(name = "blueprint_name", nullable = false, insertable = true, updatable = false, length = 100)
-  private String blueprintName;
-
-  @Id
-  @Column(name = "name", nullable = false, insertable = true, updatable = false, length = 100)
-  private String name;
-
-  /**
-   * Get the name of the associated host group.
-   *
-   * @return host group name
-   */
-  public String getHostGroupName() {
-    return hostGroupName;
-  }
-
-  /**
-   * Set the name of the associated host group.
-   *
-   * @param hostGroupName  host group name
-   */
-  public void setHostGroupName(String hostGroupName) {
-    this.hostGroupName = hostGroupName;
-  }
-
-  /**
-   * Get the name of the associated blueprint.
-   *
-   * @return blueprint name
-   */
-  public String getBlueprintName() {
-    return blueprintName;
-  }
-
-  /**
-   * Set the name of the associated blueprint.
-   *
-   * @param blueprintName  blueprint name
-   */
-  public void setBlueprintName(String blueprintName) {
-    this.blueprintName = blueprintName;
-  }
-
-  /**
-   * Get the name of the host group component.
-   *
-   * @return component name
-   */
-  public String getName() {
-    return name;
-  }
-
-  /**
-   * Set the name of the host group component.
-   *
-   * @param name  component name
-   */
-  public void setName(String name) {
-    this.name = name;
-  }
-
-  @Override
-  public boolean equals(Object o) {
-    if (this == o) return true;
-    if (o == null || getClass() != o.getClass()) return false;
-
-    HostGroupComponentEntityPK that = (HostGroupComponentEntityPK) o;
-
-    return this.hostGroupName.equals(that.hostGroupName) &&
-        this.name.equals(that.name) &&
-        this.blueprintName.equals(that.blueprintName);
-  }
-
-  @Override
-  public int hashCode() {
-    int result = hostGroupName.hashCode();
-    result = 31 * result + blueprintName.hashCode();
-    result = 31 * result + name.hashCode();
-    return result;
-  }
-}
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/HostGroupEntity.java b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/HostGroupEntity.java
index 8a170a5..a3e7952 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/HostGroupEntity.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/HostGroupEntity.java
@@ -18,6 +18,7 @@
 
 package org.apache.ambari.server.orm.entities;
 
+import java.util.ArrayList;
 import java.util.Collection;
 
 import javax.persistence.Basic;
@@ -51,10 +52,10 @@ public class HostGroupEntity {
   private String cardinality = "NOT SPECIFIED";
 
   @OneToMany(cascade = CascadeType.ALL, mappedBy = "hostGroup")
-  private Collection<HostGroupComponentEntity> components;
+  private Collection<HostGroupComponentEntity> components = new ArrayList<>();
 
   @OneToMany(cascade = CascadeType.ALL, mappedBy = "hostGroup")
-  private Collection<HostGroupConfigEntity> configurations;
+  private Collection<HostGroupConfigEntity> configurations = new ArrayList<>();
 
   @ManyToOne
   @JoinColumn(name = "blueprint_name", referencedColumnName = "blueprint_name", nullable = false)
@@ -108,7 +109,7 @@ public class HostGroupEntity {
 
   /**
    * Set the name of the associated blueprint.
-   * '
+   *
    * @param blueprintName  blueprint name
    */
   public void setBlueprintName(String blueprintName) {
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/topology/BlueprintImpl.java b/ambari-server/src/main/java/org/apache/ambari/server/topology/BlueprintImpl.java
index be3547a..1552a6c 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/topology/BlueprintImpl.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/topology/BlueprintImpl.java
@@ -66,8 +66,6 @@ public class BlueprintImpl implements Blueprint {
         null);
     }
 
-    parseStack(entity.getStack());
-
     // create config first because it is set as a parent on all host-group configs
     processConfiguration(entity.getConfigurations());
     parseBlueprintHostGroups(entity);
@@ -333,13 +331,6 @@ public class BlueprintImpl implements Blueprint {
       }
     }
 
-    //todo: not using stackDAO so stackEntity.id is not set
-    //todo: this is now being set in BlueprintDAO
-    StackEntity stackEntity = new StackEntity();
-    stackEntity.setStackName(stack.getName());
-    stackEntity.setStackVersion(stack.getVersion());
-    entity.setStack(stackEntity);
-
     createHostGroupEntities(entity);
     createBlueprintConfigEntities(entity);
     createBlueprintSettingEntities(entity);
diff --git a/ambari-server/src/main/resources/Ambari-DDL-Derby-CREATE.sql b/ambari-server/src/main/resources/Ambari-DDL-Derby-CREATE.sql
index f8260ef..997e6be 100644
--- a/ambari-server/src/main/resources/Ambari-DDL-Derby-CREATE.sql
+++ b/ambari-server/src/main/resources/Ambari-DDL-Derby-CREATE.sql
@@ -96,25 +96,6 @@ CREATE TABLE configuration_base (
   CONSTRAINT PK_configuration_base PRIMARY KEY (id)
 );
 
-CREATE TABLE clusterconfig (
-  config_id BIGINT NOT NULL,
-  version_tag VARCHAR(255) NOT NULL,
-  version BIGINT NOT NULL,
-  type_name VARCHAR(255) NOT NULL,
-  cluster_id BIGINT NOT NULL,
-  stack_id BIGINT NOT NULL,
-  selected SMALLINT NOT NULL DEFAULT 0,
-  config_data VARCHAR(3000) NOT NULL,
-  config_attributes VARCHAR(3000),
-  create_timestamp BIGINT NOT NULL,
-  unmapped SMALLINT NOT NULL DEFAULT 0,
-  selected_timestamp BIGINT NOT NULL DEFAULT 0,
-  CONSTRAINT PK_clusterconfig PRIMARY KEY (config_id),
-  CONSTRAINT FK_clusterconfig_cluster_id FOREIGN KEY (cluster_id) REFERENCES clusters (cluster_id),
-  CONSTRAINT FK_clusterconfig_stack_id FOREIGN KEY (stack_id) REFERENCES stack(stack_id),
-  CONSTRAINT UQ_config_type_tag UNIQUE (version_tag, type_name, cluster_id),
-  CONSTRAINT UQ_config_type_version UNIQUE (cluster_id, type_name, version));
-
 CREATE TABLE ambari_configuration (
   category_name VARCHAR(100) NOT NULL,
   property_name VARCHAR(100) NOT NULL,
@@ -617,9 +598,42 @@ CREATE TABLE blueprint (
   blueprint_name VARCHAR(255) NOT NULL,
   security_type VARCHAR(32) NOT NULL DEFAULT 'NONE',
   security_descriptor_reference VARCHAR(255),
-  stack_id BIGINT NOT NULL,
-  CONSTRAINT PK_blueprint PRIMARY KEY (blueprint_name),
-  CONSTRAINT FK_blueprint_stack_id FOREIGN KEY (stack_id) REFERENCES stack(stack_id));
+  CONSTRAINT PK_blueprint PRIMARY KEY (blueprint_name));
+
+CREATE TABLE blueprint_mpack_instance(
+  id BIGINT NOT NULL,
+  blueprint_name VARCHAR(255) NOT NULL,
+  mpack_name VARCHAR(255) NOT NULL,
+  mpack_version VARCHAR(255) NOT NULL,
+  mpack_uri VARCHAR(255) NOT NULL,
+  mpack_id BIGINT,
+  CONSTRAINT PK_blueprint_mpack_inst PRIMARY KEY (id),
+  CONSTRAINT FK_mpi_blueprint_name FOREIGN KEY (blueprint_name) REFERENCES blueprint(blueprint_name),
+  CONSTRAINT FK_mpi_mpack_id FOREIGN KEY (mpack_id) REFERENCES mpacks(id));
+
+CREATE TABLE blueprint_service (
+  id BIGINT NOT NULL,
+  mpack_ref_id BIGINT NOT NULL,
+  name VARCHAR(255) NOT NULL,
+  type VARCHAR(255) NOT NULL,
+  CONSTRAINT PK_blueprint_service PRIMARY KEY (id),
+  CONSTRAINT FK_blueprint_service_mpack_ref FOREIGN KEY (mpack_ref_id) REFERENCES blueprint_mpack_reference(id));
+
+CREATE TABLE blueprint_service_config (
+  service_id BIGINT NOT NULL,
+  type_name VARCHAR(255) NOT NULL,
+  config_data VARCHAR(3000) NOT NULL,
+  config_attributes VARCHAR(3000),
+  CONSTRAINT PK_bp_svc_conf PRIMARY KEY (service_id, type_name),
+  CONSTRAINT FK_bp_svc_config_to_service FOREIGN KEY (service_id) REFERENCES blueprint_service (id));
+
+CREATE TABLE blueprint_mpack_configuration (
+  mpack_ref_id BIGINT NOT NULL,
+  type_name VARCHAR(255) NOT NULL,
+  config_data VARCHAR(3000) NOT NULL,
+  config_attributes VARCHAR(3000),
+  CONSTRAINT PK_bp_mpack_conf PRIMARY KEY (mpack_ref_id, type_name),
+  CONSTRAINT FK_bp_mpack_config_to_mpack FOREIGN KEY (mpack_ref_id) REFERENCES blueprint_mpack_reference (id));
 
 CREATE TABLE hostgroup (
   blueprint_name VARCHAR(255) NOT NULL,
@@ -629,11 +643,15 @@ CREATE TABLE hostgroup (
   CONSTRAINT FK_hg_blueprint_name FOREIGN KEY (blueprint_name) REFERENCES blueprint(blueprint_name));
 
 CREATE TABLE hostgroup_component (
+  id BIGINT NOT NULL,
   blueprint_name VARCHAR(255) NOT NULL,
   hostgroup_name VARCHAR(255) NOT NULL,
   name VARCHAR(255) NOT NULL,
+  mpack_name VARCHAR(255),
+  mpack_version VARCHAR(100),
+  service_name VARCHAR(255),
   provision_action VARCHAR(255),
-  CONSTRAINT PK_hostgroup_component PRIMARY KEY (blueprint_name, hostgroup_name, name),
+  CONSTRAINT PK_hostgroup_component PRIMARY KEY (id),
   CONSTRAINT FK_hgc_blueprint_name FOREIGN KEY (blueprint_name, hostgroup_name) REFERENCES hostgroup (blueprint_name, name));
 
 CREATE TABLE blueprint_configuration (
@@ -1317,7 +1335,13 @@ INSERT INTO ambari_sequences (sequence_name, sequence_value)
   union all
   select 'servicecomponent_version_id_seq', 0 FROM SYSIBM.SYSDUMMY1
   union all
-  select 'hostcomponentdesiredstate_id_seq', 0 FROM SYSIBM.SYSDUMMY1;
+  select 'hostcomponentdesiredstate_id_seq', 0 FROM SYSIBM.SYSDUMMY1
+  union all
+  select 'blueprint_service_id_seq', 0 FROM SYSIBM.SYSDUMMY1
+  union all
+  select 'blueprint_mpack_instance_id_seq', 0 FROM SYSIBM.SYSDUMMY1
+  union all
+  select 'hostgroup_component_id_seq', 0 FROM SYSIBM.SYSDUMMY1;
 
 
 INSERT INTO adminresourcetype (resource_type_id, resource_type_name)
diff --git a/ambari-server/src/main/resources/Ambari-DDL-MySQL-CREATE.sql b/ambari-server/src/main/resources/Ambari-DDL-MySQL-CREATE.sql
index b7807bc..bc385de 100644
--- a/ambari-server/src/main/resources/Ambari-DDL-MySQL-CREATE.sql
+++ b/ambari-server/src/main/resources/Ambari-DDL-MySQL-CREATE.sql
@@ -115,25 +115,6 @@ CREATE TABLE configuration_base (
   CONSTRAINT PK_configuration_base PRIMARY KEY (id)
 );
 
-CREATE TABLE clusterconfig (
-  config_id BIGINT NOT NULL,
-  version_tag VARCHAR(100) NOT NULL,
-  version BIGINT NOT NULL,
-  type_name VARCHAR(100) NOT NULL,
-  cluster_id BIGINT NOT NULL,
-  stack_id BIGINT NOT NULL,
-  selected SMALLINT NOT NULL DEFAULT 0,
-  config_data LONGTEXT NOT NULL,
-  config_attributes LONGTEXT,
-  create_timestamp BIGINT NOT NULL,
-  unmapped SMALLINT NOT NULL DEFAULT 0,
-  selected_timestamp BIGINT NOT NULL DEFAULT 0,
-  CONSTRAINT PK_clusterconfig PRIMARY KEY (config_id),
-  CONSTRAINT FK_clusterconfig_cluster_id FOREIGN KEY (cluster_id) REFERENCES clusters (cluster_id),
-  CONSTRAINT FK_clusterconfig_stack_id FOREIGN KEY (stack_id) REFERENCES stack(stack_id),
-  CONSTRAINT UQ_config_type_tag UNIQUE (cluster_id, type_name, version_tag),
-  CONSTRAINT UQ_config_type_version UNIQUE (cluster_id, type_name, version));
-
 CREATE TABLE ambari_configuration (
   category_name VARCHAR(100) NOT NULL,
   property_name VARCHAR(100) NOT NULL,
@@ -633,11 +614,45 @@ CREATE TABLE requestschedulebatchrequest (
 
 CREATE TABLE blueprint (
   blueprint_name VARCHAR(100) NOT NULL,
-  stack_id BIGINT NOT NULL,
   security_type VARCHAR(32) NOT NULL DEFAULT 'NONE',
   security_descriptor_reference VARCHAR(255),
-  CONSTRAINT PK_blueprint PRIMARY KEY (blueprint_name),
-  CONSTRAINT FK_blueprint_stack_id FOREIGN KEY (stack_id) REFERENCES stack(stack_id));
+  CONSTRAINT PK_blueprint PRIMARY KEY (blueprint_name));
+
+CREATE TABLE blueprint_mpack_instance(
+  id BIGINT NOT NULL,
+  blueprint_name VARCHAR(255) NOT NULL,
+  mpack_name VARCHAR(255) NOT NULL,
+  mpack_version VARCHAR(255) NOT NULL,
+  mpack_uri VARCHAR(255) NOT NULL,
+  mpack_id BIGINT,
+  CONSTRAINT PK_blueprint_mpack_inst PRIMARY KEY (id),
+  CONSTRAINT FK_mpi_blueprint_name FOREIGN KEY (blueprint_name) REFERENCES blueprint(blueprint_name),
+  CONSTRAINT FK_mpi_mpack_id FOREIGN KEY (mpack_id) REFERENCES mpacks(id));
+
+
+CREATE TABLE blueprint_service (
+  id BIGINT NOT NULL,
+  mpack_ref_id BIGINT NOT NULL,
+  name VARCHAR(255) NOT NULL,
+  type VARCHAR(255) NOT NULL,
+  CONSTRAINT PK_blueprint_service PRIMARY KEY (id),
+  CONSTRAINT FK_blueprint_service_mpack_ref FOREIGN KEY (mpack_ref_id) REFERENCES blueprint_mpack_reference(id));
+
+CREATE TABLE blueprint_service_config (
+  service_id BIGINT NOT NULL,
+  type_name VARCHAR(255) NOT NULL,
+  config_data LONGTEXT NOT NULL,
+  config_attributes LONGTEXT,
+  CONSTRAINT PK_bp_svc_conf PRIMARY KEY (service_id, type_name),
+  CONSTRAINT FK_bp_svc_config_to_service FOREIGN KEY (service_id) REFERENCES blueprint_service (id));
+
+CREATE TABLE blueprint_mpack_configuration (
+  mpack_ref_id BIGINT NOT NULL,
+  type_name VARCHAR(255) NOT NULL,
+  config_data LONGTEXT NOT NULL,
+  config_attributes LONGTEXT,
+  CONSTRAINT PK_bp_mpack_conf PRIMARY KEY (mpack_ref_id, type_name),
+  CONSTRAINT FK_bp_mpack_config_to_mpack FOREIGN KEY (mpack_ref_id) REFERENCES blueprint_mpack_reference (id));
 
 CREATE TABLE hostgroup (
   blueprint_name VARCHAR(100) NOT NULL,
@@ -647,12 +662,16 @@ CREATE TABLE hostgroup (
   CONSTRAINT FK_hg_blueprint_name FOREIGN KEY (blueprint_name) REFERENCES blueprint(blueprint_name));
 
 CREATE TABLE hostgroup_component (
-  blueprint_name VARCHAR(100) NOT NULL,
-  hostgroup_name VARCHAR(100) NOT NULL,
-  name VARCHAR(100) NOT NULL,
-  provision_action VARCHAR(100),
-  CONSTRAINT PK_hostgroup_component PRIMARY KEY (blueprint_name, hostgroup_name, name),
-  CONSTRAINT FK_hgc_blueprint_name FOREIGN KEY (blueprint_name, hostgroup_name) REFERENCES hostgroup(blueprint_name, name));
+  id BIGINT NOT NULL,
+  blueprint_name VARCHAR(255) NOT NULL,
+  hostgroup_name VARCHAR(255) NOT NULL,
+  name VARCHAR(255) NOT NULL,
+  mpack_name VARCHAR(255),
+  mpack_version VARCHAR(100),
+  service_name VARCHAR(255),
+  provision_action VARCHAR(255),
+  CONSTRAINT PK_hostgroup_component PRIMARY KEY (id),
+  CONSTRAINT FK_hgc_blueprint_name FOREIGN KEY (blueprint_name, hostgroup_name) REFERENCES hostgroup (blueprint_name, name));
 
 CREATE TABLE blueprint_configuration (
   blueprint_name VARCHAR(100) NOT NULL,
@@ -1272,7 +1291,10 @@ INSERT INTO ambari_sequences(sequence_name, sequence_value) VALUES
   ('remote_cluster_id_seq', 0),
   ('remote_cluster_service_id_seq', 0),
   ('servicecomponent_version_id_seq', 0),
-  ('hostcomponentdesiredstate_id_seq', 0);
+  ('hostcomponentdesiredstate_id_seq', 0),
+  ('blueprint_service_id_seq', 0),
+  ('blueprint_mpack_instance_id_seq', 0),
+  ('hostgroup_component_id_seq', 0);
 
 INSERT INTO adminresourcetype (resource_type_id, resource_type_name) VALUES
   (1, 'AMBARI'),
diff --git a/ambari-server/src/main/resources/Ambari-DDL-Oracle-CREATE.sql b/ambari-server/src/main/resources/Ambari-DDL-Oracle-CREATE.sql
index c4d94d4..04969d8 100644
--- a/ambari-server/src/main/resources/Ambari-DDL-Oracle-CREATE.sql
+++ b/ambari-server/src/main/resources/Ambari-DDL-Oracle-CREATE.sql
@@ -18,7 +18,7 @@
 
 ------create tables---------
 CREATE TABLE registries (
- id BIGINT NOT NULL,
+ id NUMBER(19) NOT NULL,
  registry_name VARCHAR(255) NOT NULL,
  registry_type VARCHAR(255) NOT NULL,
  registry_uri VARCHAR(255) NOT NULL,
@@ -26,11 +26,11 @@ CREATE TABLE registries (
  CONSTRAINT UQ_registry_name UNIQUE (registry_name));
 
 CREATE TABLE mpacks (
- id BIGINT NOT NULL,
+ id NUMBER(19) NOT NULL,
  mpack_name VARCHAR(255) NOT NULL,
  mpack_version VARCHAR(255) NOT NULL,
  mpack_uri VARCHAR(255),
- registry_id BIGINT,
+ registry_id NUMBER(19),
  CONSTRAINT PK_mpacks PRIMARY KEY (id),
  CONSTRAINT UQ_mpack_name_version UNIQUE(mpack_name, mpack_version),
  CONSTRAINT FK_registries FOREIGN KEY (registry_id) REFERENCES registries(id));
@@ -39,7 +39,7 @@ CREATE TABLE stack (
   stack_id NUMBER(19) NOT NULL,
   stack_name VARCHAR2(255) NOT NULL,
   stack_version VARCHAR2(255) NOT NULL,
-  current_mpack_id BIGINT,
+  current_mpack_id NUMBER(19),
   CONSTRAINT PK_stack PRIMARY KEY (stack_id),
   CONSTRAINT FK_mpacks FOREIGN KEY (current_mpack_id) REFERENCES mpacks(id),
   CONSTRAINT UQ_stack UNIQUE (stack_name, stack_version));
@@ -96,25 +96,6 @@ CREATE TABLE configuration_base (
   CONSTRAINT PK_configuration_base PRIMARY KEY (id)
 );
 
-CREATE TABLE clusterconfig (
-  config_id NUMBER(19) NOT NULL,
-  version_tag VARCHAR2(255) NOT NULL,
-  version NUMBER(19) NOT NULL,
-  type_name VARCHAR2(255) NOT NULL,
-  cluster_id NUMBER(19) NOT NULL,
-  stack_id NUMBER(19) NOT NULL,
-  selected NUMBER(1) DEFAULT 0 NOT NULL,
-  config_data CLOB NOT NULL,
-  config_attributes CLOB,
-  create_timestamp NUMBER(19) NOT NULL,
-  unmapped SMALLINT DEFAULT 0 NOT NULL,
-  selected_timestamp NUMBER(19) DEFAULT 0 NOT NULL,
-  CONSTRAINT PK_clusterconfig PRIMARY KEY (config_id),
-  CONSTRAINT FK_clusterconfig_cluster_id FOREIGN KEY (cluster_id) REFERENCES clusters (cluster_id),
-  CONSTRAINT FK_clusterconfig_stack_id FOREIGN KEY (stack_id) REFERENCES stack(stack_id),
-  CONSTRAINT UQ_config_type_tag UNIQUE (cluster_id, type_name, version_tag),
-  CONSTRAINT UQ_config_type_version UNIQUE (cluster_id, type_name, version));
-
 CREATE TABLE ambari_configuration (
   category_name VARCHAR2(100) NOT NULL,
   property_name VARCHAR2(100) NOT NULL,
@@ -191,7 +172,7 @@ CREATE TABLE clusterconfig (
   create_timestamp NUMBER(19) NOT NULL,
   unmapped SMALLINT DEFAULT 0 NOT NULL,
   selected_timestamp NUMBER(19) DEFAULT 0 NOT NULL,
-  service_id BIGINT,
+  service_id NUMBER(19),
   CONSTRAINT PK_clusterconfig PRIMARY KEY (config_id),
   CONSTRAINT FK_clusterconfig_cluster_id FOREIGN KEY (cluster_id) REFERENCES clusters (cluster_id),
   CONSTRAINT FK_clusterconfig_stack_id FOREIGN KEY (stack_id) REFERENCES stack(stack_id),
@@ -613,11 +594,44 @@ CREATE TABLE requestschedulebatchrequest (
 
 CREATE TABLE blueprint (
   blueprint_name VARCHAR2(255) NOT NULL,
-  stack_id NUMBER(19) NOT NULL,
   security_type VARCHAR2(32) DEFAULT 'NONE' NOT NULL,
-  security_descriptor_reference VARCHAR(255),
-  CONSTRAINT PK_blueprint PRIMARY KEY (blueprint_name),
-  CONSTRAINT FK_blueprint_stack_id FOREIGN KEY (stack_id) REFERENCES stack(stack_id));
+  security_descriptor_reference VARCHAR2(255),
+  CONSTRAINT PK_blueprint PRIMARY KEY (blueprint_name));
+
+CREATE TABLE blueprint_mpack_instance(
+  id NUMBER(19) NOT NULL,
+  blueprint_name VARCHAR2(255) NOT NULL,
+  mpack_name VARCHAR2(255) NOT NULL,
+  mpack_version VARCHAR2(255) NOT NULL,
+  mpack_uri VARCHAR2(255) NOT NULL,
+  mpack_id NUMBER(19),
+  CONSTRAINT PK_blueprint_mpack_inst PRIMARY KEY (id),
+  CONSTRAINT FK_mpi_blueprint_name FOREIGN KEY (blueprint_name) REFERENCES blueprint(blueprint_name),
+  CONSTRAINT FK_mpi_mpack_id FOREIGN KEY (mpack_id) REFERENCES mpacks(id));
+
+CREATE TABLE blueprint_service (
+  id NUMBER(19) NOT NULL,
+  mpack_ref_id NUMBER(19) NOT NULL,
+  name VARCHAR2(255) NOT NULL,
+  type VARCHAR2(255) NOT NULL,
+  CONSTRAINT PK_blueprint_service PRIMARY KEY (id),
+  CONSTRAINT FK_blueprint_service_mpack_ref FOREIGN KEY (mpack_ref_id) REFERENCES blueprint_mpack_reference(id));
+
+CREATE TABLE blueprint_service_config (
+  service_id NUMBER(19) NOT NULL,
+  type_name VARCHAR2(255) NOT NULL,
+  config_data CLOB NOT NULL,
+  config_attributes CLOB,
+  CONSTRAINT PK_bp_svc_conf PRIMARY KEY (service_id, type_name),
+  CONSTRAINT FK_bp_svc_config_to_service FOREIGN KEY (service_id) REFERENCES blueprint_service (id));
+
+CREATE TABLE blueprint_mpack_configuration (
+  mpack_ref_id NUMBER(19) NOT NULL,
+  type_name VARCHAR2(255) NOT NULL,
+  config_data CLOB NOT NULL,
+  config_attributes CLOB,
+  CONSTRAINT PK_bp_mpack_conf PRIMARY KEY (mpack_ref_id, type_name),
+  CONSTRAINT FK_bp_mpack_config_to_mpack FOREIGN KEY (mpack_ref_id) REFERENCES blueprint_mpack_reference (id));
 
 CREATE TABLE hostgroup (
   blueprint_name VARCHAR2(255) NOT NULL,
@@ -627,12 +641,16 @@ CREATE TABLE hostgroup (
   CONSTRAINT FK_hg_blueprint_name FOREIGN KEY (blueprint_name) REFERENCES blueprint(blueprint_name));
 
 CREATE TABLE hostgroup_component (
+  id NUMBER(19) NOT NULL,
   blueprint_name VARCHAR2(255) NOT NULL,
   hostgroup_name VARCHAR2(255) NOT NULL,
   name VARCHAR2(255) NOT NULL,
+  mpack_name VARCHAR2(255),
+  mpack_version VARCHAR2(100),
+  service_name VARCHAR2(255),
   provision_action VARCHAR2(255),
-  CONSTRAINT PK_hostgroup_component PRIMARY KEY (blueprint_name, hostgroup_name, name),
-  CONSTRAINT FK_hgc_blueprint_name FOREIGN KEY (blueprint_name, hostgroup_name) REFERENCES hostgroup(blueprint_name, name));
+  CONSTRAINT PK_hostgroup_component PRIMARY KEY (id),
+  CONSTRAINT FK_hgc_blueprint_name FOREIGN KEY (blueprint_name, hostgroup_name) REFERENCES hostgroup (blueprint_name, name));
 
 CREATE TABLE blueprint_configuration (
   blueprint_name VARCHAR2(255) NOT NULL,
@@ -1251,6 +1269,9 @@ INSERT INTO ambari_sequences(sequence_name, sequence_value) values ('remote_clus
 INSERT INTO ambari_sequences(sequence_name, sequence_value) values ('remote_cluster_service_id_seq', 0);
 INSERT INTO ambari_sequences(sequence_name, sequence_value) values ('servicecomponent_version_id_seq', 0);
 INSERT INTO ambari_sequences(sequence_name, sequence_value) values ('hostcomponentdesiredstate_id_seq', 0);
+INSERT INTO ambari_sequences(sequence_name, sequence_value) values ('blueprint_service_id_seq', 0);
+INSERT INTO ambari_sequences(sequence_name, sequence_value) values ('blueprint_mpack_instance_id_seq', 0);
+INSERT INTO ambari_sequences(sequence_name, sequence_value) values ('hostgroup_component_id_seq', 0);
 
 INSERT INTO metainfo("metainfo_key", "metainfo_value") values ('version', '${ambariSchemaVersion}');
 
diff --git a/ambari-server/src/main/resources/Ambari-DDL-Postgres-CREATE.sql b/ambari-server/src/main/resources/Ambari-DDL-Postgres-CREATE.sql
index 6044262..2ef9ed6 100644
--- a/ambari-server/src/main/resources/Ambari-DDL-Postgres-CREATE.sql
+++ b/ambari-server/src/main/resources/Ambari-DDL-Postgres-CREATE.sql
@@ -586,9 +586,42 @@ CREATE TABLE blueprint (
   blueprint_name VARCHAR(255) NOT NULL,
   security_type VARCHAR(32) NOT NULL DEFAULT 'NONE',
   security_descriptor_reference VARCHAR(255),
-  stack_id BIGINT NOT NULL,
-  CONSTRAINT PK_blueprint PRIMARY KEY (blueprint_name),
-  CONSTRAINT FK_blueprint_stack_id FOREIGN KEY (stack_id) REFERENCES stack(stack_id));
+  CONSTRAINT PK_blueprint PRIMARY KEY (blueprint_name));
+
+CREATE TABLE blueprint_mpack_instance(
+  id BIGINT NOT NULL,
+  blueprint_name VARCHAR(255) NOT NULL,
+  mpack_name VARCHAR(255) NOT NULL,
+  mpack_version VARCHAR(255) NOT NULL,
+  mpack_uri VARCHAR(255) NOT NULL,
+  mpack_id BIGINT,
+  CONSTRAINT PK_blueprint_mpack_inst PRIMARY KEY (id),
+  CONSTRAINT FK_mpi_blueprint_name FOREIGN KEY (blueprint_name) REFERENCES blueprint(blueprint_name),
+  CONSTRAINT FK_mpi_mpack_id FOREIGN KEY (mpack_id) REFERENCES mpacks(id));
+
+CREATE TABLE blueprint_service (
+  id BIGINT NOT NULL,
+  mpack_ref_id BIGINT NOT NULL,
+  name VARCHAR(255) NOT NULL,
+  type VARCHAR(255) NOT NULL,
+  CONSTRAINT PK_blueprint_service PRIMARY KEY (id),
+  CONSTRAINT FK_blueprint_service_mpack_ref FOREIGN KEY (mpack_ref_id) REFERENCES blueprint_mpack_reference(id));
+
+CREATE TABLE blueprint_service_config (
+  service_id BIGINT NOT NULL,
+  type_name VARCHAR(255) NOT NULL,
+  config_data TEXT NOT NULL,
+  config_attributes TEXT,
+  CONSTRAINT PK_bp_svc_conf PRIMARY KEY (service_id, type_name),
+  CONSTRAINT FK_bp_svc_config_to_service FOREIGN KEY (service_id) REFERENCES blueprint_service (id));
+
+CREATE TABLE blueprint_mpack_configuration (
+  mpack_ref_id BIGINT NOT NULL,
+  type_name VARCHAR(255) NOT NULL,
+  config_data TEXT NOT NULL,
+  config_attributes TEXT,
+  CONSTRAINT PK_bp_mpack_conf PRIMARY KEY (mpack_ref_id, type_name),
+  CONSTRAINT FK_bp_mpack_config_to_mpack FOREIGN KEY (mpack_ref_id) REFERENCES blueprint_mpack_reference (id));
 
 CREATE TABLE hostgroup (
   blueprint_name VARCHAR(255) NOT NULL,
@@ -598,11 +631,15 @@ CREATE TABLE hostgroup (
   CONSTRAINT FK_hg_blueprint_name FOREIGN KEY (blueprint_name) REFERENCES blueprint(blueprint_name));
 
 CREATE TABLE hostgroup_component (
+  id BIGINT NOT NULL,
   blueprint_name VARCHAR(255) NOT NULL,
   hostgroup_name VARCHAR(255) NOT NULL,
   name VARCHAR(255) NOT NULL,
+  mpack_name VARCHAR(255),
+  mpack_version VARCHAR(100),
+  service_name VARCHAR(255),
   provision_action VARCHAR(255),
-  CONSTRAINT PK_hostgroup_component PRIMARY KEY (blueprint_name, hostgroup_name, name),
+  CONSTRAINT PK_hostgroup_component PRIMARY KEY (id),
   CONSTRAINT FK_hgc_blueprint_name FOREIGN KEY (blueprint_name, hostgroup_name) REFERENCES hostgroup (blueprint_name, name));
 
 CREATE TABLE blueprint_configuration (
@@ -1223,7 +1260,10 @@ INSERT INTO ambari_sequences (sequence_name, sequence_value) VALUES
   ('remote_cluster_id_seq', 0),
   ('remote_cluster_service_id_seq', 0),
   ('servicecomponent_version_id_seq', 0),
-  ('hostcomponentdesiredstate_id_seq', 0);
+  ('hostcomponentdesiredstate_id_seq', 0),
+  ('blueprint_service_id_seq', 0),
+  ('blueprint_mpack_instance_id_seq', 0),
+  ('hostgroup_component_id_seq', 0);
 
 INSERT INTO adminresourcetype (resource_type_id, resource_type_name) VALUES
   (1, 'AMBARI'),
diff --git a/ambari-server/src/main/resources/Ambari-DDL-SQLAnywhere-CREATE.sql b/ambari-server/src/main/resources/Ambari-DDL-SQLAnywhere-CREATE.sql
index b9a4f0e..36ef59f 100644
--- a/ambari-server/src/main/resources/Ambari-DDL-SQLAnywhere-CREATE.sql
+++ b/ambari-server/src/main/resources/Ambari-DDL-SQLAnywhere-CREATE.sql
@@ -95,25 +95,6 @@ CREATE TABLE configuration_base (
   CONSTRAINT PK_configuration_base PRIMARY KEY (id)
 );
 
-CREATE TABLE clusterconfig (
-  config_id NUMERIC(19) NOT NULL,
-  version_tag VARCHAR(255) NOT NULL,
-  version NUMERIC(19) NOT NULL,
-  type_name VARCHAR(255) NOT NULL,
-  cluster_id NUMERIC(19) NOT NULL,
-  stack_id NUMERIC(19) NOT NULL,
-  selected SMALLINT NOT NULL DEFAULT 0,
-  config_data TEXT NOT NULL,
-  config_attributes TEXT,
-  create_timestamp NUMERIC(19) NOT NULL,
-  unmapped SMALLINT NOT NULL DEFAULT 0,
-  selected_timestamp NUMERIC(19) NOT NULL DEFAULT 0,
-  CONSTRAINT PK_clusterconfig PRIMARY KEY (config_id),
-  CONSTRAINT FK_clusterconfig_cluster_id FOREIGN KEY (cluster_id) REFERENCES clusters (cluster_id),
-  CONSTRAINT FK_clusterconfig_stack_id FOREIGN KEY (stack_id) REFERENCES stack(stack_id),
-  CONSTRAINT UQ_config_type_tag UNIQUE (cluster_id, type_name, version_tag),
-  CONSTRAINT UQ_config_type_version UNIQUE (cluster_id, type_name, version));
-
 CREATE TABLE ambari_configuration (
   category_name VARCHAR(100) NOT NULL,
   property_name VARCHAR(100) NOT NULL,
@@ -610,11 +591,44 @@ CREATE TABLE requestschedulebatchrequest (
 
 CREATE TABLE blueprint (
   blueprint_name VARCHAR(255) NOT NULL,
-  stack_id NUMERIC(19) NOT NULL,
   security_type VARCHAR(32) NOT NULL DEFAULT 'NONE',
   security_descriptor_reference VARCHAR(255),
-  CONSTRAINT PK_blueprint PRIMARY KEY (blueprint_name),
-  CONSTRAINT FK_blueprint_stack_id FOREIGN KEY (stack_id) REFERENCES stack(stack_id));
+  CONSTRAINT PK_blueprint PRIMARY KEY (blueprint_name));
+
+CREATE TABLE blueprint_mpack_instance(
+  id NUMERIC(19) NOT NULL,
+  blueprint_name VARCHAR(255) NOT NULL,
+  mpack_name VARCHAR(255) NOT NULL,
+  mpack_version VARCHAR(255) NOT NULL,
+  mpack_uri VARCHAR(255) NOT NULL,
+  mpack_id NUMERIC(19),
+  CONSTRAINT PK_blueprint_mpack_inst PRIMARY KEY (id),
+  CONSTRAINT FK_mpi_blueprint_name FOREIGN KEY (blueprint_name) REFERENCES blueprint(blueprint_name),
+  CONSTRAINT FK_mpi_mpack_id FOREIGN KEY (mpack_id) REFERENCES mpacks(id));
+
+CREATE TABLE blueprint_service (
+  id NUMERIC(19) NOT NULL,
+  mpack_ref_id BIGINT NOT NULL,
+  name VARCHAR(255) NOT NULL,
+  type VARCHAR(255) NOT NULL,
+  CONSTRAINT PK_blueprint_service PRIMARY KEY (id),
+  CONSTRAINT FK_blueprint_service_mpack_ref FOREIGN KEY (mpack_ref_id) REFERENCES blueprint_mpack_reference(id));
+
+CREATE TABLE blueprint_service_config (
+  service_id NUMERIC(19) NOT NULL,
+  type_name VARCHAR(255) NOT NULL,
+  config_data TEXT NOT NULL,
+  config_attributes TEXT,
+  CONSTRAINT PK_bp_svc_conf PRIMARY KEY (service_id, type_name),
+  CONSTRAINT FK_bp_svc_config_to_service FOREIGN KEY (service_id) REFERENCES blueprint_service (id));
+
+CREATE TABLE blueprint_mpack_configuration (
+  mpack_ref_id NUMERIC(19) NOT NULL,
+  type_name VARCHAR(255) NOT NULL,
+  config_data TEXT NOT NULL,
+  config_attributes TEXT,
+  CONSTRAINT PK_bp_mpack_conf PRIMARY KEY (mpack_ref_id, type_name),
+  CONSTRAINT FK_bp_mpack_config_to_mpack FOREIGN KEY (mpack_ref_id) REFERENCES blueprint_mpack_reference (id));
 
 CREATE TABLE hostgroup (
   blueprint_name VARCHAR(255) NOT NULL,
@@ -624,12 +638,16 @@ CREATE TABLE hostgroup (
   CONSTRAINT FK_hg_blueprint_name FOREIGN KEY (blueprint_name) REFERENCES blueprint(blueprint_name));
 
 CREATE TABLE hostgroup_component (
+  id NUMERIC(19) NOT NULL,
   blueprint_name VARCHAR(255) NOT NULL,
   hostgroup_name VARCHAR(255) NOT NULL,
   name VARCHAR(255) NOT NULL,
+  mpack_name VARCHAR(255),
+  mpack_version VARCHAR(100),
+  service_name VARCHAR(255),
   provision_action VARCHAR(255),
-  CONSTRAINT PK_hostgroup_component PRIMARY KEY (blueprint_name, hostgroup_name, name),
-  CONSTRAINT FK_hgc_blueprint_name FOREIGN KEY (blueprint_name, hostgroup_name) REFERENCES hostgroup(blueprint_name, name));
+  CONSTRAINT PK_hostgroup_component PRIMARY KEY (id),
+  CONSTRAINT FK_hgc_blueprint_name FOREIGN KEY (blueprint_name, hostgroup_name) REFERENCES hostgroup (blueprint_name, name));
 
 CREATE TABLE blueprint_configuration (
   blueprint_name VARCHAR(255) NOT NULL,
@@ -1250,6 +1268,9 @@ INSERT INTO ambari_sequences(sequence_name, sequence_value) values ('remote_clus
 INSERT INTO ambari_sequences(sequence_name, sequence_value) values ('remote_cluster_service_id_seq', 0);
 INSERT INTO ambari_sequences(sequence_name, sequence_value) values ('servicecomponent_version_id_seq', 0);
 INSERT INTO ambari_sequences(sequence_name, sequence_value) values ('hostcomponentdesiredstate_id_seq', 0);
+INSERT INTO ambari_sequences(sequence_name, sequence_value) values ('blueprint_service_id_seq', 0);
+INSERT INTO ambari_sequences(sequence_name, sequence_value) values ('blueprint_mpack_instance_id_seq', 0);
+INSERT INTO ambari_sequences(sequence_name, sequence_value) values ('hostgroup_component_id_seq', 0);
 
 insert into adminresourcetype (resource_type_id, resource_type_name)
   select 1, 'AMBARI'
diff --git a/ambari-server/src/main/resources/Ambari-DDL-SQLServer-CREATE.sql b/ambari-server/src/main/resources/Ambari-DDL-SQLServer-CREATE.sql
index fe9e987..43ef059 100644
--- a/ambari-server/src/main/resources/Ambari-DDL-SQLServer-CREATE.sql
+++ b/ambari-server/src/main/resources/Ambari-DDL-SQLServer-CREATE.sql
@@ -109,25 +109,6 @@ CREATE TABLE configuration_base (
   CONSTRAINT PK_configuration_base PRIMARY KEY (id)
 );
 
-CREATE TABLE clusterconfig (
-  config_id BIGINT NOT NULL,
-  version_tag VARCHAR(255) NOT NULL,
-  version BIGINT NOT NULL,
-  type_name VARCHAR(255) NOT NULL,
-  cluster_id BIGINT NOT NULL,
-  stack_id BIGINT NOT NULL,
-  selected SMALLINT NOT NULL DEFAULT 0,
-  config_data VARCHAR(MAX) NOT NULL,
-  config_attributes VARCHAR(MAX),
-  create_timestamp BIGINT NOT NULL,
-  unmapped SMALLINT NOT NULL DEFAULT 0,
-  selected_timestamp BIGINT NOT NULL DEFAULT 0,
-  CONSTRAINT PK_clusterconfig PRIMARY KEY CLUSTERED (config_id),
-  CONSTRAINT FK_clusterconfig_cluster_id FOREIGN KEY (cluster_id) REFERENCES clusters (cluster_id),
-  CONSTRAINT FK_clusterconfig_stack_id FOREIGN KEY (stack_id) REFERENCES stack(stack_id),
-  CONSTRAINT UQ_config_type_tag UNIQUE (cluster_id, type_name, version_tag),
-  CONSTRAINT UQ_config_type_version UNIQUE (cluster_id, type_name, version));
-
 CREATE TABLE ambari_configuration (
   category_name VARCHAR(100) NOT NULL,
   property_name VARCHAR(100) NOT NULL,
@@ -310,9 +291,9 @@ CREATE TABLE hostcomponentdesiredstate (
   maintenance_state VARCHAR(32) NOT NULL,
   restart_required BIT NOT NULL DEFAULT 0,
   CONSTRAINT PK_hostcomponentdesiredstate PRIMARY KEY CLUSTERED (id),
-  CONSTRAINT UQ_hcdesiredstate_name UNIQUE (component_name, service_name, host_id, cluster_id),
+  CONSTRAINT UQ_hcdesiredstate_name UNIQUE (component_name, service_id, host_id, cluster_id),
   CONSTRAINT FK_hcdesiredstate_host_id FOREIGN KEY (host_id) REFERENCES hosts (host_id),
-  CONSTRAINT hstcmpnntdesiredstatecmpnntnme FOREIGN KEY (component_name, service_name, cluster_id) REFERENCES servicecomponentdesiredstate (component_name, service_name, cluster_id));
+  CONSTRAINT hstcmpnntdesiredstatecmpnntnme FOREIGN KEY (component_name, service_id, cluster_id) REFERENCES servicecomponentdesiredstate (component_name, service_id, cluster_id));
 
 CREATE TABLE hostcomponentstate (
   id BIGINT NOT NULL,
@@ -619,11 +600,44 @@ CREATE TABLE requestschedulebatchrequest (
 
 CREATE TABLE blueprint (
   blueprint_name VARCHAR(255) NOT NULL,
-  stack_id BIGINT NOT NULL,
   security_type VARCHAR(32) NOT NULL DEFAULT 'NONE',
   security_descriptor_reference VARCHAR(255),
-  CONSTRAINT PK_blueprint PRIMARY KEY CLUSTERED (blueprint_name),
-  CONSTRAINT FK_blueprint_stack_id FOREIGN KEY (stack_id) REFERENCES stack(stack_id));
+  CONSTRAINT PK_blueprint PRIMARY KEY CLUSTERED (blueprint_name));
+
+CREATE TABLE blueprint_mpack_instance(
+  id BIGINT NOT NULL,
+  blueprint_name VARCHAR(255) NOT NULL,
+  mpack_name VARCHAR(255) NOT NULL,
+  mpack_version VARCHAR(255) NOT NULL,
+  mpack_uri VARCHAR(255) NOT NULL,
+  mpack_id BIGINT,
+  CONSTRAINT PK_blueprint_mpack_inst PRIMARY KEY (id),
+  CONSTRAINT FK_mpi_blueprint_name FOREIGN KEY (blueprint_name) REFERENCES blueprint(blueprint_name),
+  CONSTRAINT FK_mpi_mpack_id FOREIGN KEY (mpack_id) REFERENCES mpacks(id));
+
+CREATE TABLE blueprint_service (
+  id BIGINT NOT NULL,
+  mpack_ref_id BIGINT NOT NULL,
+  name VARCHAR(255) NOT NULL,
+  type VARCHAR(255) NOT NULL,
+  CONSTRAINT PK_blueprint_service PRIMARY KEY (id),
+  CONSTRAINT FK_blueprint_service_mpack_ref FOREIGN KEY (mpack_ref_id) REFERENCES blueprint_mpack_reference(id));
+
+CREATE TABLE blueprint_service_config (
+  service_id BIGINT NOT NULL,
+  type_name VARCHAR(255) NOT NULL,
+  config_data TEXT NOT NULL,
+  config_attributes TEXT,
+  CONSTRAINT PK_bp_svc_conf PRIMARY KEY (service_id, type_name),
+  CONSTRAINT FK_bp_svc_config_to_service FOREIGN KEY (service_id) REFERENCES blueprint_service (id));
+
+CREATE TABLE blueprint_mpack_configuration (
+  mpack_ref_id BIGINT NOT NULL,
+  type_name VARCHAR(255) NOT NULL,
+  config_data TEXT NOT NULL,
+  config_attributes TEXT,
+  CONSTRAINT PK_bp_mpack_conf PRIMARY KEY (mpack_ref_id, type_name),
+  CONSTRAINT FK_bp_mpack_config_to_mpack FOREIGN KEY (mpack_ref_id) REFERENCES blueprint_mpack_reference (id));
 
 CREATE TABLE hostgroup (
   blueprint_name VARCHAR(255) NOT NULL,
@@ -633,13 +647,18 @@ CREATE TABLE hostgroup (
   CONSTRAINT FK_hg_blueprint_name FOREIGN KEY (blueprint_name) REFERENCES blueprint(blueprint_name));
 
 CREATE TABLE hostgroup_component (
+  id BIGINT NOT NULL,
   blueprint_name VARCHAR(255) NOT NULL,
   hostgroup_name VARCHAR(255) NOT NULL,
-  NAME VARCHAR(255) NOT NULL,
+  name VARCHAR(255) NOT NULL,
+  mpack_name VARCHAR(255),
+  mpack_version VARCHAR(100),
+  service_name VARCHAR(255),
   provision_action VARCHAR(255),
-  CONSTRAINT PK_hostgroup_component PRIMARY KEY CLUSTERED (blueprint_name, hostgroup_name, NAME),
+  CONSTRAINT PK_hostgroup_component PRIMARY KEY CLUSTERED (id),
   CONSTRAINT FK_hgc_blueprint_name FOREIGN KEY (blueprint_name, hostgroup_name) REFERENCES hostgroup (blueprint_name, name));
 
+
 CREATE TABLE blueprint_configuration (
   blueprint_name VARCHAR(255) NOT NULL,
   type_name VARCHAR(255) NOT NULL,
@@ -1276,7 +1295,10 @@ BEGIN TRANSACTION
     ('remote_cluster_id_seq', 0),
     ('remote_cluster_service_id_seq', 0),
     ('servicecomponent_version_id_seq', 0),
-    ('hostcomponentdesiredstate_id_seq', 0);
+    ('hostcomponentdesiredstate_id_seq', 0),
+    ('blueprint_service_id_seq', 0),
+    ('blueprint_mpack_instance_id_seq', 0),
+    ('hostgroup_component_id_seq', 0);
 
   insert into adminresourcetype (resource_type_id, resource_type_name)
   values
diff --git a/ambari-server/src/main/resources/META-INF/persistence.xml b/ambari-server/src/main/resources/META-INF/persistence.xml
index 9c99341..6f930b1 100644
--- a/ambari-server/src/main/resources/META-INF/persistence.xml
+++ b/ambari-server/src/main/resources/META-INF/persistence.xml
@@ -23,6 +23,10 @@
     <class>org.apache.ambari.server.orm.entities.BlueprintConfigEntity</class>
     <class>org.apache.ambari.server.orm.entities.BlueprintSettingEntity</class>
     <class>org.apache.ambari.server.orm.entities.BlueprintEntity</class>
+    <class>org.apache.ambari.server.orm.entities.BlueprintMpackInstanceEntity</class>
+    <class>org.apache.ambari.server.orm.entities.BlueprintMpackConfigEntity</class>
+    <class>org.apache.ambari.server.orm.entities.BlueprintServiceEntity</class>
+    <class>org.apache.ambari.server.orm.entities.BlueprintServiceConfigEntity</class>
     <class>org.apache.ambari.server.orm.entities.ClusterConfigEntity</class>
     <class>org.apache.ambari.server.orm.entities.ClusterEntity</class>
     <class>org.apache.ambari.server.orm.entities.ServiceGroupEntity</class>
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/BlueprintResourceProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/BlueprintResourceProviderTest.java
index c7b8d71..6f81ce5 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/BlueprintResourceProviderTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/BlueprintResourceProviderTest.java
@@ -19,7 +19,6 @@
 package org.apache.ambari.server.controller.internal;
 
 import static org.easymock.EasyMock.anyBoolean;
-import static org.easymock.EasyMock.anyObject;
 import static org.easymock.EasyMock.createMock;
 import static org.easymock.EasyMock.createNiceMock;
 import static org.easymock.EasyMock.createStrictMock;
@@ -62,14 +61,13 @@ import org.apache.ambari.server.controller.spi.ResourceProvider;
 import org.apache.ambari.server.controller.spi.SystemException;
 import org.apache.ambari.server.controller.spi.UnsupportedPropertyException;
 import org.apache.ambari.server.orm.dao.BlueprintDAO;
-import org.apache.ambari.server.orm.dao.StackDAO;
 import org.apache.ambari.server.orm.entities.BlueprintConfigEntity;
 import org.apache.ambari.server.orm.entities.BlueprintConfiguration;
 import org.apache.ambari.server.orm.entities.BlueprintEntity;
+import org.apache.ambari.server.orm.entities.BlueprintMpackInstanceEntity;
 import org.apache.ambari.server.orm.entities.BlueprintSettingEntity;
 import org.apache.ambari.server.orm.entities.HostGroupComponentEntity;
 import org.apache.ambari.server.orm.entities.HostGroupEntity;
-import org.apache.ambari.server.orm.entities.StackEntity;
 import org.apache.ambari.server.state.PropertyInfo;
 import org.apache.ambari.server.state.SecurityType;
 import org.apache.ambari.server.state.StackInfo;
@@ -101,7 +99,6 @@ public class BlueprintResourceProviderTest {
   public ExpectedException expectedException = ExpectedException.none();
 
   private final static BlueprintDAO dao = createStrictMock(BlueprintDAO.class);
-  private final static StackDAO stackDAO = createNiceMock(StackDAO.class);
   private final static BlueprintEntity entity = createStrictMock(BlueprintEntity.class);
   private final static Blueprint blueprint = createMock(Blueprint.class);
   private final static AmbariMetaInfo metaInfo = createMock(AmbariMetaInfo.class);
@@ -113,16 +110,6 @@ public class BlueprintResourceProviderTest {
   @BeforeClass
   public static void initClass() {
     BlueprintResourceProvider.init(blueprintFactory, dao, securityFactory, gson, metaInfo);
-
-    StackEntity stackEntity = new StackEntity();
-    stackEntity.setStackName("test-stack-name");
-    stackEntity.setStackVersion("test-stack-version");
-
-    expect(
-        stackDAO.find(anyObject(String.class),
-          anyObject(String.class))).andReturn(stackEntity).anyTimes();
-    replay(stackDAO);
-
   }
 
   private Map<String, Set<HashMap<String, String>>> getSettingProperties() {
@@ -750,8 +737,6 @@ public class BlueprintResourceProviderTest {
 
   private void validateResource(Resource resource, boolean containsConfig) {
     assertEquals(BLUEPRINT_NAME, resource.getPropertyValue(BlueprintResourceProvider.BLUEPRINT_NAME_PROPERTY_ID));
-    assertEquals("test-stack-name", resource.getPropertyValue(BlueprintResourceProvider.STACK_NAME_PROPERTY_ID));
-    assertEquals("test-stack-version", resource.getPropertyValue(BlueprintResourceProvider.STACK_VERSION_PROPERTY_ID));
 
     Collection<Map<String, Object>> hostGroupProperties = (Collection<Map<String, Object>>)
         resource.getPropertyValue(BlueprintResourceProvider.HOST_GROUP_PROPERTY_ID);
@@ -820,11 +805,13 @@ public class BlueprintResourceProviderTest {
 
     String stackName = (String) properties.get(BlueprintResourceProvider.STACK_NAME_PROPERTY_ID);
     String stackVersion = (String) properties.get(BlueprintResourceProvider.STACK_VERSION_PROPERTY_ID);
-    StackEntity stackEntity = new StackEntity();
-    stackEntity.setStackName(stackName);
-    stackEntity.setStackVersion(stackVersion);
 
-    entity.setStack(stackEntity);
+    BlueprintMpackInstanceEntity mpackEntity = new BlueprintMpackInstanceEntity();
+    mpackEntity.setMpackName(stackName);
+    mpackEntity.setMpackVersion(stackVersion);
+    mpackEntity.setBlueprint(entity);
+
+    entity.getMpackReferences().add(mpackEntity);
 
     Set<Map<String, Object>> hostGroupProperties = (Set<Map<String, Object>>) properties.get(
         BlueprintResourceProvider.HOST_GROUP_PROPERTY_ID);
@@ -1023,11 +1010,7 @@ public class BlueprintResourceProviderTest {
 
   @Test
   public void testPopulateConfigurationList() throws Exception {
-    StackEntity stackEntity = new StackEntity();
-    stackEntity.setStackName("test-stack-name");
-    stackEntity.setStackVersion("test-stack-version");
     BlueprintEntity entity = createMock(BlueprintEntity.class);
-    expect(entity.getStack()).andReturn(stackEntity).anyTimes();
 
     HashMap<PropertyInfo.PropertyType, Set<String>> pwdProperties = new HashMap<PropertyInfo.PropertyType, Set<String>>() {{
       put(PropertyInfo.PropertyType.PASSWORD, new HashSet<String>(){{
@@ -1041,7 +1024,12 @@ public class BlueprintResourceProviderTest {
     expect(info.getConfigPropertiesTypes("type3")).andReturn(pwdProperties).anyTimes();
     expect(metaInfo.getStack("test-stack-name", "test-stack-version")).andReturn(info).anyTimes();
 
-    replay(info, metaInfo, entity);
+    BlueprintMpackInstanceEntity mpackReference = createMock(BlueprintMpackInstanceEntity.class);
+    expect(mpackReference.getMpackName()).andReturn("test-stack-name").anyTimes();
+    expect(mpackReference.getMpackVersion()).andReturn("test-stack-version").anyTimes();
+    expect(entity.getMpackReferences()).andReturn(Collections.singleton(mpackReference)).anyTimes();
+
+    replay(info, metaInfo, entity, mpackReference);
 
 
     // attributes is null
@@ -1124,11 +1112,7 @@ public class BlueprintResourceProviderTest {
 
   @Test
   public void testPopulateSettingList() throws Exception {
-    StackEntity stackEntity = new StackEntity();
-    stackEntity.setStackName("test-stack-name");
-    stackEntity.setStackVersion("test-stack-version");
     BlueprintEntity entity = createMock(BlueprintEntity.class);
-    expect(entity.getStack()).andReturn(stackEntity).anyTimes();
 
     HashMap<PropertyInfo.PropertyType, Set<String>> pwdProperties = new HashMap<PropertyInfo.PropertyType, Set<String>>() {{
       put(PropertyInfo.PropertyType.PASSWORD, new HashSet<String>(){{
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/orm/db/DDLTests.java b/ambari-server/src/test/java/org/apache/ambari/server/orm/db/DDLTests.java
index 099400b..eda0c70 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/orm/db/DDLTests.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/orm/db/DDLTests.java
@@ -75,6 +75,7 @@ public class DDLTests {
     verifyDDL("SQLServer");
   }
 
+
   /**
    * To verify if DDL have certain characteristics:
    * <ul>
@@ -88,35 +89,47 @@ public class DDLTests {
     LOG.info("Checking DDL for {}", dbType);
     DDL ddl = DDLTestUtils.getDdl(dbType);
     printDDLMetrics(ddl);
+    List<String> issues = new ArrayList<>();
 
     // check for unwanted alter tables
-    Assert.assertEquals("Expected count of alter tables mismatch. Please include all constraint definitions in " +
-            "the create table statement, only use alter table in exceptional cases, such as to work around a circular " +
-            "FK dependency. Would another such case occur, please document it in the DDL's and adjust the " +
-            "EXPECTED_ALTER_TABLE_COUNT in this test.",
-        EXPECTED_ALTER_TABLE_COUNT,
-        ddl.alterTables.size());
+    if (ddl.alterTables.size() != EXPECTED_ALTER_TABLE_COUNT) {
+      issues.add(String.format(
+        "Expected count of alter tables mismatch (%d vd %d). Please include all constraint definitions in " +
+        "the create table statement, only use alter table in exceptional cases, such as to work around a circular " +
+        "FK dependency. Would another such case occur, please document it in the DDL's and adjust the " +
+        "EXPECTED_ALTER_TABLE_COUNT in this test.", ddl.alterTables.size(), EXPECTED_ALTER_TABLE_COUNT));
+    }
 
     // check for too long table/constraint names
     for (String tableName: ddl.tableNames()) {
-      Assert.assertTrue("Table name exceeds the 30 character limit: " + tableName, tableName.length() <= 30);
+      if (tableName.length() > 30) {
+        issues.add("Table name exceeds the 30 character limit: " + tableName);
+      }
     }
     for (Table table: ddl.tables.values()) {
-      Assert.assertTrue("PK name exceeds the 30 character limit: " + table.primaryKey,
-          !table.primaryKey.isPresent() || table.primaryKey.get().name().length() <= 30);
+      if (table.primaryKey.isPresent() && table.primaryKey.get().name().length() > 30) {
+        issues.add("PK name exceeds the 30 character limit: " + table.primaryKey.get());
+      }
       for (Constraint constr: Sets.union(table.foreignKeys, table.uniqueConstraints)) {
-        Assert.assertTrue("Constraint name exceeds the 30 character limit: " + constr, constr.name().length() <= 30);
+        if (constr.name().length() > 30) {
+          issues.add(String.format("Constraint name on table [%s] exceeds the 30 character limit: %s",
+            table.name, constr.name()));
+        }
       }
     }
     // check for unnamed PK's (skip quartz tables)
     for (Table table: ddl.tables.values()) {
-      Assert.assertFalse("Unnamed PK exists for table: " + table.name,
-          !table.name.startsWith("qrtz") && table.primaryKey.isPresent() && table.primaryKey.get().name().equals("<default>"));
-      for (Constraint constr: Sets.union(table.foreignKeys, table.uniqueConstraints)) {
-        Assert.assertTrue("Constraint name exceeds the 30 character limit: " + constr, constr.name().length() <= 30);
+      if (!table.name.startsWith("qrtz") &&
+        table.primaryKey.isPresent() &&
+        table.primaryKey.get().name().equals("<default>")) {
+        issues.add("Unnamed PK exists for table: " + table.name);
       }
     }
-
+    if (!issues.isEmpty()) {
+      String message = "There were " + issues.size() + " issues found:\n- " +
+        Joiner.on("\n- ").join(issues);
+      Assert.fail(message);
+    }
   }
 
   @Test
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/orm/entities/BlueprintEntityTest.java b/ambari-server/src/test/java/org/apache/ambari/server/orm/entities/BlueprintEntityTest.java
index 1b0b996..a9f6172 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/orm/entities/BlueprintEntityTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/orm/entities/BlueprintEntityTest.java
@@ -50,13 +50,6 @@ public class BlueprintEntityTest {
   }
 
   @Test
-  public void testSetGetStack() {
-    BlueprintEntity entity = new BlueprintEntity();
-    entity.setStack(stackEntity);
-    assertEquals(stackEntity, entity.getStack());
-  }
-
-  @Test
   public void testSetGetHostGroups() {
     BlueprintEntity entity = new BlueprintEntity();
     Collection<HostGroupEntity> hostGroups = Collections.emptyList();
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/orm/entities/BlueprintEntityTest2.java b/ambari-server/src/test/java/org/apache/ambari/server/orm/entities/BlueprintEntityTest2.java
new file mode 100644
index 0000000..6d0a5e2
--- /dev/null
+++ b/ambari-server/src/test/java/org/apache/ambari/server/orm/entities/BlueprintEntityTest2.java
@@ -0,0 +1,183 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ambari.server.orm.entities;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertSame;
+
+import java.sql.SQLException;
+import java.util.Collection;
+import java.util.Map;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+import org.apache.ambari.server.AmbariException;
+import org.apache.ambari.server.H2DatabaseCleaner;
+import org.apache.ambari.server.api.services.AmbariMetaInfo;
+import org.apache.ambari.server.controller.internal.ProvisionAction;
+import org.apache.ambari.server.orm.GuiceJpaInitializer;
+import org.apache.ambari.server.orm.InMemoryDefaultTestModule;
+import org.apache.ambari.server.orm.dao.BlueprintDAO;
+import org.apache.ambari.server.orm.dao.StackDAO;
+import org.apache.ambari.server.state.SecurityType;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.inject.Guice;
+import com.google.inject.Inject;
+import com.google.inject.Injector;
+
+/**
+ * Test saving and loading a blueprint with all associated entities.
+ */
+public class BlueprintEntityTest2 {
+
+  public static final String BLUEPRINT_NAME = "test-blueprint";
+  @Inject
+  private Injector injector;
+  @Inject
+  private StackDAO stackDAO;
+  @Inject
+  private BlueprintDAO blueprintDAO;
+
+
+  @Before
+  public void setup() {
+    injector = Guice.createInjector(new InMemoryDefaultTestModule());
+    injector.getInstance(GuiceJpaInitializer.class);
+    injector.injectMembers(this);
+    injector.getInstance(AmbariMetaInfo.class);
+  }
+
+  @After
+  public void teardown() throws AmbariException, SQLException {
+    H2DatabaseCleaner.clearDatabaseAndStopPersistenceService(injector);
+  }
+
+  /**
+   * Test loading and saving a blueprint without stack defined (Ambari 3.0 blueprints normally define mpacks, not stacks)
+   */
+  @Test
+  public void testCreateAndLoadBlueprint() {
+    blueprintDAO.create(createTestBlueprint());
+    verifyBlueprint(blueprintDAO.findByName(BLUEPRINT_NAME));
+  }
+
+  private void verifyBlueprint(BlueprintEntity blueprintEntity) {
+    assertEquals(1, blueprintEntity.getMpackReferences().size());
+
+    BlueprintMpackInstanceEntity mpackReferenceEntity =
+      blueprintEntity.getMpackReferences().iterator().next();
+    assertEquals("HDPCORE", mpackReferenceEntity.getMpackName());
+    assertEquals(1, mpackReferenceEntity.getConfigurations().size());
+
+    BlueprintMpackConfigEntity mpackConfigEntity =
+      mpackReferenceEntity.getConfigurations().iterator().next();
+    assertEquals("configdata", mpackConfigEntity.getConfigData());
+    assertEquals("zk-env.sh", mpackConfigEntity.getType());
+
+    assertEquals(1, blueprintEntity.getHostGroups().size());
+    HostGroupEntity hostGroup = blueprintEntity.getHostGroups().iterator().next();
+
+    Collection<HostGroupComponentEntity> hgComponents = hostGroup.getComponents();
+    Map<String, HostGroupComponentEntity> hgComponentMap =
+      hgComponents.stream().collect(Collectors.toMap(HostGroupComponentEntity::getName, Function.identity()));
+    assertEquals(ImmutableSet.of("ZOOKEEPER_CLIENT", "HDFS_CLIENT"), hgComponentMap.keySet());
+    assertEquals(ProvisionAction.INSTALL_ONLY.name(), hgComponentMap.get("HDFS_CLIENT").getProvisionAction());
+    assertEquals("HDPCORE", hgComponentMap.get("ZOOKEEPER_CLIENT").getMpackName());
+    assertEquals("ZK1", hgComponentMap.get("ZOOKEEPER_CLIENT").getServiceName());
+
+    assertEquals(1, hostGroup.getConfigurations().size());
+    HostGroupConfigEntity hostGroupConfig = hostGroup.getConfigurations().iterator().next();
+    assertEquals("hdfs-site", hostGroupConfig.getType());
+
+    assertEquals(1, mpackReferenceEntity.getServiceInstances().size());
+    BlueprintServiceEntity service = mpackReferenceEntity.getServiceInstances().iterator().next();
+    assertEquals("ZK1", service.getName());
+    assertEquals("ZOOKEEPER", service.getType());
+    assertSame(mpackReferenceEntity, service.getMpackReference());
+
+    assertEquals(1, service.getConfigurations().size());
+    assertEquals("hadoop-env", service.getConfigurations().iterator().next().getType());
+  }
+
+  private BlueprintEntity createTestBlueprint() {
+    BlueprintEntity blueprintEntity = new BlueprintEntity();
+    blueprintEntity.setBlueprintName(BLUEPRINT_NAME);
+    blueprintEntity.setSecurityType(SecurityType.NONE);
+
+    BlueprintMpackInstanceEntity mpackReferenceEntity = new BlueprintMpackInstanceEntity();
+    mpackReferenceEntity.setBlueprint(blueprintEntity);
+    mpackReferenceEntity.setMpackName("HDPCORE");
+    mpackReferenceEntity.setMpackVersion("3.0.0.0");
+    mpackReferenceEntity.setMpackUri("http://hdpcore.org/3.0.0.0");
+
+    BlueprintMpackConfigEntity mpackConfigEntity = new BlueprintMpackConfigEntity();
+    mpackConfigEntity.setMpackReference(mpackReferenceEntity);
+    mpackConfigEntity.setConfigAttributes("attributes");
+    mpackConfigEntity.setConfigData("configdata");
+    mpackConfigEntity.setType("zk-env.sh");
+    mpackReferenceEntity.getConfigurations().add(mpackConfigEntity);
+
+    HostGroupEntity hostGroupEntity = new HostGroupEntity();
+    hostGroupEntity.setBlueprintEntity(blueprintEntity);
+    hostGroupEntity.setName("hostgroup1");
+
+    HostGroupConfigEntity hgConfigEntity = new HostGroupConfigEntity();
+    hgConfigEntity.setHostGroupEntity(hostGroupEntity);
+    hgConfigEntity.setType("hdfs-site");
+    hgConfigEntity.setConfigAttributes("attributes");
+    hgConfigEntity.setConfigData("data");
+    hostGroupEntity.getConfigurations().add(hgConfigEntity);
+
+    HostGroupComponentEntity hgComponentEntity1 = new HostGroupComponentEntity();
+    hgComponentEntity1.setHostGroupEntity(hostGroupEntity);
+    hgComponentEntity1.setName("HDFS_CLIENT");
+    hgComponentEntity1.setProvisionAction(ProvisionAction.INSTALL_ONLY.name());
+    hostGroupEntity.addComponent(hgComponentEntity1);
+
+    HostGroupComponentEntity hgComponentEntity2 = new HostGroupComponentEntity();
+    hgComponentEntity2.setHostGroupEntity(hostGroupEntity);
+    hgComponentEntity2.setName("ZOOKEEPER_CLIENT");
+    hgComponentEntity2.setMpackName("HDPCORE");
+    hgComponentEntity2.setMpackVersion("3.0.0.0");
+    hgComponentEntity2.setServiceName("ZK1");
+    hostGroupEntity.addComponent(hgComponentEntity2);
+
+    BlueprintServiceEntity blueprintService = new BlueprintServiceEntity();
+    blueprintService.setMpackReference(mpackReferenceEntity);
+    blueprintService.setName("ZK1");
+    blueprintService.setType("ZOOKEEPER");
+    mpackReferenceEntity.getServiceInstances().add(blueprintService);
+
+    BlueprintServiceConfigEntity blueprintServiceConfigEntity = new BlueprintServiceConfigEntity();
+    blueprintServiceConfigEntity.setService(blueprintService);
+    blueprintServiceConfigEntity.setType("hadoop-env");
+    blueprintServiceConfigEntity.setConfigAttributes("attributes");
+    blueprintServiceConfigEntity.setConfigData("data");
+    blueprintService.getConfigurations().add(blueprintServiceConfigEntity);
+
+    blueprintEntity.getMpackReferences().add(mpackReferenceEntity);
+    blueprintEntity.getHostGroups().add(hostGroupEntity);
+
+    return blueprintEntity;
+  }
+}
\ No newline at end of file

-- 
To stop receiving notification emails like this one, please contact
benyoka@apache.org.