You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by jo...@apache.org on 2015/04/16 16:37:29 UTC

[6/8] ambari git commit: AMBARI-10511 - Use Stack Table For Entity Relationships (jonathanhurley)

http://git-wip-us.apache.org/repos/asf/ambari/blob/746df034/ambari-server/src/main/java/org/apache/ambari/server/state/configgroup/ConfigGroupImpl.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/configgroup/ConfigGroupImpl.java b/ambari-server/src/main/java/org/apache/ambari/server/state/configgroup/ConfigGroupImpl.java
index 9ec0370..ffa085a 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/state/configgroup/ConfigGroupImpl.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/configgroup/ConfigGroupImpl.java
@@ -17,12 +17,14 @@
  */
 package org.apache.ambari.server.state.configgroup;
 
-import com.google.gson.Gson;
-import com.google.inject.Inject;
-import com.google.inject.Injector;
-import com.google.inject.assistedinject.Assisted;
-import com.google.inject.assistedinject.AssistedInject;
-import com.google.inject.persist.Transactional;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.locks.ReadWriteLock;
+import java.util.concurrent.locks.ReentrantReadWriteLock;
+
 import org.apache.ambari.server.AmbariException;
 import org.apache.ambari.server.DuplicateResourceException;
 import org.apache.ambari.server.controller.ConfigGroupResponse;
@@ -46,13 +48,13 @@ import org.apache.ambari.server.state.ConfigFactory;
 import org.apache.ambari.server.state.Host;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.locks.ReadWriteLock;
-import java.util.concurrent.locks.ReentrantReadWriteLock;
+
+import com.google.gson.Gson;
+import com.google.inject.Inject;
+import com.google.inject.Injector;
+import com.google.inject.assistedinject.Assisted;
+import com.google.inject.assistedinject.AssistedInject;
+import com.google.inject.persist.Transactional;
 
 public class ConfigGroupImpl implements ConfigGroup {
   private static final Logger LOG = LoggerFactory.getLogger(ConfigGroupImpl.class);
@@ -105,9 +107,9 @@ public class ConfigGroupImpl implements ConfigGroup {
     }
 
     if (configs != null) {
-      this.configurations = configs;
+      configurations = configs;
     } else {
-      this.configurations = new HashMap<String, Config>();
+      configurations = new HashMap<String, Config>();
     }
   }
 
