|
@@ -22,6 +22,7 @@ import com.google.inject.Inject;
|
|
import com.google.inject.Injector;
|
|
import com.google.inject.Injector;
|
|
import com.google.inject.Provider;
|
|
import com.google.inject.Provider;
|
|
import com.google.inject.persist.Transactional;
|
|
import com.google.inject.persist.Transactional;
|
|
|
|
+
|
|
import org.apache.ambari.server.AmbariException;
|
|
import org.apache.ambari.server.AmbariException;
|
|
import org.apache.ambari.server.configuration.Configuration;
|
|
import org.apache.ambari.server.configuration.Configuration;
|
|
import org.apache.ambari.server.controller.AmbariManagementController;
|
|
import org.apache.ambari.server.controller.AmbariManagementController;
|
|
@@ -32,16 +33,26 @@ import org.apache.ambari.server.orm.entities.MetainfoEntity;
|
|
import org.apache.ambari.server.state.Cluster;
|
|
import org.apache.ambari.server.state.Cluster;
|
|
import org.apache.ambari.server.state.Clusters;
|
|
import org.apache.ambari.server.state.Clusters;
|
|
import org.apache.ambari.server.state.Config;
|
|
import org.apache.ambari.server.state.Config;
|
|
|
|
+import org.apache.ambari.server.state.ConfigHelper;
|
|
|
|
+import org.apache.ambari.server.state.PropertyInfo;
|
|
|
|
+import org.apache.ambari.server.state.Service;
|
|
|
|
+import org.apache.ambari.server.state.ServiceInfo;
|
|
|
|
+import org.apache.ambari.server.state.StackId;
|
|
|
|
+import org.apache.ambari.server.state.StackInfo;
|
|
import org.apache.ambari.server.utils.VersionUtils;
|
|
import org.apache.ambari.server.utils.VersionUtils;
|
|
import org.slf4j.Logger;
|
|
import org.slf4j.Logger;
|
|
import org.slf4j.LoggerFactory;
|
|
import org.slf4j.LoggerFactory;
|
|
|
|
|
|
import javax.persistence.EntityManager;
|
|
import javax.persistence.EntityManager;
|
|
|
|
+
|
|
import java.sql.SQLException;
|
|
import java.sql.SQLException;
|
|
import java.util.Collections;
|
|
import java.util.Collections;
|
|
import java.util.Comparator;
|
|
import java.util.Comparator;
|
|
import java.util.HashMap;
|
|
import java.util.HashMap;
|
|
|
|
+import java.util.HashSet;
|
|
import java.util.Map;
|
|
import java.util.Map;
|
|
|
|
+import java.util.Set;
|
|
|
|
+import java.util.Map.Entry;
|
|
|
|
|
|
public abstract class AbstractUpgradeCatalog implements UpgradeCatalog {
|
|
public abstract class AbstractUpgradeCatalog implements UpgradeCatalog {
|
|
@Inject
|
|
@Inject
|
|
@@ -172,6 +183,158 @@ public abstract class AbstractUpgradeCatalog implements UpgradeCatalog {
|
|
dbAccessor.executeQuery(String.format("ALTER ROLE %s SET search_path to '%s';", dbUser, schemaName));
|
|
dbAccessor.executeQuery(String.format("ALTER ROLE %s SET search_path to '%s';", dbUser, schemaName));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ public void addNewConfigurationsFromXml() throws AmbariException {
|
|
|
|
+ ConfigHelper configHelper = injector.getInstance(ConfigHelper.class);
|
|
|
|
+ AmbariManagementController controller = injector.getInstance(AmbariManagementController.class);
|
|
|
|
+
|
|
|
|
+ Clusters clusters = controller.getClusters();
|
|
|
|
+ if (clusters == null) {
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ Map<String, Cluster> clusterMap = clusters.getClusters();
|
|
|
|
+
|
|
|
|
+ if (clusterMap != null && !clusterMap.isEmpty()) {
|
|
|
|
+ for (Cluster cluster : clusterMap.values()) {
|
|
|
|
+ Map<String, Set<String>> newProperties = new HashMap<String, Set<String>>();
|
|
|
|
+
|
|
|
|
+ Set<PropertyInfo> stackProperties = configHelper.getStackProperties(cluster);
|
|
|
|
+ for(String serviceName: cluster.getServices().keySet()) {
|
|
|
|
+ Set<PropertyInfo> properties = configHelper.getServiceProperties(cluster, serviceName);
|
|
|
|
+
|
|
|
|
+ if(properties == null) {
|
|
|
|
+ continue;
|
|
|
|
+ }
|
|
|
|
+ properties.addAll(stackProperties);
|
|
|
|
+
|
|
|
|
+ for(PropertyInfo property:properties) {
|
|
|
|
+ String configType = ConfigHelper.fileNameToConfigType(property.getFilename());
|
|
|
|
+ Config clusterConfigs = cluster.getDesiredConfigByType(configType);
|
|
|
|
+ if(clusterConfigs == null || !clusterConfigs.getProperties().containsKey(property.getName())) {
|
|
|
|
+ LOG.info("Config " + property.getName() + " from " + configType + " from xml configurations" +
|
|
|
|
+ " is not found on the cluster. Adding it...");
|
|
|
|
+
|
|
|
|
+ if(!newProperties.containsKey(configType)) {
|
|
|
|
+ newProperties.put(configType, new HashSet<String>());
|
|
|
|
+ }
|
|
|
|
+ newProperties.get(configType).add(property.getName());
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ for (Entry<String, Set<String>> newProperty : newProperties.entrySet()) {
|
|
|
|
+ updateConfigurationPropertiesWithValuesFromXml(newProperty.getKey(), newProperty.getValue(), false, true);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * Create a new cluster scoped configuration with the new properties added
|
|
|
|
+ * with the values from the coresponding xml files.
|
|
|
|
+ *
|
|
|
|
+ * If xml owner service is not in the cluster, the configuration won't be added.
|
|
|
|
+ *
|
|
|
|
+ * @param configType Configuration type. (hdfs-site, etc.)
|
|
|
|
+ * @param properties Set property names.
|
|
|
|
+ */
|
|
|
|
+ protected void updateConfigurationPropertiesWithValuesFromXml(String configType,
|
|
|
|
+ Set<String> propertyNames, boolean updateIfExists, boolean createNewConfigType) throws AmbariException {
|
|
|
|
+ ConfigHelper configHelper = injector.getInstance(ConfigHelper.class);
|
|
|
|
+ AmbariManagementController controller = injector.getInstance(AmbariManagementController.class);
|
|
|
|
+
|
|
|
|
+ Clusters clusters = controller.getClusters();
|
|
|
|
+ if (clusters == null) {
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ Map<String, Cluster> clusterMap = clusters.getClusters();
|
|
|
|
+
|
|
|
|
+ if (clusterMap != null && !clusterMap.isEmpty()) {
|
|
|
|
+ for (Cluster cluster : clusterMap.values()) {
|
|
|
|
+ Map<String, String> properties = new HashMap<String, String>();
|
|
|
|
+
|
|
|
|
+ for(String propertyName:propertyNames) {
|
|
|
|
+ String propertyValue = configHelper.getPropertyValueFromStackDefenitions(cluster, configType, propertyName);
|
|
|
|
+
|
|
|
|
+ if(propertyValue == null) {
|
|
|
|
+ LOG.info("Config " + propertyName + " from " + configType + " is not found in xml definitions." +
|
|
|
|
+ "Skipping configuration property update");
|
|
|
|
+ continue;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ ServiceInfo propertyService = configHelper.getPropertyOwnerService(cluster, configType, propertyName);
|
|
|
|
+ if(propertyService != null && !cluster.getServices().containsKey(propertyService.getName())) {
|
|
|
|
+ LOG.info("Config " + propertyName + " from " + configType + " with value = " + propertyValue + " " +
|
|
|
|
+ "Is not added due to service " + propertyService.getName() + " is not in the cluster.");
|
|
|
|
+ continue;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ properties.put(propertyName, propertyValue);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ updateConfigurationPropertiesForCluster(cluster, configType,
|
|
|
|
+ properties, updateIfExists, createNewConfigType);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ protected void updateConfigurationPropertiesForCluster(Cluster cluster, String configType,
|
|
|
|
+ Map<String, String> properties, boolean updateIfExists, boolean createNewConfigType) throws AmbariException {
|
|
|
|
+ AmbariManagementController controller = injector.getInstance(AmbariManagementController.class);
|
|
|
|
+ String newTag = "version" + System.currentTimeMillis();
|
|
|
|
+
|
|
|
|
+ if (properties != null) {
|
|
|
|
+ Map<String, Config> all = cluster.getConfigsByType(configType);
|
|
|
|
+ if (all == null || !all.containsKey(newTag) || properties.size() > 0) {
|
|
|
|
+ Map<String, String> oldConfigProperties;
|
|
|
|
+ Config oldConfig = cluster.getDesiredConfigByType(configType);
|
|
|
|
+
|
|
|
|
+ if (oldConfig == null && !createNewConfigType) {
|
|
|
|
+ LOG.info("Config " + configType + " not found. Assuming service not installed. " +
|
|
|
|
+ "Skipping configuration properties update");
|
|
|
|
+ return;
|
|
|
|
+ } else if (oldConfig == null) {
|
|
|
|
+ oldConfigProperties = new HashMap<String, String>();
|
|
|
|
+ newTag = "version1";
|
|
|
|
+ } else {
|
|
|
|
+ oldConfigProperties = oldConfig.getProperties();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ Map<String, String> mergedProperties =
|
|
|
|
+ mergeProperties(oldConfigProperties, properties, updateIfExists);
|
|
|
|
+
|
|
|
|
+ if (!Maps.difference(oldConfigProperties, mergedProperties).areEqual()) {
|
|
|
|
+ LOG.info("Applying configuration with tag '{}' to " +
|
|
|
|
+ "cluster '{}'", newTag, cluster.getClusterName());
|
|
|
|
+
|
|
|
|
+ ConfigurationRequest cr = new ConfigurationRequest();
|
|
|
|
+ cr.setClusterName(cluster.getClusterName());
|
|
|
|
+ cr.setVersionTag(newTag);
|
|
|
|
+ cr.setType(configType);
|
|
|
|
+ cr.setProperties(mergedProperties);
|
|
|
|
+ controller.createConfiguration(cr);
|
|
|
|
+
|
|
|
|
+ Config baseConfig = cluster.getConfig(cr.getType(), cr.getVersionTag());
|
|
|
|
+ if (baseConfig != null) {
|
|
|
|
+ String authName = "ambari-upgrade";
|
|
|
|
+
|
|
|
|
+ if (cluster.addDesiredConfig(authName, Collections.singleton(baseConfig)) != null) {
|
|
|
|
+ String oldConfigString = (oldConfig != null) ? " from='" + oldConfig.getTag() + "'" : "";
|
|
|
|
+ LOG.info("cluster '" + cluster.getClusterName() + "' "
|
|
|
|
+ + "changed by: '" + authName + "'; "
|
|
|
|
+ + "type='" + baseConfig.getType() + "' "
|
|
|
|
+ + "tag='" + baseConfig.getTag() + "'"
|
|
|
|
+ + oldConfigString);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ LOG.info("No changes detected to config " + configType + ". Skipping configuration properties update");
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
|
|
/**
|
|
/**
|
|
* Create a new cluster scoped configuration with the new properties added
|
|
* Create a new cluster scoped configuration with the new properties added
|
|
@@ -183,7 +346,6 @@ public abstract class AbstractUpgradeCatalog implements UpgradeCatalog {
|
|
Map<String, String> properties, boolean updateIfExists, boolean createNewConfigType) throws
|
|
Map<String, String> properties, boolean updateIfExists, boolean createNewConfigType) throws
|
|
AmbariException {
|
|
AmbariException {
|
|
AmbariManagementController controller = injector.getInstance(AmbariManagementController.class);
|
|
AmbariManagementController controller = injector.getInstance(AmbariManagementController.class);
|
|
- String newTag = "version" + System.currentTimeMillis();
|
|
|
|
|
|
|
|
Clusters clusters = controller.getClusters();
|
|
Clusters clusters = controller.getClusters();
|
|
if (clusters == null) {
|
|
if (clusters == null) {
|
|
@@ -193,55 +355,8 @@ public abstract class AbstractUpgradeCatalog implements UpgradeCatalog {
|
|
|
|
|
|
if (clusterMap != null && !clusterMap.isEmpty()) {
|
|
if (clusterMap != null && !clusterMap.isEmpty()) {
|
|
for (Cluster cluster : clusterMap.values()) {
|
|
for (Cluster cluster : clusterMap.values()) {
|
|
- if (properties != null) {
|
|
|
|
- Map<String, Config> all = cluster.getConfigsByType(configType);
|
|
|
|
- if (all == null || !all.containsKey(newTag) || properties.size() > 0) {
|
|
|
|
- Map<String, String> oldConfigProperties;
|
|
|
|
- Config oldConfig = cluster.getDesiredConfigByType(configType);
|
|
|
|
-
|
|
|
|
- if (oldConfig == null && !createNewConfigType) {
|
|
|
|
- LOG.info("Config " + configType + " not found. Assuming service not installed. " +
|
|
|
|
- "Skipping configuration properties update");
|
|
|
|
- return;
|
|
|
|
- } else if (oldConfig == null) {
|
|
|
|
- oldConfigProperties = new HashMap<String, String>();
|
|
|
|
- newTag = "version1";
|
|
|
|
- } else {
|
|
|
|
- oldConfigProperties = oldConfig.getProperties();
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- Map<String, String> mergedProperties =
|
|
|
|
- mergeProperties(oldConfigProperties, properties, updateIfExists);
|
|
|
|
-
|
|
|
|
- if (!Maps.difference(oldConfigProperties, mergedProperties).areEqual()) {
|
|
|
|
- LOG.info("Applying configuration with tag '{}' to " +
|
|
|
|
- "cluster '{}'", newTag, cluster.getClusterName());
|
|
|
|
-
|
|
|
|
- ConfigurationRequest cr = new ConfigurationRequest();
|
|
|
|
- cr.setClusterName(cluster.getClusterName());
|
|
|
|
- cr.setVersionTag(newTag);
|
|
|
|
- cr.setType(configType);
|
|
|
|
- cr.setProperties(mergedProperties);
|
|
|
|
- controller.createConfiguration(cr);
|
|
|
|
-
|
|
|
|
- Config baseConfig = cluster.getConfig(cr.getType(), cr.getVersionTag());
|
|
|
|
- if (baseConfig != null) {
|
|
|
|
- String authName = "ambari-upgrade";
|
|
|
|
-
|
|
|
|
- if (cluster.addDesiredConfig(authName, Collections.singleton(baseConfig)) != null) {
|
|
|
|
- String oldConfigString = (oldConfig != null) ? " from='" + oldConfig.getTag() + "'" : "";
|
|
|
|
- LOG.info("cluster '" + cluster.getClusterName() + "' "
|
|
|
|
- + "changed by: '" + authName + "'; "
|
|
|
|
- + "type='" + baseConfig.getType() + "' "
|
|
|
|
- + "tag='" + baseConfig.getTag() + "'"
|
|
|
|
- + oldConfigString);
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- } else {
|
|
|
|
- LOG.info("No changes detected to config " + configType + ". Skipping configuration properties update");
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
|
|
+ updateConfigurationPropertiesForCluster(cluster, configType,
|
|
|
|
+ properties, updateIfExists, createNewConfigType);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|