You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by ad...@apache.org on 2018/07/11 16:43:47 UTC
[ambari] branch branch-feature-AMBARI-14714 updated: AMBARI-24217.
Blueprint deployment with custom service name (#1692)
This is an automated email from the ASF dual-hosted git repository.
adoroszlai 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 1d24700 AMBARI-24217. Blueprint deployment with custom service name (#1692)
1d24700 is described below
commit 1d24700208c5dfe430e601b2cf47eb19a14889d7
Author: Doroszlai, Attila <64...@users.noreply.github.com>
AuthorDate: Wed Jul 11 18:43:44 2018 +0200
AMBARI-24217. Blueprint deployment with custom service name (#1692)
---
.../execution_command/execution_command.py | 14 +-
.../apache/ambari/server/actionmanager/Stage.java | 3 +-
.../ambari/server/agent/ExecutionCommand.java | 25 ++--
.../ambari/server/agent/stomp/MetadataHolder.java | 13 +-
.../ambari/server/agent/stomp/TopologyHolder.java | 50 ++-----
.../agent/stomp/dto/MetadataServiceInfo.java | 40 ++---
.../server/agent/stomp/dto/TopologyComponent.java | 16 +-
.../AmbariCustomCommandExecutionHelper.java | 4 +-
.../controller/AmbariManagementControllerImpl.java | 98 +++++-------
.../server/controller/ConfigurationRequest.java | 5 +-
.../internal/BlueprintConfigurationProcessor.java | 16 +-
.../server/metadata/ClusterMetadataGenerator.java | 23 +--
.../ambari/server/state/cluster/ClusterImpl.java | 4 +
.../ambari/server/topology/AmbariContext.java | 2 +-
.../topology/ClusterConfigurationRequest.java | 17 +--
.../ambari/server/topology/ClusterTopology.java | 6 +-
.../server/topology/ClusterTopologyImpl.java | 24 +--
.../ambari/server/topology/ResolvedComponent.java | 7 +
.../server/topology/ResolvedComponent_Builder.java | 6 +-
.../validators/ClusterConfigTypeValidator.java | 2 +-
.../topology/validators/HiveServiceValidator.java | 2 +-
.../RequiredConfigPropertiesValidator.java | 2 +-
.../server/agent/HeartbeatProcessorTest.java | 4 +-
.../ambari/server/agent/HeartbeatTestHelper.java | 4 -
.../agent/stomp/dto/MetadataClusterTest.java | 34 ++---
.../ambari/server/api/query/QueryImplTest.java | 1 -
.../StackAdvisorBlueprintProcessorTest.java | 12 +-
.../controller/AmbariManagementControllerTest.java | 165 ++++++++++-----------
.../ambari/server/topology/AmbariContextTest.java | 2 +-
.../topology/ClusterConfigurationRequestTest.java | 10 +-
.../topology/ClusterDeploymentTestCommon.java | 2 +-
.../ambari/server/topology/StackBuilder.java | 16 ++
.../server/topology/TopologyManagerTest.java | 4 +-
.../validators/ClusterConfigTypeValidatorTest.java | 6 +-
.../DependencyAndCardinalityValidatorTest.java | 17 ++-
.../validators/HiveServiceValidatorTest.java | 4 +-
.../RequiredConfigPropertiesValidatorTest.java | 2 +-
.../topology/validators/TopologyValidatorTest.java | 3 +-
38 files changed, 328 insertions(+), 337 deletions(-)
diff --git a/ambari-common/src/main/python/resource_management/libraries/execution_command/execution_command.py b/ambari-common/src/main/python/resource_management/libraries/execution_command/execution_command.py
index 72f7c21..c147615 100644
--- a/ambari-common/src/main/python/resource_management/libraries/execution_command/execution_command.py
+++ b/ambari-common/src/main/python/resource_management/libraries/execution_command/execution_command.py
@@ -79,10 +79,10 @@ class ExecutionCommand(object):
def get_module_name(self):
"""
- Retrieve service name from command.json, i.e 'zookeeper', 'hdfs'
- :return: service name
+ Retrieve service type from command.json, eg. 'zookeeper', 'hdfs'
+ :return: service type
"""
- return self.__get_value("serviceName")
+ return self.__get_value("serviceType")
def get_component_type(self):
"""
@@ -93,10 +93,12 @@ class ExecutionCommand(object):
def get_component_instance_name(self):
"""
- At this time it returns hardcoded 'default' name
- :return: 'default' string
+ Retrieve service name from command.json, eg. 'zk1'
+ :return: service name
"""
- return "default"
+ if '_CLIENTS' in self.get_module_name(): # FIXME temporary hack
+ return 'default'
+ return self.__get_value("serviceName") # multi-service, but not multi-component per service
def get_servicegroup_name(self):
"""
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/Stage.java b/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/Stage.java
index 7cdd401..5a71bfa 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/Stage.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/Stage.java
@@ -419,7 +419,7 @@ public class Stage {
*/
public synchronized void addHostRoleExecutionCommand(Host host, Role role, RoleCommand command,
ServiceComponentHostEvent event, Cluster cluster, Long mpackId, String serviceGroupName,
- String serviceName, boolean retryAllowed,
+ String serviceType, String serviceName, boolean retryAllowed,
boolean autoSkipFailure) {
boolean isHostRoleCommandAutoSkippable = autoSkipFailure && supportsAutoSkipOnFailure
@@ -431,6 +431,7 @@ public class Stage {
commandWrapper.getExecutionCommand().setMpackId(mpackId);
commandWrapper.getExecutionCommand().setServiceGroupName(serviceGroupName);
commandWrapper.getExecutionCommand().setServiceName(serviceName);
+ commandWrapper.getExecutionCommand().setServiceType(serviceType);
}
/**
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/agent/ExecutionCommand.java b/ambari-server/src/main/java/org/apache/ambari/server/agent/ExecutionCommand.java
index 1009709..922b006 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/agent/ExecutionCommand.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/agent/ExecutionCommand.java
@@ -37,6 +37,7 @@ import org.slf4j.LoggerFactory;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
import com.google.gson.annotations.SerializedName;
@@ -53,11 +54,11 @@ public class ExecutionCommand extends AgentCommand {
super(AgentCommandType.EXECUTION_COMMAND);
}
- @com.fasterxml.jackson.annotation.JsonProperty("clusterId")
+ @JsonProperty("clusterId")
private String clusterId;
@SerializedName("clusterName")
- @com.fasterxml.jackson.annotation.JsonProperty("clusterName")
+ @JsonProperty("clusterName")
private String clusterName;
@SerializedName("clusterSettings")
@@ -67,7 +68,7 @@ public class ExecutionCommand extends AgentCommand {
private Map<String, String> stackSettings;
@SerializedName("requestId")
- @com.fasterxml.jackson.annotation.JsonProperty("requestId")
+ @JsonProperty("requestId")
private long requestId;
@SerializedName("stageId")
@@ -75,11 +76,11 @@ public class ExecutionCommand extends AgentCommand {
private long stageId;
@SerializedName("taskId")
- @com.fasterxml.jackson.annotation.JsonProperty("taskId")
+ @JsonProperty("taskId")
private long taskId;
@SerializedName("commandId")
- @com.fasterxml.jackson.annotation.JsonProperty("commandId")
+ @JsonProperty("commandId")
private String commandId;
@SerializedName("hostname")
@@ -87,7 +88,7 @@ public class ExecutionCommand extends AgentCommand {
private String hostname;
@SerializedName("role")
- @com.fasterxml.jackson.annotation.JsonProperty("role")
+ @JsonProperty("role")
private String role;
@SerializedName("hostLevelParams")
@@ -95,11 +96,11 @@ public class ExecutionCommand extends AgentCommand {
private Map<String, String> hostLevelParams = new HashMap<>();
@SerializedName("roleParams")
- @com.fasterxml.jackson.annotation.JsonProperty("roleParams")
+ @JsonProperty("roleParams")
private Map<String, String> roleParams = null;
@SerializedName("roleCommand")
- @com.fasterxml.jackson.annotation.JsonProperty("roleCommand")
+ @JsonProperty("roleCommand")
private RoleCommand roleCommand;
@SerializedName("clusterHostInfo")
@@ -123,7 +124,7 @@ public class ExecutionCommand extends AgentCommand {
private boolean forceRefreshConfigTagsBeforeExecution = false;
@SerializedName("commandParams")
- @com.fasterxml.jackson.annotation.JsonProperty("commandParams")
+ @JsonProperty("commandParams")
private Map<String, String> commandParams = new HashMap<>();
/**
@@ -136,11 +137,11 @@ public class ExecutionCommand extends AgentCommand {
private String serviceGroupName;
@SerializedName("serviceName")
- @com.fasterxml.jackson.annotation.JsonProperty("serviceName")
+ @JsonProperty("serviceName")
private String serviceName;
@SerializedName("serviceType")
- @JsonIgnore
+ @JsonProperty("serviceType")
private String serviceType;
@SerializedName("componentName")
@@ -148,7 +149,7 @@ public class ExecutionCommand extends AgentCommand {
private String componentName;
@SerializedName("kerberosCommandParams")
- @com.fasterxml.jackson.annotation.JsonProperty("kerberosCommandParams")
+ @JsonProperty("kerberosCommandParams")
private List<Map<String, String>> kerberosCommandParams = new ArrayList<>();
@SerializedName("localComponents")
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/agent/stomp/MetadataHolder.java b/ambari-server/src/main/java/org/apache/ambari/server/agent/stomp/MetadataHolder.java
index 47ba8e6..cc128d8 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/agent/stomp/MetadataHolder.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/agent/stomp/MetadataHolder.java
@@ -124,9 +124,9 @@ public class MetadataHolder extends AgentClusterDataHolder<MetadataUpdateEvent>
}
@Subscribe
- public void onServiceCreate(ServiceInstalledEvent serviceInstalledEvent) throws AmbariException {
- Cluster cluster = m_clusters.get().getCluster(serviceInstalledEvent.getClusterId());
- updateData(metadataGenerator.getClusterMetadataOnServiceInstall(cluster, serviceInstalledEvent.getServiceName()));
+ public void onServiceCreate(ServiceInstalledEvent event) throws AmbariException {
+ Cluster cluster = m_clusters.get().getCluster(event.getClusterId());
+ updateData(metadataGenerator.getClusterMetadataOnServiceInstall(cluster, event.getServiceGroupName(), event.getServiceName()));
}
@Subscribe
@@ -136,10 +136,9 @@ public class MetadataHolder extends AgentClusterDataHolder<MetadataUpdateEvent>
}
@Subscribe
- public void onServiceCredentialStoreUpdate(ServiceCredentialStoreUpdateEvent serviceCredentialStoreUpdateEvent) throws AmbariException {
- Cluster cluster = m_clusters.get().getCluster(serviceCredentialStoreUpdateEvent.getClusterId());
- //TODO : [AMP] Fix it
- // updateData(ambariManagementController.getClusterMetadataOnServiceCredentialStoreUpdate(cluster, serviceCredentialStoreUpdateEvent.getServiceName()));
+ public void onServiceCredentialStoreUpdate(ServiceCredentialStoreUpdateEvent event) throws AmbariException {
+ Cluster cluster = m_clusters.get().getCluster(event.getClusterId());
+ updateData(metadataGenerator.getClusterMetadataOnServiceCredentialStoreUpdate(cluster, event.getServiceGroupName(), event.getServiceName()));
}
@Subscribe
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/agent/stomp/TopologyHolder.java b/ambari-server/src/main/java/org/apache/ambari/server/agent/stomp/TopologyHolder.java
index 1939d92..1cb3bf3 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/agent/stomp/TopologyHolder.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/agent/stomp/TopologyHolder.java
@@ -22,7 +22,6 @@ import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
-import java.util.stream.Collectors;
import org.apache.ambari.server.AmbariException;
import org.apache.ambari.server.ClusterNotFoundException;
@@ -41,11 +40,11 @@ import org.apache.ambari.server.state.Host;
import org.apache.ambari.server.state.Service;
import org.apache.ambari.server.state.ServiceComponent;
import org.apache.ambari.server.state.ServiceComponentHost;
-import org.apache.ambari.server.state.StackId;
import org.apache.commons.collections.CollectionUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import com.google.common.collect.ImmutableSet;
import com.google.common.eventbus.Subscribe;
import com.google.inject.Inject;
import com.google.inject.Singleton;
@@ -91,28 +90,15 @@ public class TopologyHolder extends AgentClusterDataHolder<TopologyUpdateEvent>
for (Service service : cl.getServices()) {
for (ServiceComponent component : service.getServiceComponents().values()) {
Map<String, ServiceComponentHost> componentsMap = component.getServiceComponentHosts();
- if (!componentsMap.isEmpty()) {
-
- //TODO will be a need to change to multi-instance usage
- ServiceComponentHost sch = componentsMap.entrySet().iterator().next().getValue();
-
- Set<String> hostNames = cl.getHosts(sch.getServiceName(), sch.getServiceComponentName());
- Set<Long> hostOrderIds = clusterHosts.stream()
- .filter(h -> hostNames.contains(h.getHostName()))
- .map(Host::getHostId)
- .collect(Collectors.toSet());
- String serviceName = sch.getServiceName();
- String componentName = sch.getServiceComponentName();
- StackId stackId = cl.getDesiredStackVersion();
-
+ for (ServiceComponentHost sch : componentsMap.values()) {
TopologyComponent topologyComponent = TopologyComponent.newBuilder()
- .setComponentName(sch.getServiceComponentName())
- .setServiceName(sch.getServiceName())
- .setHostIds(hostOrderIds)
- .setComponentLevelParams(ambariManagementController.getTopologyComponentLevelParams(cl.getClusterId(), serviceName,
- componentName, cl.getSecurityType()))
- .setCommandParams(ambariManagementController.getTopologyCommandParams(cl.getClusterId(), serviceName, componentName, sch))
- .build();
+ .setComponentName(sch.getServiceComponentName())
+ .setServiceName(sch.getServiceName())
+ .setVersion(sch.getVersion())
+ .setHostIds(ImmutableSet.of(sch.getHost().getHostId()))
+ .setComponentLevelParams(ambariManagementController.getTopologyComponentLevelParams(sch))
+ .setCommandParams(ambariManagementController.getTopologyCommandParams(sch))
+ .build();
topologyComponents.add(topologyComponent);
}
}
@@ -220,20 +206,16 @@ public class TopologyHolder extends AgentClusterDataHolder<TopologyUpdateEvent>
Map<String, ServiceComponentHost> componentsMap = component.getServiceComponentHosts();
if (!componentsMap.isEmpty()) {
- //TODO will be a need to change to multi-instance usage
- ServiceComponentHost sch = componentsMap.entrySet().iterator().next().getValue();
-
- String serviceName = sch.getServiceName();
- String componentName = sch.getServiceComponentName();
-
- TopologyComponent topologyComponent = TopologyComponent.newBuilder()
+ for (ServiceComponentHost sch : componentsMap.values()) {
+ TopologyComponent topologyComponent = TopologyComponent.newBuilder()
.setComponentName(sch.getServiceComponentName())
.setServiceName(sch.getServiceName())
- .setCommandParams(ambariManagementController.getTopologyCommandParams(cl.getClusterId(), serviceName, componentName, sch))
- .setComponentLevelParams(ambariManagementController.getTopologyComponentLevelParams(clusterId,
- serviceName, componentName, cl.getSecurityType()))
+ .setVersion(sch.getVersion())
+ .setCommandParams(ambariManagementController.getTopologyCommandParams(sch))
+ .setComponentLevelParams(ambariManagementController.getTopologyComponentLevelParams(sch))
.build();
- topologyComponents.add(topologyComponent);
+ topologyComponents.add(topologyComponent);
+ }
}
}
}
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/agent/stomp/dto/MetadataServiceInfo.java b/ambari-server/src/main/java/org/apache/ambari/server/agent/stomp/dto/MetadataServiceInfo.java
index d0d8374..4733908 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/agent/stomp/dto/MetadataServiceInfo.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/agent/stomp/dto/MetadataServiceInfo.java
@@ -1,4 +1,4 @@
-/**
+/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
@@ -19,11 +19,13 @@
package org.apache.ambari.server.agent.stomp.dto;
import java.util.Map;
+import java.util.Objects;
import com.fasterxml.jackson.annotation.JsonProperty;
public class MetadataServiceInfo {
+ private String serviceType;
private String version;
private Boolean credentialStoreEnabled;
@@ -36,9 +38,10 @@ public class MetadataServiceInfo {
@JsonProperty("service_package_folder")
private String servicePackageFolder;
- public MetadataServiceInfo(String version, Boolean credentialStoreEnabled,
+ public MetadataServiceInfo(String serviceType, String version, Boolean credentialStoreEnabled,
Map<String, Map<String, String>> credentialStoreEnabledProperties,
Long statusCommandsTimeout, String servicePackageFolder) {
+ this.serviceType = serviceType;
this.version = version;
this.credentialStoreEnabled = credentialStoreEnabled;
this.credentialStoreEnabledProperties = credentialStoreEnabledProperties;
@@ -46,6 +49,10 @@ public class MetadataServiceInfo {
this.servicePackageFolder = servicePackageFolder;
}
+ public String getServiceType() {
+ return serviceType;
+ }
+
public String getVersion() {
return version;
}
@@ -88,28 +95,25 @@ public class MetadataServiceInfo {
@Override
public boolean equals(Object o) {
- if (this == o) return true;
- if (o == null || getClass() != o.getClass()) return false;
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
MetadataServiceInfo that = (MetadataServiceInfo) o;
- if (version != null ? !version.equals(that.version) : that.version != null) return false;
- if (credentialStoreEnabled != null ? !credentialStoreEnabled.equals(that.credentialStoreEnabled) : that.credentialStoreEnabled != null)
- return false;
- if (credentialStoreEnabledProperties != null ? !credentialStoreEnabledProperties.equals(that.credentialStoreEnabledProperties) : that.credentialStoreEnabledProperties != null)
- return false;
- if (statusCommandsTimeout != null ? !statusCommandsTimeout.equals(that.statusCommandsTimeout) : that.statusCommandsTimeout != null)
- return false;
- return servicePackageFolder != null ? servicePackageFolder.equals(that.servicePackageFolder) : that.servicePackageFolder == null;
+ return Objects.equals(serviceType, that.serviceType) &&
+ Objects.equals(version, that.version) &&
+ Objects.equals(credentialStoreEnabled, that.credentialStoreEnabled) &&
+ Objects.equals(credentialStoreEnabledProperties, that.credentialStoreEnabledProperties) &&
+ Objects.equals(statusCommandsTimeout, that.statusCommandsTimeout) &&
+ Objects.equals(servicePackageFolder, that.servicePackageFolder);
}
@Override
public int hashCode() {
- int result = version != null ? version.hashCode() : 0;
- result = 31 * result + (credentialStoreEnabled != null ? credentialStoreEnabled.hashCode() : 0);
- result = 31 * result + (credentialStoreEnabledProperties != null ? credentialStoreEnabledProperties.hashCode() : 0);
- result = 31 * result + (statusCommandsTimeout != null ? statusCommandsTimeout.hashCode() : 0);
- result = 31 * result + (servicePackageFolder != null ? servicePackageFolder.hashCode() : 0);
- return result;
+ return Objects.hash(serviceType, version, credentialStoreEnabled, credentialStoreEnabledProperties, statusCommandsTimeout, servicePackageFolder);
}
}
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/agent/stomp/dto/TopologyComponent.java b/ambari-server/src/main/java/org/apache/ambari/server/agent/stomp/dto/TopologyComponent.java
index ef0871f..b3da819 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/agent/stomp/dto/TopologyComponent.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/agent/stomp/dto/TopologyComponent.java
@@ -34,7 +34,7 @@ import com.fasterxml.jackson.annotation.JsonInclude;
public class TopologyComponent {
private String componentName;
private String serviceName;
- private String displayName;
+ private String serviceType;
private String version;
private Set<Long> hostIds = new HashSet<>();
private Set<String> hostNames = new HashSet<>();
@@ -65,8 +65,8 @@ public class TopologyComponent {
return this;
}
- public Builder setDisplayName(String displayName) {
- TopologyComponent.this.setDisplayName(displayName);
+ public Builder setServiceType(String serviceType) {
+ TopologyComponent.this.setServiceType(serviceType);
return this;
}
@@ -185,7 +185,7 @@ public class TopologyComponent {
public TopologyComponent deepCopy() {
return TopologyComponent.newBuilder().setComponentName(getComponentName())
- .setDisplayName(getDisplayName())
+ .setServiceType(getServiceType())
.setServiceName(getServiceName())
.setComponentLevelParams(getComponentLevelParams() == null ? null : new TreeMap<>(getComponentLevelParams()))
.setHostIds(getHostIds() == null ? null : new HashSet<>(getHostIds()))
@@ -251,12 +251,12 @@ public class TopologyComponent {
this.hostNames = hostNames;
}
- public String getDisplayName() {
- return displayName;
+ public String getServiceType() {
+ return serviceType;
}
- public void setDisplayName(String displayName) {
- this.displayName = displayName;
+ public void setServiceType(String serviceType) {
+ this.serviceType = serviceType;
}
public Set<String> getPublicHostNames() {
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariCustomCommandExecutionHelper.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariCustomCommandExecutionHelper.java
index cb1d8ef..c882173 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariCustomCommandExecutionHelper.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariCustomCommandExecutionHelper.java
@@ -352,7 +352,7 @@ public class AmbariCustomCommandExecutionHelper {
stage.addHostRoleExecutionCommand(host, Role.valueOf(componentName),
RoleCommand.CUSTOM_COMMAND,
new ServiceComponentHostOpInProgressEvent(componentName, hostName, nowTimestamp),
- cluster, serviceGroup.getMpackId(), serviceGroupName, serviceName, retryAllowed,
+ cluster, serviceGroup.getMpackId(), serviceGroupName, serviceInfo.getName(), serviceName, retryAllowed,
autoSkipFailure);
Map<String, Map<String, String>> configurations =
@@ -855,7 +855,7 @@ public class AmbariCustomCommandExecutionHelper {
stage.addHostRoleExecutionCommand(host, Role.valueOf(smokeTestRole),
RoleCommand.SERVICE_CHECK,
new ServiceComponentHostOpInProgressEvent(componentName, hostname, nowTimestamp),
- cluster, serviceGroup.getMpackId(), serviceGroupName, serviceName, retryAllowed,
+ cluster, serviceGroup.getMpackId(), serviceGroupName, serviceInfo.getName(), serviceName, retryAllowed,
autoSkipFailure);
HostRoleCommand hrc = stage.getHostRoleCommand(hostname, smokeTestRole);
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 dfdfd74..c3773cc 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
@@ -827,15 +827,14 @@ public class AmbariManagementControllerImpl implements AmbariManagementControlle
TopologyComponent newComponent = TopologyComponent.newBuilder()
.setComponentName(sch.getServiceComponentName())
- .setServiceName(sch.getServiceType())
- .setDisplayName(sc.getServiceName())
+ .setServiceName(sc.getServiceName())
+ .setServiceType(sc.getServiceType())
.setVersion(sch.getVersion())
.setHostIds(hostIds)
.setHostNames(hostNames)
.setPublicHostNames(publicHostNames)
- .setComponentLevelParams(getTopologyComponentLevelParams(cluster.getClusterId(), serviceName, componentName,
- cluster.getSecurityType()))
- .setCommandParams(getTopologyCommandParams(cluster.getClusterId(), serviceName, componentName, sch))
+ .setComponentLevelParams(getTopologyComponentLevelParams(sch))
+ .setCommandParams(getTopologyCommandParams(sch))
.build();
String clusterId = Long.toString(cluster.getClusterId());
@@ -977,7 +976,9 @@ public class AmbariManagementControllerImpl implements AmbariManagementControlle
// If the config type is for a service, then allow a user with SERVICE_MODIFY_CONFIGS to
// update, else ensure the user has CLUSTER_MODIFY_CONFIGS
- Service service = cluster.getServiceByConfigType(configType);
+ Service service = request.getServiceId() != null
+ ? cluster.getService(request.getServiceId())
+ : cluster.getServiceByConfigType(configType);
// Get the changes so that the user's intention can be determined. For example, maybe
@@ -1044,10 +1045,7 @@ public class AmbariManagementControllerImpl implements AmbariManagementControlle
}
}
-
-
- Map<String, Config> configs = cluster.getConfigsByType(
- request.getType());
+ Map<String, Config> configs = cluster.getConfigsByServiceIdType(request.getType(), request.getServiceId());
if (null == configs) {
configs = new HashMap<>();
}
@@ -1093,7 +1091,7 @@ public class AmbariManagementControllerImpl implements AmbariManagementControlle
}
Config config = createConfig(cluster, stackId, request.getType(), requestProperties,
- request.getVersionTag(), propertiesAttributes, request.getServiceId() == null? null : request.getServiceId());
+ request.getVersionTag(), propertiesAttributes, request.getServiceId());
LOG.info(MessageFormat.format("Creating configuration with tag ''{0}'' to cluster ''{1}'' for configuration type {2}",
request.getVersionTag(),
@@ -1602,39 +1600,18 @@ public class AmbariManagementControllerImpl implements AmbariManagementControlle
Map<String, Config> configs = null;
//Get by type
if (null != request.getType()) {
- //TODO : Remove after getting rid of cluster configurations
- if (request.getServiceId() != null) {
- configs = cluster.getConfigsByServiceIdType(
- request.getType(), request.getServiceId());
- if (null != configs) {
- for (Entry<String, Config> entry : configs.entrySet()) {
- Config config = entry.getValue();
- response = new ConfigurationResponse(
- cluster.getClusterName(), config.getStackId(),
- request.getType(),
- config.getTag(), entry.getValue().getVersion(),
- includeProps ? config.getProperties() : new HashMap<>(),
- includeProps ? config.getPropertiesAttributes() : new HashMap<>(),
- config.getPropertiesTypes(), request.getServiceId(), request.getServiceGroupId());
- responses.add(response);
- }
- }
- }
- if (responses == null || responses.isEmpty()) {
- configs = cluster.getConfigsByType(
- request.getType());
- if (null != configs) {
- for (Entry<String, Config> entry : configs.entrySet()) {
- Config config = entry.getValue();
- response = new ConfigurationResponse(
- cluster.getClusterName(), config.getStackId(),
- request.getType(),
- config.getTag(), entry.getValue().getVersion(),
- includeProps ? config.getProperties() : new HashMap<>(),
- includeProps ? config.getPropertiesAttributes() : new HashMap<>(),
- config.getPropertiesTypes());
- responses.add(response);
- }
+ configs = cluster.getConfigsByServiceIdType(request.getType(), request.getServiceId());
+ if (null != configs) {
+ for (Entry<String, Config> entry : configs.entrySet()) {
+ Config config = entry.getValue();
+ response = new ConfigurationResponse(
+ cluster.getClusterName(), config.getStackId(),
+ request.getType(),
+ config.getTag(), entry.getValue().getVersion(),
+ includeProps ? config.getProperties() : new HashMap<>(),
+ includeProps ? config.getPropertiesAttributes() : new HashMap<>(),
+ config.getPropertiesTypes(), request.getServiceId(), request.getServiceGroupId());
+ responses.add(response);
}
}
} else {
@@ -1871,7 +1848,7 @@ public class AmbariManagementControllerImpl implements AmbariManagementControlle
if (null != cr.getProperties()) {
// !!! empty property sets are supported, and need to be able to use
// previously-defined configs (revert)
- Map<String, Config> all = cluster.getConfigsByType(configType);
+ Map<String, Config> all = cluster.getConfigsByServiceIdType(configType, cr.getServiceId());
if (null == all || // none set
!all.containsKey(cr.getVersionTag()) || // tag not set
cr.getProperties().size() > 0) { // properties to set
@@ -2523,7 +2500,7 @@ public class AmbariManagementControllerImpl implements AmbariManagementControlle
stage.addHostRoleExecutionCommand(scHost.getHost(),
Role.valueOf(scHost.getServiceComponentName()), roleCommand, event, cluster, mpackId,
- serviceGroupName, serviceName, false, skipFailure);
+ serviceGroupName, scHost.getServiceType(), serviceName, false, skipFailure);
String componentName = scHost.getServiceComponentName();
String hostname = scHost.getHostName();
@@ -5510,7 +5487,7 @@ public class AmbariManagementControllerImpl implements AmbariManagementControlle
if (null != cr.getProperties()) {
// !!! empty property sets are supported, and need to be able to use
// previously-defined configs (revert)
- Map<String, Config> all = cluster.getConfigsByType(configType);
+ Map<String, Config> all = cluster.getConfigsByServiceIdType(configType, cr.getServiceId());
if (null == all || // none set
!all.containsKey(cr.getVersionTag()) || // tag not set
cr.getProperties().size() > 0) { // properties to set
@@ -5618,16 +5595,15 @@ public class AmbariManagementControllerImpl implements AmbariManagementControlle
}
//TODO will be a need to change to multi-instance usage
- public TreeMap<String, String> getTopologyComponentLevelParams(Long clusterId, String serviceName, String componentName,
- SecurityType clusterSecurityType) throws AmbariException {
+ public TreeMap<String, String> getTopologyComponentLevelParams(ServiceComponentHost sch) throws AmbariException {
TreeMap<String, String> statusCommandParams = new TreeMap<>();
- Cluster cluster = clusters.getCluster(clusterId);
- Service service = cluster.getService(serviceName);
+ Cluster cluster = clusters.getCluster(sch.getClusterId());
+ Service service = cluster.getService(sch.getServiceId());
StackId stackId = service.getStackId();
ComponentInfo componentInfo = ambariMetaInfo.getComponent(stackId.getStackName(),
- stackId.getStackVersion(), serviceName, componentName);
+ stackId.getStackVersion(), sch.getServiceType(), sch.getServiceComponentName());
statusCommandParams.put(ExecutionCommand.KeyNames.CLIENTS_TO_UPDATE_CONFIGS,
getClientsToUpdateConfigs(componentInfo));
@@ -5641,22 +5617,20 @@ public class AmbariManagementControllerImpl implements AmbariManagementControlle
//
// Set/update the unlimited_key_jce_required value as needed
statusCommandParams.put(ExecutionCommand.KeyNames.UNLIMITED_KEY_JCE_REQUIRED,
- Boolean.toString(getUnlimitedKeyJCERequirement(componentInfo, clusterSecurityType)));
+ Boolean.toString(getUnlimitedKeyJCERequirement(componentInfo, cluster.getSecurityType())));
return statusCommandParams;
}
//TODO will be a need to change to multi-instance usage
- public TreeMap<String, String> getTopologyCommandParams(Long clusterId, String serviceName, String componentName, ServiceComponentHost sch) throws AmbariException {
+ public TreeMap<String, String> getTopologyCommandParams(ServiceComponentHost sch) throws AmbariException {
TreeMap<String, String> commandParams = new TreeMap<>();
- Cluster cluster = clusters.getCluster(clusterId);
- Service service = cluster.getService(serviceName);
+ Cluster cluster = clusters.getCluster(sch.getClusterId());
+ Service service = cluster.getService(sch.getServiceId());
StackId stackId = service.getStackId();
- ServiceInfo serviceInfo = ambariMetaInfo.getService(stackId.getStackName(),
- stackId.getStackVersion(), serviceName);
- ComponentInfo componentInfo = ambariMetaInfo.getComponent(stackId.getStackName(),
- stackId.getStackVersion(), serviceName, componentName);
+ ServiceInfo serviceInfo = ambariMetaInfo.getService(stackId.getStackName(), stackId.getStackVersion(), sch.getServiceType());
+ ComponentInfo componentInfo = ambariMetaInfo.getComponent(stackId.getStackName(), stackId.getStackVersion(), sch.getServiceType(), sch.getServiceComponentName());
commandParams.put(SERVICE_PACKAGE_FOLDER, serviceInfo.getServicePackageFolder());
String scriptName = null;
@@ -5669,9 +5643,7 @@ public class AmbariManagementControllerImpl implements AmbariManagementControlle
scriptCommandTimeout = String.valueOf(script.getTimeout());
}
} else {
- String message = String.format(
- "Component %s of service %s has not " + "command script defined", componentName,
- serviceName);
+ String message = String.format("Component %s of service %s has no command script defined", componentInfo.getName(), serviceInfo.getName());
throw new AmbariException(message);
}
}
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/ConfigurationRequest.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/ConfigurationRequest.java
index e5b390f..81d1a02 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/ConfigurationRequest.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/ConfigurationRequest.java
@@ -58,11 +58,10 @@ public class ConfigurationRequest {
this.configs = configs;
this.type = type;
this.tag = tag;
- this.configs = configs;
this.configsAttributes = configsAttributes;
this.includeProperties = (type != null && tag != null);
- this.serviceId = serviceId == null ? null : serviceId;
- this.serviceGroupId = serviceGroupId == null ? null : serviceGroupId;
+ this.serviceId = serviceId;
+ this.serviceGroupId = serviceGroupId;
}
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/BlueprintConfigurationProcessor.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/BlueprintConfigurationProcessor.java
index ba7a043..50ae6fd 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/BlueprintConfigurationProcessor.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/BlueprintConfigurationProcessor.java
@@ -958,7 +958,7 @@ public class BlueprintConfigurationProcessor {
* @param advisedConfigurations advised configuration instance
*/
private void doFilterStackDefaults(Map<String, AdvisedConfiguration> advisedConfigurations) {
- Configuration stackDefaults = clusterTopology.getStack().getConfiguration(clusterTopology.getServices());
+ Configuration stackDefaults = clusterTopology.getStack().getConfiguration(clusterTopology.getServiceTypes());
Map<String, Map<String, String>> stackDefaultProps = stackDefaults.getProperties();
for (Map.Entry<String, AdvisedConfiguration> adConfEntry : advisedConfigurations.entrySet()) {
AdvisedConfiguration advisedConfiguration = adConfEntry.getValue();
@@ -2988,7 +2988,7 @@ public class BlueprintConfigurationProcessor {
}
}
- boolean isAtlasInCluster = topology.getServices().contains("ATLAS");
+ boolean isAtlasInCluster = topology.getServiceTypes().contains("ATLAS");
boolean isAtlasHiveHookEnabled = Boolean.parseBoolean(properties.get("hive-env").get("hive.atlas.hook"));
// Append atlas hook if not already present.
@@ -3019,7 +3019,7 @@ public class BlueprintConfigurationProcessor {
Map<String, Map<String, String>> properties,
ClusterTopology topology) {
- if (topology.getServices().contains("ATLAS")) {
+ if (topology.getServiceTypes().contains("ATLAS")) {
// if original value is not set or is the default "primary" set the cluster id
if (origValue == null || origValue.trim().isEmpty() || origValue.equals("primary")) {
//use cluster id because cluster name may change
@@ -3054,7 +3054,7 @@ public class BlueprintConfigurationProcessor {
String origValue,
Map<String, Map<String, String>> properties,
ClusterTopology topology) {
- if (topology.getServices().contains("ATLAS")) {
+ if (topology.getServiceTypes().contains("ATLAS")) {
String host = topology.getHostAssignmentsForComponent("ATLAS_SERVER").iterator().next();
boolean tlsEnabled = Boolean.parseBoolean(properties.get("application-properties").get("atlas.enableTLS"));
@@ -3111,7 +3111,7 @@ public class BlueprintConfigurationProcessor {
Map<String, Map<String, String>> properties,
ClusterTopology topology) {
- if (topology.getServices().contains("AMBARI_METRICS")) {
+ if (topology.getServiceTypes().contains("AMBARI_METRICS")) {
final String amsReporterClass = "org.apache.hadoop.metrics2.sink.storm.StormTimelineMetricsReporter";
if (origValue == null || origValue.isEmpty()) {
return amsReporterClass;
@@ -3142,7 +3142,7 @@ public class BlueprintConfigurationProcessor {
Map<String, Map<String, String>> properties,
ClusterTopology topology) {
- if (topology.getServices().contains("AMBARI_METRICS")) {
+ if (topology.getServiceTypes().contains("AMBARI_METRICS")) {
final String amsReportesClass = "org.apache.hadoop.metrics2.sink.kafka.KafkaTimelineMetricsReporter";
if (origValue == null || origValue.isEmpty()) {
return amsReportesClass;
@@ -3234,7 +3234,7 @@ public class BlueprintConfigurationProcessor {
// AMBARI-5206
final Map<String , String> userProps = new HashMap<>();
- Collection<String> services = clusterTopology.getServices();
+ Collection<String> services = clusterTopology.getServiceTypes();
if (services.contains("HDFS")) {
// only add user properties to the map for
// services actually included in the blueprint definition
@@ -3288,7 +3288,7 @@ public class BlueprintConfigurationProcessor {
* @param stack
*/
private void addExcludedConfigProperties(Configuration configuration, Set<String> configTypesUpdated, StackDefinition stack) {
- Collection<String> blueprintServices = clusterTopology.getServices();
+ Collection<String> blueprintServices = clusterTopology.getServiceTypes();
LOG.debug("Handling excluded properties for blueprint services: {}", blueprintServices);
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/metadata/ClusterMetadataGenerator.java b/ambari-server/src/main/java/org/apache/ambari/server/metadata/ClusterMetadataGenerator.java
index d3acb35..52043f6 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/metadata/ClusterMetadataGenerator.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/metadata/ClusterMetadataGenerator.java
@@ -176,13 +176,14 @@ public class ClusterMetadataGenerator {
return new MetadataUpdateEvent(metadataClusters, null, getMetadataAgentConfigs(), UpdateEventType.UPDATE);
}
- public MetadataUpdateEvent getClusterMetadataOnServiceInstall(Cluster cl, String serviceName) throws AmbariException {
- return getClusterMetadataOnServiceCredentialStoreUpdate(cl, serviceName);
+ public MetadataUpdateEvent getClusterMetadataOnServiceInstall(Cluster cl, String serviceGroupName, String serviceName) throws AmbariException {
+ return getClusterMetadataOnServiceCredentialStoreUpdate(cl, serviceGroupName, serviceName);
}
- public MetadataUpdateEvent getClusterMetadataOnServiceCredentialStoreUpdate(Cluster cl, String serviceName) throws AmbariException {
+ public MetadataUpdateEvent getClusterMetadataOnServiceCredentialStoreUpdate(Cluster cl, String serviceGroupName, String serviceName) throws AmbariException {
final SortedMap<String, MetadataCluster> metadataClusters = new TreeMap<>();
- metadataClusters.put(Long.toString(cl.getClusterId()), MetadataCluster.serviceLevelParamsMetadataCluster(null, getMetadataServiceLevelParams(cl), false));
+ Service service = cl.getService(serviceGroupName, serviceName);
+ metadataClusters.put(Long.toString(cl.getClusterId()), MetadataCluster.serviceLevelParamsMetadataCluster(null, getMetadataServiceLevelParams(service), false));
return new MetadataUpdateEvent(metadataClusters, null, getMetadataAgentConfigs(), UpdateEventType.UPDATE);
}
@@ -205,18 +206,18 @@ public class ClusterMetadataGenerator {
SortedMap<String, MetadataServiceInfo> serviceLevelParams = new TreeMap<>();
StackId serviceStackId = service.getStackId();
- ServiceInfo serviceInfo = ambariMetaInfo.getService(serviceStackId.getStackName(),
- serviceStackId.getStackVersion(), service.getName());
+
+ ServiceInfo serviceInfo = ambariMetaInfo.getService(serviceStackId.getStackName(), serviceStackId.getStackVersion(), service.getServiceType());
Long statusCommandTimeout = null;
if (serviceInfo.getCommandScript() != null) {
statusCommandTimeout = new Long(getStatusCommandTimeout(serviceInfo));
}
-
- String servicePackageFolder = serviceInfo.getServicePackageFolder();
Map<String, Map<String, String>> configCredentials = configHelper.getCredentialStoreEnabledProperties(serviceStackId, service);
-
- serviceLevelParams.put(serviceInfo.getName(), new MetadataServiceInfo(serviceInfo.getVersion(),
- service.isCredentialStoreEnabled(), configCredentials, statusCommandTimeout, servicePackageFolder));
+ serviceLevelParams.put(service.getName(), new MetadataServiceInfo(
+ serviceInfo.getName(), serviceInfo.getVersion(),
+ serviceInfo.isCredentialStoreEnabled(), configCredentials, statusCommandTimeout,
+ serviceInfo.getServicePackageFolder()
+ ));
return serviceLevelParams;
}
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/cluster/ClusterImpl.java b/ambari-server/src/main/java/org/apache/ambari/server/state/cluster/ClusterImpl.java
index 048ab3a..5949ae9 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/state/cluster/ClusterImpl.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/cluster/ClusterImpl.java
@@ -1534,6 +1534,10 @@ public class ClusterImpl implements Cluster {
@Override
public Map<String, Config> getConfigsByServiceIdType(String configType, Long serviceId) {
+ if (serviceId == null) {
+ return getConfigsByType(configType);
+ }
+
clusterGlobalLock.readLock().lock();
try {
if (!serviceConfigs.containsKey(serviceId)) {
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/topology/AmbariContext.java b/ambari-server/src/main/java/org/apache/ambari/server/topology/AmbariContext.java
index ad1535d..5d18b6b 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/topology/AmbariContext.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/topology/AmbariContext.java
@@ -706,7 +706,7 @@ public class AmbariContext {
for (Map.Entry<String, Map<String, String>> entry : userProvidedGroupProperties.entrySet()) {
String type = entry.getKey();
String service = stack.getServicesForConfigType(type)
- .filter(each -> topology.getServices().contains(each))
+ .filter(each -> topology.getServiceTypes().contains(each))
.findFirst()
// TODO check if this is required at all (might be handled by the "orphan" removal)
// TODO move this validation earlier
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/topology/ClusterConfigurationRequest.java b/ambari-server/src/main/java/org/apache/ambari/server/topology/ClusterConfigurationRequest.java
index 0eb2cb7..48b55aa 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/topology/ClusterConfigurationRequest.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/topology/ClusterConfigurationRequest.java
@@ -172,9 +172,8 @@ public class ClusterConfigurationRequest {
Set<String> updatedConfigTypes = new HashSet<>();
Cluster cluster = getCluster();
- Blueprint blueprint = clusterTopology.getBlueprint();
- Configuration stackDefaults = clusterTopology.getStack().getConfiguration(clusterTopology.getServices());
+ Configuration stackDefaults = clusterTopology.getStack().getConfiguration(clusterTopology.getServiceTypes());
Map<String, Map<String, String>> stackDefaultProps = stackDefaults.getProperties();
// add clusterHostInfo containing components to hosts map, based on Topology, to use this one instead of
@@ -186,7 +185,7 @@ public class ClusterConfigurationRequest {
// generate principals & keytabs for headless identities
ambariContext.getController().getKerberosHelper()
.ensureHeadlessIdentities(cluster, existingConfigurations,
- new HashSet<>(clusterTopology.getServices()));
+ new HashSet<>(clusterTopology.getServiceTypes()));
// apply Kerberos specific configurations
Map<String, Map<String, String>> updatedConfigs = ambariContext.getController().getKerberosHelper()
@@ -344,10 +343,6 @@ public class ClusterConfigurationRequest {
* @param tag config tag
*/
private void setConfigurationsOnCluster(ClusterTopology clusterTopology, String tag, Set<String> updatedConfigTypes) throws AmbariException {
- // TODO: This version works with Ambari 3.0 where it is assumed that any service with a configuration can be identified
- // by its name. Even though the cluster is multi-stack (multi-mpack), service names should not conflict across mpacks,
- // except client services which have no configuration. In 3.1, mpack may have conflicting service names
- //todo: also handle setting of host group scoped configuration which is updated by config processor
List<Pair<String, ClusterRequest>> serviceNamesAndConfigurationRequests = new ArrayList<>();
Configuration clusterConfiguration = clusterTopology.getConfiguration();
@@ -367,10 +362,12 @@ public class ClusterConfigurationRequest {
Set<String> configTypes =
Sets.difference(
- Sets.intersection(stack.getAllConfigurationTypes(service.getServiceName()), clusterConfigTypes),
- Sets.union(stack.getExcludedConfigurationTypes(service.getServiceName()), globalConfigTypes)
+ Sets.intersection(stack.getAllConfigurationTypes(service.getServiceType()), clusterConfigTypes),
+ Sets.union(stack.getExcludedConfigurationTypes(service.getServiceType()), globalConfigTypes)
);
+ LOG.info("Creating config request for service {}, types {}", service.getServiceName(), configTypes);
+
for (String serviceConfigType: configTypes) {
Map<String, String> properties = clusterProperties.get(serviceConfigType);
Map<String, Map<String, String>> attributes = clusterAttributes.get(serviceConfigType);
@@ -446,7 +443,7 @@ public class ClusterConfigurationRequest {
}
// iterate over services to deploy
for (Pair<String, ClusterRequest> serviceNameAndRequest: serviceNamesAndRequests) {
- LOG.info("Sending cluster config update request for service = " + serviceNameAndRequest.getLeft());
+ LOG.info("Sending cluster config update request for service {}", serviceNameAndRequest.getLeft());
ambariContext.setConfigurationOnCluster(serviceNameAndRequest.getRight());
}
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/topology/ClusterTopology.java b/ambari-server/src/main/java/org/apache/ambari/server/topology/ClusterTopology.java
index 5791f40..9d622d7 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/topology/ClusterTopology.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/topology/ClusterTopology.java
@@ -135,11 +135,11 @@ public interface ClusterTopology {
Collection<String> getHostAssignmentsForComponent(String component);
/**
- * Get all of the services represented in the blueprint.
+ * Get all of the service types represented in the blueprint.
*
- * @return collection of all represented service names
+ * @return collection of all represented service types
*/
- Collection<String> getServices();
+ Collection<String> getServiceTypes();
/**
* Get all of the components represented in the blueprint.
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/topology/ClusterTopologyImpl.java b/ambari-server/src/main/java/org/apache/ambari/server/topology/ClusterTopologyImpl.java
index 35f359f..672ffd3 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/topology/ClusterTopologyImpl.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/topology/ClusterTopologyImpl.java
@@ -171,7 +171,7 @@ public class ClusterTopologyImpl implements ClusterTopology {
stackIds = request.getStackIds();
stack = request.getStack();
setting = request.getSetting();
- blueprint.getConfiguration().setParentConfiguration(stack.getConfiguration(getServices()));
+ blueprint.getConfiguration().setParentConfiguration(stack.getConfiguration(getServiceTypes()));
checkForDuplicateHosts(request.getHostGroupInfo());
registerHostGroupInfo(request.getHostGroupInfo());
@@ -265,11 +265,7 @@ public class ClusterTopologyImpl implements ClusterTopology {
@Override
public Set<String> getHostGroupsForComponent(ResolvedComponent component) {
- return resolvedComponents.entrySet().stream()
- .filter(e -> e.getValue().stream()
- .anyMatch(each -> Objects.equals(each, component)))
- .map(Map.Entry::getKey)
- .collect(toSet());
+ return getHostGroupsForComponent(resolvedComponents, component);
}
@Override
@@ -329,9 +325,9 @@ public class ClusterTopologyImpl implements ClusterTopology {
}
@Override
- public Collection<String> getServices() {
+ public Collection<String> getServiceTypes() {
return getComponents()
- .map(ResolvedComponent::effectiveServiceName)
+ .map(ResolvedComponent::serviceType)
.collect(toSet());
}
@@ -359,7 +355,7 @@ public class ClusterTopologyImpl implements ClusterTopology {
}
try {
String service = getStack().getServiceForConfigType(configType);
- return getServices().contains(service);
+ return getServiceTypes().contains(service);
} catch (IllegalArgumentException e) {
return false;
}
@@ -574,4 +570,14 @@ public class ClusterTopologyImpl implements ClusterTopology {
" Be aware that host names are converted to lowercase, case differences are ignored in Ambari deployments.");
}
}
+
+ // exposed for test
+ public static Set<String> getHostGroupsForComponent(Map<String, Set<ResolvedComponent>> hostGroups, ResolvedComponent component) {
+ return hostGroups.entrySet().stream()
+ .filter(e -> e.getValue().stream()
+ .map(ResolvedComponent::clearInstanceNames)
+ .anyMatch(each -> Objects.equals(each, component)))
+ .map(Map.Entry::getKey)
+ .collect(toSet());
+ }
}
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 f2910a8..6e1f88f 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
@@ -65,6 +65,13 @@ public interface ResolvedComponent {
return serviceName().orElseGet(this::serviceType);
}
+ static ResolvedComponent clearInstanceNames(ResolvedComponent component) {
+ return component.toBuilder()
+ .clearServiceGroupName()
+ .clearServiceName()
+ .build();
+ }
+
/**
* Starts building a {@code ResolvedComponent} for the given component.
*/
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/topology/ResolvedComponent_Builder.java b/ambari-server/src/main/java/org/apache/ambari/server/topology/ResolvedComponent_Builder.java
index fe0b4ae..1cd8a8b 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/topology/ResolvedComponent_Builder.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/topology/ResolvedComponent_Builder.java
@@ -576,6 +576,8 @@ abstract class ResolvedComponent_Builder implements ResolvedComponent {
return Objects.equals(stackId, other.stackId)
&& Objects.equals(componentName, other.componentName)
&& Objects.equals(serviceInfo, other.serviceInfo)
+ && Objects.equals(serviceGroupName, other.serviceGroupName)
+ && Objects.equals(serviceName, other.serviceName)
;
}
@@ -584,7 +586,9 @@ abstract class ResolvedComponent_Builder implements ResolvedComponent {
return Objects.hash(
stackId,
componentName,
- serviceInfo
+ serviceInfo,
+ serviceGroupName,
+ serviceName
);
}
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/topology/validators/ClusterConfigTypeValidator.java b/ambari-server/src/main/java/org/apache/ambari/server/topology/validators/ClusterConfigTypeValidator.java
index d03fa3d..97d5fb3 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/topology/validators/ClusterConfigTypeValidator.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/topology/validators/ClusterConfigTypeValidator.java
@@ -43,7 +43,7 @@ public class ClusterConfigTypeValidator implements TopologyValidator {
// collecting all config types for services in the blueprint (from the related stack)
Set<String> stackServiceConfigTypes = new HashSet<>();
- for (String serviceName : topology.getServices()) {
+ for (String serviceName : topology.getServiceTypes()) {
stackServiceConfigTypes.addAll(topology.getStack().getConfigurationTypes(serviceName));
}
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/topology/validators/HiveServiceValidator.java b/ambari-server/src/main/java/org/apache/ambari/server/topology/validators/HiveServiceValidator.java
index 685e354..baefd53 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/topology/validators/HiveServiceValidator.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/topology/validators/HiveServiceValidator.java
@@ -36,7 +36,7 @@ public class HiveServiceValidator implements TopologyValidator {
@Override
public ClusterTopology validate(ClusterTopology topology) throws InvalidTopologyException {
// there is no hive configured in the blueprint, nothing to do (does the validator apply?)
- if (!topology.getServices().contains(HIVE_SERVICE)) {
+ if (!topology.getServiceTypes().contains(HIVE_SERVICE)) {
LOGGER.info(" [{}] service is not listed in the blueprint, skipping hive service validation.", HIVE_SERVICE);
return topology;
}
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/topology/validators/RequiredConfigPropertiesValidator.java b/ambari-server/src/main/java/org/apache/ambari/server/topology/validators/RequiredConfigPropertiesValidator.java
index e1f68a2..e3ef20b 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/topology/validators/RequiredConfigPropertiesValidator.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/topology/validators/RequiredConfigPropertiesValidator.java
@@ -118,7 +118,7 @@ public class RequiredConfigPropertiesValidator implements TopologyValidator {
Map<String, Map<String, Collection<String>>> requiredPropertiesForServiceByType = new HashMap<>();
- for (String bpService : topology.getServices()) {
+ for (String bpService : topology.getServiceTypes()) {
LOGGER.debug("Collecting required properties for the service: {}", bpService);
Collection<Stack.ConfigProperty> requiredConfigsForService = topology.getStack().getRequiredConfigurationProperties(bpService);
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/agent/HeartbeatProcessorTest.java b/ambari-server/src/test/java/org/apache/ambari/server/agent/HeartbeatProcessorTest.java
index ed9623c..e682462 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/agent/HeartbeatProcessorTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/agent/HeartbeatProcessorTest.java
@@ -44,8 +44,6 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
-import com.google.inject.Binder;
-import com.google.inject.Module;
import org.apache.ambari.server.AmbariException;
import org.apache.ambari.server.H2DatabaseCleaner;
import org.apache.ambari.server.Role;
@@ -97,9 +95,11 @@ import org.junit.Ignore;
import org.junit.Test;
import com.google.gson.JsonObject;
+import com.google.inject.Binder;
import com.google.inject.Guice;
import com.google.inject.Inject;
import com.google.inject.Injector;
+import com.google.inject.Module;
public class HeartbeatProcessorTest {
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/agent/HeartbeatTestHelper.java b/ambari-server/src/test/java/org/apache/ambari/server/agent/HeartbeatTestHelper.java
index 9228475..4fa806f 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/agent/HeartbeatTestHelper.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/agent/HeartbeatTestHelper.java
@@ -29,11 +29,9 @@ import static org.apache.ambari.server.agent.DummyHeartbeatConstants.HBASE;
import java.lang.reflect.Method;
import java.util.ArrayList;
-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;
@@ -47,7 +45,6 @@ import org.apache.ambari.server.actionmanager.Request;
import org.apache.ambari.server.actionmanager.Stage;
import org.apache.ambari.server.actionmanager.StageFactory;
import org.apache.ambari.server.api.services.AmbariMetaInfo;
-import org.apache.ambari.server.api.services.ServiceGroupKey;
import org.apache.ambari.server.events.publishers.STOMPUpdatePublisher;
import org.apache.ambari.server.orm.InMemoryDefaultTestModule;
import org.apache.ambari.server.orm.OrmTestHelper;
@@ -76,7 +73,6 @@ import org.apache.ambari.server.state.Service;
import org.apache.ambari.server.state.ServiceFactory;
import org.apache.ambari.server.state.ServiceGroup;
import org.apache.ambari.server.state.ServiceGroupFactory;
-import org.apache.ambari.server.state.ServiceGroupImpl;
import org.apache.ambari.server.state.StackId;
import org.apache.ambari.server.state.cluster.ClustersImpl;
import org.apache.ambari.server.state.fsm.InvalidStateTransitionException;
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/agent/stomp/dto/MetadataClusterTest.java b/ambari-server/src/test/java/org/apache/ambari/server/agent/stomp/dto/MetadataClusterTest.java
index 1e5db3b..6427633 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/agent/stomp/dto/MetadataClusterTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/agent/stomp/dto/MetadataClusterTest.java
@@ -32,9 +32,9 @@ public class MetadataClusterTest {
@Test
public void shouldReturnFalseWhenUpdatingServiceLevelParamsWithoutNewOrRemovedServices() throws Exception {
final SortedMap<String, MetadataServiceInfo> current = new TreeMap<>();
- current.put("service1", new MetadataServiceInfo("v1", Boolean.FALSE, null, 1L, "servicePackageFolder"));
- current.put("service2", new MetadataServiceInfo("v1", Boolean.FALSE, null, 1L, "servicePackageFolder"));
- current.put("service3", new MetadataServiceInfo("v1", Boolean.FALSE, null, 1L, "servicePackageFolder"));
+ current.put("service1", new MetadataServiceInfo("anyType", "v1", Boolean.FALSE, null, 1L, "servicePackageFolder"));
+ current.put("service2", new MetadataServiceInfo("anyType", "v1", Boolean.FALSE, null, 1L, "servicePackageFolder"));
+ current.put("service3", new MetadataServiceInfo("anyType", "v1", Boolean.FALSE, null, 1L, "servicePackageFolder"));
final MetadataCluster metadataCluster = MetadataCluster.serviceLevelParamsMetadataCluster(null, current, true);
final SortedMap<String, MetadataServiceInfo> updated = new TreeMap<>(current);
assertFalse(metadataCluster.updateServiceLevelParams(updated, true));
@@ -44,11 +44,11 @@ public class MetadataClusterTest {
@Test
public void shouldReturnTrueWhenUpdatingServiceLevelParamsUponServiceAddition() throws Exception {
final SortedMap<String, MetadataServiceInfo> current = new TreeMap<>();
- current.put("service1", new MetadataServiceInfo("v1", Boolean.FALSE, null, 1L, "servicePackageFolder"));
- current.put("service2", new MetadataServiceInfo("v1", Boolean.FALSE, null, 1L, "servicePackageFolder"));
+ current.put("service1", new MetadataServiceInfo("anyType", "v1", Boolean.FALSE, null, 1L, "servicePackageFolder"));
+ current.put("service2", new MetadataServiceInfo("anyType", "v1", Boolean.FALSE, null, 1L, "servicePackageFolder"));
final MetadataCluster metadataCluster = MetadataCluster.serviceLevelParamsMetadataCluster(null, current, true);
final SortedMap<String, MetadataServiceInfo> updated = new TreeMap<>(current);
- updated.put("service3", new MetadataServiceInfo("v1", Boolean.FALSE, null, 1L, "servicePackageFolder"));
+ updated.put("service3", new MetadataServiceInfo("anyType", "v1", Boolean.FALSE, null, 1L, "servicePackageFolder"));
assertTrue(metadataCluster.updateServiceLevelParams(updated, true));
assertEquals(updated, metadataCluster.getServiceLevelParams());
}
@@ -56,9 +56,9 @@ public class MetadataClusterTest {
@Test
public void shouldReturnTrueWhenUpdatingServiceLevelParamsUponServiceRemoval() throws Exception {
final SortedMap<String, MetadataServiceInfo> current = new TreeMap<>();
- current.put("service1", new MetadataServiceInfo("v1", Boolean.FALSE, null, 1L, "servicePackageFolder"));
- current.put("service2", new MetadataServiceInfo("v1", Boolean.FALSE, null, 1L, "servicePackageFolder"));
- current.put("service3", new MetadataServiceInfo("v1", Boolean.FALSE, null, 1L, "servicePackageFolder"));
+ current.put("service1", new MetadataServiceInfo("anyType", "v1", Boolean.FALSE, null, 1L, "servicePackageFolder"));
+ current.put("service2", new MetadataServiceInfo("anyType", "v1", Boolean.FALSE, null, 1L, "servicePackageFolder"));
+ current.put("service3", new MetadataServiceInfo("anyType", "v1", Boolean.FALSE, null, 1L, "servicePackageFolder"));
final MetadataCluster metadataCluster = MetadataCluster.serviceLevelParamsMetadataCluster(null, current, true);
final SortedMap<String, MetadataServiceInfo> updated = new TreeMap<>(current);
updated.remove("service2");
@@ -69,9 +69,9 @@ public class MetadataClusterTest {
@Test
public void shouldReturnFalseWhenNullServiceLevelParamsArePassedBecauseOfPartialConfigurationUpdate() throws Exception {
final SortedMap<String, MetadataServiceInfo> current = new TreeMap<>();
- current.put("service1", new MetadataServiceInfo("v1", Boolean.FALSE, null, 1L, "servicePackageFolder"));
- current.put("service2", new MetadataServiceInfo("v1", Boolean.FALSE, null, 1L, "servicePackageFolder"));
- current.put("service3", new MetadataServiceInfo("v1", Boolean.FALSE, null, 1L, "servicePackageFolder"));
+ current.put("service1", new MetadataServiceInfo("anyType", "v1", Boolean.FALSE, null, 1L, "servicePackageFolder"));
+ current.put("service2", new MetadataServiceInfo("anyType", "v1", Boolean.FALSE, null, 1L, "servicePackageFolder"));
+ current.put("service3", new MetadataServiceInfo("anyType", "v1", Boolean.FALSE, null, 1L, "servicePackageFolder"));
final MetadataCluster metadataCluster = MetadataCluster.serviceLevelParamsMetadataCluster(null, current, true);
assertFalse(metadataCluster.updateServiceLevelParams(null, true));
assertEquals(current, metadataCluster.getServiceLevelParams());
@@ -80,13 +80,13 @@ public class MetadataClusterTest {
@Test
public void shouldReturnTrueWhenUpdatingServiceLevelParamsWithoutFullServiceLevelMetadata() throws Exception {
final SortedMap<String, MetadataServiceInfo> current = new TreeMap<>();
- current.put("service1", new MetadataServiceInfo("v1", Boolean.FALSE, null, 1L, "servicePackageFolder"));
- current.put("service2", new MetadataServiceInfo("v1", Boolean.FALSE, null, 1L, "servicePackageFolder"));
- current.put("service3", new MetadataServiceInfo("v1", Boolean.FALSE, null, 1L, "servicePackageFolder"));
+ current.put("service1", new MetadataServiceInfo("anyType", "v1", Boolean.FALSE, null, 1L, "servicePackageFolder"));
+ current.put("service2", new MetadataServiceInfo("anyType", "v1", Boolean.FALSE, null, 1L, "servicePackageFolder"));
+ current.put("service3", new MetadataServiceInfo("anyType", "v1", Boolean.FALSE, null, 1L, "servicePackageFolder"));
final MetadataCluster metadataCluster = MetadataCluster.serviceLevelParamsMetadataCluster(null, current, true);
final SortedMap<String, MetadataServiceInfo> updated = new TreeMap<>();
- updated.put("service3", new MetadataServiceInfo("v2", Boolean.TRUE, null, 2L, "servicePackageFolder2"));
- updated.put("service4", new MetadataServiceInfo("v1", Boolean.FALSE, null, 1L, "servicePackageFolder"));
+ updated.put("service3", new MetadataServiceInfo("anyType", "v2", Boolean.TRUE, null, 2L, "servicePackageFolder2"));
+ updated.put("service4", new MetadataServiceInfo("anyType", "v1", Boolean.FALSE, null, 1L, "servicePackageFolder"));
assertTrue(metadataCluster.updateServiceLevelParams(updated, false));
final SortedMap<String, MetadataServiceInfo> expected = current;
expected.putAll(updated);
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/api/query/QueryImplTest.java b/ambari-server/src/test/java/org/apache/ambari/server/api/query/QueryImplTest.java
index 341f7e4..9440c8c 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/api/query/QueryImplTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/api/query/QueryImplTest.java
@@ -47,7 +47,6 @@ import org.apache.ambari.server.api.query.render.Renderer;
import org.apache.ambari.server.api.resources.ClusterResourceDefinition;
import org.apache.ambari.server.api.resources.HostResourceDefinition;
import org.apache.ambari.server.api.resources.MpackResourceDefinition;
-import org.apache.ambari.server.api.resources.OperatingSystemResourceDefinition;
import org.apache.ambari.server.api.resources.ResourceDefinition;
import org.apache.ambari.server.api.resources.ResourceInstance;
import org.apache.ambari.server.api.resources.StackResourceDefinition;
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/api/services/stackadvisor/StackAdvisorBlueprintProcessorTest.java b/ambari-server/src/test/java/org/apache/ambari/server/api/services/stackadvisor/StackAdvisorBlueprintProcessorTest.java
index 2abc152..9a24c12 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/api/services/stackadvisor/StackAdvisorBlueprintProcessorTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/api/services/stackadvisor/StackAdvisorBlueprintProcessorTest.java
@@ -94,7 +94,7 @@ public class StackAdvisorBlueprintProcessorTest {
expect(stack.getName()).andReturn(STACK_ID.getStackName()).anyTimes();
expect(stack.getConfiguration(services)).andReturn(createStackDefaults()).anyTimes();
expect(stack.getServices(STACK_ID)).andReturn(services).anyTimes();
- expect(clusterTopology.getServices()).andReturn(services).anyTimes();
+ expect(clusterTopology.getServiceTypes()).andReturn(services).anyTimes();
expect(blueprint.getHostGroups()).andReturn(createHostGroupMap()).anyTimes();
expect(clusterTopology.isValidConfigType("core-site")).andReturn(true).anyTimes();
expect(hostGroup.getComponentNames()).andReturn(Arrays.asList("comp1", "comp2")).anyTimes();
@@ -133,7 +133,7 @@ public class StackAdvisorBlueprintProcessorTest {
expect(stack.getName()).andReturn(STACK_ID.getStackName()).anyTimes();
expect(stack.getConfiguration(services)).andReturn(createStackDefaults()).anyTimes();
expect(stack.getServices(STACK_ID)).andReturn(services).anyTimes();
- expect(clusterTopology.getServices()).andReturn(services).anyTimes();
+ expect(clusterTopology.getServiceTypes()).andReturn(services).anyTimes();
expect(blueprint.getHostGroups()).andReturn(createHostGroupMap()).anyTimes();
expect(clusterTopology.isValidConfigType("core-site")).andReturn(true).anyTimes();
expect(hostGroup.getComponentNames()).andReturn(Arrays.asList("comp1", "comp2")).anyTimes();
@@ -173,7 +173,7 @@ public class StackAdvisorBlueprintProcessorTest {
expect(stack.getName()).andReturn(STACK_ID.getStackName()).anyTimes();
expect(stack.getConfiguration(services)).andReturn(createStackDefaults()).anyTimes();
expect(stack.getServices(STACK_ID)).andReturn(services).anyTimes();
- expect(clusterTopology.getServices()).andReturn(services).anyTimes();
+ expect(clusterTopology.getServiceTypes()).andReturn(services).anyTimes();
expect(blueprint.getHostGroups()).andReturn(createHostGroupMap()).anyTimes();
expect(clusterTopology.isValidConfigType("core-site")).andReturn(true).anyTimes();
expect(hostGroup.getComponentNames()).andReturn(Arrays.asList("comp1", "comp2")).anyTimes();
@@ -211,7 +211,7 @@ public class StackAdvisorBlueprintProcessorTest {
expect(stack.getName()).andReturn(STACK_ID.getStackName()).anyTimes();
expect(stack.getConfiguration(services)).andReturn(createStackDefaults()).anyTimes();
expect(stack.getServices(STACK_ID)).andReturn(services).anyTimes();
- expect(clusterTopology.getServices()).andReturn(services).anyTimes();
+ expect(clusterTopology.getServiceTypes()).andReturn(services).anyTimes();
expect(blueprint.getHostGroups()).andReturn(createHostGroupMap()).anyTimes();
expect(clusterTopology.isValidConfigType("core-site")).andReturn(true).anyTimes();
expect(hostGroup.getComponentNames()).andReturn(Arrays.asList("comp1", "comp2")).anyTimes();
@@ -248,7 +248,7 @@ public class StackAdvisorBlueprintProcessorTest {
expect(blueprint.getHostGroups()).andReturn(createHostGroupMap()).anyTimes();
expect(hostGroup.getComponentNames()).andReturn(Arrays.asList("comp1", "comp2")).anyTimes();
expect(stack.getServices(STACK_ID)).andReturn(services).anyTimes();
- expect(clusterTopology.getServices()).andReturn(services).anyTimes();
+ expect(clusterTopology.getServiceTypes()).andReturn(services).anyTimes();
expect(stackAdvisorHelper.recommend(anyObject(StackAdvisorRequest.class))).andThrow(new StackAdvisorException("ex"));
expect(configuration.getFullProperties()).andReturn(props);
@@ -280,7 +280,7 @@ public class StackAdvisorBlueprintProcessorTest {
expect(stack.getName()).andReturn(STACK_ID.getStackName()).anyTimes();
expect(stack.getConfiguration(services)).andReturn(createStackDefaults()).anyTimes();
expect(stack.getServices(STACK_ID)).andReturn(services).anyTimes();
- expect(clusterTopology.getServices()).andReturn(services).anyTimes();
+ expect(clusterTopology.getServiceTypes()).andReturn(services).anyTimes();
expect(blueprint.getHostGroups()).andReturn(createHostGroupMap()).anyTimes();
expect(hostGroup.getComponentNames()).andReturn(Arrays.asList("comp1", "comp2")).anyTimes();
expect(stackAdvisorHelper.recommend(anyObject(StackAdvisorRequest.class))).andReturn(new RecommendationResponse());
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerTest.java
index 98d4c29..5e84ce2 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerTest.java
@@ -361,16 +361,18 @@ public class AmbariManagementControllerTest {
controller.createCluster(r);
}
- private void createService(String clusterName, String serviceGroupName, String serviceName, State desiredState) throws Exception {
+ private Service createService(String clusterName, String serviceGroupName, String serviceName, State desiredState) throws Exception {
String dStateStr = null;
if (desiredState != null) {
dStateStr = desiredState.toString();
}
- ServiceRequest r1 = new ServiceRequest(clusterName, serviceGroupName, serviceName, null,
+ ServiceRequest r1 = new ServiceRequest(clusterName, serviceGroupName, serviceName, serviceName,
dStateStr, null);
ServiceResourceProviderTest.createServices(controller, Collections.singleton(r1));
+
+ return clusters.getCluster(clusterName).getService(serviceGroupName, serviceName);
}
private void createServiceComponent(String clusterName,
@@ -1249,7 +1251,7 @@ public class AmbariManagementControllerTest {
createServiceComponentHostSimple(cluster1, host1, getUniqueName(), serviceGroupName, serviceName);
Cluster cluster = clusters.getCluster(cluster1);
- Service s1 = cluster.getService(serviceName);
+ Service s1 = cluster.getService(serviceGroupName, serviceName);
// Create and attach config
Map<String, String> configs = new HashMap<>();
@@ -1262,11 +1264,11 @@ public class AmbariManagementControllerTest {
ConfigurationRequest cr1,cr2, cr3;
cr1 = new ConfigurationRequest(cluster1, "core-site","version1",
- configs, null, 1L, 1L);
+ configs, null, s1.getServiceId(), 1L);
cr2 = new ConfigurationRequest(cluster1, "hdfs-site","version1",
- configs, null, 1L, 1L);
+ configs, null, s1.getServiceId(), 1L);
cr3 = new ConfigurationRequest(cluster1, "hadoop-env","version1",
- hadoopEnvConfigs, null, 1L, 1L);
+ hadoopEnvConfigs, null, s1.getServiceId(), 1L);
ClusterRequest crReq = new ClusterRequest(cluster.getClusterId(), cluster1, null, null);
crReq.setDesiredConfig(Collections.singletonList(cr1));
@@ -1371,7 +1373,7 @@ public class AmbariManagementControllerTest {
createCluster(clusterName);
clusters.getCluster(clusterName).setDesiredStackVersion(new StackId(HDP_0_1));
ServiceGroupResourceProviderTest.createServiceGroup(controller, clusterName, serviceGroupName, HDP_0_1);
- createService(clusterName, serviceGroupName, serviceName, null);
+ Service service = createService(clusterName, serviceGroupName, serviceName, null);
String componentName1 = "NAMENODE";
String componentName2 = "DATANODE";
String componentName3 = "HDFS_CLIENT";
@@ -2495,7 +2497,7 @@ public class AmbariManagementControllerTest {
String serviceGroupName = "CORE";
ServiceGroupResourceProviderTest.createServiceGroup(controller, cluster1, serviceGroupName, "HDP-2.0.5");
String serviceName = "HDFS";
- createService(cluster1, serviceGroupName, serviceName, null);
+ Service service = createService(cluster1, serviceGroupName, serviceName, null);
String componentName1 = "NAMENODE";
String componentName2 = "DATANODE";
String componentName3 = "HDFS_CLIENT";
@@ -2517,9 +2519,8 @@ public class AmbariManagementControllerTest {
Map<String, String> configs = new HashMap<>();
configs.put("a", "b");
- ConfigurationRequest cr1;
- cr1 = new ConfigurationRequest(cluster1, "hdfs-site", "version1",
- configs, null, 1L, 1L);
+ ConfigurationRequest cr1 = new ConfigurationRequest(cluster1, "hdfs-site", "version1",
+ configs, null, service.getServiceId(), 1L);
ClusterRequest crReq = new ClusterRequest(clusterId, cluster1, null, null);
crReq.setDesiredConfig(Collections.singletonList(cr1));
controller.updateClusters(Collections.singleton(crReq), null);
@@ -4422,7 +4423,7 @@ public class AmbariManagementControllerTest {
String serviceGroupName = "CORE";
ServiceGroupResourceProviderTest.createServiceGroup(controller, cluster1, serviceGroupName, HDP_0_1);
String serviceName = "HDFS";
- createService(cluster1, serviceGroupName, serviceName, null);
+ Service service = createService(cluster1, serviceGroupName, serviceName, null);
String componentName1 = "NAMENODE";
String componentName2 = "DATANODE";
String componentName3 = "HDFS_CLIENT";
@@ -4533,14 +4534,14 @@ public class AmbariManagementControllerTest {
configs.put("a", "b");
ConfigurationRequest cr1, cr2, cr3, cr4, cr5, cr6, cr7, cr8;
- cr1 = new ConfigurationRequest(cluster1, "typeA","v1", configs, null, 1L, 1L);
- cr2 = new ConfigurationRequest(cluster1, "typeB","v1", configs, null, 1L, 1L);
- cr3 = new ConfigurationRequest(cluster1, "typeC","v1", configs, null, 1L, 1L);
- cr4 = new ConfigurationRequest(cluster1, "typeD","v1", configs, null, 1L, 1L);
- cr5 = new ConfigurationRequest(cluster1, "typeA","v2", configs, null, 1L, 1L);
- cr6 = new ConfigurationRequest(cluster1, "typeB","v2", configs, null, 1L, 1L);
- cr7 = new ConfigurationRequest(cluster1, "typeC","v2", configs, null, 1L, 1L);
- cr8 = new ConfigurationRequest(cluster1, "typeE","v1", configs, null, 1L, 1L);
+ cr1 = new ConfigurationRequest(cluster1, "typeA","v1", configs, null, service.getServiceId(), 1L);
+ cr2 = new ConfigurationRequest(cluster1, "typeB","v1", configs, null, service.getServiceId(), 1L);
+ cr3 = new ConfigurationRequest(cluster1, "typeC","v1", configs, null, service.getServiceId(), 1L);
+ cr4 = new ConfigurationRequest(cluster1, "typeD","v1", configs, null, service.getServiceId(), 1L);
+ cr5 = new ConfigurationRequest(cluster1, "typeA","v2", configs, null, service.getServiceId(), 1L);
+ cr6 = new ConfigurationRequest(cluster1, "typeB","v2", configs, null, service.getServiceId(), 1L);
+ cr7 = new ConfigurationRequest(cluster1, "typeC","v2", configs, null, service.getServiceId(), 1L);
+ cr8 = new ConfigurationRequest(cluster1, "typeE","v1", configs, null, service.getServiceId(), 1L);
controller.createConfiguration(cr1);
controller.createConfiguration(cr2);
controller.createConfiguration(cr3);
@@ -4620,7 +4621,7 @@ public class AmbariManagementControllerTest {
String serviceGroupName = "CORE";
ServiceGroupResourceProviderTest.createServiceGroup(controller, cluster1, serviceGroupName, HDP_0_1);
String serviceName = "HDFS";
- createService(cluster1, serviceGroupName, serviceName, null);
+ Service service = createService(cluster1, serviceGroupName, serviceName, null);
String componentName1 = "NAMENODE";
String componentName2 = "DATANODE";
String componentName3 = "HDFS_CLIENT";
@@ -4674,14 +4675,14 @@ public class AmbariManagementControllerTest {
configAttributes.get("final").put("a", "true");
ConfigurationRequest cr1, cr2, cr3, cr4, cr5, cr6, cr7, cr8;
- cr1 = new ConfigurationRequest(cluster1, "typeA","v1", configs, configAttributes, 1L, 1L);
- cr2 = new ConfigurationRequest(cluster1, "typeB","v1", configs, configAttributes, 1L, 1L);
- cr3 = new ConfigurationRequest(cluster1, "typeC","v1", configs, configAttributes, 1L, 1L);
- cr4 = new ConfigurationRequest(cluster1, "typeD","v1", configs, configAttributes, 1L, 1L);
- cr5 = new ConfigurationRequest(cluster1, "typeA","v2", configs, configAttributes, 1L, 1L);
- cr6 = new ConfigurationRequest(cluster1, "typeB","v2", configs, configAttributes, 1L, 1L);
- cr7 = new ConfigurationRequest(cluster1, "typeC","v2", configs, configAttributes, 1L, 1L);
- cr8 = new ConfigurationRequest(cluster1, "typeE","v1", configs, configAttributes, 1L, 1L);
+ cr1 = new ConfigurationRequest(cluster1, "typeA","v1", configs, configAttributes, service.getServiceId(), 1L);
+ cr2 = new ConfigurationRequest(cluster1, "typeB","v1", configs, configAttributes, service.getServiceId(), 1L);
+ cr3 = new ConfigurationRequest(cluster1, "typeC","v1", configs, configAttributes, service.getServiceId(), 1L);
+ cr4 = new ConfigurationRequest(cluster1, "typeD","v1", configs, configAttributes, service.getServiceId(), 1L);
+ cr5 = new ConfigurationRequest(cluster1, "typeA","v2", configs, configAttributes, service.getServiceId(), 1L);
+ cr6 = new ConfigurationRequest(cluster1, "typeB","v2", configs, configAttributes, service.getServiceId(), 1L);
+ cr7 = new ConfigurationRequest(cluster1, "typeC","v2", configs, configAttributes, service.getServiceId(), 1L);
+ cr8 = new ConfigurationRequest(cluster1, "typeE","v1", configs, configAttributes, service.getServiceId(), 1L);
controller.createConfiguration(cr1);
controller.createConfiguration(cr2);
controller.createConfiguration(cr3);
@@ -4793,14 +4794,11 @@ public class AmbariManagementControllerTest {
requests.add(r);
ServiceResourceProviderTest.updateServices(controller, requests, mapRequestProps, true, false);
- Assert.assertEquals(State.INSTALLED,
- clusters.getCluster(cluster1).getService(serviceName)
- .getDesiredState());
+ Service service = clusters.getCluster(cluster1).getService(serviceName);
+ Assert.assertEquals(State.INSTALLED, service.getDesiredState());
// manually change live state to installed as no running action manager
- for (ServiceComponent sc :
- clusters.getCluster(cluster1).getService(serviceName)
- .getServiceComponents().values()) {
+ for (ServiceComponent sc : service.getServiceComponents().values()) {
for (ServiceComponentHost sch : sc.getServiceComponentHosts().values()) {
sch.setState(State.INSTALLED);
}
@@ -4812,11 +4810,11 @@ public class AmbariManagementControllerTest {
ConfigurationRequest cr1,cr2,cr3;
cr1 = new ConfigurationRequest(cluster1, "core-site","version1",
- configs, null, 1L, 1L);
+ configs, null, service.getServiceId(), 1L);
cr2 = new ConfigurationRequest(cluster1, "hdfs-site","version1",
- configs, null, 1L, 1L);
+ configs, null, service.getServiceId(), 1L);
cr3 = new ConfigurationRequest(cluster1, "core-site","version122",
- configs, null, 1L, 1L);
+ configs, null, service.getServiceId(), 1L);
controller.createConfiguration(cr1);
controller.createConfiguration(cr2);
controller.createConfiguration(cr3);
@@ -4919,8 +4917,8 @@ public class AmbariManagementControllerTest {
String componentName5 = "TASKTRACKER";
String componentName6 = "MAPREDUCE_CLIENT";
- createService(cluster1, serviceGroupName, serviceName1, null);
- createService(cluster1, serviceGroupName, serviceName2, null);
+ Service service1 = createService(cluster1, serviceGroupName, serviceName1, null);
+ Service service2 = createService(cluster1, serviceGroupName, serviceName2, null);
createServiceComponent(cluster1, serviceGroupName, serviceName1, componentName1, State.INIT);
createServiceComponent(cluster1, serviceGroupName, serviceName1, componentName2, State.INIT);
@@ -4956,11 +4954,11 @@ public class AmbariManagementControllerTest {
ConfigurationRequest cr1,cr2,cr3,cr4;
cr1 = new ConfigurationRequest(cluster1, "core-site","version1",
- configs, null, 1L, 1L);
+ configs, null, service1.getServiceId(), 1L);
cr2 = new ConfigurationRequest(cluster1, "hdfs-site","version1",
- configs, null, 1L, 1L);
+ configs, null, service1.getServiceId(), 1L);
cr4 = new ConfigurationRequest(cluster1, "kerberos-env", "version1",
- configs3, null, 1L, 1L);
+ configs3, null, null, 1L);
ConfigFactory cf = injector.getInstance(ConfigFactory.class);
Config config1 = cf.createNew(cluster, "kerberos-env", "version1",
@@ -4992,7 +4990,7 @@ public class AmbariManagementControllerTest {
// Reconfigure
cr3 = new ConfigurationRequest(cluster1, "core-site","version122",
- configs2, null, 1L, 1L);
+ configs2, null, service1.getServiceId(), 1L);
crReq = new ClusterRequest(cluster.getClusterId(), cluster1, null, null);
crReq.setDesiredConfig(Collections.singletonList(cr3));
controller.updateClusters(Collections.singleton(crReq), null);
@@ -5089,7 +5087,7 @@ public class AmbariManagementControllerTest {
String serviceGroupName = "CORE";
ServiceGroupResourceProviderTest.createServiceGroup(controller, cluster1, serviceGroupName, HDP_0_1);
String serviceName = "HDFS";
- createService(cluster1, serviceGroupName, serviceName, null);
+ Service service = createService(cluster1, serviceGroupName, serviceName, null);
String componentName1 = "NAMENODE";
String componentName2 = "DATANODE";
String componentName3 = "HDFS_CLIENT";
@@ -5117,9 +5115,9 @@ public class AmbariManagementControllerTest {
ConfigurationRequest cr1,cr2,cr3;
cr1 = new ConfigurationRequest(cluster1, "core-site","version1",
- configs, null, 1L, 1L);
+ configs, null, service.getServiceId(), 1L);
cr2 = new ConfigurationRequest(cluster1, "hdfs-site","version1",
- configs, null, 1L, 1L);
+ configs, null, service.getServiceId(), 1L);
ClusterRequest crReq = new ClusterRequest(cluster.getClusterId(), cluster1, null, null);
crReq.setDesiredConfig(Collections.singletonList(cr1));
@@ -5144,7 +5142,7 @@ public class AmbariManagementControllerTest {
// Reconfigure
cr3 = new ConfigurationRequest(cluster1, "core-site","version122",
- configs2, null, 1L, 1L);
+ configs2, null, service.getServiceId(), 1L);
crReq = new ClusterRequest(cluster.getClusterId(), cluster1, null, null);
crReq.setDesiredConfig(Collections.singletonList(cr3));
controller.updateClusters(Collections.singleton(crReq), null);
@@ -5677,7 +5675,7 @@ public class AmbariManagementControllerTest {
String serviceGroupName = "CORE";
ServiceGroupResourceProviderTest.createServiceGroup(controller, cluster1, serviceGroupName, "HDP-2.0.7");
String serviceName = "HDFS";
- createService(cluster1, serviceGroupName, serviceName, null);
+ Service service = createService(cluster1, serviceGroupName, serviceName, null);
String componentName1 = "NAMENODE";
String componentName2 = "DATANODE";
String componentName3 = "HDFS_CLIENT";
@@ -5711,7 +5709,7 @@ public class AmbariManagementControllerTest {
ConfigurationRequest cr1;
cr1 = new ConfigurationRequest(cluster1, "hdfs-site","version1",
- configs, null, 1L, 1L);
+ configs, null, service.getServiceId(), 1L);
ClusterRequest crReq = new ClusterRequest(cluster.getClusterId(), cluster1, null, null);
crReq.setDesiredConfig(Collections.singletonList(cr1));
controller.updateClusters(Collections.singleton(crReq), null);
@@ -6111,7 +6109,7 @@ public class AmbariManagementControllerTest {
String serviceGroupName = "CORE";
ServiceGroupResourceProviderTest.createServiceGroup(controller, cluster1, serviceGroupName, HDP_0_1);
String serviceName = "HDFS";
- createService(cluster1, serviceGroupName, serviceName, null);
+ Service service = createService(cluster1, serviceGroupName, serviceName, null);
String componentName1 = "NAMENODE";
String componentName2 = "DATANODE";
String componentName3 = "HDFS_CLIENT";
@@ -6139,9 +6137,9 @@ public class AmbariManagementControllerTest {
ConfigurationRequest cr1,cr2;
cr1 = new ConfigurationRequest(cluster1, "core-site","version1",
- configs, null, 1L, 1L);
+ configs, null, service.getServiceId(), 1L);
cr2 = new ConfigurationRequest(cluster1, "hdfs-site","version1",
- configs, null, 1L, 1L);
+ configs, null, service.getServiceId(), 1L);
ClusterRequest crReq = new ClusterRequest(cluster.getClusterId(), cluster1, null, null);
crReq.setDesiredConfig(Collections.singletonList(cr1));
@@ -6186,7 +6184,7 @@ public class AmbariManagementControllerTest {
String serviceGroupName = "CORE";
ServiceGroupResourceProviderTest.createServiceGroup(controller, cluster1, serviceGroupName, HDP_0_1);
String serviceName = "HDFS";
- createService(cluster1, serviceGroupName, serviceName, null);
+ Service service = createService(cluster1, serviceGroupName, serviceName, null);
String componentName1 = "NAMENODE";
String componentName2 = "DATANODE";
String componentName3 = "HDFS_CLIENT";
@@ -6214,9 +6212,9 @@ public class AmbariManagementControllerTest {
ConfigurationRequest cr1,cr2;
cr1 = new ConfigurationRequest(cluster1, "core-site","version1",
- configs, null, 1L, 1L);
+ configs, null, service.getServiceId(), 1L);
cr2 = new ConfigurationRequest(cluster1, "hdfs-site","version1",
- configs, null, 1L, 1L);
+ configs, null, service.getServiceId(), 1L);
// create, but don't assign
controller.createConfiguration(cr1);
@@ -6316,8 +6314,8 @@ public class AmbariManagementControllerTest {
ServiceGroupResourceProviderTest.createServiceGroup(controller, cluster1, serviceGroupName, "HDP-2.0.6");
String serviceName1 = "HDFS";
String serviceName2 = "MAPREDUCE2";
- createService(cluster1, serviceGroupName, serviceName1, null);
- createService(cluster1, serviceGroupName, serviceName2, null);
+ Service service1 = createService(cluster1, serviceGroupName, serviceName1, null);
+ Service service2 = createService(cluster1, serviceGroupName, serviceName2, null);
String componentName1 = "NAMENODE";
String componentName2 = "DATANODE";
String componentName3 = "HDFS_CLIENT";
@@ -6347,9 +6345,9 @@ public class AmbariManagementControllerTest {
configs.put("a", "b");
ConfigurationRequest cr1,cr2,cr3;
- cr1 = new ConfigurationRequest(cluster1, "core-site", "version1", configs, null, 1L, 1L);
- cr2 = new ConfigurationRequest(cluster1, "hdfs-site", "version1", configs, null, 1L, 1L);
- cr3 = new ConfigurationRequest(cluster1, "mapred-site", "version1", configs, null, 1L, 1L);
+ cr1 = new ConfigurationRequest(cluster1, "core-site", "version1", configs, null, service1.getServiceId(), 1L);
+ cr2 = new ConfigurationRequest(cluster1, "hdfs-site", "version1", configs, null, service1.getServiceId(), 1L);
+ cr3 = new ConfigurationRequest(cluster1, "mapred-site", "version1", configs, null, service2.getServiceId(), 1L);
ClusterRequest crReq = new ClusterRequest(cluster.getClusterId(), cluster1, null, null);
crReq.setDesiredConfig(Collections.singletonList(cr1));
@@ -6568,7 +6566,7 @@ public class AmbariManagementControllerTest {
String serviceGroupName = "CORE";
ServiceGroupResourceProviderTest.createServiceGroup(controller, cluster1, serviceGroupName, HDP_0_1);
String serviceName = "HDFS";
- createService(cluster1, serviceGroupName, serviceName, null);
+ Service service = createService(cluster1, serviceGroupName, serviceName, null);
String componentName1 = "NAMENODE";
String componentName2 = "DATANODE";
String componentName3 = "HDFS_CLIENT";
@@ -6595,9 +6593,9 @@ public class AmbariManagementControllerTest {
ConfigurationRequest cr1,cr2;
cr1 = new ConfigurationRequest(cluster1, "core-site","version1",
- configs, null, 1L, 1L);
+ configs, null, service.getServiceId(), 1L);
cr2 = new ConfigurationRequest(cluster1, "hdfs-site","version1",
- configs, null, 1L, 1L);
+ configs, null, service.getServiceId(), 1L);
ClusterRequest crReq = new ClusterRequest(cluster.getClusterId(), cluster1, null, null);
crReq.setDesiredConfig(Collections.singletonList(cr1));
@@ -8012,16 +8010,13 @@ public class AmbariManagementControllerTest {
String serviceGroupName = "CORE";
ServiceGroupResourceProviderTest.createServiceGroup(controller, cluster1, serviceGroupName, "HDP-1.2.0");
- Set<ServiceRequest> serviceRequests = new HashSet<>();
- serviceRequests.add(new ServiceRequest(cluster1, serviceGroupName, "HDFS", null, null, null));
-
- ServiceResourceProviderTest.createServices(amc, serviceRequests);
+ Service service = createService(cluster1, serviceGroupName, "HDFS", null);
Type confType = new TypeToken<Map<String, String>>() {
}.getType();
ConfigurationRequest configurationRequest = new ConfigurationRequest(cluster1, type, tag,
- gson.fromJson("{ \"fs.default.name\" : \"localhost:8020\"}", confType), null, 1L, 1L);
+ gson.fromJson("{ \"fs.default.name\" : \"localhost:8020\"}", confType), null, service.getServiceId(), 1L);
amc.createConfiguration(configurationRequest);
amc.createConfiguration(configurationRequest);
@@ -8064,7 +8059,7 @@ public class AmbariManagementControllerTest {
long clusterId = clusters.getCluster(clusterName).getClusterId();
ConfigurationRequest configRequest = new ConfigurationRequest(clusterName, "global", "version1",
- new HashMap<String, String>() {{ put("a", "b"); }}, null, 1L, 1L);
+ new HashMap<String, String>() {{ put("a", "b"); }}, null, null, 1L);
ClusterRequest ur = new ClusterRequest(clusterId, clusterName, stackId, null);
ur.setDesiredConfig(Collections.singletonList(configRequest));
amc.updateClusters(Collections.singleton(ur), new HashMap<>());
@@ -8162,23 +8157,21 @@ public class AmbariManagementControllerTest {
Set<ServiceRequest> serviceRequests = new HashSet<>();
String serviceName = "HDFS";
- serviceRequests.add(new ServiceRequest(cluster1, serviceGroupName, serviceName, null, null, null));
- serviceRequests.add(new ServiceRequest(cluster1, serviceGroupName, "HIVE", null, null, null));
-
- ServiceResourceProviderTest.createServices(amc, serviceRequests);
+ Service service = createService(cluster1, serviceGroupName, serviceName, null);
+ createService(cluster1, serviceGroupName, "HIVE", null);
Type confType = new TypeToken<Map<String, String>>() {}.getType();
ConfigurationRequest configurationRequest = new ConfigurationRequest(cluster1, "core-site", "version1",
- gson.fromJson("{ \"fs.default.name\" : \"localhost:8020\"}", confType), null, 1L, 1L);
+ gson.fromJson("{ \"fs.default.name\" : \"localhost:8020\"}", confType), null, service.getServiceId(), 1L);
amc.createConfiguration(configurationRequest);
configurationRequest = new ConfigurationRequest(cluster1, "hdfs-site", "version1",
- gson.fromJson("{ \"dfs.datanode.data.dir.perm\" : \"750\"}", confType), null, 1L, 1L);
+ gson.fromJson("{ \"dfs.datanode.data.dir.perm\" : \"750\"}", confType), null, service.getServiceId(), 1L);
amc.createConfiguration(configurationRequest);
configurationRequest = new ConfigurationRequest(cluster1, "global", "version1",
- gson.fromJson("{ \"hive.server2.enable.doAs\" : \"true\"}", confType), null, 1L, 1L);
+ gson.fromJson("{ \"hive.server2.enable.doAs\" : \"true\"}", confType), null, null, 1L);
amc.createConfiguration(configurationRequest);
Assert.assertTrue(clusters.getCluster(cluster1).getDesiredConfigs().containsKey("hive-site"));
@@ -8396,13 +8389,13 @@ public class AmbariManagementControllerTest {
org.junit.Assert.assertEquals(1, ServiceResourceProviderTest.getServices(amc, serviceRequests).size());
//Create new configs
configurationRequest = new ConfigurationRequest(cluster1, "core-site", "version2",
- gson.fromJson("{ \"fs.default.name\" : \"localhost:8020\"}", confType), null, 1L, 1L);
+ gson.fromJson("{ \"fs.default.name\" : \"localhost:8020\"}", confType), null, service.getServiceId(), 1L);
amc.createConfiguration(configurationRequest);
configurationRequest = new ConfigurationRequest(cluster1, "hdfs-site", "version2",
- gson.fromJson("{ \"dfs.datanode.data.dir.perm\" : \"750\"}", confType), null, 1L, 1L);
+ gson.fromJson("{ \"dfs.datanode.data.dir.perm\" : \"750\"}", confType), null, service.getServiceId(), 1L);
amc.createConfiguration(configurationRequest);
configurationRequest = new ConfigurationRequest(cluster1, "global", "version2",
- gson.fromJson("{ \"hbase_hdfs_root_dir\" : \"/apps/hbase/\"}", confType), null, 1L, 1L);
+ gson.fromJson("{ \"hbase_hdfs_root_dir\" : \"/apps/hbase/\"}", confType), null, null, 1L);
amc.createConfiguration(configurationRequest);
//Add configs to service
serviceRequests.clear();
@@ -9487,21 +9480,21 @@ public class AmbariManagementControllerTest {
// test null map with no prior
cr.setDesiredConfig(Collections.singletonList(
- new ConfigurationRequest(cluster1, "typeA", "v1", null, null, 1L, 1L)));
+ new ConfigurationRequest(cluster1, "typeA", "v1", null, null, null, 1L)));
controller.updateClusters(Collections.singleton(cr), new HashMap<>());
Config config = cluster.getDesiredConfigByType("typeA");
Assert.assertNull(config);
// test empty map with no prior
cr.setDesiredConfig(Collections.singletonList(
- new ConfigurationRequest(cluster1, "typeA", "v1", new HashMap<>(), new HashMap<>(), 1L, 1L)));
+ new ConfigurationRequest(cluster1, "typeA", "v1", new HashMap<>(), new HashMap<>(), null, 1L)));
controller.updateClusters(Collections.singleton(cr), new HashMap<>());
config = cluster.getDesiredConfigByType("typeA");
Assert.assertNotNull(config);
// test empty properties on a new version
cr.setDesiredConfig(Collections.singletonList(
- new ConfigurationRequest(cluster1, "typeA", "v2", new HashMap<>(), new HashMap<>(), 1L, 1L)));
+ new ConfigurationRequest(cluster1, "typeA", "v2", new HashMap<>(), new HashMap<>(), null, 1L)));
controller.updateClusters(Collections.singleton(cr), new HashMap<>());
config = cluster.getDesiredConfigByType("typeA");
Assert.assertNotNull(config);
@@ -9515,7 +9508,7 @@ public class AmbariManagementControllerTest {
attributesMap.put("final", new HashMap<>());
attributesMap.get("final").put("c", "true");
cr.setDesiredConfig(Collections.singletonList(
- new ConfigurationRequest(cluster1, "typeA", "v3", map, attributesMap, 1L, 1L)));
+ new ConfigurationRequest(cluster1, "typeA", "v3", map, attributesMap, null, 1L)));
controller.updateClusters(Collections.singleton(cr), new HashMap<>());
config = cluster.getDesiredConfigByType("typeA");
Assert.assertNotNull(config);
@@ -9523,7 +9516,7 @@ public class AmbariManagementControllerTest {
// test reset to v2
cr.setDesiredConfig(Collections.singletonList(
- new ConfigurationRequest(cluster1, "typeA", "v2", new HashMap<>(), new HashMap<>(), 1L, 1L)));
+ new ConfigurationRequest(cluster1, "typeA", "v2", new HashMap<>(), new HashMap<>(), null, 1L)));
controller.updateClusters(Collections.singleton(cr), new HashMap<>());
config = cluster.getDesiredConfigByType("typeA");
Assert.assertEquals("v2", config.getTag());
@@ -9535,7 +9528,7 @@ public class AmbariManagementControllerTest {
new ConfigurationRequest(cluster1, "typeA", "v2", new HashMap<String, String>() {{ put("a", "b"); }},
new HashMap<String, Map<String,String>>(){{put("final", new HashMap<String, String>(){{put("a", "true");}});
}
- }, 1L, 1L)));
+ }, null, 1L)));
try {
controller.updateClusters(Collections.singleton(cr), new HashMap<>());
Assert.fail("Expect failure when creating a config that exists");
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 71e2280..31c6ec3 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
@@ -239,7 +239,7 @@ public class AmbariContextTest {
expect(blueprint.getName()).andReturn(BP_NAME).anyTimes();
expect(topology.getStack()).andReturn(stack).anyTimes();
expect(topology.getStackIds()).andReturn(Collections.singleton(STACK_ID)).anyTimes();
- expect(topology.getServices()).andReturn(blueprintServices).anyTimes();
+ expect(topology.getServiceTypes()).andReturn(blueprintServices).anyTimes();
expect(topology.getComponents()).andAnswer(() -> Stream.of(
builderFor("service1", "s1Component1").stackId(STACK_ID).buildPartial(),
builderFor("service1", "s1Component2").stackId(STACK_ID).buildPartial(),
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/topology/ClusterConfigurationRequestTest.java b/ambari-server/src/test/java/org/apache/ambari/server/topology/ClusterConfigurationRequestTest.java
index 2e67538..9793003 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/topology/ClusterConfigurationRequestTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/topology/ClusterConfigurationRequestTest.java
@@ -255,7 +255,7 @@ public class ClusterConfigurationRequestTest {
expect(stack.getExcludedConfigurationTypes(anyString())).andReturn(Collections.emptySet()).anyTimes();
expect(stack.getConfigurationPropertiesWithMetadata(anyString(), anyString())).andReturn(Collections.emptyMap()).anyTimes();
- expect(topology.getServices()).andReturn(SERVICE_NAMES).anyTimes();
+ expect(topology.getServiceTypes()).andReturn(SERVICE_NAMES).anyTimes();
expect(stack.getConfiguration(SERVICE_NAMES)).andReturn(stackDefaultConfig).once();
expect(topology.getComponents()).andAnswer(() -> Stream.of(
@@ -339,7 +339,7 @@ public class ClusterConfigurationRequestTest {
expect(stack.getExcludedConfigurationTypes(anyString())).andReturn(Collections.emptySet()).anyTimes();
expect(stack.getConfigurationPropertiesWithMetadata(anyString(), anyString())).andReturn(Collections.emptyMap()).anyTimes();
Set<String> serviceNames = ImmutableSet.of("HDFS", "KERBEROS", "ZOOKEEPER");
- expect(topology.getServices()).andReturn(serviceNames).anyTimes();
+ expect(topology.getServiceTypes()).andReturn(serviceNames).anyTimes();
expect(topology.getAmbariContext()).andReturn(ambariContext).anyTimes();
expect(topology.getComponents()).andAnswer(Stream::empty).anyTimes();
expect(topology.getConfigRecommendationStrategy()).andReturn(ConfigRecommendationStrategy.NEVER_APPLY).anyTimes();
@@ -391,7 +391,7 @@ public class ClusterConfigurationRequestTest {
expect(topology.getBlueprint()).andReturn(blueprint).anyTimes();
expect(topology.getHostGroupInfo()).andReturn(hostGroupInfoMap);
expect(topology.getStack()).andReturn(stack).anyTimes();
- expect(topology.getServices()).andReturn(services).anyTimes();
+ expect(topology.getServiceTypes()).andReturn(services).anyTimes();
expect(topology.isValidConfigType("hdfs-site")).andReturn(true).anyTimes();
expect(topology.isValidConfigType("admin-properties")).andReturn(true).anyTimes();
@@ -441,7 +441,7 @@ public class ClusterConfigurationRequestTest {
expect(topology.getBlueprint()).andReturn(blueprint).anyTimes();
expect(topology.getHostGroupInfo()).andReturn(hostGroupInfoMap);
expect(topology.getStack()).andReturn(stack).anyTimes();
- expect(topology.getServices()).andReturn(services).anyTimes();
+ expect(topology.getServiceTypes()).andReturn(services).anyTimes();
expect(topology.isValidConfigType("hdfs-site")).andReturn(true).anyTimes();
expect(topology.isValidConfigType("cluster-env")).andReturn(true).anyTimes();
@@ -539,7 +539,7 @@ public class ClusterConfigurationRequestTest {
expect(topology.getBlueprint()).andReturn(blueprint).anyTimes();
expect(topology.getHostGroupInfo()).andReturn(hostGroupInfoMap).anyTimes();
expect(topology.getStack()).andReturn(stack).anyTimes();
- expect(topology.getServices()).andReturn(serviceNames).anyTimes();
+ expect(topology.getServiceTypes()).andReturn(serviceNames).anyTimes();
expect(topology.getConfigRecommendationStrategy()).andReturn(ConfigRecommendationStrategy.NEVER_APPLY).anyTimes();
expect(topology.isValidConfigType("zoo.cfg")).andReturn(true).anyTimes();
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/topology/ClusterDeploymentTestCommon.java b/ambari-server/src/test/java/org/apache/ambari/server/topology/ClusterDeploymentTestCommon.java
index b23d88e..960617c 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/topology/ClusterDeploymentTestCommon.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/topology/ClusterDeploymentTestCommon.java
@@ -32,7 +32,7 @@ public class ClusterDeploymentTestCommon {
* @return a {@link ServiceResponse} instance for tests
*/
static ServiceResponse service(String serviceName, long serviceId) {
- return new ServiceResponse(CLUSTER_ID, CLUSTER_NAME, 1L, "service-group-1", serviceId, serviceName, null, null,
+ return new ServiceResponse(CLUSTER_ID, CLUSTER_NAME, 1L, "service-group-1", serviceId, serviceName, serviceName, null,
null, null, true, true, true, true, true);
}
}
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/topology/StackBuilder.java b/ambari-server/src/test/java/org/apache/ambari/server/topology/StackBuilder.java
index a4f608a..6f48bc5 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/topology/StackBuilder.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/topology/StackBuilder.java
@@ -17,6 +17,8 @@
*/
package org.apache.ambari.server.topology;
+import java.util.Optional;
+
import org.apache.ambari.server.state.AutoDeployInfo;
import org.apache.ambari.server.state.ComponentInfo;
import org.apache.ambari.server.state.DependencyInfo;
@@ -121,6 +123,12 @@ public class StackBuilder {
return resolveComponent(currentComponent, currentService, stackId);
}
+ public ResolvedComponent lastAddedComponentWith(String mpackInstanceName, String serviceInstanceName) {
+ Preconditions.checkNotNull(currentService);
+ Preconditions.checkNotNull(currentComponent);
+ return withInstanceNames(resolveComponent(currentComponent, currentService, stackId), mpackInstanceName, serviceInstanceName);
+ }
+
public ResolvedComponent componentToBeCoLocatedWith() {
Preconditions.checkNotNull(currentComponent);
Preconditions.checkNotNull(currentComponent.getAutoDeploy());
@@ -187,4 +195,12 @@ public class StackBuilder {
return componentInfo.getAutoDeploy();
}
+ protected static ResolvedComponent withInstanceNames(ResolvedComponent component, String mpackInstanceName, String serviceInstanceName) {
+ return component.toBuilder()
+ .serviceGroupName(Optional.ofNullable(mpackInstanceName))
+ .serviceName(Optional.ofNullable(serviceInstanceName))
+ .component(new Component(component.componentName(), mpackInstanceName, serviceInstanceName, null))
+ .build();
+ }
+
}
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/topology/TopologyManagerTest.java b/ambari-server/src/test/java/org/apache/ambari/server/topology/TopologyManagerTest.java
index b26ffc6..7d5de53 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/topology/TopologyManagerTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/topology/TopologyManagerTest.java
@@ -225,7 +225,7 @@ public class TopologyManagerTest {
private final Set<ServiceResponse> services = IntStream.range(0, SERVICE_NAMES.size()).boxed().
map(
serviceId -> new ServiceResponse(CLUSTER_ID, CLUSTER_NAME, 1L, "CORE", (long)serviceId, SERVICE_NAMES.get(serviceId),
- null, null, null, null, false, false, false, false, false)
+ SERVICE_NAMES.get(serviceId), null, null, null, false, false, false, false, false)
).
collect(toSet());
@@ -313,7 +313,7 @@ public class TopologyManagerTest {
expect(blueprint.getHostGroupsForComponent("component3")).andReturn(Arrays.asList(group1, group2)).anyTimes();
expect(blueprint.getHostGroupsForComponent("component4")).andReturn(Collections.singleton(group2)).anyTimes();
expect(blueprint.getName()).andReturn(BLUEPRINT_NAME).anyTimes();
- expect(clusterTopologyMock.getServices()).andReturn(SERVICE_NAMES).anyTimes();
+ expect(clusterTopologyMock.getServiceTypes()).andReturn(SERVICE_NAMES).anyTimes();
expect(clusterTopologyMock.getStack()).andReturn(stack).anyTimes();
expect(clusterTopologyMock.getSecurity()).andReturn(SecurityConfiguration.NONE).anyTimes();
expect(clusterTopologyMock.getStackIds()).andReturn(ImmutableSet.of(STACK_ID)).anyTimes();
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/topology/validators/ClusterConfigTypeValidatorTest.java b/ambari-server/src/test/java/org/apache/ambari/server/topology/validators/ClusterConfigTypeValidatorTest.java
index ae14426..b08d362 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/topology/validators/ClusterConfigTypeValidatorTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/topology/validators/ClusterConfigTypeValidatorTest.java
@@ -94,7 +94,7 @@ public class ClusterConfigTypeValidatorTest extends EasyMockSupport {
clusterRequestConfigTypes = new HashSet<>(Arrays.asList("core-site", "yarn-site"));
EasyMock.expect(clusterConfigurationMock.getAllConfigTypes()).andReturn(clusterRequestConfigTypes).anyTimes();
- EasyMock.expect(clusterTopologyMock.getServices()).andReturn(new HashSet<>(Arrays.asList("YARN", "HDFS")));
+ EasyMock.expect(clusterTopologyMock.getServiceTypes()).andReturn(new HashSet<>(Arrays.asList("YARN", "HDFS")));
EasyMock.expect(stackMock.getConfigurationTypes("HDFS")).andReturn(Arrays.asList("core-site"));
EasyMock.expect(stackMock.getConfigurationTypes("YARN")).andReturn(Arrays.asList("yarn-site"));
@@ -117,7 +117,7 @@ public class ClusterConfigTypeValidatorTest extends EasyMockSupport {
clusterRequestConfigTypes = new HashSet<>(Arrays.asList("oozie-site"));
EasyMock.expect(clusterConfigurationMock.getAllConfigTypes()).andReturn(clusterRequestConfigTypes).anyTimes();
- EasyMock.expect(clusterTopologyMock.getServices()).andReturn(new HashSet<>(Arrays.asList("YARN", "HDFS")));
+ EasyMock.expect(clusterTopologyMock.getServiceTypes()).andReturn(new HashSet<>(Arrays.asList("YARN", "HDFS")));
EasyMock.expect(stackMock.getConfigurationTypes("HDFS")).andReturn(Arrays.asList("core-site"));
EasyMock.expect(stackMock.getConfigurationTypes("YARN")).andReturn(Arrays.asList("yarn-site"));
@@ -138,7 +138,7 @@ public class ClusterConfigTypeValidatorTest extends EasyMockSupport {
clusterRequestConfigTypes = new HashSet<>(Arrays.asList("core-site", "yarn-site", "oozie-site"));
EasyMock.expect(clusterConfigurationMock.getAllConfigTypes()).andReturn(clusterRequestConfigTypes).anyTimes();
- EasyMock.expect(clusterTopologyMock.getServices()).andReturn(new HashSet<>(Arrays.asList("YARN", "HDFS")));
+ EasyMock.expect(clusterTopologyMock.getServiceTypes()).andReturn(new HashSet<>(Arrays.asList("YARN", "HDFS")));
EasyMock.expect(stackMock.getConfigurationTypes("HDFS")).andReturn(Arrays.asList("core-site"));
EasyMock.expect(stackMock.getConfigurationTypes("YARN")).andReturn(Arrays.asList("yarn-site"));
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/topology/validators/DependencyAndCardinalityValidatorTest.java b/ambari-server/src/test/java/org/apache/ambari/server/topology/validators/DependencyAndCardinalityValidatorTest.java
index 9775dde..4d28156 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/topology/validators/DependencyAndCardinalityValidatorTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/topology/validators/DependencyAndCardinalityValidatorTest.java
@@ -20,7 +20,6 @@ package org.apache.ambari.server.topology.validators;
import static org.junit.Assert.assertSame;
-import org.apache.ambari.server.topology.Component;
import org.apache.ambari.server.topology.InvalidTopologyException;
import org.apache.ambari.server.topology.ResolvedComponent;
import org.apache.ambari.server.topology.StackBuilder;
@@ -45,10 +44,7 @@ public class DependencyAndCardinalityValidatorTest extends TopologyValidatorTest
@Test
public void acceptsComponentWithMpackInstanceSpecified() throws InvalidTopologyException {
- ResolvedComponent component = aComponent().withCardinality("2").lastAddedComponent();
- component = component.toBuilder()
- .component(new Component(component.componentName(), "mpack_instance", "service_instance", null))
- .build();
+ ResolvedComponent component = aComponent().withCardinality("2").lastAddedComponentWith("mpack_instance", "service_instance");
topologyHas(2, component);
replayAll();
@@ -56,6 +52,17 @@ public class DependencyAndCardinalityValidatorTest extends TopologyValidatorTest
}
@Test
+ public void acceptsMultipleInstances() throws InvalidTopologyException {
+ StackBuilder stackBuilder = aComponent().withCardinality("1+");
+ ResolvedComponent instance1 = stackBuilder.lastAddedComponentWith(null, "instance1");
+ ResolvedComponent instance2 = stackBuilder.lastAddedComponentWith(null, "instance2");
+ topologyHas(instance1, instance2);
+ replayAll();
+
+ assertSame(topology, subject.validate(topology));
+ }
+
+ @Test
public void acceptsInstancesOnAllHosts() throws InvalidTopologyException {
topologyHas(3, aComponent().withCardinality("ALL"));
replayAll();
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/topology/validators/HiveServiceValidatorTest.java b/ambari-server/src/test/java/org/apache/ambari/server/topology/validators/HiveServiceValidatorTest.java
index 0f142f7..b7119fb 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/topology/validators/HiveServiceValidatorTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/topology/validators/HiveServiceValidatorTest.java
@@ -136,12 +136,12 @@ public class HiveServiceValidatorTest extends EasyMockSupport {
expect(topology.getComponents()).andReturn(components.build().stream()
.map(component -> builderFor("HIVE", component).buildPartial())
).anyTimes();
- expect(topology.getServices()).andReturn(ImmutableSet.of("HDFS", "YARN", "HIVE")).anyTimes();
+ expect(topology.getServiceTypes()).andReturn(ImmutableSet.of("HDFS", "YARN", "HIVE")).anyTimes();
replay(topology);
}
private void noHiveInTopology() {
- expect(topology.getServices()).andReturn(ImmutableSet.of("HDFS", "YARN")).anyTimes();
+ expect(topology.getServiceTypes()).andReturn(ImmutableSet.of("HDFS", "YARN")).anyTimes();
replay(topology);
}
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/topology/validators/RequiredConfigPropertiesValidatorTest.java b/ambari-server/src/test/java/org/apache/ambari/server/topology/validators/RequiredConfigPropertiesValidatorTest.java
index e249feb..7f82eed 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/topology/validators/RequiredConfigPropertiesValidatorTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/topology/validators/RequiredConfigPropertiesValidatorTest.java
@@ -99,7 +99,7 @@ public class RequiredConfigPropertiesValidatorTest extends EasyMockSupport {
EasyMock.expect(clusterTopologyMock.getBlueprint()).andReturn(blueprintMock).anyTimes();
EasyMock.expect(blueprintMock.getHostGroups()).andReturn(hostGroups);
- EasyMock.expect(clusterTopologyMock.getServices()).andReturn(bpServices);
+ EasyMock.expect(clusterTopologyMock.getServiceTypes()).andReturn(bpServices);
EasyMock.expect(clusterTopologyMock.getStack()).andReturn(stackMock).anyTimes();
EasyMock.expect(masterHostGroupMock.getName()).andReturn("master").anyTimes();
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/topology/validators/TopologyValidatorTest.java b/ambari-server/src/test/java/org/apache/ambari/server/topology/validators/TopologyValidatorTest.java
index bef2a0a..3de99ec 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/topology/validators/TopologyValidatorTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/topology/validators/TopologyValidatorTest.java
@@ -42,6 +42,7 @@ import org.apache.ambari.server.controller.internal.Stack;
import org.apache.ambari.server.controller.internal.StackDefinition;
import org.apache.ambari.server.state.StackId;
import org.apache.ambari.server.topology.ClusterTopology;
+import org.apache.ambari.server.topology.ClusterTopologyImpl;
import org.apache.ambari.server.topology.Configuration;
import org.apache.ambari.server.topology.InvalidTopologyException;
import org.apache.ambari.server.topology.ResolvedComponent;
@@ -164,7 +165,7 @@ public class TopologyValidatorTest extends EasyMockSupport {
.anyTimes();
Capture<ResolvedComponent> componentCapture = newCapture();
expect(topology.getHostGroupsForComponent(capture(componentCapture)))
- .andAnswer(() -> hostGroups.entrySet().stream().filter(each -> each.getValue().contains(componentCapture.getValue())).map(Map.Entry::getKey).collect(toSet()))
+ .andAnswer(() -> ClusterTopologyImpl.getHostGroupsForComponent(hostGroups, componentCapture.getValue()))
.anyTimes();
expect(topology.getHostGroups()).andReturn(hostGroups.keySet()).anyTimes();