You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by mr...@apache.org on 2017/07/07 16:50:32 UTC

ambari git commit: AMBARI-21231: Mpack to Stack Linkage and Parsing mpacks at bootstrap (mradhakrishnan)

Repository: ambari
Updated Branches:
  refs/heads/branch-feature-AMBARI-14714 d93015d6a -> 7849de66b


AMBARI-21231: Mpack to Stack Linkage and Parsing mpacks at bootstrap  (mradhakrishnan)


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/7849de66
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/7849de66
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/7849de66

Branch: refs/heads/branch-feature-AMBARI-14714
Commit: 7849de66b948ea672c4a9e88b9bdae92a3707c04
Parents: d93015d
Author: Madhuvanthi Radhakrishnan <mr...@hortonworks.com>
Authored: Fri Jul 7 09:49:10 2017 -0700
Committer: Madhuvanthi Radhakrishnan <mr...@hortonworks.com>
Committed: Fri Jul 7 09:49:10 2017 -0700

----------------------------------------------------------------------
 ambari-server/src/main/assemblies/server.xml    |   8 +
 .../api/resources/MpackResourceDefinition.java  |  52 +++
 .../StackVersionResourceDefinition.java         |   8 +-
 .../server/api/services/AmbariMetaInfo.java     |   4 +-
 .../AmbariManagementControllerImpl.java         |  35 +-
 .../ambari/server/controller/MpackResponse.java |  10 +
 .../internal/MpackResourceProvider.java         |  47 ++-
 .../ambari/server/mpack/MpackManager.java       | 179 +++++++--
 .../server/mpack/MpackManagerFactory.java       |   3 +-
 .../ambari/server/orm/entities/StackEntity.java |  15 +
 .../ambari/server/stack/StackManager.java       |   5 +-
 .../org/apache/ambari/server/state/Mpacks.java  | 382 ++++++++++---------
 .../org/apache/ambari/server/state/Packlet.java |  22 ++
 .../main/resources/Ambari-DDL-Derby-CREATE.sql  |  36 +-
 .../main/resources/Ambari-DDL-MySQL-CREATE.sql  |  35 +-
 .../main/resources/Ambari-DDL-Oracle-CREATE.sql |  36 +-
 .../resources/Ambari-DDL-Postgres-CREATE.sql    |  36 +-
 .../resources/Ambari-DDL-SQLAnywhere-CREATE.sql |  36 +-
 .../resources/Ambari-DDL-SQLServer-CREATE.sql   |  36 +-
 .../src/main/resources/mpacks-v2/README.txt     |   1 +
 20 files changed, 649 insertions(+), 337 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/7849de66/ambari-server/src/main/assemblies/server.xml
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/assemblies/server.xml b/ambari-server/src/main/assemblies/server.xml
index 1bda878..eac7885 100644
--- a/ambari-server/src/main/assemblies/server.xml
+++ b/ambari-server/src/main/assemblies/server.xml
@@ -191,6 +191,14 @@
 	  </includes>
     </fileSet>
     <fileSet>
+      <directoryMode>700</directoryMode>
+      <directory>src/main/resources/mpacks-v2</directory>
+      <outputDirectory>/var/lib/ambari-server/resources/mpacks-v2</outputDirectory>
+      <excludes>
+        <exclude>*/**</exclude>
+      </excludes>
+    </fileSet>
+    <fileSet>
       <fileMode>755</fileMode>
       <directory>src/main/python/ambari_server</directory>
       <outputDirectory>/usr/lib/python2.6/site-packages/ambari_server</outputDirectory>

http://git-wip-us.apache.org/repos/asf/ambari/blob/7849de66/ambari-server/src/main/java/org/apache/ambari/server/api/resources/MpackResourceDefinition.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/resources/MpackResourceDefinition.java b/ambari-server/src/main/java/org/apache/ambari/server/api/resources/MpackResourceDefinition.java
index e33cd31..26972d8 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/resources/MpackResourceDefinition.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/resources/MpackResourceDefinition.java
@@ -17,11 +17,18 @@
  */
 package org.apache.ambari.server.api.resources;
 
+import org.apache.ambari.server.api.services.Request;
+import org.apache.ambari.server.api.util.TreeNode;
+import org.apache.ambari.server.controller.internal.ResourceImpl;
 import org.apache.ambari.server.controller.spi.Resource;
 import org.apache.ambari.server.controller.spi.Resource.Type;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.util.Map;
+import java.util.List;
+import java.util.ArrayList;
+
 /**
  * Resource Definition for Mpack Resource types.
  */
@@ -47,4 +54,49 @@ public class MpackResourceDefinition extends BaseResourceDefinition {
   public String getSingularName() {
     return "mpack";
   }
+
+  @Override
+  public List<PostProcessor> getPostProcessors() {
+    List<PostProcessor> listProcessors = new ArrayList<>();
+    listProcessors.add(new MpackHrefProcessor());
+    listProcessors.add(new MpackPostProcessor());
+    return listProcessors;
+  }
+
+  /**
+   * Post Processing the mpack href when the call comes from stack endpoint to ensure that the
+   * href is a backreference to the mpacks end point
+   */
+  private class MpackHrefProcessor extends BaseHrefPostProcessor {
+    @Override
+    public void process(Request request, TreeNode<Resource> resultNode, String href) {
+      if (href.contains("/stacks/")) {
+        ResourceImpl mpack = (ResourceImpl) resultNode.getObject();
+        Map<String, Map<String, Object>> mapInfo = mpack.getPropertiesMap();
+        Map<String, Object> mpackInfo = mapInfo.get("MpackInfo");
+
+        int idx = href.indexOf("stacks/");
+        Long mpackId = (Long)mpackInfo.get("mpack_id");
+        href = href.substring(0, idx) + "mpacks/" + mpackId;
+        resultNode.setProperty("href", href);
+      } else {
+        super.process(request, resultNode, href);
+      }
+    }
+  }
+
+  /***
+   * Post processing to change the name of the result node to current_mpack
+   */
+  private class MpackPostProcessor implements PostProcessor {
+    @Override
+    public void process(Request request, TreeNode<Resource> resultNode, String href) {
+      if (href.contains("/stacks/")) {
+        resultNode.setName("current_mpack");
+
+      }
+    }
+  }
+
+
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/7849de66/ambari-server/src/main/java/org/apache/ambari/server/api/resources/StackVersionResourceDefinition.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/resources/StackVersionResourceDefinition.java b/ambari-server/src/main/java/org/apache/ambari/server/api/resources/StackVersionResourceDefinition.java
index ba102b5..5b32c06 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/resources/StackVersionResourceDefinition.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/resources/StackVersionResourceDefinition.java
@@ -7,7 +7,7 @@
  * "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
+ * 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,
@@ -20,7 +20,6 @@ package org.apache.ambari.server.api.resources;
 
 import java.util.HashSet;
 import java.util.Set;
-
 import org.apache.ambari.server.controller.spi.Resource;
 
 public class StackVersionResourceDefinition extends BaseResourceDefinition {
@@ -50,7 +49,8 @@ public class StackVersionResourceDefinition extends BaseResourceDefinition {
     children.add(new SubResourceDefinition(Resource.Type.RepositoryVersion));
     children.add(new SubResourceDefinition(Resource.Type.StackArtifact));
     children.add(new SubResourceDefinition(Resource.Type.CompatibleRepositoryVersion));
-
+    children.add(new SubResourceDefinition(Resource.Type.Mpack, null, false));
     return children;
   }
-}
+
+ }

http://git-wip-us.apache.org/repos/asf/ambari/blob/7849de66/ambari-server/src/main/java/org/apache/ambari/server/api/services/AmbariMetaInfo.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/AmbariMetaInfo.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/AmbariMetaInfo.java
index ee3b8e5..a68bf48 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/AmbariMetaInfo.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/AmbariMetaInfo.java
@@ -59,6 +59,7 @@ import org.apache.ambari.server.mpack.MpackManager;
 import org.apache.ambari.server.mpack.MpackManagerFactory;
 import org.apache.ambari.server.orm.dao.AlertDefinitionDAO;
 import org.apache.ambari.server.orm.dao.MetainfoDAO;