@@ -119,8 +121,8 @@ public class ConfigGroupImpl implements ConfigGroup {
     this.cluster = cluster;
 
     this.configGroupEntity = configGroupEntity;
-    this.configurations = new HashMap<String, Config>();
-    this.hosts = new HashMap<String, Host>();
+    configurations = new HashMap<String, Config>();
+    hosts = new HashMap<String, Host>();
 
     // Populate configs
     for (ConfigGroupConfigMappingEntity configMappingEntity : configGroupEntity
@@ -130,7 +132,7 @@ public class ConfigGroupImpl implements ConfigGroup {
         configMappingEntity.getVersionTag());
 
       if (config != null) {
-        this.configurations.put(config.getType(), config);
+        configurations.put(config.getType(), config);
       } else {
         LOG.warn("Unable to find config mapping for config group"
           + ", clusterName = " + cluster.getClusterName()
@@ -146,7 +148,7 @@ public class ConfigGroupImpl implements ConfigGroup {
       try {
         Host host = clusters.getHost(hostMappingEntity.getHostname());
         if (host != null) {
-          this.hosts.put(host.getHostName(), host);
+          hosts.put(host.getHostName(), host);
         }
       } catch (AmbariException e) {
         String msg = "Host seems to be deleted but Config group mapping still " +
@@ -178,7 +180,7 @@ public class ConfigGroupImpl implements ConfigGroup {
   public void setName(String name) {
     readWriteLock.writeLock().lock();
     try {
-      this.configGroupEntity.setGroupName(name);
+      configGroupEntity.setGroupName(name);
     } finally {
       readWriteLock.writeLock().unlock();
     }
@@ -204,7 +206,7 @@ public class ConfigGroupImpl implements ConfigGroup {
   public void setTag(String tag) {
     readWriteLock.writeLock().lock();
     try {
-      this.configGroupEntity.setTag(tag);
+      configGroupEntity.setTag(tag);
     } finally {
       readWriteLock.writeLock().unlock();
     }
@@ -225,7 +227,7 @@ public class ConfigGroupImpl implements ConfigGroup {
   public void setDescription(String description) {
     readWriteLock.writeLock().lock();
     try {
-      this.configGroupEntity.setDescription(description);
+      configGroupEntity.setDescription(description);
     } finally {
       readWriteLock.writeLock().unlock();
     }
@@ -276,7 +278,7 @@ public class ConfigGroupImpl implements ConfigGroup {
   public void setConfigurations(Map<String, Config> configs) {
     readWriteLock.writeLock().lock();
     try {
-      this.configurations = configs;
+      configurations = configs;
     } finally {
       readWriteLock.writeLock().unlock();
     }
@@ -405,6 +407,7 @@ public class ConfigGroupImpl implements ConfigGroup {
           clusterConfigEntity = new ClusterConfigEntity();
           clusterConfigEntity.setClusterId(clusterEntity.getClusterId());
           clusterConfigEntity.setClusterEntity(clusterEntity);
+          clusterConfigEntity.setStack(clusterEntity.getDesiredStack());
           clusterConfigEntity.setType(config.getType());
           clusterConfigEntity.setVersion(config.getVersion());
           clusterConfigEntity.setTag(config.getTag());
@@ -545,6 +548,7 @@ public class ConfigGroupImpl implements ConfigGroup {
     }
   }
 
+  @Override
   @Transactional
   public void refresh() {
     readWriteLock.writeLock().lock();
@@ -565,7 +569,7 @@ public class ConfigGroupImpl implements ConfigGroup {
   public String getServiceName() {
     readWriteLock.readLock().lock();
     try {
-      return this.configGroupEntity.getServiceName();
+      return configGroupEntity.getServiceName();
     } finally {
       readWriteLock.readLock().unlock();
     }
@@ -576,7 +580,7 @@ public class ConfigGroupImpl implements ConfigGroup {
   public void setServiceName(String serviceName) {
     readWriteLock.writeLock().lock();
     try {
-      this.configGroupEntity.setServiceName(serviceName);
+      configGroupEntity.setServiceName(serviceName);
     } finally {
       readWriteLock.writeLock().unlock();
     }

http://git-wip-us.apache.org/repos/asf/ambari/blob/746df034/ambari-server/src/main/java/org/apache/ambari/server/state/svccomphost/ServiceComponentHostImpl.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/svccomphost/ServiceComponentHostImpl.java b/ambari-server/src/main/java/org/apache/ambari/server/state/svccomphost/ServiceComponentHostImpl.java
index 370cd48..4c9c499 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/state/svccomphost/ServiceComponentHostImpl.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/svccomphost/ServiceComponentHostImpl.java
@@ -43,6 +43,7 @@ import org.apache.ambari.server.orm.dao.HostComponentStateDAO;
 import org.apache.ambari.server.orm.dao.HostDAO;
 import org.apache.ambari.server.orm.dao.RepositoryVersionDAO;
 import org.apache.ambari.server.orm.dao.ServiceComponentDesiredStateDAO;
+import org.apache.ambari.server.orm.dao.StackDAO;
 import org.apache.ambari.server.orm.entities.HostComponentDesiredStateEntity;
 import org.apache.ambari.server.orm.entities.HostComponentDesiredStateEntityPK;
 import org.apache.ambari.server.orm.entities.HostComponentStateEntity;
@@ -51,6 +52,7 @@ import org.apache.ambari.server.orm.entities.HostEntity;
 import org.apache.ambari.server.orm.entities.RepositoryVersionEntity;
 import org.apache.ambari.server.orm.entities.ServiceComponentDesiredStateEntity;
 import org.apache.ambari.server.orm.entities.ServiceComponentDesiredStateEntityPK;
+import org.apache.ambari.server.orm.entities.StackEntity;
 import org.apache.ambari.server.state.Cluster;
 import org.apache.ambari.server.state.Clusters;
 import org.apache.ambari.server.state.ConfigHelper;
@@ -78,7 +80,6 @@ import org.apache.ambari.server.state.stack.upgrade.RepositoryVersionHelper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.gson.Gson;
 import com.google.inject.Inject;
 import com.google.inject.Injector;
 import com.google.inject.assistedinject.Assisted;
@@ -102,8 +103,6 @@ public class ServiceComponentHostImpl implements ServiceComponentHost {
   private boolean persisted = false;
 
   @Inject
-  Gson gson;
-  @Inject
   HostComponentStateDAO hostComponentStateDAO;
   @Inject
   HostComponentDesiredStateDAO hostComponentDesiredStateDAO;
@@ -135,6 +134,12 @@ public class ServiceComponentHostImpl implements ServiceComponentHost {
   @Inject
   private AmbariEventPublisher eventPublisher;
 
+  /**
+   * Data access object for stack.
+   */
+  @Inject
+  private StackDAO stackDAO;
+
   // TODO : caching the JPA entities here causes issues if they become stale and get re-merged.
   private HostComponentStateEntity stateEntity;
   private HostComponentDesiredStateEntity desiredStateEntity;
@@ -702,6 +707,10 @@ public class ServiceComponentHostImpl implements ServiceComponentHost {
       throw new RuntimeException(e);
     }
 
+    StackId stackId = serviceComponent.getDesiredStackVersion();
+    StackEntity stackEntity = stackDAO.find(stackId.getStackName(),
+        stackId.getStackVersion());
+
     stateEntity = new HostComponentStateEntity();
     stateEntity.setClusterId(serviceComponent.getClusterId());
     stateEntity.setComponentName(serviceComponent.getName());
@@ -710,7 +719,7 @@ public class ServiceComponentHostImpl implements ServiceComponentHost {
     stateEntity.setHostEntity(hostEntity);
     stateEntity.setCurrentState(stateMachine.getCurrentState());
     stateEntity.setUpgradeState(UpgradeState.NONE);
-    stateEntity.setCurrentStackVersion(gson.toJson(new StackId()));
+    stateEntity.setCurrentStack(stackEntity);
 
     stateEntityPK = getHostComponentStateEntityPK(stateEntity);
 
@@ -720,8 +729,8 @@ public class ServiceComponentHostImpl implements ServiceComponentHost {
     desiredStateEntity.setServiceName(serviceComponent.getServiceName());
     desiredStateEntity.setHostEntity(hostEntity);
     desiredStateEntity.setDesiredState(State.INIT);
-    desiredStateEntity.setDesiredStackVersion(
-        gson.toJson(serviceComponent.getDesiredStackVersion()));
+    desiredStateEntity.setDesiredStack(stackEntity);
+
     if(!serviceComponent.isMasterComponent() && !serviceComponent.isClientComponent()) {
       desiredStateEntity.setAdminState(HostComponentAdminState.INSERVICE);
     } else {
@@ -1022,17 +1031,23 @@ public class ServiceComponentHostImpl implements ServiceComponentHost {
       if (schStateEntity == null) {
         return new StackId();
       }
-      return gson.fromJson(schStateEntity.getCurrentStackVersion(), StackId.class);
+
+      StackEntity currentStackEntity = schStateEntity.getCurrentStack();
+      return new StackId(currentStackEntity.getStackName(),
+          currentStackEntity.getStackVersion());
     } finally {
       readLock.unlock();
     }
   }
 
   @Override
-  public void setStackVersion(StackId stackVersion) {
+  public void setStackVersion(StackId stackId) {
     writeLock.lock();
     try {
-      getStateEntity().setCurrentStackVersion(gson.toJson(stackVersion));
+      StackEntity stackEntity = stackDAO.find(stackId.getStackName(),
+          stackId.getStackVersion());
+
+      getStateEntity().setCurrentStack(stackEntity);
       saveIfPersisted();
     } finally {
       writeLock.unlock();
@@ -1064,18 +1079,22 @@ public class ServiceComponentHostImpl implements ServiceComponentHost {
   public StackId getDesiredStackVersion() {
     readLock.lock();
     try {
-      return gson.fromJson(getDesiredStateEntity().getDesiredStackVersion(),
-          StackId.class);
+      StackEntity desiredStackEntity = getDesiredStateEntity().getDesiredStack();
+      return new StackId(desiredStackEntity.getStackName(),
+          desiredStackEntity.getStackVersion());
     } finally {
       readLock.unlock();
     }
   }
 
   @Override
-  public void setDesiredStackVersion(StackId stackVersion) {
+  public void setDesiredStackVersion(StackId stackId) {
     writeLock.lock();
     try {
-      getDesiredStateEntity().setDesiredStackVersion(gson.toJson(stackVersion));
+      StackEntity stackEntity = stackDAO.find(stackId.getStackName(),
+          stackId.getStackVersion());
+
+      getDesiredStateEntity().setDesiredStack(stackEntity);
       saveIfPersisted();
     } finally {
       writeLock.unlock();
@@ -1478,7 +1497,14 @@ public class ServiceComponentHostImpl implements ServiceComponentHost {
   private RepositoryVersionEntity createRepositoryVersion(String version, final StackId stackId, final StackInfo stackInfo) throws AmbariException {
     // During an Ambari Upgrade from 1.7.0 -> 2.0.0, the Repo Version will not exist, so bootstrap it.
     LOG.info("Creating new repository version " + stackId.getStackName() + "-" + version);
-    return repositoryVersionDAO.create(stackId.getStackId(), version, stackId.getStackName() + "-" + version,
+
+    StackEntity stackEntity = stackDAO.find(stackId.getStackName(),
+        stackId.getStackVersion());
+
+    return repositoryVersionDAO.create(
+        stackEntity,
+        version,
+        stackId.getStackName() + "-" + version,
         repositoryVersionHelper.getUpgradePackageNameSafe(stackId.getStackName(), stackId.getStackVersion(), version),
         repositoryVersionHelper.serializeOperatingSystems(stackInfo.getRepositories()));
   }
@@ -1509,7 +1535,8 @@ public class ServiceComponentHostImpl implements ServiceComponentHost {
 
     writeLock.lock();
     try {
-      RepositoryVersionEntity repositoryVersion = repositoryVersionDAO.findByStackAndVersion(stackId.getStackId(), version);
+      RepositoryVersionEntity repositoryVersion = repositoryVersionDAO.findByStackAndVersion(
+          stackId, version);
       if (repositoryVersion == null) {
         repositoryVersion = createRepositoryVersion(version, stackId, stackInfo);
       }

http://git-wip-us.apache.org/repos/asf/ambari/blob/746df034/ambari-server/src/main/java/org/apache/ambari/server/upgrade/StackUpgradeUtil.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/upgrade/StackUpgradeUtil.java b/ambari-server/src/main/java/org/apache/ambari/server/upgrade/StackUpgradeUtil.java
index 388bea9..8c629ca 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/upgrade/StackUpgradeUtil.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/upgrade/StackUpgradeUtil.java
@@ -28,6 +28,7 @@ import org.apache.ambari.server.orm.dao.HostComponentStateDAO;
 import org.apache.ambari.server.orm.dao.MetainfoDAO;
 import org.apache.ambari.server.orm.dao.ServiceComponentDesiredStateDAO;
 import org.apache.ambari.server.orm.dao.ServiceDesiredStateDAO;
+import org.apache.ambari.server.orm.dao.StackDAO;
 import org.apache.ambari.server.orm.entities.ClusterEntity;
 import org.apache.ambari.server.orm.entities.ClusterStateEntity;
 import org.apache.ambari.server.orm.entities.HostComponentDesiredStateEntity;
@@ -35,46 +36,31 @@ import org.apache.ambari.server.orm.entities.HostComponentStateEntity;
 import org.apache.ambari.server.orm.entities.MetainfoEntity;
 import org.apache.ambari.server.orm.entities.ServiceComponentDesiredStateEntity;
 import org.apache.ambari.server.orm.entities.ServiceDesiredStateEntity;
+import org.apache.ambari.server.orm.entities.StackEntity;
 import org.apache.ambari.server.state.OperatingSystemInfo;
-import org.apache.ambari.server.state.StackId;
 import org.apache.ambari.server.state.stack.OsFamily;
 
-import com.google.gson.Gson;
 import com.google.inject.Inject;
 import com.google.inject.Injector;
 import com.google.inject.persist.Transactional;
 
 public class StackUpgradeUtil {
   @Inject
-  private Gson gson;
-  @Inject
   private Injector injector;
 
-  private String getStackIdString(String originalStackId, String stackName,
-                                  String stackVersion) {
-    if (stackVersion == null) {
-      stackVersion = gson.fromJson(originalStackId, StackId.class).getStackVersion();
-    }
-
-    return String.format(
-      "{\"stackName\":\"%s\",\"stackVersion\":\"%s\"}",
-      stackName,
-      stackVersion
-    );
-  }
-
   @Transactional
   public void updateStackDetails(String stackName, String stackVersion) {
     ClusterDAO clusterDAO = injector.getInstance(ClusterDAO.class);
+    StackDAO stackDAO = injector.getInstance(StackDAO.class);
     List<Long> clusterIds = new ArrayList<Long>();
 
+    StackEntity stackEntity = stackDAO.find(stackName, stackVersion);
+
     List<ClusterEntity> clusterEntities = clusterDAO.findAll();
     if (clusterEntities != null && !clusterEntities.isEmpty()) {
       for (ClusterEntity entity : clusterEntities) {
         clusterIds.add(entity.getClusterId());
-        String stackIdString = entity.getDesiredStackVersion();
-        entity.setDesiredStackVersion(getStackIdString(stackIdString,
-          stackName, stackVersion));
+        entity.setDesiredStack(stackEntity);
         clusterDAO.merge(entity);
       }
     }
@@ -83,9 +69,7 @@ public class StackUpgradeUtil {
 
     for (Long clusterId : clusterIds) {
       ClusterStateEntity clusterStateEntity = clusterStateDAO.findByPK(clusterId);
-      String currentStackVersion = clusterStateEntity.getCurrentStackVersion();
-      clusterStateEntity.setCurrentStackVersion(getStackIdString
-        (currentStackVersion, stackName, stackVersion));
+      clusterStateEntity.setCurrentStack(stackEntity);
       clusterStateDAO.merge(clusterStateEntity);
     }
 
@@ -95,9 +79,7 @@ public class StackUpgradeUtil {
 
     if (hcEntities != null) {
       for (HostComponentStateEntity hc : hcEntities) {
-        String currentStackVersion = hc.getCurrentStackVersion();
-        hc.setCurrentStackVersion(getStackIdString(currentStackVersion,
-          stackName, stackVersion));
+        hc.setCurrentStack(stackEntity);
         hostComponentStateDAO.merge(hc);
       }
     }
@@ -109,9 +91,7 @@ public class StackUpgradeUtil {
 
     if (hcdEntities != null) {
       for (HostComponentDesiredStateEntity hcd : hcdEntities) {
-        String desiredStackVersion = hcd.getDesiredStackVersion();
-        hcd.setDesiredStackVersion(getStackIdString(desiredStackVersion,
-          stackName, stackVersion));
+        hcd.setDesiredStack(stackEntity);
         hostComponentDesiredStateDAO.merge(hcd);
       }
     }
@@ -124,9 +104,7 @@ public class StackUpgradeUtil {
 
     if (scdEntities != null) {
       for (ServiceComponentDesiredStateEntity scd : scdEntities) {
-        String desiredStackVersion = scd.getDesiredStackVersion();
-        scd.setDesiredStackVersion(getStackIdString(desiredStackVersion,
-          stackName, stackVersion));
+        scd.setDesiredStack(stackEntity);
         serviceComponentDesiredStateDAO.merge(scd);
       }
     }
@@ -137,14 +115,10 @@ public class StackUpgradeUtil {
 
     if (sdEntities != null) {
       for (ServiceDesiredStateEntity sd : sdEntities) {
-        String desiredStackVersion = sd.getDesiredStackVersion();
-        sd.setDesiredStackVersion(getStackIdString(desiredStackVersion,
-          stackName, stackVersion));
+        sd.setDesiredStack(stackEntity);
         serviceDesiredStateDAO.merge(sd);
       }
     }
-
-
   }
 
   /**
@@ -159,31 +133,32 @@ public class StackUpgradeUtil {
 
     if (null == repoUrl ||
         repoUrl.isEmpty() ||
-        !repoUrl.startsWith("http"))
+        !repoUrl.startsWith("http")) {
       return;
-    
-    String[] oses = new String[0]; 
-    
+    }
+
+    String[] oses = new String[0];
+
     if (null != repoUrlOs) {
       oses = repoUrlOs.split(",");
     }
-    
+
     AmbariMetaInfo ami = injector.getInstance(AmbariMetaInfo.class);
     MetainfoDAO metaDao = injector.getInstance(MetainfoDAO.class);
     OsFamily os_family = injector.getInstance(OsFamily.class);
-    
+
     String stackRepoId = stackName + "-" + stackVersion;
-    
+
     if (0 == oses.length) {
       // do them all
       for (OperatingSystemInfo osi : ami.getOperatingSystems(stackName, stackVersion)) {
         ami.updateRepoBaseURL(stackName, stackVersion, osi.getOsType(),
             stackRepoId, repoUrl);
       }
-      
+
     } else {
       for (String os : oses) {
-        
+
         String family = os_family.find(os);
         if (null != family) {
           String key = ami.generateRepoMetaKey(stackName, stackVersion, os,
@@ -191,7 +166,7 @@ public class StackUpgradeUtil {
 
           String familyKey = ami.generateRepoMetaKey(stackName, stackVersion, family,
               stackRepoId, AmbariMetaInfo.REPOSITORY_XML_PROPERTY_BASEURL);
-          
+
           // need to use (for example) redhat6 if the os is centos6
           MetainfoEntity entity = metaDao.findByKey(key);
           if (null == entity) {
@@ -203,7 +178,7 @@ public class StackUpgradeUtil {
             entity.setMetainfoValue(repoUrl);
             metaDao.merge(entity);
           }
-          
+
           entity = metaDao.findByKey(familyKey);
           if (null == entity) {
             entity = new MetainfoEntity();
@@ -214,7 +189,7 @@ public class StackUpgradeUtil {
             entity.setMetainfoValue(repoUrl);
             metaDao.merge(entity);
           }
-        }        
+        }
       }
     }
   }

http://git-wip-us.apache.org/repos/asf/ambari/blob/746df034/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog150.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog150.java b/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog150.java
index d80909b..03b995a 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog150.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog150.java
@@ -64,6 +64,7 @@ import org.apache.ambari.server.orm.entities.HostRoleCommandEntity;
 import org.apache.ambari.server.orm.entities.KeyValueEntity;
 import org.apache.ambari.server.orm.entities.ServiceComponentDesiredStateEntity;
 import org.apache.ambari.server.orm.entities.ServiceComponentDesiredStateEntityPK;
+import org.apache.ambari.server.orm.entities.StackEntity;
 import org.apache.ambari.server.state.HostComponentAdminState;
 import org.apache.ambari.server.state.PropertyInfo;
 import org.apache.ambari.server.state.ServiceInfo;
@@ -544,7 +545,7 @@ public class UpgradeCatalog150 extends AbstractUpgradeCatalog {
           if (clusterStateDAO.findByPK(clusterEntity.getClusterId()) == null) {
             ClusterStateEntity clusterStateEntity = new ClusterStateEntity();
             clusterStateEntity.setClusterEntity(clusterEntity);
-            clusterStateEntity.setCurrentStackVersion(clusterEntity.getDesiredStackVersion());
+            clusterStateEntity.setCurrentStack(clusterEntity.getDesiredStack());
 
             clusterStateDAO.create(clusterStateEntity);
 
@@ -635,7 +636,7 @@ public class UpgradeCatalog150 extends AbstractUpgradeCatalog {
 
       final ServiceComponentDesiredStateEntity serviceComponentDesiredStateEntity = new ServiceComponentDesiredStateEntity();
       serviceComponentDesiredStateEntity.setComponentName("HISTORYSERVER");
-      serviceComponentDesiredStateEntity.setDesiredStackVersion(clusterEntity.getDesiredStackVersion());
+      serviceComponentDesiredStateEntity.setDesiredStack(clusterEntity.getDesiredStack());
       serviceComponentDesiredStateEntity.setDesiredState(jtServiceComponentDesiredState);
       serviceComponentDesiredStateEntity.setClusterServiceEntity(clusterServiceEntity);
       serviceComponentDesiredStateEntity.setHostComponentDesiredStateEntities(new ArrayList<HostComponentDesiredStateEntity>());
@@ -648,11 +649,11 @@ public class UpgradeCatalog150 extends AbstractUpgradeCatalog {
       final HostComponentStateEntity stateEntity = new HostComponentStateEntity();
       stateEntity.setHostEntity(host);
       stateEntity.setCurrentState(jtCurrState);
-      stateEntity.setCurrentStackVersion(clusterEntity.getDesiredStackVersion());
+      stateEntity.setCurrentStack(clusterEntity.getDesiredStack());
 
       final HostComponentDesiredStateEntity desiredStateEntity = new HostComponentDesiredStateEntity();
       desiredStateEntity.setDesiredState(jtHostComponentDesiredState);
-      desiredStateEntity.setDesiredStackVersion(clusterEntity.getDesiredStackVersion());
+      desiredStateEntity.setDesiredStack(clusterEntity.getDesiredStack());
 
       persistComponentEntities(stateEntity, desiredStateEntity, serviceComponentDesiredStateEntity);
     }
@@ -698,13 +699,9 @@ public class UpgradeCatalog150 extends AbstractUpgradeCatalog {
     List <ClusterEntity> clusterEntities = clusterDAO.findAll();
     for (final ClusterEntity clusterEntity : clusterEntities) {
       Long clusterId = clusterEntity.getClusterId();
-      String desiredStackVersion = clusterEntity.getDesiredStackVersion();
-
-      Map<String, String> clusterInfo =
-        gson.<Map<String, String>>fromJson(desiredStackVersion, Map.class);
-
-      String stackName = clusterInfo.get("stackName");
-      String stackVersion = clusterInfo.get("stackVersion");
+      StackEntity stackEntity = clusterEntity.getDesiredStack();
+      String stackName = stackEntity.getStackName();
+      String stackVersion = stackEntity.getStackVersion();
 
       List<ClusterServiceEntity> clusterServiceEntities = clusterServiceDAO.findAll();
       for (final ClusterServiceEntity clusterServiceEntity : clusterServiceEntities) {
@@ -740,6 +737,8 @@ public class UpgradeCatalog150 extends AbstractUpgradeCatalog {
                   configEntity.setVersion(1L);
                   configEntity.setTimestamp(System.currentTimeMillis());
                   configEntity.setClusterEntity(clusterEntity);
+                  configEntity.setStack(stackEntity);
+
                   LOG.debug("Creating new " + configType + " config...");
                   clusterDAO.createConfig(configEntity);
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/746df034/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog170.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog170.java b/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog170.java
index 2259c92..d6d4567 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog170.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog170.java
@@ -87,6 +87,7 @@ import org.apache.ambari.server.orm.entities.ServiceComponentDesiredStateEntity;
 import org.apache.ambari.server.orm.entities.ServiceComponentDesiredStateEntityPK;
 import org.apache.ambari.server.orm.entities.ServiceDesiredStateEntity;
 import org.apache.ambari.server.orm.entities.ServiceDesiredStateEntityPK;
+import org.apache.ambari.server.orm.entities.StackEntity;
 import org.apache.ambari.server.orm.entities.UserEntity;
 import org.apache.ambari.server.orm.entities.ViewEntity;
 import org.apache.ambari.server.orm.entities.ViewInstanceEntity;
@@ -94,6 +95,7 @@ import org.apache.ambari.server.state.Cluster;
 import org.apache.ambari.server.state.Clusters;
 import org.apache.ambari.server.state.Config;
 import org.apache.ambari.server.state.ConfigHelper;
+import org.apache.ambari.server.state.StackId;
 import org.apache.ambari.server.state.State;
 import org.apache.ambari.server.state.alert.Scope;
 import org.apache.ambari.server.utils.StageUtils;
@@ -128,13 +130,15 @@ public class UpgradeCatalog170 extends AbstractUpgradeCatalog {
   public static final String JOBS_VIEW_INSTANCE_NAME = "JOBS_1";
   public static final String SHOW_JOBS_FOR_NON_ADMIN_KEY = "showJobsForNonAdmin";
   public static final String JOBS_VIEW_INSTANCE_LABEL = "Jobs";
-  public static final String CLUSTER_STATE_STACK_HDP_2_1 = "{\"stackName\":\"HDP\",\"stackVersion\":\"2.1\"}";
   public static final String YARN_TIMELINE_SERVICE_WEBAPP_ADDRESS_PROPERTY = "yarn.timeline-service.webapp.address";
   public static final String YARN_RESOURCEMANAGER_WEBAPP_ADDRESS_PROPERTY = "yarn.resourcemanager.webapp.address";
   public static final String YARN_SITE = "yarn-site";
   public static final String YARN_ATS_URL_PROPERTY = "yarn.ats.url";
   public static final String YARN_RESOURCEMANAGER_URL_PROPERTY = "yarn.resourcemanager.url";
 
+  public static final StackId CLUSTER_STATE_STACK_HDP_2_1 = new StackId("HDP",
+      "2.1");
+
   //SourceVersion is only for book-keeping purpos
   @Override
   public String getSourceVersion() {
@@ -759,7 +763,7 @@ public class UpgradeCatalog170 extends AbstractUpgradeCatalog {
       serviceComponentDesiredStateEntity.setServiceName(serviceName);
       serviceComponentDesiredStateEntity.setComponentName(serviceComponentDesiredStateEntityToDelete.getComponentName());
       serviceComponentDesiredStateEntity.setClusterId(clusterEntity.getClusterId());
-      serviceComponentDesiredStateEntity.setDesiredStackVersion(serviceComponentDesiredStateEntityToDelete.getDesiredStackVersion());
+      serviceComponentDesiredStateEntity.setDesiredStack(serviceComponentDesiredStateEntityToDelete.getDesiredStack());
       serviceComponentDesiredStateEntity.setDesiredState(serviceComponentDesiredStateEntityToDelete.getDesiredState());
       serviceComponentDesiredStateEntity.setClusterServiceEntity(clusterServiceEntity);
 
@@ -771,7 +775,7 @@ public class UpgradeCatalog170 extends AbstractUpgradeCatalog {
         HostComponentDesiredStateEntity hostComponentDesiredStateEntity = new HostComponentDesiredStateEntity();
         hostComponentDesiredStateEntity.setClusterId(clusterEntity.getClusterId());
         hostComponentDesiredStateEntity.setComponentName(hcDesiredStateEntityToBeDeleted.getComponentName());
-        hostComponentDesiredStateEntity.setDesiredStackVersion(hcDesiredStateEntityToBeDeleted.getDesiredStackVersion());
+        hostComponentDesiredStateEntity.setDesiredStack(hcDesiredStateEntityToBeDeleted.getDesiredStack());
         hostComponentDesiredStateEntity.setDesiredState(hcDesiredStateEntityToBeDeleted.getDesiredState());
         hostComponentDesiredStateEntity.setHostEntity(hcDesiredStateEntityToBeDeleted.getHostEntity());
         hostComponentDesiredStateEntity.setAdminState(hcDesiredStateEntityToBeDeleted.getAdminState());
@@ -793,7 +797,7 @@ public class UpgradeCatalog170 extends AbstractUpgradeCatalog {
         HostComponentStateEntity hostComponentStateEntity = new HostComponentStateEntity();
         hostComponentStateEntity.setClusterId(clusterEntity.getClusterId());
         hostComponentStateEntity.setComponentName(hcStateToBeDeleted.getComponentName());
-        hostComponentStateEntity.setCurrentStackVersion(hcStateToBeDeleted.getCurrentStackVersion());
+        hostComponentStateEntity.setCurrentStack(hcStateToBeDeleted.getCurrentStack());
         hostComponentStateEntity.setCurrentState(hcStateToBeDeleted.getCurrentState());
         hostComponentStateEntity.setHostEntity(hcStateToBeDeleted.getHostEntity());
         hostComponentStateEntity.setServiceName(serviceName);
@@ -827,6 +831,8 @@ public class UpgradeCatalog170 extends AbstractUpgradeCatalog {
 
     for (ConfigGroupConfigMappingEntity entity : configGroupsWithGlobalConfigs) {
       String configData = entity.getClusterConfigEntity().getData();
+      StackEntity stackEntity = entity.getClusterConfigEntity().getStack();
+
       Map<String, String> properties = StageUtils.getGson().fromJson(configData, type);
       Cluster cluster = ambariManagementController.getClusters().getClusterById(entity.getClusterId());
       HashMap<String, HashMap<String, String>> configs = new HashMap<String, HashMap<String, String>>();
@@ -866,8 +872,9 @@ public class UpgradeCatalog170 extends AbstractUpgradeCatalog {
         clusterConfigEntity.setTag(tag);
         clusterConfigEntity.setTimestamp(new Date().getTime());
         clusterConfigEntity.setData(StageUtils.getGson().toJson(config.getValue()));
-        clusterDAO.createConfig(clusterConfigEntity);
+        clusterConfigEntity.setStack(stackEntity);
 
+        clusterDAO.createConfig(clusterConfigEntity);
 
         ConfigGroupConfigMappingEntity configGroupConfigMappingEntity = new ConfigGroupConfigMappingEntity();
         configGroupConfigMappingEntity.setTimestamp(System.currentTimeMillis());
@@ -1400,8 +1407,14 @@ public class UpgradeCatalog170 extends AbstractUpgradeCatalog {
     List<ClusterEntity> clusters = clusterDAO.findAll();
     if (!clusters.isEmpty()) {
       ClusterEntity currentCluster = clusters.get(0);
-      String currentStackVersion = currentCluster.getClusterStateEntity().getCurrentStackVersion();
-      if (CLUSTER_STATE_STACK_HDP_2_1.equals(currentStackVersion)) {
+      StackEntity currentStack = currentCluster.getClusterStateEntity().getCurrentStack();
+
+      boolean isStackHdp21 = CLUSTER_STATE_STACK_HDP_2_1.getStackName().equals(
+          currentStack.getStackName())
+          && CLUSTER_STATE_STACK_HDP_2_1.getStackVersion().equals(
+              currentStack.getStackVersion());
+
+      if (isStackHdp21) {
         ViewRegistry.initInstance(viewRegistry);
         viewRegistry.readViewArchives(VIEW_NAME_REG_EXP);
         ViewEntity jobsView = viewDAO.findByCommonName(JOBS_VIEW_NAME);

http://git-wip-us.apache.org/repos/asf/ambari/blob/746df034/ambari-server/src/main/resources/Ambari-DDL-MySQL-CREATE.sql
----------------------------------------------------------------------
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 c3488f2..62a8541 100644
--- a/ambari-server/src/main/resources/Ambari-DDL-MySQL-CREATE.sql
+++ b/ambari-server/src/main/resources/Ambari-DDL-MySQL-CREATE.sql
@@ -1,5 +1,5 @@
 --
--- Licensed to the Apache Software Foundation (ASF) under one
+-- Licensed to the stackpache 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
@@ -30,6 +30,14 @@ delimiter ;
 -- Ambari is transitioning to make the host_id the FK instead of the host_name.
 -- Please do not remove lines that are related to this change and are being staged.
 
+CREATE TABLE stack(
+  stack_id BIGINT NOT NULL,
+  stack_name VARCHAR(255) NOT NULL,
+  stack_version VARCHAR(255) NOT NULL,
+  PRIMARY KEY (stack_id),
+  CONSTRAINT unq_stack UNIQUE(stack_name,stack_version)
+);
+
 CREATE TABLE clusters (
   cluster_id BIGINT NOT NULL,
   resource_id BIGINT NOT NULL,
@@ -38,8 +46,9 @@ CREATE TABLE clusters (
   provisioning_state VARCHAR(255) NOT NULL DEFAULT 'INIT',
   security_type VARCHAR(32) NOT NULL DEFAULT 'NONE',
   desired_cluster_state VARCHAR(255) NOT NULL,
-  desired_stack_version VARCHAR(255) NOT NULL,
-  PRIMARY KEY (cluster_id));
+  desired_stack_id BIGINT NOT NULL,
+  PRIMARY KEY (cluster_id),
+  FOREIGN KEY (desired_stack_id) REFERENCES stack(stack_id));
 
 CREATE TABLE clusterconfig (
   config_id BIGINT NOT NULL,
@@ -47,10 +56,12 @@ CREATE TABLE clusterconfig (
   version BIGINT NOT NULL,
   type_name VARCHAR(255) NOT NULL,
   cluster_id BIGINT NOT NULL,
+  stack_id BIGINT NOT NULL,
   config_data LONGTEXT NOT NULL,
   config_attributes LONGTEXT,
   create_timestamp BIGINT NOT NULL,
-  PRIMARY KEY (config_id));
+  PRIMARY KEY (config_id),
+  FOREIGN KEY (stack_id) REFERENCES stack(stack_id));
 
 CREATE TABLE serviceconfig (
   service_config_id BIGINT NOT NULL,
@@ -58,10 +69,12 @@ CREATE TABLE serviceconfig (
   service_name VARCHAR(255) NOT NULL,
   version BIGINT NOT NULL,
   create_timestamp BIGINT NOT NULL,
+  stack_id BIGINT NOT NULL,
   user_name VARCHAR(255) NOT NULL DEFAULT '_db',
   group_id BIGINT,
   note LONGTEXT,
-  PRIMARY KEY (service_config_id));
+  PRIMARY KEY (service_config_id),
+  FOREIGN KEY (stack_id) REFERENCES stack(stack_id));
 
 CREATE TABLE serviceconfighosts (
   service_config_id BIGINT NOT NULL,
@@ -84,8 +97,9 @@ CREATE TABLE clusterservices (
 CREATE TABLE clusterstate (
   cluster_id BIGINT NOT NULL,
   current_cluster_state VARCHAR(255) NOT NULL,
-  current_stack_version VARCHAR(255) NOT NULL,
-  PRIMARY KEY (cluster_id));
+  current_stack_id BIGINT NOT NULL,
+  PRIMARY KEY (cluster_id),
+  FOREIGN KEY (current_stack_id) REFERENCES stack(stack_id));
 
 CREATE TABLE cluster_version (
   id BIGINT NOT NULL,
@@ -100,7 +114,7 @@ CREATE TABLE cluster_version (
 CREATE TABLE hostcomponentdesiredstate (
   cluster_id BIGINT NOT NULL,
   component_name VARCHAR(255) NOT NULL,
-  desired_stack_version VARCHAR(255) NOT NULL,
+  desired_stack_id BIGINT NOT NULL,
   desired_state VARCHAR(255) NOT NULL,
   host_id BIGINT NOT NULL,
   service_name VARCHAR(255) NOT NULL,
@@ -108,19 +122,21 @@ CREATE TABLE hostcomponentdesiredstate (
   maintenance_state VARCHAR(32) NOT NULL DEFAULT 'ACTIVE',
   security_state VARCHAR(32) NOT NULL DEFAULT 'UNSECURED',
   restart_required TINYINT(1) NOT NULL DEFAULT 0,
-  PRIMARY KEY (cluster_id, component_name, host_id, service_name));
+  PRIMARY KEY (cluster_id, component_name, host_id, service_name),
+  FOREIGN KEY (desired_stack_id) REFERENCES stack(stack_id));
 
 CREATE TABLE hostcomponentstate (
   cluster_id BIGINT NOT NULL,
   component_name VARCHAR(255) NOT NULL,
   version VARCHAR(32) NOT NULL DEFAULT 'UNKNOWN',
-  current_stack_version VARCHAR(255) NOT NULL,
+  current_stack_id BIGINT NOT NULL,
   current_state VARCHAR(255) NOT NULL,
   host_id BIGINT NOT NULL,
   service_name VARCHAR(255) NOT NULL,
   upgrade_state VARCHAR(32) NOT NULL DEFAULT 'NONE',
   security_state VARCHAR(32) NOT NULL DEFAULT 'UNSECURED',
-  PRIMARY KEY (cluster_id, component_name, host_id, service_name));
+  PRIMARY KEY (cluster_id, component_name, host_id, service_name),
+  FOREIGN KEY (current_stack_id) REFERENCES stack(stack_id));
 
 CREATE TABLE hosts (
   host_id BIGINT NOT NULL,
@@ -162,20 +178,22 @@ CREATE TABLE host_version (
 CREATE TABLE servicecomponentdesiredstate (
   component_name VARCHAR(255) NOT NULL,
   cluster_id BIGINT NOT NULL,
-  desired_stack_version VARCHAR(255) NOT NULL,
+  desired_stack_id BIGINT NOT NULL,
   desired_state VARCHAR(255) NOT NULL,
   service_name VARCHAR(255) NOT NULL,
-  PRIMARY KEY (component_name, cluster_id, service_name));
+  PRIMARY KEY (component_name, cluster_id, service_name),
+  FOREIGN KEY (desired_stack_id) REFERENCES stack(stack_id));
 
 CREATE TABLE servicedesiredstate (
   cluster_id BIGINT NOT NULL,
   desired_host_role_mapping INTEGER NOT NULL,
-  desired_stack_version VARCHAR(255) NOT NULL,
+  desired_stack_id BIGINT NOT NULL,
   desired_state VARCHAR(255) NOT NULL,
   service_name VARCHAR(255) NOT NULL,
   maintenance_state VARCHAR(32) NOT NULL DEFAULT 'ACTIVE',
   security_state VARCHAR(32) NOT NULL DEFAULT 'UNSECURED',
-  PRIMARY KEY (cluster_id, service_name));
+  PRIMARY KEY (cluster_id, service_name),
+  FOREIGN KEY (desired_stack_id) REFERENCES stack(stack_id));
 
 CREATE TABLE users (
   user_id INTEGER,
@@ -387,9 +405,9 @@ CREATE TABLE requestschedulebatchrequest (
 
 CREATE TABLE blueprint (
   blueprint_name VARCHAR(255) NOT NULL,
-  stack_name VARCHAR(255) NOT NULL,
-  stack_version VARCHAR(255) NOT NULL,
-  PRIMARY KEY(blueprint_name));
+  stack_id BIGINT NOT NULL,
+  PRIMARY KEY(blueprint_name),
+  FOREIGN KEY (stack_id) REFERENCES stack(stack_id));
 
 CREATE TABLE hostgroup (
   blueprint_name VARCHAR(255) NOT NULL,
@@ -527,13 +545,13 @@ CREATE TABLE adminprivilege (
 
 CREATE TABLE repo_version (
   repo_version_id BIGINT NOT NULL,
-  stack VARCHAR(255) NOT NULL,
+  stack_id BIGINT NOT NULL,
   version VARCHAR(255) NOT NULL,
   display_name VARCHAR(128) NOT NULL,
   upgrade_package VARCHAR(255) NOT NULL,
   repositories LONGTEXT NOT NULL,
-  PRIMARY KEY(repo_version_id)
-);
+  PRIMARY KEY(repo_version_id),
+  FOREIGN KEY (stack_id) REFERENCES stack(stack_id));
 
 CREATE TABLE widget (
   id BIGINT NOT NULL,
@@ -587,7 +605,7 @@ ALTER TABLE viewinstance ADD CONSTRAINT UQ_viewinstance_name_id UNIQUE (view_ins
 ALTER TABLE serviceconfig ADD CONSTRAINT UQ_scv_service_version UNIQUE (cluster_id, service_name, version);
 ALTER TABLE adminpermission ADD CONSTRAINT UQ_perm_name_resource_type_id UNIQUE (permission_name, resource_type_id);
 ALTER TABLE repo_version ADD CONSTRAINT UQ_repo_version_display_name UNIQUE (display_name);
-ALTER TABLE repo_version ADD CONSTRAINT UQ_repo_version_stack_version UNIQUE (stack, version);
+ALTER TABLE repo_version ADD CONSTRAINT UQ_repo_version_stack_version UNIQUE (stack_id, version);
 
 -- altering tables by creating foreign keys----------
 ALTER TABLE members ADD CONSTRAINT FK_members_group_id FOREIGN KEY (group_id) REFERENCES groups (group_id);
@@ -826,14 +844,6 @@ CREATE TABLE upgrade_item (
   FOREIGN KEY (upgrade_group_id) REFERENCES upgrade_group(upgrade_group_id)
 );
 
-CREATE TABLE stack(
-  stack_id BIGINT NOT NULL,
-  stack_name VARCHAR(255) NOT NULL,
-  stack_version VARCHAR(255) NOT NULL,
-  PRIMARY KEY (stack_id),
-  CONSTRAINT unq_stack UNIQUE(stack_name,stack_version)
-);
-
 -- In order for the first ID to be 1, must initialize the ambari_sequences table with a sequence_value of 0.
 INSERT INTO ambari_sequences(sequence_name, sequence_value) values ('cluster_id_seq', 1);
 INSERT INTO ambari_sequences(sequence_name, sequence_value) values ('host_id_seq', 0);

http://git-wip-us.apache.org/repos/asf/ambari/blob/746df034/ambari-server/src/main/resources/Ambari-DDL-Oracle-CREATE.sql
----------------------------------------------------------------------
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 0455e9e..436e438 100644
--- a/ambari-server/src/main/resources/Ambari-DDL-Oracle-CREATE.sql
+++ b/ambari-server/src/main/resources/Ambari-DDL-Oracle-CREATE.sql
@@ -21,6 +21,14 @@
 -- Please do not remove lines that are related to this change and are being staged.
 
 ------create tables---------
+CREATE TABLE stack(
+  stack_id NUMBER(19) NOT NULL,
+  stack_name VARCHAR2(255) NOT NULL,
+  stack_version VARCHAR2(255) NOT NULL,
+  PRIMARY KEY (stack_id),
+  CONSTRAINT unq_stack UNIQUE(stack_name,stack_version)
+);
+
 CREATE TABLE clusters (
   cluster_id NUMBER(19) NOT NULL,
   resource_id NUMBER(19) NOT NULL,
@@ -29,8 +37,9 @@ CREATE TABLE clusters (
   provisioning_state VARCHAR2(255) DEFAULT 'INIT' NOT NULL,
   security_type VARCHAR2(32) DEFAULT 'NONE' NOT NULL,
   desired_cluster_state VARCHAR2(255) NULL,
-  desired_stack_version VARCHAR2(255) NULL,
-  PRIMARY KEY (cluster_id));
+  desired_stack_id NUMBER(19) NOT NULL,
+  PRIMARY KEY (cluster_id),
+  FOREIGN KEY (desired_stack_id) REFERENCES stack(stack_id));
 
 CREATE TABLE clusterconfig (
   config_id NUMBER(19) NOT NULL,
@@ -38,10 +47,12 @@ CREATE TABLE clusterconfig (
   version NUMBER(19) NOT NULL,
   type_name VARCHAR2(255) NOT NULL,
   cluster_id NUMBER(19) NOT NULL,
+  stack_id NUMBER(19) NOT NULL,
   config_data CLOB NOT NULL,
   config_attributes CLOB,
   create_timestamp NUMBER(19) NOT NULL,
-  PRIMARY KEY (config_id));
+  PRIMARY KEY (config_id),
+  FOREIGN KEY (stack_id) REFERENCES stack(stack_id));
 
 CREATE TABLE serviceconfig (
   service_config_id NUMBER(19) NOT NULL,
@@ -49,10 +60,12 @@ CREATE TABLE serviceconfig (
   service_name VARCHAR(255) NOT NULL,
   version NUMBER(19) NOT NULL,
   create_timestamp NUMBER(19) NOT NULL,
+  stack_id NUMBER(19) NOT NULL,
   user_name VARCHAR(255) DEFAULT '_db' NOT NULL,
   group_id NUMBER(19),
   note CLOB,
-  PRIMARY KEY (service_config_id));
+  PRIMARY KEY (service_config_id),
+  FOREIGN KEY (stack_id) REFERENCES stack(stack_id));
 
 CREATE TABLE serviceconfighosts (
   service_config_id NUMBER(19) NOT NULL,
@@ -73,8 +86,9 @@ CREATE TABLE clusterservices (
 CREATE TABLE clusterstate (
   cluster_id NUMBER(19) NOT NULL,
   current_cluster_state VARCHAR2(255) NULL,
-  current_stack_version VARCHAR2(255) NULL,
-  PRIMARY KEY (cluster_id));
+  current_stack_id NUMBER(19) NULL,
+  PRIMARY KEY (cluster_id),
+  FOREIGN KEY (current_stack_id) REFERENCES stack(stack_id));
 
 CREATE TABLE cluster_version (
   id NUMBER(19) NULL,
@@ -89,7 +103,7 @@ CREATE TABLE cluster_version (
 CREATE TABLE hostcomponentdesiredstate (
   cluster_id NUMBER(19) NOT NULL,
   component_name VARCHAR2(255) NOT NULL,
-  desired_stack_version VARCHAR2(255) NULL,
+  desired_stack_id NUMBER(19) NULL,
   desired_state VARCHAR2(255) NOT NULL,
   host_id NUMBER(19) NOT NULL,
   service_name VARCHAR2(255) NOT NULL,
@@ -97,19 +111,21 @@ CREATE TABLE hostcomponentdesiredstate (
   maintenance_state VARCHAR2(32) NOT NULL,
   security_state VARCHAR2(32) DEFAULT 'UNSECURED' NOT NULL,
   restart_required NUMBER(1) DEFAULT 0 NOT NULL,
-  PRIMARY KEY (cluster_id, component_name, host_id, service_name));
+  PRIMARY KEY (cluster_id, component_name, host_id, service_name),
+  FOREIGN KEY (desired_stack_id) REFERENCES stack(stack_id));
 
 CREATE TABLE hostcomponentstate (
   cluster_id NUMBER(19) NOT NULL,
   component_name VARCHAR2(255) NOT NULL,
   version VARCHAR2(32) DEFAULT 'UNKNOWN' NOT NULL,
-  current_stack_version VARCHAR2(255) NOT NULL,
+  current_stack_id NUMBER(19) NOT NULL,
   current_state VARCHAR2(255) NOT NULL,
   host_id NUMBER(19) NOT NULL,
   service_name VARCHAR2(255) NOT NULL,
   upgrade_state VARCHAR2(32) DEFAULT 'NONE' NOT NULL,
   security_state VARCHAR2(32) DEFAULT 'UNSECURED' NOT NULL,
-  PRIMARY KEY (cluster_id, component_name, host_id, service_name));
+  PRIMARY KEY (cluster_id, component_name, host_id, service_name),
+  FOREIGN KEY (current_stack_id) REFERENCES stack(stack_id));
 
 CREATE TABLE hosts (
   host_id NUMBER(19) NOT NULL,
@@ -151,20 +167,22 @@ CREATE TABLE host_version (
 CREATE TABLE servicecomponentdesiredstate (
   component_name VARCHAR2(255) NOT NULL,
   cluster_id NUMBER(19) NOT NULL,
-  desired_stack_version VARCHAR2(255) NULL,
+  desired_stack_id NUMBER(19) NOT NULL,
   desired_state VARCHAR2(255) NOT NULL,
   service_name VARCHAR2(255) NOT NULL,
-  PRIMARY KEY (component_name, cluster_id, service_name));
+  PRIMARY KEY (component_name, cluster_id, service_name),
+  FOREIGN KEY (desired_stack_id) REFERENCES stack(stack_id));
 
 CREATE TABLE servicedesiredstate (
   cluster_id NUMBER(19) NOT NULL,
   desired_host_role_mapping NUMBER(10) NOT NULL,
-  desired_stack_version VARCHAR2(255) NULL,
+  desired_stack_id NUMBER(19) NOT NULL,
   desired_state VARCHAR2(255) NOT NULL,
   service_name VARCHAR2(255) NOT NULL,
   maintenance_state VARCHAR2(32) NOT NULL,
   security_state VARCHAR2(32) DEFAULT 'UNSECURED' NOT NULL,
-  PRIMARY KEY (cluster_id, service_name));
+  PRIMARY KEY (cluster_id, service_name),
+  FOREIGN KEY (desired_stack_id) REFERENCES stack(stack_id));
 
 CREATE TABLE users (
   user_id NUMBER(10) NOT NULL,
@@ -377,9 +395,9 @@ CREATE TABLE requestschedulebatchrequest (
 
 CREATE TABLE blueprint (
   blueprint_name VARCHAR2(255) NOT NULL,
-  stack_name VARCHAR2(255) NOT NULL,
-  stack_version VARCHAR2(255) NOT NULL,
-  PRIMARY KEY(blueprint_name));
+  stack_id NUMBER(19) NOT NULL,
+  PRIMARY KEY(blueprint_name),
+  FOREIGN KEY (stack_id) REFERENCES stack(stack_id));
 
 CREATE TABLE hostgroup (
   blueprint_name VARCHAR2(255) NOT NULL,
@@ -515,12 +533,13 @@ CREATE TABLE adminprivilege (
 
 CREATE TABLE repo_version (
   repo_version_id NUMBER(19) NOT NULL,
-  stack VARCHAR2(255) NOT NULL,
+  stack_id NUMBER(19) NOT NULL,
   version VARCHAR2(255) NOT NULL,
   display_name VARCHAR2(128) NOT NULL,
   upgrade_package VARCHAR2(255) NOT NULL,
   repositories CLOB NOT NULL,
-  PRIMARY KEY(repo_version_id)
+  PRIMARY KEY(repo_version_id),
+  FOREIGN KEY (stack_id) REFERENCES stack(stack_id)
 );
 
 CREATE TABLE widget (
@@ -575,7 +594,7 @@ ALTER TABLE viewinstance ADD CONSTRAINT UQ_viewinstance_name_id UNIQUE (view_ins
 ALTER TABLE serviceconfig ADD CONSTRAINT UQ_scv_service_version UNIQUE (cluster_id, service_name, version);
 ALTER TABLE adminpermission ADD CONSTRAINT UQ_perm_name_resource_type_id UNIQUE (permission_name, resource_type_id);
 ALTER TABLE repo_version ADD CONSTRAINT UQ_repo_version_display_name UNIQUE (display_name);
-ALTER TABLE repo_version ADD CONSTRAINT UQ_repo_version_stack_version UNIQUE (stack, version);
+ALTER TABLE repo_version ADD CONSTRAINT UQ_repo_version_stack_version UNIQUE (stack_id, version);
 
 --------altering tables by creating foreign keys----------
 ALTER TABLE members ADD CONSTRAINT FK_members_group_id FOREIGN KEY (group_id) REFERENCES groups (group_id);
@@ -816,14 +835,6 @@ CREATE TABLE upgrade_item (
   FOREIGN KEY (upgrade_group_id) REFERENCES upgrade_group(upgrade_group_id)
 );
 
-CREATE TABLE stack(
-  stack_id NUMBER(19) NOT NULL,
-  stack_name VARCHAR2(255) NOT NULL,
-  stack_version VARCHAR2(255) NOT NULL,
-  PRIMARY KEY (stack_id),
-  CONSTRAINT unq_stack UNIQUE(stack_name,stack_version)
-);
-
 ---------inserting some data-----------
 -- In order for the first ID to be 1, must initialize the ambari_sequences table with a sequence_value of 0.
 INSERT INTO ambari_sequences(sequence_name, sequence_value) values ('host_role_command_id_seq', 0);

http://git-wip-us.apache.org/repos/asf/ambari/blob/746df034/ambari-server/src/main/resources/Ambari-DDL-Postgres-CREATE.sql
----------------------------------------------------------------------
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 2c381b2..2cec20a 100644
--- a/ambari-server/src/main/resources/Ambari-DDL-Postgres-CREATE.sql
+++ b/ambari-server/src/main/resources/Ambari-DDL-Postgres-CREATE.sql
@@ -21,6 +21,14 @@
 -- Please do not remove lines that are related to this change and are being staged.
 
 ------create tables and grant privileges to db user---------
+CREATE TABLE stack(
+  stack_id BIGINT NOT NULL,
+  stack_name VARCHAR(255) NOT NULL,
+  stack_version VARCHAR(255) NOT NULL,
+  PRIMARY KEY (stack_id),
+  CONSTRAINT unq_stack UNIQUE(stack_name,stack_version)
+);
+
 CREATE TABLE clusters (
   cluster_id BIGINT NOT NULL,
   resource_id BIGINT NOT NULL,
@@ -29,8 +37,9 @@ CREATE TABLE clusters (
   provisioning_state VARCHAR(255) NOT NULL DEFAULT 'INIT',
   security_type VARCHAR(32) NOT NULL DEFAULT 'NONE',
   desired_cluster_state VARCHAR(255) NOT NULL,
-  desired_stack_version VARCHAR(255) NOT NULL,
-  PRIMARY KEY (cluster_id));
+  desired_stack_id BIGINT NOT NULL,
+  PRIMARY KEY (cluster_id),
+  FOREIGN KEY (desired_stack_id) REFERENCES stack(stack_id));
 
 CREATE TABLE clusterconfig (
   config_id BIGINT NOT NULL,
@@ -38,10 +47,12 @@ CREATE TABLE clusterconfig (
   version BIGINT NOT NULL,
   type_name VARCHAR(255) NOT NULL,
   cluster_id BIGINT NOT NULL,
+  stack_id BIGINT NOT NULL,
   config_data TEXT NOT NULL,
   config_attributes VARCHAR(32000),
   create_timestamp BIGINT NOT NULL,
-  PRIMARY KEY (config_id));
+  PRIMARY KEY (config_id),
+  FOREIGN KEY (stack_id) REFERENCES stack(stack_id));
 
 CREATE TABLE clusterconfigmapping (
   cluster_id BIGINT NOT NULL,
@@ -58,10 +69,12 @@ CREATE TABLE serviceconfig (
   service_name VARCHAR(255) NOT NULL,
   version BIGINT NOT NULL,
   create_timestamp BIGINT NOT NULL,
+  stack_id BIGINT NOT NULL,
   user_name VARCHAR(255) NOT NULL DEFAULT '_db',
   group_id BIGINT,
   note TEXT,
-  PRIMARY KEY (service_config_id));
+  PRIMARY KEY (service_config_id),
+  FOREIGN KEY (stack_id) REFERENCES stack(stack_id));
 
 CREATE TABLE serviceconfighosts (
   service_config_id BIGINT NOT NULL,
@@ -82,9 +95,10 @@ CREATE TABLE clusterservices (
 CREATE TABLE clusterstate (
   cluster_id BIGINT NOT NULL,
   current_cluster_state VARCHAR(255) NOT NULL,
-  current_stack_version VARCHAR(255) NOT NULL,
-  PRIMARY KEY (cluster_id));
-
+  current_stack_id BIGINT NOT NULL,
+  PRIMARY KEY (cluster_id),
+  FOREIGN KEY (current_stack_id) REFERENCES stack(stack_id));
+  
 CREATE TABLE cluster_version (
   id BIGINT NOT NULL,
   repo_version_id BIGINT NOT NULL,
@@ -98,7 +112,7 @@ CREATE TABLE cluster_version (
 CREATE TABLE hostcomponentdesiredstate (
   cluster_id BIGINT NOT NULL,
   component_name VARCHAR(255) NOT NULL,
-  desired_stack_version VARCHAR(255) NOT NULL,
+  desired_stack_id BIGINT NOT NULL,
   desired_state VARCHAR(255) NOT NULL,
   host_id BIGINT NOT NULL,
   service_name VARCHAR(255) NOT NULL,
@@ -106,19 +120,21 @@ CREATE TABLE hostcomponentdesiredstate (
   maintenance_state VARCHAR(32) NOT NULL,
   security_state VARCHAR(32) NOT NULL DEFAULT 'UNSECURED',
   restart_required SMALLINT NOT NULL DEFAULT 0,
-  PRIMARY KEY (cluster_id, component_name, host_id, service_name));
+  PRIMARY KEY (cluster_id, component_name, host_id, service_name),
+  FOREIGN KEY (desired_stack_id) REFERENCES stack(stack_id));
 
 CREATE TABLE hostcomponentstate (
   cluster_id BIGINT NOT NULL,
   component_name VARCHAR(255) NOT NULL,
   version VARCHAR(32) NOT NULL DEFAULT 'UNKNOWN',
-  current_stack_version VARCHAR(255) NOT NULL,
+  current_stack_id BIGINT NOT NULL,
   current_state VARCHAR(255) NOT NULL,
   host_id BIGINT NOT NULL,
   service_name VARCHAR(255) NOT NULL,
   upgrade_state VARCHAR(32) NOT NULL DEFAULT 'NONE',
   security_state VARCHAR(32) NOT NULL DEFAULT 'UNSECURED',
-  PRIMARY KEY (cluster_id, component_name, host_id, service_name));
+  PRIMARY KEY (cluster_id, component_name, host_id, service_name),
+  FOREIGN KEY (current_stack_id) REFERENCES stack(stack_id));
 
 CREATE TABLE hosts (
   host_id BIGINT NOT NULL,
@@ -160,20 +176,22 @@ CREATE TABLE host_version (
 CREATE TABLE servicecomponentdesiredstate (
   component_name VARCHAR(255) NOT NULL,
   cluster_id BIGINT NOT NULL,
-  desired_stack_version VARCHAR(255) NOT NULL,
+  desired_stack_id BIGINT NOT NULL,
   desired_state VARCHAR(255) NOT NULL,
   service_name VARCHAR(255) NOT NULL,
-  PRIMARY KEY (component_name, cluster_id, service_name));
+  PRIMARY KEY (component_name, cluster_id, service_name),
+  FOREIGN KEY (desired_stack_id) REFERENCES stack(stack_id));
 
 CREATE TABLE servicedesiredstate (
   cluster_id BIGINT NOT NULL,
   desired_host_role_mapping INTEGER NOT NULL,
-  desired_stack_version VARCHAR(255) NOT NULL,
+  desired_stack_id BIGINT NOT NULL,
   desired_state VARCHAR(255) NOT NULL,
   service_name VARCHAR(255) NOT NULL,
   maintenance_state VARCHAR(32) NOT NULL,
   security_state VARCHAR(32) NOT NULL DEFAULT 'UNSECURED',
-  PRIMARY KEY (cluster_id, service_name));
+  PRIMARY KEY (cluster_id, service_name),
+  FOREIGN KEY (desired_stack_id) REFERENCES stack(stack_id));
 
 CREATE TABLE users (
   user_id INTEGER,
@@ -379,9 +397,9 @@ CREATE TABLE requestschedulebatchrequest (
 
 CREATE TABLE blueprint (
   blueprint_name VARCHAR(255) NOT NULL,
-  stack_name VARCHAR(255) NOT NULL,
-  stack_version VARCHAR(255) NOT NULL,
-  PRIMARY KEY(blueprint_name));
+  stack_id BIGINT NOT NULL,
+  PRIMARY KEY(blueprint_name),
+  FOREIGN KEY (stack_id) REFERENCES stack(stack_id));
 
 CREATE TABLE hostgroup (
   blueprint_name VARCHAR(255) NOT NULL,
@@ -520,12 +538,13 @@ CREATE TABLE adminprivilege (
 
 CREATE TABLE repo_version (
   repo_version_id BIGINT NOT NULL,
-  stack VARCHAR(255) NOT NULL,
+  stack_id BIGINT NOT NULL,
   version VARCHAR(255) NOT NULL,
   display_name VARCHAR(128) NOT NULL,
   upgrade_package VARCHAR(255) NOT NULL,
   repositories TEXT NOT NULL,
-  PRIMARY KEY(repo_version_id)
+  PRIMARY KEY(repo_version_id),
+  FOREIGN KEY (stack_id) REFERENCES stack(stack_id));
 );
 
 CREATE TABLE widget (
@@ -577,7 +596,7 @@ ALTER TABLE viewinstance ADD CONSTRAINT UQ_viewinstance_name_id UNIQUE (view_ins
 ALTER TABLE serviceconfig ADD CONSTRAINT UQ_scv_service_version UNIQUE (cluster_id, service_name, version);
 ALTER TABLE adminpermission ADD CONSTRAINT UQ_perm_name_resource_type_id UNIQUE (permission_name, resource_type_id);
 ALTER TABLE repo_version ADD CONSTRAINT UQ_repo_version_display_name UNIQUE (display_name);
-ALTER TABLE repo_version ADD CONSTRAINT UQ_repo_version_stack_version UNIQUE (stack, version);
+ALTER TABLE repo_version ADD CONSTRAINT UQ_repo_version_stack_version UNIQUE (stack_id, version);
 
 --------altering tables by creating foreign keys----------
 ALTER TABLE members ADD CONSTRAINT FK_members_group_id FOREIGN KEY (group_id) REFERENCES groups (group_id);
@@ -818,14 +837,6 @@ CREATE TABLE upgrade_item (
   FOREIGN KEY (upgrade_group_id) REFERENCES upgrade_group(upgrade_group_id)
 );
 
-CREATE TABLE stack(
-  stack_id BIGINT NOT NULL,
-  stack_name VARCHAR(255) NOT NULL,
-  stack_version VARCHAR(255) NOT NULL,
-  PRIMARY KEY (stack_id),
-  CONSTRAINT unq_stack UNIQUE(stack_name,stack_version)
-);
-
 ---------inserting some data-----------
 -- In order for the first ID to be 1, must initialize the ambari_sequences table with a sequence_value of 0.
 BEGIN;

http://git-wip-us.apache.org/repos/asf/ambari/blob/746df034/ambari-server/src/main/resources/Ambari-DDL-Postgres-EMBEDDED-CREATE.sql
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/Ambari-DDL-Postgres-EMBEDDED-CREATE.sql b/ambari-server/src/main/resources/Ambari-DDL-Postgres-EMBEDDED-CREATE.sql
index 24762eb..d2edab0 100644
--- a/ambari-server/src/main/resources/Ambari-DDL-Postgres-EMBEDDED-CREATE.sql
+++ b/ambari-server/src/main/resources/Ambari-DDL-Postgres-EMBEDDED-CREATE.sql
@@ -32,6 +32,15 @@ ALTER ROLE :username SET search_path TO 'ambari';
 -- Please do not remove lines that are related to this change and are being staged.
 
 ------create tables and grant privileges to db user---------
+CREATE TABLE ambari.stack(
+  stack_id BIGINT NOT NULL,
+  stack_name VARCHAR(255) NOT NULL,
+  stack_version VARCHAR(255) NOT NULL,
+  PRIMARY KEY (stack_id),
+  CONSTRAINT unq_stack UNIQUE(stack_name,stack_version)
+);
+GRANT ALL PRIVILEGES ON TABLE ambari.stack TO :username;
+
 CREATE TABLE ambari.clusters (
   cluster_id BIGINT NOT NULL,
   resource_id BIGINT NOT NULL,
@@ -40,8 +49,9 @@ CREATE TABLE ambari.clusters (
   provisioning_state VARCHAR(255) NOT NULL DEFAULT 'INIT',
   security_type VARCHAR(32) NOT NULL DEFAULT 'NONE',
   desired_cluster_state VARCHAR(255) NOT NULL,
-  desired_stack_version VARCHAR(255) NOT NULL,
-  PRIMARY KEY (cluster_id));
+  desired_stack_id BIGINT NOT NULL,
+  PRIMARY KEY (cluster_id),
+  FOREIGN KEY (desired_stack_id) REFERENCES ambari.stack(stack_id));
 GRANT ALL PRIVILEGES ON TABLE ambari.clusters TO :username;
 
 CREATE TABLE ambari.clusterconfig (
@@ -50,10 +60,12 @@ CREATE TABLE ambari.clusterconfig (
   version BIGINT NOT NULL,
   type_name VARCHAR(255) NOT NULL,
   cluster_id BIGINT NOT NULL,
+  stack_id BIGINT NOT NULL,
   config_data TEXT NOT NULL,
   config_attributes VARCHAR(32000),
   create_timestamp BIGINT NOT NULL,
-  PRIMARY KEY (config_id));
+  PRIMARY KEY (config_id),
+  FOREIGN KEY (stack_id) REFERENCES ambari.stack(stack_id));
 GRANT ALL PRIVILEGES ON TABLE ambari.clusterconfig TO :username;
 
 CREATE TABLE ambari.clusterconfigmapping (
@@ -72,10 +84,12 @@ CREATE TABLE ambari.serviceconfig (
   service_name VARCHAR(255) NOT NULL,
   version BIGINT NOT NULL,
   create_timestamp BIGINT NOT NULL,
+  stack_id BIGINT NOT NULL,
   user_name VARCHAR(255) NOT NULL DEFAULT '_db',
   group_id BIGINT,
   note TEXT,
-  PRIMARY KEY (service_config_id));
+  PRIMARY KEY (service_config_id),
+  FOREIGN KEY (stack_id) REFERENCES ambari.stack(stack_id));
 GRANT ALL PRIVILEGES ON TABLE ambari.serviceconfig TO :username;
 
 CREATE TABLE ambari.serviceconfighosts (
@@ -100,8 +114,9 @@ GRANT ALL PRIVILEGES ON TABLE ambari.clusterservices TO :username;
 CREATE TABLE ambari.clusterstate (
   cluster_id BIGINT NOT NULL,
   current_cluster_state VARCHAR(255) NOT NULL,
-  current_stack_version VARCHAR(255) NOT NULL,
-  PRIMARY KEY (cluster_id));
+  current_stack_id BIGINT NOT NULL,
+  PRIMARY KEY (cluster_id),
+  FOREIGN KEY (current_stack_id) REFERENCES ambari.stack(stack_id));
 GRANT ALL PRIVILEGES ON TABLE ambari.clusterstate TO :username;
 
 CREATE TABLE ambari.cluster_version (
@@ -118,7 +133,7 @@ GRANT ALL PRIVILEGES ON TABLE ambari.cluster_version TO :username;
 CREATE TABLE ambari.hostcomponentdesiredstate (
   cluster_id BIGINT NOT NULL,
   component_name VARCHAR(255) NOT NULL,
-  desired_stack_version VARCHAR(255) NOT NULL,
+  desired_stack_id BIGINT NOT NULL,
   desired_state VARCHAR(255) NOT NULL,
   host_id BIGINT NOT NULL,
   service_name VARCHAR(255) NOT NULL,
@@ -126,20 +141,22 @@ CREATE TABLE ambari.hostcomponentdesiredstate (
   maintenance_state VARCHAR(32) NOT NULL,
   security_state VARCHAR(32) NOT NULL DEFAULT 'UNSECURED',
   restart_required SMALLINT NOT NULL DEFAULT 0,
-  PRIMARY KEY (cluster_id, component_name, host_id, service_name));
+  PRIMARY KEY (cluster_id, component_name, host_id, service_name),
+  FOREIGN KEY (desired_stack_id) REFERENCES ambari.stack(stack_id));
 GRANT ALL PRIVILEGES ON TABLE ambari.hostcomponentdesiredstate TO :username;
 
 CREATE TABLE ambari.hostcomponentstate (
   cluster_id BIGINT NOT NULL,
   component_name VARCHAR(255) NOT NULL,
   version VARCHAR(32) NOT NULL DEFAULT 'UNKNOWN',
-  current_stack_version VARCHAR(255) NOT NULL,
+  current_stack_id BIGINT NOT NULL,
   current_state VARCHAR(255) NOT NULL,
   host_id BIGINT NOT NULL,
   service_name VARCHAR(255) NOT NULL,
   upgrade_state VARCHAR(32) NOT NULL DEFAULT 'NONE',
   security_state VARCHAR(32) NOT NULL DEFAULT 'UNSECURED',
-  PRIMARY KEY (cluster_id, component_name, host_id, service_name));
+  PRIMARY KEY (cluster_id, component_name, host_id, service_name),
+  FOREIGN KEY (current_stack_id) REFERENCES ambari.stack(stack_id));
 GRANT ALL PRIVILEGES ON TABLE ambari.hostcomponentstate TO :username;
 
 CREATE TABLE ambari.hosts (
@@ -185,21 +202,23 @@ GRANT ALL PRIVILEGES ON TABLE ambari.host_version TO :username;
 CREATE TABLE ambari.servicecomponentdesiredstate (
   component_name VARCHAR(255) NOT NULL,
   cluster_id BIGINT NOT NULL,
-  desired_stack_version VARCHAR(255) NOT NULL,
+  desired_stack_id BIGINT NOT NULL,
   desired_state VARCHAR(255) NOT NULL,
   service_name VARCHAR(255) NOT NULL,
-  PRIMARY KEY (component_name, cluster_id, service_name));
+  PRIMARY KEY (component_name, cluster_id, service_name),
+  FOREIGN KEY (desired_stack_id) REFERENCES ambari.stack(stack_id));
 GRANT ALL PRIVILEGES ON TABLE ambari.servicecomponentdesiredstate TO :username;
 
 CREATE TABLE ambari.servicedesiredstate (
   cluster_id BIGINT NOT NULL,
   desired_host_role_mapping INTEGER NOT NULL,
-  desired_stack_version VARCHAR(255) NOT NULL,
+  desired_stack_id BIGINT NOT NULL,
   desired_state VARCHAR(255) NOT NULL,
   service_name VARCHAR(255) NOT NULL,
   maintenance_state VARCHAR(32) NOT NULL,
   security_state VARCHAR(32) NOT NULL DEFAULT 'UNSECURED',
-  PRIMARY KEY (cluster_id, service_name));
+  PRIMARY KEY (cluster_id, service_name),
+  FOREIGN KEY (desired_stack_id) REFERENCES ambari.stack(stack_id));
 GRANT ALL PRIVILEGES ON TABLE ambari.servicedesiredstate TO :username;
 
 CREATE TABLE ambari.users (
@@ -426,9 +445,9 @@ GRANT ALL PRIVILEGES ON TABLE ambari.requestschedulebatchrequest TO :username;
 
 CREATE TABLE ambari.blueprint (
   blueprint_name VARCHAR(255) NOT NULL,
-  stack_name VARCHAR(255) NOT NULL,
-  stack_version VARCHAR(255) NOT NULL,
-  PRIMARY KEY(blueprint_name));
+  stack_id BIGINT NOT NULL,
+  PRIMARY KEY(blueprint_name),
+  FOREIGN KEY (stack_id) REFERENCES ambari.stack(stack_id));
 
 CREATE TABLE ambari.hostgroup (
   blueprint_name VARCHAR(255) NOT NULL,
@@ -587,12 +606,13 @@ GRANT ALL PRIVILEGES ON TABLE ambari.adminprivilege TO :username;
 
 CREATE TABLE ambari.repo_version (
   repo_version_id BIGINT NOT NULL,
-  stack VARCHAR(255) NOT NULL,
+  stack_id BIGINT NOT NULL,
   version VARCHAR(255) NOT NULL,
   display_name VARCHAR(128) NOT NULL,
   upgrade_package VARCHAR(255) NOT NULL,
   repositories TEXT NOT NULL,
-  PRIMARY KEY(repo_version_id)
+  PRIMARY KEY(repo_version_id),
+  FOREIGN KEY (stack_id) REFERENCES ambari.stack(stack_id)
 );
 GRANT ALL PRIVILEGES ON TABLE ambari.repo_version TO :username;
 
@@ -649,7 +669,7 @@ ALTER TABLE ambari.viewinstance ADD CONSTRAINT UQ_viewinstance_name_id UNIQUE (v
 ALTER TABLE ambari.serviceconfig ADD CONSTRAINT UQ_scv_service_version UNIQUE (cluster_id, service_name, version);
 ALTER TABLE ambari.adminpermission ADD CONSTRAINT UQ_perm_name_resource_type_id UNIQUE (permission_name, resource_type_id);
 ALTER TABLE ambari.repo_version ADD CONSTRAINT UQ_repo_version_display_name UNIQUE (display_name);
-ALTER TABLE ambari.repo_version ADD CONSTRAINT UQ_repo_version_stack_version UNIQUE (stack, version);
+ALTER TABLE ambari.repo_version ADD CONSTRAINT UQ_repo_version_stack_version UNIQUE (stack_id, version);
 
 --------altering tables by creating foreign keys----------
 ALTER TABLE ambari.members ADD CONSTRAINT FK_members_group_id FOREIGN KEY (group_id) REFERENCES ambari.groups (group_id);
@@ -906,16 +926,6 @@ GRANT ALL PRIVILEGES ON TABLE ambari.upgrade TO :username;
 GRANT ALL PRIVILEGES ON TABLE ambari.upgrade_group TO :username;
 GRANT ALL PRIVILEGES ON TABLE ambari.upgrade_item TO :username;
 
-CREATE TABLE ambari.stack(
-  stack_id BIGINT NOT NULL,
-  stack_name VARCHAR(255) NOT NULL,
-  stack_version VARCHAR(255) NOT NULL,
-  PRIMARY KEY (stack_id),
-  CONSTRAINT unq_stack UNIQUE(stack_name,stack_version)
-);
-
-GRANT ALL PRIVILEGES ON TABLE ambari.stack TO :username;
-
 ---------inserting some data-----------
 -- In order for the first ID to be 1, must initialize the ambari_sequences table with a sequence_value of 0.
 BEGIN;