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

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


The following commit(s) were added to refs/heads/branch-feature-AMBARI-14714 by 
this push:
     new 17e3a1d  [AMBARI-23032] Support for Blueprint exports for MPack-based 
clusters (#716)
17e3a1d is described below

commit 17e3a1dbb284d0c70b3375bc3239da72e84723a1
Author: benyoka <beny...@users.noreply.github.com>
AuthorDate: Mon Mar 26 22:19:16 2018 +0200

    [AMBARI-23032] Support for Blueprint exports for MPack-based clusters (#716)
    
    * AMBARI-23032 fix execptions, export cluster settings and single mpacks 
(benyoka)
    
    * AMBARI-23032 fix review comments (benyoka)
    
    * AMBARI-23032 better method naming (benyoka)
    
    * AMBARI-23032 fix review comments #2 (benyoka)
    
    * AMBARI-23032 fix review comments #3 (benyoka)
    
    * AMBARI-23032 fix swallowed exceptions during mpack installation
    
    * AMBARI-23032 prepare for mpack info in component
    
    * AMBARI-23032 fix exceptions during installation and blueprint export 
(benyoka)
    
    * AMBARI-23032 revert accidental changes (benyoka)
    
    * AMBARI-23032 revert accidental changes #2 (benyoka)
    
    * AMBARI-23032 fixed a number of unit tests (benyoka)
    
    * AMBARI-23032 make sure Blueprints tag is exported (benyoka)
    
    * Merge branch-feature-AMBARI-14714
    
    * AMBARI-23032 fix import error (benyoka)
---
 .../api/query/render/ClusterBlueprintRenderer.java | 55 +++++++++++++++-----
 .../controller/AmbariManagementController.java     |  8 +++
 .../controller/AmbariManagementControllerImpl.java |  8 +++
 .../ClusterStackVersionResourceProvider.java       | 17 +++++--
 .../internal/ComponentResourceProvider.java        | 10 ++--
 .../internal/ExportBlueprintRequest.java           | 58 +++++++++-------------
 .../ambari/server/topology/BlueprintFactory.java   |  2 +-
 .../ambari/server/topology/BlueprintImpl.java      | 15 ++----
 .../apache/ambari/server/topology/Component.java   | 31 ++++++++----
 .../ambari/server/topology/HostGroupImpl.java      |  9 +++-
 .../ambari/server/topology/ResolvedComponent.java  |  2 +-
 .../server/topology/StackComponentResolver.java    | 11 ++--
 .../query/render/ClusterBlueprintRendererTest.java | 31 +++++++++---
 .../ActiveWidgetLayoutResourceProviderTest.java    |  3 ++
 .../internal/ExportBlueprintRequestTest.java       |  4 ++
 .../UserAuthorizationResourceProviderTest.java     |  4 ++
 .../ambari/server/topology/AmbariContextTest.java  |  6 +--
 17 files changed, 177 insertions(+), 97 deletions(-)

diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/api/query/render/ClusterBlueprintRenderer.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/api/query/render/ClusterBlueprintRenderer.java
index 493ea0e..a9144f4 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/api/query/render/ClusterBlueprintRenderer.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/api/query/render/ClusterBlueprintRenderer.java
@@ -46,7 +46,10 @@ import 
org.apache.ambari.server.controller.internal.ArtifactResourceProvider;
 import 
org.apache.ambari.server.controller.internal.BlueprintConfigurationProcessor;
 import org.apache.ambari.server.controller.internal.BlueprintResourceProvider;
 import 
org.apache.ambari.server.controller.internal.ClusterSettingResourceProvider;
+import 
org.apache.ambari.server.controller.internal.ClusterStackVersionResourceProvider;
+import org.apache.ambari.server.controller.internal.ComponentResourceProvider;
 import org.apache.ambari.server.controller.internal.ExportBlueprintRequest;
+import 
org.apache.ambari.server.controller.internal.HostComponentResourceProvider;
 import org.apache.ambari.server.controller.internal.RequestImpl;
 import org.apache.ambari.server.controller.internal.ResourceImpl;
 import org.apache.ambari.server.controller.spi.ClusterController;
@@ -59,7 +62,6 @@ import 
org.apache.ambari.server.controller.spi.SystemException;
 import org.apache.ambari.server.controller.spi.UnsupportedPropertyException;
 import org.apache.ambari.server.controller.utilities.PredicateBuilder;
 import org.apache.ambari.server.state.SecurityType;
-import org.apache.ambari.server.state.StackId;
 import org.apache.ambari.server.topology.AmbariContext;
 import org.apache.ambari.server.topology.ClusterTopology;
 import org.apache.ambari.server.topology.ClusterTopologyImpl;
@@ -112,13 +114,23 @@ public class ClusterBlueprintRenderer extends 
BaseRenderer implements Renderer {
     TreeNode<Set<String>> serviceGroupNode = ensureChild(resultTree, 
Resource.Type.ServiceGroup);
     TreeNode<Set<String>> serviceNode = ensureChild(serviceGroupNode, 
Resource.Type.Service);
     ensureChild(serviceNode, Resource.Type.Component,
-      "ServiceComponentInfo/cluster_name",
-      "ServiceComponentInfo/service_name",
-      "ServiceComponentInfo/component_name",
-      "ServiceComponentInfo/recovery_enabled");
+      ComponentResourceProvider.COMPONENT_CLUSTER_NAME_PROPERTY_ID,
+      ComponentResourceProvider.COMPONENT_SERVICE_NAME_PROPERTY_ID,
+      ComponentResourceProvider.COMPONENT_SERVICE_TYPE_PROPERTY_ID,
+      ComponentResourceProvider.COMPONENT_COMPONENT_NAME_PROPERTY_ID,
+      ComponentResourceProvider.COMPONENT_RECOVERY_ENABLED_ID);
+
+    ensureChild(resultTree, Resource.Type.ClusterStackVersion,
+      
ClusterStackVersionResourceProvider.CLUSTER_STACK_VERSION_STACK_PROPERTY_ID,
+      
ClusterStackVersionResourceProvider.CLUSTER_STACK_VERSION_VERSION_PROPERTY_ID,
+      
ClusterStackVersionResourceProvider.CLUSTER_STACK_VERSION_MPACK_URI_PROPERTY_ID);
 
     TreeNode<Set<String>> hostNode = ensureChild(resultTree, 
Resource.Type.Host);
-    ensureChild(hostNode, Resource.Type.HostComponent, 
"HostRoles/component_name");
+    ensureChild(hostNode, Resource.Type.HostComponent,
+      HostComponentResourceProvider.HOST_COMPONENT_COMPONENT_NAME_PROPERTY_ID,
+      HostComponentResourceProvider.HOST_COMPONENT_SERVICE_NAME_PROPERTY_ID,
+      HostComponentResourceProvider.HOST_COMPONENT_SERVICE_TYPE_PROPERTY_ID,
+      
HostComponentResourceProvider.HOST_COMPONENT_SERVICE_GROUP_NAME_PROPERTY_ID);
 
     return resultTree;
   }
@@ -191,11 +203,7 @@ public class ClusterBlueprintRenderer extends BaseRenderer 
implements Renderer {
     BlueprintConfigurationProcessor configProcessor = new 
BlueprintConfigurationProcessor(topology);
     configProcessor.doUpdateForBlueprintExport();
 
-    Set<StackId> stackIds = topology.getStackIds();
-    // TODO: mpacks should come from service groups once 
https://github.com/apache/ambari/pull/234 will be committed
-    Collection<Map<String, String>> mpackInstances = stackIds.stream().
-      map( stackId -> ImmutableMap.of("name", stackId.getStackName(), 
"version", stackId.getStackVersion())).collect(toList());
-    
blueprintResource.setProperty(BlueprintResourceProvider.MPACK_INSTANCES_PROPERTY_ID,
 mpackInstances);
+    addMpackInstances(blueprintResource, clusterNode);
 
     if (topology.isClusterKerberosEnabled()) {
       Map<String, Object> securityConfigMap = new LinkedHashMap<>();
@@ -212,6 +220,12 @@ public class ClusterBlueprintRenderer extends BaseRenderer 
implements Renderer {
       }
       
blueprintResource.setProperty(BlueprintResourceProvider.BLUEPRINT_SECURITY_PROPERTY_ID,
 securityConfigMap);
     }
+    // This is needed so that exported 3.0+ blueprints have a "Blueprints" 
section in all cases (previously
+    // Blueprints/stack_name, Blueprints/stack_version provided this but in 
3.0 we have mpacks instead of stacks.)
+    else {
+      
blueprintResource.setProperty(BlueprintResourceProvider.BLUEPRINT_SECURITY_PROPERTY_ID,
+        ImmutableMap.of(SecurityConfigurationFactory.TYPE_PROPERTY_ID, 
SecurityType.NONE.name()));
+    }
 
     List<Map<String, Object>> groupList = formatGroupsAsList(topology);
     blueprintResource.setProperty("host_groups", groupList);
@@ -227,6 +241,22 @@ public class ClusterBlueprintRenderer extends BaseRenderer 
implements Renderer {
     return blueprintResource;
   }
 
+  /**
+   * Adds mpack instances to the exported blueprint resource.
+   */
+  private void addMpackInstances(Resource blueprintResource, 
TreeNode<Resource> clusterNode) {
+    List<Map<String, Object>> mpackInstances = 
clusterNode.getChild("stack_versions").getChildren().stream().map(
+      child -> {
+        Map<String, Object> stackVersionProps = 
child.getObject().getPropertiesMap().get("ClusterStackVersions");
+        return ImmutableMap.of(
+          "name", stackVersionProps.get("stack"),
+          "version", stackVersionProps.get("version"),
+          "url", stackVersionProps.get("mpack_uri"));
+      }).
+      collect(toList());
+    
blueprintResource.setProperty(BlueprintResourceProvider.MPACK_INSTANCES_PROPERTY_ID,
 mpackInstances);
+  }
+
   /***
    * Constructs the Settings object of the following form:
    * "settings": [   {
@@ -457,8 +487,7 @@ public class ClusterBlueprintRenderer extends BaseRenderer 
implements Renderer {
 
   protected ClusterTopology createClusterTopology(TreeNode<Resource> 
clusterNode)
       throws InvalidTopologyTemplateException, InvalidTopologyException {
-
-    return new ClusterTopologyImpl(new AmbariContext(), new 
ExportBlueprintRequest(clusterNode));
+    return new ClusterTopologyImpl(controller.getAmbariContext(), new 
ExportBlueprintRequest(clusterNode));
   }
 
   /**
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementController.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementController.java
index 2f90a2b..134a445 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementController.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementController.java
@@ -75,6 +75,7 @@ import org.apache.ambari.server.state.State;
 import org.apache.ambari.server.state.configgroup.ConfigGroupFactory;
 import 
org.apache.ambari.server.state.quicklinksprofile.QuickLinkVisibilityController;
 import org.apache.ambari.server.state.scheduler.RequestExecutionFactory;
+import org.apache.ambari.server.topology.AmbariContext;
 
 
 /**
@@ -565,6 +566,13 @@ public interface AmbariManagementController {
   AmbariMetaInfo getAmbariMetaInfo();
 
   /**
+   * Get the ambari context for this management controller.
+   *
+   * @return the ambari context
+   */
+  AmbariContext getAmbariContext();
+
+  /**
    * Get the service factory for this management controller.
    *
    * @return the service factory
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 3b07476..dd580a9 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
@@ -236,6 +236,7 @@ import 
org.apache.ambari.server.state.svccomphost.ServiceComponentHostOpSucceede
 import 
org.apache.ambari.server.state.svccomphost.ServiceComponentHostStartEvent;
 import 
org.apache.ambari.server.state.svccomphost.ServiceComponentHostStopEvent;
 import 
org.apache.ambari.server.state.svccomphost.ServiceComponentHostUpgradeEvent;
+import org.apache.ambari.server.topology.AmbariContext;
 import org.apache.ambari.server.topology.Setting;
 import org.apache.ambari.server.topology.TopologyDeleteFormer;
 import org.apache.ambari.server.utils.SecretReference;
@@ -357,6 +358,8 @@ public class AmbariManagementControllerImpl implements 
AmbariManagementControlle
   private CredentialStoreService credentialStoreService;
   @Inject
   private SettingDAO settingDAO;
+  @Inject
+  private AmbariContext ambariContext;
 
   private MaintenanceStateHelper maintenanceStateHelper;
 
@@ -5193,6 +5196,11 @@ public class AmbariManagementControllerImpl implements 
AmbariManagementControlle
   }
 
   @Override
+  public AmbariContext getAmbariContext() {
+    return ambariContext;
+  }
+
+  @Override
   public ServiceGroupFactory getServiceGroupFactory() {
     return serviceGroupFactory;
   }
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterStackVersionResourceProvider.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterStackVersionResourceProvider.java
index 475c1b4..99be7e5 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterStackVersionResourceProvider.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterStackVersionResourceProvider.java
@@ -114,8 +114,9 @@ public class ClusterStackVersionResourceProvider extends 
AbstractControllerResou
 
   protected static final String CLUSTER_STACK_VERSION_ID_PROPERTY_ID = 
PropertyHelper.getPropertyId("ClusterStackVersions", "id");
   protected static final String CLUSTER_STACK_VERSION_CLUSTER_NAME_PROPERTY_ID 
= PropertyHelper.getPropertyId("ClusterStackVersions", "cluster_name");
-  protected static final String CLUSTER_STACK_VERSION_STACK_PROPERTY_ID = 
PropertyHelper.getPropertyId("ClusterStackVersions", "stack");
-  protected static final String CLUSTER_STACK_VERSION_VERSION_PROPERTY_ID = 
PropertyHelper.getPropertyId("ClusterStackVersions", "version");
+  public static final String CLUSTER_STACK_VERSION_STACK_PROPERTY_ID = 
PropertyHelper.getPropertyId("ClusterStackVersions", "stack");
+  public static final String CLUSTER_STACK_VERSION_VERSION_PROPERTY_ID = 
PropertyHelper.getPropertyId("ClusterStackVersions", "version");
+  public static final String CLUSTER_STACK_VERSION_MPACK_URI_PROPERTY_ID = 
PropertyHelper.getPropertyId("ClusterStackVersions", "mpack_uri");
   protected static final String CLUSTER_STACK_VERSION_STATE_PROPERTY_ID = 
PropertyHelper.getPropertyId("ClusterStackVersions", "state");
   protected static final String CLUSTER_STACK_VERSION_HOST_STATES_PROPERTY_ID 
= PropertyHelper.getPropertyId("ClusterStackVersions", "host_states");
   protected static final String CLUSTER_STACK_VERSION_REPO_SUMMARY_PROPERTY_ID 
= PropertyHelper.getPropertyId("ClusterStackVersions", "repository_summary");
@@ -159,9 +160,9 @@ public class ClusterStackVersionResourceProvider extends 
AbstractControllerResou
 
   private static Set<String> propertyIds = 
Sets.newHashSet(CLUSTER_STACK_VERSION_ID_PROPERTY_ID,
       CLUSTER_STACK_VERSION_CLUSTER_NAME_PROPERTY_ID, 
CLUSTER_STACK_VERSION_STACK_PROPERTY_ID,
-      CLUSTER_STACK_VERSION_VERSION_PROPERTY_ID, 
CLUSTER_STACK_VERSION_HOST_STATES_PROPERTY_ID,
-      CLUSTER_STACK_VERSION_STATE_PROPERTY_ID, 
CLUSTER_STACK_VERSION_REPOSITORY_VERSION_PROPERTY_ID,
-      CLUSTER_STACK_VERSION_STAGE_SUCCESS_FACTOR,
+      CLUSTER_STACK_VERSION_VERSION_PROPERTY_ID, 
CLUSTER_STACK_VERSION_MPACK_URI_PROPERTY_ID,
+      CLUSTER_STACK_VERSION_HOST_STATES_PROPERTY_ID, 
CLUSTER_STACK_VERSION_STATE_PROPERTY_ID,
+      CLUSTER_STACK_VERSION_REPOSITORY_VERSION_PROPERTY_ID, 
CLUSTER_STACK_VERSION_STAGE_SUCCESS_FACTOR,
       CLUSTER_STACK_VERSION_FORCE, 
CLUSTER_STACK_VERSION_REPO_SUMMARY_PROPERTY_ID,
       CLUSTER_STACK_VERSION_REPO_SUPPORTS_REVERT, 
CLUSTER_STACK_VERSION_REPO_REVERT_UPGRADE_ID);
 
@@ -297,6 +298,12 @@ public class ClusterStackVersionResourceProvider extends 
AbstractControllerResou
       StackEntity repoVersionStackEntity = repositoryVersion.getStack();
       StackId repoVersionStackId = new StackId(repoVersionStackEntity);
 
+      AmbariMetaInfo ami = getManagementController().getAmbariMetaInfo();
+      ami.getMpacks().stream().
+        filter(mp -> mp.getName().equals(repoVersionStackId.getStackName()) && 
mp.getVersion().equals(repoVersionStackId.getStackVersion())).
+        findFirst().
+        ifPresent(mpack -> setResourceProperty(resource, 
CLUSTER_STACK_VERSION_MPACK_URI_PROPERTY_ID, mpack.getMpackUri(), 
requestedIds));
+
       try {
         MpackHostStateDAO mpackHostStateDAO = mpackHostStateDAOProvider.get();
         List<MpackHostStateEntity> mpackInstallStates = Lists.newArrayList();
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ComponentResourceProvider.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ComponentResourceProvider.java
index 695eb58..efc4462 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ComponentResourceProvider.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ComponentResourceProvider.java
@@ -90,14 +90,14 @@ public class ComponentResourceProvider extends 
AbstractControllerResourceProvide
   // Components
 
   protected static final String COMPONENT_CLUSTER_ID_PROPERTY_ID = 
RESPONSE_KEY + PropertyHelper.EXTERNAL_PATH_SEP + "cluster_id";
-  protected static final String COMPONENT_CLUSTER_NAME_PROPERTY_ID = 
RESPONSE_KEY + PropertyHelper.EXTERNAL_PATH_SEP + "cluster_name";
+  public static final String COMPONENT_CLUSTER_NAME_PROPERTY_ID = RESPONSE_KEY 
+ PropertyHelper.EXTERNAL_PATH_SEP + "cluster_name";
   protected static final String COMPONENT_SERVICE_GROUP_ID_PROPERTY_ID = 
RESPONSE_KEY + PropertyHelper.EXTERNAL_PATH_SEP + "service_group_id";
   protected static final String COMPONENT_SERVICE_GROUP_NAME_PROPERTY_ID = 
RESPONSE_KEY + PropertyHelper.EXTERNAL_PATH_SEP + "service_group_name";
   protected static final String COMPONENT_SERVICE_ID_PROPERTY_ID = 
RESPONSE_KEY + PropertyHelper.EXTERNAL_PATH_SEP + "service_id";
-  protected static final String COMPONENT_SERVICE_NAME_PROPERTY_ID = 
RESPONSE_KEY + PropertyHelper.EXTERNAL_PATH_SEP + "service_name";
-  protected static final String COMPONENT_SERVICE_TYPE_PROPERTY_ID = 
RESPONSE_KEY + PropertyHelper.EXTERNAL_PATH_SEP + "service_type";
+  public static final String COMPONENT_SERVICE_NAME_PROPERTY_ID = RESPONSE_KEY 
+ PropertyHelper.EXTERNAL_PATH_SEP + "service_name";
+  public static final String COMPONENT_SERVICE_TYPE_PROPERTY_ID = RESPONSE_KEY 
+ PropertyHelper.EXTERNAL_PATH_SEP + "service_type";
   protected static final String COMPONENT_COMPONENT_ID_PROPERTY_ID = 
RESPONSE_KEY + PropertyHelper.EXTERNAL_PATH_SEP + "id";
-  protected static final String COMPONENT_COMPONENT_NAME_PROPERTY_ID = 
RESPONSE_KEY + PropertyHelper.EXTERNAL_PATH_SEP + "component_name";
+  public static final String COMPONENT_COMPONENT_NAME_PROPERTY_ID = 
RESPONSE_KEY + PropertyHelper.EXTERNAL_PATH_SEP + "component_name";
   protected static final String COMPONENT_COMPONENT_TYPE_PROPERTY_ID = 
RESPONSE_KEY + PropertyHelper.EXTERNAL_PATH_SEP + "component_type";
   protected static final String COMPONENT_DISPLAY_NAME_PROPERTY_ID = 
RESPONSE_KEY + PropertyHelper.EXTERNAL_PATH_SEP + "display_name";
   protected static final String COMPONENT_STATE_PROPERTY_ID = RESPONSE_KEY + 
PropertyHelper.EXTERNAL_PATH_SEP + "state";
@@ -110,7 +110,7 @@ public class ComponentResourceProvider extends 
AbstractControllerResourceProvide
   protected static final String COMPONENT_INIT_COUNT_PROPERTY_ID = 
RESPONSE_KEY + PropertyHelper.EXTERNAL_PATH_SEP + "init_count";
   protected static final String COMPONENT_UNKNOWN_COUNT_PROPERTY_ID = 
RESPONSE_KEY + PropertyHelper.EXTERNAL_PATH_SEP + "unknown_count";
   protected static final String COMPONENT_INSTALL_FAILED_COUNT_PROPERTY_ID = 
RESPONSE_KEY + PropertyHelper.EXTERNAL_PATH_SEP + "install_failed_count";
-  protected static final String COMPONENT_RECOVERY_ENABLED_ID = RESPONSE_KEY + 
PropertyHelper.EXTERNAL_PATH_SEP + "recovery_enabled";
+  public static final String COMPONENT_RECOVERY_ENABLED_ID = RESPONSE_KEY + 
PropertyHelper.EXTERNAL_PATH_SEP + "recovery_enabled";
   protected static final String COMPONENT_DESIRED_STACK = RESPONSE_KEY + 
PropertyHelper.EXTERNAL_PATH_SEP + "desired_stack";
   protected static final String COMPONENT_DESIRED_VERSION = RESPONSE_KEY + 
PropertyHelper.EXTERNAL_PATH_SEP + "desired_version";
   protected static final String COMPONENT_REPOSITORY_STATE = RESPONSE_KEY + 
PropertyHelper.EXTERNAL_PATH_SEP + "repository_state";
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ExportBlueprintRequest.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ExportBlueprintRequest.java
index 151d9a7..14179f4 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ExportBlueprintRequest.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ExportBlueprintRequest.java
@@ -19,6 +19,8 @@
 
 package org.apache.ambari.server.controller.internal;
 
+import static java.util.stream.Collectors.toMap;
+
 import java.net.InetAddress;
 import java.net.UnknownHostException;
 import java.util.ArrayList;
@@ -26,7 +28,6 @@ import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
-import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
@@ -34,6 +35,7 @@ import org.apache.ambari.server.StackAccessException;
 import org.apache.ambari.server.api.util.TreeNode;
 import org.apache.ambari.server.controller.AmbariManagementController;
 import org.apache.ambari.server.controller.AmbariServer;
+import org.apache.ambari.server.controller.RootComponent;
 import org.apache.ambari.server.controller.spi.Resource;
 import org.apache.ambari.server.controller.utilities.PropertyHelper;
 import org.apache.ambari.server.state.DesiredConfig;
@@ -67,6 +69,7 @@ public class ExportBlueprintRequest implements 
TopologyRequest {
   private Configuration configuration;
   //todo: Should this map be represented by a new class?
   private Map<String, HostGroupInfo> hostGroupInfo = new HashMap<>();
+  private Map<String, StackId> serviceGroupToMpack = new HashMap<>();
 
 
   public ExportBlueprintRequest(TreeNode<Resource> clusterNode) throws 
InvalidTopologyTemplateException {
@@ -76,6 +79,10 @@ public class ExportBlueprintRequest implements 
TopologyRequest {
     clusterId = Long.valueOf(String.valueOf(clusterResource.getPropertyValue(
             ClusterResourceProvider.CLUSTER_ID_PROPERTY_ID)));
 
+    // create service group to mpack map
+    serviceGroupToMpack = 
clusterNode.getChild("servicegroups").getChildren().stream().
+      map(tn -> 
tn.getObject().getPropertiesMap().get(ServiceGroupResourceProvider.RESPONSE_KEY)).
+      collect(toMap(m -> m.get("service_group_name").toString(), m -> new 
StackId(m.get("version").toString())));
 
     createConfiguration(clusterNode);
     //todo: should be parsing Configuration from the beginning
@@ -128,15 +135,9 @@ public class ExportBlueprintRequest implements 
TopologyRequest {
 
     Collection<HostGroup> hostGroups = new ArrayList<>();
     for (ExportedHostGroup exportedHostGroup : exportedHostGroups) {
-
-      // create Component using component name
-      List<Component> componentList = new ArrayList<>();
-      for (String component : exportedHostGroup.getComponents()) {
-        componentList.add(new Component(component));
-      }
-
-      hostGroups.add(new HostGroupImpl(exportedHostGroup.getName(), 
componentList,
-          exportedHostGroup.getConfiguration(), 
String.valueOf(exportedHostGroup.getCardinality())));
+      hostGroups.add(new HostGroupImpl(exportedHostGroup.getName(),
+        exportedHostGroup.getComponents(), 
exportedHostGroup.getConfiguration(),
+        String.valueOf(exportedHostGroup.getCardinality())));
     }
     ImmutableSet<StackId> stackIds = ImmutableSet.of(stack.getStackId());
     blueprint = new BlueprintImpl(bpName, hostGroups, stackIds, 
Collections.emptySet(), configuration, null, null);
@@ -218,31 +219,11 @@ public class ExportBlueprintRequest implements 
TopologyRequest {
         group.setName("host_group_" + count++);
         group.addHost(hostName);
       }
-      processHostGroupComponents(group);
     }
-
     return mapHostGroups.values();
   }
 
 
-  /**
-   * Process host group component information for a specific host.
-   *
-   * @param group host group instance
-   *
-   * @return list of component names for the host
-   */
-  private List<Map<String, String>> 
processHostGroupComponents(ExportedHostGroup group) {
-    List<Map<String, String>> listHostGroupComponents = new ArrayList<>();
-    for (String component : group.getComponents()) {
-      Map<String, String> mapComponentProperties = new HashMap<>();
-      listHostGroupComponents.add(mapComponentProperties);
-      mapComponentProperties.put("name", component);
-    }
-    return listHostGroupComponents;
-  }
-
-
   // ----- Host Group inner class --------------------------------------------
 
   /**
@@ -259,7 +240,7 @@ public class ExportBlueprintRequest implements 
TopologyRequest {
     /**
      * Associated components.
      */
-    private Set<String> components = new HashSet<>();
+    private Set<Component> components = new HashSet<>();
 
     /**
      * Host group scoped configurations.
@@ -284,8 +265,15 @@ public class ExportBlueprintRequest implements 
TopologyRequest {
     public ExportedHostGroup(TreeNode<Resource> host) {
       TreeNode<Resource> components = host.getChild("host_components");
       for (TreeNode<Resource> component : components.getChildren()) {
-        getComponents().add((String) component.getObject().getPropertyValue(
-            "HostRoles/component_name"));
+        Resource resource = component.getObject();
+        String componentName =
+          
String.valueOf(resource.getPropertyValue(HostComponentResourceProvider.HOST_COMPONENT_COMPONENT_NAME_PROPERTY_ID));
+        String serviceName =
+          
String.valueOf(resource.getPropertyValue(HostComponentResourceProvider.HOST_COMPONENT_SERVICE_NAME_PROPERTY_ID));
+        String serviceGroupName =
+          
String.valueOf(resource.getPropertyValue(HostComponentResourceProvider.HOST_COMPONENT_SERVICE_GROUP_NAME_PROPERTY_ID));
+        StackId stackId = serviceGroupToMpack.get(serviceGroupName);
+        getComponents().add(new Component(componentName, stackId, serviceName, 
null));
       }
       addAmbariComponentIfLocalhost((String) host.getObject().getPropertyValue(
           PropertyHelper.getPropertyId("Hosts", "host_name")));
@@ -339,7 +327,7 @@ public class ExportBlueprintRequest implements 
TopologyRequest {
       return name;
     }
 
-    public Set<String> getComponents() {
+    public Set<Component> getComponents() {
       return components;
     }
 
@@ -401,7 +389,7 @@ public class ExportBlueprintRequest implements 
TopologyRequest {
         InetAddress hostAddress = InetAddress.getByName(hostname);
         try {
           if (hostAddress.equals(InetAddress.getLocalHost())) {
-            getComponents().add("AMBARI_SERVER");
+            components.add(new Component(RootComponent.AMBARI_SERVER.name()));
           }
         } catch (UnknownHostException e) {
           //todo: SystemException?
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/topology/BlueprintFactory.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/topology/BlueprintFactory.java
index b9c01bb..cc29551 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/topology/BlueprintFactory.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/topology/BlueprintFactory.java
@@ -227,7 +227,7 @@ public class BlueprintFactory {
       //TODO, might want to add some validation here, to only accept value 
enum types, rwn
       ProvisionAction provisionAction = 
componentProperties.containsKey(COMPONENT_PROVISION_ACTION_PROPERTY_ID) ?
         
ProvisionAction.valueOf(componentProperties.get(COMPONENT_PROVISION_ACTION_PROPERTY_ID))
 : null;
-      components.add(new Component(componentName, mpackInstance, 
serviceInstance, provisionAction));
+      components.add(new Component(componentName, new StackId(mpackInstance), 
serviceInstance, provisionAction));
     }
 
     return components;
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/topology/BlueprintImpl.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/topology/BlueprintImpl.java
index 7948fe0..633bcb0 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/topology/BlueprintImpl.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/topology/BlueprintImpl.java
@@ -24,7 +24,6 @@ import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
-import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -44,8 +43,6 @@ import org.apache.ambari.server.state.StackId;
 import org.apache.ambari.server.utils.JsonUtils;
 
 import com.fasterxml.jackson.core.type.TypeReference;
-import com.google.common.base.Preconditions;
-import com.google.common.base.Splitter;
 import com.google.common.collect.ImmutableMap;
 import com.google.gson.Gson;
 
@@ -332,15 +329,9 @@ public class BlueprintImpl implements Blueprint {
       componentEntity.setHostGroupEntity(group);
       componentEntity.setHostGroupName(group.getName());
       componentEntity.setServiceName(component.getServiceInstance());
-      if (null != component.getMpackInstance()) {
-        Preconditions.checkArgument(component.getMpackInstance().contains("-"),
-          "Invalid mpack instance specified for component %s: %s. Must be in 
{name}-{version} format.",
-          component.getName(),
-          component.getMpackInstance());
-        Iterator<String> mpackNameAndVersion =
-          Splitter.on('-').split(component.getMpackInstance()).iterator();
-        componentEntity.setMpackName(mpackNameAndVersion.next());
-        componentEntity.setMpackVersion(mpackNameAndVersion.next());
+      if (null != component.getStackId()) {
+        componentEntity.setMpackName(component.getStackId().getStackName());
+        
componentEntity.setMpackVersion(component.getStackId().getStackVersion());
       }
 
       // add provision action (if specified) to entity type
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/topology/Component.java 
b/ambari-server/src/main/java/org/apache/ambari/server/topology/Component.java
index 3cc9c99..e44c814 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/topology/Component.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/topology/Component.java
@@ -24,11 +24,16 @@ import java.util.Objects;
 import javax.annotation.Nullable;
 
 import org.apache.ambari.server.controller.internal.ProvisionAction;
+import org.apache.ambari.server.state.StackId;
 
 public class Component {
 
   private final String name;
-  private final String mpackInstance;
+
+  @Nullable
+  private final StackId stackId;
+
+  @Nullable
   private final String serviceInstance;
   private final ProvisionAction provisionAction;
 
@@ -37,9 +42,9 @@ public class Component {
     this(name, null, null, null);
   }
 
-  public Component(String name, @Nullable String mpackInstance, @Nullable 
String serviceInstance, ProvisionAction provisionAction) {
+  public Component(String name, @Nullable StackId stackId, @Nullable String 
serviceInstance, ProvisionAction provisionAction) {
     this.name = name;
-    this.mpackInstance = mpackInstance;
+    this.stackId = stackId;
     this.serviceInstance = serviceInstance;
     this.provisionAction = provisionAction;
   }
@@ -54,13 +59,21 @@ public class Component {
   }
 
   /**
-   * @return the mpack associated with this component (can be {@code null} if 
component -> mpack mapping is unambiguous)
+   * @return the mpack associated with this component as {@link String} (can 
be {@code null} if component -> mpack mapping is unambiguous)
    */
-  public String getMpackInstance() {
-    return mpackInstance;
+  public String getStackIdAsString() {
+    return stackId != null ? stackId.toString() : null;
   }
 
   /**
+   * @return the mpack associated with this component as {@link StackId} (can 
be {@code null} if component -> mpack mapping is unambiguous)
+   */
+  public StackId getStackId() {
+    return stackId;
+  }
+
+
+  /**
    * @return the service instance this component belongs to. Can be {@code 
null} if component does not belong to a service
    * instance (there is a single service of the component's service type)
    */
@@ -82,7 +95,7 @@ public class Component {
   public String toString() {
     return com.google.common.base.Objects.toStringHelper(this)
       .add("name", name)
-      .add("mpackInstance", mpackInstance)
+      .add("stackId", stackId)
       .add("serviceInstance", serviceInstance)
       .add("provisionAction", provisionAction)
       .toString();
@@ -95,13 +108,13 @@ public class Component {
     if (o == null || getClass() != o.getClass()) return false;
     Component component = (Component) o;
     return Objects.equals(name, component.name) &&
-      Objects.equals(mpackInstance, component.mpackInstance) &&
+      Objects.equals(stackId, component.stackId) &&
       Objects.equals(serviceInstance, component.serviceInstance) &&
       provisionAction == component.provisionAction;
   }
 
   @Override
   public int hashCode() {
-    return Objects.hash(name, mpackInstance, serviceInstance, provisionAction);
+    return Objects.hash(name, stackId, serviceInstance, provisionAction);
   }
 }
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/topology/HostGroupImpl.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/topology/HostGroupImpl.java
index be607e7..83375d5 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/topology/HostGroupImpl.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/topology/HostGroupImpl.java
@@ -20,6 +20,7 @@
 package org.apache.ambari.server.topology;
 
 import static java.util.stream.Collectors.toList;
+import static org.apache.commons.lang3.StringUtils.isNotEmpty;
 
 import java.util.Collection;
 import java.util.HashMap;
@@ -32,6 +33,7 @@ import 
org.apache.ambari.server.controller.internal.ProvisionAction;
 import org.apache.ambari.server.orm.entities.HostGroupComponentEntity;
 import org.apache.ambari.server.orm.entities.HostGroupConfigEntity;
 import org.apache.ambari.server.orm.entities.HostGroupEntity;
+import org.apache.ambari.server.state.StackId;
 
 import com.google.gson.Gson;
 
@@ -132,11 +134,16 @@ public class HostGroupImpl implements HostGroup {
    */
   private void parseComponents(HostGroupEntity entity) {
     for (HostGroupComponentEntity componentEntity : entity.getComponents() ) {
+      StackId stackId =
+        isNotEmpty(componentEntity.getMpackName()) && 
isNotEmpty(componentEntity.getMpackVersion()) ?
+          new StackId(componentEntity.getMpackName(), 
componentEntity.getMpackVersion()) : null;
+
       Component component = new Component(
         componentEntity.getName(),
-        componentEntity.getMpackName(),
+        stackId,
         componentEntity.getServiceName(),
         null == componentEntity.getProvisionAction() ? null : 
ProvisionAction.valueOf(componentEntity.getProvisionAction()));
+
       addComponent(component);
     }
   }
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/topology/ResolvedComponent.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/topology/ResolvedComponent.java
index b6463ad..2b9d478 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/topology/ResolvedComponent.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/topology/ResolvedComponent.java
@@ -61,7 +61,7 @@ public interface ResolvedComponent {
       .component(component)
       .componentName(component.getName())
       .serviceName(Optional.ofNullable(component.getServiceInstance()))
-      .serviceGroupName(Optional.ofNullable(component.getMpackInstance()));
+      .serviceGroupName(Optional.ofNullable(component.getStackIdAsString()));
   }
 
   class Builder extends ResolvedComponent_Builder {
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/topology/StackComponentResolver.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/topology/StackComponentResolver.java
index 6db9a46..6bfd880 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/topology/StackComponentResolver.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/topology/StackComponentResolver.java
@@ -95,8 +95,8 @@ public class StackComponentResolver implements 
ComponentResolver {
       .append(" found for component ").append(comp.getName())
       .append(" in host group " ).append(hg.getName());
 
-    if (!Strings.isNullOrEmpty(comp.getMpackInstance())) {
-      sb.append(" mpack: ").append(comp.getMpackInstance());
+    if (!Strings.isNullOrEmpty(comp.getStackIdAsString())) {
+      sb.append(" mpack: ").append(comp.getStackIdAsString());
     }
     if (!Strings.isNullOrEmpty(comp.getServiceInstance())) {
       sb.append(" service: ").append(comp.getServiceInstance());
@@ -113,7 +113,7 @@ public class StackComponentResolver implements 
ComponentResolver {
     Map<String, Map<String, ServiceInstance>> mpackServices, Map<String, 
ServiceInstance> uniqueServices
   ) {
     if (!Strings.isNullOrEmpty(comp.getServiceInstance())) {
-      String mpackName = comp.getMpackInstance();
+      String mpackName = comp.getStackIdAsString();
       Map<String, ServiceInstance> services = !Strings.isNullOrEmpty(mpackName)
         ? mpackServices.get(mpackName)
         : uniqueServices;
@@ -131,10 +131,9 @@ public class StackComponentResolver implements 
ComponentResolver {
 
   // if component references a specific mpack instance, filter the stream by 
the name of that mpack
   private static Stream<Pair<StackId, ServiceInfo>> 
filterByMpackName(Component comp, Stream<Pair<StackId, ServiceInfo>> stream) {
-    if (!Strings.isNullOrEmpty(comp.getMpackInstance())) {
-      return stream.filter(pair -> 
pair.getLeft().getStackName().equals(comp.getMpackInstance()));
+    if (comp.getStackId() != null) {
+      return stream.filter(pair -> pair.getLeft().equals(comp.getStackId()));
     }
-
     return stream;
   }
 
diff --git 
a/ambari-server/src/test/java/org/apache/ambari/server/api/query/render/ClusterBlueprintRendererTest.java
 
b/ambari-server/src/test/java/org/apache/ambari/server/api/query/render/ClusterBlueprintRendererTest.java
index 08bed11..7f74264 100644
--- 
a/ambari-server/src/test/java/org/apache/ambari/server/api/query/render/ClusterBlueprintRendererTest.java
+++ 
b/ambari-server/src/test/java/org/apache/ambari/server/api/query/render/ClusterBlueprintRendererTest.java
@@ -72,6 +72,7 @@ import 
org.apache.ambari.server.controller.spi.UnsupportedPropertyException;
 import org.apache.ambari.server.state.Cluster;
 import org.apache.ambari.server.state.Clusters;
 import org.apache.ambari.server.state.DesiredConfig;
+import org.apache.ambari.server.state.SecurityType;
 import org.apache.ambari.server.state.ServiceInfo;
 import org.apache.ambari.server.state.StackId;
 import org.apache.ambari.server.state.cluster.ClustersImpl;
@@ -93,6 +94,7 @@ import org.powermock.api.easymock.PowerMock;
 import org.powermock.core.classloader.annotations.PrepareForTest;
 import org.powermock.modules.junit4.PowerMockRunner;
 
+import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
 
 /**
@@ -257,7 +259,7 @@ public class ClusterBlueprintRendererTest {
     assertNotNull(propertyTree.getChild("Host"));
     assertTrue(propertyTree.getChild("Host").getObject().isEmpty());
     assertNotNull(propertyTree.getChild("Host/HostComponent"));
-    assertEquals(1, 
propertyTree.getChild("Host/HostComponent").getObject().size());
+    assertEquals(4, 
propertyTree.getChild("Host/HostComponent").getObject().size());
     
assertTrue(propertyTree.getChild("Host/HostComponent").getObject().contains("HostRoles/component_name"));
   }
 
@@ -269,6 +271,8 @@ public class ClusterBlueprintRendererTest {
 
     TreeNode<Resource> clusterTree = resultTree.addChild(clusterResource, 
"Cluster:1");
 
+    addStackVersions(clusterTree);
+
     // Add global recovery_enabled as cluster setting
     TreeNode<Resource> settingsNode = clusterTree.addChild(null, "settings");
     Resource clusterSettingResource = new 
ResourceImpl(Resource.Type.ClusterSetting);
@@ -364,7 +368,7 @@ public class ClusterBlueprintRendererTest {
   public void testGetSettings_instance(){
     Result result = new ResultImpl(true);
 
-    TreeNode<Resource> resultTree = 
createResultTreeSettingsObject(result.getResultTree());
+    createResultTreeSettingsObject(result.getResultTree());
 
     ClusterBlueprintRenderer renderer = new TestBlueprintRenderer(topology);
     Result blueprintResult = renderer.finalizeResult(result);
@@ -434,7 +438,7 @@ public class ClusterBlueprintRendererTest {
     assertNotNull(propertyTree.getChild("Host"));
     assertTrue(propertyTree.getChild("Host").getObject().isEmpty());
     assertNotNull(propertyTree.getChild("Host/HostComponent"));
-    assertEquals(1, 
propertyTree.getChild("Host/HostComponent").getObject().size());
+    assertEquals(4, 
propertyTree.getChild("Host/HostComponent").getObject().size());
     
assertTrue(propertyTree.getChild("Host/HostComponent").getObject().contains("HostRoles/component_name"));
   }
 
@@ -459,7 +463,7 @@ public class ClusterBlueprintRendererTest {
 
     Map<String, Object> securityProperties = (Map<String, Object>) 
properties.get("Blueprints").get("security");
     assertNotNull(securityProperties);
-    assertEquals("KERBEROS", securityProperties.get("type"));
+    assertEquals(SecurityType.KERBEROS.name(), securityProperties.get("type"));
     assertNotNull(((Map<String, Object>) 
securityProperties.get("kerberos_descriptor")).get("properties"));
   }
 
@@ -526,6 +530,10 @@ public class ClusterBlueprintRendererTest {
         assertEquals(expectedValues, actualValues);
       }
     }
+
+    Map<String, Object> securityProperties = (Map<String, Object>) 
properties.get("Blueprints").get("security");
+    assertNotNull(securityProperties);
+    assertEquals(SecurityType.NONE.name(), securityProperties.get("type"));
   }
 
   @Test
@@ -683,10 +691,8 @@ public class ClusterBlueprintRendererTest {
           originalMap.put("Clusters/desired_configs", desiredConfig);
         }
 
-
         return originalMap;
       }
-
     };
 
     clusterResource.setProperty("Clusters/cluster_name", "testCluster");
@@ -694,6 +700,8 @@ public class ClusterBlueprintRendererTest {
 
     TreeNode<Resource> clusterTree = resultTree.addChild(clusterResource, 
"Cluster:1");
 
+    addStackVersions(clusterTree);
+
     // add a service group and empty services resource for basic unit testing
     TreeNode<Resource> serviceGroupsTree = clusterTree.addChild(null, 
"servicegroups");
     Resource serviceGroupResource = new 
ResourceImpl(Resource.Type.ServiceGroup);
@@ -805,6 +813,17 @@ public class ClusterBlueprintRendererTest {
     host3ComponentsTree.addChild(ttComponentResource, "HostComponent:2");
   }
 
+  private void addStackVersions(TreeNode<Resource> clusterTree) {
+    ResourceImpl clusterStackVersionResource = new 
ResourceImpl(Resource.Type.ClusterStackVersion);
+    clusterStackVersionResource.getPropertiesMap().put("ClusterStackVersions",
+      ImmutableMap.of(
+        "cluster_name", "testCluster",
+        "stack", STACK_ID.getStackName(),
+        "version", STACK_ID.getStackVersion(),
+        "mpack_uri", "http://mpacks.org/hdp-1.3.3.json";));
+    clusterTree.addChild(null, 
"stack_versions").addChild(clusterStackVersionResource, 
"ClusterStackVersion:1");
+  }
+
   private void checkMpackInstance(Map<String, Map<String, Object>> 
blueprintProperties) {
     Map<String, Object> mpackInstanceProperties =
       ((List<Map<String, 
Object>>)blueprintProperties.get("").get("mpack_instances")).get(0);
diff --git 
a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ActiveWidgetLayoutResourceProviderTest.java
 
b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ActiveWidgetLayoutResourceProviderTest.java
index cee2ef3..4f36a5e 100644
--- 
a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ActiveWidgetLayoutResourceProviderTest.java
+++ 
b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ActiveWidgetLayoutResourceProviderTest.java
@@ -86,6 +86,7 @@ import 
org.apache.ambari.server.state.scheduler.RequestExecutionFactory;
 import org.apache.ambari.server.state.stack.OsFamily;
 import org.apache.ambari.server.topology.PersistedState;
 import org.apache.ambari.server.topology.PersistedStateImpl;
+import org.apache.ambari.server.topology.StackFactory;
 import org.apache.ambari.server.topology.tasks.ConfigureClusterTaskFactory;
 import org.easymock.Capture;
 import org.easymock.EasyMockSupport;
@@ -425,6 +426,8 @@ public class ActiveWidgetLayoutResourceProviderTest extends 
EasyMockSupport {
         
bind(RegistryFactory.class).toInstance(createNiceMock(RegistryFactory.class));
         
bind(RootLevelSettingsManagerFactory.class).toInstance(createNiceMock(RootLevelSettingsManagerFactory.class));
         
bind(ClusterSettingFactory.class).toInstance(createNiceMock(ClusterSettingFactory.class));
+        
bind(StackFactory.class).toInstance(createNiceMock(StackFactory.class));
+        
bind(PersistedState.class).toInstance(createNiceMock(PersistedState.class));
       }
     });
   }
diff --git 
a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ExportBlueprintRequestTest.java
 
b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ExportBlueprintRequestTest.java
index 0ab9dfb..52dc338 100644
--- 
a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ExportBlueprintRequestTest.java
+++ 
b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ExportBlueprintRequestTest.java
@@ -98,17 +98,21 @@ public class ExportBlueprintRequestTest {
   //todo: test configuration processing
 
   @Test
+
   public void testExport_noConfigs() throws Exception {
     Resource clusterResource = new ResourceImpl(Resource.Type.Cluster);
     
clusterResource.setProperty(ClusterResourceProvider.CLUSTER_NAME_PROPERTY_ID, 
CLUSTER_NAME);
     
clusterResource.setProperty(ClusterResourceProvider.CLUSTER_ID_PROPERTY_ID, 
CLUSTER_ID);
     
clusterResource.setProperty(ClusterResourceProvider.CLUSTER_VERSION_PROPERTY_ID,
 "TEST-1.0");
 
+
     TreeNode<Resource> clusterNode = new TreeNodeImpl<>(null, clusterResource, 
"cluster");
     // add empty config child resource
     Resource configResource = new ResourceImpl(Resource.Type.Configuration);
     clusterNode.addChild(configResource, "configurations");
 
+    clusterNode.addChild(new ResourceImpl(Resource.Type.ServiceGroup), 
"servicegroups");
+
     Resource hostsResource = new ResourceImpl(Resource.Type.Host);
     Resource host1Resource = new ResourceImpl(Resource.Type.Host);
     Resource host2Resource = new ResourceImpl(Resource.Type.Host);
diff --git 
a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/UserAuthorizationResourceProviderTest.java
 
b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/UserAuthorizationResourceProviderTest.java
index 878a259..f8badad 100644
--- 
a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/UserAuthorizationResourceProviderTest.java
+++ 
b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/UserAuthorizationResourceProviderTest.java
@@ -83,8 +83,10 @@ import org.apache.ambari.server.state.UpgradeContextFactory;
 import org.apache.ambari.server.state.configgroup.ConfigGroupFactory;
 import org.apache.ambari.server.state.scheduler.RequestExecutionFactory;
 import org.apache.ambari.server.state.stack.OsFamily;
+import org.apache.ambari.server.topology.ComponentResolver;
 import org.apache.ambari.server.topology.PersistedState;
 import org.apache.ambari.server.topology.PersistedStateImpl;
+import org.apache.ambari.server.topology.StackFactory;
 import org.apache.ambari.server.topology.tasks.ConfigureClusterTaskFactory;
 import org.easymock.EasyMockSupport;
 import org.junit.After;
@@ -438,7 +440,9 @@ public class UserAuthorizationResourceProviderTest extends 
EasyMockSupport {
         
bind(RegistryFactory.class).toInstance(createNiceMock(RegistryFactory.class));
         
bind(RootLevelSettingsManagerFactory.class).toInstance(createNiceMock(RootLevelSettingsManagerFactory.class));
         
bind(ClusterSettingFactory.class).toInstance(createNiceMock(ClusterSettingFactory.class));
+        
bind(StackFactory.class).toInstance(createNiceMock(StackFactory.class));
         bind(PersistedState.class).to(PersistedStateImpl.class);
+        
bind(ComponentResolver.class).toInstance(createNiceMock(ComponentResolver.class));
       }
     });
   }
diff --git 
a/ambari-server/src/test/java/org/apache/ambari/server/topology/AmbariContextTest.java
 
b/ambari-server/src/test/java/org/apache/ambari/server/topology/AmbariContextTest.java
index db8c910..a41b330 100644
--- 
a/ambari-server/src/test/java/org/apache/ambari/server/topology/AmbariContextTest.java
+++ 
b/ambari-server/src/test/java/org/apache/ambari/server/topology/AmbariContextTest.java
@@ -414,9 +414,9 @@ public class AmbariContextTest {
 
     // test
     Stream<ResolvedComponent> components = Stream.of(
-      ResolvedComponent.builder(new Component("component1", "mpack", 
"service1", null)).buildPartial(),
-      ResolvedComponent.builder(new Component("component2", "mpack", 
"service1", null)).buildPartial(),
-      ResolvedComponent.builder(new Component("component3", "mpack", 
"service2", null)).buildPartial()
+      ResolvedComponent.builder(new Component("component1", new 
StackId("mpack", "1.0"), "service1", null)).buildPartial(),
+      ResolvedComponent.builder(new Component("component2", new 
StackId("mpack", "1.0"), "service1", null)).buildPartial(),
+      ResolvedComponent.builder(new Component("component3", new 
StackId("mpack", "1.0"), "service2", null)).buildPartial()
     );
     context.createAmbariHostResources(CLUSTER_ID, "host1", components);
 

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

Reply via email to