+import org.apache.ambari.server.orm.dao.StackDAO;
 import org.apache.ambari.server.orm.entities.AlertDefinitionEntity;
 import org.apache.ambari.server.orm.entities.MetainfoEntity;
 import org.apache.ambari.server.stack.StackDirectory;
@@ -297,7 +298,7 @@ public class AmbariMetaInfo {
     stackManager = stackManagerFactory.create(stackRoot, commonServicesRoot, extensionsRoot,
         osFamily, false);
 
-    mpackManager = mpackManagerFactory.create(mpacksV2Staging);
+    mpackManager = mpackManagerFactory.create(mpacksV2Staging, stackRoot);
 
     getCustomActionDefinitions(customActionRoot);
   }
@@ -1540,5 +1541,4 @@ public class AmbariMetaInfo {
     return versionDefinitions;
   }
 
-
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/7849de66/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java
index 7f173e9..8a564c9 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java
@@ -153,10 +153,40 @@ import org.apache.ambari.server.stack.ExtensionHelper;
 import org.apache.ambari.server.stack.RepoUtil;
 import org.apache.ambari.server.stageplanner.RoleGraph;
 import org.apache.ambari.server.stageplanner.RoleGraphFactory;
-import org.apache.ambari.server.state.*;
-import org.apache.ambari.server.state.PropertyInfo.PropertyType;
+import org.apache.ambari.server.state.Clusters;
+import org.apache.ambari.server.state.ServiceComponentFactory;
+import org.apache.ambari.server.state.ServiceComponentHostFactory;
+import org.apache.ambari.server.state.ConfigFactory;
+import org.apache.ambari.server.state.StackId;
+import org.apache.ambari.server.state.Cluster;
+import org.apache.ambari.server.state.ConfigHelper;
+import org.apache.ambari.server.state.StackInfo;
+import org.apache.ambari.server.state.State;
+import org.apache.ambari.server.state.Service;
+import org.apache.ambari.server.state.ServiceComponent;
+import org.apache.ambari.server.state.Host;
+import org.apache.ambari.server.state.ServiceComponentHost;
+import org.apache.ambari.server.state.CommandScriptDefinition;
 import org.apache.ambari.server.state.PropertyInfo.PropertyType;
 import org.apache.ambari.server.state.configgroup.ConfigGroupFactory;
+import org.apache.ambari.server.state.PropertyInfo;
+import org.apache.ambari.server.state.Config;
+import org.apache.ambari.server.state.DesiredConfig;
+import org.apache.ambari.server.state.MaintenanceState;
+import org.apache.ambari.server.state.SecurityType;
+import org.apache.ambari.server.state.HostState;
+import org.apache.ambari.server.state.ServiceComponentHostEvent;
+import org.apache.ambari.server.state.ComponentInfo;
+import org.apache.ambari.server.state.ServiceInfo;
+import org.apache.ambari.server.state.RepositoryVersionState;
+import org.apache.ambari.server.state.ServiceOsSpecific;
+import org.apache.ambari.server.state.UnlimitedKeyJCERequirement;
+import org.apache.ambari.server.state.ExtensionInfo;
+import org.apache.ambari.server.state.RepositoryInfo;
+import org.apache.ambari.server.state.OperatingSystemInfo;
+import org.apache.ambari.server.state.Packlet;
+import org.apache.ambari.server.state.HostComponentAdminState;
+import org.apache.ambari.server.state.PropertyDependencyInfo;
 import org.apache.ambari.server.state.quicklinksprofile.QuickLinkVisibilityController;
 import org.apache.ambari.server.state.quicklinksprofile.QuickLinkVisibilityControllerFactory;
 import org.apache.ambari.server.state.quicklinksprofile.QuickLinksProfile;
