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 2018/09/28 21:20:47 UTC

[ambari] 16/20: AMBARI-22979: Update software registry API to support new mpack schema (jluniya) (#433)

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

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

commit a77b2f93bc260e1513cd247079c6bcec70ed0382
Author: jayush <ja...@gmail.com>
AuthorDate: Thu Feb 22 10:49:13 2018 -0800

    AMBARI-22979: Update software registry API to support new mpack schema (jluniya) (#433)
---
 .../api/resources/MpackResourceDefinition.java     |   2 +-
 .../ambari/server/api/services/MpacksService.java  |  24 ++---
 .../ambari/server/controller/MpackRequest.java     |  24 ++---
 .../ambari/server/controller/MpackResponse.java    |  75 +++++++------
 .../controller/internal/MpackResourceProvider.java |  51 +++++----
 .../apache/ambari/server/mpack/MpackManager.java   |  61 +++++------
 .../org/apache/ambari/server/orm/dao/MpackDAO.java |  14 +--
 .../ambari/server/orm/entities/MpackEntity.java    |  20 ++--
 .../java/org/apache/ambari/server/state/Mpack.java | 117 +++++++--------------
 .../apache/ambari/server/utils/MpackVersion.java   |  83 ++++++++++++---
 .../apache/ambari/server/utils/VersionUtils.java   |  13 ++-
 .../AmbariManagementControllerImplTest.java        |   2 +-
 .../ambari/server/controller/MpackRequestTest.java |   4 +-
 .../server/controller/MpackResponseTest.java       |   8 +-
 .../internal/MpackResourceProviderTest.java        |  20 ++--
 .../apache/ambari/server/orm/dao/MpackDAOTest.java |   4 +-
 .../server/orm/entities/MpackEntityTest.java       |   6 +-
 .../org/apache/ambari/server/state/MpackTest.java  |   4 +-
 .../ambari/server/utils/TestVersionUtils.java      |  32 +++++-
 19 files changed, 309 insertions(+), 255 deletions(-)

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 c9560ab..3875135 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
@@ -86,7 +86,7 @@ public class MpackResourceDefinition extends BaseResourceDefinition {
         Map<String, Object> mpackInfo = mapInfo.get("MpackInfo");
 
         int idx = href.indexOf("stacks/");
-        Long mpackId = (Long)mpackInfo.get("mpack_id");
+        Long mpackId = (Long)mpackInfo.get("id");
         href = href.substring(0, idx) + "mpacks/" + mpackId;
         resultNode.setProperty("href", href);
       } else {
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/MpacksService.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/MpacksService.java
index c69ed01..4694841 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/MpacksService.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/MpacksService.java
@@ -79,7 +79,7 @@ public class MpacksService extends BaseService {
     response = MpackResponseWrapper.class, responseContainer = RESPONSE_CONTAINER_LIST)
   @ApiImplicitParams({
     @ApiImplicitParam(name = QUERY_FIELDS, value = QUERY_FILTER_DESCRIPTION, dataType = DATA_TYPE_STRING,
-      paramType = PARAM_TYPE_QUERY, defaultValue = MpackResourceProvider.MPACK_ID),
+      paramType = PARAM_TYPE_QUERY, defaultValue = MpackResourceProvider.MPACK_RESOURCE_ID),
     @ApiImplicitParam(name = QUERY_SORT, value = QUERY_SORT_DESCRIPTION, dataType = DATA_TYPE_STRING,
       paramType = PARAM_TYPE_QUERY),
     @ApiImplicitParam(name = QUERY_PAGE_SIZE, value = QUERY_PAGE_SIZE_DESCRIPTION, defaultValue = DEFAULT_PAGE_SIZE,
@@ -129,13 +129,13 @@ public class MpacksService extends BaseService {
   }
 
   /***
-   * Handles: GET /mpacks/{mpack_id}
-   * Return a specific mpack given an mpack_id
+   * Handles: GET /mpacks/{id}
+   * Return a specific mpack given an id
    *
    * @param
    */
   @GET
-  @Path("{mpack_id}")
+  @Path("{id}")
   @Produces(MediaType.TEXT_PLAIN)
   @ApiOperation(value = "Returns information about a specific mpack that is registered with this Ambari instance",
     response = MpackResponseWrapper.class)
@@ -151,14 +151,14 @@ public class MpacksService extends BaseService {
     @ApiResponse(code = HttpStatus.SC_INTERNAL_SERVER_ERROR, message = MSG_SERVER_ERROR),
   })
   public Response getMpack(String body, @Context HttpHeaders headers, @Context UriInfo ui,
-    @PathParam("mpack_id") String mpackId) {
+    @PathParam("id") String id) {
 
     return handleRequest(headers, body, ui, Request.Type.GET,
-            createMpackResource(mpackId));
+            createMpackResource(id));
   }
 
   @DELETE
-  @Path("{mpack_id}")
+  @Path("{id}")
   @Produces(MediaType.TEXT_PLAIN)
   @ApiOperation(value = "Deletes a selected management pack")
   @ApiImplicitParams({
@@ -172,19 +172,19 @@ public class MpacksService extends BaseService {
           @ApiResponse(code = HttpStatus.SC_FORBIDDEN, message = MSG_PERMISSION_DENIED),
           @ApiResponse(code = HttpStatus.SC_INTERNAL_SERVER_ERROR, message = MSG_SERVER_ERROR),
   })
-  public Response deleteMpack(String body, @Context HttpHeaders headers, @Context UriInfo ui, @PathParam("mpack_id") String mpackId) {
+  public Response deleteMpack(String body, @Context HttpHeaders headers, @Context UriInfo ui, @PathParam("id") String id) {
     return handleRequest(headers, body, ui, Request.Type.DELETE,
-            createMpackResource(mpackId));
+            createMpackResource(id));
   }
 
   /**
    * Create an mpack resource instance
-   * @param mpackId
+   * @param id
    * @return ResourceInstance
    */
-  private ResourceInstance createMpackResource(String mpackId) {
+  private ResourceInstance createMpackResource(String id) {
     return createResource(Resource.Type.Mpack,
-            Collections.singletonMap(Resource.Type.Mpack, mpackId));
+            Collections.singletonMap(Resource.Type.Mpack, id));
 
   }
 
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/MpackRequest.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/MpackRequest.java
index a705d18..49d0caa 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/MpackRequest.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/MpackRequest.java
@@ -26,25 +26,25 @@ import org.apache.ambari.server.orm.entities.MpackEntity;
  */
 public class MpackRequest {
 
-  private Long mpackId;
+  private Long id;
+  private Long registryId;
   private String mpackName;
   private String mpackVersion;
   private String mpackUri;
-  private Long registryId;
 
-  public MpackRequest(Long mpackId) {
-    this.setMpackId(mpackId);
+  public MpackRequest(Long id) {
+    this.setId(id);
   }
 
   public MpackRequest() {
   }
 
-  public Long getMpackId() {
-    return mpackId;
+  public Long getId() {
+    return id;
   }
 
-  public void setMpackId(Long mpackId) {
-    this.mpackId = mpackId;
+  public void setId(Long id) {
+    this.id = id;
   }
 
   public String getMpackName() {
@@ -82,7 +82,7 @@ public class MpackRequest {
   @Override
   public int hashCode() {
     int result = 1;
-    result = 31 + getMpackId().hashCode();
+    result = 31 + getId().hashCode();
     return result;
   }
 
@@ -96,11 +96,11 @@ public class MpackRequest {
     }
     MpackRequest mpackRequest = (MpackRequest) obj;
 
-    if (mpackId == null) {
-      if (mpackRequest.mpackId != null) {
+    if (id == null) {
+      if (mpackRequest.id != null) {
         return false;
       }
-    } else if (!mpackId.equals(mpackRequest.mpackId)) {
+    } else if (!id.equals(mpackRequest.id)) {
       return false;
     }
 
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 7d44c76..bc1e47d 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
@@ -28,86 +28,93 @@ import io.swagger.annotations.ApiModelProperty;
  */
 public class MpackResponse {
 
-  private Long mpackId;
-  private String mpackVersion;
+  private Long id;
+  private String mpackId;
   private String mpackName;
+  private String mpackVersion;
   private String mpackUri;
   private Long registryId;
   private String stackId;
   private String description;
 
   public MpackResponse(Mpack mpack) {
+    this.id = mpack.getResourceId();
     this.mpackId = mpack.getMpackId();
-    this.mpackVersion = mpack.getVersion();
-    this.mpackUri = mpack.getMpacksUri();
     this.mpackName = mpack.getName();
+    this.mpackVersion = mpack.getVersion();
+    this.mpackUri = mpack.getMpackUri();
     this.registryId = mpack.getRegistryId();
-    this.stackId = mpack.getStackId();
     this.description = mpack.getDescription();
   }
 
-  public String getMpackVersion() {
-    return mpackVersion;
+  public Long getId() {
+    return id;
   }
 
-  public String getMpackUri() {
-    return mpackUri;
+  public void setId(Long id) {
+    this.id = id;
   }
 
-  public Long getMpackId() {
-    return mpackId;
+  public Long getRegistryId() {
+    return registryId;
   }
 
-  public String getStackId() {
-    return stackId;
+  public void setRegistryId(Long registryId) {
+    this.registryId = registryId;
   }
 
-  public void setStackId(String stackId) {
-    this.stackId = stackId;
+  public String getMpackId() {
+    return mpackId;
+  }
+
+  public void setMpackId(String mpackId) {
+    this.mpackId = mpackId;
   }
 
   public String getMpackName() {
     return mpackName;
   }
 
-  public Long getRegistryId() {
-    return registryId;
+  public void setMpackName(String mpackName) {
+    this.mpackName = mpackName;
   }
 
-  public void setMpackVersion(String mpackVersion) {
-    this.mpackVersion = mpackVersion;
+  public String getDescription() {
+    return description;
   }
 
-  public void setMpackName(String mpackName) {
-    this.mpackName = mpackName;
+  public void setDescription(String description) {
+    this.description = description;
   }
 
-  public void setMpackUri(String mpackUri) {
-    this.mpackUri = mpackUri;
+  public String getMpackVersion() {
+    return mpackVersion;
   }
 
-  public void setRegistryId(Long registryId) {
-    this.registryId = registryId;
+  public void setMpackVersion(String mpackVersion) {
+    this.mpackVersion = mpackVersion;
   }
 
-  public void setMpackId(Long mpackId) {
-    this.mpackId = mpackId;
+  public String getMpackUri() {
+    return mpackUri;
   }
 
-
-  public String getDescription() {
-    return description;
+  public void setMpackUri(String mpackUri) {
+    this.mpackUri = mpackUri;
   }
 
-  public void setDescription(String description) {
-    this.description = description;
+  public String getStackId() {
+    return stackId;
   }
 
+  public void setStackId(String stackId) {
+    this.stackId = stackId;
+  }
 
   @Override
   public int hashCode() {
     int result = 1;
-    result = 31 + getMpackId().hashCode();
+    result = 31 + getId().hashCode();
     return result;
   }
 
@@ -120,7 +127,7 @@ public class MpackResponse {
       return true;
     }
     MpackResponse MpackResponse = (MpackResponse) obj;
-    return getMpackId().equals(MpackResponse.getMpackId());
+    return getId().equals(MpackResponse.getId());
   }
 
   public interface MpackResponseWrapper extends ApiModel {
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 3771258..3169eda 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
@@ -69,19 +69,20 @@ public class MpackResourceProvider extends AbstractControllerResourceProvider {
 
   public static final String RESPONSE_KEY = "MpackInfo";
   public static final String ALL_PROPERTIES = RESPONSE_KEY + PropertyHelper.EXTERNAL_PATH_SEP + "*";
-  public static final String MPACK_ID = RESPONSE_KEY + PropertyHelper.EXTERNAL_PATH_SEP + "mpack_id";
+  public static final String MPACK_RESOURCE_ID = RESPONSE_KEY + PropertyHelper.EXTERNAL_PATH_SEP + "id";
   public static final String REGISTRY_ID = RESPONSE_KEY + PropertyHelper.EXTERNAL_PATH_SEP + "registry_id";
+  public static final String MPACK_ID = RESPONSE_KEY + PropertyHelper.EXTERNAL_PATH_SEP + "mpack_id";
   public static final String MPACK_NAME = RESPONSE_KEY + PropertyHelper.EXTERNAL_PATH_SEP + "mpack_name";
   public static final String MPACK_VERSION = RESPONSE_KEY + PropertyHelper.EXTERNAL_PATH_SEP + "mpack_version";
+  public static final String MPACK_DESCRIPTION = RESPONSE_KEY + PropertyHelper.EXTERNAL_PATH_SEP + "mpack_description";
   public static final String MPACK_URI = RESPONSE_KEY + PropertyHelper.EXTERNAL_PATH_SEP + "mpack_uri";
   public static final String MODULES = RESPONSE_KEY + PropertyHelper.EXTERNAL_PATH_SEP + "modules";
-  public static final String MPACK_DESC = RESPONSE_KEY + PropertyHelper.EXTERNAL_PATH_SEP + "description";
   public static final String STACK_NAME_PROPERTY_ID = RESPONSE_KEY + PropertyHelper.EXTERNAL_PATH_SEP + "stack_name";
   public static final String STACK_VERSION_PROPERTY_ID =
     RESPONSE_KEY + PropertyHelper.EXTERNAL_PATH_SEP + "stack_version";
 
   private static Set<String> pkPropertyIds = new HashSet<>(
-    Arrays.asList(MPACK_ID, STACK_NAME_PROPERTY_ID, STACK_VERSION_PROPERTY_ID));
+    Arrays.asList(MPACK_RESOURCE_ID, STACK_NAME_PROPERTY_ID, STACK_VERSION_PROPERTY_ID));
 
   /**
    * The property ids for an mpack resource.
@@ -104,18 +105,19 @@ public class MpackResourceProvider extends AbstractControllerResourceProvider {
 
   static {
     // properties
-    PROPERTY_IDS.add(MPACK_ID);
+    PROPERTY_IDS.add(MPACK_RESOURCE_ID);
     PROPERTY_IDS.add(REGISTRY_ID);
+    PROPERTY_IDS.add(MPACK_ID);
     PROPERTY_IDS.add(MPACK_NAME);
     PROPERTY_IDS.add(MPACK_VERSION);
     PROPERTY_IDS.add(MPACK_URI);
-    PROPERTY_IDS.add(MPACK_DESC);
+    PROPERTY_IDS.add(MPACK_DESCRIPTION);
     PROPERTY_IDS.add(MODULES);
     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.Mpack, MPACK_RESOURCE_ID);
     KEY_PROPERTY_IDS.put(Resource.Type.Stack, STACK_NAME_PROPERTY_ID);
     KEY_PROPERTY_IDS.put(Resource.Type.StackVersion, STACK_VERSION_PROPERTY_ID);
 
@@ -145,11 +147,12 @@ public class MpackResourceProvider extends AbstractControllerResourceProvider {
       if (response != null) {
         notifyCreate(Resource.Type.Mpack, request);
         Resource resource = new ResourceImpl(Resource.Type.Mpack);
+        resource.setProperty(MPACK_RESOURCE_ID, response.getId());
         resource.setProperty(MPACK_ID, response.getMpackId());
         resource.setProperty(MPACK_NAME, response.getMpackName());
         resource.setProperty(MPACK_VERSION, response.getMpackVersion());
         resource.setProperty(MPACK_URI, response.getMpackUri());
-        resource.setProperty(MPACK_DESC, response.getDescription());
+        resource.setProperty(MPACK_DESCRIPTION, response.getDescription());
         resource.setProperty(REGISTRY_ID, response.getRegistryId());
         associatedResources.add(resource);
         return getRequestStatus(null, associatedResources);
@@ -199,22 +202,23 @@ public class MpackResourceProvider extends AbstractControllerResourceProvider {
     Set<Map<String, Object>> properties = request.getProperties();
     for (Map propertyMap : properties) {
       //Mpack Download url is either given in the request body or is fetched using the registry id
-      if (!propertyMap.containsKey(MPACK_URI) && !propertyMap.containsKey(REGISTRY_ID))
+      if (!propertyMap.containsKey(MPACK_URI) && !propertyMap.containsKey(REGISTRY_ID)) {
         return null;
-      //Fetch Mpack Download Url using the given registry id
-      else if (!propertyMap.containsKey(MPACK_URI)) {
+      } else if (!propertyMap.containsKey(MPACK_URI)) {
+        // Retrieve mpack download url using the given registry id
         mpackRequest.setRegistryId(Long.valueOf((String) propertyMap.get(REGISTRY_ID)));
         mpackRequest.setMpackName((String) propertyMap.get(MPACK_NAME));
         mpackRequest.setMpackVersion((String) propertyMap.get(MPACK_VERSION));
       }
-      //Directly download the mpack using the given url
-      else
+      else {
+        //Directly download the mpack using the given url
         mpackRequest.setMpackUri((String) propertyMap.get(MPACK_URI));
+      }
     }
     return mpackRequest;
-
   }
 
+
   @Override
   public Set<Resource> getResources(Request request, Predicate predicate)
     throws SystemException, UnsupportedPropertyException,
@@ -231,11 +235,12 @@ public class MpackResourceProvider extends AbstractControllerResourceProvider {
       }
       for (MpackResponse response : responses){
         Resource resource = new ResourceImpl(Resource.Type.Mpack);
+        resource.setProperty(MPACK_RESOURCE_ID, response.getId());
         resource.setProperty(MPACK_ID, response.getMpackId());
         resource.setProperty(MPACK_NAME, response.getMpackName());
         resource.setProperty(MPACK_VERSION, response.getMpackVersion());
         resource.setProperty(MPACK_URI, response.getMpackUri());
-        resource.setProperty(MPACK_DESC, response.getDescription());
+        resource.setProperty(MPACK_DESCRIPTION, response.getDescription());
         resource.setProperty(REGISTRY_ID, response.getRegistryId());
         results.add(resource);
       }
@@ -251,11 +256,12 @@ public class MpackResourceProvider extends AbstractControllerResourceProvider {
           MpackResponse response = getManagementController().getMpack(mpackId);
           Resource resource = new ResourceImpl(Resource.Type.Mpack);
           if (null != response) {
+            resource.setProperty(MPACK_RESOURCE_ID, response.getId());
             resource.setProperty(MPACK_ID, response.getMpackId());
             resource.setProperty(MPACK_NAME, response.getMpackName());
             resource.setProperty(MPACK_VERSION, response.getMpackVersion());
             resource.setProperty(MPACK_URI, response.getMpackUri());
-            resource.setProperty(MPACK_DESC, response.getDescription());
+            resource.setProperty(MPACK_DESCRIPTION, response.getDescription());
             resource.setProperty(REGISTRY_ID, response.getRegistryId());
             resource.setProperty(STACK_NAME_PROPERTY_ID, stackName);
             resource.setProperty(STACK_VERSION_PROPERTY_ID, stackVersion);
@@ -265,21 +271,22 @@ public class MpackResourceProvider extends AbstractControllerResourceProvider {
         return results;
       }
 
-      if (propertyMap.containsKey(MPACK_ID)) {
-        Object objMpackId = propertyMap.get(MPACK_ID);
-        if(objMpackId != null)
+      if (propertyMap.containsKey(MPACK_RESOURCE_ID)) {
+        Object objMpackId = propertyMap.get(MPACK_RESOURCE_ID);
+        if (objMpackId != null)
           mpackId = Long.valueOf((String) objMpackId);
 
           MpackResponse response = getManagementController().getMpack(mpackId);
           Resource resource = new ResourceImpl(Resource.Type.Mpack);
           if (null != response) {
+            resource.setProperty(MPACK_RESOURCE_ID, response.getId());
             resource.setProperty(MPACK_ID, response.getMpackId());
             resource.setProperty(MPACK_NAME, response.getMpackName());
             resource.setProperty(MPACK_VERSION, response.getMpackVersion());
             resource.setProperty(MPACK_URI, response.getMpackUri());
-            resource.setProperty(MPACK_DESC, response.getDescription());
+            resource.setProperty(MPACK_DESCRIPTION, response.getDescription());
             resource.setProperty(REGISTRY_ID, response.getRegistryId());
-            List<Module> modules = getManagementController().getModules(response.getMpackId());
+            List<Module> modules = getManagementController().getModules(response.getId());
             resource.setProperty(MODULES, modules);
             results.add(resource);
           }
@@ -307,8 +314,8 @@ public class MpackResourceProvider extends AbstractControllerResourceProvider {
     if (getManagementController().getClusters().getClusters().size() > 0) {
       throw new SystemException("Delete request cannot be completed since there is a cluster deployed");
     } else {
-      if (propertyMap.containsKey(MPACK_ID)) {
-        Object objMpackId = propertyMap.get(MPACK_ID);
+      if (propertyMap.containsKey(MPACK_RESOURCE_ID)) {
+        Object objMpackId = propertyMap.get(MPACK_RESOURCE_ID);
         if (objMpackId != null) {
           mpackId = Long.valueOf((String) objMpackId);
           LOG.info("Deleting Mpack, id = " + mpackId.toString());
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 29b59b3..123b587 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
@@ -126,9 +126,10 @@ public class MpackManager {
                     "UTF-8");
                   Gson gson = new Gson();
                   Mpack existingMpack = gson.fromJson(mpackJsonContents, Mpack.class);
-                  existingMpack.setMpackId(mpackEntity.getMpackId());
-                  existingMpack.setMpacksUri(mpackEntity.getMpackUri());
-                  mpackMap.put(mpackEntity.getMpackId(), existingMpack);
+                  existingMpack.setResourceId(mpackEntity.getId());
+                  existingMpack.setMpackUri(mpackEntity.getMpackUri());
+                  existingMpack.setRegistryId(mpackEntity.getRegistryId());
+                  mpackMap.put(mpackEntity.getId(), existingMpack);
                 }
               }
             }
@@ -163,7 +164,7 @@ public class MpackManager {
   public MpackResponse registerMpack(MpackRequest mpackRequest)
     throws IOException, IllegalArgumentException, ResourceAlreadyExistsException {
 
-    Long mpackId;
+    Long mpackResourceId;
     String mpackName = "";
     String mpackVersion = "";
     mpack = new Mpack();
@@ -175,27 +176,25 @@ public class MpackManager {
     if (mpackRequest.getRegistryId() != null) {
       mpackName = mpackRequest.getMpackName();
       mpackVersion = mpackRequest.getMpackVersion();
-      mpack.setRegistryId(mpackRequest.getRegistryId());
 
       LOG.info("Mpack Registration via Registry :" + mpackName);
 
       mpack = downloadMpackMetadata(mpackRequest.getMpackUri());
+      mpack.setRegistryId(mpackRequest.getRegistryId());
       isValidMetadata = validateMpackInfo(mpackName, mpackVersion, mpack.getName(), mpack.getVersion());
 
       if (isValidMetadata) {
         mpackTarPath = downloadMpack(mpackRequest.getMpackUri(), mpack.getDefinition());
         createMpackDirectory(mpack);
         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 {
-          String message =
-            "Incorrect information : Mismatch in - (" + mpackName + "," + mpack.getName() + ") or (" + mpackVersion
-              + "," + mpack.getVersion() + ")";
-          throw new IllegalArgumentException(message); //Mismatch in information
-        }
-      }
-    //Mpack registration using direct download
-    else {
+    } else {
+      // Mpack registration using direct download
       mpack = downloadMpackMetadata(mpackRequest.getMpackUri());
       mpackTarPath = downloadMpack(mpackRequest.getMpackUri(), mpack.getDefinition());
 
@@ -208,13 +207,14 @@ public class MpackManager {
       }
     }
     extractMpackTar(mpack, mpackTarPath, mpackDirectory);
-    mpackId = populateDB(mpack);
-
-    if (mpackId != null) {
-      mpackMap.put(mpackId, mpack);
-      mpack.setMpackId(mpackId);
-      if (populateStackDB(mpack))
-        return new MpackResponse(mpack);
+    mpack.setMpackUri(mpackRequest.getMpackUri());
+    mpackResourceId = populateDB(mpack);
+
+    if (mpackResourceId != null) {
+      mpackMap.put(mpackResourceId, mpack);
+      mpack.setResourceId(mpackResourceId);
+      populateStackDB(mpack);
+      return new MpackResponse(mpack);
     }
     String message = "Mpack :" + mpackRequest.getMpackName() + " version: " + mpackRequest.getMpackVersion()
       + " already exists in server";
@@ -476,9 +476,8 @@ public class MpackManager {
     String actualMpackName,
     String actualMpackVersion) {
 
-    String strippedActualMpackVersion = actualMpackVersion.substring(0, actualMpackVersion.lastIndexOf('.'));
     if (expectedMpackName.equalsIgnoreCase(actualMpackName) && expectedMpackVersion
-      .equalsIgnoreCase(strippedActualMpackVersion)) {
+      .equalsIgnoreCase(actualMpackVersion)) {
       return true;
     } else {
       LOG.info("Incorrect information : Mismatch in - (" + expectedMpackName + "," + actualMpackName + ") or ("
@@ -504,7 +503,7 @@ public class MpackManager {
       MpackEntity mpackEntity = new MpackEntity();
       mpackEntity.setMpackName(mpackName);
       mpackEntity.setMpackVersion(mpackVersion);
-      mpackEntity.setMpackUri(mpack.getMpacksUri());
+      mpackEntity.setMpackUri(mpack.getMpackUri());
       mpackEntity.setRegistryId(mpack.getRegistryId());
       Long mpackId = mpackDAO.create(mpackEntity);
       return mpackId;
@@ -520,7 +519,7 @@ public class MpackManager {
    * @param mpack
    * @throws IOException
    */
-  protected boolean populateStackDB(Mpack mpack) throws IOException {
+  protected void populateStackDB(Mpack mpack) throws IOException, ResourceAlreadyExistsException {
     String stackName = mpack.getName();
     String stackVersion = mpack.getVersion();
     StackEntity stackEntity = stackDAO.find(stackName, stackVersion);
@@ -529,14 +528,12 @@ public class MpackManager {
       stackEntity = new StackEntity();
       stackEntity.setStackName(stackName);
       stackEntity.setStackVersion(stackVersion);
-
-      stackEntity.setMpackId(mpack.getMpackId());
+      stackEntity.setMpackId(mpack.getResourceId());
       stackDAO.create(stackEntity);
-      return true;
     } else {
-      LOG.error("Stack {}-{} already exists in the database", stackName, stackVersion);
-      return false;
-
+      String message = "Stack " + stackName + "-" + stackVersion + " already exists";
+      LOG.error(message);
+      throw new ResourceAlreadyExistsException(message);
     }
   }
 
@@ -568,7 +565,7 @@ public class MpackManager {
 
     LOG.info("Removing mpack :" + mpackName);
 
-    mpackMap.remove(mpackEntity.getMpackId());
+    mpackMap.remove(mpackEntity.getId());
     FileUtils.deleteDirectory(mpackDirToDelete);
 
     if (mpackDirectory.isDirectory()) {
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/MpackDAO.java b/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/MpackDAO.java
index fb4e101..d0068c2 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/MpackDAO.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/MpackDAO.java
@@ -53,19 +53,19 @@ public class MpackDAO {
   @Transactional
   public Long create(MpackEntity mpackEntity) {
     m_entityManagerProvider.get().persist(mpackEntity);
-    return mpackEntity.getMpackId();
+    return mpackEntity.getId();
   }
 
   /**
    * Gets an mpack with the specified ID.
    *
-   * @param mpackId
-   *          the ID of the alert to retrieve.
+   * @param id
+   *          the ID of the mpack to retrieve.
    * @return the mpack or {@code null} if none exists.
    */
   @RequiresSession
-  public MpackEntity findById(long mpackId) {
-    return m_entityManagerProvider.get().find(MpackEntity.class, mpackId);
+  public MpackEntity findById(long id) {
+    return m_entityManagerProvider.get().find(MpackEntity.class, id);
   }
 
   /**
@@ -96,8 +96,8 @@ public class MpackDAO {
   }
 
   @Transactional
-  public void removeById(Long mpackId) {
-    m_entityManagerProvider.get().remove(findById(mpackId));
+  public void removeById(Long id) {
+    m_entityManagerProvider.get().remove(findById(id));
   }
 
 }
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/MpackEntity.java b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/MpackEntity.java
index ed5aa6e..d555f91 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/MpackEntity.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/MpackEntity.java
@@ -40,7 +40,7 @@ import java.util.Objects;
 @Entity
 @TableGenerator(name = "mpack_id_generator", table = "ambari_sequences", pkColumnName = "sequence_name", valueColumnName = "sequence_value", pkColumnValue = "mpack_id_seq", initialValue = 1)
 @NamedQueries({
-        @NamedQuery(name = "MpackEntity.findById", query = "SELECT mpack FROM MpackEntity mpack where mpack.mpackId = :mpackId"),
+        @NamedQuery(name = "MpackEntity.findById", query = "SELECT mpack FROM MpackEntity mpack where mpack.id = :id"),
         @NamedQuery(name = "MpackEntity.findAll", query = "SELECT mpack FROM MpackEntity mpack"),
         @NamedQuery(name = "MpackEntity.findByNameVersion", query = "SELECT mpack FROM MpackEntity mpack where mpack.mpackName = :mpackName and mpack.mpackVersion = :mpackVersion")})
 
@@ -49,7 +49,7 @@ public class MpackEntity {
   @Id
   @GeneratedValue(strategy = GenerationType.TABLE, generator = "mpack_id_generator")
   @Column(name = "id", nullable = false, updatable = false)
-  private Long mpackId;
+  private Long id;
 
   @Column(name = "registry_id", nullable = true, insertable = true, updatable = false, length = 10)
   private Long registryId;
@@ -63,8 +63,8 @@ public class MpackEntity {
   @Column(name = "mpack_uri", nullable = false)
   private String mpackUri;
 
-  public Long getMpackId() {
-    return mpackId;
+  public Long getId() {
+    return id;
   }
 
   public Long getRegistryId() {
@@ -83,8 +83,8 @@ public class MpackEntity {
     return mpackUri;
   }
 
-  public void setMpackId(Long mpackId) {
-    this.mpackId = mpackId;
+  public void setId(Long id) {
+    this.id = id;
   }
 
   public void setRegistryId(Long registryId) {
@@ -120,7 +120,7 @@ public class MpackEntity {
     MpackEntity that = (MpackEntity) object;
     EqualsBuilder equalsBuilder = new EqualsBuilder();
 
-    equalsBuilder.append(mpackId, that.mpackId);
+    equalsBuilder.append(id, that.id);
     equalsBuilder.append(mpackName, that.mpackName);
     equalsBuilder.append(mpackVersion, that.mpackVersion);
     return equalsBuilder.isEquals();
@@ -129,7 +129,7 @@ public class MpackEntity {
   /**
    * Generates a hash for the mpack based on the following criteria:
    * <ul>
-   * <li>{@link #mpackId}
+   * <li>{@link #id}
    * </ul>
    * <p/>
    * <p/>
@@ -137,7 +137,7 @@ public class MpackEntity {
    */
   @Override
   public int hashCode() {
-    return Objects.hash(mpackId, mpackName, mpackVersion);
+    return Objects.hash(id, mpackName, mpackVersion);
   }
 
   /**
@@ -146,7 +146,7 @@ public class MpackEntity {
   @Override
   public String toString() {
     StringBuilder buffer = new StringBuilder("MpackEntity{");
-    buffer.append("mpackId=").append(mpackId);
+    buffer.append("id=").append(id);
     if (null != registryId) {
       buffer.append(", registryId=").append(registryId);
     }
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/Mpack.java b/ambari-server/src/main/java/org/apache/ambari/server/state/Mpack.java
index 1bdd394..233cd95 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/state/Mpack.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/Mpack.java
@@ -27,18 +27,25 @@ import java.util.List;
  */
 public class Mpack {
 
-  private Long mpackId;
+  /**
+   * Mpack DB Id
+   */
+  private Long resourceId;
 
   private Long registryId;
 
+  /**
+   * Mpack id as defined in mpack.json
+   */
+  @SerializedName("id")
+  private String mpackId;
+
   @SerializedName("name")
   private String name;
 
   @SerializedName("version")
   private String version;
 
-  @SerializedName("artifacts-path")
-  private String artifactsPath;
 
   @SerializedName("prerequisites")
   private HashMap<String, String> prerequisites;
@@ -46,15 +53,6 @@ public class Mpack {
   @SerializedName("modules")
   private List<Module> modules;
 
-  @SerializedName("modules-path")
-  private String modulesPath;
-
-  @SerializedName("mpack-path")
-  private String mpackPath;
-
-  @SerializedName("stack-id")
-  private String stackId;
-
   @SerializedName("definition")
   private String definition;
 
@@ -63,12 +61,12 @@ public class Mpack {
 
   private String mpackUri;
 
-  public Long getMpackId() {
-    return mpackId;
+  public Long getResourceId() {
+    return resourceId;
   }
 
-  public void setMpackId(Long mpackId) {
-    this.mpackId = mpackId;
+  public void setResourceId(Long resourceId) {
+    this.resourceId = resourceId;
   }
 
   public Long getRegistryId() {
@@ -79,12 +77,20 @@ public class Mpack {
     this.registryId = registryId;
   }
 
-  public String getMpacksUri() {
+  public String getMpackUri() {
     return mpackUri;
   }
 
-  public void setMpacksUri(String mpacksUri) {
-    this.mpackUri = mpacksUri;
+  public void setMpackUri(String mpackUri) {
+    this.mpackUri = mpackUri;
+  }
+
+  public String getMpackId() {
+    return mpackId;
+  }
+
+  public void setMpackId(String mpackId) {
+    this.mpackId = mpackId;
   }
 
   public String getName() {
@@ -127,39 +133,6 @@ public class Mpack {
     this.modules = modules;
   }
 
-  public String getStackId() {
-    return stackId;
-  }
-
-  public void setStackId(String stackId) {
-    this.stackId = stackId;
-  }
-
-
-  public String getArtifactsPath() {
-    return artifactsPath;
-  }
-
-  public void setArtifactsPath(String artifactsPath) {
-    this.artifactsPath = artifactsPath;
-  }
-
-  public String getModulesPath() {
-    return modulesPath;
-  }
-
-  public void setModulesPath(String modulesPath) {
-    this.modulesPath = modulesPath;
-  }
-
-  public String getMpackPath() {
-    return mpackPath;
-  }
-
-  public void setMpackPath(String mpackPath) {
-    this.mpackPath = mpackPath;
-  }
-
   public String getDefinition() {
     return definition;
   }
@@ -175,16 +148,13 @@ public class Mpack {
 
     Mpack mpack = (Mpack) o;
 
-    if (!mpackId.equals(mpack.mpackId)) return false;
+    if (!resourceId.equals(mpack.resourceId)) return false;
     if (registryId != null ? !registryId.equals(mpack.registryId) : mpack.registryId != null) return false;
+    if (!mpackId.equals(mpack.mpackId)) return false;
     if (!name.equals(mpack.name)) return false;
     if (!version.equals(mpack.version)) return false;
-    if (!artifactsPath.equals(mpack.artifactsPath)) return false;
     if (!prerequisites.equals(mpack.prerequisites)) return false;
     if (!modules.equals(mpack.modules)) return false;
-    if (!modulesPath.equals(mpack.modulesPath)) return false;
-    if (!mpackPath.equals(mpack.mpackPath)) return false;
-    if (!stackId.equals(mpack.stackId)) return false;
     if (!definition.equals(mpack.definition)) return false;
     if (!description.equals(mpack.description)) return false;
     return mpackUri.equals(mpack.mpackUri);
@@ -192,16 +162,13 @@ public class Mpack {
 
   @Override
   public int hashCode() {
-    int result = mpackId.hashCode();
+    int result = resourceId.hashCode();
     result = 31 * result + (registryId != null ? registryId.hashCode() : 0);
+    result = 31 * result + mpackId.hashCode();
     result = 31 * result + name.hashCode();
     result = 31 * result + version.hashCode();
-    result = 31 * result + artifactsPath.hashCode();
     result = 31 * result + prerequisites.hashCode();
     result = 31 * result + modules.hashCode();
-    result = 31 * result + modulesPath.hashCode();
-    result = 31 * result + mpackPath.hashCode();
-    result = 31 * result + stackId.hashCode();
     result = 31 * result + definition.hashCode();
     result = 31 * result + description.hashCode();
     result = 31 * result + mpackUri.hashCode();
@@ -211,16 +178,13 @@ public class Mpack {
   @Override
   public String toString() {
     return "Mpack{" +
-            "mpackId=" + mpackId +
+            "id=" + resourceId +
             ", registryId=" + registryId +
+            ", mpackId='" + mpackId + '\'' +
             ", name='" + name + '\'' +
             ", version='" + version + '\'' +
-            ", artifactsPath='" + artifactsPath + '\'' +
             ", prerequisites=" + prerequisites +
             ", modules=" + modules +
-            ", modulesPath='" + modulesPath + '\'' +
-            ", mpackPath='" + mpackPath + '\'' +
-            ", stackId='" + stackId + '\'' +
             ", definition='" + definition + '\'' +
             ", description='" + description + '\'' +
             ", mpackUri='" + mpackUri + '\'' +
@@ -228,15 +192,17 @@ public class Mpack {
   }
 
   public void copyFrom(Mpack mpack) {
-    if (this.name == null)
+    if (this.resourceId == null) {
+      this.resourceId = mpack.getResourceId();
+    }
+    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)
+    }
+    if (this.registryId == null) {
       this.registryId = mpack.getRegistryId();
     if (this.description == null)
       this.description = mpack.getDescription();
@@ -244,18 +210,9 @@ public class Mpack {
     if (this.modules == null) {
       this.modules = mpack.getModules();
     }
-    if (this.artifactsPath == null) {
-      this.artifactsPath = mpack.getArtifactsPath();
-    }
     if (this.prerequisites == null) {
       this.prerequisites = mpack.getPrerequisites();
     }
-    if (this.modulesPath == null) {
-      this.modulesPath = mpack.getModulesPath();
-    }
-    if (this.mpackPath == null) {
-      this.mpackPath = mpack.getMpackPath();
-    }
     if (this.definition == null) {
       this.definition = mpack.getDefinition();
     }
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/utils/MpackVersion.java b/ambari-server/src/main/java/org/apache/ambari/server/utils/MpackVersion.java
index ad3fdc8..31bb167 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/utils/MpackVersion.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/utils/MpackVersion.java
@@ -23,6 +23,9 @@ import java.util.regex.Pattern;
 
 import org.apache.commons.lang.StringUtils;
 
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 /**
  * This class should be used to compare mpack and stack versions.
  * Base method which should be used is parse/parseStackVersion, depends
@@ -38,11 +41,15 @@ public class MpackVersion implements Comparable<MpackVersion> {
   private final static String VERSION_WITH_HOTFIX_AND_BUILD_PATTERN = "^([0-9]+).([0-9]+).([0-9]+)-h([0-9]+)-b([0-9]+)";
   private final static String VERSION_WITH_BUILD_PATTERN = "^([0-9]+).([0-9]+).([0-9]+)-b([0-9]+)";
   private final static String LEGACY_STACK_VERSION_PATTERN = "^([0-9]+).([0-9]+).([0-9]+).([0-9]+)-([0-9]+)";
+  private final static String FORMAT_VERSION_PATTERN = "^([0-9]+)(\\.)?([0-9]+)?(\\.)?([0-9]+)?(-h)?([0-9]+)?(-b)?([0-9]+)?";
 
   // Patterns for previous RE
   private final static Pattern PATTERN_WITH_HOTFIX = Pattern.compile(VERSION_WITH_HOTFIX_AND_BUILD_PATTERN);
   private final static Pattern PATTERN_LEGACY_STACK_VERSION = Pattern.compile(LEGACY_STACK_VERSION_PATTERN);
   private final static Pattern PATTERN_WITHOUT_HOTFIX = Pattern.compile(VERSION_WITH_BUILD_PATTERN);
+  private final static Pattern PATTERN_FORMAT_VERSION = Pattern.compile(FORMAT_VERSION_PATTERN);
+
+  private final static Logger LOG = LoggerFactory.getLogger(MpackVersion.class);
 
   // Parts of version
   private int major;
@@ -68,20 +75,59 @@ public class MpackVersion implements Comparable<MpackVersion> {
    * @return MpackVersion instance which contains parsed version
    * */
   public static MpackVersion parse(String mpackVersion) {
-    Matcher versionMatcher = validateMpackVersion(mpackVersion);
-    MpackVersion result = null;
+    return parse(mpackVersion, true);
+  }
 
+  public static MpackVersion parse(String mpackVersion, boolean strict) {
+
+    if(!strict) {
+      mpackVersion = format(mpackVersion);
+    }
+    Matcher versionMatcher = validateMpackVersion(mpackVersion);
+    if(versionMatcher == null) {
+      throw new IllegalArgumentException("Wrong format for mpack version");
+    }
     if (versionMatcher.pattern().pattern().equals(VERSION_WITH_BUILD_PATTERN)) {
-      result = new MpackVersion(Integer.parseInt(versionMatcher.group(1)), Integer.parseInt(versionMatcher.group(2)),
+      return new MpackVersion(Integer.parseInt(versionMatcher.group(1)), Integer.parseInt(versionMatcher.group(2)),
               Integer.parseInt(versionMatcher.group(3)), 0, Integer.parseInt(versionMatcher.group(4)));
-
-    } else {
-      result = new MpackVersion(Integer.parseInt(versionMatcher.group(1)), Integer.parseInt(versionMatcher.group(2)),
+    } else if (versionMatcher.pattern().pattern().equals(VERSION_WITH_HOTFIX_AND_BUILD_PATTERN)) {
+      return new MpackVersion(Integer.parseInt(versionMatcher.group(1)), Integer.parseInt(versionMatcher.group(2)),
               Integer.parseInt(versionMatcher.group(3)), Integer.parseInt(versionMatcher.group(4)), Integer.parseInt(versionMatcher.group(5)));
-
+    } else {
+      throw new IllegalArgumentException("Wrong format for mpack version");
     }
+  }
 
-    return result;
+  /**
+   * Method to format an mpack version in {major}.{minor}.{maint}-h{hotfix}-b{build} format
+   * @param mpackVersion input mpack version string
+   * @return formatted mpack version string
+   */
+  public static String format(String mpackVersion) {
+    Matcher m = PATTERN_FORMAT_VERSION.matcher(mpackVersion);
+    if(m.matches()) {
+      String majorVersion = m.group(1);
+      String minorVersion = m.group(3);
+      String maintVersion = m.group(5);
+      String hotfixNum = m.group(7);
+      String buildNum = m.group(9);
+      if(hotfixNum != null || buildNum != null) {
+        if(minorVersion == null || maintVersion == null) {
+          // Both minorVersion and maintVersion should be specified
+          throw new IllegalArgumentException("Wrong format for mpack version");
+        }
+      }
+      minorVersion = minorVersion != null? minorVersion: "0";
+      maintVersion = maintVersion != null? maintVersion: "0";
+      hotfixNum = hotfixNum != null? hotfixNum: "0";
+      buildNum = buildNum != null? buildNum: "0";
+      String formattedMpackVersion = String.format("%s.%s.%s-h%s-b%s",
+        majorVersion, minorVersion, maintVersion, hotfixNum, buildNum);
+      return formattedMpackVersion;
+
+    } else {
+      throw new IllegalArgumentException("Wrong format for mpack version");
+    }
   }
 
   /**
@@ -93,10 +139,18 @@ public class MpackVersion implements Comparable<MpackVersion> {
    * */
   public static MpackVersion parseStackVersion(String stackVersion) {
     Matcher versionMatcher = validateStackVersion(stackVersion);
-    MpackVersion result = new MpackVersion(Integer.parseInt(versionMatcher.group(1)), Integer.parseInt(versionMatcher.group(2)),
-          Integer.parseInt(versionMatcher.group(3)), Integer.parseInt(versionMatcher.group(4)), Integer.parseInt(versionMatcher.group(5)));
+    if(versionMatcher == null) {
+      throw new IllegalArgumentException("Wrong format for mpack version");
+    }
 
-    return result;
+    if(versionMatcher.pattern().pattern().equals(LEGACY_STACK_VERSION_PATTERN)) {
+      return new MpackVersion(Integer.parseInt(versionMatcher.group(1)),
+        Integer.parseInt(versionMatcher.group(2)),
+        Integer.parseInt(versionMatcher.group(3)), Integer.parseInt(versionMatcher.group(4)),
+        Integer.parseInt(versionMatcher.group(5)));
+    } else {
+      throw new IllegalArgumentException("Wrong format for mpack version");
+    }
   }
 
   /**
@@ -114,12 +168,9 @@ public class MpackVersion implements Comparable<MpackVersion> {
 
     String stackVersion = StringUtils.trim(version);
 
-    Matcher versionMatcher = PATTERN_WITH_HOTFIX.matcher(stackVersion);
+    Matcher versionMatcher = PATTERN_LEGACY_STACK_VERSION.matcher(stackVersion);
     if (!versionMatcher.find()) {
-      versionMatcher = PATTERN_LEGACY_STACK_VERSION.matcher(stackVersion);
-      if (!versionMatcher.find()) {
-        throw new IllegalArgumentException("Wrong format for stack version, should be N.N.N.N-N or N.N.N-hN-bN");
-      }
+      throw new IllegalArgumentException("Wrong format for stack version, should be N.N.N.N-N or N.N.N-hN-bN");
     }
 
     return versionMatcher;
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/utils/VersionUtils.java b/ambari-server/src/main/java/org/apache/ambari/server/utils/VersionUtils.java
index 6a3d81c..4d1e302 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/utils/VersionUtils.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/utils/VersionUtils.java
@@ -20,7 +20,10 @@ package org.apache.ambari.server.utils;
 import java.util.ArrayList;
 import java.util.List;
 
+import javax.annotation.Nullable;
+
 import org.apache.ambari.server.bootstrap.BootStrapImpl;
+
 import org.apache.commons.lang.StringUtils;
 import org.apache.commons.lang.math.NumberUtils;
 
@@ -253,7 +256,15 @@ public class VersionUtils {
     compare = v2 - v1;
 
     return Integer.compare(compare, 0);
-
   }
 
+  /**
+   * Helper function to compare two comparable versions with null checks
+   * @param v1 The first version
+   * @param v2 The second version
+   * @return 0 if both are equal, <0 if first one is lower, >0 otherwise
+   */
+  public static int compareTo(@Nullable Comparable v1, @Nullable Comparable v2) {
+    return v1 == null ? (v2 == null ? 0 : -1) : v2 == null ? 1 : v1.compareTo(v2);
+  }
 }
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerImplTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerImplTest.java
index f30e030..1e06d18 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerImplTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerImplTest.java
@@ -2452,7 +2452,7 @@ public class AmbariManagementControllerImplTest {
     MpackRequest mpackRequest = createNiceMock(MpackRequest.class);
     RequestStatusResponse response = new RequestStatusResponse(new Long(201));
     Mpack mpack = new Mpack();
-    mpack.setMpackId((long)100);
+    mpack.setResourceId((long)100);
     mpack.setModules(new ArrayList<Module>());
     mpack.setPrerequisites(new HashMap<String, String>());
     mpack.setRegistryId(new Long(100));
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/MpackRequestTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/MpackRequestTest.java
index e858e54..630fb15 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/MpackRequestTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/MpackRequestTest.java
@@ -28,8 +28,8 @@ public class MpackRequestTest {
   @Test
   public void testBasicGetAndSet() {
     MpackRequest mpackRequest =
-            new MpackRequest(new Long(1));
-    Assert.assertEquals("1", mpackRequest.getMpackId());
+            new MpackRequest(1L);
+    Assert.assertEquals((Long)1L, mpackRequest.getId());
     mpackRequest.setMpackUri("abc.tar.gz");
     mpackRequest.setRegistryId(new Long(1));
     mpackRequest.setMpackVersion("3.0");
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/MpackResponseTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/MpackResponseTest.java
index 22bcce7..3ef98c6 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/MpackResponseTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/MpackResponseTest.java
@@ -36,8 +36,8 @@ public class MpackResponseTest {
   @Test
   public void testBasicGetAndSet() {
     MpackResponse mpackResponse = new MpackResponse(setupMpack());
-    Assert.assertEquals(new Long(100), mpackResponse.getMpackId());
-    Assert.assertEquals("100",mpackResponse.getRegistryId());
+    Assert.assertEquals((Long)100L, mpackResponse.getId());
+    Assert.assertEquals((Long)100L, mpackResponse.getRegistryId());
     Assert.assertEquals("3.0",mpackResponse.getMpackVersion());
     Assert.assertEquals("abc.tar.gz",mpackResponse.getMpackUri());
     Assert.assertEquals("testMpack", mpackResponse.getMpackName());
@@ -46,12 +46,12 @@ public class MpackResponseTest {
 
   public Mpack setupMpack() {
     Mpack mpack = new Mpack();
-    mpack.setMpackId(100L);
+    mpack.setResourceId(100L);
     mpack.setModules(new ArrayList<Module>());
     mpack.setPrerequisites(new HashMap<String, String>());
     mpack.setRegistryId(100L);
     mpack.setVersion("3.0");
-    mpack.setMpacksUri("abc.tar.gz");
+    mpack.setMpackUri("abc.tar.gz");
     mpack.setDescription("Test mpack");
     mpack.setName("testMpack");
 
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/MpackResourceProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/MpackResourceProviderTest.java
index f3b5aad..f453684 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/MpackResourceProviderTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/MpackResourceProviderTest.java
@@ -90,14 +90,14 @@ public class MpackResourceProviderTest {
     Resource.Type type = Resource.Type.Mpack;
 
     Resource resourceExpected1 = new ResourceImpl(Resource.Type.Mpack);
-    resourceExpected1.setProperty(MpackResourceProvider.MPACK_ID, (long)1);
+    resourceExpected1.setProperty(MpackResourceProvider.MPACK_RESOURCE_ID, (long)1);
     resourceExpected1.setProperty(MpackResourceProvider.MPACK_NAME, "TestMpack1");
     resourceExpected1.setProperty(MpackResourceProvider.MPACK_VERSION, "3.0");
     resourceExpected1.setProperty(MpackResourceProvider.MPACK_URI, "abcd.tar.gz");
     resourceExpected1.setProperty(MpackResourceProvider.REGISTRY_ID, null);
 
     Resource resourceExpected2 = new ResourceImpl(Resource.Type.Mpack);
-    resourceExpected2.setProperty(MpackResourceProvider.MPACK_ID, (long)2);
+    resourceExpected2.setProperty(MpackResourceProvider.MPACK_RESOURCE_ID, (long)2);
     resourceExpected2.setProperty(MpackResourceProvider.MPACK_NAME, "TestMpack2");
     resourceExpected2.setProperty(MpackResourceProvider.MPACK_VERSION, "3.0");
     resourceExpected2.setProperty(MpackResourceProvider.MPACK_URI, "abc.tar.gz");
@@ -105,14 +105,14 @@ public class MpackResourceProviderTest {
 
     List<MpackEntity> entities = new ArrayList<>();
     MpackEntity entity = new MpackEntity();
-    entity.setMpackId((long) 1);
+    entity.setId((long) 1);
     entity.setMpackUri("abcd.tar.gz");
     entity.setMpackName("TestMpack1");
     entity.setMpackVersion("3.0");
     entities.add(entity);
 
     entity = new MpackEntity();
-    entity.setMpackId((long) 2);
+    entity.setId((long) 2);
     entity.setMpackUri("abc.tar.gz");
     entity.setMpackName("TestMpack2");
     entity.setMpackVersion("3.0");
@@ -138,7 +138,7 @@ public class MpackResourceProviderTest {
     Assert.assertEquals(2, resources.size());
 
     for (Resource resource : resources) {
-      Long mpackId = (Long) resource.getPropertyValue(MpackResourceProvider.MPACK_ID);
+      Long mpackId = (Long) resource.getPropertyValue(MpackResourceProvider.MPACK_RESOURCE_ID);
       if (mpackId == (long) 1) {
         Assert.assertEquals(resourceExpected1.getPropertyValue(MpackResourceProvider.MPACK_NAME), (String) resource.getPropertyValue(MpackResourceProvider.MPACK_NAME));
         Assert.assertEquals(resourceExpected1.getPropertyValue(MpackResourceProvider.MPACK_VERSION), (String) resource.getPropertyValue(MpackResourceProvider.MPACK_VERSION));
@@ -163,11 +163,11 @@ public class MpackResourceProviderTest {
     Resource.Type type = Resource.Type.Mpack;
 
     Predicate predicate = new PredicateBuilder().property(
-            MpackResourceProvider.MPACK_ID).equals(
+            MpackResourceProvider.MPACK_RESOURCE_ID).equals(
             Long.valueOf(1).toString()).toPredicate();
 
     MpackEntity entity = new MpackEntity();
-    entity.setMpackId((long) 1);
+    entity.setId((long) 1);
     entity.setMpackUri("abcd.tar.gz");
     entity.setMpackName("TestMpack1");
     entity.setMpackVersion("3.0");
@@ -182,7 +182,7 @@ public class MpackResourceProviderTest {
     packletArrayList.add(module);
 
     Resource resourceExpected1 = new ResourceImpl(Resource.Type.Mpack);
-    resourceExpected1.setProperty(MpackResourceProvider.MPACK_ID, (long)1);
+    resourceExpected1.setProperty(MpackResourceProvider.MPACK_RESOURCE_ID, (long)1);
     resourceExpected1.setProperty(MpackResourceProvider.MPACK_NAME, "TestMpack1");
     resourceExpected1.setProperty(MpackResourceProvider.MPACK_VERSION, "3.0");
     resourceExpected1.setProperty(MpackResourceProvider.MPACK_URI, "abcd.tar.gz");
@@ -248,7 +248,7 @@ public class MpackResourceProviderTest {
 
     Assert.assertEquals(1,associatedResources.size());
     for(Resource r : associatedResources){
-      Assert.assertEquals((long)100,r.getPropertyValue(MpackResourceProvider.MPACK_ID));
+      Assert.assertEquals((long)100,r.getPropertyValue(MpackResourceProvider.MPACK_RESOURCE_ID));
       Assert.assertEquals("testMpack",r.getPropertyValue(MpackResourceProvider.MPACK_NAME));
       Assert.assertEquals("3.0",r.getPropertyValue(MpackResourceProvider.MPACK_VERSION));
       Assert.assertEquals("../../../../../../../resources/mpacks-v2/abc.tar.gz",r.getPropertyValue(MpackResourceProvider.MPACK_URI));
@@ -266,7 +266,7 @@ public class MpackResourceProviderTest {
 
   public Mpack setupMpack() {
     Mpack mpack = new Mpack();
-    mpack.setMpackId((long)100);
+    mpack.setResourceId((long)100);
     mpack.setModules(new ArrayList<Module>());
     mpack.setPrerequisites(new HashMap<String, String>());
     mpack.setRegistryId(new Long(100));
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/orm/dao/MpackDAOTest.java b/ambari-server/src/test/java/org/apache/ambari/server/orm/dao/MpackDAOTest.java
index 7b45815..f589fe8 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/orm/dao/MpackDAOTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/orm/dao/MpackDAOTest.java
@@ -53,7 +53,7 @@ public class MpackDAOTest {
     // create 2 definitions
     for (int i = 1; i < 3; i++) {
       MpackEntity definition = new MpackEntity();
-      definition.setMpackId(new Long(100)+i);
+      definition.setId(new Long(100)+i);
       definition.setMpackName("testMpack" + i);
       definition.setRegistryId(Long.valueOf(i));
       definition.setMpackVersion("3.0.0.0-12"+i);
@@ -67,7 +67,7 @@ public class MpackDAOTest {
     assertEquals(2, definitions.size());
     definitions = m_dao.findByNameVersion("testMpack1","3.0.0.0-121");
     assertEquals(1, definitions.size());
-    assertEquals(new Long(101),(Long)definitions.get(0).getMpackId());
+    assertEquals(new Long(101),(Long)definitions.get(0).getId());
     MpackEntity entity = m_dao.findById(new Long(102));
     assertEquals(entity.getMpackName(),"testMpack2");
     assertEquals(entity.getMpackVersion(),"3.0.0.0-122");
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/orm/entities/MpackEntityTest.java b/ambari-server/src/test/java/org/apache/ambari/server/orm/entities/MpackEntityTest.java
index 7948111..4677837 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/orm/entities/MpackEntityTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/orm/entities/MpackEntityTest.java
@@ -38,12 +38,12 @@ public class MpackEntityTest {
     Assert.assertEquals(entity1.hashCode(), entity2.hashCode());
     Assert.assertTrue(Objects.equals(entity1, entity2));
 
-    entity1.setMpackId(new Long(1));
-    entity2.setMpackId(new Long(2));
+    entity1.setId(new Long(1));
+    entity2.setId(new Long(2));
     Assert.assertNotSame(entity1.hashCode(), entity2.hashCode());
     Assert.assertFalse(Objects.equals(entity1, entity2));
 
-    entity2.setMpackId(new Long(1));
+    entity2.setId(new Long(1));
     Assert.assertEquals(entity1.hashCode(), entity2.hashCode());
     Assert.assertTrue(Objects.equals(entity1, entity2));
 
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/state/MpackTest.java b/ambari-server/src/test/java/org/apache/ambari/server/state/MpackTest.java
index c561a7a..e478968 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/state/MpackTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/state/MpackTest.java
@@ -30,14 +30,14 @@ public class MpackTest {
   public void testMpacks() {
     Mpack mpack = new Mpack();
     mpack.setName("name");
-    mpack.setMpackId((long)100);
+    mpack.setResourceId((long)100);
     mpack.setDescription("desc");
     mpack.setVersion("3.0");
     mpack.setMpacksUri("abc.tar.gz");
     mpack.setRegistryId(new Long(100));
 
     Assert.assertEquals("name", mpack.getName());
-    Assert.assertEquals(new Long(100), mpack.getMpackId());
+    Assert.assertEquals(new Long(100), mpack.getResourceId());
     Assert.assertEquals("desc", mpack.getDescription());
     Assert.assertEquals("abc.tar.gz", mpack.getMpacksUri());
     Assert.assertEquals(new Long(100), mpack.getRegistryId());
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/utils/TestVersionUtils.java b/ambari-server/src/test/java/org/apache/ambari/server/utils/TestVersionUtils.java
index 08c0a06..ebb7278 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/utils/TestVersionUtils.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/utils/TestVersionUtils.java
@@ -277,17 +277,41 @@ public class TestVersionUtils {
     Assert.assertEquals(-1, MpackVersion.parse("1.2.3-h0-b10").compareTo(MpackVersion.parse("2.2.3-b10")));
     Assert.assertEquals(-1, MpackVersion.parse("1.2.3-h0-b10").compareTo(MpackVersion.parse("1.2.3-h1-b10")));
     Assert.assertEquals(-1, MpackVersion.parse("1.2.3-h0-b10").compareTo(MpackVersion.parse("1.2.3-h0-b11")));
+
+    Assert.assertEquals(0, MpackVersion.parse("1", false).compareTo(MpackVersion.parse("1.0.0-h0-b0")));
+    Assert.assertEquals(0, MpackVersion.parse("1.0", false).compareTo(MpackVersion.parse("1.0.0-h0-b0")));
+    Assert.assertEquals(0, MpackVersion.parse("1.0.0", false).compareTo(MpackVersion.parse("1.0.0-h0-b0")));
+    Assert.assertEquals(0, MpackVersion.parse("1.0.0-b0", false).compareTo(MpackVersion.parse("1.0.0-h0-b0")));
+    Assert.assertEquals(0, MpackVersion.parse("1.0.0-h0-b0", false).compareTo(MpackVersion.parse("1.0.0-h0-b0")));
+
+    Assert.assertEquals(-1, MpackVersion.parse("1", false).compareTo(MpackVersion.parse("1.0.0-h0-b111")));
+    Assert.assertEquals(-1, MpackVersion.parse("1.0", false).compareTo(MpackVersion.parse("1.0.0-h0-b111")));
+    Assert.assertEquals(-1, MpackVersion.parse("1.0.0", false).compareTo(MpackVersion.parse("1.0.0-h0-b111")));
+    Assert.assertEquals(-1, MpackVersion.parse("1.0.0-b0", false).compareTo(MpackVersion.parse("1.0.0-h0-b111")));
+    Assert.assertEquals(-1, MpackVersion.parse("1.0.0-h0-b0", false).compareTo(MpackVersion.parse("1.0.0-h0-b111")));
+
+    Assert.assertEquals(1, MpackVersion.parse("2", false).compareTo(MpackVersion.parse("1.0.0-h0-b111")));
+    Assert.assertEquals(1, MpackVersion.parse("1.1", false).compareTo(MpackVersion.parse("1.0.0-h0-b111")));
+    Assert.assertEquals(1, MpackVersion.parse("1.0.1", false).compareTo(MpackVersion.parse("1.0.0-h0-b111")));
   }
 
   @Test
   public void testStackVersionWithValidVersions() {
     Assert.assertEquals(1, MpackVersion.parse("1.2.3-h10-b10").compareTo(MpackVersion.parseStackVersion("1.2.3.4-888")));
-    Assert.assertEquals(1, MpackVersion.parseStackVersion("1.2.3-h10-b10").compareTo(MpackVersion.parseStackVersion("1.2.3.4-888")));
+    Assert.assertEquals(1, MpackVersion.parse("1.2.4-h1-b1").compareTo(MpackVersion.parseStackVersion("1.2.3.4-888")));
+    Assert.assertEquals(1, MpackVersion.parse("1.3.3-h1-b1").compareTo(MpackVersion.parseStackVersion("1.2.3.4-888")));
+    Assert.assertEquals(1, MpackVersion.parse("2.2.3-h1-b1").compareTo(MpackVersion.parseStackVersion("1.2.3.4-888")));
+
+    Assert.assertEquals(0, MpackVersion.parse("1.2.3-h4-b888").compareTo(MpackVersion.parseStackVersion("1.2.3.4-888")));
+
     Assert.assertEquals(-1, MpackVersion.parse("1.2.3-h10-b10").compareTo(MpackVersion.parseStackVersion("1.2.3.11-888")));
+    Assert.assertEquals(-1, MpackVersion.parse("1.2.3-h10-b10").compareTo(MpackVersion.parseStackVersion("1.2.4.1-1")));
+    Assert.assertEquals(-1, MpackVersion.parse("1.2.3-h10-b10").compareTo(MpackVersion.parseStackVersion("1.3.3.1-1")));
+    Assert.assertEquals(-1, MpackVersion.parse("1.2.3-h10-b10").compareTo(MpackVersion.parseStackVersion("2.2.3.1-1")));
+
     Assert.assertEquals(1, MpackVersion.parseStackVersion("1.2.3.4-999").compareTo(MpackVersion.parseStackVersion("1.2.3.4-888")));
-    Assert.assertEquals(0, MpackVersion.parseStackVersion("1.2.3-h10-b10").compareTo(MpackVersion.parseStackVersion("1.2.3-h10-b10")));
-    Assert.assertEquals(0, MpackVersion.parseStackVersion("1.2.3-h10-b10").compareTo(MpackVersion.parseStackVersion("1.2.3.10-10")));
-    Assert.assertEquals(-1, MpackVersion.parse("1.2.3-h10-b10").compareTo(MpackVersion.parseStackVersion("2.2.3.4-888")));
+    Assert.assertEquals(0, MpackVersion.parseStackVersion("1.2.3.4-999").compareTo(MpackVersion.parseStackVersion("1.2.3.4-999")));
+    Assert.assertEquals(-1, MpackVersion.parseStackVersion("1.2.3.1-999").compareTo(MpackVersion.parseStackVersion("1.2.3.4-888")));
   }
 
   @Test