AMBARI-7015 Config History: API should create exactly one SCV when instructed to save multiple configs in a batch (dsen)
Project: http://git-wip-us.apache.org/repos/asf/ambari/repo Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/2cceee2e Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/2cceee2e Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/2cceee2e Branch: refs/heads/branch-alerts-dev Commit: 2cceee2ea3933b05cef97e6d48f029dcebe9c200 Parents: d566bca Author: Dmytro Sen <d...@hortonworks.com> Authored: Tue Aug 26 20:10:18 2014 +0300 Committer: Dmytro Sen <d...@hortonworks.com> Committed: Tue Aug 26 20:10:18 2014 +0300 ---------------------------------------------------------------------- .../AmbariManagementControllerImpl.java | 38 ++++---- .../server/controller/ClusterRequest.java | 16 ++-- .../ambari/server/controller/HostRequest.java | 11 +-- .../internal/AbstractResourceProvider.java | 92 +++++++++++++------- .../internal/ClusterResourceProvider.java | 7 +- .../internal/HostResourceProvider.java | 54 ++++++------ .../org/apache/ambari/server/state/Cluster.java | 9 +- .../ambari/server/state/ConfigHelper.java | 3 +- .../server/state/cluster/ClusterImpl.java | 52 +++++++---- .../server/upgrade/AbstractUpgradeCatalog.java | 3 +- .../server/agent/TestHeartbeatMonitor.java | 4 +- .../AmbariManagementControllerTest.java | 76 ++++++++-------- ...hYarnCapacitySchedulerReleaseConfigTest.java | 4 +- .../internal/ClusterResourceProviderTest.java | 40 ++++----- .../internal/JMXHostProviderTest.java | 10 +-- .../ambari/server/state/ConfigHelperTest.java | 6 +- .../server/state/cluster/ClusterTest.java | 55 +++++++++--- .../server/state/cluster/ClustersTest.java | 3 +- .../svccomphost/ServiceComponentHostTest.java | 3 +- .../server/upgrade/UpgradeCatalogTest.java | 2 +- 20 files changed, 293 insertions(+), 195 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ambari/blob/2cceee2e/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java index c465189..394f6ad 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 @@ -53,6 +53,7 @@ import java.util.EnumSet; import java.util.HashMap; import java.util.HashSet; import java.util.LinkedHashSet; +import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Map.Entry; @@ -676,7 +677,7 @@ public class AmbariManagementControllerImpl implements AmbariManagementControlle if (config != null) { String authName = getAuthName(); - if (cluster.addDesiredConfig(authName, config) != null) { + if (cluster.addDesiredConfig(authName, Collections.singleton(config)) != null) { LOG.info("cluster '" + cluster.getClusterName() + "' " + "changed by: '" + authName + "'; " + "type='" + config.getType() + "' " @@ -1151,14 +1152,15 @@ public class AmbariManagementControllerImpl implements AmbariManagementControlle final Cluster cluster = clusters.getCluster(request.getClusterName()); //save data to return configurations created - ConfigurationResponse configurationResponse = null; + List<ConfigurationResponse> configurationResponses = + new LinkedList<ConfigurationResponse>(); ServiceConfigVersionResponse serviceConfigVersionResponse = null; // set or create configuration mapping (and optionally create the map of properties) if (null != request.getDesiredConfig()) { - ConfigurationRequest cr = request.getDesiredConfig(); - - Config oldConfig = cluster.getDesiredConfigByType(cr.getType()); + Set<Config> configs = new HashSet<Config>(); + String note = null; + for (ConfigurationRequest cr: request.getDesiredConfig()) { if (null != cr.getProperties()) { // !!! empty property sets are supported, and need to be able to use @@ -1173,21 +1175,23 @@ public class AmbariManagementControllerImpl implements AmbariManagementControlle request.getClusterName())); cr.setClusterName(cluster.getClusterName()); - configurationResponse = createConfiguration(cr); + configurationResponses.add(createConfiguration(cr)); } } - - Config baseConfig = cluster.getConfig(cr.getType(), cr.getVersionTag()); - if (null != baseConfig) { + note = cr.getServiceConfigVersionNote(); + configs.add(cluster.getConfig(cr.getType(), cr.getVersionTag())); + } + if (!configs.isEmpty()) { String authName = getAuthName(); - serviceConfigVersionResponse = cluster.addDesiredConfig(authName, baseConfig, cr.getServiceConfigVersionNote()); + serviceConfigVersionResponse = cluster.addDesiredConfig(authName, configs, note); if (serviceConfigVersionResponse != null) { Logger logger = LoggerFactory.getLogger("configchange"); - logger.info("cluster '" + request.getClusterName() + "' " - + "changed by: '" + authName + "'; " - + "type='" + baseConfig.getType() + "' " - + "tag='" + baseConfig.getTag() + "'" - + (null == oldConfig ? "" : " from='"+ oldConfig.getTag() + "'")); + for (Config config: configs) { + logger.info("cluster '" + request.getClusterName() + "' " + + "changed by: '" + authName + "'; " + + "type='" + config.getType() + "' " + + "tag='" + config.getTag() + "'"); + } } } } @@ -1261,8 +1265,8 @@ public class AmbariManagementControllerImpl implements AmbariManagementControlle } if (serviceConfigVersionResponse != null) { - if (configurationResponse != null) { - serviceConfigVersionResponse.setConfigurations(Collections.singletonList(configurationResponse)); + if (!configurationResponses.isEmpty()) { + serviceConfigVersionResponse.setConfigurations(configurationResponses); } ClusterResponse clusterResponse = http://git-wip-us.apache.org/repos/asf/ambari/blob/2cceee2e/ambari-server/src/main/java/org/apache/ambari/server/controller/ClusterRequest.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/ClusterRequest.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/ClusterRequest.java index 14cc6be..caafb25 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/controller/ClusterRequest.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/ClusterRequest.java @@ -18,6 +18,7 @@ package org.apache.ambari.server.controller; +import java.util.List; import java.util.Set; /** @@ -35,7 +36,7 @@ public class ClusterRequest { Set<String> hostNames; // CREATE/UPDATE - private ConfigurationRequest config = null; + private List<ConfigurationRequest> configs = null; private ServiceConfigVersionRequest serviceConfigVersionRequest = null; @@ -128,19 +129,20 @@ public class ClusterRequest { } /** - * Sets the config request (if any) + * Sets the configs requests (if any) * @param configRequest */ - public void setDesiredConfig(ConfigurationRequest configRequest) { - config = configRequest; + public void setDesiredConfig(List<ConfigurationRequest> configRequest) { + configs = configRequest; } /** * Gets any configuration-based request (if any). - * @return the configuration request, or <code>null</code> if none is set. + * @return the list of configuration requests, + * or <code>null</code> if none is set. */ - public ConfigurationRequest getDesiredConfig() { - return config; + public List<ConfigurationRequest> getDesiredConfig() { + return configs; } @Override http://git-wip-us.apache.org/repos/asf/ambari/blob/2cceee2e/ambari-server/src/main/java/org/apache/ambari/server/controller/HostRequest.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/HostRequest.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/HostRequest.java index f3668c1..b577bb0 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/controller/HostRequest.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/HostRequest.java @@ -18,6 +18,7 @@ package org.apache.ambari.server.controller; +import java.util.List; import java.util.Map; import java.util.Map.Entry; @@ -28,7 +29,7 @@ public class HostRequest { private String clusterName; // CREATE/UPDATE private Map<String, String> hostAttributes; // CREATE/UPDATE private String rackInfo; - private ConfigurationRequest desiredConfig; // UPDATE + private List<ConfigurationRequest> desiredConfigs; // UPDATE private String maintenanceState; // UPDATE public HostRequest(String hostname, String clusterName, Map<String, String> hostAttributes) { @@ -77,12 +78,12 @@ public class HostRequest { publicHostname = name; } - public void setDesiredConfig(ConfigurationRequest request) { - desiredConfig = request; + public void setDesiredConfigs(List<ConfigurationRequest> request) { + desiredConfigs = request; } - public ConfigurationRequest getDesiredConfig() { - return desiredConfig; + public List<ConfigurationRequest> getDesiredConfigs() { + return desiredConfigs; } public void setMaintenanceState(String state) { http://git-wip-us.apache.org/repos/asf/ambari/blob/2cceee2e/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractResourceProvider.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractResourceProvider.java index a881730..d14cdf3 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractResourceProvider.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractResourceProvider.java @@ -20,6 +20,7 @@ package org.apache.ambari.server.controller.internal; import java.util.HashMap; import java.util.HashSet; +import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Set; @@ -343,50 +344,79 @@ public abstract class AbstractResourceProvider extends BaseProvider implements R * whose category is the parent and marked as a desired config. * @param properties the properties on the request. */ - protected ConfigurationRequest getConfigurationRequest(String parentCategory, Map<String, Object> properties) { + protected List<ConfigurationRequest> getConfigurationRequests(String parentCategory, Map<String, Object> properties) { + + List<ConfigurationRequest> configs = new LinkedList<ConfigurationRequest>(); + + String desiredConfigKey = parentCategory + "/desired_config"; + // Multiple configs to be updated + if (properties.containsKey(desiredConfigKey) + && properties.get(desiredConfigKey) instanceof Set) { + + Set<Map<String, Object>> configProperties = + (Set<Map<String, Object>>) properties.get(desiredConfigKey); + for (Map<String, Object> value: configProperties) { + ConfigurationRequest newConfig = new ConfigurationRequest(); + + for (Entry<String, Object> e : value.entrySet()) { + String propName = + PropertyHelper.getPropertyName(desiredConfigKey + '/' + e.getKey()); + String absCatategory = + PropertyHelper.getPropertyCategory(desiredConfigKey + '/' + e.getKey()); + parseProperties(newConfig, absCatategory, propName, e.getValue().toString()); + } + configs.add(newConfig); + } + return configs; + } ConfigurationRequest config = null; - // as a convenience, allow consumers to specify name/value overrides in this // call instead of forcing a cluster call to do that work for (Entry<String, Object> entry : properties.entrySet()) { String absCategory = PropertyHelper.getPropertyCategory(entry.getKey()); String propName = PropertyHelper.getPropertyName(entry.getKey()); - if (absCategory.startsWith(parentCategory + "/desired_config")) { + if (absCategory.startsWith(desiredConfigKey)) { config = (null == config) ? new ConfigurationRequest() : config; - if (propName.equals("type")) - config.setType(entry.getValue().toString()); - else if (propName.equals("tag")) - config.setVersionTag(entry.getValue().toString()); - else if (propName.equals("selected")) { - config.setSelected(Boolean.parseBoolean(entry.getValue().toString())); - } - else if (propName.equals("service_config_version_note")) { - config.setServiceConfigVersionNote(entry.getValue().toString()); - } - else if (absCategory.endsWith("/properties")) { - config.getProperties().put(propName, entry.getValue().toString()); - } - else if (propertiesAttributesPattern.matcher(absCategory).matches()) { - String attributeName = absCategory.substring(absCategory.lastIndexOf('/') + 1); - Map<String, Map<String, String>> configAttributesMap = config.getPropertiesAttributes(); - if (null == configAttributesMap) { - configAttributesMap = new HashMap<String, Map<String,String>>(); - config.setPropertiesAttributes(configAttributesMap); - } - Map<String, String> attributesMap = configAttributesMap.get(attributeName); - if (null == attributesMap) { - attributesMap = new HashMap<String, String>(); - configAttributesMap.put(attributeName, attributesMap); - } - attributesMap.put(PropertyHelper.getPropertyName(entry.getKey()), entry.getValue().toString()); - } + parseProperties(config, absCategory, propName, entry.getValue().toString()); } } + if (config != null) { + configs.add(config); + } + return configs; + } - return config; + private void parseProperties(ConfigurationRequest config, String absCategory, String propName, String propValue) { + if (propName.equals("type")) + config.setType(propValue); + else if (propName.equals("tag")) + config.setVersionTag(propValue); + else if (propName.equals("selected")) { + config.setSelected(Boolean.parseBoolean(propValue)); + } + else if (propName.equals("service_config_version_note")) { + config.setServiceConfigVersionNote(propValue); + } + else if (absCategory.endsWith("/properties")) { + config.getProperties().put(propName, propValue); + } + else if (propertiesAttributesPattern.matcher(absCategory).matches()) { + String attributeName = absCategory.substring(absCategory.lastIndexOf('/') + 1); + Map<String, Map<String, String>> configAttributesMap = config.getPropertiesAttributes(); + if (null == configAttributesMap) { + configAttributesMap = new HashMap<String, Map<String,String>>(); + config.setPropertiesAttributes(configAttributesMap); + } + Map<String, String> attributesMap = configAttributesMap.get(attributeName); + if (null == attributesMap) { + attributesMap = new HashMap<String, String>(); + configAttributesMap.put(attributeName, attributesMap); + } + attributesMap.put(propName, propValue); + } } // get the resources (id fields only) for the given predicate. http://git-wip-us.apache.org/repos/asf/ambari/blob/2cceee2e/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterResourceProvider.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterResourceProvider.java index b0e2dd4..3fcfcd4 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterResourceProvider.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterResourceProvider.java @@ -23,6 +23,7 @@ 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; @@ -319,12 +320,12 @@ public class ClusterResourceProvider extends BaseBlueprintProcessor { (String) properties.get(CLUSTER_VERSION_PROPERTY_ID), null); - ConfigurationRequest configRequest = getConfigurationRequest("Clusters", properties); + List<ConfigurationRequest> configRequests = getConfigurationRequests("Clusters", properties); ServiceConfigVersionRequest serviceConfigVersionRequest = getServiceConfigVersionRequest("Clusters", properties); - if (null != configRequest) - cr.setDesiredConfig(configRequest); + if (!configRequests.isEmpty()) + cr.setDesiredConfig(configRequests); if (serviceConfigVersionRequest != null) { cr.setServiceConfigVersionRequest(serviceConfigVersionRequest); http://git-wip-us.apache.org/repos/asf/ambari/blob/2cceee2e/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostResourceProvider.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostResourceProvider.java index 559f64d..03f7233 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostResourceProvider.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostResourceProvider.java @@ -330,9 +330,9 @@ public class HostResourceProvider extends AbstractControllerResourceProvider { if (null != o) hostRequest.setMaintenanceState(o.toString()); - ConfigurationRequest cr = getConfigurationRequest("Hosts", properties); + List<ConfigurationRequest> cr = getConfigurationRequests("Hosts", properties); - hostRequest.setDesiredConfig(cr); + hostRequest.setDesiredConfigs(cr); return hostRequest; } @@ -588,40 +588,40 @@ public class HostResourceProvider extends AbstractControllerResourceProvider { } } - if (null != request.getClusterName() && null != request.getDesiredConfig()) { + if (null != request.getClusterName() && null != request.getDesiredConfigs()) { Cluster c = clusters.getCluster(request.getClusterName()); if (clusters.getHostsForCluster(request.getClusterName()).containsKey(h.getHostName())) { - ConfigurationRequest cr = request.getDesiredConfig(); + for (ConfigurationRequest cr : request.getDesiredConfigs()) { - if (null != cr.getProperties() && cr.getProperties().size() > 0) { - LOG.info(MessageFormat.format("Applying configuration with tag ''{0}'' to host ''{1}'' in cluster ''{2}''", - cr.getVersionTag(), - request.getHostname(), - request.getClusterName())); + if (null != cr.getProperties() && cr.getProperties().size() > 0) { + LOG.info(MessageFormat.format("Applying configuration with tag ''{0}'' to host ''{1}'' in cluster ''{2}''", + cr.getVersionTag(), + request.getHostname(), + request.getClusterName())); - cr.setClusterName(c.getClusterName()); - controller.createConfiguration(cr); - } + cr.setClusterName(c.getClusterName()); + controller.createConfiguration(cr); + } - Config baseConfig = c.getConfig(cr.getType(), cr.getVersionTag()); - if (null != baseConfig) { - String authName = controller.getAuthName(); - DesiredConfig oldConfig = h.getDesiredConfigs(c.getClusterId()).get(cr.getType()); - - if (h.addDesiredConfig(c.getClusterId(), cr.isSelected(), authName, baseConfig)) { - Logger logger = LoggerFactory.getLogger("configchange"); - logger.info("cluster '" + c.getClusterName() + "', " - + "host '" + h.getHostName() + "' " - + "changed by: '" + authName + "'; " - + "type='" + baseConfig.getType() + "' " - + "version='" + baseConfig.getVersion() + "'" - + "tag='" + baseConfig.getTag() + "'" - + (null == oldConfig ? "" : ", from='" + oldConfig.getTag() + "'")); + Config baseConfig = c.getConfig(cr.getType(), cr.getVersionTag()); + if (null != baseConfig) { + String authName = controller.getAuthName(); + DesiredConfig oldConfig = h.getDesiredConfigs(c.getClusterId()).get(cr.getType()); + + if (h.addDesiredConfig(c.getClusterId(), cr.isSelected(), authName, baseConfig)) { + Logger logger = LoggerFactory.getLogger("configchange"); + logger.info("cluster '" + c.getClusterName() + "', " + + "host '" + h.getHostName() + "' " + + "changed by: '" + authName + "'; " + + "type='" + baseConfig.getType() + "' " + + "version='" + baseConfig.getVersion() + "'" + + "tag='" + baseConfig.getTag() + "'" + + (null == oldConfig ? "" : ", from='" + oldConfig.getTag() + "'")); + } } } - } } //todo: if attempt was made to update a property other than those http://git-wip-us.apache.org/repos/asf/ambari/blob/2cceee2e/ambari-server/src/main/java/org/apache/ambari/server/state/Cluster.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/Cluster.java b/ambari-server/src/main/java/org/apache/ambari/server/state/Cluster.java index 8970961..2c83f1c 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/state/Cluster.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/state/Cluster.java @@ -21,6 +21,7 @@ package org.apache.ambari.server.state; import java.util.Collection; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.concurrent.locks.ReadWriteLock; import com.google.common.collect.ListMultimap; @@ -157,22 +158,22 @@ public interface Cluster { * Adds and sets a DESIRED configuration to be applied to a cluster. There * can be only one selected config per type. * @param user the user making the change for audit purposes - * @param config the {@link org.apache.ambari.server.state.Config} object to set as desired + * @param configs the set of {@link org.apache.ambari.server.state.Config} objects to set as desired * @return <code>true</code> if the config was added, or <code>false</code> * if the config is already set as the current */ - public ServiceConfigVersionResponse addDesiredConfig(String user, Config config); + public ServiceConfigVersionResponse addDesiredConfig(String user, Set<Config> configs); /** * Adds and sets a DESIRED configuration to be applied to a cluster. There * can be only one selected config per type. * @param user the user making the change for audit purposes - * @param config the {@link org.apache.ambari.server.state.Config} object to set as desired + * @param configs the set of {@link org.apache.ambari.server.state.Config} objects to set as desired * @param serviceConfigVersionNote note to attach to service config version if created * @return <code>true</code> if the config was added, or <code>false</code> * if the config is already set as the current */ - ServiceConfigVersionResponse addDesiredConfig(String user, Config config, String serviceConfigVersionNote); + ServiceConfigVersionResponse addDesiredConfig(String user, Set<Config> configs, String serviceConfigVersionNote); ServiceConfigVersionResponse createServiceConfigVersion(String serviceName, String user, String note, ConfigGroup configGroup); http://git-wip-us.apache.org/repos/asf/ambari/blob/2cceee2e/ambari-server/src/main/java/org/apache/ambari/server/state/ConfigHelper.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/ConfigHelper.java b/ambari-server/src/main/java/org/apache/ambari/server/state/ConfigHelper.java index 1161cc6..a0d9e6e 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/state/ConfigHelper.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/state/ConfigHelper.java @@ -19,6 +19,7 @@ package org.apache.ambari.server.state; import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; @@ -477,7 +478,7 @@ public class ConfigHelper { Config baseConfig = cluster.getConfig(cr.getType(), cr.getVersionTag()); if (baseConfig != null) { - cluster.addDesiredConfig(authName, baseConfig); + cluster.addDesiredConfig(authName, Collections.singleton(baseConfig)); } } http://git-wip-us.apache.org/repos/asf/ambari/blob/2cceee2e/ambari-server/src/main/java/org/apache/ambari/server/state/cluster/ClusterImpl.java ---------------------------------------------------------------------- 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 ee6952a..8e073f1 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 @@ -1333,12 +1333,12 @@ public class ClusterImpl implements Cluster { } @Override - public ServiceConfigVersionResponse addDesiredConfig(String user, Config config) { - return addDesiredConfig(user, config, null); + public ServiceConfigVersionResponse addDesiredConfig(String user, Set<Config> configs) { + return addDesiredConfig(user, configs, null); } @Override - public ServiceConfigVersionResponse addDesiredConfig(String user, Config config, String serviceConfigVersionNote) { + public ServiceConfigVersionResponse addDesiredConfig(String user, Set<Config> configs, String serviceConfigVersionNote) { if (null == user) throw new NullPointerException("User must be specified."); @@ -1346,15 +1346,28 @@ public class ClusterImpl implements Cluster { try { readWriteLock.writeLock().lock(); try { - Config currentDesired = getDesiredConfigByType(config.getType()); - - // do not set if it is already the current - if (null != currentDesired && currentDesired.getTag().equals(config.getTag())) { + if (configs == null) { return null; } + Iterator<Config> configIterator = configs.iterator(); + + while (configIterator.hasNext()) { + Config config = configIterator.next(); + if (config == null) { + configIterator.remove(); + continue; + } + Config currentDesired = getDesiredConfigByType(config.getType()); + + // do not set if it is already the current + if (null != currentDesired && currentDesired.getTag().equals(config.getTag())) { + configIterator.remove(); + } + } + ServiceConfigVersionResponse serviceConfigVersionResponse = - applyConfig(config.getType(), config.getTag(), user, serviceConfigVersionNote); + applyConfigs(configs, user, serviceConfigVersionNote); configHelper.invalidateStaleConfigsCache(); return serviceConfigVersionResponse; @@ -1705,16 +1718,23 @@ public class ClusterImpl implements Cluster { } @Transactional - ServiceConfigVersionResponse applyConfig(String type, String tag, String user, String serviceConfigVersionNote) { - - selectConfig(type, tag, user); + ServiceConfigVersionResponse applyConfigs(Set<Config> configs, String user, String serviceConfigVersionNote) { String serviceName = null; - //find service name for config type - for (Entry<String, String> entry : serviceConfigTypes.entries()) { - if (StringUtils.equals(entry.getValue(), type)) { - serviceName = entry.getKey(); - break; + for (Config config: configs) { + + selectConfig(config.getType(), config.getTag(), user); + //find service name for config type + for (Entry<String, String> entry : serviceConfigTypes.entries()) { + if (StringUtils.equals(entry.getValue(), config.getType())) { + if (serviceName != null && !serviceName.equals(entry.getKey())) { + LOG.error("Updating configs for multiple services by a " + + "single API request isn't supported, config version not created"); + return null; + } + serviceName = entry.getKey(); + break; + } } } http://git-wip-us.apache.org/repos/asf/ambari/blob/2cceee2e/ambari-server/src/main/java/org/apache/ambari/server/upgrade/AbstractUpgradeCatalog.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/upgrade/AbstractUpgradeCatalog.java b/ambari-server/src/main/java/org/apache/ambari/server/upgrade/AbstractUpgradeCatalog.java index 4d68402..a53159c 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/upgrade/AbstractUpgradeCatalog.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/upgrade/AbstractUpgradeCatalog.java @@ -38,6 +38,7 @@ import org.slf4j.LoggerFactory; import javax.persistence.EntityManager; import java.sql.SQLException; +import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.Map; @@ -227,7 +228,7 @@ public abstract class AbstractUpgradeCatalog implements UpgradeCatalog { if (baseConfig != null) { String authName = "ambari-upgrade"; - if (cluster.addDesiredConfig(authName, baseConfig) != null) { + if (cluster.addDesiredConfig(authName, Collections.singleton(baseConfig)) != null) { String oldConfigString = (oldConfig != null) ? " from='" + oldConfig.getTag() + "'" : ""; LOG.info("cluster '" + cluster.getClusterName() + "' " + "changed by: '" + authName + "'; " http://git-wip-us.apache.org/repos/asf/ambari/blob/2cceee2e/ambari-server/src/test/java/org/apache/ambari/server/agent/TestHeartbeatMonitor.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/test/java/org/apache/ambari/server/agent/TestHeartbeatMonitor.java b/ambari-server/src/test/java/org/apache/ambari/server/agent/TestHeartbeatMonitor.java index 847a34d..e80e3e5 100644 --- a/ambari-server/src/test/java/org/apache/ambari/server/agent/TestHeartbeatMonitor.java +++ b/ambari-server/src/test/java/org/apache/ambari/server/agent/TestHeartbeatMonitor.java @@ -127,7 +127,7 @@ public class TestHeartbeatMonitor { new HashMap<String,String>() {{ put("a", "b"); }}, new HashMap<String, Map<String,String>>()); config.setTag("version1"); cluster.addConfig(config); - cluster.addDesiredConfig("_test", config); + cluster.addDesiredConfig("_test", Collections.singleton(config)); clusters.mapHostsToCluster(hostNames, clusterName); @@ -218,7 +218,7 @@ public class TestHeartbeatMonitor { }}, new HashMap<String, Map<String,String>>()); config.setTag("version1"); cluster.addConfig(config); - cluster.addDesiredConfig("_test", config); + cluster.addDesiredConfig("_test", Collections.singleton(config)); clusters.mapHostsToCluster(hostNames, clusterName); http://git-wip-us.apache.org/repos/asf/ambari/blob/2cceee2e/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerTest.java ---------------------------------------------------------------------- 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 ca76dc5..cf2bcbb 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 @@ -2274,7 +2274,7 @@ public class AmbariManagementControllerTest { cr1 = new ConfigurationRequest(clusterName, "hdfs-site", "version1", configs, null); ClusterRequest crReq = new ClusterRequest(null, clusterName, null, null); - crReq.setDesiredConfig(cr1); + crReq.setDesiredConfig(Collections.singletonList(cr1)); controller.updateClusters(Collections.singleton(crReq), null); // Start @@ -4220,8 +4220,8 @@ public class AmbariManagementControllerTest { cluster.addConfig(config1); cluster.addConfig(config2); - cluster.addDesiredConfig("_test", config1); - cluster.addDesiredConfig("_test", config2); + cluster.addDesiredConfig("_test", Collections.singleton(config1)); + cluster.addDesiredConfig("_test", Collections.singleton(config2)); Service hdfs = cluster.addService("HDFS"); hdfs.persist(); @@ -4482,8 +4482,8 @@ public class AmbariManagementControllerTest { cluster.addConfig(config1); cluster.addConfig(config2); - cluster.addDesiredConfig("_test", config1); - cluster.addDesiredConfig("_test", config2); + cluster.addDesiredConfig("_test", Collections.singleton(config1)); + cluster.addDesiredConfig("_test", Collections.singleton(config2)); Service hdfs = cluster.addService("HDFS"); Service mapReduce = cluster.addService("MAPREDUCE"); @@ -4666,8 +4666,8 @@ public class AmbariManagementControllerTest { ClusterRequest cr = new ClusterRequest(null, clusterName, null, null); - cr.setDesiredConfig(new ConfigurationRequest(clusterName, "global", - "v1", configs, null)); + cr.setDesiredConfig(Collections.singletonList(new ConfigurationRequest(clusterName, "global", + "v1", configs, null))); controller.updateClusters(Collections.singleton(cr), Collections.<String, String>emptyMap()); Set<ServiceRequest> sReqs = new HashSet<ServiceRequest>(); @@ -5268,10 +5268,10 @@ public class AmbariManagementControllerTest { configs, null); ClusterRequest crReq = new ClusterRequest(null, clusterName, null, null); - crReq.setDesiredConfig(cr1); + crReq.setDesiredConfig(Collections.singletonList(cr1)); controller.updateClusters(Collections.singleton(crReq), null); crReq = new ClusterRequest(null, clusterName, null, null); - crReq.setDesiredConfig(cr2); + crReq.setDesiredConfig(Collections.singletonList(cr2)); controller.updateClusters(Collections.singleton(crReq), null); // Install @@ -5294,7 +5294,7 @@ public class AmbariManagementControllerTest { cr3 = new ConfigurationRequest(clusterName, "core-site","version122", configs, null); crReq = new ClusterRequest(null, clusterName, null, null); - crReq.setDesiredConfig(cr3); + crReq.setDesiredConfig(Collections.singletonList(cr3)); controller.updateClusters(Collections.singleton(crReq), null); // Stop HDFS & MAPREDUCE @@ -5425,10 +5425,10 @@ public class AmbariManagementControllerTest { configs, null); ClusterRequest crReq = new ClusterRequest(null, clusterName, null, null); - crReq.setDesiredConfig(cr1); + crReq.setDesiredConfig(Collections.singletonList(cr1)); controller.updateClusters(Collections.singleton(crReq), null); crReq = new ClusterRequest(null, clusterName, null, null); - crReq.setDesiredConfig(cr2); + crReq.setDesiredConfig(Collections.singletonList(cr2)); controller.updateClusters(Collections.singleton(crReq), null); installService(clusterName, serviceName, false, false); @@ -5451,7 +5451,7 @@ public class AmbariManagementControllerTest { cr3 = new ConfigurationRequest(clusterName, "core-site","version122", configs, null); crReq = new ClusterRequest(null, clusterName, null, null); - crReq.setDesiredConfig(cr3); + crReq.setDesiredConfig(Collections.singletonList(cr3)); controller.updateClusters(Collections.singleton(crReq), null); long id = startService(clusterName, serviceName, false, true); @@ -6027,7 +6027,7 @@ public class AmbariManagementControllerTest { cr1 = new ConfigurationRequest(clusterName, "hive-site","version1", configs, null); ClusterRequest crReq = new ClusterRequest(null, clusterName, null, null); - crReq.setDesiredConfig(cr1); + crReq.setDesiredConfig(Collections.singletonList(cr1)); controller.updateClusters(Collections.singleton(crReq), null); // Install @@ -6105,7 +6105,7 @@ public class AmbariManagementControllerTest { cr1 = new ConfigurationRequest(clusterName, "hdfs-site","version1", configs, null); ClusterRequest crReq = new ClusterRequest(null, clusterName, null, null); - crReq.setDesiredConfig(cr1); + crReq.setDesiredConfig(Collections.singletonList(cr1)); controller.updateClusters(Collections.singleton(crReq), null); // Start @@ -6491,10 +6491,10 @@ public class AmbariManagementControllerTest { configs, null); ClusterRequest crReq = new ClusterRequest(null, clusterName, null, null); - crReq.setDesiredConfig(cr1); + crReq.setDesiredConfig(Collections.singletonList(cr1)); controller.updateClusters(Collections.singleton(crReq), null); crReq = new ClusterRequest(null, clusterName, null, null); - crReq.setDesiredConfig(cr2); + crReq.setDesiredConfig(Collections.singletonList(cr2)); controller.updateClusters(Collections.singleton(crReq), null); // Install @@ -6716,13 +6716,13 @@ public class AmbariManagementControllerTest { configs, null); ClusterRequest crReq = new ClusterRequest(null, clusterName, null, null); - crReq.setDesiredConfig(cr1); + crReq.setDesiredConfig(Collections.singletonList(cr1)); controller.updateClusters(Collections.singleton(crReq), null); crReq = new ClusterRequest(null, clusterName, null, null); - crReq.setDesiredConfig(cr2); + crReq.setDesiredConfig(Collections.singletonList(cr2)); controller.updateClusters(Collections.singleton(crReq), null); crReq = new ClusterRequest(null, clusterName, null, null); - crReq.setDesiredConfig(cr3); + crReq.setDesiredConfig(Collections.singletonList(cr3)); controller.updateClusters(Collections.singleton(crReq), null); // Create Config group for core-site @@ -6874,7 +6874,7 @@ public class AmbariManagementControllerTest { cr1 = new ConfigurationRequest(clusterName, "hdfs-site", "version1", configs, null); ClusterRequest crReq = new ClusterRequest(null, clusterName, null, null); - crReq.setDesiredConfig(cr1); + crReq.setDesiredConfig(Collections.singletonList(cr1)); controller.updateClusters(Collections.singleton(crReq), null); // Start @@ -6977,10 +6977,10 @@ public class AmbariManagementControllerTest { configs, null); ClusterRequest crReq = new ClusterRequest(null, clusterName, null, null); - crReq.setDesiredConfig(cr1); + crReq.setDesiredConfig(Collections.singletonList(cr1)); controller.updateClusters(Collections.singleton(crReq), null); crReq = new ClusterRequest(null, clusterName, null, null); - crReq.setDesiredConfig(cr2); + crReq.setDesiredConfig(Collections.singletonList(cr2)); controller.updateClusters(Collections.singleton(crReq), null); // Install @@ -8831,7 +8831,7 @@ public class AmbariManagementControllerTest { ConfigurationRequest configRequest = new ConfigurationRequest(CLUSTER_NAME, "global", "version1", new HashMap<String, String>() {{ put("a", "b"); }}, null); - cr.setDesiredConfig(configRequest); + cr.setDesiredConfig(Collections.singletonList(configRequest)); amc.updateClusters(Collections.singleton(cr), new HashMap<String, String>()); // add some hosts @@ -10067,22 +10067,22 @@ public class AmbariManagementControllerTest { ClusterRequest cr = new ClusterRequest(null, cluster.getClusterName(), null, null); // test null map with no prior - cr.setDesiredConfig( - new ConfigurationRequest(clusterName, "typeA", "v1", null, null)); + cr.setDesiredConfig(Collections.singletonList( + new ConfigurationRequest(clusterName, "typeA", "v1", null, null))); controller.updateClusters(Collections.singleton(cr), new HashMap<String, String>()); Config config = cluster.getDesiredConfigByType("typeA"); Assert.assertNull(config); // test empty map with no prior - cr.setDesiredConfig( - new ConfigurationRequest(clusterName, "typeA", "v1", new HashMap<String, String>(), new HashMap<String, Map<String,String>>())); + cr.setDesiredConfig(Collections.singletonList( + new ConfigurationRequest(clusterName, "typeA", "v1", new HashMap<String, String>(), new HashMap<String, Map<String,String>>()))); controller.updateClusters(Collections.singleton(cr), new HashMap<String, String>()); config = cluster.getDesiredConfigByType("typeA"); Assert.assertNotNull(config); // test empty properties on a new version - cr.setDesiredConfig( - new ConfigurationRequest(clusterName, "typeA", "v2", new HashMap<String, String>(), new HashMap<String, Map<String,String>>())); + cr.setDesiredConfig(Collections.singletonList( + new ConfigurationRequest(clusterName, "typeA", "v2", new HashMap<String, String>(), new HashMap<String, Map<String,String>>()))); controller.updateClusters(Collections.singleton(cr), new HashMap<String, String>()); config = cluster.getDesiredConfigByType("typeA"); Assert.assertNotNull(config); @@ -10095,16 +10095,16 @@ public class AmbariManagementControllerTest { Map<String, Map<String, String>> attributesMap = new HashMap<String, Map<String,String>>(); attributesMap.put("final", new HashMap<String, String>()); attributesMap.get("final").put("c", "true"); - cr.setDesiredConfig( - new ConfigurationRequest(clusterName, "typeA", "v3", map, attributesMap)); + cr.setDesiredConfig(Collections.singletonList( + new ConfigurationRequest(clusterName, "typeA", "v3", map, attributesMap))); controller.updateClusters(Collections.singleton(cr), new HashMap<String, String>()); config = cluster.getDesiredConfigByType("typeA"); Assert.assertNotNull(config); Assert.assertTrue(config.getProperties().containsKey("c")); // test reset to v2 - cr.setDesiredConfig( - new ConfigurationRequest(clusterName, "typeA", "v2", new HashMap<String, String>(), new HashMap<String, Map<String,String>>())); + cr.setDesiredConfig(Collections.singletonList( + new ConfigurationRequest(clusterName, "typeA", "v2", new HashMap<String, String>(), new HashMap<String, Map<String,String>>()))); controller.updateClusters(Collections.singleton(cr), new HashMap<String, String>()); config = cluster.getDesiredConfigByType("typeA"); Assert.assertEquals("v2", config.getTag()); @@ -10112,11 +10112,11 @@ public class AmbariManagementControllerTest { Assert.assertEquals(Integer.valueOf(0), Integer.valueOf(config.getProperties().size())); // test v2, but with properties - cr.setDesiredConfig( + cr.setDesiredConfig(Collections.singletonList( new ConfigurationRequest(clusterName, "typeA", "v2", new HashMap<String, String>() {{ put("a", "b"); }}, new HashMap<String, Map<String,String>>(){{put("final", new HashMap<String, String>(){{put("a", "true");}}); } - })); + }))); try { controller.updateClusters(Collections.singleton(cr), new HashMap<String, String>()); Assert.fail("Expect failure when creating a config that exists"); @@ -10257,7 +10257,7 @@ public class AmbariManagementControllerTest { ConfigurationRequest cr1 = new ConfigurationRequest(clusterName, "hdfs-site", "version1", hdfsConfigs, hdfsConfigAttributes); ClusterRequest crReq1 = new ClusterRequest(null, clusterName, null, null); - crReq1.setDesiredConfig(cr1); + crReq1.setDesiredConfig(Collections.singletonList(cr1)); controller.updateClusters(Collections.singleton(crReq1), null); @@ -10340,7 +10340,7 @@ public class AmbariManagementControllerTest { ConfigurationRequest cr1 = new ConfigurationRequest(clusterName, "hdfs-site", "version1", hdfsConfigs, hdfsConfigAttributes); ClusterRequest crReq1 = new ClusterRequest(null, clusterName, null, null); - crReq1.setDesiredConfig(cr1); + crReq1.setDesiredConfig(Collections.singletonList(cr1)); controller.updateClusters(Collections.singleton(crReq1), null); http://git-wip-us.apache.org/repos/asf/ambari/blob/2cceee2e/ambari-server/src/test/java/org/apache/ambari/server/controller/RefreshYarnCapacitySchedulerReleaseConfigTest.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/RefreshYarnCapacitySchedulerReleaseConfigTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/RefreshYarnCapacitySchedulerReleaseConfigTest.java index e13c25e..6565219 100644 --- a/ambari-server/src/test/java/org/apache/ambari/server/controller/RefreshYarnCapacitySchedulerReleaseConfigTest.java +++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/RefreshYarnCapacitySchedulerReleaseConfigTest.java @@ -86,7 +86,7 @@ public class RefreshYarnCapacitySchedulerReleaseConfigTest { // Start ClusterRequest cr = new ClusterRequest(cluster.getClusterId(), "c1", cluster.getDesiredStackVersion().getStackVersion(), null); - cr.setDesiredConfig(new ConfigurationRequest("c1","capacity-scheduler","version2",new HashMap<String, String>(), null)); + cr.setDesiredConfig(Collections.singletonList(new ConfigurationRequest("c1","capacity-scheduler","version2",new HashMap<String, String>(), null))); controller.updateClusters(Collections.singleton(cr) , null); @@ -106,7 +106,7 @@ public class RefreshYarnCapacitySchedulerReleaseConfigTest { // Start ClusterRequest cr = new ClusterRequest(cluster.getClusterId(), "c1", cluster.getDesiredStackVersion().getStackVersion(), null); - cr.setDesiredConfig(new ConfigurationRequest("c1","core-site","version2",new HashMap<String, String>(),null)); + cr.setDesiredConfig(Collections.singletonList(new ConfigurationRequest("c1","core-site","version2",new HashMap<String, String>(),null))); controller.updateClusters(Collections.singleton(cr) , null); http://git-wip-us.apache.org/repos/asf/ambari/blob/2cceee2e/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ClusterResourceProviderTest.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ClusterResourceProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ClusterResourceProviderTest.java index 7d51184..b5c50ff 100644 --- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ClusterResourceProviderTest.java +++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ClusterResourceProviderTest.java @@ -517,13 +517,13 @@ public class ClusterResourceProviderTest { assertEquals(clusterName, ucr5.getClusterName()); assertEquals(clusterName, ucr6.getClusterName()); assertEquals(clusterName, ucr7.getClusterName()); - ConfigurationRequest cr1 = ucr1.getDesiredConfig(); - ConfigurationRequest cr2 = ucr2.getDesiredConfig(); - ConfigurationRequest cr3 = ucr3.getDesiredConfig(); - ConfigurationRequest cr4 = ucr4.getDesiredConfig(); - ConfigurationRequest cr5 = ucr5.getDesiredConfig(); - ConfigurationRequest cr6 = ucr6.getDesiredConfig(); - ConfigurationRequest cr7 = ucr7.getDesiredConfig(); + ConfigurationRequest cr1 = ucr1.getDesiredConfig().get(0); + ConfigurationRequest cr2 = ucr2.getDesiredConfig().get(0); + ConfigurationRequest cr3 = ucr3.getDesiredConfig().get(0); + ConfigurationRequest cr4 = ucr4.getDesiredConfig().get(0); + ConfigurationRequest cr5 = ucr5.getDesiredConfig().get(0); + ConfigurationRequest cr6 = ucr6.getDesiredConfig().get(0); + ConfigurationRequest cr7 = ucr7.getDesiredConfig().get(0); assertEquals("1", cr1.getVersionTag()); assertEquals("1", cr2.getVersionTag()); assertEquals("1", cr3.getVersionTag()); @@ -1718,12 +1718,12 @@ public class ClusterResourceProviderTest { assertEquals(clusterName, ucr4.getClusterName()); assertEquals(clusterName, ucr5.getClusterName()); assertEquals(clusterName, ucr6.getClusterName()); - ConfigurationRequest cr1 = ucr1.getDesiredConfig(); - ConfigurationRequest cr2 = ucr2.getDesiredConfig(); - ConfigurationRequest cr3 = ucr3.getDesiredConfig(); - ConfigurationRequest cr4 = ucr4.getDesiredConfig(); - ConfigurationRequest cr5 = ucr5.getDesiredConfig(); - ConfigurationRequest cr6 = ucr6.getDesiredConfig(); + ConfigurationRequest cr1 = ucr1.getDesiredConfig().get(0); + ConfigurationRequest cr2 = ucr2.getDesiredConfig().get(0); + ConfigurationRequest cr3 = ucr3.getDesiredConfig().get(0); + ConfigurationRequest cr4 = ucr4.getDesiredConfig().get(0); + ConfigurationRequest cr5 = ucr5.getDesiredConfig().get(0); + ConfigurationRequest cr6 = ucr6.getDesiredConfig().get(0); assertEquals("1", cr1.getVersionTag()); assertEquals("1", cr2.getVersionTag()); @@ -2413,13 +2413,13 @@ public class ClusterResourceProviderTest { assertEquals(clusterName, ucr5.getClusterName()); assertEquals(clusterName, ucr6.getClusterName()); assertEquals(clusterName, ucr7.getClusterName()); - ConfigurationRequest cr1 = ucr1.getDesiredConfig(); - ConfigurationRequest cr2 = ucr2.getDesiredConfig(); - ConfigurationRequest cr3 = ucr3.getDesiredConfig(); - ConfigurationRequest cr4 = ucr4.getDesiredConfig(); - ConfigurationRequest cr5 = ucr5.getDesiredConfig(); - ConfigurationRequest cr6 = ucr6.getDesiredConfig(); - ConfigurationRequest cr7 = ucr7.getDesiredConfig(); + ConfigurationRequest cr1 = ucr1.getDesiredConfig().get(0); + ConfigurationRequest cr2 = ucr2.getDesiredConfig().get(0); + ConfigurationRequest cr3 = ucr3.getDesiredConfig().get(0); + ConfigurationRequest cr4 = ucr4.getDesiredConfig().get(0); + ConfigurationRequest cr5 = ucr5.getDesiredConfig().get(0); + ConfigurationRequest cr6 = ucr6.getDesiredConfig().get(0); + ConfigurationRequest cr7 = ucr7.getDesiredConfig().get(0); assertEquals("1", cr1.getVersionTag()); assertEquals("1", cr2.getVersionTag()); assertEquals("1", cr3.getVersionTag()); http://git-wip-us.apache.org/repos/asf/ambari/blob/2cceee2e/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/JMXHostProviderTest.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/JMXHostProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/JMXHostProviderTest.java index 94bd0c2..a11dc43 100644 --- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/JMXHostProviderTest.java +++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/JMXHostProviderTest.java @@ -188,7 +188,7 @@ public class JMXHostProviderTest { ConfigurationRequest cr = new ConfigurationRequest(clusterName, "hdfs-site", "version1", configs, null); ClusterRequest crequest = new ClusterRequest(null, clusterName, null, null); - crequest.setDesiredConfig(cr); + crequest.setDesiredConfig(Collections.singletonList(cr)); controller.updateClusters(Collections.singleton(crequest), new HashMap<String,String>()); } else { @@ -200,7 +200,7 @@ public class JMXHostProviderTest { "hdfs-site", "version2", configs, null); ClusterRequest crequest = new ClusterRequest(null, clusterName, null, null); - crequest.setDesiredConfig(cr); + crequest.setDesiredConfig(Collections.singletonList(cr)); controller.updateClusters(Collections.singleton(crequest), new HashMap<String,String>()); } } @@ -272,7 +272,7 @@ public class JMXHostProviderTest { "hdfs-site", "versionN", configs, null); ClusterRequest crReq = new ClusterRequest(null, clusterName, null, null); - crReq.setDesiredConfig(cr1); + crReq.setDesiredConfig(Collections.singletonList(cr1)); controller.updateClusters(Collections.singleton(crReq), null); Cluster cluster = clusters.getCluster(clusterName); Assert.assertEquals("versionN", cluster.getDesiredConfigByType("hdfs-site") @@ -280,7 +280,7 @@ public class JMXHostProviderTest { ConfigurationRequest cr2 = new ConfigurationRequest(clusterName, "yarn-site", "versionN", yarnConfigs, null); - crReq.setDesiredConfig(cr2); + crReq.setDesiredConfig(Collections.singletonList(cr2)); controller.updateClusters(Collections.singleton(crReq), null); Assert.assertEquals("versionN", cluster.getDesiredConfigByType("yarn-site") @@ -400,7 +400,7 @@ public class JMXHostProviderTest { "yarn-site", "versionN+1", yarnConfigs, null); ClusterRequest crReq = new ClusterRequest(null, "c1", null, null); - crReq.setDesiredConfig(cr2); + crReq.setDesiredConfig(Collections.singletonList(cr2)); controller.updateClusters(Collections.singleton(crReq), null); Assert.assertEquals("50030", providerModule.getPort("c1", "RESOURCEMANAGER")); Assert.assertEquals("11111", providerModule.getPort("c1", "NODEMANAGER")); http://git-wip-us.apache.org/repos/asf/ambari/blob/2cceee2e/ambari-server/src/test/java/org/apache/ambari/server/state/ConfigHelperTest.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/test/java/org/apache/ambari/server/state/ConfigHelperTest.java b/ambari-server/src/test/java/org/apache/ambari/server/state/ConfigHelperTest.java index ffd4358..73004ba 100644 --- a/ambari-server/src/test/java/org/apache/ambari/server/state/ConfigHelperTest.java +++ b/ambari-server/src/test/java/org/apache/ambari/server/state/ConfigHelperTest.java @@ -36,11 +36,11 @@ import org.junit.Before; import org.junit.Test; import java.util.ArrayList; +import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; -import java.util.Set; public class ConfigHelperTest { private Clusters clusters; @@ -97,7 +97,7 @@ public class ConfigHelperTest { new ClusterRequest(cluster.getClusterId(), clusterName, cluster.getDesiredStackVersion().getStackVersion(), null); - clusterRequest1.setDesiredConfig(cr); + clusterRequest1.setDesiredConfig(Collections.singletonList(cr)); managementController.updateClusters(new HashSet<ClusterRequest>() {{ add(clusterRequest1); }}, null); @@ -119,7 +119,7 @@ public class ConfigHelperTest { new ClusterRequest(cluster.getClusterId(), clusterName, cluster.getDesiredStackVersion().getStackVersion(), null); - clusterRequest2.setDesiredConfig(cr); + clusterRequest2.setDesiredConfig(Collections.singletonList(cr)); managementController.updateClusters(new HashSet<ClusterRequest>() {{ add(clusterRequest2); }}, null); } http://git-wip-us.apache.org/repos/asf/ambari/blob/2cceee2e/ambari-server/src/test/java/org/apache/ambari/server/state/cluster/ClusterTest.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/test/java/org/apache/ambari/server/state/cluster/ClusterTest.java b/ambari-server/src/test/java/org/apache/ambari/server/state/cluster/ClusterTest.java index 222924b..201702b 100644 --- a/ambari-server/src/test/java/org/apache/ambari/server/state/cluster/ClusterTest.java +++ b/ambari-server/src/test/java/org/apache/ambari/server/state/cluster/ClusterTest.java @@ -354,7 +354,7 @@ public class ClusterTest { c1.addConfig(config2); c1.addConfig(config3); - c1.addDesiredConfig("_test", config1); + c1.addDesiredConfig("_test", Collections.singleton(config1)); Config res = c1.getDesiredConfigByType("global"); Assert.assertNotNull("Expected non-null config", res); Assert.assertEquals("true", res.getPropertiesAttributes().get("final").get("a")); @@ -362,7 +362,7 @@ public class ClusterTest { res = c1.getDesiredConfigByType("core-site"); Assert.assertNull("Expected null config", res); - c1.addDesiredConfig("_test", config2); + c1.addDesiredConfig("_test", Collections.singleton(config2)); res = c1.getDesiredConfigByType("global"); Assert.assertEquals("Expected version tag to be 'version2'", "version2", res.getTag()); Assert.assertEquals("true", res.getPropertiesAttributes().get("final").get("x")); @@ -387,15 +387,15 @@ public class ClusterTest { c1.addConfig(config3); try { - c1.addDesiredConfig(null, config1); + c1.addDesiredConfig(null, Collections.singleton(config1)); fail("Cannot set a null user with config"); } catch (Exception e) { // test failure } - c1.addDesiredConfig("_test1", config1); - c1.addDesiredConfig("_test3", config3); + c1.addDesiredConfig("_test1", Collections.singleton(config1)); + c1.addDesiredConfig("_test3", Collections.singleton(config3)); Map<String, DesiredConfig> desiredConfigs = c1.getDesiredConfigs(); Assert.assertFalse("Expect desired config not contain 'mapred-site'", desiredConfigs.containsKey("mapred-site")); @@ -409,10 +409,10 @@ public class ClusterTest { Assert.assertTrue("Expect no host-level overrides", (null == dc.getHostOverrides() || dc.getHostOverrides().size() == 0)); - c1.addDesiredConfig("_test2", config2); + c1.addDesiredConfig("_test2", Collections.singleton(config2)); Assert.assertEquals("_test2", c1.getDesiredConfigs().get(config2.getType()).getUser()); - c1.addDesiredConfig("_test1", config1); + c1.addDesiredConfig("_test1", Collections.singleton(config1)); // setup a host that also has a config override Host host = clusters.getHost("h1"); @@ -647,7 +647,7 @@ public class ClusterTest { c1.addConfig(config1); c1.addConfig(config2); - c1.addDesiredConfig("admin", config1); + c1.addDesiredConfig("admin", Collections.singleton(config1)); List<ServiceConfigVersionResponse> serviceConfigVersions = c1.getServiceConfigVersions(); Assert.assertNotNull(serviceConfigVersions); @@ -663,7 +663,7 @@ public class ClusterTest { Assert.assertEquals("admin", mapredResponse.getUserName()); Assert.assertEquals(Long.valueOf(1), mapredResponse.getVersion()); - c1.addDesiredConfig("admin", config2); + c1.addDesiredConfig("admin", Collections.singleton(config2)); serviceConfigVersions = c1.getServiceConfigVersions(); Assert.assertNotNull(serviceConfigVersions); // created new ServiceConfigVersion @@ -676,7 +676,7 @@ public class ClusterTest { Assert.assertEquals("admin", mapredResponse.getUserName()); // Rollback , clonning version1 config, created new ServiceConfigVersion - c1.addDesiredConfig("admin", config1); + c1.addDesiredConfig("admin", Collections.singleton(config1)); serviceConfigVersions = c1.getServiceConfigVersions(); Assert.assertNotNull(serviceConfigVersions); // created new ServiceConfigVersion @@ -688,4 +688,39 @@ public class ClusterTest { Assert.assertEquals("c1", mapredResponse.getClusterName()); Assert.assertEquals("admin", mapredResponse.getUserName()); } + + @Test + public void testSingleServiceVersionForMultipleConfigs() { + Config config1 = configFactory.createNew(c1, "hdfs-site", + new HashMap<String, String>() {{ put("a", "b"); }}, new HashMap<String, Map<String,String>>()); + config1.setTag("version1"); + + Config config2 = configFactory.createNew(c1, "core-site", + new HashMap<String, String>() {{ put("x", "y"); }}, new HashMap<String, Map<String,String>>()); + config2.setTag("version2"); + + c1.addConfig(config1); + c1.addConfig(config2); + + Set<Config> configs = new HashSet<Config>(); + configs.add(config1); + configs.add(config2); + + c1.addDesiredConfig("admin", configs); + List<ServiceConfigVersionResponse> serviceConfigVersions = + c1.getServiceConfigVersions(); + Assert.assertNotNull(serviceConfigVersions); + // Single serviceConfigVersion for multiple configs + Assert.assertEquals(1, serviceConfigVersions.size()); + Assert.assertEquals(Long.valueOf(1), serviceConfigVersions.get(0).getVersion()); + Assert.assertEquals(2, c1.getDesiredConfigs().size()); + Assert.assertEquals("version1", c1.getDesiredConfigByType("hdfs-site").getTag()); + Assert.assertEquals("version2", c1.getDesiredConfigByType("core-site").getTag()); + + Map<String, ServiceConfigVersionResponse> activeServiceConfigVersions = + c1.getActiveServiceConfigVersions(); + Assert.assertEquals(1, activeServiceConfigVersions.size()); + + + } } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/ambari/blob/2cceee2e/ambari-server/src/test/java/org/apache/ambari/server/state/cluster/ClustersTest.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/test/java/org/apache/ambari/server/state/cluster/ClustersTest.java b/ambari-server/src/test/java/org/apache/ambari/server/state/cluster/ClustersTest.java index e794e01..2baa5c5 100644 --- a/ambari-server/src/test/java/org/apache/ambari/server/state/cluster/ClustersTest.java +++ b/ambari-server/src/test/java/org/apache/ambari/server/state/cluster/ClustersTest.java @@ -21,6 +21,7 @@ package org.apache.ambari.server.state.cluster; import static org.junit.Assert.fail; import java.util.Arrays; +import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -330,7 +331,7 @@ public class ClustersTest { config2.persist(); // cluster desired config - cluster.addDesiredConfig("_test", config1); + cluster.addDesiredConfig("_test", Collections.singleton(config1)); clusters.addHost(h1); clusters.addHost(h2); http://git-wip-us.apache.org/repos/asf/ambari/blob/2cceee2e/ambari-server/src/test/java/org/apache/ambari/server/state/svccomphost/ServiceComponentHostTest.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/test/java/org/apache/ambari/server/state/svccomphost/ServiceComponentHostTest.java b/ambari-server/src/test/java/org/apache/ambari/server/state/svccomphost/ServiceComponentHostTest.java index c0bdaa2..5d85b0d 100644 --- a/ambari-server/src/test/java/org/apache/ambari/server/state/svccomphost/ServiceComponentHostTest.java +++ b/ambari-server/src/test/java/org/apache/ambari/server/state/svccomphost/ServiceComponentHostTest.java @@ -18,6 +18,7 @@ package org.apache.ambari.server.state.svccomphost; +import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.Map; @@ -1041,7 +1042,7 @@ public class ServiceComponentHostTest { config.setTag(tag); config.persist(); cluster.addConfig(config); - cluster.addDesiredConfig("user", config); + cluster.addDesiredConfig("user", Collections.singleton(config)); } @Test http://git-wip-us.apache.org/repos/asf/ambari/blob/2cceee2e/ambari-server/src/test/java/org/apache/ambari/server/upgrade/UpgradeCatalogTest.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/test/java/org/apache/ambari/server/upgrade/UpgradeCatalogTest.java b/ambari-server/src/test/java/org/apache/ambari/server/upgrade/UpgradeCatalogTest.java index f8d16c8..b0c8fd9 100644 --- a/ambari-server/src/test/java/org/apache/ambari/server/upgrade/UpgradeCatalogTest.java +++ b/ambari-server/src/test/java/org/apache/ambari/server/upgrade/UpgradeCatalogTest.java @@ -147,7 +147,7 @@ public class UpgradeCatalogTest { cr.setVersionTag("version1"); cr.setProperties(properties); - cl.setDesiredConfig(cr); + cl.setDesiredConfig(Collections.singletonList(cr)); controller.updateClusters(new HashSet<ClusterRequest>() {{ add(cl); }}, null);