@@ -485,6 +515,7 @@ public class AmbariManagementControllerImpl implements AmbariManagementControlle
   @Override
   public MpackResponse registerMpack(MpackRequest request) throws IOException, AuthorizationException, ResourceAlreadyExistsException{
     MpackResponse mpackResponse = ambariMetaInfo.registerMpack(request);
+    updateStacks();
     return mpackResponse;
   }
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/7849de66/ambari-server/src/main/java/org/apache/ambari/server/controller/MpackResponse.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/MpackResponse.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/MpackResponse.java
index 05687c2..d111913 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/MpackResponse.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/MpackResponse.java
@@ -29,6 +29,7 @@ public class MpackResponse {
   private String mpackName;
   private String mpackUri;
   private Long registryId;
+  private String stackId;
 
   public MpackResponse(Mpacks mpacks) {
     this.mpackId = mpacks.getMpackId();
@@ -36,6 +37,7 @@ public class MpackResponse {
     this.mpackUri = mpacks.getMpacksUri();
     this.mpackName = mpacks.getName();
     this.registryId = mpacks.getRegistryId();
+    this.stackId = mpacks.getStackId();
   }
 
   public String getMpackVersion() {
@@ -50,6 +52,14 @@ public class MpackResponse {
     return mpackId;
   }
 
+  public String getStackId() {
+    return stackId;
+  }
+
+  public void setStackId(String stackId) {
+    this.stackId = stackId;
+  }
+
   public String getMpackName() {
     return mpackName;
   }

http://git-wip-us.apache.org/repos/asf/ambari/blob/7849de66/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/MpackResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/MpackResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/MpackResourceProvider.java
index 65eaeb6..6f90e04 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/MpackResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/MpackResourceProvider.java
@@ -43,12 +43,11 @@ import org.apache.ambari.server.controller.spi.Resource;
 import org.apache.ambari.server.controller.AmbariManagementController;
 import org.apache.ambari.server.controller.MpackResponse;
 import org.apache.ambari.server.controller.MpackRequest;
-
-
 import org.apache.ambari.server.controller.utilities.PredicateHelper;
 import org.apache.ambari.server.orm.dao.MpackDAO;
-
+import org.apache.ambari.server.orm.dao.StackDAO;
 import org.apache.ambari.server.orm.entities.MpackEntity;
+import org.apache.ambari.server.orm.entities.StackEntity;
 import org.apache.ambari.server.state.Packlet;
 
 /**
@@ -63,10 +62,11 @@ public class MpackResourceProvider extends AbstractControllerResourceProvider {
   public static final String MPACK_VERSION = "MpackInfo/mpack_version";
   public static final String MPACK_URI = "MpackInfo/mpack_uri";
   public static final String PACKLETS = "MpackInfo/packlets";
-
+  public static final String STACK_NAME_PROPERTY_ID = "MpackInfo/stack_name";
+  public static final String STACK_VERSION_PROPERTY_ID = "MpackInfo/stack_version";
 
   private static Set<String> pkPropertyIds = new HashSet<>(
-          Arrays.asList(MPACK_ID));
+          Arrays.asList(MPACK_ID, STACK_NAME_PROPERTY_ID, STACK_VERSION_PROPERTY_ID));
 
   /**
    * The property ids for an mpack resource.
@@ -81,6 +81,9 @@ public class MpackResourceProvider extends AbstractControllerResourceProvider {
   @Inject
   protected static MpackDAO mpackDAO;
 
+  @Inject
+  protected static StackDAO stackDAO;
+
   static {
     // properties
     PROPERTY_IDS.add(MPACK_ID);
@@ -89,9 +92,13 @@ public class MpackResourceProvider extends AbstractControllerResourceProvider {
     PROPERTY_IDS.add(MPACK_VERSION);
     PROPERTY_IDS.add(MPACK_URI);
     PROPERTY_IDS.add(PACKLETS);
+    PROPERTY_IDS.add(STACK_NAME_PROPERTY_ID);
+    PROPERTY_IDS.add(STACK_VERSION_PROPERTY_ID);
 
     // keys
     KEY_PROPERTY_IDS.put(Resource.Type.Mpack, MPACK_ID);
+    KEY_PROPERTY_IDS.put(Resource.Type.Stack, STACK_NAME_PROPERTY_ID);
+    KEY_PROPERTY_IDS.put(Resource.Type.StackVersion, STACK_VERSION_PROPERTY_ID);
 
   }
 
@@ -161,7 +168,7 @@ public class MpackResourceProvider extends AbstractControllerResourceProvider {
           NoSuchResourceException, NoSuchParentResourceException {
 
     Set<Resource> results = new LinkedHashSet<>();
-
+    Long mpackId = null;
     //Fetch all mpacks
     if (predicate == null) {
       List<MpackEntity> entities = mpackDAO.findAll();
@@ -180,9 +187,32 @@ public class MpackResourceProvider extends AbstractControllerResourceProvider {
     } //Fetch a particular mpack based on id
     else {
       Map<String, Object> propertyMap = new HashMap<>(PredicateHelper.getProperties(predicate));
+      if (propertyMap.containsKey(STACK_NAME_PROPERTY_ID) && propertyMap.containsKey(STACK_VERSION_PROPERTY_ID)) {
+        String stackName = (String) propertyMap.get(STACK_NAME_PROPERTY_ID);
+        String stackVersion = (String) propertyMap.get(STACK_VERSION_PROPERTY_ID);
+        StackEntity stackEntity = stackDAO.find(stackName, stackVersion);
+        mpackId = stackEntity.getCurrentMpackId();
+        if (mpackId != null) {
+          MpackEntity entity = mpackDAO.findById(mpackId);
+          Resource resource = new ResourceImpl(Resource.Type.Mpack);
+          if (null != entity) {
+            resource.setProperty(MPACK_ID, entity.getMpackId());
+            resource.setProperty(MPACK_NAME, entity.getMpackName());
+            resource.setProperty(MPACK_VERSION, entity.getMpackVersion());
+            resource.setProperty(STACK_NAME_PROPERTY_ID, stackName);
+            resource.setProperty(STACK_VERSION_PROPERTY_ID, stackVersion);
+            results.add(resource);
+          }
+        }
+        return results;
+      }
+
       if (propertyMap.containsKey(MPACK_ID)) {
-        String mpackId = (String) propertyMap.get(MPACK_ID);
-        MpackEntity entity = mpackDAO.findById(Long.parseLong((mpackId)));
+        Object objMpackId = propertyMap.get(MPACK_ID);
+        if(objMpackId != null)
+          mpackId = Long.valueOf((String) objMpackId);
+
+        MpackEntity entity = mpackDAO.findById(mpackId);
         Resource resource = new ResourceImpl(Resource.Type.Mpack);
         if (null != entity) {
           resource.setProperty(MPACK_ID, entity.getMpackId());
@@ -201,7 +231,6 @@ public class MpackResourceProvider extends AbstractControllerResourceProvider {
                 "The requested resource doesn't exist: " + predicate);
       }
     }
-
     return results;
   }
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/7849de66/ambari-server/src/main/java/org/apache/ambari/server/mpack/MpackManager.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/mpack/MpackManager.java b/ambari-server/src/main/java/org/apache/ambari/server/mpack/MpackManager.java
index a031af3..f19320e 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/mpack/MpackManager.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/mpack/MpackManager.java
@@ -24,7 +24,9 @@ import org.apache.ambari.server.controller.MpackRequest;
 import org.apache.ambari.server.controller.MpackResponse;
 import org.apache.ambari.server.controller.spi.ResourceAlreadyExistsException;
 import org.apache.ambari.server.orm.dao.MpackDAO;
+import org.apache.ambari.server.orm.dao.StackDAO;
 import org.apache.ambari.server.orm.entities.MpackEntity;
+import org.apache.ambari.server.orm.entities.StackEntity;
 import org.apache.ambari.server.state.Mpacks;
 import org.apache.ambari.server.state.Packlet;
 import org.apache.commons.compress.archivers.tar.TarArchiveInputStream;
@@ -59,17 +61,59 @@ public class MpackManager {
   protected Map<Long, Mpacks> mpackMap = new HashMap<>();
   private File mpackStaging;
   private MpackDAO mpackDAO;
+  private StackDAO stackDAO;
   private Mpacks mpack;
+  private File stackRoot;
+  private static final String MPACK_METADATA = "mpack.json";
+  private static final String MPACK_TAR_LOCATION = "staging";
 
   private final static Logger LOG = LoggerFactory.getLogger(MpackManager.class);
 
   @AssistedInject
-  public MpackManager(@Assisted("mpackv2Staging") File mpackStagingLoc, MpackDAO mpackDAOObj) {
-    mpackStaging = mpackStagingLoc;
+  public MpackManager(@Assisted("mpackv2Staging") File mpackStagingLocation, @Assisted("stackRoot") File stackRootDir, MpackDAO mpackDAOObj, StackDAO stackDAOObj) {
+    mpackStaging = mpackStagingLocation;
     mpackDAO = mpackDAOObj;
-    //Todo : Madhu Load all mpack.json into mpackMap during ambari-server startup
+    stackRoot = stackRootDir;
+    stackDAO = stackDAOObj;
+
+    parseMpackDirectories();
+
+  }
+
+  /**
+   * Parses mpackdirectories during boostrap/ambari-server restart
+   * Reads from /var/lib/ambari-server/mpacks-v2/
+   *
+   * @throws IOException
+   */
+  private void parseMpackDirectories() {
+    try {
+      for (final File dirEntry : mpackStaging.listFiles()) {
+        if (dirEntry.isDirectory()) {
+          String mpackName = dirEntry.getName();
+          if (!mpackName.equals(MPACK_TAR_LOCATION)) {
+            for (final File file : dirEntry.listFiles()) {
+              if (file.isDirectory()) {
+                String mpackVersion = file.getName();
+                List resultSet = mpackDAO.findByNameVersion(mpackName, mpackVersion);
+                MpackEntity mpackEntity = (MpackEntity) resultSet.get(0);
+
+                //Read the mpack.json file into Mpack Object for further use.
+                String mpackJsonContents = new String((Files.readAllBytes(Paths.get(file + "/" + MPACK_METADATA))), "UTF-8");
+                Gson gson = new Gson();
+                Mpacks existingMpack = gson.fromJson(mpackJsonContents, Mpacks.class);
+                mpackMap.put(mpackEntity.getMpackId(), existingMpack);
+              }
+            }
+          }
+        }
+      }
+    } catch (IOException e) {
+      e.printStackTrace();
+    }
   }
 
+
   /**
    * Parses mpack.json to fetch mpack and associated packlet information and
    * stores the mpack to the database and mpackMap
@@ -81,48 +125,53 @@ public class MpackManager {
    * @throws ResourceAlreadyExistsException
    */
   public MpackResponse registerMpack(MpackRequest mpackRequest) throws IOException, IllegalArgumentException, ResourceAlreadyExistsException {
-    //Todo : Madhu Update StacksAPI
 
     Long mpackId;
-    mpack = new Mpacks();
     String mpackName = "";
     String mpackVersion = "";
-    boolean isValidMetadata = true;
+    mpack = new Mpacks();
+    boolean isValidMetadata;
+    String mpackDirectory = "";
+    Path mpackTarPath;
 
     //Mpack registration using a software registry
     if (mpackRequest.getRegistryId() != null) {
       mpackName = mpackRequest.getMpackName();
       mpackVersion = mpackRequest.getMpackVersion();
       mpack.setRegistryId(mpackRequest.getRegistryId());
-      //Validate the Post request
-      isValidMetadata = validateMpackInfo(mpackName, mpackVersion, mpack.getName(), mpack.getVersion());
+
       //Todo : Madhu implement GET /registries/{registryId}/mpacks
-    } else {
-      //Mpack registration using direct download
-      mpack.setMpacksUri(mpackRequest.getMpackUri());
-    }
+      mpackTarPath = downloadMpack(mpackRequest.getMpackUri());
 
-    //Download the mpack and return the path.
-    Path mpackTarPath = downloadMpack(mpackRequest.getMpackUri(), mpackStaging + File.separator);
-    //create a directory as mpack-staging-path/mpack-name/mpack-version
-    if (createMpackDirectory(mpackTarPath)) {
-      //expand the mpack.tar.gz file inside the directory created above
-      String mpackDirectory = mpackStaging + File.separator + mpack.getName() + File.separator + mpack.getVersion();
-      extractMpackTar(mpackTarPath, mpackDirectory);
-    }
-    if (isValidMetadata) {
-      mpackId = populateDB(mpack);
-      if (mpackId != null) {
-        mpackMap.put(mpackId, mpack);
-        mpack.setMpackId(mpackId);
-        return new MpackResponse(mpack);
-      } else {
-        String message = "Mpack :" + mpackRequest.getMpackName() + " version: " + mpackRequest.getMpackVersion() + " already exists in server";
-        throw new ResourceAlreadyExistsException(message);
+      if (createMpackDirectory(mpackTarPath)) {
+        isValidMetadata = validateMpackInfo(mpackName, mpackVersion, mpack.getName(), mpack.getVersion());
+        if (isValidMetadata) {
+          mpackDirectory = mpackStaging + File.separator + mpack.getName() + File.separator + mpack.getVersion();
+        } else {
+          String message = "Incorrect information : Mismatch in - (" + mpackName + "," + mpack.getName() + ") or (" + mpackVersion + "," + mpack.getVersion() + ")";
+          throw new IllegalArgumentException(message); //Mismatch in information
+        }
+
+      }
+    } else {    //Mpack registration using direct download
+      mpackTarPath = downloadMpack(mpackRequest.getMpackUri());
+
+      if (createMpackDirectory(mpackTarPath)) {
+        mpackDirectory = mpackStaging + File.separator + mpack.getName() + File.separator + mpack.getVersion();
+        mpack.setMpacksUri(mpackRequest.getMpackUri());
       }
+    }
+    extractMpackTar(mpackTarPath, mpackDirectory);
+    mpackId = populateDB(mpack);
+
+    if (mpackId != null) {
+      mpackMap.put(mpackId, mpack);
+      mpack.setMpackId(mpackId);
+      populateStackDB(mpack);
+      return new MpackResponse(mpack);
     } else {
-      String message = "Incorrect information : Mismatch in - (" + mpackName + "," + mpack.getName() + ") or (" + mpackVersion + "," + mpack.getVersion() + ")";
-      throw new IllegalArgumentException(message); //Mismatch in information
+      String message = "Mpack :" + mpackRequest.getMpackName() + " version: " + mpackRequest.getMpackVersion() + " already exists in server";
+      throw new ResourceAlreadyExistsException(message);
     }
   }
 
@@ -161,6 +210,8 @@ public class MpackManager {
     Path extractedMpackDirectory = Files.move
             (Paths.get(mpackStaging + File.separator + mpackTarDirectory.substring(mpackTarDirectory.lastIndexOf('/') + 1, mpackTarDirectory.indexOf(".tar")) + File.separator),
                     Paths.get(mpackDirectory), StandardCopyOption.REPLACE_EXISTING);
+
+    createSymLinks();
   }
 
   /**
@@ -188,7 +239,6 @@ public class MpackManager {
         // Get Size of the file and create a byte array for the size
         byte[] content = new byte[(int) entry.getSize()];
         offset = 0;
-        LOG.info("File Name in TAR File is: " + fileName);
         LOG.debug("Size of the File is: " + entry.getSize());
         // Read file from the archive into byte array
         mpackTarFile.read(content, offset, content.length - offset);
@@ -196,29 +246,49 @@ public class MpackManager {
         //Read the mpack.json file into Mpack Object for further use.
         String mpackJsonContents = new String(content, "UTF-8");
         Gson gson = new Gson();
-        mpack = gson.fromJson(mpackJsonContents, Mpacks.class);
+        Mpacks tempMpack = gson.fromJson(mpackJsonContents, Mpacks.class);
+        mpack.copyFrom(tempMpack);
 
         mpackTarFile.close();
 
-        return new File(mpackStaging + File.separator + mpack.getName()).mkdir();
-
+        File mpackDirectory = new File(mpackStaging + File.separator + mpack.getName());
+        if (!mpackDirectory.exists())
+          return mpackDirectory.mkdir();
+        else
+          return true;
       }
     }
 
     return false;
   }
 
+  /***
+   * Create a linkage between the staging directory and the working directory i.e from mpacks-v2 to stackRoot.
+   * This will enable StackManager to parse the newly registered mpack as part of the stacks.
+   * @throws IOException
+   */
+  private void createSymLinks() throws IOException {
+    String stackId = mpack.getStackId();
+    String[] stackMetaData = stackId.split("-");
+    String stackName = stackMetaData[0];
+    String stackVersion = stackMetaData[1];
+    Path stackPath = Paths.get(stackRoot + "/" + stackName + "/" + stackVersion);
+    Path mpackPath = Paths.get(mpackStaging + "/" + mpack.getName() + "/" + mpack.getVersion());
+    if(Files.isSymbolicLink(stackPath))
+      Files.delete(stackPath);
+    Files.createSymbolicLink(stackPath, mpackPath);
+  }
+
 
   /***
    * Download the mpack from the given uri
-   * @param sourceURI
-   * @param targetDirectory
+   * @param mpackURI
    * @return
    */
-  public static Path downloadMpack(String sourceURI, String targetDirectory) throws IOException {
-    URL url = new URL(sourceURI);
-    String fileName = sourceURI.substring(sourceURI.lastIndexOf('/') + 1, sourceURI.length());
-    Path targetPath = new File(targetDirectory + File.separator + fileName).toPath();
+  public Path downloadMpack(String mpackURI) throws IOException {
+    URL url = new URL(mpackURI);
+    String fileName = mpackURI.substring(mpackURI.lastIndexOf('/') + 1, mpackURI.length());
+    Path targetPath = new File(mpackStaging.toString() + File.separator + MPACK_TAR_LOCATION + File.separator + fileName).toPath();
     Files.copy(url.openStream(), targetPath, StandardCopyOption.REPLACE_EXISTING);
 
     return targetPath;
@@ -267,8 +337,35 @@ public class MpackManager {
     return null;
   }
 
+  /***
+   * Makes an entry or updates the entry in the stack table to establish a link between the mpack and the associated stack
+   * @param mpacks
+   * @throws IOException
+   */
+  protected void populateStackDB(Mpacks mpacks) throws IOException {
+
+    String stackId = mpack.getStackId();
+    String[] stackMetaData = stackId.split("-");
+    String stackName = stackMetaData[0];
+    String stackVersion = stackMetaData[1];
+
+    StackEntity stackEntity = stackDAO.find(stackName, stackVersion);
+    if (stackEntity == null) {
+      LOG.info("Adding stack {}-{} to the database", stackName, stackVersion);
+      stackEntity = new StackEntity();
+      stackEntity.setStackName(stackName);
+      stackEntity.setStackVersion(stackVersion);
+      stackEntity.setCurrentMpackId(mpacks.getMpackId());
+      stackDAO.create(stackEntity);
+    } else {
+      LOG.info("Updating stack {}-{} to the database", stackName, stackVersion);
+      stackEntity.setCurrentMpackId(mpacks.getMpackId());
+      stackDAO.merge(stackEntity);
+    }
+  }
   /**
    * Fetches the packlet info stored in the memory for mpacks/{mpack_id} call.
+   *
    * @param mpackId
    * @return ArrayList
    */

http://git-wip-us.apache.org/repos/asf/ambari/blob/7849de66/ambari-server/src/main/java/org/apache/ambari/server/mpack/MpackManagerFactory.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/mpack/MpackManagerFactory.java b/ambari-server/src/main/java/org/apache/ambari/server/mpack/MpackManagerFactory.java
index 67820c8..2336b1a 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/mpack/MpackManagerFactory.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/mpack/MpackManagerFactory.java
@@ -31,7 +31,8 @@ public interface MpackManagerFactory {
   /**
    * @param mpackStaging
    *        the folder location where mpack is downloaded. (not {@code null}).
+   * @param stackRoot
    * @return a mpack manager instance.
    */
-  MpackManager create(@Assisted("mpackv2Staging") File mpackStaging);
+  MpackManager create(@Assisted("mpackv2Staging") File mpackStaging, @Assisted("stackRoot") File stackRoot);
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/7849de66/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/StackEntity.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/StackEntity.java b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/StackEntity.java
index 2cfe07c..0cb8628 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/StackEntity.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/StackEntity.java
@@ -59,6 +59,20 @@ public class StackEntity {
   @Column(name = "stack_version", length = 255, nullable = false)
   private String stackVersion;
 
+
+  @Column(name = "current_mpack_id")
+  private Long currentMpackId;
+
+
+  public Long getCurrentMpackId() {
+    return currentMpackId;
+  }
+
+  public void setCurrentMpackId(Long currentMpackId) {
+    this.currentMpackId = currentMpackId;
+  }
+
+
   /**
    * Constructor.
    */
@@ -154,6 +168,7 @@ public class StackEntity {
     buffer.append("id=").append(stackId);
     buffer.append(", name=").append(stackName);
     buffer.append(", version=").append(stackVersion);
+    buffer.append(", current_mpack_id=").append(currentMpackId);
     buffer.append("}");
     return buffer.toString();
   }

http://git-wip-us.apache.org/repos/asf/ambari/blob/7849de66/ambari-server/src/main/java/org/apache/ambari/server/stack/StackManager.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/stack/StackManager.java b/ambari-server/src/main/java/org/apache/ambari/server/stack/StackManager.java
index d19aeba..9ac9107 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/stack/StackManager.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/stack/StackManager.java
@@ -116,7 +116,7 @@ public class StackManager {
   /**
    * Constructor. Initialize stack manager.
    *
-   * @param stackRoot
+   * @param stackRootDir
    *          stack root directory
    * @param commonServicesRoot
    *          common services root directory
@@ -141,7 +141,7 @@ public class StackManager {
    *           if an exception occurs while processing the stacks
    */
   @AssistedInject
-  public StackManager(@Assisted("stackRoot") File stackRoot,
+  public StackManager(@Assisted("stackRoot") File stackRootDir,
       @Assisted("commonServicesRoot") @Nullable File commonServicesRoot,
       @Assisted("extensionRoot") @Nullable File extensionRoot,
       @Assisted OsFamily osFamily, @Assisted boolean validate,
@@ -151,6 +151,7 @@ public class StackManager {
 
     LOG.info("Initializing the stack manager...");
 
+    stackRoot = stackRootDir;
     if (validate) {
       validateStackDirectory(stackRoot);
       validateCommonServicesDirectory(commonServicesRoot);

http://git-wip-us.apache.org/repos/asf/ambari/blob/7849de66/ambari-server/src/main/java/org/apache/ambari/server/state/Mpacks.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/Mpacks.java b/ambari-server/src/main/java/org/apache/ambari/server/state/Mpacks.java
index 9a457b0..8b7d055 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/state/Mpacks.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/Mpacks.java
@@ -27,211 +27,245 @@ import java.util.HashMap;
  */
 public class Mpacks {
 
-    private Long mpackId;
+  private Long mpackId;
 
-    private Long registryId;
+  private Long registryId;
 
-    @SerializedName("name")
-    private String name;
+  @SerializedName("name")
+  private String name;
 
-    @SerializedName("version")
-    private String version;
+  @SerializedName("version")
+  private String version;
 
-    @SerializedName("description")
-    private String description;
+  @SerializedName("description")
+  private String description;
 
-    @SerializedName("prerequisites")
-    private HashMap<String,String> prerequisites;
+  @SerializedName("prerequisites")
+  private HashMap<String, String> prerequisites;
 
-    @SerializedName("packlets")
-    private ArrayList<Packlet> packlets;
+  @SerializedName("packlets")
+  private ArrayList<Packlet> packlets;
 
-    private String mpacksUri;
-
-    public Long getMpackId() {
-        return mpackId;
-    }
-
-    public void setMpackId(Long mpackId) {
-        this.mpackId = mpackId;
+  @SerializedName("stack-id")
+  private String stackId;
+
+  private String mpacksUri;
+
+  public Long getMpackId() {
+    return mpackId;
+  }
+
+  public void setMpackId(Long mpackId) {
+    this.mpackId = mpackId;
+  }
+
+  public Long getRegistryId() {
+    return registryId;
+  }
+
+  public void setRegistryId(Long registryId) {
+    this.registryId = registryId;
+  }
+
+  public String getMpacksUri() {
+    return mpacksUri;
+  }
+
+  public void setMpacksUri(String mpacksUri) {
+    this.mpacksUri = mpacksUri;
+  }
+
+  public String getName() {
+    return name;
+  }
+
+  public void setName(String name) {
+    this.name = name;
+  }
+
+  public String getVersion() {
+    return version;
+  }
+
+  public void setVersion(String version) {
+    this.version = version;
+  }
+
+  public String getDescription() {
+    return description;
+  }
+
+  public void setDescription(String description) {
+    this.description = description;
+  }
+
+  public HashMap<String, String> getPrerequisites() {
+    return prerequisites;
+  }
+
+  public void setPrerequisites(HashMap<String, String> prerequisites) {
+    this.prerequisites = prerequisites;
+  }
+
+  public ArrayList<Packlet> getPacklets() {
+    return packlets;
+  }
+
+  public void setPacklets(ArrayList<Packlet> packlets) {
+    this.packlets = packlets;
+  }
+
+
+  public String getStackId() {
+    return stackId;
+  }
+
+  public void setStackId(String stackId) {
+    this.stackId = stackId;
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  @Override
+  public int hashCode() {
+    final int prime = 31;
+    int result = 1;
+    result = prime * result + ((mpackId == null) ? 0 : mpackId.hashCode());
+    result = prime * result + ((name == null) ? 0 : name.hashCode());
+    result = prime * result + ((version == null) ? 0 : version.hashCode());
+    result = prime * result + ((registryId == null) ? 0 : registryId.hashCode());
+    result = prime * result + ((description == null) ? 0 : description.hashCode());
+    result = prime * result + ((prerequisites == null) ? 0 : prerequisites.hashCode());
+    result = prime * result + ((packlets == null) ? 0 : packlets.hashCode());
+    result = prime * result + ((stackId == null) ? 0 : stackId.hashCode());
+    result = prime * result + ((mpacksUri == null) ? 0 : mpacksUri.hashCode());
+    return result;
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  @Override
+  public boolean equals(Object obj) {
+    if (this == obj) {
+      return true;
     }
 
-    public Long getRegistryId() {
-        return registryId;
+    if (obj == null) {
+      return false;
     }
 
-    public void setRegistryId(Long registryId) {
-        this.registryId = registryId;
+    if (getClass() != obj.getClass()) {
+      return false;
     }
 
-    public String getMpacksUri() {
-        return mpacksUri;
-    }
+    Mpacks other = (Mpacks) obj;
 
-    public void setMpacksUri(String mpacksUri) {
-        this.mpacksUri = mpacksUri;
+    if (name != other.name) {
+      return false;
     }
 
-    public String getName() {
-        return name;
+    if (version == null) {
+      if (other.version != null) {
+        return false;
+      }
+    } else if (!version.equals(other.version)) {
+      return false;
     }
 
-    public void setName(String name) {
-        this.name = name;
+    if (description == null) {
+      if (other.description != null) {
+        return false;
+      }
+    } else if (!description.equals(other.description)) {
+      return false;
     }
 
-    public String getVersion() {
-        return version;
+    if (mpackId == null) {
+      if (other.mpackId != null) {
+        return false;
+      }
+    } else if (!mpackId.equals(other.mpackId)) {
+      return false;
     }
 
-    public void setVersion(String version) {
-        this.version = version;
+    if (registryId == null) {
+      if (other.registryId != null) {
+        return false;
+      }
+    } else if (!registryId.equals(other.registryId)) {
+      return false;
     }
 
-    public String getDescription() {
-        return description;
+    if (prerequisites == null) {
+      if (other.prerequisites != null) {
+        return false;
+      }
+    } else if (!prerequisites.equals(other.prerequisites)) {
+      return false;
     }
 
-    public void setDescription(String description) {
-        this.description = description;
+    if (packlets == null) {
+      if (other.packlets != null) {
+        return false;
+      }
+    } else if (!packlets.equals(other.packlets)) {
+      return false;
     }
 
-    public HashMap<String, String> getPrerequisites() {
-        return prerequisites;
+    if (mpacksUri == null) {
+      if (other.mpacksUri != null) {
+        return false;
+      }
+    } else if (!mpacksUri.equals(other.mpacksUri)) {
+      return false;
     }
 
-    public void setPrerequisites(HashMap<String, String> prerequisites) {
-        this.prerequisites = prerequisites;
+    if (stackId == null) {
+      if (other.stackId != null) {
+        return false;
+      }
+    } else if (!stackId.equals(other.stackId)) {
+      return false;
     }
 
-    public ArrayList<Packlet> getPacklets() {
-        return packlets;
-    }
-
-    public void setPacklets(ArrayList<Packlet> packlets) {
-        this.packlets = packlets;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public int hashCode() {
-        final int prime = 31;
-        int result = 1;
-        result = prime * result + ((mpackId == null) ? 0 : mpackId.hashCode());
-        result = prime * result + ((name == null) ? 0 : name.hashCode());
-        result = prime * result + ((version == null) ? 0 : version.hashCode());
-        result = prime * result + ((registryId == null) ? 0 : registryId.hashCode());
-        result = prime * result + ((description == null) ? 0 : description.hashCode());
-        result = prime * result + ((prerequisites == null) ? 0 : prerequisites.hashCode());
-        result = prime * result + ((packlets == null) ? 0 : packlets.hashCode());
-        result = prime * result + ((mpacksUri == null) ? 0 : mpacksUri.hashCode());
-        return result;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj) {
-            return true;
-        }
-
-        if (obj == null) {
-            return false;
-        }
-
-        if (getClass() != obj.getClass()) {
-            return false;
-        }
-
-        Mpacks other = (Mpacks) obj;
-
-        if (name != other.name) {
-            return false;
-        }
-
-        if (version == null) {
-            if (other.version != null) {
-                return false;
-            }
-        } else if (!version.equals(other.version)) {
-            return false;
-        }
-
-        if (description == null) {
-            if (other.description != null) {
-                return false;
-            }
-        } else if (!description.equals(other.description)) {
-            return false;
-        }
-
-        if (mpackId == null) {
-            if (other.mpackId != null) {
-                return false;
-            }
-        } else if (!mpackId.equals(other.mpackId)) {
-            return false;
-        }
-
-        if (registryId == null) {
-            if (other.registryId != null) {
-                return false;
-            }
-        } else if (!registryId.equals(other.registryId)) {
-            return false;
-        }
-
-        if (registryId == null) {
-            if (other.registryId != null) {
-                return false;
-            }
-        } else if (!registryId.equals(other.registryId)) {
-            return false;
-        }
-
-        if (registryId == null) {
-            if (other.registryId != null) {
-                return false;
-            }
-        } else if (!registryId.equals(other.registryId)) {
-            return false;
-        }
-
-        if (prerequisites == null) {
-            if (other.prerequisites != null) {
-                return false;
-            }
-        } else if (!prerequisites.equals(other.prerequisites)) {
-            return false;
-        }
-
-        if (packlets == null) {
-            if (other.packlets != null) {
-                return false;
-            }
-        } else if (!packlets.equals(other.packlets)) {
-            return false;
-        }
-
-        return true;
-    }
-
-    @Override
-    public String toString() {
-        StringBuilder sb = new StringBuilder();
-        sb.append('{');
-        sb.append("name=").append(name).append(", ");
-        sb.append("mpackId=").append(mpackId).append(", ");
-        sb.append("version=").append(version).append(", ");
-        sb.append("registryId=").append(registryId).append(", ");
-        sb.append("description=").append(description).append(", ");
-        sb.append("prereq=").append(prerequisites.toString()).append(", ");
-        sb.append("packlets=").append(packlets.toString()).append(", ");
+    return true;
+  }
+
+  @Override
+  public String toString() {
+    StringBuilder sb = new StringBuilder();
+    sb.append('{');
+    sb.append("name=").append(name).append(", ");
+    sb.append("mpackId=").append(mpackId).append(", ");
+    sb.append("version=").append(version).append(", ");
+    sb.append("stackid=").append(stackId).append(", ");
+    sb.append("registryId=").append(registryId).append(", ");
+    sb.append("description=").append(description).append(", ");
+    sb.append("prereq=").append(prerequisites.toString()).append(", ");
+    sb.append("packlets=").append(packlets.toString()).append(", ");
         sb.append('}');
-        return sb.toString();
-    }
+    return sb.toString();
+  }
+
+  public void copyFrom(Mpacks mpack) {
+    if (this.name == null)
+      this.name = mpack.getName();
+    if (this.mpackId == null)
+      this.mpackId = mpack.getMpackId();
+    if (this.version == null)
+      this.version = mpack.getVersion();
+    if (this.stackId == null)
+      this.stackId = mpack.getStackId();
+    if (this.registryId == null)
+      this.registryId = mpack.getRegistryId();
+    if (this.description == null)
+      this.description = mpack.getDescription();
+    if (this.prerequisites == null)
+      this.prerequisites = mpack.getPrerequisites();
+    if (this.packlets == null)
+      this.packlets = mpack.getPacklets();
+
+  }
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/7849de66/ambari-server/src/main/java/org/apache/ambari/server/state/Packlet.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/Packlet.java b/ambari-server/src/main/java/org/apache/ambari/server/state/Packlet.java
index 0bd2479..1fa8dee 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/state/Packlet.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/Packlet.java
@@ -27,6 +27,8 @@ public class Packlet {
   private String name;
   @SerializedName("version")
   private String version;
+  @SerializedName("service-id")
+  private String serviceId;
   @SerializedName("source_dir")
   private String sourceDir;
 
@@ -62,6 +64,16 @@ public class Packlet {
     this.sourceDir = sourceDir;
   }
 
+
+  public String getServiceId() {
+    return serviceId;
+  }
+
+  public void setServiceId(String serviceId) {
+    this.serviceId = serviceId;
+  }
+
+
   /**
    * {@inheritDoc}
    */
@@ -72,6 +84,7 @@ public class Packlet {
     result = prime * result + ((type == null) ? 0 : type.hashCode());
     result = prime * result + ((name == null) ? 0 : name.hashCode());
     result = prime * result + ((version == null) ? 0 : version.hashCode());
+    result = prime * result + ((serviceId == null) ? 0 : serviceId.hashCode());
     result = prime * result + ((sourceDir == null) ? 0 : sourceDir.hashCode());
     return result;
   }
@@ -115,6 +128,14 @@ public class Packlet {
       return false;
     }
 
+    if (serviceId == null) {
+      if (other.serviceId != null) {
+        return false;
+      }
+    } else if (!serviceId.equals(other.serviceId)) {
+      return false;
+    }
+
     if (sourceDir == null) {
       if (other.sourceDir != null) {
         return false;
@@ -132,6 +153,7 @@ public class Packlet {
     sb.append("type=").append(type).append(", ");
     sb.append("name=").append(name).append(", ");
     sb.append("version=").append(version).append(", ");
+    sb.append("service id=").append(serviceId).append(", ");
     sb.append("source directory=").append(sourceDir).append(", ");
     sb.append('}');
     return sb.toString();

http://git-wip-us.apache.org/repos/asf/ambari/blob/7849de66/ambari-server/src/main/resources/Ambari-DDL-Derby-CREATE.sql
----------------------------------------------------------------------
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 d01a670..43057fb 100644
--- a/ambari-server/src/main/resources/Ambari-DDL-Derby-CREATE.sql
+++ b/ambari-server/src/main/resources/Ambari-DDL-Derby-CREATE.sql
@@ -17,11 +17,30 @@
 --
 
 ------create tables and grant privileges to db user---------
+CREATE TABLE registries(
+ id BIGINT NOT NULL,
+ registy_name VARCHAR(255) NOT NULL,
+ registry_type VARCHAR(255) NOT NULL,
+ registry_uri VARCHAR(255) NOT NULL,
+ CONSTRAINT PK_registries PRIMARY KEY (id));
+
+CREATE TABLE mpacks(
+ id BIGINT NOT NULL,
+ mpack_name VARCHAR(255) NOT NULL,
+ mpack_version VARCHAR(255) NOT NULL,
+ mpack_uri VARCHAR(255),
+ registry_id BIGINT,
+ CONSTRAINT PK_mpacks PRIMARY KEY (id),
+ CONSTRAINT FK_registries FOREIGN KEY (registry_id) REFERENCES registries(id),
+ CONSTRAINT uni_mpack_name_version UNIQUE(mpack_name, mpack_version));
+
 CREATE TABLE stack(
   stack_id BIGINT NOT NULL,
   stack_name VARCHAR(255) NOT NULL,
   stack_version VARCHAR(255) NOT NULL,
+  current_mpack_id BIGINT,
   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));
 
 CREATE TABLE extension(
@@ -898,23 +917,6 @@ CREATE TABLE ambari_operation_history(
   CONSTRAINT PK_ambari_operation_history PRIMARY KEY (id)
 );
 
-CREATE TABLE registries(
- id BIGINT NOT NULL,
- registy_name VARCHAR(255) NOT NULL,
- registry_type VARCHAR(255) NOT NULL,
- registry_uri VARCHAR(255) NOT NULL,
- CONSTRAINT PK_registries PRIMARY KEY (id));
-
-CREATE TABLE mpacks(
- id BIGINT NOT NULL,
- mpack_name VARCHAR(255) NOT NULL,
- mpack_version VARCHAR(255) NOT NULL,
- mpack_uri VARCHAR(255),
- registry_id BIGINT,
- CONSTRAINT PK_mpacks PRIMARY KEY (id),
- CONSTRAINT FK_registries FOREIGN KEY (registry_id) REFERENCES registries(id),
- CONSTRAINT uni_mpack_name_version UNIQUE(mpack_name, mpack_version));
-
 -- tasks indices --
 CREATE INDEX idx_stage_request_id ON stage (request_id);
 CREATE INDEX idx_hrc_request_id ON host_role_command (request_id);

http://git-wip-us.apache.org/repos/asf/ambari/blob/7849de66/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 415350a..f20882b 100644
--- a/ambari-server/src/main/resources/Ambari-DDL-MySQL-CREATE.sql
+++ b/ambari-server/src/main/resources/Ambari-DDL-MySQL-CREATE.sql
@@ -36,12 +36,30 @@ prepare statement from @engine_stmt;
 execute statement;
 DEALLOCATE PREPARE statement;
 
+CREATE TABLE registries(
+ id BIGINT NOT NULL,
+ registy_name VARCHAR(255) NOT NULL,
+ registry_type VARCHAR(255) NOT NULL,
+ registry_uri VARCHAR(255) NOT NULL,
+ CONSTRAINT PK_registries PRIMARY KEY (id));
+
+CREATE TABLE mpacks(
+ id BIGINT NOT NULL,
+ mpack_name VARCHAR(255) NOT NULL,
+ mpack_version VARCHAR(255) NOT NULL,
+ mpack_uri VARCHAR(255),
+ registry_id BIGINT,
+ CONSTRAINT PK_mpacks PRIMARY KEY (id),
+ CONSTRAINT uni_mpack_name_version UNIQUE(mpack_name, mpack_version),
+ CONSTRAINT FK_registries FOREIGN KEY (registry_id) REFERENCES registries(id));
 
 CREATE TABLE stack(
   stack_id BIGINT NOT NULL,
   stack_name VARCHAR(100) NOT NULL,
   stack_version VARCHAR(100) NOT NULL,
+  current_mpack_id BIGINT,
   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));
 
 CREATE TABLE extension(
@@ -1062,23 +1080,6 @@ CREATE TABLE alert_notice (
   FOREIGN KEY (history_id) REFERENCES alert_history(alert_id)
 );
 
-CREATE TABLE registries(
- id BIGINT NOT NULL,
- registy_name VARCHAR(255) NOT NULL,
- registry_type VARCHAR(255) NOT NULL,
- registry_uri VARCHAR(255) NOT NULL,
- CONSTRAINT PK_registries PRIMARY KEY (id));
-
-CREATE TABLE mpacks(
- id BIGINT NOT NULL,
- mpack_name VARCHAR(255) NOT NULL,
- mpack_version VARCHAR(255) NOT NULL,
- mpack_uri VARCHAR(255),
- registry_id BIGINT,
- CONSTRAINT PK_mpacks PRIMARY KEY (id),
- CONSTRAINT uni_mpack_name_version UNIQUE(mpack_name, mpack_version),
- CONSTRAINT FK_registries FOREIGN KEY (registry_id) REFERENCES registries(id));
-
 CREATE INDEX idx_alert_history_def_id on alert_history(alert_definition_id);
 CREATE INDEX idx_alert_history_service on alert_history(service_name);
 CREATE INDEX idx_alert_history_host on alert_history(host_name);

http://git-wip-us.apache.org/repos/asf/ambari/blob/7849de66/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 bb2a559..05779b0 100644
--- a/ambari-server/src/main/resources/Ambari-DDL-Oracle-CREATE.sql
+++ b/ambari-server/src/main/resources/Ambari-DDL-Oracle-CREATE.sql
@@ -17,11 +17,30 @@
 --
 
 ------create tables---------
+CREATE TABLE registries(
+ id BIGINT NOT NULL,
+ registy_name VARCHAR(255) NOT NULL,
+ registry_type VARCHAR(255) NOT NULL,
+ registry_uri VARCHAR(255) NOT NULL,
+ CONSTRAINT PK_registries PRIMARY KEY (id));
+
+CREATE TABLE mpacks(
+ id BIGINT NOT NULL,
+ mpack_name VARCHAR(255) NOT NULL,
+ mpack_version VARCHAR(255) NOT NULL,
+ mpack_uri VARCHAR(255),
+ registry_id BIGINT,
+ CONSTRAINT PK_mpacks PRIMARY KEY (id),
+ CONSTRAINT uni_mpack_name_version UNIQUE(mpack_name, mpack_version),
+ CONSTRAINT FK_registries FOREIGN KEY (registry_id) REFERENCES registries(id));
+
 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,
   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));
 
 CREATE TABLE extension(
@@ -1041,23 +1060,6 @@ CREATE TABLE alert_notice (
   FOREIGN KEY (history_id) REFERENCES alert_history(alert_id)
 );
 
-CREATE TABLE registries(
- id BIGINT NOT NULL,
- registy_name VARCHAR(255) NOT NULL,
- registry_type VARCHAR(255) NOT NULL,
- registry_uri VARCHAR(255) NOT NULL,
- CONSTRAINT PK_registries PRIMARY KEY (id));
-
-CREATE TABLE mpacks(
- id BIGINT NOT NULL,
- mpack_name VARCHAR(255) NOT NULL,
- mpack_version VARCHAR(255) NOT NULL,
- mpack_uri VARCHAR(255),
- registry_id BIGINT,
- CONSTRAINT PK_mpacks PRIMARY KEY (id),
- CONSTRAINT uni_mpack_name_version UNIQUE(mpack_name, mpack_version),
- CONSTRAINT FK_registries FOREIGN KEY (registry_id) REFERENCES registries(id));
-
 CREATE INDEX idx_alert_history_def_id on alert_history(alert_definition_id);
 CREATE INDEX idx_alert_history_service on alert_history(service_name);
 CREATE INDEX idx_alert_history_host on alert_history(host_name);

http://git-wip-us.apache.org/repos/asf/ambari/blob/7849de66/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 de9eb68..afb676d 100644
--- a/ambari-server/src/main/resources/Ambari-DDL-Postgres-CREATE.sql
+++ b/ambari-server/src/main/resources/Ambari-DDL-Postgres-CREATE.sql
@@ -17,11 +17,30 @@
 --
 
 ------create tables and grant privileges to db user---------
+CREATE TABLE registries(
+ id BIGINT NOT NULL,
+ registy_name VARCHAR(255) NOT NULL,
+ registry_type VARCHAR(255) NOT NULL,
+ registry_uri VARCHAR(255) NOT NULL,
+ CONSTRAINT PK_registries PRIMARY KEY (id));
+
+CREATE TABLE mpacks(
+ id BIGINT NOT NULL,
+ mpack_name VARCHAR(255) NOT NULL,
+ mpack_version VARCHAR(255) NOT NULL,
+ mpack_uri VARCHAR(255),
+ registry_id BIGINT,
+ CONSTRAINT PK_mpacks PRIMARY KEY (id),
+ CONSTRAINT FK_registries FOREIGN KEY (registry_id) REFERENCES registries(id),
+ CONSTRAINT uni_mpack_name_version UNIQUE(mpack_name, mpack_version));
+
 CREATE TABLE stack(
   stack_id BIGINT NOT NULL,
   stack_name VARCHAR(255) NOT NULL,
   stack_version VARCHAR(255) NOT NULL,
+  current_mpack_id BIGINT,
   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));
 
 CREATE TABLE extension(
@@ -1557,23 +1576,6 @@ CREATE TABLE qrtz_locks
   PRIMARY KEY (SCHED_NAME,LOCK_NAME)
 );
 
-CREATE TABLE registries(
- id BIGINT NOT NULL,
- registy_name VARCHAR(255) NOT NULL,
- registry_type VARCHAR(255) NOT NULL,
- registry_uri VARCHAR(255) NOT NULL,
- CONSTRAINT PK_registries PRIMARY KEY (id));
-
-CREATE TABLE mpacks(
- id BIGINT NOT NULL,
- mpack_name VARCHAR(255) NOT NULL,
- mpack_version VARCHAR(255) NOT NULL,
- mpack_uri VARCHAR(255),
- registry_id BIGINT,
- CONSTRAINT PK_mpacks PRIMARY KEY (id),
- CONSTRAINT FK_registries FOREIGN KEY (registry_id) REFERENCES registries(id)
- CONSTRAINT uni_mpack_name_version UNIQUE(mpack_name, mpack_version));
-
 create index idx_qrtz_j_req_recovery on qrtz_job_details(SCHED_NAME,REQUESTS_RECOVERY);
 create index idx_qrtz_j_grp on qrtz_job_details(SCHED_NAME,JOB_GROUP);
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/7849de66/ambari-server/src/main/resources/Ambari-DDL-SQLAnywhere-CREATE.sql
----------------------------------------------------------------------
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 fb9b878..8df88f1 100644
--- a/ambari-server/src/main/resources/Ambari-DDL-SQLAnywhere-CREATE.sql
+++ b/ambari-server/src/main/resources/Ambari-DDL-SQLAnywhere-CREATE.sql
@@ -16,11 +16,30 @@
 -- limitations under the License.
 --
 
+CREATE TABLE registries(
+ id BIGINT NOT NULL,
+ registy_name VARCHAR(255) NOT NULL,
+ registry_type VARCHAR(255) NOT NULL,
+ registry_uri VARCHAR(255) NOT NULL,
+ CONSTRAINT PK_registries PRIMARY KEY (id));
+
+CREATE TABLE mpacks(
+ id BIGINT NOT NULL,
+ mpack_name VARCHAR(255) NOT NULL,
+ mpack_version VARCHAR(255) NOT NULL,
+ mpack_uri VARCHAR(255),
+ registry_id BIGINT,
+ CONSTRAINT PK_mpacks PRIMARY KEY (id),
+ CONSTRAINT uni_mpack_name_version UNIQUE(mpack_name, mpack_version),
+ CONSTRAINT FK_registries FOREIGN KEY (registry_id) REFERENCES registries(id));
+
 CREATE TABLE stack(
   stack_id NUMERIC(19) NOT NULL,
   stack_name VARCHAR(255) NOT NULL,
   stack_version VARCHAR(255) NOT NULL,
+  current_mpack_id BIGINT,
   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));
 
 CREATE TABLE extension(
@@ -1041,23 +1060,6 @@ CREATE TABLE alert_notice (
   FOREIGN KEY (history_id) REFERENCES alert_history(alert_id)
 );
 
-CREATE TABLE registries(
- id BIGINT NOT NULL,
- registy_name VARCHAR(255) NOT NULL,
- registry_type VARCHAR(255) NOT NULL,
- registry_uri VARCHAR(255) NOT NULL,
- CONSTRAINT PK_registries PRIMARY KEY (id));
-
-CREATE TABLE mpacks(
- id BIGINT NOT NULL,
- mpack_name VARCHAR(255) NOT NULL,
- mpack_version VARCHAR(255) NOT NULL,
- mpack_uri VARCHAR(255),
- registry_id BIGINT,
- CONSTRAINT PK_mpacks PRIMARY KEY (id),
- CONSTRAINT uni_mpack_name_version UNIQUE(mpack_name, mpack_version),
- CONSTRAINT FK_registries FOREIGN KEY (registry_id) REFERENCES registries(id));
-
 CREATE INDEX idx_alert_history_def_id on alert_history(alert_definition_id);
 CREATE INDEX idx_alert_history_service on alert_history(service_name);
 CREATE INDEX idx_alert_history_host on alert_history(host_name);

http://git-wip-us.apache.org/repos/asf/ambari/blob/7849de66/ambari-server/src/main/resources/Ambari-DDL-SQLServer-CREATE.sql
----------------------------------------------------------------------
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 c42892f..b9a18f3 100644
--- a/ambari-server/src/main/resources/Ambari-DDL-SQLServer-CREATE.sql
+++ b/ambari-server/src/main/resources/Ambari-DDL-SQLServer-CREATE.sql
@@ -29,11 +29,30 @@ sqlcmd -S localhost\SQLEXPRESS -i C:\app\ambari-server-1.3.0-SNAPSHOT\resources\
 ------create the database------
 
 ------create tables and grant privileges to db user---------
+CREATE TABLE registries(
+ id BIGINT NOT NULL,
+ registy_name VARCHAR(255) NOT NULL,
+ registry_type VARCHAR(255) NOT NULL,
+ registry_uri VARCHAR(255) NOT NULL,
+ CONSTRAINT PK_registries PRIMARY KEY (id));
+
+CREATE TABLE mpacks(
+ id BIGINT NOT NULL,
+ mpack_name VARCHAR(255) NOT NULL,
+ mpack_version VARCHAR(255) NOT NULL,
+ mpack_uri VARCHAR(255),
+ registry_id BIGINT,
+ CONSTRAINT PK_mpacks PRIMARY KEY (id),
+ CONSTRAINT uni_mpack_name_version UNIQUE(mpack_name, mpack_version),
+ CONSTRAINT FK_registries FOREIGN KEY (registry_id) REFERENCES registries(id));
+
 CREATE TABLE stack(
   stack_id BIGINT NOT NULL,
   stack_name VARCHAR(255) NOT NULL,
   stack_version VARCHAR(255) NOT NULL,
+  current_mpack_id BIGINT,
   CONSTRAINT PK_stack PRIMARY KEY CLUSTERED (stack_id),
+  CONSTRAINT FK_mpacks FOREIGN KEY (current_mpack_id) REFERENCES mpacks(id),
   CONSTRAINT UQ_stack UNIQUE (stack_name, stack_version));
 
 CREATE TABLE extension(
@@ -1065,23 +1084,6 @@ CREATE TABLE alert_notice (
   FOREIGN KEY (history_id) REFERENCES alert_history(alert_id)
 );
 
-CREATE TABLE registries(
- id BIGINT NOT NULL,
- registy_name VARCHAR(255) NOT NULL,
- registry_type VARCHAR(255) NOT NULL,
- registry_uri VARCHAR(255) NOT NULL,
- CONSTRAINT PK_registries PRIMARY KEY (id));
-
-CREATE TABLE mpacks(
- id BIGINT NOT NULL,
- mpack_name VARCHAR(255) NOT NULL,
- mpack_version VARCHAR(255) NOT NULL,
- mpack_uri VARCHAR(255),
- registry_id BIGINT,
- CONSTRAINT PK_mpacks PRIMARY KEY (id),
- CONSTRAINT uni_mpack_name_version UNIQUE(mpack_name, mpack_version),
- CONSTRAINT FK_registries FOREIGN KEY (registry_id) REFERENCES registries(id));
-
 CREATE INDEX idx_alert_history_def_id on alert_history(alert_definition_id);
 CREATE INDEX idx_alert_history_service on alert_history(service_name);
 CREATE INDEX idx_alert_history_host on alert_history(host_name);

http://git-wip-us.apache.org/repos/asf/ambari/blob/7849de66/ambari-server/src/main/resources/mpacks-v2/README.txt
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/mpacks-v2/README.txt b/ambari-server/src/main/resources/mpacks-v2/README.txt
new file mode 100644
index 0000000..fae891f
--- /dev/null
+++ b/ambari-server/src/main/resources/mpacks-v2/README.txt
@@ -0,0 +1 @@
+This folder is reserved for mpacks.
\ No newline at end of file